From cbb82372ffe3bdc5737358003e768f8496675635 Mon Sep 17 00:00:00 2001 From: Russ Allbery Date: Thu, 12 May 2005 06:03:05 +0000 Subject: [PATCH] * Repackage upstream to remove MacOS-specific files covered by the APSL. Remove the WINNT directory to save space since we have to repackage anyway. Provide a get-orig-source target to do the repackaging. * Update copyright with more complete information from upstream src/LICENSE. --- debian/changelog | 9 +- debian/copyright | 105 +- debian/rules | 18 + .../afs_setup_utils/GetWebDll/GetWebDll.cpp | 409 - .../afs_setup_utils/GetWebDll/GetWebDll.def | 7 - .../afs_setup_utils/GetWebDll/GetWebDll.dep | 5 - .../afs_setup_utils/GetWebDll/GetWebDll.h | 67 - .../afs_setup_utils/GetWebDll/GetWebDll.rc | 122 - .../afs_setup_utils/GetWebDll/GetWebDllFun.h | 14 - .../afs_setup_utils/GetWebDll/Resource.h | 16 - src/WINNT/afs_setup_utils/GetWebDll/StdAfx.h | 44 - .../afs_setup_utils/GetWebDll/ntmakefile | 102 - src/WINNT/afs_setup_utils/NTMakefile | 196 - src/WINNT/afs_setup_utils/_isuser/_IsUser.RC | 188 - src/WINNT/afs_setup_utils/_isuser/_isuser.c | 21 - src/WINNT/afs_setup_utils/_isuser/ntmakefile | 90 - src/WINNT/afs_setup_utils/_isuser/resource.h | 38 - src/WINNT/afs_setup_utils/afs_setup_utils.cpp | 2106 ---- .../afs_setup_utils/afs_setup_utils_stub.rc | 34 - src/WINNT/afs_setup_utils/afsrm.c | 60 - src/WINNT/afs_setup_utils/animate_icon.cpp | 103 - src/WINNT/afs_setup_utils/animate_icon.h | 13 - src/WINNT/afs_setup_utils/cc_uninst.def | 10 - src/WINNT/afs_setup_utils/client_uninst.def | 10 - src/WINNT/afs_setup_utils/docs_uninst.def | 10 - src/WINNT/afs_setup_utils/forceremove.c | 563 -- src/WINNT/afs_setup_utils/forceremove.h | 25 - src/WINNT/afs_setup_utils/install_utils.def | 21 - src/WINNT/afs_setup_utils/lang/NTMakefile | 65 - .../lang/de_DE/afs_setup_utils.rc | 128 - .../lang/en_US/afs_setup_utils.rc | 128 - .../lang/es_ES/afs_setup_utils.rc | 116 - .../lang/ja_JP/afs_setup_utils.rc | 129 - .../lang/ko_KR/afs_setup_utils.rc | 190 - .../lang/pt_BR/afs_setup_utils.rc | 130 - .../lang/zh_CN/afs_setup_utils.rc | 129 - .../lang/zh_TW/afs_setup_utils.rc | 130 - .../afs_setup_utils/light_client_uninst.def | 10 - src/WINNT/afs_setup_utils/progress_dlg.cpp | 130 - src/WINNT/afs_setup_utils/progress_dlg.h | 20 - src/WINNT/afs_setup_utils/resource.h | 73 - src/WINNT/afs_setup_utils/server_uninst.def | 10 - src/WINNT/afs_setup_utils/sutil.c | 530 - src/WINNT/afs_setup_utils/sutil.h | 32 - src/WINNT/afsadmsvr/.cvsignore | 5 - src/WINNT/afsadmsvr/ITaAfsAdmSvr.idl | 457 - src/WINNT/afsadmsvr/ITaAfsAdmSvrTypes.idl | 515 - src/WINNT/afsadmsvr/NTMakefile | 182 - src/WINNT/afsadmsvr/TaAfsAdmSvr.cpp | 701 -- src/WINNT/afsadmsvr/TaAfsAdmSvr.h | 73 - src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp | 164 - src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.h | 39 - src/WINNT/afsadmsvr/TaAfsAdmSvrCell.cpp | 77 - src/WINNT/afsadmsvr/TaAfsAdmSvrClient.cpp | 890 -- src/WINNT/afsadmsvr/TaAfsAdmSvrClient.h | 160 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.cpp | 219 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.h | 27 - .../afsadmsvr/TaAfsAdmSvrClientCache.cpp | 286 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.h | 29 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientCell.cpp | 72 - .../afsadmsvr/TaAfsAdmSvrClientGroup.cpp | 251 - .../afsadmsvr/TaAfsAdmSvrClientInternal.cpp | 60 - .../afsadmsvr/TaAfsAdmSvrClientInternal.h | 27 - .../afsadmsvr/TaAfsAdmSvrClientNotify.cpp | 244 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.h | 29 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.cpp | 173 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.h | 27 - src/WINNT/afsadmsvr/TaAfsAdmSvrClientUser.cpp | 179 - src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.cpp | 415 - src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.h | 50 - src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.cpp | 86 - src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.h | 60 - src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.cpp | 751 -- src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.h | 65 - src/WINNT/afsadmsvr/TaAfsAdmSvrGroup.cpp | 459 - src/WINNT/afsadmsvr/TaAfsAdmSvrInternal.h | 42 - src/WINNT/afsadmsvr/TaAfsAdmSvrMain.cpp | 197 - src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.cpp | 694 -- src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.h | 41 - src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.cpp | 928 -- src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.h | 58 - src/WINNT/afsadmsvr/TaAfsAdmSvrUser.cpp | 252 - src/WINNT/afsadmsvr/afsadmsvr.ico | Bin 3310 -> 0 bytes src/WINNT/afsadmsvr/afsadmsvr.rc | 91 - src/WINNT/afsadmsvr/resource.h | 22 - src/WINNT/afsapplib/.cvsignore | 2 - src/WINNT/afsapplib/NTMakefile | 147 - src/WINNT/afsapplib/TaAfsAppLib.def | 99 - src/WINNT/afsapplib/afsapplib.cpp | 100 - src/WINNT/afsapplib/afsapplib.h | 755 -- src/WINNT/afsapplib/afsapplib_stub.rc | 17 - src/WINNT/afsapplib/al_admsvr.cpp | 436 - src/WINNT/afsapplib/al_admsvr.h | 213 - src/WINNT/afsapplib/al_browse.cpp | 714 -- src/WINNT/afsapplib/al_browseset.cpp | 350 - src/WINNT/afsapplib/al_cover.cpp | 285 - src/WINNT/afsapplib/al_creds.cpp | 973 -- src/WINNT/afsapplib/al_dynlink.cpp | 194 - src/WINNT/afsapplib/al_dynlink.h | 89 - src/WINNT/afsapplib/al_error.cpp | 203 - src/WINNT/afsapplib/al_help.cpp | 142 - src/WINNT/afsapplib/al_messages.h | 74 - src/WINNT/afsapplib/al_misc.cpp | 557 -- src/WINNT/afsapplib/al_progress.cpp | 334 - src/WINNT/afsapplib/al_progress.h | 142 - src/WINNT/afsapplib/al_pump.cpp | 347 - src/WINNT/afsapplib/al_resource.h | 108 - src/WINNT/afsapplib/al_task.cpp | 183 - src/WINNT/afsapplib/al_wizard.cpp | 1149 --- src/WINNT/afsapplib/al_wizard.h | 144 - src/WINNT/afsapplib/checklist.cpp | 666 -- src/WINNT/afsapplib/checklist.h | 55 - src/WINNT/afsapplib/ctl_date.cpp | 713 -- src/WINNT/afsapplib/ctl_date.h | 64 - src/WINNT/afsapplib/ctl_elapsed.cpp | 753 -- src/WINNT/afsapplib/ctl_elapsed.h | 110 - src/WINNT/afsapplib/ctl_sockaddr.cpp | 648 -- src/WINNT/afsapplib/ctl_sockaddr.h | 68 - src/WINNT/afsapplib/ctl_spinner.cpp | 907 -- src/WINNT/afsapplib/ctl_spinner.h | 140 - src/WINNT/afsapplib/ctl_time.cpp | 809 -- src/WINNT/afsapplib/ctl_time.h | 69 - src/WINNT/afsapplib/dialog.cpp | 1908 ---- src/WINNT/afsapplib/dialog.h | 302 - src/WINNT/afsapplib/fastlist.cpp | 4363 --------- src/WINNT/afsapplib/fastlist.h | 773 -- src/WINNT/afsapplib/hashlist.cpp | 1112 --- src/WINNT/afsapplib/hashlist.h | 521 - src/WINNT/afsapplib/lang/NTMakefile | 66 - src/WINNT/afsapplib/lang/de_DE/afsapplib.rc | 391 - src/WINNT/afsapplib/lang/en_US/afsapplib.rc | 388 - src/WINNT/afsapplib/lang/es_ES/afsapplib.rc | 391 - src/WINNT/afsapplib/lang/ja_JP/afsapplib.rc | 387 - src/WINNT/afsapplib/lang/ko_KR/afsapplib.rc | 384 - src/WINNT/afsapplib/lang/pt_BR/afsapplib.rc | 389 - src/WINNT/afsapplib/lang/zh_CN/afsapplib.rc | 381 - src/WINNT/afsapplib/lang/zh_TW/afsapplib.rc | 384 - src/WINNT/afsapplib/regexp.cpp | 471 - src/WINNT/afsapplib/regexp.h | 82 - src/WINNT/afsapplib/resize.cpp | 929 -- src/WINNT/afsapplib/resize.h | 145 - src/WINNT/afsapplib/resource/CELL.ICO | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/acl.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/aggreg.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/aggreg1.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/any_other.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/bos.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/error.ico | Bin 1086 -> 0 bytes src/WINNT/afsapplib/resource/fileset.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/fileset1.ico | Bin 1078 -> 0 bytes .../afsapplib/resource/foreign_group.bmp | Bin 310 -> 0 bytes .../afsapplib/resource/foreign_other.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/foreign_user.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/group.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/ic.ico | Bin 766 -> 0 bytes src/WINNT/afsapplib/resource/io.ico | Bin 766 -> 0 bytes src/WINNT/afsapplib/resource/key.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/local_group.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/local_other.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/local_user.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/locked.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/mask_obj.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/multiple.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/server.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/server1.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/server_u.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/service.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/service1.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/service2.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/spin1.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin2.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin3.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin4.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin5.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin6.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin7.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spin8.ico | Bin 2998 -> 0 bytes src/WINNT/afsapplib/resource/spinstop.ico | Bin 2238 -> 0 bytes .../afsapplib/resource/unauthenticated.bmp | Bin 310 -> 0 bytes src/WINNT/afsapplib/resource/user.ico | Bin 1078 -> 0 bytes src/WINNT/afsapplib/resource/warning.ico | Bin 1398 -> 0 bytes src/WINNT/afsapplib/settings.cpp | 254 - src/WINNT/afsapplib/settings.h | 174 - src/WINNT/afsapplib/subclass.cpp | 233 - src/WINNT/afsapplib/subclass.h | 74 - src/WINNT/afsapplib/test/16color.bmp | Bin 5318 -> 0 bytes src/WINNT/afsapplib/test/256color.bmp | Bin 11078 -> 0 bytes src/WINNT/afsapplib/test/NTMakefile | 47 - src/WINNT/afsapplib/test/resource.h | 41 - src/WINNT/afsapplib/test/wiztest.cpp | 397 - src/WINNT/afsapplib/test/wiztest.rc | 190 - src/WINNT/afsclass/NTMakefile | 69 - src/WINNT/afsclass/afsclass.h | 112 - src/WINNT/afsclass/afsclassfn.cpp | 4743 --------- src/WINNT/afsclass/afsclassfn.h | 265 - src/WINNT/afsclass/c_agg.cpp | 505 - src/WINNT/afsclass/c_agg.h | 103 - src/WINNT/afsclass/c_cell.cpp | 2031 ---- src/WINNT/afsclass/c_cell.h | 162 - src/WINNT/afsclass/c_debug.cpp | 785 -- src/WINNT/afsclass/c_debug.h | 138 - src/WINNT/afsclass/c_grp.cpp | 310 - src/WINNT/afsclass/c_grp.h | 90 - src/WINNT/afsclass/c_ident.cpp | 1090 --- src/WINNT/afsclass/c_ident.h | 165 - src/WINNT/afsclass/c_identlist.cpp | 108 - src/WINNT/afsclass/c_identlist.h | 45 - src/WINNT/afsclass/c_notify.cpp | 146 - src/WINNT/afsclass/c_notify.h | 343 - src/WINNT/afsclass/c_set.cpp | 461 - src/WINNT/afsclass/c_set.h | 116 - src/WINNT/afsclass/c_svc.cpp | 275 - src/WINNT/afsclass/c_svc.h | 107 - src/WINNT/afsclass/c_svr.cpp | 1368 --- src/WINNT/afsclass/c_svr.h | 148 - src/WINNT/afsclass/c_usr.cpp | 339 - src/WINNT/afsclass/c_usr.h | 115 - src/WINNT/afsclass/internal.cpp | 403 - src/WINNT/afsclass/internal.h | 64 - src/WINNT/afsclass/worker.cpp | 2402 ----- src/WINNT/afsclass/worker.h | 1041 -- src/WINNT/afsd/Makefile.djgpp | 69 - src/WINNT/afsd/NTMakefile | 495 - src/WINNT/afsd/afsd.c | 236 - src/WINNT/afsd/afsd.h | 150 - src/WINNT/afsd/afsd.ico | Bin 766 -> 0 bytes src/WINNT/afsd/afsd.rc | 29 - src/WINNT/afsd/afsd95.c | 208 - src/WINNT/afsd/afsd_eventlog.c | 215 - src/WINNT/afsd/afsd_eventlog.h | 13 - src/WINNT/afsd/afsd_eventmessages.mc | 109 - src/WINNT/afsd/afsd_eventmessages.rc | 2 - src/WINNT/afsd/afsd_flushvol.c | 506 - src/WINNT/afsd/afsd_flushvol.h | 45 - src/WINNT/afsd/afsd_init.c | 1465 --- src/WINNT/afsd/afsd_init.h | 24 - src/WINNT/afsd/afsd_init95.c | 788 -- src/WINNT/afsd/afsd_service.c | 1433 --- src/WINNT/afsd/afsd_service.rc | 20 - src/WINNT/afsd/afsdacl.c | 279 - src/WINNT/afsd/afsdacl.rc | 17 - src/WINNT/afsd/afsdicon.h | 15 - src/WINNT/afsd/afsicf.cpp | 327 - src/WINNT/afsd/afsicf.h | 40 - src/WINNT/afsd/afskfw-int.h | 251 - src/WINNT/afsd/afskfw.c | 3457 ------- src/WINNT/afsd/afskfw.h | 89 - src/WINNT/afsd/afslog95.c | 180 - src/WINNT/afsd/afslog95.def | 11 - src/WINNT/afsd/afslog95.rc | 18 - src/WINNT/afsd/afslogon.c | 1125 --- src/WINNT/afsd/afslogon.def | 15 - src/WINNT/afsd/afslogon.h | 127 - src/WINNT/afsd/afslogon.rc | 18 - src/WINNT/afsd/afsmsg95.c | 119 - src/WINNT/afsd/afsmsg95.h | 40 - src/WINNT/afsd/afsrpc.idl | 38 - src/WINNT/afsd/afsrpc95.h | 22 - src/WINNT/afsd/afsshare.c | 83 - src/WINNT/afsd/afsshare.rc | 17 - src/WINNT/afsd/cklog.c | 327 - src/WINNT/afsd/cm.h | 254 - src/WINNT/afsd/cm_access.c | 159 - src/WINNT/afsd/cm_access.h | 21 - src/WINNT/afsd/cm_aclent.c | 332 - src/WINNT/afsd/cm_aclent.h | 50 - src/WINNT/afsd/cm_buf.c | 1518 --- src/WINNT/afsd/cm_buf.h | 203 - src/WINNT/afsd/cm_callback.c | 1742 ---- src/WINNT/afsd/cm_callback.h | 71 - src/WINNT/afsd/cm_cell.c | 331 - src/WINNT/afsd/cm_cell.h | 55 - src/WINNT/afsd/cm_config.c | 763 -- src/WINNT/afsd/cm_config.h | 60 - src/WINNT/afsd/cm_conn.c | 652 -- src/WINNT/afsd/cm_conn.h | 112 - src/WINNT/afsd/cm_daemon.c | 235 - src/WINNT/afsd/cm_daemon.h | 39 - src/WINNT/afsd/cm_dcache.c | 1407 --- src/WINNT/afsd/cm_dcache.h | 58 - src/WINNT/afsd/cm_dir.c | 33 - src/WINNT/afsd/cm_dir.h | 87 - src/WINNT/afsd/cm_diskcache95.c | 760 -- src/WINNT/afsd/cm_diskcache95.h | 81 - src/WINNT/afsd/cm_dnlc.c | 655 -- src/WINNT/afsd/cm_dnlc.h | 45 - src/WINNT/afsd/cm_dns.c | 783 -- src/WINNT/afsd/cm_dns.h | 27 - src/WINNT/afsd/cm_dns_private.h | 217 - src/WINNT/afsd/cm_freelance.c | 1379 --- src/WINNT/afsd/cm_freelance.h | 31 - src/WINNT/afsd/cm_ioctl.c | 2380 ----- src/WINNT/afsd/cm_ioctl.h | 143 - src/WINNT/afsd/cm_memmap.c | 681 -- src/WINNT/afsd/cm_memmap.h | 102 - src/WINNT/afsd/cm_rpc.c | 242 - src/WINNT/afsd/cm_rpc.h | 24 - src/WINNT/afsd/cm_rpc95.h | 31 - src/WINNT/afsd/cm_scache.c | 1230 --- src/WINNT/afsd/cm_scache.h | 273 - src/WINNT/afsd/cm_server.c | 480 - src/WINNT/afsd/cm_server.h | 102 - src/WINNT/afsd/cm_user.c | 191 - src/WINNT/afsd/cm_user.h | 71 - src/WINNT/afsd/cm_utils.c | 163 - src/WINNT/afsd/cm_utils.h | 31 - src/WINNT/afsd/cm_vnodeops.c | 2995 ------ src/WINNT/afsd/cm_vnodeops.h | 162 - src/WINNT/afsd/cm_volume.c | 625 -- src/WINNT/afsd/cm_volume.h | 60 - src/WINNT/afsd/cmdebug.c | 536 -- src/WINNT/afsd/cmdebug.rc | 17 - src/WINNT/afsd/ctokens.c | 100 - src/WINNT/afsd/cunlog.c | 63 - src/WINNT/afsd/dosdefs95.h | 55 - src/WINNT/afsd/dosutils95.c | 294 - src/WINNT/afsd/fs.c | 4419 --------- src/WINNT/afsd/fs.h | 27 - src/WINNT/afsd/fs.rc | 17 - src/WINNT/afsd/fs_utils.c | 254 - src/WINNT/afsd/fs_utils.h | 46 - src/WINNT/afsd/klog.rc | 17 - src/WINNT/afsd/krb.h | 229 - src/WINNT/afsd/krb_prot.h | 97 - src/WINNT/afsd/lanahelper.cpp | 695 -- src/WINNT/afsd/lanahelper.h | 79 - src/WINNT/afsd/largeint95.c | 217 - src/WINNT/afsd/largeint95.h | 45 - src/WINNT/afsd/largeintdotnet.c | 90 - src/WINNT/afsd/libafsconf.def | 26 - src/WINNT/afsd/libafsconf.rc | 18 - src/WINNT/afsd/lock.txt | 37 - src/WINNT/afsd/logon_ad.cpp | 392 - src/WINNT/afsd/netbios95.c | 71 - src/WINNT/afsd/netbios95.h | 124 - src/WINNT/afsd/queue95.c | 165 - src/WINNT/afsd/queue95.h | 63 - src/WINNT/afsd/sample/token.c | 300 - src/WINNT/afsd/smb.c | 8512 ----------------- src/WINNT/afsd/smb.h | 667 -- src/WINNT/afsd/smb3.c | 6897 ------------- src/WINNT/afsd/smb3.h | 210 - src/WINNT/afsd/smb_iocons.h | 94 - src/WINNT/afsd/smb_ioctl.c | 450 - src/WINNT/afsd/smb_ioctl.h | 43 - src/WINNT/afsd/symlink.c | 419 - src/WINNT/afsd/symlink.rc | 17 - src/WINNT/afsd/tokens.rc | 17 - src/WINNT/afsd/unlog.rc | 17 - src/WINNT/afslegal/NTMakefile | 51 - src/WINNT/afslegal/afslegal.cpp | 117 - src/WINNT/afslegal/afslegal_stub.rc | 16 - src/WINNT/afslegal/lang/NTMakefile | 65 - src/WINNT/afslegal/lang/de_DE/afslegal.rc | 133 - src/WINNT/afslegal/lang/en_US/afslegal.rc | 133 - src/WINNT/afslegal/lang/es_ES/afslegal.rc | 134 - src/WINNT/afslegal/lang/ja_JP/afslegal.rc | 132 - src/WINNT/afslegal/lang/ko_KR/afslegal.rc | 132 - src/WINNT/afslegal/lang/pt_BR/afslegal.rc | 134 - src/WINNT/afslegal/lang/zh_CN/afslegal.rc | 134 - src/WINNT/afslegal/lang/zh_TW/afslegal.rc | 132 - src/WINNT/afslegal/resource.h | 29 - src/WINNT/afsreg/NTMakefile | 39 - src/WINNT/afsreg/afsreg.c | 476 - src/WINNT/afsreg/afsreg.h | 231 - src/WINNT/afsreg/afssw.c | 302 - src/WINNT/afsreg/afssw.h | 48 - src/WINNT/afsreg/syscfg.c | 474 - src/WINNT/afsreg/syscfg.h | 26 - src/WINNT/afsreg/test/NTMakefile | 29 - src/WINNT/afsreg/test/dupkey.c | 38 - src/WINNT/afsreg/test/getifinfo.c | 61 - src/WINNT/afsreg/test/regman.c | 358 - src/WINNT/afsreg/vptab.c | 294 - src/WINNT/afsreg/vptab.h | 63 - src/WINNT/afssvrcfg/.cvsignore | 1 - src/WINNT/afssvrcfg/NTMakefile | 103 - src/WINNT/afssvrcfg/admin_info_dlg.cpp | 186 - src/WINNT/afssvrcfg/admin_info_dlg.h | 19 - src/WINNT/afssvrcfg/afscfg.cpp | 660 -- src/WINNT/afssvrcfg/afscfg.h | 223 - src/WINNT/afssvrcfg/afscfg_stub.rc | 18 - src/WINNT/afssvrcfg/afsdrive.ico | Bin 318 -> 0 bytes src/WINNT/afssvrcfg/app_icon.ico | Bin 10134 -> 0 bytes src/WINNT/afssvrcfg/backup_server_page.cpp | 154 - src/WINNT/afssvrcfg/cfg_utils.cpp | 140 - src/WINNT/afssvrcfg/cfg_utils.h | 37 - src/WINNT/afssvrcfg/char_conv.cpp | 55 - src/WINNT/afssvrcfg/char_conv.h | 52 - src/WINNT/afssvrcfg/config.h | 18 - src/WINNT/afssvrcfg/config_server_page.cpp | 2215 ----- src/WINNT/afssvrcfg/create_partition_dlg.cpp | 261 - src/WINNT/afssvrcfg/create_partition_dlg.h | 16 - src/WINNT/afssvrcfg/db_server_page.cpp | 174 - src/WINNT/afssvrcfg/disabled.ico | Bin 318 -> 0 bytes src/WINNT/afssvrcfg/disk_dri.ico | Bin 318 -> 0 bytes src/WINNT/afssvrcfg/file.ico | Bin 1078 -> 0 bytes src/WINNT/afssvrcfg/file_server_page.cpp | 141 - src/WINNT/afssvrcfg/folder.ico | Bin 1078 -> 0 bytes src/WINNT/afssvrcfg/get_cur_config.cpp | 537 -- src/WINNT/afssvrcfg/get_cur_config.h | 19 - src/WINNT/afssvrcfg/get_pw_dlg.cpp | 140 - src/WINNT/afssvrcfg/get_pw_dlg.h | 16 - src/WINNT/afssvrcfg/graphics.cpp | 382 - src/WINNT/afssvrcfg/graphics.h | 20 - src/WINNT/afssvrcfg/help.cpp | 370 - src/WINNT/afssvrcfg/hourglass.h | 29 - src/WINNT/afssvrcfg/info2_page.cpp | 214 - src/WINNT/afssvrcfg/info_page.cpp | 194 - src/WINNT/afssvrcfg/intro_page.cpp | 87 - src/WINNT/afssvrcfg/lang/.cvsignore | 1 - src/WINNT/afssvrcfg/lang/NTMakefile | 66 - src/WINNT/afssvrcfg/lang/de_DE/afscfg.rc | 1212 --- src/WINNT/afssvrcfg/lang/en_US/afscfg.rc | 1199 --- src/WINNT/afssvrcfg/lang/es_ES/afscfg.rc | 1237 --- src/WINNT/afssvrcfg/lang/ja_JP/afscfg.rc | 1212 --- src/WINNT/afssvrcfg/lang/ko_KR/afscfg.rc | 1169 --- src/WINNT/afssvrcfg/lang/ko_KR/status_16.bmp | Bin 23158 -> 0 bytes src/WINNT/afssvrcfg/lang/ko_KR/status_256.bmp | Bin 45878 -> 0 bytes src/WINNT/afssvrcfg/lang/pt_BR/afscfg.rc | 1204 --- src/WINNT/afssvrcfg/lang/zh_CN/afscfg.rc | 1140 --- src/WINNT/afssvrcfg/lang/zh_TW/afscfg.rc | 1159 --- src/WINNT/afssvrcfg/logfile.cpp | 183 - src/WINNT/afssvrcfg/logfile.h | 47 - src/WINNT/afssvrcfg/partition_page.cpp | 350 - src/WINNT/afssvrcfg/partition_utils.cpp | 101 - src/WINNT/afssvrcfg/partition_utils.h | 21 - src/WINNT/afssvrcfg/partitions_page.cpp | 462 - src/WINNT/afssvrcfg/replicatition_page.cpp | 156 - src/WINNT/afssvrcfg/resource.h | 516 - src/WINNT/afssvrcfg/root_afs_page.cpp | 171 - src/WINNT/afssvrcfg/salvage_dlg.cpp | 309 - src/WINNT/afssvrcfg/salvage_results_dlg.cpp | 355 - src/WINNT/afssvrcfg/salvage_results_dlg.h | 16 - src/WINNT/afssvrcfg/services_page.cpp | 607 -- src/WINNT/afssvrcfg/status_16.bmp | Bin 23158 -> 0 bytes src/WINNT/afssvrcfg/status_256.bmp | Bin 45878 -> 0 bytes src/WINNT/afssvrcfg/sys_control_page.cpp | 242 - src/WINNT/afssvrcfg/toolbox.cpp | 257 - src/WINNT/afssvrcfg/toolbox.h | 55 - src/WINNT/afssvrcfg/validation.cpp | 140 - src/WINNT/afssvrcfg/validation.h | 27 - src/WINNT/afssvrcfg/volume_utils.cpp | 360 - src/WINNT/afssvrcfg/volume_utils.h | 19 - src/WINNT/afssvrcfg/warn_dri.ico | Bin 318 -> 0 bytes src/WINNT/afssvrcpa/.cvsignore | 2 - src/WINNT/afssvrcpa/NTMakefile | 68 - src/WINNT/afssvrcpa/afssvrcpa.def | 10 - src/WINNT/afssvrcpa/afssvrcpa.ico | Bin 766 -> 0 bytes src/WINNT/afssvrcpa/afssvrcpa_stub.rc | 18 - src/WINNT/afssvrcpa/cpl_interface.cpp | 143 - src/WINNT/afssvrcpa/cpl_interface.h | 24 - src/WINNT/afssvrcpa/lang/.cvsignore | 2 - src/WINNT/afssvrcpa/lang/NTMakefile | 66 - src/WINNT/afssvrcpa/lang/de_DE/afssvrcpa.rc | 49 - src/WINNT/afssvrcpa/lang/en_US/afssvrcpa.rc | 48 - src/WINNT/afssvrcpa/lang/es_ES/afssvrcpa.rc | 50 - src/WINNT/afssvrcpa/lang/ja_JP/afssvrcpa.rc | 48 - src/WINNT/afssvrcpa/lang/ko_KR/afssvrcpa.rc | 49 - src/WINNT/afssvrcpa/lang/pt_BR/afssvrcpa.rc | 48 - src/WINNT/afssvrcpa/lang/zh_CN/afssvrcpa.rc | 49 - src/WINNT/afssvrcpa/lang/zh_TW/afssvrcpa.rc | 49 - src/WINNT/afssvrcpa/resource.h | 15 - src/WINNT/afssvrmgr/NTMakefile | 130 - src/WINNT/afssvrmgr/action.cpp | 1743 ---- src/WINNT/afssvrmgr/action.h | 32 - src/WINNT/afssvrmgr/agg_col.cpp | 164 - src/WINNT/afssvrmgr/agg_col.h | 65 - src/WINNT/afssvrmgr/agg_general.cpp | 77 - src/WINNT/afssvrmgr/agg_general.h | 27 - src/WINNT/afssvrmgr/agg_prop.cpp | 329 - src/WINNT/afssvrmgr/agg_prop.h | 37 - src/WINNT/afssvrmgr/agg_tab.cpp | 288 - src/WINNT/afssvrmgr/agg_tab.h | 26 - src/WINNT/afssvrmgr/alert.cpp | 1126 --- src/WINNT/afssvrmgr/alert.h | 136 - src/WINNT/afssvrmgr/cmdline.cpp | 332 - src/WINNT/afssvrmgr/cmdline.h | 30 - src/WINNT/afssvrmgr/columns.cpp | 545 -- src/WINNT/afssvrmgr/columns.h | 23 - src/WINNT/afssvrmgr/command.cpp | 381 - src/WINNT/afssvrmgr/command.h | 20 - src/WINNT/afssvrmgr/creds.cpp | 426 - src/WINNT/afssvrmgr/creds.h | 24 - src/WINNT/afssvrmgr/dispatch.cpp | 564 -- src/WINNT/afssvrmgr/dispatch.h | 60 - src/WINNT/afssvrmgr/dispguts.cpp | 1156 --- src/WINNT/afssvrmgr/dispguts.h | 37 - src/WINNT/afssvrmgr/display.cpp | 726 -- src/WINNT/afssvrmgr/display.h | 109 - src/WINNT/afssvrmgr/exportcl.h | 99 - src/WINNT/afssvrmgr/general.cpp | 90 - src/WINNT/afssvrmgr/general.h | 33 - src/WINNT/afssvrmgr/help.hid | 532 -- src/WINNT/afssvrmgr/helpfunc.cpp | 1072 --- src/WINNT/afssvrmgr/helpfunc.h | 27 - src/WINNT/afssvrmgr/lang/NTMakefile | 66 - src/WINNT/afssvrmgr/lang/de_DE/svrmgr.rc | 3033 ------ src/WINNT/afssvrmgr/lang/en_US/svrmgr.rc | 3004 ------ src/WINNT/afssvrmgr/lang/es_ES/svrmgr.rc | 3060 ------ src/WINNT/afssvrmgr/lang/ja_JP/svrmgr.rc | 3010 ------ src/WINNT/afssvrmgr/lang/ko_KR/svrmgr.rc | 2987 ------ src/WINNT/afssvrmgr/lang/pt_BR/svrmgr.rc | 3030 ------ src/WINNT/afssvrmgr/lang/zh_CN/svrmgr.rc | 2932 ------ src/WINNT/afssvrmgr/lang/zh_TW/svrmgr.rc | 2965 ------ src/WINNT/afssvrmgr/messages.h | 100 - src/WINNT/afssvrmgr/options.cpp | 145 - src/WINNT/afssvrmgr/options.h | 23 - src/WINNT/afssvrmgr/prefs.cpp | 221 - src/WINNT/afssvrmgr/prefs.h | 27 - src/WINNT/afssvrmgr/problems.cpp | 376 - src/WINNT/afssvrmgr/problems.h | 33 - src/WINNT/afssvrmgr/propcache.cpp | 131 - src/WINNT/afssvrmgr/propcache.h | 56 - src/WINNT/afssvrmgr/resource.h | 1105 --- src/WINNT/afssvrmgr/resource/admlist.ico | Bin 766 -> 0 bytes src/WINNT/afssvrmgr/resource/afssvrmgr.ico | Bin 3310 -> 0 bytes src/WINNT/afssvrmgr/resource/btn_delete.ico | Bin 1078 -> 0 bytes src/WINNT/afssvrmgr/resource/btn_rename.ico | Bin 1078 -> 0 bytes src/WINNT/afssvrmgr/resource/getdates.ico | Bin 766 -> 0 bytes src/WINNT/afssvrmgr/resource/install.ico | Bin 766 -> 0 bytes src/WINNT/afssvrmgr/resource/prune.ico | Bin 766 -> 0 bytes src/WINNT/afssvrmgr/resource/setmove.avi | 109 - src/WINNT/afssvrmgr/resource/subset.ico | Bin 318 -> 0 bytes src/WINNT/afssvrmgr/resource/uninstal.ico | Bin 766 -> 0 bytes src/WINNT/afssvrmgr/set_clone.cpp | 323 - src/WINNT/afssvrmgr/set_clone.h | 39 - src/WINNT/afssvrmgr/set_col.cpp | 304 - src/WINNT/afssvrmgr/set_col.h | 107 - src/WINNT/afssvrmgr/set_create.cpp | 355 - src/WINNT/afssvrmgr/set_create.h | 37 - src/WINNT/afssvrmgr/set_createrep.cpp | 284 - src/WINNT/afssvrmgr/set_createrep.h | 35 - src/WINNT/afssvrmgr/set_delete.cpp | 272 - src/WINNT/afssvrmgr/set_delete.h | 38 - src/WINNT/afssvrmgr/set_dump.cpp | 214 - src/WINNT/afssvrmgr/set_dump.h | 37 - src/WINNT/afssvrmgr/set_general.cpp | 88 - src/WINNT/afssvrmgr/set_general.h | 42 - src/WINNT/afssvrmgr/set_move.cpp | 297 - src/WINNT/afssvrmgr/set_move.h | 35 - src/WINNT/afssvrmgr/set_prop.cpp | 423 - src/WINNT/afssvrmgr/set_prop.h | 37 - src/WINNT/afssvrmgr/set_quota.cpp | 230 - src/WINNT/afssvrmgr/set_quota.h | 40 - src/WINNT/afssvrmgr/set_release.cpp | 126 - src/WINNT/afssvrmgr/set_release.h | 35 - src/WINNT/afssvrmgr/set_rename.cpp | 175 - src/WINNT/afssvrmgr/set_rename.h | 42 - src/WINNT/afssvrmgr/set_repprop.cpp | 294 - src/WINNT/afssvrmgr/set_repprop.h | 38 - src/WINNT/afssvrmgr/set_restore.cpp | 436 - src/WINNT/afssvrmgr/set_restore.h | 37 - src/WINNT/afssvrmgr/set_tab.cpp | 781 -- src/WINNT/afssvrmgr/set_tab.h | 25 - src/WINNT/afssvrmgr/subset.cpp | 1000 -- src/WINNT/afssvrmgr/subset.h | 48 - src/WINNT/afssvrmgr/svc_col.cpp | 202 - src/WINNT/afssvrmgr/svc_col.h | 67 - src/WINNT/afssvrmgr/svc_create.cpp | 225 - src/WINNT/afssvrmgr/svc_create.h | 42 - src/WINNT/afssvrmgr/svc_delete.cpp | 95 - src/WINNT/afssvrmgr/svc_delete.h | 24 - src/WINNT/afssvrmgr/svc_general.cpp | 92 - src/WINNT/afssvrmgr/svc_general.h | 26 - src/WINNT/afssvrmgr/svc_prop.cpp | 539 -- src/WINNT/afssvrmgr/svc_prop.h | 44 - src/WINNT/afssvrmgr/svc_startstop.cpp | 168 - src/WINNT/afssvrmgr/svc_startstop.h | 45 - src/WINNT/afssvrmgr/svc_tab.cpp | 376 - src/WINNT/afssvrmgr/svc_tab.h | 25 - src/WINNT/afssvrmgr/svc_viewlog.cpp | 509 - src/WINNT/afssvrmgr/svc_viewlog.h | 40 - src/WINNT/afssvrmgr/svr_address.cpp | 388 - src/WINNT/afssvrmgr/svr_address.h | 41 - src/WINNT/afssvrmgr/svr_col.cpp | 118 - src/WINNT/afssvrmgr/svr_col.h | 54 - src/WINNT/afssvrmgr/svr_execute.cpp | 165 - src/WINNT/afssvrmgr/svr_execute.h | 35 - src/WINNT/afssvrmgr/svr_general.cpp | 178 - src/WINNT/afssvrmgr/svr_general.h | 38 - src/WINNT/afssvrmgr/svr_getdates.cpp | 244 - src/WINNT/afssvrmgr/svr_getdates.h | 35 - src/WINNT/afssvrmgr/svr_hosts.cpp | 385 - src/WINNT/afssvrmgr/svr_hosts.h | 23 - src/WINNT/afssvrmgr/svr_install.cpp | 222 - src/WINNT/afssvrmgr/svr_install.h | 36 - src/WINNT/afssvrmgr/svr_prop.cpp | 453 - src/WINNT/afssvrmgr/svr_prop.h | 57 - src/WINNT/afssvrmgr/svr_prune.cpp | 175 - src/WINNT/afssvrmgr/svr_prune.h | 37 - src/WINNT/afssvrmgr/svr_salvage.cpp | 522 - src/WINNT/afssvrmgr/svr_salvage.h | 43 - src/WINNT/afssvrmgr/svr_security.cpp | 829 -- src/WINNT/afssvrmgr/svr_security.h | 72 - src/WINNT/afssvrmgr/svr_syncvldb.cpp | 170 - src/WINNT/afssvrmgr/svr_syncvldb.h | 35 - src/WINNT/afssvrmgr/svr_uninstall.cpp | 165 - src/WINNT/afssvrmgr/svr_uninstall.h | 35 - src/WINNT/afssvrmgr/svr_window.cpp | 636 -- src/WINNT/afssvrmgr/svr_window.h | 59 - src/WINNT/afssvrmgr/svrmgr.cpp | 297 - src/WINNT/afssvrmgr/svrmgr.h | 254 - src/WINNT/afssvrmgr/svrmgr_stub.rc | 21 - src/WINNT/afssvrmgr/task.cpp | 2788 ------ src/WINNT/afssvrmgr/task.h | 198 - src/WINNT/afssvrmgr/window.cpp | 1125 --- src/WINNT/afssvrmgr/window.h | 50 - src/WINNT/afsusrmgr/.cvsignore | 2 - src/WINNT/afsusrmgr/AfsUsrMgr_stub.rc | 20 - src/WINNT/afsusrmgr/NTMakefile | 107 - src/WINNT/afsusrmgr/TaAfsUsrMgr.h | 168 - src/WINNT/afsusrmgr/action.cpp | 496 - src/WINNT/afsusrmgr/action.h | 29 - src/WINNT/afsusrmgr/browse.cpp | 508 - src/WINNT/afsusrmgr/browse.h | 44 - src/WINNT/afsusrmgr/cell_prop.cpp | 203 - src/WINNT/afsusrmgr/cell_prop.h | 38 - src/WINNT/afsusrmgr/cmdline.cpp | 250 - src/WINNT/afsusrmgr/cmdline.h | 29 - src/WINNT/afsusrmgr/columns.cpp | 443 - src/WINNT/afsusrmgr/columns.h | 23 - src/WINNT/afsusrmgr/command.cpp | 722 -- src/WINNT/afsusrmgr/command.h | 38 - src/WINNT/afsusrmgr/creds.cpp | 245 - src/WINNT/afsusrmgr/creds.h | 25 - src/WINNT/afsusrmgr/display.cpp | 629 -- src/WINNT/afsusrmgr/display.h | 58 - src/WINNT/afsusrmgr/errdata.cpp | 89 - src/WINNT/afsusrmgr/errdata.h | 43 - src/WINNT/afsusrmgr/general.cpp | 336 - src/WINNT/afsusrmgr/general.h | 57 - src/WINNT/afsusrmgr/grp_col.cpp | 109 - src/WINNT/afsusrmgr/grp_col.h | 58 - src/WINNT/afsusrmgr/grp_create.cpp | 312 - src/WINNT/afsusrmgr/grp_create.h | 31 - src/WINNT/afsusrmgr/grp_delete.cpp | 131 - src/WINNT/afsusrmgr/grp_delete.h | 29 - src/WINNT/afsusrmgr/grp_prop.cpp | 1018 -- src/WINNT/afsusrmgr/grp_prop.h | 69 - src/WINNT/afsusrmgr/grp_rename.cpp | 225 - src/WINNT/afsusrmgr/grp_rename.h | 29 - src/WINNT/afsusrmgr/grp_tab.cpp | 177 - src/WINNT/afsusrmgr/grp_tab.h | 23 - src/WINNT/afsusrmgr/help.hid | 315 - src/WINNT/afsusrmgr/helpfunc.cpp | 807 -- src/WINNT/afsusrmgr/helpfunc.h | 27 - src/WINNT/afsusrmgr/lang/.cvsignore | 1 - src/WINNT/afsusrmgr/lang/NTMakefile | 66 - src/WINNT/afsusrmgr/lang/de_DE/AfsUsrMgr.rc | 1798 ---- src/WINNT/afsusrmgr/lang/en_US/AfsUsrMgr.rc | 1766 ---- src/WINNT/afsusrmgr/lang/es_ES/AfsUsrMgr.rc | 1798 ---- src/WINNT/afsusrmgr/lang/ja_JP/AfsUsrMgr.rc | 1774 ---- src/WINNT/afsusrmgr/lang/ko_KR/AfsUsrMgr.rc | 1746 ---- src/WINNT/afsusrmgr/lang/pt_BR/AfsUsrMgr.rc | 1782 ---- src/WINNT/afsusrmgr/lang/zh_CN/AfsUsrMgr.rc | 1711 ---- src/WINNT/afsusrmgr/lang/zh_TW/AfsUsrMgr.rc | 1724 ---- src/WINNT/afsusrmgr/main.cpp | 221 - src/WINNT/afsusrmgr/mch_col.cpp | 120 - src/WINNT/afsusrmgr/mch_col.h | 58 - src/WINNT/afsusrmgr/mch_create.cpp | 338 - src/WINNT/afsusrmgr/mch_create.h | 31 - src/WINNT/afsusrmgr/mch_delete.cpp | 134 - src/WINNT/afsusrmgr/mch_delete.h | 29 - src/WINNT/afsusrmgr/mch_tab.cpp | 177 - src/WINNT/afsusrmgr/mch_tab.h | 23 - src/WINNT/afsusrmgr/messages.h | 27 - src/WINNT/afsusrmgr/options.cpp | 115 - src/WINNT/afsusrmgr/options.h | 29 - src/WINNT/afsusrmgr/resource.h | 473 - src/WINNT/afsusrmgr/resource/afsusrmgr.ico | Bin 1078 -> 0 bytes src/WINNT/afsusrmgr/task.cpp | 1853 ---- src/WINNT/afsusrmgr/task.h | 184 - src/WINNT/afsusrmgr/usr_col.cpp | 355 - src/WINNT/afsusrmgr/usr_col.h | 91 - src/WINNT/afsusrmgr/usr_cpw.cpp | 243 - src/WINNT/afsusrmgr/usr_cpw.h | 29 - src/WINNT/afsusrmgr/usr_create.cpp | 348 - src/WINNT/afsusrmgr/usr_create.h | 31 - src/WINNT/afsusrmgr/usr_delete.cpp | 156 - src/WINNT/afsusrmgr/usr_delete.h | 29 - src/WINNT/afsusrmgr/usr_prop.cpp | 1608 ---- src/WINNT/afsusrmgr/usr_prop.h | 100 - src/WINNT/afsusrmgr/usr_search.cpp | 144 - src/WINNT/afsusrmgr/usr_search.h | 31 - src/WINNT/afsusrmgr/usr_tab.cpp | 182 - src/WINNT/afsusrmgr/usr_tab.h | 23 - src/WINNT/afsusrmgr/window.cpp | 355 - src/WINNT/afsusrmgr/window.h | 28 - src/WINNT/afsusrmgr/winlist.cpp | 93 - src/WINNT/afsusrmgr/winlist.h | 40 - src/WINNT/aklog/.cvsignore | 1 - src/WINNT/aklog/NTMakefile | 59 - src/WINNT/aklog/aklog.c | 1272 --- src/WINNT/aklog/aklog.h | 63 - src/WINNT/aklog/aklog.rc | 17 - src/WINNT/aklog/linked_list.c | 173 - src/WINNT/aklog/linked_list.h | 49 - src/WINNT/bosctlsvc/.cvsignore | 1 - src/WINNT/bosctlsvc/NTMakefile | 53 - src/WINNT/bosctlsvc/bosctlsvc.c | 587 -- src/WINNT/bosctlsvc/bosctlsvc.rc | 17 - src/WINNT/client_config/.cvsignore | 1 - src/WINNT/client_config/NTMakefile | 196 - src/WINNT/client_config/RegistrySupport.cpp | 199 - src/WINNT/client_config/afs_config.h | 129 - src/WINNT/client_config/afs_config.ico | Bin 766 -> 0 bytes src/WINNT/client_config/afs_config_stub.rc | 18 - src/WINNT/client_config/afsmap.c | 172 - src/WINNT/client_config/cellservdb.c | 454 - src/WINNT/client_config/cellservdb.h | 94 - src/WINNT/client_config/config.cpp | 870 -- src/WINNT/client_config/config.h | 130 - src/WINNT/client_config/dlg_automap.cpp | 512 - src/WINNT/client_config/dlg_binding.cpp | 263 - src/WINNT/client_config/dlg_diag.cpp | 177 - src/WINNT/client_config/dlg_logon.cpp | 160 - src/WINNT/client_config/dlg_misc.cpp | 241 - src/WINNT/client_config/down.ico | Bin 766 -> 0 bytes src/WINNT/client_config/drivemap.cpp | 1403 --- src/WINNT/client_config/drivemap.h | 112 - src/WINNT/client_config/help.hid | 50 - src/WINNT/client_config/isadmin.cpp | 187 - src/WINNT/client_config/isadmin.h | 23 - src/WINNT/client_config/lang/.cvsignore | 1 - src/WINNT/client_config/lang/NTMakefile | 62 - .../client_config/lang/de_DE/afs_config.rc | 787 -- .../client_config/lang/en_US/afs_config.rc | 804 -- .../client_config/lang/es_ES/afs_config.rc | 795 -- .../client_config/lang/ja_JP/afs_config.rc | 781 -- .../client_config/lang/ko_KR/afs_config.rc | 775 -- .../client_config/lang/pt_BR/afs_config.rc | 786 -- .../client_config/lang/zh_CN/afs_config.rc | 768 -- .../client_config/lang/zh_TW/afs_config.rc | 770 -- src/WINNT/client_config/main.cpp | 191 - src/WINNT/client_config/misc.cpp | 48 - src/WINNT/client_config/pagesize.cpp | 54 - src/WINNT/client_config/pagesize.h | 23 - src/WINNT/client_config/resource.h | 193 - src/WINNT/client_config/tab_advanced.cpp | 266 - src/WINNT/client_config/tab_advanced.h | 25 - src/WINNT/client_config/tab_drives.cpp | 860 -- src/WINNT/client_config/tab_drives.h | 23 - src/WINNT/client_config/tab_general.cpp | 784 -- src/WINNT/client_config/tab_general.h | 23 - src/WINNT/client_config/tab_hosts.cpp | 795 -- src/WINNT/client_config/tab_hosts.h | 24 - src/WINNT/client_config/tab_prefs.cpp | 941 -- src/WINNT/client_config/tab_prefs.h | 25 - src/WINNT/client_config/up.ico | Bin 766 -> 0 bytes src/WINNT/client_cpa/.cvsignore | 2 - src/WINNT/client_cpa/NTMakefile | 111 - src/WINNT/client_cpa/afs_ccenter.ico | Bin 766 -> 0 bytes src/WINNT/client_cpa/afs_conf.ico | Bin 766 -> 0 bytes src/WINNT/client_cpa/afs_cpa.def | 10 - src/WINNT/client_cpa/afs_cpa_stub.rc | 19 - src/WINNT/client_cpa/cpl_interface.cpp | 127 - src/WINNT/client_cpa/cpl_interface.h | 24 - src/WINNT/client_cpa/lang/.cvsignore | 1 - src/WINNT/client_cpa/lang/NTMakefile | 63 - src/WINNT/client_cpa/lang/de_DE/afs_cpa.rc | 110 - src/WINNT/client_cpa/lang/en_US/afs_cpa.rc | 111 - src/WINNT/client_cpa/lang/es_ES/afs_cpa.rc | 111 - src/WINNT/client_cpa/lang/ja_JP/afs_cpa.rc | 110 - src/WINNT/client_cpa/lang/ko_KR/afs_cpa.rc | 110 - src/WINNT/client_cpa/lang/pt_BR/afs_cpa.rc | 111 - src/WINNT/client_cpa/lang/zh_CN/afs_cpa.rc | 111 - src/WINNT/client_cpa/lang/zh_TW/afs_cpa.rc | 110 - src/WINNT/client_cpa/resource.h | 29 - src/WINNT/client_creds/Makefile | 79 - src/WINNT/client_creds/NTMakefile | 141 - src/WINNT/client_creds/advtab.cpp | 308 - src/WINNT/client_creds/advtab.h | 23 - src/WINNT/client_creds/afscreds.h | 171 - src/WINNT/client_creds/afscreds.ico | Bin 318 -> 0 bytes src/WINNT/client_creds/afscreds_stub.rc | 18 - src/WINNT/client_creds/afswiz.cpp | 689 -- src/WINNT/client_creds/afswiz.h | 23 - src/WINNT/client_creds/creds.cpp | 471 - src/WINNT/client_creds/creds.h | 43 - src/WINNT/client_creds/creds_1.ico | Bin 318 -> 0 bytes src/WINNT/client_creds/creds_2.ico | Bin 318 -> 0 bytes src/WINNT/client_creds/creds_3.ico | Bin 318 -> 0 bytes src/WINNT/client_creds/credstab.cpp | 418 - src/WINNT/client_creds/credstab.h | 25 - src/WINNT/client_creds/help.hid | 44 - src/WINNT/client_creds/ipaddrchg.c | 517 - src/WINNT/client_creds/ipaddrchg.h | 44 - src/WINNT/client_creds/lang/NTMakefile | 64 - src/WINNT/client_creds/lang/de_DE/afscreds.rc | 581 -- src/WINNT/client_creds/lang/en_US/afscreds.rc | 576 -- src/WINNT/client_creds/lang/es_ES/afscreds.rc | 605 -- src/WINNT/client_creds/lang/ja_JP/afscreds.rc | 591 -- src/WINNT/client_creds/lang/ko_KR/afscreds.rc | 573 -- src/WINNT/client_creds/lang/pt_BR/afscreds.rc | 580 -- src/WINNT/client_creds/lang/zh_CN/afscreds.rc | 570 -- src/WINNT/client_creds/lang/zh_TW/afscreds.rc | 584 -- src/WINNT/client_creds/main.cpp | 410 - src/WINNT/client_creds/misc.cpp | 131 - src/WINNT/client_creds/mounttab.cpp | 478 - src/WINNT/client_creds/mounttab.h | 23 - src/WINNT/client_creds/resource.h | 153 - src/WINNT/client_creds/settings.cpp | 196 - src/WINNT/client_creds/settings.h | 164 - src/WINNT/client_creds/shortcut.cpp | 143 - src/WINNT/client_creds/shortcut.h | 26 - src/WINNT/client_creds/trayicon.cpp | 59 - src/WINNT/client_creds/trayicon.h | 23 - src/WINNT/client_creds/window.cpp | 756 -- src/WINNT/client_creds/window.h | 36 - src/WINNT/client_creds/wiz16.bmp | Bin 22798 -> 0 bytes src/WINNT/client_creds/wiz256.bmp | Bin 46438 -> 0 bytes src/WINNT/client_exp/NTMakefile | 146 - src/WINNT/client_exp/add_acl_entry_dlg.cpp | 147 - src/WINNT/client_exp/add_acl_entry_dlg.h | 69 - src/WINNT/client_exp/add_submount_dlg.cpp | 134 - src/WINNT/client_exp/add_submount_dlg.h | 61 - src/WINNT/client_exp/afs_shl_ext.cpp | 329 - src/WINNT/client_exp/afs_shl_ext.def | 18 - src/WINNT/client_exp/afs_shl_ext.h | 54 - src/WINNT/client_exp/afs_shl_ext.odl | 44 - src/WINNT/client_exp/afs_shl_ext.reg | 21 - src/WINNT/client_exp/afs_shl_ext_stub.rc | 16 - src/WINNT/client_exp/auth_dlg.cpp | 130 - src/WINNT/client_exp/auth_dlg.h | 44 - src/WINNT/client_exp/clear_acl_dlg.cpp | 65 - src/WINNT/client_exp/clear_acl_dlg.h | 41 - src/WINNT/client_exp/copy_acl_dlg.cpp | 122 - src/WINNT/client_exp/copy_acl_dlg.h | 54 - src/WINNT/client_exp/down_servers_dlg.cpp | 71 - src/WINNT/client_exp/down_servers_dlg.h | 47 - src/WINNT/client_exp/fs.h | 28 - src/WINNT/client_exp/gui2fs.cpp | 1658 ---- src/WINNT/client_exp/gui2fs.h | 45 - src/WINNT/client_exp/help.cpp | 61 - src/WINNT/client_exp/help.h | 38 - src/WINNT/client_exp/hourglass.h | 30 - src/WINNT/client_exp/klog_dlg.cpp | 140 - src/WINNT/client_exp/klog_dlg.h | 54 - src/WINNT/client_exp/lang/NTMakefile | 64 - src/WINNT/client_exp/lang/afs_shl_ext.rc2 | 18 - .../client_exp/lang/de_DE/afs_shl_ext.rc | 659 -- .../client_exp/lang/en_US/afs_shl_ext.rc | 692 -- .../client_exp/lang/es_ES/afs_shl_ext.rc | 677 -- .../client_exp/lang/ja_JP/afs_shl_ext.rc | 660 -- .../client_exp/lang/ko_KR/afs_shl_ext.rc | 659 -- .../client_exp/lang/pt_BR/afs_shl_ext.rc | 660 -- .../client_exp/lang/zh_CN/afs_shl_ext.rc | 654 -- .../client_exp/lang/zh_TW/afs_shl_ext.rc | 654 -- src/WINNT/client_exp/make_mount_point_dlg.cpp | 135 - src/WINNT/client_exp/make_mount_point_dlg.h | 58 - .../client_exp/make_symbolic_link_dlg.cpp | 144 - src/WINNT/client_exp/make_symbolic_link_dlg.h | 47 - src/WINNT/client_exp/mount_points_dlg.cpp | 84 - src/WINNT/client_exp/mount_points_dlg.h | 43 - src/WINNT/client_exp/msgs.cpp | 416 - src/WINNT/client_exp/msgs.h | 20 - src/WINNT/client_exp/partition_info_dlg.cpp | 90 - src/WINNT/client_exp/partition_info_dlg.h | 46 - src/WINNT/client_exp/resource.h | 273 - src/WINNT/client_exp/results_dlg.cpp | 96 - src/WINNT/client_exp/results_dlg.h | 48 - src/WINNT/client_exp/server_status_dlg.H | 60 - src/WINNT/client_exp/server_status_dlg.cpp | 136 - src/WINNT/client_exp/set_afs_acl.cpp | 403 - src/WINNT/client_exp/set_afs_acl.h | 76 - src/WINNT/client_exp/shell_ext.cpp | 739 -- src/WINNT/client_exp/shell_ext.h | 121 - src/WINNT/client_exp/stdafx.cpp | 16 - src/WINNT/client_exp/stdafx.h | 59 - src/WINNT/client_exp/submount_info.cpp | 42 - src/WINNT/client_exp/submount_info.h | 43 - src/WINNT/client_exp/submounts_dlg.cpp | 419 - src/WINNT/client_exp/submounts_dlg.h | 75 - src/WINNT/client_exp/unlog_dlg.cpp | 123 - src/WINNT/client_exp/unlog_dlg.h | 46 - src/WINNT/client_exp/volume_inf.h | 31 - src/WINNT/client_exp/volume_info.h | 63 - src/WINNT/client_exp/volumeinfo.cpp | 251 - src/WINNT/client_osi/Makefile.djgpp | 32 - src/WINNT/client_osi/NTMakefile | 143 - src/WINNT/client_osi/NTMakefile-TestOSI | 39 - src/WINNT/client_osi/basic.c | 247 - src/WINNT/client_osi/basic.h | 18 - src/WINNT/client_osi/dbrpc.idl | 94 - src/WINNT/client_osi/largeint.h | 257 - src/WINNT/client_osi/libosi.def | 71 - src/WINNT/client_osi/libosi.hpj | 6 - src/WINNT/client_osi/libosi.rc | 18 - src/WINNT/client_osi/libosi.rtf | 1059 -- src/WINNT/client_osi/libosicl.def | 13 - src/WINNT/client_osi/main.c | 333 - src/WINNT/client_osi/main.def | 17 - src/WINNT/client_osi/main.h | 43 - src/WINNT/client_osi/main.rc | 31 - src/WINNT/client_osi/osi.h | 100 - src/WINNT/client_osi/osibasel.c | 480 - src/WINNT/client_osi/osibasel.h | 130 - src/WINNT/client_osi/osidb.c | 209 - src/WINNT/client_osi/osidb.h | 61 - src/WINNT/client_osi/osidebug.c | 770 -- src/WINNT/client_osi/osidebug.def | 17 - src/WINNT/client_osi/osidebug.h | 69 - src/WINNT/client_osi/osidebug.hpj | 6 - src/WINNT/client_osi/osidebug.rc | 30 - src/WINNT/client_osi/osidebug.rtf | 228 - src/WINNT/client_osi/osievent.mc | 393 - src/WINNT/client_osi/osifd.c | 254 - src/WINNT/client_osi/osifd.h | 102 - src/WINNT/client_osi/osilog.c | 412 - src/WINNT/client_osi/osilog.h | 147 - src/WINNT/client_osi/osiltype.c | 64 - src/WINNT/client_osi/osiltype.h | 57 - src/WINNT/client_osi/osiqueue.c | 162 - src/WINNT/client_osi/osiqueue.h | 86 - src/WINNT/client_osi/osisleep.c | 727 -- src/WINNT/client_osi/osisleep.h | 173 - src/WINNT/client_osi/osistatl.c | 938 -- src/WINNT/client_osi/osistatl.h | 118 - src/WINNT/client_osi/osithrd95.c | 349 - src/WINNT/client_osi/osithrd95.h | 130 - src/WINNT/client_osi/osithrdnt.h | 36 - src/WINNT/client_osi/osiutils.c | 154 - src/WINNT/client_osi/osiutils.h | 19 - src/WINNT/client_osi/perf.c | 145 - src/WINNT/client_osi/perf.h | 17 - src/WINNT/client_osi/trylock.c | 171 - src/WINNT/client_osi/trylock.h | 17 - src/WINNT/doc/help/de_DE/AFS-CC.HLP | Bin 38446 -> 0 bytes src/WINNT/doc/help/de_DE/AFS-NT.HLP | Bin 269096 -> 0 bytes src/WINNT/doc/help/de_DE/Afs-light.hlp | Bin 200570 -> 0 bytes src/WINNT/doc/help/de_DE/TAAFSCFG.HLP | Bin 149173 -> 0 bytes src/WINNT/doc/help/de_DE/Taafssvrmgr.hlp | Bin 259482 -> 0 bytes src/WINNT/doc/help/de_DE/Taafsusrmgr.hlp | Bin 147077 -> 0 bytes src/WINNT/doc/help/de_DE/afs-cc.CNT | 10 - src/WINNT/doc/help/de_DE/afs-light.CNT | 63 - src/WINNT/doc/help/de_DE/afs-nt.CNT | 77 - src/WINNT/doc/help/de_DE/taafscfg.cnt | 32 - src/WINNT/doc/help/de_DE/taafssvrmgr.cnt | 89 - src/WINNT/doc/help/de_DE/taafsusrmgr.cnt | 59 - src/WINNT/doc/help/en_US/AFS-CC.HLP | Bin 35175 -> 0 bytes src/WINNT/doc/help/en_US/AFS-LIGHT.HLP | Bin 187771 -> 0 bytes src/WINNT/doc/help/en_US/AFS-NT.HLP | Bin 260857 -> 0 bytes src/WINNT/doc/help/en_US/afs-cc.CNT | 10 - src/WINNT/doc/help/en_US/afs-light.CNT | 63 - src/WINNT/doc/help/en_US/afs-nt.CNT | 77 - src/WINNT/doc/help/en_US/taafscfg.cnt | 32 - src/WINNT/doc/help/en_US/taafscfg.hlp | Bin 131873 -> 0 bytes src/WINNT/doc/help/en_US/taafssvrmgr.cnt | 89 - src/WINNT/doc/help/en_US/taafssvrmgr.hlp | Bin 240490 -> 0 bytes src/WINNT/doc/help/en_US/taafsusrmgr.cnt | 66 - src/WINNT/doc/help/en_US/taafsusrmgr.hlp | Bin 154042 -> 0 bytes src/WINNT/doc/help/es_ES/AFS-CC.CNT | 11 - src/WINNT/doc/help/es_ES/AFS-CC.HLP | Bin 39522 -> 0 bytes src/WINNT/doc/help/es_ES/AFS-LIGHT.HLP | Bin 208407 -> 0 bytes src/WINNT/doc/help/es_ES/AFS-NT.CNT | 78 - src/WINNT/doc/help/es_ES/AFS-NT.HLP | Bin 287085 -> 0 bytes src/WINNT/doc/help/es_ES/TAAFSCFG.CNT | 33 - src/WINNT/doc/help/es_ES/TAAFSCFG.HLP | Bin 152610 -> 0 bytes src/WINNT/doc/help/es_ES/TAAFSSVRMGR.HLP | Bin 227420 -> 0 bytes src/WINNT/doc/help/es_ES/TAAFSUSRMGR.HLP | Bin 145116 -> 0 bytes src/WINNT/doc/help/es_ES/afs-light.cnt | 64 - src/WINNT/doc/help/es_ES/taafssvrmgr.CNT | 90 - src/WINNT/doc/help/es_ES/taafsusrmgr.CNT | 0 src/WINNT/doc/help/ja_JP/AFS-CC.HLP | Bin 36540 -> 0 bytes src/WINNT/doc/help/ja_JP/AFS-LIGHT.HLP | Bin 226068 -> 0 bytes src/WINNT/doc/help/ja_JP/AFS-NT.HLP | Bin 314770 -> 0 bytes src/WINNT/doc/help/ja_JP/TAAFSCFG.HLP | Bin 133818 -> 0 bytes src/WINNT/doc/help/ja_JP/TAAFSSVRMGR.HLP | Bin 244950 -> 0 bytes src/WINNT/doc/help/ja_JP/TAAFSUSRMGR.HLP | Bin 153989 -> 0 bytes src/WINNT/doc/help/ja_JP/afs-cc.CNT | 10 - src/WINNT/doc/help/ja_JP/afs-light.CNT | 63 - src/WINNT/doc/help/ja_JP/afs-nt.CNT | 77 - src/WINNT/doc/help/ja_JP/taafscfg.cnt | 32 - src/WINNT/doc/help/ja_JP/taafssvrmgr.cnt | 89 - src/WINNT/doc/help/ja_JP/taafsusrmgr.cnt | 66 - src/WINNT/doc/help/ko_KR/AFS-CC.HLP | 0 src/WINNT/doc/help/ko_KR/AFS-LIGHT.HLP | Bin 238038 -> 0 bytes src/WINNT/doc/help/ko_KR/AFS-NT.HLP | Bin 330009 -> 0 bytes src/WINNT/doc/help/ko_KR/TAAFSCFG.HLP | Bin 112173 -> 0 bytes src/WINNT/doc/help/ko_KR/TAAFSSVRMGR.HLP | Bin 377731 -> 0 bytes src/WINNT/doc/help/ko_KR/TAAFSUSRMGR.HLP | Bin 250645 -> 0 bytes src/WINNT/doc/help/ko_KR/afs-cc.CNT | 10 - src/WINNT/doc/help/ko_KR/afs-light.CNT | 63 - src/WINNT/doc/help/ko_KR/afs-nt.CNT | 77 - src/WINNT/doc/help/ko_KR/taafscfg.cnt | 32 - src/WINNT/doc/help/ko_KR/taafssvrmgr.cnt | 89 - src/WINNT/doc/help/ko_KR/taafsusrmgr.cnt | 66 - src/WINNT/doc/help/pt_BR/AFS-CC.HLP | Bin 38335 -> 0 bytes src/WINNT/doc/help/pt_BR/AFS-LIGHT.HLP | Bin 203221 -> 0 bytes src/WINNT/doc/help/pt_BR/AFS-NT.HLP | Bin 281799 -> 0 bytes src/WINNT/doc/help/pt_BR/TAAFSCFG.HLP | Bin 145971 -> 0 bytes src/WINNT/doc/help/pt_BR/TAAFSSVRMGR.HLP | Bin 255293 -> 0 bytes src/WINNT/doc/help/pt_BR/TAAFSUSRMGR.HLP | Bin 160075 -> 0 bytes src/WINNT/doc/help/pt_BR/afs-cc.CNT | 10 - src/WINNT/doc/help/pt_BR/afs-light.CNT | 63 - src/WINNT/doc/help/pt_BR/afs-nt.CNT | 77 - src/WINNT/doc/help/pt_BR/taafscfg.cnt | 32 - src/WINNT/doc/help/pt_BR/taafssvrmgr.cnt | 89 - src/WINNT/doc/help/pt_BR/taafsusrmgr.cnt | 66 - src/WINNT/doc/help/zh_CN/AFS-CC.HLP | Bin 29598 -> 0 bytes src/WINNT/doc/help/zh_CN/AFS-LIGHT.HLP | Bin 188092 -> 0 bytes src/WINNT/doc/help/zh_CN/AFS-NT.HLP | Bin 262679 -> 0 bytes src/WINNT/doc/help/zh_CN/TAAFSCFG.HLP | Bin 95881 -> 0 bytes src/WINNT/doc/help/zh_CN/TAAFSSVRMGR.HLP | Bin 213067 -> 0 bytes src/WINNT/doc/help/zh_CN/TAAFSUSRMGR.HLP | Bin 133713 -> 0 bytes src/WINNT/doc/help/zh_CN/afs-cc.CNT | 10 - src/WINNT/doc/help/zh_CN/afs-light.CNT | 63 - src/WINNT/doc/help/zh_CN/afs-nt.CNT | 77 - src/WINNT/doc/help/zh_CN/taafscfg.cnt | 32 - src/WINNT/doc/help/zh_CN/taafssvrmgr.cnt | 89 - src/WINNT/doc/help/zh_CN/taafsusrmgr.cnt | 66 - src/WINNT/doc/help/zh_TW/AFS-CC.GID | Bin 10826 -> 0 bytes src/WINNT/doc/help/zh_TW/AFS-CC.HLP | Bin 33228 -> 0 bytes src/WINNT/doc/help/zh_TW/AFS-LIGHT.HLP | Bin 140234 -> 0 bytes src/WINNT/doc/help/zh_TW/AFS-NT.HLP | Bin 199211 -> 0 bytes src/WINNT/doc/help/zh_TW/TAAFSCFG.HLP | Bin 112709 -> 0 bytes src/WINNT/doc/help/zh_TW/TAAFSSVRMGR.HLP | Bin 226725 -> 0 bytes src/WINNT/doc/help/zh_TW/TAAFSUSRMGR.HLP | Bin 142264 -> 0 bytes src/WINNT/doc/help/zh_TW/afs-cc.CNT | 11 - src/WINNT/doc/help/zh_TW/afs-light.CNT | 64 - src/WINNT/doc/help/zh_TW/afs-nt.CNT | 78 - src/WINNT/doc/help/zh_TW/taafscfg.cnt | 33 - src/WINNT/doc/help/zh_TW/taafssvrmgr.cnt | 90 - src/WINNT/doc/help/zh_TW/taafsusrmgr.cnt | 67 - .../install/Documentation/de_DE/README.txt | 62 - .../de_DE/html/InstallGd/awqbg000.htm | 51 - .../de_DE/html/InstallGd/awqbg002.htm | 63 - .../de_DE/html/InstallGd/awqbg003.htm | 1317 --- .../de_DE/html/InstallGd/awqbg004.htm | 350 - .../Documentation/de_DE/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/de_DE/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/de_DE/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/de_DE/html/index.gif | Bin 241 -> 0 bytes .../Documentation/de_DE/html/index.htm | 117 - .../install/Documentation/de_DE/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/de_DE/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/de_DE/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/de_DE/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/en_US/README.txt | 62 - .../en_US/html/CmdRef/auarf000.htm | 47 - .../en_US/html/CmdRef/auarf002.htm | 314 - .../en_US/html/CmdRef/auarf003.htm | 29 - .../en_US/html/CmdRef/auarf004.htm | 28 - .../en_US/html/CmdRef/auarf005.htm | 32 - .../en_US/html/CmdRef/auarf006.htm | 55 - .../en_US/html/CmdRef/auarf007.htm | 28 - .../en_US/html/CmdRef/auarf008.htm | 55 - .../en_US/html/CmdRef/auarf009.htm | 57 - .../en_US/html/CmdRef/auarf010.htm | 26 - .../en_US/html/CmdRef/auarf011.htm | 124 - .../en_US/html/CmdRef/auarf012.htm | 57 - .../en_US/html/CmdRef/auarf013.htm | 49 - .../en_US/html/CmdRef/auarf014.htm | 57 - .../en_US/html/CmdRef/auarf015.htm | 57 - .../en_US/html/CmdRef/auarf016.htm | 179 - .../en_US/html/CmdRef/auarf017.htm | 59 - .../en_US/html/CmdRef/auarf018.htm | 565 -- .../en_US/html/CmdRef/auarf019.htm | 120 - .../en_US/html/CmdRef/auarf020.htm | 91 - .../en_US/html/CmdRef/auarf021.htm | 57 - .../en_US/html/CmdRef/auarf022.htm | 49 - .../en_US/html/CmdRef/auarf023.htm | 73 - .../en_US/html/CmdRef/auarf024.htm | 70 - .../en_US/html/CmdRef/auarf025.htm | 67 - .../en_US/html/CmdRef/auarf026.htm | 60 - .../en_US/html/CmdRef/auarf027.htm | 71 - .../en_US/html/CmdRef/auarf028.htm | 67 - .../en_US/html/CmdRef/auarf029.htm | 58 - .../en_US/html/CmdRef/auarf030.htm | 57 - .../en_US/html/CmdRef/auarf031.htm | 59 - .../en_US/html/CmdRef/auarf032.htm | 78 - .../en_US/html/CmdRef/auarf033.htm | 61 - .../en_US/html/CmdRef/auarf034.htm | 55 - .../en_US/html/CmdRef/auarf035.htm | 59 - .../en_US/html/CmdRef/auarf036.htm | 94 - .../en_US/html/CmdRef/auarf037.htm | 46 - .../en_US/html/CmdRef/auarf038.htm | 75 - .../en_US/html/CmdRef/auarf039.htm | 57 - .../en_US/html/CmdRef/auarf040.htm | 56 - .../en_US/html/CmdRef/auarf041.htm | 43 - .../en_US/html/CmdRef/auarf042.htm | 59 - .../en_US/html/CmdRef/auarf043.htm | 79 - .../en_US/html/CmdRef/auarf044.htm | 82 - .../en_US/html/CmdRef/auarf045.htm | 60 - .../en_US/html/CmdRef/auarf046.htm | 55 - .../en_US/html/CmdRef/auarf047.htm | 60 - .../en_US/html/CmdRef/auarf048.htm | 40 - .../en_US/html/CmdRef/auarf049.htm | 66 - .../en_US/html/CmdRef/auarf050.htm | 165 - .../en_US/html/CmdRef/auarf051.htm | 58 - .../en_US/html/CmdRef/auarf052.htm | 116 - .../en_US/html/CmdRef/auarf053.htm | 655 -- .../en_US/html/CmdRef/auarf054.htm | 343 - .../en_US/html/CmdRef/auarf055.htm | 759 -- .../en_US/html/CmdRef/auarf056.htm | 26 - .../en_US/html/CmdRef/auarf057.htm | 452 - .../en_US/html/CmdRef/auarf058.htm | 433 - .../en_US/html/CmdRef/auarf059.htm | 329 - .../en_US/html/CmdRef/auarf060.htm | 267 - .../en_US/html/CmdRef/auarf061.htm | 186 - .../en_US/html/CmdRef/auarf062.htm | 116 - .../en_US/html/CmdRef/auarf063.htm | 189 - .../en_US/html/CmdRef/auarf064.htm | 109 - .../en_US/html/CmdRef/auarf065.htm | 73 - .../en_US/html/CmdRef/auarf066.htm | 124 - .../en_US/html/CmdRef/auarf067.htm | 82 - .../en_US/html/CmdRef/auarf068.htm | 183 - .../en_US/html/CmdRef/auarf069.htm | 93 - .../en_US/html/CmdRef/auarf070.htm | 94 - .../en_US/html/CmdRef/auarf071.htm | 86 - .../en_US/html/CmdRef/auarf072.htm | 256 - .../en_US/html/CmdRef/auarf073.htm | 480 - .../en_US/html/CmdRef/auarf074.htm | 329 - .../en_US/html/CmdRef/auarf075.htm | 86 - .../en_US/html/CmdRef/auarf076.htm | 109 - .../en_US/html/CmdRef/auarf077.htm | 176 - .../en_US/html/CmdRef/auarf078.htm | 139 - .../en_US/html/CmdRef/auarf079.htm | 224 - .../en_US/html/CmdRef/auarf080.htm | 138 - .../en_US/html/CmdRef/auarf081.htm | 101 - .../en_US/html/CmdRef/auarf082.htm | 103 - .../en_US/html/CmdRef/auarf083.htm | 83 - .../en_US/html/CmdRef/auarf084.htm | 216 - .../en_US/html/CmdRef/auarf085.htm | 117 - .../en_US/html/CmdRef/auarf086.htm | 151 - .../en_US/html/CmdRef/auarf087.htm | 292 - .../en_US/html/CmdRef/auarf088.htm | 160 - .../en_US/html/CmdRef/auarf089.htm | 138 - .../en_US/html/CmdRef/auarf090.htm | 121 - .../en_US/html/CmdRef/auarf091.htm | 290 - .../en_US/html/CmdRef/auarf092.htm | 352 - .../en_US/html/CmdRef/auarf093.htm | 254 - .../en_US/html/CmdRef/auarf094.htm | 124 - .../en_US/html/CmdRef/auarf095.htm | 144 - .../en_US/html/CmdRef/auarf096.htm | 105 - .../en_US/html/CmdRef/auarf097.htm | 73 - .../en_US/html/CmdRef/auarf098.htm | 367 - .../en_US/html/CmdRef/auarf099.htm | 103 - .../en_US/html/CmdRef/auarf100.htm | 91 - .../en_US/html/CmdRef/auarf101.htm | 120 - .../en_US/html/CmdRef/auarf102.htm | 136 - .../en_US/html/CmdRef/auarf103.htm | 134 - .../en_US/html/CmdRef/auarf104.htm | 85 - .../en_US/html/CmdRef/auarf105.htm | 137 - .../en_US/html/CmdRef/auarf106.htm | 112 - .../en_US/html/CmdRef/auarf107.htm | 136 - .../en_US/html/CmdRef/auarf108.htm | 95 - .../en_US/html/CmdRef/auarf109.htm | 139 - .../en_US/html/CmdRef/auarf110.htm | 112 - .../en_US/html/CmdRef/auarf111.htm | 108 - .../en_US/html/CmdRef/auarf112.htm | 100 - .../en_US/html/CmdRef/auarf113.htm | 140 - .../en_US/html/CmdRef/auarf114.htm | 298 - .../en_US/html/CmdRef/auarf115.htm | 112 - .../en_US/html/CmdRef/auarf116.htm | 128 - .../en_US/html/CmdRef/auarf117.htm | 158 - .../en_US/html/CmdRef/auarf118.htm | 122 - .../en_US/html/CmdRef/auarf119.htm | 108 - .../en_US/html/CmdRef/auarf120.htm | 112 - .../en_US/html/CmdRef/auarf121.htm | 235 - .../en_US/html/CmdRef/auarf122.htm | 106 - .../en_US/html/CmdRef/auarf123.htm | 122 - .../en_US/html/CmdRef/auarf124.htm | 164 - .../en_US/html/CmdRef/auarf125.htm | 147 - .../en_US/html/CmdRef/auarf126.htm | 194 - .../en_US/html/CmdRef/auarf127.htm | 186 - .../en_US/html/CmdRef/auarf128.htm | 114 - .../en_US/html/CmdRef/auarf129.htm | 391 - .../en_US/html/CmdRef/auarf130.htm | 140 - .../en_US/html/CmdRef/auarf131.htm | 169 - .../en_US/html/CmdRef/auarf132.htm | 73 - .../en_US/html/CmdRef/auarf133.htm | 197 - .../en_US/html/CmdRef/auarf134.htm | 69 - .../en_US/html/CmdRef/auarf135.htm | 108 - .../en_US/html/CmdRef/auarf136.htm | 156 - .../en_US/html/CmdRef/auarf137.htm | 119 - .../en_US/html/CmdRef/auarf138.htm | 136 - .../en_US/html/CmdRef/auarf139.htm | 199 - .../en_US/html/CmdRef/auarf140.htm | 84 - .../en_US/html/CmdRef/auarf141.htm | 80 - .../en_US/html/CmdRef/auarf142.htm | 81 - .../en_US/html/CmdRef/auarf143.htm | 75 - .../en_US/html/CmdRef/auarf144.htm | 76 - .../en_US/html/CmdRef/auarf145.htm | 106 - .../en_US/html/CmdRef/auarf146.htm | 173 - .../en_US/html/CmdRef/auarf147.htm | 85 - .../en_US/html/CmdRef/auarf148.htm | 175 - .../en_US/html/CmdRef/auarf149.htm | 89 - .../en_US/html/CmdRef/auarf150.htm | 113 - .../en_US/html/CmdRef/auarf151.htm | 120 - .../en_US/html/CmdRef/auarf152.htm | 82 - .../en_US/html/CmdRef/auarf153.htm | 240 - .../en_US/html/CmdRef/auarf154.htm | 116 - .../en_US/html/CmdRef/auarf155.htm | 90 - .../en_US/html/CmdRef/auarf156.htm | 75 - .../en_US/html/CmdRef/auarf157.htm | 260 - .../en_US/html/CmdRef/auarf158.htm | 108 - .../en_US/html/CmdRef/auarf159.htm | 103 - .../en_US/html/CmdRef/auarf160.htm | 117 - .../en_US/html/CmdRef/auarf161.htm | 92 - .../en_US/html/CmdRef/auarf162.htm | 270 - .../en_US/html/CmdRef/auarf163.htm | 108 - .../en_US/html/CmdRef/auarf164.htm | 205 - .../en_US/html/CmdRef/auarf165.htm | 105 - .../en_US/html/CmdRef/auarf166.htm | 80 - .../en_US/html/CmdRef/auarf167.htm | 74 - .../en_US/html/CmdRef/auarf168.htm | 67 - .../en_US/html/CmdRef/auarf169.htm | 89 - .../en_US/html/CmdRef/auarf170.htm | 74 - .../en_US/html/CmdRef/auarf171.htm | 65 - .../en_US/html/CmdRef/auarf172.htm | 208 - .../en_US/html/CmdRef/auarf173.htm | 86 - .../en_US/html/CmdRef/auarf174.htm | 107 - .../en_US/html/CmdRef/auarf175.htm | 83 - .../en_US/html/CmdRef/auarf176.htm | 75 - .../en_US/html/CmdRef/auarf177.htm | 75 - .../en_US/html/CmdRef/auarf178.htm | 118 - .../en_US/html/CmdRef/auarf179.htm | 150 - .../en_US/html/CmdRef/auarf180.htm | 93 - .../en_US/html/CmdRef/auarf181.htm | 189 - .../en_US/html/CmdRef/auarf182.htm | 71 - .../en_US/html/CmdRef/auarf183.htm | 117 - .../en_US/html/CmdRef/auarf184.htm | 98 - .../en_US/html/CmdRef/auarf185.htm | 261 - .../en_US/html/CmdRef/auarf186.htm | 64 - .../en_US/html/CmdRef/auarf187.htm | 88 - .../en_US/html/CmdRef/auarf188.htm | 133 - .../en_US/html/CmdRef/auarf189.htm | 118 - .../en_US/html/CmdRef/auarf190.htm | 102 - .../en_US/html/CmdRef/auarf191.htm | 71 - .../en_US/html/CmdRef/auarf192.htm | 63 - .../en_US/html/CmdRef/auarf193.htm | 351 - .../en_US/html/CmdRef/auarf194.htm | 158 - .../en_US/html/CmdRef/auarf195.htm | 123 - .../en_US/html/CmdRef/auarf196.htm | 89 - .../en_US/html/CmdRef/auarf197.htm | 99 - .../en_US/html/CmdRef/auarf198.htm | 150 - .../en_US/html/CmdRef/auarf199.htm | 115 - .../en_US/html/CmdRef/auarf200.htm | 307 - .../en_US/html/CmdRef/auarf201.htm | 178 - .../en_US/html/CmdRef/auarf202.htm | 164 - .../en_US/html/CmdRef/auarf203.htm | 88 - .../en_US/html/CmdRef/auarf204.htm | 155 - .../en_US/html/CmdRef/auarf205.htm | 72 - .../en_US/html/CmdRef/auarf206.htm | 88 - .../en_US/html/CmdRef/auarf207.htm | 58 - .../en_US/html/CmdRef/auarf208.htm | 121 - .../en_US/html/CmdRef/auarf209.htm | 89 - .../en_US/html/CmdRef/auarf210.htm | 149 - .../en_US/html/CmdRef/auarf211.htm | 121 - .../en_US/html/CmdRef/auarf212.htm | 71 - .../en_US/html/CmdRef/auarf213.htm | 103 - .../en_US/html/CmdRef/auarf214.htm | 204 - .../en_US/html/CmdRef/auarf215.htm | 183 - .../en_US/html/CmdRef/auarf216.htm | 107 - .../en_US/html/CmdRef/auarf217.htm | 256 - .../en_US/html/CmdRef/auarf218.htm | 85 - .../en_US/html/CmdRef/auarf219.htm | 112 - .../en_US/html/CmdRef/auarf220.htm | 90 - .../en_US/html/CmdRef/auarf221.htm | 127 - .../en_US/html/CmdRef/auarf222.htm | 146 - .../en_US/html/CmdRef/auarf223.htm | 111 - .../en_US/html/CmdRef/auarf224.htm | 110 - .../en_US/html/CmdRef/auarf225.htm | 199 - .../en_US/html/CmdRef/auarf226.htm | 95 - .../en_US/html/CmdRef/auarf227.htm | 114 - .../en_US/html/CmdRef/auarf228.htm | 120 - .../en_US/html/CmdRef/auarf229.htm | 105 - .../en_US/html/CmdRef/auarf230.htm | 123 - .../en_US/html/CmdRef/auarf231.htm | 168 - .../en_US/html/CmdRef/auarf232.htm | 265 - .../en_US/html/CmdRef/auarf233.htm | 283 - .../en_US/html/CmdRef/auarf234.htm | 67 - .../en_US/html/CmdRef/auarf235.htm | 124 - .../en_US/html/CmdRef/auarf236.htm | 54 - .../en_US/html/CmdRef/auarf237.htm | 325 - .../en_US/html/CmdRef/auarf238.htm | 80 - .../en_US/html/CmdRef/auarf239.htm | 113 - .../en_US/html/CmdRef/auarf240.htm | 161 - .../en_US/html/CmdRef/auarf241.htm | 129 - .../en_US/html/CmdRef/auarf242.htm | 110 - .../en_US/html/CmdRef/auarf243.htm | 291 - .../en_US/html/CmdRef/auarf244.htm | 70 - .../en_US/html/CmdRef/auarf245.htm | 135 - .../en_US/html/CmdRef/auarf246.htm | 132 - .../en_US/html/CmdRef/auarf247.htm | 87 - .../en_US/html/CmdRef/auarf248.htm | 91 - .../en_US/html/CmdRef/auarf249.htm | 114 - .../en_US/html/CmdRef/auarf250.htm | 115 - .../en_US/html/CmdRef/auarf251.htm | 105 - .../en_US/html/CmdRef/auarf252.htm | 243 - .../en_US/html/CmdRef/auarf253.htm | 120 - .../en_US/html/CmdRef/auarf254.htm | 72 - .../en_US/html/CmdRef/auarf255.htm | 106 - .../en_US/html/CmdRef/auarf256.htm | 270 - .../en_US/html/CmdRef/auarf257.htm | 129 - .../en_US/html/CmdRef/auarf258.htm | 165 - .../en_US/html/CmdRef/auarf259.htm | 171 - .../en_US/html/CmdRef/auarf260.htm | 193 - .../en_US/html/CmdRef/auarf261.htm | 317 - .../en_US/html/CmdRef/auarf262.htm | 85 - .../en_US/html/CmdRef/auarf263.htm | 103 - .../en_US/html/CmdRef/auarf264.htm | 98 - .../en_US/html/CmdRef/auarf265.htm | 231 - .../en_US/html/CmdRef/auarf266.htm | 308 - .../en_US/html/CmdRef/auarf267.htm | 99 - .../en_US/html/CmdRef/auarf268.htm | 166 - .../en_US/html/CmdRef/auarf269.htm | 115 - .../en_US/html/CmdRef/auarf270.htm | 187 - .../en_US/html/CmdRef/auarf271.htm | 169 - .../en_US/html/CmdRef/auarf272.htm | 120 - .../en_US/html/CmdRef/auarf273.htm | 109 - .../en_US/html/CmdRef/auarf274.htm | 194 - .../en_US/html/CmdRef/auarf275.htm | 143 - .../en_US/html/CmdRef/auarf276.htm | 114 - .../en_US/html/CmdRef/auarf277.htm | 136 - .../en_US/html/CmdRef/auarf278.htm | 97 - .../en_US/html/CmdRef/auarf279.htm | 129 - .../en_US/html/CmdRef/auarf280.htm | 148 - .../en_US/html/CmdRef/auarf281.htm | 60 - .../en_US/html/CmdRef/auarf282.htm | 97 - .../en_US/html/CmdRef/auarf283.htm | 96 - .../en_US/html/CmdRef/auarf284.htm | 4966 ---------- .../en_US/html/InstallGd/awqbg000.htm | 43 - .../en_US/html/InstallGd/awqbg002.htm | 64 - .../en_US/html/InstallGd/awqbg003.htm | 1203 --- .../en_US/html/InstallGd/awqbg004.htm | 341 - .../en_US/html/ReleaseNotes/awrns000.htm | 43 - .../en_US/html/ReleaseNotes/awrns002.htm | 135 - .../en_US/html/ReleaseNotes/awrns003.htm | 98 - .../en_US/html/ReleaseNotes/awrns004.htm | 238 - .../en_US/html/ReleaseNotes/awrns005.htm | 179 - .../en_US/html/ReleaseNotes/awrns006.htm | 209 - .../en_US/html/ReleaseNotes/awrns007.htm | 151 - .../en_US/html/SysAdminGd/auagd000.htm | 47 - .../en_US/html/SysAdminGd/auagd002.htm | 1008 -- .../en_US/html/SysAdminGd/auagd003.htm | 37 - .../en_US/html/SysAdminGd/auagd004.htm | 32 - .../en_US/html/SysAdminGd/auagd005.htm | 145 - .../en_US/html/SysAdminGd/auagd006.htm | 780 -- .../en_US/html/SysAdminGd/auagd007.htm | 2374 ----- .../en_US/html/SysAdminGd/auagd008.htm | 2712 ------ .../en_US/html/SysAdminGd/auagd009.htm | 1420 --- .../en_US/html/SysAdminGd/auagd010.htm | 3623 ------- .../en_US/html/SysAdminGd/auagd011.htm | 2557 ----- .../en_US/html/SysAdminGd/auagd012.htm | 2747 ------ .../en_US/html/SysAdminGd/auagd013.htm | 1873 ---- .../en_US/html/SysAdminGd/auagd014.htm | 831 -- .../en_US/html/SysAdminGd/auagd015.htm | 2170 ----- .../en_US/html/SysAdminGd/auagd016.htm | 1148 --- .../en_US/html/SysAdminGd/auagd017.htm | 2501 ----- .../en_US/html/SysAdminGd/auagd018.htm | 1391 --- .../en_US/html/SysAdminGd/auagd019.htm | 1437 --- .../en_US/html/SysAdminGd/auagd020.htm | 939 -- .../en_US/html/SysAdminGd/auagd021.htm | 416 - .../en_US/html/SysAdminGd/auagd022.htm | 858 -- .../en_US/html/SysAdminGd/auagd023.htm | 370 - .../en_US/html/SysAdminGd/auagd024.htm | 1552 --- .../en_US/html/SysAdminGd/auagd025.htm | 1079 --- .../en_US/html/SysAdminGd/auagd026.htm | 7140 -------------- .../en_US/html/SysAdminGd/cachmgr.gif | Bin 17319 -> 0 bytes .../en_US/html/SysAdminGd/fserver1.gif | Bin 16683 -> 0 bytes .../en_US/html/SysAdminGd/fserver2.gif | Bin 16426 -> 0 bytes .../en_US/html/SysAdminGd/overview.gif | Bin 13389 -> 0 bytes .../en_US/html/SysAdminGd/scout1.gif | Bin 8455 -> 0 bytes .../en_US/html/SysAdminGd/scout2.gif | Bin 9022 -> 0 bytes .../en_US/html/SysAdminGd/scout3.gif | Bin 9949 -> 0 bytes .../en_US/html/SysAdminGd/scout4.gif | Bin 8800 -> 0 bytes .../en_US/html/SysAdminGd/vnode.gif | Bin 15767 -> 0 bytes .../Documentation/en_US/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/en_US/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/en_US/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/en_US/html/index.gif | Bin 241 -> 0 bytes .../Documentation/en_US/html/index.htm | 141 - .../install/Documentation/en_US/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/en_US/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/en_US/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/en_US/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/es_ES/README.txt | 62 - .../es_ES/html/InstallGd/awqbg000.htm | 51 - .../es_ES/html/InstallGd/awqbg002.htm | 67 - .../es_ES/html/InstallGd/awqbg003.htm | 1321 --- .../es_ES/html/InstallGd/awqbg004.htm | 336 - .../Documentation/es_ES/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/es_ES/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/es_ES/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/es_ES/html/index.gif | Bin 241 -> 0 bytes .../Documentation/es_ES/html/index.htm | 122 - .../install/Documentation/es_ES/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/es_ES/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/es_ES/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/es_ES/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/ja_JP/README.txt | 62 - .../ja_JP/html/CmdRef/auarf000.htm | 77 - .../ja_JP/html/CmdRef/auarf002.htm | 314 - .../ja_JP/html/CmdRef/auarf003.htm | 29 - .../ja_JP/html/CmdRef/auarf004.htm | 27 - .../ja_JP/html/CmdRef/auarf005.htm | 27 - .../ja_JP/html/CmdRef/auarf006.htm | 38 - .../ja_JP/html/CmdRef/auarf007.htm | 26 - .../ja_JP/html/CmdRef/auarf008.htm | 37 - .../ja_JP/html/CmdRef/auarf009.htm | 41 - .../ja_JP/html/CmdRef/auarf010.htm | 26 - .../ja_JP/html/CmdRef/auarf011.htm | 113 - .../ja_JP/html/CmdRef/auarf012.htm | 42 - .../ja_JP/html/CmdRef/auarf013.htm | 40 - .../ja_JP/html/CmdRef/auarf014.htm | 42 - .../ja_JP/html/CmdRef/auarf015.htm | 41 - .../ja_JP/html/CmdRef/auarf016.htm | 128 - .../ja_JP/html/CmdRef/auarf017.htm | 49 - .../ja_JP/html/CmdRef/auarf018.htm | 351 - .../ja_JP/html/CmdRef/auarf019.htm | 75 - .../ja_JP/html/CmdRef/auarf020.htm | 61 - .../ja_JP/html/CmdRef/auarf021.htm | 43 - .../ja_JP/html/CmdRef/auarf022.htm | 42 - .../ja_JP/html/CmdRef/auarf023.htm | 58 - .../ja_JP/html/CmdRef/auarf024.htm | 46 - .../ja_JP/html/CmdRef/auarf025.htm | 52 - .../ja_JP/html/CmdRef/auarf026.htm | 45 - .../ja_JP/html/CmdRef/auarf027.htm | 51 - .../ja_JP/html/CmdRef/auarf028.htm | 52 - .../ja_JP/html/CmdRef/auarf029.htm | 49 - .../ja_JP/html/CmdRef/auarf030.htm | 41 - .../ja_JP/html/CmdRef/auarf031.htm | 38 - .../ja_JP/html/CmdRef/auarf032.htm | 55 - .../ja_JP/html/CmdRef/auarf033.htm | 43 - .../ja_JP/html/CmdRef/auarf034.htm | 37 - .../ja_JP/html/CmdRef/auarf035.htm | 48 - .../ja_JP/html/CmdRef/auarf036.htm | 64 - .../ja_JP/html/CmdRef/auarf037.htm | 38 - .../ja_JP/html/CmdRef/auarf038.htm | 52 - .../ja_JP/html/CmdRef/auarf039.htm | 41 - .../ja_JP/html/CmdRef/auarf040.htm | 44 - .../ja_JP/html/CmdRef/auarf041.htm | 40 - .../ja_JP/html/CmdRef/auarf042.htm | 45 - .../ja_JP/html/CmdRef/auarf043.htm | 60 - .../ja_JP/html/CmdRef/auarf044.htm | 60 - .../ja_JP/html/CmdRef/auarf045.htm | 44 - .../ja_JP/html/CmdRef/auarf046.htm | 41 - .../ja_JP/html/CmdRef/auarf047.htm | 45 - .../ja_JP/html/CmdRef/auarf048.htm | 33 - .../ja_JP/html/CmdRef/auarf049.htm | 46 - .../ja_JP/html/CmdRef/auarf050.htm | 113 - .../ja_JP/html/CmdRef/auarf051.htm | 46 - .../ja_JP/html/CmdRef/auarf052.htm | 83 - .../ja_JP/html/CmdRef/auarf053.htm | 451 - .../ja_JP/html/CmdRef/auarf054.htm | 233 - .../ja_JP/html/CmdRef/auarf055.htm | 484 - .../ja_JP/html/CmdRef/auarf056.htm | 26 - .../ja_JP/html/CmdRef/auarf057.htm | 319 - .../ja_JP/html/CmdRef/auarf058.htm | 278 - .../ja_JP/html/CmdRef/auarf059.htm | 186 - .../ja_JP/html/CmdRef/auarf060.htm | 200 - .../ja_JP/html/CmdRef/auarf061.htm | 129 - .../ja_JP/html/CmdRef/auarf062.htm | 87 - .../ja_JP/html/CmdRef/auarf063.htm | 140 - .../ja_JP/html/CmdRef/auarf064.htm | 78 - .../ja_JP/html/CmdRef/auarf065.htm | 65 - .../ja_JP/html/CmdRef/auarf066.htm | 93 - .../ja_JP/html/CmdRef/auarf067.htm | 69 - .../ja_JP/html/CmdRef/auarf068.htm | 133 - .../ja_JP/html/CmdRef/auarf069.htm | 71 - .../ja_JP/html/CmdRef/auarf070.htm | 80 - .../ja_JP/html/CmdRef/auarf071.htm | 72 - .../ja_JP/html/CmdRef/auarf072.htm | 158 - .../ja_JP/html/CmdRef/auarf073.htm | 261 - .../ja_JP/html/CmdRef/auarf074.htm | 256 - .../ja_JP/html/CmdRef/auarf075.htm | 75 - .../ja_JP/html/CmdRef/auarf076.htm | 83 - .../ja_JP/html/CmdRef/auarf077.htm | 147 - .../ja_JP/html/CmdRef/auarf078.htm | 89 - .../ja_JP/html/CmdRef/auarf079.htm | 148 - .../ja_JP/html/CmdRef/auarf080.htm | 114 - .../ja_JP/html/CmdRef/auarf081.htm | 81 - .../ja_JP/html/CmdRef/auarf082.htm | 84 - .../ja_JP/html/CmdRef/auarf083.htm | 72 - .../ja_JP/html/CmdRef/auarf084.htm | 161 - .../ja_JP/html/CmdRef/auarf085.htm | 76 - .../ja_JP/html/CmdRef/auarf086.htm | 96 - .../ja_JP/html/CmdRef/auarf087.htm | 187 - .../ja_JP/html/CmdRef/auarf088.htm | 112 - .../ja_JP/html/CmdRef/auarf089.htm | 109 - .../ja_JP/html/CmdRef/auarf090.htm | 96 - .../ja_JP/html/CmdRef/auarf091.htm | 165 - .../ja_JP/html/CmdRef/auarf092.htm | 204 - .../ja_JP/html/CmdRef/auarf093.htm | 188 - .../ja_JP/html/CmdRef/auarf094.htm | 83 - .../ja_JP/html/CmdRef/auarf095.htm | 98 - .../ja_JP/html/CmdRef/auarf096.htm | 78 - .../ja_JP/html/CmdRef/auarf097.htm | 63 - .../ja_JP/html/CmdRef/auarf098.htm | 269 - .../ja_JP/html/CmdRef/auarf099.htm | 79 - .../ja_JP/html/CmdRef/auarf100.htm | 71 - .../ja_JP/html/CmdRef/auarf101.htm | 93 - .../ja_JP/html/CmdRef/auarf102.htm | 112 - .../ja_JP/html/CmdRef/auarf103.htm | 103 - .../ja_JP/html/CmdRef/auarf104.htm | 70 - .../ja_JP/html/CmdRef/auarf105.htm | 93 - .../ja_JP/html/CmdRef/auarf106.htm | 89 - .../ja_JP/html/CmdRef/auarf107.htm | 103 - .../ja_JP/html/CmdRef/auarf108.htm | 77 - .../ja_JP/html/CmdRef/auarf109.htm | 99 - .../ja_JP/html/CmdRef/auarf110.htm | 81 - .../ja_JP/html/CmdRef/auarf111.htm | 78 - .../ja_JP/html/CmdRef/auarf112.htm | 76 - .../ja_JP/html/CmdRef/auarf113.htm | 95 - .../ja_JP/html/CmdRef/auarf114.htm | 201 - .../ja_JP/html/CmdRef/auarf115.htm | 81 - .../ja_JP/html/CmdRef/auarf116.htm | 87 - .../ja_JP/html/CmdRef/auarf117.htm | 106 - .../ja_JP/html/CmdRef/auarf118.htm | 92 - .../ja_JP/html/CmdRef/auarf119.htm | 81 - .../ja_JP/html/CmdRef/auarf120.htm | 87 - .../ja_JP/html/CmdRef/auarf121.htm | 185 - .../ja_JP/html/CmdRef/auarf122.htm | 85 - .../ja_JP/html/CmdRef/auarf123.htm | 89 - .../ja_JP/html/CmdRef/auarf124.htm | 125 - .../ja_JP/html/CmdRef/auarf125.htm | 95 - .../ja_JP/html/CmdRef/auarf126.htm | 122 - .../ja_JP/html/CmdRef/auarf127.htm | 122 - .../ja_JP/html/CmdRef/auarf128.htm | 100 - .../ja_JP/html/CmdRef/auarf129.htm | 239 - .../ja_JP/html/CmdRef/auarf130.htm | 104 - .../ja_JP/html/CmdRef/auarf131.htm | 128 - .../ja_JP/html/CmdRef/auarf132.htm | 63 - .../ja_JP/html/CmdRef/auarf133.htm | 121 - .../ja_JP/html/CmdRef/auarf134.htm | 59 - .../ja_JP/html/CmdRef/auarf135.htm | 89 - .../ja_JP/html/CmdRef/auarf136.htm | 116 - .../ja_JP/html/CmdRef/auarf137.htm | 95 - .../ja_JP/html/CmdRef/auarf138.htm | 111 - .../ja_JP/html/CmdRef/auarf139.htm | 156 - .../ja_JP/html/CmdRef/auarf140.htm | 69 - .../ja_JP/html/CmdRef/auarf141.htm | 69 - .../ja_JP/html/CmdRef/auarf142.htm | 68 - .../ja_JP/html/CmdRef/auarf143.htm | 66 - .../ja_JP/html/CmdRef/auarf144.htm | 68 - .../ja_JP/html/CmdRef/auarf145.htm | 70 - .../ja_JP/html/CmdRef/auarf146.htm | 109 - .../ja_JP/html/CmdRef/auarf147.htm | 70 - .../ja_JP/html/CmdRef/auarf148.htm | 124 - .../ja_JP/html/CmdRef/auarf149.htm | 74 - .../ja_JP/html/CmdRef/auarf150.htm | 93 - .../ja_JP/html/CmdRef/auarf151.htm | 99 - .../ja_JP/html/CmdRef/auarf152.htm | 74 - .../ja_JP/html/CmdRef/auarf153.htm | 161 - .../ja_JP/html/CmdRef/auarf154.htm | 89 - .../ja_JP/html/CmdRef/auarf155.htm | 76 - .../ja_JP/html/CmdRef/auarf156.htm | 64 - .../ja_JP/html/CmdRef/auarf157.htm | 197 - .../ja_JP/html/CmdRef/auarf158.htm | 82 - .../ja_JP/html/CmdRef/auarf159.htm | 70 - .../ja_JP/html/CmdRef/auarf160.htm | 78 - .../ja_JP/html/CmdRef/auarf161.htm | 76 - .../ja_JP/html/CmdRef/auarf162.htm | 149 - .../ja_JP/html/CmdRef/auarf163.htm | 91 - .../ja_JP/html/CmdRef/auarf164.htm | 116 - .../ja_JP/html/CmdRef/auarf165.htm | 83 - .../ja_JP/html/CmdRef/auarf166.htm | 64 - .../ja_JP/html/CmdRef/auarf167.htm | 64 - .../ja_JP/html/CmdRef/auarf168.htm | 63 - .../ja_JP/html/CmdRef/auarf169.htm | 71 - .../ja_JP/html/CmdRef/auarf170.htm | 66 - .../ja_JP/html/CmdRef/auarf171.htm | 58 - .../ja_JP/html/CmdRef/auarf172.htm | 162 - .../ja_JP/html/CmdRef/auarf173.htm | 75 - .../ja_JP/html/CmdRef/auarf174.htm | 91 - .../ja_JP/html/CmdRef/auarf175.htm | 75 - .../ja_JP/html/CmdRef/auarf176.htm | 69 - .../ja_JP/html/CmdRef/auarf177.htm | 67 - .../ja_JP/html/CmdRef/auarf178.htm | 84 - .../ja_JP/html/CmdRef/auarf179.htm | 115 - .../ja_JP/html/CmdRef/auarf180.htm | 74 - .../ja_JP/html/CmdRef/auarf181.htm | 129 - .../ja_JP/html/CmdRef/auarf182.htm | 63 - .../ja_JP/html/CmdRef/auarf183.htm | 89 - .../ja_JP/html/CmdRef/auarf184.htm | 84 - .../ja_JP/html/CmdRef/auarf185.htm | 201 - .../ja_JP/html/CmdRef/auarf186.htm | 57 - .../ja_JP/html/CmdRef/auarf187.htm | 79 - .../ja_JP/html/CmdRef/auarf188.htm | 98 - .../ja_JP/html/CmdRef/auarf189.htm | 98 - .../ja_JP/html/CmdRef/auarf190.htm | 81 - .../ja_JP/html/CmdRef/auarf191.htm | 61 - .../ja_JP/html/CmdRef/auarf192.htm | 58 - .../ja_JP/html/CmdRef/auarf193.htm | 225 - .../ja_JP/html/CmdRef/auarf194.htm | 125 - .../ja_JP/html/CmdRef/auarf195.htm | 100 - .../ja_JP/html/CmdRef/auarf196.htm | 80 - .../ja_JP/html/CmdRef/auarf197.htm | 80 - .../ja_JP/html/CmdRef/auarf198.htm | 110 - .../ja_JP/html/CmdRef/auarf199.htm | 96 - .../ja_JP/html/CmdRef/auarf200.htm | 214 - .../ja_JP/html/CmdRef/auarf201.htm | 140 - .../ja_JP/html/CmdRef/auarf202.htm | 130 - .../ja_JP/html/CmdRef/auarf203.htm | 78 - .../ja_JP/html/CmdRef/auarf204.htm | 118 - .../ja_JP/html/CmdRef/auarf205.htm | 67 - .../ja_JP/html/CmdRef/auarf206.htm | 75 - .../ja_JP/html/CmdRef/auarf207.htm | 55 - .../ja_JP/html/CmdRef/auarf208.htm | 95 - .../ja_JP/html/CmdRef/auarf209.htm | 72 - .../ja_JP/html/CmdRef/auarf210.htm | 111 - .../ja_JP/html/CmdRef/auarf211.htm | 102 - .../ja_JP/html/CmdRef/auarf212.htm | 66 - .../ja_JP/html/CmdRef/auarf213.htm | 81 - .../ja_JP/html/CmdRef/auarf214.htm | 166 - .../ja_JP/html/CmdRef/auarf215.htm | 144 - .../ja_JP/html/CmdRef/auarf216.htm | 87 - .../ja_JP/html/CmdRef/auarf217.htm | 206 - .../ja_JP/html/CmdRef/auarf218.htm | 73 - .../ja_JP/html/CmdRef/auarf219.htm | 98 - .../ja_JP/html/CmdRef/auarf220.htm | 79 - .../ja_JP/html/CmdRef/auarf221.htm | 108 - .../ja_JP/html/CmdRef/auarf222.htm | 120 - .../ja_JP/html/CmdRef/auarf223.htm | 96 - .../ja_JP/html/CmdRef/auarf224.htm | 84 - .../ja_JP/html/CmdRef/auarf225.htm | 153 - .../ja_JP/html/CmdRef/auarf226.htm | 81 - .../ja_JP/html/CmdRef/auarf227.htm | 87 - .../ja_JP/html/CmdRef/auarf228.htm | 95 - .../ja_JP/html/CmdRef/auarf229.htm | 88 - .../ja_JP/html/CmdRef/auarf230.htm | 90 - .../ja_JP/html/CmdRef/auarf231.htm | 137 - .../ja_JP/html/CmdRef/auarf232.htm | 162 - .../ja_JP/html/CmdRef/auarf233.htm | 187 - .../ja_JP/html/CmdRef/auarf234.htm | 60 - .../ja_JP/html/CmdRef/auarf235.htm | 102 - .../ja_JP/html/CmdRef/auarf236.htm | 52 - .../ja_JP/html/CmdRef/auarf237.htm | 234 - .../ja_JP/html/CmdRef/auarf238.htm | 67 - .../ja_JP/html/CmdRef/auarf239.htm | 72 - .../ja_JP/html/CmdRef/auarf240.htm | 100 - .../ja_JP/html/CmdRef/auarf241.htm | 84 - .../ja_JP/html/CmdRef/auarf242.htm | 84 - .../ja_JP/html/CmdRef/auarf243.htm | 211 - .../ja_JP/html/CmdRef/auarf244.htm | 63 - .../ja_JP/html/CmdRef/auarf245.htm | 100 - .../ja_JP/html/CmdRef/auarf246.htm | 97 - .../ja_JP/html/CmdRef/auarf247.htm | 73 - .../ja_JP/html/CmdRef/auarf248.htm | 70 - .../ja_JP/html/CmdRef/auarf249.htm | 80 - .../ja_JP/html/CmdRef/auarf250.htm | 81 - .../ja_JP/html/CmdRef/auarf251.htm | 79 - .../ja_JP/html/CmdRef/auarf252.htm | 171 - .../ja_JP/html/CmdRef/auarf253.htm | 81 - .../ja_JP/html/CmdRef/auarf254.htm | 64 - .../ja_JP/html/CmdRef/auarf255.htm | 82 - .../ja_JP/html/CmdRef/auarf256.htm | 179 - .../ja_JP/html/CmdRef/auarf257.htm | 90 - .../ja_JP/html/CmdRef/auarf258.htm | 114 - .../ja_JP/html/CmdRef/auarf259.htm | 112 - .../ja_JP/html/CmdRef/auarf260.htm | 115 - .../ja_JP/html/CmdRef/auarf261.htm | 246 - .../ja_JP/html/CmdRef/auarf262.htm | 69 - .../ja_JP/html/CmdRef/auarf263.htm | 82 - .../ja_JP/html/CmdRef/auarf264.htm | 78 - .../ja_JP/html/CmdRef/auarf265.htm | 171 - .../ja_JP/html/CmdRef/auarf266.htm | 220 - .../ja_JP/html/CmdRef/auarf267.htm | 75 - .../ja_JP/html/CmdRef/auarf268.htm | 122 - .../ja_JP/html/CmdRef/auarf269.htm | 82 - .../ja_JP/html/CmdRef/auarf270.htm | 122 - .../ja_JP/html/CmdRef/auarf271.htm | 113 - .../ja_JP/html/CmdRef/auarf272.htm | 83 - .../ja_JP/html/CmdRef/auarf273.htm | 83 - .../ja_JP/html/CmdRef/auarf274.htm | 124 - .../ja_JP/html/CmdRef/auarf275.htm | 101 - .../ja_JP/html/CmdRef/auarf276.htm | 79 - .../ja_JP/html/CmdRef/auarf277.htm | 89 - .../ja_JP/html/CmdRef/auarf278.htm | 73 - .../ja_JP/html/CmdRef/auarf279.htm | 95 - .../ja_JP/html/CmdRef/auarf280.htm | 92 - .../ja_JP/html/CmdRef/auarf281.htm | 54 - .../ja_JP/html/CmdRef/auarf282.htm | 79 - .../ja_JP/html/CmdRef/auarf283.htm | 78 - .../ja_JP/html/CmdRef/auarf284.htm | 5004 ---------- .../ja_JP/html/InstallGd/awqbg000.htm | 81 - .../ja_JP/html/InstallGd/awqbg002.htm | 67 - .../ja_JP/html/InstallGd/awqbg003.htm | 1194 --- .../ja_JP/html/InstallGd/awqbg004.htm | 316 - .../ja_JP/html/ReleaseNotes/awrns000.htm | 67 - .../ja_JP/html/ReleaseNotes/awrns002.htm | 135 - .../ja_JP/html/ReleaseNotes/awrns003.htm | 77 - .../ja_JP/html/ReleaseNotes/awrns004.htm | 172 - .../ja_JP/html/ReleaseNotes/awrns005.htm | 133 - .../ja_JP/html/ReleaseNotes/awrns006.htm | 145 - .../ja_JP/html/ReleaseNotes/awrns007.htm | 110 - .../ja_JP/html/SysAdminGd/auagd000.htm | 74 - .../ja_JP/html/SysAdminGd/auagd002.htm | 1008 -- .../ja_JP/html/SysAdminGd/auagd003.htm | 37 - .../ja_JP/html/SysAdminGd/auagd004.htm | 32 - .../ja_JP/html/SysAdminGd/auagd005.htm | 90 - .../ja_JP/html/SysAdminGd/auagd006.htm | 363 - .../ja_JP/html/SysAdminGd/auagd007.htm | 1168 --- .../ja_JP/html/SysAdminGd/auagd008.htm | 1865 ---- .../ja_JP/html/SysAdminGd/auagd009.htm | 946 -- .../ja_JP/html/SysAdminGd/auagd010.htm | 2578 ----- .../ja_JP/html/SysAdminGd/auagd011.htm | 1667 ---- .../ja_JP/html/SysAdminGd/auagd012.htm | 1737 ---- .../ja_JP/html/SysAdminGd/auagd013.htm | 1218 --- .../ja_JP/html/SysAdminGd/auagd014.htm | 601 -- .../ja_JP/html/SysAdminGd/auagd015.htm | 1402 --- .../ja_JP/html/SysAdminGd/auagd016.htm | 854 -- .../ja_JP/html/SysAdminGd/auagd017.htm | 1490 --- .../ja_JP/html/SysAdminGd/auagd018.htm | 1001 -- .../ja_JP/html/SysAdminGd/auagd019.htm | 1049 -- .../ja_JP/html/SysAdminGd/auagd020.htm | 659 -- .../ja_JP/html/SysAdminGd/auagd021.htm | 330 - .../ja_JP/html/SysAdminGd/auagd022.htm | 531 - .../ja_JP/html/SysAdminGd/auagd023.htm | 225 - .../ja_JP/html/SysAdminGd/auagd024.htm | 974 -- .../ja_JP/html/SysAdminGd/auagd025.htm | 1006 -- .../ja_JP/html/SysAdminGd/auagd026.htm | 7143 -------------- .../ja_JP/html/SysAdminGd/cachmgr.gif | Bin 17319 -> 0 bytes .../ja_JP/html/SysAdminGd/fserver1.gif | Bin 16683 -> 0 bytes .../ja_JP/html/SysAdminGd/fserver2.gif | Bin 16426 -> 0 bytes .../ja_JP/html/SysAdminGd/overview.gif | Bin 13389 -> 0 bytes .../ja_JP/html/SysAdminGd/scout1.gif | Bin 8455 -> 0 bytes .../ja_JP/html/SysAdminGd/scout2.gif | Bin 9022 -> 0 bytes .../ja_JP/html/SysAdminGd/scout3.gif | Bin 9949 -> 0 bytes .../ja_JP/html/SysAdminGd/scout4.gif | Bin 8800 -> 0 bytes .../ja_JP/html/SysAdminGd/vnode.gif | Bin 17760 -> 0 bytes .../Documentation/ja_JP/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/ja_JP/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/ja_JP/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/ja_JP/html/index.gif | Bin 241 -> 0 bytes .../Documentation/ja_JP/html/index.htm | 125 - .../install/Documentation/ja_JP/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/ja_JP/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/ja_JP/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/ja_JP/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/ko_KR/README.txt | 62 - .../ko_KR/html/InstallGd/awqbg000.htm | 45 - .../ko_KR/html/InstallGd/awqbg002.htm | 65 - .../ko_KR/html/InstallGd/awqbg003.htm | 1111 --- .../ko_KR/html/InstallGd/awqbg004.htm | 333 - .../ko_KR/html/ReleaseNotes/awrns000.htm | 43 - .../ko_KR/html/ReleaseNotes/awrns002.htm | 136 - .../ko_KR/html/ReleaseNotes/awrns003.htm | 90 - .../ko_KR/html/ReleaseNotes/awrns004.htm | 197 - .../ko_KR/html/ReleaseNotes/awrns005.htm | 159 - .../ko_KR/html/ReleaseNotes/awrns006.htm | 174 - .../ko_KR/html/ReleaseNotes/awrns007.htm | 127 - .../ko_KR/html/SysAdminGd/auagd000.htm | 49 - .../ko_KR/html/SysAdminGd/auagd002.htm | 1009 -- .../ko_KR/html/SysAdminGd/auagd003.htm | 38 - .../ko_KR/html/SysAdminGd/auagd004.htm | 33 - .../ko_KR/html/SysAdminGd/auagd005.htm | 126 - .../ko_KR/html/SysAdminGd/auagd006.htm | 729 -- .../ko_KR/html/SysAdminGd/auagd007.htm | 2236 ----- .../ko_KR/html/SysAdminGd/auagd008.htm | 2781 ------ .../ko_KR/html/SysAdminGd/auagd009.htm | 1457 --- .../ko_KR/html/SysAdminGd/auagd010.htm | 3738 -------- .../ko_KR/html/SysAdminGd/auagd011.htm | 2638 ----- .../ko_KR/html/SysAdminGd/auagd012.htm | 2872 ------ .../ko_KR/html/SysAdminGd/auagd013.htm | 1887 ---- .../ko_KR/html/SysAdminGd/auagd014.htm | 918 -- .../ko_KR/html/SysAdminGd/auagd015.htm | 2237 ----- .../ko_KR/html/SysAdminGd/auagd016.htm | 1132 --- .../ko_KR/html/SysAdminGd/auagd017.htm | 2587 ----- .../ko_KR/html/SysAdminGd/auagd018.htm | 1473 --- .../ko_KR/html/SysAdminGd/auagd019.htm | 1456 --- .../ko_KR/html/SysAdminGd/auagd020.htm | 990 -- .../ko_KR/html/SysAdminGd/auagd021.htm | 440 - .../ko_KR/html/SysAdminGd/auagd022.htm | 888 -- .../ko_KR/html/SysAdminGd/auagd023.htm | 348 - .../ko_KR/html/SysAdminGd/auagd024.htm | 982 -- .../ko_KR/html/SysAdminGd/auagd025.htm | 1038 -- .../ko_KR/html/SysAdminGd/auagd026.htm | 6377 ------------ .../ko_KR/html/SysAdminGd/cachmgr.gif | Bin 17319 -> 0 bytes .../ko_KR/html/SysAdminGd/fserver1.gif | Bin 16683 -> 0 bytes .../ko_KR/html/SysAdminGd/fserver2.gif | Bin 16426 -> 0 bytes .../ko_KR/html/SysAdminGd/overview.gif | Bin 13389 -> 0 bytes .../ko_KR/html/SysAdminGd/scout1.gif | Bin 8455 -> 0 bytes .../ko_KR/html/SysAdminGd/scout2.gif | Bin 9022 -> 0 bytes .../ko_KR/html/SysAdminGd/scout3.gif | Bin 9938 -> 0 bytes .../ko_KR/html/SysAdminGd/scout4.gif | Bin 8800 -> 0 bytes .../ko_KR/html/SysAdminGd/vnode.gif | Bin 7691 -> 0 bytes .../Documentation/ko_KR/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/ko_KR/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/ko_KR/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/ko_KR/html/index.gif | Bin 241 -> 0 bytes .../Documentation/ko_KR/html/index.htm | 124 - .../install/Documentation/ko_KR/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/ko_KR/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/ko_KR/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/ko_KR/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/pt_BR/README.txt | 62 - .../pt_BR/html/InstallGd/awqbg000.htm | 45 - .../pt_BR/html/InstallGd/awqbg002.htm | 64 - .../pt_BR/html/InstallGd/awqbg003.htm | 1264 --- .../pt_BR/html/InstallGd/awqbg004.htm | 344 - .../pt_BR/html/ReleaseNotes/awrns000.htm | 45 - .../pt_BR/html/ReleaseNotes/awrns002.htm | 135 - .../pt_BR/html/ReleaseNotes/awrns003.htm | 102 - .../pt_BR/html/ReleaseNotes/awrns004.htm | 247 - .../pt_BR/html/ReleaseNotes/awrns005.htm | 183 - .../pt_BR/html/ReleaseNotes/awrns006.htm | 220 - .../pt_BR/html/ReleaseNotes/awrns007.htm | 155 - .../Documentation/pt_BR/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/pt_BR/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/pt_BR/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/pt_BR/html/index.gif | Bin 241 -> 0 bytes .../Documentation/pt_BR/html/index.htm | 121 - .../install/Documentation/pt_BR/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/pt_BR/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/pt_BR/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/pt_BR/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/zh_CN/README.txt | 62 - .../zh_CN/html/InstallGd/awqbg000.htm | 37 - .../zh_CN/html/InstallGd/awqbg002.htm | 61 - .../zh_CN/html/InstallGd/awqbg003.htm | 889 -- .../zh_CN/html/InstallGd/awqbg004.htm | 311 - .../zh_CN/html/ReleaseNotes/awrns000.htm | 43 - .../zh_CN/html/ReleaseNotes/awrns002.htm | 135 - .../zh_CN/html/ReleaseNotes/awrns003.htm | 98 - .../zh_CN/html/ReleaseNotes/awrns004.htm | 238 - .../zh_CN/html/ReleaseNotes/awrns005.htm | 179 - .../zh_CN/html/ReleaseNotes/awrns006.htm | 209 - .../zh_CN/html/ReleaseNotes/awrns007.htm | 151 - .../Documentation/zh_CN/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/zh_CN/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/zh_CN/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/zh_CN/html/index.gif | Bin 241 -> 0 bytes .../Documentation/zh_CN/html/index.htm | 118 - .../install/Documentation/zh_CN/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/zh_CN/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/zh_CN/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/zh_CN/html/top.gif | Bin 268 -> 0 bytes .../install/Documentation/zh_TW/README.txt | 62 - .../zh_TW/html/InstallGd/awqbg000.htm | 42 - .../zh_TW/html/InstallGd/awqbg002.htm | 65 - .../zh_TW/html/InstallGd/awqbg003.htm | 918 -- .../zh_TW/html/InstallGd/awqbg004.htm | 294 - .../zh_TW/html/ReleaseNotes/awrns000.htm | 43 - .../zh_TW/html/ReleaseNotes/awrns002.htm | 136 - .../zh_TW/html/ReleaseNotes/awrns003.htm | 73 - .../zh_TW/html/ReleaseNotes/awrns004.htm | 177 - .../zh_TW/html/ReleaseNotes/awrns005.htm | 134 - .../zh_TW/html/ReleaseNotes/awrns006.htm | 161 - .../zh_TW/html/ReleaseNotes/awrns007.htm | 120 - .../Documentation/zh_TW/html/banner.gif | Bin 8323 -> 0 bytes .../Documentation/zh_TW/html/books.gif | Bin 332 -> 0 bytes .../install/Documentation/zh_TW/html/bot.gif | Bin 269 -> 0 bytes .../Documentation/zh_TW/html/index.gif | Bin 241 -> 0 bytes .../Documentation/zh_TW/html/index.htm | 117 - .../install/Documentation/zh_TW/html/next.gif | Bin 271 -> 0 bytes .../install/Documentation/zh_TW/html/prev.gif | Bin 273 -> 0 bytes .../install/Documentation/zh_TW/html/toc.gif | Bin 241 -> 0 bytes .../install/Documentation/zh_TW/html/top.gif | Bin 268 -> 0 bytes src/WINNT/eventlog/NTMakefile | 89 - src/WINNT/eventlog/lang/NTMakefile | 73 - src/WINNT/eventlog/lang/afseventmsg.rc | 22 - src/WINNT/eventlog/lang/de_DE/event.mc | 170 - src/WINNT/eventlog/lang/en_US/event.mc | 170 - src/WINNT/eventlog/lang/es_ES/event.mc | 178 - src/WINNT/eventlog/lang/ja_JP/event.mc | 171 - src/WINNT/eventlog/lang/ko_KR/event.mc | 175 - src/WINNT/eventlog/lang/pt_BR/event.mc | 170 - src/WINNT/eventlog/lang/zh_CN/event.mc | 172 - src/WINNT/eventlog/lang/zh_TW/event.mc | 172 - src/WINNT/eventlog/logevent.c | 136 - src/WINNT/eventlog/logevent.h | 24 - src/WINNT/eventlog/test/NTMakefile | 18 - src/WINNT/eventlog/test/elogtest.c | 92 - src/WINNT/install/InstallShield5/Build.tsb | 66 - .../install/InstallShield5/BuildSetup.bat | 37 - .../install/InstallShield5/CompileScript.bat | 37 - .../InstallShield5/CreateGeneratedFiles.bat | 20 - .../InstallShield5/CreateISDirTree.bat | 74 - src/WINNT/install/InstallShield5/Default.cdf | 2920 ------ src/WINNT/install/InstallShield5/Default.fdf | 1102 --- src/WINNT/install/InstallShield5/Default.fgl | 156 - .../install/InstallShield5/Default.shell | 154 - src/WINNT/install/InstallShield5/Default.shl | 454 - src/WINNT/install/InstallShield5/Default.txt | 269 - .../install/InstallShield5/DelISDirTree.bat | 162 - .../install/InstallShield5/GatherFiles.bat | 44 - .../install/InstallShield5/GenDefault.mda.bat | 66 - .../install/InstallShield5/GenFileGroups.bat | 1418 --- .../install/InstallShield5/GenIS5.ipr.bat | 67 - .../InstallShield5/HowToSetTheVersion.txt | 30 - src/WINNT/install/InstallShield5/NTMakefile | 78 - .../install/InstallShield5/PackageWeb.pfw | 267 - src/WINNT/install/InstallShield5/README.TXT | 94 - .../install/InstallShield5/ScatterFiles.bat | 47 - src/WINNT/install/InstallShield5/Setup.tsb | 131 - src/WINNT/install/InstallShield5/afsdcell.ini | 483 - .../InstallShield5/lang/de_DE/value.shl | 115 - .../InstallShield5/lang/en_US/value.txt | 119 - .../InstallShield5/lang/es_ES/value.shl | 114 - .../InstallShield5/lang/ja_JP/value.shl | 114 - .../InstallShield5/lang/ko_KR/value.shl | 114 - .../InstallShield5/lang/pt_BR/value.shl | 114 - .../InstallShield5/lang/zh_CN/value.shl | 114 - .../InstallShield5/lang/zh_TW/value.shl | 115 - src/WINNT/install/InstallShield5/setup.bmp | Bin 399222 -> 0 bytes src/WINNT/install/InstallShield5/setup.rul | 3578 ------- src/WINNT/install/NSIS/AFSCell.ini | 91 - src/WINNT/install/NSIS/AFSCreds.ini | 115 - src/WINNT/install/NSIS/AdminGroup.cpp | 134 - src/WINNT/install/NSIS/CellServDB | 534 -- src/WINNT/install/NSIS/CellServPage.ini | 59 - src/WINNT/install/NSIS/MakeCommon.bat | 12 - src/WINNT/install/NSIS/NTMakefile | 108 - src/WINNT/install/NSIS/OpenAFS.nsi | 3799 -------- src/WINNT/install/NSIS/Service.cpp | 63 - src/WINNT/install/NSIS/ServiceLib.nsh | 342 - src/WINNT/install/NSIS/killer.cpp | 380 - src/WINNT/install/Win9x/CellServDB | 534 -- src/WINNT/install/Win9x/NTMakeFile | 67 - src/WINNT/install/Win9x/RUNONCE.PIF | Bin 967 -> 0 bytes src/WINNT/install/Win9x/ReadMe.rtf | 88 - src/WINNT/install/Win9x/install.bat | 211 - src/WINNT/install/Win9x/license.txt | 6 - src/WINNT/install/Win9x/setup.iss | 22 - src/WINNT/install/Win9x/templet.reg | 52 - src/WINNT/install/loopback/NTMakefile | 59 - src/WINNT/install/loopback/instloop.c | 146 - src/WINNT/install/loopback/loopbackutils.cpp | 712 -- src/WINNT/install/loopback/loopbackutils.h | 74 - .../install/loopback/renameconnection.cpp | 121 - src/WINNT/install/loopback/wmi.cpp | 827 -- src/WINNT/install/wix/Binary/New.ico | Bin 318 -> 0 bytes src/WINNT/install/wix/Binary/Up.ico | Bin 318 -> 0 bytes src/WINNT/install/wix/Binary/bannrbmp.bmp | Bin 94556 -> 0 bytes src/WINNT/install/wix/Binary/completi.ico | Bin 2998 -> 0 bytes src/WINNT/install/wix/Binary/custicon.ico | Bin 2998 -> 0 bytes src/WINNT/install/wix/Binary/dlgbmp.bmp | Bin 474824 -> 0 bytes src/WINNT/install/wix/Binary/exclamic.ico | Bin 766 -> 0 bytes src/WINNT/install/wix/Binary/info.ico | Bin 1078 -> 0 bytes src/WINNT/install/wix/Binary/insticon.ico | Bin 2998 -> 0 bytes src/WINNT/install/wix/Binary/removico.ico | Bin 2998 -> 0 bytes src/WINNT/install/wix/Binary/repairic.ico | Bin 2998 -> 0 bytes src/WINNT/install/wix/CellServDB | 534 -- .../install/wix/Icon/ico_AcctManager.ico | Bin 1078 -> 0 bytes src/WINNT/install/wix/Icon/ico_Help.ico | Bin 766 -> 0 bytes .../install/wix/Icon/ico_ServerManager.ico | Bin 3311 -> 0 bytes src/WINNT/install/wix/Icon/ico_afscreds.ico | Bin 318 -> 0 bytes src/WINNT/install/wix/Icon/ico_afssvrcfg.ico | Bin 10134 -> 0 bytes src/WINNT/install/wix/NTMakefile | 73 - src/WINNT/install/wix/afsdesktop.ini | 3 - src/WINNT/install/wix/config.wxi | 168 - src/WINNT/install/wix/custom/NTMakefile | 37 - src/WINNT/install/wix/custom/afscustom.cpp | 486 - src/WINNT/install/wix/custom/afscustom.h | 89 - src/WINNT/install/wix/feature.wxi | 247 - src/WINNT/install/wix/files.wxi | 1306 --- .../install/wix/lang/de_DE/ActionText.wxi | 143 - src/WINNT/install/wix/lang/de_DE/Error.wxi | 319 - .../install/wix/lang/en_US/ActionText.wxi | 137 - src/WINNT/install/wix/lang/en_US/Error.wxi | 263 - src/WINNT/install/wix/lang/en_US/strings.wxl | 58 - src/WINNT/install/wix/lang/en_US/ui.wxi | 1087 --- .../install/wix/lang/es_ES/ActionText.wxi | 143 - src/WINNT/install/wix/lang/es_ES/Error.wxi | 319 - .../install/wix/lang/ja_JP/ActionText.wxi | 143 - src/WINNT/install/wix/lang/ja_JP/Error.wxi | 319 - .../install/wix/lang/ko_KR/ActionText.wxi | 143 - src/WINNT/install/wix/lang/ko_KR/Error.wxi | 319 - .../install/wix/lang/pt_BR/ActionText.wxi | 143 - src/WINNT/install/wix/lang/pt_BR/Error.wxi | 319 - .../install/wix/lang/zh_CN/ActionText.wxi | 143 - src/WINNT/install/wix/lang/zh_CN/Error.wxi | 319 - .../install/wix/lang/zh_TW/ActionText.wxi | 143 - src/WINNT/install/wix/lang/zh_TW/Error.wxi | 319 - src/WINNT/install/wix/language_config.wxi | 47 - src/WINNT/install/wix/openafs.wxs | 231 - src/WINNT/install/wix/property.wxi | 127 - src/WINNT/install/wix/registry.wxi | 208 - src/WINNT/install/wix/replace_afs.cmd | 59 - src/WINNT/install/wix/runtime.wxi | 42 - src/WINNT/install/wix/runtime_debug.wxi | 38 - src/WINNT/kfw/inc/kclient/kclient.h | 48 - src/WINNT/kfw/inc/kclient/kcmacerr.h | 68 - src/WINNT/kfw/inc/krb4/com_err.h | 56 - src/WINNT/kfw/inc/krb4/conf-pc.h | 108 - src/WINNT/kfw/inc/krb4/conf.h | 74 - src/WINNT/kfw/inc/krb4/des.h | 115 - src/WINNT/kfw/inc/krb4/kadm_err.h | 56 - src/WINNT/kfw/inc/krb4/krb.h | 458 - src/WINNT/kfw/inc/krb4/krberr.h | 22 - src/WINNT/kfw/inc/krb4/mit_copy.h | 20 - src/WINNT/kfw/inc/krb4/osconf.h | 59 - src/WINNT/kfw/inc/krb5/KerberosIV/des.h | 209 - src/WINNT/kfw/inc/krb5/KerberosIV/kadm_err.h | 58 - src/WINNT/kfw/inc/krb5/KerberosIV/krb.h | 794 -- src/WINNT/kfw/inc/krb5/KerberosIV/krb_err.h | 278 - .../kfw/inc/krb5/KerberosIV/mit-copyright.h | 23 - src/WINNT/kfw/inc/krb5/com_err.h | 72 - src/WINNT/kfw/inc/krb5/gssapi/gssapi.h | 805 -- .../kfw/inc/krb5/gssapi/gssapi_generic.h | 55 - src/WINNT/kfw/inc/krb5/gssapi/gssapi_krb5.h | 114 - src/WINNT/kfw/inc/krb5/krb5.h | 3063 ------ src/WINNT/kfw/inc/krb5/profile.h | 179 - src/WINNT/kfw/inc/krb5/win-mac.h | 176 - src/WINNT/kfw/inc/krbcc/cacheapi.h | 458 - src/WINNT/kfw/inc/leash/leasherr.h | 32 - src/WINNT/kfw/inc/leash/leashinfo.h | 2 - src/WINNT/kfw/inc/leash/leashwin.h | 140 - src/WINNT/kfw/inc/loadfuncs/loadfuncs-afs.h | 51 - src/WINNT/kfw/inc/loadfuncs/loadfuncs-afs36.h | 51 - .../kfw/inc/loadfuncs/loadfuncs-com_err.h | 40 - src/WINNT/kfw/inc/loadfuncs/loadfuncs-krb.h | 317 - src/WINNT/kfw/inc/loadfuncs/loadfuncs-krb5.h | 1745 ---- .../kfw/inc/loadfuncs/loadfuncs-krb524.h | 23 - src/WINNT/kfw/inc/loadfuncs/loadfuncs-leash.h | 409 - src/WINNT/kfw/inc/loadfuncs/loadfuncs-lsa.h | 45 - .../kfw/inc/loadfuncs/loadfuncs-profile.h | 147 - .../kfw/inc/loadfuncs/loadfuncs-wshelper.h | 232 - src/WINNT/kfw/inc/loadfuncs/loadfuncs.c | 88 - src/WINNT/kfw/inc/loadfuncs/loadfuncs.h | 41 - src/WINNT/kfw/inc/wshelper/arpa/nameser.h | 263 - src/WINNT/kfw/inc/wshelper/hesiod.h | 125 - src/WINNT/kfw/inc/wshelper/mitwhich.h | 156 - src/WINNT/kfw/inc/wshelper/resolv.h | 201 - src/WINNT/kfw/inc/wshelper/wshelper.h | 58 - src/WINNT/kfw/lib/i386/comerr32.lib | Bin 2560 -> 0 bytes src/WINNT/kfw/lib/i386/delaydlls.lib | Bin 13306 -> 0 bytes src/WINNT/kfw/lib/i386/getopt.lib | Bin 5932 -> 0 bytes src/WINNT/kfw/lib/i386/gssapi32.lib | Bin 13558 -> 0 bytes src/WINNT/kfw/lib/i386/kclnt32.lib | Bin 4570 -> 0 bytes src/WINNT/kfw/lib/i386/krb524.lib | Bin 1976 -> 0 bytes src/WINNT/kfw/lib/i386/krb5_32.lib | Bin 62630 -> 0 bytes src/WINNT/kfw/lib/i386/krbcc32.lib | Bin 6844 -> 0 bytes src/WINNT/kfw/lib/i386/krbv4w32.lib | Bin 19668 -> 0 bytes src/WINNT/kfw/lib/i386/leashw32.lib | Bin 21952 -> 0 bytes src/WINNT/kfw/lib/i386/loadfuncs.lib | Bin 1646 -> 0 bytes src/WINNT/kfw/lib/i386/wshelp32.lib | Bin 6982 -> 0 bytes src/WINNT/kfw/lib/i386/xpprof32.lib | Bin 6114 -> 0 bytes src/WINNT/license/NTMakefile | 43 - src/WINNT/license/lang/NTMakefile | 31 - src/WINNT/license/lang/de_DE.ide | Bin 5008 -> 0 bytes src/WINNT/license/lang/en_US.ide | Bin 604 -> 0 bytes src/WINNT/license/lang/es_ES.ide | Bin 4964 -> 0 bytes src/WINNT/license/lang/ja_JP.ide | Bin 2940 -> 0 bytes src/WINNT/license/lang/ko_KR.ide | Bin 2914 -> 0 bytes src/WINNT/license/lang/pt_BR.ide | Bin 5182 -> 0 bytes src/WINNT/license/lang/readme.txt | 11 - src/WINNT/license/lang/zh_CN.ide | Bin 2132 -> 0 bytes src/WINNT/license/lang/zh_TW.ide | Bin 2196 -> 0 bytes src/WINNT/license/main.cpp | 322 - src/WINNT/license/multistring.cpp | 193 - src/WINNT/license/multistring.h | 37 - src/WINNT/pthread/NTMakefile | 61 - src/WINNT/pthread/pthread.c | 1259 --- src/WINNT/pthread/pthread.def | 27 - src/WINNT/pthread/pthread.h | 87 - src/WINNT/pthread/pthread.rc | 18 - src/WINNT/pthread/pthread95.rc | 18 - src/WINNT/pthread/test/NTMakefile | 27 - src/WINNT/pthread/test/native.cpp | 400 - src/WINNT/pthread/test/ptest.c | 196 - src/WINNT/pthread/test/tsd.c | 57 - src/WINNT/talocale/NTMakefile | 48 - src/WINNT/talocale/tal_alloc.cpp | 1553 --- src/WINNT/talocale/tal_alloc.h | 143 - src/WINNT/talocale/tal_dialog.cpp | 194 - src/WINNT/talocale/tal_dialog.h | 43 - src/WINNT/talocale/tal_main.cpp | 772 -- src/WINNT/talocale/tal_string.cpp | 1674 ---- src/WINNT/talocale/tal_string.h | 110 - src/WINNT/talocale/talocale.h | 187 - src/WINNT/win9xpanel/CAfs.cpp | 537 -- src/WINNT/win9xpanel/CRegkey.cpp | 170 - src/WINNT/win9xpanel/CRegkey.h | 31 - src/WINNT/win9xpanel/CellServDB | 534 -- src/WINNT/win9xpanel/Change.cpp | 186 - src/WINNT/win9xpanel/Change.h | 68 - src/WINNT/win9xpanel/CommandSettings.cpp | 99 - src/WINNT/win9xpanel/CommandSettings.h | 63 - src/WINNT/win9xpanel/Datalog.cpp | 128 - src/WINNT/win9xpanel/Datalog.h | 59 - src/WINNT/win9xpanel/Encript.cpp | 158 - src/WINNT/win9xpanel/Force.cpp | 50 - src/WINNT/win9xpanel/Force.h | 53 - src/WINNT/win9xpanel/Help/Advanced.mrb | Bin 16896 -> 0 bytes src/WINNT/win9xpanel/Help/PROGRESS.MRB | Bin 5266 -> 0 bytes src/WINNT/win9xpanel/Help/PROPER.MRB | Bin 7210 -> 0 bytes src/WINNT/win9xpanel/Help/afswin9x.cnt | 33 - src/WINNT/win9xpanel/Help/afswin9x.hpj | 43 - src/WINNT/win9xpanel/Help/afswin9x.rtf | 789 -- src/WINNT/win9xpanel/Help/icon.bmp | Bin 1126 -> 0 bytes src/WINNT/win9xpanel/MyFrame.cpp | 207 - src/WINNT/win9xpanel/MyFrame.h | 76 - src/WINNT/win9xpanel/NTMakefile | 340 - src/WINNT/win9xpanel/ProgBarDlg.cpp | 595 -- src/WINNT/win9xpanel/ProgBarDlg.h | 101 - src/WINNT/win9xpanel/Retry.cpp | 78 - src/WINNT/win9xpanel/Retry.h | 57 - src/WINNT/win9xpanel/Settings.cpp | 64 - src/WINNT/win9xpanel/Settings.h | 54 - src/WINNT/win9xpanel/StdAfx.cpp | 15 - src/WINNT/win9xpanel/StdAfx.h | 42 - src/WINNT/win9xpanel/TermWarn.cpp | 67 - src/WINNT/win9xpanel/TermWarn.h | 56 - src/WINNT/win9xpanel/Transbmp.cpp | 189 - src/WINNT/win9xpanel/Transbmp.h | 33 - src/WINNT/win9xpanel/TrayIcon.cpp | 300 - src/WINNT/win9xpanel/TrayIcon.h | 116 - src/WINNT/win9xpanel/Wait.cpp | 51 - src/WINNT/win9xpanel/Wait.h | 58 - src/WINNT/win9xpanel/WinAfsLoad.cpp | 445 - src/WINNT/win9xpanel/WinAfsLoad.dep | 192 - src/WINNT/win9xpanel/WinAfsLoad.h | 101 - src/WINNT/win9xpanel/WinAfsLoad.rc | 542 -- src/WINNT/win9xpanel/WinAfsLoadDlg.cpp | 2126 ---- src/WINNT/win9xpanel/WinAfsLoadDlg.h | 169 - src/WINNT/win9xpanel/api95.cpp | 56 - src/WINNT/win9xpanel/api95.h | 10 - src/WINNT/win9xpanel/cafs.h | 77 - src/WINNT/win9xpanel/encript.h | 43 - src/WINNT/win9xpanel/modver.cpp | 70 - src/WINNT/win9xpanel/modver.h | 29 - src/WINNT/win9xpanel/res/WinAfsLoad.ico | Bin 4534 -> 0 bytes src/WINNT/win9xpanel/res/world.bmp | Bin 22630 -> 0 bytes src/WINNT/win9xpanel/resource.h | 102 - src/WINNT/win9xpanel/share.h | 33 - src/packaging/MacOS/2.0.txt | 367 - src/packaging/MacOS/CellServDB | 534 -- src/packaging/MacOS/CellServDB.list | 14 - src/packaging/MacOS/License.rtf | 249 - src/packaging/MacOS/Makefile | 33 - src/packaging/MacOS/OpenAFS.Description.plist | 14 - src/packaging/MacOS/OpenAFS.Info.plist | 40 - src/packaging/MacOS/OpenAFS.info | 16 - src/packaging/MacOS/OpenAFS.post_install | 89 - src/packaging/MacOS/OpenAFS.pre_upgrade | 24 - src/packaging/MacOS/ReadMe.rtf | 13 - src/packaging/MacOS/afssettings.m | 171 - src/packaging/MacOS/buildpkg.sh | 167 - src/packaging/MacOS/csrvdbmerge.pl | 91 - src/packaging/MacOS/settings.plist | 14 - 2135 files changed, 128 insertions(+), 558049 deletions(-) delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.cpp delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.def delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.dep delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.h delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.rc delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/GetWebDllFun.h delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/Resource.h delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/StdAfx.h delete mode 100644 src/WINNT/afs_setup_utils/GetWebDll/ntmakefile delete mode 100644 src/WINNT/afs_setup_utils/NTMakefile delete mode 100644 src/WINNT/afs_setup_utils/_isuser/_IsUser.RC delete mode 100644 src/WINNT/afs_setup_utils/_isuser/_isuser.c delete mode 100644 src/WINNT/afs_setup_utils/_isuser/ntmakefile delete mode 100644 src/WINNT/afs_setup_utils/_isuser/resource.h delete mode 100644 src/WINNT/afs_setup_utils/afs_setup_utils.cpp delete mode 100644 src/WINNT/afs_setup_utils/afs_setup_utils_stub.rc delete mode 100644 src/WINNT/afs_setup_utils/afsrm.c delete mode 100644 src/WINNT/afs_setup_utils/animate_icon.cpp delete mode 100644 src/WINNT/afs_setup_utils/animate_icon.h delete mode 100644 src/WINNT/afs_setup_utils/cc_uninst.def delete mode 100644 src/WINNT/afs_setup_utils/client_uninst.def delete mode 100644 src/WINNT/afs_setup_utils/docs_uninst.def delete mode 100644 src/WINNT/afs_setup_utils/forceremove.c delete mode 100644 src/WINNT/afs_setup_utils/forceremove.h delete mode 100644 src/WINNT/afs_setup_utils/install_utils.def delete mode 100644 src/WINNT/afs_setup_utils/lang/NTMakefile delete mode 100644 src/WINNT/afs_setup_utils/lang/de_DE/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/en_US/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/es_ES/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/ja_JP/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/ko_KR/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/pt_BR/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/zh_CN/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/lang/zh_TW/afs_setup_utils.rc delete mode 100644 src/WINNT/afs_setup_utils/light_client_uninst.def delete mode 100644 src/WINNT/afs_setup_utils/progress_dlg.cpp delete mode 100644 src/WINNT/afs_setup_utils/progress_dlg.h delete mode 100644 src/WINNT/afs_setup_utils/resource.h delete mode 100644 src/WINNT/afs_setup_utils/server_uninst.def delete mode 100644 src/WINNT/afs_setup_utils/sutil.c delete mode 100644 src/WINNT/afs_setup_utils/sutil.h delete mode 100644 src/WINNT/afsadmsvr/.cvsignore delete mode 100644 src/WINNT/afsadmsvr/ITaAfsAdmSvr.idl delete mode 100644 src/WINNT/afsadmsvr/ITaAfsAdmSvrTypes.idl delete mode 100644 src/WINNT/afsadmsvr/NTMakefile delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvr.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvr.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrCell.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClient.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClient.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientCell.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientGroup.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrClientUser.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrGroup.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrInternal.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrMain.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.cpp delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.h delete mode 100644 src/WINNT/afsadmsvr/TaAfsAdmSvrUser.cpp delete mode 100644 src/WINNT/afsadmsvr/afsadmsvr.ico delete mode 100644 src/WINNT/afsadmsvr/afsadmsvr.rc delete mode 100644 src/WINNT/afsadmsvr/resource.h delete mode 100644 src/WINNT/afsapplib/.cvsignore delete mode 100644 src/WINNT/afsapplib/NTMakefile delete mode 100644 src/WINNT/afsapplib/TaAfsAppLib.def delete mode 100644 src/WINNT/afsapplib/afsapplib.cpp delete mode 100644 src/WINNT/afsapplib/afsapplib.h delete mode 100644 src/WINNT/afsapplib/afsapplib_stub.rc delete mode 100644 src/WINNT/afsapplib/al_admsvr.cpp delete mode 100644 src/WINNT/afsapplib/al_admsvr.h delete mode 100644 src/WINNT/afsapplib/al_browse.cpp delete mode 100644 src/WINNT/afsapplib/al_browseset.cpp delete mode 100644 src/WINNT/afsapplib/al_cover.cpp delete mode 100644 src/WINNT/afsapplib/al_creds.cpp delete mode 100644 src/WINNT/afsapplib/al_dynlink.cpp delete mode 100644 src/WINNT/afsapplib/al_dynlink.h delete mode 100644 src/WINNT/afsapplib/al_error.cpp delete mode 100644 src/WINNT/afsapplib/al_help.cpp delete mode 100644 src/WINNT/afsapplib/al_messages.h delete mode 100644 src/WINNT/afsapplib/al_misc.cpp delete mode 100644 src/WINNT/afsapplib/al_progress.cpp delete mode 100644 src/WINNT/afsapplib/al_progress.h delete mode 100644 src/WINNT/afsapplib/al_pump.cpp delete mode 100644 src/WINNT/afsapplib/al_resource.h delete mode 100644 src/WINNT/afsapplib/al_task.cpp delete mode 100644 src/WINNT/afsapplib/al_wizard.cpp delete mode 100644 src/WINNT/afsapplib/al_wizard.h delete mode 100644 src/WINNT/afsapplib/checklist.cpp delete mode 100644 src/WINNT/afsapplib/checklist.h delete mode 100644 src/WINNT/afsapplib/ctl_date.cpp delete mode 100644 src/WINNT/afsapplib/ctl_date.h delete mode 100644 src/WINNT/afsapplib/ctl_elapsed.cpp delete mode 100644 src/WINNT/afsapplib/ctl_elapsed.h delete mode 100644 src/WINNT/afsapplib/ctl_sockaddr.cpp delete mode 100644 src/WINNT/afsapplib/ctl_sockaddr.h delete mode 100644 src/WINNT/afsapplib/ctl_spinner.cpp delete mode 100644 src/WINNT/afsapplib/ctl_spinner.h delete mode 100644 src/WINNT/afsapplib/ctl_time.cpp delete mode 100644 src/WINNT/afsapplib/ctl_time.h delete mode 100644 src/WINNT/afsapplib/dialog.cpp delete mode 100644 src/WINNT/afsapplib/dialog.h delete mode 100644 src/WINNT/afsapplib/fastlist.cpp delete mode 100644 src/WINNT/afsapplib/fastlist.h delete mode 100644 src/WINNT/afsapplib/hashlist.cpp delete mode 100644 src/WINNT/afsapplib/hashlist.h delete mode 100644 src/WINNT/afsapplib/lang/NTMakefile delete mode 100644 src/WINNT/afsapplib/lang/de_DE/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/en_US/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/es_ES/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/ja_JP/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/ko_KR/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/pt_BR/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/zh_CN/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/lang/zh_TW/afsapplib.rc delete mode 100644 src/WINNT/afsapplib/regexp.cpp delete mode 100644 src/WINNT/afsapplib/regexp.h delete mode 100644 src/WINNT/afsapplib/resize.cpp delete mode 100644 src/WINNT/afsapplib/resize.h delete mode 100644 src/WINNT/afsapplib/resource/CELL.ICO delete mode 100644 src/WINNT/afsapplib/resource/acl.ico delete mode 100644 src/WINNT/afsapplib/resource/aggreg.ico delete mode 100644 src/WINNT/afsapplib/resource/aggreg1.ico delete mode 100644 src/WINNT/afsapplib/resource/any_other.bmp delete mode 100644 src/WINNT/afsapplib/resource/bos.ico delete mode 100644 src/WINNT/afsapplib/resource/error.ico delete mode 100644 src/WINNT/afsapplib/resource/fileset.ico delete mode 100644 src/WINNT/afsapplib/resource/fileset1.ico delete mode 100644 src/WINNT/afsapplib/resource/foreign_group.bmp delete mode 100644 src/WINNT/afsapplib/resource/foreign_other.bmp delete mode 100644 src/WINNT/afsapplib/resource/foreign_user.bmp delete mode 100644 src/WINNT/afsapplib/resource/group.ico delete mode 100644 src/WINNT/afsapplib/resource/ic.ico delete mode 100644 src/WINNT/afsapplib/resource/io.ico delete mode 100644 src/WINNT/afsapplib/resource/key.ico delete mode 100644 src/WINNT/afsapplib/resource/local_group.bmp delete mode 100644 src/WINNT/afsapplib/resource/local_other.bmp delete mode 100644 src/WINNT/afsapplib/resource/local_user.bmp delete mode 100644 src/WINNT/afsapplib/resource/locked.ico delete mode 100644 src/WINNT/afsapplib/resource/mask_obj.bmp delete mode 100644 src/WINNT/afsapplib/resource/multiple.ico delete mode 100644 src/WINNT/afsapplib/resource/server.ico delete mode 100644 src/WINNT/afsapplib/resource/server1.ico delete mode 100644 src/WINNT/afsapplib/resource/server_u.ico delete mode 100644 src/WINNT/afsapplib/resource/service.ico delete mode 100644 src/WINNT/afsapplib/resource/service1.ico delete mode 100644 src/WINNT/afsapplib/resource/service2.ico delete mode 100644 src/WINNT/afsapplib/resource/spin1.ico delete mode 100644 src/WINNT/afsapplib/resource/spin2.ico delete mode 100644 src/WINNT/afsapplib/resource/spin3.ico delete mode 100644 src/WINNT/afsapplib/resource/spin4.ico delete mode 100644 src/WINNT/afsapplib/resource/spin5.ico delete mode 100644 src/WINNT/afsapplib/resource/spin6.ico delete mode 100644 src/WINNT/afsapplib/resource/spin7.ico delete mode 100644 src/WINNT/afsapplib/resource/spin8.ico delete mode 100644 src/WINNT/afsapplib/resource/spinstop.ico delete mode 100644 src/WINNT/afsapplib/resource/unauthenticated.bmp delete mode 100644 src/WINNT/afsapplib/resource/user.ico delete mode 100644 src/WINNT/afsapplib/resource/warning.ico delete mode 100644 src/WINNT/afsapplib/settings.cpp delete mode 100644 src/WINNT/afsapplib/settings.h delete mode 100644 src/WINNT/afsapplib/subclass.cpp delete mode 100644 src/WINNT/afsapplib/subclass.h delete mode 100644 src/WINNT/afsapplib/test/16color.bmp delete mode 100644 src/WINNT/afsapplib/test/256color.bmp delete mode 100644 src/WINNT/afsapplib/test/NTMakefile delete mode 100644 src/WINNT/afsapplib/test/resource.h delete mode 100644 src/WINNT/afsapplib/test/wiztest.cpp delete mode 100644 src/WINNT/afsapplib/test/wiztest.rc delete mode 100644 src/WINNT/afsclass/NTMakefile delete mode 100644 src/WINNT/afsclass/afsclass.h delete mode 100644 src/WINNT/afsclass/afsclassfn.cpp delete mode 100644 src/WINNT/afsclass/afsclassfn.h delete mode 100644 src/WINNT/afsclass/c_agg.cpp delete mode 100644 src/WINNT/afsclass/c_agg.h delete mode 100644 src/WINNT/afsclass/c_cell.cpp delete mode 100644 src/WINNT/afsclass/c_cell.h delete mode 100644 src/WINNT/afsclass/c_debug.cpp delete mode 100644 src/WINNT/afsclass/c_debug.h delete mode 100644 src/WINNT/afsclass/c_grp.cpp delete mode 100644 src/WINNT/afsclass/c_grp.h delete mode 100644 src/WINNT/afsclass/c_ident.cpp delete mode 100644 src/WINNT/afsclass/c_ident.h delete mode 100644 src/WINNT/afsclass/c_identlist.cpp delete mode 100644 src/WINNT/afsclass/c_identlist.h delete mode 100644 src/WINNT/afsclass/c_notify.cpp delete mode 100644 src/WINNT/afsclass/c_notify.h delete mode 100644 src/WINNT/afsclass/c_set.cpp delete mode 100644 src/WINNT/afsclass/c_set.h delete mode 100644 src/WINNT/afsclass/c_svc.cpp delete mode 100644 src/WINNT/afsclass/c_svc.h delete mode 100644 src/WINNT/afsclass/c_svr.cpp delete mode 100644 src/WINNT/afsclass/c_svr.h delete mode 100644 src/WINNT/afsclass/c_usr.cpp delete mode 100644 src/WINNT/afsclass/c_usr.h delete mode 100644 src/WINNT/afsclass/internal.cpp delete mode 100644 src/WINNT/afsclass/internal.h delete mode 100644 src/WINNT/afsclass/worker.cpp delete mode 100644 src/WINNT/afsclass/worker.h delete mode 100644 src/WINNT/afsd/Makefile.djgpp delete mode 100644 src/WINNT/afsd/NTMakefile delete mode 100644 src/WINNT/afsd/afsd.c delete mode 100644 src/WINNT/afsd/afsd.h delete mode 100644 src/WINNT/afsd/afsd.ico delete mode 100644 src/WINNT/afsd/afsd.rc delete mode 100644 src/WINNT/afsd/afsd95.c delete mode 100644 src/WINNT/afsd/afsd_eventlog.c delete mode 100644 src/WINNT/afsd/afsd_eventlog.h delete mode 100644 src/WINNT/afsd/afsd_eventmessages.mc delete mode 100644 src/WINNT/afsd/afsd_eventmessages.rc delete mode 100644 src/WINNT/afsd/afsd_flushvol.c delete mode 100644 src/WINNT/afsd/afsd_flushvol.h delete mode 100644 src/WINNT/afsd/afsd_init.c delete mode 100644 src/WINNT/afsd/afsd_init.h delete mode 100644 src/WINNT/afsd/afsd_init95.c delete mode 100644 src/WINNT/afsd/afsd_service.c delete mode 100644 src/WINNT/afsd/afsd_service.rc delete mode 100644 src/WINNT/afsd/afsdacl.c delete mode 100644 src/WINNT/afsd/afsdacl.rc delete mode 100644 src/WINNT/afsd/afsdicon.h delete mode 100644 src/WINNT/afsd/afsicf.cpp delete mode 100644 src/WINNT/afsd/afsicf.h delete mode 100644 src/WINNT/afsd/afskfw-int.h delete mode 100644 src/WINNT/afsd/afskfw.c delete mode 100644 src/WINNT/afsd/afskfw.h delete mode 100644 src/WINNT/afsd/afslog95.c delete mode 100644 src/WINNT/afsd/afslog95.def delete mode 100644 src/WINNT/afsd/afslog95.rc delete mode 100644 src/WINNT/afsd/afslogon.c delete mode 100644 src/WINNT/afsd/afslogon.def delete mode 100644 src/WINNT/afsd/afslogon.h delete mode 100644 src/WINNT/afsd/afslogon.rc delete mode 100644 src/WINNT/afsd/afsmsg95.c delete mode 100644 src/WINNT/afsd/afsmsg95.h delete mode 100644 src/WINNT/afsd/afsrpc.idl delete mode 100644 src/WINNT/afsd/afsrpc95.h delete mode 100644 src/WINNT/afsd/afsshare.c delete mode 100644 src/WINNT/afsd/afsshare.rc delete mode 100644 src/WINNT/afsd/cklog.c delete mode 100644 src/WINNT/afsd/cm.h delete mode 100644 src/WINNT/afsd/cm_access.c delete mode 100644 src/WINNT/afsd/cm_access.h delete mode 100644 src/WINNT/afsd/cm_aclent.c delete mode 100644 src/WINNT/afsd/cm_aclent.h delete mode 100644 src/WINNT/afsd/cm_buf.c delete mode 100644 src/WINNT/afsd/cm_buf.h delete mode 100644 src/WINNT/afsd/cm_callback.c delete mode 100644 src/WINNT/afsd/cm_callback.h delete mode 100644 src/WINNT/afsd/cm_cell.c delete mode 100644 src/WINNT/afsd/cm_cell.h delete mode 100644 src/WINNT/afsd/cm_config.c delete mode 100644 src/WINNT/afsd/cm_config.h delete mode 100644 src/WINNT/afsd/cm_conn.c delete mode 100644 src/WINNT/afsd/cm_conn.h delete mode 100644 src/WINNT/afsd/cm_daemon.c delete mode 100644 src/WINNT/afsd/cm_daemon.h delete mode 100644 src/WINNT/afsd/cm_dcache.c delete mode 100644 src/WINNT/afsd/cm_dcache.h delete mode 100644 src/WINNT/afsd/cm_dir.c delete mode 100644 src/WINNT/afsd/cm_dir.h delete mode 100644 src/WINNT/afsd/cm_diskcache95.c delete mode 100644 src/WINNT/afsd/cm_diskcache95.h delete mode 100644 src/WINNT/afsd/cm_dnlc.c delete mode 100644 src/WINNT/afsd/cm_dnlc.h delete mode 100644 src/WINNT/afsd/cm_dns.c delete mode 100644 src/WINNT/afsd/cm_dns.h delete mode 100644 src/WINNT/afsd/cm_dns_private.h delete mode 100644 src/WINNT/afsd/cm_freelance.c delete mode 100644 src/WINNT/afsd/cm_freelance.h delete mode 100644 src/WINNT/afsd/cm_ioctl.c delete mode 100644 src/WINNT/afsd/cm_ioctl.h delete mode 100644 src/WINNT/afsd/cm_memmap.c delete mode 100644 src/WINNT/afsd/cm_memmap.h delete mode 100644 src/WINNT/afsd/cm_rpc.c delete mode 100644 src/WINNT/afsd/cm_rpc.h delete mode 100644 src/WINNT/afsd/cm_rpc95.h delete mode 100644 src/WINNT/afsd/cm_scache.c delete mode 100644 src/WINNT/afsd/cm_scache.h delete mode 100644 src/WINNT/afsd/cm_server.c delete mode 100644 src/WINNT/afsd/cm_server.h delete mode 100644 src/WINNT/afsd/cm_user.c delete mode 100644 src/WINNT/afsd/cm_user.h delete mode 100644 src/WINNT/afsd/cm_utils.c delete mode 100644 src/WINNT/afsd/cm_utils.h delete mode 100644 src/WINNT/afsd/cm_vnodeops.c delete mode 100644 src/WINNT/afsd/cm_vnodeops.h delete mode 100644 src/WINNT/afsd/cm_volume.c delete mode 100644 src/WINNT/afsd/cm_volume.h delete mode 100644 src/WINNT/afsd/cmdebug.c delete mode 100644 src/WINNT/afsd/cmdebug.rc delete mode 100644 src/WINNT/afsd/ctokens.c delete mode 100644 src/WINNT/afsd/cunlog.c delete mode 100644 src/WINNT/afsd/dosdefs95.h delete mode 100644 src/WINNT/afsd/dosutils95.c delete mode 100644 src/WINNT/afsd/fs.c delete mode 100644 src/WINNT/afsd/fs.h delete mode 100644 src/WINNT/afsd/fs.rc delete mode 100644 src/WINNT/afsd/fs_utils.c delete mode 100644 src/WINNT/afsd/fs_utils.h delete mode 100644 src/WINNT/afsd/klog.rc delete mode 100644 src/WINNT/afsd/krb.h delete mode 100644 src/WINNT/afsd/krb_prot.h delete mode 100644 src/WINNT/afsd/lanahelper.cpp delete mode 100644 src/WINNT/afsd/lanahelper.h delete mode 100644 src/WINNT/afsd/largeint95.c delete mode 100644 src/WINNT/afsd/largeint95.h delete mode 100644 src/WINNT/afsd/largeintdotnet.c delete mode 100644 src/WINNT/afsd/libafsconf.def delete mode 100644 src/WINNT/afsd/libafsconf.rc delete mode 100644 src/WINNT/afsd/lock.txt delete mode 100644 src/WINNT/afsd/logon_ad.cpp delete mode 100644 src/WINNT/afsd/netbios95.c delete mode 100644 src/WINNT/afsd/netbios95.h delete mode 100644 src/WINNT/afsd/queue95.c delete mode 100644 src/WINNT/afsd/queue95.h delete mode 100644 src/WINNT/afsd/sample/token.c delete mode 100644 src/WINNT/afsd/smb.c delete mode 100644 src/WINNT/afsd/smb.h delete mode 100644 src/WINNT/afsd/smb3.c delete mode 100644 src/WINNT/afsd/smb3.h delete mode 100644 src/WINNT/afsd/smb_iocons.h delete mode 100644 src/WINNT/afsd/smb_ioctl.c delete mode 100644 src/WINNT/afsd/smb_ioctl.h delete mode 100644 src/WINNT/afsd/symlink.c delete mode 100644 src/WINNT/afsd/symlink.rc delete mode 100644 src/WINNT/afsd/tokens.rc delete mode 100644 src/WINNT/afsd/unlog.rc delete mode 100644 src/WINNT/afslegal/NTMakefile delete mode 100644 src/WINNT/afslegal/afslegal.cpp delete mode 100644 src/WINNT/afslegal/afslegal_stub.rc delete mode 100644 src/WINNT/afslegal/lang/NTMakefile delete mode 100644 src/WINNT/afslegal/lang/de_DE/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/en_US/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/es_ES/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/ja_JP/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/ko_KR/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/pt_BR/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/zh_CN/afslegal.rc delete mode 100644 src/WINNT/afslegal/lang/zh_TW/afslegal.rc delete mode 100644 src/WINNT/afslegal/resource.h delete mode 100644 src/WINNT/afsreg/NTMakefile delete mode 100644 src/WINNT/afsreg/afsreg.c delete mode 100644 src/WINNT/afsreg/afsreg.h delete mode 100644 src/WINNT/afsreg/afssw.c delete mode 100644 src/WINNT/afsreg/afssw.h delete mode 100644 src/WINNT/afsreg/syscfg.c delete mode 100644 src/WINNT/afsreg/syscfg.h delete mode 100644 src/WINNT/afsreg/test/NTMakefile delete mode 100644 src/WINNT/afsreg/test/dupkey.c delete mode 100644 src/WINNT/afsreg/test/getifinfo.c delete mode 100644 src/WINNT/afsreg/test/regman.c delete mode 100644 src/WINNT/afsreg/vptab.c delete mode 100644 src/WINNT/afsreg/vptab.h delete mode 100644 src/WINNT/afssvrcfg/.cvsignore delete mode 100644 src/WINNT/afssvrcfg/NTMakefile delete mode 100644 src/WINNT/afssvrcfg/admin_info_dlg.cpp delete mode 100644 src/WINNT/afssvrcfg/admin_info_dlg.h delete mode 100644 src/WINNT/afssvrcfg/afscfg.cpp delete mode 100644 src/WINNT/afssvrcfg/afscfg.h delete mode 100644 src/WINNT/afssvrcfg/afscfg_stub.rc delete mode 100644 src/WINNT/afssvrcfg/afsdrive.ico delete mode 100644 src/WINNT/afssvrcfg/app_icon.ico delete mode 100644 src/WINNT/afssvrcfg/backup_server_page.cpp delete mode 100644 src/WINNT/afssvrcfg/cfg_utils.cpp delete mode 100644 src/WINNT/afssvrcfg/cfg_utils.h delete mode 100644 src/WINNT/afssvrcfg/char_conv.cpp delete mode 100644 src/WINNT/afssvrcfg/char_conv.h delete mode 100644 src/WINNT/afssvrcfg/config.h delete mode 100644 src/WINNT/afssvrcfg/config_server_page.cpp delete mode 100644 src/WINNT/afssvrcfg/create_partition_dlg.cpp delete mode 100644 src/WINNT/afssvrcfg/create_partition_dlg.h delete mode 100644 src/WINNT/afssvrcfg/db_server_page.cpp delete mode 100644 src/WINNT/afssvrcfg/disabled.ico delete mode 100644 src/WINNT/afssvrcfg/disk_dri.ico delete mode 100644 src/WINNT/afssvrcfg/file.ico delete mode 100644 src/WINNT/afssvrcfg/file_server_page.cpp delete mode 100644 src/WINNT/afssvrcfg/folder.ico delete mode 100644 src/WINNT/afssvrcfg/get_cur_config.cpp delete mode 100644 src/WINNT/afssvrcfg/get_cur_config.h delete mode 100644 src/WINNT/afssvrcfg/get_pw_dlg.cpp delete mode 100644 src/WINNT/afssvrcfg/get_pw_dlg.h delete mode 100644 src/WINNT/afssvrcfg/graphics.cpp delete mode 100644 src/WINNT/afssvrcfg/graphics.h delete mode 100644 src/WINNT/afssvrcfg/help.cpp delete mode 100755 src/WINNT/afssvrcfg/hourglass.h delete mode 100644 src/WINNT/afssvrcfg/info2_page.cpp delete mode 100644 src/WINNT/afssvrcfg/info_page.cpp delete mode 100644 src/WINNT/afssvrcfg/intro_page.cpp delete mode 100644 src/WINNT/afssvrcfg/lang/.cvsignore delete mode 100644 src/WINNT/afssvrcfg/lang/NTMakefile delete mode 100644 src/WINNT/afssvrcfg/lang/de_DE/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/en_US/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/es_ES/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/ja_JP/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/ko_KR/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/ko_KR/status_16.bmp delete mode 100644 src/WINNT/afssvrcfg/lang/ko_KR/status_256.bmp delete mode 100644 src/WINNT/afssvrcfg/lang/pt_BR/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/zh_CN/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/lang/zh_TW/afscfg.rc delete mode 100644 src/WINNT/afssvrcfg/logfile.cpp delete mode 100644 src/WINNT/afssvrcfg/logfile.h delete mode 100644 src/WINNT/afssvrcfg/partition_page.cpp delete mode 100644 src/WINNT/afssvrcfg/partition_utils.cpp delete mode 100644 src/WINNT/afssvrcfg/partition_utils.h delete mode 100644 src/WINNT/afssvrcfg/partitions_page.cpp delete mode 100644 src/WINNT/afssvrcfg/replicatition_page.cpp delete mode 100644 src/WINNT/afssvrcfg/resource.h delete mode 100644 src/WINNT/afssvrcfg/root_afs_page.cpp delete mode 100644 src/WINNT/afssvrcfg/salvage_dlg.cpp delete mode 100644 src/WINNT/afssvrcfg/salvage_results_dlg.cpp delete mode 100644 src/WINNT/afssvrcfg/salvage_results_dlg.h delete mode 100644 src/WINNT/afssvrcfg/services_page.cpp delete mode 100644 src/WINNT/afssvrcfg/status_16.bmp delete mode 100644 src/WINNT/afssvrcfg/status_256.bmp delete mode 100644 src/WINNT/afssvrcfg/sys_control_page.cpp delete mode 100644 src/WINNT/afssvrcfg/toolbox.cpp delete mode 100644 src/WINNT/afssvrcfg/toolbox.h delete mode 100644 src/WINNT/afssvrcfg/validation.cpp delete mode 100644 src/WINNT/afssvrcfg/validation.h delete mode 100644 src/WINNT/afssvrcfg/volume_utils.cpp delete mode 100644 src/WINNT/afssvrcfg/volume_utils.h delete mode 100644 src/WINNT/afssvrcfg/warn_dri.ico delete mode 100644 src/WINNT/afssvrcpa/.cvsignore delete mode 100644 src/WINNT/afssvrcpa/NTMakefile delete mode 100644 src/WINNT/afssvrcpa/afssvrcpa.def delete mode 100644 src/WINNT/afssvrcpa/afssvrcpa.ico delete mode 100644 src/WINNT/afssvrcpa/afssvrcpa_stub.rc delete mode 100644 src/WINNT/afssvrcpa/cpl_interface.cpp delete mode 100644 src/WINNT/afssvrcpa/cpl_interface.h delete mode 100644 src/WINNT/afssvrcpa/lang/.cvsignore delete mode 100644 src/WINNT/afssvrcpa/lang/NTMakefile delete mode 100644 src/WINNT/afssvrcpa/lang/de_DE/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/en_US/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/es_ES/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/ja_JP/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/ko_KR/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/pt_BR/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/zh_CN/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/lang/zh_TW/afssvrcpa.rc delete mode 100644 src/WINNT/afssvrcpa/resource.h delete mode 100644 src/WINNT/afssvrmgr/NTMakefile delete mode 100644 src/WINNT/afssvrmgr/action.cpp delete mode 100644 src/WINNT/afssvrmgr/action.h delete mode 100644 src/WINNT/afssvrmgr/agg_col.cpp delete mode 100644 src/WINNT/afssvrmgr/agg_col.h delete mode 100644 src/WINNT/afssvrmgr/agg_general.cpp delete mode 100644 src/WINNT/afssvrmgr/agg_general.h delete mode 100644 src/WINNT/afssvrmgr/agg_prop.cpp delete mode 100644 src/WINNT/afssvrmgr/agg_prop.h delete mode 100644 src/WINNT/afssvrmgr/agg_tab.cpp delete mode 100644 src/WINNT/afssvrmgr/agg_tab.h delete mode 100644 src/WINNT/afssvrmgr/alert.cpp delete mode 100644 src/WINNT/afssvrmgr/alert.h delete mode 100644 src/WINNT/afssvrmgr/cmdline.cpp delete mode 100644 src/WINNT/afssvrmgr/cmdline.h delete mode 100644 src/WINNT/afssvrmgr/columns.cpp delete mode 100644 src/WINNT/afssvrmgr/columns.h delete mode 100644 src/WINNT/afssvrmgr/command.cpp delete mode 100644 src/WINNT/afssvrmgr/command.h delete mode 100644 src/WINNT/afssvrmgr/creds.cpp delete mode 100644 src/WINNT/afssvrmgr/creds.h delete mode 100644 src/WINNT/afssvrmgr/dispatch.cpp delete mode 100644 src/WINNT/afssvrmgr/dispatch.h delete mode 100644 src/WINNT/afssvrmgr/dispguts.cpp delete mode 100644 src/WINNT/afssvrmgr/dispguts.h delete mode 100644 src/WINNT/afssvrmgr/display.cpp delete mode 100644 src/WINNT/afssvrmgr/display.h delete mode 100644 src/WINNT/afssvrmgr/exportcl.h delete mode 100644 src/WINNT/afssvrmgr/general.cpp delete mode 100644 src/WINNT/afssvrmgr/general.h delete mode 100644 src/WINNT/afssvrmgr/help.hid delete mode 100644 src/WINNT/afssvrmgr/helpfunc.cpp delete mode 100644 src/WINNT/afssvrmgr/helpfunc.h delete mode 100644 src/WINNT/afssvrmgr/lang/NTMakefile delete mode 100644 src/WINNT/afssvrmgr/lang/de_DE/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/en_US/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/es_ES/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/ja_JP/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/ko_KR/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/pt_BR/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/zh_CN/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/lang/zh_TW/svrmgr.rc delete mode 100644 src/WINNT/afssvrmgr/messages.h delete mode 100644 src/WINNT/afssvrmgr/options.cpp delete mode 100644 src/WINNT/afssvrmgr/options.h delete mode 100644 src/WINNT/afssvrmgr/prefs.cpp delete mode 100644 src/WINNT/afssvrmgr/prefs.h delete mode 100644 src/WINNT/afssvrmgr/problems.cpp delete mode 100644 src/WINNT/afssvrmgr/problems.h delete mode 100644 src/WINNT/afssvrmgr/propcache.cpp delete mode 100644 src/WINNT/afssvrmgr/propcache.h delete mode 100644 src/WINNT/afssvrmgr/resource.h delete mode 100644 src/WINNT/afssvrmgr/resource/admlist.ico delete mode 100644 src/WINNT/afssvrmgr/resource/afssvrmgr.ico delete mode 100644 src/WINNT/afssvrmgr/resource/btn_delete.ico delete mode 100644 src/WINNT/afssvrmgr/resource/btn_rename.ico delete mode 100644 src/WINNT/afssvrmgr/resource/getdates.ico delete mode 100644 src/WINNT/afssvrmgr/resource/install.ico delete mode 100644 src/WINNT/afssvrmgr/resource/prune.ico delete mode 100644 src/WINNT/afssvrmgr/resource/setmove.avi delete mode 100644 src/WINNT/afssvrmgr/resource/subset.ico delete mode 100644 src/WINNT/afssvrmgr/resource/uninstal.ico delete mode 100644 src/WINNT/afssvrmgr/set_clone.cpp delete mode 100644 src/WINNT/afssvrmgr/set_clone.h delete mode 100644 src/WINNT/afssvrmgr/set_col.cpp delete mode 100644 src/WINNT/afssvrmgr/set_col.h delete mode 100644 src/WINNT/afssvrmgr/set_create.cpp delete mode 100644 src/WINNT/afssvrmgr/set_create.h delete mode 100644 src/WINNT/afssvrmgr/set_createrep.cpp delete mode 100644 src/WINNT/afssvrmgr/set_createrep.h delete mode 100644 src/WINNT/afssvrmgr/set_delete.cpp delete mode 100644 src/WINNT/afssvrmgr/set_delete.h delete mode 100644 src/WINNT/afssvrmgr/set_dump.cpp delete mode 100644 src/WINNT/afssvrmgr/set_dump.h delete mode 100644 src/WINNT/afssvrmgr/set_general.cpp delete mode 100644 src/WINNT/afssvrmgr/set_general.h delete mode 100644 src/WINNT/afssvrmgr/set_move.cpp delete mode 100644 src/WINNT/afssvrmgr/set_move.h delete mode 100644 src/WINNT/afssvrmgr/set_prop.cpp delete mode 100644 src/WINNT/afssvrmgr/set_prop.h delete mode 100644 src/WINNT/afssvrmgr/set_quota.cpp delete mode 100644 src/WINNT/afssvrmgr/set_quota.h delete mode 100644 src/WINNT/afssvrmgr/set_release.cpp delete mode 100644 src/WINNT/afssvrmgr/set_release.h delete mode 100644 src/WINNT/afssvrmgr/set_rename.cpp delete mode 100644 src/WINNT/afssvrmgr/set_rename.h delete mode 100644 src/WINNT/afssvrmgr/set_repprop.cpp delete mode 100644 src/WINNT/afssvrmgr/set_repprop.h delete mode 100644 src/WINNT/afssvrmgr/set_restore.cpp delete mode 100644 src/WINNT/afssvrmgr/set_restore.h delete mode 100644 src/WINNT/afssvrmgr/set_tab.cpp delete mode 100644 src/WINNT/afssvrmgr/set_tab.h delete mode 100644 src/WINNT/afssvrmgr/subset.cpp delete mode 100644 src/WINNT/afssvrmgr/subset.h delete mode 100644 src/WINNT/afssvrmgr/svc_col.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_col.h delete mode 100644 src/WINNT/afssvrmgr/svc_create.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_create.h delete mode 100644 src/WINNT/afssvrmgr/svc_delete.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_delete.h delete mode 100644 src/WINNT/afssvrmgr/svc_general.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_general.h delete mode 100644 src/WINNT/afssvrmgr/svc_prop.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_prop.h delete mode 100644 src/WINNT/afssvrmgr/svc_startstop.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_startstop.h delete mode 100644 src/WINNT/afssvrmgr/svc_tab.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_tab.h delete mode 100644 src/WINNT/afssvrmgr/svc_viewlog.cpp delete mode 100644 src/WINNT/afssvrmgr/svc_viewlog.h delete mode 100644 src/WINNT/afssvrmgr/svr_address.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_address.h delete mode 100644 src/WINNT/afssvrmgr/svr_col.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_col.h delete mode 100644 src/WINNT/afssvrmgr/svr_execute.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_execute.h delete mode 100644 src/WINNT/afssvrmgr/svr_general.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_general.h delete mode 100644 src/WINNT/afssvrmgr/svr_getdates.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_getdates.h delete mode 100644 src/WINNT/afssvrmgr/svr_hosts.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_hosts.h delete mode 100644 src/WINNT/afssvrmgr/svr_install.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_install.h delete mode 100644 src/WINNT/afssvrmgr/svr_prop.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_prop.h delete mode 100644 src/WINNT/afssvrmgr/svr_prune.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_prune.h delete mode 100644 src/WINNT/afssvrmgr/svr_salvage.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_salvage.h delete mode 100644 src/WINNT/afssvrmgr/svr_security.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_security.h delete mode 100644 src/WINNT/afssvrmgr/svr_syncvldb.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_syncvldb.h delete mode 100644 src/WINNT/afssvrmgr/svr_uninstall.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_uninstall.h delete mode 100644 src/WINNT/afssvrmgr/svr_window.cpp delete mode 100644 src/WINNT/afssvrmgr/svr_window.h delete mode 100644 src/WINNT/afssvrmgr/svrmgr.cpp delete mode 100644 src/WINNT/afssvrmgr/svrmgr.h delete mode 100644 src/WINNT/afssvrmgr/svrmgr_stub.rc delete mode 100644 src/WINNT/afssvrmgr/task.cpp delete mode 100644 src/WINNT/afssvrmgr/task.h delete mode 100644 src/WINNT/afssvrmgr/window.cpp delete mode 100644 src/WINNT/afssvrmgr/window.h delete mode 100644 src/WINNT/afsusrmgr/.cvsignore delete mode 100644 src/WINNT/afsusrmgr/AfsUsrMgr_stub.rc delete mode 100644 src/WINNT/afsusrmgr/NTMakefile delete mode 100644 src/WINNT/afsusrmgr/TaAfsUsrMgr.h delete mode 100644 src/WINNT/afsusrmgr/action.cpp delete mode 100644 src/WINNT/afsusrmgr/action.h delete mode 100644 src/WINNT/afsusrmgr/browse.cpp delete mode 100644 src/WINNT/afsusrmgr/browse.h delete mode 100644 src/WINNT/afsusrmgr/cell_prop.cpp delete mode 100644 src/WINNT/afsusrmgr/cell_prop.h delete mode 100644 src/WINNT/afsusrmgr/cmdline.cpp delete mode 100644 src/WINNT/afsusrmgr/cmdline.h delete mode 100644 src/WINNT/afsusrmgr/columns.cpp delete mode 100644 src/WINNT/afsusrmgr/columns.h delete mode 100644 src/WINNT/afsusrmgr/command.cpp delete mode 100644 src/WINNT/afsusrmgr/command.h delete mode 100644 src/WINNT/afsusrmgr/creds.cpp delete mode 100644 src/WINNT/afsusrmgr/creds.h delete mode 100644 src/WINNT/afsusrmgr/display.cpp delete mode 100644 src/WINNT/afsusrmgr/display.h delete mode 100644 src/WINNT/afsusrmgr/errdata.cpp delete mode 100644 src/WINNT/afsusrmgr/errdata.h delete mode 100644 src/WINNT/afsusrmgr/general.cpp delete mode 100644 src/WINNT/afsusrmgr/general.h delete mode 100644 src/WINNT/afsusrmgr/grp_col.cpp delete mode 100644 src/WINNT/afsusrmgr/grp_col.h delete mode 100644 src/WINNT/afsusrmgr/grp_create.cpp delete mode 100644 src/WINNT/afsusrmgr/grp_create.h delete mode 100644 src/WINNT/afsusrmgr/grp_delete.cpp delete mode 100644 src/WINNT/afsusrmgr/grp_delete.h delete mode 100644 src/WINNT/afsusrmgr/grp_prop.cpp delete mode 100644 src/WINNT/afsusrmgr/grp_prop.h delete mode 100644 src/WINNT/afsusrmgr/grp_rename.cpp delete mode 100644 src/WINNT/afsusrmgr/grp_rename.h delete mode 100644 src/WINNT/afsusrmgr/grp_tab.cpp delete mode 100644 src/WINNT/afsusrmgr/grp_tab.h delete mode 100644 src/WINNT/afsusrmgr/help.hid delete mode 100644 src/WINNT/afsusrmgr/helpfunc.cpp delete mode 100644 src/WINNT/afsusrmgr/helpfunc.h delete mode 100644 src/WINNT/afsusrmgr/lang/.cvsignore delete mode 100644 src/WINNT/afsusrmgr/lang/NTMakefile delete mode 100644 src/WINNT/afsusrmgr/lang/de_DE/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/en_US/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/es_ES/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/ja_JP/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/ko_KR/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/pt_BR/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/zh_CN/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/lang/zh_TW/AfsUsrMgr.rc delete mode 100644 src/WINNT/afsusrmgr/main.cpp delete mode 100644 src/WINNT/afsusrmgr/mch_col.cpp delete mode 100644 src/WINNT/afsusrmgr/mch_col.h delete mode 100644 src/WINNT/afsusrmgr/mch_create.cpp delete mode 100644 src/WINNT/afsusrmgr/mch_create.h delete mode 100644 src/WINNT/afsusrmgr/mch_delete.cpp delete mode 100644 src/WINNT/afsusrmgr/mch_delete.h delete mode 100644 src/WINNT/afsusrmgr/mch_tab.cpp delete mode 100644 src/WINNT/afsusrmgr/mch_tab.h delete mode 100644 src/WINNT/afsusrmgr/messages.h delete mode 100644 src/WINNT/afsusrmgr/options.cpp delete mode 100644 src/WINNT/afsusrmgr/options.h delete mode 100644 src/WINNT/afsusrmgr/resource.h delete mode 100644 src/WINNT/afsusrmgr/resource/afsusrmgr.ico delete mode 100644 src/WINNT/afsusrmgr/task.cpp delete mode 100644 src/WINNT/afsusrmgr/task.h delete mode 100644 src/WINNT/afsusrmgr/usr_col.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_col.h delete mode 100644 src/WINNT/afsusrmgr/usr_cpw.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_cpw.h delete mode 100644 src/WINNT/afsusrmgr/usr_create.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_create.h delete mode 100644 src/WINNT/afsusrmgr/usr_delete.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_delete.h delete mode 100644 src/WINNT/afsusrmgr/usr_prop.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_prop.h delete mode 100644 src/WINNT/afsusrmgr/usr_search.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_search.h delete mode 100644 src/WINNT/afsusrmgr/usr_tab.cpp delete mode 100644 src/WINNT/afsusrmgr/usr_tab.h delete mode 100644 src/WINNT/afsusrmgr/window.cpp delete mode 100644 src/WINNT/afsusrmgr/window.h delete mode 100644 src/WINNT/afsusrmgr/winlist.cpp delete mode 100644 src/WINNT/afsusrmgr/winlist.h delete mode 100644 src/WINNT/aklog/.cvsignore delete mode 100644 src/WINNT/aklog/NTMakefile delete mode 100644 src/WINNT/aklog/aklog.c delete mode 100644 src/WINNT/aklog/aklog.h delete mode 100644 src/WINNT/aklog/aklog.rc delete mode 100644 src/WINNT/aklog/linked_list.c delete mode 100644 src/WINNT/aklog/linked_list.h delete mode 100644 src/WINNT/bosctlsvc/.cvsignore delete mode 100644 src/WINNT/bosctlsvc/NTMakefile delete mode 100644 src/WINNT/bosctlsvc/bosctlsvc.c delete mode 100644 src/WINNT/bosctlsvc/bosctlsvc.rc delete mode 100644 src/WINNT/client_config/.cvsignore delete mode 100644 src/WINNT/client_config/NTMakefile delete mode 100644 src/WINNT/client_config/RegistrySupport.cpp delete mode 100644 src/WINNT/client_config/afs_config.h delete mode 100644 src/WINNT/client_config/afs_config.ico delete mode 100644 src/WINNT/client_config/afs_config_stub.rc delete mode 100644 src/WINNT/client_config/afsmap.c delete mode 100644 src/WINNT/client_config/cellservdb.c delete mode 100644 src/WINNT/client_config/cellservdb.h delete mode 100644 src/WINNT/client_config/config.cpp delete mode 100644 src/WINNT/client_config/config.h delete mode 100644 src/WINNT/client_config/dlg_automap.cpp delete mode 100644 src/WINNT/client_config/dlg_binding.cpp delete mode 100644 src/WINNT/client_config/dlg_diag.cpp delete mode 100644 src/WINNT/client_config/dlg_logon.cpp delete mode 100644 src/WINNT/client_config/dlg_misc.cpp delete mode 100644 src/WINNT/client_config/down.ico delete mode 100644 src/WINNT/client_config/drivemap.cpp delete mode 100644 src/WINNT/client_config/drivemap.h delete mode 100644 src/WINNT/client_config/help.hid delete mode 100644 src/WINNT/client_config/isadmin.cpp delete mode 100644 src/WINNT/client_config/isadmin.h delete mode 100644 src/WINNT/client_config/lang/.cvsignore delete mode 100644 src/WINNT/client_config/lang/NTMakefile delete mode 100644 src/WINNT/client_config/lang/de_DE/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/en_US/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/es_ES/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/ja_JP/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/ko_KR/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/pt_BR/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/zh_CN/afs_config.rc delete mode 100644 src/WINNT/client_config/lang/zh_TW/afs_config.rc delete mode 100644 src/WINNT/client_config/main.cpp delete mode 100644 src/WINNT/client_config/misc.cpp delete mode 100644 src/WINNT/client_config/pagesize.cpp delete mode 100644 src/WINNT/client_config/pagesize.h delete mode 100644 src/WINNT/client_config/resource.h delete mode 100644 src/WINNT/client_config/tab_advanced.cpp delete mode 100644 src/WINNT/client_config/tab_advanced.h delete mode 100644 src/WINNT/client_config/tab_drives.cpp delete mode 100644 src/WINNT/client_config/tab_drives.h delete mode 100644 src/WINNT/client_config/tab_general.cpp delete mode 100644 src/WINNT/client_config/tab_general.h delete mode 100644 src/WINNT/client_config/tab_hosts.cpp delete mode 100644 src/WINNT/client_config/tab_hosts.h delete mode 100644 src/WINNT/client_config/tab_prefs.cpp delete mode 100644 src/WINNT/client_config/tab_prefs.h delete mode 100644 src/WINNT/client_config/up.ico delete mode 100644 src/WINNT/client_cpa/.cvsignore delete mode 100644 src/WINNT/client_cpa/NTMakefile delete mode 100644 src/WINNT/client_cpa/afs_ccenter.ico delete mode 100644 src/WINNT/client_cpa/afs_conf.ico delete mode 100644 src/WINNT/client_cpa/afs_cpa.def delete mode 100644 src/WINNT/client_cpa/afs_cpa_stub.rc delete mode 100644 src/WINNT/client_cpa/cpl_interface.cpp delete mode 100644 src/WINNT/client_cpa/cpl_interface.h delete mode 100644 src/WINNT/client_cpa/lang/.cvsignore delete mode 100644 src/WINNT/client_cpa/lang/NTMakefile delete mode 100644 src/WINNT/client_cpa/lang/de_DE/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/en_US/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/es_ES/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/ja_JP/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/ko_KR/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/pt_BR/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/zh_CN/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/lang/zh_TW/afs_cpa.rc delete mode 100644 src/WINNT/client_cpa/resource.h delete mode 100644 src/WINNT/client_creds/Makefile delete mode 100644 src/WINNT/client_creds/NTMakefile delete mode 100644 src/WINNT/client_creds/advtab.cpp delete mode 100644 src/WINNT/client_creds/advtab.h delete mode 100644 src/WINNT/client_creds/afscreds.h delete mode 100644 src/WINNT/client_creds/afscreds.ico delete mode 100644 src/WINNT/client_creds/afscreds_stub.rc delete mode 100644 src/WINNT/client_creds/afswiz.cpp delete mode 100644 src/WINNT/client_creds/afswiz.h delete mode 100644 src/WINNT/client_creds/creds.cpp delete mode 100644 src/WINNT/client_creds/creds.h delete mode 100644 src/WINNT/client_creds/creds_1.ico delete mode 100644 src/WINNT/client_creds/creds_2.ico delete mode 100644 src/WINNT/client_creds/creds_3.ico delete mode 100644 src/WINNT/client_creds/credstab.cpp delete mode 100644 src/WINNT/client_creds/credstab.h delete mode 100644 src/WINNT/client_creds/help.hid delete mode 100644 src/WINNT/client_creds/ipaddrchg.c delete mode 100644 src/WINNT/client_creds/ipaddrchg.h delete mode 100644 src/WINNT/client_creds/lang/NTMakefile delete mode 100644 src/WINNT/client_creds/lang/de_DE/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/en_US/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/es_ES/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/ja_JP/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/ko_KR/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/pt_BR/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/zh_CN/afscreds.rc delete mode 100644 src/WINNT/client_creds/lang/zh_TW/afscreds.rc delete mode 100644 src/WINNT/client_creds/main.cpp delete mode 100644 src/WINNT/client_creds/misc.cpp delete mode 100644 src/WINNT/client_creds/mounttab.cpp delete mode 100644 src/WINNT/client_creds/mounttab.h delete mode 100644 src/WINNT/client_creds/resource.h delete mode 100644 src/WINNT/client_creds/settings.cpp delete mode 100644 src/WINNT/client_creds/settings.h delete mode 100644 src/WINNT/client_creds/shortcut.cpp delete mode 100644 src/WINNT/client_creds/shortcut.h delete mode 100644 src/WINNT/client_creds/trayicon.cpp delete mode 100644 src/WINNT/client_creds/trayicon.h delete mode 100644 src/WINNT/client_creds/window.cpp delete mode 100644 src/WINNT/client_creds/window.h delete mode 100644 src/WINNT/client_creds/wiz16.bmp delete mode 100644 src/WINNT/client_creds/wiz256.bmp delete mode 100644 src/WINNT/client_exp/NTMakefile delete mode 100644 src/WINNT/client_exp/add_acl_entry_dlg.cpp delete mode 100644 src/WINNT/client_exp/add_acl_entry_dlg.h delete mode 100644 src/WINNT/client_exp/add_submount_dlg.cpp delete mode 100644 src/WINNT/client_exp/add_submount_dlg.h delete mode 100644 src/WINNT/client_exp/afs_shl_ext.cpp delete mode 100644 src/WINNT/client_exp/afs_shl_ext.def delete mode 100644 src/WINNT/client_exp/afs_shl_ext.h delete mode 100644 src/WINNT/client_exp/afs_shl_ext.odl delete mode 100644 src/WINNT/client_exp/afs_shl_ext.reg delete mode 100644 src/WINNT/client_exp/afs_shl_ext_stub.rc delete mode 100644 src/WINNT/client_exp/auth_dlg.cpp delete mode 100644 src/WINNT/client_exp/auth_dlg.h delete mode 100644 src/WINNT/client_exp/clear_acl_dlg.cpp delete mode 100644 src/WINNT/client_exp/clear_acl_dlg.h delete mode 100644 src/WINNT/client_exp/copy_acl_dlg.cpp delete mode 100644 src/WINNT/client_exp/copy_acl_dlg.h delete mode 100644 src/WINNT/client_exp/down_servers_dlg.cpp delete mode 100644 src/WINNT/client_exp/down_servers_dlg.h delete mode 100644 src/WINNT/client_exp/fs.h delete mode 100644 src/WINNT/client_exp/gui2fs.cpp delete mode 100644 src/WINNT/client_exp/gui2fs.h delete mode 100644 src/WINNT/client_exp/help.cpp delete mode 100644 src/WINNT/client_exp/help.h delete mode 100755 src/WINNT/client_exp/hourglass.h delete mode 100644 src/WINNT/client_exp/klog_dlg.cpp delete mode 100644 src/WINNT/client_exp/klog_dlg.h delete mode 100644 src/WINNT/client_exp/lang/NTMakefile delete mode 100644 src/WINNT/client_exp/lang/afs_shl_ext.rc2 delete mode 100644 src/WINNT/client_exp/lang/de_DE/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/es_ES/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/ja_JP/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/ko_KR/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/pt_BR/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/zh_CN/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/lang/zh_TW/afs_shl_ext.rc delete mode 100644 src/WINNT/client_exp/make_mount_point_dlg.cpp delete mode 100644 src/WINNT/client_exp/make_mount_point_dlg.h delete mode 100644 src/WINNT/client_exp/make_symbolic_link_dlg.cpp delete mode 100644 src/WINNT/client_exp/make_symbolic_link_dlg.h delete mode 100644 src/WINNT/client_exp/mount_points_dlg.cpp delete mode 100644 src/WINNT/client_exp/mount_points_dlg.h delete mode 100644 src/WINNT/client_exp/msgs.cpp delete mode 100644 src/WINNT/client_exp/msgs.h delete mode 100644 src/WINNT/client_exp/partition_info_dlg.cpp delete mode 100644 src/WINNT/client_exp/partition_info_dlg.h delete mode 100644 src/WINNT/client_exp/resource.h delete mode 100644 src/WINNT/client_exp/results_dlg.cpp delete mode 100644 src/WINNT/client_exp/results_dlg.h delete mode 100644 src/WINNT/client_exp/server_status_dlg.H delete mode 100644 src/WINNT/client_exp/server_status_dlg.cpp delete mode 100644 src/WINNT/client_exp/set_afs_acl.cpp delete mode 100644 src/WINNT/client_exp/set_afs_acl.h delete mode 100644 src/WINNT/client_exp/shell_ext.cpp delete mode 100644 src/WINNT/client_exp/shell_ext.h delete mode 100644 src/WINNT/client_exp/stdafx.cpp delete mode 100644 src/WINNT/client_exp/stdafx.h delete mode 100644 src/WINNT/client_exp/submount_info.cpp delete mode 100644 src/WINNT/client_exp/submount_info.h delete mode 100644 src/WINNT/client_exp/submounts_dlg.cpp delete mode 100644 src/WINNT/client_exp/submounts_dlg.h delete mode 100644 src/WINNT/client_exp/unlog_dlg.cpp delete mode 100644 src/WINNT/client_exp/unlog_dlg.h delete mode 100644 src/WINNT/client_exp/volume_inf.h delete mode 100644 src/WINNT/client_exp/volume_info.h delete mode 100644 src/WINNT/client_exp/volumeinfo.cpp delete mode 100644 src/WINNT/client_osi/Makefile.djgpp delete mode 100644 src/WINNT/client_osi/NTMakefile delete mode 100644 src/WINNT/client_osi/NTMakefile-TestOSI delete mode 100644 src/WINNT/client_osi/basic.c delete mode 100644 src/WINNT/client_osi/basic.h delete mode 100644 src/WINNT/client_osi/dbrpc.idl delete mode 100644 src/WINNT/client_osi/largeint.h delete mode 100644 src/WINNT/client_osi/libosi.def delete mode 100644 src/WINNT/client_osi/libosi.hpj delete mode 100644 src/WINNT/client_osi/libosi.rc delete mode 100644 src/WINNT/client_osi/libosi.rtf delete mode 100644 src/WINNT/client_osi/libosicl.def delete mode 100644 src/WINNT/client_osi/main.c delete mode 100644 src/WINNT/client_osi/main.def delete mode 100644 src/WINNT/client_osi/main.h delete mode 100644 src/WINNT/client_osi/main.rc delete mode 100644 src/WINNT/client_osi/osi.h delete mode 100644 src/WINNT/client_osi/osibasel.c delete mode 100644 src/WINNT/client_osi/osibasel.h delete mode 100644 src/WINNT/client_osi/osidb.c delete mode 100644 src/WINNT/client_osi/osidb.h delete mode 100644 src/WINNT/client_osi/osidebug.c delete mode 100644 src/WINNT/client_osi/osidebug.def delete mode 100644 src/WINNT/client_osi/osidebug.h delete mode 100644 src/WINNT/client_osi/osidebug.hpj delete mode 100644 src/WINNT/client_osi/osidebug.rc delete mode 100644 src/WINNT/client_osi/osidebug.rtf delete mode 100644 src/WINNT/client_osi/osievent.mc delete mode 100644 src/WINNT/client_osi/osifd.c delete mode 100644 src/WINNT/client_osi/osifd.h delete mode 100644 src/WINNT/client_osi/osilog.c delete mode 100644 src/WINNT/client_osi/osilog.h delete mode 100644 src/WINNT/client_osi/osiltype.c delete mode 100644 src/WINNT/client_osi/osiltype.h delete mode 100644 src/WINNT/client_osi/osiqueue.c delete mode 100644 src/WINNT/client_osi/osiqueue.h delete mode 100644 src/WINNT/client_osi/osisleep.c delete mode 100644 src/WINNT/client_osi/osisleep.h delete mode 100644 src/WINNT/client_osi/osistatl.c delete mode 100644 src/WINNT/client_osi/osistatl.h delete mode 100644 src/WINNT/client_osi/osithrd95.c delete mode 100644 src/WINNT/client_osi/osithrd95.h delete mode 100644 src/WINNT/client_osi/osithrdnt.h delete mode 100644 src/WINNT/client_osi/osiutils.c delete mode 100644 src/WINNT/client_osi/osiutils.h delete mode 100644 src/WINNT/client_osi/perf.c delete mode 100644 src/WINNT/client_osi/perf.h delete mode 100644 src/WINNT/client_osi/trylock.c delete mode 100644 src/WINNT/client_osi/trylock.h delete mode 100755 src/WINNT/doc/help/de_DE/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/de_DE/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/de_DE/Afs-light.hlp delete mode 100755 src/WINNT/doc/help/de_DE/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/de_DE/Taafssvrmgr.hlp delete mode 100755 src/WINNT/doc/help/de_DE/Taafsusrmgr.hlp delete mode 100755 src/WINNT/doc/help/de_DE/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/de_DE/afs-light.CNT delete mode 100755 src/WINNT/doc/help/de_DE/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/de_DE/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/de_DE/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/de_DE/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/help/en_US/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/en_US/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/en_US/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/en_US/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/en_US/afs-light.CNT delete mode 100755 src/WINNT/doc/help/en_US/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/en_US/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/en_US/taafscfg.hlp delete mode 100755 src/WINNT/doc/help/en_US/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/en_US/taafssvrmgr.hlp delete mode 100755 src/WINNT/doc/help/en_US/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/help/en_US/taafsusrmgr.hlp delete mode 100755 src/WINNT/doc/help/es_ES/AFS-CC.CNT delete mode 100755 src/WINNT/doc/help/es_ES/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/es_ES/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/es_ES/AFS-NT.CNT delete mode 100755 src/WINNT/doc/help/es_ES/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/es_ES/TAAFSCFG.CNT delete mode 100755 src/WINNT/doc/help/es_ES/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/es_ES/TAAFSSVRMGR.HLP delete mode 100755 src/WINNT/doc/help/es_ES/TAAFSUSRMGR.HLP delete mode 100755 src/WINNT/doc/help/es_ES/afs-light.cnt delete mode 100755 src/WINNT/doc/help/es_ES/taafssvrmgr.CNT delete mode 100755 src/WINNT/doc/help/es_ES/taafsusrmgr.CNT delete mode 100755 src/WINNT/doc/help/ja_JP/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/ja_JP/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/ja_JP/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/ja_JP/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/ja_JP/TAAFSSVRMGR.HLP delete mode 100755 src/WINNT/doc/help/ja_JP/TAAFSUSRMGR.HLP delete mode 100755 src/WINNT/doc/help/ja_JP/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/ja_JP/afs-light.CNT delete mode 100755 src/WINNT/doc/help/ja_JP/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/ja_JP/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/ja_JP/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/ja_JP/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/help/ko_KR/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/ko_KR/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/ko_KR/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/ko_KR/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/ko_KR/TAAFSSVRMGR.HLP delete mode 100755 src/WINNT/doc/help/ko_KR/TAAFSUSRMGR.HLP delete mode 100755 src/WINNT/doc/help/ko_KR/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/ko_KR/afs-light.CNT delete mode 100755 src/WINNT/doc/help/ko_KR/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/ko_KR/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/ko_KR/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/ko_KR/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/help/pt_BR/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/pt_BR/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/pt_BR/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/pt_BR/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/pt_BR/TAAFSSVRMGR.HLP delete mode 100755 src/WINNT/doc/help/pt_BR/TAAFSUSRMGR.HLP delete mode 100755 src/WINNT/doc/help/pt_BR/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/pt_BR/afs-light.CNT delete mode 100755 src/WINNT/doc/help/pt_BR/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/pt_BR/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/pt_BR/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/pt_BR/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/help/zh_CN/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/zh_CN/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/zh_CN/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/zh_CN/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/zh_CN/TAAFSSVRMGR.HLP delete mode 100755 src/WINNT/doc/help/zh_CN/TAAFSUSRMGR.HLP delete mode 100755 src/WINNT/doc/help/zh_CN/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/zh_CN/afs-light.CNT delete mode 100755 src/WINNT/doc/help/zh_CN/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/zh_CN/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/zh_CN/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/zh_CN/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/help/zh_TW/AFS-CC.GID delete mode 100755 src/WINNT/doc/help/zh_TW/AFS-CC.HLP delete mode 100755 src/WINNT/doc/help/zh_TW/AFS-LIGHT.HLP delete mode 100755 src/WINNT/doc/help/zh_TW/AFS-NT.HLP delete mode 100755 src/WINNT/doc/help/zh_TW/TAAFSCFG.HLP delete mode 100755 src/WINNT/doc/help/zh_TW/TAAFSSVRMGR.HLP delete mode 100755 src/WINNT/doc/help/zh_TW/TAAFSUSRMGR.HLP delete mode 100755 src/WINNT/doc/help/zh_TW/afs-cc.CNT delete mode 100755 src/WINNT/doc/help/zh_TW/afs-light.CNT delete mode 100755 src/WINNT/doc/help/zh_TW/afs-nt.CNT delete mode 100755 src/WINNT/doc/help/zh_TW/taafscfg.cnt delete mode 100755 src/WINNT/doc/help/zh_TW/taafssvrmgr.cnt delete mode 100755 src/WINNT/doc/help/zh_TW/taafsusrmgr.cnt delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/de_DE/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf000.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf002.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf003.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf004.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf005.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf006.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf007.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf008.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf009.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf010.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf011.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf012.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf013.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf014.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf015.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf016.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf017.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf018.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf019.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf020.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf021.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf022.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf023.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf024.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf025.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf026.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf027.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf028.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf029.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf030.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf031.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf032.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf033.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf034.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf035.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf036.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf037.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf038.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf039.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf040.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf041.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf042.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf043.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf044.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf045.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf046.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf047.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf048.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf049.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf050.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf051.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf052.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf053.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf054.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf055.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf056.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf057.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf058.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf059.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf060.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf061.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf062.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf063.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf064.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf065.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf066.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf067.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf068.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf069.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf070.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf071.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf072.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf073.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf074.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf075.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf076.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf077.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf078.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf079.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf080.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf081.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf082.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf083.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf084.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf085.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf086.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf087.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf088.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf089.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf090.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf091.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf092.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf093.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf094.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf095.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf096.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf097.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf098.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf099.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf100.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf101.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf102.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf103.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf104.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf105.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf106.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf107.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf108.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf109.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf110.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf111.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf112.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf113.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf114.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf115.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf116.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf117.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf118.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf119.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf120.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf121.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf122.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf123.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf124.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf125.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf126.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf127.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf128.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf129.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf130.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf131.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf132.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf133.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf134.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf135.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf136.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf137.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf138.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf139.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf140.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf141.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf142.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf143.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf144.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf145.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf146.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf147.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf148.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf149.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf150.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf151.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf152.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf153.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf154.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf155.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf156.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf157.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf158.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf159.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf160.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf161.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf162.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf163.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf164.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf165.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf166.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf167.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf168.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf169.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf170.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf171.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf172.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf173.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf174.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf175.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf176.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf177.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf178.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf179.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf180.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf181.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf182.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf183.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf184.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf185.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf186.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf187.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf188.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf189.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf190.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf191.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf192.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf193.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf194.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf195.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf196.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf197.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf198.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf199.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf200.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf201.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf202.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf203.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf204.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf205.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf206.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf207.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf208.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf209.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf210.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf211.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf212.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf213.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf214.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf215.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf216.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf217.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf218.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf219.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf220.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf221.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf222.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf223.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf224.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf225.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf226.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf227.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf228.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf229.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf230.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf231.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf232.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf233.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf234.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf235.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf236.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf237.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf238.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf239.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf240.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf241.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf242.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf243.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf244.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf245.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf246.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf247.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf248.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf249.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf250.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf251.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf252.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf253.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf254.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf255.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf256.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf257.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf258.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf259.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf260.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf261.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf262.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf263.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf264.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf265.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf266.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf267.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf268.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf269.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf270.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf271.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf272.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf273.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf274.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf275.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf276.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf277.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf278.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf279.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf280.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf281.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf282.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf283.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf284.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns000.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns002.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns003.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns004.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns005.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns006.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns007.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd000.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd002.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd003.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd004.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd005.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd006.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd007.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd008.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd009.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd010.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd011.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd012.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd013.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd014.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd015.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd016.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd017.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd018.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd019.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd020.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd021.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd022.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd023.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd024.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd025.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd026.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/cachmgr.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/fserver1.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/fserver2.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/overview.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/scout1.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/scout2.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/scout3.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/scout4.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/vnode.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/en_US/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/es_ES/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf005.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf006.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf007.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf008.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf009.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf010.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf011.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf012.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf013.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf014.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf015.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf016.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf017.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf018.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf019.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf020.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf021.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf022.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf023.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf024.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf025.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf026.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf027.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf028.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf029.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf030.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf031.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf032.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf033.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf034.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf035.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf036.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf037.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf038.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf039.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf040.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf041.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf042.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf043.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf044.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf045.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf046.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf047.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf048.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf049.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf050.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf051.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf052.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf053.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf054.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf055.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf056.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf057.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf058.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf059.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf060.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf061.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf062.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf063.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf064.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf065.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf066.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf067.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf068.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf069.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf070.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf071.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf072.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf073.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf074.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf075.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf076.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf077.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf078.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf079.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf080.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf081.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf082.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf083.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf084.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf085.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf086.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf087.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf088.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf089.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf090.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf091.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf092.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf093.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf094.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf095.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf096.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf097.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf098.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf099.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf100.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf101.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf102.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf103.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf104.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf105.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf106.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf107.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf108.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf109.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf110.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf111.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf112.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf113.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf114.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf115.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf116.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf117.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf118.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf119.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf120.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf121.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf122.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf123.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf124.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf125.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf126.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf127.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf128.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf129.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf130.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf131.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf132.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf133.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf134.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf135.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf136.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf137.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf138.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf139.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf140.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf141.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf142.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf143.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf144.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf145.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf146.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf147.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf148.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf149.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf150.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf151.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf152.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf153.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf154.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf155.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf156.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf157.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf158.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf159.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf160.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf161.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf162.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf163.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf164.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf165.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf166.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf167.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf168.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf169.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf170.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf171.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf172.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf173.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf174.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf175.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf176.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf177.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf178.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf179.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf180.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf181.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf182.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf183.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf184.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf185.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf186.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf187.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf188.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf189.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf190.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf191.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf192.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf193.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf194.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf195.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf196.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf197.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf198.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf199.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf200.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf201.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf202.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf203.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf204.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf205.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf206.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf207.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf208.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf209.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf210.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf211.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf212.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf213.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf214.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf215.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf216.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf217.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf218.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf219.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf220.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf221.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf222.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf223.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf224.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf225.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf226.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf227.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf228.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf229.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf230.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf231.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf232.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf233.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf234.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf235.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf236.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf237.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf238.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf239.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf240.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf241.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf242.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf243.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf244.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf245.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf246.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf247.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf248.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf249.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf250.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf251.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf252.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf253.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf254.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf255.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf256.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf257.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf258.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf259.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf260.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf261.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf262.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf263.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf264.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf265.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf266.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf267.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf268.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf269.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf270.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf271.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf272.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf273.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf274.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf275.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf276.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf277.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf278.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf279.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf280.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf281.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf282.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf283.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/CmdRef/auarf284.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns005.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns006.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/ReleaseNotes/awrns007.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd005.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd006.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd007.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd008.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd009.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd010.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd011.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd012.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd013.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd014.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd015.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd016.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd017.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd018.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd019.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd020.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd021.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd022.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd023.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd024.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd025.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/auagd026.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/cachmgr.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/fserver1.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/fserver2.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/overview.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/scout1.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/scout2.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/scout3.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/scout4.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/SysAdminGd/vnode.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/ja_JP/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns005.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns006.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/ReleaseNotes/awrns007.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd000.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd002.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd003.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd004.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd005.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd006.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd007.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd008.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd009.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd010.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd011.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd012.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd013.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd014.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd015.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd016.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd017.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd018.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd019.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd020.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd021.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd022.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd023.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd024.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd025.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/auagd026.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/cachmgr.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/fserver1.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/fserver2.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/overview.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/scout1.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/scout2.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/scout3.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/scout4.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/SysAdminGd/vnode.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/ko_KR/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns000.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns002.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns003.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns004.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns005.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns006.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/ReleaseNotes/awrns007.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/pt_BR/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns000.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns002.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns003.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns004.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns005.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns006.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/ReleaseNotes/awrns007.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_CN/html/top.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/README.txt delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/InstallGd/awqbg000.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/InstallGd/awqbg002.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/InstallGd/awqbg003.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/InstallGd/awqbg004.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns000.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns002.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns003.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns004.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns005.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns006.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/ReleaseNotes/awrns007.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/banner.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/books.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/bot.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/index.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/index.htm delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/next.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/prev.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/toc.gif delete mode 100755 src/WINNT/doc/install/Documentation/zh_TW/html/top.gif delete mode 100644 src/WINNT/eventlog/NTMakefile delete mode 100644 src/WINNT/eventlog/lang/NTMakefile delete mode 100644 src/WINNT/eventlog/lang/afseventmsg.rc delete mode 100644 src/WINNT/eventlog/lang/de_DE/event.mc delete mode 100644 src/WINNT/eventlog/lang/en_US/event.mc delete mode 100644 src/WINNT/eventlog/lang/es_ES/event.mc delete mode 100644 src/WINNT/eventlog/lang/ja_JP/event.mc delete mode 100644 src/WINNT/eventlog/lang/ko_KR/event.mc delete mode 100644 src/WINNT/eventlog/lang/pt_BR/event.mc delete mode 100644 src/WINNT/eventlog/lang/zh_CN/event.mc delete mode 100644 src/WINNT/eventlog/lang/zh_TW/event.mc delete mode 100644 src/WINNT/eventlog/logevent.c delete mode 100644 src/WINNT/eventlog/logevent.h delete mode 100644 src/WINNT/eventlog/test/NTMakefile delete mode 100644 src/WINNT/eventlog/test/elogtest.c delete mode 100644 src/WINNT/install/InstallShield5/Build.tsb delete mode 100644 src/WINNT/install/InstallShield5/BuildSetup.bat delete mode 100644 src/WINNT/install/InstallShield5/CompileScript.bat delete mode 100644 src/WINNT/install/InstallShield5/CreateGeneratedFiles.bat delete mode 100644 src/WINNT/install/InstallShield5/CreateISDirTree.bat delete mode 100644 src/WINNT/install/InstallShield5/Default.cdf delete mode 100644 src/WINNT/install/InstallShield5/Default.fdf delete mode 100644 src/WINNT/install/InstallShield5/Default.fgl delete mode 100644 src/WINNT/install/InstallShield5/Default.shell delete mode 100644 src/WINNT/install/InstallShield5/Default.shl delete mode 100644 src/WINNT/install/InstallShield5/Default.txt delete mode 100644 src/WINNT/install/InstallShield5/DelISDirTree.bat delete mode 100644 src/WINNT/install/InstallShield5/GatherFiles.bat delete mode 100644 src/WINNT/install/InstallShield5/GenDefault.mda.bat delete mode 100644 src/WINNT/install/InstallShield5/GenFileGroups.bat delete mode 100644 src/WINNT/install/InstallShield5/GenIS5.ipr.bat delete mode 100755 src/WINNT/install/InstallShield5/HowToSetTheVersion.txt delete mode 100644 src/WINNT/install/InstallShield5/NTMakefile delete mode 100644 src/WINNT/install/InstallShield5/PackageWeb.pfw delete mode 100755 src/WINNT/install/InstallShield5/README.TXT delete mode 100644 src/WINNT/install/InstallShield5/ScatterFiles.bat delete mode 100644 src/WINNT/install/InstallShield5/Setup.tsb delete mode 100644 src/WINNT/install/InstallShield5/afsdcell.ini delete mode 100644 src/WINNT/install/InstallShield5/lang/de_DE/value.shl delete mode 100644 src/WINNT/install/InstallShield5/lang/en_US/value.txt delete mode 100644 src/WINNT/install/InstallShield5/lang/es_ES/value.shl delete mode 100644 src/WINNT/install/InstallShield5/lang/ja_JP/value.shl delete mode 100644 src/WINNT/install/InstallShield5/lang/ko_KR/value.shl delete mode 100644 src/WINNT/install/InstallShield5/lang/pt_BR/value.shl delete mode 100644 src/WINNT/install/InstallShield5/lang/zh_CN/value.shl delete mode 100644 src/WINNT/install/InstallShield5/lang/zh_TW/value.shl delete mode 100644 src/WINNT/install/InstallShield5/setup.bmp delete mode 100644 src/WINNT/install/InstallShield5/setup.rul delete mode 100644 src/WINNT/install/NSIS/AFSCell.ini delete mode 100644 src/WINNT/install/NSIS/AFSCreds.ini delete mode 100644 src/WINNT/install/NSIS/AdminGroup.cpp delete mode 100644 src/WINNT/install/NSIS/CellServDB delete mode 100644 src/WINNT/install/NSIS/CellServPage.ini delete mode 100644 src/WINNT/install/NSIS/MakeCommon.bat delete mode 100644 src/WINNT/install/NSIS/NTMakefile delete mode 100644 src/WINNT/install/NSIS/OpenAFS.nsi delete mode 100644 src/WINNT/install/NSIS/Service.cpp delete mode 100644 src/WINNT/install/NSIS/ServiceLib.nsh delete mode 100644 src/WINNT/install/NSIS/killer.cpp delete mode 100644 src/WINNT/install/Win9x/CellServDB delete mode 100644 src/WINNT/install/Win9x/NTMakeFile delete mode 100755 src/WINNT/install/Win9x/RUNONCE.PIF delete mode 100644 src/WINNT/install/Win9x/ReadMe.rtf delete mode 100644 src/WINNT/install/Win9x/install.bat delete mode 100644 src/WINNT/install/Win9x/license.txt delete mode 100644 src/WINNT/install/Win9x/setup.iss delete mode 100644 src/WINNT/install/Win9x/templet.reg delete mode 100644 src/WINNT/install/loopback/NTMakefile delete mode 100644 src/WINNT/install/loopback/instloop.c delete mode 100644 src/WINNT/install/loopback/loopbackutils.cpp delete mode 100644 src/WINNT/install/loopback/loopbackutils.h delete mode 100644 src/WINNT/install/loopback/renameconnection.cpp delete mode 100644 src/WINNT/install/loopback/wmi.cpp delete mode 100644 src/WINNT/install/wix/Binary/New.ico delete mode 100644 src/WINNT/install/wix/Binary/Up.ico delete mode 100644 src/WINNT/install/wix/Binary/bannrbmp.bmp delete mode 100644 src/WINNT/install/wix/Binary/completi.ico delete mode 100644 src/WINNT/install/wix/Binary/custicon.ico delete mode 100644 src/WINNT/install/wix/Binary/dlgbmp.bmp delete mode 100644 src/WINNT/install/wix/Binary/exclamic.ico delete mode 100644 src/WINNT/install/wix/Binary/info.ico delete mode 100644 src/WINNT/install/wix/Binary/insticon.ico delete mode 100644 src/WINNT/install/wix/Binary/removico.ico delete mode 100644 src/WINNT/install/wix/Binary/repairic.ico delete mode 100644 src/WINNT/install/wix/CellServDB delete mode 100644 src/WINNT/install/wix/Icon/ico_AcctManager.ico delete mode 100644 src/WINNT/install/wix/Icon/ico_Help.ico delete mode 100644 src/WINNT/install/wix/Icon/ico_ServerManager.ico delete mode 100644 src/WINNT/install/wix/Icon/ico_afscreds.ico delete mode 100644 src/WINNT/install/wix/Icon/ico_afssvrcfg.ico delete mode 100644 src/WINNT/install/wix/NTMakefile delete mode 100644 src/WINNT/install/wix/afsdesktop.ini delete mode 100644 src/WINNT/install/wix/config.wxi delete mode 100644 src/WINNT/install/wix/custom/NTMakefile delete mode 100644 src/WINNT/install/wix/custom/afscustom.cpp delete mode 100644 src/WINNT/install/wix/custom/afscustom.h delete mode 100644 src/WINNT/install/wix/feature.wxi delete mode 100644 src/WINNT/install/wix/files.wxi delete mode 100644 src/WINNT/install/wix/lang/de_DE/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/de_DE/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/en_US/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/en_US/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/en_US/strings.wxl delete mode 100644 src/WINNT/install/wix/lang/en_US/ui.wxi delete mode 100644 src/WINNT/install/wix/lang/es_ES/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/es_ES/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/ja_JP/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/ja_JP/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/ko_KR/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/ko_KR/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/pt_BR/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/pt_BR/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/zh_CN/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/zh_CN/Error.wxi delete mode 100644 src/WINNT/install/wix/lang/zh_TW/ActionText.wxi delete mode 100644 src/WINNT/install/wix/lang/zh_TW/Error.wxi delete mode 100644 src/WINNT/install/wix/language_config.wxi delete mode 100644 src/WINNT/install/wix/openafs.wxs delete mode 100644 src/WINNT/install/wix/property.wxi delete mode 100644 src/WINNT/install/wix/registry.wxi delete mode 100644 src/WINNT/install/wix/replace_afs.cmd delete mode 100644 src/WINNT/install/wix/runtime.wxi delete mode 100644 src/WINNT/install/wix/runtime_debug.wxi delete mode 100644 src/WINNT/kfw/inc/kclient/kclient.h delete mode 100644 src/WINNT/kfw/inc/kclient/kcmacerr.h delete mode 100644 src/WINNT/kfw/inc/krb4/com_err.h delete mode 100644 src/WINNT/kfw/inc/krb4/conf-pc.h delete mode 100644 src/WINNT/kfw/inc/krb4/conf.h delete mode 100644 src/WINNT/kfw/inc/krb4/des.h delete mode 100644 src/WINNT/kfw/inc/krb4/kadm_err.h delete mode 100644 src/WINNT/kfw/inc/krb4/krb.h delete mode 100644 src/WINNT/kfw/inc/krb4/krberr.h delete mode 100644 src/WINNT/kfw/inc/krb4/mit_copy.h delete mode 100644 src/WINNT/kfw/inc/krb4/osconf.h delete mode 100644 src/WINNT/kfw/inc/krb5/KerberosIV/des.h delete mode 100644 src/WINNT/kfw/inc/krb5/KerberosIV/kadm_err.h delete mode 100644 src/WINNT/kfw/inc/krb5/KerberosIV/krb.h delete mode 100644 src/WINNT/kfw/inc/krb5/KerberosIV/krb_err.h delete mode 100644 src/WINNT/kfw/inc/krb5/KerberosIV/mit-copyright.h delete mode 100644 src/WINNT/kfw/inc/krb5/com_err.h delete mode 100644 src/WINNT/kfw/inc/krb5/gssapi/gssapi.h delete mode 100644 src/WINNT/kfw/inc/krb5/gssapi/gssapi_generic.h delete mode 100644 src/WINNT/kfw/inc/krb5/gssapi/gssapi_krb5.h delete mode 100644 src/WINNT/kfw/inc/krb5/krb5.h delete mode 100644 src/WINNT/kfw/inc/krb5/profile.h delete mode 100644 src/WINNT/kfw/inc/krb5/win-mac.h delete mode 100644 src/WINNT/kfw/inc/krbcc/cacheapi.h delete mode 100644 src/WINNT/kfw/inc/leash/leasherr.h delete mode 100644 src/WINNT/kfw/inc/leash/leashinfo.h delete mode 100644 src/WINNT/kfw/inc/leash/leashwin.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-afs.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-afs36.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-com_err.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-krb.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-krb5.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-krb524.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-leash.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-lsa.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-profile.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs-wshelper.h delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs.c delete mode 100644 src/WINNT/kfw/inc/loadfuncs/loadfuncs.h delete mode 100644 src/WINNT/kfw/inc/wshelper/arpa/nameser.h delete mode 100644 src/WINNT/kfw/inc/wshelper/hesiod.h delete mode 100644 src/WINNT/kfw/inc/wshelper/mitwhich.h delete mode 100644 src/WINNT/kfw/inc/wshelper/resolv.h delete mode 100644 src/WINNT/kfw/inc/wshelper/wshelper.h delete mode 100644 src/WINNT/kfw/lib/i386/comerr32.lib delete mode 100644 src/WINNT/kfw/lib/i386/delaydlls.lib delete mode 100644 src/WINNT/kfw/lib/i386/getopt.lib delete mode 100644 src/WINNT/kfw/lib/i386/gssapi32.lib delete mode 100644 src/WINNT/kfw/lib/i386/kclnt32.lib delete mode 100644 src/WINNT/kfw/lib/i386/krb524.lib delete mode 100644 src/WINNT/kfw/lib/i386/krb5_32.lib delete mode 100644 src/WINNT/kfw/lib/i386/krbcc32.lib delete mode 100644 src/WINNT/kfw/lib/i386/krbv4w32.lib delete mode 100644 src/WINNT/kfw/lib/i386/leashw32.lib delete mode 100644 src/WINNT/kfw/lib/i386/loadfuncs.lib delete mode 100644 src/WINNT/kfw/lib/i386/wshelp32.lib delete mode 100644 src/WINNT/kfw/lib/i386/xpprof32.lib delete mode 100644 src/WINNT/license/NTMakefile delete mode 100644 src/WINNT/license/lang/NTMakefile delete mode 100644 src/WINNT/license/lang/de_DE.ide delete mode 100644 src/WINNT/license/lang/en_US.ide delete mode 100644 src/WINNT/license/lang/es_ES.ide delete mode 100644 src/WINNT/license/lang/ja_JP.ide delete mode 100644 src/WINNT/license/lang/ko_KR.ide delete mode 100644 src/WINNT/license/lang/pt_BR.ide delete mode 100644 src/WINNT/license/lang/readme.txt delete mode 100644 src/WINNT/license/lang/zh_CN.ide delete mode 100644 src/WINNT/license/lang/zh_TW.ide delete mode 100644 src/WINNT/license/main.cpp delete mode 100644 src/WINNT/license/multistring.cpp delete mode 100644 src/WINNT/license/multistring.h delete mode 100644 src/WINNT/pthread/NTMakefile delete mode 100644 src/WINNT/pthread/pthread.c delete mode 100644 src/WINNT/pthread/pthread.def delete mode 100644 src/WINNT/pthread/pthread.h delete mode 100644 src/WINNT/pthread/pthread.rc delete mode 100644 src/WINNT/pthread/pthread95.rc delete mode 100644 src/WINNT/pthread/test/NTMakefile delete mode 100644 src/WINNT/pthread/test/native.cpp delete mode 100644 src/WINNT/pthread/test/ptest.c delete mode 100644 src/WINNT/pthread/test/tsd.c delete mode 100644 src/WINNT/talocale/NTMakefile delete mode 100644 src/WINNT/talocale/tal_alloc.cpp delete mode 100644 src/WINNT/talocale/tal_alloc.h delete mode 100644 src/WINNT/talocale/tal_dialog.cpp delete mode 100644 src/WINNT/talocale/tal_dialog.h delete mode 100644 src/WINNT/talocale/tal_main.cpp delete mode 100644 src/WINNT/talocale/tal_string.cpp delete mode 100644 src/WINNT/talocale/tal_string.h delete mode 100644 src/WINNT/talocale/talocale.h delete mode 100644 src/WINNT/win9xpanel/CAfs.cpp delete mode 100644 src/WINNT/win9xpanel/CRegkey.cpp delete mode 100644 src/WINNT/win9xpanel/CRegkey.h delete mode 100644 src/WINNT/win9xpanel/CellServDB delete mode 100644 src/WINNT/win9xpanel/Change.cpp delete mode 100644 src/WINNT/win9xpanel/Change.h delete mode 100644 src/WINNT/win9xpanel/CommandSettings.cpp delete mode 100644 src/WINNT/win9xpanel/CommandSettings.h delete mode 100644 src/WINNT/win9xpanel/Datalog.cpp delete mode 100644 src/WINNT/win9xpanel/Datalog.h delete mode 100644 src/WINNT/win9xpanel/Encript.cpp delete mode 100644 src/WINNT/win9xpanel/Force.cpp delete mode 100644 src/WINNT/win9xpanel/Force.h delete mode 100755 src/WINNT/win9xpanel/Help/Advanced.mrb delete mode 100755 src/WINNT/win9xpanel/Help/PROGRESS.MRB delete mode 100755 src/WINNT/win9xpanel/Help/PROPER.MRB delete mode 100644 src/WINNT/win9xpanel/Help/afswin9x.cnt delete mode 100644 src/WINNT/win9xpanel/Help/afswin9x.hpj delete mode 100644 src/WINNT/win9xpanel/Help/afswin9x.rtf delete mode 100755 src/WINNT/win9xpanel/Help/icon.bmp delete mode 100644 src/WINNT/win9xpanel/MyFrame.cpp delete mode 100644 src/WINNT/win9xpanel/MyFrame.h delete mode 100644 src/WINNT/win9xpanel/NTMakefile delete mode 100644 src/WINNT/win9xpanel/ProgBarDlg.cpp delete mode 100644 src/WINNT/win9xpanel/ProgBarDlg.h delete mode 100644 src/WINNT/win9xpanel/Retry.cpp delete mode 100644 src/WINNT/win9xpanel/Retry.h delete mode 100644 src/WINNT/win9xpanel/Settings.cpp delete mode 100644 src/WINNT/win9xpanel/Settings.h delete mode 100644 src/WINNT/win9xpanel/StdAfx.cpp delete mode 100644 src/WINNT/win9xpanel/StdAfx.h delete mode 100644 src/WINNT/win9xpanel/TermWarn.cpp delete mode 100644 src/WINNT/win9xpanel/TermWarn.h delete mode 100644 src/WINNT/win9xpanel/Transbmp.cpp delete mode 100644 src/WINNT/win9xpanel/Transbmp.h delete mode 100644 src/WINNT/win9xpanel/TrayIcon.cpp delete mode 100644 src/WINNT/win9xpanel/TrayIcon.h delete mode 100644 src/WINNT/win9xpanel/Wait.cpp delete mode 100644 src/WINNT/win9xpanel/Wait.h delete mode 100644 src/WINNT/win9xpanel/WinAfsLoad.cpp delete mode 100644 src/WINNT/win9xpanel/WinAfsLoad.dep delete mode 100644 src/WINNT/win9xpanel/WinAfsLoad.h delete mode 100644 src/WINNT/win9xpanel/WinAfsLoad.rc delete mode 100644 src/WINNT/win9xpanel/WinAfsLoadDlg.cpp delete mode 100644 src/WINNT/win9xpanel/WinAfsLoadDlg.h delete mode 100644 src/WINNT/win9xpanel/api95.cpp delete mode 100644 src/WINNT/win9xpanel/api95.h delete mode 100644 src/WINNT/win9xpanel/cafs.h delete mode 100644 src/WINNT/win9xpanel/encript.h delete mode 100644 src/WINNT/win9xpanel/modver.cpp delete mode 100644 src/WINNT/win9xpanel/modver.h delete mode 100755 src/WINNT/win9xpanel/res/WinAfsLoad.ico delete mode 100755 src/WINNT/win9xpanel/res/world.bmp delete mode 100644 src/WINNT/win9xpanel/resource.h delete mode 100644 src/WINNT/win9xpanel/share.h delete mode 100644 src/packaging/MacOS/2.0.txt delete mode 100644 src/packaging/MacOS/CellServDB delete mode 100644 src/packaging/MacOS/CellServDB.list delete mode 100644 src/packaging/MacOS/License.rtf delete mode 100644 src/packaging/MacOS/Makefile delete mode 100644 src/packaging/MacOS/OpenAFS.Description.plist delete mode 100644 src/packaging/MacOS/OpenAFS.Info.plist delete mode 100644 src/packaging/MacOS/OpenAFS.info delete mode 100644 src/packaging/MacOS/OpenAFS.post_install delete mode 100644 src/packaging/MacOS/OpenAFS.pre_upgrade delete mode 100644 src/packaging/MacOS/ReadMe.rtf delete mode 100644 src/packaging/MacOS/afssettings.m delete mode 100644 src/packaging/MacOS/buildpkg.sh delete mode 100644 src/packaging/MacOS/csrvdbmerge.pl delete mode 100644 src/packaging/MacOS/settings.plist diff --git a/debian/changelog b/debian/changelog index 0051e522c..a30b587d2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,11 @@ openafs (1.3.82-1) unstable; urgency=low - Proper locking for preempt kernels. This bug manifested as an inability to shut down AFS cleanly. (Closes: #308399, #304040) - Correctly handle the inotify semaphore. (Closes: #303495) + * Repackage upstream to remove MacOS-specific files covered by the APSL. + Remove the WINNT directory to save space since we have to repackage + anyway. Provide a get-orig-source target to do the repackaging. * Apply patch from Chas Williams to fix stale cache data from deleted - files introduced in 1.3.82. + files, a bug introduced in 1.3.82. * In all cases, only build the module appropriate to the kernel we're building against. Building an SMP module against a non-SMP kernel fails due to missing defines. (Closes: #225907) @@ -14,9 +17,11 @@ openafs (1.3.82-1) unstable; urgency=low module naming. (Closes: #253168) Emphasize that the kernel source tree used for make-kpkg must be identically configured to the kernel the module will be used with. + * Update copyright with more complete information from upstream + src/LICENSE. * Simplify clean target. Upstream make distclean is now better. - -- + -- Russ Allbery Tue, 10 May 2005 21:09:55 -0700 openafs (1.3.81-5) unstable; urgency=low diff --git a/debian/copyright b/debian/copyright index a68b88be0..0bed00b2f 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,9 +1,20 @@ This package was debianized by Sam Hartman on Fri, 3 Nov 2000 23:41:41 -0500. -It was downloaded from the Openafs CVS repository. +It was downloaded from either: -Upstream Maintainers(s):openafs-gatekeepers@openafs.org + http://www.openafs.org/release/ + /afs/grand.central.org/software/openafs/ + +Upstream Maintainers: + + openafs-gatekeepers@openafs.org + +The upstream source has been repackaged to remove the src/packaging/MacOS +directory, which contained a file (afssettings.m) that was covered under +the Apple Public Source License 2.0. This license is not considered +DFSG-free. Since the repackaging was needed anyway, the WINNT directory +was also dropped, reducing the size of the upstream tarball by 8MB. Copyright: @@ -240,3 +251,93 @@ Copyright: party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + +Kerberos 5 ticket support in rxkad is subject to the following copyright: +/* + * Copyright (c) 1995, 1996, 1997, 2002 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +Some code in rxkad/ticket5.c is subject to the following copyright: +/* + * Copyright 1992, 2002 by the Massachusetts Institute of Technology. + * All Rights Reserved. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of M.I.T. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. Furthermore if you modify this software you must label + * your software as modified software and not distribute it in such a + * fashion that it might be confused with the original M.I.T. software. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + */ + +Some portions of Rx are subject to the following license: +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user or with the express written consent of + * Sun Microsystems, Inc. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ diff --git a/debian/rules b/debian/rules index fde9c03e5..8013401d6 100755 --- a/debian/rules +++ b/debian/rules @@ -40,6 +40,24 @@ moduledir = debian/$(modulepkg)/lib/modules/$(KVERS)/fs LINTIAN_PACKAGES = openafs-dbserver openafs-client openafs-fileserver +# These variable is used only by get-orig-source, which will normally only be +# run by maintainers. +VERSION = 1.3.82 +UPSTREAM = /afs/grand.central.org/software/openafs/$(VERSION) + +# Download the upstream source and do the repackaging that we have to do for +# DFSG reasons. This assumes AFS is mounted, as it's generally only used by +# the package maintainers. +get-orig-source: + cp $(UPSTREAM)/openafs-$(VERSION)-src.tar.gz . + tar xzf openafs-$(VERSION)-src.tar.gz + rm openafs-$(VERSION)-src.tar.gz + rm -r openafs-$(VERSION)/src/packaging/MacOS + rm -r openafs-$(VERSION)/src/WINNT + tar cf openafs_$(VERSION).orig.tar openafs-$(VERSION) + rm -r openafs-$(VERSION) + gzip -9 openafs_$(VERSION).orig.tar + configure: configure-stamp configure-stamp: dh_testdir diff --git a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.cpp b/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.cpp deleted file mode 100644 index 50ce00f39..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.cpp +++ /dev/null @@ -1,409 +0,0 @@ -// GetWebDll.cpp : Defines the initialization routines for the DLL. -// - -#include "stdafx.h" -#include "GetWebDll.h" -#include "getwebdllfun.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -// -// Note! -// -// If this DLL is dynamically linked against the MFC -// DLLs, any functions exported from this DLL which -// call into MFC must have the AFX_MANAGE_STATE macro -// added at the very beginning of the function. -// -// For example: -// -// extern "C" BOOL PASCAL EXPORT ExportedFunction() -// { -// AFX_MANAGE_STATE(AfxGetStaticModuleState()); -// // normal function body here -// } -// -// It is very important that this macro appear in each -// function, prior to any calls into MFC. This means that -// it must appear as the first statement within the -// function, even before any object variable declarations -// as their constructors may generate calls into the MFC -// DLL. -// -// Please see MFC Technical Notes 33 and 58 for additional -// details. -// - -///////////////////////////////////////////////////////////////////////////// -// CGetWebDllApp - -BEGIN_MESSAGE_MAP(CGetWebDllApp, CWinApp) - //{{AFX_MSG_MAP(CGetWebDllApp) - // NOTE - the ClassWizard will add and remove mapping macros here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CGetWebDllApp construction - -CGetWebDllApp::CGetWebDllApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CGetWebDllApp object - -CGetWebDllApp theApp; - - -LPCTSTR pszURL = NULL; -BOOL bStripMode = FALSE; -BOOL bProgressMode = FALSE; -DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS; - -DWORD dwHttpRequestFlags = - INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT; -// -//GET /updateCellServDB.jsp?type=bunk HTTP/1.1 -//Accept: */* -//Accept -Language: en -us -//Accept -Encoding: gzip , deflate -//User-Agent: ufilerNativeClient/1.0 (1.0; Windows NT) -//Host: 192.168.0.1 -//Connection: Keep -Alive - -const TCHAR szVersion[] = - _T("HTTP/1.1"); - -const TCHAR szHeaders[] = - _T("\ -Accept: */*\r\n\ -Accept -Language: en -us\r\n\ -Accept -Encoding: gzip , deflate\r\n\ -User-Agent: ufilerNativeClient/1.0 (1.0; Windows NT)\r\n\ -Host: 192.168.0.1\r\n\ -Connection: Keep -Alive\r\n"); - -CTearSession::CTearSession(LPCTSTR pszAppName, int nMethod) - : CInternetSession(pszAppName, 1, nMethod) -{ -} - -void CTearSession::OnStatusCallback(DWORD /* dwContext */, DWORD dwInternetStatus, - LPVOID /* lpvStatusInfomration */, DWORD /* dwStatusInformationLen */) -{ - if (!bProgressMode) - return; - - if (dwInternetStatus != INTERNET_STATUS_CONNECTED_TO_SERVER) - AfxMessageBox("Connection Not Made",MB_ICONERROR | MB_OK); - return; -} - -///////////////////////////////////////////////////////////////////////////// -// CTearException -- used if something goes wrong for us - -// TEAR will throw its own exception type to handle problems it might -// encounter while fulfilling the user's request. - -IMPLEMENT_DYNCREATE(CTearException, CException) - -CTearException::CTearException(int nCode) - : m_nErrorCode(nCode) -{ -} - -void ThrowTearException(int nCode) -{ - CTearException* pEx = new CTearException(nCode); - throw pEx; -} - -// StripTags() rips through a buffer and removes HTML tags from it. -// The function uses a static variable to remember its state in case -// a HTML tag spans a buffer boundary. - -void StripTags(LPTSTR pszBuffer) -{ - static BOOL bInTag = FALSE; - LPTSTR pszSource = pszBuffer; - LPTSTR pszDest = pszBuffer; - - while (*pszSource != '\0') - { - if (bInTag) - { - if (*pszSource == '>') - bInTag = FALSE; - pszSource++; - } - else - { - if (*pszSource == '<') - bInTag = TRUE; - else - { - *pszDest = *pszSource; - pszDest++; - } - pszSource++; - } - } - *pszDest = '\0'; -} - - -extern "C" -__declspec(dllexport) INT GetWebPage(LPSTR lpErrMsg,LPSTR lpFile,LPSTR lpCmdLine) -{ - CString emsg; -// emsg.Format("p1=[%s],p2=[%s]",lpFile,lpCmdLine); -// AfxMessageBox(emsg,MB_ICONERROR | MB_OK); - if ((strlen(lpCmdLine)==0) || (strlen(lpFile)==0)) - { - emsg="Parameter Error"; - return 1; - } - - int nRetCode = 0; - - CTearSession session(_T("TEAR - MFC Sample App"), dwAccessType); - CHttpConnection* pServer = NULL; - CHttpFile* pFile = NULL; - char *szParm=strstr(lpCmdLine,"?"); - try - { - // check to see if this is a reasonable URL - CFile ofile(lpFile,CFile::modeCreate|CFile::modeWrite); - - CString strServerName; - CString strObject; - INTERNET_PORT nPort; - DWORD dwServiceType; - - if (!AfxParseURL(lpCmdLine, dwServiceType, strServerName, strObject, nPort) || - dwServiceType != INTERNET_SERVICE_HTTP) - { - emsg="Error: can only use URLs beginning with http://"; - ThrowTearException(1); - } - - if (bProgressMode) - { - VERIFY(session.EnableStatusCallback(TRUE)); - } - - pServer = session.GetHttpConnection(strServerName, nPort); - pFile = pServer->OpenRequest( - CHttpConnection::HTTP_VERB_GET, - strObject, //updateCellServDB.jsp - NULL, // URL of document - 1, // context - NULL, - szVersion, - dwHttpRequestFlags); - pFile->AddRequestHeaders(szHeaders); - pFile->SendRequest(); - - DWORD dwRet; - pFile->QueryInfoStatusCode(dwRet); - - // if access was denied, prompt the user for the password - - if (dwRet == HTTP_STATUS_DENIED) - { - DWORD dwPrompt; - dwPrompt = pFile->ErrorDlg(NULL, ERROR_INTERNET_INCORRECT_PASSWORD, - FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, NULL); - - // if the user cancelled the dialog, bail out - - if (dwPrompt != ERROR_INTERNET_FORCE_RETRY) - { - emsg="Access denied: Invalid password"; - ThrowTearException(1); - } - - pFile->SendRequest(); - pFile->QueryInfoStatusCode(dwRet); - } - - CString strNewLocation; - pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); - - // were we redirected? - // these response status codes come from WININET.H - - if (dwRet == HTTP_STATUS_MOVED || - dwRet == HTTP_STATUS_REDIRECT || - dwRet == HTTP_STATUS_REDIRECT_METHOD) - { - CString strNewLocation; - pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); - - int nPlace = strNewLocation.Find(_T("Location: ")); - if (nPlace == -1) - { - emsg="Error: Site redirects with no new location"; - ThrowTearException(2); - } - - strNewLocation = strNewLocation.Mid(nPlace + 10); - nPlace = strNewLocation.Find('\n'); - if (nPlace > 0) - strNewLocation = strNewLocation.Left(nPlace); - - // close up the redirected site - - pFile->Close(); - delete pFile; - pServer->Close(); - delete pServer; - - if (bProgressMode) - { - emsg.Format("Caution: redirected to %s",(LPCTSTR) strNewLocation); - } - - // figure out what the old place was - if (!AfxParseURL(strNewLocation, dwServiceType, strServerName, strObject, nPort)) - { - emsg="Error: the redirected URL could not be parsed."; - ThrowTearException(2); - } - - if (dwServiceType != INTERNET_SERVICE_HTTP) - { - emsg="Error: the redirected URL does not reference a HTTP resource."; - ThrowTearException(2); - } - - // try again at the new location - pServer = session.GetHttpConnection(strServerName, nPort); - pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, - strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags); - pFile->AddRequestHeaders(szHeaders); - pFile->SendRequest(); - - pFile->QueryInfoStatusCode(dwRet); - if (dwRet != HTTP_STATUS_OK) - { - emsg.Format("Error: Got status code %d",dwRet); - ThrowTearException(2); - } - } - - - TCHAR sz[1024]; - while (pFile->ReadString(sz, 1023)) - { - if (bStripMode) - StripTags(sz); - ofile.Write(sz,strlen(sz)); - } - - pFile->Close(); - pServer->Close(); - ofile.Close(); - } - catch (CInternetException* pEx) - { - // catch errors from WinINet - - TCHAR szErr[1024]; - pEx->GetErrorMessage(szErr, 1024); - - CString emsg; - emsg.Format("Error: (%s)",szErr); - nRetCode = 2; - pEx->Delete(); - } - catch (CFileException* pEx) - { - TCHAR szErr[1024]; - pEx->GetErrorMessage(szErr, 1024); - - emsg.Format("File Error: (%s)",szErr); - nRetCode = 2; - pEx->Delete(); - } - catch (CTearException* pEx) - { - // catch things wrong with parameters, etc - - nRetCode = pEx->m_nErrorCode; - pEx->Delete(); - } - - if (pFile != NULL) - delete pFile; - if (pServer != NULL) - delete pServer; - session.Close(); - int len=strlen(lpErrMsg); - strncpy(lpErrMsg,emsg,len); - lpErrMsg[len]=0; - return nRetCode; -} - -extern "C" -__declspec(dllexport) INT GetUserLogon(LPSTR lpUserName) -{ - int nRetCode = 1; - ULONG nSize=strlen(lpUserName); - if (!GetUserName(lpUserName,&nSize)) nRetCode=0; - return nRetCode; -} - -extern "C" -__declspec(dllexport) INT BrowseFile(HWND hwndOwner,LPSTR lpstrTitle,LPSTR lpFileName,INT size) -{ - char *xptr; -// char msg[256]; - char *ptr=strrchr(lpFileName,'\\'); - int nFileOffset=0; - int nFileExtension=0; - if (ptr) - nFileOffset=ptr-lpFileName+1; - else { - ptr=strrchr(lpFileName,':'); - if (ptr) - nFileOffset=ptr-lpFileName; - } - if (ptr==NULL) - ptr=lpFileName; - if (xptr=strrchr(ptr,'.')) - nFileExtension=nFileOffset+(xptr-ptr); -// sprintf(msg,"Title: [%s] filename=[%s], %i,%i,%i",lpstrTitle,lpFileName,nFileOffset,nFileExtension,size); -// AfxMessageBox(msg,MB_OK); - OPENFILENAME data={ - sizeof(OPENFILENAME) //lStructSize - ,hwndOwner //hwndOwner - ,NULL // - ,"*.*" //lpstrFilter - ,NULL //lpstrCustomFilter - ,NULL //nMaxCustFilter - ,0 //nFilterIndex - ,lpFileName //lpstrFile - ,size //nMaxFile - at least 256 characters - ,NULL //lpstrFileTitle - ,0 //nMaxFileTitle - ,NULL //lpstrInitialDir - ,lpstrTitle //lpstrTitle - ,OFN_HIDEREADONLY|OFN_PATHMUSTEXIST //Flags - ,nFileOffset //nFileOffset - ,nFileExtension //nFileExtension - ,NULL //lpstrDefExt - ,NULL //lCustData - ,NULL //lpfnHook - ,NULL //lpTemplateName - }; - return GetOpenFileName(&data); -} \ No newline at end of file diff --git a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.def b/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.def deleted file mode 100644 index 4288460fe..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.def +++ /dev/null @@ -1,7 +0,0 @@ -; GetWebDll.def : Declares the module parameters for the DLL. - -LIBRARY "GetWebDll" -DESCRIPTION 'GetWebDll Windows Dynamic Link Library' - -EXPORTS - ; Explicit exports can go here diff --git a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.dep b/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.dep deleted file mode 100644 index 66661dabb..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.dep +++ /dev/null @@ -1,5 +0,0 @@ -# Microsoft Developer Studio Generated Dependency File, included by GetWebDll.mak - -.\GetWebDll.cpp : \ - ".\GetWebDll.h"\ - ".\GetWebDllFun.h"\ diff --git a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.h b/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.h deleted file mode 100644 index 314844794..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.h +++ /dev/null @@ -1,67 +0,0 @@ -// GetWebDll.h : main header file for the GETWEBDLL DLL -// - -#if !defined(AFX_GETWEBDLL_H__470FBE70_389E_11D5_A375_00105A6BCA62__INCLUDED_) -#define AFX_GETWEBDLL_H__470FBE70_389E_11D5_A375_00105A6BCA62__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CGetWebDllApp -// See GetWebDll.cpp for the implementation of this class -// - -class CGetWebDllApp : public CWinApp -{ -public: - CGetWebDllApp(); - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CGetWebDllApp) - //}}AFX_VIRTUAL - - //{{AFX_MSG(CGetWebDllApp) - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -class CTearSession : public CInternetSession -{ -public: - CTearSession(LPCTSTR pszAppName, int nMethod); - virtual void OnStatusCallback(DWORD dwContext, DWORD dwInternetStatus, - LPVOID lpvStatusInfomration, DWORD dwStatusInformationLen); -}; - - -class CTearException : public CException -{ - DECLARE_DYNCREATE(CTearException) - -public: - CTearException(int nCode = 0); - ~CTearException() { } - - int m_nErrorCode; -}; - -#endif // !defined(AFX_GETWEBDLL_H__470FBE70_389E_11D5_A375_00105A6BCA62__INCLUDED_) - - diff --git a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.rc b/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.rc deleted file mode 100644 index 7c5b0b015..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDll.rc +++ /dev/null @@ -1,122 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif //_WIN32\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - - - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "CompanyName", "\0" - VALUE "FileDescription", "GetWebDll DLL\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "GetWebDll\0" - VALUE "LegalCopyright", "Copyright (C) 2001\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename","GetWebDll.DLL\0" - VALUE "ProductName", "GetWebDll Dynamic Link Library\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDllFun.h b/src/WINNT/afs_setup_utils/GetWebDll/GetWebDllFun.h deleted file mode 100644 index db3d10c7a..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/GetWebDllFun.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -__declspec(dllexport) INT GetWebPage(LPSTR lpErrMsg,LPSTR lpFile,LPSTR lpCmdLine); - -__declspec(dllexport) INT GetUserLogon(LPSTR lpUserName); - -__declspec(dllexport) INT BrowseFile(HWND hwndOwner,LPSTR lpstrTitle,LPSTR lpFileFullName,INT fullsize); - -#ifdef __cplusplus -} -#endif - diff --git a/src/WINNT/afs_setup_utils/GetWebDll/Resource.h b/src/WINNT/afs_setup_utils/GetWebDll/Resource.h deleted file mode 100644 index 7f9b9e4ad..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/Resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by GETWEBDLL.RC -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS - -#define _APS_NEXT_RESOURCE_VALUE 18000 -#define _APS_NEXT_CONTROL_VALUE 18000 -#define _APS_NEXT_SYMED_VALUE 18000 -#define _APS_NEXT_COMMAND_VALUE 32771 -#endif -#endif diff --git a/src/WINNT/afs_setup_utils/GetWebDll/StdAfx.h b/src/WINNT/afs_setup_utils/GetWebDll/StdAfx.h deleted file mode 100644 index 866a939b5..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/StdAfx.h +++ /dev/null @@ -1,44 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__470FBE72_389E_11D5_A375_00105A6BCA62__INCLUDED_) -#define AFX_STDAFX_H__470FBE72_389E_11D5_A375_00105A6BCA62__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#include // MFC core and standard components -#include // MFC extensions - -#ifndef _AFX_NO_OLE_SUPPORT -#include // MFC OLE classes -#include // MFC OLE dialog classes -#include // MFC Automation classes -#endif // _AFX_NO_OLE_SUPPORT - - -#ifndef _AFX_NO_DB_SUPPORT -#include // MFC ODBC database classes -#endif // _AFX_NO_DB_SUPPORT - -#ifndef _AFX_NO_DAO_SUPPORT -#include // MFC DAO database classes -#endif // _AFX_NO_DAO_SUPPORT - -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#include - -#endif // !defined(AFX_STDAFX_H__470FBE72_389E_11D5_A375_00105A6BCA62__INCLUDED_) diff --git a/src/WINNT/afs_setup_utils/GetWebDll/ntmakefile b/src/WINNT/afs_setup_utils/GetWebDll/ntmakefile deleted file mode 100644 index abd0d7239..000000000 --- a/src/WINNT/afs_setup_utils/GetWebDll/ntmakefile +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Based on GetWebDll.dsp -RELDIR=WINNT\afs_setup_utils\GetWebDll -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -OUTDIR=$(OUT) -INTDIR=$(OUT) -# Begin Custom Macros -OutDir=. -# End Custom Macros - -INSTALL : "$(DESTDIR)\WinInstall\Config\GetWebDll.dll" - - -CLEAN :: - -@erase "$(INTDIR)\*.obj" - -@erase "$(OUTDIR)\GetWebDll.dll" - -@erase "$(OUTDIR)\GetWebDll.exp" - -@erase "$(OUTDIR)\GetWebDll.lib" - -@erase "$(OUTDIR)\GetWebDll.sbl" - -@erase "$(OUTDIR)\GetWebDll.pjt" - -CPP=cl.exe -CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_MBCS" /D "_USRDLL" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -MTL=midl.exe -MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32 -RSC=rc.exe -RSC_PROJ=/l 0x409 /fo"$(INTDIR)\GetWebDll.res" /d "NDEBUG" -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\GetWebDll.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\GetWebDll.pdb" /machine:I386 /def:".\GetWebDll.def" /out:"$(DESTDIR)\WinInstall\Config\GetWebDll.dll" /implib:"$(DESTDIR)\WinInstall\Config\GetWebDll.lib" -DEF_FILE= \ - ".\GetWebDll.def" -LINK32_OBJS= \ - "$(INTDIR)\GetWebDll.obj" \ - "$(INTDIR)\GetWebDll.res" - -"$(DESTDIR)\WinInstall\Config\GetWebDll.dll" : $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - - -!IF "$(NO_EXTERNAL_DEPS)" != "1" -!IF EXISTS("GetWebDll.dep") -!INCLUDE "GetWebDll.dep" -!ELSE -!MESSAGE Warning: cannot find "GetWebDll.dep" -!ENDIF -!ENDIF - - -SOURCE=.\GetWebDll.cpp - -"$(INTDIR)\GetWebDll.obj" : $(SOURCE) - - -SOURCE=.\GetWebDll.rc - -"$(INTDIR)\GetWebDll.res" : $(SOURCE) - $(RSC) $(RSC_PROJ) $(SOURCE) - diff --git a/src/WINNT/afs_setup_utils/NTMakefile b/src/WINNT/afs_setup_utils/NTMakefile deleted file mode 100644 index c5320f673..000000000 --- a/src/WINNT/afs_setup_utils/NTMakefile +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# include the primary makefile -RELDIR=WINNT\afs_setup_utils -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ - -ILIBDIR = $(DESTDIR)\lib\afs - - -############################################################################ -# Build targets - one for each dll we need to make - -INSTALL_UTILS_DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\InstallUtils.dll -SERVER_UNINST_DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\ServerUninst.dll -CLIENT_UNINST_DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\ClientUninst.dll -CC_UNINST_DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\CCUninst.dll -LIGHT_CLIENT_UNINST_DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\LightClientUninst.dll -DOCS_UNINST_DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\DocsUninst.dll - - -############################################################################ -# Source files and libraries that are shared by all of the targets. - -AFSAPPLIBOBJS = \ - $(OUT)\subclass.obj - -DLLOBJS = \ - $(AFSAPPLIBOBJS) \ - $(OUT)\progress_dlg.obj \ - $(OUT)\animate_icon.obj \ - $(OUT)\sutil.obj \ - $(OUT)\forceremove.obj \ - $(OUT)\afs_setup_utils_stub.res - -VCLIBS = \ - comctl32.lib \ - shell32.lib - -DLLLIBS = \ - $(DESTDIR)\lib\afs\TaLocale.lib \ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afsutil.lib - - -############################################################################ -# Definitions for building afsapplib objects - -AFSAPPLIBDIR = ..\..\WINNT\afsapplib - -$(OUT)\subclass.obj: $(AFSAPPLIBDIR)\subclass.cpp - $(C2OBJ) -I$(AFSAPPLIBDIR) $(AFSAPPLIBDIR)\subclass.cpp - - -############################################################################ -# Definitions for building afsrm.exe - -AFSRM_EXEFILE = $(DESTDIR)\bin\afsrm.exe - -AFSRM_EXEOBJS =\ - $(OUT)\afsrm.obj \ - $(OUT)\forceremove.obj \ - $(OUT)\sutil.obj \ - $(OUT)\AFS_component_version_number.obj - -AFSRM_EXELIBS =\ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afscmd.lib \ - $(DESTDIR)\lib\afs\afscom_err.lib \ - $(DESTDIR)\lib\afs\afsutil.lib - -$(AFSRM_EXEFILE): $(AFSRM_EXEOBJS) $(AFSRM_EXELIBS) - $(EXECONLINK) - -############################################################################ - -DIRLANG= ZH_TW ZH_CN PT_BR KO_KR JA_JP ES_ES EN_US DE_DE - -install : $(INSTALL_UTILS_DLLFILE) $(SERVER_UNINST_DLLFILE) $(CLIENT_UNINST_DLLFILE) \ - $(CC_UNINST_DLLFILE) $(LIGHT_CLIENT_UNINST_DLLFILE) $(DOCS_UNINST_DLLFILE) \ - $(AFSRM_EXEFILE) $(DIRLANG) - cd _isuser - nmake -fntmakefile install - $(CD) .. - cd getwebdll - nmake -fntmakefile install - $(CD) .. - echo - -$(DIRLANG) :: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - echo done lang - -############################################################################ -# How to build the shared source file for each uninstall dll - -C2OBJ = $(C2OBJ) -DSERVER_UNINST - -$(OUT)\s_afs_setup_utils.obj: afs_setup_utils.cpp - $(C2OBJ) $** - -$(OUT)\c_afs_setup_utils.obj: afs_setup_utils.cpp - $(C2OBJ) $** - -$(OUT)\cc_afs_setup_utils.obj: afs_setup_utils.cpp - $(C2OBJ) $** - -$(OUT)\lc_afs_setup_utils.obj: afs_setup_utils.cpp - $(C2OBJ) $** - -$(OUT)\d_afs_setup_utils.obj: afs_setup_utils.cpp - $(C2OBJ) $** - - -############################################################################ - -$(INSTALL_UTILS_DLLFILE) : $(OUT)\afs_setup_utils.obj $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) -entry:DllEntryPoint /DEF:install_utils.def $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -$(SERVER_UNINST_DLLFILE) : $(OUT)\s_afs_setup_utils.obj $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) -entry:DllEntryPoint /DEF:server_uninst.def $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -$(CLIENT_UNINST_DLLFILE) : $(OUT)\c_afs_setup_utils.obj $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) -entry:DllEntryPoint /DEF:client_uninst.def $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -$(CC_UNINST_DLLFILE) : $(OUT)\cc_afs_setup_utils.obj $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) -entry:DllEntryPoint /DEF:cc_uninst.def $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -$(LIGHT_CLIENT_UNINST_DLLFILE) : $(OUT)\lc_afs_setup_utils.obj $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) -entry:DllEntryPoint /DEF:light_client_uninst.def $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -$(DOCS_UNINST_DLLFILE) : $(OUT)\d_afs_setup_utils.obj $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) -entry:DllEntryPoint /DEF:docs_uninst.def $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - - -############################################################################ - -clean:: - $(CD) _isuser - nmake -fntmakefile clean - $(CD) .. - $(CD) getwebdll - nmake -fntmakefile clean - $(CD) .. - echo done clean - cd _isuser - nmake -fntmakefile clean - $(CD) .. - cd getwebdll - nmake -fntmakefile clean - $(CD) .. - echo - -############################################################################ -# -# Dependencies -# - -$(OUT)\afs_setup_utils_stub.res : afs_setup_utils_stub.rc AFS_component_version_number.h - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. diff --git a/src/WINNT/afs_setup_utils/_isuser/_IsUser.RC b/src/WINNT/afs_setup_utils/_isuser/_IsUser.RC deleted file mode 100644 index fb4a8d7ae..000000000 --- a/src/WINNT/afs_setup_utils/_isuser/_IsUser.RC +++ /dev/null @@ -1,188 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -DLG_DRIVEPATH DIALOGEX 0, 0, 332, 218 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select Local Drive Mapping" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",52,0,0,332,36 - LTEXT "Enable Assignment, choose drive letter and define AFS mount point path.", - 901,17,41,289,19,SS_NOPREFIX - LTEXT "Map local drive letter to AFS mount point.",50,10,3,220, - 8,0,WS_EX_TRANSPARENT - LTEXT "AFS service can map drive letters to AFS mount points.\nBoth Letters and mounts points can be configured!", - 51,17,12,273,22,0,WS_EX_TRANSPARENT - CONTROL "",1301,"Static",SS_ETCHEDHORZ | WS_GROUP,0,36,332,1 - DEFPUSHBUTTON "&Next >",SD_PBUT_CONTINUE,215,196,50,14 - PUSHBUTTON "Cancel",SD_PBUT_CANCEL,272,196,50,14 - PUSHBUTTON "< &Back",SD_PBUT_BACK,166,196,50,14 - CONTROL "",SD_STA_IMAGE_2,"Static",SS_BLACKFRAME,54,185,268,1 - LTEXT "",7,10,182,40,10,NOT WS_VISIBLE - COMBOBOX IDC_HOMEDRIVELIST,17,151,41,76,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - GROUPBOX "Root Drive Assignment",IDC_STATIC,2,62,323,52,WS_GROUP - EDITTEXT IDC_HOMEPATH,66,151,258,12,ES_AUTOHSCROLL | - ES_OEMCONVERT | WS_GROUP - LTEXT "Drive",IDC_STATIC,17,139,17,8 - LTEXT "Path",IDC_STATIC,66,139,15,8 - COMBOBOX IDC_ROOTDRIVELIST,17,94,40,76,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - GROUPBOX "Home Drive Assignment",IDC_STATIC,5,117,323,56,WS_GROUP - EDITTEXT IDC_ROOTPATH,66,94,254,12,ES_AUTOHSCROLL | ES_OEMCONVERT | - WS_GROUP - LTEXT "Drive",IDC_STATIC,17,84,17,8 - LTEXT "Path",IDC_STATIC,66,84,15,8 - LTEXT "@10550,10551;1;0;;0,128,128 ",1200,0,0,332,36,NOT - WS_VISIBLE,WS_EX_TRANSPARENT - PUSHBUTTON "C",3,21,200,25,12,NOT WS_VISIBLE | WS_GROUP | NOT - WS_TABSTOP - CONTROL "Enable Assigment",IDC_ENABLEROOT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,72,71,10 - CONTROL "Enable Assigment",IDC_ENABLEHOME,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,9,128,71,10 -END - -DLG_CELLSERVDB DIALOGEX 0, 0, 336, 228 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select AFS Cell Data Base (afsdcell.ini)" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",52,0,0,336,36 - LTEXT "Select the data base from one of the following source locations.", - 901,17,41,289,15,SS_NOPREFIX - LTEXT "Choose Source location:",50,10,3,220,8,0, - WS_EX_TRANSPARENT - LTEXT "AFS Cell Data Base contains the list of available AFS cells and their IP addresses.", - 51,17,15,275,19,0,WS_EX_TRANSPARENT - CONTROL "",1301,"Static",SS_ETCHEDHORZ | WS_GROUP,0,36,336,1 - DEFPUSHBUTTON "&Next >",SD_PBUT_CONTINUE,215,196,50,14 - PUSHBUTTON "Cancel",SD_PBUT_CANCEL,272,196,50,14 - PUSHBUTTON "< &Back",SD_PBUT_BACK,166,196,50,14 - CONTROL "",SD_STA_IMAGE_2,"Static",SS_BLACKFRAME,54,185,268,1 - LTEXT "",7,10,182,40,10,NOT WS_VISIBLE - LTEXT "@10550,10551;1;0;;0,128,128 ",1200,0,0,336,36,NOT - WS_VISIBLE,WS_EX_TRANSPARENT - PUSHBUTTON "C",3,21,200,25,12,NOT WS_VISIBLE | WS_GROUP | NOT - WS_TABSTOP - PUSHBUTTON "B&rowse...",IDC_BROWSE,262,160,46,14 - GROUPBOX "Download from Web Address",IDC_STATIC,108,115,205,31 - GROUPBOX "Select File",IDC_STATIC,108,150,205,31 - EDITTEXT IDC_WEB,115,126,180,12,ES_AUTOHSCROLL | ES_OEMCONVERT | - WS_GROUP - GROUPBOX "Packaged Installation File",IDC_STATIC,108,87,205,23, - WS_GROUP - LTEXT "General.org",IDC_INSTALL,114,96,187,10 - GROUPBOX "",IDC_STATIC,90,58,15,124,NOT WS_VISIBLE | WS_GROUP - CONTROL "",IDC_CHECK_INSTALL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,94,96,8,10 - CONTROL "",IDC_CHECK_WEB,"Button",BS_AUTORADIOBUTTON | WS_GROUP, - 94,125,8,10 - CONTROL "",IDC_CHECK_BROWSEFILE,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,94,160,8,10 - CONTROL "",IDC_CHECK_PREVIOUSFILE,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,94,70,8,10 - LTEXT "",IDC_PREVIOUSFILE,114,71,189,8 - GROUPBOX "Previous Installation",IDC_STATIC,108,58,205,26, - WS_GROUP - EDITTEXT IDC_BROWSEFILE,113,161,142,12,ES_AUTOHSCROLL -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""sdrc.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -//10000 ICON DISCARDABLE "icon1.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - DLG_CELLSERVDB, DIALOG - BEGIN - RIGHTMARGIN, 332 - BOTTOMMARGIN, 218 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afs_setup_utils/_isuser/_isuser.c b/src/WINNT/afs_setup_utils/_isuser/_isuser.c deleted file mode 100644 index 0c1007485..000000000 --- a/src/WINNT/afs_setup_utils/_isuser/_isuser.c +++ /dev/null @@ -1,21 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// -// IIIIIII SSSSSS -// II SS InstallShield (R) -// II SSSSSS (c) 1996-2000, InstallShield Software Corporation -// II SS (c) 1990-1996, InstallShield Corporation -// IIIIIII SSSSSS All Rights Reserved. -// -// -//////////////////////////////////////////////////////////////////////////////// - -#define NOCOMM -#include - - -BOOL WINAPI DllMain( PVOID hmod, ULONG ulReason, PCONTEXT pctx ) -{ - return TRUE; -} - diff --git a/src/WINNT/afs_setup_utils/_isuser/ntmakefile b/src/WINNT/afs_setup_utils/_isuser/ntmakefile deleted file mode 100644 index 0e73bbedf..000000000 --- a/src/WINNT/afs_setup_utils/_isuser/ntmakefile +++ /dev/null @@ -1,90 +0,0 @@ -# include the primary makefile - -RELDIR=WINNT\afs_setup_utils\_isuser -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) - -# Microsoft Developer Studio Generated NMAKE File, Based on _IsUser.dsp -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -OUTDIR=$(OUT) -INTDIR=$(OUT) - -INSTALL : "$(DESTDIR)\WinInstall\Config\_IsUser.dll" - $(DEL) *.PCH - $(DEL) *.IDB - -CLEAN :: - -@erase "$(INTDIR)\_isuser.obj" - -@erase "$(INTDIR)\_Isuser.res" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(OUTDIR)\_IsUser.dll" - -@erase "$(OUTDIR)\_IsUser.exp" - -@erase "$(OUTDIR)\_IsUser.lib" - -CPP=cl.exe -CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ISUSER_EXPORTS" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c.{$(OUT)\}obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp.{$(OUT)\}obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx.{$(OUT)\}obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c.$(OUT)\sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp.$(OUT)\sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx.$(OUT)\sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -MTL=midl.exe -MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32 -RSC=rc.exe -RSC_PROJ=/l 0x409 /fo"$(INTDIR)\_Isuser.res" /d "NDEBUG" -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\_IsUser.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"$(OUTDIR)\_IsUser.pdb" /machine:I386 /out:"$(DESTDIR)\WinInstall\Config\_IsUser.dll" /implib:"$(OUTDIR)\_IsUser.lib" -LINK32_OBJS= \ - "$(INTDIR)\_isuser.obj" \ - "$(INTDIR)\_Isuser.res" - -"$(DESTDIR)\WinInstall\Config\_IsUser.dll" : $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -SOURCE=.\_isuser.c - -"$(INTDIR)\_isuser.obj" : $(SOURCE) - -SOURCE=.\_Isuser.RC - -"$(INTDIR)\_Isuser.res" : $(SOURCE) - $(RSC) $(RSC_PROJ) $(SOURCE) - - -mkdir: diff --git a/src/WINNT/afs_setup_utils/_isuser/resource.h b/src/WINNT/afs_setup_utils/_isuser/resource.h deleted file mode 100644 index 6f5440c8d..000000000 --- a/src/WINNT/afs_setup_utils/_isuser/resource.h +++ /dev/null @@ -1,38 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by _IsUser.RC -// -#define IDC_HOMEPATH 301 -#define IDC_ROOTPATH 302 -#define IDC_HOMEDRIVELIST 1007 -#define IDC_ROOTDRIVELIST 1008 -#define IDC_ENABLEROOT 1010 -#define IDC_ENABLEHOME 1011 -#define IDC_INSTALL 1011 -#define IDC_WEB 1016 -#define IDC_CHECK_INSTALL 1018 -#define IDC_CHECK_WEB 1019 -#define IDC_CHECK_FILE 1020 -#define IDC_CHECK_BROWSEFILE 1020 -#define IDC_CHECK_DEFAULT 1021 -#define IDC_CHECK_PREVIOUSFILE 1021 -#define IDC_PREVIOUSFILE 1024 -#define IDC_BROWSE 1025 -#define IDC_BROWSEFILE 1026 -#define DLG_TEMPLATE 13029 -#define DLG_DRIVEPATH 13030 -#define DLG_CELLSERVDB 13031 -#define IDC_PATH 13032 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 104 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1028 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/afs_setup_utils/afs_setup_utils.cpp b/src/WINNT/afs_setup_utils/afs_setup_utils.cpp deleted file mode 100644 index 5ef39ca1f..000000000 --- a/src/WINNT/afs_setup_utils/afs_setup_utils.cpp +++ /dev/null @@ -1,2106 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ - -extern "C" { -#include -#include -#include -} - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "resource.h" -#include "progress_dlg.h" -#include "sutil.h" -#include "forceremove.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static char *GetAppInstallDir(struct APPINFO *pApp, BOOL bRemembered); -BOOL UninstallCredsTool(); -BOOL ServerSpecificUninstall(); -BOOL ClientSpecificUninstall(); - - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -#define SUCALLCONV WINAPI - -#define UNINSTALL_TEMP_INFO_KEY "HKEY_LOCAL_MACHINE\\Software\\AfsUninstallTempInfo" -#define INSTALL_DIR_VALUE_NAME "InstallDir" - -#define AFS_PRESERVED_CFG_INFO_KEY "HKEY_LOCAL_MACHINE\\Software\\AfsPreservedConfigInfo" - -#define MS_SHARED_FILES_KEY "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs" - -// Log file to use when running in silent mode -#define UNINSTALL_ERROR_LOG_NAME "\\AfsUninstallErrorLog.txt" -#define INSTALL_ERROR_LOG_NAME "\\AfsInstallErrorLog.txt" - -#define TARGETDIR "" -#define WINDIR "" -#define WINSYSDIR "" - -#define WIN9X_START_MENU_REG_KEY "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" -#define WIN9X_START_MENU_REG_VALUE "Programs" - -#define WINNT_START_MENU_REG_KEY "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" -#define WINNT_START_MENU_REG_VALUE "Common Programs" - -#define LOCALE_ID_LEN 4 - -struct REGVALUE { - char *pszKey; - char *pszValue; -}; - - -typedef BOOL (APP_UNINSTALL_FUNC)(); - - - -struct APPINFO { - char *pszAppName; - - // Service Info - char *pszSvcName; - char *pszSvcKey; - char *pszSvcDependOn; - char *pszSvcDisplayName; - - char *pszNetworkProviderOrder; - - // Message to use to tell the user that we have to stop the service - int nServiceShutdownMsgID; - - // Message to use for the progress dialog that is shown while - // waiting for the service to stop. - int nServiceShutdownProgressMsgID; - - // Location in registry of a key we can use to know that the app is installed - char *pszAppKey; - - // Location in registry of this app's install dir - struct REGVALUE regInstallDir; - - // Path Info - char *pszLocalRoot; // The root dir below the install dir - char *pszBinPath; // Path to remove from the system path - - // Generated files and directories to delete. These are both multistring lists. - char *pszDirsToDel; // All files in these dirs will be deleted - char *pszFilesToDel; // Use this if you want to delete files but leave the dir. Wildcards can be used. - - // Registry values to remove - struct REGVALUE *pRegValues; - struct REGVALUE *pWinNTRegValues; // Only remove these if running WinNT - struct REGVALUE *pWin9XRegValues; // Only remove these if running Win9X - - // Start menu entries to delete - char *pszStartMenuEntries; - - // Registry keys to save if a user wants to preserve config info during uninstall - char *pszRegKeysToPreserve; - int nPreserveConfigInfoMsgID; - - // Uninstall func - used for things specific to this app - APP_UNINSTALL_FUNC *pUninstallFunc; -}; - - -/* - * App info structure for the Server product - */ -struct APPINFO appServer = { - "AFS Server", - - AFSREG_SVR_SVC_NAME, - AFSREG_SVR_SVC_KEY, - 0, // No depend on - AFSREG_SVR_SVC_DISPLAYNAME_DATA, - - 0, // No network provider order - - IDS_MUST_STOP_SERVER, - IDS_WAITING_FOR_SERVER_TO_STOP, - - AFSREG_SVR_SW_VERSION_KEY, - - { AFSREG_SVR_SW_VERSION_KEY, AFSREG_SVR_SW_VERSION_DIR_VALUE }, - - "\\Server", - "\\usr\\afs\\bin", - - // Dirs to delete - TARGETDIR"\\Server\\usr\\afs\\bin\\backup\0" - TARGETDIR"\\Server\\usr\\afs\\bin\0" - TARGETDIR"\\Server\\usr\\afs\\db\0" - TARGETDIR"\\Server\\usr\\afs\\logs\0" - TARGETDIR"\\Server\\usr\\afs\\etc\0" - TARGETDIR"\\Server\\usr\\afs\\local\0" - TARGETDIR"\\Server\\usr\\afs\0" - TARGETDIR"\\Server\\usr\0", - - // Files to delete - TARGETDIR"\\Common\\*.gid\0" - TARGETDIR"\\Common\\*.fts\0", - - 0, // No reg values - 0, // No NT only reg values - 0, // No 9x only reg values - - "Server\0", - - // Config info to preserve - AFSREG_SVR_SVC_KEY"\0", - IDS_PRESERVE_SERVER_CONFIG_INFO, - - 0 // No special uninstall function -}; - -// Registry values to remove for the Client -struct REGVALUE clientRegValues[] = { - { "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", "{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}" }, - { 0, 0 } // This indicates there are no more entries -}; - -struct REGVALUE clientWinNTRegValues[] = { - { "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\File Manager\\AddOns", "AFS Client FME" }, - { "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters", "SMBDeviceEnabled" }, - { 0, 0 } -}; - -struct REGVALUE clientWin9XRegValues[] = { - { "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\NetworkProvider\\Order", "TransarcAFSDaemon" }, - { 0, 0 } -}; - -/* - * App info structure for the Client product - */ -struct APPINFO appClient = { - "AFS Client", - - AFSREG_CLT_SVC_NAME, - AFSREG_CLT_SVC_KEY, - "5250435353004E657462696F730000", - AFSREG_CLT_SVC_DISPLAYNAME_DATA, - - AFSREG_CLT_SVC_NAME, - - IDS_MUST_STOP_CLIENT, - IDS_WAITING_FOR_CLIENT_TO_STOP, - - AFSREG_CLT_SW_VERSION_KEY, - - { AFSREG_CLT_SW_VERSION_KEY, AFSREG_CLT_SW_VERSION_DIR_VALUE }, - - "\\Client", - "\\Program", - - // No dirs to delete - 0, - - // Files to delete - TARGETDIR"\\Common\\*.gid\0" - TARGETDIR"\\Common\\*.fts\0" - WINDIR"\\..\\AFSCache\0" - WINDIR"\\TEMP\\afsd.log\0" - TARGETDIR"\\Client\\afsd.ini\0" - TARGETDIR"\\Client\\afsdsbmt.ini\0" - TARGETDIR"\\Client\\afsdcell.ini\0" - WINDIR"\\TEMP\\afsd_init.log\0", - - clientRegValues, - clientWinNTRegValues, - clientWin9XRegValues, - - // Start menu entries to remove - "Client\0", - - // Config info to preserve - AFSREG_CLT_SVC_KEY"\0", - IDS_PRESERVE_CLIENT_CONFIG_INFO, - - ClientSpecificUninstall -}; - - -/* - * App info structure for the Light Client product - */ -struct APPINFO appLightClient = { - "AFS Light", - - // No service info - 0, - 0, - 0, - 0, - - AFSREG_CLT_SVC_NAME, - - // No service shutdown messages - 0, - 0, - - "HKEY_LOCAL_MACHINE\\SOFTWARE\\TransarcCorporation\\AFS Light Client", - - { AFSREG_CLT_SW_VERSION_KEY, AFSREG_CLT_SW_VERSION_DIR_VALUE }, - - "\\Client", - "\\Program", - - // No dirs to delete - 0, - - // Files to delete - TARGETDIR"\\Common\\*.gid\0" - TARGETDIR"\\Common\\*.fts\0", - - clientRegValues, - clientWinNTRegValues, - clientWin9XRegValues, - - // Start menu entries to remove - "Light\0", - - // Config info to preserve - AFSREG_CLT_SVC_KEY"\0", - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO, - - UninstallCredsTool -}; - - -/* - * App info structure for the Control Center product - */ -struct APPINFO appControlCenter = { - "AFS Control Center", - - // No service info - 0, - 0, - 0, - 0, - - // No network provider order - 0, - - // No service shutdown messages - 0, - 0, - - "HKEY_LOCAL_MACHINE\\SOFTWARE\\TransarcCorporation\\AFS Control Center", - - { "HKEY_LOCAL_MACHINE\\SOFTWARE\\TransarcCorporation\\AFS Control Center\\CurrentVersion", "PathName" }, - - "\\Control Center", - "", - - // No dirs to delete - 0, - - // Files to delete - TARGETDIR"\\Common\\*.gid\0" - TARGETDIR"\\Common\\*.fts\0", - - 0, // No reg values - 0, // No NT only reg values - 0, // No 9x only reg values - - // Start menu entries to remove - "Control Center\0", - - // Config info to preserve - AFSREG_CLT_SVC_KEY"\0", - IDS_PRESERVE_CC_CONFIG_INFO, - - 0 // No uninstall function -}; - - -/* - * App info structure for the Sys Admin Doc files - */ -struct APPINFO appDocs = { - "AFS Supplemental Documentation", - - // No service info - 0, - 0, - 0, - 0, - - // No network provider order - 0, - - // No service shutdown messages - 0, - 0, - - "HKEY_LOCAL_MACHINE\\SOFTWARE\\TransarcCorporation\\AFS Supplemental Documentation", - - { "HKEY_LOCAL_MACHINE\\SOFTWARE\\TransarcCorporation\\AFS Supplemental Documentation\\CurrentVersion", "PathName" }, - - "\\Documentation", - "", - - // No dirs to delete - 0, - - // Files to delete - TARGETDIR"\\Common\\*.gid\0" - TARGETDIR"\\Common\\*.fts\0", - - 0, // No reg values - 0, // No NT only reg values - 0, // No 9x only reg values - - // Start menu entries to remove - "Documentation\\AFS for Windows Backup Command Reference.lnk\0Documentation\\AFS Command Reference Manual.lnk\0Documentation\\AFS System Administrator's Guide.lnk\0", - - 0, // No config info to preserve - - 0 // No uninstall function -}; - - -// Shared and in-use files -struct FILEINFO { - char *pszName; - int nUsedBy; -}; - -#define SERVER 1 -#define CLIENT 2 -#define LCLIENT 4 -#define CC 8 -#define DOCS 16 - - -struct FILEINFO fileInfo[] = { - { TARGETDIR"\\Common\\afsbosadmin.dll", SERVER | CC }, - { TARGETDIR"\\Common\\afscfgadmin.dll", SERVER | CC }, - { TARGETDIR"\\Common\\afsclientadmin.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afskasadmin.dll", SERVER | CC }, - { TARGETDIR"\\Common\\afsptsadmin.dll", SERVER | CC }, - { TARGETDIR"\\Common\\afsvosadmin.dll", SERVER | CC }, - { TARGETDIR"\\Common\\afsadminutil.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afsrpc.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afsauthent.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afspthread.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\TaAfsAppLib.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afsprocmgmt.dll", SERVER | CLIENT | LCLIENT }, - { TARGETDIR"\\Common\\afs_config.exe", CLIENT | LCLIENT| CC }, - { TARGETDIR"\\Common\\afseventmsg_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afslegal_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afsserver_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afssvrcfg_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\TaAfsAccountManager_????.dll",SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\TaAfsAppLib_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\TaAfsServerManager_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afscreds_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs_config_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs_cpa_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs_shl_ext_????.dll", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs-nt.hlp", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs-nt.cnt", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\taafssvrmgr.cnt", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\taafssvrmgr.hlp", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\taafsusrmgr.cnt", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\taafsusrmgr.hlp", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs-cc.cnt", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs-cc.hlp", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs-light.cnt", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\afs-light.hlp", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\taafscfg.cnt", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Common\\taafscfg.hlp", SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Client\\PROGRAM\\afs_shl_ext.dll", CLIENT | LCLIENT }, - { TARGETDIR"\\Client\\PROGRAM\\libafsconf.dll", CLIENT | LCLIENT }, - { TARGETDIR"\\Client\\PROGRAM\\afslogon.dll", CLIENT }, - { TARGETDIR"\\Client\\PROGRAM\\afslog95.dll", LCLIENT }, - { TARGETDIR"\\Control Center\\TaAfsAdmSvr.exe", CC }, - { WINSYSDIR"\\afs_cpa.cpl", CLIENT | LCLIENT | CC }, - { WINSYSDIR"\\afsserver.cpl", SERVER }, - { TARGETDIR"\\Common\\afsdcell.ini", CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Documentation\\Html\\banner.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\books.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\bot.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\index.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\index.htm", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\next.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\prev.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\toc.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\top.gif", SERVER | CLIENT | LCLIENT | CC | DOCS }, - { TARGETDIR"\\Documentation\\Html\\ReleaseNotes\\relnotes.htm", - SERVER | CLIENT | LCLIENT | CC }, - { TARGETDIR"\\Documentation\\Html\\InstallGd\\afsnt35i.htm", - SERVER | CLIENT | LCLIENT | CC }, - { 0, 0 } // End of list -}; - - -/* - * VARIABLES _________________________________________________________________ - * - */ -HINSTANCE hinst; - -static HWND hDlg; -static BOOL bPreserveConfigInfo; -static BOOL bSilentMode; -static char *pszInstallDir; - - -/* - * FUNCTIONS _________________________________________________________________ - * - */ - -static BOOL UpgradeClientIntParm(HKEY hKey, char *pszOldParm, char *pszNewParm) -{ - int nData; - LONG result = ERROR_SUCCESS; - - nData = GetPrivateProfileInt("AFS Client", pszOldParm, -1, "afsd.ini"); - if (nData > -1) - result = RegSetValueEx(hKey, pszNewParm, 0, REG_DWORD, (BYTE *)&nData, sizeof(nData)); - - return (result == ERROR_SUCCESS); -} - -static BOOL UpgradeClientStringParm(HKEY hKey, char *pszOldParm, char *pszNewParm) -{ - char szData[1024]; - LONG result = ERROR_SUCCESS; - - GetPrivateProfileString("AFS Client", pszOldParm, "", szData, sizeof(szData), "afsd.ini"); - if (szData[0]) - result = RegSetValueEx(hKey, pszNewParm, 0, REG_SZ, (PBYTE)szData, strlen(szData) + 1); - - return (result == ERROR_SUCCESS); -} - -int SUCALLCONV Upgrade34ClientConfigInfo() -{ - HKEY hKey; - LONG result; - int nData; - - result = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_CLT_SVC_PARAM_KEY, KEY_WRITE, TRUE, &hKey, 0); - if (result != ERROR_SUCCESS) - return -1; - - UpgradeClientIntParm(hKey, "CacheSize", "CacheSize"); - UpgradeClientIntParm(hKey, "Stats", "Stats"); - UpgradeClientIntParm(hKey, "LogoffTokenTransfer", "LogoffTokenTransfer"); - UpgradeClientIntParm(hKey, "LogoffTokenTransferTimeout", "LogoffTokenTransferTimeout"); - UpgradeClientIntParm(hKey, "TrapOnPanic", "TrapOnPanic"); - UpgradeClientIntParm(hKey, "TraceBufferSize", "TraceBufferSize"); - UpgradeClientIntParm(hKey, "TraceOnShutdown", "TraceOnShutdown"); - UpgradeClientIntParm(hKey, "ReportSessionStartups", "ReportSessionStartups"); - - UpgradeClientStringParm(hKey, "MountRoot", "MountRoot"); - UpgradeClientStringParm(hKey, "Cell", "Cell"); - - /* BlockSize to ChunkSize requires convertion */ - nData = GetPrivateProfileInt("AFS Client", "BlockSize", -1, "afsd.ini"); - if (nData > -1) { - DWORD chunkSize; - for (chunkSize = 0; (1 << chunkSize) < nData; chunkSize++); - (void) RegSetValueEx(hKey, "ChunkSize", 0, REG_DWORD, (BYTE *)&chunkSize, sizeof(chunkSize)); - } - - RegCloseKey(hKey); - - return 0; -} - -int SUCALLCONV Eradicate34Client() -{ - if (Client34Eradicate(TRUE) != ERROR_SUCCESS) - return -1; - - return 0; -} - -// This function was written a long time ago by Mike Comer for use by the -// original DFS Client for NT install program. -int SUCALLCONV CheckIfAdmin(void) -{ - HANDLE token = INVALID_HANDLE_VALUE; - PVOID buffer = 0; - DWORD bufLength; - DWORD realBufLength; - TOKEN_PRIMARY_GROUP *pgroup; - TOKEN_GROUPS *groups; - int result = -1; - DWORD groupCount; - LONG status; - PSID AdministratorSID = NULL; - SID_IDENTIFIER_AUTHORITY authority = SECURITY_NT_AUTHORITY; - - // allocate the SID for the Administrators group - if (!AllocateAndInitializeSid(&authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorSID)) { - status = GetLastError(); - goto getout; - } - - // open the process token - if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &token)) { - status = GetLastError(); - token = INVALID_HANDLE_VALUE; - goto getout; - } - - // check primary group first - buffer = GlobalAlloc(GMEM_FIXED, sizeof(TOKEN_PRIMARY_GROUP)); - if (!buffer) { - goto getout; - } - - bufLength = sizeof(TOKEN_PRIMARY_GROUP); - while(1) { - if (!GetTokenInformation(token, TokenPrimaryGroup, buffer, bufLength, &realBufLength)) { - if (realBufLength > bufLength) { - // not enough space - GlobalFree(buffer); - bufLength = realBufLength; - buffer = GlobalAlloc(GMEM_FIXED, realBufLength); - if (!buffer) { - goto getout; - } - continue; - } - - goto getout; - } - break; - } - - pgroup = (TOKEN_PRIMARY_GROUP *)buffer; - if (EqualSid(pgroup->PrimaryGroup, AdministratorSID)) { - result = 0; - } else { - // okay, try the secondary groups - while(1) { - if (!GetTokenInformation(token, TokenGroups, buffer, bufLength, &realBufLength)) { - if (realBufLength > bufLength) { - // not enough space - GlobalFree(buffer); - bufLength = realBufLength; - buffer = GlobalAlloc(GMEM_FIXED, realBufLength); - if (!buffer) { - goto getout; - } - continue; - } - - // a real error - goto getout; - } - break; - } - - // we have the list of groups here. Process them: - groups = (TOKEN_GROUPS *)buffer; - for(groupCount = 0; groupCount < groups->GroupCount; groupCount++) { - if (EqualSid(groups->Groups[groupCount].Sid, AdministratorSID)) { - result = 0; - break; - } - } - } - -getout: - - if (token != INVALID_HANDLE_VALUE) { - CloseHandle(token); - } - - if (buffer) { - GlobalFree(buffer); - } - - if (AdministratorSID) { - FreeSid(AdministratorSID); - } - - return result; -} - -static void SetSharedFileRefCount(char *pszFile, int nRefCount) -{ - LONG result; - HKEY hKey; - - result = RegOpenKeyAlt(AFSREG_NULL_KEY, MS_SHARED_FILES_KEY, KEY_WRITE, FALSE, &hKey, 0); - if (result != ERROR_SUCCESS) - return; - - if (nRefCount <= 0) - RegDeleteValue(hKey, pszFile); - else - RegSetValueEx(hKey, pszFile, 0, REG_DWORD, (BYTE *)&nRefCount, sizeof(int)); - - RegCloseKey(hKey); -} - -static char *GetTimeStamp() -{ - char szTime[64], szDate[64]; - static char szTimeDate[128]; - - _strtime(szTime); - _strdate(szDate); - - sprintf(szTimeDate, "[%s %s] ", szTime, szDate); - - return szTimeDate; -} - -int SUCALLCONV WriteToInstallErrorLog(char *pszMsg) -{ - static BOOL bWritten = FALSE; - FILE *fp; - - // On the first write, recreate the file - fp = fopen(INSTALL_ERROR_LOG_NAME, bWritten ? "a" : "w"); - if (!fp) - return -1; - - fprintf(fp, "%s%s\r\n", GetTimeStamp(), pszMsg); - - fclose(fp); - - bWritten = TRUE; - - return 0; -} - -static void WriteToUninstallErrorLog(char *pszMsg) -{ - static BOOL bWritten = FALSE; - FILE *fp; - - // On the first write, recreate the file - fp = fopen(UNINSTALL_ERROR_LOG_NAME, bWritten ? "a" : "w"); - if (!fp) - return; - - fprintf(fp, "%s%s\r\n", GetTimeStamp(), pszMsg); - - fclose(fp); - - bWritten = TRUE; -} - -static char *LoadResString(UINT uID) -{ - static char str[256]; - GetString (str, uID); - return str; -} - -static void ShowError(UINT nResID, LONG nError) -{ - char szErr[256]; - char szPrompt[256]; - char szMsg[256]; - char szTitle[256]; - char *psz; - - psz = LoadResString(nResID); - if (psz) - strcpy(szErr, psz); - else - sprintf(szErr, "unknown error msg (Msg ID = %d)", nResID); - - psz = LoadResString(IDS_INSTALLATION_FAILURE); - strcpy(szPrompt, psz ? psz : "An error has occurred: %s (Last Error = %ld)."); - - sprintf(szMsg, szPrompt, szErr, nError); - - psz = LoadResString(IDS_TITLE); - strcpy(szTitle, psz ? psz : "AFS"); - - if (bSilentMode) - WriteToUninstallErrorLog(szMsg); - else - MessageBox(hDlg, szMsg, szTitle, MB_OK); -} - -static int ShowMsg(UINT nResID, int nType) -{ - char szTitle[256]; - char *psz; - - psz = LoadResString(IDS_TITLE); - strcpy(szTitle, psz ? psz : "AFS"); - - return MessageBox(hDlg, LoadResString(nResID), szTitle, nType); -} - -static char *GetAppInstallDir(struct APPINFO *pApp, BOOL bRemembered) -{ - HKEY hKey; - LONG nResult; - DWORD dwType; - static char szInstallDir[256]; - DWORD dwSize; - char *pszKey; - char *pszValue; - - pszKey = bRemembered ? UNINSTALL_TEMP_INFO_KEY : pApp->regInstallDir.pszKey; - pszValue = bRemembered ? INSTALL_DIR_VALUE_NAME : pApp->regInstallDir.pszValue; - - dwSize = sizeof(szInstallDir); - - nResult = RegOpenKeyAlt(AFSREG_NULL_KEY, pszKey, KEY_READ, FALSE, &hKey, 0); - if (nResult == ERROR_SUCCESS) { - nResult = RegQueryValueEx(hKey, pszValue, 0, &dwType, (PBYTE)szInstallDir, &dwSize); - RegCloseKey(hKey); - } - - if (nResult != ERROR_SUCCESS) { - ShowError(IDS_CANT_DETERMINE_APP_PATH, nResult); - return 0; - } - - FilepathNormalizeEx(szInstallDir, FPN_BACK_SLASHES); - - return szInstallDir; -} - -static BOOL DoesRegKeyExist(char *pszKey) -{ - HKEY hKey; - LONG nResult; - - nResult = RegOpenKeyAlt(AFSREG_NULL_KEY, pszKey, KEY_READ, FALSE, &hKey, 0); - if (nResult == ERROR_SUCCESS) { - RegCloseKey(hKey); - return TRUE; - } - - return FALSE; -} - -static BOOL IsAppInstalled(struct APPINFO *pApp) -{ - return DoesRegKeyExist(pApp->pszAppKey); -} - -static void BuildShortPath(char *pszShortPath, UINT nShortPathLen, char *pszInstallDir, char *pszPath) -{ - strncpy(pszShortPath, pszInstallDir, nShortPathLen); - strncat(pszShortPath, pszPath, nShortPathLen); - - GetShortPathName(pszShortPath, pszShortPath, nShortPathLen); -} - -static BOOL IsWin95() -{ - OSVERSIONINFO versionInformation; - - versionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - - GetVersionEx(&versionInformation); - - if ((versionInformation.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && - (versionInformation.dwMinorVersion == 0)) - return TRUE; - - return FALSE; -} - -int IsWin98() -{ - OSVERSIONINFO versionInformation; - - versionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - - GetVersionEx(&versionInformation); - - if ((versionInformation.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && - (versionInformation.dwMinorVersion == 10)) - return 0; - - return -1; -} - -static BOOL IsServiceInstalled(char *pszServiceKey) -{ - HKEY hKey; - - if (RegOpenKeyAlt(0, pszServiceKey, KEY_READ, FALSE, &hKey, 0) == ERROR_SUCCESS) { - RegCloseKey(hKey); - return TRUE; - } - - return FALSE; -} - -// If this fails in anyway we just return. No error is displayed. -static void MakeSureServiceDoesNotExist(char *pszName) -{ - SC_HANDLE hServer = 0, hSCM = 0; - SERVICE_STATUS status; - - hSCM = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE); - if (hSCM) { - hServer = OpenService(hSCM, pszName, SERVICE_ALL_ACCESS | DELETE); - if (hServer) { - if (QueryServiceStatus(hServer, &status)) { - if (status.dwCurrentState != SERVICE_STOPPED) { - if (!ControlService(hServer, SERVICE_CONTROL_STOP, &status)) { - CloseServiceHandle(hServer); - CloseServiceHandle(hSCM); - return; - } - } - } - - // Try to delete even if status query fails - DeleteService(hServer); - } - } - - if (hServer) - CloseServiceHandle(hServer); - if (hSCM) - CloseServiceHandle(hSCM); -} - -static int InstallService(char *pszName, char *pszDependOn, char *pszDisplayName, char *pszServicePath, BOOL bInteractive) -{ - SC_HANDLE hServer = 0, hSCM; - BOOL bRestoreOldConfig = FALSE; - - if (!AddToProviderOrder(AFSREG_CLT_SVC_NAME)) { - ShowError(ERROR_FILE_NOT_FOUND, GetLastError()); - return -1; - } - hSCM = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE); - if (!hSCM) { - ShowError(IDS_SCM_OPEN_FAILED, GetLastError()); - return -1; - } - -/* This code is not used, but it could be handy in the future so I am keeping it here. - - // If the service exists, then we (most probably) are in the middle of an upgrade or reinstall. - bRestoreOldConfig = IsServiceInstalled(pszName); - - if (bRestoreOldConfig) { - hServer = OpenService(hSCM, pszName, SERVICE_ALL_ACCESS); - if (!hServer || !ChangeServiceConfig(hServer, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE, 0, 0, 0, 0, 0, 0, 0)) { - ShowError(IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED, GetLastError()); - bRestoreOldConfig = FALSE; - // Fall through to service creation below - } - } -*/ - - if (!bRestoreOldConfig) { - DWORD dwServiceType; - - // If the service already exists, the create call will fail. This can - // happen if uninstall failed (which is not infrequent). Making sure the - // service does not exist makes it easier for a user to install over top of - // a previously failed uninstall. - MakeSureServiceDoesNotExist(pszName); - - dwServiceType = SERVICE_WIN32_OWN_PROCESS; - if (bInteractive) - dwServiceType |= SERVICE_INTERACTIVE_PROCESS; - - hServer = CreateService(hSCM, pszName, pszDisplayName, - SERVICE_ALL_ACCESS, dwServiceType, SERVICE_AUTO_START, - SERVICE_ERROR_NORMAL, pszServicePath, 0, 0, "RPCSS\0Netbios\0\0", 0, 0); - - if (!hServer) - ShowError(IDS_SERVICE_CREATE_FAILED, GetLastError()); - } - - if (hServer) - CloseServiceHandle(hServer); - - CloseServiceHandle(hSCM); - - return 0; -} - -int SUCALLCONV InstallServerService(char *pszServicePath) -{ - return InstallService(appServer.pszSvcName, 0, appServer.pszSvcDisplayName, pszServicePath, TRUE); -} - -int SUCALLCONV InstallClientService(char *pszServicePath) -{ - return InstallService(appClient.pszSvcName, appClient.pszSvcDependOn, appClient.pszSvcDisplayName, pszServicePath, FALSE); -} - -static int UninstallService(struct APPINFO *pAppInfo) -{ - SC_HANDLE hServer, hSCM; - SERVICE_STATUS status; - BOOL bOk; - BOOL bServer = FALSE; - BOOL bShowingProgressDlg = FALSE; - - if (!RemoveFromProviderOrder(AFSREG_CLT_SVC_NAME)) { - ShowError(ERROR_FILE_NOT_FOUND, GetLastError()); - return -1; - } - hSCM = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE); - if (!hSCM) { - ShowError(IDS_SCM_OPEN_FAILED, GetLastError()); - return -1; - } - - hServer = OpenService(hSCM, pAppInfo->pszSvcName, SERVICE_ALL_ACCESS | DELETE); - if (!hServer) { - ShowError(IDS_SERVICE_OPEN_FAILED, GetLastError()); - CloseServiceHandle(hSCM); - return -1; - } - - if (!QueryServiceStatus(hServer, &status)) { - ShowError(IDS_SERVICE_QUERY_FAILED, GetLastError()); - CloseServiceHandle(hServer); - CloseServiceHandle(hSCM); - return -1; - } - - if (status.dwCurrentState != SERVICE_STOPPED) { - if (pAppInfo->nServiceShutdownMsgID) { - if (!bSilentMode && (ShowMsg(pAppInfo->nServiceShutdownMsgID, MB_YESNO | MB_ICONQUESTION) == IDNO)) { - CloseServiceHandle(hServer); - CloseServiceHandle(hSCM); - return 1; - } - } - - if (!bSilentMode) - bShowingProgressDlg = ShowProgressDialog(LoadResString(pAppInfo->nServiceShutdownProgressMsgID)); - - if (!ControlService(hServer, SERVICE_CONTROL_STOP, &status)) { - if (bShowingProgressDlg) - HideProgressDialog(); - ShowError(IDS_SERVICE_STOP_FAILED, GetLastError()); - CloseServiceHandle(hServer); - CloseServiceHandle(hSCM); - return -1; - } - } - - // Wait for the service to stop - while (status.dwCurrentState != SERVICE_STOPPED) { - // I stopped waiting on dwWaitHint because it seemed the wait hint was too long. - // The service would be stopped but we'd still be asleep for a long time yet. - Sleep(5000); //status.dwWaitHint); - - if (!QueryServiceStatus(hServer, &status)) { - if (bShowingProgressDlg) - HideProgressDialog(); - ShowError(IDS_SERVICE_QUERY_FAILED, GetLastError()); - CloseServiceHandle(hServer); - CloseServiceHandle(hSCM); - return -1; - } - } - - // The service has been stopped - if (bShowingProgressDlg) - HideProgressDialog(); - - // This code to disable the service may be of use some day so I am keeping it here. - // bOk = ChangeServiceConfig(hServer, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, 0, 0, 0, 0, 0, 0, 0); - - bOk = DeleteService(hServer); - - if (!bOk) - ShowError(IDS_SERVICE_DELETE_FAILED, GetLastError()); - - CloseServiceHandle(hServer); - CloseServiceHandle(hSCM); - - return (bOk ? 0 : -1); -} - -int SUCALLCONV AddToNetworkProviderOrder(char *pszWhatToAdd) -{ - return AddToProviderOrder(pszWhatToAdd) ? 0 : -1; -} - -static int RemoveFromNetworkProviderOrder(char *pszWhatToDel) -{ - return RemoveFromProviderOrder(pszWhatToDel) ? 0 : -1; -} - -int SUCALLCONV AddToPath(char *pszPath) -{ - return AddToSystemPath(pszPath) ? 0 : -1; -} - -static int RemoveFromPath(char *pszPath) -{ - return RemoveFromSystemPath(pszPath) ? 0 : -1; -} - -static void RemoveFiles(char *pszFileSpec) -{ - struct _finddata_t fileinfo; - long hSearch; - char szDel[MAX_PATH]; - char szDir[MAX_PATH]; - char *p; - - strcpy(szDir, pszFileSpec); - p = strrchr(szDir, '\\'); - if (p) - *p = 0; - - hSearch = _findfirst(pszFileSpec, &fileinfo); - if (hSearch == -1) - return; - - while (1) { - if ((strcmp(fileinfo.name, ".") != 0) && (strcmp(fileinfo.name, "..") != 0)) { - sprintf(szDel, "%s\\%s", szDir, fileinfo.name); - DeleteFile(szDel); - } - - if (_findnext(hSearch, &fileinfo) == -1) - break; - } - - _findclose(hSearch); -} - -static void RemoveDir(char *pszDir) -{ - char szFileSpec[MAX_PATH]; - - sprintf(szFileSpec, "%s\\*.*", pszDir); - - RemoveFiles(szFileSpec); - RemoveDirectory(pszDir); -} - -static void RemoveRegValues(struct REGVALUE *pRegValues) -{ - struct REGVALUE *pCurValue; - HKEY hKey; - LONG nResult; - - if (!pRegValues) - return; - - for (pCurValue = pRegValues; pCurValue->pszKey; pCurValue++) { - nResult = RegOpenKeyAlt(AFSREG_NULL_KEY, pCurValue->pszKey, KEY_ALL_ACCESS, FALSE, &hKey, 0); - - if (nResult == ERROR_SUCCESS) { - nResult = RegDeleteValue(hKey, pCurValue->pszValue); - RegCloseKey(hKey); - } - - if (nResult != ERROR_SUCCESS) - ShowError(IDS_REG_DELETE_VALUE_ERROR, nResult); - } -} - -static BOOL UninstallCredsTool() -{ - int nResult = WinExec("afscreds /uninstall", SW_HIDE); - - if (nResult <= 31) { - if (nResult != ERROR_FILE_NOT_FOUND) - ShowError(IDS_CANT_UNINSTALL_AFSCREDS, nResult); - } - - // Always return true. We don't want the uninstall to completely fail just - // because the creds tool didn't uninstall. - return TRUE; -} - - -static char *GetTempDir() -{ - DWORD result; - static char szTempDir[MAX_PATH]; - - result = GetTempPath(sizeof(szTempDir) - 1, szTempDir); - if (result == 0) - return "\\"; - - return szTempDir; -} - -static char *GetRootInstallDir() -{ - char *psz; - static char szRootInstallDir[MAX_PATH] = ""; - - if (szRootInstallDir[0] == 0) { - strcpy(szRootInstallDir, pszInstallDir); - - // Strip off the app specific part of the install dir - psz = strrchr(szRootInstallDir, '\\'); - if (psz) - *psz = 0; - } - - return szRootInstallDir; -} - -static BOOL ClientSpecificUninstall() -{ - int nChoice; - - // This function needs to do two things. First it needs to see if the server is - // installed, and if it is, ask the user if they really want to uninstall the - // client given that the server needs the client. Second, if we are uninstalling - // the client, we need to uninstall the creds tool. - - if (!bSilentMode) { - if (IsAppInstalled(&appServer)) { - nChoice = ShowMsg(IDS_CLIENT_NEEDED_BY_SERVER, MB_ICONQUESTION | MB_YESNO); - if (nChoice == IDNO) - return FALSE; // Cancel the uninstall - } - } - - UninstallCredsTool(); - - return TRUE; -} - -static struct APPINFO *GetApp() -{ -#ifdef SERVER_UNINST - return &appServer; -#elif CLIENT_UNINST - return &appClient; -#elif CC_UNINST - return &appControlCenter; -#elif LIGHT_CLIENT_UNINST - return &appLightClient; -#elif DOCS_UNINST - return &appDocs; -#else - return 0; -#endif; -} - -static void RememberInstallDir(char *pszInstallDir) -{ - HKEY hKey; - - // We remember the install dir so that when the UninstUninitialize function is called - // by the InstallShield uninstaller, we can find out where we were installed to. We - // have to do this because by the time that function is called, the registry values - // created at install time are already gone. We need to be able to find out where we - // were installed so we can clean up anything IS couldn't uninstall. If this fails in - // any way then we don't care. The only consequence is that some junk might be left on - // the users' system after an uninstall. - - LONG result = RegOpenKeyAlt(AFSREG_NULL_KEY, UNINSTALL_TEMP_INFO_KEY, KEY_WRITE, TRUE, &hKey, 0); - if (result != ERROR_SUCCESS) - return; - - RegSetValueEx(hKey, INSTALL_DIR_VALUE_NAME, 0, REG_SZ, (PBYTE)pszInstallDir, strlen(pszInstallDir) + 1); - - RegCloseKey(hKey); -} - -int SUCALLCONV SetSilentMode() -{ - bSilentMode = TRUE; - - return 0; -} - -static char *GetWinDir() -{ - static char szWinDir[MAX_PATH] = ""; - - if (!szWinDir[0]) - GetWindowsDirectory(szWinDir, sizeof(szWinDir)); - - return szWinDir; -} - -static char *GetWinSysDir() -{ - static char szWinSysDir[MAX_PATH] = ""; - - if (!szWinSysDir[0]) - GetSystemDirectory(szWinSysDir, sizeof(szWinSysDir)); - - return szWinSysDir; -} - -static char *GetLocaleID() -{ - static char szID[25] = ""; - - if (szID[0] == 0) { - LCID dwID = GetSystemDefaultLCID(); - - // Nuke the high word. It contains a sort ID. - dwID &= 0x0000FFFF; - - // Convert locale ID to a string - itoa(dwID, szID, 10); - - // This thing should never be more than LOCALE_ID_LEN characters long. - szID[LOCALE_ID_LEN] = 0; - } - - return szID; -} - -static char *ExpandPath(char *pszFile) -{ - static char szPath[MAX_PATH]; - char *psz; - - szPath[0] = 0; - - // Convert a path containing TARGETDIR, WINDIR, or WINSYSDIR to a - // real path in the file system. One of these MUST be the start of - // the file path passed in. Also convert the string ???? to an - // actual locale number. - if (strncmp(pszFile, TARGETDIR, strlen(TARGETDIR)) == 0) - strcpy(szPath, GetRootInstallDir()); - else if (strncmp(pszFile, WINDIR, strlen(WINDIR)) == 0) - strcpy(szPath, GetWinDir()); - else if (strncmp(pszFile, WINSYSDIR, strlen(WINSYSDIR)) == 0) - strcpy(szPath, GetWinSysDir()); - - if (szPath[0]) { - psz = strchr(pszFile, '\\'); - if (psz) - strcat(szPath, psz); - } else - strcpy(szPath, pszFile); - - // Is this a language dll? - psz = strstr(szPath, "????."); - - // If it is, replace ???? with the locale number - if (psz) - strncpy(psz, GetLocaleID(), LOCALE_ID_LEN); - - return szPath; -} - -static BOOL FileNeededByOtherApp(struct APPINFO *pApp, struct FILEINFO *pFileInfo) -{ - // If the file is used by the server, the app being uninstalled is not the server, and - // the server is installed, then this file is used by another app. - if (!IsWinNT()) { - if ((pFileInfo->nUsedBy & LCLIENT) && (pApp != &appLightClient) && IsAppInstalled(&appLightClient)) - return TRUE; - return FALSE; - } - - if ((pFileInfo->nUsedBy & SERVER) && (pApp != &appServer) && IsAppInstalled(&appServer)) - return TRUE; - - if ((pFileInfo->nUsedBy & CLIENT) && (pApp != &appClient) && IsAppInstalled(&appClient)) - return TRUE; - - if ((pFileInfo->nUsedBy & CC) && (pApp != &appControlCenter) && IsAppInstalled(&appControlCenter)) - return TRUE; - - return FALSE; -} - -static void DeleteInUseFiles(struct APPINFO *pAppInfo, struct FILEINFO *pFileInfo) -{ - char szSrcPath[MAX_PATH]; - char szDestPath[MAX_PATH]; - char szTempDir[MAX_PATH]; - int ii; - - // If some app's file has been loaded before the app is uninstalled, then - // when an uninstall is attempted, the application and all of the dlls that - // its uses will be in use and IS will not be able to delete them. Normally this - // is not a problem because IS will tell the user to reboot to finish the uninstall. - // However, we must support the ability to perform a silent uninstall followed - // immediatly by an install of the same product to the same directories. If we let - // IS handle the uninstall of these files, this is not possible. The reason is that - // when IS fails to remove these in use files, it marks them for deletion after the - // next reboot, which is fine. Unfortunately, it leaves them in the dirs they were - // installed to. So if we don't immediately reboot and perform an install to the - // same dirs, once a reboot is performed, those files get deleted and we have a - // broken installation. - - // What we will do to fix all of this, is when the client is uninstalled, but - // before IS does anything, we will move the in use files and associated dlls - // into the temp dir and mark them for delete after a reboot. Then an install - // that follows will succeed. - - // Delete the files that may be in use. If they are we actually move - // them to the temp dir and mark them for deletion after the next reboot. - for (ii = 0; pFileInfo[ii].pszName != 0; ii++) { - // Get the source path - strcpy(szSrcPath, ExpandPath(pFileInfo[ii].pszName)); - - // Only delete the file if it is not used by some other app - if (FileNeededByOtherApp(pAppInfo, &pFileInfo[ii])) - continue; - - // If the file doesn't exist then go on to the next file. - if (_access(szSrcPath, 0) != 0) - continue; - - // See if we can do a regular delete of the file - if (DeleteFile(szSrcPath)) { - SetSharedFileRefCount(szSrcPath, 0); - continue; - } - - // Get a temp dir that is on the same drive as the src path. - // We can't move an in use file to a different drive. - strcpy(szTempDir, GetTempDir()); - if (szTempDir[0] != szSrcPath[0]) { - // Get the drive, colon, and slash of the src path - strncpy(szTempDir, szSrcPath, 3); - szTempDir[3] = 0; - } - - // Get the dest path - we will rename the file during the move - GetTempFileName(szTempDir, "AFS", 0, szDestPath); - - // Move from source to dest, marking the file for deletion after a reboot - if (IsWin95()) { - if (MoveFile(szSrcPath, szDestPath)) { - WritePrivateProfileString("rename", szSrcPath, szDestPath, "wininit.ini"); - SetSharedFileRefCount(szSrcPath, 0); - } - } else { // WinNT or Win98 - if (MoveFileEx(szSrcPath, szDestPath, MOVEFILE_REPLACE_EXISTING)) { - SetFileAttributes(szDestPath, FILE_ATTRIBUTE_NORMAL); - MoveFileEx(szDestPath, 0, MOVEFILE_DELAY_UNTIL_REBOOT); - SetSharedFileRefCount(szSrcPath, 0); - } - } - } -} - -// Delete a directory and all its files and subdirectories - Yee haaa! -static void RemoveDirectoryTree(char *pszDir) -{ - HANDLE hFind; - WIN32_FIND_DATA findFileData; - char szSpec[MAX_PATH]; - char szSubFileOrDir[MAX_PATH]; - BOOL bContinue; - - sprintf(szSpec, "%s\\*.*", pszDir); - - // First delete the contents of the dir - hFind = FindFirstFile(szSpec, &findFileData); - bContinue = (hFind != INVALID_HANDLE_VALUE); - - while (bContinue) { - if ((strcmp(findFileData.cFileName, ".") != 0) && (strcmp(findFileData.cFileName, "..") != 0)) { - sprintf(szSubFileOrDir, "%s\\%s", pszDir, findFileData.cFileName); - - if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - RemoveDirectoryTree(szSubFileOrDir); - else - DeleteFile(szSubFileOrDir); - } - - bContinue = FindNextFile(hFind, &findFileData); - } - - FindClose(hFind); - - // Now remove the dir - RemoveDirectory(pszDir); -} - -static char *GetStartMenuRoot() -{ - HKEY hKey; - LONG nResult; - DWORD dwType; - DWORD dwSize; - char *pszKey; - char *pszValue; - - static char szStartMenuRoot[MAX_PATH] = ""; - - if (szStartMenuRoot[0] == 0) { - dwSize = sizeof(szStartMenuRoot); - - if (IsWinNT()) { - pszKey = WINNT_START_MENU_REG_KEY; - pszValue = WINNT_START_MENU_REG_VALUE; - } else { - pszKey = WIN9X_START_MENU_REG_KEY; - pszValue = WIN9X_START_MENU_REG_VALUE; - } - - nResult = RegOpenKeyAlt(AFSREG_NULL_KEY, pszKey, KEY_READ, FALSE, &hKey, 0); - if (nResult == ERROR_SUCCESS) { - nResult = RegQueryValueEx(hKey, pszValue, 0, &dwType, (PBYTE)szStartMenuRoot, &dwSize); - RegCloseKey(hKey); - } - - if (nResult != ERROR_SUCCESS) - return 0; - } - - FilepathNormalizeEx(szStartMenuRoot, FPN_BACK_SLASHES); - - return szStartMenuRoot; -} - -static char *GetAfsStartMenuRoot() -{ - static char szAfsStartMenuRoot[MAX_PATH] = ""; - char *pszStartMenuRoot; - - if (szAfsStartMenuRoot[0] == 0) { - pszStartMenuRoot = GetStartMenuRoot(); - if (!pszStartMenuRoot) - return 0; - - if (bSilentMode) - sprintf(szAfsStartMenuRoot, "%s\\IBM WebSphere\\Performance Pack\\AFS", pszStartMenuRoot ); - else - sprintf(szAfsStartMenuRoot, "%s\\IBM AFS", pszStartMenuRoot ); - } - - return szAfsStartMenuRoot; -} - -static BOOL IsADir(char *pszName) -{ - struct _stat statbuf; - - if (_stat(pszName, &statbuf) < 0) - return FALSE; - - return statbuf.st_mode & _S_IFDIR; -} - -static void DeleteStartMenuEntries(char *pszEntries) -{ - char szStartMenuPath[MAX_PATH]; - char *pszAfsStartMenuRoot; - char *pszCurEntry; - - pszAfsStartMenuRoot = GetAfsStartMenuRoot(); - - if (!pszAfsStartMenuRoot) - return; - - for (pszCurEntry = pszEntries; *pszCurEntry; pszCurEntry += strlen(pszCurEntry) + 1) { - sprintf(szStartMenuPath, "%s\\%s", pszAfsStartMenuRoot, pszCurEntry); - if (IsADir(szStartMenuPath)) - RemoveDirectoryTree(szStartMenuPath); - else - DeleteFile(szStartMenuPath); - } -} - -static void RefreshStartMenu() -{ - char *pszAfsStartMenuRoot; - char szTemp[MAX_PATH]; - - pszAfsStartMenuRoot = GetAfsStartMenuRoot(); - if (!pszAfsStartMenuRoot) - return; - - sprintf(szTemp, "%s - Refresh Attempt", pszAfsStartMenuRoot); - - // Deleting items from below the root level of the start menu does not - // cause it to refresh. In order that users can see changes without - // rebooting we will temporarily rename our root most entry, which - // does cause a refresh of the start menu. - MoveFileEx(pszAfsStartMenuRoot, szTemp, MOVEFILE_REPLACE_EXISTING); - MoveFileEx(szTemp, pszAfsStartMenuRoot, MOVEFILE_REPLACE_EXISTING); -} - -static BOOL PreserveConfigInfo(struct APPINFO *pApp) -{ - char *pszRegKey; - char szDestKey[256]; - LONG result; - - bPreserveConfigInfo = TRUE; - - // If not in silent mode, ask user if they want to preserve the cfg info - if (!bSilentMode) { - int nChoice = ShowMsg(pApp->nPreserveConfigInfoMsgID, MB_ICONQUESTION | MB_YESNOCANCEL); - if (nChoice == IDCANCEL) - return FALSE; // Cancel the uninstall - else if (nChoice == IDNO) { - bPreserveConfigInfo = FALSE; // User doesn't want to preserve the config info - return TRUE; - } - } - - // Copy each reg key (and all of its subkeys and values) to another place in the registry. - for (pszRegKey = pApp->pszRegKeysToPreserve; *pszRegKey; pszRegKey += strlen(pszRegKey) + 1) { - if (!DoesRegKeyExist(pszRegKey)) - continue; - - // Create the destination path for the copy - sprintf(szDestKey, "%s\\%s\\%s", AFS_PRESERVED_CFG_INFO_KEY, pApp->pszAppName, pszRegKey); - - // Try to copy it - result = RegDupKeyAlt(pszRegKey, szDestKey); - - if ((result != ERROR_SUCCESS) && (result != ERROR_FILE_NOT_FOUND)) { - // If the copy failed, then delete any copies that succeeded - sprintf(szDestKey, "%s\\%s", AFS_PRESERVED_CFG_INFO_KEY, pApp->pszAppName); - RegDeleteEntryAlt(szDestKey, REGENTRY_KEY); - goto done; - } - } - - // Remember the integrated login setting if this app supports that and it was turned on - if (pApp->pszNetworkProviderOrder) { - // Was integerated login turned on? - BOOL bOn, bOk; - bOk = InNetworkProviderOrder(pApp->pszNetworkProviderOrder, &bOn); - if (bOk && bOn) { - HKEY hKey; - sprintf(szDestKey, "%s\\%s\\IntegratedLogin", AFS_PRESERVED_CFG_INFO_KEY, pApp->pszAppName); - result = RegOpenKeyAlt(AFSREG_NULL_KEY, szDestKey, KEY_WRITE, TRUE, &hKey, 0); - // The existance of the key is a flag indicating that integrated login was turned on - RegCloseKey(hKey); - } - } - -done: - if ((result == ERROR_SUCCESS) || bSilentMode) - return TRUE; // Continue with uninstall - - // Report the error and ask the user if they want to continue the uninstall - return (ShowMsg(IDS_SAVE_OF_CONFIG_INFO_FAILED, MB_ICONEXCLAMATION | MB_YESNO) == IDYES); -} - -int SUCALLCONV RestoreConfigInfo(int nApp) -{ - char *pszRegKey; - char szSrcKey[256]; - struct APPINFO *pApp = 0; - BOOL bError = FALSE; - LONG result; - - switch (nApp) { - case SERVER: pApp = &appServer; break; - case CLIENT: pApp = &appClient; break; - case LCLIENT: pApp = &appLightClient; break; - case CC: pApp = &appControlCenter; break; - } - - if (!pApp) - return -1; - - // Copy each reg key (and all of its subkeys and values) back to its original place in the registry. - for (pszRegKey = pApp->pszRegKeysToPreserve; *pszRegKey; pszRegKey += strlen(pszRegKey) + 1) { - // Create the source path for the copy - sprintf(szSrcKey, "%s\\%s\\%s", AFS_PRESERVED_CFG_INFO_KEY, pApp->pszAppName, pszRegKey); - - if (!DoesRegKeyExist(szSrcKey)) - continue; - - // Try to restore as many of the keys as possible. Report any errors at the end. - - // Try to copy it - result = RegDupKeyAlt(szSrcKey, pszRegKey); - if ((result != ERROR_SUCCESS) && (result != ERROR_FILE_NOT_FOUND)) - bError = TRUE; - } - - // Restore integrated login if this app was using it - if (pApp->pszNetworkProviderOrder) { - // Check if integrated login was turned on. The IntegratedLogin key is a flag - // telling us that it was on. If the key does not exist, integrated login was - // not on. - sprintf(szSrcKey, "%s\\%s\\IntegratedLogin", AFS_PRESERVED_CFG_INFO_KEY, pApp->pszAppName); - if (DoesRegKeyExist(szSrcKey)) { - if (!AddToProviderOrder(pApp->pszNetworkProviderOrder)) - bError = TRUE; - } - } - - // Remove our saved copies of the config info - sprintf(szSrcKey, "%s\\%s", AFS_PRESERVED_CFG_INFO_KEY, pApp->pszAppName); - RegDeleteEntryAlt(szSrcKey, REGENTRY_KEY); - - if (bError) - ShowError(IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED, 0); - - return TRUE; -} - -static BOOL DoSubKeysExist(char *pszKey) -{ - LONG result; - HKEY hKey; - char *pszSubKeys = 0; - BOOL bExist; - - result = RegOpenKeyAlt(AFSREG_NULL_KEY, pszKey, KEY_READ, FALSE, &hKey, 0); - if (result != ERROR_SUCCESS) - return FALSE; - - result = RegEnumKeyAlt(hKey, &pszSubKeys); - RegCloseKey(hKey); - - if (result != ERROR_SUCCESS) - return FALSE; - - if (pszSubKeys) { - bExist = TRUE; - free(pszSubKeys); - } else - bExist = FALSE; - - return bExist; -} - -/* - * The following definitions are taken from richedit.h: - * - */ - -#define EM_SETBKGNDCOLOR (WM_USER + 67) // from Richedit.h -#define EM_STREAMIN (WM_USER + 73) // from Richedit.h -#define SF_RTF 0x0002 - -typedef DWORD (CALLBACK *EDITSTREAMCALLBACK)(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb); - -typedef struct _editstream { - DWORD dwCookie; /* user value passed to callback as first parameter */ - DWORD dwError; /* last error */ - EDITSTREAMCALLBACK pfnCallback; -} EDITSTREAM; - -/* - * - */ - -DWORD CALLBACK License_StreamText (DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) -{ - LPTSTR psz = (LPTSTR)dwCookie; - LONG cchAvail = lstrlen(psz); - if ((*pcb = min(cchAvail, cb)) != 0) { - memcpy (pbBuff, psz, *pcb); - memmove (psz, &psz[*pcb], cchAvail - *pcb + 1); - } - return 0; -} - - -void License_OnInitDialog (HWND hDlg, LPTSTR pszFile) -{ - // Open the license file and shove its text in our RichEdit control - // - HANDLE hFile; - if ((hFile = CreateFile (pszFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE) { - - size_t cbText; - if ((cbText = GetFileSize (hFile, NULL)) != 0) { - - LPTSTR abText = (LPTSTR)GlobalAlloc (GMEM_FIXED, cbText + 3); - - DWORD cbRead; - if (ReadFile (hFile, abText, cbText, &cbRead, NULL)) { - abText[ cbRead ] = 0; - - EDITSTREAM Stream; - memset (&Stream, 0x00, sizeof(Stream)); - Stream.dwCookie = (DWORD)abText; - Stream.pfnCallback = License_StreamText; - - SendDlgItemMessage (hDlg, IDC_TEXT, EM_STREAMIN, SF_RTF, (LPARAM)&Stream); - } - - GlobalFree (abText); - } - - CloseHandle (hFile); - } - - // Make the control's background be gray - // - SendDlgItemMessage (hDlg, IDC_TEXT, EM_SETBKGNDCOLOR, FALSE, (LPARAM)GetSysColor(COLOR_BTNFACE)); -} - -BOOL CALLBACK License_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - License_OnInitDialog (hDlg, (LPTSTR)lp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDCANCEL: - case IDOK: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_PRINT: - TCHAR szDir[ MAX_PATH ]; - GetCurrentDirectory (MAX_PATH, szDir); - ShellExecute (hDlg, TEXT("print"), (LPTSTR)GetWindowLong (hDlg, DWL_USER), NULL, szDir, SW_HIDE); - break; - } - break; - } - return FALSE; -} - -BOOL FindAfsInstallationPathByComponent (LPTSTR pszInstallationPath, LPTSTR pszComponent) -{ - *pszInstallationPath = 0; - - TCHAR szRegPath[ MAX_PATH ]; - wsprintf (szRegPath, TEXT("Software\\TransarcCorporation\\%s\\CurrentVersion"), pszComponent); - - HKEY hk; - if (RegOpenKey (HKEY_LOCAL_MACHINE, szRegPath, &hk) == 0) { - DWORD dwType = REG_SZ; - DWORD dwSize = MAX_PATH; - - if (RegQueryValueEx (hk, TEXT("PathName"), NULL, &dwType, (PBYTE)pszInstallationPath, &dwSize) == 0) { - *(LPTSTR)FindBaseFileName (pszInstallationPath) = TEXT('\0'); - - if (pszInstallationPath[0] && (pszInstallationPath[ lstrlen(pszInstallationPath)-1 ] == TEXT('\\'))) - pszInstallationPath[ lstrlen(pszInstallationPath)-1 ] = TEXT('\0'); - } - - RegCloseKey (hk); - } - - return !!*pszInstallationPath; -} - -BOOL FindAfsInstallationPath (LPTSTR pszInstallationPath) -{ - if (FindAfsInstallationPathByComponent (pszInstallationPath, TEXT("AFS Client"))) - return TRUE; - if (FindAfsInstallationPathByComponent (pszInstallationPath, TEXT("AFS Control Center"))) - return TRUE; - if (FindAfsInstallationPathByComponent (pszInstallationPath, TEXT("AFS Server"))) - return TRUE; - if (FindAfsInstallationPathByComponent (pszInstallationPath, TEXT("AFS Supplemental Documentation"))) - return TRUE; - return FALSE; -} - -HINSTANCE LoadRichTextControl (void) -{ - HINSTANCE hInst; - if ((hInst = LoadLibrary ("riched20.dll")) != NULL) - return hInst; - if ((hInst = LoadLibrary ("riched32.dll")) != NULL) - return hInst; - if ((hInst = LoadLibrary ("riched.dll")) != NULL) - return hInst; - if ((hInst = LoadLibrary ("richedit.dll")) != NULL) - return hInst; - return NULL; -} - -int SUCALLCONV ShowLicense (char *pszTarget, char *pszSource) -{ - // If the license already lives on this user's machine, don't show - // it again. This only has to be done if the user has never - // accepted the license agreement before (it's part of the setup - // program, so it gets installed if they've accepted it). - // - // We were handed a relative path of the form: - // Documentation/html/license.rtf - // - // We'll need to find the AFS installation directory, in order to - // find that Documentation subtree. - // - BOOL fShowLicense = TRUE; - - TCHAR szInstallationPath[ MAX_PATH ]; - if (FindAfsInstallationPath (szInstallationPath)) { - TCHAR szLicensePath[ MAX_PATH ]; - wsprintf (szLicensePath, TEXT("%s\\%s"), szInstallationPath, pszTarget); - - if (GetFileAttributes (szLicensePath) != (DWORD)-1) { - fShowLicense = FALSE; - } - } - - // Before we can show the license file, we have to prepare the RichEdit - // control. That means loading the appropriate library and calling its - // initialization functions. - // - HINSTANCE hRichEdit; - if ((hRichEdit = LoadRichTextControl()) != NULL) { - - // If we must show the license, do so now. This is a modal dialog, - // so we'll know whether or not the user accepts the license. - // - if (ModalDialogParam (IDD_LICENSE, GetActiveWindow(), License_DlgProc, (LPARAM)pszSource) == IDCANCEL) { - // The user rejected the license; fail setup - return FALSE; - } - - FreeLibrary (hRichEdit); - } - - // The user accepted the license, so we can continue with Setup. - // The license file is installed as part of Setup. - return TRUE; -} - -int SUCALLCONV UninstInitialize(HWND hIS, HINSTANCE hIS5, long Reserved) -{ - char szPath[MAX_PATH]; - struct APPINFO *pAppInfo; - char *pszFile = 0; - char *pszSubDir = 0; - - hDlg = hIS; - - bSilentMode = !IsWindowVisible(hIS); - - // Which app are we uninstalling? - pAppInfo = GetApp(); - if (!pAppInfo) { - ShowError(IDS_CANT_DETERMINE_PRODUCT, 0); - return -1; - } - - // Get the app's install dir - pszInstallDir = GetAppInstallDir(pAppInfo, FALSE); - if (!pszInstallDir) - return -1; - - // If this app has a custom uninstall func, call it here - if (pAppInfo->pUninstallFunc) - if (!pAppInfo->pUninstallFunc()) - return -1; - - if (pAppInfo->pszRegKeysToPreserve) - if (!PreserveConfigInfo(pAppInfo)) - return -1; - - // Unconfigure the service, if there is one for this app - if (pAppInfo->pszSvcKey) { - if (IsServiceInstalled(pAppInfo->pszSvcKey)) - if (UninstallService(pAppInfo) == 1) - return -1; - } - - RememberInstallDir(pszInstallDir); - - DeleteInUseFiles(pAppInfo, fileInfo); - - // Remove the app's bin path from the system path - if (pAppInfo->pszBinPath) { - BuildShortPath(szPath, sizeof(szPath), pszInstallDir, pAppInfo->pszBinPath); - RemoveFromPath(szPath); - } - - // Remove entry from NetworkProvider\Order key in registry - if (pAppInfo->pszNetworkProviderOrder) - RemoveFromNetworkProviderOrder(pAppInfo->pszNetworkProviderOrder); - - // Remove any generated subdirectories - if (!bPreserveConfigInfo && pAppInfo->pszDirsToDel) { - for (pszSubDir = pAppInfo->pszDirsToDel; *pszSubDir; pszSubDir += strlen(pszSubDir) + 1) - RemoveDir(ExpandPath(pszSubDir)); - } - - // Remove any generated files - if (!bPreserveConfigInfo && pAppInfo->pszFilesToDel) { - for (pszFile = pAppInfo->pszFilesToDel; *pszFile; pszFile += strlen(pszFile) + 1) - RemoveFiles(ExpandPath(pszFile)); - } - - // Remove any registry values that IS can't handle - RemoveRegValues(pAppInfo->pRegValues); - if (IsWinNT()) - RemoveRegValues(pAppInfo->pWinNTRegValues); - else - RemoveRegValues(pAppInfo->pWin9XRegValues); - - // Remove the start menu entries for this app - if (pAppInfo->pszStartMenuEntries) { - DeleteStartMenuEntries(pAppInfo->pszStartMenuEntries); - RefreshStartMenu(); - } - - // Remove the install dir - RemoveDirectory(pszInstallDir); - - return 0; -} - -void SUCALLCONV UninstUnInitialize(HWND hIS, HINSTANCE hIS5, long Reserved) -{ - char *pszInstallDir; - char szDirPath[MAX_PATH]; - char *psz; - struct APPINFO *pAppInfo; - - // If we just uninstalled the last AFS app, then do some cleanup. - if (IsAppInstalled(&appServer) || IsAppInstalled(&appClient) || - IsAppInstalled(&appControlCenter) || IsAppInstalled(&appLightClient) || - IsAppInstalled(&appDocs)) - { - return; - } - - bSilentMode = !IsWindowVisible(hIS); - - // Which app did we just uninstall? - pAppInfo = GetApp(); - if (!pAppInfo) { - ShowError(IDS_CANT_DETERMINE_PRODUCT, 0); - return; - } - - // Get the app's install dir - pszInstallDir = GetAppInstallDir(pAppInfo, TRUE); - if (!pszInstallDir) - return; - - // Remove the reg key we used to remember the app install dir - RegDeleteEntryAlt(UNINSTALL_TEMP_INFO_KEY, REGENTRY_KEY); - - // Try to remove the reg key used to store config info, but only - // if there are no app config info sub keys present. - if (!DoSubKeysExist(AFS_PRESERVED_CFG_INFO_KEY)) - RegDeleteEntryAlt(AFS_PRESERVED_CFG_INFO_KEY, REGENTRY_KEY); - - // Remove the install dir - RemoveDirectory(pszInstallDir); - - // Attempt to remove the install root and common directories. The are - // shared and so no single app knows to delete them. - - // Strip off the app specific part of the install dir - psz = strrchr(pszInstallDir, '\\'); - if (psz) - *psz = 0; - - sprintf(szDirPath, "%s\\%s", pszInstallDir, "Common"); - RemoveDirectory(szDirPath); - - // Remove the Common directory from the system path - RemoveFromPath(szDirPath); - - // Remove all of the documentation dirs - sprintf(szDirPath, "%s\\%s", pszInstallDir, "Documentation"); - RemoveDirectoryTree(szDirPath); - - // Ok, up to this point we have been removing files we know we - // created. However, after this point we are into the path - // that the user chose for our install root. The default for - // this is IBM/Afs, but they could have chosen anything, - // including a dir or dirs that have other products in them. - // We will check to see if it is IBM\AFS and if it is then we - // will attempt to remove them. - - // Back up a level and look for AFS - psz = strrchr(pszInstallDir, '\\'); - if (psz) { - if (stricmp(psz + 1, "AFS") == 0) { - RemoveDirectory(pszInstallDir); - *psz = 0; - } - } - - // Back up a level and look for IBM - psz = strrchr(pszInstallDir, '\\'); - if (psz) { - if (stricmp(psz + 1, "IBM") == 0) { - RemoveDirectory(pszInstallDir); - *psz = 0; - } - } - - // Remove the root afs start menu entry - psz = GetStartMenuRoot(); - if (psz) { - if (bSilentMode) { - // Remove everything under our branch - sprintf(szDirPath, "%s\\IBM WebSphere\\Performance Pack\\AFS", psz); - RemoveDirectoryTree(szDirPath); - - // Remove the IBM stuff only if the dirs are empty - sprintf(szDirPath, "%s\\IBM WebSphere\\Performance Pack", psz); - if (RemoveDirectory(szDirPath)) { - sprintf(szDirPath, "%s\\IBM WebSphere", psz); - RemoveDirectory(szDirPath); - } - } else { - sprintf(szDirPath, "%s\\IBM AFS", psz); - RemoveDirectoryTree(szDirPath); - } - } -} - -BOOLEAN _stdcall DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved) -{ - if (reason == DLL_PROCESS_ATTACH) { - hinst = (HINSTANCE)dll; - TaLocale_LoadCorrespondingModuleByName (hinst, "afs_setup_utils.dll"); - } - - return TRUE; -} - -extern "C" int WINAPI Test (HINSTANCE hInst, HINSTANCE hPrev, LPSTR psz, int nCmdShow) -{ - ShowLicense ("TEST", "\\\\fury\\afssetup\\license\\ja_JP.rtf"); - return 0; -} - - diff --git a/src/WINNT/afs_setup_utils/afs_setup_utils_stub.rc b/src/WINNT/afs_setup_utils/afs_setup_utils_stub.rc deleted file mode 100644 index d0949cd5a..000000000 --- a/src/WINNT/afs_setup_utils/afs_setup_utils_stub.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Setup Utilities DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.dll" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPINSTOP ICON DISCARDABLE "..\\afsapplib\\resource\\spinstop.ico" - diff --git a/src/WINNT/afs_setup_utils/afsrm.c b/src/WINNT/afs_setup_utils/afsrm.c deleted file mode 100644 index 1761a76fa..000000000 --- a/src/WINNT/afs_setup_utils/afsrm.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Utility to forcibly remove AFS software without using InstallShield */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "forceremove.h" - - -static int DoClient34(struct cmd_syndesc *as, char *arock) -{ - DWORD status = Client34Eradicate(FALSE); - - if (status == ERROR_SUCCESS) { - printf("Client 3.4a removal succeeded\n"); - } else { - printf("Client 3.4a removal failed (%d)\n", (int)status); - } - return 0; -} - -static void -SetupCmd(void) -{ - struct cmd_syndesc *ts; - - ts = cmd_CreateSyntax("client34", DoClient34, 0, - "remove AFS 3.4a client"); -} - - -int main(int argc, char *argv[]) -{ - int code; - - /* initialize command syntax */ - initialize_CMD_error_table(); - SetupCmd(); - - /* execute command */ - code = cmd_Dispatch(argc, argv); - - return (code); -} diff --git a/src/WINNT/afs_setup_utils/animate_icon.cpp b/src/WINNT/afs_setup_utils/animate_icon.cpp deleted file mode 100644 index 63e9a21b5..000000000 --- a/src/WINNT/afs_setup_utils/animate_icon.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include -#include -#include "../afsapplib/subclass.h" -#include "animate_icon.h" -#include "resource.h" - - -/* - * Definitions ___________________________________________________________________ - * - */ -#define GWD_ANIMATIONFRAME TEXT("afsapplib/al_misc.cpp - next animation frame") - - -/* - * ANIMATION __________________________________________________________________ - * - */ - -void AnimateIcon (HWND hIcon, int *piFrameLast) -{ - static HICON hiStop; - static HICON hiFrame[8]; - static BOOL fLoaded = FALSE; - - if (!fLoaded) - { - hiStop = TaLocale_LoadIcon (IDI_SPINSTOP); - hiFrame[0] = TaLocale_LoadIcon (IDI_SPIN1); - hiFrame[1] = TaLocale_LoadIcon (IDI_SPIN2); - hiFrame[2] = TaLocale_LoadIcon (IDI_SPIN3); - hiFrame[3] = TaLocale_LoadIcon (IDI_SPIN4); - hiFrame[4] = TaLocale_LoadIcon (IDI_SPIN5); - hiFrame[5] = TaLocale_LoadIcon (IDI_SPIN6); - hiFrame[6] = TaLocale_LoadIcon (IDI_SPIN7); - hiFrame[7] = TaLocale_LoadIcon (IDI_SPIN8); - fLoaded = TRUE; - } - - if (piFrameLast) - { - *piFrameLast = (*piFrameLast == 7) ? 0 : (1+*piFrameLast); - } - - SendMessage (hIcon, STM_SETICON, (WPARAM)((piFrameLast) ? hiFrame[ *piFrameLast ] : hiStop), 0); -} - - -BOOL CALLBACK AnimationHook (HWND hIcon, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hIcon, AnimationHook); - - static int iFrame = 0; - - switch (msg) - { - case WM_TIMER: - AnimateIcon (hIcon, &iFrame); - break; - - case WM_DESTROY: - Subclass_RemoveHook (hIcon, AnimationHook); - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hIcon, msg, wp, lp); - else - return DefWindowProc (hIcon, msg, wp, lp); -} - -void StartAnimation (HWND hIcon, int fps) -{ - Subclass_AddHook (hIcon, AnimationHook); - SetTimer (hIcon, 0, 1000/((fps) ? fps : 8), NULL); - AnimateIcon (hIcon); -} - -void StopAnimation (HWND hIcon) -{ - KillTimer (hIcon, 0); - AnimateIcon (hIcon); - Subclass_RemoveHook (hIcon, AnimationHook); -} - diff --git a/src/WINNT/afs_setup_utils/animate_icon.h b/src/WINNT/afs_setup_utils/animate_icon.h deleted file mode 100644 index 7a8ad70b7..000000000 --- a/src/WINNT/afs_setup_utils/animate_icon.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -void AnimateIcon (HWND hIcon, int *piFrameLast = NULL); -void StartAnimation (HWND hIcon, int fps); -void StopAnimation (HWND hIcon); - diff --git a/src/WINNT/afs_setup_utils/cc_uninst.def b/src/WINNT/afs_setup_utils/cc_uninst.def deleted file mode 100644 index a66d18ad3..000000000 --- a/src/WINNT/afs_setup_utils/cc_uninst.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY CCUninst.dll - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - DllEntryPoint - UninstInitialize - UninstUnInitialize - diff --git a/src/WINNT/afs_setup_utils/client_uninst.def b/src/WINNT/afs_setup_utils/client_uninst.def deleted file mode 100644 index f52ec0f73..000000000 --- a/src/WINNT/afs_setup_utils/client_uninst.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY ClientUninst.dll - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - DllEntryPoint - UninstInitialize - UninstUnInitialize - diff --git a/src/WINNT/afs_setup_utils/docs_uninst.def b/src/WINNT/afs_setup_utils/docs_uninst.def deleted file mode 100644 index c79b4fa88..000000000 --- a/src/WINNT/afs_setup_utils/docs_uninst.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY DocsUninst.dll - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - DllEntryPoint - UninstInitialize - UninstUnInitialize - diff --git a/src/WINNT/afs_setup_utils/forceremove.c b/src/WINNT/afs_setup_utils/forceremove.c deleted file mode 100644 index 49a93b36a..000000000 --- a/src/WINNT/afs_setup_utils/forceremove.c +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "forceremove.h" -#include "sutil.h" - - -/* Functions to forcibly remove AFS software without using InstallShield. */ - -#define CLIENT34_FME_VALUE "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\File Manager\\AddOns\\AFS Client FME" - -#define MS_UNINSTALL_KEY "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" - - -static DWORD -ClientSoftwareGet(DWORD *version, char *dir, DWORD dirSize); - -static DWORD -ClientServiceDelete(void); - -static DWORD -FileForceRemove(const char *filePath); - -static DWORD -DirectoryForceRemove(const char *dir); - -static DWORD -FolderLocateInTree(const char *dir, const char *folderName, char *buf); - -static DWORD -Client34ZapUninstallKeys(void); - - - -/* ------------------ exported functions ---------------------- */ - - -/* - * Client34Eradicate() -- remove AFS 3.4a client, if extant. - * - * If keepConfig is TRUE then the following are not removed: - * - * a) file %WINDIR%\afsdcell.ini - CellServDB - * b) file %WINDIR%\afsdsbmt.ini - submount settings - * c) file %WINDIR%\afsd.ini - client parameter settings - */ -DWORD Client34Eradicate(BOOL keepConfig) -{ - DWORD rc = ERROR_SUCCESS; - DWORD status, version; - BOOL installPathValid = FALSE; - char installPath[MAX_PATH]; - char winPath[MAX_PATH]; - char sysPath[MAX_PATH]; - char filePath[MAX_PATH]; - - /* check client version and fetch install directory */ - - status = ClientSoftwareGet(&version, installPath, MAX_PATH); - - if (status == ERROR_SUCCESS) { - if (version == 34) { - /* 3.4 client to eradicate */ - installPathValid = TRUE; - } else { - /* 3.5 or later client installed */ - return ERROR_SUCCESS; - } - } - - /* If no client info found then assume partial unconfigure and keep - * trying. Save errors as proceed but keep going to maximize removal. - */ - - - /* stop and delete client service */ - - status = ClientServiceDelete(); - if (status != ERROR_SUCCESS) { - rc = status; - } - - /* remove client files */ - - status = GetWindowsDirectory(winPath, MAX_PATH); - if (status == 0 || status > MAX_PATH) { - /* this should never happen */ - winPath[0] = '\0'; - } - - status = GetSystemDirectory(sysPath, MAX_PATH); - if (status == 0 || status > MAX_PATH) { - /* this should never happen */ - sysPath[0] = '\0'; - } - - if (installPathValid) { - status = DirectoryForceRemove(installPath); - if (status != ERROR_SUCCESS && status != ERROR_PATH_NOT_FOUND) { - rc = status; - } - } - - sprintf(filePath, "%s\\%s", winPath, "temp\\afsd.log"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - sprintf(filePath, "%s\\%s", winPath, "temp\\afsd_init.log"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - sprintf(filePath, "%s\\%s", sysPath, "afs_cpa.cpl"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - sprintf(filePath, "%s\\%s", sysPath, "afs_shl_ext.dll"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - if (!keepConfig) { - sprintf(filePath, "%s\\%s", installPath, "Client\\afsdcell.ini"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - sprintf(filePath, "%s\\%s", installPath, "Client\\afsdsbmt.ini"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - sprintf(filePath, "%s\\%s", installPath, "Client\\afsd.ini"); - status = FileForceRemove(filePath); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - } - - do { /* locate all start menu entries (common or for a user) */ - status = FolderLocateInTree(winPath, "Transarc AFS Client", filePath); - if (status == ERROR_SUCCESS) { - status = DirectoryForceRemove(filePath); - } - } while (status == ERROR_SUCCESS); - if (status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - /* update relevant Microsoft registry entries */ - - status = RegDeleteEntryAlt(CLIENT34_FME_VALUE, REGENTRY_VALUE); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - status = Client34ZapUninstallKeys(); - if (status != ERROR_SUCCESS) { - rc = status; - } - - if (!RemoveFromProviderOrder(AFSREG_CLT_SVC_NAME)) { - /* function does not supply an error value; make one up */ - rc = ERROR_FILE_NOT_FOUND; - } - - if (installPathValid) { - status = GetShortPathName(installPath, filePath, MAX_PATH); - if (status == 0 || status > MAX_PATH) { - strcpy(filePath, installPath); - } - strcat(filePath, "\\Program"); - if (!RemoveFromSystemPath(filePath)) { - /* function does not supply an error value; make one up */ - rc = ERROR_FILE_NOT_FOUND; - } - } - - /* remove client registry entries */ - - status = RegDeleteEntryAlt(AFSREG_CLT_SVC_KEY, REGENTRY_KEY); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - - status = RegDeleteEntryAlt(AFSREG_CLT_SW_KEY, REGENTRY_KEY); - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - rc = status; - } - return rc; -} - - - -/* ------------------ utility functions ---------------------- */ - - -/* - * ClientSoftwareGet() -- fetch client software installation information. - */ -static DWORD -ClientSoftwareGet(DWORD *version, char *dir, DWORD dirSize) -{ - HKEY key; - DWORD rc = ERROR_SUCCESS; - - /* get client version and install directory */ - - rc = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_CLT_SW_VERSION_KEY, - KEY_READ, 0, &key, NULL); - if (rc == ERROR_SUCCESS) { - DWORD major, minor, dataSize; - - dataSize = sizeof(DWORD); - rc = RegQueryValueEx(key, AFSREG_CLT_SW_VERSION_MAJOR_VALUE, - NULL, NULL, (void*)&major, &dataSize); - if (rc == ERROR_SUCCESS) { - dataSize = sizeof(DWORD); - rc = RegQueryValueEx(key, AFSREG_CLT_SW_VERSION_MINOR_VALUE, - NULL, NULL, (void*)&minor, &dataSize); - if (rc == ERROR_SUCCESS) { - dataSize = dirSize; - rc = RegQueryValueEx(key, AFSREG_CLT_SW_VERSION_DIR_VALUE, - NULL, NULL, dir, &dataSize); - } - } - (void)RegCloseKey(key); - - if (rc == ERROR_SUCCESS) { - *version = (major * 10) + minor; - } - } - return rc; -} - - -/* - * ClientServiceDelete() -- stop and delete the client service. - */ -static DWORD -ClientServiceDelete(void) -{ - SC_HANDLE scmHandle, svcHandle; - DWORD rc = ERROR_SUCCESS; - - if ((scmHandle = OpenSCManager(NULL, - NULL, SC_MANAGER_ALL_ACCESS)) == NULL || - (svcHandle = OpenService(scmHandle, - AFSREG_CLT_SVC_NAME, - SERVICE_ALL_ACCESS)) == NULL) { - /* can't connect to SCM or can't open service */ - DWORD status = GetLastError(); - - if (status != ERROR_SERVICE_DOES_NOT_EXIST) { - rc = status; - } - - if (scmHandle != NULL) { - CloseServiceHandle(scmHandle); - } - - } else { - SERVICE_STATUS svcStatus; - - if (!ControlService(svcHandle, SERVICE_CONTROL_STOP, &svcStatus)) { - /* service stop failed */ - DWORD status = GetLastError(); - - if (status != ERROR_SERVICE_NOT_ACTIVE) { - rc = status; - } - } - - if (rc == ERROR_SUCCESS) { - if (!DeleteService(svcHandle)) { - /* service delete failed */ - DWORD status = GetLastError(); - - if (status != ERROR_SERVICE_MARKED_FOR_DELETE) { - rc = status; - } - } - } - - CloseServiceHandle(svcHandle); - CloseServiceHandle(scmHandle); - - if (rc == ERROR_SUCCESS) { - /* let client state settle; not mandatory so don't do query */ - Sleep(2000); - } - } - return rc; -} - - -/* - * DirectoryForceRemove() -- forcibly, and recursively, remove a directory - * and its contents; this may require moving in-use files to a temp - * directory and marking them for delete on reboot. - */ -static DWORD -DirectoryForceRemove(const char *dir) -{ - DWORD rc = ERROR_SUCCESS; - HANDLE enumHandle; - WIN32_FIND_DATA enumResult; - char filePath[MAX_PATH]; - - /* enumerate directory and delete contents */ - - sprintf(filePath, "%s\\*.*", dir); - - enumHandle = FindFirstFile(filePath, &enumResult); - - if (enumHandle == INVALID_HANDLE_VALUE) { - DWORD status = GetLastError(); - - if (status != ERROR_NO_MORE_FILES) { - /* failure other than contents already deleted */ - rc = status; - } - - } else { - while (1) { - DWORD status; - - sprintf(filePath, "%s\\%s", dir, enumResult.cFileName); - - if (enumResult.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (strcmp(enumResult.cFileName, ".") == 0 || - strcmp(enumResult.cFileName, "..") == 0) { - /* ignore these special directories */ - status = ERROR_SUCCESS; - } else { - status = DirectoryForceRemove(filePath); - } - } else { - status = FileForceRemove(filePath); - } - - if (status != ERROR_SUCCESS && status != ERROR_FILE_NOT_FOUND) { - /* save error but keep on truckin' */ - rc = status; - } - - if (!FindNextFile(enumHandle, &enumResult)) { - status = GetLastError(); - - if (status != ERROR_NO_MORE_FILES) { - rc = status; - } - break; - } - } - FindClose(enumHandle); - } - - if (rc == ERROR_SUCCESS) { - if (!RemoveDirectory(dir)) { - rc = GetLastError(); - } - } - return rc; -} - - -/* - * FileForceRemove() -- forcibly remove a file; if the file is in-use then - * move the file to a temp directory and mark it for delete on reboot. - */ -static DWORD -FileForceRemove(const char *filePath) -{ - DWORD rc = ERROR_SUCCESS; - - if (!DeleteFile(filePath)) { - rc = GetLastError(); - - if (rc != ERROR_FILE_NOT_FOUND) { - /* couldn't just delete; probably in use; try to move */ - char filePathFull[MAX_PATH]; - char *dummy; - DWORD status; - - rc = ERROR_SUCCESS; - - status = GetFullPathName(filePath, MAX_PATH, filePathFull, &dummy); - if (status == 0 || status > MAX_PATH) { - if (status == 0) { - rc = GetLastError(); - } else { - rc = ERROR_INVALID_PARAMETER; - } - } - - if (rc == ERROR_SUCCESS) { - char tempDir[MAX_PATH]; - char tempPath[MAX_PATH]; - - status = GetTempPath(MAX_PATH, tempDir); - if ((status == 0 || status > MAX_PATH) || - (_strnicmp(tempDir, filePathFull, 3))) { - /* failed getting temp dir, or temp dir is on different - * drive than file (so can't do a true move to there). - */ - sprintf(tempDir, "%c:\\", filePathFull[0]); - } - - if (!GetTempFileName(tempDir, "AFS", 0, tempPath)) { - rc = GetLastError(); - } else { - if (MoveFileEx(filePathFull, tempPath, - MOVEFILE_REPLACE_EXISTING)) { - (void)SetFileAttributes(tempPath, - FILE_ATTRIBUTE_NORMAL); - (void)MoveFileEx(tempPath, NULL, - MOVEFILE_DELAY_UNTIL_REBOOT); - } else { - rc = GetLastError(); - } - } - } - } - } - return rc; -} - - -/* - * FolderLocateInTree() -- find an instance of named directory in specified - * tree; folderName is presumed to be a directory name only (i.e., not - * a path); buf is presumed to be at least MAX_PATH characters. - */ -static DWORD -FolderLocateInTree(const char *dir, const char *folderName, char *buf) -{ - DWORD rc = ERROR_SUCCESS; - HANDLE enumHandle; - WIN32_FIND_DATA enumResult; - char filePath[MAX_PATH]; - - /* enumerate directory recursively looking for folder */ - - sprintf(filePath, "%s\\*.*", dir); - - enumHandle = FindFirstFile(filePath, &enumResult); - - if (enumHandle == INVALID_HANDLE_VALUE) { - DWORD status = GetLastError(); - - if (status == ERROR_NO_MORE_FILES) { - rc = ERROR_FILE_NOT_FOUND; - } else { - rc = status; - } - - } else { - while (1) { - DWORD status = ERROR_FILE_NOT_FOUND; - - if (enumResult.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (_stricmp(enumResult.cFileName, folderName) == 0) { - /* is folder that we're looking for */ - sprintf(buf, "%s\\%s", dir, enumResult.cFileName); - status = ERROR_SUCCESS; - - } else if (strcmp(enumResult.cFileName, ".") != 0 && - strcmp(enumResult.cFileName, "..") != 0) { - /* is not folder that we're looking for; search it */ - sprintf(filePath, "%s\\%s", dir, enumResult.cFileName); - status = FolderLocateInTree(filePath, folderName, buf); - } - } - - if (status != ERROR_FILE_NOT_FOUND) { - /* found folder or encountered an error; quit */ - rc = status; - break; - } else { - /* folder not found; keep looking */ - if (!FindNextFile(enumHandle, &enumResult)) { - status = GetLastError(); - - if (status == ERROR_NO_MORE_FILES) { - rc = ERROR_FILE_NOT_FOUND; - } else { - rc = status; - } - break; - } - } - } - FindClose(enumHandle); - } - return rc; -} - - -/* - * Client34ZapUninstallKeys() -- delete all of the client uninstall keys - */ -static DWORD -Client34ZapUninstallKeys(void) -{ - DWORD rc = ERROR_SUCCESS; - HKEY key; - - /* enumerate all uninstall registry keys looking for client's */ - - rc = RegOpenKeyAlt(AFSREG_NULL_KEY, - MS_UNINSTALL_KEY, KEY_ALL_ACCESS, 0, &key, NULL); - if (rc == ERROR_SUCCESS) { - char *keyEnum; - - rc = RegEnumKeyAlt(key, &keyEnum); - if (rc == ERROR_SUCCESS && keyEnum != NULL) { - char *keyEnumName; - - for (keyEnumName = keyEnum; - *keyEnumName != '\0'; - keyEnumName += strlen(keyEnumName) + 1) { - if (_stricmp(keyEnumName, "AFSDeinstKey") == 0 || - _strnicmp(keyEnumName, "AFSV34", 6) == 0) { - /* found an AFS uninstall key */ - DWORD status = RegDeleteKeyAlt(key, keyEnumName); - if (status != ERROR_SUCCESS) { - rc = status; - } - } - } - free(keyEnum); - } - (void) RegCloseKey(key); - } - return rc; -} diff --git a/src/WINNT/afs_setup_utils/forceremove.h b/src/WINNT/afs_setup_utils/forceremove.h deleted file mode 100644 index f6c1d317c..000000000 --- a/src/WINNT/afs_setup_utils/forceremove.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFS_FORCEREMOVE_H -#define AFS_FORCEREMOVE_H - -/* Functions to forcibly remove AFS software without using InstallShield. */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern DWORD Client34Eradicate(BOOL keepConfig); - -#ifdef __cplusplus -}; -#endif - -#endif /* AFS_FORCEREMOVE_H */ diff --git a/src/WINNT/afs_setup_utils/install_utils.def b/src/WINNT/afs_setup_utils/install_utils.def deleted file mode 100644 index 030fbe1dc..000000000 --- a/src/WINNT/afs_setup_utils/install_utils.def +++ /dev/null @@ -1,21 +0,0 @@ -LIBRARY InstallUtils.dll - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - DllEntryPoint - InstallServerService - InstallClientService - AddToPath - AddToNetworkProviderOrder - CheckIfAdmin - SetSilentMode - WriteToInstallErrorLog - RestoreConfigInfo - Eradicate34Client - Upgrade34ClientConfigInfo - IsWin98 - ShowLicense - - diff --git a/src/WINNT/afs_setup_utils/lang/NTMakefile b/src/WINNT/afs_setup_utils/lang/NTMakefile deleted file mode 100644 index 89b5de4cc..000000000 --- a/src/WINNT/afs_setup_utils/lang/NTMakefile +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\afs_setup_utils\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\afs_setup_utils_$(LANGID).dll - -RCFILE = $(LANGNAME)\afs_setup_utils.rc - -RESFILE = $(OUT)\afs_setup_utils_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist *.res del *.res - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/afs_setup_utils/lang/de_DE/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/de_DE/afs_setup_utils.rc deleted file mode 100644 index de602dcf1..000000000 --- a/src/WINNT/afs_setup_utils/lang/de_DE/afs_setup_utils.rc +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Setup Utilities DLL" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_CHARSET 1252 -#define AFS_VERINFO_LANG_CODE 0x407 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "Ein Fehler ist aufgetreten: %s (%ld)." - IDS_SCM_OPEN_FAILED "Service Control Manager komnnte nicht geöffnet werden" - IDS_SERVICE_CREATE_FAILED "Service konnte nicht erstellt werden" - IDS_SERVICE_OPEN_FAILED "Service konnte nicht geöffnet werden" - IDS_SERVICE_QUERY_FAILED "Der Status des Service konnte nicht abgefragt werden" - IDS_SERVICE_STOP_FAILED "Service konnte nicht gestoppt werden" - IDS_SERVICE_DELETE_FAILED "Service konnte nicht gelöscht werden" - IDS_REG_DELETE_VALUE_ERROR "Registrierungseinträge konnten nicht gelöscht werden" - IDS_SERVICE_ENABLE_FAILED "Service konnte nicht aktiviert werden" - IDS_OLE_DLL_INSTALL_FAILED "Eine OLE-DLL konnte nicht installiert werden" - IDS_OLE_DLL_UNINSTALL_FAILED "Eine OLE-DLL konnte nicht deinstalliert werden" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "Die Shellerweiterung für das Mounten/Unmounten von Dateigruppen konnte nicht deinstalliert werden" - IDS_EXTENSION_DLL_INSTALL_FAILED - "Die Shellerweiterung für das Mounten/Unmounten von Dateigruppen konnte nicht installiert werden" - IDS_CANT_DETERMINE_PRODUCT - "Zu deinstallierendes AFS-Produkt konnte nicht ermittelt werden" - IDS_TITLE "AFS® für Windows" - IDS_CANT_DETERMINE_APP_PATH - "Installationsverzeichnis der Anwendung konnte nicht ermittelt werden" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS Client" - IDS_SERVER_APP_NAME "AFS Server" - IDS_CC_APP_NAME "AFS Control Center" - IDS_CANT_LOAD_RESOURCES "Produkt kann nicht deinstalliert werden: Fehler beim Laden der Deinstallionsressourcen." - IDS_CANT_UNINSTALL_AFSCREDS "Fehler beim dekonfigurieren des AFS Client." - IDS_MUST_STOP_SERVER "Der AFS Server muß gestoppt werden, bevor die Installation fortgesetzt werden kann. Dieser Vorgang kann einige Zeit in Anspruch nehmen. Soll der Server jetzt gestoppt werden?" - IDS_MUST_STOP_CLIENT "Der AFS Client muß gestoppt werden, bevor die Installation fortgesetzt werden kann. Soll der Client jetzt gestoppt werden? " - IDS_LIGHT_CLIENT_APP_NAME "AFS Light" - IDS_WAITING_FOR_CLIENT_TO_STOP "AFS Client wird gestoppt. Bitte warten..." - IDS_WAITING_FOR_SERVER_TO_STOP "AFS Server wird gestoppt. Bitte warten..." - IDS_CLIENT_NEEDED_BY_SERVER "Wenn Sie den AFS Client deinstallieren, wird der AFS Server nicht mehr ordnungsgemäß funktionieren. Deinstallation fortsetzen?" - IDS_PRESERVE_CLIENT_CONFIG_INFO "Möchten Sie die Konfigurationsdaten des Clients erhalten? Dies kann bei einer Erweiterung oder erneuten Installation sinnvoll sein." - IDS_PRESERVE_SERVER_CONFIG_INFO "Möchten Sie die Konfigurationsdaten des Servers erhalten? Dies kann bei einer Erweiterung oder erneuten Installation sinnvoll sein." - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "Frühere Konfigurationsdaten konnten nicht wiederhergestellt werden" - IDS_SAVE_OF_CONFIG_INFO_FAILED "Konfigurationsdaten konnten nicht gesichert werden. Deinstallation fortsetzen?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "Möchten Sie die Konfigurationsdaten des AFS Light Clients erhalten? Dies kann bei einer Erweiterung oder erneuten Installation sinnvoll sein." - IDS_PRESERVE_CC_CONFIG_INFO "Möchten Sie die Konfigurationsdaten des Control Center erhalten? Dies kann bei einer Erweiterung oder erneuten Installation sinnvoll sein." -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS® für Windows" -FONT 9, "MS Shell Dlg" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "AFS Server wird gestoppt. Bitte warten...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Lizenzvereinbarung" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "&Akzeptieren",IDOK,197,185,50,14 - PUSHBUTTON "Abbrechen",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | - ES_READONLY | WS_VSCROLL,10,10,295,161,WS_EX_STATICEDGE - PUSHBUTTON "&Drucken",IDC_PRINT,10,185,50,14 - PUSHBUTTON "A&blehnen",IDCANCEL,147,185,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - - diff --git a/src/WINNT/afs_setup_utils/lang/en_US/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/en_US/afs_setup_utils.rc deleted file mode 100644 index 8febb20d3..000000000 --- a/src/WINNT/afs_setup_utils/lang/en_US/afs_setup_utils.rc +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Setup Utilities DLL" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_CHARSET 1252 -#define AFS_VERINFO_LANG_CODE 0x409 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "An error has occurred: %s (%ld)." - IDS_SCM_OPEN_FAILED "Failed to open Service Control Manager" - IDS_SERVICE_CREATE_FAILED "Failed to create service" - IDS_SERVICE_OPEN_FAILED "Failed to open service" - IDS_SERVICE_QUERY_FAILED "Failed to query service status" - IDS_SERVICE_STOP_FAILED "Failed to stop service" - IDS_SERVICE_DELETE_FAILED "Failed to delete service" - IDS_REG_DELETE_VALUE_ERROR "Failed to delete registry entries" - IDS_SERVICE_ENABLE_FAILED "Failed to enable service" - IDS_OLE_DLL_INSTALL_FAILED "Failed to install an OLE DLL" - IDS_OLE_DLL_UNINSTALL_FAILED "Failed to uninstall an OLE DLL" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "Failed to uninstall the fileset mount/unmount shell extension" - IDS_EXTENSION_DLL_INSTALL_FAILED - "Failed to install the fileset mount/unmount shell extension" - IDS_CANT_DETERMINE_PRODUCT - "Cannot determine which AFS product to uninstall" - IDS_TITLE "AFS® for Windows" - IDS_CANT_DETERMINE_APP_PATH - "Failed to determine the application's installation directory" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS Client" - IDS_SERVER_APP_NAME "AFS Server" - IDS_CC_APP_NAME "AFS Control Center" - IDS_CANT_LOAD_RESOURCES "Cannot uninstall this product: Load of uninstall resources has failed." - IDS_CANT_UNINSTALL_AFSCREDS "Failed to unconfigure the AFS Client." - IDS_MUST_STOP_SERVER "The AFS Server must be stopped before uninstallation can continue. This can be a very lengthy process. Stop the Server now?" - IDS_MUST_STOP_CLIENT "The AFS Client must be stopped before uninstallation can continue. Stop the Client now?" - IDS_LIGHT_CLIENT_APP_NAME "AFS Light" - IDS_WAITING_FOR_CLIENT_TO_STOP "Stopping the AFS Client. Please wait..." - IDS_WAITING_FOR_SERVER_TO_STOP "Stopping the AFS Server. Please wait..." - IDS_CLIENT_NEEDED_BY_SERVER "Uninstalling the AFS Client will prevent the AFS Server from functioning properly. Proceed with the uninstall?" - IDS_PRESERVE_CLIENT_CONFIG_INFO "Do you wish to preserve the Client's configuration information? You may want to do this if you are upgrading or reinstalling." - IDS_PRESERVE_SERVER_CONFIG_INFO "Do you wish to preserve the Server's configuration information? You may want to do this if you are upgrading or reinstalling." - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "Failed to restore previous configuration information" - IDS_SAVE_OF_CONFIG_INFO_FAILED "Failed to save the configuration information. Proceed with the uninstall?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "Do you wish to preserve AFS Light's configuration information? You may want to do this if you are upgrading or reinstalling." - IDS_PRESERVE_CC_CONFIG_INFO "Do you wish to preserve the Control Center's configuration information? You may want to do this if you are upgrading or reinstalling." -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS® for Windows" -FONT 9, "MS Shell Dlg" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "Stopping the AFS Server. Please wait...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "License Agreement" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "I &Agree",IDOK,197,185,50,14 - PUSHBUTTON "Cancel",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | - ES_READONLY | WS_VSCROLL,10,10,295,161,WS_EX_STATICEDGE - PUSHBUTTON "&Print",IDC_PRINT,10,185,50,14 - PUSHBUTTON "I &Disagree",IDCANCEL,147,185,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - diff --git a/src/WINNT/afs_setup_utils/lang/es_ES/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/es_ES/afs_setup_utils.rc deleted file mode 100644 index b9905a001..000000000 --- a/src/WINNT/afs_setup_utils/lang/es_ES/afs_setup_utils.rc +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Setup Utilities DLL" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_CHARSET 1252 -#define AFS_VERINFO_LANG_CODE 0x40a -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "Se ha producido un error: %s (%ld)." - IDS_SCM_OPEN_FAILED "Anomalía al abrir el Gestor de control de servicio" - IDS_SERVICE_CREATE_FAILED "Anomalía al crear el servicio" - IDS_SERVICE_OPEN_FAILED "Anomalía al abrir el servicio" - IDS_SERVICE_QUERY_FAILED "Anomalía al consultar el estado del servicio" - IDS_SERVICE_STOP_FAILED "Anomalía al detener el servicio" - IDS_SERVICE_DELETE_FAILED "Anomalía al suprimir el servicio" - IDS_REG_DELETE_VALUE_ERROR "Anomalía al suprimir entradas de registro" - IDS_SERVICE_ENABLE_FAILED "Anomalía al habilitar el servicio" - IDS_OLE_DLL_INSTALL_FAILED "Anomalía al instalar una DLL OLE" - IDS_OLE_DLL_UNINSTALL_FAILED "Anomalía al desinstalar una DLL OLE" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "Anomalía al desinstalar la extensión de shell de montaje/desmontaje de conjunto de archivos" - IDS_EXTENSION_DLL_INSTALL_FAILED - "Anomalía al instalar la extensión de shell de montaje/desmontaje de conjunto de archivos" - IDS_CANT_DETERMINE_PRODUCT - "No se puede determinar qué producto de AFS se va a desinstalar" - IDS_TITLE "AFS« para Windows" - IDS_CANT_DETERMINE_APP_PATH - "No se ha podido determinar el directorio de instalación de la aplicación" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS Client" - IDS_SERVER_APP_NAME "AFS Server" - IDS_CC_APP_NAME "AFS Control Center" - IDS_CANT_LOAD_RESOURCES "No se puede desinstalar este producto: la carga de los recursos de desinstalación ha fallado." - IDS_CANT_UNINSTALL_AFSCREDS "Anomalía al desconfigurar AFS Client." - IDS_MUST_STOP_SERVER "AFS Server debe detenerse antes de que pueda continuar la desinstalación. Este proceso puede ser muy largo. ¿Detener el Server ahora?" - IDS_MUST_STOP_CLIENT "AFS Client debe detenerse antes de que pueda continuar la desinstalación. Este proceso puede ser muy largo. ¿Detener el Client ahora?" - IDS_LIGHT_CLIENT_APP_NAME "AFS Light" - IDS_WAITING_FOR_CLIENT_TO_STOP "Deteniendo AFS Client. Espere, por favor..." - IDS_WAITING_FOR_SERVER_TO_STOP "Deteniendo AFS Server. Espere, por favor..." - IDS_CLIENT_NEEDED_BY_SERVER "La desinstalación de AFS Client impedirá que AFS Server funcione correctamente. ¿Continuar con la desinstalación?" - IDS_PRESERVE_CLIENT_CONFIG_INFO "¿Desea conservar la información de configuración de Client? Es recomendable si va a actualizarlo o instalarlo de nuevo." - IDS_PRESERVE_SERVER_CONFIG_INFO "¿Desea conservar la información de configuración de Server? Es recomendable si va a actualizarlo o instalarlo de nuevo." - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "Anomalía al restaurar la información de configuración anterior" - IDS_SAVE_OF_CONFIG_INFO_FAILED "Anomalía al guardar la información de configuración. ¿Continuar con la desinstalación?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "¿Desea conservar la información de configuración de AFS Light? Es recomendable si va a actualizarlo o instalarlo de nuevo." - IDS_PRESERVE_CC_CONFIG_INFO "¿Desea conservar la información de configuración de Control Center? Es recomendable si va a actualizarlo o instalarlo de nuevo." -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS« para Windows" -FONT 9, "MS Shell Dlg" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "Deteniendo AFS Server. Espere, por favor...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - - - - diff --git a/src/WINNT/afs_setup_utils/lang/ja_JP/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/ja_JP/afs_setup_utils.rc deleted file mode 100644 index d617b12f3..000000000 --- a/src/WINNT/afs_setup_utils/lang/ja_JP/afs_setup_utils.rc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒZƒbƒgƒAƒbƒvEƒ†[ƒeƒBƒŠƒeƒB[ DLL" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_CHARSET 932 -#define AFS_VERINFO_LANG_CODE 0x411 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "ƒGƒ‰[‚ª‹N‚±‚è‚Ü‚µ‚½: %s (%ld)." - IDS_SCM_OPEN_FAILED "ƒT[ƒrƒXEƒRƒ“ƒgƒ[ƒ‹Eƒ}ƒl[ƒWƒƒ[‚̃I[ƒvƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SERVICE_CREATE_FAILED "ƒT[ƒrƒX‚̍쐬‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SERVICE_OPEN_FAILED "ƒT[ƒrƒX‚̃I[ƒvƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SERVICE_QUERY_FAILED "ƒT[ƒrƒXó‹µ‚̏Ɖï‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SERVICE_STOP_FAILED "ƒT[ƒrƒX‚Ì’âŽ~‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SERVICE_DELETE_FAILED "ƒT[ƒrƒX‚̍폜‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_REG_DELETE_VALUE_ERROR "ƒŒƒWƒXƒgƒŠ[€–ڂ̍폜‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SERVICE_ENABLE_FAILED "ƒT[ƒrƒX‚ðŽg—p‰Â”\‚ɂł«‚Ü‚¹‚ñ‚Å‚µ‚½" - IDS_OLE_DLL_INSTALL_FAILED "OLE DLL ‚̃Cƒ“ƒXƒg[ƒ‹‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_OLE_DLL_UNINSTALL_FAILED "OLE DLL ‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "ƒtƒ@ƒCƒ‹EƒZƒbƒg‚̃}ƒEƒ“ƒg/ƒ}ƒEƒ“ƒg‰ðœƒVƒFƒ‹Šg’£‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_EXTENSION_DLL_INSTALL_FAILED - "ƒtƒ@ƒCƒ‹EƒZƒbƒg‚̃}ƒEƒ“ƒg/ƒ}ƒEƒ“ƒg‰ðœƒVƒFƒ‹Šg’£‚̃Cƒ“ƒXƒg[ƒ‹‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_CANT_DETERMINE_PRODUCT - "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é AFS ƒvƒƒ_ƒNƒg‚𔻕ʂł«‚Ü‚¹‚ñ" - IDS_TITLE "AFS(R) for Windows" - IDS_CANT_DETERMINE_APP_PATH - "ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚éƒfƒBƒŒƒNƒgƒŠ[‚𔻕ʂł«‚Ü‚¹‚ñ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS ƒNƒ‰ƒCƒAƒ“ƒg" - IDS_SERVER_APP_NAME "AFS ƒT[ƒo[" - IDS_CC_APP_NAME "AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[" - IDS_CANT_LOAD_RESOURCES "‚±‚̃vƒƒ_ƒNƒg‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Å‚«‚Ü‚¹‚ñBƒAƒ“ƒCƒ“ƒXƒg[ƒ‹EƒŠƒ\[ƒX‚̃[ƒh‚ÉŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_CANT_UNINSTALL_AFSCREDS "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚̍\¬‰ðœ‚ÉŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_MUST_STOP_SERVER "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚𑱍s‚Å‚«‚邿‚¤‚É AFS ƒT[ƒo[‚ð’âŽ~‚µ‚Ä‚­‚¾‚³‚¢B‚±‚ê‚ɂ͒·ŽžŠÔ‚©‚©‚è‚Ü‚·BƒT[ƒo[‚ð‚½‚¾‚¿‚É’âŽ~‚µ‚Ü‚·‚©?" - IDS_MUST_STOP_CLIENT "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚𑱍s‚Å‚«‚邿‚¤‚É AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ð’âŽ~‚µ‚Ä‚­‚¾‚³‚¢BƒNƒ‰ƒCƒAƒ“ƒg‚ð‚½‚¾‚¿‚É’âŽ~‚µ‚Ü‚·‚©?" - IDS_LIGHT_CLIENT_APP_NAME "AFS Light" - IDS_WAITING_FOR_CLIENT_TO_STOP "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ð’âŽ~’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢..." - IDS_WAITING_FOR_SERVER_TO_STOP "AFS ƒT[ƒo[‚ð’âŽ~’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢..." - IDS_CLIENT_NEEDED_BY_SERVER "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚邯AAFS ƒT[ƒo[‚ª³í‚É‹@”\‚µ‚È‚­‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·BƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚𑱍s‚µ‚Ü‚·‚©?" - IDS_PRESERVE_CLIENT_CONFIG_INFO "ƒNƒ‰ƒCƒAƒ“ƒg‚̍\¬î•ñ‚ð•ÛŽ‚µ‚Ü‚·‚©? ƒAƒbƒvƒOƒŒ[ƒh‚Ü‚½‚͍ăCƒ“ƒXƒg[ƒ‹‚̏ꍇ‚ɂ́A‚±‚ê‚ðs‚¤‚Æ—L—p‚Å‚·B" - IDS_PRESERVE_SERVER_CONFIG_INFO "ƒT[ƒo[‚̍\¬î•ñ‚ð•ÛŽ‚µ‚Ü‚·‚©? ƒAƒbƒvƒOƒŒ[ƒh‚Ü‚½‚͍ăCƒ“ƒXƒg[ƒ‹‚̏ꍇ‚ɂ́A‚±‚ê‚ðs‚¤‚Æ—L—p‚Å‚·B" - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "‘O‚̍\¬î•ñ‚Ì•œŒ³‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_SAVE_OF_CONFIG_INFO_FAILED "\¬î•ñ‚̕ۊǂɎ¸”s‚µ‚Ü‚µ‚½BƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚𑱍s‚µ‚Ü‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "AFS Light ‚̍\¬î•ñ‚ð•ÛŽ‚µ‚Ü‚·‚©? ƒAƒbƒvƒOƒŒ[ƒh‚Ü‚½‚͍ăCƒ“ƒXƒg[ƒ‹‚̏ꍇ‚ɂ́A‚±‚ê‚ðs‚¤‚Æ—L—p‚Å‚·B" - IDS_PRESERVE_CC_CONFIG_INFO "ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚̍\¬î•ñ‚ð•ÛŽ‚µ‚Ü‚·‚©? ƒAƒbƒvƒOƒŒ[ƒh‚Ü‚½‚͍ăCƒ“ƒXƒg[ƒ‹‚̏ꍇ‚ɂ́A‚±‚ê‚ðs‚¤‚Æ—L—p‚Å‚·B" -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS(R) for Windows" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "AFS ƒT[ƒo[‚ð’âŽ~’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "‚²Žg—pðŒ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "“¯ˆÓ‚·‚é(&A)",IDOK,197,185,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | - ES_READONLY | WS_VSCROLL,10,10,295,161,WS_EX_STATICEDGE - PUSHBUTTON "ˆóü(&P)",IDC_PRINT,10,185,50,14 - PUSHBUTTON "“¯ˆÓ‚µ‚È‚¢(&D)",IDCANCEL,147,185,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - - diff --git a/src/WINNT/afs_setup_utils/lang/ko_KR/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/ko_KR/afs_setup_utils.rc deleted file mode 100644 index 08cd70490..000000000 --- a/src/WINNT/afs_setup_utils/lang/ko_KR/afs_setup_utils.rc +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Setup Utilities DLL" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_CHARSET 949 -#define AFS_VERINFO_LANG_CODE 0x412 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_PROGRESS DIALOGEX 0, 0, 251, 53 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Windows¿ë AFS" -FONT 9, "±¼¸²" -BEGIN - ICON "",IDC_LOGO,17,16,20,21 - LTEXT "AFS ¼­¹ö¸¦ ÁßÁöÇϰí ÀÖ½À´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...", - IDC_MSG,50,23,184,10 - GROUPBOX "",IDC_STATIC,7,4,237,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "»ç¿ë±Ç °è¾à " -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "µ¿ÀÇÇÔ(&A)",IDOK,197,185,50,14 - PUSHBUTTON "Ãë¼Ò",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",WS_VSCROLL | 0x844,10,10,295, - 161,WS_EX_STATICEDGE - PUSHBUTTON "Àμâ(&P)",IDC_PRINT,10,185,50,14 - PUSHBUTTON "µ¿ÀÇÇÏÁö ¾ÊÀ½(&D)",IDCANCEL,135,185,62,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""resource.h""\r\n" - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""afs_component_version_number.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù. %s (%ld)." - IDS_SCM_OPEN_FAILED "¼­ºñ½º Á¦¾î °ü¸® ÇÁ·Î±×·¥À» ¿©´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_SERVICE_CREATE_FAILED "¼­ºñ½º ÀÛ¼º¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_SERVICE_OPEN_FAILED "¼­ºñ½º¸¦ ¿©´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù." - IDS_SERVICE_QUERY_FAILED "¼­ºñ½º »óÅ Á¶È¸¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_SERVICE_STOP_FAILED "¼­ºñ½º Á¤Áö¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_SERVICE_DELETE_FAILED "¼­ºñ½º »èÁ¦¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_REG_DELETE_VALUE_ERROR "·¹Áö½ºÆ®¸® ÀÔ·Â Ç׸ñ »èÁ¦¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_SERVICE_ENABLE_FAILED "¼­ºñ½º »ç¿ë °¡´ÉÈ­¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_OLE_DLL_INSTALL_FAILED "OLE DLL ¼³Ä¡¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_OLE_DLL_UNINSTALL_FAILED "OLE DLL ¼³Ä¡ ÇØÁ¦¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "ÆÄÀϼ¼Æ® ¸¶¿îÆ®/¾ð¸¶¿îÆ® ½© È®Àå ¼³Ä¡ ÇØÁ¦¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_EXTENSION_DLL_INSTALL_FAILED - "ÆÄÀϼ¼Æ® ¸¶¿îÆ®/¾ð¸¶¿îÆ® ½© È®Àå ¼³Ä¡¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù." - IDS_CANT_DETERMINE_PRODUCT "AFS Á¦Ç° ¼³Ä¡ ÇØÁ¦¸¦ °áÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_TITLE "Windows¿ë AFS" - IDS_CANT_DETERMINE_APP_PATH - "ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ¼³Ä¡ µð·ºÅ丮¸¦ °áÁ¤Çϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS Ŭ¶óÀ̾ðÆ®" - IDS_SERVER_APP_NAME "AFS ¼­¹ö" - IDS_CC_APP_NAME "AFS Á¦¾î ¼¾ÅÍ" - IDS_CANT_LOAD_RESOURCES "ÀÌ Á¦Ç°À» ¼³Ä¡ ÇØÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù. ¼³Ä¡ ÇØÁ¦ÇÒ ÀÚ¿øÀ» ·ÎµåÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_CANT_UNINSTALL_AFSCREDS - "AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸¼º ÇØÁ¦ÇÏ´Â µ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_MUST_STOP_SERVER "¼³Ä¡ ÇØÁ¦¸¦ °è¼ÓÇϱâ Àü¿¡ AFS ¼­¹ö¸¦ ÁßÁöÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ÇÁ·Î¼¼½º´Â ¿À·¡ °É¸± ¼ö ÀÖ½À´Ï´Ù. Áö±Ý ¼­¹ö¸¦ ÁßÁöÇϽðڽÀ´Ï±î? " - IDS_MUST_STOP_CLIENT "¼³Ä¡ ÇØÁ¦¸¦ °è¼ÓÇϱâ Àü¿¡ AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ÁßÁöÇØ¾ß ÇÕ´Ï´Ù. Áö±Ý Ŭ¶óÀÌ¾ðÆ®¸¦ ÁßÁöÇϽðڽÀ´Ï±î?" - IDS_LIGHT_CLIENT_APP_NAME "AFS ¶óÀÌÆ®" - IDS_WAITING_FOR_CLIENT_TO_STOP - "AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ÁßÁöÇϰí ÀÖ½À´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À..." - IDS_WAITING_FOR_SERVER_TO_STOP - "AFS ¼­¹ö¸¦ ÁßÁöÇϰí ÀÖ½À´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À..." - IDS_CLIENT_NEEDED_BY_SERVER - "AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ¼³Ä¡ ÇØÁ¦Çϸé AFS ¼­¹ö°¡ ¿Ã¹Ù¸£°Ô ±â´ÉÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¼³Ä¡ ÇØÁ¦¸¦ °è¼ÓÇϽðڽÀ´Ï±î?" - IDS_PRESERVE_CLIENT_CONFIG_INFO - "Ŭ¶óÀÌ¾ðÆ® ±¸¼º Á¤º¸¸¦ º¸Á¸ÇϽðڽÀ´Ï±î? ¾÷±×·¹ÀÌµå ¶Ç´Â À缳ġÇÏ´Â °æ¿ì À̸¦ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. " - IDS_PRESERVE_SERVER_CONFIG_INFO - "¼­¹ö ±¸¼º Á¤º¸¸¦ º¸Á¸ÇϽðڽÀ´Ï±î? ¾÷±×·¹ÀÌµå ¶Ç´Â À缳ġÇÏ´Â °æ¿ì À̸¦ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù." - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED - "±âÁ¸ ±¸¼º Á¤º¸¸¦ º¹¿øÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. " - IDS_SAVE_OF_CONFIG_INFO_FAILED - "±¸¼º Á¤º¸¸¦ ÀúÀåÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. ¼³Ä¡ ÇØÁ¦¸¦ °è¼ÓÇϽðڽÀ´Ï±î? " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO - "AFS ¶óÀÌÆ® ±¸¼º Á¤º¸¸¦ º¸Á¸ÇϽðڽÀ´Ï±î? ¾÷±×·¹ÀÌµå ¶Ç´Â À缳ġÇÏ´Â °æ¿ì À̸¦ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù." - IDS_PRESERVE_CC_CONFIG_INFO - "Á¦¾î ¼¾ÅÍ ±¸¼º Á¤º¸¸¦ º¸Á¸ÇϽðڽÀ´Ï±î? ¾÷±×·¹ÀÌµå ¶Ç´Â À缳ġÇÏ´Â °æ¿ì À̸¦ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù." -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afs_setup_utils/lang/pt_BR/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/pt_BR/afs_setup_utils.rc deleted file mode 100644 index b8b95163a..000000000 --- a/src/WINNT/afs_setup_utils/lang/pt_BR/afs_setup_utils.rc +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "DLL dos Utilitários de Configuração do AFS" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_CHARSET 1252 -#define AFS_VERINFO_LANG_CODE 0x416 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "Um erro ocorreu: %s (%ld)." - IDS_SCM_OPEN_FAILED "Falha ao abrir o Gerenciador de Controle de Serviços" - IDS_SERVICE_CREATE_FAILED "Falha ao criar serviço" - IDS_SERVICE_OPEN_FAILED "Falha ao abrir serviço" - IDS_SERVICE_QUERY_FAILED "Falha ao consultar status do serviço" - IDS_SERVICE_STOP_FAILED "Falha ao parar serviço" - IDS_SERVICE_DELETE_FAILED "Falha ao excluir serviço" - IDS_REG_DELETE_VALUE_ERROR "Falha ao excluir entradas no registro" - IDS_SERVICE_ENABLE_FAILED "Falha ao ativar serviço" - IDS_OLE_DLL_INSTALL_FAILED "Falha ao instalar uma DLL de OLE" - IDS_OLE_DLL_UNINSTALL_FAILED "Falha ao remover a instalação de uma DLL de OLE" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "Falha ao remover a instalação da extensão do shell de montagem/desmontagem do conjunto de arquivos" - IDS_EXTENSION_DLL_INSTALL_FAILED - "Falha ao instalar a extensão do shell de montagem/desmontagem do conjunto de arquivos" - IDS_CANT_DETERMINE_PRODUCT - "Impossível determinar qual produto do AFS deve ser desinstalado" - IDS_TITLE "AFS® para Windows" - IDS_CANT_DETERMINE_APP_PATH - "Falha ao determinar o diretório de instalação da aplicação" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS Client" - IDS_SERVER_APP_NAME "AFS Server" - IDS_CC_APP_NAME "Centro de Controle do AFS" - IDS_CANT_LOAD_RESOURCES "Impossível remover a instalação deste produto: falha na carga dos recursos de remoção de instalação." - IDS_CANT_UNINSTALL_AFSCREDS "Falha ao remover a configuração do AFS Client." - IDS_MUST_STOP_SERVER "O AFS Server deve ser parado para que a remoção da instalação possa continuar. Isto pode ser um processo demorado. Parar o Servidor agora?" - IDS_MUST_STOP_CLIENT "O AFS Client deve ser parado para que a remoção da instalação possa continuar. Parar o Cliente agora?" - IDS_LIGHT_CLIENT_APP_NAME "AFS Básico" - IDS_WAITING_FOR_CLIENT_TO_STOP "Parando o AFS Client. Aguarde..." - IDS_WAITING_FOR_SERVER_TO_STOP "Parando o AFS Server. Aguarde..." - IDS_CLIENT_NEEDED_BY_SERVER "Remover a instalação do AFS Client impedirá que o AFS Server funcione corretamente. Continuar a remoção da instalação?" - IDS_PRESERVE_CLIENT_CONFIG_INFO "Deseja preservar as informações de configuração do Cliente? Isto pode ser desejável se estiver atualizando ou reinstalando." - IDS_PRESERVE_SERVER_CONFIG_INFO "Deseja preservar as informações de configuração do Servidor? Isto pode ser desejável se estiver atualizando ou reinstalando." - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "Não foi possível restaurar as informações da configuração anterior." - IDS_SAVE_OF_CONFIG_INFO_FAILED "Não foi possível salvar as informações da configuração. Prosseguir a remoção da instalação?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "Deseja preservar as informações de configuração do AFS Básico? Isto pode ser desejável se estiver atualizando ou reinstalando." - IDS_PRESERVE_CC_CONFIG_INFO "Deseja preservar as informações de configuração do Centro de Controle? Isto pode ser desejável se estiver atualizando ou reinstalando." -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS® para Windows" -FONT 9, "MS Shell Dlg" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "Parando o AFS Server. Aguarde...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Acordo de Licenciamento" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "&Concordo",IDOK,197,185,50,14 - PUSHBUTTON "Cancelar",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | - ES_READONLY | WS_VSCROLL,10,10,295,161,WS_EX_STATICEDGE - PUSHBUTTON "&Imprimir",IDC_PRINT,10,185,50,14 - PUSHBUTTON "&Discordo",IDCANCEL,147,185,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - - - diff --git a/src/WINNT/afs_setup_utils/lang/zh_CN/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/zh_CN/afs_setup_utils.rc deleted file mode 100644 index a30ee3741..000000000 --- a/src/WINNT/afs_setup_utils/lang/zh_CN/afs_setup_utils.rc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS °²×°ÊµÓóÌÐò DLL" -#define AFS_VERINFO_NAME "afs_setup_utmls" -#define AFS_VERINFO_FILENAME "afs_setup_utmls.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "·¢ÉúÒ»¸ö´íÎó£º%s (%ld)¡£" - IDS_SCM_OPEN_FAILED "´ò¿ª¡°·þÎñ¿ØÖƹÜÀíÆ÷¡±Ê§°Ü" - IDS_SERVICE_CREATE_FAILED "´´½¨·þÎñʧ°Ü" - IDS_SERVICE_OPEN_FAILED "´ò¿ª·þÎñʧ°Ü" - IDS_SERVICE_QUERY_FAILED "²éѯ·þÎñ״̬ʧ°Ü" - IDS_SERVICE_STOP_FAILED "Í£Ö¹·þÎñʧ°Ü" - IDS_SERVICE_DELETE_FAILED "ɾ³ý·þÎñʧ°Ü" - IDS_REG_DELETE_VALUE_ERROR "ɾ³ý×¢²á±íÌõĿʧ°Ü" - IDS_SERVICE_ENABLE_FAILED "ÆôÓ÷þÎñʧ°Ü" - IDS_OLE_DLL_INSTALL_FAILED "°²×° OLE DLL ʧ°Ü" - IDS_OLE_DLL_UNINSTALL_FAILED "жװ OLE DLL ʧ°Ü" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "жװÎļþ¼¯°²×°/жװ shell À©Õ¹Ê§°Ü" - IDS_EXTENSION_DLL_INSTALL_FAILED - "°²×°Îļþ¼¯°²×°/жװ shell À©Õ¹Ê§°Ü" - IDS_CANT_DETERMINE_PRODUCT - "ÎÞ·¨È·¶¨ÒªÐ¶×°µÄ AFS ²úÆ·" - IDS_TITLE "AFS(R) Windows °æ" - IDS_CANT_DETERMINE_APP_PATH - "È·¶¨Ó¦ÓóÌÐò°²×°Ä¿Â¼Ê§°Ü" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS ¿Í»§»ú" - IDS_SERVER_APP_NAME "AFS ·þÎñÆ÷" - IDS_CC_APP_NAME "AFS ¿ØÖÆÖÐÐÄ" - IDS_CANT_LOAD_RESOURCES "ÎÞ·¨Ð¶×°´Ë²úÆ·£º×°Èëжװ×ÊÔ´ÒÑʧ°Ü¡£" - IDS_CANT_UNINSTALL_AFSCREDS "È¡Ïû AFS ¿Í»§»úµÄÅäÖÃʧ°Ü¡£" - IDS_MUST_STOP_SERVER "AFS ·þÎñÆ÷±ØÐëÔÚжװ¿É¼ÌÐøÖ®Ç°Í£Ö¹¡£Õâ¿ÉÄÜÊÇÒ»¸öºÜ³¤µÄ¹ý³Ì¡£ÏÖÔÚҪֹͣ·þÎñÆ÷Âð?" - IDS_MUST_STOP_CLIENT "AFS ¿Í»§»ú±ØÐëÔÚжװ¿É¼ÌÐøÖ®Ç°Í£Ö¹¡£ÏÖÔÚҪֹͣ¿Í»§»úÂð?" - IDS_LIGHT_CLIENT_APP_NAME "AFS Light" - IDS_WAITING_FOR_CLIENT_TO_STOP "ÕýÔÚÍ£Ö¹ AFS ¿Í»§»ú¡£ÇëµÈ´ý..." - IDS_WAITING_FOR_SERVER_TO_STOP "ÕýÔÚÍ£Ö¹ AFS ·þÎñÆ÷¡£ÇëµÈ´ý..." - IDS_CLIENT_NEEDED_BY_SERVER "жװ AFS ¿Í»§»ú»áʹ AFS ·þÎñÆ÷²»ÄÜÕý³£¹¤×÷¡£Òª¼ÌÐøÐ¶×°Âð?" - IDS_PRESERVE_CLIENT_CONFIG_INFO "ÄúÏ£Íû±£Áô¿Í»§»úµÄÅäÖÃÐÅÏ¢Âð? Äú¿ÉÄÜ»áÔÚÉý¼¶»òÖØÐ°²×°Ê±ÕâÑù×ö¡£" - IDS_PRESERVE_SERVER_CONFIG_INFO "ÄúÏ£Íû±£Áô·þÎñÆ÷µÄÅäÖÃÐÅÏ¢Âð? Äú¿ÉÄÜ»áÔÚÉý¼¶»òÖØÐ°²×°Ê±ÕâÑù×ö¡£" - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "»Ö¸´ÒÔǰµÄÅäÖÃÐÅϢʧ°Ü" - IDS_SAVE_OF_CONFIG_INFO_FAILED "±£´æÅäÖÃÐÅϢʧ°Ü¡£Òª¼ÌÐøÐ¶×°Âð?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "ÄúÏ£Íû±£Áô AFS Light µÄÅäÖÃÐÅÏ¢Âð? Äú¿ÉÄÜ»áÔÚÉý¼¶»òÖØÐ°²×°Ê±ÕâÑù×ö¡£" - IDS_PRESERVE_CC_CONFIG_INFO "ÄúÏ£Íû±£Áô¿ØÖÆÖÐÐĵÄÅäÖÃÐÅÏ¢Âð? Äú¿ÉÄÜ»áÔÚÉý¼¶»òÖØÐ°²×°Ê±ÕâÑù×ö¡£" -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS(R) Windows °æ" -FONT 9, "ËÎÌå" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "ÕýÔÚÍ£Ö¹ AFS ·þÎñÆ÷¡£ÇëµÈ´ý...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ðí¿É֤ЭÒé" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "ÎÒͬÒâ(&A)",IDOK,197,185,50,14 - PUSHBUTTON "È¡Ïû",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | - ES_READONLY | WS_VSCROLL,10,10,295,161,WS_EX_STATICEDGE - PUSHBUTTON "´òÓ¡(&P)",IDC_PRINT,10,185,50,14 - PUSHBUTTON "ÎÒ²»Í¬Òâ(&D)",IDCANCEL,147,185,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - - diff --git a/src/WINNT/afs_setup_utils/lang/zh_TW/afs_setup_utils.rc b/src/WINNT/afs_setup_utils/lang/zh_TW/afs_setup_utils.rc deleted file mode 100644 index 383f9c975..000000000 --- a/src/WINNT/afs_setup_utils/lang/zh_TW/afs_setup_utils.rc +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Setup Utilities DLL" -#define AFS_VERINFO_NAME "afs_setup_utils" -#define AFS_VERINFO_FILENAME "afs_setup_utils.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALLATION_FAILURE "µo¥Í¿ù»~¡G %s (%ld)." - IDS_SCM_OPEN_FAILED "µLªk¶}±Ò¡uªA°È±±¨îºÞ²zµ{¦¡¡v" - IDS_SERVICE_CREATE_FAILED "µLªk«Ø¥ßªA°È" - IDS_SERVICE_OPEN_FAILED "µLªk¶}±ÒªA°È" - IDS_SERVICE_QUERY_FAILED "µLªk¬d¸ßªA°Èª¬ºA" - IDS_SERVICE_STOP_FAILED "µLªk°±¤îªA°È" - IDS_SERVICE_DELETE_FAILED "µLªk§R°£ªA°È" - IDS_REG_DELETE_VALUE_ERROR "µLªk§R°£µn¿ý¶µ¥Ø" - IDS_SERVICE_ENABLE_FAILED "µLªk±Ò°ÊªA°È" - IDS_OLE_DLL_INSTALL_FAILED "µLªk¦w¸Ë OLE DLL" - IDS_OLE_DLL_UNINSTALL_FAILED "µLªk¸Ñ°£¦w¸Ë OLE DLL" - IDS_EXTENSION_DLL_UNINSTALL_FAILED - "µLªk¸Ñ°£¦w¸ËÀÉ®×¶°¸Ë¸ü¡þ¸Ñ°£¸Ë¸ü shell ©µ¦ù" - IDS_EXTENSION_DLL_INSTALL_FAILED - "µLªk¦w¸ËÀÉ®×¶°¸Ë¸ü¡þ¸Ñ°£¸Ë¸ü shell ©µ¦ù" - IDS_CANT_DETERMINE_PRODUCT - "µLªk§PÂ_¸Ñ°£¦w¸Ë¨º¶µ AFS ²£«~" - IDS_TITLE "AFS for Windows" - IDS_CANT_DETERMINE_APP_PATH - "µLªk§PÂ_À³¥Îµ{¦¡ªº¦w¸Ë¥Ø¿ý" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CLIENT_APP_NAME "AFS ¥Î¤áºÝ" - IDS_SERVER_APP_NAME "AFS ¦øªA¾¹" - IDS_CC_APP_NAME "AFS ±±¨î¤¤¤ß" - IDS_CANT_LOAD_RESOURCES "µLªk¸Ñ°£¦w¸Ë¦¹¶µ²£«~¡G¸Ñ°£¦w¸Ë¸ê·½ªº¸ü¤J¤w¥¢±Ñ¡C" - IDS_CANT_UNINSTALL_AFSCREDS "µLªk¨ú®ø¬[ºc AFS ¥Î¤áºÝ¡C" - IDS_MUST_STOP_SERVER "¥²¶·¥ý°±¤î AFS ¦øªA¾¹¡A¤~¯àÄ~Äò¸Ñ°£¦w¸Ë¡C¦¹±N»Ý­n¤@¨Ç®É¶¡¨Ó³B²z¡A­n²{¦b°±¤î Server ¶Ü¡H" - IDS_MUST_STOP_CLIENT "¥²¶·¥ý°±¤î AFS ¥Î¤áºÝ¡A¤~¯àÄ~Äò¸Ñ°£¦w¸Ë¡C¦¹±N»Ý­n¤@¨Ç®É¶¡¨Ó³B²z¡A­n²{¦b°±¤î Client ¶Ü¡H" - IDS_LIGHT_CLIENT_APP_NAME "AFS Light" - IDS_WAITING_FOR_CLIENT_TO_STOP "¥¿¦b°±¤î AFS ¥Î¤áºÝ¡C½Ðµy­Ô..." - IDS_WAITING_FOR_SERVER_TO_STOP "¥¿¦b°±¤î AFS ¦øªA¾¹¡C½Ðµy­Ô..." - IDS_CLIENT_NEEDED_BY_SERVER "¸Ñ°£¦w¸Ë AFS ¥Î¤áºÝ±N¨¾¤î AFS ¦øªA¾¹¥¿±`¦a¹B§@¡CÄ~Äò¸Ñ°£¦w¸Ë¶Ü¡H" - IDS_PRESERVE_CLIENT_CONFIG_INFO "±z­n«O¯d¥Î¤áºÝªº¬[ºc¸ê°T¶Ü¡H­Y±z­n¤É¯Å©Î­«·s¦w¸Ë¡A´N¥i¯à»Ý­n«O¯d¸ê°T¡C" - IDS_PRESERVE_SERVER_CONFIG_INFO "±z­n«O¯d¦øªA¾¹ªº¬[ºc¸ê°T¶Ü¡H­Y±z­n¤É¯Å©Î­«·s¦w¸Ë¡A´N¥i¯à»Ý­n«O¯d¸ê°T¡C" - IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED "µLªk«ì´_¥ý«eªº¬[ºc¸ê°T" - IDS_SAVE_OF_CONFIG_INFO_FAILED "µLªkÀx¦s¬[ºc¸ê°T¡CÄ~Äò¸Ñ°£¦w¸Ë¶Ü¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO "±z­n«O¯d AFS Light ªº¬[ºc¸ê°T¶Ü¡H­Y±z­n¤É¯Å©Î­«·s¦w¸Ë¡A´N¥i¯à»Ý­n«O¯d¸ê°T¡C" - IDS_PRESERVE_CC_CONFIG_INFO "±z­n«O¯d±±¨î¤¤¤ßªº¬[ºc¸ê°T¶Ü¡H­Y±z­n¤É¯Å©Î­«·s¦w¸Ë¡A´N¥i¯à»Ý­n«O¯d¸ê°T¡C" -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Boxes -// -IDD_PROGRESS DIALOGEX 0, 0, 226, 52 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS for Windows" -FONT 9, "·s²Ó©úÅé" -BEGIN - ICON "",IDC_LOGO,17,16,21,20 - LTEXT "¥¿¦b°±¤î AFS ¦øªA¾¹¡C½Ðµy­Ô...",IDC_MSG,50,23, - 163,10 - GROUPBOX "",IDC_STATIC,7,4,212,40 -END - -IDD_LICENSE DIALOGEX 0, 0, 315, 204 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "±ÂÅv¦X¬ù" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "§Ú¦P·N(&A)",IDOK,197,185,50,14 - PUSHBUTTON "¨ú®ø",IDC_STATIC,255,185,50,14,WS_DISABLED - CONTROL "",IDC_TEXT,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | - ES_READONLY | WS_VSCROLL,10,10,295,161,WS_EX_STATICEDGE - PUSHBUTTON "¦C¦L(&P)",IDC_PRINT,10,185,50,14 - PUSHBUTTON "§Ú¤£¦P·N(&D)",IDCANCEL,147,185,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,178,296,1 -END - - -////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPIN1 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "..\\..\\..\\afsapplib\\resource\\spinstop.ico" - - - diff --git a/src/WINNT/afs_setup_utils/light_client_uninst.def b/src/WINNT/afs_setup_utils/light_client_uninst.def deleted file mode 100644 index 989f57f23..000000000 --- a/src/WINNT/afs_setup_utils/light_client_uninst.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY LightClientUninst.dll - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - DllEntryPoint - UninstInitialize - UninstUnInitialize - diff --git a/src/WINNT/afs_setup_utils/progress_dlg.cpp b/src/WINNT/afs_setup_utils/progress_dlg.cpp deleted file mode 100644 index b8794e4a0..000000000 --- a/src/WINNT/afs_setup_utils/progress_dlg.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include -#include -#include "resource.h" -#include "progress_dlg.h" -#include "animate_icon.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ - - -/* - * Variables _________________________________________________________________ - * - */ -static HWND hDlg = 0; // HWND for this page's dialog -static char *pszProgressMsg = 0; -static HWND hLogo; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -BOOL CALLBACK ProgressDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); -static DWORD WINAPI DisplayProgressDlg(LPVOID param); -static void OnInitDialog(HWND hwndDlg); -static void OnQuit(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL ShowProgressDialog(char *pszMsg) -{ - DWORD dwThreadID; - - pszProgressMsg = pszMsg; - - // Create a thread to show the dialog - HANDLE hThread = CreateThread(0, 0, DisplayProgressDlg, 0, 0, &dwThreadID); - - CloseHandle(hThread); - - return (hThread != 0); -} - -void HideProgressDialog(void) -{ - PostMessage(hDlg, WM_QUIT, 0, 0); -} - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -static BOOL CALLBACK ProgressDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - hDlg = hwndDlg; - SetWindowText(GetDlgItem(hDlg, IDC_MSG), pszProgressMsg); - break; - - case WM_QUIT: - OnQuit(); - break; - } - - return FALSE; -} - - -/* - * Event Handler Functions __________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - SetWindowText(GetDlgItem(hDlg, IDC_MSG), pszProgressMsg); - - hLogo = GetDlgItem(hDlg, IDC_LOGO); - - StartAnimation(hLogo, 8); -} - -static void OnQuit() -{ - StopAnimation(hLogo); - - EndDialog(hDlg, IDOK); -} - - -/* - * OTHER FUNCTIONS _________________________________________________________________ - * - */ -static DWORD WINAPI DisplayProgressDlg(LPVOID param) -{ - ModalDialog (IDD_PROGRESS, 0, (DLGPROC)ProgressDlgProc); - - return 0; -} - diff --git a/src/WINNT/afs_setup_utils/progress_dlg.h b/src/WINNT/afs_setup_utils/progress_dlg.h deleted file mode 100644 index ef0ce51a1..000000000 --- a/src/WINNT/afs_setup_utils/progress_dlg.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifdef __cplusplus -extern "C" { -#endif - -BOOL ShowProgressDialog(char *pszMsg); -void HideProgressDialog(void); - -#ifdef __cplusplus -} -#endif - diff --git a/src/WINNT/afs_setup_utils/resource.h b/src/WINNT/afs_setup_utils/resource.h deleted file mode 100644 index 4c3090145..000000000 --- a/src/WINNT/afs_setup_utils/resource.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDC_STATIC -1 - -#define IDS_INSTALLATION_FAILURE 0 -#define IDS_SCM_OPEN_FAILED 1 -#define IDS_SERVICE_CREATE_FAILED 2 -#define IDS_SERVICE_OPEN_FAILED 3 -#define IDS_SERVICE_QUERY_FAILED 4 -#define IDS_SERVICE_STOP_FAILED 5 -#define IDS_SERVICE_DELETE_FAILED 6 -#define IDS_REG_DELETE_VALUE_ERROR 7 -#define IDS_SERVICE_ENABLE_FAILED 8 -#define IDS_OLE_DLL_INSTALL_FAILED 9 -#define IDS_OLE_DLL_UNINSTALL_FAILED 10 -#define IDS_EXTENSION_DLL_UNINSTALL_FAILED 11 -#define IDS_EXTENSION_DLL_INSTALL_FAILED 12 -#define IDS_CANT_DETERMINE_PRODUCT 13 -#define IDS_TITLE 14 -#define IDS_CANT_DETERMINE_APP_PATH 15 - -#define IDS_CLIENT_APP_NAME 16 -#define IDS_SERVER_APP_NAME 17 -#define IDS_CC_APP_NAME 18 -#define IDS_CANT_LOAD_RESOURCES 19 -#define IDS_CANT_UNINSTALL_AFSCREDS 20 -#define IDS_MUST_STOP_SERVER 21 -#define IDS_MUST_STOP_CLIENT 22 -#define IDS_LIGHT_CLIENT_APP_NAME 23 -#define IDS_WAITING_FOR_CLIENT_TO_STOP 24 -#define IDS_WAITING_FOR_SERVER_TO_STOP 25 -#define IDD_PROGRESS 26 -#define IDS_CLIENT_NEEDED_BY_SERVER 27 -#define IDS_PRESERVE_CLIENT_CONFIG_INFO 28 -#define IDS_PRESERVE_SERVER_CONFIG_INFO 29 -#define IDS_RESTORE_OF_PREVIOUS_CONFIG_FAILED 30 -#define IDS_SAVE_OF_CONFIG_INFO_FAILED 31 - -#define IDS_PRESERVE_LIGHT_CLIENT_CONFIG_INFO 32 -#define IDS_PRESERVE_CC_CONFIG_INFO 33 - -#define IDD_LICENSE 36 -#define IDC_LOGO 1000 -#define IDC_MSG 1001 -#define IDC_PRINT 1002 -#define IDC_TEXT 1003 -#define IDI_SPIN1 20001 -#define IDI_SPIN2 20002 -#define IDI_SPIN3 20003 -#define IDI_SPIN4 20004 -#define IDI_SPIN5 20005 -#define IDI_SPIN6 20006 -#define IDI_SPIN7 20007 -#define IDI_SPIN8 20008 -#define IDI_SPINSTOP 20009 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 37 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1004 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/afs_setup_utils/server_uninst.def b/src/WINNT/afs_setup_utils/server_uninst.def deleted file mode 100644 index d3cfe6cd2..000000000 --- a/src/WINNT/afs_setup_utils/server_uninst.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY ServerUninst.dll - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - DllEntryPoint - UninstInitialize - UninstUnInitialize - diff --git a/src/WINNT/afs_setup_utils/sutil.c b/src/WINNT/afs_setup_utils/sutil.c deleted file mode 100644 index 2bf8cad8f..000000000 --- a/src/WINNT/afs_setup_utils/sutil.c +++ /dev/null @@ -1,530 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "sutil.h" - -/* Some install/uninstall related utilities. */ - - -#define NETWORK_PROVIDER_ORDER_KEY "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\NetworkProvider\\Order" -#define PROVIDER_ORDER_VALUE_NAME "ProviderOrder" - -#define ENVIRONMENT_KEY "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment" - -#define AUTOEXEC_PATH "c:\\autoexec.bat" -#define AUTOEXEC_TMP_PATH "c:\\TaAfsAutoexec.tmp" - - -static BOOL ReadRegEnv(char **ppszEnvValue, char *pszRegValueName); -static BOOL WriteRegEnv(char *pszEnvValue, char *pszEnvName); -static BOOL ReadAutoExec(char **ppszEnvValue, char *pszEnvName); -static BOOL WriteAutoExec(char *pszEnvValue, char *pszEnvName); -static BOOL FindSubString(const char *s1, const char *s2); - - - -/* ------------------ exported functions ---------------------- */ - -BOOL InNetworkProviderOrder(char *pszNetworkProvider, BOOL *pbIn) -{ - HKEY hKey; - LONG bResult; - DWORD dwType; - char *pszProviderOrder = 0; - DWORD dwSize; - - bResult = FALSE; // Assume failure - - if (RegOpenKeyAlt(AFSREG_NULL_KEY, NETWORK_PROVIDER_ORDER_KEY, KEY_READ, FALSE, &hKey, 0) == ERROR_SUCCESS) { - if (RegQueryValueAlt(hKey, PROVIDER_ORDER_VALUE_NAME, &dwType, &pszProviderOrder, &dwSize) == ERROR_SUCCESS) { - *pbIn = strstr(pszProviderOrder, pszNetworkProvider) != 0; - bResult = TRUE; - free(pszProviderOrder); - } - RegCloseKey(hKey); - } - - return bResult; -} - - -/* - * AddToProviderOrder() -- add entry to network provider order - */ -BOOL AddToProviderOrder(char *pszWhatToAdd) -{ - HKEY hKey; - DWORD dwType; - LONG result; - int nLen; - char *pszValue = 0; - char *pszNewValue; - BOOL bAlreadyAdded = FALSE; - - /* Open the key, creating it if necessary (but should always be there). */ - result = RegOpenKeyAlt(AFSREG_NULL_KEY, - NETWORK_PROVIDER_ORDER_KEY, - KEY_SET_VALUE | KEY_ALL_ACCESS, TRUE, &hKey, 0); - if (result != ERROR_SUCCESS) - return FALSE; - - /* Get the old value */ - result = RegQueryValueAlt(hKey, - PROVIDER_ORDER_VALUE_NAME, - &dwType, &pszValue, &nLen); - if (result != ERROR_SUCCESS) { - nLen = 0; - } - - pszNewValue = malloc(nLen + strlen(pszWhatToAdd) + 1);/* Add 1 for comma */ - *pszNewValue = 0; - - /* Add the new value */ - if (result == ERROR_SUCCESS) { - if (strstr(pszValue, pszWhatToAdd) != 0) - bAlreadyAdded = TRUE; - else { - if (pszValue && *pszValue) { - strcpy(pszNewValue, pszValue); - strcat(pszNewValue, ","); - } - strcat(pszNewValue, pszWhatToAdd); - } - - } else if (result == ERROR_FILE_NOT_FOUND) - strcpy(pszNewValue, pszWhatToAdd); - - /* Set the new value in the registry */ - if (((result == ERROR_SUCCESS) || - (result == ERROR_FILE_NOT_FOUND)) && !bAlreadyAdded) - result = RegSetValueEx(hKey, PROVIDER_ORDER_VALUE_NAME, 0, - REG_SZ, pszNewValue, strlen(pszNewValue) + 1); - free(pszNewValue); - free(pszValue); - - RegCloseKey(hKey); - - return (result == ERROR_SUCCESS); -} - - -/* - * RemoveFromProviderOrder() -- remove entry from network provider order - */ -BOOL RemoveFromProviderOrder(char *pszWhatToDel) -{ - HKEY hKey; - DWORD dwType; - LONG result; - int nLen; - char *pszValue = 0; - char *pszNewValue; - BOOL bAlreadyRemoved = FALSE; - - /* Open the key, creating if necessary (but should always be there). */ - result = RegOpenKeyAlt(AFSREG_NULL_KEY, NETWORK_PROVIDER_ORDER_KEY, - KEY_SET_VALUE | KEY_ALL_ACCESS, TRUE, &hKey, 0); - if (result != ERROR_SUCCESS) - return FALSE; - - /* Get the old value */ - result = RegQueryValueAlt(hKey, PROVIDER_ORDER_VALUE_NAME, - &dwType, &pszValue, &nLen); - - if (result == ERROR_SUCCESS) { - pszNewValue = malloc(nLen); /* bigger than we need, but that's ok */ - *pszNewValue = 0; - - if (strstr(pszValue, pszWhatToDel) == 0) - bAlreadyRemoved = TRUE; - else { - char *pszCur; - - pszCur = strtok(pszValue, ","); - while (pszCur) { - if (strcmp(pszCur, pszWhatToDel) != 0) { - if (*pszNewValue) - strcat(pszNewValue, ","); - strcat(pszNewValue, pszCur); - } - pszCur = strtok(0, ","); - } - } - - /* Set the new value in the registry */ - if (!bAlreadyRemoved) - result = RegSetValueEx(hKey, PROVIDER_ORDER_VALUE_NAME, 0, REG_SZ, - pszNewValue, strlen(pszNewValue) + 1); - free(pszNewValue); - free(pszValue); - } - RegCloseKey(hKey); - - return (result == ERROR_SUCCESS); -} - - -/* - * ReadSystemEnv() -- read system environment variable - */ -BOOL ReadSystemEnv(char **ppszEnvValue, char *pszEnvName) -{ - if (IsWinNT()) - return ReadRegEnv(ppszEnvValue, pszEnvName); - else - return ReadAutoExec(ppszEnvValue, pszEnvName); -} - - -/* - * WriteSystemEnv() -- write system environment variable - */ -BOOL WriteSystemEnv(char *pszEnvValue, char *pszEnvName) -{ - if (IsWinNT()) - return WriteRegEnv(pszEnvValue, pszEnvName); - else - return WriteAutoExec(pszEnvValue, pszEnvName); -} - - -/* - * AddToSystemPath() -- add specified entry to system PATH variable. - */ -BOOL AddToSystemPath(char *pszPath) -{ - char *pszCurPath = 0; - char *pszNewPath = 0; - BOOL bStatus = TRUE; - - if (!ReadSystemEnv(&pszCurPath, "Path")) - return FALSE; - - /* Do we need to add it? */ - if (!pszCurPath || !FindSubString(pszCurPath, pszPath)) { - - /* Old path + a semicolon + the new path entry + a null */ - pszNewPath = malloc((pszCurPath ? strlen(pszCurPath) + 1 : 0) + - strlen(pszPath) + 1); - if (pszNewPath == 0) { - if (pszCurPath) - free(pszCurPath); - return FALSE; - } - - pszNewPath[0] = 0; - - if (pszCurPath) { - strcpy(pszNewPath, pszCurPath); - strcat(pszNewPath, ";"); - } - - strcat(pszNewPath, pszPath); - bStatus = WriteSystemEnv(pszNewPath, "Path"); - - free(pszNewPath); - } - - if (pszCurPath) - free(pszCurPath); - - return bStatus; -} - - -/* - * RemoveFromSystemPath() -- remove specified entry from system PATH variable. - */ -BOOL RemoveFromSystemPath(char *pszPath) -{ - char *pszCurNls = 0; - char *pszNewNls = 0; - char *pSemi = 0; - char *pCurPath = 0; - BOOL bStatus = TRUE; - - if (!ReadSystemEnv(&pszCurNls, "Path")) - return FALSE; - - /* Is it already not in the path? */ - if (!pszCurNls || !FindSubString(pszCurNls, pszPath)) { - if (pszCurNls) - free(pszCurNls); - return TRUE; - } - - pszNewNls = (char *)malloc(strlen(pszCurNls) + 1); - if (pszNewNls == 0) { - free(pszCurNls); - return FALSE; - } - - pszNewNls[0] = 0; - - pCurPath = pszCurNls; - - while (1) { - pSemi = strchr(pCurPath, ';'); - if (pSemi) - *pSemi = 0; - - if (_stricmp(pCurPath, pszPath) != 0) { - if (pszNewNls[0] != 0) - strcat(pszNewNls, ";"); - strcat(pszNewNls, pCurPath); - } - - if (!pSemi) - break; - - pSemi++; - pCurPath = pSemi; - } - - bStatus = WriteSystemEnv(pszNewNls, "Path"); - - free(pszNewNls); - free(pszCurNls); - - return bStatus; -} - - -/* - * IsWinNT() -- determine if system is NT or other (95/98). - */ -BOOL IsWinNT() -{ - DWORD dwVersion = GetVersion(); - - return (dwVersion < 0x80000000); -} - - - - - - -/* ------------------ utility functions ---------------------- */ - - -/* - * ReadRegEnv() -- read system enviornment variable from registry (NT only). - */ -static BOOL ReadRegEnv(char **ppszEnvValue, char *pszRegValueName) -{ - HKEY hKey; - DWORD dwType; - LONG result; - int nLen = 512; - - result = RegOpenKeyAlt(AFSREG_NULL_KEY, ENVIRONMENT_KEY, - KEY_SET_VALUE | KEY_ALL_ACCESS, FALSE, &hKey, 0); - if (result != ERROR_SUCCESS) - return FALSE; - - *ppszEnvValue = 0; - - do { - if (*ppszEnvValue) - free(*ppszEnvValue); - - *ppszEnvValue = (char *)malloc(nLen); - if (*ppszEnvValue == 0) { - RegCloseKey(hKey); - return FALSE; - } - - /* If function fails to open the value and the error code says that - * the value doesn't exist, then we will attempt to make it. - */ - result = RegQueryValueEx(hKey, pszRegValueName, 0, - &dwType, *ppszEnvValue, &nLen); - - if (result == ERROR_FILE_NOT_FOUND) { - result = RegSetValueEx(hKey, pszRegValueName, 0, - REG_EXPAND_SZ, "", 0); - **ppszEnvValue = '\0'; /* zero length string "read" */ - } - } while (result == ERROR_MORE_DATA); - - RegCloseKey(hKey); - - if (result != ERROR_SUCCESS || strlen(*ppszEnvValue) == 0) { - /* Don't return empty strings; instead set buffer pointer to 0. */ - free(*ppszEnvValue); - *ppszEnvValue = 0; - } - return (result == ERROR_SUCCESS); -} - - -/* - * WriteRegEnv() -- write system environment variable to registry (NT only). - */ -static BOOL WriteRegEnv(char *pszEnvValue, char *pszEnvName) -{ - LONG result; - HKEY hKey; - - result = RegOpenKeyAlt(AFSREG_NULL_KEY, ENVIRONMENT_KEY, - KEY_ALL_ACCESS, FALSE, &hKey, 0); - if (result != ERROR_SUCCESS) - return FALSE; - - result = RegSetValueEx(hKey, pszEnvName, 0, REG_EXPAND_SZ, - pszEnvValue, strlen(pszEnvValue) + 1); - RegCloseKey(hKey); - - return (result == ERROR_SUCCESS); -} - - -/* - * ReadAutoExec() -- read environment variable from autoexec.bat (95/98). - */ -static BOOL ReadAutoExec(char **ppszEnvValue, char *pszEnvName) -{ - char szSetCmd[256]; - char szLine[2048]; - FILE *fp; - - *ppszEnvValue = 0; - - fp = fopen(AUTOEXEC_PATH, "rt"); - if (fp == 0) - return FALSE; - - /* Create the string we are looking for */ - sprintf(szSetCmd, "SET %s", pszEnvName); - - /* Now read each line and look for our SetCmd string */ - while (1) { - int nLineLen; - fgets(szLine, sizeof(szLine), fp); - - if (feof(fp)) - break; - - /* Strip off the trailing newline */ - nLineLen = strlen(szLine); - if (szLine[nLineLen - 1] == '\n') { - nLineLen--; - szLine[nLineLen] = 0; - } - - if (_strnicmp(szSetCmd, szLine, strlen(szSetCmd)) == 0) { - char *value = strchr(szLine, '='); - if (value) - *ppszEnvValue = _strdup(++value); - break; - } - } - - /* Don't return empty strings; instead set buffer to 0. */ - if (*ppszEnvValue && (strlen(*ppszEnvValue) == 0)) { - free(*ppszEnvValue); - *ppszEnvValue = 0; - } - - fclose(fp); - - return TRUE; -} - - -/* - * WriteAutoExec() -- write environment variable to autoexec.bat (95/98). - */ -static BOOL WriteAutoExec(char *pszEnvValue, char *pszEnvName) -{ - char szSetCmd[256]; - char szLine[512]; - BOOL bValueWritten = FALSE; - FILE *fpIn, *fpOut; - BOOL bResult; - - fpOut = fopen(AUTOEXEC_TMP_PATH, "wt"); - if (fpOut == 0) - return FALSE; - - sprintf(szSetCmd, "SET %s", pszEnvName); - - fpIn = fopen(AUTOEXEC_PATH, "rt"); - if (fpIn != 0) { - /* Now read each line and look for our SetCmd string */ - while (1) { - fgets(szLine, sizeof(szLine), fpIn); - if (feof(fpIn)) - break; - - if (!bValueWritten && - (_strnicmp(szSetCmd, szLine, strlen(szSetCmd)) == 0)) { - fprintf(fpOut, "%s=%s\n", szSetCmd, pszEnvValue); - bValueWritten = TRUE; - } else - fputs(szLine, fpOut); - } - - fclose(fpIn); - } - - /* If the value didn't previously exist, then add it to the end */ - if (!bValueWritten) - fprintf(fpOut, "%s=%s\n", szSetCmd, pszEnvValue); - - fclose(fpOut); - - bResult = CopyFile(AUTOEXEC_TMP_PATH, AUTOEXEC_PATH, FALSE); - - /* Try to delete this even if the copy fails. Tie the return code - * to the copy and not the delete. - */ - DeleteFile(AUTOEXEC_TMP_PATH); - - return bResult; -} - - -/* - * FindSubString() -- basically a case-insensitive strstr(). - */ -static BOOL FindSubString(const char *s1, const char *s2) -{ - char *ls1, *ls2; - BOOL bFound = FALSE; - - ls1 = _strdup(s1); - if (!ls1) - return FALSE; - - ls2 = _strdup(s2); - if (!ls2) { - free(ls1); - return FALSE; - } - - bFound = strstr(_strlwr(ls1), _strlwr(ls2)) != 0; - - free(ls2); - free(ls1); - return bFound; -} diff --git a/src/WINNT/afs_setup_utils/sutil.h b/src/WINNT/afs_setup_utils/sutil.h deleted file mode 100644 index c92230f78..000000000 --- a/src/WINNT/afs_setup_utils/sutil.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFS_SUTIL_H -#define AFS_SUTIL_H - -/* Some install/uninstall related utilities */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern BOOL InNetworkProviderOrder(char *pszNetworkProvider, BOOL *pbIn); -extern BOOL AddToProviderOrder(char *pszWhatToAdd); -extern BOOL RemoveFromProviderOrder(char *pszWhatToDel); -extern BOOL ReadSystemEnv(char **ppszEnvValue, char *pszEnvName); -extern BOOL WriteSystemEnv(char *pszEnvValue, char *pszEnvName); -extern BOOL AddToSystemPath(char *pszPath); -extern BOOL RemoveFromSystemPath(char *pszPath); -extern BOOL IsWinNT(); - -#ifdef __cplusplus -}; -#endif - -#endif /* AFS_SUTIL_H */ diff --git a/src/WINNT/afsadmsvr/.cvsignore b/src/WINNT/afsadmsvr/.cvsignore deleted file mode 100644 index af8350040..000000000 --- a/src/WINNT/afsadmsvr/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -iTaAfsAdmSvr.h -iTaAfsAdmSvrTypes.h -iTaAfsAdmSvr_c.c -iTaAfsAdmSvr_s.c - diff --git a/src/WINNT/afsadmsvr/ITaAfsAdmSvr.idl b/src/WINNT/afsadmsvr/ITaAfsAdmSvr.idl deleted file mode 100644 index af27b4117..000000000 --- a/src/WINNT/afsadmsvr/ITaAfsAdmSvr.idl +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -[ -uuid(ae274620-dea3-11d1-bfb3-00a024c0d1ef), -version(1.0), -pointer_default(unique), -implicit_handle(handle_t hBindTaAfsAdminSvr) -] -interface ITaAfsAdminSvr -{ - import "ITaAfsAdmSvrTypes.idl"; - - // AfsAdmSvr_Connect - // ...obtains a cookie to represent the calling process. The cookie should - // be freed with AfsAdmSvr_Disconnect when the process disconnects. - // - int AfsAdmSvr_Connect ( - [in] STRING szClientAddress, - [out] DWORD *pidClient, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_Disconnect - // ...releases and invalidates the cookie representing the calling process. - // - int AfsAdmSvr_Disconnect ( - [in] DWORD idClient, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_Ping - // ...reminds the admin server that the specified client is still around. - // this call should be made at least every csecAFSADMSVR_CLIENT_PING - // seconds, lest the admin server think you've disconnected. (The client - // library TaAfsAdmSvrClient.lib automatically handles this.) - // - int AfsAdmSvr_Ping ( - [in] DWORD idClient, - [out] ULONG *pStatus - ); - const DWORD csecAFSADMSVR_CLIENT_PING = (2L * 60L); // 2 minutes - - - // AfsAdmSvr_CrackCredentials - // ...obtains information about the supplied credentials token. - // - int AfsAdmSvr_CrackCredentials ( - [in] DWORD idClient, - [in] DWORD hCreds, - [out] STRING pszCell, - [out] STRING pszUser, - [out] SYSTEMTIME *pstExpiration, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_GetCredentials - // ...queries the user's current AFS credentials for the specified cell. - // if the user already has credentials in the cell, returns a nonzero - // token {hCreds}, suitable for use in AfsAdmSvr_OpenCell(). - // - DWORD AfsAdmSvr_GetCredentials ( - [in] DWORD idClient, - [in] STRING pszCell, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_SetCredentials - // ...obtains new AFS credentials within the administrative server process - // on behalf of the specified user. if successful, returns a nonzero - // token {hCreds}, suitable for use in AfsAdmSvr_OpenCell(). - // - DWORD AfsAdmSvr_SetCredentials ( - [in] DWORD idClient, - [in] STRING pszCell, - [in] STRING pszUser, - [in] STRING pszPassword, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_PushCredentials - // ...requests that the specified AFS credentials be used hereafter - // when manipulating the specified cell. You should follow this - // call with a Refresh request if necessary. - // - int AfsAdmSvr_PushCredentials ( - [in] DWORD idClient, - [in] DWORD hCreds, - [in] ASID idCell, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_GetLocalCell - // ...obtains the name of the primary cell used by the admin server - // - int AfsAdmSvr_GetLocalCell ( - [in] DWORD idClient, - [out] STRING pszCellName, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_ErrorCodeTranslate - // ...translates an error code into a readable string - // - int AfsAdmSvr_ErrorCodeTranslate ( - [in] DWORD idClient, - [in] ULONG code, - [in] LANGID idLanguage, // pass 0 for default language at server - [out] STRING pszErrorText, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_GetAction - // ...returns information about a particular operation in progress. - // - int AfsAdmSvr_GetAction ( - [in] DWORD idClient, - [in] DWORD idAction, - [out] LPASACTION pAction, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_GetActions - // ...returns a list of operations in progress. The list returned can - // be constrained to only including those operations initiated by - // a particular client and/or performed in a particular cell. - // - int AfsAdmSvr_GetActions ( - [in] DWORD idClient, - [in] DWORD idClientSearch, // 0 to return for all clients - [in] ASID idCellSearch, // 0 to return for all cells - [out] LPASACTIONLIST *ppList, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_OpenCell - // ...opens a cell for administration. - // - int AfsAdmSvr_OpenCell ( - [in] DWORD idClient, - [in] DWORD hCreds, - [in] STRING pszCellName, - [in] DWORD dwScopeFlags, - [out] ASID *pidCell, - [out] ULONG *pStatus - ); - const DWORD AFSADMSVR_SCOPE_VOLUMES = 0x00000001; - const DWORD AFSADMSVR_SCOPE_USERS = 0x00000002; - - // AfsAdmSvr_CloseCell - // ...used by client to open a cell for administration. - // - int AfsAdmSvr_CloseCell ( - [in] DWORD idClient, - [in] ASID idCell, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_FindObject - // AfsAdmSvr_FindObjects - // ...used to search through all objects in the cell, obtaining a list - // of those which match the specified criteria. For FindObjects, the - // {*ppList} parameter will be filled in with an allocated list of ASID - // objects, and should be freed using the AfsAdmSvr_FreeAsidList() - // routine (clients using the TaAfsAdmSvrClient.lib library should call - // asc_AsidListFree(), which is a wrapper for the former routine). - // The _FindObject routine can be used to find exactly one object--for - // instance, finding the ASID for a particular user or volume--while - // the _FindObjects routine returns a list of all objects which - // match the specified criteria--all volumes on a partition, or all - // users named "b*" within a cell. - // - int AfsAdmSvr_FindObject ( - [in] DWORD idClient, - [in] ASID idSearchScope, - [in] ASOBJTYPE ObjectType, - [in] AFSADMSVR_SEARCH_REFRESH SearchRefresh, - [in] STRING szName, - [out] ASID *pidObject, - [out] ULONG *pStatus - ); - - int AfsAdmSvr_FindObjects ( - [in] DWORD idClient, - [in] ASID idSearchScope, - [in] ASOBJTYPE ObjectType, - [in] AFSADMSVR_SEARCH_REFRESH SearchRefresh, - [in] STRING szPattern, - [in] LPAFSADMSVR_SEARCH_PARAMS pSearchParams, - [out] LPASIDLIST *ppList, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_GetObject - // AfsAdmSvr_GetObjects - // ...returns server-cached information about the specified object (or - // objects). - // - int AfsAdmSvr_GetObject ( - [in] DWORD idClient, - [in] AFSADMSVR_GET_TYPE GetType, - [in] AFSADMSVR_GET_LEVEL GetLevel, - [in] ASID idObject, - [in] DWORD verProperties, // can be 0 if not RETURN_IF_OUT_OF_DATE - [out] LPASOBJPROP pProperties, - [out] ULONG *pStatus - ); - - int AfsAdmSvr_GetObjects ( - [in] DWORD idClient, - [in] AFSADMSVR_GET_TYPE GetType, - [in] AFSADMSVR_GET_LEVEL GetLevel, - [in] LPASIDLIST pListObjects, // lParam used as verProperties - [out] LPASOBJPROPLIST *ppListObjectProperties, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_RefreshObject - // AfsAdmSvr_RefreshObjects - // ...invalidates the server's cache of information about the specified - // object or objects. - // - int AfsAdmSvr_RefreshObject ( - [in] DWORD idClient, - [in] ASID idObject, - [out] ULONG *pStatus - ); - - int AfsAdmSvr_RefreshObjects ( - [in] DWORD idClient, - [in] LPASIDLIST pListObjects, - [out] ULONG *pStatus - ); - - - // AfsAdmSvr_CallbackHost - // ...provides a context in which the server can issue callback functions - // via the AfsAdmSvrCallBack_* routines, which the client must implement. - // This routine will only return if the server is shut down. It should - // be called on a dedicated thread by the client. (TaAfsAdmSvrClient.lib - // automatically handles this.) - // - void AfsAdmSvr_CallbackHost (void); - - // AfsAdmSvrCallback_Action - // ...called by the server in the context of the CallbackHost() routine; - // this routine is used to notify the client whenever an action is - // initiated or completed. - // - [callback] void AfsAdmSvrCallback_Action ( - [in] LPASACTION pAction, - [in] BOOL fFinished - ); - - // AfsAdmSvr_GetRandomKey - // ...returns a randomly-generated 8-byte encryption key - // - int AfsAdmSvr_GetRandomKey ( - [in] DWORD idClient, - [in] ASID idCell, - [out] BYTE keyData[ ENCRYPTIONKEYLENGTH ], - [out] ULONG *pStatus - ); - - // AfsAdmSvr_ChangeUser - // ...changes a user account's properties. - // - int AfsAdmSvr_ChangeUser ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idUser, - [in] LPAFSADMSVR_CHANGEUSER_PARAMS pChange, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_GetGroupMembership - // ...retrieves the list of groups to which a user or group belongs - // - int AfsAdmSvr_GetGroupMembership ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idMember, - [out] LPASIDLIST *ppAsidList, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_GetGroupOwnership - // ...retrieves the list of groups which a user or group owns - // - int AfsAdmSvr_GetGroupOwnership ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idOwner, - [out] LPASIDLIST *ppAsidList, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_ChangeGroup - // ...changes a PTS group's properties. - // - int AfsAdmSvr_ChangeGroup ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idGroup, - [in] LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_GetGroupMembers - // ...retrieves the list of users which belong to a group - // - int AfsAdmSvr_GetGroupMembers ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idGroup, - [out] LPASIDLIST *ppAsidList, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_AddGroupMember - // ...adds a member to the specified group - // - int AfsAdmSvr_AddGroupMember ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idGroup, - [in] ASID idMember, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_RemoveGroupMember - // ...removes a member from the specified group - // - int AfsAdmSvr_RemoveGroupMember ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idGroup, - [in] ASID idMember, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_RenameGroup - // ...changes a group's name - // - int AfsAdmSvr_RenameGroup ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idGroup, - [in] STRING szNewGroupName, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_CreateGroup - // ...creates a new PTS group - // - int AfsAdmSvr_CreateGroup ( - [in] DWORD idClient, - [in] ASID idCell, - [in] LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, - [out] ASID *pidGroup, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_DeleteGroup - // ...deletes a PTS group - // - int AfsAdmSvr_DeleteGroup ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idGroup, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_SetUserPassword - // ...changes the password for the specified user account. Pass a non-empty - // string in {keyString} to encrypt the specified string; otherwise, - // pass a valid encryption key in {keyData}. - // - int AfsAdmSvr_SetUserPassword ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idUser, - [in] int keyVersion, - [in] STRING keyString, - [in] BYTE keyData[ ENCRYPTIONKEYLENGTH ], - [out] ULONG *pStatus - ); - - // AfsAdmSvr_UnlockUser - // ...unlocks a user's account - // - int AfsAdmSvr_UnlockUser ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idUser, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_CreateUser - // ...creates a new user account - // - int AfsAdmSvr_CreateUser ( - [in] DWORD idClient, - [in] ASID idCell, - [in] LPAFSADMSVR_CREATEUSER_PARAMS pCreate, - [out] ASID *pidUser, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_DeleteUser - // ...deletes a user account - // - int AfsAdmSvr_DeleteUser ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ASID idUser, - [in] LPAFSADMSVR_DELETEUSER_PARAMS pDelete, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_ChangeCell - // ...changes a cell's properties. - // - int AfsAdmSvr_ChangeCell ( - [in] DWORD idClient, - [in] ASID idCell, - [in] LPAFSADMSVR_CHANGECELL_PARAMS pChange, - [out] ULONG *pStatus - ); - - // AfsAdmSvr_SetRefreshRate - // ...changes the refresh rate for a specific cell - // - int AfsAdmSvr_SetRefreshRate ( - [in] DWORD idClient, - [in] ASID idCell, - [in] ULONG cminRefreshRate, - [out] ULONG *pStatus - ); - -} - diff --git a/src/WINNT/afsadmsvr/ITaAfsAdmSvrTypes.idl b/src/WINNT/afsadmsvr/ITaAfsAdmSvrTypes.idl deleted file mode 100644 index e73db4a5c..000000000 --- a/src/WINNT/afsadmsvr/ITaAfsAdmSvrTypes.idl +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -import "wtypes.idl"; -cpp_quote ("#ifndef _WINNT_") -typedef WORD LANGID; -cpp_quote ("#endif // _WINNT_") - -const int ENCRYPTIONKEYLENGTH = 8; - - - // ASID - Admin Server ID - // ...Type used for unique object identifiers throughout these adm - // -typedef DWORD ASID, *LPASID; - - - // ASOBJTYPE - Admin Server Object Type - // ...Enumeration used to classify a particular object within a cell. - // The types' values don't overlap, so they can be specified in - // combination during searches. - // -typedef enum { - TYPE_CELL = 0x00000001, - TYPE_SERVER = 0x00000002, - TYPE_SERVICE = 0x00000004, - TYPE_PARTITION = 0x00000008, - TYPE_VOLUME = 0x00000010, - TYPE_USER = 0x00000020, - TYPE_GROUP = 0x00000040, - TYPE_ANY = 0x0000FFFF -} ASOBJTYPE; - - - // STRING - Default String Definition - // -cpp_quote ("#ifdef _WINDOWS_") -cpp_quote ("typedef char stringchar;") -cpp_quote ("#else // _WINDOWS_") -typedef char stringchar; -cpp_quote ("#endif // _WINDOWS_") - -const int cchSTRING = 256; -typedef stringchar STRING [ cchSTRING ]; - - - // VOLUMEID - Volume ID - // ...Type used to hold an AFS volume identifier. - // -cpp_quote ("#ifndef AFSCLASS_H") -typedef unsigned int VOLUMEID, *LPVOLUMEID; -cpp_quote ("#endif // AFSCLASS_H") - - - // ACCOUNTACCESS - Indicator of who is allowed to manipulate an object - // ...An enumeration used to indicate the security level around an - // object. The admin server does not use this information directly, - // but passes it on to the AFS server processes. - // -cpp_quote ("#ifndef AFSCLASS_H") -typedef enum { - aaOWNER_ONLY, - aaGROUP_ONLY, - aaANYONE, -} ACCOUNTACCESS; -cpp_quote ("#endif // AFSCLASS_H") - - - // ASACTIONTYPE - Operation Type Identifier - // ...Enumeration used to classify a particular operation in progress - // by its type. Together with the ASACTION structure and ASACTLIST - // structure, this type is used to indicate the operations being - // performed on the admin server - // -typedef enum { - ACTION_REFRESH, // Refreshing cache for cell or object - ACTION_SCOUT, // Testing for problems in cell - ACTION_USER_CHANGE, // Changing user's properties - ACTION_USER_PW_CHANGE, // Changing user's password - ACTION_USER_UNLOCK, // Unlocking user's account - ACTION_USER_CREATE, // Creating user account - ACTION_USER_DELETE, // Deleting user account - ACTION_GROUP_CHANGE, // Changing group's properties - ACTION_GROUP_MEMBER_ADD, // Adding a member to a group - ACTION_GROUP_MEMBER_REMOVE, // Removing a member from a group - ACTION_GROUP_RENAME, // Renaming a group - ACTION_GROUP_CREATE, // Creating group - ACTION_GROUP_DELETE, // Deleting group - ACTION_CELL_CHANGE, // Changing a cell's properties -} ASACTIONTYPE; - - - // ASACTION - Operation Identifier - // ...Provides a structure encapsulating all known information about an - // operation currently in progress. - // -typedef struct { - ASID idScope; // Scope of refresh (cell or object) -} ASACTION_REFRESH; - -typedef struct { - ASID idScope; // Scope of scout (cell or object) -} ASACTION_SCOUT; - -typedef struct { - ASID idUser; // User whose properties are changing -} ASACTION_USER_CHANGE; - -typedef struct { - ASID idUser; // User whose password is changing -} ASACTION_USER_PW_CHANGE; - -typedef struct { - ASID idUser; // User whose account is being unlocked -} ASACTION_USER_UNLOCK; - -typedef struct { - STRING szUser; // Name of new user account - STRING szInstance; // Name of new user account -} ASACTION_USER_CREATE; - -typedef struct { - ASID idUser; // User being deleted -} ASACTION_USER_DELETE; - -typedef struct { - ASID idGroup; // Group whose properties are changing -} ASACTION_GROUP_CHANGE; - -typedef struct { - ASID idGroup; // Group which is changing - ASID idUser; // User who is being added as a member -} ASACTION_GROUP_MEMBER_ADD; - -typedef struct { - ASID idGroup; // Group which is changing - ASID idUser; // Member who is being removed -} ASACTION_GROUP_MEMBER_REMOVE; - -typedef struct { - ASID idGroup; // Group which is changing - STRING szNewName; // Member who is being removed -} ASACTION_GROUP_RENAME; - -typedef struct { - STRING szGroup; // Name of new PTS group -} ASACTION_GROUP_CREATE; - -typedef struct { - ASID idGroup; // Group being deleted -} ASACTION_GROUP_DELETE; - -typedef struct { - ASACTIONTYPE Action; // The operation in progress - DWORD idAction; // Unique action identifier - DWORD idClient; // Client which initiated the operation - ASID idCell; // Cell in which operation is occurring - DWORD csecActive; // Elapsed active time for operation - - [switch_is(Action)] union { - [case(ACTION_REFRESH)] ASACTION_REFRESH Refresh; - [case(ACTION_SCOUT)] ASACTION_SCOUT Scout; - [case(ACTION_USER_CHANGE)] ASACTION_USER_CHANGE User_Change; - [case(ACTION_USER_PW_CHANGE)] ASACTION_USER_PW_CHANGE User_Pw_Change; - [case(ACTION_USER_UNLOCK)] ASACTION_USER_UNLOCK User_Unlock; - [case(ACTION_USER_CREATE)] ASACTION_USER_CREATE User_Create; - [case(ACTION_USER_DELETE)] ASACTION_USER_DELETE User_Delete; - [case(ACTION_GROUP_CHANGE)] ASACTION_GROUP_CHANGE Group_Change; - [case(ACTION_GROUP_MEMBER_ADD)] ASACTION_GROUP_MEMBER_ADD Group_Member_Add; - [case(ACTION_GROUP_MEMBER_REMOVE)] ASACTION_GROUP_MEMBER_REMOVE Group_Member_Remove; - [case(ACTION_GROUP_RENAME)] ASACTION_GROUP_RENAME Group_Rename; - [case(ACTION_GROUP_CREATE)] ASACTION_GROUP_CREATE Group_Create; - [case(ACTION_GROUP_DELETE)] ASACTION_GROUP_DELETE Group_Delete; - [default] ; - } u; -} ASACTION, *LPASACTION; - - - // ASOBJPROP - Object Properties Structure - // ...A union of the different object properties structures, with an - // ASOBJTYPE identifier to indicate which one is valid. Each such - // structure has an associated version; as new information is obtained - // on the server, the internal version number is incremented. - // -const DWORD verPROP_NO_OBJECT = 0; // object deleted or otherwise invalid -const DWORD verPROP_RUDIMENTARY = 1; // only asked to obtain name etc -const DWORD verPROP_FIRST_SCAN = 2; // first properties obtained for object - -const DWORD ASOBJPROP_SERVER_MAXADDRESS = 16; // AFS uses <=16 addrs per server - -typedef struct { - DWORD idUserMax; - DWORD idGroupMax; -} ASOBJPROP_CELL, *LPASOBJPROP_CELL; - -typedef struct { - ULONG nAddresses; - DWORD aAddresses[ ASOBJPROP_SERVER_MAXADDRESS ]; -} ASOBJPROP_SERVER, *LPASOBJPROP_SERVER; - -cpp_quote ("#ifndef AFSCLASS_H") -typedef enum { - SERVICETYPE_SIMPLE, - SERVICETYPE_FS, - SERVICETYPE_CRON -} AFSSERVICETYPE; -cpp_quote ("#endif // AFSCLASS_H") - -cpp_quote ("#ifndef AFSCLASS_H") -typedef enum { - SERVICESTATE_RUNNING, - SERVICESTATE_STOPPED, - SERVICESTATE_STARTING, - SERVICESTATE_STOPPING -} SERVICESTATE; -cpp_quote ("#endif // AFSCLASS_H") - -typedef struct { - AFSSERVICETYPE ServiceType; - SERVICESTATE ServiceState; - STRING szAuxStatus; - STRING szParams; - STRING szNotifier; - SYSTEMTIME timeLastStart; - SYSTEMTIME timeLastStop; - SYSTEMTIME timeLastFail; - ULONG nStarts; - ULONG dwErrLast; - ULONG dwSigLast; -} ASOBJPROP_SERVICE, *LPASOBJPROP_SERVICE; - -typedef struct { - ULONG dwID; - ULONG ckStorageTotal; - ULONG ckStorageFree; - ULONG ckStorageAllocated; -} ASOBJPROP_PARTITION, *LPASOBJPROP_PARTITION; - -cpp_quote ("#ifndef AFSCLASS_H") -typedef enum { - ftREADWRITE, - ftREPLICA, - ftCLONE -} FILESETTYPE; -cpp_quote ("#endif // AFSCLASS_H") - -typedef struct { - VOLUMEID id; - VOLUMEID idReadWrite; - VOLUMEID idReplica; - VOLUMEID idClone; - SYSTEMTIME timeCreation; - SYSTEMTIME timeLastUpdate; - SYSTEMTIME timeLastAccess; - SYSTEMTIME timeLastBackup; - SYSTEMTIME timeCopyCreation; - ULONG nFiles; - ULONG ckQuota; - ULONG ckUsed; - FILESETTYPE FilesetType; - DWORD FilesetState; -} ASOBJPROP_VOLUME, *LPASOBJPROP_VOLUME; - -const DWORD FILESETSTATE_NORMAL = 0x00000000; -const DWORD FILESETSTATE_SALVAGE = 0x00000001; -const DWORD FILESETSTATE_NO_VNODE = 0x00000002; -const DWORD FILESETSTATE_NO_VOL = 0x00000004; -const DWORD FILESETSTATE_NO_SERVICE = 0x00000008; -const DWORD FILESETSTATE_OFFLINE = 0x00000010; -const DWORD FILESETSTATE_DISK_FULL = 0x00000020; -const DWORD FILESETSTATE_OVER_QUOTA = 0x00000040; -const DWORD FILESETSTATE_BUSY = 0x00000080; -const DWORD FILESETSTATE_MOVED = 0x00000100; -const DWORD FILESETSTATE_LOCKED = 0x00010000; // see afsclass/c_set.h - -typedef struct { - BOOL fHaveKasInfo; - BOOL fHavePtsInfo; - STRING szInstance; - - struct - { - BOOL fIsAdmin; - BOOL fCanGetTickets; - BOOL fEncrypt; - BOOL fCanChangePassword; - BOOL fCanReusePasswords; - SYSTEMTIME timeExpires; - SYSTEMTIME timeLastPwChange; - SYSTEMTIME timeLastMod; - STRING szUserLastMod; - LONG csecTicketLifetime; - int keyVersion; - BYTE keyData[ENCRYPTIONKEYLENGTH]; - DWORD dwKeyChecksum; - LONG cdayPwExpire; - LONG cFailLogin; - LONG csecFailLoginLock; - } KASINFO; - - struct - { - LONG cgroupCreationQuota; - LONG cgroupMember; - int uidName; - int uidOwner; - int uidCreator; - STRING szOwner; - STRING szCreator; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaGroupsOwned; - ACCOUNTACCESS aaMembership; - } PTSINFO; - -} ASOBJPROP_USER, *LPASOBJPROP_USER; - -typedef struct { - int nMembers; - int uidName; - int uidOwner; - int uidCreator; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaListGroupsOwned; - ACCOUNTACCESS aaListMembers; - ACCOUNTACCESS aaAddMember; - ACCOUNTACCESS aaDeleteMember; - STRING szOwner; - STRING szCreator; -} ASOBJPROP_GROUP, *LPASOBJPROP_GROUP; - -typedef struct { - ASOBJTYPE Type; - ASID idObject; - ASID idParentCell; - ASID idParentServer; - ASID idParentPartition; - STRING szName; - DWORD verProperties; // if > verPROP_RUDIMENTARY, union information valid - LPARAM lParam; - - [switch_is(Type)] union { - [case(TYPE_CELL)] ASOBJPROP_CELL CellProperties; - [case(TYPE_SERVER)] ASOBJPROP_SERVER ServerProperties; - [case(TYPE_SERVICE)] ASOBJPROP_SERVICE ServiceProperties; - [case(TYPE_PARTITION)] ASOBJPROP_PARTITION PartitionProperties; - [case(TYPE_VOLUME)] ASOBJPROP_VOLUME VolumeProperties; - [case(TYPE_USER)] ASOBJPROP_USER UserProperties; - [case(TYPE_GROUP)] ASOBJPROP_GROUP GroupProperties; - [default] ; - } u; -} ASOBJPROP, *LPASOBJPROP; - - - // ASIDLIST - Managed type for lists of cell objects - // ...Both the server and client libraries use TaAfsAdmSvrCommon.cpp, - // which contains (among other things) routines for manipulating - // ASIDLIST structures. This structure represents a list of ASIDs-- - // that is, references to objects within a specific cell. Different - // APIs which use ASIDLIST structures may have different uses for the - // {ASIDLIST.aEntries[].lParam} parameter. - // -typedef struct { - ULONG cEntries; - ULONG cEntriesAllocated; // (used internally) - [size_is(cEntriesAllocated), length_is(cEntriesAllocated)] struct { - ASID idObject; - LPARAM lParam; - } aEntries[*]; -} ASIDLIST, *LPASIDLIST; - - - // ASOBJPROPLIST - Managed type for lists of object properties - // ...This structure represents a list of ASOBJPROPs. - // -typedef struct { - ULONG cEntries; - ULONG cEntriesAllocated; // (used internally) - [size_is(cEntriesAllocated), length_is(cEntriesAllocated)] struct { - ASOBJPROP ObjectProperties; - LPARAM lParam; - } aEntries[*]; -} ASOBJPROPLIST, *LPASOBJPROPLIST; - - - // ASACTIONLIST - Managed type for lists of actions in progress - // ...This structure represents a list of ASACTION objects. - // -typedef struct { - ULONG cEntries; - ULONG cEntriesAllocated; // (used internally) - [size_is(cEntriesAllocated), length_is(cEntriesAllocated)] struct { - ASACTION Action; - } aEntries[*]; -} ASACTIONLIST, *LPASACTIONLIST; - - - // AFSADMSVR_SEARCH_REFRESH - Defines search parameters - // ...This structure is used when calling AfsAdmSvr_Search. - // -typedef enum { - SEARCH_KNOWN_OBJECTS, // test only already-found objects - SEARCH_ALL_OBJECTS // ensure cell scanned for all such objects first -} AFSADMSVR_SEARCH_REFRESH; - - - // AFSADMSVR_GET_TYPE - Defines data retrieval parameters - // AFSADMSVR_GET_LEVEL - Defines data retrieval parameters - // ...These structures are used when calling AfsAdmSvr_GetObject - // -typedef enum { - RETURN_DATA_ALWAYS, // only need to return name etc - RETURN_IF_OUT_OF_DATE, // always returns information for all objects -} AFSADMSVR_GET_TYPE; - -typedef enum { - GET_RUDIMENTARY_DATA, // only need to return name etc - GET_ALL_DATA // always returns information for all objects -} AFSADMSVR_GET_LEVEL; - - - // AFSADMSVR_CHANGECELL_PARAMS - Parameters for changing a cell - // -typedef struct { - DWORD idUserMax; - DWORD idGroupMax; -} AFSADMSVR_CHANGECELL_PARAMS, *LPAFSADMSVR_CHANGECELL_PARAMS; - - - // AFSADMSVR_CHANGEUSER_PARAMS - Parameters for changing users' properties - // -typedef struct { - BOOL fIsAdmin; - BOOL fCanGetTickets; - BOOL fEncrypt; - BOOL fCanChangePassword; - BOOL fCanReusePasswords; - SYSTEMTIME timeExpires; - LONG cdayPwExpire; - LONG csecTicketLifetime; - LONG cFailLogin; - LONG csecFailLoginLock; - LONG cgroupCreationQuota; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaGroupsOwned; - ACCOUNTACCESS aaMembership; -} AFSADMSVR_CHANGEUSER_PARAMS, *LPAFSADMSVR_CHANGEUSER_PARAMS; - - - // AFSADMSVR_CHANGEGROUP_PARAMS - Parameters for changing groups - // -typedef struct { - STRING szOwner; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaListGroupsOwned; - ACCOUNTACCESS aaListMembers; - ACCOUNTACCESS aaAddMember; - ACCOUNTACCESS aaDeleteMember; -} AFSADMSVR_CHANGEGROUP_PARAMS, *LPAFSADMSVR_CHANGEGROUP_PARAMS; - - - // AFSADMSVR_CREATEUSER_PARAMS - Parameters for creating user accounts - // -typedef struct - { - STRING szName; - STRING szInstance; - STRING szPassword; - int idUser; - BOOL fCreateKAS; - BOOL fCreatePTS; - } AFSADMSVR_CREATEUSER_PARAMS, *LPAFSADMSVR_CREATEUSER_PARAMS; - - - // AFSADMSVR_CREATEGROUP_PARAMS - Parameters for creating PTS groups - // -typedef struct - { - STRING szName; - STRING szOwner; - int idGroup; - } AFSADMSVR_CREATEGROUP_PARAMS, *LPAFSADMSVR_CREATEGROUP_PARAMS; - - - // AFSADMSVR_DELETEUSER_PARAMS - Parameters for deleting user accounts - // -typedef struct - { - BOOL fDeleteKAS; - BOOL fDeletePTS; - } AFSADMSVR_DELETEUSER_PARAMS, *LPAFSADMSVR_DELETEUSER_PARAMS; - - - // AFSADMSVR_SEARCH_TYPE - Advanced search types - // -typedef enum - { - SEARCH_NO_LIMITATIONS, - SEARCH_EXPIRES_BEFORE, - SEARCH_PASSWORD_EXPIRES_BEFORE - } AFSADMSVR_SEARCH_TYPE; - - // AFSADMSVR_SEARCH_PARAMS - Advanced search parameters - // -typedef struct - { - AFSADMSVR_SEARCH_TYPE SearchType; - SYSTEMTIME SearchTime; - } AFSADMSVR_SEARCH_PARAMS, *LPAFSADMSVR_SEARCH_PARAMS; - diff --git a/src/WINNT/afsadmsvr/NTMakefile b/src/WINNT/afsadmsvr/NTMakefile deleted file mode 100644 index 39481c70e..000000000 --- a/src/WINNT/afsadmsvr/NTMakefile +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# since we're using rpcndr.h, we can't include 's "hyper" type. - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -DIGNORE_STDS_H - -# include the primary makefile - -RELDIR=WINNT\afsadmsvr -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# -# BUILD TARGETS -# - -INCFILEDIR = $(DESTDIR)\include\WINNT - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsAdmSvr.exe - -LIBFILE = $(DESTDIR)\lib\afs\TaAfsAdmSvrClient.lib - -INCFILES = \ - $(INCFILEDIR)\TaAfsAdmSvr.h \ - $(INCFILEDIR)\TaAfsAdmSvrClient.h \ - $(INCFILEDIR)\TaAfsAdmSvrCommon.h \ - $(INCFILEDIR)\iTaAfsAdmSvr.h \ - $(INCFILEDIR)\iTaAfsAdmSvrTypes.h - -IDLFILES = \ - iTaAfsAdmSvr.h \ - iTaAfsAdmSvrTypes.h - -LIBOBJS = \ - $(OUT)\TaAfsAdmSvrClient.obj \ - $(OUT)\TaAfsAdmSvrClientBind.obj \ - $(OUT)\TaAfsAdmSvrClientCache.obj \ - $(OUT)\TaAfsAdmSvrClientCell.obj \ - $(OUT)\TaAfsAdmSvrClientGroup.obj \ - $(OUT)\TaAfsAdmSvrClientInternal.obj \ - $(OUT)\TaAfsAdmSvrClientNotify.obj \ - $(OUT)\TaAfsAdmSvrClientPing.obj \ - $(OUT)\TaAfsAdmSvrClientUser.obj \ - $(OUT)\TaAfsAdmSvrCommon.obj \ - $(OUT)\iTaAfsAdmSvr_c.obj - -EXERES = $(OUT)\AfsAdmSvr.res - - -$(EXERES):$$(@B).rc - $(RC) $** - -EXEOBJS = \ - $(OUT)\TaAfsAdmSvr.obj \ - $(OUT)\TaAfsAdmSvrCallback.obj \ - $(OUT)\TaAfsAdmSvrCell.obj \ - $(OUT)\TaAfsAdmSvrCommon.obj \ - $(OUT)\TaAfsAdmSvrDebug.obj \ - $(OUT)\TaAfsAdmSvrGeneral.obj \ - $(OUT)\TaAfsAdmSvrGroup.obj \ - $(OUT)\TaAfsAdmSvrMain.obj \ - $(OUT)\TaAfsAdmSvrProperties.obj \ - $(OUT)\TaAfsAdmSvrSearch.obj \ - $(OUT)\TaAfsAdmSvrUser.obj \ - $(OUT)\iTaAfsAdmSvr_s.obj - -VCLIBS =\ - gdi32.lib \ - user32.lib \ - rpcns4.lib \ - rpcrt4.lib \ - comctl32.lib \ - gdi32.lib - -EXELIBS = \ - $(DESTDIR)\lib\afs\AfsClass.lib \ - $(DESTDIR)\lib\afs\TaAfsAppLib.lib \ - $(DESTDIR)\lib\afs\AfsKasAdmin.lib \ - $(DESTDIR)\lib\afs\AfsPtsAdmin.lib \ - $(DESTDIR)\lib\afs\AfsVosAdmin.lib \ - $(DESTDIR)\lib\afs\AfsBosAdmin.lib \ - $(DESTDIR)\lib\afs\AfsAdminUtil.lib \ - $(DESTDIR)\lib\afs\AfsClientAdmin.lib \ - -############################################################################ -# -# IDL COMPILATION -# - -MIDL_FLAGS=/ms_ext \ - /app_config \ - /I $(INCFILEDIR) \ - /I . \ - /env win32 \ - /win32 \ - /align 8 \ - /pack 8 \ - /W3 \ - /WX \ - /no_robust \ - /nologo - -.SUFFIXES: .h .idl - -.idl.h: - echo [$<] - midl $(MIDL_FLAGS) $(AFSDEV_AUXMIDLFLAGS) $< - -############################################################################ - -afsapplib_headers : - $(CD) ..\afsapplib - nmake /nologo /f ntmakefile headers - $(CD) ..\afsadmsvr - -$(LIBFILE) : $(LIBOBJS) - $(LIBARCH) - -afsapplib_primary : - $(CD) ..\afsapplib - nmake /nologo /f ntmakefile primary - $(CD) ..\afsadmsvr - -afsapplib_clean : - $(CD) ..\afsapplib - nmake /nologo /f ntmakefile clean - $(CD) ..\afsadmsvr - -afsclass_primary : - $(CD) ..\afsclass - nmake /nologo /f ntmakefile primary - $(CD) ..\afsadmsvr - -afsclass_clean : - $(CD) ..\afsclass - nmake /nologo /f ntmakefile clean - $(CD) ..\afsadmsvr - -$(EXEFILE) : $(EXEOBJS) $(EXELIBS) - $(EXECONLINK) $(VCLIBS) - $(EXEPREP) - -install : \ - $(IDLFILES) \ - $(INCFILES) \ - afsapplib_headers \ - $(LIBFILE) \ - afsapplib_primary \ - afsclass_primary \ - $(EXEFILE) - -clean:: afsclass_clean afsapplib_clean - if exist ITaAfsAdmSvr*.cpp del ITaAfsAdmSvr*.cpp - if exist ITaAfsAdmSvr*.c del ITaAfsAdmSvr*.c - if exist ITaAfsAdmSvr*.h del ITaAfsAdmSvr*.h - -############################################################################ -# -# Dependencies -# - -$(OUT)\AfsAdmSvr.res : AFS_component_version_number.h - -mkdir: - -mkdir $(OUT)\..\afsapplib - cd ..\afsapplib - nmake /nologo /f ntmakefile mkdir - cd ..\afsadmsvr - -mkdir $(OUT)\..\afsclass - cd ..\afsclass - nmake /nologo /f ntmakefile mkdir - cd ..\afsadmsvr diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvr.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvr.cpp deleted file mode 100644 index d1ac9a554..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvr.cpp +++ /dev/null @@ -1,701 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include "TaAfsAdmSvrInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - // AfsAdmSvr_Connect - // ...obtains a cookie to represent the calling process. The cookie should - // be freed with AfsAdmSvr_Disconnect when the process disconnects. - // -extern "C" int AfsAdmSvr_Connect (STRING szClientAddress, DWORD *pidClient, ULONG *pStatus) -{ - // Make sure AfsClass initialized properly. If it's already init'd, - // this won't hurt at all. - // - ULONG status; - if (!AfsClass_Initialize (&status)) - { - Print (TEXT("Denying client %s due to AfsClass initialization failure"), szClientAddress); - return FALSE_(status, pStatus); - } - - // Find a free CLIENTINFO structure for this caller - // - if (!AfsAdmSvr_AttachClient (szClientAddress, pidClient, pStatus)) - return FALSE; - - Print (TEXT("Connected to client %s (ID 0x%08lX)"), AfsAdmSvr_GetClientName (*pidClient), *pidClient); - - return TRUE; -} - - - // AfsAdmSvr_Ping - // ...reminds the admin server that the specified client is still around. - // this call should be made at least every csecAFSADMSVR_CLIENT_PING - // seconds, lest the admin server think you've disconnected. (The - // client library TaAfsAdmSvrClient.lib automatically handles this.) - // -extern "C" int AfsAdmSvr_Ping (DWORD idClient, ULONG *pStatus) -{ - AfsAdmSvr_Enter(); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return Leave_FALSE_(ERROR_INVALID_PARAMETER, pStatus); - - AfsAdmSvr_PingClient (idClient); - AfsAdmSvr_Leave(); - return TRUE; -} - - - // AfsAdmSvr_Disconnect - // ...releases and invalidates the cookie representing the calling process. - // -extern "C" int AfsAdmSvr_Disconnect (DWORD idClient, ULONG *pStatus) -{ - AfsAdmSvr_Enter(); - - // Make sure this is a valid client, and free its l.aClients[] entry if so. - // - if (!AfsAdmSvr_fIsValidClient (idClient)) - return Leave_FALSE_(ERROR_INVALID_PARAMETER, pStatus); - - Print (TEXT("Disconnected from client %s (ID 0x%08lX)"), AfsAdmSvr_GetClientName (idClient), idClient); - - AfsAdmSvr_DetachClient (idClient); - AfsAdmSvr_Leave(); - return TRUE; -} - - - // AfsAdmSvr_CrackCredentials - // ...queries the specified AFS credentials token for its cell, user - // and expiration date. - // -extern "C" int AfsAdmSvr_CrackCredentials (DWORD idClient, DWORD hCreds, STRING pszCell, STRING pszUser, SYSTEMTIME *pstExpiration, ULONG *pStatus) -{ - ULONG status; - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: CrackCredentials (0x%08lX)"), idClient, hCreds); - - unsigned long dateExpirationQuery; - int fHasKasTokenQuery; - char szUser[ cchSTRING ]; - char szUser2[ cchSTRING ]; - char szCell[ cchSTRING ]; - char *pszCellQuery = (pszCell) ? (char *)pszCell : szCell; - char *pszUserQuery = (pszUser) ? (char *)pszUser : szUser; - if (!afsclient_TokenQuery ((PVOID)hCreds, &dateExpirationQuery, pszUserQuery, szUser2, pszCellQuery, &fHasKasTokenQuery, (afs_status_p)&status)) - return FALSE_(status, pStatus, iOp); - - if (pstExpiration) - AfsAppLib_UnixTimeToSystemTime (pstExpiration, dateExpirationQuery); - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_GetCredentials - // ...queries the user's current AFS credentials for the specified cell - // if the user already has credentials in the cell, returns a nonzero - // token {hCreds}, suitable for use in AfsAdmSvr_OpenCell(). - // -extern "C" DWORD AfsAdmSvr_GetCredentials (DWORD idClient, STRING pszCell, ULONG *pStatus) -{ - ULONG status; - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetCredentials (%s)"), idClient, pszCell); - - const char *pszCellTest = (pszCell && *pszCell) ? (const char *)pszCell : NULL; - - PVOID hCreds = NULL; - if (!afsclient_TokenGetExisting (pszCellTest, &hCreds, (afs_status_p)&status)) - return FALSE_(status, pStatus, iOp); - - AfsAdmSvr_EndOperation (iOp); - return (DWORD)hCreds; -} - - - // AfsAdmSvr_SetCredentials - // ...obtains new AFS credentials within the administrative server process - // on behalf of the specified user. if successful, returns a nonzero - // token {hCreds}, suitable for use in AfsAdmSvr_OpenCell(). - // -extern "C" DWORD AfsAdmSvr_SetCredentials (DWORD idClient, STRING pszCell, STRING pszUser, STRING pszPassword, ULONG *pStatus) -{ - ULONG status; - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: SetCredentials (%s,%s)"), idClient, pszCell, pszUser); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - const char *pszCellSet = (pszCell && *pszCell) ? (const char *)pszCell : NULL; - - PVOID hCreds; - if (!afsclient_TokenGetNew (pszCellSet, (const char *)pszUser, (const char *)pszPassword, &hCreds, (afs_status_p)&status)) - return FALSE_(status,pStatus,iOp); - - AfsAdmSvr_EndOperation (iOp); - return (DWORD)hCreds; -} - - - // AfsAdmSvr_PushCredentials - // ...requests that the specified AFS credentials be used hereafter - // when manipulating the specified cell. You should follow this - // call with a Refresh request if necessary. - // -extern "C" int AfsAdmSvr_PushCredentials (DWORD idClient, DWORD hCreds, ASID idCell, ULONG *pStatus) -{ - ULONG status; - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: PushCredentials (hCreds=0x%08lX, idCell=0x%08lX)"), idClient, hCreds, idCell); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - if (GetAsidType (idCell) != itCELL) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - lpCell->SetCurrentCredentials ((PVOID)hCreds); - lpCell->Close(); - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_GetLocalCell - // ...obtains the name of the primary cell used by the admin server - // -extern "C" int AfsAdmSvr_GetLocalCell (DWORD idClient, STRING pszCellName, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetLocalCell"), idClient); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - if (!CELL::GetDefaultCell (pszCellName, pStatus)) - { - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_ErrorCodeTranslate - // ...translates an error code into an English string - // -extern "C" int AfsAdmSvr_ErrorCodeTranslate (DWORD idClient, ULONG code, LANGID idLanguage, STRING pszErrorText, ULONG *pStatus) -{ - if (!AfsAppLib_TranslateError (pszErrorText, code, idLanguage)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - - LPTSTR pch; - if ((pch = (LPTSTR)lstrrchr (pszErrorText, TEXT('('))) != NULL) - *pch = TEXT('\0'); - while (lstrlen(pszErrorText) && pszErrorText[ lstrlen(pszErrorText)-1 ] == TEXT(' ')) - pszErrorText[ lstrlen(pszErrorText)-1 ] = TEXT('\0'); - return TRUE; -} - - - // AfsAdmSvr_GetAction - // ...returns information about a particular operation in progress. - // -extern "C" int AfsAdmSvr_GetAction (DWORD idClient, DWORD idAction, LPASACTION pAction, ULONG *pStatus) -{ - Print (dlDETAIL, TEXT("Client 0x%08lX: GetAction (idAction=0x%08lX)"), idClient, idAction); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - - if (!AfsAdmSvr_GetOperation (idAction, pAction)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - - Print (dlERROR, TEXT("Client 0x%08lX: GetAction succeeded")); - return TRUE; -} - - - // AfsAdmSvr_GetActions - // ...returns a list of operations in progress. The list returned can - // be constrained to only including those operations initiated by - // a particular client and/or performed in a particular cell. - // -extern "C" int AfsAdmSvr_GetActions (DWORD idClient, DWORD idClientSearch, ASID idCellSearch, LPASACTIONLIST *ppList, ULONG *pStatus) -{ - Print (dlDETAIL, TEXT("Client 0x%08lX: GetActions (idClientSearch=0x%08lX, idCellSearch=0x%08lX)"), idClient, idClientSearch, idCellSearch); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - - if ((*ppList = AfsAdmSvr_GetOperations (idClientSearch, idCellSearch)) == NULL) - { - Print (dlERROR, TEXT("Client 0x%08lX: GetActions failed"), idClient); - return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus); - } - - Print (dlERROR, TEXT("Client 0x%08lX: GetActions succeeded; %ld actions"), idClient, (*ppList) ? (*ppList)->cEntries : 0); - return TRUE; -} - - - // AfsAdmSvr_OpenCell - // ...opens a cell for administration. - // -extern "C" int AfsAdmSvr_OpenCell (DWORD idClient, DWORD hCreds, STRING pszCellName, DWORD dwScopeFlags, ASID *pidCell, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: OpenCell"), idClient); - - AfsAdmSvr_AddToMinScope (dwScopeFlags); - - LPIDENT lpiCell; - if ((lpiCell = CELL::OpenCell ((LPTSTR)pszCellName, (PVOID)hCreds, pStatus)) == NULL) - { - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: OpenCell succeeded (idCell=0x%08lX)"), idClient, (DWORD)lpiCell); - - *pidCell = (ASID)lpiCell; - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_CloseCell - // ...used by client to open a cell for administration. - // -extern "C" int AfsAdmSvr_CloseCell (DWORD idClient, ASID idCell, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: CloseCell (idCell=0x%08lX)"), idClient, idCell); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - if (GetAsidType (idCell) != itCELL) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - CELL::CloseCell ((LPIDENT)idCell); - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_FindObject - // AfsAdmSvr_FindObjects - // ...used to search through all objects in the cell, obtaining a list - // of those which match the specified criteria. For FindObjects, the - // {*ppList} parameter will be filled in with an allocated list of - // ASIDs, and should be freed using the AfsAdmSvr_FreeAsidList() - // routine (clients using the TaAfsAdmSvrClient.lib library should - // call asc_AsidListFree(), which is a wrapper for that routine). - // The _FindObject routine can be used to find exactly one object-- - // for instance, finding the ASID for a particular user or volume-- - // while the _FindObjects routine returns a list of all objects - // which match the specified criteria--all volumes on a partition, - // or all users named "b*" within a cell. - // -extern "C" int AfsAdmSvr_FindObject (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, AFSADMSVR_SEARCH_REFRESH SearchRefresh, STRING szName, ASID *pidObject, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: FindObject (scope=0x%08lX, type=%lu, name='%s')"), idClient, idSearchScope, ObjectType, szName); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - if (GetAsidType (idSearchScope) == itUNUSED) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // We've got a special case here: if possible, we don't want to have to - // refresh the contents of the entire cell. So if the client is looking - // for a user or group, we can just try to grab that object by its name; - // afsclass supports an interface for just this case. - // - switch (ObjectType) - { - case TYPE_USER: - rc = AfsAdmSvr_Search_OneUser (pidObject, idSearchScope, szName, &status); - break; - - case TYPE_GROUP: - rc = AfsAdmSvr_Search_OneGroup (pidObject, idSearchScope, szName, &status); - break; - - default: - // We'll have to do the search the hard way. First - // see if we need to refresh this cell/server. - // - if (!AfsAdmSvr_SearchRefresh (idSearchScope, ObjectType, SearchRefresh, &status)) - return FALSE_(status,pStatus,iOp); - - // Look for the specified object. - // - switch (GetAsidType (idSearchScope)) - { - case itCELL: - if (ObjectType == TYPE_SERVER) - rc = AfsAdmSvr_Search_ServerInCell (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_SERVICE) - rc = AfsAdmSvr_Search_ServiceInCell (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_PARTITION) - rc = AfsAdmSvr_Search_PartitionInCell (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_VOLUME) - rc = AfsAdmSvr_Search_VolumeInCell (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_USER) - rc = AfsAdmSvr_Search_UserInCell (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_GROUP) - rc = AfsAdmSvr_Search_GroupInCell (pidObject, idSearchScope, szName, &status); - else - { - rc = FALSE; - status = ERROR_INVALID_PARAMETER; - } - break; - - case itSERVER: - if (ObjectType == TYPE_SERVICE) - rc = AfsAdmSvr_Search_ServiceInServer (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_PARTITION) - rc = AfsAdmSvr_Search_PartitionInServer (pidObject, idSearchScope, szName, &status); - else if (ObjectType == TYPE_VOLUME) - rc = AfsAdmSvr_Search_VolumeInServer (pidObject, idSearchScope, szName, &status); - else - { - rc = FALSE; - status = ERROR_INVALID_PARAMETER; - } - break; - - case itAGGREGATE: - if (ObjectType == TYPE_VOLUME) - rc = AfsAdmSvr_Search_VolumeInPartition (pidObject, idSearchScope, szName, &status); - else - { - rc = FALSE; - status = ERROR_INVALID_PARAMETER; - } - break; - } - break; - } - - if (!rc && pStatus) - *pStatus = status; - - if (!rc) - Print (dlERROR, TEXT("Client 0x%08lX: FindObject failed (status=0x%08lX)"), idClient, status); - else // (rc) - Print (dlDETAIL, TEXT("Client 0x%08lX: FindObject succeeded; returning idObject=0x%08lX"), idClient, *pidObject); - - AfsAdmSvr_EndOperation (iOp); - return rc; -} - - -extern "C" int AfsAdmSvr_FindObjects (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, AFSADMSVR_SEARCH_REFRESH SearchRefresh, STRING szPattern, LPAFSADMSVR_SEARCH_PARAMS pSearchParams, LPASIDLIST *ppList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: FindObjects (scope=0x%08lX, type=%lu, pat='%s')"), idClient, idSearchScope, ObjectType, szPattern); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - if (GetAsidType (idSearchScope) == itUNUSED) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // First see if we need to refresh this cell/server - // - if (!AfsAdmSvr_SearchRefresh (idSearchScope, ObjectType, SearchRefresh, &status)) - return FALSE_(status,pStatus,iOp); - - // Prepare an ASIDLIST, and call whatever subroutine is necessary to - // perform the actual search. - // - if ((*ppList = AfsAdmSvr_CreateAsidList()) == NULL) - return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp); - - LPTSTR pszPattern = (szPattern && szPattern[0]) ? (LPTSTR)szPattern : NULL; - - switch (GetAsidType (idSearchScope)) - { - case itCELL: - if (ObjectType == TYPE_ANY) - rc = AfsAdmSvr_Search_AllInCell (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_SERVER) - rc = AfsAdmSvr_Search_ServersInCell (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_SERVICE) - rc = AfsAdmSvr_Search_ServicesInCell (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_PARTITION) - rc = AfsAdmSvr_Search_PartitionsInCell (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_VOLUME) - rc = AfsAdmSvr_Search_VolumesInCell (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_USER) - rc = AfsAdmSvr_Search_UsersInCell (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_GROUP) - rc = AfsAdmSvr_Search_GroupsInCell (ppList, idSearchScope, pszPattern, &status); - else - { - rc = FALSE; - status = ERROR_INVALID_PARAMETER; - } - break; - - case itSERVER: - if (ObjectType == TYPE_ANY) - rc = AfsAdmSvr_Search_AllInServer (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_SERVICE) - rc = AfsAdmSvr_Search_ServicesInServer (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_PARTITION) - rc = AfsAdmSvr_Search_PartitionsInServer (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_VOLUME) - rc = AfsAdmSvr_Search_VolumesInServer (ppList, idSearchScope, pszPattern, &status); - else - { - rc = FALSE; - status = ERROR_INVALID_PARAMETER; - } - break; - - case itAGGREGATE: - if (ObjectType == TYPE_ANY) - rc = AfsAdmSvr_Search_VolumesInPartition (ppList, idSearchScope, pszPattern, &status); - else if (ObjectType == TYPE_VOLUME) - rc = AfsAdmSvr_Search_VolumesInPartition (ppList, idSearchScope, pszPattern, &status); - else - { - rc = FALSE; - status = ERROR_INVALID_PARAMETER; - } - break; - } - - if (rc && (*ppList) && (pSearchParams)) - AfsAdmSvr_Search_Advanced (ppList, pSearchParams); - - if (!rc && (*ppList)) - AfsAdmSvr_FreeAsidList (ppList); - if (!rc && pStatus) - *pStatus = status; - - if (!rc) - Print (dlERROR, TEXT("Client 0x%08lX: FindObjects failed (status=0x%08lX)"), idClient, status); - else // (rc) - Print (dlDETAIL, TEXT("Client 0x%08lX: FindObjects succeeded; returning %lu item(s)"), idClient, (*ppList)->cEntries); - - AfsAdmSvr_EndOperation (iOp); - return rc; -} - - - // AfsAdmSvr_GetObject - // AfsAdmSvr_GetObjects - // ...returns server-cached information about the specified object (or - // objects). - // -extern "C" int AfsAdmSvr_GetObject (DWORD idClient, AFSADMSVR_GET_TYPE GetType, AFSADMSVR_GET_LEVEL GetLevel, ASID idObject, DWORD verProperties, LPASOBJPROP pProperties, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL2, TEXT("Client 0x%08lX: GetObject (Type=%lu, Level=%lu, idObject=0x%08lX, ver=%ld)"), idClient, (LONG)GetType, (LONG)GetLevel, idObject, verProperties); - - memset (pProperties, 0x00, sizeof(ASOBJPROP)); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - LPASOBJPROP pCurrentProperties; - if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idObject, pStatus)) == NULL) - { - Print (dlERROR, TEXT("Client 0x%08lX: GetObject failed; no properties"), idClient, idObject); - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - - // At this point pCurrentProperties may just be rudimentary properties. - // If the user has requested GET_ALL_DATA, we'll have to get full properties. - // - if ( (GetLevel == GET_ALL_DATA) && (pCurrentProperties->verProperties < verPROP_FIRST_SCAN) ) - { - if (!AfsAdmSvr_ObtainFullProperties (pCurrentProperties, pStatus)) - { - Print (dlERROR, TEXT("Client 0x%08lX: GetObject failed; no full properties"), idClient, idObject); - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - } - - // Now determine if we need to return anything at all; if the user specified - // RETURN_IF_OUT_OF_DATE, it's possible that there's no need to do so. - // - if ((pCurrentProperties->verProperties > verProperties) || (GetType == RETURN_DATA_ALWAYS)) - { - memcpy (pProperties, pCurrentProperties, sizeof(ASOBJPROP)); - } - - Print (dlDETAIL2, TEXT("Client 0x%08lX: GetObject succeeded (idObject=0x%08lX)"), idClient, idObject); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - -extern "C" int AfsAdmSvr_GetObjects (DWORD idClient, AFSADMSVR_GET_TYPE GetType, AFSADMSVR_GET_LEVEL GetLevel, LPASIDLIST pListObjects, LPASOBJPROPLIST *ppListObjectProperties, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetObjects (Type=%lu, Level=%lu, nObjects=%lu)"), idClient, (LONG)GetType, (LONG)GetLevel, (pListObjects) ? (pListObjects->cEntries) : 0); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - *ppListObjectProperties = NULL; - for (size_t iObject = 0; iObject < pListObjects->cEntries; ++iObject) - { - ASOBJPROP ObjectProperties; - - ULONG status; - if (AfsAdmSvr_GetObject (idClient, GetType, GetLevel, pListObjects->aEntries[ iObject ].idObject, pListObjects->aEntries[ iObject ].lParam, &ObjectProperties, &status)) - { - if (ObjectProperties.idObject == pListObjects->aEntries[ iObject ].idObject) - { - if (!*ppListObjectProperties) - *ppListObjectProperties = AfsAdmSvr_CreateObjPropList(); - - if (*ppListObjectProperties) - AfsAdmSvr_AddToObjPropList (ppListObjectProperties, &ObjectProperties, 0); - } - } - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetObjects succeeded; returning %lu properties"), idClient, (*ppListObjectProperties) ? ((*ppListObjectProperties)->cEntries) : 0); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_RefreshObject - // AfsAdmSvr_RefreshObjects - // ...invalidates the server's cache of information about the specified - // object or objects. - // -extern "C" int AfsAdmSvr_RefreshObject (DWORD idClient, ASID idObject, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: RefreshObject (idObject=0x%08lX)"), idClient, idObject); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - if (!AfsAdmSvr_InvalidateObjectProperties (idObject, pStatus)) - { - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - -extern "C" int AfsAdmSvr_RefreshObjects (DWORD idClient, LPASIDLIST pListObjects, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: RefreshObjects (nObjects=%lu)"), idClient, (pListObjects) ? (pListObjects->cEntries) : 0); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - for (size_t iObject = 0; iObject < pListObjects->cEntries; ++iObject) - { - ULONG status; - AfsAdmSvr_RefreshObject (idClient, pListObjects->aEntries[ iObject ].idObject, &status); - } - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_CallbackHost - // ...provides a context in which the server can issue callback functions - // via the AfsAdmSvrCallBack_* routines, which the client must implement. - // This routine will only return if the server is shut down. It should - // be called on a dedicated thread by the client. (TaAfsAdmSvrClient.lib - // automatically handles this.) - // -extern "C" void AfsAdmSvr_CallbackHost (void) -{ - AfsAdmSvr_CallbackManager(); -} - - - - // AfsAdmSvr_GetRandomKey - // ...returns a randomly-generated 8-byte encryption key - // -extern "C" int AfsAdmSvr_GetRandomKey (DWORD idClient, ASID idCell, BYTE keyData[ ENCRYPTIONKEYLENGTH ], ULONG *pStatus) -{ - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - - return AfsClass_GetRandomKey ((LPIDENT)idCell, (LPENCRYPTIONKEY)keyData, pStatus); -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvr.h b/src/WINNT/afsadmsvr/TaAfsAdmSvr.h deleted file mode 100644 index 2f4f203ca..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvr.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVR_H -#define TAAFSADMSVR_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#ifndef TAAFSADMSVRCLIENT_H -#include -#endif // TAAFSADMSVRCLIENT_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - // The admin server can be started on a machine just by running - // its .EXE; if the "timed" keyword is given on its command-line, - // it will shut itself down if it's idle for N minutes. If the "Manual" - // keyword is not present, the local cell will automatically be opened - // for administration and its contents refreshed (the scope of the auto- - // refresh can be limited to users or volumes by also adding one of - // the Scope keywords) - // -#define AFSADMSVR_PROGRAM "TaAfsAdmSvr.exe" -#define AFSADMSVR_KEYWORD_TIMED "Timed" -#define AFSADMSVR_KEYWORD_MANUAL "Manual" -#define AFSADMSVR_KEYWORD_SCOPE_USERS "Users" -#define AFSADMSVR_KEYWORD_SCOPE_VOLUMES "Volumes" -#define AFSADMSVR_KEYWORD_DEBUG "Debug" - - // Ordinarily, the admin server will export its binding handles - // under the following identity: - // -#define AFSADMSVR_ENTRYNAME_DEFAULT "/.:/Autohandle_TaAfsAdmSvr" - - // On my Win98 box, RpcNsBindingExport() always fails for some - // inexplicable reason (error 6BF, RPC_S_CALL_FAILED_DNE, which - // is about as generic a "didn't work" error code as you can get.) - // Presuming that this is not the only box in the world which can't - // do this--even though it's documented to work on Win95, perhaps - // it's widespread?--the admin server will detect failure of this - // routine and attempt to bind to a particular default endpoint; - // if the client can't find any valid binding handles through - // RpcNsBinding* lookups, it will try this well-known endpoint as - // a last-ditch effort. - // -#define AFSADMSVR_ENDPOINT_DEFAULT 1025 - - -#endif // TAAFSADMSVR_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp deleted file mode 100644 index 2c7df7dae..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include "TaAfsAdmSvrInternal.h" - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - CALLBACKTYPE Type; - BOOL fFinished; - LPASACTION pAction; - } CALLBACKDATA, *LPCALLBACKDATA; - -static struct - { - HANDLE heCallback; - LPHASHLIST pListCallbacks; - BOOL fStopManagers; - size_t cManagers; - } l; - - -/* - * CALLBACKS __________________________________________________________________ - * - */ - -void AfsAdmSvr_FreeCallbackData (LPCALLBACKDATA pData) -{ - if (pData) - { - if (pData->pAction) - Delete (pData->pAction); - Delete (pData); - } -} - - -void AfsAdmSvr_CallbackManager (void) -{ - AfsAdmSvr_Enter(); - if ((++l.cManagers) == 1) - { - l.heCallback = CreateEvent (NULL, TRUE, FALSE, TEXT("AfsAdmSvr_CallbackManager Event")); - l.pListCallbacks = New (HASHLIST); - } - AfsAdmSvr_Leave(); - - for (;;) - { - WaitForSingleObjectEx (l.heCallback, INFINITE, FALSE); - - if (l.fStopManagers) - break; - - // We must ensure that we don't block the server's operations because - // a callback doesn't go through; since other operations may need - // access to the l.pListCallbacks structure in order to queue new - // callbacks, we can't leave it locked by issuing callbacks while - // enumerating it. Instead we'll copy the list into a local copy, - // clear it, and enumerate that local copy--other threads can then - // continue to add new requests to l.pListCallbacks. - // - AfsAdmSvr_Enter(); - - LPHASHLIST pList = New (HASHLIST); - for (LPENUM pEnum = l.pListCallbacks->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPCALLBACKDATA pData = (LPCALLBACKDATA)( pEnum->GetObject() ); - pList->Add (pData); - l.pListCallbacks->Remove (pData); - } - - ResetEvent (l.heCallback); - AfsAdmSvr_Leave(); - - // Now enumerate that copied list, and issue callbacks for each item. - // - for (pEnum = pList->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPCALLBACKDATA pData = (LPCALLBACKDATA)( pEnum->GetObject() ); - - try { - switch (pData->Type) - { - case cbtACTION: - AfsAdmSvrCallback_Action (pData->pAction, pData->fFinished); - break; - } - } catch(...) { - ; - } - - pList->Remove (pData); - AfsAdmSvr_FreeCallbackData (pData); - } - - Delete (pList); - } - - AfsAdmSvr_Enter(); - if ((--l.cManagers) == 0) - { - Delete (l.pListCallbacks); - l.pListCallbacks = NULL; - CloseHandle (l.heCallback); - l.heCallback = NULL; - } - AfsAdmSvr_Leave(); -} - - -void AfsAdmSvr_PostCallback (CALLBACKTYPE Type, BOOL fFinished, LPASACTION pAction, DWORD dwRemoveMe) -{ - AfsAdmSvr_Enter(); - if (l.pListCallbacks) - { - LPCALLBACKDATA pData = New (CALLBACKDATA); - memset (pData, 0x00, sizeof(CALLBACKDATA)); - pData->Type = Type; - pData->fFinished = fFinished; - if (pAction) - { - pData->pAction = New (ASACTION); - memcpy (pData->pAction, pAction, sizeof(ASACTION)); - } - - l.pListCallbacks->Add (pData); - SetEvent (l.heCallback); - } - AfsAdmSvr_Leave(); -} - - -void AfsAdmSvr_PostCallback (CALLBACKTYPE Type, BOOL fFinished, LPASACTION pAction) -{ - AfsAdmSvr_PostCallback (Type, fFinished, pAction, 0); -} - - -void AfsAdmSvr_StopCallbackManagers (void) -{ - AfsAdmSvr_Enter(); - if (l.cManagers) - { - l.fStopManagers = TRUE; - SetEvent (l.heCallback); - } - AfsAdmSvr_Leave(); -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.h deleted file mode 100644 index 81228c6f2..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCALLBACK_H -#define TAAFSADMSVRCALLBACK_H - -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - cbtACTION - } CALLBACKTYPE; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void AfsAdmSvr_CallbackManager (void); - -void AfsAdmSvr_PostCallback (CALLBACKTYPE Type, BOOL fFinished, LPASACTION pAction); - -void AfsAdmSvr_StopCallbackManagers (void); - - -#endif // TAAFSADMSVRCALLBACK_H diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrCell.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrCell.cpp deleted file mode 100644 index a511b88ac..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrCell.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include "TaAfsAdmSvrInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - - // AfsAdmSvr_ChangeCell - // ...changes a cell's properties. - // -extern "C" int AfsAdmSvr_ChangeCell (DWORD idClient, ASID idCell, LPAFSADMSVR_CHANGECELL_PARAMS pChange, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_CELL_CHANGE; - Action.idClient = idClient; - Action.idCell = idCell; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeCell (idCell=0x%08lX)"), idClient, idCell); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Call AfsClass to actually do it - // - PTSPROPERTIES PtsProperties; - PtsProperties.idUserMax = (int)(pChange->idUserMax); - PtsProperties.idGroupMax = (int)(pChange->idGroupMax); - - ULONG status; - if (!AfsClass_SetPtsProperties ((LPIDENT)idCell, &PtsProperties, &status)) - { - Print (dlERROR, TEXT("Client 0x%08lX: ChangeCell failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - AfsAdmSvr_TestProperties (idCell); - - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeCell succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - - // AfsAdmSvr_SetRefreshRate - // ...changes the refresh rate for a specific cell - // -extern "C" int AfsAdmSvr_SetRefreshRate (DWORD idClient, ASID idCell, ULONG cminRefreshRate, ULONG *pStatus) -{ - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - - Print (dlDETAIL, TEXT("Client 0x%08lX: Setting refresh rate to %lu minutes"), idClient, cminRefreshRate); - - if (!cminRefreshRate) - AfsAdmSvr_StopCellRefreshThread (idCell); - else - AfsAdmSvr_SetCellRefreshRate (idCell, cminRefreshRate); - - return TRUE; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClient.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClient.cpp deleted file mode 100644 index b38028a70..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClient.cpp +++ /dev/null @@ -1,890 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct - { - BOOL fInitializedSockets; - size_t cReqForAdminServer; - } l; - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -extern "C" void __RPC_FAR * __RPC_USER MIDL_user_allocate (size_t cbAllocate) -{ - return (void __RPC_FAR *)Allocate (cbAllocate); -} - -extern "C" void __RPC_USER MIDL_user_free (void __RPC_FAR *pData) -{ - Free (pData); -} - - -/* - * DATA STRUCTURES ____________________________________________________________ - * - */ - -BOOL ADMINAPI asc_AsidListCreate (LPASIDLIST *ppList) -{ - return ((*ppList = AfsAdmSvr_CreateAsidList()) != NULL); -} - -BOOL ADMINAPI asc_AsidListCopy (LPASIDLIST *ppListTarget, LPASIDLIST *ppListSource) -{ - return ((*ppListTarget = AfsAdmSvr_CopyAsidList (*ppListSource)) != NULL); -} - -BOOL ADMINAPI asc_AsidListAddEntry (LPASIDLIST *ppList, ASID idObject, LPARAM lp) -{ - return AfsAdmSvr_AddToAsidList (ppList, idObject, lp); -} - -BOOL ADMINAPI asc_AsidListRemoveEntry (LPASIDLIST *ppList, ASID idObject) -{ - return AfsAdmSvr_RemoveFromAsidList (ppList, idObject); -} - -BOOL ADMINAPI asc_AsidListRemoveEntryByIndex (LPASIDLIST *ppList, size_t iIndex) -{ - return AfsAdmSvr_RemoveFromAsidListByIndex (ppList, iIndex); -} - -BOOL ADMINAPI asc_AsidListSetEntryParam (LPASIDLIST *ppList, ASID idObject, LPARAM lp) -{ - return AfsAdmSvr_SetAsidListParam (ppList, idObject, lp); -} - -BOOL ADMINAPI asc_AsidListSetEntryParamByIndex (LPASIDLIST *ppList, size_t iIndex, LPARAM lp) -{ - return AfsAdmSvr_SetAsidListParamByIndex (ppList, iIndex, lp); -} - -BOOL ADMINAPI asc_AsidListTest (LPASIDLIST *ppList, ASID idObject, LPARAM *pParam) -{ - return AfsAdmSvr_IsInAsidList (ppList, idObject, pParam); -} - -BOOL ADMINAPI asc_AsidListFree (LPASIDLIST *ppList) -{ - AfsAdmSvr_FreeAsidList (ppList); - return TRUE; -} - - -BOOL ADMINAPI asc_ObjPropListCreate (LPASOBJPROPLIST *ppList) -{ - return ((*ppList = AfsAdmSvr_CreateObjPropList()) != NULL); -} - -BOOL ADMINAPI asc_ObjPropListCopy (LPASOBJPROPLIST *ppListTarget, LPASOBJPROPLIST *ppListSource) -{ - return ((*ppListTarget = AfsAdmSvr_CopyObjPropList (*ppListSource)) != NULL); -} - -BOOL ADMINAPI asc_ObjPropListAddEntry (LPASOBJPROPLIST *ppList, LPASOBJPROP pProperties, LPARAM lp) -{ - return AfsAdmSvr_AddToObjPropList (ppList, pProperties, lp); -} - -BOOL ADMINAPI asc_ObjPropListRemoveEntry (LPASOBJPROPLIST *ppList, ASID idObject) -{ - return AfsAdmSvr_RemoveFromObjPropList (ppList, idObject); -} - -BOOL ADMINAPI asc_ObjPropListTest (LPASOBJPROPLIST *ppList, ASID idObject, LPASOBJPROP pProperties, LPARAM *pParam) -{ - return AfsAdmSvr_IsInObjPropList (ppList, idObject, pProperties, pParam); -} - -BOOL ADMINAPI asc_ObjPropListFree (LPASOBJPROPLIST *ppList) -{ - AfsAdmSvr_FreeObjPropList (ppList); - return TRUE; -} - - -BOOL ADMINAPI asc_ActionListCreate (LPASACTIONLIST *ppList) -{ - return ((*ppList = AfsAdmSvr_CreateActionList()) != NULL); -} - -BOOL ADMINAPI asc_ActionListCopy (LPASACTIONLIST *ppListTarget, LPASACTIONLIST *ppListSource) -{ - return ((*ppListTarget = AfsAdmSvr_CopyActionList (*ppListSource)) != NULL); -} - -BOOL ADMINAPI asc_ActionListAddEntry (LPASACTIONLIST *ppList, LPASACTION pAction) -{ - return AfsAdmSvr_AddToActionList (ppList, pAction); -} - -BOOL ADMINAPI asc_ActionListRemoveEntry (LPASACTIONLIST *ppList, DWORD idAction) -{ - return AfsAdmSvr_RemoveFromActionList (ppList, idAction); -} - -BOOL ADMINAPI asc_ActionListTest (LPASACTIONLIST *ppList, DWORD idAction, LPASACTION pAction) -{ - return AfsAdmSvr_IsInActionList (ppList, idAction, pAction); -} - -BOOL ADMINAPI asc_ActionListFree (LPASACTIONLIST *ppList) -{ - AfsAdmSvr_FreeActionList (ppList); - return TRUE; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL ADMINAPI asc_AdminServerOpen (LPCTSTR pszAddress, DWORD *pidClient, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (!l.fInitializedSockets) - { - WSADATA Data; - WSAStartup (0x0101, &Data); - l.fInitializedSockets = TRUE; - } - - if ((++l.cReqForAdminServer) == 1) - { - LPCTSTR pszResolvedAddress = ResolveAddress (pszAddress); - if (!BindToAdminServer (pszResolvedAddress, FALSE, pidClient, &status)) - { - if (status != RPC_S_CALL_FAILED_DNE) // server rejected us? - rc = FALSE; - else if (pszResolvedAddress || !ForkNewAdminServer (&status)) - rc = FALSE; - else - rc = BindToAdminServer (pszResolvedAddress, TRUE, pidClient, &status); - } - } - - if (rc) - StartPingThread (*pidClient); - if (rc) - StartCallbackThread(); - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_AdminServerClose (DWORD idClient, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - StopCallbackThread(); - StopPingThread (idClient); - - if (l.cReqForAdminServer && ((--l.cReqForAdminServer) == 0)) - { - UnbindFromAdminServer (idClient, &status); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - - -BOOL ADMINAPI asc_CredentialsCrack (DWORD idClient, PVOID hCreds, LPTSTR pszCell, LPTSTR pszUser, SYSTEMTIME *pstExpiration, ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = 0; - - RpcTryExcept - { - STRING szCell = TEXT(""); - STRING szUser = TEXT(""); - - if ((rc = AfsAdmSvr_CrackCredentials (idClient, (DWORD)hCreds, szCell, szUser, pstExpiration, &status)) != FALSE) - { - lstrcpy (pszCell, szCell); - lstrcpy (pszUser, szUser); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -PVOID ADMINAPI asc_CredentialsGet (DWORD idClient, LPCTSTR pszCell, ULONG *pStatus) -{ - PVOID rc = NULL; - ULONG status = 0; - - RpcTryExcept - { - if (pszCell) - { - STRING szCell; - lstrcpy (szCell, pszCell); - - rc = (PVOID)AfsAdmSvr_GetCredentials (idClient, szCell, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -PVOID ADMINAPI asc_CredentialsSet (DWORD idClient, LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus) -{ - PVOID rc = NULL; - ULONG status = 0; - - RpcTryExcept - { - STRING szCell; - lstrcpy (szCell, pszCell); - - STRING szUser; - lstrcpy (szUser, pszUser); - - STRING szPassword; - lstrcpy (szPassword, pszPassword); - - // TODO: Ensure we do some encryption here, or using an - // encrypted socket, or something... can't just be pushing - // the user's unencrypted password across the wire. - - rc = (PVOID)AfsAdmSvr_SetCredentials (idClient, szCell, szUser, szPassword, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_CredentialsPush (DWORD idClient, PVOID hCreds, ASID idCell, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_PushCredentials (idClient, (DWORD)hCreds, idCell, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_LocalCellGet (DWORD idClient, LPTSTR pszCell, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - STRING szCell; - if ((rc = AfsAdmSvr_GetLocalCell (idClient, szCell, &status)) != FALSE) - { - lstrcpy (pszCell, szCell); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ErrorCodeTranslate (DWORD idClient, ULONG code, LANGID idLanguage, STRING pszErrorText, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - STRING szText; - if ((rc = AfsAdmSvr_ErrorCodeTranslate (idClient, code, idLanguage, szText, &status)) != FALSE) - { - lstrcpy (pszErrorText, szText); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_CellOpen (DWORD idClient, PVOID hCreds, LPCTSTR pszCell, DWORD dwScope, ASID *pidCell, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - STRING szCell; - lstrcpy (szCell, pszCell); - - if ((rc = AfsAdmSvr_OpenCell (idClient, (DWORD)hCreds, szCell, dwScope, pidCell, &status)) != FALSE) - { - if (!CreateCellCache (*pidCell)) - { - (void)AfsAdmSvr_CloseCell (idClient, *pidCell, &status); - rc = FALSE; - status = ERROR_NOT_ENOUGH_MEMORY; - } - else // get rudimentary properties about the cell - { - rc = RefreshCachedProperties (idClient, *pidCell, *pidCell, GET_RUDIMENTARY_DATA, &status); - } - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_CellClose (DWORD idClient, ASID idCell, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_CloseCell (idClient, idCell, &status); - DestroyCellCache (idCell); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectFind (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszName, ASID *pidObject, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - STRING szName = TEXT(""); - if (pszName) - lstrcpy (szName, pszName); - rc = AfsAdmSvr_FindObject (idClient, idSearchScope, ObjectType, SEARCH_ALL_OBJECTS, szName, pidObject, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectFindMultiple (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszPattern, LPAFSADMSVR_SEARCH_PARAMS pSearchParams, LPASIDLIST *ppList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - *ppList = NULL; - - STRING szPattern = TEXT(""); - if (pszPattern) - lstrcpy (szPattern, pszPattern); - - AFSADMSVR_SEARCH_PARAMS SearchParams; - if (pSearchParams) - memcpy (&SearchParams, pSearchParams, sizeof(AFSADMSVR_SEARCH_PARAMS)); - else - { - memset (&SearchParams, 0x00, sizeof(AFSADMSVR_SEARCH_PARAMS)); - SearchParams.SearchType = SEARCH_NO_LIMITATIONS; - } - - rc = AfsAdmSvr_FindObjects (idClient, idSearchScope, ObjectType, SEARCH_ALL_OBJECTS, szPattern, &SearchParams, ppList, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectPropertiesGet (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (!RefreshCachedProperties (idClient, idCell, idObject, GetLevel, &status)) - { - rc = FALSE; - } - else - { - LPASOBJPROP pFound; - if ((pFound = GetCachedProperties (idCell, idObject)) == NULL) - { - status = ERROR_NOT_ENOUGH_MEMORY; - rc = FALSE; - } - else - { - memcpy (pProperties, pFound, sizeof(ASOBJPROP)); - } - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectPropertiesGetMultiple (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, LPASIDLIST pAsidList, LPASOBJPROPLIST *ppPropertiesList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (!RefreshCachedProperties (idClient, idCell, pAsidList, GetLevel, &status)) - { - rc = FALSE; - } - else - { - *ppPropertiesList = NULL; - for (size_t iAsidList = 0; iAsidList < pAsidList->cEntries; ++iAsidList) - { - LPASOBJPROP pFound; - if ((pFound = GetCachedProperties (idCell, pAsidList->aEntries[ iAsidList ].idObject)) != NULL) - { - if (!*ppPropertiesList) - asc_ObjPropListCreate(ppPropertiesList); - if (*ppPropertiesList) - AfsAdmSvr_AddToObjPropList (ppPropertiesList, pFound, pAsidList->aEntries[ iAsidList ].lParam); - } - } - } - - if (!rc && *ppPropertiesList) - AfsAdmSvr_FreeObjPropList (ppPropertiesList); - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectListen (DWORD idClient, ASID idCell, ASID idObject, HWND hNotify, ULONG *pStatus) -{ - if (!idObject) - { - if (*pStatus) - *pStatus = ERROR_INVALID_PARAMETER; - return FALSE; - } - - if (!AddObjectNotification (hNotify, idCell, idObject)) - { - if (*pStatus) - *pStatus = ERROR_NOT_ENOUGH_MEMORY; - return FALSE; - } - - TestForNotifications (idClient, idCell, idObject); - return TRUE; -} - - -BOOL ADMINAPI asc_ObjectListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus) -{ - ClearObjectNotifications (hNotify); - return TRUE; -} - - -BOOL ADMINAPI asc_ObjectListenMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, HWND hNotify, ULONG *pStatus) -{ - if (!pAsidList) - { - if (*pStatus) - *pStatus = ERROR_INVALID_PARAMETER; - return FALSE; - } - - for (size_t ii = 0; ii < pAsidList->cEntriesAllocated; ++ii) - { - if (!pAsidList->aEntries[ ii ].idObject) - continue; - - if (!AddObjectNotification (hNotify, idCell, pAsidList->aEntries[ ii ].idObject)) - { - if (*pStatus) - *pStatus = ERROR_NOT_ENOUGH_MEMORY; - return FALSE; - } - - TestForNotifications (idClient, idCell, pAsidList->aEntries[ ii ].idObject); - } - - return TRUE; -} - - -BOOL ADMINAPI asc_ObjectRefresh (DWORD idClient, ASID idCell, ASID idObject, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - // First have the server invalidate its cache of information; regardless - // of the name, this is actually just an Invalidate call, not a Refresh call - // - RpcTryExcept - { - rc = AfsAdmSvr_RefreshObject (idClient, idObject, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - // If that suceeded, see if there is anyone listening for changes - // in this object or any of its children. If so, this call - // will requery the server for the latest properties for all - // listened-for objects, which will make us post notifications if - // we get new data back. - // - if (rc) - { - TestForNotifications (idClient, idCell); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectRefreshMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - // First have the server invalidate its cache of information; regardless - // of the name, this is actually just an Invalidate call, not a Refresh call - // - RpcTryExcept - { - rc = AfsAdmSvr_RefreshObjects (idClient, pAsidList, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - // If that suceeded, see if there is anyone listening for changes - // in any of these objects or their children. If so, this call - // will requery the server for the latest properties for all - // listened-for objects, which will make us post notifications if - // we get new data back. - // - if (rc) - { - TestForNotifications (idClient, idCell); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_RandomKeyGet (DWORD idClient, ASID idCell, PBYTE key, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - memset (key, 0x00, sizeof(BYTE) * ENCRYPTIONKEYLENGTH); - rc = AfsAdmSvr_GetRandomKey (idClient, idCell, key, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_CellNameGet_Fast (DWORD idClient, ASID idCell, LPTSTR pszCell, ULONG *pStatus) -{ - return asc_ObjectNameGet_Fast (idClient, idCell, idCell, pszCell, pStatus); -} - - -BOOL ADMINAPI asc_ObjectNameGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPTSTR pszObject, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPASOBJPROP pProperties; - if ((pProperties = GetCachedProperties (idCell, idObject)) == NULL) - { - rc = FALSE; - status = ERROR_NO_DATA; - } - else if (pProperties->verProperties == verPROP_NO_OBJECT) - { - rc = FALSE; - status = ERROR_NO_DATA; - } - else - { - lstrcpy (pszObject, pProperties->szName); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectTypeGet_Fast (DWORD idClient, ASID idCell, ASID idObject, ASOBJTYPE *pObjectType, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPASOBJPROP pProperties; - if ((pProperties = GetCachedProperties (idCell, idObject)) == NULL) - { - rc = FALSE; - status = ERROR_NO_DATA; - } - else if (pProperties->verProperties == verPROP_NO_OBJECT) - { - rc = FALSE; - status = ERROR_NO_DATA; - } - else - { - *pObjectType = pProperties->Type; - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ObjectPropertiesGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPASOBJPROP pPropFound; - if ((pPropFound = GetCachedProperties (idCell, idObject)) == NULL) - { - rc = FALSE; - status = ERROR_NO_DATA; - } - else if (pPropFound->verProperties == verPROP_NO_OBJECT) - { - rc = FALSE; - status = ERROR_NO_DATA; - } - else if (pProperties) - { - memcpy (pProperties, pPropFound, sizeof(ASOBJPROP)); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ActionGet (DWORD idClient, DWORD idAction, LPASACTION pAction, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - memset (pAction, 0x00, sizeof(ASACTION)); - rc = AfsAdmSvr_GetAction (idClient, idAction, pAction, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ActionGetMultiple (DWORD idClient, DWORD idClientSearch, ASID idCellSearch, LPASACTIONLIST *ppList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - *ppList = NULL; - rc = AfsAdmSvr_GetActions (idClient, idClientSearch, idCellSearch, ppList, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_ActionListen (DWORD idClient, HWND hNotify, ULONG *pStatus) -{ - if (!SetActionNotification (hNotify, TRUE)) - { - if (*pStatus) - *pStatus = ERROR_NOT_ENOUGH_MEMORY; - return FALSE; - } - return TRUE; -} - - -BOOL ADMINAPI asc_ActionListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus) -{ - if (!SetActionNotification (hNotify, FALSE)) - { - if (*pStatus) - *pStatus = ERROR_NOT_ENOUGH_MEMORY; - return FALSE; - } - return TRUE; -} - - - // AfsAdmSvrCallback_Action - // ...called by the server in the context of the CallbackHost() routine; - // this routine is used to notify the client whenever an action is - // initiated or completed. - // -extern "C" void AfsAdmSvrCallback_Action (LPASACTION pAction, BOOL fFinished) -{ - NotifyActionListeners (pAction, fFinished); -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClient.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrClient.h deleted file mode 100644 index c271333b1..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClient.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCLIENT_H -#define TAAFSADMSVRCLIENT_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#include - -#ifndef ADMINAPI -#ifdef WIN32 -#define ADMINAPI __cdecl -#else -#define ADMINAPI -#endif -#endif - - // You can use asc_ObjectListen() to specify that you want a - // particular window to receive a message whenever there is a - // change to a given object's properties. Changes will automatically - // be detected when the server performs its periodic refresh, - // or will be detected whenever an explicit asc_ObjectRefresh() - // call is made. - // -#define WM_ASC_NOTIFY_OBJECT (WM_USER + 0x300) // lp=object ASID - - // You can use asc_ActionListen() to specify that you want a - // particular window to receive a message whenever an action - // is initiated or completed on the server. - // -#define WM_ASC_NOTIFY_ACTION (WM_USER + 0x301) // wp=fEnd, lp=action ASID - - -/* - * DATA STRUCTURES ____________________________________________________________ - * - */ - -BOOL ADMINAPI asc_AsidListCreate (LPASIDLIST *ppList); -BOOL ADMINAPI asc_AsidListCopy (LPASIDLIST *ppListTarget, LPASIDLIST *ppListSource); -BOOL ADMINAPI asc_AsidListAddEntry (LPASIDLIST *ppList, ASID idObject, LPARAM lp); -BOOL ADMINAPI asc_AsidListRemoveEntry (LPASIDLIST *ppList, ASID idObject); -BOOL ADMINAPI asc_AsidListRemoveEntryByIndex (LPASIDLIST *ppList, size_t iIndex); -BOOL ADMINAPI asc_AsidListSetEntryParam (LPASIDLIST *ppList, ASID idObject, LPARAM lp); -BOOL ADMINAPI asc_AsidListSetEntryParamByIndex (LPASIDLIST *ppList, size_t iIndex, LPARAM lp); -BOOL ADMINAPI asc_AsidListTest (LPASIDLIST *ppList, ASID idObject, LPARAM *pParam = NULL); -BOOL ADMINAPI asc_AsidListFree (LPASIDLIST *ppList); - -BOOL ADMINAPI asc_ObjPropListCreate (LPASOBJPROPLIST *ppList); -BOOL ADMINAPI asc_ObjPropListCopy (LPASOBJPROPLIST *ppListTarget, LPASOBJPROPLIST *ppListSource); -BOOL ADMINAPI asc_ObjPropListAddEntry (LPASOBJPROPLIST *ppList, LPASOBJPROP pProperties, LPARAM lp); -BOOL ADMINAPI asc_ObjPropListRemoveEntry (LPASOBJPROPLIST *ppList, ASID idObject); -BOOL ADMINAPI asc_ObjPropListTest (LPASOBJPROPLIST *ppList, ASID idObject, LPASOBJPROP pProperties = NULL, LPARAM *pParam = NULL); -BOOL ADMINAPI asc_ObjPropListFree (LPASOBJPROPLIST *ppList); - -BOOL ADMINAPI asc_ActionListCreate (LPASACTIONLIST *ppList); -BOOL ADMINAPI asc_ActionListCopy (LPASACTIONLIST *ppListTarget, LPASACTIONLIST *ppListSource); -BOOL ADMINAPI asc_ActionListAddEntry (LPASACTIONLIST *ppList, LPASACTION pAction); -BOOL ADMINAPI asc_ActionListRemoveEntry (LPASACTIONLIST *ppList, DWORD idAction); -BOOL ADMINAPI asc_ActionListTest (LPASACTIONLIST *ppList, DWORD idAction, LPASACTION pAction = NULL); -BOOL ADMINAPI asc_ActionListFree (LPASACTIONLIST *ppList); - - -/* - * GENERAL PROTOTYPES _________________________________________________________ - * - */ - -BOOL ADMINAPI asc_AdminServerOpen (LPCTSTR pszAddress, DWORD *pidClient, ULONG *pStatus); -BOOL ADMINAPI asc_AdminServerClose (DWORD idClient, ULONG *pStatus); - -BOOL ADMINAPI asc_CredentialsCrack (DWORD idClient, PVOID hCreds, LPTSTR pszCell, LPTSTR pszUser, SYSTEMTIME *pstExpiration, ULONG *pStatus); -PVOID ADMINAPI asc_CredentialsGet (DWORD idClient, LPCTSTR pszCell, ULONG *pStatus); -PVOID ADMINAPI asc_CredentialsSet (DWORD idClient, LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus); -BOOL ADMINAPI asc_CredentialsPush (DWORD idClient, PVOID hCreds, ASID idCel, ULONG *pStatus); - -BOOL ADMINAPI asc_LocalCellGet (DWORD idClient, LPTSTR pszCell, ULONG *pStatus); -BOOL ADMINAPI asc_ErrorCodeTranslate (DWORD idClient, ULONG code, LANGID idLanguage, STRING pszErrorText, ULONG *pStatus); - -BOOL ADMINAPI asc_CellOpen (DWORD idClient, PVOID hCreds, LPCTSTR pszCell, DWORD dwScope, ASID *pidCell, ULONG *pStatus); -BOOL ADMINAPI asc_CellClose (DWORD idClient, ASID idCell, ULONG *pStatus); -BOOL ADMINAPI asc_CellChange (DWORD idClient, ASID idCell, LPAFSADMSVR_CHANGECELL_PARAMS pChange, ULONG *pStatus); -BOOL ADMINAPI asc_CellRefreshRateSet (DWORD idClient, ASID idCell, ULONG cminRefreshRate, ULONG *pStatus); - -BOOL ADMINAPI asc_ObjectFind (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszName, ASID *pidObject, ULONG *pStatus); -BOOL ADMINAPI asc_ObjectFindMultiple (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszPattern, LPAFSADMSVR_SEARCH_PARAMS pSearchParams, LPASIDLIST *ppList, ULONG *pStatus); -BOOL ADMINAPI asc_ObjectPropertiesGet (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus); -BOOL ADMINAPI asc_ObjectPropertiesGetMultiple (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, LPASIDLIST pAsidList, LPASOBJPROPLIST *ppPropertiesList, ULONG *pStatus); - -BOOL ADMINAPI asc_ObjectRefresh (DWORD idClient, ASID idCell, ASID idObject, ULONG *pStatus); -BOOL ADMINAPI asc_ObjectRefreshMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, ULONG *pStatus); - -BOOL ADMINAPI asc_RandomKeyGet (DWORD idClient, ASID idCell, PBYTE key, ULONG *pStatus); - -BOOL ADMINAPI asc_CellNameGet_Fast (DWORD idClient, ASID idCell, LPTSTR pszCell, ULONG *pStatus = NULL); -BOOL ADMINAPI asc_ObjectNameGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPTSTR pszObjectName, ULONG *pStatus = NULL); -BOOL ADMINAPI asc_ObjectTypeGet_Fast (DWORD idClient, ASID idCell, ASID idObject, ASOBJTYPE *pObjectType, ULONG *pStatus = NULL); -BOOL ADMINAPI asc_ObjectPropertiesGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus = NULL); - -void ADMINAPI asc_Enter (void); -void ADMINAPI asc_Leave (void); -LPCRITICAL_SECTION ADMINAPI asc_GetCriticalSection (void); - - -/* - * NOTIFICATIONS ______________________________________________________________ - * - */ - -BOOL ADMINAPI asc_ObjectListen (DWORD idClient, ASID idCell, ASID idObject, HWND hNotify, ULONG *pStatus); -BOOL ADMINAPI asc_ObjectListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus); -BOOL ADMINAPI asc_ObjectListenMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, HWND hNotify, ULONG *pStatus); - -BOOL ADMINAPI asc_ActionGet (DWORD idClient, DWORD idAction, LPASACTION pAction, ULONG *pStatus); -BOOL ADMINAPI asc_ActionGetMultiple (DWORD idClient, DWORD idClientSearch, ASID idCellSearch, LPASACTIONLIST *ppList, ULONG *pStatus); -BOOL ADMINAPI asc_ActionListen (DWORD idClient, HWND hNotify, ULONG *pStatus); -BOOL ADMINAPI asc_ActionListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus); - - -/* - * USER-ACCOUNT PROTOTYPES ____________________________________________________ - * - */ - -BOOL ADMINAPI asc_UserChange (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_CHANGEUSER_PARAMS pChange, ULONG *pStatus); -BOOL ADMINAPI asc_UserPasswordSet (DWORD idClient, ASID idCell, ASID idUser, int keyVersion, LPCTSTR pkeyString, PBYTE pkeyData, ULONG *pStatus); -BOOL ADMINAPI asc_UserUnlock (DWORD idClient, ASID idCell, ASID idUser, ULONG *pStatus); -BOOL ADMINAPI asc_UserCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEUSER_PARAMS pCreate, ASID *pidUser, ULONG *pStatus); -BOOL ADMINAPI asc_UserDelete (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_DELETEUSER_PARAMS pDelete, ULONG *pStatus); - - -/* - * GROUP-ACCOUNT PROTOTYPES ___________________________________________________ - * - */ - -BOOL ADMINAPI asc_GroupChange (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus); -BOOL ADMINAPI asc_GroupMembersGet (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus); -BOOL ADMINAPI asc_GroupMemberAdd (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus); -BOOL ADMINAPI asc_GroupMemberRemove (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus); -BOOL ADMINAPI asc_GroupRename (DWORD idClient, ASID idCell, ASID idGroup, LPCTSTR pszNewName, ULONG *pStatus); -BOOL ADMINAPI asc_GroupMembershipGet (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus); -BOOL ADMINAPI asc_GroupOwnershipGet (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus); -BOOL ADMINAPI asc_GroupCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus); -BOOL ADMINAPI asc_GroupDelete (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus); - - -#endif // TAAFSADMSVRCLIENT_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.cpp deleted file mode 100644 index ff1db0e76..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" - -extern "C" { -#include -} // extern "C" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cmsecLOCAL_BIND_TIMEOUT (15L * 1000L) // wait up to 15 seconds to bind -#define cmsecLOCAL_BIND_SLEEP (1L * 1000L) // sleep for a second between - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL ValidateBinding (RPC_NS_HANDLE hBind, DWORD *pidClient, ULONG *pStatus); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL ADMINAPI BindToAdminServer (LPCTSTR pszAddress, BOOL fWait, DWORD *pidClient, ULONG *pStatus) -{ - RPC_STATUS status = 0; - - unsigned char *pszPROTOCOL = (unsigned char *)"ncacn_ip_tcp"; - unsigned char *pszENTRYNAME = (unsigned char *)AFSADMSVR_ENTRYNAME_DEFAULT; - unsigned char szEndpoint[ 32 ]; - wsprintf ((LPTSTR)szEndpoint, "%lu", AFSADMSVR_ENDPOINT_DEFAULT); - - for (DWORD dwTickStart = GetTickCount(); ; ) - { - // First we'll enumerate the name services around here to see if - // an admin server is already running. - // - RPC_NS_HANDLE hEnum; - if ((status = RpcNsBindingImportBegin (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_c_ifspec, NULL, &hEnum)) == 0) - { - RPC_BINDING_HANDLE hBind; - status = RpcNsBindingImportNext (hEnum, &hBind); - RpcNsBindingImportDone (&hEnum); - - if (status) - RpcBindingFree (&hBind); - else if (ValidateBinding (hBind, pidClient, (ULONG*)&status)) - return TRUE; - else if (status != RPC_S_CALL_FAILED_DNE) // server rejected us! - break; - } - - // Failing that, we'll try to bind to the well-known endpoint that the - // admin server may have had to use. (if RpcNsBindingExport failed.) - // - unsigned char *pszStringBinding = NULL; - if ((status = RpcStringBindingCompose (NULL, pszPROTOCOL, (unsigned char *)pszAddress, szEndpoint, NULL, &pszStringBinding)) == 0) - { - RPC_BINDING_HANDLE hBind; - status = RpcBindingFromStringBinding (pszStringBinding, &hBind); - RpcStringFree (&pszStringBinding); - - if (status) - RpcBindingFree (&hBind); - else if (ValidateBinding (hBind, pidClient, (ULONG*)&status)) - return TRUE; - else if (status != RPC_S_CALL_FAILED_DNE) // server rejected us! - break; - } - - // If we can't wait any longer, fail. Otherwise, sleep for a little bit - // and try again. - // - if ((!fWait) || (GetTickCount() - dwTickStart > cmsecLOCAL_BIND_TIMEOUT)) - break; - - Sleep (cmsecLOCAL_BIND_SLEEP); - } - - if (pStatus) - *pStatus = (LONG)status; - return FALSE; -} - - -BOOL ADMINAPI UnbindFromAdminServer (DWORD idClient, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - ULONG status; - AfsAdmSvr_Disconnect (idClient, &status); - } - RpcExcept(1) - ; - RpcEndExcept - - if ((status = RpcBindingFree (&hBindTaAfsAdminSvr)) != 0) - rc = FALSE; - - if (!rc && pStatus) - *pStatus = (LONG)status; - return rc; -} - - -BOOL ADMINAPI ForkNewAdminServer (ULONG *pStatus) -{ - // Before we can fork a new process, we have to find the program to run. - // - TCHAR szFile[ MAX_PATH ]; - GetModuleFileName (GetModuleHandle(NULL), szFile, MAX_PATH); - - LPTSTR pch; - if ((pch = (LPTSTR)lstrrchr (szFile, TEXT('\\'))) != NULL) - *(1+pch) = TEXT('\0'); - lstrcat (szFile, AFSADMSVR_PROGRAM); - - if (GetFileAttributes (szFile) == (DWORD)0xFFFFFFFF) - { - lstrcpy (szFile, AFSADMSVR_PROGRAM); // hope it's on the path - } - - // Try to launch the program. Error codes are returns <= 32. - // Remember to add the "Timed" keyword, so it will shut itself down - // if it's idle too long, and the "Manual" keyword so it won't automatically - // start opening a cell and looking around. - // - wsprintf (&szFile[ lstrlen(szFile) ], TEXT(" %s %s"), AFSADMSVR_KEYWORD_TIMED, AFSADMSVR_KEYWORD_MANUAL); - - UINT hInst; - if ((hInst = WinExec (szFile, SW_HIDE)) <= 32) - { - if (pStatus) - *pStatus = (DWORD)hInst; - return FALSE; - } - - return TRUE; -} - - -BOOL ValidateBinding (RPC_NS_HANDLE hBind, DWORD *pidClient, ULONG *pStatus) -{ - RPC_NS_HANDLE hBindOld = hBindTaAfsAdminSvr; - BOOL rc = FALSE; - ULONG status = RPC_S_CALL_FAILED_DNE; - - hBindTaAfsAdminSvr = hBind; - - RpcTryExcept - { - STRING szMyName; - gethostname (szMyName, cchSTRING); - - rc = AfsAdmSvr_Connect (szMyName, pidClient, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc) - hBindTaAfsAdminSvr = hBindOld; - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -LPCTSTR ADMINAPI ResolveAddress (LPCTSTR pszAddress) -{ - if (!pszAddress || !*pszAddress) - return NULL; - - // The caller may have specified an IP address or a server name. - // If the former, we're done; if the latter, we'll have to look up - // the server's IP address. - // - if ((*pszAddress >= TEXT('0')) && (*pszAddress <= TEXT('9'))) - return pszAddress; - - HOSTENT *pEntry; - if ((pEntry = gethostbyname (pszAddress)) == NULL) - return pszAddress; // we'll try it by name, but it probly won't work. - - try { - static TCHAR szResolved[ 1024 ]; - lstrcpy (szResolved, inet_ntoa (*(struct in_addr *)pEntry->h_addr)); - return szResolved; - } catch (...) { - return pszAddress; // we'll try it by name, but it probly won't work. - } -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.h deleted file mode 100644 index dd3da05dc..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientBind.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCLIENTBIND_H -#define TAAFSADMSVRCLIENTBIND_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL ADMINAPI BindToAdminServer (LPCTSTR pszAddress, BOOL fWait, DWORD *pidClient, ULONG *pStatus); -BOOL ADMINAPI UnbindFromAdminServer (DWORD idClient, ULONG *pStatus); -BOOL ADMINAPI ForkNewAdminServer (ULONG *pStatus); - -LPCTSTR ADMINAPI ResolveAddress (LPCTSTR pszAddress); - - -#endif // TAAFSADMSVRCLIENTBIND_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.cpp deleted file mode 100644 index c7cc97a72..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - ASID idCell; - LPHASHLIST pCache; - LPHASHLISTKEY pCacheKeyAsid; - DWORD cReqCache; - } CELLCACHE, *LPCELLCACHE; - -static struct - { - LPHASHLIST pCells; - LPHASHLISTKEY pCellsKeyAsid; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK CacheKeyAsid_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); -HASHVALUE CALLBACK CacheKeyAsid_HashObject (LPHASHLISTKEY pKey, PVOID pObject); -HASHVALUE CALLBACK CacheKeyAsid_HashData (LPHASHLISTKEY pKey, PVOID pData); - -BOOL CALLBACK CellsKeyAsid_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); -HASHVALUE CALLBACK CellsKeyAsid_HashObject (LPHASHLISTKEY pKey, PVOID pObject); -HASHVALUE CALLBACK CellsKeyAsid_HashData (LPHASHLISTKEY pKey, PVOID pData); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPCELLCACHE GetCellCache (ASID idCell) -{ - if (!l.pCells) - return NULL; - - return (LPCELLCACHE)(l.pCellsKeyAsid->GetFirstObject (&idCell)); -} - - -BOOL CreateCellCache (ASID idCell) -{ - asc_Enter(); - - if (!l.pCells) - { - l.pCells = New (HASHLIST); - l.pCells->SetCriticalSection (asc_GetCriticalSection()); - l.pCellsKeyAsid = l.pCells->CreateKey (TEXT("ASID"), CellsKeyAsid_Compare, CellsKeyAsid_HashObject, CellsKeyAsid_HashData); - } - - LPCELLCACHE pcc; - if ((pcc = GetCellCache (idCell)) == NULL) - { - pcc = New (CELLCACHE); - memset (pcc, 0x00, sizeof(CELLCACHE)); - pcc->idCell = idCell; - pcc->pCache = New (HASHLIST); - pcc->pCache->SetCriticalSection (asc_GetCriticalSection()); - pcc->pCacheKeyAsid = pcc->pCache->CreateKey (TEXT("ASID"), CacheKeyAsid_Compare, CacheKeyAsid_HashObject, CacheKeyAsid_HashData); - l.pCells->Add (pcc); - } - pcc->cReqCache ++; - - asc_Leave(); - return TRUE; -} - - -BOOL DestroyCellCache (ASID idCell) -{ - asc_Enter(); - - LPCELLCACHE pcc; - if ((pcc = GetCellCache (idCell)) == NULL) - { - asc_Leave(); - return FALSE; - } - - if (!pcc->cReqCache || !(--(pcc->cReqCache))) - { - if (pcc->pCache) - { - for (LPENUM pEnum = pcc->pCache->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPASOBJPROP pProp = (LPASOBJPROP)( pEnum->GetObject() ); - pcc->pCache->Remove (pProp); - Delete (pProp); - } - - Delete (pcc->pCache); - } - - l.pCells->Remove (pcc); - Delete (pcc); - } - - asc_Leave(); - return TRUE; -} - - -LPASOBJPROP GetCachedProperties (ASID idCell, ASID idObject) -{ - LPASOBJPROP pCachedProperties = NULL; - asc_Enter(); - - LPCELLCACHE pcc; - if ((pcc = GetCellCache (idCell)) != NULL) - { - pCachedProperties = (LPASOBJPROP)(pcc->pCacheKeyAsid->GetFirstObject (&idObject)); - } - - asc_Leave(); - return pCachedProperties; -} - - -void UpdateCachedProperties (ASID idCell, ASID idObject, LPASOBJPROP pProperties) -{ - if (pProperties) - { - asc_Enter(); - - LPCELLCACHE pcc; - if ((pcc = GetCellCache (idCell)) != NULL) - { - LPASOBJPROP pCachedProperties; - if ((pCachedProperties = (LPASOBJPROP)(pcc->pCacheKeyAsid->GetFirstObject (&idObject))) == NULL) - { - pCachedProperties = New (ASOBJPROP); - memcpy (pCachedProperties, pProperties, sizeof(ASOBJPROP)); - pcc->pCache->Add (pCachedProperties); - } - else // Just update? - { - memcpy (pCachedProperties, pProperties, sizeof(ASOBJPROP)); - // Note: don't need to call pcc->pCache->Update(), because - // we haven't affected any indices (the old and new ASOBJPROP - // structures should have the same ASID) - } - } - - NotifyObjectListeners (idCell, idObject); - asc_Leave(); - } -} - - -BOOL RefreshCachedProperties (DWORD idClient, ASID idCell, ASID idObject, AFSADMSVR_GET_LEVEL GetLevel, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - LPASOBJPROP pProperties = GetCachedProperties (idCell, idObject); - DWORD verProperties = (pProperties) ? (pProperties->verProperties) : verPROP_NO_OBJECT; - - ASOBJPROP NewProperties; - if ((rc = AfsAdmSvr_GetObject (idClient, RETURN_IF_OUT_OF_DATE, GetLevel, idObject, verProperties, &NewProperties, &status)) != FALSE) - { - if (NewProperties.idObject == idObject) - { - UpdateCachedProperties (idCell, idObject, &NewProperties); - } - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL RefreshCachedProperties (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, AFSADMSVR_GET_LEVEL GetLevel, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (pAsidList->cEntries) - { - RpcTryExcept - { - for (size_t iObject = 0; iObject < pAsidList->cEntries; ++iObject) - { - LPASOBJPROP pProperties = GetCachedProperties (idCell, pAsidList->aEntries[ iObject ].idObject); - pAsidList->aEntries[ iObject ].lParam = (pProperties) ? (pProperties->verProperties) : verPROP_NO_OBJECT; - } - - LPASOBJPROPLIST pNewProperties = NULL; - if ((rc = AfsAdmSvr_GetObjects (idClient, RETURN_IF_OUT_OF_DATE, GetLevel, pAsidList, &pNewProperties, &status)) != FALSE) - { - if (pNewProperties) - { - for (size_t iObject = 0; iObject < pNewProperties->cEntries; ++iObject) - { - UpdateCachedProperties (idCell, pNewProperties->aEntries[ iObject ].ObjectProperties.idObject, &pNewProperties->aEntries[ iObject ].ObjectProperties); - } - AfsAdmSvr_FreeObjPropList (&pNewProperties); - } - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -/* - * HASHLIST KEYS ______________________________________________________________ - * - */ - -BOOL CALLBACK CacheKeyAsid_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return (((LPASOBJPROP)pObject)->idObject == *(ASID*)pData); -} - -HASHVALUE CALLBACK CacheKeyAsid_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return CacheKeyAsid_HashData (pKey, &((LPASOBJPROP)pObject)->idObject); -} - -HASHVALUE CALLBACK CacheKeyAsid_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)*(ASID*)pData; -} - - -BOOL CALLBACK CellsKeyAsid_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return (((LPCELLCACHE)pObject)->idCell == *(ASID*)pData); -} - -HASHVALUE CALLBACK CellsKeyAsid_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return CellsKeyAsid_HashData (pKey, &((LPCELLCACHE)pObject)->idCell); -} - -HASHVALUE CALLBACK CellsKeyAsid_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)*(ASID*)pData; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.h deleted file mode 100644 index 571582f50..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCache.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCLIENTCACHE_H -#define TAAFSADMSVRCLIENTCACHE_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CreateCellCache (ASID idCell); -BOOL DestroyCellCache (ASID idCell); - -LPASOBJPROP GetCachedProperties (ASID idCell, ASID idObject); - -BOOL RefreshCachedProperties (DWORD idClient, ASID idCell, ASID idObject, AFSADMSVR_GET_LEVEL GetLevel, ULONG *pStatus); -BOOL RefreshCachedProperties (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, AFSADMSVR_GET_LEVEL GetLevel, ULONG *pStatus); - - -#endif // TAAFSADMSVRCLIENTCACHE_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCell.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCell.cpp deleted file mode 100644 index 27aeeb41f..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientCell.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL ADMINAPI asc_CellChange (DWORD idClient, ASID idCell, LPAFSADMSVR_CHANGECELL_PARAMS pChange, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_ChangeCell (idClient, idCell, pChange, &status)) != FALSE) - { - // If we succeeded in changing this cell's properties, get the - // newest values for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idCell, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_CellRefreshRateSet (DWORD idClient, ASID idCell, ULONG cminRefreshRate, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_SetRefreshRate (idClient, idCell, cminRefreshRate, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientGroup.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientGroup.cpp deleted file mode 100644 index ea8addf0b..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientGroup.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL ADMINAPI asc_GroupChange (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_ChangeGroup (idClient, idCell, idGroup, pChange, &status)) != FALSE) - { - // If we succeeded in changing this group's properties, get the - // newest values for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idGroup, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupMembersGet (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_GetGroupMembers (idClient, idCell, idGroup, ppAsidList, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupMemberAdd (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_AddGroupMember (idClient, idCell, idGroup, idMember, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupMemberRemove (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_RemoveGroupMember (idClient, idCell, idGroup, idMember, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupRename (DWORD idClient, ASID idCell, ASID idGroup, LPCTSTR pszNewName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - STRING szNewName = TEXT(""); - if (pszNewName) - lstrcpy (szNewName, pszNewName); - if ((rc = AfsAdmSvr_RenameGroup (idClient, idCell, idGroup, szNewName, &status)) == TRUE) - { - // If we succeeded in changing this group's name, get the - // newest group properties for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idGroup, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupMembershipGet (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_GetGroupMembership (idClient, idCell, idMember, ppAsidList, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupOwnershipGet (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - rc = AfsAdmSvr_GetGroupOwnership (idClient, idCell, idOwner, ppAsidList, &status); - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_CreateGroup (idClient, idCell, pCreate, pidGroup, &status)) == TRUE) - { - // If we succeeded in creating this group, get the - // initial group properties for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, *pidGroup, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_GroupDelete (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_DeleteGroup (idClient, idCell, idGroup, &status)) == TRUE) - { - // If we succeeded in deleting this group, clean up our cache. - // Expect this call to fail (the group's deleted, right?) - // - ASOBJPROP Properties; - ULONG dummy; - (void)asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idGroup, &Properties, &dummy); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.cpp deleted file mode 100644 index 0955c327b..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct - { - LPCRITICAL_SECTION pcs; - } l; - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void ADMINAPI asc_Enter (void) -{ - if (!l.pcs) - { - l.pcs = New (CRITICAL_SECTION); - InitializeCriticalSection (l.pcs); - } - EnterCriticalSection (l.pcs); -} - - -void ADMINAPI asc_Leave (void) -{ - LeaveCriticalSection (l.pcs); -} - - -LPCRITICAL_SECTION ADMINAPI asc_GetCriticalSection (void) -{ - if (!l.pcs) - { - l.pcs = New (CRITICAL_SECTION); - InitializeCriticalSection (l.pcs); - } - return l.pcs; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.h deleted file mode 100644 index 3f4cae28e..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientInternal.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCLIENTINTERNAL_H -#define TAAFSADMSVRCLIENTINTERNAL_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include -#include "TaAfsAdmSvrClientBind.h" -#include "TaAfsAdmSvrClientCache.h" -#include "TaAfsAdmSvrClientNotify.h" -#include "TaAfsAdmSvrClientPing.h" - - -#endif // TAAFSADMSVRCLIENTINTERNAL_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.cpp deleted file mode 100644 index 46c33f03f..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - ASID idCell; - ASID idObject; - HWND hNotify; - } LISTENER, *LPLISTENER; - -static struct - { - LPHASHLIST pListeners; - LPHASHLISTKEY pListenersKeyObject; - - HWND *ahActionListeners; - size_t chActionListeners; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK ListenersKeyObject_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); -HASHVALUE CALLBACK ListenersKeyObject_HashObject (LPHASHLISTKEY pKey, PVOID pObject); -HASHVALUE CALLBACK ListenersKeyObject_HashData (LPHASHLISTKEY pKey, PVOID pData); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL AddObjectNotification (HWND hNotify, ASID idCell, ASID idObject) -{ - asc_Enter(); - - if (!l.pListeners) - { - l.pListeners = New (HASHLIST); - l.pListenersKeyObject = l.pListeners->CreateKey (TEXT("idObject"), ListenersKeyObject_Compare, ListenersKeyObject_HashObject, ListenersKeyObject_HashData); - } - - LPLISTENER pl = New (LISTENER); - pl->idCell = idCell; - pl->idObject = idObject; - pl->hNotify = hNotify; - l.pListeners->Add (pl); - - asc_Leave(); - return TRUE; -} - - -void ClearObjectNotifications (HWND hNotify) -{ - asc_Enter(); - - if (l.pListeners) - { - for (LPENUM pEnum = l.pListeners->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPLISTENER pl = (LPLISTENER)( pEnum->GetObject() ); - if (pl->hNotify == hNotify) - { - l.pListeners->Remove (pl); - Delete (pl); - } - } - } - - asc_Leave(); -} - - -void TestForNotifications (DWORD idClient, ASID idCell, ASID idObject) -{ - if (l.pListeners) - { - // First we'll zip through our list of listeners and - // build an ASIDLIST reflecting the objects in this cell - // for which we're listening. - // - LPASIDLIST pAsidList = NULL; - for (LPENUM pEnum = l.pListeners->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPLISTENER pl = (LPLISTENER)( pEnum->GetObject() ); - if (pl->idCell != idCell) - continue; - if (idObject && (pl->idObject != idObject)) - continue; - - if (!pAsidList) - { - if (!asc_AsidListCreate (&pAsidList)) - break; - } - if (!asc_AsidListAddEntry (&pAsidList, pl->idObject, 0)) - break; - } - - // Then we'll call one of our cache routines, which in turn will tell - // the admin server what version of the properties we have for each - // of these objects; if any have newer properties available, we'll - // get them back--and that will cause us to send out notifications to - // our listeners. - // - if (pAsidList) - { - ULONG status; - (void)RefreshCachedProperties (idClient, idCell, pAsidList, GET_ALL_DATA, &status); - } - } -} - - -void NotifyObjectListeners (ASID idCell, ASID idObject) -{ - // If we get here, our cache of information for the specified object - // has just been updated. Check for listeners who may be interested - // in changes to this object. - // - if (l.pListeners) - { - for (LPENUM pEnum = l.pListenersKeyObject->FindFirst (&idObject); pEnum; pEnum = pEnum->FindNext()) - { - LPLISTENER pl = (LPLISTENER)( pEnum->GetObject() ); - if (pl->idCell != idCell) - continue; - - if (!IsWindow (pl->hNotify)) - { - l.pListeners->Remove (pl); - Delete (pl); - continue; - } - - PostMessage (pl->hNotify, WM_ASC_NOTIFY_OBJECT, (WPARAM)0, (LPARAM)idObject); - } - } -} - - -/* - * HASHLIST KEYS ______________________________________________________________ - * - */ - -BOOL CALLBACK ListenersKeyObject_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return (((LPLISTENER)pObject)->idObject == *(ASID*)pData) ? TRUE : FALSE; -} - -HASHVALUE CALLBACK ListenersKeyObject_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return ListenersKeyObject_HashData (pKey, &((LPLISTENER)pObject)->idObject); -} - -HASHVALUE CALLBACK ListenersKeyObject_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)*(ASID*)pData; -} - - - -/* - * ACTION NOTIFICATIONS _______________________________________________________ - * - */ - -BOOL SetActionNotification (HWND hNotify, BOOL fSet) -{ - BOOL rc = TRUE; - asc_Enter(); - - if (!fSet) - { - for (size_t ii = 0; ii < l.chActionListeners; ++ii) - { - if (l.ahActionListeners[ ii ] == hNotify) - l.ahActionListeners[ ii ] = NULL; - } - } - else // (fSet) - { - for (size_t ii = 0; ii < l.chActionListeners; ++ii) - { - if (l.ahActionListeners[ ii ] == NULL) - break; - } - if (!REALLOC (l.ahActionListeners, l.chActionListeners, 1+ii, 1)) - { - rc = FALSE; - } - else - { - l.ahActionListeners[ ii ] = hNotify; - } - } - - asc_Leave(); - return rc; -} - - -void NotifyActionListeners (LPASACTION pAction, BOOL fFinished) -{ - asc_Enter(); - - for (size_t ii = 0; ii < l.chActionListeners; ++ii) - { - if (IsWindow (l.ahActionListeners[ ii ])) - { - LPASACTION pActionPost = New (ASACTION); - memcpy (pActionPost, pAction, sizeof(ASACTION)); - PostMessage (l.ahActionListeners[ ii ], WM_ASC_NOTIFY_ACTION, (WPARAM)fFinished, (LPARAM)pActionPost); - } - } - - asc_Leave(); -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.h deleted file mode 100644 index 1f2aa70cd..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientNotify.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCLIENTNOTIFY_H -#define TAAFSADMSVRCLIENTNOTIFY_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL AddObjectNotification (HWND hNotify, ASID idCell, ASID idObject); -void ClearObjectNotifications (HWND hNotify); -void TestForNotifications (DWORD idClient, ASID idCell, ASID idObject = 0); -void NotifyObjectListeners (ASID idCell, ASID idObject); - -BOOL SetActionNotification (HWND hNotify, BOOL fSet); -void NotifyActionListeners (LPASACTION pAction, BOOL fFinished); - - -#endif // TAAFSADMSVRCLIENTNOTIFY_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.cpp deleted file mode 100644 index 4bd00313a..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct - { - HANDLE hPingThread; - DWORD *adwClients; - size_t cdwClients; - - HANDLE hCallbackThread; - size_t cReqCallback; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -DWORD WINAPI ClientPingThread (LPVOID lp); - -DWORD WINAPI ClientCallbackThread (LPVOID lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void StartPingThread (DWORD idClient) -{ - asc_Enter(); - - for (size_t ii = 0; ii < l.cdwClients; ++ii) - { - if (!l.adwClients[ ii ]) - break; - } - if (REALLOC (l.adwClients, l.cdwClients, 1+ii, 1)) - { - l.adwClients[ ii ] = idClient; - } - - if (!l.hPingThread) - { - DWORD dwThreadID; - l.hPingThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ClientPingThread, (LPVOID)0, 0, &dwThreadID); - } - - asc_Leave(); -} - - -void StopPingThread (DWORD idClient) -{ - asc_Enter(); - - for (size_t ii = 0; ii < l.cdwClients; ++ii) - { - if (l.adwClients[ ii ] == idClient) - l.adwClients[ ii ] = 0; - } - - asc_Leave(); -} - - -DWORD WINAPI ClientPingThread (LPVOID lp) -{ - for (;;) - { - Sleep (csecAFSADMSVR_CLIENT_PING * 1000L); // server adds race allowance - - asc_Enter(); - - for (size_t ii = 0; ii < l.cdwClients; ++ii) - { - DWORD idClient; - if ((idClient = l.adwClients[ ii ]) == 0) - continue; - - asc_Leave(); - - RpcTryExcept - { - ULONG status; - if (!AfsAdmSvr_Ping (idClient, &status)) - { - if (status == ERROR_INVALID_HANDLE) // we've been disconnected! - StopPingThread (idClient); - } - } - RpcExcept(1) - ; - RpcEndExcept - - asc_Enter(); - } - - asc_Leave(); - } - - l.hPingThread = NULL; - return 0; -} - - -void StartCallbackThread (void) -{ - asc_Enter(); - if ((++l.cReqCallback) == 1) - { - DWORD dwThreadID; - l.hCallbackThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ClientCallbackThread, (LPVOID)0, 0, &dwThreadID); - } - asc_Leave(); -} - - -void StopCallbackThread (void) -{ - asc_Enter(); - if (!(l.cReqCallback) || !(--l.cReqCallback)) - { - if (l.hCallbackThread) - { - TerminateThread (l.hCallbackThread, 0); - l.hCallbackThread = NULL; - } - } - asc_Leave(); -} - - -DWORD WINAPI ClientCallbackThread (LPVOID lp) -{ - // The callback thread's task is simple: it initiates a particular - // RPC, which never returns. (Well, actually, it will return if the - // server shuts down.) By leaving a thread active, the server has a - // context in which to perform callback calls. - // - RpcTryExcept - { - AfsAdmSvr_CallbackHost(); - } - RpcExcept(1) - ; - RpcEndExcept - - l.hCallbackThread = NULL; - return 0; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.h deleted file mode 100644 index 176c65a87..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientPing.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCLIENTPING_H -#define TAAFSADMSVRCLIENTPING_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void StartPingThread (DWORD idClient); -void StopPingThread (DWORD idClient); - -void StartCallbackThread (void); -void StopCallbackThread (void); - - -#endif // TAAFSADMSVRCLIENTPING_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientUser.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrClientUser.cpp deleted file mode 100644 index f318fe0ca..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrClientUser.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrClientInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL ADMINAPI asc_UserChange (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_CHANGEUSER_PARAMS pChange, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_ChangeUser (idClient, idCell, idUser, pChange, &status)) != FALSE) - { - // If we succeeded in changing this user's properties, get the - // newest values for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_UserPasswordSet (DWORD idClient, ASID idCell, ASID idUser, int keyVersion, LPCTSTR pkeyString, PBYTE pkeyData, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - BYTE keyData[ ENCRYPTIONKEYLENGTH ]; - if (pkeyData) - memcpy (keyData, pkeyData, sizeof(keyData)); - else - memset (keyData, 0x00, sizeof(keyData)); - - STRING keyString; - if (pkeyString) - lstrcpy (keyString, pkeyString); - else - memset (keyString, 0x00, sizeof(keyString)); - - if ((rc = AfsAdmSvr_SetUserPassword (idClient, idCell, idUser, keyVersion, keyString, keyData, &status)) == TRUE) - { - // If we succeeded in changing this user's password, get the - // newest user properties for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_UserUnlock (DWORD idClient, ASID idCell, ASID idUser, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_UnlockUser (idClient, idCell, idUser, &status)) == TRUE) - { - // If we succeeded in unlocking this user's account, get the - // newest user properties for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_UserCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEUSER_PARAMS pCreate, ASID *pidUser, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_CreateUser (idClient, idCell, pCreate, pidUser, &status)) == TRUE) - { - // If we succeeded in creating this user's account, get the - // initial user properties for our cache. - // - ASOBJPROP Properties; - rc = asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, *pidUser, &Properties, &status); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL ADMINAPI asc_UserDelete (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_DELETEUSER_PARAMS pDelete, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - RpcTryExcept - { - if ((rc = AfsAdmSvr_DeleteUser (idClient, idCell, idUser, pDelete, &status)) == TRUE) - { - // If we succeeded in deleting this user's account, clean up our cache. - // Expect this call to fail (the user's deleted, right?) - // - ASOBJPROP Properties; - ULONG dummy; - (void)asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Properties, &dummy); - } - } - RpcExcept(1) - { - rc = FALSE; - status = RPC_S_CALL_FAILED_DNE; - } - RpcEndExcept - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.cpp deleted file mode 100644 index f755baa3a..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_ASIDLIST 64 - -#define cREALLOC_OBJPROPLIST 32 - -#define cREALLOC_ACTIONLIST 8 - - -/* - * REALLOC ____________________________________________________________________ - * - * This thing, RPC_REALLOC, is a specialized version of the REALLOC() code that - * you'll find in most libraries. It's intended to deal with structures that - * look like this: - * - * typedef struct { - * DWORD dwGarbage1; - * size_t cElements; <- The interesting bit - * DWORD dwGarbage2; - * MYTYPE aElements[1]; <- <- <- The really interesting bit - * } MYSTRUCT; - * - * Remember that since the array is growable, it must be the last element - * in the structure. This thing's called RPC_REALLOC because these growable - * arrays are well-suited for transferring via rpc--just make the aElements - * line in your .IDL file look like: - * - * [size_is(cElements) length_is(cElements)] MYTYPE aElements[*]; - * - * As an example of its use, say we want to fill in element 15: - * - * void FillInElement15 (MYSTRUCT *pStruct, MYTYPE *pNewData) - * { - * int iElement = 15; - * if (RPC_REALLOC (MYSTRUCT, pStruct, aElements, cElements, 1+iElement, cREALLOC_MYSTRUCT)) - * { - * memcpy (&pStruct->aElements[ iElement ], pNewData, sizeof(MYTYPE)); - * } - * } - * - * As always, the "cREALLOC_MYSTRUCT" can be any positive value; it specifies - * the granularity with which the the array will be over-allocated. Note that - * unlike the normal REALLOC() routine, the {aElements} and {cElements} - * parameters are presumed to be members of the specified pointer-to-structure. - * If {*pStruct} is NULL upon entry, it will be allocated and zero-filled. - * - */ - -#define OFFSETOF(_type,_a) (size_t)&(((_type *)0)->_a) -#define RPC_REALLOC(_type,_str,_a,_c,_r,_ci) AfsAdmSvr_ReallocFunction ((PVOID*)&(_str), OFFSETOF(_type,_a), OFFSETOF(_type,_c), sizeof((_str)->_a[0]), (size_t)_r, (size_t)_ci, 0x00) - -BOOL AfsAdmSvr_ReallocFunction (PVOID *ppStructure, size_t cbHeader, size_t iposCount, size_t cbElement, size_t cReq, size_t cInc, BYTE chFill) -{ - // Use cInc to over-estimate how much space is really required; that - // way, allocating space for one element actually allocates space for - // many--so that next time we get here, we won't have to do any work. - // - if (cInc) - cReq = cInc * ( (cReq + cInc - 1) / cInc ); - cReq = max (cReq, 1); - - // See how much space is allocated now. If we have no structure to start - // with, obviously we have no array elements either. - // - size_t cNow = 0; - if (*ppStructure) - cNow = *(size_t *)( ((PBYTE)(*ppStructure)) + iposCount ); - - if (cNow < cReq) - { - // Hmmm... there wasn't enough space. Allocate a new structure. - // - size_t cbAlloc = cbHeader + cbElement * cReq; - PVOID pNewStructure; - if ((pNewStructure = Allocate (cbAlloc)) == NULL) - return FALSE; - - memset (pNewStructure, 0x00, cbHeader); - memset ((PBYTE)pNewStructure + cbHeader, chFill, cbAlloc - cbHeader); - if (*ppStructure) - memcpy (pNewStructure, *ppStructure, cbHeader); - - *(size_t *)( ((PBYTE)pNewStructure) + iposCount ) = cReq; - - // Transfer any information from the old structure's elements - // - if (cNow) - memcpy ((PBYTE)pNewStructure + cbHeader, ((PBYTE)(*ppStructure)) + cbHeader, cNow * cbElement); - - // If there was one, free the old structure - // - if (*ppStructure) - Free (*ppStructure); - *ppStructure = pNewStructure; - } - - return TRUE; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - // ASIDLIST - Managed type for lists of cell objects - // -LPASIDLIST AfsAdmSvr_CreateAsidList (void) -{ - LPASIDLIST pList = NULL; - if (!RPC_REALLOC (ASIDLIST, pList, aEntries, cEntriesAllocated, 0, cREALLOC_ASIDLIST)) - return NULL; - return pList; -} - -LPASIDLIST AfsAdmSvr_CopyAsidList (LPASIDLIST pListSource) -{ - LPASIDLIST pList = NULL; - if (!RPC_REALLOC (ASIDLIST, pList, aEntries, cEntriesAllocated, pListSource->cEntries, cREALLOC_ASIDLIST)) - return NULL; - if (pList->cEntriesAllocated) - memcpy (pList->aEntries, pListSource->aEntries, sizeof(pList->aEntries[0]) * pList->cEntriesAllocated); - pList->cEntries = pListSource->cEntries; - return pList; -} - -BOOL AfsAdmSvr_AddToAsidList (LPASIDLIST *ppList, ASID idObject, LPARAM lp) -{ - if (!ppList || !*ppList) - return FALSE; - - if (!RPC_REALLOC (ASIDLIST, *ppList, aEntries, cEntriesAllocated, (*ppList)->cEntries +1, cREALLOC_ASIDLIST)) - return FALSE; - - (*ppList)->aEntries[ (*ppList)->cEntries ].idObject = idObject; - (*ppList)->aEntries[ (*ppList)->cEntries ].lParam = lp; - (*ppList)->cEntries ++; - return TRUE; -} - -BOOL AfsAdmSvr_RemoveFromAsidList (LPASIDLIST *ppList, ASID idObject) -{ - if (!ppList || !(*ppList) || !(*ppList)->cEntries) - return FALSE; - - BOOL fFound = FALSE; - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ) - { - if ((*ppList)->aEntries[ iEntry ].idObject != idObject) - iEntry ++; - else if ((fFound = AfsAdmSvr_RemoveFromAsidListByIndex (ppList, iEntry)) == FALSE) - break; - } - - return fFound; -} - - -BOOL AfsAdmSvr_RemoveFromAsidListByIndex (LPASIDLIST *ppList, size_t iIndex) -{ - if (iIndex >= (*ppList)->cEntries) - return FALSE; - - if (iIndex < (*ppList)->cEntries -1) - memcpy (&(*ppList)->aEntries[ iIndex ], &(*ppList)->aEntries[ (*ppList)->cEntries-1 ], sizeof((*ppList)->aEntries[0])); - (*ppList)->cEntries --; - return TRUE; -} - - -BOOL AfsAdmSvr_SetAsidListParam (LPASIDLIST *ppList, ASID idObject, LPARAM lp) -{ - BOOL fFound = FALSE; - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ++iEntry) - { - if ((*ppList)->aEntries[ iEntry ].idObject == idObject) - { - (*ppList)->aEntries[ iEntry ].lParam = lp; - fFound = TRUE; - } - } - return fFound; -} - - -BOOL AfsAdmSvr_SetAsidListParamByIndex (LPASIDLIST *ppList, size_t iIndex, LPARAM lp) -{ - if (iIndex >= (*ppList)->cEntries) - return FALSE; - - (*ppList)->aEntries[ iIndex ].lParam = lp; - return TRUE; -} - - -BOOL AfsAdmSvr_IsInAsidList (LPASIDLIST *ppList, ASID idObject, LPARAM *pParam) -{ - if (!ppList || !(*ppList) || !(*ppList)->cEntries) - return FALSE; - - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ++iEntry) - { - if ((*ppList)->aEntries[ iEntry ].idObject == idObject) - { - if (pParam) - *pParam = (*ppList)->aEntries[ iEntry ].lParam; - return TRUE; - } - } - - return FALSE; -} - - -void AfsAdmSvr_FreeAsidList (LPASIDLIST *ppList) -{ - if (ppList && *ppList) - { - Free (*ppList); - (*ppList) = 0; - } -} - - - // ASOBJPROPLIST - Managed type for lists of cell objects - // -LPASOBJPROPLIST AfsAdmSvr_CreateObjPropList (void) -{ - LPASOBJPROPLIST pList = NULL; - if (!RPC_REALLOC (ASOBJPROPLIST, pList, aEntries, cEntriesAllocated, 0, cREALLOC_OBJPROPLIST)) - return NULL; - return pList; -} - -LPASOBJPROPLIST AfsAdmSvr_CopyObjPropList (LPASOBJPROPLIST pListSource) -{ - LPASOBJPROPLIST pList = NULL; - if (!RPC_REALLOC (ASOBJPROPLIST, pList, aEntries, cEntriesAllocated, pListSource->cEntries, cREALLOC_OBJPROPLIST)) - return NULL; - if (pList->cEntriesAllocated) - memcpy (pList->aEntries, pListSource->aEntries, sizeof(pList->aEntries[0]) * pList->cEntriesAllocated); - pList->cEntries = pListSource->cEntries; - return pList; -} - -BOOL AfsAdmSvr_AddToObjPropList (LPASOBJPROPLIST *ppList, LPASOBJPROP pProperties, LPARAM lp) -{ - if (!ppList || !*ppList) - return FALSE; - - if (!RPC_REALLOC (ASOBJPROPLIST, *ppList, aEntries, cEntriesAllocated, (*ppList)->cEntries +1, cREALLOC_OBJPROPLIST)) - return NULL; - - memcpy (&(*ppList)->aEntries[ (*ppList)->cEntries ].ObjectProperties, pProperties, sizeof(ASOBJPROP)); - (*ppList)->aEntries[ (*ppList)->cEntries ].lParam = lp; - (*ppList)->cEntries ++; - return TRUE; -} - -BOOL AfsAdmSvr_RemoveFromObjPropList (LPASOBJPROPLIST *ppList, ASID idObject) -{ - if (!ppList || !(*ppList) || !(*ppList)->cEntries) - return FALSE; - - BOOL fFound = FALSE; - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ) - { - if ((*ppList)->aEntries[ iEntry ].ObjectProperties.idObject != idObject) - iEntry ++; - else - { - fFound = TRUE; - if (iEntry < (*ppList)->cEntries -1) - memcpy (&(*ppList)->aEntries[ iEntry ], &(*ppList)->aEntries[ (*ppList)->cEntries-1 ], sizeof((*ppList)->aEntries[0])); - (*ppList)->cEntries --; - } - } - - return fFound; -} - -BOOL AfsAdmSvr_IsInObjPropList (LPASOBJPROPLIST *ppList, ASID idObject, LPASOBJPROP pProperties, LPARAM *pParam) -{ - if (!ppList || !(*ppList) || !(*ppList)->cEntries) - return FALSE; - - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ++iEntry) - { - if ((*ppList)->aEntries[ iEntry ].ObjectProperties.idObject == idObject) - { - if (pProperties) - memcpy (pProperties, &(*ppList)->aEntries[ iEntry ].ObjectProperties, sizeof(ASOBJPROP)); - if (pParam) - *pParam = (*ppList)->aEntries[ iEntry ].lParam; - return TRUE; - } - } - - return FALSE; -} - -void AfsAdmSvr_FreeObjPropList (LPASOBJPROPLIST *ppList) -{ - if (ppList && *ppList) - { - Free (*ppList); - (*ppList) = 0; - } -} - - - // ASACTIONLIST - Managed type for lists of cell objects - // -LPASACTIONLIST AfsAdmSvr_CreateActionList (void) -{ - LPASACTIONLIST pList = NULL; - if (!RPC_REALLOC (ASACTIONLIST, pList, aEntries, cEntriesAllocated, 0, cREALLOC_ACTIONLIST)) - return NULL; - return pList; -} - -LPASACTIONLIST AfsAdmSvr_CopyActionList (LPASACTIONLIST pListSource) -{ - LPASACTIONLIST pList = NULL; - if (!RPC_REALLOC (ASACTIONLIST, pList, aEntries, cEntriesAllocated, pListSource->cEntries, cREALLOC_ACTIONLIST)) - return NULL; - if (pList->cEntriesAllocated) - memcpy (pList->aEntries, pListSource->aEntries, sizeof(pList->aEntries[0]) * pList->cEntriesAllocated); - pList->cEntries = pListSource->cEntries; - return pList; -} - -BOOL AfsAdmSvr_AddToActionList (LPASACTIONLIST *ppList, LPASACTION pAction) -{ - if (!ppList || !*ppList) - return FALSE; - - if (!RPC_REALLOC (ASACTIONLIST, *ppList, aEntries, cEntriesAllocated, (*ppList)->cEntries +1, cREALLOC_OBJPROPLIST)) - return NULL; - - memcpy (&(*ppList)->aEntries[ (*ppList)->cEntries ].Action, pAction, sizeof(ASACTION)); - (*ppList)->cEntries ++; - return TRUE; -} - -BOOL AfsAdmSvr_RemoveFromActionList (LPASACTIONLIST *ppList, DWORD idAction) -{ - if (!ppList || !(*ppList) || !(*ppList)->cEntries) - return FALSE; - - BOOL fFound = FALSE; - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ) - { - if ((*ppList)->aEntries[ iEntry ].Action.idAction != idAction) - iEntry ++; - else - { - fFound = TRUE; - if (iEntry < (*ppList)->cEntries -1) - memcpy (&(*ppList)->aEntries[ iEntry ], &(*ppList)->aEntries[ (*ppList)->cEntries-1 ], sizeof((*ppList)->aEntries[0])); - (*ppList)->cEntries --; - } - } - - return fFound; -} - -BOOL AfsAdmSvr_IsInActionList (LPASACTIONLIST *ppList, DWORD idAction, LPASACTION pAction) -{ - if (!ppList || !(*ppList) || !(*ppList)->cEntries) - return FALSE; - - for (ULONG iEntry = 0; iEntry < (*ppList)->cEntries; ++iEntry) - { - if ((*ppList)->aEntries[ iEntry ].Action.idAction == idAction) - { - if (pAction) - memcpy (pAction, &(*ppList)->aEntries[ iEntry ].Action, sizeof(ASACTION)); - return TRUE; - } - } - - return FALSE; -} - -void AfsAdmSvr_FreeActionList (LPASACTIONLIST *ppList) -{ - if (ppList && *ppList) - { - Free (*ppList); - (*ppList) = 0; - } -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.h deleted file mode 100644 index 6503c62ea..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrCommon.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRCOMMON_H -#define TAAFSADMSVRCOMMON_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - // ASIDLIST - Managed type for lists of cell objects - // -LPASIDLIST AfsAdmSvr_CreateAsidList (void); -LPASIDLIST AfsAdmSvr_CopyAsidList (LPASIDLIST pListSource); -BOOL AfsAdmSvr_AddToAsidList (LPASIDLIST *ppList, ASID idObject, LPARAM lp); -BOOL AfsAdmSvr_RemoveFromAsidList (LPASIDLIST *ppList, ASID idObject); -BOOL AfsAdmSvr_RemoveFromAsidListByIndex (LPASIDLIST *ppList, size_t iIndex); -BOOL AfsAdmSvr_SetAsidListParam (LPASIDLIST *ppList, ASID idObject, LPARAM lp); -BOOL AfsAdmSvr_SetAsidListParamByIndex (LPASIDLIST *ppList, size_t iIndex, LPARAM lp); -BOOL AfsAdmSvr_IsInAsidList (LPASIDLIST *ppList, ASID idObject, LPARAM *pParam = NULL); -void AfsAdmSvr_FreeAsidList (LPASIDLIST *ppList); - - // ASOBJPROPLIST - Managed type for lists of cell objects - // -LPASOBJPROPLIST AfsAdmSvr_CreateObjPropList (void); -LPASOBJPROPLIST AfsAdmSvr_CopyObjPropList (LPASOBJPROPLIST pListSource); -BOOL AfsAdmSvr_AddToObjPropList (LPASOBJPROPLIST *ppList, LPASOBJPROP pProperties, LPARAM lp); -BOOL AfsAdmSvr_RemoveFromObjPropList (LPASOBJPROPLIST *ppList, ASID idObject); -BOOL AfsAdmSvr_IsInObjPropList (LPASOBJPROPLIST *ppList, ASID idObject, LPASOBJPROP pProperties = NULL, LPARAM *pParam = NULL); -void AfsAdmSvr_FreeObjPropList (LPASOBJPROPLIST *ppList); - - // ASACTIONLIST - Managed type for lists of cell objects - // -LPASACTIONLIST AfsAdmSvr_CreateActionList (void); -LPASACTIONLIST AfsAdmSvr_CopyActionList (LPASACTIONLIST pListSource); -BOOL AfsAdmSvr_AddToActionList (LPASACTIONLIST *pLispt, LPASACTION pAction); -BOOL AfsAdmSvr_RemoveFromActionList (LPASACTIONLIST *ppList, DWORD idAction); -BOOL AfsAdmSvr_IsInActionList (LPASACTIONLIST *ppList, DWORD idAction, LPASACTION pAction = NULL); -void AfsAdmSvr_FreeActionList (LPASACTIONLIST *ppList); - - -#endif // TAAFSADMSVRCOMMON_H diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.cpp deleted file mode 100644 index 1b8c4b0b0..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static DWORD PrintDetailLevel = dlDEFAULT; - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void cdecl vPrint (DWORD level, LPTSTR pszLine, va_list arg) -{ - static LPCRITICAL_SECTION pcs = NULL; - if (!pcs) - { - pcs = New (CRITICAL_SECTION); - InitializeCriticalSection (pcs); - } - - EnterCriticalSection (pcs); - - if ((!level) || (PrintDetailLevel & level)) - { - TCHAR szOut[ 1024 ]; - wvsprintf (szOut, pszLine, arg); - printf ("AdmSvr: "); - if (!level) - printf (" * "); - if (level & dlINDENT1) - printf (" "); - if (level & dlINDENT2) - printf (" "); - printf ("%s\n", szOut); - } - - LeaveCriticalSection (pcs); -} - - -void cdecl Print (LPTSTR pszLine, ...) -{ - va_list arg; - va_start (arg, pszLine); - vPrint (dlSTANDARD, pszLine, arg); -} - - -void cdecl Print (DWORD level, LPTSTR pszLine, ...) -{ - va_list arg; - va_start (arg, pszLine); - vPrint (level, pszLine, arg); -} - - -DWORD GetPrintDetailLevel (void) -{ - return PrintDetailLevel; -} - - -void SetPrintDetailLevel (DWORD level) -{ - PrintDetailLevel = level; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.h deleted file mode 100644 index 3eb5584b0..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrDebug.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRDEBUG_H -#define TAAFSADMSVRDEBUG_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include - - -/* - * DETAIL LEVELS ______________________________________________________________ - * - */ - -#define dlSTANDARD 0x00000001 -#define dlWARNING 0x00000002 -#define dlERROR 0x00000004 -#define dlCONNECTION 0x00000008 -#define dlOPERATION 0x00000010 -#define dlDETAIL 0x00000020 -#define dlDETAIL2 0x00000040 -#define dlALL 0x00FFFFFF - -#define dlINDENT1 0x01000000 -#define dlINDENT2 0x02000000 -#define dlINDENT3 0x03000000 -#define dlRESERVED 0xFF000000 - -#ifdef DEBUG -#define dlDEFAULT (dlSTANDARD | dlERROR | dlWARNING | dlCONNECTION | dlOPERATION | dlDETAIL) -#else -#define dlDEFAULT (dlSTANDARD | dlERROR | dlCONNECTION) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -extern void cdecl Print (DWORD dwLevel, LPTSTR pszLine, ...); -extern void cdecl Print (LPTSTR pszLine, ...); - -extern DWORD GetPrintDetailLevel (DWORD dwLevel); -extern void SetPrintDetailLevel (DWORD dwLevel); - - -#endif // TAAFSADMSVRDEBUG_H diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.cpp deleted file mode 100644 index 96ede0975..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.cpp +++ /dev/null @@ -1,751 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - -extern "C" { -#include -} // extern "C" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -#define cminREQ_CLIENT_PING (csecAFSADMSVR_CLIENT_PING * 2L / 60L) - -#define cREALLOC_CLIENTS 1 -#define cREALLOC_OPERATIONS 16 - -#define cminAUTO_SHUTDOWN 2 // stop if idle for more than 2min -#define cminAUTO_SHUTDOWN_SLEEP 1 // test for stop every minute - -typedef struct - { - TCHAR szName[ cchSTRING ]; - SOCKADDR_IN ipAddress; - DWORD timeLastPing; - } CLIENTINFO, *LPCLIENTINFO; - -typedef struct - { - BOOL fInUse; - DWORD idClient; - LPASACTION pAction; - DWORD dwTickStart; - } OPERATION, *LPOPERATION; - -static struct - { - BOOL fOperational; - LPCRITICAL_SECTION pcsAfsAdmSvr; - - LPCLIENTINFO *aClients; - size_t cClients; - size_t cClientsAllocated; - - LPNOTIFYCALLBACK pNotify; - - BOOL fAutoShutdown; - HANDLE hThreadShutdown; - DWORD timeLastIdleStart; - - OPERATION *aOperations; - size_t cOperations; - size_t cOperationsAllocated; - DWORD idActionLast; - - DWORD dwScopeMin; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void AfsAdmSvr_TestShutdown (void); -DWORD WINAPI AfsAdmSvr_AutoShutdownThread (LPVOID lp); - - -/* - * SYNCHRONIZATION ____________________________________________________________ - * - */ - -void AfsAdmSvr_Enter (void) -{ - if (!l.pcsAfsAdmSvr) - { - l.pcsAfsAdmSvr = New (CRITICAL_SECTION); - InitializeCriticalSection (l.pcsAfsAdmSvr); - } - EnterCriticalSection (l.pcsAfsAdmSvr); -} - -void AfsAdmSvr_Leave (void) -{ - LeaveCriticalSection (l.pcsAfsAdmSvr); -} - - -/* - * CLIENT INFORMATION _________________________________________________________ - * - */ - -BOOL AfsAdmSvr_fIsValidClient (DWORD idClient) -{ - BOOL rc = FALSE; - AfsAdmSvr_Enter(); - - for (size_t iClient = 0; !rc && iClient < l.cClientsAllocated; ++iClient) - { - if (idClient == (DWORD)(l.aClients[ iClient ])) - { - if (l.aClients[ iClient ]->timeLastPing + cminREQ_CLIENT_PING > AfsAdmSvr_GetCurrentTime()) - rc = TRUE; - } - } - - AfsAdmSvr_Leave(); - return rc; -} - - -BOOL AfsAdmSvr_AttachClient (LPCTSTR pszName, DWORD *pidClient, ULONG *pStatus) -{ - AfsAdmSvr_Enter(); - for (size_t iClient = 0; iClient < l.cClientsAllocated; ++iClient) - { - if (!l.aClients[ iClient ]) - break; - } - if (!REALLOC (l.aClients, l.cClientsAllocated, 1+iClient, cREALLOC_CLIENTS)) - { - *pidClient = 0; - return FALSE; - } - if ((l.aClients[ iClient ] = New (CLIENTINFO)) == NULL) - { - *pidClient = 0; - return FALSE; - } - memset (l.aClients[ iClient ], 0x00, sizeof(CLIENTINFO)); - lstrcpy (l.aClients[ iClient ]->szName, pszName); - l.aClients[ iClient ]->timeLastPing = AfsAdmSvr_GetCurrentTime(); - l.cClients ++; - - if (!AfsAdmSvr_ResolveName (&l.aClients[ iClient ]->ipAddress, l.aClients[ iClient ]->szName)) - memset (&l.aClients[ iClient ]->ipAddress, 0x00, sizeof(SOCKADDR_IN)); - - *pidClient = (DWORD)(l.aClients[ iClient ]); - AfsAdmSvr_Leave(); - return TRUE; -} - - -void AfsAdmSvr_DetachClient (DWORD idClient) -{ - AfsAdmSvr_Enter(); - for (size_t iClient = 0; iClient < l.cClientsAllocated; ++iClient) - { - if (idClient == (DWORD)(l.aClients[ iClient ])) - break; - } - if (iClient < l.cClientsAllocated) - { - Delete (l.aClients[ iClient ]); - l.aClients[ iClient ] = NULL; - l.cClients --; - } - AfsAdmSvr_TestShutdown(); - AfsAdmSvr_Leave(); -} - - -LPCTSTR AfsAdmSvr_GetClientName (DWORD idClient) -{ - static TCHAR szName[ cchSTRING ]; - LPCTSTR pszName = NULL; - AfsAdmSvr_Enter(); - - for (size_t iClient = 0; !pszName && iClient < l.cClientsAllocated; ++iClient) - { - if (idClient == (DWORD)(l.aClients[ iClient ])) - { - lstrcpy (szName, l.aClients[ iClient ]->szName); - pszName = szName; - } - } - - AfsAdmSvr_Leave(); - return pszName; -} - - -LPSOCKADDR_IN AfsAdmSvr_GetClientAddress (DWORD idClient) -{ - static SOCKADDR_IN ipAddress; - LPSOCKADDR_IN pAddress = NULL; - AfsAdmSvr_Enter(); - - for (size_t iClient = 0; !pAddress && iClient < l.cClientsAllocated; ++iClient) - { - if (idClient == (DWORD)(l.aClients[ iClient ])) - { - memcpy (&ipAddress, &l.aClients[ iClient ]->ipAddress, sizeof(SOCKADDR_IN)); - pAddress = &ipAddress; - } - } - - AfsAdmSvr_Leave(); - return pAddress; -} - - -void AfsAdmSvr_PingClient (DWORD idClient) -{ - AfsAdmSvr_Enter(); - - for (size_t iClient = 0; iClient < l.cClientsAllocated; ++iClient) - { - if (idClient == (DWORD)(l.aClients[ iClient ])) - { - l.aClients[ iClient ]->timeLastPing = AfsAdmSvr_GetCurrentTime(); - } - } - - AfsAdmSvr_Leave(); -} - - -DWORD AfsAdmSvr_GetCurrentTime (void) // returns counter in ~minute increments -{ - static WORD wMonthish = 0; // One "Monthish" is 49.7 days - static WORD wTickLast = 0; - DWORD dwTick = GetTickCount(); - WORD wTickNow = HIWORD(dwTick); - if (wTickNow < wTickLast) // wrapped over a Monthish? - ++wMonthish; - wTickLast = wTickNow; - return MAKELONG(wTickNow,wMonthish); -} - - -/* - * STARTUP/SHUTDOWN ___________________________________________________________ - * - */ - -void AfsAdmSvr_Startup (void) -{ - l.pNotify = New2 (NOTIFYCALLBACK,(AfsAdmSvr_NotifyCallback, 0)); - l.fOperational = FALSE; - - ULONG status; - if (AfsClass_Initialize (&status)) - l.fOperational = TRUE; - else - { - Print (dlERROR, TEXT("Could not initialize AfsClass (fatal error 0x%08lX)"), status); - Print (dlERROR, TEXT("Remaining active to tell potential clients about the problem")); - } - - if (!l.hThreadShutdown) - { - DWORD dwThreadID; - l.hThreadShutdown = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoShutdownThread, (LPVOID)0, 0, &dwThreadID); - } -} - - -void AfsAdmSvr_Shutdown (void) -{ - Delete (l.pNotify); - l.pNotify = NULL; - l.fOperational = FALSE; -} - - -/* - * GENERAL ____________________________________________________________________ - * - */ - -BOOL FALSE_ (ULONG status, ULONG *pStatus, size_t iOp) -{ - if (pStatus) - *pStatus = status; - if (iOp != (size_t)-2) - AfsAdmSvr_EndOperation (iOp); - return FALSE; -} - -BOOL Leave_FALSE_ (ULONG status, ULONG *pStatus, size_t iOp) -{ - AfsAdmSvr_Leave(); - if (pStatus) - *pStatus = status; - if (iOp != (size_t)-2) - AfsAdmSvr_EndOperation (iOp); - return FALSE; -} - -BOOL TRUE_ (ULONG *pStatus, size_t iOp) -{ - if (pStatus) - *pStatus = 0; - if (iOp != (size_t)-2) - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - -BOOL Leave_TRUE_ (ULONG *pStatus, size_t iOp) -{ - AfsAdmSvr_Leave(); - if (pStatus) - *pStatus = 0; - if (iOp != (size_t)-2) - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - -IDENTTYPE GetAsidType (ASID idObject) -{ - IDENTTYPE iType; - try { - iType = ((LPIDENT)idObject)->GetType(); - } catch(...) { - iType = itUNUSED; - } - return iType; -} - - -BOOL AfsAdmSvr_ResolveName (LPSOCKADDR_IN pAddress, LPTSTR pszName) -{ - if ((pszName[0] >= TEXT('0')) && (pszName[0] <= TEXT('9'))) - { - int ipAddress; - if ((ipAddress = inet_addr (pszName)) == INADDR_NONE) - return FALSE; - - memset (pAddress, 0x00, sizeof(SOCKADDR_IN)); - pAddress->sin_family = AF_INET; - pAddress->sin_addr.s_addr = ipAddress; - - HOSTENT *pEntry; - if ((pEntry = gethostbyaddr ((char*)&ipAddress, sizeof(ipAddress), AF_INET)) != NULL) - lstrcpy (pszName, pEntry->h_name); - } - else // (!isdigit(szServer[0])) - { - HOSTENT *pEntry; - if ((pEntry = gethostbyname (pszName)) == NULL) - return FALSE; - - memset (pAddress, 0x00, sizeof(SOCKADDR_IN)); - pAddress->sin_family = AF_INET; - pAddress->sin_addr.s_addr = *(int *)pEntry->h_addr; - - lstrcpy (pszName, pEntry->h_name); - } - - return TRUE; -} - - -/* - * AUTO-SHUTDOWN ______________________________________________________________ - * - */ - -DWORD WINAPI AfsAdmSvr_AutoShutdownThread (LPVOID lp) -{ - for (;;) - { - AfsAdmSvr_Enter(); - - BOOL fShutdown = l.fAutoShutdown; - - // If there are any clients connected, forcably disconnect any - // that haven't pinged us for too long - // - for (size_t iClient = 0; iClient < l.cClientsAllocated; ++iClient) - { - if (!l.aClients[ iClient ]) - continue; - if (l.aClients[ iClient ]->timeLastPing + cminREQ_CLIENT_PING <= AfsAdmSvr_GetCurrentTime()) - { - Print (dlCONNECTION, "Client 0x%08lX idle for too long; detaching", l.aClients[ iClient ]); - AfsAdmSvr_DetachClient ((DWORD)l.aClients[ iClient ]); - } - } - - // If any operations are in progress, we can't shutdown. - // - if (l.cOperations) - fShutdown = FALSE; - - // If any clients are still connected, we can't shutdown. - // - if (l.cClients) - fShutdown = FALSE; - - // If we haven't been idle long enough, we can't shutdown - // - if (!l.timeLastIdleStart) - fShutdown = FALSE; - else if (l.timeLastIdleStart + cminAUTO_SHUTDOWN > AfsAdmSvr_GetCurrentTime()) - fShutdown = FALSE; - - // That's it; can we stop now? - // - if (fShutdown) - { - Print ("Idle for too long; shutting down."); - RpcMgmtStopServerListening (NULL); - AfsAdmSvr_StopCallbackManagers(); - } - - AfsAdmSvr_Leave(); - - if (fShutdown) - break; - - Sleep (cminAUTO_SHUTDOWN_SLEEP * 60L * 1000L); - } - - return 0; -} - - - -void AfsAdmSvr_EnableAutoShutdown (BOOL fEnable) -{ - AfsAdmSvr_Enter(); - - l.fAutoShutdown = fEnable; - - if (fEnable) - Print (dlDETAIL, TEXT("Auto-shutdown enabled, trigger = %lu minutes idle time"), cminAUTO_SHUTDOWN); - else - Print (dlDETAIL, TEXT("Auto-shutdown on idle disabled")); - - AfsAdmSvr_Leave(); -} - - -void AfsAdmSvr_TestShutdown (void) -{ - if (!l.cOperations && !l.cClients) - { - l.timeLastIdleStart = AfsAdmSvr_GetCurrentTime(); - } -} - - -size_t AfsAdmSvr_BeginOperation (DWORD idClient, LPASACTION pAction) -{ - AfsAdmSvr_Enter(); - - ++l.cOperations; - - for (size_t iOp = 0; iOp < l.cOperationsAllocated; ++iOp) - { - if (!l.aOperations[ iOp ].fInUse) - break; - } - if (!REALLOC (l.aOperations, l.cOperationsAllocated, 1+iOp, cREALLOC_OPERATIONS)) - { - AfsAdmSvr_Leave(); - return (size_t)(-1); - } - - l.aOperations[ iOp ].idClient = idClient; - l.aOperations[ iOp ].pAction = NULL; - l.aOperations[ iOp ].fInUse = TRUE; - - if (pAction) - { - l.aOperations[ iOp ].pAction = New (ASACTION); - memcpy (l.aOperations[ iOp ].pAction, pAction, sizeof(ASACTION)); - l.aOperations[ iOp ].pAction->idAction = ++l.idActionLast; - l.aOperations[ iOp ].pAction->idClient = idClient; - l.aOperations[ iOp ].pAction->csecActive = 0; - - TCHAR szDesc[256]; - switch (l.aOperations[ iOp ].pAction->Action) - { - case ACTION_REFRESH: - wsprintf (szDesc, TEXT("Refresh (scope=0x%08lX)"), l.aOperations[ iOp ].pAction->u.Refresh.idScope); - break; - case ACTION_SCOUT: - wsprintf (szDesc, TEXT("Scout (scope=0x%08lX)"), l.aOperations[ iOp ].pAction->u.Refresh.idScope); - break; - case ACTION_USER_CHANGE: - wsprintf (szDesc, TEXT("ChangeUser (user=0x%08lX)"), l.aOperations[ iOp ].pAction->u.User_Change.idUser); - break; - case ACTION_USER_PW_CHANGE: - wsprintf (szDesc, TEXT("SetUserPassword (user=0x%08lX)"), l.aOperations[ iOp ].pAction->u.User_Pw_Change.idUser); - break; - case ACTION_USER_UNLOCK: - wsprintf (szDesc, TEXT("UnlockUser (user=0x%08lX)"), l.aOperations[ iOp ].pAction->u.User_Unlock.idUser); - break; - case ACTION_USER_CREATE: - wsprintf (szDesc, TEXT("CreateUser (user=%s)"), l.aOperations[ iOp ].pAction->u.User_Create.szUser); - break; - case ACTION_USER_DELETE: - wsprintf (szDesc, TEXT("CreateUser (user=0x%08lX)"), l.aOperations[ iOp ].pAction->u.User_Delete.idUser); - break; - case ACTION_GROUP_CHANGE: - wsprintf (szDesc, TEXT("ChangeGroup (group=0x%08lX)"), l.aOperations[ iOp ].pAction->u.Group_Change.idGroup); - break; - case ACTION_GROUP_MEMBER_ADD: - wsprintf (szDesc, TEXT("AddGroupMember (group=0x%08lX, user=0x%08lX)"), l.aOperations[ iOp ].pAction->u.Group_Member_Add.idGroup, l.aOperations[ iOp ].pAction->u.Group_Member_Add.idUser); - break; - case ACTION_GROUP_MEMBER_REMOVE: - wsprintf (szDesc, TEXT("RemoveGroupMember (group=0x%08lX, user=0x%08lX)"), l.aOperations[ iOp ].pAction->u.Group_Member_Remove.idGroup, l.aOperations[ iOp ].pAction->u.Group_Member_Remove.idUser); - break; - case ACTION_GROUP_RENAME: - wsprintf (szDesc, TEXT("RenameGroup (group=0x%08lX, new name=%s)"), l.aOperations[ iOp ].pAction->u.Group_Rename.idGroup, l.aOperations[ iOp ].pAction->u.Group_Rename.szNewName); - break; - case ACTION_GROUP_DELETE: - wsprintf (szDesc, TEXT("CreateGroup (group=0x%08lX)"), l.aOperations[ iOp ].pAction->u.Group_Delete.idGroup); - break; - case ACTION_CELL_CHANGE: - wsprintf (szDesc, TEXT("ChangeCell (cell=0x%08lX)"), l.aOperations[ iOp ].pAction->idCell); - break; - default: - wsprintf (szDesc, TEXT("Unknown Action (#%lu)"), l.aOperations[ iOp ].pAction->Action); - break; - } - Print (dlOPERATION, TEXT("Starting action 0x%08lX: %s"), l.aOperations[ iOp ].pAction->idAction, szDesc); - - AfsAdmSvr_PostCallback (cbtACTION, FALSE, l.aOperations[ iOp ].pAction); - } - - l.aOperations[ iOp ].dwTickStart = GetTickCount(); - AfsAdmSvr_Leave(); - return iOp; -} - - -void AfsAdmSvr_EndOperation (size_t iOp) -{ - AfsAdmSvr_Enter(); - - if ((iOp != (size_t)-1) && (iOp < l.cOperationsAllocated) && (l.aOperations[ iOp ].fInUse)) - { - if (l.aOperations[ iOp ].pAction) - { - Print (dlOPERATION, TEXT("Ending action 0x%08lX"), l.aOperations[ iOp ].pAction->idAction); - AfsAdmSvr_PostCallback (cbtACTION, TRUE, l.aOperations[ iOp ].pAction); - Delete (l.aOperations[ iOp ].pAction); - } - memset (&l.aOperations[ iOp ], 0x00, sizeof(l.aOperations[ iOp ])); - l.cOperations --; - } - - AfsAdmSvr_TestShutdown(); - AfsAdmSvr_Leave(); -} - - -BOOL AfsAdmSvr_GetOperation (DWORD idAction, LPASACTION pAction) -{ - AfsAdmSvr_Enter(); - - for (size_t iOp = 0; iOp < l.cOperationsAllocated; ++iOp) - { - if (!l.aOperations[ iOp ].fInUse) - continue; - if (!l.aOperations[ iOp ].pAction) - continue; - if (l.aOperations[ iOp ].pAction->idAction != idAction) - continue; - - memcpy (pAction, l.aOperations[ iOp ].pAction, sizeof(ASACTION)); - pAction->csecActive = (GetTickCount() - l.aOperations[ iOp ].dwTickStart) / 1000; - AfsAdmSvr_Leave(); - return TRUE; - } - - AfsAdmSvr_Leave(); - return FALSE; -} - - -LPASACTIONLIST AfsAdmSvr_GetOperations (DWORD idClientSearch, ASID idCellSearch) -{ - LPASACTIONLIST pList = AfsAdmSvr_CreateActionList(); - AfsAdmSvr_Enter(); - - for (size_t iOp = 0; iOp < l.cOperationsAllocated; ++iOp) - { - if (!l.aOperations[ iOp ].fInUse) - continue; - if (!l.aOperations[ iOp ].pAction) - continue; - if (idClientSearch && (idClientSearch != l.aOperations[ iOp ].pAction->idClient)) - continue; - if (idCellSearch && (idCellSearch != l.aOperations[ iOp ].pAction->idCell)) - continue; - - ASACTION Action; - memcpy (&Action, l.aOperations[ iOp ].pAction, sizeof(ASACTION)); - Action.csecActive = (GetTickCount() - l.aOperations[ iOp ].dwTickStart) / 1000; - if (!AfsAdmSvr_AddToActionList (&pList, &Action)) - { - AfsAdmSvr_FreeActionList (&pList); - break; - } - } - - AfsAdmSvr_Leave(); - return pList; -} - - -void AfsAdmSvr_Action_StartRefresh (ASID idScope) -{ - switch (GetAsidType (idScope)) - { - case itCELL: - AfsAdmSvr_MarkRefreshThread (idScope); - // fall through - - case itSERVER: - ASACTION Action; - memset (&Action, 0x00, sizeof(Action)); - Action.Action = ACTION_REFRESH; - Action.idCell = (ASID)( ((LPIDENT)idScope)->GetCell() ); - Action.u.Refresh.idScope = idScope; - (void)AfsAdmSvr_BeginOperation (0, &Action); - break; - - default: - // Don't bother listing status-refreshes as ongoing operations - // for any granularity smaller than the server; they'll occur - // really frequently, and finish really quickly. - break; - } -} - - -void AfsAdmSvr_Action_StopRefresh (ASID idScope) -{ - AfsAdmSvr_Enter(); - - for (size_t iOp = 0; iOp < l.cOperationsAllocated; ++iOp) - { - if (!l.aOperations[ iOp ].fInUse) - continue; - if (!l.aOperations[ iOp ].pAction) - continue; - if (l.aOperations[ iOp ].pAction->Action != ACTION_REFRESH) - continue; - if (l.aOperations[ iOp ].pAction->u.Refresh.idScope != idScope) - continue; - - AfsAdmSvr_EndOperation (iOp); - break; - } - - if (GetAsidType (idScope) == itCELL) - { - AfsAdmSvr_MarkRefreshThread (idScope); - } - - AfsAdmSvr_Leave(); -} - - -DWORD WINAPI AfsAdmSvr_AutoOpen_ThreadProc (PVOID lp) -{ - DWORD dwScope = (DWORD)lp; - ULONG status; - - if (!l.fOperational) - return 0; - - // First we'll have to find out which cell to open - // - TCHAR szCell[ cchNAME ]; - if (!CELL::GetDefaultCell (szCell, &status)) - { - Print (dlERROR, TEXT("CELL::GetDefaultCell failed; error 0x%08lX"), status); - } - else - { - // Then try to actually open the cell - // - Print (dlSTANDARD, TEXT("Auto-opening cell %s; scope=%s"), szCell, (dwScope == (AFSADMSVR_SCOPE_VOLUMES | AFSADMSVR_SCOPE_USERS)) ? TEXT("full") : (dwScope == AFSADMSVR_SCOPE_VOLUMES) ? TEXT("volumes") : TEXT("users")); - - LPIDENT lpiCell; - if ((lpiCell = CELL::OpenCell ((LPTSTR)szCell, &status)) == NULL) - { - Print (dlERROR, TEXT("Auto-open of cell %s failed; error 0x%08lX"), szCell, status); - } - else - { - LPCELL lpCell; - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - { - Print (dlERROR, TEXT("Auto-open: OpenCell failed; error 0x%08lX"), status); - } - else - { - AfsAdmSvr_AddToMinScope (dwScope); - if (!lpCell->RefreshAll (&status)) - Print (dlERROR, TEXT("Auto-open: RefreshCell failed; error 0x%08lX"), status); - else - Print (dlSTANDARD, TEXT("Auto-open of cell %s successful"), szCell); - lpCell->Close(); - - // We intentionally do not call CELL::CloseCell() here--as would - // ordinarily be necessary to balance our CELL::OpenCell() call - // above--because we never want to close our cache for this cell. - // The point of calling AutoOpen() up front is to keep an admin - // server alive and ready for use on a particular cell--calling - // CELL::CloseCell() here negates that purpose. - - } - } - } - - return 0; -} - - -void AfsAdmSvr_AddToMinScope (DWORD dwScope) -{ - l.dwScopeMin |= dwScope; - AfsClass_SpecifyRefreshDomain (l.dwScopeMin); -} - - -void AfsAdmSvr_SetMinScope (DWORD dwScope) -{ - l.dwScopeMin = dwScope; -} - - -DWORD AfsAdmSvr_GetMinScope (void) -{ - return l.dwScopeMin; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.h deleted file mode 100644 index d010713c8..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrGeneral.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRGENERAL_H -#define TAAFSADMSVRGENERAL_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void AfsAdmSvr_Enter (void); -void AfsAdmSvr_Leave (void); - -void AfsAdmSvr_Startup (void); -void AfsAdmSvr_Shutdown (void); - -void AfsAdmSvr_EnableAutoShutdown (BOOL fEnable); -size_t AfsAdmSvr_BeginOperation (DWORD idClient, LPASACTION pAction = NULL); -void AfsAdmSvr_EndOperation (size_t iOp); -BOOL AfsAdmSvr_GetOperation (DWORD idAction, LPASACTION pAction); -LPASACTIONLIST AfsAdmSvr_GetOperations (DWORD idClientSearch = 0, ASID idCellSearch = 0); -void AfsAdmSvr_Action_StartRefresh (ASID idScope); -void AfsAdmSvr_Action_StopRefresh (ASID idScope); - -BOOL AfsAdmSvr_fIsValidClient (DWORD idClient); -BOOL AfsAdmSvr_AttachClient (LPCTSTR pszName, DWORD *pidClient, ULONG *pStatus); -void AfsAdmSvr_DetachClient (DWORD idClient); -LPCTSTR AfsAdmSvr_GetClientName (DWORD idClient); -LPSOCKADDR_IN AfsAdmSvr_GetClientAddress (DWORD idClient); -void AfsAdmSvr_PingClient (DWORD idClient); - -BOOL FALSE_ (ULONG status, ULONG *pStatus, size_t iOp = (size_t)-2); -BOOL Leave_FALSE_ (ULONG status, ULONG *pStatus, size_t iOp = (size_t)-2); -BOOL TRUE_ (ULONG *pStatus, size_t iOp = (size_t)-2); -BOOL Leave_TRUE_ (ULONG *pStatus, size_t iOp = (size_t)-2); - -IDENTTYPE GetAsidType (ASID idObject); -BOOL AfsAdmSvr_ResolveName (LPSOCKADDR_IN pAddress, LPTSTR pszName); - -DWORD WINAPI AfsAdmSvr_AutoOpen_ThreadProc (PVOID lp); -void AfsAdmSvr_AddToMinScope (DWORD dwScope); -void AfsAdmSvr_SetMinScope (DWORD dwScope); -DWORD AfsAdmSvr_GetMinScope (void); - -void AfsAdmSvr_CallbackManager (void); -DWORD AfsAdmSvr_GetCurrentTime (void); - - -#endif // TAAFSADMSVRGENERAL_H diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrGroup.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrGroup.cpp deleted file mode 100644 index 4ad14b878..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrGroup.cpp +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - - // AfsAdmSvr_ChangeGroup - // ...changes a group account's properties. - // -extern "C" int AfsAdmSvr_ChangeGroup (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_GROUP_CHANGE; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.Group_Change.idGroup = idGroup; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup (idGroup=0x%08lX)"), idClient, idGroup); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Find this group's current properties - // - LPASOBJPROP pCurrentProperties; - if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idGroup, pStatus)) == NULL) - { - Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; no properties"), idClient); - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - - // Build an AFSCLASS-style GROUPPROPERTIES structure that reflects the - // new properties for the user; mark the structure's dwMask bit to indicate - // what we're changing. - // - GROUPPROPERTIES NewProperties; - memset (&NewProperties, 0x00, sizeof(NewProperties)); - - if (!pChange->szOwner[0]) - lstrcpy (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner); - else - { - lstrcpy (NewProperties.szOwner, pChange->szOwner); - if (lstrcmpi (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner)) - NewProperties.dwMask |= MASK_GROUPPROP_szOwner; - } - - if ((NewProperties.aaListStatus = pChange->aaListStatus) != pCurrentProperties->u.GroupProperties.aaListStatus) - NewProperties.dwMask |= MASK_GROUPPROP_aaListStatus; - if ((NewProperties.aaListGroupsOwned = pChange->aaListGroupsOwned) != pCurrentProperties->u.GroupProperties.aaListGroupsOwned) - NewProperties.dwMask |= MASK_GROUPPROP_aaListGroupsOwned; - if ((NewProperties.aaListMembers = pChange->aaListMembers) != pCurrentProperties->u.GroupProperties.aaListMembers) - NewProperties.dwMask |= MASK_GROUPPROP_aaListMembers; - if ((NewProperties.aaAddMember = pChange->aaAddMember) != pCurrentProperties->u.GroupProperties.aaAddMember) - NewProperties.dwMask |= MASK_GROUPPROP_aaAddMember; - if ((NewProperties.aaDeleteMember = pChange->aaDeleteMember) != pCurrentProperties->u.GroupProperties.aaDeleteMember) - NewProperties.dwMask |= MASK_GROUPPROP_aaDeleteMember; - - // If we've decided to change anything, call AfsClass to actually do it - // - if (NewProperties.dwMask == 0) - { - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded (nothing to do)"), idClient); - } - else - { - ULONG status; - if (!AfsClass_SetGroupProperties ((LPIDENT)idGroup, &NewProperties, &status)) - { - Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded"), idClient); - } - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_GetGroupMembers - // ...retrieves the list of users which belong to a group - // -extern "C" int AfsAdmSvr_GetGroupMembers (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers (idGroup=0x%08lX)"), idClient, idGroup); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Use AfsClass to get the list of group members - // - if (GetAsidType (idGroup) != itGROUP) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - ULONG status; - LPPTSGROUP lpGroup; - if ((lpGroup = ((LPIDENT)idGroup)->OpenGroup (&status)) == NULL) - return FALSE_(status,pStatus,iOp); - - LPTSTR pmszUsers = NULL; - lpGroup->GetMembers (&pmszUsers); - lpGroup->Close(); - - // Then translate those user names into an ASID list - // - if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL) - { - if (pmszUsers) - FreeString (pmszUsers); - return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp); - } - - if (pmszUsers) - { - for (LPTSTR psz = pmszUsers; psz && *psz; psz += 1+lstrlen(psz)) - { - LPIDENT lpi; - if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL) - { - TCHAR szName[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - USER::SplitUserName (psz, szName, szInstance); - - if ((lpi = IDENT::FindUser ((LPIDENT)idCell, szName, szInstance)) == NULL) - { - continue; - } - } - - AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0); - } - FreeString (pmszUsers); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_GetGroupMembership - // ...retrieves the list of groups to which a user or group belongs - // -extern "C" int AfsAdmSvr_GetGroupMembership (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership (idMember=0x%08lX)"), idClient, idMember); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Use AfsClass to get the appropriate list of groups - // - ULONG status; - LPTSTR pmszGroups = NULL; - - if (GetAsidType (idMember) == itUSER) - { - LPUSER lpUser; - if ((lpUser = ((LPIDENT)idMember)->OpenUser (&status)) == NULL) - return FALSE_(status,pStatus,iOp); - lpUser->GetMemberOf (&pmszGroups); - lpUser->Close(); - } - else if (GetAsidType (idMember) == itGROUP) - { - LPPTSGROUP lpGroup; - if ((lpGroup = ((LPIDENT)idMember)->OpenGroup (&status)) == NULL) - return FALSE_(status,pStatus,iOp); - lpGroup->GetMemberOf (&pmszGroups); - lpGroup->Close(); - } - else // bogus type - { - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - } - - // Then translate those group names into an ASID list - // - if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL) - { - if (pmszGroups) - FreeString (pmszGroups); - return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp); - } - - if (pmszGroups) - { - for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz)) - { - LPIDENT lpi; - if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL) - continue; - AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0); - } - FreeString (pmszGroups); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_GetGroupOwnership - // ...retrieves the list of groups which a user owns - // -extern "C" int AfsAdmSvr_GetGroupOwnership (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - size_t iOp = AfsAdmSvr_BeginOperation (idClient); - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership (idOwner=0x%08lX)"), idClient, idOwner); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Use AfsClass to get the appropriate list of groups - // - ULONG status; - LPTSTR pmszGroups = NULL; - - if (GetAsidType (idOwner) == itUSER) - { - LPUSER lpUser; - if ((lpUser = ((LPIDENT)idOwner)->OpenUser (&status)) == NULL) - return FALSE_(status,pStatus,iOp); - lpUser->GetOwnerOf (&pmszGroups); - lpUser->Close(); - } - else if (GetAsidType (idOwner) == itGROUP) - { - LPPTSGROUP lpGroup; - if ((lpGroup = ((LPIDENT)idOwner)->OpenGroup (&status)) == NULL) - return FALSE_(status,pStatus,iOp); - lpGroup->GetOwnerOf (&pmszGroups); - lpGroup->Close(); - } - else // bogus type - { - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - } - - // Then translate those group names into an ASID list - // - if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL) - { - if (pmszGroups) - FreeString (pmszGroups); - return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp); - } - - if (pmszGroups) - { - for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz)) - { - LPIDENT lpi; - if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL) - continue; - AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0); - } - FreeString (pmszGroups); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_AddGroupMember - // ...adds a member to the specified group - // -extern "C" int AfsAdmSvr_AddGroupMember (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_GROUP_MEMBER_ADD; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.Group_Member_Add.idGroup = idGroup; - Action.u.Group_Member_Add.idUser = idMember; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Modify the group as requested - // - ULONG status; - if (!AfsClass_AddUserToGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status)) - return FALSE_(status,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_RemoveGroupMember - // ...removes a member from the specified group - // -extern "C" int AfsAdmSvr_RemoveGroupMember (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_GROUP_MEMBER_REMOVE; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.Group_Member_Remove.idGroup = idGroup; - Action.u.Group_Member_Remove.idUser = idMember; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Modify the group as requested - // - ULONG status; - if (!AfsClass_RemoveUserFromGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status)) - return FALSE_(status,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_RenameGroup - // ...changes a group's name - // -extern "C" int AfsAdmSvr_RenameGroup (DWORD idClient, ASID idCell, ASID idGroup, STRING szNewGroupName, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_GROUP_RENAME; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.Group_Rename.idGroup = idGroup; - lstrcpy (Action.u.Group_Rename.szNewName, szNewGroupName); - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup (idGroup=0x%08lX, szNewName=%s)"), idClient, idGroup, szNewGroupName); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Modify the group as requested - // - ULONG status; - if (!AfsClass_RenameGroup ((LPIDENT)idGroup, szNewGroupName, &status)) - return FALSE_(status,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_CreateGroup - // ...creates a new PTS group - // -extern "C" int AfsAdmSvr_CreateGroup (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_GROUP_CREATE; - Action.idClient = idClient; - Action.idCell = idCell; - lstrcpy (Action.u.Group_Create.szGroup, pCreate->szName); - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup (szGroup=%s)"), idClient, pCreate->szName); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Find the owner (if we can) - // - LPIDENT lpiOwner; - if ((lpiOwner = IDENT::FindUser ((LPIDENT)idCell, pCreate->szOwner)) == NULL) - lpiOwner = IDENT::FindGroup ((LPIDENT)idCell, pCreate->szOwner); - - // Create the group account - // - ULONG status; - LPIDENT lpiGroup; - if ((lpiGroup = AfsClass_CreateGroup ((LPIDENT)idCell, pCreate->szName, lpiOwner, pCreate->idGroup, &status)) == NULL) - { - Print (dlERROR, TEXT("Client 0x%08lX: CreateGroup failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - if (pidGroup) - *pidGroup = (ASID)lpiGroup; - - // Creating a group account may change the max group ID - AfsAdmSvr_TestProperties (idCell); - - Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_DeleteGroup - // ...deletes a PTS group - // -extern "C" int AfsAdmSvr_DeleteGroup (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_GROUP_DELETE; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.Group_Delete.idGroup = idGroup; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup (idGroup=0x%08lX)"), idClient, idGroup); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Delete the group - // - ULONG status; - if (!AfsClass_DeleteGroup ((LPIDENT)idGroup, &status)) - { - Print (dlERROR, TEXT("Client 0x%08lX: DeleteGroup failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrInternal.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrInternal.h deleted file mode 100644 index 191e6e49a..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrInternal.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRINTERNAL_H -#define TAAFSADMSVRINTERNAL_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include -#include -#include -#include - -#include "TaAfsAdmSvrDebug.h" -#include "TaAfsAdmSvrSearch.h" -#include "TaAfsAdmSvrProperties.h" -#include "TaAfsAdmSvrGeneral.h" -#include "TaAfsAdmSvrCallback.h" - -extern "C" { -#include -#include -#include -#include -#include -#include -#include -} // extern "C" - - -#endif // TAAFSADMSVRINTERNAL_H - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrMain.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrMain.cpp deleted file mode 100644 index e9d67c3ba..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrMain.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -#ifdef DEBUG -LPARAM CALLBACK AfsAdmSvr_Debug_ThreadProc (PVOID lp) -{ - ShowMemoryManager(); - - MSG msg; - while (GetMessage (&msg, 0, 0, 0)) - { - if (!IsMemoryManagerMessage (&msg)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - } - - return 0; -} -#endif - - -int cdecl main (int argc, char **argv) -{ - BOOL fSuccess = FALSE; - - Print (TEXT("Initializing...")); - - WSADATA Data; - WSAStartup (0x0101, &Data); - - // Parse the command-line - // - DWORD dwAutoScope = AFSADMSVR_SCOPE_VOLUMES | AFSADMSVR_SCOPE_USERS; - - for (--argc,++argv; argc; --argc,++argv) - { - if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_TIMED)) - AfsAdmSvr_EnableAutoShutdown (TRUE); - else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_MANUAL)) - dwAutoScope = 0; - else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_SCOPE_USERS)) - dwAutoScope &= ~AFSADMSVR_SCOPE_VOLUMES; - else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_SCOPE_VOLUMES)) - dwAutoScope &= ~AFSADMSVR_SCOPE_USERS; -#ifdef DEBUG - else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_DEBUG)) - CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_Debug_ThreadProc, 0, 0, 0); -#endif - } - - // Prepare to listen for RPCs - // - unsigned char *pszPROTOCOL = (unsigned char *)"ncacn_ip_tcp"; - unsigned char *pszENTRYNAME = (unsigned char *)AFSADMSVR_ENTRYNAME_DEFAULT; - unsigned char *pszANNOTATION = (unsigned char *)"Transarc AFS Administrative Server"; - unsigned char szEndpoint[ 32 ]; - wsprintf ((LPTSTR)szEndpoint, "%lu", AFSADMSVR_ENDPOINT_DEFAULT); - int cMAX_CALLS = 50; - - // Clean up any broken interface registration - // - RpcServerUnregisterIf (ITaAfsAdminSvr_v1_0_s_ifspec, 0, FALSE); - RpcNsBindingUnexport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, NULL); - - // Register our interface - // - RPC_STATUS status; - if ((status = RpcServerUseProtseq (pszPROTOCOL, cMAX_CALLS, NULL)) != 0) - { - Print (dlERROR, TEXT("RpcServerUseProtseq failed; error 0x%08lX"), status); - } - else if ((status = RpcServerRegisterIf (ITaAfsAdminSvr_v1_0_s_ifspec, 0, 0)) != 0) - { - Print (dlERROR, TEXT("RpcServerRegisterIf failed; error 0x%08lX"), status); - } - else - { - // Always try to register on port 1025; that's the easiest thing for - // some clients to find. We'll only fail if we (a) can't use 1025, and - // (b) can't export our bindings. - // - BOOL fGotPort = FALSE; - if (RpcServerUseProtseqEp (pszPROTOCOL, cMAX_CALLS, szEndpoint, NULL) == 0) - fGotPort = TRUE; - else - Print (dlWARNING, TEXT("RpcServerUseProtseqEp failed (benign); error 0x%08lX"), status); - - RPC_BINDING_VECTOR *pBindingVector; - if ((status = RpcServerInqBindings (&pBindingVector)) != 0) - { - Print (dlERROR, TEXT("RpcServerRegisterIf failed; error 0x%08lX"), status); - } - else if ((status = RpcEpRegister (ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL, pszANNOTATION)) != 0) - { - Print (dlERROR, TEXT("RpcEpRegister failed; error 0x%08lX"), status); - } - else - { - BOOL fExportedBinding = FALSE; - - if ((status = RpcNsBindingExport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL)) == 0) - fExportedBinding = TRUE; - else - Print (dlWARNING, TEXT("RpcNsBindingExport failed (benign); error 0x%08lX"), status); - - if (!fExportedBinding && !fGotPort) - { - Print (dlERROR, TEXT("RpcNsBindingExport failed; error 0x%08lX"), status); - Print (dlERROR, TEXT("Could not bind to port %s or export bindings; terminating"), szEndpoint); - } - else - { - AfsAdmSvr_Startup(); - - Print (TEXT("Ready.\n")); - - // If not asked to open cells manually, fork a thread to start opening - // the default local cell - // - if (dwAutoScope) - { - DWORD dwThreadID; - CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoOpen_ThreadProc, (PVOID)dwAutoScope, 0, &dwThreadID); - } - - // Listen for requests until someone calls StopListen - // - if ((status = RpcServerListen (1, cMAX_CALLS, FALSE)) != 0) - { - Print (dlERROR, TEXT("RpcServerListen failed; error 0x%08lX"), status); - } - else - { - fSuccess = TRUE; - } - - AfsAdmSvr_Shutdown(); - } - - if (fExportedBinding) - { - if ((status = RpcNsBindingUnexport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, NULL)) != 0) - { - Print (dlWARNING, TEXT("RpcNsBindingExport failed; error 0x%08lX"), status); - } - } - - if ((status = RpcEpUnregister (ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL)) != 0) - { - Print (dlWARNING, TEXT("RpcEpUnregister failed; error 0x%08lX"), status); - } - } - } - - Print (TEXT("Shutting down...\n")); - - if ((status = RpcServerUnregisterIf (0, 0, FALSE)) != 0) - { - Print (dlWARNING, TEXT("RpcServerUnregisterIf failed; error 0x%08lX"), status); - exit (-1); - } - - return (fSuccess) ? (0) : (-1); -} - - -extern "C" void __RPC_FAR * __RPC_USER MIDL_user_allocate (size_t cbAllocate) -{ - return (void __RPC_FAR *)Allocate (cbAllocate); -} - - -extern "C" void __RPC_USER MIDL_user_free (void __RPC_FAR *pData) -{ - Free (pData); -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.cpp deleted file mode 100644 index aab265656..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.cpp +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - ASID idCell; - DWORD timeLastRefresh; - DWORD cminRefreshRate; - HANDLE hThread; - } REFRESHTHREAD, *LPREFRESHTHREAD; - -static struct - { - REFRESHTHREAD *aRefreshThreads; - size_t cRefreshThreads; - CRITICAL_SECTION *pcsRefreshThreads; - } l; - - -/* - * AUTO-REFRESH _______________________________________________________________ - * - */ - -DWORD WINAPI AfsAdmSvr_AutoRefreshThread (PVOID lp) -{ - ASID idCell = (ASID)lp; - for (;;) - { - EnterCriticalSection (l.pcsRefreshThreads); - - BOOL fFound = FALSE; - DWORD cminRefreshRate; - DWORD timeLastRefresh; - for (size_t iThread = 0; (!fFound) && (iThread < l.cRefreshThreads); ++iThread) - { - LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ]; - if (pThread->idCell == idCell) - { - fFound = TRUE; - cminRefreshRate = pThread->cminRefreshRate; - timeLastRefresh = pThread->timeLastRefresh; - } - } - - LeaveCriticalSection (l.pcsRefreshThreads); - - if (!fFound) - break; - - DWORD timeNextRefresh = timeLastRefresh + cminRefreshRate; - if ((cminRefreshRate) && ((!timeLastRefresh) || (AfsAdmSvr_GetCurrentTime() >= timeNextRefresh))) - { - Print (dlDETAIL, TEXT("Auto-refresh: %lu minutes elapsed; refreshing cell 0x%08lX"), cminRefreshRate, idCell); - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell()) != NULL) - { - lpCell->Invalidate(); - - ULONG status; - if (!lpCell->RefreshAll (&status)) - Print (dlERROR, TEXT("Auto-refresh: RefreshCell failed; error 0x%08lX"), status); - else - Print (dlSTANDARD, TEXT("Auto-refresh of cell 0x%08lX successful"), idCell); - lpCell->Close(); - } - } - - Sleep (60L * 1000L); // sleep for one minute - } - - return 0; -} - - -void AfsAdmSvr_PrepCellRefresh (void) -{ - if (!l.pcsRefreshThreads) - { - l.pcsRefreshThreads = New (CRITICAL_SECTION); - InitializeCriticalSection (l.pcsRefreshThreads); - } -} - - -void AfsAdmSvr_SetCellRefreshRate (ASID idCell, ULONG cminRefreshRate) -{ - AfsAdmSvr_PrepCellRefresh(); - EnterCriticalSection (l.pcsRefreshThreads); - - for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread) - { - LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ]; - if (pThread->idCell == idCell) - { - pThread->cminRefreshRate = cminRefreshRate; - break; - } - } - if (iThread == l.cRefreshThreads) - { - for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread) - { - LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ]; - if (pThread->idCell == 0) - break; - } - if (REALLOC (l.aRefreshThreads, l.cRefreshThreads, 1+iThread, 1)) - { - DWORD idThread; - - LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ]; - pThread->idCell = idCell; - pThread->timeLastRefresh = AfsAdmSvr_GetCurrentTime(); - pThread->cminRefreshRate = cminRefreshRate; - pThread->hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoRefreshThread, (LPVOID)idCell, 0, &idThread); - } - } - - LeaveCriticalSection (l.pcsRefreshThreads); -} - - -void AfsAdmSvr_StopCellRefreshThread (ASID idCell) -{ - AfsAdmSvr_PrepCellRefresh(); - EnterCriticalSection (l.pcsRefreshThreads); - - for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread) - { - LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ]; - if (pThread->idCell == idCell) - pThread->idCell = 0; - } - - LeaveCriticalSection (l.pcsRefreshThreads); -} - - -void AfsAdmSvr_MarkRefreshThread (ASID idCell) -{ - AfsAdmSvr_PrepCellRefresh(); - EnterCriticalSection (l.pcsRefreshThreads); - - for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread) - { - LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ]; - if (pThread->idCell == idCell) - pThread->timeLastRefresh = AfsAdmSvr_GetCurrentTime(); - } - - LeaveCriticalSection (l.pcsRefreshThreads); -} - - -/* - * OBJECT PROPERTIES __________________________________________________________ - * - */ - -void AfsAdmSvr_ObtainRudimentaryProperties (LPASOBJPROP pProperties) -{ - LPIDENT lpi = (LPIDENT)(pProperties->idObject); - - switch (GetAsidType (pProperties->idObject)) - { - case itCELL: - pProperties->Type = TYPE_CELL; - lpi->GetCellName (pProperties->szName); - break; - - case itSERVER: - pProperties->Type = TYPE_SERVER; - pProperties->idParentCell = (ASID)( lpi->GetCell() ); - lpi->GetServerName (pProperties->szName); - break; - - case itSERVICE: - pProperties->Type = TYPE_SERVICE; - pProperties->idParentCell = (ASID)( lpi->GetCell() ); - pProperties->idParentServer = (ASID)( lpi->GetServer() ); - lpi->GetServiceName (pProperties->szName); - break; - - case itAGGREGATE: - pProperties->Type = TYPE_PARTITION; - pProperties->idParentCell = (ASID)( lpi->GetCell() ); - pProperties->idParentServer = (ASID)( lpi->GetServer() ); - lpi->GetAggregateName (pProperties->szName); - break; - - case itFILESET: - pProperties->Type = TYPE_VOLUME; - pProperties->idParentCell = (ASID)( lpi->GetCell() ); - pProperties->idParentServer = (ASID)( lpi->GetServer() ); - pProperties->idParentPartition = (ASID)( lpi->GetAggregate() ); - lpi->GetFilesetName (pProperties->szName); - break; - - case itUSER: - pProperties->Type = TYPE_USER; - pProperties->idParentCell = (ASID)( lpi->GetCell() ); - lpi->GetUserName (pProperties->szName); - break; - - case itGROUP: - pProperties->Type = TYPE_GROUP; - pProperties->idParentCell = (ASID)( lpi->GetCell() ); - lpi->GetGroupName (pProperties->szName); - break; - - default: - pProperties->verProperties = verPROP_NO_OBJECT; - return; - } - - if (pProperties->verProperties == verPROP_NO_OBJECT) - pProperties->verProperties = verPROP_RUDIMENTARY; -} - - -BOOL AfsAdmSvr_ObtainFullProperties (LPASOBJPROP pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - AfsAdmSvr_ObtainRudimentaryProperties (pProperties); - - if (pProperties->verProperties != verPROP_NO_OBJECT) - { - LPIDENT lpi = (LPIDENT)(pProperties->idObject); - - switch (GetAsidType (pProperties->idObject)) - { - case itCELL: - PTSPROPERTIES PtsProperties; - if ((rc = AfsClass_GetPtsProperties (lpi, &PtsProperties, &status)) == TRUE) - { - pProperties->u.CellProperties.idUserMax = (DWORD)PtsProperties.idUserMax; - pProperties->u.CellProperties.idGroupMax = (DWORD)PtsProperties.idGroupMax; - } - break; - - case itSERVER: - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - SERVERSTATUS ss; - if (!lpServer->GetStatus (&ss, TRUE, &status)) - rc = FALSE; - else - { - pProperties->u.ServerProperties.nAddresses = 0; - for (size_t ii = 0; ii < ss.nAddresses; ++ii) - { - if (!ss.aAddresses[ii].sin_addr.s_addr) - continue; - if (pProperties->u.ServerProperties.nAddresses < ASOBJPROP_SERVER_MAXADDRESS) - { - pProperties->u.ServerProperties.aAddresses[ pProperties->u.ServerProperties.nAddresses ] = ntohl(ss.aAddresses[ii].sin_addr.s_addr); - pProperties->u.ServerProperties.nAddresses ++; - } - } - } - lpServer->Close(); - } - break; - - case itSERVICE: - LPSERVICE lpService; - if ((lpService = lpi->OpenService (&status)) == NULL) - rc = FALSE; - else - { - SERVICESTATUS ss; - if (!lpService->GetStatus (&ss, TRUE, &status)) - rc = FALSE; - else - { - pProperties->u.ServiceProperties.ServiceType = ss.type; - pProperties->u.ServiceProperties.ServiceState = ss.state; - lstrcpy (pProperties->u.ServiceProperties.szAuxStatus, ss.szAuxStatus); - lstrcpy (pProperties->u.ServiceProperties.szParams, ss.szParams); - lstrcpy (pProperties->u.ServiceProperties.szNotifier, ss.szNotifier); - memcpy (&pProperties->u.ServiceProperties.timeLastStart, &ss.timeLastStart, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.ServiceProperties.timeLastStop, &ss.timeLastStop, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.ServiceProperties.timeLastFail, &ss.timeLastFail, sizeof(SYSTEMTIME)); - pProperties->u.ServiceProperties.nStarts = ss.nStarts; - pProperties->u.ServiceProperties.dwErrLast = ss.dwErrLast; - pProperties->u.ServiceProperties.dwSigLast = ss.dwSigLast; - } - lpService->Close(); - } - break; - - case itAGGREGATE: - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate(&status)) == NULL) - rc = FALSE; - else - { - AGGREGATESTATUS as; - if (!lpAggregate->GetStatus (&as, TRUE, &status)) - rc = FALSE; - else - { - pProperties->u.PartitionProperties.dwID = as.dwID; - pProperties->u.PartitionProperties.ckStorageTotal = as.ckStorageTotal; - pProperties->u.PartitionProperties.ckStorageFree = as.ckStorageFree; - pProperties->u.PartitionProperties.ckStorageAllocated = as.ckStorageAllocated; - } - lpAggregate->Close(); - } - break; - - case itFILESET: - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset(&status)) == NULL) - rc = FALSE; - else - { - FILESETSTATUS fs; - if (!lpFileset->GetStatus (&fs, TRUE, &status)) - rc = FALSE; - else - { - pProperties->u.VolumeProperties.id = fs.id; - pProperties->u.VolumeProperties.idReadWrite = fs.idReadWrite; - pProperties->u.VolumeProperties.idReplica = fs.idReplica; - pProperties->u.VolumeProperties.idClone = fs.idClone; - memcpy (&pProperties->u.VolumeProperties.timeCreation, &fs.timeCreation, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.VolumeProperties.timeLastUpdate, &fs.timeLastUpdate, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.VolumeProperties.timeLastAccess, &fs.timeLastAccess, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.VolumeProperties.timeLastBackup, &fs.timeLastBackup, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.VolumeProperties.timeCopyCreation, &fs.timeCopyCreation, sizeof(SYSTEMTIME)); - pProperties->u.VolumeProperties.nFiles = fs.nFiles; - pProperties->u.VolumeProperties.ckQuota = fs.ckQuota; - pProperties->u.VolumeProperties.ckUsed = fs.ckUsed; - pProperties->u.VolumeProperties.FilesetType = fs.Type; - pProperties->u.VolumeProperties.FilesetState = fs.State; - } - lpFileset->Close(); - } - break; - - case itUSER: - LPUSER lpUser; - if ((lpUser = lpi->OpenUser (&status)) == NULL) - rc = FALSE; - else - { - USERSTATUS us; - if (!lpUser->GetStatus (&us, TRUE, &status)) - rc = FALSE; - else - { - lpUser->GetName (NULL, pProperties->u.UserProperties.szInstance); - - if ((pProperties->u.UserProperties.fHaveKasInfo = us.fHaveKasInfo) == TRUE) - { - pProperties->u.UserProperties.KASINFO.fIsAdmin = us.KASINFO.fIsAdmin; - pProperties->u.UserProperties.KASINFO.fCanGetTickets = us.KASINFO.fCanGetTickets; - pProperties->u.UserProperties.KASINFO.fEncrypt = us.KASINFO.fEncrypt; - pProperties->u.UserProperties.KASINFO.fCanChangePassword = us.KASINFO.fCanChangePassword; - pProperties->u.UserProperties.KASINFO.fCanReusePasswords = us.KASINFO.fCanReusePasswords; - memcpy (&pProperties->u.UserProperties.KASINFO.timeExpires, &us.KASINFO.timeExpires, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.UserProperties.KASINFO.timeLastPwChange, &us.KASINFO.timeLastPwChange, sizeof(SYSTEMTIME)); - memcpy (&pProperties->u.UserProperties.KASINFO.timeLastMod, &us.KASINFO.timeLastMod, sizeof(SYSTEMTIME)); - pProperties->u.UserProperties.KASINFO.szUserLastMod[0] = TEXT('\0'); - pProperties->u.UserProperties.KASINFO.csecTicketLifetime = us.KASINFO.csecTicketLifetime; - pProperties->u.UserProperties.KASINFO.keyVersion = us.KASINFO.keyVersion; - memcpy (&pProperties->u.UserProperties.KASINFO.keyData, us.KASINFO.key.key, ENCRYPTIONKEYLENGTH); - pProperties->u.UserProperties.KASINFO.dwKeyChecksum = us.KASINFO.dwKeyChecksum; - pProperties->u.UserProperties.KASINFO.cdayPwExpire = us.KASINFO.cdayPwExpire; - pProperties->u.UserProperties.KASINFO.cFailLogin = us.KASINFO.cFailLogin; - pProperties->u.UserProperties.KASINFO.csecFailLoginLock = us.KASINFO.csecFailLoginLock; - if (us.KASINFO.lpiLastMod) - us.KASINFO.lpiLastMod->GetUserName (pProperties->u.UserProperties.KASINFO.szUserLastMod); - } - if ((pProperties->u.UserProperties.fHavePtsInfo = us.fHavePtsInfo) == TRUE) - { - pProperties->u.UserProperties.PTSINFO.cgroupCreationQuota = us.PTSINFO.cgroupCreationQuota; - pProperties->u.UserProperties.PTSINFO.cgroupMember = us.PTSINFO.cgroupMember; - pProperties->u.UserProperties.PTSINFO.uidName = us.PTSINFO.uidName; - pProperties->u.UserProperties.PTSINFO.uidOwner = us.PTSINFO.uidOwner; - pProperties->u.UserProperties.PTSINFO.uidCreator = us.PTSINFO.uidCreator; - lstrcpy (pProperties->u.UserProperties.PTSINFO.szOwner, us.PTSINFO.szOwner); - lstrcpy (pProperties->u.UserProperties.PTSINFO.szCreator, us.PTSINFO.szCreator); - pProperties->u.UserProperties.PTSINFO.aaListStatus = us.PTSINFO.aaListStatus; - pProperties->u.UserProperties.PTSINFO.aaGroupsOwned = us.PTSINFO.aaGroupsOwned; - pProperties->u.UserProperties.PTSINFO.aaMembership = us.PTSINFO.aaMembership; - } - } - lpUser->Close(); - } - break; - - case itGROUP: - lpi->GetGroupName (pProperties->szName); - - LPPTSGROUP lpGroup; - if ((lpGroup = lpi->OpenGroup (&status)) == NULL) - rc = FALSE; - else - { - PTSGROUPSTATUS gs; - if (!lpGroup->GetStatus (&gs, TRUE, &status)) - rc = FALSE; - else - { - pProperties->u.GroupProperties.nMembers = gs.nMembers; - pProperties->u.GroupProperties.uidName = gs.uidName; - pProperties->u.GroupProperties.uidOwner = gs.uidOwner; - pProperties->u.GroupProperties.uidCreator = gs.uidCreator; - pProperties->u.GroupProperties.aaListStatus = gs.aaListStatus; - pProperties->u.GroupProperties.aaListGroupsOwned = gs.aaListGroupsOwned; - pProperties->u.GroupProperties.aaListMembers = gs.aaListMembers; - pProperties->u.GroupProperties.aaAddMember = gs.aaAddMember; - pProperties->u.GroupProperties.aaDeleteMember = gs.aaDeleteMember; - lstrcpy (pProperties->u.GroupProperties.szOwner, gs.szOwner); - lstrcpy (pProperties->u.GroupProperties.szCreator, gs.szCreator); - } - lpGroup->Close(); - } - break; - } - } - - if (rc && (pProperties->verProperties < verPROP_FIRST_SCAN)) - pProperties->verProperties = verPROP_FIRST_SCAN; - - if (!rc) - pProperties->verProperties = verPROP_NO_OBJECT; - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_PropertiesDiffer (LPASOBJPROP pProp1, LPASOBJPROP pProp2) -{ - if (pProp1->idObject != pProp2->idObject) - return TRUE; - if (pProp1->Type != pProp2->Type) - return TRUE; - if (pProp1->idParentCell != pProp2->idParentCell) - return TRUE; - if (pProp1->idParentServer != pProp2->idParentServer) - return TRUE; - if (pProp1->idParentPartition != pProp2->idParentPartition) - return TRUE; - if (lstrcmp (pProp1->szName, pProp2->szName)) - return TRUE; - if (memcmp (&pProp1->u, &pProp2->u, sizeof(pProp1->u))) - return TRUE; - - return FALSE; -} - - -void AfsAdmSvr_TestProperties (ASID idObject) -{ - LPASOBJPROP pProperties; - if ((pProperties = (LPASOBJPROP)((LPIDENT)idObject)->GetUserParam()) == NULL) - return; - - if (pProperties->verProperties >= verPROP_FIRST_SCAN) - { - ASOBJPROP NewProperties; - memcpy (&NewProperties, pProperties, sizeof(ASOBJPROP)); - memset (&NewProperties.u, 0x00, sizeof(NewProperties.u)); - - if (AfsAdmSvr_ObtainFullProperties (&NewProperties)) - { - if (AfsAdmSvr_PropertiesDiffer (&NewProperties, pProperties)) - { - LPIDENT lpi = (LPIDENT)(pProperties->idObject); - - LPASOBJPROP pStoredProp; - if ((pStoredProp = (LPASOBJPROP)(lpi->GetUserParam())) != NULL) - { - pStoredProp->idParentCell = NewProperties.idParentCell; - pStoredProp->idParentServer = NewProperties.idParentServer; - pStoredProp->idParentPartition = NewProperties.idParentPartition; - lstrcpy (pStoredProp->szName, NewProperties.szName); - memcpy (&pStoredProp->u, &NewProperties.u, sizeof(NewProperties.u)); - pStoredProp->verProperties ++; - } - } - } - } -} - - -BOOL CALLBACK AfsAdmSvr_NotifyCallback (NOTIFYEVENT evt, PNOTIFYPARAMS pParams) -{ - switch (evt) - { - case evtCreate: - LPIDENT lpiCreate; - if ((lpiCreate = pParams->lpi1) != NULL) - { - if ((lpiCreate->GetUserParam()) == NULL) - { - LPASOBJPROP pProperties = New (ASOBJPROP); - memset (pProperties, 0x00, sizeof(ASOBJPROP)); - pProperties->idObject = (ASID)lpiCreate; - AfsAdmSvr_ObtainRudimentaryProperties (pProperties); - lpiCreate->SetUserParam(pProperties); - } - - AfsAdmSvr_TestProperties ((ASID)lpiCreate); - } - break; - - case evtDestroy: - if (GetAsidType ((ASID)pParams->lpi1) == itCELL) - AfsAdmSvr_StopCellRefreshThread ((ASID)(pParams->lpi1)); - break; - - case evtRefreshAllBegin: - AfsAdmSvr_Action_StartRefresh ((ASID)(pParams->lpi1)); - break; - - case evtRefreshAllEnd: - AfsAdmSvr_Action_StopRefresh ((ASID)(pParams->lpi1)); - break; - - case evtRefreshStatusEnd: - AfsAdmSvr_TestProperties ((ASID)(pParams->lpi1)); - break; - } - - return TRUE; -} - - -LPASOBJPROP AfsAdmSvr_GetCurrentProperties (ASID idObject, ULONG *pStatus) -{ - switch (GetAsidType (idObject)) - { - case itCELL: - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idObject)->OpenCell (pStatus)) == NULL) - return NULL; - lpCell->Close(); - break; - - case itSERVER: - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idObject)->OpenServer (pStatus)) == NULL) - return NULL; - lpServer->Close(); - break; - - case itSERVICE: - LPSERVICE lpService; - if ((lpService = ((LPIDENT)idObject)->OpenService (pStatus)) == NULL) - return NULL; - lpService->Close(); - break; - - case itAGGREGATE: - LPAGGREGATE lpAggregate; - if ((lpAggregate = ((LPIDENT)idObject)->OpenAggregate (pStatus)) == NULL) - return NULL; - lpAggregate->Close(); - break; - - case itFILESET: - LPFILESET lpFileset; - if ((lpFileset = ((LPIDENT)idObject)->OpenFileset (pStatus)) == NULL) - return NULL; - lpFileset->Close(); - break; - - case itUSER: - LPUSER lpUser; - if ((lpUser = ((LPIDENT)idObject)->OpenUser (pStatus)) == NULL) - return NULL; - lpUser->Close(); - break; - - case itGROUP: - LPPTSGROUP lpGroup; - if ((lpGroup = ((LPIDENT)idObject)->OpenGroup (pStatus)) == NULL) - return NULL; - lpGroup->Close(); - break; - - default: - return (LPASOBJPROP)FALSE_(ERROR_INVALID_PARAMETER,pStatus); - } - - LPASOBJPROP pCurrentProperties; - if ((pCurrentProperties = (LPASOBJPROP)((LPIDENT)idObject)->GetUserParam()) == NULL) - { - return (LPASOBJPROP)FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus); - } - - return pCurrentProperties; -} - - -BOOL AfsAdmSvr_InvalidateObjectProperties (ASID idObject, ULONG *pStatus) -{ - switch (GetAsidType (idObject)) - { - case itCELL: - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idObject)->OpenCell (pStatus)) == NULL) - return FALSE; - lpCell->Invalidate(); - lpCell->Close(); - break; - - case itSERVER: - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idObject)->OpenServer (pStatus)) == NULL) - return FALSE; - lpServer->Invalidate(); - lpServer->Close(); - break; - - case itSERVICE: - LPSERVICE lpService; - if ((lpService = ((LPIDENT)idObject)->OpenService (pStatus)) == NULL) - return FALSE; - lpService->Invalidate(); - lpService->Close(); - break; - - case itAGGREGATE: - LPAGGREGATE lpAggregate; - if ((lpAggregate = ((LPIDENT)idObject)->OpenAggregate (pStatus)) == NULL) - return FALSE; - lpAggregate->Invalidate(); - lpAggregate->Close(); - break; - - case itFILESET: - LPFILESET lpFileset; - if ((lpFileset = ((LPIDENT)idObject)->OpenFileset (pStatus)) == NULL) - return FALSE; - lpFileset->Invalidate(); - lpFileset->Close(); - break; - - case itUSER: - LPUSER lpUser; - if ((lpUser = ((LPIDENT)idObject)->OpenUser (pStatus)) == NULL) - return FALSE; - lpUser->Invalidate(); - lpUser->Close(); - break; - - case itGROUP: - LPPTSGROUP lpGroup; - if ((lpGroup = ((LPIDENT)idObject)->OpenGroup (pStatus)) == NULL) - return FALSE; - lpGroup->Invalidate(); - lpGroup->Close(); - break; - - default: - return FALSE_(ERROR_INVALID_PARAMETER,pStatus); - } - - return TRUE; -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.h deleted file mode 100644 index 7a732af8a..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrProperties.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRPROPERTIES_H -#define TAAFSADMSVRPROPERTIES_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK AfsAdmSvr_NotifyCallback (NOTIFYEVENT evt, PNOTIFYPARAMS pParams); - -void AfsAdmSvr_ObtainRudimentaryProperties (LPASOBJPROP pProperties); -BOOL AfsAdmSvr_ObtainFullProperties (LPASOBJPROP pProperties, ULONG *pStatus = NULL); - -LPASOBJPROP AfsAdmSvr_GetCurrentProperties (ASID idObject, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_InvalidateObjectProperties (ASID idObject, ULONG *pStatus = NULL); -void AfsAdmSvr_TestProperties (ASID idObject); - -void AfsAdmSvr_SetCellRefreshRate (ASID idCell, ULONG cminRefreshRate); -void AfsAdmSvr_StopCellRefreshThread (ASID idCell); -void AfsAdmSvr_MarkRefreshThread (ASID idCell); - - -#endif // TAAFSADMSVRPROPERTIES_H diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.cpp deleted file mode 100644 index a9f1fbac1..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.cpp +++ /dev/null @@ -1,928 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - -#define c100ns1SECOND ((LONGLONG)10000000) - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL IsValidTime (LPSYSTEMTIME pst) -{ - return (pst->wYear > 1970) ? TRUE : FALSE; -} - - -BOOL AfsAdmSvr_Search_Compare (LPTSTR pszName, LPTSTR pszPattern) -{ - // An empty pattern matches everyone - // - if (!pszPattern || !*pszPattern) - return TRUE; - - // Cache the expression so we only have to compile it when it changes. - // We also add a little convenience measure: you can prepend "!" to any - // regexp to negate the entire sense of the regexp--for instance, "!ri" - // matches every word which doesn't have "ri" in it. - // - static LPREGEXP pLastExpr = NULL; - static TCHAR szLastExpression[ 1024 ] = TEXT(""); - static BOOL fLastInclusive = TRUE; - - if (lstrcmp (pszPattern, szLastExpression)) - { - if (pLastExpr) - Delete (pLastExpr); - lstrcpy (szLastExpression, pszPattern); - if ((fLastInclusive = (*pszPattern != TEXT('!'))) == FALSE) - ++pszPattern; - pLastExpr = New2 (REGEXP,(pszPattern)); - } - - if (!pLastExpr) // this shouldn't happen, but be safe anyway - return TRUE; - - return ((pLastExpr->Matches (pszName)) == fLastInclusive); -} - - -BOOL AfsAdmSvr_Search_Compare (LPIDENT lpi, LPTSTR pszPattern) -{ - if (lpi->GetRefCount() == 0) - return FALSE; - - TCHAR szName[ cchSTRING ]; - switch (lpi->GetType()) - { - case itCELL: - lpi->GetCellName (szName); - break; - case itSERVER: - lpi->GetLongServerName (szName); - break; - case itSERVICE: - lpi->GetServiceName (szName); - break; - case itAGGREGATE: - lpi->GetAggregateName (szName); - break; - case itFILESET: - lpi->GetFilesetName (szName); - break; - case itUSER: - lpi->GetUserName (szName); - break; - case itGROUP: - lpi->GetGroupName (szName); - break; - default: - return FALSE; - } - - return AfsAdmSvr_Search_Compare (szName, pszPattern); -} - - -BOOL AfsAdmSvr_SearchRefresh (ASID idSearchScope, ASOBJTYPE ObjectType, AFSADMSVR_SEARCH_REFRESH SearchRefresh, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (SearchRefresh == SEARCH_ALL_OBJECTS) - { - if (GetAsidType (idSearchScope) == itCELL) - { - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idSearchScope)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->RefreshAll(); - lpCell->Close(); - } - } - else // (GetAsidType (idSearchScope) != itCELL) - { - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idSearchScope)->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - // What do we need to refresh on this server? - switch (ObjectType) - { - case TYPE_SERVICE: - lpServer->RefreshStatus(); - lpServer->RefreshServices(); - break; - - case TYPE_PARTITION: - case TYPE_VOLUME: - lpServer->RefreshStatus(); - lpServer->RefreshAggregates(); - break; - - default: - lpServer->RefreshAll(); - break; - } - lpServer->Close(); - } - } - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_AllInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (!AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - continue; - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_ServersInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum, TRUE, &status); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - LPIDENT lpiFind = lpServer->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpServer->Close(); - } - lpCell->ServerFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_ServicesInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itSERVICE) - continue; - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (!AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - continue; - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_PartitionsInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itAGGREGATE) - continue; - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (!AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - continue; - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_VolumesInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itFILESET) - continue; - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (!AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - continue; - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_UsersInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPUSER lpUser = lpCell->UserFindFirst (&hEnum, TRUE, &status); lpUser; lpUser = lpCell->UserFindNext (&hEnum)) - { - LPIDENT lpiFind = lpUser->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpUser->Close(); - } - lpCell->UserFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_GroupsInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPPTSGROUP lpGroup = lpCell->GroupFindFirst (&hEnum, TRUE, &status); lpGroup; lpGroup = lpCell->GroupFindNext (&hEnum)) - { - LPIDENT lpiFind = lpGroup->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpGroup->Close(); - } - lpCell->GroupFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_AllInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idServer)->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&hEnum, TRUE, &status); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&hEnum)) - { - LPIDENT lpiFind = lpAggregate->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpAggregate->Close(); - } - lpServer->AggregateFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - else - { - for (LPSERVICE lpService = lpServer->ServiceFindFirst (&hEnum, TRUE, &status); lpService; lpService = lpServer->ServiceFindNext (&hEnum)) - { - LPIDENT lpiFind = lpService->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpService->Close(); - } - lpServer->ServiceFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - } - lpServer->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_ServicesInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idServer)->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPSERVICE lpService = lpServer->ServiceFindFirst (&hEnum, TRUE, &status); lpService; lpService = lpServer->ServiceFindNext (&hEnum)) - { - LPIDENT lpiFind = lpService->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpService->Close(); - } - lpServer->ServiceFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - lpServer->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_PartitionsInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idServer)->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&hEnum, TRUE, &status); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&hEnum)) - { - LPIDENT lpiFind = lpAggregate->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpAggregate->Close(); - } - lpServer->AggregateFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - lpServer->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_VolumesInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itFILESET) - continue; - if (lpiFind->GetServer() != (LPIDENT)idServer) - continue; - if (!AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - continue; - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_VolumesInPartition (LPASIDLIST *ppList, ASID idPartition, LPTSTR pszPattern, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = ((LPIDENT)idPartition)->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - HENUM hEnum; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&hEnum, TRUE, &status); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&hEnum)) - { - LPIDENT lpiFind = lpFileset->GetIdentifier(); - if (AfsAdmSvr_Search_Compare (lpiFind, pszPattern)) - AfsAdmSvr_AddToAsidList (ppList, (ASID)lpiFind, 0); - lpFileset->Close(); - } - lpAggregate->FilesetFindClose (&hEnum); - if (status && (status != ADMITERATORDONE)) - rc = FALSE; - lpAggregate->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_ServerInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - LPSERVER lpServer; - if ((lpServer = lpCell->OpenServer (pszName, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpServer->GetIdentifier()); - lpServer->Close(); - } - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_ServiceInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_INVALID_PARAMETER; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itSERVICE) - continue; - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (lpiFind->GetRefCount() == 0) - return FALSE; - - TCHAR szService[ cchNAME ]; - lpiFind->GetServiceName (szService); - if (!lstrcmpi (pszName, szService)) - { - *pidObject = (ASID)lpiFind; - rc = TRUE; - break; - } - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_PartitionInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_INVALID_PARAMETER; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itAGGREGATE) - continue; - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (lpiFind->GetRefCount() == 0) - return FALSE; - - TCHAR szAggregate[ cchNAME ]; - lpiFind->GetAggregateName (szAggregate); - if (!lstrcmpi (pszName, szAggregate)) - { - *pidObject = (ASID)lpiFind; - rc = TRUE; - break; - } - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_VolumeInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_INVALID_PARAMETER; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itFILESET) - continue; - if (lpiFind->GetCell() != (LPIDENT)idCell) - continue; - if (lpiFind->GetRefCount() == 0) - return FALSE; - - TCHAR szFileset[ cchNAME ]; - lpiFind->GetFilesetName (szFileset); - if (!lstrcmpi (szFileset, pszName)) - { - *pidObject = (ASID)lpiFind; - rc = TRUE; - break; - } - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_UserInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - LPUSER lpUser; - if ((lpUser = lpCell->OpenUser (pszName, NULL, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpUser->GetIdentifier()); - lpUser->Close(); - } - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_GroupInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - LPPTSGROUP lpGroup; - if ((lpGroup = lpCell->OpenGroup (pszName, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpGroup->GetIdentifier()); - lpGroup->Close(); - } - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_ServiceInServer (ASID *pidObject, ASID idServer, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idServer)->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - LPSERVICE lpService; - if ((lpService = lpServer->OpenService (pszName, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpService->GetIdentifier()); - lpService->Close(); - } - lpServer->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_PartitionInServer (ASID *pidObject, ASID idServer, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPSERVER lpServer; - if ((lpServer = ((LPIDENT)idServer)->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpServer->OpenAggregate (pszName, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpAggregate->GetIdentifier()); - lpAggregate->Close(); - } - lpServer->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_VolumeInServer (ASID *pidObject, ASID idServer, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_INVALID_PARAMETER; - - HENUM hEnum; - for (LPIDENT lpiFind = IDENT::FindFirst (&hEnum); lpiFind; lpiFind = IDENT::FindNext (&hEnum)) - { - if (lpiFind->GetType() != itFILESET) - continue; - if (lpiFind->GetServer() != (LPIDENT)idServer) - continue; - if (lpiFind->GetRefCount() == 0) - return FALSE; - - TCHAR szFileset[ cchNAME ]; - lpiFind->GetFilesetName (szFileset); - if (!lstrcmpi (pszName, szFileset)) - { - *pidObject = (ASID)lpiFind; - rc = TRUE; - break; - } - } - IDENT::FindClose (&hEnum); - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_VolumeInPartition (ASID *pidObject, ASID idPartition, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = ((LPIDENT)idPartition)->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - LPFILESET lpFileset; - if ((lpFileset = lpAggregate->OpenFileset (pszName, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpFileset->GetIdentifier()); - lpFileset->Close(); - } - lpAggregate->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAdmSvr_Search_OneUser (ASID *pidObject, ASID idScope, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idScope)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - LPUSER lpUser; - if ((lpUser = lpCell->OpenUser (pszName, TEXT(""), &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpUser->GetIdentifier()); - lpUser->Close(); - } - - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - -BOOL AfsAdmSvr_Search_OneGroup (ASID *pidObject, ASID idScope, LPTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - LPCELL lpCell; - if ((lpCell = ((LPIDENT)idScope)->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - LPPTSGROUP lpGroup; - if ((lpGroup = lpCell->OpenGroup (pszName, &status)) == NULL) - rc = FALSE; - else - { - *pidObject = (ASID)(lpGroup->GetIdentifier()); - lpGroup->Close(); - } - - lpCell->Close(); - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -void AfsAdmSvr_Search_Advanced (LPASIDLIST *ppList, LPAFSADMSVR_SEARCH_PARAMS pSearchParams) -{ - ULONG status; - - if (ppList && (*ppList) && pSearchParams && (pSearchParams->SearchType != SEARCH_NO_LIMITATIONS)) - { - for (size_t iEntry = 0; iEntry < (*ppList)->cEntries; ) - { - BOOL fDelete = TRUE; - - // Try to grab the properties for this object. If we succeed, - // we can determine if the object matches the necessary criteria - // to indicate we should keep it in the list. - // - ASID idObject = (*ppList)->aEntries[ iEntry ].idObject; - - LPASOBJPROP pProperties; - if ((pProperties = AfsAdmSvr_GetCurrentProperties (idObject, &status)) != NULL) - { - if ( (pProperties->verProperties >= verPROP_FIRST_SCAN) || - (AfsAdmSvr_ObtainFullProperties (pProperties, &status)) ) - { - // We managed to get the full properties for this object. - // Now check its properties against our search criteria-- - // only if it has exactly the necessary criteria will we - // clear {fDelete}. - // - switch (pSearchParams->SearchType) - { - case SEARCH_EXPIRES_BEFORE: - if ((pProperties->Type == TYPE_USER) && (pProperties->u.UserProperties.fHaveKasInfo)) - { - if (IsValidTime (&pProperties->u.UserProperties.KASINFO.timeExpires)) - { - FILETIME ftExpires; - SystemTimeToFileTime (&pProperties->u.UserProperties.KASINFO.timeExpires, &ftExpires); - - FILETIME ftThreshhold; - SystemTimeToFileTime (&pSearchParams->SearchTime, &ftThreshhold); - - if (CompareFileTime (&ftExpires, &ftThreshhold) <= 0) - fDelete = FALSE; - } - } - break; - - case SEARCH_PASSWORD_EXPIRES_BEFORE: - if ((pProperties->Type == TYPE_USER) && (pProperties->u.UserProperties.fHaveKasInfo)) - { - if (pProperties->u.UserProperties.KASINFO.cdayPwExpire) - { - FILETIME ftPwExpires; - SystemTimeToFileTime (&pProperties->u.UserProperties.KASINFO.timeLastPwChange, &ftPwExpires); - - // A FILETIME is a count-of-100ns-intervals since 1601. - // We need to increase the {ftPwExpires} time by the - // number of days in KASINFO.cdayPwExpires, so we'll - // be adding a big number to our FILETIME structure. - // - LARGE_INTEGER ldw; - ldw.HighPart = ftPwExpires.dwHighDateTime; - ldw.LowPart = ftPwExpires.dwLowDateTime; - ldw.QuadPart += c100ns1SECOND * (LONGLONG)csec1DAY * (LONGLONG)pProperties->u.UserProperties.KASINFO.cdayPwExpire; - ftPwExpires.dwHighDateTime = (DWORD)ldw.HighPart; - ftPwExpires.dwLowDateTime = (DWORD)ldw.LowPart; - - FILETIME ftThreshhold; - SystemTimeToFileTime (&pSearchParams->SearchTime, &ftThreshhold); - - if (CompareFileTime (&ftPwExpires, &ftThreshhold) <= 0) - fDelete = FALSE; - } - } - break; - } - } - } - - // Okay, we've made our choice--remove it, or not. - // - if (fDelete) - AfsAdmSvr_RemoveFromAsidListByIndex (ppList, iEntry); - else - ++iEntry; - } - } -} - diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.h b/src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.h deleted file mode 100644 index 2332ecddd..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrSearch.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSADMSVRSEARCH_H -#define TAAFSADMSVRSEARCH_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL AfsAdmSvr_SearchRefresh (ASID idSearchScope, ASOBJTYPE ObjectType, AFSADMSVR_SEARCH_REFRESH SearchRefresh, ULONG *pStatus); - -BOOL AfsAdmSvr_Search_AllInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_ServersInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_ServicesInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_PartitionsInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_VolumesInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_UsersInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_GroupsInCell (LPASIDLIST *ppList, ASID idCell, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_AllInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_ServicesInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_PartitionsInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_VolumesInServer (LPASIDLIST *ppList, ASID idServer, LPTSTR pszPattern, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_VolumesInPartition (LPASIDLIST *ppList, ASID idPartition, LPTSTR pszPattern, ULONG *pStatus = NULL); - -BOOL AfsAdmSvr_Search_ServerInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_ServiceInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_PartitionInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_VolumeInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_UserInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_GroupInCell (ASID *pidObject, ASID idCell, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_ServiceInServer (ASID *pidObject, ASID idServer, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_PartitionInServer (ASID *pidObject, ASID idServer, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_VolumeInServer (ASID *pidObject, ASID idServer, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_VolumeInPartition (ASID *pidObject, ASID idPartition, LPTSTR pszName, ULONG *pStatus = NULL); - -BOOL AfsAdmSvr_Search_OneUser (ASID *pidObject, ASID idScope, LPTSTR pszName, ULONG *pStatus = NULL); -BOOL AfsAdmSvr_Search_OneGroup (ASID *pidObject, ASID idScope, LPTSTR pszName, ULONG *pStatus = NULL); - -void AfsAdmSvr_Search_Advanced (LPASIDLIST *ppList, LPAFSADMSVR_SEARCH_PARAMS pSearchParams); - -#endif // TAAFSADMSVRSEARCH_H diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrUser.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrUser.cpp deleted file mode 100644 index 7e5e333b2..000000000 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrUser.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsAdmSvrInternal.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - - // AfsAdmSvr_ChangeUser - // ...changes a user account's properties. - // -extern "C" int AfsAdmSvr_ChangeUser (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_CHANGEUSER_PARAMS pChange, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_USER_CHANGE; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.User_Change.idUser = idUser; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeUser (idUser=0x%08lX)"), idClient, idUser); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Find this user's current properties - // - LPASOBJPROP pCurrentProperties; - if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idUser, pStatus)) == NULL) - { - Print (dlERROR, TEXT("Client 0x%08lX: ChangeUser failed; no properties"), idClient); - AfsAdmSvr_EndOperation (iOp); - return FALSE; - } - - // Build an AFSCLASS-style USERPROPERTIES structure that reflects the - // new properties for the user; mark the structure's dwMask bit to indicate - // what we're changing. - // - USERPROPERTIES NewProperties; - memset (&NewProperties, 0x00, sizeof(NewProperties)); - - if ((NewProperties.fAdmin = pChange->fIsAdmin) != pCurrentProperties->u.UserProperties.KASINFO.fIsAdmin) - NewProperties.dwMask |= MASK_USERPROP_fAdmin; - if ((NewProperties.fGrantTickets = pChange->fCanGetTickets) != pCurrentProperties->u.UserProperties.KASINFO.fCanGetTickets) - NewProperties.dwMask |= MASK_USERPROP_fGrantTickets; - if ((NewProperties.fCanEncrypt = pChange->fEncrypt) != pCurrentProperties->u.UserProperties.KASINFO.fEncrypt) - NewProperties.dwMask |= MASK_USERPROP_fCanEncrypt; - if ((NewProperties.fCanChangePassword = pChange->fCanChangePassword) != pCurrentProperties->u.UserProperties.KASINFO.fCanChangePassword) - NewProperties.dwMask |= MASK_USERPROP_fCanChangePassword; - if ((NewProperties.fCanReusePasswords = pChange->fCanReusePasswords) != pCurrentProperties->u.UserProperties.KASINFO.fCanReusePasswords) - NewProperties.dwMask |= MASK_USERPROP_fCanReusePasswords; - if ((NewProperties.cdayPwExpires = pChange->cdayPwExpire) != pCurrentProperties->u.UserProperties.KASINFO.cdayPwExpire) - NewProperties.dwMask |= MASK_USERPROP_cdayPwExpires; - if ((NewProperties.csecTicketLifetime = pChange->csecTicketLifetime) != pCurrentProperties->u.UserProperties.KASINFO.csecTicketLifetime) - NewProperties.dwMask |= MASK_USERPROP_csecTicketLifetime; - if ((NewProperties.nFailureAttempts = pChange->cFailLogin) != pCurrentProperties->u.UserProperties.KASINFO.cFailLogin) - NewProperties.dwMask |= MASK_USERPROP_nFailureAttempts; - if ((NewProperties.csecFailedLoginLockTime = pChange->csecFailLoginLock) != pCurrentProperties->u.UserProperties.KASINFO.csecFailLoginLock) - NewProperties.dwMask |= MASK_USERPROP_csecFailedLoginLockTime; - if ((NewProperties.cGroupCreationQuota = pChange->cgroupCreationQuota) != pCurrentProperties->u.UserProperties.PTSINFO.cgroupCreationQuota) - NewProperties.dwMask |= MASK_USERPROP_cGroupCreationQuota; - if ((NewProperties.aaListStatus = pChange->aaListStatus) != pCurrentProperties->u.UserProperties.PTSINFO.aaListStatus) - NewProperties.dwMask |= MASK_USERPROP_aaListStatus; - if ((NewProperties.aaGroupsOwned = pChange->aaGroupsOwned) != pCurrentProperties->u.UserProperties.PTSINFO.aaGroupsOwned) - NewProperties.dwMask |= MASK_USERPROP_aaGroupsOwned; - if ((NewProperties.aaMembership = pChange->aaMembership) != pCurrentProperties->u.UserProperties.PTSINFO.aaMembership) - NewProperties.dwMask |= MASK_USERPROP_aaMembership; - memcpy (&NewProperties.timeAccountExpires, &pChange->timeExpires, sizeof(SYSTEMTIME)); - if (memcmp (&NewProperties.timeAccountExpires, &pCurrentProperties->u.UserProperties.KASINFO.timeExpires, sizeof(SYSTEMTIME))) - NewProperties.dwMask |= MASK_USERPROP_timeAccountExpires; - - // If we've decided to change anything, call AfsClass to actually do it - // - if (NewProperties.dwMask == 0) - { - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeUser succeeded (nothing to do)"), idClient); - } - else - { - ULONG status; - if (!AfsClass_SetUserProperties ((LPIDENT)idUser, &NewProperties, &status)) - { - Print (dlERROR, TEXT("Client 0x%08lX: ChangeUser failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeUser succeeded"), idClient); - } - - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_SetUserPassword - // ...changes the password for the specified user account. Pass a non-empty - // string in {keyString} to encrypt the specified string; otherwise, - // pass a valid encryption key in {keyData}. - // -extern "C" int AfsAdmSvr_SetUserPassword (DWORD idClient, ASID idCell, ASID idUser, int keyVersion, STRING keyString, BYTE keyData[ ENCRYPTIONKEYLENGTH ], ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - ASACTION Action; - Action.Action = ACTION_USER_PW_CHANGE; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.User_Pw_Change.idUser = idUser; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: SetUserPassword (idUser=0x%08lX)"), idClient, idUser); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Change the user's password - // - if (keyString && keyString[0]) - { - rc = AfsClass_SetUserPassword ((LPIDENT)idUser, keyVersion, keyString, &status); - } - else // (!keyString || !keyString[0]) - { - rc = AfsClass_SetUserPassword ((LPIDENT)idUser, keyVersion, (LPENCRYPTIONKEY)keyData, &status); - } - - if (!rc) - return FALSE_(status,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: SetUserPassword succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_UnlockUser - // ...unlocks a user's account - // -extern "C" int AfsAdmSvr_UnlockUser (DWORD idClient, ASID idCell, ASID idUser, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_USER_UNLOCK; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.User_Unlock.idUser = idUser; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: UnlockUser (idUser=0x%08lX)"), idClient, idUser); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Unlock the user's account - // - ULONG status; - if (!AfsClass_UnlockUser ((LPIDENT)idUser, &status)) - return FALSE_(status,pStatus,iOp); - - Print (dlDETAIL, TEXT("Client 0x%08lX: UnlockUser succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_CreateUser - // ...creates a new user account - // -extern "C" int AfsAdmSvr_CreateUser (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEUSER_PARAMS pCreate, ASID *pidUser, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_USER_CREATE; - Action.idClient = idClient; - Action.idCell = idCell; - lstrcpy (Action.u.User_Create.szUser, pCreate->szName); - lstrcpy (Action.u.User_Create.szInstance, pCreate->szInstance); - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: CreateUser (szUser=%s)"), idClient, pCreate->szName); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Create the user account - // - ULONG status; - LPIDENT lpiUser; - if ((lpiUser = AfsClass_CreateUser ((LPIDENT)idCell, pCreate->szName, pCreate->szInstance, pCreate->szPassword, pCreate->idUser, pCreate->fCreateKAS, pCreate->fCreatePTS, &status)) == NULL) - { - Print (dlERROR, TEXT("Client 0x%08lX: CreateUser failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - if (pidUser) - *pidUser = (ASID)lpiUser; - - // Creating a user account may change the max user ID - AfsAdmSvr_TestProperties (idCell); - - Print (dlDETAIL, TEXT("Client 0x%08lX: CreateUser succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - - - // AfsAdmSvr_DeleteUser - // ...deletes a user's account - // -extern "C" int AfsAdmSvr_DeleteUser (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_DELETEUSER_PARAMS pDelete, ULONG *pStatus) -{ - ASACTION Action; - Action.Action = ACTION_USER_DELETE; - Action.idClient = idClient; - Action.idCell = idCell; - Action.u.User_Delete.idUser = idUser; - size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action); - - Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteUser (idUser=0x%08lX)"), idClient, idUser); - - if (!AfsAdmSvr_fIsValidClient (idClient)) - return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp); - - // Delete the user's accounts - // - ULONG status; - if (!AfsClass_DeleteUser ((LPIDENT)idUser, pDelete->fDeleteKAS, pDelete->fDeletePTS, &status)) - { - Print (dlERROR, TEXT("Client 0x%08lX: DeleteUser failed; error 0x%08lX"), idClient, status); - return FALSE_(status,pStatus,iOp); - } - - Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteUser succeeded"), idClient); - AfsAdmSvr_EndOperation (iOp); - return TRUE; -} - diff --git a/src/WINNT/afsadmsvr/afsadmsvr.ico b/src/WINNT/afsadmsvr/afsadmsvr.ico deleted file mode 100644 index 89818478269151ce1440bc80d23aa60c7a0002e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3310 zcmc(hKWJN56vmHh!8IaaXUU+LM$MGW7YdnTg6Wh%mdxo;?(FSpC`d!G-dHdM?$iuz z)ec@l#||1ohvv@q(m)_XO5|dh3=*yB?eCl`3HeV3PrXm~-Fv?8{Q2H_*OEn6WL4Vj z4bk!ECnBG-Zfq3$&WgyVs{*gA$WLn`Uo=GSux~TBm@5LHgV@VQPlS*3dS&6xR))hN zs}k8hlC$oZTng#!@=@0dyuq$tRh^z8+uK{1-JB;?M*+1lC$$djmoK-fZk{<~KYX}_ zvyPn}rt)32s=8MzkkU}?PF?p5z_wH!Yz0F2(p6POer%qFdV{K}r=3o*MPTcy?$3C& z>#Ca8ogMSX#w5N!_gB*qzoQN)z?5ZvG66Ck2l%dZyWOSu@nkaLd5I^3@?9RFnp9Q* z8#Y(;M=R_oZ>Ba35A2y)Jg^1-GA5Ps_FiUy#xDWmV$MAlW&xH=1gV1s@l?b~wq?p=BE zv znxZZNJg^Di0X%?fSOkyY5hH>}a28462|R%(fCQegGj>i^*>m?K_ayQJdA{GQJU5R9 zj|Pthj|P*329E}h29E}h29t>fj|Pthj|Pthla2|#Lrqy?TDsG(MW-arbz7w8L1tq9jR@v!)k+5KTkkOD4kg1*|TTz>eVZG@#2LX9v;f;*RSR6+qd%m{d+k%Ig#mfD&v2$eEBy`)e^u zPNfHp(cUr9ZttjoOLvRk9T^>uoO351KD3(Cg~wo@YcNt}zqZB{KRy~AHR;gIL+Sm& z=ooDb2dNy_%wu22U^F@^W9lG`pLzVEW4}pZ9ogs^Zz?Rl`M0stX(k>Q&2Lu`VI;8A zXq}hv%97t4+y%a{v-<9Q{G4qPuk~GXo?*FulZP<<7vlNpb;@e}d3?z*i_fs?#E-NI zJf|-=jnp4-eM+leG|b~IR%teLVWFV#CAG2m;IYUtk1w#^Z7g!k;sMFLJZ3ox-&B3) phvt~mtmkQLM^l!@1&<}JY|nUHU=>(+T*@vyKFVI5_`m<3`wz>*a+Lr8 diff --git a/src/WINNT/afsadmsvr/afsadmsvr.rc b/src/WINNT/afsadmsvr/afsadmsvr.rc deleted file mode 100644 index e49cccae2..000000000 --- a/src/WINNT/afsadmsvr/afsadmsvr.rc +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Administration Server" -#define AFS_VERINFO_NAME "afsadmsvr" -#define AFS_VERINFO_FILENAME "afsadmsvr.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afsadmsvr.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Administration Server DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\..\config\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsadmsvr/resource.h b/src/WINNT/afsadmsvr/resource.h deleted file mode 100644 index c963e2349..000000000 --- a/src/WINNT/afsadmsvr/resource.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDI_MAIN 102 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 103 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/afsapplib/.cvsignore b/src/WINNT/afsapplib/.cvsignore deleted file mode 100644 index 45415bdcd..000000000 --- a/src/WINNT/afsapplib/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -AFS_component_version_number.h -lang/AFS_component_version_number.h diff --git a/src/WINNT/afsapplib/NTMakefile b/src/WINNT/afsapplib/NTMakefile deleted file mode 100644 index df0fe9d45..000000000 --- a/src/WINNT/afsapplib/NTMakefile +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# indicate that the functions in this library should be exported - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -DEXPORT_AFSAPPLIB -DEXPORTED=_declspec(dllexport) - -# include the primary makefile - -RELDIR=WINNT\afsapplib -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ - -INCFILEDIR = $(DESTDIR)\include\WINNT - -ILIBDIR = $(DESTDIR)\lib\afs - -INCFILES = \ - $(INCFILEDIR)\afsapplib.h \ - $(INCFILEDIR)\al_admsvr.h \ - $(INCFILEDIR)\al_dynlink.h \ - $(INCFILEDIR)\al_messages.h \ - $(INCFILEDIR)\al_progress.h \ - $(INCFILEDIR)\al_resource.h \ - $(INCFILEDIR)\al_wizard.h \ - $(INCFILEDIR)\checklist.h \ - $(INCFILEDIR)\ctl_date.h \ - $(INCFILEDIR)\ctl_elapsed.h \ - $(INCFILEDIR)\ctl_sockaddr.h \ - $(INCFILEDIR)\ctl_spinner.h \ - $(INCFILEDIR)\ctl_time.h \ - $(INCFILEDIR)\dialog.h \ - $(INCFILEDIR)\fastlist.h \ - $(INCFILEDIR)\hashlist.h \ - $(INCFILEDIR)\regexp.h \ - $(INCFILEDIR)\resize.h \ - $(INCFILEDIR)\settings.h \ - $(INCFILEDIR)\subclass.h - -DLLOBJS = \ - $(OUT)\afsapplib_stub.res \ - $(OUT)\afsapplib.obj \ - $(OUT)\al_admsvr.obj \ - $(OUT)\al_browse.obj \ - $(OUT)\al_browseset.obj \ - $(OUT)\al_cover.obj \ - $(OUT)\al_creds.obj \ - $(OUT)\al_dynlink.obj \ - $(OUT)\al_error.obj \ - $(OUT)\al_help.obj \ - $(OUT)\al_misc.obj \ - $(OUT)\al_progress.obj \ - $(OUT)\al_pump.obj \ - $(OUT)\al_task.obj \ - $(OUT)\al_wizard.obj \ - $(OUT)\checklist.obj \ - $(OUT)\ctl_date.obj \ - $(OUT)\ctl_elapsed.obj \ - $(OUT)\ctl_sockaddr.obj \ - $(OUT)\ctl_spinner.obj \ - $(OUT)\ctl_time.obj \ - $(OUT)\dialog.obj \ - $(OUT)\fastlist.obj \ - $(OUT)\hashlist.obj \ - $(OUT)\regexp.obj \ - $(OUT)\resize.obj \ - $(OUT)\settings.obj \ - $(OUT)\subclass.obj - -VCLIBS =\ - comctl32.lib \ - rpcrt4.lib \ - rpcns4.lib \ - -DLLLIBS = \ - $(DESTDIR)\lib\afs\TaAfsAdmSvrClient.lib \ - $(DESTDIR)\lib\afs\TaLocale.lib - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsAppLib.dll - - -# Since AfsAppLib links with TaAfsAdmSvrClient.lib--and both need stuff -# like the HashList code--we'll get lots of unnecessary 4049 warnings from -# the linker. Disable that complaint. - -LOCALLINKFLAGS = -IGNORE:4049 - -# AfsAppLib needs to use an explicit .DEF file to get its entry points public - -LOCALLINKFLAGS = $(LOCALLINKFLAGS) /DEF:TaAfsAppLib.def - -# Also, AfsAppLib has a specific DLL entry-point which should be used - -LOCALLINKFLAGS = $(LOCALLINKFLAGS) -entry:DllEntryPoint - -############################################################################ - -install : - @echo TaAfsAppLib.DLL is built automatically when building AfsAdmSvr - @echo (the two are related--AfsAppLib uses the AfsAdmSvr client library, - @echo and the AfsAdmSvr server executable uses the AfsAppLib DLL-- - @echo and they must therefore be built in a specific order). - @echo. - @echo You do not need to build in the AfsAppLib directory explicitly. - @echo. - -headers : $(INCFILES) - -lang :: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -primary : headers $(DLLFILE) lang - -$(DLLFILE) : $(DLLOBJS) $(DLLLIBS) - $(DLLGUILINK) $(LOCALLINKFLAGS) $(VCLIBS) - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -clean:: - $(CD) lang - @if exist AFS_component_version_number.h del AFS_component_version_number.h - for /f %l in ('dir /B ??_??') do ( if exist @$(NTLANG) do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile clean ) - $(CD) .. - - -############################################################################ -# -# Dependencies -# - -$(OUT)\AfsAppLib_stub.res : AFS_component_version_number.h - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/afsapplib/TaAfsAppLib.def b/src/WINNT/afsapplib/TaAfsAppLib.def deleted file mode 100644 index f45381040..000000000 --- a/src/WINNT/afsapplib/TaAfsAppLib.def +++ /dev/null @@ -1,99 +0,0 @@ -LIBRARY TAAFSAPPLIB - -DESCRIPTION 'Transarc Application Base DLL' - -EXPORTS - - DllEntryPoint - - ?TaLocaleReallocFunction@@YAHPAPAXIPAIII@Z - ?TaLocale_EnumModule@@YAHIPAPAUHINSTANCE__@@PAG@Z - ?TaLocale_GetDialogResource@@YAPBUDLGTEMPLATE@@HPAPAUHINSTANCE__@@@Z - ?TaLocale_GetLanguage@@YAGXZ - ?TaLocale_LoadCorrespondingModule@@YAPAUHINSTANCE__@@PAU1@G@Z - ?TaLocale_GetLanguageOverride@@YAGXZ - ?TaLocale_RemoveLanguageOverride@@YAXXZ - ?TaLocale_SetLanguageOverride@@YAXG@Z - ?TaLocale_LoadImage@@YAPAXHIHHI@Z - ?TaLocale_LoadMenu@@YAPAUHMENU__@@H@Z - ?TaLocale_LoadIcon@@YAPAUHICON__@@H@Z - ?TaLocale_LoadAccelerators@@YAPAUHACCEL__@@H@Z - ?TaLocale_GetResource@@YAPBXPBD0GPAPAUHINSTANCE__@@@Z - ?TaLocale_GetResourceEx@@YAPBXPBD0GPAPAUHINSTANCE__@@H@Z - ?TaLocale_GetStringResource@@YAPBUSTRINGTEMPLATE@@HPAPAUHINSTANCE__@@@Z - ?TaLocale_Initialize@@YAXXZ - ?TaLocale_SetLanguage@@YAXG@Z - ?TaLocale_SpecifyModule@@YAXPAUHINSTANCE__@@G@Z - ?Message@@YAHIHHPBDZZ - ?Message@@YAHIHPBD0ZZ - ?Message@@YAHIPBD00ZZ - ?Message@@YAHIPBDH0ZZ - ?Message_ThreadProc@@YGKPAX@Z - ?ModalDialog@@YAHHPAUHWND__@@P6GH0IIJ@Z@Z - ?ModalDialogParam@@YAHHPAUHWND__@@P6GH0IIJ@ZJ@Z - ?ModelessDialog@@YAPAUHWND__@@HPAU1@P6GH0IIJ@Z@Z - ?ModelessDialogParam@@YAPAUHWND__@@HPAU1@P6GH0IIJ@ZJ@Z - ?vMessage@@YAHIHHPBDPAD@Z - ?vMessage@@YAHIHPBD0PAD@Z - ?vMessage@@YAHIJJPBDPAD@Z - ?vMessage@@YAHIPBD00PAD@Z - ?vMessage@@YAHIPBDH0PAD@Z - ?AnsiToString@@YAPADPBD@Z - ?AnsiToUnicode@@YAPAGPBD@Z - ?ChangeExtension@@YAXPADPBD1H@Z - ?CloneAnsi@@YAPADPAD@Z - ?CloneMultiString@@YAPADPBD@Z - ?CloneString@@YAPADPAD@Z - ?CloneUnicode@@YAPADPAG@Z - ?CopyAnsiToString@@YAXPADPBDI@Z - ?CopyAnsiToUnicode@@YAXPAGPBDI@Z - ?CopyBaseFileName@@YAXPADPBD@Z - ?CopyStringToAnsi@@YAXPADPBDI@Z - ?CopyStringToUnicode@@YAXPAGPBDI@Z - ?CopyUnicodeToAnsi@@YAXPADPBGI@Z - ?CopyUnicodeToString@@YAXPADPBGI@Z - ?FindBaseFileName@@YAPBDPBD@Z - ?FindExtension@@YAPBDPBD@Z - ?FixFormatString@@YAPADPAD@Z - ?FormatBytes@@YAXPAD0N@Z - ?FormatDouble@@YAXPAD0N@Z - ?FormatElapsed@@YAHPAD0PAU_SYSTEMTIME@@@Z - ?FormatError@@YAHPAD0K@Z - ?FormatLargeInt@@YAXPAD0PAT_LARGE_INTEGER@@@Z - ?FormatMultiString@@YAXPAPADHHPBDZZ - ?FormatMultiString@@YAXPAPADHPBD1ZZ - ?FormatSockAddr@@YAXPAD0PAUsockaddr_in@@@Z - ?FormatString@@YAPADHPBDZZ - ?FormatString@@YAPADPBD0ZZ - ?FormatTime@@YAHPAD0PAU_SYSTEMTIME@@HH@Z - ?FreeString@@YAXPBX0@Z - ?GetString@@YAXPADHH@Z - ?GetStringLength@@YAIH@Z - ?SearchMultiString@@YAHPBD0H@Z - ?SetErrorTranslationFunction@@YAXP6GHPADKG@Z@Z - ?StringToAnsi@@YAPADPBD@Z - ?StringToUnicode@@YAPAGPBD@Z - ?TranslateError@@YAHPADK@Z - ?TranslateErrorFunc@@YAHPADKG@Z - ?UnicodeToAnsi@@YAPADPBG@Z - ?UnicodeToString@@YAPADPBG@Z - ?lsplitpath@@YAXPBDPAD111@Z - ?lstrchr@@YAPBDPBDD@Z - ?lstrncmpi@@YAHPBD0I@Z - ?lstrncpy@@YAXPADPBDI@Z - ?lstrrchr@@YAPBDPBDD@Z - ?lstrupr@@YAXPAD@Z - ?lstrzcpy@@YAXPADPBDI@Z - ?vFormatMultiString@@YAXPAPADHHPBDPAD@Z - ?vFormatMultiString@@YAXPAPADHJPBDPAD@Z - ?vFormatMultiString@@YAXPAPADHPBD1PAD@Z - ?vFormatString@@YAPADHPBDPAD@Z - ?vFormatString@@YAPADJPBDPAD@Z - ?vFormatString@@YAPADPBD0PAD@Z - ShowMemoryManager - WhileMemoryManagerShowing - IsMemoryManagerMessage - MemMgr_AllocateMemory - MemMgr_FreeMemory - MemMgr_TrackNew - MemMgr_TrackDelete diff --git a/src/WINNT/afsapplib/afsapplib.cpp b/src/WINNT/afsapplib/afsapplib.cpp deleted file mode 100644 index 92a71d2b3..000000000 --- a/src/WINNT/afsapplib/afsapplib.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static HWND g_hMain = NULL; -static TCHAR g_szAppName[ cchNAME ] = TEXT(""); - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -extern void OnCoverWindow (WPARAM wp, LPARAM lp); -extern void OnExpiredCredentials (WPARAM wp, LPARAM lp); -extern void OnCreateErrorDialog (WPARAM wp, LPARAM lp); - -BOOL CALLBACK AfsAppLib_MainHook (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void AfsAppLib_SetAppName (LPTSTR pszName) -{ - lstrcpy (g_szAppName, pszName); -} - - -void AfsAppLib_GetAppName (LPTSTR pszName) -{ - lstrcpy (pszName, g_szAppName); -} - - -void AfsAppLib_SetMainWindow (HWND hMain) -{ - if (g_hMain != NULL) - Subclass_RemoveHook (g_hMain, AfsAppLib_MainHook); - - if ((g_hMain = hMain) != NULL) - Subclass_AddHook (g_hMain, AfsAppLib_MainHook); -} - - -HWND AfsAppLib_GetMainWindow (void) -{ - return g_hMain; -} - - -BOOL CALLBACK AfsAppLib_MainHook (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hWnd, AfsAppLib_MainHook); - - switch (msg) - { - case WM_COVER_WINDOW: - OnCoverWindow (wp, lp); - break; - - case WM_EXPIRED_CREDENTIALS: - OnExpiredCredentials (wp, lp); - break; - - case WM_CREATE_ERROR_DIALOG: - OnCreateErrorDialog (wp, lp); - break; - - case WM_DESTROY: - AfsAppLib_SetMainWindow (NULL); - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hWnd, msg, wp, lp); - else - return DefWindowProc (hWnd, msg, wp, lp); -} - diff --git a/src/WINNT/afsapplib/afsapplib.h b/src/WINNT/afsapplib/afsapplib.h deleted file mode 100644 index 7d0a55906..000000000 --- a/src/WINNT/afsapplib/afsapplib.h +++ /dev/null @@ -1,755 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSAPPLIB_H -#define AFSAPPLIB_H - -/* - * The AFS Application Library is a collection of handy support code - * for UI-level applications written for Windows NT and Windows 95. - * - * The various components of the library provide common dialogs, - * error code translation, task threading, error dialogs, additional - * Windows dialog controls, and many other functions. - * - * The goal of this library is to shorten application development time - * by providing pre-packaged functions, while ensuring a common user - * interface for Transarc applications. - * - */ - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifdef EXPORTED -#undef EXPORTED -#endif -#ifdef EXPORT_AFSAPPLIB -#define EXPORTED __declspec(dllexport) -#else -#define EXPORTED __declspec(dllimport) -#endif - -#ifndef APP_HINST -# define APP_HINST AfsAppLib_GetAppInstance() -#endif -#ifndef APPLIB_HINST -# define APPLIB_HINST AfsAppLib_GetInstance() -#endif -#ifndef THIS_HINST -# ifdef EXPORT -# define THIS_HINST APPLIB_HINST -# else -# define THIS_HINST APP_HINST -# endif -#endif - -#ifndef cchNAME -#define cchNAME 256 -#endif - -#ifdef DBG -#ifndef DEBUG -#define DEBUG -#endif -#ifdef NDEBUG -#undef NDEBUG -#endif -#endif - -#include -#include - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - - // This library relies on the TaLocale suite to provide - // access to localized resources. - // -#include - - // This library provides support for performing all operations - // through a remote administration server. If you want to use - // these capabilities AND you want to use the asc_* routines - // from TaAfsAdmSvrClient.lib directly, you must include - // before including this header. - // -#ifdef TAAFSADMSVRCLIENT_H -#ifndef TAAFSADMSVRINTERNAL_H -#ifndef TAAFSADMSVRCLIENTINTERNAL_H -#include -#endif // TAAFSADMSVRCLIENTINTERNAL_H -#endif // TAAFSADMSVRINTERNAL_H -#endif // TAAFSADMSVRCLIENT_H - - // A few general-purpose AfsAppLib headers - // -#include -#include - - // In addition to the prototypes you'll find in this header file, - // the following source files provide many useful features-- - // take a few moments and examine their headers individually to - // see what they can do for your application. - // - // Each header is associated with one source file, and each pair - // can easily (well, hopefully easily) be copied off to other - // applications. - // -#include // general-purpose list management code -#include // window resizing functions -#include // window subclass code -#include // general window control routines -#include // enhanced version of MSCTLS_UPDOWN -#include // elapsed-time entry window control -#include // absolute-time entry window control -#include // absolute-date entry window control -#include // IP address entry window control -#include // version-controlled settings -#include // checked-item listbox control -#include // fast treeview/listview replacement -#include // easy wizard generation code -#include // easy threaded progress-dialog code -#include // regular-expression pattern matching - - -/* - * GENERAL ____________________________________________________________________ - * - */ - - // AfsAppLib_SetAppName - // ...records the display name of your application, so AfsAppLib - // can add it to dialog boxes' titles. - // -EXPORTED void AfsAppLib_SetAppName (LPTSTR pszName); -EXPORTED void AfsAppLib_GetAppName (LPTSTR pszName); - - // AfsAppLib_SetMainWindow - // ...specifies which window represents your application; the library - // subclasses this window and uses it to ensure some tasks are - // performed by the UI thread. - // -EXPORTED void AfsAppLib_SetMainWindow (HWND hMain); -EXPORTED HWND AfsAppLib_GetMainWindow (void); - - -/* - * REMOTE ADMINISTRATION ______________________________________________________ - * - */ - - // AfsAppLib_OpenAdminServer - // AfsAppLib_CloseAdminServer - // ...enables the caller of the AfsAppLib library to indicate - // that AFS administrative functions should be performed by - // out-farming the actual operations onto an administrative - // server process, possibly running on another machine. - // By calling the OpenAdminServer() routine specifying a - // machine name or IP address, the AfsAppLib library will attempt - // to connect to an already-running administrative server on - // that machine; if successful, all further administrative - // tasks (until CloseAdminServer() is called) will be performed - // on that remote server. Similarly, by calling OpenAdminServer() - // but passing NULL as the address, the AfsAppLib library will - // use a separate administrative process running on the local - // computer, forking a new administrative server process if - // none is currently running now. - // -EXPORTED BOOL AfsAppLib_OpenAdminServer (LPTSTR pszAddress = NULL, ULONG *pStatus = NULL); -EXPORTED void AfsAppLib_CloseAdminServer (void); - - // AfsAppLib_GetAdminServerClientID - // ...every process which interacts with a remote administration - // server is assigned a client ID by that server, which the - // client process passes on each RPC to identify itself to the - // server. If AfsAppLib_OpenAdminServer() has previously been - // called, the AfsAppLib_GetAdminServerClientID() routine can - // be used to obtain the client id which the administrative - // server has assigned to this process. - // -EXPORTED DWORD AfsAppLib_GetAdminServerClientID (void); - - -/* - * CELLLIST ___________________________________________________________________ - * - */ - - // AfsAppLib_GetCellList - // ...obtains a list of cells: - // - if a registry path is supplied, that path is enumerated - // and the names of the keys below it returned as a cell list - // - if a registry path is not supplied, the list of cells - // contacted by the AFS client is returned. - // - if another cell list is supplied, that list is copied. - // The local cell will be in element 0. The AfsAppLib_FreeCellList - // routine should be called when the CELLLIST structure is no - // longer needed. - // -typedef struct // CELLLIST - { - LPTSTR *aCells; - size_t nCells; - HKEY hkBase; - TCHAR szRegPath[ MAX_PATH ]; - } CELLLIST, *LPCELLLIST; - -EXPORTED LPCELLLIST AfsAppLib_GetCellList (HKEY hkBase = NULL, LPTSTR pszRegPath = NULL); -EXPORTED LPCELLLIST AfsAppLib_GetCellList (LPCELLLIST lpcl); -EXPORTED void AfsAppLib_AddToCellList (LPCELLLIST lpcl, LPTSTR pszCell); -EXPORTED void AfsAppLib_FreeCellList (LPCELLLIST lpcl); - - -/* - * BROWSE _____________________________________________________________________ - * - */ - - // AfsAppLib_ShowBrowseDialog - // ...creates a modal dialog that lets the user select an AFS - // user or group - // -typedef enum - { - btLOCAL_USER, - btLOCAL_GROUP, - btANY_USER, - btANY_GROUP - } BROWSETYPE; - -typedef struct - { - HWND hParent; // [in] Parent window for browse dialog - TCHAR szCell[ cchNAME ]; // [inout] Cell name - TCHAR szNamed[ cchNAME ]; // [inout] Selected principal - BROWSETYPE bt; // [in] type of prinicipals to show - int idsTitle; // [in] string ID for dialog title - int idsPrompt; // [in] string ID for Edit prompt - int idsNone; // [in] string ID for checkbox (or 0) - LPCELLLIST lpcl; // [in] from AfsAppLib_GetCellList() - PVOID hCreds; // [in] credentials for enumeration - } BROWSEDLG_PARAMS, *LPBROWSEDLG_PARAMS; - -EXPORTED BOOL AfsAppLib_ShowBrowseDialog (LPBROWSEDLG_PARAMS lpp); - - - // AfsAppLib_ShowBrowseFilesetDialog - // ...creates a modal dialog that lets the user select a fileset - // -typedef struct - { - HWND hParent; // [in] parent window for browse dialog - TCHAR szCell[ cchNAME ]; // [inout] cell name - TCHAR szFileset[ cchNAME ]; // [inout] selected fileset - int idsTitle; // [in] string ID for title (or 0) - int idsPrompt; // [in] string ID for prompt (or 0) - LPCELLLIST lpcl; // [in] NULL to disable cell selection - PVOID pInternal; - } BROWSESETDLG_PARAMS, *LPBROWSESETDLG_PARAMS; - -EXPORTED BOOL AfsAppLib_ShowBrowseFilesetDialog (LPBROWSESETDLG_PARAMS lpp); - - -/* - * COVER ______________________________________________________________________ - * - */ - - // AfsAppLib_CoverClient - // AfsAppLib_CoverWindow - // ...hides the specified window (or just its client area), showing - // instead a simple etched rectangle filled with the descriptive - // text that you supply. An optional button can be shown in the - // lower-right corner; when pressed, the parent of the covered - // window receives a WM_COMMAND/IDC_COVERBUTTON message. - // -EXPORTED void AfsAppLib_CoverClient (HWND hWnd, LPTSTR pszDesc, LPTSTR pszButton = NULL); -EXPORTED void AfsAppLib_CoverWindow (HWND hWnd, LPTSTR pszDesc, LPTSTR pszButton = NULL); - - // AfsAppLib_Uncover - // ...removes a cover (if any) from the specified window, re-showing - // the controls previously hidden underneath the cover. - // -EXPORTED void AfsAppLib_Uncover (HWND hWnd); - - -/* - * CREDENTIALS ________________________________________________________________ - * - */ - - // AfsAppLib_CrackCredentials - // ...obtains information about the specified credentials cookie. - // returns TRUE if the data could be successfully parsed. - // -EXPORTED BOOL AfsAppLib_CrackCredentials (PVOID hCreds, LPTSTR pszCell = NULL, LPTSTR pszUser = NULL, LPSYSTEMTIME pst = NULL, ULONG *pStatus = NULL); - - // AfsAppLib_GetCredentials - // ...returns nonzero if the calling process has AFS credentials within - // the specified cell. Specify NULL as the cell ID to query - // credentials within the local cell. The return code is actually - // a token handle which can be supplied to the AFS administrative - // functions. - // -EXPORTED PVOID AfsAppLib_GetCredentials (LPCTSTR pszCell = NULL, ULONG *pStatus = NULL); - - // AfsAppLib_SetCredentials - // ...obtains new credentials for the calling process; performs no UI. - // If successful, returns a nonzero token handle which can be - // supplied to the AFS administrative functions. - // -EXPORTED PVOID AfsAppLib_SetCredentials (LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus = NULL); - - // AfsAppLib_IsUserAdmin - // ...queries the KAS database for a particular cell to determine - // whether the specified identity has administrative privileges. - // The hCreds passed in should be for an admin, or for the user - // being queried. - // -EXPORTED BOOL AfsAppLib_IsUserAdmin (PVOID hCreds, LPTSTR pszUser); - - // AfsAppLib_ShowOpenCellDialog - // ...presents a dialog which allows the user to select a cell, - // and optionally obtain new AFS credentials within that cell. - // the caller may optionally specify an alternate dialog template; - // if not, a default template will be used. the caller may also - // optionally supply a DLGPROC, which will be called to handle all - // dialog messages--if this hook returns FALSE, the default handler - // will be called; if it returns TRUE, no further processing for - // that message is performed. - // -typedef struct - { - int idd; // [in] dialog template (or 0) - DLGPROC hookproc; // [in] dialog procedure (or NULL) - HWND hParent; // [in] parent window (or NULL) - int idsDesc; // [in] string ID for description - BOOL *pfShowWarningEver; // [in] "don't ask again" checkbox - } BADCREDSDLG_PARAMS, *LPBADCREDSDLG_PARAMS; - -typedef struct - { - int idd; // [in] dialog template (or 0) - DLGPROC hookproc; // [in] dialog procedure (or NULL) - HWND hParent; // [in] parent window (or NULL) - int idsDesc; // [in] string ID for dialog text - LPCELLLIST lpcl; // [in] from AfsAppLib_GetCellList() - BADCREDSDLG_PARAMS bcdp; // [in] params for bad creds dialog - TCHAR szCell[ cchNAME ]; // [out] selected cell - PVOID hCreds; // [out] credentials in cell - } OPENCELLDLG_PARAMS, *LPOPENCELLDLG_PARAMS; - -EXPORTED BOOL AfsAppLib_ShowOpenCellDialog (LPOPENCELLDLG_PARAMS lpp); - - // AfsAppLib_ShowCredentialsDialog - // ...presents a dialog which displays the current AFS credentials - // and allows the user to obtain new credentials. An alternate - // dialog template and hook procedure can be specified. - // -typedef struct - { - int idd; // [in] dialog template (or 0) - DLGPROC hookproc; // [in] dialog procedure (or NULL) - HWND hParent; // [in] parent window (or NULL) - TCHAR szCell[ MAX_PATH ]; // [in out] current cell - BOOL fIgnoreBadCreds; // [in] TRUE to skip bad creds dialog - BADCREDSDLG_PARAMS bcdp; // [in] params for bad creds dialog - TCHAR szIdentity[ cchNAME ]; // [out] current DCE identity in szCell - TCHAR szPassword[ cchNAME ]; // [out] password entered (or "") - PVOID hCreds; // [in out] credentials in cell - } CREDENTIALSDLG_PARAMS, *LPCREDENTIALSDLG_PARAMS; - -EXPORTED BOOL AfsAppLib_ShowCredentialsDialog (LPCREDENTIALSDLG_PARAMS lpp); - - // AfsAppLib_CheckCredentials - // ...tests the current credentials to see if they represent - // a user with administrative access within the target cell. - // -typedef struct - { - PVOID hCreds; // [in] credentials to query - BOOL fShowWarning; // [in] TRUE to present warning dialog - BADCREDSDLG_PARAMS bcdp; // [in] params for bad creds dialog - } CHECKCREDS_PARAMS, *LPCHECKCREDS_PARAMS; - -EXPORTED BOOL AfsAppLib_CheckCredentials (LPCHECKCREDS_PARAMS lpp); - - // AfsAppLib_CheckForExpiredCredentials - // ...tests the user's credentials in the specified cell to see if - // they have expired; if so, calls AfsAppLib_CheckCredentials to - // display a warning dialog--if the user accepts the warning - // dialog, calls AfsAppLib_ShowCredentialsDialog. All that UI - // is modeless; this routine returns immediately. - // -EXPORTED void AfsAppLib_CheckForExpiredCredentials (LPCREDENTIALSDLG_PARAMS lpp); - - -/* - * TASKING ____________________________________________________________________ - * - */ - -typedef struct - { - int idTask; // task ID requested - HWND hReply; // window to which to reply - PVOID lpUser; // parameter supplied by user - BOOL rc; // TRUE if successful - ULONG status; // if (rc == FALSE), error code - PVOID pReturn; // allocated storage for return data - } TASKPACKET, *LPTASKPACKET; - - // AfsAppLib_InitTaskQueue - // ...allows use of StartTask to perform background tasks. - // call this routine only once per application, and only - // if you want to use StartTask(). - // -typedef struct - { - LPTASKPACKET (*fnCreateTaskPacket)(int idTask, HWND hReply, PVOID lpUser); - void (*fnPerformTask)(LPTASKPACKET ptp); - void (*fnFreeTaskPacket)(LPTASKPACKET ptp); - int nThreadsMax; - } TASKQUEUE_PARAMS, *LPTASKQUEUE_PARAMS; - -EXPORTED void AfsAppLib_InitTaskQueue (LPTASKQUEUE_PARAMS lpp); - - // StartTask - // ...pushes a request onto the task queue created by a previous - // call to AfsAppLib_InitTaskQueue. A background thread will - // be allocated to popping off the request and performing it, - // optionally posting a WM_ENDTASK message to the specified - // window upon completion. - // -EXPORTED void StartTask (int idTask, HWND hReply = 0, PVOID lpUser = 0); - - -/* - * ERROR DIALOGS ______________________________________________________________ - * - */ - - // ErrorDialog - // ...creates a modeless error dialog containing the specified - // error text. if a non-zero status code is specified, the - // error dialog will also translate that error code and - // display its description. These routines create a modeless - // dialog, and can be called by any thread. - // -EXPORTED void cdecl ErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt = NULL, ...); -EXPORTED void cdecl ErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt = NULL, ...); - - // FatalErrorDialog - // ...identical to ErrorDialog, except that PostQuitMessage() - // is performed after the error dialog is dismissed. - // -EXPORTED void cdecl FatalErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt = NULL, ...); -EXPORTED void cdecl FatalErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt = NULL, ...); - - // ImmediateErrorDialog - // ...identical to ErrorDialog, except that the error dialog - // is modal. - // -EXPORTED void cdecl ImmediateErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt = NULL, ...); -EXPORTED void cdecl ImmediateErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt = NULL, ...); - - -/* - * MODELESS DIALOGS ___________________________________________________________ - * - * Modeless dialogs aren't treated as dialogs unless you call IsDialogMessage() - * for them in your pump--that is, tab won't work, nor will RETURN or ESC do - * what you expect, nor will hotkeys. The routines below allow you to specify - * that a given window should be treated as a modeless dialog--by calling one - * routine in your main pump, you can ensure all such modeless dialogs will - * have IsDialogMessage called for them: - * - * MSG msg; - * while (GetMessage (&msg, NULL, 0, 0)) - * { - * -> if (AfsAppLib_IsModelessDialogMessage (&msg)) - * -> continue; - * - * TranslateMessage (&msg); - * DispatchMessage (&msg); - * } - * - * An equivalent technique is: - * - * AfsAppLib_MainPump(); - * - * ...the MainPump() routine does exactly what the first example did. - * - */ - - // AfsAppLib_IsModelessDialogMessage - // ...called from your applications pump, this routine - // calls IsDialogMessage() for each window which - // has been registered by AfsAppLib_RegisterModelessDialog. - // -EXPORTED BOOL AfsAppLib_IsModelessDialogMessage (MSG *lpm); - - // AfsAppLib_RegisterModelessDialog - // ...ensures that AfsAppLib_IsModelessDialogMessage will - // call IsDialogMessage() for the specified window - // -EXPORTED void AfsAppLib_RegisterModelessDialog (HWND hDlg); - - // AfsAppLib_SetPumpRoutine - // ...can be used to specify a routine which will be called for - // your application to process every message--if not done, - // AfsAppLib_MainPump and ModalDialog will instead simply - // call TranslateMessage/DispatchMessage. - // -EXPORTED void AfsAppLib_SetPumpRoutine (void (*fnPump)(MSG *lpm)); - - // AfsAppLib_MainPump - // ...Calls GetMessage() until the WM_QUIT message is received; - // for each message, calls AfsAppLib_IsModelessDialogMessage - // followed by the pump routine which was specified by - // AfsAppLib_SetPumpRoutine. - // -EXPORTED void AfsAppLib_MainPump (void); - - -/* - * WINDOW DATA ________________________________________________________________ - * - * Ever been frustrated by Get/SetWindowLong's inability to dynamically - * grow the space associated with a window? Worse, how do you know - * that GetWindowLong(hWnd,3) isn't already used by some other routine? - * - * The routines below solve both problems: by specifying indices by a - * descriptive name rather than an integer index, collisions are eliminated. - * And as new fields are specified, they're dynamically added--the data-space - * associated with a window grows indefinitely as needed. - * - * Note that GetWindowData will return 0 unless SetWindowData - * has been used to explicitly change that field for that window. - * - */ - - // GetWindowData - // SetWindowData - // ...Alternatives to GetWindowLong and SetWindowLong; these - // routines use descriptive field indices rather than - // the integer indices used by the Get/SetWindowLong routines, - // and can grow windows' data-space as necessary. - // -EXPORTED DWORD GetWindowData (HWND hWnd, LPTSTR pszField); -EXPORTED DWORD SetWindowData (HWND hWnd, LPTSTR pszField, DWORD dwNewData); - - -/* - * IMAGE LISTS ________________________________________________________________ - * - */ - - // AfsAppLib_CreateImageList - // ...creates an initial IMAGELIST, containing several - // AFS-specific icons (which are included in this library's - // resources). fLarge indicates whether the imagelist should - // be composed of 32x32 or 16x16 icons; the highest visible - // color depth image will automatically be selected for each icon. - // -#define imageSERVER 0 -#define imageSERVER_ALERT 1 -#define imageSERVER_UNMON 2 -#define imageSERVICE 3 -#define imageSERVICE_ALERT 4 -#define imageSERVICE_STOPPED 5 -#define imageAGGREGATE 6 -#define imageAGGREGATE_ALERT 7 -#define imageFILESET 8 -#define imageFILESET_ALERT 9 -#define imageFILESET_LOCKED 10 -#define imageBOSSERVICE 11 -#define imageCELL 12 -#define imageSERVERKEY 13 -#define imageUSER 14 -#define imageGROUP 15 - -#define imageNEXT 16 // next ID given by AfsAppLib_AddToImageList() - -EXPORTED HIMAGELIST AfsAppLib_CreateImageList (BOOL fLarge); - - // AfsAppLib_AddToImageList - // ...easy wrapper for adding additional icons to an image list. - // -EXPORTED void AfsAppLib_AddToImageList (HIMAGELIST hil, int idi, BOOL fLarge); - - -/* - * HELP _______________________________________________________________________ - * - * These routines make implementing context-sensitive help fairly easy. - * To use them, your application should contain the following code at startup - * for each dialog in your application: - * - * static DWORD IDH_MAIN_HELP_CTX[] = { - * IDC_BUTTON, IDH_BUTTON_HELP_ID, - * IDC_EDIT, IDH_EDIT_HELP_ID, - * 0, 0 - * }; - * - * AfsAppLib_RegisterHelp (IDD_MAIN, IDH_MAIN_HELP_CTX, IDH_MAIN_HELP_OVIEW); - * - * You'll also have to call one other routine, at least once: - * - * AfsAppLib_RegisterHelpFile (TEXT("myapp.hlp")); - * - * Within IDD_MAIN's dialog proc, call the following: - * - * BOOL CALLBACK IddMain_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) - * { - * if (AfsAppLib_HandleHelp (IDD_MAIN, hDlg, msg, wp, lp)) - * return TRUE; - * ... - * } - * - * That's it--context help will work for the dialog, and if you've attached - * a "Help" button (which should be IDHELP==9), it will conjure an overall - * help topic. - * - */ - - // AfsAppLib_RegisterHelpFile - // ...specifies the help file that the library should use to display - // help topics. - // -EXPORTED void AfsAppLib_RegisterHelpFile (LPTSTR pszFilename); - - // AfsAppLib_RegisterHelp - // ...adds another dialog to the library's list of CSH-enabled - // dialogs. Dialogs are referenced by their resource ID--that's - // what the "idd" thing is. - // -EXPORTED void AfsAppLib_RegisterHelp (int idd, DWORD *adwContext, int idhOverview); - - // AfsAppLib_HandleHelp - // ...handles CSH messages and IDHELP button presses; returns TRUE - // if the given message has been handled and needs no further - // processing. - // -EXPORTED BOOL AfsAppLib_HandleHelp (int idd, HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * GENERAL ____________________________________________________________________ - * - */ - - // AfsApplib_CreateFont - // ...loads a string resource and uses its content to create a - // font. The string resource should be of the form: - // "TypeFace,Size,Flags"-- - // where: - // TypeFace is "MS Sans Serif", "Times New Roman", or other font - // Size is the point-size of the font (no decimals!) - // Flags is combination of B, I, U (bold, italicized, underlined) - // - // Some examples, then: - // IDS_BIG_FONT "Times New Roman,20,BU" - // IDS_LITTLE_FONT "Arial,8,I" - // IDS_NORMAL_FONT "MS Sans Serif,10" - // - // The returned font handle should be destroyed with DeleteObject() - // when no longer needed. - // -EXPORTED HFONT AfsAppLib_CreateFont (int idsFont); - - // AfsAppLib_GetInstance - // ...returns the handle representing this library, for use in - // loading resources. - // -EXPORTED HINSTANCE AfsAppLib_GetInstance (void); - - // AfsAppLib_GetAppInstance - // ...returns the handle representing the application which - // loaded this library. If a .DLL loaded this library, - // you may need to call AfsAppLib_SetAppInstance(). - // -EXPORTED HINSTANCE AfsAppLib_GetAppInstance (void); -EXPORTED void AfsAppLib_SetAppInstance (HINSTANCE hInst); - - // AfsAppLib_AnimateIcon - // ...used to animate the 8-frame spinning Transarc logo. - // specify NULL for piFrameLast to stop the spinning, - // otherwise, provide a pointer to an int that will be used - // to track the current frame. - // -EXPORTED void AfsAppLib_AnimateIcon (HWND hIcon, int *piFrameLast = NULL); - - // AfsAppLib_StartAnimation - // AfsAppLib_StopAnimation - // ...an alternate technique for calling AfsAppLib_AnimateIcon; - // using these routines causes a timer to be created which will - // animate the Transarc logo within the specified window. - // -EXPORTED void AfsAppLib_StartAnimation (HWND hIcon, int fps = 8); -EXPORTED void AfsAppLib_StopAnimation (HWND hIcon); - - // AfsAppLib_IsTimeInFuture - // ...returns TRUE if the specified time (GMT) is in the - // future; handy for checking credentials' expiration dates. - // -EXPORTED BOOL AfsAppLib_IsTimeInFuture (LPSYSTEMTIME pstTest); - - // AfsAppLib_UnixTimeToSystemTime - // ...translate a unix time DWORD into a SYSTEMTIME structure - // -EXPORTED void AfsAppLib_UnixTimeToSystemTime (LPSYSTEMTIME pst, ULONG ut, BOOL fElapsed = FALSE); - - // AfsAppLib_TranslateError - // ...obtains descriptive text for the given status code. - // This routine is just a wrapper around TaLocale's - // FormatError(); either routine produces identical output. - // Both routines call back into a hook installed by the - // AfsAppLib library to provide AFS-specific error translation.. - // If successful, the resulting string will appear as: - // "Unable to create an RPC binding to host. (0x0E008001)" - // If unsuccessful, the resulting string will appear as: - // "0x0E008001" - // -EXPORTED BOOL AfsAppLib_TranslateError (LPTSTR pszText, ULONG status, LANGID idLanguage = 0); - - // AfsAppLib_GetLocalCell - // ...returns the local cell into which this machine is configured. - // -EXPORTED BOOL AfsAppLib_GetLocalCell (LPTSTR pszCell, ULONG *pStatus = NULL); - - // REALLOC - // ...general-purpose array reallocator: - // int *aInts = NULL; - // size_t cInts = 0; - // if (!REALLOC (aInts, cInts, 128, 16)) { ... } - // the code above ensures that there will be 128 ints available - // as iInts[0]..aInts[127]; the 16 indicates the minimum allocation - // granularity (i.e., asking for 129 ints will actually get you - // 144 of them). Reallocation only increases array size, and is - // only performed when necessary; newly-allocated space is zero- - // initialized, and old data is always retained across reallocation. - // Use GlobalFree((HGLOBAL)aInts) to free the array when done. - // Use it a few times, and you'll be hooked: amazingly useful. - // -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) AfsAppLib_ReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -EXPORTED BOOL AfsAppLib_ReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc); -#endif - - -#endif - diff --git a/src/WINNT/afsapplib/afsapplib_stub.rc b/src/WINNT/afsapplib/afsapplib_stub.rc deleted file mode 100644 index f39516e29..000000000 --- a/src/WINNT/afsapplib/afsapplib_stub.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Application Base DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED diff --git a/src/WINNT/afsapplib/al_admsvr.cpp b/src/WINNT/afsapplib/al_admsvr.cpp deleted file mode 100644 index c2d672bf9..000000000 --- a/src/WINNT/afsapplib/al_admsvr.cpp +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct - { - BOOL fUseAdminServer; - DWORD idAdminServerClient; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL AfsAppLib_OpenAdminServer (LPTSTR pszAddress, ULONG *pStatus) -{ - AfsAppLib_CloseAdminServer(); - - ULONG status; - if (!asc_AdminServerOpen (pszAddress, &l.idAdminServerClient, &status)) - { - if (pStatus) - *pStatus = status; - return FALSE; - } - - l.fUseAdminServer = TRUE; - return TRUE; -} - - -void AfsAppLib_CloseAdminServer (void) -{ - if (l.fUseAdminServer) - { - ULONG status; - asc_AdminServerClose (l.idAdminServerClient, &status); - l.idAdminServerClient = 0; - l.fUseAdminServer = FALSE; - } -} - - -DWORD AfsAppLib_GetAdminServerClientID (void) -{ - return (l.fUseAdminServer) ? l.idAdminServerClient : 0; -} - - -/* - * WRAPPERS ___________________________________________________________________ - * - * This really ugly hack allows other processes to call the asc_* routines - * in the context of the AfsAppLib library. - * - */ - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListCreate (LPASIDLIST *ppList) -{ - return asc_AsidListCreate (ppList); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListCopy (LPASIDLIST *ppListTarget, LPASIDLIST *ppListSource) -{ - return asc_AsidListCopy (ppListTarget, ppListSource); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListAddEntry (LPASIDLIST *ppList, ASID idObject, LPARAM lp) -{ - return asc_AsidListAddEntry (ppList, idObject, lp); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListRemoveEntry (LPASIDLIST *ppList, ASID idObject) -{ - return asc_AsidListRemoveEntry (ppList, idObject); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListRemoveEntryByIndex (LPASIDLIST *ppList, size_t iIndex) -{ - return asc_AsidListRemoveEntryByIndex (ppList, iIndex); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListSetEntryParam (LPASIDLIST *ppList, ASID idObject, LPARAM lp) -{ - return asc_AsidListSetEntryParam (ppList, idObject, lp); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListSetEntryParamByIndex (LPASIDLIST *ppList, size_t iIndex, LPARAM lp) -{ - return asc_AsidListSetEntryParamByIndex (ppList, iIndex, lp); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListTest (LPASIDLIST *ppList, ASID idObject, LPARAM *pParam) -{ - return asc_AsidListTest (ppList, idObject, pParam); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListFree (LPASIDLIST *ppList) -{ - return asc_AsidListFree (ppList); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListCreate (LPASOBJPROPLIST *ppList) -{ - return asc_ObjPropListCreate (ppList); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListCopy (LPASOBJPROPLIST *ppListTarget, LPASOBJPROPLIST *ppListSource) -{ - return asc_ObjPropListCopy (ppListTarget, ppListSource); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListAddEntry (LPASOBJPROPLIST *ppList, LPASOBJPROP pProperties, LPARAM lp) -{ - return asc_ObjPropListAddEntry (ppList, pProperties, lp); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListRemoveEntry (LPASOBJPROPLIST *ppList, ASID idObject) -{ - return asc_ObjPropListRemoveEntry (ppList, idObject); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListTest (LPASOBJPROPLIST *ppList, ASID idObject, LPASOBJPROP pProperties, LPARAM *pParam) -{ - return asc_ObjPropListTest (ppList, idObject, pProperties, pParam); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListFree (LPASOBJPROPLIST *ppList) -{ - return asc_ObjPropListFree (ppList); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListCreate (LPASACTIONLIST *ppList) -{ - return asc_ActionListCreate (ppList); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListCopy (LPASACTIONLIST *ppListTarget, LPASACTIONLIST *ppListSource) -{ - return asc_ActionListCopy (ppListTarget, ppListSource); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListAddEntry (LPASACTIONLIST *ppList, LPASACTION pAction) -{ - return asc_ActionListAddEntry (ppList, pAction); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListRemoveEntry (LPASACTIONLIST *ppList, DWORD idAction) -{ - return asc_ActionListRemoveEntry (ppList, idAction); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListTest (LPASACTIONLIST *ppList, DWORD idAction, LPASACTION pAction) -{ - return asc_ActionListTest (ppList, idAction, pAction); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListFree (LPASACTIONLIST *ppList) -{ - return asc_ActionListFree (ppList); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AdminServerOpen (LPCTSTR pszAddress, DWORD *pidClient, ULONG *pStatus) -{ - return asc_AdminServerOpen (pszAddress, pidClient, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AdminServerClose (DWORD idClient, ULONG *pStatus) -{ - return asc_AdminServerClose (idClient, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CredentialsCrack (DWORD idClient, PVOID hCreds, LPTSTR pszCell, LPTSTR pszUser, SYSTEMTIME *pstExpiration, ULONG *pStatus) -{ - return asc_CredentialsCrack (idClient, hCreds, pszCell, pszUser, pstExpiration, pStatus); -} - -EXPORTED PVOID ADMINAPI AfsAppLib_asc_CredentialsGet (DWORD idClient, LPCTSTR pszCell, ULONG *pStatus) -{ - return asc_CredentialsGet (idClient, pszCell, pStatus); -} - -EXPORTED PVOID ADMINAPI AfsAppLib_asc_CredentialsSet (DWORD idClient, LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus) -{ - return asc_CredentialsSet (idClient, pszCell, pszUser, pszPassword, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CredentialsPush (DWORD idClient, PVOID hCreds, ASID idCell, ULONG *pStatus) -{ - return asc_CredentialsPush (idClient, hCreds, idCell, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_LocalCellGet (DWORD idClient, LPTSTR pszCell, ULONG *pStatus) -{ - return asc_LocalCellGet (idClient, pszCell, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ErrorCodeTranslate (DWORD idClient, ULONG code, LANGID idLanguage, STRING pszErrorText, ULONG *pStatus) -{ - return asc_ErrorCodeTranslate (idClient, code, idLanguage, pszErrorText, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionGet (DWORD idClient, DWORD idAction, LPASACTION pAction, ULONG *pStatus) -{ - return asc_ActionGet (idClient, idAction, pAction, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionGetMultiple (DWORD idClient, DWORD idClientSearch, ASID idCellSearch, LPASACTIONLIST *ppList, ULONG *pStatus) -{ - return asc_ActionGetMultiple (idClient, idClientSearch, idCellSearch, ppList, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListen (DWORD idClient, HWND hNotify, ULONG *pStatus) -{ - return asc_ActionListen (idClient, hNotify, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus) -{ - return asc_ActionListenClear (idClient, hNotify, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellOpen (DWORD idClient, PVOID hCreds, LPCTSTR pszCell, DWORD dwScope, ASID *pidCell, ULONG *pStatus) -{ - return asc_CellOpen (idClient, hCreds, pszCell, dwScope, pidCell, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellClose (DWORD idClient, ASID idCell, ULONG *pStatus) -{ - return asc_CellClose (idClient, idCell, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellChange (DWORD idClient, ASID idCell, LPAFSADMSVR_CHANGECELL_PARAMS pChange, ULONG *pStatus) -{ - return asc_CellChange (idClient, idCell, pChange, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellRefreshRateSet (DWORD idClient, ASID idCell, LONG cminRefreshRate, ULONG *pStatus) -{ - return asc_CellRefreshRateSet (idClient, idCell, cminRefreshRate, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectFind (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszName, ASID *pidObject, ULONG *pStatus) -{ - return asc_ObjectFind (idClient, idSearchScope, ObjectType, pszName, pidObject, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectFindMultiple (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszPattern, LPAFSADMSVR_SEARCH_PARAMS pSearchParams, LPASIDLIST *ppList, ULONG *pStatus) -{ - return asc_ObjectFindMultiple (idClient, idSearchScope, ObjectType, pszPattern, pSearchParams, ppList, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectPropertiesGet (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus) -{ - return asc_ObjectPropertiesGet (idClient, GetLevel, idCell, idObject, pProperties, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectPropertiesGetMultiple (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, LPASIDLIST pAsidList, LPASOBJPROPLIST *ppPropertiesList, ULONG *pStatus) -{ - return asc_ObjectPropertiesGetMultiple (idClient, GetLevel, idCell, pAsidList, ppPropertiesList, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectListen (DWORD idClient, ASID idCell, ASID idObject, HWND hNotify, ULONG *pStatus) -{ - return asc_ObjectListen (idClient, idCell, idObject, hNotify, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus) -{ - return asc_ObjectListenClear (idClient, hNotify, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectListenMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, HWND hNotify, ULONG *pStatus) -{ - return asc_ObjectListenMultiple (idClient, idCell, pAsidList, hNotify, pStatus); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectRefresh (DWORD idClient, ASID idCell, ASID idObject, ULONG *pStatus) -{ - return asc_ObjectRefresh (idClient, idCell, idObject, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectRefreshMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, ULONG *pStatus) -{ - return asc_ObjectRefreshMultiple (idClient, idCell, pAsidList, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_RandomKeyGet (DWORD idClient, ASID idCell, PBYTE pkey, ULONG *pStatus) -{ - return asc_RandomKeyGet (idClient, idCell, pkey, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellNameGet_Fast (DWORD idClient, ASID idCell, LPTSTR pszCell, ULONG *pStatus) -{ - return asc_CellNameGet_Fast (idClient, idCell, pszCell, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectNameGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPTSTR pszObject, ULONG *pStatus) -{ - return asc_ObjectNameGet_Fast (idClient, idCell, idObject, pszObject, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectTypeGet_Fast (DWORD idClient, ASID idCell, ASID idObject, ASOBJTYPE *pObjectType, ULONG *pStatus) -{ - return asc_ObjectTypeGet_Fast (idClient, idCell, idObject, pObjectType, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectPropertiesGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus) -{ - return asc_ObjectPropertiesGet_Fast (idClient, idCell, idObject, pProperties, pStatus); -} - - -EXPORTED void ADMINAPI AfsAppLib_asc_Enter (void) -{ - asc_Enter(); -} - -EXPORTED void ADMINAPI AfsAppLib_asc_Leave (void) -{ - asc_Leave(); -} - -EXPORTED LPCRITICAL_SECTION ADMINAPI AfsAppLib_asc_GetCriticalSection (void) -{ - return asc_GetCriticalSection(); -} - - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserChange (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_CHANGEUSER_PARAMS pChange, ULONG *pStatus) -{ - return asc_UserChange (idClient, idCell, idUser, pChange, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserPasswordSet (DWORD idClient, ASID idCell, ASID idUser, int keyVersion, LPCTSTR pkeyString, PBYTE pkeyData, ULONG *pStatus) -{ - return asc_UserPasswordSet (idClient, idCell, idUser, keyVersion, pkeyString, pkeyData, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserUnlock (DWORD idClient, ASID idCell, ASID idUser, ULONG *pStatus) -{ - return asc_UserUnlock (idClient, idCell, idUser, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEUSER_PARAMS pCreate, ASID *pidUser, ULONG *pStatus) -{ - return asc_UserCreate (idClient, idCell, pCreate, pidUser, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserDelete (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_DELETEUSER_PARAMS pDelete, ULONG *pStatus) -{ - return asc_UserDelete (idClient, idCell, idUser, pDelete, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupChange (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus) -{ - return asc_GroupChange (idClient, idCell, idGroup, pChange, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMembersGet (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - return asc_GroupMembersGet (idClient, idCell, idGroup, ppAsidList, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMemberAdd (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus) -{ - return asc_GroupMemberAdd (idClient, idCell, idGroup, idMember, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMemberRemove (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus) -{ - return asc_GroupMemberRemove (idClient, idCell, idGroup, idMember, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupRename (DWORD idClient, ASID idCell, ASID idGroup, LPCTSTR pszNewName, ULONG *pStatus) -{ - return asc_GroupRename (idClient, idCell, idGroup, pszNewName, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupOwnershipGet (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - return asc_GroupOwnershipGet (idClient, idCell, idMember, ppAsidList, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMembershipGet (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus) -{ - return asc_GroupMembershipGet (idClient, idCell, idOwner, ppAsidList, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus) -{ - return asc_GroupCreate (idClient, idCell, pCreate, pidGroup, pStatus); -} - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupDelete (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus) -{ - return asc_GroupDelete (idClient, idCell, idGroup, pStatus); -} - diff --git a/src/WINNT/afsapplib/al_admsvr.h b/src/WINNT/afsapplib/al_admsvr.h deleted file mode 100644 index d481f0255..000000000 --- a/src/WINNT/afsapplib/al_admsvr.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AL_ADMSVR_H -#define AL_ADMSVR_H - -/* - * ADMIN SERVER INTERFACE _____________________________________________________ - * - * The AfsAppLib .DLL links with the admin server client library, - * TaAfsAdmSvrClient.lib. Moreover, when you call AfsAppLib_OpenAdminServer(), - * it's AfsAppLib's instance of that .LIB which gets initialized and used - * by AfsAppLib. - * - * Ah, but the problem is: if you want your app to access the asc_* functions - * as well (aside from just indirectly using them by calling AfsAppLib_* - * functions), you'll have to magically access the .LIB inside of AfsAppLib-- - * if you just link your app with the .LIB, you'll find your copy of the .LIB - * never is initialized. - * - * So for those of you who want to use the asc_* routines directly AND want - * to the AfsAppLib library, including this header file remaps all asc_* - * routines to ensure they'll call within al_admsvr.cpp. - * - * First, note that AfsAppLib exposes its own wrappers for its .LIB: - * - */ - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListCreate (LPASIDLIST *ppList); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListCopy (LPASIDLIST *ppListTarget, LPASIDLIST *ppListSource); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListAddEntry (LPASIDLIST *ppList, ASID idObject, LPARAM lp); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListRemoveEntry (LPASIDLIST *ppList, ASID idObject); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListRemoveEntryByIndex (LPASIDLIST *ppList, size_t iIndex); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListSetEntryParam (LPASIDLIST *ppList, ASID idObject, LPARAM lp); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListSetEntryParamByIndex (LPASIDLIST *ppList, size_t iIndex, LPARAM lp); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListTest (LPASIDLIST *ppList, ASID idObject, LPARAM *pParam = NULL); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AsidListFree (LPASIDLIST *ppList); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListCreate (LPASOBJPROPLIST *ppList); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListCopy (LPASOBJPROPLIST *ppListTarget, LPASOBJPROPLIST *ppListSource); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListAddEntry (LPASOBJPROPLIST *ppList, LPASOBJPROP pProperties, LPARAM lp); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListRemoveEntry (LPASOBJPROPLIST *ppList, ASID idObject); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListTest (LPASOBJPROPLIST *ppList, ASID idObject, LPASOBJPROP pProperties = NULL, LPARAM *pParam = NULL); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjPropListFree (LPASOBJPROPLIST *ppList); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListCreate (LPASACTIONLIST *ppList); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListCopy (LPASACTIONLIST *ppListTarget, LPASACTIONLIST *ppListSource); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListAddEntry (LPASACTIONLIST *ppList, LPASACTION pAction); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListRemoveEntry (LPASACTIONLIST *ppList, DWORD idAction); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListTest (LPASACTIONLIST *ppList, DWORD idAction, LPASACTION pAction = NULL); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListFree (LPASACTIONLIST *ppList); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AdminServerOpen (LPCTSTR pszAddress, DWORD *pidClient, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_AdminServerClose (DWORD idClient, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CredentialsCrack (DWORD idClient, PVOID hCreds, LPTSTR pszCell, LPTSTR pszUser, SYSTEMTIME *pstExpiration, ULONG *pStatus); -EXPORTED PVOID ADMINAPI AfsAppLib_asc_CredentialsGet (DWORD idClient, LPCTSTR pszCell, ULONG *pStatus); -EXPORTED PVOID ADMINAPI AfsAppLib_asc_CredentialsSet (DWORD idClient, LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CredentialsPush (DWORD idClient, PVOID hCreds, ASID idCell, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_LocalCellGet (DWORD idClient, LPTSTR pszCell, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ErrorCodeTranslate (DWORD idClient, ULONG code, LANGID idLanguage, STRING pszErrorText, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionGet (DWORD idClient, DWORD idAction, LPASACTION pAction, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionGetMultiple (DWORD idClient, DWORD idClientSearch, ASID idCellSearch, LPASACTIONLIST *ppList, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListen (DWORD idClient, HWND hNotify, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ActionListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellOpen (DWORD idClient, PVOID hCreds, LPCTSTR pszCell, DWORD dwScope, ASID *pidCell, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellClose (DWORD idClient, ASID idCell, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellChange (DWORD idClient, ASID idCell, LPAFSADMSVR_CHANGECELL_PARAMS pChange, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellRefreshRateSet (DWORD idClient, ASID idCell, LONG cminRefreshRate, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectFind (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszName, ASID *pidObject, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectFindMultiple (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, LPCTSTR pszPattern, LPAFSADMSVR_SEARCH_PARAMS pSearchParams, LPASIDLIST *ppList, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectPropertiesGet (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectPropertiesGetMultiple (DWORD idClient, AFSADMSVR_GET_LEVEL GetLevel, ASID idCell, LPASIDLIST pAsidList, LPASOBJPROPLIST *ppPropertiesList, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectListen (DWORD idClient, ASID idCell, ASID idObject, HWND hNotify, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectListenClear (DWORD idClient, HWND hNotify, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectListenMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, HWND hNotify, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectRefresh (DWORD idClient, ASID idCell, ASID idObject, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectRefreshMultiple (DWORD idClient, ASID idCell, LPASIDLIST pAsidList, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_RandomKeyGet (DWORD idClient, ASID idCell, PBYTE pkey, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_CellNameGet_Fast (DWORD idClient, ASID idCell, LPTSTR pszCell, ULONG *pStatus = NULL); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectNameGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPTSTR pszObject, ULONG *pStatus = NULL); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectTypeGet_Fast (DWORD idClient, ASID idCell, ASID idObject, ASOBJTYPE *pObjectType, ULONG *pStatus = NULL); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_ObjectPropertiesGet_Fast (DWORD idClient, ASID idCell, ASID idObject, LPASOBJPROP pProperties, ULONG *pStatus = NULL); - -EXPORTED void ADMINAPI AfsAppLib_asc_Enter (void); -EXPORTED void ADMINAPI AfsAppLib_asc_Leave (void); -EXPORTED LPCRITICAL_SECTION ADMINAPI AfsAppLib_asc_GetCriticalSection (void); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserChange (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_CHANGEUSER_PARAMS pChange, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserPasswordSet (DWORD idClient, ASID idCell, ASID idUser, int keyVersion, LPCTSTR pkeyString, PBYTE pkeyData, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserUnlock (DWORD idClient, ASID idCell, ASID idUser, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEUSER_PARAMS pCreate, ASID *pidUser, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_UserDelete (DWORD idClient, ASID idCell, ASID idUser, LPAFSADMSVR_DELETEUSER_PARAMS pDelete, ULONG *pStatus); - -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupChange (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMembersGet (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMemberAdd (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMemberRemove (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupRename (DWORD idClient, ASID idCell, ASID idGroup, LPCTSTR pszNewName, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupMembershipGet (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupOwnershipGet (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupCreate (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus); -EXPORTED BOOL ADMINAPI AfsAppLib_asc_GroupDelete (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus); - -/* - * Then, note that AfsAppLib remaps all the asc_* routines to call their - * AfsAppLib_ equivalents: - * - */ - -#ifndef EXPORT_AFSAPPLIB - -#define asc_AsidListCreate AfsAppLib_asc_AsidListCreate -#define asc_AsidListCopy AfsAppLib_asc_AsidListCopy -#define asc_AsidListAddEntry AfsAppLib_asc_AsidListAddEntry -#define asc_AsidListRemoveEntry AfsAppLib_asc_AsidListRemoveEntry -#define asc_AsidListRemoveEntryByIndex AfsAppLib_asc_AsidListRemoveEntryByIndex -#define asc_AsidListSetEntryParam AfsAppLib_asc_AsidListSetEntryParam -#define asc_AsidListSetEntryParamByIndex AfsAppLib_asc_AsidListSetEntryParamByIndex -#define asc_AsidListTest AfsAppLib_asc_AsidListTest -#define asc_AsidListFree AfsAppLib_asc_AsidListFree - -#define asc_ObjPropListCreate AfsAppLib_asc_ObjPropListCreate -#define asc_ObjPropListCopy AfsAppLib_asc_ObjPropListCopy -#define asc_ObjPropListAddEntry AfsAppLib_asc_ObjPropListAddEntry -#define asc_ObjPropListRemoveEntry AfsAppLib_asc_ObjPropListRemoveEntry -#define asc_ObjPropListTest AfsAppLib_asc_ObjPropListTest -#define asc_ObjPropListFree AfsAppLib_asc_ObjPropListFree - -#define asc_ActionListCreate AfsAppLib_asc_ActionListCreate -#define asc_ActionListCopy AfsAppLib_asc_ActionListCopy -#define asc_ActionListAddEntry AfsAppLib_asc_ActionListAddEntry -#define asc_ActionListRemoveEntry AfsAppLib_asc_ActionListRemoveEntry -#define asc_ActionListTest AfsAppLib_asc_ActionListTest -#define asc_ActionListFree AfsAppLib_asc_ActionListFree - -#define asc_AdminServerOpen AfsAppLib_asc_AdminServerOpen -#define asc_AdminServerClose AfsAppLib_asc_AdminServerClose - -#define asc_CredentialsGet AfsAppLib_asc_CredentialsGet -#define asc_CredentialsSet AfsAppLib_asc_CredentialsSet -#define asc_CredentialsPush AfsAppLib_asc_CredentialsPush - -#define asc_LocalCellGet AfsAppLib_asc_LocalCellGet -#define asc_ErrorCodeTranslate AfsAppLib_asc_ErrorCodeTranslate - -#define asc_ActionGet AfsAppLib_asc_ActionGet -#define asc_ActionGetMultiple AfsAppLib_asc_ActionGetMultiple -#define asc_ActionListen AfsAppLib_asc_ActionListen -#define asc_ActionListenClear AfsAppLib_asc_ActionListenClear - -#define asc_CellOpen AfsAppLib_asc_CellOpen -#define asc_CellClose AfsAppLib_asc_CellClose -#define asc_CellChange AfsAppLib_asc_CellChange -#define asc_CellRefreshRateSet AfsAppLib_asc_CellRefreshRateSet - -#define asc_ObjectFind AfsAppLib_asc_ObjectFind -#define asc_ObjectFindMultiple AfsAppLib_asc_ObjectFindMultiple -#define asc_ObjectPropertiesGet AfsAppLib_asc_ObjectPropertiesGet -#define asc_ObjectPropertiesGetMultiple AfsAppLib_asc_ObjectPropertiesGetMultiple - -#define asc_ObjectListen AfsAppLib_asc_ObjectListen -#define asc_ObjectListenClear AfsAppLib_asc_ObjectListenClear -#define asc_ObjectListenMultiple AfsAppLib_asc_ObjectListenMultiple - -#define asc_ObjectRefresh AfsAppLib_asc_ObjectRefresh -#define asc_ObjectRefreshMultiple AfsAppLib_asc_ObjectRefreshMultiple - -#define asc_RandomKeyGet AfsAppLib_asc_RandomKeyGet - -#define asc_CellNameGet_Fast AfsAppLib_asc_CellNameGet_Fast -#define asc_ObjectNameGet_Fast AfsAppLib_asc_ObjectNameGet_Fast -#define asc_ObjectTypeGet_Fast AfsAppLib_asc_ObjectTypeGet_Fast -#define asc_ObjectPropertiesGet_Fast AfsAppLib_asc_ObjectPropertiesGet_Fast - -#define asc_Enter AfsAppLib_asc_Enter -#define asc_Leave AfsAppLib_asc_Leave -#define asc_GetCriticalSection AfsAppLib_asc_GetCriticalSection - -#define asc_UserChange AfsAppLib_asc_UserChange -#define asc_UserPasswordSet AfsAppLib_asc_UserPasswordSet -#define asc_UserUnlock AfsAppLib_asc_UserUnlock -#define asc_UserCreate AfsAppLib_asc_UserCreate -#define asc_UserDelete AfsAppLib_asc_UserDelete - -#define asc_GroupChange AfsAppLib_asc_GroupChange -#define asc_GroupMembersGet AfsAppLib_asc_GroupMembersGet -#define asc_GroupMemberAdd AfsAppLib_asc_GroupMemberAdd -#define asc_GroupMemberRemove AfsAppLib_asc_GroupMemberRemove -#define asc_GroupRename AfsAppLib_asc_GroupRename -#define asc_GroupOwnershipGet AfsAppLib_asc_GroupOwnershipGet -#define asc_GroupMembershipGet AfsAppLib_asc_GroupMembershipGet -#define asc_GroupCreate AfsAppLib_asc_GroupCreate -#define asc_GroupDelete AfsAppLib_asc_GroupDelete - -#endif // EXPORT_AFSAPPLIB - -#endif // AL_ADMSVR_H - diff --git a/src/WINNT/afsapplib/al_browse.cpp b/src/WINNT/afsapplib/al_browse.cpp deleted file mode 100644 index daf198505..000000000 --- a/src/WINNT/afsapplib/al_browse.cpp +++ /dev/null @@ -1,714 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "al_dynlink.h" -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cxICON 19 // size of an ACL entry icon - -#define cyICON 16 // size of an ACL entry icon - -#define clrTRANSPARENT RGB(0,255,0) // background color on ACL entry icons - - -/* - * BROWSE DIALOG ______________________________________________________________ - * - */ - -typedef struct BROWSEDIALOGPARAMS { - TCHAR szCell[ cchRESOURCE ]; - TCHAR szNamed[ cchRESOURCE ]; - BOOL fThisCellOnly; - HIMAGELIST hImages; - - BROWSETYPE bt; // for what entry type do we browse? - - HWND hDlg; - HANDLE hThread; - BOOL fCanStopThreadEasily; - BOOL fShouldStopThread; - BOOL fThreadActive; - TCHAR szThreadCell[ cchRESOURCE ]; - - int idsTitle; - int idsPrompt; - int idsNone; - - LPCELLLIST lpcl; - PVOID hCreds; -} BROWSEDIALOGPARAMS, *LPBROWSEDIALOGPARAMS; - - -BOOL CALLBACK DlgProc_Browse (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void DlgProc_Browse_OnInitDialog (HWND hDlg, BROWSEDIALOGPARAMS *pbdp); -void DlgProc_Browse_OnNone (HWND hDlg, BROWSEDIALOGPARAMS *pbdp); -void DlgProc_Browse_SelectedEntry (HWND hDlg, BROWSEDIALOGPARAMS *pbdp); -void DlgProc_Browse_UpdateCellText (BROWSEDIALOGPARAMS *pbdp, LPTSTR pszCell); - -BOOL DlgProc_Browse_StartSearch (BROWSEDIALOGPARAMS *pbdp, BOOL fCloseDlgIfFail); -void DlgProc_Browse_StopSearch (BROWSEDIALOGPARAMS *pbdp); -DWORD _stdcall DlgProc_Browse_ThreadProc (LPARAM lp); - -void EnumeratePrincipalsRemotely (LPBROWSEDIALOGPARAMS pbdp, DWORD idClient); -void EnumeratePrincipalsLocally (LPBROWSEDIALOGPARAMS pbdp); - - -/* - *** ShowBrowseDialog - * - * This function presents a dialog which allows the user to select a user - * or group from a list. - * - */ - -BOOL AfsAppLib_ShowBrowseDialog (LPBROWSEDLG_PARAMS lpp) -{ - BROWSEDIALOGPARAMS *pbdp; - BOOL rc = FALSE; - - if ((pbdp = New (BROWSEDIALOGPARAMS)) != NULL) - { - memset (pbdp, 0x00, sizeof(BROWSEDIALOGPARAMS)); - lstrcpy (pbdp->szNamed, lpp->szNamed); - lstrcpy (pbdp->szCell, lpp->szCell); - pbdp->lpcl = lpp->lpcl; - pbdp->bt = lpp->bt; - pbdp->idsTitle = lpp->idsTitle; - pbdp->idsPrompt = lpp->idsPrompt; - pbdp->idsNone = lpp->idsNone; - pbdp->hCreds = lpp->hCreds; - - switch (pbdp->bt) - { - case btLOCAL_USER: - case btLOCAL_GROUP: - pbdp->fThisCellOnly = TRUE; - break; - - case btANY_USER: - case btANY_GROUP: - pbdp->fThisCellOnly = FALSE; - break; - } - - if (ModalDialogParam (IDD_APPLIB_BROWSE, lpp->hParent, (DLGPROC)DlgProc_Browse, (LPARAM)pbdp) == IDOK) - { - lstrcpy (lpp->szCell, pbdp->szCell); - lstrcpy (lpp->szNamed, pbdp->szNamed); - rc = TRUE; - } - - Delete (pbdp); - } - - return rc; -} - - -/* - *** DlgProc_Browse - * - * This is the dialog proc for the Browse Cell dialog. - * - */ - -#define WM_FOUNDNAME (WM_USER +100) -#define WM_THREADSTART (WM_USER +101) -#define WM_THREADDONE (WM_USER +102) - -BOOL CALLBACK DlgProc_Browse (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - BROWSEDIALOGPARAMS *pbdp; - - if (AfsAppLib_HandleHelp (IDD_APPLIB_BROWSE, hDlg, msg, wp, lp)) - { - return FALSE; - } - - if (msg == WM_INITDIALOG) - { - SetWindowLong (hDlg, DWL_USER, lp); - } - - if ((pbdp = (BROWSEDIALOGPARAMS *)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - DlgProc_Browse_OnInitDialog (hDlg, pbdp); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case LVN_ITEMCHANGED: - if ( ((LPNM_LISTVIEW)lp)->uNewState & LVIS_SELECTED ) - { - DlgProc_Browse_SelectedEntry (hDlg, pbdp); - } - break; - - case NM_DBLCLK: - PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDC_BROWSE_SELECT)); - break; - } - break; - - case WM_DESTROY: - DlgProc_Browse_StopSearch (pbdp); - - if (pbdp->hImages != NULL) - { - ListView_SetImageList (GetDlgItem (hDlg, IDC_BROWSE_LIST), 0, 0); - ImageList_Destroy (pbdp->hImages); - } - break; - - case WM_FOUNDNAME: - { - LPTSTR pszName = (LPTSTR)lp; - if (pszName != NULL) - { - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - LV_AddItem (hList, 1, INDEX_SORT, 0, 0, pszName); - FreeString (pszName); - } - break; - } - - case WM_THREADSTART: - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_BROWSE_WAITING); - SetDlgItemText (pbdp->hDlg, IDC_BROWSE_STATUS, szText); - break; - } - - case WM_THREADDONE: - { - SetDlgItemText (pbdp->hDlg, IDC_BROWSE_STATUS, TEXT("")); - break; - } - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_BROWSE_SELECT: - if ( (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NONE) != NULL) && - (IsDlgButtonChecked (pbdp->hDlg, IDC_BROWSE_NONE)) ) - { - pbdp->szCell[0] = TEXT('\0'); - pbdp->szNamed[0] = TEXT('\0'); - } - else - { - GetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell, cchNAME); - GetDlgItemText (hDlg, IDC_BROWSE_NAMED, pbdp->szNamed, cchRESOURCE); - } - EndDialog (hDlg, IDOK); - break; - - case IDC_BROWSE_CELL: - if (HIWORD(wp) == CBN_SELCHANGE) - { - GetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell, cchNAME); - DlgProc_Browse_StartSearch (pbdp, FALSE); - } - break; - - case IDC_BROWSE_RESTART: - GetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell, cchNAME); - DlgProc_Browse_StartSearch (pbdp, FALSE); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_BROWSE_NAMED), (LPARAM)TRUE); - break; - - case IDC_BROWSE_NAMED: - if (HIWORD(wp) == EN_UPDATE) // has the user hit Enter here? - { - TCHAR szTest[ cchRESOURCE ]; - - GetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest, cchRESOURCE); - - if ( (lstrlen (szTest) > 0) && - (szTest[ lstrlen(szTest)-1 ] == TEXT('\n')) ) - { - szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); - - if ( (lstrlen (szTest) > 0) && - (szTest[ lstrlen(szTest)-1 ] == TEXT('\r')) ) - { - szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); - } - - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest); - PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDC_BROWSE_SELECT)); - } - } - break; - - case IDC_BROWSE_NONE: - DlgProc_Browse_OnNone (hDlg, pbdp); - break; - } - break; - } - } - - return FALSE; -} - - -/* - *** DlgProc_Browse_OnInitDialog - * - * The WM_INITDIALOG handler for the Browse dialog. This routine fills - * in the dialog with any starting parameters, and kicks off a new - * searching thread for the given cell. - * - */ - -void DlgProc_Browse_OnInitDialog (HWND hDlg, BROWSEDIALOGPARAMS *pbdp) -{ - TCHAR szText[ cchRESOURCE ]; - LPTSTR psz; - - pbdp->hDlg = hDlg; - - // We'll need an imagelist, if we want icons in the listview. - // This looks difficult but it's not--tis just a matter of selecting - // an appropriate bitmap. - // - if ((pbdp->hImages = ImageList_Create (cxICON, cyICON, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0) - { - HBITMAP bmp; - - if (pbdp->bt == btLOCAL_USER) - { - bmp = LoadBitmap (APPLIB_HINST, MAKEINTRESOURCE( IDB_LOCAL_USER )); - } - else if (pbdp->bt == btANY_USER) - { - bmp = LoadBitmap (APPLIB_HINST, MAKEINTRESOURCE( IDB_FOREIGN_USER )); - } - else if (pbdp->bt == btLOCAL_GROUP) - { - bmp = LoadBitmap (APPLIB_HINST, MAKEINTRESOURCE( IDB_LOCAL_GROUP )); - } - else if (pbdp->bt == btANY_GROUP) - { - bmp = LoadBitmap (APPLIB_HINST, MAKEINTRESOURCE( IDB_FOREIGN_GROUP )); - } - - if (bmp != NULL) - { - ImageList_AddMasked (pbdp->hImages, bmp, clrTRANSPARENT); - DeleteObject (bmp); - } - - ListView_SetImageList (GetDlgItem (hDlg, IDC_BROWSE_LIST), pbdp->hImages, LVSIL_SMALL); - } - - // There's a default pushbutton on this dialog, so that hitting - // RETURN when you're in the Cell combobox will restart the search - // (a default pushbutton always gets called when RETURN is hit, - // unless your control traps it). But the user doesn't want to *see* - // that thing, so move it way off the dialog's client area. - // - RECT r; - GetWindowRect (GetDlgItem (hDlg, IDC_BROWSE_RESTART), &r); - SetWindowPos (GetDlgItem (hDlg, IDC_BROWSE_RESTART), NULL, - 0 - (r.right-r.left), 0 - (r.bottom-r.top), 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - - // Fill in the choices underneath IDC_BROWSE_CELL. Can the - // user enter a new cell name? - // - if (pbdp->fThisCellOnly) - { - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CELL), FALSE); - } - else - { - CB_StartChange (GetDlgItem (hDlg, IDC_BROWSE_CELL)); - - if (!pbdp->lpcl) - { - TCHAR szDefCell[ cchNAME ]; - if (AfsAppLib_GetLocalCell (szDefCell) && *szDefCell) - { - CB_AddItem (GetDlgItem (hDlg, IDC_BROWSE_CELL), szDefCell, 1); - } - } - else for (size_t ii = 0; ii < pbdp->lpcl->nCells; ++ii) - { - CB_AddItem (GetDlgItem (hDlg, IDC_BROWSE_CELL), pbdp->lpcl->aCells[ii], 1+ii); - } - - CB_EndChange (GetDlgItem (hDlg, IDC_BROWSE_CELL), 1); - } - - // Select various texts to display in the dialog - // - psz = FormatString (TEXT("%1"), TEXT("%m"), pbdp->idsTitle); - SetWindowText (hDlg, psz); - FreeString (psz); - GetString (szText, pbdp->idsPrompt); - SetDlgItemText (hDlg, IDC_BROWSE_TYPE, szText); - - // If the caller wants us to display a "[X] No Group" checkbox, do so - // by creating a checkbox right underneath the IDC_BROWSE_NAMED edit - // control--note that we'll have to hide IDC_BROWSE_STATUS if that's - // the case. - // - if (pbdp->idsNone != 0) - { - ShowWindow (GetDlgItem (pbdp->hDlg, IDC_BROWSE_STATUS), FALSE); - - RECT rr; - GetRectInParent (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NAMED), &rr); - - LONG cy; - cy = rr.bottom -rr.top; - rr.top += cy +3; - rr.bottom = rr.top +cy; - - GetString (szText, pbdp->idsNone); - CreateWindow ("Button", szText, WS_CHILD | BS_AUTOCHECKBOX, - rr.left, rr.top, rr.right-rr.left, rr.bottom-rr.top, - pbdp->hDlg, (HMENU)IDC_BROWSE_NONE, APPLIB_HINST, 0); - - HFONT hf = (HFONT)GetStockObject (DEFAULT_GUI_FONT); - SendMessage (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NONE), WM_SETFONT, (WPARAM)hf, FALSE); - ShowWindow (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NONE), TRUE); - - if (pbdp->szNamed[0] == TEXT('\0')) - CheckDlgButton (pbdp->hDlg, IDC_BROWSE_NONE, TRUE); - else - CheckDlgButton (pbdp->hDlg, IDC_BROWSE_NONE, FALSE); - - DlgProc_Browse_OnNone (pbdp->hDlg, pbdp); - } - - SetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell); - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, pbdp->szNamed); - - // Start looking for users/groups - // - DlgProc_Browse_StartSearch (pbdp, TRUE); -} - - -/* - *** DlgProc_Browse_OnNone - * - * This routine is called whenever the user checks or unchecks the - * "[X] None" checkbox (which we may not even be displaying) - * - */ - -void DlgProc_Browse_OnNone (HWND hDlg, BROWSEDIALOGPARAMS *pbdp) -{ - if (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NONE) != NULL) - { - BOOL fNone = IsDlgButtonChecked (pbdp->hDlg, IDC_BROWSE_NONE); - - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CELL), !fNone && !pbdp->fThisCellOnly); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_NAMED), !fNone); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), !fNone); - - DlgProc_Browse_SelectedEntry (hDlg, pbdp); - } -} - - -/* - *** DlgProc_Browse_SelectedEntry - * - * This routine is called whenever the user selects a new entry within - * the Browse dialog's listview - * - */ - -void DlgProc_Browse_SelectedEntry (HWND hDlg, BROWSEDIALOGPARAMS *pbdp) -{ - if ( (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NONE) != NULL) && - (IsDlgButtonChecked (pbdp->hDlg, IDC_BROWSE_NONE)) ) - { - pbdp->szNamed[0] = TEXT('\0'); - } - else - { - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - short idxSelected = LV_GetSelected (hList); - - if (idxSelected == -1) - pbdp->szNamed[0] = TEXT('\0'); - else - LV_GetItemText (hList, idxSelected, 0, pbdp->szNamed); - - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, pbdp->szNamed); - } -} - - -/* - *** DlgProc_Browse_UpdateCellText - * - * This routine places the given cell name in the browse dialog. - * - */ - -void DlgProc_Browse_UpdateCellText (BROWSEDIALOGPARAMS *pbdp, LPTSTR pszCell) -{ - SetDlgItemText (pbdp->hDlg, IDC_BROWSE_CELL, pbdp->szCell); -} - - -/* - *** DlgProc_Browse_StartSearch - * - * This routine initiates a thread which enumerates all users/groups within - * the given cell, posting messages to describe what it finds to the Browse - * dialog's DLGPROC. - * - */ - -BOOL DlgProc_Browse_StartSearch (BROWSEDIALOGPARAMS *pbdp, BOOL fCloseDlgIfFail) -{ - DWORD dwThreadID; - - // Can't start a new search until the old search terminates. - // - DlgProc_Browse_StopSearch (pbdp); - - // Then make sure that we have a valid cell to query--if not, it may - // be grounds to terminate the entire browse dialog. - // - lstrcpy (pbdp->szThreadCell, pbdp->szCell); - - if (!pbdp->szCell[0]) - { - AfsAppLib_GetLocalCell (pbdp->szCell); - - lstrcpy (pbdp->szThreadCell, pbdp->szCell); - - DlgProc_Browse_UpdateCellText (pbdp, pbdp->szThreadCell); - } - - if (!pbdp->szCell[0]) - { - if (fCloseDlgIfFail) - EndDialog (pbdp->hDlg, IDCANCEL); - - MessageBeep (MB_ICONHAND); - Message (MB_ICONHAND, IDS_BROWSE_BADCELL_TITLE, IDS_BROWSE_BADCELL_DESC); - - if (!fCloseDlgIfFail) - PostMessage (pbdp->hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (pbdp->hDlg, IDC_BROWSE_CELL), (LPARAM)TRUE); - return FALSE; - } - - // Great--we can do the search. Start a thread to do so. - // - pbdp->fCanStopThreadEasily = FALSE; - pbdp->fShouldStopThread = FALSE; - pbdp->fThreadActive = FALSE; - - ListView_DeleteAllItems (GetDlgItem (pbdp->hDlg, IDC_BROWSE_LIST)); - - pbdp->hThread = CreateThread (NULL, 0, - (LPTHREAD_START_ROUTINE)DlgProc_Browse_ThreadProc, - pbdp, 0, &dwThreadID); - - return (pbdp->hThread == 0) ? FALSE : TRUE; -} - - -/* - *** DlgProc_Browse_StopSearch - * - * This routine signals the search thread to stop, and will not return - * until it does. - * - */ - -void DlgProc_Browse_StopSearch (BROWSEDIALOGPARAMS *pbdp) -{ - if (pbdp->fThreadActive) - { - if (pbdp->fCanStopThreadEasily) - { - pbdp->fShouldStopThread = TRUE; - - WaitForSingleObject (pbdp->hThread, INFINITE); - } - else - { - TerminateThread (pbdp->hThread, 0); - pbdp->fThreadActive = FALSE; - } - } - - SetDlgItemText (pbdp->hDlg, IDC_BROWSE_STATUS, TEXT("")); -} - - -/* - *** DlgProc_Browse_ThreadProc - * - * The worker thread for the Browse dialog; this routine enumerates all - * users or groups on the given cell, posting a WM_FOUNDNAME message to - * the Browse dialog after every successful find. Note that LPARAM on - * such messages points to a string which should be freed with FreeString() - * when no longer needed. - * - */ - -DWORD _stdcall DlgProc_Browse_ThreadProc (LPARAM lp) -{ - BROWSEDIALOGPARAMS *pbdp; - - if ((pbdp = (BROWSEDIALOGPARAMS *)lp) != NULL) - { - pbdp->fThreadActive = TRUE; - - PostMessage (pbdp->hDlg, WM_THREADSTART, 0, 0); - - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - EnumeratePrincipalsRemotely (pbdp, idClient); - } - else - { - if (OpenClientLibrary()) - { - if (OpenKasLibrary()) - { - EnumeratePrincipalsLocally (pbdp); - CloseKasLibrary(); - } - - CloseClientLibrary(); - } - } - - pbdp->fThreadActive = FALSE; - - PostMessage (pbdp->hDlg, WM_THREADDONE, 0, 0); - } - - return 0; -} - - -void EnumeratePrincipalsLocally (LPBROWSEDIALOGPARAMS pbdp) -{ - ULONG status; - - char szCellA[ MAX_PATH ]; - CopyStringToAnsi (szCellA, pbdp->szCell); - - PVOID hCell; - if (afsclient_CellOpen (szCellA, pbdp->hCreds, &hCell, (afs_status_p)&status)) - { - // Enumerate the principals recognized by KAS. - // - PVOID hEnum; - if (kas_PrincipalGetBegin (hCell, NULL, &hEnum, (afs_status_p)&status)) - { - pbdp->fCanStopThreadEasily = TRUE; - - while (!pbdp->fShouldStopThread) - { - kas_identity_t who; - if (!kas_PrincipalGetNext (hEnum, &who, (afs_status_p)&status)) - break; - - LPTSTR pszName; - if ((pszName = CloneAnsi ((LPSTR)who.principal)) == NULL) - break; - - PostMessage (pbdp->hDlg, WM_FOUNDNAME, 0, (LPARAM)pszName); - // pszName freed by DlgProc_Browse when it receives the message - } - - kas_PrincipalGetDone (hEnum, (afs_status_p)&status); - } - - afsclient_CellClose (hCell, (afs_status_p)&status); - } -} - - -void EnumeratePrincipalsRemotely (LPBROWSEDIALOGPARAMS pbdp, DWORD idClient) -{ - ULONG status; - - // Open the relevant cell - // - ASID idCell; - if (asc_CellOpen (idClient, pbdp->hCreds, pbdp->szThreadCell, AFSADMSVR_SCOPE_USERS, &idCell, &status)) - { - // Obtain a list of ASIDs from the admin server, each representing - // a principal which we want to show. - // - LPASIDLIST pAsidList; - if (asc_ObjectFindMultiple (idClient, idCell, TYPE_USER, NULL, NULL, &pAsidList, &status)) - { - if (pAsidList) - { - // Obtain rudimentary properties (e.g., their names) for these ASIDs - // - LPASOBJPROPLIST pPropList; - if (asc_ObjectPropertiesGetMultiple (idClient, GET_RUDIMENTARY_DATA, idCell, pAsidList, &pPropList, &status)) - { - if (pPropList) - { - // Use the information in {pPropList} to populate the display - // - for (size_t iEntry = 0; iEntry < pPropList->cEntries; ++iEntry) - { - LPTSTR pszName; - if ((pszName = CloneString (pPropList->aEntries[ iEntry ].ObjectProperties.szName)) != NULL) - { - PostMessage (pbdp->hDlg, WM_FOUNDNAME, 0, (LPARAM)pszName); - // pszName freed by DlgProc_Browse when it receives the message - } - } - - asc_ObjPropListFree (&pPropList); - } - } - - asc_AsidListFree (&pAsidList); - } - } - - asc_CellClose (idClient, idCell, &status); - } -} - diff --git a/src/WINNT/afsapplib/al_browseset.cpp b/src/WINNT/afsapplib/al_browseset.cpp deleted file mode 100644 index d7b0c429d..000000000 --- a/src/WINNT/afsapplib/al_browseset.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - -#define WM_FOUNDNAME (WM_USER +100) -#define WM_THREADSTART (WM_USER +101) -#define WM_THREADDONE (WM_USER +102) - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK BrowseSet_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void BrowseSet_OnInitDialog (HWND hDlg, LPBROWSESETDLG_PARAMS pszFilename); -void BrowseSet_OnDestroy (HWND hDlg); -void BrowseSet_OnAddString (HWND hDlg, LPTSTR pszString); -void BrowseSet_OnSelectedEntry (HWND hDlg); - -void BrowseSet_StartSearch (HWND hDlg, LPBROWSESETDLG_PARAMS lpp); -void BrowseSet_OnSearchStart (HWND hDlg); -void BrowseSet_OnSearchDone (HWND hDlg); -void BrowseSet_EmptyList (HWND hDlg); -DWORD WINAPI BrowseSet_Init_ThreadProc (LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL AfsAppLib_ShowBrowseFilesetDialog (LPBROWSESETDLG_PARAMS lpp) -{ - return (ModalDialogParam (IDD_APPLIB_BROWSE_FILESET, lpp->hParent, (DLGPROC)BrowseSet_DlgProc, (LPARAM)lpp) == IDOK) ? TRUE : FALSE; -} - - -BOOL CALLBACK BrowseSet_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_APPLIB_BROWSE_FILESET, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPBROWSESETDLG_PARAMS lpp; - if ((lpp = (LPBROWSESETDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - lpp->pInternal = (PVOID)hDlg; - BrowseSet_OnInitDialog (hDlg, lpp); - break; - - case WM_DESTROY: - BrowseSet_OnDestroy (hDlg); - lpp->pInternal = NULL; - break; - - case WM_THREADSTART: - BrowseSet_OnSearchStart (hDlg); - break; - - case WM_THREADDONE: - BrowseSet_OnSearchDone (hDlg); - break; - - case WM_FOUNDNAME: - BrowseSet_OnAddString (hDlg, (LPTSTR)wp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - GetDlgItemText (hDlg, IDC_BROWSE_NAMED, lpp->szFileset, cchNAME); - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_BROWSE_CELL: - if (HIWORD(wp) == CBN_SELCHANGE) - { - GetDlgItemText (hDlg, IDC_BROWSE_CELL, lpp->szCell, cchNAME); - BrowseSet_StartSearch (hDlg, lpp); - } - break; - - case IDC_BROWSE_NAMED: - if (HIWORD(wp) == EN_UPDATE) // has the user hit Enter here? - { - TCHAR szTest[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest, cchRESOURCE); - - if ( (lstrlen (szTest) > 0) && (szTest[ lstrlen(szTest)-1 ] == TEXT('\n')) ) - { - szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); - - if ( (lstrlen (szTest) > 0) && (szTest[ lstrlen(szTest)-1 ] == TEXT('\r')) ) - szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); - - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest); - PostMessage (hDlg, WM_COMMAND, MAKELONG(IDOK,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDOK)); - } - } - break; - - case IDC_BROWSE_RESTART: - GetDlgItemText (hDlg, IDC_BROWSE_CELL, lpp->szCell, cchNAME); - BrowseSet_StartSearch (hDlg, lpp); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_BROWSE_NAMED), (LPARAM)TRUE); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case LVN_ITEMCHANGED: - if ( ((LPNM_LISTVIEW)lp)->uNewState & LVIS_SELECTED ) - BrowseSet_OnSelectedEntry (hDlg); - break; - - case NM_DBLCLK: - PostMessage (hDlg, WM_COMMAND, MAKELONG(IDOK,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDOK)); - break; - } - break; - } - } - - return FALSE; -} - - -void BrowseSet_OnInitDialog (HWND hDlg, LPBROWSESETDLG_PARAMS lpp) -{ - if (lpp->idsTitle) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, lpp->idsTitle); - SetWindowText (hDlg, szText); - } - - if (lpp->idsPrompt) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, lpp->idsPrompt); - SetDlgItemText (hDlg, IDC_BROWSE_TYPE, szText); - } - - ListView_SetImageList (GetDlgItem (hDlg, IDC_BROWSE_LIST), AfsAppLib_CreateImageList(FALSE), LVSIL_SMALL); - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, lpp->szFileset); - - if (!lpp->lpcl) - { - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CELL), FALSE); - } - else - { - CB_StartChange (GetDlgItem (hDlg, IDC_BROWSE_CELL)); - for (size_t ii = 0; ii < lpp->lpcl->nCells; ++ii) - CB_AddItem (GetDlgItem (hDlg, IDC_BROWSE_CELL), lpp->lpcl->aCells[ii], 1+ii); - CB_EndChange (GetDlgItem (hDlg, IDC_BROWSE_CELL), 1); - } - if (lpp->szCell[0] != TEXT('\0')) - { - SetDlgItemText (hDlg, IDC_BROWSE_CELL, lpp->szCell); - } - - BrowseSet_StartSearch (hDlg, lpp); - - // There's a default pushbutton on this dialog, so that hitting - // RETURN when you're in the Cell combobox will restart the search - // (a default pushbutton always gets called when RETURN is hit, - // unless your control traps it). But the user doesn't want to *see* - // that thing, so move it way off the dialog's client area. - // - RECT r; - GetWindowRect (GetDlgItem (hDlg, IDC_BROWSE_RESTART), &r); - SetWindowPos (GetDlgItem (hDlg, IDC_BROWSE_RESTART), NULL, - 0 - (r.right-r.left), 0 - (r.bottom-r.top), 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); -} - - -void BrowseSet_OnDestroy (HWND hDlg) -{ - BrowseSet_EmptyList (hDlg); -} - - -void BrowseSet_OnSelectedEntry (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - LPTSTR pszString = (LPTSTR)LV_GetSelectedData (hList); - if (pszString != NULL) - { - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, pszString); - } -} - - -void BrowseSet_StartSearch (HWND hDlg, LPBROWSESETDLG_PARAMS lpp) -{ - BrowseSet_EmptyList (hDlg); - - LPBROWSESETDLG_PARAMS lppNew = New (BROWSESETDLG_PARAMS); - memcpy (lppNew, lpp, sizeof(BROWSESETDLG_PARAMS)); - - DWORD dwThreadID; - HANDLE hThread; - if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)BrowseSet_Init_ThreadProc, (PVOID)lppNew, 0, &dwThreadID)) == INVALID_HANDLE_VALUE) - { - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), FALSE); - Delete (lppNew); - } -} - - -void BrowseSet_OnSearchStart (HWND hDlg) -{ - TCHAR szWait[ cchRESOURCE ]; - GetString (szWait, IDS_BROWSE_WAITING); - SetDlgItemText (hDlg, IDC_BROWSE_STATUS, szWait); -} - - -void BrowseSet_OnSearchDone (HWND hDlg) -{ - SetDlgItemText (hDlg, IDC_BROWSE_STATUS, TEXT("")); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), TRUE); -} - - -void BrowseSet_OnAddString (HWND hDlg, LPTSTR pszString) -{ - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - LV_AddItem (hList, 1, INDEX_SORT, (LPARAM)pszString, imageFILESET, pszString); - // string freed when list destroyed -} - - -void BrowseSet_EmptyList (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - - int iiMax = ListView_GetItemCount (hList); - for (int ii = 0; ii < iiMax; ++ii) - { - LV_ITEM lvi; - memset (&lvi, 0x00, sizeof(LV_ITEM)); - lvi.mask = LVIF_PARAM; - lvi.iItem = ii; - if (ListView_GetItem (hList, &lvi)) - { - LPTSTR psz; - if ((psz = (LPTSTR)lvi.lParam) != NULL) - { - lvi.mask = LVIF_PARAM; - lvi.iItem = ii; - lvi.lParam = 0; - ListView_SetItem (hList, &lvi); - FreeString (psz); - } - } - } -} - - -DWORD WINAPI BrowseSet_Init_ThreadProc (LPARAM lp) -{ - LPBROWSESETDLG_PARAMS lpp = (LPBROWSESETDLG_PARAMS)lp; - - char szCellA[ cchNAME ]; - CopyStringToAnsi (szCellA, lpp->szCell); - - if (IsWindow ((HWND)(lpp->pInternal))) - PostMessage ((HWND)(lpp->pInternal), WM_THREADSTART, 0, 0); - - // Fill in hList with the names of all filesets in the cell. - // - ULONG status = 0; -#if 0 - // TODO - if (OpenFTS (&status)) - { - PVOID hCell; - if ((status = FtsOpenCell (szCellA, &hCell)) == 0) - { - fldb_short_ft_info_t *fti; - if ((status = FtsAllocateShortFtInfoBuffer (&fti)) == 0) - { - PVOID cookie = 0; - ULONG nEntries; - - while ( (FtsListFilesetsFromFldb (hCell, fti, &nEntries, &cookie) == 0) && (nEntries > 0) ) - { - if (!IsWindow ((HWND)(lpp->pInternal))) - break; - - for (ULONG ii = 0; ii < nEntries; ++ii) - { -#define DECODE_SHINFO_TYPE_FLAGS(_fl) ((_fl) >> 12) - if (DECODE_SHINFO_TYPE_FLAGS(fti[ ii ].flags) & FTS_FT_SHINFO_TYPE_RW) - { - LPTSTR pszFileset; - if ((pszFileset = CloneString (fti[ii].name)) != NULL) - { - PostMessage ((HWND)(lpp->pInternal), WM_FOUNDNAME, (WPARAM)pszFileset, 0); - // string memory is freed by recipient of message - } - } - } - } - FtsFreeShortFtInfoBuffer (fti); - } - FtsCloseCell (hCell); - } - CloseFTS(); - } -#endif - - if (IsWindow ((HWND)(lpp->pInternal))) - PostMessage ((HWND)(lpp->pInternal), WM_THREADDONE, status, 0); - - Delete (lpp); - return 0; -} - diff --git a/src/WINNT/afsapplib/al_cover.cpp b/src/WINNT/afsapplib/al_cover.cpp deleted file mode 100644 index 5a02c71fe..000000000 --- a/src/WINNT/afsapplib/al_cover.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdCover[] = { - { IDC_COVER_BORDER, raSizeX | raSizeY, 0, 0 }, - { IDC_COVER_DESC, raSizeX | raSizeY | raRepaint, 0, 0 }, - { IDC_COVER_BUTTON, raMoveX | raMoveY | raRepaint, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - -#define WS_EX_HIDDENBYCOVER 0x10000000L - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define dwCOVER_SIGNATURE 0xC0E0C0E0 // SetWindowLong(hDlgCover,DWL_USER,#) - -typedef struct // COVERPARAMS - { - BOOL fClient; - HWND hWnd; - LPTSTR pszDesc; - LPTSTR pszButton; - } COVERPARAMS, *LPCOVERPARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void OnCoverWindow (WPARAM wp, LPARAM lp); - -BOOL CALLBACK Cover_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void AfsAppLib_CoverClient (HWND hWnd, LPTSTR pszDesc, LPTSTR pszButton) -{ - AfsAppLib_Uncover (hWnd); - - LPCOVERPARAMS lpcp = New (COVERPARAMS); - - lpcp->fClient = TRUE; - lpcp->hWnd = hWnd; - lpcp->pszDesc = CloneString (pszDesc); - lpcp->pszButton = CloneString (pszButton); - - if (!AfsAppLib_GetMainWindow()) - OnCoverWindow (0, (LPARAM)lpcp); - else - PostMessage (AfsAppLib_GetMainWindow(), WM_COVER_WINDOW, 0, (LPARAM)lpcp); -} - - -void AfsAppLib_CoverWindow (HWND hWnd, LPTSTR pszDesc, LPTSTR pszButton) -{ - AfsAppLib_Uncover (hWnd); - - LPCOVERPARAMS lpcp = New (COVERPARAMS); - - lpcp->fClient = FALSE; - lpcp->hWnd = hWnd; - lpcp->pszDesc = CloneString (pszDesc); - lpcp->pszButton = CloneString (pszButton); - - if (!AfsAppLib_GetMainWindow()) - OnCoverWindow (0, (LPARAM)lpcp); - else - PostMessage (AfsAppLib_GetMainWindow(), WM_COVER_WINDOW, 0, (LPARAM)lpcp); -} - - -void AfsAppLib_Uncover (HWND hDlg) -{ - if (!AfsAppLib_GetMainWindow()) - OnCoverWindow ((WPARAM)hDlg, 0); - else - PostMessage (AfsAppLib_GetMainWindow(), WM_COVER_WINDOW, (WPARAM)hDlg, 0); -} - - -void OnCoverWindow (WPARAM wp, LPARAM lp) -{ - LPCOVERPARAMS lpcp; - if ((lpcp = (LPCOVERPARAMS)lp) == NULL) - { - HWND hDlg = (HWND)wp; - - if (!IsWindowVisible (hDlg)) // did we create it as a sibling? - { - ShowWindow (hDlg, TRUE); - EnableWindow (hDlg, TRUE); - hDlg = GetParent(hDlg); - } - - for (HWND hChild = GetWindow (hDlg, GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - - if (GetClassName (hChild, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, TEXT("#32770"))) // WC_DIALOG - { - if (GetWindowLong (hChild, DWL_USER) == dwCOVER_SIGNATURE) - { - DestroyWindow (hChild); - break; - } - } - } - } - } - else - { - HWND hCover = ModelessDialogParam (IDD_APPLIB_COVER, - (lpcp->fClient) ? lpcp->hWnd : GetParent(lpcp->hWnd), - (DLGPROC)Cover_DialogProc, - (LPARAM)lp); - - ShowWindow (hCover, TRUE); - SetWindowLong (hCover, DWL_USER, dwCOVER_SIGNATURE); - - FreeString (lpcp->pszDesc); - FreeString (lpcp->pszButton); - Delete (lpcp); - } -} - - -BOOL CALLBACK Cover_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - LPCOVERPARAMS lpcp; - lpcp = (LPCOVERPARAMS)lp; - - SetDlgItemText (hDlg, IDC_COVER_DESC, (lpcp && lpcp->pszDesc) ? lpcp->pszDesc : TEXT("")); - - if (lpcp && lpcp->pszButton) - { - SetDlgItemText (hDlg, IDC_COVER_BUTTON, lpcp->pszButton); - } - else - { - DestroyWindow (GetDlgItem (hDlg, IDC_COVER_BUTTON)); - } - - RECT rCover; - if (lpcp->fClient) - { - // If we're covering a window's client area, we've been created - // as a child of that window. Hide its other children, and we'll - // be done. - // - GetClientRect (lpcp->hWnd, &rCover); - - for (HWND hChild = GetWindow (lpcp->hWnd, GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - if (hChild == hDlg) - continue; - - if (IsWindowVisible (hChild)) - { - LONG dwStyleEx = GetWindowLong (hChild, GWL_EXSTYLE); - SetWindowLong (hChild, GWL_EXSTYLE, dwStyleEx | WS_EX_HIDDENBYCOVER); - ShowWindow (hChild, FALSE); - } - } - } - else - { - // If we're covering a window's complete area, we've been created - // as a sibling of that window. Hide that window. - // - GetRectInParent (lpcp->hWnd, &rCover); - ShowWindow (lpcp->hWnd, FALSE); - EnableWindow (lpcp->hWnd, FALSE); - } - - if (lpcp && lpcp->pszButton) - { - RECT rDesc; // give the button's space to the Description window - RECT rButton; - GetRectInParent (GetDlgItem (hDlg, IDC_COVER_DESC), &rDesc); - GetRectInParent (GetDlgItem (hDlg, IDC_COVER_BUTTON), &rButton); - - // If the window is higher than it is wide, put the description - // above the button. Otherwise, put it to the right of the button. - // - if (cyRECT(rCover) > cxRECT(rCover)) - { - // shrink description vertically - SetWindowPos (GetDlgItem (hDlg, IDC_COVER_DESC), NULL, - 0, 0, - cxRECT(rDesc), - cyRECT(rDesc) - rDesc.bottom + rButton.top -5, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - } - else - { - // shrink description horizontally - SetWindowPos (GetDlgItem (hDlg, IDC_COVER_DESC), NULL, - 0, 0, - cxRECT(rDesc) - rDesc.right + rButton.left -5, - cyRECT(rDesc), - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - } - } - - ResizeWindow (hDlg, awdCover, rwaMoveToHere, &rCover); - break; - - case WM_DESTROY: - // Show all of our parent's other children, in preparation for - // our going away. - // - HWND hChild; - for (hChild = GetWindow (GetParent (hDlg), GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - if (hChild == hDlg) - continue; - - LONG dwStyleEx = GetWindowLong (hChild, GWL_EXSTYLE); - if (dwStyleEx & WS_EX_HIDDENBYCOVER) - { - SetWindowLong (hChild, GWL_EXSTYLE, dwStyleEx & (~WS_EX_HIDDENBYCOVER)); - ShowWindow (hChild, TRUE); - } - } - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdCover, rwaFixupGuts); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_COVER_BUTTON: - PostMessage (GetParent(hDlg), WM_COMMAND, wp, lp); - break; - } - break; - } - - return FALSE; -} - diff --git a/src/WINNT/afsapplib/al_creds.cpp b/src/WINNT/afsapplib/al_creds.cpp deleted file mode 100644 index 237a606f6..000000000 --- a/src/WINNT/afsapplib/al_creds.cpp +++ /dev/null @@ -1,973 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "al_dynlink.h" -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void OnExpiredCredentials (WPARAM wp, LPARAM lp); - -BOOL CALLBACK OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void OpenCell_OnInitDialog (HWND hDlg, LPOPENCELLDLG_PARAMS lpp); -BOOL OpenCell_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp); -void OpenCell_OnCell (HWND hDlg); -void OpenCell_Enable (HWND hDlg, BOOL fEnable); -void OpenCell_OnGotCreds (HWND hDlg, LPARAM lp); - -BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void NewCreds_OnInitDialog (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp); -BOOL NewCreds_OnOK (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp); -void NewCreds_OnLogin (HWND hDlg); -void NewCreds_Enable (HWND hDlg, BOOL fEnable); -void NewCreds_GetOutParams (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp); - -BOOL CALLBACK BadCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL AfsAppLib_CrackCredentials (PVOID hCreds, LPTSTR pszCell, LPTSTR pszUser, LPSYSTEMTIME pst, ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = 0; - - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - rc = asc_CredentialsCrack (idClient, hCreds, pszCell, pszUser, pst, &status); - } - else if (OpenClientLibrary()) - { - char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ]; - char szCellA[ cchRESOURCE ]; - unsigned long dateExpire; - int fHasKasToken; - - if (afsclient_TokenQuery (hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status)) - { - rc = TRUE; - CopyAnsiToString (pszUser, szUserA); - CopyAnsiToString (pszCell, szCellA); - AfsAppLib_UnixTimeToSystemTime (pst, dateExpire); - } - - CloseClientLibrary(); - } - - if (!hCreds && pStatus) - *pStatus = status; - return rc; -} - - -PVOID AfsAppLib_GetCredentials (LPCTSTR pszCell, ULONG *pStatus) -{ - PVOID hCreds = NULL; - ULONG status = 0; - - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - hCreds = asc_CredentialsGet (idClient, pszCell, &status); - } - else if (OpenClientLibrary()) - { - LPSTR pszCellA = StringToAnsi (pszCell); - - afsclient_TokenGetExisting (pszCellA, &hCreds, (afs_status_p)&status); - - FreeString (pszCellA, pszCell); - CloseClientLibrary(); - } - - if (!hCreds && pStatus) - *pStatus = status; - return hCreds; -} - - -PVOID AfsAppLib_SetCredentials (LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus) -{ - PVOID hCreds = NULL; - ULONG status = 0; - - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - hCreds = asc_CredentialsSet (idClient, pszCell, pszUser, pszPassword, &status); - } - else if (OpenClientLibrary()) - { - char szCellA[ cchRESOURCE ]; - char szUserA[ cchRESOURCE ]; - char szPasswordA[ cchRESOURCE ]; - CopyStringToAnsi (szCellA, pszCell); - CopyStringToAnsi (szUserA, pszUser); - CopyStringToAnsi (szPasswordA, pszPassword); - - afsclient_TokenGetNew (szCellA, szUserA, szPasswordA, &hCreds, (afs_status_p)&status); - - CloseClientLibrary(); - } - - if (hCreds) - { - PostMessage (AfsAppLib_GetMainWindow(), WM_REFRESHED_CREDENTIALS, 0, (LPARAM)hCreds); - } - - if (!hCreds && pStatus) - *pStatus = status; - return hCreds; -} - - -/* - * OPEN CELL DIALOG ___________________________________________________________ - * - */ - -BOOL AfsAppLib_ShowOpenCellDialog (LPOPENCELLDLG_PARAMS lpp) -{ - HINSTANCE hInst = APP_HINST; - if (lpp->idd == 0) - { - hInst = APPLIB_HINST; - lpp->idd = IDD_APPLIB_OPENCELL; - } - if (lpp->hCreds == 0) - { - if (lpp->szCell[0]) - lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell); - else - lpp->hCreds = AfsAppLib_GetCredentials (NULL); - } - - int rc = ModalDialogParam (lpp->idd, lpp->hParent, (DLGPROC)OpenCell_DlgProc, (LPARAM)lpp); - - return (rc == IDOK) ? TRUE : FALSE; -} - - -BOOL CALLBACK OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPOPENCELLDLG_PARAMS lpp; - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPOPENCELLDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (lpp->hookproc) - { - if (CallWindowProc ((WNDPROC)lpp->hookproc, hDlg, msg, wp, lp)) - return TRUE; - } - } - - if (lpp != NULL) - { - if (AfsAppLib_HandleHelp (lpp->idd, hDlg, msg, wp, lp)) - return TRUE; - } - - switch (msg) - { - case WM_INITDIALOG: - OpenCell_OnInitDialog (hDlg, lpp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - return TRUE; - - case IDOK: - if (OpenCell_OnOK (hDlg, lpp)) - EndDialog (hDlg, IDOK); - return TRUE; - - case IDC_OPENCELL_CELL: - switch (HIWORD(wp)) - { - case CBN_SELCHANGE: - TCHAR szCell[ cchNAME ]; - SendDlgItemMessage (hDlg, IDC_OPENCELL_CELL, CB_GETLBTEXT, CB_GetSelected(GetDlgItem (hDlg, IDC_OPENCELL_CELL)), (LPARAM)szCell); - SetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell); - OpenCell_OnCell (hDlg); - break; - - case CBN_EDITCHANGE: - OpenCell_OnCell (hDlg); - break; - } - break; - } - break; - - case WM_REFRESHED_CREDENTIALS: - OpenCell_OnGotCreds (hDlg, lp); - break; - } - - return FALSE; -} - - -void OpenCell_OnInitDialog (HWND hDlg, LPOPENCELLDLG_PARAMS lpp) -{ - // Fix the title of the dialog (unless the caller has supplied a - // custom dialog template) - // - if (lpp && (lpp->idd == IDD_APPLIB_OPENCELL)) - { - TCHAR szApplication[ cchNAME ]; - AfsAppLib_GetAppName (szApplication); - if (szApplication[0] != TEXT('\0')) - { - TCHAR szTitle[ cchRESOURCE ]; - GetWindowText (hDlg, szTitle, cchRESOURCE); - lstrcat (szTitle, TEXT(" - ")); - lstrcat (szTitle, szApplication); - SetWindowText (hDlg, szTitle); - } - } - - // Fill in the 'Cell:' combobox; we'll list the default cell, and any - // cell which the user has specified before. - // - CB_StartChange (GetDlgItem (hDlg, IDC_OPENCELL_CELL), TRUE); - - if (!lpp->lpcl) - { - TCHAR szDefCell[ cchNAME ]; - if (AfsAppLib_GetLocalCell (szDefCell) && *szDefCell) - { - CB_AddItem (GetDlgItem (hDlg, IDC_OPENCELL_CELL), szDefCell, 1); - } - } - else for (size_t ii = 0; ii < lpp->lpcl->nCells; ++ii) - { - CB_AddItem (GetDlgItem (hDlg, IDC_OPENCELL_CELL), lpp->lpcl->aCells[ii], 1+ii); - } - - CB_EndChange (GetDlgItem (hDlg, IDC_OPENCELL_CELL), 1); - - // Set up the "Credentials" box; if the user needs credentials to edit - // this default cell, jump the cursor to the appropriate field - // - SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin")); - - OpenCell_OnCell (hDlg); -} - - -BOOL OpenCell_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp) -{ - BOOL rc = FALSE; - OpenCell_Enable (hDlg, FALSE); - StartHourGlass (); - - // Remember what cell the user chose to edit - // - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME); - - // Try to obtain the credentials specified by the user. - // - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME); - - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME); - - ULONG status; - if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL) - { - ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS); - } - else - { - // See if those credentials are sufficient - // - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - pp.bcdp.hParent = hDlg; - pp.hCreds = lpp->hCreds; - pp.fShowWarning = TRUE; - - if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE) - { - SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin")); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE); - } - } - - if (!rc) - OpenCell_Enable (hDlg, TRUE); - StopHourGlass (); - return rc; -} - - -typedef struct - { - HWND hDlg; - TCHAR szCell[ cchNAME ]; - TCHAR szUser[ cchNAME ]; - SYSTEMTIME stExpire; - BOOL fGotCreds; - BOOL fValidCreds; - } OPENCELL_ONCELL_PARAMS, *LPOPENCELL_ONCELL_PARAMS; - -DWORD WINAPI OpenCell_OnCell_ThreadProc (PVOID lp) -{ - LPOPENCELL_ONCELL_PARAMS lpp; - if ((lpp = (LPOPENCELL_ONCELL_PARAMS)lp) != NULL) - { - PVOID hCreds = AfsAppLib_GetCredentials (lpp->szCell); - lpp->fGotCreds = AfsAppLib_CrackCredentials (hCreds, lpp->szCell, lpp->szUser, &lpp->stExpire); - lpp->fValidCreds = FALSE; - - if (lpp->fGotCreds && AfsAppLib_IsTimeInFuture (&lpp->stExpire)) - { - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.hCreds = hCreds; - lpp->fValidCreds = AfsAppLib_CheckCredentials(&pp); - } - - // Post our results; we'll return the same packet we got. - // - if (IsWindow (lpp->hDlg)) - PostMessage (lpp->hDlg, WM_REFRESHED_CREDENTIALS, 0, (LPARAM)lpp); - else - Delete (lpp); - } - - return 0; -} - - -void OpenCell_OnCell (HWND hDlg) -{ - // Fire up a background thread to query our current credentials in the - // selected cell. - // - LPOPENCELL_ONCELL_PARAMS lpp = New (OPENCELL_ONCELL_PARAMS); - memset (lpp, 0x00, sizeof(lpp)); - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME); - lpp->hDlg = hDlg; - - DWORD dwThreadID; - CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)OpenCell_OnCell_ThreadProc, lpp, 0, &dwThreadID); -} - - -void OpenCell_OnGotCreds (HWND hDlg, LPARAM lp) -{ - LPOPENCELL_ONCELL_PARAMS lpp; - if ((lpp = (LPOPENCELL_ONCELL_PARAMS)lp) != NULL) - { - // Don't do anything to the dialog if the user has chosen a different - // cell than that for which we just queried credentials. - // - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - - if (!lstrcmpi (szCell, lpp->szCell)) - { - TCHAR szPrevCreds[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, szPrevCreds, cchRESOURCE); - - if (!lpp->fGotCreds) - { - LPTSTR psz = FormatString (IDS_CREDS_NONE, TEXT("%s"), lpp->szCell); - SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, psz); - FreeString (psz); - } - else if (!AfsAppLib_IsTimeInFuture (&lpp->stExpire)) - { - LPTSTR pszCreds = FormatString (IDS_CREDS_EXPIRED, TEXT("%s%s%t"), lpp->szCell, lpp->szUser, &lpp->stExpire); - SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, pszCreds); - FreeString (pszCreds); - } - else - { - LPTSTR pszCreds = FormatString (IDS_CREDS_VALID, TEXT("%s%s%t"), lpp->szCell, lpp->szUser, &lpp->stExpire); - SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, pszCreds); - FreeString (pszCreds); - } - - SetDlgItemText (hDlg, IDC_OPENCELL_ID, (lpp->fGotCreds) ? lpp->szUser : TEXT("admin")); - - if (!lpp->fValidCreds && !szPrevCreds[0]) - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE); - } - - Delete (lpp); - } -} - - -void OpenCell_Enable (HWND hDlg, BOOL fEnable) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); - EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable); -} - - -/* - * NEW CREDENTIALS DIALOG _____________________________________________________ - * - */ - -BOOL AfsAppLib_ShowCredentialsDialog (LPCREDENTIALSDLG_PARAMS lpp) -{ - HINSTANCE hInst = APP_HINST; - if (lpp->idd == 0) - { - hInst = APPLIB_HINST; - lpp->idd = IDD_APPLIB_CREDENTIALS; - } - if (lpp->hCreds == 0) - { - if (lpp->szCell[0]) - lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell); - else - lpp->hCreds = AfsAppLib_GetCredentials (NULL); - } - - int rc = ModalDialogParam (lpp->idd, lpp->hParent, (DLGPROC)NewCreds_DlgProc, (LPARAM)lpp); - - return (rc == IDOK) ? TRUE : FALSE; -} - - -BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPCREDENTIALSDLG_PARAMS lpp; - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPCREDENTIALSDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (lpp->hookproc) - { - if (CallWindowProc ((WNDPROC)lpp->hookproc, hDlg, msg, wp, lp)) - return TRUE; - } - } - - if (lpp != NULL) - { - if (AfsAppLib_HandleHelp (lpp->idd, hDlg, msg, wp, lp)) - return TRUE; - } - - switch (msg) - { - case WM_INITDIALOG: - NewCreds_OnInitDialog (hDlg, lpp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - return TRUE; - - case IDOK: - if (NewCreds_OnOK (hDlg, lpp)) - EndDialog (hDlg, IDOK); - return TRUE; - - case IDC_CREDS_LOGIN: - NewCreds_OnLogin (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void NewCreds_OnInitDialog (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp) -{ - // Fix the title of the dialog (unless the caller has supplied a - // custom dialog template) - // - if (lpp && (lpp->idd == IDD_APPLIB_CREDENTIALS)) - { - TCHAR szApplication[ cchNAME ]; - AfsAppLib_GetAppName (szApplication); - if (szApplication[0] != TEXT('\0')) - { - TCHAR szTitle[ cchRESOURCE ]; - GetWindowText (hDlg, szTitle, cchRESOURCE); - lstrcat (szTitle, TEXT(" - ")); - lstrcat (szTitle, szApplication); - SetWindowText (hDlg, szTitle); - } - } - - // Set up the "Credentials" boxes - // - TCHAR szUser[ cchRESOURCE ]; - SYSTEMTIME st; - - BOOL fValidCreds = TRUE; - BOOL fShowCreds = TRUE; - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.hCreds = lpp->hCreds; - pp.fShowWarning = FALSE; - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - pp.bcdp.hParent = hDlg; - - if (!AfsAppLib_CrackCredentials (lpp->hCreds, lpp->szCell, szUser, &st)) - { - fValidCreds = FALSE; - fShowCreds = FALSE; - } - if (!AfsAppLib_IsTimeInFuture (&st)) - { - fValidCreds = FALSE; - fShowCreds = FALSE; - } - if (!AfsAppLib_CheckCredentials (&pp)) - { - fValidCreds = FALSE; - } - - CheckDlgButton (hDlg, IDC_CREDS_LOGIN, !fValidCreds); - if (!fValidCreds) - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_CREDS_PASSWORD), TRUE); - - SetDlgItemText (hDlg, IDC_CREDS_CELL, lpp->szCell); - - if (fShowCreds) - { - SetDlgItemText (hDlg, IDC_CREDS_CURRENTID, szUser); - - LPTSTR pszDate = FormatString (TEXT("%1"), TEXT("%t"), &st); - SetDlgItemText (hDlg, IDC_CREDS_EXPDATE, pszDate); - FreeString (pszDate); - } - - SetDlgItemText (hDlg, IDC_CREDS_ID, TEXT("admin")); - - NewCreds_OnLogin (hDlg); -} - - -BOOL NewCreds_OnOK (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp) -{ - NewCreds_GetOutParams (hDlg, lpp); - if (!IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN)) - return TRUE; - - BOOL rc = FALSE; - StartHourGlass (); - NewCreds_Enable (hDlg, FALSE); - - // Try to obtain the credentials specified by the user. - // - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CREDS_ID, szUser, cchNAME); - - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CREDS_PASSWORD, szPassword, cchNAME); - - ULONG status; - if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL) - { - ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS); - } - else - { - // See if those credentials are sufficient - // - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - pp.bcdp.hParent = hDlg; - pp.hCreds = lpp->hCreds; - pp.fShowWarning = TRUE; - - if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE) - { - SetDlgItemText (hDlg, IDC_CREDS_ID, TEXT("admin")); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_CREDS_PASSWORD), TRUE); - } - } - - if (!rc) - NewCreds_Enable (hDlg, TRUE); - StopHourGlass (); - return rc; -} - - -void NewCreds_OnLogin (HWND hDlg) -{ - BOOL fEnable = IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN); - - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_ID), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_PASSWORD), fEnable); -} - - -void NewCreds_Enable (HWND hDlg, BOOL fEnable) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); - EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_LOGIN), fEnable); - - if (fEnable) - NewCreds_OnLogin (hDlg); - else - { - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_ID), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_PASSWORD), fEnable); - } -} - - -void NewCreds_GetOutParams (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp) -{ - if (!IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN)) - { - lpp->szIdentity[0] = TEXT('\0'); - lpp->szPassword[0] = TEXT('\0'); - } - else - { - GetDlgItemText (hDlg, IDC_CREDS_ID, lpp->szIdentity, cchNAME); - GetDlgItemText (hDlg, IDC_CREDS_PASSWORD, lpp->szPassword, cchNAME); - } -} - - -/* - * TEST CREDENTIALS ___________________________________________________________ - * - */ - -typedef struct - { - BADCREDSDLG_PARAMS bcdp; - LPTSTR pszFullText; - PVOID hCreds; - } REALBADCREDSDLG_PARAMS, *LPREALBADCREDSDLG_PARAMS; - -BOOL AfsAppLib_CheckCredentials (LPCHECKCREDS_PARAMS lpp) -{ - BOOL fCredsOK = TRUE; - int idsWarning = IDS_BADCREDS_DESC_GENERAL; - - TCHAR szCell[ cchNAME ]; - TCHAR szUser[ cchNAME ]; - SYSTEMTIME stExpire; - - if (!AfsAppLib_CrackCredentials (lpp->hCreds, szCell, szUser, &stExpire)) - { - fCredsOK = FALSE; - } - else if (!AfsAppLib_IsUserAdmin (lpp->hCreds, szUser)) - { - fCredsOK = FALSE; - idsWarning = IDS_BADCREDS_DESC_BADCHOICE; - } - else if (!AfsAppLib_IsTimeInFuture (&stExpire)) - { - fCredsOK = FALSE; - idsWarning = IDS_BADCREDS_DESC_EXPIRED; - } - - if (!fCredsOK && lpp->fShowWarning) - { - if (lpp->bcdp.pfShowWarningEver && !(*lpp->bcdp.pfShowWarningEver)) - { - fCredsOK = TRUE; // user says always ignore bad credentials. - } - else - { - if (!szCell[0]) - AfsAppLib_GetLocalCell (szCell); - - int idsDesc = (lpp->bcdp.idsDesc) ? lpp->bcdp.idsDesc : IDS_BADCREDS_DESC2; - LPTSTR pszDesc = FormatString (idsDesc, TEXT("%s"), szCell); - LPTSTR pszFullText = FormatString (idsWarning, TEXT("%s%s%m"), szCell, pszDesc, IDS_BADCREDS_DESC3); - FreeString (pszDesc); - - REALBADCREDSDLG_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.pszFullText = pszFullText; - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - - HINSTANCE hInst = APP_HINST; - if (pp.bcdp.idd == 0) - { - hInst = APPLIB_HINST; - pp.bcdp.idd = IDD_APPLIB_BADCREDS; - } - - int rc = ModalDialogParam (pp.bcdp.idd, pp.bcdp.hParent, (DLGPROC)BadCreds_DlgProc, (LPARAM)&pp); - if (rc == IDCANCEL) - { - fCredsOK = TRUE; // user says ignore bad credentials this time. - } - - FreeString (pszFullText); - } - } - - return fCredsOK; -} - - -BOOL CALLBACK BadCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPREALBADCREDSDLG_PARAMS lpp; - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - if ((lpp = (LPREALBADCREDSDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (lpp->bcdp.hookproc) - { - if (CallWindowProc ((WNDPROC)lpp->bcdp.hookproc, hDlg, msg, wp, lp)) - return TRUE; - } - if (AfsAppLib_HandleHelp (lpp->bcdp.idd, hDlg, msg, wp, lp)) - return TRUE; - } - - switch (msg) - { - case WM_INITDIALOG: - TCHAR szApplication[ cchNAME ]; - AfsAppLib_GetAppName (szApplication); - if (szApplication[0] != TEXT('\0')) - { - TCHAR szTitle[ cchRESOURCE ]; - GetWindowText (hDlg, szTitle, cchRESOURCE); - lstrcat (szTitle, TEXT(" - ")); - lstrcat (szTitle, szApplication); - SetWindowText (hDlg, szTitle); - } - if (!lpp || !lpp->bcdp.pfShowWarningEver) - DestroyWindow (GetWindow (hDlg, IDC_BADCREDS_SHUTUP)); - - SetDlgItemText (hDlg, IDC_BADCREDS_DESC, lpp->pszFullText); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - if (lpp && lpp->bcdp.pfShowWarningEver) - *lpp->bcdp.pfShowWarningEver = !IsDlgButtonChecked (hDlg, IDC_BADCREDS_SHUTUP); - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - } - - return FALSE; -} - - -/* - * EXPIRED CREDENTIALS ________________________________________________________ - * - */ - -void AfsAppLib_CheckForExpiredCredentials (LPCREDENTIALSDLG_PARAMS lpp) -{ - static PVOID hCredsPrevious = NULL; - static BOOL fHadGoodCredentials; - - TCHAR szCell[ cchNAME ]; - TCHAR szUser[ cchNAME ]; - SYSTEMTIME stExpire; - - BOOL fHaveCredentials; - fHaveCredentials = AfsAppLib_CrackCredentials (lpp->hCreds, szCell, szUser, &stExpire); - - if (hCredsPrevious && (hCredsPrevious != lpp->hCreds)) - { - if (!fHaveCredentials) - fHadGoodCredentials = FALSE; - else if (!AfsAppLib_IsTimeInFuture (&stExpire)) - fHadGoodCredentials = FALSE; - else - fHadGoodCredentials = TRUE; - hCredsPrevious = lpp->hCreds; - } - else if (fHaveCredentials && AfsAppLib_IsTimeInFuture (&stExpire)) - { - fHadGoodCredentials = TRUE; - } - else if (fHadGoodCredentials) // used to have good credentials, but now don't - { - fHadGoodCredentials = FALSE; - - LPCREDENTIALSDLG_PARAMS lppCopy = New (CREDENTIALSDLG_PARAMS); - memcpy (lppCopy, lpp, sizeof(CREDENTIALSDLG_PARAMS)); - - if (!AfsAppLib_GetMainWindow()) - OnExpiredCredentials ((WPARAM)(!AfsAppLib_IsTimeInFuture(&stExpire)), (LPARAM)lppCopy); - else - PostMessage (AfsAppLib_GetMainWindow(), WM_EXPIRED_CREDENTIALS, (WPARAM)(!AfsAppLib_IsTimeInFuture(&stExpire)), (LPARAM)lppCopy); - } -} - - -void OnExpiredCredentials (WPARAM wp, LPARAM lp) -{ - BOOL fExpired = (BOOL)wp; - LPCREDENTIALSDLG_PARAMS lpp = (LPCREDENTIALSDLG_PARAMS)lp; - - if (lpp && lpp->bcdp.pfShowWarningEver && *(lpp->bcdp.pfShowWarningEver)) - { - int idsWarning = (wp) ? IDS_BADCREDS_DESC_EXPIRED : IDS_BADCREDS_DESC_DESTROYED; - - int idsDesc = (lpp->bcdp.idsDesc) ? lpp->bcdp.idsDesc : IDS_BADCREDS_DESC2; - LPTSTR pszDesc = FormatString (idsDesc, TEXT("%s"), lpp->szCell); - LPTSTR pszFullText = FormatString (idsWarning, TEXT("%s%s%m"), lpp->szCell, pszDesc, IDS_BADCREDS_DESC3); - FreeString (pszDesc); - - REALBADCREDSDLG_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.pszFullText = pszFullText; - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - - if (ModalDialogParam (IDD_APPLIB_BADCREDS, NULL, (DLGPROC)BadCreds_DlgProc, (LPARAM)&pp) != IDCANCEL) - { - AfsAppLib_ShowCredentialsDialog (lpp); - } - - FreeString (pszFullText); - } - - if (lpp) - { - Delete (lpp); - } -} - - -BOOL AfsAppLib_IsUserAdmin (PVOID hCreds, LPTSTR pszUser) -{ - BOOL rc = FALSE; - afs_status_t status; - - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - TCHAR szCell[ cchRESOURCE ]; - TCHAR szUser[ cchRESOURCE ]; - SYSTEMTIME stExpire; - if (asc_CredentialsCrack (idClient, hCreds, szCell, szUser, &stExpire, (ULONG*)&status)) - { - ASID idCell; - if (asc_CellOpen (idClient, hCreds, szCell, AFSADMSVR_SCOPE_USERS, &idCell, (ULONG*)&status)) - { - ASID idUser; - if (asc_ObjectFind (idClient, idCell, TYPE_USER, pszUser, &idUser, (ULONG*)&status)) - { - ASOBJPROP Info; - if (asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Info, (ULONG*)&status)) - { - if (Info.u.UserProperties.fHaveKasInfo) - { - rc = Info.u.UserProperties.KASINFO.fIsAdmin; - } - } - } - asc_CellClose (idClient, idCell, (ULONG*)&status); - } - } - } - else if (OpenClientLibrary()) - { - if (OpenKasLibrary()) - { - char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ]; - char szCellA[ cchRESOURCE ]; - unsigned long dateExpire; - int fHasKasToken; - - if (afsclient_TokenQuery (hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status)) - { - PVOID hCell; - if (afsclient_CellOpen (szCellA, hCreds, &hCell, &status)) - { - kas_identity_t Identity; - memset (&Identity, 0x00, sizeof(Identity)); - CopyStringToAnsi (Identity.principal, pszUser); - - kas_principalEntry_t Entry; - if (kas_PrincipalGet (hCell, NULL, &Identity, &Entry, &status)) - { - if (Entry.adminSetting == KAS_ADMIN) - rc = TRUE; - } - - afsclient_CellClose (hCell, (afs_status_p)&status); - } - } - - CloseKasLibrary(); - } - - CloseClientLibrary(); - } - - return rc; -} - diff --git a/src/WINNT/afsapplib/al_dynlink.cpp b/src/WINNT/afsapplib/al_dynlink.cpp deleted file mode 100644 index 86113fb73..000000000 --- a/src/WINNT/afsapplib/al_dynlink.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "al_dynlink.h" - - -/* - * LIBRARIES __________________________________________________________________ - * - */ - -#define cszLIBRARY_UTIL TEXT("AfsAdminUtil.dll") -#define cszLIBRARY_KAS TEXT("AfsKasAdmin.dll") -#define cszLIBRARY_CLIENT TEXT("AfsClientAdmin.dll") - - -/* - * ADMIN ______________________________________________________________________ - * - */ - -static size_t g_cReqUtilLibrary = 0; -static HINSTANCE g_hiUtilLibrary = NULL; - -util_AdminErrorCodeTranslate_t util_AdminErrorCodeTranslateP = NULL; - - -BOOL OpenUtilLibrary (ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_DLL_NOT_FOUND; - - if ((++g_cReqUtilLibrary) == 1) - { - if ( ((g_hiUtilLibrary = LoadLibrary (cszLIBRARY_UTIL)) == NULL) || - ((util_AdminErrorCodeTranslateP = (util_AdminErrorCodeTranslate_t)GetProcAddress (g_hiUtilLibrary, "util_AdminErrorCodeTranslate")) == NULL) ) - { - status = GetLastError(); - CloseUtilLibrary(); - } - } - if (g_hiUtilLibrary) - { - rc = TRUE; - } - - if (pStatus) - *pStatus = status; - return rc; -} - - -void CloseUtilLibrary (void) -{ - if ((--g_cReqUtilLibrary) == 0) - { - if (g_hiUtilLibrary) - FreeLibrary (g_hiUtilLibrary); - g_hiUtilLibrary = NULL; - } -} - - -/* - * KAS ________________________________________________________________________ - * - */ - -static size_t g_cReqKasLibrary = 0; -static HINSTANCE g_hiKasLibrary = NULL; - -kas_PrincipalGetBegin_t kas_PrincipalGetBeginP = NULL; -kas_PrincipalGetNext_t kas_PrincipalGetNextP = NULL; -kas_PrincipalGetDone_t kas_PrincipalGetDoneP = NULL; -kas_PrincipalGet_t kas_PrincipalGetP = NULL; - - -BOOL OpenKasLibrary (ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_DLL_NOT_FOUND; - - if ((++g_cReqKasLibrary) == 1) - { - if ( ((g_hiKasLibrary = LoadLibrary (cszLIBRARY_KAS)) == NULL) || - ((kas_PrincipalGetBeginP = (kas_PrincipalGetBegin_t)GetProcAddress (g_hiKasLibrary, "kas_PrincipalGetBegin")) == NULL) || - ((kas_PrincipalGetNextP = (kas_PrincipalGetNext_t)GetProcAddress (g_hiKasLibrary, "kas_PrincipalGetNext")) == NULL) || - ((kas_PrincipalGetDoneP = (kas_PrincipalGetDone_t)GetProcAddress (g_hiKasLibrary, "kas_PrincipalGetDone")) == NULL) || - ((kas_PrincipalGetP = (kas_PrincipalGet_t)GetProcAddress (g_hiKasLibrary, "kas_PrincipalGet")) == NULL) ) - { - status = GetLastError(); - CloseKasLibrary(); - } - } - if (g_hiKasLibrary) - { - rc = TRUE; - } - - if (pStatus) - *pStatus = status; - return rc; -} - - -void CloseKasLibrary (void) -{ - if ((--g_cReqKasLibrary) == 0) - { - if (g_hiKasLibrary) - FreeLibrary (g_hiKasLibrary); - g_hiKasLibrary = NULL; - } -} - - -/* - * CLIENT _____________________________________________________________________ - * - */ - -static size_t g_cReqClientLibrary = 0; -static HINSTANCE g_hiClientLibrary = NULL; - -typedef int (ADMINAPI *afsclient_Init_t)(afs_status_p st); - -afsclient_TokenGetExisting_t afsclient_TokenGetExistingP = NULL; -afsclient_TokenGetNew_t afsclient_TokenGetNewP = NULL; -afsclient_TokenClose_t afsclient_TokenCloseP = NULL; -afsclient_TokenQuery_t afsclient_TokenQueryP = NULL; -afsclient_CellOpen_t afsclient_CellOpenP = NULL; -afsclient_CellClose_t afsclient_CellCloseP = NULL; -afsclient_LocalCellGet_t afsclient_LocalCellGetP = NULL; -afsclient_Init_t afsclient_InitP = NULL; - - -BOOL OpenClientLibrary (ULONG *pStatus) -{ - BOOL rc = FALSE; - ULONG status = ERROR_DLL_NOT_FOUND; - - if ((++g_cReqClientLibrary) == 1) - { - if ( ((g_hiClientLibrary = LoadLibrary (cszLIBRARY_CLIENT)) == NULL) || - ((afsclient_TokenGetExistingP = (afsclient_TokenGetExisting_t)GetProcAddress (g_hiClientLibrary, "afsclient_TokenGetExisting")) == NULL) || - ((afsclient_TokenGetNewP = (afsclient_TokenGetNew_t)GetProcAddress (g_hiClientLibrary, "afsclient_TokenGetNew")) == NULL) || - ((afsclient_TokenCloseP = (afsclient_TokenClose_t)GetProcAddress (g_hiClientLibrary, "afsclient_TokenClose")) == NULL) || - ((afsclient_TokenQueryP = (afsclient_TokenQuery_t)GetProcAddress (g_hiClientLibrary, "afsclient_TokenQuery")) == NULL) || - ((afsclient_CellOpenP = (afsclient_CellOpen_t)GetProcAddress (g_hiClientLibrary, "afsclient_CellOpen")) == NULL) || - ((afsclient_CellCloseP = (afsclient_CellClose_t)GetProcAddress (g_hiClientLibrary, "afsclient_CellClose")) == NULL) || - ((afsclient_LocalCellGetP = (afsclient_LocalCellGet_t)GetProcAddress (g_hiClientLibrary, "afsclient_LocalCellGet")) == NULL) || - ((afsclient_InitP = (afsclient_Init_t)GetProcAddress (g_hiClientLibrary, "afsclient_Init")) == NULL) ) - { - status = GetLastError(); - CloseClientLibrary(); - } - else if (!(*afsclient_InitP)((afs_status_p)&status)) - { - CloseClientLibrary(); - } - } - if (g_hiClientLibrary) - { - rc = TRUE; - } - - if (pStatus) - *pStatus = status; - return rc; -} - - -void CloseClientLibrary (void) -{ - if ((--g_cReqClientLibrary) == 0) - { - if (g_hiClientLibrary) - FreeLibrary (g_hiClientLibrary); - g_hiClientLibrary = NULL; - } -} - diff --git a/src/WINNT/afsapplib/al_dynlink.h b/src/WINNT/afsapplib/al_dynlink.h deleted file mode 100644 index 7d591a1e6..000000000 --- a/src/WINNT/afsapplib/al_dynlink.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AL_DYNLINK_H -#define AL_DYNLINK_H - -extern "C" { -#include -#include -#include -#include -} // extern "C" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL OpenUtilLibrary (ULONG *pStatus = NULL); -void CloseUtilLibrary (void); - -BOOL OpenKasLibrary (ULONG *pStatus = NULL); -void CloseKasLibrary (void); - -BOOL OpenClientLibrary (ULONG *pStatus = NULL); -void CloseClientLibrary (void); - - -/* - * INTERFACES _________________________________________________________________ - * - */ - -typedef int (ADMINAPI *util_AdminErrorCodeTranslate_t)(afs_status_t errorCode, int langId, const char **errorTextP, afs_status_p st); - -typedef int (ADMINAPI *kas_PrincipalGetBegin_t)(const void *cellHandle, const void *serverHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *kas_PrincipalGetNext_t)(const void *iterationId, kas_identity_p who, afs_status_p st); -typedef int (ADMINAPI *kas_PrincipalGetDone_t)(const void *iterationIdP, afs_status_p st); -typedef int (ADMINAPI *kas_PrincipalGet_t) (const void *cellHandle, const void *serverHandle, const kas_identity_p who, kas_principalEntry_p principal, afs_status_p st); - -typedef int (ADMINAPI *afsclient_TokenGetExisting_t)(const char *cellName, void **tokenHandle, afs_status_p st); -typedef int (ADMINAPI *afsclient_TokenGetNew_t)(const char *cellName, const char *principal, const char *password, void **tokenHandle, afs_status_p st); -typedef int (ADMINAPI *afsclient_TokenClose_t)(const void *tokenHandle, afs_status_p st); -typedef int (ADMINAPI *afsclient_TokenQuery_t)(void *tokenHandle, unsigned long *expirationDateP, char *principal, char *identity, char *cellName, int *bHasKasTokenP, afs_status_p st); -typedef int (ADMINAPI *afsclient_CellOpen_t)(const char *cellName, const void *tokenHandle, void **cellHandleP, afs_status_p st); -typedef int (ADMINAPI *afsclient_CellClose_t)(const void *cellHandle, afs_status_p st); -typedef int (ADMINAPI *afsclient_LocalCellGet_t)(char *cellName, afs_status_p st); - - -extern util_AdminErrorCodeTranslate_t util_AdminErrorCodeTranslateP; - -extern kas_PrincipalGetBegin_t kas_PrincipalGetBeginP; -extern kas_PrincipalGetNext_t kas_PrincipalGetNextP; -extern kas_PrincipalGetDone_t kas_PrincipalGetDoneP; -extern kas_PrincipalGet_t kas_PrincipalGetP; - -extern afsclient_TokenGetExisting_t afsclient_TokenGetExistingP; -extern afsclient_TokenGetNew_t afsclient_TokenGetNewP; -extern afsclient_TokenClose_t afsclient_TokenCloseP; -extern afsclient_TokenQuery_t afsclient_TokenQueryP; -extern afsclient_CellOpen_t afsclient_CellOpenP; -extern afsclient_CellClose_t afsclient_CellCloseP; -extern afsclient_LocalCellGet_t afsclient_LocalCellGetP; - - -#define util_AdminErrorCodeTranslate (*util_AdminErrorCodeTranslateP) - -#define kas_PrincipalGetBegin (*kas_PrincipalGetBeginP) -#define kas_PrincipalGetNext (*kas_PrincipalGetNextP) -#define kas_PrincipalGetDone (*kas_PrincipalGetDoneP) -#define kas_PrincipalGet (*kas_PrincipalGetP) - -#define afsclient_TokenGetExisting (*afsclient_TokenGetExistingP) -#define afsclient_TokenGetNew (*afsclient_TokenGetNewP) -#define afsclient_TokenClose (*afsclient_TokenCloseP) -#define afsclient_TokenQuery (*afsclient_TokenQueryP) -#define afsclient_CellOpen (*afsclient_CellOpenP) -#define afsclient_CellClose (*afsclient_CellCloseP) -#define afsclient_LocalCellGet (*afsclient_LocalCellGetP) - -#endif - diff --git a/src/WINNT/afsapplib/al_error.cpp b/src/WINNT/afsapplib/al_error.cpp deleted file mode 100644 index cc7399410..000000000 --- a/src/WINNT/afsapplib/al_error.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void cdecl vErrorDialog (BOOL fFatal, DWORD dwStatus, LONG idError, LPTSTR pszFmt, va_list arg); - -BOOL CALLBACK Error_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void OnCreateErrorDialog (WPARAM wp, LPARAM lp); - - -/* - * ERROR DIALOGS ______________________________________________________________ - * - */ - -typedef struct - { - BOOL fFatal; - LPTSTR pszError; - DWORD dwError; - } ERRORPARAMS; - -void cdecl ErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt, ...) -{ - va_list arg; - va_start (arg, pszFmt); - vErrorDialog (FALSE, dwStatus, (LONG)pszError, pszFmt, arg); -} - -void cdecl ErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt, ...) -{ - va_list arg; - va_start (arg, pszFmt); - vErrorDialog (FALSE, dwStatus, (LONG)idsError, pszFmt, arg); -} - -void cdecl FatalErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt, ...) -{ - va_list arg; - va_start (arg, pszFmt); - vErrorDialog (TRUE, dwStatus, (LONG)pszError, pszFmt, arg); -} - -void cdecl FatalErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt, ...) -{ - va_list arg; - va_start (arg, pszFmt); - vErrorDialog (TRUE, dwStatus, (LONG)idsError, pszFmt, arg); -} - - -void cdecl vErrorDialog (BOOL fFatal, DWORD dwStatus, LONG idError, LPTSTR pszFmt, va_list arg) -{ - ERRORPARAMS *lpep = New (ERRORPARAMS); - lpep->fFatal = fFatal; - lpep->pszError = vFormatString (idError, pszFmt, arg); - lpep->dwError = dwStatus; - - if (!AfsAppLib_GetMainWindow()) - { - OnCreateErrorDialog (0, (LPARAM)lpep); - } - else - { - PostMessage (AfsAppLib_GetMainWindow(), WM_CREATE_ERROR_DIALOG, 0, (LPARAM)lpep); - } -} - - -void ImmediateErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt, ...) -{ - va_list arg; - va_start (arg, pszFmt); - - ERRORPARAMS *lpep = New (ERRORPARAMS); - lpep->fFatal = FALSE; - lpep->pszError = vFormatString (idsError, pszFmt, arg); - lpep->dwError = dwStatus; - - ModalDialogParam (IDD_APPLIB_ERROR, NULL, (DLGPROC)Error_DlgProc, (LPARAM)lpep); - - FreeString (lpep->pszError); - Delete (lpep); -} - -void ImmediateErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt, ...) -{ - va_list arg; - va_start (arg, pszFmt); - - ERRORPARAMS *lpep = New (ERRORPARAMS); - lpep->fFatal = FALSE; - lpep->pszError = vFormatString (pszError, pszFmt, arg); - lpep->dwError = dwStatus; - - ModalDialogParam (IDD_APPLIB_ERROR, NULL, (DLGPROC)Error_DlgProc, (LPARAM)lpep); - - FreeString (lpep->pszError); - Delete (lpep); -} - - -void OnCreateErrorDialog (WPARAM wp, LPARAM lp) -{ - ERRORPARAMS *lpep = (ERRORPARAMS*)lp; - - ModalDialogParam (IDD_APPLIB_ERROR, NULL, (DLGPROC)Error_DlgProc, (LPARAM)lpep); - - if (lpep->fFatal) - { - PostQuitMessage (0); - } - - FreeString (lpep->pszError); - Delete (lpep); -} - - -BOOL CALLBACK Error_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - TCHAR szApplication[ cchNAME ]; - AfsAppLib_GetAppName (szApplication); - if (szApplication[0] != TEXT('\0')) - { - TCHAR szTitle[ cchRESOURCE ]; - GetWindowText (hDlg, szTitle, cchRESOURCE); - lstrcat (szTitle, TEXT(" - ")); - lstrcat (szTitle, szApplication); - SetWindowText (hDlg, szTitle); - } - - ERRORPARAMS *lpep; - if ((lpep = (ERRORPARAMS *)lp) == NULL) - { - TCHAR szError[ cchRESOURCE ]; - AfsAppLib_TranslateError (szError, ERROR_NOT_ENOUGH_MEMORY); - SetDlgItemText (hDlg, IDC_ERROR_STATUS, szError); - } - else - { - SetDlgItemText (hDlg, IDC_ERROR_DESC, lpep->pszError); - - if (lpep->dwError == 0) - { - RECT rDesc; - GetRectInParent (GetDlgItem (hDlg, IDC_ERROR_DESC), &rDesc); - - RECT rStatus; - GetRectInParent (GetDlgItem (hDlg, IDC_ERROR_STATUS), &rStatus); - - SetWindowPos (GetDlgItem (hDlg, IDC_ERROR_DESC), NULL, - 0, 0, cxRECT(rDesc), rStatus.bottom -rDesc.top, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - ShowWindow (GetDlgItem (hDlg, IDC_ERROR_STATUS), SW_HIDE); - } - else - { - TCHAR szCode[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_ERROR_STATUS, szCode, cchRESOURCE); - - LPTSTR pszStatus = FormatString (szCode, TEXT("%e"), lpep->dwError); - SetDlgItemText (hDlg, IDC_ERROR_STATUS, pszStatus); - FreeString (pszStatus); - } - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - } - - return FALSE; -} - diff --git a/src/WINNT/afsapplib/al_help.cpp b/src/WINNT/afsapplib/al_help.cpp deleted file mode 100644 index a647ff7c9..000000000 --- a/src/WINNT/afsapplib/al_help.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * DEFINITIONS ______________________________________________________________ - * - */ - -typedef struct - { - BOOL fInUse; - int idd; - DWORD *adwContext; - int idhOverview; - } DIALOGHELP, *LPDIALOGHELP; - - -/* - * VARIABLES ________________________________________________________________ - * - */ - -static TCHAR g_szHelpfile[ MAX_PATH ] = TEXT(""); - -static DIALOGHELP *g_adh = NULL; -static size_t g_cdh = 0; - - -/* - * ROUTINES _________________________________________________________________ - * - */ - -void AfsAppLib_RegisterHelpFile (LPTSTR pszFilename) -{ - if (pszFilename) - lstrcpy (g_szHelpfile, pszFilename); - else - g_szHelpfile[0] = TEXT('\0'); -} - - -void AfsAppLib_RegisterHelp (int idd, DWORD *adwContext, int idhOverview) -{ - for (size_t ih = 0; ih < g_cdh; ++ih) - { - if (!g_adh[ ih ].fInUse) - continue; - if (g_adh[ ih ].idd == idd) - { - g_adh[ ih ].adwContext = adwContext; - g_adh[ ih ].idhOverview = idhOverview; - return; - } - } - for (ih = 0; ih < g_cdh; ++ih) - { - if (!g_adh[ ih ].fInUse) - break; - } - if (ih == g_cdh) - { - (void)REALLOC (g_adh, g_cdh, 1+ih, 16); - } - if (ih < g_cdh) - { - g_adh[ ih ].fInUse = TRUE; - g_adh[ ih ].idd = idd; - g_adh[ ih ].adwContext = adwContext; - g_adh[ ih ].idhOverview = idhOverview; - } -} - - -BOOL AfsAppLib_HandleHelp (int idd, HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - BOOL rc = FALSE; - size_t ih; - - switch (msg) - { - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - for (ih = 0; ih < g_cdh; ++ih) - { - if (idd == g_adh[ ih ].idd) - break; - } - if (ih < g_cdh) - { - if (g_szHelpfile) - WinHelp (hDlg, g_szHelpfile, HELP_CONTEXT, g_adh[ ih ].idhOverview); - rc = TRUE; - } - break; - } - break; - - case WM_HELP: - LPHELPINFO lphi; - for (ih = 0; ih < g_cdh; ++ih) - { - if (idd == g_adh[ ih ].idd) - break; - } - - if ( (ih == g_cdh) || - ((lphi = (LPHELPINFO)lp) == NULL) || - (lphi->hItemHandle == NULL) || - (lphi->hItemHandle == hDlg) ) - { - PostMessage (hDlg, WM_COMMAND, (WPARAM)MAKELONG(IDHELP,BN_CLICKED), (LPARAM)GetDlgItem (hDlg, IDHELP)); - } - else - { - if (g_szHelpfile) - WinHelp ((HWND)(lphi->hItemHandle), g_szHelpfile, HELP_WM_HELP, (DWORD)g_adh[ ih ].adwContext); - } - - rc = TRUE; - break; - } - - return rc; -} - diff --git a/src/WINNT/afsapplib/al_messages.h b/src/WINNT/afsapplib/al_messages.h deleted file mode 100644 index 4c0f6eb5c..000000000 --- a/src/WINNT/afsapplib/al_messages.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AL_MESSAGES_H -#define AL_MESSAGES_H - -// WM_COVER_WINDOW is used by CoverWindow() and CoverClient() to ensure that -// the proper thread creates a cover window when requested (if any thread -// other than g.hMain's thread creates the window, it will be destroyed -// automatically when the thread terminates). -// -// When used to cover a window: -// LPCOVERPARAMS lpCoverParams = (LPCOVERPARAMS)lParam; -// -// When used to uncover a window: -// HWND hwndToUncover = (HWND)wParam; -// -#define WM_COVER_WINDOW (WM_USER + 0x200) - -// WM_CREATE_ERROR_DIALOG is sent by ErrorDialog() to tell g.hMain to -// create a dialog; this way, the error dialog is always created by -// the main thread. -// -// LPERROR_PARAMS = (LPERROR_PARAMS)lParam; -// -#define WM_CREATE_ERROR_DIALOG (WM_USER + 0x201) - -// WM_ENDTASK is posted to a window after a task request is created -// (via StartTask()). A background routine handles one request at a time -// on an alternate thread, and posts its results to a specified window by -// means of an allocated structure. That structure should be freed using -// FreeTaskPacket() when this message is received. -// -// LPTASKPACKET ptp = (LPTASKPACKET)lParam; -// -#define WM_ENDTASK (WM_USER + 0x202) - -// WM_EXPIRED_CREDENTIALS is sent to the main window when a background -// thread detects that the user's credentials have expired. -// -// BOOL fExpired = (BOOL)wParam; -// -#define WM_EXPIRED_CREDENTIALS (WM_USER + 0x203) - -// WM_CLOSE_DIALOG is sent to a modal dialog when the CloseDialog() routine -// is called. -// -// HWND hWnd = (HWND)wParam; -// int rc = (int)lParam; -// -#define WM_CLOSE_DIALOG (WM_USER + 0x204) - -// WM_PERMTAB_REFRESH is sent to a Permissions tab to cause its contents -// to be completely recalculated and redrawn. Any changes the user has -// made so far are discarded. -// -#define WM_PERMTAB_REFRESH (WM_USER + 0x205) - -// WM_REFRESHED_CREDENTIALS is sent to the main window whenever the -// AfsAppLib_SetCredentials to obtain new credentials. -// -// LPARAM lp = (LPARAM)hCreds -// -#define WM_REFRESHED_CREDENTIALS (WM_USER + 0x206) - - -#endif - diff --git a/src/WINNT/afsapplib/al_misc.cpp b/src/WINNT/afsapplib/al_misc.cpp deleted file mode 100644 index 3620bd265..000000000 --- a/src/WINNT/afsapplib/al_misc.cpp +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "al_dynlink.h" -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define GWD_ANIMATIONFRAME TEXT("afsapplib/al_misc.cpp - next animation frame") - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK AfsAppLib_TranslateErrorFunc (LPTSTR pszText, ULONG code, LANGID idLanguage); - - -/* - * STARTUP ____________________________________________________________________ - * - */ - -static HINSTANCE g_hInst = NULL; -static HINSTANCE g_hInstApp = NULL; - -HINSTANCE AfsAppLib_GetInstance (void) -{ - return g_hInst; -} - - -EXPORTED HINSTANCE AfsAppLib_GetAppInstance (void) -{ - if (!g_hInstApp) - g_hInstApp = GetModuleHandle(NULL); - return g_hInstApp; -} - - -EXPORTED void AfsAppLib_SetAppInstance (HINSTANCE hInst) -{ - g_hInstApp = hInst; -} - - -extern "C" BOOLEAN _stdcall DllEntryPoint (HANDLE hInst, DWORD dwReason, PVOID pReserved) -{ - switch (dwReason) - { - case DLL_PROCESS_ATTACH: - if (!g_hInst) - { - g_hInst = (HINSTANCE)hInst; - TaLocale_LoadCorrespondingModule (g_hInst); - SetErrorTranslationFunction ((LPERRORPROC)AfsAppLib_TranslateErrorFunc); - - InitCommonControls(); - RegisterSpinnerClass(); - RegisterElapsedClass(); - RegisterTimeClass(); - RegisterDateClass(); - RegisterSockAddrClass(); - RegisterCheckListClass(); - RegisterFastListClass(); - } - break; - } - return TRUE; -} - - -/* - * IMAGE LISTS ________________________________________________________________ - * - */ - -HIMAGELIST AfsAppLib_CreateImageList (BOOL fLarge) -{ - HIMAGELIST hil; - hil = ImageList_Create ((fLarge)?32:16, (fLarge)?32:16, TRUE, 4, 0); - - AfsAppLib_AddToImageList (hil, IDI_SERVER, fLarge); - AfsAppLib_AddToImageList (hil, IDI_SERVER_ALERT, fLarge); - AfsAppLib_AddToImageList (hil, IDI_SERVER_UNMON, fLarge); - AfsAppLib_AddToImageList (hil, IDI_SERVICE, fLarge); - AfsAppLib_AddToImageList (hil, IDI_SERVICE_ALERT, fLarge); - AfsAppLib_AddToImageList (hil, IDI_SERVICE_STOPPED, fLarge); - AfsAppLib_AddToImageList (hil, IDI_AGGREGATE, fLarge); - AfsAppLib_AddToImageList (hil, IDI_AGGREGATE_ALERT, fLarge); - AfsAppLib_AddToImageList (hil, IDI_FILESET, fLarge); - AfsAppLib_AddToImageList (hil, IDI_FILESET_ALERT, fLarge); - AfsAppLib_AddToImageList (hil, IDI_FILESET_LOCKED, fLarge); - AfsAppLib_AddToImageList (hil, IDI_BOSSERVICE, fLarge); - AfsAppLib_AddToImageList (hil, IDI_CELL, fLarge); - AfsAppLib_AddToImageList (hil, IDI_SERVER_KEY, fLarge); - AfsAppLib_AddToImageList (hil, IDI_USER, fLarge); - AfsAppLib_AddToImageList (hil, IDI_GROUP, fLarge); - - return hil; -} - - -void AfsAppLib_AddToImageList (HIMAGELIST hil, int idi, BOOL fLarge) -{ - HICON hi = TaLocale_LoadIcon (idi); - ImageList_AddIcon (hil, hi); -} - - -/* - * ANIMATION __________________________________________________________________ - * - */ - -void AfsAppLib_AnimateIcon (HWND hIcon, int *piFrameLast) -{ - static HICON hiStop; - static HICON hiFrame[8]; - static BOOL fLoaded = FALSE; - - if (!fLoaded) - { - hiStop = TaLocale_LoadIcon (IDI_SPINSTOP); - hiFrame[0] = TaLocale_LoadIcon (IDI_SPIN1); - hiFrame[1] = TaLocale_LoadIcon (IDI_SPIN2); - hiFrame[2] = TaLocale_LoadIcon (IDI_SPIN3); - hiFrame[3] = TaLocale_LoadIcon (IDI_SPIN4); - hiFrame[4] = TaLocale_LoadIcon (IDI_SPIN5); - hiFrame[5] = TaLocale_LoadIcon (IDI_SPIN6); - hiFrame[6] = TaLocale_LoadIcon (IDI_SPIN7); - hiFrame[7] = TaLocale_LoadIcon (IDI_SPIN8); - fLoaded = TRUE; - } - - if (piFrameLast) - { - *piFrameLast = (*piFrameLast == 7) ? 0 : (1+*piFrameLast); - } - - SendMessage (hIcon, STM_SETICON, (WPARAM)((piFrameLast) ? hiFrame[ *piFrameLast ] : hiStop), 0); -} - - -BOOL CALLBACK AnimationHook (HWND hIcon, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hIcon, AnimationHook); - - switch (msg) - { - case WM_TIMER: - int iFrame; - iFrame = GetWindowData (hIcon, GWD_ANIMATIONFRAME); - AfsAppLib_AnimateIcon (hIcon, &iFrame); - SetWindowData (hIcon, GWD_ANIMATIONFRAME, iFrame); - break; - - case WM_DESTROY: - Subclass_RemoveHook (hIcon, AnimationHook); - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hIcon, msg, wp, lp); - else - return DefWindowProc (hIcon, msg, wp, lp); -} - - -void AfsAppLib_StartAnimation (HWND hIcon, int fps) -{ - Subclass_AddHook (hIcon, AnimationHook); - SetTimer (hIcon, 0, 1000/((fps) ? fps : 8), NULL); - AfsAppLib_AnimateIcon (hIcon); -} - - -void AfsAppLib_StopAnimation (HWND hIcon) -{ - KillTimer (hIcon, 0); - AfsAppLib_AnimateIcon (hIcon); - Subclass_RemoveHook (hIcon, AnimationHook); -} - - -/* - * ERROR TRANSLATION __________________________________________________________ - * - */ - -BOOL CALLBACK AfsAppLib_TranslateErrorFunc (LPTSTR pszText, ULONG code, LANGID idLanguage) -{ - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - ULONG status; - return asc_ErrorCodeTranslate (idClient, code, idLanguage, pszText, &status); - } - else if (OpenUtilLibrary()) - { - const char *pszTextA = NULL; - afs_status_t status; - if (util_AdminErrorCodeTranslate (code, idLanguage, &pszTextA, &status) && (pszTextA)) - { - CopyAnsiToString (pszText, pszTextA); - return TRUE; - } - CloseUtilLibrary(); - } - - return FALSE; -} - - -BOOL AfsAppLib_TranslateError (LPTSTR pszText, ULONG status, LANGID idLanguage) -{ - LANGID idLangOld = TaLocale_GetLanguage(); - TaLocale_SetLanguage (idLanguage); - - BOOL rc = FormatError (pszText, TEXT("%s"), status); - - TaLocale_SetLanguage (idLangOld); - return rc; -} - - -/* - * CELL LIST __________________________________________________________________ - * - */ - -#define cREALLOC_CELLLIST 4 - -LPCELLLIST AfsAppLib_GetCellList (HKEY hkBase, LPTSTR pszRegPath) -{ - LPCELLLIST lpcl = New (CELLLIST); - memset (lpcl, 0x00, sizeof(CELLLIST)); - - if (hkBase && pszRegPath) - { - lpcl->hkBase = hkBase; - lstrcpy (lpcl->szRegPath, pszRegPath); - - HKEY hk; - if (RegOpenKey (hkBase, pszRegPath, &hk) == 0) - { - TCHAR szCell[ cchNAME ]; - for (size_t ii = 0; RegEnumKey (hk, ii, szCell, cchNAME) == 0; ++ii) - { - if (REALLOC (lpcl->aCells, lpcl->nCells, 1+ii, cREALLOC_CELLLIST)) - { - lpcl->aCells[ ii ] = CloneString (szCell); - } - } - RegCloseKey (hk); - } - } - else // Get cell list from AFS - { - // TODO - } - - TCHAR szDefCell[ cchNAME ]; - if (AfsAppLib_GetLocalCell (szDefCell)) - { - for (size_t iclDef = 0; iclDef < lpcl->nCells; ++iclDef) - { - if (lpcl->aCells[ iclDef ] == NULL) - continue; - if (!lstrcmpi (lpcl->aCells[ iclDef ], szDefCell)) - break; - } - if (iclDef == lpcl->nCells) // default cell not currently in list? - { - for (iclDef = 0; iclDef < lpcl->nCells; ++iclDef) - { - if (lpcl->aCells[ iclDef ] == NULL) - break; - } - if (REALLOC (lpcl->aCells, lpcl->nCells, 1+iclDef, cREALLOC_CELLLIST)) - { - lpcl->aCells[iclDef] = CloneString (szDefCell); - } - } - if ((iclDef > 0) && (iclDef < lpcl->nCells) && (lpcl->aCells[ iclDef ])) - { - LPTSTR pszZero = lpcl->aCells[0]; - lpcl->aCells[0] = lpcl->aCells[iclDef]; - lpcl->aCells[iclDef] = pszZero; - } - } - - for ( ; (lpcl->nCells != 0); (lpcl->nCells)--) - { - if (lpcl->aCells[ lpcl->nCells-1 ] != NULL) - break; - } - - return lpcl; -} - - -LPCELLLIST AfsAppLib_GetCellList (LPCELLLIST lpclCopy) -{ - LPCELLLIST lpcl = New (CELLLIST); - memset (lpcl, 0x00, sizeof(CELLLIST)); - - if (lpclCopy) - { - if (REALLOC (lpcl->aCells, lpcl->nCells, lpclCopy->nCells, cREALLOC_CELLLIST)) - { - for (size_t icl = 0; icl < lpcl->nCells; ++icl) - { - if (lpclCopy->aCells[ icl ]) - { - lpcl->aCells[ icl ] = CloneString (lpclCopy->aCells[ icl ]); - } - } - } - } - - return lpcl; -} - - -void AfsAppLib_AddToCellList (LPCELLLIST lpcl, LPTSTR pszCell) -{ - if (lpcl && lpcl->hkBase && lpcl->szRegPath[0]) - { - TCHAR szPath[ MAX_PATH ]; - wsprintf (szPath, TEXT("%s\\%s"), lpcl->szRegPath, pszCell); - - HKEY hk; - if (RegCreateKey (lpcl->hkBase, szPath, &hk) == 0) - { - RegCloseKey (hk); - } - } -} - - -void AfsAppLib_FreeCellList (LPCELLLIST lpcl) -{ - if (lpcl) - { - if (lpcl->aCells) - { - for (size_t icl = 0; icl < lpcl->nCells; ++icl) - { - if (lpcl->aCells[icl] != NULL) - FreeString (lpcl->aCells[icl]); - } - Free (lpcl->aCells); - } - Delete (lpcl); - } -} - - -/* - * TRULY MISCELLANEOUS ________________________________________________________ - * - */ - -BOOL AfsAppLib_IsTimeInFuture (LPSYSTEMTIME pstTest) -{ - SYSTEMTIME stNow; - GetSystemTime (&stNow); - - FILETIME ftNowGMT; - SystemTimeToFileTime (&stNow, &ftNowGMT); - - FILETIME ftTest; - SystemTimeToFileTime (pstTest, &ftTest); - - if (CompareFileTime (&ftTest, &ftNowGMT) >= 0) - return TRUE; - - return FALSE; -} - - -void AfsAppLib_UnixTimeToSystemTime (LPSYSTEMTIME pst, ULONG ut, BOOL fElapsed) -{ - // A Unix time is the number of seconds since 1/1/1970. - // The first step in this conversion is to change that count-of-seconds - // into a count-of-100ns-intervals... - // - LARGE_INTEGER ldw; - ldw.QuadPart = (LONGLONG)10000000 * (LONGLONG)ut; - - // Then adjust the count to be a count-of-100ns-intervals since - // 1/1/1601, instead of 1/1/1970. That means adding a *big* number... - // - ldw.QuadPart += (LONGLONG)0x019db1ded53e8000; - - // Now the count is effectively a FILETIME, which we can convert - // to a SYSTEMTIME with a Win32 API. - // - FILETIME ft; - ft.dwHighDateTime = (DWORD)ldw.HighPart; - ft.dwLowDateTime = (DWORD)ldw.LowPart; - FileTimeToSystemTime (&ft, pst); - - if (fElapsed) - { - pst->wYear -= 1970; - pst->wMonth -= 1; - pst->wDayOfWeek -= 1; - pst->wDay -= 1; - } -} - - -void AfsAppLib_SplitCredentials (LPTSTR pszCreds, LPTSTR pszCell, LPTSTR pszID) -{ - LPTSTR pszSlash = (LPTSTR)lstrrchr (pszCreds, TEXT('/')); - if (pszSlash == NULL) - { - if (pszCell) - AfsAppLib_GetLocalCell (pszCell); - if (pszID) - lstrcpy (pszID, pszCreds); - } - else // a cell was specified - { - if (pszCell) - lstrzcpy (pszCell, pszCreds, pszSlash -pszCreds); - if (pszID) - lstrcpy (pszID, 1+pszSlash); - } -} - - -BOOL AfsAppLib_GetLocalCell (LPTSTR pszCell, ULONG *pStatus) -{ - static TCHAR szCell[ cchRESOURCE ] = TEXT(""); - - BOOL rc = TRUE; - ULONG status = 0; - - if (szCell[0] == TEXT('\0')) - { - DWORD idClient; - if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) - { - rc = asc_LocalCellGet (idClient, szCell, &status); - } - else if (OpenClientLibrary()) - { - char szCellNameA[ MAX_PATH ]; - if ((rc = afsclient_LocalCellGet (szCellNameA, (afs_status_p)&status)) == TRUE) - { - CopyAnsiToString (szCell, szCellNameA); - } - CloseClientLibrary(); - } - } - - if (rc) - lstrcpy (pszCell, szCell); - else if (pStatus) - *pStatus = status; - return rc; -} - - -BOOL AfsAppLib_ReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} - - -HFONT AfsAppLib_CreateFont (int idsFont) -{ - TCHAR szFont[ cchRESOURCE ]; - GetString (szFont, idsFont); - - HFONT hf = (HFONT)GetStockObject (DEFAULT_GUI_FONT); - - LOGFONT lf; - GetObject (hf, sizeof(lf), &lf); - lf.lfWeight = FW_NORMAL; - - LPTSTR pszSection = szFont; - LPTSTR pszNextSection; - if ((pszNextSection = (LPTSTR)lstrchr (pszSection, TEXT(','))) != NULL) - *pszNextSection++ = TEXT('\0'); - if (!pszSection || !*pszSection) - return NULL; - - lstrcpy (lf.lfFaceName, pszSection); - - pszSection = pszNextSection; - if ((pszNextSection = (LPTSTR)lstrchr (pszSection, TEXT(','))) != NULL) - *pszNextSection++ = TEXT('\0'); - if (!pszSection || !*pszSection) - return NULL; - - HDC hdc = GetDC (NULL); - lf.lfHeight = -MulDiv (_ttol(pszSection), GetDeviceCaps (hdc, LOGPIXELSY), 72); - ReleaseDC (NULL, hdc); - - pszSection = pszNextSection; - if ((pszNextSection = (LPTSTR)lstrchr (pszSection, TEXT(','))) != NULL) - *pszNextSection++ = TEXT('\0'); - if (pszSection && *pszSection) - { - if (lstrchr (pszSection, TEXT('b')) || lstrchr (pszSection, TEXT('B'))) - lf.lfWeight = FW_BOLD; - if (lstrchr (pszSection, TEXT('i')) || lstrchr (pszSection, TEXT('I'))) - lf.lfItalic = TRUE; - if (lstrchr (pszSection, TEXT('u')) || lstrchr (pszSection, TEXT('U'))) - lf.lfUnderline = TRUE; - } - - return CreateFontIndirect(&lf); -} - diff --git a/src/WINNT/afsapplib/al_progress.cpp b/src/WINNT/afsapplib/al_progress.cpp deleted file mode 100644 index c50da55e4..000000000 --- a/src/WINNT/afsapplib/al_progress.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define WM_UPDATE_PROGRESS WM_TIMER - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -PROGRESSDISPLAY::PROGRESSDISPLAY (HWND hWnd) -{ - Init (hWnd); -} - - -PROGRESSDISPLAY::PROGRESSDISPLAY (HWND hParent, int iddTemplate, DLGPROC dlgproc) -{ - if (dlgproc == 0) - dlgproc = (DLGPROC)PROGRESSDISPLAY::ProgressDisplay_StubProc; - HWND hWnd = ModelessDialogParam (iddTemplate, hParent, dlgproc, (LPARAM)this); - Init (hWnd); - m_fCreatedWindow = TRUE; -} - - -PROGRESSDISPLAY::~PROGRESSDISPLAY (void) -{ - m_fFinished = TRUE; - SetWindowLong (m_hWnd, DWL_USER, (LONG)0); - DeleteCriticalSection (&m_cs); - if (m_fCreatedWindow) - DestroyWindow (m_hWnd); -} - - -void PROGRESSDISPLAY::Init (HWND hWnd) -{ - SetWindowLong (hWnd, DWL_USER, (LONG)this); - Subclass_AddHook (hWnd, PROGRESSDISPLAY::ProgressDisplay_HookProc); - - m_msgFinish = 0; - m_fFinished = FALSE; - m_dwStatus = 0; - InitializeCriticalSection (&m_cs); - m_hWnd = hWnd; - m_fCreatedWindow = FALSE; - m_pfnUser = NULL; - m_lpUser = 0; - m_iProgress = 0; - m_cRef = 1; - - GetDlgItemText (m_hWnd, IDC_OPERATION, m_szOperation, cchRESOURCE); - GetDlgItemText (m_hWnd, IDC_PROGRESSTEXT, m_szProgressText, cchRESOURCE); - SendDlgItemMessage (m_hWnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0,100)); - SetProgressRange (0, 100); - SetProgress (0); -} - - -HWND PROGRESSDISPLAY::GetWindow (void) -{ - return m_hWnd; -} - -void PROGRESSDISPLAY::GetProgressRange (int *piStart, int *piFinish) -{ - EnterCriticalSection (&m_cs); - - if (piStart) - *piStart = m_iProgressStart; - if (piFinish) - *piFinish = m_iProgressFinish; - - LeaveCriticalSection (&m_cs); -} - - -void PROGRESSDISPLAY::SetProgressRange (int iStart, int iFinish) -{ - EnterCriticalSection (&m_cs); - - m_iProgressStart = iStart; - m_iProgressFinish = iFinish; - PostMessage (m_hWnd, WM_UPDATE_PROGRESS, 0, 0); - - LeaveCriticalSection (&m_cs); -} - - -int PROGRESSDISPLAY::GetProgress (void) -{ - EnterCriticalSection (&m_cs); - - int iProgress = m_iProgress; - - LeaveCriticalSection (&m_cs); - return iProgress; -} - - -void PROGRESSDISPLAY::SetProgress (int iProgress) -{ - EnterCriticalSection (&m_cs); - - m_iProgress = max( m_iProgress, iProgress ); - m_iProgress = min( max( m_iProgress, m_iProgressStart ), m_iProgressFinish ); - PostMessage (m_hWnd, WM_UPDATE_PROGRESS, 0, 0); - - LeaveCriticalSection (&m_cs); -} - - -void PROGRESSDISPLAY::GetOperation (LPTSTR pszOperation) -{ - EnterCriticalSection (&m_cs); - - lstrcpy (pszOperation, m_szOperation); - - LeaveCriticalSection (&m_cs); -} - - -void PROGRESSDISPLAY::SetOperation (LPCTSTR pszOperation) -{ - EnterCriticalSection (&m_cs); - - lstrcpy (m_szOperation, pszOperation); - PostMessage (m_hWnd, WM_UPDATE_PROGRESS, 0, 0); - - LeaveCriticalSection (&m_cs); -} - - -LPPROGRESSDISPLAY PROGRESSDISPLAY::GetProgressDisplay (HWND hWnd) -{ - LPPROGRESSDISPLAY ppd = NULL; - - try { - if ((ppd = (LPPROGRESSDISPLAY)(GetWindowLong (hWnd, DWL_USER))) != NULL) { - if (ppd->m_hWnd != hWnd) - ppd = NULL; - } - } catch(...) { - ppd = NULL; - } - - return ppd; -} - - -BOOL CALLBACK PROGRESSDISPLAY::ProgressDisplay_StubProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - return FALSE; -} - - -BOOL CALLBACK PROGRESSDISPLAY::ProgressDisplay_HookProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldproc = Subclass_FindNextHook (hWnd, PROGRESSDISPLAY::ProgressDisplay_HookProc); - - switch (msg) - { - case WM_UPDATE_PROGRESS: - if (!wp && !lp) - { - LPPROGRESSDISPLAY ppd; - if ((ppd = PROGRESSDISPLAY::GetProgressDisplay (hWnd)) != NULL) - ppd->OnUpdate(); - return TRUE; - } - break; - - case WM_DESTROY: - Subclass_RemoveHook (hWnd, PROGRESSDISPLAY::ProgressDisplay_HookProc); - break; - } - - if (oldproc) - return CallWindowProc ((WNDPROC)oldproc, hWnd, msg, wp, lp); - else - return DefWindowProc (hWnd, msg, wp, lp); -} - - -void PROGRESSDISPLAY::SetFinishMessage (int msgFinish) -{ - m_msgFinish = msgFinish; -} - - -void PROGRESSDISPLAY::Show (DWORD (CALLBACK *pfn)(LPPROGRESSDISPLAY ppd, LPARAM lp), LPARAM lp) -{ - m_pfnUser = pfn; - m_lpUser = lp; - - InterlockedIncrement (&m_cRef); - - ShowWindow (m_hWnd, SW_SHOW); - - DWORD dwThreadID; - HANDLE hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)(PROGRESSDISPLAY::ThreadProc), this, 0, &dwThreadID); - - if (m_msgFinish == 0) - { - MSG msg; - while (GetMessage (&msg, 0, 0, NULL)) - { - if (!IsDialogMessage (m_hWnd, &msg)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - EnterCriticalSection (&m_cs); - BOOL fBreak = m_fFinished; - LeaveCriticalSection (&m_cs); - if (fBreak) - break; - } - } -} - - -void PROGRESSDISPLAY::Finish (DWORD dwStatus) -{ - EnterCriticalSection (&m_cs); - - m_fFinished = TRUE; - m_dwStatus = dwStatus; - if (m_msgFinish) - PostMessage (m_hWnd, m_msgFinish, 0, 0); - else - PostMessage (m_hWnd, WM_UPDATE_PROGRESS, 0, 0); - - LeaveCriticalSection (&m_cs); - - if (InterlockedDecrement (&m_cRef) == 0) - Delete (this); -} - - -DWORD PROGRESSDISPLAY::GetStatus (void) -{ - EnterCriticalSection (&m_cs); - DWORD dwStatus = (m_fFinished) ? m_dwStatus : ERROR_BUSY; - LeaveCriticalSection (&m_cs); - return dwStatus; -} - - -void PROGRESSDISPLAY::Close (void) -{ - EnterCriticalSection (&m_cs); - - if (m_fCreatedWindow) - { - DestroyWindow (m_hWnd); - m_hWnd = NULL; - } - - LeaveCriticalSection (&m_cs); - - if (InterlockedDecrement (&m_cRef) == 0) - Delete (this); -} - - -void PROGRESSDISPLAY::OnUpdate (void) -{ - EnterCriticalSection (&m_cs); - - int perComplete; - if (m_iProgressFinish <= m_iProgressStart) - perComplete = 100; - else - perComplete = 100 * (m_iProgress - m_iProgressStart) / (m_iProgressFinish - m_iProgressStart); - - SendDlgItemMessage (m_hWnd, IDC_PROGRESS, PBM_SETPOS, (WPARAM)perComplete, 0); - - LPTSTR pszProgressText = FormatString (m_szProgressText, TEXT("%lu"), perComplete); - SetDlgItemText (m_hWnd, IDC_PROGRESSTEXT, pszProgressText); - FreeString (pszProgressText); - - SetDlgItemText (m_hWnd, IDC_OPERATION, m_szOperation); - - LeaveCriticalSection (&m_cs); -} - - -DWORD WINAPI PROGRESSDISPLAY::ThreadProc (PVOID lp) -{ - LPPROGRESSDISPLAY ppd; - if ((ppd = (LPPROGRESSDISPLAY)lp) != NULL) { - DWORD dwStatus; - - try { - dwStatus = (*(ppd->m_pfnUser))(ppd, ppd->m_lpUser); - } catch(...) { - dwStatus = ERROR_PROCESS_ABORTED; - } - - ppd->Finish (dwStatus); - } - return 0; -} - diff --git a/src/WINNT/afsapplib/al_progress.h b/src/WINNT/afsapplib/al_progress.h deleted file mode 100644 index 9fa0c6911..000000000 --- a/src/WINNT/afsapplib/al_progress.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AL_PROGRESS_H -#define AL_PROGRESS_H - -#ifndef EXPORTED -#define EXPORTED -#endif - -/* - * PROGRESS DIALOGS ___________________________________________________________ - * - * The PROGRESSDISPLAY object is probably one of the most esoteric - * utilities in this library. It provides a convenient way to package - * up a background thread, and associate it with a dialog telling the user - * what's going on. It sounds a little hokey, and honestly isn't that - * terribly useful, but you may find you need it at some point. - * - * Example: - * - * // Copy the files onto the user's machine. - * // - * extern LPTSTR g_apszFilename[]; - * - * LPPROGRESSDISPLAY pProg; - * pProg = new PROGRESSDISPLAY (hParent, IDD_COPYING_PROGRESS); - * pProg->SetProgressRange (0, nFILES(g_apszFilename)); - * pProg->Show (fnCopyFiles, (LPARAM)g_apszFilename); - * - * // By default, Show() is modal--it pumps messages until the - * // background thread completes. If you have specified a - * // finish message ("pProg->SetFinishMessage (WM_USER+15)"), - * // then Show() is modeless, returning immediately. The WM_USER+15 - * // message will be posted to the progress dialog when the background - * // thread completes (you can specify a dlgproc for your progress - * // dialog on the "new PROGRESSDISPLAY" line). - * - * DWORD CALLBACK fnCopyFiles (LPPROGRESSDISPLAY pProg, LPARAM lp) - * { - * LPTSTR *apszFilename = (LPTSTR*)lp; - * - * for (ii = 0; ii < nFILES(apszFilename); ++ii) { - * pProg->SetOperation ("Copying "+apszFilename[ii]); - * CopyFile (apszFilename[ii]) - * pProg->SetProgress (ii); - * } - * - * pProg->Close(); - * return 0; - * } - * - */ - -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#define IDC_OPERATION 900 -#define IDC_PROGRESS 901 -#define IDC_PROGRESSTEXT 902 - -typedef class EXPORTED PROGRESSDISPLAY PROGRESSDISPLAY, *LPPROGRESSDISPLAY; - - -/* - * PROGRESSDISPLAY CLASS ______________________________________________________ - * - */ - -class PROGRESSDISPLAY - { - public: - - PROGRESSDISPLAY (HWND hWnd); - PROGRESSDISPLAY (HWND hParent, int iddTemplate, DLGPROC dlgproc = 0); - - static LPPROGRESSDISPLAY GetProgressDisplay (HWND hWnd); - - void GetProgressRange (int *piStart, int *piFinish); - void SetProgressRange (int iStart, int iFinish); - - int GetProgress (void); - void SetProgress (int iProgress); - - void GetOperation (LPTSTR pszOperation); - void SetOperation (LPCTSTR pszOperation); - - HWND GetWindow (void); - - void SetFinishMessage (int msgFinish); - void Show (DWORD (CALLBACK *pfn)(LPPROGRESSDISPLAY ppd, LPARAM lp), LPARAM lp); - void Close (void); - DWORD GetStatus (void); - - private: - - ~PROGRESSDISPLAY (void); - void Init (HWND hWnd); - void Finish (DWORD dwStatus = 0); - void PROGRESSDISPLAY::OnUpdate (void); - - static BOOL CALLBACK ProgressDisplay_StubProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); - static BOOL CALLBACK ProgressDisplay_HookProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); - static DWORD WINAPI PROGRESSDISPLAY::ThreadProc (PVOID lp); - - BOOL m_fFinished; - LONG m_dwStatus; - - LONG m_cRef; - CRITICAL_SECTION m_cs; - HWND m_hWnd; - BOOL m_fCreatedWindow; - - int m_msgFinish; - DWORD (CALLBACK *m_pfnUser)(LPPROGRESSDISPLAY ppd, LPARAM lp); - LPARAM m_lpUser; - int m_iProgressStart; - int m_iProgressFinish; - int m_iProgress; - TCHAR m_szOperation[ cchRESOURCE ]; - TCHAR m_szProgressText[ cchRESOURCE ]; - }; - - -#endif - diff --git a/src/WINNT/afsapplib/al_pump.cpp b/src/WINNT/afsapplib/al_pump.cpp deleted file mode 100644 index 9e934c3d7..000000000 --- a/src/WINNT/afsapplib/al_pump.cpp +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_MODELESS 16 -#define cREALLOC_WINDOWDATA_FIELDS 4 -#define cREALLOC_WINDOWDATA_WINDOWS 16 -#define cREALLOC_WINDOWDATA_DATA 8 - -#define GWD_IS_MODELESS TEXT("afsapplib/al_pump.cpp - is window modeless?") - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - // Modeless-dialog support - // -static HWND *aModeless = NULL; -static size_t cModeless = 0; -static LPCRITICAL_SECTION pcsPump = NULL; - -static void (*g_fnPump)(MSG *lpm) = NULL; - - // Window-data support - // -static struct - { - TCHAR szField[ cchNAME ]; - } *aFields = NULL; -static size_t cFields = 0; - -static struct - { - HWND hWnd; - DWORD *adwData; - size_t cdwData; - } *aWindows = NULL; -static size_t cWindows = 0; -static LPCRITICAL_SECTION pcsData = NULL; - - -/* - * DIALOG ROUTINES ____________________________________________________________ - * - */ - -BOOL CALLBACK Modeless_HookProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, Modeless_HookProc); - - if (msg == WM_DESTROY) - { - EnterCriticalSection (pcsPump); - for (size_t ii = 0; ii < cModeless; ++ii) - { - if (aModeless[ ii ] == hDlg) - aModeless[ ii ] = 0; - } - LeaveCriticalSection (pcsPump); - Subclass_RemoveHook (hDlg, Modeless_HookProc); - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); - else - return DefWindowProc (hDlg, msg, wp, lp); -} - - -BOOL AfsAppLib_IsModelessDialogMessage (MSG *lpm) -{ - BOOL rc = FALSE; - - if (pcsPump) - { - EnterCriticalSection (pcsPump); - - for (size_t ii = 0; (!rc) && (ii < cModeless); ++ii) - { - if (aModeless[ ii ] != 0) - { - if (IsPropSheet (aModeless[ ii ])) - { - if (!PropSheet_GetCurrentPageHwnd(aModeless[ ii ])) - DestroyWindow (aModeless[ ii ]); - if (PropSheet_IsDialogMessage(aModeless[ ii ], lpm)) - rc = TRUE; - } - else - { - if (IsDialogMessage (aModeless[ ii ], lpm)) - rc = TRUE; - } - } - } - - LeaveCriticalSection (pcsPump); - } - - return rc; -} - - -void AfsAppLib_RegisterModelessDialog (HWND hDlg) -{ - if (pcsPump == NULL) - { - pcsPump = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsPump); - } - - EnterCriticalSection (pcsPump); - - for (size_t ii = 0; ii < cModeless; ++ii) - { - if (aModeless[ ii ] == hDlg) - break; - } - if (ii == cModeless) - { - for (ii = 0; ii < cModeless; ++ii) - { - if (aModeless[ ii ] == 0) - break; - } - if (ii == cModeless) - { - (void)REALLOC (aModeless, cModeless, 1+ii, cREALLOC_MODELESS); - } - if (ii < cModeless) - { - aModeless[ ii ] = hDlg; - Subclass_AddHook (hDlg, Modeless_HookProc); - } - } - - LeaveCriticalSection (pcsPump); -} - - -void AfsAppLib_SetPumpRoutine (void (*fnPump)(MSG *lpm)) -{ - g_fnPump = fnPump; -} - - -void AfsAppLib_MainPump (void) -{ - MSG msg; - - while (GetMessage (&msg, NULL, 0, 0)) - { - if (AfsAppLib_IsModelessDialogMessage (&msg)) - continue; - - if (g_fnPump) - (*g_fnPump)(&msg); - else - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - } -} - - -/* - * WINDOW-DATA ________________________________________________________________ - * - */ - -BOOL CALLBACK WindowData_HookProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hWnd, WindowData_HookProc); - - if (msg == WM_DESTROY) - { - EnterCriticalSection (pcsData); - for (size_t ii = 0; ii < cWindows; ++ii) - { - if (aWindows[ ii ].hWnd == hWnd) - { - if (aWindows[ ii ].adwData) - Free (aWindows[ ii ].adwData); - memset (&aWindows[ii], 0x00, sizeof(aWindows[ii])); - } - } - LeaveCriticalSection (pcsData); - Subclass_RemoveHook (hWnd, WindowData_HookProc); - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hWnd, msg, wp, lp); - else - return DefWindowProc (hWnd, msg, wp, lp); -} - - -size_t GetWindowDataField (LPTSTR pszField) -{ - size_t rc = (size_t)-1; - - if (pcsData == NULL) - { - pcsData = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsData); - } - EnterCriticalSection (pcsData); - - for (size_t ii = 0; ii < cFields; ++ii) - { - if (!lstrcmpi (aFields[ ii ].szField, pszField)) - break; - } - if (ii == cFields) - { - for (ii = 0; ii < cFields; ++ii) - { - if (aFields[ ii ].szField[0] == TEXT('\0')) - break; - } - if (ii == cFields) - { - (void)REALLOC (aFields, cFields, 1+ii, cREALLOC_WINDOWDATA_FIELDS); - } - if (ii < cFields) - { - lstrcpy (aFields[ ii ].szField, pszField); - } - } - if (ii < cFields) - { - rc = ii; - } - - LeaveCriticalSection (pcsData); - return rc; -} - - -DWORD GetWindowData (HWND hWnd, LPTSTR pszField) -{ - DWORD rc = 0; - - if (pcsData == NULL) - { - pcsData = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsData); - } - EnterCriticalSection (pcsData); - - size_t iField; - if ((iField = GetWindowDataField (pszField)) != (size_t)-1) - { - for (size_t ii = 0; ii < cWindows; ++ii) - { - if (aWindows[ ii ].hWnd == hWnd) - { - if (iField < aWindows[ ii ].cdwData) - rc = aWindows[ ii ].adwData[ iField ]; - break; - } - } - } - - LeaveCriticalSection (pcsData); - return rc; -} - - -DWORD SetWindowData (HWND hWnd, LPTSTR pszField, DWORD dwNewData) -{ - DWORD rc = 0; - - if (pcsData == NULL) - { - pcsData = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsData); - } - EnterCriticalSection (pcsData); - - size_t iField; - if ((iField = GetWindowDataField (pszField)) != (size_t)-1) - { - for (size_t ii = 0; ii < cWindows; ++ii) - { - if (aWindows[ ii ].hWnd == hWnd) - { - if (iField < aWindows[ ii ].cdwData) - rc = aWindows[ ii ].adwData[ iField ]; - break; - } - } - if (ii == cWindows) - { - for (ii = 0; ii < cWindows; ++ii) - { - if (aWindows[ ii ].hWnd == 0) - break; - } - if (ii == cWindows) - { - (void)REALLOC (aWindows, cWindows, 1+ii, cREALLOC_WINDOWDATA_WINDOWS); - } - } - if (ii < cWindows) - { - if (aWindows[ ii ].hWnd == 0) - { - aWindows[ ii ].hWnd = hWnd; - Subclass_AddHook (hWnd, WindowData_HookProc); - } - if ((dwNewData) && (iField >= aWindows[ ii ].cdwData)) - { - (void)REALLOC (aWindows[ ii ].adwData, aWindows[ ii ].cdwData, 1+iField, cREALLOC_WINDOWDATA_DATA); - } - if (iField < aWindows[ ii ].cdwData) - { - aWindows[ ii ].adwData[ iField ] = dwNewData; - } - } - } - - LeaveCriticalSection (pcsData); - return rc; -} - diff --git a/src/WINNT/afsapplib/al_resource.h b/src/WINNT/afsapplib/al_resource.h deleted file mode 100644 index a240a3993..000000000 --- a/src/WINNT/afsapplib/al_resource.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_BADCREDS_DESC_GENERAL 800 -#define IDS_BADCREDS_DESC_EXPIRED 801 -#define IDS_BADCREDS_DESC_BADCHOICE 802 -#define IDS_BADCREDS_DESC2 803 -#define IDS_BADCREDS_DESC3 804 -#define IDS_BADCREDS_DESC3_ADM 805 -#define IDS_BADCREDS_DESC_DESTROYED 806 -#define IDS_ERROR_BAD_CREDENTIALS 807 -#define IDS_BROWSE_WAITING 808 -#define IDS_BROWSE_BADCELL_TITLE 809 -#define IDS_BROWSE_BADCELL_DESC 810 -#define IDS_CREDS_NONE 811 -#define IDS_CREDS_VALID 812 -#define IDS_CREDS_EXPIRED 813 -#define IDC_OPENCELL_CELL 11000 -#define IDC_ERROR_STATUS 11001 -#define IDC_ERROR_DESC 11002 -#define IDC_COVERDLG 11003 -#define IDC_OPENCELL_ID 11004 -#define IDC_OPENCELL_PASSWORD 11005 -#define IDC_CREDS_CURRENTID 11006 -#define IDC_CREDS_EXPDATE 11007 -#define IDC_CREDS_LOGIN 11008 -#define IDC_CREDS_ID 11009 -#define IDC_CREDS_PASSWORD 11010 -#define IDC_CREDS_CELL 11011 -#define IDC_BADCREDS_DESC 11016 -#define IDC_BADCREDS_SHUTUP 11017 -#define IDC_BROWSE_NAMED 11019 -#define IDC_BROWSE_LIST 11020 -#define IDC_COVER_DESC 11021 -#define IDC_COVER_BUTTON 11022 -#define IDC_COVER_BORDER 11023 -#define IDC_BROWSE_TYPE 11023 -#define IDC_BROWSE_CELL 11024 -#define IDC_BROWSE_STATUS 11025 -#define IDC_BROWSE_SELECT 11026 -#define IDC_BROWSE_RESTART 11027 -#define IDC_BROWSE_NONE 11028 -#define IDC_OPENCELL_OLDCREDS 11030 -#define IDD_APPLIB_OPENCELL 15001 -#define IDD_APPLIB_CREDENTIALS 15002 -#define IDD_APPLIB_ERROR 15003 -#define IDD_APPLIB_BADCREDS 15004 -#define IDD_APPLIB_COVER 15005 -#define IDD_APPLIB_BROWSE 15006 -#define IDD_APPLIB_BROWSE_FILESET 15012 -#define IDI_SPIN1 20001 -#define IDI_SPIN2 20002 -#define IDI_SPIN3 20003 -#define IDI_SPIN4 20004 -#define IDI_SPIN5 20005 -#define IDI_SPIN6 20006 -#define IDI_SPIN7 20007 -#define IDI_SPIN8 20008 -#define IDI_SPINSTOP 20009 -#define IDI_BOSSERVICE 20010 -#define IDB_LOCAL_USER 20011 -#define IDB_LOCAL_GROUP 20012 -#define IDB_FOREIGN_USER 20013 -#define IDB_FOREIGN_GROUP 20014 -#define IDI_SERVER 20015 -#define IDI_SERVER_ALERT 20016 -#define IDI_SERVER_UNMON 20017 -#define IDI_SERVICE 20018 -#define IDI_SERVICE_ALERT 20019 -#define IDI_SERVICE_STOPPED 20020 -#define IDI_AGGREGATE 20021 -#define IDI_AGGREGATE_ALERT 20022 -#define IDI_FILESET 20023 -#define IDI_FILESET_ALERT 20024 -#define IDI_FILESET_LOCKED 20025 -#define IDB_UNAUTHENTICATED 20026 -#define IDB_MASK_OBJ 20027 -#define IDB_LOCAL_OTHER 20028 -#define IDB_FOREIGN_OTHER 20029 -#define IDB_ANY_OTHER 20030 -#define IDI_MULTIPLE 20031 -#define IDI_INITIAL_OBJECT 20032 -#define IDI_INITIAL_CONTAINER 20033 -#define IDI_ACL 20034 -#define IDI_CELL 20035 -#define IDI_SERVER_KEY 20036 -#define IDI_USER 20037 -#define IDI_GROUP 20038 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 20035 -#define _APS_NEXT_COMMAND_VALUE 9000 -#define _APS_NEXT_CONTROL_VALUE 11031 -#define _APS_NEXT_SYMED_VALUE 7000 -#endif -#endif diff --git a/src/WINNT/afsapplib/al_task.cpp b/src/WINNT/afsapplib/al_task.cpp deleted file mode 100644 index d409da397..000000000 --- a/src/WINNT/afsapplib/al_task.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static LPTASKQUEUE_PARAMS ptqp = NULL; - -typedef struct TASKQUEUEITEM - { - struct TASKQUEUEITEM *pNext; - int idTask; - HWND hReply; - PVOID lpUser; - } TASKQUEUEITEM, *LPTASKQUEUEITEM; - -static LPTASKQUEUEITEM pTaskQueuePop = NULL; -static LPTASKQUEUEITEM pTaskQueuePushAfter = NULL; -static CRITICAL_SECTION csTaskQueue; - -static size_t nThreadsRunning = 0; -static size_t nRequestsActive = 0; - - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -DWORD WINAPI Task_ThreadProc (PVOID lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void AfsAppLib_InitTaskQueue (LPTASKQUEUE_PARAMS lpp) -{ - if (ptqp != NULL) - { - Delete (ptqp); - ptqp = NULL; - } - - if (lpp && lpp->fnCreateTaskPacket && lpp->fnPerformTask && lpp->fnFreeTaskPacket) - { - ptqp = New (TASKQUEUE_PARAMS); - memcpy (ptqp, lpp, sizeof(TASKQUEUE_PARAMS)); - } -} - - -void StartTask (int idTask, HWND hReply, PVOID lpUser) -{ - if (!ptqp) - return; - - static BOOL fStarted = FALSE; - if (!fStarted) - { - fStarted = TRUE; - InitializeCriticalSection (&csTaskQueue); - } - - // Then push this notification onto our TaskQueue, so that the task - // thread will pop off each request in turn and take a look at it. - // Ideally, PostThreadMessage() and GetMessage() would implement all this - // garbage, but that doesn't work properly for some reason... - // - EnterCriticalSection (&csTaskQueue); - - if ((++nRequestsActive) > nThreadsRunning) - { - if ((!ptqp->nThreadsMax) || (nThreadsRunning < (size_t)(ptqp->nThreadsMax))) - { - DWORD dwThreadID; - HANDLE hThread; - if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)Task_ThreadProc, 0, 0, &dwThreadID)) != NULL) - { - SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL); - ++nThreadsRunning; - } - } - } - - LPTASKQUEUEITEM lptqi = New (TASKQUEUEITEM); - lptqi->pNext = NULL; - lptqi->idTask = idTask; - lptqi->hReply = hReply; - lptqi->lpUser = lpUser; - - if (pTaskQueuePushAfter != NULL) - pTaskQueuePushAfter->pNext = lptqi; - pTaskQueuePushAfter = lptqi; - - if (pTaskQueuePop == NULL) - pTaskQueuePop = lptqi; - - LeaveCriticalSection (&csTaskQueue); -} - - -DWORD WINAPI Task_ThreadProc (PVOID lp) -{ - BOOL fJustDidTask = FALSE; - - for (;;) - { - BOOL fFound = FALSE; - TASKQUEUEITEM tqi; - - EnterCriticalSection (&csTaskQueue); - - if (fJustDidTask) - { - --nRequestsActive; - fJustDidTask = FALSE; - } - - if (pTaskQueuePop != NULL) - { - LPTASKQUEUEITEM lptqiNext = pTaskQueuePop->pNext; - tqi = *pTaskQueuePop; - Delete (pTaskQueuePop); - if (pTaskQueuePushAfter == pTaskQueuePop) - pTaskQueuePushAfter = NULL; - pTaskQueuePop = lptqiNext; - fFound = TRUE; - fJustDidTask = TRUE; - } - - // is this thread unnecessary?--that is, if we couldn't find anything - // to do, then kill off all threads. - // - if (!fFound) - { - --nThreadsRunning; - LeaveCriticalSection (&csTaskQueue); - break; - } - - LeaveCriticalSection (&csTaskQueue); - - if (fFound) - { - LPTASKPACKET ptp; - if ((ptp = (*ptqp->fnCreateTaskPacket)(tqi.idTask, tqi.hReply, tqi.lpUser)) != NULL) - { - (*ptqp->fnPerformTask)(ptp); - } - - if (tqi.hReply && IsWindow (tqi.hReply)) - { - PostMessage (tqi.hReply, WM_ENDTASK, 0, (LPARAM)ptp); - } - else if (ptp != NULL) - { - (*ptqp->fnFreeTaskPacket)(ptp); - } - } - } - - return 0; -} - diff --git a/src/WINNT/afsapplib/al_wizard.cpp b/src/WINNT/afsapplib/al_wizard.cpp deleted file mode 100644 index fe8b44f6b..000000000 --- a/src/WINNT/afsapplib/al_wizard.cpp +++ /dev/null @@ -1,1149 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define REFRESH_LEFT_PANE 0x00000001 -#define REFRESH_RIGHT_PANE 0x00000002 - -#define cxRECT(_r) ((_r).right - (_r).left) -#define cyRECT(_r) ((_r).bottom - (_r).top) - -#define clrWASH_SOLID RGB(0,0,128) -#define clrWASH_BRIGHTEST RGB(0,0,252) -#define clrWASH_DARKEST RGB(0,0,4) -#define clrWASH_INCREMENT RGB(0,0,4) -#define clrWASH_TEXT_BG RGB(0,0,0) -#define clrWASH_TEXT_FG RGB(255,255,255) - -#define ToPALETTERGB(_rgb) PALETTERGB(GetRValue(_rgb),GetGValue(_rgb),GetBValue(_rgb)) - -#define cxLEFT_BACKGROUND 20 -#define cxRIGHT_BACKGROUND 20 -#define cyTOP_BACKGROUND 20 -#define cyBOTTOM_BACKGROUND 20 - -#define xTEXT 30 -#define yTEXT 30 -#define cxSHADOW 2 -#define cySHADOW 2 - -#define cptWASH_TEXT_SIZE 20 - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -static void MoveRect (RECT *_pr, LONG _dx, LONG _dy); -static void GetRectInParent (HWND hWnd, RECT *pr); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - -WIZARD::WIZARD (void) -{ - m_iddTemplate = -1; - m_idcLeftPane = -1; - m_idcRightPane = -1; - m_idcBack = -1; - m_idcNext = -1; - m_idbGraphic16 = -1; - m_bmpGraphic16 = NULL; - m_idbGraphic256 = -1; - m_bmpGraphic256 = NULL; - m_palGraphic = NULL; - m_aStates = NULL; - m_cStates = 0; - m_stCurrent = -1; - m_fShowing = FALSE; - m_hWnd = NULL; - - m_iddBackground = -1; - m_hBkg = NULL; - m_fBlue = TRUE; - m_fnBackground = NULL; - m_szBackground[0] = TEXT('\0'); - m_bmpBackground = NULL; - m_pfnCallback = NULL; - m_bmpBuffer = NULL; - SetRectEmpty (&m_rBuffer); - - HDC hdc = GetDC (NULL); - LOGFONT lf; - memset (&lf, 0x00, sizeof(lf)); - GetObject (GetStockObject (DEFAULT_GUI_FONT), sizeof(lf), &lf); - lf.lfHeight = -MulDiv (cptWASH_TEXT_SIZE, GetDeviceCaps (hdc, LOGPIXELSY), 72); - lf.lfWidth = 0; - m_hfBackground = CreateFontIndirect (&lf); - ReleaseDC (NULL, hdc); - - GeneratePalette(); -} - - -WIZARD::~WIZARD (void) -{ - if (m_hWnd && IsWindow (m_hWnd)) - DestroyWindow (m_hWnd); - if (m_bmpGraphic16 != NULL) - DeleteObject (m_bmpGraphic16); - if (m_bmpGraphic256 != NULL) - DeleteObject (m_bmpGraphic256); - if (m_bmpBuffer != NULL) - DeleteObject (m_bmpBuffer); - if (m_palGraphic != NULL) - DeleteObject (m_palGraphic); - if (m_bmpBackground != NULL) - DeleteObject (m_bmpBackground); - if (m_hfBackground != NULL) - DeleteObject (m_hfBackground); -} - - -HWND WIZARD::GetWindow (void) -{ - if (m_hWnd && IsWindow (m_hWnd)) - return m_hWnd; - return NULL; -} - - -LPWIZARD WIZARD::GetWizard (HWND hWnd) -{ - LPWIZARD pWiz = NULL; - - try { - if ((pWiz = (LPWIZARD)GetWindowLong (hWnd, DWL_USER)) != NULL) - { - if ( (pWiz->m_hWnd != hWnd) && (pWiz->m_hBkg != hWnd) ) - pWiz = NULL; - } - } catch(...) { - pWiz = NULL; - } - - return pWiz; -} - - -void WIZARD::SetDialogTemplate (int iddTemplate, int idcLeftPane, int idcRightPane, int idcBack, int idcNext) -{ - m_iddTemplate = iddTemplate; - m_idcLeftPane = idcLeftPane; - m_idcRightPane = idcRightPane; - m_idcBack = idcBack; - m_idcNext = idcNext; - - if (m_fShowing) - { - Show (FALSE); - Show (TRUE); - } -} - - -void WIZARD::SetGraphic (int idbGraphic16, int idbGraphic256) -{ - LPRGBQUAD pargb = NULL; - RGBQUAD argb[256]; - - m_idbGraphic16 = idbGraphic16; - m_idbGraphic256 = idbGraphic256; - - if (m_bmpGraphic16 != NULL) - { - DeleteObject (m_bmpGraphic16); - m_bmpGraphic16 = NULL; - } - - if (m_bmpGraphic256 != NULL) - { - DeleteObject (m_bmpGraphic256); - m_bmpGraphic256 = NULL; - } - - if (m_palGraphic != NULL) - { - DeleteObject (m_palGraphic); - m_palGraphic = NULL; - } - - m_bmpGraphic16 = (HBITMAP)TaLocale_LoadImage (idbGraphic16, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - - if ((m_bmpGraphic256 = (HBITMAP)TaLocale_LoadImage (idbGraphic256, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION)) != NULL) - { - BITMAP bm; - GetObject (m_bmpGraphic256, sizeof(BITMAP), &bm); - - if ((bm.bmBitsPixel * bm.bmPlanes) == 8) - { - HDC hdc = CreateCompatibleDC (NULL); - HBITMAP bmpOld = (HBITMAP)SelectObject (hdc, m_bmpGraphic256); - - GetDIBColorTable (hdc, 0, 256, argb); - pargb = argb; - - SelectObject (hdc, bmpOld); - DeleteDC (hdc); - } - } - - GeneratePalette (pargb); - - if (m_fShowing) - { - Refresh (REFRESH_LEFT_PANE); - } -} - - -void WIZARD::SetGraphicCallback (void (CALLBACK *pfnCallback)(LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal)) -{ - m_pfnCallback = pfnCallback; - - if (m_fShowing) - { - Refresh (REFRESH_LEFT_PANE); - } -} - - -void WIZARD::SetStates (LPWIZARD_STATE aStates, size_t cStates) -{ - m_aStates = aStates; - m_cStates = cStates; - - if (m_fShowing) - { - Refresh (REFRESH_RIGHT_PANE); - } -} - - -int WIZARD::GetState (void) -{ - return m_stCurrent; -} - - -void WIZARD::SetState (int stNew, BOOL fForce) -{ - SendStateCommand (m_stCurrent, wcSTATE_LEAVE); - - int stOriginal = m_stCurrent; - m_stCurrent = stNew; - - if (!fForce && SendStateCommand (stNew, wcIS_STATE_DISABLED)) - { - if (stOriginal <= stNew) - { - for (int st = stNew+1; st < (int)m_cStates; ++st) - { - LPWIZARD_STATE pState; - if ((pState = FindState (st)) != NULL) - { - m_stCurrent = st; - if (!SendStateCommand (st, wcIS_STATE_DISABLED)) - break; - m_stCurrent = stOriginal; - SendStateCommand (st, wcSTATE_ENTER); - SendStateCommand (st, wcSTATE_LEAVE); - } - } - stNew = (st < (int)m_cStates) ? st : m_stCurrent; - } - else // (moving backwards?) - { - for (int st = stNew-1; st >= 0; --st) - { - LPWIZARD_STATE pState; - if ((pState = FindState (st)) != NULL) - { - m_stCurrent = st; - if (!SendStateCommand (st, wcIS_STATE_DISABLED)) - break; - m_stCurrent = stOriginal; - SendStateCommand (st, wcSTATE_ENTER); - SendStateCommand (st, wcSTATE_LEAVE); - } - } - stNew = (st >= 0) ? st : m_stCurrent; - } - } - - m_stCurrent = stNew; - - SendStateCommand (m_stCurrent, wcSTATE_ENTER); - - if (m_fShowing) - { - Refresh (REFRESH_RIGHT_PANE); - } -} - - -BOOL WIZARD::Show (BOOL fShowReq) -{ - if (m_fShowing && !fShowReq) - { - m_fShowing = FALSE; - if (m_hWnd && IsWindow (m_hWnd)) - DestroyWindow (m_hWnd); - m_hWnd = NULL; - } - else if (!m_fShowing && fShowReq) - { - if (m_iddTemplate == -1) - return FALSE; - if (m_idcLeftPane == -1) - return FALSE; - if (m_idcRightPane == -1) - return FALSE; - if (m_idcBack == -1) - return FALSE; - if (m_idcNext == -1) - return FALSE; - - if ((m_hWnd = ModelessDialogParam (m_iddTemplate, m_hBkg, (DLGPROC)WIZARD::Template_DlgProc, (LPARAM)this)) == NULL) - return FALSE; - m_fShowing = TRUE; - - MSG msg; - while (GetMessage (&msg, 0, 0, NULL)) - { - if (!IsDialogMessage (m_hWnd, &msg)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - if (!m_fShowing || !m_hWnd || !IsWindow (m_hWnd)) - break; - } - } - - return TRUE; -} - - -void WIZARD::EnableButton (int idcButton, BOOL fEnable) -{ - EnableWindow (GetDlgItem (m_hWnd, idcButton), fEnable); -} - - -void WIZARD::EnableButtons (DWORD dwButtonFlags) -{ - EnableWindow (GetDlgItem (m_hWnd, m_idcBack), (dwButtonFlags & BACK_BUTTON) ? TRUE : FALSE); - EnableWindow (GetDlgItem (m_hWnd, m_idcNext), (dwButtonFlags & NEXT_BUTTON) ? TRUE : FALSE); -} - - -void WIZARD::SetButtonText (int idcButton, int idsText) -{ - HWND hButton; - if ((hButton = GetDlgItem (m_hWnd, idcButton)) != NULL) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, idsText); - SetWindowText (hButton, szText); - } -} - - -void WIZARD::SetDefaultControl (int idc) -{ - HWND hControl; - if ((hControl = GetDlgItem (m_hWnd, idc)) == NULL) - { - HWND hRHS; - if ((hRHS = GetRightHandWindow()) != NULL) - hControl = GetDlgItem (hRHS, idc); - } - - if (hControl) - { - PostMessage (m_hWnd, WM_NEXTDLGCTL, (WPARAM)hControl, TRUE); - } -} - - -void WIZARD::SetBackground (int iddBackground, BOOL fBlue, DLGPROC dlgproc) -{ - m_iddBackground = iddBackground; - m_fBlue = fBlue; - m_fnBackground = dlgproc; - - if (m_hBkg && IsWindow (m_hBkg)) - { - ShowBackground (FALSE); - ShowBackground (TRUE); - } -} - - -void WIZARD::SetBackgroundText (int idsText, HFONT hf) -{ - GetString (m_szBackground, idsText); - - if ((hf != NULL) && (hf != m_hfBackground)) - { - if (m_hfBackground != NULL) - DeleteObject (m_hfBackground); - m_hfBackground = hf; - } - - if (m_hBkg && IsWindow (m_hBkg)) - { - Background_OnSize(); - } -} - - -void WIZARD::SetBackgroundText (LPTSTR pszText, HFONT hf) -{ - if (!pszText) - m_szBackground[0] = TEXT('\0'); - else - lstrcpy (m_szBackground, pszText); - - if ((hf != NULL) && (hf != m_hfBackground)) - { - if (m_hfBackground != NULL) - DeleteObject (m_hfBackground); - m_hfBackground = hf; - } - - if (m_hBkg && IsWindow (m_hBkg)) - { - Background_OnSize(); - } -} - - -BOOL WIZARD::ShowBackground (BOOL fShow) -{ - if (!fShow && m_hBkg && IsWindow (m_hBkg)) - { - DestroyWindow (m_hBkg); - m_hBkg = NULL; - } - else if (fShow && !(m_hBkg && IsWindow (m_hBkg))) - { - if ((m_hBkg = ModelessDialogParam (m_iddBackground, NULL, (DLGPROC)WIZARD::Background_DlgProc, (LPARAM)this)) == NULL) - return FALSE; - - RECT rDesktop; - SystemParametersInfo (SPI_GETWORKAREA, 0, &rDesktop, 0); - - WINDOWPLACEMENT wpl; - wpl.length = sizeof(wpl); - wpl.flags = 0; - wpl.showCmd = (GetWindowLong (m_hBkg, GWL_STYLE) & WS_MAXIMIZE) ? SW_SHOWMAXIMIZED : SW_SHOW; - wpl.ptMinPosition.x = 0; - wpl.ptMinPosition.y = 0; - wpl.ptMaxPosition.x = 0; - wpl.ptMaxPosition.y = 0; - wpl.rcNormalPosition.left = rDesktop.left + cxLEFT_BACKGROUND; - wpl.rcNormalPosition.right = rDesktop.right - cxRIGHT_BACKGROUND; - wpl.rcNormalPosition.top = rDesktop.top + cyTOP_BACKGROUND; - wpl.rcNormalPosition.bottom = rDesktop.bottom - cyBOTTOM_BACKGROUND; - SetWindowPlacement (m_hBkg, &wpl); - } - - return TRUE; -} - - -HWND WIZARD::GetBackgroundWindow (void) -{ - return m_hBkg; -} - - -void WIZARD::Refresh (DWORD dwRefFlags) -{ - if (dwRefFlags & REFRESH_LEFT_PANE) - { - HWND hLHS; - if ((hLHS = GetDlgItem (m_hWnd, m_idcLeftPane)) != NULL) - { - RECT rr; - GetClientRect (hLHS, &rr); - InvalidateRect (hLHS, &rr, TRUE); - UpdateWindow (hLHS); - } - } - - if (dwRefFlags & REFRESH_RIGHT_PANE) - { - HWND hRHS; - if ((hRHS = GetDlgItem (m_hWnd, m_idcRightPane)) != NULL) - { - HWND hOld = GetRightHandWindow(); - - LPWIZARD_STATE pState; - if ((pState = FindState (m_stCurrent)) != NULL) - { - int stCurrent = m_stCurrent; - - HWND hNew; - if ((hNew = ModelessDialogParam (pState->idd, m_hWnd, pState->dlgproc, pState->lp)) != NULL) - { - if (stCurrent != m_stCurrent) - DestroyWindow (hNew); - else - { - RECT rRHS; - GetRectInParent (hRHS, &rRHS); - SetWindowPos (hNew, NULL, rRHS.left, rRHS.top, cxRECT(rRHS), cyRECT(rRHS), SWP_NOZORDER | SWP_NOACTIVATE); - SetWindowLong (hNew, GWL_ID, pState->idd); - - ShowWindow (hNew, SW_SHOW); - ShowWindow (hRHS, SW_HIDE); - } - } - } - - if (hOld != NULL) - DestroyWindow (hOld); - } - } -} - - -HWND WIZARD::GetRightHandWindow (void) -{ - if (!m_fShowing || !m_hWnd || !IsWindow (m_hWnd)) - return NULL; - - HWND hRHS = NULL; - - for (HWND hFound = ::GetWindow (m_hWnd, GW_CHILD); - hFound != NULL; - hFound = ::GetWindow (hFound, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - if (GetClassName (hFound, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, TEXT("#32770"))) // WC_DIALOG - { - if (!hRHS || IsWindowVisible(hRHS)) - hRHS = hFound; - } - } - } - - return hRHS; -} - - -void WIZARD::GeneratePalette (LPRGBQUAD argb) -{ - HDC hdc = GetDC (NULL); - WORD wDepthDisplay = (WORD)GetDeviceCaps (hdc, BITSPIXEL); - ReleaseDC (NULL, hdc); - - if (wDepthDisplay == 8) - { - BYTE aPalBuffer[ sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY) ]; - LPLOGPALETTE pPal = (LPLOGPALETTE)aPalBuffer; - pPal->palVersion = 0x300; - pPal->palNumEntries = 256; - - for (size_t ii = 0; ii < 256; ++ii) - { - pPal->palPalEntry[ ii ].peRed = (argb) ? argb[ ii ].rgbRed : 0; - pPal->palPalEntry[ ii ].peGreen = (argb) ? argb[ ii ].rgbGreen : 0; - pPal->palPalEntry[ ii ].peBlue = (argb) ? argb[ ii ].rgbBlue : 0; - pPal->palPalEntry[ ii ].peFlags = 0; - } - - for (COLORREF clr = clrWASH_DARKEST; clr <= clrWASH_BRIGHTEST; clr += clrWASH_INCREMENT) - { - for (size_t ii = 0; ii < 256; ++ii) - { - if ( (pPal->palPalEntry[ ii ].peRed == GetRValue (clr)) && - (pPal->palPalEntry[ ii ].peGreen == GetGValue (clr)) && - (pPal->palPalEntry[ ii ].peBlue == GetBValue (clr)) ) - break; - } - if (ii == 256) - { - for (size_t ii = 10; ii < 246; ++ii) - { - if ( (pPal->palPalEntry[ ii ].peRed == 0) && - (pPal->palPalEntry[ ii ].peGreen == 0) && - (pPal->palPalEntry[ ii ].peBlue == 0) ) - break; - if ( (pPal->palPalEntry[ ii ].peRed == 255) && - (pPal->palPalEntry[ ii ].peGreen == 255) && - (pPal->palPalEntry[ ii ].peBlue == 255) ) - break; - } - if (ii == 246) - break; - - pPal->palPalEntry[ ii ].peRed = GetRValue (clr); - pPal->palPalEntry[ ii ].peGreen = GetGValue (clr); - pPal->palPalEntry[ ii ].peBlue = GetBValue (clr); - } - } - - m_palGraphic = CreatePalette (pPal); - } -} - - -LPWIZARD_STATE WIZARD::FindState (int stFind) -{ - for (size_t ii = 0; ii < m_cStates; ++ii) - { - if (m_aStates[ ii ].st == stFind) - return &m_aStates[ ii ]; - } - return NULL; -} - - -BOOL WIZARD::SendStateCommand (int st, WIZARD_COMMAND wc) -{ - BOOL rc = FALSE; - - LPWIZARD_STATE pState; - if ((pState = FindState (st)) != NULL) - { - rc = CallWindowProc ((WNDPROC)(pState->dlgproc), NULL, WM_COMMAND, MAKEWPARAM(IDC_WIZARD,(WORD)wc), (LPARAM)this); - } - - return rc; -} - - -BOOL CALLBACK WIZARD::Template_DlgProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_INITDIALOG) - SetWindowLong (hWnd, DWL_USER, lp); - - LPWIZARD pWiz = (LPWIZARD)GetWindowLong (hWnd, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG: - if (pWiz) - pWiz->Template_OnInitDialog (hWnd); - break; - - case WM_DESTROY: - if (pWiz && (pWiz->m_hWnd == hWnd)) - pWiz->Show (FALSE); - break; - - case WM_COMMAND: - return pWiz->Template_ForwardMessage (hWnd, msg, wp, lp); - } - - return FALSE; -} - - -BOOL CALLBACK WIZARD::Template_LeftPaneHook (HWND hLHS, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hLHS, WIZARD::Template_LeftPaneHook); - - switch (msg) - { - case WM_PAINT: - LPWIZARD pWiz; - if ((pWiz = WIZARD::GetWizard (GetParent (hLHS))) != NULL) - { - if (pWiz->Template_OnPaintLHS (hLHS)) - return TRUE; - } - break; - - case WM_DESTROY: - Subclass_RemoveHook (hLHS, WIZARD::Template_LeftPaneHook); - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hLHS, msg, wp, lp); - else - return DefWindowProc (hLHS, msg, wp, lp); -} - - -BOOL WIZARD::Template_ForwardMessage (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - HWND hRHS; - if ((hRHS = GetRightHandWindow()) != NULL) - return SendMessage (hRHS, msg, wp, lp); - - LPWIZARD_STATE pState; - if ((pState = FindState (m_stCurrent)) != NULL) - return CallWindowProc ((WNDPROC)(pState->dlgproc), hWnd, msg, wp, lp); - - return FALSE; -} - - -void WIZARD::Template_OnInitDialog (HWND hWnd) -{ - m_hWnd = hWnd; - m_fShowing = TRUE; - - HWND hLHS; - if ((hLHS = GetDlgItem (m_hWnd, m_idcLeftPane)) != NULL) - { - Subclass_AddHook (hLHS, WIZARD::Template_LeftPaneHook); - } - - HWND hRHS; - if ((hRHS = GetDlgItem (m_hWnd, m_idcRightPane)) != NULL) - { - ShowWindow (hRHS, SW_HIDE); - } - - Refresh (REFRESH_RIGHT_PANE); - - ShowWindow (m_hWnd, SW_SHOW); -} - - -BOOL WIZARD::Template_OnPaintLHS (HWND hLHS) -{ - BOOL fShow16 = FALSE; - BOOL fShow256 = FALSE; - - HDC hdc = GetDC (NULL); - WORD wDepthDisplay = (WORD)GetDeviceCaps (hdc, BITSPIXEL); - ReleaseDC (NULL, hdc); - - if ( (m_bmpGraphic256 != NULL) && (wDepthDisplay >= 8) ) - fShow256 = TRUE; - else if (m_bmpGraphic16 != NULL) - fShow16 = TRUE; - else - return FALSE; - - PAINTSTRUCT ps; - HDC hdcTarget; - if ((hdcTarget = BeginPaint (hLHS, &ps)) != NULL) - { - HBITMAP bmpSource = (fShow256) ? m_bmpGraphic256 : m_bmpGraphic16; - - BITMAP bm; - GetObject (bmpSource, sizeof(BITMAP), &bm); - - RECT rWindow; - GetClientRect (hLHS, &rWindow); - - RECT rSource = { 0, 0, bm.bmWidth, bm.bmHeight }; - RECT rTarget = rWindow; - - if (cxRECT(rSource) > cxRECT(rTarget)) - { - MoveRect (&rSource, (cxRECT(rSource) - cxRECT(rTarget)) / 2, 0); - rSource.right = rSource.left + cxRECT(rTarget); - } - else if (cxRECT(rSource) < cxRECT(rTarget)) - { - MoveRect (&rTarget, (cxRECT(rTarget) - cxRECT(rSource)) / 2, 0); - } - - if (cyRECT(rSource) > cyRECT(rTarget)) - { - MoveRect (&rSource, 0, (cyRECT(rSource) - cyRECT(rTarget)) / 2); - rSource.bottom = rSource.top + cyRECT(rTarget); - } - else if (cyRECT(rSource) < cyRECT(rTarget)) - { - MoveRect (&rTarget, 0, (cyRECT(rTarget) - cyRECT(rSource)) / 2); - } - rTarget.right = rTarget.left + cxRECT(rSource); - rTarget.bottom = rTarget.top + cyRECT(rSource); - - // If the user has supplied a custom draw-proc, then we should - // do our rendering to an off-screen bitmap. - // - HDC hdcFinalTarget = NULL; - HBITMAP bmpTempTarget = NULL; - if (m_pfnCallback) - { - // First make sure our offscreen buffer is large enough - // - if (!m_bmpBuffer || (cxRECT(m_rBuffer) < cxRECT(rWindow)) || (cyRECT(m_rBuffer) < cyRECT(rWindow))) - { - if (m_bmpBuffer != NULL) - DeleteObject (m_bmpBuffer); - if ((m_bmpBuffer = CreateCompatibleBitmap (hdcTarget, cxRECT(rWindow), cyRECT(rWindow))) != NULL) - { - m_rBuffer.right = cxRECT(rWindow); // m_rBuffer.left=already 0 - m_rBuffer.bottom = cyRECT(rWindow); // m_rBuffer.top=already 0 - } - } - - // Then set up to double-buffer, if possible - // - if (m_bmpBuffer) - { - hdcFinalTarget = hdcTarget; - hdcTarget = CreateCompatibleDC (hdcFinalTarget); - bmpTempTarget = (HBITMAP)SelectObject (hdcTarget, m_bmpBuffer); - } - } - - HDC hdcSource = CreateCompatibleDC (hdcTarget); - HBITMAP bmpOld = (HBITMAP)SelectObject (hdcSource, bmpSource); - HPALETTE palOld = NULL; - if ((wDepthDisplay == 8) && (m_palGraphic != NULL) && (fShow256)) - { - palOld = SelectPalette (hdcTarget, m_palGraphic, FALSE); - RealizePalette (hdcTarget); - } - - if ( (bm.bmWidth < cxRECT(rWindow)) || (bm.bmHeight < cyRECT(rWindow)) ) - { - COLORREF clrFill = GetPixel (hdcSource, 0, rSource.bottom -1); - clrFill = ToPALETTERGB(clrFill); - HBRUSH hbrFill = CreateSolidBrush (clrFill); - - if (bm.bmWidth < cxRECT(rWindow)) - { - RECT rr; - rr = rWindow; - rr.right = rTarget.left; - FillRect (hdcTarget, &rr, hbrFill); - - rr = rWindow; - rr.left = rTarget.right; - FillRect (hdcTarget, &rr, hbrFill); - } - - if (bm.bmHeight < cyRECT(rWindow)) - { - RECT rr; - rr = rWindow; - rr.bottom = rTarget.top; - FillRect (hdcTarget, &rr, hbrFill); - - rr = rWindow; - rr.top = rTarget.bottom; - FillRect (hdcTarget, &rr, hbrFill); - } - - DeleteObject (hbrFill); - } - - BitBlt (hdcTarget, rTarget.left, rTarget.top, cxRECT(rTarget), cyRECT(rTarget), hdcSource, rSource.left, rSource.top, SRCCOPY); - - // Call the user-supplied callback function (if there is one) - // - if (m_pfnCallback) - { - (*m_pfnCallback)(this, hdcTarget, &rWindow, (palOld) ? m_palGraphic : NULL); - } - - if (palOld != NULL) - SelectPalette (hdcTarget, palOld, FALSE); - - // If we've been drawing to an off-screen bitmap, blit the result to - // the display. - // - if (hdcFinalTarget) - { - BitBlt (hdcFinalTarget, rWindow.left, rWindow.top, cxRECT(rWindow), cyRECT(rWindow), hdcTarget, 0, 0, SRCCOPY); - SelectObject (hdcTarget, bmpTempTarget); - DeleteDC (hdcTarget); - hdcTarget = hdcFinalTarget; - } - - SelectObject (hdcSource, bmpOld); - DeleteDC (hdcSource); - - EndPaint (hLHS, &ps); - } - - return TRUE; -} - - -void MoveRect (RECT *_pr, LONG _dx, LONG _dy) -{ - _pr->left += _dx; - _pr->right += _dx; - _pr->top += _dy; - _pr->bottom += _dy; -} - - -void GetRectInParent (HWND hWnd, RECT *pr) -{ - POINT pt; - - GetWindowRect (hWnd, pr); - - pr->right -= pr->left; - pr->bottom -= pr->top; // right/bottom == width/height for now - - pt.x = pr->left; - pt.y = pr->top; - - ScreenToClient (GetParent (hWnd), &pt); - - pr->left = pt.x; - pr->top = pt.y; - pr->right += pr->left; - pr->bottom += pr->top; -} - - -BOOL CALLBACK WIZARD::Background_DlgProc (HWND hBkg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_INITDIALOG) - SetWindowLong (hBkg, DWL_USER, lp); - - LPWIZARD pWiz = (LPWIZARD)GetWindowLong (hBkg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG: - if (pWiz) - pWiz->Background_OnInitDialog (hBkg); - break; - - case WM_SIZE: - if (pWiz) - pWiz->Background_OnSize(); - break; - - case WM_DESTROY: - if (pWiz) - pWiz->Background_OnDestroy(); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - if (pWiz) - pWiz->Background_OnClose(); - else - DestroyWindow (hBkg); - break; - } - break; - } - - if (pWiz && pWiz->m_fnBackground) - { - if (CallWindowProc ((WNDPROC)(pWiz->m_fnBackground), hBkg, msg, wp, lp)) - return TRUE; - } - - return FALSE; -} - - -BOOL CALLBACK WIZARD::Background_PaintHook (HWND hBkg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hBkg, WIZARD::Background_PaintHook); - - switch (msg) - { - case WM_PAINT: - LPWIZARD pWiz; - if ((pWiz = WIZARD::GetWizard (hBkg)) != NULL) - { - if (pWiz->Background_OnPaint()) - return TRUE; - } - break; - - case WM_DESTROY: - Subclass_RemoveHook (hBkg, WIZARD::Background_PaintHook); - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hBkg, msg, wp, lp); - else - return DefWindowProc (hBkg, msg, wp, lp); -} - - - -void WIZARD::Background_OnInitDialog (HWND hBkg) -{ - m_hBkg = hBkg; - Background_OnSize(); - Subclass_AddHook (m_hBkg, (DLGPROC)WIZARD::Background_PaintHook); -} - - -void WIZARD::Background_OnSize (void) -{ - if (m_bmpBackground) - { - DeleteObject (m_bmpBackground); - m_bmpBackground = NULL; - } - - RECT rr; - GetClientRect (m_hBkg, &rr); - - if (m_fBlue) - { - HDC hdc = GetDC (NULL); - WORD wDepthDisplay = (WORD)GetDeviceCaps (hdc, BITSPIXEL); - ReleaseDC (NULL, hdc); - - hdc = GetDC (m_hBkg); - HDC hdcTarget = CreateCompatibleDC (hdc); - - if ((m_bmpBackground = CreateCompatibleBitmap (hdc, cxRECT(rr), cyRECT(rr))) != NULL) - { - HBITMAP bmpOld = (HBITMAP)SelectObject (hdcTarget, m_bmpBackground); - - HPALETTE palOld = NULL; - if (m_palGraphic) - { - palOld = SelectPalette (hdcTarget, m_palGraphic, FALSE); - RealizePalette (hdcTarget); - } - - size_t yy = 0; - size_t cy = cyRECT(rr) / ((clrWASH_BRIGHTEST - clrWASH_DARKEST) / clrWASH_INCREMENT); - for (COLORREF clr = clrWASH_BRIGHTEST; clr >= clrWASH_DARKEST; clr -= clrWASH_INCREMENT) - { - RECT rSection = rr; - rSection.top = yy; - rSection.bottom = yy +cy; - HBRUSH hbr = CreateSolidBrush (ToPALETTERGB(clr)); - FillRect (hdcTarget, &rSection, hbr); - DeleteObject (hbr); - yy += cy; - } - - if (m_szBackground[0] != TEXT('\0')) - { - HFONT hfOld = (HFONT)SelectObject (hdcTarget, m_hfBackground); - COLORREF clrOld = SetTextColor (hdcTarget, clrWASH_TEXT_BG); - SetBkMode (hdcTarget, TRANSPARENT); - - RECT rText = rr; - rText.left += xTEXT + cxSHADOW; - rText.top += yTEXT + cySHADOW; - DrawTextEx (hdcTarget, m_szBackground, lstrlen(m_szBackground), &rText, DT_NOPREFIX | DT_LEFT, NULL); - - rText.left -= cxSHADOW; - rText.top -= cySHADOW; - SetTextColor (hdcTarget, clrWASH_TEXT_FG); - DrawTextEx (hdcTarget, m_szBackground, lstrlen(m_szBackground), &rText, DT_NOPREFIX | DT_LEFT, NULL); - - SetTextColor (hdcTarget, clrOld); - SelectObject (hdcTarget, hfOld); - } - - if (palOld) - SelectPalette (hdcTarget, palOld, FALSE); - - SelectObject (hdcTarget, bmpOld); - } - - DeleteDC (hdcTarget); - ReleaseDC (m_hBkg, hdc); - } - - InvalidateRect (m_hBkg, &rr, TRUE); - UpdateWindow (m_hBkg); -} - - -void WIZARD::Background_OnDestroy (void) -{ - if (m_bmpBackground) - { - DeleteObject (m_bmpBackground); - m_bmpBackground = NULL; - } -} - - -void WIZARD::Background_OnClose (void) -{ - LPWIZARD_STATE pState; - - if (m_hWnd && IsWindow (m_hWnd)) - { - PostMessage (m_hWnd, WM_COMMAND, MAKEWPARAM(IDCANCEL,BN_CLICKED), (LPARAM)GetDlgItem(m_hWnd,IDCANCEL)); - } - else if ((pState = FindState (m_stCurrent)) != NULL) - { - CallWindowProc ((WNDPROC)(pState->dlgproc), m_hBkg, WM_COMMAND, MAKEWPARAM(IDCANCEL,BN_CLICKED), 0); - } - else - { - ShowBackground (FALSE); - } -} - - -BOOL WIZARD::Background_OnPaint (void) -{ - if (!m_bmpBackground) - return FALSE; - - PAINTSTRUCT ps; - HDC hdcTarget; - if ((hdcTarget = BeginPaint (m_hBkg, &ps)) != NULL) - { - BITMAP bm; - GetObject (m_bmpBackground, sizeof(BITMAP), &bm); - - HDC hdcSource = CreateCompatibleDC (hdcTarget); - HBITMAP bmpOld = (HBITMAP)SelectObject (hdcSource, m_bmpBackground); - HPALETTE palOld = NULL; - if (m_palGraphic) - { - palOld = SelectPalette (hdcSource, m_palGraphic, FALSE); - RealizePalette (hdcTarget); - } - - BitBlt (hdcTarget, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY); - - if (palOld != NULL) - SelectPalette (hdcTarget, palOld, FALSE); - SelectObject (hdcSource, bmpOld); - DeleteDC (hdcSource); - - EndPaint (m_hBkg, &ps); - } - - return TRUE; -} - diff --git a/src/WINNT/afsapplib/al_wizard.h b/src/WINNT/afsapplib/al_wizard.h deleted file mode 100644 index 615b027a6..000000000 --- a/src/WINNT/afsapplib/al_wizard.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AL_WIZARD_H -#define AL_WIZARD_H - -#include -#include -#include -#include - -#ifndef EXPORTED -#define EXPORTED -#endif - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#define IDC_WIZARD 898 // WM_COMMAND,IDC_WIZARD: HIWORD(wp)=WIZARD_COMAMND - -typedef class EXPORTED WIZARD WIZARD, *LPWIZARD; - - -/* - * WIZARD CLASS _______________________________________________________________ - * - */ - -typedef enum - { - wcSTATE_ENTER, // now entering state (even w/o display) - wcSTATE_LEAVE, // now leaving state (even w/o display) - wcIS_STATE_DISABLED, // return TRUE if state disabled - } WIZARD_COMMAND; - -typedef struct - { - int st; // numeric state identifier - int idd; // dialog template for wizard pane - DLGPROC dlgproc; // dialog procedure for this state - LPARAM lp; // lparam for dialog initialization - } WIZARD_STATE, *LPWIZARD_STATE; - -#define BACK_BUTTON 0x0001 -#define NEXT_BUTTON 0x0002 - -class EXPORTED WIZARD - { - public: - - WIZARD (void); - ~WIZARD (void); - - static LPWIZARD GetWizard (HWND hWnd); - HWND GetWindow (void); - - void SetDialogTemplate (int iddTemplate, int idcLeftPane, int idcRightPane, int idcBack, int idcNext); - void SetGraphic (int idbGraphic16, int idbGraphic256); - void SetStates (LPWIZARD_STATE aStates, size_t cStates); - void SetGraphicCallback (void (CALLBACK *pfnCallback)(LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal)); - - int GetState (void); - void SetState (int stNew, BOOL fForce = FALSE); - BOOL Show (BOOL fShow = TRUE); - - void SetBackground (int iddBackground, BOOL fBlue = TRUE, DLGPROC dlgproc = NULL); - void SetBackgroundText (LPTSTR pszText, HFONT hfText = NULL); - void SetBackgroundText (int idsText, HFONT hfText = NULL); - BOOL ShowBackground (BOOL fShow = TRUE); - HWND GetBackgroundWindow (void); - - void EnableButton (int idcButton, BOOL fEnable); - void EnableButtons (DWORD dwButtonFlags = BACK_BUTTON | NEXT_BUTTON); - void SetButtonText (int idcButton, int idsText); - void SetDefaultControl (int idc); - - BOOL SendStateCommand (int st, WIZARD_COMMAND wc); - - private: - - void Refresh (DWORD dwRefFlags); - HWND GetRightHandWindow (void); - void GeneratePalette (RGBQUAD *pargb = NULL); - LPWIZARD_STATE FindState (int stFind); - - static BOOL CALLBACK Background_DlgProc (HWND hBkg, UINT msg, WPARAM wp, LPARAM lp); - static BOOL CALLBACK Background_PaintHook (HWND hBkg, UINT msg, WPARAM wp, LPARAM lp); - void Background_OnInitDialog (HWND hBkg); - void Background_OnSize (void); - void Background_OnDestroy (void); - void Background_OnClose (void); - BOOL Background_OnPaint (void); - - static BOOL CALLBACK Template_DlgProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); - static BOOL CALLBACK Template_LeftPaneHook (HWND hLHS, UINT msg, WPARAM wp, LPARAM lp); - BOOL Template_ForwardMessage (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); - void Template_OnInitDialog (HWND hWnd); - BOOL Template_OnPaintLHS (HWND hLHS); - - int m_iddTemplate; - int m_idcLeftPane; - int m_idcRightPane; - int m_idcBack; - int m_idcNext; - int m_idbGraphic16; - HBITMAP m_bmpGraphic16; - int m_idbGraphic256; - HBITMAP m_bmpGraphic256; - HPALETTE m_palGraphic; - LPWIZARD_STATE m_aStates; - size_t m_cStates; - int m_stCurrent; - BOOL m_fShowing; - HWND m_hWnd; - - int m_iddBackground; - BOOL m_fBlue; - HWND m_hBkg; - DLGPROC m_fnBackground; - TCHAR m_szBackground[ cchRESOURCE ]; - HBITMAP m_bmpBackground; - HFONT m_hfBackground; - HBITMAP m_bmpBuffer; - RECT m_rBuffer; - - void (CALLBACK *m_pfnCallback)(LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal); - }; - - -#endif - diff --git a/src/WINNT/afsapplib/checklist.cpp b/src/WINNT/afsapplib/checklist.cpp deleted file mode 100644 index 7dcd269a8..000000000 --- a/src/WINNT/afsapplib/checklist.cpp +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cxCHECKBOX (2+9+2) -#define cyCHECKBOX (2+9+2) - -#define cxAFTER_CHECKBOX 4 - - -#define LB_GETHIT (WM_USER+298) -#define LB_SETHIT (WM_USER+299) // int iItem=wp - -/* - * int LB_GetHit (HWND hList) - * void LB_SetHit (HWND hList, int iItem) - * - */ -#define LB_GetHit(_hList) \ - SendMessage(_hList,LB_GETHIT,(WPARAM)0,(LPARAM)0) -#define LB_SetHit(_hList,_ii) \ - SendMessage(_hList,LB_SETHIT,(WPARAM)_ii,(LPARAM)0) - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -LONG procListbox = 0; - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK CheckListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp); - -BOOL CALLBACK CheckList_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void CheckList_OnDrawItem (HWND hList, int id, LPDRAWITEMSTRUCT lpds); -void CheckList_OnDrawCheckbox (HWND hList, int id, LPDRAWITEMSTRUCT lpds); -void CheckList_OnDrawText (HWND hList, int id, LPDRAWITEMSTRUCT lpds); - -BOOL CheckList_OnHitTest (HWND hList, int id); - -BOOL CheckList_OnGetHit (HWND hList, WPARAM wp, LPARAM lp); -BOOL CheckList_OnSetHit (HWND hList, WPARAM wp, LPARAM lp); -BOOL CheckList_OnGetCheck (HWND hList, WPARAM wp, LPARAM lp); -BOOL CheckList_OnSetCheck (HWND hList, WPARAM wp, LPARAM lp); - -void CheckList_OnButtonDown (HWND hList); -void CheckList_OnButtonUp (HWND hList); -void CheckList_OnDoubleClick (HWND hList); -void CheckList_OnMouseMove (HWND hList); - -void CheckList_OnSetCheck_Selected (HWND hList, BOOL fCheck); - -void CheckList_RedrawCheck (HWND hList, int ii); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) CheckListReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL CheckListReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -BOOL RegisterCheckListClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - WNDCLASS wc; - GetClassInfo (THIS_HINST, TEXT("LISTBOX"), &wc); - procListbox = (LONG)wc.lpfnWndProc; - - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = (WNDPROC)CheckListProc; - wc.hInstance = THIS_HINST; - wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE (IDC_ARROW)); - wc.hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - wc.lpszClassName = WC_CHECKLIST; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - - return fRegistered; -} - - -BOOL IsCheckList (HWND hList) -{ - TCHAR szClassName[256]; - if (!GetClassName (hList, szClassName, 256)) - return FALSE; - - if (lstrcmp (szClassName, WC_CHECKLIST)) - return FALSE; - - return TRUE; -} - - -BOOL CALLBACK CheckListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_CREATE: - Subclass_AddHook (GetParent(hList), CheckList_DialogProc); - LB_SetHit (hList, -1); - break; - - case WM_DESTROY: - Subclass_RemoveHook (GetParent(hList), CheckList_DialogProc); - break; - - case WM_ENABLE: - RECT rClient; - GetClientRect (GetParent(hList), &rClient); - InvalidateRect (GetParent(hList), &rClient, FALSE); - UpdateWindow (GetParent(hList)); - break; - - case WM_LBUTTONDOWN: - CheckList_OnButtonDown (hList); - if (GetCapture() == hList) - { - if (procListbox) - { - ReleaseCapture (); - CallWindowProc ((WNDPROC)procListbox, hList, WM_LBUTTONDOWN, wp, lp); - CallWindowProc ((WNDPROC)procListbox, hList, WM_LBUTTONUP, wp, lp); - SetCapture (hList); - } - return TRUE; - } - break; - - case WM_LBUTTONUP: - CheckList_OnButtonUp (hList); - break; - - case WM_LBUTTONDBLCLK: - CheckList_OnDoubleClick (hList); - break; - - case WM_MOUSEMOVE: - CheckList_OnMouseMove (hList); - break; - - case LB_GETHIT: - return CheckList_OnGetHit (hList, wp, lp); - - case LB_SETHIT: - return CheckList_OnSetHit (hList, wp, lp); - - case LB_GETCHECK: - return CheckList_OnGetCheck (hList, wp, lp); - - case LB_SETCHECK: - return CheckList_OnSetCheck (hList, wp, lp); - } - - if (procListbox) - return CallWindowProc ((WNDPROC)procListbox, hList, msg, wp, lp); - else - return DefWindowProc (hList, msg, wp, lp); -} - - -BOOL CALLBACK CheckList_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID procOld = Subclass_FindNextHook (hDlg, CheckList_DialogProc); - - switch (msg) - { - case WM_MEASUREITEM: - LPMEASUREITEMSTRUCT lpms; - if ((lpms = (LPMEASUREITEMSTRUCT)lp) != NULL) - { - HDC hdc = GetDC (hDlg); - TEXTMETRIC tm; - GetTextMetrics (hdc, &tm); - ReleaseDC (hDlg, hdc); - lpms->itemHeight = max( tm.tmHeight, cyCHECKBOX ); - return TRUE; - } - break; - - case WM_DRAWITEM: - LPDRAWITEMSTRUCT lpds; - if ((lpds = (LPDRAWITEMSTRUCT)lp) != NULL) - { - CheckList_OnDrawItem (lpds->hwndItem, lpds->itemID, lpds); - return TRUE; - } - break; - - case WM_CTLCOLORLISTBOX: - if (IsCheckList ((HWND)lp)) - { - static COLORREF clrLast = (COLORREF)-1; - static HBRUSH hbrStatic = NULL; - COLORREF clrNew = GetSysColor (IsWindowEnabled((HWND)lp) ? COLOR_WINDOW : COLOR_BTNFACE); - if (clrNew != clrLast) - hbrStatic = CreateSolidBrush (clrLast = clrNew); - SetBkColor ((HDC)wp, clrLast); - return (BOOL)hbrStatic; - } - break; - } - - if (procOld) - return CallWindowProc ((WNDPROC)procOld, hDlg, msg, wp, lp); - else - return FALSE; -} - - -void CheckList_OnDrawItem (HWND hList, int id, LPDRAWITEMSTRUCT lpds) -{ - if (id >= 0) - { - CheckList_OnDrawCheckbox (hList, id, lpds); - CheckList_OnDrawText (hList, id, lpds); - } -} - - -void CheckList_OnDrawCheckbox (HWND hList, int id, LPDRAWITEMSTRUCT lpds) -{ - // Step 1: erase around the checkbox. - // - COLORREF clrBack = GetSysColor (COLOR_WINDOW); - if (lpds->itemState & ODS_DISABLED) - clrBack = GetSysColor (COLOR_BTNFACE); - - HBRUSH hbr = CreateSolidBrush (clrBack); - - POINT ptCheckbox; - ptCheckbox.x = lpds->rcItem.left; - ptCheckbox.y = lpds->rcItem.top + ((lpds->rcItem.bottom - lpds->rcItem.top) - cyCHECKBOX) /2; - - // step 1a: fill in above the checkbox - RECT rr; - rr.top = lpds->rcItem.top; - rr.left = lpds->rcItem.left; - rr.right = lpds->rcItem.left + cxCHECKBOX; - rr.bottom = ptCheckbox.y; - FillRect (lpds->hDC, &rr, hbr); - - // step 1b: fill in below the checkbox - rr.top = ptCheckbox.y + cyCHECKBOX; - rr.bottom = lpds->rcItem.bottom; - FillRect (lpds->hDC, &rr, hbr); - - // step 1c: fill in to the right of the checkbox - rr.top = lpds->rcItem.top; - rr.left = lpds->rcItem.left + cxCHECKBOX; - rr.right = lpds->rcItem.left + cxCHECKBOX + cxAFTER_CHECKBOX; - rr.bottom = lpds->rcItem.bottom; - FillRect (lpds->hDC, &rr, hbr); - - DeleteObject (hbr); - - // Step 2: draw the checkbox itself - // - HPEN hpOld; - HPEN hpNew; - - // step 2a: draw the btnshadow upper-left lines - hpNew = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_BTNSHADOW)); - hpOld = (HPEN)SelectObject (lpds->hDC, hpNew); - MoveToEx (lpds->hDC, ptCheckbox.x, ptCheckbox.y +cyCHECKBOX -2, NULL); - LineTo (lpds->hDC, ptCheckbox.x, ptCheckbox.y); - LineTo (lpds->hDC, ptCheckbox.x +cxCHECKBOX-1, ptCheckbox.y); - SelectObject (lpds->hDC, hpOld); - DeleteObject (hpNew); - - // step 2b: draw the black upper-left lines - hpNew = CreatePen (PS_SOLID, 1, RGB(0,0,0)); - hpOld = (HPEN)SelectObject (lpds->hDC, hpNew); - MoveToEx (lpds->hDC, ptCheckbox.x+1, ptCheckbox.y+cyCHECKBOX-3, NULL); - LineTo (lpds->hDC, ptCheckbox.x+1, ptCheckbox.y+1); - LineTo (lpds->hDC, ptCheckbox.x+cxCHECKBOX-2, ptCheckbox.y+1); - SelectObject (lpds->hDC, hpOld); - DeleteObject (hpNew); - - // step 2c: draw the btnface lower-right lines - hpNew = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_BTNFACE)); - hpOld = (HPEN)SelectObject (lpds->hDC, hpNew); - MoveToEx (lpds->hDC, ptCheckbox.x+1, ptCheckbox.y+cyCHECKBOX-2, NULL); - LineTo (lpds->hDC, ptCheckbox.x+cxCHECKBOX-2, ptCheckbox.y+cyCHECKBOX-2); - LineTo (lpds->hDC, ptCheckbox.x+cxCHECKBOX-2, ptCheckbox.y); - SelectObject (lpds->hDC, hpOld); - DeleteObject (hpNew); - - // step 2d: draw the btnhighlight lower-right lines - hpNew = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_BTNHIGHLIGHT)); - hpOld = (HPEN)SelectObject (lpds->hDC, hpNew); - MoveToEx (lpds->hDC, ptCheckbox.x, ptCheckbox.y+cyCHECKBOX-1, NULL); - LineTo (lpds->hDC, ptCheckbox.x+cxCHECKBOX-1, ptCheckbox.y+cyCHECKBOX-1); - LineTo (lpds->hDC, ptCheckbox.x+cxCHECKBOX-1, ptCheckbox.y-1); - SelectObject (lpds->hDC, hpOld); - DeleteObject (hpNew); - - // step 2e: draw the background field - // - BOOL fHit = CheckList_OnHitTest (hList, id); - BOOL fChecked = LB_GetCheck (hList, id); - - clrBack = GetSysColor (COLOR_WINDOW); - if ( (lpds->itemState & ODS_DISABLED) || - (fHit && (LB_GetHit(hList) == id))) - { - clrBack = GetSysColor (COLOR_BTNFACE); - } - - rr.top = ptCheckbox.y +2; - rr.left = ptCheckbox.x +2; - rr.right = ptCheckbox.x +cxCHECKBOX -2; - rr.bottom = ptCheckbox.y +cyCHECKBOX -2; - - hbr = CreateSolidBrush (clrBack); - FillRect (lpds->hDC, &rr, hbr); - DeleteObject (hbr); - - // step 2f: draw the checkmark (if appropriate) - // - if (fChecked) - { - hpNew = CreatePen (PS_SOLID, 1, (lpds->itemState & ODS_DISABLED) ? GetSysColor(COLOR_BTNSHADOW) : RGB(0,0,0)); - hpOld = (HPEN)SelectObject (lpds->hDC, hpNew); - - MoveToEx (lpds->hDC, ptCheckbox.x +3, ptCheckbox.y+5, NULL); - LineTo (lpds->hDC, ptCheckbox.x +5, ptCheckbox.y+7); - LineTo (lpds->hDC, ptCheckbox.x+10, ptCheckbox.y+2); - - MoveToEx (lpds->hDC, ptCheckbox.x +3, ptCheckbox.y+6, NULL); - LineTo (lpds->hDC, ptCheckbox.x +5, ptCheckbox.y+8); - LineTo (lpds->hDC, ptCheckbox.x+10, ptCheckbox.y+3); - - MoveToEx (lpds->hDC, ptCheckbox.x +3, ptCheckbox.y+7, NULL); - LineTo (lpds->hDC, ptCheckbox.x +5, ptCheckbox.y+9); - LineTo (lpds->hDC, ptCheckbox.x+10, ptCheckbox.y+4); - - SelectObject (lpds->hDC, hpOld); - DeleteObject (hpNew); - } -} - - -void CheckList_OnDrawText (HWND hList, int id, LPDRAWITEMSTRUCT lpds) -{ - // Step 1: erase around the text. - // - COLORREF clrBack = GetSysColor (COLOR_WINDOW); - COLORREF clrFore = GetSysColor (COLOR_WINDOWTEXT); - if (lpds->itemState & ODS_DISABLED) - { - clrBack = GetSysColor (COLOR_BTNFACE); - clrFore = GetSysColor (COLOR_GRAYTEXT); - } - else if (lpds->itemState & ODS_SELECTED) - { - clrBack = GetSysColor (COLOR_HIGHLIGHT); - clrFore = GetSysColor (COLOR_HIGHLIGHTTEXT); - } - - HBRUSH hbr = CreateSolidBrush (clrBack); - - // step 1a: find out how big the text is, and where it should go - // (remember to add a few spaces to the front, so there's a little bit - // of highlighted leading space before the text begins) - TCHAR szText[256] = TEXT(" "); - SendMessage (hList, LB_GETTEXT, (WPARAM)id, (LPARAM)&szText[lstrlen(szText)]); - - SIZE sText; - GetTextExtentPoint (lpds->hDC, szText, lstrlen(szText), &sText); - - POINT ptText; - ptText.x = lpds->rcItem.left + cxCHECKBOX + cxAFTER_CHECKBOX; - ptText.y = lpds->rcItem.top + ((lpds->rcItem.bottom - lpds->rcItem.top) - sText.cy) /2; - - // step 1b: fill in above the text - RECT rr; - rr.top = lpds->rcItem.top; - rr.left = ptText.x; - rr.right = lpds->rcItem.right; - rr.bottom = ptText.y; - FillRect (lpds->hDC, &rr, hbr); - - // step 1c: fill in below the text - rr.top = ptText.y; - rr.bottom = lpds->rcItem.bottom; - FillRect (lpds->hDC, &rr, hbr); - - // step 1d: fill in to the right of the text - rr.top = lpds->rcItem.top; - rr.left = ptText.x + sText.cx; - rr.right = lpds->rcItem.right; - rr.bottom = lpds->rcItem.bottom; - FillRect (lpds->hDC, &rr, hbr); - - DeleteObject (hbr); - - // Step 2: draw the text itself - // - rr.top = ptText.y; - rr.left = ptText.x; - rr.right = ptText.x + sText.cx; - rr.bottom = ptText.y + sText.cy; - - COLORREF clrBG = SetBkColor (lpds->hDC, clrBack); - COLORREF clrFG = SetTextColor (lpds->hDC, clrFore); - - DRAWTEXTPARAMS Params; - memset (&Params, 0x00, sizeof(DRAWTEXTPARAMS)); - Params.cbSize = sizeof(Params); - Params.iTabLength = 15; - - SetBkMode (lpds->hDC, OPAQUE); - DrawTextEx (lpds->hDC, szText, -1, &rr, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS | DT_NOPREFIX | DT_TABSTOP | DT_NOCLIP, &Params); - - SetTextColor (lpds->hDC, clrFG); - SetBkColor (lpds->hDC, clrBG); - - // Step 3: draw the focus rect (if appropriate) - // - if (lpds->itemState & ODS_FOCUS) - { - rr.top = lpds->rcItem.top; - rr.left = ptText.x; - rr.right = lpds->rcItem.right; - rr.bottom = lpds->rcItem.bottom; - DrawFocusRect (lpds->hDC, &rr); - } -} - - -BOOL CheckList_OnHitTest (HWND hList, int id) -{ - RECT rr; - SendMessage (hList, LB_GETITEMRECT, (WPARAM)id, (LPARAM)&rr); - rr.right = rr.left + cxCHECKBOX; - - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - ScreenToClient (hList, &pt); - - return PtInRect (&rr, pt); -} - - -BOOL CheckList_OnGetHit (HWND hList, WPARAM wp, LPARAM lp) -{ - return (BOOL)GetWindowLong (hList, GWL_USERDATA); -} - - -BOOL CheckList_OnSetHit (HWND hList, WPARAM wp, LPARAM lp) -{ - int iItem = (int)wp; - SetWindowLong (hList, GWL_USERDATA, iItem); - return TRUE; -} - - -BOOL CheckList_OnGetCheck (HWND hList, WPARAM wp, LPARAM lp) -{ - int iItem = (int)wp; - - return (BOOL)SendMessage (hList, LB_GETITEMDATA, (WPARAM)iItem, 0); -} - - -BOOL CheckList_OnSetCheck (HWND hList, WPARAM wp, LPARAM lp) -{ - int iItem = (int)wp; - BOOL fCheck = (BOOL)lp; - - SendMessage (hList, LB_SETITEMDATA, (WPARAM)iItem, (LPARAM)fCheck); - - CheckList_RedrawCheck (hList, iItem); - - return TRUE; -} - - -void CheckList_OnMouseMove (HWND hList) -{ - if (GetCapture() == hList) - { - int ii = LB_GetHit (hList); - if (ii != -1) - { - CheckList_RedrawCheck (hList, ii); - } - } -} - - -void CheckList_OnButtonDown (HWND hList) -{ - if (IsWindowEnabled (hList)) - { - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - ScreenToClient (hList, &pt); - - int ii = SendMessage (hList, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x,pt.y)); - if (HIWORD(ii) == 0) - { - BOOL fHit = CheckList_OnHitTest (hList, ii); - if (fHit) - { - SetCapture (hList); - LB_SetHit (hList, ii); - - CheckList_RedrawCheck (hList, ii); - } - } - } -} - - -void CheckList_OnButtonUp (HWND hList) -{ - if (GetCapture() == hList) - { - ReleaseCapture(); - - int ii = LB_GetHit (hList); - if (ii != -1) - { - LB_SetHit (hList, -1); - - BOOL fHit = CheckList_OnHitTest (hList, ii); - - if (!fHit) - CheckList_RedrawCheck (hList, ii); - else - { - BOOL fChecked = LB_GetCheck (hList, ii); - CheckList_OnSetCheck_Selected (hList, !fChecked); - } - } - } -} - - -void CheckList_OnDoubleClick (HWND hList) -{ - if (IsWindowEnabled (hList)) - { - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - ScreenToClient (hList, &pt); - - int ii = SendMessage (hList, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x,pt.y)); - if (HIWORD(ii) == 0) - { - BOOL fChecked = LB_GetCheck (hList, ii); - - CheckList_OnSetCheck_Selected (hList, !fChecked); - } - } -} - - -void CheckList_OnSetCheck_Selected (HWND hList, BOOL fCheck) -{ - static int *aSel = NULL; - static size_t cSel = 0; - - if (GetWindowLong(hList,GWL_STYLE) & LBS_MULTIPLESEL) - { - size_t cReq = SendMessage(hList,LB_GETSELCOUNT,0,0); - if ((cReq) && (cReq != LB_ERR) && REALLOC(aSel,cSel,cReq,4)) - { - size_t iMax = (size_t)SendMessage (hList, LB_GETSELITEMS, (WPARAM)cSel, (LPARAM)aSel); - if (iMax != LB_ERR) - { - for (size_t ii = 0; ii < iMax; ++ii) - { - LB_SetCheck (hList, aSel[ii], fCheck); - } - } - } - } - else // single-sel listbox - { - int ii = SendMessage (hList, LB_GETCURSEL, 0, 0); - if (ii != LB_ERR) - { - LB_SetCheck (hList, ii, fCheck); - } - } - - SendMessage (GetParent(hList), WM_COMMAND, MAKELONG(GetWindowLong(hList,GWL_ID),LBN_CLICKED), (LPARAM)hList); -} - - -void CheckList_RedrawCheck (HWND hList, int ii) -{ - RECT rr; - SendMessage (hList, LB_GETITEMRECT, (WPARAM)ii, (LPARAM)&rr); - rr.right = rr.left + cxCHECKBOX; - InvalidateRect (hList, &rr, TRUE); - UpdateWindow (hList); -} - diff --git a/src/WINNT/afsapplib/checklist.h b/src/WINNT/afsapplib/checklist.h deleted file mode 100644 index a914ed3ae..000000000 --- a/src/WINNT/afsapplib/checklist.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CHECKLIST_H -#define CHECKLIST_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef EXPORTED -#define EXPORTED -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -EXPORTED BOOL RegisterCheckListClass (void); - -#define WC_CHECKLIST TEXT("CheckList") - - -#define LB_GETCHECK (WM_USER+300) // int iItem=wp -#define LB_SETCHECK (WM_USER+301) // int iItem=wp, BOOL fChecked=lp - -#define LBN_CLICKED BN_CLICKED - - -/* - * BOOL LB_GetCheck (HWND hList, int iItem) - * void LB_SetCheck (HWND hList, int iItem, BOOL fCheck) - * - */ -#define LB_GetCheck(_hList,_ii) \ - SendMessage(_hList,LB_GETCHECK,(WPARAM)_ii,(LPARAM)0) -#define LB_SetCheck(_hList,_ii,_fCheck) \ - SendMessage(_hList,LB_SETCHECK,(WPARAM)_ii,(LPARAM)_fCheck) - - -#endif - diff --git a/src/WINNT/afsapplib/ctl_date.cpp b/src/WINNT/afsapplib/ctl_date.cpp deleted file mode 100644 index 1642608a5..000000000 --- a/src/WINNT/afsapplib/ctl_date.cpp +++ /dev/null @@ -1,713 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include // for GetRectInParent() -#include -#include -#include -#include - -#ifndef cchRESOURCE -#define cchRESOURCE 256 -#endif - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) DateReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL DateReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -/* - * DATE _______________________________________________________________________ - * - */ - -typedef struct - { - HWND hDate; - HWND hFirst; // one of hYear, hMonth, hDay - HWND hYear; - HWND hSep1; - HWND hMonth; - HWND hSep2; - HWND hDay; - HWND hSpinner; - HWND hSpinnerBuddy; - - WORD idYear; - WORD idMonth; - WORD idDay; - - SYSTEMTIME dateNow; // only wYear,wMonth,wDay fields are relevant - - DWORD dwFormat; // 0=M/D/Y, 1=D/M/Y, 2=Y/M/D - BOOL fCallingBack; - } DateInfo; - -static CRITICAL_SECTION csDate; -static DateInfo *aDate = NULL; -static size_t cDate = 0; - -#define cszDATECLASS TEXT("Date") - -BOOL CALLBACK DateProc (HWND hDate, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK DateEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK DateDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Date_SendCallback (DateInfo *pdi, WORD eln, LPARAM lp); - -void Date_OnCreate (DateInfo *pdi); -void Date_OnDestroy (DateInfo *pdi); -void Date_OnButtonDown (DateInfo *pdi, UINT msg, WPARAM wp, LPARAM lp); -BOOL Date_OnGetDate (DateInfo *pdi, WPARAM wp, LPARAM lp); -BOOL Date_OnSetDate (DateInfo *pdi, WPARAM wp, LPARAM lp); - -void Date_Edit_OnSetFocus (DateInfo *pdi, HWND hEdit); -void Date_Edit_OnUpdate (DateInfo *pdi, HWND hEdit); -void Date_Edit_SetText (DateInfo *pdi, HWND hEdit); - - -BOOL RegisterDateClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - InitializeCriticalSection (&csDate); - - WNDCLASS wc; - memset (&wc, 0x00, sizeof(wc)); - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = (WNDPROC)DateProc; - wc.hInstance = THIS_HINST; - wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE (IDC_ARROW)); - wc.hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - wc.lpszClassName = cszDATECLASS; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - - return fRegistered; -} - - -void Date_SendCallback (DateInfo *pdi, WORD eln, LPARAM lp) -{ - if (!pdi->fCallingBack) - { - pdi->fCallingBack = TRUE; - - SendMessage (GetParent (pdi->hDate), - WM_COMMAND, - MAKELONG ((WORD)GetWindowLong (pdi->hDate, GWL_ID), eln), - lp); - - pdi->fCallingBack = FALSE; - } -} - - -BOOL CALLBACK DateProc (HWND hDate, UINT msg, WPARAM wp, LPARAM lp) -{ - DateInfo *pdi = NULL; - - EnterCriticalSection (&csDate); - - if (msg == WM_CREATE) - { - for (size_t iDate = 0; iDate < cDate; ++iDate) - { - if (aDate[ iDate ].hDate == NULL) - break; - } - if (iDate >= cDate) - { - if (!REALLOC (aDate, cDate, 1+iDate, 4)) - return FALSE; - } - - memset (&aDate[ iDate ], 0x00, sizeof(DateInfo)); - aDate[ iDate ].hDate = hDate; - - pdi = &aDate[ iDate ]; - } - else - { - for (size_t iDate = 0; !pdi && iDate < cDate; ++iDate) - { - if (aDate[ iDate ].hDate == hDate) - pdi = &aDate[ iDate ]; - } - } - - LeaveCriticalSection (&csDate); - - if (pdi != NULL) - { - switch (msg) - { - case WM_CREATE: - Date_OnCreate (pdi); - break; - - case WM_DESTROY: - Date_OnDestroy (pdi); - break; - - case WM_RBUTTONDOWN: - case WM_LBUTTONDOWN: - Date_OnButtonDown (pdi, msg, wp, lp); - break; - - case WM_SETFOCUS: - PostMessage (GetParent(hDate), WM_NEXTDLGCTL, (WPARAM)pdi->hFirst, TRUE); - break; - - case WM_ENABLE: - EnableWindow (pdi->hYear, IsWindowEnabled (hDate)); - EnableWindow (pdi->hSep1, IsWindowEnabled (hDate)); - EnableWindow (pdi->hMonth, IsWindowEnabled (hDate)); - EnableWindow (pdi->hSep2, IsWindowEnabled (hDate)); - EnableWindow (pdi->hDay, IsWindowEnabled (hDate)); - - RECT rDate; - GetRectInParent (hDate, &rDate); - InvalidateRect (GetParent(hDate), &rDate, TRUE); - UpdateWindow (GetParent(hDate)); - break; - - case WM_SYSCHAR: - case WM_CHAR: - switch (wp) - { - case VK_UP: - PostMessage (GetParent(pdi->hSpinner), WM_VSCROLL, SB_LINEUP, (LPARAM)pdi->hSpinner); - break; - - case VK_DOWN: - PostMessage (GetParent(pdi->hSpinner), WM_VSCROLL, SB_LINEDOWN, (LPARAM)pdi->hSpinner); - break; - - case VK_PRIOR: - PostMessage (GetParent(pdi->hSpinner), WM_VSCROLL, SB_PAGEUP, (LPARAM)pdi->hSpinner); - break; - - case VK_NEXT: - PostMessage (GetParent(pdi->hSpinner), WM_VSCROLL, SB_PAGEDOWN, (LPARAM)pdi->hSpinner); - break; - - case VK_HOME: - PostMessage (GetParent(pdi->hSpinner), WM_VSCROLL, SB_TOP, (LPARAM)pdi->hSpinner); - break; - - case VK_END: - PostMessage (GetParent(pdi->hSpinner), WM_VSCROLL, SB_BOTTOM, (LPARAM)pdi->hSpinner); - break; - } - break; - - case DM_GETDATE: - return Date_OnGetDate (pdi, wp, lp); - - case DM_SETDATE: - return Date_OnSetDate (pdi, wp, lp); - } - } - - return DefWindowProc (hDate, msg, wp, lp); -} - - -void Date_OnCreate (DateInfo *pdi) -{ - Subclass_AddHook (GetParent(pdi->hDate), DateDlgProc); - - TCHAR szDateSep[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDATE, szDateSep, cchRESOURCE)) - lstrcpy (szDateSep, TEXT("/")); - - TCHAR szDateFormat[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_IDATE, szDateFormat, cchRESOURCE)) - pdi->dwFormat = 0; // 0=M/D/Y, 1=D/M/Y, 2=Y/M/D - else - pdi->dwFormat = atoi(szDateFormat); - - RECT rDate; - GetClientRect (pdi->hDate, &rDate); - - POINT ptDate = {0,0}; - ClientToScreen (pdi->hDate, &ptDate); - ScreenToClient (GetParent (pdi->hDate), &ptDate); - - SIZE s88; // size of widest likely double-digit number - SIZE sDateSep; // size of ":" - - HDC hdc = GetDC (GetParent (pdi->hDate)); - GetTextExtentPoint (hdc, TEXT("88"), lstrlen(TEXT("88")), &s88); - GetTextExtentPoint (hdc, szDateSep, lstrlen(szDateSep), &sDateSep); - sDateSep.cx ++; // we have to disable this; that draws slightly wider - ReleaseDC (GetParent (pdi->hDate), hdc); - - LONG cxNumbers = cxRECT(rDate) - GetSystemMetrics(SM_CXVSCROLL) - (sDateSep.cx)*2; - LONG cxYear = max( cxNumbers/2, s88.cx*2 ); - LONG cxMonth = max( cxNumbers/4, s88.cx ); - LONG cxDay = max( cxNumbers/4, s88.cx ); - - cxYear = min (cxYear, (LONG)( 1.2 * s88.cx * 2 )); - cxMonth = min (cxMonth, (LONG)( 1.2 * s88.cx )); - cxDay = min (cxDay, (LONG)( 1.2 * s88.cx )); // don't be TOO wide. - - pdi->idYear = 100+NextControlID (GetParent (pdi->hDate)); - pdi->idMonth = pdi->idYear +1; - pdi->idDay = pdi->idYear +2; - - LONG xx = ptDate.x; - LONG yy = ptDate.y; - LONG cy = cyRECT(rDate); - - LONG cx; - int id; - HWND hWnd; - int iiFirst; - - // 0=M/D/Y, 1=D/M/Y, 2=Y/M/D --so, create edit box: 0=M,1=D,2=Y - // - switch (pdi->dwFormat) - { - case 0: cx = cxMonth; id = pdi->idMonth; break; - case 1: cx = cxDay; id = pdi->idDay; break; - case 2: cx = cxYear; id = pdi->idYear; break; - } - - hWnd = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - xx, yy, cx, cy, - GetParent(pdi->hDate), - (HMENU)id, - THIS_HINST, - 0); - xx += cx; - - switch (pdi->dwFormat) - { - case 0: pdi->hMonth = hWnd; iiFirst = pdi->dateNow.wMonth; break; - case 1: pdi->hDay = hWnd; iiFirst = pdi->dateNow.wDay; break; - case 2: pdi->hYear = hWnd; iiFirst = pdi->dateNow.wYear; break; - } - pdi->hFirst = hWnd; - - // Create a separator - // - pdi->hSep1 = CreateWindow ( - TEXT("STATIC"), - szDateSep, - WS_CHILD | SS_CENTER, - xx, yy, sDateSep.cx, cy, - GetParent(pdi->hDate), - (HMENU)-1, - THIS_HINST, - 0); - xx += sDateSep.cx; - - // 0=M/D/Y, 1=D/M/Y, 2=Y/M/D --so, create edit box: 0=D,1=M,2=M - // - switch (pdi->dwFormat) - { - case 0: cx = cxDay; id = pdi->idDay; break; - case 1: cx = cxMonth; id = pdi->idMonth; break; - case 2: cx = cxMonth; id = pdi->idMonth; break; - } - - hWnd = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - xx, yy, cx, cy, - GetParent(pdi->hDate), - (HMENU)id, - THIS_HINST, - 0); - xx += cx; - - switch (pdi->dwFormat) - { - case 0: pdi->hDay = hWnd; break; - case 1: pdi->hMonth = hWnd; break; - case 2: pdi->hMonth = hWnd; break; - } - - // Create a separator - // - pdi->hSep2 = CreateWindow ( - TEXT("STATIC"), - szDateSep, - WS_CHILD | SS_CENTER, - xx, yy, sDateSep.cx, cy, - GetParent(pdi->hDate), - (HMENU)-1, - THIS_HINST, - 0); - xx += sDateSep.cx; - - // 0=M/D/Y, 1=D/M/Y, 2=Y/M/D --so, create edit box: 0=Y,1=Y,2=D - // - switch (pdi->dwFormat) - { - case 0: cx = cxYear; id = pdi->idYear; break; - case 1: cx = cxYear; id = pdi->idYear; break; - case 2: cx = cxDay; id = pdi->idDay; break; - } - - hWnd = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - xx, yy, cx, cy, - GetParent(pdi->hDate), - (HMENU)id, - THIS_HINST, - 0); - xx += cx; - - switch (pdi->dwFormat) - { - case 0: pdi->hYear = hWnd; break; - case 1: pdi->hYear = hWnd; break; - case 2: pdi->hDay = hWnd; break; - } - - // Subclass the edit controls - // - Subclass_AddHook (pdi->hYear, DateEditProc); - Subclass_AddHook (pdi->hMonth, DateEditProc); - Subclass_AddHook (pdi->hDay, DateEditProc); - - HFONT hf = (HFONT)SendMessage (GetParent (pdi->hDate), WM_GETFONT, 0, 0); - SendMessage (pdi->hYear, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pdi->hSep1, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pdi->hMonth, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pdi->hSep2, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pdi->hDay, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - - EnableWindow (pdi->hYear, IsWindowEnabled (pdi->hDate)); - EnableWindow (pdi->hSep1, IsWindowEnabled (pdi->hDate)); - EnableWindow (pdi->hMonth, IsWindowEnabled (pdi->hDate)); - EnableWindow (pdi->hSep2, IsWindowEnabled (pdi->hDate)); - EnableWindow (pdi->hDay, IsWindowEnabled (pdi->hDate)); - - ShowWindow (pdi->hYear, TRUE); - ShowWindow (pdi->hSep1, TRUE); - ShowWindow (pdi->hMonth, TRUE); - ShowWindow (pdi->hSep2, TRUE); - ShowWindow (pdi->hDay, TRUE); - - RECT rWindow; - GetWindowRect (pdi->hDate, &rWindow); - rWindow.right += (cxYear + cxMonth + cxDay + sDateSep.cx*2) - cxRECT(rDate); - - SetWindowPos (pdi->hDate, NULL, 0, 0, cxRECT(rWindow), cyRECT(rWindow), - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - RECT rSpinner; - GetRectInParent (pdi->hDate, &rSpinner); - rSpinner.left = rSpinner.right; - rSpinner.right = rSpinner.left + GetSystemMetrics (SM_CXVSCROLL); - rSpinner.bottom -= 2; // just like Win95 does - CreateSpinner (pdi->hFirst, 10, FALSE, 0, iiFirst, 3000, &rSpinner); - pdi->hSpinner = SP_GetSpinner (pdi->hFirst); - pdi->hSpinnerBuddy = pdi->hFirst; - - Date_Edit_SetText (pdi, pdi->hYear); - Date_Edit_SetText (pdi, pdi->hMonth); - Date_Edit_SetText (pdi, pdi->hDay); - Date_Edit_OnSetFocus (pdi, pdi->hFirst); -} - - -void Date_OnDestroy (DateInfo *pdi) -{ - Subclass_RemoveHook (GetParent (pdi->hDate), DateDlgProc); - pdi->hDate = NULL; -} - - -void Date_OnButtonDown (DateInfo *pdi, UINT msg, WPARAM wp, LPARAM lp) -{ - DWORD dw = GetMessagePos(); - POINT pt; - pt.x = LOWORD(dw); - pt.y = HIWORD(dw); // in screen coordinates - - RECT rTarget; - HWND hTarget = 0; - - GetWindowRect (pdi->hYear, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pdi->hYear; - - GetWindowRect (pdi->hMonth, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pdi->hMonth; - - GetWindowRect (pdi->hDay, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pdi->hDay; - - if (hTarget != 0) - { - PostMessage (hTarget, msg, wp, lp); - } -} - - -BOOL Date_OnGetDate (DateInfo *pdi, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *pdate = (SYSTEMTIME*)lp; - pdate->wYear = pdi->dateNow.wYear; - pdate->wMonth = pdi->dateNow.wMonth; - pdate->wDayOfWeek = pdi->dateNow.wDayOfWeek; - pdate->wDay = pdi->dateNow.wDay; - return TRUE; -} - - -BOOL Date_OnSetDate (DateInfo *pdi, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *pdate = (SYSTEMTIME*)lp; - pdi->dateNow = *pdate; - Date_Edit_SetText (pdi, pdi->hYear); - Date_Edit_SetText (pdi, pdi->hMonth); - Date_Edit_SetText (pdi, pdi->hDay); - return TRUE; -} - - -BOOL CALLBACK DateDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, DateDlgProc); - size_t iDate; - - switch (msg) - { - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: - for (iDate = 0; iDate < cDate; ++iDate) - { - if (aDate[ iDate ].hDate == NULL) - continue; - if ( (aDate[ iDate ].hYear == (HWND)lp) || - (aDate[ iDate ].hSep1 == (HWND)lp) || - (aDate[ iDate ].hMonth == (HWND)lp) || - (aDate[ iDate ].hSep2 == (HWND)lp) || - (aDate[ iDate ].hDay == (HWND)lp) ) - { - COLORREF clr; - if (IsWindowEnabled (aDate[ iDate ].hDate)) - clr = GetSysColor (COLOR_WINDOW); - else - clr = GetSysColor (COLOR_BTNFACE); - SetBkColor ((HDC)wp, clr); - return (BOOL)CreateSolidBrush (clr); - } - } - break; - - case WM_COMMAND: - for (iDate = 0; iDate < cDate; ++iDate) - { - if (aDate[ iDate ].hDate == NULL) - continue; - if ( (aDate[ iDate ].idYear == LOWORD(wp)) || - (aDate[ iDate ].idMonth == LOWORD(wp)) || - (aDate[ iDate ].idDay == LOWORD(wp)) ) - { - if (HIWORD(wp) == SPN_UPDATE) - { - Date_Edit_OnUpdate (&aDate[ iDate ], GetDlgItem(hDlg,LOWORD(wp))); - } - break; - } - } - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); - else - return DefWindowProc (hDlg, msg, wp, lp); -} - - -BOOL CALLBACK DateEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp) -{ - DateInfo *pdi = NULL; - - EnterCriticalSection (&csDate); - - for (size_t iDate = 0; !pdi && iDate < cDate; ++iDate) - { - if ( (aDate[ iDate ].hYear == hEdit) || - (aDate[ iDate ].hMonth == hEdit) || - (aDate[ iDate ].hDay == hEdit) ) - { - pdi = &aDate[ iDate ]; - } - } - - LeaveCriticalSection (&csDate); - - if (pdi) - { - switch (msg) - { - case WM_SETFOCUS: - Date_Edit_OnSetFocus (pdi, hEdit); - break; - } - } - - PVOID oldProc = Subclass_FindNextHook (hEdit, DateEditProc); - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hEdit, msg, wp, lp); - else - return DefWindowProc (hEdit, msg, wp, lp); -} - - -void Date_Edit_OnSetFocus (DateInfo *pdi, HWND hEdit) -{ - DWORD dwMin; - DWORD dwNow; - DWORD dwMax; - - if (hEdit == pdi->hYear) - { - dwMin = 1970; - dwNow = pdi->dateNow.wYear; - dwMax = 2999; - } - else if (hEdit == pdi->hMonth) - { - dwMin = 1; - dwNow = pdi->dateNow.wMonth; - dwMax = 12; - } - else // (hEdit == pdi->hDay) - { - dwMin = 1; - dwNow = pdi->dateNow.wDay; - dwMax = 31; - } - - if (pdi->hSpinnerBuddy != hEdit) - { - SP_SetBuddy (pdi->hSpinnerBuddy, hEdit, FALSE); - pdi->hSpinnerBuddy = hEdit; - } - - SP_SetRange (hEdit, dwMin, dwMax); - SP_SetPos (hEdit, dwNow); - - SendMessage (hEdit, EM_SETSEL, (WPARAM)0, (LPARAM)-1); // select all -} - - -void Date_Edit_OnUpdate (DateInfo *pdi, HWND hEdit) -{ - TCHAR szText[ cchRESOURCE ]; - - if (hEdit == pdi->hYear) - { - GetWindowText (pdi->hYear, szText, 256); - pdi->dateNow.wYear = (WORD)atol (szText); - } - - if (hEdit == pdi->hMonth) - { - GetWindowText (pdi->hMonth, szText, 256); - pdi->dateNow.wMonth = (WORD)atol (szText); - } - - if (hEdit == pdi->hDay) - { - GetWindowText (pdi->hDay, szText, 256); - pdi->dateNow.wDay = (WORD)atol (szText); - } - - SYSTEMTIME st = pdi->dateNow; - Date_SendCallback (pdi, DN_UPDATE, (LPARAM)&st); -} - - -void Date_Edit_SetText (DateInfo *pdi, HWND hEdit) -{ - DWORD dwNow; - - if (hEdit == pdi->hYear) - dwNow = pdi->dateNow.wYear; - else if (hEdit == pdi->hMonth) - dwNow = pdi->dateNow.wMonth; - else if (hEdit == pdi->hDay) - dwNow = pdi->dateNow.wDay; - - if (pdi->hSpinnerBuddy == hEdit) - { - SP_SetPos (hEdit, dwNow); - } - else - { - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%lu"), dwNow); - SetWindowText (hEdit, szText); - } -} - diff --git a/src/WINNT/afsapplib/ctl_date.h b/src/WINNT/afsapplib/ctl_date.h deleted file mode 100644 index 58aee0a45..000000000 --- a/src/WINNT/afsapplib/ctl_date.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CTL_DATE_H -#define CTL_DATE_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef limit -#define limit(_a,_x,_b) min( max( (_x), (_a) ), (_b) ) -#endif - -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (((_x)>=(_a)) && ((_x)<=(_b))) ? TRUE : FALSE ) -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL RegisterDateClass (void); - -#define DM_GETDATE (WM_USER+313) // SYSTEMTIME *pTime = lp; -#define DM_SETDATE (WM_USER+314) // SYSTEMTIME *pTime = lp; - -#define DN_CHANGE 0x1005 // SYSTEMTIME *pTime = lp; -#define DN_UPDATE 0x1006 // SYSTEMTIME *pTime = lp; - -/* - * void DA_GetDate (HWND hDate, SYSTEMTIME *pDate) - * void DA_SetDate (HWND hDate, SYSTEMTIME *pDate) - * - */ -#define DA_GetDate(_hdate,_pDate) \ - SendMessage(_hdate,DM_GETDATE,(WPARAM)0,(LPARAM)_pDate) -#define DA_SetDate(_hdate,_pDate) \ - SendMessage(_hdate,DM_SETDATE,(WPARAM)0,(LPARAM)_pDate) - - -#endif - diff --git a/src/WINNT/afsapplib/ctl_elapsed.cpp b/src/WINNT/afsapplib/ctl_elapsed.cpp deleted file mode 100644 index 319a24d68..000000000 --- a/src/WINNT/afsapplib/ctl_elapsed.cpp +++ /dev/null @@ -1,753 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include // for GetRectInParent() -#include -#include -#include -#include - -#ifndef cchRESOURCE -#define cchRESOURCE 256 -#endif - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) ElapsedReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL ElapsedReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - - -/* - * ELAPSEDS ___________________________________________________________________ - * - */ - -typedef struct - { - HWND hElapsed; - HWND hHours; - HWND hSep1; - HWND hMinutes; - HWND hSep2; - HWND hSeconds; - HWND hSpinner; - HWND hSpinnerBuddy; - - WORD idHours; - WORD idMinutes; - WORD idSeconds; - - SYSTEMTIME timeMin; // only hour, minute, second fields are relevant - SYSTEMTIME timeNow; // only hour, minute, second fields are relevant - SYSTEMTIME timeMax; // only hour, minute, second fields are relevant - - BOOL fCallingBack; - BOOL fCanCallBack; - } ElapsedInfo; - -static CRITICAL_SECTION csElapsed; -static ElapsedInfo *aElapsed = NULL; -static size_t cElapsed = 0; - -#define cszELAPSEDCLASS TEXT("Elapsed") - -BOOL CALLBACK ElapsedProc (HWND hElapsed, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK ElapsedEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK ElapsedDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Elapsed_SendCallback (ElapsedInfo *pei, WORD eln, LPARAM lp); - -void Elapsed_OnCreate (ElapsedInfo *psi); -void Elapsed_OnDestroy (ElapsedInfo *psi); -void Elapsed_OnButtonDown (ElapsedInfo *pei, UINT msg, WPARAM wp, LPARAM lp); -BOOL Elapsed_OnGetRange (ElapsedInfo *psi, WPARAM wp, LPARAM lp); -BOOL Elapsed_OnSetRange (ElapsedInfo *psi, WPARAM wp, LPARAM lp); -BOOL Elapsed_OnGetTime (ElapsedInfo *psi, WPARAM wp, LPARAM lp); -BOOL Elapsed_OnSetTime (ElapsedInfo *psi, WPARAM wp, LPARAM lp); - -void Elapsed_Edit_OnSetFocus (ElapsedInfo *pei, HWND hEdit); -void Elapsed_Edit_GetSpinnerRange (ElapsedInfo *pei, HWND hEdit, DWORD *pdwMin, DWORD *pdwPos, DWORD *pdwMax); -void Elapsed_Edit_OnUpdate (ElapsedInfo *pei, HWND hEdit, DWORD dwNew); -void Elapsed_Edit_OnEnforceRange (ElapsedInfo *pei, HWND hEdit); -void Elapsed_Edit_SetText (ElapsedInfo *pei, HWND hEdit); - - -BOOL RegisterElapsedClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - InitializeCriticalSection (&csElapsed); - - WNDCLASS wc; - memset (&wc, 0x00, sizeof(wc)); - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = (WNDPROC)ElapsedProc; - wc.hInstance = THIS_HINST; - wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE (IDC_ARROW)); - wc.hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - wc.lpszClassName = cszELAPSEDCLASS; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - - return fRegistered; -} - - -void Elapsed_SendCallback (ElapsedInfo *pei, WORD eln, LPARAM lp) -{ - if ((pei->fCanCallBack == TRUE) && !pei->fCallingBack) - { - pei->fCallingBack = TRUE; - - SendMessage (GetParent (pei->hElapsed), - WM_COMMAND, - MAKELONG ((WORD)GetWindowLong (pei->hElapsed, GWL_ID), eln), - lp); - - pei->fCallingBack = FALSE; - } -} - - -BOOL CALLBACK ElapsedProc (HWND hElapsed, UINT msg, WPARAM wp, LPARAM lp) -{ - ElapsedInfo *pei = NULL; - - EnterCriticalSection (&csElapsed); - - if (msg == WM_CREATE) - { - for (size_t iElapsed = 0; iElapsed < cElapsed; ++iElapsed) - { - if (aElapsed[ iElapsed ].hElapsed == NULL) - break; - } - if (iElapsed >= cElapsed) - { - if (!REALLOC (aElapsed, cElapsed, 1+iElapsed, 4)) - return FALSE; - } - - memset (&aElapsed[ iElapsed ], 0x00, sizeof(ElapsedInfo)); - aElapsed[ iElapsed ].hElapsed = hElapsed; - - pei = &aElapsed[ iElapsed ]; - } - else - { - for (size_t iElapsed = 0; !pei && iElapsed < cElapsed; ++iElapsed) - { - if (aElapsed[ iElapsed ].hElapsed == hElapsed) - pei = &aElapsed[ iElapsed ]; - } - } - - LeaveCriticalSection (&csElapsed); - - if (pei != NULL) - { - switch (msg) - { - case WM_CREATE: - Elapsed_OnCreate (pei); - break; - - case WM_DESTROY: - Elapsed_OnDestroy (pei); - break; - - case WM_RBUTTONDOWN: - case WM_LBUTTONDOWN: - Elapsed_OnButtonDown (pei, msg, wp, lp); - break; - - case WM_SETFOCUS: - PostMessage (GetParent(hElapsed), WM_NEXTDLGCTL, (WPARAM)pei->hHours, TRUE); - break; - - case WM_ENABLE: - EnableWindow (pei->hHours, IsWindowEnabled (hElapsed)); - EnableWindow (pei->hSep1, IsWindowEnabled (hElapsed)); - EnableWindow (pei->hMinutes, IsWindowEnabled (hElapsed)); - EnableWindow (pei->hSep2, IsWindowEnabled (hElapsed)); - EnableWindow (pei->hSeconds, IsWindowEnabled (hElapsed)); - EnableWindow (pei->hSpinner, IsWindowEnabled (hElapsed)); - - RECT rElapsed; - GetRectInParent (hElapsed, &rElapsed); - InvalidateRect (GetParent(hElapsed), &rElapsed, TRUE); - UpdateWindow (GetParent(hElapsed)); - break; - - case WM_SYSCHAR: - case WM_CHAR: - switch (wp) - { - case VK_UP: - PostMessage (GetParent(pei->hSpinner), WM_VSCROLL, SB_LINEUP, (LPARAM)pei->hSpinner); - break; - - case VK_DOWN: - PostMessage (GetParent(pei->hSpinner), WM_VSCROLL, SB_LINEDOWN, (LPARAM)pei->hSpinner); - break; - - case VK_PRIOR: - PostMessage (GetParent(pei->hSpinner), WM_VSCROLL, SB_PAGEUP, (LPARAM)pei->hSpinner); - break; - - case VK_NEXT: - PostMessage (GetParent(pei->hSpinner), WM_VSCROLL, SB_PAGEDOWN, (LPARAM)pei->hSpinner); - break; - - case VK_HOME: - PostMessage (GetParent(pei->hSpinner), WM_VSCROLL, SB_TOP, (LPARAM)pei->hSpinner); - break; - - case VK_END: - PostMessage (GetParent(pei->hSpinner), WM_VSCROLL, SB_BOTTOM, (LPARAM)pei->hSpinner); - break; - } - break; - - case ELM_GETRANGE: - return Elapsed_OnGetRange (pei, wp, lp); - - case ELM_SETRANGE: - return Elapsed_OnSetRange (pei, wp, lp); - - case ELM_GETTIME: - return Elapsed_OnGetTime (pei, wp, lp); - - case ELM_SETTIME: - return Elapsed_OnSetTime (pei, wp, lp); - } - } - - return DefWindowProc (hElapsed, msg, wp, lp); -} - - -void Elapsed_OnCreate (ElapsedInfo *pei) -{ - Subclass_AddHook (GetParent(pei->hElapsed), ElapsedDlgProc); - - TCHAR szTimeSep[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIME, szTimeSep, cchRESOURCE)) - lstrcpy (szTimeSep, TEXT(":")); - - RECT rElapsed; - GetClientRect (pei->hElapsed, &rElapsed); - - POINT ptElapsed = {0,0}; - ClientToScreen (pei->hElapsed, &ptElapsed); - ScreenToClient (GetParent (pei->hElapsed), &ptElapsed); - - SIZE s88; // size of widest likely double-digit number - SIZE s888; // maximum width to which we'll go for second- and minute- fields - SIZE sTimeSep; // size of ":" - - HDC hdc = GetDC (GetParent (pei->hElapsed)); - GetTextExtentPoint (hdc, TEXT("88"), lstrlen(TEXT("88")), &s88); - GetTextExtentPoint (hdc, szTimeSep, lstrlen(szTimeSep), &sTimeSep); - ReleaseDC (GetParent (pei->hElapsed), hdc); - - s888 = s88; - s888.cx = (LONG)( (double)(s88.cx) * 1.2 ); - - LONG cxNumbers = cxRECT(rElapsed) - (2 * sTimeSep.cx) - GetSystemMetrics (SM_CXVSCROLL); - LONG cxSeconds = min( max( cxNumbers/3, s88.cx ), s888.cx ); - LONG cxMinutes = min( max( cxNumbers/3, s88.cx ), s888.cx ); - LONG cxHours = cxNumbers - cxSeconds - cxMinutes; - LONG yy = ptElapsed.y; - LONG cy = cyRECT(rElapsed); - - pei->idHours = 100+NextControlID (GetParent (pei->hElapsed)); - pei->hHours = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER, - ptElapsed.x, yy, cxHours, cy, - GetParent(pei->hElapsed), - (HMENU)pei->idHours, - THIS_HINST, - 0); - - pei->hSep1 = CreateWindow ( - TEXT("STATIC"), - szTimeSep, - WS_CHILD, - ptElapsed.x + cxHours, yy, sTimeSep.cx, cy, - GetParent(pei->hElapsed), - (HMENU)-1, - THIS_HINST, - 0); - - pei->idMinutes = 100+NextControlID (GetParent (pei->hElapsed)); - pei->hMinutes = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER, - ptElapsed.x + cxHours + sTimeSep.cx, yy, cxMinutes, cy, - GetParent(pei->hElapsed), - (HMENU)pei->idMinutes, - THIS_HINST, - 0); - - pei->hSep2 = CreateWindow ( - TEXT("STATIC"), - szTimeSep, - WS_CHILD, - ptElapsed.x + cxHours + cxMinutes + sTimeSep.cx, yy, sTimeSep.cx, cy, - GetParent(pei->hElapsed), - (HMENU)-1, - THIS_HINST, - 0); - - pei->idSeconds = 100+NextControlID (GetParent (pei->hElapsed)); - pei->hSeconds = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER, - ptElapsed.x + cxHours + cxMinutes + 2 * sTimeSep.cx, yy, cxSeconds, cy, - GetParent(pei->hElapsed), - (HMENU)pei->idSeconds, - THIS_HINST, - 0); - - Subclass_AddHook (pei->hHours, ElapsedEditProc); - Subclass_AddHook (pei->hMinutes, ElapsedEditProc); - Subclass_AddHook (pei->hSeconds, ElapsedEditProc); - - HFONT hf = (HFONT)SendMessage (GetParent (pei->hElapsed), WM_GETFONT, 0, 0); - SendMessage (pei->hHours, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pei->hSep1, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pei->hMinutes, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pei->hSep2, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pei->hSeconds, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - - EnableWindow (pei->hHours, IsWindowEnabled (pei->hElapsed)); - EnableWindow (pei->hSep1, IsWindowEnabled (pei->hElapsed)); - EnableWindow (pei->hMinutes, IsWindowEnabled (pei->hElapsed)); - EnableWindow (pei->hSep2, IsWindowEnabled (pei->hElapsed)); - EnableWindow (pei->hSeconds, IsWindowEnabled (pei->hElapsed)); - - ShowWindow (pei->hHours, TRUE); - ShowWindow (pei->hSep1, TRUE); - ShowWindow (pei->hMinutes, TRUE); - ShowWindow (pei->hSep2, TRUE); - ShowWindow (pei->hSeconds, TRUE); - - RECT rWindow; - GetWindowRect (pei->hElapsed, &rWindow); - rWindow.right += (cxHours + cxMinutes + cxSeconds + 2 * sTimeSep.cx) - cxRECT(rElapsed); - - SetWindowPos (pei->hElapsed, NULL, 0, 0, cxRECT(rWindow), cyRECT(rWindow), - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - SET_ELAPSED_TIME(&pei->timeMin, 0, 0, 0); - SET_ELAPSED_TIME(&pei->timeMax, 24, 0, 0); - - Elapsed_Edit_OnEnforceRange (pei, pei->hHours); - Elapsed_Edit_OnEnforceRange (pei, pei->hMinutes); - Elapsed_Edit_OnEnforceRange (pei, pei->hSeconds); - - Elapsed_Edit_OnSetFocus (pei, pei->hHours); - - pei->fCanCallBack = TRUE; -} - - -void Elapsed_OnDestroy (ElapsedInfo *pei) -{ - Subclass_RemoveHook (GetParent(pei->hElapsed), ElapsedDlgProc); - pei->hElapsed = NULL; -} - - -void Elapsed_OnButtonDown (ElapsedInfo *pei, UINT msg, WPARAM wp, LPARAM lp) -{ - DWORD dw = GetMessagePos(); - POINT pt; - pt.x = LOWORD(dw); - pt.y = HIWORD(dw); // in screen coordinates - - RECT rTarget; - HWND hTarget = 0; - - GetWindowRect (pei->hHours, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pei->hHours; - - GetWindowRect (pei->hMinutes, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pei->hMinutes; - - GetWindowRect (pei->hSeconds, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pei->hSeconds; - - if (hTarget != 0) - { - PostMessage (hTarget, msg, wp, lp); - } -} - - -BOOL Elapsed_OnGetRange (ElapsedInfo *pei, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *ptimeMin = (SYSTEMTIME*)wp; - SYSTEMTIME *ptimeMax = (SYSTEMTIME*)lp; - - *ptimeMin = pei->timeMin; - *ptimeMax = pei->timeMax; - return TRUE; -} - - -BOOL Elapsed_OnSetRange (ElapsedInfo *pei, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *ptimeMin = (SYSTEMTIME*)wp; - SYSTEMTIME *ptimeMax = (SYSTEMTIME*)lp; - - pei->timeMin = *ptimeMin; - pei->timeMax = *ptimeMax; - - Elapsed_Edit_OnEnforceRange (pei, pei->hHours); - Elapsed_Edit_OnEnforceRange (pei, pei->hMinutes); - Elapsed_Edit_OnEnforceRange (pei, pei->hSeconds); - - return TRUE; -} - - -BOOL Elapsed_OnGetTime (ElapsedInfo *pei, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *ptime = (SYSTEMTIME*)lp; - *ptime = pei->timeNow; - return TRUE; -} - - -BOOL Elapsed_OnSetTime (ElapsedInfo *pei, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *ptime = (SYSTEMTIME*)lp; - pei->timeNow = *ptime; - Elapsed_Edit_SetText (pei, pei->hHours); - Elapsed_Edit_SetText (pei, pei->hMinutes); - Elapsed_Edit_SetText (pei, pei->hSeconds); - return TRUE; -} - - -BOOL CALLBACK ElapsedDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, ElapsedDlgProc); - size_t iElapsed; - - switch (msg) - { - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: - for (iElapsed = 0; iElapsed < cElapsed; ++iElapsed) - { - if (aElapsed[ iElapsed ].hElapsed == NULL) - continue; - if ( (aElapsed[ iElapsed ].hHours == (HWND)lp) || - (aElapsed[ iElapsed ].hSep1 == (HWND)lp) || - (aElapsed[ iElapsed ].hMinutes == (HWND)lp) || - (aElapsed[ iElapsed ].hSep2 == (HWND)lp) || - (aElapsed[ iElapsed ].hSeconds == (HWND)lp) ) - { - COLORREF clr; - if (IsWindowEnabled (aElapsed[ iElapsed ].hElapsed)) - clr = GetSysColor (COLOR_WINDOW); - else - clr = GetSysColor (COLOR_BTNFACE); - SetBkColor ((HDC)wp, clr); - return (BOOL)CreateSolidBrush (clr); - } - } - break; - - case WM_COMMAND: - for (iElapsed = 0; iElapsed < cElapsed; ++iElapsed) - { - if (aElapsed[ iElapsed ].hElapsed == NULL) - continue; - if ( (aElapsed[ iElapsed ].idHours == LOWORD(wp)) || - (aElapsed[ iElapsed ].idMinutes == LOWORD(wp)) || - (aElapsed[ iElapsed ].idSeconds == LOWORD(wp)) ) - { - if (HIWORD(wp) == SPN_UPDATE) - { - Elapsed_Edit_OnUpdate (&aElapsed[ iElapsed ], GetDlgItem (hDlg, LOWORD(wp)), (DWORD)lp); - } - break; - } - } - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); - else - return DefWindowProc (hDlg, msg, wp, lp); -} - - -BOOL CALLBACK ElapsedEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp) -{ - ElapsedInfo *pei = NULL; - - EnterCriticalSection (&csElapsed); - - for (size_t iElapsed = 0; !pei && iElapsed < cElapsed; ++iElapsed) - { - if ( (aElapsed[ iElapsed ].hHours == hEdit) || - (aElapsed[ iElapsed ].hMinutes == hEdit) || - (aElapsed[ iElapsed ].hSeconds == hEdit) ) - { - pei = &aElapsed[ iElapsed ]; - } - } - - LeaveCriticalSection (&csElapsed); - - if (pei) - { - switch (msg) - { - case WM_SETFOCUS: - Elapsed_Edit_OnSetFocus (pei, hEdit); - break; - } - } - - PVOID oldProc = Subclass_FindNextHook (hEdit, ElapsedEditProc); - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hEdit, msg, wp, lp); - else - return DefWindowProc (hEdit, msg, wp, lp); -} - - -void Elapsed_Edit_OnSetFocus (ElapsedInfo *pei, HWND hEdit) -{ - pei->fCanCallBack --; - - RECT rSpinner; - GetRectInParent (pei->hElapsed, &rSpinner); - rSpinner.left = rSpinner.right; - rSpinner.right = rSpinner.left + GetSystemMetrics (SM_CXVSCROLL); - rSpinner.bottom -= 2; // just like Win95 does - - DWORD dwMin; - DWORD dwPos; - DWORD dwMax; - Elapsed_Edit_GetSpinnerRange (pei, hEdit, &dwMin, &dwPos, &dwMax); - - CreateSpinner (hEdit, 10, FALSE, dwMin, dwPos, dwMax, &rSpinner); - if (pei->hSpinner) - DestroyWindow (pei->hSpinner); - - if (hEdit == pei->hHours) - SP_SetFormat (hEdit, TEXT("%lu")); - else - SP_SetFormat (hEdit, TEXT("%02lu")); - - pei->hSpinner = SP_GetSpinner (hEdit); - pei->hSpinnerBuddy = hEdit; - - SendMessage (hEdit, EM_SETSEL, (WPARAM)0, (LPARAM)-1); // select all - - pei->fCanCallBack ++; -} - - -void Elapsed_Edit_GetSpinnerRange (ElapsedInfo *pei, HWND hEdit, DWORD *pdwMin, DWORD *pdwNow, DWORD *pdwMax) -{ - if (hEdit == pei->hHours) - { - *pdwMin = pei->timeMin.wHour + pei->timeMin.wDay * 24; - *pdwNow = pei->timeNow.wHour + pei->timeNow.wDay * 24; - *pdwMax = pei->timeMax.wHour + pei->timeMax.wDay * 24; - } - else if (hEdit == pei->hMinutes) - { - if ( (pei->timeNow.wDay == pei->timeMin.wDay) && - (pei->timeNow.wHour == pei->timeMin.wHour) ) - *pdwMin = pei->timeMin.wMinute; - else - *pdwMin = 0; - - *pdwNow = pei->timeNow.wMinute; - - if ( (pei->timeNow.wDay == pei->timeMax.wDay) && - (pei->timeNow.wHour == pei->timeMax.wHour) ) - *pdwMax = pei->timeMax.wMinute; - else - *pdwMax = 59; - } - else if (hEdit == pei->hSeconds) - { - if ( (pei->timeNow.wDay == pei->timeMin.wDay) && - (pei->timeNow.wHour == pei->timeMin.wHour) && - (pei->timeNow.wMinute == pei->timeMin.wMinute) ) - *pdwMin = pei->timeMin.wSecond; - else - *pdwMin = 0; - - *pdwNow = pei->timeNow.wSecond; - - if ( (pei->timeNow.wDay == pei->timeMax.wDay) && - (pei->timeNow.wHour == pei->timeMax.wHour) && - (pei->timeNow.wMinute == pei->timeMax.wMinute) ) - *pdwMax = pei->timeMax.wSecond; - else - *pdwMax = 59; - } -} - - -void Elapsed_Edit_OnUpdate (ElapsedInfo *pei, HWND hEdit, DWORD dwNew) -{ - DWORD dwMin; - DWORD dwNow; - DWORD dwMax; - - Elapsed_Edit_GetSpinnerRange (pei, hEdit, &dwMin, &dwNow, &dwMax); - - dwNow = limit( dwMin, dwNew, dwMax ); - - if (hEdit == pei->hHours) - { - pei->timeNow.wDay = (WORD)dwNow / 24; - pei->timeNow.wHour = (WORD)dwNow % 24; - Elapsed_Edit_OnEnforceRange (pei, pei->hMinutes); - Elapsed_Edit_OnEnforceRange (pei, pei->hSeconds); - } - else if (hEdit == pei->hMinutes) - { - pei->timeNow.wMinute = (WORD)dwNow; - Elapsed_Edit_OnEnforceRange (pei, pei->hSeconds); - } - else if (hEdit == pei->hSeconds) - { - pei->timeNow.wSecond = (WORD)dwNow; - } - - SYSTEMTIME st = pei->timeNow; - Elapsed_SendCallback (pei, ELN_UPDATE, (LPARAM)&st); -} - - -void Elapsed_Edit_OnEnforceRange (ElapsedInfo *pei, HWND hEdit) -{ - DWORD dwMin; - DWORD dwNow; - DWORD dwMax; - Elapsed_Edit_GetSpinnerRange (pei, hEdit, &dwMin, &dwNow, &dwMax); - - if (!inlimit( dwMin, dwNow, dwMax )) - { - dwNow = limit( dwMin, dwNow, dwMax ); - - if (hEdit == pei->hHours) - { - pei->timeNow.wDay = (WORD)dwNow / 24; - pei->timeNow.wHour = (WORD)dwNow % 24; - } - else if (hEdit == pei->hMinutes) - { - pei->timeNow.wMinute = (WORD)dwNow; - } - else if (hEdit == pei->hSeconds) - { - pei->timeNow.wSecond = (WORD)dwNow; - } - - if (pei->hSpinnerBuddy == hEdit) - SP_SetRange (hEdit, dwMin, dwMax); - Elapsed_Edit_SetText (pei, hEdit); - } - else if (pei->hSpinnerBuddy == hEdit) - { - SP_SetRange (hEdit, dwMin, dwMax); - } -} - - -void Elapsed_Edit_SetText (ElapsedInfo *pei, HWND hEdit) -{ - DWORD dwMin; - DWORD dwNow; - DWORD dwMax; - Elapsed_Edit_GetSpinnerRange (pei, hEdit, &dwMin, &dwNow, &dwMax); - - if (pei->hSpinnerBuddy == hEdit) - { - SP_SetPos (hEdit, dwNow); - } - else - { - TCHAR szText[ cchRESOURCE ]; - - if (hEdit == pei->hHours) - wsprintf (szText, TEXT("%lu"), dwNow); - else - wsprintf (szText, TEXT("%02lu"), dwNow); - - SetWindowText (hEdit, szText); - } -} - diff --git a/src/WINNT/afsapplib/ctl_elapsed.h b/src/WINNT/afsapplib/ctl_elapsed.h deleted file mode 100644 index 5e3b529b4..000000000 --- a/src/WINNT/afsapplib/ctl_elapsed.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CTL_ELAPSED_H -#define CTL_ELAPSED_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef limit -#define limit(_a,_x,_b) min( max( (_x), (_a) ), (_b) ) -#endif - -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (((_x)>=(_a)) && ((_x)<=(_b))) ? TRUE : FALSE ) -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - - -#define csec1SECOND (1L) -#define csec1MINUTE (60L * csec1SECOND) -#define csec1HOUR (60L * csec1MINUTE) -#define csec1DAY (24L * csec1HOUR) -#define csec1WEEK ( 7L * csec1DAY) - -#define SET_ELAPSED_TIME(_pst,_h,_m,_s) \ - memset (_pst, 0x00, sizeof(SYSTEMTIME)); \ - (_pst)->wDay = (WORD)( (_h) / 24L ); \ - (_pst)->wHour = (WORD)( (_h) % 24L ); \ - (_pst)->wMinute = (WORD)(_m); \ - (_pst)->wSecond = (WORD)(_s); - -#define SET_ELAPSED_TIME_FROM_SECONDS(_pst,_s) \ - memset (_pst, 0x00, sizeof(SYSTEMTIME)); \ - (_pst)->wSecond = (WORD)((_s) % 60L); \ - (_s) /= 60L; \ - (_pst)->wMinute = (WORD)((_s) % 60L); \ - (_s) /= 60L; \ - (_pst)->wHour = (WORD)((_s) % 24L); \ - (_s) /= 24L; \ - (_pst)->wDay = (WORD)(_s); - -#define GET_SECONDS_FROM_ELAPSED_TIME(_pst) \ - ( ((ULONG)((_pst)->wSecond)) + \ - ((ULONG)((_pst)->wMinute) * 60L) + \ - ((ULONG)((_pst)->wHour) * 60L * 60L) + \ - ((ULONG)((_pst)->wDay) * 60L * 60L * 24L) ) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -EXPORTED BOOL RegisterElapsedClass (void); - -#define ELM_GETRANGE (WM_USER+301) // SYSTEMTIME *pTime = wp, lp; -#define ELM_SETRANGE (WM_USER+302) // SYSTEMTIME *pTime = wp, lp; -#define ELM_GETTIME (WM_USER+307) // SYSTEMTIME *pTime = lp; -#define ELM_SETTIME (WM_USER+308) // SYSTEMTIME *pTime = lp; - -#define ELN_CHANGE 0x1003 // SYSTEMTIME *pTime = lp; -#define ELN_UPDATE 0x1004 // SYSTEMTIME *pTime = lp; - -/* - * void EL_GetRange (HWND hElapsed, SYSTEMTIME *pTimeMin, SYSTEMTIME *pTimeMax) - * void EL_SetRange (HWND hElapsed, SYSTEMTIME *pTimeMin, SYSTEMTIME *pTimeMax) - * - */ -#define EL_GetRange(_hel,_pTimeMin,_pTimeMax) \ - SendMessage(_hel,ELM_GETRANGE,(WPARAM)_pTimeMin,(LPARAM)_pTimeMax) -#define EL_SetRange(_hel,_pTimeMin,_pTimeMax) \ - SendMessage(_hel,ELM_SETRANGE,(WPARAM)_pTimeMin,(LPARAM)_pTimeMax) - -/* - * void EL_GetTime (HWND hElapsed, SYSTEMTIME *pTime) - * void EL_SetTime (HWND hElapsed, SYSTEMTIME *pTime) - * - */ -#define EL_GetTime(_hel,_pTime) \ - SendMessage(_hel,ELM_GETTIME,(WPARAM)0,(LPARAM)_pTime) -#define EL_SetTime(_hel,_pTime) \ - SendMessage(_hel,ELM_SETTIME,(WPARAM)0,(LPARAM)_pTime) - - -#endif - diff --git a/src/WINNT/afsapplib/ctl_sockaddr.cpp b/src/WINNT/afsapplib/ctl_sockaddr.cpp deleted file mode 100644 index 7b1957ef4..000000000 --- a/src/WINNT/afsapplib/ctl_sockaddr.cpp +++ /dev/null @@ -1,648 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include -#include // for GetRectInParent() -#include -#include -#include -#include - -#ifndef cchRESOURCE -#define cchRESOURCE 256 -#endif - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) SockAddrReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL SockAddrReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -/* - * SOCKADDRS __________________________________________________________________ - * - */ - -typedef struct - { - HWND hSockAddr; - HWND hE1; - HWND hSep1; - HWND hE2; - HWND hSep2; - HWND hE3; - HWND hSep3; - HWND hE4; - HWND hMinutes; - - WORD idE1; - WORD idE2; - WORD idE3; - WORD idE4; - - SOCKADDR_IN addr; - - BOOL fCallingBack; - } SockAddrInfo; - -static CRITICAL_SECTION csSockAddr; -static SockAddrInfo *aSockAddr = NULL; -static size_t cSockAddr = 0; - -#define cszSOCKADDRCLASS TEXT("SockAddr") - -BOOL CALLBACK SockAddrProc (HWND hSockAddr, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK SockAddrEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK SockAddrDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void SockAddr_SendCallback (SockAddrInfo *psai, WORD eln, LPARAM lp); - -void SockAddr_OnCreate (SockAddrInfo *psai); -void SockAddr_OnDestroy (SockAddrInfo *psai); -void SockAddr_OnButtonDown (SockAddrInfo *psai, UINT msg, WPARAM wp, LPARAM lp); -BOOL SockAddr_OnGetAddr (SockAddrInfo *psai, WPARAM wp, LPARAM lp); -BOOL SockAddr_OnSetAddr (SockAddrInfo *psai, WPARAM wp, LPARAM lp); - -void SockAddr_Edit_OnChange (SockAddrInfo *psai, HWND hEdit); -void SockAddr_Edit_OnUpdate (SockAddrInfo *psai, HWND hEdit); -void SockAddr_Edit_SetText (SockAddrInfo *psai, HWND hEdit); - -#define cszSOCKSEP TEXT(".") - -BOOL RegisterSockAddrClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - InitializeCriticalSection (&csSockAddr); - - WNDCLASS wc; - memset (&wc, 0x00, sizeof(wc)); - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = (WNDPROC)SockAddrProc; - wc.hInstance = THIS_HINST; - wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE (IDC_ARROW)); - wc.hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - wc.lpszClassName = cszSOCKADDRCLASS; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - - return fRegistered; -} - - -void SockAddr_SendCallback (SockAddrInfo *psai, WORD san, LPARAM lp) -{ - if (!psai->fCallingBack) - { - psai->fCallingBack = TRUE; - - SendMessage (GetParent (psai->hSockAddr), - WM_COMMAND, - MAKELONG ((WORD)GetWindowLong (psai->hSockAddr, GWL_ID), san), - lp); - - psai->fCallingBack = FALSE; - } -} - - -BOOL CALLBACK SockAddrProc (HWND hSockAddr, UINT msg, WPARAM wp, LPARAM lp) -{ - SockAddrInfo *psai = NULL; - - EnterCriticalSection (&csSockAddr); - - if (msg == WM_CREATE) - { - for (size_t iSockAddr = 0; iSockAddr < cSockAddr; ++iSockAddr) - { - if (aSockAddr[ iSockAddr ].hSockAddr == NULL) - break; - } - if (iSockAddr >= cSockAddr) - { - if (!REALLOC (aSockAddr, cSockAddr, 1+iSockAddr, 4)) - return FALSE; - } - - memset (&aSockAddr[ iSockAddr ], 0x00, sizeof(SockAddrInfo)); - aSockAddr[ iSockAddr ].hSockAddr = hSockAddr; - - psai = &aSockAddr[ iSockAddr ]; - } - else - { - for (size_t iSockAddr = 0; !psai && iSockAddr < cSockAddr; ++iSockAddr) - { - if (aSockAddr[ iSockAddr ].hSockAddr == hSockAddr) - psai = &aSockAddr[ iSockAddr ]; - } - } - - LeaveCriticalSection (&csSockAddr); - - if (psai != NULL) - { - switch (msg) - { - case WM_CREATE: - SockAddr_OnCreate (psai); - break; - - case WM_DESTROY: - SockAddr_OnDestroy (psai); - break; - - case WM_RBUTTONDOWN: - case WM_LBUTTONDOWN: - SockAddr_OnButtonDown (psai, msg, wp, lp); - break; - - case WM_SETFOCUS: - PostMessage (GetParent(hSockAddr), WM_NEXTDLGCTL, (WPARAM)psai->hE1, TRUE); - break; - - case WM_ENABLE: - EnableWindow (psai->hE1, IsWindowEnabled (hSockAddr)); - EnableWindow (psai->hSep1, IsWindowEnabled (hSockAddr)); - EnableWindow (psai->hE2, IsWindowEnabled (hSockAddr)); - EnableWindow (psai->hSep2, IsWindowEnabled (hSockAddr)); - EnableWindow (psai->hE3, IsWindowEnabled (hSockAddr)); - EnableWindow (psai->hSep3, IsWindowEnabled (hSockAddr)); - EnableWindow (psai->hE4, IsWindowEnabled (hSockAddr)); - - RECT rSockAddr; - GetRectInParent (hSockAddr, &rSockAddr); - InvalidateRect (GetParent(hSockAddr), &rSockAddr, TRUE); - UpdateWindow (GetParent(hSockAddr)); - break; - - case SAM_GETADDR: - return SockAddr_OnGetAddr (psai, wp, lp); - - case SAM_SETADDR: - return SockAddr_OnSetAddr (psai, wp, lp); - } - } - - return DefWindowProc (hSockAddr, msg, wp, lp); -} - - -void SockAddr_OnCreate (SockAddrInfo *psai) -{ - Subclass_AddHook (GetParent(psai->hSockAddr), SockAddrDlgProc); - - RECT rSockAddr; - GetClientRect (psai->hSockAddr, &rSockAddr); - - POINT ptSockAddr = {0,0}; - ClientToScreen (psai->hSockAddr, &ptSockAddr); - ScreenToClient (GetParent (psai->hSockAddr), &ptSockAddr); - - SIZE s888; // size of widest likely triple-digit number - SIZE sSockSep; // size of "." - - HDC hdc = GetDC (GetParent (psai->hSockAddr)); - GetTextExtentPoint (hdc, TEXT("888"), lstrlen(TEXT("888")), &s888); - GetTextExtentPoint (hdc, cszSOCKSEP, lstrlen(cszSOCKSEP), &sSockSep); - ReleaseDC (GetParent (psai->hSockAddr), hdc); - - LONG cxNumbers = cxRECT(rSockAddr) - (3 * sSockSep.cx); - LONG cxE2 = cxNumbers/4; - LONG cxE1 = cxNumbers - cxE2 * 3; - LONG yy = ptSockAddr.y; - LONG cy = cyRECT(rSockAddr); - - cxE2 = min (cxE2, (LONG)( 1.4 * s888.cx )); - cxE1 = min (cxE1, (LONG)( 1.4 * s888.cx )); // don't be TOO wide. - - psai->idE1 = 100+NextControlID (GetParent (psai->hSockAddr)); - psai->hE1 = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - ptSockAddr.x, yy, cxE1, cy, - GetParent(psai->hSockAddr), - (HMENU)psai->idE1, - THIS_HINST, - 0); - - psai->hSep1 = CreateWindow ( - TEXT("STATIC"), - cszSOCKSEP, - WS_CHILD | SS_CENTER, - ptSockAddr.x + cxE1, yy, sSockSep.cx, cy, - GetParent(psai->hSockAddr), - (HMENU)-1, - THIS_HINST, - 0); - - psai->idE2 = 1 + psai->idE1; - psai->hE2 = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - ptSockAddr.x + cxE1 + sSockSep.cx, yy, cxE2, cy, - GetParent(psai->hSockAddr), - (HMENU)psai->idE2, - THIS_HINST, - 0); - - psai->hSep2 = CreateWindow ( - TEXT("STATIC"), - cszSOCKSEP, - WS_CHILD | SS_CENTER, - ptSockAddr.x + cxE1 + sSockSep.cx + cxE2, yy, sSockSep.cx, cy, - GetParent(psai->hSockAddr), - (HMENU)-1, - THIS_HINST, - 0); - - psai->idE3 = 1 + psai->idE2; - psai->hE3 = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - ptSockAddr.x + cxE1 + sSockSep.cx*2 + cxE2, yy, cxE2, cy, - GetParent(psai->hSockAddr), - (HMENU)psai->idE3, - THIS_HINST, - 0); - - psai->hSep3 = CreateWindow ( - TEXT("STATIC"), - cszSOCKSEP, - WS_CHILD | SS_CENTER, - ptSockAddr.x + cxE1 + sSockSep.cx*2 + cxE2*2, yy, sSockSep.cx, cy, - GetParent(psai->hSockAddr), - (HMENU)-1, - THIS_HINST, - 0); - - psai->idE4 = 1 + psai->idE3; - psai->hE4 = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_RIGHT | ES_NUMBER | ES_MULTILINE, - ptSockAddr.x + cxE1 + sSockSep.cx*3 + cxE2*2, yy, cxE2, cy, - GetParent(psai->hSockAddr), - (HMENU)psai->idE4, - THIS_HINST, - 0); - - Subclass_AddHook (psai->hE1, SockAddrEditProc); - Subclass_AddHook (psai->hE2, SockAddrEditProc); - Subclass_AddHook (psai->hE3, SockAddrEditProc); - Subclass_AddHook (psai->hE4, SockAddrEditProc); - - HFONT hf = (HFONT)SendMessage (GetParent (psai->hSockAddr), WM_GETFONT, 0, 0); - SendMessage (psai->hE1, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (psai->hSep1, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (psai->hE2, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (psai->hSep2, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (psai->hE3, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (psai->hSep3, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (psai->hE4, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - - EnableWindow (psai->hE1, IsWindowEnabled (psai->hSockAddr)); - EnableWindow (psai->hSep1, IsWindowEnabled (psai->hSockAddr)); - EnableWindow (psai->hE2, IsWindowEnabled (psai->hSockAddr)); - EnableWindow (psai->hSep2, IsWindowEnabled (psai->hSockAddr)); - EnableWindow (psai->hE3, IsWindowEnabled (psai->hSockAddr)); - EnableWindow (psai->hSep3, IsWindowEnabled (psai->hSockAddr)); - EnableWindow (psai->hE4, IsWindowEnabled (psai->hSockAddr)); - - ShowWindow (psai->hE1, TRUE); - ShowWindow (psai->hSep1, TRUE); - ShowWindow (psai->hE2, TRUE); - ShowWindow (psai->hSep2, TRUE); - ShowWindow (psai->hE3, TRUE); - ShowWindow (psai->hSep3, TRUE); - ShowWindow (psai->hE4, TRUE); - - RECT rWindow; - GetWindowRect (psai->hSockAddr, &rWindow); - rWindow.right += (cxE1 + cxE2*3 + sSockSep.cx*3) - cxRECT(rSockAddr); - - SetWindowPos (psai->hSockAddr, NULL, 0, 0, cxRECT(rWindow), cyRECT(rWindow), - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - SOCKADDR_IN addrNew; - memset (&addrNew, 0x00, sizeof(addrNew)); - SockAddr_OnSetAddr (psai, 0, (LPARAM)&addrNew); -} - - -void SockAddr_OnDestroy (SockAddrInfo *psai) -{ - Subclass_RemoveHook (GetParent(psai->hSockAddr), SockAddrDlgProc); - psai->hSockAddr = NULL; -} - - -void SockAddr_OnButtonDown (SockAddrInfo *psai, UINT msg, WPARAM wp, LPARAM lp) -{ - DWORD dw = GetMessagePos(); - POINT pt; - pt.x = LOWORD(dw); - pt.y = HIWORD(dw); // in screen coordinates - - RECT rTarget; - HWND hTarget = 0; - - GetWindowRect (psai->hE1, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = psai->hE1; - - GetWindowRect (psai->hE2, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = psai->hE2; - - GetWindowRect (psai->hE3, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = psai->hE3; - - GetWindowRect (psai->hE4, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = psai->hE4; - - if (hTarget != 0) - { - PostMessage (hTarget, msg, wp, lp); - } -} - - -BOOL SockAddr_OnGetAddr (SockAddrInfo *psai, WPARAM wp, LPARAM lp) -{ - SOCKADDR_IN *pAddr = (SOCKADDR_IN*)lp; - *pAddr = psai->addr; - return TRUE; -} - - -BOOL SockAddr_OnSetAddr (SockAddrInfo *psai, WPARAM wp, LPARAM lp) -{ - SOCKADDR_IN *pAddr = (SOCKADDR_IN*)lp; - psai->addr = *pAddr; - SockAddr_Edit_SetText (psai, psai->hE1); - SockAddr_Edit_SetText (psai, psai->hE2); - SockAddr_Edit_SetText (psai, psai->hE3); - SockAddr_Edit_SetText (psai, psai->hE4); - return TRUE; -} - - -BOOL CALLBACK SockAddrDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, SockAddrDlgProc); - size_t iSockAddr; - - switch (msg) - { - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: - for (iSockAddr = 0; iSockAddr < cSockAddr; ++iSockAddr) - { - if (aSockAddr[ iSockAddr ].hSockAddr == NULL) - continue; - if ( (aSockAddr[ iSockAddr ].hE1 == (HWND)lp) || - (aSockAddr[ iSockAddr ].hSep1 == (HWND)lp) || - (aSockAddr[ iSockAddr ].hE2 == (HWND)lp) || - (aSockAddr[ iSockAddr ].hSep2 == (HWND)lp) || - (aSockAddr[ iSockAddr ].hE3 == (HWND)lp) || - (aSockAddr[ iSockAddr ].hSep3 == (HWND)lp) || - (aSockAddr[ iSockAddr ].hE4 == (HWND)lp) ) - { - COLORREF clr; - if (IsWindowEnabled (aSockAddr[ iSockAddr ].hSockAddr)) - clr = GetSysColor (COLOR_WINDOW); - else - clr = GetSysColor (COLOR_BTNFACE); - SetBkColor ((HDC)wp, clr); - return (BOOL)CreateSolidBrush (clr); - } - } - break; - - case WM_COMMAND: - for (iSockAddr = 0; iSockAddr < cSockAddr; ++iSockAddr) - { - if (aSockAddr[ iSockAddr ].hSockAddr == NULL) - continue; - if ( (aSockAddr[ iSockAddr ].idE1 == LOWORD(wp)) || - (aSockAddr[ iSockAddr ].idE2 == LOWORD(wp)) || - (aSockAddr[ iSockAddr ].idE3 == LOWORD(wp)) || - (aSockAddr[ iSockAddr ].idE4 == LOWORD(wp)) ) - { - static BOOL fInHere = FALSE; - if (!fInHere) - { - fInHere = TRUE; - - if (HIWORD(wp) == EN_CHANGE) - { - SockAddr_Edit_OnChange (&aSockAddr[ iSockAddr ], GetDlgItem (hDlg, LOWORD(wp))); - } - else if (HIWORD(wp) == EN_UPDATE) - { - SockAddr_Edit_OnUpdate (&aSockAddr[ iSockAddr ], GetDlgItem (hDlg, LOWORD(wp))); - } - - fInHere = FALSE; - } - break; - } - } - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); - else - return DefWindowProc (hDlg, msg, wp, lp); -} - - -BOOL CALLBACK SockAddrEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp) -{ - SockAddrInfo *psai = NULL; - - EnterCriticalSection (&csSockAddr); - - for (size_t iSockAddr = 0; !psai && iSockAddr < cSockAddr; ++iSockAddr) - { - if ( (aSockAddr[ iSockAddr ].hE1 == hEdit) || - (aSockAddr[ iSockAddr ].hE2 == hEdit) || - (aSockAddr[ iSockAddr ].hE3 == hEdit) || - (aSockAddr[ iSockAddr ].hE4 == hEdit) ) - { - psai = &aSockAddr[ iSockAddr ]; - } - } - - LeaveCriticalSection (&csSockAddr); - - if (psai) - { - switch (msg) - { - case WM_KILLFOCUS: - SockAddr_Edit_SetText (psai, hEdit); - break; - - case WM_CHAR: - if (wp == TEXT('.')) - { - // advance to the next field - PostMessage (GetParent(hEdit), WM_NEXTDLGCTL, 0, 0); - return FALSE; - } - break; - } - } - - PVOID oldProc = Subclass_FindNextHook (hEdit, SockAddrEditProc); - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hEdit, msg, wp, lp); - else - return DefWindowProc (hEdit, msg, wp, lp); -} - - -void SockAddr_Edit_OnChange (SockAddrInfo *psai, HWND hEdit) -{ - TCHAR szText[ cchRESOURCE ]; - GetWindowText (hEdit, szText, cchRESOURCE); - - if ( (hEdit != psai->hE1) || - (psai->addr.sin_addr.s_net) || - (psai->addr.sin_addr.s_host) || - (psai->addr.sin_addr.s_lh) || - (psai->addr.sin_addr.s_impno) || - (szText[0] != TEXT('\0')) ) - { - DWORD dwMin = (hEdit == psai->hE1) ? 1 : 0; - DWORD dwNow = (DWORD)atol(szText); - DWORD dwMax = (hEdit == psai->hE1) ? 253 : 255; - - dwNow = limit (dwMin, dwNow, dwMax); - - if (hEdit == psai->hE1) - psai->addr.sin_addr.s_net = (unsigned char)dwNow; - else if (hEdit == psai->hE2) - psai->addr.sin_addr.s_host = (unsigned char)dwNow; - else if (hEdit == psai->hE3) - psai->addr.sin_addr.s_lh = (unsigned char)dwNow; - else if (hEdit == psai->hE4) - psai->addr.sin_addr.s_impno = (unsigned char)dwNow; - - SOCKADDR_IN addrNew = psai->addr; - SockAddr_SendCallback (psai, SAN_CHANGE, (LPARAM)&addrNew); - if (memcmp (&addrNew, &psai->addr, sizeof(SOCKADDR_IN))) - { - SockAddr_OnSetAddr (psai, (WPARAM)0, (LPARAM)&addrNew); - } - } - -// SockAddr_Edit_SetText (psai, hEdit); - - if ( (hEdit == psai->hE1) && - (psai->addr.sin_addr.s_net) && - (!psai->addr.sin_addr.s_host) && - (!psai->addr.sin_addr.s_lh) && - (!psai->addr.sin_addr.s_impno) ) - { - SockAddr_Edit_SetText (psai, psai->hE2); - SockAddr_Edit_SetText (psai, psai->hE3); - SockAddr_Edit_SetText (psai, psai->hE4); - } -} - - -void SockAddr_Edit_OnUpdate (SockAddrInfo *psai, HWND hEdit) -{ - SOCKADDR_IN addrNew = psai->addr; - SockAddr_SendCallback (psai, SAN_UPDATE, (LPARAM)&addrNew); -} - - -void SockAddr_Edit_SetText (SockAddrInfo *psai, HWND hEdit) -{ - DWORD dwNow; - - if ( (!psai->addr.sin_addr.s_net) && - (!psai->addr.sin_addr.s_host) && - (!psai->addr.sin_addr.s_lh) && - (!psai->addr.sin_addr.s_impno) ) - { - SetWindowText (hEdit, TEXT("")); - } - else - { - if (hEdit == psai->hE1) - dwNow = (DWORD)psai->addr.sin_addr.s_net; - else if (hEdit == psai->hE2) - dwNow = (DWORD)psai->addr.sin_addr.s_host; - else if (hEdit == psai->hE3) - dwNow = (DWORD)psai->addr.sin_addr.s_lh; - else if (hEdit == psai->hE4) - dwNow = (DWORD)psai->addr.sin_addr.s_impno; - - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%lu"), dwNow); - SetWindowText (hEdit, szText); - } -} - diff --git a/src/WINNT/afsapplib/ctl_sockaddr.h b/src/WINNT/afsapplib/ctl_sockaddr.h deleted file mode 100644 index 5ab3cc573..000000000 --- a/src/WINNT/afsapplib/ctl_sockaddr.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CTL_SOCKADDR_H -#define CTL_SOCKADDR_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef limit -#define limit(_a,_x,_b) min( max( (_x), (_a) ), (_b) ) -#endif - -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (((_x)>=(_a)) && ((_x)<=(_b))) ? TRUE : FALSE ) -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -EXPORTED BOOL RegisterSockAddrClass (void); - -#define SAM_GETADDR (WM_USER+301) // SOCKADDR_IN *pAddr = lp; -#define SAM_SETADDR (WM_USER+302) // SOCKADDR_IN *pAddr = lp; - -#define SAN_CHANGE 0x1003 // SOCKADDR_IN *pTime = lp; -#define SAN_UPDATE 0x1004 // SOCKADDR_IN *pAddr = lp; - -/* - * void SA_GetAddr (HWND hSockAddr, SOCKADDR_IN *pAddr) - * void SA_SetAddr (HWND hSockAddr, SOCKADDR_IN *pAddr) - * - */ -#define SA_GetAddr(_hsa,_pAddr) \ - SendMessage(_hsa,SAM_GETADDR,(WPARAM)0,(LPARAM)_pAddr) -#define SA_SetAddr(_hsa,_pAddr) \ - SendMessage(_hsa,SAM_SETADDR,(WPARAM)0,(LPARAM)_pAddr) - - -#endif - diff --git a/src/WINNT/afsapplib/ctl_spinner.cpp b/src/WINNT/afsapplib/ctl_spinner.cpp deleted file mode 100644 index d71549428..000000000 --- a/src/WINNT/afsapplib/ctl_spinner.cpp +++ /dev/null @@ -1,907 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include -#include - -#ifndef cchRESOURCE -#define cchRESOURCE 256 -#endif - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#define ishexdigit(_ch) ( (((_ch) >= 'a') && ((_ch) <= 'f')) || \ - (((_ch) >= 'A') && ((_ch) <= 'F')) ) - -#define digitval(_ch) (isdigit(_ch) \ - ? ((DWORD)(_ch) - (DWORD)TEXT('0')) \ - : (((_ch) >= 'a') && ((_ch) <= 'f')) \ - ? ((DWORD)(_ch) - (DWORD)TEXT('a') + 10) \ - : (((_ch) >= 'A') && ((_ch) <= 'F')) \ - ? ((DWORD)(_ch) - (DWORD)TEXT('A') + 10) \ - : 0) - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) SpinnerReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL SpinnerReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -/* - * SPINNERS ___________________________________________________________________ - * - */ - -typedef struct - { - HWND hSpinner; - HWND hBuddy; - RECT rReq; - - DWORD dwMin; - DWORD dwMax; - WORD wBase; - BOOL fSigned; - DWORD dwPos; - - BOOL fNewText; - BOOL fCallingBack; - BOOL fCanCallBack; - LPTSTR pszFormat; - } SpinnerInfo; - -static CRITICAL_SECTION csSpinners; -static SpinnerInfo *aSpinners = NULL; -static size_t cSpinners = 0; -static LONG oldSpinnerProc = 0; - -#define cszSPINNERCLASS TEXT("Spinner") - -BOOL CALLBACK SpinnerProc (HWND hSpin, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK SpinnerDialogProc (HWND hSpin, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK SpinnerBuddyProc (HWND hBuddy, UINT msg, WPARAM wp, LPARAM lp); - -void SpinnerSendCallback (SpinnerInfo *psi, WORD spm, LPARAM lp); - -void Spinner_OnCreate (SpinnerInfo *psi); -BOOL Spinner_OnGetRange (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnSetRange (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnGetPos (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnSetPos (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnGetBase (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnSetBase (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnReattach (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnSetRect (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnGetSpinner (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnSetFormat (SpinnerInfo *psi, WPARAM wp, LPARAM lp); -BOOL Spinner_OnSetBuddy (SpinnerInfo *psi, WPARAM wp, LPARAM lp); - -void Spinner_GetNewText (SpinnerInfo *psi); -void Spinner_SetNewText (SpinnerInfo *psi, BOOL fCallback); - - -BOOL RegisterSpinnerClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - WNDCLASS wc; - - InitializeCriticalSection (&csSpinners); - - if (GetClassInfo (THIS_HINST, TEXT("scrollbar"), &wc)) - { - oldSpinnerProc = (LONG)wc.lpfnWndProc; - - wc.lpfnWndProc = (WNDPROC)SpinnerProc; - wc.style = CS_GLOBALCLASS; - wc.hInstance = THIS_HINST; - wc.lpszClassName = cszSPINNERCLASS; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - } - - return fRegistered; -} - - -SpinnerInfo *Spinner_FindSpinnerInfo (HWND hSpinner, HWND hBuddy) -{ - SpinnerInfo *psi = NULL; - - EnterCriticalSection (&csSpinners); - - for (size_t ii = 0; ii < cSpinners; ++ii) - { - if ( (hSpinner && (aSpinners[ ii ].hSpinner == hSpinner)) || - (hBuddy && (aSpinners[ ii ].hBuddy == hBuddy)) ) - { - psi = &aSpinners[ ii ]; - break; - } - } - - LeaveCriticalSection (&csSpinners); - return psi; -} - - -BOOL CreateSpinner (HWND hBuddy, - WORD wBase, BOOL fSigned, - DWORD dwMin, DWORD dwPos, DWORD dwMax, - LPRECT prTarget) -{ - if (!RegisterSpinnerClass()) - return FALSE; - - EnterCriticalSection (&csSpinners); - - for (size_t ii = 0; ii < cSpinners; ++ii) - { - if (!aSpinners[ ii ].hSpinner) - break; - } - if (ii >= cSpinners) - { - if (!REALLOC (aSpinners, cSpinners, 1+ii, 4)) - { - LeaveCriticalSection (&csSpinners); - return FALSE; - } - } - - memset (&aSpinners[ ii ], 0x00, sizeof(SpinnerInfo)); - - aSpinners[ ii ].hBuddy = hBuddy; - aSpinners[ ii ].dwMin = dwMin; - aSpinners[ ii ].dwMax = dwMax; - aSpinners[ ii ].wBase = wBase; - aSpinners[ ii ].fSigned = fSigned; - aSpinners[ ii ].dwPos = dwPos; - - if (prTarget != NULL) - aSpinners[ ii ].rReq = *prTarget; - - aSpinners[ ii ].hSpinner = CreateWindowEx ( - 0, // extended window style - cszSPINNERCLASS, // pointer to registered class name - TEXT(""), // pointer to window name - WS_CHILD | SBS_VERT, // window style - 0, 0, 1, 1, // spinner moves/resizes itself - GetParent(hBuddy), // handle to parent or owner window - (HMENU)-1, // handle to menu, or child-window identifier - THIS_HINST, // handle to application instance - (LPVOID)ii); // pointer to window-creation data - - LeaveCriticalSection (&csSpinners); - - if (aSpinners[ ii ].hSpinner == NULL) - return FALSE; - - ShowWindow (aSpinners[ ii ].hSpinner, SW_SHOW); - - if (!IsWindowEnabled (aSpinners[ ii ].hBuddy)) - EnableWindow (aSpinners[ ii ].hSpinner, FALSE); - - return TRUE; -} - - -BOOL fHasSpinner (HWND hBuddy) -{ - if (!RegisterSpinnerClass()) - return FALSE; - - return (Spinner_FindSpinnerInfo (NULL, hBuddy) == NULL) ? FALSE : TRUE; -} - - -void Spinner_OnDestroy (SpinnerInfo *psi) -{ - Subclass_RemoveHook (GetParent (psi->hSpinner), SpinnerDialogProc); - Subclass_RemoveHook (psi->hBuddy, SpinnerBuddyProc); - - if (psi->pszFormat) - { - Free (psi->pszFormat); - psi->pszFormat = NULL; - } - psi->hSpinner = NULL; - psi->hBuddy = NULL; -} - - -BOOL CALLBACK SpinnerProc (HWND hSpinner, UINT msg, WPARAM wp, LPARAM lp) -{ - EnterCriticalSection (&csSpinners); - - if (msg == WM_CREATE) - { - aSpinners[ (int)((LPCREATESTRUCT)lp)->lpCreateParams ].hSpinner = hSpinner; - } - - SpinnerInfo *psi = Spinner_FindSpinnerInfo (hSpinner, NULL); - - LeaveCriticalSection (&csSpinners); - - if (psi != NULL) - { - switch (msg) - { - case WM_CREATE: - Spinner_OnCreate (psi); - break; - - case WM_SETFOCUS: - PostMessage (GetParent(psi->hSpinner), WM_NEXTDLGCTL, (WPARAM)psi->hBuddy, TRUE); - break; - - case WM_DESTROY: - Spinner_OnDestroy (psi); - break; - - case WM_SYSCHAR: - case WM_CHAR: - switch (wp) - { - case VK_UP: - PostMessage (GetParent(psi->hSpinner), WM_VSCROLL, SB_LINEUP, (LPARAM)psi->hSpinner); - break; - - case VK_DOWN: - PostMessage (GetParent(psi->hSpinner), WM_VSCROLL, SB_LINEDOWN, (LPARAM)psi->hSpinner); - break; - - case VK_PRIOR: - PostMessage (GetParent(psi->hSpinner), WM_VSCROLL, SB_PAGEUP, (LPARAM)psi->hSpinner); - break; - - case VK_NEXT: - PostMessage (GetParent(psi->hSpinner), WM_VSCROLL, SB_PAGEDOWN, (LPARAM)psi->hSpinner); - break; - - case VK_HOME: - PostMessage (GetParent(psi->hSpinner), WM_VSCROLL, SB_TOP, (LPARAM)psi->hSpinner); - break; - - case VK_END: - PostMessage (GetParent(psi->hSpinner), WM_VSCROLL, SB_BOTTOM, (LPARAM)psi->hSpinner); - break; - } - break; - } - } - - if (oldSpinnerProc == 0) - return DefWindowProc (hSpinner, msg, wp, lp); - else - return CallWindowProc ((WNDPROC)oldSpinnerProc, hSpinner, msg, wp, lp); -} - - -BOOL CALLBACK SpinnerDialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, SpinnerDialogProc); - SpinnerInfo *psi; - - switch (msg) - { - case WM_COMMAND: - if ((psi = Spinner_FindSpinnerInfo (NULL, (HWND)lp)) != NULL) - { - switch (HIWORD(wp)) - { - // case CBN_SELCHANGE: --same value as LBN_SELCHANGE - case LBN_SELCHANGE: - case EN_UPDATE: - Spinner_GetNewText (psi); - - if (psi->fCanCallBack == TRUE) - SpinnerSendCallback (psi, SPN_UPDATE, (LPARAM)psi->dwPos); - else - oldProc = NULL; // don't forward this notification message - break; - - default: - oldProc = NULL; // don't forward this notification message - break; - } - } - break; - - case WM_VSCROLL: - if ((psi = Spinner_FindSpinnerInfo ((HWND)lp, NULL)) != NULL) - { - if (psi->fNewText) - { - WORD wBaseOld = psi->wBase; - Spinner_GetNewText (psi); - if ((wBaseOld != psi->wBase) && !(psi->pszFormat)) - Spinner_OnSetBase (psi, psi->wBase, psi->fSigned); - } - - switch (LOWORD(wp)) - { - case SB_LINEUP: - { - DWORD dw = psi->dwPos; - SpinnerSendCallback (psi, SPN_CHANGE_UP, (LPARAM)&dw); - if (dw == psi->dwPos) - psi->dwPos ++; - else if (dw != SPVAL_UNCHANGED) - psi->dwPos = dw; - - if (psi->wBase == 10 && psi->fSigned) - psi->dwPos = (DWORD)limit ((signed long)psi->dwMin, (signed long)psi->dwPos, (signed long)psi->dwMax); - else - psi->dwPos = (DWORD)limit (psi->dwMin, psi->dwPos, psi->dwMax); - - Spinner_SetNewText (psi, TRUE); - PostMessage (GetParent(psi->hSpinner), WM_NEXTDLGCTL, (WPARAM)psi->hBuddy, TRUE); - break; - } - - case SB_LINEDOWN: - { - DWORD dw = psi->dwPos; - SpinnerSendCallback (psi, SPN_CHANGE_DOWN, (LPARAM)&dw); - if (dw == psi->dwPos) - { - if ((psi->dwPos > 0) || (psi->wBase == 10 && psi->fSigned)) - psi->dwPos --; - } - else if (dw != SPVAL_UNCHANGED) - psi->dwPos = dw; - - if (psi->wBase == 10 && psi->fSigned) - psi->dwPos = (DWORD)limit ((signed long)psi->dwMin, (signed long)psi->dwPos, (signed long)psi->dwMax); - else - psi->dwPos = (DWORD)limit (psi->dwMin, psi->dwPos, psi->dwMax); - - Spinner_SetNewText (psi, TRUE); - PostMessage (GetParent(psi->hSpinner), WM_NEXTDLGCTL, (WPARAM)psi->hBuddy, TRUE); - break; - } - } - } - break; - } - - if (oldProc == 0) - return DefWindowProc (hDlg, msg, wp, lp); - else - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); -} - - - -BOOL CALLBACK SpinnerBuddyProc (HWND hBuddy, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hBuddy, SpinnerBuddyProc); - - SpinnerInfo *psi; - if ((psi = Spinner_FindSpinnerInfo (NULL, hBuddy)) != NULL) - { - switch (msg) - { - case WM_KEYDOWN: - case WM_KEYUP: - switch (wp) - { - case VK_HOME: - case VK_END: - case VK_PRIOR: - case VK_NEXT: - case VK_UP: - case VK_DOWN: - SendMessage (psi->hSpinner, msg, wp, lp); - return FALSE; - } - break; - - case WM_CHAR: - psi->fNewText = TRUE; - break; - - case WM_MOVE: - case WM_SIZE: - PostMessage (hBuddy, SPM_REATTACH, 0, 0); - break; - - case WM_ENABLE: - EnableWindow (psi->hSpinner, wp); - break; - - case WM_KILLFOCUS: - Spinner_GetNewText (psi); - Spinner_OnSetBase (psi, psi->wBase, psi->fSigned); - break; - - case SPM_GETRANGE: - return Spinner_OnGetRange (psi, wp, lp); - - case SPM_SETRANGE: - return Spinner_OnSetRange (psi, wp, lp); - - case SPM_GETPOS: - return Spinner_OnGetPos (psi, wp, lp); - - case SPM_SETPOS: - return Spinner_OnSetPos (psi, wp, lp); - - case SPM_GETBASE: - return Spinner_OnGetBase (psi, wp, lp); - - case SPM_SETBASE: - return Spinner_OnSetBase (psi, wp, lp); - - case SPM_REATTACH: - return Spinner_OnReattach (psi, wp, lp); - - case SPM_SETRECT: - return Spinner_OnSetRect (psi, wp, lp); - - case SPM_GETSPINNER: - return Spinner_OnGetSpinner (psi, wp, lp); - - case SPM_SETFORMAT: - return Spinner_OnSetFormat (psi, wp, lp); - - case SPM_SETBUDDY: - return Spinner_OnSetBuddy (psi, wp, lp); - } - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hBuddy, msg, wp, lp); - else - return DefWindowProc (hBuddy, msg, wp, lp); -} - - -void SpinnerSendCallback (SpinnerInfo *psi, WORD spm, LPARAM lp) -{ - if ((psi->fCanCallBack == TRUE) && !psi->fCallingBack) - { - psi->fCallingBack = TRUE; - - SendMessage (GetParent (psi->hSpinner), - WM_COMMAND, - MAKELONG ((WORD)GetWindowLong (psi->hBuddy, GWL_ID), spm), - lp); - - psi->fCallingBack = FALSE; - } -} - - -void Spinner_OnCreate (SpinnerInfo *psi) -{ - Subclass_AddHook (GetParent(psi->hSpinner), SpinnerDialogProc); - Subclass_AddHook (psi->hBuddy, SpinnerBuddyProc); - - Spinner_OnReattach (psi, 0, 0); - Spinner_SetNewText (psi, FALSE); - - psi->fCanCallBack = TRUE; -} - - -BOOL Spinner_OnGetRange (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - if (wp != 0) - *(LPDWORD)wp = psi->dwMin; - if (lp != 0) - *(LPDWORD)lp = psi->dwMax; - return TRUE; -} - -BOOL Spinner_OnSetRange (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - psi->dwMin = (DWORD)wp; - psi->dwMax = (DWORD)lp; - Spinner_SetNewText (psi, FALSE); - return TRUE; -} - -BOOL Spinner_OnGetPos (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - if (psi->fNewText) - { - Spinner_GetNewText (psi); - Spinner_OnSetBase (psi, psi->wBase, psi->fSigned); - } - return (BOOL)psi->dwPos; -} - -BOOL Spinner_OnSetPos (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - psi->dwPos = (DWORD)lp; - Spinner_SetNewText (psi, FALSE); - return TRUE; -} - -BOOL Spinner_OnGetBase (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - if (psi->fNewText) - { - Spinner_GetNewText (psi); - Spinner_OnSetBase (psi, psi->wBase, psi->fSigned); - } - - if (wp != 0) - *(WORD *)wp = psi->wBase; - if (lp != 0) - *(BOOL *)lp = psi->fSigned; - return TRUE; -} - -BOOL Spinner_OnSetBase (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - if (psi->fNewText) - Spinner_GetNewText (psi); - - switch ((WORD)wp) - { - case 2: - case 8: - case 10: - case 16: - psi->wBase = (WORD)wp; - break; - - default: - psi->wBase = 10; - break; - } - - if (psi->wBase != 10) - psi->fSigned = FALSE; - else - psi->fSigned = (BOOL)lp; - - Spinner_SetNewText (psi, FALSE); - return TRUE; -} - - -BOOL Spinner_OnReattach (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - RECT rSpinner; - if (psi->rReq.right != 0) - { - rSpinner = psi->rReq; - } - else - { - RECT rBuddyInParent; - POINT pt = { 0, 0 }; - - ClientToScreen (GetParent (psi->hBuddy), &pt); - - GetWindowRect (psi->hBuddy, &rBuddyInParent); - rBuddyInParent.left -= pt.x; - rBuddyInParent.right -= pt.x; - rBuddyInParent.top -= pt.y; - rBuddyInParent.bottom -= pt.y; - - rSpinner.top = rBuddyInParent.top; - rSpinner.bottom = rBuddyInParent.bottom -2; // just like Win95 does - rSpinner.left = rBuddyInParent.right; - rSpinner.right = rBuddyInParent.right +GetSystemMetrics (SM_CXVSCROLL); - } - - SetWindowPos (psi->hSpinner, NULL, - rSpinner.left, rSpinner.top, - rSpinner.right-rSpinner.left, - rSpinner.bottom-rSpinner.top, - SWP_NOACTIVATE | SWP_NOZORDER); - return TRUE; -} - - -BOOL Spinner_OnSetRect (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - LPRECT prTarget; - if ((prTarget = (LPRECT)lp) == NULL) - SetRectEmpty (&psi->rReq); - else - psi->rReq = *prTarget; - - Spinner_OnReattach (psi, 0, 0); - return TRUE; -} - - -BOOL Spinner_OnGetSpinner (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - return (BOOL)psi->hSpinner; -} - - -BOOL Spinner_OnSetFormat (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - if (psi->pszFormat) - { - Free (psi->pszFormat); - psi->pszFormat = NULL; - } - if (lp != 0) - { - psi->pszFormat = (LPTSTR)Allocate (sizeof(TCHAR) * (1+lstrlen((LPTSTR)lp))); - lstrcpy (psi->pszFormat, (LPTSTR)lp); - } - Spinner_SetNewText (psi, FALSE); - return TRUE; -} - - -BOOL Spinner_OnSetBuddy (SpinnerInfo *psi, WPARAM wp, LPARAM lp) -{ - HWND hBuddyNew = (HWND)wp; - BOOL fMove = (BOOL)lp; - - // First un-subclass our buddy. - // Then subclass the new buddy. - // - Subclass_RemoveHook (psi->hBuddy, SpinnerBuddyProc); - psi->hBuddy = hBuddyNew; - Subclass_AddHook (psi->hBuddy, SpinnerBuddyProc); - - // Update our SpinnerInfo structure, and move if requested. - // - Spinner_GetNewText (psi); - - if (fMove) - { - SetRectEmpty (&psi->rReq); - Spinner_OnReattach (psi, 0, 0); - } - - return TRUE; -} - - -void Spinner_GetNewText (SpinnerInfo *psi) -{ - // First find out what kind of buddy we have. - // That will determine what we do here. - // - TCHAR szBuddyClass[256]; - GetClassName (psi->hBuddy, szBuddyClass, 256); - - // For comboboxes and listboxes, the dwPos value is actually - // the selected item's index. - // - if (!lstrcmpi (szBuddyClass, TEXT("listbox"))) - { - psi->dwPos = (DWORD)LB_GetSelected (psi->hBuddy); - } - - if (!lstrcmpi (szBuddyClass, TEXT("combobox"))) - { - psi->dwPos = (DWORD)CB_GetSelected (psi->hBuddy); - } - - // For edit controls, the dwPos value is actually - // the control's text's value. - // - if (!lstrcmpi (szBuddyClass, TEXT("edit"))) - { - TCHAR szText[256]; - LPTSTR pszText = szText; - BOOL fNegative = FALSE; - - psi->fNewText = FALSE; - psi->dwPos = 0; - psi->wBase = 10; - - GetWindowText (psi->hBuddy, szText, 256); - - while (*pszText == TEXT(' ') || *pszText == TEXT('\t')) - ++pszText; - - if (*pszText == TEXT('0')) - { - if ((*(1+pszText) == 'x') || (*(1+pszText) == 'X')) - { - psi->wBase = 16; - ++pszText; - ++pszText; - } - else if ((*(1+pszText) == 'b') || (*(1+pszText) == 'B') || (*(1+pszText) == '!')) - { - psi->wBase = 2; - ++pszText; - ++pszText; - } - else if (*(1+pszText) != '\0') - { - // psi->wBase = 8; // ignore octal--time controls use "4:08" etc - ++pszText; - } - } - - for ( ; *pszText == TEXT('-'); ++pszText) - { - fNegative = !fNegative; - } - - for ( ; *pszText; ++pszText) - { - if (!isdigit( *pszText ) && - !(psi->wBase == 16 && ishexdigit( *pszText ))) - { - break; - } - - psi->dwPos *= psi->wBase; - - if ((DWORD)digitval(*pszText) < (DWORD)psi->wBase) - psi->dwPos += digitval( *pszText ); - } - - if (fNegative && psi->wBase == 10 && psi->fSigned) - { - psi->dwPos = (DWORD)(0 - (signed long)psi->dwPos); - } - } - - if (psi->wBase == 10 && psi->fSigned) - psi->dwPos = (DWORD)limit ((signed long)psi->dwMin, (signed long)psi->dwPos, (signed long)psi->dwMax); - else - psi->dwPos = (DWORD)limit (psi->dwMin, psi->dwPos, psi->dwMax); -} - - -void Spinner_SetNewText (SpinnerInfo *psi, BOOL fCallBack) -{ - TCHAR szText[256]; - - // First find out what kind of buddy we have. - // That will determine what we do here. - // - TCHAR szBuddyClass[256]; - GetClassName (psi->hBuddy, szBuddyClass, 256); - - // Be sure to notify the parent window that the selection may be changing. - // - if (fCallBack) - { - DWORD dw = psi->dwPos; - SpinnerSendCallback (psi, SPN_CHANGE, (LPARAM)&dw); - if (dw != SPVAL_UNCHANGED) - psi->dwPos = dw; - } - - if (psi->wBase == 10 && psi->fSigned) - psi->dwPos = (DWORD)limit ((signed long)psi->dwMin, (signed long)psi->dwPos, (signed long)psi->dwMax); - else - psi->dwPos = (DWORD)limit (psi->dwMin, psi->dwPos, psi->dwMax); - - if (!fCallBack) - psi->fCanCallBack --; - - // For comboboxes and listboxes, select the item specified by the - // given index. - // - if (!lstrcmpi (szBuddyClass, TEXT("listbox"))) - { - LB_SetSelected (psi->hBuddy, psi->dwPos); - } - - if (!lstrcmpi (szBuddyClass, TEXT("combobox"))) - { - CB_SetSelected (psi->hBuddy, psi->dwPos); - } - - // For edit controls, fill in the new value as text--expressed in the - // requested base, using the requested format. - // - if (!lstrcmpi (szBuddyClass, TEXT("edit"))) - { - switch (psi->wBase) - { - case 10: - if (psi->pszFormat) - wsprintf (szText, psi->pszFormat, (unsigned long)psi->dwPos); - else if (psi->fSigned) - wsprintf (szText, TEXT("%ld"), (signed long)psi->dwPos); - else - wsprintf (szText, TEXT("%lu"), (unsigned long)psi->dwPos); - break; - - case 16: - wsprintf (szText, TEXT("0x%lX"), (unsigned long)psi->dwPos); - break; - - default: - TCHAR szTemp[256]; - LPTSTR pszTemp = szTemp; - LPTSTR pszText = szText; - - if (psi->dwPos == 0) - *pszTemp++ = TEXT('0'); - else - { - for (DWORD dwRemainder = psi->dwPos; dwRemainder != 0; dwRemainder /= (DWORD)psi->wBase) - { - DWORD dw = (dwRemainder % (DWORD)psi->wBase); - *pszTemp++ = TEXT('0') + (TCHAR)dw; - } - } - - if (psi->wBase == 8) - { - *pszText++ = TEXT('0'); - } - else if (psi->wBase == 2) - { - *pszText++ = TEXT('0'); - *pszText++ = TEXT('b'); - } - - for (--pszTemp; pszTemp >= szTemp; ) - { - *pszText++ = *pszTemp--; - } - *pszText = TEXT('\0'); - break; - } - - SetWindowText (psi->hBuddy, szText); - } - - if (!fCallBack) - psi->fCanCallBack ++; - else - SpinnerSendCallback (psi, SPN_UPDATE, (LPARAM)psi->dwPos); -} - diff --git a/src/WINNT/afsapplib/ctl_spinner.h b/src/WINNT/afsapplib/ctl_spinner.h deleted file mode 100644 index 1328c82bd..000000000 --- a/src/WINNT/afsapplib/ctl_spinner.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CTL_SPINNER_H -#define CTL_SPINNER_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef limit -#define limit(_a,_x,_b) min( max( (_x), (_a) ), (_b) ) -#endif - -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (((_x)>=(_a)) && ((_x)<=(_b))) ? TRUE : FALSE ) -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -EXPORTED BOOL RegisterSpinnerClass (void); - -// NOTE: All messages are sent to the buddy control, and all notifications -// come back through WM_COMMAND:LOWORD(wp)==buddy,HIWORD(wp)=SPN_code,lp=param -// -#define SPM_GETRANGE (WM_USER+301) -#define SPM_SETRANGE (WM_USER+302) -#define SPM_GETPOS (WM_USER+303) -#define SPM_SETPOS (WM_USER+304) -#define SPM_GETBASE (WM_USER+305) -#define SPM_SETBASE (WM_USER+306) -#define SPM_REATTACH (WM_USER+307) -#define SPM_SETRECT (WM_USER+308) -#define SPM_GETSPINNER (WM_USER+309) -#define SPM_SETFORMAT (WM_USER+310) -#define SPM_SETBUDDY (WM_USER+311) - -#define SPN_CHANGE_UP 0x1001 // DWORD *pdwValue = lp; -#define SPN_CHANGE_DOWN 0x1002 // DWORD *pdwValue = lp; -#define SPN_CHANGE 0x1003 // DWORD *pdwValue = lp; -#define SPN_UPDATE 0x1004 // DWORD dwNew = lp; - -#define SPVAL_UNCHANGED (DWORD)0x7FFFFFFF - -EXPORTED BOOL CreateSpinner (HWND hBuddy, - WORD wBase = 10, BOOL fSigned = FALSE, - DWORD dwMin = 0, DWORD dwPos = 100, DWORD dwMax = 100, - LPRECT prTarget = NULL); - -EXPORTED BOOL fHasSpinner (HWND hBuddy); - -/* - * void SP_GetRange (HWND hBuddy, DWORD *pdwMin, DWORD *pdwMax) - * void SP_SetRange (HWND hBuddy, DWORD dwMin, DWORD dwMax) - * - */ -#define SP_GetRange(_hb,_pdwMin,_pdwMax) \ - SendMessage(_hb,SPM_GETRANGE,(WPARAM)_pdwMin,(LPARAM)_pdwMax) -#define SP_SetRange(_hb,_dwMin,_dwMax) \ - SendMessage(_hb,SPM_SETRANGE,(WPARAM)_dwMin,(LPARAM)_dwMax) - -/* - * DWORD SP_GetPos (HWND hBuddy) - * void SP_SetPos (HWND hBuddy, DWORD dwPos) - * - */ -#define SP_GetPos(_hb) \ - SendMessage(_hb,SPM_GETPOS,(WPARAM)0,(LPARAM)0) -#define SP_SetPos(_hb,_dwPos) \ - SendMessage(_hb,SPM_SETPOS,(WPARAM)0,(LPARAM)_dwPos) - -/* - * void SP_GetBase (HWND hBuddy, WORD *pwBase, BOOL *pfSigned) - * void SP_SetBase (HWND hBuddy, WORD wBase, BOOL fSigned) - * - */ -#define SP_GetBase(_hb,_pdwBase,_pfSigned) \ - SendMessage(_hb,SPM_GETBASE,(WPARAM)_pdwBase,(LPARAM)_pfSigned) -#define SP_SetBase(_hb,_wBase,_fSigned) \ - SendMessage(_hb,SPM_SETBASE,(WPARAM)_wBase,(LPARAM)_fSigned) - -/* - * HWND SP_GetSpinner (HWND hBuddy) - * - */ -#define SP_GetSpinner(_hb) \ - (HWND)SendMessage(_hb,SPM_GETSPINNER,(WPARAM)0,(LPARAM)0) - -/* - * void SP_SetRect (HWND hBuddy, LPRECT prTarget) - * - */ -#define SP_SetRect(_hb,_prTarget) \ - SendMessage(_hb,SPM_SETRECT,(WPARAM)0,(LPARAM)_prTarget) - -/* - * void SP_SetFormat (HWND hBuddy, LPTSTR pszFormat) - * (where pszFormat uses "%lu" or "%ld" as appropriate) - * - */ -#define SP_SetFormat(_hb,_pszFormat) \ - SendMessage(_hb,SPM_SETFORMAT,(WPARAM)0,(LPARAM)_pszFormat) - -/* - * void SP_SetBuddy (HWND hOld, HWND hBuddyNew, BOOL fMove) - * - */ -#define SP_SetBuddy(_hb,_hNew,_fMove) \ - SendMessage(_hb,SPM_SETBUDDY,(WPARAM)_hNew,(LPARAM)_fMove) - - -#endif - diff --git a/src/WINNT/afsapplib/ctl_time.cpp b/src/WINNT/afsapplib/ctl_time.cpp deleted file mode 100644 index 1a0629e44..000000000 --- a/src/WINNT/afsapplib/ctl_time.cpp +++ /dev/null @@ -1,809 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include // for GetRectInParent() -#include -#include -#include -#include - -#ifndef cchRESOURCE -#define cchRESOURCE 256 -#endif - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) TimeReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL TimeReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - - -/* - * TIME _______________________________________________________________________ - * - */ - -typedef struct - { - HWND hTime; - HWND hHours; - HWND hSep1; - HWND hMinutes; - HWND hSep2; - HWND hAMPM; - HWND hSpinner; - HWND hSpinnerBuddy; - - WORD idHours; - WORD idMinutes; - WORD idAMPM; - - SYSTEMTIME timeNow; // only hour and minute fields are relevant - - BOOL f24Hour; - BOOL f0Hours; - BOOL fCallingBack; - BOOL fCanCallBack; - } TimeInfo; - -static CRITICAL_SECTION csTime; -static TimeInfo *aTime = NULL; -static size_t cTime = 0; - -#define cszTIMECLASS TEXT("Time") - -BOOL CALLBACK TimeProc (HWND hTime, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK TimeEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK TimeDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Time_SendCallback (TimeInfo *pti, WORD eln, LPARAM lp); - -void Time_OnCreate (TimeInfo *pti); -void Time_OnDestroy (TimeInfo *pti); -void Time_OnButtonDown (TimeInfo *pti, UINT msg, WPARAM wp, LPARAM lp); -BOOL Time_OnGetTime (TimeInfo *pti, WPARAM wp, LPARAM lp); -BOOL Time_OnSetTime (TimeInfo *pti, WPARAM wp, LPARAM lp); - -void Time_Edit_OnSetFocus (TimeInfo *pti, HWND hEdit); -void Time_Edit_OnUpdate (TimeInfo *pti, HWND hEdit); -void Time_Edit_SetText (TimeInfo *pti, HWND hEdit); - -void Time_GetAMPMSize (HDC hdc, SIZE *pSize, LPTSTR pszAM, LPTSTR pszPM); - - -BOOL RegisterTimeClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - InitializeCriticalSection (&csTime); - - WNDCLASS wc; - memset (&wc, 0x00, sizeof(wc)); - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = (WNDPROC)TimeProc; - wc.hInstance = THIS_HINST; - wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE (IDC_ARROW)); - wc.hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - wc.lpszClassName = cszTIMECLASS; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - - return fRegistered; -} - - -void Time_SendCallback (TimeInfo *pti, WORD eln, LPARAM lp) -{ - if ((pti->fCanCallBack == TRUE) && !pti->fCallingBack) - { - pti->fCallingBack = TRUE; - - SendMessage (GetParent (pti->hTime), - WM_COMMAND, - MAKELONG ((WORD)GetWindowLong (pti->hTime, GWL_ID), eln), - lp); - - pti->fCallingBack = FALSE; - } -} - - -BOOL CALLBACK TimeProc (HWND hTime, UINT msg, WPARAM wp, LPARAM lp) -{ - TimeInfo *pti = NULL; - - EnterCriticalSection (&csTime); - - if (msg == WM_CREATE) - { - for (size_t iTime = 0; iTime < cTime; ++iTime) - { - if (aTime[ iTime ].hTime == NULL) - break; - } - if (iTime >= cTime) - { - if (!REALLOC (aTime, cTime, 1+iTime, 4)) - return FALSE; - } - - memset (&aTime[ iTime ], 0x00, sizeof(TimeInfo)); - aTime[ iTime ].hTime = hTime; - - pti = &aTime[ iTime ]; - } - else - { - for (size_t iTime = 0; !pti && iTime < cTime; ++iTime) - { - if (aTime[ iTime ].hTime == hTime) - pti = &aTime[ iTime ]; - } - } - - LeaveCriticalSection (&csTime); - - if (pti != NULL) - { - switch (msg) - { - case WM_CREATE: - Time_OnCreate (pti); - break; - - case WM_DESTROY: - Time_OnDestroy (pti); - break; - - case WM_RBUTTONDOWN: - case WM_LBUTTONDOWN: - Time_OnButtonDown (pti, msg, wp, lp); - break; - - case WM_SETFOCUS: - PostMessage (GetParent(hTime), WM_NEXTDLGCTL, (WPARAM)pti->hHours, TRUE); - break; - - case WM_ENABLE: - EnableWindow (pti->hHours, IsWindowEnabled (hTime)); - EnableWindow (pti->hSep1, IsWindowEnabled (hTime)); - EnableWindow (pti->hMinutes, IsWindowEnabled (hTime)); - EnableWindow (pti->hSpinner, IsWindowEnabled (hTime)); - - if (!pti->f24Hour) - { - EnableWindow (pti->hSep2, IsWindowEnabled (hTime)); - EnableWindow (pti->hAMPM, IsWindowEnabled (hTime)); - } - - RECT rTime; - GetRectInParent (hTime, &rTime); - InvalidateRect (GetParent(hTime), &rTime, TRUE); - UpdateWindow (GetParent(hTime)); - break; - - case WM_SYSCHAR: - case WM_CHAR: - switch (wp) - { - case VK_UP: - PostMessage (GetParent(pti->hSpinner), WM_VSCROLL, SB_LINEUP, (LPARAM)pti->hSpinner); - break; - - case VK_DOWN: - PostMessage (GetParent(pti->hSpinner), WM_VSCROLL, SB_LINEDOWN, (LPARAM)pti->hSpinner); - break; - - case VK_PRIOR: - PostMessage (GetParent(pti->hSpinner), WM_VSCROLL, SB_PAGEUP, (LPARAM)pti->hSpinner); - break; - - case VK_NEXT: - PostMessage (GetParent(pti->hSpinner), WM_VSCROLL, SB_PAGEDOWN, (LPARAM)pti->hSpinner); - break; - - case VK_HOME: - PostMessage (GetParent(pti->hSpinner), WM_VSCROLL, SB_TOP, (LPARAM)pti->hSpinner); - break; - - case VK_END: - PostMessage (GetParent(pti->hSpinner), WM_VSCROLL, SB_BOTTOM, (LPARAM)pti->hSpinner); - break; - } - break; - - case TM_GETTIME: - return Time_OnGetTime (pti, wp, lp); - - case TM_SETTIME: - return Time_OnSetTime (pti, wp, lp); - } - } - - return DefWindowProc (hTime, msg, wp, lp); -} - - -void Time_OnCreate (TimeInfo *pti) -{ - Subclass_AddHook (GetParent(pti->hTime), TimeDlgProc); - - TCHAR szTimeSep[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIME, szTimeSep, cchRESOURCE)) - lstrcpy (szTimeSep, TEXT(":")); - - TCHAR sz24Hour[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, sz24Hour, cchRESOURCE)) - pti->f24Hour = FALSE; - else - pti->f24Hour = (sz24Hour[0] == TEXT('1')) ? TRUE : FALSE; - - TCHAR sz0Hour[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITLZERO, sz0Hour, cchRESOURCE)) - pti->f0Hours = FALSE; - else - pti->f0Hours = (sz0Hour[0] == TEXT('1')) ? TRUE : FALSE; - - RECT rTime; - GetClientRect (pti->hTime, &rTime); - - POINT ptTime = {0,0}; - ClientToScreen (pti->hTime, &ptTime); - ScreenToClient (GetParent (pti->hTime), &ptTime); - - SIZE s88; // size of widest likely double-digit number - SIZE sTimeSep; // size of ":" - SIZE sAMPM; // size of "AM/PM" listbox - TCHAR szAM[ cchRESOURCE ]; - TCHAR szPM[ cchRESOURCE ]; - - HDC hdc = GetDC (GetParent (pti->hTime)); - GetTextExtentPoint (hdc, TEXT("88"), lstrlen(TEXT("88")), &s88); - GetTextExtentPoint (hdc, szTimeSep, lstrlen(szTimeSep), &sTimeSep); - if (!pti->f24Hour) - Time_GetAMPMSize (hdc, &sAMPM, szAM, szPM); - ReleaseDC (GetParent (pti->hTime), hdc); - - LONG cxNumbers = cxRECT(rTime) - GetSystemMetrics (SM_CXVSCROLL) - (sTimeSep.cx); - if (!pti->f24Hour) - cxNumbers -= sTimeSep.cx + sAMPM.cx; - LONG cxMinutes = max( cxNumbers/2, s88.cx ); - LONG cxHours = cxNumbers - cxMinutes; - - cxMinutes = min (cxMinutes, (LONG)( 1.2 * s88.cx )); - cxHours = min (cxHours, (LONG)( 1.2 * s88.cx )); // don't be TOO wide. - - LONG cy = cyRECT(rTime); - LONG yy = ptTime.y; - - pti->idHours = 100+NextControlID (GetParent (pti->hTime)); - pti->hHours = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_MULTILINE | ES_RIGHT | ES_NUMBER, - ptTime.x, yy, cxHours, cy, - GetParent(pti->hTime), - (HMENU)pti->idHours, - THIS_HINST, - 0); - - pti->hSep1 = CreateWindow ( - TEXT("STATIC"), - szTimeSep, - WS_CHILD | SS_CENTER, - ptTime.x + cxHours, yy, sTimeSep.cx, cy, - GetParent(pti->hTime), - (HMENU)-1, - THIS_HINST, - 0); - - pti->idMinutes = 100+NextControlID (GetParent (pti->hTime)); - pti->hMinutes = CreateWindow ( - TEXT("EDIT"), - TEXT(""), - WS_CHILD | WS_TABSTOP | ES_MULTILINE | ES_RIGHT | ES_NUMBER, - ptTime.x + cxHours + sTimeSep.cx, yy, cxMinutes, cy, - GetParent(pti->hTime), - (HMENU)pti->idMinutes, - THIS_HINST, - 0); - - if (!pti->f24Hour) - { - pti->hSep2 = CreateWindow ( - TEXT("STATIC"), - TEXT(""), - WS_CHILD | SS_CENTER, - ptTime.x + cxHours + cxMinutes + sTimeSep.cx, yy, sTimeSep.cx, cy, - GetParent(pti->hTime), - (HMENU)-1, - THIS_HINST, - 0); - - pti->idAMPM = 100+NextControlID (GetParent (pti->hTime)); - pti->hAMPM = CreateWindow ( - TEXT("LISTBOX"), - TEXT(""), - WS_CHILD | WS_TABSTOP | LBS_NOINTEGRALHEIGHT | LBS_HASSTRINGS | LBS_OWNERDRAWFIXED | LBS_NOTIFY, - ptTime.x + cxHours + cxMinutes + 2 * sTimeSep.cx, yy, sAMPM.cx, cy, - GetParent(pti->hTime), - (HMENU)pti->idAMPM, - THIS_HINST, - 0); - } - - Subclass_AddHook (pti->hHours, TimeEditProc); - Subclass_AddHook (pti->hMinutes, TimeEditProc); - - if (!pti->f24Hour) - Subclass_AddHook (pti->hAMPM, TimeEditProc); - - HFONT hf = (HFONT)SendMessage (GetParent (pti->hTime), WM_GETFONT, 0, 0); - SendMessage (pti->hHours, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pti->hSep1, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pti->hMinutes, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - - if (!pti->f24Hour) - { - SendMessage (pti->hSep2, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - SendMessage (pti->hAMPM, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - } - - EnableWindow (pti->hHours, IsWindowEnabled (pti->hTime)); - EnableWindow (pti->hSep1, IsWindowEnabled (pti->hTime)); - EnableWindow (pti->hMinutes, IsWindowEnabled (pti->hTime)); - - if (!pti->f24Hour) - { - EnableWindow (pti->hSep2, IsWindowEnabled (pti->hTime)); - EnableWindow (pti->hAMPM, IsWindowEnabled (pti->hTime)); - - LB_StartChange (pti->hAMPM, TRUE); - LB_AddItem (pti->hAMPM, szAM, 0); - LB_AddItem (pti->hAMPM, szPM, 1); - LB_EndChange (pti->hAMPM); - LB_SetSelected (pti->hAMPM, 1); - } - - ShowWindow (pti->hHours, TRUE); - ShowWindow (pti->hSep1, TRUE); - ShowWindow (pti->hMinutes, TRUE); - - if (!pti->f24Hour) - { - ShowWindow (pti->hSep2, TRUE); - ShowWindow (pti->hAMPM, TRUE); - } - - RECT rWindow; - GetWindowRect (pti->hTime, &rWindow); - rWindow.right += (cxHours + cxMinutes + sTimeSep.cx) - cxRECT(rTime); - if (!pti->f24Hour) - rWindow.right += sTimeSep.cx + sAMPM.cx; - - SetWindowPos (pti->hTime, NULL, 0, 0, cxRECT(rWindow), cyRECT(rWindow), - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - RECT rSpinner; - GetRectInParent (pti->hTime, &rSpinner); - rSpinner.left = rSpinner.right; - rSpinner.right = rSpinner.left + GetSystemMetrics (SM_CXVSCROLL); - rSpinner.bottom -= 2; // just like Win95 does - CreateSpinner (pti->hHours, 10, FALSE, 0, pti->timeNow.wHour, 24, &rSpinner); - pti->hSpinner = SP_GetSpinner (pti->hHours); - pti->hSpinnerBuddy = pti->hHours; - - Time_Edit_SetText (pti, pti->hHours); - Time_Edit_SetText (pti, pti->hMinutes); - Time_Edit_OnSetFocus (pti, pti->hHours); - pti->fCanCallBack = TRUE; -} - - -void Time_OnDestroy (TimeInfo *pti) -{ - Subclass_RemoveHook (GetParent(pti->hTime), TimeDlgProc); - pti->hTime = NULL; -} - - -void Time_OnButtonDown (TimeInfo *pti, UINT msg, WPARAM wp, LPARAM lp) -{ - DWORD dw = GetMessagePos(); - POINT pt; - pt.x = LOWORD(dw); - pt.y = HIWORD(dw); // in screen coordinates - - RECT rTarget; - HWND hTarget = 0; - - GetWindowRect (pti->hHours, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pti->hHours; - - GetWindowRect (pti->hMinutes, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pti->hMinutes; - - if (!pti->f24Hour) - { - GetWindowRect (pti->hAMPM, &rTarget); - if (PtInRect (&rTarget, pt)) - hTarget = pti->hAMPM; - } - - if (hTarget != 0) - { - PostMessage (hTarget, msg, wp, lp); - } -} - - -BOOL Time_OnGetTime (TimeInfo *pti, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *ptime = (SYSTEMTIME*)lp; - ptime->wHour = pti->timeNow.wHour; - ptime->wMinute = pti->timeNow.wMinute; - ptime->wSecond = pti->timeNow.wSecond; - ptime->wMilliseconds = pti->timeNow.wMilliseconds; - return TRUE; -} - - -BOOL Time_OnSetTime (TimeInfo *pti, WPARAM wp, LPARAM lp) -{ - SYSTEMTIME *ptime = (SYSTEMTIME*)lp; - pti->timeNow = *ptime; - - Time_Edit_SetText (pti, pti->hHours); - Time_Edit_SetText (pti, pti->hMinutes); - - return TRUE; -} - - -BOOL CALLBACK TimeDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, TimeDlgProc); - size_t iTime; - - switch (msg) - { - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: - case WM_CTLCOLORLISTBOX: - for (iTime = 0; iTime < cTime; ++iTime) - { - if (aTime[ iTime ].hTime == NULL) - continue; - if ( (aTime[ iTime ].hHours == (HWND)lp) || - (aTime[ iTime ].hSep1 == (HWND)lp) || - (aTime[ iTime ].hMinutes == (HWND)lp) || - ((!aTime[ iTime ].f24Hour) && (aTime[ iTime ].hSep2 == (HWND)lp)) || - ((!aTime[ iTime ].f24Hour) && (aTime[ iTime ].hAMPM == (HWND)lp)) ) - { - COLORREF clr; - if (IsWindowEnabled (aTime[ iTime ].hTime)) - clr = GetSysColor (COLOR_WINDOW); - else - clr = GetSysColor (COLOR_BTNFACE); - SetBkColor ((HDC)wp, clr); - return (BOOL)CreateSolidBrush (clr); - } - } - break; - - case WM_MEASUREITEM: - LPMEASUREITEMSTRUCT lpmis; - lpmis = (LPMEASUREITEMSTRUCT)lp; - HDC hdc; - hdc = GetDC (hDlg); - SIZE sAMPM; - Time_GetAMPMSize (hdc, &sAMPM, NULL, NULL); - ReleaseDC (hDlg, hdc); - lpmis->itemHeight = sAMPM.cy; - return TRUE; - - case WM_DRAWITEM: - LPDRAWITEMSTRUCT lpdis; - lpdis = (LPDRAWITEMSTRUCT)lp; - - COLORREF clrBack; - COLORREF clrFore; - if (!IsWindowEnabled (lpdis->hwndItem)) - { - clrBack = GetSysColor (COLOR_BTNFACE); - clrFore = GetSysColor (COLOR_GRAYTEXT); - } - else if ((lpdis->itemState & ODS_SELECTED) && (GetFocus() == lpdis->hwndItem)) - { - clrBack = GetSysColor (COLOR_HIGHLIGHT); - clrFore = GetSysColor (COLOR_HIGHLIGHTTEXT); - } - else - { - clrBack = GetSysColor (COLOR_WINDOW); - clrFore = GetSysColor (COLOR_BTNTEXT); - } - - TCHAR szText[ cchRESOURCE ]; - SendMessage (lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, (LPARAM)szText); - - SetTextColor (lpdis->hDC, clrFore); - SetBkColor (lpdis->hDC, clrBack); - SetBkMode (lpdis->hDC, OPAQUE); - TextOut (lpdis->hDC, 0, lpdis->rcItem.top, szText, lstrlen(szText)); - return TRUE; - - case WM_COMMAND: - for (iTime = 0; iTime < cTime; ++iTime) - { - if (aTime[ iTime ].hTime == NULL) - continue; - if ( (aTime[ iTime ].idHours == LOWORD(wp)) || - (aTime[ iTime ].idMinutes == LOWORD(wp)) || - ((!aTime[ iTime ].f24Hour) && (aTime[ iTime ].idAMPM == LOWORD(wp))) ) - { - if (HIWORD(wp) == SPN_UPDATE) - { - Time_Edit_OnUpdate (&aTime[ iTime ], GetDlgItem(hDlg,LOWORD(wp))); - } - break; - } - } - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); - else - return DefWindowProc (hDlg, msg, wp, lp); -} - - -BOOL CALLBACK TimeEditProc (HWND hEdit, UINT msg, WPARAM wp, LPARAM lp) -{ - TimeInfo *pti = NULL; - - EnterCriticalSection (&csTime); - - for (size_t iTime = 0; !pti && iTime < cTime; ++iTime) - { - if ( (aTime[ iTime ].hHours == hEdit) || - (aTime[ iTime ].hMinutes == hEdit) || - ((!aTime[ iTime ].f24Hour) && (aTime[ iTime ].hAMPM == hEdit)) ) - { - pti = &aTime[ iTime ]; - } - } - - LeaveCriticalSection (&csTime); - - if (pti) - { - switch (msg) - { - case WM_SETFOCUS: - Time_Edit_OnSetFocus (pti, hEdit); - break; - } - } - - PVOID oldProc = Subclass_FindNextHook (hEdit, TimeEditProc); - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hEdit, msg, wp, lp); - else - return DefWindowProc (hEdit, msg, wp, lp); -} - - -void Time_Edit_OnSetFocus (TimeInfo *pti, HWND hEdit) -{ - DWORD dwMin; - DWORD dwNow; - DWORD dwMax; - - pti->fCanCallBack --; - - if (hEdit == pti->hHours) - { - dwMin = (pti->f24Hour) ? 0 : 1; - dwNow = (pti->f24Hour) ? pti->timeNow.wHour : (pti->timeNow.wHour % 12); - dwMax = (pti->f24Hour) ? 24 : 12; - - if (!pti->f24Hour && !dwNow) - dwNow = 12; - } - else if (hEdit == pti->hMinutes) - { - dwMin = 0; - dwNow = pti->timeNow.wMinute; - dwMax = 59; - } - else // (hEdit == pti->hAMPM) - { - dwMin = 0; - dwNow = (pti->timeNow.wHour >= 12) ? 1 : 0; - dwMax = 1; - } - - if (pti->hSpinnerBuddy != hEdit) - { - SP_SetBuddy (pti->hSpinnerBuddy, hEdit, FALSE); - pti->hSpinnerBuddy = hEdit; - } - - SP_SetRange (hEdit, dwMin, dwMax); - SP_SetPos (hEdit, dwNow); - - if ((hEdit == pti->hHours) && (!pti->f0Hours)) - SP_SetFormat (hEdit, TEXT("%lu")); - else if ((hEdit == pti->hHours) || (hEdit == pti->hMinutes)) - SP_SetFormat (hEdit, TEXT("%02lu")); - - if ((hEdit == pti->hHours) || (hEdit == pti->hMinutes)) - SendMessage (hEdit, EM_SETSEL, (WPARAM)0, (LPARAM)-1); // select all - - pti->fCanCallBack ++; -} - - -void Time_Edit_OnUpdate (TimeInfo *pti, HWND hEdit) -{ - TCHAR szText[ cchRESOURCE ]; - - if ((hEdit == pti->hHours) || (hEdit == pti->hAMPM)) - { - GetWindowText (pti->hHours, szText, 256); - pti->timeNow.wHour = (WORD)atol (szText); - - if (!pti->f24Hour) - { - if ((pti->timeNow.wHour < 12) && (LB_GetSelected (pti->hAMPM) == 1)) - pti->timeNow.wHour += 12; - else if ((pti->timeNow.wHour >= 12) && (LB_GetSelected (pti->hAMPM) == 0)) - pti->timeNow.wHour -= 12; - } - } - - if (hEdit == pti->hMinutes) - { - GetWindowText (pti->hMinutes, szText, 256); - pti->timeNow.wMinute = (WORD)atol (szText); - } - - if ((pti->timeNow.wHour == 24) && (pti->timeNow.wMinute != 0)) - { - pti->timeNow.wMinute = 0; - Time_Edit_SetText (pti, pti->hMinutes); - } - - SYSTEMTIME st = pti->timeNow; - Time_SendCallback (pti, TN_UPDATE, (LPARAM)&st); -} - - -void Time_Edit_SetText (TimeInfo *pti, HWND hEdit) -{ - DWORD dwNow; - - if (hEdit == pti->hHours) - { - BOOL fPM = (pti->timeNow.wHour >= 12) ? TRUE : FALSE; - - if (pti->f24Hour) - dwNow = pti->timeNow.wHour; - else if ((dwNow = pti->timeNow.wHour % 12) == 0) - dwNow = 12; - - if (pti->hSpinnerBuddy == hEdit) - { - SP_SetPos (hEdit, dwNow); - } - else - { - TCHAR szText[ cchRESOURCE ]; - - if (!pti->f0Hours) - wsprintf (szText, TEXT("%lu"), dwNow); - else - wsprintf (szText, TEXT("%02lu"), dwNow); - - SetWindowText (hEdit, szText); - } - - if (!pti->f24Hour) - { - LB_SetSelected (pti->hAMPM, (int)fPM); - } - } - else if (hEdit == pti->hMinutes) - { - if (pti->hSpinnerBuddy == hEdit) - { - SP_SetPos (hEdit, pti->timeNow.wMinute); - } - else - { - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%02lu"), pti->timeNow.wMinute); - SetWindowText (hEdit, szText); - } - } -} - - -void Time_GetAMPMSize (HDC hdc, SIZE *pSize, LPTSTR pszAM, LPTSTR pszPM) -{ - TCHAR szAM[ cchRESOURCE ]; - TCHAR szPM[ cchRESOURCE ]; - if (!pszAM) - pszAM = szAM; - if (!pszPM) - pszPM = szPM; - - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_S1159, pszAM, cchRESOURCE)) - lstrcpy (pszAM, TEXT("AM")); - - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_S2359, pszPM, cchRESOURCE)) - lstrcpy (pszPM, TEXT("PM")); - - SIZE sAM; // size of "AM" - GetTextExtentPoint (hdc, pszAM, lstrlen(pszAM), &sAM); - - SIZE sPM; // size of "PM" - GetTextExtentPoint (hdc, pszPM, lstrlen(pszPM), &sPM); - pSize->cx = max( sAM.cx, sPM.cx ); - pSize->cy = max( sAM.cy, sPM.cy ); -} - diff --git a/src/WINNT/afsapplib/ctl_time.h b/src/WINNT/afsapplib/ctl_time.h deleted file mode 100644 index 50b15c1ce..000000000 --- a/src/WINNT/afsapplib/ctl_time.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CTL_TIME_H -#define CTL_TIME_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef limit -#define limit(_a,_x,_b) min( max( (_x), (_a) ), (_b) ) -#endif - -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (((_x)>=(_a)) && ((_x)<=(_b))) ? TRUE : FALSE ) -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -EXPORTED BOOL RegisterTimeClass (void); - -#define TM_GETTIME (WM_USER+311) // SYSTEMTIME *pTime = lp; -#define TM_SETTIME (WM_USER+312) // SYSTEMTIME *pTime = lp; - -#define TN_CHANGE 0x1005 // SYSTEMTIME *pTime = lp; -#define TN_UPDATE 0x1006 // SYSTEMTIME *pTime = lp; - -/* - * void TI_GetTime (HWND hTime, SYSTEMTIME *pTime) - * void TI_SetTime (HWND hTime, SYSTEMTIME *pTime) - * - */ -#define TI_GetTime(_htime,_pTime) \ - SendMessage(_htime,TM_GETTIME,(WPARAM)0,(LPARAM)_pTime) -#define TI_SetTime(_htime,_pTime) \ - SendMessage(_htime,TM_SETTIME,(WPARAM)0,(LPARAM)_pTime) - - -#endif - diff --git a/src/WINNT/afsapplib/dialog.cpp b/src/WINNT/afsapplib/dialog.cpp deleted file mode 100644 index 96243139f..000000000 --- a/src/WINNT/afsapplib/dialog.cpp +++ /dev/null @@ -1,1908 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef FORWARD_WM_COMMAND -#undef FORWARD_WM_COMMAND -#endif -#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \ - (fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl)) - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) DialogReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL DialogReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -void DialogGetRectInParent (HWND hWnd, RECT *pr) -{ - POINT pt; - - GetWindowRect (hWnd, pr); - - pr->right -= pr->left; - pr->bottom -= pr->top; // right/bottom == width/height for now - - pt.x = pr->left; - pt.y = pr->top; - - ScreenToClient (GetParent (hWnd), &pt); - - pr->left = pt.x; - pr->top = pt.y; - pr->right += pr->left; - pr->bottom += pr->top; -} - - -/* - * PROPERTY SHEETS ____________________________________________________________ - * - */ - -BOOL PropSheet_HandleNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_NOTIFY: - switch (((NMHDR FAR *)lp)->code) - { - case PSN_KILLACTIVE: - FORWARD_WM_COMMAND (hDlg, IDOK, 0, 0, SendMessage); - return TRUE; - case PSN_APPLY: - FORWARD_WM_COMMAND (hDlg, IDAPPLY, 0, 0, SendMessage); - return TRUE; - case PSN_HELP: - FORWARD_WM_COMMAND (hDlg, IDHELP, 0, 0, SendMessage); - return TRUE; - case PSN_SETACTIVE: - FORWARD_WM_COMMAND (hDlg, IDINIT, wp, lp, SendMessage); - return TRUE; - case PSN_RESET: - FORWARD_WM_COMMAND (hDlg, IDCANCEL, 0, 0, SendMessage); - return TRUE; - } - break; - } - - return FALSE; -} - - -static struct - { - BOOL fInUse; - HWND hSheet; - LPPROPSHEET psh; - size_t cRef; - } *aPropSheets = NULL; - -static size_t cPropSheets = 0; - - -BOOL CALLBACK PropTab_HookProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (PropSheet_HandleNotify (hDlg, msg, wp, lp)) - return TRUE; - - HWND hSheet = GetParent (hDlg); - HWND hTab = GetDlgItem (hSheet, IDC_PROPSHEET_TABCTRL); - - if (IsWindow (hTab)) - { - for (size_t ii = 0; ii < cPropSheets; ++ii) - { - if (aPropSheets[ii].fInUse && (aPropSheets[ii].hSheet == hSheet)) - break; - } - if (ii >= cPropSheets) - { - for (size_t ii = 0; ii < cPropSheets; ++ii) - { - if (aPropSheets[ii].fInUse && !aPropSheets[ii].hSheet) - { - aPropSheets[ii].hSheet = hSheet; - break; - } - } - } - if (ii < cPropSheets) - { - for (size_t iTab = 0; iTab < aPropSheets[ii].psh->cTabs; ++iTab) - { - if (aPropSheets[ii].psh->aTabs[iTab].hDlg == hDlg) - break; - } - if (iTab == aPropSheets[ii].psh->cTabs) - { - iTab = (size_t)TabCtrl_GetCurSel (hTab); - } - if (iTab < aPropSheets[ii].psh->cTabs) - { - aPropSheets[ii].psh->aTabs[iTab].hDlg = hDlg; - BOOL rc = CallWindowProc ((WNDPROC)(aPropSheets[ ii ].psh->aTabs[ iTab ].dlgproc), hDlg, msg, wp, lp); - - switch (msg) - { - case WM_INITDIALOG: - ++ aPropSheets[ ii ].cRef; - break; - - case WM_DESTROY: - if (!(-- aPropSheets[ ii ].cRef)) - { - PropSheet_Free (aPropSheets[ ii ].psh); - aPropSheets[ ii ].fInUse = FALSE; - } - break; - } - - return rc; - } - } - } - - return DefWindowProc (hDlg, msg, wp, lp); - -} - - -LPPROPSHEET PropSheet_Create (LONG idsTitle, BOOL fContextHelp, HWND hParent, LPARAM lp) -{ - LPPROPSHEET psh = New (PROPSHEET); - memset (psh, 0x00, sizeof(PROPSHEET)); - psh->sh.dwSize = sizeof(PROPSHEETHEADER); - psh->sh.dwFlags = PSH_MODELESS | ((fContextHelp) ? PSH_HASHELP : 0); - psh->sh.hwndParent = hParent; - psh->sh.hInstance = THIS_HINST; - psh->sh.pszCaption = (HIWORD(idsTitle)) ? (LPTSTR)idsTitle : FormatString(TEXT("%1"),TEXT("%m"),idsTitle); - psh->fMadeCaption = (HIWORD(idsTitle)) ? FALSE : TRUE; - psh->lpUser = lp; - return psh; -} - -LPPROPSHEET PropSheet_Create (int idsTitle, BOOL fContextHelp, HWND hParent, LPARAM lp) -{ - return PropSheet_Create ((LONG)idsTitle, fContextHelp, hParent, lp); -} - -LPPROPSHEET PropSheet_Create (LPTSTR pszTitle, BOOL fContextHelp, HWND hParent, LPARAM lp) -{ - return PropSheet_Create ((LONG)pszTitle, fContextHelp, hParent, lp); -} - - -BOOL PropSheet_AddTab (LPPROPSHEET psh, LONG idsTitle, int idd, DLGPROC dlgproc, LPARAM lpUser, BOOL fHelpButton, BOOL fStartPage) -{ - TCHAR szTitle[ cchRESOURCE ]; - - PROPSHEETPAGE psp; - memset (&psp, 0x00, sizeof(psp)); - psp.dwSize = sizeof(PROPSHEETPAGE); - psp.dwFlags = PSP_DEFAULT | PSP_DLGINDIRECT | (fHelpButton ? PSP_HASHELP : 0); - psp.pResource = TaLocale_GetDialogResource (idd, &psp.hInstance); - psp.pfnDlgProc = (DLGPROC)PropTab_HookProc; - psp.lParam = lpUser; - - // When first creating the PROPSHEET structure, we had to guess about - // which module the tabs would be coming from. Now that we have at least - // one tab, we can correct that guess. - // - psh->sh.hInstance = psp.hInstance; - - if (HIWORD(idsTitle)) - { - psp.pszTitle = (LPTSTR)idsTitle; - psp.dwFlags |= PSP_USETITLE; - } - else if (idsTitle != 0) - { - GetString (szTitle, idsTitle); - psp.pszTitle = szTitle; - psp.dwFlags |= PSP_USETITLE; - } - - HPROPSHEETPAGE hp; - if ((hp = CreatePropertySheetPage (&psp)) == 0) - return FALSE; - - if (!REALLOC( psh->sh.phpage, psh->sh.nPages, 1+psh->sh.nPages, 1)) - return FALSE; - - if (!REALLOC( psh->aTabs, psh->cTabs, psh->sh.nPages, 1)) - return FALSE; - - psh->aTabs[ psh->sh.nPages-1 ].dlgproc = dlgproc; - psh->aTabs[ psh->sh.nPages-1 ].lpUser = lpUser; - psh->aTabs[ psh->sh.nPages-1 ].hDlg = 0; - - psh->sh.phpage[ psh->sh.nPages-1 ] = hp; - if (fStartPage) - psh->sh.nStartPage = psh->sh.nPages-1; - - return TRUE; -} - -BOOL PropSheet_AddTab (LPPROPSHEET psh, int idsTitle, int idd, DLGPROC dlgproc, LPARAM lpUser, BOOL fHelpButton, BOOL fStartPage) -{ - return PropSheet_AddTab (psh, (LONG)idsTitle, idd, dlgproc, lpUser, fHelpButton, fStartPage); -} - -BOOL PropSheet_AddTab (LPPROPSHEET psh, LPTSTR pszTitle, int idd, DLGPROC dlgproc, LPARAM lpUser, BOOL fHelpButton, BOOL fStartPage) -{ - return PropSheet_AddTab (psh, (LONG)pszTitle, idd, dlgproc, lpUser, fHelpButton, fStartPage); -} - - -void PropSheet_NotifyAllTabs (LPPROPSHEET psh, HWND hDlg, UINT msg) -{ - for (size_t ii = 0; ii < psh->cTabs; ++ii) - { - if (psh->aTabs[ ii ].dlgproc) - { - CallWindowProc ((WNDPROC)(psh->aTabs[ ii ].dlgproc), hDlg, msg, (WPARAM)psh, psh->aTabs[ ii ].lpUser); - } - } -} - - -BOOL CALLBACK PropSheet_HookProc (HWND hSheet, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldproc = Subclass_FindNextHook (hSheet, PropSheet_HookProc); - - BOOL rc; - if (oldproc) - rc = CallWindowProc ((WNDPROC)oldproc, hSheet, msg, wp, lp); - else - rc = DefWindowProc (hSheet, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - size_t ii; - for (ii = 0; ii < cPropSheets; ++ii) - { - if (aPropSheets[ii].fInUse && (aPropSheets[ii].hSheet == hSheet)) - break; - } - if (ii < cPropSheets) - { - for (size_t iTab = 0; iTab < aPropSheets[ii].psh->cTabs; ++iTab) - { - if ( (aPropSheets[ii].psh->aTabs[iTab].hDlg) && - (IsWindow (aPropSheets[ii].psh->aTabs[iTab].hDlg)) && - (aPropSheets[ii].psh->aTabs[iTab].dlgproc != NULL) ) - { - DestroyWindow (aPropSheets[ii].psh->aTabs[iTab].hDlg); - } - } - - PropSheet_NotifyAllTabs (aPropSheets[ ii ].psh, hSheet, WM_DESTROY_SHEET); - - if (!(-- aPropSheets[ ii ].cRef)) - { - PropSheet_Free (aPropSheets[ ii ].psh); - aPropSheets[ ii ].fInUse = FALSE; - } - } - - Subclass_RemoveHook (hSheet, PropSheet_HookProc); - break; - } - - return rc; -} - - -LPARAM PropSheet_FindTabParam (HWND hTab) -{ - for (size_t ii = 0; ii < cPropSheets; ++ii) - { - if (aPropSheets[ii].fInUse && (aPropSheets[ii].hSheet == hTab)) - return aPropSheets[ii].psh->lpUser; - } - - HWND hSheet = GetParent (hTab); - for (ii = 0; ii < cPropSheets; ++ii) - { - if (aPropSheets[ii].fInUse && (aPropSheets[ii].hSheet == hSheet)) - break; - } - if (ii < cPropSheets) - { - for (size_t iTab = 0; iTab < aPropSheets[ ii ].psh->cTabs; ++iTab) - { - if (hTab == aPropSheets[ ii ].psh->aTabs[ iTab ].hDlg) - return aPropSheets[ ii ].psh->aTabs[ iTab ].lpUser; - } - } - - return 0; -} - - -BOOL PropSheet_ShowModal (LPPROPSHEET psh, void (*fnPump)(MSG *lpm)) -{ - HWND hSheet; - if ((hSheet = PropSheet_ShowModeless (psh, SW_SHOW)) == NULL) - return FALSE; - - BOOL fWasEnabled = TRUE; - HWND hParent = psh->sh.hwndParent; - if (hParent && IsWindow (hParent)) - { - fWasEnabled = IsWindowEnabled (hParent); - EnableWindow (hParent, FALSE); - } - - MSG msg; - while (GetMessage (&msg, NULL, 0, 0)) - { - if (IsMemoryManagerMessage (&msg)) - continue; - - if (!PropSheet_GetCurrentPageHwnd (hSheet)) - { - if (hParent && IsWindow (hParent)) - EnableWindow (hParent, fWasEnabled); - DestroyWindow (hSheet); - } - - if (!IsWindow (hSheet)) - { - if (fnPump) - (*fnPump)(&msg); - else - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - break; - } - - if (PropSheet_IsDialogMessage (hSheet, &msg)) - continue; - - if (fnPump) - (*fnPump)(&msg); - else - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - } - - if (hParent && IsWindow (hParent)) - EnableWindow (hParent, fWasEnabled); - - return TRUE; -} - - -HWND PropSheet_ShowModeless (LPPROPSHEET psh, int nCmdShow) -{ - // Write down that we're opening a property sheet. Since we - // don't know the window handle yet, we'll set it to zero-- - // when PropSheetTab_HookProc gets called for a property sheet - // that doesn't seem to be listed, it will write down hSheet for us. - // This way, we get the aPropSheets[] array filled in--complete with - // window handle--*before* the tabs themselves get any messages. - // Otherwise, we'd have to wait until the WM_INITDIALOG/IDINIT - // messages were finished. - // - for (size_t ii = 0; ii < cPropSheets; ++ii) - { - if (!aPropSheets[ ii ].fInUse) - break; - } - if (!REALLOC (aPropSheets, cPropSheets, 1+ii, 4)) - return NULL; - aPropSheets[ ii ].fInUse = TRUE; - aPropSheets[ ii ].hSheet = 0; - aPropSheets[ ii ].psh = psh; - aPropSheets[ ii ].cRef = 1; - - // Open the property sheet dialog. - // - psh->sh.dwFlags |= PSH_MODELESS; - - HWND hSheet; - if ((hSheet = (HWND)PropertySheet (&psh->sh)) == NULL) - return NULL; - - // Tell all tabs (not just the first one) that the sheet has been - // created. We'll also want to hook the sheet itself here, so we can - // clean up when it's destroyed. - // - Subclass_AddHook (hSheet, PropSheet_HookProc); - PropSheet_NotifyAllTabs (psh, hSheet, WM_INITDIALOG_SHEET); - ShowWindow (hSheet, nCmdShow); - - return hSheet; -} - - -void PropSheet_Free (LPPROPSHEET psh) -{ - if (psh) - { - if (psh->sh.phpage) - { - Free (psh->sh.phpage); - } - if (psh->fMadeCaption && psh->sh.pszCaption) - { - FreeString (psh->sh.pszCaption); - } - if (psh->aTabs) - { - Free (psh->aTabs); - } - - Delete (psh); - } -} - - -HWND PropSheet_FindTabWindow (LPPROPSHEET psh, DLGPROC dlgproc) -{ - if (psh) - { - for (size_t iTab = 0; iTab < psh->cTabs; ++iTab) - { - if (dlgproc == psh->aTabs[ iTab ].dlgproc) - return psh->aTabs[ iTab ].hDlg; - } - } - return NULL; -} - - -void PropSheetChanged (HWND hDlg) -{ - PropSheet_Changed (GetParent(hDlg), hDlg); -} - - -void TabCtrl_SwitchToTab (HWND hTab, int iTab) -{ - TabCtrl_SetCurSel (hTab, iTab); - - NMHDR nm; - nm.hwndFrom = hTab; - nm.idFrom = IDC_PROPSHEET_TABCTRL; - nm.code = TCN_SELCHANGE; - SendMessage (GetParent (hTab), WM_NOTIFY, 0, (LPARAM)&nm); -} - - -/* - * LISTVIEW ___________________________________________________________________ - * - */ - -LPARAM FL_StartChange (HWND hList, BOOL fReset) -{ - LPARAM dwSelected = FL_GetSelectedData (hList); - FastList_Begin (hList); - if (fReset) - FastList_RemoveAll (hList); - return dwSelected; -} - - -void FL_EndChange (HWND hList, LPARAM lpToSelect) -{ - if (lpToSelect != 0) - FL_SetSelectedByData (hList, lpToSelect); - FastList_EndAll (hList); -} - - -void FL_ResizeColumns (HWND hList, WORD nCols, WORD *acx) -{ - for (WORD ii = 0; ii < nCols; ++ii) - { - FASTLISTCOLUMN flc; - FastList_GetColumn (hList, ii, &flc); - - flc.cxWidth = acx[ ii ]; - FastList_SetColumn (hList, ii, &flc); - } -} - - -void cdecl FL_SetColumns (HWND hList, WORD nCols, WORD *acx, ...) -{ - va_list arg; - va_start (arg, acx); - - for (WORD ii = 0; ii < nCols; ii++) - { - FASTLISTCOLUMN flc; - GetString (flc.szText, va_arg (arg, WORD)); - flc.dwFlags = FLCF_JUSTIFY_LEFT; - flc.cxWidth = acx[ ii ]; // width of the column, in pixels - FastList_SetColumn (hList, ii, &flc); - } -} - - -void FL_GetColumns (HWND hList, WORD nCols, WORD *acx) -{ - for (WORD ii = 0; ii < nCols; ii++) - { - FASTLISTCOLUMN flc; - FastList_GetColumn (hList, ii, &flc); - acx[ ii ] = (WORD)flc.cxWidth; - } -} - - -HLISTITEM cdecl FL_AddItem (HWND hList, WORD nCols, LPARAM lp, int iImage1, ...) -{ - va_list arg; - va_start (arg, iImage1); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.hParent = NULL; - flai.iFirstImage = iImage1; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = va_arg (arg, LPTSTR); - flai.lParam = lp; - flai.dwFlags = 0; - - FastList_Begin (hList); - - HLISTITEM hItem; - if ((hItem = FastList_AddItem (hList, &flai)) != NULL) - { - for (WORD ii = 1; ii < nCols; ii++) - { - FastList_SetItemText (hList, hItem, ii, va_arg (arg, LPTSTR)); - } - } - - FastList_End (hList); - return hItem; -} - - -void FL_GetItemText (HWND hList, HLISTITEM hItem, int iCol, LPTSTR psz) -{ - LPCTSTR pszText = FastList_GetItemText (hList, hItem, iCol); - if (!pszText) - *psz = TEXT('\0'); - else - lstrcpy (psz, pszText); -} - - -void FL_SetItemText (HWND hList, HLISTITEM hItem, int iCol, LPCTSTR psz) -{ - FastList_SetItemText (hList, hItem, iCol, psz); -} - - -void FL_SetSelectedByData (HWND hList, LPARAM lp) -{ - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, lp)) != NULL) - { - FL_SetSelected (hList, hItem); - } -} - - -void FL_SetSelected (HWND hList, HLISTITEM hItem) -{ - FastList_Begin (hList); - FastList_SelectNone (hList); - if (hItem) - { - FastList_SelectItem (hList, hItem, TRUE); - FastList_EnsureVisible (hList, hItem); - } - FastList_SetFocus (hList, hItem); - FastList_End (hList); -} - - -HLISTITEM FL_GetSelected (HWND hList, HLISTITEM hItem) -{ - return FastList_FindNextSelected (hList, hItem); -} - - -HLISTITEM FL_GetFocused (HWND hList) -{ - return FastList_GetFocus (hList); -} - - -LPARAM FL_GetFocusedData (HWND hList) -{ - HLISTITEM hItem; - if ((hItem = FastList_GetFocus (hList)) == NULL) - return 0; - - return FastList_GetItemParam (hList, hItem); -} - - -LPARAM FL_GetData (HWND hList, HLISTITEM hItem) -{ - return FastList_GetItemParam (hList, hItem); -} - - -HLISTITEM FL_GetIndex (HWND hList, LPARAM lp) -{ - return FastList_FindItem (hList, lp); -} - - -LPARAM FL_GetSelectedData (HWND hList) -{ - HLISTITEM hItem; - if ((hItem = FastList_FindFirstSelected (hList)) == NULL) - return 0; - - return FastList_GetItemParam (hList, hItem); -} - - -void FL_RestoreView (HWND hList, LPVIEWINFO lpvi) -{ - FastList_Begin (hList); - - for (size_t cColumns = FastList_GetColumnCount(hList); cColumns; --cColumns) - { - FastList_RemoveColumn (hList, cColumns-1); - } - - for (size_t ii = 0; ii < lpvi->nColsShown; ++ii) - { - if (lpvi->aColumns[ ii ] >= lpvi->nColsAvail) - continue; - - size_t iColumn = lpvi->aColumns[ ii ]; - - FASTLISTCOLUMN flc; - GetString (flc.szText, lpvi->idsColumns[ iColumn ]); - - flc.dwFlags = (lpvi->cxColumns[ iColumn ] & COLUMN_RIGHTJUST) ? FLCF_JUSTIFY_RIGHT : (lpvi->cxColumns[ iColumn ] & COLUMN_CENTERJUST) ? FLCF_JUSTIFY_CENTER : FLCF_JUSTIFY_LEFT; - flc.cxWidth = (lpvi->cxColumns[ iColumn ] & (~COLUMN_JUSTMASK)); - FastList_SetColumn (hList, ii, &flc); - } - - // Restore the fastlist's sort style - // - FastList_SetSortStyle (hList, (lpvi->iSort & (~COLUMN_SORTREV)), !!(lpvi->iSort & COLUMN_SORTREV)); - - // Switch the FastList into the proper mode--Large Icons, - // Small Icons, List or Details. - // - LONG dw = GetWindowLong (hList, GWL_STYLE); - dw &= ~FLS_VIEW_MASK; - dw |= lpvi->lvsView; - SetWindowLong (hList, GWL_STYLE, dw); - - FastList_End (hList); -} - - -void FL_StoreView (HWND hList, LPVIEWINFO lpvi) -{ - // First, remember what mode the the FastList is in--Large, - // Small, List, Tree, or TreeList. - // - lpvi->lvsView = GetWindowLong (hList, GWL_STYLE); - lpvi->lvsView &= FLS_VIEW_MASK; - - // Record the fastlist's sort style - // - int iCol; - BOOL fRev; - FastList_GetSortStyle (hList, &iCol, &fRev); - lpvi->iSort = (size_t)iCol; - if (fRev) - lpvi->iSort |= COLUMN_SORTREV; - - // Then remember the columns' widths; we expect that the columns - // which are shown (ie, nColsShown and aColumns[]) are up-to-date - // already. - // - if (lpvi->lvsView & FLS_VIEW_LIST) - { - for (size_t ii = 0; ii < lpvi->nColsShown; ++ii) - { - if (lpvi->aColumns[ ii ] >= lpvi->nColsAvail) - continue; - - size_t iColumn = lpvi->aColumns[ii]; - - int dwJust = (lpvi->cxColumns[ iColumn ] & COLUMN_JUSTMASK); - - FASTLISTCOLUMN flc; - FastList_GetColumn (hList, ii, &flc); - lpvi->cxColumns[ iColumn ] = flc.cxWidth | dwJust; - } - } -} - - -HLISTITEM cdecl FL_AddItem (HWND hList, LPVIEWINFO lpvi, LPARAM lp, int iImage1, ...) -{ - va_list arg; - va_start (arg, iImage1); - - LPTSTR apszColumns[ nCOLUMNS_MAX ]; - for (size_t iColumn = 0; iColumn < lpvi->nColsAvail; ++iColumn) - { - apszColumns[ iColumn ] = va_arg (arg, LPTSTR); - } - - FastList_Begin (hList); - - HLISTITEM hItem = NULL; - for (size_t ii = 0; ii < lpvi->nColsShown; ++ii) - { - if ((iColumn = lpvi->aColumns[ ii ]) >= lpvi->nColsAvail) - continue; - - if (ii == 0) - { - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.hParent = NULL; - flai.iFirstImage = iImage1; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = apszColumns[ iColumn ]; - flai.lParam = lp; - flai.dwFlags = 0; - - hItem = FastList_AddItem (hList, &flai); - } - else - { - FastList_SetItemText (hList, hItem, ii, apszColumns[ iColumn ]); - } - } - - FastList_End (hList); - return hItem; -} - - -BOOL FL_HitTestForHeaderBar (HWND hList, POINT ptClient) -{ - for (HWND hHeader = GetWindow (hList, GW_CHILD); - hHeader != NULL; - hHeader = GetWindow (hHeader, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - - if (GetClassName (hHeader, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, WC_HEADER)) - break; - } - } - - if (hHeader && IsWindow(hHeader) && IsWindowVisible(hHeader)) - { - RECT rHeader; - DialogGetRectInParent (hHeader, &rHeader); - if (PtInRect (&rHeader, ptClient)) - return TRUE; - } - - return FALSE; -} - - - -/* - * LISTVIEW ___________________________________________________________________ - * - */ - -LPARAM LV_StartChange (HWND hList, BOOL fReset) -{ - LPARAM dwSelected = LV_GetSelectedData (hList); - SendMessage (hList, WM_SETREDRAW, FALSE, 0); - if (fReset) - ListView_DeleteAllItems (hList); - return dwSelected; -} - - -void LV_EndChange (HWND hList, LPARAM lpToSelect) -{ - SendMessage (hList, WM_SETREDRAW, TRUE, 0); - - if (lpToSelect != (LPARAM)NULL) - LV_SetSelectedByData (hList, lpToSelect); -} - - -void LV_ResizeColumns (HWND hList, WORD nCols, WORD *acx) -{ - for (WORD ii = 0; ii < nCols; ++ii) - { - ListView_SetColumnWidth (hList, ii, acx[ ii ]); - } -} - -void cdecl LV_SetColumns (HWND hList, WORD nCols, WORD *acx, ...) -{ - va_list arg; - va_start (arg, acx); - - for (WORD ii = 0; ii < nCols; ii++) - { - LV_COLUMN lvC; - TCHAR text[ cchRESOURCE ]; - - GetString (text, va_arg (arg, WORD)); - - lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; - lvC.fmt = LVCFMT_LEFT; - lvC.pszText = text; - lvC.cx = acx[ ii ]; // width of the column, in pixels - lvC.iSubItem = ii; - ListView_InsertColumn (hList, ii, &lvC); - } -} - - -void LV_GetColumns (HWND hList, WORD nCols, WORD *acx) -{ - for (WORD ii = 0; ii < nCols; ii++) - { - acx[ ii ] = ListView_GetColumnWidth (hList, ii); - } -} - - -void cdecl LV_AddItem (HWND hList, WORD nCols, int index, LPARAM lp, int iImage, ...) -{ - LV_ITEM lvI; - va_list arg; - va_start (arg, iImage); - - lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - lvI.state = 0; - lvI.stateMask = 0; - lvI.iItem = index; - lvI.iSubItem = 0; - lvI.pszText = va_arg (arg, LPTSTR); - lvI.cchTextMax = cchRESOURCE; - lvI.iImage = iImage; - lvI.lParam = lp; - - if ((index == INDEX_SORT) && (lvI.pszText != LPSTR_TEXTCALLBACK)) - { - lvI.iItem = LV_PickInsertionPoint (hList, lvI.pszText); - } - - DWORD dw = ListView_InsertItem (hList, &lvI); - - for (WORD ii = 1; ii < nCols; ii++) - { - ListView_SetItemText (hList, dw, ii, va_arg (arg, LPTSTR)); - } -} - - -void cdecl LV_GetItemText (HWND hList, int index, short col, LPTSTR psz) -{ - *psz = TEXT('\0'); - ListView_GetItemText (hList, index, col, (LPTSTR)psz, cchRESOURCE); -} - - -void cdecl LV_SetItemText (HWND hList, int index, short col, LPCTSTR psz) -{ - ListView_SetItemText (hList, index, col, (LPTSTR)psz); -} - - -void LV_SetSelectedByData (HWND hList, LPARAM lp) -{ - int index; - - if ((index = LV_GetIndex (hList, lp)) != -1) - { - LV_SetSelected (hList, index); - } -} - - -void LV_SetSelected (HWND hList, int index) -{ - ListView_EnsureVisible (hList, index, FALSE); - - ListView_SetItemState (hList, index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); -} - - -int LV_GetSelected (HWND hList, int index) -{ - return ListView_GetNextItem (hList, index, LVNI_SELECTED); -} - - -int LV_GetFocused (HWND hList) -{ - return ListView_GetNextItem (hList, -1, LVNI_FOCUSED); -} - - -LPARAM LV_GetFocusedData (HWND hList) -{ - int idxFocus; - - if ((idxFocus = LV_GetFocused (hList)) == -1) - return (LPARAM)0; - - return LV_GetData (hList, idxFocus); -} - - -LPARAM LV_GetData (HWND hList, int index) -{ - LV_ITEM lvI; - - memset (&lvI, 0x00, sizeof(LV_ITEM)); - lvI.mask = LVIF_PARAM; - lvI.iItem = index; - - if (! ListView_GetItem (hList, &lvI)) - return (LPARAM)0; - - return lvI.lParam; -} - - -int LV_GetIndex (HWND hList, LPARAM lp) -{ - LV_FINDINFO lvfi; - - memset (&lvfi, 0x00, sizeof(lvfi)); - - lvfi.flags = LVFI_PARAM; - lvfi.lParam = lp; - - return ListView_FindItem (hList, -1, &lvfi); -} - - -LPARAM LV_GetSelectedData (HWND hList) -{ - int index; - - if ((index = LV_GetSelected (hList)) == -1) - return (LPARAM)0; - - return LV_GetData (hList, index); -} - - -void LV_RestoreView (HWND hList, LPVIEWINFO lpvi) -{ - // Add columns to the listview; remember that we'll have to remove any - // existing columns first. - // - while (ListView_DeleteColumn (hList, 0)) - ; - - for (size_t ii = 0; ii < lpvi->nColsShown; ++ii) - { - if (lpvi->aColumns[ ii ] >= lpvi->nColsAvail) - continue; - - size_t iColumn = lpvi->aColumns[ii]; - - LV_COLUMN lvc; - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, lpvi->idsColumns[ iColumn ]); - - lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; - lvc.fmt = (lpvi->cxColumns[ iColumn ] & COLUMN_RIGHTJUST) ? LVCFMT_RIGHT : (lpvi->cxColumns[ iColumn ] & COLUMN_CENTERJUST) ? LVCFMT_CENTER : LVCFMT_LEFT; - lvc.pszText = szText; - lvc.cx = (lpvi->cxColumns[ iColumn ] & (~COLUMN_JUSTMASK)); - lvc.iSubItem = ii; - ListView_InsertColumn (hList, ii, &lvc); - } - - // Switch the ListView into the proper mode--Large Icons, - // Small Icons, List or Details. - // - LONG dw = GetWindowLong (hList, GWL_STYLE); - dw &= ~LVS_TYPEMASK; - dw |= lpvi->lvsView; - dw |= LVS_AUTOARRANGE; - SetWindowLong (hList, GWL_STYLE, dw); - ListView_Arrange (hList, LVA_DEFAULT); -} - - -void LV_StoreView (HWND hList, LPVIEWINFO lpvi) -{ - // First, remember what mod the the ListView is in--Large Icons, - // Small Icons, List or Details. - // - lpvi->lvsView = GetWindowLong (hList, GWL_STYLE); - lpvi->lvsView &= LVS_TYPEMASK; - - // Then remember the columns' widths; we expect that the columns - // which are shown (ie, nColsShown and aColumns[]) are up-to-date - // already. - // - if (lpvi->lvsView == LVS_REPORT) - { - for (size_t ii = 0; ii < lpvi->nColsShown; ++ii) - { - if (lpvi->aColumns[ ii ] >= lpvi->nColsAvail) - continue; - - size_t iColumn = lpvi->aColumns[ii]; - - int dwJust = (lpvi->cxColumns[ iColumn ] & COLUMN_JUSTMASK); - - lpvi->cxColumns[ iColumn ] = ListView_GetColumnWidth (hList, ii); - lpvi->cxColumns[ iColumn ] |= dwJust; - } - } -} - - -typedef struct // VIEWSORTINFO - { - HWND hList; - LPVIEWINFO lpvi; - size_t iColSort; - BOOL fAscending; - } VIEWSORTINFO, *LPVIEWSORTINFO; - -BOOL CALLBACK LV_SortView_Numeric (LPARAM lp1, LPARAM lp2, LPARAM lpSort) -{ - LPVIEWSORTINFO lpvsi = (LPVIEWSORTINFO)lpSort; - TCHAR szText[ cchRESOURCE ]; - double d1; - double d2; - - int ii1 = LV_GetIndex (lpvsi->hList, lp1); - int ii2 = LV_GetIndex (lpvsi->hList, lp2); - - LV_GetItemText (lpvsi->hList, ii1, lpvsi->iColSort, szText); - d1 = atof (szText); - - LV_GetItemText (lpvsi->hList, ii2, lpvsi->iColSort, szText); - d2 = atof (szText); - - if (lpvsi->fAscending) - return (d2 < d1) ? ((BOOL)-1) : (d2 == d1) ? ((BOOL)0) : (BOOL)1; - else - return (d1 < d2) ? ((BOOL)-1) : (d1 == d2) ? ((BOOL)0) : (BOOL)1; -} - - -BOOL CALLBACK LV_SortView_Alphabetic (LPARAM lp1, LPARAM lp2, LPARAM lpSort) -{ - LPVIEWSORTINFO lpvsi = (LPVIEWSORTINFO)lpSort; - TCHAR szText1[ cchRESOURCE ]; - TCHAR szText2[ cchRESOURCE ]; - - int ii1 = LV_GetIndex (lpvsi->hList, lp1); - int ii2 = LV_GetIndex (lpvsi->hList, lp2); - - LV_GetItemText (lpvsi->hList, ii1, lpvsi->iColSort, szText1); - LV_GetItemText (lpvsi->hList, ii2, lpvsi->iColSort, szText2); - - if (lpvsi->fAscending) - return lstrcmp (szText2, szText1); - else - return lstrcmp (szText1, szText2); -} - - -void LV_SortView (HWND hList, LPVIEWINFO lpvi) -{ - for (size_t iColSort = 0; iColSort < lpvi->nColsShown; ++iColSort) - { - if ((lpvi->iSort & (~COLUMN_SORTREV)) == lpvi->aColumns[ iColSort ]) - break; - } - - if (iColSort < lpvi->nColsShown) - { - VIEWSORTINFO vsi; - vsi.hList = hList; - vsi.lpvi = lpvi; - vsi.iColSort = iColSort; - vsi.fAscending = (lpvi->iSort & COLUMN_SORTREV) ? TRUE : FALSE; - - if (lpvi->cxColumns[ lpvi->iSort ] & COLUMN_RIGHTJUST) - ListView_SortItems (hList, (PFNLVCOMPARE)LV_SortView_Numeric, (LPARAM)&vsi); - else - ListView_SortItems (hList, (PFNLVCOMPARE)LV_SortView_Alphabetic, (LPARAM)&vsi); - } -} - - -void cdecl LV_AddItem (HWND hList, LPVIEWINFO lpvi, int index, LPARAM lp, int iImage, ...) -{ - va_list arg; - va_start (arg, iImage); - - LPTSTR apszColumns[ nCOLUMNS_MAX ]; - for (size_t iColumn = 0; iColumn < lpvi->nColsAvail; ++iColumn) - { - apszColumns[ iColumn ] = va_arg (arg, LPTSTR); - } - - if ((index == INDEX_SORT) && (iColumn) && (apszColumns[0] != LPSTR_TEXTCALLBACK)) - { - index = LV_PickInsertionPoint (hList, apszColumns[0]); - } - - DWORD dw; - for (size_t ii = 0; ii < lpvi->nColsShown; ++ii) - { - if ((iColumn = lpvi->aColumns[ ii ]) >= lpvi->nColsAvail) - continue; - - if (ii == 0) - { - LV_ITEM lvitem; - lvitem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - lvitem.state = 0; - lvitem.stateMask = 0; - lvitem.iItem = index; - lvitem.iSubItem = 0; - lvitem.pszText = apszColumns[ iColumn ]; - lvitem.cchTextMax = cchRESOURCE; - lvitem.iImage = iImage; - lvitem.lParam = lp; - - dw = ListView_InsertItem (hList, &lvitem); - } - else - { - ListView_SetItemText (hList, dw, ii, apszColumns[ iColumn ]); - } - } -} - - -BOOL LV_HitTestForHeaderBar (HWND hList, POINT ptClient) -{ - for (HWND hHeader = GetWindow (hList, GW_CHILD); - hHeader != NULL; - hHeader = GetWindow (hHeader, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - - if (GetClassName (hHeader, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, WC_HEADER)) - break; - } - } - - if (hHeader && IsWindow(hHeader) && IsWindowVisible(hHeader)) - { - RECT rHeader; - DialogGetRectInParent (hHeader, &rHeader); - if (PtInRect (&rHeader, ptClient)) - return TRUE; - } - - return FALSE; -} - - -int LV_PickInsertionPoint (HWND hList, LPTSTR pszNewItem, int (__stdcall *fnSort)(LPCTSTR, LPCTSTR)) -{ - int iItemLow = 0; - int iItemHigh = ListView_GetItemCount (hList) -1; - - if (fnSort == 0) - fnSort = lstrcmpi; - - while (iItemLow <= iItemHigh) - { - int iItemTest = iItemLow + (iItemHigh - iItemLow) / 2; - - TCHAR szItemTest[ 256 ]; - ListView_GetItemText (hList, iItemTest, 0, szItemTest, 256); - - int iCompare = (*fnSort)(pszNewItem, szItemTest); - if (iCompare <= 0) - { - if ((iItemHigh = iItemTest-1) < iItemLow) - return iItemHigh +1; - } - if (iCompare >= 0) - { - if ((iItemLow = iItemTest+1) > iItemHigh) - return iItemLow; - } - } - - return 0; -} - - - -/* - * COMBO BOXES ________________________________________________________________ - * - */ - -LPARAM CB_StartChange (HWND hCombo, BOOL fReset) -{ - LPARAM dwSelected = CB_GetSelectedData (hCombo); - SendMessage (hCombo, WM_SETREDRAW, FALSE, 0); - if (fReset) - SendMessage (hCombo, CB_RESETCONTENT, 0, 0); - return dwSelected; -} - - -void CB_EndChange (HWND hCombo, LPARAM lpToSelect) -{ - SendMessage (hCombo, WM_SETREDRAW, TRUE, 0); - - if (lpToSelect != (LPARAM)NULL) - CB_SetSelectedByData (hCombo, lpToSelect); -} - - -UINT CB_AddItem (HWND hCombo, int nsz, LPARAM lp) -{ - LPTSTR psz; - UINT rc; - - psz = FormatString (nsz); - rc = CB_AddItem (hCombo, psz, lp); - FreeString (psz); - - return rc; -} - - -UINT CB_AddItem (HWND hCombo, LPCTSTR psz, LPARAM lp) -{ - UINT index; - if ((index = (UINT)SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)psz)) != (UINT)-1) - { - SendMessage (hCombo, CB_SETITEMDATA, index, lp); - } - return index; -} - - -void CB_SetSelected (HWND hCombo, UINT index) -{ - SendMessage (hCombo, CB_SETCURSEL, index, 0); -} - - -void CB_SetSelectedByData (HWND hCombo, LPARAM lpMatch) -{ - CB_SetSelected (hCombo, CB_GetIndex (hCombo, lpMatch)); -} - - -UINT CB_GetSelected (HWND hCombo) -{ - return (UINT)SendMessage (hCombo, CB_GETCURSEL, 0, 0); -} - - -LPARAM CB_GetSelectedData (HWND hCombo) -{ - UINT index; - - if ((index = CB_GetSelected (hCombo)) == -1) - return 0; - - return CB_GetData (hCombo, index); -} - - -LPARAM CB_GetData (HWND hCombo, UINT index) -{ - return (LPARAM)SendMessage (hCombo, CB_GETITEMDATA, index, 0); -} - - -UINT CB_GetIndex (HWND hCombo, LPARAM lpMatch) -{ - UINT idxMax = (UINT)SendMessage (hCombo, CB_GETCOUNT, 0, 0); - - for (UINT index = 0; index < idxMax; index++) - { - if (SendMessage (hCombo, CB_GETITEMDATA, index, 0) == lpMatch) - return index; - } - - return (UINT)-1; -} - - -/* - * LIST BOXES _________________________________________________________________ - * - */ - -LPARAM LB_StartChange (HWND hList, BOOL fReset) -{ - LPARAM dwSelected = LB_GetSelectedData (hList); - SendMessage (hList, WM_SETREDRAW, FALSE, 0); - if (fReset) - SendMessage (hList, LB_RESETCONTENT, 0, 0); - return dwSelected; -} - - -void LB_EndChange (HWND hList, LPARAM lpToSelect) -{ - SendMessage (hList, WM_SETREDRAW, TRUE, 0); - - if (lpToSelect != (LPARAM)NULL) - LB_SetSelectedByData (hList, lpToSelect); -} - - -UINT LB_AddItem (HWND hList, int nsz, LPARAM lp) -{ - LPTSTR psz; - UINT rc; - - psz = FormatString (nsz); - rc = LB_AddItem (hList, psz, lp); - FreeString (psz); - - return rc; -} - - -UINT LB_AddItem (HWND hList, LPCTSTR psz, LPARAM lp) -{ - UINT index; - if ((index = (UINT)SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz)) != -1) - { - SendMessage (hList, LB_SETITEMDATA, index, lp); - } - return index; -} - - -void LB_EnsureVisible (HWND hList, UINT index) -{ - int cyItem; - if ((cyItem = SendMessage (hList, LB_GETITEMHEIGHT, 0, 0)) != 0) - { - RECT rClient; - GetClientRect (hList, &rClient); - int cWindow; - if ((cWindow = cyRECT(rClient) / cyItem) == 0) - cWindow = 1; - - int idxTop = SendMessage (hList, LB_GETTOPINDEX, 0, 0); - if (index < (UINT)idxTop) - { - SendMessage (hList, LB_SETTOPINDEX, index, 0); - } - else if (index >= (UINT)(idxTop +cWindow)) - { - SendMessage (hList, LB_SETTOPINDEX, index -cWindow +1, 0); - } - } -} - - -void LB_SetSelected (HWND hList, UINT index) -{ - SendMessage (hList, LB_SETCURSEL, index, 0); - LB_EnsureVisible (hList, index); -} - - -void LB_SetSelectedByData (HWND hList, LPARAM lpMatch) -{ - LB_SetSelected (hList, LB_GetIndex (hList, lpMatch)); -} - - -UINT LB_GetSelected (HWND hList) -{ - return (UINT)SendMessage (hList, LB_GETCURSEL, 0, 0); -} - - -LPARAM LB_GetSelectedData (HWND hList) -{ - UINT index; - - if ((index = LB_GetSelected (hList)) == (UINT)-1) - return 0; - - return LB_GetData (hList, index); -} - - -LPARAM LB_GetData (HWND hList, UINT index) -{ - return (LPARAM)SendMessage (hList, LB_GETITEMDATA, index, 0); -} - - -UINT LB_GetIndex (HWND hList, LPARAM lpMatch) -{ - UINT idxMax = (UINT)SendMessage (hList, LB_GETCOUNT, 0, 0); - - for (UINT index = 0; index < idxMax; index++) - { - if (SendMessage (hList, LB_GETITEMDATA, index, 0) == lpMatch) - return index; - } - - return (UINT)-1; -} - - -WORD LB_GetStringExtent (HWND hList, LPTSTR pszString) -{ - HDC hdc = GetDC (hList); - - SIZE sz; - GetTextExtentPoint32 (hdc, pszString, lstrlen(pszString), &sz); - - ReleaseDC (hList, hdc); - return (WORD)( sz.cx + 2 * GetSystemMetrics (SM_CXBORDER) ); -} - - -BOOL CALLBACK ListBox_HScrollHook (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hList, ListBox_HScrollHook); - - switch (msg) - { - case WM_DESTROY: - Subclass_RemoveHook (hList, ListBox_HScrollHook); - break; - - case LB_ADDSTRING: - { - LPTSTR pszString = (LPTSTR)lp; - WORD cxString = LB_GetStringExtent (hList, pszString); - WORD cxExtent = (WORD)SendMessage (hList, LB_GETHORIZONTALEXTENT, 0, 0); - if (cxString > cxExtent) - SendMessage (hList, LB_SETHORIZONTALEXTENT, (WPARAM)cxString, 0); - } - break; - - case LB_DELETESTRING: - { - int iItemSkip = (int)wp; - int iItemMax = SendMessage (hList, LB_GETCOUNT, 0, 0); - int cchMax = 0; - - for (int iItem = 0; iItem < iItemMax; iItem++) - { - if (iItem == iItemSkip) - continue; - int cch = SendMessage (hList, LB_GETTEXTLEN, (WPARAM)iItem, 0); - cchMax = max (cch, cchMax); - } - - WORD cxExtent = (WORD)SendMessage (hList, LB_GETHORIZONTALEXTENT, 0, 0); - WORD cxStringMax = 0; - LPTSTR pszString = AllocateString (cchMax +1); - - for (iItem = 0; iItem < iItemMax; iItem++) - { - if (iItem == iItemSkip) - continue; - SendMessage (hList, LB_GETTEXT, (WPARAM)iItem, (LPARAM)pszString); - WORD cxString = LB_GetStringExtent (hList, pszString); - cxStringMax = max (cxString, cxStringMax); - } - - FreeString (pszString); - SendMessage (hList, LB_SETHORIZONTALEXTENT, (WPARAM)cxStringMax, 0); - } - break; - } - - if (oldProc) - return CallWindowProc ((WNDPROC)oldProc, hList, msg, wp, lp); - else - return DefWindowProc (hList, msg, wp, lp); -} - - -void LB_EnableHScroll (HWND hList) -{ - Subclass_AddHook (hList, ListBox_HScrollHook); -} - - -/* - * TREEVIEWS __________________________________________________________________ - * - */ - -LPARAM TV_GetData (HWND hTree, HTREEITEM hti) -{ - TV_ITEM tvi; - tvi.lParam = 0; - tvi.hItem = hti; - tvi.mask = TVIF_PARAM; - - if (!TreeView_GetItem (hTree, &tvi)) - return (LPARAM)NULL; - - return tvi.lParam; -} - - -LPARAM TV_GetSelectedData (HWND hTree) -{ - HTREEITEM hti = TreeView_GetSelection (hTree); - - if (hti == NULL) - return NULL; - - return TV_GetData (hTree, hti); -} - - -LPARAM TV_StartChange (HWND hTree, BOOL fReset) -{ - LPARAM dwSelected = TV_GetSelectedData (hTree); - SendMessage (hTree, WM_SETREDRAW, FALSE, 0); - if (fReset) - TreeView_DeleteAllItems (hTree); - return dwSelected; -} - - -void TV_EndChange (HWND hTree, LPARAM lpToSelect) -{ - SendMessage (hTree, WM_SETREDRAW, TRUE, 0); - - if (lpToSelect != NULL) - { - HTREEITEM hti = TV_RecursiveFind (hTree, TVI_ROOT, lpToSelect); - if (hti != NULL) - TreeView_SelectItem (hTree, hti); - } -} - - -HTREEITEM TV_RecursiveFind (HWND hTree, HTREEITEM htiRoot, LPARAM lpToFind) -{ - for (HTREEITEM hti = (htiRoot == TVI_ROOT) ? TreeView_GetRoot (hTree) : TreeView_GetChild (hTree, htiRoot); - hti != NULL; - hti = TreeView_GetNextSibling (hTree, hti)) - { - if (lpToFind == TV_GetData (hTree, hti)) - return hti; - - HTREEITEM htiFound; - if ((htiFound = TV_RecursiveFind (hTree, hti, lpToFind)) != NULL) - return htiFound; - } - - return NULL; -} - - -/* - * COMMON DIALOGS _____________________________________________________________ - * - */ - -BOOL Browse_Open (HWND hParent, LPTSTR pszFilename, LPTSTR pszLastDirectory, int idsFilter, int iddTemplate, LPOFNHOOKPROC lpfnHook, DWORD lCustData) -{ - TCHAR szFilter[ cchRESOURCE ]; - GetString (szFilter, idsFilter); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - OPENFILENAME ofn; - memset (&ofn, 0x00, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hParent; - ofn.hInstance = THIS_HINST; - ofn.lpstrFilter = szFilter; - ofn.nFilterIndex = 1; - ofn.lpstrFile = pszFilename; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - ofn.lCustData = lCustData; - - if (iddTemplate != 0) - { - ofn.lpTemplateName = MAKEINTRESOURCE( iddTemplate ); - ofn.Flags |= OFN_ENABLETEMPLATE | OFN_EXPLORER; - } - if (lpfnHook != NULL) - { - ofn.lpfnHook = lpfnHook; - ofn.Flags |= OFN_ENABLEHOOK | OFN_EXPLORER; - } - - TCHAR szPath[ MAX_PATH ]; - GetCurrentDirectory (MAX_PATH, szPath); - if (pszLastDirectory && *pszLastDirectory) - SetCurrentDirectory (pszLastDirectory); - - BOOL rc = GetOpenFileName (&ofn); - - if (pszLastDirectory) - GetCurrentDirectory (MAX_PATH, pszLastDirectory); - SetCurrentDirectory (szPath); - - return rc; -} - - -BOOL Browse_Save (HWND hParent, LPTSTR pszFilename, LPTSTR pszLastDirectory, int idsFilter, int iddTemplate, LPOFNHOOKPROC lpfnHook, DWORD lCustData) -{ - TCHAR szFilter[ cchRESOURCE ]; - GetString (szFilter, idsFilter); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - OPENFILENAME sfn; - memset (&sfn, 0x00, sizeof(sfn)); - sfn.lStructSize = sizeof(sfn); - sfn.hwndOwner = hParent; - sfn.hInstance = THIS_HINST; - sfn.lpstrFilter = szFilter; - sfn.nFilterIndex = 1; - sfn.lpstrFile = pszFilename; - sfn.nMaxFile = MAX_PATH; - sfn.Flags = OFN_HIDEREADONLY | OFN_NOREADONLYRETURN | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; - sfn.lCustData = lCustData; - - if (iddTemplate != 0) - { - sfn.lpTemplateName = MAKEINTRESOURCE( iddTemplate ); - sfn.Flags |= OFN_ENABLETEMPLATE | OFN_EXPLORER; - } - if (lpfnHook != NULL) - { - sfn.lpfnHook = lpfnHook; - sfn.Flags |= OFN_ENABLEHOOK | OFN_EXPLORER; - } - - TCHAR szPath[ MAX_PATH ]; - GetCurrentDirectory (MAX_PATH, szPath); - if (pszLastDirectory && *pszLastDirectory) - SetCurrentDirectory (pszLastDirectory); - - BOOL rc = GetSaveFileName (&sfn); - - if (pszLastDirectory) - GetCurrentDirectory (MAX_PATH, pszLastDirectory); - SetCurrentDirectory (szPath); - - return rc; -} - - -/* - * HOURGLASS CURSOR ETC _______________________________________________________ - * - */ - -static LONG nHourGlassRequests = 0; - -void StartHourGlass (void) -{ - if ((++nHourGlassRequests) == 1) - { - SetCursor (LoadCursor (NULL, IDC_WAIT)); - } -} - -void StopHourGlass (void) -{ - if ((nHourGlassRequests == 0) || ((--nHourGlassRequests) == 0)) - { - SetCursor (LoadCursor (NULL, IDC_ARROW)); - } -} - - - -void DisplayContextMenu (HMENU hm, POINT ptScreen, HWND hParent) -{ - HMENU hmDummy = CreateMenu(); - InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL); - - TrackPopupMenu (GetSubMenu (hmDummy, 0), - TPM_LEFTALIGN | TPM_RIGHTBUTTON, - ptScreen.x, ptScreen.y, - 0, hParent, NULL); - - DestroyMenu (hmDummy); -} - - -size_t CountChildren (HWND hParent, LPTSTR pszClass) -{ - size_t nFound = 0; - - for (HWND hChild = GetWindow (hParent, GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - - if (GetClassName (hChild, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, pszClass)) - ++nFound; - } - } - - return nFound; -} - - -WORD NextControlID (HWND hParent) -{ - WORD wNext = 1; - - for (HWND hChild = GetWindow (hParent, GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - LONG wChild = GetWindowLong (hChild, GWL_ID); - if ((wChild < 0) || (wChild >= 0xF000)) - continue; - - wNext = max( wNext, (WORD) wChild+1 ); - } - - return wNext; -} - - -BOOL IsAncestor (HWND hParent, HWND hChild) -{ - for ( ; hChild; hChild = GetParent(hChild)) - { - if (hParent == hChild) - return TRUE; - } - return FALSE; -} - - -HWND GetTabChild (HWND hTab) -{ - for (HWND hChild = GetWindow (hTab, GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - - if (GetClassName (hChild, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, TEXT("#32770"))) // WC_DIALOG - return hChild; - } - } - - return NULL; -} - - -HWND GetLastDlgTabItem (HWND hDlg) -{ - HWND hFirst = NULL; - HWND hLast = NULL; - - for (HWND hSearch = GetNextDlgTabItem (hDlg, NULL, FALSE); - (hSearch != NULL) && (hSearch != hFirst); - hSearch = GetNextDlgTabItem (hDlg, hSearch, FALSE)) - { - if (!hFirst) - hFirst = hSearch; - hLast = hSearch; - } - - return hLast; -} - - -BOOL IsPropSheet (HWND hSheet) -{ - HWND hTab; - if ((hTab = GetDlgItem (hSheet, IDC_PROPSHEET_TABCTRL)) == NULL) - return FALSE; - - TCHAR szClassName[ cchRESOURCE ]; - if (!GetClassName (hTab, szClassName, cchRESOURCE)) - return FALSE; - - if (lstrcmp (szClassName, WC_TABCONTROL)) - return FALSE; - - return TRUE; -} - diff --git a/src/WINNT/afsapplib/dialog.h b/src/WINNT/afsapplib/dialog.h deleted file mode 100644 index b26990105..000000000 --- a/src/WINNT/afsapplib/dialog.h +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef DIALOG_H -#define DIALOG_H - -#include -#include -#include - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef IDINIT -#define IDINIT 20 -#endif -#ifndef IDAPPLY -#define IDAPPLY 21 -#endif -#ifndef IDHELP -#define IDHELP 9 -#endif - -#ifndef limit -#define limit(_a,_x,_b) min( max( (_x), (_a) ), (_b) ) -#endif - -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (((_x)>=(_a)) && ((_x)<=(_b))) ? TRUE : FALSE ) -#endif - -#ifndef Set2State -#define Set2State(_hDlg,_idc) SendDlgItemMessage (_hDlg,_idc,BM_SETSTYLE,BS_AUTOCHECKBOX,MAKELPARAM(TRUE,0)) -#endif - -#ifndef Set3State -#define Set3State(_hDlg,_idc) SendDlgItemMessage (_hDlg,_idc,BM_SETSTYLE,BS_AUTO3STATE,MAKELPARAM(TRUE,0)) -#endif - -#define CheckMenu(_hm,_id,_f) CheckMenuItem(_hm,_id,MF_BYCOMMAND|((_f)?MF_CHECKED:MF_UNCHECKED)) -#define EnableMenu(_hm,_id,_f) EnableMenuItem(_hm,_id,MF_BYCOMMAND|((_f)?MF_ENABLED:MF_GRAYED)) - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - -#define WM_INITDIALOG_SHEET 0x03FE -#define WM_DESTROY_SHEET 0x03FF - -#ifndef IDC_PROPSHEET_TABCTRL -#define IDC_PROPSHEET_TABCTRL 0x3020 -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - *** PROPERTY SHEETS - * - */ - -typedef struct - { - PROPSHEETHEADER sh; - struct { - DLGPROC dlgproc; - LPARAM lpUser; - HWND hDlg; - } *aTabs; - size_t cTabs; - BOOL fMadeCaption; - LPARAM lpUser; - } PROPSHEET, *LPPROPSHEET; - -EXPORTED LPPROPSHEET PropSheet_Create (int idsTitle, BOOL fContextHelp, HWND hParent = NULL, LPARAM lp = 0); -EXPORTED LPPROPSHEET PropSheet_Create (LPTSTR pszTitle, BOOL fContextHelp, HWND hParent = NULL, LPARAM lp = 0); -EXPORTED BOOL PropSheet_AddTab (LPPROPSHEET psh, int idsTitle, int idd, DLGPROC dlgproc, LPARAM lpUser, BOOL fHelpButton, BOOL fStartPage = FALSE); -EXPORTED BOOL PropSheet_AddTab (LPPROPSHEET psh, LPTSTR pszTitle, int idd, DLGPROC dlgproc, LPARAM lpUser, BOOL fHelpButton, BOOL fStartPage = FALSE); -EXPORTED BOOL PropSheet_ShowModal (LPPROPSHEET psh, void (*fnPump)(MSG*lpm) = 0); -EXPORTED HWND PropSheet_ShowModeless (LPPROPSHEET psh, int nCmdShow = SW_SHOW); -EXPORTED LPARAM PropSheet_FindTabParam (HWND hTab); -EXPORTED void PropSheet_Free (LPPROPSHEET psh); -EXPORTED HWND PropSheet_FindTabWindow (LPPROPSHEET psh, DLGPROC dlgproc); - -EXPORTED void PropSheetChanged (HWND hDlg); - -EXPORTED void TabCtrl_SwitchToTab (HWND hTab, int iTab); - - -/* - ** LIST, TREELIST, FASTLIST COLUMNS - * - */ - -#define nCOLUMNS_MAX 32 // maximum number of columns in a listview - -typedef struct - { - LONG lvsView; - size_t nColsAvail; - size_t iSort; - int cxColumns[ nCOLUMNS_MAX ]; - int idsColumns[ nCOLUMNS_MAX ]; - size_t nColsShown; - size_t aColumns[ nCOLUMNS_MAX ]; // returns 0-based index into cxColumns - } VIEWINFO, *LPVIEWINFO; - -#define COLUMN_JUSTMASK 0xF0000000 // cxColumns |= to make right-just col -#define COLUMN_RIGHTJUST 0x80000000 // cxColumns |= to make right-just col -#define COLUMN_CENTERJUST 0x40000000 // cxColumns |= to make center-just col - -#define COLUMN_SORTREV 0x80000000 // iSort |= to sort descending - -/* - ** FASTLISTS - * - */ - -EXPORTED LPARAM FL_StartChange (HWND hList, BOOL fReset = TRUE); -EXPORTED void FL_EndChange (HWND hList, LPARAM lpToSelect = 0); - -EXPORTED void FL_GetColumns (HWND hList, WORD nCols, WORD *acx); -EXPORTED void FL_ResizeColumns (HWND hList, WORD nCols, WORD *acx); -EXPORTED void cdecl FL_SetColumns (HWND hList, WORD nCols, WORD *acx, ...); - -EXPORTED HLISTITEM cdecl FL_AddItem (HWND hList, LPVIEWINFO lpvi, LPARAM lp, int iImage1, ...); -EXPORTED HLISTITEM cdecl FL_AddItem (HWND hList, WORD nCols, LPARAM lp, int iImage1, ...); -EXPORTED void FL_GetItemText (HWND hList, HLISTITEM hItem, int iCol, LPTSTR pszText); -EXPORTED void FL_SetItemText (HWND hList, HLISTITEM hItem, int iCol, LPCTSTR pszText); - -EXPORTED HLISTITEM FL_GetSelected (HWND hList, HLISTITEM hItemSearch = NULL); -EXPORTED void FL_SetSelected (HWND hList, HLISTITEM hItem); - -EXPORTED LPARAM FL_GetSelectedData (HWND hList); -EXPORTED void FL_SetSelectedByData (HWND hList, LPARAM lp); -EXPORTED HLISTITEM FL_GetFocused (HWND hList); - -EXPORTED LPARAM FL_GetData (HWND hList, HLISTITEM hItem); -EXPORTED LPARAM FL_GetFocusedData (HWND hList); -EXPORTED HLISTITEM FL_GetIndex (HWND hList, LPARAM lp); - -EXPORTED BOOL FL_HitTestForHeaderBar (HWND hList, POINT ptClient); - -EXPORTED void FL_RestoreView (HWND hList, LPVIEWINFO lpvi); -EXPORTED void FL_StoreView (HWND hList, LPVIEWINFO lpvi); -EXPORTED void FL_SortView (HWND hList, LPVIEWINFO lpvi); - -/* - ** LIST VIEWS - * - */ - -#define INDEX_SORT (int)-1 - -EXPORTED LPARAM LV_StartChange (HWND hList, BOOL fReset = TRUE); -EXPORTED void LV_EndChange (HWND hList, LPARAM lpToSelect = (LPARAM)NULL); - -EXPORTED void LV_GetColumns (HWND hList, WORD nCols, WORD *acx); -EXPORTED void LV_ResizeColumns (HWND hList, WORD nCols, WORD *acx); -EXPORTED void cdecl LV_SetColumns (HWND hList, WORD nCols, WORD *acx, ...); - -EXPORTED void cdecl LV_AddItem (HWND hList, LPVIEWINFO lpvi, int idx, LPARAM lp, int iImage, ...); -EXPORTED void cdecl LV_AddItem (HWND hList, WORD nCols, int idx, LPARAM lp, int iImage, ...); -EXPORTED void cdecl LV_GetItemText (HWND hList, int inx, short col, LPTSTR pszText); -EXPORTED void cdecl LV_SetItemText (HWND hList, int idx, short col, LPCTSTR pszText); - -EXPORTED int LV_GetSelected (HWND hList, int idx = -1); -EXPORTED void LV_SetSelected (HWND hList, int idx); - -EXPORTED LPARAM LV_GetSelectedData (HWND hList); -EXPORTED void LV_SetSelectedByData (HWND hList, LPARAM lp); -EXPORTED int LV_GetFocused (HWND hList); - -EXPORTED LPARAM LV_GetData (HWND hList, int idx); -EXPORTED LPARAM LV_GetFocusedData (HWND hList); -EXPORTED int LV_GetIndex (HWND hList, LPARAM lp); - -EXPORTED BOOL LV_HitTestForHeaderBar (HWND hList, POINT ptClient); - -EXPORTED void LV_RestoreView (HWND hList, LPVIEWINFO lpvi); -EXPORTED void LV_StoreView (HWND hList, LPVIEWINFO lpvi); -EXPORTED void LV_SortView (HWND hList, LPVIEWINFO lpvi); -EXPORTED int LV_PickInsertionPoint (HWND hList, LPTSTR pszNewItem, int (__stdcall *fnSort)(LPCTSTR, LPCTSTR) = 0); - - -/* - *** COMBO BOXES - * - */ - -EXPORTED LPARAM CB_StartChange (HWND hCombo, BOOL fReset = TRUE); -EXPORTED void CB_EndChange (HWND hCombo, LPARAM lpToSelect = (LPARAM)NULL); - -EXPORTED UINT CB_AddItem (HWND hCombo, int nsz, LPARAM lp); -EXPORTED UINT CB_AddItem (HWND hCombo, LPCTSTR psz, LPARAM lp); - -EXPORTED UINT CB_GetSelected (HWND hCombo); -EXPORTED void CB_SetSelected (HWND hCombo, UINT index); - -EXPORTED LPARAM CB_GetSelectedData (HWND hCombo); -EXPORTED void CB_SetSelectedByData (HWND hCombo, LPARAM lp); - -EXPORTED LPARAM CB_GetData (HWND hCombo, UINT index); -EXPORTED UINT CB_GetIndex (HWND hCombo, LPARAM lp); - - -/* - *** LIST BOXES - * - */ - -EXPORTED LPARAM LB_StartChange (HWND hList, BOOL fReset = TRUE); -EXPORTED void LB_EndChange (HWND hList, LPARAM lpToSelect = (LPARAM)NULL); - -EXPORTED UINT LB_AddItem (HWND hList, int nsz, LPARAM lp); -EXPORTED UINT LB_AddItem (HWND hList, LPCTSTR psz, LPARAM lp); - -EXPORTED void LB_EnsureVisible (HWND hList, UINT index); - -EXPORTED UINT LB_GetSelected (HWND hList); -EXPORTED void LB_SetSelected (HWND hList, UINT index); - -EXPORTED LPARAM LB_GetSelectedData (HWND hList); -EXPORTED void LB_SetSelectedByData (HWND hList, LPARAM lp); - -EXPORTED LPARAM LB_GetData (HWND hList, UINT index); -EXPORTED UINT LB_GetIndex (HWND hList, LPARAM lp); - -EXPORTED void LB_EnableHScroll (HWND hList); - -/* - *** TREEVIEWS - * - */ - -EXPORTED LPARAM TV_StartChange (HWND hTree, BOOL fReset); -EXPORTED void TV_EndChange (HWND hTree, LPARAM lpToSelect = (LPARAM)NULL); - -EXPORTED LPARAM TV_GetData (HWND hTree, HTREEITEM hti); -EXPORTED LPARAM TV_GetSelectedData (HWND hTree); - -EXPORTED HTREEITEM TV_RecursiveFind (HWND hTree, HTREEITEM htiRoot, LPARAM lpToFind); - - -/* - *** COMMDLG - * - */ - -EXPORTED BOOL Browse_Open (HWND hParent, LPTSTR pszFilename, LPTSTR pszLastDirectory, int idsFilter, int iddTemplate = 0, LPOFNHOOKPROC lpfnHook = NULL, DWORD lCustData = 0); -EXPORTED BOOL Browse_Save (HWND hParent, LPTSTR pszFilename, LPTSTR pszLastDirectory, int idsFilter, int iddTemplate = 0, LPOFNHOOKPROC lpfnHook = NULL, DWORD lCustData = 0); - - -/* - *** MISCELLANEOUS - * - */ - -EXPORTED void StartHourGlass (void); -EXPORTED void StopHourGlass (void); - -EXPORTED void DisplayContextMenu (HMENU hm, POINT ptScreen, HWND hParent); - -EXPORTED size_t CountChildren (HWND hParent, LPTSTR pszClass); - -EXPORTED WORD NextControlID (HWND hParent); - -EXPORTED BOOL IsAncestor (HWND hParent, HWND hChild); - -EXPORTED HWND GetTabChild (HWND hTab); - -EXPORTED HWND GetLastDlgTabItem (HWND hDlg); - -EXPORTED BOOL IsPropSheet (HWND hSheet); - - -#endif - diff --git a/src/WINNT/afsapplib/fastlist.cpp b/src/WINNT/afsapplib/fastlist.cpp deleted file mode 100644 index 4065c8685..000000000 --- a/src/WINNT/afsapplib/fastlist.cpp +++ /dev/null @@ -1,4363 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#define NO_DEBUG_ALLOC // Turn off memory-allocation instrumentation for this - -#include -#include -#include -#include -#include -#include -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define clrTRANSPARENT PALETTERGB(255,0,255) - -typedef struct _FASTLISTITEM - { - LPARAM lpUser; - int index; - - int iFirstImage; - int iSecondImage; - - HLISTITEM hTreeParent; - HLISTITEM hTreeChild; - HLISTITEM hTreePrevious; - HLISTITEM hTreeNext; - HLISTITEM hListPrevious; - HLISTITEM hListNext; - HLISTITEM hSelectPrevious; - HLISTITEM hSelectNext; - - BOOL fExpanded; - BOOL fVisible; - DWORD dwFlags; - BOOL fSelected; - BOOL fFocused; - - LPTSTR *apszText; - size_t cpszText; - } FASTLISTITEM, *LPFASTLISTITEM, LISTITEM, *LPLISTITEM; - - - // We over-allocate the aVisibleHeap[] array whenever it fills up, - // in order to perform fewer allocations. The allocation size - // defined by the macros below causes the following progression - // of array sizes: - // - // 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 24576, 32768, ... - // -#define cREALLOC_VISIBLEHEAP_MIN 128 -#define cREALLOC_VISIBLEHEAP_MAX 4096 -#define cREALLOC_VISIBLEHEAP(pfl) min(max(pfl->cVisibleHeap, cREALLOC_VISIBLEHEAP_MIN),cREALLOC_VISIBLEHEAP_MAX) - -#define dwSigFASTLIST TEXT('FAST') - -typedef struct FASTLIST - { - DWORD dwSig; - HWND hList; - HWND hHeader; - HWND hScrollH; - HWND hScrollV; - DWORD dwStyle; - LONG dxPixel; - LONG dyPixel; - CRITICAL_SECTION cs; - HFONT hf; - BOOL fSortBeforePaint; - BOOL fSyncScrollBeforePaint; - BOOL fSyncIndicesBeforePaint; - BOOL fRepaintRequired; - BOOL fSyncHeaderRequired; - size_t nBegin; - HIMAGELIST hilSmall; - HIMAGELIST hilLarge; - LPFASTLISTTEXTCALLBACK pfnText; - DWORD dwCookieText; - LPFASTLISTSORTFUNC pfnSort; - int iColSort; - BOOL fRevSort; - HLISTITEM hEnsureVisible; - - LPHASHLIST lItems; - LPHASHLISTKEY lkUserParam; - HLISTITEM hTreeFirst; - HLISTITEM hListFirst; - HLISTITEM hSelectFirst; - HLISTITEM hFocused; - HLISTITEM hAnchor; - - BOOL fButtonDown; - BOOL fRightDrag; - BOOL fDragging; - BOOL fTriedToDrag; - POINT ptScreenDown; - HLISTITEM hHitOnDown; - BOOL fSelectedOnDown; - - HD_ITEM *aColumns; - size_t cColumns; - - HLISTITEM *aVisibleHeap; - size_t cVisibleHeap; - size_t cVisible; - } FASTLIST, *LPFASTLIST; - - -/* - * GLOBAL TO FASTLIST _________________________________________________________ - * - */ - -static struct FASTLIST_GLOBAL - { - HBITMAP bmp; - LONG cxBmp; - LONG cyBmp; - HLISTITEM *aObjects; - size_t cObjects; - CRITICAL_SECTION cs; - LPFASTLIST pfl; - } fg; - -#define cREALLOC_OBJECTHEAP 512 - - -/* - * DISPLAY CONSTANTS __________________________________________________________ - * - */ - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - -#ifndef limit -#define limit(_a,_x,_b) min(max((_x),(_a)),(_b)) -#endif - -#ifndef DivRoundUp -#define DivRoundUp(_a,_b) (((_a) + (_b) -1) / (_b)) -#endif - -#define cyABOVE_LARGE_ICON 2 -#define cyBELOW_LARGE_ICON 1 -#define cyABOVE_LARGE_TEXT 1 -#define cyBELOW_LARGE_TEXT 1 -#define cxBEFORE_LARGE_TEXT 1 -#define cxAFTER_LARGE_TEXT 2 - -#define cyABOVE_SMALL_TEXT 1 -#define cyBELOW_SMALL_TEXT 1 -#define cxBEFORE_SMALL_ICON 2 -#define cxAFTER_SMALL_ICON 2 -#define cxBEFORE_SMALL_TEXT 1 -#define cxAFTER_SMALL_TEXT 2 - -#define cxBEFORE_LIST_ICON 2 -#define cxAFTER_LIST_ICON 2 -#define cyABOVE_LIST_TEXT 1 -#define cyBELOW_LIST_TEXT 1 -#define cxBETWEEN_LIST_ICONS 2 -#define cxBEFORE_LIST_TEXT 1 -#define cxAFTER_LIST_TEXT 4 -#define cxBEFORE_COLUMN_TEXT 5 - -#define cxSPACE_TREELINE 2 -#define cySPACE_TREELINE 2 -#define cxTREE_BOX 8 -#define cyTREE_BOX 8 - -#define TREELINE_HORIZONTAL 0x00000001 -#define TREELINE_BOX 0x00000002 -#define TREELINE_BOXOPEN (TREELINE_BOX) -#define TREELINE_BOXCLOSED (0x00000004 | TREELINE_BOX) -#define TREELINE_UP 0x00000008 -#define TREELINE_DOWN 0x00000010 - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -#define fIsShiftDown() (GetKeyState(VK_SHIFT) < 0) -#define fIsControlDown() (GetKeyState(VK_CONTROL) < 0) - -BOOL OpenGlobalBitmap (HDC hdc, RECT *prClient); -void CloseGlobalBitmap (void); - -BOOL OpenGlobalArray (size_t cObjects); -void CloseGlobalArray (void); - -BOOL CALLBACK FastList_ControlProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK FastList_ParentProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void FastList_OnCreate (HWND hList); -void FastList_OnDestroy (HWND hList); -void FastList_OnStyleChange (HWND hList); -void FastList_OnSize (HWND hList); -void FastList_OnPaint (HWND hList); -void FastList_OnPaintItem (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi); -BOOL FastList_OnPaintItem_DrawImage (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, HIMAGELIST hil, int iImage, LONG xImage, LONG yImage, BOOL fHLines); -void FastList_OnPaintItem_GetItemColors (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, COLORREF *pclrFore, COLORREF *pclrBack); -void FastList_OnPaintItem_TreeLines (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, DWORD dwLines, RECT *prLines); -void FastList_OnPaintItem_Large (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi); -void FastList_OnPaintItem_Small (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi); -void FastList_OnPaintItem_Tree (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, HLISTITEM hItem, RECT *prThisColumn); -void FastList_OnPaintItem_List (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi); -void FastList_OnScroll (HWND hList, UINT msg, WPARAM wp, LPARAM lp); -void FastList_OnRightButtonDown (HWND hList); -void FastList_OnLeftButtonDown (HWND hList); -void FastList_OnLeftButtonDouble (HWND hList); -void FastList_OnKeyPress (HWND hList, TCHAR ch); -BOOL FastList_OnKeyPress_EnsureSelection (LPFASTLIST pfl); -void FastList_OnKeyPress_ChangeSelection (LPFASTLIST pfl, HLISTITEM hSelect); - -void FastList_OnCommand_Begin (HWND hList); -void FastList_OnCommand_End (HWND hList, BOOL fForce); -HLISTITEM FastList_OnCommand_AddItem (HWND hList, LPFASTLISTADDITEM pai); -void FastList_OnCommand_RemoveItem (HWND hList, HLISTITEM hItem); -LPCTSTR FastList_OnCommand_GetItemText (HWND hList, HLISTITEM hItem, int iColumn); -void FastList_OnCommand_SetItemText (HWND hList, LPFASTLISTITEMCOLUMN pflic, LPCTSTR pszText); -LPARAM FastList_OnCommand_GetItemParam (HWND hList, HLISTITEM hItem); -void FastList_OnCommand_SetItemParam (HWND hList, HLISTITEM hItem, LPARAM lpUser); -DWORD FastList_OnCommand_GetItemFlags (HWND hList, HLISTITEM hItem); -void FastList_OnCommand_SetItemFlags (HWND hList, HLISTITEM hItem, DWORD dwFlags); -int FastList_OnCommand_GetItemImage (HWND hList, HLISTITEM hItem, int iImage); -void FastList_OnCommand_SetItemImage (HWND hList, LPFASTLISTITEMIMAGE pflii, int iImage); -void FastList_OnCommand_GetImageLists (HWND hList, HIMAGELIST *phiSmall, HIMAGELIST *phiLarge); -void FastList_OnCommand_SetImageLists (HWND hList, HIMAGELIST hiSmall, HIMAGELIST hiLarge); -HIMAGELIST FastList_OnCommand_CreateDragImage (HWND hList, HLISTITEM hItem); -LPFASTLISTSORTFUNC FastList_OnCommand_GetSortFunc (HWND hList); -void FastList_OnCommand_SetSortFunc (HWND hList, LPFASTLISTSORTFUNC pfn); -void FastList_OnCommand_GetSortStyle (HWND hList, int *piColSort, BOOL *pfRevSort); -void FastList_OnCommand_SetSortStyle (HWND hList, int iColSort, BOOL fRevSort); -void FastList_OnCommand_Sort (HWND hList); -int FastList_OnCommand_GetColumnCount (HWND hList); -BOOL FastList_OnCommand_GetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol); -void FastList_OnCommand_SetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol); -BOOL FastList_OnCommand_IsSelected (HWND hList, HLISTITEM hItem); -void FastList_OnCommand_SelectItem (HWND hList, HLISTITEM hItem, BOOL fSelect); -HLISTITEM FastList_OnCommand_FindList (HWND hList, HLISTITEM hItem, DWORD dwCode); -HLISTITEM FastList_OnCommand_FindTree (HWND hList, HLISTITEM hItem, DWORD dwCode); -HLISTITEM FastList_OnCommand_FindSelected (HWND hList, HLISTITEM hItem); -HLISTITEM FastList_OnCommand_FindItem (HWND hList, LPENUM *ppEnum, LPARAM lpUser); -HLISTITEM FastList_OnCommand_FindNextItem (HWND hList, LPENUM *ppEnum); -HLISTITEM FastList_OnCommand_FindVisible (HWND hList, HLISTITEM hItem, DWORD dwCode); -void FastList_OnCommand_FindClose (HWND hList, LPENUM *ppEnum); -int FastList_OnCommand_GetItemCount (HWND hList, BOOL fVisibleOnly); -BOOL FastList_OnCommand_IsExpanded (HWND hList, HLISTITEM hItem); -void FastList_OnCommand_Expand (HWND hList, HLISTITEM hItem, BOOL fExpand); -BOOL FastList_OnCommand_ItemVisible (HWND hList, HLISTITEM hItem, BOOL fSet); -HLISTITEM FastList_OnCommand_ItemFocus (HWND hList, HLISTITEM hItem, BOOL fSet); -HLISTITEM FastList_OnCommand_ItemFromPoint (HWND hList, POINT *pptClient, BOOL fStrict); -void FastList_OnCommand_GetItemRegions (HWND hList, HLISTITEM hItem, LPFASTLISTITEMREGIONS pReg, POINT *pptTest = NULL, BOOL *pfHit = NULL); -LPFASTLISTTEXTCALLBACK FastList_OnCommand_GetTextCallback (HWND hList); -void FastList_OnCommand_SetTextCallback (HWND hList, LPFASTLISTTEXTCALLBACK pfn, DWORD dwCookie); - -BOOL FastList_Notify_GetItemText (LPFASTLIST pfl, HLISTITEM hItem, int icol, LPTSTR pszText, size_t cchText, size_t *pcchRequired); -BOOL FastList_Notify_ItemChanged (LPFASTLIST pfl, HLISTITEM hItem); -BOOL FastList_Notify_AddItem (LPFASTLIST pfl, HLISTITEM hItem); -BOOL FastList_Notify_RemoveItem (LPFASTLIST pfl, HLISTITEM hItem); -BOOL FastList_Notify_ColumnClick (LPFASTLIST pfl, int icol, BOOL fDouble); -BOOL FastList_Notify_ColumnResize (LPFASTLIST pfl, int icol, LONG cxWidth); -BOOL FastList_Notify_ItemSelect (LPFASTLIST pfl); -BOOL FastList_Notify_ItemExpand (LPFASTLIST pfl, HLISTITEM hItem); -BOOL FastList_Notify_Generic (LPFASTLIST pfl, DWORD dwCode); -BOOL FastList_Notify_Drag (LPFASTLIST pfl, DWORD dwCode, LPFLN_DRAG_PARAMS pfln); - -void FastList_Repaint (LPFASTLIST pfl); -HLISTITEM FastList_CreateItem (LPFASTLIST pfl); -void FastList_DeleteItem (LPFASTLIST pfl, HLISTITEM hItem); -int FastList_GetListHeight (LPFASTLIST pfl); -int FastList_GetListWidth (LPFASTLIST pfl); -void FastList_CalcItemRect (LPFASTLIST pfl, int index, RECT *prItem, BOOL fScrollH, BOOL fScrollV); -void FastList_CalcFieldSize (LPFASTLIST pfl, LONG *pcxField, LONG *pcyField, BOOL fScrollH, BOOL fScrollV); -void FastList_GetHeaderRect (LPFASTLIST pfl, RECT *prHeader); -LONG FastList_GetHeaderHeight (LPFASTLIST pfl); -void FastList_UpdateColumn (LPFASTLIST pfl, int iColumn); -void FastList_SyncHeader (LPFASTLIST pfl); -void FastList_SyncScroll (LPFASTLIST pfl); -void FastList_SyncScrollPos (LPFASTLIST pfl); -void FastList_CallPaintItem (LPFASTLIST pfl, HDC hdc, BOOL fDraw, BOOL fDragImage, int iItem, RECT *prItem, LPFASTLISTITEMREGIONS pReg, POINT *pptTest, BOOL *pfHit); -LPTSTR FastList_GetColumnText (LPFASTLIST pfl, HLISTITEM hItem, int icol, BOOL fAlternateBuffer = FALSE); -void FastList_PerformSort (LPFASTLIST pfl); -void FastList_PerformSortLevel (LPFASTLIST pfl, HLISTITEM hParent, BOOL fTreeSort); -int __cdecl FastList_SortFunction (const void *lp1, const void *lp2); -void FastList_RepairOneVisibilityFlag (LPFASTLIST pfl, HLISTITEM hItem); -void FastList_RepairVisibilityFlags (LPFASTLIST pfl, HLISTITEM hParent = NULL, BOOL fForceHidden = FALSE); -void FastList_RepairVisibilityIndices (LPFASTLIST pfl, HLISTITEM hParent = NULL); -void FastList_ScrollHeader (LPFASTLIST pfl); -void FastList_PerformSelectTest (LPFASTLIST pfl, HLISTITEM hItem); -void FastList_PerformSelectItem (LPFASTLIST pfl, HLISTITEM hItem, BOOL fSelect); -void FastList_PerformSelectRange (LPFASTLIST pfl, HLISTITEM hItem1, HLISTITEM hItem2); -void FastList_PerformEnsureVisible (LPFASTLIST pfl); -void FastList_ButtonDown (HWND hList, BOOL fRightButton, BOOL fActivate); -void FastList_MouseMove (HWND hList); -void FastList_ButtonUp (HWND hList, BOOL fRightButton, BOOL fActivate); - -LPFASTLIST GetFastList (HWND hList); - -BOOL CALLBACK FastList_KeyUserParam_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); -HASHVALUE CALLBACK FastList_KeyUserParam_HashObject (LPHASHLISTKEY pKey, PVOID pObject); -HASHVALUE CALLBACK FastList_KeyUserParam_HashData (LPHASHLISTKEY pKey, PVOID pData); - - -/* - * REALLOC ____________________________________________________________________ - * - */ - -#ifdef REALLOC -#undef REALLOC -#endif -#define REALLOC(_a,_c,_r,_i) FastList_ReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL FastList_ReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} - - -/* - * WINDOW CLASS SUPPORT _______________________________________________________ - * - */ - -BOOL RegisterFastListClass (void) -{ - static BOOL fRegistered = FALSE; - - if (!fRegistered) - { - memset (&fg, 0x00, sizeof(fg)); - InitializeCriticalSection (&fg.cs); - - WNDCLASS wc; - GetClassInfo (THIS_HINST, TEXT("LISTBOX"), &wc); - wc.style = CS_GLOBALCLASS | CS_DBLCLKS; - wc.cbWndExtra = 4; - wc.lpfnWndProc = (WNDPROC)FastList_ControlProc; - wc.hInstance = THIS_HINST; - wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE (IDC_ARROW)); - wc.hbrBackground = NULL; - wc.lpszClassName = WC_FASTLIST; - - if (RegisterClass (&wc)) - fRegistered = TRUE; - } - - return fRegistered; -} - - -BOOL OpenGlobalBitmap (HDC hdc, RECT *prClient) -{ - EnterCriticalSection (&fg.cs); - - if ((!fg.bmp) || (fg.cxBmp < prClient->right) || (fg.cyBmp < prClient->bottom)) - { - if (fg.bmp) - DeleteObject (fg.bmp); - - fg.cxBmp = 128 * DivRoundUp (prClient->right, 128); - fg.cyBmp = 64 * DivRoundUp (prClient->bottom, 64); - fg.bmp = CreateCompatibleBitmap (hdc, fg.cxBmp, fg.cyBmp); - } - - if (!fg.bmp) - { - LeaveCriticalSection (&fg.cs); - return FALSE; - } - - return TRUE; -} - - -void CloseGlobalBitmap (void) -{ - LeaveCriticalSection (&fg.cs); -} - - -BOOL OpenGlobalArray (size_t cObjects) -{ - EnterCriticalSection (&fg.cs); - REALLOC (fg.aObjects, fg.cObjects, cObjects, cREALLOC_OBJECTHEAP); - memset (fg.aObjects, 0x00, sizeof(HLISTITEM) * fg.cObjects); - return TRUE; -} - - -void CloseGlobalArray (void) -{ - LeaveCriticalSection (&fg.cs); -} - - -BOOL CALLBACK FastList_ControlProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_CREATE: - FastList_OnCreate (hList); - if (GetParent (hList)) - Subclass_AddHook (GetParent (hList), FastList_ParentProc); - break; - - case WM_DESTROY: - if (GetParent (hList)) - Subclass_RemoveHook (GetParent (hList), FastList_ParentProc); - FastList_OnDestroy (hList); - break; - - case WM_GETDLGCODE: - return DLGC_WANTARROWS; - - case WM_STYLECHANGED: - FastList_OnStyleChange (hList); - break; - - case WM_ENABLE: - FastList_Repaint (GetFastList (hList)); - break; - - case WM_SIZE: - FastList_OnSize (hList); - break; - - case WM_PAINT: - FastList_OnPaint (hList); - break; - - case WM_LBUTTONDOWN: - FastList_OnLeftButtonDown (hList); - break; - - case WM_RBUTTONDOWN: - FastList_OnRightButtonDown (hList); - break; - - case WM_LBUTTONUP: - FastList_ButtonUp (hList, FALSE, FALSE); - break; - - case WM_RBUTTONUP: - FastList_ButtonUp (hList, TRUE, FALSE); - break; - - case WM_MOUSEMOVE: - FastList_MouseMove (hList); - break; - - case WM_LBUTTONDBLCLK: - FastList_OnLeftButtonDouble (hList); - break; - - case WM_KEYDOWN: - FastList_OnKeyPress (hList, (TCHAR)wp); - break; - - case WM_NOTIFY: - switch (((NMHDR*)lp)->code) - { - case HDN_ITEMCLICK: - FastList_Notify_ColumnClick (GetFastList (hList), ((HD_NOTIFY*)lp)->iItem, FALSE); - break; - - case HDN_ITEMDBLCLICK: - FastList_Notify_ColumnClick (GetFastList (hList), ((HD_NOTIFY*)lp)->iItem, TRUE); - break; - - case HDN_ITEMCHANGED: - case HDN_ENDTRACK: - case HDN_TRACK: - FastList_UpdateColumn (GetFastList (hList), ((HD_NOTIFY*)lp)->iItem); - break; - } - break; - - case WM_HSCROLL: - case WM_VSCROLL: - FastList_OnScroll (hList, msg, wp, lp); - break; - - case FLM_BEGIN: - FastList_OnCommand_Begin (hList); - return TRUE; - - case FLM_END: - FastList_OnCommand_End (hList, (BOOL)wp); - return TRUE; - - case FLM_ADDITEM: - return (BOOL)FastList_OnCommand_AddItem (hList, (LPFASTLISTADDITEM)lp); - - case FLM_REMOVEITEM: - FastList_OnCommand_RemoveItem (hList, (HLISTITEM)wp); - return TRUE; - - case FLM_GETITEMTEXT: - return (BOOL)FastList_OnCommand_GetItemText (hList, (HLISTITEM)wp, (int)lp); - - case FLM_SETITEMTEXT: - FastList_OnCommand_SetItemText (hList, (LPFASTLISTITEMCOLUMN)wp, (LPCTSTR)lp); - return TRUE; - - case FLM_GETITEMPARAM: - return (BOOL)FastList_OnCommand_GetItemParam (hList, (HLISTITEM)wp); - - case FLM_SETITEMPARAM: - FastList_OnCommand_SetItemParam (hList, (HLISTITEM)wp, lp); - return TRUE; - - case FLM_GETITEMFLAGS: - return (BOOL)FastList_OnCommand_GetItemFlags (hList, (HLISTITEM)wp); - - case FLM_SETITEMFLAGS: - FastList_OnCommand_SetItemFlags (hList, (HLISTITEM)wp, (DWORD)lp); - return TRUE; - - case FLM_GETITEMIMAGE: - return (BOOL)FastList_OnCommand_GetItemImage (hList, (HLISTITEM)wp, (int)lp); - - case FLM_SETITEMIMAGE: - FastList_OnCommand_SetItemImage (hList, (LPFASTLISTITEMIMAGE)wp, (int)lp); - return TRUE; - - case FLM_ISEXPANDED: - return (BOOL)FastList_OnCommand_IsExpanded (hList, (HLISTITEM)wp); - - case FLM_EXPAND: - FastList_OnCommand_Expand (hList, (HLISTITEM)wp, (BOOL)lp); - return TRUE; - - case FLM_ITEMVISIBLE: - return (BOOL)FastList_OnCommand_ItemVisible (hList, (HLISTITEM)wp, (BOOL)lp); - - case FLM_ITEMFOCUS: - return (BOOL)FastList_OnCommand_ItemFocus (hList, (HLISTITEM)wp, (BOOL)lp); - - case FLM_GETIMAGELISTS: - FastList_OnCommand_GetImageLists (hList, (HIMAGELIST*)wp, (HIMAGELIST*)lp); - return TRUE; - - case FLM_SETIMAGELISTS: - FastList_OnCommand_SetImageLists (hList, (HIMAGELIST)wp, (HIMAGELIST)lp); - return TRUE; - - case FLM_CREATEDRAGIMAGE: - return (BOOL)FastList_OnCommand_CreateDragImage (hList, (HLISTITEM)wp); - - case FLM_GETSORTFUNC: - return (BOOL)FastList_OnCommand_GetSortFunc (hList); - - case FLM_SETSORTFUNC: - FastList_OnCommand_SetSortFunc (hList, (LPFASTLISTSORTFUNC)lp); - return TRUE; - - case FLM_GETSORTSTYLE: - FastList_OnCommand_GetSortStyle (hList, (int*)wp, (BOOL*)lp); - return TRUE; - - case FLM_SETSORTSTYLE: - FastList_OnCommand_SetSortStyle (hList, (int)wp, (BOOL)lp); - return TRUE; - - case FLM_SORT: - FastList_OnCommand_Sort (hList); - return TRUE; - - case FLM_GETCOLUMNCOUNT: - return (BOOL)FastList_OnCommand_GetColumnCount (hList); - - case FLM_GETCOLUMN: - return FastList_OnCommand_GetColumn (hList, (int)wp, (LPFASTLISTCOLUMN)lp); - - case FLM_SETCOLUMN: - FastList_OnCommand_SetColumn (hList, (int)wp, (LPFASTLISTCOLUMN)lp); - return TRUE; - - case FLM_ISSELECTED: - return (BOOL)FastList_OnCommand_IsSelected (hList, (HLISTITEM)wp); - - case FLM_SELECTITEM: - FastList_OnCommand_SelectItem (hList, (HLISTITEM)wp, (BOOL)lp); - return TRUE; - - case FLM_FINDLIST: - return (BOOL)FastList_OnCommand_FindList (hList, (HLISTITEM)wp, (DWORD)lp); - - case FLM_FINDTREE: - return (BOOL)FastList_OnCommand_FindTree (hList, (HLISTITEM)wp, (DWORD)lp); - - case FLM_FINDSELECTED: - return (BOOL)FastList_OnCommand_FindSelected (hList, (HLISTITEM)wp); - - case FLM_FINDITEM: - return (BOOL)FastList_OnCommand_FindItem (hList, (LPENUM*)wp, lp); - - case FLM_FINDNEXTITEM: - return (BOOL)FastList_OnCommand_FindNextItem (hList, (LPENUM*)wp); - - case FLM_FINDCLOSE: - FastList_OnCommand_FindClose (hList, (LPENUM*)wp); - return TRUE; - - case FLM_FINDVISIBLE: - return (BOOL)FastList_OnCommand_FindVisible (hList, (HLISTITEM)wp, (DWORD)lp); - - case FLM_GETITEMCOUNT: - return (BOOL)FastList_OnCommand_GetItemCount (hList, (BOOL)wp); - - case FLM_ITEMFROMPOINT: - return (BOOL)FastList_OnCommand_ItemFromPoint (hList, (POINT*)wp, (BOOL)lp); - - case FLM_GETITEMREGIONS: - FastList_OnCommand_GetItemRegions (hList, (HLISTITEM)wp, (LPFASTLISTITEMREGIONS)lp); - return TRUE; - - case FLM_GETTEXTCALLBACK: - return (BOOL)FastList_OnCommand_GetTextCallback (hList); - - case FLM_SETTEXTCALLBACK: - FastList_OnCommand_SetTextCallback (hList, (LPFASTLISTTEXTCALLBACK)wp, (DWORD)lp); - return TRUE; - } - - return DefWindowProc (hList, msg, wp, lp); -} - - -BOOL CALLBACK FastList_ParentProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID oldProc = Subclass_FindNextHook (hDlg, FastList_ParentProc); - - switch (msg) - { - case WM_DRAWITEM: - LPFASTLIST pfl; - if ((pfl = GetFastList (GetDlgItem (hDlg, wp))) != NULL) - { - FastList_OnPaintItem (pfl, (LPFASTLISTDRAWITEM)lp); - return TRUE; - } - break; - - case WM_NOTIFY: - if ((pfl = GetFastList (GetDlgItem (hDlg, wp))) != NULL) - { - switch (((NMHDR*)lp)->code) - { - case FLN_COLUMNCLICK: - if (pfl->dwStyle & FLS_AUTOSORTHEADER) - { - LPFLN_COLUMNCLICK_PARAMS pp = (LPFLN_COLUMNCLICK_PARAMS)lp; - - if (pfl->iColSort == pp->icol) - FastList_SetSortStyle (pfl->hList, pp->icol, !pfl->fRevSort); - else - FastList_SetSortStyle (pfl->hList, pp->icol, FALSE); - } - break; - } - } - break; - } - - return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp); -} - - -/* - * MESSAGE HANDLING ___________________________________________________________ - * - */ - -void FastList_OnCreate (HWND hList) -{ - LPFASTLIST pfl = New (FASTLIST); - memset (pfl, 0x00, sizeof(FASTLIST)); - SetWindowLong (hList, 0, (LONG)pfl); - pfl->pfnSort = NULL; - pfl->pfnText = NULL; - pfl->dwCookieText = 0; - - InitializeCriticalSection (&pfl->cs); - pfl->dwSig = dwSigFASTLIST; - pfl->hList = hList; - pfl->dwStyle = GetWindowLong (hList, GWL_STYLE); - pfl->hf = (HFONT)GetStockObject (DEFAULT_GUI_FONT); - - pfl->lItems = New (HASHLIST); - pfl->lItems->SetCriticalSection (&pfl->cs); - pfl->lkUserParam = pfl->lItems->CreateKey ("User Param", FastList_KeyUserParam_Compare, FastList_KeyUserParam_HashObject, FastList_KeyUserParam_HashData); - - FastList_Begin (pfl->hList); - - if (!(pfl->dwStyle & WS_CLIPCHILDREN)) - SetWindowLong (pfl->hList, GWL_STYLE, pfl->dwStyle | WS_CLIPCHILDREN); - - FastList_SyncHeader (pfl); - FastList_Repaint (pfl); - FastList_End (pfl->hList); -} - - -void FastList_OnDestroy (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (pfl->hHeader) - DestroyWindow (pfl->hHeader); - if (pfl->hScrollH) - DestroyWindow (pfl->hScrollH); - if (pfl->hScrollV) - DestroyWindow (pfl->hScrollV); - if (pfl->aVisibleHeap) - Free (pfl->aVisibleHeap); - if (pfl->aColumns) - { - for (size_t iColumn = 0; iColumn < pfl->cColumns; ++iColumn) - if (pfl->aColumns[ iColumn ].pszText) - Free (pfl->aColumns[ iColumn ].pszText); - Free (pfl->aColumns); - } - DeleteObject (pfl->hf); - Delete (pfl->lItems); - DeleteCriticalSection (&pfl->cs); - SetWindowLong (hList, 0, 0); - Delete (pfl); - } -} - - -void FastList_OnStyleChange (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - BOOL fWasTree = ((pfl->dwStyle & FLS_VIEW_TREE) == FLS_VIEW_TREE) ? TRUE : FALSE; - - pfl->dwStyle = GetWindowLong (hList, GWL_STYLE); - - BOOL fIsTree = ((pfl->dwStyle & FLS_VIEW_TREE) == FLS_VIEW_TREE) ? TRUE : FALSE; - if (fWasTree != fIsTree) - { - FastList_RepairVisibilityFlags (pfl); - pfl->fSortBeforePaint = TRUE; - } - - FastList_SyncHeader (pfl); - FastList_Repaint (pfl); - } -} - - -void FastList_OnSize (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - FastList_SyncHeader (pfl); - FastList_Repaint (pfl); - } -} - - -void FastList_OnPaint (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (pfl->nBegin) - { - pfl->fRepaintRequired = TRUE; - } - else // (!pfl->nBegin) - { - if (pfl->fSortBeforePaint) - FastList_PerformSort (pfl); - if (pfl->fSyncIndicesBeforePaint) - FastList_RepairVisibilityIndices (pfl); - if (pfl->fSyncScrollBeforePaint) - FastList_SyncScroll (pfl); - if (pfl->hEnsureVisible) - FastList_PerformEnsureVisible (pfl); - } - - PAINTSTRUCT ps; - HDC hdc = BeginPaint (hList, &ps); - - // If we're showing both scrollbars, grey-wash the rectangle - // in the bottom-right where they meet. - // - if ((pfl->hScrollH) && (pfl->hScrollV)) - { - RECT rBox; - GetClientRect (pfl->hList, &rBox); - rBox.left = rBox.right - GetSystemMetrics(SM_CXVSCROLL); - rBox.top = rBox.bottom - GetSystemMetrics(SM_CYHSCROLL); - - HBRUSH hbr = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - FillRect (hdc, &rBox, hbr); - DeleteObject (hbr); - } - - // Just what client area is left, after we skip the scrollbar and - // header regions? - // - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (pfl->hScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - // If possible, we want to draw onto an off-screen bitmap then blit - // the relevant sections onto the client area; this eliminates flicker - // as items are erased and redrawn. - // - HDC hdcTarget = hdc; - HBITMAP bmpTargetOld = NULL; - - BOOL fDoubleBuffer; - if ((fDoubleBuffer = OpenGlobalBitmap (hdc, &rClient)) == TRUE) - { - hdcTarget = CreateCompatibleDC (hdc); - bmpTargetOld = (HBITMAP)SelectObject (hdcTarget, fg.bmp); - } - - HFONT hfOld = (HFONT)SelectObject (hdcTarget, pfl->hf); - - // Determine which objects we can display on the screen, and paint - // each in turn. If there is no object at a particular location, - // just white- or grey-fill the background. - // - RECT rTemplate; - FastList_CalcItemRect (pfl, 0, &rTemplate, !!pfl->hScrollH, !!pfl->hScrollV); - - HBRUSH hbrBackground = CreateSolidBrush (GetSysColor( (IsWindowEnabled(pfl->hList)) ? COLOR_WINDOW : COLOR_BTNFACE )); - FillRect (hdcTarget, &rClient, hbrBackground); - - if (!pfl->nBegin) - { - switch (pfl->dwStyle & FLS_VIEW_MASK) - { - case FLS_VIEW_LARGE: - { - // In Large mode, icons are stacked left-to-right, top-to-bottom. - // Find the top index, and for each vertical index thereafter, - // find and paint the relevant horizontal indices. - // - LONG cxItems = cxRECT(rClient) / cxRECT(rTemplate); - - LONG iyTopItem = pfl->dyPixel / cyRECT(rTemplate); - LONG iyBottomItem = iyTopItem + DivRoundUp (cyRECT(rClient), cyRECT(rTemplate)); - - for (LONG iyItem = iyTopItem; iyItem <= iyBottomItem; ++iyItem) - { - for (LONG ixItem = 0; ixItem < cxItems; ++ixItem) - { - int iItem = (int)( ixItem + cxItems * iyItem ); - if (iItem < (int)pfl->cVisible) - { - RECT rItem; - rItem.top = rClient.top + iyItem * cyRECT(rTemplate) - pfl->dyPixel; - rItem.bottom = rItem.top + cyRECT(rTemplate); - rItem.left = rClient.left + ixItem * cxRECT(rTemplate) - pfl->dxPixel; - rItem.right = rItem.left + cxRECT(rTemplate); - - FastList_CallPaintItem (pfl, hdcTarget, TRUE, FALSE, iItem, &rItem, NULL, NULL, NULL); - } - } - } - break; - } - - case FLS_VIEW_SMALL: - { - // In Small mode, icons are stacked top-to-bottom, left-to-right. - // Find the left index, and for each horizontal index thereafter, - // find and paint the relevant vertical indices. - // - LONG cyItems = cyRECT(rClient) / cyRECT(rTemplate); - - LONG ixLeftItem = pfl->dxPixel / cxRECT(rTemplate); - LONG ixRightItem = ixLeftItem + DivRoundUp (cxRECT(rClient), cxRECT(rTemplate)); - - for (LONG ixItem = ixLeftItem; ixItem <= ixRightItem; ++ixItem) - { - for (LONG iyItem = 0; iyItem < cyItems; ++iyItem) - { - int iItem = (int)( iyItem + cyItems * ixItem ); - if (iItem < (int)pfl->cVisible) - { - RECT rItem; - rItem.top = rClient.top + iyItem * cyRECT(rTemplate) - pfl->dyPixel; - rItem.bottom = rItem.top + cyRECT(rTemplate); - rItem.left = rClient.left + ixItem * cxRECT(rTemplate) - pfl->dxPixel; - rItem.right = rItem.left + cxRECT(rTemplate); - - FastList_CallPaintItem (pfl, hdcTarget, TRUE, FALSE, iItem, &rItem, NULL, NULL, NULL); - } - } - } - break; - } - - case FLS_VIEW_LIST: - case FLS_VIEW_TREE: - case FLS_VIEW_TREELIST: - { - // In these modes, icons are stacked top-to-bottom; each takes - // the entire width we can give it. Find the top index, and - // paint all indices which fit on the screen. - // - LONG iTopItem = pfl->dyPixel / cyRECT(rTemplate); - LONG iBottomItem = iTopItem + DivRoundUp (cyRECT(rClient), cyRECT(rTemplate)); - - for (LONG iItem = iTopItem; iItem <= iBottomItem; ++iItem) - { - if (iItem < (int)pfl->cVisible) - { - RECT rItem; - rItem.top = rClient.top + iItem * cyRECT(rTemplate) - pfl->dyPixel; - rItem.bottom = rItem.top + cyRECT(rTemplate); - rItem.left = rClient.left - pfl->dxPixel; - rItem.right = rItem.left + cxRECT(rTemplate); - - FastList_CallPaintItem (pfl, hdcTarget, TRUE, FALSE, iItem, &rItem, NULL, NULL, NULL); - } - } - break; - } - } - } - - if (fDoubleBuffer) - { - BitBlt (hdc, rClient.left, rClient.top, cxRECT(rClient), cyRECT(rClient), - hdcTarget, rClient.left, rClient.top, SRCCOPY); - SelectObject (hdcTarget, bmpTargetOld); - DeleteDC (hdcTarget); - CloseGlobalBitmap(); - } - - DeleteObject (hbrBackground); - SelectObject (hdcTarget, hfOld); - EndPaint (hList, &ps); - } -} - - -void FastList_OnPaintItem (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi) -{ - // Initialize the output FASTLISTITEMREGIONS structure. - // We were given the object's overall rectangle, and will - // calculate each of the other regions as we go along. - // - memset (&pdi->reg, 0x00, sizeof(pdi->reg)); - pdi->reg.rItem = pdi->rItem; - pdi->fTextTestHit = FALSE; - - // The actual paint routine we'll use depends on the current view. - // - switch (pfl->dwStyle & FLS_VIEW_MASK) - { - case FLS_VIEW_LARGE: - FastList_OnPaintItem_Large (pfl, pdi); - break; - - case FLS_VIEW_SMALL: - FastList_OnPaintItem_Small (pfl, pdi); - break; - - case FLS_VIEW_LIST: - case FLS_VIEW_TREE: - case FLS_VIEW_TREELIST: - FastList_OnPaintItem_List (pfl, pdi); - break; - } - - UnionRect (&pdi->reg.rSelect, &pdi->reg.rHighlight, &pdi->reg.rImage); -} - - -void FastList_OnPaintItem_TreeLines (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, DWORD dwLines, RECT *prThisColumn) -{ - if (prThisColumn->left >= prThisColumn->right) - return; - - RECT rLines; - rLines.left = prThisColumn->left; - rLines.right = rLines.left +GetSystemMetrics(SM_CXSMICON) +cxAFTER_LIST_ICON; - rLines.top = prThisColumn->top; - rLines.bottom = prThisColumn->bottom; - prThisColumn->left = rLines.right; - - LONG xBox = rLines.left + (GetSystemMetrics(SM_CXSMICON) - cxTREE_BOX)/2; - LONG xLine = xBox + cxTREE_BOX/2; - - LONG yLine = rLines.top + cyRECT(rLines)/2; - LONG yBox = yLine - cyTREE_BOX/2; - - if (dwLines & TREELINE_BOX) - { - pdi->reg.rButton.left = xBox; - pdi->reg.rButton.right = xBox +cxTREE_BOX +1; - pdi->reg.rButton.top = yBox; - pdi->reg.rButton.bottom = yBox +cyTREE_BOX +1; - } - - if (pdi->fDraw) - { - COLORREF clrBG = GetSysColor (COLOR_WINDOW); - COLORREF clrFG = GetSysColor (COLOR_BTNSHADOW); - if (!IsWindowEnabled (pfl->hList)) - clrBG = GetSysColor (COLOR_BTNFACE); - - if (dwLines & TREELINE_HORIZONTAL) - { - for (LONG xx = (dwLines & TREELINE_BOX) ? (xBox +cxTREE_BOX) : (dwLines & TREELINE_UP) ? xLine : (rLines.left+1); xx <= rLines.right+1; xx += cxSPACE_TREELINE) - SetPixel (pdi->hdc, xx, yLine, clrFG); - } - - if (dwLines & TREELINE_UP) - { - for (LONG yy = (dwLines & TREELINE_BOX) ? yBox : yLine; yy >= rLines.top; yy -= cySPACE_TREELINE) - SetPixel (pdi->hdc, xLine, yy, clrFG); - } - - if (dwLines & TREELINE_DOWN) - { - for (LONG yy = (dwLines & TREELINE_BOX) ? (yBox +cyTREE_BOX) : yLine; yy <= rLines.bottom; yy += cySPACE_TREELINE) - SetPixel (pdi->hdc, xLine, yy, clrFG); - } - - if (dwLines & TREELINE_BOX) - { - HPEN hpNew = CreatePen (PS_SOLID, 1, clrFG); - HPEN hpOld = (HPEN)SelectObject (pdi->hdc, hpNew); - - MoveToEx (pdi->hdc, xBox, yBox, NULL); - LineTo (pdi->hdc, xBox +cxTREE_BOX, yBox); - LineTo (pdi->hdc, xBox +cxTREE_BOX, yBox +cyTREE_BOX); - LineTo (pdi->hdc, xBox, yBox +cyTREE_BOX); - LineTo (pdi->hdc, xBox, yBox); - - SelectObject (pdi->hdc, GetStockObject (BLACK_PEN)); - - MoveToEx (pdi->hdc, xBox +2, yLine, NULL); - LineTo (pdi->hdc, xBox +cxTREE_BOX -1, yLine); - - if ((dwLines & TREELINE_BOXCLOSED) == TREELINE_BOXCLOSED) - { - MoveToEx (pdi->hdc, xLine, yBox +2, NULL); - LineTo (pdi->hdc, xLine, yBox +cyTREE_BOX -1); - } - - SelectObject (pdi->hdc, hpOld); - DeleteObject (hpNew); - } - } -} - - -BOOL FastList_OnPaintItem_DrawImage (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, HIMAGELIST hil, int iImage, LONG xImage, LONG yImage, BOOL fHLines) -{ - if (hil == NULL) - return FALSE; - if (iImage == IMAGE_NOIMAGE) - return FALSE; - - RECT rImage; - rImage.left = xImage; - rImage.right = rImage.left + GetSystemMetrics ((hil == pfl->hilLarge) ? SM_CXICON : SM_CXSMICON); - rImage.top = yImage; - rImage.bottom = rImage.top + GetSystemMetrics ((hil == pfl->hilLarge) ? SM_CYICON : SM_CYSMICON); - - if (pdi->fDraw) - { - if (iImage == IMAGE_BLANKIMAGE) - { - if (fHLines && ((pfl->dwStyle & FLS_VIEW_TREE) == FLS_VIEW_TREE)) - { - RECT rLine; - rLine.left = xImage; - rLine.right = rLine.left + GetSystemMetrics(SM_CXSMICON); - rLine.top = yImage; - rLine.bottom = rLine.top + GetSystemMetrics(SM_CYSMICON); - FastList_OnPaintItem_TreeLines (pfl, pdi, TREELINE_HORIZONTAL, &rLine); - } - } - else // An actual image was specified to be drawn. - { - if (!ImageList_Draw (hil, iImage, pdi->hdc, rImage.left, rImage.top, (pdi->fDragImage) ? ILD_TRANSPARENT : (!IsWindowEnabled(pfl->hList)) ? ILD_TRANSPARENT : (pdi->hItem->fSelected) ? ILD_SELECTED : (pdi->hItem->fFocused) ? ILD_FOCUS : ILD_TRANSPARENT)) - return FALSE; - } - } - - if (IsRectEmpty (&pdi->reg.rImage)) - pdi->reg.rImage = rImage; - else - UnionRect (&pdi->reg.rImage, &pdi->reg.rImage, &rImage); - - return TRUE; -} - - -void FastList_OnPaintItem_GetItemColors (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, COLORREF *pclrFore, COLORREF *pclrBack) -{ - if (pdi->fDragImage) - { - *pclrFore = GetSysColor (COLOR_WINDOWTEXT); - *pclrBack = clrTRANSPARENT; - } - else if (!IsWindowEnabled (pfl->hList)) - { - *pclrFore = GetSysColor (COLOR_GRAYTEXT); - *pclrBack = GetSysColor (COLOR_BTNFACE); - } - else if ( (pdi->hItem->fSelected) || (pdi->hItem->dwFlags & FLIF_DROPHIGHLIGHT) ) - { - *pclrFore = GetSysColor (COLOR_HIGHLIGHTTEXT); - *pclrBack = GetSysColor (COLOR_HIGHLIGHT); - } - else // normal colors - { - *pclrFore = GetSysColor (COLOR_WINDOWTEXT); - *pclrBack = GetSysColor (COLOR_WINDOW); - } -} - - -void FastList_OnPaintItem_Large (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi) -{ - // If there is an image associated with this item, draw it. Remember - // that if there are *two* images, draw the second one--it's the primary - // image, or the user wouldn't have bothered adding it. - // - int iImage = pdi->hItem->iFirstImage; - if (pdi->hItem->iSecondImage != IMAGE_NOIMAGE) - iImage = pdi->hItem->iSecondImage; - if (iImage != IMAGE_NOIMAGE) - { - LONG xImage = pdi->rItem.left + (cxRECT(pdi->rItem) - GetSystemMetrics(SM_CXICON))/2; - LONG yImage = pdi->rItem.top + cyABOVE_LARGE_ICON; - FastList_OnPaintItem_DrawImage (pfl, pdi, pfl->hilLarge, iImage, xImage, yImage, FALSE); - } - - // If there is any column-0 text supplied for this item, draw that below - // the item's icon. - // - LPTSTR pszColumnText = FastList_GetColumnText (pfl, pdi->hItem, 0); - if (pszColumnText && *pszColumnText) - { - RECT rTextSize; - SetRectEmpty (&rTextSize); - rTextSize.right = cxRECT(pdi->rItem) - cxBEFORE_LARGE_TEXT - cxAFTER_LARGE_TEXT -2; - - if (!DrawTextEx (pdi->hdc, pszColumnText, lstrlen(pszColumnText), &rTextSize, DT_CENTER | DT_CALCRECT | DT_WORDBREAK | DT_END_ELLIPSIS | DT_NOPREFIX, 0)) - rTextSize.right = rTextSize.left; - - RECT rText = pdi->rItem; - rText.left += (cxRECT(pdi->rItem)-cxRECT(rTextSize))/2; - rText.right -= (cxRECT(pdi->rItem)-cxRECT(rTextSize))/2; - rText.top += cyABOVE_LARGE_ICON + GetSystemMetrics(SM_CYICON) + cyBELOW_LARGE_ICON + cyABOVE_LARGE_TEXT; - rText.bottom = min( pdi->rItem.bottom - cyBELOW_LARGE_TEXT, (rText.top + cyRECT(rTextSize)) ); - - pdi->reg.rHighlight = rText; - pdi->reg.rHighlight.left -= cxBEFORE_LARGE_TEXT; - pdi->reg.rHighlight.right += cxAFTER_LARGE_TEXT; - pdi->reg.rHighlight.top -= cyABOVE_LARGE_TEXT; - pdi->reg.rHighlight.bottom += cyBELOW_LARGE_TEXT; - - pdi->reg.rLabel = pdi->reg.rHighlight; - if (PtInRect (&rText, pdi->ptTextTest)) - pdi->fTextTestHit = TRUE; - - if (pdi->fDraw) - { - COLORREF clrFore; - COLORREF clrBack; - FastList_OnPaintItem_GetItemColors (pfl, pdi, &clrFore, &clrBack); - - if (pdi->hItem->fSelected) - { - HBRUSH hbr = CreateSolidBrush (clrBack); - FillRect (pdi->hdc, &pdi->reg.rHighlight, hbr); - DeleteObject (hbr); - } - - COLORREF clrBackOld = SetBkColor (pdi->hdc, clrBack); - COLORREF clrForeOld = SetTextColor (pdi->hdc, clrFore); - - DrawTextEx (pdi->hdc, pszColumnText, lstrlen(pszColumnText), - &rText, DT_CENTER | DT_WORDBREAK | DT_END_ELLIPSIS | DT_NOPREFIX, 0); - - SetTextColor (pdi->hdc, clrForeOld); - SetBkColor (pdi->hdc, clrBackOld); - - if (pdi->hItem->fFocused && IsWindowEnabled (pfl->hList)) - DrawFocusRect (pdi->hdc, &pdi->reg.rHighlight); - } - } -} - - -void FastList_OnPaintItem_Small (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi) -{ - // If there is an image associated with this item, draw it. Remember - // that if there are *two* images, draw the second one--it's the primary - // image, or the user wouldn't have bothered adding it. - // - BOOL fImage = FALSE; - - int iImage = pdi->hItem->iFirstImage; - if (pdi->hItem->iSecondImage != IMAGE_NOIMAGE) - iImage = pdi->hItem->iSecondImage; - if (iImage != IMAGE_NOIMAGE) - { - LONG xImage = pdi->rItem.left + cxBEFORE_SMALL_ICON; - LONG yImage = pdi->rItem.top + (cyRECT(pdi->rItem) - GetSystemMetrics(SM_CYSMICON))/2; - fImage = FastList_OnPaintItem_DrawImage (pfl, pdi, pfl->hilSmall, iImage, xImage, yImage, FALSE); - } - - // If there is any column-0 text supplied for this item, draw that to the - // right of the item's icon. - // - LPTSTR pszColumnText = FastList_GetColumnText (pfl, pdi->hItem, 0); - if (pszColumnText && *pszColumnText) - { - RECT rTextSize = pdi->rItem; - if (!DrawTextEx (pdi->hdc, pszColumnText, lstrlen(pszColumnText), &rTextSize, DT_CALCRECT | DT_END_ELLIPSIS | DT_NOPREFIX, 0)) - rTextSize.right = rTextSize.left; - - RECT rText = pdi->rItem; - rText.left += cxBEFORE_SMALL_TEXT + fImage * (GetSystemMetrics(SM_CXSMICON) + cxBEFORE_SMALL_ICON + cxAFTER_SMALL_ICON); - rText.right = min( pdi->rItem.right - cxAFTER_SMALL_TEXT, (rText.left + cxRECT(rTextSize)) ); - rText.top += cyABOVE_SMALL_TEXT; - rText.bottom -= cyBELOW_SMALL_TEXT; - - pdi->reg.rHighlight = rText; - pdi->reg.rHighlight.left -= cxBEFORE_SMALL_TEXT; - pdi->reg.rHighlight.right += cxAFTER_SMALL_TEXT; - pdi->reg.rHighlight.top -= cyABOVE_SMALL_TEXT; - pdi->reg.rHighlight.bottom += cyBELOW_SMALL_TEXT; - - pdi->reg.rLabel = pdi->reg.rHighlight; - if (PtInRect (&rText, pdi->ptTextTest)) - pdi->fTextTestHit = TRUE; - - if (pdi->fDraw) - { - COLORREF clrFore; - COLORREF clrBack; - FastList_OnPaintItem_GetItemColors (pfl, pdi, &clrFore, &clrBack); - - if (pdi->hItem->fSelected) - { - HBRUSH hbr = CreateSolidBrush (clrBack); - FillRect (pdi->hdc, &pdi->reg.rHighlight, hbr); - DeleteObject (hbr); - } - - COLORREF clrBackOld = SetBkColor (pdi->hdc, clrBack); - COLORREF clrForeOld = SetTextColor (pdi->hdc, clrFore); - - DrawTextEx (pdi->hdc, pszColumnText, lstrlen(pszColumnText), - &rText, DT_END_ELLIPSIS | DT_NOPREFIX, 0); - - SetTextColor (pdi->hdc, clrForeOld); - SetBkColor (pdi->hdc, clrBackOld); - - if (pdi->hItem->fFocused && IsWindowEnabled (pfl->hList)) - DrawFocusRect (pdi->hdc, &pdi->reg.rHighlight); - } - } -} - - -void FastList_OnPaintItem_Tree (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi, HLISTITEM hItem, RECT *prThisColumn) -{ - // This routine is supposed to draw the tree structure off to the left - // of an item. To do that, it calls itself recursively to draw the - // icon areas of each of its parents. - // - if (hItem->hTreeParent != NULL) - { - FastList_OnPaintItem_Tree (pfl, pdi, hItem->hTreeParent, prThisColumn); - } - - // For any given item, the first thing to determine is how many icons - // that item has. - // - int iLeftImage = hItem->iFirstImage; - int iRightImage = IMAGE_NOIMAGE; - - if (hItem->iSecondImage != IMAGE_NOIMAGE) - { - iLeftImage = hItem->iSecondImage; - iRightImage = hItem->iFirstImage; - } - - // What lines/boxes should we draw? - // - BOOL fHLines = FALSE; - - if ((hItem->hTreeParent) || (pfl->dwStyle & FLS_LINESATROOT)) - { - fHLines = TRUE; - - DWORD dwLines = 0; - if (hItem == pdi->hItem) - dwLines |= TREELINE_HORIZONTAL; - if ((hItem == pdi->hItem) && (hItem->hTreeChild)) - dwLines |= (hItem->fExpanded) ? TREELINE_BOXOPEN : TREELINE_BOXCLOSED; - if (hItem->hTreeNext) - dwLines |= TREELINE_DOWN; - if ((dwLines != 0) && !((!hItem->hTreeParent && !hItem->hTreePrevious) && (hItem == pdi->hItem))) - dwLines |= TREELINE_UP; - - FastList_OnPaintItem_TreeLines (pfl, pdi, dwLines, prThisColumn); - } - - // The lines we (maybe) just drew took the place of an icon for this - // item. Maybe draw blank space, to pad for the second icon - // - if ( (hItem != pdi->hItem) && (iLeftImage != IMAGE_NOIMAGE) && (iRightImage != IMAGE_NOIMAGE) ) - { - FastList_OnPaintItem_TreeLines (pfl, pdi, 0, prThisColumn); - } -} - - -void FastList_OnPaintItem_List (LPFASTLIST pfl, LPFASTLISTDRAWITEM pdi) -{ - // Painting a tree or list is done column by column. Remember - // We may have a "long column"--that's a column that doesn't - // necessarily respect the header column boundaries. - // - RECT rItemRemaining = pdi->rItem; - pdi->reg.rHighlight = pdi->rItem; - - int icolLong = -1; - if (pdi->fDragImage) - { - icolLong = 0; - } - else if ((pfl->dwStyle & FLS_VIEW_TREELIST) == FLS_VIEW_TREE) - { - icolLong = 0; - } - else if (pfl->dwStyle & FLS_LONGCOLUMNS) - { - for (size_t icol = 0; icol < pfl->cColumns; ++icol) - { - if (!pfl->aColumns[ icol ].pszText) - break; - - LPTSTR pszColumnText = FastList_GetColumnText (pfl, pdi->hItem, icol); - if (*pszColumnText) - { - icolLong = icol; - if ((pfl->aColumns[ icol ].fmt & HDF_JUSTIFYMASK) != HDF_LEFT) - icolLong = -1; // this can't be the long column - } - } - } - - // Select appropriate text colors. Since FastLists always draw highlights - // all the way across the item, we won't change colors from column to - // column. - // - COLORREF clrFore; - COLORREF clrBack; - FastList_OnPaintItem_GetItemColors (pfl, pdi, &clrFore, &clrBack); - - COLORREF clrBackOld = SetBkColor (pdi->hdc, clrBack); - COLORREF clrForeOld = SetTextColor (pdi->hdc, clrFore); - - // Now that we know where the long column is, we're ready to start - // painting columns. - // - for (int icol = 0; (icolLong == -1) || (icol <= icolLong); ++icol) - { - if (icol && !pfl->cColumns) - break; - else if ((pfl->cColumns) && ((icol >= (int)pfl->cColumns) || (!pfl->aColumns[ icol ].pszText))) - break; - - // The rules for the long column are slightly different than the - // rules for all other columns. - // - LONG cxColumn = pdi->rItem.right - rItemRemaining.left; - int fmtColumn = HDF_LEFT; - - if ((icol != icolLong) && (pfl->cColumns) && (icol < (int)pfl->cColumns)) - { - cxColumn = pfl->aColumns[ icol ].cxy; - fmtColumn = pfl->aColumns[ icol ].fmt & HDF_JUSTIFYMASK; - } - - // Remember where this column ends and the next column begins. - // - RECT rThisColumn = rItemRemaining; - rThisColumn.right = rThisColumn.left + cxColumn; - - // Get the text for this column, and figure out how big it will be. - // - LPTSTR pszColumnText = FastList_GetColumnText (pfl, pdi->hItem, icol); - - RECT rTextSize = rThisColumn; - if (!DrawTextEx (pdi->hdc, pszColumnText, lstrlen(pszColumnText), &rTextSize, DT_CALCRECT | DT_END_ELLIPSIS | DT_NOPREFIX, 0)) - rTextSize.right = rTextSize.left; - - // Draw the icons and/or lines for the column. The behavior here - // depends on whether we're drawing a tree or a list, or both. - // - BOOL fHLines = FALSE; - if ((icol == 0) && ((pfl->dwStyle & FLS_VIEW_TREE) == FLS_VIEW_TREE) && (!pdi->fDragImage)) - { - FastList_OnPaintItem_Tree (pfl, pdi, pdi->hItem, &rThisColumn); - fHLines = TRUE; - } - - if (icol == 0) - { - int iLeftImage = pdi->hItem->iFirstImage; - int iRightImage = IMAGE_NOIMAGE; - - if ((pdi->hItem->iSecondImage != IMAGE_NOIMAGE) && - (rThisColumn.left < rThisColumn.right) && - (!pdi->fDragImage)) - { - iLeftImage = pdi->hItem->iSecondImage; - iRightImage = pdi->hItem->iFirstImage; - } - - if ((iLeftImage != IMAGE_NOIMAGE) && - (rThisColumn.left < rThisColumn.right)) - { - rThisColumn.left += cxBEFORE_LIST_ICON; - pdi->reg.rImage = rThisColumn; - - LONG xImage = rThisColumn.left; - LONG yImage = rThisColumn.top + (cyRECT(pdi->rItem) - GetSystemMetrics(SM_CYSMICON))/2; - if (FastList_OnPaintItem_DrawImage (pfl, pdi, pfl->hilSmall, iLeftImage, xImage, yImage, fHLines)) - { - rThisColumn.left += GetSystemMetrics (SM_CXSMICON); - if (iRightImage != IMAGE_NOIMAGE) - { - rThisColumn.left += cxBETWEEN_LIST_ICONS; - xImage = rThisColumn.left; - yImage = rThisColumn.top + (cyRECT(pdi->rItem) - GetSystemMetrics(SM_CYSMICON))/2; - if (FastList_OnPaintItem_DrawImage (pfl, pdi, pfl->hilSmall, iRightImage, xImage, yImage, fHLines)) - rThisColumn.left += GetSystemMetrics (SM_CXSMICON); - } - } - - pdi->reg.rImage.right = rThisColumn.left; - rThisColumn.left += cxAFTER_LIST_ICON; - } - } - - // Determine where the text will go in this column. We have to pass - // that information back (for column 0) as reg.rLabel; we also have - // to test the text's position against {pdi->ptTextTest} to see if the - // user just clicked on the text. - // - RECT rText = rThisColumn; - rText.left += cxBEFORE_LIST_TEXT; - rText.right -= cxAFTER_LIST_TEXT; - rText.top += cyABOVE_LIST_TEXT; - rText.bottom -= cyBELOW_LIST_TEXT; - - if (icol != 0) - rText.left += cxBEFORE_COLUMN_TEXT; - - RECT rTextJustified = rText; - rTextJustified.right = min( rText.right, rText.left + cxRECT(rTextSize) ); - - LONG dxJustify = 0; - if (fmtColumn == HDF_CENTER) - dxJustify = (cxRECT(rText) - cxRECT(rTextJustified))/2; - else if (fmtColumn == HDF_RIGHT) - dxJustify = cxRECT(rText) - cxRECT(rTextJustified); - rTextJustified.left += dxJustify; - rTextJustified.right += dxJustify; - - if (icol == 0) - pdi->reg.rLabel = rTextJustified; - - if (PtInRect (&rTextJustified, pdi->ptTextTest)) - pdi->fTextTestHit = TRUE; - - // Having determined where the text will go, we should record - // where the highlight will be drawn. - // - if (icol == 0) - { - pdi->reg.rHighlight.left = rThisColumn.left; - } - if (icol == icolLong) - { - pdi->reg.rHighlight.right = min( pdi->reg.rHighlight.right, rTextJustified.right + cxAFTER_LIST_TEXT ); - } - - // Okay, it's time to actually draw the text. Didn't think we'd - // ever get here, did you? :) - // - if (pdi->fDraw) - { - if ((!pdi->fDragImage) && ((pdi->hItem->fSelected) || (pdi->hItem->dwFlags & FLIF_DROPHIGHLIGHT))) - { - RECT rHighlightInColumn; - IntersectRect (&rHighlightInColumn, &pdi->reg.rHighlight, &rThisColumn); - - HBRUSH hbr = CreateSolidBrush (clrBack); - FillRect (pdi->hdc, &rHighlightInColumn, hbr); - DeleteObject (hbr); - } - - DrawTextEx (pdi->hdc, pszColumnText, lstrlen(pszColumnText), - &rTextJustified, DT_END_ELLIPSIS | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER, 0); - } - - rItemRemaining.left = rThisColumn.right; - } - - // Finally, draw the focus rectangle and restore the original text colors. - // - if (pdi->hItem->fFocused && pdi->fDraw && IsWindowEnabled (pfl->hList) && (!pdi->fDragImage)) - DrawFocusRect (pdi->hdc, &pdi->reg.rHighlight); - - SetTextColor (pdi->hdc, clrForeOld); - SetBkColor (pdi->hdc, clrBackOld); -} - - -void FastList_OnScroll (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - HWND hScroll = (msg == WM_VSCROLL) ? pfl->hScrollV : pfl->hScrollH; - - SCROLLINFO si; - memset (&si, 0x00, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS; - GetScrollInfo (hScroll, SB_CTL, &si); - - LONG posNew = si.nPos; - BOOL fRepaint = TRUE; - - switch (LOWORD(wp)) - { - case SB_TOP: - posNew = 0; - break; - - case SB_BOTTOM: - posNew = si.nMax - si.nPage; - break; - - case SB_PAGEUP: - posNew -= si.nPage; - break; - - case SB_PAGEDOWN: - posNew += si.nPage; - break; - - case SB_LINEUP: - posNew -= FastList_GetListHeight (pfl); - break; - - case SB_LINEDOWN: - posNew += FastList_GetListHeight (pfl); - break; - - case SB_THUMBTRACK: - posNew = si.nTrackPos; - fRepaint = FALSE; - break; - } - - posNew = limit( 0, posNew, (LONG)(si.nMax - si.nPage) ); - SetScrollPos (hScroll, SB_CTL, posNew, fRepaint); - - // If we just scrolled vertically, repaint. If we just scrolled - // horizontally, we'll have to sync the header first. - // - if (msg == WM_HSCROLL) - pfl->dxPixel = posNew; - else - pfl->dyPixel = posNew; - - FastList_Repaint (pfl); - if (msg == WM_HSCROLL) - FastList_ScrollHeader (pfl); - } -} - - -void FastList_OnRightButtonDown (HWND hList) -{ - FastList_ButtonDown (hList, TRUE, FALSE); - FastList_Notify_Generic (GetFastList(hList), FLN_RCLICK); -} - - -void FastList_OnLeftButtonDown (HWND hList) -{ - FastList_ButtonDown (hList, FALSE, FALSE); - FastList_Notify_Generic (GetFastList(hList), FLN_LCLICK); -} - - -void FastList_OnLeftButtonDouble (HWND hList) -{ - FastList_ButtonDown (hList, FALSE, TRUE); - FastList_ButtonUp (hList, FALSE, TRUE); - FastList_Notify_Generic (GetFastList(hList), FLN_LDBLCLICK); -} - - -void FastList_OnKeyPress (HWND hList, TCHAR ch) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - switch (ch) - { - case VK_LEFT: - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - if ((pfl->hFocused->hTreeChild) && (pfl->hFocused->fExpanded) && (!(pfl->hFocused->dwFlags & FLIF_DISALLOW_COLLAPSE)) && (pfl->dwStyle & FLS_VIEW_TREE)) - { - FastList_Collapse (hList, pfl->hFocused); - break; - } - if (pfl->hFocused->index != 0) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->aVisibleHeap[ pfl->hFocused->index -1 ]); - break; - - case VK_UP: - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - if (pfl->hFocused->index != 0) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->aVisibleHeap[ pfl->hFocused->index -1 ]); - break; - - case VK_RIGHT: - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - if ((pfl->hFocused->hTreeChild) && (!pfl->hFocused->fExpanded) && (pfl->dwStyle & FLS_VIEW_TREE)) - { - FastList_Expand (hList, pfl->hFocused); - FastList_Notify_ItemExpand (pfl, pfl->hFocused); - break; - } - if (pfl->hFocused->index < (int)(pfl->cVisible-1)) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->aVisibleHeap[ pfl->hFocused->index +1 ]); - break; - - case VK_DOWN: - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - if (pfl->hFocused->index < (int)(pfl->cVisible-1)) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->aVisibleHeap[ pfl->hFocused->index +1 ]); - break; - - case VK_HOME: - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - if (pfl->cVisible) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->aVisibleHeap[0]); - break; - - case VK_END: - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - if (pfl->cVisible) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->aVisibleHeap[ pfl->cVisible -1 ]); - break; - - case TEXT(' '): - if (!FastList_OnKeyPress_EnsureSelection (pfl)) - break; - FastList_Begin (pfl->hList); - if (pfl->hFocused->fSelected && fIsControlDown()) - FastList_SelectItem (pfl->hList, pfl->hFocused, FALSE); - else if (!pfl->hFocused->fSelected && !fIsShiftDown()) - FastList_SelectItem (pfl->hList, pfl->hFocused, TRUE); - else if (!pfl->hFocused->fSelected) - FastList_OnKeyPress_ChangeSelection (pfl, pfl->hFocused); - FastList_End (pfl->hList); - break; - } - } -} - - -BOOL FastList_OnKeyPress_EnsureSelection (LPFASTLIST pfl) -{ - if (pfl->fSortBeforePaint) - FastList_PerformSort (pfl); - if (pfl->fSyncIndicesBeforePaint) - FastList_RepairVisibilityIndices (pfl); - if (pfl->hFocused && pfl->hFocused->fVisible) - return TRUE; - - // Find the item at the top of the list. - // - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (pfl->hScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - RECT rTemplate; - FastList_CalcItemRect (pfl, 0, &rTemplate, !!pfl->hScrollH, !!pfl->hScrollV); - - int indexTopLeft = -1; - - switch (pfl->dwStyle & FLS_VIEW_MASK) - { - case FLS_VIEW_LARGE: - { - LONG cxItems = cxRECT(rClient) / cxRECT(rTemplate); - indexTopLeft = pfl->dyPixel / cyRECT(rTemplate); - break; - } - - case FLS_VIEW_SMALL: - { - LONG cyItems = cyRECT(rClient) / cyRECT(rTemplate); - indexTopLeft = pfl->dxPixel / cxRECT(rTemplate); - break; - } - - case FLS_VIEW_LIST: - case FLS_VIEW_TREE: - case FLS_VIEW_TREELIST: - indexTopLeft = pfl->dyPixel / cyRECT(rTemplate); - break; - } - - if ((indexTopLeft >= 0) && (indexTopLeft < (int)pfl->cVisible)) - { - FastList_SetFocus (pfl->hList, pfl->aVisibleHeap[ indexTopLeft ]); - } - - return FALSE; -} - - -void FastList_OnKeyPress_ChangeSelection (LPFASTLIST pfl, HLISTITEM hSelect) -{ - FastList_Begin (pfl->hList); - FastList_SetFocus (pfl->hList, hSelect); - FastList_EnsureVisible (pfl->hList, hSelect); - - // If Control is not down, begin by de-selecting all items - // If Shift is not down, anchor and select the specified item - // If Shift is down, select from the anchor to the specified item - // - HLISTITEM hAnchor = pfl->hAnchor; - if (!fIsControlDown()) - { - FastList_SelectNone (pfl->hList); - } - if ((!fIsShiftDown() || !hAnchor) && (!fIsControlDown())) - { - FastList_SelectItem (pfl->hList, hSelect, TRUE); - pfl->hAnchor = hSelect; - } - if (fIsShiftDown() && hAnchor) - { - FastList_PerformSelectRange (pfl, hAnchor, hSelect); - if (hAnchor->fSelected) - pfl->hAnchor = hAnchor; - } - - FastList_End (pfl->hList); - FastList_Notify_ItemSelect (pfl); -} - - -/* - * EXPORTED ROUTINES __________________________________________________________ - * - */ - -void FastList_OnCommand_Begin (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - pfl->nBegin ++; - } -} - - -void FastList_OnCommand_End (HWND hList, BOOL fForce) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (fForce) - pfl->nBegin = 0; - else if (pfl->nBegin) - pfl->nBegin --; - - if (pfl->nBegin == 0) - { - if (pfl->fSyncHeaderRequired) - FastList_SyncHeader (pfl); - if (pfl->fSortBeforePaint) - pfl->fRepaintRequired = TRUE; - if (pfl->fSyncScrollBeforePaint) - pfl->fRepaintRequired = TRUE; - if (pfl->fRepaintRequired) - FastList_Repaint (pfl); - } - } -} - - -HLISTITEM FastList_OnCommand_AddItem (HWND hList, LPFASTLISTADDITEM pai) -{ - HLISTITEM hItem = NULL; - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - hItem = FastList_CreateItem (pfl); - - // Add this item to the hList chain - // - if ((hItem->hListNext = pfl->hListFirst) != NULL) - hItem->hListNext->hListPrevious = hItem; - pfl->hListFirst = hItem; - - // Add this item to the hTree chain - // - if ((hItem->hTreeParent = pai->hParent) != NULL) - { - if ((hItem->hTreeNext = hItem->hTreeParent->hTreeChild) != NULL) - hItem->hTreeNext->hTreePrevious = hItem; - hItem->hTreeParent->hTreeChild = hItem; - } - else // (hItem->hTreeParent == NULL) - { - if ((hItem->hTreeNext = pfl->hTreeFirst) != NULL) - hItem->hTreeNext->hTreePrevious = hItem; - pfl->hTreeFirst = hItem; - } - - hItem->iFirstImage = pai->iFirstImage; - hItem->iSecondImage = pai->iSecondImage; - hItem->dwFlags = pai->dwFlags; - hItem->lpUser = pai->lParam; - - if (pai->pszText) - { - REALLOC (hItem->apszText, hItem->cpszText, 1, max(1,pfl->cColumns)); - hItem->apszText[0] = (LPTSTR)Allocate (sizeof(TCHAR)*(1+lstrlen(pai->pszText))); - lstrcpy (hItem->apszText[0], pai->pszText); - } - - hItem->fVisible = FALSE; - FastList_RepairOneVisibilityFlag (pfl, hItem); - - pfl->lItems->Add (hItem); - pfl->fSortBeforePaint = TRUE; - pfl->fSyncScrollBeforePaint = TRUE; - FastList_Notify_AddItem (pfl, hItem); - FastList_Repaint (pfl); - } - - return hItem; -} - - -void FastList_OnCommand_RemoveItem (HWND hList, HLISTITEM hItem) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem != NULL) - { - FastList_DeleteItem (pfl, hItem); - } - else - { - FastList_Begin (pfl->hList); - - while ((hItem = (HLISTITEM)(pfl->lItems->GetFirstObject())) != NULL) - FastList_DeleteItem (pfl, hItem); - - FastList_End (pfl->hList); - } - - FastList_Repaint (pfl); - FastList_Notify_ItemSelect (pfl); - } -} - - -LPCTSTR FastList_OnCommand_GetItemText (HWND hList, HLISTITEM hItem, int iColumn) -{ - if (hItem == NULL) - return NULL; - if ((iColumn < 0) || (iColumn >= (int)(hItem->cpszText))) - return NULL; - return hItem->apszText[ iColumn ]; -} - - -void FastList_OnCommand_SetItemText (HWND hList, LPFASTLISTITEMCOLUMN pflic, LPCTSTR pszText) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if ((pflic) && (pflic->hItem) && (pflic->icol >= 0)) - { - if (REALLOC (pflic->hItem->apszText, pflic->hItem->cpszText, pflic->icol+1, 1)) - { - if (pflic->hItem->apszText[ pflic->icol ] != NULL) - { - Free (pflic->hItem->apszText[ pflic->icol ]); - pflic->hItem->apszText[ pflic->icol ] = NULL; - } - if (pszText != NULL) - { - pflic->hItem->apszText[ pflic->icol ] = (LPTSTR)Allocate (sizeof(TCHAR)*(1+lstrlen(pszText))); - lstrcpy (pflic->hItem->apszText[ pflic->icol ], pszText); - } - pfl->fSortBeforePaint = TRUE; - FastList_Notify_ItemChanged (pfl, pflic->hItem); - FastList_Repaint (pfl); - } - } - } -} - - -LPARAM FastList_OnCommand_GetItemParam (HWND hList, HLISTITEM hItem) -{ - return (hItem == NULL) ? 0 : (hItem->lpUser); -} - - -void FastList_OnCommand_SetItemParam (HWND hList, HLISTITEM hItem, LPARAM lpUser) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem != NULL) - { - hItem->lpUser = lpUser; - pfl->lItems->Update (hItem); - - pfl->fSortBeforePaint = TRUE; - FastList_Notify_ItemChanged (pfl, hItem); - FastList_Repaint (pfl); - } - } -} - - -DWORD FastList_OnCommand_GetItemFlags (HWND hList, HLISTITEM hItem) -{ - return (hItem == NULL) ? 0 : (hItem->dwFlags); -} - - -void FastList_OnCommand_SetItemFlags (HWND hList, HLISTITEM hItem, DWORD dwFlagsNew) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem != NULL) - { - FastList_Begin (hList); - - DWORD dwFlagsOld = hItem->dwFlags; - hItem->dwFlags = dwFlagsNew; - - if ( (dwFlagsOld & FLIF_TREEVIEW_ONLY) != (dwFlagsNew & FLIF_TREEVIEW_ONLY) ) - { - FastList_RepairOneVisibilityFlag (pfl, hItem); - FastList_Repaint (pfl); - } - - if ( (dwFlagsNew & FLIF_DISALLOW_SELECT) && (hItem->fSelected) ) - { - FastList_PerformSelectItem (pfl, hItem, FALSE); - FastList_Repaint (pfl); - } - - if ( (dwFlagsNew & FLIF_DISALLOW_COLLAPSE) && !(hItem->fExpanded) ) - { - FastList_OnCommand_Expand (hList, hItem, TRUE); - FastList_Repaint (pfl); - } - - if ( (dwFlagsOld & FLIF_DROPHIGHLIGHT) != (dwFlagsNew & FLIF_DROPHIGHLIGHT) ) - FastList_Repaint (pfl); - - FastList_Notify_ItemChanged (pfl, hItem); - FastList_End (hList); - } - } -} - - -int FastList_OnCommand_GetItemImage (HWND hList, HLISTITEM hItem, int iImage) -{ - if (hItem && (iImage==0 || iImage==1)) - return (iImage == 0) ? (hItem->iFirstImage) : (hItem->iSecondImage); - - return IMAGE_NOIMAGE; -} - - -void FastList_OnCommand_SetItemImage (HWND hList, LPFASTLISTITEMIMAGE pflii, int iImage) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (pflii && pflii->hItem && (pflii->iImage==0 || pflii->iImage==1)) - { - if (pflii->iImage == 0) - pflii->hItem->iFirstImage = iImage; - else // (pflii->iImage == 1) - pflii->hItem->iSecondImage = iImage; - - FastList_Notify_ItemChanged (pfl, pflii->hItem); - FastList_Repaint (pfl); - } - } -} - - -BOOL FastList_OnCommand_IsExpanded (HWND hList, HLISTITEM hItem) -{ - return (hItem) ? (hItem->fExpanded) : FALSE; -} - - -void FastList_OnCommand_Expand (HWND hList, HLISTITEM hItem, BOOL fExpand) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem && (hItem->fExpanded != fExpand) && (fExpand || !(hItem->dwFlags & FLIF_DISALLOW_COLLAPSE))) - { - BOOL fTreeMode = (pfl->dwStyle & FLS_VIEW_TREE) ? TRUE : FALSE; - - hItem->fExpanded = fExpand; - pfl->fSyncScrollBeforePaint = TRUE; - pfl->fSyncIndicesBeforePaint = TRUE; - FastList_RepairVisibilityFlags (pfl, hItem, (!hItem->fExpanded || !hItem->fVisible) && (fTreeMode)); - FastList_Notify_ItemChanged (pfl, hItem); - FastList_Repaint (pfl); - } - } -} - - -BOOL FastList_OnCommand_ItemVisible (HWND hList, HLISTITEM hItem, BOOL fSet) -{ - if (!fSet) - return (hItem) ? (hItem->fVisible) : FALSE; - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem && hItem->fVisible) - { - pfl->hEnsureVisible = hItem; - FastList_Repaint (pfl); - } - } - return TRUE; -} - - -HLISTITEM FastList_OnCommand_ItemFocus (HWND hList, HLISTITEM hItem, BOOL fSet) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (!fSet) - return (hItem) ? (HLISTITEM)(hItem->fFocused) : pfl->hFocused; - - if (pfl->hFocused != hItem) - { - if (pfl->hFocused != NULL) - { - pfl->hFocused->fFocused = FALSE; - FastList_Notify_ItemChanged (pfl, pfl->hFocused); - } - if ((pfl->hFocused = hItem) != NULL) - { - pfl->hFocused->fFocused = TRUE; - FastList_Notify_ItemChanged (pfl, pfl->hFocused); - } - FastList_Repaint (pfl); - } - } - - return NULL; -} - - -void FastList_OnCommand_GetImageLists (HWND hList, HIMAGELIST *phiSmall, HIMAGELIST *phiLarge) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (phiSmall) - *phiSmall = pfl->hilSmall; - if (phiLarge) - *phiLarge = pfl->hilLarge; - } -} - - -void FastList_OnCommand_SetImageLists (HWND hList, HIMAGELIST hiSmall, HIMAGELIST hiLarge) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - pfl->hilSmall = hiSmall; - pfl->hilLarge = hiLarge; - FastList_Repaint (pfl); - } -} - - -HIMAGELIST FastList_OnCommand_CreateDragImage (HWND hList, HLISTITEM hItem) -{ - HIMAGELIST hil = NULL; - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem) - { - - // First find out how big this item is. Note that we'll ask - // for the item regions, while specifying the fDragImage flag - // in the paintitem request--that will make it draw only the - // dragimage stuff. - // - HDC hdc = CreateCompatibleDC (NULL); - HFONT hfOld = (HFONT)SelectObject (hdc, pfl->hf); - - RECT rItem; - FastList_CalcItemRect (pfl, 0, &rItem, !!pfl->hScrollH, !!pfl->hScrollV); - - FASTLISTITEMREGIONS reg; - FastList_CallPaintItem (pfl, hdc, FALSE, TRUE, hItem->index, &rItem, ®, NULL, NULL); - - SelectObject (hdc, hfOld); - DeleteDC (hdc); - - RECT rDragImage = reg.rSelect; - - rDragImage.left -= reg.rSelect.left; - rDragImage.right -= reg.rSelect.left; - rDragImage.top -= reg.rSelect.top; - rDragImage.bottom -= reg.rSelect.top; - - rItem.left -= reg.rSelect.left; - rItem.right -= reg.rSelect.left; - rItem.top -= reg.rSelect.top; - rItem.bottom -= reg.rSelect.top; - - // Okay, now we know how big the item will be. Create a bitmap, - // draw onto it, and stuff it into an imagelist. - // - hdc = GetDC (NULL); - HDC hdcBitmap = CreateCompatibleDC (hdc); - HBITMAP bmp = CreateCompatibleBitmap (hdc, cxRECT(rDragImage), cyRECT(rDragImage)); - HBITMAP bmpOld = (HBITMAP)SelectObject (hdcBitmap, bmp); - hfOld = (HFONT)SelectObject (hdcBitmap, pfl->hf); - - HBRUSH hbr = CreateSolidBrush (clrTRANSPARENT); - FillRect (hdcBitmap, &rDragImage, hbr); - DeleteObject (hbr); - - FastList_CallPaintItem (pfl, hdcBitmap, TRUE, TRUE, hItem->index, &rItem, NULL, NULL, NULL); - - SelectObject (hdcBitmap, hfOld); - SelectObject (hdcBitmap, bmpOld); - DeleteDC (hdcBitmap); - ReleaseDC (NULL, hdc); - - if ((hil = ImageList_Create (cxRECT(rDragImage), cyRECT(rDragImage), ILC_MASK, 1, 1)) != NULL) - { - ImageList_AddMasked (hil, bmp, clrTRANSPARENT); - } - - DeleteObject (bmp); - } - } - - return hil; -} - - -LPFASTLISTSORTFUNC FastList_OnCommand_GetSortFunc (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - return pfl->pfnSort; - } - - return NULL; -} - - -void FastList_OnCommand_SetSortFunc (HWND hList, LPFASTLISTSORTFUNC pfn) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - pfl->pfnSort = pfn; - pfl->fSortBeforePaint = TRUE; - } -} - - -void FastList_OnCommand_GetSortStyle (HWND hList, int *piColSort, BOOL *pfRevSort) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (piColSort) - *piColSort = pfl->iColSort; - if (pfRevSort) - *pfRevSort = pfl->fRevSort; - } -} - - -void FastList_OnCommand_SetSortStyle (HWND hList, int iColSort, BOOL fRevSort) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - pfl->iColSort = iColSort; - pfl->fRevSort = fRevSort; - pfl->fSortBeforePaint = TRUE; - FastList_Repaint (pfl); - } -} - - -void FastList_OnCommand_Sort (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - pfl->fSortBeforePaint = FALSE; - FastList_Repaint (pfl); - } -} - - -int FastList_OnCommand_GetColumnCount (HWND hList) -{ - int cColumns = 0; - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - for (cColumns = 0; cColumns < (int)pfl->cColumns; ++cColumns) - { - if (pfl->aColumns[ cColumns ].pszText == NULL) - break; - } - } - - return cColumns; -} - - -BOOL FastList_OnCommand_GetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) == NULL) - return FALSE; - - if ((iColumn < 0) || (iColumn >= (int)pfl->cColumns) || (!pfl->aColumns[ iColumn ].pszText)) - return FALSE; - - if (pcol) - { - pcol->dwFlags = FLCF_JUSTIFY_LEFT; - if ((pfl->aColumns[ iColumn ].fmt & HDF_JUSTIFYMASK) == HDF_RIGHT) - pcol->dwFlags = FLCF_JUSTIFY_RIGHT; - else if ((pfl->aColumns[ iColumn ].fmt & HDF_JUSTIFYMASK) == HDF_CENTER) - pcol->dwFlags = FLCF_JUSTIFY_CENTER; - pcol->cxWidth = pfl->aColumns[ iColumn ].cxy; - lstrcpy (pcol->szText, pfl->aColumns[ iColumn ].pszText); - } - - return TRUE; -} - - -void FastList_OnCommand_SetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - iColumn = limit (0, iColumn, (int)pfl->cColumns); - - if (REALLOC (pfl->aColumns, pfl->cColumns, 1+iColumn, 1)) - { - if (pfl->aColumns[ iColumn ].pszText) - Free (pfl->aColumns[ iColumn ].pszText); - memset (&pfl->aColumns[ iColumn ], 0x00, sizeof(HD_ITEM)); - - if (pcol) - { - if ((pcol->dwFlags & FLCF_JUSTIFY_MASK) == FLCF_JUSTIFY_RIGHT) - pfl->aColumns[ iColumn ].fmt |= HDF_RIGHT; - else if ((pcol->dwFlags & FLCF_JUSTIFY_MASK) == FLCF_JUSTIFY_CENTER) - pfl->aColumns[ iColumn ].fmt |= HDF_CENTER; - else - pfl->aColumns[ iColumn ].fmt |= HDF_LEFT; - - pfl->aColumns[ iColumn ].cxy = pcol->cxWidth; - pfl->aColumns[ iColumn ].pszText = (LPTSTR)Allocate (sizeof(TCHAR)*(1+lstrlen(pcol->szText))); - lstrcpy (pfl->aColumns[ iColumn ].pszText, pcol->szText); - - pfl->aColumns[ iColumn ].mask = HDI_WIDTH | HDI_TEXT | HDI_FORMAT; - } - - FastList_SyncHeader (pfl); - } - } -} - - -BOOL FastList_OnCommand_IsSelected (HWND hList, HLISTITEM hItem) -{ - return hItem->fSelected; -} - - -void FastList_OnCommand_SelectItem (HWND hList, HLISTITEM hItem, BOOL fSelect) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (hItem != NULL) - { - if (!fSelect || !(hItem->dwFlags & FLIF_DISALLOW_SELECT)) - { - if (fSelect) - FastList_PerformSelectTest (pfl, hItem); - FastList_PerformSelectItem (pfl, hItem, fSelect); - } - } - else - { - BOOL fTreeMode = (pfl->dwStyle & FLS_VIEW_TREE); - BOOL fMultiple = (pfl->dwStyle & FLS_SELECTION_MULTIPLE); - BOOL fLevel = (pfl->dwStyle & (FLS_SELECTION_LEVEL & ~FLS_SELECTION_MULTIPLE)); - BOOL fSibling = (pfl->dwStyle & (FLS_SELECTION_SIBLING & ~FLS_SELECTION_MULTIPLE)); - - if ( (!fSelect) || - (fMultiple && (!fTreeMode || (!fLevel && !fSibling))) ) - { - FastList_Begin (hList); - - for (LPENUM pEnum = pfl->lItems->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - hItem = (HLISTITEM)(pEnum->GetObject()); - if (!fSelect || !(hItem->dwFlags & FLIF_DISALLOW_SELECT)) - FastList_PerformSelectItem (pfl, hItem, fSelect); - } - - FastList_End (hList); - } - } - } -} - - -HLISTITEM FastList_OnCommand_FindList (HWND hList, HLISTITEM hItem, DWORD dwCode) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - switch (dwCode) - { - case FLM_FINDLIST_FIRST: - return pfl->hListFirst; - - case FLM_FINDLIST_PREVIOUS: - return (hItem) ? (hItem->hListPrevious) : NULL; - - case FLM_FINDLIST_NEXT: - return (hItem) ? (hItem->hListNext) : (pfl->hListFirst); - } - } - - return NULL; -} - - -HLISTITEM FastList_OnCommand_FindTree (HWND hList, HLISTITEM hItem, DWORD dwCode) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - switch (dwCode) - { - case FLM_FINDTREE_PARENT: - return (hItem) ? (hItem->hTreeParent) : NULL; - - case FLM_FINDTREE_CHILD: - return (hItem) ? (hItem->hTreeChild) : (pfl->hTreeFirst); - - case FLM_FINDTREE_PREVIOUS: - return (hItem) ? (hItem->hTreePrevious) : NULL; - - case FLM_FINDTREE_NEXT: - return (hItem) ? (hItem->hTreeNext) : NULL; - } - } - - return NULL; -} - -HLISTITEM FastList_OnCommand_FindSelected (HWND hList, HLISTITEM hItem) -{ - if (hItem != NULL) - { - return hItem->hSelectNext; - } - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - return pfl->hSelectFirst; - } - - return NULL; -} - - -HLISTITEM FastList_OnCommand_FindItem (HWND hList, LPENUM *ppEnum, LPARAM lpUser) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (!ppEnum) - return (HLISTITEM)(pfl->lkUserParam->GetFirstObject (&lpUser)); - else if (ppEnum && (((*ppEnum) = pfl->lkUserParam->FindFirst (&lpUser)) != NULL)) - return (HLISTITEM)((*ppEnum)->GetObject()); - } - return NULL; -} - - -HLISTITEM FastList_OnCommand_FindNextItem (HWND hList, LPENUM *ppEnum) -{ - if (ppEnum && (((*ppEnum) = (*ppEnum)->FindNext()) != NULL)) - return (HLISTITEM)((*ppEnum)->GetObject()); - return NULL; -} - - -void FastList_OnCommand_FindClose (HWND hList, LPENUM *ppEnum) -{ - if (ppEnum && (*ppEnum)) - { - Delete (*ppEnum); - *ppEnum = NULL; - } -} - - -HLISTITEM FastList_OnCommand_FindVisible (HWND hList, HLISTITEM hItem, DWORD dwCode) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (pfl->fSortBeforePaint) - FastList_PerformSort (pfl); - if (pfl->fSyncIndicesBeforePaint) - FastList_RepairVisibilityIndices (pfl); - - switch (dwCode) - { - case FLM_FINDVISIBLE_FIRST: - return (pfl->cVisible) ? pfl->aVisibleHeap[0] : NULL; - - case FLM_FINDVISIBLE_NEXT: - if (!hItem->fVisible) - return NULL; - if (hItem->index == (int)(pfl->cVisible-1)) - return NULL; - return pfl->aVisibleHeap[ hItem->index +1 ]; - } - } - - return NULL; -} - - -int FastList_OnCommand_GetItemCount (HWND hList, BOOL fVisibleOnly) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) == NULL) - return 0; - - return (fVisibleOnly) ? pfl->cVisible : pfl->lItems->GetCount(); -} - - -HLISTITEM FastList_OnCommand_ItemFromPoint (HWND hList, POINT *pptClient, BOOL fStrict) -{ - HLISTITEM hItem = NULL; - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (pfl->fSortBeforePaint) - FastList_PerformSort (pfl); - if (pfl->fSyncIndicesBeforePaint) - FastList_RepairVisibilityIndices (pfl); - - // Adjust the client coordinates we were given based on the current - // position of the scrollbars. - // - LONG xField = pptClient->x + pfl->dxPixel; - LONG yField = pptClient->y + pfl->dyPixel; - - // Every item's overall RECT is symmetrical, regardless of the - // current view mode. Find out how big those RECTs are. - // - RECT rTemplate; - FastList_CalcItemRect (pfl, 0, &rTemplate, !!pfl->hScrollH, !!pfl->hScrollV); - - // How large is the current client area? - // - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (pfl->hScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - // The specified point exists in exactly one item (or none at all). - // Just which item that is depends on what the current view mode is. - // - int index = -1; - - switch (pfl->dwStyle & FLS_VIEW_MASK) - { - case FLS_VIEW_LARGE: - { - LONG ixIndex = xField / cxRECT(rTemplate); - LONG iyIndex = yField / cyRECT(rTemplate); - - LONG cxArray = cxRECT(rClient) / cxRECT(rTemplate); - cxArray = max( cxArray, 1 ); - - index = ixIndex + iyIndex * cxArray; - break; - } - - case FLS_VIEW_SMALL: - { - LONG ixIndex = xField / cxRECT(rTemplate); - LONG iyIndex = yField / cyRECT(rTemplate); - - LONG cyArray = cyRECT(rClient) / cyRECT(rTemplate); - cyArray = max( cyArray, 1 ); - - index = iyIndex + ixIndex * cyArray; - break; - } - - case FLS_VIEW_LIST: - case FLS_VIEW_TREE: - case FLS_VIEW_TREELIST: - index = (yField - rClient.top) / cyRECT(rTemplate); - break; - } - - if ((index >= 0) && (index < (int)pfl->cVisible)) - hItem = pfl->aVisibleHeap[ index ]; - - // If there is indeed an item underneath that point, test the item's - // regions--and our window styles--to see if a click on the specified - // point actually *changes* that item. - // - if (hItem && fStrict) - { - BOOL fHit = FALSE; - - FASTLISTITEMREGIONS reg; - FastList_OnCommand_GetItemRegions (hList, hItem, ®, pptClient, &fHit); - - if (!PtInRect (®.rSelect, *pptClient)) - hItem = NULL; - else if (PtInRect (®.rHighlight, *pptClient) && !fHit && (pfl->dwStyle & FLS_HIT_TEXTONLY)) - hItem = NULL; - } - } - - return hItem; -} - - -void FastList_OnCommand_GetItemRegions (HWND hList, HLISTITEM hItem, LPFASTLISTITEMREGIONS pReg, POINT *pptTest, BOOL *pfHit) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - if (pfl->fSortBeforePaint) - FastList_PerformSort (pfl); - if (pfl->fSyncIndicesBeforePaint) - FastList_RepairVisibilityIndices (pfl); - - if (hItem && !hItem->fVisible && pReg) - { - memset (pReg, 0x00, sizeof(FASTLISTITEMREGIONS)); - } - else if (hItem && hItem->fVisible) - { - HDC hdc = CreateCompatibleDC (NULL); - HFONT hfOld = (HFONT)SelectObject (hdc, pfl->hf); - - RECT rItem; - FastList_CalcItemRect (pfl, hItem->index, &rItem, !!pfl->hScrollH, !!pfl->hScrollV); - rItem.left -= pfl->dxPixel; - rItem.right -= pfl->dxPixel; - rItem.top -= pfl->dyPixel; - rItem.bottom -= pfl->dyPixel; - - FastList_CallPaintItem (pfl, hdc, FALSE, FALSE, hItem->index, &rItem, pReg, pptTest, pfHit); - - SelectObject (hdc, hfOld); - DeleteDC (hdc); - } - } -} - - -LPFASTLISTTEXTCALLBACK FastList_OnCommand_GetTextCallback (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - return pfl->pfnText; - - return NULL; -} - - -void FastList_OnCommand_SetTextCallback (HWND hList, LPFASTLISTTEXTCALLBACK pfn, DWORD dwCookie) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - pfl->pfnText = pfn; - pfl->dwCookieText = dwCookie; - } -} - - -/* - * NOTIFICATION ROUTINES ______________________________________________________ - * - */ - -BOOL FastList_Notify_GetItemText (LPFASTLIST pfl, HLISTITEM hItem, int icol, LPTSTR pszText, size_t cchText, size_t *pcchRequired) -{ - FLN_GETITEMTEXT_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_GETITEMTEXT; - fln.item.hItem = hItem; - fln.item.icol = icol; - fln.item.lParam = hItem->lpUser; - fln.item.pszText = pszText; - fln.item.cchTextMax = cchText; - - if (pfl->pfnText) - { - if (!(*pfl->pfnText)( pfl->hList, &fln, pfl->dwCookieText )) - return FALSE; - } - else - { - if (!GetParent (pfl->hList)) - return FALSE; - if (!SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln)) - return FALSE; - } - - *pcchRequired = fln.item.cchTextMax; - return TRUE; -} - - -BOOL FastList_Notify_ItemChanged (LPFASTLIST pfl, HLISTITEM hItem) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_ITEMCHANGED_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_ITEMCHANGED; - fln.hItem = hItem; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_AddItem (LPFASTLIST pfl, HLISTITEM hItem) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_ADDITEM_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_ADDITEM; - fln.hItem = hItem; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_RemoveItem (LPFASTLIST pfl, HLISTITEM hItem) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_REMOVEITEM_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_REMOVEITEM; - fln.hItem = hItem; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_ColumnClick (LPFASTLIST pfl, int icol, BOOL fDouble) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_COLUMNCLICK_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_COLUMNCLICK; - fln.icol = icol; - fln.fDouble = fDouble; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_ColumnResize (LPFASTLIST pfl, int icol, LONG cxWidth) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_COLUMNRESIZE_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_COLUMNRESIZE; - fln.icol = icol; - fln.cxWidth = cxWidth; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_ItemSelect (LPFASTLIST pfl) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_ITEMSELECT_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_ITEMSELECT; - fln.hItem = pfl->hSelectFirst; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_ItemExpand (LPFASTLIST pfl, HLISTITEM hItem) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - FLN_ITEMEXPAND_PARAMS fln; - fln.hdr.hwndFrom = pfl->hList; - fln.hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - fln.hdr.code = FLN_ITEMEXPAND; - fln.hItem = hItem; - fln.fExpanded = hItem->fExpanded; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); -} - - -BOOL FastList_Notify_Generic (LPFASTLIST pfl, DWORD dwCode) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - NMHDR hdr; - hdr.hwndFrom = pfl->hList; - hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - hdr.code = dwCode; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)hdr.idFrom, (LPARAM)&hdr); -} - - -BOOL FastList_Notify_Drag (LPFASTLIST pfl, DWORD dwCode, LPFLN_DRAG_PARAMS pfln) -{ - if (!GetParent (pfl->hList)) - return FALSE; - - pfln->hdr.hwndFrom = pfl->hList; - pfln->hdr.idFrom = GetWindowLong (pfl->hList, GWL_ID); - pfln->hdr.code = dwCode; - return (BOOL)SendMessage (GetParent (pfl->hList), WM_NOTIFY, (WPARAM)pfln->hdr.idFrom, (LPARAM)pfln); -} - - -/* - * SUPPORT ROUTINES ___________________________________________________________ - * - */ - -void FastList_Repaint (LPFASTLIST pfl) -{ - if ((pfl->fRepaintRequired = (pfl->nBegin) ? TRUE : FALSE) == FALSE) - { - RECT rClient; - GetClientRect (pfl->hList, &rClient); - InvalidateRect (pfl->hList, &rClient, TRUE); - UpdateWindow (pfl->hList); - } -} - - -HLISTITEM FastList_CreateItem (LPFASTLIST pfl) -{ - HLISTITEM hItem = New (LISTITEM); - memset (hItem, 0x00, sizeof(LISTITEM)); - hItem->fExpanded = TRUE; - return hItem; -} - - -void FastList_DeleteItem (LPFASTLIST pfl, HLISTITEM hItem) -{ - if (hItem) - { - // Remove any children of this item, even if we're not in - // treeview mode now. - // - while (hItem->hTreeChild) - { - FastList_DeleteItem (pfl, hItem->hTreeChild); - } - - FastList_Notify_RemoveItem (pfl, hItem); // notify *before* delete - - if (pfl->hFocused == hItem) - pfl->hFocused = FALSE; - - // Unlink this item from the List chain - // - if (pfl->hListFirst == hItem) - pfl->hListFirst = hItem->hListNext; - if (hItem->hListPrevious) - hItem->hListPrevious->hListNext = hItem->hListNext; - if (hItem->hListNext) - hItem->hListNext->hListPrevious = hItem->hListPrevious; - - // Unlink this item from the Tree chain - // - if (pfl->hTreeFirst == hItem) - pfl->hTreeFirst = hItem->hTreeNext; - if (hItem->hTreePrevious) - hItem->hTreePrevious->hTreeNext = hItem->hTreeNext; - if (hItem->hTreeNext) - hItem->hTreeNext->hTreePrevious = hItem->hTreePrevious; - if (hItem->hTreeParent && (hItem->hTreeParent->hTreeChild == hItem)) - hItem->hTreeParent->hTreeChild = hItem->hTreeNext; - - // Unlink this item from the Selection chain - // - if (hItem->hSelectPrevious) - hItem->hSelectPrevious->hSelectNext = hItem->hSelectNext; - if (hItem->hSelectNext) - hItem->hSelectNext->hSelectPrevious = hItem->hSelectPrevious; - if (pfl->hSelectFirst == hItem) - pfl->hSelectFirst = hItem->hSelectNext; - if (pfl->hAnchor == hItem) - pfl->hAnchor = NULL; - hItem->hSelectPrevious = NULL; - hItem->hSelectNext = NULL; - - // If we're holding onto this item as the next guy who we should - // ensure is visible, forget about it there too. - // - if (pfl->hEnsureVisible == hItem) - pfl->hEnsureVisible = NULL; - - // Remove this item from the hashlist, and deallocate any memory - // associated with it. - // - pfl->lItems->Remove (hItem); - - if (hItem->apszText) - { - for (size_t iCol = 0; iCol < hItem->cpszText; ++iCol) - { - if (hItem->apszText[ iCol ] != NULL) - Free (hItem->apszText[ iCol ]); - } - Free (hItem->apszText); - } - -#ifdef DEBUG - memset (hItem, 0xFE, sizeof(_FASTLISTITEM)); -#endif - Delete (hItem); - - pfl->fSyncScrollBeforePaint = TRUE; - pfl->fSyncIndicesBeforePaint = TRUE; - } -} - - -int FastList_GetListHeight (LPFASTLIST pfl) -{ - static HFONT hfLast = NULL; - static int cyLast = 0; - - if (!cyLast || (pfl->hf != hfLast)) - { - hfLast = pfl->hf; - - TEXTMETRIC tm; - HDC hdc = CreateCompatibleDC (NULL); - HFONT hfOld = (HFONT)SelectObject (hdc, pfl->hf); - GetTextMetrics (hdc, &tm); - SelectObject (hdc, hfOld); - DeleteDC (hdc); - - cyLast = tm.tmHeight + cyABOVE_LIST_TEXT + cyBELOW_LIST_TEXT; - cyLast = max( cyLast, GetSystemMetrics(SM_CYSMICON) ); - if (cyLast & 1) - cyLast ++; // make the height even (for vertical dotted lines) - } - - return cyLast; -} - - -int FastList_GetListWidth (LPFASTLIST pfl) -{ - LONG cxWidth = 0; - - for (size_t iColumn = 0; iColumn < pfl->cColumns; ++iColumn) - if (pfl->aColumns[ iColumn ].pszText) - cxWidth += pfl->aColumns[ iColumn ].cxy; - - if (cxWidth == 0) // no columns specified? pretend there's just one. - { - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - cxWidth = cxRECT(rClient); - } - - return cxWidth; -} - - -LONG FastList_GetHeaderHeight (LPFASTLIST pfl) -{ - TEXTMETRIC tm; - HDC hdc = CreateCompatibleDC (NULL); - HFONT hfOld = (HFONT)SelectObject (hdc, pfl->hf); - GetTextMetrics (hdc, &tm); - SelectObject (hdc, hfOld); - DeleteDC (hdc); - return 4*GetSystemMetrics(SM_CYBORDER) + tm.tmHeight; -} - - -void FastList_GetHeaderRect (LPFASTLIST pfl, RECT *prHeader) -{ - GetClientRect (pfl->hList, prHeader); - prHeader->bottom = prHeader->top + FastList_GetHeaderHeight (pfl); -} - - -void FastList_UpdateColumn (LPFASTLIST pfl, int iColumn) -{ - if ((iColumn >= 0) && (iColumn < (int)pfl->cColumns) && (pfl->aColumns[ iColumn ].pszText)) - { - HD_ITEM col; - memset (&col, 0x00, sizeof(col)); - col.mask |= HDI_WIDTH; - Header_GetItem (pfl->hHeader, iColumn, &col); - - if (pfl->aColumns[ iColumn ].cxy != col.cxy) - { - pfl->aColumns[ iColumn ].cxy = col.cxy; - pfl->fSyncScrollBeforePaint = TRUE; - FastList_Notify_ColumnResize (pfl, iColumn, col.cxy); - FastList_Repaint (pfl); - } - } -} - - -void FastList_SyncHeader (LPFASTLIST pfl) -{ - if ((pfl->fSyncHeaderRequired = (pfl->nBegin) ? TRUE : FALSE) == FALSE) - { - BOOL fNeedsHeader = ((pfl->dwStyle & FLS_VIEW_LIST) == FLS_VIEW_LIST); - BOOL fNoSortHeader = (pfl->dwStyle & FLS_NOSORTHEADER); - - if (pfl->cColumns == 0) - fNeedsHeader = FALSE; - - RECT rHeader; - if (fNeedsHeader) - FastList_GetHeaderRect (pfl, &rHeader); - - if (fNeedsHeader && !pfl->hHeader) - { - pfl->hHeader = CreateWindow (WC_HEADER, TEXT(""), - 0x80 | WS_CHILD | WS_VISIBLE | ((fNoSortHeader) ? 0 : HDS_BUTTONS), - rHeader.left, rHeader.top, - cxRECT(rHeader), cyRECT(rHeader), - pfl->hList, - (HMENU)0, - THIS_HINST, - (LPVOID)0); - - SendMessage (pfl->hHeader, WM_SETFONT, (WPARAM)(pfl->hf), 0); - } - else if (fNeedsHeader && pfl->hHeader) - { - DWORD dwStyle = GetWindowLong (pfl->hHeader, GWL_STYLE); - if (fNoSortHeader) - dwStyle &= ~HDS_BUTTONS; - else - dwStyle |= HDS_BUTTONS; - SetWindowLong (pfl->hHeader, GWL_STYLE, dwStyle); - - SetWindowPos (pfl->hHeader, 0, - rHeader.left, rHeader.top, cxRECT(rHeader), cyRECT(rHeader), - SWP_NOACTIVATE | SWP_NOZORDER); - } - else if (!fNeedsHeader && pfl->hHeader) - { - DestroyWindow (pfl->hHeader); - pfl->hHeader = NULL; - } - - // If we ended up with a header window, update its columns. - // - if (pfl->hHeader) - { - while (Header_DeleteItem (pfl->hHeader, 0)) - ; - for (size_t iCol = 0; iCol < pfl->cColumns; ++iCol) - Header_InsertItem (pfl->hHeader, iCol, &pfl->aColumns[ iCol ]); - } - - pfl->fSyncScrollBeforePaint = TRUE; - } -} - - -void FastList_SyncScroll (LPFASTLIST pfl) -{ - pfl->fSyncScrollBeforePaint = FALSE; - - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - LONG cxField = 0; - LONG cyField = 0; - - // First find out how much space we'd need, horizontally and vertically, - // to display all the items we can. Remember that the number of items - // we can display changes depending on whether the scrollbars appear or - // not. - // - BOOL fAllowHScroll = ((pfl->dwStyle & FLS_VIEW_MASK) != FLS_VIEW_LARGE); - BOOL fAllowVScroll = ((pfl->dwStyle & FLS_VIEW_MASK) != FLS_VIEW_SMALL); - - BOOL fNeedHScroll = FALSE; - BOOL fNeedVScroll = FALSE; - - FastList_CalcFieldSize (pfl, &cxField, &cyField, fNeedHScroll, fNeedVScroll); - - if ( (cxField > cxRECT(rClient)) && (fAllowHScroll) ) - fNeedHScroll = TRUE; - if ( (cyField > cyRECT(rClient)) && (fAllowVScroll) ) - fNeedVScroll = TRUE; - - FastList_CalcFieldSize (pfl, &cxField, &cyField, fNeedHScroll, fNeedVScroll); - - RECT rTest = rClient; - if (pfl->hScrollV) - rTest.right -= GetSystemMetrics(SM_CXVSCROLL); - if (pfl->hScrollH) - rTest.bottom -= GetSystemMetrics(SM_CYHSCROLL); - - if ( (cxField > cxRECT(rTest)) && (fAllowHScroll) ) - fNeedHScroll = TRUE; - if ( (cyField > cyRECT(rTest)) && (fAllowVScroll) ) - fNeedVScroll = TRUE; - - // Now that we know the field size, create, remove or position - // the scroll bars. - // - if (pfl->hScrollV && !fNeedVScroll) - { - DestroyWindow (pfl->hScrollV); - pfl->hScrollV = NULL; - pfl->dyPixel = 0; - } - else if (fNeedVScroll) - { - RECT rScroll = rClient; - rScroll.left = rScroll.right - GetSystemMetrics (SM_CXVSCROLL); - if (fNeedHScroll) - rScroll.bottom -= GetSystemMetrics (SM_CYHSCROLL); - - if (!pfl->hScrollV) - { - pfl->hScrollV = CreateWindow ("ScrollBar", TEXT(""), - WS_CHILD | WS_VISIBLE | SBS_VERT, - rScroll.left, rScroll.top, - cxRECT(rScroll), cyRECT(rScroll), - pfl->hList, - (HMENU)0, - THIS_HINST, - (LPVOID)0); - } - else - { - SetWindowPos (pfl->hScrollV, 0, - rScroll.left, rScroll.top, cxRECT(rScroll), cyRECT(rScroll), - SWP_NOZORDER | SWP_NOACTIVATE); - } - } - else // (!fNeedVScroll) - { - pfl->dyPixel = 0; - } - - if (pfl->hScrollH && !fNeedHScroll) - { - DestroyWindow (pfl->hScrollH); - pfl->hScrollH = NULL; - pfl->dxPixel = 0; - } - else if (fNeedHScroll) - { - RECT rScroll = rClient; - rScroll.top = rScroll.bottom - GetSystemMetrics (SM_CYHSCROLL); - if (fNeedVScroll) - rScroll.right -= GetSystemMetrics (SM_CXVSCROLL); - - if (!pfl->hScrollH) - { - pfl->hScrollH = CreateWindow ("ScrollBar", TEXT(""), - WS_CHILD | WS_VISIBLE | SBS_HORZ, - rScroll.left, rScroll.top, - cxRECT(rScroll), cyRECT(rScroll), - pfl->hList, - (HMENU)0, - THIS_HINST, - (LPVOID)0); - } - else - { - SetWindowPos (pfl->hScrollH, 0, - rScroll.left, rScroll.top, cxRECT(rScroll), cyRECT(rScroll), - SWP_NOZORDER | SWP_NOACTIVATE); - } - } - else // (!fNeedHScroll) - { - pfl->dxPixel = 0; - } - - FastList_SyncScrollPos (pfl); -} - - -void FastList_SyncScrollPos (LPFASTLIST pfl) -{ - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (pfl->hScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - LONG cxField; - LONG cyField; - FastList_CalcFieldSize (pfl, &cxField, &cyField, !!pfl->hScrollH, !!pfl->hScrollV); - - if (pfl->hScrollH) - pfl->dxPixel = limit( 0, pfl->dxPixel, (cxField-cxRECT(rClient)) ); - if (pfl->hScrollV) - pfl->dyPixel = limit( 0, pfl->dyPixel, (cyField-cyRECT(rClient)) ); - - SCROLLINFO si; - if (pfl->hScrollH) - { - memset (&si, 0x00, sizeof(SCROLLINFO)); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = 0; - si.nMax = cxField; - si.nPage = cxRECT(rClient); - si.nPos = pfl->dxPixel; - SetScrollInfo (pfl->hScrollH, SB_CTL, &si, TRUE); - } - - if (pfl->hScrollV) - { - memset (&si, 0x00, sizeof(SCROLLINFO)); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = 0; - si.nMax = cyField; - si.nPage = cyRECT(rClient); - si.nPos = pfl->dyPixel; - SetScrollInfo (pfl->hScrollV, SB_CTL, &si, TRUE); - } - - FastList_ScrollHeader (pfl); -} - - -void FastList_CalcFieldSize (LPFASTLIST pfl, LONG *pcxField, LONG *pcyField, BOOL fScrollH, BOOL fScrollV) -{ - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (fScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (fScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - *pcxField = 0; - *pcyField = 0; - - RECT rItem; - FastList_CalcItemRect (pfl, 0, &rItem, fScrollH, fScrollV); - - LONG cxArray = 0; - LONG cyArray = 0; - - switch (pfl->dwStyle & FLS_VIEW_MASK) - { - case FLS_VIEW_LARGE: - cxArray = cxRECT(rClient) / cxRECT(rItem); - cxArray = max (cxArray, 1); - if (cxArray) - cyArray = DivRoundUp (pfl->cVisible, cxArray); - break; - - case FLS_VIEW_SMALL: - cyArray = cyRECT(rClient) / cyRECT(rItem); - cyArray = max (cyArray, 1); - if (cyArray) - cxArray = DivRoundUp (pfl->cVisible, cyArray); - break; - - case FLS_VIEW_LIST: - case FLS_VIEW_TREE: - case FLS_VIEW_TREELIST: - cxArray = 1; - cyArray = pfl->cVisible; - break; - } - - *pcxField = cxArray * cxRECT(rItem); - *pcyField = cyArray * cyRECT(rItem); -} - - -void FastList_CalcItemRect (LPFASTLIST pfl, int index, RECT *prItem, BOOL fScrollH, BOOL fScrollV) -{ - SetRectEmpty (prItem); - - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (fScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (fScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - switch (pfl->dwStyle & FLS_VIEW_MASK) - { - case FLS_VIEW_LARGE: - { - // Large layout shows a two-dimensional list of 32x32 icons, - // each followed beneath by text. The layout of the grid is - // determined by well-known system metrics. There will be no - // horizontal scrollbar; just a vertical one (if necessary). - // Slots are filled in left-to-right, top-to-bottom. - // - LONG cxRect = GetSystemMetrics (SM_CXICONSPACING); - LONG cyRect = GetSystemMetrics (SM_CYICONSPACING); - int cxLayout = cxRECT(rClient) / cxRect; - cxLayout = max (cxLayout, 1); - - int vIndex = index / cxLayout; // 0 = top row - int hIndex = index % cxLayout; // 0 = left row - - prItem->left = hIndex * cxRect; - prItem->right = prItem->left + cxRect; - prItem->top = vIndex * cyRect; - prItem->bottom = prItem->top + cyRect; - break; - } - - case FLS_VIEW_SMALL: - { - // Small layout is similar: it shows a two-dimensional list of - // 16x16 icons, each followed to the right by text. The vertical - // layout of the grid is the same as the list default vertical - // size; the horizontal layout is twice the default system metric. - // Another difference: Small mode uses only a horizontal scrollbar, - // not a vertical one. Slots are filled in top-to-bottom, - // left-to-right. - // - LONG cxRect = GetSystemMetrics (SM_CXICONSPACING) * 2; - LONG cyRect = FastList_GetListHeight (pfl); - int cyLayout = cyRECT(rClient) / cyRect; - cyLayout = max (cyLayout, 1); - - int hIndex = index / cyLayout; // 0 = left row - int vIndex = index % cyLayout; // 0 = top row - - prItem->left = hIndex * cxRect; - prItem->right = prItem->left + cxRect; - prItem->top = vIndex * cyRect; - prItem->bottom = prItem->top + cyRect; - break; - } - - case FLS_VIEW_LIST: - case FLS_VIEW_TREE: - case FLS_VIEW_TREELIST: - { - // List and Tree layouts are fairly straight-forward: they each show - // a one-dimensional array of items, each of which runs horizontally - // from edge to edge. The vertical layout of the grid is the default - // vertical size (see FastList_GetListHeight()). A vertical scrollbar - // is applied if necessary; a horizontal scrollbar is added for the - // header. - // - LONG cyRect = FastList_GetListHeight (pfl); - - prItem->left = 0; - prItem->right = FastList_GetListWidth (pfl); - prItem->top = rClient.top + index * cyRect; - prItem->bottom = prItem->top + cyRect; - break; - } - } -} - - -void FastList_CallPaintItem (LPFASTLIST pfl, HDC hdc, BOOL fDraw, BOOL fDragImage, int iItem, RECT *prItem, LPFASTLISTITEMREGIONS pReg, POINT *pptTest, BOOL *pfHit) -{ - FASTLISTDRAWITEM di; - memset (&di, 0x00, sizeof(di)); - di.hdc = hdc; - di.fDraw = fDraw; - di.fDragImage = fDragImage; - di.hWnd = pfl->hList; - di.hItem = pfl->aVisibleHeap[ iItem ]; - di.lParam = di.hItem->lpUser; - di.rItem = *prItem; - - if (pptTest) - di.ptTextTest = *pptTest; - if (pfHit) - *pfHit = FALSE; - - FastList_OnPaintItem (pfl, &di); -// if (GetParent (pfl->hList)) -// SendMessage (GetParent (pfl->hList), WM_DRAWITEM, (WPARAM)GetWindowLong (pfl->hList, GWL_ID), (LPARAM)&di); -// else -// FastList_OnPaintItem (pfl, &di); - - if (pfHit) - *pfHit = di.fTextTestHit; - if (pReg) - memcpy (pReg, &di.reg, sizeof(FASTLISTITEMREGIONS)); -} - - -LPTSTR FastList_GetColumnText (LPFASTLIST pfl, HLISTITEM hItem, int icol, BOOL fAlternateBuffer) -{ - if ((icol < (int)hItem->cpszText) && (hItem->apszText[ icol ] != NULL)) - return hItem->apszText[ icol ]; - - if (!GetParent (pfl->hList)) - return TEXT(""); - - // We'll have to send a message to the parent window, and hope the user - // catches it to tell us what the text should be. We have two dynamically- - // allocated buffers we use for storing text. - // - static LPTSTR pszTextA = NULL; - static size_t cchTextA = 0; - - static LPTSTR pszTextB = NULL; - static size_t cchTextB = 0; - - LPTSTR *ppszText = (fAlternateBuffer) ? &pszTextB : &pszTextA; - size_t *pcchText = (fAlternateBuffer) ? &cchTextB : &cchTextA; - - for (size_t cchRequired = 256; ; ) - { - if (!*pcchText || (*pcchText < cchRequired)) - { - if (*ppszText) - Free (*ppszText); - if ((*ppszText = (LPTSTR)Allocate (sizeof(TCHAR)*(1+cchRequired))) == NULL) - *pcchText = 0; - else - *pcchText = cchRequired; - } - if (!*pcchText) - break; - - *(*ppszText) = TEXT('\0'); - if (!FastList_Notify_GetItemText (pfl, hItem, icol, *ppszText, *pcchText, &cchRequired)) - break; - if (cchRequired <= *pcchText) - break; - } - - return (*ppszText) ? (*ppszText) : TEXT(""); -} - - -void FastList_PerformSort (LPFASTLIST pfl) -{ - pfl->fSortBeforePaint = FALSE; - - // Sorting would be easy, except that we have to handle the tree case. - // For a tree, "sorting" means ordering *sibling* items--we make no - // attempt to order cousins, but all the children under a given parent - // must be sorted. We don't sort the Visible heap directly--instead, - // we sort the hashlist of items, and correct the Visible heap to match. - // That way, the user can later expand/collapse items in the tree - // without our having to re-sort. - // - // In sorting the hashlist items, we're not so much interested in their - // order of enumeration as we're interested in pointing each object's - // {hPrevious} and {hNext} pointers to the right objects. (When sorting - // a tree, this is even more clear; hPrevious and hNext point only to - // siblings.) To perform a sort on these items, we must generate an - // array of objects, qsort the array, then update the items' pointers. - // That array of objects is in {fg}, the fastlist global structure. - // - // The flow of sorting a list is: - // 1- fill an array with HLISTITEM pointers for all items in the list - // 2- qsort the array, using the {pfl->fnSort} comparison function - // 3- update the HLISTITEMs' {hPrevious}, {hNext}, and {index} members - // 4- call FastList_Update to fix the hash on the revised {index} members - // - // The flow for sorting a tree is more complex: - // 1- set indexNext = 0 - // 2- call SortLevel(NULL), to specify that we're sorting root items) - // SortLevel(hParent): - // 3- fill an array with HLISTITEM pointers for this item and siblings - // 4- qsort the array, using the {pfl->fnSort} comparison function - // 5- update the HLISTITEMs' {hPrevious}, {hNext} members - // 6- use {indexNext++} to assign index values to all visible items - // 7- if hParent->hTreeChild, call SortLevel(hParent->hTreeChild) - // 8- call FastList_Update to fix the hash on the revised {index} members - // - FastList_Begin (pfl->hList); - - size_t cItems; - if ((cItems = pfl->lItems->GetCount()) != 0) - { - if (OpenGlobalArray (cItems)) - { - fg.pfl = pfl; - FastList_PerformSortLevel (pfl, NULL, ((pfl->dwStyle & FLS_VIEW_TREE) == FLS_VIEW_TREE)); - - CloseGlobalArray(); - } - } - - pfl->fSyncIndicesBeforePaint = TRUE; - FastList_End (pfl->hList); -} - - -void FastList_PerformSortLevel (LPFASTLIST pfl, HLISTITEM hParent, BOOL fTreeSort) -{ - // Find the first item in the chain that we're going to sort. - // Then walk that chain, filling in the global array of HLISTITEMs - // If we're sorting the thing as a tree, only add {hItem}'s siblings - // to the fg.aObjects[] array; if we're sorting as a list, add - // all items. Add items regardless of whether they're invisible. - // - size_t cObjectsToSort = 0; - - if (fTreeSort) - { - for (HLISTITEM hItem = (hParent) ? hParent->hTreeChild : pfl->hTreeFirst; hItem; hItem = hItem->hTreeNext) - fg.aObjects[ cObjectsToSort++ ] = hItem; - } - else // Viewing by list, so sort items as if there were no tree structure - { - for (HLISTITEM hItem = pfl->hListFirst; hItem; hItem = hItem->hListNext) - fg.aObjects[ cObjectsToSort++ ] = hItem; - } - - if (cObjectsToSort != 0) - { - // Perform a qsort on the array - // - FastList_SortFunction (0, 0); - qsort (fg.aObjects, cObjectsToSort, sizeof(HLISTITEM), FastList_SortFunction); - - // Walk the array, adjusting objects' next/previous pointers. - // - if (fTreeSort) - { - HLISTITEM hTreePrevious = NULL; - for (size_t iObject = 0; iObject < cObjectsToSort; ++iObject) - { - fg.aObjects[ iObject ]->hTreePrevious = hTreePrevious; - fg.aObjects[ iObject ]->hTreeNext = (iObject < cObjectsToSort-1) ? fg.aObjects[ iObject+1 ] : NULL; - hTreePrevious = fg.aObjects[ iObject ]; - } - if (hParent == NULL) - pfl->hTreeFirst = fg.aObjects[0]; - else - hParent->hTreeChild = fg.aObjects[0]; - } - else // (!(pfl->dwStyle & FLS_VIEW_TREE)) - { - HLISTITEM hListPrevious = NULL; - for (size_t iObject = 0; iObject < cObjectsToSort; ++iObject) - { - fg.aObjects[ iObject ]->hListPrevious = hListPrevious; - fg.aObjects[ iObject ]->hListNext = (iObject < cObjectsToSort-1) ? fg.aObjects[ iObject+1 ] : NULL; - hListPrevious = fg.aObjects[ iObject ]; - } - pfl->hListFirst = fg.aObjects[0]; - } - - // If this is to be a treesort, walk the chain ascending children - // recursively as we come to them. - // - if (fTreeSort) - { - for (HLISTITEM hWalk = fg.aObjects[0]; hWalk; hWalk = hWalk->hTreeNext) - { - if (hWalk && hWalk->hTreeChild) - FastList_PerformSortLevel (pfl, hWalk, fTreeSort); - } - } - } -} - - -int __cdecl FastList_SortFunction (const void *lp1, const void *lp2) -{ - if (fg.pfl->pfnSort) - return (*(fg.pfl->pfnSort))(fg.pfl->hList, ((lp1) ? (*(HLISTITEM*)lp1) : 0), ((lp1) ? (*(HLISTITEM*)lp1)->lpUser : 0), ((lp2) ? (*(HLISTITEM*)lp2) : 0), ((lp2) ? (*(HLISTITEM*)lp2)->lpUser : 0)); - else - return FastList_SortFunc_AlphaNumeric (fg.pfl->hList, ((lp1) ? (*(HLISTITEM*)lp1) : 0), ((lp1) ? (*(HLISTITEM*)lp1)->lpUser : 0), ((lp2) ? (*(HLISTITEM*)lp2) : 0), ((lp2) ? (*(HLISTITEM*)lp2)->lpUser : 0)); -} - - -void FastList_RepairOneVisibilityFlag (LPFASTLIST pfl, HLISTITEM hItem) -{ - // There are two reasons to hide an item: because we're in tree mode - // and one of its parent is collapsed, or because we're not in tree mode - // and it has the only-show-me-in-tree-mode flag set. - // - BOOL fTreeMode = (pfl->dwStyle & FLS_VIEW_TREE) ? TRUE : FALSE; - - hItem->fVisible = TRUE; - - if ((hItem->dwFlags & FLIF_TREEVIEW_ONLY) && (!fTreeMode)) - { - hItem->fVisible = FALSE; - } - else if (fTreeMode) - { - for (HLISTITEM hParent = hItem->hTreeParent; hParent; hParent = hParent->hTreeParent) - { - if ((!hParent->fVisible) || (!hParent->fExpanded)) - { - hItem->fVisible = FALSE; - break; - } - } - } -} - - -void FastList_RepairVisibilityFlags (LPFASTLIST pfl, HLISTITEM hParent, BOOL fForceHidden) -{ - BOOL fTreeMode = (pfl->dwStyle & FLS_VIEW_TREE) ? TRUE : FALSE; - - // This routine fixes the {fVisible} flags for all items, based on - // their FLIF_TREEVIEW_ONLY flags and whether their parent items are - // visible. - // - // Technically we could acheive this by a normal FindFirst()/FindNext() - // enumeration of the items in the hashlist; on each item, we'd check - // its parents and flags. But we can be a smidgen faster by walking - // the list in tree order--that way, when we hit a collapsed tree, we - // can mark all its children as hidden without any additional work. - // - // Naturally, since we're a FASTlist, we'll take any little smidgen of - // speed we can get. Find the first item in the chain that we're going - // to fix. - // - for (HLISTITEM hItem = (hParent) ? hParent->hTreeChild : pfl->hTreeFirst; hItem; hItem = hItem->hTreeNext) - { - // If we were passed {fForceHidden==TRUE}, we know that we're in tree - // mode and one of our parents is collapsed--that's great, because it - // means we can set fVisible=FALSE without thinking. If we weren't passed - // that flag, we know that we're either not in treeview mode or none - // of our parents are collapsed--so we don't have to walk up the - // list of parents to check that. - // - if (fForceHidden) - hItem->fVisible = FALSE; - else - hItem->fVisible = fTreeMode || !(hItem->dwFlags & FLIF_TREEVIEW_ONLY); - - // We've fixed this item. If it has any children, fix them too. - // Remember that we may be able to blindly tell children to be hidden. - // - if (hItem->hTreeChild) - { - BOOL fChildrenHidden = fForceHidden; - if (fTreeMode && (!hItem->fExpanded || !hItem->fVisible)) - fChildrenHidden = TRUE; - - FastList_RepairVisibilityFlags (pfl, hItem, fChildrenHidden); - } - } -} - - -void FastList_RepairVisibilityIndices (LPFASTLIST pfl, HLISTITEM hParent) -{ - BOOL fTreeMode = (pfl->dwStyle & FLS_VIEW_TREE) ? TRUE : FALSE; - - if (hParent == NULL) // Starting a new repair? Initialize pfl->cVisible. - { - pfl->cVisible = 0; - pfl->fSyncIndicesBeforePaint = FALSE; - } - - // This routine fixes the {index} settings for all items, by walking - // the list/tree in (presumably already-sorted) order and making - // sure all items with {fVisible} set have smoothly increasing indices. - // It rebuilds the Visible heap as it goes along. - // - for (HLISTITEM hItem = (!fTreeMode) ? (pfl->hListFirst) : (hParent) ? (hParent->hTreeChild) : (pfl->hTreeFirst); - hItem != NULL; - hItem = (!fTreeMode) ? (hItem->hListNext) : (hItem->hTreeNext)) - { - if (hItem->fVisible) - { - hItem->index = pfl->cVisible; - - // Update the aVisibleHeap to match the new item. - // - REALLOC (pfl->aVisibleHeap, pfl->cVisibleHeap, 1+ hItem->index, cREALLOC_VISIBLEHEAP(pfl)); - pfl->aVisibleHeap[ hItem->index ] = hItem; - pfl->cVisible ++; - } - - if (fTreeMode && hItem->hTreeChild) - { - FastList_RepairVisibilityIndices (pfl, hItem); - } - } -} - - -void FastList_ScrollHeader (LPFASTLIST pfl) -{ - if (pfl->hHeader) - { - RECT rHeader; - GetWindowRect (pfl->hHeader, &rHeader); - - LONG cx = rHeader.right + pfl->dxPixel; - - SetWindowPos (pfl->hHeader, 0, - 0 - pfl->dxPixel, 0, cx, cyRECT(rHeader), - SWP_NOZORDER | SWP_NOACTIVATE); - } -} - - -void FastList_PerformSelectTest (LPFASTLIST pfl, HLISTITEM hItem) -{ - if (pfl->hSelectFirst && !hItem->fSelected) - { - BOOL fMultiple = (pfl->dwStyle & FLS_SELECTION_MULTIPLE); - BOOL fTreeMode = (pfl->dwStyle & FLS_VIEW_TREE); - BOOL fLevel = (pfl->dwStyle & (FLS_SELECTION_LEVEL & ~FLS_SELECTION_MULTIPLE)); - BOOL fSibling = (pfl->dwStyle & (FLS_SELECTION_SIBLING & ~FLS_SELECTION_MULTIPLE)); - - BOOL fClearSelection = FALSE; - - if (!fMultiple) - { - fClearSelection = TRUE; - } - else if (fTreeMode) - { - if (fLevel) - { - size_t iLevelItem = 0; - for (HLISTITEM hParent = hItem->hTreeParent; hParent; hParent = hParent->hTreeParent) - ++iLevelItem; - - size_t iLevelSelected = 0; - for (hParent = pfl->hSelectFirst->hTreeParent; hParent; hParent = hParent->hTreeParent) - ++iLevelSelected; - - if (iLevelItem != iLevelSelected) - fClearSelection = TRUE; - } - - if (fSibling) - { - BOOL fFound = FALSE; - for (HLISTITEM hSearch = hItem->hTreePrevious; !fFound && hSearch; hSearch = hSearch->hTreePrevious) - { - if (hSearch == pfl->hSelectFirst) - fFound = TRUE; - } - for (hSearch = hItem->hTreeNext; !fFound && hSearch; hSearch = hSearch->hTreeNext) - { - if (hSearch == pfl->hSelectFirst) - fFound = TRUE; - } - if (!fFound) - fClearSelection = TRUE; - } - } - - if (fClearSelection) - { - FastList_OnCommand_SelectItem (pfl->hList, NULL, FALSE); - } - } -} - - -void FastList_PerformSelectItem (LPFASTLIST pfl, HLISTITEM hItem, BOOL fSelect) -{ - if (hItem->fSelected != fSelect) - { - if ((hItem->fSelected = fSelect) == FALSE) - { - if (hItem->hSelectPrevious) - hItem->hSelectPrevious->hSelectNext = hItem->hSelectNext; - if (hItem->hSelectNext) - hItem->hSelectNext->hSelectPrevious = hItem->hSelectPrevious; - if (pfl->hSelectFirst == hItem) - pfl->hSelectFirst = hItem->hSelectNext; - if (pfl->hAnchor == hItem) - pfl->hAnchor = NULL; - hItem->hSelectPrevious = NULL; - hItem->hSelectNext = NULL; - } - else // (hItem->fSelected == TRUE) - { - if ((hItem->hSelectNext = pfl->hSelectFirst) != NULL) - hItem->hSelectNext->hSelectPrevious = hItem; - pfl->hSelectFirst = hItem; - if (hItem->hSelectNext == NULL) - pfl->hAnchor = hItem; - } - - FastList_Notify_ItemChanged (pfl, hItem); - FastList_Repaint (pfl); - } -} - - -void FastList_PerformSelectRange (LPFASTLIST pfl, HLISTITEM hItem1, HLISTITEM hItem2) -{ - if (hItem1->fVisible && hItem2->fVisible) - { - FastList_Begin (pfl->hList); - - int iIndex1 = min (hItem1->index, hItem2->index); - int iIndex2 = max (hItem1->index, hItem2->index); - for (int iIndex = iIndex1; iIndex <= iIndex2; ++iIndex) - FastList_SelectItem (pfl->hList, pfl->aVisibleHeap[ iIndex ], TRUE); - - FastList_Repaint (pfl); - FastList_End (pfl->hList); - } -} - - -void FastList_PerformEnsureVisible (LPFASTLIST pfl) -{ - if (pfl->hEnsureVisible && pfl->lItems->fIsInList (pfl->hEnsureVisible)) - { - RECT rClient; - GetClientRect (pfl->hList, &rClient); - if (pfl->hScrollV) - rClient.right -= GetSystemMetrics(SM_CXVSCROLL); - if (pfl->hScrollH) - rClient.bottom -= GetSystemMetrics(SM_CYHSCROLL); - if (pfl->hHeader) - rClient.top += FastList_GetHeaderHeight (pfl); - - RECT rItem; - FastList_CalcItemRect (pfl, pfl->hEnsureVisible->index, &rItem, !!pfl->hScrollH, !!pfl->hScrollV); - - if (rItem.right > (cxRECT(rClient) + pfl->dxPixel)) - pfl->dxPixel = rItem.right - cxRECT(rClient); - if (rItem.left < pfl->dxPixel) - pfl->dxPixel = rItem.left; - if (rItem.bottom > (pfl->dyPixel + rClient.bottom)) - pfl->dyPixel = rItem.bottom - rClient.bottom; - if (rItem.top < (pfl->dyPixel + rClient.top)) - pfl->dyPixel = rItem.top - rClient.top; - - pfl->hEnsureVisible = NULL; - FastList_SyncScrollPos (pfl); - } -} - - -void FastList_ButtonDown (HWND hList, BOOL fRightButton, BOOL fActivate) -{ - if (GetParent (hList)) - PostMessage (GetParent(hList), WM_NEXTDLGCTL, (WPARAM)hList, TRUE); - else - SetFocus (hList); - - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - - // The rules for selection are somewhat complex; they follow the - // conventions used by the Windows shell: - // - // * if the user button-downs on the open/close box of a treeview item, - // expand or collapse that item, and perform no further processing. - // - // * if the user button-downs on an item, - // and if that item is not selected, then: - // - if the Control is not down, deselect all items - // - if the Shift key is down, select all items between the Anchor - // and the clicked-on item - // - if the Shift key is not down, select (and anchor on) the item - // - // * if the user button-downs and subsequently moves the mouse enough to - // indicate a drag operation prior to the next button-up, - // notify the parent window. - // - // * if the user double-clicked, treat it as a button-down followed - // immediately thereafter by a button-up - // - // * if the user button-ups without having triggered a drag operation, - // - if the user had button-downed on an already-selected item, - // de-select that item - // - // * if the user button-ups after having triggered a drag operation, - // notify the parent window. - // - // Here, the user has just button-downed, either as part of a single-click - // or a double-click. We therefore will attempt the initial selection - // process, store the screen coordinates at which the user clicked, and - // set capture onto this list window that we may look for drag operations. - - // First find out where the user button-downed. - // - DWORD dwPos = GetMessagePos(); - - POINT ptScreen; - ptScreen.x = LOWORD(dwPos); - ptScreen.y = HIWORD(dwPos); - - POINT ptClient = ptScreen; - ScreenToClient (hList, &ptClient); - - // Determine what item is underneath the given point; also determine - // the region of the item which was clicked. - // - HLISTITEM hStrict = NULL; - HLISTITEM hNonStrict = NULL; - FASTLISTITEMREGIONS regNonStrict; - if ((hStrict = FastList_ItemFromPoint (hList, &ptClient, TRUE)) == NULL) - { - if ((hNonStrict = FastList_ItemFromPoint (hList, &ptClient, FALSE)) != NULL) - FastList_GetItemRegions (hList, hNonStrict, ®NonStrict); - } - - // If the user has clicked on the open/close button of an item, expand - // or collapse that item. - // - FastList_Begin (hList); - - if ( (!hStrict) && (hNonStrict) && (PtInRect (®NonStrict.rButton, ptClient)) ) - { - FastList_OnCommand_Expand (hList, hNonStrict, !hNonStrict->fExpanded); - FastList_Notify_ItemExpand (pfl, hNonStrict); - FastList_End (hList); - return; - } - - // If the user failed to click on any item at all, and if the control - // key is not down, de-select all items. Regardless, return thereafter. - // - if (!hStrict) - { - if (!fIsControlDown()) - FastList_SelectNone (hList); - FastList_SetFocus (hList,NULL); - FastList_End (hList); - FastList_Notify_ItemSelect (pfl); - return; - } - - // If the user has double-clicked on an item, and that item is a parent - // of other item, and if the tree is showing, expand or collapse that item. - // - if (fActivate && hStrict->hTreeChild && (pfl->dwStyle & FLS_VIEW_TREE)) - { - FastList_OnCommand_Expand (hList, hStrict, !hStrict->fExpanded); - FastList_End (hList); - return; - } - - // The user has clicked on an item. Record what we know about what - // the user has done, and apply message capturing to the list. - // - pfl->fButtonDown = TRUE; - pfl->fRightDrag = fRightButton; - pfl->fDragging = FALSE; - pfl->fTriedToDrag = FALSE; - pfl->ptScreenDown = ptScreen; - pfl->hHitOnDown = hStrict; - pfl->fSelectedOnDown = hStrict->fSelected; - SetCapture (hList); - - // There are eight states about which we need to concern ourselves: - // - // Control: Down (C) or Not Down (c) - // Shift: Down (S) or Not Down (s) - // Item: Selected (I) or Not Selected (i) - // - // csi: de-select all items, anchor and select the specified item - // csI: de-select all items, anchor and select the specified item - // cSi: de-select all items, select from the anchor to the specified item - // cSI: de-select all items, select from the anchor to the specified item - // Csi: anchor and select the specified item - // CsI: anchor and select the specified item - // CSi: select from the anchor to the specified item - // CSI: select from the anchor to the specified item - // - // From this we can deduce the following rules: - // - // if Control is not down, begin by de-selecting all items - // if Shift is not down, anchor and select the specified item - // if Shift is down, select from the anchor to the specified item - // - HLISTITEM hAnchor = pfl->hAnchor; - if (!fIsControlDown()) - { - FastList_SelectNone (hList); - } - if (!fIsShiftDown() || !hAnchor) - { - FastList_SelectItem (hList, hStrict, TRUE); - pfl->hAnchor = hStrict; - } - if (fIsShiftDown() && hAnchor) - { - FastList_PerformSelectRange (pfl, hAnchor, hStrict); - if (hAnchor->fSelected) - pfl->hAnchor = hAnchor; - } - - // Finally, place the focus on the clicked-on item, and return. - // We will complete the selection/dragging operation on mouseup. - // - FastList_SetFocus (hList, hStrict); - FastList_End (hList); - FastList_Notify_ItemSelect (pfl); - } -} - - -void FastList_MouseMove (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - // If there is no possibility that the user may be dragging something, - // ignore the message. - // - if (!pfl->fButtonDown) - return; - - // If the user has triggered a drag operation, notify the parent. - // - if ((!pfl->fTriedToDrag) || (pfl->fDragging)) - { - DWORD dwCode = (pfl->fDragging) ? FLN_DRAG : FLN_BEGINDRAG; - DWORD dwPos = GetMessagePos(); - - POINT ptScreenTo; - ptScreenTo.x = LOWORD(dwPos); - ptScreenTo.y = HIWORD(dwPos); - - if (!pfl->fTriedToDrag) - { - if ( (abs(ptScreenTo.x - pfl->ptScreenDown.x) >= GetSystemMetrics(SM_CXDRAG)) || - (abs(ptScreenTo.y - pfl->ptScreenDown.y) >= GetSystemMetrics(SM_CYDRAG)) ) - { - pfl->fTriedToDrag = TRUE; - } - } - if (pfl->fTriedToDrag) - { - FLN_DRAG_PARAMS fln; - fln.hFirst = pfl->hSelectFirst; - fln.ptScreenFrom = pfl->ptScreenDown; - fln.ptScreenTo = ptScreenTo; - fln.fRightButton = pfl->fRightDrag; - fln.fShift = fIsShiftDown(); - fln.fControl = fIsControlDown(); - if ( (FastList_Notify_Drag (pfl, dwCode, &fln)) && (dwCode == FLN_BEGINDRAG) ) - pfl->fDragging = TRUE; - } - } - } -} - - -void FastList_ButtonUp (HWND hList, BOOL fRightButton, BOOL fActivate) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - // First, our caller may have just notified us that a double-click - // took place; if so, we may have already handled it (in the ButtonDown) - // routine. Or, moreover, if we never got a button-down at all, - // there's nothing for us to do here. - // - if (!pfl->fButtonDown) - return; - if (pfl->fRightDrag != fRightButton) - return; - - // Release capture; we no longer need it. - // - pfl->fButtonDown = FALSE; - ReleaseCapture(); - - // If the user right-button-ups without having triggered a drag operation, - // send a WM_CONTEXTMENU message. - // - if ( (!pfl->fTriedToDrag) && (fRightButton) ) - { - if (GetParent (hList)) - { - PostMessage (GetParent (hList), WM_CONTEXTMENU, (WPARAM)hList, (LPARAM)GetMessagePos()); - } - } - - // If the user button-ups without having triggered a drag operation, - // and if the user had button-downed on an already-selected item, - // de-select that item. - // - if ( (!pfl->fTriedToDrag) && (pfl->hHitOnDown) && (pfl->fSelectedOnDown) && (fIsControlDown()) ) - { - FastList_SelectItem (hList, pfl->hHitOnDown, FALSE); - FastList_Notify_ItemSelect (pfl); - return; - } - - // If the user button-ups after triggering a drag operation, notify - // our parent. - // - if (pfl->fDragging) - { - DWORD dwPos = GetMessagePos(); - - POINT ptScreenTo; - ptScreenTo.x = LOWORD(dwPos); - ptScreenTo.y = HIWORD(dwPos); - - FLN_DRAG_PARAMS fln; - fln.hFirst = pfl->hSelectFirst; - fln.ptScreenFrom = pfl->ptScreenDown; - fln.ptScreenTo = ptScreenTo; - fln.fRightButton = pfl->fRightDrag; - fln.fShift = fIsShiftDown(); - fln.fControl = fIsControlDown(); - FastList_Notify_Drag (pfl, FLN_ENDDRAG, &fln); - } - } -} - - -/* - * UTILITY FUNCTIONS __________________________________________________________ - * - */ - -LPFASTLIST GetFastList (HWND hList) -{ - LPFASTLIST pfl; - try { - if (!GetWindowLong (hList, 0)) - pfl = NULL; else - if ((pfl = (LPFASTLIST)GetWindowLong (hList, 0))->dwSig != dwSigFASTLIST) - pfl = NULL; - else if (pfl->hList != hList) - pfl = NULL; - } catch(...) { - pfl = NULL; - } - return pfl; -} - - -BOOL fIsFastList (HWND hList) -{ - return (GetFastList (hList)) ? TRUE : FALSE; -} - - -void FastList_Enter (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - EnterCriticalSection (&pfl->cs); - } -} - - -void FastList_Leave (HWND hList) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) != NULL) - { - LeaveCriticalSection (&pfl->cs); - } -} - - -int CALLBACK FastList_SortFunc_AlphaNumeric (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) == NULL) - return 0; - - if (!hItem1 || !hItem2) - return 0; - - LPTSTR pszText1 = FastList_GetColumnText (pfl, hItem1, pfl->iColSort, FALSE); - LPTSTR pszText2 = FastList_GetColumnText (pfl, hItem2, pfl->iColSort, TRUE); - - if ( (pfl->iColSort < (int)pfl->cColumns) && - (pfl->aColumns[ pfl->iColSort ].pszText != NULL) && - ((pfl->aColumns[ pfl->iColSort ].fmt & HDF_JUSTIFYMASK) == HDF_RIGHT) ) - { - double dItem1 = atof (pszText1); - double dItem2 = atof (pszText2); - - if (pfl->fRevSort) - return (dItem1 < dItem2) ? 1 : (dItem1 > dItem2) ? -1 : 0; - else - return (dItem1 < dItem2) ? -1 : (dItem1 > dItem2) ? 1 : 0; - } - else // left- or center- justified; use an alphabetic sort - { - if (pfl->fRevSort) - return lstrcmpi (pszText2, pszText1); - else - return lstrcmpi (pszText1, pszText2); - } -} - - -int CALLBACK FastList_SortFunc_Alphabetic (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) == NULL) - return 0; - - if (!hItem1 || !hItem2) - return 0; - - LPTSTR pszText1 = FastList_GetColumnText (pfl, hItem1, pfl->iColSort, FALSE); - LPTSTR pszText2 = FastList_GetColumnText (pfl, hItem2, pfl->iColSort, TRUE); - - if (pfl->fRevSort) - return lstrcmpi (pszText2, pszText1); - else - return lstrcmpi (pszText1, pszText2); -} - - -int CALLBACK FastList_SortFunc_Numeric (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - LPFASTLIST pfl; - if ((pfl = GetFastList (hList)) == NULL) - return 0; - - if (!hItem1 || !hItem2) - return 0; - - LPTSTR pszText1 = FastList_GetColumnText (pfl, hItem1, pfl->iColSort, FALSE); - LPTSTR pszText2 = FastList_GetColumnText (pfl, hItem2, pfl->iColSort, TRUE); - - double dItem1 = atof (pszText1); - double dItem2 = atof (pszText2); - - if (pfl->fRevSort) - return (dItem1 < dItem2) ? 1 : (dItem1 > dItem2) ? -1 : 0; - else - return (dItem1 < dItem2) ? -1 : (dItem1 > dItem2) ? 1 : 0; -} - - -/* - * HASHLIST KEYS ______________________________________________________________ - * - */ - -BOOL CALLBACK FastList_KeyUserParam_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return (((HLISTITEM)pObject)->lpUser == *(LPARAM*)pData) ? TRUE : FALSE; -} - -HASHVALUE CALLBACK FastList_KeyUserParam_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return FastList_KeyUserParam_HashData (pKey, &((HLISTITEM)pObject)->lpUser); -} - -HASHVALUE CALLBACK FastList_KeyUserParam_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)*(LPARAM*)pData; -} - diff --git a/src/WINNT/afsapplib/fastlist.h b/src/WINNT/afsapplib/fastlist.h deleted file mode 100644 index e4d598e66..000000000 --- a/src/WINNT/afsapplib/fastlist.h +++ /dev/null @@ -1,773 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef FASTLIST_H -#define FASTLIST_H - -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#define WC_FASTLIST TEXT("FastList") - -#define FLM_FIRST 0x1400 - -#define FLN_FIRST (0U-880U) -#define FLN_LAST (0U-885U) - -#define IMAGE_NOIMAGE ((int)(-1)) -#define IMAGE_BLANKIMAGE ((int)(-2)) - - -/* - * WINDOW STYLES ______________________________________________________________ - * - */ - - // The FLS_VIEW_* styles are used to indicate the format for - // displaying items in the FastList; either by Large Icons, - // Small Icons (equivalent to a ListView's "List" layout), - // in a List (equivalent to ListView's "Report" layout), - // in a Tree (equivalent to a TreeView), or as a tree/list hybrid-- - // showing the Tree hierarchy as well as a header bar and - // details about each item. - // -#define FLS_VIEW_LARGE 0x0001 -#define FLS_VIEW_SMALL 0x0002 -#define FLS_VIEW_LIST 0x0003 -#define FLS_VIEW_TREE 0x0004 -#define FLS_VIEW_TREELIST (FLS_VIEW_TREE | FLS_VIEW_LIST) -#define FLS_VIEW_MASK (FLS_VIEW_LARGE | FLS_VIEW_SMALL | FLS_VIEW_TREE | FLS_VIEW_LIST) - - // The FLS_NOSORTHEADER style causes the header bar (when visible) - // to be drawn "flat"--the buttons cannot be depressed. This style - // cannot be combined with FLS_AUTOSORTHEADER. - // -#define FLS_NOSORTHEADER 0x0008 - - // The FLS_SELECTION_MULTIPLE style indicates that more than one - // item in the list may be selected at any time. When combined with - // the FLS_SELECTION_SIBLING style, only direct siblings in the tree - // hierarchy may be selected at any time. When instead combined with - // the FLS_SELECTION_LEVEL style, only items at the same level from - // the root may be selected at any time. If these bits are not set, - // only one item may be selected at any time. - // -#define FLS_SELECTION_MULTIPLE 0x0010 -#define FLS_SELECTION_SIBLING (0x0020 | FLS_SELECTION_MULTIPLE) -#define FLS_SELECTION_LEVEL (0x0040 | FLS_SELECTION_MULTIPLE) - - // The FLS_LINESATROOT style causes root-level items in the tree - // to be prefixed by open/close boxes. - // -#define FLS_LINESATROOT 0x0080 - - // The FLS_LONGCOLUMNS style allows the right-most column containing - // text, if left-justified, to be drawn to the extent of the window - // regardless of column boundaries. It is particularly useful in - // Tree/List mode, where some entries may have long descriptions - // for the left-most column, and others may have several columns of - // data. - // -#define FLS_LONGCOLUMNS 0x0100 - - // The FLS_HIT_TEXTONLY style allows the user to de-select all - // items by left- or right-clicking on the whitespace between - // columns of data in List mode. (It has no effect in other modes.) - // If this bit is not set, clicking on this whitespace causes - // that item to be selected. - // -#define FLS_HIT_TEXTONLY 0x0200 - - // The FLS_AUTOSORTHEADER style allows the user to sort on any - // column by clicking on the column, or to reverse the sort on - // a column by clicking it twice. This style cannot be combined - // with the FLS_NOSORTHEADER style. - // -#define FLS_AUTOSORTHEADER 0x0400 - -/* - * STRUCTURES _________________________________________________________________ - * - */ - -typedef struct _FASTLISTITEM *HLISTITEM; - -typedef struct FASTLISTADDITEM - { - HLISTITEM hParent; // parent item or NULL - int iFirstImage; // primary icon or imageNO_IMAGE - int iSecondImage; // secondary icon or imageNO_IMAGE - LPTSTR pszText; // text for column 0 - LPARAM lParam; // user-supplied cookie - DWORD dwFlags; // combination of FLIF_* flags - } FASTLISTADDITEM, *LPFASTLISTADDITEM; - -#define FLIF_TREEVIEW_ONLY 0x0001 // hide item unless in tree view -#define FLIF_DROPHIGHLIGHT 0x0002 // draw item as if it were selected -#define FLIF_DISALLOW_COLLAPSE 0x0004 // don't allow this item to collapse -#define FLIF_DISALLOW_SELECT 0x0008 // don't allow this item to be selected - -typedef struct FASTLISTITEMREGIONS - { - RECT rItem; // OUT: overall rectangle for item - RECT rImage; // OUT: rect of item's images - RECT rLabel; // OUT: rect of item's label - RECT rHighlight; // OUT: rect that inverts on selection - RECT rButton; // OUT: rect of tree open/close button - RECT rSelect; // OUT: union of rHighlight+rImage - } FASTLISTITEMREGIONS, *LPFASTLISTITEMREGIONS; - -typedef struct FASTLISTDRAWITEM - { - HDC hdc; // IN: target or template HDC - BOOL fDraw; // IN: TRUE if should render to hdc - BOOL fDragImage; // IN: TRUE if want drag image only - HWND hWnd; // IN: handle of fastlist window - HLISTITEM hItem; // IN: item to be drawn - LPARAM lParam; // IN: user-supplied lparam for item - RECT rItem; // IN: overall rectangle for item - POINT ptTextTest; // IN: client coords of point to test - BOOL fTextTestHit; // OUT: TRUE if point is within text - FASTLISTITEMREGIONS reg; // OUT: information about item image - } FASTLISTDRAWITEM, *LPFASTLISTDRAWITEM; - -typedef struct FLN_GETITEMTEXT_PARAMS - { - NMHDR hdr; // IN: typical notification header - struct - { - HLISTITEM hItem; // IN: item for which to obtain text - int icol; // IN: 0-based column of text to get - LPARAM lParam; // IN: user-supplied lparam for item - LPTSTR pszText; // IN: buffer in which to place text - size_t cchTextMax; // IN: size of buffer; OUT: required - } item; - } FLN_GETITEMTEXT_PARAMS, *LPFLN_GETITEMTEXT_PARAMS; - -typedef struct FLN_ITEMCHANGED_PARAMS - { - NMHDR hdr; // IN: typical notification header - HLISTITEM hItem; // IN: item whose data has changed - } FLN_ITEMCHANGED_PARAMS, *LPFLN_ITEMCHANGED_PARAMS; - -typedef struct FLN_ADDITEM_PARAMS - { - NMHDR hdr; // IN: typical notification header - HLISTITEM hItem; // IN: item which was added - } FLN_ADDITEM_PARAMS, *LPFLN_ADDITEM_PARAMS; - -typedef struct FLN_REMOVEITEM_PARAMS - { - NMHDR hdr; // IN: typical notification header - HLISTITEM hItem; // IN: item which was removed - } FLN_REMOVEITEM_PARAMS, *LPFLN_REMOVEITEM_PARAMS; - -typedef struct FLN_COLUMNCLICK_PARAMS - { - NMHDR hdr; // IN: typical notification header - int icol; // IN: 0-based column that was clicked - BOOL fDouble; // IN: TRUE if 'twas a double-click - } FLN_COLUMNCLICK_PARAMS, *LPFLN_COLUMNCLICK_PARAMS; - -typedef struct FLN_COLUMNRESIZE_PARAMS - { - NMHDR hdr; // IN: typical notification header - int icol; // IN: 0-based column that was resized - LONG cxWidth; // IN: new width of the column - } FLN_COLUMNRESIZE_PARAMS, *LPFLN_COLUMNRESIZE_PARAMS; - -typedef struct FLN_ITEMSELECT_PARAMS - { - NMHDR hdr; // IN: typical notification header - HLISTITEM hItem; // IN: first item which is now selected - } FLN_ITEMSELECT_PARAMS, *LPFLN_ITEMSELECT_PARAMS; - -typedef struct FLN_ITEMEXPAND_PARAMS - { - NMHDR hdr; // IN: typical notification header - HLISTITEM hItem; // IN: item which was expanded/collapsed - BOOL fExpanded; // IN: TRUE if item is now expanded - } FLN_ITEMEXPAND_PARAMS, *LPFLN_ITEMEXPAND_PARAMS; - -typedef struct FLN_DRAG_PARAMS - { - NMHDR hdr; // IN: typical notification header - HLISTITEM hFirst; // IN: first (of perhaps many) selected - POINT ptScreenFrom; // IN: screen coordinates of button-down - POINT ptScreenTo; // IN: final screen coordinates - BOOL fRightButton; // IN: TRUE if right-button drag - BOOL fShift; // IN: TRUE if shift is down - BOOL fControl; // IN: TRUE if control is down - } FLN_DRAG_PARAMS, *LPFLN_DRAG_PARAMS; - -typedef struct FASTLISTCOLUMN - { - DWORD dwFlags; - LONG cxWidth; - TCHAR szText[ 256 ]; - } FASTLISTCOLUMN, *LPFASTLISTCOLUMN; - -#define FLCF_JUSTIFY_LEFT 0x0001 -#define FLCF_JUSTIFY_RIGHT 0x0002 -#define FLCF_JUSTIFY_CENTER 0x0003 -#define FLCF_JUSTIFY_MASK 0x0003 - -typedef struct FASTLISTITEMCOLUMN - { - HLISTITEM hItem; - int icol; - } FASTLISTITEMCOLUMN, *LPFASTLISTITEMCOLUMN; - -typedef struct FASTLISTITEMIMAGE - { - HLISTITEM hItem; - int iImage; - } FASTLISTITEMIMAGE, *LPFASTLISTITEMIMAGE; - -typedef int (CALLBACK * LPFASTLISTSORTFUNC)( HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2 ); - -typedef BOOL (CALLBACK * LPFASTLISTTEXTCALLBACK)( HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie ); - - -/* - * NOTIFICATIONS ______________________________________________________________ - * - * All notifications come via a WM_NOTIFY message to the FastList window's - * parent window. The message handler should be of the form: - * - * switch (msg) { - * case WM_NOTIFY: { - * switch (((LPNMHDR)lp)->code) { - * case FLN_GETITEMTEXT: { - * LPFLN_GETITEMTEXT_PARAMS pParams = (LPFLN_GETITEMTEXT_PARAMS)lp; - * lstrcpy (pParams->pszText, ...); - * return TRUE; - * } - * case FLN_ITEMEXPAND: { - * ... - * return TRUE; - * } - * } - * } - * } - * - * The LPARAM associated with a WM_NOTIFY message is always (for notifications - * from any window, not just FastLists) a structure consisting of: - * struct { - * NMHDR hdr; - * // window- and message-specific elements ... - * } - * Thus, by casing the LPARAM value to LPNMHDR, information about the - * notification can be obtained from any notification structure. - * If a notification message is handled, the handler must return TRUE. - * - */ - -#define FLN_GETITEMTEXT (FLN_FIRST-0) // lp = LPFLN_GETITEMTEXT_PARAMS -#define FLN_ITEMCHANGED (FLN_FIRST-1) // lp = LPFLN_ITEMCHANGED_PARAMS -#define FLN_ADDITEM (FLN_FIRST-2) // lp = LPFLN_ADDITEM_PARAMS -#define FLN_REMOVEITEM (FLN_FIRST-3) // lp = LPFLN_REMOVEITEM_PARAMS -#define FLN_COLUMNCLICK (FLN_FIRST-4) // lp = LPFLN_COLUMNCLICK_PARAMS -#define FLN_COLUMNRESIZE (FLN_FIRST-5) // lp = LPFLN_COLUMNRESIZE_PARAMS -#define FLN_ITEMSELECT (FLN_FIRST-6) // lp = LPFLN_ITEMSELECT_PARAMS -#define FLN_ITEMEXPAND (FLN_FIRST-7) // lp = LPFLN_ITEMEXPAND_PARAMS -#define FLN_LCLICK (FLN_FIRST-8) // lp = LPNMHDR -#define FLN_RCLICK (FLN_FIRST-9) // lp = LPNMHDR -#define FLN_LDBLCLICK (FLN_FIRST-10) // lp = LPNMHDR -#define FLN_BEGINDRAG (FLN_FIRST-11) // lp = LPFLN_DRAG_PARAMS, rc = fDrag -#define FLN_DRAG (FLN_FIRST-12) // lp = LPFLN_DRAG_PARAMS -#define FLN_ENDDRAG (FLN_FIRST-13) // lp = LPFLN_DRAG_PARAMS - - -/* - * MESSAGES ___________________________________________________________________ - * - */ - -/* - * TASK GROUPING - * - * Calling FastList_Begin() suspends sorting, repainting and other display- - * oriented operations until a matching call to FastList_End(). By surrounding - * multiple operations with an initial call to _Begin() and a final call to - * _End(), the operations can proceed (potentially much) more quickly, and - * without flicker as items are added, updated or removed. Calls to _Begin() - * and _End() nest: if _Begin() is called twice, two calls to _End() are - * required to finally cause the display to be repainted and resume normal - * operation. (A call to FastList_EndAll() ignores all nesting and enables - * redraw as if the proper number of calls to _End() had been made.) - * - */ - - // void FastList_Begin (HWND hList); - // -#define FastList_Begin(_hList) \ - (void)SendMessage (_hList, FLM_BEGIN, 0, 0) -#define FLM_BEGIN (FLM_FIRST + 0x0000) - - // void FastList_End (HWND hList); - // void FastList_EndAll (HWND hList); - // -#define FastList_End(_hList) \ - (void)SendMessage (_hList, FLM_END, 0, 0) -#define FastList_EndAll(_hList) \ - (void)SendMessage (_hList, FLM_END, 1, 0) -#define FLM_END (FLM_FIRST + 0x0001) - -/* - * ADD/REMOVE ITEMS - * - * These operations add and remove items to the list, and affect items' - * properties. - * - */ - - // HLISTITEM FastList_AddItem (HWND hList, LPFASTLISTADDITEM pai); - // -#define FastList_AddItem(_hList,_pai) \ - (HLISTITEM)SendMessage (_hList, FLM_ADDITEM, 0, (LPARAM)(_pai)) -#define FLM_ADDITEM (FLM_FIRST + 0x0002) - - // void FastList_RemoveAll (HWND hList) - // void FastList_RemoveItem (HWND hList, HLISTITEM hItem) - // -#define FastList_RemoveAll(_hList) \ - FastList_RemoveItem(_hList,0) -#define FastList_RemoveItem(_hList,_hItem) \ - (void)SendMessage (_hList, FLM_REMOVEITEM, (WPARAM)(_hItem), 0) -#define FLM_REMOVEITEM (FLM_FIRST + 0x0003) - - // LPCTSTR FastList_GetItemText (HWND hList, HLISTITEM hItem, int icol); - // void FastList_SetItemText (HWND hList, HLISTITEM hItem, int icol, LPCTSTR pszText); - // -#define FastList_GetItemText(_hList,_hItem,_iCol) \ - (LPCTSTR)SendMessage (_hList, FLM_GETITEMTEXT, (WPARAM)(_hItem), (LPARAM)(_iCol)) -#define FastList_SetItemText(_hList,_hItem,_iCol,_psz) \ - do { FASTLISTITEMCOLUMN _flic; \ - _flic.hItem = _hItem; \ - _flic.icol = _iCol; \ - (void)SendMessage (_hList, FLM_SETITEMTEXT, (WPARAM)&_flic, (LPARAM)(_psz)); } while (0) -#define FLM_GETITEMTEXT (FLM_FIRST + 0x0004) -#define FLM_SETITEMTEXT (FLM_FIRST + 0x0005) - - // LPARAM FastList_GetItemParam (HWND hList, HLISTITEM hItem); - // void FastList_SetItemParam (HWND hList, HLISTITEM hItem, LPARAM lParam); - // -#define FastList_GetItemParam(_hList,_hItem) \ - (LPARAM)SendMessage (_hList, FLM_GETITEMPARAM, (WPARAM)(_hItem), 0) -#define FastList_SetItemParam(_hList,_hItem,_lp) \ - (void)SendMessage (_hList, FLM_SETITEMPARAM, (WPARAM)(_hItem), (LPARAM)(_lp)) -#define FLM_GETITEMPARAM (FLM_FIRST + 0x0006) -#define FLM_SETITEMPARAM (FLM_FIRST + 0x0007) - - // DWORD FastList_GetItemFlags (HWND hList, HLISTITEM hItem); - // void FastList_SetItemFlags (HWND hList, HLISTITEM hItem, DWORD dwFlags); - // -#define FastList_GetItemFlags(_hList,_hItem) \ - (LPARAM)SendMessage (_hList, FLM_GETITEMFLAGS, (WPARAM)(_hItem), 0) -#define FastList_SetItemFlags(_hList,_hItem,_dw) \ - (void)SendMessage (_hList, FLM_SETITEMFLAGS, (WPARAM)(_hItem), (LPARAM)(_dw)) -#define FLM_GETITEMFLAGS (FLM_FIRST + 0x0008) -#define FLM_SETITEMFLAGS (FLM_FIRST + 0x0009) - - // int FastList_GetItemFirstImage (HWND hList, HLISTITEM hItem); - // int FastList_GetItemSecondImage (HWND hList, HLISTITEM hItem); - // void FastList_SetItemFirstImage (HWND hList, HLISTITEM hItem, int image); - // void FastList_SetItemSecondImage (HWND hList, HLISTITEM hItem, int image); - // -#define FastList_GetItemFirstImage(_hList,_hItem) \ - FastList_GetItemImage(_hList,_hItem,0) -#define FastList_GetItemSecondImage(_hList,_hItem) \ - FastList_GetItemImage(_hList,_hItem,1) -#define FastList_SetItemFirstImage(_hList,_hItem,_image) \ - FastList_SetItemImage(_hList,_hItem,0,_image) -#define FastList_SetItemSecondImage(_hList,_hItem,_image) \ - FastList_SetItemImage(_hList,_hItem,1,_image) -#define FastList_GetItemImage(_hList,_hItem,_iImage) \ - (int)SendMessage (_hList, FLM_GETITEMIMAGE, (WPARAM)(_hItem), (LPARAM)(_iImage)) -#define FastList_SetItemImage(_hList,_hItem,_iImage,_image) \ - do { FASTLISTITEMIMAGE _flii; \ - _flii.hItem = _hItem; \ - _flii.iImage = _iImage; \ - (void)SendMessage (_hList, FLM_SETITEMIMAGE, (WPARAM)&_flii, (LPARAM)(_image)); } while (0) -#define FLM_GETITEMIMAGE (FLM_FIRST + 0x000A) -#define FLM_SETITEMIMAGE (FLM_FIRST + 0x000B) - - // BOOL FastList_IsExpanded (HWND hList, HLISTITEM hItem); - // void FastList_Expand (HWND hList, HLISTITEM hItem); - // void FastList_Collapse (HWND hList, HLISTITEM hItem); - // void FastList_SetExpanded (HWND hList, HLISTITEM hItem, BOOL fExpand); - // -#define FastList_IsExpanded(_hList,_hItem) \ - (BOOL)SendMessage (_hList, FLM_ISEXPANDED, (WPARAM)(_hItem), 0) -#define FastList_Expand(_hList,_hItem) \ - FastList_SetExpanded(_hList,_hItem,TRUE) -#define FastList_Collapse(_hList,_hItem) \ - FastList_SetExpanded(_hList,_hItem,FALSE) -#define FastList_SetExpanded(_hList,_hItem,_fExpand) \ - (BOOL)SendMessage (_hList, FLM_EXPAND, (WPARAM)(_hItem), (LPARAM)(_fExpand)) -#define FLM_ISEXPANDED (FLM_FIRST + 0x000C) -#define FLM_EXPAND (FLM_FIRST + 0x000D) - - // BOOL FastList_IsVisible (HWND hList, HLISTITEM hItem); - // void FastList_EnsureVisible (HWND hList, HLISTITEM hItem); - // -#define FastList_IsVisible(_hList,_hItem) \ - (BOOL)SendMessage (_hList, FLM_ITEMVISIBLE, (WPARAM)(_hItem), 0) -#define FastList_EnsureVisible(_hList,_hItem) \ - (BOOL)SendMessage (_hList, FLM_ITEMVISIBLE, (WPARAM)(_hItem), 1) -#define FLM_ITEMVISIBLE (FLM_FIRST + 0x000E) - - // HLISTITEM FastList_GetFocus (HWND hList); - // BOOL FastList_IsFocused (HWND hList, HLISTITEM hItem); - // void FastList_SetFocus (HWND hList, HLISTITEM hItem); - // -#define FastList_GetFocus(_hList) \ - (HLISTITEM)SendMessage (_hList, FLM_ITEMFOCUS, 0, 0) -#define FastList_IsFocused(_hList,_hItem) \ - (BOOL)SendMessage (_hList, FLM_ITEMFOCUS, (WPARAM)(_hItem), 0) -#define FastList_SetFocus(_hList,_hItem) \ - (void)SendMessage (_hList, FLM_ITEMFOCUS, (WPARAM)(_hItem), 1) -#define FLM_ITEMFOCUS (FLM_FIRST + 0x000F) - - -/* - * IMAGE LIST SUPPORT - * - * A FastList may have two separate IMAGELISTs associated with it--one for - * 32x32 icons (used only in Large mode), and one for 16x16 icons (used in - * all other display modes). Use COMMCTRL.H's ImageList_Create() to create - * imagelists for use with a FastList. - * - */ - - // void FastList_GetImageLists (HWND hList, HIMAGELIST *phiSmall, HIMAGELIST *phiLarge) - // -#define FastList_GetImageLists(_hList,_phiSmall,_phiLarge) \ - (void)SendMessage (_hList, FLM_GETIMAGELISTS, (WPARAM)(_phiSmall), (LPARAM)(_phiLarge)) -#define FLM_GETIMAGELISTS (FLM_FIRST + 0x0010) - - // void FastList_SetImageLists (HWND hList, HIMAGELIST hiSmall, HIMAGELIST hiLarge) - // -#define FastList_SetImageLists(_hList,_hiSmall,_hiLarge) \ - (void)SendMessage (_hList, FLM_SETIMAGELISTS, (WPARAM)(_hiSmall), (LPARAM)(_hiLarge)) -#define FLM_SETIMAGELISTS (FLM_FIRST + 0x0011) - - // HIMAGELIST FastList_CreateDragImage (HWND hList, HLISTITEM hItem) - // -#define FastList_CreateDragImage(_hList,_hItem) \ - (HIMAGELIST)SendMessage (_hList, FLM_CREATEDRAGIMAGE, (WPARAM)(_hItem), 0) -#define FLM_CREATEDRAGIMAGE (FLM_FIRST + 0x0012) - -/* - * SORTING - * - * The contents of a FastList are always kept sorted; they will never be - * displayed out-of-sort. The function used to sort items may be replaced - * by calling the FastList_SetSortFunction() method, and parameters - * regarding the sort may be changed by calling the FastList_SetSortStyle() - * function. The default sorting parameters are: - * - * Function: FastList_SortFunc_AlphaNumeric() [declared way down below] - * Column: Sorted on column 0 - * Reverse: No; items ascending-sorted - * - * The FastList_Sort() function may be called to initiate a re-sort; - * however, doing so is unnecessary (as the list is automatically re-sorted - * when necessary). When displaying items in a tree, sorting is performed - * between sibling items only. - * - */ - - // LPFASTLISTSORTFUNC FastList_GetSortFunction (HWND hList) - // -#define FastList_GetSortFunction(_hList,_pfn) \ - (LPFASTLISTSORTFUNC)SendMessage (_hList, FLM_GETSORTFUNC, 0, 0) -#define FLM_GETSORTFUNC (FLM_FIRST + 0x0013) - - // void FastList_SetSortFunction (HWND hList, LPFASTLISTSORTFUNC pfn) - // -#define FastList_SetSortFunction(_hList,_pfn) \ - (void)SendMessage (_hList, FLM_SETSORTFUNC, 0, (LPARAM)(_pfn)) -#define FLM_SETSORTFUNC (FLM_FIRST + 0x0014) - - // void FastList_GetSortStyle (HWND hList, int *piColumn, BOOL *pfReverse) - // -#define FastList_GetSortStyle(_hList,_piCol,_pfRev) \ - (void)SendMessage (_hList, FLM_GETSORTSTYLE, (WPARAM)(_piCol), (LPARAM)(_pfRev)) -#define FLM_GETSORTSTYLE (FLM_FIRST + 0x0015) - - // void FastList_SetSortStyle (HWND hList, int iColumn, BOOL fReverse) - // -#define FastList_SetSortStyle(_hList,_iCol,_fRev) \ - (void)SendMessage (_hList, FLM_SETSORTSTYLE, (WPARAM)(_iCol), (LPARAM)(_fRev)) -#define FLM_SETSORTSTYLE (FLM_FIRST + 0x0016) - - // void FastList_Sort (HWND hList) - // -#define FastList_Sort(_hList) \ - (void)SendMessage (_hList, FLM_SORT, 0, 0) -#define FLM_SORT (FLM_FIRST + 0x0017) - -/* - * COLUMNS - * - * In List and TreeList mode, a FastList can be caused to display a column - * header and the associated multiple columns of information for each item. - * FastList_AddItem() supplies only a place for the item's column-0 text - * to be specified; other columns may be specified by FastList_SetItemText(), - * but if not, the FastList will call back to its parent window via the - * WM_NOTIFY/FLN_GETITEMTEXT notification to obtain text for the items' - * unspecified columns. - * - */ - - // int FastList_GetColumnCount (HWND hList) - // -#define FastList_GetColumnCount(_hList) \ - (int)SendMessage (_hList, FLM_GETCOLUMNCOUNT, 0, 0) -#define FLM_GETCOLUMNCOUNT (FLM_FIRST + 0x0018) - - // BOOL FastList_GetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol) - // -#define FastList_GetColumn(_hList,_iCol,_pCol) \ - (BOOL)SendMessage (_hList, FLM_GETCOLUMN, (WPARAM)(_iCol), (LPARAM)(_pCol)) -#define FLM_GETCOLUMN (FLM_FIRST + 0x0019) - - // void FastList_SetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol) - // void FastList_RemoveColumn (HWND hList, int iColumn) - // -#define FastList_SetColumn(_hList,_iCol,_pCol) \ - (void)SendMessage (_hList, FLM_SETCOLUMN, (WPARAM)(_iCol), (LPARAM)(_pCol)) -#define FastList_RemoveColumn(_hList,_iCol) \ - FastList_SetColumn (_hList, _iCol, NULL) -#define FLM_SETCOLUMN (FLM_FIRST + 0x001A) - -/* - * SELECTION - * - * A FastList supports several types of selection. Single Selection causes - * any current selection to be cleared before a new item can be selected, - * either programmatically or by user action. Multiple Selection - * indiscriminately allows any items to be selected or deselected at - * the same time. Multiple/Sibling Selection requires that, if an item - * is selected which is not a sibling of any currently-selected items, - * the current selection is cleared first. Multiple/Level Selection requires - * that, if an item is selected which is at a different level from the root - * than any currently-selected item, the current selection is cleared first. - * - */ - - // BOOL FastList_IsSelected (HWND hList, HLISTITEM hItem) - // -#define FastList_IsSelected(_hList,_hItem) \ - (BOOL)SendMessage (_hList, FLM_ISSELECTED, (WPARAM)(_hItem), 0) -#define FLM_ISSELECTED (FLM_FIRST + 0x001B) - - // void FastList_SelectAll (HWND hList) - // void FastList_SelectNone (HWND hList) - // void FastList_SelectItem (HWND hList, HLISTITEM hItem, BOOL fSelect) - // -#define FastList_SelectAll(_hList) \ - FastList_SelectItem(_hList,0,TRUE) -#define FastList_SelectNone(_hList) \ - FastList_SelectItem(_hList,0,FALSE) -#define FastList_SelectItem(_hList,_hItem,_fSel) \ - (void)SendMessage (_hList, FLM_SELECTITEM, (WPARAM)(_hItem), (LPARAM)(_fSel)) -#define FLM_SELECTITEM (FLM_FIRST + 0x001C) - -/* - * ENUMERATION - * - * A FastList provides multiple methods for enumeration. Items in the list - * may be enumerated as members of a hierarchy, or as members of a list. - * Additionally, the items in a FastList are hashed across their lParam - * values, so the FastList item matching a given lParam value can quickly - * be found. All enumeration functions are either constant time, or (as - * in the case of lParam-to-HLISTITEM lookups) extremely close to it. - * - * A typical enumeration will look like this: - * for (HLISTITEM hItem = FastList_FindFirst (hList); - * hItem != NULL; - * hItem = FastList_FindNext (hList, hItem)) - * { - * // ... - * } - * - * Or, equivalently: - * HLISTITEM hItem = NULL; - * while ((hItem = FastList_FindNext (hList, hItem)) != NULL) - * { - * // ... - * } - * - * If an enumeration involving an LPENUM pointer is terminated without - * having enumerated all items in the list, the loop must be followed - * by a FastList_FindClose() statement. (This statement is optional - * otherwise.) If the state of the list or tree is updated, the enumeration - * should be stopped. - * - */ - - // HLISTITEM FastList_FindFirst (HWND hList) - // HLISTITEM FastList_FindNext (HWND hList, HLISTITEM hItem) - // HLISTITEM FastList_FindPrevious (HWND hList, HLISTITEM hItem) - // -#define FastList_FindFirst(_hList) \ - FastList_FindList(_hList,0,FLM_FINDLIST_FIRST) -#define FastList_FindNext(_hList,_hItem) \ - FastList_FindList(_hList,_hItem,FLM_FINDLIST_NEXT) -#define FastList_FindPrevious(_hList,_hItem) \ - FastList_FindList(_hList,_hItem,FLM_FINDLIST_PREVIOUS) -#define FastList_FindList(_hList,_hItem,_dwCode) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDLIST, (WPARAM)(_hItem), (LPARAM)(_dwCode)) -#define FLM_FINDLIST (FLM_FIRST + 0x001D) -#define FLM_FINDLIST_FIRST 0 -#define FLM_FINDLIST_PREVIOUS 1 -#define FLM_FINDLIST_NEXT 2 - - // HLISTITEM FastList_FindFirstInRoot (HWND hList) - // HLISTITEM FastList_FindParent (HWND hList, HLISTITEM hItem) - // HLISTITEM FastList_FindFirstChild (HWND hList, HLISTITEM hItem) - // HLISTITEM FastList_FindPreviousSibling (HWND hList, HLISTITEM hItem) - // HLISTITEM FastList_FindNextSibling (HWND hList, HLISTITEM hItem) - // -#define FastList_FindFirstInRoot(_hList) \ - FastList_FindTree(_hList,0,FLM_FINDTREE_CHILD) -#define FastList_FindParent(_hList,_hItem) \ - FastList_FindTree(_hList,_hItem,FLM_FINDTREE_PARENT) -#define FastList_FindFirstChild(_hList,_hItem) \ - FastList_FindTree(_hList,_hItem,FLM_FINDTREE_CHILD) -#define FastList_FindPreviousSibling(_hList,_hItem) \ - FastList_FindTree(_hList,_hItem,FLM_FINDTREE_PREVIOUS) -#define FastList_FindNextSibling(_hList,_hItem) \ - FastList_FindTree(_hList,_hItem,FLM_FINDTREE_NEXT) -#define FastList_FindTree(_hList,_hItem,_dwCode) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDTREE, (WPARAM)(_hItem), (LPARAM)(_dwCode)) -#define FLM_FINDTREE (FLM_FIRST + 0x001E) -#define FLM_FINDTREE_PARENT 0 -#define FLM_FINDTREE_CHILD 1 -#define FLM_FINDTREE_PREVIOUS 2 -#define FLM_FINDTREE_NEXT 3 - - // HLISTITEM FastList_FindFirstSelected (HWND hList) - // HLISTITEM FastList_FindNextSelected (HWND hList, HLISTITEM hItemPrevious) - // -#define FastList_FindFirstSelected(_hList) \ - FastList_FindNextSelected(_hList,0) -#define FastList_FindNextSelected(_hList,_hItem) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDSELECTED, (WPARAM)(_hItem), 0) -#define FLM_FINDSELECTED (FLM_FIRST + 0x001F) - - // HLISTITEM FastList_FindItem (HWND hList, LPARAM lParam) - // HLISTITEM FastList_FindFirstItem (HWND hList, LPENUM *ppEnum, LPARAM lParam) - // HLISTITEM FastList_FindNextItem (HWND hList, LPENUM *ppEnum) - // void FastList_FindClose (HWND hList, LPENUM *ppEnum) - // -#define FastList_FindItem(_hList,_lp) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDITEM, 0, (LPARAM)(_lp)) -#define FastList_FindFirstItem(_hList,_ppEnum,_lp) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDITEM, (WPARAM)(_ppEnum), (LPARAM)(_lp)) -#define FastList_FindNextItem(_hList,_ppEnum) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDNEXTITEM, (WPARAM)(_ppEnum), 0) -#define FastList_FindClose(_hList,_ppEnum) \ - (void)SendMessage (_hList, FLM_FINDCLOSE, (WPARAM)(_ppEnum), 0) -#define FLM_FINDITEM (FLM_FIRST + 0x0020) -#define FLM_FINDNEXTITEM (FLM_FIRST + 0x0021) -#define FLM_FINDCLOSE (FLM_FIRST + 0x0022) - - // int FastList_GetItemCount (HWND hList) - // int FastList_GetVisibleItemCount (HWND hList) - // -#define FastList_GetItemCount(_hList) \ - (int)SendMessage (_hList, FLM_GETITEMCOUNT, 0, 0) -#define FastList_GetVisibleItemCount(_hList) \ - (int)SendMessage (_hList, FLM_GETITEMCOUNT, 1, 0) -#define FLM_GETITEMCOUNT (FLM_FIRST + 0x0023) - - // HLISTITEM FastList_FindFirstVisible (HWND hList) - // HLISTITEM FastList_FindNextVisible (HWND hList, HLISTITEM hItem) - // -#define FastList_FindFirstVisible(_hList) \ - FastList_FindVisible(_hList,0,FLM_FINDVISIBLE_FIRST) -#define FastList_FindNextVisible(_hList,_hItem) \ - FastList_FindVisible(_hList,_hItem,FLM_FINDVISIBLE_NEXT) -#define FastList_FindVisible(_hList,_hItem,_dwCode) \ - (HLISTITEM)SendMessage (_hList, FLM_FINDVISIBLE, (WPARAM)(_hItem), (LPARAM)(_dwCode)) -#define FLM_FINDVISIBLE (FLM_FIRST + 0x0024) -#define FLM_FINDVISIBLE_FIRST 0 -#define FLM_FINDVISIBLE_NEXT 1 - -/* - * ITEM DISPLAY - * - * Like any other control, a FastList can tell you which item is underneath - * a particular point, and can tell you what RECTs an item uses for what - * purposes on the display. - * - * There are style bits which can be set to affect hit-testing on - * a FastList. Notably, the FLS_HIT_TEXTONLY bit prevents left- or right- - * clicking in whitespace to select an item (in list mode). - * - */ - - // HLISTITEM FastList_ItemFromPoint (HWND hList, POINT *pptClient, BOOL fStrict) - // -#define FastList_ItemFromPoint(_hList,_pptClient,_fStrict) \ - (HLISTITEM)SendMessage (_hList, FLM_ITEMFROMPOINT, (WPARAM)(_pptClient), (LPARAM)(_fStrict)) -#define FLM_ITEMFROMPOINT (FLM_FIRST + 0x0025) - - // void FastList_GetItemRegions (HWND hList, HLISTITEM hItem, LPFASTLISTITEMREGIONS pReg) - // -#define FastList_GetItemRegions(_hList,_hItem,_pReg) \ - (HLISTITEM)SendMessage (_hList, FLM_GETITEMREGIONS, (WPARAM)(_hItem), (LPARAM)(_pReg)) -#define FLM_GETITEMREGIONS (FLM_FIRST + 0x0026) - - // LPFASTLISTTEXTCALLBACK FastList_GetTextCallback (HWND hList) - // void FastList_SetTextCallback (HWND hList, LPFASTLISTTEXTCALLBACK pfn, DWORD dwCookie) - // -#define FastList_GetTextCallback(_hList) \ - (LPFASTLISTTEXTCALLBACK)SendMessage (_hList, FLM_GETTEXTCALLBACK, 0, 0) -#define FastList_SetTextCallback(_hList,_pfn,_dwCookie) \ - (void)SendMessage (_hList, FLM_SETTEXTCALLBACK, (WPARAM)(_pfn), (LPARAM)(_dwCookie)) -#define FLM_GETTEXTCALLBACK (FLM_FIRST + 0x0027) -#define FLM_SETTEXTCALLBACK (FLM_FIRST + 0x0028) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -EXPORTED BOOL RegisterFastListClass (void); -EXPORTED BOOL fIsFastList (HWND hList); - -EXPORTED void FastList_Enter (HWND hList); -EXPORTED void FastList_Leave (HWND hList); - -EXPORTED int CALLBACK FastList_SortFunc_Alphabetic (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2); -EXPORTED int CALLBACK FastList_SortFunc_Numeric (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2); -EXPORTED int CALLBACK FastList_SortFunc_AlphaNumeric (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2); - - -#endif - diff --git a/src/WINNT/afsapplib/hashlist.cpp b/src/WINNT/afsapplib/hashlist.cpp deleted file mode 100644 index 3607bdc16..000000000 --- a/src/WINNT/afsapplib/hashlist.cpp +++ /dev/null @@ -1,1112 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include - - -/* - * HashList - super-quick list manager - * - */ - -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define iINVALID ((size_t)-1) - - // We over-allocate the m_aObjects[] arrays whenever one fills up, - // in order to perform fewer allocations. The allocation size - // is defined by the macro below: - // -#define cREALLOC_OBJECTS 8192 - - // We also over-allocate the m_aKeys[] array in a hashlist, but - // nothing so dramatic here. It's simply always allocated to a - // multiple of 4. - // -#define cREALLOC_KEYS 4 - - // The hashtables within each HASHLISTKEY also automatically resize - // themselves whenever they're too small for the number of objects - // they're supporting. There are two algorithms: a slow progression - // for user-defined keys, and a rapid progression for the index key. - // The difference is utilized because the index key (the key used - // internally by each hashlist to provide object-address-to-index - // lookups for fast Remove() calls) responds well to huge hash table - // sizes (because it hashes on addresses, which are evenly - // distributed). User-defined keys don't always use hashing indexes - // that respond so well to additional hashtable size, so they generally - // end up with smaller hash tables (so as not to waste memory). - // The algorithms below cause the following progression (presuming - // the default starting size of 1000 buckets): - // - // Buckets in normal keys: Buckets in index key: - // 1000 (up to 30000 objects) 1000 (up to 23000 objects) - // 3000 (up to 90000 objects) 4600 (up to 105800 objects) - // 9000 (up to 270000 objects) 21160 (up to 486680 objects) - // 27000 (up to 810000 objects) 97336 (up to 2238728 objects) - // -#define MIN_TABLE_SIZE(_cObjects) ((_cObjects) / 30) -#define TARGET_TABLE_SIZE(_cObjects) ((_cObjects) / 10) - -#define MIN_TABLE_SIZE_FOR_KEY(_cObjects) ((_cObjects) / 23) -#define TARGET_TABLE_SIZE_FOR_KEY(_cObjects) ((_cObjects) / 5) - - -/* - * REALLOC ____________________________________________________________________ - * - */ - -#ifdef REALLOC -#undef REALLOC -#endif -#define REALLOC(_a,_c,_r,_i) HashList_ReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL HashList_ReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)GlobalAlloc (GMEM_FIXED, cbElement * cNew)) == NULL) - return FALSE; - - if (*pcTarget == 0) - memset (pNew, 0x00, cbElement * cNew); - else - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - memset (&((char*)pNew)[ cbElement * (*pcTarget) ], 0x00, cbElement * (cNew - *pcTarget)); - GlobalFree ((HGLOBAL)*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} - - -/* - * EXPANDARRAY CLASS __________________________________________________________ - * - */ - -#define cEXPANDARRAYHEAPELEMENTS 1024 -#define cREALLOC_EXPANDARRAYHEAPS 16 - -EXPANDARRAY::EXPANDARRAY (size_t cbElement, size_t cElementsPerHeap) -{ - if ((m_cbElement = cbElement) == 0) - m_cbElement = sizeof(DWORD); - if ((m_cElementsPerHeap = cElementsPerHeap) == 0) - m_cElementsPerHeap = cEXPANDARRAYHEAPELEMENTS; - - m_cHeaps = 0; - m_aHeaps = 0; -} - -EXPANDARRAY::~EXPANDARRAY (void) -{ - if (m_aHeaps) - { - for (size_t ii = 0; ii < m_cHeaps; ++ii) - { - if (m_aHeaps[ ii ]) - GlobalFree ((HGLOBAL)(m_aHeaps[ ii ])); - } - GlobalFree ((HGLOBAL)m_aHeaps); - } -} - -PVOID EXPANDARRAY::GetAt (size_t iElement) -{ - size_t iHeap = iElement / m_cElementsPerHeap; - size_t iIndex = iElement % m_cElementsPerHeap; - if ((iHeap >= m_cHeaps) || (!m_aHeaps[iHeap])) - return NULL; - - PVOID pElement; - pElement = &((PBYTE)m_aHeaps[ iHeap ]->aElements)[ iIndex * m_cbElement ]; - return pElement; -} - -PVOID EXPANDARRAY::SetAt (size_t iElement, PVOID pData) -{ - size_t iHeap = iElement / m_cElementsPerHeap; - size_t iIndex = iElement % m_cElementsPerHeap; - - if (!REALLOC (m_aHeaps, m_cHeaps, 1+iHeap, cREALLOC_EXPANDARRAYHEAPS)) - return NULL; - - if (!m_aHeaps[ iHeap ]) - { - size_t cbHeap = sizeof(EXPANDARRAYHEAP) + (m_cElementsPerHeap * m_cbElement); - if ((m_aHeaps[ iHeap ] = (LPEXPANDARRAYHEAP)GlobalAlloc (GMEM_FIXED, cbHeap)) == NULL) - return NULL; - memset (m_aHeaps[ iHeap ], 0x00, cbHeap); - m_aHeaps[ iHeap ]->aElements = ((PBYTE)m_aHeaps[ iHeap ]) + sizeof(EXPANDARRAYHEAP); - } - - PVOID pElement; - pElement = &((PBYTE)m_aHeaps[ iHeap ]->aElements)[ iIndex * m_cbElement ]; - if (pData) - memcpy (pElement, pData, m_cbElement); - return pElement; -} - - -/* - * HASHLIST CLASS _____________________________________________________________ - * - */ - -#define GetEntry(_pArray,_iEntry) ((LPHASHLISTENTRY)((_pArray)->GetAt(_iEntry))) - -HASHLIST::HASHLIST (void) -{ - InitializeCriticalSection (&m_cs); - m_pcs = &m_cs; - Enter(); - - m_iFirst = iINVALID; - m_iLast = iINVALID; - m_iNextFree = 0; - m_aObjects = new EXPANDARRAY (sizeof(HASHLISTENTRY), cREALLOC_OBJECTS); - m_cObjects = 0; - m_cObjectsMax = 0; - m_apKeys = NULL; - m_cpKeys = 0; - - m_pKeyIndex = new HASHLISTKEY (this, TEXT("Index"), HASHLIST::KeyIndex_CompareObjectData, HASHLIST::KeyIndex_HashObject, HASHLIST::KeyIndex_HashData, cTABLESIZE_DEFAULT); - - Leave(); -} - - -HASHLIST::~HASHLIST (void) -{ - Enter(); - - if (m_apKeys != NULL) - { - for (size_t iKey = 0; iKey < m_cpKeys; ++iKey) - { - if (m_apKeys[ iKey ] != NULL) - delete m_apKeys[ iKey ]; - } - GlobalFree ((HGLOBAL)m_apKeys); - } - - if (m_pKeyIndex) - { - delete m_pKeyIndex; - } - - if (m_aObjects != NULL) - { - delete m_aObjects; - } - - Leave(); - DeleteCriticalSection (&m_cs); -} - - -void HASHLIST::Enter (void) -{ - EnterCriticalSection (m_pcs); -} - - -void HASHLIST::Leave (void) -{ - LeaveCriticalSection (m_pcs); -} - - -void HASHLIST::SetCriticalSection (CRITICAL_SECTION *pcs) -{ - m_pcs = (pcs == NULL) ? &m_cs : pcs; -} - - -BOOL HASHLIST::AddUnique (PVOID pEntryToAdd, LPHASHLISTKEY pKey) -{ - if ( ((pKey == NULL) && (fIsInList (pEntryToAdd))) || - ((pKey != NULL) && (pKey->fIsInList (pEntryToAdd))) ) - { - return TRUE; - } - - return Add (pEntryToAdd); -} - - -BOOL HASHLIST::Add (PVOID pEntryToAdd) -{ - BOOL rc = FALSE; - Enter(); - - if (pEntryToAdd) - { - size_t iObject = m_iNextFree; - - if ((GetEntry(m_aObjects,iObject) && (GetEntry(m_aObjects,iObject)->pObject))) - { - for (iObject = 0; iObject < m_cObjectsMax; ++iObject) - { - if ( (!GetEntry(m_aObjects,iObject)) || (!GetEntry(m_aObjects,iObject)->pObject) ) - break; - } - } - - m_iNextFree = 1+iObject; - - HASHLISTENTRY Entry; - Entry.pObject = pEntryToAdd; - Entry.iNext = iINVALID; - Entry.iPrevious = m_iLast; - m_aObjects->SetAt (iObject, &Entry); - - if (m_iLast != iINVALID) - { - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_aObjects,m_iLast)) != NULL) - pEntry->iNext = iObject; - } - - m_iLast = iObject; - if (m_iFirst == iINVALID) - m_iFirst = iObject; - - m_pKeyIndex->Add (iObject, (PVOID)(iObject+1)); - - for (size_t iKey = 0; iKey < m_cpKeys; ++iKey) - { - if (m_apKeys[ iKey ] == NULL) - continue; - m_apKeys[ iKey ]->Add (iObject, pEntryToAdd); - } - - ++m_cObjects; - m_cObjectsMax = max (m_cObjectsMax, m_cObjects); - rc = TRUE; - } - - Leave(); - return rc; -} - - -void HASHLIST::Remove (PVOID pEntryToRemove) -{ - Enter(); - - if (pEntryToRemove) - { - // The first step is to find which m_aObjects entry corresponds - // with this object. Ordinarily that'd be a brute-force search; - // however, to speed things up, we have a special key placed on - // the address of the object for determining its index. It lets - // us replace this code: - // - // for (size_t iObject = 0; iObject < m_cObjectsMax; ++iObject) - // { - // if (m_aObjects[ iObject ].pObject == pEntryToRemove) - // break; - // } - // - // Because this index key uses a hashtable that's resized very - // aggressively, performance tests of up to 100,000 objects - // indicate that removing an object now clocks in as O(1), rather - // than the O(N) that it would be if we used the brute-force approach. - // At 100,000 objects it does use up some 70k of memory, but wow - // is it fast... - // - size_t iObject = iINVALID; - - PVOID pFind; - if ((pFind = m_pKeyIndex->GetFirstObject (pEntryToRemove)) != NULL) - iObject = *(size_t *)&pFind -1; - - // Now remove the object. - // - if (iObject != iINVALID) - { - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_aObjects,iObject)) != NULL) - { - pEntry->pObject = NULL; - - if (pEntry->iPrevious != iINVALID) - { - LPHASHLISTENTRY pPrevious; - if ((pPrevious = GetEntry(m_aObjects,pEntry->iPrevious)) != NULL) - pPrevious->iNext = pEntry->iNext; - } - if (pEntry->iNext != iINVALID) - { - LPHASHLISTENTRY pNext; - if ((pNext = GetEntry(m_aObjects,pEntry->iNext)) != NULL) - pNext->iPrevious = pEntry->iPrevious; - } - - if (m_iLast == iObject) - m_iLast = pEntry->iPrevious; - if (m_iFirst == iObject) - m_iFirst = pEntry->iNext; - - for (size_t iKey = 0; iKey < m_cpKeys; ++iKey) - { - if (m_apKeys[ iKey ] == NULL) - continue; - m_apKeys[ iKey ]->Remove (iObject); - } - - m_pKeyIndex->Remove (iObject); - --m_cObjects; - } - } - } - - Leave(); -} - - -BOOL HASHLIST::Update (PVOID pEntryToUpdate) -{ - BOOL rc = TRUE; - Enter(); - - PVOID pFind; - if ((pFind = m_pKeyIndex->GetFirstObject (pEntryToUpdate)) == NULL) - rc = FALSE; - else - { - size_t iObject = *(size_t *)&pFind -1; - - for (size_t iKey = 0; iKey < m_cpKeys; ++iKey) - { - if (m_apKeys[ iKey ] == NULL) - continue; - - m_apKeys[ iKey ]->Remove (iObject); - m_apKeys[ iKey ]->Add (iObject, pEntryToUpdate); - } - } - - Leave(); - return rc; -} - - -BOOL HASHLIST::fIsInList (PVOID pEntry) -{ - PVOID pFind; - if ((pFind = m_pKeyIndex->GetFirstObject (pEntry)) == NULL) - return FALSE; - return TRUE; -} - - -LPHASHLISTKEY HASHLIST::CreateKey (LPCTSTR pszKeyName, LPHASHFUNC_COMPAREOBJECTDATA fnCompareObjectData, LPHASHFUNC_HASHOBJECT fnHashObject, LPHASHFUNC_HASHDATA fnHashData, size_t cTableSize) -{ - LPHASHLISTKEY pKey = NULL; - Enter(); - - for (size_t iKey = 0; iKey < m_cpKeys; ++iKey) - { - if (m_apKeys[ iKey ] == NULL) - break; - } - if (REALLOC (m_apKeys, m_cpKeys, 1+iKey, cREALLOC_KEYS)) - { - m_apKeys[ iKey ] = new HASHLISTKEY (this, pszKeyName, fnCompareObjectData, fnHashObject, fnHashData, cTableSize); - pKey = m_apKeys[ iKey ]; - - if (MIN_TABLE_SIZE(m_cObjectsMax) > pKey->m_cBuckets) - { - pKey->Resize(); - } - else for (size_t iObject = 0; iObject < m_cObjectsMax; ++iObject) - { - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_aObjects,iObject)) == NULL) - continue; - if (pEntry->pObject != NULL) - m_apKeys[ iKey ]->Add (iObject, pEntry->pObject); - } - } - - Leave(); - return pKey; -} - - -LPHASHLISTKEY HASHLIST::FindKey (LPCTSTR pszKeyName) -{ - LPHASHLISTKEY pKey = NULL; - Enter(); - - for (size_t iKey = 0; !pKey && (iKey < m_cpKeys); ++iKey) - { - if (m_apKeys[ iKey ] == NULL) - continue; - if (!lstrcmpi (m_apKeys[ iKey ]->m_szKeyName, pszKeyName)) - pKey = m_apKeys[ iKey ]; - } - - Leave(); - return pKey; -} - - -void HASHLIST::RemoveKey (LPHASHLISTKEY pKey) -{ - Enter(); - - for (size_t iKey = 0; iKey < m_cpKeys; ++iKey) - { - if (m_apKeys[ iKey ] == pKey) - { - delete m_apKeys[ iKey ]; - m_apKeys[ iKey ] = NULL; - break; - } - } - - Leave(); -} - - -LPENUM HASHLIST::FindFirst (void) -{ - LPENUM pEnum = NULL; - Enter(); - - if (m_iFirst != iINVALID) - pEnum = New2 (ENUMERATION,(this, m_iFirst)); - - Leave(); - return pEnum; -} - - -LPENUM HASHLIST::FindLast (void) -{ - LPENUM pEnum = NULL; - Enter(); - - if (m_iLast != iINVALID) - pEnum = New2 (ENUMERATION,(this, m_iLast)); - - Leave(); - return pEnum; -} - - -PVOID HASHLIST::GetFirstObject (void) -{ - PVOID pObject = NULL; - Enter(); - - if (m_iFirst != iINVALID) - pObject = GetEntry(m_aObjects,m_iFirst)->pObject; - - Leave(); - return pObject; -} - - -PVOID HASHLIST::GetLastObject (void) -{ - PVOID pObject = NULL; - Enter(); - - if (m_iLast != iINVALID) - pObject = GetEntry(m_aObjects,m_iLast)->pObject; - - Leave(); - return pObject; -} - - -size_t HASHLIST::GetCount (void) -{ - return m_cObjects; -} - - -BOOL CALLBACK HASHLIST::KeyIndex_CompareObjectData (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - size_t iIndex = (size_t)pObject -1; - LPHASHLIST pList = pKey->GetHashList(); - return (GetEntry(pList->m_aObjects,iIndex)->pObject == pData) ? TRUE : FALSE; -} - - -HASHVALUE CALLBACK HASHLIST::KeyIndex_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - size_t iIndex = (size_t)pObject -1; - LPHASHLIST pList = pKey->GetHashList(); - return KeyIndex_HashData (pKey, GetEntry(pList->m_aObjects,iIndex)->pObject); -} - - -HASHVALUE CALLBACK HASHLIST::KeyIndex_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return ((DWORD)pData) >> 4; // The "data" is the object's address. -} - - -/* - * HASHLISTKEY CLASS _____________________________________________________________ - * - */ - -HASHLISTKEY::HASHLISTKEY (LPHASHLIST pList, LPCTSTR pszKeyName, LPHASHFUNC_COMPAREOBJECTDATA fnCompareObjectData, LPHASHFUNC_HASHOBJECT fnHashObject, LPHASHFUNC_HASHDATA fnHashData, size_t cTableSize) -{ - m_aObjects = new EXPANDARRAY (sizeof(HASHLISTENTRY), cREALLOC_OBJECTS); - - m_cBuckets = (cTableSize == 0) ? cTABLESIZE_DEFAULT : cTableSize; - m_aBuckets = (struct HASHBUCKET *)GlobalAlloc (GMEM_FIXED, m_cBuckets * sizeof(struct HASHBUCKET)); - for (size_t iBucket = 0; iBucket < m_cBuckets; ++iBucket) - { - m_aBuckets[ iBucket ].iFirst = iINVALID; - m_aBuckets[ iBucket ].iLast = iINVALID; - } - - m_pList = pList; - lstrcpy (m_szKeyName, pszKeyName); - m_fnCompareObjectData = fnCompareObjectData; - m_fnHashObject = fnHashObject; - m_fnHashData = fnHashData; -} - - -HASHLISTKEY::~HASHLISTKEY (void) -{ - m_pList->Enter(); - - for (size_t iObject = 0; iObject < m_pList->m_cObjectsMax; ++iObject) - { - if (!GetEntry(m_aObjects,iObject)) - continue; - if (!GetEntry(m_aObjects,iObject)->pObject) - continue; - Remove (iObject); - } - - if (m_aObjects) - delete m_aObjects; - if (m_aBuckets) - GlobalFree ((HGLOBAL)m_aBuckets); - - m_pList->Leave(); -} - - -LPHASHLIST HASHLISTKEY::GetHashList (void) -{ - return m_pList; -} - - -BOOL HASHLISTKEY::CompareObjectData (PVOID pObject, PVOID pData) -{ - return (*m_fnCompareObjectData)(this, pObject, pData); -} - -HASHVALUE HASHLISTKEY::HashObject (PVOID pObject) -{ - return ((*m_fnHashObject)(this, pObject)) % m_cBuckets; -} - -HASHVALUE HASHLISTKEY::HashData (PVOID pData) -{ - return ((*m_fnHashData)(this, pData)) % m_cBuckets; -} - - -LPENUM HASHLISTKEY::FindFirst (PVOID pData) -{ - LPENUM pEnum = NULL; - m_pList->Enter(); - - HASHVALUE hvSearch = HashData (pData); - - size_t iObject; - if ((iObject = m_aBuckets[ hvSearch ].iFirst) != iINVALID) - { - LPHASHLISTENTRY pEntry; - do { - if ((pEntry = GetEntry(m_aObjects,iObject)) == NULL) - break; - if (CompareObjectData (pEntry->pObject, pData)) - { - pEnum = New2 (ENUMERATION,(m_pList, iObject, this, pData)); - break; - } - } while ((iObject = pEntry->iNext) != iINVALID); - } - - m_pList->Leave(); - return pEnum; -} - - -LPENUM HASHLISTKEY::FindLast (PVOID pData) -{ - LPENUM pEnum = NULL; - m_pList->Enter(); - - HASHVALUE hvSearch = HashData (pData); - - size_t iObject; - if ((iObject = m_aBuckets[ hvSearch ].iLast) != iINVALID) - { - LPHASHLISTENTRY pEntry; - do { - if ((pEntry = GetEntry(m_aObjects,iObject)) == NULL) - break; - if (CompareObjectData (pEntry->pObject, pData)) - { - pEnum = New2 (ENUMERATION,(m_pList, iObject, this, pData)); - break; - } - } while ((iObject = pEntry->iPrevious) != iINVALID); - } - - m_pList->Leave(); - return pEnum; -} - - -PVOID HASHLISTKEY::GetFirstObject (PVOID pData) -{ - PVOID pObject = NULL; - m_pList->Enter(); - - HASHVALUE hvSearch = HashData (pData); - - size_t iObject; - if ((iObject = m_aBuckets[ hvSearch ].iFirst) != iINVALID) - { - LPHASHLISTENTRY pEntry; - do { - if ((pEntry = GetEntry(m_aObjects,iObject)) == NULL) - break; - if (CompareObjectData (pEntry->pObject, pData)) - { - pObject = pEntry->pObject; - break; - } - } while ((iObject = pEntry->iNext) != iINVALID); - } - - m_pList->Leave(); - return pObject; -} - - -PVOID HASHLISTKEY::GetLastObject (PVOID pData) -{ - PVOID pObject = NULL; - m_pList->Enter(); - - HASHVALUE hvSearch = HashData (pData); - - size_t iObject; - if ((iObject = m_aBuckets[ hvSearch ].iLast) != iINVALID) - { - LPHASHLISTENTRY pEntry; - do { - if ((pEntry = GetEntry(m_aObjects,iObject)) == NULL) - break; - if (CompareObjectData (pEntry->pObject, pData)) - { - pObject = pEntry->pObject; - break; - } - } while ((iObject = pEntry->iPrevious) != iINVALID); - } - - m_pList->Leave(); - return pObject; -} - - -BOOL HASHLISTKEY::fIsInList (PVOID pEntry) -{ - PVOID pFind; - if ((pFind = GetFirstObject (pEntry)) == NULL) - return FALSE; - return TRUE; -} - - -void HASHLISTKEY::Add (size_t iObject, PVOID pObject) -{ - m_pList->Enter(); - - if ( ((this == m_pList->m_pKeyIndex) && (MIN_TABLE_SIZE_FOR_KEY(m_pList->m_cObjectsMax) > m_cBuckets)) || - ((this != m_pList->m_pKeyIndex) && (MIN_TABLE_SIZE(m_pList->m_cObjectsMax) > m_cBuckets)) ) - { - Resize(); - } - else - { - HASHVALUE hv = HashObject (pObject); - struct HASHBUCKET *pBucket = &m_aBuckets[ hv ]; - - HASHLISTENTRY Entry; - Entry.pObject = pObject; - Entry.hv = hv; - Entry.iNext = iINVALID; - Entry.iPrevious = pBucket->iLast; - m_aObjects->SetAt (iObject, &Entry); - - pBucket->iLast = iObject; - - if (Entry.iPrevious != iINVALID) - { - LPHASHLISTENTRY pPrevious; - if ((pPrevious = GetEntry(m_aObjects,Entry.iPrevious)) != NULL) - pPrevious->iNext = iObject; - } - - if (pBucket->iFirst == iINVALID) - pBucket->iFirst = iObject; - } - - m_pList->Leave(); -} - - -void HASHLISTKEY::Remove (size_t iObject) -{ - m_pList->Enter(); - - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_aObjects,iObject)) != NULL) - { - pEntry->pObject = NULL; - - if (pEntry->iPrevious != iINVALID) - { - LPHASHLISTENTRY pPrevious; - if ((pPrevious = GetEntry(m_aObjects,pEntry->iPrevious)) != NULL) - pPrevious->iNext = pEntry->iNext; - } - - if (pEntry->iNext != iINVALID) - { - LPHASHLISTENTRY pNext; - if ((pNext = GetEntry(m_aObjects,pEntry->iNext)) != NULL) - pNext->iPrevious = pEntry->iPrevious; - } - - if (m_aBuckets[ pEntry->hv ].iLast == iObject) - m_aBuckets[ pEntry->hv ].iLast = pEntry->iPrevious; - if (m_aBuckets[ pEntry->hv ].iFirst == iObject) - m_aBuckets[ pEntry->hv ].iFirst = pEntry->iNext; - } - - m_pList->Leave(); -} - - -void HASHLISTKEY::Resize (void) -{ - if (this == m_pList->m_pKeyIndex) - { - REALLOC (m_aBuckets, m_cBuckets, TARGET_TABLE_SIZE_FOR_KEY(m_pList->m_cObjectsMax), 1); - } - else - { - REALLOC (m_aBuckets, m_cBuckets, TARGET_TABLE_SIZE(m_pList->m_cObjectsMax), 1); - } - - for (size_t iBucket = 0; iBucket < m_cBuckets; ++iBucket) - { - m_aBuckets[ iBucket ].iFirst = iINVALID; - m_aBuckets[ iBucket ].iLast = iINVALID; - } - - for (size_t iObject = 0; ; ++iObject) - { - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_aObjects,iObject)) == NULL) - break; - pEntry->pObject = NULL; - } - - // Re-add the objects to this key. One caveat: if this is the - // hashlist's index key, then the format of the items is different-- - // retain that difference. - // - if (this == m_pList->m_pKeyIndex) - { - for (iObject = 0; ; ++iObject) - { - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_pList->m_aObjects,iObject)) == NULL) - break; - if (pEntry->pObject != NULL) - Add (iObject, (PVOID)(iObject+1)); - } - } - else // normal, user-defined key - { - for (iObject = 0; ; ++iObject) - { - LPHASHLISTENTRY pEntry; - if ((pEntry = GetEntry(m_pList->m_aObjects,iObject)) == NULL) - break; - if (pEntry->pObject != NULL) - Add (iObject, pEntry->pObject); - } - } -} - - -LPHASHLISTKEYDEBUGINFO HASHLISTKEY::GetDebugInfo (void) -{ - m_pList->Enter(); - - LPHASHLISTKEYDEBUGINFO pInfo = new HASHLISTKEYDEBUGINFO; - memset (pInfo, 0x00, sizeof(HASHLISTKEYDEBUGINFO)); - - // Find out how full each bucket is. - // - REALLOC (pInfo->aBuckets, pInfo->cBuckets, m_cBuckets, 1); - - for (size_t iBucket = 0; iBucket < pInfo->cBuckets; ++iBucket) - { - for (size_t iObject = m_aBuckets[ iBucket ].iFirst; - iObject != iINVALID; - iObject = GetEntry(m_aObjects,iObject)->iNext) - { - (pInfo->aBuckets[ iBucket ])++; - } - } - - // Calculate a "percent effectiveness". This is a pretty fuzzy - // calculation; we want 100% if all buckets are the same size - // (plus or minus one element), and 0% if all buckets except one are - // empty but that one bucket has more than cBuckets elements. In - // between, we'll try to create a roughly linear gradient. The - // calculation is effectively the proportion of the number of - // objects which are evenly distributed to the number of objects - // overall. - // - if (pInfo->cBuckets == 0) - { - pInfo->perEffective = 100; - } - else - { - // We want an accurate count of objects, not the over-allocated - // count given by m_cObjectsMax. - // - size_t cObjects = 0; - for (iBucket = 0; iBucket < pInfo->cBuckets; ++iBucket) - cObjects += pInfo->aBuckets[ iBucket ]; - - if (cObjects == 0) - { - pInfo->perEffective = 100; - } - else - { - // Determine what "even distribution" means--that's pretty easy. - // We increase the count by one to indicate that slight unevenness - // will occur unless the number of objects is a multiple of the - // number of buckets. - // - size_t cPerfectLength = (cObjects / pInfo->cBuckets) + 1; - - size_t cObjectsInPlace = 0; - for (iBucket = 0; iBucket < pInfo->cBuckets; ++iBucket) - cObjectsInPlace += min( pInfo->aBuckets[ iBucket ], cPerfectLength ); - - // Now calculating that percent effectiveness is easy. If everything - // is evenly distributed, cObjectsInPlace will == cObjects--and - // we want to call it 100%. If eveything is on one chain, then - // cObjectsInPlace will be really small compared to cObjects. - // - pInfo->perEffective = (WORD)(cObjectsInPlace * 100 / cObjects); - } - } - - m_pList->Leave(); - return pInfo; -} - - -void HASHLISTKEY::FreeDebugInfo (LPHASHLISTKEYDEBUGINFO pInfo) -{ - if (pInfo->aBuckets) - GlobalFree ((HGLOBAL)(pInfo->aBuckets)); -} - - -/* - * ENUMERATION CLASS _____________________________________________________________ - * - */ - -ENUMERATION::ENUMERATION (LPHASHLIST pList, size_t iObject, LPHASHLISTKEY pKey, PVOID pData) -{ - m_pList = pList; - m_pKey = pKey; - m_pData = pData; - m_iObject = iObject; - - PrepareWalk(); // finds m_iPrevious and m_iNext - - m_pList->Enter(); -} - - -ENUMERATION::~ENUMERATION (void) -{ - m_pList->Leave(); -} - - -PVOID ENUMERATION::GetObject (void) -{ - return GetEntry(m_pList->m_aObjects,m_iObject)->pObject; -} - - -LPENUMERATION ENUMERATION::FindNext (void) -{ - for (;;) - { - m_iObject = m_iNext; - PrepareWalk(); - - if (m_iObject == iINVALID) - break; - - if (m_pKey == NULL) - return this; - - if (m_pKey->CompareObjectData (GetEntry(m_pList->m_aObjects,m_iObject)->pObject, m_pData)) - return this; - } - - Delete (this); - return NULL; -} - - -LPENUMERATION ENUMERATION::FindPrevious (void) -{ - for (;;) - { - m_iObject = m_iPrevious; - PrepareWalk(); - - if (m_iObject == iINVALID) - break; - - if (m_pKey == NULL) - return this; - - if (m_pKey->CompareObjectData (GetEntry(m_pList->m_aObjects,m_iObject)->pObject, m_pData)) - return this; - } - - Delete (this); - return NULL; -} - - -void ENUMERATION::PrepareWalk (void) -{ - if (m_iObject == iINVALID) - { - m_iPrevious = iINVALID; - m_iNext = iINVALID; - } - else if (m_pKey == NULL) - { - m_iPrevious = GetEntry(m_pList->m_aObjects,m_iObject)->iPrevious; - m_iNext = GetEntry(m_pList->m_aObjects,m_iObject)->iNext; - } - else - { - m_iPrevious = GetEntry(m_pKey->m_aObjects,m_iObject)->iPrevious; - m_iNext = GetEntry(m_pKey->m_aObjects,m_iObject)->iNext; - } -} - - -/* - * GENERAL-PURPOSE ____________________________________________________________ - * - */ - -HASHVALUE HashString (LPCTSTR pszString) -{ -#ifdef UNICODE - return HashUnicodeString (pszString); -#else - return HashAnsiString (pszString); -#endif -} - -HASHVALUE HashAnsiString (LPCSTR pszStringA) -{ - HASHVALUE hv = 0; - - for (size_t cch = lstrlenA(pszStringA); cch >= 4; pszStringA += 4, cch -= 4) - hv += *(DWORD *)pszStringA; - - for (; cch; pszStringA++, cch--) - hv += *pszStringA; - - return hv; -} - -HASHVALUE HashUnicodeString (LPWSTR pszStringW) -{ - HASHVALUE hv = 0; - - for (size_t cch = lstrlenW(pszStringW); cch >= 2; pszStringW += 2, cch -= 2) - { - hv += *(DWORD *)pszStringW; // since HIBYTE(*psz) is usually zero, - hv = (hv >> 24) | (hv << 8); // rotate {hv} high-ward by 8 bits - } - - for (; cch; pszStringW++, cch--) - hv += *pszStringW; - - return hv; -} - diff --git a/src/WINNT/afsapplib/hashlist.h b/src/WINNT/afsapplib/hashlist.h deleted file mode 100644 index 8e7797836..000000000 --- a/src/WINNT/afsapplib/hashlist.h +++ /dev/null @@ -1,521 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * HashList - super-quick list manager - * - */ - -#ifndef HASHLIST_H -#define HASHLIST_H - -#ifndef EXPORTED -#define EXPORTED -#endif - - -/* - * A HASHLIST effectively implements an in-memory database: it maintains - * the objects you specify in a managed list, placing hashtables across - * whatever key fields you select. The practical upshot is that it's a - * thread-safe, convenient resizable-array manager that provides fast - * searching features. - * - * There are many tidbits about using HashLists mentioned in the examples - * below--some are pretty important, so read through them carefully. - * - * EXAMPLES ___________________________________________________________________ - * - * // Some boring example dataset--three OBJECT structures - * - * typedef struct OBJECT { - * DWORD dwKey; - * TCHAR szText[ 256 ]; - * } OBJECT; - * - * static OBJECT aObjects[] = { - * { 275, "First Object" }, - * { 473, "Second Object" }, - * { 32, "Third Object" }, - * }; - * - * // When adding data to the list, note that it's not necessary to create - * // keys at any particular time (or at all). Objects already in the list - * // when you add a new key will automatically get indexed, just as will any - * // new objects that you add later. Remember that you can't track NULL - * // objects in the list--hl.Add(0) is illegal. An object can be added in - * // the list any number of times. - * - * HASHLIST hl; - * hl.Add (&aObjects[0]); - * hl.CreateKey ("MyKey", MyKey_Compare, MyKey_HashObject, MyKey_HashData); - * hl.Add (&aObjects[1]); - * hl.Add (&aObjects[2]); - * - * // Walk the hashlist. There are a few things worthy of note here - * // besides the enumeration technique itself: calling FindFirst() returns - * // a pointer to an *allocated* ENUMERATION structure. The structure - * // is automatically freed whenever a FindNext() or FindPrevious() is - * // about to return NULL--so loops like the one below don't have to - * // do anything to free the ENUMERATION object. Since a hashlist holds - * // a critical section while any ENUMERATION object exists for it, - * // it's important to remember that if you do not walk the list to its end - * // you must explicitly free the enumeration object yourself. - * - * for (LPENUM pEnum = hl.FindFirst(); pEnum; pEnum = pEnum->FindNext()) - * { - * OBJECT *pObj = (OBJECT*)(pEnum->GetObject()); - * printf ("%s", pObj->szText); - * } - * - * // Find the first object with 473 as its dwKey element. Note that since - * // we're not walking the whole list, we have to free the ENUMERATION object - * // when we're done. - * - * HASHLISTKEY pKey = hl.FindKey ("MyKey"); - * DWORD dwKeyFind = 473; - * - * LPENUM pEnum; - * if ((pEnum = pKey->FindFirst (&dwKeyFind)) != NULL) - * { - * OBJECT *pObj = (OBJECT*)(pEnum->GetObject()); - * printf ("%s", pObj->szText); - * delete pEnum; - * } - * - * // A shorter way to get just the first object with 473 as a dwKey element. - * // Since it doesn't return an ENUMERATION object, you don't have to free - * // anything. - * - * OBJECT *pObj = (OBJECT*)pKey->GetFirstObject (&dwKeyFind); - * - * // Find all objects with 473 as a dwKey element. Since we're walking the - * // whole list, the ENUMERATION object will be deleted automatically. - * - * for (LPENUM pEnum = pKey->FindFirst (&dwKeyFind); pEnum; pEnum = pEnum->FindNext()) - * { - * OBJECT *pObj = (OBJECT*)(pEnum->GetObject()); - * printf ("%s", pObj->szText); - * } - * - * // HashLists also provide fast (i.e., effectively constant-time) testing - * // to see if an object is already in the list; that allows use of the - * // AddUnique() item, which ensures duplicates won't occur. - * - * HASHLIST hl; - * hl.AddUnique (&aObjects[0]); - * hl.AddUnique (&aObjects[0]); // succeeds but doesn't add item - * hl.Remove (&aObjects[0]); // list is now empty - * - * HASHLIST hl; - * HASHLISTKEY pKey = hl.CreateKey ("IntKey", IntKey_Compare, IntKey_HashObject, IntKey_HashData); - * int a = 153; - * int b = 287; - * int c = 153; - * hl.AddUnique (&a, pKey); - * hl.AddUnique (&b, pKey); - * hl.AddUnique (&c, pKey); - * // The list now contains two items: {&a} and {&b}. - * // Because {&c} was not unique over key {pKey}, it was not added. - * - * // Remove the first object with a dwKey of 473 from the list. Since we're - * // starting an enumeration but not walking it to its end, we'll have - * // to free the ENUMERATION object explicitly. - * - * LPENUM pEnum; - * if ((pEnum = pKey->FindFirst (&dwKeyFind)) != NULL) - * { - * hl.Remove (pEnum->GetObject()); - * delete pEnum; - * } - * - * // Remove all objects in the list--technique one. This technique emphasises - * // an useful bit of data: if you remove the object that your ENUMERATION - * // object represents, you can still use that enumeration object to continue - * // the enumeration! For the fun of it, we'll show erasing the list both - * // forwards and backwards. - * - * for (LPENUM pEnum = hl.FindFirst(); pEnum; pEnum = pEnum->FindNext()) { - * hl.Remove (pEnum->GetObject()); - * } - * - * for (LPENUM pEnum = hl.FindLast(); pEnum; pEnum = pEnum->FindPrevious()) { - * hl.Remove (pEnum->GetObject()); - * } - * - * // Remove all objects--technique two. This technique is a little messier: - * // it finds the first object in the list, removes it, and re-starts the - * // enumeration. Since an enumeration is started but not walked to its end, - * // the ENUMERATION object must be freed explicitly in each iteration. - * - * LPENUM pEnum; - * while ((pEnum = hl.FindFirst()) != NULL) { - * hl.Remove (pEnum->GetObject()); - * delete pEnum; - * } - * - * // Remove all objects--technique three. This is essentially the same - * // as technique two (find the first object, remove it, repeat), except - * // that it avoids using an ENUMERATION object so there's nothing to free. - * - * OBJECT *pObject; - * while ((pObject = hl.GetFirstObject()) != NULL) - * hl.Remove (pObject); - * - * // If you change something in an object that you think would affect one or - * // more of the list's keys, you should call tell the HashList so it - * // can update itself. An important note: if you're enumerating all items, - * // you can call Update() for any item without affecting the enumeration; - * // however, if you're enumerating along a key when you call Update(), - * // you'll need to stop the enumeration. - * - * aObjects[2].dwKey = 182; - * hl.Update (&aObjects[2]); // (same as hl.Remove(...) + hl.Add(...)) - * - * // It's important to remember that the HashList only knows about your - * // objects as generic pointers--it doesn't free them if you remove - * // them from the list. - * - * OBJECT *pObject = new OBJECT; - * hl.Add (pObject); - * hl.Remove (pObject); - * delete pObject; - * - * // Another point about freeing objects that you have in the list: - * // it's safe to delete the object even before you remove it from the - * // list, but if you do so, make sure you remove the object immediately. - * // Also, to be thread-safe, you should surround the section with - * // Enter()/Leave(); otherwise, another thread may wake up and try to - * // work with the list between when you free the object and when you - * // remove it from the list. - * - * OBJECT *pObject = new OBJECT; - * hl.Add (pObject); - * hl.Enter(); - * delete pObject; - * hl.Remove (pObject); - * hl.Leave(); - * - * // Each key requires that you supply three callback functions: - * // one to extract the key from an Object and hash it, one to - * // just hash a key directly, and one to check an object to see - * // if it matches the specified key exactly. A HASHVALUE is really - * // just a DWORD--don't worry about the range (since the hashlist - * // will automatically modulo the return by the size of its table). - * - * HASHVALUE CALLBACK MyKey_HashObject (LPHASHLISTKEY pKey, PVOID pObject) { - * return MyKey_HashData (pKey, &((OBJECT*)pObject)->dwKey); - * } - * - * HASHVALUE CALLBACK MyKey_HashData (LPHASHLISTKEY pKey, PVOID pData) { - * return (HASHVALUE)*(DWORD*)pData; - * } - * - * BOOL CALLBACK MyKey_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) { - * return (((OBJECT*)pObject)->dwKey == *(DWORD*)pData; - * } - * - */ - -#define cTABLESIZE_DEFAULT 1000 - -typedef class EXPORTED EXPANDARRAY EXPANDARRAY, *LPEXPANDARRAY; -typedef class EXPORTED HASHLIST HASHLIST, *LPHASHLIST; -typedef class EXPORTED HASHLISTKEY HASHLISTKEY, *LPHASHLISTKEY; -typedef class EXPORTED ENUMERATION ENUMERATION, ENUM, *LPENUMERATION, *LPENUM; - -typedef DWORD HASHVALUE; -typedef BOOL (CALLBACK * LPHASHFUNC_COMPAREOBJECTDATA)(LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); -typedef HASHVALUE (CALLBACK * LPHASHFUNC_HASHOBJECT)(LPHASHLISTKEY pKey, PVOID pObject); -typedef HASHVALUE (CALLBACK * LPHASHFUNC_HASHDATA)(LPHASHLISTKEY pKey, PVOID pData); - -typedef struct HASHLISTENTRY - { - PVOID pObject; - HASHVALUE hv; - size_t iPrevious; - size_t iNext; - } HASHLISTENTRY, *LPHASHLISTENTRY; - -typedef struct HASHLISTKEYDEBUGINFO - { - size_t cBuckets; // number of buckets in the hashtable currently - size_t *aBuckets; // number of items in each bucket in the hashtable - WORD perEffective; // percent effectiveness of hashtable (100%=even distrib) - } HASHLISTKEYDEBUGINFO, *LPHASHLISTKEYDEBUGINFO; - - -/* - * EXPANDARRAY CLASS __________________________________________________________ - * - */ - -typedef struct - { - PVOID aElements; // = EXPANDARRAYHEAP.aElements + 4; - // Followed by allocated space for aElements - } EXPANDARRAYHEAP, *LPEXPANDARRAYHEAP; - -class EXPORTED EXPANDARRAY - { - public: - EXPANDARRAY (size_t cbElement, size_t cElementsPerHeap = 0); - ~EXPANDARRAY (void); - - PVOID GetAt (size_t iElement); - PVOID SetAt (size_t iElement, PVOID pData = NULL); - - private: - size_t m_cbElement; - size_t m_cElementsPerHeap; - - size_t m_cHeaps; - LPEXPANDARRAYHEAP *m_aHeaps; - }; - - -/* - * HASHLIST CLASS _____________________________________________________________ - * - */ - -class EXPORTED HASHLIST - { - friend class HASHLISTKEY; - friend class ENUMERATION; - - public: - HASHLIST (void); - ~HASHLIST (void); - - // A HashList is basically just a resizable array of objects. - // As such, the class exposes methods for adding objects to, - // and removing objects from, the list. - // - BOOL Add (PVOID pObjectToAdd); - void Remove (PVOID pObjectToRemove); - BOOL Update (PVOID pObjectToUpdate); // like Remove() followed by Add() - - // Calling AddUnique() instead of Add() to add an item ensures - // that the specified item will only be added if it does not - // already exist in the list. If a key is also specified during the - // AddUnique() call, then the test will be performed over a specific - // key--detecting duplicate items by checking the key's indexed fields, - // rather than just comparing item's addresses. - // - BOOL AddUnique (PVOID pObjectToAdd, LPHASHLISTKEY pKeyUnique = NULL); - BOOL fIsInList (PVOID pObject); - - // Each HashList can use one or more "keys" for looking up items; - // each key represents with an internally-maintained hash table - // and corresponding hashing functions (which you supply when you - // create a key). Keys can be added or removed at any time. - // - LPHASHLISTKEY CreateKey (LPCTSTR pszKeyName, - LPHASHFUNC_COMPAREOBJECTDATA fnCompareObjectData, - LPHASHFUNC_HASHOBJECT fnHashObject, - LPHASHFUNC_HASHDATA fnHashData, - size_t cInitialTableSize = cTABLESIZE_DEFAULT); - LPHASHLISTKEY FindKey (LPCTSTR pszKeyName); - void RemoveKey (LPHASHLISTKEY pKey); - - // A list isn't much good without methods for enumeration. - // A HashList provides enumeration in the form of a list - // rather than an array (to prevent problems with holes when - // items are removed). You can walk the list in either direction. - // An important note: a HashList does not guarantee the order - // of enumeration will match the order of insertion (and, in fact, - // it probably won't). - // - // Alternately, you can initiate the walk from a HASHLISTKEY; - // doing so allows you to quickly enumerate only items which match a - // particular value on that key, improving search performance. - // - LPENUM FindFirst (void); - LPENUM FindLast (void); - PVOID GetFirstObject (void); - PVOID GetLastObject (void); - - // It's also possible to quickly determine the number of objects - // in the list, without enumerating them all. - // - size_t GetCount (void); - - // All HASHLIST routines are thread-safe, but you can wrap compound - // operations using the same critical section as the HASHLIST uses - // internally. You can also specify an alternate critical section - // for the HASHLIST to use instead. - // - void Enter (void); - void Leave (void); - void SetCriticalSection (CRITICAL_SECTION *pcs); // NULL = use internal - - private: - size_t m_iFirst; - size_t m_iLast; - size_t m_iNextFree; - - LPEXPANDARRAY m_aObjects; - size_t m_cObjects; - size_t m_cObjectsMax; - - LPHASHLISTKEY *m_apKeys; - size_t m_cpKeys; - - LPHASHLISTKEY m_pKeyIndex; - static BOOL CALLBACK KeyIndex_CompareObjectData (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK KeyIndex_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK KeyIndex_HashData (LPHASHLISTKEY pKey, PVOID pData); - - CRITICAL_SECTION m_cs; - CRITICAL_SECTION *m_pcs; - }; - - -/* - * HASHLISTKEY CLASS _____________________________________________________________ - * - */ - -class EXPORTED HASHLISTKEY - { - friend class HASHLIST; - friend class ENUMERATION; - - public: - - // Since every HASHLISTKEY is a member of exactly one HASHLIST, - // it contains a pointer back to that HASHLIST. You can get that - // pointer, to determine which list the key is used in. - // - LPHASHLIST GetHashList (void); - - // Each HASHLISTKEY contains an internal (hidden) hashtable, - // and pointers to the functions which you supplied to hash objects - // for inclusion in that table. For convenience, it exposes methods - // for calling those functions. - // - BOOL CompareObjectData (PVOID pObject, PVOID pData); - HASHVALUE HashObject (PVOID pObject); - HASHVALUE HashData (PVOID pData); - - // Instead of initiating an enumeration through the HASHLIST, you may - // initiate an enumeration through a HASHLISTKEY. Doing so indicates - // that you only want to enumerate items whose keys match a particular - // value; the HASHLISTKEY's internal hashtable is employed to speed the - // search up. - // - LPENUM FindFirst (PVOID pData); - LPENUM FindLast (PVOID pData); - PVOID GetFirstObject (PVOID pData); - PVOID GetLastObject (PVOID pData); - - BOOL fIsInList (PVOID pObject); // Equivalent to (!!GetFirstObject()) - - // For debugging purposes, when developing your hashing algorithms - // you may want to use the following routines to examine the distribution - // of data within the key. They enable you to see how many items are - // on each bucket within the hash table; other statistics are available. - // - LPHASHLISTKEYDEBUGINFO GetDebugInfo (void); - void FreeDebugInfo (LPHASHLISTKEYDEBUGINFO pInfo); - - private: - HASHLISTKEY (LPHASHLIST pList, LPCTSTR pszKeyName, LPHASHFUNC_COMPAREOBJECTDATA fnCompareObjectData, LPHASHFUNC_HASHOBJECT fnHashObject, LPHASHFUNC_HASHDATA fnHashData, size_t cTableSize); - ~HASHLISTKEY (void); - - void Add (size_t iObject, PVOID pObject); - void Remove (size_t iObject); - - void Resize (void); - - private: - LPEXPANDARRAY m_aObjects; - - struct HASHBUCKET { - size_t iFirst; - size_t iLast; - } *m_aBuckets; - size_t m_cBuckets; - - LPHASHLIST m_pList; - TCHAR m_szKeyName[ 256 ]; - LPHASHFUNC_COMPAREOBJECTDATA m_fnCompareObjectData; - LPHASHFUNC_HASHOBJECT m_fnHashObject; - LPHASHFUNC_HASHDATA m_fnHashData; - }; - - -/* - * ENUMERATION CLASS _____________________________________________________________ - * - */ - -class EXPORTED ENUMERATION - { - friend class HASHLIST; - friend class HASHLISTKEY; - - public: - - // Each ENUMERATION object represents an object in the HASHLIST. - // You can find the HASHLIST object that the ENUMERATION represents. - // - PVOID GetObject (void); - - // Additionally, an ENUMERATION object allows you to traverse - // (forwards or backwards) the list of objects which meet your search - // criteria. If you started the enumeration through a HASHLIST - // object then all objects in the list will be enumerated; if you - // started the enumeration through a HASHLISTKEY object then only - // those objects which have the specified value for that key will be - // enumerated. If either of the routines below is about to return NULL, - // it will automatically 'delete this' before doing so--ending the - // enumeration. - // - LPENUMERATION FindNext (void); - LPENUMERATION FindPrevious (void); - - // You obtain an ENUMERATION object by calling a FindFirst() method, - // either through the HASHLIST object or one of its keys. As mentioned - // in the examples above, the ENUMERATION object is automatically - // freed whenever FindNext() or FindPrevious() returns NULL--however, - // if you stop the enumeration before then, you'll have to explicitly - // free the object with 'delete'. Failure to do so means (1) a memory - // leak, and more seriously, (2) the active thread will hold a critical - // section for the hashlist forever. - // - ~ENUMERATION (void); - - private: - ENUMERATION (LPHASHLIST pList, size_t iObject, LPHASHLISTKEY pKey = NULL, PVOID pData = NULL); - - void ENUMERATION::PrepareWalk (void); - - size_t m_iObject; - size_t m_iNext; - size_t m_iPrevious; - LPHASHLIST m_pList; - LPHASHLISTKEY m_pKey; - PVOID m_pData; - }; - - -/* - * GENERAL-PURPOSE ____________________________________________________________ - * - */ - -EXPORTED HASHVALUE HashString (LPCTSTR pszString); -EXPORTED HASHVALUE HashAnsiString (LPCSTR pszStringA); -EXPORTED HASHVALUE HashUnicodeString (LPWSTR pszStringW); - - -#endif // HASHLIST_H - diff --git a/src/WINNT/afsapplib/lang/NTMakefile b/src/WINNT/afsapplib/lang/NTMakefile deleted file mode 100644 index 1cab6b5d8..000000000 --- a/src/WINNT/afsapplib/lang/NTMakefile +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile - -RELDIR=WINNT\afsapplib\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsAppLib_$(LANGID).dll - -RCFILE = $(LANGNAME)\afsapplib.rc - -RESFILE = $(OUT)\afsapplib_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist $(OUT)\*.res del $(OUT)\*.res - @if exist AFS_component_version_number.h del AFS_component_version_number.h - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - -mkdir: - diff --git a/src/WINNT/afsapplib/lang/de_DE/afsapplib.rc b/src/WINNT/afsapplib/lang/de_DE/afsapplib.rc deleted file mode 100644 index 698816851..000000000 --- a/src/WINNT/afsapplib/lang/de_DE/afsapplib.rc +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Application Base DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Application Base DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Fehler" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Windows konnte den angeforderten Task nicht beenden, weil ein nicht erkannter Fehler auftrat.", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "Fehler: %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "OK",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Zelle auswählen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Zelle:",IDC_STATIC,4,24,16,8 - LTEXT "Wählen Sie die AFS-Zelle, mit der Sie arbeiten möchten.", - IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,24,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS-&Identität:",IDC_STATIC,22,106,53,8 - EDITTEXT IDC_OPENCELL_ID,80,104,128,13,ES_AUTOHSCROLL - LTEXT "AFS-&Kennwort:",IDC_STATIC,22,122,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,120,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,57,146,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,111,146,50,14 - PUSHBUTTON "&Hilfe",9,165,146,50,14 - GROUPBOX "AFS-Authentifizierung",IDC_STATIC,4,45,211,96 - LTEXT "(Abfrage läuft...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Um eine Zelle zu verwalten, müssen Sie Ihr AFS-Kennwort noch einmal eingeben:", - IDC_STATIC,10,82,199,16 - LTEXT "Ihre aktuellen AFS-Token innerhalb der ausgewählten Zelle:", - IDC_STATIC,10,57,196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 197, 140 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS-Authentifizierung" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "AFS-&Identität:",IDC_STATIC,8,75,51,8 - EDITTEXT IDC_CREDS_ID,64,73,124,14,ES_AUTOHSCROLL - LTEXT "AFS-&Kennwort:",IDC_STATIC,8,92,50,8 - EDITTEXT IDC_CREDS_PASSWORD,64,89,124,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "AFS-Zelle:",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,64,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "Aktuelle Identität:",IDC_STATIC,4,23,56,8 - EDITTEXT IDC_CREDS_CURRENTID,64,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "Ablaufdatum:",IDC_STATIC,4,39,52,8 - EDITTEXT IDC_CREDS_EXPDATE,64,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "OK",IDOK,35,122,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,89,122,50,14 - PUSHBUTTON "&Hilfe",9,143,122,50,14 - GROUPBOX " ",IDC_STATIC,4,57,189,56 - CONTROL "&Neue AFS-Token für diese Zelle besorgen", - IDC_CREDS_LOGIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, - 57,148,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Warnung" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Ja",IDOK,173,78,50,14 - PUSHBUTTON "&Nein",IDCANCEL,227,78,50,14 - PUSHBUTTON "&Hilfe",9,281,78,50,14 - CONTROL "&Diese Warnung nicht mehr anzeigen",IDC_BADCREDS_SHUTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,80,137,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(während der Laufzeit gesetzter Text)", - IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(Beschreibung erscheint hier)",IDC_COVER_DESC,14,14,162, - 107 - PUSHBUTTON "&Noch einmal versuchen...",IDC_COVER_BUTTON,126,107,50, - 14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "Volume auswählen" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - RTEXT "Volume:",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Auswählen",IDOK,224,113,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,224,129,50,14 - RTEXT "In &Zelle schauen:",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY - DEFPUSHBUTTON "(I get moved off the dialog so I'm invisible at runtime)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(Dieser Fenstertitel wird zur Laufzeit ausgewählt)" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(Laufzeit)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Auswählen",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,224,129,50,14 - RTEXT "In &Zelle schauen:",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(I get moved off the dialog so I'm invisible at runtime)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 136 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "Sie besitzen keine AFS-Token als Administrator innerhalb der \n%1-Zelle.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED - "Ihre Token innerhalb der %1-Zelle sind abgelaufen.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "Sie haben gewählt, sich nicht als Administrator innerhalb der \n%1-Zelle anzumelden.\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "Wenn Sie nicht als Administrator angemeldet sind, besitzen Sie vielleicht nur unzureichende Berechtigungen für die Arbeit mit der %1-Zelle." - IDS_BADCREDS_DESC3 "Möchten Sie sich jetzt neue AFS-Token besorgen?" - IDS_BADCREDS_DESC3_ADM "Möchten Sie sich statt dessen als Administrator anmelden?" - IDS_BADCREDS_DESC_DESTROYED - "Ihre Token innerhalb der %1-Zelle sind nicht mehr gültig.\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "Die von Ihnen eingegebene AFS-Identität ist unbekannt, oder das von Ihnen angegebene Kennwort ist nicht korrekt." - IDS_BROWSE_WAITING "Abfrage des Servers -- bitte warten..." - IDS_BROWSE_BADCELL_TITLE "Unbekannte Zelle" - IDS_BROWSE_BADCELL_DESC "Der von Ihnen eingegebene Zellenname konnte im Netzwerk nicht gefunden werden.\n\nBitte überprüfen Sie, ob Sie den Zellennamen korrekt eingegeben haben." - IDS_CREDS_NONE "(keine Token)" - IDS_CREDS_VALID "%2, verfällt %3" - IDS_CREDS_EXPIRED "(abgelaufene Token %3)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/en_US/afsapplib.rc b/src/WINNT/afsapplib/lang/en_US/afsapplib.rc deleted file mode 100644 index 28414d573..000000000 --- a/src/WINNT/afsapplib/lang/en_US/afsapplib.rc +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Application Base DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Application Base DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Error" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Windows was unable to complete the requested task because an unrecognized error occurred.", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "Error: %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "OK",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Select Cell" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Cell:",IDC_STATIC,4,24,16,8 - LTEXT "Select the AFS cell with which you would like to work.", - IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,24,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS &Identity:",IDC_STATIC,22,100,53,8 - EDITTEXT IDC_OPENCELL_ID,80,98,128,13,ES_AUTOHSCROLL - LTEXT "AFS &Password:",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,57,146,50,14 - PUSHBUTTON "Cancel",IDCANCEL,111,146,50,14 - PUSHBUTTON "&Help",9,165,146,50,14 - GROUPBOX "AFS Authentication",IDC_STATIC,4,44,211,92 - LTEXT "(querying...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "To administer a cell, you must re-enter your AFS password:", - IDC_STATIC,10,85,196,8 - LTEXT "Your current AFS tokens within the selected cell:", - IDC_STATIC,10,57,196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 197, 140 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Authentication" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "AFS &Identity:",IDC_STATIC,8,75,51,8 - EDITTEXT IDC_CREDS_ID,64,73,124,14,ES_AUTOHSCROLL - LTEXT "AFS &Password:",IDC_STATIC,8,92,50,8 - EDITTEXT IDC_CREDS_PASSWORD,64,89,124,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "AFS Cell:",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,64,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "Current Identity:",IDC_STATIC,4,23,52,8 - EDITTEXT IDC_CREDS_CURRENTID,64,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "Expiration Date:",IDC_STATIC,4,39,52,8 - EDITTEXT IDC_CREDS_EXPDATE,64,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "OK",IDOK,35,122,50,14 - PUSHBUTTON "Cancel",IDCANCEL,89,122,50,14 - PUSHBUTTON "&Help",9,143,122,50,14 - GROUPBOX " ",IDC_STATIC,4,57,189,56 - CONTROL "&Obtain new AFS tokens for this cell",IDC_CREDS_LOGIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,57,138,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Caution" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Yes",IDOK,173,78,50,14 - PUSHBUTTON "&No",IDCANCEL,227,78,50,14 - PUSHBUTTON "&Help",9,281,78,50,14 - CONTROL "&Do not show this warning again",IDC_BADCREDS_SHUTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,80,120,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(text set at runtime)",IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(description goes here)",IDC_COVER_DESC,14,14,162,107 - PUSHBUTTON "Try &Again...",IDC_COVER_BUTTON,126,107,50,14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "Select Volume" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - RTEXT "Volume:",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Select",IDOK,224,113,50,14 - PUSHBUTTON "Cancel",IDCANCEL,224,129,50,14 - RTEXT "Look in &cell:",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY - DEFPUSHBUTTON "(I get moved off the dialog so I'm invisible at runtime)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(This title selected at runtime)" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Select",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Cancel",IDCANCEL,224,129,50,14 - RTEXT "Look in &cell:",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(I get moved off the dialog so I'm invisible at runtime)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 136 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "You do not have AFS tokens as an administrator within the %1 cell.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED - "Your tokens within the %1 cell have expired.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "You have chosen not to log in as an administrator within the %1 cell.\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "Unless you are logged in as an administrator, you may have insufficient privileges to work with the %1 cell." - IDS_BADCREDS_DESC3 "Would you like to obtain new AFS tokens now?" - IDS_BADCREDS_DESC3_ADM "Would you like to log in as an administrator instead?" - IDS_BADCREDS_DESC_DESTROYED - "Your tokens within the %1 cell are no longer valid.\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "The AFS identity you have entered is unrecognized, or the password you have specified is incorrect." - IDS_BROWSE_WAITING "querying server--please wait..." - IDS_BROWSE_BADCELL_TITLE "Unrecognized Cell" - IDS_BROWSE_BADCELL_DESC "The cell name you have entered could not be found on the network.\n\nPlease check the cell name to ensure you have spelled it correctly." - IDS_CREDS_NONE "(no tokens)" - IDS_CREDS_VALID "%2, expires %3" - IDS_CREDS_EXPIRED "(tokens expired %3)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/es_ES/afsapplib.rc b/src/WINNT/afsapplib/lang/es_ES/afsapplib.rc deleted file mode 100644 index eb7426799..000000000 --- a/src/WINNT/afsapplib/lang/es_ES/afsapplib.rc +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Application Base DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Application Base DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Error" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Windows no ha podido completar la tarea solicitada porque se ha producido un error no reconocido.", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "Error: %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "Aceptar",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 231, 165 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Seleccionar célula" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Célula:",IDC_STATIC,4,24,21,8 - LTEXT "Seleccione la célula de AFS con la que le gustaría trabajar.", - IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,33,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Identidad de AFS:",IDC_STATIC,22,105,67,8 - EDITTEXT IDC_OPENCELL_ID,94,103,128,13,ES_AUTOHSCROLL - LTEXT "C&ontraseña de AFS:",IDC_STATIC,22,121,65,8 - EDITTEXT IDC_OPENCELL_PASSWORD,94,119,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,57,147,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,111,147,50,14 - PUSHBUTTON "&Ayuda",9,177,147,50,14 - GROUPBOX "Autentificación de AFS",IDC_STATIC,4,44,223,92 - LTEXT "(consultando...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Para administrar una célula, debe volver a entrar la contraseña de AFS:", - IDC_STATIC,10,81,203,18 - LTEXT "Las señales de AFS actuales dentro de la célula seleccionada:", - IDC_STATIC,10,57,196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 210, 141 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Autentificación de AFS" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Identidad de AFS:",IDC_STATIC,8,75,60,8 - EDITTEXT IDC_CREDS_ID,75,73,124,14,ES_AUTOHSCROLL - LTEXT "&Contraseña de AFS:",IDC_STATIC,8,92,65,8 - EDITTEXT IDC_CREDS_PASSWORD,75,89,124,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "Célula de AFS:",IDC_STATIC,4,7,64,8 - EDITTEXT IDC_CREDS_CELL,76,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "Identidad actual:",IDC_STATIC,4,23,70,8 - EDITTEXT IDC_CREDS_CURRENTID,76,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "Fecha de caducidad:",IDC_STATIC,4,39,68,8 - EDITTEXT IDC_CREDS_EXPDATE,76,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "Aceptar",IDOK,35,123,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,89,123,50,14 - PUSHBUTTON "&Ayuda",9,155,123,50,14 - GROUPBOX " ",IDC_STATIC,4,63,201,50 - CONTROL "&Obtener nuevas señales de AFS para esta célula", - IDC_CREDS_LOGIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4, - 53,200,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Precaución" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Sí",IDOK,173,78,50,14 - PUSHBUTTON "&No",IDCANCEL,227,78,50,14 - PUSHBUTTON "&Ayuda",9,281,78,50,14 - CONTROL "N&o volver a mostrar este aviso",IDC_BADCREDS_SHUTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,80,131,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(texto definido en el momento de la ejecución)", - IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(aquí se incluye la descripción)",IDC_COVER_DESC,14,14, - 162,107 - PUSHBUTTON "Volver &a intentar...",IDC_COVER_BUTTON,126,107,50,14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "Seleccionar volumen" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "Volumen:",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Seleccionar",IDOK,224,113,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,224,129,50,14 - RTEXT "Buscar en &célula:",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY - DEFPUSHBUTTON "(Me han sacado del dialog por lo que resultaré invisible en el momento de la ejecución)", - IDC_BROWSE_RESTART,7,137,213,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(Título seleccionado en el momento de la ejecución)" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(en ejecución)",IDC_BROWSE_TYPE,7,115,64,18,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,73,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Seleccionar",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,224,129,50,14 - RTEXT "Buscar en &célula:",IDC_STATIC,7,9,45,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(Me han sacado del dialog por lo que resultaré invisible en el momento de la ejecución)", - IDC_BROWSE_RESTART,18,137,202,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 7 - BOTTOMMARGIN, 161 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 205 - TOPMARGIN, 7 - BOTTOMMARGIN, 137 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "No tiene señales de AFS como administrador dentro de la célula %1.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED - "Las señales de la célula %1 han caducado.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "Ha optado por no iniciar la sesión como administrador dentro de la célula %1.\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "A menos que inicie la sesión como administrador, no dispondrá de privilegios suficientes para trabajar con la célula %1." - IDS_BADCREDS_DESC3 "¿Desea obtener nuevas señales de AFS en este momento?" - IDS_BADCREDS_DESC3_ADM "¿En su lugar, desea iniciar la sesión como administrador?" - IDS_BADCREDS_DESC_DESTROYED - "Las señales de la célula %1 ya no son válidas.\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "La identidad de AFS que ha entrado no está reconocida, o bien la contraseña que ha especificado es incorrecta." - IDS_BROWSE_WAITING "consultando el servidor--espere por favor..." - IDS_BROWSE_BADCELL_TITLE "Célula no reconocida" - IDS_BROWSE_BADCELL_DESC "El nombre de célula que ha entrado no se ha podido encontrar en la red.\n\nPor favor compruebe el nombre de célula para asegurarse de que lo ha escrito correctamente." - IDS_CREDS_NONE "(no hay señales)" - IDS_CREDS_VALID "%2, caduca %3" - IDS_CREDS_EXPIRED "(señales caducadas %3)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/ja_JP/afsapplib.rc b/src/WINNT/afsapplib/lang/ja_JP/afsapplib.rc deleted file mode 100644 index 2c1c11637..000000000 --- a/src/WINNT/afsapplib/lang/ja_JP/afsapplib.rc +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒAƒvƒŠƒP[ƒVƒ‡ƒ“Eƒx[ƒX DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ƒAƒvƒŠƒP[ƒVƒ‡ƒ“Eƒx[ƒX DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒGƒ‰[" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "”Fޝ‚³‚ê‚Ä‚¢‚È‚¢ƒGƒ‰[‚ª‹N‚«‚½‚½‚߁AWindows ‚ª—v‹‚³‚ꂽƒ^ƒXƒN‚ðŠ®—¹‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "ƒGƒ‰[: %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "—¹‰ð",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒZƒ‹‚Ì‘I‘ð" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒZƒ‹(&C):",IDC_STATIC,4,24,30,8 - LTEXT "‘€ì‚µ‚½‚¢ AFS ƒZƒ‹‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B",IDC_STATIC,4,7, - 200,8 - COMBOBOX IDC_OPENCELL_CELL,43,22,171,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ID(&I):",IDC_STATIC,6,100,53,8 - EDITTEXT IDC_OPENCELL_ID,80,98,128,13,ES_AUTOHSCROLL - LTEXT "AFS ƒpƒXƒ[ƒh(&P):",IDC_STATIC,6,116,66,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,57,146,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,111,146,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,165,146,50,14 - GROUPBOX "AFS ”FØ",IDC_STATIC,4,44,211,92 - LTEXT "(Æ‰ï’†...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "ƒZƒ‹‚ÌŠÇ—‚ɂ́AAFS ƒpƒXƒ[ƒh‚ðÄ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_STATIC,10,85,203,8 - LTEXT "‘I‘ð‚µ‚½ƒZƒ‹“à‚ÌŒ»Ý‚Ì AFS ƒg[ƒNƒ“:",IDC_STATIC,10,57, - 196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 197, 140 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ”FØ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "AFS ID(&I):",IDC_STATIC,8,75,51,8 - EDITTEXT IDC_CREDS_ID,84,73,104,14,ES_AUTOHSCROLL - LTEXT "AFS ƒpƒXƒ[ƒh(&P):",IDC_STATIC,8,92,67,8 - EDITTEXT IDC_CREDS_PASSWORD,84,89,104,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "AFS ƒZƒ‹:",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,64,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "Œ»s ID:",IDC_STATIC,4,23,52,8 - EDITTEXT IDC_CREDS_CURRENTID,64,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "—LŒøŠúŒÀ:",IDC_STATIC,4,39,52,8 - EDITTEXT IDC_CREDS_EXPDATE,64,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "—¹‰ð",IDOK,35,122,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,89,122,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,143,122,50,14 - GROUPBOX " ",IDC_STATIC,4,57,189,56 - CONTROL "‚±‚̃Zƒ‹‚̐V‹K AFS ƒg[ƒNƒ“‚ðŽæ“¾(&O)",IDC_CREDS_LOGIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,57,157,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "’ˆÓ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "‚Í‚¢(&Y)",IDOK,173,78,50,14 - PUSHBUTTON "‚¢‚¢‚¦(&N)",IDCANCEL,227,78,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,281,78,50,14 - CONTROL "ŽŸ‰ñ‚±‚ÌŒx‚ð•\ަ‚µ‚È‚¢(&D)",IDC_BADCREDS_SHUTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,80,122,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)",IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(‹Lq‚ª‚±‚±‚É“ü‚è‚Ü‚·)",IDC_COVER_DESC,14,14,162,107 - PUSHBUTTON "ÄŽŽs(&A)...",IDC_COVER_BUTTON,126,107,50,14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚Ì‘I‘ð" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - RTEXT "ƒ{ƒŠƒ…[ƒ€:",IDC_BROWSE_TYPE,7,115,42,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "‘I‘ð(&S)",IDOK,224,113,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,224,129,50,14 - RTEXT "ƒZƒ‹‚ðŒ©‚é(&C):",IDC_STATIC,7,9,57,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,76,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,127,153,8,SS_NOTIFY - DEFPUSHBUTTON "(ƒ_ƒCƒAƒƒO‚ª•‚¶‚ç‚ê‚邽‚ߎÀsŽž‚ɂ͌©‚¦‚È‚­‚È‚è‚Ü‚·)", - IDC_BROWSE_RESTART,3,137,219,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(‚±‚̃^ƒCƒgƒ‹‚ÍŽÀsŽž‚É‘I‘ð‚³‚ê‚Ü‚·)" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - RTEXT "(ŽÀsŽž)",IDC_BROWSE_TYPE,8,115,53,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,70,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "‘I‘ð(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,224,129,50,14 - RTEXT "ƒZƒ‹‚ðŒ©‚é(&C):",IDC_STATIC,7,9,50,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,66,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(ƒ_ƒCƒAƒƒO‚ª•‚¶‚ç‚ê‚邽‚ߎÀsŽž‚ɂ͌©‚¦‚È‚­‚È‚è‚Ü‚·)", - IDC_BROWSE_RESTART,3,137,219,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 136 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "%1 ƒZƒ‹“à‚ÌŠÇ—ŽÒ‚Æ‚µ‚Ä‚Ì AFS ƒg[ƒNƒ“‚ðŽ‚Á‚Ä‚¢‚Ü‚¹‚ñB\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED - "%1 ƒZƒ‹“à‚̃g[ƒNƒ“‚ÌŠúŒÀ‚ªØ‚ê‚Ü‚µ‚½B\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "%1 ƒZƒ‹“à‚ÌŠÇ—ŽÒ‚Æ‚µ‚ăƒOƒCƒ“‚µ‚È‚¢‚±‚Æ‚ð‘I‘ð‚µ‚Ü‚µ‚½B\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "ŠÇ—ŽÒ‚Æ‚µ‚ăƒOƒCƒ“‚µ‚È‚¢‚ƁA%1 ƒZƒ‹‚Ì‘€ì‚ɏ\•ª‚ÈŒ ŒÀ‚ª—^‚¦‚ç‚ê‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B" - IDS_BADCREDS_DESC3 "V‚µ‚¢ AFS ƒg[ƒNƒ“‚ð“üŽè‚µ‚Ü‚·‚©?" - IDS_BADCREDS_DESC3_ADM "‘ã‚í‚è‚ÉŠÇ—ŽÒ‚Æ‚µ‚ăƒOƒCƒ“‚µ‚Ü‚·‚©?" - IDS_BADCREDS_DESC_DESTROYED - "%1 ƒZƒ‹“à‚̃g[ƒNƒ“‚ª—LŒø‚łȂ­‚È‚è‚Ü‚µ‚½B\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "“ü—Í‚µ‚½ AFS ID ‚ª”Fޝ‚³‚ê‚È‚¢‚©A‚Ü‚½‚ÍŽw’肵‚½ƒpƒXƒ[ƒh‚ª³‚µ‚­‚ ‚è‚Ü‚¹‚ñB" - IDS_BROWSE_WAITING "ƒT[ƒo[‚ðÆ‰ï’†‚Å‚·--‚¨‘Ò‚¿‚­‚¾‚³‚¢..." - IDS_BROWSE_BADCELL_TITLE "”Fޝ‚³‚ê‚Ä‚¢‚È‚¢ƒZƒ‹" - IDS_BROWSE_BADCELL_DESC "“ü—Í‚µ‚½ƒZƒ‹–¼‚ªƒlƒbƒgƒ[ƒN‚ÅŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒZƒ‹–¼‚̂‚Â肪³‚µ‚¢‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_CREDS_NONE "(ƒg[ƒNƒ“‚È‚µ)" - IDS_CREDS_VALID "%2, ŠúŒÀØ‚ê %3" - IDS_CREDS_EXPIRED "(ƒg[ƒNƒ“‚ªŠúŒÀØ‚ê %3)" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/ko_KR/afsapplib.rc b/src/WINNT/afsapplib/lang/ko_KR/afsapplib.rc deleted file mode 100644 index 700125d1e..000000000 --- a/src/WINNT/afsapplib/lang/ko_KR/afsapplib.rc +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ÀÀ¿ëÇÁ·Î±×·¥ ±âº» DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ÀÀ¿ëÇÁ·Î±×·¥ ±âº» DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¿À·ù" -FONT 9, "±¼¸²" -BEGIN - LTEXT "Windows´Â ÀνÄÇÒ ¼ö ¾ø´Â ¿À·ù·Î ÀÎÇÏ¿© ¿äûµÈ ÀÛ¾÷À» Á¾·áÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "¿À·ù: %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "È®ÀÎ",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "¼¿ ¼±ÅÃ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼¿ (&C):",IDC_STATIC,4,24,16,8 - LTEXT "ÀÛ¾÷ÇÒ AFS ¼¿À» ¼±ÅÃÇϽʽÿÀ.",IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,24,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ID (&I):",IDC_STATIC,22,100,53,8 - EDITTEXT IDC_OPENCELL_ID,80,98,123,13,ES_AUTOHSCROLL - LTEXT "AFS ¾ÏÈ£ (&P):",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,124,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,57,146,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,111,146,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,165,146,50,14 - GROUPBOX "AFS ÀÎÁõ",IDC_STATIC,4,44,211,92 - LTEXT "(Á¶È¸ Áß...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "¼¿À» °ü¸®ÇÏ·Á¸é, AFS ¾ÏÈ£¸¦ ´Ù½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.", - IDC_STATIC,10,85,196,8 - LTEXT "¼±ÅÃµÈ ¼¿¿¡ ÀÖ´Â ÇöÀç AFS ÅäÅ«:",IDC_STATIC,10,57,196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 215, 159 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ÀÎÁõ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "AFS ID (&I):",IDC_STATIC,11,97,51,8 - EDITTEXT IDC_CREDS_ID,67,96,124,14,ES_AUTOHSCROLL - LTEXT "AFS ¾ÏÈ£ (&P):",IDC_STATIC,11,114,50,8 - EDITTEXT IDC_CREDS_PASSWORD,67,111,124,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "AFS ¼¿:",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,75,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "ÇöÀç ID:",IDC_STATIC,4,23,52,8 - EDITTEXT IDC_CREDS_CURRENTID,75,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "¸¸±â ³¯Â¥:",IDC_STATIC,4,39,52,8 - EDITTEXT IDC_CREDS_EXPDATE,75,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "È®ÀÎ",IDOK,35,141,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,89,141,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,161,141,50,14 - GROUPBOX " ",IDC_STATIC,4,68,207,70 - CONTROL "ÀÌ ¼¿¿¡ ´ëÇÑ »õ AFS ÅäÅ« È®º¸ (&O)",IDC_CREDS_LOGIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,81,138,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ÁÖÀÇ" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "¿¹ (&Y)",IDOK,173,78,50,14 - PUSHBUTTON "¾Æ´Ï¿À (&N)",IDCANCEL,227,78,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,281,78,50,14 - CONTROL "ÀÌ °æ°í¸¦ ´Ù½Ã Ç¥½ÃÇÏÁö ¾ÊÀ½(&D)",IDC_BADCREDS_SHUTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,80,120,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)",IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(¼³¸íÀº ¿©±â¿¡ ¿É´Ï´Ù)",IDC_COVER_DESC,14,14,162,107 - PUSHBUTTON "´Ù½Ã ½ÃµµÇϽʽÿÀ (&A)...",IDC_COVER_BUTTON,126,107,50, - 14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ¼±ÅÃ" -FONT 9, "±¼¸²" -BEGIN - RTEXT "º¼·ý:",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¼±ÅÃ(&S)",IDOK,224,113,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,224,129,50,14 - RTEXT "¼¿ Á¶È¸(&C):",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "(½ÇÇà Áß¿¡ Ç¥½ÃµÇÁö ¾ÊÀ½)",IDC_BROWSE_RESTART,41,130, - 177,13,NOT WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE -END - -IDD_APPLIB_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(½ÇÇà Áß ¼±ÅÃµÈ Á¦¸ñ)" -FONT 9, "±¼¸²" -BEGIN - RTEXT "(½ÇÇà Áß)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¼±ÅÃ(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,224,129,50,14 - RTEXT "¼¿ Á¶È¸(&C):",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(½ÇÇà Áß¿¡ Ç¥½ÃµÇÁö ¾ÊÀ½)",IDC_BROWSE_RESTART,43,137, - 177,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 211 - TOPMARGIN, 7 - BOTTOMMARGIN, 155 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "%1 ¼¿¿¡¼­ AFS ÅäÅ«À» °ü¸®ÀÚ·Î »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED "%1 ¼¿ÀÇ ÅäÅ«ÀÌ ¸¸±âµÇ¾ú½À´Ï´Ù.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "%1 ¼¿¿¡¼­ °ü¸®ÀÚ·Î ·Î±×ÀÎÇÏÁö ¾Ê±â·Î °áÁ¤Çß½À´Ï´Ù.\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "°ü¸®ÀÚ·Î ·Î±×ÀÎÇÏÁö ¾Ê´Â ÀÌ»ó, %1 ¼¿°ú ÀÛ¾÷ÇÒ ¼ö Àִ Ư±ÇÀÌ ºÎÁ·ÇÕ´Ï´Ù." - IDS_BADCREDS_DESC3 "Áö±Ý »õ AFS ÅäÅ«À» È®º¸ÇϽðڽÀ´Ï±î?" - IDS_BADCREDS_DESC3_ADM "°ü¸®ÀÚ·Î ·Î±×ÀÎÇϽðڽÀ´Ï±î?" - IDS_BADCREDS_DESC_DESTROYED - "%1 ¼¿ÀÇ ÅäÅ«Àº ´õ ÀÌ»ó À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "ÀÔ·ÂÇÑ AFS ID¸¦ ÀνÄÇÒ ¼ö ¾ø°Å³ª ÁöÁ¤ÇÑ ¾ÏÈ£°¡ Ʋ·È½À´Ï´Ù." - IDS_BROWSE_WAITING "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À..." - IDS_BROWSE_BADCELL_TITLE "ÀνĵÇÁö ¾ÊÀº ¼¿" - IDS_BROWSE_BADCELL_DESC "ÀÔ·ÂÇÑ ¼¿ À̸§À» ³×Æ®¿öÅ©¿¡¼­ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\n¼¿ À̸§À» È®ÀÎÇÏ¿© ¿Ã¹Ù·Î ÀÔ·ÂÇß´ÂÁö º¸½Ê½Ã¿À." - IDS_CREDS_NONE "(ÅäÅ« ¾øÀ½)" - IDS_CREDS_VALID "%2, %3 ¸¸±â" - IDS_CREDS_EXPIRED "(ÅäÅ« %3 ¸¸±â)" -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/pt_BR/afsapplib.rc b/src/WINNT/afsapplib/lang/pt_BR/afsapplib.rc deleted file mode 100644 index 18a98c996..000000000 --- a/src/WINNT/afsapplib/lang/pt_BR/afsapplib.rc +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "DLL Base da Aplicação AFS" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""DLL Base da Aplicação AFS""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erro" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "O Windows não foi capaz de completar a tarefa pedida porque ocorreu um erro não reconhecido.", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "Erro: %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "OK",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Selecionar Célula" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Célula:",IDC_STATIC,4,24,26,8 - LTEXT "Selecione a célula do AFS com a qual deseja trabalhar.", - IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,30,22,185,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Identidade do AFS:",IDC_STATIC,12,103,65,8 - EDITTEXT IDC_OPENCELL_ID,80,101,128,13,ES_AUTOHSCROLL - LTEXT "&Senha do AFS:",IDC_STATIC,12,119,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,117,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,57,146,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,111,146,50,14 - PUSHBUTTON "&Ajuda",9,165,146,50,14 - GROUPBOX "Autenticação do AFS",IDC_STATIC,4,44,211,92 - LTEXT "(consultando...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Para administrar uma célula, é preciso informar novamente sua senha do AFS:", - IDC_STATIC,10,80,196,16 - LTEXT "Seus tokens do AFS atuais dentro da célula selecionada:", - IDC_STATIC,10,57,196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 211, 141 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Autenticação do AFS" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Identidade do AFS:",IDC_STATIC,8,75,66,8 - EDITTEXT IDC_CREDS_ID,77,73,124,14,ES_AUTOHSCROLL - LTEXT "&Senha do AFS:",IDC_STATIC,8,92,50,8 - EDITTEXT IDC_CREDS_PASSWORD,77,89,124,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "Célula do AFS:",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,78,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "Identidade Atual:",IDC_STATIC,4,23,57,8 - EDITTEXT IDC_CREDS_CURRENTID,78,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "Data de Vencimento:",IDC_STATIC,4,39,68,8 - EDITTEXT IDC_CREDS_EXPDATE,78,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "OK",IDOK,48,123,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,102,123,50,14 - PUSHBUTTON "&Ajuda",9,156,123,50,14 - GROUPBOX " ",IDC_STATIC,4,57,203,56 - CONTROL "&Obter novos tokens do AFS para esta célula", - IDC_CREDS_LOGIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, - 57,164,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Atenção" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Sim",IDOK,173,78,50,14 - PUSHBUTTON "&Não",IDCANCEL,227,78,50,14 - PUSHBUTTON "&Ajuda",9,281,78,50,14 - CONTROL "&Não mostrar novamente este aviso",IDC_BADCREDS_SHUTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,80,128,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(texto definido no runtime)",IDC_BADCREDS_DESC,31,7,300, - 64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(descrição vai aqui)",IDC_COVER_DESC,14,14,162,107 - PUSHBUTTON "Tentar &Novamente...",IDC_COVER_BUTTON,126,107,50,14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "Selecionar Volume" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - RTEXT "Volume:",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Selecionar",IDOK,224,113,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,224,129,50,14 - RTEXT "Examinar na &célula:",IDC_STATIC,7,9,68,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,83,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY - DEFPUSHBUTTON "(Sou removido do diálogo e portanto sou invisível no runtime)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(Este título selecionado no runtime)" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Selecionar",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,224,129,50,14 - RTEXT "Examinar na &célula:",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(Sou removido do diálogo e portanto sou invisível no runtime)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 207 - TOPMARGIN, 7 - BOTTOMMARGIN, 137 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "Você não possui tokens do AFS como administrador na célula %1.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED - "Seus tokens na célula %1 estão vencidos.\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "Você optou por não efetuar logon como administrador na célula %1.\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "A menos que tenha efetuado logon como administrador, você pode ter privilégios insuficientes para trabalhar com a célula %1." - IDS_BADCREDS_DESC3 "Gostaria de obter novos tokens do AFS agora?" - IDS_BADCREDS_DESC3_ADM "Gostaria de efetuar logon como administrador?" - IDS_BADCREDS_DESC_DESTROYED - "Seus tokens na célula %1 não são mais válidos.\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "A identidade do AFS informada não é reconhecida, ou a senha especificada está incorreta." - IDS_BROWSE_WAITING "consultando o servidor--aguarde..." - IDS_BROWSE_BADCELL_TITLE "Célula Não Reconhecida" - IDS_BROWSE_BADCELL_DESC "O nome de célula informado não foi encontrado na rede.\n\nVerifique o nome da célula para certificar-se de que esteja corretamente digitado." - IDS_CREDS_NONE "(nenhum token)" - IDS_CREDS_VALID "%2, vence em %3" - IDS_CREDS_EXPIRED "(tokens vencidos %3)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/zh_CN/afsapplib.rc b/src/WINNT/afsapplib/lang/zh_CN/afsapplib.rc deleted file mode 100644 index 73fcd7931..000000000 --- a/src/WINNT/afsapplib/lang/zh_CN/afsapplib.rc +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Ó¦ÓóÌÐò»ù±¾¶¯Ì¬Á´½Ó¿â" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Ó¦ÓóÌÐò»ù±¾¶¯Ì¬Á´½Ó¿â""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "´íÎó" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÓÉÓÚ·¢ÉúÁËÒ»¸öÎÞ·¨Ê¶±ðµÄ´íÎó£¬Windows ÎÞ·¨Íê³ÉÇëÇóµÄÈÎÎñ¡£", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "´íÎó£º%1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "È·¶¨",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Ñ¡Ôñµ¥Ôª" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "µ¥Ôª(&C)£º",IDC_STATIC,4,24,36,8 - LTEXT "Ñ¡ÔñÄúÏ£ÍûʹÓÃµÄ AFS µ¥Ôª¡£",IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,46,22,169,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS Éí·Ý(&I)£º",IDC_STATIC,22,100,53,8 - EDITTEXT IDC_OPENCELL_ID,80,98,128,13,ES_AUTOHSCROLL - LTEXT "AFS ¿ÚÁî(&P)£º",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,57,146,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,111,146,50,14 - PUSHBUTTON "°ïÖú(&H)",9,165,146,50,14 - GROUPBOX "AFS ÈÏÖ¤",IDC_STATIC,4,44,211,92 - LTEXT "(ÕýÔÚ²éѯ...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Òª¹ÜÀíµ¥Ôª£¬±ØÐëÖØÐÂÊäÈëÄúµÄ AFS ¿ÚÁ",IDC_STATIC,10, - 85,196,8 - LTEXT "ÄúÔÚËùÑ¡µ¥ÔªÄڵĵ±Ç° AFS ÁîÅÆ£º",IDC_STATIC,10,57,196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 197, 140 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ÈÏÖ¤" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "AFS Éí·Ý(&I)£º",IDC_STATIC,8,75,53,8 - EDITTEXT IDC_CREDS_ID,64,73,124,14,ES_AUTOHSCROLL - LTEXT "AFS ¿ÚÁî(&P)£º",IDC_STATIC,8,92,53,8 - EDITTEXT IDC_CREDS_PASSWORD,64,89,124,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "AFS µ¥Ôª£º",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,64,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "µ±Ç°Éí·Ý£º",IDC_STATIC,4,23,52,8 - EDITTEXT IDC_CREDS_CURRENTID,64,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "µ½ÆÚÈÕÆÚ£º",IDC_STATIC,4,39,52,8 - EDITTEXT IDC_CREDS_EXPDATE,64,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "È·¶¨",IDOK,35,122,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,89,122,50,14 - PUSHBUTTON "°ïÖú(&H)",9,143,122,50,14 - GROUPBOX " ",IDC_STATIC,4,57,189,56 - CONTROL "»ñµÃ¸Ãµ¥ÔªµÄРAFS ÁîÅÆ(&O)",IDC_CREDS_LOGIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,57,138,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "×¢Òâ" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "ÊÇ(&Y)",IDOK,173,78,50,14 - PUSHBUTTON "·ñ(&N)",IDCANCEL,227,78,50,14 - PUSHBUTTON "°ïÖú(&H)",9,281,78,50,14 - CONTROL "²»ÔÙÏÔʾ´Ë¾¯¸æ(&D)",IDC_BADCREDS_SHUTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,31,80,120,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "(ÔËÐÐʱÉèÖõÄÎı¾)",IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "(ÃèÊöµ½´Ë)",IDC_COVER_DESC,14,14,162,107 - PUSHBUTTON "ÖØÊÔ(&A)...",IDC_COVER_BUTTON,126,107,50,14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "Ñ¡Ôñ¾í" -FONT 9, "ËÎÌå" -BEGIN - RTEXT "¾í£º",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Ñ¡Ôñ(&S)",IDOK,224,113,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,224,129,50,14 - RTEXT "²é¿´µ¥Ôª(&C)£º",IDC_STATIC,7,9,54,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,66,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY - DEFPUSHBUTTON "(ÎÒ³ýÈ¥Á˶Ի°£¬ËùÒÔÔÚÔËÐÐʱÎÒ²»¿É¼û)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "(ÔËÐÐʱѡÖиñêÌâ)" -FONT 9, "ËÎÌå" -BEGIN - RTEXT "(ÔËÐÐʱ)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Ñ¡Ôñ(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,224,129,50,14 - RTEXT "²é¿´µ¥Ôª(&C)£º",IDC_STATIC,7,9,54,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,66,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "(ÎÒ³ýÈ¥Á˶Ի°£¬ËùÒÔÔÚÔËÐÐʱÎÒ²»¿É¼û)", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 136 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "ÄúÔÚ %1 µ¥ÔªÄÚûÓÐ AFS µÄ¹ÜÀíÔ±ÁîÅÆ¡£\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED "ÄúÔÚ %1 µ¥ÔªÄÚµÄÁîÅÆÒѵ½ÆÚ¡£\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "ÄúÒÑÑ¡ÔñÔÚ %1 µ¥ÔªÄÚ²»ÒÔ¹ÜÀíÔ±Éí·ÝµÇ¼¡£\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "³ý·ÇÄúÒѾ­ÒÔ¹ÜÀíÔ±Éí·ÝµÇ¼£¬·ñÔòÄú½«Ã»ÓÐ×ã¹»µÄÌØÈ¨À´Ê¹Óà %1 µ¥Ôª¡£" - IDS_BADCREDS_DESC3 "ÄúÏ£ÍûÏÖÔÚ»ñµÃÐ嵀 AFS ÁîÅÆÂð?" - IDS_BADCREDS_DESC3_ADM "ÄúÏ£ÍûÒÔ¹ÜÀíÔ±Éí·ÝµÇ¼Âð?" - IDS_BADCREDS_DESC_DESTROYED "ÄúÔÚ %1 µ¥ÔªÄÚµÄÁîÅÆÒÑʧЧ¡£\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS "ÎÞ·¨Ê¶±ðÄúÊäÈëµÄ AFS Éí·Ý£¬»òÄúµÄ¿ÚÁî²»ÕýÈ·¡£" - IDS_BROWSE_WAITING "ÕýÔÚ²éѯ·þÎñÆ÷--ÇëµÈ´ý..." - IDS_BROWSE_BADCELL_TITLE "ÎÞ·¨Ê¶±ðµÄµ¥Ôª" - IDS_BROWSE_BADCELL_DESC "ÍøÂçÖÐÎÞ·¨ÕÒµ½ÄúÊäÈëµÄµ¥ÔªÃû¡£\n\nÇë¼ì²éµ¥ÔªÃûÒÔÈ·ÈÏÆ´Ð´ÊÇ·ñÕýÈ·¡£" - IDS_CREDS_NONE "(ûÓÐÁîÅÆ)" - IDS_CREDS_VALID "%2£¬µ½ÆÚ %3" - IDS_CREDS_EXPIRED "(ÁîÅÆµ½ÆÚ %3)" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/lang/zh_TW/afsapplib.rc b/src/WINNT/afsapplib/lang/zh_TW/afsapplib.rc deleted file mode 100644 index 66805af10..000000000 --- a/src/WINNT/afsapplib/lang/zh_TW/afsapplib.rc +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "al_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Application Base DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afsapplib" -#define AFS_VERINFO_FILENAME "afsapplib.dll" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "al_resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Application Base DLL""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "Resource\\error.ico" -32515 ICON DISCARDABLE "Resource\\warning.ico" -IDI_SPIN1 ICON DISCARDABLE "resource\\spin1.ico" -IDI_SPIN2 ICON DISCARDABLE "resource\\spin2.ico" -IDI_SPIN3 ICON DISCARDABLE "resource\\spin3.ico" -IDI_SPIN4 ICON DISCARDABLE "resource\\spin4.ico" -IDI_SPIN5 ICON DISCARDABLE "resource\\spin5.ico" -IDI_SPIN6 ICON DISCARDABLE "resource\\spin6.ico" -IDI_SPIN7 ICON DISCARDABLE "resource\\spin7.ico" -IDI_SPIN8 ICON DISCARDABLE "resource\\spin8.ico" -IDI_SPINSTOP ICON DISCARDABLE "resource\\spinstop.ico" -IDI_BOSSERVICE ICON DISCARDABLE "resource\\bos.ico" -IDI_SERVER ICON DISCARDABLE "resource\\server.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "resource\\server1.ico" -IDI_SERVER_UNMON ICON DISCARDABLE "resource\\server_u.ico" -IDI_SERVICE ICON DISCARDABLE "resource\\service.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "resource\\service1.ico" -IDI_SERVICE_STOPPED ICON DISCARDABLE "resource\\service2.ico" -IDI_AGGREGATE ICON DISCARDABLE "resource\\aggreg.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "resource\\aggreg1.ico" -IDI_FILESET ICON DISCARDABLE "resource\\fileset.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "resource\\fileset1.ico" -IDI_FILESET_LOCKED ICON DISCARDABLE "resource\\locked.ico" -IDI_INITIAL_CONTAINER ICON DISCARDABLE "resource\\ic.ico" -IDI_INITIAL_OBJECT ICON DISCARDABLE "resource\\io.ico" -IDI_MULTIPLE ICON DISCARDABLE "resource\\multiple.ico" -IDI_ACL ICON DISCARDABLE "resource\\acl.ico" -IDI_CELL ICON DISCARDABLE "resource\\cell.ico" -IDI_SERVER_KEY ICON DISCARDABLE "resource\\key.ico" -IDI_USER ICON DISCARDABLE "resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "resource\\group.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_APPLIB_ERROR DIALOG DISCARDABLE 0, 0, 277, 91 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¿ù»~" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¥Ñ©ó²£¥ÍµLªkÃѧOªº¿ù»~¡A¦]¦¹ Windows µLªk§¹¦¨©Ò­n¨Dªº§@·~¡C", - IDC_ERROR_DESC,31,7,242,33 - LTEXT "¿ù»~¡G %1",IDC_ERROR_STATUS,31,49,241,16 - DEFPUSHBUTTON "½T©w",IDOK,114,73,50,14 - ICON 32513,IDC_STATIC,4,7,20,20 -END - -IDD_APPLIB_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 164 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "¿ï¨ú Cell" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "Cell (&C)¡G",IDC_STATIC,4,24,36,8 - LTEXT "¿ï¨ú±z­n§@·~ªº AFS Cell",IDC_STATIC,4,7,200,8 - COMBOBOX IDC_OPENCELL_CELL,41,22,174,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ¨­¥÷(&I)¡G",IDC_STATIC,12,100,63,8 - EDITTEXT IDC_OPENCELL_ID,80,98,128,13,ES_AUTOHSCROLL - LTEXT "AFS ±K½X(&P)¡G",IDC_STATIC,12,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,128,13,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,57,146,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,111,146,50,14 - PUSHBUTTON "»¡©ú(&H)",9,165,146,50,14 - GROUPBOX "AFS Ų§O",IDC_STATIC,4,44,211,92 - LTEXT "¡]¬d¸ß...¡^",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "¦p­nºÞ²z Cell¡A±z¥²¶·­«·s¿é¤J AFS ±K½X¡G",IDC_STATIC,10, - 85,196,8 - LTEXT "±z¥Ø«e¦b©Ò¿ï¨ú¤§ Cell ¤¤ªº AFS °O¸¹¡G",IDC_STATIC,10,57, - 196,8 -END - -IDD_APPLIB_CREDENTIALS DIALOGEX 0, 0, 197, 140 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Ų§O" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "AFS ¨­¥÷(&I)¡G",IDC_STATIC,8,75,65,8 - EDITTEXT IDC_CREDS_ID,74,73,114,14,ES_AUTOHSCROLL - LTEXT "AFS ±K½X(&P)¡G",IDC_STATIC,8,92,50,8 - EDITTEXT IDC_CREDS_PASSWORD,74,89,114,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "AFS Cell¡G",IDC_STATIC,4,7,52,8 - EDITTEXT IDC_CREDS_CELL,64,7,129,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - LTEXT "¥Ø«eªº¨­¥÷¡G",IDC_STATIC,4,23,52,8 - EDITTEXT IDC_CREDS_CURRENTID,64,22,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - LTEXT "¦³®Ä´Á­­¡G",IDC_STATIC,4,39,52,8 - EDITTEXT IDC_CREDS_EXPDATE,64,38,129,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP, - WS_EX_STATICEDGE - DEFPUSHBUTTON "½T©w",IDOK,35,122,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,89,122,50,14 - PUSHBUTTON "»¡©ú(&H)",9,143,122,50,14 - GROUPBOX " ",IDC_STATIC,4,64,189,50 - CONTROL "¨ú±o¦¹ Cell ªº·s AFS °O¸¹(&O)",IDC_CREDS_LOGIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,54,138,10 -END - -IDD_APPLIB_BADCREDS DIALOG DISCARDABLE 0, 0, 335, 96 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ĵ§i" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "¬O(&Y)",IDOK,173,78,50,14 - PUSHBUTTON "§_(&N)",IDCANCEL,227,78,50,14 - PUSHBUTTON "»¡©ú(&H)",9,281,78,50,14 - CONTROL "¤£­n¦AÅã¥Ü¦¹Äµ§i(&D)",IDC_BADCREDS_SHUTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,31,80,120,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "¡]°õ¦æ´Á¶¡³]©w¤å¦r¡^",IDC_BADCREDS_DESC,31,7,300,64 -END - -IDD_APPLIB_COVER DIALOG DISCARDABLE 0, 0, 189, 135 -STYLE WS_CHILD | WS_BORDER -EXSTYLE WS_EX_CLIENTEDGE -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "",IDC_COVER_BORDER,7,4,175,123 - LTEXT "¡]»¡©ú¦p¤U©Ò¥Ü¡^",IDC_COVER_DESC,14,14,162,107 - PUSHBUTTON "­«·s¹Á¸Õ(&A)...",IDC_COVER_BUTTON,126,107,50,14 -END - -IDD_APPLIB_BROWSE_FILESET DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | - WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -CAPTION "¿ï¨ú®eÅé" -FONT 9, "·s²Ó©úÅé" -BEGIN - RTEXT "®eÅé¡G",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¿ï¨ú(&S)",IDOK,224,113,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,224,129,50,14 - RTEXT "¼fµø Cell (&C)¡G",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY - DEFPUSHBUTTON "¡]§Ú¤w¸gÂ÷¶}¹ï¸Ü¤è¶ô¡A¦]¦¹¦b°õ¦æ®É¶¡¬OÁô«¬ªº¡^", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP -END - -IDD_APPLIB_BROWSE DIALOGEX 0, 0, 281, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | - WS_SYSMENU -CAPTION "¡]³o­Ó¼ÐÃD¬O¦b°õ¦æ´Á¶¡¿ï¨ú¡^" -FONT 9, "·s²Ó©úÅé" -BEGIN - RTEXT "¡]°õ¦æ´Á¶¡¡^",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,145,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¿ï¨ú(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,224,129,50,14 - RTEXT "¼fµø Cell (&C)¡G",IDC_STATIC,7,9,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,7,153,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - CONTROL "",IDC_BROWSE_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | - WS_BORDER | WS_TABSTOP,7,23,267,84,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "¡]§Ú¤w¸gÂ÷¶}¡A¦]¦¹§Ú¦b°õ¦æ®É¶¡¬OÁô«¬ªº¡^", - IDC_BROWSE_RESTART,43,137,177,13,NOT WS_TABSTOP - CTEXT "",IDC_BROWSE_STATUS,56,133,153,8,SS_NOTIFY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_APPLIB_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 87 - END - - IDD_APPLIB_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 160 - END - - IDD_APPLIB_CREDENTIALS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 136 - END - - IDD_APPLIB_BADCREDS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 92 - END - - IDD_APPLIB_COVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_APPLIB_BROWSE_FILESET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_APPLIB_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOCAL_USER BITMAP DISCARDABLE "resource\\local_user.bmp" -IDB_LOCAL_GROUP BITMAP DISCARDABLE "resource\\local_group.bmp" -IDB_FOREIGN_USER BITMAP DISCARDABLE "resource\\foreign_user.bmp" -IDB_FOREIGN_GROUP BITMAP DISCARDABLE "resource\\foreign_group.bmp" -IDB_ANY_OTHER BITMAP DISCARDABLE "resource\\any_other.bmp" -IDB_FOREIGN_OTHER BITMAP DISCARDABLE "resource\\foreign_other.bmp" -IDB_LOCAL_OTHER BITMAP DISCARDABLE "resource\\local_other.bmp" -IDB_MASK_OBJ BITMAP DISCARDABLE "resource\\mask_obj.bmp" -IDB_UNAUTHENTICATED BITMAP DISCARDABLE "resource\\unauthenticated.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCREDS_DESC_GENERAL - "±z¦b %1 Cell ¤¤¨Ã¨S¦³§@¬°ºÞ²zªÌªº AFS °O¸¹¡C\n\n%2\n\n%3" - IDS_BADCREDS_DESC_EXPIRED "±z¦b %1 Cell ¤¤ªº°O¸¹¤w¸g¹L´Á¡C\n\n%2\n\n%3" - IDS_BADCREDS_DESC_BADCHOICE - "±z¥¼¿ï¾Ü¥HºÞ²zªÌ¨­¥÷µn¤J %1 Cell¡C\n\n%2\n\n%3" - IDS_BADCREDS_DESC2 "°£«D±z¥HºÞ²zªÌªº¨­¥÷µn¤J¡A§_«h±zªºÅv­­±N¤£¨¬¥H¦b %1 Cell ¤¤§@·~¡C" - IDS_BADCREDS_DESC3 "±z²{¦b­n¨ú±o·sªº AFS °O¸¹¶Ü¡H" - IDS_BADCREDS_DESC3_ADM "±z­n¥HºÞ²zªÌªº¨­¥÷µn¤J¶Ü¡H" - IDS_BADCREDS_DESC_DESTROYED "±z %1 Cell ¤¤ªº°O¸¹¤£¦A¦³®Ä¡C\n\n%2\n\n%3" - IDS_ERROR_BAD_CREDENTIALS - "µLªkÃѧO±z©Ò¿é¤Jªº AFS ¨­¥÷¡A©Î¬O±z©Ò«ü©wªº±K½X¦³»~¡C" - IDS_BROWSE_WAITING "¥¿¦b¬d¸ß¦øªA¾¹ -- ½Ðµy«Ý..." - IDS_BROWSE_BADCELL_TITLE "µLªkÃѧOªº Cell" - IDS_BROWSE_BADCELL_DESC "µLªk¦bºô¸ô¤W§ä¨ì±z©Ò¿é¤Jªº Cell ¦WºÙ¡C\n\n½Ð½T©w±z©Ò¿é¤Jªº Cell ¦WºÙ¬O§_¥¿½T¡C" - IDS_CREDS_NONE "¡]¨S¦³°O¸¹¡^" - IDS_CREDS_VALID "%2, ¹L´Á %3" - IDS_CREDS_EXPIRED "¡]°O¸¹¤w¹L´Á %3¡^" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsapplib/regexp.cpp b/src/WINNT/afsapplib/regexp.cpp deleted file mode 100644 index 8f5e3335b..000000000 --- a/src/WINNT/afsapplib/regexp.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define markREPEAT TEXT('\x01') -#define markCHARACTER TEXT('\x02') -#define markANYCHAR TEXT('\x04') -#define markCHARSET TEXT('\x06') -#define markNONCHARSET TEXT('\x08') -#define markREFERENCE TEXT('\x0A') -#define markLPAREN TEXT('\xFC') -#define markRPAREN TEXT('\xFD') -#define markENDLINE TEXT('\xFE') -#define markENDPATTERN TEXT('\xFF') - - -/* - * CLASS ROUTINES _____________________________________________________________ - * - */ - -REGEXP::REGEXP (void) -{ - m_fMatchFromStart = FALSE; - m_achCompiled[0] = TEXT('\0'); -} - -REGEXP::REGEXP (LPCTSTR pszExpr) -{ - m_fMatchFromStart = FALSE; - m_achCompiled[0] = TEXT('\0'); - SetExpression (pszExpr); -} - -REGEXP::~REGEXP (void) -{ - ; // nothing really to do here -} - -BOOL REGEXP::SetExpression (LPCTSTR pszExpr) -{ - return Compile (pszExpr); -} - -BOOL REGEXP::Matches (LPCTSTR pszExpr, LPCTSTR pszString) -{ - REGEXP Expr (pszExpr); - return Expr.Matches (pszString); -} - -BOOL REGEXP::fIsRegExp (void) -{ - if (m_fMatchFromStart) // started with "^"? - return TRUE; // it's a regexp. - - for (LPCTSTR pch = m_achCompiled; (*pch) && (*pch != markENDPATTERN); pch += 2) - { - if (*pch != markCHARACTER) - return TRUE; - } - - return FALSE; // just a string of characters -} - -BOOL REGEXP::fIsRegExp (LPCTSTR pszExpr) -{ - REGEXP Expr (pszExpr); - return Expr.fIsRegExp(); -} - - -/* - * REGEXP _____________________________________________________________________ - * - */ - -BOOL REGEXP::Compile (LPCTSTR pszExpr) -{ - BYTE aParens[ nCOMPILED_PARENS_MAX ]; - PBYTE pParen = &aParens[0]; - LPTSTR pchLastEx = NULL; - int nParens = 0; - - // Erase any previous compiled expression - // - LPTSTR pchCompiled = m_achCompiled; - *pchCompiled = TEXT('\0'); - m_fMatchFromStart = FALSE; - - if (!pszExpr || !*pszExpr) - { - SetLastError (ERROR_INVALID_PARAMETER); - return FALSE; - } - - // See if the expression starts with a "^" - // - if ((m_fMatchFromStart = (*pszExpr == TEXT('^'))) == TRUE) - ++pszExpr; - - // Start stripping characters from the expression - // - for (BOOL rc = TRUE; rc; ) - { - TCHAR ch; - - if ((sizeof(TCHAR)*(pchCompiled - m_achCompiled)) > sizeof(m_achCompiled)) - { - SetLastError (ERROR_META_EXPANSION_TOO_LONG); - rc = FALSE; - break; - } - - if ((ch = *pszExpr++) == TEXT('\0')) - { - // We finally hit the end of this expression. - // - if (pParen != &aParens[0]) - { - SetLastError (ERROR_BAD_FORMAT); // unmatched "\(" - rc = FALSE; - } - break; - } - - if (ch != TEXT('*')) - pchLastEx = pchCompiled; - - switch (ch) - { - case TEXT('.'): - case TEXT('?'): - *pchCompiled++ = markANYCHAR; - break; - - case TEXT('*'): - if ((pchLastEx == NULL) || (*pchLastEx == markLPAREN) || (*pchLastEx == markRPAREN)) - { - *pchCompiled++ = markCHARACTER; - *pchCompiled++ = ch; - } - else // record that we can repeat the last expression - { - *pchLastEx |= markREPEAT; - } - break; - - case TEXT('$'): - if (*pszExpr != TEXT('\0')) - { - *pchCompiled++ = markCHARACTER; - *pchCompiled++ = ch; - } - else // record that we should match end-of-line - { - *pchCompiled++ = markENDLINE; - } - break; - - case TEXT('['): - if ((ch = *pszExpr++) == '^') - { - *pchCompiled++ = markNONCHARSET; - ch = *pszExpr++; - } - else - { - *pchCompiled++ = markCHARSET; - } - - *pchCompiled++ = 1; // length; this is pchLastEx[1] - - do { - if (ch == TEXT('\0')) - { - SetLastError (ERROR_BAD_FORMAT); // unmatched "\(" - rc = FALSE; - break; - } - - if ((ch == TEXT('-')) && (*pchCompiled != pchLastEx[2])) - { - if ((ch = *pszExpr++) == TEXT(']')) - { - *pchCompiled++ = TEXT('-'); - pchLastEx[1]++; - break; - } - while ((BYTE)pchCompiled[-1] < (BYTE)ch) - { - *pchCompiled = pchCompiled[-1] + 1; - pchCompiled++; - pchLastEx[1]++; - if ((sizeof(TCHAR)*(pchCompiled - m_achCompiled)) > sizeof(m_achCompiled)) - { - SetLastError (ERROR_META_EXPANSION_TOO_LONG); - rc = FALSE; - break; - } - } - } - else - { - *pchCompiled++ = ch; - pchLastEx[1]++; - - if ((sizeof(TCHAR)*(pchCompiled - m_achCompiled)) > sizeof(m_achCompiled)) - { - SetLastError (ERROR_META_EXPANSION_TOO_LONG); - rc = FALSE; - break; - } - } - - } while ((ch = *pszExpr++) != TEXT(']')); - break; - - case TEXT('\\'): - if ((ch = *pszExpr++) == TEXT('(')) - { - if (nParens >= nCOMPILED_PARENS_MAX) - { - SetLastError (ERROR_META_EXPANSION_TOO_LONG); - rc = FALSE; - break; - } - *pParen++ = nParens; - *pchCompiled++ = markLPAREN; - *pchCompiled++ = nParens++; - } - else if (ch == TEXT(')')) - { - if (pParen == &aParens[0]) - { - SetLastError (ERROR_BAD_FORMAT); - rc = FALSE; - break; - } - *pchCompiled++ = markRPAREN; - *pchCompiled++ = *--pParen; - } - else if ((ch >= TEXT('1')) && (ch < (TEXT('1') + nCOMPILED_PARENS_MAX))) - { - *pchCompiled++ = markREFERENCE; - *pchCompiled++ = ch - '1'; - } - else - { - *pchCompiled++ = markCHARACTER; - *pchCompiled++ = ch; - } - break; - - default: - *pchCompiled++ = markCHARACTER; - *pchCompiled++ = ch; - break; - } - } - - *pchCompiled++ = markENDPATTERN; - *pchCompiled++ = 0; - return rc; -} - - -BOOL REGEXP::Matches (LPCTSTR pszString) -{ - if (!pszString) - return FALSE; - - // Prepare a place to store information about \( and \) pairs - // - LPCTSTR aParenStarts[ nCOMPILED_PARENS_MAX ]; - LPCTSTR aParenEnds[ nCOMPILED_PARENS_MAX ]; - - for (size_t ii = 0; ii < nCOMPILED_PARENS_MAX; ii++) - { - aParenStarts[ii] = NULL; - aParenEnds[ii] = NULL; - } - - // If the expression starts with "^", we can do a quick pattern-match... - // - if (m_fMatchFromStart) - { - return MatchSubset (pszString, m_achCompiled, aParenStarts, aParenEnds); - } - - // Otherwise, we have to work a little harder. If the expression - // at least starts with a recognized character, we can scan for that - // as the start of a pattern... - // - LPTSTR pchCompiled = m_achCompiled; - if (*pchCompiled == markCHARACTER) - { - TCHAR chStart = pchCompiled[1]; - do { - if (*pszString != chStart) - continue; - if (MatchSubset (pszString, pchCompiled, aParenStarts, aParenEnds)) - return TRUE; - } while (*pszString++); - - return FALSE; - } - - // If the expression starts with something weird, we'll have to test - // against every character in the string. - // - do { - if (MatchSubset (pszString, pchCompiled, aParenStarts, aParenEnds)) - return TRUE; - } while (*pszString++); - - return FALSE; -} - - -BOOL REGEXP::MatchSubset (LPCTSTR pszString, LPCTSTR pchCompiled, LPCTSTR *aParenStarts, LPCTSTR *aParenEnds) -{ - LPCTSTR pchStartOfEx; - int ii; - int cchPattern; - - while (1) - switch (*pchCompiled++) - { - case markCHARACTER: - if (*pchCompiled++ == *pszString++) - continue; - return FALSE; - - case markANYCHAR: - if (*pszString++) - continue; - return FALSE; - - case markENDLINE: - if (*pszString == TEXT('\0')) - continue; - return FALSE; - - case markENDPATTERN: - return TRUE; - - case markCHARSET: - if (fIsInCharSet (pchCompiled, *pszString++, TRUE)) - { - pchCompiled += *pchCompiled; - continue; - } - return FALSE; - - case markNONCHARSET: - if (fIsInCharSet (pchCompiled, *pszString++, FALSE)) - { - pchCompiled += *pchCompiled; - continue; - } - return FALSE; - - case markLPAREN: - aParenStarts[*pchCompiled++] = pszString; - continue; - - case markRPAREN: - aParenEnds[*pchCompiled++] = pszString; - continue; - - case markREFERENCE: - if (aParenEnds[ii = *pchCompiled++] == 0) - return FALSE; // reference to invalid \(\) pair - if (CompareParen (ii, pszString, aParenStarts, aParenEnds)) - { - pszString += aParenEnds[ii] - aParenStarts[ii]; - continue; - } - return FALSE; - - case markREFERENCE|markREPEAT: - if (aParenEnds[ii = *pchCompiled++] == 0) - return FALSE; // reference to invalid \(\) pair - pchStartOfEx = pszString; - cchPattern = aParenEnds[ii] - aParenStarts[ii]; - while (CompareParen (ii, pszString, aParenStarts, aParenEnds)) - pszString += cchPattern; - while (pszString >= pchStartOfEx) - { - if (MatchSubset (pszString, pchCompiled, aParenStarts, aParenEnds)) - return TRUE; - pszString -= cchPattern; - } - continue; - - case markANYCHAR|markREPEAT: - pchStartOfEx = pszString; - while (*pszString++) - ; - goto star; - - case markCHARACTER|markREPEAT: - pchStartOfEx = pszString; - while (*pszString++ == *pchCompiled) - ; - pchCompiled++; - goto star; - - case markCHARSET|markREPEAT: - case markNONCHARSET|markREPEAT: - pchStartOfEx = pszString; - while (fIsInCharSet (pchCompiled, *pszString++, (pchCompiled[-1] == (markCHARSET|markREPEAT)))) - ; - pchCompiled += *pchCompiled; - goto star; - - star: - do { - pszString--; - if (MatchSubset (pszString, pchCompiled, aParenStarts, aParenEnds)) - return TRUE; - } while (pszString > pchStartOfEx); - return FALSE; - - default: - return FALSE; // damaged compiled string - } -} - - -BOOL REGEXP::CompareParen (int ii, LPCTSTR pszString, LPCTSTR *aParenStarts, LPCTSTR *aParenEnds) -{ - LPCTSTR pchInParen = aParenStarts[ii]; - while (*pchInParen++ == *pszString++) - if (pchInParen >= aParenEnds[ii]) - return TRUE; - return FALSE; -} - - -BOOL REGEXP::fIsInCharSet (LPCTSTR pszCharSet, TCHAR chTest, int fInclusive) -{ - if (chTest == 0) - return FALSE; - for (int n = (int)(*pszCharSet++); --n; ) - { - if (*pszCharSet++ == chTest) - return fInclusive; - } - return !fInclusive; -} - diff --git a/src/WINNT/afsapplib/regexp.h b/src/WINNT/afsapplib/regexp.h deleted file mode 100644 index 7e2903485..000000000 --- a/src/WINNT/afsapplib/regexp.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef REGEXP_H -#define REGEXP_H - -#ifndef EXPORTED -#define EXPORTED -#endif - -/* - * This class (hopefully) makes it easy to use regular-expression pattern - * matching. As an example, you can do the following: - * - * LPREGEXP pExpr = new REGEXP (TEXT("sl[ia]p-h.ppy$")); - * if (pExpr->Matches (TEXT("slap-happy"))) - * ... - * else if (pExpr->Matches (TEXT("slip-hoppy"))) - * ... - * else if (!pExpr->Matches (TEXT("slug-hoppy"))) - * ... - * delete pExpr; - * - * As a convenience, you can also use a simpler, more limited interface... - * - * if (REGEXP::Matches (TEXT("sl[ia]p-h.ppy$"), TEXT("slug-hoppy"))) - * ... - * - * You can also test a string to see if it looks like a regular expression: - * - * LPREGEXP pExpr = new REGEXP (TEXT("ab[cC]d")); - * if (pExpr->fIsRegExp()) - * ... - * if (!REGEXP::fIsRegExp (TEXT("testing"))) - * ... - * - */ - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cchCOMPILED_BUFFER_MAX 512 -#define nCOMPILED_PARENS_MAX 9 // "\1" through "\9" - -typedef class EXPORTED REGEXP REGEXP, *LPREGEXP; - -class EXPORTED REGEXP - { - public: - REGEXP (void); - REGEXP (LPCTSTR pszExpr); - ~REGEXP (void); - - BOOL SetExpression (LPCTSTR pszExpr); - - BOOL Matches (LPCTSTR pszString); - static BOOL Matches (LPCTSTR pszExpr, LPCTSTR pszString); - - BOOL fIsRegExp (void); - static BOOL fIsRegExp (LPCTSTR pszExpr); - - private: - BOOL Compile (LPCTSTR pszExpr); - BOOL MatchSubset (LPCTSTR pszString, LPCTSTR pchCompiled, LPCTSTR *aParenStarts, LPCTSTR *aParenEnds); - BOOL CompareParen (int ii, LPCTSTR pszString, LPCTSTR *aParenStarts, LPCTSTR *aParenEnds); - BOOL fIsInCharSet (LPCTSTR pszCharSet, TCHAR chTest, int fInclusive); - - BOOL m_fMatchFromStart; - TCHAR m_achCompiled[ cchCOMPILED_BUFFER_MAX ]; - }; - - -#endif - diff --git a/src/WINNT/afsapplib/resize.cpp b/src/WINNT/afsapplib/resize.cpp deleted file mode 100644 index b9c0e21db..000000000 --- a/src/WINNT/afsapplib/resize.cpp +++ /dev/null @@ -1,929 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include // To see if you have IDC_HSPLIT etc -#include -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef limit -#define limit(_a,_x,_b) (min( max( (_a),(_x) ), (_b) )) -#endif -#ifndef inlimit -#define inlimit(_a,_x,_b) ( (_x >= _a) && (_x <= _b) ) -#endif - -#ifndef THIS_HINST -#define THIS_HINST (GetModuleHandle (NULL)) -#endif - -#ifndef GWL_USER -#define GWL_USER 0 -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - -typedef struct // SplitterData - { - LONG *pcDelta; // pointer to LONG to hold cx/yDelta - int idWnd1; // first window to split between - int idWnd2; // second window to split between - rwWindowData *awd; // data list for using splitter - BOOL fX; // TRUE if moves in X, FALSE if in Y - BOOL fDragging; // TRUE if dragging with the mouse - POINT ptStart; // point at which started dragging - BOOL fMovedBeforeCreate; // TRUE if windows moved before create - } SplitterData; - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - HWND hWnd; - RECT rWnd; - LONG cxDeltaCenter; - LONG cyDeltaCenter; - rwWindowData *awdLast; - } WindowList; - -static WindowList *awl; -static size_t cwl = 0; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -int rwFindOrAddWnd (HWND, rwWindowData * = 0); -void rwFindAndRemoveWnd (HWND); -DWORD rwFindAction (rwWindowData *, int); - -BOOL WhereShouldSplitterGo (HWND, int, int, RECT *, BOOL *); -void EnsureSplitterRegistered (void); -LONG APIENTRY SplitterWndProc (HWND, UINT, WPARAM, LPARAM); -void ResizeSplitter (HWND, SplitterData *, LONG, LONG*); -void FindSplitterMinMax (HWND, SplitterData *, LONG, - LONG*, LONG*); - -void FindResizeLimits (HWND hWnd, LONG *pcxMin, LONG *pcxMax, LONG *pcyMin, LONG *pcyMax, rwWindowData * = 0); - -BOOL CALLBACK Resize_DialogProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) ResizeReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL ResizeReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -void ResizeWindow (HWND hWnd, rwWindowData *awd, rwAction rwa, RECT *pr) -{ - static BOOL fInHere = FALSE; // prevent reentrancy during SetWindowPos(). - int ii; - RECT rOld, rNew; - - if (fInHere) - return; - - // We maintain list of where-was-this-window-last-time; find - // This window in that list, or add it. - // - if ((ii = rwFindOrAddWnd (hWnd, awd)) == -1) - goto lblDONE; - - rOld = awl[ii].rWnd; // previous position - - // If the window disappears, then remove its entry from the - // list of windows. - // - if (!IsWindow (hWnd)) - { - awl[ii].hWnd = NULL; - goto lblDONE; - } - - // If told to, move and/or resize this parent window. - // - if (rwa == rwaMoveToHere) - { - if (pr == NULL) - goto lblDONE; - - fInHere = TRUE; - - SetWindowPos (hWnd, NULL, - pr->left, - pr->top, - pr->right - pr->left, - pr->bottom - pr->top, - SWP_NOZORDER | SWP_NOACTIVATE); - - fInHere = FALSE; - - rNew = *pr; - } - else - { - GetWindowRect (hWnd, &rNew); - } - - // Window has moved from {rOld} to {rNew}, - // or - // Window's client area has been changed by {*pr} - // - if (rwa == rwaMoveToHere || rwa == rwaFixupGuts || rwa == rwaNewClientArea) - { - LONG dx, dy; - LONG dxc, dyc; - - if (rwa == rwaNewClientArea) - { - dx = pr->right - pr->left; - dy = pr->bottom - pr->top; - } - else - { - dx = (rNew.right -rNew.left) - (rOld.right -rOld.left); - dy = (rNew.bottom -rNew.top) - (rOld.bottom -rOld.top); - } - - if (abs(dx) & 1) - awl[ii].cxDeltaCenter += (dx > 0) ? 1 : -1; - if (abs(dy) & 1) - awl[ii].cyDeltaCenter += (dy > 0) ? 1 : -1; - - dxc = dx + awl[ii].cxDeltaCenter/2; - dyc = dy + awl[ii].cyDeltaCenter/2; - - awl[ii].cxDeltaCenter %= 2; - awl[ii].cyDeltaCenter %= 2; - - if (dx != 0 || dy != 0) - { - HWND hItem; - size_t nItems = 0; - - for (hItem = GetWindow (hWnd, GW_CHILD); - hItem != NULL; - hItem = GetWindow (hItem, GW_HWNDNEXT)) - { - nItems++; - } - - if (nItems != 0) - { - DWORD ra; - HDWP dwp = BeginDeferWindowPos (nItems); - BOOL fRepaint = FALSE; - - for (hItem = GetWindow (hWnd, GW_CHILD); - hItem != NULL; - hItem = GetWindow (hItem, GW_HWNDNEXT)) - { - RECT rItem; - - GetRectInParent (hItem, &rItem); - - ra = rwFindAction (awd, (GetWindowLong (hItem, GWL_ID))); - - DeferWindowPos (dwp, hItem, NULL, - rItem.left + ((ra & raMoveX) ? dx : - (ra & raMoveXB) ? (0-dx) : - (ra & raMoveXC) ? (dxc/2) : 0), - rItem.top + ((ra & raMoveY) ? dy : - (ra & raMoveYB) ? (0-dy) : - (ra & raMoveYC) ? (dyc/2) : 0), - rItem.right -rItem.left - + ((ra & raSizeX) ? dx : - (ra & raSizeXB) ? (0-dx) : - (ra & raSizeXC) ? (dxc/2) : 0), - rItem.bottom -rItem.top - + ((ra & raSizeY) ? dy : - (ra & raSizeYB) ? (0-dy) : - (ra & raSizeYC) ? (dyc/2) : 0), - SWP_NOACTIVATE | SWP_NOZORDER); - } - - EndDeferWindowPos (dwp); - - for (hItem = GetWindow (hWnd, GW_CHILD); - hItem != NULL; - hItem = GetWindow (hItem, GW_HWNDNEXT)) - { - ra = rwFindAction (awd, (GetWindowLong (hItem, GWL_ID))); - - if (ra & raRepaint) - { - RECT rItem; - GetRectInParent (hItem, &rItem); - InvalidateRect (hWnd, &rItem, TRUE); - fRepaint = TRUE; - } - - if (ra & raNotify) - { - RECT rClient; - GetClientRect (hItem, &rClient); - SendMessage (hItem, WM_SIZE, SIZE_RESTORED, MAKELPARAM( rClient.right-rClient.left, rClient.bottom-rClient.top )); - } - } - - if (fRepaint) - { - UpdateWindow (hWnd); - } - } - } - } - - // Record this window's current position - // - awl[ii].rWnd = rNew; - -lblDONE: - fInHere = FALSE; -} - - -int rwFindOrAddWnd (HWND hWnd, rwWindowData *awd) -{ - // Is the window handle listed in awl[] already? - // - for (int ii = 0; ii < (int)cwl; ii++) - { - if (awl[ii].hWnd == hWnd) - { - if (awd) - awl[ii].awdLast = awd; - return ii; - } - } - - // No? Then add it. - // - for (ii = 0; ii < (int)cwl; ii++) - { - if (awl[ii].hWnd == NULL) - break; - } - if (ii == (int)cwl) - { - if (!REALLOC (awl, cwl, ii+1, 1)) - return (DWORD)-1; - } - - awl[ii].hWnd = hWnd; - awl[ii].awdLast = awd; - - if (IsWindow (hWnd)) - { - GetWindowRect (hWnd, &awl[ii].rWnd); - Subclass_AddHook (hWnd, Resize_DialogProc); - } - else - { - awl[ii].rWnd.left = 0; - awl[ii].rWnd.right = 0; - awl[ii].rWnd.top = 0; - awl[ii].rWnd.bottom = 0; - } - awl[ii].cxDeltaCenter = 0; - awl[ii].cyDeltaCenter = 0; - - return ii; -} - - -void rwFindAndRemoveWnd (HWND hWnd) -{ - for (size_t ii = 0; ii < (int)cwl; ii++) - { - if (awl[ii].hWnd == hWnd) - { - Subclass_RemoveHook (awl[ii].hWnd, hWnd); - awl[ii].hWnd = NULL; - return; - } - } -} - - -DWORD rwFindAction (rwWindowData *awd, int id) -{ - DWORD raDefault = raLeaveAlone; - - if (awd != NULL) - { - for (int ii = 0; awd[ii].id != idENDLIST; ++ii) - { - if (awd[ii].id == id) - return awd[ii].ra; - if (awd[ii].id == idDEFAULT) - raDefault = awd[ii].ra; - } - } - - return raDefault; -} - - -void GetRectInParent (HWND hWnd, RECT *pr) -{ - POINT pt; - - GetWindowRect (hWnd, pr); - - pr->right -= pr->left; - pr->bottom -= pr->top; // right/bottom == width/height for now - - pt.x = pr->left; - pt.y = pr->top; - - ScreenToClient (GetParent (hWnd), &pt); - - pr->left = pt.x; - pr->top = pt.y; - pr->right += pr->left; - pr->bottom += pr->top; -} - - -/* - * SPLITTERS __________________________________________________________________ - * - */ - -static BOOL fRegistered = FALSE; // TRUE If registered class - -static TCHAR cszSplitterClassX[] = TEXT("SplitterWindowClassX"); -static TCHAR cszSplitterClassY[] = TEXT("SplitterWindowClassY"); - - -HWND CreateSplitter (HWND hWnd, int id1, int id2, int id, - LONG *pcd, rwWindowData *awd, BOOL fMovedAlready) -{ - SplitterData *psd; - RECT rWnd; - BOOL fX; - - if (!WhereShouldSplitterGo (hWnd, id1, id2, &rWnd, &fX)) - return NULL; - - EnsureSplitterRegistered (); - - psd = (SplitterData *)Allocate (sizeof(SplitterData)); - if (psd == NULL) - return NULL; - - psd->pcDelta = pcd; - psd->awd = awd; - psd->fX = fX; - psd->idWnd1 = id1; - psd->idWnd2 = id2; - psd->fMovedBeforeCreate = fMovedAlready; - - return CreateWindow( - (fX) ? cszSplitterClassX : cszSplitterClassY, - TEXT(""), // Title - WS_CHILD | WS_VISIBLE, // Window style - rWnd.left, // Default horizontal position - rWnd.top, // Default vertical position - rWnd.right -rWnd.left, // Default width - rWnd.bottom -rWnd.top, // Default height - hWnd, // Parent window - (HMENU)id, // Use ID given us by caller - THIS_HINST, // This instance owns this window - (void *)psd // Pointer not needed - ); -} - -void DeleteSplitter (HWND hWnd, int id1) -{ - HWND hSplit; - - if (hSplit = GetDlgItem (hWnd, id1)) - { - DestroyWindow (hSplit); - } -} - -void EnsureSplitterRegistered (void) -{ - WNDCLASS wc; - - if (fRegistered) - return; - fRegistered = TRUE; - - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = SplitterWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof(SplitterData *); - wc.hInstance = THIS_HINST; - wc.hIcon = NULL; - wc.hbrBackground = CreateSolidBrush( GetSysColor( COLOR_BTNFACE )); - wc.lpszMenuName = NULL; - - // Register the X-moving class: - // -#ifdef IDC_HSPLIT - wc.hCursor = LoadCursor (THIS_HINST, MAKEINTRESOURCE( IDC_HSPLIT )); -#else - wc.hCursor = LoadCursor (NULL, IDC_SIZEWE); -#endif - - wc.lpszClassName = cszSplitterClassX; - - (void)RegisterClass (&wc); - - // Register the Y-moving class: - // -#ifdef IDC_VSPLIT - wc.hCursor = LoadCursor (THIS_HINST, MAKEINTRESOURCE( IDC_VSPLIT )); -#else - wc.hCursor = LoadCursor (NULL, IDC_SIZENS); -#endif - - wc.lpszClassName = cszSplitterClassY; - - (void)RegisterClass (&wc); - -} - - -BOOL WhereShouldSplitterGo (HWND hWnd, int id1, int id2, RECT *prWnd, BOOL *pfX) -{ - RECT r1, r2; - BOOL rc = TRUE; - - GetRectInParent (GetDlgItem (hWnd, id1), &r1); - GetRectInParent (GetDlgItem (hWnd, id2), &r2); - - if (r2.left > r1.right) // R1 on left, R2 on right? - { - *pfX = TRUE; - prWnd->top = min (r1.top, r2.top); - prWnd->bottom = max (r1.bottom, r2.bottom); - prWnd->left = r1.right; - prWnd->right = r2.left; - } - else if (r2.right < r1.left) // R2 on left, R1 on right? - { - *pfX = TRUE; - prWnd->top = min (r1.top, r2.top); - prWnd->bottom = max (r1.bottom, r2.bottom); - prWnd->left = r2.right; - prWnd->right = r1.left; - } - else if (r2.top > r1.bottom) // R1 on top, R2 on bottom? - { - *pfX = FALSE; - prWnd->left = min (r1.left, r2.left); - prWnd->right = max (r1.right, r2.right); - prWnd->top = r1.bottom; - prWnd->bottom = r2.top; - } - else if (r2.bottom < r1.top) // R2 on top, R1 on bottom? - { - *pfX = FALSE; - prWnd->left = min (r1.left, r2.left); - prWnd->right = max (r1.right, r2.right); - prWnd->top = r2.bottom; - prWnd->bottom = r1.top; - } - else // Rectangles intersect! - { // Don't know where it should go. - rc = FALSE; - } - - return rc; -} - - -LONG APIENTRY SplitterWndProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - SplitterData *psd; - static LONG cdAtStart; - - if (msg == WM_CREATE) - { - SetWindowLong (hWnd,GWL_USER,(LONG)((LPCREATESTRUCT)lp)->lpCreateParams); - } - - if ((psd = (SplitterData *)GetWindowLong (hWnd, GWL_USER)) != NULL) - { - switch (msg) - { - case WM_CREATE: - if (!psd->fMovedBeforeCreate) - ResizeSplitter (GetParent (hWnd), psd, 0, psd->pcDelta); - psd->fDragging = FALSE; - break; - - case WM_LBUTTONDOWN: - if (!psd->fDragging) - { - SetCapture (hWnd); - psd->fDragging = TRUE; - cdAtStart = *psd->pcDelta; - - GetCursorPos (&psd->ptStart); - ScreenToClient (GetParent (hWnd), &psd->ptStart); - } - break; - - case WM_MOUSEMOVE: - if (psd->fDragging) - { - POINT pt; - LONG cx, cy; - LONG cd; - - GetCursorPos (&pt); - ScreenToClient (GetParent (hWnd), &pt); - - cx = (LONG)pt.x - (LONG)psd->ptStart.x; - cy = (LONG)pt.y - (LONG)psd->ptStart.y; - - if (psd->fX) - cd = cdAtStart + cx; - else // (!psd->fX) - cd = cdAtStart + cy; - - if (cd != *(psd->pcDelta)) - { - ResizeSplitter (GetParent(hWnd), psd, *psd->pcDelta, &cd); - *psd->pcDelta = cd; - } - } - break; - - case WM_LBUTTONUP: - if (psd->fDragging) - { - ReleaseCapture (); - psd->fDragging = FALSE; - } - break; - - case WM_DESTROY: - if (psd->fDragging) - { - ReleaseCapture (); - psd->fDragging = FALSE; - - Free (psd); - psd = NULL; // fault blatantly if you use {psd} now - SetWindowLong (hWnd, GWL_USER, 0); - } - break; - -#if 0 // Enable me to make the splitters draw in black - case WM_PAINT: - { - PAINTSTRUCT ps; - HDC hdc = BeginPaint (hWnd, &ps); - FillRect (hdc, &ps.rcPaint, GetStockObject(BLACK_BRUSH)); - EndPaint (hWnd, &ps); - return 0; - } - break; -#endif - } - } - - return DefWindowProc (hWnd, msg, wp, lp); -} - - -void ResizeSplitter (HWND hWnd, SplitterData *psd, LONG cOld, LONG *pcNew) -{ - LONG dx, dy; - HWND hItem; - size_t nItems = 0; - LONG cdMin, cdMax; - - if (psd == NULL || pcNew == NULL || hWnd == NULL) - return; - - FindSplitterMinMax (hWnd, psd, cOld, &cdMin, &cdMax); - *pcNew = limit (cdMin, *pcNew, cdMax); - - if (*pcNew == cOld) - return; - - dx = (psd->fX) ? (*pcNew - cOld) : 0; - dy = (psd->fX) ? 0 : (*pcNew - cOld); - - for (hItem = GetWindow (hWnd, GW_CHILD); - hItem != NULL; - hItem = GetWindow (hItem, GW_HWNDNEXT)) - { - nItems++; - } - - if (nItems != 0) - { - BOOL fRepaint = FALSE; - HDWP dwp = BeginDeferWindowPos (nItems); - - for (hItem = GetWindow (hWnd, GW_CHILD); - hItem != NULL; - hItem = GetWindow (hItem, GW_HWNDNEXT)) - { - RECT rItem; - DWORD ra; - - GetRectInParent (hItem, &rItem); - - ra = rwFindAction (psd->awd, (GetWindowLong (hItem, GWL_ID))); - - DeferWindowPos (dwp, hItem, NULL, - rItem.left + ((ra & raMoveX) ? dx : - (ra & raMoveXB) ? (0-dx) : 0), - rItem.top + ((ra & raMoveY) ? dy : - (ra & raMoveYB) ? (0-dy) : 0), - rItem.right -rItem.left - + ((ra & raSizeX) ? dx : - (ra & raSizeXB) ? (0-dx) : 0), - rItem.bottom -rItem.top - + ((ra & raSizeY) ? dy : - (ra & raSizeYB) ? (0-dy) : 0), - SWP_NOACTIVATE | SWP_NOZORDER); - } - - EndDeferWindowPos (dwp); - - for (hItem = GetWindow (hWnd, GW_CHILD); - hItem != NULL; - hItem = GetWindow (hItem, GW_HWNDNEXT)) - { - DWORD ra = rwFindAction (psd->awd, (GetWindowLong (hItem, GWL_ID))); - - if (ra & raRepaint) - { - RECT rItem; - - GetRectInParent (hItem, &rItem); - - InvalidateRect (hWnd, &rItem, TRUE); - fRepaint = TRUE; - } - } - - if (fRepaint) - { - UpdateWindow (hWnd); - } - } -} - - -void FindSplitterMinMax (HWND hWnd, SplitterData *psd, LONG cOld, LONG *pcdMin, LONG *pcdMax) -{ - *pcdMin = 0; - *pcdMax = 0; - - for (int ii = 0; psd->awd[ ii ].id != idENDLIST; ++ii) - { - HWND hControl; - if ((hControl = GetDlgItem (hWnd, psd->awd[ ii ].id)) != NULL) - { - RECT rControl; - GetRectInParent (hControl, &rControl); - - if (psd->fX) - { - LONG cxMin = 0; - LONG cxMax = 0; - - if (LOWORD(psd->awd[ ii ].cMinimum)) // X minimum? - { - if (psd->awd[ ii ].ra & raSizeX) - cxMin = cOld - cxRECT(rControl) + LOWORD(psd->awd[ ii ].cMinimum); - else if (psd->awd[ ii ].ra & raSizeXB) - cxMax = cOld + cxRECT(rControl) - LOWORD(psd->awd[ ii ].cMinimum); - else if (psd->awd[ ii ].ra & raSizeXC) - cxMin = cOld - (cxRECT(rControl) - LOWORD(psd->awd[ ii ].cMinimum))*2; - } - - if (LOWORD(psd->awd[ ii ].cMaximum)) // X maximum? - { - if (psd->awd[ ii ].ra & raSizeX) - cxMax = cOld - cxRECT(rControl) + LOWORD(psd->awd[ ii ].cMaximum); - else if (psd->awd[ ii ].ra & raSizeXB) - cxMin = cOld + cxRECT(rControl) - LOWORD(psd->awd[ ii ].cMaximum); - else if (psd->awd[ ii ].ra & raSizeXC) - cxMin = cOld - (cxRECT(rControl) - LOWORD(psd->awd[ ii ].cMaximum))*2; - } - - if (cxMin) *pcdMin = (*pcdMin) ? max( *pcdMin, cxMin ) : cxMin; - if (cxMax) *pcdMax = (*pcdMax) ? min( *pcdMax, cxMax ) : cxMax; - } - else - { - LONG cyMin = 0; - LONG cyMax = 0; - - if (HIWORD(psd->awd[ ii ].cMinimum)) // Y minimum? - { - if (psd->awd[ ii ].ra & raSizeY) - cyMin = cOld - cyRECT(rControl) + HIWORD(psd->awd[ ii ].cMinimum); - else if (psd->awd[ ii ].ra & raSizeYB) - cyMax = cOld + cyRECT(rControl) - HIWORD(psd->awd[ ii ].cMinimum); - else if (psd->awd[ ii ].ra & raSizeYC) - cyMin = cOld - (cyRECT(rControl) - HIWORD(psd->awd[ ii ].cMinimum))*2; - } - - if (HIWORD(psd->awd[ ii ].cMaximum)) // Y maximum? - { - if (psd->awd[ ii ].ra & raSizeY) - cyMax = cOld - cyRECT(rControl) + HIWORD(psd->awd[ ii ].cMaximum); - else if (psd->awd[ ii ].ra & raSizeYB) - cyMin = cOld + cyRECT(rControl) - HIWORD(psd->awd[ ii ].cMaximum); - else if (psd->awd[ ii ].ra & raSizeYC) - cyMin = cOld - (cyRECT(rControl) - HIWORD(psd->awd[ ii ].cMaximum))*2; - } - - if (cyMin) *pcdMin = (*pcdMin) ? max( *pcdMin, cyMin ) : cyMin; - if (cyMax) *pcdMax = (*pcdMax) ? min( *pcdMax, cyMax ) : cyMax; - } - } - } -} - - -void FindResizeLimits (HWND hWnd, LONG *pcxMin, LONG *pcxMax, LONG *pcyMin, LONG *pcyMax, rwWindowData *awd) -{ - *pcxMin = 0; - *pcxMax = 0; - *pcyMin = 0; - *pcyMax = 0; - - if (awd == NULL) - { - int iwl; - if ((iwl = rwFindOrAddWnd (hWnd)) == -1) - return; - - if ((awd = awl[ iwl ].awdLast) == NULL) - return; - } - - RECT rNow; - GetWindowRect (hWnd, &rNow); - - for (DWORD ii = 0; awd[ ii ].id != idENDLIST; ++ii) - { - HWND hControl; - if ((hControl = GetDlgItem (hWnd, awd[ ii ].id)) != NULL) - { - RECT rControl; - GetRectInParent (hControl, &rControl); - - LONG cxMin = 0; - LONG cyMin = 0; - LONG cxMax = 0; - LONG cyMax = 0; - - if (LOWORD(awd[ ii ].cMinimum)) // X minimum? - { - if (awd[ ii ].ra & raSizeX) - cxMin = cxRECT(rNow) - cxRECT(rControl) + LOWORD(awd[ ii ].cMinimum); - else if (awd[ ii ].ra & raSizeXB) - cxMax = cxRECT(rNow) + cxRECT(rControl) - LOWORD(awd[ ii ].cMinimum); - else if (awd[ ii ].ra & raSizeXC) - cxMin = cxRECT(rNow) - (cxRECT(rControl) - LOWORD(awd[ ii ].cMinimum))*2; - } - - if (LOWORD(awd[ ii ].cMaximum)) // X maximum? - { - if (awd[ ii ].ra & raSizeX) - cxMax = cxRECT(rNow) - cxRECT(rControl) + LOWORD(awd[ ii ].cMaximum); - else if (awd[ ii ].ra & raSizeXB) - cxMin = cxRECT(rNow) + cxRECT(rControl) - LOWORD(awd[ ii ].cMaximum); - else if (awd[ ii ].ra & raSizeXC) - cxMax = cxRECT(rNow) - (cxRECT(rControl) - LOWORD(awd[ ii ].cMaximum))*2; - } - - if (HIWORD(awd[ ii ].cMinimum)) // Y minimum? - { - if (awd[ ii ].ra & raSizeY) - cyMin = cyRECT(rNow) - cyRECT(rControl) + HIWORD(awd[ ii ].cMinimum); - else if (awd[ ii ].ra & raSizeYB) - cyMax = cyRECT(rNow) + cyRECT(rControl) - HIWORD(awd[ ii ].cMinimum); - else if (awd[ ii ].ra & raSizeYC) - cyMin = cyRECT(rNow) - (cyRECT(rControl) - HIWORD(awd[ ii ].cMinimum))*2; - } - - if (HIWORD(awd[ ii ].cMaximum)) // Y maximum? - { - if (awd[ ii ].ra & raSizeY) - cyMax = cyRECT(rNow) - cyRECT(rControl) + HIWORD(awd[ ii ].cMaximum); - else if (awd[ ii ].ra & raSizeYB) - cyMin = cyRECT(rNow) + cyRECT(rControl) - HIWORD(awd[ ii ].cMaximum); - else if (awd[ ii ].ra & raSizeYC) - cyMax = cyRECT(rNow) - (cyRECT(rControl) - HIWORD(awd[ ii ].cMaximum))*2; - } - - if (cxMin) *pcxMin = (*pcxMin) ? max( *pcxMin, cxMin ) : cxMin; - if (cyMin) *pcyMin = (*pcyMin) ? max( *pcyMin, cyMin ) : cyMin; - if (cxMax) *pcxMax = (*pcxMax) ? min( *pcxMax, cxMax ) : cxMax; - if (cyMax) *pcyMax = (*pcyMax) ? min( *pcyMax, cyMax ) : cyMax; - } - } -} - - -BOOL CALLBACK Resize_DialogProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) -{ - PVOID fnNext = Subclass_FindNextHook (hWnd, Resize_DialogProc); - - switch (msg) - { - case WM_GETMINMAXINFO: - LONG cxMin; - LONG cyMin; - LONG cxMax; - LONG cyMax; - FindResizeLimits (hWnd, &cxMin, &cxMax, &cyMin, &cyMax); - - LPMINMAXINFO lpmmi; - lpmmi = (LPMINMAXINFO)lp; - - if (cxMin) - lpmmi->ptMinTrackSize.x = cxMin; - if (cyMin) - lpmmi->ptMinTrackSize.y = cyMin; - if (cxMax) - lpmmi->ptMaxTrackSize.x = cxMax; - if (cyMax) - lpmmi->ptMaxTrackSize.y = cyMax; - return FALSE; - - case WM_DESTROY: - rwFindAndRemoveWnd (hWnd); - break; - } - - return (fnNext) ? CallWindowProc ((WNDPROC)fnNext, hWnd, msg, wp, lp) : FALSE; -} - diff --git a/src/WINNT/afsapplib/resize.h b/src/WINNT/afsapplib/resize.h deleted file mode 100644 index 63ca2213b..000000000 --- a/src/WINNT/afsapplib/resize.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * I've FINALLY stuck this in a separate file; I must have twenty different - * implementations floating around these days. Anyway, here's my generic - * let-your-dialog-resize-and-still-look-cool code; an example of how to use - * it: - * - * if dialog looks like: - * - * +-----------------------------------------------------+ - * | | - * | [ TXT_HEADER (can resize horizontally, but should ] | - * | [ TXT_HEADER retain same vertical size. The ] | - * | [_TXT_HEADER__upper-left corner should not move)__] | - * | | - * | [ ID_LIST_BOX (should resize horizontally and ] | - * | [ ID_LIST_BOX vertically to match changes in ] | - * | [_ID_LIST_BOX__parent window; UL corner no move)__] | - * | | - * | (upper-left moves; don't resize ->) [OK] [CANCEL] | - * | | - * +-----------------------------------------------------+ - * - * then define something like this as a global variable: - * - * rwWindowData awdDialog[] = { - * { TXT_HEADER, raSizeX }, - * { ID_LIST_BOX, raSizeX | raSizeY }, - * { IDOK, raMoveX | raMoveY }, - * { IDCANCEL, raMoveX | raMoveY }, - * { idDEFAULT, raLeaveAlone }, - * { idENDLIST, 0 } - * }; - * - * in WM_INITDIALOG: - * - * RECT rFromLastSession = GuessWhereWindowShouldGo(); - * ResizeWindow (hDlg, awdDialog, rwaMoveToHere, &rFromLastSession); - * - * in WM_SIZE: - * - * // if (lp==0), we're minimizing--don't call ResizeWindow(). - * // - * if (lp != 0) - * ResizeWindow (hDlg, awdDialog, rwaFixupGuts); - * - * if you want to, say, add a status bar (which mucks with the client size - * of the window): - * - * AddStatusBar (hDlg, ...); - * ResizeWindow (hDlg, awdDialog, rwaJustResync); - * - * if you want to, say, add a tool bar (which doesn't much with the client - * location but should): - * - * AddToolbar (hDlg, ID_TOOLBAR, ...); - * GetWindowRect (GetDlgItem (hDlg, ID_TOOLBAR), &rToolBar); - * ResizeWindow (hDlg, awdDialog, rwaNewClientArea, &rToolBar); - * - * - */ - -#ifndef RESIZE_H -#define RESIZE_H - -#include - -#ifndef EXPORTED -#define EXPORTED -#endif - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - // rwAction types: - // -typedef enum - { - rwaMoveToHere, // resize window to {pr}, then fix guts - rwaFixupGuts, // reposition guts to match window size - rwaJustResync, // recognize new size but don't fix guts - rwaNewClientArea // pretend the client area changed - } rwAction; - - // ra flags: - // -#define raLeaveAlone 0x0000 // don't modify window during resize - -#define raSizeX 0x0001 // increase width if resizing X+ -#define raSizeY 0x0002 // increase height if resizing Y+ -#define raMoveX 0x0004 // move right if resizing X+ -#define raMoveY 0x0008 // move down if resizing Y+ - -#define raSizeXB 0x0010 // decrease width if resizing X+ -#define raSizeYB 0x0020 // decrease height if resizing Y+ -#define raMoveXB 0x0040 // move left if resizing X+ -#define raMoveYB 0x0080 // move up if resizing Y+ - -#define raSizeXC 0x0100 // increase width by X/2 if resizing X+ -#define raSizeYC 0x0200 // increase height by Y/2 if resizing Y+ -#define raMoveXC 0x0400 // move right by X/2 if resizing X+ -#define raMoveYC 0x0800 // move down by Y/2 if resizing Y+ - -#define raRepaint 0x1000 // force repaint whenever resized -#define raNotify 0x2000 // notify window with WM_SIZE afterwards - - // rwWindowData types: - // -typedef struct - { - int id; // child ID (-1=end list, 0=default) - DWORD ra; // what to do with this child window - DWORD cMinimum; // minimum size (0=no limit, LO=x,HI=y) - DWORD cMaximum; // maximum size (0=no limit, LO=x,HI=y) - } rwWindowData; - -#define idDEFAULT (-2) -#define idENDLIST (-3) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -EXPORTED HWND CreateSplitter (HWND, int, int, int, LONG *, rwWindowData *, BOOL); -EXPORTED void DeleteSplitter (HWND, int); - -EXPORTED void ResizeWindow (HWND, rwWindowData *, rwAction, RECT * = NULL); - -EXPORTED void GetRectInParent (HWND hWnd, RECT *pr); - -#endif - diff --git a/src/WINNT/afsapplib/resource/CELL.ICO b/src/WINNT/afsapplib/resource/CELL.ICO deleted file mode 100644 index c1be703fb67fd699a5d4d97f4356ce2fc388f6c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb_b!Aj#$6g}0Tn=tJkOmQKl4E+EpSTrknUoq?MU7Bw(;^GnX7s3#_D3AIJ;%bo4 zb}(zMB0e)-)1Lpel3B7}e zE0D7GV@pYrNz;1c%8;I-C<+oj-0)rzotIKtzQqz+Ymi_ok(^w#6A^J)GBc@LlH@oy z#xT*~jJzrWj*Q82=Ts0HqOufLLBMRazg%6QhSJ${@+_zam=hry2Lyh;pb@h`*v!Y( zvZ^+`n;#5E%NBosFtnoA*yie=XkL8n@2+f~bAG^BJ>FkctDL-OVBwec z+HYvYRaJSmn@ONqpx5K~y+Xh_?~U0&;KuuZE%=3y8hEpH*ZX2SNaGnedjbw0fS>X; z(3Rf;yPtVe*Ys(IW(B!vww}>4>0HY1(;J-^j6b%Nq9&74-`aFB_)nd`>MFSiL41@2 zVU>GX5R4h-5=!LkSPF|=HrC0;f9$1>EdFhWQ=Rne@jTZNO;?r;z|L&u%7Sk-ox1v{ g9!`lGdpZQxUEp>XDENP;{Lkg@t;wrKwdzst3q;}}uK)l5 diff --git a/src/WINNT/afsapplib/resource/acl.ico b/src/WINNT/afsapplib/resource/acl.ico deleted file mode 100644 index b7d0aeda12e1d5f461f8c50cd77c41656cec4e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmcgsyK2Kg5FFWoGZ-TOfmH>U1{Eq&IG-d?aRwK@F6#6v?o_1E75NaCDbv|t!(~>d zmyJRKfvhyQH#f`bH76jz1W~kr#K#19VqPpfUj@M96j*UBB3_694;%r*+VQ9Wo~SCH zIC2VWEsQY~Tz$ehnGrl>NrwAKk~m)Xi_91byc<$wnH!|`jTHch6C%bgc@cmL%-@#COAHZ@hI1<;N5wd1UY=}MK zt_ZqUE=_v^RQjL%k(Nj8%CIk*@1+`k*rkuY4dcQ}%t`7b#0UvTD^`2xJ9f&Ksh diff --git a/src/WINNT/afsapplib/resource/aggreg.ico b/src/WINNT/afsapplib/resource/aggreg.ico deleted file mode 100644 index dc8b1326e786358c229f88db5d40142621056484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmbVLF>ZrE5F8v!P*}EqV5%s;unU*`C+>1ZBq*Zz3Hizul!!M_ra<^g3dCmiz&4hU zB6;!L?(EE+CD;Q3ED*Hau5{r@&ctb&R}iTjkl6pBYn5y{{&^$al3-$GBhmD)NqzudB`A z7&*Vx;JER@aic8gm{P1C>4P>UoPjZRB3&rr0uhT3PR6bSLcZ9*{txx3f8Wo5XYIuh zj_0;KU-&=rLx|{{>*UA8bGuKqtoz4@7uhTi{ z`9cfM$E6BGkh?Ht!N{^OTr#(9v diff --git a/src/WINNT/afsapplib/resource/aggreg1.ico b/src/WINNT/afsapplib/resource/aggreg1.ico deleted file mode 100644 index 9a407868dea3ffad75f214bbebddd5e73753f5de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb7Dy-tHr7(J-TWiX{XLpvGYq8&Q&Fl=?}-AY2DkI+}JlQs0*9(BODBZIZd0UHwNH|T6Y}lm_4aVwGvI`L8@D6+5?BCHxQ+FZz6o4$ioh rDZT8b|6uYLp$v3WdD)Aa-}P__7Z`r)f?9br5erAO6OXSMa9RQ1mu@xH diff --git a/src/WINNT/afsapplib/resource/any_other.bmp b/src/WINNT/afsapplib/resource/any_other.bmp deleted file mode 100644 index a68d5950640de398ed9f145efd4bf04d00b61996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZuqxe>!K41@1dv9d0mC-4Lrz`fT=tx@QfQ)n{2_ENbLDZYP6Hj6# z7Cgwn2>wSM;6?BGkSU3dF$OFMV;a{7Wl;*IHx!)p4 lzFJdXZDVR`c2aBRh{B|NPplk^MeOom_Tb)?qv>;N`5$=_X~qBm diff --git a/src/WINNT/afsapplib/resource/bos.ico b/src/WINNT/afsapplib/resource/bos.ico deleted file mode 100644 index 7f570f93f129b271e1e37f3c64f8bca57d719861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmbVLv5wm?41M+$u%MyJP@qcz3m%F?ej@#(Z1yPN26NLd1R1^DFL=7|$k^$B>U&lA6h0$;cSfw3P;AW0^K zRdMB(2pGqaL|%T#S$6~A~D~4aG{d`iD|1pr7jpjOk06mNe~kxS6bg>+H6Totk?rw zRGWU<+N7Bh_bcBnrwEN+34LGP)sBh$0J|fY7Ax~YCI}oZh)+Lnn1@4eg=lNTm zZ$J1xiq83t@Wg%2NA5qCz@a9?xn2}kZa+QeElY9m&_XY^>o}Ea_vqC&p*4#(I4+|{ z&50UL5Eo$ifTLoqMT~K=1&P-~p4pG0_jjv-`8$xFfD8ZUsz(O$d*Y3FAqx5ma;je# J`^Fs2{R8P9=X?MF diff --git a/src/WINNT/afsapplib/resource/error.ico b/src/WINNT/afsapplib/resource/error.ico deleted file mode 100644 index 7f1bf26658bdb585bdc124c66ff2d05be8a24bd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcmaKqv2NTj42J1k0pC>Dn?2c6k+DzE%bQt27OxpS-J?`}69Zj3daDBjQNN$E@0uVD z?t-A>c=SnrN|kOYP@iq;W~#%t~n zhj6h)wKXKX#=)SUo$}-f3Mb6zoLHIwJ|~$;-e&YTW_C7XOGvhdIZ+sZ$k;FhueoCp z6#gH6%ZI+z3oTiM_w#f=x8-~1zTWP&A7+38XPDFU#PM(6N6+cOy!gnp7sn&vf8RS# z)FoqsX5062c241YZqc-sDMdyh*zjW3J)2dlS-GII*#Rvg8nQB39}3fZ;U3_YG1sYP zYE$z>ZO$o}yhBQJmu^Yu(L1!@=dx`XTvs0b3S@ONL;Os&7o&?%(TTMC@n=4Dzn1US z&*fA;EW<;&4zXH?xm$ZrE5Jd+QDP7DFs3PCOxfOJ#V=Hr|?b1Zb6;h^%EK6x9ER*+H0lUaj9A)gk zGk^bQkUV3v%r;h*g(*HaX3ylJ2z-~BJ>_OQ?n>|iGJD`OYw+HV1`(xcLgJ(Zjd|}8 zhVg5|pbGHOm5#fkN}W~p7GG2;hsJuF^17~Ly&YrmBP-_qL2qXsx zCT3O0ETg!VNLj0+tepwjxj1Xs;+mndhNsNX#)&c=7(AK6@X8JU>kBx8kKgc!XAAcD G8N?4x0T{FZ diff --git a/src/WINNT/afsapplib/resource/fileset1.ico b/src/WINNT/afsapplib/resource/fileset1.ico deleted file mode 100644 index b85104e96f281b141142ae50e374c5b298346684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb7Dv2MaJ6ugv5$yC@gG*iW2&`-(+8{T3mLq36DfQcdx^#@eyFEDnf5K@;&Akurb z69S@Y``~=OceWA98HjL)EE_@U;|_Qtk49dPBj8~GjM>YGXClHqM?i7y?NT)9DCLPG zr-XvFmPX^gXd0Oj{76fNtBR+2p7(l*amCKmb*WdWF_hCc*C<6VDO-Iw7_*E!oxE;R zBX;l;vssvY)@hWh#YPzYii7N^8 z_I8KibIbYd zQVca6=GqZQPXCqjHs5WoyF7;+qjdRYNL+5oF0cGi$tlU@Q&@5t*k71(Es_fY$G+{G ciubx-q6LsCb}`WJ39IgOm^i9`VE~sv9s_aO-MR)YuFs|07rql zciekC-u-bckk*@gCQihWD6l63Ht|1F01uSPflNs#SZkRG=^%ut2<~W+rU?Ys$cRm( z3-vfSu~pe0T_;}i+&KD&rR$!vUn}Zn>n^5+jBgvaNbMn$zY}#U%U;Gl%gwaGXFaUc os_zm1a@3&&YdC|^AEX)%Vs!97f2s{@a}5(lBleHu0vwL|3qQeSj{pDw diff --git a/src/WINNT/afsapplib/resource/foreign_other.bmp b/src/WINNT/afsapplib/resource/foreign_other.bmp deleted file mode 100644 index aa35d3bcf21319bd5259115932ab9db670ae701a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZvWu?@o@5Jk@-h2;W8$`UD&kmAlo`s|V_=`1E-25P2Y6eJ2$v4Z`5CsGCYpT}_= z_k2AD;_-psp&N9C2D-qB68k@ML|EjUY;YjtD5ZppofqxCD$&S+iwf#I3Qyt+Z@A>(V(ir50tlPC$mSQZwp? T$MSCs+UwpAXZCKK$-L dYNQ9&>pkoQxYv)|sf>rdwRX6^MV1qqe*y7TTbKX< diff --git a/src/WINNT/afsapplib/resource/group.ico b/src/WINNT/afsapplib/resource/group.ico deleted file mode 100644 index c68433aa95e27ceb117c032edddd9ab9cad8f7b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb7Dy^7mF5dQWQdj-bAZ(vv9`fCg>lt;Kn@Dm6@ibm{aW0NizS)&y6Aq4y_3i98e>>8S0fQSX7Bi^)x&hu(&t{R|8X!x6TiO=H2g2YT zR|;ca7YFcxb5U{SmT+j>mX1C==zHA}{HaNowA@k$TqpoGd-iu<*1b8%eqP52dCQF&6tL0NXtMFC?AM0x1hfc^h%l=FBujwxF zkcV_N(F@p|?Zym-GvX8Z(0?$bq^DTn%!dP5fF(5kAODcf^C)S>fMYz5w1o0dFSw=b zpMM0mHY8RoyD87-l~()t>LS;UZO!~k1EqaPkH_DC6U1)o)oQuD6xeKM5uH$_>zeiN3`B=Z^0fq+_0oFw~ZqcLcwfA|cE(aU4LOAu!iyNABL$B0o;_}vqOK}x9Sy!cH>fJ7{`92W%B1?HcHk86dGff~Dm~xZ>iUA_IJmh;i)G(2 hrZrf%iImRd;`pC;v;}SQ-kGQHT{|Q4l5nnUk3Ynd6VLzv diff --git a/src/WINNT/afsapplib/resource/ic.ico b/src/WINNT/afsapplib/resource/ic.ico deleted file mode 100644 index daa687d92096cc5ba87ead8fa5b258862e1125ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmc(bJ5Izf5Qb-2q|hxDZBkMqaR4|{Bnn5`V%-JF1;^QxISM5uU64Q;z8TxAfVQCH zPsa23=i#x)hOg_c#qf3^a)Z7_I^+@A$R(#pggcK22@_*hoR~JNSiVW|8>!@Vcu`ZR_xc|xw|1|^~JHKFup1PQ}*SMFykgpiW?Hos!U+nQ&2Hamg$ z7@i$@L;S{{YQ!q=0X$4aL-kS})0D30Q}5r#mpnv~mV#Z8E&4CgtZHg))ot9W&fMvB Jr~2NiegoQC`bGc% diff --git a/src/WINNT/afsapplib/resource/io.ico b/src/WINNT/afsapplib/resource/io.ico deleted file mode 100644 index b2b77468bdf69284877461067ae497c7e48122b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmb`Fy-veG5QHZI$wDBRiqiO(xzZ27Lr|u4M-WKMY|eXj z5g`i3+4D`ln_K?@D;{Ne3)5i@-0^(RDp^mg6)rgfLUvw4NFowX964nPhG8Jk(+{dP zWAU)RY&fHAYm!7VE>!)^qdDf*F)AC6z|!m6&GpiMM{a?as;V~ndbK8(2cQih>_2sc zPQLH^F7}`K(mS`?^}O+28@=<68#=G4mI3qRu>k`U4}05yfyAeP^SEHwIFB22{md=U zgv6~0l{jzG^cQZI;^OmaPVZ)G``0yn_GKG)oK3O^7@pm60mC1&1(;i4l?%RFFMbk| W>QR7#$^0LyuvP=F={;8+3)LUA_Xi08 diff --git a/src/WINNT/afsapplib/resource/key.ico b/src/WINNT/afsapplib/resource/key.ico deleted file mode 100644 index 13a0fa0789c762cd9635be0341aa0bd73f98996a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb_by=uci43^`9Jr$4L;;CdTWN^nk(m{sHmTNPdHV=Iv7Ye0s(lJ|Z2&kWQaq2*z z&{nZd_xVwtF*8MSRg8lN+wd(@`Mcu^4DmP8A1Epmk{=mskS-s=&Fa8U@kV8s?0 zXcz_vVi$?%4vC*qy8Jb~BkD?5p=i|Xfp@M_Ua{MGzg&0ZGf}&8sR4r#&{;!uCF;o5 zr?L?o3?Cw}5oG?PIs)SJg4rKp95Hmyesk6p^1;V&@+;)zH=|!+jsBnpoCio#Jta`4 z!vMXfzV9df`;?L-oR2WQ??pJV-2i^5!XioU5VYSQ2z3CTV0Hi#{5cYFB|h|?;ms7g@~bel7?2>J8I{s6(*_Jfqg?$`b8emqmw2B6?lqD zjx@*UZAD&1=e$9-$Z^gC_SYleQJ~;&w1O2|P(%e20J>C)c=_SxZzy=(20~oN{Iu}4Us|=S7{Z~3L$u4KeAk9 z!=dEL90A9r^8{ZqOJ2LeuX&CJww(3D_MS4V_J=JR+xAxb_h=+n9!Ik4djJ6-OABWB d^EiE=8D+`8emF#CYlfjXq1?|`@pz|i{sI^TW{&^> diff --git a/src/WINNT/afsapplib/resource/local_other.bmp b/src/WINNT/afsapplib/resource/local_other.bmp deleted file mode 100644 index 38fa76a3f95c2de6ae3f7df397d277ad19bda4d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZ?rHDhD|gEAng0mQ;UEC9re3@kvBf#Cp{#6~nQFaQxlLj!~Yl0YU9H!vJHZ~!Rr zAB-6O{|B*v7zjZ^Kw=e;4+2~Z7#J4(=m3KTFnh*~6YT{R5H?V_y&S>@Y65`|KsCsE rS3x*jt3culAjUx0J!gQR0nR?+17p8AgUmhy7k`JM97{P?XZ0d3TnmuKpg$0spgtVVef*Z6$=<=F}maqJD836!_ia61=@ W%`v`}Rc9LGZoAqawq0axxBM5S4qRve diff --git a/src/WINNT/afsapplib/resource/locked.ico b/src/WINNT/afsapplib/resource/locked.ico deleted file mode 100644 index db4d5dced882b961b21012035e463cdcbda01169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb7DyK2Kg5FA?u2?CM-AgY2(gBn4KXD9sk^dBePbwcDY!DWm)=p+$^55=}f}ikLVty$Yt5_=qEkT%SiY3wI@k&DV7;op!%s^f`4IInb+W^Cn+K!pWPBCp@jC+EMwR`jq^D z;)nvh-S*Nmg}Jg;#UB=-A@G0^fkPU`_0Phut9{V&azIuL+13f+0Q^=O;wt zbHn;{D4LoIeeDuYmjCqm-r$X~8$&ln-WwR+xIpX-%j}HG4|fJ-7GpAf&orRx({z%3 XY(rqp=i2c3J_pg?R~=+WP{+U*26qd$ diff --git a/src/WINNT/afsapplib/resource/mask_obj.bmp b/src/WINNT/afsapplib/resource/mask_obj.bmp deleted file mode 100644 index cdbea65842c68b8539d7ce6e7ca5717865b3fff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZvWu?@m75JfK%QY2SMEWrc}K+i5z_>=~BcU@MXvvgBHp43Tx|yH(M_#wxb&R&^O{IsWGh5JGO8 diff --git a/src/WINNT/afsapplib/resource/multiple.ico b/src/WINNT/afsapplib/resource/multiple.ico deleted file mode 100644 index 8dc6b62837834589486dfba03ab978ae64cdb05d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmd^;F^m&{jL~_xO*$ zEyXhA)mr<&cL-N+~DiW2GKK&OZ5a z0eY(0=bZEgtNjH+r~*8~ssIc6YRPN8JeQHM1?z(<)>k+wuCNj_sKgDN8vn#;bncHi z#~mB7$`@(0`*;@F;VXRks557I!P&G`jZFiO@w7){px#Ey=*#FJCJ@u4exzj025o6vR2vjol&`5CEGo@5|uqT$w* ZORpm5jY#DEj=bmp`I&k`_l;hAe*hz!NsRyi diff --git a/src/WINNT/afsapplib/resource/server1.ico b/src/WINNT/afsapplib/resource/server1.ico deleted file mode 100644 index e334d5e6901b893bf3ee59a6d637832eecc33d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmbVLJ92|C6kP1gh$^9{fGU$)BuApdoz`UpOZ-f*+A&_z|kEs%oL7y^mQT-{*agxu+HW%4Jhad%5(&qmaHI^B!Xzg|t8J z`ii`oI@zp&z_ygF_sx!`6IYG;M zPbo+T`9wnpIoKb<8mar|G6~vqc~CyifyR!R24O)(_(tQxUs)%?3BZ9P0b4bSD!d?O8njD(cjV6 z(a#7z27-Tq;9F+zR~{-pWn#{)Wbx&cE6HdNKFwJLIf$C?^)iGD2EOZplL|OL00LVC KT%Uo@E${`BMo6mw diff --git a/src/WINNT/afsapplib/resource/server_u.ico b/src/WINNT/afsapplib/resource/server_u.ico deleted file mode 100644 index 3956786f56df2113411e43c36c04fe082a38699e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmbV~F>b>!3`OatfHl>=K|B>XMvvsp*`h7ly!JRgO2>}gtRaBmq%o*)tLvtwimyiC(XAlYA1 z(iz~Vk`6zt9&~xY8_as0uf<6yE!W2T{lg>_H7GASbW~HJ~H!@qzXm_=?>Huwb1gHkjGyQgNKx zj--9wf)12EpO`;3Pg4`&Ud=Hw1%K%C(%_}Boi(&bZdANA@P>0YV-L4R#an}JJSR&z UP9vhzPeH%#)+TQ7ztGqD0z~FeegFUf diff --git a/src/WINNT/afsapplib/resource/service.ico b/src/WINNT/afsapplib/resource/service.ico deleted file mode 100644 index 410e1da441b011754bbdbffa2ca8d1eace2fe85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmbVLF^(HC3>^CcEUS~dl-?@1UtFH#PAb`n-F|7Gk}{=AAuy~AcUO07!?@yTQ`Csm zhz7^N0Y{AE32uLnz%RzrX~k~`;PnM~}XXRM)_jTe@PNXC~V6 zMQgsJ^W#Upe9t7^-y8A+-sMFx#K?lJ##B;_DIr~!OJl#L(s4$1EE>4;5+^CSol)~eER}CG1d}4hzehM0>awQO_*dxq&S|u z5`tw}m`M4Hl=MdMqai&W%($-W?qYV%wnxY>r+G%dMMmYn%&_y1kC}YW+qc)#4Ch#o zYwY~`Ja^9ZJ^DOoygdIlfEk8Cw8?lmMXnZXNyA=FlDto$q?LEx`zhIV#`t2rz)xY_ zfn2P|6xIf&^Wv@eWVF9c!H~h*$#4hMQzB=aT$i*_dC9vxfpz)!lPM1-2B-b~*1r~~ z^Zhp8M&r2PuyU3>h-h_|6I)u z_h#cg`^R0Xq6DB}%O*)ieO_>A7H;)k&;;O2H0-OWnX4Y5@hkI+8|&3;EXUhJbL;DK zx;AMC1*ked5-qXmeBu3b6N;J{>N-1~y#ANYH+^rq-t>&3W6CepvwM)ZPtvq}DLMfCJQv_q_fzCu^D#z@4#E(;@x40D<=!h|yQ zeUF61KZ&RX#ZN;z{1WHfZOm-9+v+Cp)^*)8nR*OaxZR=3n>&Bbe;kj;&&oLf6k{j9 zuBk@dxW0ptH%-H{FA|KViM~<)-Fh!U(+R-d`&Pyt@D;{0`8G^FP|e0u8&Uz1+_N|A zCD#H*;2Ypgo1+J^t@?<=*Cx$y&Aa#&z{T}#p3Y$iPV4)rzGbKT`)PkOiuiaqTadDRQ>I%_P(%dEK6b}wgaHYu)7dA@;` z(23_g>}6q)8X539P8ebSljpdDNc4%|iP(vdhw3^f!cN4U2|E)v5)@5oK)YIgR(gMD ZoaT@d1-$PQ-gyu3l4?#diq$o`_6L`u3d8^a diff --git a/src/WINNT/afsapplib/resource/spin1.ico b/src/WINNT/afsapplib/resource/spin1.ico deleted file mode 100644 index a9f85d915a5afea51629707d898fbe7d8fad9c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHIJ!lj`6#nv4EF$q#JlANF+cmp)yLWqgo85qi7B*T~USVMo1QCmCgu^Nbholfm z8H7NJ6h=j{P>B{cXCuKPl>`e3q>6=L`V{B)W_Ry4*VqPP~QL+d6pNL!HUjcMfY(`_izGJoI;GK2KQhb zR5O*l0YdafqY1vNm|N>Fs#p$fdgHonIa7eSe8uPzN*(S}q4o*O8-Zy206i zZaL6{00v!jM*Rky#vJOm=itpXaqa#?+-kPqH0RN1%_C?n&=*mkU&N@kkIAb)ar4P@ z+*?>g<*gm8 zZ0}-i=MUcP{>8_=eeCUb@nUuLzkjE!`q+*;aAZ4RS$47HIOR&kt5*G55C&lwMPYC$ z>4;^QijLzdp0r{knwRiK!7!%F@qWce(d?`U&c=c|ZQ3bwzl5KW;Ip(SJU_sDo=<+J z$6x95MW^gmJg@4<$IJF8a{GKQzR&a+AR-@Rc(tGP`AGmO!m!U5N~O3y5imosAiUg* zPd-h670$>RY*R1)g6vlfUMzhr5+LcYU#kUt{7M`i22J=_AUX1-rTsT8 z^$SS=i6C9zQ}xD@{ibDFwyjQZD@s6#R~=7im?}UjUAW2YBEM3U5z=YzZ q2oc!hxq~z=PE1Y65z+@UpLQi9I&~tS*L6LgKXWqk^>}$mI`9v2Xaep4 diff --git a/src/WINNT/afsapplib/resource/spin2.ico b/src/WINNT/afsapplib/resource/spin2.ico deleted file mode 100644 index 6fac82d59cfce82547c8f2aed57d170a5d0d97be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHGJ!n%=6#n`%#Ggtmm_949@AVPmOY_J}UIqgWI=FPqpx}^2oU#-;I20vA2bGQ; z3}onF#3hJ`gNP8f;?PMtNug661iN>L-?{hQmzP*@@(1jBIrrZ4zVq{)^KO6%Ov1L) z5cxU@T;XopVgWBxz_}^lD$h3c26Y0{Tq*QDURnTuXtngll}GgZeeMDb)DMG!oTz-{ z6_+p}0kMP`j@#iF{;%2Ne8+9lAL(z*7WX7BX2Mo*!dCFm)^Kb`rm>BQDK+5O)JcBl zdaB(XNk49nfPdZ?z306ABGY>Nd2NALo7&PFS02?p?|&>#cDn(;(Zu!pD_Cx>!fURfzPg6;>N<4;wY3f0e6)$> z#~s{x(nfu=i@VRLogVIqc6(@cU!&Q3iX&$qUI`9EdXCvq}@|8@ed>*n(LLZMjneLpA#VGvgNg!9ov z2jQV|?xyoZ$wqUQ6Inex|R)c;4Wy&@U+Z z5+6B)OEE6|41ZG~42JQexTFXja9UawrrFg$q$}ZVR?!FA4>gkS-|sVKi}ZkS6IMEIiLW zKa2)0i-V#-4{^D8CJ7@;TsWv2Zf@T6ZJaJ;7qZHM9`@W>^Ln_?oX%t{%gSVCM-vY{ KPELPu0zUwh^#bhx diff --git a/src/WINNT/afsapplib/resource/spin3.ico b/src/WINNT/afsapplib/resource/spin3.ico deleted file mode 100644 index c05be68926918a503a462586ef66b8916572af47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHHJ7`l;82-{0NsHF_Xq)tLlY4WMG>@C)<^g7N>M9g*a1umB96A&y5i@j>4jnpJ zDA>V@BAui-xWqvz4xOZv6gt&GuzQF2{pZ}9+ysh)pauKq{^y+ke&7GhNq`UrkVr(h z58?X&kOpXjb{Mb2z~~?_EAOb+slro2t}hWDM71;lK4>=e#+663S}pDZwAF)lTTWDd z9KpzAoBOmz4x4#Ut~ycY7KD}Rni2nHnpiYt~{!H-ul+U(U(`a zI-Mecal#TSf^a0lJxVpHS)7kX5ssRQcW$JPNw?1T^N5%W$ltt!;=M($tJ}0`sezxc!{EzJ z#bU{IUH*^Os59O~lD3`BWOEuX3tUs;_;@l+|9q}cpnF-t^*R~VaZO07_=Fv&R4P|0 zbgxrtegcit-*LMB65*QfZ%h2V=P&8Sy;hSyI7-r%{JK8ouPB1#&v|&#&ZNbk{gv3C zv?s9J@wZc+zZ56|MBJ*E-%|da1Tq0q+^Xvhh5=yb?jOg}YnoOVx!f+@>KE69lODd2Ob9tEp zDJ0E~dhRd{sX!6P$Q2Z&;711xlNo#hzvn!koY$MgFyh3!1YrbW7zP<0fftElcZ1V^ z$}mhJNRg>@CX?w@t}C3HCP7kINlx0H>2VhSDKbpMwBnW(k6qSI!S%{`EEb!bjK#(~ nJqO`aalUZzVE~4qaUH_f z0U!ZT2X#N*`hl@QASGuUH#mf+gj`oNZe-X}2Kb;{winLaqSkuHcSt!)@JBUENhNs2bc>Z6|*+ z4_CWc!_^nwgDS!b6$RtA$w7?kFyLVW$CZdBNuHoLRJ*?E~SlxYx)x8GR>J2=p@8enH z12!55*xZ+Kh?fVSP&qup_Td-2KKh2*@ptSU|3v-ADNasXc(b$f+wYVGoXdF!{@V^j zqOo`)k;-JUIn%PNd_kmCC|q?q5{ZoDdanI-8;``8KkZe1j9+x)Cq4G8 zPvzInpEWwTs$c4J0!V@KU^4IxG%Uk4d4p{U>g}At5k?$snd>niGzF$aWA0OD>0 zdY}tB$>p5l=_4c#7=caXYa~G^87Fz-S3+Tzz%KAbXEK>|2S!jFFaocER3Vb|zz7DX zm4_JHLqu2xH2v+bJKq5Q3p;$#Oby**)&86C;6uuIquo u$XMs_Y<8pam)T!5W1%l$a?)oQ3kya+Yk>`)Z*sg3VO;Bn^fCBb$G-r32L}WI diff --git a/src/WINNT/afsapplib/resource/spin5.ico b/src/WINNT/afsapplib/resource/spin5.ico deleted file mode 100644 index 8d561daf94faecb6b8abe7b4b459233b2caac6e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHIKWGzS6n|-}q+;u#B&4;y{JSLHrI))ecM*#qPU2P&r;a*^bS&Z^N`_8Sq(cV- z1v^+#q>~f}mxv(6p_6oyLZ>@B6-MFM;UbpkiP0zVF`se($~C_i{;y5;Q=$ zoPm9az77zTi4YUwB)v=$jSdoB;Ct|^aOOz^H!=ek?8=%%cvG{fHmta$cDs$8fsTAr zr^8opy!aNDAZ9+WSQzxiK@a}7#l3oaW61A1Ur)^RIL=`#mT)YV@KLPb;b?v`Y_(cC zj>4ruc|(T7fR|JiwIYs(zvWraZJp-ecVE4wd#^WW ze&ZuOe78vp@3-jj=4V>o+J^5?YkQYgcJ^p(_ZzM6eWy432eg0Cq35fszxcGX411oaOE?TeH^Pf$S^L!xy zH5ypLv?3H`{VMQU%@ZO(@dhjm#^N~gUDxycdOgC!OA&5WAW!A{Q9kPP4;-v$>He&b zaV`Kja5P@DDrMHM^+^IB@G##hY5gof)YTu02z37f8n6I801)ayJ;0c>e&D4F1_Xt2 zLKuO-l!T|xUnp1>aEDLeVg#P=`vM-#ub>M=1TetyylDP;;OHO~$j=Bh@N&!f6fd^^Z)=_cfpEpgGP$+VVGAM`2m4pcnM$1bS$b+ZH$BpiFk&QfIS~3(NCAcQZ;*iX P$(1epHtr|rPv8Fm8^aBJ diff --git a/src/WINNT/afsapplib/resource/spin6.ico b/src/WINNT/afsapplib/resource/spin6.ico deleted file mode 100644 index b9bfdedd79f7755643d4c2f07521f4657f772539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHJKTH!*82<_k)d;j|>p`1(TjS%TXunBgQ-baZhMu`kwgWiL(pAh)^62lFvlok;_)N08IBW|hJ>tSY~FFw@o z^BoiyFJZ7lG6yVV+QYUzg#VxIxP$SI`)VM+$I@CL66ry(9`vgw79WN zi<_)F)ZE&k7u&nk{u= zdx{1wRGdi{0?*DX`T%kl!RjSuM8AJWoPI0k+(-Qly&S8VLV8E{resatY8W03XhN@Ms|4dc`L56M>#15E2Dc=4w z9)YIsz$8|x75;u^$z-z3uwfcjQM7V(fDqof1l=c$j%{)pV zMXAh}*BuF5n-$N{G|U2f;PS{rj?$sKa#^W5Xszb|x8IPz) XkPPfUZqQzme;?13c>GN0d;z}!%J3xI diff --git a/src/WINNT/afsapplib/resource/spin7.ico b/src/WINNT/afsapplib/resource/spin7.ico deleted file mode 100644 index 68691718333c8aa8a2ecaa86b7dd36fec96227ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHHKWGzC82>IUc%;~-mgb)^cey0jOVXsdzKhUFad2=E1Q$m;xK*J;hb|fFmO-=* zfuco>iV&RYAXGAF5nY@L7I6?kH>+!h`1{_wORqXOxCrgneDA&A{eIuSmrIE>ijZl> zun*I>2$4+$Ou#xl(TPTfh#Y`e6Khx&a! z!STnBu!xY=!G)ms9Sh0NwcB@mRe;;=wtN!8QWM7f;GZxm$aoZ!_9s^T`ZUT7un=>8 z`2+JIT^O@Gj2VWoq(fNJ`&iKf?85*DkcQB<>P*ES_VwUJ2KcQGt~_y0`O%I-kDN)2}~hlY2Zy;+-IZnAUU9HvXb=RGRdAbm@r~Df+Y};`vrD_#4^TLxRjs?8Ie8msf z5$!b^kcg-f7=|PBBfZP%K{a4PBz)eUa!QD=)>$y%J>fTCaDRjRKJVdQeQ7`5DVGNA zqrZk%oZ097{(}BzJ>iw}R&geXSA1vyA&Qoj&*w&EfvkZBD^3*+stdpcSn~w+B~E$sFWtPF^!9WH&aQefB;iMQL1F4beu?bVVYVp#eCWb zYB&jX?~`$Dd>p!Dk~3fk!$22y!hfygcf(6k8ghV7`LP3%4-?UZv}p9if#*lyzqo;4 Db3r54 diff --git a/src/WINNT/afsapplib/resource/spin8.ico b/src/WINNT/afsapplib/resource/spin8.ico deleted file mode 100644 index 329b40f2d35805fc6d2942307b424454af951075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmeHIOK1~O6g~ZbK}wAulBxESNt#S1Gt>DbRf`)JU5P941A-#DP$-DtGMg+)-E?QE z6bg1xKNMV6-5C*Fh`7*&AmX;}tZuuA=f3&mvk}CF(B8>?@7+1)op;~6FA30xe&lj# z_JjD|50n7LV4T9!6fishl;s`$G+lVg$c-({fp};QfFCp(VaJw3G@DKK0<_czt(J`F zeB>3IYKM8mI>KsiTqVA;a=%UaCvjUY)c^aqH{afv>2~d}Cl-1qE@4Nk;Eq_q?Kp&! zI11x94l$s%mxQ6nE^fQ;IWNE1VA!d)kFB_}26(mUjj&_Op}ObIuT5;fdyKR{1Ef+& zrPD}h8q)NXrnA?f6-{Wq51lT&w050hOEAw~f_d>Kj$fODIah~&cb>k8nffATZ{5L# z`T}|D^iBF}`UmdjghaJMNV0d7keFeh>t; zpjM-gM<-%gj^nz-eIXEzY+sDqwliuNl_|pf39eOZwdrY5I2;lz;zlN?=kq1Qm?A2; z5JqC$agB_w>-j=qvREt`Rl-6z8RNE-$;o`;B+Sf|Dx}nEPJ*}R3oei7pNMeFc4fW@ zOo{-_ARf5Md?!a!3&;wj_;LUf$$YiG5)g&SVu@%FLfB| zksw>l7xINt-V-?fr!r03>Z5?97&1x%$MPUv&XADFRVqeF&+EDo__X0LJ(Nw;nlM;_ z3`^*F$6@ZX%kZz1&m$p8QV diff --git a/src/WINNT/afsapplib/resource/spinstop.ico b/src/WINNT/afsapplib/resource/spinstop.ico deleted file mode 100644 index 7ce20608f4ff0b2806eb2132daac7e8a0b507a72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmeH|PiWd_7{|Yb1thGibfFctWV*IV#Ms4FaX~|upJj2S$cHUuo^!s}s z-p}*reO`YcaD*SL6?~fTl?gZjpqJtn-lJq+*(>^@o=5l;DI+(T_?0*_eKUQ^Odl5d zA{$;cbG2At7MX4IZR7)FE=tx*+_zIMYJk!hYlFpNr(Edh7()9g2P}^Bu-P=&Jw6;i zK7nJ$k~n&_fX>d_=<$xj>7RqsxsE{KbJpMBc{X{LP5Lzq4nBaUZQ%0d`xqVl685>9 zaF!}?-Ks)ct6*TQiox|N2G%#BQK5VuS929;l}%itLR6H>R4SOQO3f{*PHnSK4W^D7 z+SFsm&7X1qmtAb^ z{)(?(?BUVgKDPGvQQtp6{osJJ{cr!}8}RykGl^t6yReYU<(Bfx%QtSUtdvTtORY=s z`usDAL~?$9A-A+7d|BbuvVmVurc{2OwydX@%WvrcDxZ9;*B+V^F6pJ!@~u__uh&0w zJ)NB&>+QAM9gg=iE2@6^W~+hMH?8_JpEwW*3=L;iOJ!QCzE`-a&j8`H@e)G}{S!&) zukuMXO$&~%tiI&a%ukIeEXl&PVDQ>sTrMD;)wy0@aB#HPCJ|m4AdyTOxJnORDHglP z-5%iy)|b<_$}|0gLa|Wb9l1R|zXTj|_7`3(7N@4jrNMMU)o)EFnB@yoQ&S%@-{X@j z8gr=IxjL+;k0>0Ecez=B6U5ty^cSZ~(MY8KFo07e68(})Yl|rB>1V(>p1~ty`cCVR&(o1` zm|x&c72$TD@9%sG>FDXN8Mlo7S@LlBA8{xwW=t^pXF_6Uj9Z6(d!M2`hdT!Ejc%v& z9opd>E!cL#+TBgq*XQiB8WQ+F`Znzpjl8?ts$NP%!0R-d&35u+``?Kn=wEdI1U7(j Ag8%>k diff --git a/src/WINNT/afsapplib/resource/unauthenticated.bmp b/src/WINNT/afsapplib/resource/unauthenticated.bmp deleted file mode 100644 index 4812196a43aba58c24151e8dad654f0a272aaf5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZvWF%AMD5JmqcCK?Le#7kIO+1S~87b{7uCh-7VfzE_ea3ss^@XsJq?ZE#$hGF1# zzf7=r(ofWpnyCpJI#A8mOaM-Z^o35O1hrNkG@EEmiQ>={t&GU%{E<=ypAnp|Z)09( xh=B%5JlIJ0ar3Nz*UA@BuC){ZqlT)%5+>MWoFW-%rR7Xs5CBBFgR~zJGKc$ zs;v3i{rgwKj6NcntfVY=qH$h{Jd$_2o*yz1vlcnfE5S3!<8WT1?2>qm2N1Y7PG|CxZb8L-N ziPEV;aXP6qMB`(OBOxD=?TpJpML229C)mH3NdvPJZsh)eNzZTgr|oZ(p5)k04F-z& zFNm?tXR^NGG^`Z^iv|ZQcz&ZV#D64spu36`T*r2Xg5JKfSj1*MT(V4!V`?$Mah0}p;lZI2FqE_^IQGe6zX$zehEgOTk88^F*ORlPKlNBZ$8JO`iQ}}-gAiY z!;R#;x5juum?QCGaNNkbLYsv6HRvhH>v)xQ&+o2o{VtCGwcm=g`;X69khKQdQ_X3n OpRlK|GvrJCl6?b? z%y3Cr7a%~^9xZ3N!zC$-K!zN<-5Ro=Z-7tqyB!;}Lk4`vf%V$@_vByR0(<2UpNR|% z(40v^`}M=IlM(04@yRCozNc4*4}W;C7QvrFdZ26;M!sN8<8WXo8B_CaVO7&SENIu3 zuX&evi&Mxeo#mhLUc4=xjTia3f$^AMHGm0}-F2l)Jjr2#woo_ak$(%rNN$2NlH7Qu z`LMeBm3mN_AU6)p&*VW6xTViL%7Z}tQ9kn|mq7KB+-8ufry1PkHiNmk5;(bqJn*@C z9AK^x=%i5qfZ{E95#5g3IEc;ss8fh!Suu1s)TsQ};|LG#i2*vn9{go_IG3qu@HqYD#< z5U$)GfwKwV?6_ZqIUij&77k)f%7-qurQ|H(?U7o_JJ6$%vNKsriRrF3Cr|-ed{{De5 c?*2Lh;zG~6QW&`F!pL_cOk2bC2;6Gm4;oahFaQ7m diff --git a/src/WINNT/afsapplib/settings.cpp b/src/WINNT/afsapplib/settings.cpp deleted file mode 100644 index 473d830f4..000000000 --- a/src/WINNT/afsapplib/settings.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL RestoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVerExpected) -{ - BOOL rc = FALSE; - - size_t cbStored; - if ((cbStored = GetRegValueSize (hkParent, pszBase, pszValue)) != 0) - { - if (cbStored >= sizeof(WORD)+cbStructure) - { - PVOID pStructureFinal; - if ((pStructureFinal = (PVOID)Allocate (cbStored)) != NULL) - { - if (GetBinaryRegValue (hkParent, pszBase, pszValue, pStructureFinal, cbStored)) - { - WORD wVerStored = *(LPWORD)pStructureFinal; - - if ( (HIBYTE(wVerStored) == HIBYTE(wVerExpected)) && - (LOBYTE(wVerStored) >= LOBYTE(wVerExpected)) ) - { - memcpy (pStructure, &((LPBYTE)pStructureFinal)[ sizeof(WORD) ], cbStructure); - rc = TRUE; - } - } - - Free (pStructureFinal); - } - } - } - - return rc; -} - - -BOOL StoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVersion) -{ - BOOL rc = FALSE; - - PVOID pStructureFinal; - if ((pStructureFinal = (PVOID)Allocate (sizeof(WORD) + cbStructure)) != NULL) - { - *(LPWORD)pStructureFinal = wVersion; - memcpy (&((LPBYTE)pStructureFinal)[ sizeof(WORD) ], pStructure, cbStructure); - - rc = SetBinaryRegValue (hkParent, pszBase, pszValue, pStructureFinal, sizeof(WORD) + cbStructure); - - Free (pStructureFinal); - } - - return rc; -} - - -void EraseSettings (HKEY hkParent, LPCTSTR pszBase, LPCTSTR pszValue) -{ - HKEY hk; - if (RegOpenKey (hkParent, pszBase, &hk) == 0) - { - RegDeleteValue (hk, pszValue); - RegCloseKey (hk); - } -} - - -BOOL GetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData) -{ - BOOL rc = FALSE; - - HKEY hkFinal; - if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwType; - DWORD dwSize = (DWORD)cbData; - - if (RegQueryValueEx (hkFinal, pszValue, NULL, &dwType, (LPBYTE)pData, &dwSize) == ERROR_SUCCESS) - rc = TRUE; - - RegCloseKey (hk); - } - - return rc; -} - - -size_t GetRegValueSize (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue) -{ - size_t cb = 0; - - HKEY hkFinal; - if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwType; - DWORD dwSize = 0; - - if (RegQueryValueEx (hkFinal, pszValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS) - { - cb = (size_t)dwSize; - } - - RegCloseKey (hk); - } - - return cb; -} - - -BOOL SetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData) -{ - BOOL rc = FALSE; - - HKEY hkFinal; - if (RegCreateKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwSize = (DWORD)cbData; - - if (RegSetValueEx (hkFinal, pszValue, NULL, REG_BINARY, (LPBYTE)pData, dwSize) == ERROR_SUCCESS) - rc = TRUE; - - RegCloseKey (hk); - } - - return rc; -} - - -BOOL GetMultiStringRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - LPTSTR *pmszData) -{ - BOOL rc = FALSE; - - HKEY hkFinal; - if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwSize = 0; - DWORD dwType = 0; - RegQueryValueEx (hkFinal, pszValue, NULL, &dwType, NULL, &dwSize); - - if ((dwType == REG_MULTI_SZ) && (dwSize != 0)) - { - *pmszData = AllocateString (dwSize); - - if (RegQueryValueEx (hkFinal, pszValue, NULL, &dwType, (LPBYTE)*pmszData, &dwSize) == ERROR_SUCCESS) - rc = TRUE; - else - { - FreeString (*pmszData); - *pmszData = NULL; - } - } - - RegCloseKey (hk); - } - - return rc; -} - - -BOOL SetMultiStringRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - LPCTSTR mszData) -{ - BOOL rc = FALSE; - - HKEY hkFinal; - if (RegCreateKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwSize = sizeof(TCHAR); - for (LPCTSTR psz = mszData; psz && *psz; psz += 1+lstrlen(psz)) - dwSize += sizeof(TCHAR) * (1+lstrlen(psz)); - - if (RegSetValueEx (hkFinal, pszValue, NULL, REG_MULTI_SZ, (LPBYTE)mszData, dwSize) == ERROR_SUCCESS) - rc = TRUE; - - RegCloseKey (hk); - } - - return rc; -} - - -// Under Windows NT, RegDeleteKey() is not recursive--under Windows 95, -// it is. Sigh. This routine works recursively on either OS. -// -BOOL RegDeltreeKey (HKEY hk, LPTSTR pszKey) -{ - HKEY hkSub; - if (RegOpenKey (hk, pszKey, &hkSub) == 0) - { - TCHAR szFound[ MAX_PATH ]; - while (RegEnumKey (hkSub, 0, szFound, MAX_PATH) == 0) - { - if (!RegDeltreeKey (hkSub, szFound)) - { - RegCloseKey (hkSub); - return FALSE; - } - } - - RegCloseKey (hkSub); - } - - if (RegDeleteKey (hk, pszKey) != 0) - return FALSE; - - return TRUE; -} - diff --git a/src/WINNT/afsapplib/settings.h b/src/WINNT/afsapplib/settings.h deleted file mode 100644 index 1801d9b5f..000000000 --- a/src/WINNT/afsapplib/settings.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SETTINGS_H -#define SETTINGS_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef HKCR -#define HKCR HKEY_CLASSES_ROOT -#endif - -#ifndef HKCU -#define HKCU HKEY_CURRENT_USER -#endif - -#ifndef HKLM -#define HKLM HKEY_LOCAL_MACHINE -#endif - -#ifndef HIBYTE -#define HIBYTE(_w) (BYTE)(((_w) >> 8) & 0x00FF) -#endif - -#ifndef LOBYTE -#define LOBYTE(_w) (BYTE)((_w) & 0x00FF) -#endif - -#ifndef MAKEVERSION -#define MAKEVERSION(_h,_l) ( ((((WORD)(_h)) << 8) & 0xFF00) | (((WORD)(_l)) & 0xFF) ) -#endif - - - -/* - * PROTOTYPES _________________________________________________________________ - * - * Summary: - * - * Store/RestoreSettings() are pretty simple--they're just convenience - * wrappers for providing version-controlled storage of a structure in - * the registry. You provide the structure and supply a version number; - * when your program loads, call RestoreSettings() to see if you've saved - * anything previously. When your program exits, call StoreSettings() - * so you don't lose anything--effectively, you'll have global variables - * that won't change from one run of your program to the next. Again, - * this is really pretty elementary stuff, but I find I write it a lot - * so I stuck it in a common source file. - * - * - * About version numbers: - * - * Don't just pick them at random--there's actually an algorithm here. - * A typical version number is composed of two parts--a major and a - * minor component. Start with a version of 1.0, just for grins. - * Whenever you *add* something to the structure, increment the minor - * version--and make sure you add to the end of the structure. If you - * have to do anything else to the structure--get rid of an element, - * reorder things, change the size of an element--increment the major - * version number. - * - * Why? Because it provides backward compatibility. StoreSettings() - * always writes out the version number that you provide it... but - * RestoreSettings() is picky about what versions it will load: - * - * (1) Restore fails if the stored major version != the expected version - * (2) Restore fails if the stored minor version < the expected version - * - * Another way of looking at that is, - * - * (1) Restore succeeds only if the major versions are identical - * (2) Restore succeeds only if the stored version is higher or equal - * - * So if you run a 1.4 program and it tries to read a 1.7 level stored - * structure, it will succeed!! Why? Because a 1.4 structure is just - * like a 1.7 structure--only missing some stuff at the end, which - * RestoreSettings will just ignore (the 1.4 program didn't know about - * it anyway, and obviously did just fine without it). - * - * - * Examples: - * - * struct { - * RECT rWindow; - * TCHAR szLastDirectory[ MAX_PATH ]; - * TCHAR szUserName[ MAX_PATH ]; - * } globals_restored; - * - * #define wVerGLOBALS MAKEVERSION(1,0) // major version 1, minor version 0 - * - * #define cszPathGLOBALS TEXT("Software\\MyCompany\\MyProgram") - * #define cszValueGLOBALS TEXT("Settings") - * - * ... - * - * if (!RestoreSettings (HKLM, cszPathGLOBALS, cszValueGLOBALS, - * &globals_restored, sizeof(globals_restored), - * wVerGLOBALS)) - * { - * memset (&globals_restored, 0x00, sizeof(globals_restored)); - * lstrcpy (globals_restored.szUserName, TEXT("unknown")); - * // set any other default, first-time-run values here - * } - * - * ... - * - * StoreSettings (HKLM, cszPathGLOBALS, cszValueGLOBALS, - * &globals_restored, sizeof(globals_restored), - * wVerGLOBALS); - * - */ - -EXPORTED void EraseSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue); - -EXPORTED BOOL RestoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVerExpected); - -EXPORTED BOOL StoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVersion); - -EXPORTED size_t GetRegValueSize (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue); - -EXPORTED BOOL GetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData); - -EXPORTED BOOL SetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData); - -EXPORTED BOOL GetMultiStringRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - LPTSTR *pmszData); - -EXPORTED BOOL SetMultiStringRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - LPCTSTR mszData); - -EXPORTED BOOL RegDeltreeKey (HKEY hk, LPTSTR pszKey); - - -#endif - diff --git a/src/WINNT/afsapplib/subclass.cpp b/src/WINNT/afsapplib/subclass.cpp deleted file mode 100644 index 1f8d8447c..000000000 --- a/src/WINNT/afsapplib/subclass.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -LONG CALLBACK Subclass_WndProc (HWND hTarget, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * MISCELLANEOUS ______________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) SubclassReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL SubclassReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)GlobalAlloc (GMEM_FIXED, cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - GlobalFree ((HGLOBAL)*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - HWND hTarget; // window being subclassed - PVOID procOrig; // original pre-SubclassProc proc - - struct - { - PVOID wndProc; - size_t nReq; - } *aHooks; - - size_t nHooks; // number of entries in aHooks - size_t nHooksActive; // number of hooks in use - } SubclassWindow; - -SubclassWindow *aTargets = NULL; -size_t nTargets = 0; - -#define cREALLOC_SUBCLASS_TARGETS 8 -#define cREALLOC_SUBCLASS_HOOKS 4 - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL Subclass_AddHook (HWND hTarget, PVOID wndProc) -{ - for (size_t iTarget = 0; iTarget < nTargets; ++iTarget) - { - if (aTargets[ iTarget ].hTarget == hTarget) - break; - } - if (iTarget >= nTargets) - { - for (iTarget = 0; iTarget < nTargets; ++iTarget) - { - if (aTargets[ iTarget ].hTarget == NULL) - break; - } - } - if (iTarget >= nTargets) - { - if (!REALLOC (aTargets, nTargets, 1+iTarget, cREALLOC_SUBCLASS_TARGETS)) - return FALSE; - } - - aTargets[ iTarget ].hTarget = hTarget; - - - for (size_t iHook = 0; iHook < aTargets[iTarget].nHooks; ++iHook) - { - if (aTargets[ iTarget ].aHooks[ iHook ].wndProc == wndProc) - break; - } - if (iHook >= aTargets[ iTarget ].nHooks) - { - for (iHook = 0; iHook < aTargets[iTarget].nHooks; ++iHook) - { - if (aTargets[ iTarget ].aHooks[ iHook ].wndProc == NULL) - break; - } - } - if (iHook >= aTargets[ iTarget ].nHooks) - { - if (!REALLOC (aTargets[ iTarget ].aHooks, aTargets[ iTarget ].nHooks, 1+iHook, cREALLOC_SUBCLASS_HOOKS)) - return FALSE; - } - - aTargets[ iTarget ].aHooks[ iHook ].wndProc = wndProc; - aTargets[ iTarget ].aHooks[ iHook ].nReq ++; - aTargets[ iTarget ].nHooksActive ++; - - if (aTargets[ iTarget ].nHooksActive == 1) - { - aTargets[ iTarget ].procOrig = (PVOID)GetWindowLong (hTarget, GWL_WNDPROC); - SetWindowLong (hTarget, GWL_WNDPROC, (LONG)Subclass_WndProc); - } - - return TRUE; -} - - -void Subclass_RemoveHook (HWND hTarget, PVOID wndProc) -{ - for (size_t iTarget = 0; iTarget < nTargets; ++iTarget) - { - if (aTargets[ iTarget ].hTarget == hTarget) - break; - } - if (iTarget < nTargets) - { - for (size_t iHook = 0; iHook < aTargets[iTarget].nHooks; ++iHook) - { - if (aTargets[ iTarget ].aHooks[ iHook ].wndProc == wndProc) - break; - } - if (iHook < aTargets[ iTarget ].nHooks) - { - aTargets[ iTarget ].aHooks[ iHook ].nReq --; - if (aTargets[ iTarget ].aHooks[ iHook ].nReq == 0) - { - memset (&aTargets[ iTarget ].aHooks[ iHook ], 0x00, sizeof(aTargets[ iTarget ].aHooks[ iHook ])); - } - } - - aTargets[ iTarget ].nHooksActive --; - if (aTargets[ iTarget ].nHooksActive == 0) - { - SetWindowLong (aTargets[ iTarget ].hTarget, GWL_WNDPROC, (LONG)aTargets[ iTarget ].procOrig); - memset (&aTargets[ iTarget ], 0x00, sizeof(aTargets[ iTarget ])); - } - } -} - - -PVOID Subclass_FindNextHook (HWND hTarget, PVOID wndProc) -{ - for (size_t iTarget = 0; iTarget < nTargets; ++iTarget) - { - if (aTargets[ iTarget ].hTarget == hTarget) - break; - } - if (iTarget >= nTargets) - return NULL; - - for (size_t iHook = 0; iHook < aTargets[iTarget].nHooks; ++iHook) - { - if (aTargets[ iTarget ].aHooks[ iHook ].wndProc == wndProc) - break; - } - if (iHook >= aTargets[ iTarget ].nHooks) - return aTargets[ iTarget ].procOrig; - - for (++iHook; iHook < aTargets[iTarget].nHooks; ++iHook) - { - if (aTargets[ iTarget ].aHooks[ iHook ].wndProc != NULL) - return aTargets[ iTarget ].aHooks[ iHook ].wndProc; - } - - return aTargets[ iTarget ].procOrig; -} - - -LONG CALLBACK Subclass_WndProc (HWND hTarget, UINT msg, WPARAM wp, LPARAM lp) -{ - for (size_t iTarget = 0; iTarget < nTargets; ++iTarget) - { - if (aTargets[ iTarget ].hTarget == hTarget) - break; - } - if (iTarget >= nTargets) - return DefWindowProc (hTarget, msg, wp, lp); - - for (size_t iHook = 0; iHook < aTargets[iTarget].nHooks; ++iHook) - { - if (aTargets[ iTarget ].aHooks[ iHook ].wndProc != NULL) - break; - } - - if (iHook >= aTargets[iTarget].nHooks) - return CallWindowProc ((WNDPROC)aTargets[ iTarget ].procOrig, hTarget, msg, wp, lp); - else - return CallWindowProc ((WNDPROC)aTargets[ iTarget ].aHooks[ iHook ].wndProc, hTarget, msg, wp, lp); -} - diff --git a/src/WINNT/afsapplib/subclass.h b/src/WINNT/afsapplib/subclass.h deleted file mode 100644 index d4ef39765..000000000 --- a/src/WINNT/afsapplib/subclass.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SUBCLASS_H -#define SUBCLASS_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef EXPORTED -#define EXPORTED -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - * These routines provide a consistent method for multiple children in - * a dialog to add and remove subclasses, without stepping on each - * others' toes. - * - * Old code like this: - * - * // Install subclass on create - * LONG oldProc = GetWindowLong (hWnd, GWL_WNDPROC); - * SetWindowLong (hWnd, GWL_WNDPROC, (LONG)MyWindowProc); - * - * // Use - * if (oldProc) - * CallWindowProc(oldProc,hWnd,msg,wp,lp); - * else - * DefWindowProc(hWnd,msg,wp,lp); - * - * // Uninstall subclass on destroy - * SetWindowLong (hWnd, GWL_WNDPROC, (LONG)oldProc); - * - * Will eat itself unless all changes are peeled back in the opposite - * order in which subclasses were installed. This technique won't: - * - * // Install subclass on create - * Subclass_AddHook (hWnd, MyWindowProc); - * - * // Use - * PVOID oldProc = Subclass_FindNextHook (hWnd, MyWindowProc); - * if (oldProc) - * CallWindowProc(oldProc,hWnd,msg,wp,lp); - * else - * DefWindowProc(hWnd,msg,wp,lp); - * - * // Uninstall subclass on destroy - * Subclass_RemoveHook (hWnd, MyWindowProc); - * - * Note that if five calls are made to add "Subclass_AddHook" giving - * the same hTarget and wndProc, then five successive calls to _Remove - * will be necessary to remove the hook; also note that the wndProc - * will (of course) be called only *once* per message. - * - */ - -EXPORTED BOOL Subclass_AddHook (HWND hTarget, PVOID wndProc); -EXPORTED void Subclass_RemoveHook (HWND hTarget, PVOID wndProc); -EXPORTED PVOID Subclass_FindNextHook (HWND hTarget, PVOID wndProcMine); - - -#endif - diff --git a/src/WINNT/afsapplib/test/16color.bmp b/src/WINNT/afsapplib/test/16color.bmp deleted file mode 100644 index f0020d3e39b124bbb4fa2257e64cb2d3f8fbb1e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5318 zcmeHJy^ho{5Y7q;+L4gkP*Prh4MLQM#4A`rZrxFDx$V8eJ;_zP4szqxe4pb@#=c~^ zSf@RNm}KMe&*%B^%&b3u{rP^#^aJ0I_3PLDl3n41oJ?(g@X&$|veJ@#A+^X1ci zADmA6G1s!EN6y2;etUXyVR%Wu`4qRb-u8jW7G~R?V74$HZntK(F{h)(psqR^;!}!Y z%shtJ>Q$9JDTo*cLz0LDlX(l)B(Mu19QzAtIZ(l+u*`7>wf#I%VeFWo zh$2`7S4K5LR{PC4E5=p}pdQ^{QzfUKVlTU8C+6uc82N*oSH=8#vnu}L;Ok%z@qAe~ zQp^ovAjPVJI9Kb2h-c6vAwVo7h)ooOChBSoCOIDr&ff-P4|+_WIua@jLo#5VnZ|F% zlzo&ZQScV>5_||;&9s;c3HzFAIbyvau(5{0c`hU^rjnDykAiIFz9<3bLegR?Ik00i zp0y)l9Uhc{XxZ1Qxk?V^gcVavNbp@QB*96P7aFNa>o$+)$}#s!C0Y8bm}PpE>%nMyRySQ4 z{FgDjam+!>s|d?UumYKme=I(^Ib*bL1%S9tWI^kgRXMQf66UEKDt{T%%CWpjfF?PtKD34n z7*2p%j5m@k$te^a>j*Gxtc)e~S_}&)soY6eM}T4DQ>3AR&IBmBd10G$2{+RUcztJ SI@7;dPLFQa!t~@qO1}Zj$3U?F diff --git a/src/WINNT/afsapplib/test/256color.bmp b/src/WINNT/afsapplib/test/256color.bmp deleted file mode 100644 index bc93b9435b530b2668a5e573a13e35a2977e9d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11078 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 B(Bl9A diff --git a/src/WINNT/afsapplib/test/NTMakefile b/src/WINNT/afsapplib/test/NTMakefile deleted file mode 100644 index 81be847db..000000000 --- a/src/WINNT/afsapplib/test/NTMakefile +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# include winnt-specific header files - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -I$(DESTDIR)\include\winnt -AFSDEV_AUXRCDEFINES = $(AFSDEV_AUXRCDEFINES) -I$(DESTDIR)\include\winnt - -# include the primary makefile - -RELDIR=WINNT\afsapplib\test -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) - -############################################################################ -# -# BUILD TARGETS -# - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\WizTest.exe - -EXEOBJS = \ - $(OUT)\wiztest.res \ - $(OUT)\wiztest.obj - -EXELIBS = \ - $(DESTDIR)\lib\afs\TaAfsAppLib.lib \ - $(DESTDIR)\lib\afs\TaLocale.lib - -############################################################################ - -$(EXEFILE) : $(EXEOBJS) $(EXELIBS) - $(EXEGUILINK) comctl32.lib shell32.lib - $(EXEPREP) - -test : $(EXEFILE) - - -mkdir: - diff --git a/src/WINNT/afsapplib/test/resource.h b/src/WINNT/afsapplib/test/resource.h deleted file mode 100644 index dd0309699..000000000 --- a/src/WINNT/afsapplib/test/resource.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_NEXT 1 -#define IDS_FINISH 2 -#define IDS_HELP_TITLE 3 -#define IDS_HELP_DESC 4 -#define IDS_CANCEL_TITLE 5 -#define IDS_CANCEL_DESC 6 -#define IDD_WIZARD 101 -#define IDD_STEP1 102 -#define IDD_STEP2 103 -#define IDB_GRAPHIC_256 103 -#define IDD_STEP3 104 -#define IDB_GRAPHIC_16 104 -#define IDNEXT 1001 -#define IDBACK 1002 -#define IDC_GOTO_TWO 1005 -#define IDC_GOTO_THREE 1006 -#define IDC_WIZARD_LEFTPANE 1006 -#define IDC_WIZARD_RIGHTPANE 1007 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 105 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1008 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/afsapplib/test/wiztest.cpp b/src/WINNT/afsapplib/test/wiztest.cpp deleted file mode 100644 index 2c9c4bb9d..000000000 --- a/src/WINNT/afsapplib/test/wiztest.cpp +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include "resource.h" - - // Animation stuff - // -#define fpsANIMATE_OVERLAY 20 // frames per second (rate to redraw window) -#define spcANIMATE_OVERLAY 20 // seconds per cycle (complete rotation for X) -#define spcANIMATE_COLORS 3 // seconds per cycle (color fade R->G->B->R) - -VOID CALLBACK Wiz_ForceGraphicRedraw (HWND hWnd, UINT msg, UINT idTimer, DWORD idTick); -void CALLBACK Wiz_DrawOverlay (LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal); - - - // Normal wizard stuff - // -static enum { - sidSTEP_ONE, - sidSTEP_TWO, - sidSTEP_THREE, -} StateID; - -BOOL CALLBACK WizStep_1_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizStep_2_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizStep_3_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); - -static WIZARD_STATE g_aStates[] = { - { sidSTEP_ONE, IDD_STEP1, (DLGPROC)WizStep_1_DlgProc, 0 }, - { sidSTEP_TWO, IDD_STEP2, (DLGPROC)WizStep_2_DlgProc, 0 }, - { sidSTEP_THREE, IDD_STEP3, (DLGPROC)WizStep_3_DlgProc, 0 } -}; - -static size_t g_cStates = sizeof(g_aStates) / sizeof(g_aStates[0]); - - -static LPWIZARD g_pWiz = NULL; -static BOOL g_fSkipStep2 = FALSE; - - -int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pszCmdLineA, int nCmdShow) -{ - srand(GetTickCount()); - SetTimer (NULL, 100, 1000L / fpsANIMATE_OVERLAY, Wiz_ForceGraphicRedraw); - - g_pWiz = new WIZARD; - g_pWiz->SetDialogTemplate (IDD_WIZARD, IDC_WIZARD_LEFTPANE, IDC_WIZARD_RIGHTPANE, IDBACK, IDNEXT); - g_pWiz->SetGraphic (IDB_GRAPHIC_16, IDB_GRAPHIC_256); - g_pWiz->SetGraphicCallback (Wiz_DrawOverlay); - g_pWiz->SetStates (g_aStates, g_cStates); - - g_pWiz->SetState (sidSTEP_ONE); - g_pWiz->Show (); - - delete g_pWiz; - return 0; -} - - -BOOL CALLBACK WizStep_Common_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - Message (MB_OK, IDS_HELP_TITLE, IDS_HELP_DESC); - return TRUE; - - case IDCANCEL: - if (Message (MB_OKCANCEL, IDS_CANCEL_TITLE, IDS_CANCEL_DESC) == IDOK) - g_pWiz->Show(FALSE); - return TRUE; - } - break; - } - - return FALSE; -} - - -BOOL CALLBACK WizStep_1_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hRHS, msg, wp, lp)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - CheckDlgButton (hRHS, IDC_GOTO_TWO, !g_fSkipStep2); - CheckDlgButton (hRHS, IDC_GOTO_THREE, g_fSkipStep2); - - g_pWiz->EnableButtons (NEXT_BUTTON); - g_pWiz->SetButtonText (IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl (IDNEXT); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDNEXT: - g_fSkipStep2 = IsDlgButtonChecked (hRHS, IDC_GOTO_THREE); - g_pWiz->SetState (sidSTEP_TWO); - break; - } - break; - } - - return FALSE; -} - - -BOOL CALLBACK WizStep_2_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hRHS, msg, wp, lp)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - g_pWiz->EnableButtons (BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText (IDNEXT, IDS_NEXT); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_WIZARD: - switch (HIWORD(wp)) - { - case wcIS_STATE_DISABLED: - return g_fSkipStep2; - } - break; - - case IDBACK: - g_pWiz->SetState (sidSTEP_ONE); - break; - - case IDNEXT: - g_pWiz->SetState (sidSTEP_THREE); - break; - } - break; - } - - return FALSE; -} - - -BOOL CALLBACK WizStep_3_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hRHS, msg, wp, lp)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - g_pWiz->EnableButtons (BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText (IDNEXT, IDS_FINISH); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDBACK: - g_pWiz->SetState (sidSTEP_TWO); - break; - - case IDNEXT: - g_pWiz->Show (FALSE); - break; - } - break; - } - - return FALSE; -} - - -VOID CALLBACK Wiz_ForceGraphicRedraw (HWND hWnd, UINT msg, UINT idTimer, DWORD idTick) -{ - HWND hParent; - if ((hParent = g_pWiz->GetWindow()) != NULL) - { - HWND hLHS; - if ((hLHS = GetDlgItem (hParent, IDC_WIZARD_LEFTPANE)) != NULL) - { - RECT rClient; - GetClientRect (hLHS, &rClient); - InvalidateRect (hLHS, &rClient, TRUE); - UpdateWindow (hLHS); - } - } -} - - -/* - * TOTALLY GRATUITOUS DRAWING STUFF ___________________________________________ - * - */ - -#ifndef PI -#define PI (3.14159265358979323846264338) -#endif -#ifndef TWOPI -#define TWOPI (PI * 2) -#endif - -void NormalizeAngle (double &dAng) -{ - while (dAng < 0.00) - dAng += TWOPI; - while (dAng >= TWOPI) - dAng -= TWOPI; -} - - -void Wiz_DrawOverlay_Line (HDC hdcTarget, LPRECT prTarget, LONG xCenter, LONG yCenter, double dAngle) -{ - // There are four important angles for us to figure out; these are the - // angles between the current center-point and each of the corners - // of our bounding rectangle. - // - double dUR = atan2 (yCenter - prTarget->top, prTarget->right - xCenter); - double dUL = atan2 (yCenter - prTarget->top, prTarget->left - xCenter); - double dLL = atan2 (yCenter - prTarget->bottom, prTarget->left - xCenter); - double dLR = atan2 (yCenter - prTarget->bottom, prTarget->right - xCenter); - - NormalizeAngle (dUR); - NormalizeAngle (dUL); - NormalizeAngle (dLL); - NormalizeAngle (dLR); - NormalizeAngle (dAngle); - - // Now that we know this, we can determine how long the line segment should - // be (because we can easily find which face of the bounding rectangle it - // will intersect). - // - LONG cxLine = 0; - LONG cyLine = 0; - if (dAngle >= dUR && dAngle < dUL) // top face - { - cyLine = yCenter - prTarget->top; - double dLength = cyLine / cos((PI/2)-dAngle); - cxLine = (LONG)( dLength * sin((PI/2)-dAngle) ); - cyLine = 0-cyLine; - } - else if (dAngle >= dUL && dAngle < dLL) // left face - { - cxLine = prTarget->left - xCenter; - double dLength = cxLine / cos(PI-dAngle); - cyLine = (LONG)( dLength * sin(PI-dAngle) ); - } - else if (dAngle >= dLL && dAngle < dLR) // bottom face - { - cyLine = prTarget->bottom - yCenter; - double dLength = cyLine / cos((PI*3/2)-dAngle); - cxLine = 0 - (LONG)( dLength * sin((PI*3/2)-dAngle) ); - } - else // right face - { - cxLine = prTarget->right - xCenter; - double dLength = cxLine / cos(dAngle); - cyLine = 0 - (LONG)( dLength * sin(dAngle) ); - } - - MoveToEx (hdcTarget, xCenter, yCenter, 0); - LineTo (hdcTarget, xCenter + cxLine, yCenter + cyLine); -} - - -void CALLBACK Wiz_DrawOverlay (LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hPal) -{ - static double dAngleNext = 0.00; - static double dColorRotNext = 0.00; // 0'=Red, 120'=Green, 240'=Blue - static double xCenterNext = -1.0; - static double yCenterNext = -1.0; - static double cxCenterMove = 0.0; - static double cyCenterMove = 0.0; - - // First choose a good color. If we're using a palletized display - // (i.e., 256-color or worse), we'll just draw in white; otherwise, - // we'll draw in pretty rotating colors. - // - COLORREF clr = RGB(255,255,255); - - WORD wDepthDisplay; - if ((wDepthDisplay = (WORD)GetDeviceCaps (hdcTarget, BITSPIXEL)) > 8) - { - double dPortionRed = cos (dColorRotNext); - double dPortionGreen = cos (dColorRotNext + (TWOPI/3)); - double dPortionBlue = cos (dColorRotNext - (TWOPI/3)); - - dPortionRed = max (dPortionRed, 0.00); - dPortionGreen = max (dPortionGreen, 0.00); - dPortionBlue = max (dPortionBlue, 0.00); - - clr = RGB( (BYTE)(255.0 * dPortionRed), - (BYTE)(255.0 * dPortionGreen), - (BYTE)(255.0 * dPortionBlue) ); - - if ((dColorRotNext += TWOPI / (fpsANIMATE_OVERLAY * spcANIMATE_COLORS)) >= TWOPI) - dColorRotNext -= TWOPI; - } - - // Create a pen in the chosen color - // - HPEN hpNew = CreatePen (PS_SOLID, 1, clr); - HPEN hpOld = (HPEN)SelectObject (hdcTarget, hpNew); - - // Make sure we start our X in the center - // - if (xCenterNext < 0) - { - xCenterNext = prTarget->left + (prTarget->right - prTarget->left)/2; - yCenterNext = prTarget->top + (prTarget->bottom - prTarget->top)/2; - } - - // Then draw the necessary lines; first the box (to prove we know where - // the boundaries of the visible rectangle are), then the X (to prove - // we can make things that look neat). - // - MoveToEx (hdcTarget, prTarget->left, prTarget->top, 0); - LineTo (hdcTarget, prTarget->right-1, prTarget->top); - LineTo (hdcTarget, prTarget->right-1, prTarget->bottom-1); - LineTo (hdcTarget, prTarget->left, prTarget->bottom-1); - LineTo (hdcTarget, prTarget->left, prTarget->top); - - Wiz_DrawOverlay_Line (hdcTarget, prTarget, (LONG)xCenterNext, (LONG)yCenterNext, dAngleNext); - Wiz_DrawOverlay_Line (hdcTarget, prTarget, (LONG)xCenterNext, (LONG)yCenterNext, dAngleNext + (PI/2)); - Wiz_DrawOverlay_Line (hdcTarget, prTarget, (LONG)xCenterNext, (LONG)yCenterNext, dAngleNext + (PI)); - Wiz_DrawOverlay_Line (hdcTarget, prTarget, (LONG)xCenterNext, (LONG)yCenterNext, dAngleNext - (PI/2)); - - // Make the X rotate a little bit for each frame - // - if ((dAngleNext += TWOPI / (fpsANIMATE_OVERLAY * spcANIMATE_OVERLAY)) >= TWOPI) - dAngleNext -= TWOPI; - - // If the center isn't moving yet, kick it. - // - if (!cxCenterMove && !cyCenterMove) - { - cxCenterMove = (double)(rand() % 7500) / 1000.0; - cyCenterMove = (double)(rand() % 7500) / 1000.0; - } - - // Bounce the center around - // - if ((xCenterNext += cxCenterMove) < prTarget->left) - { - xCenterNext = prTarget->left; - if (cxCenterMove < 0) - cxCenterMove = 0 - cxCenterMove; - } - else if (xCenterNext >= prTarget->right) - { - xCenterNext = prTarget->right-1; - if (cxCenterMove > 0) - cxCenterMove = 0 - cxCenterMove; - } - - if ((yCenterNext += cyCenterMove) < prTarget->top) - { - yCenterNext = prTarget->top; - if (cyCenterMove < 0) - cyCenterMove = 0 - cyCenterMove; - } - else if (yCenterNext >= prTarget->bottom) - { - yCenterNext = prTarget->bottom-1; - if (cyCenterMove > 0) - cyCenterMove = 0 - cyCenterMove; - } - - // We're done; clean up. - // - SelectObject (hdcTarget, hpOld); - DeleteObject (hpNew); -} - diff --git a/src/WINNT/afsapplib/test/wiztest.rc b/src/WINNT/afsapplib/test/wiztest.rc deleted file mode 100644 index 23497d9d4..000000000 --- a/src/WINNT/afsapplib/test/wiztest.rc +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "windows.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOG DISCARDABLE 0, 0, 330, 165 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "Wizard Test" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Cance&l",IDCANCEL,114,144,50,14 - PUSHBUTTON "< &Back",IDBACK,167,144,50,14 - PUSHBUTTON "&Next >",IDNEXT,220,144,50,14 - PUSHBUTTON "&Help",9,273,144,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,137,316,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,67,120,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,83,7,240,120 -END - -IDD_STEP1 DIALOG DISCARDABLE 0, 0, 240, 120 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "This is step one in the wizard!",IDC_STATIC,0,0,239,8 - LTEXT "Select the step you'd like to go to next:",IDC_STATIC,0, - 33,123,8 - CONTROL "&Continue to step two",IDC_GOTO_TWO,"Button", - BS_AUTORADIOBUTTON,30,52,81,10 - CONTROL "&Skip to step three",IDC_GOTO_THREE,"Button", - BS_AUTORADIOBUTTON,30,66,71,10 -END - -IDD_STEP2 DIALOG DISCARDABLE 0, 0, 240, 120 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "This is step two in the wizard!",IDC_STATIC,0,0,239,8 - LTEXT "Click Back to return to step one, or Next to continue to step three.", - IDC_STATIC,0,32,208,8 -END - -IDD_STEP3 DIALOG DISCARDABLE 0, 0, 240, 120 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "This is the final step in the wizard!",IDC_STATIC,0,0, - 239,8 - LTEXT "Click Back to return to the previous step, or click Finish to quit.", - IDC_STATIC,0,32,197,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 323 - TOPMARGIN, 7 - BOTTOMMARGIN, 158 - END - - IDD_STEP1, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 233 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END - - IDD_STEP2, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 233 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END - - IDD_STEP3, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 233 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""windows.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_256 BITMAP DISCARDABLE "256color.bmp" -IDB_GRAPHIC_16 BITMAP DISCARDABLE "16color.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "&Next >" - IDS_FINISH "&Finish" - IDS_HELP_TITLE "Help Button Pressed" - IDS_HELP_DESC "You clicked the Help button. Sorry, but you're helpless." - IDS_CANCEL_TITLE "Cancel Wizard Test?" - IDS_CANCEL_DESC "Are you sure you want to close the glorious Wizard Test application? Your ancestors will despise you..." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsclass/NTMakefile b/src/WINNT/afsclass/NTMakefile deleted file mode 100644 index ea60db292..000000000 --- a/src/WINNT/afsclass/NTMakefile +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# include the primary makefile - -RELDIR=WINNT\afsclass -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) - -############################################################################ - -LIBOBJS = \ - $(OUT)\c_debug.obj \ - $(OUT)\c_ident.obj \ - $(OUT)\c_identlist.obj \ - $(OUT)\c_cell.obj \ - $(OUT)\c_svr.obj \ - $(OUT)\c_svc.obj \ - $(OUT)\c_agg.obj \ - $(OUT)\c_set.obj \ - $(OUT)\c_usr.obj \ - $(OUT)\c_grp.obj \ - $(OUT)\c_notify.obj \ - $(OUT)\afsclassfn.obj \ - $(OUT)\internal.obj \ - $(OUT)\worker.obj - -LIBINCLUDES = \ - $(DESTDIR)\include\winnt\afsclass.h \ - $(DESTDIR)\include\winnt\afsclassfn.h \ - $(DESTDIR)\include\winnt\c_cell.h \ - $(DESTDIR)\include\winnt\c_svr.h \ - $(DESTDIR)\include\winnt\c_agg.h \ - $(DESTDIR)\include\winnt\c_svc.h \ - $(DESTDIR)\include\winnt\c_set.h \ - $(DESTDIR)\include\winnt\c_grp.h \ - $(DESTDIR)\include\winnt\c_usr.h \ - $(DESTDIR)\include\winnt\c_notify.h \ - $(DESTDIR)\include\winnt\c_ident.h \ - $(DESTDIR)\include\winnt\c_identlist.h \ - $(DESTDIR)\include\winnt\c_debug.h - -LIBFILE = $(DESTDIR)\lib\afs\afsclass.lib - -############################################################################ - -install : - @echo AfsClass.LIB is built automatically when building AfsAdmSvr. - @echo. - @echo You do not need to build in the AfsClass directory explicitly. - @echo. - -primary: $(LIBINCLUDES) $(LIBFILE) - -$(LIBFILE): $(LIBOBJS) - $(LIBARCH) - -clean:: - - -mkdir: - diff --git a/src/WINNT/afsclass/afsclass.h b/src/WINNT/afsclass/afsclass.h deleted file mode 100644 index 59e8b5ab4..000000000 --- a/src/WINNT/afsclass/afsclass.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_H -#define AFSCLASS_H - -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cchNAME 256 - -#define GHOST_HAS_VLDB_ENTRY 0x01 -#define GHOST_HAS_SERVER_ENTRY 0x02 -#define GHOST_HAS_KAS_ENTRY 0x04 -#define GHOST_HAS_PTS_ENTRY 0x08 -#define GHOST_HAS_ALL_ENTRIES (GHOST_HAS_VLDB_ENTRY | GHOST_HAS_SERVER_ENTRY) - -#define AFSCLASS_WANT_VOLUMES 0x00000001 -#define AFSCLASS_WANT_USERS 0x00000002 - - -/* - * TYPEDEFS ___________________________________________________________________ - * - */ - -typedef enum ACCOUNTACCESS - { - aaOWNER_ONLY, - aaGROUP_ONLY, - aaANYONE, - } ACCOUNTACCESS; - -typedef LPENUMERATION HENUM; - -typedef unsigned int VOLUMEID, *LPVOLUMEID; - -typedef class NOTIFYCALLBACK NOTIFYCALLBACK, *LPNOTIFYCALLBACK; - -typedef class CELL CELL, *LPCELL; -typedef class SERVER SERVER, *LPSERVER; -typedef class SERVICE SERVICE, *LPSERVICE; -typedef class AGGREGATE AGGREGATE, *LPAGGREGATE; -typedef class FILESET FILESET, *LPFILESET; -typedef class USER USER, *LPUSER; -typedef class PTSGROUP PTSGROUP, *LPPTSGROUP; -typedef class IDENT IDENT, *LPIDENT; -typedef class IDENTLIST IDENTLIST, *LPIDENTLIST; - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include // debugging utility functions -#include // NOTIFYCALLBACK class -#include // IDENT class -#include // IDENTLIST class -#include // CELL class -#include // SERVER class -#include // SERVICE class -#include // AGGREGATE class -#include // FILESET class -#include // USER class -#include // PTSGROUP class - -#include // AfsClass_* cell-manipulation routines - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL AfsClass_Initialize (ULONG *pStatus = NULL); - -void AfsClass_SpecifyRefreshDomain (DWORD dwWant); // AFSCLASS_WANT_* - -void AfsClass_Enter (void); -void AfsClass_Leave (void); -int AfsClass_GetEnterCount (void); - -void AfsClass_RequestLongServerNames (BOOL fWantLongNames); - -void AfsClass_UnixTimeToSystemTime (LPSYSTEMTIME pst, ULONG ut, BOOL fElapsed = FALSE); -ULONG AfsClass_SystemTimeToUnixTime (LPSYSTEMTIME pst); - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) AfsClass_ReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL AfsClass_ReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc); -#endif - -void AfsClass_SkipRefresh (int idSection); // ID from evtRefreshAllSectionStart - -void AfsClass_IntToAddress (LPSOCKADDR_IN pAddr, int IntAddr); -void AfsClass_AddressToInt (int *pIntAddr, LPSOCKADDR_IN pAddr); - - -#endif - diff --git a/src/WINNT/afsclass/afsclassfn.cpp b/src/WINNT/afsclass/afsclassfn.cpp deleted file mode 100644 index 850a7962d..000000000 --- a/src/WINNT/afsclass/afsclassfn.cpp +++ /dev/null @@ -1,4743 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_ADMINLISTENTRIES 32 - -#define cREALLOC_HOSTLISTENTRIES 16 - -#define cREALLOC_SERVERKEYS 16 - -#define ACCOUNTACCESS_TO_USERACCESS(_aa) ( ((_aa) == aaOWNER_ONLY) ? PTS_USER_OWNER_ACCESS : PTS_USER_ANYUSER_ACCESS ) - -#define ACCOUNTACCESS_TO_GROUPACCESS(_aa) ( ((_aa) == aaOWNER_ONLY) ? PTS_GROUP_OWNER_ACCESS : ((_aa) == aaGROUP_ONLY) ? PTS_GROUP_ACCESS : PTS_GROUP_ANYUSER_ACCESS ) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL AfsClass_GetServerLogFile (LPIDENT lpiServer, LPTSTR pszLocal, LPTSTR pszRemote, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtGetServerLogFileBegin, lpiServer, pszRemote, 0); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosLogGet.hServer = hBOS; - wp.wpBosLogGet.pszLogName = pszRemote; - wp.wpBosLogGet.pszLogData = NULL; - - AfsClass_Leave(); - if ((rc = Worker_DoTask (wtaskBosLogGet, &wp, &status)) == TRUE) - { - HANDLE fh; - if ((fh = CreateFile (pszLocal, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL)) != INVALID_HANDLE_VALUE) - { - // Write the file a line at a time in order to make - // sure that each line ends with "\r\n". If we encounter - // a line which ends in \r\n already, well, leave it alone. - // - for (LPTSTR psz = wp.wpBosLogGet.pszLogData; psz && *psz; ) - { - for (LPTSTR pszNext = psz; *pszNext && (*pszNext != TEXT('\r')) && (*pszNext != TEXT('\n')); ++pszNext) - ; - DWORD cbWrite; - DWORD cbWrote; - if ((cbWrite = pszNext - psz) != 0) - WriteFile (fh, psz, cbWrite, &cbWrote, NULL); - WriteFile (fh, TEXT("\r\n"), 2, &cbWrote, NULL); - psz = (*pszNext == TEXT('\r')) ? (2+pszNext) : (*pszNext == TEXT('\n')) ? (1+pszNext) : NULL; - } - CloseHandle (fh); - } - - Free (wp.wpBosLogGet.pszLogData); - } - - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtGetServerLogFileEnd, lpiServer, pszRemote, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SetServerAuth (LPIDENT lpiServer, BOOL fEnabled, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtSetServerAuthBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosAuthSet.hServer = hBOS; - wp.wpBosAuthSet.fEnableAuth = fEnabled; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosAuthSet, &wp, &status); - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtSetServerAuthEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_StartService (LPIDENT lpiStart, BOOL fTemporary, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtStartServiceBegin, lpiStart); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiStart->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - if (lpiStart->fIsService()) - { - TCHAR szName[ cchNAME ]; - lpiStart->GetServiceName (szName); - - if (fTemporary) - { - WORKERPACKET wp; - wp.wpBosProcessExecutionStateSetTemporary.hServer = hBOS; - wp.wpBosProcessExecutionStateSetTemporary.pszService = szName; - wp.wpBosProcessExecutionStateSetTemporary.state = SERVICESTATE_RUNNING; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessExecutionStateSetTemporary, &wp, &status); - AfsClass_Enter(); - } - else - { - WORKERPACKET wp; - wp.wpBosProcessExecutionStateSet.hServer = hBOS; - wp.wpBosProcessExecutionStateSet.pszService = szName; - wp.wpBosProcessExecutionStateSet.state = SERVICESTATE_RUNNING; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessExecutionStateSet, &wp, &status); - AfsClass_Enter(); - } - } - else - { - WORKERPACKET wp; - wp.wpBosProcessAllStart.hServer = hBOS; - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessAllStart, &wp, &status); - AfsClass_Enter(); - } - } - - if (rc) - { - if (lpiStart->fIsService()) - { - LPSERVICE lpService; - if ((lpService = lpiStart->OpenService (&status)) == NULL) - rc = FALSE; - else - { - lpService->Invalidate(); - lpService->RefreshStatus(); - lpService->Close(); - } - } - else - { - if ((lpServer = lpiStart->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - lpServer->RefreshAll(); - lpServer->Close(); - } - } - } - - if ((lpServer = lpiStart->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtStartServiceEnd, lpiStart, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_StopService (LPIDENT lpiStop, BOOL fTemporary, BOOL fWait, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtStopServiceBegin, lpiStop); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiStop->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - if (lpiStop->fIsService()) - { - TCHAR szName[ cchNAME ]; - lpiStop->GetServiceName (szName); - - if (fTemporary) - { - WORKERPACKET wp; - wp.wpBosProcessExecutionStateSetTemporary.hServer = hBOS; - wp.wpBosProcessExecutionStateSetTemporary.pszService = szName; - wp.wpBosProcessExecutionStateSetTemporary.state = SERVICESTATE_STOPPED; - // TODO: wp.wpStopBosProcessTemporary.fWait = TRUE; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessExecutionStateSetTemporary, &wp, &status); - AfsClass_Enter(); - } - else - { - WORKERPACKET wp; - wp.wpBosProcessExecutionStateSet.hServer = hBOS; - wp.wpBosProcessExecutionStateSet.pszService = szName; - wp.wpBosProcessExecutionStateSet.state = SERVICESTATE_STOPPED; - // TODO: wp.wpStopBosProcess.fWait = TRUE; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessExecutionStateSet, &wp, &status); - AfsClass_Enter(); - } - } - else if (fWait) - { - WORKERPACKET wp; - wp.wpBosProcessAllWaitStop.hServer = hBOS; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessAllWaitStop, &wp, &status); - AfsClass_Enter(); - } - else // (!fWait) - { - WORKERPACKET wp; - wp.wpBosProcessAllStop.hServer = hBOS; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessAllStop, &wp, &status); - AfsClass_Enter(); - } - } - - if (rc) - { - if (lpiStop->fIsService()) - { - LPSERVICE lpService; - if ((lpService = lpiStop->OpenService (&status)) == NULL) - rc = FALSE; - else - { - lpService->Invalidate(); - lpService->RefreshStatus(); - lpService->Close(); - } - } - else - { - LPSERVER lpServer; - if ((lpServer = lpiStop->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - lpServer->RefreshAll(); - lpServer->Close(); - } - } - } - - if ((lpServer = lpiStop->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtStopServiceEnd, lpiStop, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_RestartService (LPIDENT lpiRestart, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtRestartServiceBegin, lpiRestart); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiRestart->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - BOOL fRestartAll = FALSE; - if (!lpiRestart->fIsService()) - fRestartAll = TRUE; - - TCHAR szServiceRestart[ cchNAME ]; - if (lpiRestart->fIsService()) - { - lpiRestart->GetServiceName (szServiceRestart); - if (!lstrcmpi (szServiceRestart, TEXT("BOS"))) - fRestartAll = TRUE; - } - - if (rc) - { - if (!fRestartAll) - { - WORKERPACKET wp; - wp.wpBosProcessRestart.hServer = hBOS; - wp.wpBosProcessRestart.pszService = szServiceRestart; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessRestart, &wp, &status); - AfsClass_Enter(); - } - else // (fRestartAll) - { - WORKERPACKET wp; - wp.wpBosProcessAllStopAndRestart.hServer = hBOS; - wp.wpBosProcessAllStopAndRestart.fRestartBOS = TRUE; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessAllStopAndRestart, &wp, &status); - AfsClass_Enter(); - } - } - - if (rc) - { - if (!fRestartAll) - { - LPSERVICE lpService; - if ((lpService = lpiRestart->OpenService (&status)) == NULL) - rc = FALSE; - else - { - lpService->Invalidate(); - lpService->RefreshStatus(); - lpService->Close(); - } - } - else // (fRestartAll) - { - LPSERVER lpServer; - if ((lpServer = lpiRestart->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - lpServer->RefreshAll(); - lpServer->Close(); - } - } - } - - if ((lpServer = lpiRestart->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRestartServiceEnd, lpiRestart, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -LPIDENT AfsClass_CreateFileset (LPIDENT lpiAggregate, LPTSTR pszFileset, ULONG ckQuota, ULONG *pStatus) -{ - LPIDENT lpiFileset = NULL; - ULONG status; - BOOL rc = TRUE; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreateFilesetBegin, lpiAggregate, pszFileset, 0); - - // Obtain hCell and hVOS - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiAggregate->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain idPartition - // - int idPartition; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregate->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - idPartition = lpAggregate->GetID(); - lpAggregate->Close(); - } - - // Perform the actual operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeCreate.hCell = hCell; - wp.wpVosVolumeCreate.hServer = hVOS; - wp.wpVosVolumeCreate.idPartition = idPartition; - wp.wpVosVolumeCreate.pszVolume = pszFileset; - wp.wpVosVolumeCreate.ckQuota = ckQuota; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeCreate, &wp, &status); - AfsClass_Enter(); - } - - // Clean up - // - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregate->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshFilesets (TRUE, &status); - lpAggregate->Close(); - } - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiAggregate->OpenCell()) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpiAggregate); - lpCell->Close(); - } - } - - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregate->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - LPFILESET lpFileset; - if ((lpFileset = lpAggregate->OpenFileset (pszFileset, &status)) == NULL) - rc = FALSE; - else - { - lpiFileset = lpFileset->GetIdentifier(); - lpFileset->Close(); - } - lpAggregate->Close(); - } - } - - if (hVOS) - { - if ((lpServer = lpiAggregate->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCreateFilesetEnd, lpiAggregate, pszFileset, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpiFileset : NULL; -} - - -BOOL AfsClass_DeleteFileset (LPIDENT lpiFileset, BOOL fVLDB, BOOL fServer, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteFilesetBegin, lpiFileset); - - // Obtain hCell and hVOS - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiFileset->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Does the fileset have a VLDB entry? Does it actually exist on the server? - // What's its volume ID? Its R/W ID? Its partition ID? - // - VOLUMEID vidFileset; - VOLUMEID vidReadWrite; - int wFilesetGhost; - - // Obtain the ID of the fileset's parent aggregate. - // - int idPartition; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiFileset->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartition = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - - if (rc) - { - LPFILESET lpFileset; - if ((lpFileset = lpiFileset->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - wFilesetGhost = lpFileset->GetGhostStatus(); - lpiFileset->GetFilesetID (&vidFileset); - - FILESETSTATUS fs; - if (!lpFileset->GetStatus (&fs)) - vidReadWrite = vidFileset; - else - vidReadWrite = fs.idReadWrite; - - lpFileset->Close(); - } - } - - if (!(wFilesetGhost & GHOST_HAS_VLDB_ENTRY)) - fVLDB = FALSE; - if (!(wFilesetGhost & GHOST_HAS_SERVER_ENTRY)) - fServer = FALSE; - - if (rc && fVLDB && fServer) - { - WORKERPACKET wp; - wp.wpVosVolumeDelete.hCell = hCell; - wp.wpVosVolumeDelete.hServer = hVOS; - wp.wpVosVolumeDelete.idPartition = idPartition; - wp.wpVosVolumeDelete.idVolume = vidFileset; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeDelete, &wp, &status); - AfsClass_Enter(); - } - else if (rc && fVLDB) - { - WORKERPACKET wp; - wp.wpVosVLDBEntryRemove.hCell = hCell; - wp.wpVosVLDBEntryRemove.hServer = hVOS; - wp.wpVosVLDBEntryRemove.idPartition = idPartition; - wp.wpVosVLDBEntryRemove.idVolume = vidReadWrite; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBEntryRemove, &wp, &status); - AfsClass_Enter(); - } - else if (rc && fServer) - { - WORKERPACKET wp; - wp.wpVosVolumeZap.hCell = hCell; - wp.wpVosVolumeZap.hServer = hVOS; - wp.wpVosVolumeZap.idPartition = idPartition; - wp.wpVosVolumeZap.idVolume = vidFileset; - wp.wpVosVolumeZap.fForce = TRUE; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeZap, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiFileset->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshFilesets (TRUE); - lpAggregate->Close(); - } - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpiFileset->GetAggregate(), TRUE); - lpCell->Close(); - } - } - - if (hVOS) - { - if ((lpServer = lpiFileset->OpenServer()) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteFilesetEnd, lpiFileset, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_MoveFileset (LPIDENT lpiFileset, LPIDENT lpiAggregateTarget, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtMoveFilesetBegin, lpiFileset, lpiAggregateTarget, NULL, NULL, 0, 0); - - LPIDENT lpiAggregateSource = lpiFileset->GetAggregate(); - - // Obtain hCell, hVOS and the aggregate name for the source - // - PVOID hCell; - PVOID hVOSSource = NULL; - LPSERVER lpServer; - if ((lpServer = lpiFileset->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOSSource = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain the ID of the source aggregate - // - int idPartitionSource; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiFileset->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartitionSource = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - - // Obtain hCell, hVOS and the aggregate name for the target - // - PVOID hVOSTarget = NULL; - if ((lpServer = lpiAggregateTarget->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOSTarget = lpServer->OpenVosObject (NULL, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain the ID of the target aggregate - // - int idPartitionTarget; - if ((lpAggregate = lpiAggregateTarget->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartitionTarget = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeMove.hCell = hCell; - wp.wpVosVolumeMove.hServerFrom = hVOSSource; - wp.wpVosVolumeMove.idPartitionFrom = idPartitionSource; - wp.wpVosVolumeMove.hServerTo = hVOSTarget; - wp.wpVosVolumeMove.idPartitionTo = idPartitionTarget; - lpiFileset->GetFilesetID (&wp.wpVosVolumeMove.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeMove, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregateSource->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshFilesets(); - lpAggregate->Close(); - } - } - - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregateTarget->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshFilesets(); - lpAggregate->Close(); - } - } - - if (rc) - { - LPFILESET lpFileset; - if ((lpFileset = lpiFileset->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - lpFileset->Invalidate(); - lpFileset->RefreshStatus(); - lpFileset->Close(); - } - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpiAggregateSource, TRUE); - lpCell->RefreshVLDB (lpiAggregateTarget, TRUE); - lpCell->Close(); - } - } - - if (hVOSSource) - { - if ((lpServer = lpiAggregateSource->OpenServer()) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - if (hVOSTarget) - { - if ((lpServer = lpiAggregateTarget->OpenServer()) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtMoveFilesetEnd, lpiFileset, lpiAggregateTarget, NULL, NULL, 0, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SetFilesetQuota (LPIDENT lpiFileset, size_t ckQuotaNew, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtSetFilesetQuotaBegin, lpiFileset); - - // Obtain hCell and hVOS for the server where this fileset lives - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiFileset->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain the ID of the fileset's parent aggregate. - // - int idPartition; - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiFileset->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartition = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - } - - // Change the fileset's quota. - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeQuotaChange.hCell = hCell; - wp.wpVosVolumeQuotaChange.hServer = hVOS; - wp.wpVosVolumeQuotaChange.idPartition = idPartition; - lpiFileset->GetFilesetID (&wp.wpVosVolumeQuotaChange.idVolume); - wp.wpVosVolumeQuotaChange.ckQuota = ckQuotaNew; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeQuotaChange, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPFILESET lpFileset; - if ((lpFileset = lpiFileset->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - lpFileset->Invalidate(); - lpFileset->RefreshStatus(); - lpFileset->Close(); - } - } - - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiFileset->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->RefreshStatus(); - lpAggregate->Close(); - } - } - - if (hVOS != NULL) - { - if ((lpServer = lpiFileset->OpenServer()) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtSetFilesetQuotaEnd, lpiFileset, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SyncVLDB (LPIDENT lpiSync, BOOL fForce, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtSyncVLDBBegin, lpiSync); - - // Obtain hCell and hVOS - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiSync->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain the ID of the target aggregate. - // - int idPartition = NO_PARTITION; - if (rc && (lpiSync->fIsAggregate() || lpiSync->fIsFileset())) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiSync->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartition = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - } - - if (rc) - { - WORKERPACKET wp; - wp.wpVosVLDBSync.hCell = hCell; - wp.wpVosVLDBSync.hServer = hVOS; - wp.wpVosVLDBSync.idPartition = idPartition; - wp.wpVosVLDBSync.fForce = fForce; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBSync, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - if (lpiSync->fIsServer()) - { - LPSERVER lpServer; - if ((lpServer = lpiSync->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - rc = lpServer->RefreshAll (&status); - lpServer->Close(); - } - } - else // (lpiSync->fIsAggregate()) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiSync->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshStatus(); - lpAggregate->RefreshFilesets(); - lpAggregate->Close(); - - LPCELL lpCell; - if ((lpCell = lpiSync->OpenCell()) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpiSync); - lpCell->Close(); - } - } - } - } - - if (hVOS) - { - if ((lpServer = lpiSync->OpenServer()) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtSyncVLDBEnd, lpiSync, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_ChangeAddress (LPIDENT lpiServer, LPSOCKADDR_IN pAddrOld, LPSOCKADDR_IN pAddrNew, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtChangeAddressBegin, lpiServer); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiServer->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - if (rc && pAddrNew) - { - WORKERPACKET wp; - wp.wpVosFileServerAddressChange.hCell = hCell; - wp.wpVosFileServerAddressChange.addrOld = *pAddrOld; - wp.wpVosFileServerAddressChange.addrNew = *pAddrNew; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosFileServerAddressChange, &wp, &status); - AfsClass_Enter(); - } - else if (rc && !pAddrNew) - { - WORKERPACKET wp; - wp.wpVosFileServerAddressRemove.hCell = hCell; - wp.wpVosFileServerAddressRemove.addr = *pAddrOld; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosFileServerAddressRemove, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->InvalidateStatus(); - lpServer->Close(); - } - - LPCELL lpCell; - if ((lpCell = lpiServer->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->InvalidateServers (); - rc = lpCell->RefreshServers (TRUE, &status); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtChangeAddressEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_ChangeAddress (LPIDENT lpiServer, LPSERVERSTATUS pStatusOld, LPSERVERSTATUS pStatusNew, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtChangeAddressBegin, lpiServer); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiServer->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - if (rc) - { - AfsClass_Leave(); - - for (size_t iAddr = 0; rc && (iAddr < AFSCLASS_MAX_ADDRESSES_PER_SITE); ++iAddr) - { - int oldAddress; - int newAddress; - AfsClass_AddressToInt (&oldAddress, &pStatusOld->aAddresses[ iAddr ]); - AfsClass_AddressToInt (&newAddress, &pStatusNew->aAddresses[ iAddr ]); - - if (oldAddress && newAddress && (oldAddress != newAddress)) - { - WORKERPACKET wp; - wp.wpVosFileServerAddressChange.hCell = hCell; - wp.wpVosFileServerAddressChange.addrOld = pStatusOld->aAddresses[ iAddr ]; - wp.wpVosFileServerAddressChange.addrNew = pStatusNew->aAddresses[ iAddr ]; - - rc = Worker_DoTask (wtaskVosFileServerAddressChange, &wp, &status); - } - else if (oldAddress && !newAddress) - { - WORKERPACKET wp; - wp.wpVosFileServerAddressRemove.hCell = hCell; - wp.wpVosFileServerAddressRemove.addr = pStatusOld->aAddresses[ iAddr ]; - - rc = Worker_DoTask (wtaskVosFileServerAddressRemove, &wp, &status); - } - } - - AfsClass_Enter(); - } - - if (rc) - { - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->InvalidateStatus(); - lpServer->Close(); - } - - LPCELL lpCell; - if ((lpCell = lpiServer->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->InvalidateServers (); - rc = lpCell->RefreshServers (TRUE, &status); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtChangeAddressEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_LockFileset (LPIDENT lpiFileset, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtLockFilesetBegin, lpiFileset); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Obtain the fileset's read-write identifier - // - LPIDENT lpiRW = NULL; - LPFILESET lpFileset; - if ((lpFileset = lpiFileset->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - if ((lpiRW = lpFileset->GetReadWriteIdentifier()) == NULL) - rc = FALSE; - lpFileset->Close(); - } - - // Perform the lock operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVLDBEntryLock.hCell = hCell; - lpiRW->GetFilesetID (&wp.wpVosVLDBEntryLock.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBEntryLock, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if (lpiRW) - lpCell->RefreshVLDB (lpiRW, TRUE, NULL, TRUE); - else - lpCell->RefreshVLDB (lpiFileset->GetCell()); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtLockFilesetEnd, lpiFileset, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_UnlockFileset (LPIDENT lpiFileset, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtUnlockFilesetBegin, lpiFileset); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Obtain the fileset's read-write identifier - // - LPIDENT lpiRW = NULL; - LPFILESET lpFileset; - if ((lpFileset = lpiFileset->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - if ((lpiRW = lpFileset->GetReadWriteIdentifier()) == NULL) - rc = FALSE; - lpFileset->Close(); - } - - // Perform the unlock operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVLDBEntryUnlock.hCell = hCell; - wp.wpVosVLDBEntryUnlock.hServer = NULL; - wp.wpVosVLDBEntryUnlock.idPartition = NO_PARTITION; - lpiRW->GetFilesetID (&wp.wpVosVLDBEntryUnlock.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBEntryUnlock, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if (lpiRW) - lpCell->RefreshVLDB (lpiRW, TRUE, NULL, TRUE); - else - lpCell->RefreshVLDB (lpiFileset->GetCell()); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtUnlockFilesetEnd, lpiFileset, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_UnlockAllFilesets (LPIDENT lpi, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtUnlockAllFilesetsBegin, lpi); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpi->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Obtain hServer if appropriate - // - PVOID hVOS = NULL; - if (lpi && (!lpi->fIsCell())) - { - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (NULL, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - } - - // Obtain the ID of the scope aggregate. - // - int idPartition = NO_PARTITION; - if (rc && (lpi->fIsFileset() || (lpi->fIsAggregate()))) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartition = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - } - - // Perform the unlock operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVLDBEntryUnlock.hCell = hCell; - wp.wpVosVLDBEntryUnlock.hServer = hVOS; - wp.wpVosVLDBEntryUnlock.idPartition = idPartition; - wp.wpVosVLDBEntryUnlock.idVolume = NO_VOLUME; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBEntryUnlock, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpi->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpi); - lpCell->Close(); - } - } - - if (hVOS) - { - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtUnlockAllFilesetsEnd, lpi); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -LPIDENT AfsClass_CreateReplica (LPIDENT lpiFileset, LPIDENT lpiAggregate, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - LPIDENT lpiReplica = NULL; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreateReplicaBegin, lpiFileset, lpiAggregate, NULL, NULL, 0, 0); - - // Obtain hCell and hVOS for the target server - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiAggregate->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain idPartition - // - int idPartition; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregate->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - idPartition = lpAggregate->GetID(); - lpAggregate->Close(); - } - - // Modify VLDB to create mention of a new replica - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVLDBReadOnlySiteCreate.hCell = hCell; - wp.wpVosVLDBReadOnlySiteCreate.hServer = hVOS; - wp.wpVosVLDBReadOnlySiteCreate.idPartition = idPartition; - lpiFileset->GetFilesetID (&wp.wpVosVLDBReadOnlySiteCreate.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBReadOnlySiteCreate, &wp, &status); - AfsClass_Enter(); - } - - // Clean up - // - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiAggregate->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshFilesets (TRUE, &status); - lpAggregate->Close(); - } - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiAggregate->OpenCell()) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpiAggregate); - lpCell->Close(); - } - } - - if (rc) - { - LPFILESET lpFileset; - if ((lpFileset = lpiFileset->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - if ((lpiReplica = lpFileset->GetReadOnlyIdentifier (lpiAggregate, &status)) == NULL) - rc = FALSE; - lpFileset->Close(); - } - } - - if (hVOS) - { - if ((lpServer = lpiAggregate->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCreateReplicaEnd, lpiFileset, lpiAggregate, NULL, NULL, 0, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpiReplica : FALSE; -} - - -BOOL AfsClass_DeleteReplica (LPIDENT lpiReplica, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteFilesetBegin, lpiReplica); - - // Obtain hCell and hVOS for the server - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiReplica->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Get the read/write fileset identifier and Ghost status - // - LPIDENT lpiRW = NULL; - int wFilesetGhost = 0; - LPFILESET lpFileset; - if ((lpFileset = lpiReplica->OpenFileset (&status)) == NULL) - rc = FALSE; - else - { - wFilesetGhost = lpFileset->GetGhostStatus(); - if ((lpiRW = lpFileset->GetReadWriteIdentifier()) == NULL) - rc = FALSE; - lpFileset->Close(); - } - - TCHAR szAggregateName[ cchNAME ]; - lpiReplica->GetAggregateName (szAggregateName); - - // Obtain the ID of the replica's partition - // - int idPartition; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiReplica->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - idPartition = lpAggregate->GetID(); - lpAggregate->Close(); - } - - // If the volume exists in both VLDB and on the server, just delete it - // - if (rc && (wFilesetGhost & GHOST_HAS_VLDB_ENTRY) && (wFilesetGhost & GHOST_HAS_SERVER_ENTRY)) - { - WORKERPACKET wp; - wp.wpVosVolumeDelete.hCell = hCell; - wp.wpVosVolumeDelete.hServer = hVOS; - wp.wpVosVolumeDelete.idPartition = idPartition; - lpiReplica->GetFilesetID (&wp.wpVosVolumeDelete.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeDelete, &wp, &status); - AfsClass_Enter(); - } - else - { - // If necessary, modify VLDB to remove mention of this replica - // - if (rc && (wFilesetGhost & GHOST_HAS_VLDB_ENTRY)) - { - WORKERPACKET wp; - wp.wpVosVLDBReadOnlySiteDelete.hCell = hCell; - wp.wpVosVLDBReadOnlySiteDelete.hServer = hVOS; - wp.wpVosVLDBReadOnlySiteDelete.idPartition = idPartition; - lpiRW->GetFilesetID (&wp.wpVosVLDBReadOnlySiteDelete.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVLDBReadOnlySiteDelete, &wp, &status); - AfsClass_Enter(); - } - - // If necessary, zap the volume - // - if (rc && (wFilesetGhost & GHOST_HAS_SERVER_ENTRY)) - { - WORKERPACKET wp; - wp.wpVosVolumeZap.hCell = hCell; - wp.wpVosVolumeZap.hServer = hVOS; - wp.wpVosVolumeZap.idPartition = idPartition; - lpiReplica->GetFilesetID (&wp.wpVosVolumeZap.idVolume); - wp.wpVosVolumeZap.fForce = TRUE; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeZap, &wp, &status); - AfsClass_Enter(); - } - } - - // Clean up - // - if (rc) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiReplica->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshFilesets (TRUE, &status); - lpAggregate->Close(); - } - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiReplica->OpenCell()) == NULL) - rc = FALSE; - else - { - lpCell->RefreshVLDB (lpiReplica->GetAggregate()); - lpCell->Close(); - } - } - - if (hVOS) - { - if ((lpServer = lpiReplica->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteFilesetEnd, lpiReplica, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_DeleteClone (LPIDENT lpiClone, ULONG *pStatus) -{ - return AfsClass_DeleteFileset (lpiClone, TRUE, TRUE, pStatus); -} - - -BOOL AfsClass_InstallFile (LPIDENT lpiServer, LPTSTR pszTarget, LPTSTR pszSource, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtInstallFileBegin, lpiServer, pszSource, 0); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosExecutableCreate.hServer = hBOS; - wp.wpBosExecutableCreate.pszLocal = pszSource; - wp.wpBosExecutableCreate.pszRemoteDir = pszTarget; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosExecutableCreate, &wp, &status); - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtInstallFileEnd, lpiServer, pszSource, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_UninstallFile (LPIDENT lpiServer, LPTSTR pszUninstall, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtUninstallFileBegin, lpiServer, pszUninstall, 0); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosExecutableRevert.hServer = hBOS; - wp.wpBosExecutableRevert.pszFilename = pszUninstall; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosExecutableRevert, &wp, &status); - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtUninstallFileEnd, lpiServer, pszUninstall, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_PruneOldFiles (LPIDENT lpiServer, BOOL fBAK, BOOL fOLD, BOOL fCore, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtPruneFilesBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosExecutablePrune.hServer = hBOS; - wp.wpBosExecutablePrune.fPruneBak = fBAK; - wp.wpBosExecutablePrune.fPruneOld = fOLD; - wp.wpBosExecutablePrune.fPruneCore = fCore; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosExecutablePrune, &wp, &status); - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtPruneFilesEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_RenameFileset (LPIDENT lpiFileset, LPTSTR pszNewName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtRenameFilesetBegin, lpiFileset, pszNewName, 0); - - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeRename.hCell = hCell; - lpiFileset->GetFilesetID (&wp.wpVosVolumeRename.idVolume); - wp.wpVosVolumeRename.pszVolume = pszNewName; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeRename, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiFileset->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->Invalidate(); - rc = lpCell->RefreshAll (&status); - lpCell->Close(); - } - } - - - NOTIFYCALLBACK::SendNotificationToAll (evtRenameFilesetEnd, lpiFileset, pszNewName, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -#define iswhite(_ch) ((_ch)==TEXT(' ') || (_ch)==TEXT('\t')) - -LPIDENT AfsClass_CreateService (LPIDENT lpiServer, LPTSTR pszService, LPTSTR pszCommand, LPTSTR pszParams, LPTSTR pszNotifier, AFSSERVICETYPE type, SYSTEMTIME *pstIfCron, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - LPIDENT lpiService = NULL; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreateServiceBegin, lpiServer, pszService, 0); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosProcessCreate.hServer = hBOS; - wp.wpBosProcessCreate.pszService = pszService; - wp.wpBosProcessCreate.type = type; - wp.wpBosProcessCreate.pszNotifier = pszNotifier; - - TCHAR szFullCommand[ MAX_PATH + MAX_PATH ]; - wsprintf (szFullCommand, TEXT("%s %s"), pszCommand, pszParams); - wp.wpBosProcessCreate.pszCommand = szFullCommand; - - TCHAR szCronTime[ 256 ] = TEXT(""); - wp.wpBosProcessCreate.pszTimeCron = szCronTime; - - if (type == SERVICETYPE_CRON) - AfsClass_FormatRecurringTime (szCronTime, pstIfCron); - else - wp.wpBosProcessCreate.pszTimeCron = NULL; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessCreate, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->InvalidateServices(); - if (!lpServer->RefreshServices (TRUE, &status)) - rc = FALSE; - else - { - LPSERVICE lpService; - if ((lpService = lpServer->OpenService (pszService, &status)) == NULL) - rc = FALSE; - else - { - lpiService = lpService->GetIdentifier(); - lpService->Close(); - } - } - lpServer->Close(); - } - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCreateServiceEnd, lpiServer, pszService, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpiService : NULL; -} - - -BOOL AfsClass_DeleteService (LPIDENT lpiService, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteServiceBegin, lpiService); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiService->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Before a service can be deleted, it must be stopped (otherwise, on NT, - // the Delete operation won't block for the required Stop to complete-- - // so our wtaskDeleteBosProcess would return before the service really - // was deleted). - // - if (rc) - { - TCHAR szService[ cchNAME ]; - lpiService->GetServiceName (szService); - - WORKERPACKET wp; - wp.wpBosProcessExecutionStateSet.hServer = hBOS; - wp.wpBosProcessExecutionStateSet.pszService = szService; - wp.wpBosProcessExecutionStateSet.state = SERVICESTATE_STOPPED; - // TODO: wp.wpStopBosProcess.fWait = TRUE; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessExecutionStateSet, &wp, &status); - AfsClass_Enter(); - } - - // Delete the service - // - if (rc) - { - TCHAR szService[ cchNAME ]; - lpiService->GetServiceName (szService); - - WORKERPACKET wp; - wp.wpBosProcessDelete.hServer = hBOS; - wp.wpBosProcessDelete.pszService = szService; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosProcessDelete, &wp, &status); - AfsClass_Enter(); - } - - if (rc) - { - if ((lpServer = lpiService->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->InvalidateServices(); - if (!lpServer->RefreshServices (TRUE, &status)) - rc = FALSE; - lpServer->Close(); - } - } - - if ((lpServer = lpiService->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteServiceEnd, lpiService, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_ReleaseFileset (LPIDENT lpiFilesetRW, BOOL fForce, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtReleaseFilesetBegin, lpiFilesetRW); - - // Obtain hCell and hVOS - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpiFilesetRW->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Perform the actual operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeRelease.hCell = hCell; - wp.wpVosVolumeRelease.fForce = fForce; - lpiFilesetRW->GetFilesetID (&wp.wpVosVolumeRelease.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeRelease, &wp, &status); - AfsClass_Enter(); - } - - // Clean up - // - if (rc) - { - LPCELL lpCell; - if ((lpCell = lpiFilesetRW->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->Invalidate(); - rc = lpCell->RefreshAll (&status); - lpCell->Close(); - } - } - - if (hVOS) - { - if ((lpServer = lpiFilesetRW->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtReleaseFilesetEnd, lpiFilesetRW, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_GetFileDates (LPIDENT lpiServer, LPTSTR pszFilename, SYSTEMTIME *pstFile, SYSTEMTIME *pstBAK, SYSTEMTIME *pstOLD, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtGetFileDatesBegin, lpiServer, pszFilename, 0); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosExecutableTimestampGet.hServer = hBOS; - wp.wpBosExecutableTimestampGet.pszFilename = pszFilename; - - AfsClass_Leave(); - if ((rc = Worker_DoTask (wtaskBosExecutableTimestampGet, &wp, &status)) == TRUE) - { - *pstFile = wp.wpBosExecutableTimestampGet.timeNew; - *pstBAK = wp.wpBosExecutableTimestampGet.timeBak; - *pstOLD = wp.wpBosExecutableTimestampGet.timeOld; - } - - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtGetFileDatesEnd, lpiServer, pszFilename, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_ExecuteCommand (LPIDENT lpiServer, LPTSTR pszCommand, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtExecuteCommandBegin, lpiServer, pszCommand, 0); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosCommandExecute.hServer = hBOS; - wp.wpBosCommandExecute.pszCommand = pszCommand; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosCommandExecute, &wp, &status); - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtExecuteCommandEnd, lpiServer, pszCommand, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -LPADMINLIST AfsClass_AdminList_Load (LPIDENT lpiServer, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - LPADMINLIST lpList = NULL; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtAdminListLoadBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - lpList = New(ADMINLIST); - memset (lpList, 0x00, sizeof(ADMINLIST)); - lpList->cRef = 1; - lpList->lpiServer = lpiServer; - - WORKERPACKET wpBegin; - wpBegin.wpBosAdminGetBegin.hServer = hBOS; - if (!Worker_DoTask (wtaskBosAdminGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (;;) - { - TCHAR szAdmin[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpBosAdminGetNext.hEnum = wpBegin.wpBosAdminGetBegin.hEnum; - wpNext.wpBosAdminGetNext.pszAdmin = szAdmin; - - if (!Worker_DoTask (wtaskBosAdminGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - size_t iAdded; - if ((iAdded = AfsClass_AdminList_AddEntry (lpList, szAdmin)) != (size_t)-1) - { - lpList->aEntries[ iAdded ].fAdded = FALSE; - } - } - - WORKERPACKET wpDone; - wpDone.wpBosAdminGetDone.hEnum = wpBegin.wpBosAdminGetBegin.hEnum; - Worker_DoTask (wtaskBosAdminGetDone, &wpDone); - } - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtAdminListLoadEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpList : NULL; -} - - -LPADMINLIST AfsClass_AdminList_Copy (LPADMINLIST lpOld) -{ - LPADMINLIST lpNew = NULL; - - if (lpOld) - { - lpNew = New(ADMINLIST); - memcpy (lpNew, lpOld, sizeof(ADMINLIST)); - - lpNew->cRef = 1; - lpNew->aEntries = 0; - lpNew->cEntries = 0; - - if (REALLOC (lpNew->aEntries, lpNew->cEntries, lpOld->cEntries, cREALLOC_ADMINLISTENTRIES)) - { - size_t cb = lpOld->cEntries * sizeof(ADMINLISTENTRY); - memcpy (lpNew->aEntries, lpOld->aEntries, cb); - } - } - - return lpNew; -} - - -BOOL AfsClass_AdminList_Save (LPADMINLIST lpList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtAdminListSaveBegin, lpList->lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpList->lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - for (size_t iEntry = 0; iEntry < lpList->cEntries; ++iEntry) - { - if (!lpList->aEntries[ iEntry ].szAdmin[0]) - continue; - - // are we supposed to add this entry? - // - if (lpList->aEntries[ iEntry ].fAdded && !lpList->aEntries[ iEntry ].fDeleted) - { - WORKERPACKET wp; - wp.wpBosAdminCreate.hServer = hBOS; - wp.wpBosAdminCreate.pszAdmin = lpList->aEntries[ iEntry ].szAdmin; - - ULONG thisstatus; - if (!Worker_DoTask (wtaskBosAdminCreate, &wp, &thisstatus)) - { - rc = FALSE; - status = thisstatus; - } - else - { - lpList->aEntries[ iEntry ].fAdded = FALSE; - } - } - - // are we supposed to delete this entry? - // - if (!lpList->aEntries[ iEntry ].fAdded && lpList->aEntries[ iEntry ].fDeleted) - { - WORKERPACKET wp; - wp.wpBosAdminDelete.hServer = hBOS; - wp.wpBosAdminDelete.pszAdmin = lpList->aEntries[ iEntry ].szAdmin; - - ULONG thisstatus; - if (!Worker_DoTask (wtaskBosAdminDelete, &wp, &thisstatus)) - { - rc = FALSE; - status = thisstatus; - } - else - { - lpList->aEntries[ iEntry ].szAdmin[0] = TEXT('\0'); - lpList->aEntries[ iEntry ].fDeleted = FALSE; - } - } - } - } - - if ((lpServer = lpList->lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtAdminListSaveEnd, lpList->lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -void AfsClass_AdminList_Free (LPADMINLIST lpList) -{ - if (lpList && !InterlockedDecrement (&lpList->cRef)) - { - if (lpList->aEntries) - Free (lpList->aEntries); - memset (lpList, 0x00, sizeof(ADMINLIST)); - Delete (lpList); - } -} - - -size_t AfsClass_AdminList_AddEntry (LPADMINLIST lpList, LPTSTR pszAdmin) -{ - size_t iAdded = (size_t)-1; - - if (lpList) - { - for (size_t iEntry = 0; iEntry < lpList->cEntries; ++iEntry) - { - if (!lpList->aEntries[ iEntry ].szAdmin[0]) - break; - } - if (iEntry >= lpList->cEntries) - { - (void)REALLOC (lpList->aEntries, lpList->cEntries, 1+iEntry, cREALLOC_ADMINLISTENTRIES); - } - if (iEntry < lpList->cEntries) - { - iAdded = iEntry; - lstrcpy (lpList->aEntries[ iAdded ].szAdmin, pszAdmin); - lpList->aEntries[ iAdded ].fAdded = TRUE; - lpList->aEntries[ iAdded ].fDeleted = FALSE; - } - } - - return iAdded; -} - - -BOOL AfsClass_AdminList_DelEntry (LPADMINLIST lpList, size_t iIndex) -{ - BOOL rc = FALSE; - - if ( lpList && - (iIndex < lpList->cEntries) && - (lpList->aEntries[ iIndex ].szAdmin[0]) && - (!lpList->aEntries[ iIndex ].fDeleted) ) - { - if (lpList->aEntries[ iIndex ].fAdded) - lpList->aEntries[ iIndex ].szAdmin[0] = TEXT('\0'); - else - lpList->aEntries[ iIndex ].fDeleted = TRUE; - - rc = TRUE; - } - - return rc; -} - - -LPKEYLIST AfsClass_KeyList_Load (LPIDENT lpiServer, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - LPKEYLIST lpList = NULL; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtKeyListLoadBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - lpList = New(KEYLIST); - memset (lpList, 0x00, sizeof(KEYLIST)); - lpList->lpiServer = lpiServer; - - WORKERPACKET wpBegin; - wpBegin.wpBosKeyGetBegin.hServer = hBOS; - if (!Worker_DoTask (wtaskBosKeyGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (size_t iEnum = 0; ; ++iEnum) - { - WORKERPACKET wpNext; - wpNext.wpBosKeyGetNext.hEnum = wpBegin.wpBosKeyGetBegin.hEnum; - - if (!Worker_DoTask (wtaskBosKeyGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - if (REALLOC (lpList->aKeys, lpList->cKeys, 1+iEnum, cREALLOC_SERVERKEYS)) - { - lpList->aKeys[ iEnum ].keyVersion = wpNext.wpBosKeyGetNext.keyVersion; - memcpy (&lpList->aKeys[ iEnum ].keyData, &wpNext.wpBosKeyGetNext.keyData, sizeof(ENCRYPTIONKEY)); - memcpy (&lpList->aKeys[ iEnum ].keyInfo, &wpNext.wpBosKeyGetNext.keyInfo, sizeof(ENCRYPTIONKEYINFO)); - } - } - - WORKERPACKET wpDone; - wpDone.wpBosKeyGetDone.hEnum = wpBegin.wpBosKeyGetBegin.hEnum; - Worker_DoTask (wtaskBosKeyGetDone, &wpDone); - } - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtKeyListLoadEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpList : NULL; -} - - -void AfsClass_KeyList_Free (LPKEYLIST lpList) -{ - if (lpList) - { - if (lpList->aKeys) - Free (lpList->aKeys); - memset (lpList, 0x00, sizeof(KEYLIST)); - Delete (lpList); - } -} - - -BOOL AfsClass_AddKey (LPIDENT lpiServer, int keyVersion, LPTSTR pszString, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - TCHAR szCell[ cchNAME ]; - lpiServer->GetCellName (szCell); - - WORKERPACKET wp; - wp.wpKasStringToKey.pszCell = szCell; - wp.wpKasStringToKey.pszString = pszString; - if (!Worker_DoTask (wtaskKasStringToKey, &wp, &status)) - { - rc = FALSE; - } - else if (!AfsClass_AddKey (lpiServer, keyVersion, &wp.wpKasStringToKey.key, &status)) - { - rc = FALSE; - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_AddKey (LPIDENT lpiServer, int keyVersion, LPENCRYPTIONKEY pKey, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosKeyCreate.hServer = hBOS; - wp.wpBosKeyCreate.keyVersion = keyVersion; - memcpy (&wp.wpBosKeyCreate.key, pKey, sizeof(ENCRYPTIONKEY)); - rc = Worker_DoTask (wtaskBosKeyCreate, &wp, &status); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_DeleteKey (LPIDENT lpiServer, int keyVersion, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosKeyDelete.hServer = hBOS; - wp.wpBosKeyDelete.keyVersion = keyVersion; - rc = Worker_DoTask (wtaskBosKeyDelete, &wp, &status); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_GetRandomKey (LPIDENT lpi, LPENCRYPTIONKEY pKey, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - PVOID hCell; - PVOID hKAS; - LPCELL lpCell; - if ((lpCell = lpi->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - hKAS = lpCell->GetKasObject (&status); - lpCell->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpKasServerRandomKeyGet.hCell = hCell; - wp.wpKasServerRandomKeyGet.hServer = hKAS; - rc = Worker_DoTask (wtaskKasServerRandomKeyGet, &wp, &status); - - if (rc) - memcpy (pKey, &wp.wpKasServerRandomKeyGet.key, sizeof(ENCRYPTIONKEY)); - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_Clone (LPIDENT lpiRW, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCloneBegin, lpiRW, 0); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiRW->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Perform the actual operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosBackupVolumeCreate.hCell = hCell; - lpiRW->GetFilesetID (&wp.wpVosBackupVolumeCreate.idVolume); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosBackupVolumeCreate, &wp, &status); - AfsClass_Enter(); - } - - // Clean up - // - if (rc) - { - LPSERVER lpServer; - if ((lpServer = lpiRW->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - rc = lpServer->RefreshAll (&status); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCloneEnd, lpiRW, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_CloneMultiple (LPIDENT lpi, LPTSTR pszPrefix, BOOL fExclude, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCloneMultipleBegin, lpi); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpi->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Obtain hServer if appropriate - // - PVOID hVOS = NULL; - if (!lpi->fIsCell()) - { - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (NULL, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - } - - // If requested, obtain the appropriate aggregate ID - // - int idPartition = NO_PARTITION; - if (rc && (lpi->fIsFileset() || lpi->fIsAggregate())) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - if ((idPartition = lpAggregate->GetID()) == NO_PARTITION) - rc = FALSE; - lpAggregate->Close(); - } - } - - // Perform the actual operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosBackupVolumeCreateMultiple.hCell = hCell; - wp.wpVosBackupVolumeCreateMultiple.hServer = hVOS; - wp.wpVosBackupVolumeCreateMultiple.idPartition = idPartition; - wp.wpVosBackupVolumeCreateMultiple.pszPrefix = pszPrefix; - wp.wpVosBackupVolumeCreateMultiple.fExclude = fExclude; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosBackupVolumeCreateMultiple, &wp, &status); - AfsClass_Enter(); - } - - // Clean up - // - if (rc) - { - if (lpi->fIsCell()) - { - LPCELL lpCell; - if ((lpCell = lpi->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - lpCell->Invalidate(); - rc = lpCell->RefreshAll (&status); - lpCell->Close(); - } - } - else - { - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - rc = lpServer->RefreshAll (&status); - lpServer->Close(); - } - } - } - - if (hVOS) - { - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCloneMultipleEnd, lpi, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_DumpFileset (LPIDENT lpi, LPTSTR pszFilename, LPSYSTEMTIME pstDate, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtDumpFilesetBegin, lpi, pszFilename, 0); - - // Obtain hCell and hVOS - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain idPartition - // - int idPartition; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - idPartition = lpAggregate->GetID(); - lpAggregate->Close(); - } - - // Perform the actual operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeDump.hCell = hCell; - wp.wpVosVolumeDump.hServer = hVOS; - wp.wpVosVolumeDump.pszFilename = pszFilename; - wp.wpVosVolumeDump.idPartition = idPartition; - lpi->GetFilesetID (&wp.wpVosVolumeDump.idVolume); - - if (pstDate) - memcpy (&wp.wpVosVolumeDump.stStart, pstDate, sizeof(SYSTEMTIME)); - else - memset (&wp.wpVosVolumeDump.stStart, 0x00, sizeof(SYSTEMTIME)); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeDump, &wp, &status); - AfsClass_Enter(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDumpFilesetEnd, lpi, pszFilename, status); - AfsClass_Leave(); - - if (hVOS) - { - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_RestoreFileset (LPIDENT lpi, LPTSTR pszFileset, LPTSTR pszFilename, BOOL fIncremental, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtRestoreFilesetBegin, lpi, NULL, pszFileset, pszFilename, 0, 0); - - // Obtain hCell and hVOS - // - PVOID hCell; - PVOID hVOS = NULL; - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - // Obtain idPartition - // - int idPartition; - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - idPartition = lpAggregate->GetID(); - lpAggregate->Close(); - } - - // Perform the actual operation - // - if (rc) - { - WORKERPACKET wp; - wp.wpVosVolumeRestore.hCell = hCell; - wp.wpVosVolumeRestore.hServer = hVOS; - wp.wpVosVolumeRestore.idPartition = idPartition; - wp.wpVosVolumeRestore.pszVolume = pszFileset; - wp.wpVosVolumeRestore.pszFilename = pszFilename; - wp.wpVosVolumeRestore.fIncremental = fIncremental; - - if (lpi->fIsFileset()) - lpi->GetFilesetID (&wp.wpVosVolumeRestore.idVolume); - else - wp.wpVosVolumeRestore.idVolume = NO_VOLUME; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskVosVolumeRestore, &wp, &status); - AfsClass_Enter(); - } - - // Clean up - // - if (rc) - { - if ((lpServer = lpi->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - lpServer->Invalidate(); - rc = lpServer->RefreshAll (&status); - lpServer->Close(); - } - } - - if (hVOS) - { - if ((lpServer = lpi->OpenServer (&status)) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRestoreFilesetEnd, lpi, NULL, pszFileset, pszFilename, 0, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_GetRestartTimes (LPIDENT lpiServer, BOOL *pfWeekly, LPSYSTEMTIME pstWeekly, BOOL *pfDaily, LPSYSTEMTIME pstDaily, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtGetRestartTimesBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpBosExecutableRestartTimeGet.hServer = hBOS; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosExecutableRestartTimeGet, &wp, &status); - AfsClass_Enter(); - - if (rc) - { - *pfWeekly = wp.wpBosExecutableRestartTimeGet.fWeeklyRestart; - *pstWeekly = wp.wpBosExecutableRestartTimeGet.timeWeekly; - *pfDaily = wp.wpBosExecutableRestartTimeGet.fDailyRestart; - *pstDaily = wp.wpBosExecutableRestartTimeGet.timeDaily; - } - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtGetRestartTimesEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SetRestartTimes (LPIDENT lpiServer, LPSYSTEMTIME pstWeekly, LPSYSTEMTIME pstDaily, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtSetRestartTimesBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - SYSTEMTIME timeNever; - memset (&timeNever, 0x00, sizeof(SYSTEMTIME)); - - WORKERPACKET wp; - wp.wpBosExecutableRestartTimeSet.hServer = hBOS; - wp.wpBosExecutableRestartTimeSet.fWeeklyRestart = (pstWeekly != NULL) ? TRUE : FALSE; - wp.wpBosExecutableRestartTimeSet.timeWeekly = (pstWeekly != NULL) ? *pstWeekly : timeNever; - wp.wpBosExecutableRestartTimeSet.fDailyRestart = (pstDaily != NULL) ? TRUE : FALSE; - wp.wpBosExecutableRestartTimeSet.timeDaily = (pstDaily != NULL) ? *pstDaily : timeNever; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosExecutableRestartTimeSet, &wp, &status); - AfsClass_Enter(); - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtSetRestartTimesEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_MoveReplica (LPIDENT lpiReplica, LPIDENT lpiAggregateTarget, ULONG *pStatus) -{ - BOOL rc = TRUE; - - // Find the identifier for this replica's read/write fileset. - // - LPIDENT lpiFilesetRW = NULL; - LPFILESET lpFileset; - if ((lpFileset = lpiReplica->OpenFileset (pStatus)) == NULL) - rc = FALSE; - else - { - if ((lpiFilesetRW = lpFileset->GetReadWriteIdentifier (pStatus)) == NULL) - rc = FALSE; - lpFileset->Close(); - } - - // If the fileset replica currently resides on the same server - // as the target aggregate, we'll follow the following steps: - // - // 1. Delete the old fileset replica -> on error, quit - // 2. Create the new fileset replica -> on error, recreate old replica, quit - // - // If the fileset replica instead currently resides on a different - // server, we can follow the preferred steps: - // - // 1. Create the new fileset replica -> on error, quit - // 2. Delete the old fileset replica -> on error, delete the new replica, quit - // - if (rc) - { - LPIDENT lpiReplicaNew; - - if (lpiReplica->GetServer() == lpiAggregateTarget->GetServer()) - { - LPIDENT lpiAggregateOriginal = lpiReplica->GetAggregate(); - - if (!AfsClass_DeleteReplica (lpiReplica, pStatus)) - { - rc = FALSE; - } - else if ((lpiReplicaNew = AfsClass_CreateReplica (lpiFilesetRW, lpiAggregateTarget, pStatus)) == NULL) - { - (void)AfsClass_CreateReplica (lpiFilesetRW, lpiAggregateOriginal); - rc = FALSE; - } - } - else // different server? - { - if ((lpiReplicaNew = AfsClass_CreateReplica (lpiFilesetRW, lpiAggregateTarget, pStatus)) == NULL) - { - rc = FALSE; - } - else if (!AfsClass_DeleteReplica (lpiReplica, pStatus)) - { - (void)AfsClass_DeleteReplica (lpiReplicaNew, pStatus); - rc = FALSE; - } - } - } - - return rc; -} - - -BOOL AfsClass_Salvage (LPIDENT lpiSalvage, LPTSTR *ppszLogData, int nProcesses, LPTSTR pszTempDir, LPTSTR pszLogFile, BOOL fForce, BOOL fReadonly, BOOL fLogInodes, BOOL fLogRootInodes, BOOL fRebuildDirs, BOOL fReadBlocks, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtSalvageBegin, lpiSalvage); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiSalvage->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (ppszLogData) - *ppszLogData = NULL; - - // Step one: perform the actual salvage. This will dump a log file onto - // the target computer. - // - if (rc) - { - LPTSTR pszAggregate = NULL; - TCHAR szAggregate[ cchNAME ]; - if (lpiSalvage->fIsAggregate() || lpiSalvage->fIsFileset()) - { - lpiSalvage->GetAggregateName (szAggregate); - pszAggregate = szAggregate; - } - - LPTSTR pszFileset = NULL; - TCHAR szFileset[ cchNAME ]; - if (lpiSalvage->fIsFileset()) - { - VOLUMEID vid; - lpiSalvage->GetFilesetID (&vid); - wsprintf (szFileset, TEXT("%lu"), vid); - pszFileset = szFileset; - } - - if (pszLogFile == NULL) - pszLogFile = TEXT("SalvageLog"); - - WORKERPACKET wp; - wp.wpBosSalvage.hCell = hCell; - wp.wpBosSalvage.hServer = hBOS; - wp.wpBosSalvage.pszAggregate = pszAggregate; - wp.wpBosSalvage.pszFileset = pszFileset; - wp.wpBosSalvage.nProcesses = nProcesses; - wp.wpBosSalvage.pszTempDir = pszTempDir; - wp.wpBosSalvage.pszLogFile = pszLogFile; - wp.wpBosSalvage.fForce = fForce; - wp.wpBosSalvage.fReadonly = fReadonly; - wp.wpBosSalvage.fLogInodes = fLogInodes; - wp.wpBosSalvage.fLogRootInodes = fLogRootInodes; - wp.wpBosSalvage.fRebuildDirs = fRebuildDirs; - wp.wpBosSalvage.fReadBlocks = fReadBlocks; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskBosSalvage, &wp, &status); - AfsClass_Enter(); - } - - // Step two: retrieve the log file from that salvage operation. - // If we can't get the log file back, that's not fatal--just return - // a NULL pointer for the log data. - // - if (rc && ppszLogData) - { - WORKERPACKET wp; - wp.wpBosLogGet.hServer = hBOS; - wp.wpBosLogGet.pszLogName = pszLogFile; - wp.wpBosLogGet.pszLogData = NULL; - - AfsClass_Leave(); - if ((rc = Worker_DoTask (wtaskBosLogGet, &wp, &status)) == TRUE) - { - // Okay, well, we have the log in memory now. Problem is, - // it has UNIX-style CR's... and so is missing the LF which - // PCs expect before each CR. Wow--look at all the - // acronyms! Count the CRs, alloc a larger buffer, and stuff - // in the LFs before each CR. - // - size_t cchRequired = 1; - for (LPTSTR pchIn = wp.wpBosLogGet.pszLogData; *pchIn; ++pchIn) - { - cchRequired += (*pchIn == TEXT('\r')) ? 0 : (*pchIn == TEXT('\n')) ? 2 : 1; - } - - if ((*ppszLogData = AllocateString (cchRequired)) != NULL) - { - LPTSTR pszOut = *ppszLogData; - for (LPTSTR pchIn = wp.wpBosLogGet.pszLogData; *pchIn; ++pchIn) - { - if (*pchIn == TEXT('\n')) - *pszOut++ = TEXT('\r'); - if (*pchIn != TEXT('\r')) - *pszOut++ = *pchIn; - } - *pszOut++ = TEXT('\0'); - } - } - AfsClass_Enter(); - } - - if ((lpServer = lpiSalvage->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtSalvageEnd, lpiSalvage, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -void AfsClass_FreeSalvageLog (LPTSTR pszLogData) -{ - if (pszLogData) - Free (pszLogData); -} - - -LPHOSTLIST AfsClass_HostList_Load (LPIDENT lpiServer, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - LPHOSTLIST lpList = NULL; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtHostListLoadBegin, lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - lpList = New(HOSTLIST); - memset (lpList, 0x00, sizeof(HOSTLIST)); - lpList->cRef = 1; - lpList->lpiServer = lpiServer; - - WORKERPACKET wpBegin; - wpBegin.wpBosHostGetBegin.hServer = hBOS; - if (!Worker_DoTask (wtaskBosHostGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (;;) - { - TCHAR szHost[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpBosHostGetNext.hEnum = wpBegin.wpBosHostGetBegin.hEnum; - wpNext.wpBosHostGetNext.pszServer = szHost; - - if (!Worker_DoTask (wtaskBosHostGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - size_t iAdded; - if ((iAdded = AfsClass_HostList_AddEntry (lpList, szHost)) != (size_t)-1) - { - lpList->aEntries[ iAdded ].fAdded = FALSE; - } - } - - WORKERPACKET wpDone; - wpDone.wpBosHostGetDone.hEnum = wpBegin.wpBosHostGetBegin.hEnum; - Worker_DoTask (wtaskBosHostGetDone, &wpDone); - } - } - - if ((lpServer = lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtHostListLoadEnd, lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpList : NULL; -} - - -LPHOSTLIST AfsClass_HostList_Copy (LPHOSTLIST lpOld) -{ - LPHOSTLIST lpNew = NULL; - - if (lpOld) - { - lpNew = New(HOSTLIST); - memcpy (lpNew, lpOld, sizeof(HOSTLIST)); - - lpNew->cRef = 1; - lpNew->aEntries = 0; - lpNew->cEntries = 0; - - if (REALLOC (lpNew->aEntries, lpNew->cEntries, lpOld->cEntries, cREALLOC_HOSTLISTENTRIES)) - { - size_t cb = lpOld->cEntries * sizeof(HOSTLISTENTRY); - memcpy (lpNew->aEntries, lpOld->aEntries, cb); - } - } - - return lpNew; -} - - -BOOL AfsClass_HostList_Save (LPHOSTLIST lpList, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtHostListSaveBegin, lpList->lpiServer); - - PVOID hCell; - PVOID hBOS; - LPSERVER lpServer; - if ((lpServer = lpList->lpiServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - - if (rc) - { - for (size_t iEntry = 0; iEntry < lpList->cEntries; ++iEntry) - { - if (!lpList->aEntries[ iEntry ].szHost[0]) - continue; - - // are we supposed to add this entry? - // - if (lpList->aEntries[ iEntry ].fAdded && !lpList->aEntries[ iEntry ].fDeleted) - { - WORKERPACKET wp; - wp.wpBosHostCreate.hServer = hBOS; - wp.wpBosHostCreate.pszServer = lpList->aEntries[ iEntry ].szHost; - - ULONG thisstatus; - if (!Worker_DoTask (wtaskBosHostCreate, &wp, &thisstatus)) - { - rc = FALSE; - status = thisstatus; - } - else - { - lpList->aEntries[ iEntry ].fAdded = FALSE; - } - } - - // are we supposed to delete this entry? - // - if (!lpList->aEntries[ iEntry ].fAdded && lpList->aEntries[ iEntry ].fDeleted) - { - WORKERPACKET wp; - wp.wpBosHostDelete.hServer = hBOS; - wp.wpBosHostDelete.pszServer = lpList->aEntries[ iEntry ].szHost; - - ULONG thisstatus; - if (!Worker_DoTask (wtaskBosHostDelete, &wp, &thisstatus)) - { - rc = FALSE; - status = thisstatus; - } - else - { - lpList->aEntries[ iEntry ].szHost[0] = TEXT('\0'); - lpList->aEntries[ iEntry ].fDeleted = FALSE; - } - } - } - } - - if ((lpServer = lpList->lpiServer->OpenServer (&status)) != NULL) - { - lpServer->CloseBosObject(); - lpServer->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtHostListSaveEnd, lpList->lpiServer, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -void AfsClass_HostList_Free (LPHOSTLIST lpList) -{ - if (lpList && !InterlockedDecrement (&lpList->cRef)) - { - if (lpList->aEntries) - Free (lpList->aEntries); - memset (lpList, 0x00, sizeof(HOSTLIST)); - Delete (lpList); - } -} - - -size_t AfsClass_HostList_AddEntry (LPHOSTLIST lpList, LPTSTR pszHost) -{ - size_t iAdded = (size_t)-1; - - if (lpList) - { - for (size_t iEntry = 0; iEntry < lpList->cEntries; ++iEntry) - { - if (!lpList->aEntries[ iEntry ].szHost[0]) - break; - } - if (iEntry >= lpList->cEntries) - { - (void)REALLOC (lpList->aEntries, lpList->cEntries, 1+iEntry, cREALLOC_HOSTLISTENTRIES); - } - if (iEntry < lpList->cEntries) - { - iAdded = iEntry; - lstrcpy (lpList->aEntries[ iAdded ].szHost, pszHost); - lpList->aEntries[ iAdded ].fAdded = TRUE; - lpList->aEntries[ iAdded ].fDeleted = FALSE; - } - } - - return iAdded; -} - - -BOOL AfsClass_HostList_DelEntry (LPHOSTLIST lpList, size_t iIndex) -{ - BOOL rc = FALSE; - - if ( lpList && - (iIndex < lpList->cEntries) && - (lpList->aEntries[ iIndex ].szHost[0]) && - (!lpList->aEntries[ iIndex ].fDeleted) ) - { - if (lpList->aEntries[ iIndex ].fAdded) - lpList->aEntries[ iIndex ].szHost[0] = TEXT('\0'); - else - lpList->aEntries[ iIndex ].fDeleted = TRUE; - - rc = TRUE; - } - - return rc; -} - - -BOOL AfsClass_GetPtsProperties (LPIDENT lpiCell, LPPTSPROPERTIES pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - memset (pProperties, 0x00, sizeof(PTSPROPERTIES)); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Go get the necessary properties - // - if (rc) - { - WORKERPACKET wp; - wp.wpPtsUserMaxGet.hCell = hCell; - - if ((rc = Worker_DoTask (wtaskPtsUserMaxGet, &wp, &status)) == TRUE) - pProperties->idUserMax = wp.wpPtsUserMaxGet.idUserMax; - } - - if (rc) - { - WORKERPACKET wp; - wp.wpPtsGroupMaxGet.hCell = hCell; - - if ((rc = Worker_DoTask (wtaskPtsGroupMaxGet, &wp, &status)) == TRUE) - pProperties->idGroupMax = wp.wpPtsGroupMaxGet.idGroupMax; - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SetPtsProperties (LPIDENT lpiCell, LPPTSPROPERTIES pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Modify the specified properties - // - if (rc) - { - WORKERPACKET wp; - wp.wpPtsUserMaxSet.hCell = hCell; - wp.wpPtsUserMaxSet.idUserMax = pProperties->idUserMax; - rc = Worker_DoTask (wtaskPtsUserMaxSet, &wp, &status); - } - - if (rc) - { - WORKERPACKET wp; - wp.wpPtsGroupMaxSet.hCell = hCell; - wp.wpPtsGroupMaxSet.idGroupMax = pProperties->idGroupMax; - Worker_DoTask (wtaskPtsGroupMaxSet, &wp, &status); - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -LPIDENT AfsClass_CreateUser (LPIDENT lpiCell, LPTSTR pszUserName, LPTSTR pszInstance, LPTSTR pszPassword, int idUser, BOOL fCreateKAS, BOOL fCreatePTS, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - if (pszInstance && !*pszInstance) - pszInstance = NULL; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreateUserBegin, lpiCell, pszUserName, 0); - - // We'll need both hCell and hKAS. - // - PVOID hCell; - PVOID hKAS; - LPCELL lpCell; - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - hKAS = lpCell->GetKasObject (&status); - lpCell->Close(); - } - - // First try to create a KAS entry. - // - if (rc && fCreateKAS) - { - WORKERPACKET wp; - wp.wpKasPrincipalCreate.hCell = hCell; - wp.wpKasPrincipalCreate.hServer = hKAS; - wp.wpKasPrincipalCreate.pszPrincipal = pszUserName; - wp.wpKasPrincipalCreate.pszInstance = pszInstance; - wp.wpKasPrincipalCreate.pszPassword = pszPassword; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskKasPrincipalCreate, &wp, &status); - AfsClass_Enter(); - } - - // If that succeeded, try to create a PTS entry as well. - // - if (rc && fCreatePTS) - { - TCHAR szUserName[ cchNAME ]; - lstrcpy (szUserName, pszUserName); - if (pszInstance) - wsprintf (&szUserName[ lstrlen(szUserName) ], TEXT(".%s"), pszInstance); - - WORKERPACKET wp; - wp.wpPtsUserCreate.hCell = hCell; - wp.wpPtsUserCreate.pszUser = szUserName; - wp.wpPtsUserCreate.idUser = idUser; - - AfsClass_Leave(); - - if ((rc = Worker_DoTask (wtaskPtsUserCreate, &wp, &status)) == FALSE) - { - if (status == PREXIST) - rc = TRUE; - } - - if (!rc) - { - // If we couldn't make a KAS entry as well, remove the KAS entry. - // - if (fCreateKAS) - { - WORKERPACKET wpDel; - wpDel.wpKasPrincipalDelete.hCell = hCell; - wpDel.wpKasPrincipalDelete.hServer = hKAS; - wpDel.wpKasPrincipalDelete.pszPrincipal = pszUserName; - wpDel.wpKasPrincipalDelete.pszInstance = pszInstance; - Worker_DoTask (wtaskKasPrincipalDelete, &wpDel); - } - } - - AfsClass_Enter(); - } - - // If we were able to create the user's accounts successfully, refresh - // the cell status and return the new user's ident. - // - LPIDENT lpiUser; - - if (rc) - { - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if (!lpCell->RefreshAccount (pszUserName, pszInstance, CELL_REFRESH_ACCOUNT_CREATED_USER, &lpiUser)) - rc = FALSE; - else if (!lpiUser) - rc = FALSE; - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCreateUserEnd, lpiCell, pszUserName, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpiUser : NULL; -} - - -BOOL AfsClass_SetUserProperties (LPIDENT lpiUser, LPUSERPROPERTIES pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtChangeUserBegin, lpiUser); - - // We'll need both hCell and hKAS. - // - PVOID hCell; - PVOID hKAS; - LPCELL lpCell; - if ((lpCell = lpiUser->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - hKAS = lpCell->GetKasObject (&status); - lpCell->Close(); - } - - // We'll also need this user's current status - // - LPUSER lpUser; - USERSTATUS us; - if ((lpUser = lpiUser->OpenUser (&status)) == NULL) - rc = FALSE; - else - { - if (!lpUser->GetStatus (&us, TRUE, &status)) - rc = FALSE; - lpUser->Close(); - } - - // Modify the user's KAS entry (if necessary) - // - DWORD dwKasMask = ( MASK_USERPROP_fAdmin | - MASK_USERPROP_fGrantTickets | - MASK_USERPROP_fCanEncrypt | - MASK_USERPROP_fCanChangePassword | - MASK_USERPROP_fCanReusePasswords | - MASK_USERPROP_timeAccountExpires | - MASK_USERPROP_cdayPwExpires | - MASK_USERPROP_csecTicketLifetime | - MASK_USERPROP_nFailureAttempts | - MASK_USERPROP_csecFailedLoginLockTime ); - - if (rc && (pProperties->dwMask & dwKasMask)) - { - TCHAR szPrincipal[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - lpiUser->GetUserName (szPrincipal, szInstance); - - WORKERPACKET wp; - wp.wpKasPrincipalFieldsSet.hCell = hCell; - wp.wpKasPrincipalFieldsSet.hServer = hKAS; - wp.wpKasPrincipalFieldsSet.pszPrincipal = szPrincipal; - wp.wpKasPrincipalFieldsSet.pszInstance = szInstance; - wp.wpKasPrincipalFieldsSet.fIsAdmin = (pProperties->dwMask & MASK_USERPROP_fAdmin) ? pProperties->fAdmin : us.KASINFO.fIsAdmin; - wp.wpKasPrincipalFieldsSet.fGrantTickets = (pProperties->dwMask & MASK_USERPROP_fGrantTickets) ? pProperties->fGrantTickets : us.KASINFO.fCanGetTickets; - wp.wpKasPrincipalFieldsSet.fCanEncrypt = (pProperties->dwMask & MASK_USERPROP_fCanEncrypt) ? pProperties->fCanEncrypt : us.KASINFO.fEncrypt; - wp.wpKasPrincipalFieldsSet.fCanChangePassword = (pProperties->dwMask & MASK_USERPROP_fCanChangePassword) ? pProperties->fCanChangePassword : us.KASINFO.fCanChangePassword; - wp.wpKasPrincipalFieldsSet.fCanReusePasswords = (pProperties->dwMask & MASK_USERPROP_fCanReusePasswords) ? pProperties->fCanReusePasswords : us.KASINFO.fCanReusePasswords; - memcpy (&wp.wpKasPrincipalFieldsSet.timeExpires, (pProperties->dwMask & MASK_USERPROP_timeAccountExpires) ? &pProperties->timeAccountExpires : &us.KASINFO.timeExpires, sizeof(SYSTEMTIME)); - wp.wpKasPrincipalFieldsSet.cdayPwExpires = (pProperties->dwMask & MASK_USERPROP_cdayPwExpires) ? pProperties->cdayPwExpires : us.KASINFO.cdayPwExpire; - wp.wpKasPrincipalFieldsSet.csecTicketLifetime = (pProperties->dwMask & MASK_USERPROP_csecTicketLifetime) ? pProperties->csecTicketLifetime : us.KASINFO.csecTicketLifetime; - wp.wpKasPrincipalFieldsSet.nFailureAttempts = (pProperties->dwMask & MASK_USERPROP_nFailureAttempts) ? pProperties->nFailureAttempts : us.KASINFO.cFailLogin; - wp.wpKasPrincipalFieldsSet.csecFailedLoginLockTime = (pProperties->dwMask & MASK_USERPROP_csecFailedLoginLockTime) ? pProperties->csecFailedLoginLockTime : us.KASINFO.csecFailLoginLock; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskKasPrincipalFieldsSet, &wp, &status); - AfsClass_Enter(); - } - - - // Modify the user's PTS entry (if necessary) - // - DWORD dwPtsMask = ( MASK_USERPROP_cGroupCreationQuota | - MASK_USERPROP_aaListStatus | - MASK_USERPROP_aaGroupsOwned | - MASK_USERPROP_aaMembership ); - - if (rc && (pProperties->dwMask & dwPtsMask)) - { - TCHAR szFullName[ cchNAME ]; - lpiUser->GetFullUserName (szFullName); - - WORKERPACKET wp; - wp.wpPtsUserModify.hCell = hCell; - wp.wpPtsUserModify.pszUser = szFullName; - memset (&wp.wpPtsUserModify.Delta, 0x00, sizeof(wp.wpPtsUserModify.Delta)); - - if (pProperties->dwMask & MASK_USERPROP_cGroupCreationQuota) - { - wp.wpPtsUserModify.Delta.flag = (pts_UserUpdateFlag_t)( (LONG)wp.wpPtsUserModify.Delta.flag | (LONG)PTS_USER_UPDATE_GROUP_CREATE_QUOTA ); - wp.wpPtsUserModify.Delta.groupCreationQuota = pProperties->cGroupCreationQuota; - } - - if (pProperties->dwMask & (MASK_USERPROP_aaListStatus | MASK_USERPROP_aaGroupsOwned | MASK_USERPROP_aaMembership)) - { - wp.wpPtsUserModify.Delta.flag = (pts_UserUpdateFlag_t)( (LONG)wp.wpPtsUserModify.Delta.flag | (LONG)PTS_USER_UPDATE_PERMISSIONS ); - wp.wpPtsUserModify.Delta.listStatus = ACCOUNTACCESS_TO_USERACCESS( (pProperties->dwMask & MASK_USERPROP_aaListStatus) ? pProperties->aaListStatus : us.PTSINFO.aaListStatus ); - wp.wpPtsUserModify.Delta.listGroupsOwned = ACCOUNTACCESS_TO_USERACCESS( (pProperties->dwMask & MASK_USERPROP_aaGroupsOwned) ? pProperties->aaGroupsOwned : us.PTSINFO.aaGroupsOwned ); - wp.wpPtsUserModify.Delta.listMembership = ACCOUNTACCESS_TO_USERACCESS( (pProperties->dwMask & MASK_USERPROP_aaMembership) ? pProperties->aaMembership : us.PTSINFO.aaMembership ); - } - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsUserModify, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to modify the user's properties successfully, refresh - // that user's status. - // - if ((lpUser = lpiUser->OpenUser (&status)) != NULL) - { - lpUser->Invalidate(); - lpUser->RefreshStatus(); - lpUser->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtChangeUserBegin, lpiUser, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SetUserPassword (LPIDENT lpiUser, int keyVersion, LPTSTR pszPassword, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - TCHAR szCell[ cchNAME ]; - lpiUser->GetCellName (szCell); - - WORKERPACKET wp; - wp.wpKasStringToKey.pszCell = szCell; - wp.wpKasStringToKey.pszString = pszPassword; - if (!Worker_DoTask (wtaskKasStringToKey, &wp, &status)) - { - rc = FALSE; - } - else if (!AfsClass_SetUserPassword (lpiUser, keyVersion, &wp.wpKasStringToKey.key, &status)) - { - rc = FALSE; - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_SetUserPassword (LPIDENT lpiUser, int keyVersion, LPENCRYPTIONKEY pKey, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtChangeUserPasswordBegin, lpiUser); - - // We'll need both hCell and hKAS. - // - PVOID hCell; - PVOID hKAS; - LPCELL lpCell; - if ((lpCell = lpiUser->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - hKAS = lpCell->GetKasObject (&status); - lpCell->Close(); - } - - // Change the user's password - // - if (rc) - { - TCHAR szPrincipal[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - lpiUser->GetUserName (szPrincipal, szInstance); - - WORKERPACKET wp; - wp.wpKasPrincipalKeySet.hCell = hCell; - wp.wpKasPrincipalKeySet.hServer = hKAS; - wp.wpKasPrincipalKeySet.pszPrincipal = szPrincipal; - wp.wpKasPrincipalKeySet.pszInstance = szInstance; - wp.wpKasPrincipalKeySet.keyVersion = keyVersion; - memcpy (&wp.wpKasPrincipalKeySet.key.key, &pKey->key, ENCRYPTIONKEY_LEN); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskKasPrincipalKeySet, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to modify the user's password successfully, refresh - // that user's status. - // - LPUSER lpUser; - if ((lpUser = lpiUser->OpenUser (&status)) != NULL) - { - lpUser->Invalidate(); - lpUser->RefreshStatus(); - lpUser->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtChangeUserPasswordEnd, lpiUser, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_DeleteUser (LPIDENT lpiUser, BOOL fDeleteKAS, BOOL fDeletePTS, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteUserBegin, lpiUser); - - // We'll need both hCell and hKAS. - // - PVOID hCell; - PVOID hKAS; - LPCELL lpCell; - if ((lpCell = lpiUser->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - hKAS = lpCell->GetKasObject (&status); - lpCell->Close(); - } - - // Find out whether this user has KAS and/or PTS entries. Also - // get the various lists of groups for this user... - // - LPUSER lpUser; - LPTSTR mszOwnerOf = NULL; - LPTSTR mszMemberOf = NULL; - if ((lpUser = lpiUser->OpenUser (&status)) == NULL) - rc = FALSE; - else - { - lpUser->GetOwnerOf (&mszOwnerOf); - lpUser->GetMemberOf (&mszMemberOf); - lpUser->Close(); - } - - // Delete the user's PTS entry - // - if (rc && fDeletePTS) - { - TCHAR szFullName[ cchNAME ]; - lpiUser->GetFullUserName (szFullName); - - WORKERPACKET wp; - wp.wpPtsUserDelete.hCell = hCell; - wp.wpPtsUserDelete.pszUser = szFullName; - - AfsClass_Leave(); - if ((rc = Worker_DoTask (wtaskPtsUserDelete, &wp, &status)) == FALSE) - { - if (status == ADMPTSFAILEDNAMETRANSLATE) // User had no PTS entry? - rc = TRUE; - } - AfsClass_Enter(); - } - - // Delete the user's KAS entry - // - if (rc && fDeleteKAS) - { - TCHAR szPrincipal[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - lpiUser->GetUserName (szPrincipal, szInstance); - - WORKERPACKET wp; - wp.wpKasPrincipalDelete.hCell = hCell; - wp.wpKasPrincipalDelete.hServer = hKAS; - wp.wpKasPrincipalDelete.pszPrincipal = szPrincipal; - wp.wpKasPrincipalDelete.pszInstance = szInstance; - - AfsClass_Leave(); - if ((rc = Worker_DoTask (wtaskKasPrincipalDelete, &wp, &status)) == FALSE) - { - if (status == KANOENT) - rc = TRUE; - } - AfsClass_Enter(); - } - - // If we were able to delete the user's accounts successfully, refresh - // the cell status. - // - if (rc) - { - if ((lpCell = lpiUser->OpenCell (&status)) != NULL) - { - TCHAR szPrincipal[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - lpiUser->GetUserName (szPrincipal, szInstance); - - lpCell->RefreshAccount (szPrincipal, szInstance, CELL_REFRESH_ACCOUNT_DELETED); - lpCell->RefreshAccounts (mszOwnerOf, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccounts (mszMemberOf, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteUserEnd, lpiUser, status); - AfsClass_Leave(); - - if (mszOwnerOf) - FreeString (mszOwnerOf); - if (mszMemberOf) - FreeString (mszMemberOf); - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_UnlockUser (LPIDENT lpiUser, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtUnlockUserBegin, lpiUser); - - // We'll need both hCell and hKAS. - // - PVOID hCell; - PVOID hKAS; - LPCELL lpCell; - if ((lpCell = lpiUser->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - hKAS = lpCell->GetKasObject (&status); - lpCell->Close(); - } - - // Unlock the user's KAS entry - // - if (rc) - { - TCHAR szPrincipal[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - lpiUser->GetUserName (szPrincipal, szInstance); - - WORKERPACKET wp; - wp.wpKasPrincipalUnlock.hCell = hCell; - wp.wpKasPrincipalUnlock.hServer = hKAS; - wp.wpKasPrincipalUnlock.pszPrincipal = szPrincipal; - wp.wpKasPrincipalUnlock.pszInstance = szInstance; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskKasPrincipalUnlock, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to unlock the user's accounts successfully, refresh - // the user's properties. - // - if (rc) - { - LPUSER lpUser; - if ((lpUser = lpiUser->OpenUser (&status)) != NULL) - { - lpUser->Invalidate(); - lpUser->RefreshStatus(); - lpUser->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtUnlockUserEnd, lpiUser, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -LPIDENT AfsClass_CreateGroup (LPIDENT lpiCell, LPTSTR pszGroupName, LPIDENT lpiOwner, int idGroup, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreateGroupBegin, lpiCell, pszGroupName, 0); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Create a PTS entry for the new group - // - if (rc) - { - TCHAR szOwner[ cchNAME ] = TEXT(""); - if (lpiOwner && lpiOwner->fIsUser()) - lpiOwner->GetFullUserName (szOwner); - else if (lpiOwner && lpiOwner->fIsGroup()) - lpiOwner->GetGroupName (szOwner); - - WORKERPACKET wp; - wp.wpPtsGroupCreate.hCell = hCell; - wp.wpPtsGroupCreate.pszGroup = pszGroupName; - wp.wpPtsGroupCreate.pszOwner = (szOwner[0]) ? szOwner : NULL; - wp.wpPtsGroupCreate.idGroup = idGroup; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsGroupCreate, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to create the group successfully, refresh - // the cell status and return the new group's ident. - // - LPIDENT lpiGroup; - - if (rc) - { - if ((lpCell = lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if (!lpCell->RefreshAccount (pszGroupName, NULL, CELL_REFRESH_ACCOUNT_CREATED_GROUP, &lpiGroup)) - rc = FALSE; - else if (!lpiGroup) - rc = FALSE; - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtCreateGroupEnd, lpiCell, pszGroupName, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return (rc) ? lpiGroup : NULL; -} - - -BOOL AfsClass_SetGroupProperties (LPIDENT lpiGroup, LPGROUPPROPERTIES pProperties, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtChangeGroupBegin, lpiGroup); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiGroup->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // We'll also need this group's current status - // - LPPTSGROUP lpGroup; - PTSGROUPSTATUS gs; - if ((lpGroup = lpiGroup->OpenGroup (&status)) == NULL) - rc = FALSE; - else - { - if (!lpGroup->GetStatus (&gs, TRUE, &status)) - rc = FALSE; - lpGroup->Close(); - } - - // Modify the group's PTS entry (if requested) - // - DWORD dwPtsMask = ( MASK_GROUPPROP_aaListStatus | - MASK_GROUPPROP_aaListGroupsOwned | - MASK_GROUPPROP_aaListMembers | - MASK_GROUPPROP_aaAddMember | - MASK_GROUPPROP_aaDeleteMember ); - - if (rc && (pProperties->dwMask & dwPtsMask)) - { - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - - WORKERPACKET wp; - wp.wpPtsGroupModify.hCell = hCell; - wp.wpPtsGroupModify.pszGroup = szGroup; - memset (&wp.wpPtsGroupModify.Delta, 0x00, sizeof(wp.wpPtsGroupModify.Delta)); - wp.wpPtsGroupModify.Delta.listStatus = ACCOUNTACCESS_TO_GROUPACCESS( (pProperties->dwMask & MASK_GROUPPROP_aaListStatus) ? pProperties->aaListStatus : gs.aaListStatus ); - wp.wpPtsGroupModify.Delta.listGroupsOwned = ACCOUNTACCESS_TO_GROUPACCESS( (pProperties->dwMask & MASK_GROUPPROP_aaListGroupsOwned) ? pProperties->aaListGroupsOwned : gs.aaListGroupsOwned ); - wp.wpPtsGroupModify.Delta.listMembership = ACCOUNTACCESS_TO_GROUPACCESS( (pProperties->dwMask & MASK_GROUPPROP_aaListMembers) ? pProperties->aaListMembers : gs.aaListMembers ); - wp.wpPtsGroupModify.Delta.listAdd = ACCOUNTACCESS_TO_GROUPACCESS( (pProperties->dwMask & MASK_GROUPPROP_aaAddMember) ? pProperties->aaAddMember : gs.aaAddMember ); - wp.wpPtsGroupModify.Delta.listDelete = ACCOUNTACCESS_TO_GROUPACCESS( (pProperties->dwMask & MASK_GROUPPROP_aaDeleteMember) ? pProperties->aaDeleteMember : gs.aaDeleteMember ); - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsGroupModify, &wp, &status); - AfsClass_Enter(); - } - - // Change the group's owner (if requested) - // - if (rc && (pProperties->dwMask & MASK_GROUPPROP_szOwner)) - { - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - - WORKERPACKET wp; - wp.wpPtsGroupOwnerChange.hCell = hCell; - wp.wpPtsGroupOwnerChange.pszGroup = szGroup; - wp.wpPtsGroupOwnerChange.pszOwner = pProperties->szOwner; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsGroupOwnerChange, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to modify the group's properties successfully, refresh - // either the group's status. If the group's owner changed, also refresh - // the group's old and new owners. - // - if (rc) - { - if ((lpCell = lpiGroup->OpenCell (&status)) != NULL) - { - TCHAR szAccount[ cchNAME ]; - lpiGroup->GetGroupName (szAccount); - lpCell->RefreshAccount (szAccount, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - - if (pProperties->dwMask & MASK_GROUPPROP_szOwner) - { - lpCell->RefreshAccount (gs.szOwner, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccount (pProperties->szOwner, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - } - - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtChangeGroupBegin, lpiGroup, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_RenameGroup (LPIDENT lpiGroup, LPTSTR pszNewName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtRenameGroupBegin, lpiGroup); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiGroup->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Get this group's list of members (etc) - // - LPTSTR mszOwnerOf = NULL; - LPTSTR mszMemberOf = NULL; - LPTSTR mszMembers = NULL; - - LPPTSGROUP lpGroup; - if ((lpGroup = lpiGroup->OpenGroup (&status)) != NULL) - { - lpGroup->GetOwnerOf (&mszOwnerOf); - lpGroup->GetMemberOf (&mszMemberOf); - lpGroup->GetMembers (&mszMembers); - lpGroup->Close(); - } - - // Rename the group's PTS entry - // - if (rc) - { - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - - WORKERPACKET wp; - wp.wpPtsGroupRename.hCell = hCell; - wp.wpPtsGroupRename.pszGroup = szGroup; - wp.wpPtsGroupRename.pszNewName = pszNewName; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsGroupRename, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to rename the group successfully, refresh the cell status. - // - if (rc) - { - LPPTSGROUP lpGroup; - if ((lpGroup = lpiGroup->OpenGroup (&status)) != NULL) - { - lpGroup->ChangeIdentName (pszNewName); - lpGroup->Close(); - } - if ((lpCell = lpiGroup->OpenCell (&status)) != NULL) - { - lpCell->RefreshAccount (pszNewName, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccounts (mszOwnerOf, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccounts (mszMemberOf, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccounts (mszMembers, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRenameGroupEnd, lpiGroup, status); - AfsClass_Leave(); - - if (mszOwnerOf) - FreeString (mszOwnerOf); - if (mszMemberOf) - FreeString (mszMemberOf); - if (mszMembers) - FreeString (mszMembers); - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_DeleteGroup (LPIDENT lpiGroup, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteGroupBegin, lpiGroup); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiGroup->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - // Get this group's list of members (etc) - // - LPTSTR mszOwnerOf = NULL; - LPTSTR mszMemberOf = NULL; - LPTSTR mszMembers = NULL; - - LPPTSGROUP lpGroup; - if ((lpGroup = lpiGroup->OpenGroup (&status)) != NULL) - { - lpGroup->GetOwnerOf (&mszOwnerOf); - lpGroup->GetMemberOf (&mszMemberOf); - lpGroup->GetMembers (&mszMembers); - lpGroup->Close(); - } - - // Delete the group's PTS entry - // - if (rc) - { - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - - WORKERPACKET wp; - wp.wpPtsGroupDelete.hCell = hCell; - wp.wpPtsGroupDelete.pszGroup = szGroup; - - AfsClass_Leave(); - if ((rc = Worker_DoTask (wtaskPtsGroupDelete, &wp, &status)) == FALSE) - { - if (status == ADMPTSFAILEDNAMETRANSLATE) // Group had no PTS entry? - rc = TRUE; - } - AfsClass_Enter(); - } - - // If we were able to delete the group successfully, refresh the cell status. - // - if (rc) - { - if ((lpCell = lpiGroup->OpenCell (&status)) != NULL) - { - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - lpCell->RefreshAccounts (mszOwnerOf, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccounts (mszMemberOf, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccounts (mszMembers, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccount (szGroup, NULL, CELL_REFRESH_ACCOUNT_DELETED); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDeleteGroupEnd, lpiGroup, status); - AfsClass_Leave(); - - if (mszOwnerOf) - FreeString (mszOwnerOf); - if (mszMemberOf) - FreeString (mszMemberOf); - if (mszMembers) - FreeString (mszMembers); - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_AddUserToGroup (LPIDENT lpiGroup, LPIDENT lpiUser, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtGroupMemberAddBegin, lpiGroup, lpiUser, NULL, NULL, 0, 0); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiGroup->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - - TCHAR szMember[ cchNAME ]; - if (lpiUser->fIsUser()) - lpiUser->GetFullUserName (szMember); - else // (lpiUser->fIsGroup()) - lpiUser->GetGroupName (szMember); - - // Add this user to the specified group - // - if (rc) - { - WORKERPACKET wp; - wp.wpPtsGroupMemberAdd.hCell = hCell; - wp.wpPtsGroupMemberAdd.pszGroup = szGroup; - wp.wpPtsGroupMemberAdd.pszUser = szMember; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsGroupMemberAdd, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to change the group successfully, update the group's - // and user's properties. - // - if (rc) - { - if ((lpCell = lpiGroup->OpenCell (&status)) != NULL) - { - lpCell->RefreshAccount (szGroup, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccount (szMember, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtGroupMemberAddEnd, lpiGroup, lpiUser, NULL, NULL, 0, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL AfsClass_RemoveUserFromGroup (LPIDENT lpiGroup, LPIDENT lpiUser, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status; - - AfsClass_Enter(); - NOTIFYCALLBACK::SendNotificationToAll (evtGroupMemberRemoveBegin, lpiGroup, lpiUser, NULL, NULL, 0, 0); - - // Obtain hCell - // - PVOID hCell; - LPCELL lpCell; - if ((lpCell = lpiGroup->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - lpCell->Close(); - } - - TCHAR szGroup[ cchNAME ]; - lpiGroup->GetGroupName (szGroup); - - TCHAR szMember[ cchNAME ]; - if (lpiUser->fIsUser()) - lpiUser->GetFullUserName (szMember); - else // (lpiUser->fIsGroup()) - lpiUser->GetGroupName (szMember); - - // Remove this user from the specified group - // - if (rc) - { - WORKERPACKET wp; - wp.wpPtsGroupMemberRemove.hCell = hCell; - wp.wpPtsGroupMemberRemove.pszGroup = szGroup; - wp.wpPtsGroupMemberRemove.pszUser = szMember; - - AfsClass_Leave(); - rc = Worker_DoTask (wtaskPtsGroupMemberRemove, &wp, &status); - AfsClass_Enter(); - } - - // If we were able to change the group successfully, update the group's - // and user's properties. - // - if (rc) - { - if ((lpCell = lpiGroup->OpenCell (&status)) != NULL) - { - lpCell->RefreshAccount (szGroup, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->RefreshAccount (szMember, NULL, CELL_REFRESH_ACCOUNT_CHANGED); - lpCell->Close(); - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtGroupMemberRemoveEnd, lpiGroup, lpiUser, NULL, NULL, 0, status); - AfsClass_Leave(); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - diff --git a/src/WINNT/afsclass/afsclassfn.h b/src/WINNT/afsclass/afsclassfn.h deleted file mode 100644 index 8cf44ddaf..000000000 --- a/src/WINNT/afsclass/afsclassfn.h +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_FUNCTION_H -#define AFSCLASS_FUNCTION_H - -/* - * Like everything else in the AfsClass library, these routines should not - * be called on your application's main thread; instead, devote that thread - * to performing user-interface work, and use these routines in as many - * background threads as you need. - * - * See the Overview.doc file in this directory for more information on the - * intended threading model for the AfsClass library. - * - */ - - -/* - * SERVER MANIPULATION ________________________________________________________ - * - */ - -BOOL AfsClass_GetServerLogFile (LPIDENT lpiServer, LPTSTR pszLocal, LPTSTR pszRemote, ULONG *pStatus = NULL); -BOOL AfsClass_SetServerAuth (LPIDENT lpiServer, BOOL fEnabled, ULONG *pStatus = NULL); - -BOOL AfsClass_InstallFile (LPIDENT lpiServer, LPTSTR pszTarget, LPTSTR pszSource, ULONG *pStatus = NULL); -BOOL AfsClass_UninstallFile (LPIDENT lpiServer, LPTSTR pszUninstall, ULONG *pStatus = NULL); -BOOL AfsClass_PruneOldFiles (LPIDENT lpiServer, BOOL fBAK, BOOL fOLD, BOOL fCore, ULONG *pStatus = NULL); -BOOL AfsClass_GetFileDates (LPIDENT lpiServer, LPTSTR pszFilename, SYSTEMTIME *pstFile, SYSTEMTIME *pstBAK, SYSTEMTIME *pstOld, ULONG *pStatus = NULL); - -BOOL AfsClass_ExecuteCommand (LPIDENT lpiServer, LPTSTR pszCommand, ULONG *pStatus = NULL); - -BOOL AfsClass_Salvage (LPIDENT lpiSalvage, LPTSTR *ppszLogData, int nProcesses = 0, LPTSTR pszTempDir = NULL, LPTSTR pszLogFile = NULL, BOOL fForce = FALSE, BOOL fReadonly = FALSE, BOOL fLogInodes = FALSE, BOOL fLogRootInodes = FALSE, BOOL fRebuildDirs = FALSE, BOOL fReadBlocks = FALSE, ULONG *pStatus = NULL); -void AfsClass_FreeSalvageLog (LPTSTR pszLogData); - -BOOL AfsClass_SyncVLDB (LPIDENT lpiSync, BOOL fForce = TRUE, ULONG *pStatus = NULL); - -BOOL AfsClass_ChangeAddress (LPIDENT lpiServer, LPSOCKADDR_IN pAddrOld, LPSOCKADDR_IN pAddrNew = NULL, ULONG *pStatus = NULL); -BOOL AfsClass_ChangeAddress (LPIDENT lpiServer, LPSERVERSTATUS pStatusOld, LPSERVERSTATUS pStatusNew, ULONG *pStatus = NULL); - - -/* - * ADMIN LISTS ________________________________________________________________ - * - */ - -typedef struct - { - TCHAR szAdmin[ cchNAME ]; - BOOL fAdded; - BOOL fDeleted; - } ADMINLISTENTRY, *LPADMINLISTENTRY; - -typedef struct - { - LPIDENT lpiServer; - size_t cEntries; - ADMINLISTENTRY *aEntries; - LONG cRef; - } ADMINLIST, *LPADMINLIST; - -LPADMINLIST AfsClass_AdminList_Load (LPIDENT lpiServer, ULONG *pStatus = NULL); -LPADMINLIST AfsClass_AdminList_Copy (LPADMINLIST lpList); -BOOL AfsClass_AdminList_Save (LPADMINLIST lpList, ULONG *pStatus = NULL); -void AfsClass_AdminList_Free (LPADMINLIST lpList); -size_t AfsClass_AdminList_AddEntry (LPADMINLIST lpList, LPTSTR pszAdmin); -BOOL AfsClass_AdminList_DelEntry (LPADMINLIST lpList, size_t iIndex); - // note: _addentry and _delentry are safe to call on the main thread; - // they don't commit their changes until _save is called. - -/* - * DATABASE-HOST LISTS ________________________________________________________ - * - */ - -typedef struct - { - TCHAR szHost[ cchNAME ]; - BOOL fAdded; - BOOL fDeleted; - } HOSTLISTENTRY, *LPHOSTLISTENTRY; - -typedef struct - { - LPIDENT lpiServer; - size_t cEntries; - HOSTLISTENTRY *aEntries; - LONG cRef; - } HOSTLIST, *LPHOSTLIST; - -LPHOSTLIST AfsClass_HostList_Load (LPIDENT lpiServer, ULONG *pStatus = NULL); -LPHOSTLIST AfsClass_HostList_Copy (LPHOSTLIST lpList); -BOOL AfsClass_HostList_Save (LPHOSTLIST lpList, ULONG *pStatus = NULL); -void AfsClass_HostList_Free (LPHOSTLIST lpList); -size_t AfsClass_HostList_AddEntry (LPHOSTLIST lpList, LPTSTR pszHost); -BOOL AfsClass_HostList_DelEntry (LPHOSTLIST lpList, size_t iIndex); - // note: _addentry and _delentry are safe to call on the main thread; - // they don't commit their changes until _save is called. - - -/* - * SERVER KEYS ________________________________________________________________ - * - */ - -typedef struct - { - ENCRYPTIONKEY keyData; - ENCRYPTIONKEYINFO keyInfo; - int keyVersion; - } SERVERKEY, *LPSERVERKEY; - -typedef struct - { - LPIDENT lpiServer; - size_t cKeys; - SERVERKEY *aKeys; - } KEYLIST, *LPKEYLIST; - -LPKEYLIST AfsClass_KeyList_Load (LPIDENT lpiServer, ULONG *pStatus = NULL); -void AfsClass_KeyList_Free (LPKEYLIST lpList); -BOOL AfsClass_AddKey (LPIDENT lpiServer, int keyVersion, LPENCRYPTIONKEY pKey, ULONG *pStatus = NULL); -BOOL AfsClass_AddKey (LPIDENT lpiServer, int keyVersion, LPTSTR pszString, ULONG *pStatus = NULL); -BOOL AfsClass_DeleteKey (LPIDENT lpiServer, int keyVersion, ULONG *pStatus = NULL); -BOOL AfsClass_GetRandomKey (LPIDENT lpi, LPENCRYPTIONKEY pKey, ULONG *pStatus = NULL); - - -/* - * SERVICE MANIPULATION _______________________________________________________ - * - */ - -LPIDENT AfsClass_CreateService (LPIDENT lpiServer, LPTSTR pszService, LPTSTR pszCommand, LPTSTR pszParams, LPTSTR pszNotifier, AFSSERVICETYPE type, SYSTEMTIME *pstIfCron, ULONG *pStatus = NULL); -BOOL AfsClass_DeleteService (LPIDENT lpiService, ULONG *pStatus = NULL); - -BOOL AfsClass_StartService (LPIDENT lpiStart, BOOL fTemporary, ULONG *pStatus = NULL); -BOOL AfsClass_StopService (LPIDENT lpiStop, BOOL fTemporary, BOOL fWait = TRUE, ULONG *pStatus = NULL); -BOOL AfsClass_RestartService (LPIDENT lpiRestart, ULONG *pStatus = NULL); - -BOOL AfsClass_GetRestartTimes (LPIDENT lpiServer, BOOL *pfWeekly, LPSYSTEMTIME pstWeekly, BOOL *pfDaily, LPSYSTEMTIME pstDaily, ULONG *pStatus = NULL); -BOOL AfsClass_SetRestartTimes (LPIDENT lpiServer, LPSYSTEMTIME pstWeekly = NULL, LPSYSTEMTIME pstDaily = NULL, ULONG *pStatus = NULL); - - -/* - * FILESET MANIPULATION _______________________________________________________ - * - */ - -LPIDENT AfsClass_CreateFileset (LPIDENT lpiAggregate, LPTSTR pszFileset, ULONG ckQuota, ULONG *pStatus = NULL); -BOOL AfsClass_DeleteFileset (LPIDENT lpiFileset, BOOL fVLDB = TRUE, BOOL fServer = TRUE, ULONG *pStatus = NULL); -BOOL AfsClass_MoveFileset (LPIDENT lpiFileset, LPIDENT lpiAggregateTarget, ULONG *pStatus = NULL); -BOOL AfsClass_MoveReplica (LPIDENT lpiReplica, LPIDENT lpiAggregateTarget, ULONG *pStatus = NULL); -BOOL AfsClass_SetFilesetQuota (LPIDENT lpiFileset, size_t ckQuotaNew, ULONG *pStatus = NULL); -BOOL AfsClass_RenameFileset (LPIDENT lpiFileset, LPTSTR pszNewName, ULONG *pStatus = NULL); - -BOOL AfsClass_LockFileset (LPIDENT lpiFileset, ULONG *pStatus = NULL); -BOOL AfsClass_UnlockFileset (LPIDENT lpiFileset, ULONG *pStatus = NULL); -BOOL AfsClass_UnlockAllFilesets (LPIDENT lpi, ULONG *pStatus = NULL); - -LPIDENT AfsClass_CreateReplica (LPIDENT lpiRW, LPIDENT lpiAggregate, ULONG *pStatus = NULL); -BOOL AfsClass_DeleteReplica (LPIDENT lpiReplica, ULONG *pStatus = NULL); - -BOOL AfsClass_DeleteClone (LPIDENT lpiClone, ULONG *pStatus = NULL); - -BOOL AfsClass_ReleaseFileset (LPIDENT lpiFilesetRW, BOOL fForce = FALSE, ULONG *pStatus = NULL); - -BOOL AfsClass_DumpFileset (LPIDENT lpiFileset, LPTSTR pszFilename, LPSYSTEMTIME pstDate = NULL, ULONG *pStatus = NULL); -BOOL AfsClass_RestoreFileset (LPIDENT lpiFilesetOrAggregate, LPTSTR pszFileset, LPTSTR pszFilename, BOOL fIncremental, ULONG *pStatus = NULL); - -BOOL AfsClass_Clone (LPIDENT lpiRW, ULONG *pStatus = NULL); -BOOL AfsClass_CloneMultiple (LPIDENT lpiSvrAggOrCell, LPTSTR pszPrefixOrNull, BOOL fExclusionaryPrefix, ULONG *pStatus = NULL); - - -/* - * USER/GROUP MANIPULATION ____________________________________________________ - * - */ - -typedef struct - { - DWORD dwMask; - BOOL fAdmin; - BOOL fGrantTickets; - BOOL fCanEncrypt; - BOOL fCanChangePassword; - BOOL fCanReusePasswords; - SYSTEMTIME timeAccountExpires; - LONG cdayPwExpires; - LONG csecTicketLifetime; - LONG nFailureAttempts; - LONG csecFailedLoginLockTime; - LONG cGroupCreationQuota; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaGroupsOwned; - ACCOUNTACCESS aaMembership; - } USERPROPERTIES, *LPUSERPROPERTIES; - -#define MASK_USERPROP_fAdmin 0x00000001 -#define MASK_USERPROP_fGrantTickets 0x00000002 -#define MASK_USERPROP_fCanEncrypt 0x00000004 -#define MASK_USERPROP_fCanChangePassword 0x00000008 -#define MASK_USERPROP_fCanReusePasswords 0x00000010 -#define MASK_USERPROP_timeAccountExpires 0x00000020 -#define MASK_USERPROP_cdayPwExpires 0x00000040 -#define MASK_USERPROP_csecTicketLifetime 0x00000080 -#define MASK_USERPROP_nFailureAttempts 0x00000100 -#define MASK_USERPROP_csecFailedLoginLockTime 0x00000200 -#define MASK_USERPROP_cGroupCreationQuota 0x00000400 -#define MASK_USERPROP_aaListStatus 0x00000800 -#define MASK_USERPROP_aaGroupsOwned 0x00001000 -#define MASK_USERPROP_aaMembership 0x00002000 - -LPIDENT AfsClass_CreateUser (LPIDENT lpiCell, LPTSTR pszUserName, LPTSTR pszInstance, LPTSTR pszPassword, int idUser = 0, BOOL fCreateKAS = TRUE, BOOL fCreatePTS = TRUE, ULONG *pStatus = NULL); -BOOL AfsClass_SetUserProperties (LPIDENT lpiUser, LPUSERPROPERTIES pProperties, ULONG *pStatus = NULL); -BOOL AfsClass_SetUserPassword (LPIDENT lpiUser, int keyVersion, LPTSTR pszPassword, ULONG *pStatus = NULL); -BOOL AfsClass_SetUserPassword (LPIDENT lpiUser, int keyVersion, LPENCRYPTIONKEY pKey, ULONG *pStatus = NULL); -BOOL AfsClass_DeleteUser (LPIDENT lpiUser, BOOL fDeleteKAS, BOOL fDeletePTS, ULONG *pStatus = NULL); -BOOL AfsClass_UnlockUser (LPIDENT lpiUser, ULONG *pStatus = NULL); - - -typedef struct - { - DWORD dwMask; - TCHAR szOwner[ cchNAME ]; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaListGroupsOwned; - ACCOUNTACCESS aaListMembers; - ACCOUNTACCESS aaAddMember; - ACCOUNTACCESS aaDeleteMember; - } GROUPPROPERTIES, *LPGROUPPROPERTIES; - -#define MASK_GROUPPROP_szOwner 0x00000001 -#define MASK_GROUPPROP_aaListStatus 0x00000002 -#define MASK_GROUPPROP_aaListGroupsOwned 0x00000004 -#define MASK_GROUPPROP_aaListMembers 0x00000008 -#define MASK_GROUPPROP_aaAddMember 0x00000010 -#define MASK_GROUPPROP_aaDeleteMember 0x00000012 - -LPIDENT AfsClass_CreateGroup (LPIDENT lpiCell, LPTSTR pszGroupName, LPIDENT lpiOwner, int idGroup, ULONG *pStatus = NULL); -BOOL AfsClass_SetGroupProperties (LPIDENT lpiGroup, LPGROUPPROPERTIES pProperties, ULONG *pStatus = NULL); -BOOL AfsClass_RenameGroup (LPIDENT lpiGroup, LPTSTR pszNewName, ULONG *pStatus = NULL); -BOOL AfsClass_DeleteGroup (LPIDENT lpiGroup, ULONG *pStatus = NULL); -BOOL AfsClass_AddUserToGroup (LPIDENT lpiGroup, LPIDENT lpiUser, ULONG *pStatus = NULL); -BOOL AfsClass_RemoveUserFromGroup (LPIDENT lpiGroup, LPIDENT lpiUser, ULONG *pStatus = NULL); - - -typedef struct - { - int idUserMax; - int idGroupMax; - } PTSPROPERTIES, *LPPTSPROPERTIES; - -BOOL AfsClass_GetPtsProperties (LPIDENT lpiCell, LPPTSPROPERTIES pProperties, ULONG *pStatus = NULL); -BOOL AfsClass_SetPtsProperties (LPIDENT lpiCell, LPPTSPROPERTIES pProperties, ULONG *pStatus = NULL); - - -#endif // AFSCLASS_FUNCTION_H - diff --git a/src/WINNT/afsclass/c_agg.cpp b/src/WINNT/afsclass/c_agg.cpp deleted file mode 100644 index 34b12cdc7..000000000 --- a/src/WINNT/afsclass/c_agg.cpp +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - -AGGREGATE::AGGREGATE (LPSERVER lpServerParent, LPTSTR pszName, LPTSTR pszDevice) -{ - m_lpiServer = lpServerParent->GetIdentifier(); - m_lpiCell = lpServerParent->m_lpiCell; - m_lpiThis = NULL; - - lstrcpy (m_szName, pszName); - lstrcpy (m_szDevice, pszDevice); - m_wGhost = 0; - m_idPartition = NO_PARTITION; - - m_fFilesetsOutOfDate = TRUE; - m_lFilesets = New (HASHLIST); - m_lFilesets->SetCriticalSection (AfsClass_GetCriticalSection()); - m_lkFilesetName = m_lFilesets->CreateKey ("Fileset Name", AGGREGATE::KeyFilesetName_Compare, AGGREGATE::KeyFilesetName_HashObject, AGGREGATE::KeyFilesetName_HashData); - m_lkFilesetID = m_lFilesets->CreateKey ("Fileset ID", AGGREGATE::KeyFilesetID_Compare, AGGREGATE::KeyFilesetID_HashObject, AGGREGATE::KeyFilesetID_HashData); - - m_fStatusOutOfDate = TRUE; - m_fAllocationOutOfDate = TRUE; - memset (&m_as, 0x00, sizeof(AGGREGATESTATUS)); -} - - -AGGREGATE::~AGGREGATE (void) -{ - for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject()); - m_lFilesets->Remove (lpFileset); - Delete (lpFileset); - } - Delete (m_lFilesets); - - if (m_lpiThis) - m_lpiThis->m_cRef --; -} - - -void AGGREGATE::SendDeleteNotifications (void) -{ - for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject()); - lpFileset->SendDeleteNotifications(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier()); -} - - -void AGGREGATE::Close (void) -{ - AfsClass_Leave(); -} - - -LPIDENT AGGREGATE::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - if ((m_lpiThis = IDENT::FindIdent (this)) == NULL) - m_lpiThis = New2 (IDENT,(this)); - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -void AGGREGATE::Invalidate (void) -{ - if (!m_fStatusOutOfDate || !m_fFilesetsOutOfDate) - { - if (m_wGhost & GHOST_HAS_SERVER_ENTRY) - { - m_fStatusOutOfDate = TRUE; - m_fFilesetsOutOfDate = TRUE; - } - - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -void AGGREGATE::InvalidateAllocation (void) -{ - m_fAllocationOutOfDate = TRUE; -} - - -BOOL AGGREGATE::RefreshFilesets (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fFilesetsOutOfDate) - { - m_fFilesetsOutOfDate = FALSE; - - // We'll need m_as.dwID to do this. - // - if (!RefreshStatus (fNotify, pStatus)) - return FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsBegin, GetIdentifier()); - - // First thing is to forget about what filesets we think we have now. - // - for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject()); - lpFileset->SendDeleteNotifications(); - m_lFilesets->Remove (lpFileset); - Delete (lpFileset); - } - - // Next, the harder part: look through the server to find a list - // of filesets. - // - LPSERVER lpServer; - if ((lpServer = OpenServer (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - PVOID hVOS; - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wpBegin; - wpBegin.wpVosVolumeGetBegin.hCell = hCell; - wpBegin.wpVosVolumeGetBegin.hServer = hVOS; - wpBegin.wpVosVolumeGetBegin.idPartition = m_idPartition; - - if (!Worker_DoTask (wtaskVosVolumeGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (;;) - { - WORKERPACKET wpNext; - wpNext.wpVosVolumeGetNext.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum; - if (!Worker_DoTask (wtaskVosVolumeGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - LPTSTR pszName = AnsiToString (wpNext.wpVosVolumeGetNext.Data.name); - LPFILESET lpFileset = New2 (FILESET,(this, &wpNext.wpVosVolumeGetNext.Data.id, pszName)); - FreeString (pszName, wpNext.wpVosVolumeGetNext.Data.name); - - lpFileset->SetStatusFromVOS (&wpNext.wpVosVolumeGetNext.Data); - lpFileset->m_wGhost |= GHOST_HAS_SERVER_ENTRY; - m_lFilesets->Add (lpFileset); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpFileset->GetIdentifier()); - } - - WORKERPACKET wpDone; - wpDone.wpVosVolumeGetDone.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum; - Worker_DoTask (wtaskVosVolumeGetDone, &wpDone); - } - - lpServer->CloseVosObject(); - } - - lpServer->Close(); - } - - InvalidateAllocation(); - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -BOOL AGGREGATE::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fStatusOutOfDate) - { - m_fStatusOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - LPSERVER lpServer; - if ((lpServer = OpenServer (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - PVOID hVOS; - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wp; - wp.wpVosPartitionGet.hCell = hCell; - wp.wpVosPartitionGet.hServer = hVOS; - wp.wpVosPartitionGet.idPartition = m_idPartition; - - if (!Worker_DoTask (wtaskVosPartitionGet, &wp, &status)) - rc = FALSE; - else - { - m_as.ckStorageTotal = wp.wpVosPartitionGet.Data.totalSpace; - m_as.ckStorageFree = wp.wpVosPartitionGet.Data.totalFreeSpace; - } - - m_as.dwID = GetID(); - lpServer->CloseVosObject(); - } - - lpServer->Close(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (rc && m_fAllocationOutOfDate) - { - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - m_as.ckStorageAllocated = CalculateAllocation (fNotify); - m_fAllocationOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier()); - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -ULONG AGGREGATE::CalculateAllocation (BOOL fNotify) -{ - ULONG ckAllocated = 0; - - for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject()); - - FILESETSTATUS fs; - if (lpFileset->GetStatus (&fs)) - { - if (fs.Type == ftREADWRITE) - ckAllocated += fs.ckQuota; - } - } - - return ckAllocated; -} - - -void AGGREGATE::GetName (LPTSTR pszName) -{ - lstrcpy (pszName, m_szName); -} - - -void AGGREGATE::GetDevice (LPTSTR pszDevice) -{ - lstrcpy (pszDevice, m_szDevice); -} - - -LPCELL AGGREGATE::OpenCell (ULONG *pStatus) -{ - return m_lpiCell->OpenCell (pStatus); -} - - -LPSERVER AGGREGATE::OpenServer (ULONG *pStatus) -{ - return m_lpiServer->OpenServer (pStatus); -} - - -/* - * FILESETS ___________________________________________________________________ - * - */ - -LPFILESET AGGREGATE::OpenFileset (LPTSTR pszName, ULONG *pStatus) -{ - if (!RefreshFilesets (TRUE, pStatus)) - return NULL; - - LPFILESET lpFileset; - if ((lpFileset = (LPFILESET)(m_lkFilesetName->GetFirstObject (pszName))) != NULL) - AfsClass_Enter(); - - return lpFileset; -} - - -LPFILESET AGGREGATE::OpenFileset (VOLUMEID *pvidFileset, ULONG *pStatus) -{ - if (!RefreshFilesets (TRUE, pStatus)) - return NULL; - - LPFILESET lpFileset; - if ((lpFileset = (LPFILESET)(m_lkFilesetID->GetFirstObject (pvidFileset))) != NULL) - AfsClass_Enter(); - - return lpFileset; -} - - -LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus) -{ - return FilesetFindFirst (phEnum, NULL, fNotify, pStatus); -} - - -LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus) -{ - LPFILESET lpFileset = NULL; - - if (!RefreshFilesets (fNotify, pStatus)) - return NULL; - - if (lpiFind != NULL) - { - lpFileset = lpiFind->OpenFileset(); - *phEnum = NULL; - } - else if ((*phEnum = m_lFilesets->FindFirst()) != NULL) - { - lpFileset = (LPFILESET)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - - if (!lpFileset && pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - return lpFileset; -} - - -LPFILESET AGGREGATE::FilesetFindNext (HENUM *phEnum) -{ - LPFILESET lpFileset = NULL; - - if (*phEnum) - { - if ((*phEnum = (*phEnum)->FindNext()) != NULL) - { - lpFileset = (LPFILESET)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - } - - return lpFileset; -} - - -void AGGREGATE::FilesetFindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - - -BOOL AGGREGATE::GetStatus (LPAGGREGATESTATUS lpas, BOOL fNotify, ULONG *pStatus) -{ - if (!RefreshStatus (fNotify, pStatus)) - return FALSE; - - memcpy (lpas, &m_as, sizeof(AGGREGATESTATUS)); - return TRUE; -} - - -short AGGREGATE::GetGhostStatus (void) -{ - return m_wGhost; -} - - -PVOID AGGREGATE::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void AGGREGATE::SetUserParam (PVOID pUserNew) -{ - GetIdentifier()->SetUserParam (pUserNew); -} - - -int AGGREGATE::GetID (void) -{ - if (m_idPartition == NO_PARTITION) - { - WORKERPACKET wp; - wp.wpVosPartitionNameToId.pszPartition = m_szName; - - ULONG status; - if (Worker_DoTask (wtaskVosPartitionNameToId, &wp, &status)) - m_idPartition = wp.wpVosPartitionNameToId.idPartition; - } - - return m_idPartition; -} - - -/* - * HASH KEYS __________________________________________________________________ - * - */ - -BOOL CALLBACK AGGREGATE::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmp (((LPFILESET)pObject)->m_szName, (LPTSTR)pData); -} - -HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return AGGREGATE::KeyFilesetName_HashData (pKey, ((LPFILESET)pObject)->m_szName); -} - -HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - - -BOOL CALLBACK AGGREGATE::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !memcmp (&((LPFILESET)pObject)->m_idVolume, (LPVOLUMEID)pData, sizeof(VOLUMEID)); -} - -HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return AGGREGATE::KeyFilesetID_HashData (pKey, &((LPFILESET)pObject)->m_idVolume); -} - -HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)*((LPVOLUMEID)pData); -} - diff --git a/src/WINNT/afsclass/c_agg.h b/src/WINNT/afsclass/c_agg.h deleted file mode 100644 index a91b61f2e..000000000 --- a/src/WINNT/afsclass/c_agg.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_AGGREGATE_H -#define AFSCLASS_AGGREGATE_H - - -/* - * AGGREGATE CLASS ____________________________________________________________ - * - */ - -typedef struct - { - ULONG dwID; - ULONG ckStorageTotal; - ULONG ckStorageFree; - ULONG ckStorageAllocated; - } AGGREGATESTATUS, *LPAGGREGATESTATUS; - -class AGGREGATE - { - friend class CELL; - friend class SERVER; - friend class FILESET; - friend class IDENT; - - public: - void Close (void); - void Invalidate (void); - void InvalidateAllocation (void); - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - BOOL RefreshFilesets (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - - // Aggregate properties - // - LPIDENT GetIdentifier (void); - LPCELL OpenCell (ULONG *pStatus = NULL); - LPSERVER OpenServer (ULONG *pStatus = NULL); - void GetName (LPTSTR pszName); - void GetDevice (LPTSTR pszDevice); - int GetID (void); - - BOOL GetStatus (LPAGGREGATESTATUS lpas, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - short GetGhostStatus (void); // returns GHOST_* - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - // Filesets within an aggregate - // - LPFILESET OpenFileset (LPTSTR pszName, ULONG *pStatus = NULL); - LPFILESET OpenFileset (VOLUMEID *pvidFileset, ULONG *pStatus = NULL); - LPFILESET FilesetFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPFILESET FilesetFindFirst (HENUM *phEnum, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPFILESET FilesetFindNext (HENUM *phEnum); - void FilesetFindClose (HENUM *phEnum); - - private: - AGGREGATE (LPSERVER lpServerParent, LPTSTR pszName, LPTSTR pszDevice); - ~AGGREGATE (void); - void SendDeleteNotifications (void); - - ULONG CalculateAllocation (BOOL fNotify); - - static BOOL CALLBACK AGGREGATE::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK AGGREGATE::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData); - - // Private data - // - private: - LPIDENT m_lpiCell; - LPIDENT m_lpiServer; - LPIDENT m_lpiThis; - TCHAR m_szName[ cchNAME ]; - TCHAR m_szDevice[ cchNAME ]; - short m_wGhost; - int m_idPartition; - - BOOL m_fFilesetsOutOfDate; - LPHASHLIST m_lFilesets; - LPHASHLISTKEY m_lkFilesetName; - LPHASHLISTKEY m_lkFilesetID; - - BOOL m_fStatusOutOfDate; - BOOL m_fAllocationOutOfDate; - AGGREGATESTATUS m_as; - }; - - -#endif // AFSCLASS_AGGREGATE_H - diff --git a/src/WINNT/afsclass/c_cell.cpp b/src/WINNT/afsclass/c_cell.cpp deleted file mode 100644 index f34b5d27e..000000000 --- a/src/WINNT/afsclass/c_cell.cpp +++ /dev/null @@ -1,2031 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - // Each CELL object maintains a list of servers; that list has - // hashtables placed across the (shortened) server name for - // faster lookup; it also maintains a hashtable across the - // servers' primary IP address (the first in the list; most - // servers will only have one anyway). The default table size - // in a HASHLIST is 1000 elements--that's too large for a list - // of servers-in-a-cell, as it's enough to handle up to 30,000 - // servers before the table would need to resize iteself (see - // the documentation in hashlist.cpp for info). Instead, we - // choose a more reasonable default table size. - // -#define cKEYSERVERNAME_TABLESIZE 50 - -#define cKEYSERVERADDR_TABLESIZE 50 - - // Enable the definition below to do a better job of finding - // user entries in PTS which have no KAS entries (for instance, - // machine IP accounts). - // -#define FIND_PTS_DEBRIS - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -LPHASHLIST CELL::x_lCells = NULL; - - -/* - * CONSTRUCTION _______________________________________________________________ - * - */ - -void CELL::InitClass (void) -{ - if (x_lCells == NULL) - { - x_lCells = New (HASHLIST); - x_lCells->SetCriticalSection (AfsClass_GetCriticalSection()); - } -} - - -CELL::CELL (LPTSTR pszCellName, PVOID hCreds) -{ - AfsClass_Enter(); - InitClass(); - - m_hCell = 0; - m_hKas = 0; - lstrcpy (m_szName, pszCellName); - m_nReqs = 0; - m_hCreds = hCreds; - m_apszServers = 0; - - m_fStatusOutOfDate = TRUE; - m_fVLDBOutOfDate = TRUE; - m_lpiThis = NULL; - - m_fServersOutOfDate = TRUE; - m_nServersUnmonitored = 0; - - m_lServers = New (HASHLIST); - m_lServers->SetCriticalSection (AfsClass_GetCriticalSection()); - m_lkServerName = m_lServers->CreateKey ("Server Name", CELL::KeyServerName_Compare, CELL::KeyServerName_HashObject, CELL::KeyServerName_HashData, cKEYSERVERNAME_TABLESIZE); - m_lkServerAddr = m_lServers->CreateKey ("Server Primary Address", CELL::KeyServerAddr_Compare, CELL::KeyServerAddr_HashObject, CELL::KeyServerAddr_HashData, cKEYSERVERADDR_TABLESIZE); - - m_fUsersOutOfDate = TRUE; - m_lUsers = New (HASHLIST); - m_lUsers->SetCriticalSection (AfsClass_GetCriticalSection()); - m_lkUserName = m_lUsers->CreateKey ("User Name", CELL::KeyUserName_Compare, CELL::KeyUserName_HashObject, CELL::KeyUserName_HashData); - m_lGroups = New (HASHLIST); - m_lGroups->SetCriticalSection (AfsClass_GetCriticalSection()); - m_lkGroupName = m_lGroups->CreateKey ("Group Name", CELL::KeyGroupName_Compare, CELL::KeyGroupName_HashObject, CELL::KeyGroupName_HashData); - - AfsClass_Leave(); -} - - -CELL::~CELL (void) -{ - FreeUsers (FALSE); - FreeServers (FALSE); - - if (m_lpiThis) - m_lpiThis->m_cRef --; - Delete (m_lServers); -} - - -void CELL::FreeServers (BOOL fNotify) -{ - for (LPENUM pEnum = m_lServers->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPSERVER lpServer = (LPSERVER)(pEnum->GetObject()); - if (fNotify) - lpServer->SendDeleteNotifications(); - m_lServers->Remove (lpServer); - Delete (lpServer); - } - if (m_apszServers) - { - for (size_t ii = 0; m_apszServers[ii]; ++ii) - FreeString (m_apszServers[ii]); - Free (m_apszServers); - m_apszServers = NULL; - } -} - - -void CELL::FreeUsers (BOOL fNotify) -{ - for (LPENUM pEnum = m_lGroups->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPPTSGROUP lpGroup = (LPPTSGROUP)(pEnum->GetObject()); - if (fNotify) - lpGroup->SendDeleteNotifications(); - m_lGroups->Remove (lpGroup); - Delete (lpGroup); - } - - for (pEnum = m_lUsers->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPUSER lpUser = (LPUSER)(pEnum->GetObject()); - if (fNotify) - lpUser->SendDeleteNotifications(); - m_lUsers->Remove (lpUser); - Delete (lpUser); - } -} - - -/* - * CELL-LIST MANAGEMENT _______________________________________________________ - * - */ - -void CELL::Close (void) -{ - AfsClass_Leave(); -} - - -BOOL CELL::GetDefaultCell (LPTSTR pszName, ULONG *pStatus) -{ - WORKERPACKET wp; - wp.wpClientLocalCellGet.pszCell = pszName; - return Worker_DoTask (wtaskClientLocalCellGet, &wp, pStatus); -} - - -LPIDENT CELL::OpenCell (LPTSTR pszCell, PVOID hCreds, ULONG *pStatus) -{ - LPIDENT lpiCell = NULL; - AfsClass_Enter(); - InitClass(); - - LPCELL lpCell; - if ((lpCell = ReopenCell (pszCell, pStatus)) != NULL) - { - lpiCell = lpCell->GetIdentifier(); - lpCell->m_nReqs++; - lpCell->Close(); - } - else // cell hasn't been opened before? see if we can reach the cell. - { - lpCell = New2 (CELL,(pszCell, hCreds)); - if ((lpCell->m_hCell = lpCell->GetCellObject (pStatus)) == NULL) - Delete (lpCell); - else - { - lpiCell = lpCell->GetIdentifier(); - lpCell->m_nReqs = 1; - x_lCells->Add (lpCell); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpiCell); - } - } - - AfsClass_Leave(); - return lpiCell; -} - - -void CELL::CloseCell (LPIDENT lpiCell) -{ - LPCELL lpCell; - if ((lpCell = lpiCell->OpenCell()) != NULL) - { - if (lpCell->m_nReqs > 1) - { - lpCell->m_nReqs--; - lpCell->Close(); - } - else - { - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, lpiCell); - lpCell->CloseKasObject(); - lpCell->CloseCellObject(); - lpCell->Close(); - x_lCells->Remove (lpCell); - Delete (lpCell); - } - } -} - - -LPCELL CELL::ReopenCell (LPTSTR pszCell, ULONG *pStatus) -{ - LPCELL lpCell = NULL; - AfsClass_Enter(); - InitClass(); - - // Ordinarily we'd place a key on the cell name within the list of - // cells--however, the most likely case only has one cell anyway. - // So why expend the memory? - // - for (LPENUM pEnum = x_lCells->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPCELL lpCellFound = (LPCELL)( pEnum->GetObject() ); - - if (!lstrcmpi (lpCellFound->m_szName, pszCell)) - { - lpCell = lpCellFound; - Delete (pEnum); - break; - } - } - - if (lpCell == NULL) - { - AfsClass_Leave(); - if (pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - } - - // AfsClass_Leave() has been called only if no cell was opened in the search. - return lpCell; -} - - -PVOID CELL::GetCurrentCredentials (void) -{ - return m_hCreds; -} - - -void CELL::SetCurrentCredentials (PVOID hCreds) -{ - CloseCellObject(); - - m_hCreds = hCreds; - - GetCellObject(); -} - - -/* - * SERVER-LIST MANAGEMENT _____________________________________________________ - * - */ - -LPSERVER CELL::OpenServer (LPTSTR pszName, ULONG *pStatus) -{ - if (!RefreshServers (TRUE, pStatus)) - return NULL; - - LPSERVER lpServer; - if ((lpServer = (LPSERVER)(m_lkServerName->GetFirstObject (pszName))) != NULL) - AfsClass_Enter(); - - return lpServer; -} - - -LPSERVER CELL::OpenServer (LPSOCKADDR_IN pAddr, ULONG *pStatus) -{ - if (!RefreshServers (TRUE, pStatus)) - return NULL; - - // We'll try to use our lookup key first--since most machines only - // have one IP address anyway, our hashtable should make this lookup - // super fast. If it misses (i.e., if the server is multi-homed and - // for some reason VLDB refers to it by the second address), we'll - // have to do a brute-force search across each server in the cell. - // Again, we could have a better-designed lookup table here--but - // since multi-homing is the exception (by a vast majority), it's not - // worth the extra effort and memory. This technique is fast enough. - // - LPSERVER lpServer; - if ((lpServer = (LPSERVER)(m_lkServerAddr->GetFirstObject (pAddr))) != NULL) - { - AfsClass_Enter(); // Aren't HashLists great? We found the server. - } - else // Try brute-force search - { - HENUM hEnum; - for (lpServer = ServerFindFirst (&hEnum, TRUE, pStatus); lpServer; lpServer = ServerFindNext (&hEnum)) - { - SERVERSTATUS ss; - if (lpServer->GetStatus (&ss, TRUE, pStatus)) - { - for (size_t iAddr = 0; iAddr < ss.nAddresses; ++iAddr) - { - if (!memcmp (&ss.aAddresses[ iAddr ], pAddr, sizeof(SOCKADDR_IN))) - { - // don't close server! we're going to return this pointer. - break; - } - } - } - lpServer->Close(); - } - ServerFindClose (&hEnum); - } - return lpServer; -} - - -LPSERVER CELL::ServerFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus) -{ - return ServerFindFirst (phEnum, NULL, fNotify, pStatus); -} - - -LPSERVER CELL::ServerFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus) -{ - LPSERVER lpServer = NULL; - - if (!RefreshServers (fNotify, pStatus)) - return NULL; - - if (lpiFind != NULL) - { - lpServer = lpiFind->OpenServer(); - *phEnum = NULL; - } - else if ((*phEnum = m_lServers->FindFirst()) != NULL) - { - lpServer = (LPSERVER)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - - if (!lpServer && pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - return lpServer; -} - - -LPSERVER CELL::ServerFindNext (HENUM *phEnum) -{ - LPSERVER lpServer = NULL; - - if (*phEnum) - { - if ((*phEnum = (*phEnum)->FindNext()) != NULL) - { - lpServer = (LPSERVER)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - } - - return lpServer; -} - - -void CELL::ServerFindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - - -BOOL CELL::RefreshServers (BOOL fNotify, ULONG *pStatus) -{ - if (!m_fServersOutOfDate) - return TRUE; - - return RefreshServerList (fNotify, pStatus); -} - - -BOOL CELL::RefreshServerList (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - BOOL fNotified = FALSE; - - if (fNotify && m_fServersOutOfDate) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServersBegin, GetIdentifier()); - fNotified = TRUE; - } - - BOOL fReplaceList = m_fServersOutOfDate; - m_fServersOutOfDate = FALSE; - - // Ordinarily we'd just clear the list of servers and - // requery it from scratch; however, servers are an exception - // to that technique: occasionally we may get a request to - // just look for servers that have appeared or disappeared, - // without refreshing data for other servers. Thus the revised - // technique: - // - // 1- if fReplaceList, empty the list of servers. - // otherwise, set each server's fDelete flag. - // - // 2- enumerate the servers in the cell: for each server, - // if fReplaceList, add the server to the list - // otherwise, if the server is in the list, clear its fDelete - // - // 3- if !fReplaceList, enumerate the list of servers: for each server, - // if the server's fDelete flag is set, remove the server - // - for (LPENUM pEnum = m_lServers->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPSERVER lpServer = (LPSERVER)(pEnum->GetObject()); - - if (fReplaceList) - { - lpServer->SendDeleteNotifications(); - m_lServers->Remove (lpServer); - Delete (lpServer); - } - else // the list of servers isn't invalidated, so just mark fDelete - { - lpServer->m_fDelete = TRUE; - } - } - - // Enumerate the servers in the cell. - // - PVOID hCell; - if ((hCell = GetCellObject (&status)) == NULL) - { - rc = FALSE; - FreeUsers (TRUE); - FreeServers (TRUE); - } - else - { - WORKERPACKET wpBegin; - wpBegin.wpClientAFSServerGetBegin.hCell = hCell; - - if (!Worker_DoTask (wtaskClientAFSServerGetBegin, &wpBegin, &status)) - { - rc = FALSE; - } - else - { - for (;;) - { - WORKERPACKET wpNext; - wpNext.wpClientAFSServerGetNext.hEnum = wpBegin.wpClientAFSServerGetBegin.hEnum; - if (!Worker_DoTask (wtaskClientAFSServerGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - afs_serverEntry_p pEntry = &wpNext.wpClientAFSServerGetNext.Entry; - - TCHAR szServer[ cchNAME ]; - CopyAnsiToString (szServer, pEntry->serverName); - if (!szServer[0]) - { - int addrNetwork = htonl (pEntry->serverAddress[0]); - lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&addrNetwork)); - } - - // The server identified by {pEntry} is in the cell. Now if we're - // building a list of SERVER objects from scratch, we can just - // add it--but if we're only touching up an existing list, - // first make sure there isn't such an animal in there now. - // - BOOL fNotifyAboutThisServer = FALSE; - - LPSERVER lpServer = NULL; - if (!fReplaceList) - { - if ((lpServer = (LPSERVER)(m_lkServerName->GetFirstObject (szServer))) != NULL) - lpServer->m_fDelete = FALSE; - } - - if (lpServer == NULL) - { - // Okay, it's a new server. Create a SERVER object for it and - // add it to the list. - // - lpServer = New2 (SERVER,(this, szServer)); - lpServer->m_wGhost |= GHOST_HAS_SERVER_ENTRY; - m_lServers->Add (lpServer); - fNotifyAboutThisServer = TRUE; - } - - // Update the server's IP addresses - // - lpServer->m_ss.nAddresses = 0; - - for (size_t iAddr = 0; iAddr < AFS_MAX_SERVER_ADDRESS; ++iAddr) - { - if (pEntry->serverAddress[ iAddr ] == 0) - continue; - AfsClass_IntToAddress (&lpServer->m_ss.aAddresses[ lpServer->m_ss.nAddresses++ ], pEntry->serverAddress[ iAddr ]); - } - - m_lServers->Update (lpServer); // That update affected a hashlistkey - - // Tell our clients that we've found a server - // - if (fNotify && fNotifyAboutThisServer) - { - if (!fNotified) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServersBegin, GetIdentifier()); - fNotified = TRUE; - } - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpServer->GetIdentifier()); - } - } - - WORKERPACKET wpDone; - wpDone.wpClientAFSServerGetDone.hEnum = wpBegin.wpClientAFSServerGetBegin.hEnum; - Worker_DoTask (wtaskClientAFSServerGetDone, &wpDone); - } - } - - // Finally, look through our list of servers: if any have fDelete set, - // then we didn't find them in the cell any longer. Remove those servers. - // - if (rc) - { - for (LPENUM pEnum = m_lServers->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPSERVER lpServer = (LPSERVER)(pEnum->GetObject()); - if (lpServer->m_fDelete) - { - if (fNotify && !fNotified) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServersBegin, GetIdentifier()); - fNotified = TRUE; - } - lpServer->SendDeleteNotifications(); - m_lServers->Remove (lpServer); - Delete (lpServer); - } - } - } - - // Fix m_apszServers if we did anything to the list of servers - // - if (fNotified) - { - if (m_apszServers) - { - for (size_t ii = 0; m_apszServers[ii]; ++ii) - FreeString (m_apszServers[ii]); - Free (m_apszServers); - m_apszServers = NULL; - } - - size_t cServers = 0; - for (LPENUM pEnum = m_lServers->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - ++cServers; - - if (cServers) - { - m_apszServers = (char**)Allocate (sizeof(char*) * (1+cServers)); - memset (m_apszServers, 0x00, sizeof(char*) * (1+cServers)); - - size_t iServer = 0; - for (pEnum = m_lServers->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPSERVER lpServer = (LPSERVER)(pEnum->GetObject()); - m_apszServers[ iServer ] = AllocateAnsi (cchNAME+1); - CopyStringToAnsi (m_apszServers[ iServer ], lpServer->m_szName); - ++iServer; - } - } - } - - if (fNotified) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServersEnd, GetIdentifier(), ((rc) ? 0 : status)); - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -/* - * SERVER-LIST KEYS ___________________________________________________________ - * - */ - -BOOL CALLBACK CELL::KeyServerName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - if (!lstrcmp (((LPSERVER)pObject)->m_szName, (LPTSTR)pData)) - return TRUE; - - TCHAR szShortName[ cchNAME ]; - SERVER::ShortenName (szShortName, ((LPSERVER)pObject)->m_szName); - if (!lstrcmp (szShortName, (LPTSTR)pData)) - return TRUE; - - return FALSE; -} - -HASHVALUE CALLBACK CELL::KeyServerName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return CELL::KeyServerName_HashData (pKey, ((LPSERVER)pObject)->m_szName); -} - -HASHVALUE CALLBACK CELL::KeyServerName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - TCHAR szShortName[ cchNAME ]; - SERVER::ShortenName (szShortName, (LPTSTR)pData); - return HashString (szShortName); -} - - -BOOL CALLBACK CELL::KeyServerAddr_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !memcmp (&((LPSERVER)pObject)->m_ss.aAddresses[0], (LPSOCKADDR)pData, sizeof(SOCKADDR_IN)); -} - -HASHVALUE CALLBACK CELL::KeyServerAddr_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return CELL::KeyServerAddr_HashData (pKey, &((LPSERVER)pObject)->m_ss.aAddresses[0]); -} - -HASHVALUE CALLBACK CELL::KeyServerAddr_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return *(DWORD*)pData; -} - - -BOOL CALLBACK CELL::KeyUserName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmpi (((LPUSER)pObject)->m_szPrincipal, (LPTSTR)pData); -} - -HASHVALUE CALLBACK CELL::KeyUserName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return CELL::KeyUserName_HashData (pKey, ((LPUSER)pObject)->m_szPrincipal); -} - -HASHVALUE CALLBACK CELL::KeyUserName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - - -BOOL CALLBACK CELL::KeyGroupName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmpi (((LPPTSGROUP)pObject)->m_szName, (LPTSTR)pData); -} - -HASHVALUE CALLBACK CELL::KeyGroupName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return CELL::KeyGroupName_HashData (pKey, ((LPPTSGROUP)pObject)->m_szName); -} - -HASHVALUE CALLBACK CELL::KeyGroupName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - - -/* - * CELL OBJECT ________________________________________________________________ - * - */ - -PVOID CELL::GetCellObject (ULONG *pStatus) -{ - if (!m_hCell) - { - ULONG status; - NOTIFYCALLBACK::SendNotificationToAll (evtOpenCellBegin, m_szName); - - WORKERPACKET wpOpen; - wpOpen.wpClientCellOpen.pszCell = m_szName; - wpOpen.wpClientCellOpen.hCreds = m_hCreds; - - if (Worker_DoTask (wtaskClientCellOpen, &wpOpen, &status)) - m_hCell = wpOpen.wpClientCellOpen.hCell; - - if (pStatus) - *pStatus = status; - NOTIFYCALLBACK::SendNotificationToAll (evtOpenCellEnd, m_szName, status); - } - - return m_hCell; -} - - -BOOL CELL::CloseCellObject (ULONG *pStatus) -{ - BOOL rc = TRUE; - - if (m_hCell != NULL) - { - WORKERPACKET wp; - wp.wpClientCellClose.hCell = m_hCell; - rc = Worker_DoTask (wtaskClientCellClose, &wp, pStatus); - m_hCell = NULL; - } - - return rc; -} - - -PVOID CELL::GetKasObject (ULONG *pStatus) -{ - // m_hKas is actually never set non-NULL; - // leaving it NULL indicates we will work happily with *any* server. - // - return m_hKas; -} - - -BOOL CELL::CloseKasObject (ULONG *pStatus) -{ - BOOL rc = TRUE; - - if (m_hKas != NULL) - { - WORKERPACKET wp; - wp.wpKasServerClose.hServer = m_hKas; - rc = Worker_DoTask (wtaskKasServerClose, &wp, pStatus); - m_hKas = NULL; - } - - return rc; -} - - -/* - * CELL GENERAL _______________________________________________________________ - * - */ - -LPIDENT CELL::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - if ((m_lpiThis = IDENT::FindIdent (this)) == NULL) - m_lpiThis = New2 (IDENT,(this)); - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -void CELL::GetName (LPTSTR pszName) -{ - lstrcpy (pszName, m_szName); -} - - -PVOID CELL::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void CELL::SetUserParam (PVOID pUserNew) -{ - GetIdentifier()->SetUserParam (pUserNew); -} - - -BOOL CELL::fAnyServersUnmonitored (void) -{ - return (m_nServersUnmonitored > 0) ? TRUE : FALSE; -} - - -/* - * CELL STATUS ________________________________________________________________ - * - */ - -void CELL::Invalidate (void) -{ - if (!m_fServersOutOfDate || !m_fStatusOutOfDate || !m_fVLDBOutOfDate || !m_fUsersOutOfDate) - { - CloseKasObject(); - CloseCellObject(); - m_fServersOutOfDate = TRUE; - m_fStatusOutOfDate = TRUE; - m_fVLDBOutOfDate = TRUE; - m_fUsersOutOfDate = TRUE; - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -void CELL::InvalidateServers (void) -{ - if (!m_fServersOutOfDate || !m_fVLDBOutOfDate) - { - CloseKasObject(); - CloseCellObject(); - m_fServersOutOfDate = TRUE; - m_fVLDBOutOfDate = TRUE; - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -void CELL::InvalidateUsers (void) -{ - if (!m_fUsersOutOfDate) - { - m_fUsersOutOfDate = TRUE; - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -BOOL CELL::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (m_fStatusOutOfDate) - { - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - // Hmmm...well, actually, there's nothing for us to do here. I'm - // leaving this around, because the refreshed-cell-status notification - // may be useful as an appropriate hooking point. - rc = TRUE; - status = 0; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -BOOL CELL::RefreshVLDB (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - - if (m_fVLDBOutOfDate) - { - if ((rc = RefreshVLDB (GetIdentifier(), fNotify, pStatus)) == TRUE) - { - m_fVLDBOutOfDate = FALSE; - } - } - - return rc; -} - - -BOOL CELL::RefreshVLDB (LPIDENT lpiRef, BOOL fNotify, ULONG *pStatus, BOOL fAnythingRelatedToThisRWFileset) -{ - BOOL rc = TRUE; - DWORD status = 0; - - // What is the scope of this refresh operation? The entire cell, - // or the filesets on a particular server or aggregate? - // - LPIDENT lpiRefCell = (lpiRef == NULL) ? GetIdentifier() : lpiRef->GetCell(); - LPIDENT lpiRefServer = NULL; - LPIDENT lpiRefAggregate = NULL; - LPIDENT lpiRefFileset = NULL; - VOLUMEID *pvidRefFileset = NULL; - VOLUMEID vidRefFileset; - - if (fAnythingRelatedToThisRWFileset) - { - pvidRefFileset = &vidRefFileset; - lpiRef->GetFilesetID (pvidRefFileset); - } - else - { - if (lpiRef && !lpiRef->fIsCell()) - { - lpiRefServer = lpiRef->GetServer(); - } - if (lpiRef && (lpiRef->fIsAggregate() || lpiRef->fIsFileset())) - { - lpiRefAggregate = lpiRef->GetAggregate(); - } - if (lpiRef && lpiRef->fIsFileset()) - { - lpiRefFileset = lpiRef; - } - } - - // If we've been told to update only one server, aggregate or - // fileset, find out which IP addresses correspond with that - // server. We'll need this for comparisons later. - // - SERVERSTATUS ssRefServer; - if (rc && lpiRefServer) - { - LPSERVER lpServer; - if ((lpServer = lpiRefServer->OpenServer (&status)) == NULL) - rc = FALSE; - else - { - rc = lpServer->GetStatus (&ssRefServer, fNotify, &status); - lpServer->Close(); - } - } - - // Likewise, if we've been told to update only one aggregate, - // find that aggregate's ID. We'll need it for comparisons later. - // - AGGREGATESTATUS asRefAggregate; - int idPartition = NO_PARTITION; - if (rc && lpiRefAggregate) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpiRefAggregate->OpenAggregate (&status)) == NULL) - rc = FALSE; - else - { - idPartition = lpAggregate->GetID(); - rc = lpAggregate->GetStatus (&asRefAggregate, fNotify, &status); - lpAggregate->Close(); - } - } - - // Zip through the current list of objects that we're about to refresh. - // On each such object, remove the GHOST_HAS_VLDB_ENTRY flag, - // and delete objects entirely if that's the only ghost flag they have. - // (e.g., If we went through this routine earlier and created a ghost - // aggregate because VLDB referenced it and we couldn't find mention - // of it on the server, delete that aggregate. We'll recreate it here - // if necessary; otherwise, it needs to be gone.) - // - if (rc) - { - RefreshVLDB_RemoveReferences (lpiRefServer, lpiRefAggregate, lpiRefFileset, pvidRefFileset); - } - - // We'll get a new list of filesets from VLDB, and to do that, we'll - // need the cell's object. If we're enumerating a specific server, we'll - // also need that server's object. Finally, if we're enumerating a - // specific aggregate, we'll also need that aggregate's name. - // - PVOID hCell = NULL; - PVOID hServer = NULL; - - if (rc) - { - if (!lpiRefServer) - { - if ((hCell = GetCellObject (&status)) == NULL) - rc = FALSE; - } - else // get cell and server handles - { - LPSERVER lpServer; - if ((lpServer = lpiRefServer->OpenServer()) == NULL) - rc = FALSE; - else - { - if ((hServer = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - lpServer->Close(); - } - } - } - - // Go get that list of filesets, and use it to update our knowledge - // of the cell. Remember that, if {pvidRefFileset}, we only want - // one VLDB entry. - // - if (rc) - { - if (pvidRefFileset) - { - WORKERPACKET wpGet; - wpGet.wpVosVLDBGet.hCell = hCell; - wpGet.wpVosVLDBGet.idVolume = *pvidRefFileset; - - if (!Worker_DoTask (wtaskVosVLDBGet, &wpGet, &status)) - rc = FALSE; - else - RefreshVLDB_OneEntry (&wpGet.wpVosVLDBGet.Data, lpiRefServer, &ssRefServer, lpiRefAggregate, &asRefAggregate, lpiRefFileset, pvidRefFileset, fNotify); - } - else - { - WORKERPACKET wpBegin; - wpBegin.wpVosVLDBGetBegin.hCell = hCell; - wpBegin.wpVosVLDBGetBegin.hServer = hServer; - wpBegin.wpVosVLDBGetBegin.idPartition = idPartition; - - if (!Worker_DoTask (wtaskVosVLDBGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (;;) - { - WORKERPACKET wpNext; - wpNext.wpVosVLDBGetNext.hEnum = wpBegin.wpVosVLDBGetBegin.hEnum; - if (!Worker_DoTask (wtaskVosVLDBGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - RefreshVLDB_OneEntry (&wpNext.wpVosVLDBGetNext.Data, lpiRefServer, &ssRefServer, lpiRefAggregate, &asRefAggregate, lpiRefFileset, pvidRefFileset, fNotify); - } - - WORKERPACKET wpDone; - wpDone.wpVosVLDBGetDone.hEnum = wpBegin.wpVosVLDBGetBegin.hEnum; - Worker_DoTask (wtaskVosVLDBGetDone, &wpDone); - } - } - } - - // We've finished the update. If we were asked to send notifications - // about our progress, do so. - // - if (fNotify) - { - LPIDENT lpiNotify = (lpiRef) ? lpiRef : GetIdentifier(); - - if (!lpiNotify->fIsFileset()) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsBegin, lpiNotify); - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsEnd, lpiNotify, status); - } - - if (lpiNotify->fIsCell() || lpiNotify->fIsServer()) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAggregatesBegin, lpiNotify); - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAggregatesEnd, lpiNotify, status); - } - } - - if (hServer) - { - LPSERVER lpServer; - if ((lpServer = lpiRefServer->OpenServer()) != NULL) - { - lpServer->CloseVosObject(); - lpServer->Close(); - } - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - - -void CELL::RefreshVLDB_RemoveReferences (LPIDENT lpiRefServer, LPIDENT lpiRefAggregate, LPIDENT lpiRefFileset, LPVOLUMEID pvidRefFileset) -{ - // Zip through the current list of objects that we're about to refresh. - // On each such object, remove the GHOST_HAS_VLDB_ENTRY flag, - // and delete objects entirely if that's the only ghost flag they have. - // (e.g., If we went through this routine earlier and created a ghost - // aggregate because VLDB referenced it and we couldn't find mention - // of it on the server, delete that aggregate. We'll recreate it here - // if necessary; otherwise, it needs to be gone.) - // - // Note that by specifying {lpiRefServer} to start the enumeration, - // we'll either enumerate only lpiRefServer, or all servers if it's NULL. - // - HENUM heServer; - for (LPSERVER lpServer = ServerFindFirst (&heServer, lpiRefServer); lpServer; lpServer = ServerFindNext (&heServer)) - { - - if (!pvidRefFileset) - { - // Since we're about to check VLDB for references to this server, - // remove the GHOST_HAS_VLDB_ENTRY flag from its SERVER object. - // If that's the only thing keeping the object around, remove the - // object entirely. - // - if ((lpServer->m_wGhost &= (~GHOST_HAS_VLDB_ENTRY)) == 0) - { - lpServer->Close(); - lpServer->SendDeleteNotifications(); - m_lServers->Remove (lpServer); - Delete (lpServer); - continue; - } - } - - // Check each of the server's aggregates, and deal with them the same - // way. - // - HENUM heAggregate; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&heAggregate, lpiRefAggregate); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&heAggregate)) - { - - if (!pvidRefFileset) - { - // Since we're about to check VLDB for references to this aggregate, - // remove the GHOST_HAS_VLDB_ENTRY flag from its AGGREGATE object. - // If that's the only thing keeping the object around, remove the - // object entirely. - // - if ((lpAggregate->m_wGhost &= (~GHOST_HAS_VLDB_ENTRY)) == 0) - { - lpAggregate->Close(); - lpAggregate->SendDeleteNotifications(); - lpServer->m_lAggregates->Remove (lpAggregate); - Delete (lpAggregate); - continue; - } - } - - // Check each of the aggregate's filesets, and deal with them the same - // way. - // - HENUM heFileset; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&heFileset, lpiRefFileset); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&heFileset)) - { - if ((!pvidRefFileset) || (*pvidRefFileset == lpFileset->m_fs.idReadWrite)) - { - // Since we're about to check VLDB for references to this fileset, - // remove the GHOST_HAS_VLDB_ENTRY flag from its FILESET object. - // If that's the only thing keeping the object around, remove the - // object entirely. - // - if ((lpFileset->m_wGhost &= (~GHOST_HAS_VLDB_ENTRY)) == 0) - { - lpFileset->Close(); - lpFileset->SendDeleteNotifications(); - lpAggregate->m_lFilesets->Remove (lpFileset); - Delete (lpFileset); - continue; - } - } - - lpFileset->Close(); - } - - lpAggregate->Close(); - } - - lpServer->Close(); - } -} - - -void CELL::RefreshVLDB_OneEntry (PVOID pp, LPIDENT lpiRefServer, LPSERVERSTATUS pssRefServer, LPIDENT lpiRefAggregate, LPAGGREGATESTATUS pasRefAggregate, LPIDENT lpiRefFileset, LPVOLUMEID pvidRefFileset, BOOL fNotify) -{ - vos_vldbEntry_p pEntry = (vos_vldbEntry_p)pp; - - // If we were asked to update all the replicas of a particular - // fileset, then we set {pvidRefFileset} above to that fileset's - // ID. Check this VLDB entry to see if it refers to that fileset; - // if not, we're not interested in it. - // - if (pvidRefFileset) - { - if (memcmp (&pEntry->volumeId[ VOS_READ_WRITE_VOLUME ], pvidRefFileset, sizeof(VOLUMEID))) - return; - } - - for (int iRepSite = 0; iRepSite < pEntry->numServers; ++iRepSite) - { - SOCKADDR_IN RepSiteAddr; - AfsClass_IntToAddress (&RepSiteAddr, pEntry->volumeSites[ iRepSite ].serverAddress); - - // Every fileset replication site which VLDB knows about - // passes through this point, within {pEntry->volumeSites[ iRepSite ]}. - - // Are we going to be refreshing the server/aggregate on which - // this repsite lives? If not, there's no need to process this - // entry any further. - // - if (lpiRefServer) - { - BOOL fFilesetLivesOnThisServer = FALSE; - - for (size_t iAddress = 0; !fFilesetLivesOnThisServer && (iAddress < pssRefServer->nAddresses); ++iAddress) - { - if (!memcmp (&pssRefServer->aAddresses[ iAddress ], &RepSiteAddr, sizeof(SOCKADDR_IN))) - { - if (lpiRefAggregate) - { - if (pasRefAggregate->dwID != (DWORD)(pEntry->volumeSites[ iRepSite ].serverPartition)) - continue; - } - fFilesetLivesOnThisServer = TRUE; - } - } - - if (!fFilesetLivesOnThisServer) - continue; - } - - // Do we know about the server mentioned by this replication - // site? - // - LPSERVER lpServer; - if (lpiRefServer != NULL) - lpServer = lpiRefServer->OpenServer(); - else - lpServer = OpenServer (&RepSiteAddr); - - // If we found the server but aren't monitoring it, - // forget about this fileset. - // - if (lpServer && !lpServer->fIsMonitored()) - { - lpServer->Close(); - lpServer = NULL; - continue; - } - - // If we have no record of the server mentioned by this - // replication site, we have to create a SERVER entry for - // it before we can proceed. The server will appear as - // a "ghost". - // - if (!lpServer) - { - if (lpiRefAggregate || pvidRefFileset) - continue; - - LPTSTR pszServer = FormatString (TEXT("%1"), TEXT("%a"), &pEntry->volumeSites[ iRepSite ].serverAddress); - lpServer = New2 (SERVER,(this, pszServer)); - AfsClass_Enter(); - FreeString (pszServer); - - lpServer->m_fStatusOutOfDate = FALSE; - lpServer->m_ss.nAddresses = 1; - memcpy (&lpServer->m_ss.aAddresses[0], &RepSiteAddr, sizeof(SOCKADDR_IN)); - - m_lServers->Add (lpServer); - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpServer->GetIdentifier()); - } - - lpServer->m_wGhost |= GHOST_HAS_VLDB_ENTRY; - - // Great--we now have a replication site for a particular - // fileset known to VLDB, and a pointer to the server - // on which it resides. Does that server contain the - // aggregate which VLDB expects to find? - // - LPAGGREGATE lpAggregate; - if (lpiRefAggregate != NULL) - lpAggregate = lpiRefAggregate->OpenAggregate(); - else - lpAggregate = lpServer->OpenAggregate (pEntry->volumeSites[ iRepSite ].serverPartition); - - // If the server has no record of the aggregate mentioned - // by this replication site, we have to create an - // AGGREGATE entry for it before we can proceed. The - // aggregate will appear as a "ghost". Note that we - // can't update the list of aggregates on a server if - // we've been asked to update a particular fileset, - // because someone clearly has a pointer to the list. - // - if (!lpAggregate) - { - if (lpiRefFileset || pvidRefFileset) - { - lpServer->Close(); - lpServer = NULL; - continue; - } - - // Even if the partition doesn't exist, we can still figger out - // its name given its ID--'cause there's a 1:1 mapping between - // allowed IDs and allowed partition names. I guess there's - // something to be said for forcing partitions to be named "vicep*" - // - TCHAR szPartition[ cchNAME ]; - WORKERPACKET wp; - wp.wpVosPartitionIdToName.idPartition = pEntry->volumeSites[ iRepSite ].serverPartition; - wp.wpVosPartitionIdToName.pszPartition = szPartition; - if (!Worker_DoTask (wtaskVosPartitionIdToName, &wp)) - wsprintf (szPartition, TEXT("#%lu"), pEntry->volumeSites[ iRepSite ].serverPartition); - - lpAggregate = New2 (AGGREGATE,(lpServer, szPartition, TEXT(""))); - AfsClass_Enter(); - - lpAggregate->m_fStatusOutOfDate = FALSE; - lpAggregate->m_as.dwID = pEntry->volumeSites[ iRepSite ].serverPartition; - lpAggregate->m_as.ckStorageTotal = 0; - lpAggregate->m_as.ckStorageFree = 0; - - lpServer->m_lAggregates->Add (lpAggregate); - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpAggregate->GetIdentifier()); - } - - lpAggregate->m_wGhost |= GHOST_HAS_VLDB_ENTRY; - - // Great--we now have a replication site for a particular - // fileset known to VLDB, and a pointer to the server - // and aggregate on which it resides. Does that aggregate - // contain the fileset which VLDB expects to find? - // - // Remember that each iRepSite can represent up to three - // filesets on that aggregate--a RW, a RO, and a BAK. - // - for (size_t iType = 0; iType < 3; ++iType) - { - - // Does this repsite entry mention having this type - // of fileset on this aggregate? - // - if ((vos_volumeType_t)iType == VOS_READ_WRITE_VOLUME) - { - if (!((DWORD)pEntry->volumeSites[ iRepSite ].serverFlags & (DWORD)VOS_VLDB_READ_WRITE)) - continue; - } - else if ((vos_volumeType_t)iType == VOS_READ_ONLY_VOLUME) - { - if (!((DWORD)pEntry->volumeSites[ iRepSite ].serverFlags & (DWORD)VOS_VLDB_READ_ONLY)) - continue; - } - else if ((vos_volumeType_t)iType == VOS_BACKUP_VOLUME) - { - if (!((DWORD)pEntry->status & (DWORD)VOS_VLDB_ENTRY_BACKEXISTS)) - continue; - - // Only look for the backup where the R/W exists - if (!((DWORD)pEntry->volumeSites[ iRepSite ].serverFlags & (DWORD)VOS_VLDB_READ_WRITE)) - continue; - } - - LPFILESET lpFileset = lpAggregate->OpenFileset ((LPVOLUMEID)&pEntry->volumeId[ iType ]); - - // If the aggregate has no record of the fileset mentioned - // by this VLDB entry, we have to create a FILESET entry - // for it. The fileset will appear as a "ghost". - // - if (!lpFileset) - { - TCHAR szFilesetName[ cchNAME ]; - CopyAnsiToString (szFilesetName, pEntry->name); - if ((vos_volumeType_t)iType == VOS_READ_ONLY_VOLUME) - lstrcat (szFilesetName, TEXT(".readonly")); - else if ((vos_volumeType_t)iType == VOS_BACKUP_VOLUME) - lstrcat (szFilesetName, TEXT(".backup")); - - lpFileset = New2 (FILESET,(lpAggregate, &pEntry->volumeId[ iType ], szFilesetName)); - AfsClass_Enter(); - - lpFileset->m_fs.id = pEntry->volumeId[ iType ]; - lpFileset->m_fs.idReadWrite = pEntry->volumeId[ VOS_READ_WRITE_VOLUME ]; - lpFileset->m_fs.idReplica = pEntry->volumeId[ VOS_READ_ONLY_VOLUME ]; - AfsClass_UnixTimeToSystemTime (&lpFileset->m_fs.timeCreation, 0); - AfsClass_UnixTimeToSystemTime (&lpFileset->m_fs.timeLastUpdate, 0); - AfsClass_UnixTimeToSystemTime (&lpFileset->m_fs.timeLastAccess, 0); - AfsClass_UnixTimeToSystemTime (&lpFileset->m_fs.timeLastBackup, 0); - AfsClass_UnixTimeToSystemTime (&lpFileset->m_fs.timeCopyCreation, 0); - lpFileset->m_fs.nFiles = 0; - lpFileset->m_fs.ckQuota = 0; - lpFileset->m_fs.ckUsed = 0; - lpFileset->m_fs.Type = (iType == 0) ? ftREADWRITE : (iType == 1) ? ftREPLICA : ftCLONE; - lpFileset->m_fs.State = fsNORMAL; - - lpAggregate->m_lFilesets->Add (lpFileset); - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpFileset->GetIdentifier()); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, lpFileset->GetIdentifier()); - - lpFileset->m_wGhost |= GHOST_HAS_VLDB_ENTRY; - lpFileset->m_fStatusOutOfDate = FALSE; - lpFileset->m_fs.idClone = pEntry->cloneId; - lpFileset->m_fs.State &= ~fsMASK_VLDB; - - if (pEntry->status & VOS_VLDB_ENTRY_LOCKED) - lpFileset->m_fs.State |= fsLOCKED; - - lpFileset->Close(); - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, lpFileset->GetIdentifier(), 0); - } - - if (lpServer && lpAggregate) - { - lpAggregate->InvalidateAllocation(); - lpAggregate->Close(); - lpAggregate = NULL; - } - if (lpServer) - { - lpServer->Close(); - lpServer = NULL; - } - } -} - - -BOOL CELL::RefreshAll (ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - BOOL fNotified = FALSE; - - if (m_fServersOutOfDate && (dwWant & AFSCLASS_WANT_VOLUMES)) - { - if (!fNotified) - { - fNotified = TRUE; - if ((++cRefreshAllReq) == 1) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllBegin, GetIdentifier()); - } - } - - size_t nServersToRefresh = 0; - - HENUM hEnum; - for (LPSERVER lpServer = ServerFindFirst (&hEnum); lpServer; lpServer = ServerFindNext (&hEnum)) - { - if (lpServer->fIsMonitored()) - ++nServersToRefresh; - lpServer->Close(); - } - - if (nServersToRefresh) - { - size_t iServer = 0; - for (LPSERVER lpServer = ServerFindFirst (&hEnum); lpServer; lpServer = ServerFindNext (&hEnum)) - { - if (lpServer->fIsMonitored()) - { - ULONG perComplete = (ULONG)iServer * 100L / nServersToRefresh; - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllUpdate, lpServer->GetIdentifier(), NULL, NULL, NULL, perComplete, 0); - - // intentionally ignore errors in refreshing individual - // servers--we only want to return an error code if - // we couldn't refresh the *cell*. - // - (void)lpServer->RefreshAll (NULL, ((double)iServer / (double)nServersToRefresh), (1.0 / (double)nServersToRefresh)); - ++iServer; - } - lpServer->Close(); - } - - rc = RefreshVLDB (NULL, TRUE, &status); - } - } - - if (rc && m_fUsersOutOfDate && (dwWant & AFSCLASS_WANT_USERS)) - { - if (!fNotified) - { - fNotified = TRUE; - if ((++cRefreshAllReq) == 1) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllBegin, GetIdentifier(), NULL, NULL, NULL, 0, 0); - } - } - - rc = RefreshUsers (TRUE, &status); - } - - if (fNotified) - { - if ((--cRefreshAllReq) == 0) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllEnd, GetIdentifier(), NULL, NULL, NULL, 100, status); - } - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -/* - * USER/GROUP-LIST MANAGEMENT _________________________________________________ - * - */ - -LPUSER CELL::OpenUser (LPTSTR pszName, LPTSTR pszInstance, ULONG *pStatus) -{ - ULONG status = 0; - - // First off, do we have a USER object for this guy already? - // - LPUSER lpUser = NULL; - for (LPENUM pEnum = m_lkUserName->FindFirst (pszName); pEnum; pEnum = pEnum->FindNext()) - { - LPUSER lpTest = (LPUSER)( pEnum->GetObject() ); - if (!pszInstance || !lstrcmpi (lpTest->m_szInstance, pszInstance)) - { - lpUser = lpTest; - AfsClass_Enter(); - Delete (pEnum); - break; - } - } - - // If not, see if we can create one... - // - if (!lpUser) - { - // See if there's a KAS or PTS entry for this user. - // - BOOL fHasKAS = FALSE; - BOOL fHasPTS = FALSE; - - WORKERPACKET wp; - wp.wpKasPrincipalGet.hCell = GetCellObject (&status); - wp.wpKasPrincipalGet.hServer = GetKasObject (&status); - wp.wpKasPrincipalGet.pszPrincipal = pszName; - wp.wpKasPrincipalGet.pszInstance = pszInstance; - if (Worker_DoTask (wtaskKasPrincipalGet, &wp, &status)) - fHasKAS = TRUE; - - if (!fHasKAS) - { - TCHAR szFullName[ cchNAME ]; - AfsClass_GenFullUserName (szFullName, pszName, pszInstance); - - WORKERPACKET wp; - wp.wpPtsUserGet.hCell = GetCellObject(); - wp.wpPtsUserGet.pszUser = szFullName; - if (Worker_DoTask (wtaskPtsUserGet, &wp, &status)) - fHasPTS = TRUE; - } - if (fHasKAS || fHasPTS) - { - lpUser = New2 (USER,(this, pszName, pszInstance)); - m_lUsers->Add (lpUser); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpUser->GetIdentifier()); - AfsClass_Enter(); - } - } - - if (!lpUser && pStatus) - *pStatus = status; - return lpUser; -} - - -LPUSER CELL::UserFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus) -{ - return UserFindFirst (phEnum, NULL, fNotify, pStatus); -} - - -LPUSER CELL::UserFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus) -{ - LPUSER lpUser = NULL; - - if (!RefreshUsers (fNotify, pStatus)) - return NULL; - - if (lpiFind != NULL) - { - lpUser = lpiFind->OpenUser(); - *phEnum = NULL; - } - else if ((*phEnum = m_lUsers->FindFirst()) != NULL) - { - lpUser = (LPUSER)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - - if (!lpUser && pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - return lpUser; -} - - -LPUSER CELL::UserFindNext (HENUM *phEnum) -{ - LPUSER lpUser = NULL; - - if (*phEnum) - { - if ((*phEnum = (*phEnum)->FindNext()) != NULL) - { - lpUser = (LPUSER)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - } - - return lpUser; -} - - -void CELL::UserFindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - - - -LPPTSGROUP CELL::OpenGroup (LPTSTR pszName, ULONG *pStatus) -{ - ULONG status; - - // First off, do we have a USER object for this guy already? - // - LPPTSGROUP lpGroup; - if ((lpGroup = (LPPTSGROUP)(m_lkGroupName->GetFirstObject (pszName))) != NULL) - AfsClass_Enter(); - - // If not, see if we can create one... - // - if (!lpGroup) - { - // See if there's a PTS entry for this group. - // - WORKERPACKET wp; - wp.wpPtsGroupGet.hCell = GetCellObject(); - wp.wpPtsGroupGet.pszGroup = pszName; - if (Worker_DoTask (wtaskPtsGroupGet, &wp, &status)) - { - lpGroup = New2 (PTSGROUP,(this, pszName)); - m_lGroups->Add (lpGroup); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpGroup->GetIdentifier()); - AfsClass_Enter(); - } - } - - if (!lpGroup && pStatus) - *pStatus = status; - return lpGroup; -} - - -LPPTSGROUP CELL::GroupFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus) -{ - return GroupFindFirst (phEnum, NULL, fNotify, pStatus); -} - - -LPPTSGROUP CELL::GroupFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus) -{ - LPPTSGROUP lpGroup = NULL; - - if (!RefreshUsers (fNotify, pStatus)) - return NULL; - - if (lpiFind != NULL) - { - lpGroup = lpiFind->OpenGroup(); - *phEnum = NULL; - } - else if ((*phEnum = m_lGroups->FindFirst()) != NULL) - { - lpGroup = (LPPTSGROUP)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - - if (!lpGroup && pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - return lpGroup; -} - - -LPPTSGROUP CELL::GroupFindNext (HENUM *phEnum) -{ - LPPTSGROUP lpGroup = NULL; - - if (*phEnum) - { - if ((*phEnum = (*phEnum)->FindNext()) != NULL) - { - lpGroup = (LPPTSGROUP)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - } - - return lpGroup; -} - - -void CELL::GroupFindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - - -BOOL CELL::RefreshUsers (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (m_fUsersOutOfDate) - { - m_fUsersOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshUsersBegin, GetIdentifier()); - - // First, forget everything we think we know about all users and groups; - // we wouldn't be here if someone didn't think it was all out of date. - // - FreeUsers (TRUE); - - // Then zip through KAS to build a list of all user entries; - // we'll need hCell and hKAS for that. - // - WORKERPACKET wpBegin; - wpBegin.wpKasPrincipalGetBegin.hCell = GetCellObject(); - wpBegin.wpKasPrincipalGetBegin.hServer = GetKasObject (&status); - - if (!Worker_DoTask (wtaskKasPrincipalGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (;;) - { - TCHAR szPrincipal[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpKasPrincipalGetNext.hEnum = wpBegin.wpKasPrincipalGetBegin.hEnum; - wpNext.wpKasPrincipalGetNext.pszPrincipal = szPrincipal; - wpNext.wpKasPrincipalGetNext.pszInstance = szInstance; - if (!Worker_DoTask (wtaskKasPrincipalGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - // Okay, we got a user from kas. Create a USER object for it. - // - LPUSER lpUser = New2 (USER,(this, szPrincipal, szInstance)); - m_lUsers->Add (lpUser); - - // That was easy, wasn't it? Now check this user's groups, - // both the ones it owns and the ones to which it belongs, - // so we can build a full list-o-groups. - // - LPTSTR mszGroups; - if (lpUser->GetMemberOf (&mszGroups)) - { - BuildGroups (mszGroups); - FreeString (mszGroups); - } - - if (lpUser->GetOwnerOf (&mszGroups)) - { - BuildGroups (mszGroups); - FreeString (mszGroups); - } - } - - WORKERPACKET wpDone; - wpDone.wpKasPrincipalGetDone.hEnum = wpBegin.wpKasPrincipalGetBegin.hEnum; - Worker_DoTask (wtaskKasPrincipalGetDone, &wpDone); - } - -#ifdef FIND_PTS_DEBRIS - // Icky horrible painful part: to catch entries which exist on PTS - // but not in KAS, we need to zip back through our list of groups - // and check thier memberships. - // - for (LPENUM pe = m_lGroups->FindFirst(); pe; pe = pe->FindNext()) - { - LPPTSGROUP lpGroup = (LPPTSGROUP)(pe->GetObject()); - - LPTSTR mszMembers; - if (lpGroup->GetMembers (&mszMembers)) - { - for (LPTSTR pszMember = mszMembers; pszMember && *pszMember; pszMember += 1+lstrlen(pszMember)) - { - // Make sure we have a user or group account for this guy. - // Remember that the member name may have both a name and - // an instance. - // - if (m_lkGroupName->GetFirstObject (pszMember)) - continue; - - TCHAR szNameMatch[ cchNAME ]; - TCHAR szInstanceMatch[ cchNAME ]; - USER::SplitUserName (pszMember, szNameMatch, szInstanceMatch); - - LPUSER lpFound = NULL; - for (LPENUM pEnum = m_lkUserName->FindFirst (szNameMatch); pEnum; pEnum = pEnum->FindNext()) - { - LPUSER lpTest = (LPUSER)( pEnum->GetObject() ); - if (!lstrcmpi (lpTest->m_szInstance, szInstanceMatch)) - { - lpFound = lpTest; - Delete (pEnum); - break; - } - } - if (lpFound) - continue; - - // Uh oh. Is this thing a user or a group? We're really only - // interested in finding user-account debris here... - // - WORKERPACKET wpGet; - wpGet.wpPtsUserGet.hCell = GetCellObject(); - wpGet.wpPtsUserGet.pszUser = pszMember; - if (Worker_DoTask (wtaskPtsUserGet, &wpGet)) - { - if (wpGet.wpPtsUserGet.Entry.nameUid > 0) - { - LPUSER lpUser = New2 (USER,(this, pszMember, TEXT(""))); - m_lUsers->Add (lpUser); - } - } - } - } - } -#endif - - // We've finally generated a complete list of the users and groups in - // this cell. If we've been asked to, send out notifications for all - // the things we found. - // - if (fNotify) - { - for (LPENUM pEnum = m_lGroups->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPPTSGROUP lpGroup = (LPPTSGROUP)(pEnum->GetObject()); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpGroup->GetIdentifier()); - } - - for (pEnum = m_lUsers->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPUSER lpUser = (LPUSER)(pEnum->GetObject()); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpUser->GetIdentifier()); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshUsersEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -void CELL::BuildGroups (LPTSTR mszGroups) -{ - for (LPTSTR pszGroup = mszGroups; pszGroup && *pszGroup; pszGroup += 1+lstrlen(pszGroup)) - { - // Make sure we have this group in our list-of-groups - // - LPPTSGROUP lpGroup; - if ((lpGroup = (LPPTSGROUP)m_lkGroupName->GetFirstObject (pszGroup)) == NULL) - { - lpGroup = New2 (PTSGROUP,(this, pszGroup)); - m_lGroups->Add (lpGroup); - } - } -} - - -BOOL CELL::RefreshAccount (LPTSTR pszAccount, LPTSTR pszInstance, OP_CELL_REFRESH_ACCOUNT Op, LPIDENT *plpi) -{ - BOOL rc = TRUE; - - // See if we can find this thing - // - LPIDENT lpi; - if ((lpi = IDENT::FindUser (m_lpiThis, pszAccount, pszInstance)) != NULL) - { - if (lpi->m_cRef == 0) - lpi = NULL; - } - if (!lpi) - { - if ((lpi = IDENT::FindGroup (m_lpiThis, pszAccount)) != NULL) - if (lpi->m_cRef == 0) - lpi = NULL; - } - - // If we couldn't find it, and Op is _CREATED_*, then make a new account - // - if ((!lpi) && (Op == CELL_REFRESH_ACCOUNT_CREATED_USER)) - { - LPUSER lpUser = New2 (USER,(this, pszAccount, pszInstance)); - m_lUsers->Add (lpUser); - lpi = lpUser->GetIdentifier(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpi); - } - else if ((!lpi) && (Op == CELL_REFRESH_ACCOUNT_CREATED_GROUP)) - { - LPPTSGROUP lpGroup = New2 (PTSGROUP,(this, pszAccount)); - m_lGroups->Add (lpGroup); - lpi = lpGroup->GetIdentifier(); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpi); - } - - // If we did find it, and Op is _DELETED, then remove the account - // - if (lpi && (Op == CELL_REFRESH_ACCOUNT_DELETED)) - { - if (lpi && (lpi->GetType() == itUSER)) - { - LPUSER lpUser; - if ((lpUser = lpi->OpenUser()) == NULL) - rc = FALSE; - else - { - lpUser->SendDeleteNotifications(); - lpUser->Close(); - m_lUsers->Remove (lpUser); - Delete (lpUser); - lpi = NULL; - } - } - else if (lpi && (lpi->GetType() == itGROUP)) - { - LPPTSGROUP lpGroup; - if ((lpGroup = lpi->OpenGroup()) == NULL) - rc = FALSE; - else - { - lpGroup->SendDeleteNotifications(); - lpGroup->Close(); - m_lGroups->Remove (lpGroup); - Delete (lpGroup); - lpi = NULL; - } - } - else - { - rc = FALSE; - } - } - - // If we still have an ident, refresh the account's properties - // - if (lpi && (lpi->GetType() == itUSER)) - { - LPUSER lpUser; - if ((lpUser = lpi->OpenUser()) == NULL) - rc = FALSE; - else - { - lpUser->Invalidate(); - lpUser->RefreshStatus(); - lpUser->Close(); - } - } - else if (lpi && (lpi->GetType() == itGROUP)) - { - LPPTSGROUP lpGroup; - if ((lpGroup = lpi->OpenGroup()) == NULL) - rc = FALSE; - else - { - lpGroup->Invalidate(); - lpGroup->RefreshStatus(); - lpGroup->Close(); - } - } - - if (plpi) - *plpi = lpi; - return rc; -} - - -BOOL CELL::RefreshAccounts (LPTSTR mszAccounts, OP_CELL_REFRESH_ACCOUNT Op) -{ - BOOL rc = TRUE; - for (LPTSTR psz = mszAccounts; psz && *psz; psz += 1+lstrlen(psz)) - { - if (!RefreshAccount (psz, NULL, Op)) - rc = FALSE; - } - return rc; -} - diff --git a/src/WINNT/afsclass/c_cell.h b/src/WINNT/afsclass/c_cell.h deleted file mode 100644 index 03a6dc366..000000000 --- a/src/WINNT/afsclass/c_cell.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_CELL_H -#define AFSCLASS_CELL_H - -#include -#include -#include -#include -#include - - -typedef enum - { - CELL_REFRESH_ACCOUNT_CREATED_USER, - CELL_REFRESH_ACCOUNT_CREATED_GROUP, - CELL_REFRESH_ACCOUNT_CHANGED, - CELL_REFRESH_ACCOUNT_DELETED, - } OP_CELL_REFRESH_ACCOUNT; - -/* - * CELL CLASS _________________________________________________________________ - * - */ - -class CELL - { - friend class IDENT; - friend class SERVER; - friend class SERVICE; - friend class AGGREGATE; - friend class FILESET; - friend class USER; - friend class PTSGROUP; - - public: - static LPIDENT OpenCell (LPTSTR pszCellName, PVOID hCreds, ULONG *pStatus = NULL); - static void CloseCell (LPIDENT lpiCell); - static LPCELL ReopenCell (LPTSTR szCell, ULONG *pStatus = NULL); - - public: - void Close (void); - void Invalidate (void); - void InvalidateServers (void); - void InvalidateUsers (void); - BOOL RefreshServerList (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - BOOL RefreshServers (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - BOOL RefreshVLDB (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - BOOL RefreshVLDB (LPIDENT lpiRefresh, BOOL fNotify = TRUE, ULONG *pStatus = NULL, BOOL fAnythingRelatedToThisRWFileset = FALSE); - BOOL RefreshUsers (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - BOOL RefreshAll (ULONG *pStatus = NULL); - BOOL RefreshAccount (LPTSTR pszAccount, LPTSTR pszInstance, OP_CELL_REFRESH_ACCOUNT Op, LPIDENT *plpi = NULL); - BOOL RefreshAccounts (LPTSTR mszAccounts, OP_CELL_REFRESH_ACCOUNT Op); - - // Cell properties - // - LPIDENT GetIdentifier (void); - void GetName (LPTSTR pszName); - static BOOL GetDefaultCell (LPTSTR pszName, ULONG *pStatus = NULL); - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - BOOL fAnyServersUnmonitored (void); - - PVOID GetCellObject (ULONG *pStatus = NULL); - PVOID GetKasObject (ULONG *pStatus = NULL); - - PVOID GetCurrentCredentials (void); - void SetCurrentCredentials (PVOID hCreds); - - // Servers within a cell - // - LPSERVER OpenServer (LPTSTR pszName, ULONG *pStatus = NULL); - LPSERVER OpenServer (LPSOCKADDR_IN pAddr, ULONG *pStatus = NULL); - LPSERVER ServerFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPSERVER ServerFindFirst (HENUM *phEnum, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPSERVER ServerFindNext (HENUM *phEnum); - void ServerFindClose (HENUM *phEnum); - - // Users and Groups within a cell - // - LPUSER OpenUser (LPTSTR pszName, LPTSTR pszInstance = NULL, ULONG *pStatus = NULL); - LPUSER UserFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPUSER UserFindFirst (HENUM *phEnum, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPUSER UserFindNext (HENUM *phEnum); - void UserFindClose (HENUM *phEnum); - - LPPTSGROUP OpenGroup (LPTSTR pszName, ULONG *pStatus = NULL); - LPPTSGROUP GroupFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPPTSGROUP GroupFindFirst (HENUM *phEnum, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPPTSGROUP GroupFindNext (HENUM *phEnum); - void GroupFindClose (HENUM *phEnum); - - private: - static void InitClass (void); - CELL (LPTSTR pszCellName, PVOID hCreds); - ~CELL (void); - void FreeUsers (BOOL fNotify); - void FreeServers (BOOL fNotify); - - BOOL CloseCellObject (ULONG *pStatus = NULL); - BOOL CloseKasObject (ULONG *pStatus = NULL); - - void RefreshVLDB_RemoveReferences (LPIDENT lpiRefServer, LPIDENT lpiRefAggregate, LPIDENT lpiRefFileset, LPVOLUMEID pvidRefFileset); - void RefreshVLDB_OneEntry (PVOID pEntry, LPIDENT lpiRefServer, LPSERVERSTATUS pssRefServer, LPIDENT lpiRefAggregate, LPAGGREGATESTATUS pasRefAggregate, LPIDENT lpiRefFileset, LPVOLUMEID pvidRefFileset, BOOL fNotify); - void BuildGroups (LPTSTR mszGroups); - - static BOOL CALLBACK CELL::KeyServerName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK CELL::KeyServerName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK CELL::KeyServerName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK CELL::KeyServerAddr_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK CELL::KeyServerAddr_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK CELL::KeyServerAddr_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK CELL::KeyUserName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK CELL::KeyUserName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK CELL::KeyUserName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK CELL::KeyGroupName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK CELL::KeyGroupName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK CELL::KeyGroupName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - private: - PVOID m_hCell; - PVOID m_hKas; - TCHAR m_szName[ cchNAME ]; - size_t m_nReqs; - PVOID m_hCreds; - char **m_apszServers; - - BOOL m_fStatusOutOfDate; - BOOL m_fVLDBOutOfDate; - LPIDENT m_lpiThis; - - static LPHASHLIST x_lCells; - - BOOL m_fServersOutOfDate; - size_t m_nServersUnmonitored; - LPHASHLIST m_lServers; - LPHASHLISTKEY m_lkServerName; - LPHASHLISTKEY m_lkServerAddr; - - BOOL m_fUsersOutOfDate; - LPHASHLIST m_lUsers; - LPHASHLISTKEY m_lkUserName; - LPHASHLIST m_lGroups; - LPHASHLISTKEY m_lkGroupName; - }; - - -#endif // AFSCLASS_CELL_H - diff --git a/src/WINNT/afsclass/c_debug.cpp b/src/WINNT/afsclass/c_debug.cpp deleted file mode 100644 index d80d8c9f9..000000000 --- a/src/WINNT/afsclass/c_debug.cpp +++ /dev/null @@ -1,785 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include - -#ifdef DEBUG - -#ifndef THIS_HINST -#define THIS_HINST (GetModuleHandle (NULL)) -#endif - -#define WM_OUTSTRING (WM_USER + 0x99) - - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - Debugstr debug; - - int Debugstr::fRegistered = 0; - int Debugstr::fInit = 0; - HWND Debugstr::hwnd = 0; - - ushort Debugstr::gx; - ushort Debugstr::gy; - ushort Debugstr::gcX; - ushort Debugstr::gcY; - char Debugstr::gdata[ yMAX ][ xMAX ]; - - BOOL Debugstr::fAngles = FALSE; - - ushort nRefr; - - ushort cxAvgWidth (void); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -int AssertFn (int b, char *expr, int line, char *name) -{ - char szLine1[ 256 ]; - char szLine2[ 256 ]; - - if (b) - return 1; - - wsprintf (szLine1, "Assertion failed: \"%s\"", expr); - wsprintf (szLine2, "Line %u of module %s.", line, name); - -#ifdef DEBUG -debug << szLine1 << "\n"; -debug << szLine2 << "\n"; -#endif - - MessageBox (NULL, szLine1, szLine2, MB_ICONEXCLAMATION); - return 0; -} - - -/* - * OPERATORS __________________________________________________________________ - * - */ - -Debugstr & Debugstr::operator<< (char *str) -{ - if (! strcmp (str, ANGLES_ON)) - fAngles = TRUE; - else if (! strcmp (str, ANGLES_OFF)) - fAngles = FALSE; - else if (! strcmp (str, LASTERROR)) - { - LPVOID lp; - - FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, GetLastError(), - MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), - (LPTSTR)&lp, 0, NULL); - - (*this) << "#" << (LONG)GetLastError(); - (*this) << " (" << (char *)lp << ")"; - - LocalFree (lp); - } - else - { - Register(); // does nothing unless first time - Initialize(); // does nothing unless first time - - char *strToSend = (char *)Allocate(1+strlen(str)); - strcpy (strToSend, str); - - PostMessage (Debugstr::hwnd, WM_OUTSTRING, 0, (LPARAM)strToSend); - } - return (*this); -} - -Debugstr & Debugstr::operator<< (void *addr) -{ - char szTemp[40]; - if (HIWORD(addr) == 0x0000) - wsprintf (szTemp, "0x%04X", (ushort)LOWORD(addr)); - else - wsprintf (szTemp, "0x%08lX", (LONG)addr); - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (uchar ch) -{ - char szTemp[2]; - szTemp[0] = ch; - szTemp[1] = 0; - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (char ch) -{ - char szTemp[2]; - szTemp[0] = ch; - szTemp[1] = 0; - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (size_t l) -{ - char szTemp[40]; - _ltoa (l, szTemp, 10); - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (long l) -{ - char szTemp[40]; - _ltoa (l, szTemp, 10); - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (ushort s) -{ - char szTemp[40]; - _itoa (s, szTemp, 10); - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (short s) -{ - char szTemp[40]; - _itoa (s, szTemp, 10); - return (*this << szTemp); -} - -Debugstr & Debugstr::operator<< (double f) -{ - char *psz; // (may cross segments) - char szTemp[ 64 ]; - long l; - - if (fAngles) - { - f *= 180.0 / 3.1415926535897; - while (f >= 360) - f -= 360; - while (f < 0) - f += 360; - } - - l = (long)f; - *this << l; - - f -= (double)l; - f *= 1000000.0; // add 6 zeroes... - l = (long)f; - - wsprintf (szTemp, "%06ld", l); - - for (psz = &szTemp[ strlen(szTemp)-1 ]; psz >= szTemp; psz--) - { - if (*psz != '0') - break; - } - *(1+psz) = 0; - - if (szTemp[0] != 0) - { - *this << "." << szTemp; - } - - return *this; -} - -Debugstr & Debugstr::operator<< (RECT r) -{ - *this << "{ x=" << (LONG)r.left << ".." << (LONG)r.right; - *this << ", y=" << (LONG)r.top << ".." << (LONG)r.bottom << " }"; - return (*this); -} - -Debugstr & Debugstr::operator<< (LPIDENT lpi) -{ - if (!lpi) - { - *this << "{ invalid ident }"; - } - else if (lpi->fIsCell()) - { - TCHAR szCell[ cchNAME ]; - lpi->GetCellName (szCell); - *this << "{ cell " << szCell << " }"; - } - else if (lpi->fIsServer()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - *this << "{ server " << szServer << " }"; - } - else if (lpi->fIsAggregate()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - TCHAR szAggregate[ cchNAME ]; - lpi->GetAggregateName (szAggregate); - *this << "{ aggregate " << szServer << ":" << szAggregate << " }"; - } - else if (lpi->fIsFileset()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - TCHAR szAggregate[ cchNAME ]; - lpi->GetAggregateName (szAggregate); - TCHAR szFileset[ cchNAME ]; - lpi->GetFilesetName (szFileset); - *this << "{ fileset " << szFileset << " on " << szServer << ":" << szAggregate << " }"; - } - else if (lpi->fIsServer()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - TCHAR szService[ cchNAME ]; - lpi->GetServiceName (szService); - *this << "{ service " << szServer << ":" << szService << " }"; - } - return (*this); -} - - -/* - * STATICS ____________________________________________________________________ - * - */ - -Debugstr::Debugstr (void) -{ - hfNew = NULL; - brBack = NULL; -} - -Debugstr::~Debugstr (void) -{ - if (hfNew != NULL) - { - DeleteObject (hfNew); - hfNew = NULL; - } - - if (brBack != NULL) - { - DeleteObject (brBack); - brBack = NULL; - } -} - - -#define szDebugCLASS "DebugClass" - -void Debugstr::Register (void) -{ - WNDCLASS wc; - - if (fRegistered) - return; - fRegistered = TRUE; - - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = DebugWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = THIS_HINST; - wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = CreateSolidBrush( GetSysColor( COLOR_BTNFACE )); - wc.lpszMenuName = NULL; - wc.lpszClassName = szDebugCLASS; - - (void)RegisterClass(&wc); -} - - -void Debugstr::Initialize (void) -{ - HWND hWnd; - int x, y, w, h; - - if (fInit) - return; - fInit = TRUE; - - w = cxAvgWidth() * 58; -// w = cxAvgWidth() * 160; - h = GetSystemMetrics (SM_CYSCREEN); - x = GetSystemMetrics (SM_CXSCREEN) - w; - y = 0; - - hWnd = CreateWindow( - szDebugCLASS, - "debug++", // Title - WS_OVERLAPPEDWINDOW | // Window style - WS_THICKFRAME, - x, // Default horizontal position - y +35, // Default vertical position - w, // Default width - h -70, // Default height - NULL, // Overlapped windows have no parent - NULL, // Use the window class menu - THIS_HINST, // This instance owns this window - NULL // Pointer not needed - ); - - if (!hWnd) - return; - - /* - * Make the window visible and update its client area. - * - */ - - for (y = 0; y < yMAX; y++) - gdata[y][0] = 0; - - gx = minX; - gy = minY; - gcX = 0; - gcY = 0; - nRefr = 0; - - ShowWindow (hWnd, SW_SHOWNOACTIVATE); - UpdateWindow (hWnd); - - Debugstr::hwnd = hWnd; -} - - -/*** OutString - Translates "\n" 's, and calls Output to display text - * - * ENTRY: char *str - string to display - * BOOL fRecord - FALSE if inside WM_PAINT message - * - * EXIT: none - * - */ - -void Debugstr::OutString (char *str, BOOL fRecord) -{ - char *psz, *pch; - HDC hdc; - DWORD fg, bk; - RECT r; - RECT r2; - HFONT hfOld; - LOGFONT lf; - SIZE siz; - - Register(); // does nothing unless first time - Initialize(); // does nothing unless first time - - if (str == NULL) - str = "(null)"; - - OutputDebugString (str); - - if (Debugstr::hwnd == NULL) - return; - - if ((hdc = GetDC (Debugstr::hwnd)) == NULL) - return; - - fg = SetTextColor (hdc, GetSysColor( COLOR_BTNTEXT )); - bk = SetBkColor (hdc, GetSysColor( COLOR_BTNFACE )); - - if (brBack == NULL) - { - brBack = CreateSolidBrush (GetBkColor(hdc)); - } - - if (hfNew == NULL) - { - memset (&lf, 0, sizeof(lf)); - - lf.lfWeight = FW_NORMAL; - lf.lfHeight = -MulDiv (8, GetDeviceCaps(hdc, LOGPIXELSY), 72); - strcpy (lf.lfFaceName, "Arial"); - - hfNew = CreateFontIndirect(&lf); - } - - hfOld = (HFONT)SelectObject(hdc, hfNew); - GetTextMetrics (hdc, &tm); - - GetClientRect (Debugstr::hwnd, &r); - - if (!strcmp (str, "CLS")) - { - gx = 0; - gy = minY; - gcX = 0; - gcY = 0; - gdata[gcY][0] = 0; - gdata[gcY+1][0] = 0; - - FillRect (hdc, &r, brBack); - } - else for (psz = str; *psz; ) - { - if ((pch = strchr(psz, '\n')) == NULL) - { - Output (hdc, psz, fRecord); - break; - } - - *pch = 0; - Output (hdc, psz, fRecord); - - gy += (ushort)tm.tmHeight; - gcY++; - gx = minX; - gcX = 0; - - if (fRecord) - { - if ((gy + tm.tmHeight) > (ushort)r.bottom) - { - gy = minY; - gcY = 0; - - GetTextExtentPoint (hdc, gdata[gcY], strlen(gdata[gcY]), &siz); - - r2.top = gy; - r2.bottom = gy + tm.tmHeight; - r2.left = gx -1; - r2.right = siz.cx; - r2.right += gx; - FillRect (hdc, &r2, brBack); - - gdata[gcY][0] = 0; - } - } - - nRefr = max( nRefr, gcY ); - - *pch = '\n'; - psz = 1+pch; - - if (fRecord) - { - GetTextExtentPoint (hdc, gdata[gcY+1], strlen(gdata[gcY+1]), &siz); - - r2.top = gy +tm.tmHeight; - r2.bottom = gy +tm.tmHeight +tm.tmHeight; - r2.left = gx; - r2.right = siz.cx; - r2.right += gx; - FillRect (hdc, &r2, brBack); - - gdata[gcY+1][0] = 0; - } - } - - SelectObject (hdc, hfOld); - SetTextColor (hdc, fg); - SetBkColor (hdc, bk); - ReleaseDC (Debugstr::hwnd, hdc); -} - - -void Debugstr::Output (HDC hdc, char *psz, BOOL fRec) -{ - SIZE siz; - - TextOut (hdc, gx, gy, psz, strlen(psz)); - - if (fRec) - strcat (gdata[gcY], psz); - - GetTextExtentPoint (hdc, psz, strlen(psz), &siz); - - gx += (ushort)siz.cx; - gcX += strlen(psz); -} - - - -/*** DebugWndProc - Main window callback - * - * ENTRY: - * EXIT: As WNDPROC - * - * MESSAGES: WM_COMMAND - application menu (About dialog box) - * WM_DESTROY - destroy window - * - */ - -LONG APIENTRY Debugstr::DebugWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - ushort x, y, cX, cY; - - switch (message) - { - case WM_COMMAND: - break; - - case WM_DESTROY: - if (Debugstr::hwnd != 0) - { - CloseWindow (Debugstr::hwnd); - Debugstr::hwnd = 0; // Turn off debugging--no window! - } - break; - - case WM_OUTSTRING: - { - char *str = (char*)lParam; - debug.OutString (str, TRUE); - Free (str); - } - break; - - case WM_PAINT: - { - PAINTSTRUCT ps; - HDC hdc; - hdc = BeginPaint (hWnd, &ps); - EndPaint (hWnd, &ps); - - x = gx; y = gy; cX = gcX; cY = gcY; - - gx = minX; - gy = minY; - gcX = 0; - gcY = 0; - - for (gcY = 0; gcY < nRefr; ) - { - TCHAR szLine[] = TEXT("\n"); - debug.OutString (gdata[gcY], FALSE); - debug.OutString (szLine, FALSE); - } - debug.OutString (gdata[gcY], FALSE); - - gx = x; gy = y; gcX = cX; gcY = cY; - return 0; - } - break; - - default: - break; - } - - return (DefWindowProc(hWnd, message, wParam, lParam)); -} - - -/*** cxAvgWidth - Returns the average width of the chars in Arial/8point. - * - * ENTRY: none - * - * EXIT: ushort pels - * - * ERROR: returns 8 - * - */ - -ushort cxAvgWidth (void) -{ - HFONT hfnt, hfntOld = NULL; - LOGFONT lf; - TEXTMETRIC tm; - HDC hdc; - - - hdc = GetDC( GetDesktopWindow() ); - - memset (&lf, 0, sizeof(lf)); - lf.lfHeight = -MulDiv (8, GetDeviceCaps(hdc, LOGPIXELSY), 72); - strcpy (lf.lfFaceName, "Arial"); - - if ((hfnt = CreateFontIndirect(&lf)) != NULL) - { - hfntOld = (HFONT)SelectObject(hdc, hfnt); - } - - if (! GetTextMetrics (hdc, &tm)) - return 8; - - if (hfntOld != NULL) - { - SelectObject (hdc, hfntOld); - DeleteObject (hfnt); - } - - ReleaseDC (GetDesktopWindow(), hdc); - - return (ushort)tm.tmAveCharWidth; -} - - -/* - * LOG ROUTINES - * - */ - -#define LONG_TYPE 0x0001 -#define SHORT_TYPE 0x0002 -#define INT_TYPE 0x0004 -#define CHAR_TYPE 0x0008 -#define STRING_TYPE 0x0010 -#define FLOAT_TYPE 0x0020 -#define COMMA_TYPE 0x0040 -#define MSG_TYPE 0x0080 - -cdecl LogOut::LogOut (char *psz, ...) -{ - char *pch; - ushort n; - BOOL fBreak; - va_list arg; - va_start (arg, psz); - - strcpy (pszFormat, psz); - nArgs = 0; - - for (pch = psz; *pch; pch++) - { - if (*pch != '%') - continue; - - n = 0; - fBreak = FALSE; - - while (!fBreak) - { - if (!* (++pch)) - break; - - switch (*pch) - { - case 'F': n |= LONG_TYPE; break; - case 'l': n |= LONG_TYPE; break; - case 'h': n |= SHORT_TYPE; break; - case 'X': n |= INT_TYPE; break; - case 'x': n |= INT_TYPE; break; - case 'O': n |= INT_TYPE; break; - case 'o': n |= INT_TYPE; break; - case 'd': n |= INT_TYPE; break; - case 'u': n |= INT_TYPE; break; - case 'c': n |= CHAR_TYPE; break; - case 's': n |= STRING_TYPE; break; - default: fBreak = TRUE; break; - } - } - - if (nArgs == MAX_ARGS) - break; - - aPtr[nArgs] = va_arg (arg, char *); - - nArgs++; - - if (! *pch) - break; - } -} - -LogOut::~LogOut (void) -{ - char tmpfmt[ 64 ]; - char text[ 256 ]; - char *pszOut; - char *pszTmpFmt; - char *pszFmt; - char *pch; - ushort i = 0; - ushort n; - BOOL fBreak; - - pszOut = text; - - for (pszFmt = pszFormat; *pszFmt; pszFmt++) - { - if (*pszFmt != '%') - { - *pszOut++ = *pszFmt; - continue; - } - - n = 0; - fBreak = FALSE; - - for (pszTmpFmt = tmpfmt; !fBreak; ) - { - *pszTmpFmt++ = *pszFmt; - - if (!* (++pszFmt)) - break; - - switch (*pszFmt) - { - case 'F': n |= LONG_TYPE; break; // (far) - case 'l': n |= LONG_TYPE; break; - case 'h': n |= SHORT_TYPE; break; - case 'X': n |= INT_TYPE; break; - case 'x': n |= INT_TYPE; break; - case 'O': n |= INT_TYPE; break; - case 'o': n |= INT_TYPE; break; - case 'd': n |= INT_TYPE; break; - case 'u': n |= INT_TYPE; break; - case 'c': n |= CHAR_TYPE; break; - case 's': n |= STRING_TYPE; break; - default: fBreak = TRUE; break; - } - } - - *pszTmpFmt = 0; - - pch = aPtr[ i ]; - i++; - - - if (n & STRING_TYPE) - { - wsprintf (pszOut, tmpfmt, (char far *)pch); - } - else if (n & LONG_TYPE) - wsprintf (pszOut, tmpfmt, *(long *)pch); - else if (n & SHORT_TYPE) - wsprintf (pszOut, tmpfmt, *(short *)pch); - else if (n & INT_TYPE) - wsprintf (pszOut, tmpfmt, *(int *)pch); - else if (n & CHAR_TYPE) - wsprintf (pszOut, tmpfmt, (char)*(char *)pch); - else - *pszOut = 0; - - pszOut = &pszOut[ strlen(pszOut) ]; - - if (! *pszFmt) - break; - } - - *pszOut = 0; - - debug << text << "\n"; -} - -#endif // DEBUG diff --git a/src/WINNT/afsclass/c_debug.h b/src/WINNT/afsclass/c_debug.h deleted file mode 100644 index ef1ee9b46..000000000 --- a/src/WINNT/afsclass/c_debug.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef DEBUG_H -#define DEBUG_H - -#include - -#ifndef DEBUG // building retail? - -#ifndef ASSERT -#define ASSERT(b) ((b) ? TRUE : FALSE) // take failure paths if retail asserts -#endif - -#else // building debug? - -#ifndef ASSERT -#define ASSERT(b) AssertFn(b, #b, __LINE__, __FILE__) -#endif - -#include - - - typedef unsigned char uchar; - typedef unsigned short ushort; - -#define ANGLES_ON "[AnglesOn]" -#define ANGLES_OFF "[AnglesOff]" -#define LASTERROR "[LastError]" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define minX 2 -#define minY 2 - -#define yMAX 60 -#define xMAX 300 - - -/* - * TYPEDEFS ___________________________________________________________________ - * - */ - - - class Debugstr - { - public: - - Debugstr & operator<< (char *psz); - Debugstr & operator<< (void *psz); - Debugstr & operator<< (long v); - Debugstr & operator<< (size_t v); - Debugstr & operator<< (ushort v); - Debugstr & operator<< (short v); - Debugstr & operator<< (uchar ch); - Debugstr & operator<< (char ch); - Debugstr & operator<< (double f); - Debugstr & operator<< (RECT r); - Debugstr & operator<< (LPIDENT lpi); - - Debugstr (void); - ~Debugstr (void); - - static long APIENTRY DebugWndProc (HWND, UINT, WPARAM, LPARAM); - - void OutString (char *str, BOOL fRecord); - - private: - - HBRUSH brBack; - HFONT hfNew; - TEXTMETRIC tm; - - static void Register (void); - static void Initialize (void); - void Output (HDC hdc, char *str, BOOL fRecord); - - static int fRegistered; - static BOOL fInit; - static HWND hwnd; - - static ushort gx, gcX; - static ushort gy, gcY; - static char gdata[ yMAX ][ xMAX ]; - - static BOOL fAngles; - }; - - -#define MAX_ARGS 10 - - class LogOut - { - public: - - cdecl LogOut (char *format, ...); - ~LogOut (void); - - private: - char pszFormat[ 256 ]; - - char *aPtr[ MAX_ARGS ]; - ushort nArgs; - }; - - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - extern Debugstr debug; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - extern int AssertFn (int, char *, int, char *); - - -#endif // DEBUG - -#endif // DEBUG_H - diff --git a/src/WINNT/afsclass/c_grp.cpp b/src/WINNT/afsclass/c_grp.cpp deleted file mode 100644 index 44a04b141..000000000 --- a/src/WINNT/afsclass/c_grp.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define PTSGROUPACCESS_TO_ACCOUNTACCESS(_ga) \ - ( ((_ga) == PTS_GROUP_OWNER_ACCESS) ? aaOWNER_ONLY : \ - ((_ga) == PTS_GROUP_ACCESS) ? aaGROUP_ONLY : aaANYONE ) - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -PTSGROUP::PTSGROUP (LPCELL lpCellParent, LPTSTR pszGroup) -{ - m_lpiCell = lpCellParent->GetIdentifier(); - lstrcpy (m_szName, pszGroup); - - m_lpiThis = NULL; - m_fStatusOutOfDate = TRUE; - m_mszMembers = NULL; - m_mszMemberOf = NULL; - m_mszOwnerOf = NULL; - memset(&m_gs, 0, sizeof(m_gs)); -} - - -PTSGROUP::~PTSGROUP (void) -{ - if (m_lpiThis) - m_lpiThis->m_cRef --; - - FreeString (m_mszMembers); - FreeString (m_mszMemberOf); - FreeString (m_mszOwnerOf); -} - - -void PTSGROUP::SendDeleteNotifications (void) -{ - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier()); -} - - -void PTSGROUP::Close (void) -{ - AfsClass_Leave(); -} - - -LPIDENT PTSGROUP::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - if ((m_lpiThis = IDENT::FindIdent (this)) == NULL) - m_lpiThis = New2 (IDENT,(this)); - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -void PTSGROUP::Invalidate (void) -{ - m_fStatusOutOfDate = TRUE; -} - - -LPCELL PTSGROUP::OpenCell (ULONG *pStatus) -{ - return m_lpiCell->OpenCell (pStatus); -} - - -void PTSGROUP::GetName (LPTSTR pszGroup) -{ - if (pszGroup) - lstrcpy (pszGroup, m_szName); -} - - -BOOL PTSGROUP::GetStatus (LPPTSGROUPSTATUS lpgs, BOOL fNotify, ULONG *pStatus) -{ - if (!RefreshStatus (fNotify, pStatus)) - return FALSE; - - memcpy (lpgs, &m_gs, sizeof(PTSGROUPSTATUS)); - return TRUE; -} - - -PVOID PTSGROUP::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void PTSGROUP::SetUserParam (PVOID pUserParam) -{ - GetIdentifier()->SetUserParam (pUserParam); -} - - -BOOL PTSGROUP::GetMembers (LPTSTR *ppmsz, ULONG *pStatus) -{ - if (!RefreshStatus (TRUE, pStatus)) - return FALSE; - *ppmsz = CloneMultiString (m_mszMembers); - return TRUE; -} - - -BOOL PTSGROUP::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus) -{ - if (!RefreshStatus (TRUE, pStatus)) - return FALSE; - *ppmsz = CloneMultiString (m_mszMemberOf); - return TRUE; -} - - -BOOL PTSGROUP::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus) -{ - if (!RefreshStatus (TRUE, pStatus)) - return FALSE; - *ppmsz = CloneMultiString (m_mszOwnerOf); - return TRUE; -} - - -void PTSGROUP::ChangeIdentName (LPTSTR pszNewName) -{ - LPIDENT lpi; - if ((lpi = GetIdentifier()) != NULL) - { - lstrcpy (lpi->m_szAccount, pszNewName); - lpi->Update(); - } - lstrcpy (m_szName, pszNewName); - - LPCELL lpCell; - if ((lpCell = OpenCell()) != NULL) - { - lpCell->m_lGroups->Update(this); - lpCell->Close(); - } -} - - -BOOL PTSGROUP::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fStatusOutOfDate) - { - m_fStatusOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - memset (&m_gs, 0x00, sizeof(m_gs)); - - FreeString (m_mszOwnerOf); - m_mszOwnerOf = NULL; - - FreeString (m_mszMemberOf); - m_mszMemberOf = NULL; - - FreeString (m_mszMembers); - m_mszMembers = NULL; - - LPCELL lpCell; - if ((lpCell = OpenCell (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wpGet; - wpGet.wpPtsGroupGet.hCell = hCell; - wpGet.wpPtsGroupGet.pszGroup = m_szName; - if (!Worker_DoTask (wtaskPtsGroupGet, &wpGet, &status)) - rc = FALSE; - else - { - m_gs.nMembers = wpGet.wpPtsGroupGet.Entry.membershipCount; - m_gs.uidName = wpGet.wpPtsGroupGet.Entry.nameUid; - m_gs.uidOwner = wpGet.wpPtsGroupGet.Entry.ownerUid; - m_gs.uidCreator = wpGet.wpPtsGroupGet.Entry.creatorUid; - - m_gs.aaListStatus = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listStatus); - m_gs.aaListGroupsOwned = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listGroupsOwned); - m_gs.aaListMembers = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listMembership); - m_gs.aaAddMember = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listAdd); - m_gs.aaDeleteMember = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listDelete); - CopyAnsiToString (m_gs.szOwner, wpGet.wpPtsGroupGet.Entry.owner); - CopyAnsiToString (m_gs.szCreator, wpGet.wpPtsGroupGet.Entry.creator); - } - - // Grab the list of users which belong to this group - // - WORKERPACKET wpBegin; - wpBegin.wpPtsGroupMemberListBegin.hCell = hCell; - wpBegin.wpPtsGroupMemberListBegin.pszGroup = m_szName; - if (Worker_DoTask (wtaskPtsGroupMemberListBegin, &wpBegin, &status)) - { - for (;;) - { - TCHAR szMember[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpPtsGroupMemberListNext.hEnum = wpBegin.wpPtsGroupMemberListBegin.hEnum; - wpNext.wpPtsGroupMemberListNext.pszMember = szMember; - if (!Worker_DoTask (wtaskPtsGroupMemberListNext, &wpNext)) - break; - - FormatMultiString (&m_mszMembers, FALSE, TEXT("%1"), TEXT("%s"), szMember); - } - - WORKERPACKET wpDone; - wpDone.wpPtsGroupMemberListDone.hEnum = wpBegin.wpPtsGroupMemberListBegin.hEnum; - Worker_DoTask (wtaskPtsGroupMemberListDone, &wpDone); - } - - // Grab the list of groups which this group owns - // - wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell; - wpBegin.wpPtsOwnedGroupListBegin.pszOwner = m_szName; - if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status)) - { - for (;;) - { - TCHAR szGroup[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum; - wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup; - if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext)) - break; - - FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup); - } - - WORKERPACKET wpDone; - wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum; - Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone); - } - - // Grab the list of groups to which this group belongs - // - wpBegin.wpPtsUserMemberListBegin.hCell = hCell; - wpBegin.wpPtsUserMemberListBegin.pszUser = m_szName; - if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status)) - { - for (;;) - { - TCHAR szGroup[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum; - wpNext.wpPtsUserMemberListNext.pszGroup = szGroup; - if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext)) - break; - - FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup); - } - - WORKERPACKET wpDone; - wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum; - Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone); - } - } - - lpCell->Close(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - diff --git a/src/WINNT/afsclass/c_grp.h b/src/WINNT/afsclass/c_grp.h deleted file mode 100644 index 0fd4257d1..000000000 --- a/src/WINNT/afsclass/c_grp.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_GROUP_H -#define AFSCLASS_GROUP_H - -#include - - -/* - * PTSGROUP CLASS _____________________________________________________________ - * - */ - -typedef struct PTSGROUPSTATUS - { - int nMembers; - int uidName; - int uidOwner; - int uidCreator; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaListGroupsOwned; - ACCOUNTACCESS aaListMembers; - ACCOUNTACCESS aaAddMember; - ACCOUNTACCESS aaDeleteMember; - TCHAR szOwner[ cchNAME ]; - TCHAR szCreator[ cchNAME ]; - } PTSGROUPSTATUS, *LPPTSGROUPSTATUS; - - -class PTSGROUP - { - friend class CELL; - friend class IDENT; - friend class USER; - - public: - void Close (void); - void Invalidate (void); - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - - // User properties - // - LPIDENT GetIdentifier (void); - LPCELL OpenCell (ULONG *pStatus = NULL); - void GetName (LPTSTR pszGroup); - - BOOL GetStatus (LPPTSGROUPSTATUS lpgs, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - // Users and Groups - // - BOOL GetMembers (LPTSTR *ppmsz, ULONG *pStatus = NULL); - BOOL GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus = NULL); - BOOL GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus = NULL); - - private: - PTSGROUP (LPCELL lpCellParent, LPTSTR pszGroup); - ~PTSGROUP (void); - void SendDeleteNotifications (void); - - private: - LPIDENT m_lpiCell; - TCHAR m_szName[ cchNAME ]; - - LPIDENT m_lpiThis; - - BOOL m_fStatusOutOfDate; - PTSGROUPSTATUS m_gs; - - LPTSTR m_mszMembers; - LPTSTR m_mszMemberOf; - LPTSTR m_mszOwnerOf; - - public: - // (used internally) - void PTSGROUP::ChangeIdentName (LPTSTR pszNewName); - }; - - -#endif // AFSCLASS_GROUP_H - diff --git a/src/WINNT/afsclass/c_ident.cpp b/src/WINNT/afsclass/c_ident.cpp deleted file mode 100644 index 8c4945e23..000000000 --- a/src/WINNT/afsclass/c_ident.cpp +++ /dev/null @@ -1,1090 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -LPHASHLIST IDENT::x_lIdents = NULL; -LPHASHLISTKEY IDENT::x_lkTypeServer = NULL; -LPHASHLISTKEY IDENT::x_lkFilesetID = NULL; -LPHASHLISTKEY IDENT::x_lkFilesetName = NULL; -LPHASHLISTKEY IDENT::x_lkAccountName = NULL; - - - -/* - * CONSTRUCTION AND LIST MANAGEMENT ___________________________________________ - * - */ - -void IDENT::InitClass (void) -{ - if (x_lIdents == NULL) - { - x_lIdents = New (HASHLIST); - x_lkTypeServer = x_lIdents->CreateKey ("Type and Server", IDENT::KeyTypeServer_Compare, IDENT::KeyTypeServer_HashObject, IDENT::KeyTypeServer_HashData); - x_lkFilesetID = x_lIdents->CreateKey ("Fileset ID", IDENT::KeyFilesetID_Compare, IDENT::KeyFilesetID_HashObject, IDENT::KeyFilesetID_HashData); - x_lkFilesetName = x_lIdents->CreateKey ("Fileset Name", IDENT::KeyFilesetName_Compare, IDENT::KeyFilesetName_HashObject, IDENT::KeyFilesetName_HashData); - x_lkAccountName = x_lIdents->CreateKey ("Account Name", IDENT::KeyAccountName_Compare, IDENT::KeyAccountName_HashObject, IDENT::KeyAccountName_HashData); - } -} - -void IDENT::InitIdent (void) -{ - InitClass(); - m_iType = itUNUSED; - m_szCell[0] = TEXT('\0'); - m_szServer[0] = TEXT('\0'); - m_szService[0] = TEXT('\0'); - m_szAggregate[0] = TEXT('\0'); - m_szFileset[0] = TEXT('\0'); - m_szAccount[0] = TEXT('\0'); - m_szInstance[0] = TEXT('\0'); - memset (&m_vidFileset, 0x00, sizeof(m_vidFileset)); - m_pUser = NULL; - m_cRef = 0; -} - -IDENT::~IDENT (void) -{ - x_lIdents->Remove (this); - InitIdent(); -} - -void IDENT::RemoveIdentsInCell (LPIDENT lpiCell) -{ - InitClass(); - for (LPENUM pEnum = x_lIdents->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPIDENT lpi = (LPIDENT)( pEnum->GetObject() ); - - if (!lstrcmpi (lpi->m_szCell, lpiCell->m_szCell)) - Delete (lpi); - } -} - -void IDENT::Update (void) -{ - x_lIdents->Update (this); -} - - -/* - * ENUMERATION ________________________________________________________________ - * - */ - -LPIDENT IDENT::FindFirst (HENUM *phEnum) -{ - InitClass(); - - if ((*phEnum = x_lIdents->FindFirst()) == NULL) - return NULL; - - return (LPIDENT)( (*phEnum)->GetObject() ); -} - - -LPIDENT IDENT::FindFirst (HENUM *phEnum, VOLUMEID *pvidFileset) -{ - InitClass(); - - if ((*phEnum = x_lkFilesetID->FindFirst(pvidFileset)) == NULL) - return NULL; - - LPIDENT lpiFound; - while ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) != NULL) - { - if (lpiFound->m_iType == itFILESET) - return lpiFound; - - if ((*phEnum = (*phEnum)->FindNext()) == NULL) - break; - } - - return NULL; -} - -LPIDENT IDENT::FindNext (HENUM *phEnum) -{ - if (*phEnum == NULL) - return NULL; - - for (;;) - { - if ((*phEnum = (*phEnum)->FindNext()) == NULL) - break; - - LPIDENT lpiFound; - if ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) == NULL) - break; - - if (lpiFound->m_iType == itFILESET) - return lpiFound; - } - - return NULL; -} - -void IDENT::FindClose (HENUM *phEnum) -{ - if (*phEnum != NULL) - { - Delete (*phEnum); - (*phEnum) = NULL; - } -} - - -/* - * CELL IDENT _________________________________________________________________ - * - */ - -IDENT::IDENT (LPCELL lpCell) -{ - InitIdent(); - - if (ASSERT( lpCell != NULL )) - { - m_iType = itCELL; - lpCell->GetName (m_szCell); - x_lIdents->Add (this); - } -} - -BOOL IDENT::fIsCell (void) -{ - return (m_iType == itCELL) ? TRUE : FALSE; -} - -LPCELL IDENT::OpenCell (ULONG *pStatus) -{ - if (!ASSERT( m_iType != itUNUSED )) - return NULL; - - return CELL::ReopenCell (m_szCell, pStatus); -} - -LPIDENT IDENT::GetCell (void) -{ - if (!ASSERT( m_iType != itUNUSED )) - return NULL; - if (m_iType == itCELL) - return this; - - return FindIdent (itCELL, m_szCell, NULL, NULL, NULL, NULL, NULL); -} - -void IDENT::GetCellName (LPTSTR pszName) -{ - if (!ASSERT( m_iType != itUNUSED )) - { - *pszName = 0; - return; - } - - lstrcpy (pszName, m_szCell); -} - - -/* - * USER IDENT _________________________________________________________________ - * - */ - -IDENT::IDENT (LPUSER lpUser) -{ - InitIdent(); - - if (ASSERT( lpUser != NULL )) - { - m_iType = itUSER; - lstrcpy (m_szCell, lpUser->m_lpiCell->m_szCell); - lpUser->GetName (m_szAccount, m_szInstance); - x_lIdents->Add (this); - } -} - -BOOL IDENT::fIsUser (void) -{ - return (m_iType == itUSER) ? TRUE : FALSE; -} - -LPUSER IDENT::OpenUser (ULONG *pStatus) -{ - LPUSER lpUser = NULL; - - if (!ASSERT( m_iType == itUSER )) - return NULL; - - LPCELL lpCell; - if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL) - { - lpUser = lpCell->OpenUser (m_szAccount, m_szInstance, pStatus); - lpCell->Close(); - } - - return lpUser; -} - -LPIDENT IDENT::GetUser (void) -{ - if (!ASSERT( m_iType == itUSER )) - return NULL; - return this; -} - - -void IDENT::GetUserName (LPTSTR pszName, LPTSTR pszInstance) -{ - if (!ASSERT( m_iType == itUSER )) - { - *pszName = 0; - if (pszInstance) - *pszInstance = 0; - return; - } - - lstrcpy (pszName, m_szAccount); - if (pszInstance) - lstrcpy (pszInstance, m_szInstance); -} - - -void IDENT::GetFullUserName (LPTSTR pszFullName) -{ - if (!ASSERT( m_iType == itUSER )) - { - *pszFullName = 0; - return; - } - - AfsClass_GenFullUserName (pszFullName, m_szAccount, m_szInstance); -} - - -/* - * GROUP IDENT ________________________________________________________________ - * - */ - -IDENT::IDENT (LPPTSGROUP lpGroup) -{ - InitIdent(); - - if (ASSERT( lpGroup != NULL )) - { - m_iType = itGROUP; - lstrcpy (m_szCell, lpGroup->m_lpiCell->m_szCell); - lpGroup->GetName (m_szAccount); - x_lIdents->Add (this); - } -} - -BOOL IDENT::fIsGroup (void) -{ - return (m_iType == itGROUP) ? TRUE : FALSE; -} - -LPPTSGROUP IDENT::OpenGroup (ULONG *pStatus) -{ - LPPTSGROUP lpGroup = NULL; - - if (!ASSERT( m_iType == itGROUP )) - return NULL; - - LPCELL lpCell; - if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL) - { - lpGroup = lpCell->OpenGroup (m_szAccount, pStatus); - lpCell->Close(); - } - - return lpGroup; -} - -LPIDENT IDENT::GetGroup (void) -{ - if (!ASSERT( m_iType == itGROUP )) - return NULL; - return this; -} - - -void IDENT::GetGroupName (LPTSTR pszName) -{ - if (!ASSERT( m_iType == itGROUP )) - { - *pszName = 0; - return; - } - - lstrcpy (pszName, m_szAccount); -} - - -/* - * SERVER IDENT _______________________________________________________________ - * - */ - -IDENT::IDENT (LPSERVER lpServer) -{ - InitIdent(); - - if (ASSERT( lpServer != NULL )) - { - m_iType = itSERVER; - lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell); - lpServer->GetLongName (m_szServer); - x_lIdents->Add (this); - } -} - -BOOL IDENT::fIsServer (void) -{ - return (m_iType == itSERVER) ? TRUE : FALSE; -} - -LPSERVER IDENT::OpenServer (ULONG *pStatus) -{ - LPSERVER lpServer = NULL; - - if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL )) - return NULL; - - LPCELL lpCell; - if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL) - { - lpServer = lpCell->OpenServer (m_szServer, pStatus); - lpCell->Close(); - } - - return lpServer; -} - -LPIDENT IDENT::GetServer (void) -{ - if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL )) - return NULL; - if (m_iType == itSERVER) - return this; - - return FindIdent (itSERVER, m_szCell, m_szServer, NULL, NULL, NULL, NULL); -} - -void IDENT::GetLongServerName (LPTSTR pszName) -{ - if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL )) - { - *pszName = 0; - return; - } - - lstrcpy (pszName, m_szServer); -} - -void IDENT::GetShortServerName (LPTSTR pszName) -{ - if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL )) - { - *pszName = 0; - return; - } - - SERVER::ShortenName (pszName, m_szServer, TRUE); -} - -void IDENT::GetServerName (LPTSTR pszName) -{ - if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL )) - { - *pszName = 0; - return; - } - - SERVER::ShortenName (pszName, m_szServer); -} - - -/* - * SERVICE IDENT ______________________________________________________________ - * - */ - -IDENT::IDENT (LPSERVICE lpService) -{ - InitIdent(); - - if (ASSERT( lpService != NULL )) - { - LPSERVER lpServer; - if ((lpServer = lpService->OpenServer()) != NULL) - { - m_iType = itSERVICE; - lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell); - lpServer->GetLongName (m_szServer); - lpService->GetName (m_szService); - x_lIdents->Add (this); - lpServer->Close(); - } - } -} - -BOOL IDENT::fIsService (void) -{ - return (m_iType == itSERVICE) ? TRUE : FALSE; -} - -LPSERVICE IDENT::OpenService (ULONG *pStatus) -{ - LPSERVICE lpService = NULL; - - if (!ASSERT( fIsService() )) - return NULL; - - LPCELL lpCell; - if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL) - { - LPSERVER lpServer; - if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL) - { - lpService = lpServer->OpenService (m_szService, pStatus); - lpServer->Close(); - } - lpCell->Close(); - } - - return lpService; -} - -LPIDENT IDENT::GetService (void) -{ - if (!ASSERT( fIsService() )) - return NULL; - return this; -} - -void IDENT::GetServiceName (LPTSTR pszName) -{ - if (!ASSERT( fIsService() )) - { - *pszName = 0; - return; - } - - lstrcpy (pszName, m_szService); -} - - -/* - * AGGREGATE IDENT ____________________________________________________________ - * - */ - -IDENT::IDENT (LPAGGREGATE lpAggregate) -{ - InitIdent(); - - if (ASSERT( lpAggregate != NULL )) - { - LPSERVER lpServer; - if ((lpServer = lpAggregate->OpenServer()) != NULL) - { - m_iType = itAGGREGATE; - lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell); - lpServer->GetLongName (m_szServer); - lpAggregate->GetName (m_szAggregate); - x_lIdents->Add (this); - lpServer->Close(); - } - } -} - -BOOL IDENT::fIsAggregate (void) -{ - return (m_iType == itAGGREGATE) ? TRUE : FALSE; -} - -LPAGGREGATE IDENT::OpenAggregate (ULONG *pStatus) -{ - LPAGGREGATE lpAggregate = NULL; - - if (!ASSERT( fIsAggregate() || fIsFileset() )) - return NULL; - - LPCELL lpCell; - if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL) - { - LPSERVER lpServer; - if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL) - { - lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus); - lpServer->Close(); - } - lpCell->Close(); - } - - return lpAggregate; -} - -LPIDENT IDENT::GetAggregate (void) -{ - if (!ASSERT( fIsAggregate() || fIsFileset() )) - return NULL; - if (m_iType == itAGGREGATE) - return this; - - return FindIdent (itAGGREGATE, m_szCell, m_szServer, NULL, m_szAggregate, NULL, NULL); -} - -void IDENT::GetAggregateName (LPTSTR pszName) -{ - if (!ASSERT( fIsAggregate() || fIsFileset() )) - { - *pszName = 0; - return; - } - - lstrcpy (pszName, m_szAggregate); -} - - -/* - * FILESET IDENT ______________________________________________________________ - * - */ - -IDENT::IDENT (LPFILESET lpFileset) -{ - InitIdent(); - - if (ASSERT( lpFileset != NULL )) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpFileset->OpenAggregate()) != NULL) - { - LPSERVER lpServer; - if ((lpServer = lpAggregate->OpenServer()) != NULL) - { - m_iType = itFILESET; - lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell); - lpServer->GetLongName (m_szServer); - lpAggregate->GetName (m_szAggregate); - lpFileset->GetName (m_szFileset); - lpFileset->GetID (&m_vidFileset); - x_lIdents->Add (this); - lpServer->Close(); - } - lpAggregate->Close(); - } - } -} - -BOOL IDENT::fIsFileset (void) -{ - return (m_iType == itFILESET) ? TRUE : FALSE; -} - -LPFILESET IDENT::OpenFileset (ULONG *pStatus) -{ - LPFILESET lpFileset = NULL; - - if (!ASSERT( fIsFileset() )) - return NULL; - - LPCELL lpCell; - if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL) - { - LPSERVER lpServer; - if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus)) != NULL) - { - lpFileset = lpAggregate->OpenFileset (&m_vidFileset, pStatus); - lpAggregate->Close(); - } - lpServer->Close(); - } - lpCell->Close(); - } - - return lpFileset; -} - -LPIDENT IDENT::GetFileset (void) -{ - if (!ASSERT( fIsFileset() )) - return NULL; - return this; -} - -void IDENT::GetFilesetName (LPTSTR pszName) -{ - if (!ASSERT( fIsFileset() )) - { - *pszName = 0; - return; - } - - lstrcpy (pszName, m_szFileset); -} - -void IDENT::GetFilesetID (VOLUMEID *pvidFileset) -{ - if (!ASSERT( fIsFileset() )) - { - memset (pvidFileset, 0x00, sizeof(VOLUMEID)); - return; - } - - memcpy (pvidFileset, &m_vidFileset, sizeof(VOLUMEID)); -} - - -/* - * NON- TYPE-SPECIFIC ROUTINES ________________________________________________ - * - */ - -IDENTTYPE IDENT::GetType (void) -{ - return m_iType; -} - -PVOID IDENT::GetUserParam (void) -{ - return m_pUser; -} - -void IDENT::SetUserParam (PVOID pUser) -{ - m_pUser = pUser; -} - -size_t IDENT::GetRefCount (void) -{ - return m_cRef; -} - - -/* - * HASH KEYS __________________________________________________________________ - * - * A list of all IDENT objects is maintained using a HashList, which has two - * index keys: one on [type+servername], and another on [filesetid]. - * - */ - -typedef struct - { - IDENTTYPE iType; - LPCTSTR pszServer; - } KeyTypeServer; - -BOOL CALLBACK IDENT::KeyTypeServer_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - if (((LPIDENT)pObject)->m_iType != ((KeyTypeServer*)pData)->iType) - return FALSE; - if (lstrcmp (((LPIDENT)pObject)->m_szServer, ((KeyTypeServer*)pData)->pszServer)) - return FALSE; - return TRUE; -} - -HASHVALUE CALLBACK IDENT::KeyTypeServer_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - KeyTypeServer kts; - kts.iType = ((LPIDENT)pObject)->m_iType; - kts.pszServer = ((LPIDENT)pObject)->m_szServer; - return IDENT::KeyTypeServer_HashData (pKey, &kts); -} - -HASHVALUE CALLBACK IDENT::KeyTypeServer_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HashString( ((KeyTypeServer*)pData)->pszServer ) + ((KeyTypeServer*)pData)->iType); -} - - -BOOL CALLBACK IDENT::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !memcmp (&((LPIDENT)pObject)->m_vidFileset, (VOLUMEID*)pData, sizeof(VOLUMEID)); -} - -HASHVALUE CALLBACK IDENT::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return IDENT::KeyFilesetID_HashData (pKey, &((LPIDENT)pObject)->m_vidFileset); -} - -HASHVALUE CALLBACK IDENT::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)(*((VOLUMEID*)pData)); -} - - -BOOL CALLBACK IDENT::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmpi (((LPIDENT)pObject)->m_szFileset, (LPTSTR)pData); -} - -HASHVALUE CALLBACK IDENT::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return IDENT::KeyFilesetName_HashData (pKey, &((LPIDENT)pObject)->m_szFileset); -} - -HASHVALUE CALLBACK IDENT::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - - -BOOL CALLBACK IDENT::KeyAccountName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmpi (((LPIDENT)pObject)->m_szAccount, (LPTSTR)pData); -} - -HASHVALUE CALLBACK IDENT::KeyAccountName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return IDENT::KeyAccountName_HashData (pKey, &((LPIDENT)pObject)->m_szAccount); -} - -HASHVALUE CALLBACK IDENT::KeyAccountName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - - -/* - * SEARCHING __________________________________________________________________ - * - */ - -LPIDENT IDENT::FindIdent (LPCELL lpCell) -{ - TCHAR szCell[ cchNAME ]; - lpCell->GetName (szCell); - return FindIdent (itCELL, szCell, NULL, NULL, NULL, NULL, NULL); -} - -LPIDENT IDENT::FindIdent (LPUSER lpUser) -{ - TCHAR szCell[ cchNAME ]; - TCHAR szAccount[ cchNAME ]; - TCHAR szInstance[ cchNAME ]; - lpUser->m_lpiCell->GetCellName (szCell); - lpUser->GetName (szAccount, szInstance); - return FindIdent (itUSER, szCell, szAccount, szInstance); -} - -LPIDENT IDENT::FindIdent (LPPTSGROUP lpGroup) -{ - TCHAR szCell[ cchNAME ]; - TCHAR szAccount[ cchNAME ]; - lpGroup->m_lpiCell->GetCellName (szCell); - lpGroup->GetName (szAccount); - return FindIdent (itGROUP, szCell, szAccount, NULL); -} - -LPIDENT IDENT::FindIdent (LPSERVER lpServer) -{ - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - lpServer->m_lpiCell->GetCellName (szCell); - lpServer->GetLongName (szServer); - return FindIdent (itSERVER, szCell, szServer, NULL, NULL, NULL, NULL); -} - -LPIDENT IDENT::FindIdent (LPSERVICE lpService) -{ - LPIDENT lpi = NULL; - - LPSERVER lpServer; - if ((lpServer = lpService->OpenServer()) != NULL) - { - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szService[ cchNAME ]; - lpServer->m_lpiCell->GetCellName (szCell); - lpServer->GetLongName (szServer); - lpService->GetName (szService); - - lpi = FindIdent (itSERVICE, szCell, szServer, szService, NULL, NULL, NULL); - - lpServer->Close(); - } - - return lpi; -} - -LPIDENT IDENT::FindIdent (LPAGGREGATE lpAggregate) -{ - LPIDENT lpi = NULL; - - LPSERVER lpServer; - if ((lpServer = lpAggregate->OpenServer()) != NULL) - { - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - lpServer->m_lpiCell->GetCellName (szCell); - lpServer->GetLongName (szServer); - lpAggregate->GetName (szAggregate); - - lpi = FindIdent (itAGGREGATE, szCell, szServer, NULL, szAggregate, NULL, NULL); - - lpServer->Close(); - } - - return lpi; -} - -LPIDENT IDENT::FindIdent (LPFILESET lpFileset) -{ - LPIDENT lpi = NULL; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpFileset->OpenAggregate()) != NULL) - { - LPSERVER lpServer; - if ((lpServer = lpAggregate->OpenServer()) != NULL) - { - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - VOLUMEID vidFileset; - lpServer->m_lpiCell->GetCellName (szCell); - lpServer->GetLongName (szServer); - lpAggregate->GetName (szAggregate); - lpFileset->GetID (&vidFileset); - - lpi = FindIdent (itFILESET, szCell, szServer, NULL, szAggregate, NULL, &vidFileset); - - lpServer->Close(); - } - - lpAggregate->Close(); - } - - return lpi; -} - -LPIDENT IDENT::FindIdent (LPFILESET lpFileset, VOLUMEID *pvid) -{ - TCHAR szCell[ cchNAME ]; - lpFileset->m_lpiCell->GetCellName (szCell); - - // since all read-only replicas of a fileset share the same ID, - // you can't use this routine to search for one. BUT, you can - // use it to look up a read-write or backup regardless of the - // aggregate on which it sits, because there should be only one. - // When FindIdent() realizes we didn't supply an aggregate to - // match against, it will just skip comparing aggregates and - // return the first IDENT it finds which matches the given ID. - // - return FindIdent (itFILESET, szCell, NULL, NULL, NULL, NULL, pvid); -} - - -LPIDENT IDENT::FindServer (LPIDENT lpiCell, LPTSTR pszServer) -{ - TCHAR szCell[ cchNAME ]; - lpiCell->GetCellName (szCell); - - return FindIdent (itSERVER, szCell, pszServer, NULL, NULL, NULL, NULL); -} - - -LPIDENT IDENT::FindAggregate (LPIDENT lpiServer, LPTSTR pszAggregate) -{ - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - lpiServer->GetCellName (szCell); - lpiServer->GetLongServerName (szServer); - - return FindIdent (itAGGREGATE, szCell, szServer, NULL, pszAggregate, NULL, NULL); -} - - -LPIDENT IDENT::FindFileset (LPIDENT lpiParent, LPTSTR pszFileset) -{ - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - - LPTSTR pszServer = NULL; - LPTSTR pszAggregate = NULL; - - lpiParent->GetCellName (szCell); - - if (!lpiParent->fIsCell()) - { - pszServer = szServer; - lpiParent->GetLongServerName (szServer); - } - - if (lpiParent->fIsAggregate()) - { - pszAggregate = szAggregate; - lpiParent->GetAggregateName (szAggregate); - } - - return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, pszFileset, NULL); -} - - -LPIDENT IDENT::FindFileset (LPIDENT lpiParent, VOLUMEID *pvidFileset) -{ - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - - LPTSTR pszServer = NULL; - LPTSTR pszAggregate = NULL; - - lpiParent->GetCellName (szCell); - - if (!lpiParent->fIsCell()) - { - pszServer = szServer; - lpiParent->GetLongServerName (szServer); - } - - if (lpiParent->fIsAggregate()) - { - pszAggregate = szAggregate; - lpiParent->GetAggregateName (szAggregate); - } - - return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, NULL, pvidFileset); -} - - -LPIDENT IDENT::FindUser (LPIDENT lpiCell, LPTSTR pszPrincipal, LPTSTR pszInstance) -{ - return FindIdent (itUSER, lpiCell->m_szCell, pszPrincipal, pszInstance); -} - - -LPIDENT IDENT::FindGroup (LPIDENT lpiCell, LPTSTR pszGroup) -{ - return FindIdent (itGROUP, lpiCell->m_szCell, pszGroup, NULL); -} - - -LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszAccount, LPTSTR pszInstance) -{ - for (LPENUM pEnum = x_lkAccountName->FindFirst (pszAccount); pEnum; pEnum = pEnum->FindNext()) - { - LPIDENT lpiFound = (LPIDENT)( pEnum->GetObject() ); - if (lpiFound->m_iType != iType) - continue; - if (lstrcmpi (pszCell, lpiFound->m_szCell)) - continue; - if (pszInstance && lstrcmpi (pszInstance, lpiFound->m_szInstance)) - continue; - Delete (pEnum); - return lpiFound; - } - return NULL; -} - -LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszServer, LPTSTR pszService, LPTSTR pszAggregate, LPTSTR pszFileset, VOLUMEID *pvidFileset) -{ - InitClass(); - - // Since all IDENTs are maintained in a hashlist, we have several - // possible techniques for finding any given IDENT. For this particular - // hashlist, we have two keys: by type and server, and by volume ID. - // If possible we want to use the latter; otherwise, use the former. - // - if ((iType == itFILESET) && (pvidFileset)) - { - for (LPENUM pEnum = x_lkFilesetID->FindFirst (pvidFileset); pEnum; pEnum = pEnum->FindNext()) - { - // Only volumes which match this fileset ID will get here. - // - LPIDENT lpi = (LPIDENT)( pEnum->GetObject() ); - - if (lpi->m_iType != itFILESET) - continue; - if (pszCell && lstrcmpi (lpi->m_szCell, pszCell)) - continue; - if (pszServer && lstrcmpi (lpi->m_szServer, pszServer)) - continue; - if (pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate)) - continue; - - Delete (pEnum); - return lpi; - } - } - else if ((!pszServer) && (iType != itCELL)) - { - LPTSTR pszFilesetSearch = (pszFileset) ? pszFileset : TEXT(""); - - for (LPENUM pEnum = x_lkFilesetName->FindFirst (pszFilesetSearch); pEnum; pEnum = pEnum->FindNext()) - { - // Only idents which match this fileset name will get here. - // - LPIDENT lpi = (LPIDENT)( pEnum->GetObject() ); - - if (iType != lpi->m_iType) - continue; - if (pszCell && lstrcmpi (lpi->m_szCell, pszCell)) - continue; - if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService)) - continue; - if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate)) - continue; - - Delete (pEnum); - return lpi; - } - } - else // Look up the IDENT based on its type and (optional) server name - { - KeyTypeServer kts; - kts.iType = iType; - kts.pszServer = (pszServer) ? pszServer : TEXT(""); - - for (LPENUM pEnum = x_lkTypeServer->FindFirst (&kts); pEnum; pEnum = pEnum->FindNext()) - { - // Only idents which match this type and server name will get here. - // - LPIDENT lpi = (LPIDENT)( pEnum->GetObject() ); - - if (pszCell && lstrcmpi (lpi->m_szCell, pszCell)) - continue; - if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService)) - continue; - if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate)) - continue; - if ((iType == itFILESET) && pszFileset && lstrcmpi (lpi->m_szFileset, pszFileset)) - continue; - - Delete (pEnum); - return lpi; - } - } - - return NULL; -} - diff --git a/src/WINNT/afsclass/c_ident.h b/src/WINNT/afsclass/c_ident.h deleted file mode 100644 index ca7fd9d23..000000000 --- a/src/WINNT/afsclass/c_ident.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_IDENT_H -#define AFSCLASS_IDENT_H - -#include - - -/* - * IDENTIFIER CLASS ___________________________________________________________ - * - */ - -typedef enum - { - itUNUSED, - itCELL, - itSERVER, - itSERVICE, - itAGGREGATE, - itFILESET, - itUSER, - itGROUP - } IDENTTYPE; - -class IDENT - { - friend class CELL; - friend class SERVER; - friend class SERVICE; - friend class AGGREGATE; - friend class FILESET; - friend class USER; - friend class PTSGROUP; - - public: - IDENTTYPE GetType (void); - BOOL fIsCell (void); - BOOL fIsServer (void); - BOOL fIsService (void); - BOOL fIsAggregate (void); - BOOL fIsFileset (void); - BOOL fIsUser (void); - BOOL fIsGroup (void); - size_t GetRefCount (void); - - LPCELL OpenCell (ULONG *pStatus = NULL); - LPSERVER OpenServer (ULONG *pStatus = NULL); - LPSERVICE OpenService (ULONG *pStatus = NULL); - LPAGGREGATE OpenAggregate (ULONG *pStatus = NULL); - LPFILESET OpenFileset (ULONG *pStatus = NULL); - LPUSER OpenUser (ULONG *pStatus = NULL); - LPPTSGROUP OpenGroup (ULONG *pStatus = NULL); - - LPIDENT GetCell (void); - LPIDENT GetServer (void); - LPIDENT GetService (void); - LPIDENT GetAggregate (void); - LPIDENT GetFileset (void); - LPIDENT GetUser (void); - LPIDENT GetGroup (void); - - void GetCellName (LPTSTR pszName); - void GetLongServerName (LPTSTR pszName); - void GetShortServerName (LPTSTR pszName); - void GetServerName (LPTSTR pszName); - void GetServiceName (LPTSTR pszName); - void GetAggregateName (LPTSTR pszName); - void GetFilesetName (LPTSTR pszName); - void GetFilesetID (VOLUMEID *pvid); - void GetUserName (LPTSTR pszName, LPTSTR pszInstance = NULL); - void GetGroupName (LPTSTR pszPrincipal); - void GetFullUserName (LPTSTR pszFullName); - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - static LPIDENT FindFirst (HENUM *phEnum); - static LPIDENT FindFirst (HENUM *phEnum, VOLUMEID *pvidFileset); - static LPIDENT FindNext (HENUM *phEnum); - static void FindClose (HENUM *phEnum); - - static LPIDENT FindServer (LPIDENT lpiCell, LPTSTR pszServer); - static LPIDENT FindAggregate (LPIDENT lpiServer, LPTSTR pszAggregate); - static LPIDENT FindFileset (LPIDENT lpiParent, LPTSTR pszFileset); - static LPIDENT FindFileset (LPIDENT lpiParent, VOLUMEID *pvidFileset); - static LPIDENT FindUser (LPIDENT lpiCell, LPTSTR pszPrincipal, LPTSTR pszInstance = NULL); - static LPIDENT FindGroup (LPIDENT lpiCell, LPTSTR pszGroup); - - // Private functions - // - private: - void InitIdent (void); - IDENT (LPCELL lpCell); - IDENT (LPSERVER lpServer); - IDENT (LPSERVICE lpSvc); - IDENT (LPAGGREGATE lpAgg); - IDENT (LPFILESET lpSet); - IDENT (LPUSER lpUser); - IDENT (LPPTSGROUP lpGroup); - ~IDENT (void); - void Update (void); - - static void InitClass (void); - static void RemoveIdentsInCell (LPIDENT lpiCell); - static LPIDENT FindIdent (LPCELL lpCell); - static LPIDENT FindIdent (LPSERVER lpServer); - static LPIDENT FindIdent (LPSERVICE lpService); - static LPIDENT FindIdent (LPAGGREGATE lpAggregate); - static LPIDENT FindIdent (LPFILESET lpFileset); - static LPIDENT FindIdent (LPFILESET lpFileset, VOLUMEID *pvid); - static LPIDENT FindIdent (LPUSER lpUser); - static LPIDENT FindIdent (LPPTSGROUP lpGroup); - static LPIDENT FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszServer, LPTSTR pszService, LPTSTR pszAggregate, LPTSTR pszFileset, VOLUMEID *pvidFileset); - static LPIDENT FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszAccount, LPTSTR pszInstance); - - // Private data - // - private: - IDENTTYPE m_iType; - - TCHAR m_szCell[ cchNAME ]; - TCHAR m_szServer[ cchNAME ]; - TCHAR m_szService[ cchNAME ]; - TCHAR m_szAggregate[ cchNAME ]; - TCHAR m_szFileset[ cchNAME ]; - TCHAR m_szAccount[ cchNAME ]; - TCHAR m_szInstance[ cchNAME ]; - VOLUMEID m_vidFileset; - PVOID m_pUser; - size_t m_cRef; - - static LPHASHLIST x_lIdents; - static LPHASHLISTKEY x_lkTypeServer; - static LPHASHLISTKEY x_lkFilesetID; - static LPHASHLISTKEY x_lkFilesetName; - static LPHASHLISTKEY x_lkAccountName; - - static BOOL CALLBACK IDENT::KeyTypeServer_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK IDENT::KeyTypeServer_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK IDENT::KeyTypeServer_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK IDENT::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK IDENT::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK IDENT::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK IDENT::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK IDENT::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK IDENT::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK IDENT::KeyAccountName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK IDENT::KeyAccountName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK IDENT::KeyAccountName_HashData (LPHASHLISTKEY pKey, PVOID pData); - }; - - -#endif // AFSCLASS_IDENT_H - diff --git a/src/WINNT/afsclass/c_identlist.cpp b/src/WINNT/afsclass/c_identlist.cpp deleted file mode 100644 index 6d6184f62..000000000 --- a/src/WINNT/afsclass/c_identlist.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * IDENTLIST CLASS ____________________________________________________________ - * - */ - -IDENTLIST::IDENTLIST (void) -{ - m_lIdents = New (HASHLIST); -} - - -IDENTLIST::~IDENTLIST (void) -{ - if (m_lIdents) - Delete (m_lIdents); - m_lIdents = NULL; -} - - -void IDENTLIST::Add (LPIDENT lpi) -{ - m_lIdents->AddUnique (lpi); -} - - -void IDENTLIST::Remove (LPIDENT lpi) -{ - m_lIdents->Remove (lpi); -} - - -void IDENTLIST::RemoveAll (void) -{ - LPIDENT lpi; - while ((lpi = (LPIDENT)m_lIdents->GetFirstObject()) != NULL) - m_lIdents->Remove (lpi); -} - - -void IDENTLIST::CopyFrom (LPIDENTLIST pil) -{ - RemoveAll(); - - HENUM hEnum; - for (LPIDENT lpi = pil->FindFirst (&hEnum); lpi; lpi = pil->FindNext (&hEnum)) - Add (lpi); -} - - -size_t IDENTLIST::GetCount (void) -{ - return m_lIdents->GetCount(); -} - - -BOOL IDENTLIST::fIsInList (LPIDENT lpi) -{ - return m_lIdents->fIsInList (lpi); -} - - -LPIDENT IDENTLIST::FindFirst (HENUM *phEnum) -{ - LPIDENT lpi = NULL; - if ((*phEnum = m_lIdents->FindFirst()) != NULL) - lpi = (LPIDENT)( (*phEnum)->GetObject() ); - return lpi; -} - - -LPIDENT IDENTLIST::FindNext (HENUM *phEnum) -{ - LPIDENT lpi = NULL; - - if ((*phEnum) && ((*phEnum = (*phEnum)->FindNext()) != NULL)) - lpi = (LPIDENT)( (*phEnum)->GetObject() ); - - return lpi; -} - - -void IDENTLIST::FindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - diff --git a/src/WINNT/afsclass/c_identlist.h b/src/WINNT/afsclass/c_identlist.h deleted file mode 100644 index 93ea3ed10..000000000 --- a/src/WINNT/afsclass/c_identlist.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_IDENTLIST_H -#define AFSCLASS_IDENTLIST_H - -#include - - -/* - * IDENTIFIER-LIST CLASS ______________________________________________________ - * - */ - -class IDENTLIST - { - public: - IDENTLIST (void); - ~IDENTLIST (void); - - void Add (LPIDENT lpi); - void Remove (LPIDENT lpi); - void RemoveAll (void); - void CopyFrom (LPIDENTLIST pil); - - size_t GetCount (void); - BOOL fIsInList (LPIDENT lpi); - - LPIDENT FindFirst (HENUM *phEnum); - LPIDENT FindNext (HENUM *phEnum); - void FindClose (HENUM *phEnum); - - private: - LPHASHLIST m_lIdents; - }; - - -#endif // AFSCLASS_IDENTLIST_H - diff --git a/src/WINNT/afsclass/c_notify.cpp b/src/WINNT/afsclass/c_notify.cpp deleted file mode 100644 index 3de2a3da8..000000000 --- a/src/WINNT/afsclass/c_notify.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_NOTIFY 4 // allocate space for 4 notifies at once - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -size_t NOTIFYCALLBACK::nNotifyList = 0; -LPNOTIFYCALLBACK *NOTIFYCALLBACK::aNotifyList = NULL; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -NOTIFYCALLBACK::NOTIFYCALLBACK (NOTIFYCALLBACKPROC procUser, LPARAM lpUser) -{ - procSupplied = procUser; - lpSupplied = lpUser; - - for (size_t iNotify = 0; iNotify < nNotifyList; ++iNotify) - { - if (aNotifyList[ iNotify ] == NULL) - break; - } - - if (iNotify >= nNotifyList) - { - REALLOC (aNotifyList, nNotifyList, 1+iNotify, cREALLOC_NOTIFY ); - } - - if (iNotify < nNotifyList) - { - aNotifyList[ iNotify ] = this; - } -} - - -NOTIFYCALLBACK::~NOTIFYCALLBACK (void) -{ - for (size_t iNotify = 0; iNotify < nNotifyList; ++iNotify) - { - if (aNotifyList[ iNotify ] == this) - aNotifyList[ iNotify ] = NULL; - } -} - - -BOOL NOTIFYCALLBACK::SendNotificationToAll (NOTIFYEVENT evt, ULONG status) -{ - return SendNotificationToAll (evt, NULL, NULL, NULL, NULL, 0, status); -} - -BOOL NOTIFYCALLBACK::SendNotificationToAll (NOTIFYEVENT evt, LPIDENT lpi1, ULONG status) -{ - return SendNotificationToAll (evt, lpi1, NULL, NULL, NULL, 0, status); -} - -BOOL NOTIFYCALLBACK::SendNotificationToAll (NOTIFYEVENT evt, LPTSTR psz1, ULONG status) -{ - return SendNotificationToAll (evt, NULL, NULL, psz1, NULL, 0, status); -} - -BOOL NOTIFYCALLBACK::SendNotificationToAll (NOTIFYEVENT evt, LPIDENT lpi1, LPTSTR psz1, ULONG status) -{ - return SendNotificationToAll (evt, lpi1, NULL, psz1, NULL, 0, status); -} - -BOOL NOTIFYCALLBACK::SendNotificationToAll (NOTIFYEVENT evt, LPIDENT lpi1, LPIDENT lpi2, LPTSTR psz1, LPTSTR psz2, DWORD dw1, ULONG status) -{ - BOOL rc = TRUE; - - NOTIFYPARAMS Params; - memset (&Params, 0x00, sizeof(Params)); - Params.lpi1 = lpi1; - Params.lpi2 = lpi2; - lstrcpy (Params.sz1, (psz1) ? psz1 : TEXT("")); - lstrcpy (Params.sz2, (psz2) ? psz2 : TEXT("")); - Params.dw1 = dw1; - Params.status = status; - - for (size_t iNotify = 0; iNotify < nNotifyList; ++iNotify) - { - if (aNotifyList[ iNotify ] != NULL) - { - Params.lpUser = aNotifyList[ iNotify ]->lpSupplied; - if (!aNotifyList[ iNotify ]->SendNotification (evt, &Params)) - rc = FALSE; - } - } - - return rc; -} - - -BOOL NOTIFYCALLBACK::SendNotification (NOTIFYEVENT evt, PNOTIFYPARAMS pParams) -{ - BOOL rc = TRUE; - - if (procSupplied != NULL) { - try { - if (!(*procSupplied)( evt, pParams )) - rc = FALSE; - } catch(...) { - // whoops--never trust a callback. -#ifdef DEBUG - DebugBreak(); -#endif - rc = FALSE; - } - } - - return rc; -} - diff --git a/src/WINNT/afsclass/c_notify.h b/src/WINNT/afsclass/c_notify.h deleted file mode 100644 index fc7ab9138..000000000 --- a/src/WINNT/afsclass/c_notify.h +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_NOTIFY_H -#define AFSCLASS_NOTIFY_H - -#include - - -/* - * NOTIFICATION CLASS _________________________________________________________ - * - */ - -typedef enum - { - evtCreate, // lpi1 = new object - evtDestroy, // lpi1 = object to delete - - evtInvalidate, // lpi1 = object invalidated - evtRefreshStatusBegin, // lpi1 = object to refresh - evtRefreshStatusEnd, // lpi1 = object refreshed - evtRefreshServersBegin, // lpi1 = parent cell - evtRefreshServersEnd, // lpi1 = parent cell - evtRefreshServicesBegin, // lpi1 = parent server - evtRefreshServicesEnd, // lpi1 = parent server - evtRefreshAggregatesBegin, // lpi1 = parent server - evtRefreshAggregatesEnd, // lpi1 = parent server - evtRefreshFilesetsBegin, // lpi1 = parent aggregate - evtRefreshFilesetsEnd, // lpi1 = parent aggregate - evtRefreshUsersBegin, // lpi1 = parent cell - evtRefreshUsersEnd, // lpi1 = parent cell - - // For the evtRefreshAll* events, the dw1 parameter accompanying the event - // is an integer percentage complete. - // - evtRefreshAllBegin, // lpi1 = object refreshing - evtRefreshAllUpdate, // lpi1 = object working now - evtRefreshAllSectionStart, // dw2 = section identifier - evtRefreshAllSectionEnd, // dw2 = section identifier - evtRefreshAllEnd, - - // For the evtOpenCell* events, the sz1 parameter accompanying the event - // is a string reflecting the name of the cell being opened. - // - evtOpenCellBegin, // sz1 = pszCellName - evtOpenCellEnd, // sz1 = pszCellName - - // For the evtSyncVldb* events, the lpi1 parameter accompanying the event - // describes the server or aggregate being sync'd. - // - evtSyncVLDBBegin, // lpi1 = server or aggregate - evtSyncVLDBEnd, // lpi1 = server or aggregate - - // For the evtGetServerLogFile events, the sz1 parameter accompanying the - // event is a string describing the filename of the log file to be obtained. - // The lpi1 parameter accompanying the event indicates the server being - // queried. - // - evtGetServerLogFileBegin, // lpi1 = server, sz1 = log name - evtGetServerLogFileEnd, // lpi1 = server, sz1 = log name - - // For the evtInstallFile*, evtUninstallFile*, and evtGetFileDates* events, - // the lpi1 parameter accompanying the event indicates the server where - // the operation is taking place, while the sz1 parameter indicates the - // name of the file being manipulated. - // - evtInstallFileBegin, // lpi1 = server, sz1 = filename - evtInstallFileEnd, // lpi1 = server, sz1 = filename - - evtUninstallFileBegin, // lpi1 = server, sz1 = filename - evtUninstallFileEnd, // lpi1 = server, sz1 = filename - - evtGetFileDatesBegin, // lpi1 = server, sz1 = filename - evtGetFileDatesEnd, // lpi1 = server, sz1 = filename - - // For most other evt*Server* events, the lpi1 parameter accompanying - // the event indicates the server being changed. - // - evtPruneFilesBegin, // lpi1 = server - evtPruneFilesEnd, // lpi1 = server - - evtSetServerAuthBegin, // lpi1 = server - evtSetServerAuthEnd, // lpi1 = server - - evtGetRestartTimesBegin, // lpi1 = server - evtGetRestartTimesEnd, // lpi1 = server - - evtSetRestartTimesBegin, // lpi1 = server - evtSetRestartTimesEnd, // lpi1 = server - - evtChangeAddressBegin, // lpi1 = server - evtChangeAddressEnd, // lpi1 = server - - // For the evtAdminListLoad* events, the lpi1 parameter accompanying the - // event indicates the server from which the admin list is being read. - // - evtAdminListLoadBegin, // lpi1 = server - evtAdminListLoadEnd, // lpi1 = server - - // For most other evtAdminList* events, the lpi1 parameter accompanying - // the event indicates the server being manipulated. - // - evtAdminListSaveBegin, // lpi1 = server - evtAdminListSaveEnd, // lpi1 = server - - // For the evtKeyListLoad* events, the lpi1 parameter accompanying the - // event indicates the server from which the list of keys is being read. - // - evtKeyListLoadBegin, // lpi1 = server - evtKeyListLoadEnd, // lpi1 = server - - // For the evtHostListLoad* events, the lpi1 parameter accompanying the - // event indicates the server from which the host list is being read. - // - evtHostListLoadBegin, // lpi1 = server - evtHostListLoadEnd, // lpi1 = server - - // For most other evtHostList* events, the lpi1 parameter accompanying the - // event indicates the server being manipulated. - // - evtHostListSaveBegin, // lpi1 = server - evtHostListSaveEnd, // lpi1 = server - - // For the evtCreateService events, the lpi1 parameter accompanying the - // event indicates the parent server, while the sz1 parameter indicates - // the name of the service being created. - // - evtCreateServiceBegin, // lpi1 = server, sz1 = service - evtCreateServiceEnd, // lpi1 = server, sz1 = service - - // For most other evt*Service* events, the lpi1 parameter accompanying - // the event describes the service being changed. - // - evtDeleteServiceBegin, // lpi1 = service - evtDeleteServiceEnd, // lpi1 = service - - evtStartServiceBegin, // lpi1 = service - evtStartServiceEnd, // lpi1 = service - - evtStopServiceBegin, // lpi1 = service - evtStopServiceEnd, // lpi1 = service - - evtRestartServiceBegin, // lpi1 = service - evtRestartServiceEnd, // lpi1 = service - - // For the evtCreateFileset events, the lpi1 parameter accompanying the - // event indicates the parent aggregate, while the sz1 parameter indicates - // the name of the fileset. - // - evtCreateFilesetBegin, // lpi1 = aggregate, sz1 = fileset name - evtCreateFilesetEnd, // lpi1 = aggregate, sz1 = fileset name - - // For the evtMoveFileset* events, the lpi1 parameter indicates the fileset - // being moved while the lpi2 parameter indicates the target aggregate. - // - evtMoveFilesetBegin, // lpi1 = fileset, lpi2 = aggregate - evtMoveFilesetEnd, // lpi1 = fileset, lpi2 = aggregate - - // For the evtCreateReplica* events, the lpi1 parameter indicates the - // fileset being replicated, while the lpi2 parameter indicates the - // aggregate on which the new replica will be created. - // - evtCreateReplicaBegin, // lpi1 = fileset, lpi2 = aggregate - evtCreateReplicaEnd, // lpi1 = fileset, lpi2 = aggregate - - // For the evtRenameFileset* events, the lpi1 parameter indicates the - // fileset being renamed, while the sz1 parameter indicates the new - // name for the fileset. - // - evtRenameFilesetBegin, // lpi1 = fileset, sz1 = new name - evtRenameFilesetEnd, // lpi1 = fileset, sz1 = new name - - // For the evtCloneMultiple* events, the lpi1 parameter accompanying the - // event indicates the scope of the operation. - // - evtCloneMultipleBegin, // lpi1 = scope of clonesys - evtCloneMultipleEnd, // lpi1 = scope of clonesys - - // For the evtDumpFileset* events, the lpi1 parameter accompanying the - // event indicates the fileset being dumped, while the sz1 parameter - // indicates the filename of the dump. - // - evtDumpFilesetBegin, // lpi1 = fileset, sz1 = dump filename - evtDumpFilesetEnd, // lpi1 = fileset, sz1 = dump filename - - // For the evtRestoreFileset* events, the sz1 parameter accompanying the - // event indicates the name of the fileset being restored, while the sz2 - // parameter indicates the name of the dump file being used. The lpi1 - // parameter indicates the aggregate or fileset on which the restore - // operation will be performed. - // - evtRestoreFilesetBegin, // sz1 = fileset name, sz2 = filename - evtRestoreFilesetEnd, // sz1 = fileset name, sz2 = filename - - // For most other evt*Fileset* events, the lpi1 parameter accompanying the - // event describes the fileset being changed. - // - evtDeleteFilesetBegin, // lpi1 = fileset - evtDeleteFilesetEnd, // lpi1 = fileset - - evtSetFilesetQuotaBegin, // lpi1 = fileset - evtSetFilesetQuotaEnd, // lpi1 = fileset - - evtLockFilesetBegin, // lpi1 = fileset - evtLockFilesetEnd, // lpi1 = fileset - - evtUnlockFilesetBegin, // lpi1 = fileset - evtUnlockFilesetEnd, // lpi1 = fileset - - evtUnlockAllFilesetsBegin, // lpi1 = cell, server or agg - evtUnlockAllFilesetsEnd, // lpi1 = cell, server or agg - - evtSetFilesetRepParamsBegin, // lpi1 = fileset - evtSetFilesetRepParamsEnd, // lpi1 = fileset - - evtReleaseFilesetBegin, // lpi1 = rw fileset - evtReleaseFilesetEnd, // lpi1 = rw fileset - - evtCloneBegin, // lpi1 = rw fileset - evtCloneEnd, // lpi1 = rw fileset - - evtSetFilesetOwnerGroupBegin, // lpi1 = fileset - evtSetFilesetOwnerGroupEnd, // lpi1 = fileset - - evtSetFilesetPermissionsBegin, // lpi1 = fileset - evtSetFilesetPermissionsEnd, // lpi1 = fileset - - // For the evtExecuteCommand events, the lpi1 parameter accompanying the - // event indicates the server on which the command is being executed, - // while the sz1 parameter contains the command-line being executed. - // - evtExecuteCommandBegin, // lpi1 = server, sz1 = command - evtExecuteCommandEnd, // lpi1 = server, sz1 = command - - // For the evtSalvage events, the lpi1 parameter accompanying the event - // indicates the scope of the salvage--it will point to either a server, - // an aggregate, or a volume. - // - evtSalvageBegin, // lpi1 = salvage scope - evtSalvageEnd, // lpi1 = salvage scope - - // For the evtCreateUser events, the lpi1 parameter accompanying the event - // indicates the parent cell for the operation, while the sz1 parameter - // contains the name of the user being created. - // - evtCreateUserBegin, // lpi1 = cell, sz1 = user name - evtCreateUserEnd, // lpi1 = cell, sz1 = user name - - // For most other evtUser* events, the lpi1 parameter accompanying the - // event identifies the user being manipulated. - // - evtChangeUserBegin, // lpi1 = user being changed - evtChangeUserEnd, // lpi1 = user being changed - - evtChangeUserPasswordBegin, // lpi1 = user being changed - evtChangeUserPasswordEnd, // lpi1 = user being changed - - evtDeleteUserBegin, // lpi1 = user being deleted - evtDeleteUserEnd, // lpi1 = user being deleted - - evtUnlockUserBegin, // lpi1 = user being unlocked - evtUnlockUserEnd, // lpi1 = user being unlocked - - // For the evtCreateGroup events, the lpi1 parameter accompanying the event - // indicates the parent cell for the operation, while the sz1 parameter - // contains the name of the group being created. - // - evtCreateGroupBegin, // lpi1 = cell, sz1 = group name - evtCreateGroupEnd, // lpi1 = cell, sz1 = group name - - // For most other evtGroup* events, the lpi1 parameter accompanying the - // event identifies the group being manipulated. - // - evtChangeGroupBegin, // lpi1 = group being changed - evtChangeGroupEnd, // lpi1 = group being changed - - evtRenameGroupBegin, // lpi1 = group being renamed - evtRenameGroupEnd, // lpi1 = group being renamed - - evtDeleteGroupBegin, // lpi1 = group being deleted - evtDeleteGroupEnd, // lpi1 = group being deleted - - // For the evtGroupMemberAdd/Remove* events, the lpi1 parameter - // accompanying the event identifies the group being manipulated, - // while the lpi2 parameter indicates the user being added or removed. - // - evtGroupMemberAddBegin, // lpi1 = group, lpi2 = user - evtGroupMemberAddEnd, // lpi1 = group, lpi2 = user - - evtGroupMemberRemoveBegin, // lpi1 = group, lpi2 = user - evtGroupMemberRemoveEnd, // lpi1 = group, lpi2 = user - - evtUser = 500 // add any new notifications here - } NOTIFYEVENT; - -typedef struct - { - LPIDENT lpi1; - LPIDENT lpi2; - TCHAR sz1[MAX_PATH]; - TCHAR sz2[MAX_PATH]; - DWORD dw1; - ULONG status; - LPARAM lpUser; - } NOTIFYPARAMS, *PNOTIFYPARAMS; - - -typedef BOOL (CALLBACK *NOTIFYCALLBACKPROC)( NOTIFYEVENT evt, PNOTIFYPARAMS pParams ); - -class NOTIFYCALLBACK - { - public: - NOTIFYCALLBACK (NOTIFYCALLBACKPROC procUser, LPARAM lpUser); - ~NOTIFYCALLBACK (void); - - BOOL SendNotification (NOTIFYEVENT evt, PNOTIFYPARAMS pParams); - - static BOOL SendNotificationToAll (NOTIFYEVENT evt, ULONG status = 0); - static BOOL SendNotificationToAll (NOTIFYEVENT evt, LPIDENT lpi1, ULONG status = 0); - static BOOL SendNotificationToAll (NOTIFYEVENT evt, LPTSTR psz1, ULONG status = 0); - static BOOL SendNotificationToAll (NOTIFYEVENT evt, LPIDENT lpi1, LPTSTR psz1, ULONG status); - static BOOL SendNotificationToAll (NOTIFYEVENT evt, LPIDENT lpi1, LPIDENT lpi2, LPTSTR psz1, LPTSTR psz2, DWORD dw1, ULONG status); - - // Private data - // - private: - NOTIFYCALLBACKPROC procSupplied; - LPARAM lpSupplied; - - static size_t nNotifyList; - static LPNOTIFYCALLBACK *aNotifyList; - }; - - -#endif // AFSCLASS_NOTIFY_H - diff --git a/src/WINNT/afsclass/c_set.cpp b/src/WINNT/afsclass/c_set.cpp deleted file mode 100644 index 79520b989..000000000 --- a/src/WINNT/afsclass/c_set.cpp +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - -FILESET::FILESET (LPAGGREGATE lpAggregateParent, LPVOLUMEID pvid, LPTSTR pszName) -{ - m_lpiAggregate = lpAggregateParent->GetIdentifier(); - m_lpiServer = lpAggregateParent->m_lpiServer; - m_lpiCell = lpAggregateParent->m_lpiCell; - m_lpiThis = NULL; - m_lpiThisRW = NULL; - m_lpiThisBK = NULL; - m_idVolume = *pvid; - - lstrcpy (m_szName, pszName); - m_wGhost = 0; - - m_fStatusOutOfDate = TRUE; - memset (&m_fs, 0x00, sizeof(FILESETSTATUS)); - m_fs.id = *pvid; - - lpAggregateParent->InvalidateAllocation(); -} - - -FILESET::~FILESET (void) -{ - if (m_lpiThis) - m_lpiThis->m_cRef --; -} - - -void FILESET::SendDeleteNotifications (void) -{ - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier()); -} - - -void FILESET::Close (void) -{ - AfsClass_Leave(); -} - - -LPIDENT FILESET::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - m_lpiAggregate->GetCellName (szCell); - m_lpiAggregate->GetLongServerName (szServer); - m_lpiAggregate->GetAggregateName (szAggregate); - - // Finding the identifier for a fileset is a little tricky, because - // (a) a fileset identifier's unique "key" includes the fileset's - // aggregate, and (b) filesets can move around in the cell. - // - // We'll search through our list of IDENTs and see if we can find - // an old IDENT object that refers to this fileset; if we can't find - // one, we'll create a new one. To make sure we have an accurate match, - // we'll require that the IDENT we find match all of the following - // criteria: - // 1- The identifier must point to a fileset - // 2- The identifier must have the same fileset ID as this FILESET - // 3- The identifier's cRef must be zero (i.e., there should - // not be another FILESET object out there which thinks *it* - // uses that IDENT) - // 4- The identifier must (obviously) point to the cell in which - // this FILESET object resides - // 5- If this is a fileset replica, the IDENT must be on the same - // aggregate as this fileset - // - // Note that the IDENT class maintains its list of IDENTs in a - // HASHLIST that a key placed on volume IDs. We'll use that key - // to speed up our search enormously. - // - BOOL fRequireSameAggregate = ProbablyReplica(); - - for (LPENUM pEnum = IDENT::x_lkFilesetID->FindFirst (&m_idVolume); pEnum; pEnum = pEnum->FindNext()) - { - - // Only volumes which match this fileset ID will get here. - // - LPIDENT lpiFind = (LPIDENT)( pEnum->GetObject() ); - - if (lpiFind->m_iType != itFILESET) - continue; - if (lpiFind->m_cRef != 0) - continue; - if (lstrcmpi (szCell, lpiFind->m_szCell)) - continue; - if (fRequireSameAggregate) - { - if (lstrcmpi (szServer, lpiFind->m_szServer)) - continue; - if (lstrcmpi (szAggregate, lpiFind->m_szAggregate)) - continue; - } - - // Found a match! Update the IDENT's name and location, - // to ensure it jives with reality... for instance, if - // a fileset has been moved, we'll need to fix the - // server and aggregate names. Since this affects one - // of the keys in the IDENT class's hashlist, update that list. - // - Delete (pEnum); - m_lpiThis = lpiFind; - lstrcpy (m_lpiThis->m_szServer, szServer); - lstrcpy (m_lpiThis->m_szAggregate, szAggregate); - lstrcpy (m_lpiThis->m_szFileset, m_szName); - m_lpiThis->Update(); - break; - } - - if (m_lpiThis == NULL) - m_lpiThis = New2 (IDENT,(this)); // Create a new IDENT if necessary. - - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -LPIDENT FILESET::GetReadWriteIdentifier (ULONG *pStatus) -{ - if (m_lpiThisRW == NULL) - { - if (RefreshStatus (TRUE, pStatus)) - { - if ((m_lpiThisRW = IDENT::FindIdent (this, &m_fs.idReadWrite)) == NULL) - { - if (pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - } - } - } - - return m_lpiThisRW; -} - - -LPIDENT FILESET::GetReadOnlyIdentifier (LPIDENT lpiParent, ULONG *pStatus) -{ - LPIDENT lpiRO = NULL; - - if (RefreshStatus (TRUE, pStatus)) - { - if (lpiParent == NULL) - lpiParent = m_lpiCell; - - if (m_fs.idReplica) - { - lpiRO = IDENT::FindFileset (lpiParent, &m_fs.idReplica); - } - else - { - TCHAR szNameRO[ cchNAME ]; - lstrcpy (szNameRO, m_szName); - - LPCTSTR pszExtension; - if ((pszExtension = lstrrchr (szNameRO, TEXT('.'))) == NULL) - lstrcat (szNameRO, TEXT(".readonly")); - else if (lstrcmpi (pszExtension, TEXT(".readonly")) && lstrcmpi (pszExtension, TEXT(".backup"))) - lstrcat (szNameRO, TEXT(".readonly")); - - lpiRO = IDENT::FindFileset (lpiParent, szNameRO); - } - - if (lpiRO == NULL) - { - if (pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - } - } - - return lpiRO; -} - - -LPIDENT FILESET::GetCloneIdentifier (ULONG *pStatus) -{ - if (m_lpiThisBK == NULL) - { - if (RefreshStatus (TRUE, pStatus)) - { - if ((m_lpiThisBK = IDENT::FindIdent (this, &m_fs.idClone)) == NULL) - { - if (pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - } - } - } - - return m_lpiThisBK; -} - - -void FILESET::Invalidate (void) -{ - if (!m_fStatusOutOfDate) - { - if (m_wGhost & GHOST_HAS_SERVER_ENTRY) - m_fStatusOutOfDate = TRUE; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = m_lpiAggregate->OpenAggregate()) != NULL) - { - lpAggregate->InvalidateAllocation(); - lpAggregate->Close(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -BOOL FILESET::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fStatusOutOfDate && (m_wGhost & GHOST_HAS_SERVER_ENTRY)) - { - m_fStatusOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - LPSERVER lpServer; - if ((lpServer = OpenServer (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - PVOID hVOS; - if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wp; - wp.wpVosVolumeGet.hCell = hCell; - wp.wpVosVolumeGet.hServer = hVOS; - wp.wpVosVolumeGet.idPartition = NO_PARTITION; - wp.wpVosVolumeGet.idVolume = m_idVolume; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = m_lpiAggregate->OpenAggregate()) != NULL) - { - wp.wpVosVolumeGet.idPartition = lpAggregate->GetID(); - lpAggregate->Close(); - } - - if (!Worker_DoTask (wtaskVosVolumeGet, &wp, &status)) - rc = FALSE; - else - { - SetStatusFromVOS (&wp.wpVosVolumeGet.Data); - - if ((lpAggregate = m_lpiAggregate->OpenAggregate()) != NULL) - { - lpAggregate->InvalidateAllocation(); - lpAggregate->Close(); - } - } - - lpServer->CloseVosObject(); - } - - lpServer->Close(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -void FILESET::GetName (LPTSTR pszName) -{ - lstrcpy (pszName, m_szName); -} - - -void FILESET::GetID (LPVOLUMEID pvid) -{ - *pvid = m_idVolume; -} - - -LPCELL FILESET::OpenCell (ULONG *pStatus) -{ - return m_lpiCell->OpenCell (pStatus); -} - - -LPSERVER FILESET::OpenServer (ULONG *pStatus) -{ - return m_lpiServer->OpenServer (pStatus); -} - - -LPAGGREGATE FILESET::OpenAggregate (ULONG *pStatus) -{ - return m_lpiAggregate->OpenAggregate (pStatus); -} - - -BOOL FILESET::GetStatus (LPFILESETSTATUS lpfs, BOOL fNotify, ULONG *pStatus) -{ - if (!RefreshStatus (fNotify, pStatus)) - return FALSE; - - memcpy (lpfs, &m_fs, sizeof(FILESETSTATUS)); - return TRUE; -} - - -short FILESET::GetGhostStatus (void) -{ - return m_wGhost; -} - - -PVOID FILESET::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void FILESET::SetUserParam (PVOID pUserNew) -{ - GetIdentifier()->SetUserParam (pUserNew); -} - - -BOOL FILESET::ProbablyReplica (void) -{ - LPCTSTR pszExtension; - - if ((pszExtension = lstrrchr (m_szName, TEXT('.'))) == NULL) - return FALSE; - - if (lstrcmpi (pszExtension, TEXT(".readonly"))) - return FALSE; - - return TRUE; -} - - -void FILESET::SetStatusFromVOS (PVOID lp) -{ - vos_volumeEntry_p pEntry = (vos_volumeEntry_p)lp; - - m_fs.id = m_idVolume; - m_fs.idReadWrite = pEntry->readWriteId; - m_fs.idReplica = pEntry->readOnlyId; - m_fs.idClone = pEntry->backupId; - AfsClass_UnixTimeToSystemTime (&m_fs.timeCreation, pEntry->creationDate); - AfsClass_UnixTimeToSystemTime (&m_fs.timeLastUpdate, pEntry->lastUpdateDate); - AfsClass_UnixTimeToSystemTime (&m_fs.timeLastAccess, pEntry->lastAccessDate); - AfsClass_UnixTimeToSystemTime (&m_fs.timeLastBackup, pEntry->lastBackupDate); - AfsClass_UnixTimeToSystemTime (&m_fs.timeCopyCreation, pEntry->copyCreationDate); - m_fs.nFiles = pEntry->fileCount; - m_fs.ckQuota = pEntry->maxQuota; - m_fs.ckUsed = pEntry->currentSize; - - switch (pEntry->type) - { - case VOS_BACKUP_VOLUME: - m_fs.Type = ftCLONE; - m_fs.idClone = pEntry->id; - break; - case VOS_READ_ONLY_VOLUME: - m_fs.Type = ftREPLICA; - m_fs.idReplica = pEntry->id; - break; - case VOS_READ_WRITE_VOLUME: - m_fs.Type = ftREADWRITE; - m_fs.idReadWrite = pEntry->id; - break; - } - - m_fs.State &= fsMASK_VLDB; - - switch (pEntry->status) - { - case VOS_SALVAGE: - m_fs.State |= fsSALVAGE; - break; - case VOS_NO_VNODE: - m_fs.State |= fsNO_VNODE; - break; - case VOS_NO_VOL: - m_fs.State |= fsNO_VOL; - break; - case VOS_NO_SERVICE: - m_fs.State |= fsNO_SERVICE; - break; - case VOS_OFFLINE: - m_fs.State |= fsOFFLINE; - break; - case VOS_DISK_FULL: - m_fs.State |= fsDISK_FULL; - break; - case VOS_OVER_QUOTA: - m_fs.State |= fsOVER_QUOTA; - break; - case VOS_BUSY: - m_fs.State |= fsBUSY; - break; - case VOS_MOVED: - m_fs.State |= fsMOVED; - break; - } -} - diff --git a/src/WINNT/afsclass/c_set.h b/src/WINNT/afsclass/c_set.h deleted file mode 100644 index aa36c77fb..000000000 --- a/src/WINNT/afsclass/c_set.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_FILESET_H -#define AFSCLASS_FILESET_H - - -/* - * FILESET CLASS ______________________________________________________________ - * - */ - -#define fsNORMAL 0x00000000 -#define fsSALVAGE 0x00000001 -#define fsNO_VNODE 0x00000002 -#define fsNO_VOL 0x00000004 -#define fsNO_SERVICE 0x00000008 -#define fsOFFLINE 0x00000010 -#define fsDISK_FULL 0x00000020 -#define fsOVER_QUOTA 0x00000040 -#define fsBUSY 0x00000080 -#define fsMOVED 0x00000100 -#define fsLOCKED 0x00010000 -#define fsMASK_VLDB 0xFFFF0000 -typedef DWORD FILESETSTATE; - -typedef enum - { - ftREADWRITE, - ftREPLICA, - ftCLONE - } FILESETTYPE; - -typedef struct - { - VOLUMEID id; - VOLUMEID idReadWrite; - VOLUMEID idReplica; - VOLUMEID idClone; - SYSTEMTIME timeCreation; - SYSTEMTIME timeLastUpdate; - SYSTEMTIME timeLastAccess; - SYSTEMTIME timeLastBackup; - SYSTEMTIME timeCopyCreation; - ULONG nFiles; - size_t ckQuota; - size_t ckUsed; - FILESETTYPE Type; - FILESETSTATE State; - } FILESETSTATUS, *LPFILESETSTATUS; - -class FILESET - { - friend class CELL; - friend class SERVER; - friend class AGGREGATE; - friend class IDENT; - - public: - void Close (void); - void Invalidate (void); - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - BOOL RefreshStatus_VLDB (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - - LPCELL OpenCell (ULONG *pStatus = NULL); - LPSERVER OpenServer (ULONG *pStatus = NULL); - LPAGGREGATE OpenAggregate (ULONG *pStatus = NULL); - - // Fileset properties - // - LPIDENT GetIdentifier (void); - LPIDENT GetReadWriteIdentifier (ULONG *pStatus = NULL); - LPIDENT GetReadOnlyIdentifier (LPIDENT lpiParent, ULONG *pStatus = NULL); - LPIDENT GetCloneIdentifier (ULONG *pStatus = NULL); - void GetName (LPTSTR pszName); - void GetID (LPVOLUMEID pvid); - - BOOL GetStatus (LPFILESETSTATUS lpfs, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - short GetGhostStatus (void); // returns GHOST_* - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - private: - FILESET (LPAGGREGATE lpAggregateParent, LPVOLUMEID pvid, LPTSTR pszName); - ~FILESET (void); - void SendDeleteNotifications (void); - - BOOL ProbablyReplica (void); - void SetStatusFromVOS (PVOID /* vos_volumeEntry_p */ pEntry); - - private: - LPIDENT m_lpiCell; - LPIDENT m_lpiServer; - LPIDENT m_lpiAggregate; - LPIDENT m_lpiThis; - LPIDENT m_lpiThisRW; - LPIDENT m_lpiThisBK; - VOLUMEID m_idVolume; - - TCHAR m_szName[ cchNAME ]; - short m_wGhost; - - BOOL m_fStatusOutOfDate; - FILESETSTATUS m_fs; - }; - - -#endif // AFSCLASS_FILESET_H - diff --git a/src/WINNT/afsclass/c_svc.cpp b/src/WINNT/afsclass/c_svc.cpp deleted file mode 100644 index 767633773..000000000 --- a/src/WINNT/afsclass/c_svc.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - -SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName) -{ - m_lpiServer = lpServerParent->GetIdentifier(); - m_lpiCell = m_lpiCell; - m_lpiThis = NULL; - - lstrcpy (m_szName, pszName); - - m_fStatusOutOfDate = TRUE; - memset (&m_ss, 0x00, sizeof(SERVICESTATUS)); -} - - -SERVICE::~SERVICE (void) -{ - if (m_lpiThis) - m_lpiThis->m_cRef --; -} - - -void SERVICE::SendDeleteNotifications (void) -{ - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier()); -} - - -void SERVICE::Close (void) -{ - AfsClass_Leave(); -} - - -LPIDENT SERVICE::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - if ((m_lpiThis = IDENT::FindIdent (this)) == NULL) - m_lpiThis = New2 (IDENT,(this)); - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -void SERVICE::Invalidate (void) -{ - if (!m_fStatusOutOfDate) - { - m_fStatusOutOfDate = TRUE; - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fStatusOutOfDate) - { - m_fStatusOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - LPSERVER lpServer; - if ((lpServer = OpenServer (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - PVOID hBOS; - if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - else - { - SERVICESTATUS ss; - if (!lstrcmp (m_szName, TEXT("BOS"))) - { - memset (&ss, 0x00, sizeof(SERVICESTATUS)); - AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0); - AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0); - AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0); - ss.nStarts = 1; - ss.dwErrLast = 0; - ss.dwSigLast = 0; - ss.type = SERVICETYPE_SIMPLE; - ss.state = SERVICESTATE_RUNNING; - } - else - { - WORKERPACKET wp; - wp.wpBosProcessInfoGet.hServer = hBOS; - wp.wpBosProcessInfoGet.pszService = m_szName; - - if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status)) - rc = FALSE; - else - { - memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS)); - - // Get the service's current state - // - wp.wpBosProcessExecutionStateGet.hServer = hBOS; - wp.wpBosProcessExecutionStateGet.pszService = m_szName; - wp.wpBosProcessExecutionStateGet.pszAuxStatus = ss.szAuxStatus; - if (!Worker_DoTask (wtaskBosProcessExecutionStateGet, &wp, &status)) - ss.state = SERVICESTATE_STOPPED; - else - ss.state = wp.wpBosProcessExecutionStateGet.state; - - // Get the service's notifier - // - ss.szNotifier[0] = TEXT('\0'); - wp.wpBosProcessNotifierGet.hServer = hBOS; - wp.wpBosProcessNotifierGet.pszService = m_szName; - wp.wpBosProcessNotifierGet.pszNotifier = ss.szNotifier;; - Worker_DoTask (wtaskBosProcessNotifierGet, &wp, &status); - - // Get the service's parameters - // - ss.szParams[0] = TEXT('\0'); - - WORKERPACKET wpBegin; - wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS; - wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName; - if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status)) - { - for (;;) - { - TCHAR szParam[ 256 ]; - WORKERPACKET wpNext; - wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum; - wpNext.wpBosProcessParameterGetNext.pszParam = szParam; - - if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - if (ss.szParams[0] != TEXT('\0')) - lstrcat (ss.szParams, TEXT(" ")); - lstrcat (ss.szParams, szParam); - } - - WORKERPACKET wpDone; - wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum; - Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone); - } - - // Strip trailing CR/LF characters - // - size_t cch = lstrlen (ss.szAuxStatus); - while (cch && (ss.szAuxStatus[ cch-1 ] == TEXT('\r') || ss.szAuxStatus[ cch-1 ] == TEXT('\n'))) - ss.szAuxStatus[ cch-- ] = TEXT('\0'); - - cch = lstrlen (ss.szParams); - while (cch && (ss.szParams[ cch-1 ] == TEXT('\r') || ss.szParams[ cch-1 ] == TEXT('\n'))) - ss.szParams[ cch-- ] = TEXT('\0'); - - cch = lstrlen (ss.szNotifier); - while (cch && (ss.szNotifier[ cch-1 ] == TEXT('\r') || ss.szNotifier[ cch-1 ] == TEXT('\n'))) - ss.szNotifier[ cch-- ] = TEXT('\0'); - } - } - - if (rc) - { - memcpy (&m_ss, &ss, sizeof(SERVICESTATUS)); - } - - lpServer->CloseBosObject(); - } - - lpServer->Close(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -void SERVICE::GetName (LPTSTR pszName) -{ - lstrcpy (pszName, m_szName); -} - - -LPCELL SERVICE::OpenCell (ULONG *pStatus) -{ - return m_lpiCell->OpenCell (pStatus); -} - - -LPSERVER SERVICE::OpenServer (ULONG *pStatus) -{ - return m_lpiServer->OpenServer (pStatus); -} - - - -BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus) -{ - if (!RefreshStatus (fNotify, pStatus)) - return FALSE; - - memcpy (lpss, &m_ss, sizeof(SERVICESTATUS)); - return TRUE; -} - - -PVOID SERVICE::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void SERVICE::SetUserParam (PVOID pUserNew) -{ - GetIdentifier()->SetUserParam (pUserNew); -} - diff --git a/src/WINNT/afsclass/c_svc.h b/src/WINNT/afsclass/c_svc.h deleted file mode 100644 index db703e22d..000000000 --- a/src/WINNT/afsclass/c_svc.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_SERVICE_H -#define AFSCLASS_SERVICE_H - -#include - - -/* - * SERVICE CLASS ______________________________________________________________ - * - */ - -typedef enum - { - SERVICETYPE_SIMPLE, - SERVICETYPE_FS, - SERVICETYPE_CRON - } AFSSERVICETYPE; - -typedef enum - { - SERVICESTATE_RUNNING, - SERVICESTATE_STOPPED, - SERVICESTATE_STARTING, - SERVICESTATE_STOPPING - } SERVICESTATE; - -typedef struct - { - TCHAR szAuxStatus[ cchRESOURCE ]; - TCHAR szParams[ cchRESOURCE ]; - TCHAR szNotifier[ cchRESOURCE ]; - SYSTEMTIME timeLastStart; - SYSTEMTIME timeLastStop; - SYSTEMTIME timeLastFail; - ULONG nStarts; - ULONG dwErrLast; - ULONG dwSigLast; - AFSSERVICETYPE type; - SERVICESTATE state; - } SERVICESTATUS, *LPSERVICESTATUS; - -typedef struct - { -#define ENCRYPTIONKEY_LEN 8 - BYTE key[ ENCRYPTIONKEY_LEN ]; - } ENCRYPTIONKEY, *LPENCRYPTIONKEY; - -typedef struct - { - SYSTEMTIME timeLastModification; - DWORD dwChecksum; - } ENCRYPTIONKEYINFO, *LPENCRYPTIONKEYINFO; - -class SERVICE - { - friend class CELL; - friend class SERVER; - friend class IDENT; - - public: - void Close (void); - void Invalidate (void); - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); // does nothing if not invalidated - - // Service properties - // - LPIDENT GetIdentifier (void); - LPCELL OpenCell (ULONG *pStatus = NULL); - LPSERVER OpenServer (ULONG *pStatus = NULL); - void GetName (LPTSTR pszName); - - BOOL GetStatus (LPSERVICESTATUS lpss, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - // Private functions - // - private: - SERVICE (LPSERVER lpServerParent, LPTSTR pszName); - ~SERVICE (void); - void SendDeleteNotifications (void); - - // Private data - // - private: - LPIDENT m_lpiCell; - LPIDENT m_lpiServer; - LPIDENT m_lpiThis; - TCHAR m_szName[ cchNAME ]; - - BOOL m_fStatusOutOfDate; - SERVICESTATUS m_ss; - }; - - -#endif // AFSCLASS_SERVICE_H - diff --git a/src/WINNT/afsclass/c_svr.cpp b/src/WINNT/afsclass/c_svr.cpp deleted file mode 100644 index 01ef4b633..000000000 --- a/src/WINNT/afsclass/c_svr.cpp +++ /dev/null @@ -1,1368 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - // Each SERVER object maintains a list of aggregates and a list - // of services; those lists have hashtables placed across their - // names (and, for aggregates, their IDs) for faster lookup. - // The default table size in a HASHLIST is 1000 elements--that's - // too large for a list of aggregates or services on a server, - // as it's enough to handle up to 30,000 objects before the table - // would need to resize iteself (see the documentation in - // hashlist.cpp for info). Instead, we choose a more reasonable - // default table size. - // -#define cKEYAGGREGATENAME_TABLESIZE 100 -#define cKEYAGGREGATEID_TABLESIZE 100 - -#define cKEYSERVICENAME_TABLESIZE 50 - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - -SERVER::SERVER (LPCELL lpCellParent, LPTSTR pszName) -{ - m_lpiCell = lpCellParent->GetIdentifier(); - - lstrcpy (m_szName, pszName); - - m_lpCellBOS = NULL; - m_hCellBOS = NULL; - m_hBOS = NULL; - m_cReqBOS = 0; - - m_hCellVOS = NULL; - m_hVOS = NULL; - m_cReqVOS = 0; - - m_fCanGetAggregates = TRUE; - m_fAggregatesOutOfDate = TRUE; - m_lAggregates = New (HASHLIST); - m_lAggregates->SetCriticalSection (AfsClass_GetCriticalSection()); - m_lkAggregateName = m_lAggregates->CreateKey ("Aggregate Name", SERVER::KeyAggregateName_Compare, SERVER::KeyAggregateName_HashObject, SERVER::KeyAggregateName_HashData, cKEYAGGREGATENAME_TABLESIZE); - m_lkAggregateID = m_lAggregates->CreateKey ("Aggregate ID", SERVER::KeyAggregateID_Compare, SERVER::KeyAggregateID_HashObject, SERVER::KeyAggregateID_HashData, cKEYAGGREGATEID_TABLESIZE); - - m_fCanGetServices = TRUE; - m_fServicesOutOfDate = TRUE; - m_lServices = New (HASHLIST); - m_lServices->SetCriticalSection (AfsClass_GetCriticalSection()); - m_lkServiceName = m_lServices->CreateKey ("Service Name", SERVER::KeyServiceName_Compare, SERVER::KeyServiceName_HashObject, SERVER::KeyServiceName_HashData, cKEYSERVICENAME_TABLESIZE); - - m_wGhost = 0; - m_lpiThis = NULL; - m_fMonitor = TRUE; - m_fDelete = FALSE; - m_lastStatus = 0; - - m_fVLDBOutOfDate = FALSE; /* FIXME: added because it was missing */ - m_fStatusOutOfDate = TRUE; - memset (&m_ss, 0x00, sizeof(SERVERSTATUS)); -} - - -SERVER::~SERVER (void) -{ - if (!m_fMonitor) - { - LPCELL lpCell; - if ((lpCell = m_lpiCell->OpenCell()) != NULL) - { - (lpCell->m_nServersUnmonitored)--; - lpCell->Close(); - } - } - - if (m_lpiThis) - m_lpiThis->m_cRef --; - - FreeAll(); - Delete (m_lAggregates); - Delete (m_lServices); -} - - -void SERVER::FreeAll (void) -{ - if (m_cReqBOS) - { - m_cReqBOS = 1; - CloseBosObject(); - } - if (m_cReqVOS) - { - m_cReqVOS = 1; - CloseVosObject(); - } - - FreeAggregates(); - FreeServices(); -} - - -void SERVER::FreeAggregates (void) -{ - for (LPENUM pEnum = m_lAggregates->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPAGGREGATE lpAggregate = (LPAGGREGATE)(pEnum->GetObject()); - m_lAggregates->Remove (lpAggregate); - Delete (lpAggregate); - } -} - - -void SERVER::FreeServices (void) -{ - for (LPENUM pEnum = m_lServices->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPSERVICE lpService = (LPSERVICE)(pEnum->GetObject()); - m_lServices->Remove (lpService); - Delete (lpService); - } -} - - -void SERVER::SendDeleteNotifications (void) -{ - for (LPENUM pEnum = m_lAggregates->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPAGGREGATE lpAggregate = (LPAGGREGATE)(pEnum->GetObject()); - lpAggregate->SendDeleteNotifications (); - } - - for (pEnum = m_lServices->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPSERVICE lpService = (LPSERVICE)(pEnum->GetObject()); - lpService->SendDeleteNotifications(); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier()); -} - - -void SERVER::Close (void) -{ - AfsClass_Leave(); -} - - -LPIDENT SERVER::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - if ((m_lpiThis = IDENT::FindIdent (this)) == NULL) - m_lpiThis = New2 (IDENT,(this)); - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -PVOID SERVER::OpenBosObject (PVOID *phCell, ULONG *pStatus) -{ - if (!m_hBOS) - { - if ((m_lpCellBOS = m_lpiCell->OpenCell (pStatus)) != NULL) - { - if ((m_hCellBOS = m_lpCellBOS->GetCellObject (pStatus)) != NULL) - { - TCHAR szCell[ cchNAME ]; - m_lpiCell->GetCellName (szCell); - - WORKERPACKET wp; - wp.wpBosServerOpen.hCell = m_hCellBOS; - wp.wpBosServerOpen.pszServer = m_szName; - if (Worker_DoTask (wtaskBosServerOpen, &wp, pStatus)) - m_hBOS = wp.wpBosServerOpen.hServer; - } - - if (!m_hBOS) - { - m_lpCellBOS->Close(); - m_lpCellBOS = NULL; - m_hCellBOS = NULL; - } - } - } - - if (m_hBOS) - { - if (phCell) - *phCell = m_hCellBOS; - ++m_cReqBOS; - } - return m_hBOS; -} - - -BOOL SERVER::CloseBosObject (ULONG *pStatus) -{ - BOOL rc = TRUE; - - if ((m_cReqBOS > 0) && ((--m_cReqBOS) == 0)) - { - if (m_hBOS != NULL) - { - WORKERPACKET wp; - wp.wpBosServerClose.hServer = m_hBOS; - if (!Worker_DoTask (wtaskBosServerClose, &wp, pStatus)) - rc = FALSE; - m_hBOS = NULL; - } - if (m_lpCellBOS != NULL) - { - m_lpCellBOS->Close(); - m_lpCellBOS = NULL; - } - } - - return rc; -} - - -PVOID SERVER::OpenVosObject (PVOID *phCell, ULONG *pStatus) -{ - if (!m_hCellVOS) - { - LPCELL lpCell; - if ((lpCell = m_lpiCell->OpenCell (pStatus)) != NULL) - { - m_hCellVOS = lpCell->GetCellObject (pStatus); - lpCell->Close(); - } - } - - if (m_hCellVOS && !m_hVOS) - { - TCHAR szCell[ cchNAME ]; - m_lpiCell->GetCellName (szCell); - - WORKERPACKET wp; - wp.wpVosServerOpen.hCell = m_hCellVOS; - wp.wpVosServerOpen.pszServer = m_szName; - if (Worker_DoTask (wtaskVosServerOpen, &wp, pStatus)) - m_hVOS = wp.wpVosServerOpen.hServer; - } - - if (m_hVOS) - { - if (phCell) - *phCell = m_hCellVOS; - ++m_cReqVOS; - } - return m_hVOS; -} - - -BOOL SERVER::CloseVosObject (ULONG *pStatus) -{ - BOOL rc = TRUE; - - if ((m_cReqVOS > 0) && ((--m_cReqVOS) == 0)) - { - if (m_hVOS != NULL) - { - WORKERPACKET wp; - wp.wpVosServerClose.hServer = m_hVOS; - if (!Worker_DoTask (wtaskVosServerClose, &wp, pStatus)) - rc = FALSE; - } - - m_hVOS = NULL; - m_hCellVOS = NULL; - } - - return rc; -} - - -void SERVER::Invalidate (void) -{ - if (!m_fAggregatesOutOfDate || !m_fServicesOutOfDate || !m_fStatusOutOfDate) - { - if (m_wGhost & GHOST_HAS_SERVER_ENTRY) - { - m_fAggregatesOutOfDate = TRUE; - m_fServicesOutOfDate = TRUE; - m_fStatusOutOfDate = TRUE; - } - - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -void SERVER::InvalidateStatus (void) -{ - if (!m_fStatusOutOfDate) - { - if (m_wGhost & GHOST_HAS_SERVER_ENTRY) - { - m_fStatusOutOfDate = TRUE; - } - - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -void SERVER::InvalidateServices (void) -{ - if (!m_fServicesOutOfDate) - { - if (m_wGhost & GHOST_HAS_SERVER_ENTRY) - { - m_fServicesOutOfDate = TRUE; - } - - NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier()); - } -} - - -BOOL SERVER::RefreshAggregates (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fAggregatesOutOfDate) - { - m_fAggregatesOutOfDate = FALSE; - - if (fIsMonitored()) - { - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAggregatesBegin, GetIdentifier()); - - // First thing is to forget about what aggregates we think we have - // now. - // - for (LPENUM pEnum = m_lAggregates->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPAGGREGATE lpAggregate = (LPAGGREGATE)(pEnum->GetObject()); - lpAggregate->SendDeleteNotifications(); - m_lAggregates->Remove (lpAggregate); - Delete (lpAggregate); - } - - // Next, the harder part: look through the server to find a list - // of aggregates. - // - PVOID hCell; - PVOID hVOS; - if ((hVOS = OpenVosObject (&hCell, &status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wpBegin; - wpBegin.wpVosPartitionGetBegin.hCell = hCell; - wpBegin.wpVosPartitionGetBegin.hServer = hVOS; - - if (!Worker_DoTask (wtaskVosPartitionGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - for (;;) - { - WORKERPACKET wpNext; - wpNext.wpVosPartitionGetNext.hEnum = wpBegin.wpVosPartitionGetBegin.hEnum; - if (!Worker_DoTask (wtaskVosPartitionGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - vos_partitionEntry_p pData = &wpNext.wpVosPartitionGetNext.Data; - - LPTSTR pszName = AnsiToString (pData->name); - LPTSTR pszDevice = AnsiToString (pData->deviceName); - - LPAGGREGATE lpAggregate = New2 (AGGREGATE,(this, pszName, pszDevice)); - - lpAggregate->m_as.dwID = lpAggregate->GetID(); - - FreeString (pszDevice, pData->deviceName); - FreeString (pszName, pData->name); - - lpAggregate->m_wGhost |= GHOST_HAS_SERVER_ENTRY; - lpAggregate->m_as.ckStorageTotal = pData->totalSpace; - lpAggregate->m_as.ckStorageFree = pData->totalFreeSpace; - m_lAggregates->Add (lpAggregate); - - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpAggregate->GetIdentifier()); - } - - WORKERPACKET wpDone; - wpDone.wpVosPartitionGetDone.hEnum = wpBegin.wpVosPartitionGetBegin.hEnum; - Worker_DoTask (wtaskVosPartitionGetDone, &wpDone); - } - - CloseVosObject(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAggregatesEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -BOOL SERVER::RefreshServices (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fServicesOutOfDate) - { - m_fServicesOutOfDate = FALSE; - - if (fIsMonitored()) - { - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServicesBegin, GetIdentifier()); - - // First thing is to forget about what services we think we have now. - // - for (LPENUM pEnum = m_lServices->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) - { - LPSERVICE lpService = (LPSERVICE)(pEnum->GetObject()); - lpService->SendDeleteNotifications(); - m_lServices->Remove (lpService); - Delete (lpService); - } - - // Next, the harder part: look through the server to find a list - // of services. - // - PVOID hCell; - PVOID hBOS; - if ((hBOS = OpenBosObject (&hCell, &status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wpBegin; - wpBegin.wpBosProcessNameGetBegin.hServer = hBOS; - if (!Worker_DoTask (wtaskBosProcessNameGetBegin, &wpBegin, &status)) - rc = FALSE; - else - { - LPSERVICE lpService = New2 (SERVICE,(this, TEXT("BOS"))); - m_lServices->Add (lpService); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpService->GetIdentifier()); - - for (;;) - { - TCHAR szServiceName[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpBosProcessNameGetNext.hEnum = wpBegin.wpBosProcessNameGetBegin.hEnum; - wpNext.wpBosProcessNameGetNext.pszService = szServiceName; - - if (!Worker_DoTask (wtaskBosProcessNameGetNext, &wpNext, &status)) - { - if (status == ADMITERATORDONE) - status = 0; - else - rc = FALSE; - break; - } - - lpService = New2 (SERVICE,(this, wpNext.wpBosProcessNameGetNext.pszService)); - m_lServices->Add (lpService); - NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpService->GetIdentifier()); - } - - WORKERPACKET wpDone; - wpDone.wpBosProcessNameGetDone.hEnum = wpBegin.wpBosProcessNameGetBegin.hEnum; - Worker_DoTask (wtaskBosProcessNameGetDone, &wpDone); - } - - CloseBosObject(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServicesEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -BOOL SERVER::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - - if (m_fStatusOutOfDate) - { - m_fStatusOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - LPCELL lpCell; - if ((lpCell = OpenCell (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - { - WORKERPACKET wp; - wp.wpClientAFSServerGet.hCell = hCell; - wp.wpClientAFSServerGet.pszServer = m_szName; - - if (!Worker_DoTask (wtaskClientAFSServerGet, &wp, &status)) - rc = FALSE; - else - { - m_ss.nAddresses = 0; - - for (size_t iAddr = 0; iAddr < AFS_MAX_SERVER_ADDRESS; ++iAddr) - { - if (wp.wpClientAFSServerGet.Entry.serverAddress[ iAddr ] == 0) - continue; - AfsClass_IntToAddress (&m_ss.aAddresses[ m_ss.nAddresses++ ], wp.wpClientAFSServerGet.Entry.serverAddress[ iAddr ]); - } - - lpCell->m_lServers->Update (this); // That update affected a hashlistkey - } - } - lpCell->Close(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -void SERVER::GetName (LPTSTR pszName) -{ - SERVER::ShortenName (pszName, m_szName); -} - - -void SERVER::GetLongName (LPTSTR pszName) -{ - lstrcpy (pszName, m_szName); -} - - -LPCELL SERVER::OpenCell (ULONG *pStatus) -{ - return m_lpiCell->OpenCell (pStatus); -} - -BOOL SERVER::GetStatus (LPSERVERSTATUS lpss, BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - - if (m_fMonitor) - rc = RefreshStatus (fNotify, pStatus); - - memcpy (lpss, &m_ss, sizeof(SERVERSTATUS)); - return rc; -} - - -short SERVER::GetGhostStatus (void) -{ - return m_wGhost; -} - - -PVOID SERVER::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void SERVER::SetUserParam (PVOID pUserNew) -{ - GetIdentifier()->SetUserParam (pUserNew); -} - - -void SERVER::ShortenName (LPTSTR pszTarget, LPTSTR pszSource, BOOL fForce) -{ - lstrcpy (pszTarget, pszSource); - - if (fForce || !fLongServerNames) - { - // If the name is really an IP address, don't shorten it. - // - BOOL fIsIPAddress = TRUE; - for (LPTSTR pch = pszTarget; *pch && fIsIPAddress; ++pch) - { - if (!isdigit(*pch) && !(*pch == TEXT('.'))) - fIsIPAddress = FALSE; - } - - if (!fIsIPAddress) - { - if ((pszTarget = (LPTSTR)lstrchr (pszTarget, TEXT('.'))) != NULL) - *pszTarget = TEXT('\0'); - } - } -} - - -BOOL SERVER::fIsMonitored (void) -{ - return m_fMonitor; -} - - -BOOL SERVER::SetMonitor (BOOL fShouldMonitor, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (m_fMonitor != fShouldMonitor) - { - LPCELL lpCell; - if ((lpCell = m_lpiCell->OpenCell (&status)) == NULL) - rc = FALSE; - else - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - if ((m_fMonitor = fShouldMonitor) == FALSE) - { - FreeAll(); - (lpCell->m_nServersUnmonitored)++; - } - else // (fMonitor == TRUE) - { - (lpCell->m_nServersUnmonitored)--; - Invalidate(); - rc = RefreshAll (&status); - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), m_lastStatus); - lpCell->Close(); - } - } - - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -/* - * REFRESHALL __________________________________________________________________ - * - * If a server is down, or doesn't have an VOS process running, it could - * take some time before we time out trying to talk to the server. During - * the course of a refresh, the first timeout-and-fail that we will hit is - * our call to wtaskVosPartitionGetBegin; since this call is very quick if - * it's going to be successful, we can safely perform this call once up-front - * to test to see if the server is listening at all. That test is performed - * on a separate thread, so that in the event the request times out, we can - * simply discard the thread and let it terminate on its own. - * - */ - -typedef struct - { - BOOL fInUse; - BOOL fCanceled; - LPSERVER lpServer; - PVOID hCell; - } REFRESHSECTION, *LPREFRESHSECTION; - -static REFRESHSECTION *aRefSec = NULL; -static size_t cRefSec = 0; -static LPCRITICAL_SECTION pcsRefSec = NULL; - -void AfsClass_InitRefreshSections (void) -{ - if (pcsRefSec == NULL) - { - pcsRefSec = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsRefSec); - } -} - - -void AfsClass_SkipRefresh (int idSection) -{ - AfsClass_InitRefreshSections(); - EnterCriticalSection (pcsRefSec); - - if (aRefSec && (idSection < (int)cRefSec)) - { - if (aRefSec[ idSection ].fInUse) - { - aRefSec[ idSection ].fCanceled = TRUE; - } - } - - LeaveCriticalSection (pcsRefSec); -} - - -DWORD WINAPI SERVER::CanTalkToServer_ThreadProc (PVOID lp) -{ - int idSection = (int)lp; - - // Until we post a notification saying that we've entered - // a section, we don't need to worry about the aRefSec[] entry - // being invalid. Once that post is made, the user can skip - // the section at any time--so we'll have to check frequently, - // always under the pcsRefSec critical section. - // - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllSectionStart, NULL, NULL, NULL, NULL, idSection, 0); - - BOOL fAggregatesOK = FALSE; - BOOL fServicesOK = FALSE; - BOOL fContinue = TRUE; - - // Try to get the BOS object for this server. Remember, there's - // a catch here: we can only assume that the aRefSec[idSection].lpServer - // pointer is valid so long as we're within the pcsRefSec critical - // section! (if we're in that critsec, we can verify that no one - // has canceled the operation--and if no one has, there is a thread - // hanging around which holds the library's critsec, which ensures - // the lpServer pointer won't have been freed.) - // - PVOID hCell; - PVOID hBOS; - PVOID hVOS; - - TCHAR szServer[ cchNAME ]; - - EnterCriticalSection (pcsRefSec); - if ( ((!aRefSec[ idSection ].fInUse) || (aRefSec[ idSection ].fCanceled)) ) - fContinue = FALSE; - else - { - hCell = aRefSec[ idSection ].hCell; - aRefSec[ idSection ].lpServer->GetLongName (szServer); - } - LeaveCriticalSection (pcsRefSec); - - if (fContinue) - { - WORKERPACKET wp; - wp.wpBosServerOpen.hCell = hCell; - wp.wpBosServerOpen.pszServer = szServer; - - ULONG status; - fContinue = Worker_DoTask (wtaskBosServerOpen, &wp, &status); - - EnterCriticalSection (pcsRefSec); - if ( ((!aRefSec[ idSection ].fInUse) || (aRefSec[ idSection ].fCanceled)) ) - fContinue = FALSE; - else if (!fContinue) - aRefSec[ idSection ].lpServer->m_lastStatus = status; - else - hBOS = wp.wpBosServerOpen.hServer; - LeaveCriticalSection (pcsRefSec); - } - - if (fContinue) - { - WORKERPACKET wpBegin; - wpBegin.wpBosProcessNameGetBegin.hServer = hBOS; - - ULONG status; - fContinue = Worker_DoTask (wtaskBosProcessNameGetBegin, &wpBegin, &status); - - EnterCriticalSection (pcsRefSec); - if ( ((!aRefSec[ idSection ].fInUse) || (aRefSec[ idSection ].fCanceled)) ) - fContinue = FALSE; - else if (fContinue) - aRefSec[ idSection ].lpServer->m_lastStatus = status; - LeaveCriticalSection (pcsRefSec); - - if (fContinue) - { - WORKERPACKET wpDone; - wpDone.wpBosProcessNameGetDone.hEnum = wpBegin.wpBosProcessNameGetBegin.hEnum; - Worker_DoTask (wtaskBosProcessNameGetDone, &wpDone); - - // We can talk to BOS! - fServicesOK = TRUE; - } - } - - // If we couldn't talk to BOS, it's a sure bet the server is down-- - // and regardless, if BOS isn't around, VOS isn't either. So - // we may not even have to test that. - // - if (fContinue) - { - WORKERPACKET wp; - wp.wpVosServerOpen.hCell = hCell; - wp.wpVosServerOpen.pszServer = szServer; - - ULONG status; - fContinue = Worker_DoTask (wtaskVosServerOpen, &wp, &status); - - EnterCriticalSection (pcsRefSec); - if ( ((!aRefSec[ idSection ].fInUse) || (aRefSec[ idSection ].fCanceled)) ) - fContinue = FALSE; - else if (!fContinue) - aRefSec[ idSection ].lpServer->m_lastStatus = status; - else - hVOS = wp.wpVosServerOpen.hServer; - LeaveCriticalSection (pcsRefSec); - } - - if (fContinue) - { - WORKERPACKET wpBegin; - wpBegin.wpVosPartitionGetBegin.hCell = hCell; - wpBegin.wpVosPartitionGetBegin.hServer = hVOS; - - ULONG status; - fContinue = Worker_DoTask (wtaskVosPartitionGetBegin, &wpBegin, &status); - - EnterCriticalSection (pcsRefSec); - if ( ((!aRefSec[ idSection ].fInUse) || (aRefSec[ idSection ].fCanceled)) ) - fContinue = FALSE; - else if (fContinue) - aRefSec[ idSection ].lpServer->m_lastStatus = status; - LeaveCriticalSection (pcsRefSec); - - if (fContinue) - { - WORKERPACKET wpDone; - wpDone.wpVosPartitionGetDone.hEnum = wpBegin.wpVosPartitionGetBegin.hEnum; - Worker_DoTask (wtaskVosPartitionGetDone, &wpDone); - - // We can talk to VOS! - fAggregatesOK = TRUE; - } - } - - // Close the VOS and BOS objects we obtained. - // - if (hBOS) - { - WORKERPACKET wp; - wp.wpBosServerClose.hServer = hBOS; - Worker_DoTask (wtaskBosServerClose, &wp); - } - if (hVOS) - { - WORKERPACKET wp; - wp.wpVosServerClose.hServer = hVOS; - Worker_DoTask (wtaskVosServerClose, &wp); - } - - // Return our entry in the RefSec array back to the pool. - // If the request was never canceled, there is another - // thread waiting to hear our results--update the server - // entry specified by RefSec before leaving. - // - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllSectionEnd, NULL, NULL, NULL, NULL, idSection, 0); - - EnterCriticalSection (pcsRefSec); - if ( (aRefSec[ idSection ].fInUse) && (!aRefSec[ idSection ].fCanceled) ) - { - aRefSec[ idSection ].lpServer->m_fCanGetAggregates = fAggregatesOK; - aRefSec[ idSection ].lpServer->m_fCanGetServices = fServicesOK; - } - aRefSec[ idSection ].fInUse = FALSE; - LeaveCriticalSection (pcsRefSec); - return 1; -} - - -BOOL SERVER::CanTalkToServer (ULONG *pStatus) -{ - // Ensure the server exists in the cell at all-- - // this call just updates the server's IP addresses - // etc (information it gets from the database servers) - // and doesn't require talking to the server itself. - // - if (!RefreshStatus (FALSE, pStatus)) - return FALSE; - - // Find a new refsec array element to use... - // - AfsClass_InitRefreshSections(); - EnterCriticalSection (pcsRefSec); - - for (int idSection = 0; idSection < (int)cRefSec; ++idSection) - { - if (!aRefSec[ idSection ].fInUse) - break; - } - if (idSection == (int)cRefSec) - { - if (!REALLOC (aRefSec, cRefSec, 1+idSection, 4)) - { - if (pStatus) - *pStatus = GetLastError(); - LeaveCriticalSection (pcsRefSec); - return FALSE; - } - } - aRefSec[ idSection ].fInUse = TRUE; - aRefSec[ idSection ].fCanceled = FALSE; - aRefSec[ idSection ].lpServer = this; - aRefSec[ idSection ].hCell = NULL; - - LPCELL lpCell; - if ((lpCell = OpenCell()) != NULL) - { - aRefSec[ idSection ].hCell = lpCell->GetCellObject(); - lpCell->Close(); - } - - LeaveCriticalSection (pcsRefSec); - - // Until we find out differently, assume that we won't be - // able to query VOS or BOS on this server. - // - m_fCanGetAggregates = FALSE; - m_fCanGetServices = FALSE; - m_lastStatus = 0; - - // Fork a separate thread, on which to quickly try to talk - // to the server. - // - DWORD dwThreadID; - HANDLE hThread; - if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)CanTalkToServer_ThreadProc, (PVOID)idSection, 0, &dwThreadID)) == NULL) - { - EnterCriticalSection (pcsRefSec); - aRefSec[ idSection ].fInUse = FALSE; - LeaveCriticalSection (pcsRefSec); - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL); - - // Wait for that thread to terminate, or for our - // newly-allocated RefSec entry to be marked Canceled. - // - for (DWORD dw = STILL_ACTIVE; dw == STILL_ACTIVE; ) - { - EnterCriticalSection (pcsRefSec); - - GetExitCodeThread (hThread, &dw); - if (dw == STILL_ACTIVE) - { - if ( (aRefSec[ idSection ].fInUse) && - (aRefSec[ idSection ].lpServer == this) && - (aRefSec[ idSection ].fCanceled) ) - { - if (m_lastStatus == 0) - m_lastStatus = ERROR_CANCELLED; - dw = 0; - } - } - - LeaveCriticalSection (pcsRefSec); - - if (dw == STILL_ACTIVE) - Sleep(100); // wait another brief instant - } - - // dw == 0 : user canceled operation (thread is still running!) - // dw == 1 : thread completed successfully, and set fCanTalkTo* flags. - // - // Note that the thread will clear aRefSec[idSection].fInUse when it - // terminates (so, if dw!=-1, it has already done so). - // - if (pStatus) - *pStatus = m_lastStatus; - return (dw == 0) ? FALSE : TRUE; -} - - -BOOL SERVER::RefreshAll (ULONG *pStatus, double dInit, double dFactor) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (m_fAggregatesOutOfDate || m_fServicesOutOfDate) - { - if ((++cRefreshAllReq) == 1) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllBegin, GetIdentifier(), 0); - } - - double perAGGREGATES = 65.0; // % of time spent finding aggs & sets - double perSERVICES = 25.0; // % of time spent finding services - double perVLDB = 10.0; // % of time spent finding VLDB info - - if (cRefreshAllReq >= 2) // being called as part of a cell-wide op? - { - perAGGREGATES = 80.0; // % of time spent finding aggs & sets - perSERVICES = 20.0; // % of time spent finding services - perVLDB = 0.0; // we won't query VLDB stuff ourself. - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - if (!CanTalkToServer (&status)) // Determines fCanGetAggregates, fCanGetServices - { - if (m_fMonitor) - SetMonitor (FALSE); - rc = FALSE; - } - else - { - if (!m_fCanGetAggregates) - { - FreeAggregates(); - m_fAggregatesOutOfDate = FALSE; - } - else - { - size_t nAggregates = 0; - size_t iAggregate = 0; - HENUM hEnum; - for (LPAGGREGATE lpAggregate = AggregateFindFirst (&hEnum); lpAggregate; lpAggregate = AggregateFindNext (&hEnum)) - { - ++nAggregates; - lpAggregate->Close(); - } - - if (nAggregates) - { - for (lpAggregate = AggregateFindFirst (&hEnum); lpAggregate; lpAggregate = AggregateFindNext (&hEnum)) - { - ULONG perComplete = (ULONG)( ((double)perAGGREGATES / 100.0) * ((double)iAggregate * 100.0 / nAggregates) ); - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllUpdate, lpAggregate->GetIdentifier(), NULL, NULL, NULL, (ULONG)( 100.0 * dInit + dFactor * (double)perComplete ), 0); - - lpAggregate->RefreshFilesets (TRUE); - lpAggregate->Close(); - - ++iAggregate; - } - } - } - - if (!m_fCanGetServices) - { - FreeServices(); - m_fServicesOutOfDate = FALSE; - } - else - { - size_t nServices = 0; - size_t iService = 0; - HENUM hEnum; - for (LPSERVICE lpService = ServiceFindFirst (&hEnum); lpService; lpService = ServiceFindNext (&hEnum)) - { - ++nServices; - lpService->Close(); - } - - if (nServices) - { - for (lpService = ServiceFindFirst (&hEnum); lpService; lpService = ServiceFindNext (&hEnum)) - { - ULONG perComplete = (ULONG)( (double)perAGGREGATES + ((double)perSERVICES / 100.0) * ((double)iService * 100.0 / nServices) ); - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllUpdate, lpService->GetIdentifier(), NULL, NULL, NULL, (ULONG)( 100.0 * dInit + dFactor * (double)perComplete ), 0); - - lpService->RefreshStatus (TRUE); - lpService->Close(); - - ++iService; - } - } - } - - if (cRefreshAllReq == 1) // not being called as part of a cell-wide op? - { - LPCELL lpCell; - if ((lpCell = OpenCell()) != NULL) - { - lpCell->RefreshVLDB (GetIdentifier(), TRUE, NULL); - lpCell->Close(); - } - } - } - - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), m_lastStatus); - - if ((--cRefreshAllReq) == 0) - { - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllEnd, GetIdentifier(), NULL, NULL, NULL, 100, m_lastStatus); - } - } - - if (rc && m_lastStatus) - rc = FALSE; - if (!rc && pStatus) - *pStatus = status; - return rc; -} - - -/* - * AGGREGATES _________________________________________________________________ - * - */ - -LPAGGREGATE SERVER::OpenAggregate (LPTSTR pszName, ULONG *pStatus) -{ - if (!RefreshAggregates (TRUE, pStatus)) - return NULL; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = (LPAGGREGATE)(m_lkAggregateName->GetFirstObject (pszName))) != NULL) - AfsClass_Enter(); - - return lpAggregate; -} - - -LPAGGREGATE SERVER::OpenAggregate (ULONG dwID, ULONG *pStatus) -{ - if (!RefreshAggregates (TRUE, pStatus)) - return NULL; - - LPAGGREGATE lpAggregate; - if ((lpAggregate = (LPAGGREGATE)(m_lkAggregateID->GetFirstObject (&dwID))) != NULL) - AfsClass_Enter(); - - return lpAggregate; -} - - -LPAGGREGATE SERVER::AggregateFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus) -{ - return AggregateFindFirst (phEnum, NULL, fNotify, pStatus); -} - - -LPAGGREGATE SERVER::AggregateFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus) -{ - LPAGGREGATE lpAggregate = NULL; - - if (!RefreshAggregates (fNotify, pStatus)) - return NULL; - - if (lpiFind != NULL) - { - lpAggregate = lpiFind->OpenAggregate(); - *phEnum = NULL; - } - else if ((*phEnum = m_lAggregates->FindFirst()) != NULL) - { - lpAggregate = (LPAGGREGATE)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - - if (!lpAggregate && pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - return lpAggregate; -} - - -LPAGGREGATE SERVER::AggregateFindNext (HENUM *phEnum) -{ - LPAGGREGATE lpAggregate = NULL; - - if (*phEnum) - { - if ((*phEnum = (*phEnum)->FindNext()) != NULL) - { - lpAggregate = (LPAGGREGATE)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - } - - return lpAggregate; -} - - -void SERVER::AggregateFindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - - -/* - * SERVICES ___________________________________________________________________ - * - */ - -LPSERVICE SERVER::OpenService (LPTSTR pszName, ULONG *pStatus) -{ - if (!RefreshServices (TRUE, pStatus)) - return NULL; - - LPSERVICE lpService; - if ((lpService = (LPSERVICE)(m_lkServiceName->GetFirstObject (pszName))) != NULL) - AfsClass_Enter(); - - return lpService; -} - - -LPSERVICE SERVER::ServiceFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus) -{ - return ServiceFindFirst (phEnum, NULL, fNotify, pStatus); -} - - -LPSERVICE SERVER::ServiceFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus) -{ - LPSERVICE lpService = NULL; - - if (!RefreshServices (fNotify, pStatus)) - return NULL; - - if (lpiFind != NULL) - { - lpService = lpiFind->OpenService(); - *phEnum = NULL; - } - else if ((*phEnum = m_lServices->FindFirst()) != NULL) - { - lpService = (LPSERVICE)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - - if (!lpService && pStatus) - *pStatus = ERROR_FILE_NOT_FOUND; - return lpService; -} - - -LPSERVICE SERVER::ServiceFindNext (HENUM *phEnum) -{ - LPSERVICE lpService = NULL; - - if (*phEnum) - { - if ((*phEnum = (*phEnum)->FindNext()) != NULL) - { - lpService = (LPSERVICE)( (*phEnum)->GetObject() ); - AfsClass_Enter(); - } - } - - return lpService; -} - - -void SERVER::ServiceFindClose (HENUM *phEnum) -{ - if (*phEnum) - { - Delete (*phEnum); - *phEnum = NULL; - } -} - - -/* - * HASH KEYS __________________________________________________________________ - * - */ - -BOOL CALLBACK SERVER::KeyAggregateName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmp (((LPAGGREGATE)pObject)->m_szName, (LPTSTR)pData); -} - -HASHVALUE CALLBACK SERVER::KeyAggregateName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return SERVER::KeyAggregateName_HashData (pKey, ((LPAGGREGATE)pObject)->m_szName); -} - -HASHVALUE CALLBACK SERVER::KeyAggregateName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - - -BOOL CALLBACK SERVER::KeyAggregateID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return (((LPAGGREGATE)pObject)->m_as.dwID == *(ULONG*)pData); -} - -HASHVALUE CALLBACK SERVER::KeyAggregateID_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return SERVER::KeyAggregateID_HashData (pKey, &((LPAGGREGATE)pObject)->m_as.dwID); -} - -HASHVALUE CALLBACK SERVER::KeyAggregateID_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return (HASHVALUE)*(ULONG*)pData; -} - - -BOOL CALLBACK SERVER::KeyServiceName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return !lstrcmp (((LPSERVICE)pObject)->m_szName, (LPTSTR)pData); -} - -HASHVALUE CALLBACK SERVER::KeyServiceName_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return SERVER::KeyServiceName_HashData (pKey, ((LPSERVICE)pObject)->m_szName); -} - -HASHVALUE CALLBACK SERVER::KeyServiceName_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return HashString ((LPTSTR)pData); -} - diff --git a/src/WINNT/afsclass/c_svr.h b/src/WINNT/afsclass/c_svr.h deleted file mode 100644 index a9f80c828..000000000 --- a/src/WINNT/afsclass/c_svr.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_SERVER_H -#define AFSCLASS_SERVER_H - -#include - - -/* - * SERVER CLASS _______________________________________________________________ - * - */ - -#define AFSCLASS_MAX_ADDRESSES_PER_SITE 16 - -typedef struct - { - size_t nAddresses; - SOCKADDR_IN aAddresses[ AFSCLASS_MAX_ADDRESSES_PER_SITE ]; - } SERVERSTATUS, *LPSERVERSTATUS; - -class SERVER - { - friend class CELL; - friend class SERVICE; - friend class AGGREGATE; - friend class IDENT; - - public: - void Close (void); - void Invalidate (void); - void InvalidateStatus (void); - void InvalidateServices (void); - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - BOOL RefreshServices (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - BOOL RefreshAggregates (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - BOOL RefreshAll (ULONG *pStatus = NULL, double dInit = 0.0, double dFactor = 1.0); - - static void ShortenName (LPTSTR pszTarget, LPTSTR pszSource, BOOL fForce = FALSE); - - // Server properties - // - BOOL fIsMonitored (void); - BOOL SetMonitor (BOOL fShouldMonitor, ULONG *pStatus = NULL); - - LPIDENT GetIdentifier (void); - LPCELL OpenCell (ULONG *pStatus = NULL); - void GetName (LPTSTR pszName); - void GetLongName (LPTSTR pszName); - - short GetGhostStatus (void); // returns GHOST_* - BOOL GetStatus (LPSERVERSTATUS lpss, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - PVOID OpenBosObject (PVOID *phCell = NULL, ULONG *pStatus = NULL); - BOOL CloseBosObject (ULONG *pStatus = NULL); - - PVOID OpenVosObject (PVOID *phCell = NULL, ULONG *pStatus = NULL); - BOOL CloseVosObject (ULONG *pStatus = NULL); - - // Aggregates within a server - // - LPAGGREGATE OpenAggregate (LPTSTR pszName, ULONG *pStatus = NULL); - LPAGGREGATE OpenAggregate (ULONG dwID, ULONG *pStatus = NULL); - LPAGGREGATE AggregateFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPAGGREGATE AggregateFindFirst (HENUM *phEnum, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPAGGREGATE AggregateFindNext (HENUM *phEnum); - void AggregateFindClose (HENUM *phEnum); - - // Services within a server - // - LPSERVICE OpenService (LPTSTR pszName, ULONG *pStatus = NULL); - LPSERVICE ServiceFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPSERVICE ServiceFindFirst (HENUM *phEnum, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - LPSERVICE ServiceFindNext (HENUM *phEnum); - void ServiceFindClose (HENUM *phEnum); - - private: - SERVER (LPCELL lpCellParent, LPTSTR pszName); - ~SERVER (void); - void FreeAll (void); - void FreeAggregates (void); - void FreeServices (void); - void SendDeleteNotifications (void); - - BOOL CanTalkToServer (ULONG *pStatus = NULL); - static DWORD WINAPI CanTalkToServer_ThreadProc (PVOID lp); - - static BOOL CALLBACK KeyAggregateName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK KeyAggregateName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK KeyAggregateName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK KeyAggregateID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK KeyAggregateID_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK KeyAggregateID_HashData (LPHASHLISTKEY pKey, PVOID pData); - - static BOOL CALLBACK KeyServiceName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); - static HASHVALUE CALLBACK KeyServiceName_HashObject (LPHASHLISTKEY pKey, PVOID pObject); - static HASHVALUE CALLBACK KeyServiceName_HashData (LPHASHLISTKEY pKey, PVOID pData); - - private: - LPIDENT m_lpiCell; - TCHAR m_szName[ cchNAME ]; - - LPCELL m_lpCellBOS; - PVOID m_hCellBOS; - PVOID m_hBOS; - size_t m_cReqBOS; - - PVOID m_hCellVOS; - PVOID m_hVOS; - size_t m_cReqVOS; - - short m_wGhost; - LPIDENT m_lpiThis; - BOOL m_fMonitor; - ULONG m_lastStatus; - - BOOL m_fCanGetAggregates; - BOOL m_fAggregatesOutOfDate; - LPHASHLIST m_lAggregates; - LPHASHLISTKEY m_lkAggregateName; - LPHASHLISTKEY m_lkAggregateID; - - BOOL m_fCanGetServices; - BOOL m_fServicesOutOfDate; - LPHASHLIST m_lServices; - LPHASHLISTKEY m_lkServiceName; - - BOOL m_fVLDBOutOfDate; - BOOL m_fStatusOutOfDate; - SERVERSTATUS m_ss; - - BOOL m_fDelete; - }; - - -#endif // AFSCLASS_SERVER_H - diff --git a/src/WINNT/afsclass/c_usr.cpp b/src/WINNT/afsclass/c_usr.cpp deleted file mode 100644 index dafe17424..000000000 --- a/src/WINNT/afsclass/c_usr.cpp +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define USERACCESS_TO_ACCOUNTACCESS(_ua) ( ((_ua) == PTS_USER_OWNER_ACCESS) ? aaOWNER_ONLY : aaANYONE ) - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -USER::USER (LPCELL lpCellParent, LPTSTR pszPrincipal, LPTSTR pszInstance) -{ - m_lpiCell = lpCellParent->GetIdentifier(); - lstrcpy (m_szPrincipal, pszPrincipal); - lstrcpy (m_szInstance, (pszInstance) ? pszInstance : TEXT("")); - - m_lpiThis = NULL; - m_fStatusOutOfDate = TRUE; - m_mszOwnerOf = NULL; - m_mszMemberOf = NULL; - memset(&m_us, 0, sizeof(m_us)); -} - - -USER::~USER (void) -{ - if (m_lpiThis) - m_lpiThis->m_cRef --; - - FreeString (m_mszOwnerOf); - FreeString (m_mszMemberOf); -} - - -void USER::SendDeleteNotifications (void) -{ - NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier()); -} - - -void USER::Close (void) -{ - AfsClass_Leave(); -} - - -LPIDENT USER::GetIdentifier (void) -{ - if (m_lpiThis == NULL) - { - if ((m_lpiThis = IDENT::FindIdent (this)) == NULL) - m_lpiThis = New2 (IDENT,(this)); - m_lpiThis->m_cRef ++; - } - - return m_lpiThis; -} - - -void USER::Invalidate (void) -{ - m_fStatusOutOfDate = TRUE; -} - - -LPCELL USER::OpenCell (ULONG *pStatus) -{ - return m_lpiCell->OpenCell (pStatus); -} - - -void USER::GetName (LPTSTR pszPrincipal, LPTSTR pszInstance) -{ - if (pszPrincipal) - lstrcpy (pszPrincipal, m_szPrincipal); - if (pszInstance) - lstrcpy (pszInstance, m_szInstance); -} - - -BOOL USER::GetStatus (LPUSERSTATUS lpus, BOOL fNotify, ULONG *pStatus) -{ - if (!RefreshStatus (fNotify, pStatus)) - return FALSE; - - memcpy (lpus, &m_us, sizeof(USERSTATUS)); - return TRUE; -} - - -PVOID USER::GetUserParam (void) -{ - return GetIdentifier()->GetUserParam(); -} - - -void USER::SetUserParam (PVOID pUserParam) -{ - GetIdentifier()->SetUserParam (pUserParam); -} - - -BOOL USER::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus) -{ - if (!RefreshStatus (TRUE, pStatus)) - return FALSE; - *ppmsz = CloneMultiString (m_mszOwnerOf); - return TRUE; -} - - -BOOL USER::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus) -{ - if (!RefreshStatus (TRUE, pStatus)) - return FALSE; - *ppmsz = CloneMultiString (m_mszMemberOf); - return TRUE; -} - - -BOOL USER::RefreshStatus (BOOL fNotify, ULONG *pStatus) -{ - BOOL rc = TRUE; - DWORD status = 0; - DWORD kasStatus = 0; - DWORD ptsStatus = 0; - - if (m_fStatusOutOfDate) - { - m_fStatusOutOfDate = FALSE; - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); - - memset (&m_us, 0x00, sizeof(m_us)); - - FreeString (m_mszOwnerOf); - m_mszOwnerOf = NULL; - - FreeString (m_mszMemberOf); - m_mszMemberOf = NULL; - - TCHAR szFullName[ cchNAME ]; - AfsClass_GenFullUserName (szFullName, m_szPrincipal, m_szInstance); - - LPCELL lpCell; - if ((lpCell = OpenCell (&status)) == NULL) - rc = FALSE; - else - { - PVOID hCell; - if ((hCell = lpCell->GetCellObject (&status)) == NULL) - rc = FALSE; - else - { - // Try to get KAS information. - // - WORKERPACKET wpGetKas; - wpGetKas.wpKasPrincipalGet.hCell = hCell; - wpGetKas.wpKasPrincipalGet.hServer = lpCell->GetKasObject (&kasStatus); - wpGetKas.wpKasPrincipalGet.pszPrincipal = m_szPrincipal; - wpGetKas.wpKasPrincipalGet.pszInstance = m_szInstance; - - if (Worker_DoTask (wtaskKasPrincipalGet, &wpGetKas, &kasStatus)) - { - m_us.fHaveKasInfo = TRUE; - - TCHAR szLastModPrincipal[ cchNAME ]; - TCHAR szLastModInstance[ cchNAME ]; - CopyAnsiToString (szLastModPrincipal, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.principal); - CopyAnsiToString (szLastModInstance, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.instance); - - m_us.KASINFO.fIsAdmin = (wpGetKas.wpKasPrincipalGet.Data.adminSetting == KAS_ADMIN) ? TRUE : FALSE; - m_us.KASINFO.fCanGetTickets = (wpGetKas.wpKasPrincipalGet.Data.tgsSetting == TGS) ? TRUE : FALSE; - m_us.KASINFO.fEncrypt = (wpGetKas.wpKasPrincipalGet.Data.encSetting == ENCRYPT) ? TRUE : FALSE; - m_us.KASINFO.fCanChangePassword = (wpGetKas.wpKasPrincipalGet.Data.cpwSetting == CHANGE_PASSWORD) ? TRUE : FALSE; - m_us.KASINFO.fCanReusePasswords = (wpGetKas.wpKasPrincipalGet.Data.rpwSetting == REUSE_PASSWORD) ? TRUE : FALSE; - AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeExpires, wpGetKas.wpKasPrincipalGet.Data.userExpiration); - AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastPwChange, wpGetKas.wpKasPrincipalGet.Data.lastChangePasswordTime); - AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastMod, wpGetKas.wpKasPrincipalGet.Data.lastModTime); - m_us.KASINFO.lpiLastMod = IDENT::FindUser (m_lpiCell, szLastModPrincipal, szLastModInstance); - m_us.KASINFO.csecTicketLifetime = wpGetKas.wpKasPrincipalGet.Data.maxTicketLifetime; - m_us.KASINFO.keyVersion = wpGetKas.wpKasPrincipalGet.Data.keyVersion; - memcpy (&m_us.KASINFO.key.key, &wpGetKas.wpKasPrincipalGet.Data.key.key, ENCRYPTIONKEY_LEN); - m_us.KASINFO.dwKeyChecksum = wpGetKas.wpKasPrincipalGet.Data.keyCheckSum; - m_us.KASINFO.cdayPwExpire = wpGetKas.wpKasPrincipalGet.Data.daysToPasswordExpire; - m_us.KASINFO.cFailLogin = wpGetKas.wpKasPrincipalGet.Data.failLoginCount; - m_us.KASINFO.csecFailLoginLock = wpGetKas.wpKasPrincipalGet.Data.lockTime; - } - - // Try to get PTS information. - // - WORKERPACKET wpGetPts; - wpGetPts.wpPtsUserGet.hCell = hCell; - wpGetPts.wpPtsUserGet.pszUser = szFullName; - if (Worker_DoTask (wtaskPtsUserGet, &wpGetPts, &ptsStatus)) - { - m_us.fHavePtsInfo = TRUE; - - m_us.PTSINFO.cgroupCreationQuota = wpGetPts.wpPtsUserGet.Entry.groupCreationQuota; - m_us.PTSINFO.cgroupMember = wpGetPts.wpPtsUserGet.Entry.groupMembershipCount; - m_us.PTSINFO.uidName = wpGetPts.wpPtsUserGet.Entry.nameUid; - m_us.PTSINFO.uidOwner = wpGetPts.wpPtsUserGet.Entry.ownerUid; - m_us.PTSINFO.uidCreator = wpGetPts.wpPtsUserGet.Entry.creatorUid; - - CopyAnsiToString (m_us.PTSINFO.szOwner, wpGetPts.wpPtsUserGet.Entry.owner); - CopyAnsiToString (m_us.PTSINFO.szCreator, wpGetPts.wpPtsUserGet.Entry.creator); - - m_us.PTSINFO.aaListStatus = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listStatus); - m_us.PTSINFO.aaGroupsOwned = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listGroupsOwned); - m_us.PTSINFO.aaMembership = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listMembership); - } - - // Grab the list of groups to which this user belongs - // - WORKERPACKET wpBegin; - wpBegin.wpPtsUserMemberListBegin.hCell = hCell; - wpBegin.wpPtsUserMemberListBegin.pszUser = szFullName; - if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status)) - { - for (;;) - { - TCHAR szGroup[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum; - wpNext.wpPtsUserMemberListNext.pszGroup = szGroup; - if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext)) - break; - - FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup); - } - - WORKERPACKET wpDone; - wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum; - Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone); - } - - // Grab the list of groups which this user owns - // - wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell; - wpBegin.wpPtsOwnedGroupListBegin.pszOwner = szFullName; - if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status)) - { - for (;;) - { - TCHAR szGroup[ cchNAME ]; - - WORKERPACKET wpNext; - wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum; - wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup; - if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext)) - break; - - FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup); - } - - WORKERPACKET wpDone; - wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum; - Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone); - } - } - - lpCell->Close(); - } - - if (fNotify) - NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); - } - - if (rc && (!m_us.fHaveKasInfo) && (!status) && kasStatus) - { - status = kasStatus; - rc = FALSE; - } - if (rc && (!m_us.fHavePtsInfo) && (!status) && ptsStatus) - { - status = ptsStatus; - // not fatal; rc remains TRUE - } - if (pStatus && !rc) - *pStatus = status; - return TRUE; -} - - -void USER::SplitUserName (LPCTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance) -{ - if (pszName) - lstrcpy (pszName, pszFull); - if (pszInstance) - lstrcpy (pszInstance, TEXT("")); - - if (!USER::IsMachineAccount (pszFull)) - { - if (pszName && pszInstance) - { - LPTSTR pchDot; - if ((pchDot = (LPTSTR)lstrchr (pszName, TEXT('.'))) != NULL) - { - *pchDot = TEXT('\0'); - lstrcpy (pszInstance, &pchDot[1]); - } - } - } -} - - -BOOL USER::IsMachineAccount (LPCTSTR pszName) -{ - for ( ; pszName && *pszName; ++pszName) - { - if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) )) - return FALSE; - } - return TRUE; -} - diff --git a/src/WINNT/afsclass/c_usr.h b/src/WINNT/afsclass/c_usr.h deleted file mode 100644 index c25db4e23..000000000 --- a/src/WINNT/afsclass/c_usr.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCLASS_USER_H -#define AFSCLASS_USER_H - -#include -#include - - -/* - * USER CLASS _________________________________________________________________ - * - */ - -typedef struct USERSTATUS - { - BOOL fHaveKasInfo; - BOOL fHavePtsInfo; - - struct - { - BOOL fIsAdmin; - BOOL fCanGetTickets; - BOOL fEncrypt; - BOOL fCanChangePassword; - BOOL fCanReusePasswords; - SYSTEMTIME timeExpires; - SYSTEMTIME timeLastPwChange; - SYSTEMTIME timeLastMod; - LPIDENT lpiLastMod; - LONG csecTicketLifetime; - int keyVersion; - ENCRYPTIONKEY key; - DWORD dwKeyChecksum; - LONG cdayPwExpire; - LONG cFailLogin; - LONG csecFailLoginLock; - } KASINFO; - - struct - { - LONG cgroupCreationQuota; - LONG cgroupMember; - int uidName; - int uidOwner; - int uidCreator; - TCHAR szOwner[ cchNAME ]; - TCHAR szCreator[ cchNAME ]; - ACCOUNTACCESS aaListStatus; - ACCOUNTACCESS aaGroupsOwned; - ACCOUNTACCESS aaMembership; - } PTSINFO; - - } USERSTATUS, *LPUSERSTATUS; - - -class USER - { - friend class CELL; - friend class IDENT; - friend class PTSGROUP; - - public: - void Close (void); - void Invalidate (void); - BOOL RefreshStatus (BOOL fNotify = TRUE, ULONG *pStatus = NULL); - - // User properties - // - LPIDENT GetIdentifier (void); - LPCELL OpenCell (ULONG *pStatus = NULL); - void GetName (LPTSTR pszPrincipal, LPTSTR pszInstance = NULL); - - BOOL GetStatus (LPUSERSTATUS lpus, BOOL fNotify = TRUE, ULONG *pStatus = NULL); - - PVOID GetUserParam (void); - void SetUserParam (PVOID pUserParam); - - // Groups - // - BOOL GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus = NULL); - BOOL GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus = NULL); - - static void SplitUserName (LPCTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance); - static BOOL IsMachineAccount (LPCTSTR pszName); - - private: - USER (LPCELL lpCellParent, LPTSTR pszPrincipal, LPTSTR pszInstance); - ~USER (void); - void SendDeleteNotifications (void); - - private: - LPIDENT m_lpiCell; - TCHAR m_szPrincipal[ cchNAME ]; - TCHAR m_szInstance[ cchNAME ]; - - LPIDENT m_lpiThis; - - BOOL m_fStatusOutOfDate; - USERSTATUS m_us; - - LPTSTR m_mszOwnerOf; - LPTSTR m_mszMemberOf; - }; - - -#endif // AFSCLASS_USER_H - diff --git a/src/WINNT/afsclass/internal.cpp b/src/WINNT/afsclass/internal.cpp deleted file mode 100644 index 9bfbd583e..000000000 --- a/src/WINNT/afsclass/internal.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" - -#define LOCAL_CRITSEC_COUNT - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -#ifdef LOCAL_CRITSEC_COUNT -size_t cs_EnterCount = 0; -DWORD cs_ThreadID = 0; -#endif - -size_t cRefreshAllReq = 0; - -CRITICAL_SECTION *pcs = NULL; -BOOL fLongServerNames = FALSE; - -DWORD dwWant = 0; - -static LPTSTR apszDays[] = { - TEXT("sun"), TEXT("mon"), TEXT("tue"), - TEXT("wed"), TEXT("thu"), TEXT("fri"), TEXT("sat") -}; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void AfsClass_InitCriticalSection (void) -{ - if (pcs == NULL) - { - pcs = New (CRITICAL_SECTION); - InitializeCriticalSection (pcs); - -#ifdef LOCAL_CRITSEC_COUNT - cs_EnterCount = 0; - cs_ThreadID = 0; -#endif - } -} - -LPCRITICAL_SECTION AfsClass_GetCriticalSection (void) -{ - AfsClass_InitCriticalSection(); - return pcs; -} - -void AfsClass_Enter (void) -{ - AfsClass_InitCriticalSection(); - EnterCriticalSection (pcs); - -#ifdef LOCAL_CRITSEC_COUNT - cs_EnterCount++; - cs_ThreadID = GetCurrentThreadId(); -#endif -} - -void AfsClass_Leave (void) -{ -#ifdef LOCAL_CRITSEC_COUNT - if (!ASSERT( cs_EnterCount > 0 )) - return; - if (!ASSERT( cs_ThreadID == GetCurrentThreadId() )) - return; - cs_EnterCount--; -#else - if (!ASSERT( pcs->RecursionCount > 0 )) - return; - if (!ASSERT( pcs->OwningThread == (PVOID)GetCurrentThreadId() )) - return; -#endif - LeaveCriticalSection (pcs); -} - -int AfsClass_GetEnterCount (void) -{ -#ifdef LOCAL_CRITSEC_COUNT - return (int)cs_EnterCount; -#else - return pcs->RecursionCount; -#endif -} - -void AfsClass_UnixTimeToSystemTime (LPSYSTEMTIME pst, ULONG ut, BOOL fElapsed) -{ - if (!ut) - { - memset (pst, 0x00, sizeof(SYSTEMTIME)); - return; - } - - // A Unix time is the number of seconds since 1/1/1970. - // The first step in this conversion is to change that count-of-seconds - // into a count-of-100ns-intervals... - // - LARGE_INTEGER ldw; - ldw.QuadPart = (LONGLONG)10000000 * (LONGLONG)ut; - - // Then adjust the count to be a count-of-100ns-intervals since - // 1/1/1601, instead of 1/1/1970. That means adding a *big* number... - // - ldw.QuadPart += (LONGLONG)0x019DB1DED53E8000; - - // Now the count is effectively a FILETIME, which we can convert - // to a SYSTEMTIME with a Win32 API. - // - FILETIME ft; - ft.dwHighDateTime = (DWORD)ldw.HighPart; - ft.dwLowDateTime = (DWORD)ldw.LowPart; - FileTimeToSystemTime (&ft, pst); - - if (fElapsed) - { - pst->wYear -= 1970; - pst->wMonth -= 1; - pst->wDayOfWeek -= 1; - pst->wDay -= 1; - } -} - - -ULONG AfsClass_SystemTimeToUnixTime (LPSYSTEMTIME pst) -{ - SYSTEMTIME st; - if (pst == NULL) - GetSystemTime (&st); - else - st = *pst; - - if (st.wYear == 1970) - return 0; - - FILETIME ft; - if (!SystemTimeToFileTime (&st, &ft)) - return 0; - - LARGE_INTEGER now; - now.HighPart = (LONG)ft.dwHighDateTime; - now.LowPart = (ULONG)ft.dwLowDateTime; - - LARGE_INTEGER offset; - offset.HighPart = 0x019db1de; - offset.LowPart = 0xd53e8000; - - LARGE_INTEGER result; - result.QuadPart = (now.QuadPart - offset.QuadPart) / 10000000; - return (ULONG)result.LowPart; -} - - -void AfsClass_ElapsedTimeToSeconds (ULONG *pcSeconds, LPSYSTEMTIME pet) -{ - *pcSeconds = 0; - if (pet) - { - *pcSeconds += pet->wSecond; - *pcSeconds += pet->wMinute * 60L; - *pcSeconds += pet->wHour * 60L * 60L; - *pcSeconds += pet->wDay * 60L * 60L * 24L; - } -} - - -double AfsClass_FileTimeToDouble (FILETIME *pft) -{ - double rc; - rc = (double)pft->dwHighDateTime * (double)0x100000000; - rc += (double)pft->dwLowDateTime; - return rc; -} - - -void AfsClass_RequestLongServerNames (BOOL fLong) -{ - fLongServerNames = fLong; -} - - -void AfsClass_ParseRecurringTime (BOOL *pfEver, LPSYSTEMTIME pst, LPTSTR pszTime) -{ - *pfEver = FALSE; - memset (pst, 0x00, sizeof(SYSTEMTIME)); - - if (lstrcmpi (pszTime, TEXT("never"))) - { - *pfEver = TRUE; - - if (!lstrncmpi (pszTime, TEXT("at"), lstrlen(TEXT("at")))) - pszTime += lstrlen(TEXT("at")); - while ((*pszTime == ' ') || (*pszTime == '\t')) - ++pszTime; - - // first, does it start with a day-of-week? - // - pst->wDayOfWeek = (WORD)(-1); // daily until proven otherwise - - for (size_t ii = 0; ii < 7; ++ii) - { - if (!lstrncmpi (apszDays[ii], pszTime, 3)) - { - pst->wDayOfWeek = ii; - break; - } - } - - // next, find the hour - // - while (*pszTime && !isdigit(*pszTime)) - ++pszTime; - - TCHAR szComponent[ cchRESOURCE ]; - lstrcpy (szComponent, pszTime); - for (LPTSTR pch = szComponent; isdigit(*pch); ++pch) - ; - *pch = TEXT('\0'); - - pst->wHour = atoi(szComponent); - - // next, find the minutes - // - while (isdigit(*pszTime)) - ++pszTime; - while (*pszTime && !isdigit(*pszTime)) - ++pszTime; - - lstrcpy (szComponent, pszTime); - for (pch = szComponent; isdigit(*pch); ++pch) - ; - *pch = TEXT('\0'); - - pst->wMinute = atoi(szComponent); - - // next, check for a 'am' or 'pm' marker - // - for ( ; *pszTime; ++pszTime) - { - if (tolower(*pszTime) == TEXT('p')) - { - if (pst->wHour < 12) - pst->wHour += 12; - break; - } - if (tolower(*pszTime) == TEXT('a')) - { - if (pst->wHour >= 12) - pst->wHour -= 12; - break; - } - } - } -} - - -void AfsClass_FormatRecurringTime (LPTSTR pszTarget, SYSTEMTIME *pst) -{ - if (pst == NULL) - { - wsprintf (pszTarget, TEXT("never")); - } - else - { - WORD wHour = ((pst->wHour % 12) == 0) ? 12 : (pst->wHour % 12); - TCHAR szAMPM[3]; - lstrcpy (szAMPM, (pst->wHour >= 12) ? TEXT("pm") : TEXT("am")); - - if (pst->wDayOfWeek == (WORD)(-1)) // daily at specified time? - { - wsprintf (pszTarget, TEXT("%u:%02u %s"), wHour, pst->wMinute, szAMPM); - } - else // weekly on specified date at specified time? - { - wsprintf (pszTarget, TEXT("%s %u:%02u %s"), apszDays[ pst->wDayOfWeek ], wHour, pst->wMinute, szAMPM); - } - } -} - - -void AfsClass_SplitFilename (LPSTR pszDirectoryA, LPSTR pszFilenameA, LPTSTR pszFullName) -{ - CopyStringToAnsi (pszDirectoryA, pszFullName); - - LPSTR pszLastSlashA = NULL; - for (LPSTR pszA = pszDirectoryA; *pszA; ++pszA) - { - if ((*pszA == '/') || (*pszA == '\\')) - pszLastSlashA = pszA; - } - - if (!pszLastSlashA) - { - strcpy (pszFilenameA, pszDirectoryA); - *pszDirectoryA = 0; - } - else - { - strcpy (pszFilenameA, 1+pszLastSlashA); - *pszLastSlashA = 0; - } -} - - -void AfsClass_SystemTimeToRestartTime (bos_RestartTime_p prt, BOOL fEnable, LPSYSTEMTIME pst) -{ - memset (prt, 0x00, sizeof(bos_RestartTime_t)); - if (!fEnable) - prt->mask = BOS_RESTART_TIME_NEVER; - else - { - prt->mask = (bos_RestartTimeFields_t)(BOS_RESTART_TIME_HOUR | BOS_RESTART_TIME_MINUTE); - prt->hour = pst->wHour; - prt->min = pst->wMinute; - - if (pst->wDayOfWeek != (WORD)-1) - { - prt->mask = (bos_RestartTimeFields_t)(prt->mask | BOS_RESTART_TIME_DAY); - prt->day = pst->wDayOfWeek; - } - } -} - - -void AfsClass_RestartTimeToSystemTime (BOOL *pfEnable, LPSYSTEMTIME pst, bos_RestartTime_p prt) -{ - memset (pst, 0x00, sizeof(SYSTEMTIME)); - - if ((!prt->mask) || (prt->mask & BOS_RESTART_TIME_NEVER)) - { - *pfEnable = FALSE; - } - else - { - *pfEnable = TRUE; - pst->wHour = (prt->mask & BOS_RESTART_TIME_HOUR) ? prt->hour : 0; - pst->wMinute = (prt->mask & BOS_RESTART_TIME_MINUTE) ? prt->min : 0; - pst->wDayOfWeek = (prt->mask & BOS_RESTART_TIME_DAY) ? prt->day : (WORD)-1; - } -} - - -void AfsClass_IntToAddress (LPSOCKADDR_IN pAddr, int IntAddr) -{ - memset (pAddr, 0x00, sizeof(SOCKADDR_IN)); - pAddr->sin_family = AF_INET; - pAddr->sin_addr.s_addr = htonl(IntAddr); -} - - -void AfsClass_AddressToInt (int *pIntAddr, LPSOCKADDR_IN pAddr) -{ - *pIntAddr = ntohl(pAddr->sin_addr.s_addr); -} - - -void AfsClass_SpecifyRefreshDomain (DWORD dwWantUser) -{ - dwWant = dwWantUser; -} - - -BOOL AfsClass_Initialize (ULONG *pStatus) -{ - if (!Worker_Initialize (pStatus)) - return FALSE; - - return TRUE; -} - - -void AfsClass_GenFullUserName (LPTSTR pszTarget, LPCTSTR pszPrincipal, LPCTSTR pszInstance) -{ - lstrcpy (pszTarget, pszPrincipal); - if (pszInstance && *pszInstance) - wsprintf (&pszTarget[ lstrlen(pszTarget) ], TEXT(".%s"), pszInstance); -} - diff --git a/src/WINNT/afsclass/internal.h b/src/WINNT/afsclass/internal.h deleted file mode 100644 index d60a28622..000000000 --- a/src/WINNT/afsclass/internal.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef INTERNAL_H -#define INTERNAL_H - -#include "worker.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_SERVERS 16 // allocate space for 16 servers at once - -#define cREALLOC_SERVICES 8 // allocate space for 8 svcs at once - -#define cREALLOC_AGGREGATES 16 // allocate space for 16 aggs at once - -#define cREALLOC_FILESETS 32 // allocate space for 32 sets at once - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -extern size_t cRefreshAllReq; - -extern BOOL fLongServerNames; - -extern DWORD dwWant; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -LPCRITICAL_SECTION AfsClass_GetCriticalSection (void); - -void AfsClass_ElapsedTimeToSeconds (ULONG *pcSeconds, LPSYSTEMTIME pet); - -void AfsClass_ParseRecurringTime (BOOL *pfEver, LPSYSTEMTIME pst, LPTSTR pszTime); -void AfsClass_FormatRecurringTime (LPTSTR pszTarget, SYSTEMTIME *pst); - -double AfsClass_FileTimeToDouble (FILETIME *pft); - -void AfsClass_SplitFilename (LPSTR pszDirectoryA, LPSTR pszFilenameA, LPTSTR pszFullName); - -void AfsClass_SystemTimeToRestartTime (bos_RestartTime_p prt, BOOL fEnable, LPSYSTEMTIME pst); -void AfsClass_RestartTimeToSystemTime (BOOL *pfEnable, LPSYSTEMTIME pst, bos_RestartTime_p prt); - -void AfsClass_GenFullUserName (LPTSTR pszTarget, LPCTSTR pszPrincipal, LPCTSTR pszInstance); - -#endif - diff --git a/src/WINNT/afsclass/worker.cpp b/src/WINNT/afsclass/worker.cpp deleted file mode 100644 index 8ba157e23..000000000 --- a/src/WINNT/afsclass/worker.cpp +++ /dev/null @@ -1,2402 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "internal.h" -#include - -extern "C" { -#include -} - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#if 0 -static LPCTSTR cszAFSVOSDLL = TCHAR("AfsVosAdmin.dll"); -static LPCTSTR cszAFSBOSDLL = TCHAR("AfsBosAdmin.dll"); -static LPCTSTR cszAFSKASDLL = TCHAR("AfsKasAdmin.dll"); -static LPCTSTR cszAFSPTSDLL = TCHAR("AfsPtsAdmin.dll"); -static LPCTSTR cszAFSUTILDLL = TCHAR("AfsAdminUtil.dll"); -static LPCTSTR cszAFSCLIENTDLL = TCHAR("AfsClientAdmin.dll"); -#else -static LPCTSTR cszAFSVOSDLL = __T("AfsVosAdmin.dll"); -static LPCTSTR cszAFSBOSDLL = __T("AfsBosAdmin.dll"); -static LPCTSTR cszAFSKASDLL = __T("AfsKasAdmin.dll"); -static LPCTSTR cszAFSPTSDLL = __T("AfsPtsAdmin.dll"); -static LPCTSTR cszAFSUTILDLL = __T("AfsAdminUtil.dll"); -static LPCTSTR cszAFSCLIENTDLL = __T("AfsClientAdmin.dll"); -#endif - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static HINSTANCE hiVOS = NULL; -static HINSTANCE hiBOS = NULL; -static HINSTANCE hiKAS = NULL; -static HINSTANCE hiPTS = NULL; -static HINSTANCE hiUtil = NULL; -static HINSTANCE hiClient = NULL; - - -/* - * .DLL PROTOTYPES ____________________________________________________________ - * - */ - -extern "C" { - -typedef int (ADMINAPI *lpVosBackupVolumeCreate_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosBackupVolumeCreateMultiple_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, const char *volumePrefix, vos_exclude_t excludePrefix, afs_status_p st); -typedef int (ADMINAPI *lpVosPartitionGet_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, vos_partitionEntry_p partitionP, afs_status_p st); -typedef int (ADMINAPI *lpVosPartitionGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpVosPartitionGetNext_t)(const void *iterationId, vos_partitionEntry_p partitionP, afs_status_p st); -typedef int (ADMINAPI *lpVosPartitionGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpVosServerOpen_t)(const void *cellHandle, const char *serverName, void **serverHandleP, afs_status_p st); -typedef int (ADMINAPI *lpVosServerClose_t)(const void *serverHandle, afs_status_p st); -typedef int (ADMINAPI *lpVosServerSync_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, vos_force_t force, afs_status_p st); -typedef int (ADMINAPI *lpVosFileServerAddressChange_t)(const void *cellHandle, vos_MessageCallBack_t callBack, int oldAddress, int newAddress, afs_status_p st); -typedef int (ADMINAPI *lpVosFileServerAddressRemove_t)(const void *cellHandle, vos_MessageCallBack_t callBack, int serverAddress, afs_status_p st); -typedef int (ADMINAPI *lpVosFileServerGetBegin_t)(const void *cellHandle, vos_MessageCallBack_t callBack, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpVosFileServerGetNext_t)(void *iterationId, vos_fileServerEntry_p serverEntryP, afs_status_p st); -typedef int (ADMINAPI *lpVosFileServerGetDone_t)(void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpVosServerTransactionStatusGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpVosServerTransactionStatusGetNext_t)(const void *iterationId, vos_serverTransactionStatus_p serverTransactionStatusP, afs_status_p st); -typedef int (ADMINAPI *lpVosServerTransactionStatusGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBGet_t)(const void *cellHandle, vos_MessageCallBack_t callBack, const unsigned int *volumeId, const char *volumeName, vos_vldbEntry_p vldbEntry, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int *partition, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBGetNext_t)(const void *iterationId, vos_vldbEntry_p vldbEntry, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBEntryRemove_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, unsigned int *volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBUnlock_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBEntryLock_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBEntryUnlock_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBReadOnlySiteCreate_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBReadOnlySiteDelete_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVLDBSync_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, vos_force_t force, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeCreate_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, const char *volumeName, unsigned int quota, unsigned int *volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeDelete_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeRename_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int readWriteVolumeId, const char *newVolumeName, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeDump_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int *partition, unsigned int volumeId, unsigned int startTime, const char *dumpFile, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeRestore_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int *volumeId, const char *volumeName, const char *dumpFile, vos_volumeRestoreType_t dumpType, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeOnline_t)(const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, unsigned int sleepTime, vos_volumeOnlineType_t volumeStatus, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeOffline_t)(const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeGet_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, vos_volumeEntry_p volumeP, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeGetNext_t)(const void *iterationId, vos_volumeEntry_p volumeP, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeMove_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, const void *fromServer, unsigned int fromPartition, const void *toServer, unsigned int toPartition, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeRelease_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, vos_force_t force, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeZap_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, vos_force_t force, afs_status_p st); -typedef int (ADMINAPI *lpVosPartitionNameToId_t)(const char *partitionName, unsigned int *partitionId, afs_status_p st); -typedef int (ADMINAPI *lpVosPartitionIdToName_t)(unsigned int partitionId, char *partitionName, afs_status_p st); -typedef int (ADMINAPI *lpVosVolumeQuotaChange_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, unsigned int volumeQuota, afs_status_p st); - -typedef int (ADMINAPI *lpBosServerOpen_t)(const void *cellHandle, const char *hostName, void **hostHandlePP, afs_status_p st); -typedef int (ADMINAPI *lpBosServerClose_t)(const void *hostHandleP, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessCreate_t)(const void *serverHandle, const char *processName, bos_ProcessType_t processType, const char *process, const char *cronTime, const char *notifier, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessDelete_t)(const void *serverHandle, const char *processName, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessExecutionStateGet_t)(const void *serverHandle, const char *processName, bos_ProcessExecutionState_p processStatusP, char *auxiliaryProcessStatus, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessExecutionStateSet_t)(const void *serverHandle, const char *processName, bos_ProcessExecutionState_t processStatus, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessExecutionStateSetTemporary_t)(const void *serverHandle, const char *processName, bos_ProcessExecutionState_t processStatus, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessNameGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessNameGetNext_t)(const void *iterationId, char *processName, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessNameGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessInfoGet_t)(const void *serverHandle, const char *processName, bos_ProcessType_p processTypeP, bos_ProcessInfo_p processInfoP, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessParameterGetBegin_t)(const void *serverHandle, const char *processName, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessParameterGetNext_t)(const void *iterationId, char *parameter, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessParameterGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessNotifierGet_t)(const void *serverHandle, const char *processName, char *notifier, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessRestart_t)(const void *serverHandle, const char *processName, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessAllStop_t)(const void *serverHandle, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessAllStart_t)(const void *serverHandle, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessAllWaitStop_t)(const void *serverHandle, afs_status_p st); -typedef int (ADMINAPI *lpBosProcessAllStopAndRestart_t)(const void *serverHandle, bos_RestartBosServer_t restartBosServer, afs_status_p st); -typedef int (ADMINAPI *lpBosAdminCreate_t)(const void *serverHandle, const char *adminName, afs_status_p st); -typedef int (ADMINAPI *lpBosAdminDelete_t)(const void *serverHandle, const char *adminName, afs_status_p st); -typedef int (ADMINAPI *lpBosAdminGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpBosAdminGetNext_t)(const void *iterationId, char *adminName, afs_status_p st); -typedef int (ADMINAPI *lpBosAdminGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpBosKeyCreate_t)(const void *serverHandle, int keyVersionNumber, const kas_encryptionKey_p key, afs_status_p st); -typedef int (ADMINAPI *lpBosKeyDelete_t)(const void *serverHandle, int keyVersionNumber, afs_status_p st); -typedef int (ADMINAPI *lpBosKeyGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpBosKeyGetNext_t)(const void *iterationId, bos_KeyInfo_p keyP, afs_status_p st); -typedef int (ADMINAPI *lpBosKeyGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpBosCellSet_t)(const void *serverHandle, const char *cellName, afs_status_p st); -typedef int (ADMINAPI *lpBosCellGet_t)(const void *serverHandle, char *cellName, afs_status_p st); -typedef int (ADMINAPI *lpBosHostCreate_t)(const void *serverHandle, const char *hostName, afs_status_p st); -typedef int (ADMINAPI *lpBosHostDelete_t)(const void *serverHandle, const char *hostName, afs_status_p st); -typedef int (ADMINAPI *lpBosHostGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpBosHostGetNext_t)(const void *iterationId, char *hostName, afs_status_p st); -typedef int (ADMINAPI *lpBosHostGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpBosExecutableCreate_t)(const void *serverHandle, const char *sourceFile, const char *destFile, afs_status_p st); -typedef int (ADMINAPI *lpBosExecutableRevert_t)(const void *serverHandle, const char *execFile, afs_status_p st); -typedef int (ADMINAPI *lpBosExecutableTimestampGet_t)(const void *serverHandle, const char *execFile, unsigned long *newTime, unsigned long *oldTime, unsigned long *bakTime, afs_status_p st); -typedef int (ADMINAPI *lpBosExecutablePrune_t)(const void *serverHandle, bos_Prune_t oldFiles, bos_Prune_t bakFiles, bos_Prune_t coreFiles, afs_status_p st); -typedef int (ADMINAPI *lpBosExecutableRestartTimeSet_t)(const void *serverHandle, bos_Restart_t type, bos_RestartTime_t time, afs_status_p st); -typedef int (ADMINAPI *lpBosExecutableRestartTimeGet_t)(const void *serverHandle, bos_Restart_t type, bos_RestartTime_p timeP, afs_status_p st); -typedef int (ADMINAPI *lpBosLogGet_t)(const void *serverHandle, const char *log, unsigned long *logBufferSizeP, char *logData, afs_status_p st); -typedef int (ADMINAPI *lpBosAuthSet_t)(const void *serverHandle, bos_Auth_t auth, afs_status_p st); -typedef int (ADMINAPI *lpBosCommandExecute_t)(const void *serverHandle, const char *command, afs_status_p st); -typedef int (ADMINAPI *lpBosSalvage_t)(const void *cellHandle, const void *serverHandle, const char *partitionName, const char *volumeName, int numSalvagers, const char *tmpDir, const char *logFile, vos_force_t force, bos_SalvageDamagedVolumes_t salvageDamagedVolumes, bos_WriteInodes_t writeInodes, bos_WriteRootInodes_t writeRootInodes, bos_ForceDirectory_t forceDirectory, bos_ForceBlockRead_t forceBlockRead, afs_status_p st); - -typedef int (ADMINAPI *lpKasServerOpen_t)(const void *cellHandle, const char **serverList, void **serverHandleP, afs_status_p st); typedef int (ADMINAPI *lpKasServerClose_t)(void *serverHandle, afs_status_p st); typedef int (ADMINAPI *lpKasServerStatsGet_t)(const void *cellHandle, const void *serverHandle, kas_serverStats_p stats, afs_status_p st); typedef int (ADMINAPI *lpKasServerDebugGet_t)(const void *cellHandle, const void *serverHandle, kas_serverDebugInfo_p debug, afs_status_p st); typedef int (ADMINAPI *lpKasServerRandomKeyGet_t)(const void *cellHandle, const void *serverHandle, kas_encryptionKey_p key, afs_status_p st); typedef int (ADMINAPI *lpKasStringToKey_t)(const char *cellName, const char *string, kas_encryptionKey_p key, afs_status_p st); typedef int (ADMINAPI *lpKasPrincipalCreate_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, const char *password, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalDelete_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalGet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, kas_principalEntry_p principal, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalGetBegin_t)(const void *cellHandle, const void *serverHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalGetNext_t)(const void *iterationId, kas_identity_p who, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalGetDone_t)(void *iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalKeySet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, int keyVersion, const kas_encryptionKey_p key, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalLockStatusGet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, unsigned long *lock_end_timeP, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalUnlock_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, afs_status_p st); -typedef int (ADMINAPI *lpKasPrincipalFieldsSet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, const kas_admin_p isAdmin, const kas_tgs_p grantTickets, const kas_enc_p canEncrypt, const kas_cpw_p canChangePassword, const unsigned int *expirationDate, const unsigned int *maxTicketLifetime, const unsigned int *passwordExpires, const kas_rpw_p passwordReuse, const unsigned int *failedPasswordAttempts, const unsigned int *failedPasswordLockTime, afs_status_p st); - -typedef int (ADMINAPI *lpPtsGroupMemberAdd_t)(const void *cellHandle, const char *userName, const char *groupName, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupOwnerChange_t)(const void *cellHandle, const char *targetGroup, const char *newOwner, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupCreate_t)(const void *cellHandle, const char *newGroup, const char *newOwner, const int *newGroupIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupGet_t)(const void *cellHandle, const char *groupName, pts_GroupEntry_p groupP, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupDelete_t)(const void *cellHandle, const char *group, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupMaxGet_t)(const void *cellHandle, int *maxGroupId, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupMaxSet_t)(const void *cellHandle, int maxGroupId, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupMemberListBegin_t)(const void *cellHandle, const char *groupName, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupMemberListNext_t)(const void *iterationIdP, char *memberName, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupMemberListDone_t)(const void *iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupMemberRemove_t)(const void *cellHandle, const char *memberName, const char *groupName, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupRename_t)(const void *cellHandle, const char *oldName, const char *newName, afs_status_p st); -typedef int (ADMINAPI *lpPtsGroupModify_t)(const void *cellHandle, const char *groupName, pts_GroupUpdateEntry_p newEntryP, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserCreate_t)(const void *cellHandle, const char *newUser, const int *newUserIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserDelete_t)(const void *cellHandle, const char *user, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserGet_t)(const void *cellHandle, const char *userName, pts_UserEntry_p userP, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserRename_t)(const void *cellHandle, const char *oldName, const char *newName, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserModify_t)(const void *cellHandle, const char *userName, pts_UserUpdateEntry_p newEntryP, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserMaxGet_t)(const void *cellHandle, int *maxUserId, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserMaxSet_t)(const void *cellHandle, int maxUserId, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserMemberListBegin_t)(const void *cellHandle, const char *userName, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserMemberListNext_t)(const void *iterationIdP, char *groupName, afs_status_p st); -typedef int (ADMINAPI *lpPtsUserMemberListDone_t)(const void *iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsOwnedGroupListBegin_t)(const void *cellHandle, const char *ownerName, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpPtsOwnedGroupListNext_t)(const void *iterationIdP, char *groupName, afs_status_p st); -typedef int (ADMINAPI *lpPtsOwnedGroupListDone_t)(const void *iterationIdP, afs_status_p st); - -typedef int (ADMINAPI *lpClientTokenGetExisting_t)(const char *cellName, void **tokenHandle, afs_status_p st); -typedef int (ADMINAPI *lpClientCellOpen_t)(const char *cellName, const void *credsHandle, void **cellHandleP, afs_status_p st); -typedef int (ADMINAPI *lpClientCellClose_t)(const void *cellHandle, afs_status_p st); -typedef int (ADMINAPI *lpClientLocalCellGet_t)(char *cellName, afs_status_p st); -typedef int (ADMINAPI *lpClientAFSServerGet_t)(const void *cellHandle, const char *serverName, afs_serverEntry_p serverEntryP, afs_status_p st); -typedef int (ADMINAPI *lpClientAFSServerGetBegin_t)(const void *cellHandle, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpClientAFSServerGetNext_t)(const void *iterationId, afs_serverEntry_p serverEntryP, afs_status_p st); -typedef int (ADMINAPI *lpClientAFSServerGetDone_t)(const void *iterationId, afs_status_p st); -typedef int (ADMINAPI *lpClientInit_t)(afs_status_p st); - -typedef int (ADMINAPI *lpUtilDatabaseServerGetBegin_t)(const char *cellName, void **iterationIdP, afs_status_p st); -typedef int (ADMINAPI *lpUtilDatabaseServerGetNext_t)(const void *iterationId, int *serverAddressP, afs_status_p st); -typedef int (ADMINAPI *lpUtilDatabaseServerGetDone_t)(const void *iterationId, afs_status_p st); - -// ADD HERE - - -static lpVosBackupVolumeCreate_t lpVosBackupVolumeCreate = NULL; -static lpVosBackupVolumeCreateMultiple_t lpVosBackupVolumeCreateMultiple = NULL; -static lpVosPartitionGet_t lpVosPartitionGet = NULL; -static lpVosPartitionGetBegin_t lpVosPartitionGetBegin = NULL; -static lpVosPartitionGetNext_t lpVosPartitionGetNext = NULL; -static lpVosPartitionGetDone_t lpVosPartitionGetDone = NULL; -static lpVosServerOpen_t lpVosServerOpen = NULL; -static lpVosServerClose_t lpVosServerClose = NULL; -static lpVosServerSync_t lpVosServerSync = NULL; -static lpVosFileServerAddressChange_t lpVosFileServerAddressChange = NULL; -static lpVosFileServerAddressRemove_t lpVosFileServerAddressRemove = NULL; -static lpVosFileServerGetBegin_t lpVosFileServerGetBegin = NULL; -static lpVosFileServerGetNext_t lpVosFileServerGetNext = NULL; -static lpVosFileServerGetDone_t lpVosFileServerGetDone = NULL; -static lpVosServerTransactionStatusGetBegin_t lpVosServerTransactionStatusGetBegin = NULL; -static lpVosServerTransactionStatusGetNext_t lpVosServerTransactionStatusGetNext = NULL; -static lpVosServerTransactionStatusGetDone_t lpVosServerTransactionStatusGetDone = NULL; -static lpVosVLDBGet_t lpVosVLDBGet = NULL; -static lpVosVLDBGetBegin_t lpVosVLDBGetBegin = NULL; -static lpVosVLDBGetNext_t lpVosVLDBGetNext = NULL; -static lpVosVLDBGetDone_t lpVosVLDBGetDone = NULL; -static lpVosVLDBEntryRemove_t lpVosVLDBEntryRemove = NULL; -static lpVosVLDBUnlock_t lpVosVLDBUnlock = NULL; -static lpVosVLDBEntryLock_t lpVosVLDBEntryLock = NULL; -static lpVosVLDBEntryUnlock_t lpVosVLDBEntryUnlock = NULL; -static lpVosVLDBReadOnlySiteCreate_t lpVosVLDBReadOnlySiteCreate = NULL; -static lpVosVLDBReadOnlySiteDelete_t lpVosVLDBReadOnlySiteDelete = NULL; -static lpVosVLDBSync_t lpVosVLDBSync = NULL; -static lpVosVolumeCreate_t lpVosVolumeCreate = NULL; -static lpVosVolumeDelete_t lpVosVolumeDelete = NULL; -static lpVosVolumeRename_t lpVosVolumeRename = NULL; -static lpVosVolumeDump_t lpVosVolumeDump = NULL; -static lpVosVolumeRestore_t lpVosVolumeRestore = NULL; -static lpVosVolumeOnline_t lpVosVolumeOnline = NULL; -static lpVosVolumeOffline_t lpVosVolumeOffline = NULL; -static lpVosVolumeGet_t lpVosVolumeGet = NULL; -static lpVosVolumeGetBegin_t lpVosVolumeGetBegin = NULL; -static lpVosVolumeGetNext_t lpVosVolumeGetNext = NULL; -static lpVosVolumeGetDone_t lpVosVolumeGetDone = NULL; -static lpVosVolumeMove_t lpVosVolumeMove = NULL; -static lpVosVolumeRelease_t lpVosVolumeRelease = NULL; -static lpVosVolumeZap_t lpVosVolumeZap = NULL; -static lpVosPartitionNameToId_t lpVosPartitionNameToId = NULL; -static lpVosPartitionIdToName_t lpVosPartitionIdToName = NULL; -static lpVosVolumeQuotaChange_t lpVosVolumeQuotaChange = NULL; - -static lpBosServerOpen_t lpBosServerOpen = NULL; -static lpBosServerClose_t lpBosServerClose = NULL; -static lpBosProcessCreate_t lpBosProcessCreate = NULL; -static lpBosProcessDelete_t lpBosProcessDelete = NULL; -static lpBosProcessExecutionStateGet_t lpBosProcessExecutionStateGet = NULL; -static lpBosProcessExecutionStateSet_t lpBosProcessExecutionStateSet = NULL; -static lpBosProcessExecutionStateSetTemporary_t lpBosProcessExecutionStateSetTemporary = NULL; -static lpBosProcessNameGetBegin_t lpBosProcessNameGetBegin = NULL; -static lpBosProcessNameGetDone_t lpBosProcessNameGetDone = NULL; -static lpBosProcessNameGetNext_t lpBosProcessNameGetNext = NULL; -static lpBosProcessInfoGet_t lpBosProcessInfoGet = NULL; -static lpBosProcessParameterGetBegin_t lpBosProcessParameterGetBegin = NULL; -static lpBosProcessParameterGetDone_t lpBosProcessParameterGetDone = NULL; -static lpBosProcessParameterGetNext_t lpBosProcessParameterGetNext = NULL; -static lpBosProcessNotifierGet_t lpBosProcessNotifierGet = NULL; -static lpBosProcessRestart_t lpBosProcessRestart = NULL; -static lpBosProcessAllStop_t lpBosProcessAllStop = NULL; -static lpBosProcessAllStart_t lpBosProcessAllStart = NULL; -static lpBosProcessAllWaitStop_t lpBosProcessAllWaitStop = NULL; -static lpBosProcessAllStopAndRestart_t lpBosProcessAllStopAndRestart = NULL; -static lpBosAdminCreate_t lpBosAdminCreate = NULL; -static lpBosAdminDelete_t lpBosAdminDelete = NULL; -static lpBosAdminGetBegin_t lpBosAdminGetBegin = NULL; -static lpBosAdminGetDone_t lpBosAdminGetDone = NULL; -static lpBosAdminGetNext_t lpBosAdminGetNext = NULL; -static lpBosKeyCreate_t lpBosKeyCreate = NULL; -static lpBosKeyDelete_t lpBosKeyDelete = NULL; -static lpBosKeyGetBegin_t lpBosKeyGetBegin = NULL; -static lpBosKeyGetDone_t lpBosKeyGetDone = NULL; -static lpBosKeyGetNext_t lpBosKeyGetNext = NULL; -static lpBosCellSet_t lpBosCellSet = NULL; -static lpBosCellGet_t lpBosCellGet = NULL; -static lpBosHostCreate_t lpBosHostCreate = NULL; -static lpBosHostDelete_t lpBosHostDelete = NULL; -static lpBosHostGetBegin_t lpBosHostGetBegin = NULL; -static lpBosHostGetDone_t lpBosHostGetDone = NULL; -static lpBosHostGetNext_t lpBosHostGetNext = NULL; -static lpBosExecutableCreate_t lpBosExecutableCreate = NULL; -static lpBosExecutableRevert_t lpBosExecutableRevert = NULL; -static lpBosExecutableTimestampGet_t lpBosExecutableTimestampGet = NULL; -static lpBosExecutablePrune_t lpBosExecutablePrune = NULL; -static lpBosExecutableRestartTimeSet_t lpBosExecutableRestartTimeSet = NULL; -static lpBosExecutableRestartTimeGet_t lpBosExecutableRestartTimeGet = NULL; -static lpBosLogGet_t lpBosLogGet = NULL; -static lpBosAuthSet_t lpBosAuthSet = NULL; -static lpBosCommandExecute_t lpBosCommandExecute = NULL; -static lpBosSalvage_t lpBosSalvage = NULL; - -static lpKasServerOpen_t lpKasServerOpen = NULL; -static lpKasServerClose_t lpKasServerClose = NULL; -static lpKasServerStatsGet_t lpKasServerStatsGet = NULL; -static lpKasServerDebugGet_t lpKasServerDebugGet = NULL; -static lpKasServerRandomKeyGet_t lpKasServerRandomKeyGet = NULL; -static lpKasStringToKey_t lpKasStringToKey = NULL; -static lpKasPrincipalCreate_t lpKasPrincipalCreate = NULL; -static lpKasPrincipalDelete_t lpKasPrincipalDelete = NULL; -static lpKasPrincipalGet_t lpKasPrincipalGet = NULL; -static lpKasPrincipalGetBegin_t lpKasPrincipalGetBegin = NULL; -static lpKasPrincipalGetNext_t lpKasPrincipalGetNext = NULL; -static lpKasPrincipalGetDone_t lpKasPrincipalGetDone = NULL; -static lpKasPrincipalKeySet_t lpKasPrincipalKeySet = NULL; -static lpKasPrincipalLockStatusGet_t lpKasPrincipalLockStatusGet = NULL; -static lpKasPrincipalUnlock_t lpKasPrincipalUnlock = NULL; -static lpKasPrincipalFieldsSet_t lpKasPrincipalFieldsSet = NULL; - -static lpPtsGroupMemberAdd_t lpPtsGroupMemberAdd = NULL; -static lpPtsGroupOwnerChange_t lpPtsGroupOwnerChange = NULL; -static lpPtsGroupCreate_t lpPtsGroupCreate = NULL; -static lpPtsGroupGet_t lpPtsGroupGet = NULL; -static lpPtsGroupDelete_t lpPtsGroupDelete = NULL; -static lpPtsGroupMaxGet_t lpPtsGroupMaxGet = NULL; -static lpPtsGroupMaxSet_t lpPtsGroupMaxSet = NULL; -static lpPtsGroupMemberListBegin_t lpPtsGroupMemberListBegin = NULL; -static lpPtsGroupMemberListNext_t lpPtsGroupMemberListNext = NULL; -static lpPtsGroupMemberListDone_t lpPtsGroupMemberListDone = NULL; -static lpPtsGroupMemberRemove_t lpPtsGroupMemberRemove = NULL; -static lpPtsGroupRename_t lpPtsGroupRename = NULL; -static lpPtsGroupModify_t lpPtsGroupModify = NULL; -static lpPtsUserCreate_t lpPtsUserCreate = NULL; -static lpPtsUserDelete_t lpPtsUserDelete = NULL; -static lpPtsUserGet_t lpPtsUserGet = NULL; -static lpPtsUserRename_t lpPtsUserRename = NULL; -static lpPtsUserModify_t lpPtsUserModify = NULL; -static lpPtsUserMaxGet_t lpPtsUserMaxGet = NULL; -static lpPtsUserMaxSet_t lpPtsUserMaxSet = NULL; -static lpPtsUserMemberListBegin_t lpPtsUserMemberListBegin = NULL; -static lpPtsUserMemberListNext_t lpPtsUserMemberListNext = NULL; -static lpPtsUserMemberListDone_t lpPtsUserMemberListDone = NULL; -static lpPtsOwnedGroupListBegin_t lpPtsOwnedGroupListBegin = NULL; -static lpPtsOwnedGroupListNext_t lpPtsOwnedGroupListNext = NULL; -static lpPtsOwnedGroupListDone_t lpPtsOwnedGroupListDone = NULL; - -static lpClientTokenGetExisting_t lpClientTokenGetExisting = NULL; -static lpClientCellOpen_t lpClientCellOpen = NULL; -static lpClientCellClose_t lpClientCellClose = NULL; -static lpClientLocalCellGet_t lpClientLocalCellGet = NULL; -static lpClientAFSServerGet_t lpClientAFSServerGet = NULL; -static lpClientAFSServerGetBegin_t lpClientAFSServerGetBegin = NULL; -static lpClientAFSServerGetNext_t lpClientAFSServerGetNext = NULL; -static lpClientAFSServerGetDone_t lpClientAFSServerGetDone = NULL; -static lpClientInit_t lpClientInit = NULL; - -static lpUtilDatabaseServerGetBegin_t lpUtilDatabaseServerGetBegin = NULL; -static lpUtilDatabaseServerGetNext_t lpUtilDatabaseServerGetNext = NULL; -static lpUtilDatabaseServerGetDone_t lpUtilDatabaseServerGetDone = NULL; - -// ADD HERE - -} // extern "C" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL Worker_LoadLibraries (ULONG *pStatus); -void Worker_FreeLibraries (void); - -DWORD Worker_PerformTask (WORKERTASK wtask, LPWORKERPACKET lpwp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL Worker_Initialize (ULONG *pStatus) -{ - static BOOL fInitialized = FALSE; - - if (!fInitialized) - { - fInitialized = Worker_LoadLibraries (pStatus); - } - - return fInitialized; -} - - -BOOL Worker_DoTask (WORKERTASK wtask, LPWORKERPACKET lpwp, ULONG *pStatus) -{ - if (!Worker_Initialize (pStatus)) - return FALSE; - - ULONG status; - try { - status = Worker_PerformTask (wtask, lpwp); - } catch(...) { - status = ERROR_UNEXP_NET_ERR; - } - if (pStatus) - *pStatus = status; - return (status == 0) ? TRUE : FALSE; -} - - -DWORD Worker_PerformTask (WORKERTASK wtask, LPWORKERPACKET lpwp) -{ - afs_status_t status = 0; - - switch (wtask) - { - case wtaskVosBackupVolumeCreate: - { - if ((*lpVosBackupVolumeCreate)(lpwp->wpVosBackupVolumeCreate.hCell, NULL, lpwp->wpVosBackupVolumeCreate.idVolume, &status)) - status = 0; - break; - } - - case wtaskVosBackupVolumeCreateMultiple: - { - LPSTR pszPrefixA = StringToAnsi (lpwp->wpVosBackupVolumeCreateMultiple.pszPrefix); - - unsigned int *pPartition; - if (*(pPartition = (unsigned int *)&lpwp->wpVosBackupVolumeCreateMultiple.idPartition) == NO_PARTITION) - pPartition = NULL; - - if ((*lpVosBackupVolumeCreateMultiple)(lpwp->wpVosBackupVolumeCreateMultiple.hCell, lpwp->wpVosBackupVolumeCreateMultiple.hServer, NULL, pPartition, pszPrefixA, (lpwp->wpVosBackupVolumeCreateMultiple.fExclude) ? VOS_EXCLUDE : VOS_INCLUDE, &status)) - status = 0; - - FreeString (pszPrefixA, lpwp->wpVosBackupVolumeCreateMultiple.pszPrefix); - break; - } - - case wtaskVosPartitionGet: - { - if ((*lpVosPartitionGet)(lpwp->wpVosPartitionGet.hCell, lpwp->wpVosPartitionGet.hServer, NULL, lpwp->wpVosPartitionGet.idPartition, &lpwp->wpVosPartitionGet.Data, &status)) - status = 0; - break; - } - - case wtaskVosPartitionGetBegin: - { - if ((*lpVosPartitionGetBegin)(lpwp->wpVosPartitionGetBegin.hCell, lpwp->wpVosPartitionGetBegin.hServer, NULL, &lpwp->wpVosPartitionGetBegin.hEnum, &status)) - status = 0; - else - lpwp->wpVosPartitionGetBegin.hEnum = NULL; - break; - } - - case wtaskVosPartitionGetNext: - { - if ((*lpVosPartitionGetNext)(lpwp->wpVosPartitionGetNext.hEnum, &lpwp->wpVosPartitionGetNext.Data, &status)) - status = 0; - break; - } - - case wtaskVosPartitionGetDone: - { - if ((*lpVosPartitionGetDone)(lpwp->wpVosPartitionGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosServerOpen: - { - LPSTR pszServerA = StringToAnsi (lpwp->wpVosServerOpen.pszServer); - - if ((*lpVosServerOpen)(lpwp->wpVosServerOpen.hCell, pszServerA, &lpwp->wpVosServerOpen.hServer, &status)) - status = 0; - - FreeString (pszServerA, lpwp->wpVosServerOpen.pszServer); - break; - } - - case wtaskVosServerClose: - { - if ((*lpVosServerClose)(lpwp->wpVosServerClose.hServer, &status)) - status = 0; - break; - } - - case wtaskVosServerSync: - { - unsigned int *pPartition; - if (*(pPartition = (unsigned int *)&lpwp->wpVosServerSync.idPartition) == NO_PARTITION) - pPartition = NULL; - - if ((*lpVosServerSync)(lpwp->wpVosServerSync.hCell, lpwp->wpVosServerSync.hServer, NULL, pPartition, (lpwp->wpVosServerSync.fForce) ? VOS_FORCE : VOS_NORMAL, &status)) - status = 0; - break; - } - - case wtaskVosFileServerAddressChange: - { - int oldAddress; - int newAddress; - AfsClass_AddressToInt (&oldAddress, &lpwp->wpVosFileServerAddressChange.addrOld); - AfsClass_AddressToInt (&newAddress, &lpwp->wpVosFileServerAddressChange.addrNew); - - if ((*lpVosFileServerAddressChange)(lpwp->wpVosFileServerAddressChange.hCell, NULL, oldAddress, newAddress, &status)) - status = 0; - break; - } - - case wtaskVosFileServerAddressRemove: - { - int oldAddress; - AfsClass_AddressToInt (&oldAddress, &lpwp->wpVosFileServerAddressRemove.addr); - - if ((*lpVosFileServerAddressRemove)(lpwp->wpVosFileServerAddressRemove.hCell, NULL, oldAddress, &status)) - status = 0; - - if (status == VL_NOENT) // RemoveAddress attempted on pre-AFS3.5? - status = ENOSYS; - break; - } - - case wtaskVosFileServerGetBegin: - { - if ((*lpVosFileServerGetBegin)(lpwp->wpVosFileServerGetBegin.hCell, NULL, &lpwp->wpVosFileServerGetBegin.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosFileServerGetNext: - { - if ((*lpVosFileServerGetNext)(lpwp->wpVosFileServerGetNext.hEnum, &lpwp->wpVosFileServerGetNext.Entry, &status)) - status = 0; - break; - } - - case wtaskVosFileServerGetDone: - { - if ((*lpVosFileServerGetDone)(lpwp->wpVosFileServerGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosServerTransactionStatusGetBegin: - { - if ((*lpVosServerTransactionStatusGetBegin)(lpwp->wpVosServerTransactionStatusGetBegin.hCell, lpwp->wpVosServerTransactionStatusGetBegin.hServer, NULL, &lpwp->wpVosServerTransactionStatusGetBegin.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosServerTransactionStatusGetNext: - { - if ((*lpVosServerTransactionStatusGetNext)(lpwp->wpVosServerTransactionStatusGetNext.hEnum, &lpwp->wpVosServerTransactionStatusGetNext.Data, &status)) - status = 0; - break; - } - - case wtaskVosServerTransactionStatusGetDone: - { - if ((*lpVosServerTransactionStatusGetDone)(lpwp->wpVosServerTransactionStatusGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosVLDBGet: - { - if ((*lpVosVLDBGet)(lpwp->wpVosVLDBGet.hCell, NULL, &lpwp->wpVosVLDBGet.idVolume, NULL, &lpwp->wpVosVLDBGet.Data, &status)) - status = 0; - break; - } - - case wtaskVosVLDBGetBegin: - { - unsigned int *pPartition; - if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBGetBegin.idPartition) == NO_PARTITION) - pPartition = NULL; - - if ((*lpVosVLDBGetBegin)(lpwp->wpVosVLDBGetBegin.hCell, lpwp->wpVosVLDBGetBegin.hServer, NULL, pPartition, &lpwp->wpVosVLDBGetBegin.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosVLDBGetNext: - { - if ((*lpVosVLDBGetNext)(lpwp->wpVosVLDBGetNext.hEnum, &lpwp->wpVosVLDBGetNext.Data, &status)) - status = 0; - break; - } - - case wtaskVosVLDBGetDone: - { - if ((*lpVosVLDBGetDone)(lpwp->wpVosVLDBGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosVLDBEntryRemove: - { - unsigned int *pPartition; - if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBEntryRemove.idPartition) == NO_PARTITION) - pPartition = NULL; - - unsigned int *pVolume; - if (*(pVolume = (unsigned int *)&lpwp->wpVosVLDBEntryRemove.idVolume) == NO_VOLUME) - pVolume = NULL; - - if ((*lpVosVLDBEntryRemove)(lpwp->wpVosVLDBEntryRemove.hCell, lpwp->wpVosVLDBEntryRemove.hServer, NULL, pPartition, pVolume, &status)) - status = 0; - break; - } - - case wtaskVosVLDBEntryLock: - { - if ((*lpVosVLDBEntryLock)(lpwp->wpVosVLDBEntryLock.hCell, NULL, lpwp->wpVosVLDBEntryLock.idVolume, &status)) - status = 0; - break; - } - - case wtaskVosVLDBEntryUnlock: - { - if (lpwp->wpVosVLDBEntryUnlock.idVolume == NO_VOLUME) - { - unsigned int *pPartition; - if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBEntryUnlock.idPartition) == NO_PARTITION) - pPartition = NULL; - - if ((*lpVosVLDBUnlock)(lpwp->wpVosVLDBEntryUnlock.hCell, lpwp->wpVosVLDBEntryUnlock.hServer, NULL, pPartition, &status)) - status = 0; - } - else - { - if ((*lpVosVLDBEntryUnlock)(lpwp->wpVosVLDBEntryUnlock.hCell, NULL, lpwp->wpVosVLDBEntryUnlock.idVolume, &status)) - status = 0; - } - break; - } - - case wtaskVosVLDBReadOnlySiteCreate: - { - if ((*lpVosVLDBReadOnlySiteCreate)(lpwp->wpVosVLDBReadOnlySiteCreate.hCell, lpwp->wpVosVLDBReadOnlySiteCreate.hServer, NULL, lpwp->wpVosVLDBReadOnlySiteCreate.idPartition, lpwp->wpVosVLDBReadOnlySiteCreate.idVolume, &status)) - status = 0; - break; - } - - case wtaskVosVLDBReadOnlySiteDelete: - { - if ((*lpVosVLDBReadOnlySiteDelete)(lpwp->wpVosVLDBReadOnlySiteDelete.hCell, lpwp->wpVosVLDBReadOnlySiteDelete.hServer, NULL, lpwp->wpVosVLDBReadOnlySiteDelete.idPartition, lpwp->wpVosVLDBReadOnlySiteDelete.idVolume, &status)) - status = 0; - break; - } - - case wtaskVosVLDBSync: - { - unsigned int *pPartition; - if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBSync.idPartition) == NO_PARTITION) - pPartition = NULL; - - if ((*lpVosVLDBSync)(lpwp->wpVosVLDBSync.hCell, lpwp->wpVosVLDBSync.hServer, NULL, pPartition, ((lpwp->wpVosVLDBSync.fForce) ? VOS_FORCE : VOS_NORMAL), &status)) - status = 0; - break; - } - - case wtaskVosVolumeCreate: - { - LPSTR pszVolumeA = StringToAnsi (lpwp->wpVosVolumeCreate.pszVolume); - - if ((*lpVosVolumeCreate)(lpwp->wpVosVolumeCreate.hCell, lpwp->wpVosVolumeCreate.hServer, NULL, lpwp->wpVosVolumeCreate.idPartition, pszVolumeA, lpwp->wpVosVolumeCreate.ckQuota, (unsigned int *)&lpwp->wpVosVolumeCreate.idVolume, &status)) - status = 0; - - FreeString (pszVolumeA, lpwp->wpVosVolumeCreate.pszVolume); - break; - } - - case wtaskVosVolumeDelete: - { - if ((*lpVosVolumeDelete)(lpwp->wpVosVolumeDelete.hCell, lpwp->wpVosVolumeDelete.hServer, NULL, lpwp->wpVosVolumeDelete.idPartition, lpwp->wpVosVolumeDelete.idVolume, &status)) - status = 0; - break; - } - - case wtaskVosVolumeRename: - { - LPSTR pszVolumeA = StringToAnsi (lpwp->wpVosVolumeRename.pszVolume); - - if ((*lpVosVolumeRename)(lpwp->wpVosVolumeRename.hCell, NULL, lpwp->wpVosVolumeRename.idVolume, pszVolumeA, &status)) - status = 0; - - FreeString (pszVolumeA, lpwp->wpVosVolumeRename.pszVolume); - break; - } - - case wtaskVosVolumeDump: - { - LPSTR pszFilenameA = StringToAnsi (lpwp->wpVosVolumeDump.pszFilename); - ULONG timeStart = AfsClass_SystemTimeToUnixTime (&lpwp->wpVosVolumeDump.stStart); - - if ((*lpVosVolumeDump)(lpwp->wpVosVolumeDump.hCell, lpwp->wpVosVolumeDump.hServer, NULL, (unsigned int *)&lpwp->wpVosVolumeDump.idPartition, lpwp->wpVosVolumeDump.idVolume, timeStart, pszFilenameA, &status)) - status = 0; - - FreeString (pszFilenameA, lpwp->wpVosVolumeDump.pszFilename); - break; - } - - case wtaskVosVolumeRestore: - { - LPSTR pszVolumeA = StringToAnsi (lpwp->wpVosVolumeRestore.pszVolume); - LPSTR pszFilenameA = StringToAnsi (lpwp->wpVosVolumeRestore.pszFilename); - vos_volumeRestoreType_t Type = (lpwp->wpVosVolumeRestore.fIncremental) ? VOS_RESTORE_INCREMENTAL : VOS_RESTORE_FULL; - - unsigned int *pVolume; - if (*(pVolume = (unsigned int *)&lpwp->wpVosVolumeRestore.idVolume) == NO_VOLUME) - pVolume = NULL; - - if ((*lpVosVolumeRestore)(lpwp->wpVosVolumeRestore.hCell, lpwp->wpVosVolumeRestore.hServer, NULL, lpwp->wpVosVolumeRestore.idPartition, pVolume, pszVolumeA, pszFilenameA, Type, &status)) - status = 0; - - FreeString (pszFilenameA, lpwp->wpVosVolumeRestore.pszFilename); - FreeString (pszVolumeA, lpwp->wpVosVolumeRestore.pszVolume); - break; - } - - case wtaskVosVolumeOnline: - { - if ((*lpVosVolumeOnline)(lpwp->wpVosVolumeOnline.hServer, NULL, lpwp->wpVosVolumeOnline.idPartition, lpwp->wpVosVolumeOnline.idVolume, lpwp->wpVosVolumeOnline.csecSleep, lpwp->wpVosVolumeOnline.Status, &status)) - status = 0; - break; - } - - case wtaskVosVolumeOffline: - { - if ((*lpVosVolumeOffline)(lpwp->wpVosVolumeOffline.hServer, NULL, lpwp->wpVosVolumeOffline.idPartition, lpwp->wpVosVolumeOffline.idVolume, &status)) - status = 0; - break; - } - - case wtaskVosVolumeGet: - { - if ((*lpVosVolumeGet)(lpwp->wpVosVolumeGet.hCell, lpwp->wpVosVolumeGet.hServer, NULL, lpwp->wpVosVolumeGet.idPartition, lpwp->wpVosVolumeGet.idVolume, &lpwp->wpVosVolumeGet.Data, &status)) - status = 0; - break; - } - - case wtaskVosVolumeGetBegin: - { - if ((lpVosVolumeGetBegin)(lpwp->wpVosVolumeGetBegin.hCell, lpwp->wpVosVolumeGetBegin.hServer, NULL, lpwp->wpVosVolumeGetBegin.idPartition, &lpwp->wpVosVolumeGetBegin.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosVolumeGetNext: - { - if ((*lpVosVolumeGetNext)(lpwp->wpVosVolumeGetNext.hEnum, &lpwp->wpVosVolumeGetNext.Data, &status)) - status = 0; - break; - } - - case wtaskVosVolumeGetDone: - { - if ((*lpVosVolumeGetDone)(lpwp->wpVosVolumeGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskVosVolumeMove: - { - if ((lpVosVolumeMove)(lpwp->wpVosVolumeMove.hCell, NULL, lpwp->wpVosVolumeMove.idVolume, lpwp->wpVosVolumeMove.hServerFrom, lpwp->wpVosVolumeMove.idPartitionFrom, lpwp->wpVosVolumeMove.hServerTo, lpwp->wpVosVolumeMove.idPartitionTo, &status)) - status = 0; - break; - } - - case wtaskVosVolumeRelease: - { - if ((*lpVosVolumeRelease)(lpwp->wpVosVolumeRelease.hCell, NULL, lpwp->wpVosVolumeRelease.idVolume, ((lpwp->wpVosVolumeRelease.fForce) ? VOS_FORCE : VOS_NORMAL), &status)) - status = 0; - break; - } - - case wtaskVosVolumeZap: - { - if ((*lpVosVolumeZap)(lpwp->wpVosVolumeZap.hCell, lpwp->wpVosVolumeZap.hServer, NULL, lpwp->wpVosVolumeZap.idPartition, lpwp->wpVosVolumeZap.idVolume, ((lpwp->wpVosVolumeZap.fForce) ? VOS_FORCE : VOS_NORMAL), &status)) - status = 0; - break; - } - - case wtaskVosPartitionNameToId: - { - LPSTR pszPartitionA = StringToAnsi (lpwp->wpVosPartitionNameToId.pszPartition); - - if ((*lpVosPartitionNameToId)(pszPartitionA, (unsigned int *)&lpwp->wpVosPartitionNameToId.idPartition, &status)) - status = 0; - - FreeString (pszPartitionA, lpwp->wpVosPartitionNameToId.pszPartition); - break; - } - - case wtaskVosPartitionIdToName: - { - char szPartitionA[ cchNAME ]; - if ((*lpVosPartitionIdToName)(lpwp->wpVosPartitionIdToName.idPartition, szPartitionA, &status)) - { - CopyAnsiToString (lpwp->wpVosPartitionIdToName.pszPartition, szPartitionA); - status = 0; - } - break; - } - - case wtaskVosVolumeQuotaChange: - { - if ((*lpVosVolumeQuotaChange)(lpwp->wpVosVolumeQuotaChange.hCell, lpwp->wpVosVolumeQuotaChange.hServer, NULL, lpwp->wpVosVolumeQuotaChange.idPartition, lpwp->wpVosVolumeQuotaChange.idVolume, lpwp->wpVosVolumeQuotaChange.ckQuota, &status)) - status = 0; - break; - } - - case wtaskBosServerOpen: - { - LPSTR pszServerA = StringToAnsi (lpwp->wpBosServerOpen.pszServer); - - if ((*lpBosServerOpen)(lpwp->wpBosServerOpen.hCell, pszServerA, &lpwp->wpBosServerOpen.hServer, &status)) - status = 0; - - FreeString (pszServerA, lpwp->wpBosServerOpen.pszServer); - break; - } - - case wtaskBosServerClose: - { - if ((*lpBosServerClose)(lpwp->wpBosServerClose.hServer, &status)) - status = 0; - break; - } - - case wtaskBosProcessCreate: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessCreate.pszService); - LPSTR pszCommandA = StringToAnsi (lpwp->wpBosProcessCreate.pszCommand); - LPSTR pszTimeCronA = StringToAnsi (lpwp->wpBosProcessCreate.pszTimeCron); - LPSTR pszNotifierA = StringToAnsi (lpwp->wpBosProcessCreate.pszNotifier); - - bos_ProcessType_t processType; - switch (lpwp->wpBosProcessCreate.type) - { - case SERVICETYPE_FS: - processType = BOS_PROCESS_FS; - break; - case SERVICETYPE_CRON: - processType = BOS_PROCESS_CRON; - break; - default: - case SERVICETYPE_SIMPLE: - processType = BOS_PROCESS_SIMPLE; - break; - } - - if ((*lpBosProcessCreate)(lpwp->wpBosProcessCreate.hServer, pszServiceA, processType, pszCommandA, pszTimeCronA, pszNotifierA, &status)) - status = 0; - - FreeString (pszNotifierA, lpwp->wpBosProcessCreate.pszNotifier); - FreeString (pszTimeCronA, lpwp->wpBosProcessCreate.pszTimeCron); - FreeString (pszCommandA, lpwp->wpBosProcessCreate.pszCommand); - FreeString (pszServiceA, lpwp->wpBosProcessCreate.pszService); - break; - } - - case wtaskBosProcessDelete: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessDelete.pszService); - - if ((*lpBosProcessDelete)(lpwp->wpBosProcessDelete.hServer, pszServiceA, &status)) - status = 0; - - FreeString (pszServiceA, lpwp->wpBosProcessDelete.pszService); - break; - } - - case wtaskBosProcessExecutionStateGet: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessExecutionStateGet.pszService); - char szAuxStatusA[BOS_MAX_NAME_LEN] = ""; - - bos_ProcessExecutionState_t processState = BOS_PROCESS_STOPPED; - if ((*lpBosProcessExecutionStateGet)(lpwp->wpBosProcessExecutionStateGet.hServer, pszServiceA, &processState, szAuxStatusA, &status)) - { - status = 0; - - if (lpwp->wpBosProcessExecutionStateGet.pszAuxStatus != NULL) - { - CopyAnsiToString (lpwp->wpBosProcessExecutionStateGet.pszAuxStatus, szAuxStatusA); - } - - switch (processState) - { - case BOS_PROCESS_RUNNING: - lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_RUNNING; - break; - case BOS_PROCESS_STARTING: - lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_STARTING; - break; - case BOS_PROCESS_STOPPING: - lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_STOPPING; - break; - default: - case BOS_PROCESS_STOPPED: - lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_STOPPED; - break; - } - } - - FreeString (pszServiceA, lpwp->wpBosProcessExecutionStateGet.pszService); - break; - } - - case wtaskBosProcessExecutionStateSet: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessExecutionStateSet.pszService); - - bos_ProcessExecutionState_t processState; - switch (lpwp->wpBosProcessExecutionStateSet.state) - { - case SERVICESTATE_STOPPING: - case SERVICESTATE_STOPPED: - processState = BOS_PROCESS_STOPPED; - break; - default: - case SERVICESTATE_STARTING: - case SERVICESTATE_RUNNING: - processState = BOS_PROCESS_RUNNING; - break; - } - - if ((*lpBosProcessExecutionStateSet)(lpwp->wpBosProcessExecutionStateSet.hServer, pszServiceA, processState, &status)) - status = 0; - - FreeString (pszServiceA, lpwp->wpBosProcessExecutionStateSet.pszService); - break; - } - - case wtaskBosProcessExecutionStateSetTemporary: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessExecutionStateSetTemporary.pszService); - - bos_ProcessExecutionState_t processState; - switch (lpwp->wpBosProcessExecutionStateSetTemporary.state) - { - case SERVICESTATE_STOPPING: - case SERVICESTATE_STOPPED: - processState = BOS_PROCESS_STOPPED; - break; - default: - case SERVICESTATE_STARTING: - case SERVICESTATE_RUNNING: - processState = BOS_PROCESS_RUNNING; - break; - } - - if ((*lpBosProcessExecutionStateSetTemporary)(lpwp->wpBosProcessExecutionStateSetTemporary.hServer, pszServiceA, processState, &status)) - status = 0; - - FreeString (pszServiceA, lpwp->wpBosProcessExecutionStateSetTemporary.pszService); - break; - } - - case wtaskBosProcessNameGetBegin: - { - if (!(*lpBosProcessNameGetBegin)(lpwp->wpBosProcessNameGetBegin.hServer, &lpwp->wpBosProcessNameGetBegin.hEnum, &status)) - lpwp->wpBosProcessNameGetBegin.hEnum = 0; - else - status = 0; - break; - } - - case wtaskBosProcessNameGetDone: - { - if ((*lpBosProcessNameGetDone)(lpwp->wpBosProcessNameGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskBosProcessNameGetNext: - { - char szServiceA[ 256 ]; - if (!(*lpBosProcessNameGetNext)(lpwp->wpBosProcessNameGetNext.hEnum, szServiceA, &status)) - lpwp->wpBosProcessNameGetNext.pszService[0] = TEXT('\0'); - else - { - status = 0; - CopyAnsiToString (lpwp->wpBosProcessNameGetNext.pszService, szServiceA); - } - break; - } - - case wtaskBosProcessInfoGet: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessInfoGet.pszService); - memset (&lpwp->wpBosProcessInfoGet.ss, 0x00, sizeof(SERVICESTATUS)); - - bos_ProcessType_t processType; - bos_ProcessInfo_t processInfo; - if ((*lpBosProcessInfoGet)(lpwp->wpBosProcessInfoGet.hServer, pszServiceA, &processType, &processInfo, &status)) - { - status = 0; - - switch (processType) - { - case BOS_PROCESS_FS: - lpwp->wpBosProcessInfoGet.ss.type = SERVICETYPE_FS; - break; - case BOS_PROCESS_SIMPLE: - lpwp->wpBosProcessInfoGet.ss.type = SERVICETYPE_SIMPLE; - break; - case BOS_PROCESS_CRON: - lpwp->wpBosProcessInfoGet.ss.type = SERVICETYPE_CRON; - break; - } - - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosProcessInfoGet.ss.timeLastStart, processInfo.processStartTime); - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosProcessInfoGet.ss.timeLastStop, processInfo.processExitTime); - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosProcessInfoGet.ss.timeLastFail, processInfo.processExitErrorTime); - lpwp->wpBosProcessInfoGet.ss.nStarts = processInfo.numberProcessStarts; - lpwp->wpBosProcessInfoGet.ss.dwErrLast = processInfo.processErrorCode; - lpwp->wpBosProcessInfoGet.ss.dwSigLast = processInfo.processErrorSignal; - } - - FreeString (pszServiceA, lpwp->wpBosProcessInfoGet.pszService); - break; - } - - case wtaskBosProcessParameterGetBegin: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessParameterGetBegin.pszService); - - if (!(*lpBosProcessParameterGetBegin)(lpwp->wpBosProcessParameterGetBegin.hServer, pszServiceA, &lpwp->wpBosProcessParameterGetBegin.hEnum, &status)) - lpwp->wpBosProcessParameterGetBegin.hEnum = 0; - else - status = 0; - - FreeString (pszServiceA, lpwp->wpBosProcessParameterGetBegin.pszService); - break; - } - - case wtaskBosProcessParameterGetDone: - { - if ((*lpBosProcessParameterGetDone)(lpwp->wpBosProcessParameterGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskBosProcessParameterGetNext: - { - char szParamA[ 1024 ]; - - if (!(*lpBosProcessParameterGetNext)(lpwp->wpBosProcessParameterGetNext.hEnum, szParamA, &status)) - lpwp->wpBosProcessParameterGetNext.pszParam[0] = TEXT('\0'); - else - { - status = 0; - CopyAnsiToString (lpwp->wpBosProcessParameterGetNext.pszParam, szParamA); - } - break; - } - - case wtaskBosProcessNotifierGet: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessNotifierGet.pszService); - char szNotifierA[ 1024 ]; - - if ((*lpBosProcessNotifierGet)(lpwp->wpBosProcessNotifierGet.hServer, pszServiceA, szNotifierA, &status)) - { - status = 0; - CopyAnsiToString (lpwp->wpBosProcessNotifierGet.pszNotifier, szNotifierA); - } - - FreeString (pszServiceA, lpwp->wpBosProcessNotifierGet.pszService); - break; - } - - case wtaskBosProcessRestart: - { - LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessRestart.pszService); - if ((*lpBosProcessRestart)(lpwp->wpBosProcessRestart.hServer, pszServiceA, &status)) - status = 0; - - FreeString (pszServiceA, lpwp->wpBosProcessRestart.pszService); - break; - } - - case wtaskBosProcessAllStop: - { - if ((*lpBosProcessAllStop)(lpwp->wpBosProcessAllStop.hServer, &status)) - status = 0; - break; - } - - case wtaskBosProcessAllStart: - { - if ((*lpBosProcessAllStart)(lpwp->wpBosProcessAllStart.hServer, &status)) - status = 0; - break; - } - - case wtaskBosProcessAllWaitStop: - { - if ((*lpBosProcessAllWaitStop)(lpwp->wpBosProcessAllWaitStop.hServer, &status)) - status = 0; - break; - } - - case wtaskBosProcessAllStopAndRestart: - { - bos_RestartBosServer_t bBosToo; - bBosToo = (lpwp->wpBosProcessAllStopAndRestart.fRestartBOS) ? BOS_RESTART_BOS_SERVER : BOS_DONT_RESTART_BOS_SERVER; - - if ((*lpBosProcessAllStopAndRestart)(lpwp->wpBosProcessAllStopAndRestart.hServer, bBosToo, &status)) - status = 0; - break; - } - - case wtaskBosAdminCreate: - { - LPSTR pszAdminA = StringToAnsi (lpwp->wpBosAdminCreate.pszAdmin); - if ((*lpBosAdminCreate)(lpwp->wpBosAdminCreate.hServer, pszAdminA, &status)) - status = 0; - FreeString (pszAdminA, lpwp->wpBosAdminCreate.pszAdmin); - break; - } - - case wtaskBosAdminDelete: - { - LPSTR pszAdminA = StringToAnsi (lpwp->wpBosAdminDelete.pszAdmin); - if ((*lpBosAdminDelete)(lpwp->wpBosAdminDelete.hServer, pszAdminA, &status)) - status = 0; - FreeString (pszAdminA, lpwp->wpBosAdminDelete.pszAdmin); - break; - } - - case wtaskBosAdminGetBegin: - { - if (!(*lpBosAdminGetBegin)(lpwp->wpBosAdminGetBegin.hServer, &lpwp->wpBosAdminGetBegin.hEnum, &status)) - lpwp->wpBosAdminGetBegin.hEnum = 0; - else - status = 0; - break; - } - - case wtaskBosAdminGetDone: - { - if ((*lpBosAdminGetDone)(lpwp->wpBosAdminGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskBosAdminGetNext: - { - char szAdminA[ 1024 ]; - if (!(*lpBosAdminGetNext)(lpwp->wpBosAdminGetNext.hEnum, szAdminA, &status)) - lpwp->wpBosAdminGetNext.pszAdmin[0] = TEXT('\0'); - else - { - status = 0; - CopyAnsiToString (lpwp->wpBosAdminGetNext.pszAdmin, szAdminA); - } - break; - } - - case wtaskBosKeyCreate: - { - kas_encryptionKey_t key; - memcpy (key.key, lpwp->wpBosKeyCreate.key.key, ENCRYPTIONKEY_LEN); - - if ((*lpBosKeyCreate)(lpwp->wpBosKeyCreate.hServer, lpwp->wpBosKeyCreate.keyVersion, &key, &status)) - status = 0; - break; - } - - case wtaskBosKeyDelete: - { - if ((*lpBosKeyDelete)(lpwp->wpBosKeyDelete.hServer, lpwp->wpBosKeyDelete.keyVersion, &status)) - status = 0; - break; - } - - case wtaskBosKeyGetBegin: - { - if (!(*lpBosKeyGetBegin)(lpwp->wpBosKeyGetBegin.hServer, &lpwp->wpBosKeyGetBegin.hEnum, &status)) - lpwp->wpBosKeyGetBegin.hEnum = 0; - else - status = 0; - break; - } - - case wtaskBosKeyGetDone: - { - if ((*lpBosKeyGetDone)(lpwp->wpBosKeyGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskBosKeyGetNext: - { - bos_KeyInfo_t keyInfo; - - if ((*lpBosKeyGetNext)(lpwp->wpBosKeyGetNext.hEnum, &keyInfo, &status)) - { - status = 0; - lpwp->wpBosKeyGetNext.keyVersion = keyInfo.keyVersionNumber; - memcpy (lpwp->wpBosKeyGetNext.keyData.key, keyInfo.key.key, ENCRYPTIONKEY_LEN); - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosKeyGetNext.keyInfo.timeLastModification, keyInfo.keyStatus.lastModificationDate); - lpwp->wpBosKeyGetNext.keyInfo.timeLastModification.wMilliseconds = keyInfo.keyStatus.lastModificationMicroSeconds; - lpwp->wpBosKeyGetNext.keyInfo.dwChecksum = (DWORD)keyInfo.keyStatus.checkSum; - } - break; - } - - case wtaskBosCellSet: - { - LPSTR pszCellA = StringToAnsi (lpwp->wpBosCellSet.pszCell); - if ((*lpBosCellSet)(lpwp->wpBosCellSet.hServer, pszCellA, &status)) - status = 0; - FreeString (pszCellA, lpwp->wpBosCellSet.pszCell); - break; - } - - case wtaskBosCellGet: - { - char szCellA[ 256 ]; - if ((*lpBosCellGet)(lpwp->wpBosCellGet.hServer, szCellA, &status)) - { - status = 0; - CopyAnsiToString (lpwp->wpBosCellGet.pszCell, szCellA); - } - break; - } - - case wtaskBosHostCreate: - { - LPSTR pszServerA = StringToAnsi (lpwp->wpBosHostCreate.pszServer); - if ((*lpBosHostCreate)(lpwp->wpBosHostCreate.hServer, pszServerA, &status)) - status = 0; - FreeString (pszServerA, lpwp->wpBosHostCreate.pszServer); - break; - } - - case wtaskBosHostDelete: - { - LPSTR pszServerA = StringToAnsi (lpwp->wpBosHostDelete.pszServer); - if ((*lpBosHostDelete)(lpwp->wpBosHostDelete.hServer, pszServerA, &status)) - status = 0; - FreeString (pszServerA, lpwp->wpBosHostDelete.pszServer); - break; - } - - case wtaskBosHostGetBegin: - { - if (!(*lpBosHostGetBegin)(lpwp->wpBosHostGetBegin.hServer, &lpwp->wpBosHostGetBegin.hEnum, &status)) - lpwp->wpBosHostGetBegin.hEnum = 0; - else - status = 0; - break; - } - - case wtaskBosHostGetDone: - { - if ((*lpBosHostGetDone)(lpwp->wpBosHostGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskBosHostGetNext: - { - char szServerA[ 256 ]; - if (!(*lpBosHostGetNext)(lpwp->wpBosHostGetNext.hEnum, szServerA, &status)) - lpwp->wpBosHostGetNext.pszServer[0] = TEXT('\0'); - else - { - status = 0; - CopyAnsiToString (lpwp->wpBosHostGetNext.pszServer, szServerA); - } - break; - } - - case wtaskBosExecutableCreate: - { - LPSTR pszLocalA = StringToAnsi (lpwp->wpBosExecutableCreate.pszLocal); - LPSTR pszRemoteDirA = StringToAnsi (lpwp->wpBosExecutableCreate.pszRemoteDir); - - if ((*lpBosExecutableCreate)(lpwp->wpBosExecutableCreate.hServer, pszLocalA, pszRemoteDirA, &status)) - status = 0; - - FreeString (pszRemoteDirA, lpwp->wpBosExecutableCreate.pszRemoteDir); - FreeString (pszLocalA, lpwp->wpBosExecutableCreate.pszLocal); - break; - } - - case wtaskBosExecutableRevert: - { - LPSTR pszFilenameA = StringToAnsi (lpwp->wpBosExecutableRevert.pszFilename); - - if ((*lpBosExecutableRevert)(lpwp->wpBosExecutableRevert.hServer, pszFilenameA, &status)) - status = 0; - - FreeString (pszFilenameA, lpwp->wpBosExecutableRevert.pszFilename); - break; - } - - case wtaskBosExecutableTimestampGet: - { - LPSTR pszFilenameA = StringToAnsi (lpwp->wpBosExecutableTimestampGet.pszFilename); - - unsigned long timeNew = 0; - unsigned long timeOld = 0; - unsigned long timeBak = 0; - if ((*lpBosExecutableTimestampGet)(lpwp->wpBosExecutableTimestampGet.hServer, pszFilenameA, &timeNew, &timeOld, &timeBak, &status)) - { - status = 0; - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosExecutableTimestampGet.timeNew, timeNew); - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosExecutableTimestampGet.timeOld, timeOld); - AfsClass_UnixTimeToSystemTime (&lpwp->wpBosExecutableTimestampGet.timeBak, timeBak); - } - - FreeString (pszFilenameA, lpwp->wpBosExecutableTimestampGet.pszFilename); - break; - } - - case wtaskBosExecutablePrune: - { - bos_Prune_t oldFiles = (lpwp->wpBosExecutablePrune.fPruneOld) ? BOS_PRUNE : BOS_DONT_PRUNE; - bos_Prune_t bakFiles = (lpwp->wpBosExecutablePrune.fPruneBak) ? BOS_PRUNE : BOS_DONT_PRUNE; - bos_Prune_t coreFiles = (lpwp->wpBosExecutablePrune.fPruneCore) ? BOS_PRUNE : BOS_DONT_PRUNE; - - if ((*lpBosExecutablePrune)(lpwp->wpBosExecutablePrune.hServer, oldFiles, bakFiles, coreFiles, &status)) - status = 0; - break; - } - - case wtaskBosExecutableRestartTimeSet: - { - bos_RestartTime_t time; - AfsClass_SystemTimeToRestartTime (&time, lpwp->wpBosExecutableRestartTimeSet.fWeeklyRestart, &lpwp->wpBosExecutableRestartTimeSet.timeWeekly); - if ((*lpBosExecutableRestartTimeSet)(lpwp->wpBosExecutableRestartTimeSet.hServer, BOS_RESTART_WEEKLY, time, &status)) - { - AfsClass_SystemTimeToRestartTime (&time, lpwp->wpBosExecutableRestartTimeSet.fDailyRestart, &lpwp->wpBosExecutableRestartTimeSet.timeDaily); - if ((*lpBosExecutableRestartTimeSet)(lpwp->wpBosExecutableRestartTimeSet.hServer, BOS_RESTART_DAILY, time, &status)) - status = 0; - } - break; - } - - case wtaskBosExecutableRestartTimeGet: - { - lpwp->wpBosExecutableRestartTimeGet.fDailyRestart = FALSE; - lpwp->wpBosExecutableRestartTimeGet.fWeeklyRestart = FALSE; - - bos_RestartTime_t time; - if ((*lpBosExecutableRestartTimeGet)(lpwp->wpBosExecutableRestartTimeGet.hServer, BOS_RESTART_WEEKLY, &time, &status)) - { - AfsClass_RestartTimeToSystemTime (&lpwp->wpBosExecutableRestartTimeGet.fWeeklyRestart, &lpwp->wpBosExecutableRestartTimeGet.timeWeekly, &time); - - if ((*lpBosExecutableRestartTimeGet)(lpwp->wpBosExecutableRestartTimeGet.hServer, BOS_RESTART_DAILY, &time, &status)) - { - AfsClass_RestartTimeToSystemTime (&lpwp->wpBosExecutableRestartTimeGet.fDailyRestart, &lpwp->wpBosExecutableRestartTimeGet.timeDaily, &time); - status = 0; - } - } - break; - } - - case wtaskBosLogGet: - { - LPSTR pszLogNameA = StringToAnsi (lpwp->wpBosLogGet.pszLogName); - - LPSTR pszLogDataA = NULL; - unsigned long cchAllocated = 0; - unsigned long cchRequired = 1024; - - do { - if (cchAllocated < cchRequired) - { - if (pszLogDataA) - { - FreeString (pszLogDataA); - pszLogDataA = NULL; - } - if ((pszLogDataA = AllocateAnsi (cchRequired)) == 0) - break; - cchAllocated = cchRequired; - } - - cchRequired = cchAllocated; - if ((*lpBosLogGet)(lpwp->wpBosLogGet.hServer, pszLogNameA, &cchRequired, pszLogDataA, &status)) - { - lpwp->wpBosLogGet.pszLogData = AllocateString (cchRequired+1); - CopyAnsiToString (lpwp->wpBosLogGet.pszLogData, pszLogDataA, cchRequired); - lpwp->wpBosLogGet.pszLogData[ cchRequired ] = TEXT('\0'); - status = 0; - break; - } - } while (cchRequired > cchAllocated); - - if (pszLogDataA) - FreeString (pszLogDataA); - FreeString (pszLogNameA, lpwp->wpBosLogGet.pszLogName); - break; - } - - case wtaskBosAuthSet: - { - bos_Auth_t auth = (lpwp->wpBosAuthSet.fEnableAuth) ? BOS_AUTH_REQUIRED : BOS_NO_AUTH; - if ((*lpBosAuthSet)(lpwp->wpBosAuthSet.hServer, auth, &status)) - status = 0; - break; - } - - case wtaskBosCommandExecute: - { - LPSTR pszCommandA = StringToAnsi (lpwp->wpBosCommandExecute.pszCommand); - if ((*lpBosCommandExecute)(lpwp->wpBosCommandExecute.hServer, pszCommandA, &status)) - status = 0; - FreeString (pszCommandA, lpwp->wpBosCommandExecute.pszCommand); - break; - } - - case wtaskBosSalvage: - { - LPSTR pszAggregateA = StringToAnsi (lpwp->wpBosSalvage.pszAggregate); - LPSTR pszFilesetA = StringToAnsi (lpwp->wpBosSalvage.pszFileset); - LPSTR pszTempDirA = StringToAnsi (lpwp->wpBosSalvage.pszTempDir); - LPSTR pszLogFileA = StringToAnsi (lpwp->wpBosSalvage.pszLogFile); - - vos_force_t force = (lpwp->wpBosSalvage.fForce) ? VOS_FORCE : VOS_NORMAL; - bos_SalvageDamagedVolumes_t salvageDamagedVolumes = (lpwp->wpBosSalvage.fReadonly) ? BOS_DONT_SALVAGE_DAMAGED_VOLUMES : BOS_SALVAGE_DAMAGED_VOLUMES; - bos_WriteInodes_t writeInodes = (lpwp->wpBosSalvage.fLogInodes) ? BOS_SALVAGE_WRITE_INODES : BOS_SALVAGE_DONT_WRITE_INODES; - bos_WriteRootInodes_t writeRootInodes = (lpwp->wpBosSalvage.fLogRootInodes) ? BOS_SALVAGE_WRITE_ROOT_INODES : BOS_SALVAGE_DONT_WRITE_ROOT_INODES; - bos_ForceDirectory_t forceDirectory = (lpwp->wpBosSalvage.fRebuildDirs) ? BOS_SALVAGE_FORCE_DIRECTORIES : BOS_SALVAGE_DONT_FORCE_DIRECTORIES; - bos_ForceBlockRead_t forceBlockRead = (lpwp->wpBosSalvage.fReadBlocks) ? BOS_SALVAGE_FORCE_BLOCK_READS : BOS_SALVAGE_DONT_FORCE_BLOCK_READS; - - if ((*lpBosSalvage)(lpwp->wpBosSalvage.hCell, lpwp->wpBosSalvage.hServer, pszAggregateA, pszFilesetA, max(lpwp->wpBosSalvage.nProcesses,1), pszTempDirA, pszLogFileA, force, salvageDamagedVolumes, writeInodes, writeRootInodes, forceDirectory, forceBlockRead, &status)) - status = 0; - - FreeString (pszLogFileA, lpwp->wpBosSalvage.pszLogFile); - FreeString (pszTempDirA, lpwp->wpBosSalvage.pszTempDir); - FreeString (pszFilesetA, lpwp->wpBosSalvage.pszFileset); - FreeString (pszAggregateA, lpwp->wpBosSalvage.pszAggregate); - break; - } - - case wtaskKasServerOpen: - { - if ((*lpKasServerOpen)(lpwp->wpKasServerOpen.hCell, (const char **)lpwp->wpKasServerOpen.apszServers, &lpwp->wpKasServerOpen.hServer, &status)) - status = 0; - break; - } - - case wtaskKasServerClose: - { - if ((*lpKasServerClose)(lpwp->wpKasServerClose.hServer, &status)) - status = 0; - break; - } - - case wtaskKasServerRandomKeyGet: - { - kas_encryptionKey_t key; - if ((*lpKasServerRandomKeyGet)(lpwp->wpKasServerRandomKeyGet.hCell, lpwp->wpKasServerRandomKeyGet.hServer, &key, &status)) - { - status = 0; - memcpy (&lpwp->wpKasServerRandomKeyGet.key.key, &key.key, ENCRYPTIONKEY_LEN); - } - break; - } - - case wtaskKasStringToKey: - { - LPSTR pszCellA = StringToAnsi (lpwp->wpKasStringToKey.pszCell); - LPSTR pszStringA = StringToAnsi (lpwp->wpKasStringToKey.pszString); - - kas_encryptionKey_t key; - if ((*lpKasStringToKey)(pszCellA, pszStringA, &key, &status)) - { - status = 0; - memcpy (&lpwp->wpKasStringToKey.key.key, &key.key, ENCRYPTIONKEY_LEN); - } - - FreeString (pszStringA, lpwp->wpKasStringToKey.pszString); - FreeString (pszCellA, lpwp->wpKasStringToKey.pszCell); - break; - } - - case wtaskKasPrincipalCreate: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalCreate.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalCreate.pszInstance); - - LPSTR pszPasswordA = StringToAnsi (lpwp->wpKasPrincipalCreate.pszPassword); - - if ((*lpKasPrincipalCreate)(lpwp->wpKasPrincipalCreate.hCell, lpwp->wpKasPrincipalCreate.hServer, &Identity, pszPasswordA, &status)) - status = 0; - - FreeString (pszPasswordA, lpwp->wpKasPrincipalCreate.pszPassword); - break; - } - - case wtaskKasPrincipalDelete: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalDelete.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalDelete.pszInstance); - - if ((*lpKasPrincipalDelete)(lpwp->wpKasPrincipalDelete.hCell, lpwp->wpKasPrincipalDelete.hServer, &Identity, &status)) - status = 0; - break; - } - - case wtaskKasPrincipalGet: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalGet.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalGet.pszInstance); - - if ((*lpKasPrincipalGet)(lpwp->wpKasPrincipalGet.hCell, lpwp->wpKasPrincipalGet.hServer, &Identity, &lpwp->wpKasPrincipalGet.Data, &status)) - status = 0; - break; - } - - case wtaskKasPrincipalGetBegin: - { - if ((*lpKasPrincipalGetBegin)(lpwp->wpKasPrincipalGetBegin.hCell, lpwp->wpKasPrincipalGetBegin.hServer, &lpwp->wpKasPrincipalGetBegin.hEnum, &status)) - status = 0; - break; - } - - case wtaskKasPrincipalGetNext: - { - kas_identity_t Identity; - if ((*lpKasPrincipalGetNext)(lpwp->wpKasPrincipalGetNext.hEnum, &Identity, &status)) - { - CopyAnsiToString (lpwp->wpKasPrincipalGetNext.pszPrincipal, Identity.principal); - CopyAnsiToString (lpwp->wpKasPrincipalGetNext.pszInstance, Identity.instance); - status = 0; - } - break; - } - - case wtaskKasPrincipalGetDone: - { - if ((*lpKasPrincipalGetDone)(lpwp->wpKasPrincipalGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskKasPrincipalKeySet: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalKeySet.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalKeySet.pszInstance); - - kas_encryptionKey_t Key; - memcpy (&Key.key, &lpwp->wpKasPrincipalKeySet.key, ENCRYPTIONKEY_LEN); - - if ((*lpKasPrincipalKeySet)(lpwp->wpKasPrincipalKeySet.hCell, lpwp->wpKasPrincipalKeySet.hServer, &Identity, lpwp->wpKasPrincipalKeySet.keyVersion, &Key, &status)) - status = 0; - break; - } - - case wtaskKasPrincipalLockStatusGet: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalLockStatusGet.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalLockStatusGet.pszInstance); - - unsigned long date; - if ((*lpKasPrincipalLockStatusGet)(lpwp->wpKasPrincipalLockStatusGet.hCell, lpwp->wpKasPrincipalLockStatusGet.hServer, &Identity, &date, &status)) - { - AfsClass_UnixTimeToSystemTime (&lpwp->wpKasPrincipalLockStatusGet.timeUnlocked, date); - status = 0; - } - break; - } - - case wtaskKasPrincipalUnlock: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalUnlock.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalUnlock.pszInstance); - - if ((*lpKasPrincipalUnlock)(lpwp->wpKasPrincipalUnlock.hCell, lpwp->wpKasPrincipalUnlock.hServer, &Identity, &status)) - status = 0; - break; - } - - case wtaskKasPrincipalFieldsSet: - { - kas_identity_t Identity; - CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalFieldsSet.pszPrincipal); - CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalFieldsSet.pszInstance); - - ULONG timeExpires = AfsClass_SystemTimeToUnixTime (&lpwp->wpKasPrincipalFieldsSet.timeExpires); - if (!timeExpires) // account never expires? - timeExpires = (ULONG)-1; - - kas_admin_t isAdmin = (lpwp->wpKasPrincipalFieldsSet.fIsAdmin) ? KAS_ADMIN : NO_KAS_ADMIN; - kas_tgs_t grantTickets = (lpwp->wpKasPrincipalFieldsSet.fGrantTickets) ? TGS : NO_TGS; - kas_enc_t canEncrypt = (lpwp->wpKasPrincipalFieldsSet.fCanEncrypt) ? ENCRYPT : NO_ENCRYPT; - kas_cpw_t canChangePassword = (lpwp->wpKasPrincipalFieldsSet.fCanChangePassword) ? CHANGE_PASSWORD : NO_CHANGE_PASSWORD; - kas_rpw_t passwordReuse = (lpwp->wpKasPrincipalFieldsSet.fCanReusePasswords) ? REUSE_PASSWORD : NO_REUSE_PASSWORD; - - if ((*lpKasPrincipalFieldsSet)(lpwp->wpKasPrincipalFieldsSet.hCell, lpwp->wpKasPrincipalFieldsSet.hServer, &Identity, - &isAdmin, - &grantTickets, - &canEncrypt, - &canChangePassword, - (unsigned int *)&timeExpires, - (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.csecTicketLifetime, - (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.cdayPwExpires, - &passwordReuse, - (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.nFailureAttempts, - (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.csecFailedLoginLockTime, - &status)) - { - status = 0; - } - break; - } - - case wtaskPtsGroupMemberAdd: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupMemberAdd.pszGroup); - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsGroupMemberAdd.pszUser); - - if ((*lpPtsGroupMemberAdd)(lpwp->wpPtsGroupMemberAdd.hCell, pszUserA, pszGroupA, &status)) - status = 0; - - FreeString (pszGroupA, lpwp->wpPtsGroupMemberAdd.pszGroup); - FreeString (pszUserA, lpwp->wpPtsGroupMemberAdd.pszUser); - break; - } - - case wtaskPtsGroupOwnerChange: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupOwnerChange.pszGroup); - LPSTR pszOwnerA = StringToAnsi (lpwp->wpPtsGroupOwnerChange.pszOwner); - - if ((*lpPtsGroupOwnerChange)(lpwp->wpPtsGroupOwnerChange.hCell, pszGroupA, pszOwnerA, &status)) - status = 0; - - FreeString (pszOwnerA, lpwp->wpPtsGroupOwnerChange.pszOwner); - FreeString (pszGroupA, lpwp->wpPtsGroupOwnerChange.pszGroup); - break; - } - - case wtaskPtsGroupCreate: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupCreate.pszGroup); - LPSTR pszOwnerA = StringToAnsi (lpwp->wpPtsGroupCreate.pszOwner); - - if ((*lpPtsGroupCreate)(lpwp->wpPtsGroupCreate.hCell, pszGroupA, pszOwnerA, &lpwp->wpPtsGroupCreate.idGroup, &status)) - status = 0; - - FreeString (pszOwnerA, lpwp->wpPtsGroupCreate.pszOwner); - FreeString (pszGroupA, lpwp->wpPtsGroupCreate.pszGroup); - break; - } - - case wtaskPtsGroupGet: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupGet.pszGroup); - - if ((*lpPtsGroupGet)(lpwp->wpPtsGroupGet.hCell, pszGroupA, &lpwp->wpPtsGroupGet.Entry, &status)) - status = 0; - - FreeString (pszGroupA, lpwp->wpPtsGroupGet.pszGroup); - break; - } - - case wtaskPtsGroupDelete: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupDelete.pszGroup); - - if ((*lpPtsGroupDelete)(lpwp->wpPtsGroupDelete.hCell, pszGroupA, &status)) - status = 0; - - FreeString (pszGroupA, lpwp->wpPtsGroupDelete.pszGroup); - break; - } - - case wtaskPtsGroupMaxGet: - { - if ((*lpPtsGroupMaxGet)(lpwp->wpPtsGroupMaxGet.hCell, &lpwp->wpPtsGroupMaxGet.idGroupMax, &status)) - status = 0; - break; - } - - case wtaskPtsGroupMaxSet: - { - if ((*lpPtsGroupMaxSet)(lpwp->wpPtsGroupMaxSet.hCell, lpwp->wpPtsGroupMaxSet.idGroupMax, &status)) - status = 0; - break; - } - - case wtaskPtsGroupMemberListBegin: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupMemberListBegin.pszGroup); - - if ((*lpPtsGroupMemberListBegin)(lpwp->wpPtsGroupMemberListBegin.hCell, pszGroupA, &lpwp->wpPtsGroupMemberListBegin.hEnum, &status)) - status = 0; - - FreeString (pszGroupA, lpwp->wpPtsGroupMemberListBegin.pszGroup); - break; - } - - case wtaskPtsGroupMemberListNext: - { - char szMemberA[ cchNAME ]; - if ((*lpPtsGroupMemberListNext)(lpwp->wpPtsGroupMemberListNext.hEnum, szMemberA, &status)) - { - CopyAnsiToString (lpwp->wpPtsGroupMemberListNext.pszMember, szMemberA); - status = 0; - } - break; - } - - case wtaskPtsGroupMemberListDone: - { - if ((*lpPtsGroupMemberListDone)(lpwp->wpPtsGroupMemberListDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskPtsGroupMemberRemove: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupMemberRemove.pszGroup); - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsGroupMemberRemove.pszUser); - - if ((*lpPtsGroupMemberRemove)(lpwp->wpPtsGroupMemberRemove.hCell, pszUserA, pszGroupA, &status)) - status = 0; - - FreeString (pszUserA, lpwp->wpPtsGroupMemberRemove.pszUser); - FreeString (pszGroupA, lpwp->wpPtsGroupMemberRemove.pszGroup); - break; - } - - case wtaskPtsGroupRename: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupRename.pszGroup); - LPSTR pszNewNameA = StringToAnsi (lpwp->wpPtsGroupRename.pszNewName); - - if ((*lpPtsGroupRename)(lpwp->wpPtsGroupRename.hCell, pszGroupA, pszNewNameA, &status)) - status = 0; - - FreeString (pszNewNameA, lpwp->wpPtsGroupRename.pszNewName); - FreeString (pszGroupA, lpwp->wpPtsGroupRename.pszGroup); - break; - } - - case wtaskPtsGroupModify: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupModify.pszGroup); - - if ((*lpPtsGroupModify)(lpwp->wpPtsGroupModify.hCell, pszGroupA, &lpwp->wpPtsGroupModify.Delta, &status)) - status = 0; - - FreeString (pszGroupA, lpwp->wpPtsGroupModify.pszGroup); - break; - } - - case wtaskPtsUserCreate: - { - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserCreate.pszUser); - - if ((*lpPtsUserCreate)(lpwp->wpPtsUserCreate.hCell, pszUserA, &lpwp->wpPtsUserCreate.idUser, &status)) - status = 0; - - FreeString (pszUserA, lpwp->wpPtsUserCreate.pszUser); - break; - } - - case wtaskPtsUserDelete: - { - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserDelete.pszUser); - - if ((*lpPtsUserDelete)(lpwp->wpPtsUserDelete.hCell, pszUserA, &status)) - status = 0; - - FreeString (pszUserA, lpwp->wpPtsUserDelete.pszUser); - break; - } - - case wtaskPtsUserGet: - { - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserGet.pszUser); - - if ((*lpPtsUserGet)(lpwp->wpPtsUserGet.hCell, pszUserA, &lpwp->wpPtsUserGet.Entry, &status)) - status = 0; - - FreeString (pszUserA, lpwp->wpPtsUserGet.pszUser); - break; - } - - case wtaskPtsUserRename: - { - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserRename.pszUser); - LPSTR pszNewNameA = StringToAnsi (lpwp->wpPtsUserRename.pszNewName); - - if ((*lpPtsUserRename)(lpwp->wpPtsUserRename.hCell, pszUserA, pszNewNameA, &status)) - status = 0; - - FreeString (pszNewNameA, lpwp->wpPtsUserRename.pszNewName); - FreeString (pszUserA, lpwp->wpPtsUserRename.pszUser); - break; - } - - case wtaskPtsUserModify: - { - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserModify.pszUser); - - if ((*lpPtsUserModify)(lpwp->wpPtsUserModify.hCell, pszUserA, &lpwp->wpPtsUserModify.Delta, &status)) - status = 0; - - FreeString (pszUserA, lpwp->wpPtsUserModify.pszUser); - break; - } - - case wtaskPtsUserMaxGet: - { - if ((*lpPtsUserMaxGet)(lpwp->wpPtsUserMaxGet.hCell, &lpwp->wpPtsUserMaxGet.idUserMax, &status)) - status = 0; - break; - } - - case wtaskPtsUserMaxSet: - { - if ((*lpPtsUserMaxSet)(lpwp->wpPtsUserMaxSet.hCell, lpwp->wpPtsUserMaxSet.idUserMax, &status)) - status = 0; - break; - } - - case wtaskPtsUserMemberListBegin: - { - LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserMemberListBegin.pszUser); - - if ((*lpPtsUserMemberListBegin)(lpwp->wpPtsUserMemberListBegin.hCell, pszUserA, &lpwp->wpPtsUserMemberListBegin.hEnum, &status)) - status = 0; - - FreeString (pszUserA, lpwp->wpPtsUserMemberListBegin.pszUser); - break; - } - - case wtaskPtsUserMemberListNext: - { - char szGroupA[ cchNAME ]; - if ((*lpPtsUserMemberListNext)(lpwp->wpPtsUserMemberListNext.hEnum, szGroupA, &status)) - { - CopyAnsiToString (lpwp->wpPtsUserMemberListNext.pszGroup, szGroupA); - status = 0; - } - break; - } - - case wtaskPtsUserMemberListDone: - { - if ((*lpPtsUserMemberListDone)(lpwp->wpPtsUserMemberListDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskPtsOwnedGroupListBegin: - { - LPSTR pszOwnerA = StringToAnsi (lpwp->wpPtsOwnedGroupListBegin.pszOwner); - - if ((*lpPtsOwnedGroupListBegin)(lpwp->wpPtsOwnedGroupListBegin.hCell, pszOwnerA, &lpwp->wpPtsOwnedGroupListBegin.hEnum, &status)) - status = 0; - - FreeString (pszOwnerA, lpwp->wpPtsOwnedGroupListBegin.pszOwner); - break; - } - - case wtaskPtsOwnedGroupListNext: - { - LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsOwnedGroupListNext.pszGroup); - - if ((*lpPtsOwnedGroupListNext)(lpwp->wpPtsOwnedGroupListNext.hEnum, pszGroupA, &status)) - status = 0; - - FreeString (pszGroupA, lpwp->wpPtsOwnedGroupListNext.pszGroup); - break; - } - - case wtaskPtsOwnedGroupListDone: - { - if ((*lpPtsOwnedGroupListDone)(lpwp->wpPtsOwnedGroupListDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskClientTokenGetExisting: - { - LPTSTR pszCellA = StringToAnsi (lpwp->wpClientTokenGetExisting.pszCell); - - if ((*lpClientTokenGetExisting)(pszCellA, &lpwp->wpClientTokenGetExisting.hCreds, &status)) - status = 0; - - FreeString (pszCellA, lpwp->wpClientTokenGetExisting.pszCell); - break; - } - - case wtaskClientCellOpen: - { - LPTSTR pszCellA = StringToAnsi (lpwp->wpClientCellOpen.pszCell); - - if ((*lpClientCellOpen)(pszCellA, lpwp->wpClientCellOpen.hCreds, &lpwp->wpClientCellOpen.hCell, &status)) - status = 0; - - FreeString (pszCellA, lpwp->wpClientCellOpen.pszCell); - break; - } - - case wtaskClientCellClose: - { - if ((*lpClientCellClose)(lpwp->wpClientCellClose.hCell, &status)) - status = 0; - break; - } - - case wtaskClientLocalCellGet: - { - char szCellA[ cchNAME ]; - if ((*lpClientLocalCellGet)(szCellA, &status)) - { - status = 0; - CopyAnsiToString (lpwp->wpClientLocalCellGet.pszCell, szCellA); - } - break; - } - - case wtaskClientAFSServerGet: - { - LPTSTR pszServerA = StringToAnsi (lpwp->wpClientAFSServerGet.pszServer); - - if ((*lpClientAFSServerGet)(lpwp->wpClientAFSServerGet.hCell, pszServerA, &lpwp->wpClientAFSServerGet.Entry, &status)) - status = 0; - - FreeString (pszServerA, lpwp->wpClientAFSServerGet.pszServer); - break; - } - - case wtaskClientAFSServerGetBegin: - { - if ((*lpClientAFSServerGetBegin)(lpwp->wpClientAFSServerGetBegin.hCell, &lpwp->wpClientAFSServerGetBegin.hEnum, &status)) - status = 0; - break; - } - - case wtaskClientAFSServerGetNext: - { - if ((*lpClientAFSServerGetNext)(lpwp->wpClientAFSServerGetNext.hEnum, &lpwp->wpClientAFSServerGetNext.Entry, &status)) - status = 0; - break; - } - - case wtaskClientAFSServerGetDone: - { - if ((*lpClientAFSServerGetDone)(lpwp->wpClientAFSServerGetDone.hEnum, &status)) - status = 0; - break; - } - - case wtaskUtilDatabaseServerGetBegin: - { - LPSTR pszCellA = StringToAnsi (lpwp->wpUtilDatabaseServerGetBegin.pszCell); - - if ((*lpUtilDatabaseServerGetBegin)(pszCellA, &lpwp->wpUtilDatabaseServerGetBegin.hEnum, &status)) - status = 0; - - FreeString (pszCellA, lpwp->wpUtilDatabaseServerGetBegin.pszCell); - break; - } - - case wtaskUtilDatabaseServerGetNext: - { - int Address; - if ((*lpUtilDatabaseServerGetNext)(lpwp->wpUtilDatabaseServerGetNext.hEnum, &Address, &status)) - { - AfsClass_IntToAddress (&lpwp->wpUtilDatabaseServerGetNext.Address, Address); - status = 0; - } - break; - } - - case wtaskUtilDatabaseServerGetDone: - { - if ((*lpUtilDatabaseServerGetDone)(lpwp->wpUtilDatabaseServerGetDone.hEnum, &status)) - status = 0; - break; - } - - // ADD HERE - } - - return (DWORD)status; -} - - -BOOL Worker_LoadLibraries (ULONG *pStatus) -{ - if ((hiVOS = LoadLibrary (cszAFSVOSDLL)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - if ((hiBOS = LoadLibrary (cszAFSBOSDLL)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - if ((hiKAS = LoadLibrary (cszAFSKASDLL)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - if ((hiPTS = LoadLibrary (cszAFSPTSDLL)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - if ((hiUtil = LoadLibrary (cszAFSUTILDLL)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - if ((hiClient = LoadLibrary (cszAFSCLIENTDLL)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - - lpVosBackupVolumeCreate = (lpVosBackupVolumeCreate_t)GetProcAddress (hiVOS, "vos_BackupVolumeCreate"); - lpVosBackupVolumeCreateMultiple = (lpVosBackupVolumeCreateMultiple_t)GetProcAddress (hiVOS, "vos_BackupVolumeCreateMultiple"); - lpVosPartitionGet = (lpVosPartitionGet_t)GetProcAddress (hiVOS, "vos_PartitionGet"); - lpVosPartitionGetBegin = (lpVosPartitionGetBegin_t)GetProcAddress (hiVOS, "vos_PartitionGetBegin"); - lpVosPartitionGetNext = (lpVosPartitionGetNext_t)GetProcAddress (hiVOS, "vos_PartitionGetNext"); - lpVosPartitionGetDone = (lpVosPartitionGetDone_t)GetProcAddress (hiVOS, "vos_PartitionGetDone"); - lpVosServerOpen = (lpVosServerOpen_t)GetProcAddress (hiVOS, "vos_ServerOpen"); - lpVosServerClose = (lpVosServerClose_t)GetProcAddress (hiVOS, "vos_ServerClose"); - lpVosServerSync = (lpVosServerSync_t)GetProcAddress (hiVOS, "vos_ServerSync"); - lpVosFileServerAddressChange = (lpVosFileServerAddressChange_t)GetProcAddress (hiVOS, "vos_FileServerAddressChange"); - lpVosFileServerAddressRemove = (lpVosFileServerAddressRemove_t)GetProcAddress (hiVOS, "vos_FileServerAddressRemove"); - lpVosFileServerGetBegin = (lpVosFileServerGetBegin_t)GetProcAddress (hiVOS, "vos_FileServerGetBegin"); - lpVosFileServerGetNext = (lpVosFileServerGetNext_t)GetProcAddress (hiVOS, "vos_FileServerGetNext"); - lpVosFileServerGetDone = (lpVosFileServerGetDone_t)GetProcAddress (hiVOS, "vos_FileServerGetDone"); - lpVosServerTransactionStatusGetBegin = (lpVosServerTransactionStatusGetBegin_t)GetProcAddress (hiVOS, "vos_ServerTransactionStatusGetBegin"); - lpVosServerTransactionStatusGetNext = (lpVosServerTransactionStatusGetNext_t)GetProcAddress (hiVOS, "vos_ServerTransactionStatusGetNext"); - lpVosServerTransactionStatusGetDone = (lpVosServerTransactionStatusGetDone_t)GetProcAddress (hiVOS, "vos_ServerTransactionStatusGetDone"); - lpVosVLDBGet = (lpVosVLDBGet_t)GetProcAddress (hiVOS, "vos_VLDBGet"); - lpVosVLDBGetBegin = (lpVosVLDBGetBegin_t)GetProcAddress (hiVOS, "vos_VLDBGetBegin"); - lpVosVLDBGetNext = (lpVosVLDBGetNext_t)GetProcAddress (hiVOS, "vos_VLDBGetNext"); - lpVosVLDBGetDone = (lpVosVLDBGetDone_t)GetProcAddress (hiVOS, "vos_VLDBGetDone"); - lpVosVLDBEntryRemove = (lpVosVLDBEntryRemove_t)GetProcAddress (hiVOS, "vos_VLDBEntryRemove"); - lpVosVLDBUnlock = (lpVosVLDBUnlock_t)GetProcAddress (hiVOS, "vos_VLDBUnlock"); - lpVosVLDBEntryLock = (lpVosVLDBEntryLock_t)GetProcAddress (hiVOS, "vos_VLDBEntryLock"); - lpVosVLDBEntryUnlock = (lpVosVLDBEntryUnlock_t)GetProcAddress (hiVOS, "vos_VLDBEntryUnlock"); - lpVosVLDBReadOnlySiteCreate = (lpVosVLDBReadOnlySiteCreate_t)GetProcAddress (hiVOS, "vos_VLDBReadOnlySiteCreate"); - lpVosVLDBReadOnlySiteDelete = (lpVosVLDBReadOnlySiteDelete_t)GetProcAddress (hiVOS, "vos_VLDBReadOnlySiteDelete"); - lpVosVLDBSync = (lpVosVLDBSync_t)GetProcAddress (hiVOS, "vos_VLDBSync"); - lpVosVolumeCreate = (lpVosVolumeCreate_t)GetProcAddress (hiVOS, "vos_VolumeCreate"); - lpVosVolumeDelete = (lpVosVolumeDelete_t)GetProcAddress (hiVOS, "vos_VolumeDelete"); - lpVosVolumeRename = (lpVosVolumeRename_t)GetProcAddress (hiVOS, "vos_VolumeRename"); - lpVosVolumeDump = (lpVosVolumeDump_t)GetProcAddress (hiVOS, "vos_VolumeDump"); - lpVosVolumeRestore = (lpVosVolumeRestore_t)GetProcAddress (hiVOS, "vos_VolumeRestore"); - lpVosVolumeOnline = (lpVosVolumeOnline_t)GetProcAddress (hiVOS, "vos_VolumeOnline"); - lpVosVolumeOffline = (lpVosVolumeOffline_t)GetProcAddress (hiVOS, "vos_VolumeOffline"); - lpVosVolumeGet = (lpVosVolumeGet_t)GetProcAddress (hiVOS, "vos_VolumeGet"); - lpVosVolumeGetBegin = (lpVosVolumeGetBegin_t)GetProcAddress (hiVOS, "vos_VolumeGetBegin"); - lpVosVolumeGetNext = (lpVosVolumeGetNext_t)GetProcAddress (hiVOS, "vos_VolumeGetNext"); - lpVosVolumeGetDone = (lpVosVolumeGetDone_t)GetProcAddress (hiVOS, "vos_VolumeGetDone"); - lpVosVolumeMove = (lpVosVolumeMove_t)GetProcAddress (hiVOS, "vos_VolumeMove"); - lpVosVolumeRelease = (lpVosVolumeRelease_t)GetProcAddress (hiVOS, "vos_VolumeRelease"); - lpVosVolumeZap = (lpVosVolumeZap_t)GetProcAddress (hiVOS, "vos_VolumeZap"); - lpVosPartitionNameToId = (lpVosPartitionNameToId_t)GetProcAddress (hiVOS, "vos_PartitionNameToId"); - lpVosPartitionIdToName = (lpVosPartitionIdToName_t)GetProcAddress (hiVOS, "vos_PartitionIdToName"); - lpVosVolumeQuotaChange = (lpVosVolumeQuotaChange_t)GetProcAddress (hiVOS, "vos_VolumeQuotaChange"); - - lpBosServerOpen = (lpBosServerOpen_t)GetProcAddress (hiBOS, "bos_ServerOpen"); - lpBosServerClose = (lpBosServerClose_t)GetProcAddress (hiBOS, "bos_ServerClose"); - lpBosProcessCreate = (lpBosProcessCreate_t)GetProcAddress (hiBOS, "bos_ProcessCreate"); - lpBosProcessDelete = (lpBosProcessDelete_t)GetProcAddress (hiBOS, "bos_ProcessDelete"); - lpBosProcessExecutionStateGet = (lpBosProcessExecutionStateGet_t)GetProcAddress (hiBOS, "bos_ProcessExecutionStateGet"); - lpBosProcessExecutionStateSet = (lpBosProcessExecutionStateSet_t)GetProcAddress (hiBOS, "bos_ProcessExecutionStateSet"); - lpBosProcessExecutionStateSetTemporary = (lpBosProcessExecutionStateSetTemporary_t)GetProcAddress (hiBOS, "bos_ProcessExecutionStateSetTemporary"); - lpBosProcessNameGetBegin = (lpBosProcessNameGetBegin_t)GetProcAddress (hiBOS, "bos_ProcessNameGetBegin"); - lpBosProcessNameGetDone = (lpBosProcessNameGetDone_t)GetProcAddress (hiBOS, "bos_ProcessNameGetDone"); - lpBosProcessNameGetNext = (lpBosProcessNameGetNext_t)GetProcAddress (hiBOS, "bos_ProcessNameGetNext"); - lpBosProcessInfoGet = (lpBosProcessInfoGet_t)GetProcAddress (hiBOS, "bos_ProcessInfoGet"); - lpBosProcessParameterGetBegin = (lpBosProcessParameterGetBegin_t)GetProcAddress (hiBOS, "bos_ProcessParameterGetBegin"); - lpBosProcessParameterGetDone = (lpBosProcessParameterGetDone_t)GetProcAddress (hiBOS, "bos_ProcessParameterGetDone"); - lpBosProcessParameterGetNext = (lpBosProcessParameterGetNext_t)GetProcAddress (hiBOS, "bos_ProcessParameterGetNext"); - lpBosProcessNotifierGet = (lpBosProcessNotifierGet_t)GetProcAddress (hiBOS, "bos_ProcessNotifierGet"); - lpBosProcessRestart = (lpBosProcessRestart_t)GetProcAddress (hiBOS, "bos_ProcessRestart"); - lpBosProcessAllStop = (lpBosProcessAllStop_t)GetProcAddress (hiBOS, "bos_ProcessAllStop"); - lpBosProcessAllStart = (lpBosProcessAllStart_t)GetProcAddress (hiBOS, "bos_ProcessAllStart"); - lpBosProcessAllWaitStop = (lpBosProcessAllWaitStop_t)GetProcAddress (hiBOS, "bos_ProcessAllWaitStop"); - lpBosProcessAllStopAndRestart = (lpBosProcessAllStopAndRestart_t)GetProcAddress (hiBOS, "bos_ProcessAllStopAndRestart"); - lpBosAdminCreate = (lpBosAdminCreate_t)GetProcAddress (hiBOS, "bos_AdminCreate"); - lpBosAdminDelete = (lpBosAdminDelete_t)GetProcAddress (hiBOS, "bos_AdminDelete"); - lpBosAdminGetBegin = (lpBosAdminGetBegin_t)GetProcAddress (hiBOS, "bos_AdminGetBegin"); - lpBosAdminGetDone = (lpBosAdminGetDone_t)GetProcAddress (hiBOS, "bos_AdminGetDone"); - lpBosAdminGetNext = (lpBosAdminGetNext_t)GetProcAddress (hiBOS, "bos_AdminGetNext"); - lpBosKeyCreate = (lpBosKeyCreate_t)GetProcAddress (hiBOS, "bos_KeyCreate"); - lpBosKeyDelete = (lpBosKeyDelete_t)GetProcAddress (hiBOS, "bos_KeyDelete"); - lpBosKeyGetBegin = (lpBosKeyGetBegin_t)GetProcAddress (hiBOS, "bos_KeyGetBegin"); - lpBosKeyGetDone = (lpBosKeyGetDone_t)GetProcAddress (hiBOS, "bos_KeyGetDone"); - lpBosKeyGetNext = (lpBosKeyGetNext_t)GetProcAddress (hiBOS, "bos_KeyGetNext"); - lpBosCellSet = (lpBosCellSet_t)GetProcAddress (hiBOS, "bos_CellSet"); - lpBosCellGet = (lpBosCellGet_t)GetProcAddress (hiBOS, "bos_CellGet"); - lpBosHostCreate = (lpBosHostCreate_t)GetProcAddress (hiBOS, "bos_HostCreate"); - lpBosHostDelete = (lpBosHostDelete_t)GetProcAddress (hiBOS, "bos_HostDelete"); - lpBosHostGetBegin = (lpBosHostGetBegin_t)GetProcAddress (hiBOS, "bos_HostGetBegin"); - lpBosHostGetDone = (lpBosHostGetDone_t)GetProcAddress (hiBOS, "bos_HostGetDone"); - lpBosHostGetNext = (lpBosHostGetNext_t)GetProcAddress (hiBOS, "bos_HostGetNext"); - lpBosExecutableCreate = (lpBosExecutableCreate_t)GetProcAddress (hiBOS, "bos_ExecutableCreate"); - lpBosExecutableRevert = (lpBosExecutableRevert_t)GetProcAddress (hiBOS, "bos_ExecutableRevert"); - lpBosExecutableTimestampGet = (lpBosExecutableTimestampGet_t)GetProcAddress (hiBOS, "bos_ExecutableTimestampGet"); - lpBosExecutablePrune = (lpBosExecutablePrune_t)GetProcAddress (hiBOS, "bos_ExecutablePrune"); - lpBosExecutableRestartTimeSet = (lpBosExecutableRestartTimeSet_t)GetProcAddress (hiBOS, "bos_ExecutableRestartTimeSet"); - lpBosExecutableRestartTimeGet = (lpBosExecutableRestartTimeGet_t)GetProcAddress (hiBOS, "bos_ExecutableRestartTimeGet"); - lpBosLogGet = (lpBosLogGet_t)GetProcAddress (hiBOS, "bos_LogGet"); - lpBosAuthSet = (lpBosAuthSet_t)GetProcAddress (hiBOS, "bos_AuthSet"); - lpBosCommandExecute = (lpBosCommandExecute_t)GetProcAddress (hiBOS, "bos_CommandExecute"); - lpBosSalvage = (lpBosSalvage_t)GetProcAddress (hiBOS, "bos_Salvage"); - - lpKasServerOpen = (lpKasServerOpen_t)GetProcAddress (hiKAS, "kas_ServerOpen"); - lpKasServerClose = (lpKasServerClose_t)GetProcAddress (hiKAS, "kas_ServerClose"); - lpKasServerStatsGet = (lpKasServerStatsGet_t)GetProcAddress (hiKAS, "kas_ServerStatsGet"); - lpKasServerDebugGet = (lpKasServerDebugGet_t)GetProcAddress (hiKAS, "kas_ServerDebugGet"); - lpKasServerRandomKeyGet = (lpKasServerRandomKeyGet_t)GetProcAddress (hiKAS, "kas_ServerRandomKeyGet"); - lpKasStringToKey = (lpKasStringToKey_t)GetProcAddress (hiKAS, "kas_StringToKey"); - lpKasPrincipalCreate = (lpKasPrincipalCreate_t)GetProcAddress (hiKAS, "kas_PrincipalCreate"); - lpKasPrincipalDelete = (lpKasPrincipalDelete_t)GetProcAddress (hiKAS, "kas_PrincipalDelete"); - lpKasPrincipalGet = (lpKasPrincipalGet_t)GetProcAddress (hiKAS, "kas_PrincipalGet"); - lpKasPrincipalGetBegin = (lpKasPrincipalGetBegin_t)GetProcAddress (hiKAS, "kas_PrincipalGetBegin"); - lpKasPrincipalGetNext = (lpKasPrincipalGetNext_t)GetProcAddress (hiKAS, "kas_PrincipalGetNext"); - lpKasPrincipalGetDone = (lpKasPrincipalGetDone_t)GetProcAddress (hiKAS, "kas_PrincipalGetDone"); - lpKasPrincipalKeySet = (lpKasPrincipalKeySet_t)GetProcAddress (hiKAS, "kas_PrincipalKeySet"); - lpKasPrincipalLockStatusGet = (lpKasPrincipalLockStatusGet_t)GetProcAddress (hiKAS, "kas_PrincipalLockStatusGet"); - lpKasPrincipalUnlock = (lpKasPrincipalUnlock_t)GetProcAddress (hiKAS, "kas_PrincipalUnlock"); - lpKasPrincipalFieldsSet = (lpKasPrincipalFieldsSet_t)GetProcAddress (hiKAS, "kas_PrincipalFieldsSet"); - - lpPtsGroupMemberAdd = (lpPtsGroupMemberAdd_t)GetProcAddress (hiPTS, "pts_GroupMemberAdd"); - lpPtsGroupOwnerChange = (lpPtsGroupOwnerChange_t)GetProcAddress (hiPTS, "pts_GroupOwnerChange"); - lpPtsGroupCreate = (lpPtsGroupCreate_t)GetProcAddress (hiPTS, "pts_GroupCreate"); - lpPtsGroupGet = (lpPtsGroupGet_t)GetProcAddress (hiPTS, "pts_GroupGet"); - lpPtsGroupDelete = (lpPtsGroupDelete_t)GetProcAddress (hiPTS, "pts_GroupDelete"); - lpPtsGroupMaxGet = (lpPtsGroupMaxGet_t)GetProcAddress (hiPTS, "pts_GroupMaxGet"); - lpPtsGroupMaxSet = (lpPtsGroupMaxSet_t)GetProcAddress (hiPTS, "pts_GroupMaxSet"); - lpPtsGroupMemberListBegin = (lpPtsGroupMemberListBegin_t)GetProcAddress (hiPTS, "pts_GroupMemberListBegin"); - lpPtsGroupMemberListNext = (lpPtsGroupMemberListNext_t)GetProcAddress (hiPTS, "pts_GroupMemberListNext"); - lpPtsGroupMemberListDone = (lpPtsGroupMemberListDone_t)GetProcAddress (hiPTS, "pts_GroupMemberListDone"); - lpPtsGroupMemberRemove = (lpPtsGroupMemberRemove_t)GetProcAddress (hiPTS, "pts_GroupMemberRemove"); - lpPtsGroupRename = (lpPtsGroupRename_t)GetProcAddress (hiPTS, "pts_GroupRename"); - lpPtsGroupModify = (lpPtsGroupModify_t)GetProcAddress (hiPTS, "pts_GroupModify"); - lpPtsUserCreate = (lpPtsUserCreate_t)GetProcAddress (hiPTS, "pts_UserCreate"); - lpPtsUserDelete = (lpPtsUserDelete_t)GetProcAddress (hiPTS, "pts_UserDelete"); - lpPtsUserGet = (lpPtsUserGet_t)GetProcAddress (hiPTS, "pts_UserGet"); - lpPtsUserRename = (lpPtsUserRename_t)GetProcAddress (hiPTS, "pts_UserRename"); - lpPtsUserModify = (lpPtsUserModify_t)GetProcAddress (hiPTS, "pts_UserModify"); - lpPtsUserMaxGet = (lpPtsUserMaxGet_t)GetProcAddress (hiPTS, "pts_UserMaxGet"); - lpPtsUserMaxSet = (lpPtsUserMaxSet_t)GetProcAddress (hiPTS, "pts_UserMaxSet"); - lpPtsUserMemberListBegin = (lpPtsUserMemberListBegin_t)GetProcAddress (hiPTS, "pts_UserMemberListBegin"); - lpPtsUserMemberListNext = (lpPtsUserMemberListNext_t)GetProcAddress (hiPTS, "pts_UserMemberListNext"); - lpPtsUserMemberListDone = (lpPtsUserMemberListDone_t)GetProcAddress (hiPTS, "pts_UserMemberListDone"); - lpPtsOwnedGroupListBegin = (lpPtsOwnedGroupListBegin_t)GetProcAddress (hiPTS, "pts_OwnedGroupListBegin"); - lpPtsOwnedGroupListNext = (lpPtsOwnedGroupListNext_t)GetProcAddress (hiPTS, "pts_OwnedGroupListNext"); - lpPtsOwnedGroupListDone = (lpPtsOwnedGroupListDone_t)GetProcAddress (hiPTS, "pts_OwnedGroupListDone"); - - lpClientTokenGetExisting = (lpClientTokenGetExisting_t)GetProcAddress (hiClient, "afsclient_TokenGetExisting"); - lpClientCellOpen = (lpClientCellOpen_t)GetProcAddress (hiClient, "afsclient_CellOpen"); - lpClientCellClose = (lpClientCellClose_t)GetProcAddress (hiClient, "afsclient_CellClose"); - lpClientLocalCellGet = (lpClientLocalCellGet_t)GetProcAddress (hiClient, "afsclient_LocalCellGet"); - lpClientAFSServerGet = (lpClientAFSServerGet_t)GetProcAddress (hiClient, "afsclient_AFSServerGet"); - lpClientAFSServerGetBegin = (lpClientAFSServerGetBegin_t)GetProcAddress (hiClient, "afsclient_AFSServerGetBegin"); - lpClientAFSServerGetNext = (lpClientAFSServerGetNext_t)GetProcAddress (hiClient, "afsclient_AFSServerGetNext"); - lpClientAFSServerGetDone = (lpClientAFSServerGetDone_t)GetProcAddress (hiClient, "afsclient_AFSServerGetDone"); - lpClientInit = (lpClientInit_t)GetProcAddress (hiClient, "afsclient_Init"); - - lpUtilDatabaseServerGetBegin = (lpUtilDatabaseServerGetBegin_t)GetProcAddress (hiUtil, "util_DatabaseServerGetBegin"); - lpUtilDatabaseServerGetNext = (lpUtilDatabaseServerGetNext_t)GetProcAddress (hiUtil, "util_DatabaseServerGetNext"); - lpUtilDatabaseServerGetDone = (lpUtilDatabaseServerGetDone_t)GetProcAddress (hiUtil, "util_DatabaseServerGetDone"); - - // ADD HERE - - if ( (lpVosBackupVolumeCreate == NULL) || - (lpVosBackupVolumeCreateMultiple == NULL) || - (lpVosPartitionGet == NULL) || - (lpVosPartitionGetBegin == NULL) || - (lpVosPartitionGetNext == NULL) || - (lpVosPartitionGetDone == NULL) || - (lpVosServerOpen == NULL) || - (lpVosServerClose == NULL) || - (lpVosServerSync == NULL) || - (lpVosFileServerAddressChange == NULL) || - (lpVosFileServerAddressRemove == NULL) || - (lpVosFileServerGetBegin == NULL) || - (lpVosFileServerGetNext == NULL) || - (lpVosFileServerGetDone == NULL) || - (lpVosServerTransactionStatusGetBegin == NULL) || - (lpVosServerTransactionStatusGetNext == NULL) || - (lpVosServerTransactionStatusGetDone == NULL) || - (lpVosVLDBGet == NULL) || - (lpVosVLDBGetBegin == NULL) || - (lpVosVLDBGetNext == NULL) || - (lpVosVLDBGetDone == NULL) || - (lpVosVLDBEntryRemove == NULL) || - (lpVosVLDBUnlock == NULL) || - (lpVosVLDBEntryLock == NULL) || - (lpVosVLDBEntryUnlock == NULL) || - (lpVosVLDBReadOnlySiteCreate == NULL) || - (lpVosVLDBReadOnlySiteDelete == NULL) || - (lpVosVLDBSync == NULL) || - (lpVosVolumeCreate == NULL) || - (lpVosVolumeDelete == NULL) || - (lpVosVolumeRename == NULL) || - (lpVosVolumeDump == NULL) || - (lpVosVolumeRestore == NULL) || - (lpVosVolumeOnline == NULL) || - (lpVosVolumeOffline == NULL) || - (lpVosVolumeGet == NULL) || - (lpVosVolumeGetBegin == NULL) || - (lpVosVolumeGetNext == NULL) || - (lpVosVolumeGetDone == NULL) || - (lpVosVolumeMove == NULL) || - (lpVosVolumeRelease == NULL) || - (lpVosVolumeZap == NULL) || - (lpVosPartitionNameToId == NULL) || - (lpVosPartitionIdToName == NULL) || - (lpVosVolumeQuotaChange == NULL) || - (lpBosServerOpen == NULL) || - (lpBosServerClose == NULL) || - (lpBosProcessCreate == NULL) || - (lpBosProcessDelete == NULL) || - (lpBosProcessExecutionStateGet == NULL) || - (lpBosProcessExecutionStateSet == NULL) || - (lpBosProcessExecutionStateSetTemporary == NULL) || - (lpBosProcessNameGetBegin == NULL) || - (lpBosProcessNameGetDone == NULL) || - (lpBosProcessNameGetNext == NULL) || - (lpBosProcessInfoGet == NULL) || - (lpBosProcessParameterGetBegin == NULL) || - (lpBosProcessParameterGetDone == NULL) || - (lpBosProcessParameterGetNext == NULL) || - (lpBosProcessNotifierGet == NULL) || - (lpBosProcessRestart == NULL) || - (lpBosProcessAllStop == NULL) || - (lpBosProcessAllStart == NULL) || - (lpBosProcessAllWaitStop == NULL) || - (lpBosProcessAllStopAndRestart == NULL) || - (lpBosAdminCreate == NULL) || - (lpBosAdminDelete == NULL) || - (lpBosAdminGetBegin == NULL) || - (lpBosAdminGetDone == NULL) || - (lpBosAdminGetNext == NULL) || - (lpBosKeyCreate == NULL) || - (lpBosKeyDelete == NULL) || - (lpBosKeyGetBegin == NULL) || - (lpBosKeyGetDone == NULL) || - (lpBosKeyGetNext == NULL) || - (lpBosCellSet == NULL) || - (lpBosCellGet == NULL) || - (lpBosHostCreate == NULL) || - (lpBosHostDelete == NULL) || - (lpBosHostGetBegin == NULL) || - (lpBosHostGetDone == NULL) || - (lpBosHostGetNext == NULL) || - (lpBosExecutableCreate == NULL) || - (lpBosExecutableRevert == NULL) || - (lpBosExecutableTimestampGet == NULL) || - (lpBosExecutablePrune == NULL) || - (lpBosExecutableRestartTimeSet == NULL) || - (lpBosExecutableRestartTimeGet == NULL) || - (lpBosLogGet == NULL) || - (lpBosAuthSet == NULL) || - (lpBosCommandExecute == NULL) || - (lpBosSalvage == NULL) || - (lpKasServerOpen == NULL) || - (lpKasServerClose == NULL) || - (lpKasServerStatsGet == NULL) || - (lpKasServerDebugGet == NULL) || - (lpKasServerRandomKeyGet == NULL) || - (lpKasStringToKey == NULL) || - (lpKasPrincipalCreate == NULL) || - (lpKasPrincipalDelete == NULL) || - (lpKasPrincipalGet == NULL) || - (lpKasPrincipalGetBegin == NULL) || - (lpKasPrincipalGetNext == NULL) || - (lpKasPrincipalGetDone == NULL) || - (lpKasPrincipalKeySet == NULL) || - (lpKasPrincipalLockStatusGet == NULL) || - (lpKasPrincipalUnlock == NULL) || - (lpKasPrincipalFieldsSet == NULL) || - (lpPtsGroupMemberAdd == NULL) || - (lpPtsGroupOwnerChange == NULL) || - (lpPtsGroupCreate == NULL) || - (lpPtsGroupGet == NULL) || - (lpPtsGroupDelete == NULL) || - (lpPtsGroupMaxGet == NULL) || - (lpPtsGroupMaxSet == NULL) || - (lpPtsGroupMemberListBegin == NULL) || - (lpPtsGroupMemberListNext == NULL) || - (lpPtsGroupMemberListDone == NULL) || - (lpPtsGroupMemberRemove == NULL) || - (lpPtsGroupRename == NULL) || - (lpPtsGroupModify == NULL) || - (lpPtsUserCreate == NULL) || - (lpPtsUserDelete == NULL) || - (lpPtsUserGet == NULL) || - (lpPtsUserRename == NULL) || - (lpPtsUserModify == NULL) || - (lpPtsUserMaxGet == NULL) || - (lpPtsUserMaxSet == NULL) || - (lpPtsUserMemberListBegin == NULL) || - (lpPtsUserMemberListNext == NULL) || - (lpPtsUserMemberListDone == NULL) || - (lpPtsOwnedGroupListBegin == NULL) || - (lpPtsOwnedGroupListNext == NULL) || - (lpPtsOwnedGroupListDone == NULL) || - (lpClientTokenGetExisting == NULL) || - (lpClientCellOpen == NULL) || - (lpClientCellClose == NULL) || - (lpClientLocalCellGet == NULL) || - (lpClientInit == NULL) || - (lpClientAFSServerGet == NULL) || - (lpClientAFSServerGetBegin == NULL) || - (lpClientAFSServerGetNext == NULL) || - (lpClientAFSServerGetDone == NULL) || - (lpUtilDatabaseServerGetBegin == NULL) || - (lpUtilDatabaseServerGetNext == NULL) || - (lpUtilDatabaseServerGetDone == NULL) || - // ADD HERE - 0 ) - { - if (pStatus) - *pStatus = ERROR_DLL_INIT_FAILED; - return FALSE; - } - - // Initialize the client library - // - afs_status_t status; - if (!(*lpClientInit)(&status)) - { - if (pStatus) - *pStatus = (ULONG)status; - return FALSE; - } - - return TRUE; -} - - -void Worker_FreeLibraries (void) -{ - if (hiVOS != NULL) - { - FreeLibrary (hiVOS); - hiVOS = NULL; - } - if (hiBOS != NULL) - { - FreeLibrary (hiBOS); - hiBOS = NULL; - } - if (hiKAS != NULL) - { - FreeLibrary (hiKAS); - hiKAS = NULL; - } - if (hiPTS != NULL) - { - FreeLibrary (hiPTS); - hiPTS = NULL; - } - if (hiUtil != NULL) - { - FreeLibrary (hiUtil); - hiUtil = NULL; - } - if (hiClient != NULL) - { - FreeLibrary (hiClient); - hiClient = NULL; - } -} - diff --git a/src/WINNT/afsclass/worker.h b/src/WINNT/afsclass/worker.h deleted file mode 100644 index ac61cc582..000000000 --- a/src/WINNT/afsclass/worker.h +++ /dev/null @@ -1,1041 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef WORKER_H -#define WORKER_H -extern "C" { -#include -#include -#include -#include -#include -#include -#include -#include - -#define __KAUTILS__ // prevents including anything but error #s from kautils.h -#include -} // extern "C" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define NO_PARTITION ((unsigned int)-1) -#define NO_VOLUME ((VOLUMEID)-1) - -typedef enum // WORKERTASK - { - wtaskVosBackupVolumeCreate, - wtaskVosBackupVolumeCreateMultiple, - wtaskVosPartitionGet, - wtaskVosPartitionGetBegin, - wtaskVosPartitionGetNext, - wtaskVosPartitionGetDone, - wtaskVosServerOpen, - wtaskVosServerClose, - wtaskVosServerSync, - wtaskVosFileServerAddressChange, - wtaskVosFileServerAddressRemove, - wtaskVosFileServerGetBegin, - wtaskVosFileServerGetNext, - wtaskVosFileServerGetDone, - wtaskVosServerTransactionStatusGetBegin, - wtaskVosServerTransactionStatusGetNext, - wtaskVosServerTransactionStatusGetDone, - wtaskVosVLDBGet, - wtaskVosVLDBGetBegin, - wtaskVosVLDBGetNext, - wtaskVosVLDBGetDone, - wtaskVosVLDBEntryRemove, - wtaskVosVLDBEntryLock, - wtaskVosVLDBEntryUnlock, - wtaskVosVLDBReadOnlySiteCreate, - wtaskVosVLDBReadOnlySiteDelete, - wtaskVosVLDBSync, - wtaskVosVolumeCreate, - wtaskVosVolumeDelete, - wtaskVosVolumeRename, - wtaskVosVolumeDump, - wtaskVosVolumeRestore, - wtaskVosVolumeOnline, - wtaskVosVolumeOffline, - wtaskVosVolumeGet, - wtaskVosVolumeGetBegin, - wtaskVosVolumeGetNext, - wtaskVosVolumeGetDone, - wtaskVosVolumeMove, - wtaskVosVolumeRelease, - wtaskVosVolumeZap, - wtaskVosPartitionNameToId, - wtaskVosPartitionIdToName, - wtaskVosVolumeQuotaChange, - wtaskBosServerOpen, - wtaskBosServerClose, - wtaskBosProcessCreate, - wtaskBosProcessDelete, - wtaskBosProcessExecutionStateGet, - wtaskBosAuxiliaryProcessStatusDeallocate, - wtaskBosProcessExecutionStateSet, - wtaskBosProcessExecutionStateSetTemporary, - wtaskBosProcessNameGetBegin, - wtaskBosProcessNameGetDone, - wtaskBosProcessNameGetNext, - wtaskBosProcessInfoGet, - wtaskBosProcessParameterGetBegin, - wtaskBosProcessParameterGetDone, - wtaskBosProcessParameterGetNext, - wtaskBosProcessNotifierGet, - wtaskBosProcessRestart, - wtaskBosProcessAllStop, - wtaskBosProcessAllStart, - wtaskBosProcessAllWaitStop, - wtaskBosProcessAllStopAndRestart, - wtaskBosAdminCreate, - wtaskBosAdminDelete, - wtaskBosAdminGetBegin, - wtaskBosAdminGetDone, - wtaskBosAdminGetNext, - wtaskBosKeyCreate, - wtaskBosKeyDelete, - wtaskBosKeyGetBegin, - wtaskBosKeyGetDone, - wtaskBosKeyGetNext, - wtaskBosCellSet, - wtaskBosCellGet, - wtaskBosHostCreate, - wtaskBosHostDelete, - wtaskBosHostGetBegin, - wtaskBosHostGetDone, - wtaskBosHostGetNext, - wtaskBosExecutableCreate, - wtaskBosExecutableRevert, - wtaskBosExecutableTimestampGet, - wtaskBosExecutablePrune, - wtaskBosExecutableRestartTimeSet, - wtaskBosExecutableRestartTimeGet, - wtaskBosLogGet, - wtaskBosAuthSet, - wtaskBosCommandExecute, - wtaskBosSalvage, - wtaskKasServerOpen, - wtaskKasServerClose, - wtaskKasServerRandomKeyGet, - wtaskKasStringToKey, - wtaskKasPrincipalCreate, - wtaskKasPrincipalDelete, - wtaskKasPrincipalGet, - wtaskKasPrincipalGetBegin, - wtaskKasPrincipalGetNext, - wtaskKasPrincipalGetDone, - wtaskKasPrincipalKeySet, - wtaskKasPrincipalLockStatusGet, - wtaskKasPrincipalUnlock, - wtaskKasPrincipalFieldsSet, - wtaskPtsGroupMemberAdd, - wtaskPtsGroupOwnerChange, - wtaskPtsGroupCreate, - wtaskPtsGroupGet, - wtaskPtsGroupDelete, - wtaskPtsGroupMaxGet, - wtaskPtsGroupMaxSet, - wtaskPtsGroupMemberListBegin, - wtaskPtsGroupMemberListNext, - wtaskPtsGroupMemberListDone, - wtaskPtsGroupMemberRemove, - wtaskPtsGroupRename, - wtaskPtsGroupModify, - wtaskPtsUserCreate, - wtaskPtsUserDelete, - wtaskPtsUserGet, - wtaskPtsUserRename, - wtaskPtsUserModify, - wtaskPtsUserMaxGet, - wtaskPtsUserMaxSet, - wtaskPtsUserMemberListBegin, - wtaskPtsUserMemberListNext, - wtaskPtsUserMemberListDone, - wtaskPtsOwnedGroupListBegin, - wtaskPtsOwnedGroupListNext, - wtaskPtsOwnedGroupListDone, - wtaskClientTokenGetExisting, - wtaskClientCellOpen, - wtaskClientCellClose, - wtaskClientLocalCellGet, - wtaskClientAFSServerGet, - wtaskClientAFSServerGetBegin, - wtaskClientAFSServerGetNext, - wtaskClientAFSServerGetDone, - wtaskUtilDatabaseServerGetBegin, - wtaskUtilDatabaseServerGetNext, - wtaskUtilDatabaseServerGetDone, - // ADD HERE - } WORKERTASK; - -typedef union // WORKERPACKET - { - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - VOLUMEID idVolume; // [in] id of read/write volume - } wpVosBackupVolumeCreate; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] server token (or NULL) - int idPartition; // [in] partition ID (or NO_PARTITION) - LPTSTR pszPrefix; // [in] volume prefix to match (or NULL) - BOOL fExclude; // [in] TRUE if prefix is exclusionary - } wpVosBackupVolumeCreateMultiple; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - vos_partitionEntry_t Data; // [out] partition properties - } wpVosPartitionGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - PVOID hEnum; // [out] enumeration token - } wpVosPartitionGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - vos_partitionEntry_t Data; // [out] partition properties - } wpVosPartitionGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpVosPartitionGetDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszServer; // [in] server name - PVOID hServer; // [out] server token - } wpVosServerOpen; - - struct { - PVOID hServer; // [in] token from VosServerOpen() - } wpVosServerClose; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID (or NO_PARTITION) - BOOL fForce; // [in] TRUE to force sync - } wpVosServerSync; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - SOCKADDR_IN addrOld; // [in] old address (or 0's to add new) - SOCKADDR_IN addrNew; // [in] new address (or 0's to del old) - } wpVosFileServerAddressChange; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - SOCKADDR_IN addr; // [in] address to remove - } wpVosFileServerAddressRemove; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hEnum; // [out] enumeration token - } wpVosFileServerGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - vos_fileServerEntry_t Entry; // [out] server entry (with addresses) - } wpVosFileServerGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpVosFileServerGetDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - PVOID hEnum; // [out] enumeration token - } wpVosServerTransactionStatusGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - vos_serverTransactionStatus_t Data; // [out] transaction information - } wpVosServerTransactionStatusGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpVosServerTransactionStatusGetDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - VOLUMEID idVolume; // [in] read/write volume ID - vos_vldbEntry_t Data; // [out] VLDB entry - } wpVosVLDBGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] server token (or NULL) - int idPartition; // [in] partition ID (or NO_PARTITION) - PVOID hEnum; // [out] enumeration token - } wpVosVLDBGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - vos_vldbEntry_t Data; // [out] VLDB entry - } wpVosVLDBGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpVosVLDBGetDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] server token (or NULL) - int idPartition; // [in] partition ID (or NO_PARTITION) - VOLUMEID idVolume; // [in] read/write volume ID - } wpVosVLDBEntryRemove; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - VOLUMEID idVolume; // [in] read/write volume ID - } wpVosVLDBEntryLock; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] server token (or NULL) - int idPartition; // [in] partition ID (or NO_PARTITION) - VOLUMEID idVolume; // [in] read/write volume ID - } wpVosVLDBEntryUnlock; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] read/write volume ID - } wpVosVLDBReadOnlySiteCreate; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] read/write volume ID - } wpVosVLDBReadOnlySiteDelete; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID (or NO_PARTITION) - BOOL fForce; // [in] TRUE to force sync - } wpVosVLDBSync; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - LPTSTR pszVolume; // [in] volume name - ULONG ckQuota; // [in] initial quota - VOLUMEID idVolume; // [out] volume ID - } wpVosVolumeCreate; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] volume ID - } wpVosVolumeDelete; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - VOLUMEID idVolume; // [in] read/write volume ID - LPTSTR pszVolume; // [in] new volume name - } wpVosVolumeRename; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] parition ID - VOLUMEID idVolume; // [in] volume ID - SYSTEMTIME stStart; // [in] start time - LPTSTR pszFilename; // [in] target filename (local) - } wpVosVolumeDump; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] read/write volume ID (or 0) - LPTSTR pszVolume; // [in] new volume name (or NULL) - LPTSTR pszFilename; // [in] source filename (local) - BOOL fIncremental; // [in] TRUE if restoring inc backup - } wpVosVolumeRestore; - - struct { - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] read/write volume ID (or 0) - int csecSleep; // [in] sleep time - vos_volumeOnlineType_t Status; // [in] new status to indicate - } wpVosVolumeOnline; - - struct { - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] volume ID - } wpVosVolumeOffline; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] volume ID - vos_volumeEntry_t Data; // [out] volume properties - } wpVosVolumeGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - PVOID hEnum; // [out] enumeration token - } wpVosVolumeGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - vos_volumeEntry_t Data; // [out] volume properties - } wpVosVolumeGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpVosVolumeGetDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServerFrom; // [in] source server token - int idPartitionFrom; // [in] source partition ID - PVOID hServerTo; // [in] target server token - int idPartitionTo; // [in] target partition ID - VOLUMEID idVolume; // [in] read/write volume ID - } wpVosVolumeMove; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - VOLUMEID idVolume; // [in] read/write volume ID - BOOL fForce; // [in] TRUE to force release - } wpVosVolumeRelease; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] volume ID - BOOL fForce; // [in] TRUE to force delete - } wpVosVolumeZap; - - struct { - LPTSTR pszPartition; // [in] partition name - int idPartition; // [out] partition ID - } wpVosPartitionNameToId; - - struct { - int idPartition; // [in] partition ID - LPTSTR pszPartition; // [out] partition name - } wpVosPartitionIdToName; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from VosServerOpen() - int idPartition; // [in] partition ID - VOLUMEID idVolume; // [in] id of read/write volume - ULONG ckQuota; // [in] new quota - } wpVosVolumeQuotaChange; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszServer; // [in] name of server to open - PVOID hServer; // [out] handle for server - } wpBosServerOpen; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - } wpBosServerClose; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] name of new service - AFSSERVICETYPE type; // [in] service type (stCRON, stFS, etc) - LPTSTR pszCommand; // [in] full command-line to execute - LPTSTR pszTimeCron; // [in] date/time (CRON only) - LPTSTR pszNotifier; // [in] command executed on exit - } wpBosProcessCreate; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - } wpBosProcessDelete; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - SERVICESTATE state; // [out] current execution state - LPTSTR pszAuxStatus; // [out] additional status information - } wpBosProcessExecutionStateGet; - - struct { - char *pszAuxStatusA; // [in] service string - } wpBosAuxiliaryProcessStatusDeallocate; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - SERVICESTATE state; // [in] desired new service state - } wpBosProcessExecutionStateSet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - SERVICESTATE state; // [in] desired new service state - } wpBosProcessExecutionStateSetTemporary; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - PVOID hEnum; // [out] enumeration token - } wpBosProcessNameGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - } wpBosProcessNameGetDone; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszService; // [in] service name - } wpBosProcessNameGetNext; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - SERVICESTATUS ss; // [out] service properties - } wpBosProcessInfoGet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - PVOID hEnum; // [out] enumeration token - } wpBosProcessParameterGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - } wpBosProcessParameterGetDone; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszParam; // [out] parameter - } wpBosProcessParameterGetNext; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - LPTSTR pszNotifier; // [out] current notifier command - } wpBosProcessNotifierGet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszService; // [in] service name - } wpBosProcessRestart; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - } wpBosProcessAllStop; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - } wpBosProcessAllStart; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - } wpBosProcessAllWaitStop; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - BOOL fRestartBOS; // [in] TRUE to also restart BOS - } wpBosProcessAllStopAndRestart; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszAdmin; // [in] administrator name - } wpBosAdminCreate; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszAdmin; // [in] administrator name - } wpBosAdminDelete; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - PVOID hEnum; // [out] enumeration token - } wpBosAdminGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - } wpBosAdminGetDone; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszAdmin; // [out] administrator name - } wpBosAdminGetNext; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - ENCRYPTIONKEY key; // [in] encryption key to add - int keyVersion; // [in] version of new key - } wpBosKeyCreate; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - int keyVersion; // [in] key version number to delete - } wpBosKeyDelete; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - PVOID hEnum; // [out] enumeration token - } wpBosKeyGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - } wpBosKeyGetDone; - - struct { - PVOID hEnum; // [in] enumeration token - int keyVersion; // [out] key version number - ENCRYPTIONKEY keyData; // [out] encryption key - ENCRYPTIONKEYINFO keyInfo; // [out] additional key information - } wpBosKeyGetNext; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszCell; // [in] cell name to assign - } wpBosCellSet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszCell; // [out] currently-assigned cell name - } wpBosCellGet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszServer; // [in] name of server to create - } wpBosHostCreate; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszServer; // [in] name of server to remove - } wpBosHostDelete; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - PVOID hEnum; // [out] enumeration token - } wpBosHostGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - } wpBosHostGetDone; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszServer; // [out] name of server - } wpBosHostGetNext; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszLocal; // [in] filename on local machine - LPTSTR pszRemoteDir; // [in] target dir on remote machine - } wpBosExecutableCreate; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszFilename; // [in] filename on remote machine - } wpBosExecutableRevert; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszFilename; // [in] filename on remote machine - SYSTEMTIME timeNew; // [out] file's last-modified time - SYSTEMTIME timeOld; // [out] .OLD file's last-modified time - SYSTEMTIME timeBak; // [out] .BAK file's last-modified time - } wpBosExecutableTimestampGet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - BOOL fPruneOld; // [in] TRUE to remove .OLD files - BOOL fPruneBak; // [in] TRUE to remove .BAK files - BOOL fPruneCore; // [in] TRUE to remove CORE files - } wpBosExecutablePrune; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - BOOL fWeeklyRestart; // [in] TRUE to enable weekly restart - SYSTEMTIME timeWeekly; // [in] new weekly restart time - BOOL fDailyRestart; // [in] TRUE to enable weekly restart - SYSTEMTIME timeDaily; // [in] new daily restart time - } wpBosExecutableRestartTimeSet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - BOOL fWeeklyRestart; // [out] TRUE if doing weekly restart - SYSTEMTIME timeWeekly; // [out] weekly restart time - BOOL fDailyRestart; // [out] TRUE if doing weekly restart - SYSTEMTIME timeDaily; // [out] daily restart time - } wpBosExecutableRestartTimeGet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszLogName; // [in] name of log file to retrieve - LPTSTR pszLogData; // [out] 0-init; GlobalFree() when done - } wpBosLogGet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - BOOL fEnableAuth; // [in] TRUE to enable auth checking - } wpBosAuthSet; - - struct { - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszCommand; // [in] command-line to execute - } wpBosCommandExecute; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from BosServerOpen() - LPTSTR pszAggregate; // [in] NULL or aggregate to salvage - LPTSTR pszFileset; // [in] NULL or fileset to salvage - int nProcesses; // [in] 0 for default (4) - LPTSTR pszTempDir; // [in] NULL or temporary directory - LPTSTR pszLogFile; // [in] NULL for SalvageLog - BOOL fForce; // [in] TRUE to salvage all filesets - BOOL fReadonly; // [in] TRUE to only bring up undamaged - BOOL fLogInodes; // [in] TRUE to log damaged inodes - BOOL fLogRootInodes; // [in] TRUE to log AFS-owned inodes - BOOL fRebuildDirs; // [in] TRUE to rebuild dir structure - BOOL fReadBlocks; // [in] TRUE to read in small blocks - } wpBosSalvage; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - char **apszServers; // [in] 0-terminated array, or NULL - PVOID hServer; // [out] handle for server(s) - } wpKasServerOpen; - - struct { - PVOID hServer; // [in] token from KasServerOpen() - } wpKasServerClose; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - ENCRYPTIONKEY key; // [out] random encryption key - } wpKasServerRandomKeyGet; - - struct { - LPTSTR pszCell; // [in] cell name - LPTSTR pszString; // [in] string to hash - ENCRYPTIONKEY key; // [out] generated encryption key - } wpKasStringToKey; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - LPTSTR pszPassword; // [in] password for new principal - } wpKasPrincipalCreate; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - } wpKasPrincipalDelete; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - kas_principalEntry_t Data; // [out] principal information - } wpKasPrincipalGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - PVOID hEnum; // [out] enumeration token - } wpKasPrincipalGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszPrincipal; // [out] principal name - LPTSTR pszInstance; // [out] principal instance - } wpKasPrincipalGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpKasPrincipalGetDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - int keyVersion; // [in] key version number - ENCRYPTIONKEY key; // [in] encryption key - } wpKasPrincipalKeySet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - SYSTEMTIME timeUnlocked; // [out] time lock released - } wpKasPrincipalLockStatusGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - } wpKasPrincipalUnlock; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - PVOID hServer; // [in] token from KasServerOpen() - LPTSTR pszPrincipal; // [in] principal name - LPTSTR pszInstance; // [in] principal instance or NULL - BOOL fIsAdmin; // [in] TRUE if admin - BOOL fGrantTickets; // [in] TRUE if can get tokens - BOOL fCanEncrypt; // [in] TRUE if can encrypt - BOOL fCanChangePassword; // [in] TRUE if can change password - BOOL fCanReusePasswords; // [in] TRUE if can change password - SYSTEMTIME timeExpires; // [in] time account expires (or 0's) - LONG cdayPwExpires; // [in] days til password expires (or 0) - LONG csecTicketLifetime; // [in] ticket expiration timeout - LONG nFailureAttempts; // [in] num failures to tolerate (or 0) - LONG csecFailedLoginLockTime; // [in] csec to lock account if failed - } wpKasPrincipalFieldsSet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to modify - LPTSTR pszUser; // [in] user to add to group - } wpPtsGroupMemberAdd; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to modify - LPTSTR pszOwner; // [in] new owner for group - } wpPtsGroupOwnerChange; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to create - LPTSTR pszOwner; // [in] owner for group - int idGroup; // [in out] new group ID (or 0) - } wpPtsGroupCreate; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to query - pts_GroupEntry_t Entry; // [out] group information - } wpPtsGroupGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to remove - } wpPtsGroupDelete; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - int idGroupMax; // [out] highest current group number - } wpPtsGroupMaxGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - int idGroupMax; // [in] new highest current group number - } wpPtsGroupMaxSet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to enumerate - PVOID hEnum; // [out] enumeration token - } wpPtsGroupMemberListBegin; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszMember; // [out] member name - } wpPtsGroupMemberListNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpPtsGroupMemberListDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to modify - LPTSTR pszUser; // [in] member to remove - } wpPtsGroupMemberRemove; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to rename - LPTSTR pszNewName; // [in] new name for group - } wpPtsGroupRename; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszGroup; // [in] group to modify - pts_GroupUpdateEntry_t Delta; // [in] new properties for group - } wpPtsGroupModify; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszUser; // [in] name for new user account - int idUser; // [in out] new user account ID (or 0) - } wpPtsUserCreate; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszUser; // [in] user to remove - } wpPtsUserDelete; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszUser; // [in] user to query - pts_UserEntry_t Entry; // [out] user properties - } wpPtsUserGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszUser; // [in] user to modify - LPTSTR pszNewName; // [in] new name for user - } wpPtsUserRename; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszUser; // [in] user to modify - pts_UserUpdateEntry_t Delta; // [in] new user properties - } wpPtsUserModify; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - int idUserMax; // [out] highest user ID - } wpPtsUserMaxGet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - int idUserMax; // [in] new highest user ID - } wpPtsUserMaxSet; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszUser; // [in] user to query - PVOID hEnum; // [out] enumeration token - } wpPtsUserMemberListBegin; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszGroup; // [in] group to which user belongs - } wpPtsUserMemberListNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpPtsUserMemberListDone; - - struct { - PVOID hCell; // [in] token from AdminCellOpen() - LPTSTR pszOwner; // [in] user to query - PVOID hEnum; // [out] enumeration token - } wpPtsOwnedGroupListBegin; - - struct { - PVOID hEnum; // [in] enumeration token - LPTSTR pszGroup; // [in] group which owner owns - } wpPtsOwnedGroupListNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpPtsOwnedGroupListDone; - - struct { - LPTSTR pszCell; // [in] cell in which to query - PVOID hCreds; // [out] user credentials token - } wpClientTokenGetExisting; - - struct { - LPTSTR pszCell; // [in] cell to open - PVOID hCreds; // [in] user credentials token - PVOID hCell; // [out] cell token - } wpClientCellOpen; - - struct { - PVOID hCell; // [in] cell token - } wpClientCellClose; - - struct { - LPTSTR pszCell; // [out] local cell name - } wpClientLocalCellGet; - - struct { - PVOID hCell; // [in] cell token - LPTSTR pszServer; // [in] full name of server to query - afs_serverEntry_t Entry; // [out] server information - } wpClientAFSServerGet; - - struct { - PVOID hCell; // [in] cell token - PVOID hEnum; // [out] enumeration token - } wpClientAFSServerGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - afs_serverEntry_t Entry; // [out] server information - } wpClientAFSServerGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpClientAFSServerGetDone; - - struct { - LPTSTR pszCell; // [in] cell name - PVOID hEnum; // [out] enumeration token - } wpUtilDatabaseServerGetBegin; - - struct { - PVOID hEnum; // [in] enumeration token - SOCKADDR_IN Address; // [out] server address - } wpUtilDatabaseServerGetNext; - - struct { - PVOID hEnum; // [in] enumeration token - } wpUtilDatabaseServerGetDone; - - // ADD HERE - - } WORKERPACKET, *LPWORKERPACKET; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL Worker_Initialize (ULONG *pStatus = NULL); - -BOOL Worker_DoTask (WORKERTASK wtask, LPWORKERPACKET lpwp = NULL, ULONG *pStatus = NULL); - -#endif - diff --git a/src/WINNT/afsd/Makefile.djgpp b/src/WINNT/afsd/Makefile.djgpp deleted file mode 100644 index 88488749b..000000000 --- a/src/WINNT/afsd/Makefile.djgpp +++ /dev/null @@ -1,69 +0,0 @@ -# -# Makefile.djgpp -# make information for this directory -# requires gmake -# - -SOURCES = afsd95.c afsd_init95.c cm_access.c cm_aclent.c cm_buf.c \ - cm_callback.c cm_cell.c cm_config.c cm_conn.c cm_daemon.c \ - cm_dcache.c cm_dir.c cm_dnlc.c cm_ioctl.c cm_scache.c \ - cm_server.c cm_user.c cm_utils.c cm_vnodeops.c cm_volume.c \ - dosutils95.c largeint95.c netbios95.c smb.c smb_ioctl.c \ - cm_diskcache95.c queue95.c afsmsg95.c smb3.c cm_dns.c \ - cm_freelance.c - -include ../../config/Makefile.djgpp.common - -# apply changes from common for this directory -# -# no changes for this directory - -# what this directory builds -# -TARGETS = afsd.exe -all : $(TARGETS) -install : $(DESTBIN)/afsd.exe #$(DESTBIN)/klog.exe -#CFLAGS += -I../vxd_lib -#CFLAGS += -DAFS_VXD -CFLAGS += -DDOS_PKT_WHOLE -DAFS_AFSDB_ENV -DAFS_FREELANCE_CLIENT - -INCFILES = \ - $(DESTINC)/netbios95.h \ - $(DESTINC)/largeint95.h \ - $(DESTINC)/dosdefs95.h \ - $(DESTINC)/afs/afsmsg95.h - -# hard-wired dependency information -# -REQUIRED_LIBS = $(DESTLIB)/liblwp.a $(DESTLIB)/libosi.a \ - $(DESTLIB)/afs/libcmd.a $(DESTLIB)/afs/libafsint.a \ - $(DESTLIB)/afs/libvldb.a $(DESTLIB)/librxkad.a \ - $(DESTLIB)/librx.a $(DESTLIB)/librxstat.a - - -afsd.exe : $(ALL_OBJS) $(REQUIRED_LIBS) - -includes: $(INCFILES) - -EXECUTABLES = afsd afsd.exe - -$(DESTLIB)/liblwp.a : - $(MAKE) -C ../lwp install - -$(DESTLIB)/librx.a : - $(MAKE) -C ../rx install - -$(DESTLIB)/libosi.a : - $(MAKE) -C ../client_osi install - -$(DESTLIB)/libcmd.a : - $(MAKE) -C ../../cmd install - -$(DESTLIB)/libafsint.a : - $(MAKE) -C ../../fsint install - -$(DESTLIB)/librxkad.a : - $(MAKE) -C ../../rxkad install - -$(DESTLIB)/libvldb.a : - $(MAKE) -C ../../vlserver install diff --git a/src/WINNT/afsd/NTMakefile b/src/WINNT/afsd/NTMakefile deleted file mode 100644 index 7194e87c7..000000000 --- a/src/WINNT/afsd/NTMakefile +++ /dev/null @@ -1,495 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) /D"_AFXDLL" -I..\kfw\inc\loadfuncs -I..\kfw\inc\krb5 -I..\kfw\inc\leash -AFSDEV_NETGUI = 1 -RELDIR=WINNT\afsd -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -EXEDIR = $(DESTDIR)\root.client\usr\vice\etc - -############################################################################ -# Definitions for installing header files - -INCFILEDIR = $(DESTDIR)\include\afs # header file install directory - -# afsdicon and below added for WINNT\extra support - -INCFILES =\ - $(INCFILEDIR)\afsd.h \ - $(INCFILEDIR)\cm.h \ - $(INCFILEDIR)\cm_buf.h \ - $(INCFILEDIR)\cm_cell.h \ - $(INCFILEDIR)\cm_config.h \ - $(INCFILEDIR)\cm_conn.h \ - $(INCFILEDIR)\cm_ioctl.h \ - $(INCFILEDIR)\cm_scache.h \ - $(INCFILEDIR)\cm_server.h \ - $(INCFILEDIR)\cm_user.h \ - $(INCFILEDIR)\cm_dns.h \ - $(INCFILEDIR)\cm_utils.h \ - $(INCFILEDIR)\fs_utils.h \ - $(INCFILEDIR)\krb.h \ - $(INCFILEDIR)\krb_prot.h \ - $(INCFILEDIR)\cm_dir.h \ - $(INCFILEDIR)\smb.h \ - $(INCFILEDIR)\smb3.h \ - $(INCFILEDIR)\smb_iocons.h \ - $(INCFILEDIR)\smb_ioctl.h \ - $(INCFILEDIR)\afsmsg95.h \ - $(INCFILEDIR)\afsrpc.h \ -!IFDEF OSICRASH - $(INCFILEDIR)\afsdcrash.h \ -!ENDIF - $(INCFILEDIR)\cm_dns_private.h \ - $(INCFILEDIR)\lanahelper.h \ - $(INCFILEDIR)\afsdicon.h \ - $(INCFILEDIR)\cm_callback.h \ - $(INCFILEDIR)\cm_aclent.h \ - $(INCFILEDIR)\cm_volume.h \ - $(INCFILEDIR)\cm_dcache.h \ - $(INCFILEDIR)\cm_access.h \ - $(INCFILEDIR)\cm_vnodeops.h \ - $(INCFILEDIR)\cm_dir.h \ - $(INCFILEDIR)\cm_utils.h \ - $(INCFILEDIR)\cm_daemon.h \ - $(INCFILEDIR)\cm_ioctl.h \ - $(INCFILEDIR)\cm_dnlc.h \ - $(INCFILEDIR)\cm_buf.h \ - $(INCFILEDIR)\cm_freelance.h \ - $(INCFILEDIR)\cm_memmap.h \ - $(INCFILEDIR)\afsd_eventlog.h \ - $(INCFILEDIR)\afsd_eventmessages.h \ - $(INCFILEDIR)\afskfw.h \ - $(INCFILEDIR)\afsicf.h - -IDLFILES =\ - afsrpc.h $(OUT)\afsrpc_c.obj - -CONFOBJS=$(OUT)\cm_config.obj \ - $(OUT)\cm_dns.obj - -$(CONFOBJS): - -RXOBJS = $(OUT)\xdr_int32.obj $(OUT)\xdr_int64.obj - -$(RXOBJS): - -RX= ..\..\rx - -$(RXOBJS): $(RX)\$$(@B).c - $(C2OBJ) -I$(RX) $** - -$(IDLFILES):afsrpc.idl - midl $(MIDL_FLAGS) /no_robust $(AFSDEV_AUXMIDLFLAGS) /app_config $? - -AFSDOBJS=\ - $(OUT)\afsd_init.obj \ - $(OUT)\cm_cell.obj \ - $(OUT)\cm_server.obj \ - $(OUT)\cm_volume.obj \ - $(OUT)\cm_conn.obj \ - $(OUT)\cm_user.obj \ - $(OUT)\cm_buf.obj \ - $(OUT)\cm_scache.obj \ - $(OUT)\cm_dcache.obj \ - $(OUT)\cm_access.obj \ - $(OUT)\cm_callback.obj \ - $(OUT)\cm_vnodeops.obj \ - $(OUT)\cm_dir.obj \ - $(OUT)\cm_utils.obj \ - $(OUT)\largeintdotnet.obj \ - $(OUT)\smb.obj \ - $(OUT)\smb3.obj \ - $(OUT)\smb_ioctl.obj \ - $(OUT)\cm_ioctl.obj \ - $(OUT)\cm_daemon.obj \ - $(OUT)\cm_aclent.obj \ - $(OUT)\cm_dnlc.obj \ - $(OUT)\cm_rpc.obj \ - $(OUT)\cm_memmap.obj \ - $(OUT)\afsrpc_s.obj \ -!IFDEF OSICRASH - $(OUT)\afsdcrash.obj \ -!ENDIF - $(OUT)\cm_freelance.obj \ - $(OUT)\afsd_eventlog.obj \ - $(OUT)\afsd_flushvol.obj \ - $(OUT)\afsicf.obj - -$(AFSDOBJS): - -$(OUT)\cm_conn.obj: cm_conn.c - $(C2OBJ) -DAFS_PTHREAD_ENV /Fo$@ $** - -FSOBJS=$(OUT)\fs.obj $(OUT)\fs_utils.obj - -CMDBGOBJS=$(OUT)\cmdebug.obj - -SLOBJS=$(OUT)\symlink.obj $(OUT)\fs_utils.obj - -ILIBDIR = $(DESTDIR)\lib - -# -# Rules for message compiler info for logging events -# -$(INCFILEDIR)\afsd_eventmessages.h: afsd_eventmessages.mc - mc afsd_eventmessages.mc - -############################################################################ -# -# Flags for linking LOGON DLL'S -# - -LOGONLINKFLAGS = -entry:DllEntryPoint - - -############################################################################ -# -# IDL COMPILATION -# - -MIDL_FLAGS=/app_config \ - /Zp4 \ - /cpp_cmd $(cc) \ - /cpp_opt "-E" \ - /no_robust \ - /nologo - -.SUFFIXES: .h .idl - -.idl.h: - midl $(MIDL_FLAGS) $(AFSDEV_AUXMIDLFLAGS) $< - -############################################################################ -# libafsconf.dll - -CONF_DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\libafsconf.dll - -CONF_DLLLIBS = \ - $(DESTDIR)\lib\afs\afsutil.lib \ - $(DESTDIR)\lib\afs\afsreg.lib - -$(CONF_DLLFILE): $(CONFOBJS) $(OUT)\libafsconf.res $(CONF_DLLLIBS) - $(DLLGUILINK) -def:libafsconf.def dnsapi.lib mpr.lib - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - -############################################################################ -# lanahelper.lib - -LANAHELPERLIB = $(DESTDIR)\lib\lanahelper.lib - -LANAHELPERLIB_OBJS =\ - $(OUT)\lanahelper.obj - -$(LANAHELPERLIB_OBJS): - -$(LANAHELPERLIB): $(LANAHELPERLIB_OBJS) - $(LIBARCH) netapi32.lib - -############################################################################ -# afskfw.lib - -AFSKFWLIB = $(DESTDIR)\lib\afskfw.lib - -AFSKFWLIB_OBJS =\ - $(OUT)\afskfw.obj - -$(AFSKFWLIB_OBJS): - -$(AFSKFWLIB): $(AFSKFWLIB_OBJS) - $(LIBARCH) - -############################################################################ -# afslogon.dll - -LOGON_DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afslogon.dll - -LOGON_DLLOBJS =\ - $(OUT)\afslogon.obj \ - $(OUT)\logon_ad.obj \ - $(OUT)\afslogon.res - -LOGON_DLLLIBS =\ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\libafsconf.lib \ - $(DESTDIR)\lib\afsrxkad.lib \ - $(DESTDIR)\lib\afsdes.lib \ - $(LANAHELPERLIB) \ - $(AFSKFWLIB) - -LOGON_DLLSDKLIBS =\ - dnsapi.lib \ - netapi32.lib \ - mpr.lib \ - advapi32.lib \ - secur32.lib \ - strsafe.lib \ - oleaut32.lib \ - ole32.lib \ - adsiid.lib \ - activeds.lib \ - userenv.lib - -$(LOGON_DLLFILE): $(LOGON_DLLOBJS) $(LOGON_DLLLIBS) - $(DLLGUILINK) $(LOGONLINKFLAGS) -def:afslogon.def $(LOGON_DLLSDKLIBS) - $(DLLPREP) - $(COPY) $*.lib $(DESTDIR)\lib - $(DEL) $*.lib $*.exp - -############################################################################ -# afslog95.dll - -LOG95_DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afslog95.dll - -LOG95_DLLOBJS =\ - $(OUT)\afslog95.obj \ - $(OUT)\afslog95.res - -LOG95_DLLLIBS =\ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\libafsconf.lib - -$(LOG95_DLLFILE): $(LOG95_DLLOBJS) $(LOG95_DLLLIBS) - $(DLLGUILINK) $(LOGONLINKFLAGS) -def:afslog95.def dnsapi.lib mpr.lib - $(DLLPREP) - $(COPY) $*.lib $(DESTDIR)\lib - $(DEL) $*.lib $*.exp - -############################################################################ -# Install target; primary makefile target - -install_objs: $(OUT)\cm_dns.obj $(OUT)\cm_config.obj $(LANAHELPERLIB) $(OUT)\afsicf.obj - $(COPY) $(OUT)\cm_dns.obj $(DESTDIR)\lib - $(COPY) $(OUT)\cm_config.obj $(DESTDIR)\lib - $(COPY) $(OUT)\afsicf.obj $(DESTDIR)\lib - -install_headers: $(IDLFILES) $(INCFILES) - -install: install_headers install_objs $(CONF_DLLFILE) \ - $(EXEDIR)\klog.exe \ - $(EXEDIR)\tokens.exe \ - $(EXEDIR)\unlog.exe $(EXEDIR)\afsd.exe $(EXEDIR)\afsd_service.exe \ - $(EXEDIR)\fs.exe \ - $(EXEDIR)\symlink.exe \ - $(EXEDIR)\afsdacl.exe \ - $(LOGON_DLLFILE) \ - $(EXEDIR)\afsshare.exe \ - $(DESTDIR)\bin\kpasswd.exe $(EXEDIR)\cmdebug.exe - -install9X: install_headers $(CONF_DLLFILE) \ - $(EXEDIR)\klog.exe \ - $(EXEDIR)\tokens.exe \ - $(EXEDIR)\unlog.exe $(EXEDIR)\afsd_service.exe \ - $(EXEDIR)\fs.exe $(EXEDIR)\symlink.exe \ - $(LOGON_DLLFILE) $(LOG95_DLLFILE) \ - $(EXEDIR)\afsshare.exe \ - $(DESTDIR)\bin\kpasswd.exe - -install_libutils: install_headers $(CONF_DLLFILE) \ - $(EXEDIR)\klog.exe \ - $(EXEDIR)\tokens.exe \ - $(EXEDIR)\unlog.exe \ - $(EXEDIR)\fs.exe $(EXEDIR)\symlink.exe \ - $(EXEDIR)\afsshare.exe \ - $(DESTDIR)\bin\kpasswd.exe $(EXEDIR)\cmdebug.exe - -############################################################################ -# Local clean target; augments predefined clean target - -############################################################################ -# assorted exe's - -EXELIBS = \ - $(DESTDIR)\lib\afs\afsauth.lib \ - $(DESTDIR)\lib\afs\afskauth.lib \ - $(DESTDIR)\lib\afs\afsprot.lib \ - $(DESTDIR)\lib\afs\afspioctl.lib \ - $(DESTDIR)\lib\afs\afsaudit.lib \ - $(DESTDIR)\lib\afs\afsutil.lib \ - $(DESTDIR)\lib\afs\afscom_err.lib \ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afscmd.lib \ - $(DESTDIR)\lib\afsubik.lib \ - $(DESTDIR)\lib\afsrxkad.lib \ - $(DESTDIR)\lib\afsdes.lib \ - $(DESTDIR)\lib\afsrx.lib \ - $(DESTDIR)\lib\afslwp.lib \ - $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\libafsconf.lib - -EXELIBS2 = \ - $(DESTDIR)\lib\afsrpc.lib \ - $(DESTDIR)\lib\afs\afsprot.lib \ - $(DESTDIR)\lib\afs\afspioctl.lib \ - $(DESTDIR)\lib\afs\afscom_err.lib \ - $(DESTDIR)\lib\afs\afscmd.lib \ - $(DESTDIR)\lib\afs\afsutil.lib \ - $(DESTDIR)\lib\afsubik.lib \ - $(DESTDIR)\lib\afsrxkad.lib \ - $(DESTDIR)\lib\afsdes.lib \ - $(DESTDIR)\lib\afslwp.lib \ - $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\libafsconf.lib - -# klog.exe -$(EXEDIR)\klog.exe: $(OUT)\cklog.obj $(OUT)\klog.res $(EXELIBS) - $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib - $(EXEPREP) - -# tokens.exe -$(EXEDIR)\tokens.exe: $(OUT)\ctokens.obj $(OUT)\tokens.res $(EXELIBS) - $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib - $(EXEPREP) - -# unlog.exe -$(EXEDIR)\unlog.exe: $(OUT)\cunlog.obj $(OUT)\unlog.res $(EXELIBS) - $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib - $(EXEPREP) - -# afsd.exe -AFSD_EXEFILE = $(EXEDIR)\afsd.exe - -AFSD_SDKLIBS =\ - netapi32.lib \ - dnsapi.lib \ - mpr.lib \ - rpcrt4.lib \ - user32.lib \ - Dbghelp.lib \ - strsafe.lib \ - mpr.lib \ - secur32.lib \ - ole32.lib \ - oleaut32.lib \ - iphlpapi.lib - -AFSD_EXELIBS =\ - $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\afsrpc.lib \ - $(DESTDIR)\lib\afsrx.lib \ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\afs\mtafsvldb.lib \ - $(DESTDIR)\lib\afs\mtafsint.lib \ - $(DESTDIR)\lib\libafsconf.lib \ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(LANAHELPERLIB) - -$(AFSD_EXEFILE): $(OUT)\afsd.obj $(AFSDOBJS) $(OUT)\afsd.res $(RXOBJS) $(AFSD_EXELIBS) - $(EXEGUILINK) $(AFSD_SDKLIBS) - $(EXEPREP) - -# afsd_service.exe -$(EXEDIR)\afsd_service.exe: $(OUT)\afsd_service.obj $(AFSDOBJS) $(OUT)\afsd_service.res $(RXOBJS) $(AFSD_EXELIBS) - $(EXECONLINK) $(AFSD_SDKLIBS) /MAP /LARGEADDRESSAWARE - $(EXEPREP) - -# fs.exe -$(EXEDIR)\fs.exe: $(FSOBJS) $(OUT)\fs.res $(EXELIBS) - $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib - $(EXEPREP) - -# cmdebug.exe -$(EXEDIR)\cmdebug.exe: $(CMDBGOBJS) $(OUT)\cmdebug.res $(EXELIBS2) - $(EXECONLINK) $(EXELIBS2) dnsapi.lib mpr.lib iphlpapi.lib rpcrt4.lib - $(EXEPREP) - -# symlink.exe -$(EXEDIR)\symlink.exe: $(SLOBJS) $(OUT)\symlink.res $(EXELIBS) - $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib - $(EXEPREP) - -# afsshare.exe -$(EXEDIR)\afsshare.exe: $(OUT)\afsshare.obj $(OUT)\afsshare.res - $(EXECONLINK) - $(EXEPREP) - -# afsdacl.exe -$(EXEDIR)\afsdacl.exe: $(OUT)\afsdacl.obj $(OUT)\afsdacl.res - $(EXECONLINK) - $(EXEPREP) - -# kpasswd.exe - built in kauth, but rebuild here to make pthread-based, -# which is required for Windows 95. At some point it would be nice -# for all commands to be pthread based, in which case they should -# be built in a separate directory (perhaps tbin ala tviced) or -# libafsauthent should be built earlier so that each command can -# be built in its native directory. - -KAUTH = ..\..\kauth - -KPASSWD_OBJS =\ - $(OUT)\kpasswd.obj \ - $(OUT)\kkids.obj \ - $(OUT)\kautils.obj \ - $(OUT)\$(KAUTH)\kpasswd.res - -KPASSWD_LIBS =\ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\afsrpc.lib \ - $(DESTDIR)\lib\afsrx.lib \ - $(DESTDIR)\lib\afs\afscmd.lib \ - $(DESTDIR)\lib\afsdes.lib \ - $(DESTDIR)\lib\afs\afsutil.lib - -$(OUT)\kpasswd.obj: $(KAUTH)/kpasswd.c - $(C2OBJ) -DAFS_PTHREAD_ENV /Fo$@ $** - -$(OUT)\kkids.obj: $(KAUTH)/kkids.c - $(C2OBJ) -DAFS_PTHREAD_ENV /Fo$@ $** - -$(OUT)\kautils.obj: $(KAUTH)/kautils.c - $(C2OBJ) -DAFS_PTHREAD_ENV /Fo$@ $** - -$(OUT)\kpasswd.res: $(KAUTH)\kpasswd.rc - $(RC) /Fo$@ $** - -$(DESTDIR)\bin\kpasswd.exe: $(KPASSWD_OBJS) $(KPASSWD_LIBS) - $(DEL) $(DESTDIR)\bin\kpasswd.exe - $(EXECONLINK) - $(EXEPREP) - - -############################################################################ -# generate versioninfo resources - -$(OUT)\afsshare.res: afsshare.rc AFS_component_version_number.h - -$(OUT)\fs.res: fs.rc AFS_component_version_number.h - -$(OUT)\symlink.res: symlink.rc AFS_component_version_number.h - -$(OUT)\klog.res: klog.rc AFS_component_version_number.h - -$(OUT)\tokens.res: tokens.rc AFS_component_version_number.h - -$(OUT)\unlog.res: unlog.rc AFS_component_version_number.h - -afsd_eventmessages.rc: afsd_eventmessages.h - -$(OUT)\afsd_service.res: afsd_service.rc afsd_eventmessages.rc AFS_component_version_number.h - -$(OUT)\afslogon.res: afslogon.rc AFS_component_version_number.h - -$(OUT)\afslog95.res: afslog95.rc AFS_component_version_number.h - -$(OUT)\libafsconf.res: libafsconf.rc AFS_component_version_number.h - -############################################################################ -clean:: - $(DEL) $(OUT)\*.res - $(DEL) afsrpc.h - $(DEL) afsrpc_?.* - $(DEL) afsd_eventmessages.h - $(DEL) $(CONF_DLLFILE) - $(DEL) $(LOGON_DLLFILE) - $(DEL) $(LOG95_DLLFILE) - -mkdir: diff --git a/src/WINNT/afsd/afsd.c b/src/WINNT/afsd/afsd.c deleted file mode 100644 index 2f10e2e84..000000000 --- a/src/WINNT/afsd/afsd.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include - -#include -#include "afsd.h" -#include "afsd_init.h" -#include -#include -#include - -#ifdef _DEBUG -#include -#endif - -HANDLE main_inst; -HWND main_wnd; -char main_statusText[100]; -RECT main_rect; -osi_log_t *afsd_logp; - -extern int traceOnPanic; - -extern void afsd_DbgBreakAllocInit(); -extern void afsd_DbgBreakAdd(DWORD requestNumber); - -HANDLE WaitToTerminate = NULL; - -/* - * Notifier function for use by osi_panic - */ -void afsd_notifier(char *msgp, char *filep, long line) -{ - char tbuffer[100]; - if (filep) - sprintf(tbuffer, "Error at file %s, line %d", filep, line); - else - strcpy(tbuffer, "Error at unknown location"); - - if (!msgp) - msgp = "Assertion failure"; - - MessageBox(NULL, tbuffer, msgp, MB_OK|MB_ICONSTOP|MB_SETFOREGROUND); - - afsd_ForceTrace(TRUE); - buf_ForceTrace(TRUE); - - if (traceOnPanic) { - _asm int 3h; - } - - exit(1); -} - -/* Init function called when window application starts. Inits instance and - * application together, since in Win32 they're essentially the same. - * - * Function then goes into a loop handling user interface messages. Most are - * used to handle redrawing the icon. - */ -int WINAPI WinMain( - HINSTANCE hInstance, - HINSTANCE hPrevInstance, - char *lpCmdLine, - int nCmdShow) -{ - MSG msg; - - afsd_SetUnhandledExceptionFilter(); - -#ifdef _DEBUG - afsd_DbgBreakAllocInit(); - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF /* | _CRTDBG_CHECK_ALWAYS_DF */ | _CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF ); - if (lpCmdLine) - { - char *allocRequest = strtok(lpCmdLine, " \t"); - while (allocRequest) - { - afsd_DbgBreakAdd(atoi(allocRequest)); - allocRequest = strtok(NULL, " \t"); - } - } -#endif - - if (!InitClass(hInstance)) - return (FALSE); - - if (!InitInstance(hInstance, nCmdShow)) - return (FALSE); - - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return (msg.wParam); -} - - -/* create the window type for our main window */ -BOOL InitClass(HANDLE hInstance) -{ - WNDCLASS wc; - - wc.style = CS_DBLCLKS; /* double-click messages */ - wc.lpfnWndProc = (WNDPROC) MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(hInstance, "AFSDIcon"); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = "AFSDMenu"; - wc.lpszClassName = "AFSDWinClass"; - - return (RegisterClass(&wc)); -} - -/* initialize the process. Reads the init files to get the appropriate - * information. */ -BOOL InitInstance( - HANDLE hInstance, - int nCmdShow) -{ - HWND hWnd; - HDC hDC; - TEXTMETRIC textmetric; - INT nLineHeight; - long code; - char *reason; - - /* remember this, since it is a useful thing for some of the Windows - * calls */ - main_inst = hInstance; - - /* create our window */ - hWnd = CreateWindow( - "AFSDWinClass", - "AFSD", - WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - NULL, - NULL, - hInstance, - NULL - ); - - if (!hWnd) - return (FALSE); - - /* lookup text dimensions */ - hDC = GetDC(hWnd); - GetTextMetrics(hDC, &textmetric); - nLineHeight = textmetric.tmExternalLeading + textmetric.tmHeight; - - main_rect.left = GetDeviceCaps(hDC, LOGPIXELSX) / 4; /* 1/4 inch */ - main_rect.right = GetDeviceCaps(hDC, HORZRES); - main_rect.top = GetDeviceCaps(hDC, LOGPIXELSY) / 4; /* 1/4 inch */ - ReleaseDC(hWnd, hDC); - main_rect.bottom = main_rect.top + nLineHeight; - - osi_InitPanic(afsd_notifier); - - afsi_start(); - - code = afsd_InitCM(&reason); - if (code != 0) - osi_panic(reason, __FILE__, __LINE__); - - code = afsd_InitDaemons(&reason); - if (code != 0) - osi_panic(reason, __FILE__, __LINE__); - - code = afsd_InitSMB(&reason, MessageBox); - if (code != 0) - osi_panic(reason, __FILE__, __LINE__); - - ShowWindow(hWnd, SW_SHOWMINNOACTIVE); - UpdateWindow(hWnd); - return (TRUE); -} - -/* called with no locks with translated messages */ -LONG APIENTRY MainWndProc( - HWND hWnd, - unsigned int message, - unsigned int wParam, - long lParam) -{ - HDC hDC; /* display-context variable */ - PAINTSTRUCT ps; /* paint structure */ - - main_wnd = hWnd; - - switch (message) { - case WM_QUERYOPEN: - /* block attempts to open the window */ - return 0; - - case WM_COMMAND: - /* LOWORD(wParam) is command */ - return (DefWindowProc(hWnd, message, wParam, lParam)); - - case WM_CREATE: - break; - - case WM_PAINT: - hDC = BeginPaint (hWnd, &ps); - /* nothing to print, but this clears invalidated rectangle flag */ - EndPaint(hWnd, &ps); - break; - - case WM_DESTROY: - RpcMgmtStopServerListening(NULL); - PostQuitMessage(0); - break; - - default: - return (DefWindowProc(hWnd, message, wParam, lParam)); - } - return (0); -} diff --git a/src/WINNT/afsd/afsd.h b/src/WINNT/afsd/afsd.h deleted file mode 100644 index 7f9291ced..000000000 --- a/src/WINNT/afsd/afsd.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __AFSD_H_ENV__ -#define __AFSD_H_ENV__ 1 - -#include - -#ifndef DJGPP -BOOL InitClass(HANDLE); -BOOL InitInstance(HANDLE, int); - -LONG APIENTRY MainWndProc(HWND, unsigned int, unsigned int, long); -BOOL APIENTRY About(HWND, unsigned int, unsigned int, long); -#endif /* !DJGPP */ - -#ifndef DJGPP -#include -#else /* DJGPP */ -#include -#include -#include "dosdefs95.h" -#include "largeint95.h" -#endif /* !DJGPP */ - -#include "afsdicon.h" - -#include "cm.h" - -#include "krb.h" -#include "krb_prot.h" -/*#include */ -#include - -#include -#include "cm_config.h" -#include "cm_user.h" -#include "cm_callback.h" -#ifdef DISKCACHE95 -#include "cm_diskcache95.h" -#endif /* DISKCACHE95 */ -#include "cm_conn.h" -#include "cm_aclent.h" -#include "cm_cell.h" -#include "cm_server.h" -#include "cm_scache.h" -#include "cm_volume.h" -#include "cm_dcache.h" -#include "cm_access.h" -#include "cm_utils.h" -#include "cm_vnodeops.h" -#include "cm_dir.h" -#include "cm_daemon.h" -#include "cm_ioctl.h" -#include "cm_dnlc.h" -#include "cm_buf.h" -#include "cm_memmap.h" -#include "cm_freelance.h" -#include "smb_ioctl.h" -#include "afsd_init.h" -#ifdef DJGPP -#include "afs/afsmsg95.h" -#endif - -#include -#include - -#define AFS_DAEMON_SERVICE_NAME "TransarcAFSDaemon" -#define AFS_DAEMON_EVENT_NAME "AFS Client" - -void afs_exit(); - -/* globals from the base afsd */ - -extern int cm_logChunkSize; -extern int cm_chunkSize; - -extern cm_volume_t *cm_rootVolumep; - -extern cm_cell_t *cm_rootCellp; - -extern cm_fid_t cm_rootFid; - -extern cm_scache_t *cm_rootSCachep; - -extern osi_log_t *afsd_logp; - -extern char cm_mountRoot[]; -extern DWORD cm_mountRootLen; - -extern char cm_CachePath[]; - -extern BOOL isGateway; - -extern BOOL reportSessionStartups; - -#ifdef AFS_FREELANCE_CLIENT -extern char *cm_FakeRootDir; // the fake root.afs directory - -extern int cm_noLocalMountPoints; // no. of fake mountpoints - -extern cm_localMountPoint_t* cm_localMountPoints; // array of fake mountpoints - -extern int cm_fakeDirSize; // size (in bytes) of fake root.afs directory - -extern int cm_fakeDirCallback; // state of the fake root.afs directory. indicates - // if it needs to be refreshed - -extern int cm_fakeGettingCallback; // 1 if currently updating the fake root.afs directory, - // 0 otherwise - -extern int cm_fakeDirVersion; // the version number of the root.afs directory. used -#endif /* AFS_FREELANCE_CLIENT */ - -extern int cm_dnsEnabled; -extern int cm_freelanceEnabled; - -extern long rx_mtu; - -extern HANDLE WaitToTerminate; - -#define CAPABILITY_ERRORTRANS (1<<0) -#define CAPABILITY_BITS 1 - -#define DFS_SUPPORT 1 -#define LOG_PACKET 1 -#undef NOTSERVICE - -#define AFSD_HOOK_DLL "afsdhook.dll" -#define AFSD_INIT_HOOK "AfsdInitHook" -typedef BOOL ( APIENTRY * AfsdInitHook )(void); -#define AFSD_RX_STARTED_HOOK "AfsdRxStartedHook" -typedef BOOL ( APIENTRY * AfsdRxStartedHook )(void); -#define AFSD_SMB_STARTED_HOOK "AfsdSmbStartedHook" -typedef BOOL ( APIENTRY * AfsdSmbStartedHook )(void); -#define AFSD_STARTED_HOOK "AfsdStartedHook" -typedef BOOL ( APIENTRY * AfsdStartedHook )(void); -#define AFSD_DAEMON_HOOK "AfsdDaemonHook" -typedef BOOL ( APIENTRY * AfsdDaemonHook )(void); -#define AFSD_STOPPING_HOOK "AfsdStoppingHook" -typedef BOOL ( APIENTRY * AfsdStoppingHook )(void); -#define AFSD_STOPPED_HOOK "AfsdStoppedHook" -typedef BOOL ( APIENTRY * AfsdStoppedHook )(void); -#endif /* AFSD_H_ENV */ diff --git a/src/WINNT/afsd/afsd.ico b/src/WINNT/afsd/afsd.ico deleted file mode 100644 index 10cc59c76cdf2992346b07c42241e73abcb9ac1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmaiyJx;_h5QX0oq%AfIRJ5ez7~E{#aRv)1XV~5aK0p+%kP>Snhmy+XjqQXGAu-N) z=9@n!k%0qO+ulRu;|6%3eWJG1XX*jB+yTYh-=dggMyYJL)1@j{Ynh1YL5$*2xg;c8 zmf9|!*gnY`$=LTLP%ms#V8y;qfh8+e3U*v?nGIW%h8_PZ=L!Gu$rv+CVVLG&qI)5~ z`8jw|;j7_SFTy}d%$^cbNh5*T$LND}jbuO1EC_*^*+-cdiG@qQ*M%h`;<^#p%e(g2 zuwx!*)&kw>k^gIDrw#Fk{j0f -#include - -/*#include */ -#include -/*#include */ - -#include -#include - -#include -#include -#include -/*#include */ -#include "afsd.h" -#include "afsd_init.h" - - -char main_statusText[100]; -osi_log_t *afsd_logp; - -extern int traceOnPanic; -BOOL InitInstance(struct cmd_syndesc *as, char *arock); -extern int afs_shutdown; -int tried_shutdown=0; - -int afs_current_status = AFS_STATUS_INIT; - -/* - * Notifier function for use by osi_panic - */ -void afsd_notifier(char *msgp, char *filep, long line) -{ - char tbuffer[100]; - if (filep) - sprintf(tbuffer, "Error at file %s, line %d", filep, line); - else - strcpy(tbuffer, "Error at unknown location"); - - if (!msgp) - msgp = "Assertion failure"; - - /*MessageBox(NULL, tbuffer, msgp, MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);*/ - - afsd_ForceTrace(TRUE); - buf_ForceTrace(TRUE); - - if (traceOnPanic) { - /*asm("int 3");*/ - } - - afs_exit(AFS_EXITCODE_PANIC); -} - -/* Init function called when window application starts. Inits instance and - * application together, since in Win32 they're essentially the same. - * - * Function then goes into a loop handling user interface messages. Most are - * used to handle redrawing the icon. - */ -int main(int argc, char *argv[]) -{ - struct cmd_syndesc *ts; - - fprintf(stderr, "AFS Client for Windows 95.\n"); - /*fprintf(stderr, "Use Ctrl-C to shut down client.\n\n\n");*/ - ts = cmd_CreateSyntax((char *) 0, (int (*)()) InitInstance, (char *) 0, "start AFS"); - cmd_AddParm(ts, "-lanadapt", CMD_SINGLE, CMD_OPTIONAL, "LAN adapter number"); - cmd_AddParm(ts, "-threads", CMD_SINGLE, CMD_OPTIONAL, "Number of server threads"); - cmd_AddParm(ts, "-rootvol", CMD_SINGLE, CMD_OPTIONAL, "name of AFS root volume"); - cmd_AddParm(ts, "-stat", CMD_SINGLE, CMD_OPTIONAL, "number of stat entries"); - cmd_AddParm(ts, "-memcache", CMD_FLAG, CMD_OPTIONAL, "use memory cache"); - cmd_AddParm(ts, "-cachedir", CMD_SINGLE, CMD_OPTIONAL, "cache directory"); - cmd_AddParm(ts, "-mountdir", CMD_SINGLE, CMD_OPTIONAL, "mount location"); - cmd_AddParm(ts, "-daemons", CMD_SINGLE, CMD_OPTIONAL, "number of daemons to use"); - cmd_AddParm(ts, "-nosettime", CMD_FLAG, CMD_OPTIONAL, "don't set the time"); - cmd_AddParm(ts, "-verbose", CMD_FLAG, CMD_OPTIONAL, "display lots of information"); - cmd_AddParm(ts, "-debug", CMD_FLAG, CMD_OPTIONAL, "display debug info"); - cmd_AddParm(ts, "-chunksize", CMD_SINGLE, CMD_OPTIONAL, "log(2) of chunk size"); - cmd_AddParm(ts, "-dcache", CMD_SINGLE, CMD_OPTIONAL, "number of dcache entries"); - cmd_AddParm(ts, "-confdir", CMD_SINGLE, CMD_OPTIONAL, "configuration directory"); - cmd_AddParm(ts, "-logfile", CMD_SINGLE, CMD_OPTIONAL, "Place to keep the CM log"); - cmd_AddParm(ts, "-waitclose", CMD_FLAG, CMD_OPTIONAL, "make close calls synchronous"); - cmd_AddParm(ts, "-shutdown", CMD_FLAG, CMD_OPTIONAL, "Shutdown all afs state"); - cmd_AddParm(ts, "-sysname", CMD_SINGLE, CMD_OPTIONAL, "System name (@sys value)"); - cmd_AddParm(ts, "-gateway", CMD_FLAG, CMD_OPTIONAL, "machine is a gateway"); - cmd_AddParm(ts, "-tracebuf", CMD_SINGLE, CMD_OPTIONAL, "trace buffer size"); - cmd_AddParm(ts, "-startup", CMD_FLAG, CMD_OPTIONAL, "start AFS client"); - cmd_AddParm(ts, "-diskcache", CMD_SINGLE, CMD_OPTIONAL, "diskcache size"); - cmd_AddParm(ts, "-afsdb", CMD_FLAG, CMD_OPTIONAL, "use DNS for cell server resolution"); - cmd_AddParm(ts, "-freelance", CMD_FLAG, CMD_OPTIONAL, "virtual AFS root"); - - return (cmd_Dispatch(argc, argv)); -} - -/* initialize the process. Reads the init files to get the appropriate - * information. */ -void vxd_Shutdown(void); -int afsd_shutdown(int); -int shutdown_handler(int); - -BOOL InitInstance(struct cmd_syndesc *as, char *arock) -{ - long code; - char *reason; - -#ifdef DJGPP - osi_Init(); -#endif - -#ifndef DJGPP - osi_InitPanic(afsd_notifier); -#endif - - /*sleep(10);*/ - - afsi_start(); - - code = afsMsg_Init(); - if (code != 0) - osi_panic("socket failure", __FILE__, __LINE__); - - code = afsd_InitCM(&reason, as, arock); - if (code != 0) - osi_panic(reason, __FILE__, __LINE__); - - code = afsd_InitDaemons(&reason); - if (code != 0) - osi_panic(reason, __FILE__, __LINE__); - - code = afsd_InitSMB(&reason); - if (code != 0) - osi_panic(reason, __FILE__, __LINE__); - - signal(SIGINT, shutdown_handler); - - thrd_Yield(); /* give new threads a chance to run */ - - /* send message to GUI caller indicating successful init */ - afs_current_status = AFS_STATUS_RUNNING; - afsMsg_StatusChange(afs_current_status, 0, NULL); - -#ifdef DJGPP - /* Keep the process from just terminating */ - while(afs_shutdown == 0) - { - /*IOMGR_Sleep(180);*/ - IOMGR_Sleep(8); - /* workaround: WaitForKeystroke(nonzero num) calls - IOMGR_Select, though Win95 select works only on sockets */ - /* so, we poll instead */ - /*if (LWP_WaitForKeystroke(0)) - break;*/ - } - afsd_shutdown(0); -#endif - afs_exit(0); - - return (TRUE); -} - -int shutdown_handler(int x) -{ - if (!tried_shutdown) - { - fprintf(stderr, "This program should not be shut down manually. It should " - "be shut down by the\nWindows AFS Client Control Center. Press Ctrl-C " - "again if you really want to do this.\n"); - fflush(stderr); - tried_shutdown = 1; - } - else - { - fprintf(stderr, "Shutting down AFSD...\n"); - fflush(stderr); - afs_shutdown = 1; - } -} - -int afsd_shutdown(int x) -{ -#ifdef AFS_VXD - vxd_Shutdown(); -#else - smb_Shutdown(); -#endif - - fprintf(stderr, "AFSD shutdown complete.\n"); - /*exit(0);*/ -} - -void afs_exit(int exitCode) -{ - afs_current_status = AFS_STATUS_EXITING; - afsMsg_StatusChange(afs_current_status, - exitCode, NULL); - afsMsg_Shutdown(); - exit(exitCode); -} diff --git a/src/WINNT/afsd/afsd_eventlog.c b/src/WINNT/afsd/afsd_eventlog.c deleted file mode 100644 index a9f60f16e..000000000 --- a/src/WINNT/afsd/afsd_eventlog.c +++ /dev/null @@ -1,215 +0,0 @@ -//////////////////////////////////////////////////////////////////// -// -// -// E V E N T L O G G I N G F U N C T I O N S -// -// -//////////////////////////////////////////////////////////////////// - - -#include -#include -#include -#include -#include "afsd_eventlog.h" - -static CHAR szKeyName[] = AFSREG_APPLOG_SUBKEY "\\" AFSREG_CLT_SVC_NAME; - -static BOOL GetServicePath(LPTSTR lpPathBuf, PDWORD pdwPathBufSize); -static BOOL AddEventSource(void); - -static BOOL -GetServicePath(LPTSTR lpPathBuf, PDWORD pdwPathBufSize) -{ - HKEY hKey = NULL; - DWORD dwData = 0; - BOOL bRet = TRUE; - - do { - - // Open key - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_SVR_SVC_SUBKEY, 0, KEY_QUERY_VALUE, &hKey ) ) - { - bRet = FALSE; - break; - } - - // prepare user's buffer and read into it - dwData = *pdwPathBufSize; - memset(lpPathBuf, '\0', dwData); - if ( RegQueryValueEx( - hKey, // handle to key - "ImagePath", // value name - NULL, // reserved - NULL, // type buffer - (LPBYTE) lpPathBuf, // data buffer - &dwData)) // size of data buffer - { - bRet = FALSE; - break; - } - - *pdwPathBufSize = dwData; - - } while (0); - - if (hKey != NULL) - RegCloseKey(hKey); - - return bRet; -} - -// -// Ensure name for message file is in proper location in Registry. -// -static BOOL -AddEventSource() -{ - HKEY hKey = NULL; - UCHAR szBuf[MAX_PATH]; - DWORD dwData, dwDisposition; - BOOL bRet = TRUE; - - do { - // Let's see if key already exists as a subkey under the - // Application key in the EventLog registry key. If not, - // create it. - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, szKeyName, 0, - KEY_QUERY_VALUE, &hKey ) ) - { - // nope - create it - if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, - NULL, REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, NULL, &hKey, - &dwDisposition)) - { - bRet = FALSE; - break; - } - - // Set the name of the message file - // Get "ImagePath" from TransarcAFSDaemon service - memset(szBuf, '\0', MAX_PATH); - dwData = MAX_PATH; - GetServicePath(szBuf, &dwData); - - // Add the name to the EventMessageFile subkey. - if ( RegSetValueEx( - hKey, // subkey handle - AFSREG_SVR_APPLOG_MSGFILE_VALUE, // value name - 0, // must be zero - REG_EXPAND_SZ, // value type - (LPBYTE) szBuf, // pointer to value data - strlen(szBuf) + 1)) // length of value data - { - bRet = FALSE; - break; - } - - // Set the supported event types in the TypesSupported subkey. - dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | - EVENTLOG_INFORMATION_TYPE; - - if ( RegSetValueEx( - hKey, // subkey handle - AFSREG_SVR_APPLOG_MSGTYPE_VALUE, // value name - 0, // must be zero - REG_DWORD, // value type - (LPBYTE) &dwData, // pointer to value data - sizeof(DWORD))) // length of value data - { - bRet = FALSE; - break; - } - } - - else - { - // key was opened - read it - memset(szBuf, '\0', MAX_PATH); - dwData = MAX_PATH; - if ( RegQueryValueEx( - hKey, // handle to key - AFSREG_SVR_APPLOG_MSGFILE_VALUE, // value name - NULL, // reserved - NULL, // type buffer - (LPBYTE) szBuf, // data buffer - &dwData)) // size of data buffer - { - bRet = FALSE; - break; - } - } - - } while (0); - - if (hKey != NULL) - RegCloseKey(hKey); - - return bRet; -} - -// Log an event with a formatted system message as the (only) substitution -// string, from the given message ID. -VOID -LogEventMessage(WORD wEventType, DWORD dwEventID, DWORD dwMessageID) -{ - LPTSTR msgBuf; - - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_ALLOCATE_BUFFER, - NULL, dwMessageID, 0, (LPTSTR)&msgBuf, 0, NULL); - LogEvent(wEventType, dwEventID, msgBuf, NULL); - LocalFree(msgBuf); -} - -// -// Use the ReportEvent API to write an entry to the system event log. -// -#define MAXSTRINGARGS 100 -VOID -LogEvent(WORD wEventType, DWORD dwEventID, LPTSTR lpString, ...) -{ - va_list listStrings; - HANDLE hEventSource; - LPTSTR lpStrings[MAXSTRINGARGS]; - WORD wNumStrings; - - // Ensure that our event source is properly initialized. - if (!AddEventSource()) - return; - - // Get a handle to the event log. - hEventSource = RegisterEventSource(NULL, AFSREG_CLT_SVC_PARAM_KEY); - if (hEventSource == NULL) - return; - - // Construct the array of substitution strings. - va_start(listStrings, lpString); - for (wNumStrings = 0; - lpString != NULL && wNumStrings < MAXSTRINGARGS; - wNumStrings++) - { - lpStrings[wNumStrings] = lpString; - // Advance to the next argument. - lpString = va_arg(listStrings, LPTSTR); - } - va_end(listStrings); - - // Make sure we were not given too many args. - if (wNumStrings >= MAXSTRINGARGS) - return; - - // Log the event. - ReportEvent(hEventSource, // handle of event source - wEventType, // event type - 0, // event category - dwEventID, // event ID - NULL, // current user's SID - wNumStrings, // strings in lpszStrings - 0, // no bytes of raw data - lpStrings, // array of error strings - NULL); // no raw data - - DeregisterEventSource(hEventSource); -} diff --git a/src/WINNT/afsd/afsd_eventlog.h b/src/WINNT/afsd/afsd_eventlog.h deleted file mode 100644 index 614d2d85b..000000000 --- a/src/WINNT/afsd/afsd_eventlog.h +++ /dev/null @@ -1,13 +0,0 @@ -// This header contains needed definitions and declarations for afsd's -// event logging functions. - -#ifndef __AFSD_EVENTLOG_H_ -#define __AFSD_EVENTLOG_H_ 1 - -// Include the event log message definitions. -#include "afsd_eventmessages.h" - -VOID LogEventMessage(WORD wEventType, DWORD dwEventID, DWORD dwMessageID); -VOID LogEvent(WORD wEventType, DWORD dwEventID, LPTSTR lpString, ...); - -#endif /* __AFSD_EVENTLOG_H_ */ diff --git a/src/WINNT/afsd/afsd_eventmessages.mc b/src/WINNT/afsd/afsd_eventmessages.mc deleted file mode 100644 index 37f86ac9b..000000000 --- a/src/WINNT/afsd/afsd_eventmessages.mc +++ /dev/null @@ -1,109 +0,0 @@ -;// -;// afsd_eventmessages.mc -;// -;// This file contains the message definitions for the -;// TransarcAFSDaemon service to facilitate system event logging. -;// -;// -; -;#ifndef __AFSD_EVENTMESSAGES_H_ -;#define __AFSD_EVENTMESSAGES_H_ 1 - -MessageIdTypedef=DWORD - -SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS - Informational=0x1:STATUS_SEVERITY_INFORMATIONAL - Warning=0x2:STATUS_SEVERITY_WARNING - Error=0x3:STATUS_SEVERITY_ERROR - ) - -FacilityNames=(System=0x0:FACILITY_SYSTEM - Runtime=0x2:FACILITY_RUNTIME - Stubs=0x3:FACILITY_STUBS - Io=0x4:FACILITY_IO_ERROR_CODE - ) - -LanguageNames=(English=0x409:MSG00409) - -MessageId=0x1 -Severity=Informational -Facility=System -SymbolicName=MSG_TIME_FLUSH_PER_VOLUME -Language=English -Elapsed time to flush AFS volume <%1> = %2 milliseconds. -. - -MessageId= -Severity=Informational -Facility=System -SymbolicName=MSG_TIME_FLUSH_TOTAL -Language=English -Total elapsed time to flush %1 AFS volume(s) = %2 milliseconds. -. - -MessageId= -Severity=Error -Facility=System -SymbolicName=MSG_FLUSH_NO_SHARE_NAME -Language=English -Cannot get AFS share name to flush volumes. -. - -MessageId= -Severity=Error -Facility=System -SymbolicName=MSG_FLUSH_BAD_SHARE_NAME -Language=English -Invalid share name %1; cannot flush volumes. -. - -MessageId= -Severity=Error -Facility=System -SymbolicName=MSG_FLUSH_NO_MEMORY -Language=English -Insufficient memory to flush volumes. -. - -MessageId= -Severity=Error -Facility=System -SymbolicName=MSG_FLUSH_OPEN_ENUM_ERROR -Language=English -Cannot open enumeration of network resources: %1 -. - -MessageId= -Severity=Error -Facility=System -SymbolicName=MSG_FLUSH_ENUM_ERROR -Language=English -Cannot enumerate network resources: %1 -. - -MessageId= -Severity=Warning -Facility=System -SymbolicName=MSG_FLUSH_FAILED -Language=English -Failed to flush volume %1. -. - -MessageId= -Severity=Error -Facility=System -SymbolicName=MSG_FLUSH_IMPERSONATE_ERROR -Language=English -Failed to impersonate logged-on user. -. - -MessageId= -Severity=Warning -Facility=System -SymbolicName=MSG_FLUSH_UNEXPECTED_EVENT -Language=English -Flush volumes thread received unrecognized event. -. - - -;#endif /* __AFSD_EVENTMESSAGES_H_ 1 */ diff --git a/src/WINNT/afsd/afsd_eventmessages.rc b/src/WINNT/afsd/afsd_eventmessages.rc deleted file mode 100644 index 6f3b1e6ba..000000000 --- a/src/WINNT/afsd/afsd_eventmessages.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x9,0x1 -1 11 MSG00409.bin diff --git a/src/WINNT/afsd/afsd_flushvol.c b/src/WINNT/afsd/afsd_flushvol.c deleted file mode 100644 index 5d90c7fba..000000000 --- a/src/WINNT/afsd/afsd_flushvol.c +++ /dev/null @@ -1,506 +0,0 @@ -// -// AFSD_FLUSHVOL.C -// -// Routines to handle flushing AFS volumes in response to -// System Power event notification such as Hibernate request. -// -///////////////////////////////////////////////////////////////////// - -#include -#include - -#include - -#include -#include -#include "afsd.h" -#include "afsd_init.h" -#include "smb.h" -#include "cm_conn.h" -#include -#include -#include - -#include - -#include - -#include "afsd_flushvol.h" -#include "afsd_eventlog.h" -#include "lanahelper.h" - -extern void afsi_log(char *pattern, ...); - -static FLUSHVOLTHREADINFO gThreadInfo = {0}; -static HANDLE gThreadHandle = NULL; - - -///////////////////////////////////////////////////////////////////// -// -// Call routine found in FS.EXE to flush volume. -// -// At entry, input param is UNC string for volume, -// e.g. '\\afs\all\athena.mit.edu\user\m\h\mholiday' -// -// I believe that success from 'pioctl' routine -// indicated by return value of zero (0). -// -afs_int32 -afsd_ServicePerformFlushVolumeCmd(char *data) -{ - register afs_int32 code; - struct ViceIoctl blob; - - afsi_log("Flushing Volume \"%s\"",data); - memset(&blob, '\0', sizeof(blob)); - code = pioctl(data, VIOC_FLUSHVOLUME, &blob, 0); - - return code; -} - -BOOL -afsd_ServicePerformFlushVolumes() -{ - CONST CHAR COLON = ':'; - CONST CHAR SLASH = '\\'; - CONST DWORD NETRESBUFSIZE = 16384; - CHAR bufMessage[1024]; - UINT i; - DWORD dwServerSize; - DWORD dwRet; - DWORD dwCount; - DWORD dwNetResBufSize; - DWORD dwTotalVols = 0; - DWORD dwVolBegin, dwVolEnd; - DWORD dwFlushBegin, dwFlushEnd; - HANDLE hEnum; - LPNETRESOURCE lpNetResBuf, lpnr; - PCHAR pszShareName, pc; - afs_int32 afsRet = 0; - - if ( lana_OnlyLoopback() ) { - // Nothing to do if we only have a loopback interface - return TRUE; - } - - // Determine the root share name (\\AFS\ALL or \\-AFS\ALL), - // and the length of the server name prefix. - pszShareName = smb_GetSharename(); - if (pszShareName == NULL) - { - LogEvent(EVENTLOG_ERROR_TYPE, MSG_FLUSH_NO_SHARE_NAME, NULL); - return FALSE; - } - pc = strrchr(pszShareName, SLASH); - if ((pc == NULL) || ((dwServerSize = pc - pszShareName) < 3)) - { - LogEvent(EVENTLOG_ERROR_TYPE, MSG_FLUSH_BAD_SHARE_NAME, - pszShareName, NULL); - free(pszShareName); - return FALSE; - } - - // Allocate a buffer to hold network resources returned by - // WNetEnumResource(). - lpNetResBuf = malloc(NETRESBUFSIZE); - if (lpNetResBuf == NULL) - { - // Out of memory, give up now. - LogEvent(EVENTLOG_ERROR_TYPE, MSG_FLUSH_NO_MEMORY, NULL); - free(pszShareName); - return FALSE; - } - - // Initialize the flush timer. Note that GetTickCount() returns - // the number of milliseconds since the system started, in a DWORD, - // so that the value wraps around every 49.7 days. We do not bother - // to handle the case where the flush elapsed time is greater than - // that. - dwFlushBegin = GetTickCount(); - - dwRet = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, NULL, - &hEnum); - if (dwRet != NO_ERROR) - { - LogEventMessage(EVENTLOG_ERROR_TYPE, MSG_FLUSH_OPEN_ENUM_ERROR, - dwRet); - free(pszShareName); - return FALSE; - } - - // Loop to enumerate network resources, and flush those associated - // with AFS volumes. - while (1) - { - dwCount = -1; - memset(lpNetResBuf, 0, NETRESBUFSIZE); - dwNetResBufSize = NETRESBUFSIZE; - dwRet = WNetEnumResource(hEnum, &dwCount, - lpNetResBuf, &dwNetResBufSize); - if (dwRet != NO_ERROR) - break; - // Iterate over the returned network resources. - for (i = 0, lpnr = lpNetResBuf; i < dwCount; i++, lpnr++) - { - // Ensure resource has a remote name, and is connected. - if ((lpnr->lpRemoteName == NULL) || - (lpnr->dwScope != RESOURCE_CONNECTED)) - continue; - if ((_strnicmp(lpnr->lpRemoteName, pszShareName, - dwServerSize) == 0) && - (lpnr->lpRemoteName[dwServerSize] == SLASH)) - { - // got one! - // but we don't want to flush '\\[...]afs\all' - if (_stricmp(lpnr->lpRemoteName, pszShareName) == 0) - continue; - ++dwTotalVols; - - dwVolBegin = GetTickCount(); - afsRet = afsd_ServicePerformFlushVolumeCmd(lpnr->lpRemoteName); - dwVolEnd = GetTickCount(); - if (afsRet == 0) - { - LogTimingEvent(MSG_TIME_FLUSH_PER_VOLUME, - lpnr->lpRemoteName, - dwVolEnd - dwVolBegin); - } - else - { - LogEvent(EVENTLOG_WARNING_TYPE, - MSG_FLUSH_FAILED, - lpnr->lpRemoteName, NULL); - } - } - } - } - WNetCloseEnum(hEnum); - free(lpNetResBuf); - free(pszShareName); - if (dwRet != ERROR_NO_MORE_ITEMS) - { - LogEventMessage(EVENTLOG_ERROR_TYPE, MSG_FLUSH_ENUM_ERROR, - dwRet); - return FALSE; - } - - dwFlushEnd = GetTickCount(); - - // display total volume count in Event Logger - sprintf(bufMessage, "%d", dwTotalVols); - LogTimingEvent(MSG_TIME_FLUSH_TOTAL, bufMessage, - dwFlushEnd - dwFlushBegin); - - return TRUE; -} - -// Report a timing event to the system event log. -// The lpszString1 argument is the first substitution string for the -// given event ID. The time argument will be converted into the -// second substitution string. -static VOID -LogTimingEvent(DWORD dwEventID, LPTSTR lpString1, DWORD dwTime) -{ - CHAR szTime[16]; - - sprintf(szTime, "%lu", dwTime); - LogEvent(EVENTLOG_INFORMATION_TYPE, dwEventID, lpString1, szTime, - NULL); -} - - -///////////////////////////////////////////////////////////////////// -// -// GetUserToken -// -// Obtain token for the currently logged-in user. -// -// This routine looks for a window which we 'know' belongs to -// the shell, and from there we follow a route which leads to -// getting a handle on an access token owned by the shell. -// -// The return value is either a handle to a suitable token, -// or else null. -// -// One of the times that this function might return null -// is when there is no logged-in user. Other cases include -// insufficient access to the desktop, etc. -// -// Disclaimer: -// Portions of this routine found in various newsgroups -// -HANDLE GetUserToken(DWORD access) -{ - HANDLE hTok = NULL; - DWORD pid = 0, tid = 0; - - // Try it the easy way first - look for a window owned by the shell on - // our current desktop. If we find one, use that to get the process id. - HWND shell = FindWindowEx(NULL, NULL, "Progman", NULL); - if (shell != NULL) - { - tid = GetWindowThreadProcessId(shell, &pid); - } - - // We are possibly running on a private window station and desktop: we must - // switch to the default (which we suppose is where we will find the - // running shell). - else - { - HWINSTA saveWinSta = GetProcessWindowStation(); - HDESK saveDesk = GetThreadDesktop(GetCurrentThreadId()); - HWINSTA winSta = NULL; - HDESK desk = NULL; - BOOL changeFlag = FALSE; - BOOL dummy = saveWinSta != NULL && - saveDesk != NULL && - (winSta = OpenWindowStation("WinSta0", FALSE, - MAXIMUM_ALLOWED)) != NULL && - (changeFlag = SetProcessWindowStation(winSta)) != 0 && - (desk = OpenDesktop("Default", 0, FALSE, - MAXIMUM_ALLOWED)) != NULL && - SetThreadDesktop(desk) != 0; - - // Now find the window and process on this desktop - shell = FindWindowEx(NULL, NULL, "Progman", NULL); - if (shell != NULL) - { - tid = GetWindowThreadProcessId(shell, &pid); - } - - // Restore our own window station and desktop - if (changeFlag) - { - SetProcessWindowStation(saveWinSta); - SetThreadDesktop(saveDesk); - } - - // Close temporary objects - if (winSta != NULL) - CloseWindowStation(winSta); - if (desk != NULL) - CloseDesktop(desk); - } - - // - // If we have a process id, use that to get the process handle and - // from there the process' access token. - // - if (pid != 0) - { - HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); - if (hProc != NULL) - { - OpenProcessToken(hProc, access, &hTok) || (hTok = NULL); - CloseHandle(hProc); - } - } - - // Return token if we got one - return hTok; -} - -// impersonate logged-on user as client -BOOL -ImpersonateClient() -{ - DWORD dwDesiredAccess = TOKEN_ALL_ACCESS; - HANDLE hUserToken = GetUserToken(dwDesiredAccess); - - if (hUserToken == NULL) - return FALSE; - if (ImpersonateLoggedOnUser(hUserToken) == 0) - { - LogEvent(EVENTLOG_ERROR_TYPE, MSG_FLUSH_IMPERSONATE_ERROR, - NULL); - return FALSE; - } - return TRUE; -} - -///////////////////////////////////////////////////////////////////// -// -// Thread proc -// -DWORD WINAPI -afsd_ServiceFlushVolumesThreadProc(LPVOID lpParam) -{ - FLUSHVOLTHREADINFO ThreadInfo; - PFLUSHVOLTHREADINFO pThreadInfo = (PFLUSHVOLTHREADINFO) lpParam; - HANDLE arHandles[2] = {0}; - DWORD dwWaitState = 0; - - // thread running - get handles - ThreadInfo.hEventPowerEvent = pThreadInfo->hEventPowerEvent; - ThreadInfo.hEventResumeMain = pThreadInfo->hEventResumeMain; - ThreadInfo.hEventTerminate = pThreadInfo->hEventTerminate; - - // setup to wait - arHandles[0] = ThreadInfo.hEventTerminate; - arHandles[1] = ThreadInfo.hEventPowerEvent; - - // do stuff .. - while (1) - { - // wait for an event to happen - dwWaitState = WaitForMultipleObjectsEx(2, arHandles, FALSE, INFINITE, FALSE); - - switch (dwWaitState) - { - case WAIT_OBJECT_0: - // termination signaled - RevertToSelf(); - CheckAndCloseHandle(ThreadInfo.hEventPowerEvent); - CheckAndCloseHandle(ThreadInfo.hEventResumeMain); - CheckAndCloseHandle(ThreadInfo.hEventTerminate); - ExitThread(0); - break; - - case WAIT_OBJECT_0+1: - // Power event - // - flush 'em! - if (ImpersonateClient()) - { - afsd_ServicePerformFlushVolumes(); - } - // acknowledge event - ResetEvent(ThreadInfo.hEventPowerEvent); - break; - - case WAIT_ABANDONED_0: - case WAIT_ABANDONED_0+1: - case WAIT_IO_COMPLETION: - case WAIT_TIMEOUT: - // sno* - LogEvent(EVENTLOG_WARNING_TYPE, - MSG_FLUSH_UNEXPECTED_EVENT, NULL); - break; - - } // end switch - - // signal back to waiting mainline - SetEvent(ThreadInfo.hEventResumeMain); - - } // end while - - // I suppose we never get here - ExitThread(0); -} - -///////////////////////////////////////////////////////////////////// -// -// Mainline thread routines -// - -VOID -CheckAndCloseHandle(HANDLE thisHandle) -{ - if (thisHandle != NULL) - { - CloseHandle(thisHandle); - thisHandle = NULL; - } -} - -// -// Thread Creation -// -BOOL -PowerNotificationThreadCreate() -{ - BOOL bSuccess = FALSE; - DWORD dwThreadId = 0; - char eventName[MAX_PATH]; - - do - { - // create power event notification event - // bManualReset=TRUE, bInitialState=FALSE - gThreadInfo.hEventPowerEvent = CreateEvent(NULL, TRUE, FALSE, - TEXT("afsd_flushvol_EventPowerEvent")); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", eventName); - if (gThreadInfo.hEventPowerEvent == NULL) - break; - - // create mainline resume event - // bManualReset=FALSE, bInitialState=FALSE - gThreadInfo.hEventResumeMain = CreateEvent(NULL, FALSE, FALSE, - TEXT("afsd_flushvol_EventResumeMain")); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", eventName); - if (gThreadInfo.hEventResumeMain == NULL) - break; - - // create thread terminate event - // bManualReset=FALSE, bInitialState=FALSE - gThreadInfo.hEventTerminate = CreateEvent(NULL, FALSE, FALSE, - TEXT("afsd_flushvol_EventTerminate")); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", eventName); - if (gThreadInfo.hEventTerminate == NULL) - break; - - // good so far - create thread - gThreadHandle = CreateThread(NULL, 0, - afsd_ServiceFlushVolumesThreadProc, - (LPVOID) &gThreadInfo, - 0, &dwThreadId); - - if (!gThreadHandle) - break; - - bSuccess = TRUE; - - } while (0); - - - if (!bSuccess) - { - CheckAndCloseHandle(gThreadInfo.hEventPowerEvent); - CheckAndCloseHandle(gThreadInfo.hEventResumeMain); - CheckAndCloseHandle(gThreadInfo.hEventTerminate); - CheckAndCloseHandle(gThreadHandle); - } - - return bSuccess; -} - -// -// Thread Notification -// -BOOL -PowerNotificationThreadNotify() -{ - DWORD dwRet = 0; - BOOL bRet = FALSE; - - // Notify thread of power event, and wait for the HardDead timeout period - dwRet = SignalObjectAndWait( - gThreadInfo.hEventPowerEvent, // object to signal - gThreadInfo.hEventResumeMain, // object to watch - HardDeadtimeout*1000, // timeout (ms) - FALSE // alertable - ); - - if (dwRet == WAIT_OBJECT_0) - bRet = TRUE; - - return bRet; -} - -// -// Thread Termination -// -VOID -PowerNotificationThreadExit() -{ - // ExitThread - if (gThreadHandle) - { - SetEvent(gThreadInfo.hEventTerminate); - WaitForSingleObject(gThreadHandle, INFINITE); - CloseHandle(gThreadHandle); - } -} - diff --git a/src/WINNT/afsd/afsd_flushvol.h b/src/WINNT/afsd/afsd_flushvol.h deleted file mode 100644 index ca632612b..000000000 --- a/src/WINNT/afsd/afsd_flushvol.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// AFSD_FLUSHVOL.H -// -// Include file for routines that handle flushing AFS volumes -// in response to System Power event notification such as -// Hibernate request. -// -///////////////////////////////////////////////////////////////////// - -#ifndef _AFSD_FLUSHVOL_H_ -#define _AFSD_FLUSHVOL_H_ - -#include -#include "fs_utils.h" - -// handles -typedef struct _tagFLUSHVOLTHREADINFO { - HANDLE hEventPowerEvent; - HANDLE hEventResumeMain; - HANDLE hEventTerminate; -} FLUSHVOLTHREADINFO, *PFLUSHVOLTHREADINFO; - -// invokes fs.exe pioctl -static afs_int32 afsd_ServicePerformFlushVolumeCmd(char *data); - -// thread callback -static DWORD WINAPI afsd_ServiceFlushVolumesThreadProc(LPVOID lpParameter); - -// helper function -static VOID CheckAndCloseHandle(HANDLE thisHandle); - -// thread construction/notification/destruction -BOOL PowerNotificationThreadCreate(VOID); -BOOL PowerNotificationThreadNotify(VOID); -VOID PowerNotificationThreadExit(VOID); - -// impersonation helper(s) -static HANDLE GetUserToken(DWORD access); -static BOOL ImpersonateClient(void); - -// event logging -static VOID LogTimingEvent(DWORD dwEventID, LPTSTR lpString1, DWORD dwTime); - -#endif // _AFSD_FLUSHVOL_H_ - diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c deleted file mode 100644 index 94d68e85f..000000000 --- a/src/WINNT/afsd/afsd_init.c +++ /dev/null @@ -1,1465 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "afsd.h" -#include -#include -#include -#include - -#include "smb.h" -#include "cm_rpc.h" -#include "lanahelper.h" -#include -#include "afsicf.h" -#include "cm_memmap.h" - -extern int RXAFSCB_ExecuteRequest(struct rx_call *z_call); -extern int RXSTATS_ExecuteRequest(struct rx_call *z_call); - -extern afs_int32 cryptall; - -osi_log_t *afsd_logp; - -cm_config_data_t cm_data; - -char cm_rootVolumeName[VL_MAXNAMELEN]; -DWORD cm_rootVolumeNameLen; -char cm_mountRoot[1024]; -DWORD cm_mountRootLen; -int cm_logChunkSize; -int cm_chunkSize; -#ifdef AFS_FREELANCE_CLIENT -char *cm_FakeRootDir; -#endif /* freelance */ - -int smb_UseV3 = 1; - -int LANadapter; - -int numBkgD; -int numSvThreads; -long rx_mtu = -1; -int traceOnPanic = 0; - -int logReady = 0; - -char cm_HostName[200]; -long cm_HostAddr; - -char cm_NetbiosName[MAX_NB_NAME_LENGTH] = ""; - -char cm_CachePath[MAX_PATH]; -DWORD cm_CachePathLen; -DWORD cm_ValidateCache = 1; - -BOOL isGateway = FALSE; - -BOOL reportSessionStartups = FALSE; - -cm_initparams_v1 cm_initParams; - -char *cm_sysName = 0; -unsigned int cm_sysNameCount = 0; -char *cm_sysNameList[MAXNUMSYSNAMES]; - -DWORD TraceOption = 0; - -/* - * AFSD Initialization Log - * - * This is distinct from the regular debug logging facility. - * Log items go directly to a file, not to an array in memory, so that even - * if AFSD crashes, the log can be inspected. - */ - -HANDLE afsi_file; - -#ifdef AFS_AFSDB_ENV -int cm_dnsEnabled = 1; -#endif - - -static int afsi_log_useTimestamp = 1; - -void -afsi_log(char *pattern, ...) -{ - char s[256], t[100], d[100], u[512]; - DWORD zilch; - va_list ap; - va_start(ap, pattern); - - StringCbVPrintfA(s, sizeof(s), pattern, ap); - if ( afsi_log_useTimestamp ) { - GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, t, sizeof(t)); - GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, d, sizeof(d)); - StringCbPrintfA(u, sizeof(u), "%s %s: %s\n", d, t, s); - if (afsi_file != INVALID_HANDLE_VALUE) - WriteFile(afsi_file, u, strlen(u), &zilch, NULL); -#ifdef NOTSERVICE - printf("%s", u); -#endif - } else { - if (afsi_file != INVALID_HANDLE_VALUE) - WriteFile(afsi_file, s, strlen(s), &zilch, NULL); - } -} - -extern initUpperCaseTable(); -void afsd_initUpperCaseTable() -{ - initUpperCaseTable(); -} - -void -afsi_start() -{ - char wd[100]; - char t[100], u[100], *p, *path; - int zilch; - int code; - DWORD dwLow, dwHigh; - HKEY parmKey; - DWORD dummyLen; - DWORD maxLogSize = 100 * 1024; - - afsi_file = INVALID_HANDLE_VALUE; - if (getenv("TEMP")) - { - StringCbCopyA(wd, sizeof(wd), getenv("TEMP")); - } - else - { - code = GetWindowsDirectory(wd, sizeof(wd)); - if (code == 0) - return; - } - StringCbCatA(wd, sizeof(wd), "\\afsd_init.log"); - GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, t, sizeof(t)); - afsi_file = CreateFile(wd, GENERIC_WRITE, FILE_SHARE_READ, NULL, - OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL); - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - dummyLen = sizeof(maxLogSize); - code = RegQueryValueEx(parmKey, "MaxLogSize", NULL, NULL, - (BYTE *) &maxLogSize, &dummyLen); - RegCloseKey (parmKey); - } - - if (maxLogSize) { - dwLow = GetFileSize( afsi_file, &dwHigh ); - if ( dwHigh > 0 || dwLow >= maxLogSize ) { - CloseHandle(afsi_file); - afsi_file = CreateFile( wd, GENERIC_WRITE, FILE_SHARE_READ, NULL, - CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL); - } - } - - SetFilePointer(afsi_file, 0, NULL, FILE_END); - GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, u, sizeof(u)); - StringCbCatA(t, sizeof(t), ": Create log file\n"); - StringCbCatA(u, sizeof(u), ": Created log file\n"); - WriteFile(afsi_file, t, strlen(t), &zilch, NULL); - WriteFile(afsi_file, u, strlen(u), &zilch, NULL); - p = "PATH="; - path = getenv("PATH"); - WriteFile(afsi_file, p, strlen(p), &zilch, NULL); - WriteFile(afsi_file, path, strlen(path), &zilch, NULL); - WriteFile(afsi_file, "\n", 1, &zilch, NULL); - - /* Initialize C RTL Code Page conversion functions */ - /* All of the path info obtained from the SMB client is in the OEM code page */ - afsi_log("OEM Code Page = %d", GetOEMCP()); - afsi_log("locale = %s", setlocale(LC_ALL,NULL)); -#ifdef COMMENT - /* Two things to look into. First, should mbstowcs() be performing - * character set translations from OEM to Unicode in smb3.c; - * Second, do we need to set this translation in each function - * due to multi-threading. - */ - afsi_log("locale -> %s", setlocale(LC_ALL, ".OCP")); - afsi_log("_setmbcp = %d -> %d", _setmbcp(_MB_CP_OEM), _getmbcp()); -#endif /* COMMENT */ -} - -/* - * Standard AFSD trace - */ - -void afsd_ForceTrace(BOOL flush) -{ - HANDLE handle; - int len; - char buf[256]; - - if (!logReady) - return; - - len = GetTempPath(sizeof(buf)-10, buf); - StringCbCopyA(&buf[len], sizeof(buf)-len, "/afsd.log"); - handle = CreateFile(buf, GENERIC_WRITE, FILE_SHARE_READ, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (handle == INVALID_HANDLE_VALUE) { - logReady = 0; - osi_panic("Cannot create log file", __FILE__, __LINE__); - } - osi_LogPrint(afsd_logp, handle); - if (flush) - FlushFileBuffers(handle); - CloseHandle(handle); -} - -static void -configureBackConnectionHostNames(void) -{ - /* On Windows XP SP2, Windows 2003 SP1, and all future Windows operating systems - * there is a restriction on the use of SMB authentication on loopback connections. - * There are two work arounds available: - * - * (1) We can disable the check for matching host names. This does not - * require a reboot: - * [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] - * "DisableLoopbackCheck"=dword:00000001 - * - * (2) We can add the AFS SMB/CIFS service name to an approved list. This - * does require a reboot: - * [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0] - * "BackConnectionHostNames"=multi-sz - * - * The algorithm will be: - * (1) Check to see if cm_NetbiosName exists in the BackConnectionHostNames list - * (2a) If not, add it to the list. (This will not take effect until the next reboot.) - * (2b1) and check to see if DisableLoopbackCheck is set. - * (2b2) If not set, set the DisableLoopbackCheck value to 0x1 - * (2b3) and create HKLM\SOFTWARE\OpenAFS\Client UnsetDisableLoopbackCheck - * (2c) else If cm_NetbiosName exists in the BackConnectionHostNames list, - * check for the UnsetDisableLoopbackCheck value. - * If set, set the DisableLoopbackCheck flag to 0x0 - * and delete the UnsetDisableLoopbackCheck value - * - * Starting in Longhorn Beta 1, an entry in the BackConnectionHostNames value will - * force Windows to use the loopback authentication mechanism for the specified - * services. - */ - HKEY hkLsa; - HKEY hkMSV10; - HKEY hkClient; - DWORD dwType; - DWORD dwSize; - DWORD dwValue; - PBYTE pHostNames = NULL, pName = NULL; - BOOL bNameFound = FALSE; - - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, - "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0", - 0, - KEY_READ|KEY_WRITE, - &hkMSV10) == ERROR_SUCCESS ) - { - if (RegQueryValueEx( hkMSV10, "BackConnectionHostNames", 0, &dwType, NULL, &dwSize) == ERROR_SUCCESS) { - pHostNames = malloc(dwSize + strlen(cm_NetbiosName) + 1); - RegQueryValueEx( hkMSV10, "BackConnectionHostNames", 0, &dwType, pHostNames, &dwSize); - - for (pName = pHostNames; *pName ; pName += strlen(pName) + 1) - { - if ( !stricmp(pName, cm_NetbiosName) ) { - bNameFound = TRUE; - break; - } - } - } - - if ( !bNameFound ) { - int size = strlen(cm_NetbiosName) + 2; - if ( !pHostNames ) { - pHostNames = malloc(size); - dwSize = 1; - } - pName = pHostNames; - StringCbCopyA(pName, size, cm_NetbiosName); - pName += size - 1; - *pName = '\0'; /* add a second nul terminator */ - - dwType = REG_MULTI_SZ; - dwSize += strlen(cm_NetbiosName) + 1; - RegSetValueEx( hkMSV10, "BackConnectionHostNames", 0, dwType, pHostNames, dwSize); - - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, - "SYSTEM\\CurrentControlSet\\Control\\Lsa", - 0, - KEY_READ|KEY_WRITE, - &hkLsa) == ERROR_SUCCESS ) - { - dwSize = sizeof(DWORD); - if ( RegQueryValueEx( hkLsa, "DisableLoopbackCheck", 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS || - dwValue == 0 ) { - dwType = REG_DWORD; - dwSize = sizeof(DWORD); - dwValue = 1; - RegSetValueEx( hkLsa, "DisableLoopbackCheck", 0, dwType, (LPBYTE)&dwValue, dwSize); - - if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE, - NULL, - &hkClient, - NULL) == ERROR_SUCCESS) { - - dwType = REG_DWORD; - dwSize = sizeof(DWORD); - dwValue = 1; - RegSetValueEx( hkClient, "RemoveDisableLoopbackCheck", 0, dwType, (LPBYTE)&dwValue, dwSize); - RegCloseKey(hkClient); - } - RegCloseKey(hkLsa); - } - } - } else { - if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE, - NULL, - &hkClient, - NULL) == ERROR_SUCCESS) { - - dwSize = sizeof(DWORD); - if ( RegQueryValueEx( hkClient, "RemoveDisableLoopbackCheck", 0, &dwType, (LPBYTE)&dwValue, &dwSize) == ERROR_SUCCESS && - dwValue == 1 ) { - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, - "SYSTEM\\CurrentControlSet\\Control\\Lsa", - 0, - KEY_READ|KEY_WRITE, - &hkLsa) == ERROR_SUCCESS ) - { - RegDeleteValue(hkLsa, "DisableLoopbackCheck"); - RegCloseKey(hkLsa); - } - } - RegDeleteValue(hkClient, "RemoveDisableLoopbackCheck"); - RegCloseKey(hkClient); - } - } - RegCloseKey(hkMSV10); - } -} - -#if !defined(DJGPP) -static void afsd_InitServerPreferences(void) -{ - HKEY hkPrefs = 0; - DWORD dwType, dwSize; - DWORD dwPrefs = 0; - DWORD dwIndex; - TCHAR szHost[256]; - DWORD dwHostSize = 256; - DWORD dwRank; - struct sockaddr_in saddr; - cm_server_t *tsp; - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Server Preferences\\VLDB", - 0, - KEY_READ|KEY_QUERY_VALUE, - &hkPrefs) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkPrefs, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwPrefs, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( dwIndex = 0 ; dwIndex < dwPrefs; dwIndex++ ) { - - dwSize = sizeof(DWORD); - dwHostSize = 256; - - if (RegEnumValue( hkPrefs, dwIndex, szHost, &dwHostSize, NULL, - &dwType, (LPBYTE)&dwRank, &dwSize)) - { - afsi_log("RegEnumValue(hkPrefs) failed"); - continue; - } - - afsi_log("VLDB Server Preference: %s = %d",szHost, dwRank); - - if (isdigit(szHost[0])) - { - if ((saddr.sin_addr.S_un.S_addr = inet_addr (szHost)) == INADDR_NONE) - continue; - } else { - HOSTENT *pEntry; - if ((pEntry = gethostbyname (szHost)) == NULL) - continue; - - saddr.sin_addr.S_un.S_addr = *(unsigned long *)pEntry->h_addr; - } - saddr.sin_family = AF_INET; - dwRank += (rand() & 0x000f); - - tsp = cm_FindServer(&saddr, CM_SERVER_VLDB); - if ( tsp ) /* an existing server - ref count increased */ - { - tsp->ipRank = (USHORT)dwRank; /* no need to protect by mutex*/ - - /* set preferences for an existing vlserver */ - cm_ChangeRankCellVLServer(tsp); - cm_PutServer(tsp); /* decrease refcount */ - } - else /* add a new server without a cell */ - { - tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL); /* refcount = 1 */ - tsp->ipRank = (USHORT)dwRank; - } - } - - RegCloseKey(hkPrefs); - } - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Server Preferences\\File", - 0, - KEY_READ|KEY_QUERY_VALUE, - &hkPrefs) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkPrefs, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwPrefs, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( dwIndex = 0 ; dwIndex < dwPrefs; dwIndex++ ) { - - dwSize = sizeof(DWORD); - dwHostSize = 256; - - if (RegEnumValue( hkPrefs, dwIndex, szHost, &dwHostSize, NULL, - &dwType, (LPBYTE)&dwRank, &dwSize)) - { - afsi_log("RegEnumValue(hkPrefs) failed"); - continue; - } - - afsi_log("File Server Preference: %s = %d",szHost, dwRank); - - if (isdigit(szHost[0])) - { - if ((saddr.sin_addr.S_un.S_addr = inet_addr (szHost)) == INADDR_NONE) - continue; - } else { - HOSTENT *pEntry; - if ((pEntry = gethostbyname (szHost)) == NULL) - continue; - - saddr.sin_addr.S_un.S_addr = *(unsigned long *)pEntry->h_addr; - } - saddr.sin_family = AF_INET; - dwRank += (rand() & 0x000f); - - tsp = cm_FindServer(&saddr, CM_SERVER_FILE); - if ( tsp ) /* an existing server - ref count increased */ - { - tsp->ipRank = (USHORT)dwRank; /* no need to protect by mutex*/ - - /* find volumes which might have RO copy - /* on server and change the ordering of - * their RO list - */ - cm_ChangeRankVolume(tsp); - cm_PutServer(tsp); /* decrease refcount */ - } - else /* add a new server without a cell */ - { - tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL); /* refcount = 1 */ - tsp->ipRank = (USHORT)dwRank; - } - } - - RegCloseKey(hkPrefs); - } -} -#endif /* DJGPP */ - -/* - * AFSD Initialization - */ - -int afsd_InitCM(char **reasonP) -{ - osi_uid_t debugID; - DWORD cacheBlocks; - DWORD cacheSize; - long logChunkSize; - DWORD stats; - long traceBufSize; - long maxcpus; - long ltt, ltto; - long rx_nojumbo; - long virtualCache = 0; - char rootCellName[256]; - struct rx_service *serverp; - static struct rx_securityClass *nullServerSecurityClassp; - struct hostent *thp; - char *msgBuf; - char buf[1024]; - HKEY parmKey; - DWORD dummyLen; - DWORD regType; - long code; - /*int freelanceEnabled;*/ - WSADATA WSAjunk; - lana_number_t lanaNum; - int i; - char *p, *q; - int cm_noIPAddr; /* number of client network interfaces */ - int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */ - int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/ - int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */ - int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */ - - WSAStartup(0x0101, &WSAjunk); - - afsd_initUpperCaseTable(); - - /* setup osidebug server at RPC slot 1000 */ - osi_LongToUID(1000, &debugID); - code = osi_InitDebug(&debugID); - afsi_log("osi_InitDebug code %d", code); - - // osi_LockTypeSetDefault("stat"); /* comment this out for speed * - if (code != 0) { - *reasonP = "unknown error"; - return -1; - } - - /* who are we ? */ - gethostname(cm_HostName, sizeof(cm_HostName)); - afsi_log("gethostname %s", cm_HostName); - thp = gethostbyname(cm_HostName); - memcpy(&cm_HostAddr, thp->h_addr_list[0], 4); - - /* seed random number generator */ - srand(ntohl(cm_HostAddr)); - - /* Look up configuration parameters in Registry */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code != ERROR_SUCCESS) { - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_ALLOCATE_BUFFER, - NULL, code, 0, (LPTSTR)&msgBuf, 0, NULL); - StringCbPrintfA(buf, sizeof(buf), - "Failure in configuration while opening Registry: %s", - msgBuf); - osi_panic(buf, __FILE__, __LINE__); - } - - dummyLen = sizeof(maxcpus); - code = RegQueryValueEx(parmKey, "MaxCPUs", NULL, NULL, - (BYTE *) &maxcpus, &dummyLen); - if (code == ERROR_SUCCESS) { - HANDLE hProcess; - DWORD_PTR processAffinityMask, systemAffinityMask; - - hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_SET_INFORMATION, - FALSE, GetCurrentProcessId()); - if ( hProcess != NULL && - GetProcessAffinityMask(hProcess, &processAffinityMask, &systemAffinityMask) ) - { - int i, n, bits; - DWORD_PTR mask, newAffinityMask; - -#if defined(_WIN64) - bits = 64; -#else - bits = 32; -#endif - for ( i=0, n=0, mask=1, newAffinityMask=0; i 30) { - afsi_log("Invalid chunk size %d, using default", - logChunkSize); - logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE; - } - afsi_log("Chunk size %d", logChunkSize); - } else { - logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE; - afsi_log("Default chunk size %d", logChunkSize); - } - cm_logChunkSize = logChunkSize; - cm_chunkSize = 1 << logChunkSize; - - dummyLen = sizeof(numBkgD); - code = RegQueryValueEx(parmKey, "Daemons", NULL, NULL, - (BYTE *) &numBkgD, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("%d background daemons", numBkgD); - else { - numBkgD = CM_CONFIGDEFAULT_DAEMONS; - afsi_log("Defaulting to %d background daemons", numBkgD); - } - - dummyLen = sizeof(numSvThreads); - code = RegQueryValueEx(parmKey, "ServerThreads", NULL, NULL, - (BYTE *) &numSvThreads, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("%d server threads", numSvThreads); - else { - numSvThreads = CM_CONFIGDEFAULT_SVTHREADS; - afsi_log("Defaulting to %d server threads", numSvThreads); - } - - dummyLen = sizeof(stats); - code = RegQueryValueEx(parmKey, "Stats", NULL, NULL, - (BYTE *) &stats, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("Status cache size %d", stats); - else { - stats = CM_CONFIGDEFAULT_STATS; - afsi_log("Default status cache size %d", stats); - } - - dummyLen = sizeof(ltt); - code = RegQueryValueEx(parmKey, "LogoffTokenTransfer", NULL, NULL, - (BYTE *) <t, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("Logoff token transfer %s", (ltt ? "on" : "off")); - else { - ltt = 1; - afsi_log("Logoff token transfer on by default"); - } - smb_LogoffTokenTransfer = ltt; - afsi_log("Logoff token transfer is currently ignored"); - - if (ltt) { - dummyLen = sizeof(ltto); - code = RegQueryValueEx(parmKey, "LogoffTokenTransferTimeout", - NULL, NULL, (BYTE *) <to, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("Logoff token tranfer timeout %d seconds", ltto); - else { - ltto = 10; - afsi_log("Default logoff token transfer timeout 10 seconds"); - } - } else { - ltto = 0; - } - smb_LogoffTransferTimeout = ltto; - afsi_log("Default logoff token is currently ignored"); - - dummyLen = sizeof(cm_rootVolumeName); - code = RegQueryValueEx(parmKey, "RootVolume", NULL, NULL, - cm_rootVolumeName, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("Root volume %s", cm_rootVolumeName); - else { - StringCbCopyA(cm_rootVolumeName, sizeof(cm_rootVolumeName), "root.afs"); - afsi_log("Default root volume name root.afs"); - } - - cm_mountRootLen = sizeof(cm_mountRoot); - code = RegQueryValueEx(parmKey, "MountRoot", NULL, NULL, - cm_mountRoot, &cm_mountRootLen); - if (code == ERROR_SUCCESS) { - afsi_log("Mount root %s", cm_mountRoot); - cm_mountRootLen = strlen(cm_mountRoot); - } else { - StringCbCopyA(cm_mountRoot, sizeof(cm_mountRoot), "/afs"); - cm_mountRootLen = 4; - /* Don't log */ - } - - dummyLen = sizeof(buf); - code = RegQueryValueEx(parmKey, "CachePath", NULL, ®Type, - buf, &dummyLen); - if (code == ERROR_SUCCESS && buf[0]) { - if (regType == REG_EXPAND_SZ) { - dummyLen = ExpandEnvironmentStrings(buf, cm_CachePath, sizeof(cm_CachePath)); - if (dummyLen > sizeof(cm_CachePath)) { - afsi_log("Cache path [%s] longer than %d after expanding env strings", buf, sizeof(cm_CachePath)); - osi_panic("CachePath too long", __FILE__, __LINE__); - } - } else { - StringCbCopyA(cm_CachePath, sizeof(cm_CachePath), buf); - } - afsi_log("Cache path %s", cm_CachePath); - } else { - dummyLen = ExpandEnvironmentStrings("%TEMP%\\AFSCache", cm_CachePath, sizeof(cm_CachePath)); - if (dummyLen > sizeof(cm_CachePath)) { - afsi_log("Cache path [%%TEMP%%\\AFSCache] longer than %d after expanding env strings", - sizeof(cm_CachePath)); - osi_panic("CachePath too long", __FILE__, __LINE__); - } - afsi_log("Default cache path %s", cm_CachePath); - } - - dummyLen = sizeof(virtualCache); - code = RegQueryValueEx(parmKey, "NonPersistentCaching", NULL, NULL, - (LPBYTE)&virtualCache, &dummyLen); - afsi_log("Cache type is %s", (virtualCache?"VIRTUAL":"FILE")); - - if (!virtualCache) { - dummyLen = sizeof(cm_ValidateCache); - code = RegQueryValueEx(parmKey, "ValidateCache", NULL, NULL, - (LPBYTE)&cm_ValidateCache, &dummyLen); - if ( cm_ValidateCache < 0 || cm_ValidateCache > 2 ) - cm_ValidateCache = 1; - switch (cm_ValidateCache) { - case 0: - afsi_log("Cache Validation disabled"); - break; - case 1: - afsi_log("Cache Validation on Startup"); - break; - case 2: - afsi_log("Cache Validation on Startup and Shutdown"); - break; - } - } - - dummyLen = sizeof(traceOnPanic); - code = RegQueryValueEx(parmKey, "TrapOnPanic", NULL, NULL, - (BYTE *) &traceOnPanic, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("Set to %s on panic", - traceOnPanic ? "trap" : "not trap"); - else { - traceOnPanic = 0; - /* Don't log */ - } - - dummyLen = sizeof(reportSessionStartups); - code = RegQueryValueEx(parmKey, "ReportSessionStartups", NULL, NULL, - (BYTE *) &reportSessionStartups, &dummyLen); - if (code == ERROR_SUCCESS) - afsi_log("Session startups %s be recorded in the Event Log", - reportSessionStartups ? "will" : "will not"); - else { - reportSessionStartups = 0; - /* Don't log */ - } - - for ( i=0; i < MAXNUMSYSNAMES; i++ ) { - cm_sysNameList[i] = osi_Alloc(MAXSYSNAME); - cm_sysNameList[i][0] = '\0'; - } - cm_sysName = cm_sysNameList[0]; - - dummyLen = sizeof(buf); - code = RegQueryValueEx(parmKey, "SysName", NULL, NULL, buf, &dummyLen); - if (code != ERROR_SUCCESS || !buf[0]) { -#if defined(_IA64_) - StringCbCopyA(buf, sizeof(buf), "ia64_win64"); -#elif defined(_AMD64) - StringCbCopyA(buf, sizeof(buf), "amd64_win64"); -#else /* assume x86 32-bit */ - StringCbCopyA(buf, sizeof(buf), "x86_win32 i386_w2k i386_nt40"); -#endif - } - afsi_log("Sys name %s", buf); - - /* breakup buf into individual search string entries */ - for (p = q = buf; p < buf + dummyLen; p++) - { - if (*p == '\0' || isspace(*p)) { - memcpy(cm_sysNameList[cm_sysNameCount],q,p-q); - cm_sysNameList[cm_sysNameCount][p-q] = '\0'; - cm_sysNameCount++; - - do { - if (*p == '\0') - goto done_sysname; - p++; - } while (*p == '\0' || isspace(*p)); - q = p; - p--; - } - } - done_sysname: - StringCbCopyA(cm_sysName, MAXSYSNAME, cm_sysNameList[0]); - - dummyLen = sizeof(cryptall); - code = RegQueryValueEx(parmKey, "SecurityLevel", NULL, NULL, - (BYTE *) &cryptall, &dummyLen); - if (code == ERROR_SUCCESS) { - afsi_log("SecurityLevel is %s", cryptall?"crypt":"clear"); - } else { - cryptall = 0; - afsi_log("Default SecurityLevel is clear"); - } - -#ifdef AFS_AFSDB_ENV - dummyLen = sizeof(cm_dnsEnabled); - code = RegQueryValueEx(parmKey, "UseDNS", NULL, NULL, - (BYTE *) &cm_dnsEnabled, &dummyLen); - if (code == ERROR_SUCCESS) { - afsi_log("DNS %s be used to find AFS cell servers", - cm_dnsEnabled ? "will" : "will not"); - } - else { - cm_dnsEnabled = 1; /* default on */ - afsi_log("Default to use DNS to find AFS cell servers"); - } -#else /* AFS_AFSDB_ENV */ - afsi_log("AFS not built with DNS support to find AFS cell servers"); -#endif /* AFS_AFSDB_ENV */ - -#ifdef AFS_FREELANCE_CLIENT - dummyLen = sizeof(cm_freelanceEnabled); - code = RegQueryValueEx(parmKey, "FreelanceClient", NULL, NULL, - (BYTE *) &cm_freelanceEnabled, &dummyLen); - if (code == ERROR_SUCCESS) { - afsi_log("Freelance client feature %s activated", - cm_freelanceEnabled ? "is" : "is not"); - } - else { - cm_freelanceEnabled = 0; /* default off */ - } -#endif /* AFS_FREELANCE_CLIENT */ - -#ifdef COMMENT - /* The netbios name is looked up in lana_GetUNCServerNameEx */ - dummyLen = sizeof(buf); - code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL, - (BYTE *) &buf, &dummyLen); - if (code == ERROR_SUCCESS) { - DWORD len = ExpandEnvironmentStrings(buf, cm_NetbiosName, MAX_NB_NAME_LENGTH); - if ( len > 0 && len <= MAX_NB_NAME_LENGTH ) { - afsi_log("Explicit NetBios name is used %s", cm_NetbiosName); - } else { - afsi_log("Unable to Expand Explicit NetBios name: %s", buf); - cm_NetbiosName[0] = 0; /* turn it off */ - } - } - else { - cm_NetbiosName[0] = 0; /* default off */ - } -#endif - - dummyLen = sizeof(smb_hideDotFiles); - code = RegQueryValueEx(parmKey, "HideDotFiles", NULL, NULL, - (BYTE *) &smb_hideDotFiles, &dummyLen); - if (code != ERROR_SUCCESS) { - smb_hideDotFiles = 1; /* default on */ - } - afsi_log("Dot files/dirs will %sbe marked hidden", - smb_hideDotFiles ? "" : "not "); - - dummyLen = sizeof(smb_maxMpxRequests); - code = RegQueryValueEx(parmKey, "MaxMpxRequests", NULL, NULL, - (BYTE *) &smb_maxMpxRequests, &dummyLen); - if (code != ERROR_SUCCESS) { - smb_maxMpxRequests = 50; - } - afsi_log("Maximum number of multiplexed sessions is %d", smb_maxMpxRequests); - - dummyLen = sizeof(smb_maxVCPerServer); - code = RegQueryValueEx(parmKey, "MaxVCPerServer", NULL, NULL, - (BYTE *) &smb_maxVCPerServer, &dummyLen); - if (code != ERROR_SUCCESS) { - smb_maxVCPerServer = 100; - } - afsi_log("Maximum number of VCs per server is %d", smb_maxVCPerServer); - - dummyLen = sizeof(smb_authType); - code = RegQueryValueEx(parmKey, "SMBAuthType", NULL, NULL, - (BYTE *) &smb_authType, &dummyLen); - - if (code != ERROR_SUCCESS || - (smb_authType != SMB_AUTH_EXTENDED && smb_authType != SMB_AUTH_NTLM && smb_authType != SMB_AUTH_NONE)) { - smb_authType = SMB_AUTH_EXTENDED; /* default is to use extended authentication */ - } - afsi_log("SMB authentication type is %s", ((smb_authType == SMB_AUTH_NONE)?"NONE":((smb_authType == SMB_AUTH_EXTENDED)?"EXTENDED":"NTLM"))); - - dummyLen = sizeof(rx_nojumbo); - code = RegQueryValueEx(parmKey, "RxNoJumbo", NULL, NULL, - (BYTE *) &rx_nojumbo, &dummyLen); - if (code != ERROR_SUCCESS) { - rx_nojumbo = 0; - } - if (rx_nojumbo) - afsi_log("RX Jumbograms are disabled"); - - dummyLen = sizeof(rx_mtu); - code = RegQueryValueEx(parmKey, "RxMaxMTU", NULL, NULL, - (BYTE *) &rx_mtu, &dummyLen); - if (code != ERROR_SUCCESS || !rx_mtu) { - rx_mtu = -1; - } - if (rx_mtu != -1) - afsi_log("RX maximum MTU is %d", rx_mtu); - - dummyLen = sizeof(ConnDeadtimeout); - code = RegQueryValueEx(parmKey, "ConnDeadTimeout", NULL, NULL, - (BYTE *) &ConnDeadtimeout, &dummyLen); - afsi_log("ConnDeadTimeout is %d", ConnDeadtimeout); - - dummyLen = sizeof(HardDeadtimeout); - code = RegQueryValueEx(parmKey, "HardDeadTimeout", NULL, NULL, - (BYTE *) &HardDeadtimeout, &dummyLen); - afsi_log("HardDeadTimeout is %d", HardDeadtimeout); - - RegCloseKey (parmKey); - - /* Call lanahelper to get Netbios name, lan adapter number and gateway flag */ - if (SUCCEEDED(code = lana_GetUncServerNameEx(cm_NetbiosName, &lanaNum, &isGateway, LANA_NETBIOS_NAME_FULL))) { - LANadapter = (lanaNum == LANA_INVALID)? -1: lanaNum; - - if (LANadapter != -1) - afsi_log("LAN adapter number %d", LANadapter); - else - afsi_log("LAN adapter number not determined"); - - if (isGateway) - afsi_log("Set for gateway service"); - - afsi_log("Using >%s< as SMB server name", cm_NetbiosName); - } else { - /* something went horribly wrong. We can't proceed without a netbios name */ - StringCbPrintfA(buf,sizeof(buf),"Netbios name could not be determined: %li", code); - osi_panic(buf, __FILE__, __LINE__); - } - - cacheBlocks = (cacheSize * 1024) / CM_CONFIGDEFAULT_BLOCKSIZE; - - /* get network related info */ - cm_noIPAddr = CM_MAXINTERFACE_ADDR; - code = syscfg_GetIFInfo(&cm_noIPAddr, - cm_IPAddr, cm_SubnetMask, - cm_NetMtu, cm_NetFlags); - - if ( (cm_noIPAddr <= 0) || (code <= 0 ) ) - afsi_log("syscfg_GetIFInfo error code %d", code); - else - afsi_log("First Network address %x SubnetMask %x", - cm_IPAddr[0], cm_SubnetMask[0]); - - /* - * Save client configuration for GetCacheConfig requests - */ - cm_initParams.nChunkFiles = 0; - cm_initParams.nStatCaches = stats; - cm_initParams.nDataCaches = cacheBlocks; - cm_initParams.nVolumeCaches = stats/2; - cm_initParams.firstChunkSize = cm_chunkSize; - cm_initParams.otherChunkSize = cm_chunkSize; - cm_initParams.cacheSize = cacheSize; - cm_initParams.setTime = 0; - cm_initParams.memCache = 1; - - /* Set RX parameters before initializing RX */ - if ( rx_nojumbo ) { - rx_SetNoJumbo(); - afsi_log("rx_SetNoJumbo successful"); - } - - if ( rx_mtu != -1 ) { - rx_SetMaxMTU(rx_mtu); - afsi_log("rx_SetMaxMTU %d successful", rx_mtu); - } - - /* Open Microsoft Firewall to allow in port 7001 */ - icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT); - - /* Ensure the AFS Netbios Name is registered to allow loopback access */ - configureBackConnectionHostNames(); - - /* init user daemon, and other packages */ - cm_InitUser(); - - cm_InitConn(); - - cm_InitServer(); - - cm_InitIoctl(); - - smb_InitIoctl(); - - cm_InitCallback(); - - code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, cm_chunkSize, cacheBlocks); - afsi_log("cm_InitMappedMemory code %x", code); - if (code != 0) { - *reasonP = "error initializing cache file"; - return -1; - } - -#ifdef AFS_AFSDB_ENV -#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) - if (cm_InitDNS(cm_dnsEnabled) == -1) - cm_dnsEnabled = 0; /* init failed, so deactivate */ - afsi_log("cm_InitDNS %d", cm_dnsEnabled); -#endif -#endif - - /* initialize RX, and tell it to listen to port 7001, which is used for - * callback RPC messages. - */ - code = rx_Init(htons(7001)); - afsi_log("rx_Init code %x", code); - if (code != 0) { - *reasonP = "afsd: failed to init rx client on port 7001"; - return -1; - } - - /* create an unauthenticated service #1 for callbacks */ - nullServerSecurityClassp = rxnull_NewServerSecurityObject(); - serverp = rx_NewService(0, 1, "AFS", &nullServerSecurityClassp, 1, - RXAFSCB_ExecuteRequest); - afsi_log("rx_NewService addr %x", (int)serverp); - if (serverp == NULL) { - *reasonP = "unknown error"; - return -1; - } - - nullServerSecurityClassp = rxnull_NewServerSecurityObject(); - serverp = rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", - &nullServerSecurityClassp, 1, RXSTATS_ExecuteRequest); - afsi_log("rx_NewService addr %x", (int)serverp); - if (serverp == NULL) { - *reasonP = "unknown error"; - return -1; - } - - /* start server threads, *not* donating this one to the pool */ - rx_StartServer(0); - afsi_log("rx_StartServer"); - - code = cm_GetRootCellName(rootCellName); - afsi_log("cm_GetRootCellName code %d, cm_freelanceEnabled= %d, rcn= %s", - code, cm_freelanceEnabled, (code ? "" : rootCellName)); - if (code != 0 && !cm_freelanceEnabled) - { - *reasonP = "can't find root cell name in afsd.ini"; - return -1; - } - else if (cm_freelanceEnabled) - cm_data.rootCellp = NULL; - - if (code == 0 && !cm_freelanceEnabled) - { - cm_data.rootCellp = cm_GetCell(rootCellName, CM_FLAG_CREATE); - afsi_log("cm_GetCell addr %x", (int)cm_data.rootCellp); - if (cm_data.rootCellp == NULL) - { - *reasonP = "can't find root cell in afsdcell.ini"; - return -1; - } - } - -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled) - cm_InitFreelance(); -#endif - - /* Initialize the RPC server for session keys */ - RpcInit(); - -#if !defined(DJGPP) - afsd_InitServerPreferences(); -#endif - return 0; -} - -int afsd_InitDaemons(char **reasonP) -{ - long code; - cm_req_t req; - - cm_InitReq(&req); - - /* this should really be in an init daemon from here on down */ - - if (!cm_freelanceEnabled) { - osi_Log0(afsd_logp, "Loading Root Volume from cell"); - code = cm_GetVolumeByName(cm_data.rootCellp, cm_rootVolumeName, cm_rootUserp, - &req, CM_FLAG_CREATE, &cm_data.rootVolumep); - afsi_log("cm_GetVolumeByName code %x root vol %x", code, - (code ? (cm_volume_t *)-1 : cm_data.rootVolumep)); - if (code != 0) { - *reasonP = "can't find root volume in root cell"; - return -1; - } - } - - /* compute the root fid */ - if (!cm_freelanceEnabled) { - cm_data.rootFid.cell = cm_data.rootCellp->cellID; - cm_data.rootFid.volume = cm_GetROVolumeID(cm_data.rootVolumep); - cm_data.rootFid.vnode = 1; - cm_data.rootFid.unique = 1; - } - else - cm_FakeRootFid(&cm_data.rootFid); - - code = cm_GetSCache(&cm_data.rootFid, &cm_data.rootSCachep, cm_rootUserp, &req); - afsi_log("cm_GetSCache code %x scache %x", code, - (code ? (cm_scache_t *)-1 : cm_data.rootSCachep)); - if (code != 0) { - *reasonP = "unknown error"; - return -1; - } - - cm_InitDaemon(numBkgD); - afsi_log("cm_InitDaemon complete"); - - return 0; -} - -int afsd_InitSMB(char **reasonP, void *aMBfunc) -{ - HKEY parmKey; - DWORD dummyLen; - DWORD dwValue; - DWORD code; - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - dummyLen = sizeof(DWORD); - code = RegQueryValueEx(parmKey, "StoreAnsiFilenames", NULL, NULL, - (BYTE *) &dwValue, &dummyLen); - if (code == ERROR_SUCCESS) - smb_StoreAnsiFilenames = dwValue ? 1 : 0; - RegCloseKey (parmKey); - } - - /* Do this last so that we don't handle requests before init is done. - * Here we initialize the SMB listener. - */ - smb_Init(afsd_logp, cm_NetbiosName, smb_UseV3, LANadapter, numSvThreads, aMBfunc); - afsi_log("smb_Init complete"); - - return 0; -} - -#ifdef ReadOnly -#undef ReadOnly -#endif - -#ifdef File -#undef File -#endif - -#pragma pack( push, before_imagehlp, 8 ) -#include -#pragma pack( pop, before_imagehlp ) - -#define MAXNAMELEN 1024 - -void afsd_printStack(HANDLE hThread, CONTEXT *c) -{ - HANDLE hProcess = GetCurrentProcess(); - int frameNum; - DWORD offset; - DWORD symOptions; - char functionName[MAXNAMELEN]; - - IMAGEHLP_MODULE Module; - IMAGEHLP_LINE Line; - - STACKFRAME s; - IMAGEHLP_SYMBOL *pSym; - - afsi_log_useTimestamp = 0; - - pSym = (IMAGEHLP_SYMBOL *) GlobalAlloc(0, sizeof (IMAGEHLP_SYMBOL) + MAXNAMELEN); - - memset( &s, '\0', sizeof s ); - if (!SymInitialize(hProcess, NULL, 1) ) - { - afsi_log("SymInitialize(): GetLastError() = %lu\n", GetLastError() ); - - SymCleanup( hProcess ); - GlobalFree(pSym); - - return; - } - - symOptions = SymGetOptions(); - symOptions |= SYMOPT_LOAD_LINES; - symOptions &= ~SYMOPT_UNDNAME; - SymSetOptions( symOptions ); - - /* - * init STACKFRAME for first call - * Notes: AddrModeFlat is just an assumption. I hate VDM debugging. - * Notes: will have to be #ifdef-ed for Alphas; MIPSes are dead anyway, - * and good riddance. - */ -#if defined (_ALPHA_) || defined (_MIPS_) || defined (_PPC_) -#error The STACKFRAME initialization in afsd_printStack() for this platform -#error must be properly configured -#else - s.AddrPC.Offset = c->Eip; - s.AddrPC.Mode = AddrModeFlat; - s.AddrFrame.Offset = c->Ebp; - s.AddrFrame.Mode = AddrModeFlat; -#endif - - memset( pSym, '\0', sizeof (IMAGEHLP_SYMBOL) + MAXNAMELEN ); - pSym->SizeOfStruct = sizeof (IMAGEHLP_SYMBOL); - pSym->MaxNameLength = MAXNAMELEN; - - memset( &Line, '\0', sizeof Line ); - Line.SizeOfStruct = sizeof Line; - - memset( &Module, '\0', sizeof Module ); - Module.SizeOfStruct = sizeof Module; - - offset = 0; - - afsi_log("\n--# FV EIP----- RetAddr- FramePtr StackPtr Symbol" ); - - for ( frameNum = 0; ; ++ frameNum ) - { - /* - * get next stack frame (StackWalk(), SymFunctionTableAccess(), - * SymGetModuleBase()). if this returns ERROR_INVALID_ADDRESS (487) or - * ERROR_NOACCESS (998), you can assume that either you are done, or - * that the stack is so hosed that the next deeper frame could not be - * found. - */ - if ( ! StackWalk( IMAGE_FILE_MACHINE_I386, hProcess, hThread, &s, c, - NULL, SymFunctionTableAccess, SymGetModuleBase, - NULL ) ) - break; - - /* display its contents */ - afsi_log("\n%3d %c%c %08lx %08lx %08lx %08lx ", - frameNum, s.Far? 'F': '.', s.Virtual? 'V': '.', - s.AddrPC.Offset, s.AddrReturn.Offset, - s.AddrFrame.Offset, s.AddrStack.Offset ); - - if ( s.AddrPC.Offset == 0 ) - { - afsi_log("(-nosymbols- PC == 0)" ); - } - else - { - /* show procedure info from a valid PC */ - if (!SymGetSymFromAddr(hProcess, s.AddrPC.Offset, &offset, pSym)) - { - if ( GetLastError() != ERROR_INVALID_ADDRESS ) - { - afsi_log("SymGetSymFromAddr(): errno = %lu", - GetLastError()); - } - } - else - { - UnDecorateSymbolName(pSym->Name, functionName, MAXNAMELEN, - UNDNAME_NAME_ONLY); - afsi_log("%s", functionName ); - - if ( offset != 0 ) - { - afsi_log(" %+ld bytes", (long) offset); - } - } - - if (!SymGetLineFromAddr(hProcess, s.AddrPC.Offset, &offset, &Line)) - { - if (GetLastError() != ERROR_INVALID_ADDRESS) - { - afsi_log("Error: SymGetLineFromAddr(): errno = %lu", - GetLastError()); - } - } - else - { - afsi_log(" Line: %s(%lu) %+ld bytes", Line.FileName, - Line.LineNumber, offset); - } - } - - /* no return address means no deeper stackframe */ - if (s.AddrReturn.Offset == 0) - { - SetLastError(0); - break; - } - } - - if (GetLastError() != 0) - { - afsi_log("\nStackWalk(): errno = %lu\n", GetLastError()); - } - - SymCleanup(hProcess); - GlobalFree(pSym); -} - -#ifdef _DEBUG -static DWORD *afsd_crtDbgBreakCurrent = NULL; -static DWORD afsd_crtDbgBreaks[256]; -#endif - -LONG __stdcall afsd_ExceptionFilter(EXCEPTION_POINTERS *ep) -{ - CONTEXT context; -#ifdef _DEBUG - BOOL allocRequestBrk = FALSE; -#endif - - afsi_log("UnhandledException : code : 0x%x, address: 0x%x\n", - ep->ExceptionRecord->ExceptionCode, - ep->ExceptionRecord->ExceptionAddress); - -#ifdef _DEBUG - if (afsd_crtDbgBreakCurrent && - *afsd_crtDbgBreakCurrent == _CrtSetBreakAlloc(*afsd_crtDbgBreakCurrent)) - { - allocRequestBrk = TRUE; - afsi_log("Breaking on alloc request # %d\n", *afsd_crtDbgBreakCurrent); - } -#endif - - /* save context if we want to print the stack information */ - context = *ep->ContextRecord; - - afsd_printStack(GetCurrentThread(), &context); - - if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) - { - afsi_log("\nEXCEPTION_BREAKPOINT - continue execution ...\n"); - -#ifdef _DEBUG - if (allocRequestBrk) - { - afsd_crtDbgBreakCurrent++; - _CrtSetBreakAlloc(*afsd_crtDbgBreakCurrent); - } -#endif - - ep->ContextRecord->Eip++; - return EXCEPTION_CONTINUE_EXECUTION; - } - else - { - return EXCEPTION_CONTINUE_SEARCH; - } -} - -void afsd_SetUnhandledExceptionFilter() -{ - SetUnhandledExceptionFilter(afsd_ExceptionFilter); -} - -#ifdef _DEBUG -void afsd_DbgBreakAllocInit() -{ - memset(afsd_crtDbgBreaks, -1, sizeof(afsd_crtDbgBreaks)); - afsd_crtDbgBreakCurrent = afsd_crtDbgBreaks; -} - -void afsd_DbgBreakAdd(DWORD requestNumber) -{ - int i; - for (i = 0; i < sizeof(afsd_crtDbgBreaks) - 1; i++) - { - if (afsd_crtDbgBreaks[i] == -1) - { - break; - } - } - afsd_crtDbgBreaks[i] = requestNumber; - - _CrtSetBreakAlloc(afsd_crtDbgBreaks[0]); -} -#endif diff --git a/src/WINNT/afsd/afsd_init.h b/src/WINNT/afsd/afsd_init.h deleted file mode 100644 index 123bd385b..000000000 --- a/src/WINNT/afsd/afsd_init.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -void afsi_start(); - -#ifndef DJGPP -int afsd_InitCM(char **reasonP); -int afsd_InitSMB(char **reasonP, void *aMBfunc); -#else /* DJGPP */ -int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock); -int afsd_InitSMB(char **reasonP); -#endif /* !DJGPP */ -int afsd_InitDaemons(char **reasonP); -void afsd_ForceTrace(BOOL flush); -void afsd_SetUnhandledExceptionFilter(); - -extern char cm_HostName[]; -extern char cm_NetbiosName[]; diff --git a/src/WINNT/afsd/afsd_init95.c b/src/WINNT/afsd/afsd_init95.c deleted file mode 100644 index 7ae3e0851..000000000 --- a/src/WINNT/afsd/afsd_init95.c +++ /dev/null @@ -1,788 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include "afsd.h" -#include -#include -#include -#include -#include "cm_rpc.h" - -#define AFSDIR_CLIENT_ETC_DIRPATH "c:/" -#define AFSLOGFILE "afs.log" -#define CACHEINFOFILE "cache.info" - -extern int RXAFSCB_ExecuteRequest(); -extern int RXSTATS_ExecuteRequest(); - -osi_log_t *afsd_logp; - -char cm_rootVolumeName[64]; -DWORD cm_rootVolumeNameLen; -cm_volume_t *cm_rootVolumep = NULL; -cm_cell_t *cm_rootCellp = NULL; -cm_fid_t cm_rootFid; -cm_scache_t *cm_rootSCachep; -char cm_mountRoot[1024]; -DWORD cm_mountRootLen; -int cm_logChunkSize; -int cm_chunkSize; -int afs_diskCacheChunks; -char cm_cachePath[128]; -int cm_diskCacheEnabled = 0; -#ifdef AFS_AFSDB_ENV -extern int cm_dnsEnabled; -#endif - -#ifdef AFS_FREELANCE_CLIENT -extern int cm_freelanceEnabled; -char *cm_FakeRootDir; -#endif /* freelance */ - -int smb_UseV3; - -int LANadapter; -int lanAdaptSet = 0; -int rootVolSet = 0; -int cacheSetTime = TRUE; -int afsd_verbose = 0; -int chunkSize; - -int numBkgD; -int numSvThreads; - -int traceOnPanic = 0; - -int logReady = 0; - -char cm_HostName[200]; -long cm_HostAddr; - -/*char cm_CachePath[200];*/ -/*DWORD cm_CachePathLen;*/ -char cm_CacheInfoPath[1024]; -int cacheBlocks; -int sawCacheSize=0, sawDiskCacheSize=0, sawMountRoot=0; -int sawCacheBaseDir=0; -char cm_AFSLogFile[200]; -int afsd_CloseSynch = 0; -int afs_shutdown = 0; -char cm_confDir[200]; - -BOOL isGateway = FALSE; -BOOL reportSessionStartups = FALSE; - -int afsd_debug; -cm_initparams_v1 cm_initParams; - - -/* - * AFSD Initialization Log - * - * This is distinct from the regular debug logging facility. - * Log items go directly to a file, not to an array in memory, so that even - * if AFSD crashes, the log can be inspected. - */ - -FILE *afsi_file; - -void -afsi_start() -{ - char wd[100]; - char t[100], u[100]; - int zilch; - int code; - time_t now; - char *p; - - afsi_file = NULL; - /*code = GetWindowsDirectory(wd, sizeof(wd)); - if (code == 0) return;*/ - strcpy (wd, "C:"); - strcat(wd, "\\afsd_init.log"); - /*GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, t, sizeof(t));*/ - time (&now); - strcpy(t, asctime(localtime(&now))); - /*afsi_file = CreateFile(wd, GENERIC_WRITE, FILE_SHARE_READ, NULL, - CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);*/ - /*afsi_file = open(wd, O_RDWR | O_CREAT | O_RSHARE);*/ - afsi_file = fopen(wd, "wt"); - setbuf(afsi_file, NULL); - - /*GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, u, sizeof(u));*/ - time (&now); - strcpy(u, asctime(localtime(&now))); - p = strchr(u, '\n'); if (p) *p = 0; - p = strchr(u, '\r'); if (p) *p = 0; - strcat(t, ": Create log file\n"); - strcat(u, ": Created log file\n"); - /*WriteFile(afsi_file, t, strlen(t), &zilch, NULL); - WriteFile(afsi_file, u, strlen(u), &zilch, NULL);*/ - /*write(afsi_file, t, strlen(t)); - write(afsi_file, u, strlen(u));*/ - fputs(t, afsi_file); - fputs(u, afsi_file); -} - -void -afsi_log(char *pattern, ...) -{ - char s[100], t[100], u[100]; - int zilch; - time_t now; - va_list ap; -#ifndef DEBUG - return; -#endif - va_start(ap, pattern); - - vsprintf(s, pattern, ap); - /*GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, t, sizeof(t));*/ - time(&now); - strcpy(t, asctime(localtime(&now))); - sprintf(u, "%s: %s\n", t, s); - if (afsi_file != NULL) - /* fputs(u, stderr); */ - fputs(u, afsi_file); - /*write(afsi_file, u, strlen(u));*/ - /*WriteFile(afsi_file, u, strlen(u), &zilch, NULL);*/ -} - -/* - * Standard AFSD trace - */ - -void afsd_ForceTrace(BOOL flush) -{ - FILE *handle; - int len; - char buf[100]; - - if (!logReady) return; - - /*len = GetTempPath(99, buf);*/ - /*strcpy(&buf[len], "/afsd.log");*/ - strcpy(buf, "c:/afsd.log"); - /*handle = CreateFile(buf, GENERIC_WRITE, FILE_SHARE_READ, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);*/ - /*handle = open(buf, O_RDWR | O_CREAT | O_RSHARE);*/ - handle = fopen(buf, "wt"); - if (handle == NULL) { - logReady = 0; - osi_panic("Cannot create log file", __FILE__, __LINE__); - } - osi_LogPrint(afsd_logp, handle); - if (flush) - fflush(handle); - /*FlushFileBuffers(handle);*/ - /*CloseHandle(handle);*/ - fclose(handle); -} - -/*------------------------------------------------------------------------------ - * ParseCacheInfoFile - * - * Description: - * Open the file containing the description of the workstation's AFS cache - * and pull out its contents. The format of this file is as follows: - * - * cm_mountRoot:cacheBaseDir:cacheBlocks - * - * Arguments: - * None. - * - * Returns: - * 0 if everything went well, - * 1 otherwise. - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * Sets globals. - *---------------------------------------------------------------------------*/ - -int ParseCacheInfoFile() -{ - static char rn[]="ParseCacheInfoFile"; /*This routine's name*/ - FILE *cachefd; /*Descriptor for cache info file*/ - int parseResult; /*Result of our fscanf()*/ - int32 tCacheBlocks; - char tCacheBaseDir[1024], *tbd, tCacheMountDir[1024], *tmd; - /*char cacheBaseDir[1024]; /* cache in mem, this is ignored */ - - if (afsd_debug) - printf("%s: Opening cache info file '%s'...\n", - rn, cm_CacheInfoPath); - - cachefd = fopen(cm_CacheInfoPath, "r"); - if (!cachefd) { - printf("%s: Can't read cache info file '%s'\n", - rn, cm_CacheInfoPath); - return(1); - } - - /* - * Parse the contents of the cache info file. All chars up to the first - * colon are the AFS mount directory, all chars to the next colon are the - * full path name of the workstation cache directory and all remaining chars - * represent the number of blocks in the cache. - */ - tCacheMountDir[0] = tCacheBaseDir[0] = '\0'; - parseResult = fscanf(cachefd, - "%1024[^;];%1024[^;];%d", - tCacheMountDir, tCacheBaseDir, &tCacheBlocks); - - /* - * Regardless of how the parse went, we close the cache info file. - */ - fclose(cachefd); - - if (parseResult == EOF || parseResult < 3) { - printf("%s: Format error in cache info file!\n", - rn); - if (parseResult == EOF) - printf("\tEOF encountered before any field parsed.\n"); - else - printf("\t%d out of 3 fields successfully parsed.\n", - parseResult); - - printf("\tcm_mountRoot: '%s'\n\tcm_cachePath: '%s'\n\tcacheBlocks: %d\n", - cm_mountRoot, cm_cachePath, cacheBlocks); - return(1); - } - - for (tmd = tCacheMountDir; *tmd == '\n' || *tmd == ' ' || *tmd == '\t'; tmd++) ; - for (tbd = tCacheBaseDir; *tbd == '\n' || *tbd == ' ' || *tbd == '\t'; tbd++) ; - /* now copy in the fields not explicitly overridden by cmd args */ - if (!sawMountRoot) - { - strcpy(cm_mountRoot, tmd); - cm_mountRootLen = strlen(tmd); - } - if (!sawCacheBaseDir) - strcpy(cm_cachePath, tbd); - if (!sawCacheSize) - cacheBlocks = tCacheBlocks; - - if (afsd_debug) { - printf("%s: Cache info file successfully parsed:\n", - rn); - printf("\tcm_mountRoot: '%s'\n\tcm_cachePath: '%s'\n\tcacheBlocks: %d\n", - tmd, tbd, tCacheBlocks); - } - /*printf("cm_cachePath: %s\n", cm_cachePath);*/ - - /*PartSizeOverflow(tbd, cacheBlocks);*/ - - return(0); -} - -/* - * AFSD Initialization - */ - -int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock) -{ - osi_uid_t debugID; - long cacheBlocks; - long cacheSize; - long logChunkSize; - long stats; - long traceBufSize; - long ltt, ltto; - char rootCellName[256]; - struct rx_service *serverp; - static struct rx_securityClass *nullServerSecurityClassp; - struct hostent *thp; - char *msgBuf; - char buf[200]; - DWORD dummyLen; - long code; - struct cmd_syndesc *ts; - char *afsconf_path; - long diskCacheSize; - /*WSADATA WSAjunk; - - WSAStartup(0x0101, &WSAjunk);*/ - -#ifndef DJGPP - /* setup osidebug server at RPC slot 1000 */ - osi_LongToUID(1000, &debugID); - code = osi_InitDebug(&debugID); - afsi_log("osi_InitDebug code %d", code); -// osi_LockTypeSetDefault("stat"); /* comment this out for speed * - if (code != 0) { - *reasonP = "unknown error"; - return -1; - } -#endif - - /* who are we ? */ - gethostname(cm_HostName, sizeof(cm_HostName)); -#ifdef DJGPP - /* For some reason, we may be getting space-padded hostnames. - If so, we take out the padding so that we can append -AFS later. */ - { - char *space = strchr(cm_HostName,' '); - if (space) *space = '\0'; - } -#endif - afsi_log("gethostname %s", cm_HostName); - thp = gethostbyname(cm_HostName); - memcpy(&cm_HostAddr, thp->h_addr_list[0], 4); - - /* seed random number generator */ - srand(ntohl(cm_HostAddr)); - - /* Get configuration parameters from command line */ - - /* call atoi on the appropriate parsed results */ - - if (!as->parms[20].items) { - /* -startup */ - fprintf(stderr, "Please do not run this program directly. Use the AFS Client Windows loader\nto start AFS.\n"); - exit(1); - } - - if (as->parms[0].items) { - /* -lanadapt */ - LANadapter = atoi(as->parms[0].items->data); - lanAdaptSet = 1; - afsi_log("LAN adapter number %d", LANadapter); - } - else - { - LANadapter = -1; - afsi_log("Default LAN adapter number"); - } - - if (as->parms[1].items) { - /* -threads */ - numSvThreads = atoi(as->parms[1].items->data); - afsi_log("%d server threads", numSvThreads); - } - else - { - numSvThreads = CM_CONFIGDEFAULT_SVTHREADS; - afsi_log("Defaulting to %d server threads", numSvThreads); - } - - if (as->parms[2].items) { - /* -rootvol */ - strcpy(cm_rootVolumeName, as->parms[2].items->data); - rootVolSet = 1; - afsi_log("Root volume %s", cm_rootVolumeName); - } - else - { - strcpy(cm_rootVolumeName, "root.afs"); - afsi_log("Default root volume name root.afs"); - } - - if (as->parms[3].items) { - /* -stat */ - stats = atoi(as->parms[3].items->data); - afsi_log("Status cache size %d", stats); - } - else - { - stats = CM_CONFIGDEFAULT_STATS; - afsi_log("Default status cache size %d", stats); - } - - if (as->parms[4].items) { - /* -memcache */ - /* no-op */ - } - - if (as->parms[5].items) { - /* -cachedir */ - /* no-op; cache is in memory, not mapped file */ - strcpy(cm_cachePath, as->parms[5].items->data); - sawCacheBaseDir = 1; - } - - if (as->parms[6].items) { - /* -mountdir */ - strcpy(cm_mountRoot, as->parms[6].items->data); - cm_mountRootLen = strlen(cm_mountRoot); - sawMountRoot = 1; - afsi_log("Mount root %s", cm_mountRoot); - } - else - { - strcpy(cm_mountRoot, "/afs"); - cm_mountRootLen = 4; - /* Don't log */ - } - - if (as->parms[7].items) { - /* -daemons */ - numBkgD = atoi(as->parms[7].items->data); - afsi_log("%d background daemons", numBkgD); - } - else - { - numBkgD = CM_CONFIGDEFAULT_DAEMONS; - afsi_log("Defaulting to %d background daemons", numBkgD); - } - - if (as->parms[8].items) { - /* -nosettime */ - cacheSetTime = FALSE; - } - - if (as->parms[9].items) { - /* -verbose */ - afsd_verbose = 1; - } - - if (as->parms[10].items) { - /* -debug */ - afsd_debug = 1; - afsd_verbose = 1; - } - - if (as->parms[11].items) { - /* -chunksize */ - chunkSize = atoi(as->parms[11].items->data); - if (chunkSize < 12 || chunkSize > 30) { - afsi_log("Invalid chunk size %d, using default", - logChunkSize); - logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE; - } - } else { - logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE; - afsi_log("Default chunk size %d", logChunkSize); - } - cm_logChunkSize = logChunkSize; - cm_chunkSize = 1 << logChunkSize; - - if (as->parms[12].items) { - /* -dcache */ - cacheSize = atoi(as->parms[12].items->data); - afsi_log("Cache size %d", cacheSize); - sawCacheSize = 1; - } - else - { - cacheSize = CM_CONFIGDEFAULT_CACHESIZE; - afsi_log("Default cache size %d", cacheSize); - } - - afsconf_path = getenv("AFSCONF"); - if (!afsconf_path) - strcpy(cm_confDir, AFSDIR_CLIENT_ETC_DIRPATH); - else - strcpy(cm_confDir, afsconf_path); - if (as->parms[13].items) { - /* -confdir */ - strcpy(cm_confDir, as->parms[13].items->data); - } - - sprintf(cm_CacheInfoPath, "%s/%s", cm_confDir, CACHEINFOFILE); - - sprintf(cm_AFSLogFile, "%s/%s", cm_confDir, AFSLOGFILE); - if (as->parms[14].items) { - /* -logfile */ - strcpy(cm_AFSLogFile, as->parms[14].items->data); - } - - if (as->parms[15].items) { - /* -waitclose */ - afsd_CloseSynch = 1; - } - - if (as->parms[16].items) { - /* -shutdown */ - afs_shutdown = 1; - /* - * Cold shutdown is the default - */ - printf("afsd: Shutting down all afs processes and afs state\n"); - /*call_syscall(AFSOP_SHUTDOWN, 1);*/ - exit(0); - } - - if (as->parms[17].items) { - /* -sysname */ - strcpy(cm_sysName, as->parms[17].items->data); - } - else - strcpy(cm_sysName, "i386_win95"); - - if (as->parms[18].items) { - /* -gateway */ - isGateway = 1; - afsi_log("Set for %s service", - isGateway ? "gateway" : "stand-alone"); - } - else - isGateway = 0; - - if (as->parms[19].items) { - /* -tracebuf */ - traceBufSize = atoi(as->parms[19].items->data); - afsi_log("Trace Buffer size %d", traceBufSize); - } - else - { - traceBufSize = CM_CONFIGDEFAULT_TRACEBUFSIZE; - afsi_log("Default trace buffer size %d", traceBufSize); - } - - if (as->parms[21].items) { - /* -diskcache */ - diskCacheSize = atoi(as->parms[21].items->data); - cm_diskCacheEnabled = 1; - afsi_log("Disk cache size %d K", diskCacheSize); - /*printf("Disk cache size %d K", diskCacheSize);*/ - sawDiskCacheSize = 1; - } - else - { - diskCacheSize = 50000; /*CM_CONFIGDEFAULT_DISKCACHESIZE;*/ - afsi_log("Default disk cache size %d", diskCacheSize); - } - - if (as->parms[22].items) { - /* -noafsdb */ - cm_dnsEnabled = 0; - } - - if (as->parms[23].items) { - /* -freelance */ - cm_freelanceEnabled = 1; - } - - if (ParseCacheInfoFile()) { - exit(1); - } - - /* setup early variables */ - /* These both used to be configurable. */ - smb_UseV3 = 1; - buf_blockSize = CM_CONFIGDEFAULT_BLOCKSIZE; - - /* turn from 1024 byte units into memory blocks */ - cacheBlocks = (cacheSize * 1024) / buf_blockSize; - afs_diskCacheChunks = (diskCacheSize * 1024) / buf_blockSize; - /*printf("afs_diskCacheChunks=%d\n", afs_diskCacheChunks);*/ - - /* - * Save client configuration for GetCacheConfig requests - */ - cm_initParams.nChunkFiles = 0; - cm_initParams.nStatCaches = stats; - cm_initParams.nDataCaches = 0; - cm_initParams.nVolumeCaches = 0; - cm_initParams.firstChunkSize = cm_chunkSize; - cm_initParams.otherChunkSize = cm_chunkSize; - cm_initParams.cacheSize = cacheSize; - cm_initParams.setTime = 0; - cm_initParams.memCache = 0; - - /* setup and enable debug log */ - afsd_logp = osi_LogCreate("afsd", traceBufSize); - afsi_log("osi_LogCreate log addr %x", afsd_logp); - osi_LogEnable(afsd_logp); - logReady = 1; - -#if 0 - /* get network related info */ - cm_noIPAddr = CM_MAXINTERFACE_ADDR; - code = syscfg_GetIFInfo(&cm_noIPAddr, - cm_IPAddr, cm_SubnetMask, - cm_NetMtu, cm_NetFlags); - - if ( (cm_noIPAddr <= 0) || (code <= 0 ) ) - afsi_log("syscfg_GetIFInfo error code %d", code); - else - afsi_log("First Network address %x SubnetMask %x", - cm_IPAddr[0], cm_SubnetMask[0]); -#endif - - /* initialize RX, and tell it to listen to port 7001, which is used for - * callback RPC messages. - */ - code = rx_Init(htons(7001)); - afsi_log("rx_Init code %x", code); - if (code != 0) { - *reasonP = "afsd: failed to init rx client on port 7001"; - return -1; - } - - /* Initialize the RPC server for session keys */ - /*RpcInit();*/ - - /* create an unauthenticated service #1 for callbacks */ - nullServerSecurityClassp = rxnull_NewServerSecurityObject(); - serverp = rx_NewService(0, 1, "AFS", &nullServerSecurityClassp, 1, - RXAFSCB_ExecuteRequest); - afsi_log("rx_NewService addr %x", serverp); - if (serverp == NULL) { - *reasonP = "unknown error"; - return -1; - } - - nullServerSecurityClassp = rxnull_NewServerSecurityObject(); - serverp = rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", - &nullServerSecurityClassp, 1, RXSTATS_ExecuteRequest); - afsi_log("rx_NewService addr %x", serverp); - if (serverp == NULL) { - *reasonP = "unknown error"; - return -1; - } - - /* start server threads, *not* donating this one to the pool */ - rx_StartServer(0); - afsi_log("rx_StartServer"); - -#ifdef AFS_AFSDB_ENV - /* initialize dns lookup */ - if (cm_InitDNS(cm_dnsEnabled) == -1) - cm_dnsEnabled = 0; /* init failed, so deactivate */ - afsi_log("cm_InitDNS %d", cm_dnsEnabled); -#endif - - /* init user daemon, and other packages */ - cm_InitUser(); - - cm_InitACLCache(2*stats); - - cm_InitConn(); - - cm_InitCell(); - - cm_InitServer(); - - cm_InitVolume(); - - cm_InitIoctl(); - - smb_InitIoctl(); - - cm_InitCallback(); - - cm_InitSCache(stats); - - code = cm_InitDCache(0, cacheBlocks); - - afsi_log("cm_InitDCache code %x", code); - if (code != 0) { - *reasonP = "error initializing cache"; - return -1; - } - - code = cm_GetRootCellName(rootCellName); - afsi_log("cm_GetRootCellName code %d rcn %s", code, - (code ? "" : rootCellName)); - if (code != 0 && !cm_freelanceEnabled) { - *reasonP = "can't find root cell name in ThisCell"; - return -1; - } - else if (cm_freelanceEnabled) - cm_rootCellp = NULL; - - if (code == 0 && !cm_freelanceEnabled) { - cm_rootCellp = cm_GetCell(rootCellName, CM_FLAG_CREATE); - afsi_log("cm_GetCell addr %x", cm_rootCellp); - if (cm_rootCellp == NULL) { - *reasonP = "can't find root cell in CellServDB"; - return -1; - } - } - -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled) - cm_InitFreelance(); -#endif - - return 0; -} - -int afsd_InitDaemons(char **reasonP) -{ - long code; - cm_req_t req; - - cm_InitReq(&req); - - /* this should really be in an init daemon from here on down */ - - if (!cm_freelanceEnabled) { - code = cm_GetVolumeByName(cm_rootCellp, cm_rootVolumeName, cm_rootUserp, &req, CM_FLAG_CREATE, &cm_rootVolumep); - afsi_log("cm_GetVolumeByName code %x root vol %x", code, - (code ? 0xffffffff : cm_rootVolumep)); - if (code != 0) { - *reasonP = "can't find root volume in root cell"; - return -1; - } - } - - /* compute the root fid */ - if (!cm_freelanceEnabled) { - cm_rootFid.cell = cm_rootCellp->cellID; - cm_rootFid.volume = cm_GetROVolumeID(cm_rootVolumep); - cm_rootFid.vnode = 1; - cm_rootFid.unique = 1; - } - else - cm_FakeRootFid(&cm_rootFid); - - code = cm_GetSCache(&cm_rootFid, &cm_rootSCachep, cm_rootUserp, &req); - afsi_log("cm_GetSCache code %x scache %x", code, - (code ? 0xffffffff : cm_rootSCachep)); - if (code != 0) { - *reasonP = "unknown error"; - return -1; - } - - cm_InitDaemon(numBkgD); - afsi_log("cm_InitDaemon"); - - return 0; -} - -int afsd_InitSMB(char **reasonP) -{ - char hostName[200]; - char *ctemp; - - /* Do this last so that we don't handle requests before init is done. - * Here we initialize the SMB listener. - */ - strcpy(hostName, cm_HostName); - ctemp = strchr(hostName, '.'); /* turn ntdfs.* into ntdfs */ - if (ctemp) *ctemp = 0; - hostName[11] = 0; /* ensure that even after adding the -A, we - * leave one byte free for the netbios server - * type. - */ - strcat(hostName, "-AFS"); - strupr(hostName); - smb_Init(afsd_logp, hostName, smb_UseV3, LANadapter, numSvThreads); - afsi_log("smb_Init"); - - return 0; -} - diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c deleted file mode 100644 index a539363b6..000000000 --- a/src/WINNT/afsd/afsd_service.c +++ /dev/null @@ -1,1433 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include "afsd.h" -#include "afsd_init.h" -#include -#include -#include -#include - -#include - -#ifdef DEBUG -//#define NOTSERVICE -#endif -#ifdef _DEBUG -#include -#endif - -//#define REGISTER_POWER_NOTIFICATIONS 1 -#include "afsd_flushvol.h" - -extern void afsi_log(char *pattern, ...); - -static SERVICE_STATUS ServiceStatus; -static SERVICE_STATUS_HANDLE StatusHandle; - -HANDLE hAFSDMainThread = NULL; - -HANDLE WaitToTerminate; - -int GlobalStatus; - -#ifdef JUMP -unsigned int MainThreadId; -jmp_buf notifier_jmp; -#endif /* JUMP */ - -extern int traceOnPanic; -extern HANDLE afsi_file; - -int powerEventsRegistered = 0; - -/* - * Notifier function for use by osi_panic - */ -static void afsd_notifier(char *msgp, char *filep, long line) -{ - char tbuffer[512]; - char *ptbuf[1]; - HANDLE h; - - if (filep) - sprintf(tbuffer, "Error at file %s, line %d: %s", - filep, line, msgp); - else - sprintf(tbuffer, "Error at unknown location: %s", msgp); - - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = tbuffer; - ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, line, NULL, 1, 0, ptbuf, NULL); - DeregisterEventSource(h); - - GlobalStatus = line; - - osi_LogEnable(afsd_logp); - - afsd_ForceTrace(TRUE); - buf_ForceTrace(TRUE); - - afsi_log("--- begin dump ---"); - cm_DumpSCache(afsi_file, "a", 0); -#ifdef keisa - cm_dnlcDump(afsi_file, "a"); -#endif - cm_DumpBufHashTable(afsi_file, "a", 0); - smb_DumpVCP(afsi_file, "a", 0); - afsi_log("--- end dump ---"); - -#ifdef DEBUG - DebugBreak(); -#endif - - SetEvent(WaitToTerminate); - -#ifdef JUMP - if (GetCurrentThreadId() == MainThreadId) - longjmp(notifier_jmp, 1); -#endif /* JUMP */ - - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - exit(1); -} - -/* - * For use miscellaneously in smb.c; need to do better - */ -static int _stdcall DummyMessageBox(HWND h, LPCTSTR l1, LPCTSTR l2, UINT ui) -{ - return 0; -} - -DWORD -afsd_ServiceFlushVolume(DWORD dwlpEventData) -{ - DWORD dwRet = ERROR_NETWORK_BUSY; /* or NO_ERROR */ - - /* - ** If UI bit is not set, user interaction is not possible - ** BUT, since we are a NON-interactive service, and therefore - ** have NO user I/O, it doesn't much matter. - ** This benign code left here as example of how to find this out - */ - BOOL bUI = (dwlpEventData & 1); - - /* flush volume */ - if ( PowerNotificationThreadNotify() ) - { - dwRet = NO_ERROR; - } - else - { - /* flush was unsuccessful, or timeout - deny shutdown */ - dwRet = ERROR_NETWORK_BUSY; - } - - /* to deny hibernate, simply return - // any value besides NO_ERROR. - // For example: - // dwRet = ERROR_NETWORK_BUSY; - */ - - return dwRet; -} - - -/* service control handler used in nt4 only for backward compat. */ -VOID WINAPI -afsd_ServiceControlHandler(DWORD ctrlCode) -{ - HKEY parmKey; - DWORD dummyLen, doTrace; - long code; - - switch (ctrlCode) { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 1; - ServiceStatus.dwWaitHint = 30000; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - if (ctrlCode == SERVICE_CONTROL_STOP) - afsi_log("SERVICE_CONTROL_STOP"); - else - afsi_log("SERVICE_CONTROL_SHUTDOWN"); - - /* Write all dirty buffers back to server */ - buf_CleanAndReset(); - - /* Force trace if requested */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code != ERROR_SUCCESS) - goto doneTrace; - - dummyLen = sizeof(doTrace); - code = RegQueryValueEx(parmKey, "TraceOnShutdown", - NULL, NULL, - (BYTE *) &doTrace, &dummyLen); - RegCloseKey (parmKey); - if (code != ERROR_SUCCESS) - doTrace = 0; - if (doTrace) { - afsd_ForceTrace(FALSE); - buf_ForceTrace(FALSE); - } - - doneTrace: - SetEvent(WaitToTerminate); - break; - - case SERVICE_CONTROL_INTERROGATE: - ServiceStatus.dwCurrentState = SERVICE_RUNNING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; - SetServiceStatus(StatusHandle, &ServiceStatus); - break; - /* XXX handle system shutdown */ - /* XXX handle pause & continue */ - } -} - - -/* -** Extended ServiceControlHandler that provides Event types -** for monitoring Power events, for example. -*/ -DWORD WINAPI -afsd_ServiceControlHandlerEx( - DWORD ctrlCode, - DWORD dwEventType, - LPVOID lpEventData, - LPVOID lpContext - ) -{ - HKEY parmKey; - DWORD dummyLen, doTrace; - long code; - DWORD dwRet = ERROR_CALL_NOT_IMPLEMENTED; - - switch (ctrlCode) - { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 1; - ServiceStatus.dwWaitHint = 30000; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* Write all dirty buffers back to server */ - buf_CleanAndReset(); - - /* Force trace if requested */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code != ERROR_SUCCESS) - goto doneTrace; - - dummyLen = sizeof(doTrace); - code = RegQueryValueEx(parmKey, "TraceOnShutdown", - NULL, NULL, - (BYTE *) &doTrace, &dummyLen); - RegCloseKey (parmKey); - if (code != ERROR_SUCCESS) - doTrace = 0; - if (doTrace) { - afsd_ForceTrace(FALSE); - buf_ForceTrace(FALSE); - } - - doneTrace: - SetEvent(WaitToTerminate); - dwRet = NO_ERROR; - break; - - case SERVICE_CONTROL_INTERROGATE: - ServiceStatus.dwCurrentState = SERVICE_RUNNING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; - SetServiceStatus(StatusHandle, &ServiceStatus); - afsi_log("SERVICE_CONTROL_INTERROGATE"); - dwRet = NO_ERROR; - break; - - /* XXX handle system shutdown */ - /* XXX handle pause & continue */ - case SERVICE_CONTROL_POWEREVENT: - { - afsi_log("SERVICE_CONTROL_POWEREVENT"); - /* - ** dwEventType of this notification == WPARAM of WM_POWERBROADCAST - ** Return NO_ERROR == return TRUE for that message, i.e. accept request - ** Return any error code to deny request, - ** i.e. as if returning BROADCAST_QUERY_DENY - */ - if (powerEventsRegistered) { - switch((int) dwEventType) - { - case PBT_APMQUERYSUSPEND: - afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND"); - /* Write all dirty buffers back to server */ - buf_CleanAndReset(); - dwRet = NO_ERROR; - break; - case PBT_APMQUERYSTANDBY: - afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY"); - /* Write all dirty buffers back to server */ - buf_CleanAndReset(); - dwRet = NO_ERROR; - break; - - /* allow remaining case PBT_WhatEver */ - case PBT_APMSUSPEND: - afsi_log("SERVICE_CONTROL_APMSUSPEND"); - dwRet = NO_ERROR; - break; - case PBT_APMSTANDBY: - afsi_log("SERVICE_CONTROL_APMSTANDBY"); - dwRet = NO_ERROR; - break; - case PBT_APMRESUMECRITICAL: - afsi_log("SERVICE_CONTROL_APMRESUMECRITICAL"); - dwRet = NO_ERROR; - break; - case PBT_APMRESUMESUSPEND: - afsi_log("SERVICE_CONTROL_APMRESUMESUSPEND"); - dwRet = NO_ERROR; - break; - case PBT_APMRESUMESTANDBY: - afsi_log("SERVICE_CONTROL_APMRESUMESTANDBY"); - dwRet = NO_ERROR; - break; - case PBT_APMBATTERYLOW: - afsi_log("SERVICE_CONTROL_APMBATTERYLOW"); - dwRet = NO_ERROR; - break; - case PBT_APMPOWERSTATUSCHANGE: - afsi_log("SERVICE_CONTROL_APMPOWERSTATUSCHANGE"); - dwRet = NO_ERROR; - break; - case PBT_APMOEMEVENT: - afsi_log("SERVICE_CONTROL_APMOEMEVENT"); - dwRet = NO_ERROR; - break; - case PBT_APMRESUMEAUTOMATIC: - afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC"); - dwRet = NO_ERROR; - break; - default: - afsi_log("SERVICE_CONTROL_unknown"); - dwRet = NO_ERROR; - } - } - } - } /* end switch(ctrlCode) */ - return dwRet; -} - -/* There is similar code in client_config\drivemap.cpp GlobalMountDrive() - * - * Mount a drive into AFS if there global mapping - */ -/* DEE Could check first if we are run as SYSTEM */ -#define MAX_RETRIES 30 -static void MountGlobalDrives(void) -{ - char szAfsPath[_MAX_PATH]; - char szDriveToMapTo[5]; - DWORD dwResult; - char szKeyName[256]; - HKEY hKey; - DWORD dwIndex = 0, dwRetry = 0; - DWORD dwDriveSize; - DWORD dwSubMountSize; - char szSubMount[256]; - DWORD dwType; - - sprintf(szKeyName, "%s\\GlobalAutoMapper", AFSREG_CLT_SVC_PARAM_SUBKEY); - - dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey); - if (dwResult != ERROR_SUCCESS) - return; - - while (dwRetry < MAX_RETRIES) { - dwDriveSize = sizeof(szDriveToMapTo); - dwSubMountSize = sizeof(szSubMount); - dwResult = RegEnumValue(hKey, dwIndex++, szDriveToMapTo, &dwDriveSize, 0, &dwType, szSubMount, &dwSubMountSize); - if (dwResult != ERROR_MORE_DATA) { - if (dwResult != ERROR_SUCCESS) { - if (dwResult != ERROR_NO_MORE_ITEMS) - afsi_log("Failed to read GlobalAutoMapper values: %d\n", dwResult); - break; - } - } - - for ( ; dwRetry < MAX_RETRIES; dwRetry++) - { - NETRESOURCE nr; - memset (&nr, 0x00, sizeof(NETRESOURCE)); - - sprintf(szAfsPath,"\\\\%s\\%s",cm_NetbiosName,szSubMount); - - nr.dwScope = RESOURCE_GLOBALNET; /* ignored parameter */ - nr.dwType=RESOURCETYPE_DISK; - nr.lpLocalName=szDriveToMapTo; - nr.lpRemoteName=szAfsPath; - nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE; /* ignored parameter */ - nr.dwUsage = RESOURCEUSAGE_CONNECTABLE; /* ignored parameter */ - - dwResult = WNetAddConnection2(&nr,NULL,NULL,0); - afsi_log("GlobalAutoMap of %s to %s %s (%d)", szDriveToMapTo, szSubMount, - (dwResult == NO_ERROR) ? "succeeded" : "failed", dwResult); - if (dwResult == NO_ERROR) { - break; - } - /* wait for smb server to come up */ - Sleep((DWORD)1000 /* miliseconds */); - - /* Disconnect any previous mappings */ - dwResult = WNetCancelConnection2(szDriveToMapTo, 0, TRUE); - } - } - - RegCloseKey(hKey); -} - -static void DismountGlobalDrives() -{ - char szAfsPath[_MAX_PATH]; - char szDriveToMapTo[5]; - DWORD dwResult; - char szKeyName[256]; - HKEY hKey; - DWORD dwIndex = 0; - DWORD dwDriveSize; - DWORD dwSubMountSize; - char szSubMount[256]; - DWORD dwType; - - sprintf(szKeyName, "%s\\GlobalAutoMapper", AFSREG_CLT_SVC_PARAM_SUBKEY); - - dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey); - if (dwResult != ERROR_SUCCESS) - return; - - while (1) { - dwDriveSize = sizeof(szDriveToMapTo); - dwSubMountSize = sizeof(szSubMount); - dwResult = RegEnumValue(hKey, dwIndex++, szDriveToMapTo, &dwDriveSize, 0, &dwType, szSubMount, &dwSubMountSize); - if (dwResult != ERROR_MORE_DATA) { - if (dwResult != ERROR_SUCCESS) { - if (dwResult != ERROR_NO_MORE_ITEMS) - afsi_log("Failed to read GlobalAutoMapper values: %d\n", dwResult); - break; - } - } - - sprintf(szAfsPath,"\\\\%s\\%s",cm_NetbiosName,szSubMount); - - dwResult = WNetCancelConnection2(szDriveToMapTo, 0, TRUE); - dwResult = WNetCancelConnection(szAfsPath, TRUE); - - afsi_log("Disconnect from GlobalAutoMap of %s to %s %s", szDriveToMapTo, szSubMount, dwResult ? "succeeded" : "failed"); - } - - RegCloseKey(hKey); -} - -DWORD -GetVersionInfo( CHAR * filename, CHAR * szOutput, DWORD dwOutput ) -{ - DWORD dwVersionHandle; - LPVOID pVersionInfo = 0; - DWORD retval = 0; - LPDWORD pLangInfo = 0; - LPTSTR szVersion = 0; - UINT len = 0; - TCHAR szVerQ[] = TEXT("\\StringFileInfo\\12345678\\FileVersion"); - DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle); - - if (!size) { - afsi_log("GetFileVersionInfoSize failed"); - return GetLastError(); - } - - pVersionInfo = malloc(size); - if (!pVersionInfo) { - afsi_log("out of memory 1"); - return ERROR_NOT_ENOUGH_MEMORY; - } - - GetFileVersionInfo(filename, dwVersionHandle, size, pVersionInfo); - if (retval = GetLastError()) - { - afsi_log("GetFileVersionInfo failed: %d", retval); - goto cleanup; - } - - VerQueryValue(pVersionInfo, TEXT("\\VarFileInfo\\Translation"), - (LPVOID*)&pLangInfo, &len); - if (retval = GetLastError()) - { - afsi_log("VerQueryValue 1 failed: %d", retval); - goto cleanup; - } - - wsprintf(szVerQ, - TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"), - LOWORD(*pLangInfo), HIWORD(*pLangInfo)); - - VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len); - if (retval = GetLastError()) - { - /* try again with language 409 since the old binaries were tagged wrong */ - wsprintf(szVerQ, - TEXT("\\StringFileInfo\\0409%04x\\FileVersion"), - HIWORD(*pLangInfo)); - - VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len); - if (retval = GetLastError()) { - afsi_log("VerQueryValue 2 failed: [%s] %d", szVerQ, retval); - goto cleanup; - } - } - snprintf(szOutput, dwOutput, TEXT("%s"), szVersion); - szOutput[dwOutput - 1] = 0; - - cleanup: - if (pVersionInfo) - free(pVersionInfo); - - return retval; -} - -static HINSTANCE hCrypt32; -static DWORD (WINAPI *pCertGetNameString)(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, - void* pvTypePara, LPTSTR pszNameString, DWORD cchNameString); -static BOOL (WINAPI *pCryptQueryObject)(DWORD dwObjectType, const void* pvObject, DWORD dwExpectedContentTypeFlags, - DWORD dwExpectedFormatTypeFlags, DWORD dwFlags, - DWORD* pdwMsgAndCertEncodingType, DWORD* pdwContentType, - DWORD* pdwFormatType, HCERTSTORE* phCertStore, - HCRYPTMSG* phMsg, const void** ppvContext); -static BOOL (WINAPI *pCryptMsgGetParam)(HCRYPTMSG hCryptMsg, DWORD dwParamType, DWORD dwIndex, - void* pvData, DWORD* pcbData); -static PCCERT_CONTEXT (WINAPI *pCertFindCertificateInStore)(HCERTSTORE hCertStore, DWORD dwCertEncodingType, - DWORD dwFindFlags, DWORD dwFindType, - const void* pvFindPara, - PCCERT_CONTEXT pPrevCertContext); -static BOOL (WINAPI *pCertCloseStore)(HCERTSTORE hCertStore, DWORD dwFlags); -static BOOL (WINAPI *pCryptMsgClose)(HCRYPTMSG hCryptMsg); -static BOOL (WINAPI *pCertCompareCertificate)(DWORD dwCertEncodingType, PCERT_INFO pCertId1, - PCERT_INFO pCertId2); -static BOOL (WINAPI *pCertFreeCertificateContext)(PCCERT_CONTEXT pCertContext); - -void LoadCrypt32(void) -{ - hCrypt32 = LoadLibrary("crypt32"); - if ( !hCrypt32 ) - return; - - (FARPROC) pCertGetNameString = GetProcAddress( hCrypt32, "CertGetNameString" ); - (FARPROC) pCryptQueryObject = GetProcAddress( hCrypt32, "CryptQueryObject" ); - (FARPROC) pCryptMsgGetParam = GetProcAddress( hCrypt32, "CryptMsgGetParam" ); - (FARPROC) pCertFindCertificateInStore = GetProcAddress( hCrypt32, "CertFindCertificateInStore" ); - (FARPROC) pCertCloseStore = GetProcAddress( hCrypt32, "CertCloseStore" ); - (FARPROC) pCryptMsgClose = GetProcAddress( hCrypt32, "CryptMsgClose" ); - (FARPROC) pCertCompareCertificate = GetProcAddress( hCrypt32, "CertCompareCertificate" ); - (FARPROC) pCertFreeCertificateContext = GetProcAddress( hCrypt32, "CertFreeCertificateContext" ); - - if ( !pCertGetNameString || - !pCryptQueryObject || - !pCryptMsgGetParam || - !pCertFindCertificateInStore || - !pCertCloseStore || - !pCryptMsgClose || - !pCertCompareCertificate || - !pCertFreeCertificateContext) - { - FreeLibrary(hCrypt32); - hCrypt32 = NULL; - } -} - -void UnloadCrypt32(void) -{ - FreeLibrary(hCrypt32); -} - -#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING) - -PCCERT_CONTEXT GetCertCtx(CHAR * filename) -{ - wchar_t wfilename[260]; - BOOL fResult; - DWORD dwEncoding; - DWORD dwContentType; - DWORD dwFormatType; - DWORD dwSignerInfo; - HCERTSTORE hStore = NULL; - HCRYPTMSG hMsg = NULL; - PCMSG_SIGNER_INFO pSignerInfo = NULL; - PCCERT_CONTEXT pCertContext = NULL; - CERT_INFO CertInfo; - - if ( hCrypt32 == NULL ) - return NULL; - - ZeroMemory(&CertInfo, sizeof(CertInfo)); - mbstowcs(wfilename, filename, 260); - - fResult = pCryptQueryObject(CERT_QUERY_OBJECT_FILE, - wfilename, - CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, - CERT_QUERY_FORMAT_FLAG_BINARY, - 0, - &dwEncoding, - &dwContentType, - &dwFormatType, - &hStore, - &hMsg, - NULL); - - if (!fResult) { - afsi_log("CryptQueryObject failed for [%s] with error 0x%x", - filename, - GetLastError()); - goto __exit; - } - - fResult = pCryptMsgGetParam(hMsg, - CMSG_SIGNER_INFO_PARAM, - 0, - NULL, - &dwSignerInfo); - - if (!fResult) { - afsi_log("CryptMsgGetParam failed for [%s] with error 0x%x", - filename, - GetLastError()); - goto __exit; - } - - pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo); - - fResult = pCryptMsgGetParam(hMsg, - CMSG_SIGNER_INFO_PARAM, - 0, - (PVOID)pSignerInfo, - &dwSignerInfo); - - if (!fResult) { - afsi_log("CryptMsgGetParam failed for [%s] with error 0x%x", - filename, - GetLastError()); - goto __exit; - } - - CertInfo.Issuer = pSignerInfo->Issuer; - CertInfo.SerialNumber = pSignerInfo->SerialNumber; - - pCertContext = pCertFindCertificateInStore(hStore, - ENCODING, - 0, - CERT_FIND_SUBJECT_CERT, - (PVOID) &CertInfo, - NULL); - - if (!pCertContext) { - afsi_log("CertFindCertificateInStore for file [%s] failed with 0x%x", - filename, - GetLastError()); - goto __exit; - } - - __exit: - if (pSignerInfo) - LocalFree(pSignerInfo); - - /* if (pCertContext) - CertFreeCertificateContext(pCertContext);*/ - - if (hStore) - pCertCloseStore(hStore,0); - - if (hMsg) - pCryptMsgClose(hMsg); - - return pCertContext; -} - -BOOL VerifyTrust(CHAR * filename) -{ - WIN_TRUST_ACTDATA_CONTEXT_WITH_SUBJECT fContextWSubject; - WIN_TRUST_SUBJECT_FILE fSubjectFile; - GUID trustAction = WIN_SPUB_ACTION_PUBLISHED_SOFTWARE; - GUID subject = WIN_TRUST_SUBJTYPE_PE_IMAGE; - wchar_t wfilename[260]; - LONG ret; - BOOL success = FALSE; - - LONG (WINAPI *pWinVerifyTrust)(HWND hWnd, GUID* pgActionID, WINTRUST_DATA* pWinTrustData) = NULL; - HINSTANCE hWinTrust; - - if (filename == NULL ) - return FALSE; - - hWinTrust = LoadLibrary("wintrust"); - if ( !hWinTrust ) - return FALSE; - - if (((FARPROC) pWinVerifyTrust = - GetProcAddress( hWinTrust, "WinVerifyTrust" )) == NULL ) - { - FreeLibrary(hWinTrust); - return FALSE; - } - - mbstowcs(wfilename, filename, 260); - - fSubjectFile.hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, - 0, NULL); - fSubjectFile.lpPath = wfilename; - fContextWSubject.hClientToken = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, - FALSE, GetCurrentProcessId()); - fContextWSubject.SubjectType = &subject; - fContextWSubject.Subject = &fSubjectFile; - - ret = pWinVerifyTrust(INVALID_HANDLE_VALUE, &trustAction, (WINTRUST_DATA *)&fContextWSubject); - - if ( fSubjectFile.hFile != INVALID_HANDLE_VALUE ) - CloseHandle( fSubjectFile.hFile ); - if ( fContextWSubject.hClientToken != INVALID_HANDLE_VALUE ) - CloseHandle( fContextWSubject.hClientToken ); - - if (ret == ERROR_SUCCESS) { - success = TRUE; - } else { - DWORD gle = GetLastError(); - switch (gle) { - case TRUST_E_PROVIDER_UNKNOWN: - afsi_log("VerifyTrust failed: \"Generic Verify V2\" Provider Unknown"); - break; - case TRUST_E_NOSIGNATURE: - afsi_log("VerifyTrust failed: Unsigned executable"); - break; - case TRUST_E_EXPLICIT_DISTRUST: - afsi_log("VerifyTrust failed: Certificate Marked as Untrusted by the user"); - break; - case TRUST_E_SUBJECT_NOT_TRUSTED: - afsi_log("VerifyTrust failed: File is not trusted"); - break; - case TRUST_E_BAD_DIGEST: - afsi_log("VerifyTrust failed: Executable has been modified"); - break; - case CRYPT_E_SECURITY_SETTINGS: - afsi_log("VerifyTrust failed: local security options prevent verification"); - break; - default: - afsi_log("VerifyTrust failed: 0x%X", GetLastError()); - } - success = FALSE; - } - FreeLibrary(hWinTrust); - return success; -} - -void LogCertCtx(PCCERT_CONTEXT pCtx) { - DWORD dwData; - LPTSTR szName = NULL; - - if ( hCrypt32 == NULL ) - return; - - // Get Issuer name size. - if (!(dwData = pCertGetNameString(pCtx, - CERT_NAME_SIMPLE_DISPLAY_TYPE, - CERT_NAME_ISSUER_FLAG, - NULL, - NULL, - 0))) { - afsi_log("CertGetNameString failed: 0x%x", GetLastError()); - goto __exit; - } - - // Allocate memory for Issuer name. - szName = (LPTSTR)LocalAlloc(LPTR, dwData * sizeof(TCHAR)); - - // Get Issuer name. - if (!(pCertGetNameString(pCtx, - CERT_NAME_SIMPLE_DISPLAY_TYPE, - CERT_NAME_ISSUER_FLAG, - NULL, - szName, - dwData))) { - afsi_log("CertGetNameString failed: 0x%x", GetLastError()); - goto __exit; - } - - // print Issuer name. - afsi_log("Issuer Name: %s", szName); - LocalFree(szName); - szName = NULL; - - // Get Subject name size. - if (!(dwData = pCertGetNameString(pCtx, - CERT_NAME_SIMPLE_DISPLAY_TYPE, - 0, - NULL, - NULL, - 0))) { - afsi_log("CertGetNameString failed: 0x%x", GetLastError()); - goto __exit; - } - - // Allocate memory for subject name. - szName = (LPTSTR)LocalAlloc(LPTR, dwData * sizeof(TCHAR)); - - // Get subject name. - if (!(pCertGetNameString(pCtx, - CERT_NAME_SIMPLE_DISPLAY_TYPE, - 0, - NULL, - szName, - dwData))) { - afsi_log("CertGetNameString failed: 0x%x", GetLastError()); - goto __exit; - } - - // Print Subject Name. - afsi_log("Subject Name: %s", szName); - - __exit: - - if (szName) - LocalFree(szName); -} - -BOOL AFSModulesVerify(void) -{ - CHAR filename[1024]; - CHAR afsdVersion[128]; - CHAR modVersion[128]; - CHAR checkName[1024]; - BOOL trustVerified = FALSE; - HMODULE hMods[1024]; - HANDLE hProcess; - DWORD cbNeeded; - unsigned int i; - BOOL success = TRUE; - PCCERT_CONTEXT pCtxService = NULL; - HINSTANCE hPSAPI; - DWORD (WINAPI *pGetModuleFileNameExA)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize); - BOOL (WINAPI *pEnumProcessModules)(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded); - DWORD dummyLen, code; - DWORD cacheSize = CM_CONFIGDEFAULT_CACHESIZE; - DWORD verifyServiceSig = TRUE; - HKEY parmKey; - - hPSAPI = LoadLibrary("psapi"); - - if ( hPSAPI == NULL ) - return FALSE; - - if (!GetModuleFileName(NULL, filename, sizeof(filename))) - return FALSE; - - if (GetVersionInfo(filename, afsdVersion, sizeof(afsdVersion))) - return FALSE; - - afsi_log("%s version %s", filename, afsdVersion); - - if (((FARPROC) pGetModuleFileNameExA = - GetProcAddress( hPSAPI, "GetModuleFileNameExA" )) == NULL || - ((FARPROC) pEnumProcessModules = - GetProcAddress( hPSAPI, "EnumProcessModules" )) == NULL) - { - FreeLibrary(hPSAPI); - return FALSE; - } - - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - dummyLen = sizeof(cacheSize); - code = RegQueryValueEx(parmKey, "CacheSize", NULL, NULL, - (BYTE *) &cacheSize, &dummyLen); - RegCloseKey (parmKey); - } - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - dummyLen = sizeof(verifyServiceSig); - code = RegQueryValueEx(parmKey, "VerifyServiceSignature", NULL, NULL, - (BYTE *) &verifyServiceSig, &dummyLen); - RegCloseKey (parmKey); - } - - if (verifyServiceSig && cacheSize < 716800) { - trustVerified = VerifyTrust(filename); - } else { - afsi_log("Signature Verification disabled"); - } - - if (trustVerified) { - LoadCrypt32(); - - // get a certificate context for the signer of afsd_service. - pCtxService = GetCertCtx(filename); - if (pCtxService) - LogCertCtx(pCtxService); - } - - // Get a list of all the modules in this process. - hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, - FALSE, GetCurrentProcessId()); - - if (pEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) - { - afsi_log("Num of Process Modules: %d", (cbNeeded / sizeof(HMODULE))); - - for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) - { - char szModName[2048]; - - // Get the full path to the module's file. - if (pGetModuleFileNameExA(hProcess, hMods[i], szModName, sizeof(szModName))) - { - lstrcpy(checkName, szModName); - strlwr(checkName); - - if ( strstr(checkName, "afspthread.dll") || - strstr(checkName, "afsauthent.dll") || - strstr(checkName, "afsrpc.dll") || - strstr(checkName, "libafsconf.dll") || - strstr(checkName, "libosi.dll") ) - { - if (GetVersionInfo(szModName, modVersion, sizeof(modVersion))) { - success = FALSE; - continue; - } - - afsi_log("%s version %s", szModName, modVersion); - if (strcmp(afsdVersion,modVersion)) { - afsi_log("Version mismatch: %s", szModName); - success = FALSE; - } - if ( trustVerified ) { - if ( !VerifyTrust(szModName) ) { - afsi_log("Signature Verification failed: %s", szModName); - success = FALSE; - } - else if (pCtxService) { - PCCERT_CONTEXT pCtx = GetCertCtx(szModName); - - if (!pCtx || !pCertCompareCertificate(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, - pCtxService->pCertInfo, - pCtx->pCertInfo)) { - afsi_log("Certificate mismatch: %s", szModName); - if (pCtx) - LogCertCtx(pCtx); - - success = FALSE; - } - - if (pCtx) - pCertFreeCertificateContext(pCtx); - } - } - } - } - } - } - - if (pCtxService) { - pCertFreeCertificateContext(pCtxService); - UnloadCrypt32(); - } - - FreeLibrary(hPSAPI); - - CloseHandle(hProcess); - return success; -} - -/* -control serviceex exists only on 2000/xp. These functions will be loaded dynamically. -*/ - -typedef SERVICE_STATUS_HANDLE ( * RegisterServiceCtrlHandlerExFunc )( LPCTSTR , LPHANDLER_FUNCTION_EX , LPVOID ); -typedef SERVICE_STATUS_HANDLE ( * RegisterServiceCtrlHandlerFunc )( LPCTSTR , LPHANDLER_FUNCTION ); - -RegisterServiceCtrlHandlerExFunc pRegisterServiceCtrlHandlerEx = NULL; -RegisterServiceCtrlHandlerFunc pRegisterServiceCtrlHandler = NULL; - -VOID WINAPI -afsd_Main(DWORD argc, LPTSTR *argv) -{ - long code; - char *reason; -#ifdef JUMP - int jmpret; -#endif /* JUMP */ - HMODULE hHookDll; - HMODULE hAdvApi32; - -#ifdef _DEBUG - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF /*| _CRTDBG_CHECK_ALWAYS_DF*/ | - _CRTDBG_CHECK_CRT_DF /* | _CRTDBG_DELAY_FREE_MEM_DF */ ); -#endif - - osi_InitPanic(afsd_notifier); - osi_InitTraceOption(); - - GlobalStatus = 0; - - afsi_start(); - - WaitToTerminate = CreateEvent(NULL, TRUE, FALSE, TEXT("afsd_service_WaitToTerminate")); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", TEXT("afsd_service_WaitToTerminate")); - -#ifndef NOTSERVICE - hAdvApi32 = LoadLibrary("advapi32.dll"); - if (hAdvApi32 == NULL) - { - afsi_log("Fatal: cannot load advapi32.dll"); - return; - } - - pRegisterServiceCtrlHandlerEx = (RegisterServiceCtrlHandlerExFunc)GetProcAddress(hAdvApi32, "RegisterServiceCtrlHandlerExA"); - if (pRegisterServiceCtrlHandlerEx) - { - afsi_log("running on 2000+ - using RegisterServiceCtrlHandlerEx"); - StatusHandle = RegisterServiceCtrlHandlerEx(AFS_DAEMON_SERVICE_NAME, afsd_ServiceControlHandlerEx, NULL ); - } - else - { - StatusHandle = RegisterServiceCtrlHandler(AFS_DAEMON_SERVICE_NAME, afsd_ServiceControlHandler); - } - - ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - ServiceStatus.dwServiceSpecificExitCode = 0; - ServiceStatus.dwCurrentState = SERVICE_START_PENDING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 1; - ServiceStatus.dwWaitHint = 30000; - /* accept Power Events */ - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; - SetServiceStatus(StatusHandle, &ServiceStatus); -#endif - - { - HANDLE h; char *ptbuf[1]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = "AFS start pending"; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); - DeregisterEventSource(h); - } - -#ifdef REGISTER_POWER_NOTIFICATIONS - { - HKEY hkParm; - DWORD code; - DWORD dummyLen; - int bpower = TRUE; - - /* see if we should handle power notifications */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &hkParm); - if (code == ERROR_SUCCESS) { - dummyLen = sizeof(bpower); - code = RegQueryValueEx(hkParm, "FlushOnHibernate", NULL, NULL, - (BYTE *) &bpower, &dummyLen); - - if(code != ERROR_SUCCESS) - bpower = TRUE; - - RegCloseKey(hkParm); - } - /* create thread used to flush cache */ - if (bpower) { - PowerNotificationThreadCreate(); - powerEventsRegistered = 1; - } - } -#endif - - /* Verify the versions of the DLLs which were loaded */ - if (!AFSModulesVerify()) { - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* exit if initialization failed */ - return; - } - - /* allow an exit to be called prior to any initialization */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdInitHook initHook = ( AfsdInitHook ) GetProcAddress(hHookDll, AFSD_INIT_HOOK); - if (initHook) - { - hookRc = initHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - - if (hookRc == FALSE) - { - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* exit if initialization failed */ - return; - } - else - { - /* allow another 15 seconds to start */ - ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - ServiceStatus.dwServiceSpecificExitCode = 0; - ServiceStatus.dwCurrentState = SERVICE_START_PENDING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 2; - ServiceStatus.dwWaitHint = 20000; - /* accept Power Events */ - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; - SetServiceStatus(StatusHandle, &ServiceStatus); - } - } - -#ifdef JUMP - MainThreadId = GetCurrentThreadId(); - jmpret = setjmp(notifier_jmp); - - if (jmpret == 0) -#endif /* JUMP */ - { - code = afsd_InitCM(&reason); - if (code != 0) { - afsi_log("afsd_InitCM failed: %s (code = %d)", reason, code); - osi_panic(reason, __FILE__, __LINE__); - } - -#ifndef NOTSERVICE - ServiceStatus.dwCheckPoint++; - ServiceStatus.dwWaitHint -= 5000; - SetServiceStatus(StatusHandle, &ServiceStatus); -#endif - code = afsd_InitDaemons(&reason); - if (code != 0) { - afsi_log("afsd_InitDaemons failed: %s (code = %d)", reason, code); - osi_panic(reason, __FILE__, __LINE__); - } - - /* allow an exit to be called post rx initialization */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdRxStartedHook rxStartedHook = ( AfsdRxStartedHook ) GetProcAddress(hHookDll, AFSD_RX_STARTED_HOOK); - if (rxStartedHook) - { - hookRc = rxStartedHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - - if (hookRc == FALSE) - { - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* exit if initialization failed */ - return; - } - } - -#ifndef NOTSERVICE - ServiceStatus.dwCheckPoint++; - ServiceStatus.dwWaitHint -= 5000; - SetServiceStatus(StatusHandle, &ServiceStatus); -#endif - code = afsd_InitSMB(&reason, MessageBox); - if (code != 0) { - afsi_log("afsd_InitSMB failed: %s (code = %d)", reason, code); - osi_panic(reason, __FILE__, __LINE__); - } - - /* allow an exit to be called post smb initialization */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdSmbStartedHook smbStartedHook = ( AfsdSmbStartedHook ) GetProcAddress(hHookDll, AFSD_SMB_STARTED_HOOK); - if (smbStartedHook) - { - hookRc = smbStartedHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - - if (hookRc == FALSE) - { - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* exit if initialization failed */ - return; - } - } - - MountGlobalDrives(); - -#ifndef NOTSERVICE - ServiceStatus.dwCurrentState = SERVICE_RUNNING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - - /* accept Power events */ - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; - SetServiceStatus(StatusHandle, &ServiceStatus); -#endif - { - HANDLE h; char *ptbuf[1]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = "AFS running"; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); - DeregisterEventSource(h); - } - } - - /* allow an exit to be called when started */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdStartedHook startedHook = ( AfsdStartedHook ) GetProcAddress(hHookDll, AFSD_STARTED_HOOK); - if (startedHook) - { - hookRc = startedHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - - if (hookRc == FALSE) - { - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* exit if initialization failed */ - return; - } - } - - WaitForSingleObject(WaitToTerminate, INFINITE); - - afsi_log("Received Termination Signal, Stopping Service"); - - { - HANDLE h; char *ptbuf[1]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = "AFS quitting"; - ReportEvent(h, GlobalStatus ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE, - 0, 0, NULL, 1, 0, ptbuf, NULL); - DeregisterEventSource(h); - } - - /* allow an exit to be called prior to stopping the service */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdStoppingHook stoppingHook = ( AfsdStoppingHook ) GetProcAddress(hHookDll, AFSD_STOPPING_HOOK); - if (stoppingHook) - { - hookRc = stoppingHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - - if (hookRc == FALSE) - { - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - - /* exit if initialization failed */ - return; - } - } - - -#ifdef AFS_FREELANCE_CLIENT - cm_FreelanceShutdown(); - afsi_log("Freelance Shutdown complete"); -#endif - - DismountGlobalDrives(); - afsi_log("Global Drives dismounted"); - - cm_DaemonShutdown(); - afsi_log("Daemon shutdown complete"); - - buf_Shutdown(); - afsi_log("Buffer shutdown complete"); - - rx_Finalize(); - afsi_log("rx finalization complete"); - - smb_Shutdown(); - afsi_log("smb shutdown complete"); - - RpcShutdown(); - - cm_ShutdownMappedMemory(); - -#ifdef REGISTER_POWER_NOTIFICATIONS - /* terminate thread used to flush cache */ - if (powerEventsRegistered) - PowerNotificationThreadExit(); -#endif - - /* allow an exit to be called after stopping the service */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdStoppedHook stoppedHook = ( AfsdStoppedHook ) GetProcAddress(hHookDll, AFSD_STOPPED_HOOK); - if (stoppedHook) - { - hookRc = stoppedHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - } - - /* Remove the ExceptionFilter */ - SetUnhandledExceptionFilter(NULL); - - ServiceStatus.dwCurrentState = SERVICE_STOPPED; - ServiceStatus.dwWin32ExitCode = GlobalStatus ? ERROR_EXCEPTION_IN_SERVICE : NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); -} - -DWORD __stdcall afsdMain_thread(void* notUsed) -{ - char * argv[2] = {AFS_DAEMON_SERVICE_NAME, NULL}; - afsd_Main(1, (LPTSTR*)argv); - return(0); -} - -void usage(void) -{ - fprintf(stderr, "afsd_service.exe [--validate-cache ]"); -} - -int -main(int argc, char * argv[]) -{ - static SERVICE_TABLE_ENTRY dispatchTable[] = { - {AFS_DAEMON_SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION) afsd_Main}, - {NULL, NULL} - }; - int i; - - for (i = 1; i < argc; i++) { - if (!stricmp(argv[i],"--validate-cache")) { - if (++i != argc - 1) { - usage(); - return(1); - } - - return cm_ValidateMappedMemory(argv[i]); - } else { - usage(); - return(1); - } - } - - if (!StartServiceCtrlDispatcher(dispatchTable)) - { - LONG status = GetLastError(); - if (status == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) - { - DWORD tid; - hAFSDMainThread = CreateThread(NULL, 0, afsdMain_thread, 0, 0, &tid); - - printf("Hit to terminate OpenAFS Client Service\n"); - getchar(); - SetEvent(WaitToTerminate); - } - } - - if ( hAFSDMainThread ) { - WaitForSingleObject( hAFSDMainThread, INFINITE ); - CloseHandle( hAFSDMainThread ); - } - return(0); -} diff --git a/src/WINNT/afsd/afsd_service.rc b/src/WINNT/afsd/afsd_service.rc deleted file mode 100644 index c9c8a065c..000000000 --- a/src/WINNT/afsd/afsd_service.rc +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client Daemon" -#define AFS_VERINFO_NAME "afsd_service" -#define AFS_VERINFO_FILENAME "afsd_service.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -1 ICON afsd.ico - diff --git a/src/WINNT/afsd/afsdacl.c b/src/WINNT/afsd/afsdacl.c deleted file mode 100644 index f669a451f..000000000 --- a/src/WINNT/afsd/afsdacl.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - -Copyright 2004 by the Massachusetts Institute of Technology - -All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of the Massachusetts -Institute of Technology (M.I.T.) not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -*/ - -/* $Id */ - -#include -#include -#include -#include -#include - -#define SETDACL 1 -#define RESETDACL 2 - -#define AFSSERVICE "TransarcAFSDaemon" -#define AFSCLIENT_ADMIN_GROUPNAME "AFS Client Admins" -#define EVERYONE_GROUPNAME "Everyone" - -char * progname = NULL; - -void show_usage(void) { - fprintf(stderr, - "%s : Set or reset the DACL to allow starting or stopping\n" - " the afsd service by any ordinary user.\n" - "\n" - "Usage : %s [-set | -reset] [-show]\n" - " -set : Sets the DACL\n" - " -reset : Reset the DACL\n" - " -show : Show current DACL (SDSF)\n" - , progname, progname); -} - -void show_last_error(DWORD code) { - LPVOID lpvMessageBuffer; - - if(!code) - code = GetLastError(); - - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&lpvMessageBuffer, 0, NULL); - - fprintf(stderr, - "%s: Error %d : %s\n", - progname, - code, - (LPSTR) lpvMessageBuffer); - - LocalFree(lpvMessageBuffer); -} - -int set_dacl(int action) { - int rv = 1; - BOOL bDaclPresent = FALSE; - BOOL bDaclDefaulted = FALSE; - SC_HANDLE scm = NULL; - SC_HANDLE s_afs = NULL; - PSECURITY_DESCRIPTOR psdesc = NULL; - PACL pacl = NULL; - PACL pnewacl = NULL; - EXPLICIT_ACCESS exa[2]; - DWORD dwSize = 0; - DWORD code = ERROR_SUCCESS; - SECURITY_DESCRIPTOR sd; - - scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if(!scm) { - show_last_error(0); - goto exit0; - } - - s_afs = OpenService(scm, AFSSERVICE, READ_CONTROL | WRITE_DAC); - if(!s_afs) { - show_last_error(0); - goto exit0; - } - - if (!QueryServiceObjectSecurity(s_afs, DACL_SECURITY_INFORMATION, - &sd, 0, &dwSize)) - { - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - psdesc = (PSECURITY_DESCRIPTOR)HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, dwSize); - if (psdesc == NULL) - { - show_last_error(0); - goto exit0; - } - - if (!QueryServiceObjectSecurity(s_afs, - DACL_SECURITY_INFORMATION, psdesc, dwSize, &dwSize)) { - show_last_error(0); - goto exit0; - } - } - else { - show_last_error(0); - goto exit0; - } - } - /* else : shouldn't happen. */ - - if (!GetSecurityDescriptorDacl(psdesc, &bDaclPresent, &pacl, &bDaclDefaulted)) - show_last_error(0); - - BuildExplicitAccessWithName(&exa[0], AFSCLIENT_ADMIN_GROUPNAME, - SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL, - SET_ACCESS, - NO_INHERITANCE); - - BuildExplicitAccessWithName(&exa[1], EVERYONE_GROUPNAME, - SERVICE_START | SERVICE_STOP | READ_CONTROL, - ((action==RESETDACL)?REVOKE_ACCESS:SET_ACCESS), - NO_INHERITANCE); - - code = SetEntriesInAcl(2, exa, pacl, &pnewacl); - if(code != ERROR_SUCCESS) { - show_last_error(code); - } - - if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) - show_last_error(0); - - if(!SetSecurityDescriptorDacl(&sd, TRUE, pnewacl, FALSE)) - show_last_error(0); - - if (!SetServiceObjectSecurity(s_afs, DACL_SECURITY_INFORMATION, &sd)) - show_last_error(0); - -exit0: - if(pnewacl) - LocalFree(pnewacl); - if(psdesc) - HeapFree(GetProcessHeap(), 0, psdesc); - if(s_afs) - CloseServiceHandle(s_afs); - if(scm) - CloseServiceHandle(scm); - - return rv; -} - -int show_dacl(void) { - int rv = 1; - BOOL bDaclPresent = FALSE; - BOOL bDaclDefaulted = FALSE; - SC_HANDLE scm = NULL; - SC_HANDLE s_afs = NULL; - PSECURITY_DESCRIPTOR psdesc = NULL; - DWORD dwSize = 0; - DWORD code = ERROR_SUCCESS; - SECURITY_DESCRIPTOR sd; - LPSTR pstr = NULL; - - scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if(!scm) { - show_last_error(0); - goto exit0; - } - - s_afs = OpenService(scm, AFSSERVICE, READ_CONTROL); - if(!s_afs) { - show_last_error(0); - goto exit0; - } - - if (!QueryServiceObjectSecurity(s_afs, DACL_SECURITY_INFORMATION, - &sd, 0, &dwSize)) - { - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - psdesc = (PSECURITY_DESCRIPTOR)HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, dwSize); - if (psdesc == NULL) - { - show_last_error(0); - goto exit0; - } - - if (!QueryServiceObjectSecurity(s_afs, - DACL_SECURITY_INFORMATION, psdesc, dwSize, &dwSize)) { - show_last_error(0); - goto exit0; - } - } - else { - show_last_error(0); - goto exit0; - } - } - /* else : shouldn't happen. */ - - if(!ConvertSecurityDescriptorToStringSecurityDescriptor( - psdesc, - SDDL_REVISION_1, - DACL_SECURITY_INFORMATION, - &pstr, - NULL)) - { - show_last_error(0); - goto exit0; - } - - printf("DACL for AFSD service is : [%s]\n",pstr); - -exit0: - if(pstr) - LocalFree(pstr); - if(psdesc) - HeapFree(GetProcessHeap(), 0, psdesc); - if(s_afs) - CloseServiceHandle(s_afs); - if(scm) - CloseServiceHandle(scm); - - return rv; -} - -int main(int argc, char ** argv) { - int showdacl = FALSE; - int action = 0; - int i; - int rv; - - progname = argv[0]; - - for(i=1; i -#include -#include -#include -#include "afsicf.h" - -//#define TESTMAIN - -#ifdef TESTMAIN -#include -#pragma comment(lib,"ole32.lib") -#pragma comment(lib,"oleaut32.lib") -#define DEBUGOUT(x) printf x -#else -#define DEBUGOUT(x) -#endif - -/* an IPv4, enabled port with global scope */ -struct global_afs_port_type { - LPWSTR name; - LONG port; - NET_FW_IP_PROTOCOL protocol; -}; - -typedef struct global_afs_port_type global_afs_port_t; - -global_afs_port_t afs_clientPorts[] = { - { L"AFS CacheManager Callback (UDP)", 7001, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS CacheManager Callback (TCP)", 7001, NET_FW_IP_PROTOCOL_TCP } -}; - -global_afs_port_t afs_serverPorts[] = { - { L"AFS File Server (UDP)", 7000, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS File Server (TCP)", 7000, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS User & Group Database (UDP)", 7002, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS User & Group Database (TCP)", 7002, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS Volume Location Database (UDP)", 7003, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS Volume Location Database (TCP)", 7003, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS/Kerberos Authentication (UDP)", 7004, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS/Kerberos Authentication (TCP)", 7004, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS Volume Mangement (UDP)", 7005, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS Volume Mangement (TCP)", 7005, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS Error Interpretation (UDP)", 7006, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS Error Interpretation (TCP)", 7006, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS Basic Overseer (UDP)", 7007, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS Basic Overseer (TCP)", 7007, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS Server-to-server Updater (UDP)", 7008, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS Server-to-server Updater (TCP)", 7008, NET_FW_IP_PROTOCOL_TCP }, - { L"AFS Remote Cache Manager (UDP)", 7009, NET_FW_IP_PROTOCOL_UDP }, - { L"AFS Remote Cache Manager (TCP)", 7009, NET_FW_IP_PROTOCOL_TCP } -}; - -HRESULT icf_OpenFirewallProfile(INetFwProfile ** fwProfile) { - HRESULT hr = S_OK; - INetFwMgr* fwMgr = NULL; - INetFwPolicy* fwPolicy = NULL; - - *fwProfile = NULL; - - // Create an instance of the firewall settings manager. - hr = CoCreateInstance( - __uuidof(NetFwMgr), - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(INetFwMgr), - reinterpret_cast(static_cast(&fwMgr)) - ); - if (FAILED(hr)) - { - DEBUGOUT(("Can't create fwMgr\n")); - goto error; - } - - // Retrieve the local firewall policy. - hr = fwMgr->get_LocalPolicy(&fwPolicy); - if (FAILED(hr)) - { - DEBUGOUT(("Cant get local policy\n")); - goto error; - } - - // Retrieve the firewall profile currently in effect. - hr = fwPolicy->get_CurrentProfile(fwProfile); - if (FAILED(hr)) - { - DEBUGOUT(("Can't get current profile\n")); - goto error; - } - -error: - - // Release the local firewall policy. - if (fwPolicy != NULL) - { - fwPolicy->Release(); - } - - // Release the firewall settings manager. - if (fwMgr != NULL) - { - fwMgr->Release(); - } - - return hr; -} - -HRESULT icf_CheckAndAddPorts(INetFwProfile * fwProfile, global_afs_port_t * ports, int nPorts) { - INetFwOpenPorts * fwPorts = NULL; - INetFwOpenPort * fwPort = NULL; - HRESULT hr; - HRESULT rhr = S_OK; /* return value */ - int i = 0; - - hr = fwProfile->get_GloballyOpenPorts(&fwPorts); - if (FAILED(hr)) { - // Abort! - DEBUGOUT(("Can't get globallyOpenPorts\n")); - rhr = hr; - goto cleanup; - } - - // go through the supplied ports - for (i=0; iItem(ports[i].port, ports[i].protocol, &fwPort); - if (SUCCEEDED(hr)) { - DEBUGOUT(("Found port for %S\n",ports[i].name)); - hr = fwPort->get_Enabled(&vbEnabled); - if (SUCCEEDED(hr)) { - if ( vbEnabled == VARIANT_FALSE ) { - hr = fwPort->put_Enabled(VARIANT_TRUE); - if (FAILED(hr)) { - // failed. Mark as failure. Don't try to create the port either. - rhr = hr; - } - } // else we are fine - } else { - // Something is wrong with the port. - // We try to create a new one thus overriding this faulty one. - bCreate = TRUE; - } - fwPort->Release(); - fwPort = NULL; - } else if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) { - DEBUGOUT(("Port not found for %S\n", ports[i].name)); - bCreate = TRUE; - } - - if (bCreate) { - DEBUGOUT(("Trying to create port %S\n",ports[i].name)); - hr = CoCreateInstance( - __uuidof(NetFwOpenPort), - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(INetFwOpenPort), - reinterpret_cast - (static_cast(&fwPort)) - ); - - if (FAILED(hr)) { - DEBUGOUT(("Can't create port\n")); - rhr = hr; - } else { - DEBUGOUT(("Created port\n")); - hr = fwPort->put_IpVersion( NET_FW_IP_VERSION_ANY ); - if (FAILED(hr)) { - DEBUGOUT(("Can't set IpVersion\n")); - rhr = hr; - goto abandon_port; - } - - hr = fwPort->put_Port( ports[i].port ); - if (FAILED(hr)) { - DEBUGOUT(("Can't set Port\n")); - rhr = hr; - goto abandon_port; - } - - hr = fwPort->put_Protocol( ports[i].protocol ); - if (FAILED(hr)) { - DEBUGOUT(("Can't set Protocol\n")); - rhr = hr; - goto abandon_port; - } - - hr = fwPort->put_Scope( NET_FW_SCOPE_ALL ); - if (FAILED(hr)) { - DEBUGOUT(("Can't set Scope\n")); - rhr = hr; - goto abandon_port; - } - - bstName = SysAllocString( ports[i].name ); - - if (SysStringLen(bstName) == 0) { - rhr = E_OUTOFMEMORY; - } else { - hr = fwPort->put_Name( bstName ); - if (FAILED(hr)) { - DEBUGOUT(("Can't set Name\n")); - rhr = hr; - SysFreeString( bstName ); - goto abandon_port; - } - } - - SysFreeString( bstName ); - - hr = fwPorts->Add( fwPort ); - if (FAILED(hr)) { - DEBUGOUT(("Can't add port\n")); - rhr = hr; - } else - DEBUGOUT(("Added port\n")); - -abandon_port: - fwPort->Release(); - } - } - } // loop through ports - - fwPorts->Release(); - -cleanup: - - if (fwPorts != NULL) - fwPorts->Release(); - - return rhr; -} - -long icf_CheckAndAddAFSPorts(int portset) { - HRESULT hr; - BOOL coInitialized = FALSE; - INetFwProfile * fwProfile = NULL; - global_afs_port_t * ports; - int nports; - long code = 0; - - if (portset == AFS_PORTSET_CLIENT) { - ports = afs_clientPorts; - nports = sizeof(afs_clientPorts) / sizeof(*afs_clientPorts); - } else if (portset == AFS_PORTSET_SERVER) { - ports = afs_serverPorts; - nports = sizeof(afs_serverPorts) / sizeof(*afs_serverPorts); - } else - return 1; /* Invalid port set */ - - hr = CoInitializeEx( - NULL, - COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE - ); - - if (SUCCEEDED(hr) || RPC_E_CHANGED_MODE == hr) - { - coInitialized = TRUE; - } - // not necessarily catastrophic if the call failed. We'll try to - // continue as if it succeeded. - - hr = icf_OpenFirewallProfile(&fwProfile); - if (FAILED(hr)) { - // Ok. That didn't work. This could be because the machine we - // are running on doesn't have Windows Firewall. We'll return - // a failure to the caller, which shouldn't be taken to mean - // it's catastrophic. - DEBUGOUT(("Can't open Firewall profile\n")); - code = 1; - goto cleanup; - } - - // Now that we have a firewall profile, we can start checking - // and adding the ports that we want. - hr = icf_CheckAndAddPorts(fwProfile, ports, nports); - if (FAILED(hr)) - code = 1; - -cleanup: - if (coInitialized) { - CoUninitialize(); - } - - return code; -} - - -#ifdef TESTMAIN -int main(int argc, char **argv) { - printf("Starting...\n"); - if (icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT)) - printf("Failed\n"); - else - printf("Succeeded\n"); - printf("Done\n"); - return 0; -} -#endif \ No newline at end of file diff --git a/src/WINNT/afsd/afsicf.h b/src/WINNT/afsd/afsicf.h deleted file mode 100644 index 05adc99a0..000000000 --- a/src/WINNT/afsd/afsicf.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - -Copyright 2004 by the Massachusetts Institute of Technology - -All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of the Massachusetts -Institute of Technology (M.I.T.) not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -*/ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -long icf_CheckAndAddAFSPorts(int portset); - -#ifdef __cplusplus -} -#endif - -#define AFS_PORTSET_CLIENT 1 -#define AFS_PORTSET_SERVER 2 - diff --git a/src/WINNT/afsd/afskfw-int.h b/src/WINNT/afsd/afskfw-int.h deleted file mode 100644 index dba551d90..000000000 --- a/src/WINNT/afsd/afskfw-int.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2003 SkyRope, LLC - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of Skyrope, LLC nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission from Skyrope, LLC. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Portions of this code are derived from portions of the MIT - * Leash Ticket Manager and LoadFuncs utilities. For these portions the - * following copyright applies. - * - * Copyright (c) 2003,2004 by the Massachusetts Institute of Technology. - * All rights reserved. - * - * Export of this software from the United States of America may - * require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. Furthermore if you modify this software you must label - * your software as modified software and not distribute it in such a - * fashion that it might be confused with the original M.I.T. software. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - * - */ - -#ifndef AFSKRB5_INT_H -#define AFSKRB5_INT_H - -#include -#ifdef USE_MS2MIT -#define SECURITY_WIN32 -#include -#include -#endif /* USE_MS2MIT */ -#include -#include -#include -#include - -#ifdef USE_MS2MIT -#include -#endif /* USE_MS2MIT */ - -#include -#include - -#include - -/* Defined in the KRBV4W32 version of krb.h but not the Kerberos V version */ -/* Required for some of the loadfuncs headers */ -typedef struct ktext far *KTEXT; -typedef struct ktext far *KTEXT_FP; -#include - -/* AFS has its own version of com_err.h */ -typedef afs_int32 errcode_t; - -#include -#include -#include -#include -#include -#include - -// service definitions -#define SERVICE_DLL "advapi32.dll" -typedef SC_HANDLE (WINAPI *FP_OpenSCManagerA)(char *, char *, DWORD); -typedef SC_HANDLE (WINAPI *FP_OpenServiceA)(SC_HANDLE, char *, DWORD); -typedef BOOL (WINAPI *FP_QueryServiceStatus)(SC_HANDLE, LPSERVICE_STATUS); -typedef BOOL (WINAPI *FP_CloseServiceHandle)(SC_HANDLE); - -#define KRB5_DEFAULT_LIFE 60*60*10 /* 10 hours */ -#define LSA_CCNAME "MSLSA:" - -#define KTC_ERROR 11862784L -#define KTC_TOOBIG 11862785L -#define KTC_INVAL 11862786L -#define KTC_NOENT 11862787L -#define KTC_PIOCTLFAIL 11862788L -#define KTC_NOPIOCTL 11862789L -#define KTC_NOCELL 11862790L -#define KTC_NOCM 11862791L - -/* User Query data structures and functions */ - -struct textField { - char * buf; /* Destination buffer address */ - int len; /* Destination buffer length */ - char * label; /* Label for this field */ - char * def; /* Default response for this field */ - int echo; /* 0 = no, 1 = yes, 2 = asterisks */ -}; - -#define ID_TEXT 150 -#define ID_MID_TEXT 300 - -struct principal_ccache_data { - struct principal_ccache_data * next; - char * principal; - char * ccache_name; - int from_lsa; - int expired; - int expiration_time; - int renew; -}; - -struct cell_principal_map { - struct cell_principal_map * next; - char * cell; - char * principal; - int active; -}; - -/* In order to avoid including the private CCAPI headers */ -typedef int cc_int32; - -#define CC_API_VER_1 1 -#define CC_API_VER_2 2 - -#define CCACHE_API cc_int32 - -/* -** The Official Error Codes -*/ -#define CC_NOERROR 0 -#define CC_BADNAME 1 -#define CC_NOTFOUND 2 -#define CC_END 3 -#define CC_IO 4 -#define CC_WRITE 5 -#define CC_NOMEM 6 -#define CC_FORMAT 7 -#define CC_LOCKED 8 -#define CC_BAD_API_VERSION 9 -#define CC_NO_EXIST 10 -#define CC_NOT_SUPP 11 -#define CC_BAD_PARM 12 -#define CC_ERR_CACHE_ATTACH 13 -#define CC_ERR_CACHE_RELEASE 14 -#define CC_ERR_CACHE_FULL 15 -#define CC_ERR_CRED_VERSION 16 - -enum { - CC_CRED_VUNKNOWN = 0, // For validation - CC_CRED_V4 = 1, - CC_CRED_V5 = 2, - CC_CRED_VMAX = 3 // For validation -}; - -typedef struct opaque_dll_control_block_type* apiCB; -typedef struct _infoNC { - char* name; - char* principal; - cc_int32 vers; -} infoNC; - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_initialize, - ( - apiCB** cc_ctx, // < DLL's primary control structure. - // returned here, passed everywhere else - cc_int32 api_version, // > ver supported by caller (use CC_API_VER_1) - cc_int32* api_supported, // < if ~NULL, max ver supported by DLL - const char** vendor // < if ~NULL, vendor name in read only C string - ) -); - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_shutdown, - ( - apiCB** cc_ctx // <> DLL's primary control structure. NULL after - ) -); - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_get_NC_info, - ( - apiCB* cc_ctx, // > DLL's primary control structure - struct _infoNC*** ppNCi // < (NULL before call) null terminated, - // list of a structs (free via cc_free_infoNC()) - ) -); - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_free_NC_info, - ( - apiCB* cc_ctx, - struct _infoNC*** ppNCi // < free list of structs returned by - // cc_get_cache_names(). set to NULL on return - ) -); -#define CCAPI_DLL "krbcc32.dll" - -/* Function Prototypes */ -DWORD GetServiceStatus(LPSTR, LPSTR, DWORD *); -void KFW_AFS_error(LONG, LPCSTR); - -void UnloadFuncs(FUNC_INFO [], HINSTANCE); -int LoadFuncs(const char*, FUNC_INFO [], HINSTANCE*, int*, int, int, int); -int KFW_get_ccache(krb5_context, krb5_principal, krb5_ccache *); -int KFW_error(krb5_error_code, LPCSTR, int, krb5_context *, krb5_ccache *); -int KFW_kinit(krb5_context, krb5_ccache, HWND, char *, char *, krb5_deltat, - DWORD, DWORD, krb5_deltat, DWORD, DWORD); -int KFW_renew(krb5_context, krb5_ccache); -int KFW_destroy(krb5_context, krb5_ccache); -BOOL KFW_ms2mit(krb5_context, krb5_ccache, BOOL); -int KFW_AFS_unlog(void); -int KFW_AFS_klog(krb5_context, krb5_ccache, char*, char*, char*, int, char*); -void KFW_import_ccache_data(void); -BOOL MSLSA_IsKerberosLogon(); -char *afs_realm_of_cell(krb5_context, struct afsconf_cell *); -#endif /* AFSKFW_INT_H */ diff --git a/src/WINNT/afsd/afskfw.c b/src/WINNT/afsd/afskfw.c deleted file mode 100644 index adc858705..000000000 --- a/src/WINNT/afsd/afskfw.c +++ /dev/null @@ -1,3457 +0,0 @@ -/* - * Copyright (c) 2003 SkyRope, LLC - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of Skyrope, LLC nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission from Skyrope, LLC. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Portions of this code are derived from portions of the MIT - * Leash Ticket Manager and LoadFuncs utilities. For these portions the - * following copyright applies. - * - * Copyright (c) 2003,2004 by the Massachusetts Institute of Technology. - * All rights reserved. - * - * Export of this software from the United States of America may - * require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. Furthermore if you modify this software you must label - * your software as modified software and not distribute it in such a - * fashion that it might be confused with the original M.I.T. software. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - * - */ - - -#define USE_MS2MIT -#undef USE_KRB4 -#include "afskfw-int.h" -#include "afskfw.h" - -#include -#include /* for life_to_time */ -#include -#include - -#include - -/* - * TIMING _____________________________________________________________________ - * - */ - -#define cminREMIND_TEST 1 // test every minute for expired creds -#define cminREMIND_WARN 15 // warn if creds expire in 15 minutes -#define cminRENEW 20 // renew creds when there are 20 minutes remaining -#define cminMINLIFE 30 // minimum life of Kerberos creds - -#define c100ns1SECOND (LONGLONG)10000000 -#define cmsec1SECOND 1000 -#define cmsec1MINUTE 60000 -#define csec1MINUTE 60 - -/* Function Pointer Declarations for Delayed Loading */ -// CCAPI -DECL_FUNC_PTR(cc_initialize); -DECL_FUNC_PTR(cc_shutdown); -DECL_FUNC_PTR(cc_get_NC_info); -DECL_FUNC_PTR(cc_free_NC_info); - -// leash functions -DECL_FUNC_PTR(Leash_get_default_lifetime); -DECL_FUNC_PTR(Leash_get_default_forwardable); -DECL_FUNC_PTR(Leash_get_default_renew_till); -DECL_FUNC_PTR(Leash_get_default_noaddresses); -DECL_FUNC_PTR(Leash_get_default_proxiable); -DECL_FUNC_PTR(Leash_get_default_publicip); -DECL_FUNC_PTR(Leash_get_default_use_krb4); -DECL_FUNC_PTR(Leash_get_default_life_min); -DECL_FUNC_PTR(Leash_get_default_life_max); -DECL_FUNC_PTR(Leash_get_default_renew_min); -DECL_FUNC_PTR(Leash_get_default_renew_max); -DECL_FUNC_PTR(Leash_get_default_renewable); -DECL_FUNC_PTR(Leash_get_default_mslsa_import); - -// krb5 functions -DECL_FUNC_PTR(krb5_change_password); -DECL_FUNC_PTR(krb5_get_init_creds_opt_init); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_tkt_life); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_forwardable); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_proxiable); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_address_list); -DECL_FUNC_PTR(krb5_get_init_creds_password); -DECL_FUNC_PTR(krb5_build_principal_ext); -DECL_FUNC_PTR(krb5_cc_get_name); -DECL_FUNC_PTR(krb5_cc_resolve); -DECL_FUNC_PTR(krb5_cc_default); -DECL_FUNC_PTR(krb5_cc_default_name); -DECL_FUNC_PTR(krb5_cc_set_default_name); -DECL_FUNC_PTR(krb5_cc_initialize); -DECL_FUNC_PTR(krb5_cc_destroy); -DECL_FUNC_PTR(krb5_cc_close); -DECL_FUNC_PTR(krb5_cc_store_cred); -DECL_FUNC_PTR(krb5_cc_copy_creds); -DECL_FUNC_PTR(krb5_cc_retrieve_cred); -DECL_FUNC_PTR(krb5_cc_get_principal); -DECL_FUNC_PTR(krb5_cc_start_seq_get); -DECL_FUNC_PTR(krb5_cc_next_cred); -DECL_FUNC_PTR(krb5_cc_end_seq_get); -DECL_FUNC_PTR(krb5_cc_remove_cred); -DECL_FUNC_PTR(krb5_cc_set_flags); -DECL_FUNC_PTR(krb5_cc_get_type); -DECL_FUNC_PTR(krb5_free_context); -DECL_FUNC_PTR(krb5_free_cred_contents); -DECL_FUNC_PTR(krb5_free_principal); -DECL_FUNC_PTR(krb5_get_in_tkt_with_password); -DECL_FUNC_PTR(krb5_init_context); -DECL_FUNC_PTR(krb5_parse_name); -DECL_FUNC_PTR(krb5_timeofday); -DECL_FUNC_PTR(krb5_timestamp_to_sfstring); -DECL_FUNC_PTR(krb5_unparse_name); -DECL_FUNC_PTR(krb5_get_credentials); -DECL_FUNC_PTR(krb5_mk_req); -DECL_FUNC_PTR(krb5_sname_to_principal); -DECL_FUNC_PTR(krb5_get_credentials_renew); -DECL_FUNC_PTR(krb5_free_data); -DECL_FUNC_PTR(krb5_free_data_contents); -DECL_FUNC_PTR(krb5_free_unparsed_name); -DECL_FUNC_PTR(krb5_os_localaddr); -DECL_FUNC_PTR(krb5_copy_keyblock_contents); -DECL_FUNC_PTR(krb5_copy_data); -DECL_FUNC_PTR(krb5_free_creds); -DECL_FUNC_PTR(krb5_build_principal); -DECL_FUNC_PTR(krb5_get_renewed_creds); -DECL_FUNC_PTR(krb5_get_default_config_files); -DECL_FUNC_PTR(krb5_free_config_files); -DECL_FUNC_PTR(krb5_get_default_realm); -DECL_FUNC_PTR(krb5_free_default_realm); -DECL_FUNC_PTR(krb5_free_ticket); -DECL_FUNC_PTR(krb5_decode_ticket); -DECL_FUNC_PTR(krb5_get_host_realm); -DECL_FUNC_PTR(krb5_free_host_realm); -DECL_FUNC_PTR(krb5_free_addresses); -DECL_FUNC_PTR(krb5_c_random_make_octets); - -// Krb524 functions -DECL_FUNC_PTR(krb524_init_ets); -DECL_FUNC_PTR(krb524_convert_creds_kdc); - -// krb4 functions -DECL_FUNC_PTR(krb_get_cred); -DECL_FUNC_PTR(tkt_string); -DECL_FUNC_PTR(krb_get_tf_realm); -DECL_FUNC_PTR(krb_mk_req); - -// ComErr functions -DECL_FUNC_PTR(com_err); -DECL_FUNC_PTR(error_message); - -// Profile functions -DECL_FUNC_PTR(profile_init); -DECL_FUNC_PTR(profile_release); -DECL_FUNC_PTR(profile_get_subsection_names); -DECL_FUNC_PTR(profile_free_list); -DECL_FUNC_PTR(profile_get_string); -DECL_FUNC_PTR(profile_release_string); - -// Service functions -DECL_FUNC_PTR(OpenSCManagerA); -DECL_FUNC_PTR(OpenServiceA); -DECL_FUNC_PTR(QueryServiceStatus); -DECL_FUNC_PTR(CloseServiceHandle); -#ifdef USE_MS2MIT -DECL_FUNC_PTR(LsaNtStatusToWinError); -#endif /* USE_MS2MIT */ - -#ifdef USE_MS2MIT -// LSA Functions -DECL_FUNC_PTR(LsaConnectUntrusted); -DECL_FUNC_PTR(LsaLookupAuthenticationPackage); -DECL_FUNC_PTR(LsaCallAuthenticationPackage); -DECL_FUNC_PTR(LsaFreeReturnBuffer); -DECL_FUNC_PTR(LsaGetLogonSessionData); -#endif /* USE_MS2MIT */ - -// CCAPI -FUNC_INFO ccapi_fi[] = { - MAKE_FUNC_INFO(cc_initialize), - MAKE_FUNC_INFO(cc_shutdown), - MAKE_FUNC_INFO(cc_get_NC_info), - MAKE_FUNC_INFO(cc_free_NC_info), - END_FUNC_INFO -}; - -FUNC_INFO leash_fi[] = { - MAKE_FUNC_INFO(Leash_get_default_lifetime), - MAKE_FUNC_INFO(Leash_get_default_renew_till), - MAKE_FUNC_INFO(Leash_get_default_forwardable), - MAKE_FUNC_INFO(Leash_get_default_noaddresses), - MAKE_FUNC_INFO(Leash_get_default_proxiable), - MAKE_FUNC_INFO(Leash_get_default_publicip), - MAKE_FUNC_INFO(Leash_get_default_use_krb4), - MAKE_FUNC_INFO(Leash_get_default_life_min), - MAKE_FUNC_INFO(Leash_get_default_life_max), - MAKE_FUNC_INFO(Leash_get_default_renew_min), - MAKE_FUNC_INFO(Leash_get_default_renew_max), - MAKE_FUNC_INFO(Leash_get_default_renewable), - END_FUNC_INFO -}; - -FUNC_INFO leash_opt_fi[] = { - MAKE_FUNC_INFO(Leash_get_default_mslsa_import), - END_FUNC_INFO -}; - -FUNC_INFO k5_fi[] = { - MAKE_FUNC_INFO(krb5_change_password), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_init), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_tkt_life), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_renew_life), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_forwardable), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_proxiable), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_address_list), - MAKE_FUNC_INFO(krb5_get_init_creds_password), - MAKE_FUNC_INFO(krb5_build_principal_ext), - MAKE_FUNC_INFO(krb5_cc_get_name), - MAKE_FUNC_INFO(krb5_cc_resolve), - MAKE_FUNC_INFO(krb5_cc_default), - MAKE_FUNC_INFO(krb5_cc_default_name), - MAKE_FUNC_INFO(krb5_cc_set_default_name), - MAKE_FUNC_INFO(krb5_cc_initialize), - MAKE_FUNC_INFO(krb5_cc_destroy), - MAKE_FUNC_INFO(krb5_cc_close), - MAKE_FUNC_INFO(krb5_cc_copy_creds), - MAKE_FUNC_INFO(krb5_cc_store_cred), - MAKE_FUNC_INFO(krb5_cc_retrieve_cred), - MAKE_FUNC_INFO(krb5_cc_get_principal), - MAKE_FUNC_INFO(krb5_cc_start_seq_get), - MAKE_FUNC_INFO(krb5_cc_next_cred), - MAKE_FUNC_INFO(krb5_cc_end_seq_get), - MAKE_FUNC_INFO(krb5_cc_remove_cred), - MAKE_FUNC_INFO(krb5_cc_set_flags), - MAKE_FUNC_INFO(krb5_cc_get_type), - MAKE_FUNC_INFO(krb5_free_context), - MAKE_FUNC_INFO(krb5_free_cred_contents), - MAKE_FUNC_INFO(krb5_free_principal), - MAKE_FUNC_INFO(krb5_get_in_tkt_with_password), - MAKE_FUNC_INFO(krb5_init_context), - MAKE_FUNC_INFO(krb5_parse_name), - MAKE_FUNC_INFO(krb5_timeofday), - MAKE_FUNC_INFO(krb5_timestamp_to_sfstring), - MAKE_FUNC_INFO(krb5_unparse_name), - MAKE_FUNC_INFO(krb5_get_credentials), - MAKE_FUNC_INFO(krb5_mk_req), - MAKE_FUNC_INFO(krb5_sname_to_principal), - MAKE_FUNC_INFO(krb5_get_credentials_renew), - MAKE_FUNC_INFO(krb5_free_data), - MAKE_FUNC_INFO(krb5_free_data_contents), - MAKE_FUNC_INFO(krb5_free_unparsed_name), - MAKE_FUNC_INFO(krb5_os_localaddr), - MAKE_FUNC_INFO(krb5_copy_keyblock_contents), - MAKE_FUNC_INFO(krb5_copy_data), - MAKE_FUNC_INFO(krb5_free_creds), - MAKE_FUNC_INFO(krb5_build_principal), - MAKE_FUNC_INFO(krb5_get_renewed_creds), - MAKE_FUNC_INFO(krb5_free_addresses), - MAKE_FUNC_INFO(krb5_get_default_config_files), - MAKE_FUNC_INFO(krb5_free_config_files), - MAKE_FUNC_INFO(krb5_get_default_realm), - MAKE_FUNC_INFO(krb5_free_default_realm), - MAKE_FUNC_INFO(krb5_free_ticket), - MAKE_FUNC_INFO(krb5_decode_ticket), - MAKE_FUNC_INFO(krb5_get_host_realm), - MAKE_FUNC_INFO(krb5_free_host_realm), - MAKE_FUNC_INFO(krb5_free_addresses), - MAKE_FUNC_INFO(krb5_c_random_make_octets), - END_FUNC_INFO -}; - -#ifdef USE_KRB4 -FUNC_INFO k4_fi[] = { - MAKE_FUNC_INFO(krb_get_cred), - MAKE_FUNC_INFO(krb_get_tf_realm), - MAKE_FUNC_INFO(krb_mk_req), - MAKE_FUNC_INFO(tkt_string), - END_FUNC_INFO -}; -#endif - -FUNC_INFO k524_fi[] = { - MAKE_FUNC_INFO(krb524_init_ets), - MAKE_FUNC_INFO(krb524_convert_creds_kdc), - END_FUNC_INFO -}; - -FUNC_INFO profile_fi[] = { - MAKE_FUNC_INFO(profile_init), - MAKE_FUNC_INFO(profile_release), - MAKE_FUNC_INFO(profile_get_subsection_names), - MAKE_FUNC_INFO(profile_free_list), - MAKE_FUNC_INFO(profile_get_string), - MAKE_FUNC_INFO(profile_release_string), - END_FUNC_INFO -}; - -FUNC_INFO ce_fi[] = { - MAKE_FUNC_INFO(com_err), - MAKE_FUNC_INFO(error_message), - END_FUNC_INFO -}; - -FUNC_INFO service_fi[] = { - MAKE_FUNC_INFO(OpenSCManagerA), - MAKE_FUNC_INFO(OpenServiceA), - MAKE_FUNC_INFO(QueryServiceStatus), - MAKE_FUNC_INFO(CloseServiceHandle), -#ifdef USE_MS2MIT - MAKE_FUNC_INFO(LsaNtStatusToWinError), -#endif /* USE_MS2MIT */ - END_FUNC_INFO -}; - -#ifdef USE_MS2MIT -FUNC_INFO lsa_fi[] = { - MAKE_FUNC_INFO(LsaConnectUntrusted), - MAKE_FUNC_INFO(LsaLookupAuthenticationPackage), - MAKE_FUNC_INFO(LsaCallAuthenticationPackage), - MAKE_FUNC_INFO(LsaFreeReturnBuffer), - MAKE_FUNC_INFO(LsaGetLogonSessionData), - END_FUNC_INFO -}; -#endif /* USE_MS2MIT */ - -/* Static Prototypes */ -char *afs_realm_of_cell(krb5_context, struct afsconf_cell *); -static long get_cellconfig_callback(void *, struct sockaddr_in *, char *); -int KFW_AFS_get_cellconfig(char *, struct afsconf_cell *, char *); -static krb5_error_code KRB5_CALLCONV KRB5_prompter( krb5_context context, - void *data, const char *name, const char *banner, int num_prompts, - krb5_prompt prompts[]); - - -/* Static Declarations */ -static int inited = 0; -static int mid_cnt = 0; -static struct textField * mid_tb = NULL; -static HINSTANCE hKrb5 = 0; -#ifdef USE_KRB4 -static HINSTANCE hKrb4 = 0; -#endif /* USE_KRB4 */ -static HINSTANCE hKrb524 = 0; -#ifdef USE_MS2MIT -static HINSTANCE hSecur32 = 0; -#endif /* USE_MS2MIT */ -static HINSTANCE hAdvApi32 = 0; -static HINSTANCE hComErr = 0; -static HINSTANCE hService = 0; -static HINSTANCE hProfile = 0; -static HINSTANCE hLeash = 0; -static HINSTANCE hLeashOpt = 0; -static HINSTANCE hCCAPI = 0; -static struct principal_ccache_data * princ_cc_data = NULL; -static struct cell_principal_map * cell_princ_map = NULL; - -void -KFW_initialize(void) -{ - static int inited = 0; - - if ( !inited ) { - char mutexName[MAX_PATH]; - HANDLE hMutex = NULL; - - sprintf(mutexName, "AFS KFW Init pid=%d", getpid()); - - hMutex = CreateMutex( NULL, TRUE, mutexName ); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) { - if ( WaitForSingleObject( hMutex, INFINITE ) != WAIT_OBJECT_0 ) { - return; - } - } - if ( !inited ) { - inited = 1; - LoadFuncs(KRB5_DLL, k5_fi, &hKrb5, 0, 1, 0, 0); -#ifdef USE_KRB4 - LoadFuncs(KRB4_DLL, k4_fi, &hKrb4, 0, 1, 0, 0); -#endif /* USE_KRB4 */ - LoadFuncs(COMERR_DLL, ce_fi, &hComErr, 0, 0, 1, 0); - LoadFuncs(SERVICE_DLL, service_fi, &hService, 0, 1, 0, 0); -#ifdef USE_MS2MIT - LoadFuncs(SECUR32_DLL, lsa_fi, &hSecur32, 0, 1, 1, 1); -#endif /* USE_MS2MIT */ - LoadFuncs(KRB524_DLL, k524_fi, &hKrb524, 0, 1, 1, 1); - LoadFuncs(PROFILE_DLL, profile_fi, &hProfile, 0, 1, 0, 0); - LoadFuncs(LEASH_DLL, leash_fi, &hLeash, 0, 1, 0, 0); - LoadFuncs(CCAPI_DLL, ccapi_fi, &hCCAPI, 0, 1, 0, 0); - LoadFuncs(LEASH_DLL, leash_opt_fi, &hLeashOpt, 0, 1, 0, 0); - - if ( KFW_is_available() ) { - char rootcell[MAXCELLCHARS+1]; -#ifdef USE_MS2MIT - KFW_import_windows_lsa(); -#endif /* USE_MS2MIT */ - KFW_import_ccache_data(); - KFW_AFS_renew_expiring_tokens(); - - /* WIN32 NOTE: no way to get max chars */ - if (!cm_GetRootCellName(rootcell)) - KFW_AFS_renew_token_for_cell(rootcell); - } - } - ReleaseMutex(hMutex); - CloseHandle(hMutex); - } -} - -void -KFW_cleanup(void) -{ - if (hLeashOpt) - FreeLibrary(hLeashOpt); - if (hCCAPI) - FreeLibrary(hCCAPI); - if (hLeash) - FreeLibrary(hLeash); - if (hKrb524) - FreeLibrary(hKrb524); -#ifdef USE_MS2MIT - if (hSecur32) - FreeLibrary(hSecur32); -#endif /* USE_MS2MIT */ - if (hService) - FreeLibrary(hService); - if (hComErr) - FreeLibrary(hComErr); - if (hProfile) - FreeLibrary(hProfile); -#ifdef USE_KRB4 - if (hKrb4) - FreeLibrary(hKrb4); -#endif /* USE_KRB4 */ - if (hKrb5) - FreeLibrary(hKrb5); -} - -int -KFW_use_krb524(void) -{ - HKEY parmKey; - DWORD code, len; - DWORD use524 = 0; - - code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - len = sizeof(use524); - code = RegQueryValueEx(parmKey, "Use524", NULL, NULL, - (BYTE *) &use524, &len); - RegCloseKey(parmKey); - } - if (code != ERROR_SUCCESS) { - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - len = sizeof(use524); - code = RegQueryValueEx(parmKey, "Use524", NULL, NULL, - (BYTE *) &use524, &len); - RegCloseKey (parmKey); - } - } - return use524; -} - -int -KFW_is_available(void) -{ - HKEY parmKey; - DWORD code, len; - DWORD enableKFW = 1; - - code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - len = sizeof(enableKFW); - code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL, - (BYTE *) &enableKFW, &len); - RegCloseKey (parmKey); - } - - if (code != ERROR_SUCCESS) { - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - len = sizeof(enableKFW); - code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL, - (BYTE *) &enableKFW, &len); - RegCloseKey (parmKey); - } - } - - if ( !enableKFW ) - return FALSE; - - KFW_initialize(); - if ( hKrb5 && hComErr && hService && -#ifdef USE_MS2MIT - hSecur32 && -#endif /* USE_MS2MIT */ - hKrb524 && - hProfile && hLeash && hCCAPI ) - return TRUE; - return FALSE; -} - -int -KRB5_error(krb5_error_code rc, LPCSTR FailedFunctionName, - int FreeContextFlag, krb5_context * ctx, - krb5_ccache * cache) -{ - char message[256]; - const char *errText; - int krb5Error = ((int)(rc & 255)); - - /* - switch (krb5Error) - { - // Wrong password - case 31: - case 8: - return; - } - */ - - errText = perror_message(rc); - _snprintf(message, sizeof(message), - "%s\n(Kerberos error %ld)\n\n%s failed", - errText, - krb5Error, - FailedFunctionName); - - if ( IsDebuggerPresent() ) - OutputDebugString(message); - - MessageBox(NULL, message, "Kerberos Five", MB_OK | MB_ICONERROR | - MB_TASKMODAL | - MB_SETFOREGROUND); - if (FreeContextFlag == 1) - { - if (ctx && *ctx != NULL) - { - if (cache && *cache != NULL) { - pkrb5_cc_close(*ctx, *cache); - *cache = NULL; - } - - pkrb5_free_context(*ctx); - *ctx = NULL; - } - } - - return rc; -} - -void -KFW_AFS_update_princ_ccache_data(krb5_context ctx, krb5_ccache cc, int lsa) -{ - struct principal_ccache_data * next = princ_cc_data; - krb5_principal principal = 0; - char * pname = NULL; - const char * ccname = NULL; - krb5_error_code code = 0; - krb5_error_code cc_code = 0; - krb5_cc_cursor cur; - krb5_creds creds; - krb5_flags flags=0; - krb5_timestamp now; - - if (ctx == 0 || cc == 0) - return; - - code = pkrb5_cc_get_principal(ctx, cc, &principal); - if ( code ) return; - - code = pkrb5_unparse_name(ctx, principal, &pname); - if ( code ) goto cleanup; - - ccname = pkrb5_cc_get_name(ctx, cc); - if (!ccname) goto cleanup; - - // Search the existing list to see if we have a match - if ( next ) { - for ( ; next ; next = next->next ) { - if ( !strcmp(next->principal,pname) && !strcmp(next->ccache_name, ccname) ) - break; - } - } - - // If not, match add a new node to the beginning of the list and assign init it - if ( !next ) { - next = (struct principal_ccache_data *) malloc(sizeof(struct principal_ccache_data)); - next->next = princ_cc_data; - princ_cc_data = next; - next->principal = _strdup(pname); - next->ccache_name = _strdup(ccname); - next->from_lsa = lsa; - next->expired = 1; - next->expiration_time = 0; - next->renew = 0; - } - - flags = 0; // turn off OPENCLOSE mode - code = pkrb5_cc_set_flags(ctx, cc, flags); - if ( code ) goto cleanup; - - code = pkrb5_timeofday(ctx, &now); - - cc_code = pkrb5_cc_start_seq_get(ctx, cc, &cur); - - while (!(cc_code = pkrb5_cc_next_cred(ctx, cc, &cur, &creds))) { - if ( creds.ticket_flags & TKT_FLG_INITIAL ) { - int valid; - // we found the ticket we are looking for - // check validity of timestamp - // We add a 5 minutes fudge factor to compensate for potential - // clock skew errors between the KDC and client OS - - valid = ((creds.times.starttime > 0) && - now >= (creds.times.starttime - 300) && - now < (creds.times.endtime + 300) && - !(creds.ticket_flags & TKT_FLG_INVALID)); - - if ( next->from_lsa) { - next->expired = 0; - next->expiration_time = creds.times.endtime; - next->renew = 1; - } else if ( valid ) { - next->expired = 0; - next->expiration_time = creds.times.endtime; - next->renew = (creds.times.renew_till > creds.times.endtime) && - (creds.ticket_flags & TKT_FLG_RENEWABLE); - } else { - next->expired = 1; - next->expiration_time = 0; - next->renew = 0; - } - - pkrb5_free_cred_contents(ctx, &creds); - cc_code = KRB5_CC_END; - break; - } - pkrb5_free_cred_contents(ctx, &creds); - } - - if (cc_code == KRB5_CC_END) { - code = pkrb5_cc_end_seq_get(ctx, cc, &cur); - if (code) goto cleanup; - } - - cleanup: - flags = KRB5_TC_OPENCLOSE; //turn on OPENCLOSE - code = pkrb5_cc_set_flags(ctx, cc, flags); - - if ( pname ) - pkrb5_free_unparsed_name(ctx,pname); - if ( principal ) - pkrb5_free_principal(ctx,principal); -} - -int -KFW_AFS_find_ccache_for_principal(krb5_context ctx, char * principal, char **ccache, int valid_only) -{ - struct principal_ccache_data * next = princ_cc_data; - char * response = NULL; - - if ( !principal || !ccache ) - return 0; - - while ( next ) { - if ( (!valid_only || !next->expired) && !strcmp(next->principal,principal) ) { - if (response) { - // we always want to prefer the MS Kerberos LSA cache or - // the cache afscreds created specifically for the principal - // if the current entry is either one, drop the previous find - if ( next->from_lsa || !strcmp(next->ccache_name,principal) ) - free(response); - } - response = _strdup(next->ccache_name); - // MS Kerberos LSA is our best option so use it and quit - if ( next->from_lsa ) - break; - } - next = next->next; - } - - if ( response ) { - *ccache = response; - return 1; - } - return 0; -} - -void -KFW_AFS_delete_princ_ccache_data(krb5_context ctx, char * pname, char * ccname) -{ - struct principal_ccache_data ** next = &princ_cc_data; - - if ( !pname && !ccname ) - return; - - while ( (*next) ) { - if ( !strcmp((*next)->principal,pname) || - !strcmp((*next)->ccache_name,ccname) ) { - void * temp; - free((*next)->principal); - free((*next)->ccache_name); - temp = (*next); - (*next) = (*next)->next; - free(temp); - } - } -} - -void -KFW_AFS_update_cell_princ_map(krb5_context ctx, char * cell, char *pname, int active) -{ - struct cell_principal_map * next = cell_princ_map; - - // Search the existing list to see if we have a match - if ( next ) { - for ( ; next ; next = next->next ) { - if ( !strcmp(next->cell, cell) ) { - if ( !strcmp(next->principal,pname) ) { - next->active = active; - break; - } else { - // OpenAFS currently has a restriction of one active token per cell - // Therefore, whenever we update the table with a new active cell we - // must mark all of the other principal to cell entries as inactive. - if (active) - next->active = 0; - } - } - } - } - - // If not, match add a new node to the beginning of the list and assign init it - if ( !next ) { - next = (struct cell_principal_map *) malloc(sizeof(struct cell_principal_map)); - next->next = cell_princ_map; - cell_princ_map = next; - next->principal = _strdup(pname); - next->cell = _strdup(cell); - next->active = active; - } -} - -void -KFW_AFS_delete_cell_princ_maps(krb5_context ctx, char * pname, char * cell) -{ - struct cell_principal_map ** next = &cell_princ_map; - - if ( !pname && !cell ) - return; - - while ( (*next) ) { - if ( !strcmp((*next)->principal,pname) || - !strcmp((*next)->cell,cell) ) { - void * temp; - free((*next)->principal); - free((*next)->cell); - temp = (*next); - (*next) = (*next)->next; - free(temp); - } - } -} - -// Returns (if possible) a principal which has been known in -// the past to have been used to obtain tokens for the specified -// cell. -// TODO: Attempt to return one which has not yet expired by checking -// the principal/ccache data -int -KFW_AFS_find_principals_for_cell(krb5_context ctx, char * cell, char **principals[], int active_only) -{ - struct cell_principal_map * next_map = cell_princ_map; - const char * princ = NULL; - int count = 0, i; - - if ( !cell ) - return 0; - - while ( next_map ) { - if ( (!active_only || next_map->active) && !strcmp(next_map->cell,cell) ) { - count++; - } - next_map = next_map->next; - } - - if ( !principals || !count ) - return count; - - *principals = (char **) malloc(sizeof(char *) * count); - for ( next_map = cell_princ_map, i=0 ; next_map && inext ) - { - if ( (!active_only || next_map->active) && !strcmp(next_map->cell,cell) ) { - (*principals)[i++] = _strdup(next_map->principal); - } - } - return count; -} - -int -KFW_AFS_find_cells_for_princ(krb5_context ctx, char * pname, char **cells[], int active_only) -{ - int count = 0, i; - struct cell_principal_map * next_map = cell_princ_map; - const char * princ = NULL; - - if ( !pname ) - return 0; - - while ( next_map ) { - if ( (!active_only || next_map->active) && !strcmp(next_map->principal,pname) ) { - count++; - } - next_map = next_map->next; - } - - if ( !cells ) - return count; - - *cells = (char **) malloc(sizeof(char *) * count); - for ( next_map = cell_princ_map, i=0 ; next_map && inext ) - { - if ( (!active_only || next_map->active) && !strcmp(next_map->principal,pname) ) { - (*cells)[i++] = _strdup(next_map->cell); - } - } - return count; -} - -/* Given a principal return an existing ccache or create one and return */ -int -KFW_get_ccache(krb5_context alt_ctx, krb5_principal principal, krb5_ccache * cc) -{ - krb5_context ctx; - char * pname = 0; - char * ccname = 0; - krb5_error_code code; - - if (!pkrb5_init_context) - return 0; - - if ( alt_ctx ) { - ctx = alt_ctx; - } else { - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - } - - if ( principal ) { - code = pkrb5_unparse_name(ctx, principal, &pname); - if (code) goto cleanup; - - if ( !KFW_AFS_find_ccache_for_principal(ctx,pname,&ccname,TRUE) && - !KFW_AFS_find_ccache_for_principal(ctx,pname,&ccname,FALSE)) { - ccname = (char *)malloc(strlen(pname) + 5); - sprintf(ccname,"API:%s",pname); - } - code = pkrb5_cc_resolve(ctx, ccname, cc); - } else { - code = pkrb5_cc_default(ctx, cc); - if (code) goto cleanup; - } - - cleanup: - if (ccname) - free(ccname); - if (pname) - pkrb5_free_unparsed_name(ctx,pname); - if (ctx && (ctx != alt_ctx)) - pkrb5_free_context(ctx); - return(code); -} - -#ifdef USE_MS2MIT -// Import Microsoft Credentials into a new MIT ccache -void -KFW_import_windows_lsa(void) -{ - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_principal princ = 0; - char * pname = NULL; - krb5_data * princ_realm; - krb5_error_code code; - char cell[128]="", realm[128]="", *def_realm = 0; - int i; - DWORD dwMsLsaImport; - - if (!pkrb5_init_context) - return; - -#ifdef COMMENT - if ( !MSLSA_IsKerberosLogon() ) - return; -#endif - - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - - code = pkrb5_cc_resolve(ctx, LSA_CCNAME, &cc); - if (code) goto cleanup; - - KFW_AFS_update_princ_ccache_data(ctx, cc, TRUE); - - code = pkrb5_cc_get_principal(ctx, cc, &princ); - if ( code ) goto cleanup; - - dwMsLsaImport = pLeash_get_default_mslsa_import ? pLeash_get_default_mslsa_import() : 1; - switch ( dwMsLsaImport ) { - case 0: /* do not import */ - goto cleanup; - case 1: /* always import */ - break; - case 2: { /* matching realm */ - char ms_realm[128] = "", *r; - int i; - - for ( r=ms_realm, i=0; ilength; r++, i++ ) { - *r = krb5_princ_realm(ctx, princ)->data[i]; - } - *r = '\0'; - - if (code = pkrb5_get_default_realm(ctx, &def_realm)) - goto cleanup; - - if (strcmp(def_realm, ms_realm)) - goto cleanup; - break; - } - default: - break; - } - - code = pkrb5_unparse_name(ctx,princ,&pname); - if ( code ) goto cleanup; - - princ_realm = krb5_princ_realm(ctx, princ); - for ( i=0; ilength; i++ ) { - realm[i] = princ_realm->data[i]; - cell[i] = tolower(princ_realm->data[i]); - } - cell[i] = '\0'; - realm[i] = '\0'; - - code = KFW_AFS_klog(ctx, cc, "afs", cell, realm, pLeash_get_default_lifetime(),NULL); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_AFS_klog() returns: %d\n",code); - OutputDebugString(message); - } - if ( code ) goto cleanup; - - KFW_AFS_update_cell_princ_map(ctx, cell, pname, TRUE); - - cleanup: - if (pname) - pkrb5_free_unparsed_name(ctx,pname); - if (princ) - pkrb5_free_principal(ctx,princ); - if (def_realm) - pkrb5_free_default_realm(ctx, def_realm); - if (cc) - pkrb5_cc_close(ctx,cc); - if (ctx) - pkrb5_free_context(ctx); -} -#endif /* USE_MS2MIT */ - -// If there are existing MIT credentials, copy them to a new -// ccache named after the principal - -// Enumerate all existing MIT ccaches and construct entries -// in the principal_ccache table - -// Enumerate all existing AFS Tokens and construct entries -// in the cell_principal table -void -KFW_import_ccache_data(void) -{ - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_principal principal = 0; - krb5_creds creds; - krb5_error_code code; - krb5_error_code cc_code; - krb5_cc_cursor cur; - apiCB * cc_ctx = 0; - struct _infoNC ** pNCi = NULL; - int i, j, flags; - - if ( !pcc_initialize ) - return; - - if ( IsDebuggerPresent() ) - OutputDebugString("KFW_import_ccache_data()\n"); - - code = pcc_initialize(&cc_ctx, CC_API_VER_2, NULL, NULL); - if (code) goto cleanup; - - code = pcc_get_NC_info(cc_ctx, &pNCi); - if (code) goto cleanup; - - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - - for ( i=0; pNCi[i]; i++ ) { - if ( pNCi[i]->vers != CC_CRED_V5 ) - continue; - if ( IsDebuggerPresent() ) { - OutputDebugString("Principal: "); - OutputDebugString(pNCi[i]->principal); - OutputDebugString(" in ccache "); - OutputDebugString(pNCi[i]->name); - OutputDebugString("\n"); - } - if ( strcmp(pNCi[i]->name,pNCi[i]->principal) - && strcmp(pNCi[i]->name,LSA_CCNAME) - ) { - int found = 0; - for ( j=0; pNCi[j]; j++ ) { - if (!strcmp(pNCi[j]->name,pNCi[i]->principal)) { - found = 1; - break; - } - } - - code = pkrb5_cc_resolve(ctx, pNCi[i]->principal, &cc); - if (code) goto loop_cleanup; - - if (!found) { - krb5_ccache oldcc = 0; - - if ( IsDebuggerPresent() ) - OutputDebugString("copying ccache data to new ccache\n"); - - code = pkrb5_parse_name(ctx, pNCi[i]->principal, &principal); - if (code) goto loop_cleanup; - code = pkrb5_cc_initialize(ctx, cc, principal); - if (code) goto loop_cleanup; - - code = pkrb5_cc_resolve(ctx, pNCi[i]->name, &oldcc); - if (code) goto loop_cleanup; - code = pkrb5_cc_copy_creds(ctx,oldcc,cc); - if (code) { - code = pkrb5_cc_close(ctx,cc); - cc = 0; - code = pkrb5_cc_close(ctx,oldcc); - cc = 0; - KRB5_error(code, "krb5_cc_copy_creds", 0, NULL, NULL); - continue; - } - code = pkrb5_cc_close(ctx,oldcc); - } - } else { - code = pkrb5_cc_resolve(ctx, pNCi[i]->name, &cc); - if (code) goto loop_cleanup; - } - - flags = 0; // turn off OPENCLOSE mode - code = pkrb5_cc_set_flags(ctx, cc, flags); - if ( code ) goto cleanup; - - KFW_AFS_update_princ_ccache_data(ctx, cc, !strcmp(pNCi[i]->name,LSA_CCNAME)); - - cc_code = pkrb5_cc_start_seq_get(ctx, cc, &cur); - - while (!(cc_code = pkrb5_cc_next_cred(ctx, cc, &cur, &creds))) { - krb5_data * sname = krb5_princ_name(ctx, creds.server); - krb5_data * cell = krb5_princ_component(ctx, creds.server, 1); - krb5_data * realm = krb5_princ_realm(ctx, creds.server); - if ( sname && cell && !strcmp("afs",sname->data) ) { - struct ktc_principal aserver; - struct ktc_principal aclient; - struct ktc_token atoken; - int active = TRUE; - - if ( IsDebuggerPresent() ) { - OutputDebugString("Found AFS ticket: "); - OutputDebugString(sname->data); - if ( cell->data ) { - OutputDebugString("/"); - OutputDebugString(cell->data); - } - OutputDebugString("@"); - OutputDebugString(realm->data); - OutputDebugString("\n"); - } - - memset(&aserver, '\0', sizeof(aserver)); - strcpy(aserver.name, sname->data); - strcpy(aserver.cell, cell->data); - - code = ktc_GetToken(&aserver, &atoken, sizeof(atoken), &aclient); - if (!code) { - // Found a token in AFS Client Server which matches - char pname[128], *p, *q; - for ( p=pname, q=aclient.name; *q; p++, q++) - *p = *q; - for ( *p++ = '@', q=aclient.cell; *q; p++, q++) - *p = toupper(*q); - *p = '\0'; - - if ( IsDebuggerPresent() ) { - OutputDebugString("Found AFS token: "); - OutputDebugString(pname); - OutputDebugString("\n"); - } - - if ( strcmp(pname,pNCi[i]->principal) ) - active = FALSE; - KFW_AFS_update_cell_princ_map(ctx, cell->data, pNCi[i]->principal, active); - } else { - // Attempt to import it - KFW_AFS_update_cell_princ_map(ctx, cell->data, pNCi[i]->principal, active); - - if ( IsDebuggerPresent() ) { - OutputDebugString("Calling KFW_AFS_klog() to obtain token\n"); - } - - code = KFW_AFS_klog(ctx, cc, "afs", cell->data, realm->data, pLeash_get_default_lifetime(),NULL); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_AFS_klog() returns: %d\n",code); - OutputDebugString(message); - } - } - } else if ( IsDebuggerPresent() ) { - OutputDebugString("Found ticket: "); - OutputDebugString(sname->data); - if ( cell && cell->data ) { - OutputDebugString("/"); - OutputDebugString(cell->data); - } - OutputDebugString("@"); - OutputDebugString(realm->data); - OutputDebugString("\n"); - } - pkrb5_free_cred_contents(ctx, &creds); - } - - if (cc_code == KRB5_CC_END) { - cc_code = pkrb5_cc_end_seq_get(ctx, cc, &cur); - if (cc_code) goto loop_cleanup; - } - - loop_cleanup: - flags = KRB5_TC_OPENCLOSE; //turn on OPENCLOSE - code = pkrb5_cc_set_flags(ctx, cc, flags); - if (cc) { - pkrb5_cc_close(ctx,cc); - cc = 0; - } - if (principal) { - pkrb5_free_principal(ctx,principal); - principal = 0; - } - } - - cleanup: - if (ctx) - pkrb5_free_context(ctx); - if (pNCi) - pcc_free_NC_info(cc_ctx, &pNCi); - if (cc_ctx) - pcc_shutdown(&cc_ctx); -} - - -int -KFW_AFS_get_cred( char * username, - char * cell, - char * password, - int lifetime, - char * smbname, - char ** reasonP ) -{ - krb5_context ctx = 0; - krb5_ccache cc = 0; - char * realm = 0, * userrealm = 0; - krb5_principal principal = 0; - char * pname = 0; - krb5_error_code code; - char local_cell[MAXCELLCHARS+1]; - char **cells = NULL; - int cell_count=0; - struct afsconf_cell cellconfig; - char * dot; - - - if (!pkrb5_init_context) - return 0; - - if ( IsDebuggerPresent() ) { - OutputDebugString("KFW_AFS_get_cred for token "); - OutputDebugString(username); - OutputDebugString(" in cell "); - OutputDebugString(cell); - OutputDebugString("\n"); - } - - code = pkrb5_init_context(&ctx); - if ( code ) goto cleanup; - - code = KFW_AFS_get_cellconfig( cell, (void*)&cellconfig, local_cell); - if ( code ) goto cleanup; - - realm = afs_realm_of_cell(ctx, &cellconfig); // do not free - - userrealm = strchr(username,'@'); - if ( userrealm ) { - pname = strdup(username); - userrealm = strchr(pname, '@'); - *userrealm = '\0'; - - /* handle kerberos iv notation */ - while ( dot = strchr(pname,'.') ) { - *dot = '/'; - } - *userrealm++ = '@'; - } else { - pname = malloc(strlen(username) + strlen(realm) + 2); - - strcpy(pname, username); - - /* handle kerberos iv notation */ - while ( dot = strchr(pname,'.') ) { - *dot = '/'; - } - - strcat(pname,"@"); - strcat(pname,realm); - } - if ( IsDebuggerPresent() ) { - OutputDebugString("Realm: "); - OutputDebugString(realm); - OutputDebugString("\n"); - } - - code = pkrb5_parse_name(ctx, pname, &principal); - if ( code ) goto cleanup; - - code = KFW_get_ccache(ctx, principal, &cc); - if ( code ) goto cleanup; - - if ( lifetime == 0 ) - lifetime = pLeash_get_default_lifetime(); - - if ( password && password[0] ) { - code = KFW_kinit( ctx, cc, HWND_DESKTOP, - pname, - password, - lifetime, - pLeash_get_default_forwardable(), - pLeash_get_default_proxiable(), - pLeash_get_default_renewable() ? pLeash_get_default_renew_till() : 0, - pLeash_get_default_noaddresses(), - pLeash_get_default_publicip()); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_kinit() returns: %d\n",code); - OutputDebugString(message); - } - if ( code ) goto cleanup; - - KFW_AFS_update_princ_ccache_data(ctx, cc, FALSE); - } - - code = KFW_AFS_klog(ctx, cc, "afs", cell, realm, lifetime,smbname); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_AFS_klog() returns: %d\n",code); - OutputDebugString(message); - } - if ( code ) goto cleanup; - - KFW_AFS_update_cell_princ_map(ctx, cell, pname, TRUE); - - // Attempt to obtain new tokens for other cells supported by the same - // principal - cell_count = KFW_AFS_find_cells_for_princ(ctx, pname, &cells, TRUE); - if ( cell_count > 1 ) { - while ( cell_count-- ) { - if ( strcmp(cells[cell_count],cell) ) { - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"found another cell for the same principal: %s\n",cell); - OutputDebugString(message); - } - code = KFW_AFS_get_cellconfig( cells[cell_count], (void*)&cellconfig, local_cell); - if ( code ) continue; - - realm = afs_realm_of_cell(ctx, &cellconfig); // do not free - if ( IsDebuggerPresent() ) { - OutputDebugString("Realm: "); - OutputDebugString(realm); - OutputDebugString("\n"); - } - - code = KFW_AFS_klog(ctx, cc, "afs", cells[cell_count], realm, lifetime,smbname); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_AFS_klog() returns: %d\n",code); - OutputDebugString(message); - } - } - free(cells[cell_count]); - } - free(cells); - } else if ( cell_count == 1 ) { - free(cells[0]); - free(cells); - } - - cleanup: - if ( pname ) - free(pname); - if ( cc ) - pkrb5_cc_close(ctx, cc); - - if ( code && reasonP ) { - *reasonP = (char *)perror_message(code); - } - return(code); -} - -int -KFW_AFS_destroy_tickets_for_cell(char * cell) -{ - krb5_context ctx = 0; - krb5_error_code code; - int count; - char ** principals = NULL; - - if (!pkrb5_init_context) - return 0; - - if ( IsDebuggerPresent() ) { - OutputDebugString("KFW_AFS_destroy_ticets_for_cell: "); - OutputDebugString(cell); - OutputDebugString("\n"); - } - - code = pkrb5_init_context(&ctx); - if (code) ctx = 0; - - count = KFW_AFS_find_principals_for_cell(ctx, cell, &principals, FALSE); - if ( count > 0 ) { - krb5_principal princ = 0; - krb5_ccache cc = 0; - - while ( count-- ) { - int cell_count = KFW_AFS_find_cells_for_princ(ctx, principals[count], NULL, TRUE); - if ( cell_count > 1 ) { - // TODO - What we really should do here is verify whether or not any of the - // other cells which use this principal to obtain its credentials actually - // have valid tokens or not. If they are currently using these credentials - // we will skip them. For the time being we assume that if there is an active - // map in the table that they are actively being used. - goto loop_cleanup; - } - - code = pkrb5_parse_name(ctx, principals[count], &princ); - if (code) goto loop_cleanup; - - code = KFW_get_ccache(ctx, princ, &cc); - if (code) goto loop_cleanup; - - code = pkrb5_cc_destroy(ctx, cc); - if (!code) cc = 0; - - loop_cleanup: - if ( cc ) { - pkrb5_cc_close(ctx, cc); - cc = 0; - } - if ( princ ) { - pkrb5_free_principal(ctx, princ); - princ = 0; - } - - KFW_AFS_update_cell_princ_map(ctx, cell, principals[count], FALSE); - free(principals[count]); - } - free(principals); - } - pkrb5_free_context(ctx); - return 0; -} - -int -KFW_AFS_renew_expiring_tokens(void) -{ - krb5_error_code code = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_timestamp now; - struct principal_ccache_data * pcc_next = princ_cc_data; - int cell_count; - char ** cells=NULL; - const char * realm = NULL; - char local_cell[MAXCELLCHARS+1]=""; - struct afsconf_cell cellconfig; - - if (!pkrb5_init_context) - return 0; - - if ( pcc_next == NULL ) // nothing to do - return 0; - - if ( IsDebuggerPresent() ) { - OutputDebugString("KFW_AFS_renew_expiring_tokens\n"); - } - - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - - code = pkrb5_timeofday(ctx, &now); - if (code) goto cleanup; - - for ( ; pcc_next ; pcc_next = pcc_next->next ) { - if ( pcc_next->expired ) - continue; - - if ( now >= (pcc_next->expiration_time) ) { - if ( !pcc_next->from_lsa ) { - pcc_next->expired = 1; - continue; - } - } - - if ( pcc_next->renew && now >= (pcc_next->expiration_time - cminRENEW * csec1MINUTE) ) { - code = pkrb5_cc_resolve(ctx, pcc_next->ccache_name, &cc); - if ( code ) - goto loop_cleanup; - code = KFW_renew(ctx,cc); -#ifdef USE_MS2MIT - if ( code && pcc_next->from_lsa) - goto loop_cleanup; -#endif /* USE_MS2MIT */ - - - KFW_AFS_update_princ_ccache_data(ctx, cc, pcc_next->from_lsa); - if (code) goto loop_cleanup; - - // Attempt to obtain new tokens for other cells supported by the same - // principal - cell_count = KFW_AFS_find_cells_for_princ(ctx, pcc_next->principal, &cells, TRUE); - if ( cell_count > 0 ) { - while ( cell_count-- ) { - if ( IsDebuggerPresent() ) { - OutputDebugString("Cell: "); - OutputDebugString(cells[cell_count]); - OutputDebugString("\n"); - } - code = KFW_AFS_get_cellconfig( cells[cell_count], (void*)&cellconfig, local_cell); - if ( code ) continue; - realm = afs_realm_of_cell(ctx, &cellconfig); // do not free - if ( IsDebuggerPresent() ) { - OutputDebugString("Realm: "); - OutputDebugString(realm); - OutputDebugString("\n"); - } - code = KFW_AFS_klog(ctx, cc, "afs", cells[cell_count], (char *)realm, pLeash_get_default_lifetime(),NULL); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_AFS_klog() returns: %d\n",code); - OutputDebugString(message); - } - free(cells[cell_count]); - } - free(cells); - } - } - - loop_cleanup: - if ( cc ) { - pkrb5_cc_close(ctx,cc); - cc = 0; - } - } - - cleanup: - if ( cc ) - pkrb5_cc_close(ctx,cc); - if ( ctx ) - pkrb5_free_context(ctx); - - return 0; -} - - -BOOL -KFW_AFS_renew_token_for_cell(char * cell) -{ - krb5_error_code code = 0; - krb5_context ctx = 0; - int count; - char ** principals = NULL; - - if (!pkrb5_init_context) - return 0; - - if ( IsDebuggerPresent() ) { - OutputDebugString("KFW_AFS_renew_token_for_cell:"); - OutputDebugString(cell); - OutputDebugString("\n"); - } - - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - - count = KFW_AFS_find_principals_for_cell(ctx, cell, &principals, TRUE); - if ( count == 0 ) { - // We know we must have a credential somewhere since we are - // trying to renew a token - - KFW_import_ccache_data(); - count = KFW_AFS_find_principals_for_cell(ctx, cell, &principals, TRUE); - } - if ( count > 0 ) { - krb5_principal princ = 0; - krb5_principal service = 0; -#ifdef COMMENT - krb5_creds mcreds, creds; -#endif /* COMMENT */ - krb5_ccache cc = 0; - const char * realm = NULL; - struct afsconf_cell cellconfig; - char local_cell[MAXCELLCHARS+1]; - - while ( count-- ) { - code = pkrb5_parse_name(ctx, principals[count], &princ); - if (code) goto loop_cleanup; - - code = KFW_get_ccache(ctx, princ, &cc); - if (code) goto loop_cleanup; - - code = KFW_AFS_get_cellconfig( cell, (void*)&cellconfig, local_cell); - if ( code ) goto loop_cleanup; - - realm = afs_realm_of_cell(ctx, &cellconfig); // do not free - if ( IsDebuggerPresent() ) { - OutputDebugString("Realm: "); - OutputDebugString(realm); - OutputDebugString("\n"); - } - -#ifdef COMMENT - /* krb5_cc_remove_cred() is not implemented - * for a single cred - */ - code = pkrb5_build_principal(ctx, &service, strlen(realm), - realm, "afs", cell, NULL); - if (!code) { - memset(&mcreds, 0, sizeof(krb5_creds)); - mcreds.client = princ; - mcreds.server = service; - - code = pkrb5_cc_retrieve_cred(ctx, cc, 0, &mcreds, &creds); - if (!code) { - if ( IsDebuggerPresent() ) { - char * cname, *sname; - pkrb5_unparse_name(ctx, creds.client, &cname); - pkrb5_unparse_name(ctx, creds.server, &sname); - OutputDebugString("Removing credential for client \""); - OutputDebugString(cname); - OutputDebugString("\" and service \""); - OutputDebugString(sname); - OutputDebugString("\"\n"); - pkrb5_free_unparsed_name(ctx,cname); - pkrb5_free_unparsed_name(ctx,sname); - } - - code = pkrb5_cc_remove_cred(ctx, cc, 0, &creds); - pkrb5_free_principal(ctx, creds.client); - pkrb5_free_principal(ctx, creds.server); - } - } -#endif /* COMMENT */ - - code = KFW_AFS_klog(ctx, cc, "afs", cell, (char *)realm, pLeash_get_default_lifetime(),NULL); - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"KFW_AFS_klog() returns: %d\n",code); - OutputDebugString(message); - } - - loop_cleanup: - if (cc) { - pkrb5_cc_close(ctx, cc); - cc = 0; - } - if (princ) { - pkrb5_free_principal(ctx, princ); - princ = 0; - } - if (service) { - pkrb5_free_principal(ctx, service); - princ = 0; - } - - KFW_AFS_update_cell_princ_map(ctx, cell, principals[count], code ? FALSE : TRUE); - free(principals[count]); - } - free(principals); - } else - code = -1; // we did not renew the tokens - - cleanup: - pkrb5_free_context(ctx); - return (code ? FALSE : TRUE); - -} - -int -KFW_AFS_renew_tokens_for_all_cells(void) -{ - struct cell_principal_map * next = cell_princ_map; - - if ( IsDebuggerPresent() ) - OutputDebugString("KFW_AFS_renew_tokens_for_all()\n"); - - if ( !next ) - return 0; - - for ( ; next ; next = next->next ) { - if ( next->active ) - KFW_AFS_renew_token_for_cell(next->cell); - } - return 0; -} - -int -KFW_renew(krb5_context alt_ctx, krb5_ccache alt_cc) -{ - krb5_error_code code = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_principal me = 0; - krb5_principal server = 0; - krb5_creds my_creds; - krb5_data *realm = 0; - - if (!pkrb5_init_context) - return 0; - - memset(&my_creds, 0, sizeof(krb5_creds)); - - if ( alt_ctx ) { - ctx = alt_ctx; - } else { - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - } - - if ( alt_cc ) { - cc = alt_cc; - } else { - code = pkrb5_cc_default(ctx, &cc); - if (code) goto cleanup; - } - - code = pkrb5_cc_get_principal(ctx, cc, &me); - if (code) goto cleanup; - - realm = krb5_princ_realm(ctx, me); - - code = pkrb5_build_principal_ext(ctx, &server, - realm->length,realm->data, - KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME, - realm->length,realm->data, - 0); - if ( code ) - goto cleanup; - - if ( IsDebuggerPresent() ) { - char * cname, *sname; - pkrb5_unparse_name(ctx, me, &cname); - pkrb5_unparse_name(ctx, server, &sname); - OutputDebugString("Renewing credential for client \""); - OutputDebugString(cname); - OutputDebugString("\" and service \""); - OutputDebugString(sname); - OutputDebugString("\"\n"); - pkrb5_free_unparsed_name(ctx,cname); - pkrb5_free_unparsed_name(ctx,sname); - } - - my_creds.client = me; - my_creds.server = server; - - code = pkrb5_get_renewed_creds(ctx, &my_creds, me, cc, NULL); - if (code) { - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"krb5_get_renewed_creds() failed: %d\n",code); - OutputDebugString(message); - } - goto cleanup; - } - - code = pkrb5_cc_initialize(ctx, cc, me); - if (code) { - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"krb5_cc_initialize() failed: %d\n",code); - OutputDebugString(message); - } - goto cleanup; - } - - code = pkrb5_cc_store_cred(ctx, cc, &my_creds); - if (code) { - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"krb5_cc_store_cred() failed: %d\n",code); - OutputDebugString(message); - } - goto cleanup; - } - - cleanup: - if (my_creds.client == me) - my_creds.client = 0; - if (my_creds.server == server) - my_creds.server = 0; - pkrb5_free_cred_contents(ctx, &my_creds); - if (me) - pkrb5_free_principal(ctx, me); - if (server) - pkrb5_free_principal(ctx, server); - if (cc && (cc != alt_cc)) - pkrb5_cc_close(ctx, cc); - if (ctx && (ctx != alt_ctx)) - pkrb5_free_context(ctx); - return(code); -} - -int -KFW_kinit( krb5_context alt_ctx, - krb5_ccache alt_cc, - HWND hParent, - char *principal_name, - char *password, - krb5_deltat lifetime, - DWORD forwardable, - DWORD proxiable, - krb5_deltat renew_life, - DWORD addressless, - DWORD publicIP - ) -{ - krb5_error_code code = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_principal me = 0; - char* name = 0; - krb5_creds my_creds; - krb5_get_init_creds_opt options; - krb5_address ** addrs = NULL; - int i = 0, addr_count = 0; - - if (!pkrb5_init_context) - return 0; - - pkrb5_get_init_creds_opt_init(&options); - memset(&my_creds, 0, sizeof(my_creds)); - - if (alt_ctx) - { - ctx = alt_ctx; - } - else - { - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - } - - if ( alt_cc ) { - cc = alt_cc; - } else { - code = pkrb5_cc_default(ctx, &cc); - if (code) goto cleanup; - } - - code = pkrb5_parse_name(ctx, principal_name, &me); - if (code) - goto cleanup; - - code = pkrb5_unparse_name(ctx, me, &name); - if (code) - goto cleanup; - - if (lifetime == 0) - lifetime = pLeash_get_default_lifetime(); - else - lifetime *= 5*60; - - if (renew_life > 0) - renew_life *= 5*60; - - if (lifetime) - pkrb5_get_init_creds_opt_set_tkt_life(&options, lifetime); - pkrb5_get_init_creds_opt_set_forwardable(&options, - forwardable ? 1 : 0); - pkrb5_get_init_creds_opt_set_proxiable(&options, - proxiable ? 1 : 0); - pkrb5_get_init_creds_opt_set_renew_life(&options, - renew_life); - if (addressless) - pkrb5_get_init_creds_opt_set_address_list(&options,NULL); - else { - if (publicIP) - { - // we are going to add the public IP address specified by the user - // to the list provided by the operating system - krb5_address ** local_addrs=NULL; - DWORD netIPAddr; - - pkrb5_os_localaddr(ctx, &local_addrs); - while ( local_addrs[i++] ); - addr_count = i + 1; - - addrs = (krb5_address **) malloc((addr_count+1) * sizeof(krb5_address *)); - if ( !addrs ) { - pkrb5_free_addresses(ctx, local_addrs); - goto cleanup; - } - memset(addrs, 0, sizeof(krb5_address *) * (addr_count+1)); - i = 0; - while ( local_addrs[i] ) { - addrs[i] = (krb5_address *)malloc(sizeof(krb5_address)); - if (addrs[i] == NULL) { - pkrb5_free_addresses(ctx, local_addrs); - goto cleanup; - } - - addrs[i]->magic = local_addrs[i]->magic; - addrs[i]->addrtype = local_addrs[i]->addrtype; - addrs[i]->length = local_addrs[i]->length; - addrs[i]->contents = (unsigned char *)malloc(addrs[i]->length); - if (!addrs[i]->contents) { - pkrb5_free_addresses(ctx, local_addrs); - goto cleanup; - } - - memcpy(addrs[i]->contents,local_addrs[i]->contents, - local_addrs[i]->length); /* safe */ - i++; - } - pkrb5_free_addresses(ctx, local_addrs); - - addrs[i] = (krb5_address *)malloc(sizeof(krb5_address)); - if (addrs[i] == NULL) - goto cleanup; - - addrs[i]->magic = KV5M_ADDRESS; - addrs[i]->addrtype = AF_INET; - addrs[i]->length = 4; - addrs[i]->contents = (unsigned char *)malloc(addrs[i]->length); - if (!addrs[i]->contents) - goto cleanup; - - netIPAddr = htonl(publicIP); - memcpy(addrs[i]->contents,&netIPAddr,4); - - pkrb5_get_init_creds_opt_set_address_list(&options,addrs); - - } - } - - code = pkrb5_get_init_creds_password(ctx, - &my_creds, - me, - password, // password - KRB5_prompter, // prompter - hParent, // prompter data - 0, // start time - 0, // service name - &options); - if (code) - goto cleanup; - - code = pkrb5_cc_initialize(ctx, cc, me); - if (code) - goto cleanup; - - code = pkrb5_cc_store_cred(ctx, cc, &my_creds); - if (code) - goto cleanup; - - cleanup: - if ( addrs ) { - for ( i=0;icontents ) - free(addrs[i]->contents); - free(addrs[i]); - } - } - } - if (my_creds.client == me) - my_creds.client = 0; - pkrb5_free_cred_contents(ctx, &my_creds); - if (name) - pkrb5_free_unparsed_name(ctx, name); - if (me) - pkrb5_free_principal(ctx, me); - if (cc && (cc != alt_cc)) - pkrb5_cc_close(ctx, cc); - if (ctx && (ctx != alt_ctx)) - pkrb5_free_context(ctx); - return(code); -} - - -int -KFW_kdestroy(krb5_context alt_ctx, krb5_ccache alt_cc) -{ - krb5_context ctx; - krb5_ccache cc; - krb5_error_code code; - - if (!pkrb5_init_context) - return 0; - - if (alt_ctx) - { - ctx = alt_ctx; - } - else - { - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - } - - if ( alt_cc ) { - cc = alt_cc; - } else { - code = pkrb5_cc_default(ctx, &cc); - if (code) goto cleanup; - } - - code = pkrb5_cc_destroy(ctx, cc); - if ( !code ) cc = 0; - - cleanup: - if (cc && (cc != alt_cc)) - pkrb5_cc_close(ctx, cc); - if (ctx && (ctx != alt_ctx)) - pkrb5_free_context(ctx); - - return(code); -} - - -#ifdef USE_MS2MIT -static BOOL -GetSecurityLogonSessionData(PSECURITY_LOGON_SESSION_DATA * ppSessionData) -{ - NTSTATUS Status = 0; - HANDLE TokenHandle; - TOKEN_STATISTICS Stats; - DWORD ReqLen; - BOOL Success; - - if (!ppSessionData) - return FALSE; - *ppSessionData = NULL; - - Success = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &TokenHandle ); - if ( !Success ) - return FALSE; - - Success = GetTokenInformation( TokenHandle, TokenStatistics, &Stats, sizeof(TOKEN_STATISTICS), &ReqLen ); - CloseHandle( TokenHandle ); - if ( !Success ) - return FALSE; - - Status = pLsaGetLogonSessionData( &Stats.AuthenticationId, ppSessionData ); - if ( FAILED(Status) || !ppSessionData ) - return FALSE; - - return TRUE; -} - -// -// MSLSA_IsKerberosLogon() does not validate whether or not there are valid tickets in the -// cache. It validates whether or not it is reasonable to assume that if we -// attempted to retrieve valid tickets we could do so. Microsoft does not -// automatically renew expired tickets. Therefore, the cache could contain -// expired or invalid tickets. Microsoft also caches the user's password -// and will use it to retrieve new TGTs if the cache is empty and tickets -// are requested. - -static BOOL -MSLSA_IsKerberosLogon(VOID) -{ - PSECURITY_LOGON_SESSION_DATA pSessionData = NULL; - BOOL Success = FALSE; - - if ( GetSecurityLogonSessionData(&pSessionData) ) { - if ( pSessionData->AuthenticationPackage.Buffer ) { - WCHAR buffer[256]; - WCHAR *usBuffer; - int usLength; - - Success = FALSE; - usBuffer = (pSessionData->AuthenticationPackage).Buffer; - usLength = (pSessionData->AuthenticationPackage).Length; - if (usLength < 256) - { - lstrcpynW (buffer, usBuffer, usLength); - lstrcatW (buffer,L""); - if ( !lstrcmpW(L"Kerberos",buffer) ) - Success = TRUE; - } - } - pLsaFreeReturnBuffer(pSessionData); - } - return Success; -} -#endif /* USE_MS2MIT */ - -static BOOL CALLBACK -MultiInputDialogProc( HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam) -{ - int i; - - switch ( message ) { - case WM_INITDIALOG: - if ( GetDlgCtrlID((HWND) wParam) != ID_MID_TEXT ) - { - SetFocus(GetDlgItem( hDialog, ID_MID_TEXT)); - return FALSE; - } - for ( i=0; i < mid_cnt ; i++ ) { - if (mid_tb[i].echo == 0) - SendDlgItemMessage(hDialog, ID_MID_TEXT+i, EM_SETPASSWORDCHAR, 32, 0); - else if (mid_tb[i].echo == 2) - SendDlgItemMessage(hDialog, ID_MID_TEXT+i, EM_SETPASSWORDCHAR, '*', 0); - } - return TRUE; - - case WM_COMMAND: - switch ( LOWORD(wParam) ) { - case IDOK: - for ( i=0; i < mid_cnt ; i++ ) { - if ( !GetDlgItemText(hDialog, ID_MID_TEXT+i, mid_tb[i].buf, mid_tb[i].len) ) - *mid_tb[i].buf = '\0'; - } - /* fallthrough */ - case IDCANCEL: - EndDialog(hDialog, LOWORD(wParam)); - return TRUE; - } - } - return FALSE; -} - -static LPWORD -lpwAlign( LPWORD lpIn ) -{ - ULONG ul; - - ul = (ULONG) lpIn; - ul += 3; - ul >>=2; - ul <<=2; - return (LPWORD) ul;; -} - -/* - * dialog widths are measured in 1/4 character widths - * dialog height are measured in 1/8 character heights - */ - -static LRESULT -MultiInputDialog( HINSTANCE hinst, HWND hwndOwner, - char * ptext[], int numlines, int width, - int tb_cnt, struct textField * tb) -{ - HGLOBAL hgbl; - LPDLGTEMPLATE lpdt; - LPDLGITEMTEMPLATE lpdit; - LPWORD lpw; - LPWSTR lpwsz; - LRESULT ret; - int nchar, i, pwid; - - hgbl = GlobalAlloc(GMEM_ZEROINIT, 4096); - if (!hgbl) - return -1; - - mid_cnt = tb_cnt; - mid_tb = tb; - - lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl); - - // Define a dialog box. - - lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU - | DS_MODALFRAME | WS_CAPTION | DS_CENTER - | DS_SETFOREGROUND | DS_3DLOOK - | DS_SETFONT | DS_FIXEDSYS | DS_NOFAILCREATE; - lpdt->cdit = numlines + (2 * tb_cnt) + 2; // number of controls - lpdt->x = 10; - lpdt->y = 10; - lpdt->cx = 20 + width * 4; - lpdt->cy = 20 + (numlines + tb_cnt + 4) * 14; - - lpw = (LPWORD) (lpdt + 1); - *lpw++ = 0; // no menu - *lpw++ = 0; // predefined dialog box class (by default) - - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, "", -1, lpwsz, 128); - lpw += nchar; - *lpw++ = 8; // font size (points) - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, "MS Shell Dlg", - -1, lpwsz, 128); - lpw += nchar; - - //----------------------- - // Define an OK button. - //----------------------- - lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary - lpdit = (LPDLGITEMTEMPLATE) lpw; - lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_BORDER; - lpdit->dwExtendedStyle = 0; - lpdit->x = (lpdt->cx - 14)/4 - 20; - lpdit->y = 10 + (numlines + tb_cnt + 2) * 14; - lpdit->cx = 40; - lpdit->cy = 14; - lpdit->id = IDOK; // OK button identifier - - lpw = (LPWORD) (lpdit + 1); - *lpw++ = 0xFFFF; - *lpw++ = 0x0080; // button class - - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, "OK", -1, lpwsz, 50); - lpw += nchar; - *lpw++ = 0; // no creation data - - //----------------------- - // Define an Cancel button. - //----------------------- - lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary - lpdit = (LPDLGITEMTEMPLATE) lpw; - lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP | WS_BORDER; - lpdit->dwExtendedStyle = 0; - lpdit->x = (lpdt->cx - 14)*3/4 - 20; - lpdit->y = 10 + (numlines + tb_cnt + 2) * 14; - lpdit->cx = 40; - lpdit->cy = 14; - lpdit->id = IDCANCEL; // CANCEL button identifier - - lpw = (LPWORD) (lpdit + 1); - *lpw++ = 0xFFFF; - *lpw++ = 0x0080; // button class - - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, "Cancel", -1, lpwsz, 50); - lpw += nchar; - *lpw++ = 0; // no creation data - - /* Add controls for preface data */ - for ( i=0; istyle = WS_CHILD | WS_VISIBLE | SS_LEFT; - lpdit->dwExtendedStyle = 0; - lpdit->x = 10; - lpdit->y = 10 + i * 14; - lpdit->cx = strlen(ptext[i]) * 4 + 10; - lpdit->cy = 14; - lpdit->id = ID_TEXT + i; // text identifier - - lpw = (LPWORD) (lpdit + 1); - *lpw++ = 0xFFFF; - *lpw++ = 0x0082; // static class - - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, ptext[i], - -1, lpwsz, 2*width); - lpw += nchar; - *lpw++ = 0; // no creation data - } - - for ( i=0, pwid = 0; istyle = WS_CHILD | WS_VISIBLE | SS_LEFT; - lpdit->dwExtendedStyle = 0; - lpdit->x = 10; - lpdit->y = 10 + (numlines + i + 1) * 14; - lpdit->cx = pwid * 4; - lpdit->cy = 14; - lpdit->id = ID_TEXT + numlines + i; // text identifier - - lpw = (LPWORD) (lpdit + 1); - *lpw++ = 0xFFFF; - *lpw++ = 0x0082; // static class - - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, tb[i].label ? tb[i].label : "", - -1, lpwsz, 128); - lpw += nchar; - *lpw++ = 0; // no creation data - - /*----------------------- - * Define an edit control. - *-----------------------*/ - lpw = lpwAlign (lpw); /* align DLGITEMTEMPLATE on DWORD boundary */ - lpdit = (LPDLGITEMTEMPLATE) lpw; - lpdit->style = WS_CHILD | WS_VISIBLE | ES_LEFT | WS_TABSTOP | WS_BORDER | (tb[i].echo == 1 ? 0L : ES_PASSWORD); - lpdit->dwExtendedStyle = 0; - lpdit->x = 10 + (pwid + 1) * 4; - lpdit->y = 10 + (numlines + i + 1) * 14; - lpdit->cx = (width - (pwid + 1)) * 4; - lpdit->cy = 14; - lpdit->id = ID_MID_TEXT + i; // identifier - - lpw = (LPWORD) (lpdit + 1); - *lpw++ = 0xFFFF; - *lpw++ = 0x0081; // edit class - - lpwsz = (LPWSTR) lpw; - nchar = MultiByteToWideChar (CP_ACP, 0, tb[i].def ? tb[i].def : "", - -1, lpwsz, 128); - lpw += nchar; - *lpw++ = 0; // no creation data - } - - GlobalUnlock(hgbl); - ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE) hgbl, - hwndOwner, (DLGPROC) MultiInputDialogProc); - GlobalFree(hgbl); - - switch ( ret ) { - case 0: /* Timeout */ - return -1; - case IDOK: - return 1; - case IDCANCEL: - return 0; - default: { - char buf[256]; - sprintf(buf,"DialogBoxIndirect() failed: %d",GetLastError()); - MessageBox(hwndOwner, - buf, - "GetLastError()", - MB_OK | MB_ICONINFORMATION | MB_TASKMODAL); - return -1; - } - } -} - -static int -multi_field_dialog(HWND hParent, char * preface, int n, struct textField tb[]) -{ - HINSTANCE hInst = 0; - int maxwidth = 0; - int numlines = 0; - int len; - char * plines[16], *p = preface ? preface : ""; - int i; - - for ( i=0; i<16; i++ ) - plines[i] = NULL; - - while (*p && numlines < 16) { - plines[numlines++] = p; - for ( ;*p && *p != '\r' && *p != '\n'; p++ ); - if ( *p == '\r' && *(p+1) == '\n' ) { - *p++ = '\0'; - p++; - } else if ( *p == '\n' ) { - *p++ = '\0'; - } - if ( strlen(plines[numlines-1]) > maxwidth ) - maxwidth = strlen(plines[numlines-1]); - } - - for ( i=0;i 40 ? 40 : tb[i].len); - if ( maxwidth < len ) - maxwidth = len; - } - - return(MultiInputDialog(hInst, hParent, plines, numlines, maxwidth, n, tb)); -} - -static krb5_error_code KRB5_CALLCONV -KRB5_prompter( krb5_context context, - void *data, - const char *name, - const char *banner, - int num_prompts, - krb5_prompt prompts[]) -{ - krb5_error_code errcode = 0; - int i; - struct textField * tb = NULL; - int len = 0, blen=0, nlen=0; - HWND hParent = (HWND)data; - - if (name) - nlen = strlen(name)+2; - - if (banner) - blen = strlen(banner)+2; - - tb = (struct textField *) malloc(sizeof(struct textField) * num_prompts); - if ( tb != NULL ) { - int ok; - memset(tb,0,sizeof(struct textField) * num_prompts); - for ( i=0; i < num_prompts; i++ ) { - tb[i].buf = prompts[i].reply->data; - tb[i].len = prompts[i].reply->length; - tb[i].label = prompts[i].prompt; - tb[i].def = NULL; - tb[i].echo = (prompts[i].hidden ? 2 : 1); - } - - ok = multi_field_dialog(hParent,(char *)banner,num_prompts,tb); - if ( ok ) { - for ( i=0; i < num_prompts; i++ ) - prompts[i].reply->length = strlen(prompts[i].reply->data); - } else - errcode = -2; - } - - if ( tb ) - free(tb); - if (errcode) { - for (i = 0; i < num_prompts; i++) { - memset(prompts[i].reply->data, 0, prompts[i].reply->length); - } - } - return errcode; -} - -BOOL -KFW_AFS_wait_for_service_start(void) -{ - char HostName[64]; - DWORD CurrentState; - - CurrentState = SERVICE_START_PENDING; - memset(HostName, '\0', sizeof(HostName)); - gethostname(HostName, sizeof(HostName)); - - while (CurrentState != SERVICE_RUNNING || CurrentState != SERVICE_STOPPED) - { - if (GetServiceStatus(HostName, TRANSARCAFSDAEMON, &CurrentState) != NOERROR) - return(0); - if ( IsDebuggerPresent() ) { - switch ( CurrentState ) { - case SERVICE_STOPPED: - OutputDebugString("SERVICE_STOPPED\n"); - break; - case SERVICE_START_PENDING: - OutputDebugString("SERVICE_START_PENDING\n"); - break; - case SERVICE_STOP_PENDING: - OutputDebugString("SERVICE_STOP_PENDING\n"); - break; - case SERVICE_RUNNING: - OutputDebugString("SERVICE_RUNNING\n"); - break; - case SERVICE_CONTINUE_PENDING: - OutputDebugString("SERVICE_CONTINUE_PENDING\n"); - break; - case SERVICE_PAUSE_PENDING: - OutputDebugString("SERVICE_PAUSE_PENDING\n"); - break; - case SERVICE_PAUSED: - OutputDebugString("SERVICE_PAUSED\n"); - break; - default: - OutputDebugString("UNKNOWN Service State\n"); - } - } - if (CurrentState == SERVICE_STOPPED) - return(0); - if (CurrentState == SERVICE_RUNNING) - return(1); - Sleep(500); - } - return(0); -} - - -int -KFW_AFS_unlog(void) -{ - long rc; - char HostName[64]; - DWORD CurrentState; - - CurrentState = 0; - memset(HostName, '\0', sizeof(HostName)); - gethostname(HostName, sizeof(HostName)); - if (GetServiceStatus(HostName, TRANSARCAFSDAEMON, &CurrentState) != NOERROR) - return(0); - if (CurrentState != SERVICE_RUNNING) - return(0); - - rc = ktc_ForgetAllTokens(); - - return(0); -} - - -#define ALLOW_REGISTER 1 -static int -ViceIDToUsername(char *username, - char *realm_of_user, - char *realm_of_cell, - char * cell_to_use, - struct ktc_principal *aclient, - struct ktc_principal *aserver, - struct ktc_token *atoken) -{ - static char lastcell[MAXCELLCHARS+1] = { 0 }; - static char confname[512] = { 0 }; -#ifdef AFS_ID_TO_NAME - char username_copy[BUFSIZ]; -#endif /* AFS_ID_TO_NAME */ - long viceId; /* AFS uid of user */ - int status = 0; -#ifdef ALLOW_REGISTER - afs_int32 id; -#endif /* ALLOW_REGISTER */ - - if (confname[0] == '\0') { - strncpy(confname, AFSDIR_CLIENT_ETC_DIRPATH, sizeof(confname)); - confname[sizeof(confname) - 2] = '\0'; - } - - /* - * Talk about DUMB! It turns out that there is a bug in - * pr_Initialize -- even if you give a different cell name - * to it, it still uses a connection to a previous AFS server - * if one exists. The way to fix this is to change the - * _filename_ argument to pr_Initialize - that forces it to - * re-initialize the connection. We do this by adding and - * removing a "/" on the end of the configuration directory name. - */ - - if (lastcell[0] != '\0' && (strcmp(lastcell, aserver->cell) != 0)) { - int i = strlen(confname); - if (confname[i - 1] == '/') { - confname[i - 1] = '\0'; - } else { - confname[i] = '/'; - confname[i + 1] = '\0'; - } - } - - strcpy(lastcell, aserver->cell); - - if (!pr_Initialize (0, confname, aserver->cell)) - status = pr_SNameToId (username, &viceId); - - /* - * This is a crock, but it is Transarc's crock, so - * we have to play along in order to get the - * functionality. The way the afs id is stored is - * as a string in the username field of the token. - * Contrary to what you may think by looking at - * the code for tokens, this hack (AFS ID %d) will - * not work if you change %d to something else. - */ - - /* - * This code is taken from cklog -- it lets people - * automatically register with the ptserver in foreign cells - */ - -#ifdef ALLOW_REGISTER - if (status == 0) { - if (viceId != ANONYMOUSID) { -#else /* ALLOW_REGISTER */ - if ((status == 0) && (viceId != ANONYMOUSID)) -#endif /* ALLOW_REGISTER */ - { -#ifdef AFS_ID_TO_NAME - strncpy(username_copy, username, BUFSIZ); - snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId); -#endif /* AFS_ID_TO_NAME */ - } -#ifdef ALLOW_REGISTER - } else if (strcmp(realm_of_user, realm_of_cell) != 0) { - id = 0; - strncpy(aclient->name, username, MAXKTCNAMELEN - 1); - strcpy(aclient->instance, ""); - strncpy(aclient->cell, realm_of_user, MAXKTCREALMLEN - 1); - if (status = ktc_SetToken(aserver, atoken, aclient, 0)) - return status; - - /* - * In case you're wondering, we don't need to change the - * filename here because we're still connecting to the - * same cell -- we're just using a different authentication - * level - */ - - if (status = pr_Initialize(1L, confname, aserver->cell)) - return status; - if (status = pr_CreateUser(username, &id)) - return status; -#ifdef AFS_ID_TO_NAME - strncpy(username_copy, username, BUFSIZ); - snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId); -#endif /* AFS_ID_TO_NAME */ - } - } -#endif /* ALLOW_REGISTER */ - return status; -} - - -int -KFW_AFS_klog( - krb5_context alt_ctx, - krb5_ccache alt_cc, - char *service, - char *cell, - char *realm, - int LifeTime, - char *smbname - ) -{ - long rc = 0; - CREDENTIALS creds; -#ifdef USE_KRB4 - KTEXT_ST ticket; -#endif /* USE_KRB4 */ - struct ktc_principal aserver; - struct ktc_principal aclient; - char realm_of_user[REALM_SZ]; /* Kerberos realm of user */ - char realm_of_cell[REALM_SZ]; /* Kerberos realm of cell */ - char local_cell[MAXCELLCHARS+1]; - char Dmycell[MAXCELLCHARS+1]; - struct ktc_token atoken; - struct ktc_token btoken; - struct afsconf_cell ak_cellconfig; /* General information about the cell */ - char RealmName[128]; - char CellName[128]; - char ServiceName[128]; - DWORD CurrentState; - char HostName[64]; - BOOL try_krb5 = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_creds increds; - krb5_creds * k5creds = 0; - krb5_error_code code; - krb5_principal client_principal = 0; - krb5_data * k5data; - int i, retry = 0; - - CurrentState = 0; - memset(HostName, '\0', sizeof(HostName)); - gethostname(HostName, sizeof(HostName)); - if (GetServiceStatus(HostName, TRANSARCAFSDAEMON, &CurrentState) != NOERROR) { - if ( IsDebuggerPresent() ) - OutputDebugString("Unable to retrieve AFSD Service Status\n"); - return(-1); - } - if (CurrentState != SERVICE_RUNNING) { - if ( IsDebuggerPresent() ) - OutputDebugString("AFSD Service NOT RUNNING\n"); - return(-2); - } - - if (!pkrb5_init_context) - return 0; - - memset(RealmName, '\0', sizeof(RealmName)); - memset(CellName, '\0', sizeof(CellName)); - memset(ServiceName, '\0', sizeof(ServiceName)); - memset(realm_of_user, '\0', sizeof(realm_of_user)); - memset(realm_of_cell, '\0', sizeof(realm_of_cell)); - if (cell && cell[0]) - strcpy(Dmycell, cell); - else - memset(Dmycell, '\0', sizeof(Dmycell)); - - // NULL or empty cell returns information on local cell - if (rc = KFW_AFS_get_cellconfig(Dmycell, &ak_cellconfig, local_cell)) - { - // KFW_AFS_error(rc, "get_cellconfig()"); - return(rc); - } - - if ( alt_ctx ) { - ctx = alt_ctx; - } else { - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - } - - if ( alt_cc ) { - cc = alt_cc; - } else { - code = pkrb5_cc_default(ctx, &cc); - if (code) goto skip_krb5_init; - } - - memset((char *)&increds, 0, sizeof(increds)); - - code = pkrb5_cc_get_principal(ctx, cc, &client_principal); - if (code) { - if ( code == KRB5_CC_NOTFOUND && IsDebuggerPresent() ) - { - OutputDebugString("Principal Not Found for ccache\n"); - } - goto skip_krb5_init; - } - - /* look for client principals which cannot be distinguished - * from Kerberos 4 multi-component principal names - */ - k5data = krb5_princ_component(ctx,client_principal,0); - for ( i=0; ilength; i++ ) { - if ( k5data->data[i] == '.' ) - break; - } - if (i != k5data->length) - { - OutputDebugString("Illegal Principal name contains dot in first component\n"); - rc = KRB5KRB_ERR_GENERIC; - goto cleanup; - } - - i = krb5_princ_realm(ctx, client_principal)->length; - if (i > REALM_SZ-1) - i = REALM_SZ-1; - strncpy(realm_of_user,krb5_princ_realm(ctx, client_principal)->data,i); - realm_of_user[i] = 0; - try_krb5 = 1; - - skip_krb5_init: -#ifdef USE_KRB4 - if ( !try_krb5 || !realm_of_user[0] ) { - if ((rc = (*pkrb_get_tf_realm)((*ptkt_string)(), realm_of_user)) != KSUCCESS) - { - goto cleanup; - } - } -#else - if (!try_krb5) - goto cleanup; -#endif - strcpy(realm_of_cell, afs_realm_of_cell(ctx, &ak_cellconfig)); - - if (strlen(service) == 0) - strcpy(ServiceName, "afs"); - else - strcpy(ServiceName, service); - - if (strlen(cell) == 0) - strcpy(CellName, local_cell); - else - strcpy(CellName, cell); - - if (strlen(realm) == 0) - strcpy(RealmName, realm_of_cell); - else - strcpy(RealmName, realm); - - memset(&creds, '\0', sizeof(creds)); - - if ( try_krb5 ) { - int len; - - /* First try service/cell@REALM */ - if (code = pkrb5_build_principal(ctx, &increds.server, - strlen(RealmName), - RealmName, - ServiceName, - CellName, - 0)) - { - goto cleanup; - } - - increds.client = client_principal; - increds.times.endtime = 0; - /* Ask for DES since that is what V4 understands */ - increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC; - - - if ( IsDebuggerPresent() ) { - char * cname, *sname; - pkrb5_unparse_name(ctx, increds.client, &cname); - pkrb5_unparse_name(ctx, increds.server, &sname); - OutputDebugString("Getting tickets for \""); - OutputDebugString(cname); - OutputDebugString("\" and service \""); - OutputDebugString(sname); - OutputDebugString("\"\n"); - pkrb5_free_unparsed_name(ctx,cname); - pkrb5_free_unparsed_name(ctx,sname); - } - - code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds); - if (code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN || - code == KRB5KRB_ERR_GENERIC /* heimdal */ || - code == KRB5KRB_AP_ERR_MSG_TYPE) { - /* Or service@REALM */ - pkrb5_free_principal(ctx,increds.server); - increds.server = 0; - code = pkrb5_build_principal(ctx, &increds.server, - strlen(RealmName), - RealmName, - ServiceName, - 0); - - if ( IsDebuggerPresent() ) { - char * cname, *sname; - pkrb5_unparse_name(ctx, increds.client, &cname); - pkrb5_unparse_name(ctx, increds.server, &sname); - OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n"); - OutputDebugString("Trying again: getting tickets for \""); - OutputDebugString(cname); - OutputDebugString("\" and service \""); - OutputDebugString(sname); - OutputDebugString("\"\n"); - pkrb5_free_unparsed_name(ctx,cname); - pkrb5_free_unparsed_name(ctx,sname); - } - - if (!code) - code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds); - } - - if ((code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN || - code == KRB5KRB_ERR_GENERIC /* heimdal */ || - code == KRB5KRB_AP_ERR_MSG_TYPE) && - strcmp(RealmName, realm_of_cell)) { - /* Or service/cell@REALM_OF_CELL */ - strcpy(RealmName, realm_of_cell); - pkrb5_free_principal(ctx,increds.server); - increds.server = 0; - code = pkrb5_build_principal(ctx, &increds.server, - strlen(RealmName), - RealmName, - ServiceName, - CellName, - 0); - - if ( IsDebuggerPresent() ) { - char * cname, *sname; - pkrb5_unparse_name(ctx, increds.client, &cname); - pkrb5_unparse_name(ctx, increds.server, &sname); - OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n"); - OutputDebugString("Trying again: getting tickets for \""); - OutputDebugString(cname); - OutputDebugString("\" and service \""); - OutputDebugString(sname); - OutputDebugString("\"\n"); - pkrb5_free_unparsed_name(ctx,cname); - pkrb5_free_unparsed_name(ctx,sname); - } - - if (!code) - code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds); - - - if (code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN || - code == KRB5KRB_ERR_GENERIC /* heimdal */ || - code == KRB5KRB_AP_ERR_MSG_TYPE) { - /* Or service@REALM_OF_CELL */ - pkrb5_free_principal(ctx,increds.server); - increds.server = 0; - code = pkrb5_build_principal(ctx, &increds.server, - strlen(RealmName), - RealmName, - ServiceName, - 0); - - if ( IsDebuggerPresent() ) { - char * cname, *sname; - pkrb5_unparse_name(ctx, increds.client, &cname); - pkrb5_unparse_name(ctx, increds.server, &sname); - OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n"); - OutputDebugString("Trying again: getting tickets for \""); - OutputDebugString(cname); - OutputDebugString("\" and service \""); - OutputDebugString(sname); - OutputDebugString("\"\n"); - pkrb5_free_unparsed_name(ctx,cname); - pkrb5_free_unparsed_name(ctx,sname); - } - - if (!code) - code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds); - } - } - - if (code) { - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"krb5_get_credentials returns: %d\n",code); - OutputDebugString(message); - } - try_krb5 = 0; - goto use_krb4; - } - - /* This code inserts the entire K5 ticket into the token - * No need to perform a krb524 translation which is - * commented out in the code below - */ - if (KFW_use_krb524() || - k5creds->ticket.length > MAXKTCTICKETLEN) - goto try_krb524d; - - memset(&aserver, '\0', sizeof(aserver)); - strncpy(aserver.name, ServiceName, MAXKTCNAMELEN - 1); - strncpy(aserver.cell, CellName, MAXKTCREALMLEN - 1); - - memset(&atoken, '\0', sizeof(atoken)); - atoken.kvno = RXKAD_TKT_TYPE_KERBEROS_V5; - atoken.startTime = k5creds->times.starttime; - atoken.endTime = k5creds->times.endtime; - memcpy(&atoken.sessionKey, k5creds->keyblock.contents, k5creds->keyblock.length); - atoken.ticketLen = k5creds->ticket.length; - memcpy(atoken.ticket, k5creds->ticket.data, atoken.ticketLen); - - retry_gettoken5: - rc = ktc_GetToken(&aserver, &btoken, sizeof(btoken), &aclient); - if (rc != 0 && rc != KTC_NOENT && rc != KTC_NOCELL) { - if ( rc == KTC_NOCM && retry < 20 ) { - Sleep(500); - retry++; - goto retry_gettoken5; - } - goto try_krb524d; - } - - if (atoken.kvno == btoken.kvno && - atoken.ticketLen == btoken.ticketLen && - !memcmp(&atoken.sessionKey, &btoken.sessionKey, sizeof(atoken.sessionKey)) && - !memcmp(atoken.ticket, btoken.ticket, atoken.ticketLen)) - { - /* Success - Nothing to do */ - goto cleanup; - } - - // * Reset the "aclient" structure before we call ktc_SetToken. - // * This structure was first set by the ktc_GetToken call when - // * we were comparing whether identical tokens already existed. - - len = min(k5creds->client->data[0].length,MAXKTCNAMELEN - 1); - strncpy(aclient.name, k5creds->client->data[0].data, len); - aclient.name[len] = '\0'; - - if ( k5creds->client->length > 1 ) { - char * p; - strcat(aclient.name, "."); - p = aclient.name + strlen(aclient.name); - len = min(k5creds->client->data[1].length,MAXKTCNAMELEN - strlen(aclient.name) - 1); - strncpy(p, k5creds->client->data[1].data, len); - p[len] = '\0'; - } - aclient.instance[0] = '\0'; - - strcpy(aclient.cell, realm_of_cell); - - len = min(k5creds->client->realm.length,strlen(realm_of_cell)); - if ( strncmp(realm_of_cell, k5creds->client->realm.data, len) ) { - char * p; - strcat(aclient.name, "@"); - p = aclient.name + strlen(aclient.name); - len = min(k5creds->client->realm.length,MAXKTCNAMELEN - strlen(aclient.name) - 1); - strncpy(p, k5creds->client->realm.data, len); - p[len] = '\0'; - } - - ViceIDToUsername(aclient.name, realm_of_user, realm_of_cell, CellName, - &aclient, &aserver, &atoken); - - if ( smbname ) { - strncpy(aclient.smbname, smbname, sizeof(aclient.smbname)); - aclient.smbname[sizeof(aclient.smbname)-1] = '\0'; - } else { - aclient.smbname[0] = '\0'; - } - - rc = ktc_SetToken(&aserver, &atoken, &aclient, (aclient.smbname[0]?AFS_SETTOK_LOGON:0)); - if (!rc) - goto cleanup; /* We have successfully inserted the token */ - - try_krb524d: - /* Otherwise, the ticket could have been too large so try to - * convert using the krb524d running with the KDC - */ - code = pkrb524_convert_creds_kdc(ctx, k5creds, &creds); - pkrb5_free_creds(ctx, k5creds); - if (code) { - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"krb524_convert_creds_kdc returns: %d\n",code); - OutputDebugString(message); - } - try_krb5 = 0; - goto use_krb4; - } - } else { - use_krb4: -#ifdef USE_KRB4 - code = (*pkrb_get_cred)(ServiceName, CellName, RealmName, &creds); - if (code == NO_TKT_FIL) { - // if the problem is that we have no krb4 tickets - // do not attempt to continue - goto cleanup; - } - if (code != KSUCCESS) - code = (*pkrb_get_cred)(ServiceName, "", RealmName, &creds); - - if (code != KSUCCESS) - { - if ((code = (*pkrb_mk_req)(&ticket, ServiceName, CellName, RealmName, 0)) == KSUCCESS) - { - if ((code = (*pkrb_get_cred)(ServiceName, CellName, RealmName, &creds)) != KSUCCESS) - { - goto cleanup; - } - } - else if ((code = (*pkrb_mk_req)(&ticket, ServiceName, "", RealmName, 0)) == KSUCCESS) - { - if ((code = (*pkrb_get_cred)(ServiceName, "", RealmName, &creds)) != KSUCCESS) - { - goto cleanup; - } - } - else - { - goto cleanup; - } - } -#else - goto cleanup; -#endif - } - - memset(&aserver, '\0', sizeof(aserver)); - strncpy(aserver.name, ServiceName, MAXKTCNAMELEN - 1); - strncpy(aserver.cell, CellName, MAXKTCREALMLEN - 1); - - memset(&atoken, '\0', sizeof(atoken)); - atoken.kvno = creds.kvno; - atoken.startTime = creds.issue_date; - atoken.endTime = creds.issue_date + life_to_time(0,creds.lifetime); - memcpy(&atoken.sessionKey, creds.session, 8); - atoken.ticketLen = creds.ticket_st.length; - memcpy(atoken.ticket, creds.ticket_st.dat, atoken.ticketLen); - - retry_gettoken: - rc = ktc_GetToken(&aserver, &btoken, sizeof(btoken), &aclient); - if (rc != 0 && rc != KTC_NOENT && rc != KTC_NOCELL) { - if ( rc == KTC_NOCM && retry < 20 ) { - Sleep(500); - retry++; - goto retry_gettoken; - } - KFW_AFS_error(rc, "ktc_GetToken()"); - code = rc; - goto cleanup; - } - - if (atoken.kvno == btoken.kvno && - atoken.ticketLen == btoken.ticketLen && - !memcmp(&atoken.sessionKey, &btoken.sessionKey, sizeof(atoken.sessionKey)) && - !memcmp(atoken.ticket, btoken.ticket, atoken.ticketLen)) - { - goto cleanup; - } - - // * Reset the "aclient" structure before we call ktc_SetToken. - // * This structure was first set by the ktc_GetToken call when - // * we were comparing whether identical tokens already existed. - - strncpy(aclient.name, creds.pname, MAXKTCNAMELEN - 1); - if (creds.pinst[0]) - { - strncat(aclient.name, ".", MAXKTCNAMELEN - 1); - strncat(aclient.name, creds.pinst, MAXKTCNAMELEN - 1); - } - strcpy(aclient.instance, ""); - - if ( strcmp(realm_of_cell, creds.realm) ) - { - strncat(aclient.name, "@", MAXKTCNAMELEN - 1); - strncpy(aclient.name, creds.realm, MAXKTCREALMLEN - 1); - } - aclient.name[MAXKTCREALMLEN-1] = '\0'; - - strcpy(aclient.cell, CellName); - - ViceIDToUsername(aclient.name, realm_of_user, realm_of_cell, CellName, - &aclient, &aserver, &atoken); - - if ( smbname ) { - strncpy(aclient.smbname, smbname, sizeof(aclient.smbname)); - aclient.smbname[sizeof(aclient.smbname)-1] = '\0'; - } else { - aclient.smbname[0] = '\0'; - } - - if (rc = ktc_SetToken(&aserver, &atoken, &aclient, (aclient.smbname[0]?AFS_SETTOK_LOGON:0))) - { - KFW_AFS_error(rc, "ktc_SetToken()"); - code = rc; - goto cleanup; - } - - cleanup: - if (client_principal) - pkrb5_free_principal(ctx,client_principal); - /* increds.client == client_principal */ - if (increds.server) - pkrb5_free_principal(ctx,increds.server); - if (cc && (cc != alt_cc)) - pkrb5_cc_close(ctx, cc); - if (ctx && (ctx != alt_ctx)) - pkrb5_free_context(ctx); - - return(rc? rc : code); -} - -/**************************************/ -/* afs_realm_of_cell(): */ -/**************************************/ -static char * -afs_realm_of_cell(krb5_context ctx, struct afsconf_cell *cellconfig) -{ - static char krbrlm[REALM_SZ+1]=""; - char ** realmlist=NULL; - krb5_error_code r; - - if (!cellconfig) - return 0; - - r = pkrb5_get_host_realm(ctx, cellconfig->hostName[0], &realmlist); - if ( !r && realmlist && realmlist[0] ) { - strcpy(krbrlm, realmlist[0]); - pkrb5_free_host_realm(ctx, realmlist); - } - - if ( !krbrlm[0] ) - { - char *s = krbrlm; - char *t = cellconfig->name; - int c; - - while (c = *t++) - { - if (islower(c)) c=toupper(c); - *s++ = c; - } - *s++ = 0; - } - return(krbrlm); -} - -/**************************************/ -/* KFW_AFS_get_cellconfig(): */ -/**************************************/ -int -KFW_AFS_get_cellconfig(char *cell, struct afsconf_cell *cellconfig, char *local_cell) -{ - int rc; - char newcell[MAXCELLCHARS+1]; - - local_cell[0] = (char)0; - memset(cellconfig, 0, sizeof(*cellconfig)); - - /* WIN32: cm_GetRootCellName(local_cell) - NOTE: no way to get max chars */ - if (rc = cm_GetRootCellName(local_cell)) - { - return(rc); - } - - if (strlen(cell) == 0) - strcpy(cell, local_cell); - - /* WIN32: cm_SearchCellFile(cell, pcallback, pdata) */ - strcpy(cellconfig->name, cell); - - rc = cm_SearchCellFile(cell, newcell, get_cellconfig_callback, (void*)cellconfig); -#ifdef AFS_AFSDB_ENV - if (rc != 0) { - int ttl; - rc = cm_SearchCellByDNS(cell, newcell, &ttl, get_cellconfig_callback, (void*)cellconfig); - } -#endif - return rc; -} - -/**************************************/ -/* get_cellconfig_callback(): */ -/**************************************/ -static long -get_cellconfig_callback(void *cellconfig, struct sockaddr_in *addrp, char *namep) -{ - struct afsconf_cell *cc = (struct afsconf_cell *)cellconfig; - - cc->hostAddr[cc->numServers] = *addrp; - strcpy(cc->hostName[cc->numServers], namep); - cc->numServers++; - return(0); -} - - -/**************************************/ -/* KFW_AFS_error(): */ -/**************************************/ -void -KFW_AFS_error(LONG rc, LPCSTR FailedFunctionName) -{ - char message[256]; - const char *errText; - - // Using AFS defines as error messages for now, until Transarc - // gets back to me with "string" translations of each of these - // const. defines. - if (rc == KTC_ERROR) - errText = "KTC_ERROR"; - else if (rc == KTC_TOOBIG) - errText = "KTC_TOOBIG"; - else if (rc == KTC_INVAL) - errText = "KTC_INVAL"; - else if (rc == KTC_NOENT) - errText = "KTC_NOENT"; - else if (rc == KTC_PIOCTLFAIL) - errText = "KTC_PIOCTLFAIL"; - else if (rc == KTC_NOPIOCTL) - errText = "KTC_NOPIOCTL"; - else if (rc == KTC_NOCELL) - errText = "KTC_NOCELL"; - else if (rc == KTC_NOCM) - errText = "KTC_NOCM: The service, Transarc AFS Daemon, most likely is not started!"; - else - errText = "Unknown error!"; - - sprintf(message, "%s (0x%x)\n(%s failed)", errText, rc, FailedFunctionName); - - if ( IsDebuggerPresent() ) { - OutputDebugString(message); - OutputDebugString("\n"); - } - MessageBox(NULL, message, "AFS", MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND); - return; -} - -static DWORD -GetServiceStatus( - LPSTR lpszMachineName, - LPSTR lpszServiceName, - DWORD *lpdwCurrentState) -{ - DWORD hr = NOERROR; - SC_HANDLE schSCManager = NULL; - SC_HANDLE schService = NULL; - DWORD fdwDesiredAccess = 0; - SERVICE_STATUS ssServiceStatus = {0}; - BOOL fRet = FALSE; - - *lpdwCurrentState = 0; - - fdwDesiredAccess = GENERIC_READ; - - schSCManager = OpenSCManager(lpszMachineName, - NULL, - fdwDesiredAccess); - - if(schSCManager == NULL) - { - hr = GetLastError(); - goto cleanup; - } - - schService = OpenService(schSCManager, - lpszServiceName, - fdwDesiredAccess); - - if(schService == NULL) - { - hr = GetLastError(); - goto cleanup; - } - - fRet = QueryServiceStatus(schService, - &ssServiceStatus); - - if(fRet == FALSE) - { - hr = GetLastError(); - goto cleanup; - } - - *lpdwCurrentState = ssServiceStatus.dwCurrentState; - -cleanup: - - CloseServiceHandle(schService); - CloseServiceHandle(schSCManager); - - return(hr); -} - -void -UnloadFuncs( - FUNC_INFO fi[], - HINSTANCE h - ) -{ - int n; - if (fi) - for (n = 0; fi[n].func_ptr_var; n++) - *(fi[n].func_ptr_var) = 0; - if (h) FreeLibrary(h); -} - -int -LoadFuncs( - const char* dll_name, - FUNC_INFO fi[], - HINSTANCE* ph, // [out, optional] - DLL handle - int* pindex, // [out, optional] - index of last func loaded (-1 if none) - int cleanup, // cleanup function pointers and unload on error - int go_on, // continue loading even if some functions cannot be loaded - int silent // do not pop-up a system dialog if DLL cannot be loaded - ) -{ - HINSTANCE h; - int i, n, last_i; - int error = 0; - UINT em; - - if (ph) *ph = 0; - if (pindex) *pindex = -1; - - for (n = 0; fi[n].func_ptr_var; n++) - *(fi[n].func_ptr_var) = 0; - - if (silent) - em = SetErrorMode(SEM_FAILCRITICALERRORS); - h = LoadLibrary(dll_name); - if (silent) - SetErrorMode(em); - - if (!h) - return 0; - - last_i = -1; - for (i = 0; (go_on || !error) && (i < n); i++) - { - void* p = (void*)GetProcAddress(h, fi[i].func_name); - if (!p) - error = 1; - else - { - last_i = i; - *(fi[i].func_ptr_var) = p; - } - } - if (pindex) *pindex = last_i; - if (error && cleanup && !go_on) { - for (i = 0; i < n; i++) { - *(fi[i].func_ptr_var) = 0; - } - FreeLibrary(h); - return 0; - } - if (ph) *ph = h; - if (error) return 0; - return 1; -} - -BOOL KFW_probe_kdc(struct afsconf_cell * cellconfig) -{ - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_error_code code; - krb5_data pwdata; - const char * realm = 0; - krb5_principal principal = 0; - char * pname = 0; - char password[PROBE_PASSWORD_LEN+1]; - BOOL serverReachable = 0; - - if (!pkrb5_init_context) - return 0; - - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - - - realm = afs_realm_of_cell(ctx, cellconfig); // do not free - - code = pkrb5_build_principal(ctx, &principal, strlen(realm), - realm, PROBE_USERNAME, NULL, NULL); - if ( code ) goto cleanup; - - code = KFW_get_ccache(ctx, principal, &cc); - if ( code ) goto cleanup; - - code = pkrb5_unparse_name(ctx, principal, &pname); - if ( code ) goto cleanup; - - pwdata.data = password; - pwdata.length = PROBE_PASSWORD_LEN; - code = pkrb5_c_random_make_octets(ctx, &pwdata); - if (code) { - int i; - for ( i=0 ; i -#include -#include -#include - -#define MAXCELLCHARS 64 -#define MAXHOSTCHARS 64 -#define MAXHOSTSPERCELL 8 -#define TRANSARCAFSDAEMON "TransarcAFSDaemon" - -void KFW_initialize(void); -void KFW_cleanup(void); -int KFW_is_available(void); -int KFW_AFS_destroy_tickets_for_cell(char *); -int KFW_AFS_renew_expiring_tokens(void); -int KFW_AFS_get_cred( char * username, - char * cell, - char * password, - int lifetime, - char * smbname, - char ** reasonP ); -int KFW_AFS_renew_token_for_cell(char * cell); -int KFW_AFS_renew_tokens_for_all_cells(void); -BOOL KFW_AFS_wait_for_service_start(void); -BOOL KFW_probe_kdc(struct afsconf_cell *); -int KFW_AFS_get_cellconfig(char *, struct afsconf_cell *, char *); -void KFW_import_windows_lsa(void); -BOOL KFW_AFS_get_lsa_principal(char *, DWORD *); - -/* From afs/krb_prot.h */ -/* values for kerb error codes */ -#define KERB_ERR_OK 0 -#define KERB_ERR_NAME_EXP 1 -#define KERB_ERR_SERVICE_EXP 2 -#define KERB_ERR_AUTH_EXP 3 -#define KERB_ERR_PKT_VER 4 -#define KERB_ERR_NAME_MAST_KEY_VER 5 -#define KERB_ERR_SERV_MAST_KEY_VER 6 -#define KERB_ERR_BYTE_ORDER 7 -#define KERB_ERR_PRINCIPAL_UNKNOWN 8 -#define KERB_ERR_PRINCIPAL_NOT_UNIQUE 9 -#define KERB_ERR_NULL_KEY 10 - -/* From afs/krb.h */ -#define RD_AP_TIME 37 /* delta_t too big */ -#define INTK_BADPW 62 /* Incorrect password */ - -#define PROBE_USERNAME "OPENAFS-KDC-PROBE" -#define PROBE_PASSWORD_LEN 16 - -#ifdef __cplusplus -} -#endif -#endif /* AFSKFW_H */ diff --git a/src/WINNT/afsd/afslog95.c b/src/WINNT/afsd/afslog95.c deleted file mode 100644 index 20574cce0..000000000 --- a/src/WINNT/afsd/afslog95.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include "cm_config.h" -#include "krb.h" - -HANDLE hDLL; - -WSADATA WSAjunk; - -char NPName95[] = "System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\NetworkProvider"; - -/* - * GetLogonScript - * - * We get a logon script pathname from the HKEY_LOCAL_MACHINE registry. - * I don't know what good this does; I just copied it from DFS. - * - * Returns NULL on failure. - */ -WCHAR *GetLogonScript(void) -{ - WCHAR *script; - DWORD code; - DWORD LSPtype, LSPsize; - HKEY NPKey; - - /* - * Get Network Provider key. - * Assume this works or we wouldn't be here. - */ - (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, NPName95, - 0, KEY_QUERY_VALUE, &NPKey); - - /* - * Get Logon Script pathname length - */ - code = RegQueryValueEx(NPKey, "LogonScript", NULL, - &LSPtype, NULL, &LSPsize); - - if (code) { - RegCloseKey (NPKey); - return NULL; - } - - if (LSPtype != REG_SZ) { /* Maybe handle REG_EXPAND_SZ? */ - RegCloseKey (NPKey); - return NULL; - } - - script = (WCHAR *)LocalAlloc(LMEM_FIXED, LSPsize); - - /* - * Explicitly call UNICODE version - * Assume it will succeed since it did before - */ - (void) RegQueryValueExW(NPKey, L"LogonScript", NULL, - &LSPtype, (LPBYTE)script, &LSPsize); - - RegCloseKey (NPKey); - return script; -} - -DWORD MapAuthError(DWORD code) -{ - switch (code) { - case INTK_BADPW: return WN_BAD_PASSWORD; - case KERB_ERR_PRINCIPAL_UNKNOWN: return WN_BAD_USER; - default: return WN_NO_NETWORK; - } -} - -BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved) -{ - hDLL = dll; - switch (reason) { - case DLL_PROCESS_ATTACH: - /* Initialize AFS libraries */ - rx_Init(0); - ka_Init(0); - break; - - /* Everything else succeeds but does nothing. */ - case DLL_PROCESS_DETACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - default: - break; - } - - return TRUE; -} - -DWORD APIENTRY NPGetCaps(DWORD index) -{ - switch (index) { - case WNNC_SPEC_VERSION: - return WNNC_SPEC_VERSION51; - case WNNC_NET_TYPE: - /* Don't have our own type; use somebody else's. */ - return WNNC_NET_LANMAN; - case WNNC_DRIVER_VERSION: - return WNNC_DRIVER(1,1); - case WNNC_START: - return WNNC_START_DONE; - case WNNC_AUTHENTICATION: - return WNNC_AUTH_LOGON | WNNC_AUTH_LOGOFF; - default: - return 0; - } -} - -DWORD APIENTRY NPLogon( - HWND hwndOwner, - LPLOGONINFO lpAuthentInfo, - LPLOGONINFO lpPreviousAuthentInfo, - LPTSTR lpLogonScript, - DWORD dwBufferSize, - DWORD dwFlags) -{ - DWORD code; - int pw_exp; - char *reason; - char cell[256]; - - if (dwFlags & LOGON_DONE) - return 0; - - /* Check for zero length password */ - if (lpAuthentInfo->lpUsername[0] == 0) { - code = GT_PW_NULL; - reason = "zero length password is illegal"; - goto checkauth; - } - - /* Get cell name */ - code = cm_GetRootCellName(cell); - if (code < 0) { - code = KTC_NOCELL; - reason = "unknown cell"; - goto checkauth; - } - - code = ka_UserAuthenticateGeneral( - KA_USERAUTH_VERSION + KA_USERAUTH_AUTHENT_LOGON, - lpAuthentInfo->lpUsername, - "", cell, - lpAuthentInfo->lpPassword, - 0, &pw_exp, 0, &reason); - -checkauth: - if (code) { - MessageBox(hwndOwner, reason, "AFS logon", MB_OK); - code = MapAuthError(code); - } - - return code; -} - -DWORD APIENTRY NPLogoff( - HWND hwndOwner, - LPLOGONINFO lpAuthentInfo, - DWORD dwReason) -{ - return 0; -} diff --git a/src/WINNT/afsd/afslog95.def b/src/WINNT/afsd/afslog95.def deleted file mode 100644 index 82ff8df90..000000000 --- a/src/WINNT/afsd/afslog95.def +++ /dev/null @@ -1,11 +0,0 @@ -LIBRARY AFSLOG95 - -DESCRIPTION 'AFS Client Credential Provider DLL' - -EXPORTS - - DllEntryPoint - NPGetCaps @13 - NPLogon @43 - NPLogoff @44 - diff --git a/src/WINNT/afsd/afslog95.rc b/src/WINNT/afsd/afslog95.rc deleted file mode 100644 index 61f21409c..000000000 --- a/src/WINNT/afsd/afslog95.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Integrated Logon 95 DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afslog95" -#define AFS_VERINFO_FILENAME "afslog95.dll" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/afslogon.c b/src/WINNT/afsd/afslogon.c deleted file mode 100644 index 34833aa80..000000000 --- a/src/WINNT/afsd/afslogon.c +++ /dev/null @@ -1,1125 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "afslogon.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include "afsd.h" -#include "cm_config.h" -#include "krb.h" -#include "afskfw.h" -#include "lanahelper.h" - -#include - -DWORD TraceOption = 0; - -HANDLE hDLL; - -WSADATA WSAjunk; -#define AFS_LOGON_EVENT_NAME TEXT("AFS Logon") - -void DebugEvent0(char *a) -{ - HANDLE h; char *ptbuf[1]; - if (!ISLOGONTRACE(TraceOption)) - return; - h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME); - ptbuf[0] = a; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL); - DeregisterEventSource(h); -} - -#define MAXBUF_ 512 -void DebugEvent(char *b,...) -{ - HANDLE h; char *ptbuf[1],buf[MAXBUF_+1]; - va_list marker; - - if (!ISLOGONTRACE(TraceOption)) - return; - - h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME); - va_start(marker,b); - StringCbVPrintf(buf, MAXBUF_+1,b,marker); - buf[MAXBUF_] = '\0'; - ptbuf[0] = buf; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL); - DeregisterEventSource(h); - va_end(marker); -} - -static HANDLE hInitMutex = NULL; -static BOOL bInit = FALSE; - -BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved) -{ - hDLL = dll; - switch (reason) { - case DLL_PROCESS_ATTACH: - /* Initialization Mutex */ - hInitMutex = CreateMutex(NULL, FALSE, NULL); - break; - - case DLL_PROCESS_DETACH: - CloseHandle(hInitMutex); - break; - - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - default: - /* Everything else succeeds but does nothing. */ - break; - } - - return TRUE; -} - -void AfsLogonInit(void) -{ - if ( bInit == FALSE ) { - if ( WaitForSingleObject( hInitMutex, INFINITE ) == WAIT_OBJECT_0 ) { - if ( bInit == FALSE ) { - rx_Init(0); - initAFSDirPath(); - ka_Init(0); - bInit = TRUE; - } - ReleaseMutex(hInitMutex); - } - } -} - -CHAR *GenRandomName(CHAR *pbuf) -{ - int i; - srand( (unsigned)time( NULL ) ); - for (i=0;idwStartType < SERVICE_DEMAND_START) - result = TRUE; - - free_pConfig: - GlobalFree(pConfig); - close_svc: - CloseServiceHandle(svc); - close_scm: - CloseServiceHandle(scm); - - return result; -} - -DWORD MapAuthError(DWORD code) -{ - switch (code) { - /* Unfortunately, returning WN_NO_NETWORK results in the MPR abandoning - * logon scripts for all credential managers, although they will still - * receive logon notifications. Since we don't want this, we return - * WN_SUCCESS. This is highly undesirable, but we also don't want to - * break other network providers. - */ - /* case KTC_NOCM: - case KTC_NOCMRPC: - return WN_NO_NETWORK; */ - default: return WN_SUCCESS; - } -} - -DWORD APIENTRY NPGetCaps(DWORD index) -{ - switch (index) { - case WNNC_NET_TYPE: - /* Don't have our own type; use somebody else's. */ - return WNNC_NET_SUN_PC_NFS; - - case WNNC_START: - /* Say we are already started, even though we might wait after we receive NPLogonNotify */ - return 1; - - default: - return 0; - } -} - -NET_API_STATUS -NetUserGetProfilePath( LPCWSTR Domain, LPCWSTR UserName, char * profilePath, - DWORD profilePathLen ) -{ - NET_API_STATUS code; - LPWSTR ServerName = NULL; - LPUSER_INFO_3 p3 = NULL; - - NetGetAnyDCName(NULL, Domain, (LPBYTE *)&ServerName); - /* if NetGetAnyDCName fails, ServerName == NULL - * NetUserGetInfo will obtain local user information - */ - code = NetUserGetInfo(ServerName, UserName, 3, (LPBYTE *)&p3); - if (code == NERR_Success) - { - code = NERR_UserNotFound; - if (p3) { - if (p3->usri3_profile) { - DWORD len = lstrlenW(p3->usri3_profile); - if (len > 0) { - /* Convert From Unicode to ANSI (UTF-8 for future) */ - len = len < profilePathLen ? len : profilePathLen - 1; - WideCharToMultiByte(CP_UTF8, 0, p3->usri3_profile, len, profilePath, len, NULL, NULL); - profilePath[len] = '\0'; - code = NERR_Success; - } - } - NetApiBufferFree(p3); - } - } - if (ServerName) - NetApiBufferFree(ServerName); - return code; -} - -BOOL IsServiceRunning (void) -{ - SERVICE_STATUS Status; - SC_HANDLE hManager; - memset (&Status, 0x00, sizeof(Status)); - Status.dwCurrentState = SERVICE_STOPPED; - - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) - { - QueryServiceStatus (hService, &Status); - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - DebugEvent("AFS AfsLogon - Test Service Running","Return Code[%x] ?Running[%d]",Status.dwCurrentState,(Status.dwCurrentState == SERVICE_RUNNING)); - return (Status.dwCurrentState == SERVICE_RUNNING); -} - -BOOL IsServiceStartPending (void) -{ - SERVICE_STATUS Status; - SC_HANDLE hManager; - memset (&Status, 0x00, sizeof(Status)); - Status.dwCurrentState = SERVICE_STOPPED; - - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) - { - QueryServiceStatus (hService, &Status); - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - DebugEvent("AFS AfsLogon - Test Service Start Pending","Return Code[%x] ?Start Pending[%d]",Status.dwCurrentState,(Status.dwCurrentState == SERVICE_START_PENDING)); - return (Status.dwCurrentState == SERVICE_RUNNING); -} - -/* LOOKUPKEYCHAIN: macro to look up the value in the list of keys in order until it's found - v:variable to receive value (reference type) - t:type - d:default, in case the value isn't on any of the keys - n:name of value */ -#define LOOKUPKEYCHAIN(v,t,d,n) \ - do { \ - rv = ~ERROR_SUCCESS; \ - dwType = t; \ - if(hkDom) { \ - dwSize = sizeof(v); \ - rv = RegQueryValueEx(hkDom, n, 0, &dwType, (LPBYTE) &(v), &dwSize); \ - if(rv == ERROR_SUCCESS) DebugEvent(#v " found in hkDom with type [%d]", dwType); \ - } \ - if(hkDoms && (rv != ERROR_SUCCESS || dwType != t)) { \ - dwSize = sizeof(v); \ - rv = RegQueryValueEx(hkDoms, n, 0, &dwType, (LPBYTE) &(v), &dwSize); \ - if(rv == ERROR_SUCCESS) DebugEvent(#v " found in hkDoms with type [%d]", dwType); \ - } \ - if(hkNp && (rv != ERROR_SUCCESS || dwType != t)) { \ - dwSize = sizeof(v); \ - rv = RegQueryValueEx(hkNp, n, 0, &dwType, (LPBYTE) &(v), &dwSize); \ - if(rv == ERROR_SUCCESS) DebugEvent(#v " found in hkNp with type [%d]", dwType); \ - } \ - if(rv != ERROR_SUCCESS || dwType != t) { \ - v = d; \ - DebugEvent(#v " being set to default"); \ - } \ - } while(0) - -/* Get domain specific configuration info. We are returning void because if anything goes wrong - we just return defaults. - */ -void -GetDomainLogonOptions( PLUID lpLogonId, char * username, char * domain, LogonOptions_t *opt ) { - HKEY hkParm = NULL; /* Service parameter */ - HKEY hkNp = NULL; /* network provider key */ - HKEY hkDoms = NULL; /* domains key */ - HKEY hkDom = NULL; /* DOMAINS/domain key */ - HKEY hkTemp = NULL; - LONG rv; - DWORD dwSize; - DWORD dwType; - DWORD dwDummy; - char computerName[MAX_COMPUTERNAME_LENGTH + 1]; - char *effDomain; - - memset(opt, 0, sizeof(LogonOptions_t)); - - DebugEvent("In GetDomainLogonOptions for user [%s] in domain [%s]", username, domain); - /* If the domain is the same as the Netbios computer name, we use the LOCALHOST domain name*/ - opt->flags = LOGON_FLAG_REMOTE; - if(domain) { - dwSize = MAX_COMPUTERNAME_LENGTH; - if(GetComputerName(computerName, &dwSize)) { - if(!stricmp(computerName, domain)) { - effDomain = "LOCALHOST"; - opt->flags = LOGON_FLAG_LOCAL; - } - else - effDomain = domain; - } - } else - effDomain = NULL; - - rv = RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, 0, KEY_READ, &hkParm ); - if(rv != ERROR_SUCCESS) { - hkParm = NULL; - DebugEvent("GetDomainLogonOption: Can't open parms key [%d]", rv); - } - - rv = RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PROVIDER_SUBKEY, 0, KEY_READ, &hkNp ); - if(rv != ERROR_SUCCESS) { - hkNp = NULL; - DebugEvent("GetDomainLogonOptions: Can't open NP key [%d]", rv); - } - - if(hkNp) { - rv = RegOpenKeyEx( hkNp, REG_CLIENT_DOMAINS_SUBKEY, 0, KEY_READ, &hkDoms ); - if( rv != ERROR_SUCCESS ) { - hkDoms = NULL; - DebugEvent("GetDomainLogonOptions: Can't open Domains key [%d]", rv); - } - } - - if(hkDoms && effDomain) { - rv = RegOpenKeyEx( hkDoms, effDomain, 0, KEY_READ, &hkDom ); - if( rv != ERROR_SUCCESS ) { - hkDom = NULL; - DebugEvent("GetDomainLogonOptions: Can't open domain key for [%s] [%d]", effDomain, rv); - /* If none of the domains match, we shouldn't use the domain key either */ - RegCloseKey(hkDoms); - hkDoms = NULL; - } - } else - DebugEvent("Not opening domain key for [%s]", effDomain); - - /* Each individual can either be specified on the domain key, the domains key or in the - net provider key. They fail over in that order. If none is found, we just use the - defaults. */ - - /* LogonOption */ - LOOKUPKEYCHAIN(opt->LogonOption, REG_DWORD, DEFAULT_LOGON_OPTION, REG_CLIENT_LOGON_OPTION_PARM); - - /* FailLoginsSilently */ - dwSize = sizeof(dwDummy); - rv = RegQueryValueEx(hkParm, REG_CLIENT_FAIL_SILENTLY_PARM, 0, &dwType, (LPBYTE) &dwDummy, &dwSize); - if (rv != ERROR_SUCCESS) - LOOKUPKEYCHAIN(dwDummy, REG_DWORD, DEFAULT_FAIL_SILENTLY, REG_CLIENT_FAIL_SILENTLY_PARM); - opt->failSilently = !!dwDummy; - - /* Retry interval */ - LOOKUPKEYCHAIN(opt->retryInterval, REG_DWORD, DEFAULT_RETRY_INTERVAL, REG_CLIENT_RETRY_INTERVAL_PARM); - - /* Sleep interval */ - LOOKUPKEYCHAIN(opt->sleepInterval, REG_DWORD, DEFAULT_SLEEP_INTERVAL, REG_CLIENT_SLEEP_INTERVAL_PARM); - - opt->logonScript = NULL; - opt->smbName = NULL; - - if(!ISLOGONINTEGRATED(opt->LogonOption)) { - goto cleanup; /* no need to lookup the logon script */ - } - - /* come up with SMB username */ - if(ISHIGHSECURITY(opt->LogonOption)) { - opt->smbName = malloc( MAXRANDOMNAMELEN ); - GenRandomName(opt->smbName); - } else { - /* username and domain for logon session is not necessarily the same as - username and domain passed into network provider. */ - PSECURITY_LOGON_SESSION_DATA plsd; - char lsaUsername[MAX_USERNAME_LENGTH]; - char lsaDomain[MAX_DOMAIN_LENGTH]; - size_t len, tlen; - - LsaGetLogonSessionData(lpLogonId, &plsd); - - UnicodeStringToANSI(plsd->UserName, lsaUsername, MAX_USERNAME_LENGTH); - UnicodeStringToANSI(plsd->LogonDomain, lsaDomain, MAX_DOMAIN_LENGTH); - - DebugEvent("PLSD username[%s] domain[%s]",lsaUsername,lsaDomain); - - if(SUCCEEDED(StringCbLength(lsaUsername, MAX_USERNAME_LENGTH, &tlen))) - len = tlen; - else - goto bad_strings; - - if(SUCCEEDED(StringCbLength(lsaDomain, MAX_DOMAIN_LENGTH, &tlen))) - len += tlen; - else - goto bad_strings; - - len += 2; - - opt->smbName = malloc(len); - - StringCbCopy(opt->smbName, len, lsaDomain); - StringCbCat(opt->smbName, len, "\\"); - StringCbCat(opt->smbName, len, lsaUsername); - - strlwr(opt->smbName); - - bad_strings: - LsaFreeReturnBuffer(plsd); - } - - DebugEvent("Looking up logon script"); - /* Logon script */ - /* First find out where the key is */ - hkTemp = NULL; - rv = ~ERROR_SUCCESS; - dwType = 0; - if(hkDom) - rv = RegQueryValueExW(hkDom, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize); - if(rv == ERROR_SUCCESS && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) { - hkTemp = hkDom; - DebugEvent("Located logon script in hkDom"); - } - else if(hkDoms) - rv = RegQueryValueExW(hkDoms, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize); - if(rv == ERROR_SUCCESS && !hkTemp && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) { - hkTemp = hkDoms; - DebugEvent("Located logon script in hkDoms"); - } - /* Note that the LogonScript in the NP key is only used if we are doing high security. */ - else if(hkNp && ISHIGHSECURITY(opt->LogonOption)) - rv = RegQueryValueExW(hkNp, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize); - if(rv == ERROR_SUCCESS && !hkTemp && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) { - hkTemp = hkNp; - DebugEvent("Located logon script in hkNp"); - } - - if(hkTemp) { - WCHAR *regscript = NULL; - WCHAR *regexscript = NULL; - WCHAR *regexuscript = NULL; - WCHAR *wuname = NULL; - HRESULT hr; - - size_t len; - - StringCbLength(opt->smbName, MAX_USERNAME_LENGTH, &len); - len ++; - - wuname = malloc(len * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP,0,opt->smbName,-1,wuname,len*sizeof(WCHAR)); - - DebugEvent("Username is set for [%S]", wuname); - - /* dwSize still has the size of the required buffer in bytes. */ - regscript = malloc(dwSize); - rv = RegQueryValueExW(hkTemp, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, (LPBYTE) regscript, &dwSize); - if(rv != ERROR_SUCCESS) {/* what the ..? */ - DebugEvent("Can't look up logon script [%d]",rv); - goto doneLogonScript; - } - - DebugEvent("Found logon script [%S]", regscript); - - if(dwType == REG_EXPAND_SZ) { - DWORD dwReq; - - dwSize += MAX_PATH * sizeof(WCHAR); /* make room for environment expansion. */ - regexscript = malloc(dwSize); - dwReq = ExpandEnvironmentStringsW(regscript, regexscript, dwSize / sizeof(WCHAR)); - free(regscript); - regscript = regexscript; - regexscript = NULL; - if(dwReq > (dwSize / sizeof(WCHAR))) { - DebugEvent("Overflow while expanding environment strings."); - goto doneLogonScript; - } - } - - DebugEvent("After expanding env strings [%S]", regscript); - - if(wcsstr(regscript, L"%s")) { - dwSize += len * sizeof(WCHAR); /* make room for username expansion */ - regexuscript = (WCHAR *) LocalAlloc(LMEM_FIXED, dwSize); - hr = StringCbPrintfW(regexuscript, dwSize, regscript, wuname); - } else { - regexuscript = (WCHAR *) LocalAlloc(LMEM_FIXED, dwSize); - hr = StringCbCopyW(regexuscript, dwSize, regscript); - } - - DebugEvent("After expanding username [%S]", regexuscript); - - if(hr == S_OK) - opt->logonScript = regexuscript; - else - LocalFree(regexuscript); - - doneLogonScript: - if(wuname) free(wuname); - if(regscript) free(regscript); - if(regexscript) free(regexscript); - } - - DebugEvent("Looking up TheseCells"); - /* Logon script */ - /* First find out where the key is */ - hkTemp = NULL; - rv = ~ERROR_SUCCESS; - dwType = 0; - if (hkDom) - rv = RegQueryValueEx(hkDom, REG_CLIENT_THESE_CELLS_PARM, 0, &dwType, NULL, &dwSize); - if (rv == ERROR_SUCCESS && dwType == REG_MULTI_SZ) { - hkTemp = hkDom; - DebugEvent("Located TheseCells in hkDom"); - } else if (hkDoms) - rv = RegQueryValueEx(hkDoms, REG_CLIENT_THESE_CELLS_PARM, 0, &dwType, NULL, &dwSize); - if (rv == ERROR_SUCCESS && !hkTemp && dwType == REG_MULTI_SZ) { - hkTemp = hkDoms; - DebugEvent("Located TheseCells in hkDoms"); - } else if (hkNp) - rv = RegQueryValueEx(hkNp, REG_CLIENT_THESE_CELLS_PARM, 0, &dwType, NULL, &dwSize); - if (rv == ERROR_SUCCESS && !hkTemp && dwType == REG_MULTI_SZ) { - hkTemp = hkNp; - DebugEvent("Located TheseCells in hkNp"); - } - - if (hkTemp) { - CHAR * thesecells; - - /* dwSize still has the size of the required buffer in bytes. */ - thesecells = malloc(dwSize); - rv = RegQueryValueEx(hkTemp, REG_CLIENT_THESE_CELLS_PARM, 0, &dwType, (LPBYTE) thesecells, &dwSize); - if(rv != ERROR_SUCCESS) {/* what the ..? */ - DebugEvent("Can't look up TheseCells [%d]",rv); - goto doneTheseCells; - } - - DebugEvent("Found TheseCells [%s]", thesecells); - opt->theseCells = thesecells; - - doneTheseCells:; - } - - cleanup: - if(hkNp) RegCloseKey(hkNp); - if(hkDom) RegCloseKey(hkDom); - if(hkDoms) RegCloseKey(hkDoms); - if(hkParm) RegCloseKey(hkParm); -} - -#undef LOOKUPKEYCHAIN - -/* Try to find out which cell the given path is in. We must retain - the contents of *cell in case of failure. *cell is assumed to be - at least cellLen chars */ -DWORD GetFileCellName(char * path, char * cell, size_t cellLen) { - struct ViceIoctl blob; - char tcell[MAX_PATH]; - DWORD code; - - blob.in_size = 0; - blob.out_size = MAX_PATH; - blob.out = tcell; - - code = pioctl(path, VIOC_FILE_CELL_NAME, &blob, 1); - - if(!code) { - strncpy(cell, tcell, cellLen); - cell[cellLen - 1] = '\0'; - } - return code; -} - - -static BOOL -WINAPI -UnicodeStringToANSI(UNICODE_STRING uInputString, LPSTR lpszOutputString, int nOutStringLen) -{ - CPINFO CodePageInfo; - - GetCPInfo(CP_ACP, &CodePageInfo); - - if (CodePageInfo.MaxCharSize > 1) - // Only supporting non-Unicode strings - return FALSE; - - if (uInputString.Buffer && ((LPBYTE) uInputString.Buffer)[1] == '\0') - { - // Looks like unicode, better translate it - // UNICODE_STRING specifies the length of the buffer string in Bytes not WCHARS - WideCharToMultiByte(CP_ACP, 0, (LPCWSTR) uInputString.Buffer, uInputString.Length/2, - lpszOutputString, nOutStringLen-1, NULL, NULL); - lpszOutputString[min(uInputString.Length/2,nOutStringLen-1)] = '\0'; - return TRUE; - } - else - lpszOutputString[0] = '\0'; - return FALSE; -} // UnicodeStringToANSI - -DWORD APIENTRY NPLogonNotify( - PLUID lpLogonId, - LPCWSTR lpAuthentInfoType, - LPVOID lpAuthentInfo, - LPCWSTR lpPreviousAuthentInfoType, - LPVOID lpPreviousAuthentInfo, - LPWSTR lpStationName, - LPVOID StationHandle, - LPWSTR *lpLogonScript) -{ - char uname[MAX_USERNAME_LENGTH]=""; - char password[MAX_PASSWORD_LENGTH]=""; - char logonDomain[MAX_DOMAIN_LENGTH]=""; - char cell[256]=""; - char homePath[MAX_PATH]=""; - - MSV1_0_INTERACTIVE_LOGON *IL; - - DWORD code; - - int pw_exp; - char *reason; - char *ctemp; - - BOOLEAN interactive; - BOOLEAN flag; - DWORD LSPtype, LSPsize; - HKEY NPKey; - - HWND hwndOwner = (HWND)StationHandle; - - BOOLEAN afsWillAutoStart; - - BOOLEAN lowercased_name = TRUE; - - LogonOptions_t opt; /* domain specific logon options */ - int retryInterval; - int sleepInterval; - - /* Make sure the AFS Libraries are initialized */ - AfsLogonInit(); - - /* Initialize Logon Script to none */ - *lpLogonScript=NULL; - - /* TODO: We should check the value of lpAuthentInfoType before assuming that it is - MSV1_0_INTERACTIVE_LOGON though for our purposes KERB_INTERACTIVE_LOGON is - co-incidentally equivalent. */ - IL = (MSV1_0_INTERACTIVE_LOGON *) lpAuthentInfo; - - /* Are we interactive? */ - interactive = (wcscmp(lpStationName, L"WinSta0") == 0); - - /* Convert from Unicode to ANSI */ - - /*TODO: Use SecureZeroMemory to erase passwords */ - UnicodeStringToANSI(IL->UserName, uname, MAX_USERNAME_LENGTH); - UnicodeStringToANSI(IL->Password, password, MAX_PASSWORD_LENGTH); - UnicodeStringToANSI(IL->LogonDomainName, logonDomain, MAX_DOMAIN_LENGTH); - - /* Make sure AD-DOMANS sent from login that is sent to us is striped */ - ctemp = strchr(uname, '@'); - if (ctemp) *ctemp = 0; - - /* is the name all lowercase? */ - for ( ctemp = uname; *ctemp ; ctemp++) { - if ( !islower(*ctemp) ) { - lowercased_name = FALSE; - break; - } - } - - (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &NPKey); - LSPsize=sizeof(TraceOption); - RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL, - &LSPtype, (LPBYTE)&TraceOption, &LSPsize); - - RegCloseKey (NPKey); - - /* - * Get Logon options - */ - - GetDomainLogonOptions( lpLogonId, uname, logonDomain, &opt ); - retryInterval = opt.retryInterval; - sleepInterval = opt.sleepInterval; - *lpLogonScript = opt.logonScript; - - if (retryInterval < sleepInterval) - sleepInterval = retryInterval; - - DebugEvent("Got logon script: %S",opt.logonScript); - - afsWillAutoStart = AFSWillAutoStart(); - - DebugEvent("LogonOption[%x], Service AutoStart[%d]", - opt.LogonOption,afsWillAutoStart); - - /* Check for zero length password if integrated logon*/ - if ( ISLOGONINTEGRATED(opt.LogonOption) ) { - if ( password[0] == 0 ) { - DebugEvent("Password is the empty string"); - code = GT_PW_NULL; - reason = "zero length password is illegal"; - code=0; - } - - /* Get cell name if doing integrated logon. - We might overwrite this if we are logging into an AD realm and we find out that - the user's home dir is in some other cell. */ - DebugEvent("About to call cm_GetRootCellName(%s)",cell); - code = cm_GetRootCellName(cell); - if (code < 0) { - DebugEvent("Unable to obtain Root Cell"); - code = KTC_NOCELL; - reason = "unknown cell"; - code=0; - } else { - DebugEvent("Cell is %s",cell); - } - - /* We get the user's home directory path, if applicable, though we can't lookup the - cell right away because the client service may not have started yet. This call - also sets the AD_REALM flag in opt.flags if applicable. */ - if (ISREMOTE(opt.flags)) { - DebugEvent("Is Remote"); - GetAdHomePath(homePath,MAX_PATH,lpLogonId,&opt); - } - } - - /* loop until AFS is started. */ - while (TRUE) { - DebugEvent("while(TRUE) LogonOption[%x], Service AutoStart[%d]", - opt.LogonOption,afsWillAutoStart); - - if (ISADREALM(opt.flags)) { - code = GetFileCellName(homePath,cell,256); - if (!code) { - DebugEvent("profile path [%s] is in cell [%s]",homePath,cell); - } - /* Don't bail out if GetFileCellName failed. - * The home dir may not be in AFS after all. - */ - } else - code=0; - - /* if Integrated Logon */ - if (ISLOGONINTEGRATED(opt.LogonOption)) - { - if ( KFW_is_available() ) { - code = KFW_AFS_get_cred(uname, cell, password, 0, opt.smbName, &reason); - DebugEvent("KFW_AFS_get_cred uname=[%s] smbname=[%s] cell=[%s] code=[%d]",uname,opt.smbName,cell,code); - if (code == 0 && opt.theseCells) { - char * principal, *p; - - principal = (char *)malloc(strlen(uname) + strlen(cell) + 2); - if ( principal ) { - strcpy(principal, uname); - p = principal + strlen(uname); - *p++ = '@'; - strcpy(p, cell); - for ( ;*p; p++) { - *p = toupper(*p); - } - - p = opt.theseCells; - while ( *p ) { - code = KFW_AFS_get_cred(principal, p, 0, 0, opt.smbName, &reason); - DebugEvent("KFW_AFS_get_cred uname=[%s] smbname=[%s] cell=[%s] code=[%d]", - principal,opt.smbName,p,code); - p += strlen(p) + 1; - } - - free(principal); - } - } - } else { - code = ka_UserAuthenticateGeneral2(KA_USERAUTH_VERSION+KA_USERAUTH_AUTHENT_LOGON, - uname, "", cell, password, opt.smbName, 0, &pw_exp, 0, - &reason); - DebugEvent("AFS AfsLogon - (INTEGRATED only)ka_UserAuthenticateGeneral2","Code[%x] uname[%s] Cell[%s]", - code,uname,cell); - } - if ( code && code != KTC_NOCM && code != KTC_NOCMRPC && !lowercased_name ) { - for ( ctemp = uname; *ctemp ; ctemp++) { - *ctemp = tolower(*ctemp); - } - lowercased_name = TRUE; - goto sleeping; - } - - /* is service started yet?*/ - - /* If we've failed because the client isn't running yet and the - * client is set to autostart (and therefore it makes sense for - * us to wait for it to start) then sleep a while and try again. - * If the error was something else, then give up. */ - if (code != KTC_NOCM && code != KTC_NOCMRPC || !afsWillAutoStart) - break; - } - else { - /*JUST check to see if its running*/ - if (IsServiceRunning()) - break; - if (afsWillAutoStart && !IsServiceStartPending()) { - code = KTC_NOCMRPC; - reason = "AFS Service start failed"; - break; - } - } - - /* If the retry interval has expired and we still aren't - * logged in, then just give up if we are not in interactive - * mode or the failSilently flag is set, otherwise let the - * user know we failed and give them a chance to try again. */ - if (retryInterval <= 0) { - reason = "AFS not running"; - if (!interactive || opt.failSilently) - break; - flag = MessageBox(hwndOwner, - "AFS is still starting. Retry?", - "AFS Logon", - MB_ICONQUESTION | MB_RETRYCANCEL); - if (flag == IDCANCEL) - break; - - /* Wait just a little while and try again */ - retryInterval = opt.retryInterval; - } - - sleeping: - Sleep(sleepInterval * 1000); - retryInterval -= sleepInterval; - } - - DebugEvent("while loop exited"); - /* remove any kerberos 5 tickets currently held by the SYSTEM account */ - if ( KFW_is_available() ) - KFW_AFS_destroy_tickets_for_cell(cell); - - if (code) { - char msg[128]; - HANDLE h; - char *ptbuf[1]; - - StringCbPrintf(msg, sizeof(msg), "Integrated login failed: %s", reason); - - if (ISLOGONINTEGRATED(opt.LogonOption) && interactive && !opt.failSilently) - MessageBox(hwndOwner, msg, "AFS Logon", MB_OK); - - h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME); - ptbuf[0] = msg; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1008, NULL, - 1, 0, ptbuf, NULL); - DeregisterEventSource(h); - - code = MapAuthError(code); - SetLastError(code); - - if (ISLOGONINTEGRATED(opt.LogonOption) && (code!=0)) - { - if (*lpLogonScript) - LocalFree(*lpLogonScript); - *lpLogonScript = NULL; - if (!afsWillAutoStart) // its not running, so if not autostart or integrated logon then just skip - code = 0; - } - } - - if (opt.theseCells) free(opt.theseCells); - if (opt.smbName) free(opt.smbName); - - DebugEvent("AFS AfsLogon - Exit","Return Code[%x]",code); - return code; -} - -DWORD APIENTRY NPPasswordChangeNotify( - LPCWSTR lpAuthentInfoType, - LPVOID lpAuthentInfo, - LPCWSTR lpPreviousAuthentInfoType, - LPVOID lpPreviousAuthentInfo, - LPWSTR lpStationName, - LPVOID StationHandle, - DWORD dwChangeInfo) -{ - /* Make sure the AFS Libraries are initialized */ - AfsLogonInit(); - - DebugEvent0("AFS AfsLogon - NPPasswordChangeNotify"); - return 0; -} - -#include -#include -#include -#include - -BOOL IsPathInAfs(const CHAR *strPath) -{ - char space[2048]; - struct ViceIoctl blob; - int code; - - blob.in_size = 0; - blob.out_size = 2048; - blob.out = space; - - code = pioctl((LPTSTR)((LPCTSTR)strPath), VIOC_FILE_CELL_NAME, &blob, 1); - if (code) - return FALSE; - return TRUE; -} - -#ifdef COMMENT -typedef struct _WLX_NOTIFICATION_INFO { - ULONG Size; - ULONG Flags; - PWSTR UserName; - PWSTR Domain; - PWSTR WindowStation; - HANDLE hToken; - HDESK hDesktop; - PFNMSGECALLBACK pStatusCallback; -} WLX_NOTIFICATION_INFO, *PWLX_NOTIFICATION_INFO; -#endif - -VOID AFS_Startup_Event( PWLX_NOTIFICATION_INFO pInfo ) -{ - DWORD LSPtype, LSPsize; - HKEY NPKey; - - /* Make sure the AFS Libraries are initialized */ - AfsLogonInit(); - - (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &NPKey); - LSPsize=sizeof(TraceOption); - RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL, - &LSPtype, (LPBYTE)&TraceOption, &LSPsize); - - RegCloseKey (NPKey); - DebugEvent0("AFS_Startup_Event"); -} - -VOID AFS_Logoff_Event( PWLX_NOTIFICATION_INFO pInfo ) -{ - DWORD code; - TCHAR profileDir[1024] = TEXT(""); - DWORD len = 1024; - PTOKEN_USER tokenUser = NULL; - DWORD retLen; - - /* Make sure the AFS Libraries are initialized */ - AfsLogonInit(); - - DebugEvent0("AFS_Logoff_Event - Start"); - - if (!GetTokenInformation(pInfo->hToken, TokenUser, NULL, 0, &retLen)) - { - if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { - tokenUser = (PTOKEN_USER) LocalAlloc(LPTR, retLen); - - if (!GetTokenInformation(pInfo->hToken, TokenUser, tokenUser, retLen, &retLen)) - { - DebugEvent("AFS_Logoff_Event - GetTokenInformation failed: GLE = %lX", GetLastError()); - } - } - } - - /* We can't use pInfo->Domain for the domain since in the cross realm case - * this is source domain and not the destination domain. - */ - if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) { - WCHAR Domain[64]=L""; - GetLocalShortDomain(Domain, sizeof(Domain)); - if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain)) { - if (NetUserGetProfilePath(pInfo->Domain, pInfo->UserName, profileDir, len)) - GetUserProfileDirectory(pInfo->hToken, profileDir, &len); - } - } - - if (strlen(profileDir)) { - DebugEvent("AFS_Logoff_Event - Profile Directory: %s", profileDir); - if (!IsPathInAfs(profileDir)) { - if (code = ktc_ForgetAllTokens()) - DebugEvent("AFS_Logoff_Event - ForgetAllTokens failed [%lX]",code); - else - DebugEvent0("AFS_Logoff_Event - ForgetAllTokens succeeded"); - } else { - DebugEvent0("AFS_Logoff_Event - Tokens left in place; profile in AFS"); - } - } else { - DebugEvent0("AFS_Logoff_Event - Unable to load profile"); - } - - if ( tokenUser ) - LocalFree(tokenUser); - - DebugEvent0("AFS_Logoff_Event - End"); -} - -VOID AFS_Logon_Event( PWLX_NOTIFICATION_INFO pInfo ) -{ - DWORD code; - TCHAR profileDir[1024] = TEXT(""); - DWORD len = 1024; - PTOKEN_USER tokenUser = NULL; - DWORD retLen; - HANDLE hToken; - - WCHAR szUserW[128] = L""; - char szUserA[128] = ""; - char szClient[MAX_PATH]; - char szPath[MAX_PATH] = ""; - NETRESOURCE nr; - DWORD res; - DWORD gle; - DWORD dwSize; - - /* Make sure the AFS Libraries are initialized */ - AfsLogonInit(); - - DebugEvent0("AFS_Logon_Event - Start"); - - if (!GetTokenInformation(pInfo->hToken, TokenUser, NULL, 0, &retLen)) - { - if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { - tokenUser = (PTOKEN_USER) LocalAlloc(LPTR, retLen); - - if (!GetTokenInformation(pInfo->hToken, TokenUser, tokenUser, retLen, &retLen)) - { - DebugEvent("AFS_Logon_Event - GetTokenInformation failed: GLE = %lX", GetLastError()); - } - } - } - - /* We can't use pInfo->Domain for the domain since in the cross realm case - * this is source domain and not the destination domain. - */ - if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) { - WCHAR Domain[64]=L""; - GetLocalShortDomain(Domain, sizeof(Domain)); - if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain)) { - if (NetUserGetProfilePath(pInfo->Domain, pInfo->UserName, profileDir, len)) - GetUserProfileDirectory(pInfo->hToken, profileDir, &len); - } - } - - if (strlen(profileDir)) { - DebugEvent("AFS_Logon_Event - Profile Directory: %s", profileDir); - } else { - DebugEvent0("AFS_Logon_Event - Unable to load profile"); - } - - dwSize = sizeof(szUserA); - if (!KFW_AFS_get_lsa_principal(szUserA, &dwSize)) { - StringCbPrintfW(szUserW, sizeof(szUserW), L"%s\\%s", pInfo->Domain, pInfo->UserName); - WideCharToMultiByte(CP_ACP, 0, szUserW, -1, szUserA, MAX_PATH, NULL, NULL); - } - - if (szUserA[0]) - { - lana_GetNetbiosName(szClient, LANA_NETBIOS_NAME_FULL); - StringCbPrintf(szPath, sizeof(szPath), "\\\\%s", szClient); - - DebugEvent("AFS_Logon_Event - Logon Name: %s", szUserA); - - memset (&nr, 0x00, sizeof(NETRESOURCE)); - nr.dwType=RESOURCETYPE_DISK; - nr.lpLocalName=0; - nr.lpRemoteName=szPath; - res = WNetAddConnection2(&nr,NULL,szUserA,0); - if (res) - DebugEvent("AFS_Logon_Event - WNetAddConnection2(%s,%s) failed: 0x%X", - szPath, szUserA,res); - else - DebugEvent0("AFS_Logon_Event - WNetAddConnection2() succeeded"); - } else - DebugEvent("AFS_Logon_Event - User name conversion failed: GLE = 0x%X",GetLastError()); - - if ( tokenUser ) - LocalFree(tokenUser); - - DebugEvent0("AFS_Logon_Event - End"); -} - diff --git a/src/WINNT/afsd/afslogon.def b/src/WINNT/afsd/afslogon.def deleted file mode 100644 index fa8daccc1..000000000 --- a/src/WINNT/afsd/afslogon.def +++ /dev/null @@ -1,15 +0,0 @@ -LIBRARY AFSLOGON - -DESCRIPTION 'AFS Client Credential Provider DLL' - -EXPORTS - - DllEntryPoint - NPGetCaps - NPLogonNotify - NPPasswordChangeNotify - AFS_Startup_Event - AFS_Logoff_Event - AFS_Logon_Event - - diff --git a/src/WINNT/afsd/afslogon.h b/src/WINNT/afsd/afslogon.h deleted file mode 100644 index c37e438a7..000000000 --- a/src/WINNT/afsd/afslogon.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - -Copyright 2004 by the Massachusetts Institute of Technology - -All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of the Massachusetts -Institute of Technology (M.I.T.) not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -*/ - -/* We only support VC 1200 and above anyway */ -#pragma once - -#include -#include -#include -#include - - -#define REG_CLIENT_DOMAINS_SUBKEY "Domain" -#define REG_CLIENT_RETRY_INTERVAL_PARM "LoginRetryInterval" -#define REG_CLIENT_SLEEP_INTERVAL_PARM "LoginSleepInterval" -#define REG_CLIENT_FAIL_SILENTLY_PARM "FailLoginsSilently" -#define REG_CLIENT_TRACE_OPTION_PARM "TraceOption" -#define REG_CLIENT_LOGON_OPTION_PARM "LogonOptions" -#define REG_CLIENT_LOGON_SCRIPT_PARMW L"LogonScript" -#define REG_CLIENT_THESE_CELLS_PARM "TheseCells" -#define DEFAULT_RETRY_INTERVAL 60 /* seconds*/ -#define DEFAULT_FAIL_SILENTLY FALSE -#define DEFAULT_SLEEP_INTERVAL 5 /* seconds*/ -#define DEFAULT_LOGON_OPTION 1 - -#define TRACE_OPTION_EVENT 1 - -#define ISLOGONTRACE(v) ( ((v) & TRACE_OPTION_EVENT)==TRACE_OPTION_EVENT) - -#define ISLOGONINTEGRATED(v) ( ((v) & LOGON_OPTION_INTEGRATED)==LOGON_OPTION_INTEGRATED) -#define ISHIGHSECURITY(v) ( ((v) & LOGON_OPTION_HIGHSECURITY)==LOGON_OPTION_HIGHSECURITY) - -#define ISREMOTE(v) ( ((v) & LOGON_FLAG_REMOTE)==LOGON_FLAG_REMOTE) -#define ISADREALM(v) ( ((v) & LOGON_FLAG_AD_REALM)==LOGON_FLAG_AD_REALM) -extern DWORD TraceOption; - -#define LOGON_FLAG_LOCAL 0 -#define LOGON_FLAG_REMOTE 1 -#define LOGON_FLAG_AD_REALM 2 - -typedef struct LogonOptions_type { - DWORD LogonOption; - BOOLEAN failSilently; - int retryInterval; - int sleepInterval; - char * smbName; - LPWSTR logonScript; - DWORD flags; /* LOGON_FLAG_* */ - char * theseCells; -} LogonOptions_t; - -/* */ -#define MAX_USERNAME_LENGTH 256 -#define MAX_PASSWORD_LENGTH 256 -#define MAX_DOMAIN_LENGTH 256 - -BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved); - -DWORD APIENTRY NPGetCaps(DWORD index); - -DWORD APIENTRY NPLogonNotify( - PLUID lpLogonId, - LPCWSTR lpAuthentInfoType, - LPVOID lpAuthentInfo, - LPCWSTR lpPreviousAuthentInfoType, - LPVOID lpPreviousAuthentInfo, - LPWSTR lpStationName, - LPVOID StationHandle, - LPWSTR *lpLogonScript); - -DWORD APIENTRY NPPasswordChangeNotify( - LPCWSTR lpAuthentInfoType, - LPVOID lpAuthentInfo, - LPCWSTR lpPreviousAuthentInfoType, - LPVOID lpPreviousAuthentInfo, - LPWSTR lpStationName, - LPVOID StationHandle, - DWORD dwChangeInfo); - -#ifdef __cplusplus -extern "C" { -#endif - -void DebugEvent0(char *a); -void DebugEvent(char *b,...); - -CHAR *GenRandomName(CHAR *pbuf); - -BOOLEAN AFSWillAutoStart(void); - -DWORD MapAuthError(DWORD code); - -BOOL IsServiceRunning (void); - -static BOOL WINAPI UnicodeStringToANSI(UNICODE_STRING uInputString, LPSTR lpszOutputString, int nOutStringLen); - -void GetDomainLogonOptions( PLUID lpLogonId, char * username, char * domain, LogonOptions_t *opt ); -DWORD GetFileCellName(char * path, char * cell, size_t cellLen); -DWORD GetAdHomePath(char * homePath, size_t homePathLen, PLUID lpLogonId, LogonOptions_t * opt); -DWORD QueryAdHomePathFromSid(char * homePath, size_t homePathLen, PSID psid, PWSTR domain); -BOOL GetLocalShortDomain(PWSTR Domain, DWORD cbDomain); - -#ifdef __cplusplus -} -#endif diff --git a/src/WINNT/afsd/afslogon.rc b/src/WINNT/afsd/afslogon.rc deleted file mode 100644 index 1b541fd52..000000000 --- a/src/WINNT/afsd/afslogon.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Integrated Logon DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afslogon" -#define AFS_VERINFO_FILENAME "afslogon.dll" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/afsmsg95.c b/src/WINNT/afsd/afsmsg95.c deleted file mode 100644 index 5abec8c24..000000000 --- a/src/WINNT/afsd/afsmsg95.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* This file contains functions used by the Windows 95 (DJGPP) AFS client - to communicate with the startup executable. */ - -#include -#include -#include -#include - -#include "afs/afsmsg95.h" - -int sock; -struct sockaddr_in addr; -extern int errno; - -int afsMsg_Init() -{ - int rc; - struct sockaddr_in myaddr; - - sock = socket(AF_INET, SOCK_DGRAM, 0); - if (sock < 0) - return -1; - - addr.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */ - addr.sin_family = AF_INET; - addr.sin_port = htons(AFS_MSG_PORT); - - myaddr.sin_addr.s_addr = INADDR_ANY; - myaddr.sin_family = AF_INET; - myaddr.sin_port = 0; - - rc = bind(sock, (struct sockaddr *) &myaddr, sizeof(myaddr)); -#ifdef DEBUG - fprintf(stderr, "afsMsg_Init: bind sock %d rc=%d\n", sock, rc); -#endif - - return 0; -} - -int afsMsg_StatusChange(int status, int exitCode, char *string) -{ - afsMsg_statChange_t *msgP; - int rc; - int slen = 0; - char msgBuf[AFS_MAX_MSG_LEN]; - int now; - - msgP = (afsMsg_statChange_t *) msgBuf; - - msgP->hdr.msgtype = AFS_MSG_STATUS_CHANGE; - - msgP->newStatus = status; - msgP->exitCode = exitCode; - - if (string) - { - slen = strlen(string); /* one extra for NULL */ - if (slen > AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t)) - slen = AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t); - strncpy(&msgP->message, string, slen); - } - - msgP->hdr.length = sizeof(afsMsg_statChange_t) + slen; - - rc = sendto(sock, msgP, msgP->hdr.length, 0, (struct sockaddr *) &addr, - sizeof(addr)); - /*rc = send(sock, &msg, msg.hdr.length, 0);*/ - time(&now); -#ifdef DEBUG - fprintf(stderr, "%s: sent status change %d to sock %d length %d size=%d errno=%d\n", - asctime(localtime(&now)), status, - sock, msgP->hdr.length, rc, (rc < 0 ? errno:0)); -#endif - fflush(stdout); - - return rc; -} - -int afsMsg_Print(char *str, int level) -{ - afsMsg_print_t *msgP; - int rc; - char msgBuf[AFS_MAX_MSG_LEN]; - int slen; - - slen = strlen(str); /* one extra for NULL */ - if (slen > AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t)) - slen = AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t); - strncpy(&msgP->message, str, slen); - - msgP->hdr.msgtype = AFS_MSG_PRINT; - msgP->hdr.length = sizeof(afsMsg_hdr_t) + slen; - msgP->debugLevel = level; - strcpy(&msgP->message, str); - - rc = sendto(sock, msgP, msgP->hdr.length, 0, (struct sockaddr *) &addr, - sizeof(addr)); - return rc; -} - -int afsMsg_Shutdown() -{ - int rc; - rc = close(sock); - if (rc < 0) fprintf(stderr, "error closing socket, rc=%d\n", rc); -#ifdef DEBUG - else fprintf(stderr, "socket closed\n"); -#endif - fflush(stderr); -} diff --git a/src/WINNT/afsd/afsmsg95.h b/src/WINNT/afsd/afsmsg95.h deleted file mode 100644 index 57f14933a..000000000 --- a/src/WINNT/afsd/afsmsg95.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _AFSMSG_H -#define _AFSMSG_H - -#define AFS_MSG_PORT 2020 - -#define AFS_MAX_MSG_LEN 512 - -typedef struct _afsMsg_hdr { - int msgtype; - int length; -} afsMsg_hdr_t; - -#define AFS_MSG_STATUS_CHANGE 1 -#define AFS_MSG_PRINT 2 - -typedef struct _afsMsg_statChange { - afsMsg_hdr_t hdr; - int oldStatus; - int newStatus; - int exitCode; - char message; -} afsMsg_statChange_t; - -#define AFS_STATUS_NOSTATUS -1 -#define AFS_STATUS_INIT 1 -#define AFS_STATUS_RUNNING 2 -#define AFS_STATUS_EXITING 3 - -#define AFS_EXITCODE_NORMAL 0 -#define AFS_EXITCODE_PANIC 2 -#define AFS_EXITCODE_NETWORK_FAILURE 3 -#define AFS_EXITCODE_GENERAL_FAILURE 100 - -typedef struct _afsMsg_print { - afsMsg_hdr_t hdr; - int debugLevel; - char message; -} afsMsg_print_t; - -#endif diff --git a/src/WINNT/afsd/afsrpc.idl b/src/WINNT/afsd/afsrpc.idl deleted file mode 100644 index 7013d006f..000000000 --- a/src/WINNT/afsd/afsrpc.idl +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -[ -implicit_handle(handle_t hAfsHandle), -uuid(2131bed0-5484-11d2-b6c6-006097221e3d), -version(1.0) -] - -interface afsrpc - -{ - -/* Copied from declaration of GUID in RPCDCE.H */ -typedef struct afs_uuid { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; -} afs_uuid_t; - -long AFSRPC_SetToken( - [in] afs_uuid_t uuid, - [in] unsigned char sessionKey[8] -); - -long AFSRPC_GetToken( - [in] afs_uuid_t uuid, - [out] unsigned char sessionKey[8] -); - -} diff --git a/src/WINNT/afsd/afsrpc95.h b/src/WINNT/afsd/afsrpc95.h deleted file mode 100644 index a763f574e..000000000 --- a/src/WINNT/afsd/afsrpc95.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef AFSRPC_H -#define AFSRPC_H - -/* Copied from declaration of GUID in RPCDCE.H */ -typedef struct afs_uuid { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; -} afs_uuid_t; - -long AFSRPC_SetToken( - afs_uuid_t uuid, - unsigned char sessionKey[8] -); - -long AFSRPC_GetToken( - afs_uuid_t uuid, - unsigned char sessionKey[8] -); - -#endif diff --git a/src/WINNT/afsd/afsshare.c b/src/WINNT/afsd/afsshare.c deleted file mode 100644 index 843f345bc..000000000 --- a/src/WINNT/afsd/afsshare.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include - -#include - -int -main(int argc, char **argv) { - BOOL res; - HKEY hkSubmounts; - HKEY hkParameters; - char mountRoot[64]="/afs"; - char * mountstring; - - if (argc < 2 || argc > 3) { - fprintf(stderr, "afsshare.exe []\n"); - exit(1); - } - - if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE, - NULL, - &hkSubmounts, - NULL) == ERROR_SUCCESS) - { - if ( argc == 2 ) { - if (RegDeleteValue(hkSubmounts, argv[1])) { - fprintf(stderr,"Submount Deletion failure for [%s]: %lX", - argv[1], GetLastError()); - RegCloseKey(hkSubmounts); - return 1; - } - } else { - if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ, - NULL, - &hkParameters, - NULL) == ERROR_SUCCESS) - { - DWORD dwSize = sizeof(mountRoot); - RegQueryValueEx (hkParameters, "MountRoot", NULL, NULL, (PBYTE)mountRoot, &dwSize); - RegCloseKey(hkParameters); - } - - - if ( !strncmp(mountRoot, argv[2], strlen(mountRoot)) ) - mountstring = argv[2] + strlen(mountRoot); - else - mountstring = argv[2]; - - if (RegSetValueEx(hkSubmounts, argv[1], 0, REG_EXPAND_SZ, mountstring, strlen(mountstring)+1)) { - fprintf(stderr,"Submount Set failure for [%s]: %lX", - argv[1], GetLastError()); - RegCloseKey(hkSubmounts); - return 2; - } - } - RegCloseKey(hkSubmounts); - } else { - fprintf(stderr,"Submount access denied: %lX", GetLastError()); - return 3; - } - return 0; -} diff --git a/src/WINNT/afsd/afsshare.rc b/src/WINNT/afsd/afsshare.rc deleted file mode 100644 index a4af961ff..000000000 --- a/src/WINNT/afsd/afsshare.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Submount Command" -#define AFS_VERINFO_NAME "afsshare" -#define AFS_VERINFO_FILENAME "afsshare.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/cklog.c b/src/WINNT/afsd/cklog.c deleted file mode 100644 index 9f3d901ac..000000000 --- a/src/WINNT/afsd/cklog.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include "cm_config.h" -#include "cmd.h" -#include - -#define AFS_KERBEROS_ENV - -#define BAD_ARGUMENT 1 -#define KLOGEXIT(code) exit(code) - -int CommandProc(); - -static int zero_argc; -static char **zero_argv; - -void main (argc, argv) - int argc; - char *argv[]; -{ struct cmd_syndesc *ts; - int code; - WSADATA WSAjunk; - - zero_argc = argc; - zero_argv = argv; - - /* Start up sockets */ - WSAStartup(0x0101, &WSAjunk); - - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "obtain Kerberos authentication"); - -#define aXFLAG 0 -#define aPRINCIPAL 1 -#define aPASSWORD 2 -#define aCELL 3 -#define aSERVERS 4 -#define aPIPE 5 -#define aSILENT 6 -#define aLIFETIME 7 -#define aSETPAG 8 -#define aTMP 9 - - - cmd_AddParm(ts, "-x", CMD_FLAG, CMD_OPTIONAL, "(obsolete, noop)"); - cmd_Seek(ts, aPRINCIPAL); - cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_OPTIONAL, "user name"); - cmd_AddParm(ts, "-password", CMD_SINGLE, CMD_OPTIONAL, "user's password"); - cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); - cmd_AddParm(ts, "-servers", CMD_LIST, CMD_OPTIONAL, "explicit list of servers"); - cmd_AddParm(ts, "-pipe", CMD_FLAG, CMD_OPTIONAL, "read password from stdin"); - cmd_AddParm(ts, "-silent", CMD_FLAG, CMD_OPTIONAL, "silent operation"); - cmd_AddParm(ts, "-lifetime", CMD_SINGLE, CMD_OPTIONAL, "ticket lifetime in hh[:mm[:ss]]"); - cmd_AddParm(ts, "-setpag", CMD_FLAG, CMD_OPTIONAL, "Create a new setpag before authenticating"); - cmd_AddParm(ts, "-tmp", CMD_FLAG, CMD_OPTIONAL, "write Kerberos-style ticket file in /tmp"); - - code = cmd_Dispatch(argc, argv); - KLOGEXIT(code); -} - -static char *getpipepass() { - static char gpbuf[BUFSIZ]; - /* read a password from stdin, stop on \n or eof */ - register int i, tc; - memset(gpbuf, 0, sizeof(gpbuf)); - for(i=0; i<(sizeof(gpbuf)-1); i++) { - tc = fgetc(stdin); - if (tc == '\n' || tc == EOF) break; - gpbuf[i] = tc; - } - return gpbuf; -} - -/* good_gets is like gets except that it take a max string length and won't - * write past the end of its input buffer. It returns a variety of negative - * numbers in case of errors and zero if there was no characters read (a blank - * line for instance). Otherwise it returns the length of the string read in. - */ - -static int good_gets (s, max) - char *s; - int max; -{ int l; /* length of string read */ - if (!fgets (s, max, stdin)) { - if (feof(stdin)) return EOF; /* EOF on input, nothing read */ - else return -2; /* I don't think this can happen */ - } - l = strlen (s); - if (l && (s[l-1] == '\n')) s[--l] = 0; - return l; -} - -static int read_pw_string(char *s, int max) -{ - int ok = 0; - HANDLE h; - int md; - - /* set no echo */ - h = GetStdHandle (STD_INPUT_HANDLE); - GetConsoleMode (h, &md); - SetConsoleMode (h, md & ~ENABLE_ECHO_INPUT); - - while (!ok) { - printf("Password:"); - fflush(stdout); - if (good_gets(s, max) <= 0) { - printf("\n"); fflush(stdout); - if (feof (stdin)) break; /* just give up */ - else continue; /* try again: blank line */ - } - ok = 1; - } - - if (!ok) - memset(s, 0, max); - - /* reset echo */ - SetConsoleMode (h, md); - printf("\n"); fflush(stdout); - - s[max-1] = 0; /* force termination */ - return !ok; -} - -CommandProc (as, arock) - char *arock; - struct cmd_syndesc *as; -{ - char name[MAXKTCNAMELEN]; - char instance[MAXKTCNAMELEN]; - char cell[MAXKTCREALMLEN]; - char defaultCell[256]; - char realm[MAXKTCREALMLEN]; - int code; - int i, dosetpag; - int lifetime; /* requested ticket lifetime */ - - char passwd[BUFSIZ]; - - static char rn[] = "klog"; /*Routine name*/ - static int Pipe = 0; /* reading from a pipe */ - static int Silent = 0; /* Don't want error messages */ - - int foundPassword = 0; /*Not yet, anyway*/ - int foundExplicitCell = 0; /*Not yet, anyway*/ - int writeTicketFile = 0; /* write ticket file to /tmp */ - int password_expires = -1; - - char *reason; /* string describing errors */ - - name[0] = '\0'; - instance[0] = '\0'; - cell[0] = '\0'; - - - /* blow away command line arguments */ - for (i=1; iparms[aSILENT].items ? 1 : 0); - Pipe = (as->parms[aPIPE].items ? 1 : 0); - - /* Determine if we should also do a setpag based on -setpag switch */ - dosetpag = (as->parms[aSETPAG].items ? 1 : 0); - - if (as->parms[aTMP].items) { - writeTicketFile = 1; - } - - cm_GetRootCellName(defaultCell); - ka_Init(0); - - /* Parse our arguments. */ - - if (as->parms[aCELL].items) { - /* - * cell name explicitly mentioned; take it in if no other cell name - * has already been specified and if the name actually appears. If - * the given cell name differs from our own, we don't do a lookup. - */ - foundExplicitCell = 1; - strncpy (realm, as->parms[aCELL].items->data, sizeof(realm)); - } - - if (as->parms[aSERVERS].items) { - fprintf (stderr, "SERVERS option not available.\n"); - } - - if (as->parms[aPRINCIPAL].items) { - ka_ParseLoginName (as->parms[aPRINCIPAL].items->data, - name, instance, cell); - if (strlen (instance) > 0) - if (!Silent) { - fprintf (stderr, - "Non-null instance (%s) may cause strange behavior.\n", - instance); - } - if (strlen(cell) > 0) { - if (foundExplicitCell) { - if (!Silent) { - fprintf (stderr, - "%s: May not specify an explicit cell twice.\n", rn); - } - return -1; - } - foundExplicitCell = 1; - strncpy (realm, cell, sizeof(realm)); - } - } else { - /* No explicit name provided. */ - DWORD size = GetEnvironmentVariable("USERNAME", name, sizeof(name) - 1); - if (size <= 0 || size >= sizeof(name)) { - size = sizeof(name) - 1; - if (!GetUserName(name, &size)) { - KLOGEXIT( BAD_ARGUMENT ); - } - } - } - - if (as->parms[aPASSWORD].items) { - /* - * Current argument is the desired password string. Remember it in - * our local buffer, and zero out the argument string - anyone can - * see it there with ps! - */ - foundPassword = 1; - strncpy (passwd, as->parms[aPASSWORD].items->data, sizeof(passwd)); - memset (as->parms[aPASSWORD].items->data, 0, - strlen(as->parms[aPASSWORD].items->data)); - } - - if (as->parms[aLIFETIME].items) { - char *life = as->parms[aLIFETIME].items->data; - char *sp; /* string ptr to rest of life */ - lifetime = 3600*strtol (life, &sp, 0); /* hours */ - if (sp == life) { -bad_lifetime: - if (!Silent) fprintf (stderr, "%s: translating '%s' to lifetime failed\n", - rn, life); - return BAD_ARGUMENT; - } - if (*sp == ':') { - life = sp+1; /* skip the colon */ - lifetime += 60*strtol (life, &sp, 0); /* minutes */ - if (sp == life) goto bad_lifetime; - if (*sp == ':') { - life = sp+1; - lifetime += strtol (life, &sp, 0); /* seconds */ - if (sp == life) goto bad_lifetime; - if (*sp) goto bad_lifetime; - } else if (*sp) goto bad_lifetime; - } else if (*sp) goto bad_lifetime; - if (lifetime > MAXKTCTICKETLIFETIME) { - if (!Silent) - fprintf (stderr, - "%s: a lifetime of %.2f hours is too long, must be less than %d.\n", - rn, (double)lifetime/3600.0, MAXKTCTICKETLIFETIME/3600); - KLOGEXIT( BAD_ARGUMENT ); - } - } else lifetime = 0; - - if (!foundExplicitCell) strcpy (realm, defaultCell); - - /* Get the password if it wasn't provided. */ - if (!foundPassword) { - if (Pipe) { - strncpy(passwd, getpipepass(), sizeof(passwd)); - } - else { - if (read_pw_string(passwd, sizeof(passwd))) - reason = "can't read password from terminal"; - else if (strlen(passwd) == 0) - reason = "zero length password is illegal"; - else - reason = NULL; - if (reason) { - fprintf (stderr, "Unable to login because %s.\n", reason); - KLOGEXIT( BAD_ARGUMENT ); - } - } - } - - code = ka_UserAuthenticateGeneral (KA_USERAUTH_VERSION, - name, instance, realm, passwd, lifetime, - &password_expires, 0, &reason); - memset (passwd, 0, sizeof(passwd)); - if (code) { - if (!Silent) { - fprintf (stderr, - "Unable to authenticate to AFS because %s.\n", reason); - } - KLOGEXIT( code ); - } - -#ifndef AFS_KERBEROS_ENV - if (writeTicketFile) { - code = krb_write_ticket_file (realm); - if (!Silent) { - if (code) - com_err (rn, code, "writing Kerberos ticket file"); - else fprintf (stderr, "Wrote ticket file to /tmp\n"); - } - } -#endif - -#ifdef DEBUGEXPIRES - if (password_expires >= 0) { - printf ("password expires at %ld\n", password_expires); - } -#endif /* DEBUGEXPIRES */ - - return 0; -} diff --git a/src/WINNT/afsd/cm.h b/src/WINNT/afsd/cm.h deleted file mode 100644 index 91f3efef2..000000000 --- a/src/WINNT/afsd/cm.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_H_ENV__ -#define __CM_H_ENV__ 1 - -#include -#ifdef DJGPP /* we need these for vldbentry decl., etc. */ -#include -#include -#endif /* DJGPP */ - -/* from .xg file */ -/* FIXME: these were "long" but Windows NT wants "int" */ -int VL_GetEntryByID(struct rx_connection *, afs_int32, afs_int32, struct vldbentry *); -int VL_GetEntryByNameO(struct rx_connection *, char *, struct vldbentry *); -int VL_ProbeServer(struct rx_connection *); -int VL_GetEntryBYIDN(struct rx_connection *, afs_int32, afs_int32, struct nvldbentry *); -int VL_GetEntryByNameN(struct rx_connection *, char *, struct nvldbentry *); - -/* from .xg file */ -extern StartRXAFS_FetchData (struct rx_call *, - struct AFSFid *Fid, - afs_int32 Pos, - afs_int32 Length); -extern EndRXAFS_FetchData (struct rx_call *, - struct AFSFetchStatus *OutStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - -extern RXAFS_FetchACL(struct rx_connection *, - struct AFSFid *Fid, - struct AFSOpaque *AccessList, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - -extern RXAFS_FetchStatus (struct rx_connection *, - struct AFSFid *Fid, - struct AFSFetchStatus *OutStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - -int StartRXAFS_StoreData (struct rx_call *, - struct AFSFid *Fid, - struct AFSStoreStatus *InStatus, - afs_uint32 Pos, - afs_uint32 Length, - afs_uint32 FileLength); - -int EndRXAFS_StoreData(struct rx_call *, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - -int RXAFS_StoreACL (struct rx_connection *, - struct AFSFid *Fid, - struct AFSOpaque *AccessList, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - -int RXAFS_StoreStatus(struct rx_connection *, - struct AFSFid *Fid, - struct AFSStoreStatus *InStatus, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - -int RXAFS_RemoveFile (struct rx_connection *, - struct AFSFid *DirFid, - char *namep, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - -int RXAFS_CreateFile (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSStoreStatus *InStatus, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - -int RXAFS_Rename (struct rx_connection *, - struct AFSFid *OldDirFid, - char *OldName, - struct AFSFid *NewDirFid, - char *NewName, - struct AFSFetchStatus *OutOldDirStatus, - struct AFSFetchStatus *OutNewDirStatus, - struct AFSVolSync *Sync); - -int RXAFS_Symlink (struct rx_connection *, - struct AFSFid *DirFid, - char *name, - char *LinkContents, - struct AFSStoreStatus *InStatus, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSVolSync *Sync); - -int RXAFS_Link (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSFid *ExistingFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSVolSync *Sync); - -int RXAFS_MakeDir (struct rx_connection *, - struct AFSFid *DirFid, - char *name, - struct AFSStoreStatus *InStatus, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - -int RXAFS_RemoveDir (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSFetchStatus *OutDirStatus, - struct AFSVolSync *Sync); - -int RXAFS_GetStatistics (struct rx_connection *, - struct ViceStatistics *Statistics); - -int RXAFS_GiveUpCallBacks (struct rx_connection *, - struct AFSCBFids *Fids_Array, - struct AFSCBs *CallBacks_Array); - -int RXAFS_GetVolumeInfo (struct rx_connection *, - char *VolumeName, - struct VolumeInfo *Volumeinfo); - -int RXAFS_GetVolumeStatus (struct rx_connection *, - afs_int32 Volumeid, - struct AFSFetchVolumeStatus *Volumestatus, - char **name, - char **offlineMsg, - char **motd); - -int RXAFS_SetVolumeStatus (struct rx_connection *, - afs_int32 Volumeid, - struct AFSStoreVolumeStatus *Volumestatus, - char *name, - char *olm, - char *motd); - -int RXAFS_GetRootVolume (struct rx_connection *, - char **VolumeName); - -int RXAFS_CheckToken (struct rx_connection *, - afs_int32 ViceId, - struct AFSOpaque *token); - -int RXAFS_GetTime (struct rx_connection *, - afs_uint32 *Seconds, - afs_uint32 *USeconds); - -int RXAFS_BulkStatus (struct rx_connection *, - struct AFSCBFids *FidsArray, - struct AFSBulkStats *StatArray, - struct AFSCBs *CBArray, - struct AFSVolSync *Sync); - -int RXAFS_SetLock (struct rx_connection *, - struct AFSFid *Fid, - int Type, - struct AFSVolSync *Sync); - -int RXAFS_ExtendLock (struct rx_connection *, - struct AFSFid *Fid, - struct AFSVolSync *Sync); - -int RXAFS_ReleaseLock (struct rx_connection *, - struct AFSFid *Fid, - struct AFSVolSync *Sync); - -/* This interface is to supported the AFS/DFS Protocol Translator */ -int RXAFS_Lookup (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - -/* common flags to many procedures */ -#define CM_FLAG_CREATE 1 /* create entry */ -#define CM_FLAG_CASEFOLD 2 /* fold case in namei, lookup, etc. */ -#define CM_FLAG_EXCLUSIVE 4 /* create exclusive */ -#define CM_FLAG_FOLLOW 8 /* follow symlinks, even at the end (namei) */ -#define CM_FLAG_8DOT3 0x10 /* restrict to 8.3 name */ -#define CM_FLAG_NOMOUNTCHASE 0x20 /* don't follow mount points */ -#define CM_FLAG_DIRSEARCH 0x40 /* for directory search */ -#define CM_FLAG_CHECKPATH 0x80 /* Path instead of File */ - -/* error codes */ -#define CM_ERROR_BASE 0x66543200 -#define CM_ERROR_NOSUCHCELL (CM_ERROR_BASE+0) -#define CM_ERROR_NOSUCHVOLUME (CM_ERROR_BASE+1) -#define CM_ERROR_TIMEDOUT (CM_ERROR_BASE+2) -#define CM_ERROR_RETRY (CM_ERROR_BASE+3) -#define CM_ERROR_NOACCESS (CM_ERROR_BASE+4) -#define CM_ERROR_NOSUCHFILE (CM_ERROR_BASE+5) -#define CM_ERROR_STOPNOW (CM_ERROR_BASE+6) -#define CM_ERROR_TOOBIG (CM_ERROR_BASE+7) -#define CM_ERROR_INVAL (CM_ERROR_BASE+8) -#define CM_ERROR_BADFD (CM_ERROR_BASE+9) -#define CM_ERROR_BADFDOP (CM_ERROR_BASE+10) -#define CM_ERROR_EXISTS (CM_ERROR_BASE+11) -#define CM_ERROR_CROSSDEVLINK (CM_ERROR_BASE+12) -#define CM_ERROR_BADOP (CM_ERROR_BASE+13) -#define CM_ERROR_BADPASSWORD (CM_ERROR_BASE+14) -#define CM_ERROR_NOTDIR (CM_ERROR_BASE+15) -#define CM_ERROR_ISDIR (CM_ERROR_BASE+16) -#define CM_ERROR_READONLY (CM_ERROR_BASE+17) -#define CM_ERROR_WOULDBLOCK (CM_ERROR_BASE+18) -#define CM_ERROR_QUOTA (CM_ERROR_BASE+19) -#define CM_ERROR_SPACE (CM_ERROR_BASE+20) -#define CM_ERROR_BADSHARENAME (CM_ERROR_BASE+21) -#define CM_ERROR_BADTID (CM_ERROR_BASE+22) -#define CM_ERROR_UNKNOWN (CM_ERROR_BASE+23) -#define CM_ERROR_NOMORETOKENS (CM_ERROR_BASE+24) -#define CM_ERROR_NOTEMPTY (CM_ERROR_BASE+25) -#define CM_ERROR_USESTD (CM_ERROR_BASE+26) -#define CM_ERROR_REMOTECONN (CM_ERROR_BASE+27) -#define CM_ERROR_ATSYS (CM_ERROR_BASE+28) -#define CM_ERROR_NOSUCHPATH (CM_ERROR_BASE+29) -#define CM_ERROR_CLOCKSKEW (CM_ERROR_BASE+31) -#define CM_ERROR_BADSMB (CM_ERROR_BASE+32) -#define CM_ERROR_ALLBUSY (CM_ERROR_BASE+33) -#define CM_ERROR_NOFILES (CM_ERROR_BASE+34) -#define CM_ERROR_PARTIALWRITE (CM_ERROR_BASE+35) -#define CM_ERROR_NOIPC (CM_ERROR_BASE+36) -#define CM_ERROR_BADNTFILENAME (CM_ERROR_BASE+37) -#define CM_ERROR_BUFFERTOOSMALL (CM_ERROR_BASE+38) -#define CM_ERROR_RENAME_IDENTICAL (CM_ERROR_BASE+39) -#define CM_ERROR_ALLOFFLINE (CM_ERROR_BASE+40) -#define CM_ERROR_AMBIGUOUS_FILENAME (CM_ERROR_BASE+41) -#define CM_ERROR_BADLOGONTYPE (CM_ERROR_BASE+42) -#define CM_ERROR_GSSCONTINUE (CM_ERROR_BASE+43) -#define CM_ERROR_TIDIPC (CM_ERROR_BASE+44) -#define CM_ERROR_TOO_MANY_SYMLINKS (CM_ERROR_BASE+45) -#define CM_ERROR_PATH_NOT_COVERED (CM_ERROR_BASE+46) -#endif /* __CM_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_access.c b/src/WINNT/afsd/cm_access.c deleted file mode 100644 index b7c50ae54..000000000 --- a/src/WINNT/afsd/cm_access.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#endif -#include -#include -#include -#ifndef DJGPP -#include -#endif -#include - -#include "afsd.h" - -/* called with scp write-locked, check to see if we have the ACL info we need - * and can get it w/o blocking for any locks. - * - * Never drops the scp lock, but may fail if the access control info comes from - * the parent directory, and the parent's scache entry can't be found, or it - * can't be locked. Thus, this must always be called in a while loop to stabilize - * things, since we can always lose the race condition getting to the parent vnode. - */ -int cm_HaveAccessRights(struct cm_scache *scp, struct cm_user *up, long rights, - long *outRightsp) -{ - cm_scache_t *aclScp; - long code; - cm_fid_t tfid; - int didLock; - long trights; - - didLock = 0; - if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { - aclScp = scp; - cm_HoldSCache(scp); - } else { - tfid.cell = scp->fid.cell; - tfid.volume = scp->fid.volume; - tfid.vnode = scp->parentVnode; - tfid.unique = scp->parentUnique; - aclScp = cm_FindSCache(&tfid); - if (!aclScp) - return 0; - if (aclScp != scp) { - code = lock_TryMutex(&aclScp->mx); - if (code == 0) { - /* can't get lock safely and easily */ - cm_ReleaseSCache(aclScp); - return 0; - } - - /* check that we have a callback, too */ - if (!cm_HaveCallback(aclScp)) { - /* can't use it */ - lock_ReleaseMutex(&aclScp->mx); - cm_ReleaseSCache(aclScp); - return 0; - } - didLock = 1; - } - } - - lock_AssertMutex(&aclScp->mx); - - /* now if rights is a subset of the public rights, we're done. - * Otherwise, if we an explicit acl entry, we're also in good shape, - * and can definitively answer. - */ - if ((~aclScp->anyAccess & rights) == 0) { - *outRightsp = rights; - } else { - /* we have to check the specific rights info */ - code = cm_FindACLCache(aclScp, up, &trights); - if (code) { - code = 0; - goto done; - } - *outRightsp = trights; - } - - /* check mode bits */ - if (!(scp->unixModeBits & 0400)) - *outRightsp &= ~PRSFS_READ; - if (!(scp->unixModeBits & 0200)) - *outRightsp &= ~PRSFS_WRITE; - - code = 1; - /* fall through */ - - done: - if (didLock) - lock_ReleaseMutex(&aclScp->mx); - cm_ReleaseSCache(aclScp); - return code; -} - -/* called with locked scp; ensures that we have an ACL cache entry for the - * user specified by the parameter "up." - * In pathological race conditions, this function may return success without - * having loaded the entry properly (due to a racing callback revoke), so this - * function must also be called in a while loop to make sure that we eventually - * succeed. - */ -long cm_GetAccessRights(struct cm_scache *scp, struct cm_user *up, - struct cm_req *reqp) -{ - long code; - cm_fid_t tfid; - cm_scache_t *aclScp; - - /* pretty easy: just force a pass through the fetch status code */ - - osi_Log2(afsd_logp, "GetAccess scp %x user %x", scp, up); - - /* first, start by finding out whether we have a directory or something - * else, so we can find what object's ACL we need. - */ - code = cm_SyncOp(scp, NULL, up, reqp, 0, CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_NEEDCALLBACK); - if (code) - return code; - - if (scp->fileType != CM_SCACHETYPE_DIRECTORY) { - /* not a dir, use parent dir's acl */ - tfid.cell = scp->fid.cell; - tfid.volume = scp->fid.volume; - tfid.vnode = scp->parentVnode; - tfid.unique = scp->parentUnique; - lock_ReleaseMutex(&scp->mx); - code = cm_GetSCache(&tfid, &aclScp, up, reqp); - if (code) { - lock_ObtainMutex(&scp->mx); - return code; - } - - osi_Log1(afsd_logp, "GetAccess parent %x", aclScp); - lock_ObtainMutex(&aclScp->mx); - code = cm_GetCallback(aclScp, up, reqp, 1); - lock_ReleaseMutex(&aclScp->mx); - cm_ReleaseSCache(aclScp); - lock_ObtainMutex(&scp->mx); - } else { - code = cm_GetCallback(scp, up, reqp, 1); - } - - return code; -} diff --git a/src/WINNT/afsd/cm_access.h b/src/WINNT/afsd/cm_access.h deleted file mode 100644 index 7e5933ec7..000000000 --- a/src/WINNT/afsd/cm_access.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _CM_ACCESS_H_ENV__ -#define _CM_ACCESS_H_ENV__ 1 - -#include "cm_user.h" - -extern int cm_HaveAccessRights(struct cm_scache *scp, struct cm_user *up, - long rights, long *outRights); - -extern long cm_GetAccessRights(struct cm_scache *scp, struct cm_user *up, - struct cm_req *reqp); - -#endif /* _CM_ACCESS_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_aclent.c b/src/WINNT/afsd/cm_aclent.c deleted file mode 100644 index 52e635e64..000000000 --- a/src/WINNT/afsd/cm_aclent.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#endif -#include -#include -#include - -#include "afsd.h" -#include - -/* - * This next lock controls access to all cm_aclent structures in the system, - * in either the free list or in the LRU queue. A read lock prevents someone - * from modifying the list(s), and a write lock is required for modifying - * the list. The actual data stored in the randomUid and randomAccess fields - * is actually maintained as up-to-date or not via the scache lock. - * An aclent structure is free if it has no back vnode pointer. - */ -osi_rwlock_t cm_aclLock; /* lock for system's aclents */ - -/* This must be called with cm_aclLock and the aclp->back->mx held */ -static void CleanupACLEnt(cm_aclent_t * aclp) -{ - cm_aclent_t *taclp; - cm_aclent_t **laclpp; - - if (aclp->backp) { - if (aclp->backp->randomACLp) { - /* - * Remove the entry from the vnode's list - */ - lock_AssertMutex(&aclp->backp->mx); - laclpp = &aclp->backp->randomACLp; - for (taclp = *laclpp; taclp; laclpp = &taclp->nextp, taclp = *laclpp) { - if (taclp == aclp) - break; - } - if (!taclp) - osi_panic("CleanupACLEnt race", __FILE__, __LINE__); - *laclpp = aclp->nextp; /* remove from vnode list */ - } - aclp->backp = NULL; - } - - /* release the old user */ - if (aclp->userp) { - cm_ReleaseUser(aclp->userp); - aclp->userp = NULL; - } - - aclp->randomAccess = 0; - aclp->tgtLifetime = 0; -} - -/* - * Get an acl cache entry for a particular user and file, or return that it doesn't exist. - * Called with the scp locked. - */ -long cm_FindACLCache(cm_scache_t *scp, cm_user_t *userp, long *rightsp) -{ - cm_aclent_t *aclp; - long retval = -1; - - lock_ObtainWrite(&cm_aclLock); - *rightsp = 0; /* get a new acl from server if we don't find a - * current entry - */ - - for (aclp = scp->randomACLp; aclp; aclp = aclp->nextp) { - if (aclp->userp == userp) { - if (aclp->tgtLifetime && aclp->tgtLifetime <= osi_Time()) { - /* ticket expired */ - osi_QRemove((osi_queue_t **) &cm_data.aclLRUp, &aclp->q); - CleanupACLEnt(aclp); - - /* move to the tail of the LRU queue */ - osi_QAddT((osi_queue_t **) &cm_data.aclLRUp, - (osi_queue_t **) &cm_data.aclLRUEndp, - &aclp->q); - } else { - *rightsp = aclp->randomAccess; - if (cm_data.aclLRUEndp == aclp) - cm_data.aclLRUEndp = (cm_aclent_t *) osi_QPrev(&aclp->q); - - /* move to the head of the LRU queue */ - osi_QRemove((osi_queue_t **) &cm_data.aclLRUp, &aclp->q); - osi_QAddH((osi_queue_t **) &cm_data.aclLRUp, - (osi_queue_t **) &cm_data.aclLRUEndp, - &aclp->q); - retval = 0; /* success */ - } - break; - } - } - - lock_ReleaseWrite(&cm_aclLock); - return retval; -} - -/* - * This function returns a free (not in the LRU queue) acl cache entry. - * It must be called with the cm_aclLock lock held - */ -static cm_aclent_t *GetFreeACLEnt(cm_scache_t * scp) -{ - cm_aclent_t *aclp; - cm_scache_t *ascp = 0; - - if (cm_data.aclLRUp == NULL) - osi_panic("empty aclent LRU", __FILE__, __LINE__); - - aclp = cm_data.aclLRUEndp; - cm_data.aclLRUEndp = (cm_aclent_t *) osi_QPrev(&aclp->q); - osi_QRemove((osi_queue_t **) &cm_data.aclLRUp, &aclp->q); - - if (aclp->backp && scp != aclp->backp) { - ascp = aclp->backp; - lock_ObtainMutex(&ascp->mx); - } - CleanupACLEnt(aclp); - - if (ascp) - lock_ReleaseMutex(&ascp->mx); - return aclp; -} - - -/* - * Add rights to an acl cache entry. Do the right thing if not present, - * including digging up an entry from the LRU queue. - * - * The scp must be locked when this function is called. - */ -long cm_AddACLCache(cm_scache_t *scp, cm_user_t *userp, long rights) -{ - register struct cm_aclent *aclp; - - lock_ObtainWrite(&cm_aclLock); - for (aclp = scp->randomACLp; aclp; aclp = aclp->nextp) { - if (aclp->userp == userp) { - aclp->randomAccess = rights; - if (aclp->tgtLifetime == 0) - aclp->tgtLifetime = cm_TGTLifeTime(pag); - lock_ReleaseWrite(&cm_aclLock); - return 0; - } - } - - /* - * Didn't find the dude we're looking for, so take someone from the LRUQ - * and reuse. But first try the free list and see if there's already - * someone there. - */ - aclp = GetFreeACLEnt(scp); /* can't fail, panics instead */ - osi_QAddH((osi_queue_t **) &cm_data.aclLRUp, (osi_queue_t **) &cm_data.aclLRUEndp, &aclp->q); - aclp->backp = scp; - aclp->nextp = scp->randomACLp; - scp->randomACLp = aclp; - cm_HoldUser(userp); - aclp->userp = userp; - aclp->randomAccess = rights; - aclp->tgtLifetime = cm_TGTLifeTime(userp); - lock_ReleaseWrite(&cm_aclLock); - - return 0; -} - -long cm_ShutdownACLCache(void) -{ - return 0; -} - -long cm_ValidateACLCache(void) -{ - long size = cm_data.stats * 2; - long count; - cm_aclent_t * aclp; - - for ( aclp = cm_data.aclLRUp, count = 0; aclp; - aclp = (cm_aclent_t *) osi_QNext(&aclp->q), count++ ) { - if (aclp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateACLCache failure: acpl->magic != CM_ACLENT_MAGIC"); - fprintf(stderr, "cm_ValidateACLCache failure: acpl->magic != CM_ACLENT_MAGIC\n"); - return -1; - } - if (aclp->nextp && aclp->nextp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateACLCache failure: acpl->nextp->magic != CM_ACLENT_MAGIC"); - fprintf(stderr,"cm_ValidateACLCache failure: acpl->nextp->magic != CM_ACLENT_MAGIC\n"); - return -2; - } - if (aclp->backp && aclp->backp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateACLCache failure: acpl->backp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr,"cm_ValidateACLCache failure: acpl->backp->magic != CM_SCACHE_MAGIC\n"); - return -3; - } - if (count != 0 && aclp == cm_data.aclLRUp || count > size) { - afsi_log("cm_ValidateACLCache failure: loop in cm_data.aclLRUp list"); - fprintf(stderr, "cm_ValidateACLCache failure: loop in cm_data.aclLRUp list\n"); - return -4; - } - } - - for ( aclp = cm_data.aclLRUEndp, count = 0; aclp; - aclp = (cm_aclent_t *) osi_QPrev(&aclp->q), count++ ) { - if (aclp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateACLCache failure: aclp->magic != CM_ACLENT_MAGIC"); - fprintf(stderr, "cm_ValidateACLCache failure: aclp->magic != CM_ACLENT_MAGIC\n"); - return -5; - } - if (aclp->nextp && aclp->nextp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateACLCache failure: aclp->nextp->magic != CM_ACLENT_MAGIC"); - fprintf(stderr, "cm_ValidateACLCache failure: aclp->nextp->magic != CM_ACLENT_MAGIC\n"); - return -6; - } - if (aclp->backp && aclp->backp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateACLCache failure: aclp->backp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateACLCache failure: aclp->backp->magic != CM_SCACHE_MAGIC\n"); - return -7; - } - - if (count != 0 && aclp == cm_data.aclLRUEndp || count > size) { - afsi_log("cm_ValidateACLCache failure: loop in cm_data.aclLRUEndp list"); - fprintf(stderr, "cm_ValidateACLCache failure: loop in cm_data.aclLRUEndp list\n"); - return -8; - } - } - - return 0; -} - -/* - * Initialize the cache to have an entries. Called during system startup. - */ -long cm_InitACLCache(int newFile, long size) -{ - cm_aclent_t *aclp; - long i; - static osi_once_t once; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_aclLock, "cm_aclLock"); - osi_EndOnce(&once); - } - - lock_ObtainWrite(&cm_aclLock); - if ( newFile ) { - cm_data.aclLRUp = cm_data.aclLRUEndp = NULL; - aclp = (cm_aclent_t *) cm_data.aclBaseAddress; - memset(aclp, 0, size * sizeof(cm_aclent_t)); - - /* - * Put all of these guys on the LRU queue - */ - for (i = 0; i < size; i++) { - aclp->magic = CM_ACLENT_MAGIC; - osi_QAddH((osi_queue_t **) &cm_data.aclLRUp, (osi_queue_t **) &cm_data.aclLRUEndp, &aclp->q); - aclp++; - } - } else { - aclp = (cm_aclent_t *) cm_data.aclBaseAddress; - for (i = 0; i < size; i++) { - aclp->userp = NULL; - aclp->tgtLifetime = 0; - aclp++; - } - } - lock_ReleaseWrite(&cm_aclLock); - return 0; -} - - -/* - * Free all associated acl entries. We actually just clear the back pointer - * since the acl entries are already in the free list. The scp must be locked - * or completely unreferenced (such as when called while recycling the scp). - */ -void cm_FreeAllACLEnts(cm_scache_t *scp) -{ - cm_aclent_t *aclp; - cm_aclent_t *taclp; - - lock_ObtainWrite(&cm_aclLock); - for (aclp = scp->randomACLp; aclp; aclp = taclp) { - taclp = aclp->nextp; - if (aclp->userp) { - cm_ReleaseUser(aclp->userp); - aclp->userp = NULL; - } - aclp->backp = (struct cm_scache *) 0; - } - - scp->randomACLp = (struct cm_aclent *) 0; - scp->anyAccess = 0; /* reset this, too */ - lock_ReleaseWrite(&cm_aclLock); -} - - -/* - * Invalidate all ACL entries for particular user on this particular vnode. - * - * The scp must be locked. - */ -void cm_InvalidateACLUser(cm_scache_t *scp, cm_user_t *userp) -{ - cm_aclent_t *aclp; - cm_aclent_t **laclpp; - - lock_ObtainWrite(&cm_aclLock); - laclpp = &scp->randomACLp; - for (aclp = *laclpp; aclp; laclpp = &aclp->nextp, aclp = *laclpp) { - if (userp == aclp->userp) { /* One for a given user/scache */ - *laclpp = aclp->nextp; - cm_ReleaseUser(aclp->userp); - aclp->userp = NULL; - aclp->backp = (struct cm_scache *) 0; - break; - } - } - lock_ReleaseWrite(&cm_aclLock); -} diff --git a/src/WINNT/afsd/cm_aclent.h b/src/WINNT/afsd/cm_aclent.h deleted file mode 100644 index 23ea5e715..000000000 --- a/src/WINNT/afsd/cm_aclent.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _CM_ACLENT_H_ -#define _CM_ACLENT_H_ 1 - -#include - -#define cm_TGTLifeTime(x) (0x7fffffff) - -#define CM_ACLENT_MAGIC ('A' | 'C' <<8 | 'L'<<16 | 'E'<<24) - -/* - * Structure to hold an acl entry for a cached file - */ -typedef struct cm_aclent { - osi_queue_t q; /* for quick removal from LRUQ */ - afs_uint32 magic; - struct cm_aclent *nextp; /* next guy same vnode */ - struct cm_scache *backp; /* back ptr to vnode */ - struct cm_user *userp; /* user whose access is cached */ - long randomAccess; /* watch for more rights in acl.h */ - unsigned long tgtLifetime; /* time this expires */ -} cm_aclent_t; - -extern osi_rwlock_t cm_aclLock; - -extern long cm_InitACLCache(int newFile, long size); - -extern long cm_FindACLCache(struct cm_scache *scp, struct cm_user *userp, long *rightsp); - -static cm_aclent_t *GetFreeACLEnt(void); - -extern long cm_AddACLCache(struct cm_scache *scp, struct cm_user *userp, long rights); - -extern void cm_FreeAllACLEnts(struct cm_scache *scp); - -extern void cm_InvalidateACLUser(struct cm_scache *scp, struct cm_user *userp); - -extern long cm_ValidateACLCache(void); - -extern long cm_ShutdownACLCache(void); - -#endif /* _CM_ACLENT_H_ */ diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c deleted file mode 100644 index 151bccc43..000000000 --- a/src/WINNT/afsd/cm_buf.c +++ /dev/null @@ -1,1518 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#ifndef DJGPP -#include -#endif -#include -#include -#include -#include - -#include "afsd.h" -#include "cm_memmap.h" - -#ifdef DEBUG -#define TRACE_BUFFER 1 -#endif - -extern void afsi_log(char *pattern, ...); - -/* This module implements the buffer package used by the local transaction - * system (cm). It is initialized by calling cm_Init, which calls buf_Init; - * it must be initalized before any of its main routines are called. - * - * Each buffer is hashed into a hash table by file ID and offset, and if its - * reference count is zero, it is also in a free list. - * - * There are two locks involved in buffer processing. The global lock - * buf_globalLock protects all of the global variables defined in this module, - * the reference counts and hash pointers in the actual cm_buf_t structures, - * and the LRU queue pointers in the buffer structures. - * - * The mutexes in the buffer structures protect the remaining fields in the - * buffers, as well the data itself. - * - * The locking hierarchy here is this: - * - * - resv multiple simul. buffers reservation - * - lock buffer I/O flags - * - lock buffer's mutex - * - lock buf_globalLock - * - */ - -/* global debugging log */ -osi_log_t *buf_logp = NULL; - -/* Global lock protecting hash tables and free lists */ -osi_rwlock_t buf_globalLock; - -/* ptr to head of the free list (most recently used) and the - * tail (the guy to remove first). We use osi_Q* functions - * to put stuff in buf_freeListp, and maintain the end - * pointer manually - */ - -/* a pointer to a list of all buffers, just so that we can find them - * easily for debugging, and for the incr syncer. Locked under - * the global lock. - */ - -/* defaults setup; these variables may be manually assigned into - * before calling cm_Init, as a way of changing these defaults. - */ - -/* callouts for reading and writing data, etc */ -cm_buf_ops_t *cm_buf_opsp; - -#ifdef DISKCACHE95 -/* for experimental disk caching support in Win95 client */ -cm_buf_t *buf_diskFreeListp; -cm_buf_t *buf_diskFreeListEndp; -cm_buf_t *buf_diskAllp; -extern int cm_diskCacheEnabled; -#endif /* DISKCACHE95 */ - -/* set this to 1 when we are terminating to prevent access attempts */ -static int buf_ShutdownFlag = 0; - -/* hold a reference to an already held buffer */ -void buf_Hold(cm_buf_t *bp) -{ - osi_assert(bp->magic == CM_BUF_MAGIC); - lock_ObtainWrite(&buf_globalLock); - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); -} - -/* incremental sync daemon. Writes 1/10th of all the buffers every 5000 ms */ -void buf_IncrSyncer(long parm) -{ - cm_buf_t *bp; /* buffer we're hacking on; held */ - long i; /* counter */ - long nAtOnce; /* how many to do at once */ - cm_req_t req; - - lock_ObtainWrite(&buf_globalLock); - bp = cm_data.buf_allp; - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - nAtOnce = cm_data.buf_nbuffers / 10; - while (buf_ShutdownFlag == 0) { -#ifndef DJGPP - i = SleepEx(5000, 1); - if (i != 0) continue; -#else - thrd_Sleep(5000); -#endif /* DJGPP */ - - if (buf_ShutdownFlag == 1) - return; - - /* now go through our percentage of the buffers */ - for (i=0; iallp; - if (!bp) - bp = cm_data.buf_allp; - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - } /* for loop over a bunch of buffers */ - } /* whole daemon's while loop */ -} - -long -buf_ValidateBuffers(void) -{ - cm_buf_t * bp, *bpf, *bpa, *bpb; - afs_uint32 countb = 0, countf = 0, counta = 0; - - for (bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) { - if (bp->magic != CM_BUF_MAGIC) { - afsi_log("cm_ValidateBuffers failure: bp->magic != CM_BUF_MAGIC"); - fprintf(stderr, "cm_ValidateBuffers failure: bp->magic != CM_BUF_MAGIC\n"); - return -1; - } - countb++; - bpb = bp; - - if (countb > cm_data.buf_nbuffers) { - afsi_log("cm_ValidateBuffers failure: countb > cm_data.buf_nbuffers"); - fprintf(stderr, "cm_ValidateBuffers failure: countb > cm_data.buf_nbuffers\n"); - return -6; - } - } - - for (bp = cm_data.buf_freeListp; bp; bp=(cm_buf_t *) osi_QNext(&bp->q)) { - if (bp->magic != CM_BUF_MAGIC) { - afsi_log("cm_ValidateBuffers failure: bp->magic != CM_BUF_MAGIC"); - fprintf(stderr, "cm_ValidateBuffers failure: bp->magic != CM_BUF_MAGIC\n"); - return -2; - } - countf++; - bpf = bp; - - if (countf > cm_data.buf_nbuffers) { - afsi_log("cm_ValidateBuffers failure: countf > cm_data.buf_nbuffers"); - fprintf(stderr, "cm_ValidateBuffers failure: countf > cm_data.buf_nbuffers\n"); - return -7; - } - } - - for (bp = cm_data.buf_allp; bp; bp=bp->allp) { - if (bp->magic != CM_BUF_MAGIC) { - afsi_log("cm_ValidateBuffers failure: bp->magic != CM_BUF_MAGIC"); - fprintf(stderr, "cm_ValidateBuffers failure: bp->magic != CM_BUF_MAGIC\n"); - return -3; - } - counta++; - bpa = bp; - - if (counta > cm_data.buf_nbuffers) { - afsi_log("cm_ValidateBuffers failure: counta > cm_data.buf_nbuffers"); - fprintf(stderr, "cm_ValidateBuffers failure: counta > cm_data.buf_nbuffers\n"); - return -8; - } - } - - if (countb != countf) { - afsi_log("cm_ValidateBuffers failure: countb != countf"); - fprintf(stderr, "cm_ValidateBuffers failure: countb != countf\n"); - return -4; - } - - if (counta != cm_data.buf_nbuffers) { - afsi_log("cm_ValidateBuffers failure: counta != cm_data.buf_nbuffers"); - fprintf(stderr, "cm_ValidateBuffers failure: counta != cm_data.buf_nbuffers\n"); - return -5; - } - - return 0; -} - -void buf_Shutdown(void) -{ - buf_ShutdownFlag = 1; -} - -/* initialize the buffer package; called with no locks - * held during the initialization phase. - */ -long buf_Init(int newFile, cm_buf_ops_t *opsp, long nbuffers) -{ - static osi_once_t once; - cm_buf_t *bp; - thread_t phandle; - long i; - unsigned long pid; - char *data; - - if ( newFile ) { - if (nbuffers) - cm_data.buf_nbuffers = nbuffers; - - /* Have to be able to reserve a whole chunk */ - if (((cm_data.buf_nbuffers - 3) * cm_data.buf_blockSize) < cm_chunkSize) - return CM_ERROR_TOOFEWBUFS; - } - - /* recall for callouts */ - cm_buf_opsp = opsp; - - if (osi_Once(&once)) { - /* initialize global locks */ - lock_InitializeRWLock(&buf_globalLock, "Global buffer lock"); - - if ( newFile ) { - /* remember this for those who want to reset it */ - cm_data.buf_nOrigBuffers = cm_data.buf_nbuffers; - - /* lower hash size to a prime number */ - cm_data.buf_hashSize = osi_PrimeLessThan(CM_BUF_HASHSIZE); - - /* create hash table */ - memset((void *)cm_data.buf_hashTablepp, 0, cm_data.buf_hashSize * sizeof(cm_buf_t *)); - - /* another hash table */ - memset((void *)cm_data.buf_fileHashTablepp, 0, cm_data.buf_hashSize * sizeof(cm_buf_t *)); - - /* create buffer headers and put in free list */ - bp = cm_data.bufHeaderBaseAddress; - data = cm_data.bufDataBaseAddress; - cm_data.buf_allp = NULL; - - for (i=0; i= cm_data.bufHeaderBaseAddress && bp < (cm_buf_t *)cm_data.bufDataBaseAddress); - osi_assert(data >= cm_data.bufDataBaseAddress && data < cm_data.bufEndOfData); - - /* allocate and zero some storage */ - memset(bp, 0, sizeof(cm_buf_t)); - bp->magic = CM_BUF_MAGIC; - /* thread on list of all buffers */ - bp->allp = cm_data.buf_allp; - cm_data.buf_allp = bp; - - osi_QAdd((osi_queue_t **)&cm_data.buf_freeListp, &bp->q); - bp->flags |= CM_BUF_INLRU; - lock_InitializeMutex(&bp->mx, "Buffer mutex"); - - /* grab appropriate number of bytes from aligned zone */ - bp->datap = data; - - /* setup last buffer pointer */ - if (i == 0) - cm_data.buf_freeListEndp = bp; - - /* next */ - bp++; - data += cm_data.buf_blockSize; - } - - /* none reserved at first */ - cm_data.buf_reservedBufs = 0; - - /* just for safety's sake */ - cm_data.buf_maxReservedBufs = cm_data.buf_nbuffers - 3; - } else { - bp = cm_data.bufHeaderBaseAddress; - data = cm_data.bufDataBaseAddress; - - for (i=0; imx, "Buffer mutex"); - bp->userp = NULL; - bp++; - } - } - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - -#ifdef TRACE_BUFFER - /* init the buffer trace log */ - buf_logp = osi_LogCreate("buffer", 1000); - osi_LogEnable(buf_logp); -#endif - - osi_EndOnce(&once); - - /* and create the incr-syncer */ - phandle = thrd_Create(0, 0, - (ThreadFunc) buf_IncrSyncer, 0, 0, &pid, - "buf_IncrSyncer"); - - osi_assertx(phandle != NULL, "buf: can't create incremental sync proc"); -#ifndef DJGPP - CloseHandle(phandle); -#endif /* !DJGPP */ - } - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - return 0; -} - -/* add nbuffers to the buffer pool, if possible. - * Called with no locks held. - */ -long buf_AddBuffers(long nbuffers) -{ -#ifndef DJGPP - /* The size of a virtual cache cannot be changed after it has - * been created. Subsequent calls to MapViewofFile() with - * an existing mapping object name would not allow the - * object to be resized. Return failure immediately. - * - * A similar problem now occurs with the persistent cache - * given that the memory mapped file now contains a complex - * data structure. - */ - afsi_log("request to add %d buffers to the existing cache of size %d denied", - nbuffers, cm_data.buf_nbuffers); - - return CM_ERROR_INVAL; -#else - cm_buf_t *bp; - int i; - char *data; - - data = malloc(buf_nbuffers * cm_data.buf_blockSize); - - /* Create buffer headers and put in free list */ - bp = malloc(nbuffers * sizeof(*bp)); - - for (i=0; imx, "cm_buf_t"); - - /* grab appropriate number of bytes from aligned zone */ - bp->datap = data; - - bp->flags |= CM_BUF_INLRU; - - lock_ObtainWrite(&buf_globalLock); - /* note that buf_allp chain is covered by buf_globalLock now */ - bp->allp = cm_data.buf_allp; - cm_data.buf_allp = bp; - osi_QAdd((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); - if (!cm_data.buf_freeListEndp) - cm_data.buf_freeListEndp = bp; - cm_data.buf_nbuffers++; - lock_ReleaseWrite(&buf_globalLock); - - bp++; - data += cm_data.buf_blockSize; - - } /* for loop over all buffers */ - - return 0; -#endif /* DJGPP */ -} - -/* interface to set the number of buffers to an exact figure. - * Called with no locks held. - */ -long buf_SetNBuffers(long nbuffers) -{ - if (nbuffers < 10) - return CM_ERROR_INVAL; - if (nbuffers == cm_data.buf_nbuffers) - return 0; - else if (nbuffers > cm_data.buf_nbuffers) - return buf_AddBuffers(nbuffers - cm_data.buf_nbuffers); - else - return CM_ERROR_INVAL; -} - -/* release a buffer. Buffer must be referenced, but unlocked. */ -void buf_Release(cm_buf_t *bp) -{ - lock_ObtainWrite(&buf_globalLock); - buf_LockedRelease(bp); - lock_ReleaseWrite(&buf_globalLock); -} - -/* wait for reading or writing to clear; called with write-locked - * buffer, and returns with locked buffer. - */ -void buf_WaitIO(cm_buf_t *bp) -{ - osi_assert(bp->magic == CM_BUF_MAGIC); - - while (1) { - /* if no IO is happening, we're done */ - if (!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING))) - break; - - /* otherwise I/O is happening, but some other thread is waiting for - * the I/O already. Wait for that guy to figure out what happened, - * and then check again. - */ - if ( bp->flags & CM_BUF_WAITING ) - osi_Log1(buf_logp, "buf_WaitIO CM_BUF_WAITING already set for 0x%x", bp); - - bp->flags |= CM_BUF_WAITING; - osi_SleepM((long) bp, &bp->mx); - lock_ObtainMutex(&bp->mx); - osi_Log1(buf_logp, "buf_WaitIO conflict wait done for 0x%x", bp); - } - - /* if we get here, the IO is done, but we may have to wakeup people waiting for - * the I/O to complete. Do so. - */ - if (bp->flags & CM_BUF_WAITING) { - bp->flags &= ~CM_BUF_WAITING; - osi_Wakeup((long) bp); - } - osi_Log1(buf_logp, "WaitIO finished wait for bp 0x%x", (long) bp); -} - -/* code to drop reference count while holding buf_globalLock */ -void buf_LockedRelease(cm_buf_t *bp) -{ - /* ensure that we're in the LRU queue if our ref count is 0 */ - osi_assert(bp->refCount > 0); - if (--bp->refCount == 0) { - if (!(bp->flags & CM_BUF_INLRU)) { - osi_QAdd((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); - - /* watch for transition from empty to one element */ - if (!cm_data.buf_freeListEndp) - cm_data.buf_freeListEndp = cm_data.buf_freeListp; - bp->flags |= CM_BUF_INLRU; - } - } -} - -/* find a buffer, if any, for a particular file ID and offset. Assumes - * that buf_globalLock is write locked when called. - */ -cm_buf_t *buf_LockedFind(struct cm_scache *scp, osi_hyper_t *offsetp) -{ - long i; - cm_buf_t *bp; - - i = BUF_HASH(&scp->fid, offsetp); - for(bp = cm_data.buf_hashTablepp[i]; bp; bp=bp->hashp) { - if (cm_FidCmp(&scp->fid, &bp->fid) == 0 - && offsetp->LowPart == bp->offset.LowPart - && offsetp->HighPart == bp->offset.HighPart) { - bp->refCount++; - break; - } - } - - /* return whatever we found, if anything */ - return bp; -} - -/* find a buffer with offset *offsetp for vnode *scp. Called - * with no locks held. - */ -cm_buf_t *buf_Find(struct cm_scache *scp, osi_hyper_t *offsetp) -{ - cm_buf_t *bp; - - lock_ObtainWrite(&buf_globalLock); - bp = buf_LockedFind(scp, offsetp); - lock_ReleaseWrite(&buf_globalLock); - - return bp; -} - -/* start cleaning I/O on this buffer. Buffer must be write locked, and is returned - * write-locked. - * - * Makes sure that there's only one person writing this block - * at any given time, and also ensures that the log is forced sufficiently far, - * if this buffer contains logged data. - */ -void buf_LockedCleanAsync(cm_buf_t *bp, cm_req_t *reqp) -{ - long code = 0; - - osi_assert(bp->magic == CM_BUF_MAGIC); - - while ((bp->flags & CM_BUF_DIRTY) == CM_BUF_DIRTY) { - lock_ReleaseMutex(&bp->mx); - - code = (*cm_buf_opsp->Writep)(&bp->fid, &bp->offset, - cm_data.buf_blockSize, 0, bp->userp, - reqp); - - lock_ObtainMutex(&bp->mx); - if (code) - break; - -#ifdef DISKCACHE95 - /* Disk cache support */ - /* write buffer to disk cache (synchronous for now) */ - diskcache_Update(bp->dcp, bp->datap, cm_data.buf_blockSize, bp->dataVersion); -#endif /* DISKCACHE95 */ - }; - - /* do logging after call to GetLastError, or else */ - osi_Log2(buf_logp, "buf_CleanAsync starts I/O on 0x%x, done=%d", bp, code); - - /* if someone was waiting for the I/O that just completed or failed, - * wake them up. - */ - if (bp->flags & CM_BUF_WAITING) { - /* turn off flags and wakeup users */ - bp->flags &= ~CM_BUF_WAITING; - osi_Wakeup((long) bp); - } -} - -/* Called with a zero-ref count buffer and with the buf_globalLock write locked. - * recycles the buffer, and leaves it ready for reuse with a ref count of 1. - * The buffer must already be clean, and no I/O should be happening to it. - */ -void buf_Recycle(cm_buf_t *bp) -{ - int i; - cm_buf_t **lbpp; - cm_buf_t *tbp; - cm_buf_t *prevBp, *nextBp; - - osi_assert(bp->magic == CM_BUF_MAGIC); - - /* if we get here, we know that the buffer still has a 0 ref count, - * and that it is clean and has no currently pending I/O. This is - * the dude to return. - * Remember that as long as the ref count is 0, we know that we won't - * have any lock conflicts, so we can grab the buffer lock out of - * order in the locking hierarchy. - */ - osi_Log2( buf_logp, "buf_Recycle recycles 0x%x, off 0x%x", - bp, bp->offset.LowPart); - - osi_assert(bp->refCount == 0); - osi_assert(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING | CM_BUF_DIRTY))); - lock_AssertWrite(&buf_globalLock); - - if (bp->flags & CM_BUF_INHASH) { - /* Remove from hash */ - - i = BUF_HASH(&bp->fid, &bp->offset); - lbpp = &(cm_data.buf_hashTablepp[i]); - for(tbp = *lbpp; tbp; lbpp = &tbp->hashp, tbp = *lbpp) { - if (tbp == bp) break; - } - - /* we better find it */ - osi_assertx(tbp != NULL, "buf_GetNewLocked: hash table screwup"); - - *lbpp = bp->hashp; /* hash out */ - - /* Remove from file hash */ - - i = BUF_FILEHASH(&bp->fid); - prevBp = bp->fileHashBackp; - nextBp = bp->fileHashp; - if (prevBp) - prevBp->fileHashp = nextBp; - else - cm_data.buf_fileHashTablepp[i] = nextBp; - if (nextBp) - nextBp->fileHashBackp = prevBp; - - bp->flags &= ~CM_BUF_INHASH; - } - - /* bump the soft reference counter now, to invalidate softRefs; no - * wakeup is required since people don't sleep waiting for this - * counter to change. - */ - bp->idCounter++; - - /* make the fid unrecognizable */ - memset(&bp->fid, 0, sizeof(cm_fid_t)); -} - -/* recycle a buffer, removing it from the free list, hashing in its new identity - * and returning it write-locked so that no one can use it. Called without - * any locks held, and can return an error if it loses the race condition and - * finds that someone else created the desired buffer. - * - * If success is returned, the buffer is returned write-locked. - * - * May be called with null scp and offsetp, if we're just trying to reclaim some - * space from the buffer pool. In that case, the buffer will be returned - * without being hashed into the hash table. - */ -long buf_GetNewLocked(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) -{ - cm_buf_t *bp; /* buffer we're dealing with */ - cm_buf_t *nextBp; /* next buffer in file hash chain */ - long i; /* temp */ - cm_req_t req; - - cm_InitReq(&req); /* just in case */ - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - while(1) { - retry: - lock_ObtainWrite(&buf_globalLock); - /* check to see if we lost the race */ - if (scp) { - if (bp = buf_LockedFind(scp, offsetp)) { - bp->refCount--; - lock_ReleaseWrite(&buf_globalLock); - return CM_BUF_EXISTS; - } - } - - /* for debugging, assert free list isn't empty, although we - * really should try waiting for a running tranasction to finish - * instead of this; or better, we should have a transaction - * throttler prevent us from entering this situation. - */ - osi_assertx(cm_data.buf_freeListEndp != NULL, "buf_GetNewLocked: no free buffers"); - - /* look at all buffers in free list, some of which may temp. - * have high refcounts and which then should be skipped, - * starting cleaning I/O for those which are dirty. If we find - * a clean buffer, we rehash it, lock it and return it. - */ - for(bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) { - /* check to see if it really has zero ref count. This - * code can bump refcounts, at least, so it may not be - * zero. - */ - if (bp->refCount > 0) - continue; - - /* we don't have to lock buffer itself, since the ref - * count is 0 and we know it will stay zero as long as - * we hold the global lock. - */ - - /* don't recycle someone in our own chunk */ - if (!cm_FidCmp(&bp->fid, &scp->fid) - && (bp->offset.LowPart & (-cm_chunkSize)) - == (offsetp->LowPart & (-cm_chunkSize))) - continue; - - /* if this page is being filled (!) or cleaned, see if - * the I/O has completed. If not, skip it, otherwise - * do the final processing for the I/O. - */ - if (bp->flags & (CM_BUF_READING | CM_BUF_WRITING)) { - /* probably shouldn't do this much work while - * holding the big lock? Watch for contention - * here. - */ - continue; - } - - if (bp->flags & CM_BUF_DIRTY) { - /* if the buffer is dirty, start cleaning it and - * move on to the next buffer. We do this with - * just the lock required to minimize contention - * on the big lock. - */ - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - - /* grab required lock and clean; this only - * starts the I/O. By the time we're back, - * it'll still be marked dirty, but it will also - * have the WRITING flag set, so we won't get - * back here. - */ - buf_CleanAsync(bp, &req); - - /* now put it back and go around again */ - buf_Release(bp); - goto retry; - } - - /* if we get here, we know that the buffer still has a 0 - * ref count, and that it is clean and has no currently - * pending I/O. This is the dude to return. - * Remember that as long as the ref count is 0, we know - * that we won't have any lock conflicts, so we can grab - * the buffer lock out of order in the locking hierarchy. - */ - buf_Recycle(bp); - - /* clean up junk flags */ - bp->flags &= ~(CM_BUF_EOF | CM_BUF_ERROR); - bp->dataVersion = -1; /* unknown so far */ - - /* now hash in as our new buffer, and give it the - * appropriate label, if requested. - */ - if (scp) { - bp->flags |= CM_BUF_INHASH; - bp->fid = scp->fid; - bp->offset = *offsetp; - i = BUF_HASH(&scp->fid, offsetp); - bp->hashp = cm_data.buf_hashTablepp[i]; - cm_data.buf_hashTablepp[i] = bp; - i = BUF_FILEHASH(&scp->fid); - nextBp = cm_data.buf_fileHashTablepp[i]; - bp->fileHashp = nextBp; - bp->fileHashBackp = NULL; - if (nextBp) - nextBp->fileHashBackp = bp; - cm_data.buf_fileHashTablepp[i] = bp; - } - - /* prepare to return it. Start by giving it a good - * refcount */ - bp->refCount = 1; - - /* and since it has a non-zero ref count, we should move - * it from the lru queue. It better be still there, - * since we've held the global (big) lock since we found - * it there. - */ - osi_assertx(bp->flags & CM_BUF_INLRU, - "buf_GetNewLocked: LRU screwup"); - if (cm_data.buf_freeListEndp == bp) { - /* we're the last guy in this queue, so maintain it */ - cm_data.buf_freeListEndp = (cm_buf_t *) osi_QPrev(&bp->q); - } - osi_QRemove((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); - bp->flags &= ~CM_BUF_INLRU; - - /* finally, grab the mutex so that people don't use it - * before the caller fills it with data. Again, no one - * should have been able to get to this dude to lock it. - */ - osi_assertx(lock_TryMutex(&bp->mx), - "buf_GetNewLocked: TryMutex failed"); - - lock_ReleaseWrite(&buf_globalLock); - *bufpp = bp; - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - return 0; - } /* for all buffers in lru queue */ - lock_ReleaseWrite(&buf_globalLock); - } /* while loop over everything */ - /* not reached */ -} /* the proc */ - -/* get a page, returning it held but unlocked. Doesn't fill in the page - * with I/O, since we're going to write the whole thing new. - */ -long buf_GetNew(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) -{ - cm_buf_t *bp; - long code; - osi_hyper_t pageOffset; - int created; - - created = 0; - pageOffset.HighPart = offsetp->HighPart; - pageOffset.LowPart = offsetp->LowPart & ~(cm_data.buf_blockSize-1); - while (1) { - lock_ObtainWrite(&buf_globalLock); - bp = buf_LockedFind(scp, &pageOffset); - lock_ReleaseWrite(&buf_globalLock); - if (bp) { - /* lock it and break out */ - lock_ObtainMutex(&bp->mx); - break; - } - - /* otherwise, we have to create a page */ - code = buf_GetNewLocked(scp, &pageOffset, &bp); - - /* check if the buffer was created in a race condition branch. - * If so, go around so we can hold a reference to it. - */ - if (code == CM_BUF_EXISTS) - continue; - - /* something else went wrong */ - if (code != 0) - return code; - - /* otherwise, we have a locked buffer that we just created */ - created = 1; - break; - } /* big while loop */ - - /* wait for reads */ - if (bp->flags & CM_BUF_READING) - buf_WaitIO(bp); - - /* once it has been read once, we can unlock it and return it, still - * with its refcount held. - */ - lock_ReleaseMutex(&bp->mx); - *bufpp = bp; - osi_Log3(buf_logp, "buf_GetNew returning bp 0x%x for file 0x%x, offset 0x%x", - bp, (long) scp, offsetp->LowPart); - return 0; -} - -/* get a page, returning it held but unlocked. Make sure it is complete */ -long buf_Get(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) -{ - cm_buf_t *bp; - long code; - osi_hyper_t pageOffset; - unsigned long tcount; - int created; - long lcount = 0; -#ifdef DISKCACHE95 - cm_diskcache_t *dcp; -#endif /* DISKCACHE95 */ - - created = 0; - pageOffset.HighPart = offsetp->HighPart; - pageOffset.LowPart = offsetp->LowPart & ~(cm_data.buf_blockSize-1); - while (1) { - lcount++; -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - lock_ObtainWrite(&buf_globalLock); - bp = buf_LockedFind(scp, &pageOffset); - lock_ReleaseWrite(&buf_globalLock); - if (bp) { - /* lock it and break out */ - lock_ObtainMutex(&bp->mx); - break; - -#ifdef DISKCACHE95 - /* touch disk chunk to update LRU info */ - diskcache_Touch(bp->dcp); -#endif /* DISKCACHE95 */ - } - - /* otherwise, we have to create a page */ - code = buf_GetNewLocked(scp, &pageOffset, &bp); - - /* check if the buffer was created in a race condition branch. - * If so, go around so we can hold a reference to it. - */ - if (code == CM_BUF_EXISTS) - continue; - - /* something else went wrong */ - if (code != 0) { -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - return code; - } - - /* otherwise, we have a locked buffer that we just created */ - created = 1; - break; - } /* big while loop */ - - /* if we get here, we have a locked buffer that may have just been - * created, in which case it needs to be filled with data. - */ - if (created) { - /* load the page; freshly created pages should be idle */ - osi_assert(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING))); - - /* setup offset, event */ -#ifndef DJGPP /* doesn't seem to be used */ - bp->over.Offset = bp->offset.LowPart; - bp->over.OffsetHigh = bp->offset.HighPart; -#endif /* !DJGPP */ - - /* start the I/O; may drop lock */ - bp->flags |= CM_BUF_READING; - code = (*cm_buf_opsp->Readp)(bp, cm_data.buf_blockSize, &tcount, NULL); - -#ifdef DISKCACHE95 - code = diskcache_Get(&bp->fid, &bp->offset, bp->datap, cm_data.buf_blockSize, &bp->dataVersion, &tcount, &dcp); - bp->dcp = dcp; /* pointer to disk cache struct. */ -#endif /* DISKCACHE95 */ - - if (code != 0) { - /* failure or queued */ -#ifndef DJGPP /* cm_bufRead always returns 0 */ - if (code != ERROR_IO_PENDING) { -#endif - bp->error = code; - bp->flags |= CM_BUF_ERROR; - bp->flags &= ~CM_BUF_READING; - if (bp->flags & CM_BUF_WAITING) { - bp->flags &= ~CM_BUF_WAITING; - osi_Wakeup((long) bp); - } - lock_ReleaseMutex(&bp->mx); - buf_Release(bp); -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - return code; -#ifndef DJGPP - } -#endif - } else { - /* otherwise, I/O completed instantly and we're done, except - * for padding the xfr out with 0s and checking for EOF - */ - if (tcount < (unsigned long) cm_data.buf_blockSize) { - memset(bp->datap+tcount, 0, cm_data.buf_blockSize - tcount); - if (tcount == 0) - bp->flags |= CM_BUF_EOF; - } - bp->flags &= ~CM_BUF_READING; - if (bp->flags & CM_BUF_WAITING) { - bp->flags &= ~CM_BUF_WAITING; - osi_Wakeup((long) bp); - } - } - - } /* if created */ - - /* wait for reads, either that which we started above, or that someone - * else started. We don't care if we return a buffer being cleaned. - */ - if (bp->flags & CM_BUF_READING) - buf_WaitIO(bp); - - /* once it has been read once, we can unlock it and return it, still - * with its refcount held. - */ - lock_ReleaseMutex(&bp->mx); - *bufpp = bp; - - /* now remove from queue; will be put in at the head (farthest from - * being recycled) when we're done in buf_Release. - */ - lock_ObtainWrite(&buf_globalLock); - if (bp->flags & CM_BUF_INLRU) { - if (cm_data.buf_freeListEndp == bp) - cm_data.buf_freeListEndp = (cm_buf_t *) osi_QPrev(&bp->q); - osi_QRemove((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); - bp->flags &= ~CM_BUF_INLRU; - } - lock_ReleaseWrite(&buf_globalLock); - - osi_Log3(buf_logp, "buf_Get returning bp 0x%x for file 0x%x, offset 0x%x", - bp, (long) scp, offsetp->LowPart); -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - return 0; -} - -/* count # of elements in the free list; - * we don't bother doing the proper locking for accessing dataVersion or flags - * since it is a pain, and this is really just an advisory call. If you need - * to do better at some point, rewrite this function. - */ -long buf_CountFreeList(void) -{ - long count; - cm_buf_t *bufp; - - count = 0; - lock_ObtainRead(&buf_globalLock); - for(bufp = cm_data.buf_freeListp; bufp; bufp = (cm_buf_t *) osi_QNext(&bufp->q)) { - /* if the buffer doesn't have an identity, or if the buffer - * has been invalidate (by having its DV stomped upon), then - * count it as free, since it isn't really being utilized. - */ - if (!(bufp->flags & CM_BUF_INHASH) || bufp->dataVersion <= 0) - count++; - } - lock_ReleaseRead(&buf_globalLock); - return count; -} - -/* clean a buffer synchronously */ -void buf_CleanAsync(cm_buf_t *bp, cm_req_t *reqp) -{ - osi_assert(bp->magic == CM_BUF_MAGIC); - - lock_ObtainMutex(&bp->mx); - buf_LockedCleanAsync(bp, reqp); - lock_ReleaseMutex(&bp->mx); -} - -/* wait for a buffer's cleaning to finish */ -void buf_CleanWait(cm_buf_t *bp) -{ - osi_assert(bp->magic == CM_BUF_MAGIC); - - lock_ObtainMutex(&bp->mx); - if (bp->flags & CM_BUF_WRITING) { - buf_WaitIO(bp); - } - lock_ReleaseMutex(&bp->mx); -} - -/* set the dirty flag on a buffer, and set associated write-ahead log, - * if there is one. Allow one to be added to a buffer, but not changed. - * - * The buffer must be locked before calling this routine. - */ -void buf_SetDirty(cm_buf_t *bp) -{ - osi_assert(bp->magic == CM_BUF_MAGIC); - osi_assert(bp->refCount > 0); - - osi_Log1(buf_logp, "buf_SetDirty 0x%x", bp); - - /* set dirty bit */ - bp->flags |= CM_BUF_DIRTY; - - /* and turn off EOF flag, since it has associated data now */ - bp->flags &= ~CM_BUF_EOF; -} - -/* clean all buffers, reset log pointers and invalidate all buffers. - * Called with no locks held, and returns with same. - * - * This function is guaranteed to clean and remove the log ptr of all the - * buffers that were dirty or had non-zero log ptrs before the call was - * made. That's sufficient to clean up any garbage left around by recovery, - * which is all we're counting on this for; there may be newly created buffers - * added while we're running, but that should be OK. - * - * In an environment where there are no transactions (artificially imposed, for - * example, when switching the database to raw mode), this function is used to - * make sure that all updates have been written to the disk. In that case, we don't - * really require that we forget the log association between pages and logs, but - * it also doesn't hurt. Since raw mode I/O goes through this buffer package, we don't - * have to worry about invalidating data in the buffers. - * - * This function is used at the end of recovery as paranoia to get the recovered - * database out to disk. It removes all references to the recovery log and cleans - * all buffers. - */ -long buf_CleanAndReset(void) -{ - long i; - cm_buf_t *bp; - cm_req_t req; - - lock_ObtainWrite(&buf_globalLock); - for(i=0; ihashp) { - if ((bp->flags & CM_BUF_DIRTY) == CM_BUF_DIRTY) { - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - - /* now no locks are held; clean buffer and go on */ - cm_InitReq(&req); - buf_CleanAsync(bp, &req); - buf_CleanWait(bp); - - /* relock and release buffer */ - lock_ObtainWrite(&buf_globalLock); - buf_LockedRelease(bp); - } /* dirty */ - } /* over one bucket */ - } /* for loop over all hash buckets */ - - /* release locks */ - lock_ReleaseWrite(&buf_globalLock); - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - /* and we're done */ - return 0; -} - -/* called without global lock being held, reserves buffers for callers - * that need more than one held (not locked) at once. - */ -void buf_ReserveBuffers(long nbuffers) -{ - lock_ObtainWrite(&buf_globalLock); - while (1) { - if (cm_data.buf_reservedBufs + nbuffers > cm_data.buf_maxReservedBufs) { - cm_data.buf_reserveWaiting = 1; - osi_Log1(buf_logp, "buf_ReserveBuffers waiting for %d bufs", nbuffers); - osi_SleepW((long) &cm_data.buf_reservedBufs, &buf_globalLock); - lock_ObtainWrite(&buf_globalLock); - } - else { - cm_data.buf_reservedBufs += nbuffers; - break; - } - } - lock_ReleaseWrite(&buf_globalLock); -} - -int buf_TryReserveBuffers(long nbuffers) -{ - int code; - - lock_ObtainWrite(&buf_globalLock); - if (cm_data.buf_reservedBufs + nbuffers > cm_data.buf_maxReservedBufs) { - code = 0; - } - else { - cm_data.buf_reservedBufs += nbuffers; - code = 1; - } - lock_ReleaseWrite(&buf_globalLock); - return code; -} - -/* called without global lock held, releases reservation held by - * buf_ReserveBuffers. - */ -void buf_UnreserveBuffers(long nbuffers) -{ - lock_ObtainWrite(&buf_globalLock); - cm_data.buf_reservedBufs -= nbuffers; - if (cm_data.buf_reserveWaiting) { - cm_data.buf_reserveWaiting = 0; - osi_Wakeup((long) &cm_data.buf_reservedBufs); - } - lock_ReleaseWrite(&buf_globalLock); -} - -/* truncate the buffers past sizep, zeroing out the page, if we don't - * end on a page boundary. - * - * Requires cm_bufCreateLock to be write locked. - */ -long buf_Truncate(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, - osi_hyper_t *sizep) -{ - cm_buf_t *bufp; - cm_buf_t *nbufp; /* next buffer, if didRelease */ - osi_hyper_t bufEnd; - long code; - long bufferPos; - int didRelease; - long i; - - /* assert that cm_bufCreateLock is held in write mode */ - lock_AssertWrite(&scp->bufCreateLock); - - i = BUF_FILEHASH(&scp->fid); - - lock_ObtainWrite(&buf_globalLock); - bufp = cm_data.buf_fileHashTablepp[i]; - if (bufp == NULL) { - lock_ReleaseWrite(&buf_globalLock); - return 0; - } - - bufp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - for(; bufp; bufp = nbufp) { - didRelease = 0; - lock_ObtainMutex(&bufp->mx); - - bufEnd.HighPart = 0; - bufEnd.LowPart = cm_data.buf_blockSize; - bufEnd = LargeIntegerAdd(bufEnd, bufp->offset); - - if (cm_FidCmp(&bufp->fid, &scp->fid) == 0 && - LargeIntegerLessThan(*sizep, bufEnd)) { - buf_WaitIO(bufp); - } - lock_ObtainMutex(&scp->mx); - - /* make sure we have a callback (so we have the right value for - * the length), and wait for it to be safe to do a truncate. - */ - code = cm_SyncOp(scp, bufp, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_SETSIZE - | CM_SCACHESYNC_BUFLOCKED); - /* if we succeeded in our locking, and this applies to the right - * file, and the truncate request overlaps the buffer either - * totally or partially, then do something. - */ - if (code == 0 && cm_FidCmp(&bufp->fid, &scp->fid) == 0 - && LargeIntegerLessThan(*sizep, bufEnd)) { - - lock_ObtainWrite(&buf_globalLock); - - /* destroy the buffer, turning off its dirty bit, if - * we're truncating the whole buffer. Otherwise, set - * the dirty bit, and clear out the tail of the buffer - * if we just overlap some. - */ - if (LargeIntegerLessThanOrEqualTo(*sizep, bufp->offset)) { - /* truncating the entire page */ - bufp->flags &= ~CM_BUF_DIRTY; - bufp->dataVersion = -1; /* known bad */ - bufp->dirtyCounter++; - } - else { - /* don't set dirty, since dirty implies - * currently up-to-date. Don't need to do this, - * since we'll update the length anyway. - * - * Zero out remainder of the page, in case we - * seek and write past EOF, and make this data - * visible again. - */ - bufferPos = sizep->LowPart & (cm_data.buf_blockSize - 1); - osi_assert(bufferPos != 0); - memset(bufp->datap + bufferPos, 0, - cm_data.buf_blockSize - bufferPos); - } - - lock_ReleaseWrite(&buf_globalLock); - } - - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&bufp->mx); - if (!didRelease) { - lock_ObtainWrite(&buf_globalLock); - nbufp = bufp->fileHashp; - if (nbufp) nbufp->refCount++; - buf_LockedRelease(bufp); - lock_ReleaseWrite(&buf_globalLock); - } - - /* bail out early if we fail */ - if (code) { - /* at this point, nbufp is held; bufp has already been - * released. - */ - if (nbufp) - buf_Release(nbufp); - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - return code; - } - } - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - /* success */ - return 0; -} - -long buf_FlushCleanPages(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - cm_buf_t *bp; /* buffer we're hacking on */ - cm_buf_t *nbp; - int didRelease; - long i; - - i = BUF_FILEHASH(&scp->fid); - - code = 0; - lock_ObtainWrite(&buf_globalLock); - bp = cm_data.buf_fileHashTablepp[i]; - if (bp) - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - for (; bp; bp = nbp) { - didRelease = 0; /* haven't released this buffer yet */ - - /* clean buffer synchronously */ - if (cm_FidCmp(&bp->fid, &scp->fid) == 0) { - lock_ObtainMutex(&bp->mx); - - /* start cleaning the buffer, and wait for it to finish */ - buf_LockedCleanAsync(bp, reqp); - buf_WaitIO(bp); - lock_ReleaseMutex(&bp->mx); - - code = (*cm_buf_opsp->Stabilizep)(scp, userp, reqp); - if (code) - goto skip; - - lock_ObtainWrite(&buf_globalLock); - /* actually, we only know that buffer is clean if ref - * count is 1, since we don't have buffer itself locked. - */ - if (!(bp->flags & CM_BUF_DIRTY)) { - if (bp->refCount == 1) { /* bp is held above */ - buf_LockedRelease(bp); - nbp = bp->fileHashp; - if (nbp) - nbp->refCount++; - didRelease = 1; - buf_Recycle(bp); - } - } - lock_ReleaseWrite(&buf_globalLock); - - (*cm_buf_opsp->Unstabilizep)(scp, userp); - } - - skip: - if (!didRelease) { - lock_ObtainWrite(&buf_globalLock); - if (nbp = bp->fileHashp) - nbp->refCount++; - buf_LockedRelease(bp); - lock_ReleaseWrite(&buf_globalLock); - } - } /* for loop over a bunch of buffers */ - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - /* done */ - return code; -} - -long buf_CleanVnode(struct cm_scache *scp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - cm_buf_t *bp; /* buffer we're hacking on */ - cm_buf_t *nbp; /* next one */ - long i; - - i = BUF_FILEHASH(&scp->fid); - - code = 0; - lock_ObtainWrite(&buf_globalLock); - bp = cm_data.buf_fileHashTablepp[i]; - if (bp) - bp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - for (; bp; bp = nbp) { - /* clean buffer synchronously */ - if (cm_FidCmp(&bp->fid, &scp->fid) == 0) { - if (userp) { - cm_HoldUser(userp); - lock_ObtainMutex(&bp->mx); - if (bp->userp) - cm_ReleaseUser(bp->userp); - bp->userp = userp; - lock_ReleaseMutex(&bp->mx); - } - buf_CleanAsync(bp, reqp); - buf_CleanWait(bp); - lock_ObtainMutex(&bp->mx); - if (bp->flags & CM_BUF_ERROR) { - if (code == 0 || code == -1) - code = bp->error; - if (code == 0) - code = -1; - } - lock_ReleaseMutex(&bp->mx); - } - - lock_ObtainWrite(&buf_globalLock); - buf_LockedRelease(bp); - nbp = bp->fileHashp; - if (nbp) - nbp->refCount++; - lock_ReleaseWrite(&buf_globalLock); - } /* for loop over a bunch of buffers */ - -#ifdef TESTING - buf_ValidateBufQueues(); -#endif /* TESTING */ - - /* done */ - return code; -} - -#ifdef TESTING -void -buf_ValidateBufQueues(void) -{ - cm_buf_t * bp, *bpb, *bpf, *bpa; - afs_uint32 countf=0, countb=0, counta=0; - - lock_ObtainRead(&buf_globalLock); - for (bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) { - if (bp->magic != CM_BUF_MAGIC) - DebugBreak(); - countb++; - bpb = bp; - } - - for (bp = cm_data.buf_freeListp; bp; bp=(cm_buf_t *) osi_QNext(&bp->q)) { - if (bp->magic != CM_BUF_MAGIC) - DebugBreak(); - countf++; - bpf = bp; - } - - for (bp = cm_data.buf_allp; bp; bp=bp->allp) { - if (bp->magic != CM_BUF_MAGIC) - DebugBreak(); - counta++; - bpa = bp; - } - lock_ReleaseRead(&buf_globalLock); - - if (countb != countf) - DebugBreak(); - - if (counta != cm_data.buf_nbuffers) - DebugBreak(); -} -#endif /* TESTING */ - -/* dump the contents of the buf_hashTablepp. */ -int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock) -{ - int zilch; - cm_buf_t *bp; - char output[1024]; - int i; - - if (cm_data.buf_hashTablepp == NULL) - return -1; - - if (lock) - lock_ObtainRead(&buf_globalLock); - - StringCbPrintfA(output, sizeof(output), "%s - dumping buf_HashTable - buf_hashSize=%d\n", - cookie, cm_data.buf_hashSize); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - for (i = 0; i < cm_data.buf_hashSize; i++) - { - for (bp = cm_data.buf_hashTablepp[i]; bp; bp=bp->hashp) - { - if (bp->refCount) - { - StringCbPrintfA(output, sizeof(output), "vnode=%d, unique=%d), size=%d refCount=%d\n", - cookie, (void *)bp, i, bp->fid.cell, bp->fid.volume, - bp->fid.vnode, bp->fid.unique, bp->size, bp->refCount); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - } - } - } - - StringCbPrintfA(output, sizeof(output), "%s - Done dumping buf_HashTable.\n", cookie); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - if (lock) - lock_ReleaseRead(&buf_globalLock); - return 0; -} - -void buf_ForceTrace(BOOL flush) -{ - HANDLE handle; - int len; - char buf[256]; - - if (!buf_logp) - return; - - len = GetTempPath(sizeof(buf)-10, buf); - StringCbCopyA(&buf[len], sizeof(buf)-len, "/afs-buffer.log"); - handle = CreateFile(buf, GENERIC_WRITE, FILE_SHARE_READ, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (handle == INVALID_HANDLE_VALUE) { - osi_panic("Cannot create log file", __FILE__, __LINE__); - } - osi_LogPrint(buf_logp, handle); - if (flush) - FlushFileBuffers(handle); - CloseHandle(handle); -} diff --git a/src/WINNT/afsd/cm_buf.h b/src/WINNT/afsd/cm_buf.h deleted file mode 100644 index 8174d0de7..000000000 --- a/src/WINNT/afsd/cm_buf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _BUF_H__ENV_ -#define _BUF_H__ENV_ 1 - -#include -#ifdef DISKCACHE95 -#include "cm_diskcache.h" -#endif /* DISKCACHE95 */ - -/* default # of buffers if not changed */ -#define CM_BUF_BUFFERS 100 - -/* default buffer size */ -#define CM_BUF_BLOCKSIZE CM_CONFIGDEFAULT_BLOCKSIZE - -/* default hash size */ -#define CM_BUF_HASHSIZE 1024 - -/* cache type */ -#define CM_BUF_CACHETYPE_FILE 1 -#define CM_BUF_CACHETYPE_VIRTUAL 2 -extern int buf_cacheType; - -/* force it to be signed so that mod comes out positive or 0 */ -#define BUF_HASH(fidp,offsetp) ((((fidp)->vnode+((fidp)->unique << 5) \ - +(fidp)->volume+(fidp)->cell \ - +((offsetp)->LowPart / cm_data.buf_blockSize)) \ - & 0x7fffffff) \ - % cm_data.buf_hashSize) - -/* another hash fn */ -#define BUF_FILEHASH(fidp) ((((fidp)->vnode+((fidp)->unique << 5) \ - +(fidp)->volume+(fidp)->cell) \ - & 0x7fffffff) \ - % cm_data.buf_hashSize) - -/* backup over pointer to the buffer */ -#define BUF_OVERTOBUF(op) ((cm_buf_t *)(((char *)op) - ((long)(&((cm_buf_t *)0)->over)))) - -#ifdef notdef -/* pretend we have logs, too */ -typedef char cm_log_t; -#endif - -#define CM_BUF_MAGIC ('B' | 'U' <<8 | 'F'<<16 | 'F'<<24) - -/* represents a single buffer */ -typedef struct cm_buf { - osi_queue_t q; /* queue of all zero-refcount buffers */ - afs_uint32 magic; - struct cm_buf *allp; /* next in all list */ - struct cm_buf *hashp; /* hash bucket pointer */ - struct cm_buf *fileHashp; /* file hash bucket pointer */ - struct cm_buf *fileHashBackp; /* file hash bucket back pointer */ - /* - * The file hash chain is doubly linked, since - * these chains can get rather long. The - * regular hash chain is only singly linked, - * since the chains should be short if the - * hash function is good and if there are - * enough buckets for the size of the cache. - */ - osi_mutex_t mx; /* mutex protecting structure except refcount */ - unsigned long refCount; /* reference count (buf_globalLock) */ - long idCounter; /* counter for softrefs; bumped at each recycle */ - long dirtyCounter; /* bumped at each dirty->clean transition */ -#ifdef notdef - cm_log_t *logp; /* log for this buffer, if any */ - osi_hyper_t lsn; /* lsn to force to (last LSN changing this buffer) */ -#endif /* notdef */ - osi_hyper_t offset; /* offset */ - cm_fid_t fid; /* file ID */ - long flags; /* flags we're using */ - long size; /* size in bytes of this buffer */ - char *datap; /* data in this buffer */ - unsigned long error; /* last error code, if CM_BUF_ERROR is set */ - cm_user_t *userp; /* user who wrote to the buffer last */ -#ifndef DJGPP - OVERLAPPED over; /* overlapped structure for I/O */ -#endif - - /* fields added for the CM; locked by scp->mx */ - long dataVersion; /* data version of this page */ - long cmFlags; /* flags for cm */ -#ifdef DISKCACHE95 - cm_diskcache_t *dcp; /* diskcache structure */ -#endif /* DISKCACHE95 */ -} cm_buf_t; - -/* values for cmFlags */ -#define CM_BUF_CMFETCHING 1 /* fetching this buffer */ -#define CM_BUF_CMSTORING 2 /* storing this buffer */ -#define CM_BUF_CMFULLYFETCHED 4 /* read-while-fetching optimization */ -/* waiting is done based on scp->flags */ - -/* represents soft reference which is OK to lose on a recycle */ -typedef struct cm_softRef { - cm_buf_t *bufp; /* buffer (may get reused) */ - long counter; /* counter of changes to identity */ -} cm_softRef_t; - -#define CM_BUF_READING 1 /* now reading buffer to the disk */ -#define CM_BUF_WRITING 2 /* now writing buffer to the disk */ -#define CM_BUF_INHASH 4 /* in the hash table */ -#define CM_BUF_DIRTY 8 /* buffer is dirty */ -#define CM_BUF_INLRU 0x10 /* in lru queue */ -#define CM_BUF_ERROR 0x20 /* something went wrong on delayed write */ -#define CM_BUF_WAITING 0x40 /* someone's waiting for a flag to change */ -#define CM_BUF_EVWAIT 0x80 /* someone's waiting for the buffer event */ -#define CM_BUF_EOF 0x100 /* read 0 bytes; used for detecting EOF */ - -typedef struct cm_buf_ops { - long (*Writep)(void *, osi_hyper_t *, long, long, struct cm_user *, - struct cm_req *); - long (*Readp)(cm_buf_t *, long, long *, struct cm_user *); - long (*Stabilizep)(void *, struct cm_user *, struct cm_req *); - long (*Unstabilizep)(void *, struct cm_user *); -} cm_buf_ops_t; - -/* global locks */ -extern osi_rwlock_t buf_globalLock; - -extern long buf_Init(int newFile, cm_buf_ops_t *, long nbuffers); - -extern void buf_Shutdown(void); - -extern long buf_CountFreeList(void); - -extern void buf_Release(cm_buf_t *); - -extern void buf_Hold(cm_buf_t *); - -extern void buf_WaitIO(cm_buf_t *); - -extern void buf_LockedRelease(cm_buf_t *); - -extern cm_buf_t *buf_LockedFind(struct cm_scache *, osi_hyper_t *); - -extern cm_buf_t *buf_Find(struct cm_scache *, osi_hyper_t *); - -#ifndef DJGPP -extern HANDLE buf_GetFileHandle(long); -#endif /* !DJGPP */ - -extern void buf_LockedCleanAsync(cm_buf_t *, cm_req_t *); - -extern long buf_GetNewLocked(struct cm_scache *, osi_hyper_t *, cm_buf_t **); - -extern long buf_Get(struct cm_scache *, osi_hyper_t *, cm_buf_t **); - -extern long buf_GetNew(struct cm_scache *, osi_hyper_t *, cm_buf_t **); - -extern void buf_CleanAsync(cm_buf_t *, cm_req_t *); - -extern void buf_CleanWait(cm_buf_t *); - -extern void buf_SetDirty(cm_buf_t *); - -extern long buf_CleanAndReset(void); - -extern void buf_ReserveBuffers(long); - -extern int buf_TryReserveBuffers(long); - -extern void buf_UnreserveBuffers(long); - -#ifdef TESTING -extern void buf_ValidateBufQueues(void); -#endif /* TESTING */ - -extern osi_log_t *buf_logp; - -extern long buf_Truncate(struct cm_scache *scp, cm_user_t *userp, - cm_req_t *reqp, osi_hyper_t *sizep); - -extern long buf_CleanVnode(struct cm_scache *scp, cm_user_t *userp, - cm_req_t *reqp); - -extern long buf_FlushCleanPages(cm_scache_t *scp, cm_user_t *userp, - cm_req_t *reqp); - -extern long buf_SetNBuffers(long nbuffers); - -extern long buf_ValidateBuffers(void); - -extern void buf_ForceTrace(BOOL flush); - -/* error codes */ -#define CM_BUF_EXISTS 1 /* buffer exists, and shouldn't */ -#define CM_ERROR_BASEBUF 0x33333333 -#define CM_ERROR_TOOFEWBUFS (CM_ERROR_BASEBUF+0) -#define CM_ERROR_TOOMANYBUFS (CM_ERROR_BASEBUF+1) -#endif /* _BUF_H__ENV_ */ diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c deleted file mode 100644 index e57269724..000000000 --- a/src/WINNT/afsd/cm_callback.c +++ /dev/null @@ -1,1742 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include -#include - -#ifndef DJGPP -#include -#include -#else -#include -#endif /* !DJGPP */ -#include -#include -#include - -#include -#include - -#include "afsd.h" -#include -#include - -/*extern void afsi_log(char *pattern, ...);*/ - -/* read/write lock for all global storage in this module */ -osi_rwlock_t cm_callbackLock; - -#ifdef AFS_FREELANCE_CLIENT -extern osi_mutex_t cm_Freelance_Lock; -#endif - -/* count of # of callback breaking messages received by this CM so far. We use - * this count in determining whether there have been any callback breaks that - * apply to a call that returned a new callback. If the counter doesn't - * increase during a call, then we know that no callbacks were broken during - * that call, and thus that the callback that was just returned is still valid. - */ -long cm_callbackCount; - -/* count of number of RPCs potentially returning a callback executing now. - * When this counter hits zero, we can clear out the racing revokes list, since - * at that time, we know that none of the just-executed callback revokes will - * apply to any future call that returns a callback (since the latter hasn't - * even started execution yet). - */ -long cm_activeCallbackGrantingCalls; - -/* list of callbacks that have been broken recently. If a call returning a - * callback is executing and a callback revoke runs immediately after it at the - * server, the revoke may end up being processed before the response to the - * original callback granting call. We detect this by keeping a list of - * callback revokes that have been received since we *started* the callback - * granting call, and discarding any callbacks received for the same file ID, - * even if the callback revoke was received before the callback grant. - */ -cm_racingRevokes_t *cm_racingRevokesp; - -/* record a (potentially) racing revoke for this file ID; null means for all - * file IDs, and is used by InitCallBackState. - * - * The cancelFlags describe whether we're just discarding callbacks for the same - * file ID, the same volume, or all from the same server. - * - * Called with no locks held. - */ -void cm_RecordRacingRevoke(cm_fid_t *fidp, long cancelFlags) -{ - cm_racingRevokes_t *rp; - - lock_ObtainWrite(&cm_callbackLock); - - osi_Log3(afsd_logp, "RecordRacingRevoke Volume %d Flags %lX activeCalls %d", - fidp ? fidp->volume : 0, cancelFlags, cm_activeCallbackGrantingCalls); - - if (cm_activeCallbackGrantingCalls > 0) { - rp = malloc(sizeof(*rp)); - memset(rp, 0, sizeof(*rp)); - osi_QAdd((osi_queue_t **) &cm_racingRevokesp, &rp->q); - rp->flags |= (cancelFlags & CM_RACINGFLAG_ALL); - if (fidp) rp->fid = *fidp; - rp->callbackCount = ++cm_callbackCount; - } - lock_ReleaseWrite(&cm_callbackLock); -} - -/* - * When we lose a callback, may have to send change notification replies. - * Do not call with a lock on the scp. - */ -void cm_CallbackNotifyChange(cm_scache_t *scp) -{ - DWORD dwDelay = 0; - HKEY hKey; - DWORD dummyLen; - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY, - 0, - KEY_READ|KEY_QUERY_VALUE, - &hKey) == ERROR_SUCCESS) { - - dummyLen = sizeof(DWORD); - RegQueryValueEx(hKey, "CallBack Notify Change Delay", NULL, NULL, - (BYTE *) &dwDelay, &dummyLen); - RegCloseKey(hKey); - } - - if (dwDelay > 5000) /* do not allow a delay of more then 5 seconds */ - dwDelay = 5000; - - osi_Log3(afsd_logp, "CallbackNotifyChange FileType %d Flags %lX Delay %dms", - scp->fileType, scp->flags, dwDelay); - - if (dwDelay) - Sleep(dwDelay); - - if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { - if (scp->flags & CM_SCACHEFLAG_ANYWATCH) - smb_NotifyChange(0, - FILE_NOTIFY_GENERIC_DIRECTORY_FILTER, - scp, NULL, NULL, TRUE); - } else { - cm_fid_t tfid; - cm_scache_t *dscp; - - tfid.cell = scp->fid.cell; - tfid.volume = scp->fid.volume; - tfid.vnode = scp->parentVnode; - tfid.unique = scp->parentUnique; - dscp = cm_FindSCache(&tfid); - if ( dscp && - dscp->flags & CM_SCACHEFLAG_ANYWATCH ) - smb_NotifyChange( 0, - FILE_NOTIFY_GENERIC_FILE_FILTER, - dscp, NULL, NULL, TRUE); - if (dscp) - cm_ReleaseSCache(dscp); - } -} - -/* called with no locks held for every file ID that is revoked directly by - * a callback revoke call. Does not have to handle volume callback breaks, - * since those have already been split out. - * - * The callp parameter is currently unused. - */ -void cm_RevokeCallback(struct rx_call *callp, AFSFid *fidp) -{ - cm_fid_t tfid; - cm_scache_t *scp; - long hash; - - /* don't bother setting cell, since we won't be checking it (to aid - * in working with multi-homed servers: we don't know the cell if we - * don't recognize the IP address). - */ - tfid.cell = 0; - tfid.volume = fidp->Volume; - tfid.vnode = fidp->Vnode; - tfid.unique = fidp->Unique; - hash = CM_SCACHE_HASH(&tfid); - - osi_Log3(afsd_logp, "RevokeCallback vol %u vn %u uniq %u", - fidp->Volume, fidp->Vnode, fidp->Unique); - - /* do this first, so that if we're executing a callback granting call - * at this moment, we kill it before it can be merged in. Otherwise, - * it could complete while we're doing the scan below, and get missed - * by both the scan and by this code. - */ - cm_RecordRacingRevoke(&tfid, 0); - - lock_ObtainWrite(&cm_scacheLock); - /* do all in the hash bucket, since we don't know how many we'll find with - * varying cells. - */ - for (scp = cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - if (scp->fid.volume == tfid.volume && - scp->fid.vnode == tfid.vnode && - scp->fid.unique == tfid.unique && - scp->cbExpires > 0 && - scp->cbServerp != NULL) - { - cm_HoldSCacheNoLock(scp); - lock_ReleaseWrite(&cm_scacheLock); - osi_Log4(afsd_logp, "RevokeCallback Discarding SCache scp 0x%x vol %u vn %u uniq %u", - scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique); - lock_ObtainMutex(&scp->mx); - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); - cm_CallbackNotifyChange(scp); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); - } - } - lock_ReleaseWrite(&cm_scacheLock); - - osi_Log3(afsd_logp, "RevokeCallback Complete vol %u vn %u uniq %u", - fidp->Volume, fidp->Vnode, fidp->Unique); -} - -/* called to revoke a volume callback, which is typically issued when a volume - * is moved from one server to another. - * - * Called with no locks held. - */ -void cm_RevokeVolumeCallback(struct rx_call *callp, AFSFid *fidp) -{ - long hash; - cm_scache_t *scp; - cm_fid_t tfid; - - osi_Log1(afsd_logp, "RevokeVolumeCallback vol %d", fidp->Volume); - - /* do this first, so that if we're executing a callback granting call - * at this moment, we kill it before it can be merged in. Otherwise, - * it could complete while we're doing the scan below, and get missed - * by both the scan and by this code. - */ - tfid.cell = tfid.vnode = tfid.unique = 0; - tfid.volume = fidp->Volume; - cm_RecordRacingRevoke(&tfid, CM_RACINGFLAG_CANCELVOL); - - - lock_ObtainWrite(&cm_scacheLock); - for (hash = 0; hash < cm_data.hashTableSize; hash++) { - for(scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - if (scp->fid.volume == fidp->Volume && - scp->cbExpires > 0 && - scp->cbServerp != NULL) { - cm_HoldSCacheNoLock(scp); - lock_ReleaseWrite(&cm_scacheLock); - lock_ObtainMutex(&scp->mx); - osi_Log4(afsd_logp, "RevokeVolumeCallback Discarding SCache scp 0x%x vol %u vn %u uniq %u", - scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique); - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); - cm_CallbackNotifyChange(scp); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); - } - } /* search one hash bucket */ - } /* search all hash buckets */ - - lock_ReleaseWrite(&cm_scacheLock); - - osi_Log1(afsd_logp, "RevokeVolumeCallback Complete vol %d", fidp->Volume); -} - -/* - * afs_data_pointer_to_int32() - returns least significant afs_int32 of the - * given data pointer, without triggering "cast truncates pointer" - * warnings. We use this where we explicitly don't care whether a - * pointer is truncated -- it loses information where a pointer is - * larger than an afs_int32. - */ - -static afs_int32 -afs_data_pointer_to_int32(const void *p) -{ - union { - afs_int32 i32[sizeof(void *) / sizeof(afs_int32)]; - const void *p; - } ip; - - int i32_sub; /* subscript of least significant afs_int32 in ip.i32[] */ - - /* set i32_sub */ - - { - /* used to determine the byte order of the system */ - - union { - char c[sizeof(int) / sizeof(char)]; - int i; - } ci; - - ci.i = 1; - if (ci.c[0] == 1) { - /* little-endian system */ - i32_sub = 0; - } else { - /* big-endian system */ - i32_sub = (sizeof ip.i32 / sizeof ip.i32[0]) - 1; - } - } - - ip.p = p; - return ip.i32[i32_sub]; -} -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_CallBack - * - * Description: - * Routine called by the server-side callback RPC interface to - * implement passing in callback information. - * table. - * - * Arguments: - * rx_call : Ptr to Rx call on which this request came in. - * fidsArrayp : Ptr to array of fids involved. - * cbsArrayp : Ptr to matching callback info for the fids. - * - * Returns: - * 0 (always). - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ -/* handle incoming RPC callback breaking message. - * Called with no locks held. - */ -int -SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArrayp) -{ - int i; - AFSFid *tfidp; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d", - ntohl(host), - ntohs(port)); - - for (i=0; i < (long) fidsArrayp->AFSCBFids_len; i++) { - tfidp = &fidsArrayp->AFSCBFids_val[i]; - - if (tfidp->Volume == 0) - continue; /* means don't do anything */ - else if (tfidp->Vnode == 0) - cm_RevokeVolumeCallback(callp, tfidp); - else - cm_RevokeCallback(callp, tfidp); - } - - MUTEX_EXIT(&callp->lock); - return 0; -} - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_InitCallBackState - * - * Description: - * Routine called by the server-side callback RPC interface to - * implement clearing all callbacks from this host. - * - * Arguments: - * rx_call : Ptr to Rx call on which this request came in. - * - * Returns: - * 0 (always). - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ -/* called with no locks by RPC system when a server indicates that it has never - * heard from us, or for other reasons has had to discard callbacks from us - * without telling us, e.g. a network partition. - */ -int -SRXAFSCB_InitCallBackState(struct rx_call *callp) -{ - struct sockaddr_in taddr; - cm_server_t *tsp; - cm_scache_t *scp; - int hash; - int discarded; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_InitCallBackState from host 0x%x port %d", - ntohl(host), - ntohs(port)); - - if ((rx_ConnectionOf(callp)) && (rx_PeerOf(rx_ConnectionOf(callp)))) { - taddr.sin_family = AF_INET; - taddr.sin_addr.s_addr = rx_HostOf(rx_PeerOf(rx_ConnectionOf(callp))); - - tsp = cm_FindServer(&taddr, CM_SERVER_FILE); - - osi_Log1(afsd_logp, "Init Callback State server %x", tsp); - - /* record the callback in the racing revokes structure. This - * shouldn't be necessary, since we shouldn't be making callback - * granting calls while we're going to get an initstate call, - * but there probably are some obscure races, so better safe - * than sorry. - * - * We do this first since we don't hold the cm_scacheLock and vnode - * locks over the entire callback scan operation below. The - * big loop below is guaranteed to hit any callback already - * processed. The call to RecordRacingRevoke is guaranteed - * to kill any callback that is currently being returned. - * Anything that sneaks past both must start - * after the call to RecordRacingRevoke. - */ - cm_RecordRacingRevoke(NULL, CM_RACINGFLAG_CANCELALL); - - /* now search all vnodes looking for guys with this callback, if we - * found it, or guys with any callbacks, if we didn't find the server - * (that's how multihomed machines will appear and how we'll handle - * them, albeit a little inefficiently). That is, we're discarding all - * callbacks from all hosts if we get an initstate call from an unknown - * host. Since these calls are rare, and multihomed servers - * are "rare," hopefully this won't be a problem. - */ - lock_ObtainWrite(&cm_scacheLock); - for (hash = 0; hash < cm_data.hashTableSize; hash++) { - for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - cm_HoldSCacheNoLock(scp); - lock_ReleaseWrite(&cm_scacheLock); - lock_ObtainMutex(&scp->mx); - discarded = 0; - if (scp->cbExpires > 0 && scp->cbServerp != NULL) { - /* we have a callback, now decide if we should clear it */ - if (scp->cbServerp == tsp || tsp == NULL) { - osi_Log4(afsd_logp, "InitCallbackState Discarding SCache scp 0x%x vol %u vn %u uniq %u", - scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique); - cm_DiscardSCache(scp); - discarded = 1; - } - } - lock_ReleaseMutex(&scp->mx); - if (discarded) - cm_CallbackNotifyChange(scp); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); - } /* search one hash bucket */ - } /* search all hash buckets */ - - lock_ReleaseWrite(&cm_scacheLock); - - /* we're done with the server structure */ - if (tsp) - cm_PutServer(tsp); - } - MUTEX_EXIT(&callp->lock); - return 0; -} - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_Probe - * - * Description: - * Routine called by the server-side callback RPC interface to - * implement ``probing'' the Cache Manager, just making sure it's - * still there. - * - * Arguments: - * rx_call : Ptr to Rx call on which this request came in. - * - * Returns: - * 0 (always). - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ -int -SRXAFSCB_Probe(struct rx_call *callp) -{ - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_Probe from host 0x%x port %d", - ntohl(host), - ntohs(port)); - - MUTEX_EXIT(&callp->lock); - return 0; -} - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_GetLock - * - * Description: - * Routine called by the server-side callback RPC interface to - * implement pulling out the contents of a lock in the lock - * table. - * - * Arguments: - * a_call : Ptr to Rx call on which this request came in. - * a_index : Index of desired lock. - * a_result : Ptr to a buffer for the given lock. - * - * Returns: - * 0 if everything went fine, - * 1 if we were given a bad index. - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ -/* debug interface */ - -extern osi_rwlock_t cm_aclLock; -extern osi_rwlock_t buf_globalLock; -extern osi_rwlock_t cm_callbackLock; -extern osi_rwlock_t cm_cellLock; -extern osi_rwlock_t cm_connLock; -extern osi_rwlock_t cm_daemonLock; -extern osi_rwlock_t cm_dnlcLock; -extern osi_rwlock_t cm_scacheLock; -extern osi_rwlock_t cm_serverLock; -extern osi_rwlock_t cm_userLock; -extern osi_rwlock_t cm_utilsLock; -extern osi_rwlock_t cm_volumeLock; -extern osi_rwlock_t smb_globalLock; -extern osi_rwlock_t smb_rctLock; - -extern osi_mutex_t cm_Freelance_Lock; -extern osi_mutex_t cm_bufGetMutex; -extern osi_mutex_t cm_Afsdsbmt_Lock; -extern osi_mutex_t tokenEventLock; -extern osi_mutex_t smb_ListenerLock; -extern osi_mutex_t smb_RawBufLock; -extern osi_mutex_t smb_Dir_Watch_Lock; - -#define LOCKTYPE_RW 1 -#define LOCKTYPE_MUTEX 2 -static struct _ltable { - char *name; - char *addr; - int type; -} ltable[] = { - {"cm_scacheLock", (char*)&cm_scacheLock, LOCKTYPE_RW}, - {"buf_globalLock", (char*)&buf_globalLock, LOCKTYPE_RW}, - {"cm_serverLock", (char*)&cm_serverLock, LOCKTYPE_RW}, - {"cm_callbackLock", (char*)&cm_callbackLock, LOCKTYPE_RW}, - {"cm_aclLock", (char*)&cm_aclLock, LOCKTYPE_RW}, - {"cm_cellLock", (char*)&cm_cellLock, LOCKTYPE_RW}, - {"cm_connLock", (char*)&cm_connLock, LOCKTYPE_RW}, - {"cm_userLock", (char*)&cm_userLock, LOCKTYPE_RW}, - {"cm_volumeLock", (char*)&cm_volumeLock, LOCKTYPE_RW}, - {"cm_daemonLock", (char*)&cm_daemonLock, LOCKTYPE_RW}, - {"cm_dnlcLock", (char*)&cm_dnlcLock, LOCKTYPE_RW}, - {"cm_utilsLock", (char*)&cm_utilsLock, LOCKTYPE_RW}, - {"smb_globalLock", (char*)&smb_globalLock, LOCKTYPE_RW}, - {"smb_rctLock", (char*)&smb_rctLock, LOCKTYPE_RW}, - {"cm_Freelance_Lock",(char*)&cm_Freelance_Lock, LOCKTYPE_MUTEX}, - {"cm_bufGetMutex", (char*)&cm_bufGetMutex, LOCKTYPE_MUTEX}, - {"cm_Afsdsbmt_Lock", (char*)&cm_Afsdsbmt_Lock, LOCKTYPE_MUTEX}, - {"tokenEventLock", (char*)&tokenEventLock, LOCKTYPE_MUTEX}, - {"smb_ListenerLock", (char*)&smb_ListenerLock, LOCKTYPE_MUTEX}, - {"smb_RawBufLock", (char*)&smb_RawBufLock, LOCKTYPE_MUTEX}, - {"smb_Dir_Watch_Lock",(char*)&smb_Dir_Watch_Lock, LOCKTYPE_MUTEX} -}; - -int -SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp) -{ - struct _ltable *tl; /*Ptr to lock table entry */ - osi_rwlock_t *rwp; - osi_mutex_t *mtxp; - int nentries; /*Num entries in table */ - int code; /*Return code */ - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log3(afsd_logp, "SRXAFSCB_GetLock(%d) from host 0x%x port %d", - index, ntohl(host), ntohs(port)); - - nentries = sizeof(ltable) / sizeof(struct _ltable); - if (index < 0 || index >= nentries) { - /* - * Past EOF - */ - code = 1; - } else { - /* - * Found it - copy out its contents. - */ - tl = <able[index]; - strncpy(lockp->name, tl->name, sizeof(lockp->name)); - lockp->name[sizeof(lockp->name)-1] = '\0'; - lockp->lock.waitStates = 0; - switch ( tl->type ) { - case LOCKTYPE_RW: - rwp = (osi_rwlock_t *)tl->addr; - lockp->lock.exclLocked = rwp->flags; - lockp->lock.readersReading = rwp->readers; - lockp->lock.numWaiting = rwp->waiters; - break; - case LOCKTYPE_MUTEX: - mtxp = (osi_mutex_t *)tl->addr; - lockp->lock.exclLocked = mtxp->flags; - lockp->lock.readersReading = 0; - lockp->lock.numWaiting = mtxp->waiters; - break; - } - lockp->lock.pid_last_reader = 0; - lockp->lock.pid_writer = 0; - lockp->lock.src_indicator = 0; - code = 0; - } - - MUTEX_EXIT(&callp->lock); - return code; -} - -/* debug interface */ -int -SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep) -{ - int i; - cm_scache_t * scp; - int code; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetCE from host 0x%x port %d", - ntohl(host), ntohs(port)); - - lock_ObtainRead(&cm_scacheLock); - for (i = 0; i < cm_data.hashTableSize; i++) { - for (scp = cm_data.hashTablep[i]; scp; scp = scp->nextp) { - if (index == 0) - goto searchDone; - index--; - } /*Zip through current hash chain */ - } /*Zip through hash chains */ - - searchDone: - if (scp == NULL) { - /*Past EOF */ - code = 1; - goto fcnDone; - } - - /* - * Copy out the located entry. - */ - memset(cep, 0, sizeof(AFSDBCacheEntry)); - cep->addr = afs_data_pointer_to_int32(scp); - cep->cell = scp->fid.cell; - cep->netFid.Volume = scp->fid.volume; - cep->netFid.Vnode = scp->fid.vnode; - cep->netFid.Unique = scp->fid.unique; - cep->lock.waitStates = 0; - cep->lock.exclLocked = scp->mx.flags; - cep->lock.readersReading = 0; - cep->lock.numWaiting = scp->mx.waiters; - cep->lock.pid_last_reader = 0; - cep->lock.pid_writer = 0; - cep->lock.src_indicator = 0; - cep->Length = scp->length.LowPart; - cep->DataVersion = scp->dataVersion; - cep->callback = afs_data_pointer_to_int32(scp->cbServerp); - cep->cbExpires = scp->cbExpires; - cep->refCount = scp->refCount; - cep->opens = scp->openReads; - cep->writers = scp->openWrites; - switch (scp->fileType) { - case CM_SCACHETYPE_FILE: - cep->mvstat = 0; - break; - case CM_SCACHETYPE_MOUNTPOINT: - cep->mvstat = 1; - break; - case CM_SCACHETYPE_DIRECTORY: - if (scp->fid.vnode == 1 && scp->fid.unique == 1) - cep->mvstat = 2; - else - cep->mvstat = 3; - break; - case CM_SCACHETYPE_SYMLINK: - cep->mvstat = 4; - break; - case CM_SCACHETYPE_DFSLINK: - cep->mvstat = 5; - break; - case CM_SCACHETYPE_INVALID: - cep->mvstat = 6; - break; - } - cep->states = 0; - if (scp->flags & CM_SCACHEFLAG_STATD) - cep->states |= 1; - if (scp->flags & CM_SCACHEFLAG_RO || scp->flags & CM_SCACHEFLAG_PURERO) - cep->states |= 4; - if (scp->fileType == CM_SCACHETYPE_MOUNTPOINT && - scp->mountPointStringp[0]) - cep->states |= 8; - if (scp->flags & CM_SCACHEFLAG_WAITING) - cep->states |= 0x40; - code = 0; - - /* - * Return our results. - */ - fcnDone: - lock_ReleaseRead(&cm_scacheLock); - - MUTEX_EXIT(&callp->lock); - return (code); -} - -/* debug interface */ -int -SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep) -{ - int i; - cm_scache_t * scp; - int code; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetCE64 from host 0x%x port %d", - ntohl(host), ntohs(port)); - - lock_ObtainRead(&cm_scacheLock); - for (i = 0; i < cm_data.hashTableSize; i++) { - for (scp = cm_data.hashTablep[i]; scp; scp = scp->nextp) { - if (index == 0) - goto searchDone; - index--; - } /*Zip through current hash chain */ - } /*Zip through hash chains */ - - searchDone: - if (scp == NULL) { - /*Past EOF */ - code = 1; - goto fcnDone; - } - - /* - * Copy out the located entry. - */ - memset(cep, 0, sizeof(AFSDBCacheEntry64)); - cep->addr = afs_data_pointer_to_int32(scp); - cep->cell = scp->fid.cell; - cep->netFid.Volume = scp->fid.volume; - cep->netFid.Vnode = scp->fid.vnode; - cep->netFid.Unique = scp->fid.unique; - cep->lock.waitStates = 0; - cep->lock.exclLocked = scp->mx.flags; - cep->lock.readersReading = 0; - cep->lock.numWaiting = scp->mx.waiters; - cep->lock.pid_last_reader = 0; - cep->lock.pid_writer = 0; - cep->lock.src_indicator = 0; -#if !defined(AFS_64BIT_ENV) - cep->Length.high = scp->length.HighPart; - cep->Length.low = scp->length.LowPart; -#else - cep->Length = ((afs_int64)scp->length.HighPart)<<32 | scp->length.LowPart; -#endif - cep->DataVersion = scp->dataVersion; - cep->callback = afs_data_pointer_to_int32(scp->cbServerp); - cep->cbExpires = scp->cbExpires; - cep->refCount = scp->refCount; - cep->opens = scp->openReads; - cep->writers = scp->openWrites; - switch (scp->fileType) { - case CM_SCACHETYPE_FILE: - cep->mvstat = 0; - break; - case CM_SCACHETYPE_MOUNTPOINT: - cep->mvstat = 1; - break; - case CM_SCACHETYPE_DIRECTORY: - if (scp->fid.vnode == 1 && scp->fid.unique == 1) - cep->mvstat = 2; - else - cep->mvstat = 3; - break; - case CM_SCACHETYPE_SYMLINK: - cep->mvstat = 4; - break; - case CM_SCACHETYPE_DFSLINK: - cep->mvstat = 5; - break; - case CM_SCACHETYPE_INVALID: - cep->mvstat = 6; - break; - } - cep->states = 0; - if (scp->flags & CM_SCACHEFLAG_STATD) - cep->states |= 1; - if (scp->flags & CM_SCACHEFLAG_RO || scp->flags & CM_SCACHEFLAG_PURERO) - cep->states |= 4; - if (scp->fileType == CM_SCACHETYPE_MOUNTPOINT && - scp->mountPointStringp[0]) - cep->states |= 8; - if (scp->flags & CM_SCACHEFLAG_WAITING) - cep->states |= 0x40; - code = 0; - - /* - * Return our results. - */ - fcnDone: - lock_ReleaseRead(&cm_scacheLock); - - MUTEX_EXIT(&callp->lock); - return (code); -} - -/* debug interface: not implemented */ -int -SRXAFSCB_XStatsVersion(struct rx_call *callp, long *vp) -{ - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_XStatsVersion from host 0x%x port %d - not implemented", - ntohl(host), ntohs(port)); - *vp = -1; - - MUTEX_EXIT(&callp->lock); - return RXGEN_OPCODE; -} - -/* debug interface: not implemented */ -int -SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long *timep, - AFSCB_CollData *datap) -{ - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetXStats from host 0x%x port %d - not implemented", - ntohl(host), ntohs(port)); - - MUTEX_EXIT(&callp->lock); - return RXGEN_OPCODE; -} - -int -SRXAFSCB_InitCallBackState2(struct rx_call *callp, struct interfaceAddr* addr) -{ - osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState2 ->"); - - return SRXAFSCB_InitCallBackState(callp); -} - -/* debug interface */ -int -SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr) -{ - int i; - int cm_noIPAddr; /* number of client network interfaces */ - int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */ - int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/ - int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */ - int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */ - long code; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - /* get network related info */ - cm_noIPAddr = CM_MAXINTERFACE_ADDR; - code = syscfg_GetIFInfo(&cm_noIPAddr, - cm_IPAddr, cm_SubnetMask, - cm_NetMtu, cm_NetFlags); - - /* return all network interface addresses */ - osi_Log2(afsd_logp, "SRXAFSCB_WhoAreYou from host 0x%x port %d", - ntohl(host), - ntohs(port)); - - addr->numberOfInterfaces = cm_noIPAddr; - addr->uuid = cm_data.Uuid; - for ( i=0; i < cm_noIPAddr; i++ ) { - addr->addr_in[i] = cm_IPAddr[i]; - addr->subnetmask[i] = cm_SubnetMask[i]; - addr->mtu[i] = (rx_mtu == -1 || (rx_mtu != -1 && cm_NetMtu[i] < rx_mtu)) ? - cm_NetMtu[i] : rx_mtu; - } - - MUTEX_EXIT(&callp->lock); - return 0; -} - -int -SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid) -{ - char *p = NULL; - - if (UuidToString((UUID *)serverUuid, &p) == RPC_S_OK) { - osi_Log1(afsd_logp, "SRXAFSCB_InitCallBackState3 %s ->",p); - RpcStringFree(&p); - } else - osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState3 - no server Uuid ->"); - - return SRXAFSCB_InitCallBackState(callp); -} - -/* debug interface */ -int -SRXAFSCB_ProbeUuid(struct rx_call *callp, afsUUID* clientUuid) -{ - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - char *p,*q; - int code = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - if ( !afs_uuid_equal(&cm_data.Uuid, clientUuid) ) { - UuidToString((UUID *)&cm_data.Uuid, &p); - UuidToString((UUID *)clientUuid, &q); - osi_Log4(afsd_logp, "SRXAFSCB_ProbeUuid %s != %s from host 0x%x port %d", - osi_LogSaveString(afsd_logp,p), - osi_LogSaveString(afsd_logp,q), - ntohl(host), - ntohs(port)); - RpcStringFree(&p); - RpcStringFree(&q); - - code = 1; /* failure */ - } else - osi_Log2(afsd_logp, "SRXAFSCB_ProbeUuid (success) from host 0x%x port %d", - ntohl(host), - ntohs(port)); - - MUTEX_EXIT(&callp->lock); - return code; -} - -/* debug interface */ -int -SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum, - char **a_name, serverList *a_hosts) -{ - afs_int32 sn; - cm_cell_t * cellp; - cm_serverRef_t * serverRefp; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log3(afsd_logp, "SRXAFSCB_GetCellByNum(%d) from host 0x%x port %d", - a_cellnum, ntohl(host), ntohs(port)); - - a_hosts->serverList_val = 0; - a_hosts->serverList_len = 0; - - cellp = cm_FindCellByID(a_cellnum); - if (!cellp) { - *a_name = strdup(""); - MUTEX_EXIT(&callp->lock); - return 0; - } - - lock_ObtainRead(&cm_serverLock); - *a_name = strdup(cellp->name); - - for ( sn = 0, serverRefp = cellp->vlServersp; - sn < AFSMAXCELLHOSTS && serverRefp; - sn++, serverRefp = serverRefp->next); - - a_hosts->serverList_len = sn; - a_hosts->serverList_val = (afs_int32 *)osi_Alloc(sn * sizeof(afs_int32)); - - for ( sn = 0, serverRefp = cellp->vlServersp; - sn < AFSMAXCELLHOSTS && serverRefp; - sn++, serverRefp = serverRefp->next) - { - a_hosts->serverList_val[sn] = ntohl(serverRefp->server->addr.sin_addr.s_addr); - } - - lock_ReleaseRead(&cm_serverLock); - MUTEX_EXIT(&callp->lock); - return 0; -} - -/* debug interface */ -int -SRXAFSCB_TellMeAboutYourself( struct rx_call *callp, - struct interfaceAddr *addr, - Capabilities * capabilities) -{ - int i; - afs_int32 *dataBuffP; - afs_int32 dataBytes; - int cm_noIPAddr; /* number of client network interfaces */ - int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */ - int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/ - int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */ - int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */ - long code; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - /* get network related info */ - cm_noIPAddr = CM_MAXINTERFACE_ADDR; - code = syscfg_GetIFInfo(&cm_noIPAddr, - cm_IPAddr, cm_SubnetMask, - cm_NetMtu, cm_NetFlags); - - osi_Log2(afsd_logp, "SRXAFSCB_TellMeAboutYourself from host 0x%x port %d", - ntohl(host), - ntohs(port)); - - /* return all network interface addresses */ - addr->numberOfInterfaces = cm_noIPAddr; - addr->uuid = cm_data.Uuid; - for ( i=0; i < cm_noIPAddr; i++ ) { - addr->addr_in[i] = cm_IPAddr[i]; - addr->subnetmask[i] = cm_SubnetMask[i]; - addr->mtu[i] = (rx_mtu == -1 || (rx_mtu != -1 && cm_NetMtu[i] < rx_mtu)) ? - cm_NetMtu[i] : rx_mtu; - } - - dataBytes = 1 * sizeof(afs_int32); - dataBuffP = (afs_int32 *) osi_Alloc(dataBytes); - dataBuffP[0] = CAPABILITY_ERRORTRANS; - capabilities->Capabilities_len = dataBytes / sizeof(afs_int32); - capabilities->Capabilities_val = dataBuffP; - - MUTEX_EXIT(&callp->lock); - return 0; -} - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_GetServerPrefs - * - * Description: - * Routine to list server preferences used by this client. - * - * Arguments: - * a_call : Ptr to Rx call on which this request came in. - * a_index : Input server index - * a_srvr_addr : Output server address (0xffffffff on last server) - * a_srvr_rank : Output server rank - * - * Returns: - * 0 on success - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ - -int SRXAFSCB_GetServerPrefs( - struct rx_call *callp, - afs_int32 a_index, - afs_int32 *a_srvr_addr, - afs_int32 *a_srvr_rank) -{ - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetServerPrefs from host 0x%x port %d - not implemented", - ntohl(host), - ntohs(port)); - - *a_srvr_addr = 0xffffffff; - *a_srvr_rank = 0xffffffff; - - MUTEX_EXIT(&callp->lock); - return 0; -} - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_GetCellServDB - * - * Description: - * Routine to list cells configured for this client - * - * Arguments: - * a_call : Ptr to Rx call on which this request came in. - * a_index : Input cell index - * a_name : Output cell name ("" on last cell) - * a_hosts : Output cell database servers - * - * Returns: - * 0 on success - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ - -int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name, - serverList *a_hosts) -{ - char *t_name; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetCellServDB from host 0x%x port %d - not implemented", - ntohl(host), ntohs(port)); - - t_name = (char *)malloc(AFSNAMEMAX); - t_name[0] = '\0'; - *a_name = t_name; - a_hosts->serverList_len = 0; - - MUTEX_EXIT(&callp->lock); - return 0; -} - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_GetLocalCell - * - * Description: - * Routine to return name of client's local cell - * - * Arguments: - * a_call : Ptr to Rx call on which this request came in. - * a_name : Output cell name - * - * Returns: - * 0 on success - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ - -int SRXAFSCB_GetLocalCell(struct rx_call *callp, char **a_name) -{ - char *t_name; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetLocalCell from host 0x%x port %d", - ntohl(host), ntohs(port)); - - if (cm_data.rootCellp) { - t_name = (char *)malloc(strlen(cm_data.rootCellp->name)+1); - strcpy(t_name, cm_data.rootCellp->name); - } else { - t_name = (char *)malloc(1); - t_name[0] = '\0'; - } - *a_name = t_name; - - MUTEX_EXIT(&callp->lock); - return 0; -} - - -/* - * afs_MarshallCacheConfig - marshall client cache configuration - * - * PARAMETERS - * - * IN callerVersion - the rpc stat version of the caller. - * - * IN config - client cache configuration. - * - * OUT ptr - buffer where configuration is marshalled. - * - * RETURN CODES - * - * Returns void. - */ -static void afs_MarshallCacheConfig( - afs_uint32 callerVersion, - cm_initparams_v1 *config, - afs_uint32 *ptr) -{ - /* - * We currently only support version 1. - */ - *(ptr++) = config->nChunkFiles; - *(ptr++) = config->nStatCaches; - *(ptr++) = config->nDataCaches; - *(ptr++) = config->nVolumeCaches; - *(ptr++) = config->firstChunkSize; - *(ptr++) = config->otherChunkSize; - *(ptr++) = config->cacheSize; - *(ptr++) = config->setTime; - *(ptr++) = config->memCache; - -} - - -/*------------------------------------------------------------------------ - * EXPORTED SRXAFSCB_GetCacheConfig - * - * Description: - * Routine to return parameters used to initialize client cache. - * Client may request any format version. Server may not return - * format version greater than version requested by client. - * - * Arguments: - * a_call: Ptr to Rx call on which this request came in. - * callerVersion: Data format version desired by the client. - * serverVersion: Data format version of output data. - * configCount: Number bytes allocated for output data. - * config: Client cache configuration. - * - * Returns: - * 0 on success - * - * Environment: - * Nothing interesting. - * - * Side Effects: - * As advertised. - *------------------------------------------------------------------------*/ - -int SRXAFSCB_GetCacheConfig(struct rx_call *callp, - afs_uint32 callerVersion, - afs_uint32 *serverVersion, - afs_uint32 *configCount, - cacheConfig *config) -{ - afs_uint32 *t_config; - size_t allocsize; - extern cm_initparams_v1 cm_initParams; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; - - MUTEX_ENTER(&callp->lock); - - if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { - host = rx_HostOf(peerp); - port = rx_PortOf(peerp); - } - - osi_Log2(afsd_logp, "SRXAFSCB_GetCacheConfig from host 0x%x port %d - version 1 only", - ntohl(host), ntohs(port)); - - /* - * Currently only support version 1 - */ - allocsize = sizeof(cm_initparams_v1); - t_config = (afs_uint32 *)malloc(allocsize); - - afs_MarshallCacheConfig(callerVersion, &cm_initParams, t_config); - - *serverVersion = AFS_CLIENT_RETRIEVAL_FIRST_EDITION; - *configCount = allocsize; - config->cacheConfig_val = t_config; - config->cacheConfig_len = allocsize/sizeof(afs_uint32); - - MUTEX_EXIT(&callp->lock); - return 0; -} - -/* called by afsd without any locks to initialize this module */ -void cm_InitCallback(void) -{ - lock_InitializeRWLock(&cm_callbackLock, "cm_callbackLock"); - cm_activeCallbackGrantingCalls = 0; -} - -/* called with locked scp; tells us whether we've got a callback. - * Expirations are checked by a background daemon so as to make - * this function as inexpensive as possible - */ -int cm_HaveCallback(cm_scache_t *scp) -{ -#ifdef AFS_FREELANCE_CLIENT - // yj: we handle callbacks specially for callbacks on the root directory - // Since it's local, we almost always say that we have callback on it - // The only time we send back a 0 is if we're need to initialize or - // reinitialize the fake directory - - // There are 2 state variables cm_fakeGettingCallback and cm_fakeDirCallback - // cm_fakeGettingCallback is 1 if we're in the process of initialization and - // hence should return false. it's 0 otherwise - // cm_fakeDirCallback is 0 if we haven't loaded the fake directory, it's 1 - // if the fake directory is loaded and this is the first time cm_HaveCallback - // is called since then. We return false in this case to allow cm_GetCallback - // to be called because cm_GetCallback has some initialization work to do. - // If cm_fakeDirCallback is 2, then it means that the fake directory is in - // good shape and we simply return true, provided no change is detected. - int fdc, fgc; - - if (cm_freelanceEnabled && - scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) { - /* if it's something on /afs */ - if (!(scp->fid.vnode==0x1 && scp->fid.unique==0x1)) { - /* if it's not root.afs */ - return 1; - } - - lock_ObtainMutex(&cm_Freelance_Lock); - fdc = cm_fakeDirCallback; - fgc = cm_fakeGettingCallback; - lock_ReleaseMutex(&cm_Freelance_Lock); - - if (fdc==1) { // first call since init - return 0; - } else if (fdc==2 && !fgc) { // we're in good shape - if (cm_getLocalMountPointChange()) { // check for changes - cm_clearLocalMountPointChange(); // clear the changefile - lock_ReleaseMutex(&scp->mx); // this is re-locked in reInitLocalMountPoints - cm_reInitLocalMountPoints(); // start reinit - lock_ObtainMutex(&scp->mx); // now get the lock back - return 0; - } - return 1; // no change - } - return 0; - } -#endif - - if (scp->cbServerp != NULL) - return 1; - else - return 0; -} - -/* need to detect a broken callback that races with our obtaining a callback. - * Need to be able to do this even if we don't know the file ID of the file - * we're breaking the callback on at the time we start the acquisition of the - * callback (as in the case where we are creating a file). - * - * So, we start by writing down the count of the # of callbacks we've received - * so far, and bumping a global counter of the # of callback granting calls - * outstanding (all done under cm_callbackLock). - * - * When we're back from the call, we look at all of the callback revokes with - * counter numbers greater than the one we recorded in our caller's structure, - * and replay those that are higher than when we started the call. - * - * We free all the structures in the queue when the count of the # of outstanding - * callback-granting calls drops to zero. - * - * We call this function with the scp locked, too, but in its current implementation, - * this knowledge is not used. - */ -void cm_StartCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp) -{ - lock_ObtainWrite(&cm_callbackLock); - cbrp->callbackCount = cm_callbackCount; - cm_activeCallbackGrantingCalls++; - cbrp->startTime = osi_Time(); - cbrp->serverp = NULL; - lock_ReleaseWrite(&cm_callbackLock); -} - -/* Called at the end of a callback-granting call, to remove the callback - * info from the scache entry, if necessary. - * - * Called with scp locked, so we can discard the callbacks easily with - * this locking hierarchy. - */ -void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp, - AFSCallBack *cbp, long flags) -{ - cm_racingRevokes_t *revp; /* where we are */ - cm_racingRevokes_t *nrevp; /* where we'll be next */ - int freeFlag; - cm_server_t * serverp = 0; - int discardScp = 0; - - lock_ObtainWrite(&cm_callbackLock); - if (flags & CM_CALLBACK_MAINTAINCOUNT) { - osi_assert(cm_activeCallbackGrantingCalls > 0); - } - else { - osi_assert(cm_activeCallbackGrantingCalls-- > 0); - } - if (cm_activeCallbackGrantingCalls == 0) - freeFlag = 1; - else - freeFlag = 0; - - /* record the callback; we'll clear it below if we really lose it */ - if (cbrp) { - if (scp) { - if (scp->cbServerp != cbrp->serverp) { - serverp = scp->cbServerp; - if (!freeFlag) - cm_GetServer(cbrp->serverp); - scp->cbServerp = cbrp->serverp; - } else { - if (freeFlag) - serverp = cbrp->serverp; - } - scp->cbExpires = cbrp->startTime + cbp->ExpirationTime; - } else { - if (freeFlag) - serverp = cbrp->serverp; - } - if (freeFlag) - cbrp->serverp = NULL; - } - - /* a callback was actually revoked during our granting call, so - * run down the list of revoked fids, looking for ours. - * If activeCallbackGrantingCalls is zero, free the elements, too. - * - * May need to go through entire list just to do the freeing. - */ - for (revp = cm_racingRevokesp; revp; revp = nrevp) { - nrevp = (cm_racingRevokes_t *) osi_QNext(&revp->q); - /* if this callback came in later than when we started the - * callback-granting call, and if this fid is the right fid, - * then clear the callback. - */ - if (scp && cbrp && cbrp->callbackCount != cm_callbackCount - && revp->callbackCount > cbrp->callbackCount - && (( scp->fid.volume == revp->fid.volume && - scp->fid.vnode == revp->fid.vnode && - scp->fid.unique == revp->fid.unique) - || - ((revp->flags & CM_RACINGFLAG_CANCELVOL) && - scp->fid.volume == revp->fid.volume) - || - (revp->flags & CM_RACINGFLAG_CANCELALL))) { - /* this one matches */ - osi_Log4(afsd_logp, - "Racing revoke scp 0x%x old cbc %d rev cbc %d cur cbc %d", - scp, - cbrp->callbackCount, revp->callbackCount, - cm_callbackCount); - discardScp = 1; - } - if (freeFlag) - free(revp); - } - - /* if we freed the list, zap the pointer to it */ - if (freeFlag) - cm_racingRevokesp = NULL; - - lock_ReleaseWrite(&cm_callbackLock); - - if ( discardScp ) { - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); - cm_CallbackNotifyChange(scp); - lock_ObtainMutex(&scp->mx); - } - - if ( serverp ) { - lock_ObtainWrite(&cm_serverLock); - cm_FreeServer(serverp); - lock_ReleaseWrite(&cm_serverLock); - } -} - -/* if flags is 1, we want to force the code to make one call, anyway. - * called with locked scp; returns with same. - */ -long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp, - struct cm_req *reqp, long flags) -{ - long code; - cm_conn_t *connp; - AFSFetchStatus afsStatus; - AFSVolSync volSync; - AFSCallBack callback; - AFSFid tfid; - cm_callbackRequest_t cbr; - int mustCall; - long sflags; - cm_fid_t sfid; - struct rx_connection * callp; - - osi_Log4(afsd_logp, "GetCallback scp 0x%x cell %d vol %d flags %lX", - scp, scp->fid.cell, scp->fid.volume, flags); - -#ifdef AFS_FREELANCE_CLIENT - // The case where a callback is needed on /afs is handled - // specially. We need to fetch the status by calling - // cm_MergeStatus and mark that cm_fakeDirCallback is 2 - if (cm_freelanceEnabled) { - if (scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && - scp->fid.volume==AFS_FAKE_ROOT_VOL_ID && - scp->fid.unique==0x1 && - scp->fid.vnode==0x1) { - - // Start by indicating that we're in the process - // of fetching the callback - lock_ObtainMutex(&cm_Freelance_Lock); - osi_Log0(afsd_logp,"cm_getGetCallback fakeGettingCallback=1"); - cm_fakeGettingCallback = 1; - lock_ReleaseMutex(&cm_Freelance_Lock); - - // Fetch the status info - cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0); - - // Indicate that the callback is not done - lock_ObtainMutex(&cm_Freelance_Lock); - osi_Log0(afsd_logp,"cm_getGetCallback fakeDirCallback=2"); - cm_fakeDirCallback = 2; - - // Indicate that we're no longer fetching the callback - osi_Log0(afsd_logp,"cm_getGetCallback fakeGettingCallback=0"); - cm_fakeGettingCallback = 0; - lock_ReleaseMutex(&cm_Freelance_Lock); - - return 0; - } - - if (scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) { - osi_Log0(afsd_logp,"cm_getcallback should NEVER EVER get here... "); - } - } -#endif /* AFS_FREELANCE_CLIENT */ - - mustCall = (flags & 1); - cm_AFSFidFromFid(&tfid, &scp->fid); - while (1) { - if (!mustCall && cm_HaveCallback(scp)) { - osi_Log3(afsd_logp, "GetCallback Complete scp 0x%x cell %d vol %d", - scp, scp->fid.cell, scp->fid.volume); - return 0; - } - - /* turn off mustCall, since it has now forced us past the check above */ - mustCall = 0; - - /* otherwise, we have to make an RPC to get the status */ - sflags = CM_SCACHESYNC_FETCHSTATUS | CM_SCACHESYNC_GETCALLBACK; - cm_SyncOp(scp, NULL, NULL, NULL, 0, sflags); - cm_StartCallbackGrantingCall(scp, &cbr); - sfid = scp->fid; - lock_ReleaseMutex(&scp->mx); - - /* now make the RPC */ - osi_Log4(afsd_logp, "CALL FetchStatus scp 0x%x cell %d vol %d uniq %d", - (long) scp, scp->fid.cell, scp->fid.volume, scp->fid.unique); - do { - code = cm_Conn(&sfid, userp, reqp, &connp); - if (code) - continue; - - callp = cm_GetRxConn(connp); - code = RXAFS_FetchStatus(callp, &tfid, - &afsStatus, &callback, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, &sfid, &volSync, NULL, - &cbr, code)); - code = cm_MapRPCError(code, reqp); - if (code) - osi_Log4(afsd_logp, "CALL FetchStatus FAILURE code 0x%x scp 0x%x cell %d vol %d", - code, (long) scp, scp->fid.cell, scp->fid.volume); - else - osi_Log4(afsd_logp, "CALL FetchStatus SUCCESS scp 0x%x cell %d vol %d uniq %d", - (long) scp, scp->fid.cell, scp->fid.volume, scp->fid.unique); - - lock_ObtainMutex(&scp->mx); - if (code == 0) { - cm_EndCallbackGrantingCall(scp, &cbr, &callback, 0); - cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0); - } else { - cm_EndCallbackGrantingCall(NULL, &cbr, NULL, 0); - } - cm_SyncOpDone(scp, NULL, sflags); - - /* now check to see if we got an error */ - if (code) { - osi_Log4(afsd_logp, "GetCallback Failed code 0x%x scp 0x%x cell %d vol %d", - code, scp, scp->fid.cell, scp->fid.volume); - return code; - } - } -} - -/* called periodically by cm_daemon to shut down use of expired callbacks */ -void cm_CheckCBExpiration(void) -{ - int i; - cm_scache_t *scp; - unsigned long now; - - osi_Log0(afsd_logp, "CheckCBExpiration"); - - now = osi_Time(); - lock_ObtainWrite(&cm_scacheLock); - for (i=0; inextp) { - cm_HoldSCacheNoLock(scp); - if (scp->cbExpires > 0 && (scp->cbServerp == NULL || now > scp->cbExpires)) { - lock_ReleaseWrite(&cm_scacheLock); - osi_Log4(afsd_logp, "Callback Expiration Discarding SCache scp 0x%x vol %u vn %u uniq %u", - scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique); - lock_ObtainMutex(&scp->mx); - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); - cm_CallbackNotifyChange(scp); - lock_ObtainWrite(&cm_scacheLock); - } - cm_ReleaseSCacheNoLock(scp); - } - } - lock_ReleaseWrite(&cm_scacheLock); - - osi_Log0(afsd_logp, "CheckCBExpiration Complete"); -} - diff --git a/src/WINNT/afsd/cm_callback.h b/src/WINNT/afsd/cm_callback.h deleted file mode 100644 index e3e13a0e5..000000000 --- a/src/WINNT/afsd/cm_callback.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _CM_CALLBACK_H_ENV__ -#define _CM_CALLBACK_H_ENV__ 1 - -#include - -typedef struct cm_callbackRequest { - long callbackCount; /* callback count at start of the request */ - unsigned long startTime; /* time when we started the call */ - struct cm_server *serverp; /* server we really got the callback from */ -} cm_callbackRequest_t; - -#include "cm_scache.h" - -typedef struct cm_racingRevokes { - osi_queue_t q; /* queue for forward/backward searches */ - cm_fid_t fid; /* fid revoked */ - long callbackCount; /* which callback this is */ - long flags; -} cm_racingRevokes_t; - -/* flags for cm_racingRevokes_t flags field */ -#define CM_RACINGFLAG_CANCELALL 1 /* cancels all racing callback grants */ -#define CM_RACINGFLAG_CANCELVOL 2 /* cancels all this volume */ -/* and one representing the union of all cancel descrs */ -#define CM_RACINGFLAG_ALL (CM_RACINGFLAG_CANCELALL | CM_RACINGFLAG_CANCELVOL) - -/* flag for calls to functions in this package */ -#define CM_CALLBACK_MAINTAINCOUNT 1 /* don't decrement count of - * callback-granting calls. - */ - -/* Combinations of change notification filters to make sure callback loss - * gets noticed - */ -#define FILE_NOTIFY_GENERIC_DIRECTORY_FILTER \ - (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME) -#define FILE_NOTIFY_GENERIC_FILE_FILTER \ - (FILE_NOTIFY_CHANGE_ATTRIBUTES \ - | FILE_NOTIFY_CHANGE_SIZE \ - | FILE_NOTIFY_CHANGE_LAST_WRITE \ - | FILE_NOTIFY_CHANGE_LAST_ACCESS \ - | FILE_NOTIFY_CHANGE_CREATION) - -extern void cm_InitCallback(void); - -extern int cm_HaveCallback(struct cm_scache *); - -extern void cm_StartCallbackGrantingCall(struct cm_scache *, cm_callbackRequest_t *); - -extern void cm_EndCallbackGrantingCall(struct cm_scache *, cm_callbackRequest_t *, - struct AFSCallBack *, long); - -extern long cm_GetCallback(struct cm_scache *, struct cm_user *, - struct cm_req * reqp, long flags); - -extern void cm_CheckCBExpiration(void); - -extern osi_rwlock_t cm_callbackLock; - -extern void cm_CallbackNotifyChange(cm_scache_t *scp); - -#endif /* _CM_CALLBACK_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c deleted file mode 100644 index 58a9acb09..000000000 --- a/src/WINNT/afsd/cm_cell.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#include -#endif /* !DJGPP */ -#include -#include -#include -#include -#include - -#include "afsd.h" - -osi_rwlock_t cm_cellLock; - -/* function called as callback proc from cm_SearchCellFile. Return 0 to - * continue processing. - */ -long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep) -{ - cm_server_t *tsp; - cm_serverRef_t *tsrp; - cm_cell_t *cellp; - - cellp = rockp; - - /* if this server was previously created by fs setserverprefs */ - if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB)) - { - if ( !tsp->cellp ) - tsp->cellp = cellp; - } - else - tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp); - - /* Insert the vlserver into a sorted list, sorted by server rank */ - tsrp = cm_NewServerRef(tsp); - cm_InsertServerList(&cellp->vlServersp, tsrp); - /* drop the allocation reference */ - lock_ObtainWrite(&cm_serverLock); - tsrp->refCount--; - lock_ReleaseWrite(&cm_serverLock); - return 0; -} - -/* if it's from DNS, see if it has expired - * and check to make sure we have a valid set of volume servers - * this function must be called with a Write Lock on cm_cellLock - */ -cm_cell_t *cm_UpdateCell(cm_cell_t * cp) -{ - long code; - - if (cp == NULL) - return NULL; - - if ((cp->vlServersp == NULL -#ifdef AFS_FREELANCE_CLIENT - && !(cp->flags & CM_CELLFLAG_FREELANCE) -#endif - ) -#ifdef AFS_AFSDB_ENV - || (cm_dnsEnabled && (cp->flags & CM_CELLFLAG_DNS) && - ((cp->flags & CM_CELLFLAG_VLSERVER_INVALID) || (time(0) > cp->timeout))) -#endif - ) { - /* must empty cp->vlServersp */ - if (cp->vlServersp) { - cm_FreeServerList(&cp->vlServersp); - cp->vlServersp = NULL; - } - - code = cm_SearchCellFile(cp->name, NULL, cm_AddCellProc, cp); - if (code) { -#ifdef AFS_AFSDB_ENV - if (cm_dnsEnabled) { - int ttl; - - code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, cp); - if (code == 0) { /* got cell from DNS */ - cp->flags |= CM_CELLFLAG_DNS; - cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; -#ifdef DEBUG - fprintf(stderr, "cell %s: ttl=%d\n", cp->name, ttl); -#endif - } else { - /* if we fail to find it this time, we'll just do nothing and leave the - * current entry alone - */ - cp->flags |= CM_CELLFLAG_VLSERVER_INVALID; - cp = NULL; /* return NULL to indicate failure */ - } - } else -#endif /* AFS_AFSDB_ENV */ - { - cp = NULL; /* return NULL to indicate failure */ - } - } - } - - return cp; -} - -/* load up a cell structure from the cell database, afsdcell.ini */ -cm_cell_t *cm_GetCell(char *namep, long flags) -{ - return cm_GetCell_Gen(namep, NULL, flags); -} - -cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags) -{ - cm_cell_t *cp; - long code; - char fullname[200]=""; - - if (!strcmp(namep,SMB_IOCTL_FILENAME_NOSLASH)) - return NULL; - - lock_ObtainWrite(&cm_cellLock); - for (cp = cm_data.allCellsp; cp; cp=cp->nextp) { - if (strcmp(namep, cp->name) == 0) { - strcpy(fullname, cp->name); - break; - } - } - - if (cp) { - cp = cm_UpdateCell(cp); - } else if (flags & CM_FLAG_CREATE) { - if ( cm_data.currentCells >= cm_data.maxCells ) - osi_panic("Exceeded Max Cells", __FILE__, __LINE__); - - /* don't increment currentCells until we know that we - * are going to keep this entry - */ - cp = &cm_data.cellBaseAddress[cm_data.currentCells]; - memset(cp, 0, sizeof(cm_cell_t)); - cp->magic = CM_CELL_MAGIC; - - code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp); - if (code) { - osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellFile(%s) returns code= %d fullname= %s", - osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname)); - -#ifdef AFS_AFSDB_ENV - if (cm_dnsEnabled) { - int ttl; - - code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp); - if ( code ) { - osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s", - osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname)); - cp = NULL; - goto done; - } else { /* got cell from DNS */ - cp->flags |= CM_CELLFLAG_DNS; - cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; - cp->timeout = time(0) + ttl; - } - } else -#endif - { - cp = NULL; - goto done; - } - } - - /* randomise among those vlservers having the same rank*/ - cm_RandomizeServer(&cp->vlServersp); - - /* otherwise we found the cell, and so we're nearly done */ - lock_InitializeMutex(&cp->mx, "cm_cell_t mutex"); - - /* copy in name */ - strncpy(cp->name, fullname, CELL_MAXNAMELEN); - cp->name[CELL_MAXNAMELEN-1] = '\0'; - - /* thread on global list */ - cp->nextp = cm_data.allCellsp; - cm_data.allCellsp = cp; - - /* the cellID cannot be 0 */ - cp->cellID = ++cm_data.currentCells; - } - - done: - /* fullname is not valid if cp == NULL */ - if (cp && newnamep) - strcpy(newnamep, fullname); - - lock_ReleaseWrite(&cm_cellLock); - return cp; -} - -cm_cell_t *cm_FindCellByID(long cellID) -{ - cm_cell_t *cp; - int ttl; - int code; - - lock_ObtainWrite(&cm_cellLock); - for (cp = cm_data.allCellsp; cp; cp=cp->nextp) { - if (cellID == cp->cellID) - break; - } - - if (cp) - cp = cm_UpdateCell(cp); - - lock_ReleaseWrite(&cm_cellLock); - return cp; -} - -long -cm_ValidateCell(void) -{ - cm_cell_t * cellp; - afs_uint32 count; - - for (cellp = cm_data.allCellsp, count = 0; cellp; cellp=cellp->nextp, count++) { - if ( cellp->magic != CM_CELL_MAGIC ) { - afsi_log("cm_ValidateCell failure: cellp->magic != CM_CELL_MAGIC"); - fprintf(stderr, "cm_ValidateCell failure: cellp->magic != CM_CELL_MAGIC\n"); - return -1; - } - if ( count != 0 && cellp == cm_data.allCellsp || - count > cm_data.maxCells ) { - afsi_log("cm_ValidateCell failure: cm_data.allCellsp infinite loop"); - fprintf(stderr, "cm_ValidateCell failure: cm_data.allCellsp infinite loop\n"); - return -2; - } - } - - if ( count != cm_data.currentCells ) { - afsi_log("cm_ValidateCell failure: count != cm_data.currentCells"); - fprintf(stderr, "cm_ValidateCell failure: count != cm_data.currentCells\n"); - return -3; - } - - return 0; -} - - -long -cm_ShutdownCell(void) -{ - cm_cell_t * cellp; - - for (cellp = cm_data.allCellsp; cellp; cellp=cellp->nextp) - lock_FinalizeMutex(&cellp->mx); - - return 0; -} - - -void cm_InitCell(int newFile, long maxCells) -{ - static osi_once_t once; - - if (osi_Once(&once)) { - cm_cell_t * cellp; - - lock_InitializeRWLock(&cm_cellLock, "cell global lock"); - - if ( newFile ) { - cm_data.allCellsp = NULL; - cm_data.currentCells = 0; - cm_data.maxCells = maxCells; - -#ifdef AFS_FREELANCE_CLIENT - /* Generate a dummy entry for the Freelance cell whether or not - * freelance mode is being used in this session - */ - - cellp = &cm_data.cellBaseAddress[cm_data.currentCells++]; - memset(cellp, 0, sizeof(cm_cell_t)); - cellp->magic = CM_CELL_MAGIC; - - lock_InitializeMutex(&cellp->mx, "cm_cell_t mutex"); - - /* copy in name */ - strncpy(cellp->name, "Freelance.Local.Cell", CELL_MAXNAMELEN); /*safe*/ - - /* thread on global list */ - cellp->nextp = cm_data.allCellsp; - cm_data.allCellsp = cellp; - - cellp->cellID = AFS_FAKE_ROOT_CELL_ID; - cellp->vlServersp = NULL; - cellp->flags = CM_CELLFLAG_FREELANCE; -#endif - } else { - for (cellp = cm_data.allCellsp; cellp; cellp=cellp->nextp) { - lock_InitializeMutex(&cellp->mx, "cm_cell_t mutex"); - cellp->vlServersp = NULL; - } - } - - osi_EndOnce(&once); - } -} - -void cm_ChangeRankCellVLServer(cm_server_t *tsp) -{ - cm_cell_t *cp; - int code; - - cp = tsp->cellp; /* cell that this vlserver belongs to */ - osi_assert(cp); - - lock_ObtainMutex(&cp->mx); - code = cm_ChangeRankServer(&cp->vlServersp, tsp); - - if ( !code ) /* if the server list was rearranged */ - cm_RandomizeServer(&cp->vlServersp); - - lock_ReleaseMutex(&cp->mx); -} - diff --git a/src/WINNT/afsd/cm_cell.h b/src/WINNT/afsd/cm_cell.h deleted file mode 100644 index 7c949b54f..000000000 --- a/src/WINNT/afsd/cm_cell.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CELL_H_ENV_ -#define __CELL_H_ENV_ 1 - -#include "cm_server.h" - -#define CELL_MAXNAMELEN 256 - -#define CM_CELL_MAGIC ('C' | 'E' <<8 | 'L'<<16 | 'L'<<24) - -/* a cell structure */ -typedef struct cm_cell { - afs_uint32 magic; - long cellID; /* cell ID */ - struct cm_cell *nextp; /* locked by cm_cellLock */ - char name[CELL_MAXNAMELEN]; /* cell name; never changes */ - cm_serverRef_t *vlServersp; /* locked by cm_serverLock */ - osi_mutex_t mx; /* mutex locking fields (flags) */ - long flags; /* locked by mx */ - time_t timeout; /* if dns, time at which the server addrs expire */ -} cm_cell_t; - -/* These are bit flag values */ -#define CM_CELLFLAG_SUID 1 /* setuid flag; not yet used */ -#define CM_CELLFLAG_DNS 2 /* cell servers are from DNS */ -#define CM_CELLFLAG_VLSERVER_INVALID 4 /* cell servers are invalid */ -#define CM_CELLFLAG_FREELANCE 8 /* local freelance fake cell */ - -extern void cm_InitCell(int newFile, long maxCells); - -extern long cm_ShutdownCell(void); - -extern long cm_ValidateCell(void); - -extern cm_cell_t *cm_GetCell(char *namep, long flags); - -extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags); - -extern cm_cell_t *cm_FindCellByID(long cellID); - -extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); - -extern osi_rwlock_t cm_cellLock; - -extern cm_cell_t *cm_allCellsp; - -#endif /* __CELL_H_ENV_ */ diff --git a/src/WINNT/afsd/cm_config.c b/src/WINNT/afsd/cm_config.c deleted file mode 100644 index 25672c5a7..000000000 --- a/src/WINNT/afsd/cm_config.c +++ /dev/null @@ -1,763 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include -#include - -#ifndef DJGPP -#include -#include -#else -#include -#include -#endif /* !DJGPP */ -#include -#include -#include - -#include "afsd.h" -#include -#include -#ifdef AFS_AFSDB_ENV -#include "cm_dns.h" -#include -#endif - -/* TODO: these should be pulled in from dirpath.h */ -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) -#define AFS_THISCELL "ThisCell" -#endif -#define AFS_CELLSERVDB_UNIX "CellServDB" -#define AFS_CELLSERVDB_NT "afsdcell.ini" -#ifndef AFSDIR_CLIENT_ETC_DIRPATH -#define AFSDIR_CLIENT_ETC_DIRPATH "c:/afs" -#endif -#if defined(DJGPP) || defined(AFS_WIN95_ENV) -#define AFS_CELLSERVDB AFS_CELLSERVDB_UNIX -#ifdef DJGPP -extern char cm_confDir[]; -extern int errno; -#endif /* DJGPP */ -#else -#define AFS_CELLSERVDB AFS_CELLSERVDB_UNIX -#endif /* DJGPP || WIN95 */ - -static DWORD TraceOption = 0; - -/* This really needs to be initialized at DLL Init */ -#define TRACE_OPTION_EVENT 4 - -#define ISCONFIGTRACE(v) ( ((v) & TRACE_OPTION_EVENT)==TRACE_OPTION_EVENT) - -void DebugEvent0_local(char *a) -{ - HANDLE h; char *ptbuf[1]; - if (!ISCONFIGTRACE(TraceOption)) - return; - h = RegisterEventSource(NULL, a); - ptbuf[0] = a; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL); - DeregisterEventSource(h); -} - -#define MAXBUF_ 512 - -void DebugEvent_local(char *a,char *b,...) -{ - HANDLE h; char *ptbuf[1],buf[MAXBUF_+1]; - va_list marker; - if (!ISCONFIGTRACE(TraceOption)) - return; - h = RegisterEventSource(NULL, a); - va_start(marker,b); - _vsnprintf(buf,MAXBUF_,b,marker); - ptbuf[0] = buf; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL);\ - DeregisterEventSource(h); - va_end(marker); -} - -#define REG_CLIENT_PARMS_KEY TEXT("SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters") -#define REG_CLIENT_TRACE_OPTION_PARM TEXT("TraceOption") - -#ifdef COMMENT -BOOL WINAPI DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) -{ - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: { - DWORD LSPtype, LSPsize; - HKEY NPKey; - - (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &NPKey); - LSPsize=sizeof(TraceOption); - RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL, - &LSPtype, (LPBYTE)&TraceOption, &LSPsize); - - RegCloseKey (NPKey); - break; - } - - case DLL_THREAD_ATTACH: - break; - - case DLL_THREAD_DETACH: - break; - - case DLL_PROCESS_DETACH: - break; - - default: - return FALSE; - } - - return TRUE; // successful DLL_PROCESS_ATTACH -} -#endif /* COMMENT */ - -static long cm_ParsePair(char *lineBufferp, char *leftp, char *rightp) -{ - char *tp; - char tc; - int sawEquals; - int sawBracket; - - sawEquals = 0; - sawBracket = 0; - for(tp = lineBufferp; *tp; tp++) { - tc = *tp; - - if (sawBracket) { - if (tc == ']') - sawBracket = 0; - continue; - } - - /* comment or line end */ - if (tc == '#' || tc == '\r' || tc == '\n') - break; - - /* square bracket comment -- look for closing delim */ - if (tc == '[') { - sawBracket = 1; - continue; - } - - /* space or tab */ - if (tc == ' ' || tc == '\t') - continue; - - if (tc == '=') { - sawEquals = 1; - continue; - } - - /* now we have a real character, put it in the appropriate bucket */ - if (sawEquals == 0) { - *leftp++ = tc; - } - else { - *rightp++ = tc; - } - } - - /* null terminate the strings */ - *leftp = 0; - *rightp = 0; - - return 0; /* and return success */ -} - -/* search for a cell, and either return an error code if we don't find it, - * or return 0 if we do, in which case we also fill in the addresses in - * the cellp field. - * - * new feature: we can handle abbreviations and are insensitive to case. - * If the caller wants the "real" cell name, it puts a non-null pointer in - * newCellNamep. Anomaly: if cellNamep is ambiguous, we may modify - * newCellNamep but return an error code. - */ -long cm_SearchCellFile(char *cellNamep, char *newCellNamep, - cm_configProc_t *procp, void *rockp) -{ - char wdir[257]; - FILE *tfilep = NULL, *bestp, *tempp; - char *tp; - char lineBuffer[257]; - struct hostent *thp; - char *valuep; - struct sockaddr_in vlSockAddr; - int inRightCell; - int foundCell = 0; - long code; - int tracking = 1, partial = 0; -#if defined(DJGPP) || defined(AFS_WIN95_ENV) - char *afsconf_path; -#endif - - cm_GetCellServDB(wdir); - tfilep = fopen(wdir, "r"); - -#if defined(DJGPP) || defined(AFS_WIN95_ENV) - if (!tfilep) { - /* If we are using DJGPP client, cellservdb will be in afsconf dir. */ - /* If we are in Win95 here, we are linking with klog etc. and are - using DJGPP client even though DJGPP is not defined. So we still - need to check AFSCONF for location. */ - afsconf_path = getenv("AFSCONF"); - if (!afsconf_path) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - else - strcpy(wdir, afsconf_path); - strcat(wdir, "/"); - strcat(wdir, AFS_CELLSERVDB); - /*fprintf(stderr, "opening cellservdb file %s\n", wdir);*/ - tfilep = fopen(wdir, "r"); - if (!tfilep) return -2; - } -#else - /* If we are NT or higher, we don't do DJGPP, So just fail */ - if ( !tfilep ) - return -2; -#endif - - bestp = fopen(wdir, "r"); - -#ifdef DEBUG - DebugEvent_local("AFS- cm_searchfile fopen", "Handle[%x], wdir[%s]", bestp, wdir); -#endif - - /* have we seen the cell line for the guy we're looking for? */ - inRightCell = 0; - while (1) { - tp = fgets(lineBuffer, sizeof(lineBuffer), tfilep); - if (tracking) - (void) fgets(lineBuffer, sizeof(lineBuffer), bestp); - if (tp == NULL) { - if (feof(tfilep)) { - /* hit EOF */ - if (partial) { - /* - * found partial match earlier; - * now go back to it - */ - tempp = bestp; - bestp = tfilep; - tfilep = tempp; - inRightCell = 1; - partial = 0; - continue; - } - else { - fclose(tfilep); - fclose(bestp); - return (foundCell? 0 : -3); - } - } - } - - /* turn trailing cr or lf into null */ - tp = strchr(lineBuffer, '\r'); - if (tp) *tp = 0; - tp = strchr(lineBuffer, '\n'); - if (tp) *tp = 0; - - /* skip blank lines */ - if (lineBuffer[0] == 0) continue; - - if (lineBuffer[0] == '>') { - /* trim off at white space or '#' chars */ - tp = strchr(lineBuffer, ' '); - if (tp) *tp = 0; - tp = strchr(lineBuffer, '\t'); - if (tp) *tp = 0; - tp = strchr(lineBuffer, '#'); - if (tp) *tp = 0; - - /* now see if this is the right cell */ - if (stricmp(lineBuffer+1, cellNamep) == 0) { - /* found the cell we're looking for */ - if (newCellNamep) - strcpy(newCellNamep, lineBuffer+1); - inRightCell = 1; - tracking = 0; -#ifdef DEBUG - DebugEvent_local("AFS- cm_searchfile is cell", "inRightCell[%x], linebuffer[%s]", - inRightCell, lineBuffer); -#endif - } - else if (strnicmp(lineBuffer+1, cellNamep, - strlen(cellNamep)) == 0) { - /* partial match */ - if (partial) { /* ambiguous */ - fclose(tfilep); - fclose(bestp); - return -5; - } - if (newCellNamep) - strcpy(newCellNamep, lineBuffer+1); - inRightCell = 0; - tracking = 0; - partial = 1; - } - else inRightCell = 0; - } - else { -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - valuep = strchr(lineBuffer, '#'); - if (valuep == NULL) { - fclose(tfilep); - fclose(bestp); - return -4; - } - valuep++; /* skip the "#" */ - - valuep += strspn(valuep, " \t"); /* skip SP & TAB */ - /* strip spaces and tabs in the end. They should not be there according to CellServDB format - so do this just in case */ - while (valuep[strlen(valuep) - 1] == ' ' || valuep[strlen(valuep) - 1] == '\t') - valuep[strlen(valuep) - 1] = '\0'; - -#endif /* !DJGPP */ - if (inRightCell) { -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - /* add the server to the VLDB list */ - WSASetLastError(0); - thp = gethostbyname(valuep); -#ifdef DEBUG - { - int iErr = WSAGetLastError(); - DebugEvent_local("AFS- cm_searchfile inRightCell", - "thp[%x], valuep[%s], WSAGetLastError[%d]", - thp, valuep, iErr); - } -#endif - if (thp) { - memcpy(&vlSockAddr.sin_addr.s_addr, thp->h_addr, - sizeof(long)); - vlSockAddr.sin_family = AF_INET; - /* sin_port supplied by connection code */ - if (procp) - (*procp)(rockp, &vlSockAddr, valuep); - foundCell = 1; - } -#else - thp = 0; -#endif /* !DJGPP */ - if (!thp) { - long ip_addr; - int c1, c2, c3, c4; - char aname[241] = ""; - - /* Since there is no gethostbyname() data - * available we will read the IP address - * stored in the CellServDB file - */ - code = sscanf(lineBuffer, "%d.%d.%d.%d #%s", - &c1, &c2, &c3, &c4, aname); - tp = (char *) &ip_addr; - *tp++ = c1; - *tp++ = c2; - *tp++ = c3; - *tp++ = c4; - memcpy(&vlSockAddr.sin_addr.s_addr, &ip_addr, - sizeof(long)); - vlSockAddr.sin_family = AF_INET; - /* sin_port supplied by connection code */ - if (procp) - (*procp)(rockp, &vlSockAddr, valuep); - foundCell = 1; - } - } - } /* a vldb line */ - } /* while loop processing all lines */ - - /* if for some unknown reason cell is not found, return negative code (-11) ??? */ - return (foundCell) ? 0 : -11; -} - -long cm_SearchCellByDNS(char *cellNamep, char *newCellNamep, int *ttl, - cm_configProc_t *procp, void *rockp) -{ -#ifdef AFS_AFSDB_ENV - int rc; - int cellHostAddrs[AFSMAXCELLHOSTS]; - char cellHostNames[AFSMAXCELLHOSTS][MAXHOSTCHARS]; - int numServers; - int i; - struct sockaddr_in vlSockAddr; - -#ifdef DEBUG - DebugEvent_local("AFS SearchCellDNS-","Doing search for [%s]", cellNamep); -#endif - rc = getAFSServer(cellNamep, cellHostAddrs, cellHostNames, &numServers, ttl); - if (rc == 0 && numServers > 0) { /* found the cell */ - for (i = 0; i < numServers; i++) { - memcpy(&vlSockAddr.sin_addr.s_addr, &cellHostAddrs[i], - sizeof(long)); - vlSockAddr.sin_family = AF_INET; - /* sin_port supplied by connection code */ - if (procp) - (*procp)(rockp, &vlSockAddr, cellHostNames[i]); - if(newCellNamep) - strcpy(newCellNamep,cellNamep); - } - return 0; /* found cell */ - } - else - return -1; /* not found */ -#else - return -1; /* not found */ -#endif /* AFS_AFSDB_ENV */ -} - -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) -/* look up the CellServDBDir's name in the Registry - * or use the Client Dirpath value to produce a CellServDB - * filename - */ -long cm_GetCellServDB(char *cellNamep) -{ -#if !defined(DJGPP) - DWORD code, dummyLen; - HKEY parmKey; - int tlen; - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code != ERROR_SUCCESS) - goto dirpath; - - dummyLen = 256; - code = RegQueryValueEx(parmKey, "CellServDBDir", NULL, NULL, - cellNamep, &dummyLen); - RegCloseKey (parmKey); - - dirpath: - if (code != ERROR_SUCCESS || cellNamep[0] == 0) - strcpy(cellNamep, AFSDIR_CLIENT_ETC_DIRPATH); - - /* add trailing backslash, if required */ - tlen = strlen(cellNamep); - if (cellNamep[tlen-1] != '\\') - strcat(cellNamep, "\\"); -#else - strcpy(cellNamep, cm_confDir); - strcat(cellNamep,"/"); -#endif /* !DJGPP */ - - strcat(cellNamep, AFS_CELLSERVDB); - return 0; -} - -/* look up the root cell's name in the Registry */ -long cm_GetRootCellName(char *cellNamep) -{ - DWORD code, dummyLen; - HKEY parmKey; - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code != ERROR_SUCCESS) - return -1; - - dummyLen = 256; - code = RegQueryValueEx(parmKey, "Cell", NULL, NULL, - cellNamep, &dummyLen); - RegCloseKey (parmKey); - if (code != ERROR_SUCCESS || cellNamep[0] == 0) - return -1; - - return 0; -} -#else -/* look up the root cell's name in the THISCELL file */ -long cm_GetRootCellName(char *cellNamep) -{ - FILE *thisCell; - char thisCellPath[256]; - char *newline; - -#ifdef DJGPP - strcpy(thisCellPath, cm_confDir); -#else - /* Win 95 */ - char *afsconf_path; - afsconf_path = getenv("AFSCONF"); - if (!afsconf_path) - strcpy(thisCellPath, AFSDIR_CLIENT_ETC_DIRPATH); - else - strcpy(thisCellPath, afsconf_path); -#endif - strcat(thisCellPath,"/"); - - strcat(thisCellPath, AFS_THISCELL); - thisCell = fopen(thisCellPath, "r"); - if (thisCell == NULL) - return -1; - - fgets(cellNamep, 256, thisCell); - fclose(thisCell); - - newline = strrchr(cellNamep,'\n'); - if (newline) *newline = '\0'; - newline = strrchr(cellNamep,'\r'); - if (newline) *newline = '\0'; - - return 0; -} -#endif /* !DJGPP */ - -cm_configFile_t *cm_CommonOpen(char *namep, char *rwp) -{ - char wdir[256]; - long tlen; - FILE *tfilep; - -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - - /* add trailing backslash, if required */ - tlen = strlen(wdir); - if (wdir[tlen-1] != '\\') strcat(wdir, "\\"); -#else -#ifdef DJGPP - strcpy(wdir,cm_confDir); -#else - char *afsconf_path = getenv("AFSCONF"); - if (!afsconf_path) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - else - strcpy(wdir, afsconf_path); -#endif /* !DJGPP */ - strcat(wdir,"/"); -#endif /* DJGPP || WIN95 */ - - strcat(wdir, namep); - - tfilep = fopen(wdir, rwp); - - return ((cm_configFile_t *) tfilep); -} - -#ifndef DJGPP -long cm_WriteConfigString(char *labelp, char *valuep) -{ - DWORD code, dummyDisp; - HKEY parmKey; - - code = RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, "container", 0, KEY_SET_VALUE, NULL, - &parmKey, &dummyDisp); - if (code != ERROR_SUCCESS) - return -1; - - code = RegSetValueEx(parmKey, labelp, 0, REG_SZ, - valuep, strlen(valuep) + 1); - RegCloseKey (parmKey); - if (code != ERROR_SUCCESS) - return -1; - - return 0; -} -#endif /* !DJGPP */ - -#ifndef DJGPP -long cm_WriteConfigInt(char *labelp, long value) -{ - DWORD code, dummyDisp; - HKEY parmKey; - - code = RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, "container", 0, KEY_SET_VALUE, NULL, - &parmKey, &dummyDisp); - if (code != ERROR_SUCCESS) - return -1; - - code = RegSetValueEx(parmKey, labelp, 0, REG_DWORD, - (LPBYTE)&value, sizeof(value)); - RegCloseKey (parmKey); - if (code != ERROR_SUCCESS) - return -1; - - return 0; -} -#endif /* !DJGPP */ - -cm_configFile_t *cm_OpenCellFile(void) -{ - cm_configFile_t *cfp; - - cfp = cm_CommonOpen("afsdcel2.ini", "w"); - return cfp; -} - -long cm_AppendPrunedCellList(cm_configFile_t *ofp, char *cellNamep) -{ - cm_configFile_t *tfilep; /* input file */ - char *tp; - char lineBuffer[256]; - char *valuep; - int inRightCell; - int foundCell; - - tfilep = cm_CommonOpen(AFS_CELLSERVDB, "r"); - if (!tfilep) return -1; - - foundCell = 0; - - /* have we seen the cell line for the guy we're looking for? */ - inRightCell = 0; - while (1) { - tp = fgets(lineBuffer, sizeof(lineBuffer), (FILE *)tfilep); - if (tp == NULL) { - if (feof((FILE *)tfilep)) { - /* hit EOF */ - fclose((FILE *)tfilep); - return 0; - } - } - - /* turn trailing cr or lf into null */ - tp = strchr(lineBuffer, '\r'); - if (tp) *tp = 0; - tp = strchr(lineBuffer, '\n'); - if (tp) *tp = 0; - - /* skip blank lines */ - if (lineBuffer[0] == 0) { - fprintf((FILE *)ofp, "%s\n", lineBuffer); - continue; - } - - if (lineBuffer[0] == '>') { - /* trim off at white space or '#' chars */ - tp = strchr(lineBuffer, ' '); - if (tp) *tp = 0; - tp = strchr(lineBuffer, '\t'); - if (tp) *tp = 0; - tp = strchr(lineBuffer, '#'); - if (tp) *tp = 0; - - /* now see if this is the right cell */ - if (strcmp(lineBuffer+1, cellNamep) == 0) { - /* found the cell we're looking for */ - inRightCell = 1; - } - else { - inRightCell = 0; - fprintf((FILE *)ofp, "%s\n", lineBuffer); - } - } - else { - valuep = strchr(lineBuffer, '#'); - if (valuep == NULL) return -2; - valuep++; /* skip the "#" */ - if (!inRightCell) { - fprintf((FILE *)ofp, "%s\n", lineBuffer); - } - } /* a vldb line */ - } /* while loop processing all lines */ -} - -long cm_AppendNewCell(cm_configFile_t *filep, char *cellNamep) -{ - fprintf((FILE *)filep, ">%s\n", cellNamep); - return 0; -} - -long cm_AppendNewCellLine(cm_configFile_t *filep, char *linep) -{ - fprintf((FILE *)filep, "%s\n", linep); - return 0; -} - -long cm_CloseCellFile(cm_configFile_t *filep) -{ - char wdir[256]; - char sdir[256]; - long code; - long closeCode; - int tlen; -#ifdef AFS_WIN95_ENV - char *afsconf_path; -#endif - closeCode = fclose((FILE *)filep); - -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - - /* add trailing backslash, if required */ - tlen = strlen(wdir); - if (wdir[tlen-1] != '\\') strcat(wdir, "\\"); -#else -#ifdef DJGPP - strcpy(wdir,cm_confDir); -#else - afsconf_path = getenv("AFSCONF"); - if (!afsconf_path) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - else - strcpy(wdir, afsconf_path); -#endif /* !DJGPP */ - strcat(wdir,"/"); -#endif /* DJGPP || WIN95 */ - - strcpy(sdir, wdir); - - if (closeCode != 0) { - /* something went wrong, preserve original database */ - strcat(wdir, "afsdcel2.ini"); - unlink(wdir); - return closeCode; - } - - strcat(wdir, AFS_CELLSERVDB); - strcat(sdir, "afsdcel2.ini"); /* new file */ - - unlink(wdir); /* delete old file */ - - code = rename(sdir, wdir); /* do the rename */ - - if (code) - code = errno; - - return code; -} - -void cm_GetConfigDir(char *dir) -{ - char wdir[256]; - int tlen; -#ifdef AFS_WIN95_ENV - char *afsconf_path; -#endif - -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - - /* add trailing backslash, if required */ - tlen = strlen(wdir); - if (wdir[tlen-1] != '\\') strcat(wdir, "\\"); -#else -#ifdef DJGPP - strcpy(wdir,cm_confDir); -#else - afsconf_path = getenv("AFSCONF"); - if (!afsconf_path) - strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); - else - strcpy(wdir, afsconf_path); -#endif /* !DJGPP */ - strcat(wdir,"\\"); -#endif /* DJGPP || WIN95 */ - strcpy(dir, wdir); -} diff --git a/src/WINNT/afsd/cm_config.h b/src/WINNT/afsd/cm_config.h deleted file mode 100644 index 0cc0578b1..000000000 --- a/src/WINNT/afsd/cm_config.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CONFIG_H_ENV_ -#define __CONFIG_H_ENV_ 1 - -#define CM_CONFIGDEFAULT_CACHESIZE 98304 -#define CM_CONFIGDEFAULT_BLOCKSIZE 4096 -#define CM_CONFIGDEFAULT_STATS 10000 -#define CM_CONFIGDEFAULT_CHUNKSIZE 17 -#define CM_CONFIGDEFAULT_DAEMONS 2 -#define CM_CONFIGDEFAULT_SVTHREADS 25 -#define CM_CONFIGDEFAULT_TRACEBUFSIZE 5000 - -#ifndef __CM_CONFIG_INTERFACES_ONLY__ - -#include -#ifdef DJGPP -#include -#endif /* DJGPP */ - -typedef FILE cm_configFile_t; - -typedef long (cm_configProc_t)(void *rockp, struct sockaddr_in *addrp, char *namep); - -extern long cm_GetRootCellName(char *namep); - -extern long cm_SearchCellFile(char *cellNamep, char *newCellNamep, - cm_configProc_t *procp, void *rockp); - -extern long cm_SearchCellByDNS(char *cellNamep, char *newCellNamep, int *ttl, - cm_configProc_t *procp, void *rockp); - -extern long cm_WriteConfigString(char *labelp, char *valuep); - -extern long cm_WriteConfigInt(char *labelp, long value); - -extern cm_configFile_t *cm_OpenCellFile(void); - -extern long cm_AppendPrunedCellList(cm_configFile_t *filep, char *cellNamep); - -extern long cm_AppendNewCell(cm_configFile_t *filep, char *cellNamep); - -extern long cm_AppendNewCellLine(cm_configFile_t *filep, char *linep); - -extern long cm_CloseCellFile(cm_configFile_t *filep); - -extern long cm_GetCellServDB(char *cellNamep); - -extern void cm_GetConfigDir(char *dir); - -#endif /* __CM_CONFIG_INTERFACES_ONLY__ */ - -#endif /* __CONFIG_H_ENV_ */ diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c deleted file mode 100644 index 2a4080df8..000000000 --- a/src/WINNT/afsd/cm_conn.c +++ /dev/null @@ -1,652 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#endif /* !DJGPP */ -#include -#include -#include -#include -#ifndef DJGPP -#include -#else -#include -#endif - -#include "afsd.h" - -osi_rwlock_t cm_connLock; - -long RDRtimeout = CM_CONN_DEFAULTRDRTIMEOUT; -long ConnDeadtimeout = CM_CONN_CONNDEADTIME; -long HardDeadtimeout = CM_CONN_HARDDEADTIME; - -#define LANMAN_WKS_PARAM_KEY "SYSTEM\\CurrentControlSet\\Services\\lanmanworkstation\\parameters" -#define LANMAN_WKS_SESSION_TIMEOUT "SessTimeout" - -afs_int32 cryptall = 0; - -void cm_PutConn(cm_conn_t *connp) -{ - lock_ObtainWrite(&cm_connLock); - osi_assert(connp->refCount-- > 0); - lock_ReleaseWrite(&cm_connLock); -} - -void cm_InitConn(void) -{ - static osi_once_t once; - long code; - DWORD sessTimeout; - HKEY parmKey; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_connLock, "connection global lock"); - - /* keisa - read timeout value for lanmanworkstation service. - * jaltman - as per - * http://support.microsoft.com:80/support/kb/articles/Q102/0/67.asp&NoWebContent=1 - * the SessTimeout is a minimum timeout not a maximum timeout. Therefore, - * I believe that the default should not be short. Instead, we should wait until - * RX times out before reporting a timeout to the SMB client. - */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, LANMAN_WKS_PARAM_KEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) - { - DWORD dummyLen = sizeof(sessTimeout); - code = RegQueryValueEx(parmKey, LANMAN_WKS_SESSION_TIMEOUT, NULL, NULL, - (BYTE *) &sessTimeout, &dummyLen); - if (code == ERROR_SUCCESS) - { - afsi_log("lanmanworkstation : SessTimeout %d", sessTimeout); - RDRtimeout = sessTimeout; - if ( ConnDeadtimeout < RDRtimeout + 15 ) { - ConnDeadtimeout = RDRtimeout + 15; - afsi_log("ConnDeadTimeout increased to %d", ConnDeadtimeout); - } - if ( HardDeadtimeout < 2 * ConnDeadtimeout ) { - HardDeadtimeout = 2 * ConnDeadtimeout; - afsi_log("HardDeadTimeout increased to %d", HardDeadtimeout); - } - } - } - - osi_EndOnce(&once); - } -} - -void cm_InitReq(cm_req_t *reqp) -{ - memset((char *)reqp, 0, sizeof(cm_req_t)); -#ifndef DJGPP - reqp->startTime = GetCurrentTime(); -#else - gettimeofday(&reqp->startTime, NULL); -#endif -} - -static long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp, - struct cm_req *reqp, cm_serverRef_t ***serversppp) -{ - long code; - cm_volume_t *volp = NULL; - cm_cell_t *cellp = NULL; - - if (!fidp) { - *serversppp = NULL; - return 0; - } - - cellp = cm_FindCellByID(fidp->cell); - if (!cellp) return CM_ERROR_NOSUCHCELL; - - code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp); - if (code) return code; - - *serversppp = cm_GetVolServers(volp, fidp->volume); - - cm_PutVolume(volp); - return 0; -} - -/* - * Analyze the error return from an RPC. Determine whether or not to retry, - * and if we're going to retry, determine whether failover is appropriate, - * and whether timed backoff is appropriate. - * - * If the error code is from cm_Conn() or friends, it will be a CM_ERROR code. - * Otherwise it will be an RPC code. This may be a UNIX code (e.g. EDQUOT), or - * it may be an RX code, or it may be a special code (e.g. VNOVOL), or it may - * be a security code (e.g. RXKADEXPIRED). - * - * If the error code is from cm_Conn() or friends, connp will be NULL. - * - * For VLDB calls, fidp will be NULL. - * - * volSyncp and/or cbrp may also be NULL. - */ -int -cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, - struct cm_fid *fidp, - AFSVolSync *volSyncp, - cm_serverRef_t * serversp, - cm_callbackRequest_t *cbrp, long errorCode) -{ - cm_server_t *serverp = 0; - cm_serverRef_t **serverspp = 0; - cm_serverRef_t *tsrp; - cm_ucell_t *ucellp; - int retry = 0; - int free_svr_list = 0; - int dead_session; - long timeUsed, timeLeft; - - osi_Log2(afsd_logp, "cm_Analyze connp 0x%x, code 0x%x", - (long) connp, errorCode); - - /* no locking required, since connp->serverp never changes after - * creation */ - dead_session = (userp->cellInfop == NULL); - if (connp) - serverp = connp->serverp; - - /* Update callback pointer */ - if (cbrp && serverp && errorCode == 0) { - if (cbrp->serverp) { - if ( cbrp->serverp != serverp ) { - lock_ObtainWrite(&cm_serverLock); - cm_PutServerNoLock(cbrp->serverp); - cm_GetServerNoLock(serverp); - lock_ReleaseWrite(&cm_serverLock); - } - } else { - cm_GetServer(serverp); - } - lock_ObtainWrite(&cm_callbackLock); - cbrp->serverp = serverp; - lock_ReleaseWrite(&cm_callbackLock); - } - - /* If not allowed to retry, don't */ - if (reqp->flags & CM_REQ_NORETRY) - goto out; - - /* if timeout - check that it did not exceed the SMB timeout - * and retry */ - - /* timeleft - get if from reqp the same way as cmXonnByMServers does */ -#ifndef DJGPP - timeUsed = (GetCurrentTime() - reqp->startTime) / 1000; -#else - gettimeofday(&now, NULL); - timeUsed = sub_time(now, reqp->startTime) / 1000; -#endif - - /* leave 5 seconds margin for sleep */ - timeLeft = RDRtimeout - timeUsed; - - if (errorCode == CM_ERROR_TIMEDOUT) { - if (timeLeft > 5 ) { - thrd_Sleep(3000); - cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); - retry = 1; - } - } - - /* if there is nosuchvolume, then we have a situation in which a - * previously known volume no longer has a set of servers - * associated with it. Either the volume has moved or - * the volume has been deleted. Try to find a new server list - * until the timeout period expires. - */ - else if (errorCode == CM_ERROR_NOSUCHVOLUME) { - if (timeLeft > 7) { - osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_NOSUCHVOLUME."); - thrd_Sleep(5000); - - retry = 1; - - if (fidp != NULL) /* Not a VLDB call */ - cm_ForceUpdateVolume(fidp, userp, reqp); - } - } - - else if (errorCode == CM_ERROR_ALLOFFLINE) { - if (timeLeft > 7) { - osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLOFFLINE."); - thrd_Sleep(5000); - /* cm_ForceUpdateVolume marks all servers as non_busy */ - /* No it doesn't and it won't do anything if all of the - * the servers are marked as DOWN. So clear the DOWN - * flag and reset the busy state as well. - */ - if (!serversp) { - cm_GetServerList(fidp, userp, reqp, &serverspp); - serversp = *serverspp; - free_svr_list = 1; - } - if (serversp) { - lock_ObtainWrite(&cm_serverLock); - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { - tsrp->server->flags &= ~CM_SERVERFLAG_DOWN; - if (tsrp->status == busy) - tsrp->status = not_busy; - } - lock_ReleaseWrite(&cm_serverLock); - if (free_svr_list) { - cm_FreeServerList(&serversp); - *serverspp = serversp; - } - retry = 1; - } - - if (fidp != NULL) /* Not a VLDB call */ - cm_ForceUpdateVolume(fidp, userp, reqp); - } - } - - /* if all servers are busy, mark them non-busy and start over */ - else if (errorCode == CM_ERROR_ALLBUSY) { - if (timeLeft > 7) { - thrd_Sleep(5000); - if (!serversp) { - cm_GetServerList(fidp, userp, reqp, &serverspp); - serversp = *serverspp; - free_svr_list = 1; - } - lock_ObtainWrite(&cm_serverLock); - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { - if (tsrp->status == busy) - tsrp->status = not_busy; - } - lock_ReleaseWrite(&cm_serverLock); - if (free_svr_list) { - cm_FreeServerList(&serversp); - *serverspp = serversp; - } - retry = 1; - } - } - - /* special codes: VBUSY and VRESTARTING */ - else if (errorCode == VBUSY || errorCode == VRESTARTING) { - if (!serversp) { - cm_GetServerList(fidp, userp, reqp, &serverspp); - serversp = *serverspp; - free_svr_list = 1; - } - lock_ObtainWrite(&cm_serverLock); - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { - if (tsrp->server == serverp - && tsrp->status == not_busy) { - tsrp->status = busy; - break; - } - } - lock_ReleaseWrite(&cm_serverLock); - if (free_svr_list) { - cm_FreeServerList(&serversp); - *serverspp = serversp; - } - retry = 1; - } - - /* special codes: missing volumes */ - else if (errorCode == VNOVOL || errorCode == VMOVED || errorCode == VOFFLINE - || errorCode == VSALVAGE || errorCode == VNOSERVICE) - { - /* Log server being offline for this volume */ - osi_Log4(afsd_logp, "cm_Analyze found server %d.%d.%d.%d marked offline for a volume", - ((serverp->addr.sin_addr.s_addr & 0xff)), - ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8), - ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16), - ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24)); - /* Create Event Log message */ - { - HANDLE h; - char *ptbuf[1]; - char s[100]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "cm_Analyze: Server %d.%d.%d.%d reported volume %d as missing.", - ((serverp->addr.sin_addr.s_addr & 0xff)), - ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8), - ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16), - ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24), - fidp->volume); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1009, NULL, - 1, 0, ptbuf, NULL); - DeregisterEventSource(h); - } - - /* Mark server offline for this volume */ - if (!serversp) { - cm_GetServerList(fidp, userp, reqp, &serverspp); - serversp = *serverspp; - free_svr_list = 1; - } - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { - if (tsrp->server == serverp) - tsrp->status = offline; - } - if (free_svr_list) { - cm_FreeServerList(&serversp); - *serverspp = serversp; - } - if ( timeLeft > 2 ) - retry = 1; - } - - /* RX codes */ - else if (errorCode == RX_CALL_TIMEOUT) { - /* server took longer than hardDeadTime - * don't mark server as down but don't retry - * this is to prevent the SMB session from timing out - * In addition, we log an event to the event log - */ -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - char s[100]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "cm_Analyze: HardDeadTime exceeded."); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1009, NULL, - 1, 0, ptbuf, NULL); - DeregisterEventSource(h); -#endif /* !DJGPP */ - - retry = 0; - osi_Log0(afsd_logp, "cm_Analyze: hardDeadTime exceeded"); - } - else if (errorCode >= -64 && errorCode < 0) { - /* mark server as down */ - lock_ObtainMutex(&serverp->mx); - serverp->flags |= CM_SERVERFLAG_DOWN; - lock_ReleaseMutex(&serverp->mx); - if ( timeLeft > 2 ) - retry = 1; - } - else if (errorCode == RXKADEXPIRED) { - if (!dead_session) { - lock_ObtainMutex(&userp->mx); - ucellp = cm_GetUCell(userp, serverp->cellp); - if (ucellp->ticketp) { - free(ucellp->ticketp); - ucellp->ticketp = NULL; - } - ucellp->flags &= ~CM_UCELLFLAG_RXKAD; - ucellp->gen++; - lock_ReleaseMutex(&userp->mx); - if ( timeLeft > 2 ) - retry = 1; - } - } else { - if (errorCode) - osi_Log1(afsd_logp, "cm_Analyze: ignoring error code 0x%x", errorCode); - } - - if (retry && dead_session) - retry = 0; - - out: - /* drop this on the way out */ - if (connp) - cm_PutConn(connp); - - /* retry until we fail to find a connection */ - return retry; -} - -long cm_ConnByMServers(cm_serverRef_t *serversp, cm_user_t *usersp, - cm_req_t *reqp, cm_conn_t **connpp) -{ - long code; - cm_serverRef_t *tsrp; - cm_server_t *tsp; - long firstError = 0; - int someBusy = 0, someOffline = 0, allBusy = 1, allDown = 1; - long timeUsed, timeLeft, hardTimeLeft; -#ifdef DJGPP - struct timeval now; -#endif /* DJGPP */ - - *connpp = NULL; - -#ifndef DJGPP - timeUsed = (GetCurrentTime() - reqp->startTime) / 1000; -#else - gettimeofday(&now, NULL); - timeUsed = sub_time(now, reqp->startTime) / 1000; -#endif - - /* leave 5 seconds margin of safety */ - timeLeft = ConnDeadtimeout - timeUsed - 5; - hardTimeLeft = HardDeadtimeout - timeUsed - 5; - - lock_ObtainWrite(&cm_serverLock); - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { - tsp = tsrp->server; - cm_GetServerNoLock(tsp); - lock_ReleaseWrite(&cm_serverLock); - if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { - if (tsrp->status == busy) { - allDown = 0; - someBusy = 1; - } else if (tsrp->status == offline) { - someOffline = 1; - } else { - allDown = 0; - allBusy = 0; - code = cm_ConnByServer(tsp, usersp, connpp); - if (code == 0) { /* cm_CBS only returns 0 */ - cm_PutServer(tsp); - /* Set RPC timeout */ - if (timeLeft > ConnDeadtimeout) - timeLeft = ConnDeadtimeout; - - if (hardTimeLeft > HardDeadtimeout) - hardTimeLeft = HardDeadtimeout; - - lock_ObtainMutex(&(*connpp)->mx); - rx_SetConnDeadTime((*connpp)->callp, timeLeft); - rx_SetConnHardDeadTime((*connpp)->callp, (u_short) hardTimeLeft); - lock_ReleaseMutex(&(*connpp)->mx); - return 0; - } - - /* therefore, this code is never executed */ - if (firstError == 0) - firstError = code; - } - } - lock_ObtainWrite(&cm_serverLock); - cm_PutServerNoLock(tsp); - } - - lock_ReleaseWrite(&cm_serverLock); - if (firstError == 0) { - if (serversp == NULL) - firstError = CM_ERROR_NOSUCHVOLUME; - else if (allDown) - firstError = CM_ERROR_ALLOFFLINE; - else if (allBusy) - firstError = CM_ERROR_ALLBUSY; - else { - osi_Log0(afsd_logp, "cm_ConnByMServers returning impossible error TIMEDOUT"); - firstError = CM_ERROR_TIMEDOUT; - } - } - - osi_Log1(afsd_logp, "cm_ConnByMServers returning 0x%x", firstError); - return firstError; -} - -/* called with a held server to GC all bad connections hanging off of the server */ -void cm_GCConnections(cm_server_t *serverp) -{ - cm_conn_t *tcp; - cm_conn_t **lcpp; - cm_user_t *userp; - - lock_ObtainWrite(&cm_connLock); - lcpp = &serverp->connsp; - for (tcp = *lcpp; tcp; tcp = *lcpp) { - userp = tcp->userp; - if (userp && tcp->refCount == 0 && (userp->vcRefs == 0)) { - /* do the deletion of this guy */ - cm_PutServer(tcp->serverp); - cm_ReleaseUser(userp); - *lcpp = tcp->nextp; - rx_DestroyConnection(tcp->callp); - lock_FinalizeMutex(&tcp->mx); - free(tcp); - } - else { - /* just advance to the next */ - lcpp = &tcp->nextp; - } - } - lock_ReleaseWrite(&cm_connLock); -} - -static void cm_NewRXConnection(cm_conn_t *tcp, cm_ucell_t *ucellp, - cm_server_t *serverp) -{ - unsigned short port; - int serviceID; - int secIndex; - struct rx_securityClass *secObjp; - - if (serverp->type == CM_SERVER_VLDB) { - port = htons(7003); - serviceID = 52; - } - else { - osi_assert(serverp->type == CM_SERVER_FILE); - port = htons(7000); - serviceID = 1; - } - if (ucellp->flags & CM_UCELLFLAG_RXKAD) { - secIndex = 2; - if (cryptall) { - tcp->cryptlevel = rxkad_crypt; - } else { - tcp->cryptlevel = rxkad_clear; - } - secObjp = rxkad_NewClientSecurityObject(tcp->cryptlevel, - &ucellp->sessionKey, ucellp->kvno, - ucellp->ticketLen, ucellp->ticketp); - } else { - /* normal auth */ - secIndex = 0; - tcp->cryptlevel = rxkad_clear; - secObjp = rxnull_NewClientSecurityObject(); - } - osi_assert(secObjp != NULL); - tcp->callp = rx_NewConnection(serverp->addr.sin_addr.s_addr, - port, - serviceID, - secObjp, - secIndex); - rx_SetConnDeadTime(tcp->callp, ConnDeadtimeout); - rx_SetConnHardDeadTime(tcp->callp, HardDeadtimeout); - tcp->ucgen = ucellp->gen; - if (secObjp) - rxs_Release(secObjp); /* Decrement the initial refCount */ -} - -long cm_ConnByServer(cm_server_t *serverp, cm_user_t *userp, cm_conn_t **connpp) -{ - cm_conn_t *tcp; - cm_ucell_t *ucellp; - - lock_ObtainMutex(&userp->mx); - lock_ObtainWrite(&cm_connLock); - for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) { - if (tcp->userp == userp) - break; - } - - /* find ucell structure */ - ucellp = cm_GetUCell(userp, serverp->cellp); - if (!tcp) { - cm_GetServer(serverp); - tcp = malloc(sizeof(*tcp)); - memset(tcp, 0, sizeof(*tcp)); - tcp->nextp = serverp->connsp; - serverp->connsp = tcp; - cm_HoldUser(userp); - tcp->userp = userp; - lock_InitializeMutex(&tcp->mx, "cm_conn_t mutex"); - lock_ObtainMutex(&tcp->mx); - tcp->serverp = serverp; - tcp->cryptlevel = rxkad_clear; - cm_NewRXConnection(tcp, ucellp, serverp); - tcp->refCount = 1; - lock_ReleaseMutex(&tcp->mx); - } else { - if ((tcp->ucgen < ucellp->gen) || - (tcp->cryptlevel != (cryptall ? (ucellp->flags & CM_UCELLFLAG_RXKAD ? rxkad_crypt : rxkad_clear) : rxkad_clear))) - { - if (tcp->ucgen < ucellp->gen) - osi_Log0(afsd_logp, "cm_ConnByServer replace connection due to token update"); - else - osi_Log0(afsd_logp, "cm_ConnByServer replace connection due to crypt change"); - lock_ObtainMutex(&tcp->mx); - rx_DestroyConnection(tcp->callp); - cm_NewRXConnection(tcp, ucellp, serverp); - lock_ReleaseMutex(&tcp->mx); - } - tcp->refCount++; - } - lock_ReleaseWrite(&cm_connLock); - lock_ReleaseMutex(&userp->mx); - - /* return this pointer to our caller */ - osi_Log1(afsd_logp, "cm_ConnByServer returning conn 0x%x", (long) tcp); - *connpp = tcp; - - return 0; -} - -long cm_Conn(struct cm_fid *fidp, struct cm_user *userp, cm_req_t *reqp, - cm_conn_t **connpp) -{ - long code; - - cm_serverRef_t **serverspp; - - code = cm_GetServerList(fidp, userp, reqp, &serverspp); - if (code) { - *connpp = NULL; - return code; - } - - code = cm_ConnByMServers(*serverspp, userp, reqp, connpp); - cm_FreeServerList(serverspp); - return code; -} - -extern struct rx_connection * -cm_GetRxConn(cm_conn_t *connp) -{ - struct rx_connection * rxconn; - lock_ObtainMutex(&connp->mx); - rxconn = connp->callp; - rx_GetConnection(rxconn); - lock_ReleaseMutex(&connp->mx); - return rxconn; -} - diff --git a/src/WINNT/afsd/cm_conn.h b/src/WINNT/afsd/cm_conn.h deleted file mode 100644 index 0e9e0234f..000000000 --- a/src/WINNT/afsd/cm_conn.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_CONN_H_ENV__ -#define __CM_CONN_H_ENV__ 1 - -#define CM_CONN_DEFAULTRDRTIMEOUT 45 -#define CM_CONN_CONNDEADTIME 60 -#define CM_CONN_HARDDEADTIME 120 - -extern long ConnDeadtimeout; -extern long HardDeadtimeout; - -typedef struct cm_conn { - struct cm_conn *nextp; /* locked by cm_connLock */ - struct cm_server *serverp; /* locked by cm_serverLock */ - struct rx_connection *callp; /* locked by mx */ - struct cm_user *userp; /* locked by mx; a held reference */ - osi_mutex_t mx; /* mutex for some of these fields */ - unsigned long refCount; /* locked by cm_connLock */ - int ucgen; /* ucellp's generation number */ - long flags; /* locked by mx */ - int cryptlevel; /* encrytion status */ -} cm_conn_t; - -/* structure used for tracking RPC progress */ -typedef struct cm_req { - DWORD startTime; /* Quit before RDR times us out */ - int rpcError; /* RPC error code */ - int volumeError; /* volume error code */ - int accessError; /* access error code */ - int flags; -} cm_req_t; - -/* flags in cm_req structure */ -#define CM_REQ_NORETRY 0x1 - -/* - * Vice2 error codes - * 3/20/85 - * Note: all of the errors listed here are currently generated by the volume - * package. Other vice error codes, should they be needed, could be included - * here also. - */ - -#define VREADONLY EROFS /* Attempt to write a read-only volume */ - -/* Special error codes, which may require special handling (other than just - passing them through directly to the end user) are listed below */ - -#define VICE_SPECIAL_ERRORS 101 /* Lowest special error code */ - -#define VSALVAGE 101 /* Volume needs salvage */ -#define VNOVNODE 102 /* Bad vnode number quoted */ -#define VNOVOL 103 /* Volume not attached, doesn't exist, - not created or not online */ -#define VVOLEXISTS 104 /* Volume already exists */ -#define VNOSERVICE 105 /* Volume is not in service (i.e. it's - is out of funds, is obsolete, or somesuch) */ -#define VOFFLINE 106 /* Volume is off line, for the reason - given in the offline message */ -#define VONLINE 107 /* Volume is already on line */ -#define VDISKFULL 108 /* ENOSPC - Partition is "full", - i.e. roughly within n% of full */ -#define VOVERQUOTA 109 /* EDQUOT - Volume max quota exceeded */ -#define VBUSY 110 /* Volume temporarily unavailable; try again. - The volume should be available again shortly; - if it isn't something is wrong. - Not normally to be propagated to the - application level */ -#define VMOVED 111 /* Volume has moved to another server; - do a VGetVolumeInfo to THIS server to find - out where */ - -#define VRESTARTING -100 /* server is restarting, otherwise similar to - VBUSY above. This is negative so that old - cache managers treat it as "server is down"*/ - -#include "cm_server.h" -#include "rx.h" - -extern void cm_InitConn(void); - -extern void cm_InitReq(cm_req_t *reqp); - -extern int cm_Analyze(cm_conn_t *connp, struct cm_user *up, struct cm_req *reqp, - struct cm_fid *fidp, - struct AFSVolSync *volInfop, - cm_serverRef_t * serversp, - struct cm_callbackRequest *cbrp, long code); - -extern long cm_ConnByMServers(struct cm_serverRef *, struct cm_user *, - cm_req_t *, cm_conn_t **); - -extern long cm_ConnByServer(struct cm_server *, struct cm_user *, cm_conn_t **); - -extern long cm_Conn(struct cm_fid *, struct cm_user *, struct cm_req *, - cm_conn_t **); - -extern void cm_PutConn(cm_conn_t *connp); - -extern void cm_GCConnections(cm_server_t *serverp); - -extern struct rx_connection * cm_GetRxConn(cm_conn_t *connp); - -#endif /* __CM_CONN_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_daemon.c b/src/WINNT/afsd/cm_daemon.c deleted file mode 100644 index ab796a6e2..000000000 --- a/src/WINNT/afsd/cm_daemon.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#else -#include -#endif /* !DJGPP */ -#include -#include -#include - -#include -#include - -#include "afsd.h" - -long cm_daemonCheckInterval = 30; -long cm_daemonTokenCheckInterval = 180; - -osi_rwlock_t cm_daemonLock; - -long cm_bkgQueueCount; /* # of queued requests */ - -int cm_bkgWaitingForCount; /* true if someone's waiting for cm_bkgQueueCount to drop */ - -cm_bkgRequest_t *cm_bkgListp; /* first elt in the list of requests */ -cm_bkgRequest_t *cm_bkgListEndp; /* last elt in the list of requests */ - -static int daemon_ShutdownFlag = 0; - -void cm_BkgDaemon(long parm) -{ - cm_bkgRequest_t *rp; - - rx_StartClientThread(); - - lock_ObtainWrite(&cm_daemonLock); - while (daemon_ShutdownFlag == 0) { - if (!cm_bkgListEndp) { - osi_SleepW((long) &cm_bkgListp, &cm_daemonLock); - lock_ObtainWrite(&cm_daemonLock); - continue; - } - - /* we found a request */ - rp = cm_bkgListEndp; - cm_bkgListEndp = (cm_bkgRequest_t *) osi_QPrev(&rp->q); - osi_QRemove((osi_queue_t **) &cm_bkgListp, &rp->q); - osi_assert(cm_bkgQueueCount-- > 0); - lock_ReleaseWrite(&cm_daemonLock); - - (*rp->procp)(rp->scp, rp->p1, rp->p2, rp->p3, rp->p4, rp->userp); - - cm_ReleaseUser(rp->userp); - cm_ReleaseSCache(rp->scp); - free(rp); - - lock_ObtainWrite(&cm_daemonLock); - } - lock_ReleaseWrite(&cm_daemonLock); -} - -void cm_QueueBKGRequest(cm_scache_t *scp, cm_bkgProc_t *procp, long p1, long p2, long p3, long p4, - cm_user_t *userp) -{ - cm_bkgRequest_t *rp; - - rp = malloc(sizeof(*rp)); - memset(rp, 0, sizeof(*rp)); - - cm_HoldSCache(scp); - rp->scp = scp; - cm_HoldUser(userp); - rp->userp = userp; - rp->procp = procp; - rp->p1 = p1; - rp->p2 = p2; - rp->p3 = p3; - rp->p4 = p4; - - lock_ObtainWrite(&cm_daemonLock); - cm_bkgQueueCount++; - osi_QAdd((osi_queue_t **) &cm_bkgListp, &rp->q); - if (!cm_bkgListEndp) - cm_bkgListEndp = rp; - lock_ReleaseWrite(&cm_daemonLock); - - osi_Wakeup((long) &cm_bkgListp); -} - -/* periodic check daemon */ -void cm_Daemon(long parm) -{ - unsigned long now; - unsigned long lastLockCheck; - unsigned long lastVolCheck; - unsigned long lastCBExpirationCheck; - unsigned long lastDownServerCheck; - unsigned long lastUpServerCheck; - unsigned long lastTokenCacheCheck; - char thostName[200]; - unsigned long code; - struct hostent *thp; - HMODULE hHookDll; - - /* ping all file servers, up or down, with unauthenticated connection, - * to find out whether we have all our callbacks from the server still. - * Also, ping down VLDBs. - */ - /* - * Seed the random number generator with our own address, so that - * clients starting at the same time don't all do vol checks at the - * same time. - */ - gethostname(thostName, sizeof(thostName)); - thp = gethostbyname(thostName); - if (thp == NULL) /* In djgpp, gethostname returns the netbios - name of the machine. gethostbyname will fail - looking this up if it differs from DNS name. */ - code = 0; - else - memcpy(&code, thp->h_addr_list[0], 4); - srand(ntohl(code)); - - now = osi_Time(); - lastVolCheck = now - 1800 + (rand() % 3600); - lastCBExpirationCheck = now - 60 + (rand() % 60); - lastLockCheck = now - 60 + (rand() % 60); - lastDownServerCheck = now - cm_daemonCheckInterval/2 + (rand() % cm_daemonCheckInterval); - lastUpServerCheck = now - 1800 + (rand() % 3600); - lastTokenCacheCheck = now - cm_daemonTokenCheckInterval/2 + (rand() % cm_daemonTokenCheckInterval); - - while (daemon_ShutdownFlag == 0) { - thrd_Sleep(30 * 1000); /* sleep 30 seconds */ - if (daemon_ShutdownFlag == 1) - return; - - /* find out what time it is */ - now = osi_Time(); - - /* check down servers */ - if (now > lastDownServerCheck + cm_daemonCheckInterval) { - lastDownServerCheck = now; - cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); - } - - /* check up servers */ - if (now > lastUpServerCheck + 3600) { - lastUpServerCheck = now; - cm_CheckServers(CM_FLAG_CHECKUPSERVERS, NULL); - } - - if (now > lastVolCheck + 3600) { - lastVolCheck = now; - cm_CheckVolumes(); - } - - if (now > lastCBExpirationCheck + 60) { - lastCBExpirationCheck = now; - cm_CheckCBExpiration(); - } - - if (now > lastLockCheck + 60) { - lastLockCheck = now; - cm_CheckLocks(); - } - - if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval) { - lastTokenCacheCheck = now; - cm_CheckTokenCache(now); - } - - /* allow an exit to be called prior to stopping the service */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); - if (hHookDll) - { - BOOL hookRc = TRUE; - AfsdDaemonHook daemonHook = ( AfsdDaemonHook ) GetProcAddress(hHookDll, AFSD_DAEMON_HOOK); - if (daemonHook) - { - hookRc = daemonHook(); - } - FreeLibrary(hHookDll); - hHookDll = NULL; - - if (hookRc == FALSE) - { - SetEvent(WaitToTerminate); - } - } - } -} - -void cm_DaemonShutdown(void) -{ - daemon_ShutdownFlag = 1; -} - -void cm_InitDaemon(int nDaemons) -{ - static osi_once_t once; - long pid; - thread_t phandle; - int i; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_daemonLock, "cm_daemonLock"); - osi_EndOnce(&once); - - /* creating pinging daemon */ - phandle = thrd_Create((SecurityAttrib) 0, 0, - (ThreadFunc) cm_Daemon, 0, 0, &pid, "cm_Daemon"); - osi_assert(phandle != NULL); - - thrd_CloseHandle(phandle); - for(i=0; i < nDaemons; i++) { - phandle = thrd_Create((SecurityAttrib) 0, 0, - (ThreadFunc) cm_BkgDaemon, 0, 0, &pid, - "cm_BkgDaemon"); - osi_assert(phandle != NULL); - thrd_CloseHandle(phandle); - } - } -} diff --git a/src/WINNT/afsd/cm_daemon.h b/src/WINNT/afsd/cm_daemon.h deleted file mode 100644 index 7345cd9a5..000000000 --- a/src/WINNT/afsd/cm_daemon.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_DAEMON_H_ENV_ -#define __CM_DAEMON_H_ENV_ 1 - -/* externs */ -extern long cm_daemonCheckInterval; - -extern osi_rwlock_t cm_daemonLock; - -void cm_DaemonShutdown(void); - -void cm_InitDaemon(int nDaemons); - -typedef void (cm_bkgProc_t)(cm_scache_t *scp, long p1, long p2, long p3, - long p4, struct cm_user *up); - -typedef struct cm_bkgRequest { - osi_queue_t q; - cm_bkgProc_t *procp; - cm_scache_t *scp; - long p1; - long p2; - long p3; - long p4; - struct cm_user *userp; -} cm_bkgRequest_t; - -extern void cm_QueueBKGRequest(cm_scache_t *scp, cm_bkgProc_t *procp, long p1, - long p2, long p3, long p4, cm_user_t *userp); - -#endif /* __CM_DAEMON_H_ENV_ */ diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c deleted file mode 100644 index 8d347f696..000000000 --- a/src/WINNT/afsd/cm_dcache.c +++ /dev/null @@ -1,1407 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#include -#endif /* !DJGPP */ -#ifdef COMMENT -#include -#endif -#include -#include -#include - -#include "afsd.h" - -#ifdef DEBUG -extern void afsi_log(char *pattern, ...); -#endif - -osi_mutex_t cm_bufGetMutex; -#ifdef AFS_FREELANCE_CLIENT -extern osi_mutex_t cm_Freelance_Lock; -#endif - -/* functions called back from the buffer package when reading or writing data, - * or when holding or releasing a vnode pointer. - */ -long cm_BufWrite(void *vfidp, osi_hyper_t *offsetp, long length, long flags, - cm_user_t *userp, cm_req_t *reqp) -{ - /* store the data back from this buffer; the buffer is locked and held, - * but the vnode involved isn't locked, yet. It is held by its - * reference from the buffer, which won't change until the buffer is - * released by our caller. Thus, we don't have to worry about holding - * bufp->scp. - */ - long code; - cm_fid_t *fidp = vfidp; - cm_scache_t *scp; - long nbytes; - long temp; - AFSFetchStatus outStatus; - AFSStoreStatus inStatus; - osi_hyper_t thyper; - AFSVolSync volSync; - AFSFid tfid; - struct rx_call *callp; - struct rx_connection *rxconnp; - osi_queueData_t *qdp; - cm_buf_t *bufp; - long wbytes; - char *bufferp; - cm_conn_t *connp; - long truncPos; - cm_bulkIO_t biod; /* bulk IO descriptor */ - - osi_assert(userp != NULL); - - /* now, the buffer may or may not be filled with good data (buf_GetNew - * drops lots of locks, and may indeed return a properly initialized - * buffer, although more likely it will just return a new, empty, buffer. - */ - scp = cm_FindSCache(fidp); - if (scp == NULL) - return CM_ERROR_NOSUCHFILE; /* shouldn't happen */ - - cm_AFSFidFromFid(&tfid, fidp); - - lock_ObtainMutex(&scp->mx); - - code = cm_SetupStoreBIOD(scp, offsetp, length, &biod, userp, reqp); - if (code) { - osi_Log1(afsd_logp, "cm_SetupStoreBIOD code %x", code); - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - return code; - } - - if (biod.length == 0) { - osi_Log0(afsd_logp, "cm_SetupStoreBIOD length 0"); - lock_ReleaseMutex(&scp->mx); - cm_ReleaseBIOD(&biod, 1); /* should be a NOOP */ - cm_ReleaseSCache(scp); - return 0; - } - - /* Serialize StoreData RPC's; for rationale see cm_scache.c */ - (void) cm_SyncOp(scp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA_EXCL); - - /* prepare the output status for the store */ - scp->mask |= CM_SCACHEMASK_CLIENTMODTIME; - cm_StatusFromAttr(&inStatus, scp, NULL); - truncPos = scp->length.LowPart; - if ((scp->mask & CM_SCACHEMASK_TRUNCPOS) - && scp->truncPos.LowPart < (unsigned long) truncPos) - truncPos = scp->truncPos.LowPart; - scp->mask &= ~CM_SCACHEMASK_TRUNCPOS; - - /* compute how many bytes to write from this buffer */ - thyper = LargeIntegerSubtract(scp->length, biod.offset); - if (LargeIntegerLessThanZero(thyper)) { - /* entire buffer is past EOF */ - nbytes = 0; - } - else { - /* otherwise write out part of buffer before EOF, but not - * more than bufferSize bytes. - */ - nbytes = thyper.LowPart; - if (nbytes > biod.length) - nbytes = biod.length; - } - - lock_ReleaseMutex(&scp->mx); - - /* now we're ready to do the store operation */ - do { - code = cm_Conn(&scp->fid, userp, reqp, &connp); - if (code) - continue; - - rxconnp = cm_GetRxConn(connp); - callp = rx_NewCall(rxconnp); - rx_PutConnection(rxconnp); - - osi_Log3(afsd_logp, "CALL StoreData scp 0x%x, off 0x%x, size 0x%x", - (long) scp, biod.offset.LowPart, nbytes); - - code = StartRXAFS_StoreData(callp, &tfid, &inStatus, - biod.offset.LowPart, nbytes, truncPos); - - if (code == 0) { - /* write the data from the the list of buffers */ - qdp = NULL; - while(nbytes > 0) { - if (qdp == NULL) - qdp = biod.bufListEndp; - else - qdp = (osi_queueData_t *) osi_QPrev(&qdp->q); - osi_assert(qdp != NULL); - bufp = osi_GetQData(qdp); - bufferp = bufp->datap; - wbytes = nbytes; - if (wbytes > cm_data.buf_blockSize) - wbytes = cm_data.buf_blockSize; - - /* write out wbytes of data from bufferp */ - temp = rx_Write(callp, bufferp, wbytes); - if (temp != wbytes) { - osi_Log2(afsd_logp, "rx_Write failed %d != %d",temp,wbytes); - code = -1; - break; - } else { - osi_Log1(afsd_logp, "rx_Write succeeded %d",temp); - } - nbytes -= wbytes; - } /* while more bytes to write */ - } /* if RPC started successfully */ - else { - osi_Log1(afsd_logp, "StartRXAFS_StoreData failed (%lX)",code); - } - if (code == 0) { - code = EndRXAFS_StoreData(callp, &outStatus, &volSync); - if (code) - osi_Log1(afsd_logp, "EndRXAFS_StoreData failed (%lX)",code); - } - code = rx_EndCall(callp, code); - - } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL StoreData FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL StoreData SUCCESS"); - - /* now, clean up our state */ - lock_ObtainMutex(&scp->mx); - - cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL); - - if (code == 0) { - /* now, here's something a little tricky: in AFS 3, a dirty - * length can't be directly stored, instead, a dirty chunk is - * stored that sets the file's size (by writing and by using - * the truncate-first option in the store call). - * - * At this point, we've just finished a store, and so the trunc - * pos field is clean. If the file's size at the server is at - * least as big as we think it should be, then we turn off the - * length dirty bit, since all the other dirty buffers must - * precede this one in the file. - * - * The file's desired size shouldn't be smaller than what's - * stored at the server now, since we just did the trunc pos - * store. - * - * We have to turn off the length dirty bit as soon as we can, - * so that we see updates made by other machines. - */ - if (outStatus.Length >= scp->length.LowPart) - scp->mask &= ~CM_SCACHEMASK_LENGTH; - cm_MergeStatus(scp, &outStatus, &volSync, userp, 0); - } else { - if (code == CM_ERROR_SPACE) - scp->flags |= CM_SCACHEFLAG_OUTOFSPACE; - else if (code == CM_ERROR_QUOTA) - scp->flags |= CM_SCACHEFLAG_OVERQUOTA; - } - lock_ReleaseMutex(&scp->mx); - cm_ReleaseBIOD(&biod, 1); - cm_ReleaseSCache(scp); - - return code; -} - -/* - * Truncate the file, by sending a StoreData RPC with zero length. - * - * Called with scp locked. Releases and re-obtains the lock. - */ -long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) -{ - AFSFetchStatus outStatus; - AFSStoreStatus inStatus; - AFSVolSync volSync; - AFSFid tfid; - long code; - long truncPos; - cm_conn_t *connp; - struct rx_call *callp; - struct rx_connection *rxconnp; - - /* Serialize StoreData RPC's; for rationale see cm_scache.c */ - (void) cm_SyncOp(scp, NULL, userp, reqp, 0, - CM_SCACHESYNC_STOREDATA_EXCL); - - /* prepare the output status for the store */ - inStatus.Mask = AFS_SETMODTIME; - inStatus.ClientModTime = scp->clientModTime; - scp->mask &= ~CM_SCACHEMASK_CLIENTMODTIME; - - /* calculate truncation position */ - truncPos = scp->length.LowPart; - if ((scp->mask & CM_SCACHEMASK_TRUNCPOS) - && scp->truncPos.LowPart < (unsigned long) truncPos) - truncPos = scp->truncPos.LowPart; - scp->mask &= ~CM_SCACHEMASK_TRUNCPOS; - - lock_ReleaseMutex(&scp->mx); - - cm_AFSFidFromFid(&tfid, &scp->fid); - - /* now we're ready to do the store operation */ - do { - code = cm_Conn(&scp->fid, userp, reqp, &connp); - if (code) - continue; - - rxconnp = cm_GetRxConn(connp); - callp = rx_NewCall(rxconnp); - rx_PutConnection(rxconnp); - - code = StartRXAFS_StoreData(callp, &tfid, &inStatus, - 0, 0, truncPos); - - if (code == 0) - code = EndRXAFS_StoreData(callp, &outStatus, &volSync); - code = rx_EndCall(callp, code); - - } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - /* now, clean up our state */ - lock_ObtainMutex(&scp->mx); - - cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL); - - if (code == 0) { - /* - * For explanation of handling of CM_SCACHEMASK_LENGTH, - * see cm_BufWrite(). - */ - if (outStatus.Length >= scp->length.LowPart) - scp->mask &= ~CM_SCACHEMASK_LENGTH; - cm_MergeStatus(scp, &outStatus, &volSync, userp, 0); - } - - return code; -} - -long cm_BufRead(cm_buf_t *bufp, long nbytes, long *bytesReadp, cm_user_t *userp) -{ - *bytesReadp = cm_data.buf_blockSize; - - /* now return a code that means that I/O is done */ - return 0; -} - -/* stabilize scache entry, and return with it locked so - * it stays stable. - */ -long cm_BufStabilize(void *parmp, cm_user_t *userp, cm_req_t *reqp) -{ - cm_scache_t *scp; - long code; - - scp = parmp; - - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_SETSIZE); - if (code) { - lock_ReleaseMutex(&scp->mx); - return code; - } - - return 0; -} - -/* undoes the work that cm_BufStabilize does: releases lock so things can change again */ -long cm_BufUnstabilize(void *parmp, cm_user_t *userp) -{ - cm_scache_t *scp; - - scp = parmp; - - lock_ReleaseMutex(&scp->mx); - - /* always succeeds */ - return 0; -} - -cm_buf_ops_t cm_bufOps = { - cm_BufWrite, - cm_BufRead, - cm_BufStabilize, - cm_BufUnstabilize -}; - -long cm_ValidateDCache(void) -{ - return buf_ValidateBuffers(); -} - -long cm_ShutdownDCache(void) -{ - return 0; -} - -int cm_InitDCache(int newFile, long chunkSize, long nbuffers) -{ - lock_InitializeMutex(&cm_bufGetMutex, "buf_Get mutex"); - return buf_Init(newFile, &cm_bufOps, nbuffers); -} - -/* check to see if we have an up-to-date buffer. The buffer must have - * previously been obtained by calling buf_Get. - * - * Make sure we have a callback, and that the dataversion matches. - * - * Scp must be locked. - * - * Bufp *may* be locked. - */ -int cm_HaveBuffer(cm_scache_t *scp, cm_buf_t *bufp, int isBufLocked) -{ - int code; - if (!cm_HaveCallback(scp)) - return 0; - if ((bufp->cmFlags - & (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) - == (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) - return 1; - if (bufp->dataVersion == scp->dataVersion) - return 1; - if (!isBufLocked) { - code = lock_TryMutex(&bufp->mx); - if (code == 0) { - /* don't have the lock, and can't lock it, then - * return failure. - */ - return 0; - } - } - - /* remember dirty flag for later */ - code = bufp->flags & CM_BUF_DIRTY; - - /* release lock if we obtained it here */ - if (!isBufLocked) - lock_ReleaseMutex(&bufp->mx); - - /* if buffer was dirty, buffer is acceptable for use */ - if (code) - return 1; - else - return 0; -} - -/* used when deciding whether to do a prefetch or not */ -long cm_CheckFetchRange(cm_scache_t *scp, osi_hyper_t *startBasep, long length, - cm_user_t *up, cm_req_t *reqp, osi_hyper_t *realBasep) -{ - osi_hyper_t toffset; - osi_hyper_t tbase; - long code; - cm_buf_t *bp; - int stop; - - /* now scan all buffers in the range, looking for any that look like - * they need work. - */ - tbase = *startBasep; - stop = 0; - lock_ObtainMutex(&scp->mx); - while(length > 0) { - /* get callback so we can do a meaningful dataVersion comparison */ - code = cm_SyncOp(scp, NULL, up, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - scp->flags &= ~CM_SCACHEFLAG_PREFETCHING; - lock_ReleaseMutex(&scp->mx); - return code; - } - - if (LargeIntegerGreaterThanOrEqualTo(tbase, scp->length)) { - /* we're past the end of file */ - break; - } - - bp = buf_Find(scp, &tbase); - /* We cheat slightly by not locking the bp mutex. */ - if (bp) { - if ((bp->cmFlags - & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING)) == 0 - && bp->dataVersion != scp->dataVersion) - stop = 1; - buf_Release(bp); - } - else - stop = 1; - - /* if this buffer is essentially guaranteed to require a fetch, - * break out here and return this position. - */ - if (stop) - break; - - toffset.LowPart = cm_data.buf_blockSize; - toffset.HighPart = 0; - tbase = LargeIntegerAdd(toffset, tbase); - length -= cm_data.buf_blockSize; - } - - /* if we get here, either everything is fine or stop stopped us at a - * particular buffer in the range that definitely needs to be fetched. - */ - if (stop == 0) { - /* return non-zero code since realBasep won't be valid */ - scp->flags &= ~CM_SCACHEFLAG_PREFETCHING; - code = -1; - } - else { - /* successfully found a page that will need fetching */ - *realBasep = tbase; - code = 0; - } - lock_ReleaseMutex(&scp->mx); - return code; -} - -void cm_BkgStore(cm_scache_t *scp, long p1, long p2, long p3, long p4, - cm_user_t *userp) -{ - osi_hyper_t toffset; - long length; - cm_req_t req; - - cm_InitReq(&req); - req.flags |= CM_REQ_NORETRY; - - toffset.LowPart = p1; - toffset.HighPart = p2; - length = p3; - - osi_Log2(afsd_logp, "Starting BKG store vp 0x%x, base 0x%x", scp, p1); - - cm_BufWrite(&scp->fid, &toffset, length, /* flags */ 0, userp, &req); - - lock_ObtainMutex(&scp->mx); - cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_ASYNCSTORE); - lock_ReleaseMutex(&scp->mx); -} - -void cm_ClearPrefetchFlag(long code, cm_scache_t *scp, osi_hyper_t *base) -{ - osi_hyper_t thyper; - - if (code == 0) { - thyper.LowPart = cm_chunkSize; - thyper.HighPart = 0; - thyper = LargeIntegerAdd(*base, thyper); - thyper.LowPart &= (-cm_chunkSize); - if (LargeIntegerGreaterThan(*base, scp->prefetch.base)) - scp->prefetch.base = *base; - if (LargeIntegerGreaterThan(thyper, scp->prefetch.end)) - scp->prefetch.end = thyper; - } - scp->flags &= ~CM_SCACHEFLAG_PREFETCHING; -} - -/* do the prefetch */ -void cm_BkgPrefetch(cm_scache_t *scp, long p1, long p2, long p3, long p4, - cm_user_t *userp) -{ - long length; - osi_hyper_t base; - long code; - cm_buf_t *bp; - int cpff = 0; /* cleared prefetch flag */ - cm_req_t req; - - cm_InitReq(&req); - req.flags |= CM_REQ_NORETRY; - - base.LowPart = p1; - base.HighPart = p2; - length = p3; - - osi_Log2(afsd_logp, "Starting BKG prefetch vp 0x%x, base 0x%x", scp, p1); - - code = buf_Get(scp, &base, &bp); - - lock_ObtainMutex(&scp->mx); - - if (code || (bp->cmFlags & CM_BUF_CMFETCHING)) { - scp->flags &= ~CM_SCACHEFLAG_PREFETCHING; - lock_ReleaseMutex(&scp->mx); - return; - } - - code = cm_GetBuffer(scp, bp, &cpff, userp, &req); - if (!cpff) - cm_ClearPrefetchFlag(code, scp, &base); - lock_ReleaseMutex(&scp->mx); - buf_Release(bp); - return; -} - -/* a read was issued to offsetp, and we have to determine whether we should - * do a prefetch. - */ -void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, - cm_user_t *userp, cm_req_t *reqp) -{ - long code; - osi_hyper_t realBase; - osi_hyper_t readBase; - - readBase = *offsetp; - /* round up to chunk boundary */ - readBase.LowPart += (cm_chunkSize-1); - readBase.LowPart &= (-cm_chunkSize); - - lock_ObtainMutex(&scp->mx); - if ((scp->flags & CM_SCACHEFLAG_PREFETCHING) - || LargeIntegerLessThanOrEqualTo(readBase, scp->prefetch.base)) { - lock_ReleaseMutex(&scp->mx); - return; - } - scp->flags |= CM_SCACHEFLAG_PREFETCHING; - - /* start the scan at the latter of the end of this read or - * the end of the last fetched region. - */ - if (LargeIntegerGreaterThan(scp->prefetch.end, readBase)) - readBase = scp->prefetch.end; - - lock_ReleaseMutex(&scp->mx); - - code = cm_CheckFetchRange(scp, &readBase, cm_chunkSize, userp, reqp, - &realBase); - if (code) - return; /* can't find something to prefetch */ - - osi_Log2(afsd_logp, "BKG Prefetch request vp 0x%x, base 0x%x", - scp, realBase.LowPart); - - cm_QueueBKGRequest(scp, cm_BkgPrefetch, realBase.LowPart, - realBase.HighPart, cm_chunkSize, 0, userp); -} - -/* scp must be locked; temporarily unlocked during processing. - * If returns 0, returns buffers held in biop, and with - * CM_BUF_CMSTORING set. - * - * Caller *must* set CM_BUF_WRITING and reset the over.hEvent field if the - * buffer is ever unlocked before CM_BUF_DIRTY is cleared. And if - * CM_BUF_WRITING is ever viewed by anyone, then it must be cleared, sleepers - * must be woken, and the event must be set when the I/O is done. All of this - * is required so that buf_WaitIO synchronizes properly with the buffer as it - * is being written out. - */ -long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize, - cm_bulkIO_t *biop, cm_user_t *userp, cm_req_t *reqp) -{ - cm_buf_t *bufp; - osi_queueData_t *qdp; - osi_hyper_t thyper; - osi_hyper_t tbase; - osi_hyper_t scanStart; /* where to start scan for dirty pages */ - osi_hyper_t scanEnd; /* where to stop scan for dirty pages */ - osi_hyper_t firstModOffset; /* offset of first modified page in range */ - long temp; - long code; - long flags; /* flags to cm_SyncOp */ - - /* clear things out */ - biop->scp = scp; /* don't hold */ - biop->offset = *inOffsetp; - biop->length = 0; - biop->bufListp = NULL; - biop->bufListEndp = NULL; - biop->reserved = 0; - - /* reserve a chunk's worth of buffers */ - lock_ReleaseMutex(&scp->mx); - buf_ReserveBuffers(cm_chunkSize / cm_data.buf_blockSize); - lock_ObtainMutex(&scp->mx); - - bufp = NULL; - for (temp = 0; temp < inSize; temp += cm_data.buf_blockSize, bufp = NULL) { - thyper.HighPart = 0; - thyper.LowPart = temp; - tbase = LargeIntegerAdd(*inOffsetp, thyper); - - bufp = buf_Find(scp, &tbase); - if (bufp) { - /* get buffer mutex and scp mutex safely */ - lock_ReleaseMutex(&scp->mx); - lock_ObtainMutex(&bufp->mx); - lock_ObtainMutex(&scp->mx); - - flags = CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_STOREDATA - | CM_SCACHESYNC_BUFLOCKED; - code = cm_SyncOp(scp, bufp, userp, reqp, 0, flags); - if (code) { - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize); - return code; - } - - /* if the buffer is dirty, we're done */ - if (bufp->flags & CM_BUF_DIRTY) { - osi_assertx(!(bufp->flags & CM_BUF_WRITING), - "WRITING w/o CMSTORING in SetupStoreBIOD"); - bufp->flags |= CM_BUF_WRITING; - break; - } - - /* this buffer is clean, so there's no reason to process it */ - cm_SyncOpDone(scp, bufp, flags); - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - } - } - - biop->reserved = 1; - - /* if we get here, if bufp is null, we didn't find any dirty buffers - * that weren't already being stored back, so we just quit now. - */ - if (!bufp) { - return 0; - } - - /* don't need buffer mutex any more */ - lock_ReleaseMutex(&bufp->mx); - - /* put this element in the list */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, bufp); - /* don't have to hold bufp, since held by buf_Find above */ - osi_QAddH((osi_queue_t **) &biop->bufListp, - (osi_queue_t **) &biop->bufListEndp, - &qdp->q); - biop->length = cm_data.buf_blockSize; - firstModOffset = bufp->offset; - biop->offset = firstModOffset; - - /* compute the window surrounding *inOffsetp of size cm_chunkSize */ - scanStart = *inOffsetp; - scanStart.LowPart &= (-cm_chunkSize); - thyper.LowPart = cm_chunkSize; - thyper.HighPart = 0; - scanEnd = LargeIntegerAdd(scanStart, thyper); - - flags = CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_STOREDATA - | CM_SCACHESYNC_BUFLOCKED - | CM_SCACHESYNC_NOWAIT; - - /* start by looking backwards until scanStart */ - thyper.HighPart = 0; /* hyper version of cm_data.buf_blockSize */ - thyper.LowPart = cm_data.buf_blockSize; - tbase = LargeIntegerSubtract(firstModOffset, thyper); - while(LargeIntegerGreaterThanOrEqualTo(tbase, scanStart)) { - /* see if we can find the buffer */ - bufp = buf_Find(scp, &tbase); - if (!bufp) - break; - - /* try to lock it, and quit if we can't (simplifies locking) */ - code = lock_TryMutex(&bufp->mx); - if (code == 0) { - buf_Release(bufp); - break; - } - - code = cm_SyncOp(scp, bufp, userp, reqp, 0, flags); - if (code) { - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - break; - } - - if (!(bufp->flags & CM_BUF_DIRTY)) { - /* buffer is clean, so we shouldn't add it */ - cm_SyncOpDone(scp, bufp, flags); - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - break; - } - - /* don't need buffer mutex any more */ - lock_ReleaseMutex(&bufp->mx); - - /* we have a dirty buffer ready for storing. Add it to the tail - * of the list, since it immediately precedes all of the disk - * addresses we've already collected. - */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, bufp); - /* no buf_hold necessary, since we have it held from buf_Find */ - osi_QAddT((osi_queue_t **) &biop->bufListp, - (osi_queue_t **) &biop->bufListEndp, - &qdp->q); - - /* update biod info describing the transfer */ - biop->offset = LargeIntegerSubtract(biop->offset, thyper); - biop->length += cm_data.buf_blockSize; - - /* update loop pointer */ - tbase = LargeIntegerSubtract(tbase, thyper); - } /* while loop looking for pages preceding the one we found */ - - /* now, find later dirty, contiguous pages, and add them to the list */ - thyper.HighPart = 0; /* hyper version of cm_data.buf_blockSize */ - thyper.LowPart = cm_data.buf_blockSize; - tbase = LargeIntegerAdd(firstModOffset, thyper); - while(LargeIntegerLessThan(tbase, scanEnd)) { - /* see if we can find the buffer */ - bufp = buf_Find(scp, &tbase); - if (!bufp) - break; - - /* try to lock it, and quit if we can't (simplifies locking) */ - code = lock_TryMutex(&bufp->mx); - if (code == 0) { - buf_Release(bufp); - break; - } - - code = cm_SyncOp(scp, bufp, userp, reqp, 0, flags); - if (code) { - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - break; - } - - if (!(bufp->flags & CM_BUF_DIRTY)) { - /* buffer is clean, so we shouldn't add it */ - cm_SyncOpDone(scp, bufp, flags); - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - break; - } - - /* don't need buffer mutex any more */ - lock_ReleaseMutex(&bufp->mx); - - /* we have a dirty buffer ready for storing. Add it to the head - * of the list, since it immediately follows all of the disk - * addresses we've already collected. - */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, bufp); - /* no buf_hold necessary, since we have it held from buf_Find */ - osi_QAddH((osi_queue_t **) &biop->bufListp, - (osi_queue_t **) &biop->bufListEndp, - &qdp->q); - - /* update biod info describing the transfer */ - biop->length += cm_data.buf_blockSize; - - /* update loop pointer */ - tbase = LargeIntegerAdd(tbase, thyper); - } /* while loop looking for pages following the first page we found */ - - /* finally, we're done */ - return 0; -} - -/* scp must be locked; temporarily unlocked during processing. - * If returns 0, returns buffers held in biop, and with - * CM_BUF_CMFETCHING flags set. - * If an error is returned, we don't return any buffers. - */ -long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp, - cm_bulkIO_t *biop, cm_user_t *up, cm_req_t *reqp) -{ - long code; - cm_buf_t *tbp; - osi_hyper_t toffset; /* a long long temp variable */ - osi_hyper_t pageBase; /* base offset we're looking at */ - osi_queueData_t *qdp; /* one temp queue structure */ - osi_queueData_t *tqdp; /* another temp queue structure */ - long collected; /* how many bytes have been collected */ - int isFirst; - long flags; - osi_hyper_t fileSize; /* the # of bytes in the file */ - osi_queueData_t *heldBufListp; /* we hold all buffers in this list */ - osi_queueData_t *heldBufListEndp; /* first one */ - int reserving; - - biop->scp = scp; - biop->offset = *offsetp; - /* null out the list of buffers */ - biop->bufListp = biop->bufListEndp = NULL; - biop->reserved = 0; - - /* first lookup the file's length, so we know when to stop */ - code = cm_SyncOp(scp, NULL, up, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) - return code; - - /* copy out size, since it may change */ - fileSize = scp->serverLength; - - lock_ReleaseMutex(&scp->mx); - - pageBase = *offsetp; - collected = pageBase.LowPart & (cm_chunkSize - 1); - heldBufListp = NULL; - heldBufListEndp = NULL; - - /* - * Obtaining buffers can cause dirty buffers to be recycled, which - * can cause a storeback, so cannot be done while we have buffers - * reserved. - * - * To get around this, we get buffers twice. Before reserving buffers, - * we obtain and release each one individually. After reserving - * buffers, we try to obtain them again, but only by lookup, not by - * recycling. If a buffer has gone away while we were waiting for - * the others, we just use whatever buffers we already have. - * - * On entry to this function, we are already holding a buffer, so we - * can't wait for reservation. So we call buf_TryReserveBuffers() - * instead. Not only that, we can't really even call buf_Get(), for - * the same reason. We can't avoid that, though. To avoid deadlock - * we allow only one thread to be executing the buf_Get()-buf_Release() - * sequence at a time. - */ - - /* first hold all buffers, since we can't hold any locks in buf_Get */ - while (1) { - /* stop at chunk boundary */ - if (collected >= cm_chunkSize) break; - - /* see if the next page would be past EOF */ - if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) break; - - lock_ObtainMutex(&cm_bufGetMutex); - - code = buf_Get(scp, &pageBase, &tbp); - if (code) { - lock_ReleaseMutex(&cm_bufGetMutex); - lock_ObtainMutex(&scp->mx); - return code; - } - - buf_Release(tbp); - - lock_ReleaseMutex(&cm_bufGetMutex); - - toffset.HighPart = 0; - toffset.LowPart = cm_data.buf_blockSize; - pageBase = LargeIntegerAdd(toffset, pageBase); - collected += cm_data.buf_blockSize; - } - - /* reserve a chunk's worth of buffers if possible */ - reserving = buf_TryReserveBuffers(cm_chunkSize / cm_data.buf_blockSize); - - pageBase = *offsetp; - collected = pageBase.LowPart & (cm_chunkSize - 1); - - /* now hold all buffers, if they are still there */ - while (1) { - /* stop at chunk boundary */ - if (collected >= cm_chunkSize) - break; - - /* see if the next page would be past EOF */ - if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) - break; - - tbp = buf_Find(scp, &pageBase); - if (!tbp) - break; - - /* add the buffer to the list */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, tbp); - osi_QAdd((osi_queue_t **)&heldBufListp, &qdp->q); - if (!heldBufListEndp) heldBufListEndp = qdp; - /* leave tbp held (from buf_Get) */ - - if (!reserving) - break; - - collected += cm_data.buf_blockSize; - toffset.HighPart = 0; - toffset.LowPart = cm_data.buf_blockSize; - pageBase = LargeIntegerAdd(toffset, pageBase); - } - - /* look at each buffer, adding it into the list if it looks idle and - * filled with old data. One special case: wait for idle if it is the - * first buffer since we really need that one for our caller to make - * any progress. - */ - isFirst = 1; - collected = 0; /* now count how many we'll really use */ - for (tqdp = heldBufListEndp; - tqdp; - tqdp = (osi_queueData_t *) osi_QPrev(&tqdp->q)) { - /* get a ptr to the held buffer */ - tbp = osi_GetQData(tqdp); - pageBase = tbp->offset; - - /* now lock the buffer lock */ - lock_ObtainMutex(&tbp->mx); - lock_ObtainMutex(&scp->mx); - - /* don't bother fetching over data that is already current */ - if (tbp->dataVersion == scp->dataVersion) { - /* we don't need this buffer, since it is current */ - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&tbp->mx); - break; - } - - flags = CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_FETCHDATA - | CM_SCACHESYNC_BUFLOCKED; - if (!isFirst) - flags |= CM_SCACHESYNC_NOWAIT; - - /* wait for the buffer to serialize, if required. Doesn't - * release the scp or buffer lock(s) if NOWAIT is specified. - */ - code = cm_SyncOp(scp, tbp, up, reqp, 0, flags); - if (code) { - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&tbp->mx); - break; - } - - /* don't fetch over dirty buffers */ - if (tbp->flags & CM_BUF_DIRTY) { - cm_SyncOpDone(scp, tbp, flags); - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&tbp->mx); - break; - } - - /* Release locks */ - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&tbp->mx); - - /* add the buffer to the list */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, tbp); - osi_QAdd((osi_queue_t **)&biop->bufListp, &qdp->q); - if (!biop->bufListEndp) - biop->bufListEndp = qdp; - buf_Hold(tbp); - - /* from now on, a failure just stops our collection process, but - * we still do the I/O to whatever we've already managed to collect. - */ - isFirst = 0; - collected += cm_data.buf_blockSize; - } - - /* now, we've held in biop->bufListp all the buffer's we're really - * interested in. We also have holds left from heldBufListp, and we - * now release those holds on the buffers. - */ - for (qdp = heldBufListp; qdp; qdp = tqdp) { - tqdp = (osi_queueData_t *) osi_QNext(&qdp->q); - tbp = osi_GetQData(qdp); - osi_QDFree(qdp); - buf_Release(tbp); - } - - /* Caller expects this */ - lock_ObtainMutex(&scp->mx); - - /* if we got a failure setting up the first buffer, then we don't have - * any side effects yet, and we also have failed an operation that the - * caller requires to make any progress. Give up now. - */ - if (code && isFirst) { - buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize); - return code; - } - - /* otherwise, we're still OK, and should just return the I/O setup we've - * got. - */ - biop->length = collected; - biop->reserved = reserving; - return 0; -} - -/* release a bulk I/O structure that was setup by cm_SetupFetchBIOD or by - * cm_SetupStoreBIOD - */ -void cm_ReleaseBIOD(cm_bulkIO_t *biop, int isStore) -{ - cm_scache_t *scp; - cm_buf_t *bufp; - osi_queueData_t *qdp; - osi_queueData_t *nqdp; - int flags; - - /* Give back reserved buffers */ - if (biop->reserved) - buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize); - - flags = CM_SCACHESYNC_NEEDCALLBACK; - if (isStore) - flags |= CM_SCACHESYNC_STOREDATA; - else - flags |= CM_SCACHESYNC_FETCHDATA; - - scp = biop->scp; - for(qdp = biop->bufListp; qdp; qdp = nqdp) { - /* lookup next guy first, since we're going to free this one */ - nqdp = (osi_queueData_t *) osi_QNext(&qdp->q); - - /* extract buffer and free queue data */ - bufp = osi_GetQData(qdp); - osi_QDFree(qdp); - - /* now, mark I/O as done, unlock the buffer and release it */ - lock_ObtainMutex(&bufp->mx); - lock_ObtainMutex(&scp->mx); - cm_SyncOpDone(scp, bufp, flags); - lock_ReleaseMutex(&scp->mx); - - /* turn off writing and wakeup users */ - if (isStore) { - if (bufp->flags & CM_BUF_WAITING) { - osi_Wakeup((long) bufp); - } - bufp->flags &= ~(CM_BUF_WAITING | CM_BUF_WRITING | CM_BUF_DIRTY); - } - - lock_ReleaseMutex(&bufp->mx); - buf_Release(bufp); - } - - /* clean things out */ - biop->bufListp = NULL; - biop->bufListEndp = NULL; -} - -/* Fetch a buffer. Called with scp locked. - * The scp is locked on return. - */ -long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up, - cm_req_t *reqp) -{ - long code; - long nbytes; /* bytes in transfer */ - long rbytes; /* bytes in rx_Read call */ - long temp; - AFSFetchStatus afsStatus; - AFSCallBack callback; - AFSVolSync volSync; - char *bufferp; - cm_buf_t *tbufp; /* buf we're filling */ - osi_queueData_t *qdp; /* q element we're scanning */ - AFSFid tfid; - struct rx_call *callp; - struct rx_connection *rxconnp; - cm_bulkIO_t biod; /* bulk IO descriptor */ - cm_conn_t *connp; - int getroot; - long t1, t2; - - /* now, the buffer may or may not be filled with good data (buf_GetNew - * drops lots of locks, and may indeed return a properly initialized - * buffer, although more likely it will just return a new, empty, buffer. - */ - -#ifdef AFS_FREELANCE_CLIENT - - // yj: if they're trying to get the /afs directory, we need to - // handle it differently, since it's local rather than on any - // server - - getroot = (scp==cm_data.rootSCachep); - if (getroot) - osi_Log1(afsd_logp,"GetBuffer returns cm_data.rootSCachep=%x",cm_data.rootSCachep); -#endif - - cm_AFSFidFromFid(&tfid, &scp->fid); - - code = cm_SetupFetchBIOD(scp, &bufp->offset, &biod, up, reqp); - if (code) { - /* couldn't even get the first page setup properly */ - osi_Log1(afsd_logp, "SetupFetchBIOD failure code %d", code); - return code; - } - - /* once we get here, we have the callback in place, we know that no one - * is fetching the data now. Check one last time that we still have - * the wrong data, and then fetch it if we're still wrong. - * - * We can lose a race condition and end up with biod.length zero, in - * which case we just retry. - */ - if (bufp->dataVersion == scp->dataVersion || biod.length == 0) { - osi_Log3(afsd_logp, "Bad DVs %d, %d or length 0x%x", - bufp->dataVersion, scp->dataVersion, biod.length); - if ((bufp->dataVersion == -1 - || bufp->dataVersion < scp->dataVersion) - && LargeIntegerGreaterThanOrEqualTo(bufp->offset, - scp->serverLength)) { - if (bufp->dataVersion == -1) - memset(bufp->datap, 0, cm_data.buf_blockSize); - bufp->dataVersion = scp->dataVersion; - } - lock_ReleaseMutex(&scp->mx); - cm_ReleaseBIOD(&biod, 0); - lock_ObtainMutex(&scp->mx); - return 0; - } - - lock_ReleaseMutex(&scp->mx); - -#ifdef DISKCACHE95 - DPRINTF("cm_GetBuffer: fetching data scpDV=%d bufDV=%d scp=%x bp=%x dcp=%x\n", - scp->dataVersion, bufp->dataVersion, scp, bufp, bufp->dcp); -#endif /* DISKCACHE95 */ - -#ifdef AFS_FREELANCE_CLIENT - - // yj code - // if getroot then we don't need to make any calls - // just return fake data - - if (cm_freelanceEnabled && getroot) { - // setup the fake status - afsStatus.InterfaceVersion = 0x1; - afsStatus.FileType = 0x2; - afsStatus.LinkCount = scp->linkCount; - afsStatus.Length = cm_fakeDirSize; - afsStatus.DataVersion = cm_data.fakeDirVersion; - afsStatus.Author = 0x1; - afsStatus.Owner = 0x0; - afsStatus.CallerAccess = 0x9; - afsStatus.AnonymousAccess = 0x9; - afsStatus.UnixModeBits = 0x1ff; - afsStatus.ParentVnode = 0x1; - afsStatus.ParentUnique = 0x1; - afsStatus.ResidencyMask = 0; - afsStatus.ClientModTime = (afs_uint32)FakeFreelanceModTime; - afsStatus.ServerModTime = (afs_uint32)FakeFreelanceModTime; - afsStatus.Group = 0; - afsStatus.SyncCounter = 0; - afsStatus.dataVersionHigh = 0; - afsStatus.lockCount = 0; - afsStatus.Length_hi = 0; - afsStatus.errorCode = 0; - - // once we're done setting up the status info, - // we just fill the buffer pages with fakedata - // from cm_FakeRootDir. Extra pages are set to - // 0. - - lock_ObtainMutex(&cm_Freelance_Lock); - t1 = bufp->offset.LowPart; - qdp = biod.bufListEndp; - while (qdp) { - tbufp = osi_GetQData(qdp); - bufferp=tbufp->datap; - memset(bufferp, 0, cm_data.buf_blockSize); - t2 = cm_fakeDirSize - t1; - if (t2>cm_data.buf_blockSize) t2=cm_data.buf_blockSize; - if (t2 > 0) { - memcpy(bufferp, cm_FakeRootDir+t1, t2); - } else { - t2 = 0; - } - t1+=t2; - qdp = (osi_queueData_t *) osi_QPrev(&qdp->q); - - } - lock_ReleaseMutex(&cm_Freelance_Lock); - - // once we're done, we skip over the part of the - // code that does the ACTUAL fetching of data for - // real files - - goto fetchingcompleted; - } - -#endif /* AFS_FREELANCE_CLIENT */ - - /* now make the call */ - do { - code = cm_Conn(&scp->fid, up, reqp, &connp); - if (code) - continue; - - rxconnp = cm_GetRxConn(connp); - callp = rx_NewCall(rxconnp); - rx_PutConnection(rxconnp); - - osi_Log3(afsd_logp, "CALL FetchData vp %x, off 0x%x, size 0x%x", - (long) scp, biod.offset.LowPart, biod.length); - - code = StartRXAFS_FetchData(callp, &tfid, biod.offset.LowPart, - biod.length); - - /* now copy the data out of the pipe and put it in the buffer */ - temp = rx_Read(callp, (char *)&nbytes, 4); - if (temp == 4) { - nbytes = ntohl(nbytes); - if (nbytes > biod.length) - code = (callp->error < 0) ? callp->error : -1; - } - else - code = (callp->error < 0) ? callp->error : -1; - - if (code == 0) { - qdp = biod.bufListEndp; - if (qdp) { - tbufp = osi_GetQData(qdp); - bufferp = tbufp->datap; - } - else - bufferp = NULL; - /* fill nbytes of data from the pipe into the pages. - * When we stop, qdp will point at the last page we're - * dealing with, and bufferp will tell us where we - * stopped. We'll need this info below when we clear - * the remainder of the last page out (and potentially - * clear later pages out, if we fetch past EOF). - */ - while (nbytes > 0) { - /* assert that there are still more buffers; - * our check above for nbytes being less than - * biod.length should ensure this. - */ - osi_assert(bufferp != NULL); - - /* read rbytes of data */ - rbytes = (nbytes > cm_data.buf_blockSize? cm_data.buf_blockSize : nbytes); - temp = rx_Read(callp, bufferp, rbytes); - if (temp < rbytes) { - code = (callp->error < 0) ? callp->error : -1; - break; - } - - /* allow read-while-fetching. - * if this is the last buffer, clear the - * PREFETCHING flag, so the reader waiting for - * this buffer will start a prefetch. - */ - tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED; - lock_ObtainMutex(&scp->mx); - if (scp->flags & CM_SCACHEFLAG_WAITING) { - scp->flags &= ~CM_SCACHEFLAG_WAITING; - osi_Wakeup((long) &scp->flags); - } - if (cpffp && !*cpffp && !osi_QPrev(&qdp->q)) { - *cpffp = 1; - cm_ClearPrefetchFlag(0, scp, &biod.offset); - } - lock_ReleaseMutex(&scp->mx); - - /* and adjust counters */ - nbytes -= temp; - - /* and move to the next buffer */ - if (nbytes != 0) { - qdp = (osi_queueData_t *) osi_QPrev(&qdp->q); - if (qdp) { - tbufp = osi_GetQData(qdp); - bufferp = tbufp->datap; - } - else - bufferp = NULL; - } else - bufferp += temp; - } - - /* zero out remainder of last pages, in case we are - * fetching past EOF. We were fetching an integral # - * of pages, but stopped, potentially in the middle of - * a page. Zero the remainder of that page, and then - * all of the rest of the pages. - */ - /* bytes fetched */ - rbytes = bufferp - tbufp->datap; - /* bytes left to zero */ - rbytes = cm_data.buf_blockSize - rbytes; - while(qdp) { - if (rbytes != 0) - memset(bufferp, 0, rbytes); - qdp = (osi_queueData_t *) osi_QPrev(&qdp->q); - if (qdp == NULL) - break; - tbufp = osi_GetQData(qdp); - bufferp = tbufp->datap; - /* bytes to clear in this page */ - rbytes = cm_data.buf_blockSize; - } - } - - if (code == 0) - code = EndRXAFS_FetchData(callp, &afsStatus, &callback, &volSync); - else - osi_Log0(afsd_logp, "CALL EndRXAFS_FetchData skipped due to error"); - code = rx_EndCall(callp, code); - if (code == RXKADUNKNOWNKEY) - osi_Log0(afsd_logp, "CALL EndCall returns RXKADUNKNOWNKEY"); - osi_Log0(afsd_logp, "CALL FetchData DONE"); - - } while (cm_Analyze(connp, up, reqp, &scp->fid, &volSync, NULL, NULL, code)); - - fetchingcompleted: - code = cm_MapRPCError(code, reqp); - - lock_ObtainMutex(&scp->mx); - /* we know that no one else has changed the buffer, since we still have - * the fetching flag on the buffers, and we have the scp locked again. - * Copy in the version # into the buffer if we got code 0 back from the - * read. - */ - if (code == 0) { - for(qdp = biod.bufListp; - qdp; - qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { - tbufp = osi_GetQData(qdp); - tbufp->dataVersion = afsStatus.DataVersion; - -#ifdef DISKCACHE95 - /* write buffer out to disk cache */ - diskcache_Update(tbufp->dcp, tbufp->datap, cm_data.buf_blockSize, - tbufp->dataVersion); -#endif /* DISKCACHE95 */ - } - } - - /* release scatter/gather I/O structure (buffers, locks) */ - lock_ReleaseMutex(&scp->mx); - cm_ReleaseBIOD(&biod, 0); - lock_ObtainMutex(&scp->mx); - - if (code == 0) - cm_MergeStatus(scp, &afsStatus, &volSync, up, 0); - return code; -} diff --git a/src/WINNT/afsd/cm_dcache.h b/src/WINNT/afsd/cm_dcache.h deleted file mode 100644 index 9853cd980..000000000 --- a/src/WINNT/afsd/cm_dcache.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_DCACHE_ENV__ -#define __CM_DCACHE_ENV__ 1 - -/* bulk I/O descriptor */ -typedef struct cm_bulkIO { - struct cm_scache *scp; /* typically unheld vnode ptr */ - osi_hyper_t offset; /* offset of buffers */ - long length; /* # of bytes to be transferred */ - int reserved; /* did we reserve multiple buffers? */ - - /* all of these buffers are held */ - osi_queueData_t *bufListp; /* list of buffers involved in I/O */ - osi_queueData_t *bufListEndp; /* list of buffers involved in I/O */ -} cm_bulkIO_t; - -extern long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp); - -extern int cm_InitDCache(int newFile, long chunkSize, long nbuffers); - -extern int cm_HaveBuffer(struct cm_scache *, struct cm_buf *, int haveBufLocked); - -extern long cm_GetBuffer(struct cm_scache *, struct cm_buf *, int *, - struct cm_user *, struct cm_req *); - -extern long cm_CheckFetchRange(cm_scache_t *scp, osi_hyper_t *startBasep, - long length, cm_user_t *up, cm_req_t *reqp, osi_hyper_t *realBasep); - -extern long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp, - cm_bulkIO_t *biop, cm_user_t *up, cm_req_t *reqp); - -extern void cm_ReleaseBIOD(cm_bulkIO_t *biop, int isStore); - -extern long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, - long inSize, cm_bulkIO_t *biop, cm_user_t *userp, cm_req_t *reqp); - -extern void cm_BkgPrefetch(cm_scache_t *scp, long p1, long p2, long p3, long p4, - struct cm_user *userp); - -extern void cm_BkgStore(cm_scache_t *scp, long p1, long p2, long p3, long p4, - struct cm_user *userp); - -extern void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, - cm_user_t *userp, cm_req_t *reqp); - -extern long cm_ValidateDCache(void); - -extern long cm_ShutdownDCache(void); - -#endif /* __CM_DCACHE_ENV__ */ diff --git a/src/WINNT/afsd/cm_dir.c b/src/WINNT/afsd/cm_dir.c deleted file mode 100644 index c32de292e..000000000 --- a/src/WINNT/afsd/cm_dir.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#endif /* !DJGPP */ -#include -#include -#include -#include - -#include "afsd.h" - -/* compute how many 32 byte entries an AFS 3 dir requires for storing - * the specified name. - */ -cm_NameEntries(char *namep, size_t *lenp) -{ - int i; - - i = strlen(namep); - if (lenp) *lenp = i; - return 1+((i+16)>>5); -} diff --git a/src/WINNT/afsd/cm_dir.h b/src/WINNT/afsd/cm_dir.h deleted file mode 100644 index 1443b6677..000000000 --- a/src/WINNT/afsd/cm_dir.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_DIR_ENV__ -#define __CM_DIR_ENV__ 1 - -#define CM_DIR_PAGESIZE 2048 /* bytes per page */ -#define CM_DIR_NHASHENT 256 /* entries in the hash tbl == NHSIZE */ -#define CM_DIR_MAXPAGES 128 /* max pages in a dir */ -#define CM_DIR_BIGMAXPAGES 1023 /* new big max pages */ -#define CM_DIR_EPP 64 /* dir entries per page */ -#define CM_DIR_LEPP 6 /* log above */ -#define CM_DIR_CHUNKSIZE 32 /* bytes per dir entry chunk */ - -/* When this next field changs, it is crucial to modify MakeDir, since the latter is - * responsible for marking these entries as allocated. Also change - * the salvager. - */ -#define CM_DIR_DHE 12 /* entries in a dir header above a pages - * header alone. - */ - -typedef struct cm_dirFid { - /* A file identifier. */ - afs_int32 vnode; /* file's vnode slot */ - afs_int32 unique; /* the slot incarnation number */ -} cm_dirFid_t; - -typedef struct cm_pageHeader { - /* A page header entry. */ - unsigned short pgcount; /* number of pages, or 0 if old-style */ - unsigned short tag; /* 1234 in network byte order */ - char freeCount; /* unused, info in dirHeader structure */ - char freeBitmap[CM_DIR_EPP/8]; - char padding[32-(5+CM_DIR_EPP/8)]; /* pad to one 32-byte entry */ -} cm_pageHeader_t; - -/* a total of 13 32-byte entries, 1 for the header that in all pages, and - * 12 more special ones for the entries in a the first page. - */ -typedef struct cm_dirHeader { - /* A directory header object. */ - cm_pageHeader_t header; - char alloMap[CM_DIR_MAXPAGES]; /* one byte per 2K page */ - unsigned short hashTable[CM_DIR_NHASHENT]; -} cm_dirHeader_t; - -/* this represents a directory entry. We use strlen to find out how many bytes are - * really in the dir entry; it is always a multiple of 32. - */ -typedef struct cm_dirEntry { - /* A directory entry */ - char flag; - char length; /* currently unused */ - unsigned short next; - cm_dirFid_t fid; - char name[16]; -} cm_dirEntry_t; - -#ifdef UNUSED -typedef struct cm_dirXEntry { - /* A directory extension entry. */ - char name[32]; -} cm_dirXEntry_t; - -typedef struct cm_dirPage0 { - /* A page in a directory. */ - cm_dirHeader_t header; - cm_dirEntry_t entry[1]; -} cm_dirPage0_t; - -typedef struct cm_dirPage1 { - /* A page in a directory. */ - cm_pageHeader_t header; - cm_dirEntry_t entry[1]; -} cm_dirPage1_t; -#endif /* UNUSED */ - -extern int cm_NameEntries(char *namep, size_t *lenp); - -#endif /* __CM_DIR_ENV__ */ diff --git a/src/WINNT/afsd/cm_diskcache95.c b/src/WINNT/afsd/cm_diskcache95.c deleted file mode 100644 index 20b0a8b17..000000000 --- a/src/WINNT/afsd/cm_diskcache95.c +++ /dev/null @@ -1,760 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* This code is experimental persistent disk cache support for the - Windows 95/DJGPP AFS client. It uses synchronous I/O and assumes - non-preemptible threads (which is the case in DJGPP), so it has - no locking. */ - - -#ifdef DISKCACHE95 - -#include -#include -#include -#include -#include -#include - -#include "afsd.h" - -cm_diskcache_t **diskHashTable; /* pointers to hash chains */ -Queue diskLRUList; -Queue openFileList; -cm_diskcache_t *diskCBBuf; - -extern int afs_diskCacheChunks; -/*extern int cm_diskCacheChunkSize;*/ -extern long buf_blockSize; -long cm_diskCacheChunkSize; -extern char cm_cachePath[]; -extern int cm_cachePathLen; -extern int cm_diskCacheEnabled; - -int cacheInfo_fd; -int accessOrd = 0; /* monotonically increasing access ordinal */ -int updates = 0; -int afs_dhashsize = 2048; -int openCacheFiles = 0; - -char cacheInfoPath[128]; -char cacheFileName[128]; - -extern int errno; - -#define MAX_OPEN_FILES 22 - -/* internal functions */ -void diskcache_WriteCacheInfo(cm_diskcache_t *dcp); -int diskcache_New(); -cm_diskcache_t *diskcache_Find(cm_fid_t *fid, int chunk); -cm_diskcache_t *diskcache_Alloc(cm_fid_t *fid, int chunk, int dataVersion); -int diskcache_Read(cm_diskcache_t *dcp, char *buf, int size); -int diskcache_Write(cm_diskcache_t *dcp, char *buf, int size); - -#define complain printf - -#define OFFSET_TO_CHUNK(a) (LargeIntegerDivideByLong((a), cm_diskCacheChunkSize)) -#define GEN_CACHE_DIR_NAME(name, path, i) \ - sprintf(name, "%s\\D%07d", cm_cachePath, (i) / CACHE_FILES_PER_DIR) -#define GEN_CACHE_FILE_NAME(name, path, i) \ - sprintf(name, "%s\\D%07d\\C%07d", path, (i) / CACHE_FILES_PER_DIR, \ - (i) % CACHE_FILES_PER_DIR) - -/* Initialize the disk cache */ -int diskcache_Init() -{ - int i; - int rc; - int fd; - int invalid; - int index; - char *chunkBuf; - char tmpBuf[512]; - struct stat cacheInfoStat, chunkStat; - cm_cacheInfoHdr_t hdr; - cm_diskcache_t *dcp; - int validCount = 0; - - if (!cm_diskCacheEnabled) - return 0; - - cm_diskCacheChunkSize = buf_blockSize; - if (cm_diskCacheChunkSize % buf_blockSize != 0) - { - complain("Error: disk cache chunk size %d not a multiple of buffer size %d\n", - cm_diskCacheChunkSize, buf_blockSize); - return CM_ERROR_INVAL; - } - - /* alloc mem for chunk file control blocks */ - diskCBBuf = (cm_diskcache_t *) malloc(afs_diskCacheChunks * sizeof(cm_diskcache_t)); - if (diskCBBuf == NULL) - return CM_ERROR_SPACE; - memset(diskCBBuf, 0, afs_diskCacheChunks * sizeof(cm_diskcache_t)); - - /* alloc mem for hash table pointers */ - diskHashTable = (cm_diskcache_t **) malloc(afs_dhashsize * sizeof(cm_diskcache_t *)); - if (diskHashTable == NULL) - return CM_ERROR_SPACE; - memset(diskHashTable, 0, afs_dhashsize*sizeof(cm_diskcache_t *)); - - QInit(&diskLRUList); - QInit(&openFileList); - - /*sprintf(cacheInfoPath, "%s\\%s", cm_cachePath, CACHE_INFO_FILE);*/ - memset(cacheInfoPath, 0, 128); - DPRINTF("cm_cachePath=%s\n", cm_cachePath); - strncpy(cacheInfoPath, cm_cachePath, 50); - strcat(cacheInfoPath, "\\"); - strcat(cacheInfoPath, CACHE_INFO_FILE); - DPRINTF("cacheInfoPath=%s\n", cacheInfoPath); - - cacheInfo_fd = open(cacheInfoPath, O_RDWR | O_BINARY); - - if (cacheInfo_fd < 0) - { - /* file not present */ - return diskcache_New(); /* initialize new empty disk cache */ - } - - /* get stat of cache info file */ - rc = fstat(cacheInfo_fd, &cacheInfoStat); - - /* Check for valid header in cache info file */ - rc = read(cacheInfo_fd, &hdr, sizeof(cm_cacheInfoHdr_t)); - if (rc < sizeof(cm_cacheInfoHdr_t) || - hdr.magic != CACHE_INFO_MAGIC) - /*hdrp = (cm_cacheInfoHdr_t *) tmpBuf;*/ - { - close(cacheInfo_fd); - return diskcache_New(); - } - - if (hdr.chunks != afs_diskCacheChunks || - hdr.chunkSize != cm_diskCacheChunkSize) - { - /* print error message saying params don't match */ - return CM_ERROR_INVAL; - } - - chunkBuf = (char *) malloc(cm_diskCacheChunkSize); - if (chunkBuf == NULL) - return CM_ERROR_SPACE; - - /* read metadata from cache info file into control blocks */ - /* reconstruct hash chains based on fid, chunk */ - for (i = 0; i < afs_diskCacheChunks; i++) - { /* for all cache chunks */ - if (i % 500 == 0) - { - printf("%d...", i); - fflush(stdout); - } - dcp = &diskCBBuf[i]; - dcp->refCount = 0; - rc = read(cacheInfo_fd, &dcp->f, sizeof(struct fcache)); - if (rc < sizeof(struct fcache)) - { - /* print error message about reading cache info file */ - /* this isn't the right error code for a read error */ - return CM_ERROR_INVAL; - } - - if (dcp->f.index != i) - return CM_ERROR_INVAL; /* index should match position in cache info file */ - - /* Try to open cache file. This chunk will be invalidated if we can't - find the file, the file is newer than the cache info file, the file - size doesn't match the cache info file, or the file's header is - invalid. */ - GEN_CACHE_FILE_NAME(cacheFileName, cm_cachePath, i); -#if 1 - /*fd = open(cacheFileName, O_RDWR | O_BINARY); - if (fd < 0) invalid = 1; - else - { - rc = fstat(fd, &chunkStat);*/ - rc = stat(cacheFileName, &chunkStat); - - if (rc < 0) invalid = 1; - /*else if (cacheInfoStat.st_mtime < chunkStat.st_mtime + 120) invalid = 1;*/ - else if (cacheInfoStat.st_mtime < chunkStat.st_mtime) invalid = 1; - /*else if (cacheInfoStat.st_mtime < dcp->f.modTime + 120) invalid = 1;*/ - else if (cacheInfoStat.st_mtime < dcp->f.modTime) invalid = 1; - else if (cm_diskCacheChunkSize != chunkStat.st_size || - dcp->f.chunkBytes != chunkStat.st_size) invalid = 1; - /*else - {*/ - /*rc = read(fd, chunkBuf, cm_diskCacheChunkSize); - if (rc < 0) invalid = 1;*/ - - /*else - { - cacheFileHdrP = (cm_cacheFileHdr_t *) chunkBuf; - if (cacheFileHdrP->magic != CACHE_FILE_MAGIC || - cacheFileHdrP->index != i) - { - invalid = 1; - } - }*/ - /*}*/ - /*}*/ -#else - invalid = 0; -#endif - - if (invalid == 0) - { - /* Cache file seems to be valid */ - - validCount++; - DPRINTF("Found fid/chunk=%08x-%08x-%08x-%08x/%04d in slot=%d dcp=%x\n", - dcp->f.fid.cell, dcp->f.fid.volume, dcp->f.fid.vnode, - dcp->f.fid.unique, dcp->f.chunk, i, dcp); - /* Put control block in hash table */ - index = DCHash(&dcp->f.fid, dcp->f.chunk); - /*osi_QAdd(&diskHashTable[index], &dcp->f.hashq);*/ - - /* add to head of hash list. (we should probably look at - ord here instead. use queues?) */ - dcp->hash_next = diskHashTable[index]; - dcp->hash_prev = NULL; - if (diskHashTable[index]) diskHashTable[index]->hash_prev = dcp; - diskHashTable[index] = dcp; - - /* Add to LRU queue in access time order (lowest at tail) */ - QAddOrd(&diskLRUList, &dcp->lruq, dcp->f.accessOrd); - - close(fd); - } - else - { - /* Cache file is invalid */ - - /* Create the cache file with correct size */ - memset(chunkBuf, 0, cm_diskCacheChunkSize); - /*cacheFileHdrP->magic = CACHE_FILE_MAGIC; - cacheFileHdrP->index = i;*/ - - if (fd != 0) close(fd); - /* Note that if the directory this file is supposed to be in doesn't - exist, the creat call will fail and we will return an error. */ - /*fd = creat(cacheFileName, S_IRUSR|S_IWUSR);*/ - fd = open(cacheFileName, O_RDWR | O_BINARY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR); - if (fd < 0) return CM_ERROR_INVAL; /* couldn't create file */ - rc = write(fd, chunkBuf, cm_diskCacheChunkSize); - if (rc < 0) /* ran out of space? */ - return CM_ERROR_INVAL; - close(fd); - - /* We consider an invalid chunk as empty, so we put it at tail of LRU */ - memset(dcp, 0, sizeof(cm_diskcache_t)); - dcp->f.accessOrd = 0; - dcp->f.states = DISK_CACHE_EMPTY; - dcp->f.index = i; - dcp->f.chunkBytes = cm_diskCacheChunkSize; - /*osi_QAdd(diskLRUList, &dcp->lruq);*/ - QAddOrd(&diskLRUList, &dcp->lruq, dcp->f.accessOrd); /* head is LRU */ - - /* write out cache info modifications */ - lseek(cacheInfo_fd, -sizeof(struct fcache), SEEK_CUR); - write(cacheInfo_fd, &dcp->f, sizeof(struct fcache)); - } - } /* for all cache chunks */ - - free(chunkBuf); - /*close(cacheInfo_fd);*/ - fprintf(stderr, "\nFound %d of %d valid %d-byte blocks\n", validCount, - afs_diskCacheChunks, cm_diskCacheChunkSize); - - return 0; -} - -/* create empty disk cache files */ -/* assumes tables have already been malloc'd by diskcache_Init */ -int diskcache_New() -{ - int i; - int rc; - int fd; - int invalid; - int index; - /*char cacheInfoPath[256]; - char cacheFileName[256];*/ - char dirName[256]; - char *chunkBuf; - struct stat cacheInfoStat, chunkStat; - cm_cacheInfoHdr_t hdr; - cm_diskcache_t *dcp; - - sprintf(cacheInfoPath, "%s\\%s", cm_cachePath, CACHE_INFO_FILE); - /*cacheInfo_fd = creat(cacheInfoPath, S_IRUSR | S_IWUSR);*/ - cacheInfo_fd = open(cacheInfoPath, O_RDWR | O_BINARY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR); - if (cacheInfo_fd < 0) - { - complain("diskcache_New: Error creating cache info file in cache directory %s\n", - cm_cachePath); - return CM_ERROR_INVAL; - } - - /* write valid header */ - hdr.magic = CACHE_INFO_MAGIC; - hdr.chunks = afs_diskCacheChunks; - hdr.chunkSize = cm_diskCacheChunkSize; - rc = write(cacheInfo_fd, (char *) &hdr, sizeof(cm_cacheInfoHdr_t)); - if (rc < 0) - return CM_ERROR_INVAL; - - chunkBuf = (char *) malloc(cm_diskCacheChunkSize); - if (chunkBuf == NULL) - return CM_ERROR_SPACE; - memset(chunkBuf, 0, cm_diskCacheChunkSize); - - for (i = 0; i < afs_diskCacheChunks; i++) - { /* for all cache chunks */ - if (i % 500 == 0) - { - printf("%d...", i); - fflush(stdout); - } - - dcp = &diskCBBuf[i]; - - dcp->refCount = 0; - /* $$$: init mutex mx */ - memset(dcp, 0, sizeof(cm_diskcache_t)); - dcp->f.accessOrd = 0; - dcp->f.index = i; - dcp->f.states = DISK_CACHE_EMPTY; - dcp->f.chunkBytes = cm_diskCacheChunkSize; - QAddT(&diskLRUList, &dcp->lruq, dcp->f.accessOrd); /* head is LRU */ - rc = write(cacheInfo_fd, &dcp->f, sizeof(struct fcache)); - - if (i % CACHE_FILES_PER_DIR == 0) - { - GEN_CACHE_DIR_NAME(dirName, cm_cachePath, i); - rc = mkdir(dirName, S_IRUSR | S_IWUSR); - if (rc < 0 && errno != EEXIST) - { - complain("diskcache_New: Couldn't create cache directory %s\n", dirName); - return CM_ERROR_INVAL; - } - } - - GEN_CACHE_FILE_NAME(cacheFileName, cm_cachePath, i); - /*fd = creat(cacheFileName, S_IRUSR | S_IWUSR);*/ - fd = open(cacheFileName, O_RDWR | O_BINARY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR); - if (fd < 0) - { - if (errno == ENOSPC) - complain("diskcache_New: Not enough space in cache path to create file %s\n", - cacheFileName); - else - complain("diskcache_New: Couldn't create cache file %s\n", cacheFileName); - return CM_ERROR_INVAL; - } - - /*fileHdr.magic = CACHE_FILE_MAGIC; - fileHdr.index = i; - rc = write(fd, &fileHdr, sizeof(cm_cacheFileHdr_t)); /* maybe we should write - a full block? */ - /*if (rc == 0) - {*/ - rc = write(fd, chunkBuf, cm_diskCacheChunkSize); - /*}*/ - - if (rc < 0) - { - if (errno == ENOSPC) - complain("diskcache_New: Not enough space in cache path to write to file %s\n", - cacheFileName); - else - complain("diskcache_New: Couldn't write to cache file %s\n", - cacheFileName); - return CM_ERROR_INVAL; - } - - close(fd); - } /* for all cache chunks */ - - free(chunkBuf); - - /*close(cacheInfo_fd);*/ - - return 0; -} - -/* Get chunk from the cache or allocate a new chunk */ -int diskcache_Get(cm_fid_t *fid, osi_hyper_t *offset, char *buf, int size, int *dataVersion, int *dataCount, cm_diskcache_t **dcpRet) -{ - cm_diskcache_t *dcp; - int rc; - int chunk; - - - if (!cm_diskCacheEnabled) - { - *dcpRet = NULL; - return 0; - } - - chunk = OFFSET_TO_CHUNK(*offset); /* chunk number */ - - DPRINTF("diskcache_Get: fid/chunk=%08x-%08x-%08x-%08x/%04d\n", - fid->cell, fid->volume, fid->vnode, fid->unique, chunk); - - dcp = diskcache_Find(fid, chunk); - if (dcp != NULL) - { - rc = diskcache_Read(dcp, buf, size); - *dataVersion = dcp->f.dataVersion; /* update caller's data version */ - if (rc < 0) - return -1; - else - *dataCount = rc; - } - else - { - dcp = diskcache_Alloc(fid, chunk, *dataVersion); - if (dcp == NULL) - return -1; - } - - if (++updates >= CACHE_INFO_UPDATES_PER_WRITE) - { - updates = 0; - diskcache_WriteCacheInfo(dcp); /* update cache info for this slot */ - } - - *dcpRet = dcp; - /*printf("diskcache_Get: returning dcp=%x\n", dcp);*/ - return 0; -} - - -/* Look for a file chunk in the cache */ -cm_diskcache_t *diskcache_Find(cm_fid_t *fid, int chunk) -{ - int index; - cm_diskcache_t *dcp; - cm_diskcache_t *prev; - - index = DCHash(fid, chunk); - dcp = diskHashTable[index]; - prev = NULL; - - while (dcp != NULL) - { - if (cm_FidCmp(&dcp->f.fid, fid) == 0 && chunk == dcp->f.chunk) - { - dcp->f.accessOrd = accessOrd++; - /* Move it to the beginning of the list */ - if (diskHashTable[index] != dcp) - { - assert(dcp->hash_prev->hash_next == dcp); - dcp->hash_prev->hash_next = dcp->hash_next; - if (dcp->hash_next) - { - assert(dcp->hash_next->hash_prev == dcp); - dcp->hash_next->hash_prev = dcp->hash_prev; - } - dcp->hash_next = diskHashTable[index]; - dcp->hash_prev = NULL; - if (diskHashTable[index]) diskHashTable[index]->hash_prev = dcp; - diskHashTable[index] = dcp; - } - break; - } - prev = dcp; - dcp = dcp->hash_next; - } - - if (dcp) - DPRINTF("diskcache_Find: fid/chunk=%08x-%08x-%08x-%08x/%04d slot=%d hash=%d dcp=%x\n", - fid->cell, fid->volume, fid->vnode, fid->unique, chunk, dcp->f.index, index, dcp); - else - DPRINTF("diskcache_Find: fid/chunk=%08x/%04d not found\n", - fid->unique, chunk); - - return dcp; -} - -int diskcache_Read(cm_diskcache_t *dcp, char *buf, int size) -{ - char cacheFileName[256]; - int fd; - int rc; - int opened = 0; - - GEN_CACHE_FILE_NAME(cacheFileName, cm_cachePath, dcp->f.index); - - DPRINTF("diskcache_Read: filename=%s dcp=%x\n", cacheFileName, - dcp); - - /* For reads, we will use the fd if already open, but we won't leave - the file open. Note that if we use async I/O, we will need to - do locking to prevent someone from closing the file while I/O - is going on. But for now, all I/O is synchronous, and threads - are non-preemptible. */ - - if (dcp->openfd == 0) - { - fd = open(cacheFileName, O_RDWR | O_BINARY); - if (fd < 0) - { - complain("diskcache_Read: Couldn't open cache file %s\n", cacheFileName); - return -1; - } - opened = 1; - } - else - fd = dcp->openfd; - - if (fd < 0) - { - complain("diskcache_Read: Couldn't open cache file %s\n", cacheFileName); - return -1; - } - - rc = read(fd, buf, size); - if (rc < 0) - { - complain("diskcache_Read: Couldn't read cache file %s\n", cacheFileName); - close(fd); return -1; - } - - if (opened) - close(fd); /* close it if we opened it */ - return rc; /* bytes read */ -} - -/* Write out buffer to disk */ -int diskcache_Update(cm_diskcache_t *dcp, char *buf, int size, int dataVersion) -{ - if (!cm_diskCacheEnabled) - return 0; - - DPRINTF("diskcache_Update dcp=%x, dataVersion=%d\n", dcp, dataVersion); - diskcache_Write(dcp, buf, size); - /*diskcache_SetMRU(dcp);*/ - dcp->f.dataVersion = dataVersion; - /*dcp->f.accessOrd = accessOrd++;*/ - /*QMoveToTail(&diskLRUList, &dcp->lruq, dcp->f.accessOrd);*/ - - if (++updates >= CACHE_INFO_UPDATES_PER_WRITE) - { - updates = 0; - diskcache_WriteCacheInfo(dcp); /* update cache info */ - } - return 0; -} - -/* Allocate a new chunk file control block for this fid/chunk */ -cm_diskcache_t *diskcache_Alloc(cm_fid_t *fid, int chunk, int dataVersion) -{ - cm_diskcache_t *dcp; - QLink* q; - int index; - int stole=0, stolen_chunk, stolen_fid_unique; - - /* Remove LRU elt. (head) from free list */ - q = QServe(&diskLRUList); - if (q == NULL) - dcp = NULL; - else - dcp = (cm_diskcache_t *) MEM_TO_OBJ(cm_diskcache_t, lruq, q); - if (dcp == NULL) - { - DPRINTF("diskcache_Alloc: fid/chunk=%08x/%04d allocation failed\n", - fid->unique, chunk); - return NULL; - } - - /* Use this element for this fid/chunk */ - if (dcp->f.states == DISK_CACHE_USED) - { - /* Remove from old hash chain */ - if (dcp->hash_prev) - { - assert(dcp->hash_prev->hash_next == dcp); - dcp->hash_prev->hash_next = dcp->hash_next; - } - else - { - index = DCHash(&dcp->f.fid, dcp->f.chunk); - diskHashTable[index] = dcp->hash_next; - } - if (dcp->hash_next) - { - assert(dcp->hash_next->hash_prev == dcp); - dcp->hash_next->hash_prev = dcp->hash_prev; - } - - stole = 1; - stolen_chunk = dcp->f.chunk; - stolen_fid_unique = dcp->f.fid.unique; - } - - memcpy(&dcp->f.fid, fid, sizeof(cm_fid_t)); - dcp->f.chunk = chunk; - dcp->f.dataVersion = dataVersion; - dcp->f.accessOrd = accessOrd++; - dcp->f.states = DISK_CACHE_USED; - - /* allocate at head of new hash chain */ - index = DCHash(fid, chunk); - /*osi_QAddH(&diskHashTable[index], &dcp->hashq);*/ - dcp->hash_next = diskHashTable[index]; - dcp->hash_prev = NULL; - if (diskHashTable[index]) diskHashTable[index]->hash_prev = dcp; - diskHashTable[index] = dcp; - - /* put at tail of queue */ - QAddT(&diskLRUList, &dcp->lruq, dcp->f.accessOrd); - - if (stole) - DPRINTF("diskcache_Alloc: fid/chunk=%08x/%04d (recyc fid/chunk=%08x/%04d) " - "slot=%d hash=%d dcp=%x\n", - fid->unique, chunk, stolen_fid_unique, stolen_chunk, - dcp->f.index, index, dcp); - else - DPRINTF("diskcache_Alloc: fid/chunk=%08x/%04d slot=%d hash=%d dcp=%x\n", - fid->unique, chunk, dcp->f.index, index, dcp); - return dcp; -} - -/* Write this chunk to its disk file */ -int diskcache_Write(cm_diskcache_t *dcp, /*int bufferNum,*/ char *buf, int size) -{ - char cacheFileName[256]; - int fd; - int rc; - int opened = 0; - QLink *q; - - /*return 0;*/ - - DPRINTF("diskcache_Write\n"); - - /* write bytes of buf into chunk file */ - GEN_CACHE_FILE_NAME(cacheFileName, cm_cachePath, dcp->f.index); - if (dcp->openfd == 0) - { - dcp->openfd = open(cacheFileName, O_RDWR | O_BINARY); - if (dcp->openfd < 0) - { - dcp->openfd = 0; - complain("diskcache_Write: Couldn't open cache file %s\n", cacheFileName); - return -1; - } - opened = 1; - } - - /*lseek(dcp->openfd, bufferNum * buf_blockSize, SEEK_SET);*/ - /* only write size bytes */ - rc = write(dcp->openfd, buf, size); - if (rc < 0) - { - complain("diskcache_Write: Couldn't write cache file %s\n", cacheFileName); - close(dcp->openfd); dcp->openfd = 0; return rc; - } - - if (opened) - { - /* add to open file list */ - QAddT(&openFileList, &dcp->openq, 0); - openCacheFiles++; - } - else - QMoveToTail(&openFileList, &dcp->openq, 0); - - if (openCacheFiles >= MAX_OPEN_FILES) - { - /* close longest-open file */ - q = QServe(&openFileList); - dcp = (cm_diskcache_t *) MEM_TO_OBJ(cm_diskcache_t, openq, q); - assert(dcp != NULL); - if (dcp->openfd > 0) - close(dcp->openfd); - dcp->openfd = 0; - openCacheFiles--; - } - - return 0; -} - -/* we accessed this chunk (hit on buffer read), so move to MRU */ -void diskcache_Touch(cm_diskcache_t *dcp) -{ - if (!cm_diskCacheEnabled || !dcp) return; - dcp->f.accessOrd = accessOrd++; - QMoveToTail(&diskLRUList, &dcp->lruq, dcp->f.accessOrd); /* tail is MRU */ -} - -/* invalidate this disk cache entry */ -int diskcache_Invalidate(cm_diskcache_t *dcp) -{ - /* We consider an invalid chunk as empty, so we put it at tail of LRU */ - QRemove(&diskLRUList, &dcp->lruq); - - dcp->f.accessOrd = 0; - dcp->f.states = DISK_CACHE_EMPTY; - dcp->f.chunk = 0; - memset(&dcp->f.fid, sizeof(cm_fid_t)); - /*osi_QAdd(diskLRUList, &dcp->lruq);*/ - QAddH(&diskLRUList, &dcp->lruq, dcp->f.accessOrd); /* head is LRU */ -} - -void diskcache_WriteCacheInfo(cm_diskcache_t *dcp) -{ - /*char cacheInfoPath[256]; - int cacheInfo_fd;*/ - int rc; - - /*return; /* skip this for perf. testing */ - /*sprintf(cacheInfoPath, "%s\\%s", cm_cachePath, CACHE_INFO_FILE); - cacheInfo_fd = open(cacheInfoPath, O_RDWR);*/ - - DPRINTF("diskcache_WriteCacheInfo\n"); - - lseek(cacheInfo_fd, dcp->f.index * sizeof(struct fcache) + - sizeof(cm_cacheInfoHdr_t), SEEK_SET); - - rc = write(cacheInfo_fd, &dcp->f, sizeof(struct fcache)); - if (rc < 0) - complain("diskcache_WriteCacheInfo: Couldn't write cache info file, error=%d\n", errno); - /*fsync(cacheInfo_fd);*/ - - /*close(cacheInfo_fd);*/ -} - -void diskcache_Shutdown() -{ - cm_diskcache_t *dcp; - QLink *q; - - /* close cache info file */ - close (cacheInfo_fd); - - /* close all open cache files */ - q = QServe(&openFileList); - while (q) - { - dcp = (cm_diskcache_t *) MEM_TO_OBJ(cm_diskcache_t, openq, q); - if (dcp->openfd) - close(dcp->openfd); - q = QServe(&openFileList); - } -} - -#endif /* DISKCACHE95 */ diff --git a/src/WINNT/afsd/cm_diskcache95.h b/src/WINNT/afsd/cm_diskcache95.h deleted file mode 100644 index fa8c78367..000000000 --- a/src/WINNT/afsd/cm_diskcache95.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CM_DISKCACHE_H -#define CM_DISKCACHE_H - -#include "queue95.h" - -#define DCHash(v, c) ((((v)->vnode + (v)->volume + (c))) & (afs_dhashsize-1)) - -#define CACHE_INFO_FILE "cacheInfo" - -#define CACHE_INFO_MAGIC 0x34564321 -#define CACHE_FILE_MAGIC 0x78931230 -#define CACHE_FILES_PER_DIR 1000 -#define CACHE_INFO_UPDATES_PER_WRITE 1 - -#define DPRINTF if (0) printf - -/* kept on disk and in dcache entries */ -struct fcache { - cm_fid_t fid; /* Fid for this file */ - int32 modTime; /* last time this entry was modified */ - /*afs_hyper_t versionNo; /* Associated data version number */ - int dataVersion; - int chunk; /* Relative chunk number */ - int chunkBytes; /* Num bytes in this chunk */ - char states; /* Has this chunk been modified? */ - int accessOrd; /* change to 64 bit later */ -#define DISK_CACHE_EMPTY 0 -#define DISK_CACHE_USED 1 - int index; /* absolute chunk number */ - int checksum; - /*char pad[464]; /* pad up to 512 bytes */ -}; - -/* in-memory chunk file control block */ -typedef struct cm_diskcache { - struct fcache f; - - /*osi_queue_t lruq; - osi_queue_t hashq;*/ - QLink lruq; - QLink openq; - int openfd; /* open file descriptor */ - struct cm_diskcache *hash_next; - struct cm_diskcache *hash_prev; - unsigned long refCount; - osi_mutex_t mx; -} cm_diskcache_t; - -typedef struct cm_cacheInfoHdr { - int magic; - int chunks; /* total chunks in cache */ - int chunkSize; - char pad[500]; /* pad up to 512 bytes */ -} cm_cacheInfoHdr_t; - -typedef struct cm_cacheFileHdr { - int magic; - int index; -} cm_cacheFileHdr_t; - -/* external functions */ - -/* Initialize the disk cache */ -int diskcache_Init(); -/* Get chunk from the cache or allocate a new chunk */ -int diskcache_Get(cm_fid_t *fid, osi_hyper_t *offset, char *buf, int size, int *dataVersion, int *dataCount, cm_diskcache_t **dcpRet); -/* Write out buffer to disk */ -int diskcache_Update(cm_diskcache_t *dcp, char *buf, int size, int dataVersion); -/* we accessed this chunk, so move to MRU */ -void diskcache_Touch(cm_diskcache_t *dcp); - -#endif /* CM_DISKCACHE_H */ diff --git a/src/WINNT/afsd/cm_dnlc.c b/src/WINNT/afsd/cm_dnlc.c deleted file mode 100644 index eced524e5..000000000 --- a/src/WINNT/afsd/cm_dnlc.c +++ /dev/null @@ -1,655 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* -** This implements the directory to name cache lookup. -** Given a directory scache and a name, the dnlc returns the -** vcache corresponding to the name. The vcache entries that -** exist in the dnlc are not refcounted. -** -*/ - -#include -#include - -#ifndef DJGPP -#include -#include -#endif /* !DJGPP */ -#include -#include -#include -#include "afsd.h" - -osi_rwlock_t cm_dnlcLock; - -static cm_dnlcstats_t dnlcstats; /* dnlc statistics */ -static int cm_useDnlc = 1; /* yes, start using the dnlc */ -static int cm_debugDnlc = 0; /* debug dnlc */ - - -/* Hash table invariants: - * 1. If nameHash[i] is NULL, list is empty - * 2. A single element in a hash bucket has itself as prev and next. - */ -#ifndef DJGPP -#define dnlcNotify(x,debug){ \ - HANDLE hh; \ - char *ptbuf[1]; \ - ptbuf[0] = x; \ - if ( debug ) { \ - hh = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); \ - ReportEvent(hh,EVENTLOG_ERROR_TYPE,0,__LINE__, \ - NULL, 1, 0, ptbuf, NULL); \ - DeregisterEventSource(hh); \ - } \ - } -#else -#define dnlcNotify(x,debug) -#endif /* !DJGPP */ - -static cm_nc_t * -GetMeAnEntry() -{ - static unsigned int nameptr = 0; /* next bucket to pull something from */ - cm_nc_t *tnc; - int j; - - if (cm_data.ncfreelist) - { - tnc = cm_data.ncfreelist; - cm_data.ncfreelist = tnc->next; - return tnc; - } - - for (j=0; j= NHSIZE) - nameptr =0; - if (cm_data.nameHash[nameptr]) - break; - } - - tnc = cm_data.nameHash[nameptr]; - if (!tnc) - { - dnlcNotify("null tnc in GetMeAnEntry",1); - osi_Log0(afsd_logp,"null tnc in GetMeAnEntry"); - return 0; - } - - if (tnc->prev == tnc) - { /* only thing in list, don't screw around */ - cm_data.nameHash[nameptr] = (cm_nc_t *) 0; - return (tnc); - } - - tnc = tnc->prev; /* grab oldest one in this bucket */ - tnc->next->prev = tnc->prev;/* remove it from list */ - tnc->prev->next = tnc->next; - - return (tnc); -} - -static void -InsertEntry(tnc) - cm_nc_t *tnc; -{ - unsigned int key; - key = tnc->key & (NHSIZE -1); - - if (!cm_data.nameHash[key]) - { - cm_data.nameHash[key] = tnc; - tnc->next = tnc->prev = tnc; - } - else - { - tnc->next = cm_data.nameHash[key]; - tnc->prev = tnc->next->prev; - tnc->next->prev = tnc; - tnc->prev->next = tnc; - cm_data.nameHash[key] = tnc; - } -} - - -void -cm_dnlcEnter ( cm_scache_t *adp, - char *aname, - cm_scache_t *avc ) -{ - cm_nc_t *tnc; - unsigned int key, skey, new=0; - char *ts = aname; - int safety; - - if (!cm_useDnlc) - return ; - - if ( cm_debugDnlc ) - osi_Log3(afsd_logp,"cm_dnlcEnter dir %x name %s scache %x", - adp, osi_LogSaveString(afsd_logp,aname), avc); - - dnlcHash( ts, key ); /* leaves ts pointing at the NULL */ - if (ts - aname >= CM_AFSNCNAMESIZE) - return ; - skey = key & (NHSIZE -1); - - lock_ObtainWrite(&cm_dnlcLock); - dnlcstats.enters++; - - for (tnc = cm_data.nameHash[skey], safety=0; tnc; tnc = tnc->next, safety++ ) - if ((tnc->dirp == adp) && (!strcmp(tnc->name, aname))) - break; /* preexisting entry */ - else if ( tnc->next == cm_data.nameHash[skey]) /* end of list */ - { - tnc = NULL; - break; - } - else if (safety > NCSIZE) - { - dnlcstats.cycles++; - lock_ReleaseWrite(&cm_dnlcLock); - - dnlcNotify("DNLC cycle",1); - if ( cm_debugDnlc ) - osi_Log0(afsd_logp, "DNLC cycle"); - cm_dnlcPurge(); - return; - } - - if ( !tnc ) - { - new = 1; /* entry does not exist, we are creating a new entry*/ - tnc = GetMeAnEntry(); - } - if ( tnc ) - { - tnc->dirp = adp; - tnc->vp = avc; - tnc->key = key; - memcpy (tnc->name, aname, ts-aname+1); /* include the NULL */ - - if ( new ) /* insert entry only if it is newly created */ - InsertEntry(tnc); - - } - lock_ReleaseWrite(&cm_dnlcLock); - - if ( !tnc) - cm_dnlcPurge(); -} - -/* -* if the scache entry is found, return it held -*/ -cm_scache_t * -cm_dnlcLookup (cm_scache_t *adp, cm_lookupSearch_t* sp) -{ - cm_scache_t * tvc; - unsigned int key, skey; - char* aname = sp->searchNamep; - char *ts = aname; - cm_nc_t * tnc, * tnc_begin; - int safety, match; - - if (!cm_useDnlc) - return 0; - if ( cm_debugDnlc ) - osi_Log2(afsd_logp, "cm_dnlcLookup dir %x name %s", - adp, osi_LogSaveString(afsd_logp,aname)); - - dnlcHash( ts, key ); /* leaves ts pointing at the NULL */ - if (ts - aname >= CM_AFSNCNAMESIZE) - return 0; - - skey = key & (NHSIZE -1); - - lock_ObtainRead(&cm_dnlcLock); - dnlcstats.lookups++; /* Is a dnlcread lock sufficient? */ - - ts = 0; - tnc_begin = cm_data.nameHash[skey]; - for ( tvc = (cm_scache_t *) 0, tnc = tnc_begin, safety=0; - tnc; tnc = tnc->next, safety++ ) - { - if (tnc->dirp == adp) - { - if( cm_debugDnlc ) - osi_Log1(afsd_logp,"Looking at [%s]", - osi_LogSaveString(afsd_logp,tnc->name)); - - if ( sp->caseFold ) /* case insensitive */ - { - match = cm_stricmp(tnc->name, aname); - if ( !match ) /* something matches */ - { - tvc = tnc->vp; - ts = tnc->name; - - /* determine what type of match it is */ - if ( !strcmp(tnc->name, aname)) - { - /* exact match. */ - sp->ExactFound = 1; - - if( cm_debugDnlc ) - osi_Log1(afsd_logp,"DNLC found exact match [%s]", - osi_LogSaveString(afsd_logp,tnc->name)); - break; - } - else if ( cm_NoneUpper(tnc->name)) - sp->LCfound = 1; - else if ( cm_NoneLower(tnc->name)) - sp->UCfound = 1; - else - sp->NCfound = 1; - /* Don't break here. We might find an exact match yet */ - } - } - else /* case sensitive */ - { - match = strcmp(tnc->name, aname); - if ( !match ) /* found a match */ - { - sp->ExactFound = 1; - tvc = tnc->vp; - ts = tnc->name; - break; - } - } - } - if (tnc->next == cm_data.nameHash[skey]) - { /* end of list */ - break; - } - else if (tnc->next == tnc_begin || safety > NCSIZE) - { - dnlcstats.cycles++; - lock_ReleaseRead(&cm_dnlcLock); - - dnlcNotify("DNLC cycle",1); - if ( cm_debugDnlc ) - osi_Log0(afsd_logp, "DNLC cycle"); - cm_dnlcPurge(); - return(0); - } - } - - if(cm_debugDnlc && ts) { - osi_Log3(afsd_logp, "DNLC matched [%s] for [%s] with vnode[%ld]", - osi_LogSaveString(afsd_logp,ts), - osi_LogSaveString(afsd_logp,aname), - (long) tvc->fid.vnode); - } - - if (!tvc) - dnlcstats.misses++; /* Is a dnlcread lock sufficient? */ - else - { - sp->found = 1; - sp->fid.vnode = tvc->fid.vnode; - sp->fid.unique = tvc->fid.unique; - } - lock_ReleaseRead(&cm_dnlcLock); - - if (tvc) - cm_HoldSCache(tvc); - - if ( cm_debugDnlc && tvc ) - osi_Log1(afsd_logp, "cm_dnlcLookup found %x", tvc); - - return tvc; -} - - -static int -RemoveEntry (tnc, key) - cm_nc_t *tnc; - unsigned int key; -{ - if (!tnc->prev) /* things on freelist always have null prev ptrs */ - { - dnlcNotify("Bogus dnlc freelist", 1); - osi_Log0(afsd_logp,"Bogus dnlc freelist"); - return 1; /* error */ - } - - if (tnc == tnc->next) /* only one in list */ - cm_data.nameHash[key] = (cm_nc_t *) 0; - else - { - if (tnc == cm_data.nameHash[key]) - cm_data.nameHash[key] = tnc->next; - tnc->prev->next = tnc->next; - tnc->next->prev = tnc->prev; - } - - tnc->prev = (cm_nc_t *) 0; /* everything not in hash table has 0 prev */ - tnc->key = 0; /* just for safety's sake */ - return 0; /* success */ -} - - -void -cm_dnlcRemove ( adp, aname) - cm_scache_t *adp; - char *aname; -{ - unsigned int key, skey, error=0; - int found= 0, safety; - char *ts = aname; - cm_nc_t *tnc, *tmp; - - if (!cm_useDnlc) - return ; - - if ( cm_debugDnlc ) - osi_Log2(afsd_logp, "cm_dnlcRemove dir %x name %s", - adp, osi_LogSaveString(afsd_logp,aname)); - - dnlcHash( ts, key ); /* leaves ts pointing at the NULL */ - if (ts - aname >= CM_AFSNCNAMESIZE) - return ; - - skey = key & (NHSIZE -1); - lock_ObtainWrite(&cm_dnlcLock); - dnlcstats.removes++; - - for (tnc = cm_data.nameHash[skey], safety=0; tnc; safety++) - { - if ( (tnc->dirp == adp) && (tnc->key == key) - && !strcmp(tnc->name,aname) ) - { - tnc->dirp = (cm_scache_t *) 0; /* now it won't match anything */ - tmp = tnc->next; - error = RemoveEntry(tnc, skey); - if ( error ) - break; - - tnc->next = cm_data.ncfreelist; /* insert entry into freelist */ - cm_data.ncfreelist = tnc; - found = 1; /* found atleast one entry */ - - tnc = tmp; /* continue down the linked list */ - } - else if (tnc->next == cm_data.nameHash[skey]) /* end of list */ - break; - else - tnc = tnc->next; - if ( safety > NCSIZE ) - { - dnlcstats.cycles++; - lock_ReleaseWrite(&cm_dnlcLock); - - dnlcNotify("DNLC cycle",1); - if ( cm_debugDnlc ) - osi_Log0(afsd_logp, "DNLC cycle"); - cm_dnlcPurge(); - return; - } - } - lock_ReleaseWrite(&cm_dnlcLock); - - if (!found && !error && cm_debugDnlc) - osi_Log0(afsd_logp, "cm_dnlcRemove name not found"); - - if ( error ) - cm_dnlcPurge(); -} - -/* remove anything pertaining to this directory */ -void -cm_dnlcPurgedp (adp) - cm_scache_t *adp; -{ - int i; - int err=0; - - if (!cm_useDnlc) - return ; - - if ( cm_debugDnlc ) - osi_Log1(afsd_logp, "cm_dnlcPurgedp dir %x", adp); - - lock_ObtainWrite(&cm_dnlcLock); - dnlcstats.purgeds++; - - for (i=0; imagic != CM_DNLC_MAGIC) { - afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].next->magic != CM_DNLC_MAGIC", i); - fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].next->magic != CM_DNLC_MAGIC\n", i); - return -2; - } - if (cm_data.nameCache[i].prev && - cm_data.nameCache[i].prev->magic != CM_DNLC_MAGIC) { - afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].prev->magic != CM_DNLC_MAGIC", i); - fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].prev->magic != CM_DNLC_MAGIC\n", i); - return -3; - } - if (cm_data.nameCache[i].dirp && - cm_data.nameCache[i].dirp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].dirp->magic != CM_SCACHE_MAGIC", i); - fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].dirp->magic != CM_SCACHE_MAGIC\n", i); - return -4; - } - if (cm_data.nameCache[i].vp && - cm_data.nameCache[i].vp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].vp->magic != CM_SCACHE_MAGIC", i); - fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].vp->magic != CM_SCACHE_MAGIC\n", i); - return -5; - } - } - - // are the contents of the hash table intact? - for (i=0; inext != cm_data.nameHash[i] ? ncp->next : NULL) { - if (ncp->magic != CM_DNLC_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC\n"); - return -6; - } - if (ncp->prev && ncp->prev->magic != CM_DNLC_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC\n"); - return -7; - } - if (ncp->dirp && ncp->dirp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC\n"); - return -8; - } - if (ncp->vp && ncp->vp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC\n"); - return -9; - } - } - } - - // is the freelist stable? - if ( cm_data.ncfreelist ) { - for (ncp = cm_data.ncfreelist; ncp; - ncp = ncp->next != cm_data.ncfreelist ? ncp->next : NULL) { - if (ncp->magic != CM_DNLC_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC\n"); - return -10; - } - if (ncp->prev && ncp->prev->magic != CM_DNLC_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC\n"); - return -11; - } - if (ncp->dirp && ncp->dirp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC\n"); - return -12; - } - if (ncp->vp && ncp->vp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC"); - fprintf(stderr, "cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC\n"); - return -13; - } - } - } - - return 0; -} - -void -cm_dnlcInit(int newFile) -{ - int i; - - if (!cm_useDnlc) - return ; - - if ( cm_debugDnlc ) - osi_Log0(afsd_logp,"cm_dnlcInit"); - - memset (&dnlcstats, 0, sizeof(dnlcstats)); - - lock_InitializeRWLock(&cm_dnlcLock, "cm_dnlcLock"); - if ( newFile ) { - lock_ObtainWrite(&cm_dnlcLock); - cm_data.ncfreelist = (cm_nc_t *) 0; - cm_data.nameCache = cm_data.dnlcBaseAddress; - memset (cm_data.nameCache, 0, sizeof(cm_nc_t) * NCSIZE); - cm_data.nameHash = (cm_nc_t **) (cm_data.nameCache + NCSIZE); - memset (cm_data.nameHash, 0, sizeof(cm_nc_t *) * NHSIZE); - - for (i=0; i - -#define CM_AFSNCNAMESIZE 40 /* multiple of 8 (for 64-bit) */ -#define NCSIZE 512 -#define NHSIZE 256 /* must be power of 2 == CM_DIR_NHASHENT */ - -#define CM_DNLC_MAGIC ('D' | 'N' <<8 | 'L'<<16 | 'C'<<24) - -typedef struct nc { - afs_uint32 magic; - unsigned int key; - struct nc *next, *prev; - cm_scache_t *dirp, *vp; - unsigned char name[CM_AFSNCNAMESIZE]; -} cm_nc_t; - -typedef struct { - unsigned int enters, lookups, misses, removes; - unsigned int purgeds, purgevs, purgevols, purges; - unsigned int cycles, lookuprace; -} cm_dnlcstats_t; - -#define dnlcHash(ts, hval) for (hval=0; *ts; ts++) { \ - hval *= 173; \ - hval += cm_foldUpper[(unsigned char)(*ts)]; \ - } -extern void cm_dnlcEnter(cm_scache_t *adp, char *name, cm_scache_t *avc); -extern void cm_dnlcRemove(cm_scache_t *adp, char *name); -extern void cm_dnlcPurgedp(cm_scache_t *adp); -extern void cm_dnlcPurgevp(cm_scache_t *avc); -extern void cm_dnlcPurge(void); -extern void cm_dnlcPurgeVol(struct AFSFid *fidp); -extern void cm_dnlcInit(int); -extern long cm_dnlcShutdown(void); -extern cm_scache_t* cm_dnlcLookup(cm_scache_t *adp, cm_lookupSearch_t* sp); -extern long cm_dnlcValidate(void); diff --git a/src/WINNT/afsd/cm_dns.c b/src/WINNT/afsd/cm_dns.c deleted file mode 100644 index 7bb235cd2..000000000 --- a/src/WINNT/afsd/cm_dns.c +++ /dev/null @@ -1,783 +0,0 @@ -/* Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifdef AFS_AFSDB_ENV - -#include -#include -#include -#ifndef DJGPP -#include -#include -#endif -#include "cm_dns_private.h" -#include "cm_dns.h" -#include -#include -#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500) -#include -#define DNSAPI_ENV -#endif - -/*extern void afsi_log(char *pattern, ...);*/ - -extern int errno; -static char dns_addr[30]; -#ifdef DJGPP -extern char cm_confDir[]; -#endif -static int cm_dnsEnabled = -1; - -void DNSlowerCase(char *str) -{ - int i; - - for (i=0; i= 'A' && str[i] <= 'Z') - str[i] += 'a' - 'A'; -} - -int cm_InitDNS(int enabled) -{ -#ifndef DNSAPI_ENV - char configpath[100]; - int len; - int code; - char *addr; - - if (!enabled) { fprintf(stderr, "DNS support disabled\n"); cm_dnsEnabled = 0; return 0; } - - /* First try AFS_NS environment var. */ - addr = getenv("AFS_NS"); - if (addr && inet_addr(addr) != -1) { - strcpy(dns_addr, addr); - } else { - /* Now check for the AFSDNS.INI file */ -#ifdef DJGPP - strcpy(configpath, cm_confDir); -#elif defined(AFS_WIN95_ENV) - char *path = getenv("AFSCONF"); - if (path) strcpy(configpath, path); - else strcpy(configpath, "c:\\afscli"); -#else /* nt */ - code = GetWindowsDirectory(configpath, sizeof(configpath)); - if (code == 0 || code > sizeof(configpath)) return -1; -#endif - strcat(configpath, "\\afsdns.ini"); - - /* Currently we only get (and query) the first nameserver. Getting - list of mult. nameservers should be easy to do. */ - len = GetPrivateProfileString("AFS Domain Name Servers", "ns1", NULL, - dns_addr, sizeof(dns_addr), - configpath); - - if (len == 0 || inet_addr(dns_addr) == -1) { - fprintf(stderr, "No valid name server addresses found, DNS lookup is " - "disabled\n"); - cm_dnsEnabled = 0; /* failed */ - return -1; /* No name servers defined */ - } - else fprintf(stderr, "Found DNS server %s\n", dns_addr); - } -#endif /* DNSAPI_ENV */ - cm_dnsEnabled = 1; - return 0; -} - -#ifndef DNSAPI_ENV -SOCKADDR_IN setSockAddr(char *server, int port) -{ - SOCKADDR_IN sockAddr; - int addrLen = sizeof(SOCKADDR_IN); - -#ifndef WIN32_LEAN_AND_MEAN - bzero(&sockAddr,addrLen); -#endif /*WIN32_LEAN_AND_MEAN*/ - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons( port ); - sockAddr.sin_addr.s_addr = inet_addr( server ); - /*inet_aton(server, &sockAddr.sin_addr.s_addr);*/ - - return (sockAddr); -} - -int getRRCount(PDNS_HDR ptr) -{ - return(ntohs(ptr->rr_count)); -} - - -int send_DNS_Addr_Query(char* query, - SOCKET commSock, SOCKADDR_IN sockAddr, char *buffer) -{ - PDNS_HDR pDNShdr; - PDNS_QTAIL pDNS_qtail; - - int queryLen = 0; - int res; - -#ifndef WIN32_LEAN_AND_MEAN - bzero(buffer,BUFSIZE); -#endif /*WIN32_LEAN_AND_MEAN*/ - - /********************************* - * Build DNS Query Message * - * * - * hard-coded Adrress (A) query * - *********************************/ - - pDNShdr = (PDNS_HDR)&( buffer[ 0 ] ); - pDNShdr->id = htons( 0xDADE ); - pDNShdr->flags = htons( DNS_FLAG_RD ); /* do recurse */ - pDNShdr->q_count = htons( 1 ); /* one query */ - pDNShdr->rr_count = 0; /* none in query */ - pDNShdr->auth_count = 0; /* none in query */ - pDNShdr->add_count = 0; /* none in query */ - - queryLen = putQName( query, &(buffer[ DNS_HDR_LEN ] ) ); - queryLen += DNS_HDR_LEN; /* query Length is just after the query name and header */ -#ifdef DEBUG - fprintf(stderr, "send_DNS_Addr: query=%s, queryLen=%d\n", query, queryLen); -#endif - - - pDNS_qtail = (PDNS_QTAIL) &(buffer[ queryLen ]); - pDNS_qtail->qtype = htons(255);/*htons(DNS_RRTYPE_A); */ - pDNS_qtail->qclass = htons(DNS_RRCLASS_IN); - queryLen += DNS_QTAIL_LEN; - - /************************** - * Send DNS Query Message * - **************************/ - - - res = sendto( commSock, - buffer, - queryLen, - 0, - (struct sockaddr *) &sockAddr, - sizeof( SOCKADDR_IN ) ); - - /*dumpSbuffer(buffer,queryLen);*/ - - if ( res < 0 ) - { -#ifdef DEBUG - fprintf(stderr, "send_DNS_Addr_Query: error %d, errno %d\n", res, errno); - fprintf(stderr, "sendto() failed \n"); -#endif - return ( -1 ); - } - else - { - /*printf( "sendto() succeeded\n");*/ - ; - } /* end if */ - - return(0); -} - - -int send_DNS_AFSDB_Query(char* query, - SOCKET commSock, SOCKADDR_IN sockAddr, char *buffer) -{ - /*static char buffer[BUFSIZE];*/ - - PDNS_HDR pDNShdr; - PDNS_QTAIL pDNS_qtail; - - int queryLen = 0; - int res; - -#ifndef WIN32_LEAN_AND_MEAN - bzero(buffer,BUFSIZE); -#endif /*WIN32_LEAN_AND_MEAN*/ - - /*************************** - * Build DNS Query Message * - * * - * hard-coded AFSDB query * - ***************************/ - - pDNShdr = (PDNS_HDR)&( buffer[ 0 ] ); - pDNShdr->id = htons( 0xDEAD ); - pDNShdr->flags = htons( DNS_FLAG_RD ); /* do recurse */ - pDNShdr->q_count = htons( 1 ); /* one query */ - pDNShdr->rr_count = 0; /* none in query */ - pDNShdr->auth_count = 0; /* none in query */ - pDNShdr->add_count = 0; /* none in query */ - - queryLen = putQName( query, &(buffer[ DNS_HDR_LEN ] ) ); - queryLen += DNS_HDR_LEN; /* query Length is just after the query name and header */ - - - pDNS_qtail = (PDNS_QTAIL) &(buffer[ queryLen ]); - pDNS_qtail->qtype = htons(DNS_RRTYPE_AFSDB); - pDNS_qtail->qclass = htons(DNS_RRCLASS_IN); - queryLen += DNS_QTAIL_LEN; - - /************************** - * Send DNS Query Message * - **************************/ - - res = sendto( commSock, - buffer, - queryLen, - 0, - (struct sockaddr *) &sockAddr, - sizeof( SOCKADDR_IN ) ); - - /*dumpSbuffer(buffer,queryLen);*/ - - if ( res < 0 ) - { -#ifdef DEBUG - fprintf(stderr, "send_DNS_AFSDB_Query: error %d, errno %d\n", res, errno); - fprintf(stderr, "sendto() failed \n"); -#endif /* DEBUG */ - return ( -1 ); - } - else - { - /*printf( "sendto() succeeded\n");*/ - ; - } /* end if */ - - return(0); -} - - -PDNS_HDR get_DNS_Response(SOCKET commSock, SOCKADDR_IN sockAddr, char *buffer) -{ - /*static char buffer[BUFSIZE];*/ - - int addrLen = sizeof(SOCKADDR_IN); - int size; - -#ifndef WIN32_LEAN_AND_MEAN - bzero(buffer,BUFSIZE); -#endif /*WIN32_LEAN_AND_MEAN*/ - - /***************************** - * Receive DNS Reply Message * - *****************************/ - - /*printf( "calling recvfrom() on connected UDP socket\n" );*/ - - size = recvfrom( commSock, - buffer, - BUFSIZE, - 0, - (struct sockaddr *) &sockAddr, - &addrLen ); - if (size < 0) { fprintf(stderr, "recvfrom error %d\n", errno); return NULL; } - - /*dumpRbuffer(buffer,res);*/ - -#ifdef DEBUG - fprintf(stderr, "recvfrom returned %d bytes from %s: \n", - size, inet_ntoa( sockAddr.sin_addr ) ); -#endif /* DEBUG */ - - return((PDNS_HDR)&( buffer[ 0 ] )); - -} - - -int putQName( char *pHostName, char *pQName ) -{ - int i; - char c; - int j = 0; - int k = 0; - - DNSlowerCase(pHostName); - /*printf( "Hostname: [%s]\n", pHostName );*/ - - for ( i = 0; *( pHostName + i ); i++ ) - { - c = *( pHostName + i ); /* get next character */ - - - if ( c == '.' ) - { - /* dot encountered, fill in previous length */ - if (k!=0){ /*don't process repeated dots*/ - /*printf( "%c", c );*/ - *( pQName + j ) = k; - j = j+k+1; /* set index to next counter */ - k = 0; /* reset segment length */ - } - } - else - { - /*printf( "%c", c );*/ - *( pQName + j + k + 1 ) = c; /* assign to QName */ - k++; /* inc count of seg chars */ - } /* end if */ - } /* end for loop */ - - *(pQName + j ) = k; /* count for final segment */ - - *(pQName + j + k + 1 ) = 0; /* count for trailing NULL segment is 0 */ - - /*printf( "\n" ); */ - - if (c == '.') - return ( j + k + 1 ); /* return total length of QName */ - else - return ( j + k + 2 ); -} /* end putQName() */ - - -u_char * skipRRQName(u_char *pQName) -{ - u_char *ptr; - u_char c; - - ptr = pQName; - c = *ptr; - while (c) { - if ( c >= 0xC0 ) { - /* skip the 'compression' pointer */ - ptr = ptr+1; - c = '\0'; - } else { - /* skip a normal qname segment */ - ptr += *ptr; - ptr++; - c = *ptr; - }; - }; - - /* ptr now pointing at terminating zero of query QName, - or the pointer for the previous occurrence - (compression) - */ - ptr++; - - return (ptr); -} /* end skipRRQName() */ - - - -u_char * printRRQName( u_char *pQName, PDNS_HDR buffer ) -{ - u_short i, k; - u_char *buffPtr = (u_char *) buffer; - u_char *namePtr; - u_char *retPtr; - u_char c; - - - namePtr = pQName; - retPtr = 0; - - for ( i = 0; i < BUFSIZE; i++ ) - { - c = *namePtr; - if ( c >= 0xC0 ) { - c = *(namePtr + 1); - retPtr = namePtr+2; - namePtr = buffPtr+c; - } else { - if ( c == 0 ) - break; - - for ( k = 1; k <= c; k++ ) - { - fprintf(stderr, "%c", *( namePtr + k ) ); - } /* end for loop */ - fprintf(stderr,"."); - namePtr += k; - } - } /* end for loop */ - fprintf(stderr,"\n"); - namePtr++; /* skip terminating zero */ - - if (retPtr) - return(retPtr); - else - return(namePtr); - -} /* end printRRQName() */ - - -u_char * sPrintRRQName( u_char *pQName, PDNS_HDR buffer, char *str ) -{ - u_short i, k; - u_char *buffPtr = (u_char *) buffer; - u_char *namePtr; - u_char *retPtr; - u_char c; - - char section[64]; - - strcpy(str,""); - namePtr = pQName; - retPtr = 0; - - for ( i = 0; i < BUFSIZE; i++ ) - { - c = *namePtr; - if ( c >= 0xC0 ) { - c = *(namePtr + 1); - retPtr = namePtr+2; - namePtr = buffPtr+c; - } else { - if ( c == 0 ) - break; - - for ( k = 1; k <= c; k++ ) - { - sprintf(section,"%c", *( namePtr + k ) ); - strcat(str,section); - } /* end for loop */ - strcat(str,"."); - namePtr += k; - } - } /* end for loop */ - namePtr++; /* skip terminating zero */ - - if (retPtr) - return(retPtr); - else - return(namePtr); - -} /* end sPrintRRQName() */ - - -void printReplyBuffer_AFSDB(PDNS_HDR replyBuff) -{ - u_char *ptr = (u_char *) replyBuff; - int answerCount = ntohs((replyBuff)->rr_count); - u_char i; - PDNS_AFSDB_RR_HDR - rrPtr; - - ptr += DNS_HDR_LEN; - - /* ptr now pointing at start of QName in query field */ - ptr = skipRRQName(ptr); - - - /* skip the query type and class fields */ - ptr+= DNS_QTAIL_LEN; - - /* ptr should now be at the start of the answer RR sections */ - - fprintf(stderr,"---------------------------------\n"); - for (i=0; irr_afsdb_class) == 1) { - fprintf(stderr,"AFDB class %d -> ",ntohs(rrPtr->rr_afsdb_class)); - ptr = printRRQName(ptr,replyBuff); } - else - ptr = skipRRQName(ptr); - }; - fprintf(stderr,"---------------------------------\n"); - - -}; - -void processReplyBuffer_AFSDB(SOCKET commSock, PDNS_HDR replyBuff, int *cellHostAddrs, char cellHostNames[][MAXHOSTCHARS], int *numServers, int *ttl) - /*PAFS_SRV_LIST (srvList)*/ -{ - u_char *ptr = (u_char *) replyBuff; - int answerCount = ntohs((replyBuff)->rr_count); - u_char i; - PDNS_AFSDB_RR_HDR - rrPtr; - int srvCount = 0; - char hostName[256]; - struct in_addr addr; - int rc; - - ptr += DNS_HDR_LEN; - - /* ptr now pointing at start of QName in query field */ - ptr = skipRRQName(ptr); - - - /* skip the query type and class fields */ - ptr+= DNS_QTAIL_LEN; - - /* ptr should now be at the start of the answer RR sections */ - - answerCount = MIN(answerCount, AFSMAXCELLHOSTS); -#ifdef DEBUG - fprintf(stderr, "processRep_AFSDB: answerCount=%d\n", answerCount); -#endif /* DEBUG */ - - for (i=0; irr_afsdb_class) == 1) && - (srvCount < MAX_AFS_SRVS)) { - /*ptr = sPrintRRQName(ptr,replyBuff,srvList->host[srvList->count]);*/ - ptr = sPrintRRQName(ptr,replyBuff,hostName); - /*ptr = printRRQName(ptr,replyBuff);*/ - *ttl = ntohl(rrPtr->rr_ttl); - -#ifdef DEBUG - fprintf(stderr, "resolving name %s\n", hostName); -#endif - /* resolve name from DNS query */ - rc = DNSgetAddr(commSock, hostName, &addr); - if (rc < 0) - continue; /* skip this entry */ -#ifdef DEBUG - fprintf(stderr, "processRep_AFSDB: resolved name %s to addr %x\n", hostName, addr); -#endif /* DEBUG */ - memcpy(&cellHostAddrs[srvCount], &addr.s_addr, sizeof(addr.s_addr)); - strncpy(cellHostNames[srvCount], hostName, MAXCELLCHARS); - cellHostNames[srvCount][MAXCELLCHARS-1] = '\0'; - srvCount++; - } - else { - ptr = skipRRQName(ptr); - } - } - - *numServers = srvCount; - -} - - -u_char * processReplyBuffer_Addr(PDNS_HDR replyBuff) -{ - u_char *ptr = (u_char *) replyBuff; - int answerCount = ntohs((replyBuff)->rr_count); - PDNS_A_RR_HDR - rrPtr; - -#ifdef DEBUG - fprintf(stderr, "processReplyBuffer_Addr: answerCount=%d\n", answerCount); -#endif /* DEBUG */ - if (answerCount == 0) return 0; - - ptr += DNS_HDR_LEN; - - /* ptr now pointing at start of QName in query field */ - ptr = skipRRQName(ptr); - - - /* skip the query type and class fields */ - ptr+= DNS_QTAIL_LEN; - - /* ptr should now be at the start of the answer RR sections */ - ptr = skipRRQName(ptr); - rrPtr = (PDNS_A_RR_HDR) ptr; - -#ifdef DEBUG - fprintf(stderr, "type:%d, class:%d, ttl:%d, rdlength:%d\n", - ntohs(rrPtr->rr_type),ntohs(rrPtr->rr_class), - ntohl(rrPtr->rr_ttl),ntohs(rrPtr->rr_rdlength)); - fprintf(stderr, "Count %d\tand Answer %8x\n",answerCount,rrPtr->rr_addr); -#endif /* DEBUG */ - - ptr += DNS_A_RR_HDR_LEN; - - return (ptr); - -}; - -int DNSgetAddr(SOCKET commSock, char *hostName, struct in_addr *iNet) -{ - /* Variables for DNS message parsing and creation */ - PDNS_HDR pDNShdr; - - SOCKADDR_IN sockAddr; - char buffer[BUFSIZE]; - u_char *addr; - u_long *aPtr; - int rc; - - /********************** - * Get a DGRAM socket * - **********************/ - - sockAddr = setSockAddr(dns_addr, DNS_PORT); - - rc = send_DNS_Addr_Query(hostName,commSock,sockAddr, buffer); - if (rc < 0) return rc; - pDNShdr = get_DNS_Response(commSock,sockAddr, buffer); - if (pDNShdr == NULL) - return -1; - - addr = processReplyBuffer_Addr(pDNShdr); - if (addr == 0) - return -1; - - aPtr = (u_long *) addr; - - iNet->s_addr = *aPtr; - - return(0); -} -#endif /* DNSAPI_ENV */ - -int getAFSServer(char *cellName, int *cellHostAddrs, char cellHostNames[][MAXHOSTCHARS], - int *numServers, int *ttl) -{ -#ifndef DNSAPI_ENV - /*static AFS_SRV_LIST srvList; - static int ans = 0;*/ - SOCKET commSock; - SOCKADDR_IN sockAddr; - PDNS_HDR pDNShdr; - char buffer[BUFSIZE]; - char query[1024]; - int rc; - -#ifdef DEBUG - fprintf(stderr, "getAFSServer: cell %s, cm_dnsEnabled=%d\n", cellName, cm_dnsEnabled); -#endif - -#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) - if (cm_dnsEnabled == -1) { /* not yet initialized, eg when called by klog */ - cm_InitDNS(1); /* assume enabled */ - } -#endif - if (cm_dnsEnabled == 0) { /* possibly we failed in cm_InitDNS above */ - fprintf(stderr, "DNS initialization failed, disabled\n"); - *numServers = 0; - return -1; - } - - sockAddr = setSockAddr(dns_addr, DNS_PORT); - - commSock = socket( AF_INET, SOCK_DGRAM, 0 ); - if ( commSock < 0 ) - { - /*afsi_log("socket() failed\n");*/ - fprintf(stderr, "getAFSServer: socket() failed, errno=%d\n", errno); - *numServers = 0; - return (-1); - } - -#ifdef DJGPP - /* the win95 sock.vxd will not allow sendto for unbound sockets, - * so just bind to nothing and it works */ - - __djgpp_set_socket_blocking_mode(commSock, 0); - bind(commSock,0,sizeof( SOCKADDR_IN ) ); -#endif /* DJGPP */ - - strncpy(query, cellName, 1024); - query[1023] = 0; - if (query[strlen(query)-1] != '.') { - strncat(query,".",1024); - query[1023] = 0; - } - - rc = send_DNS_AFSDB_Query(cellName,commSock,sockAddr, buffer); - if (rc < 0) { - fprintf(stderr,"getAFSServer: send_DNS_AFSDB_Query failed\n"); - *numServers = 0; - return -1; - } - - pDNShdr = get_DNS_Response(commSock,sockAddr, buffer); - - /*printReplyBuffer_AFSDB(pDNShdr);*/ - if (pDNShdr) - processReplyBuffer_AFSDB(commSock, pDNShdr, cellHostAddrs, cellHostNames, numServers, ttl); - else - *numServers = 0; - - closesocket(commSock); - if (*numServers == 0) - return(-1); - - else - return 0; -#else /* DNSAPI_ENV */ - PDNS_RECORD pDnsCell, pDnsIter, pDnsVol,pDnsVolIter, pDnsCIter; - DWORD i; - struct sockaddr_in vlSockAddr; - - *numServers = 0; - *ttl = 0; - - /* query the AFSDB records of cell */ - if (DnsQuery_A(cellName, DNS_TYPE_AFSDB, DNS_QUERY_STANDARD, NULL, &pDnsCell, NULL) == ERROR_SUCCESS) { - - memset((void*) &vlSockAddr, 0, sizeof(vlSockAddr)); - - /* go through the returned records */ - for (pDnsIter = pDnsCell;pDnsIter; pDnsIter = pDnsIter->pNext) { - /* if we find an AFSDB record with Preference set to 1, we found a volserver */ - if (pDnsIter->wType == DNS_TYPE_AFSDB && pDnsIter->Data.Afsdb.wPreference == 1) { - strncpy(cellHostNames[*numServers], pDnsIter->Data.Afsdb.pNameExchange, MAXHOSTCHARS); - cellHostNames[*numServers][MAXHOSTCHARS-1]='\0'; - (*numServers)++; - - if (!*ttl) - *ttl = pDnsIter->dwTtl; - if (*numServers == AFSMAXCELLHOSTS) - break; - } - } - - for (i=0;i<*numServers;i++) - cellHostAddrs[i] = 0; - - /* now check if there are any A records in the results */ - for (pDnsIter = pDnsCell; pDnsIter; pDnsIter = pDnsIter->pNext) { - if(pDnsIter->wType == DNS_TYPE_A) - /* check if its for one of the volservers */ - for (i=0;i<*numServers;i++) - if(stricmp(pDnsIter->pName, cellHostNames[i]) == 0) - cellHostAddrs[i] = pDnsIter->Data.A.IpAddress; - } - - for (i=0;i<*numServers;i++) { - /* if we don't have an IP yet, then we should try resolving the volserver hostname - in a separate query. */ - if (!cellHostAddrs[i]) { - if (DnsQuery_A(cellHostNames[i], DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, &pDnsVol, NULL) == ERROR_SUCCESS) { - for (pDnsVolIter = pDnsVol; pDnsVolIter; pDnsVolIter=pDnsVolIter->pNext) { - /* if we get an A record, keep it */ - if (pDnsVolIter->wType == DNS_TYPE_A && stricmp(cellHostNames[i], pDnsVolIter->pName)==0) { - cellHostAddrs[i] = pDnsVolIter->Data.A.IpAddress; - break; - } - /* if we get a CNAME, look for a corresponding A record */ - if (pDnsVolIter->wType == DNS_TYPE_CNAME && stricmp(cellHostNames[i], pDnsVolIter->pName)==0) { - for (pDnsCIter=pDnsVolIter; pDnsCIter; pDnsCIter=pDnsCIter->pNext) { - if (pDnsCIter->wType == DNS_TYPE_A && stricmp(pDnsVolIter->Data.CNAME.pNameHost, pDnsCIter->pName)==0) { - cellHostAddrs[i] = pDnsCIter->Data.A.IpAddress; - break; - } - } - if (cellHostAddrs[i]) - break; - /* TODO: if the additional section is missing, then do another lookup for the CNAME */ - } - } - /* we are done with the volserver lookup */ - DnsRecordListFree(pDnsVol, DnsFreeRecordListDeep); - } - } - } - DnsRecordListFree(pDnsCell, DnsFreeRecordListDeep); - } - - if ( *numServers > 0 ) - return 0; - else - return -1; -#endif /* DNSAPI_ENV */ -} - -#endif /* AFS_AFSDB_ENV */ diff --git a/src/WINNT/afsd/cm_dns.h b/src/WINNT/afsd/cm_dns.h deleted file mode 100644 index 6bfa381e7..000000000 --- a/src/WINNT/afsd/cm_dns.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Well-known DNS port is 53 (for both TCP and UDP, - although UDP is typically the only one used) */ - -#define DNS_PORT 53 - -/* this function will continue to return cell server - names for the given cell, ending in null */ -int getAFSServer(char *cellname, int *cellHostAddrs, char cellHostNames[][MAXHOSTCHARS], int *numServers, int *ttl); - -/* a supplement for the DJGPP gethostbyname ... which - never bothers calling a DNS server ... so this function - takes care of that. This should be called when you - failed with gethostbyname (as that WILL check for - dotted decimal, and local hostfile) */ - -struct hostent *DNSgetHostByName(char *hostname); - - - diff --git a/src/WINNT/afsd/cm_dns_private.h b/src/WINNT/afsd/cm_dns_private.h deleted file mode 100644 index 1344fe0dc..000000000 --- a/src/WINNT/afsd/cm_dns_private.h +++ /dev/null @@ -1,217 +0,0 @@ -/* Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __DNS_AFS_private_h_env_ -#define __DNS_AFS_private_h_env_ - -#ifdef DJGPP -#include -#include -#include -#include -/*#else - #include */ -#endif - -#ifdef KERNEL -#define SOCKET struct osi_socket * -#else -#define SOCKET int -#endif - -#define SOCKADDR_IN struct sockaddr_in - -#include -#include - - -#ifdef DJGPP - -char *inet_ntoa(struct in_addr in) -{ - static char out[256]; - char temp[20]; - unsigned long sVal,pVal; - - out[0] = '\0'; - - - pVal = ntohl(in.s_addr); - - sVal = pVal; - sVal >>= 24; - sprintf(out,"%ld",sVal); - - sVal = pVal; - sVal <<= 8; - sVal >>= 24; - sprintf(out,"%s.%ld",out,sVal); - - sVal = pVal; - sVal <<= 16; - sVal >>= 24; - sprintf(out,"%s.%ld",out,sVal); - - sVal = pVal; - sVal <<= 24; - sVal >>= 24; - sprintf(out,"%s.%ld",out,sVal); - - return(&out[0]); -} - -unsigned long inet_addr(const char *cp) -{ - - unsigned long val=0; - unsigned char sVal; - - char cp2[256]; - - char* ptr = cp2; - int i; - int len; - - strcpy(cp2,cp); - - for (i=0; i<=strlen(cp); i++) - { - if (cp2[i] == '.') - { - cp2[i] = '\0'; - sVal = atoi(ptr); - ptr = &cp2[i+1]; - val = val << 8; - val &= 0xffffff00; - val |= sVal; - //printf("%x\t%lx\n",sVal,val); - }; - }; - sVal = atoi(ptr); - val = val << 8; - val &= 0xffffff00; - val |= sVal; - //printf("%x\t%lx\n",sVal,val); - - return htonl(val); -} - -#endif /* DJGPP */ - -#define BUFSIZE 2048 - -/* - * AFS Server List (a list of host names and their count) - */ -#define MAX_AFS_SRVS 20 -typedef struct afs_srvlist -{ - unsigned short count; /* number of host names */ - char host[MAX_AFS_SRVS][256];/* array of hosts*/ -} AFS_SRV_LIST, *PAFS_SRV_LIST; - - -/* - * DNS Message Header - */ -typedef struct dns_hdr -{ - unsigned short id; /* client query ID number */ - unsigned short flags; /* qualify contents */ - unsigned short q_count; /* number of questions */ - unsigned short rr_count; /* number of answer RRs */ - unsigned short auth_count; /* number of authority RRs */ - unsigned short add_count; /* number of additional RRs */ -} DNS_HDR, *PDNS_HDR; - -#define DNS_HDR_LEN sizeof(DNS_HDR) - - - -/* THESE WERE ALSO WRONG !!!! */ -#define DNS_FLAG_RD 0x0100 - -/* - * DNS query class and response type for the tail of the query packet - */ -typedef struct dns_qtail -{ - unsigned short qtype; /* Query type (2bytes) - for responses */ - unsigned short qclass; /* Query Class (2bytes) - for questions */ -} DNS_QTAIL, *PDNS_QTAIL; - -#define DNS_QTAIL_LEN sizeof(DNS_QTAIL) - -/* DNS Generic Resource Record format (from RFC 1034 and 1035) - * - * NOTE: The first field in the DNS RR Record header is always - * the domain name in QNAME format (see earlier description) - */ -typedef struct dns_rr_hdr -{ - unsigned short rr_type; /* RR type code (e.g. A, MX, NS, etc.) */ - unsigned short rr_class; /* RR class code (IN for Internet) */ - unsigned long rr_ttl; /* Time-to-live for resource */ - unsigned short rr_rdlength; /* length of RDATA field (in octets) */ -} DNS_RR_HDR, *PDNS_RR_HDR; - -#define DNS_RR_HDR_LEN sizeof(DNS_RR_HDR) - -#define DNS_RRTYPE_A 1 -#define DNS_RRTYPE_NS 2 -#define DNS_RRTYPE_CNAME 5 -#define DNS_RRTYPE_SOA 6 -#define DNS_RRTYPE_WKS 11 -#define DNS_RRTYPE_PTR 12 -#define DNS_RRTYPE_HINFO 13 -#define DNS_RRTYPE_MX 15 -#define DNS_RRTYPE_AFSDB 18 - - -#define DNS_RRCLASS_IN 1 // Internet -#define DNS_RRCLASS_CS 2 // CSNET -#define DNS_RRCLASS_CH 3 // CHAOS Net -#define DNS_RRCLASS_HS 4 // Hesiod -#define DNS_RRCLASS_WILD 255 // WildCard - all classes - -/* - * DNS AFSDB Resource Data Field - */ -typedef struct dns_afsdb_rr_hdr -{ - unsigned short rr_type; /* RR type code (e.g. A, MX, NS, etc.) */ - unsigned short rr_class; /* RR class code (IN for Internet) */ - unsigned long rr_ttl; /* Time-to-live for resource */ - unsigned short rr_rdlength; /* length of RDATA field (in octets) */ - unsigned short rr_afsdb_class; /* 1-AFS , 2-DCE */ -} DNS_AFSDB_RR_HDR, *PDNS_AFSDB_RR_HDR; - -#define DNS_AFSDB_RR_HDR_LEN sizeof(DNS_AFSDB_RR_HDR) - -/* - * DNS A Resource Data Field - */ -typedef struct dns_a_rr_hdr -{ - unsigned short rr_type; /* RR type code (e.g. A, MX, NS, etc.) */ - unsigned short rr_class; /* RR class code (IN for Internet) */ - unsigned long rr_ttl; /* Time-to-live for resource */ - unsigned short rr_rdlength; /* length of RDATA field (in octets) */ - unsigned long rr_addr; /* Resolved host address */ -} DNS_A_RR_HDR, *PDNS_A_RR_HDR; - -#define DNS_A_RR_LEN 14 //sizeof(DNS_A_RR_HDR) -#define DNS_A_RR_HDR_LEN 10 //(DNS_A_RR_LEN - sizeof(unsigned long)) - -int putQName( char *pszHostName, char *pQName ); -unsigned char * printRRQName( unsigned char *pQName, PDNS_HDR buffer ); -unsigned char * skipRRQName(unsigned char *pQName); -/* void printReplyBuffer_AFSDB(PDNS_HDR replyBuff); */ - -#endif //__DNS_AFS_private_h_env_ - diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c deleted file mode 100644 index 4ab1d5ad5..000000000 --- a/src/WINNT/afsd/cm_freelance.c +++ /dev/null @@ -1,1379 +0,0 @@ -#include -#include - -#ifndef DJGPP -#include -#include -#include -#else -#include -#endif /* !DJGPP */ -#include -#include -#include - -#include - -#include -#include "afsd.h" -#ifdef AFS_FREELANCE_CLIENT -#include "cm_freelance.h" -#include "stdio.h" - -extern void afsi_log(char *pattern, ...); - -int cm_noLocalMountPoints; -int cm_fakeDirSize; -int cm_fakeDirCallback=0; -int cm_fakeGettingCallback=0; -cm_localMountPoint_t* cm_localMountPoints; -osi_mutex_t cm_Freelance_Lock; -int cm_localMountPointChangeFlag = 0; -int cm_freelanceEnabled = 0; -time_t FakeFreelanceModTime = 0x3b49f6e2; - -static int freelance_ShutdownFlag = 0; -#if !defined(DJGPP) -static HANDLE hFreelanceChangeEvent = 0; -static HANDLE hFreelanceSymlinkChangeEvent = 0; -#endif - -void cm_InitFakeRootDir(); - -#if !defined(DJGPP) -void cm_FreelanceChangeNotifier(void * parmp) { - HKEY hkFreelance = 0; - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance", - 0, - KEY_NOTIFY, - &hkFreelance) == ERROR_SUCCESS) { - - hFreelanceChangeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if (hFreelanceChangeEvent == NULL) { - RegCloseKey(hkFreelance); - return; - } - } - - while ( TRUE ) { - /* check hFreelanceChangeEvent to see if it is set. - * if so, call cm_noteLocalMountPointChange() - */ - if (RegNotifyChangeKeyValue( hkFreelance, /* hKey */ - FALSE, /* bWatchSubtree */ - REG_NOTIFY_CHANGE_LAST_SET, /* dwNotifyFilter */ - hFreelanceChangeEvent, /* hEvent */ - TRUE /* fAsynchronous */ - ) != ERROR_SUCCESS) { - RegCloseKey(hkFreelance); - CloseHandle(hFreelanceChangeEvent); - hFreelanceChangeEvent = 0; - return; - } - - if (WaitForSingleObject(hFreelanceChangeEvent, INFINITE) == WAIT_OBJECT_0) - { - if (freelance_ShutdownFlag == 1) { - RegCloseKey(hkFreelance); - CloseHandle(hFreelanceChangeEvent); - hFreelanceChangeEvent = 0; - return; - } - cm_noteLocalMountPointChange(); - } - } -} - -void cm_FreelanceSymlinkChangeNotifier(void * parmp) { - HKEY hkFreelance = 0; - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance\\Symlinks", - 0, - KEY_NOTIFY, - &hkFreelance) == ERROR_SUCCESS) { - - hFreelanceSymlinkChangeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if (hFreelanceSymlinkChangeEvent == NULL) { - RegCloseKey(hkFreelance); - return; - } - } - - while ( TRUE ) { - /* check hFreelanceSymlinkChangeEvent to see if it is set. - * if so, call cm_noteLocalMountPointSymlinkChange() - */ - if (RegNotifyChangeKeyValue( hkFreelance, /* hKey */ - FALSE, /* bWatchSubtree */ - REG_NOTIFY_CHANGE_LAST_SET, /* dwNotifyFilter */ - hFreelanceSymlinkChangeEvent, /* hEvent */ - TRUE /* fAsynchronous */ - ) != ERROR_SUCCESS) { - RegCloseKey(hkFreelance); - CloseHandle(hFreelanceSymlinkChangeEvent); - hFreelanceSymlinkChangeEvent = 0; - return; - } - - if (WaitForSingleObject(hFreelanceSymlinkChangeEvent, INFINITE) == WAIT_OBJECT_0) - { - if (freelance_ShutdownFlag == 1) { - RegCloseKey(hkFreelance); - CloseHandle(hFreelanceSymlinkChangeEvent); - hFreelanceSymlinkChangeEvent = 0; - return; - } - cm_noteLocalMountPointChange(); - } - } -} -#endif - -void -cm_FreelanceShutdown(void) -{ - freelance_ShutdownFlag = 1; -#if !defined(DJGPP) - if (hFreelanceChangeEvent != 0) - thrd_SetEvent(hFreelanceChangeEvent); - if (hFreelanceSymlinkChangeEvent != 0) - thrd_SetEvent(hFreelanceSymlinkChangeEvent); -#endif -} - -void cm_InitFreelance() { -#if !defined(DJGPP) - thread_t phandle; - int lpid; -#endif - - lock_InitializeMutex(&cm_Freelance_Lock, "Freelance Lock"); - - // make sure we sync the data version to the cached root scache_t - if (cm_data.rootSCachep && cm_data.rootSCachep->fid.cell == AFS_FAKE_ROOT_CELL_ID) - cm_data.fakeDirVersion = cm_data.rootSCachep->dataVersion; - - // yj: first we make a call to cm_initLocalMountPoints - // to read all the local mount points from an ini file - cm_InitLocalMountPoints(); - - // then we make a call to InitFakeRootDir to create - // a fake root directory based on the local mount points - cm_InitFakeRootDir(); - // --- end of yj code - -#if !defined(DJGPP) - /* Start the registry monitor */ - phandle = thrd_Create(NULL, 65536, (ThreadFunc) cm_FreelanceChangeNotifier, - NULL, 0, &lpid, "cm_FreelanceChangeNotifier"); - osi_assert(phandle != NULL); - thrd_CloseHandle(phandle); - - phandle = thrd_Create(NULL, 65536, (ThreadFunc) cm_FreelanceSymlinkChangeNotifier, - NULL, 0, &lpid, "cm_FreelanceSymlinkChangeNotifier"); - osi_assert(phandle != NULL); - thrd_CloseHandle(phandle); -#endif -} - -/* yj: Initialization of the fake root directory */ -/* to be called while holding freelance lock unless during init. */ -void cm_InitFakeRootDir() { - int i, t1, t2; - char* currentPos; - int noChunks; - - // allocate space for the fake info - cm_dirHeader_t fakeDirHeader; - cm_dirEntry_t fakeEntry; - cm_pageHeader_t fakePageHeader; - - // i'm going to calculate how much space is needed for - // this fake root directory. we have these rules: - // 1. there are cm_noLocalMountPoints number of entries - // 2. each page is CM_DIR_PAGESIZE in size - // 3. the first 13 chunks of the first page are used for - // some header stuff - // 4. the first chunk of all subsequent pages are used - // for page header stuff - // 5. a max of CM_DIR_EPP entries are allowed per page - // 6. each entry takes 1 or more chunks, depending on - // the size of the mount point string, as determined - // by cm_NameEntries - // 7. each chunk is CM_DIR_CHUNKSIZE bytes - - int CPP = CM_DIR_PAGESIZE / CM_DIR_CHUNKSIZE; - int curChunk = 13; // chunks 0 - 12 are used for header stuff - // of the first page in the directory - int curPage = 0; - int curDirEntry = 0; - int curDirEntryInPage = 0; - int sizeOfCurEntry; - int dirSize; - - /* Reserve 2 directory chunks for "." and ".." */ - curChunk += 2; - - while (curDirEntry!=cm_noLocalMountPoints) { - sizeOfCurEntry = cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0); - if ((curChunk + sizeOfCurEntry >= CPP) || - (curDirEntryInPage + 1 >= CM_DIR_EPP)) { - curPage++; - curDirEntryInPage = 0; - curChunk = 1; - } - curChunk += sizeOfCurEntry; - curDirEntry++; - curDirEntryInPage++; - } - - dirSize = (curPage+1) * CM_DIR_PAGESIZE; - cm_FakeRootDir = malloc(dirSize); - cm_fakeDirSize = dirSize; - - // yj: when we get here, we've figured out how much memory we need and - // allocated the appropriate space for it. we now prceed to fill - // it up with entries. - curPage = 0; - curDirEntry = 0; - curDirEntryInPage = 0; - curChunk = 0; - - // fields in the directory entry that are unused. - fakeEntry.flag = 1; - fakeEntry.length = 0; - fakeEntry.next = 0; - fakeEntry.fid.unique = htonl(1); - - // the first page is special, it uses fakeDirHeader instead of fakePageHeader - // we fill up the page with dirEntries that belong there and we make changes - // to the fakeDirHeader.header.freeBitmap along the way. Then when we're done - // filling up the dirEntries in this page, we copy the fakeDirHeader into - // the top of the page. - - // init the freeBitmap array - for (i=0; i<8; i++) - fakeDirHeader.header.freeBitmap[i]=0; - - fakeDirHeader.header.freeBitmap[0] = 0xff; - fakeDirHeader.header.freeBitmap[1] = 0x7f; - - - // we start counting at 13 because the 0th to 12th chunks are used for header - curChunk = 13; - - // stick the first 2 entries "." and ".." in - fakeEntry.fid.unique = htonl(1); - fakeEntry.fid.vnode = htonl(1); - strcpy(fakeEntry.name, "."); - currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE; - memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE); - curChunk++; curDirEntryInPage++; - strcpy(fakeEntry.name, ".."); - currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE; - memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE); - curChunk++; curDirEntryInPage++; - - // keep putting stuff into page 0 if - // 1. we're not done with all entries - // 2. we have less than CM_DIR_EPP entries in page 0 - // 3. we're not out of chunks in page 0 - - while( (curDirEntry!=cm_noLocalMountPoints) && - (curDirEntryInPage < CM_DIR_EPP) && - (curChunk + cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0) <= CPP)) - { - - noChunks = cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0); - fakeEntry.fid.vnode = htonl(curDirEntry + 2); - currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE; - - memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE); - strcpy(currentPos + 12, (cm_localMountPoints+curDirEntry)->namep); - curDirEntry++; - curDirEntryInPage++; - for (i=0; inamep, 0) <= CPP)) - { - // add an entry to this page - - noChunks = cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0); - fakeEntry.fid.vnode=htonl(curDirEntry+2); - currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE; - memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE); - strcpy(currentPos + 12, (cm_localMountPoints+curDirEntry)->namep); - curDirEntry++; - curDirEntryInPage++; - for (i=0; icell = AFS_FAKE_ROOT_CELL_ID; /* root cell */ - fidp->volume = AFS_FAKE_ROOT_VOL_ID; /* root.afs ? */ - fidp->vnode = 0x1; - fidp->unique = 0x1; - return 0; -} - -/* called directly from ioctl */ -/* called while not holding freelance lock */ -int cm_noteLocalMountPointChange(void) { - lock_ObtainMutex(&cm_Freelance_Lock); - cm_data.fakeDirVersion++; - cm_localMountPointChangeFlag = 1; - lock_ReleaseMutex(&cm_Freelance_Lock); - return 1; -} - -int cm_getLocalMountPointChange() { - return cm_localMountPointChangeFlag; -} - -int cm_clearLocalMountPointChange() { - cm_localMountPointChangeFlag = 0; - return 0; -} - -int cm_reInitLocalMountPoints() { - cm_fid_t aFid; - int i, hash; - cm_scache_t *scp, **lscpp, *tscp; - - osi_Log0(afsd_logp,"----- freelance reinitialization starts ----- "); - - // first we invalidate all the SCPs that were created - // for the local mount points - - osi_Log0(afsd_logp,"Invalidating local mount point scp... "); - - aFid.cell = AFS_FAKE_ROOT_CELL_ID; - aFid.volume=AFS_FAKE_ROOT_VOL_ID; - aFid.unique=0x1; - aFid.vnode=0x2; - - lock_ObtainWrite(&cm_scacheLock); - lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */ - for (i=0; inextp) { - if (scp->fid.volume == aFid.volume && - scp->fid.vnode == aFid.vnode && - scp->fid.unique == aFid.unique - ) { - - // mark the scp to be reused - cm_HoldSCacheNoLock(scp); - lock_ReleaseWrite(&cm_scacheLock); - lock_ObtainMutex(&scp->mx); - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); - cm_CallbackNotifyChange(scp); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); - - // take the scp out of the hash - for (lscpp = &cm_data.hashTablep[hash], tscp = cm_data.hashTablep[hash]; - tscp; - lscpp = &tscp->nextp, tscp = tscp->nextp) { - if (tscp == scp) { - *lscpp = scp->nextp; - scp->flags &= ~CM_SCACHEFLAG_INHASH; - break; - } - } - } - } - aFid.vnode = aFid.vnode + 1; - } - lock_ReleaseWrite(&cm_scacheLock); - osi_Log0(afsd_logp,"\tall old scp cleared!"); - - // we must free the memory that was allocated in the prev - // cm_InitLocalMountPoints call - osi_Log0(afsd_logp,"Removing old localmountpoints... "); - free(cm_localMountPoints); - osi_Log0(afsd_logp,"\tall old localmountpoints cleared!"); - - // now re-init the localmountpoints - osi_Log0(afsd_logp,"Creating new localmountpoints... "); - cm_InitLocalMountPoints(); - osi_Log0(afsd_logp,"\tcreated new set of localmountpoints!"); - - // now we have to free the memory allocated in cm_initfakerootdir - osi_Log0(afsd_logp,"Removing old fakedir... "); - free(cm_FakeRootDir); - osi_Log0(afsd_logp,"\t\told fakedir removed!"); - - // then we re-create that dir - osi_Log0(afsd_logp,"Creating new fakedir... "); - cm_InitFakeRootDir(); - osi_Log0(afsd_logp,"\t\tcreated new fakedir!"); - - lock_ReleaseMutex(&cm_Freelance_Lock); - - osi_Log0(afsd_logp,"----- freelance reinit complete -----"); - return 0; -} - - -// yj: open up the ini file and read all the local mount -// points that are stored there. Part of the initialization -// process for the freelance client. -/* to be called while holding freelance lock unless during init. */ -long cm_InitLocalMountPoints() { - FILE *fp; - int i; - char line[512]; - char*t, *t2; - cm_localMountPoint_t* aLocalMountPoint; - char hdir[120]; - long code; - char rootCellName[256]; -#if !defined(DJGPP) - HKEY hkFreelance = 0, hkFreelanceSymlinks = 0; - DWORD dwType, dwSize; - DWORD dwMountPoints = 0; - DWORD dwIndex; - DWORD dwSymlinks = 0; - FILETIME ftLastWriteTime; -#endif - -#if !defined(DJGPP) - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance", - 0, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - &hkFreelance) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkFreelance, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwMountPoints, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - &ftLastWriteTime /* lpftLastWriteTime */ - ); - - smb_UnixTimeFromLargeSearchTime(&FakeFreelanceModTime, &ftLastWriteTime); - - if ( dwMountPoints == 0 ) { - rootCellName[0] = '.'; - code = cm_GetRootCellName(&rootCellName[1]); - if (code == 0) { - cm_FreelanceAddMount(&rootCellName[1], &rootCellName[1], "root.cell.", 0, NULL); - cm_FreelanceAddMount(rootCellName, &rootCellName[1], "root.cell.", 1, NULL); - dwMountPoints = 2; - } - } - - if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance\\Symlinks", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - NULL, - &hkFreelanceSymlinks, - NULL) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkFreelanceSymlinks, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwSymlinks, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - } - - // get the number of entries there are from the first line - // that we read - cm_noLocalMountPoints = dwMountPoints + dwSymlinks; - - // create space to store the local mount points - cm_localMountPoints = malloc(sizeof(cm_localMountPoint_t) * cm_noLocalMountPoints); - aLocalMountPoint = cm_localMountPoints; - - // now we read n lines and parse them into local mount points - // where n is the number of local mount points there are, as - // determined above. - // Each line in the ini file represents 1 local mount point and - // is in the format xxx#yyy:zzz, where xxx is the directory - // entry name, yyy is the cell name and zzz is the volume name. - // #yyy:zzz together make up the mount point. - for ( dwIndex = 0 ; dwIndex < dwMountPoints; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - if (RegEnumValue( hkFreelance, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize)) - { - afsi_log("RegEnumValue(hkFreelance) failed"); - cm_noLocalMountPoints--; - continue; - } - - afsi_log("Mountpoint[%d] = %s",dwIndex, line); - - /* find the trailing dot; null terminate after it */ - t2 = strrchr(line, '.'); - if (t2) - *(t2+1) = '\0'; - - for ( t=line;*t;t++ ) { - if ( !isprint(*t) ) { - afsi_log("error occurred while parsing mountpoint entry [%d]: non-printable character", dwIndex); - fprintf(stderr, "error occurred while parsing mountpoint entry [%d]: non-printable character", dwIndex); - cm_noLocalMountPoints--; - continue; - } - } - - // line is not empty, so let's parse it - t = strchr(line, '#'); - if (!t) - t = strchr(line, '%'); - // make sure that there is a '#' or '%' separator in the line - if (!t) { - afsi_log("error occurred while parsing mountpoint entry [%d]: no # or %% separator", dwIndex); - fprintf(stderr, "error occurred while parsing mountpoint entry [%d]: no # or %% separator", dwIndex); - cm_noLocalMountPoints--; - continue; - } - - aLocalMountPoint->fileType = CM_SCACHETYPE_MOUNTPOINT; - aLocalMountPoint->namep=malloc(t-line+1); - strncpy(aLocalMountPoint->namep, line, t-line); - aLocalMountPoint->namep[t-line] = '\0'; - - /* copy the mount point string */ - aLocalMountPoint->mountPointStringp=malloc(strlen(t)); - strncpy(aLocalMountPoint->mountPointStringp, t, strlen(t)-1); - aLocalMountPoint->mountPointStringp[strlen(t)-1] = '\0'; - - osi_Log2(afsd_logp,"found mount point: name %s, string %s", - osi_LogSaveString(afsd_logp,aLocalMountPoint->namep), - osi_LogSaveString(afsd_logp,aLocalMountPoint->mountPointStringp)); - - aLocalMountPoint++; - } - - for ( dwIndex = 0 ; dwIndex < dwSymlinks; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - if (RegEnumValue( hkFreelanceSymlinks, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize)) - { - afsi_log("RegEnumValue(hkFreelanceSymlinks) failed"); - cm_noLocalMountPoints--; - continue; - } - - afsi_log("Symlink[%d] = %s",dwIndex, line); - - /* find the trailing dot; null terminate after it */ - t2 = strrchr(line, '.'); - if (t2) - *(t2+1) = '\0'; - - for ( t=line;*t;t++ ) { - if ( !isprint(*t) ) { - afsi_log("error occurred while parsing symlink entry [%d]: non-printable character", dwIndex); - fprintf(stderr, "error occurred while parsing symlink entry [%d]: non-printable character", dwIndex); - cm_noLocalMountPoints--; - continue; - } - } - - // line is not empty, so let's parse it - t = strchr(line, ':'); - - // make sure that there is a ':' separator in the line - if (!t) { - afsi_log("error occurred while parsing symlink entry [%d]: no ':' separator", dwIndex); - fprintf(stderr, "error occurred while parsing symlink entry [%d]: no ':' separator", dwIndex); - cm_noLocalMountPoints--; - continue; - } - - aLocalMountPoint->fileType = CM_SCACHETYPE_SYMLINK; - aLocalMountPoint->namep=malloc(t-line+1); - strncpy(aLocalMountPoint->namep, line, t-line); - aLocalMountPoint->namep[t-line] = '\0'; - - /* copy the symlink string */ - aLocalMountPoint->mountPointStringp=malloc(strlen(t)-1); - strncpy(aLocalMountPoint->mountPointStringp, t+1, strlen(t)-2); - aLocalMountPoint->mountPointStringp[strlen(t)-2] = '\0'; - - osi_Log2(afsd_logp,"found symlink: name %s, string %s", - osi_LogSaveString(afsd_logp,aLocalMountPoint->namep), - osi_LogSaveString(afsd_logp,aLocalMountPoint->mountPointStringp)); - - aLocalMountPoint++; - } - - if ( hkFreelanceSymlinks ) - RegCloseKey( hkFreelanceSymlinks ); - RegCloseKey(hkFreelance); - return 0; - } -#endif - - /* What follows is the old code to read freelance mount points - * out of a text file modified to copy the data into the registry - */ - cm_GetConfigDir(hdir); - strcat(hdir, AFS_FREELANCE_INI); - // open the ini file for reading - fp = fopen(hdir, "r"); - if (!fp) { - /* look in the Windows directory where we used to store the file */ - GetWindowsDirectory(hdir, sizeof(hdir)); - strcat(hdir,"\\"); - strcat(hdir, AFS_FREELANCE_INI); - fp = fopen(hdir, "r"); - } - -#if !defined(DJGPP) - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE, - NULL, - &hkFreelance, - NULL); - dwIndex = 0; -#endif - - if (!fp) { -#if !defined(DJGPP) - RegCloseKey(hkFreelance); -#endif - rootCellName[0] = '.'; - code = cm_GetRootCellName(&rootCellName[1]); - if (code == 0) { - cm_FreelanceAddMount(&rootCellName[1], &rootCellName[1], "root.cell.", 0, NULL); - cm_FreelanceAddMount(rootCellName, &rootCellName[1], "root.cell.", 1, NULL); - } - return 0; - } - - // we successfully opened the file - osi_Log0(afsd_logp,"opened afs_freelance.ini"); - - // now we read the first line to see how many entries - // there are - fgets(line, sizeof(line), fp); - - // if the line is empty at any point when we're reading - // we're screwed. report error and return. - if (*line==0) { - afsi_log("error occurred while reading afs_freelance.ini"); - fprintf(stderr, "error occurred while reading afs_freelance.ini"); - return -1; - } - - // get the number of entries there are from the first line - // that we read - cm_noLocalMountPoints = atoi(line); - - if (cm_noLocalMountPoints > 0) { - // create space to store the local mount points - cm_localMountPoints = malloc(sizeof(cm_localMountPoint_t) * cm_noLocalMountPoints); - aLocalMountPoint = cm_localMountPoints; - } - - // now we read n lines and parse them into local mount points - // where n is the number of local mount points there are, as - // determined above. - // Each line in the ini file represents 1 local mount point and - // is in the format xxx#yyy:zzz, where xxx is the directory - // entry name, yyy is the cell name and zzz is the volume name. - // #yyy:zzz together make up the mount point. - for (i=0; inamep=malloc(t-line+1); - memcpy(aLocalMountPoint->namep, line, t-line); - *(aLocalMountPoint->namep + (t-line)) = 0; - - aLocalMountPoint->mountPointStringp=malloc(strlen(line) - (t-line) + 1); - memcpy(aLocalMountPoint->mountPointStringp, t, strlen(line)-(t-line)-1); - *(aLocalMountPoint->mountPointStringp + (strlen(line)-(t-line)-1)) = 0; - - osi_Log2(afsd_logp,"found mount point: name %s, string %s", - aLocalMountPoint->namep, - aLocalMountPoint->mountPointStringp); - - aLocalMountPoint++; - } - fclose(fp); -#if !defined(DJGPP) - if ( hkFreelance ) { - RegCloseKey(hkFreelance); - DeleteFile(hdir); - } -#endif - return 0; -} - -int cm_getNoLocalMountPoints() { - return cm_noLocalMountPoints; -} - -#if !defined(DJGPP) -long cm_FreelanceMountPointExists(char * filename) -{ - char* cp; - char line[512]; - char shortname[200]; - int found = 0; - HKEY hkFreelance = 0; - DWORD dwType, dwSize; - DWORD dwMountPoints; - DWORD dwIndex; - - lock_ObtainMutex(&cm_Freelance_Lock); - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance", - 0, - KEY_READ|KEY_QUERY_VALUE, - &hkFreelance) == ERROR_SUCCESS) - { - RegQueryInfoKey( hkFreelance, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwMountPoints, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( dwIndex = 0; dwIndex < dwMountPoints; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - RegEnumValue( hkFreelance, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize); - - cp=strchr(line, '#'); - if (!cp) - cp=strchr(line, '%'); - memcpy(shortname, line, cp-line); - shortname[cp-line]=0; - - if (!strcmp(shortname, filename)) { - found = 1; - break; - } - } - for ( dwIndex = 0; dwIndex < dwMountPoints; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - RegEnumValue( hkFreelance, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize); - - cp=strchr(line, '#'); - if (!cp) - cp=strchr(line, '%'); - memcpy(shortname, line, cp-line); - shortname[cp-line]=0; - - if (!stricmp(shortname, filename)) { - found = 1; - break; - } - } - RegCloseKey(hkFreelance); - } - - lock_ReleaseMutex(&cm_Freelance_Lock); - - return found; -} - -long cm_FreelanceSymlinkExists(char * filename) -{ - char* cp; - char line[512]; - char shortname[200]; - int found = 0; - HKEY hkFreelance = 0; - DWORD dwType, dwSize; - DWORD dwSymlinks; - DWORD dwIndex; - - lock_ObtainMutex(&cm_Freelance_Lock); - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance\\Symlinks", - 0, - KEY_READ|KEY_QUERY_VALUE, - &hkFreelance) == ERROR_SUCCESS) - { - RegQueryInfoKey( hkFreelance, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwSymlinks, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( dwIndex = 0; dwIndex < dwSymlinks; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - RegEnumValue( hkFreelance, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize); - - cp=strchr(line, ':'); - memcpy(shortname, line, cp-line); - shortname[cp-line]=0; - - if (!strcmp(shortname, filename)) { - found = 1; - break; - } - } - for ( dwIndex = 0; dwIndex < dwSymlinks; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - RegEnumValue( hkFreelance, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize); - - cp=strchr(line, ':'); - memcpy(shortname, line, cp-line); - shortname[cp-line]=0; - - if (!stricmp(shortname, filename)) { - found = 1; - break; - } - } - RegCloseKey(hkFreelance); - } - - lock_ReleaseMutex(&cm_Freelance_Lock); - - return found; -} -#endif - -long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_fid_t *fidp) -{ - FILE *fp; - char hfile[120]; - char line[512]; - char fullname[200]; - int n; - int alias = 0; -#if !defined(DJGPP) - HKEY hkFreelance = 0; - DWORD dwType, dwSize; - DWORD dwMountPoints; - DWORD dwIndex; -#endif - - /* before adding, verify the cell name; if it is not a valid cell, - don't add the mount point. - allow partial matches as a means of poor man's alias. */ - /* major performance issue? */ - osi_Log4(afsd_logp,"Freelance Add Mount request: filename=%s cellname=%s volume=%s %s", - osi_LogSaveString(afsd_logp,filename), - osi_LogSaveString(afsd_logp,cellname), - osi_LogSaveString(afsd_logp,volume), - rw ? "rw" : "ro"); - - if ( filename[0] == '\0' || cellname[0] == '\0' || volume[0] == '\0' ) - return -1; - - if (cellname[0] == '.') { - if (!cm_GetCell_Gen(&cellname[1], fullname, CM_FLAG_CREATE)) - return -1; - } else { - if (!cm_GetCell_Gen(cellname, fullname, CM_FLAG_CREATE)) - return -1; - } - -#if !defined(DJGPP) - if ( cm_FreelanceMountPointExists(filename) || - cm_FreelanceSymlinkExists(filename) ) - return -1; -#endif - - osi_Log1(afsd_logp,"Freelance Adding Mount for Cell: %s", - osi_LogSaveString(afsd_logp,cellname)); - - lock_ObtainMutex(&cm_Freelance_Lock); - -#if !defined(DJGPP) - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance", - 0, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - &hkFreelance) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkFreelance, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwMountPoints, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - if (rw) - sprintf(line, "%s%%%s:%s", filename, fullname, volume); - else - sprintf(line, "%s#%s:%s", filename, fullname, volume); - - /* If we are adding a new value, there must be an unused name - * within the range 0 to dwMountPoints - */ - for ( dwIndex = 0; dwIndex <= dwMountPoints; dwIndex++ ) { - char szIndex[16]; - char szMount[1024]; - - dwSize = sizeof(szMount); - sprintf(szIndex, "%d", dwIndex); - if (RegQueryValueEx( hkFreelance, szIndex, 0, &dwType, szMount, &dwSize) != ERROR_SUCCESS) { - /* found an unused value */ - dwType = REG_SZ; - dwSize = strlen(line) + 1; - RegSetValueEx( hkFreelance, szIndex, 0, dwType, line, dwSize); - break; - } else { - int len = strlen(filename); - if ( dwType == REG_SZ && !strncmp(filename, szMount, len) && - (szMount[len] == '%' || szMount[len] == '#')) { - /* Replace the existing value */ - dwType = REG_SZ; - dwSize = strlen(line) + 1; - RegSetValueEx( hkFreelance, szIndex, 0, dwType, line, dwSize); - break; - } - } - } - RegCloseKey(hkFreelance); - } else -#endif - { - cm_GetConfigDir(hfile); - strcat(hfile, AFS_FREELANCE_INI); - fp = fopen(hfile, "r+"); - if (!fp) - return CM_ERROR_INVAL; - fgets(line, sizeof(line), fp); - n = atoi(line); - n++; - fseek(fp, 0, SEEK_SET); - fprintf(fp, "%d", n); - fseek(fp, 0, SEEK_END); - if (rw) - fprintf(fp, "%s%%%s:%s\n", filename, fullname, volume); - else - fprintf(fp, "%s#%s:%s\n", filename, fullname, volume); - fclose(fp); - } - lock_ReleaseMutex(&cm_Freelance_Lock); - - /* cm_reInitLocalMountPoints(); */ - if (fidp) { - fidp->unique = 1; - fidp->vnode = cm_noLocalMountPoints + 1; /* vnode value of last mt pt */ - } - cm_noteLocalMountPointChange(); - return 0; -} - -long cm_FreelanceRemoveMount(char *toremove) -{ - int i, n; - char* cp; - char line[512]; - char shortname[200]; - char hfile[120], hfile2[120]; - FILE *fp1, *fp2; - int found=0; -#if !defined(DJGPP) - HKEY hkFreelance = 0; - DWORD dwType, dwSize; - DWORD dwMountPoints; - DWORD dwIndex; -#endif - - lock_ObtainMutex(&cm_Freelance_Lock); - -#if !defined(DJGPP) - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance", - 0, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - &hkFreelance) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkFreelance, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwMountPoints, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( dwIndex = 0; dwIndex < dwMountPoints; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - RegEnumValue( hkFreelance, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize); - - cp=strchr(line, '#'); - if (!cp) - cp=strchr(line, '%'); - memcpy(shortname, line, cp-line); - shortname[cp-line]=0; - - if (!strcmp(shortname, toremove)) { - RegDeleteValue( hkFreelance, szValueName ); - break; - } - } - RegCloseKey(hkFreelance); - } else -#endif - { - cm_GetConfigDir(hfile); - strcat(hfile, AFS_FREELANCE_INI); - strcpy(hfile2, hfile); - strcat(hfile2, "2"); - fp1=fopen(hfile, "r+"); - if (!fp1) - return CM_ERROR_INVAL; - fp2=fopen(hfile2, "w+"); - if (!fp2) { - fclose(fp1); - return CM_ERROR_INVAL; - } - - fgets(line, sizeof(line), fp1); - n=atoi(line); - fprintf(fp2, "%d\n", n-1); - - for (i=0; iunique = 1; - fidp->vnode = cm_noLocalMountPoints + 1; /* vnode value of last mt pt */ - } - cm_noteLocalMountPointChange(); - return 0; -} - -long cm_FreelanceRemoveSymlink(char *toremove) -{ - char* cp; - char line[512]; - char shortname[200]; - int found=0; -#if !defined(DJGPP) - HKEY hkFreelanceSymlinks = 0; - DWORD dwType, dwSize; - DWORD dwSymlinks; - DWORD dwIndex; -#endif - - lock_ObtainMutex(&cm_Freelance_Lock); - -#if !defined(DJGPP) - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Freelance\\Symlinks", - 0, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - &hkFreelanceSymlinks) == ERROR_SUCCESS) { - - RegQueryInfoKey( hkFreelanceSymlinks, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwSymlinks, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( dwIndex = 0; dwIndex < dwSymlinks; dwIndex++ ) { - TCHAR szValueName[16]; - DWORD dwValueSize = 16; - dwSize = sizeof(line); - RegEnumValue( hkFreelanceSymlinks, dwIndex, szValueName, &dwValueSize, NULL, - &dwType, line, &dwSize); - - cp=strchr(line, ':'); - memcpy(shortname, line, cp-line); - shortname[cp-line]=0; - - if (!strcmp(shortname, toremove)) { - RegDeleteValue( hkFreelanceSymlinks, szValueName ); - break; - } - } - RegCloseKey(hkFreelanceSymlinks); - } -#endif - - lock_ReleaseMutex(&cm_Freelance_Lock); - cm_noteLocalMountPointChange(); - return 0; -} -#endif /* AFS_FREELANCE_CLIENT */ diff --git a/src/WINNT/afsd/cm_freelance.h b/src/WINNT/afsd/cm_freelance.h deleted file mode 100644 index defaf8198..000000000 --- a/src/WINNT/afsd/cm_freelance.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _CM_FREELANCE_H -#define _CM_FREELANCE_H 1 - - -typedef struct cm_localMountPoint { - char* namep; - char* mountPointStringp; - unsigned int fileType; - struct cm_localMountPoint* next; -} cm_localMountPoint_t; - -extern int cm_getNoLocalMountPoints(); -extern long cm_InitLocalMountPoints(); -extern int cm_getLocalMountPointChange(); -extern int cm_reInitLocalMountPoints(); -extern void cm_InitFreelance(); -extern void cm_FreelanceShutdown(void); -extern int cm_noteLocalMountPointChange(void); -extern long cm_FreelanceRemoveMount(char *toremove); -extern long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_fid_t *fidp); -extern long cm_FreelanceRemoveSymlink(char *toremove); -extern long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp); -extern int cm_clearLocalMountPointChange(); -extern int cm_FakeRootFid(cm_fid_t *fidp); - -#define AFS_FREELANCE_INI "afs_freelance.ini" -#define AFS_FAKE_ROOT_CELL_ID 0xFFFFFFFF -#define AFS_FAKE_ROOT_VOL_ID 0xFFFFFFFF - -extern time_t FakeFreelanceModTime; -#endif // _CM_FREELANCE_H diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c deleted file mode 100644 index 47a7094bb..000000000 --- a/src/WINNT/afsd/cm_ioctl.c +++ /dev/null @@ -1,2380 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#else -#include -#endif /* !DJGPP */ -#include -#include -#include -#include -#include -#include - -#include - -#include "afsd.h" -#include "afsd_init.h" -#include - -#include "smb.h" -#include "cm_server.h" - -#ifndef DJGPP -#include -#include "afsrpc.h" -#else -#include -#include "afsrpc95.h" -#endif - -#include "cm_rpc.h" -#include - -#ifdef _DEBUG -#include -#endif - -/* Copied from afs_tokens.h */ -#define PIOCTL_LOGON 0x1 -#define MAX_PATH 260 - -osi_mutex_t cm_Afsdsbmt_Lock; - -extern afs_int32 cryptall; -extern char cm_NetbiosName[]; - -extern void afsi_log(char *pattern, ...); - -void cm_InitIoctl(void) -{ - lock_InitializeMutex(&cm_Afsdsbmt_Lock, "AFSDSBMT.INI Access Lock"); -} - -long cm_FlushFile(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - - lock_ObtainWrite(&scp->bufCreateLock); - code = buf_FlushCleanPages(scp, userp, reqp); - - lock_ObtainMutex(&scp->mx); - scp->cbServerp = NULL; - scp->cbExpires = 0; - cm_dnlcPurgedp(scp); - cm_dnlcPurgevp(scp); - cm_FreeAllACLEnts(scp); - lock_ReleaseMutex(&scp->mx); - - lock_ReleaseWrite(&scp->bufCreateLock); - return code; -} - -/* - * cm_ResetACLCache -- invalidate ACL info for a user that has just - * obtained or lost tokens - */ -void cm_ResetACLCache(cm_user_t *userp) -{ - cm_scache_t *scp; - int hash; - - lock_ObtainWrite(&cm_scacheLock); - for (hash=0; hash < cm_data.hashTableSize; hash++) { - for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - cm_HoldSCacheNoLock(scp); - lock_ReleaseWrite(&cm_scacheLock); - lock_ObtainMutex(&scp->mx); - cm_InvalidateACLUser(scp, userp); - lock_ReleaseMutex(&scp->mx); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); - } - } - lock_ReleaseWrite(&cm_scacheLock); -} - -/* - * TranslateExtendedChars - This is a fix for TR 54482. - * - * If an extended character (80 - FF) is entered into a file - * or directory name in Windows, the character is translated - * into the OEM character map before being passed to us. Why - * this occurs is unknown. Our pioctl functions must match - * this translation for paths given via our own commands (like - * fs). If we do not do this, then we will try to perform an - * operation on a non-translated path, which we will fail to - * find, since the path was created with the translated chars. - * This function performs the required translation. - */ -void TranslateExtendedChars(char *str) -{ -#ifdef DJGPP - char *p; -#endif - - if (!str || !*str) - return; - -#ifndef DJGPP - CharToOem(str, str); -#else - p = str; - while (*p) *p++ &= 0x7f; /* turn off high bit; probably not right */ -#endif -} - -/* parse the passed-in file name and do a namei on it. If we fail, - * return an error code, otherwise return the vnode located in *scpp. - */ -long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, - cm_scache_t **scpp) -{ - long code; - cm_scache_t *substRootp; - char * relativePath = ioctlp->inDatap; - - /* This is usually the file name, but for StatMountPoint it is the path. */ - /* ioctlp->inDatap can be either of the form: - * \path\. - * \path\file - * \\netbios-name\submount\path\. - * \\netbios-name\submount\path\file - */ - TranslateExtendedChars(relativePath); - - if (relativePath[0] == relativePath[1] && - relativePath[1] == '\\' && - !_strnicmp(cm_NetbiosName,relativePath+2,strlen(cm_NetbiosName))) - { - char shareName[256]; - char *sharePath; - int shareFound, i; - - /* We may have found a UNC path. - * If the first component is the NetbiosName, - * then throw out the second component (the submount) - * since it had better expand into the value of ioctl->tidPathp - */ - char * p; - p = relativePath + 2 + strlen(cm_NetbiosName) + 1; - if ( !_strnicmp("all", p, 3) ) - p += 4; - - for (i = 0; *p && *p != '\\'; i++,p++ ) { - shareName[i] = *p; - } - p++; /* skip past trailing slash */ - shareName[i] = 0; /* terminate string */ - - shareFound = smb_FindShare(ioctlp->fidp->vcp, ioctlp->uidp, shareName, &sharePath); - if ( shareFound ) { - /* we found a sharename, therefore use the resulting path */ - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, sharePath, reqp, &substRootp); - free(sharePath); - if (code) - return code; - - code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) - return code; - } else { - /* otherwise, treat the name as a cellname mounted off the afs root. - * This requires that we reconstruct the shareName string with - * leading and trailing slashes. - */ - p = relativePath + 2 + strlen(cm_NetbiosName) + 1; - if ( !_strnicmp("all", p, 3) ) - p += 4; - - shareName[0] = '/'; - for (i = 1; *p && *p != '\\'; i++,p++ ) { - shareName[i] = *p; - } - p++; /* skip past trailing slash */ - shareName[i++] = '/'; /* add trailing slash */ - shareName[i] = 0; /* terminate string */ - - - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, shareName, reqp, &substRootp); - if (code) - return code; - - code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) - return code; - } - } else { - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, ioctlp->tidPathp, reqp, &substRootp); - if (code) - return code; - - code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) - return code; - } - - /* # of bytes of path */ - code = strlen(ioctlp->inDatap) + 1; - ioctlp->inDatap += code; - - /* This is usually nothing, but for StatMountPoint it is the file name. */ - TranslateExtendedChars(ioctlp->inDatap); - - /* and return success */ - return 0; -} - -void cm_SkipIoctlPath(smb_ioctl_t *ioctlp) -{ - long temp; - - temp = strlen(ioctlp->inDatap) + 1; - ioctlp->inDatap += temp; -} - - -/* format the specified path to look like "/afs//usr", by - * adding "/afs" (if necessary) in front, changing any \'s to /'s, and - * removing any trailing "/"'s. One weirdo caveat: "/afs" will be - * intentionally returned as "/afs/"--this makes submount manipulation - * easier (because we can always jump past the initial "/afs" to find - * the AFS path that should be written into afsdsbmt.ini). - */ -void cm_NormalizeAfsPath(char *outpathp, long outlen, char *inpathp) -{ - char *cp; - char bslash_mountRoot[256]; - - strncpy(bslash_mountRoot, cm_mountRoot, sizeof(bslash_mountRoot) - 1); - bslash_mountRoot[0] = '\\'; - - if (!strnicmp (inpathp, cm_mountRoot, strlen(cm_mountRoot))) - StringCbCopy(outpathp, outlen, inpathp); - else if (!strnicmp (inpathp, bslash_mountRoot, strlen(bslash_mountRoot))) - StringCbCopy(outpathp, outlen, inpathp); - else if ((inpathp[0] == '/') || (inpathp[0] == '\\')) - StringCbPrintfA(outpathp, outlen, "%s%s", cm_mountRoot, inpathp); - else // inpathp looks like "/usr" - StringCbPrintfA(outpathp, outlen, "%s/%s", cm_mountRoot, inpathp); - - for (cp = outpathp; *cp != 0; ++cp) { - if (*cp == '\\') - *cp = '/'; - } - - if (strlen(outpathp) && (outpathp[strlen(outpathp)-1] == '/')) { - outpathp[strlen(outpathp)-1] = 0; - } - - if (!strcmpi (outpathp, cm_mountRoot)) { - StringCbCopy(outpathp, outlen, cm_mountRoot); - } -} - -#define LEAF_SIZE 256 -/* parse the passed-in file name and do a namei on its parent. If we fail, - * return an error code, otherwise return the vnode located in *scpp. - */ -long cm_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, - cm_scache_t **scpp, char *leafp) -{ - long code; - char tbuffer[1024]; - char *tp, *jp; - cm_scache_t *substRootp; - - StringCbCopyA(tbuffer, sizeof(tbuffer), ioctlp->inDatap); - tp = strrchr(tbuffer, '\\'); - jp = strrchr(tbuffer, '/'); - if (!tp) - tp = jp; - else if (jp && (tp - tbuffer) < (jp - tbuffer)) - tp = jp; - if (!tp) { - StringCbCopyA(tbuffer, sizeof(tbuffer), "\\"); - if (leafp) - StringCbCopyA(leafp, LEAF_SIZE, ioctlp->inDatap); - } - else { - *tp = 0; - if (leafp) - StringCbCopyA(leafp, LEAF_SIZE, tp+1); - } - - if (tbuffer[0] == tbuffer[1] && - tbuffer[1] == '\\' && - !_strnicmp(cm_NetbiosName,tbuffer+2,strlen(cm_NetbiosName))) - { - char shareName[256]; - char *sharePath; - int shareFound, i; - - /* We may have found a UNC path. - * If the first component is the NetbiosName, - * then throw out the second component (the submount) - * since it had better expand into the value of ioctl->tidPathp - */ - char * p; - p = tbuffer + 2 + strlen(cm_NetbiosName) + 1; - if ( !_strnicmp("all", p, 3) ) - p += 4; - - for (i = 0; *p && *p != '\\'; i++,p++ ) { - shareName[i] = *p; - } - p++; /* skip past trailing slash */ - shareName[i] = 0; /* terminate string */ - - shareFound = smb_FindShare(ioctlp->fidp->vcp, ioctlp->uidp, shareName, &sharePath); - if ( shareFound ) { - /* we found a sharename, therefore use the resulting path */ - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, sharePath, reqp, &substRootp); - free(sharePath); - if (code) return code; - - code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) return code; - } else { - /* otherwise, treat the name as a cellname mounted off the afs root. - * This requires that we reconstruct the shareName string with - * leading and trailing slashes. - */ - p = tbuffer + 2 + strlen(cm_NetbiosName) + 1; - if ( !_strnicmp("all", p, 3) ) - p += 4; - - shareName[0] = '/'; - for (i = 1; *p && *p != '\\'; i++,p++ ) { - shareName[i] = *p; - } - p++; /* skip past trailing slash */ - shareName[i++] = '/'; /* add trailing slash */ - shareName[i] = 0; /* terminate string */ - - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, shareName, reqp, &substRootp); - if (code) return code; - - code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) return code; - } - } else { - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, - userp, ioctlp->tidPathp, reqp, &substRootp); - if (code) return code; - - code = cm_NameI(substRootp, tbuffer, CM_FLAG_FOLLOW, - userp, NULL, reqp, scpp); - if (code) return code; - } - - /* # of bytes of path */ - code = strlen(ioctlp->inDatap) + 1; - ioctlp->inDatap += code; - - /* and return success */ - return 0; -} - -long cm_IoctlGetACL(smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - cm_conn_t *connp; - cm_scache_t *scp; - AFSOpaque acl; - AFSFetchStatus fileStatus; - AFSVolSync volSync; - long code; - AFSFid fid; - int tlen; - cm_req_t req; - struct rx_connection * callp; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - /* now make the get acl call */ - fid.Volume = scp->fid.volume; - fid.Vnode = scp->fid.vnode; - fid.Unique = scp->fid.unique; - do { - acl.AFSOpaque_val = ioctlp->outDatap; - acl.AFSOpaque_len = 0; - code = cm_Conn(&scp->fid, userp, &req, &connp); - if (code) continue; - - callp = cm_GetRxConn(connp); - code = RXAFS_FetchACL(callp, &fid, &acl, &fileStatus, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - cm_ReleaseSCache(scp); - - if (code) return code; - - /* skip over return data */ - tlen = strlen(ioctlp->outDatap) + 1; - ioctlp->outDatap += tlen; - - /* and return success */ - return 0; -} - -long cm_IoctlGetFileCellName(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *scp; - cm_cell_t *cellp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - -#ifdef AFS_FREELANCE_CLIENT - if ( cm_freelanceEnabled && - scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && - scp->fid.volume==AFS_FAKE_ROOT_VOL_ID && - scp->fid.vnode==0x1 && scp->fid.unique==0x1 ) { - StringCbCopyA(ioctlp->outDatap, 999999, "Freelance.Local.Root"); - ioctlp->outDatap += strlen(ioctlp->outDatap) + 1; - code = 0; - } else -#endif /* AFS_FREELANCE_CLIENT */ - { - cellp = cm_FindCellByID(scp->fid.cell); - if (cellp) { - StringCbCopyA(ioctlp->outDatap, 999999, cellp->name); - ioctlp->outDatap += strlen(ioctlp->outDatap) + 1; - code = 0; - } - else - code = CM_ERROR_NOSUCHCELL; - } - - cm_ReleaseSCache(scp); - return code; -} - -long cm_IoctlSetACL(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_conn_t *connp; - cm_scache_t *scp; - AFSOpaque acl; - AFSFetchStatus fileStatus; - AFSVolSync volSync; - long code; - AFSFid fid; - cm_req_t req; - struct rx_connection * callp; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - /* now make the get acl call */ - fid.Volume = scp->fid.volume; - fid.Vnode = scp->fid.vnode; - fid.Unique = scp->fid.unique; - do { - acl.AFSOpaque_val = ioctlp->inDatap; - acl.AFSOpaque_len = strlen(ioctlp->inDatap)+1; - code = cm_Conn(&scp->fid, userp, &req, &connp); - if (code) continue; - - callp = cm_GetRxConn(connp); - code = RXAFS_StoreACL(callp, &fid, &acl, &fileStatus, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - - /* invalidate cache info, since we just trashed the ACL cache */ - lock_ObtainMutex(&scp->mx); - cm_DiscardSCache(scp); - lock_ReleaseMutex(&scp->mx); - - cm_ReleaseSCache(scp); - - return code; -} - -long cm_IoctlFlushVolume(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *scp; - unsigned long volume; - int i; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - volume = scp->fid.volume; - cm_ReleaseSCache(scp); - - lock_ObtainWrite(&cm_scacheLock); - for (i=0; inextp) { - if (scp->fid.volume == volume) { - cm_HoldSCacheNoLock(scp); - lock_ReleaseWrite(&cm_scacheLock); - - /* now flush the file */ - code = cm_FlushFile(scp, userp, &req); - if ( code ) - afsi_log("cm_FlushFile returns error: [%x]",code); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); - } - } - } - lock_ReleaseWrite(&cm_scacheLock); - - return code; -} - -long cm_IoctlFlushFile(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *scp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - cm_FlushFile(scp, userp, &req); - cm_ReleaseSCache(scp); - - return 0; -} - -long cm_IoctlSetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_scache_t *scp; - char volName[32]; - char offLineMsg[256]; - char motd[256]; - cm_conn_t *tcp; - long code; - AFSFetchVolumeStatus volStat; - AFSStoreVolumeStatus storeStat; - cm_volume_t *tvp; - char *cp; - cm_cell_t *cellp; - cm_req_t req; - struct rx_connection * callp; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - cellp = cm_FindCellByID(scp->fid.cell); - osi_assert(cellp); - - if (scp->flags & CM_SCACHEFLAG_RO) { - cm_ReleaseSCache(scp); - return CM_ERROR_READONLY; - } - - code = cm_GetVolumeByID(cellp, scp->fid.volume, userp, &req, &tvp); - if (code) { - cm_ReleaseSCache(scp); - return code; - } - - /* Copy the junk out, using cp as a roving pointer. */ - cp = ioctlp->inDatap; - memcpy((char *)&volStat, cp, sizeof(AFSFetchVolumeStatus)); - cp += sizeof(AFSFetchVolumeStatus); - StringCbCopyA(volName, sizeof(volName), cp); - cp += strlen(volName)+1; - StringCbCopyA(offLineMsg, sizeof(offLineMsg), cp); - cp += strlen(offLineMsg)+1; - StringCbCopyA(motd, sizeof(motd), cp); - storeStat.Mask = 0; - if (volStat.MinQuota != -1) { - storeStat.MinQuota = volStat.MinQuota; - storeStat.Mask |= AFS_SETMINQUOTA; - } - if (volStat.MaxQuota != -1) { - storeStat.MaxQuota = volStat.MaxQuota; - storeStat.Mask |= AFS_SETMAXQUOTA; - } - - do { - code = cm_Conn(&scp->fid, userp, &req, &tcp); - if (code) continue; - - callp = cm_GetRxConn(tcp); - code = RXAFS_SetVolumeStatus(callp, scp->fid.volume, - &storeStat, volName, offLineMsg, motd); - rx_PutConnection(callp); - - } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - - /* return on failure */ - cm_ReleaseSCache(scp); - if (code) { - return code; - } - - /* we are sending parms back to make compat. with prev system. should - * change interface later to not ask for current status, just set - * new status - */ - cp = ioctlp->outDatap; - memcpy(cp, (char *)&volStat, sizeof(VolumeStatus)); - cp += sizeof(VolumeStatus); - StringCbCopyA(cp, 999999, volName); - cp += strlen(volName)+1; - StringCbCopyA(cp, 999999, offLineMsg); - cp += strlen(offLineMsg)+1; - StringCbCopyA(cp, 999999, motd); - cp += strlen(motd)+1; - - /* now return updated return data pointer */ - ioctlp->outDatap = cp; - - return 0; -} - -long cm_IoctlGetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char volName[32]; - cm_scache_t *scp; - char offLineMsg[256]; - char motd[256]; - cm_conn_t *tcp; - register long code; - AFSFetchVolumeStatus volStat; - register char *cp; - char *Name; - char *OfflineMsg; - char *MOTD; - cm_req_t req; - struct rx_connection * callp; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - Name = volName; - OfflineMsg = offLineMsg; - MOTD = motd; - do { - code = cm_Conn(&scp->fid, userp, &req, &tcp); - if (code) continue; - - callp = cm_GetRxConn(tcp); - code = RXAFS_GetVolumeStatus(callp, scp->fid.volume, - &volStat, &Name, &OfflineMsg, &MOTD); - rx_PutConnection(callp); - - } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - - cm_ReleaseSCache(scp); - if (code) return code; - - /* Copy all this junk into msg->im_data, keeping track of the lengths. */ - cp = ioctlp->outDatap; - memcpy(cp, (char *)&volStat, sizeof(AFSFetchVolumeStatus)); - cp += sizeof(AFSFetchVolumeStatus); - StringCbCopyA(cp, 999999, volName); - cp += strlen(volName)+1; - StringCbCopyA(cp, 999999, offLineMsg); - cp += strlen(offLineMsg)+1; - StringCbCopyA(cp, 999999, motd); - cp += strlen(motd)+1; - - /* return new size */ - ioctlp->outDatap = cp; - - return 0; -} - -long cm_IoctlWhereIs(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *scp; - cm_cell_t *cellp; - cm_volume_t *tvp; - cm_serverRef_t **tsrpp, *current; - cm_server_t *tsp; - unsigned long volume; - char *cp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); - if (code) return code; - - volume = scp->fid.volume; - - cellp = cm_FindCellByID(scp->fid.cell); - osi_assert(cellp); - - cm_ReleaseSCache(scp); - - code = cm_GetVolumeByID(cellp, volume, userp, &req, &tvp); - if (code) return code; - - cp = ioctlp->outDatap; - - lock_ObtainMutex(&tvp->mx); - tsrpp = cm_GetVolServers(tvp, volume); - lock_ObtainRead(&cm_serverLock); - for (current = *tsrpp; current; current = current->next) { - tsp = current->server; - memcpy(cp, (char *)&tsp->addr.sin_addr.s_addr, sizeof(long)); - cp += sizeof(long); - } - lock_ReleaseRead(&cm_serverLock); - cm_FreeServerList(tsrpp); - lock_ReleaseMutex(&tvp->mx); - - /* still room for terminating NULL, add it on */ - volume = 0; /* reuse vbl */ - memcpy(cp, (char *)&volume, sizeof(long)); - cp += sizeof(long); - - ioctlp->outDatap = cp; - cm_PutVolume(tvp); - return 0; -} - -long cm_IoctlStatMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *dscp; - cm_scache_t *scp; - char *cp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); - if (code) return code; - - cp = ioctlp->inDatap; - - code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); - cm_ReleaseSCache(dscp); - if (code) return code; - - lock_ObtainMutex(&scp->mx); - - /* now check that this is a real mount point */ - if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - return CM_ERROR_INVAL; - } - - code = cm_ReadMountPoint(scp, userp, &req); - if (code == 0) { - cp = ioctlp->outDatap; - StringCbCopyA(cp, 999999, scp->mountPointStringp); - cp += strlen(cp) + 1; - ioctlp->outDatap = cp; - } - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - - return code; -} - -long cm_IoctlDeleteMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *dscp; - cm_scache_t *scp; - char *cp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); - if (code) return code; - - cp = ioctlp->inDatap; - - code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); - - /* if something went wrong, bail out now */ - if (code) { - goto done; - } - - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - goto done; - } - - /* now check that this is a real mount point */ - if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - code = CM_ERROR_INVAL; - goto done; - } - - /* time to make the RPC, so drop the lock */ - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - - /* easier to do it this way */ - code = cm_Unlink(dscp, cp, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, cp, NULL, TRUE); - - done: - cm_ReleaseSCache(dscp); - return code; -} - -long cm_IoctlCheckServers(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_cell_t *cellp; - chservinfo_t csi; - char *tp; - char *cp; - long temp; - cm_server_t *tsp; - int haveCell; - - cm_SkipIoctlPath(ioctlp); /* we don't care about the path */ - tp = ioctlp->inDatap; - haveCell = 0; - - memcpy(&temp, tp, sizeof(temp)); - if (temp == 0x12345678) { /* For afs3.3 version */ - memcpy(&csi, tp, sizeof(csi)); - if (csi.tinterval >= 0) { - cp = ioctlp->outDatap; - memcpy(cp, (char *)&cm_daemonCheckInterval, sizeof(long)); - ioctlp->outDatap += sizeof(long); - if (csi.tinterval > 0) { - if (!smb_SUser(userp)) - return CM_ERROR_NOACCESS; - cm_daemonCheckInterval = csi.tinterval; - } - return 0; - } - if (csi.tsize) - haveCell = 1; - temp = csi.tflags; - cp = csi.tbuffer; - } else { /* For pre afs3.3 versions */ - memcpy((char *)&temp, ioctlp->inDatap, sizeof(long)); - ioctlp->inDatap = cp = ioctlp->inDatap + sizeof(long); - if (cp - ioctlp->inAllocp < ioctlp->inCopied) /* still more data available */ - haveCell = 1; - } - - /* - * 1: fast check, don't contact servers. - * 2: local cell only. - */ - if (haveCell) { - /* have cell name, too */ - cellp = cm_GetCell(cp, 0); - if (!cellp) return CM_ERROR_NOSUCHCELL; - } - else cellp = (cm_cell_t *) 0; - if (!cellp && (temp & 2)) { - /* use local cell */ - cellp = cm_FindCellByID(1); - } - if (!(temp & 1)) { /* if not fast, call server checker routine */ - /* check down servers */ - cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS | CM_FLAG_CHECKUPSERVERS, - cellp); - } - - /* now return the current down server list */ - cp = ioctlp->outDatap; - lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) { - if (cellp && tsp->cellp != cellp) continue; /* cell spec'd and wrong */ - if ((tsp->flags & CM_SERVERFLAG_DOWN) - && tsp->type == CM_SERVER_FILE) { - memcpy(cp, (char *)&tsp->addr.sin_addr.s_addr, sizeof(long)); - cp += sizeof(long); - } - } - lock_ReleaseRead(&cm_serverLock); - - ioctlp->outDatap = cp; - return 0; -} - -long cm_IoctlGag(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - /* we don't print anything superfluous, so we don't support the gag call */ - return CM_ERROR_INVAL; -} - -long cm_IoctlCheckVolumes(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_CheckVolumes(); - return 0; -} - -long cm_IoctlSetCacheSize(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long temp; - long code; - - cm_SkipIoctlPath(ioctlp); - - memcpy(&temp, ioctlp->inDatap, sizeof(temp)); - if (temp == 0) - temp = cm_data.buf_nOrigBuffers; - else { - /* temp is in 1K units, convert to # of buffers */ - temp = temp / (cm_data.buf_blockSize / 1024); - } - - /* now adjust the cache size */ - code = buf_SetNBuffers(temp); - - return code; -} - -long cm_IoctlTraceControl(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long inValue; - - cm_SkipIoctlPath(ioctlp); - - memcpy(&inValue, ioctlp->inDatap, sizeof(long)); - - /* print trace */ - if (inValue & 8) { - afsd_ForceTrace(FALSE); - buf_ForceTrace(FALSE); - } - - if (inValue & 2) { - /* set tracing value to low order bit */ - if ((inValue & 1) == 0) { - /* disable tracing */ - osi_LogDisable(afsd_logp); - } - else { - /* enable tracing */ - osi_LogEnable(afsd_logp); - } - } - - /* see if we're supposed to do a reset, too */ - if (inValue & 4) { - osi_LogReset(afsd_logp); - } - - /* and copy out tracing flag */ - inValue = afsd_logp->enabled; /* use as a temp vbl */ - memcpy(ioctlp->outDatap, &inValue, sizeof(long)); - ioctlp->outDatap += sizeof(long); - return 0; -} - -long cm_IoctlGetCacheParms(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_cacheParms_t parms; - - memset(&parms, 0, sizeof(parms)); - - /* first we get, in 1K units, the cache size */ - parms.parms[0] = cm_data.buf_nbuffers * (cm_data.buf_blockSize / 1024); - - /* and then the actual # of buffers in use (not in the free list, I guess, - * will be what we do). - */ - parms.parms[1] = (cm_data.buf_nbuffers - buf_CountFreeList()) * (cm_data.buf_blockSize / 1024); - - memcpy(ioctlp->outDatap, &parms, sizeof(parms)); - ioctlp->outDatap += sizeof(parms); - - return 0; -} - -long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long whichCell; - long magic = 0; - cm_cell_t *tcellp; - cm_serverRef_t *serverRefp; - cm_server_t *serverp; - long i; - char *cp; - char *tp; - char *basep; - - cm_SkipIoctlPath(ioctlp); - - tp = ioctlp->inDatap; - - memcpy((char *)&whichCell, tp, sizeof(long)); - tp += sizeof(long); - - /* see if more than one long passed in, ignoring the null pathname (the -1) */ - if (ioctlp->inCopied-1 > sizeof(long)) { - memcpy((char *)&magic, tp, sizeof(long)); - } - - lock_ObtainRead(&cm_cellLock); - for (tcellp = cm_data.allCellsp; tcellp; tcellp = tcellp->nextp) { - if (whichCell == 0) break; - whichCell--; - } - lock_ReleaseRead(&cm_cellLock); - if (tcellp) { - int max = 8; - - cp = ioctlp->outDatap; - - if (magic == 0x12345678) { - memcpy(cp, (char *)&magic, sizeof(long)); - max = 13; - } - memset(cp, 0, max * sizeof(long)); - basep = cp; - lock_ObtainRead(&cm_serverLock); /* for going down server list */ - /* jaltman - do the reference counts to serverRefp contents need to be increased? */ - serverRefp = tcellp->vlServersp; - for (i=0; iserver; - memcpy(cp, &serverp->addr.sin_addr.s_addr, sizeof(long)); - cp += sizeof(long); - serverRefp = serverRefp->next; - } - lock_ReleaseRead(&cm_serverLock); - cp = basep + max * sizeof(afs_int32); - StringCbCopyA(cp, 999999, tcellp->name); - cp += strlen(tcellp->name)+1; - ioctlp->outDatap = cp; - } - - if (tcellp) - return 0; - else - return CM_ERROR_NOMORETOKENS; /* mapped to EDOM */ -} - -extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep); - -long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - /* NT cache manager will read cell information from CellServDB each time - * cell is accessed. So, this call is necessary only if list of server for a cell - * changes (or IP addresses of cell servers changes). - * All that needs to be done is to refresh server information for all cells that - * are already loaded. - - * cell list will be cm_CellLock and cm_ServerLock will be held for write. - */ - - cm_cell_t *cp; - - cm_SkipIoctlPath(ioctlp); - lock_ObtainWrite(&cm_cellLock); - - for (cp = cm_data.allCellsp; cp; cp=cp->nextp) - { - long code; - /* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/ - cm_FreeServerList(&cp->vlServersp); - cp->vlServersp = NULL; - code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, cp); -#ifdef AFS_AFSDB_ENV - if (code) { - if (cm_dnsEnabled) { - int ttl; - code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, cp); - if ( code == 0 ) { /* got cell from DNS */ - cp->flags |= CM_CELLFLAG_DNS; - cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; - cp->timeout = time(0) + ttl; - } - } - } - else { - cp->flags &= ~CM_CELLFLAG_DNS; - } -#endif /* AFS_AFSDB_ENV */ - if (code) { - cp->flags |= CM_CELLFLAG_VLSERVER_INVALID; - } - else { - cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; - cm_RandomizeServer(&cp->vlServersp); - } - } - - lock_ReleaseWrite(&cm_cellLock); - return 0; -} - -long cm_IoctlGetWsCell(smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - long code = 0; - - if (cm_freelanceEnabled) { - StringCbCopyA(ioctlp->outDatap, 999999, "Freelance.Local.Root"); - ioctlp->outDatap += strlen(ioctlp->outDatap) +1; - } else if (cm_data.rootCellp) { - /* return the default cellname to the caller */ - StringCbCopyA(ioctlp->outDatap, 999999, cm_data.rootCellp->name); - ioctlp->outDatap += strlen(ioctlp->outDatap) +1; - } else { - /* if we don't know our default cell, return failure */ - code = CM_ERROR_NOSUCHCELL; - } - - return code; -} - -long cm_IoctlSysName(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long setSysName, foundname = 0; - char *cp, *cp2, inname[MAXSYSNAME], outname[MAXSYSNAME]; - int t, count, num = 0; - char **sysnamelist[MAXSYSNAME]; - - cm_SkipIoctlPath(ioctlp); - - memcpy(&setSysName, ioctlp->inDatap, sizeof(long)); - ioctlp->inDatap += sizeof(long); - - if (setSysName) { - /* check my args */ - if ( setSysName < 0 || setSysName > MAXNUMSYSNAMES ) - return EINVAL; - cp2 = ioctlp->inDatap; - for ( cp=ioctlp->inDatap, count = 0; count < setSysName; count++ ) { - /* won't go past end of ioctlp->inDatap since maxsysname*num < ioctlp->inDatap length */ - t = strlen(cp); - if (t >= MAXSYSNAME || t <= 0) - return EINVAL; - /* check for names that can shoot us in the foot */ - if (*cp == '.' && (cp[1] == 0 || (cp[1] == '.' && cp[2] == 0))) - return EINVAL; - cp += t + 1; - } - /* args ok */ - - /* inname gets first entry in case we're being a translator */ - /* (we are never a translator) */ - t = strlen(ioctlp->inDatap); - memcpy(inname, ioctlp->inDatap, t + 1); - ioctlp->inDatap += t + 1; - num = count; - } - - /* Not xlating, so local case */ - if (!cm_sysName) - osi_panic("cm_IoctlSysName: !cm_sysName\n", __FILE__, __LINE__); - - if (!setSysName) { /* user just wants the info */ - StringCbCopyA(outname, sizeof(outname), cm_sysName); - foundname = cm_sysNameCount; - *sysnamelist = cm_sysNameList; - } else { - /* Local guy; only root can change sysname */ - /* clear @sys entries from the dnlc, once afs_lookup can - * do lookups of @sys entries and thinks it can trust them */ - /* privs ok, store the entry, ... */ - StringCbCopyA(cm_sysName, sizeof(cm_sysName), inname); - StringCbCopyA(cm_sysNameList[0], MAXSYSNAME, inname); - if (setSysName > 1) { /* ... or list */ - cp = ioctlp->inDatap; - for (count = 1; count < setSysName; ++count) { - if (!cm_sysNameList[count]) - osi_panic("cm_IoctlSysName: no cm_sysNameList entry to write\n", - __FILE__, __LINE__); - t = strlen(cp); - StringCbCopyA(cm_sysNameList[count], MAXSYSNAME, cp); - cp += t + 1; - } - } - cm_sysNameCount = setSysName; - } - - if (!setSysName) { - /* return the sysname to the caller */ - cp = ioctlp->outDatap; - memcpy(cp, (char *)&foundname, sizeof(afs_int32)); - cp += sizeof(afs_int32); /* skip found flag */ - if (foundname) { - StringCbCopyA(cp, 999999, outname); - cp += strlen(outname) + 1; /* skip name and terminating null char */ - for ( count=1; count < foundname ; ++count) { /* ... or list */ - if ( !(*sysnamelist)[count] ) - osi_panic("cm_IoctlSysName: no cm_sysNameList entry to read\n", - __FILE__, __LINE__); - t = strlen((*sysnamelist)[count]); - if (t >= MAXSYSNAME) - osi_panic("cm_IoctlSysName: sysname entry garbled\n", - __FILE__, __LINE__); - StringCbCopyA(cp, 999999, (*sysnamelist)[count]); - cp += t + 1; - } - } - ioctlp->outDatap = cp; - } - - /* done: success */ - return 0; -} - -long cm_IoctlGetCellStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long temp; - cm_cell_t *cellp; - - cm_SkipIoctlPath(ioctlp); - - cellp = cm_GetCell(ioctlp->inDatap, 0); - if (!cellp) - return CM_ERROR_NOSUCHCELL; - - temp = 0; - lock_ObtainMutex(&cellp->mx); - if (cellp->flags & CM_CELLFLAG_SUID) - temp |= CM_SETCELLFLAG_SUID; - lock_ReleaseMutex(&cellp->mx); - - /* now copy out parm */ - memcpy(ioctlp->outDatap, &temp, sizeof(long)); - ioctlp->outDatap += sizeof(long); - - return 0; -} - -long cm_IoctlSetCellStatus(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long temp; - cm_cell_t *cellp; - - cm_SkipIoctlPath(ioctlp); - - cellp = cm_GetCell(ioctlp->inDatap + 2*sizeof(long), 0); - if (!cellp) - return CM_ERROR_NOSUCHCELL; - - memcpy((char *)&temp, ioctlp->inDatap, sizeof(long)); - - lock_ObtainMutex(&cellp->mx); - if (temp & CM_SETCELLFLAG_SUID) - cellp->flags |= CM_CELLFLAG_SUID; - else - cellp->flags &= ~CM_CELLFLAG_SUID; - lock_ReleaseMutex(&cellp->mx); - - return 0; -} - -long cm_IoctlSetSPrefs(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_SSetPref_t *spin; /* input */ - cm_SPref_t *srvin; /* one input component */ - cm_server_t *tsp; - int i, vlonly, noServers, type; - struct sockaddr_in tmp; - unsigned short rank; - - cm_SkipIoctlPath(ioctlp); /* we don't care about the path */ - - spin = (cm_SSetPref_t *)ioctlp->inDatap; - noServers = spin->num_servers; - vlonly = spin->flags; - if ( vlonly ) - type = CM_SERVER_VLDB; - else - type = CM_SERVER_FILE; - - for ( i=0; i < noServers; i++) - { - srvin = &(spin->servers[i]); - rank = srvin->rank + (rand() & 0x000f); - tmp.sin_addr = srvin->host; - tmp.sin_family = AF_INET; - - tsp = cm_FindServer(&tmp, type); - if ( tsp ) /* an existing server - ref count increased */ - { - tsp->ipRank = rank; /* no need to protect by mutex*/ - - if (type == CM_SERVER_FILE) - { /* fileserver */ - /* find volumes which might have RO copy - /* on server and change the ordering of - * their RO list - */ - cm_ChangeRankVolume(tsp); - } - else - { - /* set preferences for an existing vlserver */ - cm_ChangeRankCellVLServer(tsp); - } - cm_PutServer(tsp); /* decrease refcount */ - } - else /* add a new server without a cell */ - { - tsp = cm_NewServer(&tmp, type, NULL); /* refcount = 1 */ - tsp->ipRank = rank; - } - } - return 0; -} - -long cm_IoctlGetSPrefs(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_SPrefRequest_t *spin; /* input */ - cm_SPrefInfo_t *spout; /* output */ - cm_SPref_t *srvout; /* one output component */ - cm_server_t *tsp; - int i, vlonly, noServers; - - cm_SkipIoctlPath(ioctlp); /* we don't care about the path */ - - spin = (cm_SPrefRequest_t *)ioctlp->inDatap; - spout = (cm_SPrefInfo_t *) ioctlp->outDatap; - srvout = spout->servers; - noServers = spin->num_servers; - vlonly = spin->flags & CM_SPREF_VLONLY; - spout->num_servers = 0; - - lock_ObtainRead(&cm_serverLock); /* get server lock */ - - for (tsp=cm_allServersp, i=0; tsp && noServers; tsp=tsp->allNextp,i++){ - if (spin->offset > i) { - continue; /* catch up to where we left off */ - } - - if ( vlonly && (tsp->type == CM_SERVER_FILE) ) - continue; /* ignore fileserver for -vlserver option*/ - if ( !vlonly && (tsp->type == CM_SERVER_VLDB) ) - continue; /* ignore vlservers */ - - srvout->host = tsp->addr.sin_addr; - srvout->rank = tsp->ipRank; - srvout++; - spout->num_servers++; - noServers--; - } - lock_ReleaseRead(&cm_serverLock); /* release server lock */ - - if ( tsp ) /* we ran out of space in the output buffer */ - spout->next_offset = i; - else - spout->next_offset = 0; - ioctlp->outDatap += sizeof(cm_SPrefInfo_t) + - (spout->num_servers -1 ) * sizeof(cm_SPref_t) ; - return 0; -} - -long cm_IoctlStoreBehind(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - /* we ignore default asynchrony since we only have one way - * of doing this today. - */ - return 0; -} - -long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char leaf[LEAF_SIZE]; - long code; - cm_scache_t *dscp; - cm_attr_t tattr; - char *cp; - cm_req_t req; - char mpInfo[256]; - char fullCell[256]; - char volume[256]; - char cell[256]; - int ttl; - - cm_InitReq(&req); - - code = cm_ParseIoctlParent(ioctlp, userp, &req, &dscp, leaf); - if (code) return code; - - /* Translate chars for the mount point name */ - TranslateExtendedChars(leaf); - - /* - * The fs command allows the user to specify partial cell names on NT. These must - * be expanded to the full cell name for mount points so that the mount points will - * work on UNIX clients. - */ - - /* Extract the possibly partial cell name */ - StringCbCopyA(cell, sizeof(cell), ioctlp->inDatap + 1); /* Skip the mp type character */ - - if (cp = strchr(cell, ':')) { - /* Extract the volume name */ - *cp = 0; - StringCbCopyA(volume, sizeof(volume), cp + 1); - - /* Get the full name for this cell */ - code = cm_SearchCellFile(cell, fullCell, 0, 0); -#ifdef AFS_AFSDB_ENV - if (code && cm_dnsEnabled) - code = cm_SearchCellByDNS(cell, fullCell, &ttl, 0, 0); -#endif - if (code) - return CM_ERROR_NOSUCHCELL; - - StringCbPrintfA(mpInfo, sizeof(mpInfo), "%c%s:%s", *ioctlp->inDatap, fullCell, volume); - } else { - /* No cell name specified */ - StringCbCopyA(mpInfo, sizeof(mpInfo), ioctlp->inDatap); - } - -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { - /* we are adding the mount point to the root dir., so call - * the freelance code to do the add. */ - osi_Log0(afsd_logp,"IoctlCreateMountPoint within Freelance root dir"); - code = cm_FreelanceAddMount(leaf, fullCell, volume, - *ioctlp->inDatap == '%', NULL); - return code; - } -#endif - /* create the symlink with mode 644. The lack of X bits tells - * us that it is a mount point. - */ - tattr.mask = CM_ATTRMASK_UNIXMODEBITS | CM_ATTRMASK_CLIENTMODTIME; - tattr.unixModeBits = 0644; - tattr.clientModTime = time(NULL); - - code = cm_SymLink(dscp, leaf, mpInfo, 0, &tattr, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, leaf, NULL, TRUE); - - cm_ReleaseSCache(dscp); - return code; -} - -long cm_IoctlSymlink(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char leaf[LEAF_SIZE]; - long code; - cm_scache_t *dscp; - cm_attr_t tattr; - char *cp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlParent(ioctlp, userp, &req, &dscp, leaf); - if (code) return code; - - /* Translate chars for the link name */ - TranslateExtendedChars(leaf); - - /* Translate chars for the linked to name */ - TranslateExtendedChars(ioctlp->inDatap); - - cp = ioctlp->inDatap; /* contents of link */ - -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { - /* we are adding the symlink to the root dir., so call - * the freelance code to do the add. */ - if (cp[0] == cp[1] && cp[1] == '\\' && - !_strnicmp(cm_NetbiosName,cp+2,strlen(cm_NetbiosName))) - { - /* skip \\AFS\ or \\AFS\all\ */ - char * p; - p = cp + 2 + strlen(cm_NetbiosName) + 1; - if ( !_strnicmp("all", p, 3) ) - p += 4; - cp = p; - } - osi_Log0(afsd_logp,"IoctlCreateSymlink within Freelance root dir"); - code = cm_FreelanceAddSymlink(leaf, cp, NULL); - return code; - } -#endif - - /* Create symlink with mode 0755. */ - tattr.mask = CM_ATTRMASK_UNIXMODEBITS; - tattr.unixModeBits = 0755; - - code = cm_SymLink(dscp, leaf, cp, 0, &tattr, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME - | FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, leaf, NULL, TRUE); - - cm_ReleaseSCache(dscp); - - return code; -} - - -long cm_IoctlListlink(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *dscp; - cm_scache_t *scp; - char *cp; - cm_space_t *spacep; - cm_scache_t *newRootScp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); - if (code) return code; - - cp = ioctlp->inDatap; - - code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); - cm_ReleaseSCache(dscp); - if (code) return code; - - /* Check that it's a real symlink */ - if (scp->fileType != CM_SCACHETYPE_SYMLINK && - scp->fileType != CM_SCACHETYPE_DFSLINK && - scp->fileType != CM_SCACHETYPE_INVALID) { - cm_ReleaseSCache(scp); - return CM_ERROR_INVAL; - } - - code = cm_AssembleLink(scp, "", &newRootScp, &spacep, userp, &req); - cm_ReleaseSCache(scp); - if (code == 0) { - cp = ioctlp->outDatap; - if (newRootScp != NULL) { - StringCbCopyA(cp, 999999, cm_mountRoot); - StringCbCatA(cp, 999999, "/"); - cp += strlen(cp); - } - StringCbCopyA(cp, 999999, spacep->data); - cp += strlen(cp) + 1; - ioctlp->outDatap = cp; - cm_FreeSpace(spacep); - if (newRootScp != NULL) - cm_ReleaseSCache(newRootScp); - code = 0; - } else if (code == CM_ERROR_PATH_NOT_COVERED && - scp->fileType == CM_SCACHETYPE_DFSLINK || - code == CM_ERROR_NOSUCHPATH && - scp->fileType == CM_SCACHETYPE_INVALID) { - cp = ioctlp->outDatap; - StringCbCopyA(cp, 999999, spacep->data); - cp += strlen(cp) + 1; - ioctlp->outDatap = cp; - cm_FreeSpace(spacep); - if (newRootScp != NULL) - cm_ReleaseSCache(newRootScp); - code = 0; - } - - return code; -} - -long cm_IoctlIslink(struct smb_ioctl *ioctlp, struct cm_user *userp) -{/*CHECK FOR VALID SYMLINK*/ - long code; - cm_scache_t *dscp; - cm_scache_t *scp; - char *cp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); - if (code) return code; - - cp = ioctlp->inDatap; - osi_LogEvent("cm_IoctlListlink",NULL," name[%s]",cp); - - code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); - cm_ReleaseSCache(dscp); - if (code) return code; - - /* Check that it's a real symlink */ - if (scp->fileType != CM_SCACHETYPE_SYMLINK && - scp->fileType != CM_SCACHETYPE_DFSLINK && - scp->fileType != CM_SCACHETYPE_INVALID) - code = CM_ERROR_INVAL; - cm_ReleaseSCache(scp); - return code; -} - -long cm_IoctlDeletelink(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long code; - cm_scache_t *dscp; - cm_scache_t *scp; - char *cp; - cm_req_t req; - - cm_InitReq(&req); - - code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); - if (code) return code; - - cp = ioctlp->inDatap; - -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { - /* we are adding the mount point to the root dir., so call - * the freelance code to do the add. */ - osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir"); - code = cm_FreelanceRemoveSymlink(cp); - return code; - } -#endif - - code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); - - /* if something went wrong, bail out now */ - if (code) { - goto done; - } - - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - goto done; - } - - /* now check that this is a real symlink */ - if (scp->fileType != CM_SCACHETYPE_SYMLINK && - scp->fileType != CM_SCACHETYPE_DFSLINK && - scp->fileType != CM_SCACHETYPE_INVALID) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - code = CM_ERROR_INVAL; - goto done; - } - - /* time to make the RPC, so drop the lock */ - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - - /* easier to do it this way */ - code = cm_Unlink(dscp, cp, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_FILE_NAME - | FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, cp, NULL, TRUE); - - done: - cm_ReleaseSCache(dscp); - return code; -} - -long cm_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char *saveDataPtr; - char *tp; - int ticketLen; - char *ticket; - int ctSize; - struct ClearToken ct; - cm_cell_t *cellp; - cm_ucell_t *ucellp; - char *uname = NULL; - afs_uuid_t uuid; - int flags; - char sessionKey[8]; - char *smbname; - - saveDataPtr = ioctlp->inDatap; - - cm_SkipIoctlPath(ioctlp); - - tp = ioctlp->inDatap; - - /* ticket length */ - memcpy(&ticketLen, tp, sizeof(ticketLen)); - tp += sizeof(ticketLen); - if (ticketLen < MINKTCTICKETLEN || ticketLen > MAXKTCTICKETLEN) - return CM_ERROR_INVAL; - - /* remember ticket and skip over it for now */ - ticket = tp; - tp += ticketLen; - - /* clear token size */ - memcpy(&ctSize, tp, sizeof(ctSize)); - tp += sizeof(ctSize); - if (ctSize != sizeof(struct ClearToken)) - return CM_ERROR_INVAL; - - /* clear token */ - memcpy(&ct, tp, ctSize); - tp += ctSize; - if (ct.AuthHandle == -1) - ct.AuthHandle = 999; /* more rxvab compat stuff */ - - /* more stuff, if any */ - if (ioctlp->inCopied > tp - saveDataPtr) { - /* flags: logon flag */ - memcpy(&flags, tp, sizeof(int)); - tp += sizeof(int); - - /* cell name */ - cellp = cm_GetCell(tp, CM_FLAG_CREATE); - if (!cellp) return CM_ERROR_NOSUCHCELL; - tp += strlen(tp) + 1; - - /* user name */ - uname = tp; - tp += strlen(tp) + 1; - - if (flags & PIOCTL_LOGON) { - /* SMB user name with which to associate tokens */ - smbname = tp; - osi_Log2(smb_logp,"cm_IoctlSetToken for user [%s] smbname [%s]", - osi_LogSaveString(smb_logp,uname), osi_LogSaveString(smb_logp,smbname)); - fprintf(stderr, "SMB name = %s\n", smbname); - tp += strlen(tp) + 1; - } else { - osi_Log1(smb_logp,"cm_IoctlSetToken for user [%s]", - osi_LogSaveString(smb_logp,uname)); - } - -#ifndef DJGPP /* for win95, session key is back in pioctl */ - /* uuid */ - memcpy(&uuid, tp, sizeof(uuid)); - if (!cm_FindTokenEvent(uuid, sessionKey)) - return CM_ERROR_INVAL; -#endif /* !DJGPP */ - } else { - cellp = cm_data.rootCellp; - osi_Log0(smb_logp,"cm_IoctlSetToken - no name specified"); - } - - if (flags & PIOCTL_LOGON) { - userp = smb_FindCMUserByName(smbname, ioctlp->fidp->vcp->rname); - } - - /* store the token */ - lock_ObtainMutex(&userp->mx); - ucellp = cm_GetUCell(userp, cellp); - osi_Log1(smb_logp,"cm_IoctlSetToken ucellp %lx", ucellp); - ucellp->ticketLen = ticketLen; - if (ucellp->ticketp) - free(ucellp->ticketp); /* Discard old token if any */ - ucellp->ticketp = malloc(ticketLen); - memcpy(ucellp->ticketp, ticket, ticketLen); -#ifndef DJGPP - /* - * Get the session key from the RPC, rather than from the pioctl. - */ - /* - memcpy(&ucellp->sessionKey, ct.HandShakeKey, sizeof(ct.HandShakeKey)); - */ - memcpy(ucellp->sessionKey.data, sessionKey, sizeof(sessionKey)); -#else - /* for win95, we are getting the session key from the pioctl */ - memcpy(&ucellp->sessionKey, ct.HandShakeKey, sizeof(ct.HandShakeKey)); -#endif /* !DJGPP */ - ucellp->kvno = ct.AuthHandle; - ucellp->expirationTime = ct.EndTimestamp; - ucellp->gen++; - if (uname) - StringCbCopyA(ucellp->userName, MAXKTCNAMELEN, uname); - ucellp->flags |= CM_UCELLFLAG_RXKAD; - lock_ReleaseMutex(&userp->mx); - - if (flags & PIOCTL_LOGON) { - ioctlp->flags |= SMB_IOCTLFLAG_LOGON; - } - - cm_ResetACLCache(userp); - - return 0; -} - -long cm_IoctlGetTokenIter(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char *tp, *cp; - int iterator; - int temp; - cm_ucell_t *ucellp; - struct ClearToken ct; - - cm_SkipIoctlPath(ioctlp); - - tp = ioctlp->inDatap; - cp = ioctlp->outDatap; - - /* iterator */ - memcpy(&iterator, tp, sizeof(iterator)); - tp += sizeof(iterator); - - lock_ObtainMutex(&userp->mx); - - /* look for token */ - for (;;iterator++) { - ucellp = cm_FindUCell(userp, iterator); - if (!ucellp) { - lock_ReleaseMutex(&userp->mx); - return CM_ERROR_NOMORETOKENS; - } - if (ucellp->flags & CM_UCELLFLAG_RXKAD) - break; - } - - /* new iterator */ - temp = ucellp->iterator + 1; - memcpy(cp, &temp, sizeof(temp)); - cp += sizeof(temp); - - /* ticket length */ - memcpy(cp, &ucellp->ticketLen, sizeof(ucellp->ticketLen)); - cp += sizeof(ucellp->ticketLen); - - /* ticket */ - memcpy(cp, ucellp->ticketp, ucellp->ticketLen); - cp += ucellp->ticketLen; - - /* clear token size */ - temp = sizeof(ct); - memcpy(cp, &temp, sizeof(temp)); - cp += sizeof(temp); - - /* clear token */ - ct.AuthHandle = ucellp->kvno; -#ifndef DJGPP - /* - * Don't give out a real session key here - */ - /* - memcpy(ct.HandShakeKey, &ucellp->sessionKey, sizeof(ct.HandShakeKey)); - */ - memset(ct.HandShakeKey, 0, sizeof(ct.HandShakeKey)); -#else - memcpy(ct.HandShakeKey, &ucellp->sessionKey, sizeof(ct.HandShakeKey)); -#endif /* !DJGPP */ - ct.ViceId = 37; /* XXX */ - ct.BeginTimestamp = 0; /* XXX */ - ct.EndTimestamp = ucellp->expirationTime; - memcpy(cp, &ct, sizeof(ct)); - cp += sizeof(ct); - - /* Primary flag (unused) */ - temp = 0; - memcpy(cp, &temp, sizeof(temp)); - cp += sizeof(temp); - - /* cell name */ - StringCbCopyA(cp, 999999, ucellp->cellp->name); - cp += strlen(cp) + 1; - - /* user name */ - StringCbCopyA(cp, 999999, ucellp->userName); - cp += strlen(cp) + 1; - - ioctlp->outDatap = cp; - - lock_ReleaseMutex(&userp->mx); - - return 0; -} - -long cm_IoctlGetToken(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char *cp; - int temp; - cm_cell_t *cellp; - cm_ucell_t *ucellp; - struct ClearToken ct; - char *tp; -#ifndef DJGPP - afs_uuid_t uuid; -#endif /* !DJGPP */ - - cm_SkipIoctlPath(ioctlp); - - tp = ioctlp->inDatap; - - cp = ioctlp->outDatap; - - /* cell name is right here */ - cellp = cm_GetCell(tp, 0); - if (!cellp) - return CM_ERROR_NOSUCHCELL; - tp += strlen(tp) + 1; - -#ifndef DJGPP - /* uuid */ - memcpy(&uuid, tp, sizeof(uuid)); -#endif /* !DJGPP */ - - lock_ObtainMutex(&userp->mx); - - ucellp = cm_GetUCell(userp, cellp); - if (!ucellp || !(ucellp->flags & CM_UCELLFLAG_RXKAD)) { - lock_ReleaseMutex(&userp->mx); - return CM_ERROR_NOMORETOKENS; - } - - /* ticket length */ - memcpy(cp, &ucellp->ticketLen, sizeof(ucellp->ticketLen)); - cp += sizeof(ucellp->ticketLen); - - /* ticket */ - memcpy(cp, ucellp->ticketp, ucellp->ticketLen); - cp += ucellp->ticketLen; - - /* clear token size */ - temp = sizeof(ct); - memcpy(cp, &temp, sizeof(temp)); - cp += sizeof(temp); - - /* clear token */ - ct.AuthHandle = ucellp->kvno; -#ifndef DJGPP - /* - * Don't give out a real session key here - */ - /* - memcpy(ct.HandShakeKey, &ucellp->sessionKey, sizeof(ct.HandShakeKey)); - */ - memset(ct.HandShakeKey, 0, sizeof(ct.HandShakeKey)); -#else - memcpy(ct.HandShakeKey, &ucellp->sessionKey, sizeof(ct.HandShakeKey)); -#endif /* !DJGPP */ - ct.ViceId = 37; /* XXX */ - ct.BeginTimestamp = 0; /* XXX */ - ct.EndTimestamp = ucellp->expirationTime; - memcpy(cp, &ct, sizeof(ct)); - cp += sizeof(ct); - - /* Primary flag (unused) */ - temp = 0; - memcpy(cp, &temp, sizeof(temp)); - cp += sizeof(temp); - - /* cell name */ - StringCbCopyA(cp, 999999, ucellp->cellp->name); - cp += strlen(cp) + 1; - - /* user name */ - StringCbCopyA(cp, 999999, ucellp->userName); - cp += strlen(cp) + 1; - - ioctlp->outDatap = cp; - - lock_ReleaseMutex(&userp->mx); - -#ifndef DJGPP - cm_RegisterNewTokenEvent(uuid, ucellp->sessionKey.data); -#endif /* !DJGPP */ - - return 0; -} - -long cm_IoctlDelToken(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - char *cp; - cm_cell_t *cellp; - cm_ucell_t *ucellp; - - cm_SkipIoctlPath(ioctlp); - - cp = ioctlp->outDatap; - - /* cell name is right here */ - cellp = cm_GetCell(ioctlp->inDatap, 0); - if (!cellp) return CM_ERROR_NOSUCHCELL; - - lock_ObtainMutex(&userp->mx); - - ucellp = cm_GetUCell(userp, cellp); - if (!ucellp) { - lock_ReleaseMutex(&userp->mx); - return CM_ERROR_NOMORETOKENS; - } - - osi_Log1(smb_logp,"cm_IoctlDelToken ucellp %lx", ucellp); - - if (ucellp->ticketp) { - free(ucellp->ticketp); - ucellp->ticketp = NULL; - } - ucellp->flags &= ~CM_UCELLFLAG_RXKAD; - ucellp->gen++; - - lock_ReleaseMutex(&userp->mx); - - cm_ResetACLCache(userp); - - return 0; -} - -long cm_IoctlDelAllToken(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - cm_ucell_t *ucellp; - - lock_ObtainMutex(&userp->mx); - - for (ucellp = userp->cellInfop; ucellp; ucellp = ucellp->nextp) { - osi_Log1(smb_logp,"cm_IoctlDelAllToken ucellp %lx", ucellp); - ucellp->flags &= ~CM_UCELLFLAG_RXKAD; - ucellp->gen++; - } - - lock_ReleaseMutex(&userp->mx); - - cm_ResetACLCache(userp); - - return 0; -} - -long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - char afspath[MAX_PATH]; - char *submountreqp; - int nextAutoSubmount; - HKEY hkSubmounts; - DWORD dwType, dwSize; - DWORD status; - DWORD dwIndex; - DWORD dwSubmounts; - - cm_SkipIoctlPath(ioctlp); - - /* Serialize this one, to prevent simultaneous mods - * to afsdsbmt.ini - */ - lock_ObtainMutex(&cm_Afsdsbmt_Lock); - - /* Parse the input parameters--first the required afs path, - * then the requested submount name (which may be ""). - */ - cm_NormalizeAfsPath (afspath, sizeof(afspath), ioctlp->inDatap); - submountreqp = ioctlp->inDatap + (strlen(ioctlp->inDatap)+1); - - /* If the caller supplied a suggested submount name, see if - * that submount name is in use... if so, the submount's path - * has to match our path. - */ - - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - NULL, - &hkSubmounts, - NULL ); - - if (submountreqp && *submountreqp) { - char submountPathNormalized[MAX_PATH]; - char submountPath[MAX_PATH]; - - dwSize = sizeof(submountPath); - status = RegQueryValueEx( hkSubmounts, submountreqp, 0, - &dwType, submountPath, &dwSize); - - if (status != ERROR_SUCCESS) { - - /* The suggested submount name isn't in use now-- - * so we can safely map the requested submount name - * to the supplied path. Remember not to write the - * leading "/afs" when writing out the submount. - */ - RegSetValueEx( hkSubmounts, submountreqp, 0, - REG_EXPAND_SZ, - (strlen(&afspath[strlen(cm_mountRoot)])) ? - &afspath[strlen(cm_mountRoot)]:"/", - (strlen(&afspath[strlen(cm_mountRoot)])) ? - strlen(&afspath[strlen(cm_mountRoot)])+1:2); - - RegCloseKey( hkSubmounts ); - StringCbCopyA(ioctlp->outDatap, 999999, submountreqp); - ioctlp->outDatap += strlen(ioctlp->outDatap) +1; - lock_ReleaseMutex(&cm_Afsdsbmt_Lock); - return 0; - } - - /* The suggested submount name is already in use--if the - * supplied path matches the submount's path, we can still - * use the suggested submount name. - */ - cm_NormalizeAfsPath (submountPathNormalized, sizeof(submountPathNormalized), submountPath); - if (!strcmp (submountPathNormalized, afspath)) { - StringCbCopyA(ioctlp->outDatap, 999999, submountreqp); - ioctlp->outDatap += strlen(ioctlp->outDatap) +1; - RegCloseKey( hkSubmounts ); - lock_ReleaseMutex(&cm_Afsdsbmt_Lock); - return 0; - } - } - - RegQueryInfoKey( hkSubmounts, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwSubmounts, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - - /* Having obtained a list of all available submounts, start - * searching that list for a path which matches the requested - * AFS path. We'll also keep track of the highest "auto15"/"auto47" - * submount, in case we need to add a new one later. - */ - - nextAutoSubmount = 1; - - for ( dwIndex = 0; dwIndex < dwSubmounts; dwIndex ++ ) { - char submountPathNormalized[MAX_PATH]; - char submountPath[MAX_PATH] = ""; - DWORD submountPathLen = sizeof(submountPath); - char submountName[MAX_PATH]; - DWORD submountNameLen = sizeof(submountName); - - dwType = 0; - RegEnumValue( hkSubmounts, dwIndex, submountName, &submountNameLen, NULL, - &dwType, submountPath, &submountPathLen); - if (dwType == REG_EXPAND_SZ) { - char buf[MAX_PATH]; - StringCbCopyA(buf, MAX_PATH, submountPath); - submountPathLen = ExpandEnvironmentStrings(buf, submountPath, MAX_PATH); - if (submountPathLen > MAX_PATH) - continue; - } - - /* If this is an Auto### submount, remember its ### value */ - if ((!strnicmp (submountName, "auto", 4)) && - (isdigit (submountName[strlen("auto")]))) { - int thisAutoSubmount; - thisAutoSubmount = atoi (&submountName[strlen("auto")]); - nextAutoSubmount = max (nextAutoSubmount, - thisAutoSubmount+1); - } - - if ((submountPathLen == 0) || - (submountPathLen == sizeof(submountPath) - 1)) { - continue; - } - - /* See if the path for this submount matches the path - * that our caller specified. If so, we can return - * this submount. - */ - cm_NormalizeAfsPath (submountPathNormalized, sizeof(submountPathNormalized), submountPath); - if (!strcmp (submountPathNormalized, afspath)) { - StringCbCopyA(ioctlp->outDatap, 999999, submountName); - ioctlp->outDatap += strlen(ioctlp->outDatap) +1; - RegCloseKey(hkSubmounts); - lock_ReleaseMutex(&cm_Afsdsbmt_Lock); - return 0; - - } - } - - /* We've been through the entire list of existing submounts, and - * didn't find any which matched the specified path. So, we'll - * just have to add one. Remember not to write the leading "/afs" - * when writing out the submount. - */ - - StringCbPrintfA(ioctlp->outDatap, 999999, "auto%ld", nextAutoSubmount); - - RegSetValueEx( hkSubmounts, - ioctlp->outDatap, - 0, - REG_EXPAND_SZ, - (strlen(&afspath[strlen(cm_mountRoot)])) ? - &afspath[strlen(cm_mountRoot)]:"/", - (strlen(&afspath[strlen(cm_mountRoot)])) ? - strlen(&afspath[strlen(cm_mountRoot)])+1:2); - - ioctlp->outDatap += strlen(ioctlp->outDatap) +1; - RegCloseKey(hkSubmounts); - lock_ReleaseMutex(&cm_Afsdsbmt_Lock); - return 0; -} - -long cm_IoctlGetRxkcrypt(smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - memcpy(ioctlp->outDatap, &cryptall, sizeof(cryptall)); - ioctlp->outDatap += sizeof(cryptall); - - return 0; -} - -long cm_IoctlSetRxkcrypt(smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - cm_SkipIoctlPath(ioctlp); - - memcpy(&cryptall, ioctlp->inDatap, sizeof(cryptall)); - - return 0; -} - -#ifdef DJGPP -extern int afsd_shutdown(int); -extern int afs_shutdown; - -long cm_IoctlShutdown(smb_ioctl_t *ioctlp, cm_user_t *userp) { - afs_shutdown = 1; /* flag to shut down */ - return 0; -} -#endif /* DJGPP */ - -long cm_IoctlGetSMBName(smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - smb_user_t *uidp = ioctlp->uidp; - - if (uidp && uidp->unp) { - memcpy(ioctlp->outDatap, uidp->unp->name, strlen(uidp->unp->name)); - ioctlp->outDatap += strlen(uidp->unp->name); - } - - return 0; -} - -/* - * functions to dump contents of various structures. - * In debug build (linked with crt debug library) will dump allocated but not freed memory - */ -extern int cm_DumpSCache(FILE *outputFile, char *cookie, int lock); -extern int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock); -extern int smb_DumpVCP(FILE *outputFile, char *cookie, int lock); - -long cm_IoctlMemoryDump(struct smb_ioctl *ioctlp, struct cm_user *userp) -{ - long inValue = 0; - HANDLE hLogFile; - char logfileName[MAX_PATH+1]; - char *cookie; - -#ifdef _DEBUG - static _CrtMemState memstate; -#endif - - cm_SkipIoctlPath(ioctlp); - memcpy(&inValue, ioctlp->inDatap, sizeof(long)); - - if (getenv("TEMP")) - { - strncpy(logfileName, getenv("TEMP"), MAX_PATH); - logfileName[MAX_PATH] = '\0'; - } - else - { - GetWindowsDirectory(logfileName, sizeof(logfileName)); - } - strncat(logfileName, "\\afsd_alloc.log", sizeof(logfileName)); - - hLogFile = CreateFile(logfileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - if (!hLogFile) - { - /* error */ - inValue = -1; - memcpy(ioctlp->outDatap, &inValue, sizeof(long)); - ioctlp->outDatap += sizeof(long); - - return 0; - } - - SetFilePointer(hLogFile, 0, NULL, FILE_END); - - cookie = inValue ? "b" : "e"; - -#ifdef _DEBUG - - if (inValue) - { - _CrtMemCheckpoint(&memstate); - } - else - { - _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); - _CrtSetReportFile(_CRT_WARN, hLogFile); - _CrtMemDumpAllObjectsSince(&memstate); - } -#endif - - /* dump all interesting data */ - cm_DumpSCache(hLogFile, cookie, 1); - cm_DumpBufHashTable(hLogFile, cookie, 1); - smb_DumpVCP(hLogFile, cookie, 1); - - CloseHandle(hLogFile); - - memcpy(ioctlp->outDatap, &inValue, sizeof(long)); - ioctlp->outDatap += sizeof(long); - - return 0; -} diff --git a/src/WINNT/afsd/cm_ioctl.h b/src/WINNT/afsd/cm_ioctl.h deleted file mode 100644 index bcf7545ba..000000000 --- a/src/WINNT/afsd/cm_ioctl.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_IOCTL_H_ENV__ -#define __CM_IOCTL_H_ENV__ 1 - -#ifndef __CM_IOCTL_INTERFACES_ONLY__ -#include "smb.h" -#include "cm_user.h" -#endif /* __CM_IOCTL_INTERFACES_ONLY__ */ - -/* the following four structures are used for fs get/set serverprefs command*/ -#define CM_SPREF_VLONLY 0x01 -typedef struct cm_SPref { - struct in_addr host; - unsigned short rank; -} cm_SPref_t; - -typedef struct cm_SPrefRequest { - unsigned short offset; - unsigned short num_servers; - unsigned short flags; -} cm_SPrefRequest_t; - -typedef struct cm_SPrefInfo { - unsigned short next_offset; - unsigned short num_servers; - struct cm_SPref servers[1];/* we overrun this array intentionally...*/ -} cm_SPrefInfo_t; - -typedef struct cm_SSetPref { - unsigned short flags; - unsigned short num_servers; - struct cm_SPref servers[1];/* we overrun this array intentionally...*/ -} cm_SSetPref_t; - - -#define MAXNUMSYSNAMES 16 /* max that current constants allow */ -#define MAXSYSNAME 128 /* max sysname (i.e. @sys) size */ -extern char * cm_sysName; -extern unsigned int cm_sysNameCount; -extern char * cm_sysNameList[MAXNUMSYSNAMES]; - -#ifndef __CM_IOCTL_INTERFACES_ONLY__ - -void cm_InitIoctl(void); - -void cm_ResetACLCache(cm_user_t *userp); - -extern long cm_IoctlGetACL(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetFileCellName(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetACL(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlFlushVolume(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlFlushFile(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetVolumeStatus(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetVolumeStatus(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlWhereIs(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlStatMountPoint(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlDeleteMountPoint(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlCheckServers(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGag(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlCheckVolumes(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetCacheSize(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetCacheParms(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetCell(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlNewCell(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetWsCell(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSysName(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetCellStatus(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetCellStatus(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetSPrefs(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetSPrefs(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlStoreBehind(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlCreateMountPoint(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_FlushFile(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_IoctlTraceControl(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetToken(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetTokenIter(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetToken(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlDelToken(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlDelAllToken(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSymlink(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlIslink(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlListlink(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlDeletelink(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlMakeSubmount(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlGetRxkcrypt(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlSetRxkcrypt(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlShutdown(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlFreemountAddCell(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlFreemountRemoveCell(smb_ioctl_t *ioctlp, cm_user_t *userp); - -extern long cm_IoctlMemoryDump(smb_ioctl_t *ioctlp, cm_user_t *userp); -#endif /* __CM_IOCTL_INTERFACES_ONLY__ */ - -#endif /* __CM_IOCTL_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_memmap.c b/src/WINNT/afsd/cm_memmap.c deleted file mode 100644 index 8f63d7e0f..000000000 --- a/src/WINNT/afsd/cm_memmap.c +++ /dev/null @@ -1,681 +0,0 @@ -#include -#include "afsd.h" -#include "cm_memmap.h" - -extern void afsi_log(char *pattern, ...); -extern DWORD cm_ValidateCache; - -DWORD -GranularityAdjustment(DWORD size) -{ - SYSTEM_INFO sysInfo; - static DWORD dwGranularity = 0; - - if ( !dwGranularity ) { - GetSystemInfo(&sysInfo); - afsi_log("Granularity - %lX", sysInfo.dwAllocationGranularity); - dwGranularity = sysInfo.dwAllocationGranularity; - } - - size = (size + (dwGranularity - 1)) & ~(dwGranularity - 1); - return size; -} - -DWORD -ComputeSizeOfConfigData(void) -{ - DWORD size; - size = sizeof(cm_config_data_t); - return size; -} - -DWORD -ComputeSizeOfVolumes(DWORD maxvols) -{ - DWORD size; - size = maxvols * sizeof(cm_volume_t); - return size; -} - -DWORD -ComputeSizeOfCells(DWORD maxcells) -{ - DWORD size; - size = maxcells * sizeof(cm_cell_t); - return size; -} - -DWORD -ComputeSizeOfACLCache(DWORD stats) -{ - DWORD size; - size = 2 * (stats + 10) * sizeof(cm_aclent_t); - return size; -} - -DWORD -ComputeSizeOfSCache(DWORD stats) -{ - DWORD size; - size = (stats + 10) * sizeof(cm_scache_t); - return size; -} - -DWORD -ComputeSizeOfSCacheHT(DWORD stats) -{ - DWORD size; - size = (stats + 10) / 2 * sizeof(cm_scache_t *);; - return size; -} - -DWORD -ComputeSizeOfDNLCache(void) -{ - DWORD size; - size = NHSIZE * sizeof(cm_nc_t *) + NCSIZE * sizeof(cm_nc_t); - return size; -} - -DWORD -ComputeSizeOfDataBuffers(DWORD cacheBlocks, DWORD blockSize) -{ - DWORD size; - size = cacheBlocks * blockSize; - return size; -} - -DWORD -ComputeSizeOfDataHT(void) -{ - DWORD size; - size = osi_PrimeLessThan(CM_BUF_HASHSIZE) * sizeof(cm_buf_t *); - return size; -} - -DWORD -ComputeSizeOfDataHeaders(DWORD cacheBlocks) -{ - DWORD size; - size = cacheBlocks * sizeof(cm_buf_t); - return size; -} - -DWORD -ComputeSizeOfMappingFile(DWORD stats, DWORD maxVols, DWORD maxCells, DWORD chunkSize, DWORD cacheBlocks, DWORD blockSize) -{ - DWORD size; - - size = ComputeSizeOfConfigData() - + ComputeSizeOfVolumes(maxVols) - + ComputeSizeOfCells(maxCells) - + ComputeSizeOfACLCache(stats) - + ComputeSizeOfSCache(stats) - + ComputeSizeOfSCacheHT(stats) - + ComputeSizeOfDNLCache() - + ComputeSizeOfDataBuffers(cacheBlocks, blockSize) - + 2 * ComputeSizeOfDataHT() - + ComputeSizeOfDataHeaders(cacheBlocks); - return size; -} - -/* Create a security attribute structure suitable for use when the cache file - * is created. What we mainly want is that only the administrator should be - * able to do anything with the file. We create an ACL with only one entry, - * an entry that grants all rights to the administrator. - */ -PSECURITY_ATTRIBUTES CreateCacheFileSA() -{ - PSECURITY_ATTRIBUTES psa; - PSECURITY_DESCRIPTOR psd; - SID_IDENTIFIER_AUTHORITY authority = SECURITY_NT_AUTHORITY; - PSID AdminSID; - DWORD AdminSIDlength; - PACL AdminOnlyACL; - DWORD ACLlength; - - /* Get Administrator SID */ - AllocateAndInitializeSid(&authority, 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, - &AdminSID); - - /* Create Administrator-only ACL */ - AdminSIDlength = GetLengthSid(AdminSID); - ACLlength = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - + AdminSIDlength - sizeof(DWORD); - AdminOnlyACL = GlobalAlloc(GMEM_FIXED, ACLlength); - InitializeAcl(AdminOnlyACL, ACLlength, ACL_REVISION); - AddAccessAllowedAce(AdminOnlyACL, ACL_REVISION, - STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL, - AdminSID); - - /* Create security descriptor */ - psd = GlobalAlloc(GMEM_FIXED, sizeof(SECURITY_DESCRIPTOR)); - InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION); - SetSecurityDescriptorDacl(psd, TRUE, AdminOnlyACL, FALSE); - - /* Create security attributes structure */ - psa = GlobalAlloc(GMEM_FIXED, sizeof(SECURITY_ATTRIBUTES)); - psa->nLength = sizeof(SECURITY_ATTRIBUTES); - psa->lpSecurityDescriptor = psd; - psa->bInheritHandle = TRUE; - - return psa; -} - - -/* Free a security attribute structure created by CreateCacheFileSA() */ -VOID FreeCacheFileSA(PSECURITY_ATTRIBUTES psa) -{ - BOOL b1, b2; - PACL pAcl; - - GetSecurityDescriptorDacl(psa->lpSecurityDescriptor, &b1, &pAcl, &b2); - GlobalFree(pAcl); - GlobalFree(psa->lpSecurityDescriptor); - GlobalFree(psa); -} - -static HANDLE hMemoryMappedFile = NULL; - -int -cm_IsCacheValid(void) -{ - int rc = 1; - - afsi_log("Validating Cache Contents"); - - if (cm_ValidateACLCache()) { - afsi_log("ACL Cache validation failure"); - rc = 0; - } else if (cm_ValidateDCache()) { - afsi_log("Data Cache validation failure"); - rc = 0; - } else if (cm_ValidateVolume()) { - afsi_log("Volume validation failure"); - rc = 0; - } else if (cm_ValidateCell()) { - afsi_log("Cell validation failure"); - rc = 0; - } else if (cm_ValidateSCache()) { - afsi_log("Stat Cache validation failure"); - rc = 0; - } - - return rc; -} - -int -cm_ShutdownMappedMemory(void) -{ - cm_config_data_t * config_data_p = (cm_config_data_t *)cm_data.baseAddress; - int dirty = 0; - - cm_ShutdownDCache(); - cm_ShutdownSCache(); - cm_ShutdownACLCache(); - cm_ShutdownCell(); - cm_ShutdownVolume(); - - if (cm_ValidateCache == 2) - dirty = !cm_IsCacheValid(); - - *config_data_p = cm_data; - config_data_p->dirty = dirty; - UnmapViewOfFile(config_data_p); - CloseHandle(hMemoryMappedFile); - hMemoryMappedFile = NULL; - - afsi_log("Memory Mapped File has been closed"); -} - -int -cm_ValidateMappedMemory(char * cachePath) -{ - HANDLE hf = INVALID_HANDLE_VALUE, hm; - PSECURITY_ATTRIBUTES psa; - BY_HANDLE_FILE_INFORMATION fileInfo; - int newFile = 1; - DWORD mappingSize; - char * baseAddress = NULL; - cm_config_data_t * config_data_p; - - psa = CreateCacheFileSA(); - hf = CreateFile( cachePath, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - psa, - OPEN_EXISTING, - FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | FILE_FLAG_RANDOM_ACCESS, - NULL); - FreeCacheFileSA(psa); - - if (hf == INVALID_HANDLE_VALUE) { - fprintf(stderr, "Error creating cache file \"%s\" error %d\n", - cachePath, GetLastError()); - return CM_ERROR_INVAL; - } - - /* The file is being re-used; check to see if the existing data can be reused */ - if ( !GetFileInformationByHandle(hf, &fileInfo) ) { - CloseHandle(hf); - fprintf(stderr, "Unable to obtain File Information\n"); - return CM_ERROR_INVAL; - } - - afsi_log("Existing File Size: %08X:%08X", - fileInfo.nFileSizeHigh, - fileInfo.nFileSizeLow); - - hm = CreateFileMapping( hf, - NULL, - PAGE_READWRITE, - 0, - sizeof(cm_config_data_t), - NULL); - if (hm == NULL) { - if (GetLastError() == ERROR_DISK_FULL) { - fprintf(stderr, "Error creating file mapping for \"%s\": disk full (%lX)\n", - cachePath, sizeof(cm_config_data_t)); - - hm = CreateFileMapping( hf, - NULL, - PAGE_READWRITE, - 0, - fileInfo.nFileSizeLow, - NULL); - if (hm == NULL) { - if (GetLastError() == ERROR_DISK_FULL) { - CloseHandle(hf); - return CM_ERROR_TOOMANYBUFS; - } else { - fprintf(stderr,"Error creating file mapping for \"%s\": %d\n", - cachePath, GetLastError()); - CloseHandle(hf); - return CM_ERROR_INVAL; - } - } else { - fprintf(stderr, "Retry with file size (%lX) succeeds", - fileInfo.nFileSizeLow); - } - } else { - afsi_log("Error creating file mapping for \"%s\": %d", - cachePath, GetLastError()); - CloseHandle(hf); - return CM_ERROR_INVAL; - } - } - - config_data_p = MapViewOfFile( hm, - FILE_MAP_READ, - 0, 0, - sizeof(cm_config_data_t)); - if ( config_data_p == NULL ) { - fprintf(stderr, "Unable to MapViewOfFile\n"); - if (hf != INVALID_HANDLE_VALUE) - CloseHandle(hf); - CloseHandle(hm); - return CM_ERROR_INVAL; - } - - if ( config_data_p->dirty ) { - fprintf(stderr, "Previous session terminated prematurely\n"); - UnmapViewOfFile(config_data_p); - CloseHandle(hm); - CloseHandle(hf); - return CM_ERROR_INVAL; - } - - mappingSize = config_data_p->bufferSize; - baseAddress = config_data_p->baseAddress; - UnmapViewOfFile(config_data_p); - CloseHandle(hm); - - hm = CreateFileMapping( hf, - NULL, - PAGE_READWRITE, - 0, mappingSize, - NULL); - if (hm == NULL) { - if (GetLastError() == ERROR_DISK_FULL) { - fprintf(stderr, "Error creating file mapping for \"%s\": disk full [2]\n", - cachePath); - CloseHandle(hf); - return CM_ERROR_TOOMANYBUFS; - } - fprintf(stderr, "Error creating file mapping for \"%s\": %d\n", - cachePath, GetLastError()); - CloseHandle(hf); - return CM_ERROR_INVAL; - } - - baseAddress = MapViewOfFileEx( hm, - FILE_MAP_ALL_ACCESS, - 0, 0, - mappingSize, - baseAddress ); - if (baseAddress == NULL) { - fprintf(stderr, "Error mapping view of file: %d\n", GetLastError()); - baseAddress = MapViewOfFile( hm, - FILE_MAP_ALL_ACCESS, - 0, 0, - mappingSize ); - if (baseAddress == NULL) { - CloseHandle(hm); - if (hf != INVALID_HANDLE_VALUE) - CloseHandle(hf); - return CM_ERROR_INVAL; - } - fprintf(stderr, "Unable to re-load cache file at base address\n"); - CloseHandle(hm); - if (hf != INVALID_HANDLE_VALUE) - CloseHandle(hf); - return CM_ERROR_INVAL; - } - CloseHandle(hm); - - config_data_p = (cm_config_data_t *) baseAddress; - - fprintf(stderr,"AFS Cache data:\n"); - fprintf(stderr," Base Address = %lX\n",baseAddress); - fprintf(stderr," stats = %d\n", config_data_p->stats); - fprintf(stderr," chunkSize = %d\n", config_data_p->chunkSize); - fprintf(stderr," blockSize = %d\n", config_data_p->blockSize); - fprintf(stderr," bufferSize = %d\n", config_data_p->bufferSize); - fprintf(stderr," cacheType = %d\n", config_data_p->cacheType); - fprintf(stderr," currentVolumes = %d\n", config_data_p->currentVolumes); - fprintf(stderr," maxVolumes = %d\n", config_data_p->maxVolumes); - fprintf(stderr," currentCells = %d\n", config_data_p->currentCells); - fprintf(stderr," maxCells = %d\n", config_data_p->maxCells); - fprintf(stderr," hashTableSize = %d\n", config_data_p->hashTableSize ); - fprintf(stderr," currentSCaches = %d\n", config_data_p->currentSCaches); - fprintf(stderr," maxSCaches = %d\n", config_data_p->maxSCaches); - cm_data = *config_data_p; - - // perform validation of persisted data structures - // if there is a failure, start from scratch - if (!cm_IsCacheValid()) { - fprintf(stderr,"Cache file fails validation test\n"); - UnmapViewOfFile(config_data_p); - CloseHandle(hm); - return CM_ERROR_INVAL; - } - - fprintf(stderr,"Cache passes validation test\n"); - UnmapViewOfFile(config_data_p); - CloseHandle(hm); - return 0; -} - -int -cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, DWORD cacheBlocks) -{ - HANDLE hf = INVALID_HANDLE_VALUE, hm; - PSECURITY_ATTRIBUTES psa; - int newFile = 1; - DWORD mappingSize; - DWORD maxVols = stats/2; - DWORD maxCells = stats/4; - char * baseAddress = NULL; - cm_config_data_t * config_data_p; - char * p; - - mappingSize = ComputeSizeOfMappingFile(stats, maxVols, maxCells, chunkSize, cacheBlocks, CM_CONFIGDEFAULT_BLOCKSIZE); - - if ( !virtualCache ) { - psa = CreateCacheFileSA(); - hf = CreateFile( cachePath, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - psa, - OPEN_ALWAYS, - FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | FILE_FLAG_RANDOM_ACCESS, - NULL); - FreeCacheFileSA(psa); - - if (hf == INVALID_HANDLE_VALUE) { - afsi_log("Error creating cache file \"%s\" error %d", - cachePath, GetLastError()); - return CM_ERROR_INVAL; - } - - if ( GetLastError() == ERROR_ALREADY_EXISTS ) { - BY_HANDLE_FILE_INFORMATION fileInfo; - - /* The file is being re-used; check to see if the existing data can be reused */ - afsi_log("Cache File \"%s\" already exists", cachePath); - - if ( GetFileInformationByHandle(hf, &fileInfo) ) { - afsi_log("Existing File Size: %08X:%08X", - fileInfo.nFileSizeHigh, - fileInfo.nFileSizeLow); - if (fileInfo.nFileSizeLow > GranularityAdjustment(mappingSize)) { - psa = CreateCacheFileSA(); - hf = CreateFile( cachePath, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - psa, - TRUNCATE_EXISTING, - FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | FILE_FLAG_RANDOM_ACCESS, - NULL); - FreeCacheFileSA(psa); - - if (hf == INVALID_HANDLE_VALUE) { - afsi_log("Error creating cache file \"%s\" error %d", - cachePath, GetLastError()); - return CM_ERROR_INVAL; - } - - GetFileInformationByHandle(hf, &fileInfo); - afsi_log(" New File Size: %08X:%08X", - fileInfo.nFileSizeHigh, - fileInfo.nFileSizeLow); - } - - } - - hm = CreateFileMapping( hf, - NULL, - PAGE_READWRITE, - 0, - sizeof(cm_config_data_t), - NULL); - if (hm == NULL) { - if (GetLastError() == ERROR_DISK_FULL) { - afsi_log("Error creating file mapping for \"%s\": disk full (%lX)", - cachePath, sizeof(cm_config_data_t)); - - hm = CreateFileMapping( hf, - NULL, - PAGE_READWRITE, - 0, - mappingSize, - NULL); - if (hm == NULL) { - if (GetLastError() == ERROR_DISK_FULL) { - CloseHandle(hf); - return CM_ERROR_TOOMANYBUFS; - } else { - afsi_log("Error creating file mapping for \"%s\": %d", - cachePath, GetLastError()); - CloseHandle(hf); - return CM_ERROR_INVAL; - } - } else { - afsi_log("Retry with mapping size (%lX) succeeds", mappingSize); - } - } else { - afsi_log("Error creating file mapping for \"%s\": %d", - cachePath, GetLastError()); - CloseHandle(hf); - return CM_ERROR_INVAL; - } - } - - config_data_p = MapViewOfFile( hm, - FILE_MAP_READ, - 0, 0, - sizeof(cm_config_data_t)); - if ( config_data_p == NULL ) { - if (hf != INVALID_HANDLE_VALUE) - CloseHandle(hf); - CloseHandle(hm); - return CM_ERROR_INVAL; - } - - if ( config_data_p->size == sizeof(cm_config_data_t) && - config_data_p->magic == CM_CONFIG_DATA_MAGIC && - config_data_p->stats == stats && - config_data_p->maxVolumes == maxVols && - config_data_p->maxCells == maxCells && - config_data_p->chunkSize == chunkSize && - config_data_p->buf_nbuffers == cacheBlocks && - config_data_p->blockSize == CM_CONFIGDEFAULT_BLOCKSIZE && - config_data_p->bufferSize == mappingSize) - { - if ( config_data_p->dirty ) { - afsi_log("Previous session terminated prematurely"); - } else { - baseAddress = config_data_p->baseAddress; - newFile = 0; - } - } else { - afsi_log("Configuration changed or Not a persistent cache file"); - } - UnmapViewOfFile(config_data_p); - CloseHandle(hm); - } - } - - hm = CreateFileMapping( hf, - NULL, - PAGE_READWRITE, - 0, mappingSize, - NULL); - if (hm == NULL) { - if (GetLastError() == ERROR_DISK_FULL) { - afsi_log("Error creating file mapping for \"%s\": disk full [2]", - cachePath); - return CM_ERROR_TOOMANYBUFS; - } - afsi_log("Error creating file mapping for \"%s\": %d", - cachePath, GetLastError()); - return CM_ERROR_INVAL; - } - baseAddress = MapViewOfFileEx( hm, - FILE_MAP_ALL_ACCESS, - 0, 0, - mappingSize, - baseAddress ); - if (baseAddress == NULL) { - afsi_log("Error mapping view of file: %d", GetLastError()); - baseAddress = MapViewOfFile( hm, - FILE_MAP_ALL_ACCESS, - 0, 0, - mappingSize ); - if (baseAddress == NULL) { - if (hf != INVALID_HANDLE_VALUE) - CloseHandle(hf); - CloseHandle(hm); - return CM_ERROR_INVAL; - } - newFile = 1; - } - CloseHandle(hm); - - config_data_p = (cm_config_data_t *) baseAddress; - - if (!newFile) { - afsi_log("Reusing existing AFS Cache data: Base Address = %lX",baseAddress); - cm_data = *config_data_p; - - // perform validation of persisted data structures - // if there is a failure, start from scratch - if (cm_ValidateCache && !cm_IsCacheValid()) { - newFile = 1; - } - } - - if ( newFile ) { - afsi_log("Building AFS Cache from scratch"); - cm_data.size = sizeof(cm_config_data_t); - cm_data.magic = CM_CONFIG_DATA_MAGIC; - cm_data.baseAddress = baseAddress; - cm_data.stats = stats; - cm_data.chunkSize = chunkSize; - cm_data.blockSize = CM_CONFIGDEFAULT_BLOCKSIZE; - cm_data.bufferSize = mappingSize; - cm_data.hashTableSize = osi_PrimeLessThan(stats / 2 + 1); - if (virtualCache) { - cm_data.cacheType = CM_BUF_CACHETYPE_VIRTUAL; - } else { - cm_data.cacheType = CM_BUF_CACHETYPE_FILE; - } - - cm_data.buf_nbuffers = cacheBlocks; - cm_data.buf_nOrigBuffers = 0; - cm_data.buf_blockSize = CM_BUF_BLOCKSIZE; - cm_data.buf_hashSize = CM_BUF_HASHSIZE; - - cm_data.mountRootGen = time(NULL); - - baseAddress += ComputeSizeOfConfigData(); - cm_data.volumeBaseAddress = (cm_volume_t *) baseAddress; - baseAddress += ComputeSizeOfVolumes(maxVols); - cm_data.cellBaseAddress = (cm_cell_t *) baseAddress; - baseAddress += ComputeSizeOfCells(maxCells); - cm_data.aclBaseAddress = (cm_aclent_t *) baseAddress; - baseAddress += ComputeSizeOfACLCache(stats); - cm_data.scacheBaseAddress = (cm_scache_t *) baseAddress; - baseAddress += ComputeSizeOfSCache(stats); - cm_data.hashTablep = (cm_scache_t **) baseAddress; - baseAddress += ComputeSizeOfSCacheHT(stats); - cm_data.dnlcBaseAddress = (cm_nc_t *) baseAddress; - baseAddress += ComputeSizeOfDNLCache(); - cm_data.buf_hashTablepp = (cm_buf_t **) baseAddress; - baseAddress += ComputeSizeOfDataHT(); - cm_data.buf_fileHashTablepp = (cm_buf_t **) baseAddress; - baseAddress += ComputeSizeOfDataHT(); - cm_data.bufHeaderBaseAddress = (cm_buf_t *) baseAddress; - baseAddress += ComputeSizeOfDataHeaders(cacheBlocks); - cm_data.bufDataBaseAddress = (char *) baseAddress; - baseAddress += ComputeSizeOfDataBuffers(cacheBlocks, CM_CONFIGDEFAULT_BLOCKSIZE); - cm_data.bufEndOfData = (char *) baseAddress; - - cm_data.fakeDirVersion = 0x8; - - UuidCreate((UUID *)&cm_data.Uuid); - } - - UuidToString((UUID *)&cm_data.Uuid, &p); - afsi_log("Initializing Uuid to %s",p); - RpcStringFree(&p); - - afsi_log("Initializing Volume Data"); - cm_InitVolume(newFile, maxVols); - - afsi_log("Initializing Cell Data"); - cm_InitCell(newFile, maxCells); - - afsi_log("Initializing ACL Data"); - cm_InitACLCache(newFile, 2*stats); - - afsi_log("Initializing Stat Data"); - cm_InitSCache(newFile, stats); - - afsi_log("Initializing Data Buffers"); - cm_InitDCache(newFile, 0, cacheBlocks); - - *config_data_p = cm_data; - config_data_p->dirty = 1; - - hMemoryMappedFile = hf; - afsi_log("Cache Initialization Complete"); - return 0; -} - diff --git a/src/WINNT/afsd/cm_memmap.h b/src/WINNT/afsd/cm_memmap.h deleted file mode 100644 index 45686c898..000000000 --- a/src/WINNT/afsd/cm_memmap.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2004, Secure Endpoints Inc. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CM_MEMMAP_H -#define CM_MEMMAP_H 1 - -#define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | 'D'<<24) - -typedef struct cm_config_data { - long size; - long magic; - CHAR * baseAddress; - - long stats; - long chunkSize; - long blockSize; - long bufferSize; - long cacheType; - long dirty; - - cm_volume_t * volumeBaseAddress; - cm_cell_t * cellBaseAddress; - cm_aclent_t * aclBaseAddress; - cm_scache_t * scacheBaseAddress; - cm_nc_t * dnlcBaseAddress; - cm_buf_t * bufHeaderBaseAddress; - char * bufDataBaseAddress; - char * bufEndOfData; - - cm_volume_t * allVolumesp; - long currentVolumes; - long maxVolumes; - - cm_cell_t * allCellsp; - long currentCells; - long maxCells; - - cm_volume_t * rootVolumep; - cm_cell_t * rootCellp; - cm_fid_t rootFid; - cm_scache_t * rootSCachep; - cm_scache_t fakeSCache; - afs_uint32 fakeDirVersion; - - cm_aclent_t * aclLRUp; - cm_aclent_t * aclLRUEndp; - - cm_scache_t ** hashTablep; - long hashTableSize; - - long currentSCaches; - long maxSCaches; - cm_scache_t * scacheLRUFirstp; - cm_scache_t * scacheLRULastp; - - cm_nc_t * ncfreelist; - cm_nc_t * nameCache; - cm_nc_t ** nameHash; - - cm_buf_t * buf_freeListp; - cm_buf_t * buf_freeListEndp; - cm_buf_t ** buf_hashTablepp; - cm_buf_t ** buf_fileHashTablepp; - cm_buf_t * buf_allp; - long buf_nbuffers; - long buf_blockSize; - long buf_hashSize; - long buf_nOrigBuffers; - long buf_reservedBufs; - long buf_maxReservedBufs; - long buf_reserveWaiting; - - time_t mountRootGen; - afsUUID Uuid; -} cm_config_data_t; - -extern cm_config_data_t cm_data; - -DWORD GranularityAdjustment(DWORD size); -DWORD ComputeSizeOfConfigData(void); -DWORD ComputeSizeOfVolumes(DWORD maxvols); -DWORD ComputeSizeOfCells(DWORD maxcells); -DWORD ComputeSizeOfACLCache(DWORD stats); -DWORD ComputeSizeOfSCache(DWORD stats); -DWORD ComputeSizeOfSCacheHT(DWORD stats); -DWORD ComputeSizeOfDNLCache(void); -DWORD ComputeSizeOfDataBuffers(DWORD cacheBlocks, DWORD blockSize); -DWORD ComputeSizeOfDataHT(void); -DWORD ComputeSizeOfDataHeaders(DWORD cacheBlocks); -DWORD ComputeSizeOfMappingFile(DWORD stats, DWORD chunkSize, DWORD cacheBlocks, DWORD blockSize); -PSECURITY_ATTRIBUTES CreateCacheFileSA(); -VOID FreeCacheFileSA(PSECURITY_ATTRIBUTES psa); -int cm_ShutdownMappedMemory(void); -int cm_ValidateMappedMemory(char * cachePath); -int cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, DWORD cacheBlocks ); -#endif /* CM_MEMMAP_H */ \ No newline at end of file diff --git a/src/WINNT/afsd/cm_rpc.c b/src/WINNT/afsd/cm_rpc.c deleted file mode 100644 index ad4d2a136..000000000 --- a/src/WINNT/afsd/cm_rpc.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include - -#include -#ifndef DJGPP -#include "afsrpc.h" -#else -#include "afsrpc95.h" -#endif - -#include "afsd.h" -#include "afsd_init.h" - -#include "smb.h" - -#include - -/* - * The motivation for this whole module is that in transmitting tokens - * between applications and the AFS service, we must not send session keys - * in the clear. So the SetToken and GetToken pioctl's also do an RPC using - * packet privacy to transmit the session key. The pioctl() generates a UUID - * and sends it down, and the RPC sends down the same UUID, so that the service - * can match them up. A list of session keys, searched by UUID, is maintained. - */ - -extern void afsi_log(char *pattern, ...); - -typedef struct tokenEvent { - afs_uuid_t uuid; - char sessionKey[8]; - struct tokenEvent *next; -} tokenEvent_t; - -tokenEvent_t *tokenEvents = NULL; - -osi_mutex_t tokenEventLock; - -EVENT_HANDLE rpc_ShutdownEvent = NULL; - -/* - * Add a new uuid and session key to the list. - */ -void cm_RegisterNewTokenEvent( - afs_uuid_t uuid, - char sessionKey[8]) -{ - tokenEvent_t *te = malloc(sizeof(tokenEvent_t)); - te->uuid = uuid; - memcpy(te->sessionKey, sessionKey, sizeof(te->sessionKey)); - lock_ObtainMutex(&tokenEventLock); - te->next = tokenEvents; - tokenEvents = te; - lock_ReleaseMutex(&tokenEventLock); -} - -/* - * Find a uuid on the list. If it is there, copy the session key and - * destroy the entry, since it is only used once. - * - * Return TRUE if found, FALSE if not found - */ -BOOL cm_FindTokenEvent(afs_uuid_t uuid, char sessionKey[8]) -{ - RPC_STATUS status; - tokenEvent_t *te; - tokenEvent_t **ltep; - - lock_ObtainMutex(&tokenEventLock); - te = tokenEvents; - ltep = &tokenEvents; - while (te) { - if (UuidEqual((UUID *)&uuid, (UUID *)&te->uuid, &status)) { - *ltep = te->next; - lock_ReleaseMutex(&tokenEventLock); - memcpy(sessionKey, te->sessionKey, - sizeof(te->sessionKey)); - free(te); - return TRUE; - } - ltep = &te->next; - te = te->next; - } - lock_ReleaseMutex(&tokenEventLock); - return FALSE; -} - -/* - * RPC manager entry point vector functions - */ - -long AFSRPC_SetToken( - afs_uuid_t uuid, - unsigned char __RPC_FAR sessionKey[8]) -{ - cm_RegisterNewTokenEvent(uuid, sessionKey); - return 0; -} - -long AFSRPC_GetToken( - afs_uuid_t uuid, - unsigned char __RPC_FAR sessionKey[8]) -{ - BOOL found; - - found = cm_FindTokenEvent(uuid, sessionKey); - if (!found) - return 1; - - return 0; -} - -void __RPC_FAR * __RPC_USER midl_user_allocate (size_t cBytes) -{ - return ((void __RPC_FAR *) malloc(cBytes)); -} - -void __RPC_USER midl_user_free(void __RPC_FAR * p) -{ - free(p); -} - -void RpcListen() -{ - RPC_STATUS status; - char *task; - RPC_BINDING_VECTOR *ptrBindingVector = NULL; - BOOLEAN ifaceRegistered = FALSE; - BOOLEAN epRegistered = FALSE; - -#ifdef NOOSIDEBUGSERVER /* Use All Protseqs already done in OSI */ - - status = RpcServerUseAllProtseqs(1, NULL); - if (status != RPC_S_OK) { - task = "Use All Protocol Sequences"; - goto cleanup; - } - -#endif /* NOOSIDEBUGSERVER */ - - status = RpcServerRegisterIf(afsrpc_v1_0_s_ifspec, NULL, NULL); - if (status != RPC_S_OK) { - task = "Register Interface"; - goto cleanup; - } - ifaceRegistered = TRUE; - - status = RpcServerInqBindings(&ptrBindingVector); - if (status != RPC_S_OK) { - task = "Inquire Bindings"; - goto cleanup; - } - - status = RpcServerRegisterAuthInfo(NULL, RPC_C_AUTHN_WINNT, NULL, NULL); - if (status != RPC_S_OK) { - task = "Register Authentication Info"; - goto cleanup; - } - - status = RpcEpRegister(afsrpc_v1_0_s_ifspec, ptrBindingVector, - NULL, "AFS session key interface"); - if (status != RPC_S_OK) { - task = "Register Endpoints"; - goto cleanup; - } - epRegistered = TRUE; - - afsi_log("RPC server listening"); - - status = RpcServerListen(OSI_MAXRPCCALLS, OSI_MAXRPCCALLS, 0); - if (status != RPC_S_OK) { - task = "Server Listen"; - } - -cleanup: - if (epRegistered) - (void) RpcEpUnregister(afsrpc_v1_0_s_ifspec, ptrBindingVector, - NULL); - - if (ptrBindingVector) - (void) RpcBindingVectorFree(&ptrBindingVector); - - if (ifaceRegistered) - (void) RpcServerUnregisterIf(afsrpc_v1_0_s_ifspec, NULL, FALSE); - - if (status != RPC_S_OK) - afsi_log("RPC problem, code %d for %s", status, task); - else - afsi_log("RPC shutdown"); - - if (rpc_ShutdownEvent != NULL) - thrd_SetEvent(rpc_ShutdownEvent); - return; -} - -long RpcInit() -{ - LONG status = ERROR_SUCCESS; - HANDLE listenThread; - ULONG listenThreadID = 0; - char * name = "afsd_rpc_ShutdownEvent"; - - lock_InitializeMutex(&tokenEventLock, "token event lock"); - - rpc_ShutdownEvent = thrd_CreateEvent(NULL, FALSE, FALSE, name); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", name); - - listenThread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)RpcListen, - 0, 0, &listenThreadID); - - if (listenThread == NULL) { - status = GetLastError(); - } - CloseHandle(listenThread); - - return status; -} - -void RpcShutdown(void) -{ - RpcMgmtStopServerListening(NULL); - - if (rpc_ShutdownEvent != NULL) { - thrd_WaitForSingleObject_Event(rpc_ShutdownEvent, INFINITE); - CloseHandle(rpc_ShutdownEvent); - } -} - diff --git a/src/WINNT/afsd/cm_rpc.h b/src/WINNT/afsd/cm_rpc.h deleted file mode 100644 index 8571ad782..000000000 --- a/src/WINNT/afsd/cm_rpc.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_RPC_H__ -#define __CM_RPC_H__ - -#ifndef DJGPP -#include "afsrpc.h" -#else -#include "afsrpc95.h" -#endif - -void cm_RegisterNewTokenEvent(afs_uuid_t uuid, char sessionKey[8]); -BOOL cm_FindTokenEvent(afs_uuid_t uuid, char sessionKey[8]); - -extern long RpcInit(void); -extern void RpcShutdown(void); -#endif /* __CM_RPC_H__ */ diff --git a/src/WINNT/afsd/cm_rpc95.h b/src/WINNT/afsd/cm_rpc95.h deleted file mode 100644 index 0b5a63bd8..000000000 --- a/src/WINNT/afsd/cm_rpc95.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_RPC_H__ -#define __CM_RPC_H__ - -/* Copied from declaration of GUID in RPCDCE.H */ -typedef struct afs_uuid { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; -} afs_uuid_t; - -long AFSRPC_SetToken( - afs_uuid_t uuid, - unsigned char sessionKey[8] -); - -long AFSRPC_GetToken( - afs_uuid_t uuid, - unsigned char sessionKey[8] -); - -#endif /* __CM_RPC_H__ */ diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c deleted file mode 100644 index 304edbc0f..000000000 --- a/src/WINNT/afsd/cm_scache.c +++ /dev/null @@ -1,1230 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#include -#endif /* !DJGPP */ -#include -#include -#include -#include - -#include "afsd.h" - -/*extern void afsi_log(char *pattern, ...);*/ - -extern osi_hyper_t hzero; - -/* File locks */ -osi_queue_t *cm_allFileLocks; - -/* lock for globals */ -osi_rwlock_t cm_scacheLock; - -/* Dummy scache entry for use with pioctl fids */ -cm_scache_t cm_fakeSCache; - -#ifdef AFS_FREELANCE_CLIENT -extern osi_mutex_t cm_Freelance_Lock; -#endif - -/* must be called with cm_scacheLock write-locked! */ -void cm_AdjustLRU(cm_scache_t *scp) -{ - if (scp == cm_data.scacheLRULastp) - cm_data.scacheLRULastp = (cm_scache_t *) osi_QPrev(&scp->q); - osi_QRemove((osi_queue_t **) &cm_data.scacheLRUFirstp, &scp->q); - osi_QAdd((osi_queue_t **) &cm_data.scacheLRUFirstp, &scp->q); - if (!cm_data.scacheLRULastp) - cm_data.scacheLRULastp = scp; -} - -/* called with cm_scacheLock write-locked; find a vnode to recycle. - * Can allocate a new one if desperate, or if below quota (cm_data.maxSCaches). - */ -cm_scache_t *cm_GetNewSCache(void) -{ - cm_scache_t *scp; - int i; - cm_scache_t **lscpp; - cm_scache_t *tscp; - - if (cm_data.currentSCaches >= cm_data.maxSCaches) { - for (scp = cm_data.scacheLRULastp; - scp; - scp = (cm_scache_t *) osi_QPrev(&scp->q)) { - if (scp->refCount == 0) - break; - } - - if (scp) { - osi_assert(scp >= cm_data.scacheBaseAddress && scp < (cm_scache_t *)cm_data.hashTablep); - /* we found an entry, so return it */ - if (scp->flags & CM_SCACHEFLAG_INHASH) { - /* hash it out first */ - i = CM_SCACHE_HASH(&scp->fid); - for (lscpp = &cm_data.hashTablep[i], tscp = cm_data.hashTablep[i]; - tscp; - lscpp = &tscp->nextp, tscp = tscp->nextp) { - if (tscp == scp) { - *lscpp = scp->nextp; - scp->flags &= ~CM_SCACHEFLAG_INHASH; - break; - } - } - osi_assertx(tscp, "afsd: scache hash screwup"); - } - - /* look for things that shouldn't still be set */ - osi_assert(scp->bufWritesp == NULL); - osi_assert(scp->bufReadsp == NULL); - - /* invalidate so next merge works fine; - * also initialize some flags */ - scp->flags &= ~(CM_SCACHEFLAG_STATD - | CM_SCACHEFLAG_RO - | CM_SCACHEFLAG_PURERO - | CM_SCACHEFLAG_OVERQUOTA - | CM_SCACHEFLAG_OUTOFSPACE); - scp->serverModTime = 0; - scp->dataVersion = 0; - scp->bulkStatProgress = hzero; - - /* discard callback */ - if (scp->cbServerp) { - cm_PutServer(scp->cbServerp); - scp->cbServerp = NULL; - } - scp->cbExpires = 0; - - /* remove from dnlc */ - cm_dnlcPurgedp(scp); - cm_dnlcPurgevp(scp); - - /* discard cached status; if non-zero, Close - * tried to store this to server but failed */ - scp->mask = 0; - - /* drop held volume ref */ - if (scp->volp) { - cm_PutVolume(scp->volp); - scp->volp = NULL; - } - - /* discard symlink info */ - scp->mountPointStringp[0] = 0; - memset(&scp->mountRootFid, 0, sizeof(cm_fid_t)); - memset(&scp->dotdotFid, 0, sizeof(cm_fid_t)); - - /* not locked, but there can be no references to this guy - * while we hold the global refcount lock. - */ - cm_FreeAllACLEnts(scp); - - /* now remove from the LRU queue and put it back at the - * head of the LRU queue. - */ - cm_AdjustLRU(scp); - - /* and we're done */ - return scp; - } - } - - /* if we get here, we should allocate a new scache entry. We either are below - * quota or we have a leak and need to allocate a new one to avoid panicing. - */ - scp = cm_data.scacheBaseAddress + cm_data.currentSCaches; - osi_assert(scp >= cm_data.scacheBaseAddress && scp < (cm_scache_t *)cm_data.hashTablep); - memset(scp, 0, sizeof(cm_scache_t)); - scp->magic = CM_SCACHE_MAGIC; - lock_InitializeMutex(&scp->mx, "cm_scache_t mutex"); - lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock"); - - /* and put it in the LRU queue */ - osi_QAdd((osi_queue_t **) &cm_data.scacheLRUFirstp, &scp->q); - if (!cm_data.scacheLRULastp) - cm_data.scacheLRULastp = scp; - cm_data.currentSCaches++; - cm_dnlcPurgedp(scp); /* make doubly sure that this is not in dnlc */ - cm_dnlcPurgevp(scp); - return scp; -} - -/* like strcmp, only for fids */ -int cm_FidCmp(cm_fid_t *ap, cm_fid_t *bp) -{ - if (ap->vnode != bp->vnode) - return 1; - if (ap->volume != bp->volume) - return 1; - if (ap->unique != bp->unique) - return 1; - if (ap->cell != bp->cell) - return 1; - return 0; -} - -void cm_fakeSCacheInit(int newFile) -{ - if ( newFile ) { - memset(&cm_data.fakeSCache, 0, sizeof(cm_scache_t)); - cm_data.fakeSCache.cbServerp = (struct cm_server *)(-1); - /* can leave clientModTime at 0 */ - cm_data.fakeSCache.fileType = CM_SCACHETYPE_FILE; - cm_data.fakeSCache.unixModeBits = 0777; - cm_data.fakeSCache.length.LowPart = 1000; - cm_data.fakeSCache.linkCount = 1; - cm_data.fakeSCache.refCount = 1; - } - lock_InitializeMutex(&cm_data.fakeSCache.mx, "cm_scache_t mutex"); -} - -long -cm_ValidateSCache(void) -{ - cm_scache_t * scp; - long i; - - for ( scp = cm_data.scacheLRUFirstp; scp; - scp = (cm_scache_t *) osi_QNext(&scp->q) ) { - if (scp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC\n"); - return -1; - } - if (scp->nextp && scp->nextp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->nextp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->nextp->magic != CM_SCACHE_MAGIC\n"); - return -2; - } - if (scp->randomACLp && scp->randomACLp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n"); - return -3; - } - if (scp->volp && scp->volp->magic != CM_VOLUME_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n"); - return -4; - } - } - - for ( scp = cm_data.scacheLRULastp; scp; - scp = (cm_scache_t *) osi_QPrev(&scp->q) ) { - if (scp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC\n"); - return -5; - } - if (scp->nextp && scp->nextp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->nextp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->nextp->magic != CM_SCACHE_MAGIC\n"); - return -6; - } - if (scp->randomACLp && scp->randomACLp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n"); - return -7; - } - if (scp->volp && scp->volp->magic != CM_VOLUME_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n"); - return -8; - } - } - - for ( i=0; i < cm_data.hashTableSize; i++ ) { - for ( scp = cm_data.hashTablep[i]; scp; scp = scp->nextp ) { - if (scp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC\n"); - return -9; - } - if (scp->nextp && scp->nextp->magic != CM_SCACHE_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->nextp->magic != CM_SCACHE_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->nextp->magic != CM_SCACHE_MAGIC\n"); - return -10; - } - if (scp->randomACLp && scp->randomACLp->magic != CM_ACLENT_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n"); - return -11; - } - if (scp->volp && scp->volp->magic != CM_VOLUME_MAGIC) { - afsi_log("cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC"); - fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n"); - return -12; - } - } - } - - return cm_dnlcValidate(); -} - -long -cm_ShutdownSCache(void) -{ - cm_scache_t * scp; - - for ( scp = cm_data.scacheLRULastp; scp; - scp = (cm_scache_t *) osi_QPrev(&scp->q) ) { - if (scp->randomACLp) { - lock_ObtainWrite(&scp->mx); - cm_FreeAllACLEnts(scp); - lock_ReleaseWrite(&scp->mx); - } - lock_FinalizeMutex(&scp->mx); - lock_FinalizeRWLock(&scp->bufCreateLock); - } - - return cm_dnlcShutdown(); -} - -void cm_InitSCache(int newFile, long maxSCaches) -{ - static osi_once_t once; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_scacheLock, "cm_scacheLock"); - if ( newFile ) { - memset(cm_data.hashTablep, 0, sizeof(cm_scache_t *) * cm_data.hashTableSize); - cm_data.currentSCaches = 0; - cm_data.maxSCaches = maxSCaches; - cm_data.scacheLRUFirstp = cm_data.scacheLRULastp = NULL; - } else { - cm_scache_t * scp; - - for ( scp = cm_data.scacheLRULastp; scp; - scp = (cm_scache_t *) osi_QPrev(&scp->q) ) { - lock_InitializeMutex(&scp->mx, "cm_scache_t mutex"); - lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock"); - - scp->cbServerp = NULL; - scp->cbExpires = 0; - scp->fileLocks = NULL; - scp->openReads = 0; - scp->openWrites = 0; - scp->openShares = 0; - scp->openExcls = 0; - } - } - cm_allFileLocks = NULL; - cm_fakeSCacheInit(newFile); - cm_dnlcInit(newFile); - osi_EndOnce(&once); - } -} - -/* version that doesn't bother creating the entry if we don't find it */ -cm_scache_t *cm_FindSCache(cm_fid_t *fidp) -{ - long hash; - cm_scache_t *scp; - - hash = CM_SCACHE_HASH(fidp); - - osi_assert(fidp->cell != 0); - - lock_ObtainWrite(&cm_scacheLock); - for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - if (cm_FidCmp(fidp, &scp->fid) == 0) { - cm_HoldSCacheNoLock(scp); - cm_AdjustLRU(scp); - lock_ReleaseWrite(&cm_scacheLock); - return scp; - } - } - lock_ReleaseWrite(&cm_scacheLock); - return NULL; -} - -long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, - cm_req_t *reqp) -{ - long hash; - cm_scache_t *scp; - long code; - cm_volume_t *volp = 0; - cm_cell_t *cellp; - char* mp = 0; - int special; // yj: boolean variable to test if file is on root.afs - int isRoot; - extern cm_fid_t cm_rootFid; - - hash = CM_SCACHE_HASH(fidp); - - osi_assert(fidp->cell != 0); - - if (fidp->cell== cm_data.rootFid.cell && - fidp->volume==cm_data.rootFid.volume && - fidp->vnode==0x0 && fidp->unique==0x0) - { - osi_Log0(afsd_logp,"cm_getSCache called with root cell/volume and vnode=0 and unique=0"); - } - - // yj: check if we have the scp, if so, we don't need - // to do anything else - lock_ObtainWrite(&cm_scacheLock); - for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - if (cm_FidCmp(fidp, &scp->fid) == 0) { - cm_HoldSCacheNoLock(scp); - *outScpp = scp; - cm_AdjustLRU(scp); - lock_ReleaseWrite(&cm_scacheLock); - return 0; - } - } - - // yj: when we get here, it means we don't have an scp - // so we need to either load it or fake it, depending - // on whether the file is "special", see below. - - // yj: if we're trying to get an scp for a file that's - // on root.afs of homecell, we want to handle it specially - // because we have to fill in the status stuff 'coz we - // don't want trybulkstat to fill it in for us -#ifdef AFS_FREELANCE_CLIENT - special = (fidp->cell==AFS_FAKE_ROOT_CELL_ID && - fidp->volume==AFS_FAKE_ROOT_VOL_ID && - !(fidp->vnode==0x1 && fidp->unique==0x1)); - isRoot = (fidp->cell==AFS_FAKE_ROOT_CELL_ID && - fidp->volume==AFS_FAKE_ROOT_VOL_ID && - fidp->vnode==0x1 && fidp->unique==0x1); - if (cm_freelanceEnabled && isRoot) { - osi_Log0(afsd_logp,"cm_getSCache Freelance and isRoot"); - /* freelance: if we are trying to get the root scp for the first - * time, we will just put in a place holder entry. - */ - volp = NULL; - } - - if (cm_freelanceEnabled && special) { - osi_Log0(afsd_logp,"cm_getSCache Freelance and special"); - if (fidp->vnode > 1 && fidp->vnode <= cm_localMountPoints + 2) { - lock_ObtainMutex(&cm_Freelance_Lock); - mp =(cm_localMountPoints+fidp->vnode-2)->mountPointStringp; - lock_ReleaseMutex(&cm_Freelance_Lock); - } else { - mp = ""; - } - scp = cm_GetNewSCache(); - - scp->fid = *fidp; - scp->volp = cm_data.rootSCachep->volp; - scp->dotdotFid.cell=AFS_FAKE_ROOT_CELL_ID; - scp->dotdotFid.volume=AFS_FAKE_ROOT_VOL_ID; - scp->dotdotFid.unique=1; - scp->dotdotFid.vnode=1; - scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO); - scp->nextp=cm_data.hashTablep[hash]; - cm_data.hashTablep[hash]=scp; - scp->flags |= CM_SCACHEFLAG_INHASH; - scp->refCount = 1; - if (fidp->vnode > 1 && fidp->vnode <= cm_localMountPoints + 2) - scp->fileType = (cm_localMountPoints+fidp->vnode-2)->fileType; - else - scp->fileType = CM_SCACHETYPE_INVALID; - - lock_ObtainMutex(&cm_Freelance_Lock); - scp->length.LowPart = strlen(mp)+4; - strncpy(scp->mountPointStringp,mp,MOUNTPOINTLEN); - scp->mountPointStringp[MOUNTPOINTLEN-1] = '\0'; - lock_ReleaseMutex(&cm_Freelance_Lock); - - scp->owner=0x0; - scp->unixModeBits=0x1ff; - scp->clientModTime=FakeFreelanceModTime; - scp->serverModTime=FakeFreelanceModTime; - scp->parentUnique = 0x1; - scp->parentVnode=0x1; - scp->group=0; - scp->dataVersion=cm_data.fakeDirVersion; - *outScpp = scp; - lock_ReleaseWrite(&cm_scacheLock); - /*afsi_log(" getscache done");*/ - return 0; - } - // end of yj code -#endif /* AFS_FREELANCE_CLIENT */ - - /* otherwise, we need to find the volume */ - if (!cm_freelanceEnabled || !isRoot) { - lock_ReleaseWrite(&cm_scacheLock); /* for perf. reasons */ - cellp = cm_FindCellByID(fidp->cell); - if (!cellp) - return CM_ERROR_NOSUCHCELL; - - code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp); - if (code) - return code; - lock_ObtainWrite(&cm_scacheLock); - } - - /* otherwise, we have the volume, now reverify that the scp doesn't - * exist, and proceed. - */ - for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - if (cm_FidCmp(fidp, &scp->fid) == 0) { - cm_HoldSCacheNoLock(scp); - osi_assert(scp->volp == volp); - cm_AdjustLRU(scp); - lock_ReleaseWrite(&cm_scacheLock); - if (volp) - cm_PutVolume(volp); - *outScpp = scp; - return 0; - } - } - - /* now, if we don't have the fid, recycle something */ - scp = cm_GetNewSCache(); - osi_assert(!(scp->flags & CM_SCACHEFLAG_INHASH)); - scp->fid = *fidp; - scp->volp = volp; /* a held reference */ - - if (!cm_freelanceEnabled || !isRoot) { - /* if this scache entry represents a volume root then we need - * to copy the dotdotFipd from the volume structure where the - * "master" copy is stored (defect 11489) - */ - if (scp->fid.vnode == 1 && scp->fid.unique == 1) { - scp->dotdotFid = volp->dotdotFid; - } - - if (volp->roID == fidp->volume) - scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO); - else if (volp->bkID == fidp->volume) - scp->flags |= CM_SCACHEFLAG_RO; - } - scp->nextp = cm_data.hashTablep[hash]; - cm_data.hashTablep[hash] = scp; - scp->flags |= CM_SCACHEFLAG_INHASH; - scp->refCount = 1; - - /* XXX - The following fields in the cm_scache are - * uninitialized: - * fileType - * parentVnode - * parentUnique - */ - lock_ReleaseWrite(&cm_scacheLock); - - /* now we have a held scache entry; just return it */ - *outScpp = scp; - return 0; -} - -/* synchronize a fetch, store, read, write, fetch status or store status. - * Called with scache mutex held, and returns with it held, but temporarily - * drops it during the fetch. - * - * At most one flag can be on in flags, if this is an RPC request. - * - * Also, if we're fetching or storing data, we must ensure that we have a buffer. - * - * There are a lot of weird restrictions here; here's an attempt to explain the - * rationale for the concurrency restrictions implemented in this function. - * - * First, although the file server will break callbacks when *another* machine - * modifies a file or status block, the client itself is responsible for - * concurrency control on its own requests. Callback breaking events are rare, - * and simply invalidate any concurrent new status info. - * - * In the absence of callback breaking messages, we need to know how to - * synchronize incoming responses describing updates to files. We synchronize - * operations that update the data version by comparing the data versions. - * However, updates that do not update the data, but only the status, can't be - * synchronized with fetches or stores, since there's nothing to compare - * to tell which operation executed first at the server. - * - * Thus, we can allow multiple ops that change file data, or dir data, and - * fetches. However, status storing ops have to be done serially. - * - * Furthermore, certain data-changing ops are incompatible: we can't read or - * write a buffer while doing a truncate. We can't read and write the same - * buffer at the same time, or write while fetching or storing, or read while - * fetching a buffer (this may change). We can't fetch and store at the same - * time, either. - * - * With respect to status, we can't read and write at the same time, read while - * fetching, write while fetching or storing, or fetch and store at the same time. - * - * We can't allow a get callback RPC to run in concurrently with something that - * will return updated status, since we could start a call, have the server - * return status, have another machine make an update to the status (which - * doesn't change serverModTime), have the original machine get a new callback, - * and then have the original machine merge in the early, old info from the - * first call. At this point, the easiest way to avoid this problem is to have - * getcallback calls conflict with all others for the same vnode. Other calls - * to cm_MergeStatus that aren't associated with calls to cm_SyncOp on the same - * vnode must be careful not to merge in their status unless they have obtained - * a callback from the start of their call. - * - * Note added 1/23/96 - * Concurrent StoreData RPC's can cause trouble if the file is being extended. - * Each such RPC passes a FileLength parameter, which the server uses to do - * pre-truncation if necessary. So if two RPC's are processed out of order at - * the server, the one with the smaller FileLength will be processed last, - * possibly resulting in a bogus truncation. The simplest way to avoid this - * is to serialize all StoreData RPC's. This is the reason we defined - * CM_SCACHESYNC_STOREDATA_EXCL and CM_SCACHEFLAG_DATASTORING. - */ -long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *up, cm_req_t *reqp, - long rights, long flags) -{ - osi_queueData_t *qdp; - long code; - cm_buf_t *tbufp; - long outRights; - int bufLocked; - - /* lookup this first */ - bufLocked = flags & CM_SCACHESYNC_BUFLOCKED; - - /* some minor assertions */ - if (flags & (CM_SCACHESYNC_STOREDATA | CM_SCACHESYNC_FETCHDATA - | CM_SCACHESYNC_READ | CM_SCACHESYNC_WRITE - | CM_SCACHESYNC_SETSIZE)) { - if (bufp) { - osi_assert(bufp->refCount > 0); - /* - osi_assert(cm_FidCmp(&bufp->fid, &scp->fid) == 0); - */ - } - } - else osi_assert(bufp == NULL); - - /* Do the access check. Now we don't really do the access check - * atomically, since the caller doesn't expect the parent dir to be - * returned locked, and that is what we'd have to do to prevent a - * callback breaking message on the parent due to a setacl call from - * being processed while we're running. So, instead, we check things - * here, and if things look fine with the access, we proceed to finish - * the rest of this check. Sort of a hack, but probably good enough. - */ - - while (1) { - if (flags & CM_SCACHESYNC_FETCHSTATUS) { - /* if we're bringing in a new status block, ensure that - * we aren't already doing so, and that no one is - * changing the status concurrently, either. We need - * to do this, even if the status is of a different - * type, since we don't have the ability to figure out, - * in the AFS 3 protocols, which status-changing - * operation ran first, or even which order a read and - * a write occurred in. - */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING - | CM_SCACHEFLAG_SIZESTORING | CM_SCACHEFLAG_GETCALLBACK)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING|GETCALLBACK want FETCHSTATUS", scp); - goto sleep; - } - } - if (flags & (CM_SCACHESYNC_STORESIZE | CM_SCACHESYNC_STORESTATUS - | CM_SCACHESYNC_SETSIZE | CM_SCACHESYNC_GETCALLBACK)) { - /* if we're going to make an RPC to change the status, make sure - * that no one is bringing in or sending out the status. - */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING | - CM_SCACHEFLAG_SIZESTORING | CM_SCACHEFLAG_GETCALLBACK)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING|GETCALLBACK want STORESIZE|STORESTATUS|SETSIZE|GETCALLBACK", scp); - goto sleep; - } - if (scp->bufReadsp || scp->bufWritesp) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is bufRead|bufWrite want STORESIZE|STORESTATUS|SETSIZE|GETCALLBACK", scp); - goto sleep; - } - } - if (flags & CM_SCACHESYNC_FETCHDATA) { - /* if we're bringing in a new chunk of data, make sure that - * nothing is happening to that chunk, and that we aren't - * changing the basic file status info, either. - */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING - | CM_SCACHEFLAG_SIZESTORING | CM_SCACHEFLAG_GETCALLBACK)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING|GETCALLBACK want FETCHDATA", scp); - goto sleep; - } - if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want FETCHDATA", scp); - goto sleep; - } - } - if (flags & CM_SCACHESYNC_STOREDATA) { - /* same as fetch data */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING - | CM_SCACHEFLAG_SIZESTORING | CM_SCACHEFLAG_GETCALLBACK)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING|GETCALLBACK want STOREDATA", scp); - goto sleep; - } - if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want STOREDATA", scp); - goto sleep; - } - } - - if (flags & CM_SCACHESYNC_STOREDATA_EXCL) { - /* Don't allow concurrent StoreData RPC's */ - if (scp->flags & CM_SCACHEFLAG_DATASTORING) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is DATASTORING want STOREDATA_EXCL", scp); - goto sleep; - } - } - - if (flags & CM_SCACHESYNC_ASYNCSTORE) { - /* Don't allow more than one BKG store request */ - if (scp->flags & CM_SCACHEFLAG_ASYNCSTORING) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is ASYNCSTORING want ASYNCSTORE", scp); - goto sleep; - } - } - - if (flags & CM_SCACHESYNC_LOCK) { - /* Don't allow concurrent fiddling with lock lists */ - if (scp->flags & CM_SCACHEFLAG_LOCKING) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is LOCKING want LOCK", scp); - goto sleep; - } - } - - /* now the operations that don't correspond to making RPCs */ - if (flags & CM_SCACHESYNC_GETSTATUS) { - /* we can use the status that's here, if we're not - * bringing in new status. - */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING want GETSTATUS", scp); - goto sleep; - } - } - if (flags & CM_SCACHESYNC_SETSTATUS) { - /* we can make a change to the local status, as long as - * the status isn't changing now. - * - * If we're fetching or storing a chunk of data, we can - * change the status locally, since the fetch/store - * operations don't change any of the data that we're - * changing here. - */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING - | CM_SCACHEFLAG_SIZESTORING)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING want SETSTATUS", scp); - goto sleep; - } - } - if (flags & CM_SCACHESYNC_READ) { - /* we're going to read the data, make sure that the - * status is available, and that the data is here. It - * is OK to read while storing the data back. - */ - if (scp->flags & CM_SCACHEFLAG_FETCHING) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING want READ", scp); - goto sleep; - } - if (bufp && ((bufp->cmFlags - & (CM_BUF_CMFETCHING - | CM_BUF_CMFULLYFETCHED)) - == CM_BUF_CMFETCHING)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING want READ", scp); - goto sleep; - } - } - if (flags & CM_SCACHESYNC_WRITE) { - /* don't write unless the status is stable and the chunk - * is stable. - */ - if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING - | CM_SCACHEFLAG_SIZESTORING)) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING want WRITE", scp); - goto sleep; - } - if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) { - osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want WRITE", scp); - goto sleep; - } - } - - // yj: modified this so that callback only checked if we're - // not checking something on /afs - /* fix the conditional to match the one in cm_HaveCallback */ - if ( (flags & CM_SCACHESYNC_NEEDCALLBACK) -#ifdef AFS_FREELANCE_CLIENT - && (!cm_freelanceEnabled || - !(scp->fid.vnode==0x1 && scp->fid.unique==0x1) || - scp->fid.cell!=AFS_FAKE_ROOT_CELL_ID || - scp->fid.volume!=AFS_FAKE_ROOT_VOL_ID || - cm_fakeDirCallback < 2) -#endif /* AFS_FREELANCE_CLIENT */ - ) { - if (!cm_HaveCallback(scp)) { - osi_Log1(afsd_logp, "CM SyncOp getting callback on scp %x", - (long) scp); - if (bufLocked) lock_ReleaseMutex(&bufp->mx); - code = cm_GetCallback(scp, up, reqp, 0); - if (bufLocked) { - lock_ReleaseMutex(&scp->mx); - lock_ObtainMutex(&bufp->mx); - lock_ObtainMutex(&scp->mx); - } - if (code) - return code; - continue; - } - } - - if (rights) { - /* can't check access rights without a callback */ - osi_assert(flags & CM_SCACHESYNC_NEEDCALLBACK); - - if ((rights & PRSFS_WRITE) && (scp->flags & CM_SCACHEFLAG_RO)) - return CM_ERROR_READONLY; - - if (cm_HaveAccessRights(scp, up, rights, &outRights)) { - if (~outRights & rights) return CM_ERROR_NOACCESS; - } - else { - /* we don't know the required access rights */ - if (bufLocked) lock_ReleaseMutex(&bufp->mx); - code = cm_GetAccessRights(scp, up, reqp); - if (code) - return code; - if (bufLocked) { - lock_ReleaseMutex(&scp->mx); - lock_ObtainMutex(&bufp->mx); - lock_ObtainMutex(&scp->mx); - } - continue; - } - } - - /* if we get here, we're happy */ - break; - - sleep: - /* first check if we're not supposed to wait: fail - * in this case, returning with everything still locked. - */ - if (flags & CM_SCACHESYNC_NOWAIT) - return CM_ERROR_WOULDBLOCK; - - /* wait here, then try again */ - osi_Log1(afsd_logp, "CM SyncOp sleeping scp 0x%x", scp); - if ( scp->flags & CM_SCACHEFLAG_WAITING ) { - osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING already set for 0x%x", scp); - } else { - osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING set for 0x%x", scp); - scp->flags |= CM_SCACHEFLAG_WAITING; - } - if (bufLocked) - lock_ReleaseMutex(&bufp->mx); - osi_SleepM((long) &scp->flags, &scp->mx); - if (bufLocked) - lock_ObtainMutex(&bufp->mx); - lock_ObtainMutex(&scp->mx); - osi_Log1(afsd_logp, "CM SyncOp woke! scp 0x%x", scp); - } /* big while loop */ - - /* now, update the recorded state for RPC-type calls */ - if (flags & CM_SCACHESYNC_FETCHSTATUS) - scp->flags |= CM_SCACHEFLAG_FETCHING; - if (flags & CM_SCACHESYNC_STORESTATUS) - scp->flags |= CM_SCACHEFLAG_STORING; - if (flags & CM_SCACHESYNC_STORESIZE) - scp->flags |= CM_SCACHEFLAG_SIZESTORING; - if (flags & CM_SCACHESYNC_GETCALLBACK) - scp->flags |= CM_SCACHEFLAG_GETCALLBACK; - if (flags & CM_SCACHESYNC_STOREDATA_EXCL) - scp->flags |= CM_SCACHEFLAG_DATASTORING; - if (flags & CM_SCACHESYNC_ASYNCSTORE) - scp->flags |= CM_SCACHEFLAG_ASYNCSTORING; - if (flags & CM_SCACHESYNC_LOCK) - scp->flags |= CM_SCACHEFLAG_LOCKING; - - /* now update the buffer pointer */ - if (flags & CM_SCACHESYNC_FETCHDATA) { - /* ensure that the buffer isn't already in the I/O list */ - if (bufp) { - for(qdp = scp->bufReadsp; qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { - tbufp = osi_GetQData(qdp); - osi_assert(tbufp != bufp); - } - } - - /* queue a held reference to the buffer in the "reading" I/O list */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, bufp); - if (bufp) { - buf_Hold(bufp); - bufp->cmFlags |= CM_BUF_CMFETCHING; - } - osi_QAdd((osi_queue_t **) &scp->bufReadsp, &qdp->q); - } - - if (flags & CM_SCACHESYNC_STOREDATA) { - /* ensure that the buffer isn't already in the I/O list */ - if (bufp) { - for(qdp = scp->bufWritesp; qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { - tbufp = osi_GetQData(qdp); - osi_assert(tbufp != bufp); - } - } - - /* queue a held reference to the buffer in the "writing" I/O list */ - qdp = osi_QDAlloc(); - osi_SetQData(qdp, bufp); - if (bufp) { - buf_Hold(bufp); - bufp->cmFlags |= CM_BUF_CMSTORING; - } - osi_QAdd((osi_queue_t **) &scp->bufWritesp, &qdp->q); - } - - return 0; -} - -/* for those syncops that setup for RPCs. - * Called with scache locked. - */ -void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, long flags) -{ - osi_queueData_t *qdp; - cm_buf_t *tbufp; - - /* now, update the recorded state for RPC-type calls */ - if (flags & CM_SCACHESYNC_FETCHSTATUS) - scp->flags &= ~CM_SCACHEFLAG_FETCHING; - if (flags & CM_SCACHESYNC_STORESTATUS) - scp->flags &= ~CM_SCACHEFLAG_STORING; - if (flags & CM_SCACHESYNC_STORESIZE) - scp->flags &= ~CM_SCACHEFLAG_SIZESTORING; - if (flags & CM_SCACHESYNC_GETCALLBACK) - scp->flags &= ~CM_SCACHEFLAG_GETCALLBACK; - if (flags & CM_SCACHESYNC_STOREDATA_EXCL) - scp->flags &= ~CM_SCACHEFLAG_DATASTORING; - if (flags & CM_SCACHESYNC_ASYNCSTORE) - scp->flags &= ~CM_SCACHEFLAG_ASYNCSTORING; - if (flags & CM_SCACHESYNC_LOCK) - scp->flags &= ~CM_SCACHEFLAG_LOCKING; - - /* now update the buffer pointer */ - if (flags & CM_SCACHESYNC_FETCHDATA) { - /* ensure that the buffer isn't already in the I/O list */ - for(qdp = scp->bufReadsp; qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { - tbufp = osi_GetQData(qdp); - if (tbufp == bufp) break; - } - osi_assert(qdp != NULL); - osi_assert(osi_GetQData(qdp) == bufp); - osi_QRemove((osi_queue_t **) &scp->bufReadsp, &qdp->q); - osi_QDFree(qdp); - if (bufp) { - bufp->cmFlags &= - ~(CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED); - buf_Release(bufp); - } - } - - /* now update the buffer pointer */ - if (flags & CM_SCACHESYNC_STOREDATA) { - /* ensure that the buffer isn't already in the I/O list */ - for(qdp = scp->bufWritesp; qdp; qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) { - tbufp = osi_GetQData(qdp); - if (tbufp == bufp) break; - } - osi_assert(qdp != NULL); - osi_assert(osi_GetQData(qdp) == bufp); - osi_QRemove((osi_queue_t **) &scp->bufWritesp, &qdp->q); - osi_QDFree(qdp); - if (bufp) { - bufp->cmFlags &= ~CM_BUF_CMSTORING; - buf_Release(bufp); - } - } - - /* and wakeup anyone who is waiting */ - if (scp->flags & CM_SCACHEFLAG_WAITING) { - osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING reset for 0x%x", scp); - scp->flags &= ~CM_SCACHEFLAG_WAITING; - osi_Wakeup((long) &scp->flags); - } -} - -/* merge in a response from an RPC. The scp must be locked, and the callback - * is optional. - * - * Don't overwrite any status info that is dirty, since we could have a store - * operation (such as store data) that merges some info in, and we don't want - * to lose the local updates. Typically, there aren't many updates we do - * locally, anyway, probably only mtime. - * - * There is probably a bug in here where a chmod (which doesn't change - * serverModTime) that occurs between two fetches, both of whose responses are - * handled after the callback breaking is done, but only one of whose calls - * started before that, can cause old info to be merged from the first call. - */ -void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp, - cm_user_t *userp, int flags) -{ - // yj: i want to create some fake status for the /afs directory and the - // entries under that directory -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled && scp == cm_data.rootSCachep) { - osi_Log0(afsd_logp,"cm_MergeStatus Freelance cm_data.rootSCachep"); - statusp->InterfaceVersion = 0x1; - statusp->FileType = CM_SCACHETYPE_DIRECTORY; - statusp->LinkCount = scp->linkCount; - statusp->Length = cm_fakeDirSize; - statusp->DataVersion = cm_data.fakeDirVersion; - statusp->Author = 0x1; - statusp->Owner = 0x0; - statusp->CallerAccess = 0x9; - statusp->AnonymousAccess = 0x9; - statusp->UnixModeBits = 0x1ff; - statusp->ParentVnode = 0x1; - statusp->ParentUnique = 0x1; - statusp->ResidencyMask = 0; - statusp->ClientModTime = FakeFreelanceModTime; - statusp->ServerModTime = FakeFreelanceModTime; - statusp->Group = 0; - statusp->SyncCounter = 0; - statusp->dataVersionHigh = 0; - } -#endif /* AFS_FREELANCE_CLIENT */ - - if (!(flags & CM_MERGEFLAG_FORCE) - && statusp->DataVersion < (unsigned long) scp->dataVersion) { - struct cm_cell *cellp; - struct cm_volume *volp; - - cellp = cm_FindCellByID(scp->fid.cell); - cm_GetVolumeByID(cellp, scp->fid.volume, userp, - (cm_req_t *) NULL, &volp); - if (scp->cbServerp) - osi_Log2(afsd_logp, "old data from server %x volume %s", - scp->cbServerp->addr.sin_addr.s_addr, - volp->namep); - osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %d, RPC dv %d", - scp, scp->dataVersion, statusp->DataVersion); - /* we have a number of data fetch/store operations running - * concurrently, and we can tell which one executed last at the - * server by its mtime. - * Choose the one with the largest mtime, and ignore the rest. - * - * These concurrent calls are incompatible with setting the - * mtime, so we won't have a locally changed mtime here. - * - * We could also have ACL info for a different user than usual, - * in which case we have to do that part of the merge, anyway. - * We won't have to worry about the info being old, since we - * won't have concurrent calls - * that change file status running from this machine. - * - * Added 3/17/98: if we see data version regression on an RO - * file, it's probably due to a server holding an out-of-date - * replica, rather than to concurrent RPC's. Failures to - * release replicas are now flagged by the volserver, but only - * since AFS 3.4 5.22, so there are plenty of clients getting - * out-of-date replicas out there. - * - * If we discover an out-of-date replica, by this time it's too - * late to go to another server and retry. Also, we can't - * reject the merge, because then there is no way for - * GetAccess to do its work, and the caller gets into an - * infinite loop. So we just grin and bear it. - */ - if (!(scp->flags & CM_SCACHEFLAG_RO)) - return; - } - scp->serverModTime = statusp->ServerModTime; - - if (!(scp->mask & CM_SCACHEMASK_CLIENTMODTIME)) { - scp->clientModTime = statusp->ClientModTime; - } - if (!(scp->mask & CM_SCACHEMASK_LENGTH)) { - scp->length.LowPart = statusp->Length; - scp->length.HighPart = 0; - } - - scp->serverLength.LowPart = statusp->Length; - scp->serverLength.HighPart = 0; - - scp->linkCount = statusp->LinkCount; - scp->dataVersion = statusp->DataVersion; - scp->owner = statusp->Owner; - scp->group = statusp->Group; - scp->unixModeBits = statusp->UnixModeBits & 07777; - - if (statusp->FileType == File) - scp->fileType = CM_SCACHETYPE_FILE; - else if (statusp->FileType == Directory) - scp->fileType = CM_SCACHETYPE_DIRECTORY; - else if (statusp->FileType == SymbolicLink) { - if ((scp->unixModeBits & 0111) == 0) - scp->fileType = CM_SCACHETYPE_MOUNTPOINT; - else - scp->fileType = CM_SCACHETYPE_SYMLINK; - } - else { - osi_Log1(afsd_logp, "Merge, Invalid File Type, scp %x", scp); - scp->fileType = 0; /* invalid */ - } - /* and other stuff */ - scp->parentVnode = statusp->ParentVnode; - scp->parentUnique = statusp->ParentUnique; - - /* and merge in the private acl cache info, if this is more than the public - * info; merge in the public stuff in any case. - */ - scp->anyAccess = statusp->AnonymousAccess; - - if (userp != NULL) { - cm_AddACLCache(scp, userp, statusp->CallerAccess); - } -} - -/* note that our stat cache info is incorrect, so force us eventually - * to stat the file again. There may be dirty data associated with - * this vnode, and we want to preserve that information. - * - * This function works by simply simulating a loss of the callback. - * - * This function must be called with the scache locked. - */ -void cm_DiscardSCache(cm_scache_t *scp) -{ - lock_AssertMutex(&scp->mx); - if (scp->cbServerp) { - cm_PutServer(scp->cbServerp); - scp->cbServerp = NULL; - } - scp->cbExpires = 0; - cm_dnlcPurgedp(scp); - cm_dnlcPurgevp(scp); - cm_FreeAllACLEnts(scp); -} - -void cm_AFSFidFromFid(AFSFid *afsFidp, cm_fid_t *fidp) -{ - afsFidp->Volume = fidp->volume; - afsFidp->Vnode = fidp->vnode; - afsFidp->Unique = fidp->unique; -} - -void cm_HoldSCacheNoLock(cm_scache_t *scp) -{ - osi_assert(scp != 0); - osi_assert(scp->refCount >= 0); - scp->refCount++; -} - -void cm_HoldSCache(cm_scache_t *scp) -{ - osi_assert(scp != 0); - lock_ObtainWrite(&cm_scacheLock); - osi_assert(scp->refCount >= 0); - scp->refCount++; - lock_ReleaseWrite(&cm_scacheLock); -} - -void cm_ReleaseSCacheNoLock(cm_scache_t *scp) -{ - osi_assert(scp != 0); - osi_assert(scp->refCount-- >= 0); -} - -void cm_ReleaseSCache(cm_scache_t *scp) -{ - osi_assert(scp != 0); - lock_ObtainWrite(&cm_scacheLock); - osi_assert(scp->refCount != 0); - scp->refCount--; - lock_ReleaseWrite(&cm_scacheLock); -} - -/* just look for the scp entry to get filetype */ -/* doesn't need to be perfectly accurate, so locking doesn't matter too much */ -int cm_FindFileType(cm_fid_t *fidp) -{ - long hash; - cm_scache_t *scp; - - hash = CM_SCACHE_HASH(fidp); - - osi_assert(fidp->cell != 0); - - lock_ObtainWrite(&cm_scacheLock); - for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { - if (cm_FidCmp(fidp, &scp->fid) == 0) { - lock_ReleaseWrite(&cm_scacheLock); - return scp->fileType; - } - } - lock_ReleaseWrite(&cm_scacheLock); - return 0; -} - -/* dump all scp's that have reference count > 0 to a file. - * cookie is used to identify this batch for easy parsing, - * and it a string provided by a caller - */ -int cm_DumpSCache(FILE *outputFile, char *cookie, int lock) -{ - int zilch; - cm_scache_t *scp; - char output[1024]; - int i; - - if (lock) - lock_ObtainRead(&cm_scacheLock); - - sprintf(output, "%s - dumping scache - cm_data.currentSCaches=%d, cm_data.maxSCaches=%d\n", cookie, cm_data.currentSCaches, cm_data.maxSCaches); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - for (scp = cm_data.scacheLRULastp; scp; scp = (cm_scache_t *) osi_QPrev(&scp->q)) - { - if (scp->refCount != 0) - { - sprintf(output, "%s fid (cell=%d, volume=%d, vnode=%d, unique=%d) refCount=%u\n", - cookie, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, - scp->refCount); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - } - } - - sprintf(output, "%s - dumping cm_data.hashTable - cm_data.hashTableSize=%d\n", cookie, cm_data.hashTableSize); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - for (i = 0; i < cm_data.hashTableSize; i++) - { - for(scp = cm_data.hashTablep[i]; scp; scp=scp->nextp) - { - if (scp->refCount != 0) - { - sprintf(output, "%s scp=0x%08X, hash=%d, fid (cell=%d, volume=%d, vnode=%d, unique=%d) refCount=%u\n", - cookie, (void *)scp, i, scp->fid.cell, scp->fid.volume, scp->fid.vnode, - scp->fid.unique, scp->refCount); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - } - } - } - - sprintf(output, "%s - Done dumping scache.\n", cookie); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - if (lock) - lock_ReleaseRead(&cm_scacheLock); - return (0); -} - diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h deleted file mode 100644 index a17988e8c..000000000 --- a/src/WINNT/afsd/cm_scache.h +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_SCACHE_H_ENV__ -#define __CM_SCACHE_H_ENV__ 1 - -#ifdef DJGPP -#include "largeint95.h" -#endif /* DJGPP */ - -#define MOUNTPOINTLEN 1024 - -typedef struct cm_fid { - unsigned long cell; - unsigned long volume; - unsigned long vnode; - unsigned long unique; -} cm_fid_t; - -#if 0 -typedef struct cm_accessCache { - osi_queue_t q; /* queue header */ - struct cm_user *userp; /* user having access rights */ - unsigned long rights; /* rights */ -} cm_accessCache_t; -#endif - -typedef struct cm_file_lock { - osi_queue_t q; /* list of all locks */ - osi_queue_t fileq; /* per-file list of locks */ - cm_user_t *userp; - LARGE_INTEGER LOffset; - LARGE_INTEGER LLength; - cm_fid_t fid; - unsigned char LockType; - unsigned char flags; -} cm_file_lock_t; - -#define CM_FILELOCK_FLAG_INVALID 0x1 -#define CM_FILELOCK_FLAG_WAITING 0x2 - -typedef struct cm_prefetch { /* last region scanned for prefetching */ - osi_hyper_t base; /* start of region */ - osi_hyper_t end; /* first char past region */ -} cm_prefetch_t; - - -#define CM_SCACHE_MAGIC ('S' | 'C'<<8 | 'A'<<16 | 'C'<<24) - -typedef struct cm_scache { - osi_queue_t q; /* lru queue; cm_scacheLock */ - afs_uint32 magic; - struct cm_scache *nextp; /* next in hash; cm_scacheLock */ - cm_fid_t fid; - afs_uint32 flags; /* flags; locked by mx */ - - /* synchronization stuff */ - osi_mutex_t mx; /* mutex for this structure */ - osi_rwlock_t bufCreateLock; /* read-locked during buffer creation; - * write-locked to prevent buffers from - * being created during a truncate op, etc. - */ - afs_uint32 refCount; /* reference count; cm_scacheLock */ - osi_queueData_t *bufReadsp; /* queue of buffers being read */ - osi_queueData_t *bufWritesp; /* queue of buffers being written */ - - /* parent info for ACLs */ - afs_uint32 parentVnode; /* parent vnode for ACL callbacks */ - afs_uint32 parentUnique; /* for ACL callbacks */ - - /* local modification stat */ - afs_uint32 mask; /* for clientModTime, length and - * truncPos */ - - /* file status */ - afs_uint32 fileType; /* file type */ - time_t clientModTime; /* mtime */ - time_t serverModTime; /* at server, for concurrent call - * comparisons */ - osi_hyper_t length; /* file length */ - cm_prefetch_t prefetch; /* prefetch info structure */ - afs_uint32 unixModeBits; /* unix protection mode bits */ - afs_uint32 linkCount; /* link count */ - afs_uint32 dataVersion; /* data version */ - afs_uint32 owner; /* file owner */ - afs_uint32 group; /* file owning group */ - - /* pseudo file status */ - osi_hyper_t serverLength; /* length known to server */ - - /* aux file status */ - osi_hyper_t truncPos; /* file size to truncate to before - * storing data */ - - /* symlink and mount point info */ - char mountPointStringp[MOUNTPOINTLEN]; /* the string stored in a mount point; - * first char is type, then vol name. - * If this is a normal symlink, we store - * the link contents here. - */ - cm_fid_t mountRootFid; /* mounted on root */ - time_t mountRootGen; /* time to update mountRootFidp? */ - cm_fid_t dotdotFid; /* parent of volume root */ - - /* callback info */ - struct cm_server *cbServerp; /* server granting callback */ - time_t cbExpires; /* time callback expires */ - - /* access cache */ - long anyAccess; /* anonymous user's access */ - struct cm_aclent *randomACLp; /* access cache entries */ - - /* file locks */ - osi_queue_t *fileLocks; - - /* volume info */ - struct cm_volume *volp; /* volume info; held reference */ - - /* bulk stat progress */ - osi_hyper_t bulkStatProgress; /* track bulk stats of large dirs */ - - /* open state */ - afs_uint16 openReads; /* open for reading */ - afs_uint16 openWrites; /* open for writing */ - afs_uint16 openShares; /* open for read excl */ - afs_uint16 openExcls; /* open for exclusives */ -} cm_scache_t; - -/* mask field - tell what has been modified */ -#define CM_SCACHEMASK_CLIENTMODTIME 1 /* client mod time */ -#define CM_SCACHEMASK_LENGTH 2 /* length */ -#define CM_SCACHEMASK_TRUNCPOS 4 /* truncation position */ - -/* fileType values */ -#define CM_SCACHETYPE_FILE 1 /* a file */ -#define CM_SCACHETYPE_DIRECTORY 2 /* a dir */ -#define CM_SCACHETYPE_SYMLINK 3 /* a symbolic link */ -#define CM_SCACHETYPE_MOUNTPOINT 4 /* a mount point */ -#define CM_SCACHETYPE_DFSLINK 5 /* a Microsoft Dfs link */ -#define CM_SCACHETYPE_INVALID 99 /* an invalid link */ - -/* flag bits */ -#define CM_SCACHEFLAG_STATD 0x01 /* status info is valid */ -#define CM_SCACHEFLAG_DELETED 0x02 /* file has been deleted */ -#define CM_SCACHEFLAG_CALLBACK 0x04 /* have a valid callback */ -#define CM_SCACHEFLAG_STORING 0x08 /* status being stored back */ -#define CM_SCACHEFLAG_FETCHING 0x10 /* status being fetched */ -#define CM_SCACHEFLAG_SIZESTORING 0x20 /* status being stored that - * changes the data; typically, - * this is a truncate op. */ -#define CM_SCACHEFLAG_INHASH 0x40 /* in the hash table */ -#define CM_SCACHEFLAG_BULKSTATTING 0x80 /* doing a bulk stat */ -#define CM_SCACHEFLAG_WAITING 0x200 /* waiting for fetch/store - * state to change */ -#define CM_SCACHEFLAG_PURERO 0x400 /* read-only (not even backup); - * for mount point eval */ -#define CM_SCACHEFLAG_RO 0x800 /* read-only - * (can't do write ops) */ -#define CM_SCACHEFLAG_GETCALLBACK 0x1000 /* we're getting a callback */ -#define CM_SCACHEFLAG_DATASTORING 0x2000 /* data being stored */ -#define CM_SCACHEFLAG_PREFETCHING 0x4000 /* somebody is prefetching */ -#define CM_SCACHEFLAG_OVERQUOTA 0x8000 /* over quota */ -#define CM_SCACHEFLAG_OUTOFSPACE 0x10000 /* out of space */ -#define CM_SCACHEFLAG_ASYNCSTORING 0x20000 /* scheduled to store back */ -#define CM_SCACHEFLAG_LOCKING 0x40000 /* setting/clearing file lock */ -#define CM_SCACHEFLAG_WATCHED 0x80000 /* directory being watched */ -#define CM_SCACHEFLAG_WATCHEDSUBTREE 0x100000 /* dir subtree being watched */ -#define CM_SCACHEFLAG_ANYWATCH \ - (CM_SCACHEFLAG_WATCHED | CM_SCACHEFLAG_WATCHEDSUBTREE) - -/* sync flags for calls to the server. The CM_SCACHEFLAG_FETCHING, - * CM_SCACHEFLAG_STORING and CM_SCACHEFLAG_SIZESTORING flags correspond to the - * below, except for FETCHDATA and STOREDATA, which correspond to non-null - * buffers in bufReadsp and bufWritesp. - * These flags correspond to individual RPCs that we may be making, and at most - * one can be set in any one call to SyncOp. - */ -#define CM_SCACHESYNC_FETCHSTATUS 0x01 /* fetching status info */ -#define CM_SCACHESYNC_STORESTATUS 0x02 /* storing status info */ -#define CM_SCACHESYNC_FETCHDATA 0x04 /* fetch data */ -#define CM_SCACHESYNC_STOREDATA 0x08 /* store data */ -#define CM_SCACHESYNC_STORESIZE 0x10 /* store new file size */ -#define CM_SCACHESYNC_GETCALLBACK 0x20 /* fetching a callback */ -#define CM_SCACHESYNC_STOREDATA_EXCL 0x40 /* store data */ -#define CM_SCACHESYNC_ASYNCSTORE 0x80 /* schedule data store */ -#define CM_SCACHESYNC_LOCK 0x100 /* set/clear file lock */ - -/* sync flags for calls within the client; there are no corresponding flags - * in the scache entry, because we hold the scache entry locked during the - * operations below. - */ -#define CM_SCACHESYNC_GETSTATUS 0x1000 /* read the status */ -#define CM_SCACHESYNC_SETSTATUS 0x2000 /* e.g. utimes */ -#define CM_SCACHESYNC_READ 0x4000 /* read data from a chunk */ -#define CM_SCACHESYNC_WRITE 0x8000 /* write data to a chunk */ -#define CM_SCACHESYNC_SETSIZE 0x10000 /* shrink the size of a file, - * e.g. truncate */ -#define CM_SCACHESYNC_NEEDCALLBACK 0x20000 /* need a callback on the file */ -#define CM_SCACHESYNC_CHECKRIGHTS 0x40000 /* check that user has desired - * access rights */ -#define CM_SCACHESYNC_BUFLOCKED 0x80000 /* the buffer is locked */ -#define CM_SCACHESYNC_NOWAIT 0x100000/* don't wait for the state, - * just fail */ - -/* flags for cm_MergeStatus */ -#define CM_MERGEFLAG_FORCE 1 /* check mtime before merging; - * used to see if we're merging - * in old info. - */ - -/* hash define. Must not include the cell, since the callback revocation code - * doesn't necessarily know the cell in the case of a multihomed server - * contacting us from a mystery address. - */ -#define CM_SCACHE_HASH(fidp) (((unsigned long) \ - ((fidp)->volume + \ - (fidp)->vnode + \ - (fidp)->unique)) \ - % cm_data.hashTableSize) - -#include "cm_conn.h" -#include "cm_buf.h" - -extern void cm_InitSCache(int, long); - -extern long cm_GetSCache(cm_fid_t *, cm_scache_t **, struct cm_user *, - struct cm_req *); - -extern void cm_PutSCache(cm_scache_t *); - -extern cm_scache_t *cm_GetNewSCache(void); - -extern int cm_FidCmp(cm_fid_t *, cm_fid_t *); - -extern long cm_SyncOp(cm_scache_t *, struct cm_buf *, struct cm_user *, - struct cm_req *, long, long); - -extern void cm_SyncOpDone(cm_scache_t *, struct cm_buf *, long); - -extern void cm_MergeStatus(cm_scache_t *, struct AFSFetchStatus *, struct AFSVolSync *, - struct cm_user *, int flags); - -extern void cm_AFSFidFromFid(struct AFSFid *, cm_fid_t *); - -extern void cm_HoldSCacheNoLock(cm_scache_t *); - -extern void cm_HoldSCache(cm_scache_t *); - -extern void cm_ReleaseSCacheNoLock(cm_scache_t *); - -extern void cm_ReleaseSCache(cm_scache_t *); - -extern cm_scache_t *cm_FindSCache(cm_fid_t *fidp); - -extern osi_rwlock_t cm_scacheLock; - -extern osi_queue_t *cm_allFileLocks; - -extern void cm_DiscardSCache(cm_scache_t *scp); - -extern int cm_FindFileType(cm_fid_t *fidp); - -extern long cm_ValidateSCache(void); - -extern long cm_ShutdownSCache(void); - -#endif /* __CM_SCACHE_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c deleted file mode 100644 index a9102d903..000000000 --- a/src/WINNT/afsd/cm_server.c +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#include -#else -#include -#endif /* !DJGPP */ -#include -#include -#include - -#include -#include -#include "afsd.h" - -osi_rwlock_t cm_serverLock; - -cm_server_t *cm_allServersp; - -void cm_CheckServers(long flags, cm_cell_t *cellp) -{ - /* ping all file servers, up or down, with unauthenticated connection, - * to find out whether we have all our callbacks from the server still. - * Also, ping down VLDBs. - */ - cm_server_t *tsp; - long code; - long secs; - long usecs; - int doPing; - int serverType; - unsigned long now; - int wasDown; - cm_conn_t *connp; - struct rx_connection * callp; - - lock_ObtainWrite(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { - cm_GetServerNoLock(tsp); - lock_ReleaseWrite(&cm_serverLock); - - /* now process the server */ - lock_ObtainMutex(&tsp->mx); - - /* what time is it? */ - now = osi_Time(); - - serverType = tsp->type; - doPing = 0; - wasDown = tsp->flags & CM_SERVERFLAG_DOWN; - - /* only do the ping if the cell matches the requested cell, or we're - * matching all cells (cellp == NULL), and if we've requested to ping - * this type of {up, down} servers. - */ - if ((cellp == NULL || cellp == tsp->cellp) && - ((wasDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) || - (!wasDown && (flags & CM_FLAG_CHECKUPSERVERS)))) { - - doPing = 1; - } /* we're supposed to check this up/down server */ - lock_ReleaseMutex(&tsp->mx); - - /* at this point, we've adjusted the server state, so do the ping and - * adjust things. - */ - if (doPing) { - code = cm_ConnByServer(tsp, cm_rootUserp, &connp); - if (code == 0) { - /* now call the appropriate ping call. Drop the timeout if - * the server is known to be down, so that we don't waste a - * lot of time retiming out down servers. - */ - if (wasDown) - rx_SetConnDeadTime(connp->callp, 10); - if (serverType == CM_SERVER_VLDB) { - code = VL_ProbeServer(connp->callp); - } - else { - /* file server */ - callp = cm_GetRxConn(connp); - code = RXAFS_GetTime(callp, &secs, &usecs); - rx_PutConnection(callp); - } - if (wasDown) - rx_SetConnDeadTime(connp->callp, ConnDeadtimeout); - cm_PutConn(connp); - } /* got an unauthenticated connection to this server */ - - lock_ObtainMutex(&tsp->mx); - if (code == 0) { - /* mark server as up */ - tsp->flags &= ~CM_SERVERFLAG_DOWN; - } - else { - /* mark server as down */ - tsp->flags |= CM_SERVERFLAG_DOWN; - } - lock_ReleaseMutex(&tsp->mx); - } - - /* also, run the GC function for connections on all of the - * server's connections. - */ - cm_GCConnections(tsp); - - lock_ObtainWrite(&cm_serverLock); - cm_PutServerNoLock(tsp); - } - lock_ReleaseWrite(&cm_serverLock); -} - -void cm_InitServer(void) -{ - static osi_once_t once; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_serverLock, "cm_serverLock"); - osi_EndOnce(&once); - } -} - -void cm_GetServer(cm_server_t *serverp) -{ - lock_ObtainWrite(&cm_serverLock); - serverp->refCount++; - lock_ReleaseWrite(&cm_serverLock); -} - -void cm_GetServerNoLock(cm_server_t *serverp) -{ - serverp->refCount++; -} - -void cm_PutServer(cm_server_t *serverp) -{ - lock_ObtainWrite(&cm_serverLock); - osi_assert(serverp->refCount-- > 0); - lock_ReleaseWrite(&cm_serverLock); -} - -void cm_PutServerNoLock(cm_server_t *serverp) -{ - osi_assert(serverp->refCount-- > 0); -} - -void cm_SetServerPrefs(cm_server_t * serverp) -{ - unsigned long serverAddr; /* in host byte order */ - unsigned long myAddr, myNet, mySubnet;/* in host byte order */ - unsigned long netMask; - int i; - - /* implement server prefs for fileservers only */ - if ( serverp->type == CM_SERVER_FILE ) - { - int cm_noIPAddr; /* number of client network interfaces */ - int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */ - int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/ - int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */ - int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */ - long code; - - /* get network related info */ - cm_noIPAddr = CM_MAXINTERFACE_ADDR; - code = syscfg_GetIFInfo(&cm_noIPAddr, - cm_IPAddr, cm_SubnetMask, - cm_NetMtu, cm_NetFlags); - - serverAddr = ntohl(serverp->addr.sin_addr.s_addr); - serverp->ipRank = CM_IPRANK_LOW; /* default setings */ - - for ( i=0; i < cm_noIPAddr; i++) - { - /* loop through all the client's IP address and compare - ** each of them against the server's IP address */ - - myAddr = cm_IPAddr[i]; - if ( IN_CLASSA(myAddr) ) - netMask = IN_CLASSA_NET; - else if ( IN_CLASSB(myAddr) ) - netMask = IN_CLASSB_NET; - else if ( IN_CLASSC(myAddr) ) - netMask = IN_CLASSC_NET; - else - netMask = 0; - - myNet = myAddr & netMask; - mySubnet = myAddr & cm_SubnetMask[i]; - - if ( (serverAddr & netMask) == myNet ) - { - if ( (serverAddr & cm_SubnetMask[i]) == mySubnet) - { - if ( serverAddr == myAddr ) - serverp->ipRank = min(serverp->ipRank, - CM_IPRANK_TOP);/* same machine */ - else serverp->ipRank = min(serverp->ipRank, - CM_IPRANK_HI); /* same subnet */ - } - else serverp->ipRank = min(serverp->ipRank,CM_IPRANK_MED); - /* same net */ - } - /* random between 0..15*/ - serverp->ipRank += min(serverp->ipRank, rand() % 0x000f); - } /* and of for loop */ - } - else - serverp->ipRank = 10000 + (rand() % 0x00ff); /* VL server */ -} - -cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) { - cm_server_t *tsp; - - osi_assert(socketp->sin_family == AF_INET); - - tsp = malloc(sizeof(*tsp)); - memset(tsp, 0, sizeof(*tsp)); - tsp->type = type; - tsp->cellp = cellp; - tsp->refCount = 1; - lock_InitializeMutex(&tsp->mx, "cm_server_t mutex"); - tsp->addr = *socketp; - - cm_SetServerPrefs(tsp); - - lock_ObtainWrite(&cm_serverLock); /* get server lock */ - tsp->allNextp = cm_allServersp; - cm_allServersp = tsp; - lock_ReleaseWrite(&cm_serverLock); /* release server lock */ - - return tsp; -} - -/* find a server based on its properties */ -cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type) -{ - cm_server_t *tsp; - - osi_assert(addrp->sin_family == AF_INET); - - lock_ObtainWrite(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) { - if (tsp->type == type && - tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr) - break; - } - - /* bump ref count if we found the server */ - if (tsp) - cm_GetServerNoLock(tsp); - - /* drop big table lock */ - lock_ReleaseWrite(&cm_serverLock); - - /* return what we found */ - return tsp; -} - -cm_serverRef_t *cm_NewServerRef(cm_server_t *serverp) -{ - cm_serverRef_t *tsrp; - - cm_GetServer(serverp); - tsrp = malloc(sizeof(*tsrp)); - tsrp->server = serverp; - tsrp->status = not_busy; - tsrp->next = NULL; - tsrp->refCount = 1; - - return tsrp; -} - -long cm_ChecksumServerList(cm_serverRef_t *serversp) -{ - long sum = 0; - int first = 1; - cm_serverRef_t *tsrp; - - lock_ObtainWrite(&cm_serverLock); - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { - if (first) - first = 0; - else - sum <<= 1; - sum ^= (long) tsrp->server; - } - - lock_ReleaseWrite(&cm_serverLock); - return sum; -} - -/* -** Insert a server into the server list keeping the list sorted in -** asending order of ipRank. -** -** The refCount of the cm_serverRef_t is increased -*/ -void cm_InsertServerList(cm_serverRef_t** list, cm_serverRef_t* element) -{ - cm_serverRef_t *current=*list; - unsigned short ipRank = element->server->ipRank; - - lock_ObtainWrite(&cm_serverLock); - element->refCount++; /* increase refCount */ - - /* insertion into empty list or at the beginning of the list */ - if ( !current || (current->server->ipRank > ipRank) ) - { - element->next = *list; - *list = element; - lock_ReleaseWrite(&cm_serverLock); - return ; - } - - while ( current->next ) /* find appropriate place to insert */ - { - if ( current->next->server->ipRank > ipRank ) - break; - else current = current->next; - } - element->next = current->next; - current->next = element; - lock_ReleaseWrite(&cm_serverLock); -} -/* -** Re-sort the server list with the modified rank -** returns 0 if element was changed successfully. -** returns 1 if list remained unchanged. -*/ -long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server) -{ - cm_serverRef_t **current=list; - cm_serverRef_t *element=0; - - /* if there is max of one element in the list, nothing to sort */ - if ( (!*current) || !((*current)->next) ) - return 1; /* list unchanged: return success */ - - lock_ObtainWrite(&cm_serverLock); - /* if the server is on the list, delete it from list */ - while ( *current ) - { - if ( (*current)->server == server) - { - element = (*current); - *current = (*current)->next; /* delete it */ - break; - } - current = & ( (*current)->next); - } - lock_ReleaseWrite(&cm_serverLock); - - /* if this volume is not replicated on this server */ - if (!element) - return 1; /* server is not on list */ - - /* re-insert deleted element into the list with modified rank*/ - cm_InsertServerList(list, element); - - /* reduce refCount which was increased by cm_InsertServerList */ - lock_ObtainWrite(&cm_serverLock); - element->refCount--; - lock_ReleaseWrite(&cm_serverLock); - return 0; -} -/* -** If there are more than one server on the list and the first n servers on -** the list have the same rank( n>1), then randomise among the first n servers. -*/ -void cm_RandomizeServer(cm_serverRef_t** list) -{ - int count, picked; - cm_serverRef_t* tsrp = *list, *lastTsrp; - unsigned short lowestRank; - - /* an empty list or a list with only one element */ - if ( !tsrp || ! tsrp->next ) - return ; - - lock_ObtainWrite(&cm_serverLock); - - /* count the number of servers with the lowest rank */ - lowestRank = tsrp->server->ipRank; - for ( count=1, tsrp=tsrp->next; tsrp; tsrp=tsrp->next) - { - if ( tsrp->server->ipRank != lowestRank) - break; - else - count++; - } - - /* if there is only one server with the lowest rank, we are done */ - if ( count <= 1 ) { - lock_ReleaseWrite(&cm_serverLock); - return ; - } - - picked = rand() % count; - if ( !picked ) { - lock_ReleaseWrite(&cm_serverLock); - return ; - } - - tsrp = *list; - while (--picked >= 0) - { - lastTsrp = tsrp; - tsrp = tsrp->next; - } - lastTsrp->next = tsrp->next; /* delete random element from list*/ - tsrp->next = *list; /* insert element at the beginning of list */ - *list = tsrp; - lock_ReleaseWrite(&cm_serverLock); -} - -/* call cm_FreeServer while holding a write lock on cm_serverLock */ -void cm_FreeServer(cm_server_t* serverp) -{ - cm_PutServerNoLock(serverp); - if (serverp->refCount == 0) - { - /* we need to check to ensure that all of the connections - * for this server have a 0 refCount; otherwise, they will - * not be garbage collected - */ - cm_GCConnections(serverp); /* connsp */ - - lock_FinalizeMutex(&serverp->mx); - if ( cm_allServersp == serverp ) - cm_allServersp = serverp->allNextp; - else { - cm_server_t *tsp; - - for(tsp = cm_allServersp; tsp->allNextp; tsp=tsp->allNextp) { - if ( tsp->allNextp == serverp ) { - tsp->allNextp = serverp->allNextp; - break; - } - } - } - } - } - -void cm_FreeServerList(cm_serverRef_t** list) -{ - cm_serverRef_t **current = list; - cm_serverRef_t **nextp = 0; - cm_serverRef_t * next = 0; - - lock_ObtainWrite(&cm_serverLock); - - while (*current) - { - nextp = &(*current)->next; - if (--((*current)->refCount) == 0) { - next = *nextp; - cm_FreeServer((*current)->server); - free(*current); - *current = next; - } else { - current = nextp; - } - } - - lock_ReleaseWrite(&cm_serverLock); -} - diff --git a/src/WINNT/afsd/cm_server.h b/src/WINNT/afsd/cm_server.h deleted file mode 100644 index 5643512e0..000000000 --- a/src/WINNT/afsd/cm_server.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_SERVER_H_ENV__ -#define __CM_SERVER_H_ENV__ 1 - -#ifndef DJGPP -#include -#else /* DJGPP */ -#include -#endif /* !DJGPP */ -#include - -/* pointed to by volumes and cells without holds; cm_serverLock is obtained - * at the appropriate times to change the pointers to these servers. - */ -typedef struct cm_server { - struct cm_server *allNextp; /* locked by cm_serverLock */ - struct sockaddr_in addr; /* by mx */ - int type; /* by mx */ - struct cm_conn *connsp; /* locked by cm_connLock */ - long flags; /* by mx */ - struct cm_cell *cellp; /* cell containing this server */ - unsigned long refCount; /* locked by cm_serverLock */ - osi_mutex_t mx; - unsigned short ipRank; /* server priority */ -} cm_server_t; - -enum repstate {not_busy, busy, offline}; - -typedef struct cm_serverRef { - struct cm_serverRef *next; /* locked by cm_serverLock */ - struct cm_server *server; /* locked by cm_serverLock */ - enum repstate status; /* locked by cm_serverLock */ - unsigned long refCount; /* locked by cm_serverLock */ -} cm_serverRef_t; - -/* types */ -#define CM_SERVER_VLDB 1 /* a VLDB server */ -#define CM_SERVER_FILE 2 /* a file server */ - -/* flags */ -#define CM_SERVERFLAG_DOWN 1 /* server is down */ - -/* flags for procedures */ -#define CM_FLAG_CHECKUPSERVERS 1 /* check working servers */ -#define CM_FLAG_CHECKDOWNSERVERS 2 /* check down servers */ - -/* values for ipRank */ -#define CM_IPRANK_TOP 5000 /* on same machine */ -#define CM_IPRANK_HI 20000 /* on same subnet */ -#define CM_IPRANK_MED 30000 /* on same network */ -#define CM_IPRANK_LOW 40000 /* on different networks */ - -/* the maximum number of network interfaces that this client has */ - -#define CM_MAXINTERFACE_ADDR 16 - -extern cm_server_t *cm_NewServer(struct sockaddr_in *addrp, int type, - struct cm_cell *cellp); - -extern cm_serverRef_t *cm_NewServerRef(struct cm_server *serverp); - -extern long cm_ChecksumServerList(cm_serverRef_t *serversp); - -extern void cm_GetServer(cm_server_t *); - -extern void cm_GetServerNoLock(cm_server_t *); - -extern void cm_PutServer(cm_server_t *); - -extern void cm_PutServerNoLock(cm_server_t *); - -extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type); - -extern osi_rwlock_t cm_serverLock; - -extern void cm_InitServer(void); - -extern void cm_CheckServers(long flags, struct cm_cell *cellp); - -extern cm_server_t *cm_allServersp; - -extern void cm_SetServerPrefs(cm_server_t * serverp); - -extern void cm_InsertServerList(cm_serverRef_t** list,cm_serverRef_t* element); - -extern long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server); - -extern void cm_RandomizeServer(cm_serverRef_t** list); - -extern void cm_FreeServer(cm_server_t* server); - -extern void cm_FreeServerList(cm_serverRef_t** list); - -#endif /* __CM_SERVER_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_user.c b/src/WINNT/afsd/cm_user.c deleted file mode 100644 index 6d7ba073f..000000000 --- a/src/WINNT/afsd/cm_user.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#endif /* !DJGPP */ -#include -#include - -#include -#include - -#include "afsd.h" - -osi_rwlock_t cm_userLock; - -cm_user_t *cm_rootUserp; - -void cm_InitUser(void) -{ - static osi_once_t once; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_userLock, "cm_userLock"); - osi_EndOnce(&once); - } - - cm_rootUserp = cm_NewUser(); -} - -cm_user_t *cm_NewUser(void) -{ - cm_user_t *up; - - up = malloc(sizeof(*up)); - memset(up, 0, sizeof(*up)); - up->refCount = 1; - up->vcRefs = 1; /* from caller */ - lock_InitializeMutex(&up->mx, "cm_user_t"); - return up; -} - -/* must be called with locked userp */ -cm_ucell_t *cm_GetUCell(cm_user_t *userp, cm_cell_t *cellp) -{ - cm_ucell_t *ucp; - - lock_AssertMutex(&userp->mx); - for (ucp = userp->cellInfop; ucp; ucp=ucp->nextp) { - if (ucp->cellp == cellp) - break; - } - - if (!ucp) { - ucp = malloc(sizeof(*ucp)); - memset(ucp, 0, sizeof(*ucp)); - ucp->nextp = userp->cellInfop; - if (userp->cellInfop) - ucp->iterator = userp->cellInfop->iterator + 1; - else - ucp->iterator = 1; - userp->cellInfop = ucp; - ucp->cellp = cellp; - } - - return ucp; -} - -cm_ucell_t *cm_FindUCell(cm_user_t *userp, int iterator) -{ - cm_ucell_t *ucp; - cm_ucell_t *best; - - best = NULL; - lock_AssertMutex(&userp->mx); - for (ucp = userp->cellInfop; ucp; ucp = ucp->nextp) { - if (ucp->iterator >= iterator) - best = ucp; - else - break; - } - return best; -} - -void cm_HoldUser(cm_user_t *up) -{ - lock_ObtainWrite(&cm_userLock); - up->refCount++; - lock_ReleaseWrite(&cm_userLock); -} - -void cm_ReleaseUser(cm_user_t *up) -{ - cm_ucell_t *ucp; - cm_ucell_t *ncp; - - if (up == NULL) - return; - - lock_ObtainWrite(&cm_userLock); - osi_assert(up->refCount-- > 0); - if (up->refCount == 0) { - lock_FinalizeMutex(&up->mx); - for (ucp = up->cellInfop; ucp; ucp = ncp) { - ncp = ucp->nextp; - if (ucp->ticketp) - free(ucp->ticketp); - free(ucp); - } - free(up); - } - lock_ReleaseWrite(&cm_userLock); -} - -/* release the count of the # of connections that use this user structure. - * When this hits zero, we know we won't be getting an new requests from - * this user, and thus we can start GC'ing connections. Ref count on user - * won't hit zero until all cm_conn_t's have been GC'd, since they hold - * refCount references to userp. - */ -void cm_ReleaseUserVCRef(cm_user_t *userp) -{ - lock_ObtainMutex(&userp->mx); - osi_assert(userp->vcRefs-- > 0); - lock_ReleaseMutex(&userp->mx); -} - - -/* - * Check if any users' tokens have expired and if they have then do the - * equivalent of unlogging the user for that particular cell for which - * the tokens have expired. - * ref. cm_IoctlDelToken() in cm_ioctl.c - * This routine is called by the cm_Daemon() ie. the periodic daemon. - * every cm_daemonTokenCheckInterval seconds - */ -void cm_CheckTokenCache(long now) -{ - extern smb_vc_t *smb_allVCsp; /* global vcp list */ - smb_vc_t *vcp; - smb_user_t *usersp; - cm_user_t *userp = NULL; - cm_ucell_t *ucellp; - BOOL bExpired=FALSE; - - /* - * For every vcp, get the user and check his tokens - */ - lock_ObtainWrite(&smb_rctLock); - for (vcp=smb_allVCsp; vcp; vcp=vcp->nextp) { - for (usersp=vcp->usersp; usersp; usersp=usersp->nextp) { - if (usersp->unp) { - if ((userp=usersp->unp->userp)==0) - continue; - } else - continue; - lock_ObtainMutex(&userp->mx); - for (ucellp=userp->cellInfop; ucellp; ucellp=ucellp->nextp) { - if (ucellp->flags & CM_UCELLFLAG_RXKAD) { - if (ucellp->expirationTime < now) { - /* this guy's tokens have expired */ - osi_Log3(afsd_logp, "cm_CheckTokens: Tokens for user:%s have expired expiration time:0x%x ucellp:%x", - ucellp->userName, ucellp->expirationTime, ucellp); - if (ucellp->ticketp) { - free(ucellp->ticketp); - ucellp->ticketp = NULL; - } - ucellp->flags &= ~CM_UCELLFLAG_RXKAD; - ucellp->gen++; - bExpired=TRUE; - } - } - } - lock_ReleaseMutex(&userp->mx); - if (bExpired) { - bExpired=FALSE; - cm_ResetACLCache(userp); - } - } - } - lock_ReleaseWrite(&smb_rctLock); -} diff --git a/src/WINNT/afsd/cm_user.h b/src/WINNT/afsd/cm_user.h deleted file mode 100644 index 17453e11a..000000000 --- a/src/WINNT/afsd/cm_user.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_USER_H_ENV__ -#define __CM_USER_H_ENV__ 1 - -#include -#include - -/* user structure - * no free references outside of cm_allUsersp - * there are held references from cm_conn_t. - * - * All the fields in this structure are locked by the - * corresponding userp's userp->mx mutex. - */ -typedef struct cm_ucell { - struct cm_ucell *nextp; /* next cell in the list */ - struct cm_cell *cellp; /* the cell this applies to */ - char *ticketp; /* locked by mx */ - int ticketLen; /* by mx */ - struct ktc_encryptionKey sessionKey;/* by mx */ - long kvno; /* key version in ticket */ - long expirationTime; /* when tix expire */ - int gen; /* generation number */ - int iterator; /* for use as ListTokens cookie */ - long flags; /* flags */ - char userName[MAXKTCNAMELEN]; /* user name */ -} cm_ucell_t; - -#define CM_UCELLFLAG_HASTIX 1 /* has Kerberos tickets */ -#define CM_UCELLFLAG_RXKAD 2 /* an rxkad connection */ -#define CM_UCELLFLAG_BADTIX 4 /* tickets are bad or expired */ -#define CM_UCELLFLAG_RXGK 8 /* an rxgk connection */ - -typedef struct cm_user { - unsigned long refCount; /* ref count - cm_userLock */ - cm_ucell_t *cellInfop; /* list of cell info */ - osi_mutex_t mx; /* mutex */ - int vcRefs; /* count of references from virtual circuits */ - long flags; -} cm_user_t; - -#define CM_USERFLAG_DELETE 1 /* delete on last reference */ -#define CM_USERFLAG_WASLOGON 2 /* was logon DLL user */ - -extern void cm_InitUser(void); - -extern cm_user_t *cm_NewUser(void); - -extern cm_ucell_t *cm_GetUCell(cm_user_t *userp, struct cm_cell *cellp); - -extern cm_ucell_t *cm_FindUCell(cm_user_t *userp, int iterator); - -extern void cm_HoldUser(cm_user_t *up); - -extern void cm_ReleaseUser(cm_user_t *up); - -extern void cm_ReleaseUserVCRef(cm_user_t *up); - -extern void cm_CheckTokenCache(long now); - -extern cm_user_t *cm_rootUserp; - -#endif /* __CM_USER_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_utils.c b/src/WINNT/afsd/cm_utils.c deleted file mode 100644 index 3acf3679a..000000000 --- a/src/WINNT/afsd/cm_utils.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#endif /* !DJGPP */ -#include -#include - -#include -#include - -#include "afsd.h" - -static osi_once_t cm_utilsOnce; - -osi_rwlock_t cm_utilsLock; - -cm_space_t *cm_spaceListp; - -long cm_MapRPCError(long error, cm_req_t *reqp) -{ - if (error == 0) - return 0; - - /* If we had to stop retrying, report our saved error code. */ - if (reqp && error == CM_ERROR_TIMEDOUT) { - if (reqp->accessError) - return reqp->accessError; - if (reqp->volumeError) - return reqp->volumeError; - if (reqp->rpcError) - return reqp->rpcError; - return error; - } - - if (error < 0) - error = CM_ERROR_TIMEDOUT; - else if (error == 30) - error = CM_ERROR_READONLY; - else if (error == 13) - error = CM_ERROR_NOACCESS; - else if (error == 18) - error = CM_ERROR_CROSSDEVLINK; - else if (error == 17) - error = CM_ERROR_EXISTS; - else if (error == 20) - error = CM_ERROR_NOTDIR; - else if (error == 2) - error = CM_ERROR_NOSUCHFILE; - else if (error == 11 /* EAGAIN, most servers */ - || error == 35) /* EAGAIN, Digital UNIX */ - error = CM_ERROR_WOULDBLOCK; - else if (error == VDISKFULL - || error == 28) /* ENOSPC */ - error = CM_ERROR_SPACE; - else if (error == VOVERQUOTA - || error == 49 /* EDQUOT on Solaris */ - || error == 88 /* EDQUOT on AIX */ - || error == 69 /* EDQUOT on Digital UNIX and HPUX */ - || error == 122 /* EDQUOT on Linux */ - || error == 1133) /* EDQUOT on Irix */ - error = CM_ERROR_QUOTA; - else if (error == VNOVNODE) - error = CM_ERROR_BADFD; - else if (error == 21) - return CM_ERROR_ISDIR; - return error; -} - -long cm_MapRPCErrorRmdir(long error, cm_req_t *reqp) -{ - if (error == 0) - return 0; - - /* If we had to stop retrying, report our saved error code. */ - if (reqp && error == CM_ERROR_TIMEDOUT) { - if (reqp->accessError) - return reqp->accessError; - if (reqp->volumeError) - return reqp->volumeError; - if (reqp->rpcError) - return reqp->rpcError; - return error; - } - - if (error < 0) - error = CM_ERROR_TIMEDOUT; - else if (error == 30) - error = CM_ERROR_READONLY; - else if (error == 20) - error = CM_ERROR_NOTDIR; - else if (error == 13) - error = CM_ERROR_NOACCESS; - else if (error == 2) - error = CM_ERROR_NOSUCHFILE; - else if (error == 17 /* AIX */ - || error == 66 /* SunOS 4, Digital UNIX */ - || error == 93 /* Solaris 2, IRIX */ - || error == 247) /* HP/UX */ - error = CM_ERROR_NOTEMPTY; - return error; -} - -long cm_MapVLRPCError(long error, cm_req_t *reqp) -{ - if (error == 0) return 0; - - /* If we had to stop retrying, report our saved error code. */ - if (reqp && error == CM_ERROR_TIMEDOUT) { - if (reqp->accessError) - return reqp->accessError; - if (reqp->volumeError) - return reqp->volumeError; - if (reqp->rpcError) - return reqp->rpcError; - return error; - } - - if (error < 0) - error = CM_ERROR_TIMEDOUT; - else if (error == VL_NOENT) - error = CM_ERROR_NOSUCHVOLUME; - return error; -} - -cm_space_t *cm_GetSpace(void) -{ - cm_space_t *tsp; - - if (osi_Once(&cm_utilsOnce)) { - lock_InitializeRWLock(&cm_utilsLock, "cm_utilsLock"); - osi_EndOnce(&cm_utilsOnce); - } - - lock_ObtainWrite(&cm_utilsLock); - if (tsp = cm_spaceListp) { - cm_spaceListp = tsp->nextp; - } - else tsp = (cm_space_t *) malloc(sizeof(cm_space_t)); - (void) memset(tsp, 0, sizeof(cm_space_t)); - lock_ReleaseWrite(&cm_utilsLock); - - return tsp; -} - -void cm_FreeSpace(cm_space_t *tsp) -{ - lock_ObtainWrite(&cm_utilsLock); - tsp->nextp = cm_spaceListp; - cm_spaceListp = tsp; - lock_ReleaseWrite(&cm_utilsLock); -} diff --git a/src/WINNT/afsd/cm_utils.h b/src/WINNT/afsd/cm_utils.h deleted file mode 100644 index 2f514783e..000000000 --- a/src/WINNT/afsd/cm_utils.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_UTILS_H_ENV__ -#define __CM_UTILS_H_ENV__ 1 - -#define CM_UTILS_SPACESIZE 8192 /* space to allocate */ -typedef struct cm_space { - char data[CM_UTILS_SPACESIZE]; - struct cm_space *nextp; -} cm_space_t; - -/* error code hack */ -#define ERROR_TABLE_BASE_VL (363520L) -#define VL_NOENT (363524L) - -extern cm_space_t *cm_GetSpace(void); - -extern void cm_FreeSpace(cm_space_t *); - -extern long cm_MapRPCError(long error, cm_req_t *reqp); -extern long cm_MapRPCErrorRmdir(long error, cm_req_t *reqp); -extern long cm_MapVLRPCError(long error, cm_req_t *reqp); - -#endif /* __CM_UTILS_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c deleted file mode 100644 index 20872df2b..000000000 --- a/src/WINNT/afsd/cm_vnodeops.c +++ /dev/null @@ -1,2995 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#endif /* !DJGPP */ -#include -#include -#include -#include - -#include - -#include "afsd.h" - -/* Used by cm_FollowMountPoint */ -#define RWVOL 0 -#define ROVOL 1 -#define BACKVOL 2 - -#ifdef DEBUG -extern void afsi_log(char *pattern, ...); -#endif - -/* - * Case-folding array. This was constructed by inspecting of SMBtrace output. - * I do not know anything more about it. - */ -unsigned char cm_foldUpper[256] = { - 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, - 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, - 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x9a, 0x90, 0x41, 0x8e, 0x41, 0x8f, 0x80, - 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x8e, 0x8f, - 0x90, 0x92, 0x92, 0x4f, 0x99, 0x4f, 0x55, 0x55, - 0x59, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0x56, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff -}; - -/* - * Case-insensitive string comparison. We used to use stricmp, but it doesn't - * know about 8-bit characters (e.g. 129 is lowercase u-umlaut, 154 is - * upper-case u-umlaut). - */ -int cm_stricmp(const char *str1, const char *str2) -{ - char c1, c2; - - while (1) { - if (*str1 == 0) - if (*str2 == 0) - return 0; - else - return -1; - if (*str2 == 0) - return 1; - c1 = (char) cm_foldUpper[(unsigned char)(*str1++)]; - c2 = (char) cm_foldUpper[(unsigned char)(*str2++)]; - if (c1 < c2) - return -1; - if (c1 > c2) - return 1; - } -} - -/* characters that are legal in an 8.3 name */ -/* - * We used to have 1's for all characters from 128 to 254. But - * the NT client behaves better if we create an 8.3 name for any - * name that has a character with the high bit on, and if we - * delete those characters from 8.3 names. In particular, see - * Sybase defect 10859. - */ -char cm_LegalChars[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* return true iff component is a valid 8.3 name */ -int cm_Is8Dot3(char *namep) -{ - int sawDot = 0; - int sawUpper = 0, sawLower = 0; - unsigned char tc; - int charCount = 0; - - /* - * can't have a leading dot; - * special case for . and .. - */ - if (namep[0] == '.') { - if (namep[1] == 0) - return 1; - if (namep[1] == '.' && namep[2] == 0) - return 1; - return 0; - } - while (tc = *namep++) { - if (tc == '.') { - /* saw another dot */ - if (sawDot) return 0; /* second dot */ - sawDot = 1; - charCount = 0; - continue; - } - if (cm_LegalChars[tc] == 0) - return 0; - if (tc >= 'A' && tc <= 'Z') - sawUpper = 1; - else if (tc >= 'a' && tc <= 'z') - sawLower = 1; - charCount++; - if (!sawDot && charCount > 8) - /* more than 8 chars in name */ - return 0; - if (sawDot && charCount > 3) - /* more than 3 chars in extension */ - return 0; - } - /* - * Used to check that all characters were the same case. - * This doesn't help 16-bit apps, and meanwhile it causes the - * MS-DOS Command Prompt to misbehave; see Sybase defect 10709. - * - if (sawUpper && sawLower) - return 0; - */ - return 1; -} - -/* - * Number unparsing map for generating 8.3 names; - * The version taken from DFS was on drugs. - * You can't include '&' and '@' in a file name. - */ -char cm_8Dot3Mapping[42] = -{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', - 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', '_', '-', '$', '#', '!', '+', '=' -}; -int cm_8Dot3MapSize = sizeof(cm_8Dot3Mapping); - -void cm_Gen8Dot3Name(cm_dirEntry_t *dep, char *shortName, char **shortNameEndp) -{ - char number[12]; - int i, nsize = 0; - int vnode = ntohl(dep->fid.vnode); - char *lastDot; - int validExtension = 0; - char tc, *temp, *name; - - /* Unparse the file's vnode number to get a "uniquifier" */ - do { - number[nsize] = cm_8Dot3Mapping[vnode % cm_8Dot3MapSize]; - nsize++; - vnode /= cm_8Dot3MapSize; - } while (vnode); - - /* - * Look for valid extension. There has to be a dot, and - * at least one of the characters following has to be legal. - */ - lastDot = strrchr(dep->name, '.'); - if (lastDot) { - temp = lastDot; temp++; - while (tc = *temp++) - if (cm_LegalChars[tc]) - break; - if (tc) - validExtension = 1; - } - - /* Copy name characters */ - name = dep->name; - for (i = 0, name = dep->name; - i < (7 - nsize) && name != lastDot; ) { - tc = *name++; - - if (tc == 0) - break; - if (!cm_LegalChars[tc]) - continue; - i++; - *shortName++ = toupper(tc); - } - - /* tilde */ - *shortName++ = '~'; - - /* Copy uniquifier characters */ - memcpy(shortName, number, nsize); - shortName += nsize; - - if (validExtension) { - /* Copy extension characters */ - *shortName++ = *lastDot++; /* copy dot */ - for (i = 0, tc = *lastDot++; - i < 3 && tc; - tc = *lastDot++) { - if (cm_LegalChars[tc]) { - i++; - *shortName++ = toupper(tc); - } - } - } - - /* Trailing null */ - *shortName = 0; - - if (shortNameEndp) - *shortNameEndp = shortName; -} - -/* return success if we can open this file in this mode */ -long cm_CheckOpen(cm_scache_t *scp, int openMode, int trunc, cm_user_t *userp, - cm_req_t *reqp) -{ - long rights; - long code; - - rights = 0; - if (openMode != 1) rights |= PRSFS_READ; - if (openMode == 1 || openMode == 2 || trunc) rights |= PRSFS_WRITE; - - lock_ObtainMutex(&scp->mx); - - code = cm_SyncOp(scp, NULL, userp, reqp, rights, - CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_NEEDCALLBACK); - lock_ReleaseMutex(&scp->mx); - - return code; -} - -/* return success if we can open this file in this mode */ -long cm_CheckNTOpen(cm_scache_t *scp, unsigned int desiredAccess, - unsigned int createDisp, cm_user_t *userp, cm_req_t *reqp) -{ - long rights; - long code; - - /* Always allow delete; the RPC will tell us if it's OK */ - if (desiredAccess == DELETE) - return 0; - - rights = 0; - - if (desiredAccess & AFS_ACCESS_READ) - rights |= PRSFS_READ; - - if ((desiredAccess & AFS_ACCESS_WRITE) - || createDisp == 4) - rights |= PRSFS_WRITE; - - lock_ObtainMutex(&scp->mx); - - code = cm_SyncOp(scp, NULL, userp, reqp, rights, - CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_NEEDCALLBACK); - lock_ReleaseMutex(&scp->mx); - - /* - * If the open will fail because the volume is readonly, then we will - * return an access denied error instead. This is to help brain-dead - * apps run correctly on replicated volumes. - * See defect 10007 for more information. - */ - if (code == CM_ERROR_READONLY) - code = CM_ERROR_NOACCESS; - - return code; -} - -/* - * When CAP_NT_SMBS has been negotiated, deletion (of files or directories) is - * done in three steps: - * (1) open for deletion (NT_CREATE_AND_X) - * (2) set for deletion on close (NT_TRANSACTION2, SET_FILE_INFO) - * (3) close (CLOSE) - * We must not do the RPC until step 3. But if we are going to return an error - * code (e.g. directory not empty), we must return it by step 2, otherwise most - * clients will not notice it. So we do a preliminary check. For deleting - * files, this is almost free, since we have already done the RPC to get the - * parent directory's status bits. But for deleting directories, we must do an - * additional RPC to get the directory's data to check if it is empty. Sigh. - */ -long cm_CheckNTDelete(cm_scache_t *dscp, cm_scache_t *scp, cm_user_t *userp, - cm_req_t *reqp) -{ - long code; - osi_hyper_t thyper; - cm_buf_t *bufferp; - cm_dirEntry_t *dep; - unsigned short *hashTable; - unsigned int i, idx; - int BeyondPage = 0, HaveDot = 0, HaveDotDot = 0; - - /* First check permissions */ - lock_ObtainMutex(&dscp->mx); - code = cm_SyncOp(dscp, NULL, userp, reqp, PRSFS_DELETE, - CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_NEEDCALLBACK); - lock_ReleaseMutex(&dscp->mx); - if (code) - return code; - - /* If deleting directory, must be empty */ - - if (scp->fileType != CM_SCACHETYPE_DIRECTORY) - return code; - - thyper.HighPart = 0; thyper.LowPart = 0; - lock_ObtainRead(&scp->bufCreateLock); - code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); - if (code) - return code; - - lock_ObtainMutex(&bufferp->mx); - lock_ObtainMutex(&scp->mx); - while (1) { - code = cm_SyncOp(scp, bufferp, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_READ - | CM_SCACHESYNC_BUFLOCKED); - if (code) - break; - - if (cm_HaveBuffer(scp, bufferp, 1)) - break; - - /* otherwise, load the buffer and try again */ - lock_ReleaseMutex(&bufferp->mx); - code = cm_GetBuffer(scp, bufferp, NULL, userp, reqp); - lock_ReleaseMutex(&scp->mx); - lock_ObtainMutex(&bufferp->mx); - lock_ObtainMutex(&scp->mx); - if (code) - break; - } - - /* We try to determine emptiness without looking beyond the first page, - * and without assuming "." and ".." are present and are on the first - * page (though these assumptions might, after all, be reasonable). - */ - hashTable = (unsigned short *)(bufferp->datap + (32 * 5)); - for (i=0; i<128; i++) { - idx = ntohs(hashTable[i]); - while (idx) { - if (idx >= 64) { - BeyondPage = 1; - break; - } - dep = (cm_dirEntry_t *)(bufferp->datap + (32 * idx)); - if (strcmp(dep->name, ".") == 0) - HaveDot = 1; - else if (strcmp(dep->name, "..") == 0) - HaveDotDot = 1; - else { - code = CM_ERROR_NOTEMPTY; - goto done; - } - idx = ntohs(dep->next); - } - } - if (BeyondPage && HaveDot && HaveDotDot) - code = CM_ERROR_NOTEMPTY; - else - code = 0; - done: - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - lock_ReleaseMutex(&scp->mx); - return code; -} - -/* - * Iterate through all entries in a directory. - * When the function funcp is called, the buffer is locked but the - * directory vnode is not. - * - * If the retscp parameter is not NULL, the parmp must be a - * cm_lookupSearch_t object. - */ -long cm_ApplyDir(cm_scache_t *scp, cm_DirFuncp_t funcp, void *parmp, - osi_hyper_t *startOffsetp, cm_user_t *userp, cm_req_t *reqp, - cm_scache_t **retscp) -{ - char *tp; - long code; - cm_dirEntry_t *dep; - cm_buf_t *bufferp; - long temp; - osi_hyper_t dirLength; - osi_hyper_t bufferOffset; - osi_hyper_t curOffset; - osi_hyper_t thyper; - long entryInDir; - long entryInBuffer; - cm_pageHeader_t *pageHeaderp; - int slotInPage; - long nextEntryCookie; - int numDirChunks; /* # of 32 byte dir chunks in this entry */ - - /* get the directory size */ - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, reqp, PRSFS_LOOKUP, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - return code; - } - - if (scp->fileType != CM_SCACHETYPE_DIRECTORY) { - lock_ReleaseMutex(&scp->mx); - return CM_ERROR_NOTDIR; - } - - if (retscp) /* if this is a lookup call */ - { - cm_lookupSearch_t* sp = parmp; - -#ifdef AFS_FREELANCE_CLIENT - /* Freelance entries never end up in the DNLC because they - * do not have an associated cm_server_t - */ - if ( !(cm_freelanceEnabled && - sp->fid.cell==AFS_FAKE_ROOT_CELL_ID && - sp->fid.volume==AFS_FAKE_ROOT_VOL_ID ) ) -#endif /* AFS_FREELANCE_CLIENT */ - { - int casefold = sp->caseFold; - sp->caseFold = 0; /* we have a strong preference for exact matches */ - if ( *retscp = cm_dnlcLookup(scp, sp)) /* dnlc hit */ - { - sp->caseFold = casefold; - lock_ReleaseMutex(&scp->mx); - return 0; - } - sp->caseFold = casefold; - } - } - - /* - * XXX We only get the length once. It might change when we drop the - * lock. - */ - dirLength = scp->length; - - lock_ReleaseMutex(&scp->mx); - - bufferp = NULL; - bufferOffset.LowPart = bufferOffset.HighPart = 0; - if (startOffsetp) - curOffset = *startOffsetp; - else { - curOffset.HighPart = 0; - curOffset.LowPart = 0; - } - - while (1) { - /* make sure that curOffset.LowPart doesn't point to the first - * 32 bytes in the 2nd through last dir page, and that it - * doesn't point at the first 13 32-byte chunks in the first - * dir page, since those are dir and page headers, and don't - * contain useful information. - */ - temp = curOffset.LowPart & (2048-1); - if (curOffset.HighPart == 0 && curOffset.LowPart < 2048) { - /* we're in the first page */ - if (temp < 13*32) temp = 13*32; - } - else { - /* we're in a later dir page */ - if (temp < 32) temp = 32; - } - - /* make sure the low order 5 bits are zero */ - temp &= ~(32-1); - - /* now put temp bits back ito curOffset.LowPart */ - curOffset.LowPart &= ~(2048-1); - curOffset.LowPart |= temp; - - /* check if we've passed the dir's EOF */ - if (LargeIntegerGreaterThanOrEqualTo(curOffset, dirLength)) - break; - - /* see if we can use the bufferp we have now; compute in which - * page the current offset would be, and check whether that's - * the offset of the buffer we have. If not, get the buffer. - */ - thyper.HighPart = curOffset.HighPart; - thyper.LowPart = curOffset.LowPart & ~(cm_data.buf_blockSize-1); - if (!bufferp || !LargeIntegerEqualTo(thyper, bufferOffset)) { - /* wrong buffer */ - if (bufferp) { - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - bufferp = NULL; - } - - lock_ObtainRead(&scp->bufCreateLock); - code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); - if (code) { - /* if buf_Get() fails we do not have a buffer object to lock */ - bufferp = NULL; - break; - } - - lock_ObtainMutex(&bufferp->mx); - bufferOffset = thyper; - - /* now get the data in the cache */ - while (1) { - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, bufferp, userp, reqp, - PRSFS_LOOKUP, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_READ - | CM_SCACHESYNC_BUFLOCKED); - if (code) { - lock_ReleaseMutex(&scp->mx); - break; - } - - if (cm_HaveBuffer(scp, bufferp, 1)) { - lock_ReleaseMutex(&scp->mx); - break; - } - - /* otherwise, load the buffer and try again */ - lock_ReleaseMutex(&bufferp->mx); - code = cm_GetBuffer(scp, bufferp, NULL, userp, - reqp); - lock_ReleaseMutex(&scp->mx); - lock_ObtainMutex(&bufferp->mx); - if (code) - break; - } - if (code) { - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - bufferp = NULL; - break; - } - } /* if (wrong buffer) ... */ - - /* now we have the buffer containing the entry we're interested - * in; copy it out if it represents a non-deleted entry. - */ - entryInDir = curOffset.LowPart & (2048-1); - entryInBuffer = curOffset.LowPart & (cm_data.buf_blockSize - 1); - - /* page header will help tell us which entries are free. Page - * header can change more often than once per buffer, since - * AFS 3 dir page size may be less than (but not more than) a - * buffer package buffer. - */ - /* only look intra-buffer */ - temp = curOffset.LowPart & (cm_data.buf_blockSize - 1); - temp &= ~(2048 - 1); /* turn off intra-page bits */ - pageHeaderp = (cm_pageHeader_t *) (bufferp->datap + temp); - - /* now determine which entry we're looking at in the page. If - * it is free (there's a free bitmap at the start of the dir), - * we should skip these 32 bytes. - */ - slotInPage = (entryInDir & 0x7e0) >> 5; - if (!(pageHeaderp->freeBitmap[slotInPage>>3] - & (1 << (slotInPage & 0x7)))) { - /* this entry is free */ - numDirChunks = 1; /* only skip this guy */ - goto nextEntry; - } - - tp = bufferp->datap + entryInBuffer; - dep = (cm_dirEntry_t *) tp; /* now points to AFS3 dir entry */ - - /* while we're here, compute the next entry's location, too, - * since we'll need it when writing out the cookie into the - * dir listing stream. - */ - numDirChunks = cm_NameEntries(dep->name, NULL); - - /* compute the offset of the cookie representing the next entry */ - nextEntryCookie = curOffset.LowPart - + (CM_DIR_CHUNKSIZE * numDirChunks); - - if (dep->fid.vnode != 0) { - /* this is one of the entries to use: it is not deleted */ - code = (*funcp)(scp, dep, parmp, &curOffset); - if (code) - break; - } /* if we're including this name */ - - nextEntry: - /* and adjust curOffset to be where the new cookie is */ - thyper.HighPart = 0; - thyper.LowPart = CM_DIR_CHUNKSIZE * numDirChunks; - curOffset = LargeIntegerAdd(thyper, curOffset); - } /* while copying data for dir listing */ - - /* release the mutex */ - if (bufferp) { - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - } - return code; -} - -int cm_NoneUpper(char *s) -{ - char c; - while (c = *s++) - if (c >= 'A' && c <= 'Z') - return 0; - return 1; -} - -int cm_NoneLower(char *s) -{ - char c; - while (c = *s++) - if (c >= 'a' && c <= 'z') - return 0; - return 1; -} - -long cm_LookupSearchProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *rockp, - osi_hyper_t *offp) -{ - cm_lookupSearch_t *sp; - int match; - char shortName[13]; - char *matchName; - - sp = (cm_lookupSearch_t *) rockp; - - matchName = dep->name; - if (sp->caseFold) - match = cm_stricmp(matchName, sp->searchNamep); - else - match = strcmp(matchName, sp->searchNamep); - - if (match != 0 - && sp->hasTilde - && !cm_Is8Dot3(dep->name)) { - matchName = shortName; - cm_Gen8Dot3Name(dep, shortName, NULL); - if (sp->caseFold) - match = cm_stricmp(matchName, sp->searchNamep); - else - match = strcmp(matchName, sp->searchNamep); - } - - if (match != 0) - return 0; - - sp->found = 1; - if(!sp->caseFold) - sp->ExactFound = 1; - - if (!sp->caseFold || matchName == shortName) { - sp->fid.vnode = ntohl(dep->fid.vnode); - sp->fid.unique = ntohl(dep->fid.unique); - return CM_ERROR_STOPNOW; - } - - /* - * If we get here, we are doing a case-insensitive search, and we - * have found a match. Now we determine what kind of match it is: - * exact, lower-case, upper-case, or none of the above. This is done - * in order to choose among matches, if there are more than one. - */ - - /* Exact matches are the best. */ - match = strcmp(matchName, sp->searchNamep); - if (match == 0) { - sp->ExactFound = 1; - sp->fid.vnode = ntohl(dep->fid.vnode); - sp->fid.unique = ntohl(dep->fid.unique); - return CM_ERROR_STOPNOW; - } - - /* Lower-case matches are next. */ - if (sp->LCfound) - return 0; - if (cm_NoneUpper(matchName)) { - sp->LCfound = 1; - goto inexact; - } - - /* Upper-case matches are next. */ - if (sp->UCfound) - return 0; - if (cm_NoneLower(matchName)) { - sp->UCfound = 1; - goto inexact; - } - - /* General matches are last. */ - if (sp->NCfound) - return 0; - sp->NCfound = 1; - - inexact: - sp->fid.vnode = ntohl(dep->fid.vnode); - sp->fid.unique = ntohl(dep->fid.unique); - return 0; -} - -/* read the contents of a mount point into the appropriate string. - * called with locked scp, and returns with locked scp. - */ -long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - cm_buf_t *bufp; - osi_hyper_t thyper; - int tlen; - - if (scp->mountPointStringp[0]) - return 0; - - /* otherwise, we have to read it in */ - lock_ReleaseMutex(&scp->mx); - - lock_ObtainRead(&scp->bufCreateLock); - thyper.LowPart = thyper.HighPart = 0; - code = buf_Get(scp, &thyper, &bufp); - lock_ReleaseRead(&scp->bufCreateLock); - - lock_ObtainMutex(&scp->mx); - if (code) { - return code; - } - while (1) { - code = cm_SyncOp(scp, bufp, userp, reqp, 0, - CM_SCACHESYNC_READ | CM_SCACHESYNC_NEEDCALLBACK); - if (code) { - goto done; - } - - if (cm_HaveBuffer(scp, bufp, 0)) - break; - - /* otherwise load buffer */ - code = cm_GetBuffer(scp, bufp, NULL, userp, reqp); - if (code) { - goto done; - } - } - /* locked, has callback, has valid data in buffer */ - if ((tlen = scp->length.LowPart) > 1000) - return CM_ERROR_TOOBIG; - if (tlen <= 0) { - code = CM_ERROR_INVAL; - goto done; - } - - /* someone else did the work while we were out */ - if (scp->mountPointStringp[0]) { - code = 0; - goto done; - } - - /* otherwise, copy out the link */ - memcpy(scp->mountPointStringp, bufp->datap, tlen); - - /* now make it null-terminated. Note that the original contents of a - * link that is a mount point is "#volname." where "." is there just to - * be turned into a null. That is, we can trash the last char of the - * link without damaging the vol name. This is a stupid convention, - * but that's the protocol. - */ - scp->mountPointStringp[tlen-1] = 0; - code = 0; - - done: - if (bufp) - buf_Release(bufp); - return code; -} - -/* called with a locked scp and chases the mount point, yielding outScpp. - * scp remains locked, just for simplicity of describing the interface. - */ -long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp, - cm_req_t *reqp, cm_scache_t **outScpp) -{ - char *cellNamep; - char *volNamep; - int tlen; - long code; - char *cp; - char *mpNamep; - cm_volume_t *volp; - cm_cell_t *cellp; - char mtType; - cm_fid_t tfid; - size_t vnLength; - int type; - - if (scp->mountRootFid.cell != 0 && scp->mountRootGen >= cm_data.mountRootGen) { - tfid = scp->mountRootFid; - lock_ReleaseMutex(&scp->mx); - code = cm_GetSCache(&tfid, outScpp, userp, reqp); - lock_ObtainMutex(&scp->mx); - return code; - } - - /* parse the volume name */ - mpNamep = scp->mountPointStringp; - osi_assert(mpNamep[0]); - tlen = strlen(scp->mountPointStringp); - mtType = *scp->mountPointStringp; - cellNamep = malloc(tlen); - volNamep = malloc(tlen); - - cp = strrchr(mpNamep, ':'); - if (cp) { - /* cellular mount point */ - memset(cellNamep, 0, tlen); - strncpy(cellNamep, mpNamep+1, cp - mpNamep - 1); - strcpy(volNamep, cp+1); - /* now look up the cell */ - cellp = cm_GetCell(cellNamep, CM_FLAG_CREATE); - } - else { - /* normal mt pt */ - strcpy(volNamep, mpNamep+1); - - cellp = cm_FindCellByID(scp->fid.cell); - } - - if (!cellp) { - code = CM_ERROR_NOSUCHCELL; - goto done; - } - - vnLength = strlen(volNamep); - if (vnLength >= 8 && strcmp(volNamep + vnLength - 7, ".backup") == 0) - type = BACKVOL; - else if (vnLength >= 10 - && strcmp(volNamep + vnLength - 9, ".readonly") == 0) - type = ROVOL; - else - type = RWVOL; - - /* check for backups within backups */ - if (type == BACKVOL - && (scp->flags & (CM_SCACHEFLAG_RO | CM_SCACHEFLAG_PURERO)) - == CM_SCACHEFLAG_RO) { - code = CM_ERROR_NOSUCHVOLUME; - goto done; - } - - /* now we need to get the volume */ - lock_ReleaseMutex(&scp->mx); - code = cm_GetVolumeByName(cellp, volNamep, userp, reqp, 0, &volp); - lock_ObtainMutex(&scp->mx); - - if (code == 0) { - /* save the parent of the volume root for this is the - * place where the volume is mounted and we must remember - * this in the volume structure rather than just in the - * scache entry lest the scache entry gets recycled - * (defect 11489) - */ - lock_ObtainMutex(&volp->mx); - volp->dotdotFid = dscp->fid; - lock_ReleaseMutex(&volp->mx); - - scp->mountRootFid.cell = cellp->cellID; - /* if the mt pt is in a read-only volume (not just a - * backup), and if there is a read-only volume for the - * target, and if this is a type '#' mount point, use - * the read-only, otherwise use the one specified. - */ - if (mtType == '#' && (scp->flags & CM_SCACHEFLAG_PURERO) - && volp->roID != 0 && type == RWVOL) - type = ROVOL; - if (type == ROVOL) - scp->mountRootFid.volume = volp->roID; - else if (type == BACKVOL) - scp->mountRootFid.volume = volp->bkID; - else - scp->mountRootFid.volume = volp->rwID; - - /* the rest of the fid is a magic number */ - scp->mountRootFid.vnode = 1; - scp->mountRootFid.unique = 1; - scp->mountRootGen = cm_data.mountRootGen; - - tfid = scp->mountRootFid; - lock_ReleaseMutex(&scp->mx); - code = cm_GetSCache(&tfid, outScpp, userp, reqp); - lock_ObtainMutex(&scp->mx); - } - - done: - free(cellNamep); - free(volNamep); - return code; -} - -long cm_LookupInternal(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, - cm_req_t *reqp, cm_scache_t **outpScpp) -{ - long code; - int dnlcHit = 1; /* did we hit in the dnlc? yes, we did */ - cm_scache_t *tscp = NULL; - cm_scache_t *mountedScp; - cm_lookupSearch_t rock; - int getroot; - - if (dscp->fid.vnode == 1 && dscp->fid.unique == 1 - && strcmp(namep, "..") == 0) { - if (dscp->dotdotFid.volume == 0) - return CM_ERROR_NOSUCHVOLUME; - rock.fid = dscp->dotdotFid; - goto haveFid; - } - - memset(&rock, 0, sizeof(rock)); - rock.fid.cell = dscp->fid.cell; - rock.fid.volume = dscp->fid.volume; - rock.searchNamep = namep; - rock.caseFold = (flags & CM_FLAG_CASEFOLD); - rock.hasTilde = ((strchr(namep, '~') != NULL) ? 1 : 0); - - /* If NOMOUNTCHASE, bypass DNLC by passing NULL scp pointer */ - code = cm_ApplyDir(dscp, cm_LookupSearchProc, &rock, NULL, userp, reqp, - (flags & CM_FLAG_NOMOUNTCHASE) ? NULL : &tscp); - - /* code == 0 means we fell off the end of the dir, while stopnow means - * that we stopped early, probably because we found the entry we're - * looking for. Any other non-zero code is an error. - */ - if (code && code != CM_ERROR_STOPNOW) { - /* if the cm_scache_t we are searching in is not a directory - * we must return path not found because the error - * is to describe the final component not an intermediary - */ - if (code == CM_ERROR_NOTDIR) { - if (flags & CM_FLAG_CHECKPATH) - return CM_ERROR_NOSUCHPATH; - else - return CM_ERROR_NOSUCHFILE; - } - return code; - } - - getroot = (dscp==cm_data.rootSCachep) ; - if (!rock.found) { - if (!cm_freelanceEnabled || !getroot) { - if (flags & CM_FLAG_CHECKPATH) - return CM_ERROR_NOSUCHPATH; - else - return CM_ERROR_NOSUCHFILE; - } - else { /* nonexistent dir on freelance root, so add it */ - char fullname[200] = "."; - int found = 0; - - osi_Log1(afsd_logp,"cm_Lookup adding mount for non-existent directory: %s", - osi_LogSaveString(afsd_logp,namep)); - if (namep[0] == '.') { - if (cm_GetCell_Gen(&namep[1], &fullname[1], CM_FLAG_CREATE)) { - found = 1; - if ( stricmp(&namep[1], &fullname[1]) ) - code = cm_FreelanceAddSymlink(namep, fullname, &rock.fid); - else - code = cm_FreelanceAddMount(namep, &fullname[1], "root.cell.", 1, &rock.fid); - } - } else { - if (cm_GetCell_Gen(namep, fullname, CM_FLAG_CREATE)) { - found = 1; - if ( stricmp(namep, fullname) ) - code = cm_FreelanceAddSymlink(namep, fullname, &rock.fid); - else - code = cm_FreelanceAddMount(namep, fullname, "root.cell.", 0, &rock.fid); - } - } - if (!found || code < 0) { /* add mount point failed, so give up */ - if (flags & CM_FLAG_CHECKPATH) - return CM_ERROR_NOSUCHPATH; - else - return CM_ERROR_NOSUCHFILE; - } - tscp = NULL; /* to force call of cm_GetSCache */ - } - } - - haveFid: - if ( !tscp ) /* we did not find it in the dnlc */ - { - dnlcHit = 0; - code = cm_GetSCache(&rock.fid, &tscp, userp, reqp); - if (code) - return code; - } - /* tscp is now held */ - - lock_ObtainMutex(&tscp->mx); - code = cm_SyncOp(tscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK); - if (code) { - lock_ReleaseMutex(&tscp->mx); - cm_ReleaseSCache(tscp); - return code; - } - /* tscp is now locked */ - - if (!(flags & CM_FLAG_NOMOUNTCHASE) - && tscp->fileType == CM_SCACHETYPE_MOUNTPOINT) { - /* mount points are funny: they have a volume name to mount - * the root of. - */ - code = cm_ReadMountPoint(tscp, userp, reqp); - if (code == 0) - code = cm_FollowMountPoint(tscp, dscp, userp, reqp, - &mountedScp); - lock_ReleaseMutex(&tscp->mx); - cm_ReleaseSCache(tscp); - if (code) { - return code; - } - tscp = mountedScp; - } - else { - lock_ReleaseMutex(&tscp->mx); - } - - /* copy back pointer */ - *outpScpp = tscp; - - /* insert scache in dnlc */ - if ( !dnlcHit && !(flags & CM_FLAG_NOMOUNTCHASE) && rock.ExactFound ) { - /* lock the directory entry to prevent racing callback revokes */ - lock_ObtainMutex(&dscp->mx); - if ( dscp->cbServerp && dscp->cbExpires ) - cm_dnlcEnter(dscp, namep, tscp); - lock_ReleaseMutex(&dscp->mx); - } - - /* and return */ - return 0; -} - -int cm_ExpandSysName(char *inp, char *outp, long outSize, unsigned int index) -{ - char *tp; - int prefixCount; - - tp = strrchr(inp, '@'); - if (tp == NULL) - return 0; /* no @sys */ - - if (strcmp(tp, "@sys") != 0) - return 0; /* no @sys */ - - /* caller just wants to know if this is a valid @sys type of name */ - if (outp == NULL) - return 1; - - if (index >= MAXNUMSYSNAMES) - return -1; - - /* otherwise generate the properly expanded @sys name */ - prefixCount = tp - inp; - - strncpy(outp, inp, prefixCount); /* copy out "a." from "a.@sys" */ - outp[prefixCount] = 0; /* null terminate the "a." */ - strcat(outp, cm_sysNameList[index]);/* append i386_nt40 */ - return 1; -} - -long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, - cm_req_t *reqp, cm_scache_t **outpScpp) -{ - long code; - char tname[256]; - int sysNameIndex = 0; - cm_scache_t *scp = 0; - - if ( stricmp(namep,SMB_IOCTL_FILENAME_NOSLASH) == 0 ) { - if (flags & CM_FLAG_CHECKPATH) - return CM_ERROR_NOSUCHPATH; - else - return CM_ERROR_NOSUCHFILE; - } - - for ( sysNameIndex = 0; sysNameIndex < MAXNUMSYSNAMES; sysNameIndex++) { - code = cm_ExpandSysName(namep, tname, sizeof(tname), sysNameIndex); - if (code > 0) { - code = cm_LookupInternal(dscp, tname, flags, userp, reqp, &scp); - if (code == 0) { - *outpScpp = scp; - return 0; - } - if (scp) { - cm_ReleaseSCache(scp); - scp = 0; - } - } else { - return cm_LookupInternal(dscp, namep, flags, userp, reqp, outpScpp); - } - } - - /* None of the possible sysName expansions could be found */ - if (flags & CM_FLAG_CHECKPATH) - return CM_ERROR_NOSUCHPATH; - else - return CM_ERROR_NOSUCHFILE; -} - -long cm_Unlink(cm_scache_t *dscp, char *namep, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - cm_conn_t *connp; - AFSFid afsFid; - int sflags; - AFSFetchStatus newDirStatus; - AFSVolSync volSync; - struct rx_connection * callp; - -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { - /* deleting a mount point from the root dir. */ - code = cm_FreelanceRemoveMount(namep); - return code; - } -#endif - - /* make sure we don't screw up the dir status during the merge */ - lock_ObtainMutex(&dscp->mx); - sflags = CM_SCACHESYNC_STOREDATA; - code = cm_SyncOp(dscp, NULL, userp, reqp, 0, sflags); - lock_ReleaseMutex(&dscp->mx); - if (code) - return code; - - /* make the RPC */ - afsFid.Volume = dscp->fid.volume; - afsFid.Vnode = dscp->fid.vnode; - afsFid.Unique = dscp->fid.unique; - - osi_Log1(afsd_logp, "CALL RemoveFile scp 0x%x", (long) dscp); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) - continue; - - callp = cm_GetRxConn(connp); - code = RXAFS_RemoveFile(callp, &afsFid, namep, - &newDirStatus, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, &dscp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL RemoveFile FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL RemoveFile SUCCESS"); - - lock_ObtainMutex(&dscp->mx); - cm_dnlcRemove(dscp, namep); - cm_SyncOpDone(dscp, NULL, sflags); - if (code == 0) - cm_MergeStatus(dscp, &newDirStatus, &volSync, userp, 0); - lock_ReleaseMutex(&dscp->mx); - - return code; -} - -/* called with a locked vnode, and fills in the link info. - * returns this the vnode still locked. - */ -long cm_HandleLink(cm_scache_t *linkScp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - cm_buf_t *bufp; - long temp; - osi_hyper_t thyper; - - lock_AssertMutex(&linkScp->mx); - if (!linkScp->mountPointStringp[0]) { - /* read the link data */ - lock_ReleaseMutex(&linkScp->mx); - thyper.LowPart = thyper.HighPart = 0; - code = buf_Get(linkScp, &thyper, &bufp); - lock_ObtainMutex(&linkScp->mx); - if (code) - return code; - while (1) { - code = cm_SyncOp(linkScp, bufp, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_READ); - if (code) { - buf_Release(bufp); - return code; - } - if (cm_HaveBuffer(linkScp, bufp, 0)) - break; - - code = cm_GetBuffer(linkScp, bufp, NULL, userp, reqp); - if (code) { - buf_Release(bufp); - return code; - } - } /* while loop to get the data */ - - /* now if we still have no link read in, - * copy the data from the buffer */ - if ((temp = linkScp->length.LowPart) >= MOUNTPOINTLEN) { - buf_Release(bufp); - return CM_ERROR_TOOBIG; - } - - /* otherwise, it fits; make sure it is still null (could have - * lost race with someone else referencing this link above), - * and if so, copy in the data. - */ - if (!linkScp->mountPointStringp[0]) { - strncpy(linkScp->mountPointStringp, bufp->datap, temp); - linkScp->mountPointStringp[temp] = 0; /* null terminate */ - } - buf_Release(bufp); - } /* don't have sym link contents cached */ - - return 0; -} - -/* called with a held vnode and a path suffix, with the held vnode being a - * symbolic link. Our goal is to generate a new path to interpret, and return - * this new path in newSpaceBufferp. If the new vnode is relative to a dir - * other than the directory containing the symbolic link, then the new root is - * returned in *newRootScpp, otherwise a null is returned there. - */ -long cm_AssembleLink(cm_scache_t *linkScp, char *pathSuffixp, - cm_scache_t **newRootScpp, cm_space_t **newSpaceBufferp, - cm_user_t *userp, cm_req_t *reqp) -{ - long code = 0; - long len; - char *linkp; - cm_space_t *tsp; - - lock_ObtainMutex(&linkScp->mx); - code = cm_HandleLink(linkScp, userp, reqp); - if (code) - goto done; - - /* if we may overflow the buffer, bail out; buffer is signficantly - * bigger than max path length, so we don't really have to worry about - * being a little conservative here. - */ - if (strlen(linkScp->mountPointStringp) + strlen(pathSuffixp) + 2 - >= CM_UTILS_SPACESIZE) - return CM_ERROR_TOOBIG; - - tsp = cm_GetSpace(); - linkp = linkScp->mountPointStringp; - if (strncmp(linkp, cm_mountRoot, cm_mountRootLen) == 0) { - if (strlen(linkp) > cm_mountRootLen) - strcpy(tsp->data, linkp+cm_mountRootLen+1); - else - tsp->data[0] = 0; - *newRootScpp = cm_data.rootSCachep; - cm_HoldSCache(cm_data.rootSCachep); - } else if (linkp[0] == '\\' && linkp[1] == '\\') { - if (!strnicmp(&linkp[2], cm_NetbiosName, (len = strlen(cm_NetbiosName)))) - { - char * p = &linkp[len + 3]; - if (strnicmp(p, "all", 3) == 0) - p += 4; - - strcpy(tsp->data, p); - for (p = tsp->data; *p; p++) { - if (*p == '\\') - *p = '/'; - } - *newRootScpp = cm_data.rootSCachep; - cm_HoldSCache(cm_data.rootSCachep); - } else { - linkScp->fileType = CM_SCACHETYPE_DFSLINK; - strcpy(tsp->data, linkp); - *newRootScpp = NULL; - code = CM_ERROR_PATH_NOT_COVERED; - } - } else if ( !strnicmp(linkp, "msdfs:", (len = strlen("msdfs:"))) ) { - linkScp->fileType = CM_SCACHETYPE_DFSLINK; - strcpy(tsp->data, linkp); - *newRootScpp = NULL; - code = CM_ERROR_PATH_NOT_COVERED; - } else if (*linkp == '\\' || *linkp == '/') { -#if 0 - /* formerly, this was considered to be from the AFS root, - * but this seems to create problems. instead, we will just - * reject the link */ - strcpy(tsp->data, linkp+1); - *newRootScpp = cm_data.rootSCachep; - cm_HoldSCache(cm_data.rootSCachep); -#else - /* we still copy the link data into the response so that - * the user can see what the link points to - */ - linkScp->fileType = CM_SCACHETYPE_INVALID; - strcpy(tsp->data, linkp); - *newRootScpp = NULL; - code = CM_ERROR_NOSUCHPATH; -#endif - } else { - /* a relative link */ - strcpy(tsp->data, linkp); - *newRootScpp = NULL; - } - if (pathSuffixp[0] != 0) { /* if suffix string is non-null */ - strcat(tsp->data, "\\"); - strcat(tsp->data, pathSuffixp); - } - *newSpaceBufferp = tsp; - - done: - lock_ReleaseMutex(&linkScp->mx); - return code; -} - -long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, - cm_user_t *userp, char *tidPathp, cm_req_t *reqp, cm_scache_t **outScpp) -{ - long code; - char *tp; /* ptr moving through input buffer */ - char tc; /* temp char */ - int haveComponent; /* has new component started? */ - char component[256]; /* this is the new component */ - char *cp; /* component name being assembled */ - cm_scache_t *tscp; /* current location in the hierarchy */ - cm_scache_t *nscp; /* next dude down */ - cm_scache_t *dirScp; /* last dir we searched */ - cm_scache_t *linkScp; /* new root for the symlink we just - * looked up */ - cm_space_t *psp; /* space for current path, if we've hit - * any symlinks */ - cm_space_t *tempsp; /* temp vbl */ - char *restp; /* rest of the pathname to interpret */ - int symlinkCount; /* count of # of symlinks traversed */ - int extraFlag; /* avoid chasing mt pts for dir cmd */ - int phase = 1; /* 1 = tidPathp, 2 = pathp */ - - tp = tidPathp; - if (tp == NULL) { - tp = pathp; - phase = 2; - } - if (tp == NULL) { - tp = ""; - } - haveComponent = 0; - psp = NULL; - tscp = rootSCachep; - cm_HoldSCache(tscp); - symlinkCount = 0; - dirScp = 0; - - while (1) { - tc = *tp++; - - /* map Unix slashes into DOS ones so we can interpret Unix - * symlinks properly - */ - if (tc == '/') - tc = '\\'; - - if (!haveComponent) { - if (tc == '\\') { - continue; - } else if (tc == 0) { - if (phase == 1) { - phase = 2; - tp = pathp; - continue; - } - code = 0; - break; - } else { - haveComponent = 1; - cp = component; - *cp++ = tc; - } - } else { - /* we have a component here */ - if (tc == 0 || tc == '\\') { - /* end of the component; we're at the last - * component if tc == 0. However, if the last - * is a symlink, we have more to do. - */ - *cp++ = 0; /* add null termination */ - extraFlag = 0; - if ((flags & CM_FLAG_DIRSEARCH) && tc == 0) - extraFlag = CM_FLAG_NOMOUNTCHASE; - code = cm_Lookup(tscp, component, - flags | extraFlag, - userp, reqp, &nscp); - if (code) { - cm_ReleaseSCache(tscp); - if (dirScp) - cm_ReleaseSCache(dirScp); - if (psp) - cm_FreeSpace(psp); - if (code == CM_ERROR_NOSUCHFILE && tscp->fileType == CM_SCACHETYPE_SYMLINK) - return CM_ERROR_NOSUCHPATH; - else - return code; - } - haveComponent = 0; /* component done */ - if (dirScp) - cm_ReleaseSCache(dirScp); - dirScp = tscp; /* for some symlinks */ - tscp = nscp; /* already held */ - nscp = 0; - if (tc == 0 && !(flags & CM_FLAG_FOLLOW) && phase == 2) { - code = 0; - if (dirScp) { - cm_ReleaseSCache(dirScp); - dirScp = 0; - } - break; - } - - /* now, if tscp is a symlink, we should follow - * it and assemble the path again. - */ - lock_ObtainMutex(&tscp->mx); - code = cm_SyncOp(tscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_NEEDCALLBACK); - if (code) { - lock_ReleaseMutex(&tscp->mx); - cm_ReleaseSCache(tscp); - tscp = 0; - if (dirScp) { - cm_ReleaseSCache(dirScp); - dirScp = 0; - } - break; - } - if (tscp->fileType == CM_SCACHETYPE_SYMLINK) { - /* this is a symlink; assemble a new buffer */ - lock_ReleaseMutex(&tscp->mx); - if (symlinkCount++ >= MAX_SYMLINK_COUNT) { - cm_ReleaseSCache(tscp); - tscp = 0; - if (dirScp) { - cm_ReleaseSCache(dirScp); - dirScp = 0; - } - if (psp) - cm_FreeSpace(psp); - return CM_ERROR_TOO_MANY_SYMLINKS; - } - if (tc == 0) - restp = ""; - else - restp = tp; - code = cm_AssembleLink(tscp, restp, &linkScp, &tempsp, userp, reqp); - if (code) { - /* something went wrong */ - cm_ReleaseSCache(tscp); - tscp = 0; - if (dirScp) { - cm_ReleaseSCache(dirScp); - dirScp = 0; - } - break; - } - - /* otherwise, tempsp has the new path, - * and linkScp is the new root from - * which to interpret that path. - * Continue with the namei processing, - * also doing the bookkeeping for the - * space allocation and tracking the - * vnode reference counts. - */ - if (psp) - cm_FreeSpace(psp); - psp = tempsp; - tp = psp->data; - cm_ReleaseSCache(tscp); - tscp = linkScp; - linkScp = 0; - /* already held - * by AssembleLink - * now, if linkScp is null, that's - * AssembleLink's way of telling us that - * the sym link is relative to the dir - * containing the link. We have a ref - * to it in dirScp, and we hold it now - * and reuse it as the new spot in the - * dir hierarchy. - */ - if (tscp == NULL) { - tscp = dirScp; - dirScp = 0; - } - } else { - /* not a symlink, we may be done */ - lock_ReleaseMutex(&tscp->mx); - if (tc == 0) { - if (phase == 1) { - phase = 2; - tp = pathp; - continue; - } - if (dirScp) { - cm_ReleaseSCache(dirScp); - dirScp = 0; - } - code = 0; - break; - } - } - if (dirScp) { - cm_ReleaseSCache(dirScp); - dirScp = 0; - } - } /* end of a component */ - else - *cp++ = tc; - } /* we have a component */ - } /* big while loop over all components */ - - /* already held */ - if (dirScp) - cm_ReleaseSCache(dirScp); - if (psp) - cm_FreeSpace(psp); - if (code == 0) - *outScpp = tscp; - else if (tscp) - cm_ReleaseSCache(tscp); - return code; -} - -/* called with a dir, and a vnode within the dir that happens to be a symlink. - * We chase the link, and return a held pointer to the target, if it exists, - * in *outScpp. If we succeed, we return 0, otherwise we return an error code - * and do not hold or return a target vnode. - * - * This is very similar to calling cm_NameI with the last component of a name, - * which happens to be a symlink, except that we've already passed by the name. - * - * This function is typically called by the directory listing functions, which - * encounter symlinks but need to return the proper file length so programs - * like "more" work properly when they make use of the attributes retrieved from - * the dir listing. - * - * The input vnode should not be locked when this function is called. - */ -long cm_EvaluateSymLink(cm_scache_t *dscp, cm_scache_t *linkScp, - cm_scache_t **outScpp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - cm_space_t *spacep; - cm_scache_t *newRootScp; - - osi_Log1(afsd_logp, "Evaluating symlink scp 0x%x", linkScp); - - code = cm_AssembleLink(linkScp, "", &newRootScp, &spacep, userp, reqp); - if (code) - return code; - - /* now, if newRootScp is NULL, we're really being told that the symlink - * is relative to the current directory (dscp). - */ - if (newRootScp == NULL) { - newRootScp = dscp; - cm_HoldSCache(dscp); - } - - code = cm_NameI(newRootScp, spacep->data, - CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_DIRSEARCH, - userp, NULL, reqp, outScpp); - - if (code == CM_ERROR_NOSUCHFILE) - code = CM_ERROR_NOSUCHPATH; - - /* this stuff is allocated no matter what happened on the namei call, - * so free it */ - cm_FreeSpace(spacep); - cm_ReleaseSCache(newRootScp); - - return code; -} - -/* make this big enough so that one buffer of dir pages won't overflow. We'll - * check anyway, but we want to minimize the chance that we have to leave stuff - * unstat'd. - */ -#define CM_BULKMAX 128 - -/* rock for bulk stat calls */ -typedef struct cm_bulkStat { - osi_hyper_t bufOffset; /* only do it for things in this buffer page */ - - /* info for the actual call */ - int counter; /* next free slot */ - AFSFid fids[CM_BULKMAX]; - AFSFetchStatus stats[CM_BULKMAX]; - AFSCallBack callbacks[CM_BULKMAX]; -} cm_bulkStat_t; - -/* for a given entry, make sure that it isn't in the stat cache, and then - * add it to the list of file IDs to be obtained. - * - * Don't bother adding it if we already have a vnode. Note that the dir - * is locked, so we have to be careful checking the vnode we're thinking of - * processing, to avoid deadlocks. - */ -long cm_TryBulkProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *rockp, - osi_hyper_t *offp) -{ - osi_hyper_t thyper; - cm_bulkStat_t *bsp; - int i; - cm_scache_t *tscp; - cm_fid_t tfid; - - bsp = rockp; - - /* Don't overflow bsp. */ - if (bsp->counter >= CM_BULKMAX) - return CM_ERROR_STOPNOW; - - thyper.LowPart = cm_data.buf_blockSize; - thyper.HighPart = 0; - thyper = LargeIntegerAdd(thyper, bsp->bufOffset); - - /* thyper is now the first byte past the end of the record we're - * interested in, and bsp->bufOffset is the first byte of the record - * we're interested in. - * Skip data in the others. - * Skip '.' and '..' - */ - if (LargeIntegerLessThan(*offp, bsp->bufOffset)) - return 0; - if (LargeIntegerGreaterThanOrEqualTo(*offp, thyper)) - return CM_ERROR_STOPNOW; - if (strcmp(dep->name, ".") == 0 || strcmp(dep->name, "..") == 0) - return 0; - - tfid.cell = scp->fid.cell; - tfid.volume = scp->fid.volume; - tfid.vnode = ntohl(dep->fid.vnode); - tfid.unique = ntohl(dep->fid.unique); - tscp = cm_FindSCache(&tfid); - if (tscp) { - if (lock_TryMutex(&tscp->mx)) { - /* we have an entry that we can look at */ - if (cm_HaveCallback(tscp)) { - /* we have a callback on it. Don't bother - * fetching this stat entry, since we're happy - * with the info we have. - */ - lock_ReleaseMutex(&tscp->mx); - cm_ReleaseSCache(tscp); - return 0; - } - lock_ReleaseMutex(&tscp->mx); - } /* got lock */ - cm_ReleaseSCache(tscp); - } /* found entry */ - -#ifdef AFS_FREELANCE_CLIENT - // yj: if this is a mountpoint under root.afs then we don't want it - // to be bulkstat-ed, instead, we call getSCache directly and under - // getSCache, it is handled specially. - if ( cm_freelanceEnabled && - tfid.cell==AFS_FAKE_ROOT_CELL_ID && - tfid.volume==AFS_FAKE_ROOT_VOL_ID && - !(tfid.vnode==0x1 && tfid.unique==0x1) ) - { - osi_Log0(afsd_logp, "cm_TryBulkProc Freelance calls cm_SCache on root.afs mountpoint"); - return cm_GetSCache(&tfid, &tscp, NULL, NULL); - } -#endif /* AFS_FREELANCE_CLIENT */ - - i = bsp->counter++; - bsp->fids[i].Volume = scp->fid.volume; - bsp->fids[i].Vnode = tfid.vnode; - bsp->fids[i].Unique = tfid.unique; - return 0; -} - -/* called with a locked scp and a pointer to a buffer. Make bulk stat - * calls on all undeleted files in the page of the directory specified. - */ -void cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp, cm_user_t *userp, - cm_req_t *reqp) -{ - long code; - cm_bulkStat_t bb; /* this is *BIG*, probably 12K or so; - * watch for stack problems */ - AFSCBFids fidStruct; - AFSBulkStats statStruct; - cm_conn_t *connp; - AFSCBs callbackStruct; - long filex; - AFSVolSync volSync; - cm_callbackRequest_t cbReq; - long filesThisCall; - long i; - long j; - cm_scache_t *scp; - cm_fid_t tfid; - struct rx_connection * callp; - - osi_Log1(afsd_logp, "cm_TryBulkStat dir 0x%x", (long) dscp); - - /* should be on a buffer boundary */ - osi_assert((offsetp->LowPart & (cm_data.buf_blockSize - 1)) == 0); - - bb.counter = 0; - bb.bufOffset = *offsetp; - - lock_ReleaseMutex(&dscp->mx); - /* first, assemble the file IDs we need to stat */ - code = cm_ApplyDir(dscp, cm_TryBulkProc, (void *) &bb, offsetp, userp, reqp, NULL); - - /* if we failed, bail out early */ - if (code && code != CM_ERROR_STOPNOW) { - lock_ObtainMutex(&dscp->mx); - return; - } - - /* otherwise, we may have one or more bulk stat's worth of stuff in bb; - * make the calls to create the entries. Handle AFSCBMAX files at a - * time. - */ - filex = 0; - while (filex < bb.counter) { - filesThisCall = bb.counter - filex; - if (filesThisCall > AFSCBMAX) - filesThisCall = AFSCBMAX; - - fidStruct.AFSCBFids_len = filesThisCall; - fidStruct.AFSCBFids_val = &bb.fids[filex]; - statStruct.AFSBulkStats_len = filesThisCall; - statStruct.AFSBulkStats_val = &bb.stats[filex]; - callbackStruct.AFSCBs_len = filesThisCall; - callbackStruct.AFSCBs_val = &bb.callbacks[filex]; - cm_StartCallbackGrantingCall(NULL, &cbReq); - osi_Log1(afsd_logp, "CALL BulkStatus, %d entries", filesThisCall); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) - continue; - - callp = cm_GetRxConn(connp); - code = RXAFS_BulkStatus(callp, &fidStruct, - &statStruct, &callbackStruct, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, &dscp->fid, - &volSync, NULL, &cbReq, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL BulkStatus FAILURE code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL BulkStatus SUCCESS"); - - /* may as well quit on an error, since we're not going to do - * much better on the next immediate call, either. - */ - if (code) { - cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0); - break; - } - - /* otherwise, we should do the merges */ - for (i = 0; ifid.cell; - tfid.volume = bb.fids[j].Volume; - tfid.vnode = bb.fids[j].Vnode; - tfid.unique = bb.fids[j].Unique; - code = cm_GetSCache(&tfid, &scp, userp, reqp); - if (code != 0) - continue; - - /* otherwise, if this entry has no callback info, - * merge in this. - */ - lock_ObtainMutex(&scp->mx); - /* now, we have to be extra paranoid on merging in this - * information, since we didn't use cm_SyncOp before - * starting the fetch to make sure that no bad races - * were occurring. Specifically, we need to make sure - * we don't obliterate any newer information in the - * vnode than have here. - * - * Right now, be pretty conservative: if there's a - * callback or a pending call, skip it. - */ - if (scp->cbServerp == NULL - && !(scp->flags & - (CM_SCACHEFLAG_FETCHING - | CM_SCACHEFLAG_STORING - | CM_SCACHEFLAG_SIZESTORING))) { - cm_EndCallbackGrantingCall(scp, &cbReq, - &bb.callbacks[j], - CM_CALLBACK_MAINTAINCOUNT); - cm_MergeStatus(scp, &bb.stats[j], &volSync, - userp, 0); - } - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - } /* all files in the response */ - /* now tell it to drop the count, - * after doing the vnode processing above */ - cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0); - - filex += filesThisCall; - } /* while there are still more files to process */ - lock_ObtainMutex(&dscp->mx); - osi_Log0(afsd_logp, "END cm_TryBulkStat"); -} - -void cm_StatusFromAttr(AFSStoreStatus *statusp, cm_scache_t *scp, cm_attr_t *attrp) -{ - long mask; - - /* initialize store back mask as inexpensive local variable */ - mask = 0; - memset(statusp, 0, sizeof(AFSStoreStatus)); - - /* copy out queued info from scache first, if scp passed in */ - if (scp) { - if (scp->mask & CM_SCACHEMASK_CLIENTMODTIME) { - statusp->ClientModTime = scp->clientModTime; - mask |= AFS_SETMODTIME; - scp->mask &= ~CM_SCACHEMASK_CLIENTMODTIME; - } - } - - if (attrp) { - /* now add in our locally generated request */ - if (attrp->mask & CM_ATTRMASK_CLIENTMODTIME) { - statusp->ClientModTime = attrp->clientModTime; - mask |= AFS_SETMODTIME; - } - if (attrp->mask & CM_ATTRMASK_UNIXMODEBITS) { - statusp->UnixModeBits = attrp->unixModeBits; - mask |= AFS_SETMODE; - } - if (attrp->mask & CM_ATTRMASK_OWNER) { - statusp->Owner = attrp->owner; - mask |= AFS_SETOWNER; - } - if (attrp->mask & CM_ATTRMASK_GROUP) { - statusp->Group = attrp->group; - mask |= AFS_SETGROUP; - } - } - statusp->Mask = mask; -} - -/* set the file size, and make sure that all relevant buffers have been - * truncated. Ensure that any partially truncated buffers have been zeroed - * to the end of the buffer. - */ -long cm_SetLength(cm_scache_t *scp, osi_hyper_t *sizep, cm_user_t *userp, - cm_req_t *reqp) -{ - long code; - int shrinking; - - /* start by locking out buffer creation */ - lock_ObtainWrite(&scp->bufCreateLock); - - /* verify that this is a file, not a dir or a symlink */ - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) - goto done; - - if (scp->fileType != CM_SCACHETYPE_FILE) { - code = CM_ERROR_ISDIR; - goto done; - } - - startover: - if (LargeIntegerLessThan(*sizep, scp->length)) - shrinking = 1; - else - shrinking = 0; - - lock_ReleaseMutex(&scp->mx); - - /* can't hold scp->mx lock here, since we may wait for a storeback to - * finish if the buffer package is cleaning a buffer by storing it to - * the server. - */ - if (shrinking) - buf_Truncate(scp, userp, reqp, sizep); - - /* now ensure that file length is short enough, and update truncPos */ - lock_ObtainMutex(&scp->mx); - - /* make sure we have a callback (so we have the right value for the - * length), and wait for it to be safe to do a truncate. - */ - code = cm_SyncOp(scp, NULL, userp, reqp, PRSFS_WRITE, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_SETSTATUS | CM_SCACHESYNC_SETSIZE); - if (code) - goto done; - - if (LargeIntegerLessThan(*sizep, scp->length)) { - /* a real truncation. If truncPos is not set yet, or is bigger - * than where we're truncating the file, set truncPos to this - * new value. - */ - if (!shrinking) - goto startover; - if (!(scp->mask & CM_SCACHEMASK_TRUNCPOS) - || LargeIntegerLessThan(*sizep, scp->length)) { - /* set trunc pos */ - scp->truncPos = *sizep; - scp->mask |= CM_SCACHEMASK_TRUNCPOS; - } - /* in either case, the new file size has been changed */ - scp->length = *sizep; - scp->mask |= CM_SCACHEMASK_LENGTH; - } - else if (LargeIntegerGreaterThan(*sizep, scp->length)) { - /* really extending the file */ - scp->length = *sizep; - scp->mask |= CM_SCACHEMASK_LENGTH; - } - - /* done successfully */ - code = 0; - - done: - lock_ReleaseMutex(&scp->mx); - lock_ReleaseWrite(&scp->bufCreateLock); - - return code; -} - -/* set the file size or other attributes (but not both at once) */ -long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp, - cm_req_t *reqp) -{ - long code; - int flags; - AFSFetchStatus afsOutStatus; - AFSVolSync volSync; - cm_conn_t *connp; - AFSFid tfid; - AFSStoreStatus afsInStatus; - struct rx_connection * callp; - - /* handle file length setting */ - if (attrp->mask & CM_ATTRMASK_LENGTH) - return cm_SetLength(scp, &attrp->length, userp, reqp); - - flags = CM_SCACHESYNC_STORESTATUS; - - lock_ObtainMutex(&scp->mx); - /* otherwise, we have to make an RPC to get the status */ - code = cm_SyncOp(scp, NULL, userp, reqp, 0, CM_SCACHESYNC_STORESTATUS); - - /* make the attr structure */ - cm_StatusFromAttr(&afsInStatus, scp, attrp); - - tfid.Volume = scp->fid.volume; - tfid.Vnode = scp->fid.vnode; - tfid.Unique = scp->fid.unique; - - lock_ReleaseMutex(&scp->mx); - if (code) - return code; - - /* now make the RPC */ - osi_Log1(afsd_logp, "CALL StoreStatus scp 0x%x", (long) scp); - do { - code = cm_Conn(&scp->fid, userp, reqp, &connp); - if (code) - continue; - - callp = cm_GetRxConn(connp); - code = RXAFS_StoreStatus(callp, &tfid, - &afsInStatus, &afsOutStatus, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, - &scp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL StoreStatus FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL StoreStatus SUCCESS"); - - lock_ObtainMutex(&scp->mx); - cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STORESTATUS); - if (code == 0) - cm_MergeStatus(scp, &afsOutStatus, &volSync, userp, - CM_MERGEFLAG_FORCE); - - /* if we're changing the mode bits, discard the ACL cache, - * since we changed the mode bits. - */ - if (afsInStatus.Mask & AFS_SETMODE) cm_FreeAllACLEnts(scp); - lock_ReleaseMutex(&scp->mx); - return code; -} - -long cm_Create(cm_scache_t *dscp, char *namep, long flags, cm_attr_t *attrp, - cm_scache_t **scpp, cm_user_t *userp, cm_req_t *reqp) -{ - cm_conn_t *connp; - long code; - AFSFid dirAFSFid; - cm_callbackRequest_t cbReq; - AFSFid newAFSFid; - cm_fid_t newFid; - cm_scache_t *scp; - int didEnd; - AFSStoreStatus inStatus; - AFSFetchStatus updatedDirStatus; - AFSFetchStatus newFileStatus; - AFSCallBack newFileCallback; - AFSVolSync volSync; - struct rx_connection * callp; - - /* can't create names with @sys in them; must expand it manually first. - * return "invalid request" if they try. - */ - if (cm_ExpandSysName(namep, NULL, 0, 0)) { - return CM_ERROR_ATSYS; - } - - /* before starting the RPC, mark that we're changing the file data, so - * that someone who does a chmod will know to wait until our call - * completes. - */ - lock_ObtainMutex(&dscp->mx); - code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_StartCallbackGrantingCall(NULL, &cbReq); - } - lock_ReleaseMutex(&dscp->mx); - if (code) { - return code; - } - didEnd = 0; - - cm_StatusFromAttr(&inStatus, NULL, attrp); - - /* try the RPC now */ - osi_Log1(afsd_logp, "CALL CreateFile scp 0x%x", (long) dscp); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) - continue; - - dirAFSFid.Volume = dscp->fid.volume; - dirAFSFid.Vnode = dscp->fid.vnode; - dirAFSFid.Unique = dscp->fid.unique; - - callp = cm_GetRxConn(connp); - code = RXAFS_CreateFile(connp->callp, &dirAFSFid, namep, - &inStatus, &newAFSFid, &newFileStatus, - &updatedDirStatus, &newFileCallback, - &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, &volSync, NULL, &cbReq, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL CreateFile FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL CreateFile SUCCESS"); - - lock_ObtainMutex(&dscp->mx); - cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0); - } - lock_ReleaseMutex(&dscp->mx); - - /* now try to create the file's entry, too, but be careful to - * make sure that we don't merge in old info. Since we weren't locking - * out any requests during the file's creation, we may have pretty old - * info. - */ - if (code == 0) { - newFid.cell = dscp->fid.cell; - newFid.volume = dscp->fid.volume; - newFid.vnode = newAFSFid.Vnode; - newFid.unique = newAFSFid.Unique; - code = cm_GetSCache(&newFid, &scp, userp, reqp); - if (code == 0) { - lock_ObtainMutex(&scp->mx); - if (!cm_HaveCallback(scp)) { - cm_MergeStatus(scp, &newFileStatus, &volSync, - userp, 0); - cm_EndCallbackGrantingCall(scp, &cbReq, - &newFileCallback, 0); - didEnd = 1; - } - lock_ReleaseMutex(&scp->mx); - *scpp = scp; - } - } - - /* make sure we end things properly */ - if (!didEnd) - cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0); - - return code; -} - -long cm_FSync(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) -{ - long code; - - lock_ObtainWrite(&scp->bufCreateLock); - code = buf_CleanVnode(scp, userp, reqp); - lock_ReleaseWrite(&scp->bufCreateLock); - if (code == 0) { - lock_ObtainMutex(&scp->mx); - scp->flags &= ~(CM_SCACHEFLAG_OVERQUOTA - | CM_SCACHEFLAG_OUTOFSPACE); - if (scp->mask & (CM_SCACHEMASK_TRUNCPOS - | CM_SCACHEMASK_CLIENTMODTIME - | CM_SCACHEMASK_LENGTH)) - code = cm_StoreMini(scp, userp, reqp); - lock_ReleaseMutex(&scp->mx); - } - return code; -} - -long cm_MakeDir(cm_scache_t *dscp, char *namep, long flags, cm_attr_t *attrp, - cm_user_t *userp, cm_req_t *reqp) -{ - cm_conn_t *connp; - long code; - AFSFid dirAFSFid; - cm_callbackRequest_t cbReq; - AFSFid newAFSFid; - cm_fid_t newFid; - cm_scache_t *scp; - int didEnd; - AFSStoreStatus inStatus; - AFSFetchStatus updatedDirStatus; - AFSFetchStatus newDirStatus; - AFSCallBack newDirCallback; - AFSVolSync volSync; - struct rx_connection * callp; - - /* can't create names with @sys in them; must expand it manually first. - * return "invalid request" if they try. - */ - if (cm_ExpandSysName(namep, NULL, 0, 0)) { - return CM_ERROR_ATSYS; - } - - /* before starting the RPC, mark that we're changing the directory - * data, so that someone who does a chmod on the dir will wait until - * our call completes. - */ - lock_ObtainMutex(&dscp->mx); - code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_StartCallbackGrantingCall(NULL, &cbReq); - } - lock_ReleaseMutex(&dscp->mx); - if (code) { - return code; - } - didEnd = 0; - - cm_StatusFromAttr(&inStatus, NULL, attrp); - - /* try the RPC now */ - osi_Log1(afsd_logp, "CALL MakeDir scp 0x%x", (long) dscp); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) - continue; - - dirAFSFid.Volume = dscp->fid.volume; - dirAFSFid.Vnode = dscp->fid.vnode; - dirAFSFid.Unique = dscp->fid.unique; - - callp = cm_GetRxConn(connp); - code = RXAFS_MakeDir(connp->callp, &dirAFSFid, namep, - &inStatus, &newAFSFid, &newDirStatus, - &updatedDirStatus, &newDirCallback, - &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, &volSync, NULL, &cbReq, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL MakeDir FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL MakeDir SUCCESS"); - - lock_ObtainMutex(&dscp->mx); - cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0); - } - lock_ReleaseMutex(&dscp->mx); - - /* now try to create the new dir's entry, too, but be careful to - * make sure that we don't merge in old info. Since we weren't locking - * out any requests during the file's creation, we may have pretty old - * info. - */ - if (code == 0) { - newFid.cell = dscp->fid.cell; - newFid.volume = dscp->fid.volume; - newFid.vnode = newAFSFid.Vnode; - newFid.unique = newAFSFid.Unique; - code = cm_GetSCache(&newFid, &scp, userp, reqp); - if (code == 0) { - lock_ObtainMutex(&scp->mx); - if (!cm_HaveCallback(scp)) { - cm_MergeStatus(scp, &newDirStatus, &volSync, - userp, 0); - cm_EndCallbackGrantingCall(scp, &cbReq, - &newDirCallback, 0); - didEnd = 1; - } - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - } - } - - /* make sure we end things properly */ - if (!didEnd) - cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0); - - /* and return error code */ - return code; -} - -long cm_Link(cm_scache_t *dscp, char *namep, cm_scache_t *sscp, long flags, - cm_user_t *userp, cm_req_t *reqp) -{ - cm_conn_t *connp; - long code = 0; - AFSFid dirAFSFid; - AFSFid existingAFSFid; - AFSFetchStatus updatedDirStatus; - AFSFetchStatus newLinkStatus; - AFSVolSync volSync; - struct rx_connection * callp; - - if (dscp->fid.cell != sscp->fid.cell || - dscp->fid.volume != sscp->fid.volume) { - return CM_ERROR_CROSSDEVLINK; - } - - lock_ObtainMutex(&dscp->mx); - code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&dscp->mx); - - if (code) - return code; - - /* try the RPC now */ - osi_Log1(afsd_logp, "CALL Link scp 0x%x", (long) dscp); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) continue; - - dirAFSFid.Volume = dscp->fid.volume; - dirAFSFid.Vnode = dscp->fid.vnode; - dirAFSFid.Unique = dscp->fid.unique; - - existingAFSFid.Volume = sscp->fid.volume; - existingAFSFid.Vnode = sscp->fid.vnode; - existingAFSFid.Unique = sscp->fid.unique; - - callp = cm_GetRxConn(connp); - code = RXAFS_Link(callp, &dirAFSFid, namep, &existingAFSFid, - &newLinkStatus, &updatedDirStatus, &volSync); - rx_PutConnection(callp); - osi_Log1(smb_logp," RXAFS_Link returns 0x%x", code); - - } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, &volSync, NULL, NULL, code)); - - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL Link FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL Link SUCCESS"); - - lock_ObtainMutex(&dscp->mx); - cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0); - } - lock_ReleaseMutex(&dscp->mx); - - return code; -} - -long cm_SymLink(cm_scache_t *dscp, char *namep, char *contentsp, long flags, - cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp) -{ - cm_conn_t *connp; - long code; - AFSFid dirAFSFid; - AFSFid newAFSFid; - cm_fid_t newFid; - cm_scache_t *scp; - AFSStoreStatus inStatus; - AFSFetchStatus updatedDirStatus; - AFSFetchStatus newLinkStatus; - AFSVolSync volSync; - struct rx_connection * callp; - - /* before starting the RPC, mark that we're changing the directory data, - * so that someone who does a chmod on the dir will wait until our - * call completes. - */ - lock_ObtainMutex(&dscp->mx); - code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&dscp->mx); - if (code) { - return code; - } - - cm_StatusFromAttr(&inStatus, NULL, attrp); - - /* try the RPC now */ - osi_Log1(afsd_logp, "CALL Symlink scp 0x%x", (long) dscp); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) - continue; - - dirAFSFid.Volume = dscp->fid.volume; - dirAFSFid.Vnode = dscp->fid.vnode; - dirAFSFid.Unique = dscp->fid.unique; - - callp = cm_GetRxConn(connp); - code = RXAFS_Symlink(callp, &dirAFSFid, namep, contentsp, - &inStatus, &newAFSFid, &newLinkStatus, - &updatedDirStatus, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL Symlink FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL Symlink SUCCESS"); - - lock_ObtainMutex(&dscp->mx); - cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0); - } - lock_ReleaseMutex(&dscp->mx); - - /* now try to create the new dir's entry, too, but be careful to - * make sure that we don't merge in old info. Since we weren't locking - * out any requests during the file's creation, we may have pretty old - * info. - */ - if (code == 0) { - newFid.cell = dscp->fid.cell; - newFid.volume = dscp->fid.volume; - newFid.vnode = newAFSFid.Vnode; - newFid.unique = newAFSFid.Unique; - code = cm_GetSCache(&newFid, &scp, userp, reqp); - if (code == 0) { - lock_ObtainMutex(&scp->mx); - if (!cm_HaveCallback(scp)) { - cm_MergeStatus(scp, &newLinkStatus, &volSync, - userp, 0); - } - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - } - } - - /* and return error code */ - return code; -} - -long cm_RemoveDir(cm_scache_t *dscp, char *namep, cm_user_t *userp, - cm_req_t *reqp) -{ - cm_conn_t *connp; - long code; - AFSFid dirAFSFid; - int didEnd; - AFSFetchStatus updatedDirStatus; - AFSVolSync volSync; - struct rx_connection * callp; - - /* before starting the RPC, mark that we're changing the directory data, - * so that someone who does a chmod on the dir will wait until our - * call completes. - */ - lock_ObtainMutex(&dscp->mx); - code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&dscp->mx); - if (code) { - return code; - } - didEnd = 0; - - /* try the RPC now */ - osi_Log1(afsd_logp, "CALL RemoveDir scp 0x%x", (long) dscp); - do { - code = cm_Conn(&dscp->fid, userp, reqp, &connp); - if (code) - continue; - - dirAFSFid.Volume = dscp->fid.volume; - dirAFSFid.Vnode = dscp->fid.vnode; - dirAFSFid.Unique = dscp->fid.unique; - - callp = cm_GetRxConn(connp); - code = RXAFS_RemoveDir(callp, &dirAFSFid, namep, - &updatedDirStatus, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, &volSync, NULL, NULL, code)); - code = cm_MapRPCErrorRmdir(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL RemoveDir FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL RemoveDir SUCCESS"); - - lock_ObtainMutex(&dscp->mx); - cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_dnlcRemove(dscp, namep); - cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0); - } - lock_ReleaseMutex(&dscp->mx); - - /* and return error code */ - return code; -} - -long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp) -{ - /* grab mutex on contents */ - lock_ObtainMutex(&scp->mx); - - /* reset the prefetch info */ - scp->prefetch.base.LowPart = 0; /* base */ - scp->prefetch.base.HighPart = 0; - scp->prefetch.end.LowPart = 0; /* and end */ - scp->prefetch.end.HighPart = 0; - - /* release mutex on contents */ - lock_ReleaseMutex(&scp->mx); - - /* we're done */ - return 0; -} - -long cm_Rename(cm_scache_t *oldDscp, char *oldNamep, cm_scache_t *newDscp, - char *newNamep, cm_user_t *userp, cm_req_t *reqp) -{ - cm_conn_t *connp; - long code; - AFSFid oldDirAFSFid; - AFSFid newDirAFSFid; - int didEnd; - AFSFetchStatus updatedOldDirStatus; - AFSFetchStatus updatedNewDirStatus; - AFSVolSync volSync; - int oneDir; - struct rx_connection * callp; - - /* before starting the RPC, mark that we're changing the directory data, - * so that someone who does a chmod on the dir will wait until our call - * completes. We do this in vnode order so that we don't deadlock, - * which makes the code a little verbose. - */ - if (oldDscp == newDscp) { - /* check for identical names */ - if (strcmp(oldNamep, newNamep) == 0) - return CM_ERROR_RENAME_IDENTICAL; - - oneDir = 1; - lock_ObtainMutex(&oldDscp->mx); - cm_dnlcRemove(oldDscp, oldNamep); - cm_dnlcRemove(oldDscp, newNamep); - code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&oldDscp->mx); - } - else { - /* two distinct dir vnodes */ - oneDir = 0; - if (oldDscp->fid.cell != newDscp->fid.cell || - oldDscp->fid.volume != newDscp->fid.volume) - return CM_ERROR_CROSSDEVLINK; - - /* shouldn't happen that we have distinct vnodes for two - * different files, but could due to deliberate attack, or - * stale info. Avoid deadlocks and quit now. - */ - if (oldDscp->fid.vnode == newDscp->fid.vnode) - return CM_ERROR_CROSSDEVLINK; - - if (oldDscp->fid.vnode < newDscp->fid.vnode) { - lock_ObtainMutex(&oldDscp->mx); - cm_dnlcRemove(oldDscp, oldNamep); - code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&oldDscp->mx); - if (code == 0) { - lock_ObtainMutex(&newDscp->mx); - cm_dnlcRemove(newDscp, newNamep); - code = cm_SyncOp(newDscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&newDscp->mx); - if (code) { - /* cleanup first one */ - cm_SyncOpDone(oldDscp, NULL, - CM_SCACHESYNC_STOREDATA); - } - } - } - else { - /* lock the new vnode entry first */ - lock_ObtainMutex(&newDscp->mx); - cm_dnlcRemove(newDscp, newNamep); - code = cm_SyncOp(newDscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&newDscp->mx); - if (code == 0) { - lock_ObtainMutex(&oldDscp->mx); - cm_dnlcRemove(oldDscp, oldNamep); - code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0, - CM_SCACHESYNC_STOREDATA); - lock_ReleaseMutex(&oldDscp->mx); - if (code) { - /* cleanup first one */ - cm_SyncOpDone(newDscp, NULL, - CM_SCACHESYNC_STOREDATA); - } - } - } - } /* two distinct vnodes */ - - if (code) { - return code; - } - didEnd = 0; - - /* try the RPC now */ - osi_Log2(afsd_logp, "CALL Rename old scp 0x%x new scp 0x%x", - (long) oldDscp, (long) newDscp); - do { - code = cm_Conn(&oldDscp->fid, userp, reqp, &connp); - if (code) - continue; - - oldDirAFSFid.Volume = oldDscp->fid.volume; - oldDirAFSFid.Vnode = oldDscp->fid.vnode; - oldDirAFSFid.Unique = oldDscp->fid.unique; - newDirAFSFid.Volume = newDscp->fid.volume; - newDirAFSFid.Vnode = newDscp->fid.vnode; - newDirAFSFid.Unique = newDscp->fid.unique; - - callp = cm_GetRxConn(connp); - code = RXAFS_Rename(callp, &oldDirAFSFid, oldNamep, - &newDirAFSFid, newNamep, - &updatedOldDirStatus, &updatedNewDirStatus, - &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, - &volSync, NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL Rename FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL Rename SUCCESS"); - - /* update the individual stat cache entries for the directories */ - lock_ObtainMutex(&oldDscp->mx); - cm_SyncOpDone(oldDscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_MergeStatus(oldDscp, &updatedOldDirStatus, &volSync, - userp, 0); - } - lock_ReleaseMutex(&oldDscp->mx); - - /* and update it for the new one, too, if necessary */ - if (!oneDir) { - lock_ObtainMutex(&newDscp->mx); - cm_SyncOpDone(newDscp, NULL, CM_SCACHESYNC_STOREDATA); - if (code == 0) { - cm_MergeStatus(newDscp, &updatedNewDirStatus, &volSync, - userp, 0); - } - lock_ReleaseMutex(&newDscp->mx); - } - - /* and return error code */ - return code; -} - -long cm_Lock(cm_scache_t *scp, unsigned char LockType, - LARGE_INTEGER LOffset, LARGE_INTEGER LLength, - u_long Timeout, cm_user_t *userp, cm_req_t *reqp, - void **lockpp) -{ - long code; - int Which = ((LockType & LOCKING_ANDX_SHARED_LOCK) ? LockRead : LockWrite); - AFSFid tfid; - AFSVolSync volSync; - cm_conn_t *connp; - cm_file_lock_t *fileLock; - osi_queue_t *q; - int found = 0; - struct rx_connection * callp; - - /* Look for a conflict. Also, if we are asking for a shared lock, - * look for another shared lock, so we don't have to do an RPC. - */ - q = scp->fileLocks; - while (q) { - fileLock = (cm_file_lock_t *)((char *) q - offsetof(cm_file_lock_t, fileq)); - if ((fileLock->flags & (CM_FILELOCK_FLAG_INVALID | CM_FILELOCK_FLAG_WAITING)) == 0) { - if ((LockType & LOCKING_ANDX_SHARED_LOCK) == 0 || - (fileLock->LockType & LOCKING_ANDX_SHARED_LOCK) == 0) - return CM_ERROR_WOULDBLOCK; - found = 1; - } - q = osi_QNext(q); - } - - if (found) - code = 0; - else { - tfid.Volume = scp->fid.volume; - tfid.Vnode = scp->fid.vnode; - tfid.Unique = scp->fid.unique; - lock_ReleaseMutex(&scp->mx); - do { - code = cm_Conn(&scp->fid, userp, reqp, &connp); - if (code) - break; - - callp = cm_GetRxConn(connp); - code = RXAFS_SetLock(callp, &tfid, Which, - &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, - NULL, NULL, code)); - lock_ObtainMutex(&scp->mx); - code = cm_MapRPCError(code, reqp); - } - - if (code == 0 || Timeout != 0) { - fileLock = malloc(sizeof(cm_file_lock_t)); - fileLock->LockType = LockType; - cm_HoldUser(userp); - fileLock->userp = userp; - fileLock->fid = scp->fid; - fileLock->LOffset = LOffset; - fileLock->LLength = LLength; - fileLock->flags = (code == 0 ? 0 : CM_FILELOCK_FLAG_WAITING); - osi_QAdd(&scp->fileLocks, &fileLock->fileq); - lock_ObtainWrite(&cm_scacheLock); - osi_QAdd(&cm_allFileLocks, &fileLock->q); - lock_ReleaseWrite(&cm_scacheLock); - if (code != 0) - *lockpp = fileLock; - } - return code; -} - -long cm_Unlock(cm_scache_t *scp, unsigned char LockType, - LARGE_INTEGER LOffset, LARGE_INTEGER LLength, - cm_user_t *userp, cm_req_t *reqp) -{ - long code = 0; - int Which = ((LockType & LOCKING_ANDX_SHARED_LOCK) ? LockRead : LockWrite); - AFSFid tfid; - AFSVolSync volSync; - cm_conn_t *connp; - cm_file_lock_t *fileLock, *ourLock; - osi_queue_t *q, *qq; - int anotherReader = 0; - int smallLock = 0; - int found = 0; - struct rx_connection * callp; - - if (LargeIntegerLessThan(LLength, scp->length)) - smallLock = 1; - - /* Look for our own lock on the list, so as to remove it. - * Also, determine if we're the last reader; if not, avoid an RPC. - */ - q = scp->fileLocks; - while (q) { - fileLock = (cm_file_lock_t *) - ((char *) q - offsetof(cm_file_lock_t, fileq)); - if (!found - && fileLock->userp == userp - && LargeIntegerEqualTo(fileLock->LOffset, LOffset) - && LargeIntegerEqualTo(fileLock->LLength, LLength)) { - found = 1; - ourLock = fileLock; - qq = q; - } - else if (fileLock->LockType & LOCKING_ANDX_SHARED_LOCK) - anotherReader = 1; - q = osi_QNext(q); - } - - /* ignore byte ranges */ - if (smallLock && !found) - return 0; - - /* don't try to unlock other people's locks */ - if (!found) - return CM_ERROR_WOULDBLOCK; - - /* discard lock record */ - osi_QRemove(&scp->fileLocks, qq); - /* - * Don't delete it here; let the daemon delete it, to simplify - * the daemon's traversal of the list. - */ - lock_ObtainWrite(&cm_scacheLock); - ourLock->flags |= CM_FILELOCK_FLAG_INVALID; - cm_ReleaseUser(ourLock->userp); - lock_ReleaseWrite(&cm_scacheLock); - - if (!anotherReader) { - tfid.Volume = scp->fid.volume; - tfid.Vnode = scp->fid.vnode; - tfid.Unique = scp->fid.unique; - lock_ReleaseMutex(&scp->mx); - osi_Log1(afsd_logp, "CALL ReleaseLock scp 0x%x", (long) scp); - do { - code = cm_Conn(&scp->fid, userp, reqp, &connp); - if (code) - break; - - callp = cm_GetRxConn(connp); - code = RXAFS_ReleaseLock(callp, &tfid, &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, - NULL, NULL, code)); - code = cm_MapRPCError(code, reqp); - - if (code) - osi_Log1(afsd_logp, "CALL ReleaseLock FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL ReleaseLock SUCCESS"); - - lock_ObtainMutex(&scp->mx); - } - - return code; -} - -void cm_CheckLocks() -{ - osi_queue_t *q, *nq; - cm_file_lock_t *fileLock; - cm_req_t req; - AFSFid tfid; - AFSVolSync volSync; - cm_conn_t *connp; - long code; - struct rx_connection * callp; - - cm_InitReq(&req); - - lock_ObtainWrite(&cm_scacheLock); - q = cm_allFileLocks; - while (q) { - fileLock = (cm_file_lock_t *) q; - nq = osi_QNext(q); - if (fileLock->flags & CM_FILELOCK_FLAG_INVALID) { - osi_QRemove(&cm_allFileLocks, q); - free(fileLock); - } - else if (!(fileLock->flags & CM_FILELOCK_FLAG_WAITING)) { - tfid.Volume = fileLock->fid.volume; - tfid.Vnode = fileLock->fid.vnode; - tfid.Unique = fileLock->fid.unique; - lock_ReleaseWrite(&cm_scacheLock); - osi_Log1(afsd_logp, "CALL ExtendLock lock 0x%x", (long) fileLock); - do { - code = cm_Conn(&fileLock->fid, fileLock->userp, - &req, &connp); - if (code) - break; - - callp = cm_GetRxConn(connp); - code = RXAFS_ExtendLock(callp, &tfid, - &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, fileLock->userp, &req, - &fileLock->fid, &volSync, NULL, NULL, - code)); - code = cm_MapRPCError(code, &req); - if (code) - osi_Log1(afsd_logp, "CALL ExtendLock FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL ExtendLock SUCCESS"); - - lock_ObtainWrite(&cm_scacheLock); - } - q = nq; - } - lock_ReleaseWrite(&cm_scacheLock); -} - -long cm_RetryLock(cm_file_lock_t *oldFileLock, int vcp_is_dead) -{ - long code; - int Which = ((oldFileLock->LockType & LOCKING_ANDX_SHARED_LOCK) ? LockRead : LockWrite); - cm_scache_t *scp; - AFSFid tfid; - AFSVolSync volSync; - cm_conn_t *connp; - cm_file_lock_t *fileLock; - osi_queue_t *q; - cm_req_t req; - int found = 0; - struct rx_connection * callp; - - if (vcp_is_dead) { - code = CM_ERROR_TIMEDOUT; - goto handleCode; - } - - cm_InitReq(&req); - - /* Look for a conflict. Also, if we are asking for a shared lock, - * look for another shared lock, so we don't have to do an RPC. - */ - code = cm_GetSCache(&oldFileLock->fid, &scp, oldFileLock->userp, &req); - if (code) - return code; - - q = scp->fileLocks; - while (q) { - fileLock = (cm_file_lock_t *) - ((char *) q - offsetof(cm_file_lock_t, fileq)); - if ((fileLock->flags & - (CM_FILELOCK_FLAG_INVALID | CM_FILELOCK_FLAG_WAITING)) - == 0) { - if ((oldFileLock->LockType & LOCKING_ANDX_SHARED_LOCK) == 0 - || (fileLock->LockType & LOCKING_ANDX_SHARED_LOCK) == 0) { - cm_ReleaseSCache(scp); - return CM_ERROR_WOULDBLOCK; - } - found = 1; - } - q = osi_QNext(q); - } - - if (found) - code = 0; - else { - tfid.Volume = oldFileLock->fid.volume; - tfid.Vnode = oldFileLock->fid.vnode; - tfid.Unique = oldFileLock->fid.unique; - osi_Log1(afsd_logp, "CALL SetLock lock 0x%x", (long) oldFileLock); - do { - code = cm_Conn(&oldFileLock->fid, oldFileLock->userp, - &req, &connp); - if (code) - break; - - callp = cm_GetRxConn(connp); - code = RXAFS_SetLock(callp, &tfid, Which, - &volSync); - rx_PutConnection(callp); - - } while (cm_Analyze(connp, oldFileLock->userp, &req, - &oldFileLock->fid, &volSync, - NULL, NULL, code)); - code = cm_MapRPCError(code, &req); - - if (code) - osi_Log1(afsd_logp, "CALL SetLock FAILURE, code 0x%x", code); - else - osi_Log0(afsd_logp, "CALL SetLock SUCCESS"); - } - - handleCode: - if (code != 0 && code != CM_ERROR_WOULDBLOCK) { - lock_ObtainMutex(&scp->mx); - osi_QRemove(&scp->fileLocks, &oldFileLock->fileq); - lock_ReleaseMutex(&scp->mx); - } - lock_ObtainWrite(&cm_scacheLock); - if (code == 0) - oldFileLock->flags = 0; - else if (code != CM_ERROR_WOULDBLOCK) { - oldFileLock->flags |= CM_FILELOCK_FLAG_INVALID; - cm_ReleaseUser(oldFileLock->userp); - oldFileLock->userp = NULL; - } - lock_ReleaseWrite(&cm_scacheLock); - - return code; -} diff --git a/src/WINNT/afsd/cm_vnodeops.h b/src/WINNT/afsd/cm_vnodeops.h deleted file mode 100644 index a96e1224d..000000000 --- a/src/WINNT/afsd/cm_vnodeops.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_VNODEOPS_H_ENV__ -#define __CM_VNODEOPS_H_ENV__ 1 - -extern unsigned int cm_mountRootGen; - -/* parms for attribute setting call */ -typedef struct cm_attr { - int mask; - time_t clientModTime; - osi_hyper_t length; - int unixModeBits; - long owner; - long group; -} cm_attr_t; - -#define CM_ATTRMASK_CLIENTMODTIME 1 /* set if field is valid */ -#define CM_ATTRMASK_LENGTH 2 /* field is valid */ -#define CM_ATTRMASK_UNIXMODEBITS 4 /* field is valid */ -#define CM_ATTRMASK_OWNER 8 /* field is valid */ -#define CM_ATTRMASK_GROUP 0x10 /* field is valid */ - -/* type of rock for lookup's searches */ -typedef struct cm_lookupSearch { - cm_fid_t fid; - char *searchNamep; - int found; - int LCfound, UCfound, NCfound, ExactFound; - int caseFold; - int hasTilde; -} cm_lookupSearch_t; - -#include "cm_dir.h" - -typedef int (*cm_DirFuncp_t)(struct cm_scache *, struct cm_dirEntry *, void *, - osi_hyper_t *entryOffsetp); - -/* arrays */ - -extern unsigned char cm_foldUpper[]; - -/* functions */ - -extern int cm_NoneLower(char *s); - -extern int cm_NoneUpper(char *s); - -extern int cm_Is8Dot3(char *namep); - -extern int cm_stricmp(const char *, const char *); - -extern void cm_Gen8Dot3Name(struct cm_dirEntry *dep, char *shortName, - char **shortNameEndp); - -extern long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp, - cm_req_t *reqp); - -extern long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, - cm_user_t *userp, char *tidPathp, cm_req_t *reqp, - cm_scache_t **outScpp); - -extern long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, - cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp); - -extern long cm_LookupInternal(cm_scache_t *dscp, char *namep, long flags, - cm_user_t *userp, cm_req_t *reqp, - cm_scache_t **outpScpp); - -extern void cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp, - cm_user_t *userp, cm_req_t *reqp); - -extern long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp, - cm_req_t *reqp); - -extern long cm_Create(cm_scache_t *scp, char *namep, long flags, - cm_attr_t *attrp, cm_scache_t **scpp, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_FSync(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp); - -extern void cm_StatusFromAttr(struct AFSStoreStatus *statusp, - struct cm_scache *scp, struct cm_attr *attrp); - -extern long cm_Unlink(cm_scache_t *dscp, char *namep, cm_user_t *userp, - cm_req_t *reqp); - -extern long cm_ApplyDir(cm_scache_t *scp, cm_DirFuncp_t funcp, void *parmp, - osi_hyper_t *startOffsetp, cm_user_t *userp, cm_req_t *reqp, - cm_scache_t **retscp); - -extern long cm_MakeDir(cm_scache_t *dscp, char *lastNamep, long flags, - cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_RemoveDir(cm_scache_t *dscp, char *lastNamep, cm_user_t *userp, - cm_req_t *reqp); - -extern long cm_Rename(cm_scache_t *oldDscp, char *oldLastNamep, - cm_scache_t *newDscp, char *newLastNamep, cm_user_t *userp, - cm_req_t *reqp); - -extern long cm_HandleLink(cm_scache_t *linkScp, struct cm_user *userp, - cm_req_t *reqp); - -extern long cm_Link(cm_scache_t *dscp, char *namep, cm_scache_t *sscp, - long flags, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_SymLink(cm_scache_t *dscp, char *namep, char *contentsp, - long flags, cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_AssembleLink(cm_scache_t *linkScp, char *pathSuffixp, - cm_scache_t **newRootScpp, cm_space_t **newSpaceBufferp, - cm_user_t *userp, cm_req_t *reqp); - -extern int cm_ExpandSysName(char *inp, char *outp, long outSize, - unsigned int sysNameIndex); - -extern long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp); - -extern long cm_CheckOpen(cm_scache_t *scp, int openMode, int trunc, - cm_user_t *userp, cm_req_t *reqp); - -/* - * Combinations of file opening access bits for AFS. - * We don't insist on write rights to open the file with FILE_WRITE_ATTRIBUTES, - * because we want to enable the owner to set/clear the READONLY flag. - * The RPC will fail if you can't modify the attributes, anyway. - */ -#define AFS_ACCESS_READ (FILE_GENERIC_READ & ~SYNCHRONIZE) -#define AFS_ACCESS_WRITE ((FILE_GENERIC_WRITE & ~(READ_CONTROL | SYNCHRONIZE)) \ - & ~FILE_WRITE_ATTRIBUTES) - -extern long cm_CheckNTOpen(cm_scache_t *scp, unsigned int desiredAccess, - unsigned int createDisp, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_CheckNTDelete(cm_scache_t *dscp, cm_scache_t *scp, - cm_user_t *userp, cm_req_t *reqp); - -extern long cm_EvaluateSymLink(cm_scache_t *dscp, cm_scache_t *linkScp, - cm_scache_t **outScpp, cm_user_t *userp, cm_req_t *reqp); - -extern long cm_Lock(cm_scache_t *scp, unsigned char LockType, - LARGE_INTEGER LOffset, LARGE_INTEGER LLength, - u_long Timeout, cm_user_t *userp, cm_req_t *reqp, - void **lockpp); - -extern long cm_Unlock(cm_scache_t *scp, unsigned char LockType, - LARGE_INTEGER LOffset, LARGE_INTEGER LLength, - cm_user_t *userp, cm_req_t *reqp); - -extern void cm_CheckLocks(); - -extern long cm_RetryLock(cm_file_lock_t *oldFileLock, int vcp_is_dead); - -#define MAX_SYMLINK_COUNT 16 -#endif /* __CM_VNODEOPS_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c deleted file mode 100644 index 86de5c823..000000000 --- a/src/WINNT/afsd/cm_volume.c +++ /dev/null @@ -1,625 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#include -#else -#include -#endif /* !DJGPP */ -#include -#include -#include -#include - -#include "afsd.h" - -osi_rwlock_t cm_volumeLock; - -long -cm_ValidateVolume(void) -{ - cm_volume_t * volp; - afs_uint32 count; - - for (volp = cm_data.allVolumesp, count = 0; volp; volp=volp->nextp, count++) { - if ( volp->magic != CM_VOLUME_MAGIC ) { - afsi_log("cm_ValidateVolume failure: volp->magic != CM_VOLUME_MAGIC"); - fprintf(stderr, "cm_ValidateVolume failure: volp->magic != CM_VOLUME_MAGIC\n"); - return -1; - } - if ( volp->cellp && volp->cellp->magic != CM_CELL_MAGIC ) { - afsi_log("cm_ValidateVolume failure: volp->cellp->magic != CM_CELL_MAGIC"); - fprintf(stderr, "cm_ValidateVolume failure: volp->cellp->magic != CM_CELL_MAGIC\n"); - return -2; - } - if ( volp->nextp && volp->nextp->magic != CM_VOLUME_MAGIC ) { - afsi_log("cm_ValidateVolume failure: volp->nextp->magic != CM_VOLUME_MAGIC"); - fprintf(stderr, "cm_ValidateVolume failure: volp->nextp->magic != CM_VOLUME_MAGIC\n"); - return -3; - } - if ( count != 0 && volp == cm_data.allVolumesp || - count > cm_data.maxVolumes ) { - afsi_log("cm_ValidateVolume failure: cm_data.allVolumep loop detected"); - fprintf(stderr, "cm_ValidateVolume failure: cm_data.allVolumep loop detected\n"); - return -4; - } - } - - if ( count != cm_data.currentVolumes ) { - afsi_log("cm_ValidateVolume failure: count != cm_data.currentVolumes"); - fprintf(stderr, "cm_ValidateVolume failure: count != cm_data.currentVolumes\n"); - return -5; - } - - return 0; -} - -long -cm_ShutdownVolume(void) -{ - cm_volume_t * volp; - - for (volp = cm_data.allVolumesp; volp; volp=volp->nextp) - lock_FinalizeMutex(&volp->mx); - - return 0; -} - -void cm_InitVolume(int newFile, long maxVols) -{ - static osi_once_t once; - - if (osi_Once(&once)) { - lock_InitializeRWLock(&cm_volumeLock, "cm global volume lock"); - - if ( newFile ) { - cm_data.allVolumesp = NULL; - cm_data.currentVolumes = 0; - cm_data.maxVolumes = maxVols; - } else { - cm_volume_t * volp; - - for (volp = cm_data.allVolumesp; volp; volp=volp->nextp) { - lock_InitializeMutex(&volp->mx, "cm_volume_t mutex"); - volp->flags |= CM_VOLUMEFLAG_RESET; - volp->rwServersp = NULL; - volp->roServersp = NULL; - volp->bkServersp = NULL; - } - } - osi_EndOnce(&once); - } -} - -/* - * Update a volume. Caller holds volume's lock (volp->mx). - * - * - * shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU} 01:38 (JHutz) - * Yes, we support multihomed fileservers. - * Since before we got the code from IBM. - * But to find out about multiple addresses on a multihomed server, you need - * to use VL_GetEntryByNameU and VL_GetAddrsU. If you use - * VL_GetEntryByNameO or VL_GetEntryByNameN, the vlserver just gives you one - * address per server. - * shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU} 01:39 (JHutz) - * see src/afs/afs_volume.c, paying particular attention to - * afs_NewVolumeByName, afs_SetupVolume, and InstallUVolumeEntry - * shadow / openafs / jaltman {ANDREW.CMU.EDU} 01:40 (Jeffrey Altman) - * thanks. The windows client calls the 0 versions. - * shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU} 01:51 (JHutz) - * Oh. Ew. - * By not using the N versions, you only get up to 8 sites instead of 13. - * By not using the U versions, you don't get to know about multihomed serve - * shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU} 01:52 (JHutz) - * Of course, you probably want to support the older versions for backward - * compatibility. If you do that, you need to call the newest interface - * first, and fall back to successively older versions if you get - * RXGEN_OPCODE. - */ -#define MULTIHOMED 1 -long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, - cm_volume_t *volp) -{ - cm_conn_t *connp; - int i, j, k; - cm_serverRef_t *tsrp; - cm_server_t *tsp; - struct sockaddr_in tsockAddr; - long tflags; - u_long tempAddr; - struct vldbentry vldbEntry; - struct nvldbentry nvldbEntry; -#ifdef MULTIHOMED - struct uvldbentry uvldbEntry; -#endif - int type = -1; - int ROcount = 0; - long code; - - /* clear out old bindings */ - if (volp->rwServersp) - cm_FreeServerList(&volp->rwServersp); - if (volp->roServersp) - cm_FreeServerList(&volp->roServersp); - if (volp->bkServersp) - cm_FreeServerList(&volp->bkServersp); - -#ifdef AFS_FREELANCE_CLIENT - if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && atoi(volp->namep)==AFS_FAKE_ROOT_VOL_ID ) - { - memset(&vldbEntry, 0, sizeof(vldbEntry)); - vldbEntry.flags |= VLF_RWEXISTS; - vldbEntry.volumeId[0] = AFS_FAKE_ROOT_VOL_ID; - code = 0; - type = 0; - } else -#endif - { - /* now we have volume structure locked and held; make RPC to fill it */ - do { - code = cm_ConnByMServers(cellp->vlServersp, userp, reqp, &connp); - if (code) - continue; - osi_Log1(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s", volp->namep); -#ifdef MULTIHOMED - code = VL_GetEntryByNameU(connp->callp, volp->namep, &uvldbEntry); - type = 2; - if ( code == RXGEN_OPCODE ) -#endif - { - code = VL_GetEntryByNameN(connp->callp, volp->namep, &nvldbEntry); - type = 1; - } - if ( code == RXGEN_OPCODE ) { - code = VL_GetEntryByNameO(connp->callp, volp->namep, &vldbEntry); - type = 0; - } - } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code)); - code = cm_MapVLRPCError(code, reqp); - } - if (code == 0) { - afs_int32 flags; - afs_int32 nServers; - afs_int32 rwID; - afs_int32 roID; - afs_int32 bkID; - afs_int32 serverNumber[NMAXNSERVERS]; - afs_int32 serverFlags[NMAXNSERVERS]; - - switch ( type ) { - case 0: - flags = vldbEntry.flags; - nServers = vldbEntry.nServers; - rwID = vldbEntry.volumeId[0]; - roID = vldbEntry.volumeId[1]; - bkID = vldbEntry.volumeId[2]; - for ( i=0; ivlServersp, userp, reqp, &connp); - if (code) - continue; - - code = VL_GetAddrsU(connp->callp, &attrs, &uuid, &unique, &nentries, &addrs); - - if (code == 0 && nentries == 0) - code = VL_NOENT; - } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code)); - code = cm_MapVLRPCError(code, reqp); - if (code) - return code; - - addrp = addrs.bulkaddrs_val; - for (k = 0; k < nentries && j < NMAXNSERVERS; j++, k++) { - serverFlags[j] = uvldbEntry.serverFlags[i]; - serverNumber[j] = addrp[k]; - } - - free(addrs.bulkaddrs_val); /* This is wrong */ - } - } - nServers = j; /* update the server count */ - break; -#endif - } - - /* decode the response */ - lock_ObtainWrite(&cm_volumeLock); - if (flags & VLF_RWEXISTS) - volp->rwID = rwID; - else - volp->rwID = 0; - if (flags & VLF_ROEXISTS) - volp->roID = roID; - else - volp->roID = 0; - if (flags & VLF_BACKEXISTS) - volp->bkID = bkID; - else - volp->bkID = 0; - lock_ReleaseWrite(&cm_volumeLock); - for (i=0; icellp ) - tsp->cellp = cellp; - - osi_assert(tsp != NULL); - - /* and add it to the list(s). */ - /* - * Each call to cm_NewServerRef() increments the - * ref count of tsp. These reference will be dropped, - * if and when the volume is reset; see reset code - * earlier in this function. - */ - if ((tflags & VLSF_RWVOL) && (flags & VLF_RWEXISTS)) { - tsrp = cm_NewServerRef(tsp); - cm_InsertServerList(&volp->rwServersp, tsrp); - lock_ObtainWrite(&cm_serverLock); - tsrp->refCount--; /* drop allocation reference */ - lock_ReleaseWrite(&cm_serverLock); - } - if ((tflags & VLSF_ROVOL) && (flags & VLF_ROEXISTS)) { - tsrp = cm_NewServerRef(tsp); - cm_InsertServerList(&volp->roServersp, tsrp); - lock_ObtainWrite(&cm_serverLock); - tsrp->refCount--; /* drop allocation reference */ - lock_ReleaseWrite(&cm_serverLock); - ROcount++; - } - /* We don't use VLSF_BACKVOL !?! */ - if ((tflags & VLSF_RWVOL) && (flags & VLF_BACKEXISTS)) { - tsrp = cm_NewServerRef(tsp); - cm_InsertServerList(&volp->bkServersp, tsrp); - lock_ObtainWrite(&cm_serverLock); - tsrp->refCount--; /* drop allocation reference */ - lock_ReleaseWrite(&cm_serverLock); - } - /* Drop the reference obtained by cm_FindServer() */ - cm_PutServer(tsp); - } - - /* - * Randomize RO list - * - * If the first n servers have the same ipRank, then we - * randomly pick one among them and move it to the beginning. - * We don't bother to re-order the whole list because - * the rest of the list is used only if the first server is - * down. We only do this for the RO list; we assume the other - * lists are length 1. - */ - if (ROcount > 1) { - cm_RandomizeServer(&volp->roServersp); - } - } - return code; -} - -long cm_GetVolumeByID(cm_cell_t *cellp, long volumeID, cm_user_t *userp, - cm_req_t *reqp, cm_volume_t **outVolpp) -{ - cm_volume_t *volp; - char volNameString[100]; - long code; - - lock_ObtainWrite(&cm_volumeLock); - for(volp = cm_data.allVolumesp; volp; volp=volp->nextp) { - if (cellp == volp->cellp && - ((unsigned) volumeID == volp->rwID || - (unsigned) volumeID == volp->roID || - (unsigned) volumeID == volp->bkID)) - break; - } - - /* hold the volume if we found it */ - if (volp) - volp->refCount++; - lock_ReleaseWrite(&cm_volumeLock); - - /* return it held */ - if (volp) { - lock_ObtainMutex(&volp->mx); - - if (volp->flags & CM_VOLUMEFLAG_RESET) { - code = cm_UpdateVolume(cellp, userp, reqp, volp); - if (code == 0) { - volp->flags &= ~CM_VOLUMEFLAG_RESET; - } - } - else - code = 0; - lock_ReleaseMutex(&volp->mx); - if (code == 0) - *outVolpp = volp; - return code; - } - - /* otherwise, we didn't find it so consult the VLDB */ - sprintf(volNameString, "%u", volumeID); - code = cm_GetVolumeByName(cellp, volNameString, userp, reqp, - 0, outVolpp); - return code; -} - -long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep, - struct cm_user *userp, struct cm_req *reqp, - long flags, cm_volume_t **outVolpp) -{ - cm_volume_t *volp; - long code; - - /* initialize this */ - code = 0; - - lock_ObtainWrite(&cm_volumeLock); - for (volp = cm_data.allVolumesp; volp; volp=volp->nextp) { - if (cellp == volp->cellp && strcmp(volumeNamep, volp->namep) == 0) { - break; - } - } - - /* otherwise, get from VLDB */ - if (!volp) { - if ( cm_data.currentVolumes >= cm_data.maxVolumes ) { - for (volp = cm_data.allVolumesp; volp; volp=volp->nextp) { - if ( volp->refCount == 0 ) { - /* There is one we can re-use */ - break; - } - } - osi_panic("Exceeded Max Volumes", __FILE__, __LINE__); - } - - if (volp) { - volp->rwID = volp->roID = volp->bkID = 0; - volp->dotdotFid.cell = 0; - volp->dotdotFid.volume = 0; - volp->dotdotFid.unique = 0; - volp->dotdotFid.vnode = 0; - } else { - volp = &cm_data.volumeBaseAddress[cm_data.currentVolumes++]; - memset(volp, 0, sizeof(cm_volume_t)); - volp->magic = CM_VOLUME_MAGIC; - volp->nextp = cm_data.allVolumesp; - cm_data.allVolumesp = volp; - lock_InitializeMutex(&volp->mx, "cm_volume_t mutex"); - } - volp->cellp = cellp; - strncpy(volp->namep, volumeNamep, VL_MAXNAMELEN); - volp->namep[VL_MAXNAMELEN-1] = '\0'; - volp->refCount = 1; /* starts off held */ - volp->flags = CM_VOLUMEFLAG_RESET; - } - else { - volp->refCount++; - } - - /* next should work since no one could have gotten ptr to this structure yet */ - lock_ReleaseWrite(&cm_volumeLock); - lock_ObtainMutex(&volp->mx); - - if (volp->flags & CM_VOLUMEFLAG_RESET) { - code = cm_UpdateVolume(cellp, userp, reqp, volp); - if (code == 0) - volp->flags &= ~CM_VOLUMEFLAG_RESET; - } - - if (code == 0) - *outVolpp = volp; - lock_ReleaseMutex(&volp->mx); - return code; -} - -void cm_ForceUpdateVolume(cm_fid_t *fidp, cm_user_t *userp, cm_req_t *reqp) -{ - cm_cell_t *cellp; - cm_volume_t *volp; - - if (!fidp) return; - - cellp = cm_FindCellByID(fidp->cell); - if (!cellp) return; - - /* search for the volume */ - lock_ObtainWrite(&cm_volumeLock); - for(volp = cm_data.allVolumesp; volp; volp=volp->nextp) { - if (cellp == volp->cellp && - (fidp->volume == volp->rwID || - fidp->volume == volp->roID || - fidp->volume == volp->bkID)) - break; - } - - /* hold the volume if we found it */ - if (volp) volp->refCount++; - lock_ReleaseWrite(&cm_volumeLock); - - /* update it */ - cm_data.mountRootGen = time(NULL); - lock_ObtainMutex(&volp->mx); - volp->flags |= CM_VOLUMEFLAG_RESET; -#ifdef COMMENT - /* Mark the volume to be updated but don't update it now. - * This function is called only from within cm_Analyze - * when cm_ConnByMServers has failed with all servers down - * The problem is that cm_UpdateVolume is going to call - * cm_ConnByMServers which may cause a recursive chain - * of calls each returning a retry on failure. - * Instead, set the flag so the next time the volume is - * accessed by Name or ID the UpdateVolume call will - * occur. - */ - code = cm_UpdateVolume(cellp, userp, reqp, volp); - if (code == 0) - volp->flags &= ~CM_VOLUMEFLAG_RESET; -#endif - lock_ReleaseMutex(&volp->mx); - - cm_PutVolume(volp); -} - -/* find the appropriate servers from a volume */ -cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, unsigned long volume) -{ - cm_serverRef_t **serverspp; - cm_serverRef_t *current;; - - lock_ObtainWrite(&cm_serverLock); - - if (volume == volp->rwID) - serverspp = &volp->rwServersp; - else if (volume == volp->roID) - serverspp = &volp->roServersp; - else if (volume == volp->bkID) - serverspp = &volp->bkServersp; - else - osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__); - - for (current = *serverspp; current; current = current->next) - current->refCount++; - - lock_ReleaseWrite(&cm_serverLock); - - return serverspp; -} - -void cm_PutVolume(cm_volume_t *volp) -{ - lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); - lock_ReleaseWrite(&cm_volumeLock); -} - -/* return the read-only volume, if there is one, or the read-write volume if - * not. - */ -long cm_GetROVolumeID(cm_volume_t *volp) -{ - long id; - - lock_ObtainMutex(&volp->mx); - if (volp->roID && volp->roServersp) - id = volp->roID; - else - id = volp->rwID; - lock_ReleaseMutex(&volp->mx); - - return id; -} - -void cm_CheckVolumes(void) -{ - cm_volume_t *volp; - - cm_data.mountRootGen = time(NULL); - lock_ObtainWrite(&cm_volumeLock); - for (volp = cm_data.allVolumesp; volp; volp=volp->nextp) { - volp->refCount++; - lock_ReleaseWrite(&cm_volumeLock); - lock_ObtainMutex(&volp->mx); - - volp->flags |= CM_VOLUMEFLAG_RESET; - - lock_ReleaseMutex(&volp->mx); - lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); - } - lock_ReleaseWrite(&cm_volumeLock); - - /* We should also refresh cached mount points */ -} - -/* -** Finds all volumes that reside on this server and reorders their -** RO list according to the changed rank of server. -*/ -void cm_ChangeRankVolume(cm_server_t *tsp) -{ - int code; - cm_volume_t* volp; - - /* find volumes which might have RO copy on server*/ - lock_ObtainWrite(&cm_volumeLock); - for(volp = cm_data.allVolumesp; volp; volp=volp->nextp) - { - code = 1 ; /* assume that list is unchanged */ - volp->refCount++; - lock_ReleaseWrite(&cm_volumeLock); - lock_ObtainMutex(&volp->mx); - - if ((tsp->cellp==volp->cellp) && (volp->roServersp)) - code =cm_ChangeRankServer(&volp->roServersp, tsp); - - /* this volume list was changed */ - if ( !code ) - cm_RandomizeServer(&volp->roServersp); - - lock_ReleaseMutex(&volp->mx); - lock_ObtainWrite(&cm_volumeLock); - osi_assert(volp->refCount-- > 0); - } - lock_ReleaseWrite(&cm_volumeLock); -} diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h deleted file mode 100644 index 848f4be74..000000000 --- a/src/WINNT/afsd/cm_volume.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __CM_VOLUME_H_ENV__ -#define __CM_VOLUME_H_ENV__ 1 - -#define VL_MAXNAMELEN 65 - -#define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24) - -typedef struct cm_volume { - afs_uint32 magic; - cm_cell_t *cellp; /* never changes */ - char namep[VL_MAXNAMELEN]; /* by cm_volumeLock */ - unsigned long rwID; /* by cm_volumeLock */ - unsigned long roID; /* by cm_volumeLock */ - unsigned long bkID; /* by cm_volumeLock */ - struct cm_volume *nextp; /* by cm_volumeLock */ - struct cm_fid dotdotFid; /* parent of volume root */ - osi_mutex_t mx; - long flags; /* by mx */ - unsigned long refCount; /* by cm_volumeLock */ - cm_serverRef_t *rwServersp; /* by mx */ - cm_serverRef_t *roServersp; /* by mx */ - cm_serverRef_t *bkServersp; /* by mx */ -} cm_volume_t; - -#define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */ - -extern void cm_InitVolume(int newFile, long maxVols); - -extern long cm_GetVolumeByName(struct cm_cell *, char *, struct cm_user *, - struct cm_req *, long, cm_volume_t **); - -extern void cm_PutVolume(cm_volume_t *volp); - -extern long cm_GetROVolumeID(cm_volume_t *volp); - -extern long cm_GetVolumeByID(struct cm_cell *cellp, long volumeID, - cm_user_t *userp, cm_req_t *reqp, cm_volume_t **outVolpp); - -extern void cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp, - cm_req_t *reqp); - -extern cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, unsigned long volume); - -extern void cm_ChangeRankVolume(cm_server_t *tsp); - -extern void cm_CheckVolumes(void); - -extern long cm_ValidateVolume(void); - -extern long cm_ShutdownVolume(void); -#endif /* __CM_VOLUME_H_ENV__ */ diff --git a/src/WINNT/afsd/cmdebug.c b/src/WINNT/afsd/cmdebug.c deleted file mode 100644 index b31f5fd1c..000000000 --- a/src/WINNT/afsd/cmdebug.c +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -RCSID - ("$Header: /cvs/openafs/src/WINNT/afsd/cmdebug.c,v 1.1.2.1 2005/03/11 07:22:40 shadow Exp $"); - - -#include -#ifdef AFS_NT40_ENV -#include -#include -#else -#ifdef HAVE_NETINET_IN_H -#include -#endif -#include -#include -#endif -#include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef AFS_AIX32_ENV -#include -#endif -#include -#include -#include -#include -#include - -extern struct hostent *hostutil_GetHostByName(); - -static int -PrintCacheConfig(struct rx_connection *aconn) -{ - struct cacheConfig c; - afs_uint32 srv_ver, conflen; - int code; - - c.cacheConfig_len = 0; - c.cacheConfig_val = NULL; - code = RXAFSCB_GetCacheConfig(aconn, 1, &srv_ver, &conflen, &c); - if (code) { - printf("cmdebug: error checking cache config: %s\n", - error_message(code)); - return 0; - } - - if (srv_ver == AFS_CLIENT_RETRIEVAL_FIRST_EDITION) { - struct cm_initparams_v1 *c1; - - if (c.cacheConfig_len != sizeof(*c1) / sizeof(afs_uint32)) { - printf("cmdebug: configuration data size mismatch (%d != %d)\n", - c.cacheConfig_len, sizeof(*c1) / sizeof(afs_uint32)); - return 0; - } - - c1 = (struct cm_initparams_v1 *)c.cacheConfig_val; - printf("Chunk files: %d\n", c1->nChunkFiles); - printf("Stat caches: %d\n", c1->nStatCaches); - printf("Data caches: %d\n", c1->nDataCaches); - printf("Volume caches: %d\n", c1->nVolumeCaches); - printf("Chunk size: %d", c1->otherChunkSize); - if (c1->firstChunkSize != c1->otherChunkSize) - printf(" (first: %d)", c1->firstChunkSize); - printf("\n"); - printf("Cache size: %d kB\n", c1->cacheSize); - printf("Set time: %s\n", c1->setTime ? "yes" : "no"); - printf("Cache type: %s\n", c1->memCache ? "memory" : "disk"); - } else { - printf("cmdebug: unsupported server version %d\n", srv_ver); - } -} - -static int -PrintInterfaces(struct rx_connection *aconn) -{ - struct interfaceAddr addr; - char * p; - int i, code; - - code = RXAFSCB_WhoAreYou(aconn, &addr); - if (code) { - printf("cmdebug: error checking interfaces: %s\n", - error_message(code)); - return 0; - } - - UuidToString((UUID *)&addr.uuid, &p); - printf("UUID: %s\n",p); - RpcStringFree(&p); - - printf("Host interfaces:\n"); - for (i = 0; i < addr.numberOfInterfaces; i++) { - printf("%s", afs_inet_ntoa(htonl(addr.addr_in[i]))); - if (addr.subnetmask[i]) - printf(", netmask %s", afs_inet_ntoa(htonl(addr.subnetmask[i]))); - if (addr.mtu[i]) - printf(", MTU %d", addr.mtu[i]); - printf("\n"); - } - - return 0; -} - -static int -IsLocked(register struct AFSDBLockDesc *alock) -{ - if (alock->waitStates || alock->exclLocked || alock->numWaiting - || alock->readersReading) - return 1; - return 0; -} - -static int -PrintLock(register struct AFSDBLockDesc *alock) -{ - printf("("); - if (alock->waitStates) { - if (alock->waitStates & READ_LOCK) - printf("reader_waiting"); - if (alock->waitStates & WRITE_LOCK) - printf("writer_waiting"); - if (alock->waitStates & SHARED_LOCK) - printf("upgrade_waiting"); - } else - printf("none_waiting"); - if (alock->exclLocked) { - if (alock->exclLocked & WRITE_LOCK) - printf(", write_locked"); - if (alock->exclLocked & SHARED_LOCK) - printf(", upgrade_locked"); - printf("(pid:%d at:%d)", alock->pid_writer, alock->src_indicator); - } - if (alock->readersReading) - printf(", %d read_locks(pid:%d)", alock->readersReading, - alock->pid_last_reader); - if (alock->numWaiting) - printf(", %d waiters", alock->numWaiting); - printf(")"); - return 0; -} - -static int -PrintLocks(register struct rx_connection *aconn, int aint32) -{ - register int i; - struct AFSDBLock lock; - afs_int32 code; - - for (i = 0; i < 1000; i++) { - code = RXAFSCB_GetLock(aconn, i, &lock); - if (code) { - if (code == 1) - break; - /* otherwise we have an unrecognized error */ - printf("cmdebug: error checking locks: %s\n", - error_message(code)); - return code; - } - /* here we have the lock information, so display it, perhaps */ - if (aint32 || IsLocked(&lock.lock)) { - printf("Lock %s status: ", lock.name); - PrintLock(&lock.lock); - printf("\n"); - } - } - return 0; -} - -struct cell_cache { - afs_int32 cellnum; - char *cellname; - struct cell_cache *next; -}; - -static char * -GetCellName(struct rx_connection *aconn, afs_int32 cellnum) -{ - static int no_getcellbynum; - static struct cell_cache *cache; - struct cell_cache *tcp; - int code; - char *cellname; - serverList sl; - - if (no_getcellbynum) - return NULL; - - for (tcp = cache; tcp; tcp = tcp->next) - if (tcp->cellnum == cellnum) - return tcp->cellname; - - cellname = NULL; - sl.serverList_len = 0; - sl.serverList_val = NULL; - code = RXAFSCB_GetCellByNum(aconn, cellnum, &cellname, &sl); - if (code) { - if (code == RXGEN_OPCODE) - no_getcellbynum = 1; - return NULL; - } - - if (sl.serverList_val) - free(sl.serverList_val); - tcp = malloc(sizeof(struct cell_cache)); - tcp->next = cache; - tcp->cellnum = cellnum; - tcp->cellname = cellname; - cache = tcp; - - return cellname; -} - -static int -PrintCacheEntries32(struct rx_connection *aconn, int aint32) -{ - register int i; - register afs_int32 code; - struct AFSDBCacheEntry centry; - char *cellname; - - for (i = 0; i < 10000; i++) { - code = RXAFSCB_GetCE(aconn, i, ¢ry); - if (code) { - if (code == 1) - break; - printf("cmdebug: failed to get cache entry %d (%s)\n", i, - error_message(code)); - return code; - } - - if (centry.addr == 0) { - /* PS output */ - printf("Proc %4d sleeping at %08x, pri %3d\n", - centry.netFid.Vnode, centry.netFid.Volume, - centry.netFid.Unique - 25); - continue; - } - - if (aint32 == 0 && !IsLocked(¢ry.lock) || - aint32 == 2 && centry.refCount == 0 || - aint32 == 4 && centry.callback == 0) - continue; - - /* otherwise print this entry */ - printf("** Cache entry @ 0x%08x for %d.%d.%d.%d", centry.addr, - centry.cell, centry.netFid.Volume, centry.netFid.Vnode, - centry.netFid.Unique); - - cellname = GetCellName(aconn, centry.cell); - if (cellname) - printf(" [%s]\n", cellname); - else - printf("\n"); - - if (IsLocked(¢ry.lock)) { - printf(" locks: "); - PrintLock(¢ry.lock); - printf("\n"); - } - printf(" %012d bytes DV %012d refcnt %05d\n", centry.Length, - centry.DataVersion, centry.refCount); - printf(" callback %08x\texpires %u\n", centry.callback, - centry.cbExpires); - printf(" %d opens\t%d writers\n", centry.opens, centry.writers); - - /* now display states */ - printf(" "); - if (centry.mvstat == 0) - printf("normal file"); - else if (centry.mvstat == 1) - printf("mount point"); - else if (centry.mvstat == 2) - printf("volume root"); - else if (centry.mvstat == 3) - printf("directory"); - else if (centry.mvstat == 4) - printf("symlink"); - else if (centry.mvstat == 5) - printf("microsoft dfs link"); - else if (centry.mvstat == 6) - printf("invalid link"); - else - printf("bogus mvstat %d", centry.mvstat); - printf("\n states (0x%x)", centry.states); - if (centry.states & 1) - printf(", stat'd"); - if (centry.states & 2) - printf(", backup"); - if (centry.states & 4) - printf(", read-only"); - if (centry.states & 8) - printf(", mt pt valid"); - if (centry.states & 0x10) - printf(", pending core"); - if (centry.states & 0x40) - printf(", wait-for-store"); - if (centry.states & 0x80) - printf(", mapped"); - printf("\n"); - } - return 0; -} - -static int -PrintCacheEntries64(struct rx_connection *aconn, int aint32) -{ - register int i; - register afs_int32 code; - struct AFSDBCacheEntry64 centry; - char *cellname; - int ce64 = 0; - - for (i = 0; i < 10000; i++) { - code = RXAFSCB_GetCE64(aconn, i, ¢ry); - if (code) { - if (code == 1) - break; - printf("cmdebug: failed to get cache entry %d (%s)\n", i, - error_message(code)); - return code; - } - - if (centry.addr == 0) { - /* PS output */ - printf("Proc %4d sleeping at %08x, pri %3d\n", - centry.netFid.Vnode, centry.netFid.Volume, - centry.netFid.Unique - 25); - continue; - } - - if (aint32 == 0 && !IsLocked(¢ry.lock) || - aint32 == 2 && centry.refCount == 0 || - aint32 == 4 && centry.callback == 0) - continue; - - /* otherwise print this entry */ - printf("** Cache entry @ 0x%08x for %d.%d.%d.%d", centry.addr, - centry.cell, centry.netFid.Volume, centry.netFid.Vnode, - centry.netFid.Unique); - - cellname = GetCellName(aconn, centry.cell); - if (cellname) - printf(" [%s]\n", cellname); - else - printf("\n"); - - if (IsLocked(¢ry.lock)) { - printf(" locks: "); - PrintLock(¢ry.lock); - printf("\n"); - } -#ifdef AFS_64BIT_ENV - printf(" %012I64d bytes DV %012d refcnt %05d\n", centry.Length, - centry.DataVersion, centry.refCount); -#else - printf(" %012d bytes DV %012d refcnt %05d\n", centry.Length, - centry.DataVersion, centry.refCount); -#endif - printf(" callback %08x\texpires %u\n", centry.callback, - centry.cbExpires); - printf(" %d opens\t%d writers\n", centry.opens, centry.writers); - - /* now display states */ - printf(" "); - if (centry.mvstat == 0) - printf("normal file"); - else if (centry.mvstat == 1) - printf("mount point"); - else if (centry.mvstat == 2) - printf("volume root"); - else if (centry.mvstat == 3) - printf("directory"); - else if (centry.mvstat == 4) - printf("symlink"); - else if (centry.mvstat == 5) - printf("microsoft dfs link"); - else if (centry.mvstat == 6) - printf("invalid link"); - else - printf("bogus mvstat %d", centry.mvstat); - printf("\n states (0x%x)", centry.states); - if (centry.states & 1) - printf(", stat'd"); - if (centry.states & 2) - printf(", backup"); - if (centry.states & 4) - printf(", read-only"); - if (centry.states & 8) - printf(", mt pt valid"); - if (centry.states & 0x10) - printf(", pending core"); - if (centry.states & 0x40) - printf(", wait-for-store"); - if (centry.states & 0x80) - printf(", mapped"); - printf("\n"); - } - return 0; -} - -static int -PrintCacheEntries(struct rx_connection *aconn, int aint32) -{ - register afs_int32 code; - struct AFSDBCacheEntry64 centry64; - - code = RXAFSCB_GetCE64(aconn, 0, ¢ry64); - if (code != RXGEN_OPCODE) - return PrintCacheEntries64(aconn, aint32); - else - return PrintCacheEntries32(aconn, aint32); -} - -static int -CommandProc(struct cmd_syndesc *as) -{ - struct rx_connection *conn; - register char *hostName; - register struct hostent *thp; - afs_int32 port; - struct rx_securityClass *secobj; - int int32p; - afs_int32 addr; - - hostName = as->parms[0].items->data; - if (as->parms[1].items) - port = atoi(as->parms[1].items->data); - else - port = 7001; - thp = hostutil_GetHostByName(hostName); - if (!thp) { - printf("cmdebug: can't resolve address for host %s.\n", hostName); - exit(1); - } - memcpy(&addr, thp->h_addr, sizeof(afs_int32)); - secobj = rxnull_NewServerSecurityObject(); - conn = rx_NewConnection(addr, htons(port), 1, secobj, 0); - if (!conn) { - printf("cmdebug: failed to create connection for host %s\n", - hostName); - exit(1); - } - if (as->parms[5].items) { - /* -addrs */ - PrintInterfaces(conn); - return 0; - } - if (as->parms[6].items) { - /* -cache */ - PrintCacheConfig(conn); - return 0; - } - if (as->parms[2].items) - /* -long */ - int32p = 1; - else if (as->parms[3].items) - /* -refcounts */ - int32p = 2; - else if (as->parms[4].items) - /* -callbacks */ - int32p = 4; - else - int32p = 0; - - if (int32p == 0 || int32p == 1) - PrintLocks(conn, int32p); - if (int32p >= 0 || int32p <= 4) - PrintCacheEntries(conn, int32p); - return 0; -} - -#ifndef AFS_NT40_ENV -#include "AFS_component_version_number.c" -#endif - -int -main(int argc, char **argv) -{ - register struct cmd_syndesc *ts; - -#ifdef AFS_AIX32_ENV - /* - * The following signal action for AIX is necessary so that in case of a - * crash (i.e. core is generated) we can include the user's data section - * in the core dump. Unfortunately, by default, only a partial core is - * generated which, in many cases, isn't too useful. - */ - struct sigaction nsa; - - sigemptyset(&nsa.sa_mask); - nsa.sa_handler = SIG_DFL; - nsa.sa_flags = SA_FULLDUMP; - sigaction(SIGSEGV, &nsa, NULL); -#endif - -#ifdef AFS_NT40_ENV - if (afs_winsockInit() < 0) { - printf("%s: Couldn't initialize winsock. Exiting...\n", argv[0]); - return 1; - } -#endif - - rx_Init(0); - - ts = cmd_CreateSyntax(NULL, CommandProc, 0, "probe unik server"); - cmd_AddParm(ts, "-servers", CMD_SINGLE, CMD_REQUIRED, "server machine"); - cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "IP port"); - cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print all info"); - cmd_AddParm(ts, "-refcounts", CMD_FLAG, CMD_OPTIONAL, - "print only cache entries with positive reference counts"); - cmd_AddParm(ts, "-callbacks", CMD_FLAG, CMD_OPTIONAL, - "print only cache entries with callbacks"); - cmd_AddParm(ts, "-addrs", CMD_FLAG, CMD_OPTIONAL, - "print only host interfaces"); - cmd_AddParm(ts, "-cache", CMD_FLAG, CMD_OPTIONAL, - "print only cache configuration"); - - cmd_Dispatch(argc, argv); - exit(0); -} diff --git a/src/WINNT/afsd/cmdebug.rc b/src/WINNT/afsd/cmdebug.rc deleted file mode 100644 index 41540111b..000000000 --- a/src/WINNT/afsd/cmdebug.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Cache Manager Debug Command" -#define AFS_VERINFO_NAME "cmdebug" -#define AFS_VERINFO_FILENAME "cmdebug.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/ctokens.c b/src/WINNT/afsd/ctokens.c deleted file mode 100644 index 5d74150fd..000000000 --- a/src/WINNT/afsd/ctokens.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -main(argc, argv) - int argc; - char **argv; -{ - int cellNum; - int rc; - int current_time; - int tokenExpireTime; - char *expireString; - char userName[100]; - struct ktc_principal serviceName, clientName; - struct ktc_token token; - WSADATA WSAjunk; - - WSAStartup(0x0101, &WSAjunk); - if (argc > 1) { - printf("%s [-help]\n", argv[0]); - return 0; - } - - printf("\nTokens held by the Cache Manager:\n\n"); - cellNum = 0; - current_time = time((void *) 0); - - while (1) { - rc = ktc_ListTokens(cellNum, &cellNum, &serviceName); - if (rc == KTC_NOENT) { - /* end of list */ - printf(" --End of list --\n"); - break; - } - else if (rc == KTC_NOCM) { - printf("AFS device may not have started\n"); - break; - } - else if (rc) { - printf("Unexpected error, code %d\n", rc); - exit(1); - } - else { - rc = ktc_GetToken(&serviceName, &token, sizeof(token), - &clientName); - if (rc) { - printf("Unexpected error, service %s.%s.%s, code %d\n", - serviceName.name, serviceName.instance, - serviceName.cell, rc); - continue; - } - tokenExpireTime = token.endTime; - strcpy(userName, clientName.name); - if (clientName.instance[0] != 0) { - strcat(userName, "."); - strcat(userName, clientName.instance); - } - if (userName[0] == '\0') - printf("Tokens"); - else if (strncmp(userName, "AFS ID", 6) == 0) - printf("User's (%s) tokens", userName); - else if (strncmp(userName, "Unix UID", 8) == 0) - printf("Tokens"); - else - printf("User %s's tokens", userName); - printf(" for %s%s%s@%s ", - serviceName.name, - serviceName.instance[0] ? "." : "", - serviceName.instance, - serviceName.cell); - if (tokenExpireTime <= current_time) - printf("[>> Expired <<]\n"); - else { - time_t t = tokenExpireTime; - expireString = ctime(&t); - expireString += 4; /* Skip day of week */ - expireString[12] = '\0'; /* Omit secs & year */ - printf("[Expires %s]\n", expireString); - } - } - } - return(0); -} diff --git a/src/WINNT/afsd/cunlog.c b/src/WINNT/afsd/cunlog.c deleted file mode 100644 index fb4018443..000000000 --- a/src/WINNT/afsd/cunlog.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include "cmd.h" -#include -#include - -CommandProc (as, arock) - char *arock; - struct cmd_syndesc *as; -{ - afs_int32 code, ecode=0; - struct ktc_principal server; - struct cmd_item *itp; - - if (as->parms[0].items) { /* A cell is provided */ - for (itp=as->parms[0].items; itp; itp = itp->next) { - strcpy(server.cell, itp->data); - server.instance[0] = '\0'; - strcpy(server.name, "afs"); - code = ktc_ForgetToken(&server); - if (code) { - printf("unlog: could not discard tickets for cell %s, code %d\n", - itp->data, code); - ecode = code; /* return last error */ - } - } - } else { - ecode = ktc_ForgetAllTokens (); - if (ecode) - printf("unlog: could not discard tickets, code %d\n", ecode); - } - return ecode; -} - - -main(argc, argv) - int argc; - char *argv[]; - -{ - struct cmd_syndesc *ts; - afs_int32 code; - WSADATA WSAjunk; - - WSAStartup(0x0101, &WSAjunk); - - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "Release Kerberos authentication"); - cmd_AddParm(ts, "-cell", CMD_LIST, CMD_OPTIONAL, "cell name"); - - code = cmd_Dispatch(argc, argv); - return (code); -} diff --git a/src/WINNT/afsd/dosdefs95.h b/src/WINNT/afsd/dosdefs95.h deleted file mode 100644 index 5c14377d5..000000000 --- a/src/WINNT/afsd/dosdefs95.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef DOSDEFS_H -#define DOSDEFS_H - -/* dos_ptr is the phys. addr. accepted by farpeek/farpoke functions, i.e., - dos_ptr = segment * 16 + offset */ -#define dos_ptr unsigned long - -/* get/set structure member of a struct in DOS memory */ -#define get_dos_member_b(T, ptr, memb) _farpeekb(_dos_ds, (ptr) + (dos_ptr)&(((T*)0)->memb)) -#define get_dos_member_w(T, ptr, memb) _farpeekw(_dos_ds, (ptr) + (dos_ptr)&(((T*)0)->memb)) -#define get_dos_member_l(T, ptr, memb) _farpeekl(_dos_ds, (ptr) + (dos_ptr)&(((T*)0)->memb)) - -#define set_dos_member_b(T, ptr, memb, val) \ - _farpokeb(_dos_ds, (ptr) + (dos_ptr)&(((T*)0)->memb), val) -#define set_dos_member_w(T, ptr, memb, val) \ - _farpokew(_dos_ds, (ptr) + (dos_ptr)&(((T*)0)->memb), val) -#define set_dos_member_l(T, ptr, memb, val) \ - _farpokel(_dos_ds, (ptr) + (dos_ptr)&(((T*)0)->memb), val) - -typedef struct _filetime -{ - unsigned int dwLowDateTime; - unsigned int dwHighDateTime; -} FILETIME; - -#define FILE_ACTION_ADDED 0x00000001 -#define FILE_ACTION_REMOVED 0x00000002 -#define FILE_ACTION_MODIFIED 0x00000003 -#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 -#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 - -#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 -#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 -#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 -#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 -#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 -#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020 -#define FILE_NOTIFY_CHANGE_CREATION 0x00000040 -#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 - -#define ULONG unsigned long -#define USHORT unsigned short -#define WCHAR wchar_t - -#define GetTickCount gettime_ms -#define GetCurrentTime gettime_ms - -#define lstrcpy strcpy -#define strcmpi stricmp -#define lstrlen strlen -#define _stricmp stricmp -#define _strlwr strlwr -#define _strupr strupr - -#endif diff --git a/src/WINNT/afsd/dosutils95.c b/src/WINNT/afsd/dosutils95.c deleted file mode 100644 index 298491695..000000000 --- a/src/WINNT/afsd/dosutils95.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* functions for DJGPP to write to DOS memory or duplicate Win32 functions. */ - -#include -#include -#include -#include -#include "dosdefs95.h" - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - -dos_memset(dos_ptr offset, int val, int size) -{ - int i; - - for (i = 0; i < size; i++) - { - _farpokeb(_dos_ds, offset++, val); - } -} - -char *dos_strcpy_get(char *str, unsigned int offset) -{ - register char a; - - while ((a = _farpeekb(_dos_ds, offset++)) != 0) - *str++ = a; - *str = 0; - - return str; -} - -char *dos_strncpy_get(char *str, unsigned int offset, int len) -{ - register char a; - register int n=0; - - while ((a = _farpeekb(_dos_ds, offset++)) != 0 && n++ < len) - *str++ = a; - *str = 0; - - return str; -} - -dos_ptr dos_strcpy_put(dos_ptr offset, char *str) -{ - char a; - - while ((a = *str++) != 0) - _farpokeb(_dos_ds, offset++, a); - _farpokeb(_dos_ds, offset, 0); - - return offset; -} - -dos_ptr dos_strncpy_put(dos_ptr offset, char *str, int len) -{ - register char a; - register int n=0; - - while ((a = *str++) != 0 && n++ < len) - _farpokeb(_dos_ds, offset++, a); - _farpokeb(_dos_ds, offset, 0); - - return offset; -} - -dos_ptr dos_strrchr(dos_ptr offset, char c) -{ - dos_ptr temp = 0; - char a; - - while ((a = _farpeekb(_dos_ds, offset++)) != 0) - { - if (a == c) temp = offset-1; - } - - return temp; -} - -int dos_strcmp(unsigned char *str, dos_ptr offset) -{ - register unsigned char a, b; - - while (((a = *str++) == (b = _farpeekb(_dos_ds, offset++))) && a && b); - return a-b; -} - -int dos_strncmp(unsigned char *str, dos_ptr offset, int len) -{ - register unsigned char a, b; - register int i=0; - - while (i++ < len && ((a = *str++) == (b = _farpeekb(_dos_ds, offset++))) && a && b); - return a-b; -} - -int dos_strlen(dos_ptr offset) -{ - int len=0; - - while (_farpeekb(_dos_ds, offset++)) - len++; - - return len; -} - - -int sub_time(struct timeval a, struct timeval b) -{ - int n = a.tv_sec - b.tv_sec; - n *= 1000000; - n += a.tv_usec - b.tv_usec; - return n / 1000; -} - -int tm_to_ms(struct timeval t) -{ - int n = t.tv_sec * 1000; - n += t.tv_usec / 1000; - return n; -} - -int gettime_ms() -{ - struct timeval t; - int n = t.tv_sec * 1000; - - gettimeofday(&t, NULL); - n += t.tv_usec / 1000; - return n; -} - -int gettime_us() -{ - struct timeval t; - int n; - - gettimeofday(&t, NULL); - n = t.tv_sec * 1000000; - n += t.tv_usec; - return n; -} - -int GetPrivateProfileString(char *sect, char *key, char *def, - char *buf, int len, char *file) -{ - char s[256]; - char skey[128]; - int nchars=0; - int amt; - int offset; - char sectstr[256]; - char *p; - FILE *f = fopen(file, "r"); - if (!f) return 0; - - sprintf(sectstr, "[%s]", sect); - while (1) - { - fgets(s, 256, f); - if (feof(f)) break; - - /* look for section names */ - if (s[0] != '[') - continue; - - /* if sect is NULL, copy all section names */ - if (!sect) - { - amt = MIN(strlen(s)+1, len-1); - strncpy(buf, s, amt-1); - buf[amt] = 0; - len -= amt; - buf += amt; - nchars += amt; - continue; - } - - /* continue if non-matching section name */ - if (sect && strnicmp(s+1, sect, strlen(sect)) != 0) - continue; - - /* else we have the correct section */ - - while (len > 0) - { - fgets(s, 256, f); - if (feof(f)) break; - - /* get the key part */ - strcpy(skey, s); - p = strrchr(skey, '='); - if (!p) { fclose(f); return 0; } - *p = 0; - - /* continue if key doesn't match */ - if (key && stricmp(skey, key) != 0) - continue; - - /* if NULL key, copy key names */ - if (!key) - { - amt = MIN(strlen(skey)+1, len-2); - strncpy(buf, skey, amt); - buf[amt] = 0; - buf[amt+1] = 0; /* final trailing NULL */ - len -= amt; - buf += amt; - nchars += amt; - continue; - } - - /* discard key= and newline */ - offset = strlen(key) + 1; - amt = MIN(strlen(s+offset)-1, len-1); - strncpy(buf, s+offset, amt); - buf[amt] = 0; - len -= amt; - buf += amt; - nchars += amt; - } - } - - if (nchars == 0) - { - if (def) - { - strcpy(buf, def); - nchars = strlen(def); - } - } - - fclose(f); - return nchars; -} - -int WritePrivateProfileString(char *sect, char *key, char *str, char *file) -{ - char tmpfile[256], s[256], sectstr[256]; - int found = 0; - char *p; - FILE *fr = fopen(file, "r"); - FILE *fw = fopen(tmpfile, "w"); - - strcpy(tmpfile, file); - p = strrchr(tmpfile, '.'); - *p = 0; - strcat(tmpfile, ".tmp"); /* change extension to .tmp */ - - sprintf(sectstr, "[%s]", sect); - while (1) - { - fgets(s, 256, fr); - if (feof(fr)) break; - - fputs(s, fw); - - /* look for section names */ - if (found || s[0] != '[') - { - continue; - } - - if (stricmp(s, sectstr) == 0) - { - /* found section, print new item */ - found = 1; - strcpy(s, key); - strcat(s, "="); - strcat(s, str); - strcat(s, "\n"); - fputs(s, fw); - } - } - fclose(fw); - fclose(fr); - - /* delete old file */ - remove(file); - - /* rename .tmp */ - rename(tmpfile, file); - - return found; -} diff --git a/src/WINNT/afsd/fs.c b/src/WINNT/afsd/fs.c deleted file mode 100644 index ffdbe1ffa..000000000 --- a/src/WINNT/afsd/fs.c +++ /dev/null @@ -1,4419 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "fs.h" -#include "fs_utils.h" -#include "cmd.h" -#include "afsd.h" -#include "cm_ioctl.h" - -#define MAXHOSTS 13 -#define OMAXHOSTS 8 -#define MAXCELLHOSTS 8 -#define MAXNAME 100 -#define MAXSIZE 2048 -#define MAXINSIZE 1300 /* pioctl complains if data is larger than this */ -#define VMSGSIZE 128 /* size of msg buf in volume hdr */ -#define MAXCELLCHARS 64 -#define MAXHOSTCHARS 64 - -static char space[MAXSIZE]; -static char tspace[1024]; - -#ifndef WIN32 -static struct ubik_client *uclient; -#endif /* not WIN32 */ - -static int GetClientAddrsCmd(struct cmd_syndesc *asp, char *arock); -static int SetClientAddrsCmd(struct cmd_syndesc *asp, char *arock); -static int FlushMountCmd(struct cmd_syndesc *asp, char *arock); -static int RxStatProcCmd(struct cmd_syndesc *asp, char *arock); -static int RxStatPeerCmd(struct cmd_syndesc *asp, char *arock); - -extern struct cmd_syndesc *cmd_CreateSyntax(); - -static int MemDumpCmd(struct cmd_syndesc *asp, char *arock); -static int CSCPolicyCmd(struct cmd_syndesc *asp, char *arock); - -extern afs_int32 VL_GetEntryByNameO(); - -static char pn[] = "fs"; -static int rxInitDone = 0; - -struct afsconf_cell { - char name[MAXCELLCHARS]; - short numServers; - short flags; - struct sockaddr_in hostAddr[MAXCELLHOSTS]; - char hostName[MAXCELLHOSTS][MAXHOSTCHARS]; - char *linkedCell; -}; - - -/* - * Character to use between name and rights in printed representation for - * DFS ACL's. - */ -#define DFS_SEPARATOR ' ' - -typedef char sec_rgy_name_t[1025]; /* A DCE definition */ - -struct Acl { - int dfs; /* Originally true if a dfs acl; now also the type - * of the acl (1, 2, or 3, corresponding to object, - * initial dir, or initial object). */ - sec_rgy_name_t cell; /* DFS cell name */ - int nplus; - int nminus; - struct AclEntry *pluslist; - struct AclEntry *minuslist; -}; - -struct AclEntry { - struct AclEntry *next; - char name[MAXNAME]; - afs_int32 rights; -}; - -static void -ZapAcl (struct Acl *acl) -{ - if (!acl) - return; - - ZapList(acl->pluslist); - ZapList(acl->minuslist); - free(acl); -} - -/* - * Mods for the AFS/DFS protocol translator. - * - * DFS rights. It's ugly to put these definitions here, but they - * *cannot* change, because they're part of the wire protocol. - * In any event, the protocol translator will guarantee these - * assignments for AFS cache managers. - */ -#define DFS_READ 0x01 -#define DFS_WRITE 0x02 -#define DFS_EXECUTE 0x04 -#define DFS_CONTROL 0x08 -#define DFS_INSERT 0x10 -#define DFS_DELETE 0x20 - -/* the application definable ones (backwards from AFS) */ -#define DFS_USR0 0x80000000 /* "A" bit */ -#define DFS_USR1 0x40000000 /* "B" bit */ -#define DFS_USR2 0x20000000 /* "C" bit */ -#define DFS_USR3 0x10000000 /* "D" bit */ -#define DFS_USR4 0x08000000 /* "E" bit */ -#define DFS_USR5 0x04000000 /* "F" bit */ -#define DFS_USR6 0x02000000 /* "G" bit */ -#define DFS_USR7 0x01000000 /* "H" bit */ -#define DFS_USRALL (DFS_USR0 | DFS_USR1 | DFS_USR2 | DFS_USR3 |\ - DFS_USR4 | DFS_USR5 | DFS_USR6 | DFS_USR7) - -/* - * Offset of -id switch in command structure for various commands. - * The -if switch is the next switch always. - */ -static int parm_setacl_id, parm_copyacl_id, parm_listacl_id; - -/* - * Determine whether either the -id or -if switches are present, and - * return 0, 1 or 2, as appropriate. Abort if both switches are present. - */ -/* int id; Offset of -id switch; -if is next switch */ -static int -getidf(struct cmd_syndesc *as, int id) -{ - int idf = 0; - - if (as->parms[id].items) { - idf |= 1; - } - if (as->parms[id + 1].items) { - idf |= 2; - } - if (idf == 3) { - fprintf(stderr, - "%s: you may specify either -id or -if, but not both switches\n", - pn); - exit(1); - } - return idf; -} - -static int -PRights(afs_int32 arights, int dfs) -{ - if (!dfs) { - if (arights & PRSFS_READ) - printf("r"); - if (arights & PRSFS_LOOKUP) - printf("l"); - if (arights & PRSFS_INSERT) - printf("i"); - if (arights & PRSFS_DELETE) - printf("d"); - if (arights & PRSFS_WRITE) - printf("w"); - if (arights & PRSFS_LOCK) - printf("k"); - if (arights & PRSFS_ADMINISTER) - printf("a"); - if (arights & PRSFS_USR0) - printf("A"); - if (arights & PRSFS_USR1) - printf("B"); - if (arights & PRSFS_USR2) - printf("C"); - if (arights & PRSFS_USR3) - printf("D"); - if (arights & PRSFS_USR4) - printf("E"); - if (arights & PRSFS_USR5) - printf("F"); - if (arights & PRSFS_USR6) - printf("G"); - if (arights & PRSFS_USR7) - printf("H"); - } else { - if (arights & DFS_READ) - printf("r"); - else - printf("-"); - if (arights & DFS_WRITE) - printf("w"); - else - printf("-"); - if (arights & DFS_EXECUTE) - printf("x"); - else - printf("-"); - if (arights & DFS_CONTROL) - printf("c"); - else - printf("-"); - if (arights & DFS_INSERT) - printf("i"); - else - printf("-"); - if (arights & DFS_DELETE) - printf("d"); - else - printf("-"); - if (arights & (DFS_USRALL)) - printf("+"); - if (arights & DFS_USR0) - printf("A"); - if (arights & DFS_USR1) - printf("B"); - if (arights & DFS_USR2) - printf("C"); - if (arights & DFS_USR3) - printf("D"); - if (arights & DFS_USR4) - printf("E"); - if (arights & DFS_USR5) - printf("F"); - if (arights & DFS_USR6) - printf("G"); - if (arights & DFS_USR7) - printf("H"); - } - return 0; -} - -/* this function returns TRUE (1) if the file is in AFS, otherwise false (0) */ -static int -InAFS(char *apath) -{ - struct ViceIoctl blob; - afs_int32 code; - - blob.in_size = 0; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl(apath, VIOC_FILE_CELL_NAME, &blob, 1); - if (code) { - if ((errno == EINVAL) || (errno == ENOENT)) - return 0; - } - return 1; -} - -/* return a static pointer to a buffer */ -static char * -Parent(char *apath) -{ - char *tp; - strcpy(tspace, apath); - tp = strrchr(tspace, '\\'); - if (tp) { - *(tp+1) = 0; /* lv trailing slash so Parent("k:\foo") is "k:\" not "k:" */ - } - else { - fs_ExtractDriveLetter(apath, tspace); - strcat(tspace, "."); - } - return tspace; -} - -enum rtype {add, destroy, deny}; - -static afs_int32 -Convert(char *arights, int dfs, enum rtype *rtypep) -{ - int i, len; - afs_int32 mode; - char tc; - - *rtypep = add; /* add rights, by default */ - - if (dfs) { - if (!strcmp(arights, "null")) { - *rtypep = deny; - return 0; - } - if (!strcmp(arights,"read")) - return DFS_READ | DFS_EXECUTE; - if (!strcmp(arights, "write")) - return DFS_READ | DFS_EXECUTE | DFS_INSERT | DFS_DELETE | - DFS_WRITE; - if (!strcmp(arights, "all")) - return DFS_READ | DFS_EXECUTE | DFS_INSERT | DFS_DELETE | - DFS_WRITE | DFS_CONTROL; - } else { - if (!strcmp(arights,"read")) - return PRSFS_READ | PRSFS_LOOKUP; - if (!strcmp(arights, "write")) - return PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE | - PRSFS_WRITE | PRSFS_LOCK; - if (!strcmp(arights, "mail")) - return PRSFS_INSERT | PRSFS_LOCK | PRSFS_LOOKUP; - if (!strcmp(arights, "all")) - return PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE | - PRSFS_WRITE | PRSFS_LOCK | PRSFS_ADMINISTER; - } - if (!strcmp(arights, "none")) { - *rtypep = destroy; /* Remove entire entry */ - return 0; - } - len = strlen(arights); - mode = 0; - for(i=0;iname, aname)) - return alist; - alist = alist->next; - } - return 0; -} - -/* if no parm specified in a particular slot, set parm to be "." instead */ -static void -SetDotDefault(struct cmd_item **aitemp) -{ - struct cmd_item *ti; - if (*aitemp) - return; /* already has value */ - /* otherwise, allocate an item representing "." */ - ti = (struct cmd_item *) malloc(sizeof(struct cmd_item)); - assert(ti); - ti->next = (struct cmd_item *) 0; - ti->data = (char *) malloc(2); - assert(ti->data); - strcpy(ti->data, "."); - *aitemp = ti; -} - -static void -ChangeList (struct Acl *al, afs_int32 plus, char *aname, afs_int32 arights) -{ - struct AclEntry *tlist; - tlist = (plus ? al->pluslist : al->minuslist); - tlist = FindList (tlist, aname); - if (tlist) { - /* Found the item already in the list. */ - tlist->rights = arights; - if (plus) - al->nplus -= PruneList(&al->pluslist, al->dfs); - else - al->nminus -= PruneList(&al->minuslist, al->dfs); - return; - } - /* Otherwise we make a new item and plug in the new data. */ - tlist = (struct AclEntry *) malloc(sizeof (struct AclEntry)); - assert(tlist); - strcpy(tlist->name, aname); - tlist->rights = arights; - if (plus) { - tlist->next = al->pluslist; - al->pluslist = tlist; - al->nplus++; - if (arights == 0 || arights == -1) - al->nplus -= PruneList(&al->pluslist, al->dfs); - } else { - tlist->next = al->minuslist; - al->minuslist = tlist; - al->nminus++; - if (arights == 0) - al->nminus -= PruneList(&al->minuslist, al->dfs); - } -} - -static void -ZapList (struct AclEntry *alist) -{ - struct AclEntry *tp, *np; - for (tp = alist; tp; tp = np) { - np = tp->next; - free(tp); - } -} - -static int -PruneList (struct AclEntry **ae, int dfs) -{ - struct AclEntry **lp; - struct AclEntry *te, *ne; - afs_int32 ctr; - ctr = 0; - lp = ae; - for(te = *ae;te;te=ne) { - if ((!dfs && te->rights == 0) || te->rights == -1) { - *lp = te->next; - ne = te->next; - free(te); - ctr++; - } else { - ne = te->next; - lp = &te->next; - } - } - return ctr; -} - -static char * -SkipLine (char *astr) -{ - while (*astr !='\n') - astr++; - astr++; - return astr; -} - -/* - * Create an empty acl, taking into account whether the acl pointed - * to by astr is an AFS or DFS acl. Only parse this minimally, so we - * can recover from problems caused by bogus ACL's (in that case, always - * assume that the acl is AFS: for DFS, the user can always resort to - * acl_edit, but for AFS there may be no other way out). - */ -static struct Acl * -EmptyAcl(char *astr) -{ - struct Acl *tp; - int junk; - - tp = (struct Acl *)malloc(sizeof (struct Acl)); - assert(tp); - tp->nplus = tp->nminus = 0; - tp->pluslist = tp->minuslist = 0; - tp->dfs = 0; - sscanf(astr, "%d dfs:%d %s", &junk, &tp->dfs, tp->cell); - return tp; -} - -static struct Acl * -ParseAcl (char *astr) -{ - int nplus, nminus, i, trights; - char tname[MAXNAME]; - struct AclEntry *first, *last, *tl; - struct Acl *ta; - - ta = (struct Acl *) malloc (sizeof (struct Acl)); - assert(ta); - ta->dfs = 0; - sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell); - astr = SkipLine(astr); - sscanf(astr, "%d", &ta->nminus); - astr = SkipLine(astr); - - nplus = ta->nplus; - nminus = ta->nminus; - - last = 0; - first = 0; - for(i=0;iname, tname); - tl->rights = trights; - tl->next = 0; - if (last) - last->next = tl; - last = tl; - } - ta->pluslist = first; - - last = 0; - first = 0; - for(i=0;iname, tname); - tl->rights = trights; - tl->next = 0; - if (last) - last->next = tl; - last = tl; - } - ta->minuslist = first; - - return ta; -} - -static int -PrintStatus(VolumeStatus *status, char *name, char *motd, char *offmsg) -{ - printf("Volume status for vid = %u named %s\n",status->Vid, name); - if (*offmsg != 0) - printf("Current offline message is %s\n",offmsg); - if (*motd != 0) - printf("Current message of the day is %s\n",motd); - printf("Current disk quota is "); - if (status->MaxQuota != 0) - printf("%d\n", status->MaxQuota); - else - printf("unlimited\n"); - printf("Current blocks used are %d\n",status->BlocksInUse); - printf("The partition has %d blocks available out of %d\n\n", - status->PartBlocksAvail, status->PartMaxBlocks); - return 0; -} - -static int -QuickPrintStatus(VolumeStatus *status, char *name) -{ - double QuotaUsed =0.0; - double PartUsed =0.0; - int WARN = 0; - printf("%-25.25s",name); - - if (status->MaxQuota != 0) { - printf("%10d%10d", status->MaxQuota, status->BlocksInUse); - QuotaUsed = ((((double)status->BlocksInUse)/status->MaxQuota) * 100.0); - } else { - printf("no limit%10d", status->BlocksInUse); - } - if (QuotaUsed > 90.0){ - printf(" %5.0f%%<<", QuotaUsed); - WARN = 1; - } else - printf(" %5.0f%% ", QuotaUsed); - PartUsed = (100.0 - ((((double)status->PartBlocksAvail)/status->PartMaxBlocks) * 100.0)); - if (PartUsed > 97.0){ - printf(" %9.0f%%<<", PartUsed); - WARN = 1; - } else - printf(" %9.0f%% ", PartUsed); - if (WARN){ - printf(" <PartMaxBlocks, status->PartMaxBlocks - status->PartBlocksAvail, status->PartBlocksAvail); - - PartUsed = (100.0 - ((((double)status->PartBlocksAvail)/status->PartMaxBlocks) * 100.0)); - if (PartUsed > 90.0){ - printf(" %4.0f%%<<", PartUsed); - WARN = 1; - } else - printf(" %4.0f%% ", PartUsed); - if (WARN){ - printf(" <dfs) - sprintf(dfsstring, " dfs:%d %s", acl->dfs, acl->cell); - else - dfsstring[0] = '\0'; - sprintf(mydata, "%d%s\n%d\n", acl->nplus, dfsstring, acl->nminus); - for (tp = acl->pluslist;tp;tp=tp->next) { - sprintf(tstring, "%s %d\n", tp->name, tp->rights); - strcat(mydata, tstring); - } - for (tp = acl->minuslist;tp;tp=tp->next) { - sprintf(tstring, "%s %d\n", tp->name, tp->rights); - strcat(mydata, tstring); - } - return mydata; -} - -#define AFSCLIENT_ADMIN_GROUPNAME "AFS Client Admins" - -BOOL IsAdmin (void) -{ - static BOOL fAdmin = FALSE; - static BOOL fTested = FALSE; - - if (!fTested) - { - /* Obtain the SID for the AFS client admin group. If the group does - * not exist, then assume we have AFS client admin privileges. - */ - PSID psidAdmin = NULL; - DWORD dwSize, dwSize2; - char pszAdminGroup[ MAX_COMPUTERNAME_LENGTH + sizeof(AFSCLIENT_ADMIN_GROUPNAME) + 2 ]; - char *pszRefDomain = NULL; - SID_NAME_USE snu = SidTypeGroup; - - dwSize = sizeof(pszAdminGroup); - - if (!GetComputerName(pszAdminGroup, &dwSize)) { - /* Can't get computer name. We return false in this case. - Retain fAdmin and fTested. This shouldn't happen.*/ - return FALSE; - } - - dwSize = 0; - dwSize2 = 0; - - strcat(pszAdminGroup,"\\"); - strcat(pszAdminGroup, AFSCLIENT_ADMIN_GROUPNAME); - - LookupAccountName(NULL, pszAdminGroup, NULL, &dwSize, NULL, &dwSize2, &snu); - /* that should always fail. */ - - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - /* if we can't find the group, then we allow the operation */ - fAdmin = TRUE; - return TRUE; - } - - if (dwSize == 0 || dwSize2 == 0) { - /* Paranoia */ - fAdmin = TRUE; - return TRUE; - } - - psidAdmin = (PSID)malloc(dwSize); memset(psidAdmin,0,dwSize); - assert(psidAdmin); - pszRefDomain = (char *)malloc(dwSize2); - assert(pszRefDomain); - - if (!LookupAccountName(NULL, pszAdminGroup, psidAdmin, &dwSize, pszRefDomain, &dwSize2, &snu)) { - /* We can't lookup the group now even though we looked it up earlier. - Could this happen? */ - fAdmin = TRUE; - } else { - /* Then open our current ProcessToken */ - HANDLE hToken; - - if (OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken)) - { - - if (!CheckTokenMembership(hToken, psidAdmin, &fAdmin)) { - /* We'll have to allocate a chunk of memory to store the list of - * groups to which this user belongs; find out how much memory - * we'll need. - */ - DWORD dwSize = 0; - PTOKEN_GROUPS pGroups; - - GetTokenInformation (hToken, TokenGroups, NULL, dwSize, &dwSize); - - pGroups = (PTOKEN_GROUPS)malloc(dwSize); - assert(pGroups); - - /* Allocate that buffer, and read in the list of groups. */ - if (GetTokenInformation (hToken, TokenGroups, pGroups, dwSize, &dwSize)) - { - /* Look through the list of group SIDs and see if any of them - * matches the AFS Client Admin group SID. - */ - size_t iGroup = 0; - for (; (!fAdmin) && (iGroup < pGroups->GroupCount); ++iGroup) - { - if (EqualSid (psidAdmin, pGroups->Groups[ iGroup ].Sid)) { - fAdmin = TRUE; - } - } - } - - if (pGroups) - free(pGroups); - } - - /* if do not have permission because we were not explicitly listed - * in the Admin Client Group let's see if we are the SYSTEM account - */ - if (!fAdmin) { - PTOKEN_USER pTokenUser; - SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY; - PSID pSidLocalSystem = 0; - DWORD gle; - - GetTokenInformation(hToken, TokenUser, NULL, 0, &dwSize); - - pTokenUser = (PTOKEN_USER)malloc(dwSize); - assert(pTokenUser); - - if (!GetTokenInformation(hToken, TokenUser, pTokenUser, dwSize, &dwSize)) - gle = GetLastError(); - - if (AllocateAndInitializeSid( &SIDAuth, 1, - SECURITY_LOCAL_SYSTEM_RID, - 0, 0, 0, 0, 0, 0, 0, - &pSidLocalSystem)) - { - if (EqualSid(pTokenUser->User.Sid, pSidLocalSystem)) { - fAdmin = TRUE; - } - - FreeSid(pSidLocalSystem); - } - - if ( pTokenUser ) - free(pTokenUser); - } - } - } - - free(psidAdmin); - free(pszRefDomain); - - fTested = TRUE; - } - - return fAdmin; -} - -static int -SetACLCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct Acl *ta = 0; - struct cmd_item *ti, *ui; - int plusp; - afs_int32 rights; - int clear; - int idf = getidf(as, parm_setacl_id); - - int error = 0; - - if (as->parms[2].items) - clear = 1; - else - clear = 0; - plusp = !(as->parms[3].items); - for(ti=as->parms[0].items; ti;ti=ti->next) { - blob.out_size = MAXSIZE; - blob.in_size = idf; - blob.in = blob.out = space; - code = pioctl(ti->data, VIOCGETAL, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - if (ta) - ZapAcl(ta); - ta = ParseAcl(space); - if (!plusp && ta->dfs) { - fprintf(stderr, - "fs: %s: you may not use the -negative switch with DFS acl's.\n%s", - ti->data, - "(you may specify \"null\" to revoke all rights, however)\n"); - error = 1; - continue; - } - if (ta) - ZapAcl(ta); - if (clear) - ta = EmptyAcl(space); - else - ta = ParseAcl(space); - CleanAcl(ta, ti->data); - for(ui=as->parms[1].items; ui; ui=ui->next->next) { - enum rtype rtype; - if (!ui->next) { - fprintf(stderr, - "%s: Missing second half of user/access pair.\n", pn); - ZapAcl(ta); - return 1; - } - rights = Convert(ui->next->data, ta->dfs, &rtype); - if (rtype == destroy && !ta->dfs) { - struct AclEntry *tlist; - - tlist = (plusp ? ta->pluslist : ta->minuslist); - if (!FindList(tlist, ui->data)) - continue; - } - if (rtype == deny && !ta->dfs) - plusp = 0; - if (rtype == destroy && ta->dfs) - rights = -1; - ChangeList(ta, plusp, ui->data, rights); - } - blob.in = AclToString(ta); - blob.out_size=0; - blob.in_size = 1+strlen(blob.in); - code = pioctl(ti->data, VIOCSETAL, &blob, 1); - if (code) { - if (errno == EINVAL) { - if (ta->dfs) { - static char *fsenv = 0; - if (!fsenv) { - fsenv = (char *)getenv("FS_EXPERT"); - } - fprintf(stderr, "fs: \"Invalid argument\" was returned when you tried to store a DFS access list.\n"); - if (!fsenv) { - fprintf(stderr, - "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - "\nPossible reasons for this include:\n\n", - " -You may have specified an inappropriate combination of rights.\n", - " For example, some DFS-supported filesystems may not allow you to\n", - " drop the \"c\" right from \"user_obj\".\n\n", - " -A mask_obj may be required (it is likely required by the underlying\n", - " filesystem if you try to set anything other than the basic \"user_obj\"\n", - " \"mask_obj\", or \"group_obj\" entries). Unlike acl_edit, the fs command\n", - " does not automatically create or update the mask_obj. Try setting\n", - " the rights \"mask_obj all\" with \"fs sa\" before adding any explicit\n", - " users or groups. You can do this with a single command, such as\n", - " \"fs sa mask_obj all user:somename read\"\n\n", - " -A specified user or group may not exist.\n\n", - " -You may have tried to delete \"user_obj\", \"group_obj\", or \"other_obj\".\n", - " This is probably not allowed by the underlying file system.\n\n", - " -If you add a user or group to a DFS ACL, remember that it must be\n", - " fully specified as \"user:username\" or \"group:groupname\". In addition, there\n", - " may be local requirements on the format of the user or group name.\n", - " Check with your cell administrator.\n\n", - " -Or numerous other possibilities. It would be great if we could be more\n", - " precise about the actual problem, but for various reasons, this is\n", - " impractical via this interface. If you can't figure it out, you\n", - " might try logging into a DCE-equipped machine and use acl_edit (or\n", - " whatever is provided). You may get better results. Good luck!\n\n", - " (You may inhibit this message by setting \"FS_EXPERT\" in your environment)\n"); - } - } else { - fprintf(stderr, - "%s: Invalid argument, possible reasons include:\n", - pn); - fprintf(stderr,"\t-File not in AFS\n"); - fprintf(stderr, - "\t-Too many users on access control list\n"); - fprintf(stderr, - "\t-Tried to add non-existent user to access control list\n"); - } - } else { - Die(errno, ti->data); - } - error = 1; - } - } - if (ta) - ZapAcl(ta); - return error; -} - -static int -CopyACLCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct Acl *fa, *ta = 0; - struct AclEntry *tp; - struct cmd_item *ti; - int clear; - int idf = getidf(as, parm_copyacl_id); - int error = 0; - - if (as->parms[2].items) - clear=1; - else - clear=0; - blob.out_size = MAXSIZE; - blob.in_size = idf; - blob.in = blob.out = space; - code = pioctl(as->parms[0].items->data, VIOCGETAL, &blob, 1); - if (code) { - Die(errno, as->parms[0].items->data); - return 1; - } - fa = ParseAcl(space); - CleanAcl(fa, as->parms[0].items->data); - for (ti=as->parms[1].items; ti;ti=ti->next) { - blob.out_size = MAXSIZE; - blob.in_size = idf; - blob.in = blob.out = space; - code = pioctl(ti->data, VIOCGETAL, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - if (ta) - ZapAcl(ta); - if (clear) - ta = EmptyAcl(space); - else - ta = ParseAcl(space); - CleanAcl(ta, ti->data); - if (ta->dfs != fa->dfs) { - fprintf(stderr, - "%s: incompatible file system types: acl not copied to %s; aborted\n", - pn, ti->data); - error = 1; - continue; - } - if (ta->dfs) { - if (! clear && strcmp(ta->cell, fa->cell) != 0) { - fprintf(stderr, - "%s: default DCE cell differs for file %s: use \"-clear\" switch; acl not merged\n", - pn, ti->data); - error = 1; - continue; - } - strcpy(ta->cell, fa->cell); - } - for (tp = fa->pluslist;tp;tp=tp->next) - ChangeList(ta, 1, tp->name, tp->rights); - for (tp = fa->minuslist;tp;tp=tp->next) - ChangeList(ta, 0, tp->name, tp->rights); - blob.in = AclToString(ta); - blob.out_size=0; - blob.in_size = 1+strlen(blob.in); - code = pioctl(ti->data, VIOCSETAL, &blob, 1); - if (code) { - if (errno == EINVAL) { - fprintf(stderr, - "%s: Invalid argument, possible reasons include:\n", pn); - fprintf(stderr,"\t-File not in AFS\n"); - } else { - Die(errno, ti->data); - } - error = 1; - } - } - if (ta) - ZapAcl(ta); - ZapAcl(fa); - return error; -} - -/* pioctl() call to get the cellname of a pathname */ -static afs_int32 -GetCell(char *fname, char *cellname) -{ - afs_int32 code; - struct ViceIoctl blob; - - blob.in_size = 0; - blob.out_size = MAXCELLCHARS; - blob.out = cellname; - - code = pioctl(fname, VIOC_FILE_CELL_NAME, &blob, 1); - return code ? errno : 0; -} - -/* Check if a username is valid: If it contains only digits (or a - * negative sign), then it might be bad. We then query the ptserver - * to see. - */ -static int -BadName(char *aname, char *fname) -{ - afs_int32 tc, code, id; - char *nm; - char cell[MAXCELLCHARS]; - - for ( nm = aname; tc = *nm; nm++) { - /* all must be '-' or digit to be bad */ - if (tc != '-' && (tc < '0' || tc > '9')) - return 0; - } - - /* Go to the PRDB and see if this all number username is valid */ - code = GetCell(fname, cell); - if (code) - return 0; - - pr_Initialize(1, AFSDIR_CLIENT_ETC_DIRPATH, cell); - code = pr_SNameToId(aname, &id); - pr_End(); - - /* 1=>Not-valid; 0=>Valid */ - return ((!code && (id == ANONYMOUSID)) ? 1 : 0); -} - - -/* clean up an access control list of its bad entries; return 1 if we made - any changes to the list, and 0 otherwise */ -static int -CleanAcl(struct Acl *aa, char *fname) -{ - struct AclEntry *te, **le, *ne; - int changes; - - /* Don't correct DFS ACL's for now */ - if (aa->dfs) - return 0; - - /* prune out bad entries */ - changes = 0; /* count deleted entries */ - le = &aa->pluslist; - for(te = aa->pluslist; te; te=ne) { - ne = te->next; - if (BadName(te->name, fname)) { - /* zap this dude */ - *le = te->next; - aa->nplus--; - free(te); - changes++; - } else { - le = &te->next; - } - } - le = &aa->minuslist; - for(te = aa->minuslist; te; te=ne) { - ne = te->next; - if (BadName(te->name, fname)) { - /* zap this dude */ - *le = te->next; - aa->nminus--; - free(te); - changes++; - } else { - le = &te->next; - } - } - return changes; -} - - -/* clean up an acl to not have bogus entries */ -static int -CleanACLCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct Acl *ta = 0; - struct ViceIoctl blob; - int changes; - struct cmd_item *ti; - struct AclEntry *te; - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - code = pioctl(ti->data, VIOCGETAL, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - if (ta) - ZapAcl(ta); - ta = ParseAcl(space); - - if (ta->dfs) { - fprintf(stderr, - "%s: cleanacl is not supported for DFS access lists.\n", - pn); - error = 1; - continue; - } - - changes = CleanAcl(ta, ti->data); - - if (changes) { - /* now set the acl */ - blob.in=AclToString(ta); - blob.in_size = strlen(blob.in)+1; - blob.out_size = 0; - code = pioctl(ti->data, VIOCSETAL, &blob, 1); - if (code) { - if (errno == EINVAL) { - fprintf(stderr, - "%s: Invalid argument, possible reasons include\n", - pn); - fprintf(stderr,"%s: File not in vice or\n", pn); - fprintf(stderr, - "%s: Too many users on access control list or\n", - pn); - } else { - Die(errno, ti->data); - } - error = 1; - continue; - } - - /* now list the updated acl */ - printf("Access list for %s is now\n", ti->data); - if (ta->nplus > 0) { - if (!ta->dfs) - printf("Normal rights:\n"); - for(te = ta->pluslist;te;te=te->next) { - printf(" %s ", te->name); - PRights(te->rights, ta->dfs); - printf("\n"); - } - } - if (ta->nminus > 0) { - printf("Negative rights:\n"); - for(te = ta->minuslist;te;te=te->next) { - printf(" %s ", te->name); - PRights(te->rights, ta->dfs); - printf("\n"); - } - } - if (ti->next) - printf("\n"); - } else - printf("Access list for %s is fine.\n", ti->data); - } - if (ta) - ZapAcl(ta); - return error; -} - -static int -ListACLCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct Acl *ta = 0; - struct ViceIoctl blob; - struct AclEntry *te; - struct cmd_item *ti; - int idf = getidf(as, parm_listacl_id); - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - char separator; - blob.out_size = MAXSIZE; - blob.in_size = idf; - blob.in = blob.out = space; - code = pioctl(ti->data, VIOCGETAL, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - ta = ParseAcl(space); - switch (ta->dfs) { - case 0: - printf("Access list for %s is\n", ti->data); - break; - case 1: - printf("DFS access list for %s is\n", ti->data); - break; - case 2: - printf("DFS initial directory access list of %s is\n", ti->data); - break; - case 3: - printf("DFS initial file access list of %s is\n", ti->data); - break; - } - if (ta->dfs) { - printf(" Default cell = %s\n", ta->cell); - } - separator = ta->dfs? DFS_SEPARATOR : ' '; - if (ta->nplus > 0) { - if (!ta->dfs) - printf("Normal rights:\n"); - for(te = ta->pluslist;te;te=te->next) { - printf(" %s%c", te->name, separator); - PRights(te->rights, ta->dfs); - printf("\n"); - } - } - if (ta->nminus > 0) { - printf("Negative rights:\n"); - for(te = ta->minuslist;te;te=te->next) { - printf(" %s ", te->name); - PRights(te->rights, ta->dfs); - printf("\n"); - } - } - if (ti->next) - printf("\n"); - ZapAcl(ta); - } - return error; -} - -static int -FlushVolumeCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - blob.in_size = blob.out_size = 0; - code = pioctl(ti->data, VIOC_FLUSHVOLUME, &blob, 0); - if (code) { - fprintf(stderr, "Error flushing volume "); - perror(ti->data); - error = 1; - continue; - } - } - return error; -} - -static int -FlushCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - - int error = 0; - - for(ti=as->parms[0].items; ti; ti=ti->next) { - blob.in_size = blob.out_size = 0; - code = pioctl(ti->data, VIOCFLUSH, &blob, 0); - if (code) { - if (errno == EMFILE) { - fprintf(stderr, "%s: Can't flush active file %s\n", pn, - ti->data); - } else { - fprintf(stderr, "%s: Error flushing file ", pn); - perror(ti->data); - } - error = 1; - continue; - } - } - return error; -} - -/* all this command does is repackage its args and call SetVolCmd */ -static int -SetQuotaCmd(struct cmd_syndesc *as, char *arock) { - struct cmd_syndesc ts; - - /* copy useful stuff from our command slot; we may later have to reorder */ - memcpy(&ts, as, sizeof(ts)); /* copy whole thing */ - return SetVolCmd(&ts, arock); -} - -static int -SetVolCmd(struct cmd_syndesc *as, char *arock) { - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - struct VolumeStatus *status; - char *motd, *offmsg, *input; - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - blob.out_size = MAXSIZE; - blob.in_size = sizeof(*status) + 3; /* for the three terminating nulls */ - blob.out = space; - blob.in = space; - status = (VolumeStatus *)space; - status->MinQuota = status->MaxQuota = -1; - motd = offmsg = NULL; - if (as->parms[1].items) { - code = util_GetInt32(as->parms[1].items->data, &status->MaxQuota); - if (code) { - fprintf(stderr,"%s: bad integer specified for quota.\n", pn); - error = 1; - continue; - } - } - if (as->parms[2].items) - motd = as->parms[2].items->data; - if (as->parms[3].items) - offmsg = as->parms[3].items->data; - input = (char *)status + sizeof(*status); - *(input++) = '\0'; /* never set name: this call doesn't change vldb */ - if(offmsg) { - if (strlen(offmsg) >= VMSGSIZE) { - fprintf(stderr,"%s: message must be shorter than %d characters\n", - pn, VMSGSIZE); - error = 1; - continue; - } - strcpy(input,offmsg); - blob.in_size += strlen(offmsg); - input += strlen(offmsg) + 1; - } else - *(input++) = '\0'; - if(motd) { - if (strlen(motd) >= VMSGSIZE) { - fprintf(stderr,"%s: message must be shorter than %d characters\n", - pn, VMSGSIZE); - return code; - } - strcpy(input,motd); - blob.in_size += strlen(motd); - input += strlen(motd) + 1; - } else - *(input++) = '\0'; - code = pioctl(ti->data,VIOCSETVOLSTAT, &blob, 1); - if (code) { - error = 1; - } - } - return error; -} - -#ifndef WIN32 -/* - * Why is VenusFid declared in the kernel-only section of afs.h, - * if it's the exported interface of the (UNIX) cache manager? - */ -struct VenusFid { - afs_int32 Cell; - AFSFid Fid; -}; -#endif /* WIN32 */ - -static int -ExamineCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - struct VolumeStatus *status; - char *name, *offmsg, *motd; - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { -#ifndef WIN32 - struct VenusFid vfid; -#endif /* WIN32 */ - /* once per file */ - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - status = (VolumeStatus *)space; - name = (char *)status + sizeof(*status); - offmsg = name + strlen(name) + 1; - motd = offmsg + strlen(offmsg) + 1; - -#ifndef WIN32 - blob.out_size = sizeof(struct VenusFid); - blob.out = (char *) &vfid; - if (0 == pioctl(ti->data, VIOCGETFID, &blob, 1)) { - printf("File %s (%u.%u.%u) contained in volume %u\n", - ti->data, vfid.Fid.Volume, vfid.Fid.Vnode, vfid.Fid.Unique, - vfid.Fid.Volume); - } -#endif /* WIN32 */ - PrintStatus(status, name, motd, offmsg); - } - return error; -} - -static int -ListQuotaCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - struct VolumeStatus *status; - char *name; - - int error = 0; - - printf("%-25s%-10s%-10s%-7s%-13s\n", - "Volume Name", " Quota", " Used", " %Used", " Partition"); - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - status = (VolumeStatus *)space; - name = (char *)status + sizeof(*status); - QuickPrintStatus(status, name); - } - return error; -} - -static int -WhereIsCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - int j; - afs_int32 *hosts; - char *tp; - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - memset(space, 0, sizeof(space)); - code = pioctl(ti->data, VIOCWHEREIS, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - hosts = (afs_int32 *) space; - printf("File %s is on host%s ", ti->data, - (hosts[0] && !hosts[1]) ? "": "s"); - for(j=0; jparms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - status = (VolumeStatus *)space; - name = (char *)status + sizeof(*status); - QuickPrintSpace(status, name); - } - return error; -} - -static int -QuotaCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - double quotaPct; - struct VolumeStatus *status; - int error = 0; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - status = (VolumeStatus *)space; - if (status->MaxQuota) - quotaPct = ((((double)status->BlocksInUse)/status->MaxQuota) * 100.0); - else - quotaPct = 0.0; - printf("%2.0f%% of quota used.\n", quotaPct); - } - return error; -} - -static int -ListMountCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - char orig_name[1024]; /*Original name, may be modified*/ - char true_name[1024]; /*``True'' dirname (e.g., symlink target)*/ - char parent_dir[1024]; /*Parent directory of true name*/ - char *last_component; /*Last component of true name*/ -#ifndef WIN32 - struct stat statbuff; /*Buffer for status info*/ -#endif /* not WIN32 */ -#ifndef WIN32 - int link_chars_read; /*Num chars read in readlink()*/ -#endif /* not WIN32 */ - int thru_symlink; /*Did we get to a mount point via a symlink?*/ - - int error = 0; - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - thru_symlink = 0; -#ifdef WIN32 - strcpy(orig_name, ti->data); -#else /* not WIN32 */ - sprintf(orig_name, "%s%s", - (ti->data[0] == '/') ? "" : "./", - ti->data); -#endif /* not WIN32 */ - -#ifndef WIN32 - if (lstat(orig_name, &statbuff) < 0) { - /* if lstat fails, we should still try the pioctl, since it - * may work (for example, lstat will fail, but pioctl will - * work if the volume of offline (returning ENODEV). */ - statbuff.st_mode = S_IFDIR; /* lie like pros */ - } - - /* - * The lstat succeeded. If the given file is a symlink, substitute - * the file name with the link name. - */ - if ((statbuff.st_mode & S_IFMT) == S_IFLNK) { - thru_symlink = 1; - /* - * Read name of resolved file. - */ - link_chars_read = readlink(orig_name, true_name, 1024); - if (link_chars_read <= 0) { - fprintf(stderr, - "%s: Can't read target name for '%s' symbolic link!\n", - pn, orig_name); - error = 1; - continue; - } - - /* - * Add a trailing null to what was read, bump the length. - */ - true_name[link_chars_read++] = 0; - - /* - * If the symlink is an absolute pathname, we're fine. Otherwise, we - * have to create a full pathname using the original name and the - * relative symlink name. Find the rightmost slash in the original - * name (we know there is one) and splice in the symlink value. - */ - if (true_name[0] != '\\') { - last_component = (char *) strrchr(orig_name, '\\'); - strcpy(++last_component, true_name); - strcpy(true_name, orig_name); - } - } else - strcpy(true_name, orig_name); -#else /* WIN32 */ - strcpy(true_name, orig_name); -#endif /* WIN32 */ - - /* - * Find rightmost slash, if any. - */ -#ifdef WIN32 - last_component = (char *) strrchr(true_name, '\\'); - if (!last_component) -#endif /* WIN32 */ - last_component = (char *) strrchr(true_name, '/'); - if (last_component) { - /* - * Found it. Designate everything before it as the parent directory, - * everything after it as the final component. - */ - strncpy(parent_dir, true_name, last_component - true_name + 1); - parent_dir[last_component - true_name + 1] = 0; - last_component++; /*Skip the slash*/ - } else { - /* - * No slash appears in the given file name. Set parent_dir to the current - * directory, and the last component as the given name. - */ - fs_ExtractDriveLetter(true_name, parent_dir); - strcat(parent_dir, "."); - last_component = true_name; - fs_StripDriveLetter(true_name, true_name, sizeof(true_name)); - } - - if (strcmp(last_component, ".") == 0 || strcmp(last_component, "..") == 0) { - fprintf(stderr,"%s: you may not use '.' or '..' as the last component\n",pn); - fprintf(stderr,"%s: of a name in the 'fs lsmount' command.\n",pn); - error = 1; - continue; - } - - blob.in = last_component; - blob.in_size = strlen(last_component)+1; - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, MAXSIZE); - - code = pioctl(parent_dir, VIOC_AFS_STAT_MT_PT, &blob, 1); - - if (code == 0) { - printf("'%s' is a %smount point for volume '%s'\n", - ti->data, - (thru_symlink ? "symbolic link, leading to a " : ""), - space); - - } else { - if (errno == EINVAL) { - fprintf(stderr,"'%s' is not a mount point.\n", ti->data); - } else { - Die(errno, (ti->data ? ti->data : parent_dir)); - } - error = 1; - } - } - return error; -} - -static int -MakeMountCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - char *cellName, *volName, *tmpName; -#ifdef WIN32 - char localCellName[1000]; -#else /* not WIN32 */ - struct afsconf_cell info; - struct vldbentry vldbEntry; -#endif /* not WIN32 */ - struct ViceIoctl blob; - - /* - - defect #3069 - - if (as->parms[5].items && !as->parms[2].items) { - fprintf(stderr,"%s: must provide cell when creating cellular mount point.\n", pn); - return 1; - } - */ - - if (as->parms[2].items) /* cell name specified */ - cellName = as->parms[2].items->data; - else - cellName = NULL; - volName = as->parms[1].items->data; - - if (strlen(volName) >= 64) { - fprintf(stderr,"%s: volume name too long (length must be < 64 characters)\n", pn); - return 1; - } - - /* Check for a cellname in the volume specification, and complain - * if it doesn't match what was specified with -cell */ - if (tmpName = strchr(volName, ':')) { - *tmpName = '\0'; - if (cellName) { - if (strcasecmp(cellName,volName)) { - fprintf(stderr,"fs: cellnames do not match.\n"); - return 1; - } - } - cellName = volName; - volName = ++tmpName; - } - - if (!InAFS(Parent(as->parms[0].items->data))) { - fprintf(stderr,"%s: mount points must be created within the AFS file system\n", pn); - return 1; - } - - if (!cellName) { - blob.in_size = 0; - blob.out_size = MAXSIZE; - blob.out = space; - code = pioctl(Parent(as->parms[0].items->data), VIOC_FILE_CELL_NAME, &blob, 1); - } - -#ifdef WIN32 - strcpy(localCellName, (cellName? cellName : space)); -#else /* not win32 */ - code = GetCellName(cellName?cellName:space, &info); - if (code) { - return 1; - } - if (!(as->parms[4].items)) { - /* not fast, check which cell the mountpoint is being created in */ - code = 0; - /* not fast, check name with VLDB */ - if (!code) - code = VLDBInit(1, &info); - if (code == 0) { - /* make the check. Don't complain if there are problems with init */ - code = ubik_Call(VL_GetEntryByNameO, uclient, 0, volName, &vldbEntry); - if (code == VL_NOENT) { - fprintf(stderr,"%s: warning, volume %s does not exist in cell %s.\n", - pn, volName, cellName ? cellName : space); - } - } - } -#endif /* not WIN32 */ - - if (as->parms[3].items) /* if -rw specified */ - strcpy(space, "%"); - else - strcpy(space, "#"); - if (cellName) { - /* cellular mount point, prepend cell prefix */ -#ifdef WIN32 - strcat(space, localCellName); -#else /* not WIN32 */ - strcat(space, info.name); -#endif /* not WIN32 */ - strcat(space, ":"); - } - strcat(space, volName); /* append volume name */ - strcat(space, "."); /* stupid convention; these end with a period */ -#ifdef WIN32 - /* create symlink with a special pioctl for Windows NT, since it doesn't - * have a symlink system call. - */ - blob.out_size = 0; - blob.in_size = 1 + strlen(space); - blob.in = space; - blob.out = NULL; - code = pioctl(as->parms[0].items->data, VIOC_AFS_CREATE_MT_PT, &blob, 0); -#else /* not WIN32 */ - code = symlink(space, as->parms[0].items->data); -#endif /* not WIN32 */ - if (code) { - Die(errno, as->parms[0].items->data); - return 1; - } - return 0; -} - -/* - * Delete AFS mount points. Variables are used as follows: - * tbuffer: Set to point to the null-terminated directory name of the mount point - * (or ``.'' if none is provided) - * tp: Set to point to the actual name of the mount point to nuke. - */ -static int -RemoveMountCmd(struct cmd_syndesc *as, char *arock) { - afs_int32 code=0; - struct ViceIoctl blob; - struct cmd_item *ti; - char tbuffer[1024]; - char lsbuffer[1024]; - char *tp; - int error = 0; - - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - tp = (char *) strrchr(ti->data, '\\'); - if (!tp) - tp = (char *) strrchr(ti->data, '/'); - if (tp) { - strncpy(tbuffer, ti->data, code=tp-ti->data+1); /* the dir name */ - tbuffer[code] = 0; - tp++; /* skip the slash */ - } else { - fs_ExtractDriveLetter(ti->data, tbuffer); - strcat(tbuffer, "."); - tp = ti->data; - fs_StripDriveLetter(tp, tp, 0); - } - blob.in = tp; - blob.in_size = strlen(tp)+1; - blob.out = lsbuffer; - blob.out_size = sizeof(lsbuffer); - code = pioctl(tbuffer, VIOC_AFS_STAT_MT_PT, &blob, 0); - if (code) { - if (errno == EINVAL) { - fprintf(stderr,"%s: '%s' is not a mount point.\n", pn, ti->data); - } else { - Die(errno, ti->data); - } - error = 1; - continue; /* don't bother trying */ - } - blob.out_size = 0; - blob.in = tp; - blob.in_size = strlen(tp)+1; - code = pioctl(tbuffer, VIOC_AFS_DELETE_MT_PT, &blob, 0); - if (code) { - Die(errno, ti->data); - error = 1; - } - } - return error; -} - -/* -*/ - -static int -CheckServersCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - afs_int32 j; - afs_int32 temp; - char *tp; - struct afsconf_cell info; - struct chservinfo checkserv; - - memset(&checkserv, 0, sizeof(struct chservinfo)); - blob.in_size=sizeof(struct chservinfo); - blob.in=(caddr_t)&checkserv; - - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, sizeof(afs_int32)); /* so we assure zero when nothing is copied back */ - - /* prepare flags for checkservers command */ - temp = 2; /* default to checking local cell only */ - if (as->parms[2].items) - temp |= 1; /* set fast flag */ - if (as->parms[1].items) - temp &= ~2; /* turn off local cell check */ - - checkserv.magic = 0x12345678; /* XXX */ - checkserv.tflags=temp; - - /* now copy in optional cell name, if specified */ - if (as->parms[0].items) { - code = GetCellName(as->parms[0].items->data, &info); - if (code) { - return 1; - } - strcpy(checkserv.tbuffer,info.name); - checkserv.tsize=strlen(info.name)+1; - } else { - strcpy(checkserv.tbuffer,"\0"); - checkserv.tsize=0; - } - - if(as->parms[3].items) { - checkserv.tinterval=atol(as->parms[3].items->data); - - /* sanity check */ - if(checkserv.tinterval<0) { - printf("Warning: The negative -interval is ignored; treated as an inquiry\n"); - checkserv.tinterval=0; - } else if(checkserv.tinterval> 600) { - printf("Warning: The maximum -interval value is 10 mins (600 secs)\n"); - checkserv.tinterval=600; /* 10 min max interval */ - } - } else { - checkserv.tinterval = -1; /* don't change current interval */ - } - - if ( checkserv.tinterval != 0 ) { -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else /* WIN32 */ - if (geteuid()) { - fprintf (stderr,"Permission denied: requires root access.\n"); - return EACCES; - } -#endif /* WIN32 */ - } - - code = pioctl(0, VIOCCKSERV, &blob, 1); - if (code) { - if ((errno == EACCES) && (checkserv.tinterval > 0)) { - printf("Must be root to change -interval\n"); - return code; - } - Die(errno, 0); - return 1; - } - memcpy(&temp, space, sizeof(afs_int32)); - if (checkserv.tinterval >= 0) { - if (checkserv.tinterval > 0) - printf("The new down server probe interval (%d secs) is now in effect (old interval was %d secs)\n", - checkserv.tinterval, temp); - else - printf("The current down server probe interval is %d secs\n", temp); - return 0; - } - if (temp == 0) { - printf("All servers are running.\n"); - } else { - printf("These servers unavailable due to network or server problems: "); - for(j=0; j < MAXHOSTS; j++) { - memcpy(&temp, space + j*sizeof(afs_int32), sizeof(afs_int32)); - if (temp == 0) - break; - tp = hostutil_GetNameByINet(temp); - printf(" %s", tp); - } - printf(".\n"); - code = 1; /* XXX */ - } - return code; -} - -static int -MessagesCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code=0; - struct ViceIoctl blob; - struct gaginfo gagflags; - struct cmd_item *show; - - memset(&gagflags, 0, sizeof(struct gaginfo)); - blob.in_size = sizeof(struct gaginfo); - blob.in = (caddr_t ) &gagflags; - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, sizeof(afs_int32)); /* so we assure zero when nothing is copied back */ - - if (show = as->parms[0].items) { - if (!strcasecmp (show->data, "user")) - gagflags.showflags |= GAGUSER; - else if (!strcasecmp (show->data, "console")) - gagflags.showflags |= GAGCONSOLE; - else if (!strcasecmp (show->data, "all")) - gagflags.showflags |= GAGCONSOLE | GAGUSER; - else if (!strcasecmp (show->data, "none")) - /* do nothing */ ; - else { - fprintf(stderr, - "unrecognized flag %s: must be in {user,console,all,none}\n", - show->data); - code = EINVAL; - } - } - - if (code) - return 1; - - code = pioctl(0, VIOC_GAG, &blob, 1); - if (code) { - Die(errno, 0); - return 1; - } - return 0; -} - -static int -CheckVolumesCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - - blob.in_size = 0; - blob.out_size = 0; - code = pioctl(0, VIOCCKBACK, &blob, 1); - if (code) { - Die(errno, 0); - return 1; - } - printf("All volumeID/name mappings checked.\n"); - - return 0; -} - -static int -SetCacheSizeCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - afs_int32 temp; - -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else /* WIN32 */ - if (geteuid()) { - fprintf (stderr,"Permission denied: requires root access.\n"); - return EACCES; - } -#endif /* WIN32 */ - - if (!as->parms[0].items && !as->parms[1].items) { - fprintf(stderr,"%s: syntax error in set cache size cmd.\n", pn); - return 1; - } - if (as->parms[0].items) { - code = util_GetInt32(as->parms[0].items->data, &temp); - if (code) { - fprintf(stderr,"%s: bad integer specified for cache size.\n", pn); - return 1; - } - } else - temp = 0; - blob.in = (char *) &temp; - blob.in_size = sizeof(afs_int32); - blob.out_size = 0; - code = pioctl(0, VIOCSETCACHESIZE, &blob, 1); - if (code) { - Die(errno, (char *) 0); - return 1; - } - - printf("New cache size set.\n"); - return 0; -} - -#define MAXGCSIZE 16 -static int -GetCacheParmsCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - afs_int32 parms[MAXGCSIZE]; - - memset(parms, 0, sizeof(parms)); - blob.in = NULL; - blob.in_size = 0; - blob.out_size = sizeof(parms); - blob.out = (char *) parms; - code = pioctl(0, VIOCGETCACHEPARMS, &blob, 1); - if (code) { - Die(errno, NULL); - return 1; - } - - printf("AFS using %d of the cache's available %d 1K byte blocks.\n", - parms[1], parms[0]); - if (parms[1] > parms[0]) - printf("[Cache guideline temporarily deliberately exceeded; it will be adjusted down but you may wish to increase the cache size.]\n"); - return 0; -} - -static int -ListCellsCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - afs_int32 i, j, *lp, magic, size; - char *tp; - afs_int32 addr, maxa = OMAXHOSTS; - struct ViceIoctl blob; - int resolve; - - resolve = !(as->parms[0].items); /* -numeric */ - - for(i=0;i<1000;i++) { - tp = space; - memcpy(tp, &i, sizeof(afs_int32)); - tp = (char *)(space + sizeof(afs_int32)); - lp = (afs_int32 *)tp; - *lp++ = 0x12345678; - size = sizeof(afs_int32) + sizeof(afs_int32); - blob.out_size = MAXSIZE; - blob.in_size = sizeof(afs_int32); - blob.in = space; - blob.out = space; - code = pioctl(0, VIOCGETCELL, &blob, 1); - if (code < 0) { - if (errno == EDOM) - break; /* done with the list */ - Die(errno, 0); - return 1; - } - tp = space; - memcpy(&magic, tp, sizeof(afs_int32)); - if (magic == 0x12345678) { - maxa = MAXHOSTS; - tp += sizeof(afs_int32); - } - printf("Cell %s on hosts", tp+maxa*sizeof(afs_int32)); - for(j=0; j < maxa; j++) { - char *name, tbuffer[20]; - - memcpy(&addr, tp + j*sizeof(afs_int32), sizeof(afs_int32)); - if (addr == 0) - break; - - if (resolve) { - name = hostutil_GetNameByINet(addr); - } else { - addr = ntohl(addr); - sprintf(tbuffer, "%d.%d.%d.%d", (addr >> 24) & 0xff, - (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); - name = tbuffer; - } - printf(" %s", name); - } - printf(".\n"); - } - return 0; -} - -#ifndef WIN32 -static int -ListAliasesCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code, i; - char *tp, *aliasName, *realName; - struct ViceIoctl blob; - - for (i = 0;; i++) { - tp = space; - memcpy(tp, &i, sizeof(afs_int32)); - blob.out_size = MAXSIZE; - blob.in_size = sizeof(afs_int32); - blob.in = space; - blob.out = space; - code = pioctl(0, VIOC_GETALIAS, &blob, 1); - if (code < 0) { - if (errno == EDOM) - break; /* done with the list */ - Die(errno, 0); - return 1; - } - tp = space; - aliasName = tp; - tp += strlen(aliasName) + 1; - realName = tp; - printf("Alias %s for cell %s\n", aliasName, realName); - } - return 0; -} - -static int -CallBackRxConnCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - afs_int32 hostAddr; - struct hostent *thp; - char *tp; - int setp; - - ti = as->parms[0].items; - setp = 1; - if (ti) { - thp = hostutil_GetHostByName(ti->data); - if (!thp) { - fprintf(stderr, "host %s not found in host table.\n", ti->data); - return 1; - } - else memcpy(&hostAddr, thp->h_addr, sizeof(afs_int32)); - } else { - hostAddr = 0; /* means don't set host */ - setp = 0; /* aren't setting host */ - } - - /* now do operation */ - blob.in_size = sizeof(afs_int32); - blob.out_size = sizeof(afs_int32); - blob.in = (char *) &hostAddr; - blob.out = (char *) &hostAddr; - - code = pioctl(0, VIOC_CBADDR, &blob, 1); - if (code < 0) { - Die(errno, 0); - return 1; - } - return 0; -} -#endif /* WIN32 */ - -static int -NewCellCmd(struct cmd_syndesc *as, char *arock) -{ -#ifndef WIN32 - afs_int32 code, linkedstate=0, size=0, *lp; - struct ViceIoctl blob; - struct cmd_item *ti; - char *tp, *cellname=0; - struct hostent *thp; - afs_int32 fsport = 0, vlport = 0; - - memset(space, 0, MAXHOSTS * sizeof(afs_int32)); - tp = space; - lp = (afs_int32 *)tp; - *lp++ = 0x12345678; - tp += sizeof(afs_int32); - for(ti=as->parms[1].items; ti; ti=ti->next) { - thp = hostutil_GetHostByName(ti->data); - if (!thp) { - fprintf(stderr,"%s: Host %s not found in host table, skipping it.\n", - pn, ti->data); - } - else { - memcpy(tp, thp->h_addr, sizeof(afs_int32)); - tp += sizeof(afs_int32); - } - } - if (as->parms[2].items) { - /* - * Link the cell, for the purposes of volume location, to the specified - * cell. - */ - cellname = as->parms[2].items->data; - linkedstate = 1; - } -#ifdef FS_ENABLE_SERVER_DEBUG_PORTS - if (as->parms[3].items) { - code = util_GetInt32(as->parms[3].items->data, &vlport); - if (code) { - fprintf(stderr,"fs: bad integer specified for the fileserver port.\n"); - return code; - } - } - if (as->parms[4].items) { - code = util_GetInt32(as->parms[4].items->data, &fsport); - if (code) { - fprintf(stderr,"fs: bad integer specified for the vldb server port.\n"); - return code; - } - } -#endif - tp = (char *)(space + (MAXHOSTS+1) *sizeof(afs_int32)); - lp = (afs_int32 *)tp; - *lp++ = fsport; - *lp++ = vlport; - *lp = linkedstate; - strcpy(space + ((MAXHOSTS+4) * sizeof(afs_int32)), as->parms[0].items->data); - size = ((MAXHOSTS+4) * sizeof(afs_int32)) + strlen(as->parms[0].items->data) + 1 /* for null */; - tp = (char *)(space + size); - if (linkedstate) { - strcpy(tp, cellname); - size += strlen(cellname) + 1; - } - blob.in_size = size; - blob.in = space; - blob.out_size = 0; - code = pioctl(0, VIOCNEWCELL, &blob, 1); - if (code < 0) - Die(errno, 0); - return 0; -#else /* WIN32 */ - afs_int32 code; - struct ViceIoctl blob; - - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } - - blob.in_size = 0; - blob.in = (char *) 0; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl((char *) 0, VIOCNEWCELL, &blob, 1); - - if (code) { - Die(errno, (char *) 0); - return 1; - } - - printf("Cell servers information refreshed\n"); - return 0; -#endif /* WIN32 */ -} - -#ifndef WIN32 -static int -NewAliasCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - char *tp; - char *aliasName, *realName; - - /* Setup and do the NEWALIAS pioctl call */ - aliasName = as->parms[0].items->data; - realName = as->parms[1].items->data; - tp = space; - strcpy(tp, aliasName); - tp += strlen(aliasName) + 1; - strcpy(tp, realName); - tp += strlen(realName) + 1; - - blob.in_size = tp - space; - blob.in = space; - blob.out_size = 0; - blob.out = space; - code = pioctl(0, VIOC_NEWALIAS, &blob, 1); - if (code < 0) { - if (errno == EEXIST) { - fprintf(stderr, - "%s: cell name `%s' in use by an existing cell.\n", pn, - aliasName); - } else { - Die(errno, 0); - } - return 1; - } - return 0; -} -#endif /* WIN32 */ - -static int -WhichCellCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct cmd_item *ti; - int error = 0; - char cell[MAXCELLCHARS]=""; - - SetDotDefault(&as->parms[0].items); - for(ti=as->parms[0].items; ti; ti=ti->next) { - code = GetCell(ti->data, cell); - if (code) { - if (errno == ENOENT) - fprintf(stderr,"%s: no such cell as '%s'\n", pn, ti->data); - else - Die(errno, ti->data); - error = 1; - continue; - } - printf("File %s lives in cell '%s'\n", ti->data, cell); - } - return error; -} - -static int -WSCellCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - - blob.in_size = 0; - blob.in = NULL; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl(NULL, VIOC_GET_WS_CELL, &blob, 1); - - if (code) { - Die(errno, NULL); - return 1; - } - - printf("This workstation belongs to cell '%s'\n", space); - return 0; -} - -/* -static int -PrimaryCellCmd(struct cmd_syndesc *as, char *arock) -{ - fprintf(stderr,"This command is obsolete, as is the concept of a primary token.\n"); - return 0; -} -*/ - -static int -MonitorCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - afs_int32 hostAddr; - struct hostent *thp; - char *tp; - int setp; - - ti = as->parms[0].items; - setp = 1; - if (ti) { - /* set the host */ - if (!strcmp(ti->data, "off")) { - hostAddr = 0xffffffff; - } else { - thp = hostutil_GetHostByName(ti->data); - if (!thp) { - if (!strcmp(ti->data, "localhost")) { - fprintf(stderr,"localhost not in host table, assuming 127.0.0.1\n"); - hostAddr = htonl(0x7f000001); - } else { - fprintf(stderr,"host %s not found in host table.\n", ti->data); - return 1; - } - } else { - memcpy(&hostAddr, thp->h_addr, sizeof(afs_int32)); - } - } - } else { - hostAddr = 0; /* means don't set host */ - setp = 0; /* aren't setting host */ - } - - /* now do operation */ - blob.in_size = sizeof(afs_int32); - blob.out_size = sizeof(afs_int32); - blob.in = (char *) &hostAddr; - blob.out = (char *) &hostAddr; - code = pioctl(0, VIOC_AFS_MARINER_HOST, &blob, 1); - if (code) { - Die(errno, 0); - return 1; - } - if (setp) { - printf("%s: new monitor host set.\n", pn); - } else { - /* now decode old address */ - if (hostAddr == 0xffffffff) { - printf("Cache monitoring is currently disabled.\n"); - } else { - tp = hostutil_GetNameByINet(hostAddr); - printf("Using host %s for monitor services.\n", tp); - } - } - return 0; -} - -static int -SysNameCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - char *input = space; - afs_int32 setp = 0; - - ti = as->parms[0].items; - if (ti) { -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else /* WIN32 */ - if (geteuid()) { - fprintf (stderr,"Permission denied: requires root access.\n"); - return EACCES; - } -#endif /* WIN32 */ - } - - blob.in = space; - blob.out = space; - blob.out_size = MAXSIZE; - blob.in_size = sizeof(afs_int32); - memcpy(input, &setp, sizeof(afs_int32)); - input += sizeof(afs_int32); - for (; ti; ti = ti->next) { - setp++; - blob.in_size += strlen(ti->data) + 1; - if (blob.in_size > MAXSIZE) { - fprintf(stderr, "%s: sysname%s too long.\n", pn, - setp > 1 ? "s" : ""); - return 1; - } - strcpy(input, ti->data); - input += strlen(ti->data); - *(input++) = '\0'; - } - memcpy(space, &setp, sizeof(afs_int32)); - code = pioctl(0, VIOC_AFS_SYSNAME, &blob, 1); - if (code) { - Die(errno, 0); - return 1; - } - if (setp) { - printf("%s: new sysname%s set.\n", pn, setp > 1 ? " list" : ""); - return 0; - } - - input = space; - memcpy(&setp, input, sizeof(afs_int32)); - input += sizeof(afs_int32); - if (!setp) { - fprintf(stderr,"No sysname name value was found\n"); - return 1; - } - - printf("Current sysname%s is", setp > 1 ? " list" : ""); - for (; setp > 0; --setp ) { - printf(" \'%s\'", input); - input += strlen(input) + 1; - } - printf("\n"); - return 0; -} - -static char *exported_types[] = {"null", "nfs", ""}; -static int ExportAfsCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - int export = 0, type = 0, mode = 0, exp = 0, gstat = 0; - int exportcall, pwsync = 0, smounts = 0; - -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else /* WIN32 */ - if (geteuid()) { - fprintf (stderr,"Permission denied: requires root access.\n"); - return EACCES; - } -#endif /* WIN32 */ - - ti = as->parms[0].items; - if (strcmp(ti->data, "nfs") == 0) - type = 0x71; /* NFS */ - else { - fprintf(stderr, - "Invalid exporter type, '%s', Only the 'nfs' exporter is currently supported\n", ti->data); - return 1; - } - ti = as->parms[1].items; - if (ti) { - if (strcmp(ti->data, "on") == 0) - export = 3; - else if (strcmp(ti->data, "off") == 0) - export = 2; - else { - fprintf(stderr, "Illegal argument %s\n", ti->data); - return 1; - } - exp = 1; - } - if (ti = as->parms[2].items) { /* -noconvert */ - if (strcmp(ti->data, "on") == 0) - mode = 2; - else if (strcmp(ti->data, "off") == 0) - mode = 3; - else { - fprintf(stderr, "Illegal argument %s\n", ti->data); - return 1; - } - } - if (ti = as->parms[3].items) { /* -uidcheck */ - if (strcmp(ti->data, "on") == 0) - pwsync = 3; - else if (strcmp(ti->data, "off") == 0) - pwsync = 2; - else { - fprintf(stderr, "Illegal argument %s\n", ti->data); - return 1; - } - } - if (ti = as->parms[4].items) { /* -submounts */ - if (strcmp(ti->data, "on") == 0) - smounts = 3; - else if (strcmp(ti->data, "off") == 0) - smounts = 2; - else { - fprintf(stderr, "Illegal argument %s\n", ti->data); - return 1; - } - } - exportcall = (type << 24) | (mode << 6) | (pwsync << 4) | (smounts << 2) | export; - type &= ~0x70; - /* make the call */ - blob.in = (char *) &exportcall; - blob.in_size = sizeof(afs_int32); - blob.out = (char *) &exportcall; - blob.out_size = sizeof(afs_int32); - code = pioctl(0, VIOC_EXPORTAFS, &blob, 1); - if (code) { - if (errno == ENODEV) { - fprintf(stderr, - "Sorry, the %s-exporter type is currently not supported on this AFS client\n", exported_types[type]); - } else { - Die(errno, 0); - } - return 1; - } else { - if (!gstat) { - if (exportcall & 1) { - printf("'%s' translator is enabled with the following options:\n\tRunning in %s mode\n\tRunning in %s mode\n\t%s\n", - exported_types[type], (exportcall & 2 ? "strict unix" : "convert owner mode bits to world/other"), - (exportcall & 4 ? "strict 'passwd sync'" : "no 'passwd sync'"), - (exportcall & 8 ? "Allow mounts of /afs/.. subdirs" : "Only mounts to /afs allowed")); - } else { - printf("'%s' translator is disabled\n", exported_types[type]); - } - } - } - return 0; -} - - -static int -GetCellCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct afsconf_cell info; - struct cmd_item *ti; - struct a { - afs_int32 stat; - afs_int32 junk; - } args; - int error = 0; - - memset(&args, 0, sizeof(args)); /* avoid Purify UMR error */ - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per cell */ - blob.out_size = sizeof(args); - blob.out = (caddr_t) &args; - code = GetCellName(ti->data, &info); - if (code) { - error = 1; - continue; - } - blob.in_size = 1+strlen(info.name); - blob.in = info.name; - code = pioctl(0, VIOC_GETCELLSTATUS, &blob, 1); - if (code) { - if (errno == ENOENT) - fprintf(stderr,"%s: the cell named '%s' does not exist\n", pn, info.name); - else - Die(errno, info.name); - error = 1; - continue; - } - printf("Cell %s status: ", info.name); -#ifdef notdef - if (args.stat & 1) - printf("primary "); -#endif - if (args.stat & 2) - printf("no setuid allowed"); - else - printf("setuid allowed"); - if (args.stat & 4) - printf(", using old VLDB"); - printf("\n"); - } - return error; -} - -static int SetCellCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct afsconf_cell info; - struct cmd_item *ti; - struct a { - afs_int32 stat; - afs_int32 junk; - char cname[64]; - } args; - int error = 0; - - /* Check arguments. */ - if (as->parms[1].items && as->parms[2].items) { - fprintf(stderr, "Cannot specify both -suid and -nosuid.\n"); - return 1; - } - - /* figure stuff to set */ - args.stat = 0; - args.junk = 0; - -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else /* WIN32 */ - if (geteuid()) { - fprintf (stderr,"Permission denied: requires root access.\n"); - return EACCES; - } -#endif /* WIN32 */ - - if (! as->parms[1].items) - args.stat |= CM_SETCELLFLAG_SUID; /* default to -nosuid */ - - /* set stat for all listed cells */ - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per cell */ - code = GetCellName(ti->data, &info); - if (code) { - error = 1; - continue; - } - strcpy(args.cname, info.name); - blob.in_size = sizeof(args); - blob.in = (caddr_t) &args; - blob.out_size = 0; - blob.out = (caddr_t) 0; - code = pioctl(0, VIOC_SETCELLSTATUS, &blob, 1); - if (code) { - Die(errno, info.name); /* XXX added cell name to Die() call */ - error = 1; - } - } - return error; -} - -#ifdef WIN32 -static int -GetCellName(char *cellNamep, struct afsconf_cell *infop) -{ - strcpy(infop->name, cellNamep); - return 0; -} - -static int -VLDBInit(int noAuthFlag, struct afsconf_cell *infop) -{ - return 0; -} -#else /* not WIN32 */ -static int -GetCellName(char *cellName, struct afsconf_cell *info) -{ - struct afsconf_dir *tdir; - int code; - - tdir = afsconf_Open(AFSDIR_CLIENT_ETC_CLIENTNAME); - if (!tdir) { - fprintf(stderr, - "Could not process files in configuration directory (%s).\n", - AFSDIR_CLIENT_ETC_CLIENTNAME); - return -1; - } - - code = afsconf_GetCellInfo(tdir, cellName, AFSCONF_VLDBSERVICE, info); - if (code) { - fprintf(stderr,"fs: cell %s not in %s/CellServDB\n", cellName, - AFSDIR_CLIENT_ETC_CLIENTNAME); - return code; - } - - return 0; -} - - -static int -VLDBInit(int noAuthFlag, struct afsconf_cell *info) -{ - afs_int32 code; - - code = ugen_ClientInit(noAuthFlag, AFSDIR_CLIENT_ETC_DIRPATH, - info->name, 0, &uclient, - NULL, pn, rxkad_clear, - VLDB_MAXSERVERS, AFSCONF_VLDBSERVICE, 50, - 0, 0, USER_SERVICE_ID); - rxInitDone = 1; - return code; -} -#endif /* not WIN32 */ - -static struct ViceIoctl gblob; -static int debug = 0; -/* - * here follow some routines in suport of the setserverprefs and - * getserverprefs commands. They are: - * SetPrefCmd "top-level" routine - * addServer adds a server to the list of servers to be poked into the - * kernel. Will poke the list into the kernel if it threatens - * to get too large. - * pokeServers pokes the existing list of servers and ranks into the kernel - * GetPrefCmd reads the Cache Manager's current list of server ranks - */ - -#ifdef WIN32 -static int -pokeServers(void) -{ - int code; - cm_SSetPref_t *ssp; - code = pioctl(0, VIOC_SETSPREFS, &gblob, 1); - - ssp = (cm_SSetPref_t *)space; - gblob.in_size = ((char *)&(ssp->servers[0])) - (char *)ssp; - gblob.in = space; - return code; -} -#else -/* - * returns -1 if error message printed, - * 0 on success, - * errno value if error and no error message printed - */ -static int -pokeServers(void) -{ - int code; - - code = pioctl(0, VIOC_SETSPREFS, &gblob, 1); - if (code && (errno == EINVAL)) { - struct setspref *ssp; - ssp = (struct setspref *)gblob.in; - if (!(ssp->flags & DBservers)) { - gblob.in = (void *)&(ssp->servers[0]); - gblob.in_size -= ((char *)&(ssp->servers[0])) - (char *)ssp; - code = pioctl(0, VIOC_SETSPREFS33, &gblob, 1); - return code ? errno : 0; - } - fprintf(stderr, - "This cache manager does not support VL server preferences.\n"); - return -1; - } - - return code ? errno : 0; -} -#endif /* WIN32 */ - -#ifdef WIN32 -static int -addServer(char *name, unsigned short rank) -{ - int code; - cm_SSetPref_t *ssp; - cm_SPref_t *sp; - struct hostent *thostent; - -#ifndef MAXUSHORT -#ifdef MAXSHORT -#define MAXUSHORT ((unsigned short) 2*MAXSHORT+1) /* assumes two's complement binary system */ -#else -#define MAXUSHORT ((unsigned short) ~0) -#endif -#endif - - code = 0; - thostent = hostutil_GetHostByName(name); - if (!thostent) { - fprintf (stderr, "%s: couldn't resolve name.\n", name); - return EINVAL; - } - - ssp = (cm_SSetPref_t *)(gblob.in); - - if (gblob.in_size > MAXINSIZE - sizeof(cm_SPref_t)) { - code = pokeServers(); - ssp->num_servers = 0; - } - - sp = (cm_SPref_t *)((char*)gblob.in + gblob.in_size); - memcpy (&(sp->host.s_addr), thostent->h_addr, sizeof(afs_uint32)); - sp->rank = (rank > MAXUSHORT ? MAXUSHORT : rank); - gblob.in_size += sizeof(cm_SPref_t); - ssp->num_servers++; - - if (debug) fprintf(stderr, "adding server %s, rank %d, ip addr 0x%lx\n",name,sp->rank,sp->host.s_addr); - - return code; -} -#else -/* - * returns -1 if error message printed, - * 0 on success, - * errno value if error and no error message printed - */ -static int -addServer(char *name, afs_int32 rank) -{ - int t, code; - struct setspref *ssp; - struct spref *sp; - struct hostent *thostent; - afs_uint32 addr; - int error = 0; - -#ifndef MAXUSHORT -#ifdef MAXSHORT -#define MAXUSHORT ((unsigned short) 2*MAXSHORT+1) /* assumes two's complement binary system */ -#else -#define MAXUSHORT ((unsigned short) ~0) -#endif -#endif - - thostent = hostutil_GetHostByName(name); - if (!thostent) { - fprintf(stderr, "%s: couldn't resolve name.\n", name); - return -1; - } - - ssp = (struct setspref *)(gblob.in); - - for (t = 0; thostent->h_addr_list[t]; t++) { - if (gblob.in_size > MAXINSIZE - sizeof(struct spref)) { - code = pokeServers(); - if (code) - error = code; - ssp->num_servers = 0; - } - - sp = (struct spref *)(gblob.in + gblob.in_size); - memcpy(&(sp->server.s_addr), thostent->h_addr_list[t], - sizeof(afs_uint32)); - sp->rank = (rank > MAXUSHORT ? MAXUSHORT : rank); - gblob.in_size += sizeof(struct spref); - ssp->num_servers++; - - if (debug) - fprintf(stderr, "adding server %s, rank %d, ip addr 0x%lx\n", - name, sp->rank, sp->server.s_addr); - } - - return error; -} -#endif /* WIN32 */ - -#ifdef WIN32 -static BOOL IsWindowsNT (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsWinNT = FALSE; - - if (!fChecked) - { - OSVERSIONINFO Version; - - fChecked = TRUE; - - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - - if (GetVersionEx (&Version)) - { - if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) - fIsWinNT = TRUE; - } - } - return fIsWinNT; -} -#endif /* WIN32 */ - -#ifdef WIN32 -static int -SetPrefCmd(struct cmd_syndesc *as, char * arock) -{ - FILE *infd; - afs_int32 code; - struct cmd_item *ti; - char name[80]; - afs_int32 rank; - cm_SSetPref_t *ssp; - - ssp = (cm_SSetPref_t *)space; - ssp->flags = 0; - ssp->num_servers = 0; - gblob.in_size = ((char*)&(ssp->servers[0])) - (char *)ssp; - gblob.in = space; - gblob.out = space; - gblob.out_size = MAXSIZE; - - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } - - code = 0; - - ti = as->parms[2].items; /* -file */ - if (ti) { - if (debug) fprintf(stderr,"opening file %s\n",ti->data); - if (!(infd = fopen(ti->data,"r" ))) { - code = errno; - Die(errno,ti->data); - } - else - while ( fscanf(infd, "%79s%ld", name, &rank) != EOF) { - code = addServer (name, (unsigned short) rank); - } - } - - ti = as->parms[3].items; /* -stdin */ - if (ti) { - while ( scanf("%79s%ld", name, &rank) != EOF) { - code = addServer (name, (unsigned short) rank); - } - } - - for (ti = as->parms[0].items;ti;ti=ti->next) {/*list of servers, ranks */ - if (ti) { - if (!ti->next) { - break; - } - code = addServer (ti->data, (unsigned short) atol(ti->next->data)); - if (debug) - printf("set fs prefs %s %s\n", ti->data, ti->next->data); - ti=ti->next; - } - } - code = pokeServers(); - if (debug) - printf("now working on vlservers, code=%d, errno=%d\n",code,errno); - - ssp = (cm_SSetPref_t *)space; - gblob.in_size = ((char*)&(ssp->servers[0])) - (char *)ssp; - gblob.in = space; - ssp->flags = CM_SPREF_VLONLY; - ssp->num_servers = 0; - - for (ti = as->parms[1].items;ti;ti=ti->next) { /* list of dbservers, ranks */ - if (ti) { - if (!ti->next) { - break; - } - code = addServer (ti->data, (unsigned short) atol(ti->next->data)); - if (debug) - printf("set vl prefs %s %s\n", ti->data, ti->next->data); - ti=ti->next; - } - } - - if (as->parms[1].items) { - if (debug) - printf("now poking vlservers\n"); - code = pokeServers(); - } - - if (code) - Die(errno,0); - - return code; -} -#else -static int -SetPrefCmd(struct cmd_syndesc *as, char *arock) -{ - FILE *infd; - afs_int32 code; - struct cmd_item *ti; - char name[80]; - afs_int32 rank; - struct setspref *ssp; - int error = 0; /* -1 means error message printed, - * >0 means errno value for unprinted message */ - - ssp = (struct setspref *)space; - ssp->flags = 0; - ssp->num_servers = 0; - gblob.in_size = ((char *)&(ssp->servers[0])) - (char *)ssp; - gblob.in = space; - gblob.out = space; - gblob.out_size = MAXSIZE; - - - if (geteuid()) { - fprintf(stderr, "Permission denied: requires root access.\n"); - return 1; - } - - ti = as->parms[2].items; /* -file */ - if (ti) { - if (debug) - fprintf(stderr, "opening file %s\n", ti->data); - if (!(infd = fopen(ti->data, "r"))) { - perror(ti->data); - error = -1; - } else { - while (fscanf(infd, "%79s%ld", name, &rank) != EOF) { - code = addServer(name, (unsigned short)rank); - if (code) - error = code; - } - } - } - - ti = as->parms[3].items; /* -stdin */ - if (ti) { - while (scanf("%79s%ld", name, &rank) != EOF) { - code = addServer(name, (unsigned short)rank); - if (code) - error = code; - } - } - - for (ti = as->parms[0].items; ti; ti = ti->next) { /* list of servers, ranks */ - if (ti) { - if (!ti->next) { - break; - } - code = addServer(ti->data, (unsigned short)atol(ti->next->data)); - if (code) - error = code; - if (debug) - printf("set fs prefs %s %s\n", ti->data, ti->next->data); - ti = ti->next; - } - } - code = pokeServers(); - if (code) - error = code; - if (debug) - printf("now working on vlservers, code=%d\n", code); - - ssp = (struct setspref *)space; - ssp->flags = DBservers; - ssp->num_servers = 0; - gblob.in_size = ((char *)&(ssp->servers[0])) - (char *)ssp; - gblob.in = space; - - for (ti = as->parms[1].items; ti; ti = ti->next) { /* list of dbservers, ranks */ - if (ti) { - if (!ti->next) { - break; - } - code = addServer(ti->data, (unsigned short)atol(ti->next->data)); - if (code) - error = code; - if (debug) - printf("set vl prefs %s %s\n", ti->data, ti->next->data); - ti = ti->next; - } - } - - if (as->parms[1].items) { - if (debug) - printf("now poking vlservers\n"); - code = pokeServers(); - if (code) - error = code; - } - - if (error > 0) - Die(error, 0); - - return error ? 1 : 0; -} -#endif /* WIN32 */ - -#ifdef WIN32 -static int -GetPrefCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct cmd_item *ti; - char *name, tbuffer[20]; - afs_int32 addr; - FILE * outfd; - int resolve; - int vlservers; - struct ViceIoctl blob; - struct cm_SPrefRequest *in; - struct cm_SPrefInfo *out; - int i; - - code = 0; - ti = as->parms[0].items; /* -file */ - if (ti) { - if (debug) fprintf(stderr,"opening file %s\n",ti->data); - if (!(outfd = freopen(ti->data,"w",stdout))) { - Die(errno,ti->data); - return errno; - } - } - - ti = as->parms[1].items; /* -numeric */ - resolve = !(ti); - ti = as->parms[2].items; /* -vlservers */ - vlservers = (ti ? CM_SPREF_VLONLY : 0); - /* ti = as->parms[3].items; -cell */ - - in = (struct cm_SPrefRequest *)space; - in->offset = 0; - - do { - blob.in_size=sizeof(struct cm_SPrefRequest); - blob.in = (char *)in; - blob.out = space; - blob.out_size = MAXSIZE; - - in->num_servers = (MAXSIZE - 2*sizeof(short))/sizeof(struct cm_SPref); - in->flags = vlservers; - - code = pioctl(0, VIOC_GETSPREFS, &blob, 1); - if (code){ - perror("getserverprefs pioctl"); - Die (errno,0); - } - else { - out = (struct cm_SPrefInfo *) blob.out; - - for (i=0;inum_servers;i++) { - if (resolve) { - name = hostutil_GetNameByINet(out->servers[i].host.s_addr); - } - else { - addr = ntohl(out->servers[i].host.s_addr); - sprintf(tbuffer, "%d.%d.%d.%d", (addr>>24) & 0xff, (addr>>16) & 0xff, - (addr>>8) & 0xff, addr & 0xff); - name=tbuffer; - } - printf ("%-50s %5u\n",name,out->servers[i].rank); - } - - in->offset = out->next_offset; - } - } while (!code && out->next_offset > 0); - - return code; -} -#else -static int -GetPrefCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct cmd_item *ti; - char *name, tbuffer[20]; - afs_int32 rank, addr; - FILE *outfd; - int resolve; - int vlservers = 0; - struct ViceIoctl blob; - struct sprefrequest *in; - struct sprefinfo *out; - int i; - - ti = as->parms[0].items; /* -file */ - if (ti) { - if (debug) - fprintf(stderr, "opening file %s\n", ti->data); - if (!(outfd = freopen(ti->data, "w", stdout))) { - perror(ti->data); - return 1; - } - } - - ti = as->parms[1].items; /* -numeric */ - resolve = !(ti); - ti = as->parms[2].items; /* -vlservers */ - vlservers |= (ti ? DBservers : 0); - /* ti = as->parms[3].items; -cell */ - - in = (struct sprefrequest *)space; - in->offset = 0; - - do { - blob.in_size = sizeof(struct sprefrequest); - blob.in = (char *)in; - blob.out = space; - blob.out_size = MAXSIZE; - - in->num_servers = - (MAXSIZE - 2 * sizeof(short)) / sizeof(struct spref); - in->flags = vlservers; - - code = pioctl(0, VIOC_GETSPREFS, &blob, 1); - if (code) { - perror("getserverprefs pioctl"); - return 1; - } - - out = (struct sprefinfo *)blob.out; - - for (i = 0; i < out->num_servers; i++) { - if (resolve) { - name = hostutil_GetNameByINet(out->servers[i].server.s_addr); - } else { - addr = ntohl(out->servers[i].server.s_addr); - sprintf(tbuffer, "%d.%d.%d.%d", (addr >> 24) & 0xff, - (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); - name = tbuffer; - } - printf("%-50s %5u\n", name, out->servers[i].rank); - } - - in->offset = out->next_offset; - } while (out->next_offset > 0); - - return 0; -} -#endif /* WIN32 */ - -static int -TraceCmd(struct cmd_syndesc *asp, char *arock) -{ - long code; - struct ViceIoctl blob; - long inValue; - long outValue; - -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#else /* WIN32 */ - if (geteuid()) { - fprintf (stderr,"Permission denied: requires root access.\n"); - return EACCES; - } -#endif /* WIN32 */ - - if ((asp->parms[0].items && asp->parms[1].items)) { - fprintf(stderr, "fs trace: must use at most one of '-off' or '-on'\n"); - return EINVAL; - } - - /* determine if we're turning this tracing on or off */ - inValue = 0; - if (asp->parms[0].items) - inValue = 3; /* enable */ - else if (asp->parms[1].items) - inValue = 2; /* disable */ - if (asp->parms[2].items) - inValue |= 4; /* do reset */ - if (asp->parms[3].items) - inValue |= 8; /* dump */ - - blob.in_size = sizeof(long); - blob.in = (char *) &inValue; - blob.out_size = sizeof(long); - blob.out = (char *) &outValue; - - code = pioctl(NULL, VIOC_TRACECTL, &blob, 1); - if (code) { - Die(errno, NULL); - return code; - } - - if (outValue) - printf("AFS tracing enabled.\n"); - else - printf("AFS tracing disabled.\n"); - - return 0; -} - -static void sbusage(void) -{ - fprintf(stderr, "example usage: %s storebehind -files *.o -kb 99999 -default 0\n", pn); - fprintf(stderr, " %s sb 50000 *.[ao] -default 10\n", pn); -} - -/* fs sb -kbytes 9999 -files *.o -default 64 */ -static int -StoreBehindCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code = 0; - struct ViceIoctl blob; - struct cmd_item *ti; - struct sbstruct tsb, tsb2; - int verbose = 0; - afs_int32 allfiles; - char *t; - int error = 0; - -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#endif /* WIN32 */ - - tsb.sb_thisfile = -1; - ti = as->parms[0].items; /* -kbytes */ - if (ti) { - if (!as->parms[1].items) { - fprintf(stderr, "%s: you must specify -files with -kbytes.\n", - pn); - return 1; - } - tsb.sb_thisfile = strtol(ti->data, &t, 10) * 1024; - if ((tsb.sb_thisfile < 0) || (t != ti->data + strlen(ti->data))) { - fprintf(stderr, "%s: %s must be 0 or a positive number.\n", pn, - ti->data); - return 1; - } - } - - allfiles = tsb.sb_default = -1; /* Don't set allfiles yet */ - ti = as->parms[2].items; /* -allfiles */ - if (ti) { - allfiles = strtol(ti->data, &t, 10) * 1024; - if ((allfiles < 0) || (t != ti->data + strlen(ti->data))) { - fprintf(stderr, "%s: %s must be 0 or a positive number.\n", pn, - ti->data); - return 1; - } - } - - /* -verbose or -file only or no options */ - if (as->parms[3].items || (as->parms[1].items && !as->parms[0].items) - || (!as->parms[0].items && !as->parms[1].items - && !as->parms[2].items)) - verbose = 1; - - blob.in = (char *)&tsb; - blob.out = (char *)&tsb2; - blob.in_size = blob.out_size = sizeof(struct sbstruct); - memset(&tsb2, 0, sizeof(tsb2)); - - /* once per -file */ - for (ti = as->parms[1].items; ti; ti = ti->next) { - /* Do this solely to see if the file is there */ - code = pioctl(ti->data, VIOCWHEREIS, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - - code = pioctl(ti->data, VIOC_STOREBEHIND, &blob, 1); - if (code) { - Die(errno, ti->data); - error = 1; - continue; - } - - if (verbose && (blob.out_size == sizeof(tsb2))) { - if (tsb2.sb_thisfile == -1) { - fprintf(stdout, "Will store %s according to default.\n", - ti->data); - } else { - fprintf(stdout, - "Will store up to %d kbytes of %s asynchronously.\n", - (tsb2.sb_thisfile / 1024), ti->data); - } - } - } - - /* If no files - make at least one pioctl call, or - * set the allfiles default if we need to. - */ - if (!as->parms[1].items || (allfiles != -1)) { - tsb.sb_default = allfiles; - code = pioctl(0, VIOC_STOREBEHIND, &blob, 1); - if (code) { - Die(errno, ((allfiles == -1) ? 0 : "-allfiles")); - error = 1; - } - } - - /* Having no arguments also reports the default store asynchrony */ - if (verbose && (blob.out_size == sizeof(tsb2))) { - fprintf(stdout, "Default store asynchrony is %d kbytes.\n", - (tsb2.sb_default / 1024)); - } - - return error; -} - -static afs_int32 -SetCryptCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code = 0, flag; - struct ViceIoctl blob; - char *tp; - -#ifdef WIN32 - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - return EACCES; - } -#endif /* WIN32 */ - - tp = as->parms[0].items->data; - if (strcmp(tp, "on") == 0) - flag = 1; - else if (strcmp(tp, "off") == 0) - flag = 0; - else { - fprintf (stderr, "%s: %s must be \"on\" or \"off\".\n", pn, tp); - return EINVAL; - } - - blob.in = (char *) &flag; - blob.in_size = sizeof(flag); - blob.out_size = 0; - code = pioctl(0, VIOC_SETRXKCRYPT, &blob, 1); - if (code) - Die(code, NULL); - return 0; -} - -static afs_int32 -GetCryptCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code = 0, flag; - struct ViceIoctl blob; - char *tp; - - blob.in = NULL; - blob.in_size = 0; - blob.out_size = sizeof(flag); - blob.out = space; - - code = pioctl(0, VIOC_GETRXKCRYPT, &blob, 1); - - if (code) - Die(code, NULL); - else { - tp = space; - memcpy(&flag, tp, sizeof(afs_int32)); - printf("Security level is currently "); - if (flag == 1) - printf("crypt (data security).\n"); - else - printf("clear.\n"); - } - return 0; -} - -static int -MemDumpCmd(struct cmd_syndesc *asp, char *arock) -{ - long code; - struct ViceIoctl blob; - long inValue; - long outValue; - - if ((asp->parms[0].items && asp->parms[1].items)) { - fprintf(stderr, "%s trace: must use at most one of '-begin' or '-end'\n", pn); - return EINVAL; - } - - /* determine if we're turning this tracing on or off */ - inValue = 0; - if (asp->parms[0].items) - inValue = 1; /* begin */ - else if (asp->parms[1].items) - inValue = 0; /* end */ - - blob.in_size = sizeof(long); - blob.in = (char *) &inValue; - blob.out_size = sizeof(long); - blob.out = (char *) &outValue; - - code = pioctl(NULL, VIOC_TRACEMEMDUMP, &blob, 1); - if (code) { - Die(errno, NULL); - return code; - } - - if (outValue) printf("AFS memdump begin.\n"); - else printf("AFS memdump end.\n"); - - return 0; -} - -static int -CSCPolicyCmd(struct cmd_syndesc *asp, char *arock) -{ - struct cmd_item *ti; - char *share = NULL; - HKEY hkCSCPolicy; - - for(ti=asp->parms[0].items; ti;ti=ti->next) { - share = ti->data; - if (share) - { - break; - } - } - - if (share) - { - char *policy; - - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\CSCPolicy", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hkCSCPolicy, - NULL ); - - if ( hkCSCPolicy == NULL ) { - fprintf (stderr,"Permission denied: requires Administrator access.\n"); - return EACCES; - } - - if ( !IsAdmin() ) { - fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); - RegCloseKey(hkCSCPolicy); - return EACCES; - } - - policy = "manual"; - - if (asp->parms[1].items) - policy = "manual"; - if (asp->parms[2].items) - policy = "programs"; - if (asp->parms[3].items) - policy = "documents"; - if (asp->parms[4].items) - policy = "disable"; - - RegSetValueEx( hkCSCPolicy, share, 0, REG_SZ, policy, strlen(policy)+1); - - printf("CSC policy on share \"%s\" changed to \"%s\".\n\n", share, policy); - printf("Close all applications that accessed files on this share or restart AFS Client for the change to take effect.\n"); - } - else - { - DWORD dwIndex, dwPolicies; - char policyName[256]; - DWORD policyNameLen; - char policy[256]; - DWORD policyLen; - DWORD dwType; - - /* list current csc policies */ - - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\CSCPolicy", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_QUERY_VALUE, - NULL, - &hkCSCPolicy, - NULL ); - - RegQueryInfoKey( hkCSCPolicy, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwPolicies, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - printf("Current CSC policies:\n"); - for ( dwIndex = 0; dwIndex < dwPolicies; dwIndex ++ ) { - - policyNameLen = sizeof(policyName); - policyLen = sizeof(policy); - RegEnumValue( hkCSCPolicy, dwIndex, policyName, &policyNameLen, NULL, - &dwType, policy, &policyLen); - - printf(" %s = %s\n", policyName, policy); - } - } - - RegCloseKey(hkCSCPolicy); - return (0); -} - -#ifndef WIN32 -/* get clients interface addresses */ -static int -GetClientAddrsCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct cmd_item *ti; - char *name; - struct ViceIoctl blob; - struct sprefrequest *in; - struct sprefinfo *out; - - in = (struct sprefrequest *)space; - in->offset = 0; - - do { - blob.in_size = sizeof(struct sprefrequest); - blob.in = (char *)in; - blob.out = space; - blob.out_size = MAXSIZE; - - in->num_servers = - (MAXSIZE - 2 * sizeof(short)) / sizeof(struct spref); - /* returns addr in network byte order */ - code = pioctl(0, VIOC_GETCPREFS, &blob, 1); - if (code) { - perror("getClientInterfaceAddr pioctl"); - return 1; - } - - { - int i; - out = (struct sprefinfo *)blob.out; - for (i = 0; i < out->num_servers; i++) { - afs_int32 addr; - char tbuffer[32]; - addr = ntohl(out->servers[i].server.s_addr); - sprintf(tbuffer, "%d.%d.%d.%d", (addr >> 24) & 0xff, - (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); - printf("%-50s\n", tbuffer); - } - in->offset = out->next_offset; - } - } while (out->next_offset > 0); - - return 0; -} - -static int -SetClientAddrsCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code, addr; - struct cmd_item *ti; - char name[80]; - struct ViceIoctl blob; - struct setspref *ssp; - int sizeUsed = 0, i, flag; - afs_int32 existingAddr[1024]; /* existing addresses on this host */ - int existNu; - int error = 0; - - ssp = (struct setspref *)space; - ssp->num_servers = 0; - blob.in = space; - blob.out = space; - blob.out_size = MAXSIZE; - - if (geteuid()) { - fprintf(stderr, "Permission denied: requires root access.\n"); - return 1; - } - - /* extract all existing interface addresses */ - existNu = rx_getAllAddr(existingAddr, 1024); - if (existNu < 0) - return 1; - - sizeUsed = sizeof(struct setspref); /* space used in ioctl buffer */ - for (ti = as->parms[0].items; ti; ti = ti->next) { - if (sizeUsed >= sizeof(space)) { - fprintf(stderr, "No more space\n"); - return 1; - } - addr = extractAddr(ti->data, 20); /* network order */ - if ((addr == AFS_IPINVALID) || (addr == AFS_IPINVALIDIGNORE)) { - fprintf(stderr, "Error in specifying address: %s..ignoring\n", - ti->data); - error = 1; - continue; - } - /* see if it is an address that really exists */ - for (flag = 0, i = 0; i < existNu; i++) - if (existingAddr[i] == addr) { - flag = 1; - break; - } - if (!flag) { /* this is an nonexistent address */ - fprintf(stderr, "Nonexistent address: 0x%08x..ignoring\n", addr); - error = 1; - continue; - } - /* copy all specified addr into ioctl buffer */ - (ssp->servers[ssp->num_servers]).server.s_addr = addr; - printf("Adding 0x%08x\n", addr); - ssp->num_servers++; - sizeUsed += sizeof(struct spref); - } - if (ssp->num_servers < 1) { - fprintf(stderr, "No addresses specified\n"); - return 1; - } - blob.in_size = sizeUsed - sizeof(struct spref); - - code = pioctl(0, VIOC_SETCPREFS, &blob, 1); /* network order */ - if (code) { - Die(errno, 0); - error = 1; - } - - return error; -} - -static int -FlushMountCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - struct ViceIoctl blob; - struct cmd_item *ti; - char orig_name[1024]; /*Original name, may be modified */ - char true_name[1024]; /*``True'' dirname (e.g., symlink target) */ - char parent_dir[1024]; /*Parent directory of true name */ - char *last_component; /*Last component of true name */ - struct stat statbuff; /*Buffer for status info */ - int link_chars_read; /*Num chars read in readlink() */ - int thru_symlink; /*Did we get to a mount point via a symlink? */ - int error = 0; - - for (ti = as->parms[0].items; ti; ti = ti->next) { - /* once per file */ - thru_symlink = 0; - sprintf(orig_name, "%s%s", (ti->data[0] == '/') ? "" : "./", - ti->data); - - if (lstat(orig_name, &statbuff) < 0) { - /* if lstat fails, we should still try the pioctl, since it - * may work (for example, lstat will fail, but pioctl will - * work if the volume of offline (returning ENODEV). */ - statbuff.st_mode = S_IFDIR; /* lie like pros */ - } - - /* - * The lstat succeeded. If the given file is a symlink, substitute - * the file name with the link name. - */ - if ((statbuff.st_mode & S_IFMT) == S_IFLNK) { - thru_symlink = 1; - /* - * Read name of resolved file. - */ - link_chars_read = readlink(orig_name, true_name, 1024); - if (link_chars_read <= 0) { - fprintf(stderr, - "%s: Can't read target name for '%s' symbolic link!\n", - pn, orig_name); - error = 1; - continue; - } - - /* - * Add a trailing null to what was read, bump the length. - */ - true_name[link_chars_read++] = 0; - - /* - * If the symlink is an absolute pathname, we're fine. Otherwise, we - * have to create a full pathname using the original name and the - * relative symlink name. Find the rightmost slash in the original - * name (we know there is one) and splice in the symlink value. - */ - if (true_name[0] != '/') { - last_component = (char *)strrchr(orig_name, '/'); - strcpy(++last_component, true_name); - strcpy(true_name, orig_name); - } - } else - strcpy(true_name, orig_name); - - /* - * Find rightmost slash, if any. - */ - last_component = (char *)strrchr(true_name, '/'); - if (last_component) { - /* - * Found it. Designate everything before it as the parent directory, - * everything after it as the final component. - */ - strncpy(parent_dir, true_name, last_component - true_name); - parent_dir[last_component - true_name] = 0; - last_component++; /*Skip the slash */ - } else { - /* - * No slash appears in the given file name. Set parent_dir to the current - * directory, and the last component as the given name. - */ - strcpy(parent_dir, "."); - last_component = true_name; - } - - if (strcmp(last_component, ".") == 0 - || strcmp(last_component, "..") == 0) { - fprintf(stderr, - "%s: you may not use '.' or '..' as the last component\n", - pn); - fprintf(stderr, "%s: of a name in the 'fs flushmount' command.\n", - pn); - error = 1; - continue; - } - - blob.in = last_component; - blob.in_size = strlen(last_component) + 1; - blob.out_size = 0; - memset(space, 0, MAXSIZE); - - code = pioctl(parent_dir, VIOC_AFS_FLUSHMOUNT, &blob, 1); - - if (code != 0) { - if (errno == EINVAL) { - fprintf(stderr, "'%s' is not a mount point.\n", ti->data); - } else { - Die(errno, (ti->data ? ti->data : parent_dir)); - } - error = 1; - } - } - return error; -} - -static int -RxStatProcCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - afs_int32 flags = 0; - struct ViceIoctl blob; - struct cmd_item *ti; - - if (as->parms[0].items) { /* -enable */ - flags |= AFSCALL_RXSTATS_ENABLE; - } - if (as->parms[1].items) { /* -disable */ - flags |= AFSCALL_RXSTATS_DISABLE; - } - if (as->parms[2].items) { /* -clear */ - flags |= AFSCALL_RXSTATS_CLEAR; - } - if (flags == 0) { - fprintf(stderr, "You must specify at least one argument\n"); - return 1; - } - - blob.in = (char *)&flags; - blob.in_size = sizeof(afs_int32); - blob.out_size = 0; - - code = pioctl(NULL, VIOC_RXSTAT_PROC, &blob, 1); - if (code != 0) { - Die(errno, NULL); - return 1; - } - - return 0; -} - -static int -RxStatPeerCmd(struct cmd_syndesc *as, char *arock) -{ - afs_int32 code; - afs_int32 flags = 0; - struct ViceIoctl blob; - struct cmd_item *ti; - - if (as->parms[0].items) { /* -enable */ - flags |= AFSCALL_RXSTATS_ENABLE; - } - if (as->parms[1].items) { /* -disable */ - flags |= AFSCALL_RXSTATS_DISABLE; - } - if (as->parms[2].items) { /* -clear */ - flags |= AFSCALL_RXSTATS_CLEAR; - } - if (flags == 0) { - fprintf(stderr, "You must specify at least one argument\n"); - return 1; - } - - blob.in = (char *)&flags; - blob.in_size = sizeof(afs_int32); - blob.out_size = 0; - - code = pioctl(NULL, VIOC_RXSTAT_PEER, &blob, 1); - if (code != 0) { - Die(errno, NULL); - return 1; - } - - return 0; -} -#endif /* WIN32 */ - -#ifndef WIN32 -#include "AFS_component_version_number.c" -#endif - -main(int argc, char **argv) -{ - afs_int32 code; - struct cmd_syndesc *ts; - -#ifdef AFS_AIX32_ENV - /* - * The following signal action for AIX is necessary so that in case of a - * crash (i.e. core is generated) we can include the user's data section - * in the core dump. Unfortunately, by default, only a partial core is - * generated which, in many cases, isn't too useful. - */ - struct sigaction nsa; - - sigemptyset(&nsa.sa_mask); - nsa.sa_handler = SIG_DFL; - nsa.sa_flags = SA_FULLDUMP; - sigaction(SIGSEGV, &nsa, NULL); -#endif - -#ifdef WIN32 - WSADATA WSAjunk; - WSAStartup(0x0101, &WSAjunk); -#endif /* WIN32 */ - - /* try to find volume location information */ - osi_Init(); - -#ifndef WIN32 - ts = cmd_CreateSyntax("getclientaddrs", GetClientAddrsCmd, 0, - "get client network interface addresses"); - cmd_CreateAlias(ts, "gc"); - - ts = cmd_CreateSyntax("setclientaddrs", SetClientAddrsCmd, 0, - "set client network interface addresses"); - cmd_AddParm(ts, "-address", CMD_LIST, CMD_OPTIONAL | CMD_EXPANDS, - "client network interfaces"); - cmd_CreateAlias(ts, "sc"); -#endif /* WIN32 */ - - ts = cmd_CreateSyntax("setserverprefs", SetPrefCmd, 0, "set server ranks"); - cmd_AddParm(ts, "-servers", CMD_LIST, CMD_OPTIONAL|CMD_EXPANDS, "fileserver names and ranks"); - cmd_AddParm(ts, "-vlservers", CMD_LIST, CMD_OPTIONAL|CMD_EXPANDS, "VL server names and ranks"); - cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "input from named file"); - cmd_AddParm(ts, "-stdin", CMD_FLAG, CMD_OPTIONAL, "input from stdin"); - cmd_CreateAlias(ts, "sp"); - - ts = cmd_CreateSyntax("getserverprefs", GetPrefCmd, 0, "get server ranks"); - cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "output to named file"); - cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only"); - cmd_AddParm(ts, "-vlservers", CMD_FLAG, CMD_OPTIONAL, "VL servers"); - /* cmd_AddParm(ts, "-cell", CMD_FLAG, CMD_OPTIONAL, "cellname"); */ - cmd_CreateAlias(ts, "gp"); - - ts = cmd_CreateSyntax("setacl", SetACLCmd, 0, "set access control list"); - cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - cmd_AddParm(ts, "-acl", CMD_LIST, 0, "access list entries"); - cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "clear access list"); - cmd_AddParm(ts, "-negative", CMD_FLAG, CMD_OPTIONAL, "apply to negative rights"); - parm_setacl_id = ts->nParms; - cmd_AddParm(ts, "-id", CMD_FLAG, CMD_OPTIONAL, "initial directory acl (DFS only)"); - cmd_AddParm(ts, "-if", CMD_FLAG, CMD_OPTIONAL, "initial file acl (DFS only)"); - cmd_CreateAlias(ts, "sa"); - - ts = cmd_CreateSyntax("listacl", ListACLCmd, 0, "list access control list"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - parm_listacl_id = ts->nParms; - cmd_AddParm(ts, "-id", CMD_FLAG, CMD_OPTIONAL, "initial directory acl"); - cmd_AddParm(ts, "-if", CMD_FLAG, CMD_OPTIONAL, "initial file acl"); - cmd_CreateAlias(ts, "la"); - - ts = cmd_CreateSyntax("cleanacl", CleanACLCmd, 0, "clean up access control list"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - - ts = cmd_CreateSyntax("copyacl", CopyACLCmd, 0, "copy access control list"); - cmd_AddParm(ts, "-fromdir", CMD_SINGLE, 0, "source directory (or DFS file)"); - cmd_AddParm(ts, "-todir", CMD_LIST, 0, "destination directory (or DFS file)"); - cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "first clear dest access list"); - parm_copyacl_id = ts->nParms; - cmd_AddParm(ts, "-id", CMD_FLAG, CMD_OPTIONAL, "initial directory acl"); - cmd_AddParm(ts, "-if", CMD_FLAG, CMD_OPTIONAL, "initial file acl"); - - cmd_CreateAlias(ts, "ca"); - - ts = cmd_CreateSyntax("flush", FlushCmd, 0, "flush file from cache"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - -#ifndef WIN32 - ts = cmd_CreateSyntax("flushmount", FlushMountCmd, 0, - "flush mount symlink from cache"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); -#endif - - ts = cmd_CreateSyntax("setvol", SetVolCmd, 0, "set volume status"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - cmd_AddParm(ts, "-max", CMD_SINGLE, CMD_OPTIONAL, "disk space quota in 1K units"); -#ifdef notdef - cmd_AddParm(ts, "-min", CMD_SINGLE, CMD_OPTIONAL, "disk space guaranteed"); -#endif - cmd_AddParm(ts, "-motd", CMD_SINGLE, CMD_OPTIONAL, "message of the day"); - cmd_AddParm(ts, "-offlinemsg", CMD_SINGLE, CMD_OPTIONAL, "offline message"); - cmd_CreateAlias(ts, "sv"); - - ts = cmd_CreateSyntax("messages", MessagesCmd, 0, "control Cache Manager messages"); - cmd_AddParm(ts, "-show", CMD_SINGLE, CMD_OPTIONAL, "[user|console|all|none]"); - - ts = cmd_CreateSyntax("examine", ExamineCmd, 0, "display file/volume status"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - cmd_CreateAlias(ts, "lv"); - cmd_CreateAlias(ts, "listvol"); - - ts = cmd_CreateSyntax("listquota", ListQuotaCmd, 0, "list volume quota"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - cmd_CreateAlias(ts, "lq"); - - ts = cmd_CreateSyntax("diskfree", DiskFreeCmd, 0, "show server disk space usage"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - cmd_CreateAlias(ts, "df"); - - ts = cmd_CreateSyntax("quota", QuotaCmd, 0, "show volume quota usage"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - - ts = cmd_CreateSyntax("lsmount", ListMountCmd, 0, "list mount point"); - cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - - ts = cmd_CreateSyntax("mkmount", MakeMountCmd, 0, "make mount point"); - cmd_AddParm(ts, "-dir", CMD_SINGLE, 0, "directory"); - cmd_AddParm(ts, "-vol", CMD_SINGLE, 0, "volume name"); - cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); - cmd_AddParm(ts, "-rw", CMD_FLAG, CMD_OPTIONAL, "force r/w volume"); - cmd_AddParm(ts, "-fast", CMD_FLAG, CMD_OPTIONAL, "don't check name with VLDB"); - - /* - * - * defect 3069 - * - cmd_AddParm(ts, "-root", CMD_FLAG, CMD_OPTIONAL, "create cellular mount point"); - */ - - - ts = cmd_CreateSyntax("rmmount", RemoveMountCmd, 0, "remove mount point"); - cmd_AddParm(ts, "-dir", CMD_LIST, 0, "directory"); - - ts = cmd_CreateSyntax("checkservers", CheckServersCmd, 0, "check local cell's servers"); - cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell to check"); - cmd_AddParm(ts, "-all", CMD_FLAG, CMD_OPTIONAL, "check all cells"); - cmd_AddParm(ts, "-fast", CMD_FLAG, CMD_OPTIONAL, "just list, don't check"); - cmd_AddParm(ts,"-interval",CMD_SINGLE,CMD_OPTIONAL,"seconds between probes"); - - ts = cmd_CreateSyntax("checkvolumes", CheckVolumesCmd,0, "check volumeID/name mappings"); - cmd_CreateAlias(ts, "checkbackups"); - - - ts = cmd_CreateSyntax("setcachesize", SetCacheSizeCmd, 0, "set cache size"); - cmd_AddParm(ts, "-blocks", CMD_SINGLE, CMD_OPTIONAL, "size in 1K byte blocks (0 => reset)"); - cmd_CreateAlias(ts, "cachesize"); - - cmd_AddParm(ts, "-reset", CMD_FLAG, CMD_OPTIONAL, "reset size back to boot value"); - - ts = cmd_CreateSyntax("getcacheparms", GetCacheParmsCmd, 0, "get cache usage info"); - - ts = cmd_CreateSyntax("listcells", ListCellsCmd, 0, "list configured cells"); - cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only"); - - ts = cmd_CreateSyntax("setquota", SetQuotaCmd, 0, "set volume quota"); - cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_OPTIONAL, "dir/file path"); - cmd_AddParm(ts, "-max", CMD_SINGLE, 0, "max quota in kbytes"); -#ifdef notdef - cmd_AddParm(ts, "-min", CMD_SINGLE, CMD_OPTIONAL, "min quota in kbytes"); -#endif - cmd_CreateAlias(ts, "sq"); - - ts = cmd_CreateSyntax("newcell", NewCellCmd, 0, "configure new cell"); -#ifndef WIN32 - cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "cell name"); - cmd_AddParm(ts, "-servers", CMD_LIST, CMD_REQUIRED, "primary servers"); - cmd_AddParm(ts, "-linkedcell", CMD_SINGLE, CMD_OPTIONAL, "linked cell name"); - -#ifdef FS_ENABLE_SERVER_DEBUG_PORTS - /* - * Turn this on only if you wish to be able to talk to a server which is listening - * on alternative ports. This is not intended for general use and may not be - * supported in the cache manager. It is not a way to run two servers at the - * same host, since the cache manager cannot properly distinguish those two hosts. - */ - cmd_AddParm(ts, "-fsport", CMD_SINGLE, CMD_OPTIONAL, "cell's fileserver port"); - cmd_AddParm(ts, "-vlport", CMD_SINGLE, CMD_OPTIONAL, "cell's vldb server port"); -#endif - - ts = cmd_CreateSyntax("newalias", NewAliasCmd, 0, - "configure new cell alias"); - cmd_AddParm(ts, "-alias", CMD_SINGLE, 0, "alias name"); - cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "real name of cell"); -#endif - - ts = cmd_CreateSyntax("whichcell", WhichCellCmd, 0, "list file's cell"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - - ts = cmd_CreateSyntax("whereis", WhereIsCmd, 0, "list file's location"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - - ts = cmd_CreateSyntax("wscell", WSCellCmd, 0, "list workstation's cell"); - - /* - ts = cmd_CreateSyntax("primarycell", PrimaryCellCmd, 0, "obsolete (listed primary cell)"); - */ - - ts = cmd_CreateSyntax("monitor", MonitorCmd, 0, "set cache monitor host address"); - cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "host name or 'off'"); - cmd_CreateAlias(ts, "mariner"); - - - ts = cmd_CreateSyntax("getcellstatus", GetCellCmd, 0, "get cell status"); - cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name"); - - ts = cmd_CreateSyntax("setcell", SetCellCmd, 0, "set cell status"); - cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name"); - cmd_AddParm(ts, "-suid", CMD_FLAG, CMD_OPTIONAL, "allow setuid programs"); - cmd_AddParm(ts, "-nosuid", CMD_FLAG, CMD_OPTIONAL, "disallow setuid programs"); - - ts = cmd_CreateSyntax("flushvolume", FlushVolumeCmd, 0, "flush all data in volume"); - cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path"); - - ts = cmd_CreateSyntax("sysname", SysNameCmd, 0, "get/set sysname (i.e. @sys) value"); - cmd_AddParm(ts, "-newsys", CMD_LIST, CMD_OPTIONAL, "new sysname"); - - ts = cmd_CreateSyntax("exportafs", ExportAfsCmd, 0, "enable/disable translators to AFS"); - cmd_AddParm(ts, "-type", CMD_SINGLE, 0, "exporter name"); - cmd_AddParm(ts, "-start", CMD_SINGLE, CMD_OPTIONAL, "start/stop translator ('on' or 'off')"); - cmd_AddParm(ts, "-convert", CMD_SINGLE, CMD_OPTIONAL, "convert from afs to unix mode ('on or 'off')"); - cmd_AddParm(ts, "-uidcheck", CMD_SINGLE, CMD_OPTIONAL, "run on strict 'uid check' mode ('on' or 'off')"); - cmd_AddParm(ts, "-submounts", CMD_SINGLE, CMD_OPTIONAL, "allow nfs mounts to subdirs of /afs/.. ('on' or 'off')"); - - - ts = cmd_CreateSyntax("storebehind", StoreBehindCmd, 0, - "store to server after file close"); - cmd_AddParm(ts, "-kbytes", CMD_SINGLE, CMD_OPTIONAL, "asynchrony for specified names"); - cmd_AddParm(ts, "-files", CMD_LIST, CMD_OPTIONAL, "specific pathnames"); - cmd_AddParm(ts, "-allfiles", CMD_SINGLE, CMD_OPTIONAL, "new default (KB)"); - cmd_CreateAlias(ts, "sb"); - - ts = cmd_CreateSyntax("setcrypt", SetCryptCmd, 0, "set cache manager encryption flag"); - cmd_AddParm(ts, "-crypt", CMD_SINGLE, 0, "on or off"); - - ts = cmd_CreateSyntax("getcrypt", GetCryptCmd, 0, "get cache manager encryption flag"); - -#ifndef WIN32 - ts = cmd_CreateSyntax("rxstatproc", RxStatProcCmd, 0, - "Manage per process RX statistics"); - cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats"); - cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "Disable RX stats"); - cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "Clear RX stats"); - - ts = cmd_CreateSyntax("rxstatpeer", RxStatPeerCmd, 0, - "Manage per peer RX statistics"); - cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats"); - cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "Disable RX stats"); - cmd_AddParm(ts, "-clear", CMD_FLAG, CMD_OPTIONAL, "Clear RX stats"); - - ts = cmd_CreateSyntax("setcbaddr", CallBackRxConnCmd, 0, "configure callback connection address"); - cmd_AddParm(ts, "-addr", CMD_SINGLE, CMD_OPTIONAL, "host name or address"); -#endif - - ts = cmd_CreateSyntax("trace", TraceCmd, 0, "enable or disable CM tracing"); - cmd_AddParm(ts, "-on", CMD_FLAG, CMD_OPTIONAL, "enable tracing"); - cmd_AddParm(ts, "-off", CMD_FLAG, CMD_OPTIONAL, "disable tracing"); - cmd_AddParm(ts, "-reset", CMD_FLAG, CMD_OPTIONAL, "reset log contents"); - cmd_AddParm(ts, "-dump", CMD_FLAG, CMD_OPTIONAL, "dump log contents"); - cmd_CreateAlias(ts, "tr"); - - ts = cmd_CreateSyntax("memdump", MemDumpCmd, 0, "dump memory allocs in debug builds"); - cmd_AddParm(ts, "-begin", CMD_FLAG, CMD_OPTIONAL, "set a memory checkpoint"); - cmd_AddParm(ts, "-end", CMD_FLAG, CMD_OPTIONAL, "dump memory allocs"); - - ts = cmd_CreateSyntax("cscpolicy", CSCPolicyCmd, 0, "change client side caching policy for AFS shares"); - cmd_AddParm(ts, "-share", CMD_SINGLE, CMD_OPTIONAL, "AFS share"); - cmd_AddParm(ts, "-manual", CMD_FLAG, CMD_OPTIONAL, "manual caching of documents"); - cmd_AddParm(ts, "-programs", CMD_FLAG, CMD_OPTIONAL, "automatic caching of programs and documents"); - cmd_AddParm(ts, "-documents", CMD_FLAG, CMD_OPTIONAL, "automatic caching of documents"); - cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "disable caching"); - - code = cmd_Dispatch(argc, argv); - -#ifndef WIN32 - if (rxInitDone) - rx_Finalize(); -#endif /* not WIN32 */ - - return code; -} - -static void -Die(int code, char *filename) -{ /*Die*/ - - if (code == EINVAL) { - if (filename) - fprintf(stderr,"%s: Invalid argument; it is possible that %s is not in AFS.\n", pn, filename); - else - fprintf(stderr,"%s: Invalid argument.\n", pn); - } - else if (code == ENOENT) { - if (filename) - fprintf(stderr,"%s: File '%s' doesn't exist\n", pn, filename); - else - fprintf(stderr,"%s: no such file returned\n", pn); - } - else if (code == EROFS) - fprintf(stderr,"%s: You can not change a backup or readonly volume\n", pn); - else if (code == EACCES || code == EPERM) { - if (filename) - fprintf(stderr,"%s: You don't have the required access rights on '%s'\n", pn, filename); - else - fprintf(stderr,"%s: You do not have the required rights to do this operation\n", pn); - } - else if (code == ENODEV) { - fprintf(stderr,"%s: AFS service may not have started.\n", pn); - } - else if (code == ESRCH) { - fprintf(stderr,"%s: Cell name not recognized.\n", pn); - } - else if (code == EPIPE) { - fprintf(stderr,"%s: Volume name or ID not recognized.\n", pn); - } - else if (code == EFBIG) { - fprintf(stderr,"%s: Cache size too large.\n", pn); - } - else if (code == ETIMEDOUT) { - if (filename) - fprintf(stderr,"%s:'%s': Connection timed out", pn, filename); - else - fprintf(stderr,"%s: Connection timed out", pn); - } - else { - if (filename) - fprintf(stderr,"%s:'%s'", pn, filename); - else - fprintf(stderr,"%s", pn); -#ifdef WIN32 - fprintf(stderr, ": code 0x%x\n", code); -#else /* not WIN32 */ - fprintf(stderr,": %s\n", error_message(code)); -#endif /* not WIN32 */ - } -} /*Die*/ - diff --git a/src/WINNT/afsd/fs.h b/src/WINNT/afsd/fs.h deleted file mode 100644 index 5f2c3bd0a..000000000 --- a/src/WINNT/afsd/fs.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __FS_H_ENV__ -#define __FS_H_ENV__ 1 - -/* some forward references */ -static void ZapList (struct AclEntry *alist); - -static int PruneList (struct AclEntry **ae, int dfs); - -static int CleanAcl(struct Acl *aa, char *fname); - -static int SetVolCmd(struct cmd_syndesc *as, char *arock); - -static int GetCellName(char *cellNamep, struct afsconf_cell *infop); - -static int VLDBInit(int noAuthFlag, struct afsconf_cell *infop); - -static void Die(int code, char *filename); -#endif /* FS_H_ENV */ diff --git a/src/WINNT/afsd/fs.rc b/src/WINNT/afsd/fs.rc deleted file mode 100644 index 5624338e6..000000000 --- a/src/WINNT/afsd/fs.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS File Server Command" -#define AFS_VERINFO_NAME "fs" -#define AFS_VERINFO_FILENAME "fs.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/fs_utils.c b/src/WINNT/afsd/fs_utils.c deleted file mode 100644 index fcc5f0591..000000000 --- a/src/WINNT/afsd/fs_utils.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "afsd.h" -#include "smb.h" -#include "cmd.h" -#include -#include - -long fs_ExtractDriveLetter(char *inPathp, char *outPathp) -{ - if (inPathp[0] != 0 && inPathp[1] == ':') { - /* there is a drive letter */ - *outPathp++ = *inPathp++; - *outPathp++ = *inPathp++; - *outPathp++ = 0; - } - else *outPathp = 0; - - return 0; -} - -/* strip the drive letter from a component */ -long fs_StripDriveLetter(char *inPathp, char *outPathp, long outSize) -{ - char tempBuffer[1000]; - strcpy(tempBuffer, inPathp); - if (tempBuffer[0] != 0 && tempBuffer[1] == ':') { - /* drive letter present */ - strcpy(outPathp, tempBuffer+2); - } - else { - /* no drive letter present */ - strcpy(outPathp, tempBuffer); - } - return 0; -} - -/* take a path with a drive letter, possibly relative, and return a full path - * without the drive letter. This is the full path relative to the working - * dir for that drive letter. The input and output paths can be the same. - */ -long fs_GetFullPath(char *pathp, char *outPathp, long outSize) -{ - char tpath[1000]; - char origPath[1000]; - char *firstp; - long code; - int pathHasDrive; - int doSwitch; - char newPath[3]; - - if (pathp[0] != 0 && pathp[1] == ':') { - /* there's a drive letter there */ - firstp = pathp+2; - pathHasDrive = 1; - } - else { - firstp = pathp; - pathHasDrive = 0; - } - - if (*firstp == '\\' || *firstp == '/') { - /* already an absolute pathname, just copy it back */ - strcpy(outPathp, firstp); - return 0; - } - - GetCurrentDirectory(sizeof(origPath), origPath); - - doSwitch = 0; - if (pathHasDrive && (*pathp & ~0x20) != (origPath[0] & ~0x20)) { - /* a drive has been specified and it isn't our current drive. - * to get path, switch to it first. Must case-fold drive letters - * for user convenience. - */ - doSwitch = 1; - newPath[0] = *pathp; - newPath[1] = ':'; - newPath[2] = 0; - if (!SetCurrentDirectory(newPath)) { - code = GetLastError(); - return code; - } - } - - /* now get the absolute path to the current wdir in this drive */ - GetCurrentDirectory(sizeof(tpath), tpath); - strcpy(outPathp, tpath+2); /* skip drive letter */ - /* if there is a non-null name after the drive, append it */ - if (*firstp != 0) { - strcat(outPathp, "\\"); - strcat(outPathp, firstp); - } - - /* finally, if necessary, switch back to our home drive letter */ - if (doSwitch) { - SetCurrentDirectory(origPath); - } - - return 0; -} - -#ifdef COMMENT -struct hostent *hostutil_GetHostByName(char *namep) -{ - struct hostent *thp; - - thp = gethostbyname(namep); - return thp; -} - -/* get hostname or addr, given addr in network byte order */ -char *hostutil_GetNameByINet(afs_uint32 addr) -{ - static char hostNameBuffer[256]; - struct hostent *thp; - - thp = gethostbyaddr((char *) &addr, sizeof(afs_uint32), AF_INET); - if (thp) - strcpy(hostNameBuffer, thp->h_name); - else { - sprintf(hostNameBuffer, "%d.%d.%d.%d", - addr & 0xff, - (addr >> 8) & 0xff, - (addr >> 16) & 0xff, - (addr >> 24) & 0xff); - } - - /* return static buffer */ - return hostNameBuffer; -} -#endif - -/* is this a digit or a digit-like thing? */ -static int ismeta(ac, abase) -register int abase; -register int ac; { -/* if (ac == '-' || ac == 'x' || ac == 'X') return 1; */ - if (ac >= '0' && ac <= '7') return 1; - if (abase <= 8) return 0; - if (ac >= '8' && ac <= '9') return 1; - if (abase <= 10) return 0; - if (ac >= 'a' && ac <= 'f') return 1; - if (ac >= 'A' && ac <= 'F') return 1; - return 0; -} - -/* given that this is a digit or a digit-like thing, compute its value */ -static int getmeta(ac) -register int ac; { - if (ac >= '0' && ac <= '9') return ac - '0'; - if (ac >= 'a' && ac <= 'f') return ac - 'a' + 10; - if (ac >= 'A' && ac <= 'F') return ac - 'A' + 10; - return 0; -} - -long util_GetInt32 (as, aval) -register char *as; -long *aval; -{ - register long total; - register int tc; - int base; - int negative; - - total = 0; /* initialize things */ - negative = 0; - - /* skip over leading spaces */ - while (tc = *as) { - if (tc != ' ' && tc != '\t') break; - } - - /* compute sign */ - if (*as == '-') { - negative = 1; - as++; /* skip over character */ - } - - /* compute the base */ - if (*as == '0') { - as++; - if (*as == 'x' || *as == 'X') { - base = 16; - as++; - } - else base = 8; - } - else base = 10; - - /* compute the # itself */ - while(tc = *as) { - if (!ismeta(tc, base)) return -1; - total *= base; - total += getmeta(tc); - as++; - } - - if (negative) *aval = -total; - else *aval = total; - return 0; -} - -char *cm_mount_root="afs"; -char *cm_slash_mount_root="/afs"; -char *cm_back_slash_mount_root="\\afs"; - -void fs_utils_InitMountRoot() -{ - HKEY parmKey; - char mountRoot[MAX_PATH+1]; - char *pmount=mountRoot; - DWORD len=sizeof(mountRoot)-1; - printf("int mountroot \n"); - if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, 0, KEY_QUERY_VALUE, &parmKey)!= ERROR_SUCCESS) - || (RegQueryValueEx(parmKey, "Mountroot", NULL, NULL,(LPBYTE)(mountRoot), &len)!= ERROR_SUCCESS) - || (len==sizeof(mountRoot)-1) - ) - strcpy(mountRoot, "\\afs"); - RegCloseKey(parmKey); - mountRoot[len]=0; /*safety see ms-help://MS.MSDNQTR.2002OCT.1033/sysinfo/base/regqueryvalueex.htm*/ - cm_mount_root=malloc(len+1); - cm_slash_mount_root=malloc(len+2); - cm_back_slash_mount_root=malloc(len+2); - if ((*pmount=='/') || (*pmount='\\')) - pmount++; - strcpy(cm_mount_root,pmount); - strcpy(cm_slash_mount_root+1,pmount); - cm_slash_mount_root[0]='/'; - strcpy(cm_back_slash_mount_root+1,pmount); - cm_back_slash_mount_root[0]='\\'; -} - diff --git a/src/WINNT/afsd/fs_utils.h b/src/WINNT/afsd/fs_utils.h deleted file mode 100644 index dabe1aeb6..000000000 --- a/src/WINNT/afsd/fs_utils.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __FS_UTILS_H_ENV__ -#define __FS_UTILS_H_ENV__ 1 - - -/* pioctl opcode constants */ -#include "smb_iocons.h" - -/* PRSFS_ constants */ -#include -#include - -#ifndef _MFC_VER -#include -#endif - -/* Fake error code since NT errno.h doesn't define it */ -#include - -#ifndef hostutil_GetNameByINet -extern char *hostutil_GetNameByINet(afs_uint32 addr); -#endif - -#ifndef hostutil_GetHostByName -extern struct hostent *hostutil_GetHostByName(char *namep); -#endif - -// extern long util_GetInt32(char *stringp, long *valuep); - -extern long fs_StripDriveLetter(char *inPathp, char *outPathp, long outSize); - -extern long fs_ExtractDriveLetter(char *inPathp, char *outPathp); - -extern char *cm_mount_root; /*"afs"*/ -extern char *cm_slash_mount_root; /*"/afs"*/ -extern char *cm_back_slash_mount_root; /*"\\afs"*/ -extern void fs_utils_InitMountRoot(); -#endif /* FS_UTILS_H_ENV */ diff --git a/src/WINNT/afsd/klog.rc b/src/WINNT/afsd/klog.rc deleted file mode 100644 index 0f84a5eb5..000000000 --- a/src/WINNT/afsd/klog.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Logon Command" -#define AFS_VERINFO_NAME "klog" -#define AFS_VERINFO_FILENAME "klog.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/krb.h b/src/WINNT/afsd/krb.h deleted file mode 100644 index cf8f0ddba..000000000 --- a/src/WINNT/afsd/krb.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * Excerpted from krb.sed - */ - -/* - * Copyright 1987, 1988 by the Massachusetts Institute of Technology. - * - * For copying and distribution information, please see the file - * . - * - * Include file for the Kerberos library. - */ - -/* Only one time, please */ -#ifndef KRB_DEFS -#define KRB_DEFS - -/* Need some defs from des.h */ -#include - -/* General definitions */ -#define KSUCCESS 0 -#define KFAILURE 255 - -/* The maximum sizes for aname, realm, sname, and instance +1 */ -#define ANAME_SZ 40 -#define REALM_SZ 40 -#define SNAME_SZ 40 -#define INST_SZ 40 -/* include space for '.' and '@' */ -#define MAX_K_NAME_SZ (ANAME_SZ + INST_SZ + REALM_SZ + 2) -#define KKEY_SZ 100 -#define VERSION_SZ 1 -#define MSG_TYPE_SZ 1 -#define DATE_SZ 26 /* RTI date output */ - -#define MAX_HSTNM 100 - -#ifndef DEFAULT_TKT_LIFE /* allow compile-time override */ -#define DEFAULT_TKT_LIFE 120 /* default lifetime 10 hrs */ -#endif - -/* Definition of text structure used to pass text around */ -#define MAX_KTXT_LEN 1250 - -struct ktext { - unsigned int length; /* Length of the text */ - unsigned char dat[MAX_KTXT_LEN]; /* The data itself */ - unsigned long mbz; /* zero to catch runaway strings */ -}; - -typedef struct ktext *KTEXT; -typedef struct ktext KTEXT_ST; - - -/* Definitions for send_to_kdc */ -#define CLIENT_KRB_TIMEOUT 4 /* time between retries */ -#define CLIENT_KRB_RETRY 5 /* retry this many times */ -#define CLIENT_KRB_BUFLEN 512 /* max unfragmented packet */ - -/* Parameters for rd_ap_req */ -/* Maximum alloable clock skew in seconds */ -#define CLOCK_SKEW 5*60 - -/* Error codes returned from the KDC */ -#define KDC_OK 0 /* Request OK */ -#define KDC_NAME_EXP 1 /* Principal expired */ -#define KDC_SERVICE_EXP 2 /* Service expired */ -#define KDC_AUTH_EXP 3 /* Auth expired */ -#define KDC_PKT_VER 4 /* Protocol version unknown */ -#define KDC_P_MKEY_VER 5 /* Wrong master key version */ -#define KDC_S_MKEY_VER 6 /* Wrong master key version */ -#define KDC_BYTE_ORDER 7 /* Byte order unknown */ -#define KDC_PR_UNKNOWN 8 /* Principal unknown */ -#define KDC_PR_N_UNIQUE 9 /* Principal not unique */ -#define KDC_NULL_KEY 10 /* Principal has null key */ -#define KDC_GEN_ERR 20 /* Generic error from KDC */ - - -/* Values returned by get_credentials */ -#define GC_OK 0 /* Retrieve OK */ -#define RET_OK 0 /* Retrieve OK */ -#define GC_TKFIL 21 /* Can't read ticket file */ -#define RET_TKFIL 21 /* Can't read ticket file */ -#define GC_NOTKT 22 /* Can't find ticket or TGT */ -#define RET_NOTKT 22 /* Can't find ticket or TGT */ - - -/* Values returned by mk_ap_req */ -#define MK_AP_OK 0 /* Success */ -#define MK_AP_TGTEXP 26 /* TGT Expired */ - -/* Values returned by rd_ap_req */ -#define RD_AP_OK 0 /* Request authentic */ -#define RD_AP_UNDEC 31 /* Can't decode authenticator */ -#define RD_AP_EXP 32 /* Ticket expired */ -#define RD_AP_NYV 33 /* Ticket not yet valid */ -#define RD_AP_REPEAT 34 /* Repeated request */ -#define RD_AP_NOT_US 35 /* The ticket isn't for us */ -#define RD_AP_INCON 36 /* Request is inconsistent */ -#define RD_AP_TIME 37 /* delta_t too big */ -#define RD_AP_BADD 38 /* Incorrect net address */ -#define RD_AP_VERSION 39 /* protocol version mismatch */ -#define RD_AP_MSG_TYPE 40 /* invalid msg type */ -#define RD_AP_MODIFIED 41 /* message stream modified */ -#define RD_AP_ORDER 42 /* message out of order */ -#define RD_AP_UNAUTHOR 43 /* unauthorized request */ - -/* Values returned by get_pw_tkt */ -#define GT_PW_OK 0 /* Got password changing tkt */ -#define GT_PW_NULL 51 /* Current PW is null */ -#define GT_PW_BADPW 52 /* Incorrect current password */ -#define GT_PW_PROT 53 /* Protocol Error */ -#define GT_PW_KDCERR 54 /* Error returned by KDC */ -#define GT_PW_NULLTKT 55 /* Null tkt returned by KDC */ - - -/* Values returned by send_to_kdc */ -#define SKDC_OK 0 /* Response received */ -#define SKDC_RETRY 56 /* Retry count exceeded */ -#define SKDC_CANT 57 /* Can't send request */ - -/* - * Values returned by get_intkt - * (can also return SKDC_* and KDC errors) - */ - -#define INTK_OK 0 /* Ticket obtained */ -#define INTK_W_NOTALL 61 /* Not ALL tickets returned */ -#define INTK_BADPW 62 /* Incorrect password */ -#define INTK_PROT 63 /* Protocol Error */ -#define INTK_ERR 70 /* Other error */ - -/* Values returned by get_adtkt */ -#define AD_OK 0 /* Ticket Obtained */ -#define AD_NOTGT 71 /* Don't have tgt */ - -/* Error codes returned by ticket file utilities */ -#define NO_TKT_FIL 76 /* No ticket file found */ -#define TKT_FIL_ACC 77 /* Couldn't access tkt file */ -#define TKT_FIL_LCK 78 /* Couldn't lock ticket file */ -#define TKT_FIL_FMT 79 /* Bad ticket file format */ -#define TKT_FIL_INI 80 /* tf_init not called first */ - -/* Error code returned by kparse_name */ -#define KNAME_FMT 81 /* Bad Kerberos name format */ - -/* Error code returned by krb_mk_safe */ -#define SAFE_PRIV_ERROR -1 /* syscall error */ - -#if 0 -/* - * macros for byte swapping; also scratch space - * u_quad 0-->7, 1-->6, 2-->5, 3-->4, 4-->3, 5-->2, 6-->1, 7-->0 - * u_long 0-->3, 1-->2, 2-->1, 3-->0 - * u_short 0-->1, 1-->0 - */ - -#define swap_u_16(x) {\ - unsigned long _krb_swap_tmp[4];\ - swab(((char *) x) +0, ((char *) _krb_swap_tmp) +14 ,2); \ - swab(((char *) x) +2, ((char *) _krb_swap_tmp) +12 ,2); \ - swab(((char *) x) +4, ((char *) _krb_swap_tmp) +10 ,2); \ - swab(((char *) x) +6, ((char *) _krb_swap_tmp) +8 ,2); \ - swab(((char *) x) +8, ((char *) _krb_swap_tmp) +6 ,2); \ - swab(((char *) x) +10,((char *) _krb_swap_tmp) +4 ,2); \ - swab(((char *) x) +12,((char *) _krb_swap_tmp) +2 ,2); \ - swab(((char *) x) +14,((char *) _krb_swap_tmp) +0 ,2); \ - memcpy((char *)x, (char *)_krb_swap_tmp, 16);\ - } - -#define swap_u_12(x) {\ - unsigned long _krb_swap_tmp[4];\ - swab(( char *) x, ((char *) _krb_swap_tmp) +10 ,2); \ - swab(((char *) x) +2, ((char *) _krb_swap_tmp) +8 ,2); \ - swab(((char *) x) +4, ((char *) _krb_swap_tmp) +6 ,2); \ - swab(((char *) x) +6, ((char *) _krb_swap_tmp) +4 ,2); \ - swab(((char *) x) +8, ((char *) _krb_swap_tmp) +2 ,2); \ - swab(((char *) x) +10,((char *) _krb_swap_tmp) +0 ,2); \ - memcpy((char *)x, (char *)_krb_swap_tmp, 12);\ - } - -#define swap_C_Block(x) {\ - unsigned long _krb_swap_tmp[4];\ - swab(( char *) x, ((char *) _krb_swap_tmp) +6 ,2); \ - swab(((char *) x) +2,((char *) _krb_swap_tmp) +4 ,2); \ - swab(((char *) x) +4,((char *) _krb_swap_tmp) +2 ,2); \ - swab(((char *) x) +6,((char *) _krb_swap_tmp) ,2); \ - memcpy((char *)x, (char *)_krb_swap_tmp, 8);\ - } -#define swap_u_quad(x) {\ - unsigned long _krb_swap_tmp[4];\ - swab(( char *) &x, ((char *) _krb_swap_tmp) +6 ,2); \ - swab(((char *) &x) +2,((char *) _krb_swap_tmp) +4 ,2); \ - swab(((char *) &x) +4,((char *) _krb_swap_tmp) +2 ,2); \ - swab(((char *) &x) +6,((char *) _krb_swap_tmp) ,2); \ - memcpy((char *)&x, (char *)_krb_swap_tmp, 8);\ - } - -#define swap_u_long(x) {\ - unsigned long _krb_swap_tmp[4];\ - swab((char *) &x, ((char *) _krb_swap_tmp) +2 ,2); \ - swab(((char *) &x) +2,((char *) _krb_swap_tmp),2); \ - x = _krb_swap_tmp[0]; \ - } - -#define swap_u_short(x) {\ - unsigned short _krb_swap_sh_tmp; \ - swab((char *) &x, ( &_krb_swap_sh_tmp) ,2); \ - x = (unsigned short) _krb_swap_sh_tmp; \ - } -#endif /* 0 */ - -#include "krb_prot.h" - -static send_to_kdc( - KTEXT pkt, - KTEXT rpkt); - -#endif /* KRB_DEFS */ diff --git a/src/WINNT/afsd/krb_prot.h b/src/WINNT/afsd/krb_prot.h deleted file mode 100644 index 589723807..000000000 --- a/src/WINNT/afsd/krb_prot.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute - * of Technology. - * - * For copying and distribution information, please see the file - * . - * - * Include file with authentication protocol information. - */ - -#ifndef PROT_DEFS -#define PROT_DEFS - -#define KRB_PORT 750 /* PC's don't have - * /etc/services */ -#define KRB_PROT_VERSION 4 -#define MAX_PKT_LEN 1000 -#define MAX_TXT_LEN 1000 -#define TICKET_GRANTING_TICKET "krbtgt" - -/* Macro's to obtain various fields from a packet */ - -#define pkt_version(packet) (unsigned int) *(packet->dat) -#define pkt_msg_type(packet) (unsigned int) *(packet->dat+1) -#define pkt_a_name(packet) (packet->dat+2) -#define pkt_a_inst(packet) \ - (packet->dat+3+strlen((char *)pkt_a_name(packet))) -#define pkt_a_realm(packet) \ - (pkt_a_inst(packet)+1+strlen((char *)pkt_a_inst(packet))) - -/* Macro to obtain realm from application request */ -#define apreq_realm(auth) (auth->dat + 3) - -#define pkt_time_ws(packet) (char *) \ - (packet->dat+5+strlen((char *)pkt_a_name(packet)) + \ - strlen((char *)pkt_a_inst(packet)) + \ - strlen((char *)pkt_a_realm(packet))) - -#define pkt_no_req(packet) (unsigned short) \ - *(packet->dat+9+strlen((char *)pkt_a_name(packet)) + \ - strlen((char *)pkt_a_inst(packet)) + \ - strlen((char *)pkt_a_realm(packet))) -#define pkt_x_date(packet) (char *) \ - (packet->dat+10+strlen((char *)pkt_a_name(packet)) + \ - strlen((char *)pkt_a_inst(packet)) + \ - strlen((char *)pkt_a_realm(packet))) -#define pkt_err_code(packet) ( (char *) \ - (packet->dat+9+strlen((char *)pkt_a_name(packet)) + \ - strlen((char *)pkt_a_inst(packet)) + \ - strlen((char *)pkt_a_realm(packet)))) -#define pkt_err_text(packet) \ - (packet->dat+13+strlen((char *)pkt_a_name(packet)) + \ - strlen((char *)pkt_a_inst(packet)) + \ - strlen((char *)pkt_a_realm(packet))) - -/* Routines to create and read packets may be found in prot.c */ - -KTEXT create_auth_reply(); -KTEXT create_death_packet(); -KTEXT pkt_cipher(); - -/* Message types , always leave lsb for byte order */ - -#define AUTH_MSG_KDC_REQUEST 1<<1 -#define AUTH_MSG_KDC_REPLY 2<<1 -#define AUTH_MSG_APPL_REQUEST 3<<1 -#define AUTH_MSG_APPL_REQUEST_MUTUAL 4<<1 -#define AUTH_MSG_ERR_REPLY 5<<1 -#define AUTH_MSG_PRIVATE 6<<1 -#define AUTH_MSG_SAFE 7<<1 -#define AUTH_MSG_APPL_ERR 8<<1 -#define AUTH_MSG_DIE 63<<1 - -/* values for kerb error codes */ - -#define KERB_ERR_OK 0 -#define KERB_ERR_NAME_EXP 1 -#define KERB_ERR_SERVICE_EXP 2 -#define KERB_ERR_AUTH_EXP 3 -#define KERB_ERR_PKT_VER 4 -#define KERB_ERR_NAME_MAST_KEY_VER 5 -#define KERB_ERR_SERV_MAST_KEY_VER 6 -#define KERB_ERR_BYTE_ORDER 7 -#define KERB_ERR_PRINCIPAL_UNKNOWN 8 -#define KERB_ERR_PRINCIPAL_NOT_UNIQUE 9 -#define KERB_ERR_NULL_KEY 10 - -#endif /* PROT_DEFS */ diff --git a/src/WINNT/afsd/lanahelper.cpp b/src/WINNT/afsd/lanahelper.cpp deleted file mode 100644 index 148a0c49c..000000000 --- a/src/WINNT/afsd/lanahelper.cpp +++ /dev/null @@ -1,695 +0,0 @@ -/* - -Copyright 2004 by the Massachusetts Institute of Technology - -All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of the Massachusetts -Institute of Technology (M.I.T.) not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NOLOGGING -#ifndef NOLOGGING -extern "C" { -#include - - void afsi_log(TCHAR *p, ...) { - va_list marker; - TCHAR buffer[200]; - - va_start(marker,p); - _vstprintf(buffer,p,marker); - va_end(marker); - _tcscat(buffer,_T("\n")); - - OutputDebugString(buffer); - } -} -#endif - -static const char *szNetbiosNameValue = "NetbiosName"; -static const char *szIsGatewayValue = "IsGateway"; -static const char *szLanAdapterValue = "LanAdapter"; -static const char *szNoFindLanaByName = "NoFindLanaByName"; -static const char *szForceLanaLoopback = "ForceLanaLoopback"; - -// Use the IShellFolder API to get the connection name for the given Guid. -static HRESULT lana_ShellGetNameFromGuidW(WCHAR *wGuid, WCHAR *wName, int NameSize) -{ - // This is the GUID for the network connections folder. It is constant. - // {7007ACC7-3202-11D1-AAD2-00805FC1270E} - const GUID CLSID_NetworkConnections = { - 0x7007ACC7, 0x3202, 0x11D1, { - 0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E - } - }; - LPITEMIDLIST pidl; - IShellFolder *pShellFolder; - IMalloc *pShellMalloc; - - // Build the display name in the form "::{GUID}". - if (wcslen(wGuid) >= MAX_PATH) - return E_INVALIDARG; - WCHAR szAdapterGuid[MAX_PATH + 2]; - swprintf(szAdapterGuid, L"::%ls", wGuid); - - // Initialize COM. - CoInitialize(NULL); - - // Get the shell allocator. - HRESULT hr = SHGetMalloc(&pShellMalloc); - if (SUCCEEDED(hr)) - { - // Create an instance of the network connections folder. - hr = CoCreateInstance(CLSID_NetworkConnections, NULL, - CLSCTX_INPROC_SERVER, IID_IShellFolder, - reinterpret_cast(&pShellFolder)); - } - if (SUCCEEDED(hr)) - { - hr = pShellFolder->ParseDisplayName(NULL, NULL, szAdapterGuid, NULL, - &pidl, NULL); - } - if (SUCCEEDED(hr)) { - // Get the display name; this returns the friendly name. - STRRET sName; - hr = pShellFolder->GetDisplayNameOf(pidl, SHGDN_NORMAL, &sName); - if (SUCCEEDED(hr)) - wcsncpy(wName, sName.pOleStr, NameSize); - pShellMalloc->Free(pidl); - } - - CoUninitialize(); - return hr; -} - -// Get the Connection Name for the given GUID. -extern "C" int lana_GetNameFromGuid(char *Guid, char **Name) -{ - typedef HRESULT (WINAPI *HrLanProcAddr)(GUID *, PCWSTR, PWSTR, LPDWORD); - HrLanProcAddr HrLanProc = NULL; - HMODULE hNetMan; - int size; - WCHAR *wGuid = NULL; - WCHAR wName[MAX_PATH]; - DWORD NameSize = MAX_PATH; - char *name = NULL; - HRESULT status; - - // Convert the Guid string to Unicode. First we ask only for the size - // of the converted string. Then we allocate a buffer of sufficient - // size to hold the result of the conversion. - size = MultiByteToWideChar(CP_ACP, 0, Guid, -1, NULL, 0); - wGuid = (WCHAR *) malloc(size * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, Guid, -1, wGuid, size); - - // First try the IShellFolder interface, which was unimplemented - // for the network connections folder before XP. - - /* XXX pbh 9/11/03 - revert to using the undocumented APIs on XP while - * waiting to hear back from PSS about the slow reboot issue. - * This is an ugly, misleading hack, but is minimally invasive - * and will be easy to rollback. - */ - - //status = getname_shellfolder(wGuid, wName, NameSize); - status = E_NOTIMPL; - - /* XXX end of pbh 9/11/03 temporary hack*/ - - if (status == E_NOTIMPL) { - // The IShellFolder interface is not implemented on this platform. - // Try the (undocumented) HrLanConnectionNameFromGuidOrPath API - // from the netman DLL. -#ifndef NOLOGGING - afsi_log("IShellFolder API not implemented, trying HrLanConnectionNameFromGuidOrPath"); -#endif - hNetMan = LoadLibrary("netman.dll"); - if (hNetMan == NULL) { - free(wGuid); - return -1; - } - /* Super Secret Microsoft Call */ - HrLanProc = (HrLanProcAddr) GetProcAddress(hNetMan, - "HrLanConnectionNameFromGuidOrPath"); - if (HrLanProc == NULL) { - FreeLibrary(hNetMan); - free(wGuid); - return -1; - } - status = HrLanProc(NULL, wGuid, wName, &NameSize); - FreeLibrary(hNetMan); - } - free(wGuid); - if (FAILED(status)) { -#ifndef NOLOGGING - afsi_log("lana_GetNameFromGuid: failed to get connection name (status %ld)", - status); -#endif - return -1; - } - - // Get the required buffer size, and then convert the string. - size = WideCharToMultiByte(CP_ACP, 0, wName, -1, NULL, 0, NULL, NULL); - name = (char *) malloc(size); - if (name == NULL) - return -1; - WideCharToMultiByte(CP_ACP, 0, wName, -1, name, size, NULL, NULL); -#ifndef NOLOGGING - afsi_log("Connection name for %s is '%s'", Guid, name); -#endif - if (*Name) - *Name = name; - else - free(name); - return 0; -} - -// Return an array of LANAINFOs corresponding to a connection named LanaName -// (NULL LanaName matches all connections), and has an IPv4 binding. Returns -// NULL if something goes wrong. -// NOTE: caller must free the returned block if non NULL. -extern "C" LANAINFO * lana_FindLanaByName(const char *LanaName) -{ - const char RegNetBiosLinkageKeyName[] = - "System\\CurrentControlSet\\Services\\NetBios\\Linkage"; - HKEY hkey; - LONG status; - struct { - BYTE flags; - BYTE number; - } lanamap[MAX_LANA+1]; - DWORD lanamapsize = sizeof(lanamap); - DWORD type; - char *bindpaths = NULL; - DWORD bindpathsize; - int nlana; - int i; - char *guid; - char *name; - char *pBind; - char *p; - - LANAINFO * lanainfo; - - // Open the NetBios Linkage key. - status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegNetBiosLinkageKeyName, 0, - KEY_QUERY_VALUE, &hkey); - - if (status != ERROR_SUCCESS) { -#ifndef NOLOGGING - afsi_log("Failed to open NetBios Linkage key (status %ld)", status); -#endif - return NULL; - } - - // Read the lana map. - status = RegQueryValueEx(hkey, "LanaMap", 0, &type, - (BYTE *) &lanamap, &lanamapsize); - if (status != ERROR_SUCCESS) { -#ifndef NOLOGGING - afsi_log("Failed to read LanaMap (status %ld)", status); -#endif - RegCloseKey(hkey); - return NULL; - } - if (lanamapsize == 0) { -#ifndef NOLOGGING - afsi_log("No data in LanaMap"); -#endif - return NULL; - } - nlana = lanamapsize / sizeof(lanamap[0]); - - // Get the bind paths for NetBios so we can match them up - // with the lana map. First we query for the size, so we - // can allocate an appropriate buffer. - status = RegQueryValueEx(hkey, "Bind", 0, &type, NULL, &bindpathsize); - if (status == ERROR_SUCCESS && bindpathsize != 0) { - bindpaths = (char *) malloc(bindpathsize * sizeof(char)); - if (bindpaths == NULL) { -#ifndef NOLOGGING - afsi_log("Cannot allocate %ld bytes for bindpaths", bindpathsize); -#endif - RegCloseKey(hkey); - return NULL; - } - status = RegQueryValueEx(hkey, "Bind", 0, &type, - (BYTE *) bindpaths, &bindpathsize); - } - RegCloseKey(hkey); - if (status != ERROR_SUCCESS) { -#ifndef NOLOGGING - afsi_log("Failed to read bind paths (status %ld)", status); -#endif - if (bindpaths != NULL) - free(bindpaths); - return NULL; - } - if (bindpathsize == 0) { -#ifndef NOLOGGING - afsi_log("No bindpath data"); -#endif - if (bindpaths != NULL) - free(bindpaths); - return NULL; - } - - if (LanaName) - { - lanainfo = (LANAINFO *) malloc(sizeof(LANAINFO)*2); - if(lanainfo == NULL) { - free(bindpaths); - return NULL; - } - memset(lanainfo, 0, sizeof(LANAINFO) * 2); - lanainfo[0].lana_number = LANA_INVALID; - } - else - { - lanainfo = (LANAINFO *) malloc(sizeof(LANAINFO)*(nlana+1)); - if(lanainfo == NULL) { - free(bindpaths); - return NULL; - } - memset(lanainfo, 0, sizeof(LANAINFO) * (nlana+1)); - } - - int index = 0; - - // Iterate over the lana map entries and bind paths. - for (i = 0, pBind = bindpaths; i < nlana; - i++, pBind += strlen(pBind) + 1) { - // Ignore an invalid map entry. - if ((lanamap[i].flags & 1) == 0) - continue; - - // check for an IPv4 binding - if(!strstr(pBind,"_Tcpip_")) - continue; - - // Find the beginning of the GUID. - guid = strchr(pBind, '{'); - if (guid == NULL) - continue; // Malformed path entry? - guid = strdup(guid); - if (guid == NULL) - continue; - // Find the end of the GUID. - p = strchr(guid, '}'); - if (p == NULL) { - free(guid); // Malformed GUID? - continue; - } - *++p = '\0'; // Ignore anything after the GUID. - status = lana_GetNameFromGuid(guid, &name); - free(guid); - - if (status == 0 && name != 0) - { - if (LanaName) - { - if (strcmp(name, LanaName) ==0) - { - lanainfo[index].lana_number = lanamap[i].number; - _tcscpy(lanainfo[index].lana_name, name); - free(name); - index++; - break; - } - } - else - { - lanainfo[index].lana_number = lanamap[i].number; - _tcscpy(lanainfo[index].lana_name, name); - free(name); - index++; - } - } - } - - lanainfo[index].lana_number = LANA_INVALID; - - free(bindpaths); - return lanainfo; -} - -extern "C" lana_number_t lana_FindLoopback(void) -{ - NCB ncb; - LANA_ENUM lana_list; - int status; - int i; - - memset(&ncb, 0, sizeof(ncb)); - ncb.ncb_command = NCBENUM; - ncb.ncb_buffer = (UCHAR *) &lana_list; - ncb.ncb_length = sizeof(lana_list); - status = Netbios(&ncb); - if (status != 0) { -#ifndef NOLOGGING - afsi_log("Netbios NCBENUM failed: status %ld", status); -#endif - return LANA_INVALID; - } - for (i = 0; i < lana_list.length; i++) { - if (lana_IsLoopback(lana_list.lana[i])) { - // Found one, return it. -#ifndef NOLOGGING - afsi_log("lana_FindLoopback: Found LAN adapter %d", - lana_list.lana[i]); -#endif - return lana_list.lana[i]; - } - } - // Could not find a loopback adapter. - return LANA_INVALID; -} - -/* Returns TRUE if all adapters are loopback adapters */ -extern "C" BOOL lana_OnlyLoopback(void) -{ - NCB ncb; - LANA_ENUM lana_list; - int status; - int i; - - memset(&ncb, 0, sizeof(ncb)); - ncb.ncb_command = NCBENUM; - ncb.ncb_buffer = (UCHAR *) &lana_list; - ncb.ncb_length = sizeof(lana_list); - status = Netbios(&ncb); - if (status != 0) { -#ifndef NOLOGGING - afsi_log("Netbios NCBENUM failed: status %ld", status); -#endif - return FALSE; - } - for (i = 0; i < lana_list.length; i++) { - if (!lana_IsLoopback(lana_list.lana[i])) { - // Found one non-Loopback adapter - return FALSE; - } - } - // All adapters are loopback - return TRUE; -} - -// Is the given lana a Windows Loopback Adapter? -// TODO: implement a better check for loopback -// TODO: also check for proper bindings (IPv4) -extern "C" BOOL lana_IsLoopback(lana_number_t lana) -{ - NCB ncb; - struct { - ADAPTER_STATUS status; - NAME_BUFFER names[MAX_LANA+1]; - } astat; - unsigned char kWLA_MAC[6] = { 0x02, 0x00, 0x4c, 0x4f, 0x4f, 0x50 }; - int status; - HKEY hkConfig; - LONG rv; - int regLana = -1; - DWORD dummyLen; - - rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,AFSREG_CLT_SVC_PARAM_SUBKEY,0,KEY_READ,&hkConfig); - if (rv == ERROR_SUCCESS) { - rv = RegQueryValueEx(hkConfig, szForceLanaLoopback, NULL, NULL, (LPBYTE) ®Lana, &dummyLen); - RegCloseKey(hkConfig); - - if (regLana == lana) - return TRUE; - } - - // Reset the adapter: in Win32, this is required for every process, and - // acts as an init call, not as a real hardware reset. - memset(&ncb, 0, sizeof(ncb)); - ncb.ncb_command = NCBRESET; - ncb.ncb_callname[0] = 100; - ncb.ncb_callname[2] = 100; - ncb.ncb_lana_num = lana; - status = Netbios(&ncb); - if (status == 0) - status = ncb.ncb_retcode; - if (status != 0) { -#ifndef NOLOGGING - afsi_log("NCBRESET failed: lana %u, status %ld", lana, status); -#endif - return FALSE; - } - - // Use the NCBASTAT command to get the adapter address. - memset(&ncb, 0, sizeof(ncb)); - ncb.ncb_command = NCBASTAT; - ncb.ncb_lana_num = lana; - strcpy((char *) ncb.ncb_callname, "* "); - ncb.ncb_buffer = (UCHAR *) &astat; - ncb.ncb_length = sizeof(astat); - status = Netbios(&ncb); - if (status == 0) - status = ncb.ncb_retcode; - if (ncb.ncb_retcode != 0) { -#ifndef NOLOGGING - afsi_log("NCBASTAT failed: lana %u, status %ld", lana, status); -#endif - return FALSE; - } - return (memcmp(astat.status.adapter_address, kWLA_MAC, 6) == 0); -} - -// Get the netbios named used/to-be-used by the AFS SMB server. -// IF THEN -// Use specified lana -// ELSE -// Look for an adapter named "AFS", failing which, -// look for a loopback adapter. -// ENDIF -// IF lana is for a loopback && !IsGateway THEN -// IF netbios name is specified THEN -// use specified netbios name -// ELSE -// use "AFS" -// ENDIF -// ELSE -// use netbios name "-AFS" -// ENDIF -// Return ERROR_SUCCESS if netbios name was successfully generated. -// Returns the lana number to use in *pLana (if pLana is non-NULL) and also -// the IsGateway setting in *pIsGateway (if pIsGateway is non-NULL). -// the type of name returned. -// -// buffer is assumed to hold at least MAX_NB_NAME_LENGTH bytes. -// -// flags : -// LANA_NETBIOS_NAME_IN : Use the values of *pLana and *pIsGateway as [in] parameters. -// LANA_NETBIOS_NAME_SUFFIX : Only return the suffix of netbios name -// LANA_NETBIOS_NAME_FULL : Return full netbios name -extern "C" long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags) { - HKEY hkConfig; - DWORD dummyLen; - LONG rv; - int regLana; - int regGateway, regNoFindLanaByName; - TCHAR regNbName[MAX_NB_NAME_LENGTH]; - TCHAR nbName[MAX_NB_NAME_LENGTH]; - TCHAR hostname[MAX_COMPUTERNAME_LENGTH+1]; - - rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,AFSREG_CLT_SVC_PARAM_SUBKEY,0,KEY_READ,&hkConfig); - if(rv == ERROR_SUCCESS) { - if(!(flags & LANA_NETBIOS_NAME_IN) || !pLana) { - dummyLen = sizeof(regLana); - rv = RegQueryValueEx(hkConfig, szLanAdapterValue, NULL, NULL, (LPBYTE) ®Lana, &dummyLen); - if(rv != ERROR_SUCCESS) regLana = -1; - } else - regLana = *pLana; - - if(!(flags & LANA_NETBIOS_NAME_IN) || !pIsGateway) { - dummyLen = sizeof(regGateway); - rv = RegQueryValueEx(hkConfig, szIsGatewayValue, NULL, NULL, (LPBYTE) ®Gateway, &dummyLen); - if(rv != ERROR_SUCCESS) regGateway = 0; - } else - regGateway = *pIsGateway; - - dummyLen = sizeof(regNoFindLanaByName); - rv = RegQueryValueEx(hkConfig, szNoFindLanaByName, NULL, NULL, (LPBYTE) ®NoFindLanaByName, &dummyLen); - if(rv != ERROR_SUCCESS) regNoFindLanaByName = 0; - - // Do not care if the call fails for insufficient buffer size. We are not interested - // in netbios names over 15 chars. - dummyLen = sizeof(regNbName); - rv = RegQueryValueEx(hkConfig, szNetbiosNameValue, NULL, NULL, (LPBYTE) ®NbName, &dummyLen); - if(rv != ERROR_SUCCESS) regNbName[0] = 0; - else regNbName[15] = 0; - - RegCloseKey(hkConfig); - } else { - if(flags & LANA_NETBIOS_NAME_IN) { - regLana = (pLana)? *pLana: -1; - regGateway = (pIsGateway)? *pIsGateway: 0; - } else { - regLana = -1; - regGateway = 0; - } - regNoFindLanaByName = 0; - regNbName[0] = 0; - } - - if(regLana < 0 || regLana > MAX_LANA) - regLana = -1; - - if(regLana == -1) { - LANAINFO *lanaInfo = NULL; - int nLana = LANA_INVALID; - - if (!regNoFindLanaByName) - lanaInfo = lana_FindLanaByName("AFS"); - if(lanaInfo != NULL) { - nLana = lanaInfo[0].lana_number; - free(lanaInfo); - } else - nLana = LANA_INVALID; - - if(nLana == LANA_INVALID && !regGateway) { - nLana = lana_FindLoopback(); - } - if(nLana != LANA_INVALID) - regLana = nLana; - } - - if(regNbName[0] && - (regLana >=0 && lana_IsLoopback((lana_number_t) regLana))) { - strncpy(nbName,regNbName,15); - nbName[16] = 0; - strupr(nbName); - } else { - char * dot; - - if(flags & LANA_NETBIOS_NAME_SUFFIX) { - strcpy(nbName,"-AFS"); - } else { - dummyLen = sizeof(hostname); - // assume we are not a cluster. - rv = GetComputerName(hostname, &dummyLen); - if(!SUCCEEDED(rv)) { // should not happen, but... - return rv; - } - strncpy(nbName, hostname, 11); - nbName[11] = 0; - if(dot = strchr(nbName,'.')) - *dot = 0; - strcat(nbName,"-AFS"); - } - } - - if(pLana) *pLana = regLana; - if(pIsGateway) *pIsGateway = regGateway; - - strcpy(buffer, nbName); - - return ERROR_SUCCESS; -} - -extern "C" void lana_GetUncServerNameDynamic(int lanaNumber, BOOL isGateway, TCHAR *name, int type) { - char szName[MAX_NB_NAME_LENGTH]; - lana_number_t lana = (lana_number_t) lanaNumber; - int gateway = (int) isGateway; - - if(SUCCEEDED(lana_GetUncServerNameEx(szName, &lana, &gateway, LANA_NETBIOS_NAME_IN | type))) { -#ifdef _UNICODE - mbswcs(name,szName,MAX_NB_NAME_LENGTH); -#else - strncpy(name,szName,MAX_NB_NAME_LENGTH); -#endif - } else - *name = _T('\0'); -} - -extern "C" void lana_GetUncServerName(TCHAR *name, int type) { - char szName[MAX_NB_NAME_LENGTH]; - - if(SUCCEEDED(lana_GetUncServerNameEx(szName,NULL,NULL,type))) { -#ifdef _UNICODE - mbswcs(name,szName,MAX_NB_NAME_LENGTH); -#else - strncpy(name,szName,MAX_NB_NAME_LENGTH); -#endif - } else { - *name = _T('\0'); - } -} - -extern "C" void lana_GetAfsNameString(int lanaNumber, BOOL isGateway, TCHAR* name) -{ - TCHAR netbiosName[32]; - lana_GetUncServerNameDynamic(lanaNumber, isGateway, netbiosName, LANA_NETBIOS_NAME_FULL); - _stprintf(name, _T("Your UNC name to reach the root of AFS is \\\\%s\\all"), netbiosName); -} - -extern "C" void lana_GetNetbiosName(LPTSTR pszName, int type) -{ - HKEY hkCfg; - TCHAR name[MAX_NB_NAME_LENGTH]; - DWORD dummyLen; - - memset(name, 0, sizeof(name)); - if (GetVersion() >= 0x80000000) // not WindowsNT - { - if (type == LANA_NETBIOS_NAME_SUFFIX) - { - _tcscpy(pszName, TEXT("-afs")); - return; - } - - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,AFSREG_CLT_SVC_PARAM_SUBKEY,0,KEY_READ,&hkCfg) == ERROR_SUCCESS) { - dummyLen = sizeof(name); - if(RegQueryValueEx(hkCfg,TEXT("Gateway"),NULL,NULL,(LPBYTE) name,&dummyLen) == ERROR_SUCCESS) - name[0] = _T('\0'); - RegCloseKey(hkCfg); - } - - if (_tcslen(name) == 0) - { - _tcscpy(pszName, TEXT("unknown")); - return; - } - - _tcscpy(pszName, name); - _tcscat(pszName, TEXT("-afs")); - return; - } - - lana_GetUncServerName(name,type); - _tcslwr(name); - _tcscpy(pszName, name); - return; -} - diff --git a/src/WINNT/afsd/lanahelper.h b/src/WINNT/afsd/lanahelper.h deleted file mode 100644 index 502472828..000000000 --- a/src/WINNT/afsd/lanahelper.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - -Copyright 2004 by the Massachusetts Institute of Technology - -All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of the Massachusetts -Institute of Technology (M.I.T.) not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -*/ - -#ifndef __LANAHELPER_H__ -#define __LANAHELPER_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - typedef BYTE lana_number_t; - -#define LANA_INVALID 0xff - - struct LANAINFO - { - lana_number_t lana_number; - TCHAR lana_name[MAX_PATH]; - }; - -#define LANA_INVALID 0xff -#define MAX_NB_NAME_LENGTH 17 - -#define LANA_NETBIOS_NAME_SUFFIX 1 -#define LANA_NETBIOS_NAME_FULL 0 - -#define LANA_NETBIOS_NAME_IN 2 - - int lana_GetNameFromGuid(char *Guid, char **Name); - - struct LANAINFO * lana_FindLanaByName(const char *LanaName); - - lana_number_t lana_FindLoopback(void); - - BOOL lana_OnlyLoopback(void); - - BOOL lana_IsLoopback(lana_number_t lana); - - long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags); - - void lana_GetUncServerNameDynamic(int lanaNumber, BOOL isGateway, TCHAR *name, int type); - - void lana_GetUncServerName(TCHAR *name, int type); - - void lana_GetAfsNameString(int lanaNumber, BOOL isGateway, TCHAR* name); - - void lana_GetNetbiosName(LPTSTR pszName, int type); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/src/WINNT/afsd/largeint95.c b/src/WINNT/afsd/largeint95.c deleted file mode 100644 index 19c2c4e90..000000000 --- a/src/WINNT/afsd/largeint95.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Large integer support for DJGPP */ - -#include -#include "largeint95.h" - -LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER c; - long long *c1 = (long long *) &c; - long long *a1 = (long long *) &a; - long long *b1 = (long long *) &b; - *c1 = *a1 + *b1; - return c; -} - -LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER c; - long long *c1 = (long long *) &c; - long long *a1 = (long long *) &a; - long long *b1 = (long long *) &b; - *c1 = *a1 - *b1; - return c; -} - -LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) -{ - LARGE_INTEGER n; - - n.LowPart = a; - n.HighPart = 0; - return n; -} - -LARGE_INTEGER LargeIntegerMultiplyLongByLong(unsigned long a, unsigned long b) -{ - LARGE_INTEGER c; - long long *c1 = (long long *) &c; - - *c1 = (long long) a * (long long) b; - return c; -} - -LARGE_INTEGER LargeIntegerMultiplyByLong(LARGE_INTEGER a, unsigned long b) -{ - LARGE_INTEGER c; - long long *c1 = (long long *) &c; - long long *a1 = (long long *) &a; - - *c1 = *a1 * (long long) b; - return c; -} - -unsigned long LargeIntegerDivideByLong(LARGE_INTEGER a, unsigned long b) -{ - lldiv_t q; - long long *a1 = (long long *) &a; - - q = lldiv(*a1, (long long) b); - return (unsigned long) q.quot; -} - -#if 0 -LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER c; - - c.LowPart = a.LowPart + b.LowPart; - c.HighPart = a.HighPart + b.HighPart; - - /* not sure how to do a real carry */ - if (c.LowPart < a.LowPart) - c.HighPart++; - - return c; -} - -LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER c; - - c.LowPart = a.LowPart - b.LowPart; - c.HighPart = a.HighPart - b.HighPart; - - /* borrow */ - if (c.LowPart > a.LowPart) - c.HighPart--; - - return c; -} - -__inline__ unsigned long mult32(unsigned long a, unsigned long b, - unsigned long *ov) -{ - unsigned long p, o; - - /* multiply low part and save the overflow bits */ - __asm__ __volatile__ ("movl %2, %%eax\n - mull %3, %%eax\n - movl %%eax, %0\n - movl %%edx, %1" - : "=g" (p), "=g" (o) - : "g" (a), "g" (b) - : "ax", "dx", "memory" - ); - *ov = o; - return p; -} - -__inline__ unsigned long div32(unsigned long a, unsigned long b, - unsigned long *rem) -{ - unsigned long q, r; - - /* multiply low part and save the overflow bits */ - __asm__ __volatile__ ("movl %2, %%eax\n - divl %3, %%eax\n - movl %%eax, %0\n - movl %%edx, %1" - : "=g" (q), "=g" (r) - : "g" (a), "g" (b) - : "ax", "dx", "memory" - ); - *rem = r; - return q; -} - -LARGE_INTEGER LargeIntegerMultiplyLongByLong(unsigned long a, unsigned long b) -{ - LARGE_INTEGER prod; - - prod.LowPart = mult32(a, b, &prod.HighPart); - return prod; -} - -LARGE_INTEGER LargeIntegerMultiplyByLong(LARGE_INTEGER a, unsigned long b) -{ - LARGE_INTEGER prod; - unsigned long x, prodl, prodh, ovl, ovh; - - /* multiply low part and save the overflow bits */ - prod.LowPart = mult32(a.LowPart, b, &ovl); - - /* multiply high part */ - prod.HighPart = mult32(a.HighPart, b, &ovh); - - /* add overflow from low part */ - prod.HighPart += ovl; - - return prod; -} - -unsigned long LargeIntegerDivideByLong(LARGE_INTEGER a, unsigned long b, unsigned long *rem) -{ - unsigned long n, r, q; - LARGE_INTEGER t; - - if (b == 0) { return 0; } - if (b == 1) { *rem = 0; return a.LowPart; } - - n = div32(a.LowPart, b, &r); - if (a.HighPart == 0) - { - *rem = r; - return n; - } - else - { - q = div32(0xffffffff-b+1, b, &r); - q++; - n += q * a.HighPart; - n += LargeIntegerDivideByLong(LargeIntegerMultiplyLongByLong(r, a.HighPart), b, rem); - return n; - } -} -#endif - -#if 0 -int LargeIntegerGreaterThan(LARGE_INTEGER a, LARGE_INTEGER b) -{ - if (a.HighPart > b.HighPart) return 1; - else if (a.HighPart == b.HighPart && a.LowPart > b.LowPart) return 1; - else return 0; -} - -int LargeIntegerGreaterThanOrEqualTo(LARGE_INTEGER a, LARGE_INTEGER b) -{ - if (a.HighPart > b.HighPart) return 1; - else if (a.HighPart == b.HighPart && a.LowPart >= b.LowPart) return 1; - else return 0; -} - -int LargeIntegerEqualTo(LARGE_INTEGER a, LARGE_INTEGER b) -{ - if (a.HighPart == b.HighPart && a.LowPart == b.LowPart) return 1; - else return 0; -} - -int LargeIntegerGreaterOrEqualToZero(LARGE_INTEGER a) -{ - return ((a.HighPart & 0x8fffffff) ? 0 : 1); -} - -int LargeIntegerLessThanZero(LARGE_INTEGER a) -{ - return ((a.HighPart & 0x8fffffff) ? 1 : 0); -} -#endif diff --git a/src/WINNT/afsd/largeint95.h b/src/WINNT/afsd/largeint95.h deleted file mode 100644 index f55b4118e..000000000 --- a/src/WINNT/afsd/largeint95.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef LARGEINT_H -#define LARGEINT_H - -typedef struct { - unsigned long LowPart; - unsigned long HighPart; -} LARGE_INTEGER; - -LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b); -LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b); -/*int LargeIntegerGreaterThan(LARGE_INTEGER a, LARGE_INTEGER b); -int LargeIntegerGreaterThanOrEqualTo(LARGE_INTEGER a, LARGE_INTEGER b); -int LargeIntegerEqualTo(LARGE_INTEGER a, LARGE_INTEGER b); -int LargeIntegerGreaterOrEqualToZero(LARGE_INTEGER a); -int LargeIntegerLessThanZero(LARGE_INTEGER a);*/ -LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a); -LARGE_INTEGER LargeIntegerMultiplyByLong(LARGE_INTEGER a, unsigned long b); -unsigned long LargeIntegerDivideByLong(LARGE_INTEGER a, unsigned long b); - -#define LargeIntegerGreaterThan(a, b) \ - ((a).HighPart > (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart > (b).LowPart)) - -#define LargeIntegerGreaterThanOrEqualTo(a, b) \ - ((a).HighPart > (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart >= (b).LowPart)) - -#define LargeIntegerLessThan(a, b) \ - ((a).HighPart < (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart < (b).LowPart)) - -#define LargeIntegerLessThanOrEqualTo(a, b) \ - ((a).HighPart < (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart <= (b).LowPart)) - -#define LargeIntegerEqualTo(a, b) \ - ((a).HighPart == (b).HighPart && (a).LowPart == (b).LowPart) - -#define LargeIntegerGreaterOrEqualToZero(a) ((a).HighPart >= 0) - -#define LargeIntegerLessThanZero(a) ((a).HighPart < 0) - -#define LargeIntegerNotEqualToZero(a) ((a).HighPart || (a).LowPart) - -#endif diff --git a/src/WINNT/afsd/largeintdotnet.c b/src/WINNT/afsd/largeintdotnet.c deleted file mode 100644 index 231182395..000000000 --- a/src/WINNT/afsd/largeintdotnet.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved - * - * (C) COPYRIGHT IBM CORPORATION 1987, 1988 - * LICENSED MATERIALS - PROPERTY OF IBM - * - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#include -#include -#include -#include -#include - -#if (_MSC_VER >= 1300) -LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER result; - int carry; - result.LowPart=a.LowPart+b.LowPart; - carry=(result.LowPart < b.LowPart) ? 1 : 0; - result.HighPart=a.HighPart+b.HighPart+ carry; - return result; -} -LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER result; - int borrow; - result.LowPart=a.LowPart-b.LowPart; - borrow=(result.LowPart > a.LowPart) ? 1 : 0; - result.HighPart=a.HighPart-b.HighPart- borrow; - return result; -} -LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder) -{ - LARGE_INTEGER result; - ULONGLONG a1,q1,r1; - - result.HighPart=0; - result.LowPart=0; - if (b == 0) { return result; } - if (b == 1) { *remainder = 0; return a; } - - a1=(a.HighPart << 32) | a.LowPart; - q1=a1/b; - r1=a1-(q1*b); - if (r1 > ULONG_MAX) /*XXX */; - result.HighPart=q1 >> 32; - result.LowPart=q1 & 0xffffffff; - *remainder=r1 & 0xffffffff; - return result; -} -LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder) -{ - LARGE_INTEGER result; - ULONGLONG a1,b1,q1,r1; - - result.HighPart=0; - result.LowPart=0; - if (b.HighPart == 0 && b.LowPart == 0) { return result; } - if (b.HighPart == 0 && b.LowPart == 1) { - remainder->HighPart = 0; - remainder->LowPart = 0; - return a; - } - - a1=(a.HighPart << 32) | a.LowPart; - b1=(b.HighPart << 32) | a.LowPart; - q1=a1/b1; - r1=a1-(q1*b1); - result.HighPart=q1 >> 32; - result.LowPart=q1 & 0xffffffff; - remainder->HighPart=r1 >> 32; - remainder->LowPart=r1 & 0xffffffff; - return result; -} - -LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) -{ - LARGE_INTEGER result; - result.HighPart=0; - result.LowPart=a; - return result; -} -#endif diff --git a/src/WINNT/afsd/libafsconf.def b/src/WINNT/afsd/libafsconf.def deleted file mode 100644 index d43a2df86..000000000 --- a/src/WINNT/afsd/libafsconf.def +++ /dev/null @@ -1,26 +0,0 @@ -LIBRARY libafsconf - - -CODE EXECUTE SHARED -DATA READ WRITE - -EXPORTS - cm_GetRootCellName @1 - - cm_SearchCellFile @3 - - cm_WriteConfigString @5 - cm_WriteConfigInt @6 - - cm_OpenCellFile @8 - cm_AppendPrunedCellList @9 - cm_AppendNewCell @10 - cm_AppendNewCellLine @11 - cm_CloseCellFile @12 - cm_SearchCellByDNS @13 - getAFSServer @14 - cm_InitDNS @15 - cm_GetConfigDir @16 - afs_uuid_create @17 - afs_uuid_equal @18 - \ No newline at end of file diff --git a/src/WINNT/afsd/libafsconf.rc b/src/WINNT/afsd/libafsconf.rc deleted file mode 100644 index 744f727c5..000000000 --- a/src/WINNT/afsd/libafsconf.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Cell File DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "libafsconf" -#define AFS_VERINFO_FILENAME "libafsconf.dll" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/lock.txt b/src/WINNT/afsd/lock.txt deleted file mode 100644 index a9dc5a08c..000000000 --- a/src/WINNT/afsd/lock.txt +++ /dev/null @@ -1,37 +0,0 @@ -Copyright 2000, International Business Machines Corporation and others. -All Rights Reserved. - -This software has been released under the terms of the IBM Public -License. For details, see the LICENSE file in the top-level source -directory or online at http://www.openafs.org/dl/license10.html - -The locking/waiting hierarchy here is this: - - - lock scp's bufCreateLock - - - resv multiple simul. buffers reservation - - lock buffer I/O flags - - lock buffer's mutex - - - smb_fid_t mutex - - - scache flags (storing, fetching, etc); if set for more than one - vnode in a volume, must be set in vnode order (see cm_Rename). - - - scache mutex - - - lock tran_globalLock - - lock buf_globalLock - - - userp->mx - - - lock cm_scacheLock - - - volp->mx - - - cm_connLock (locked before cm_userLock in cm_GCConnections) - - cm_cellLock - - cm_serverLock (locked after cm_cellLock in cm_IoctlGetCell) - - other global locks - - cm_aclLock (locked before cm_userLock throughout cm_aclent.c) - - cm_userLock diff --git a/src/WINNT/afsd/logon_ad.cpp b/src/WINNT/afsd/logon_ad.cpp deleted file mode 100644 index 204147150..000000000 --- a/src/WINNT/afsd/logon_ad.cpp +++ /dev/null @@ -1,392 +0,0 @@ -/* - -Copyright 2004 by the Massachusetts Institute of Technology - -All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of the Massachusetts -Institute of Technology (M.I.T.) not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -*/ - - -//#pragma keyword("interface",on) -#define interface struct -#define SECURITY_WIN32 -#include "afslogon.h" - -/**/ -#include -#include -#include -#include -#include -#include -#include -/**/ - -#define SEC_ERR_VALUE(v) if (status==v) return #v - -char * _get_sec_err_text(SECURITY_STATUS status) { - SEC_ERR_VALUE(SEC_E_OK); - SEC_ERR_VALUE(SEC_I_CONTINUE_NEEDED); - SEC_ERR_VALUE(SEC_I_COMPLETE_NEEDED); - SEC_ERR_VALUE(SEC_I_COMPLETE_AND_CONTINUE); - SEC_ERR_VALUE(SEC_E_INCOMPLETE_MESSAGE); - SEC_ERR_VALUE(SEC_I_INCOMPLETE_CREDENTIALS); - SEC_ERR_VALUE(SEC_E_INVALID_HANDLE); - SEC_ERR_VALUE(SEC_E_TARGET_UNKNOWN); - SEC_ERR_VALUE(SEC_E_LOGON_DENIED); - SEC_ERR_VALUE(SEC_E_INTERNAL_ERROR); - SEC_ERR_VALUE(SEC_E_NO_CREDENTIALS); - SEC_ERR_VALUE(SEC_E_NO_AUTHENTICATING_AUTHORITY); - SEC_ERR_VALUE(SEC_E_INSUFFICIENT_MEMORY); - SEC_ERR_VALUE(SEC_E_INVALID_TOKEN); - SEC_ERR_VALUE(SEC_E_UNSUPPORTED_FUNCTION); - SEC_ERR_VALUE(SEC_E_WRONG_PRINCIPAL); - return "Unknown"; -} - -#undef SEC_ERR_VALUE - -DWORD LogonSSP(PLUID lpLogonId, PCtxtHandle outCtx) { - DWORD code = 1; - SECURITY_STATUS status; - CredHandle creds; - CtxtHandle ctxclient,ctxserver; - TimeStamp expiry; - BOOL cont = TRUE; - BOOL first = TRUE; - SecBufferDesc sdescc,sdescs; - SecBuffer stokc,stoks; - ULONG cattrs,sattrs; - int iters = 10; - - outCtx->dwLower = 0; - outCtx->dwUpper = 0; - - cattrs = 0; - sattrs = 0; - - status = AcquireCredentialsHandle( - NULL, - "Negotiate", - SECPKG_CRED_BOTH, - lpLogonId, - NULL, - NULL, - NULL, - &creds, - &expiry); - - if (status != SEC_E_OK) { - DebugEvent("AcquireCredentialsHandle failed: %lX", status); - goto ghp_0; - } - - sdescc.cBuffers = 1; - sdescc.pBuffers = &stokc; - sdescc.ulVersion = SECBUFFER_VERSION; - - stokc.BufferType = SECBUFFER_TOKEN; - stokc.cbBuffer = 0; - stokc.pvBuffer = NULL; - - sdescs.cBuffers = 1; - sdescs.pBuffers = &stoks; - sdescs.ulVersion = SECBUFFER_VERSION; - - stoks.BufferType = SECBUFFER_TOKEN; - stoks.cbBuffer = 0; - stoks.pvBuffer = NULL; - - do { - status = InitializeSecurityContext( - &creds, - ((first)? NULL:&ctxclient), - NULL, - ISC_REQ_DELEGATE | ISC_REQ_ALLOCATE_MEMORY, - 0, - SECURITY_NATIVE_DREP, - ((first)?NULL:&sdescs), - 0, - &ctxclient, - &sdescc, - &cattrs, - &expiry - ); - - DebugEvent("InitializeSecurityContext returns status[%lX](%s)",status,_get_sec_err_text(status)); - - if (!first) FreeContextBuffer(stoks.pvBuffer); - - if (status == SEC_I_COMPLETE_NEEDED || status == SEC_I_COMPLETE_AND_CONTINUE) { - CompleteAuthToken(&ctxclient, &sdescc); - } - - if (status != SEC_I_CONTINUE_NEEDED && status != SEC_I_COMPLETE_AND_CONTINUE) { - cont = FALSE; - } - - if (!stokc.cbBuffer && !cont) { - DebugEvent("Breaking out after InitializeSecurityContext"); - break; - } - - status = AcceptSecurityContext( - &creds, - ((first)?NULL:&ctxserver), - &sdescc, - ASC_REQ_DELEGATE | ASC_REQ_ALLOCATE_MEMORY, - SECURITY_NATIVE_DREP, - &ctxserver, - &sdescs, - &sattrs, - &expiry); - - DebugEvent("AcceptSecurityContext returns status[%lX](%s)", status, _get_sec_err_text(status)); - - FreeContextBuffer(stokc.pvBuffer); - - if (status == SEC_I_COMPLETE_NEEDED || status == SEC_I_COMPLETE_AND_CONTINUE) { - CompleteAuthToken(&ctxserver,&sdescs); - } - - if (status == SEC_I_CONTINUE_NEEDED || status == SEC_I_COMPLETE_AND_CONTINUE) { - cont = TRUE; - } - - if (!cont) - FreeContextBuffer(stoks.pvBuffer); - - first = FALSE; - iters--; /* just in case, hard limit on loop */ - } while (cont && iters); - - if (sattrs & ASC_RET_DELEGATE) { - DebugEvent("Received delegate context"); - *outCtx = ctxserver; - code = 0; - } else { - DebugEvent("Didn't receive delegate context"); - outCtx->dwLower = 0; - outCtx->dwUpper = 0; - DeleteSecurityContext(&ctxserver); - } - - DeleteSecurityContext(&ctxclient); - FreeCredentialsHandle(&creds); -ghp_0: - return code; -} - -DWORD QueryAdHomePathFromSid(char * homePath, size_t homePathLen, PSID psid, PWSTR domain) { - DWORD code = 1; /* default is failure */ - NTSTATUS rv = 0; - HRESULT hr = S_OK; - LPWSTR p = NULL; - WCHAR adsPath[MAX_PATH] = L""; - BOOL coInitialized = FALSE; - CHAR ansidomain[256], *a; - - homePath[0] = '\0'; - - /* I trust this is an ASCII domain name */ - for ( p=domain, a=ansidomain; *a = (CHAR)*p; p++, a++); - DebugEvent("Domain: %s", ansidomain); - - if (ConvertSidToStringSidW(psid,&p)) { - IADsNameTranslate *pNto; - - DebugEvent("Got SID string [%S]", p); - - hr = CoInitialize(NULL); - if (SUCCEEDED(hr)) - coInitialized = TRUE; - - hr = CoCreateInstance( CLSID_NameTranslate, - NULL, - CLSCTX_INPROC_SERVER, - IID_IADsNameTranslate, - (void**)&pNto); - - if (FAILED(hr)) { DebugEvent("Can't create nametranslate object"); } - else { - hr = pNto->Init(ADS_NAME_INITTYPE_GC,L""); - if (FAILED(hr)) { - DebugEvent("NameTranslate Init GC failed [%ld]", hr); - if ( domain ) { - hr = pNto->Init(ADS_NAME_INITTYPE_DOMAIN,domain); - if (FAILED(hr)) { - DebugEvent("NameTranslate Init Domain failed [%ld]", hr); - } - } - } - - if (!FAILED(hr)) { - hr = pNto->Set(ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME, p); - if (FAILED(hr)) { DebugEvent("Can't set sid string"); } - else { - BSTR bstr; - - hr = pNto->Get(ADS_NAME_TYPE_1779, &bstr); - if(SUCCEEDED(hr)) { - hr = StringCchCopyW(adsPath, MAX_PATH, bstr); - if(FAILED(hr)) { - DebugEvent("Overflow while copying ADS path"); - adsPath[0] = L'\0'; - } - - SysFreeString(bstr); - } - } - } - pNto->Release(); - } - - LocalFree(p); - - } else { - DebugEvent("Can't convert sid to string"); - } - - if (adsPath[0]) { - WCHAR fAdsPath[MAX_PATH]; - IADsUser *pAdsUser; - BSTR bstHomeDir = NULL; - - hr = StringCchPrintfW(fAdsPath, MAX_PATH, L"LDAP://%s", adsPath); - if (hr != S_OK) { - DebugEvent("Can't format full adspath"); - goto cleanup; - } - - DebugEvent("Trying adsPath=[%S]", fAdsPath); - - hr = ADsGetObject( fAdsPath, IID_IADsUser, (LPVOID *) &pAdsUser); - if (hr != S_OK) { - DebugEvent("Can't open IADs object"); - goto cleanup; - } - - hr = pAdsUser->get_Profile(&bstHomeDir); - if (hr != S_OK) { - DebugEvent("Can't get profile directory"); - goto cleanup_homedir_section; - } - - wcstombs(homePath, bstHomeDir, homePathLen); - - DebugEvent("Got homepath [%s]", homePath); - - SysFreeString(bstHomeDir); - - code = 0; - -cleanup_homedir_section: - pAdsUser->Release(); - } - -cleanup: - if (coInitialized) - CoUninitialize(); - - return code; -} - -/* Try to determine the user's AD home path. *homePath is assumed to be at least MAXPATH bytes. - If successful, opt.flags is updated with LOGON_FLAG_AD_REALM to indicate that we are dealing with - an AD realm. */ -DWORD GetAdHomePath(char * homePath, size_t homePathLen, PLUID lpLogonId, LogonOptions_t * opt) { - CtxtHandle ctx; - DWORD code = 0; - SECURITY_STATUS status; - - homePath[0] = '\0'; - - if (LogonSSP(lpLogonId,&ctx)) { - DebugEvent("Failed LogonSSP"); - return 1; - } else { - status = ImpersonateSecurityContext(&ctx); - if (status == SEC_E_OK) { - PSECURITY_LOGON_SESSION_DATA plsd; - NTSTATUS rv; - - rv = LsaGetLogonSessionData(lpLogonId, &plsd); - if (rv == 0) { - PWSTR domain; - - domain = (PWSTR)malloc(sizeof(WCHAR) * (plsd->LogonDomain.Length+1)); - memcpy(domain, plsd->LogonDomain.Buffer, sizeof(WCHAR) * (plsd->LogonDomain.Length)); - domain[plsd->LogonDomain.Length] = 0; - - if (!QueryAdHomePathFromSid(homePath,homePathLen,plsd->Sid,domain)) { - DebugEvent("Returned home path [%s]",homePath); - opt->flags |= LOGON_FLAG_AD_REALM; - } - free(domain); - LsaFreeReturnBuffer(plsd); - } else { - DebugEvent("LsaGetLogonSessionData failed [%lX]", rv); - } - RevertSecurityContext(&ctx); - } else { - DebugEvent("Can't impersonate context [%lX]",status); - code = 1; - } - - DeleteSecurityContext(&ctx); - return code; - } -} - -BOOL GetLocalShortDomain(PWSTR Domain, DWORD cbDomain) -{ - HRESULT hr; - IADsADSystemInfo *pADsys; - BOOL coInitialized = FALSE; - BOOL retval = FALSE; - - hr = CoInitialize(NULL); - if (SUCCEEDED(hr)) - coInitialized = TRUE; - - hr = CoCreateInstance(CLSID_ADSystemInfo, - NULL, - CLSCTX_INPROC_SERVER, - IID_IADsADSystemInfo, - (void**)&pADsys); - if ( !FAILED(hr) ) { - BSTR bstr; - - hr = pADsys->get_DomainShortName(&bstr); - if ( !FAILED(hr) ) { - hr = StringCbCopyW( Domain, cbDomain, bstr ); - if(SUCCEEDED(hr)) { - retval = TRUE; - } - SysFreeString(bstr); - } - pADsys->Release(); - } - - if (coInitialized) - CoUninitialize(); - - return retval; -} diff --git a/src/WINNT/afsd/netbios95.c b/src/WINNT/afsd/netbios95.c deleted file mode 100644 index bc86a3c60..000000000 --- a/src/WINNT/afsd/netbios95.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Netbios function for DJGPP: calls interrupt 5Ch for Netbios function. - NCB and buffer space must be in DOS memory (below 1MB). */ - -#include -#include -#include -#include -#include "dosdefs95.h" -#include "netbios95.h" - -extern int handler_seg, handler_off; - -int Netbios(NCB *Ncb, dos_ptr dos_ncb) -{ - __dpmi_regs regs; - int asynch = 1; - dos_ptr oldncb_buffer; - -#if 1 - if (Ncb->ncb_command == NCBRESET || - Ncb->ncb_command == NCBCANCEL || - Ncb->ncb_command == NCBUNLINK || - Ncb->ncb_command == NCBADDNAME || - Ncb->ncb_command == NCBENUM || - Ncb->ncb_command == NCBDELNAME) /* temp */ - asynch = 0; -#else - if (1) - asynch = 0; -#endif - else - /* set to asynchronous */ - Ncb->ncb_command |= ASYNCH; - - /* adjust ncb_buffer pointer to be a segment:zero-offset pointer - for __dpmi_int */ - oldncb_buffer = Ncb->ncb_buffer; - Ncb->ncb_buffer = Ncb->ncb_buffer << 12; - - /*if (asynch) - Ncb->ncb_post = (handler_seg << 16) | handler_off;*/ - - /* copy to DOS space */ - dosmemput(Ncb, sizeof(NCB), dos_ncb); - - /* set address of NCB in registers */ - memset(®s, 0, sizeof(regs)); - regs.d.ebx = 0; - regs.x.ds = regs.x.es = dos_ncb/16; - - __dpmi_int(0x5c,®s); - /*dosmemget(__tb, sizeof(NCB), Ncb);*/ - - if (asynch) - IOMGR_NCBSelect(Ncb, dos_ncb, NULL); - - /* undo the change to ncb_buffer */ - Ncb->ncb_buffer = oldncb_buffer; - - return regs.x.ax; -} - diff --git a/src/WINNT/afsd/netbios95.h b/src/WINNT/afsd/netbios95.h deleted file mode 100644 index 5fd7e66d4..000000000 --- a/src/WINNT/afsd/netbios95.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef NETBIOS_H -#define NETBIOS_H - -#define BYTE char -#define WORD short - -#define NCBNAMSZ 16 /* absolute length of a net name */ -#define MAX_LANA 254 /* lana's in range 0 to MAX_LANA inclusive */ - -#define MAX_COMPUTERNAME_LENGTH 15 - - -#define UCHAR unsigned char -#define PUCHAR unsigned char * -#define WORD short - -#include "osithrd95.h" - -typedef struct _NCB { - UCHAR ncb_command; - UCHAR ncb_retcode; - UCHAR ncb_lsn; - UCHAR ncb_num; - unsigned int ncb_buffer; - WORD ncb_length; - UCHAR ncb_callname[NCBNAMSZ]; - UCHAR ncb_name[NCBNAMSZ]; - UCHAR ncb_rto; - UCHAR ncb_sto; - int (*ncb_post)(); - UCHAR ncb_lana_num; - UCHAR ncb_cmd_cplt; - UCHAR ncb_reserve[10]; - UCHAR ncb_reserve2[4]; - EVENT_HANDLE ncb_event; -} NCB, *PNCB; - -/* this struct is returned by NCBENUM command in Win32 but is not available - in DJGPP. */ -typedef struct { - int length; - int lana[8]; -} LANA_ENUM; - - -#define NCBCALL 0x10 -#define NCBLISTEN 0x11 -#define NCBHANGUP 0x12 -#define NCBSEND 0x14 -#define NCBRECV 0x15 -#define NCBRECVANY 0x16 -#define NCBCHAINSEND 0x17 -#define NCBDGSEND 0x20 -#define NCBDGRECV 0x21 -#define NCBDGSENDBC 0x22 -#define NCBDGRECVBC 0x23 -#define NCBADDNAME 0x30 -#define NCBDELNAME 0x31 -#define NCBRESET 0x32 -#define NCBASTAT 0x33 -#define NCBSSTAT 0x34 -#define NCBCANCEL 0x35 -#define NCBADDGRNAME 0x36 -#define NCBENUM 0x37 -#define NCBUNLINK 0x70 -#define NCBSENDNA 0x71 -#define NCBCHAINSENDNA 0x72 -#define NCBLANSTALERT 0x73 -#define NCBACTION 0x77 -#define NCBFINDNAME 0x78 -#define NCBTRACE 0x79 -#define ASYNCH 0x80 - - -#define NRC_GOODRET 0x00 -#define NRC_BUFLEN 0x01 -#define NRC_ILLCMD 0x03 -#define NRC_CMDTMO 0x05 -#define NRC_INCOMP 0x06 -#define NRC_BADDR 0x07 -#define NRC_SNUMOUT 0x08 -#define NRC_NORES 0x09 -#define NRC_SCLOSED 0x0a -#define NRC_CMDCAN 0x0b -#define NRC_DUPNAME 0x0d -#define NRC_NAMTFUL 0x0e -#define NRC_ACTSES 0x0f -#define NRC_LOCTFUL 0x11 -#define NRC_REMTFUL 0x12 -#define NRC_ILLNN 0x13 -#define NRC_NOCALL 0x14 -#define NRC_NOWILD 0x15 -#define NRC_INUSE 0x16 -#define NRC_NAMERR 0x17 -#define NRC_SABORT 0x18 -#define NRC_NAMCONF 0x19 -#define NRC_IFBUSY 0x21 -#define NRC_TOOMANY 0x22 -#define NRC_BRIDGE 0x23 -#define NRC_CANOCCR 0x24 -#define NRC_CANCEL 0x26 -#define NRC_DUPENV 0x30 -#define NRC_ENVNOTDEF 0x34 -#define NRC_OSRESNOTAV 0x35 -#define NRC_MAXAPPS 0x36 -#define NRC_NOSAPS 0x37 -#define NRC_NORESOURCES 0x38 -#define NRC_INVADDRESS 0x39 -#define NRC_INVDDID 0x3B -#define NRC_LOCKFAIL 0x3C -#define NRC_OPENERR 0x3f -#define NRC_SYSTEM 0x40 -#define NRC_PENDING 0xff - -#endif /* NETBIOS_H */ diff --git a/src/WINNT/afsd/queue95.c b/src/WINNT/afsd/queue95.c deleted file mode 100644 index 06f64547c..000000000 --- a/src/WINNT/afsd/queue95.c +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* queue.c - * - * Generic queue for use with Windows 95/DJGPP disk cache - * - ************************************************************************/ - -#ifdef DISKCACHE95 - -#define NULL 0 -#include "queue95.h" -#include - -void QInit(Queue *queue) -{ - queue->head = NULL; - queue->tail = NULL; - queue->currpos = NULL; -} - -void QAddT(Queue *queue, QLink* node, int ord) -{ - /*QLink* node = new QLink;*/ - - /*node->item = x;*/ - node->ord = ord; - node->next = NULL; - node->prev = NULL; - if (!queue->tail) - queue->head = queue->tail = node; - else { - queue->tail->next = node; - queue->tail = node; - node->prev = queue->tail; - } - queue->size++; -} - -void QAddH(Queue *queue, QLink *node, int ord) -{ - node->ord = ord; - node->next = NULL; - node->prev = NULL; - if (!queue->head) - queue->head = queue->tail = node; - else { - node->next = queue->head; - queue->head->prev = node; - queue->head = node; - } - queue->size++; -} - -void QAddOrd(Queue *queue, QLink *node, int ord) -{ - /*QLink* node = new QLink;*/ - QLink* p, *prev; - - node->ord = ord; - node->next = NULL; - node->prev = NULL; - if (!queue->tail) - queue->head = queue->tail = node; - else { - p = queue->head; - while (p && ord >= p->ord) { /* add towards tail end if equals found */ - prev = p; - p = p->next; - } - if (p == queue->head) { - QAddH(queue, node, ord); - } - else if (p == NULL) { - QAddT(queue, node, ord); - } - else { - node->next = p; - node->prev = prev; - prev->next = node; - } - } - queue->size++; -} - -QLink* QServe(Queue *queue) -{ - QLink *n = queue->head; - - if (!queue->head) return NULL; - if (queue->head == queue->tail) - queue->head = queue->tail = NULL; - else - queue->head = n->next; - queue->size--; - return n; -} - -void QMoveToTail(Queue *queue, QLink *n, int ord) -{ - QRemove(queue, n); - QAddT(queue, n, ord); -} - -void QRemove(Queue *queue, QLink *n) -{ - /*QLink* n2 = NULL;*/ - - if (!queue->head) return; - /*while(n && n != x) { - n2 = n; - n = n->next; - }*/ - if (n == queue->currpos) { - if (n == queue->head) queue->currpos = n->next; - if (n == queue->tail) queue->currpos = n->prev; - if (n->prev) queue->currpos = n->prev; - } - - if (n->prev) - { - /*assert(n->prev->next == n);*/ - n->prev->next = n->next; - } - else - queue->head = n->next; - - if (n->next) - { - /*assert(n->next->prev == n);*/ - n->next->prev = n->prev; - } - else - queue->tail = n->prev; - - queue->size--; -} - -QLink *QCurrent(Queue *queue) -{ - /*if (currpos) return currpos->item; - else return NULL;*/ - return queue->currpos; -} - -void QIterate(Queue *queue) -{ - QLink* node; - - node = queue->head; - while (node) { - printf("node=%x, ord=%f\n", node, node->ord); - node = node->next; - } - fflush(stdout); -} - -#endif /* DISKCACHE95 */ diff --git a/src/WINNT/afsd/queue95.h b/src/WINNT/afsd/queue95.h deleted file mode 100644 index 8bbb8f4a6..000000000 --- a/src/WINNT/afsd/queue95.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* queue.h - * - * Class declaration for generic queue for use with Windows 95/DJGPP client - * disk cache - * - ***************************************************************************/ - -#ifndef _QUEUE_H -#define _QUEUE_H - -/* offset of member m in struct T */ -#define OFFSETOF(T, m) ((USHORT) &(((T *) NULL)->m)) - -/* get pointer to parent struct T containing member m at address p */ -#define MEM_TO_OBJ(T, m, p) ((char *)(p) - OFFSETOF(T, m)) - -typedef struct _QLink { - struct _QLink *next; - struct _QLink *prev; - int ord; -} QLink; - -typedef struct _Queue { - QLink *head; - QLink *tail; - int size; - QLink *currpos; -} Queue; - -/* add item to tail of queue */ -void QAddT(Queue *queue, QLink* node, int ord); - -/* add item to head of queue */ -void QAddH(Queue *queue, QLink *node, int ord); - -/* add item based on order value */ -void QAddOrd(Queue *queue, QLink *node, int ord); - -/* remove and return head of queue */ -QLink* QServe(Queue *queue); - -/* move item to tail of queue */ -void QMoveToTail(Queue *queue, QLink *x, int ord); - -/* remove item from queue */ -void QRemove(Queue *queue, QLink* x); - -/* return current position */ -QLink *QCurrent(Queue *queue); - -/* print out list of queued items */ -void QIterate(Queue *queue); - -#endif diff --git a/src/WINNT/afsd/sample/token.c b/src/WINNT/afsd/sample/token.c deleted file mode 100644 index f3f1810ee..000000000 --- a/src/WINNT/afsd/sample/token.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include "krb_auth.h" -#include "afs_tokens.h" -#include "cm_config.h" -#include "cmd.h" - -#define AFS_KERBEROS_ENV - -#define KABADARGUMENT 1 -#define KLOGEXIT(code) exit(code) - -int CommandProc(); - -static int zero_argc; -static char **zero_argv; - -void main (argc, argv) - int argc; - char *argv[]; -{ struct cmd_syndesc *ts; - int code; - WSADATA WSAjunk; - - zero_argc = argc; - zero_argv = argv; - - /* Start up sockets */ - WSAStartup(0x0101, &WSAjunk); - - ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "obtain Kerberos authentication"); - -#define aXFLAG 0 -#define aPRINCIPAL 1 -#define aPASSWORD 2 -#define aCELL 3 -#define aSERVERS 4 -#define aPIPE 5 -#define aSILENT 6 -#define aLIFETIME 7 -#define aSETPAG 8 -#define aTMP 9 - - - cmd_AddParm(ts, "-x", CMD_FLAG, CMD_OPTIONAL, "(obsolete, noop)"); - cmd_Seek(ts, aPRINCIPAL); - cmd_AddParm(ts, "-principal", CMD_SINGLE, CMD_OPTIONAL, "user name"); - cmd_AddParm(ts, "-password", CMD_SINGLE, CMD_OPTIONAL, "user's password"); - cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name"); - cmd_AddParm(ts, "-servers", CMD_LIST, CMD_OPTIONAL, "explicit list of servers"); - cmd_AddParm(ts, "-pipe", CMD_FLAG, CMD_OPTIONAL, "read password from stdin"); - cmd_AddParm(ts, "-silent", CMD_FLAG, CMD_OPTIONAL, "silent operation"); - cmd_AddParm(ts, "-lifetime", CMD_SINGLE, CMD_OPTIONAL, "ticket lifetime in hh[:mm[:ss]]"); - cmd_AddParm(ts, "-setpag", CMD_FLAG, CMD_OPTIONAL, "Create a new setpag before authenticating"); - cmd_AddParm(ts, "-tmp", CMD_FLAG, CMD_OPTIONAL, "write Kerberos-style ticket file in /tmp"); - - code = cmd_Dispatch(argc, argv); - KLOGEXIT(code); -} - -static char *getpipepass() { - static char gpbuf[BUFSIZ]; - /* read a password from stdin, stop on \n or eof */ - register int i, tc; - memset(gpbuf, 0, sizeof(gpbuf)); - for(i=0; i<(sizeof(gpbuf)-1); i++) { - tc = fgetc(stdin); - if (tc == '\n' || tc == EOF) break; - gpbuf[i] = tc; - } - return gpbuf; -} - -/* good_gets is like gets except that it take a max string length and won't - * write past the end of its input buffer. It returns a variety of negative - * numbers in case of errors and zero if there was no characters read (a blank - * line for instance). Otherwise it returns the length of the string read in. - */ - -static int good_gets (s, max) - char *s; - int max; -{ int l; /* length of string read */ - if (!fgets (s, max, stdin)) { - if (feof(stdin)) return EOF; /* EOF on input, nothing read */ - else return -2; /* I don't think this can happen */ - } - l = strlen (s); - if (l && (s[l-1] == '\n')) s[--l] = 0; - return l; -} - -static int read_pw_string(char *s, int max) -{ - int ok = 0; - HANDLE h; - int md; - - /* set no echo */ - h = GetStdHandle (STD_INPUT_HANDLE); - GetConsoleMode (h, &md); - SetConsoleMode (h, md & ~ENABLE_ECHO_INPUT); - - while (!ok) { - printf("Password:"); - fflush(stdout); - if (good_gets(s, max) <= 0) { - printf("\n"); fflush(stdout); - if (feof (stdin)) break; /* just give up */ - else continue; /* try again: blank line */ - } - ok = 1; - } - - if (!ok) - memset(s, 0, max); - - /* reset echo */ - SetConsoleMode (h, md); - printf("\n"); fflush(stdout); - - s[max-1] = 0; /* force termination */ - return !ok; -} - -CommandProc (as, arock) - char *arock; - struct cmd_syndesc *as; -{ - char name[MAXKTCNAMELEN]; - char defaultCell[256]; - char realm[MAXKTCREALMLEN]; - int code; - int i, dosetpag; - int lifetime; /* requested ticket lifetime */ - - char passwd[BUFSIZ]; - - static char rn[] = "klog"; /*Routine name*/ - static int Pipe = 0; /* reading from a pipe */ - static int Silent = 0; /* Don't want error messages */ - - int foundPassword = 0; /*Not yet, anyway*/ - int foundExplicitCell = 0; /*Not yet, anyway*/ - int writeTicketFile = 0; /* write ticket file to /tmp */ - int password_expires = -1; - - char *reason; /* string describing errors */ - - /* blow away command line arguments */ - for (i=1; iparms[aSILENT].itemsp ? 1 : 0); - Pipe = (as->parms[aPIPE].itemsp ? 1 : 0); - - /* Determine if we should also do a setpag based on -setpag switch */ - dosetpag = (as->parms[aSETPAG].itemsp ? 1 : 0); - - if (as->parms[aTMP].itemsp) { - writeTicketFile = 1; - } - - cm_GetRootCellName(defaultCell); - - /* Parse our arguments. */ - - if (as->parms[aCELL].itemsp) { - /* - * cell name explicitly mentioned; take it in if no other cell name - * has already been specified and if the name actually appears. If - * the given cell name differs from our own, we don't do a lookup. - */ - foundExplicitCell = 1; - strncpy (realm, as->parms[aCELL].itemsp->data, sizeof(realm)); - } - - if (as->parms[aSERVERS].itemsp) { - fprintf (stderr, "SERVERS option not available.\n"); - } - - if (as->parms[aPRINCIPAL].itemsp) { - strcpy(name, as->parms[aPRINCIPAL].itemsp->data); - } else { - /* No explicit name provided. */ - DWORD size = GetEnvironmentVariable("USERNAME", name, sizeof(name) - 1); - if (size <= 0 || size >= sizeof(name)) - KLOGEXIT( KABADARGUMENT ); - } - - if (as->parms[aPASSWORD].itemsp) { - /* - * Current argument is the desired password string. Remember it in - * our local buffer, and zero out the argument string - anyone can - * see it there with ps! - */ - foundPassword = 1; - strncpy (passwd, as->parms[aPASSWORD].itemsp->data, sizeof(passwd)); - memset (as->parms[aPASSWORD].itemsp->data, 0, - strlen(as->parms[aPASSWORD].itemsp->data)); - } - - if (as->parms[aLIFETIME].itemsp) { - char *life = as->parms[aLIFETIME].itemsp->data; - char *sp; /* string ptr to rest of life */ - lifetime = 3600*strtol (life, &sp, 0); /* hours */ - if (sp == life) { -bad_lifetime: - if (!Silent) fprintf (stderr, "%s: translating '%s' to lifetime failed\n", - rn, life); - return KABADARGUMENT; - } - if (*sp == ':') { - life = sp+1; /* skip the colon */ - lifetime += 60*strtol (life, &sp, 0); /* minutes */ - if (sp == life) goto bad_lifetime; - if (*sp == ':') { - life = sp+1; - lifetime += strtol (life, &sp, 0); /* seconds */ - if (sp == life) goto bad_lifetime; - if (*sp) goto bad_lifetime; - } else if (*sp) goto bad_lifetime; - } else if (*sp) goto bad_lifetime; - if (lifetime > MAXKTCTICKETLIFETIME) { - if (!Silent) - fprintf (stderr, - "%s: a lifetime of %.2f hours is too long, must be less than %d.\n", - rn, (double)lifetime/3600.0, MAXKTCTICKETLIFETIME/3600); - KLOGEXIT( KABADARGUMENT ); - } - } else lifetime = 0; - - if (!foundExplicitCell) strcpy (realm, defaultCell); - - /* Get the password if it wasn't provided. */ - if (!foundPassword) { - if (Pipe) { - strncpy(passwd, getpipepass(), sizeof(passwd)); - } - else { - if (read_pw_string(passwd, sizeof(passwd))) - reason = "can't read password from terminal"; - else if (strlen(passwd) == 0) - reason = "zero length password is illegal"; - else - reason = NULL; - if (reason) { - fprintf (stderr, "Unable to login because %s.\n", reason); - KLOGEXIT( KABADARGUMENT ); - } - } - } - - code = ka_UserAuthenticateGeneral (0, name, "", realm, passwd, lifetime, - &password_expires, 0, &reason); - memset (passwd, 0, sizeof(passwd)); - if (code) { - if (!Silent) { - fprintf (stderr, - "Unable to authenticate to AFS because %s.\n", reason); - } - KLOGEXIT( code ); - } - -#ifndef AFS_KERBEROS_ENV - if (writeTicketFile) { - code = krb_write_ticket_file (realm); - if (!Silent) { - if (code) - com_err (rn, code, "writing Kerberos ticket file"); - else fprintf (stderr, "Wrote ticket file to /tmp\n"); - } - } -#endif - -#ifdef DEBUGEXPIRES - if (password_expires >= 0) { - printf ("password expires at %ld\n", password_expires); - } -#endif /* DEBUGEXPIRES */ - - return 0; -} - -/* dummies to substitute for OSI */ -void *osi_Alloc(int sz) { - return malloc(sz); -} -void osi_Free(void *vs, int sz) { - free(vs); -} diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c deleted file mode 100644 index 3382b52a4..000000000 --- a/src/WINNT/afsd/smb.c +++ /dev/null @@ -1,8512 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#else -#include -#include -#endif /* !DJGPP */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "afsd.h" -#include - -#include "smb.h" -#include "lanahelper.h" - -/* These characters are illegal in Windows filenames */ -static char *illegalChars = "\\/:*?\"<>|"; -BOOL isWindows2000 = FALSE; - -smb_vc_t *dead_vcp = NULL; -smb_vc_t *active_vcp = NULL; - -/* TODO; logout mechanism needs to be thread-safe */ -char *loggedOutName = NULL; -smb_user_t *loggedOutUserp = NULL; -time_t loggedOutTime; -int loggedOut = 0; -int smbShutdownFlag = 0; - -int smb_LogoffTokenTransfer; -time_t smb_LogoffTransferTimeout; - -int smb_StoreAnsiFilenames = 0; - -DWORD last_msg_time = 0; - -long ongoingOps = 0; - -unsigned int sessionGen = 0; - -extern void afsi_log(char *pattern, ...); -extern HANDLE afsi_file; - -osi_hyper_t hzero = {0, 0}; -osi_hyper_t hones = {0xFFFFFFFF, -1}; - -osi_log_t * smb_logp; -osi_rwlock_t smb_globalLock; -osi_rwlock_t smb_rctLock; -osi_mutex_t smb_ListenerLock; - -char smb_LANadapter; -unsigned char smb_sharename[NCBNAMSZ+1] = {0}; - -/* for debugging */ -long smb_maxObsConcurrentCalls=0; -long smb_concurrentCalls=0; - -smb_dispatch_t smb_dispatchTable[SMB_NOPCODES]; - -smb_packet_t *smb_packetFreeListp; -smb_ncb_t *smb_ncbFreeListp; - -int smb_NumServerThreads; - -int numNCBs, numSessions, numVCs; - -int smb_maxVCPerServer; -int smb_maxMpxRequests; - -int smb_authType = SMB_AUTH_EXTENDED; /* type of SMB auth to use. One of SMB_AUTH_* */ -HANDLE smb_lsaHandle; -ULONG smb_lsaSecPackage; -LSA_STRING smb_lsaLogonOrigin; - -#define NCBmax MAXIMUM_WAIT_OBJECTS -EVENT_HANDLE NCBavails[NCBmax], NCBevents[NCBmax]; -EVENT_HANDLE **NCBreturns; -EVENT_HANDLE **NCBShutdown; -EVENT_HANDLE *smb_ServerShutdown; -DWORD NCBsessions[NCBmax]; -NCB *NCBs[NCBmax]; -struct smb_packet *bufs[NCBmax]; - -#define Sessionmax MAXIMUM_WAIT_OBJECTS - 4 -EVENT_HANDLE SessionEvents[Sessionmax]; -unsigned short LSNs[Sessionmax]; -int lanas[Sessionmax]; -BOOL dead_sessions[Sessionmax]; -LANA_ENUM lana_list; - -/* for raw I/O */ -osi_mutex_t smb_RawBufLock; -#ifdef DJGPP -#define SMB_RAW_BUFS 4 -dos_ptr smb_RawBufs; -int smb_RawBufSel[SMB_RAW_BUFS]; -#else -char *smb_RawBufs; -#endif /* DJGPP */ - -#define SMB_MASKFLAG_TILDE 1 -#define SMB_MASKFLAG_CASEFOLD 2 - -#define RAWTIMEOUT INFINITE - -/* for raw write */ -typedef struct raw_write_cont { - long code; - osi_hyper_t offset; - long count; -#ifndef DJGPP - char *buf; -#else - dos_ptr buf; -#endif /* DJGPP */ - int writeMode; - long alreadyWritten; -} raw_write_cont_t; - -/* dir search stuff */ -long smb_dirSearchCounter = 1; -smb_dirSearch_t *smb_firstDirSearchp; -smb_dirSearch_t *smb_lastDirSearchp; - -/* hide dot files? */ -int smb_hideDotFiles; - -/* global state about V3 protocols */ -int smb_useV3; /* try to negotiate V3 */ - -#ifndef DJGPP -static showErrors = 1; -/* MessageBox or something like it */ -int (_stdcall *smb_MBfunc)(HWND, LPCTSTR, LPCTSTR, UINT) = NULL; -#endif /* DJGPP */ - -/* GMT time info: - * Time in Unix format of midnight, 1/1/1970 local time. - * When added to dosUTime, gives Unix (AFS) time. - */ -time_t smb_localZero = 0; - -#define USE_NUMERIC_TIME_CONV 1 - -#ifndef USE_NUMERIC_TIME_CONV -/* Time difference for converting to kludge-GMT */ -afs_uint32 smb_NowTZ; -#endif /* USE_NUMERIC_TIME_CONV */ - -char *smb_localNamep = NULL; - -smb_vc_t *smb_allVCsp; - -smb_username_t *usernamesp = NULL; - -smb_waitingLock_t *smb_allWaitingLocks; - -/* forward decl */ -void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, - NCB *ncbp, raw_write_cont_t *rwcp); -void smb_NetbiosInit(); -#ifdef DJGPP -#ifndef AFS_WIN95_ENV -DWORD smb_ServerExceptionFilter(void); -#endif - -extern char cm_HostName[]; -extern char cm_confDir[]; -#endif - -#ifdef DJGPP -#define LPTSTR char * -#define GetComputerName(str, sizep) \ - strcpy((str), cm_HostName); \ - *(sizep) = strlen(cm_HostName) -#endif /* DJGPP */ - -#ifdef LOG_PACKET -void smb_LogPacket(smb_packet_t *packet); -#endif /* LOG_PACKET */ - -char smb_ServerDomainName[MAX_COMPUTERNAME_LENGTH + 1] = ""; /* domain name */ -int smb_ServerDomainNameLength = 0; -char smb_ServerOS[] = "Windows 5.0"; /* Faux OS String */ -int smb_ServerOSLength = sizeof(smb_ServerOS); -char smb_ServerLanManager[] = "Windows 2000 LAN Manager"; /* Faux LAN Manager string */ -int smb_ServerLanManagerLength = sizeof(smb_ServerLanManager); - -/* Faux server GUID. This is never checked. */ -GUID smb_ServerGUID = { 0x40015cb8, 0x058a, 0x44fc, { 0xae, 0x7e, 0xbb, 0x29, 0x52, 0xee, 0x7e, 0xff }}; - -char * myCrt_Dispatch(int i) -{ - switch (i) - { - case 0x00: - return "(00)ReceiveCoreMakeDir"; - case 0x01: - return "(01)ReceiveCoreRemoveDir"; - case 0x02: - return "(02)ReceiveCoreOpen"; - case 0x03: - return "(03)ReceiveCoreCreate"; - case 0x04: - return "(04)ReceiveCoreClose"; - case 0x05: - return "(05)ReceiveCoreFlush"; - case 0x06: - return "(06)ReceiveCoreUnlink"; - case 0x07: - return "(07)ReceiveCoreRename"; - case 0x08: - return "(08)ReceiveCoreGetFileAttributes"; - case 0x09: - return "(09)ReceiveCoreSetFileAttributes"; - case 0x0a: - return "(0a)ReceiveCoreRead"; - case 0x0b: - return "(0b)ReceiveCoreWrite"; - case 0x0c: - return "(0c)ReceiveCoreLockRecord"; - case 0x0d: - return "(0d)ReceiveCoreUnlockRecord"; - case 0x0e: - return "(0e)SendCoreBadOp"; - case 0x0f: - return "(0f)ReceiveCoreCreate"; - case 0x10: - return "(10)ReceiveCoreCheckPath"; - case 0x11: - return "(11)SendCoreBadOp"; - case 0x12: - return "(12)ReceiveCoreSeek"; - case 0x1a: - return "(1a)ReceiveCoreReadRaw"; - case 0x1d: - return "(1d)ReceiveCoreWriteRawDummy"; - case 0x22: - return "(22)ReceiveV3SetAttributes"; - case 0x23: - return "(23)ReceiveV3GetAttributes"; - case 0x24: - return "(24)ReceiveV3LockingX"; - case 0x25: - return "(25)ReceiveV3Trans"; - case 0x26: - return "(26)ReceiveV3Trans[aux]"; - case 0x29: - return "(29)SendCoreBadOp"; - case 0x2b: - return "(2b)ReceiveCoreEcho"; - case 0x2d: - return "(2d)ReceiveV3OpenX"; - case 0x2e: - return "(2e)ReceiveV3ReadX"; - case 0x32: - return "(32)ReceiveV3Tran2A"; - case 0x33: - return "(33)ReceiveV3Tran2A[aux]"; - case 0x34: - return "(34)ReceiveV3FindClose"; - case 0x35: - return "(35)ReceiveV3FindNotifyClose"; - case 0x70: - return "(70)ReceiveCoreTreeConnect"; - case 0x71: - return "(71)ReceiveCoreTreeDisconnect"; - case 0x72: - return "(72)ReceiveNegotiate"; - case 0x73: - return "(73)ReceiveV3SessionSetupX"; - case 0x74: - return "(74)ReceiveV3UserLogoffX"; - case 0x75: - return "(75)ReceiveV3TreeConnectX"; - case 0x80: - return "(80)ReceiveCoreGetDiskAttributes"; - case 0x81: - return "(81)ReceiveCoreSearchDir"; - case 0x82: - return "(82)Find"; - case 0x83: - return "(83)FindUnique"; - case 0x84: - return "(84)FindClose"; - case 0xA0: - return "(A0)ReceiveNTTransact"; - case 0xA2: - return "(A2)ReceiveNTCreateX"; - case 0xA4: - return "(A4)ReceiveNTCancel"; - case 0xA5: - return "(A5)ReceiveNTRename"; - case 0xc0: - return "(C0)OpenPrintFile"; - case 0xc1: - return "(C1)WritePrintFile"; - case 0xc2: - return "(C2)ClosePrintFile"; - case 0xc3: - return "(C3)GetPrintQueue"; - case 0xd8: - return "(D8)ReadBulk"; - case 0xd9: - return "(D9)WriteBulk"; - case 0xda: - return "(DA)WriteBulkData"; - default: - return "unknown SMB op"; - } -} - -char * myCrt_2Dispatch(int i) -{ - switch (i) - { - default: - return "unknown SMB op-2"; - case 0: - return "S(00)CreateFile"; - case 1: - return "S(01)FindFirst"; - case 2: - return "S(02)FindNext"; /* FindNext */ - case 3: - return "S(03)QueryFileSystem_ReceiveTran2QFSInfo"; - case 4: - return "S(04)??"; - case 5: - return "S(05)QueryFileInfo_ReceiveTran2QPathInfo"; - case 6: - return "S(06)SetFileInfo_ReceiveTran2SetPathInfo"; - case 7: - return "S(07)SetInfoHandle_ReceiveTran2QFileInfo"; - case 8: - return "S(08)??_ReceiveTran2SetFileInfo"; - case 9: - return "S(09)??_ReceiveTran2FSCTL"; - case 10: - return "S(0a)_ReceiveTran2IOCTL"; - case 11: - return "S(0b)_ReceiveTran2FindNotifyFirst"; - case 12: - return "S(0c)_ReceiveTran2FindNotifyNext"; - case 13: - return "S(0d)_ReceiveTran2CreateDirectory"; - case 14: - return "S(0e)_ReceiveTran2SessionSetup"; - case 16: - return "S(10)_ReceiveTran2GetDfsReferral"; - case 17: - return "S(11)_ReceiveTran2ReportDfsInconsistency"; - } -} - -char * myCrt_RapDispatch(int i) -{ - switch(i) - { - default: - return "unknown RAP OP"; - case 0: - return "RAP(0)NetShareEnum"; - case 1: - return "RAP(1)NetShareGetInfo"; - case 13: - return "RAP(13)NetServerGetInfo"; - case 63: - return "RAP(63)NetWkStaGetInfo"; - } -} - -/* scache must be locked */ -unsigned int smb_Attributes(cm_scache_t *scp) -{ - unsigned int attrs; - - if ( scp->fileType == CM_SCACHETYPE_DIRECTORY || - scp->fileType == CM_SCACHETYPE_MOUNTPOINT || - scp->fileType == CM_SCACHETYPE_INVALID) - { - attrs = SMB_ATTR_DIRECTORY; -#ifdef SPECIAL_FOLDERS - attrs |= SMB_ATTR_SYSTEM; /* FILE_ATTRIBUTE_SYSTEM */ -#endif /* SPECIAL_FOLDERS */ - } else if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - attrs = SMB_ATTR_DIRECTORY | SMB_ATTR_SPARSE_FILE; - } else - attrs = 0; - - /* - * We used to mark a file RO if it was in an RO volume, but that - * turns out to be impolitic in NT. See defect 10007. - */ -#ifdef notdef - if ((scp->unixModeBits & 0222) == 0 || (scp->flags & CM_SCACHEFLAG_RO)) - attrs |= SMB_ATTR_READONLY; /* turn on read-only flag */ -#else - if ((scp->unixModeBits & 0222) == 0) - attrs |= SMB_ATTR_READONLY; /* turn on read-only flag */ -#endif - - return attrs; -} - -/* Check if the named file/dir is a dotfile/dotdir */ -/* String pointed to by lastComp can have leading slashes, but otherwise should have - no other patch components */ -unsigned int smb_IsDotFile(char *lastComp) { - char *s; - if(lastComp) { - /* skip over slashes */ - for(s=lastComp;*s && (*s == '\\' || *s == '/'); s++); - } - else - return 0; - - /* nulls, curdir and parent dir doesn't count */ - if (!*s) - return 0; - if (*s == '.') { - if (!*(s + 1)) - return 0; - if(*(s+1) == '.' && !*(s + 2)) - return 0; - return 1; - } - return 0; -} - -static int ExtractBits(WORD bits, short start, short len) -{ - int end; - WORD num; - - end = start + len; - - num = bits << (16 - end); - num = num >> ((16 - end) + start); - - return (int)num; -} - -#ifndef DJGPP -void ShowUnixTime(char *FuncName, time_t unixTime) -{ - FILETIME ft; - WORD wDate, wTime; - - smb_LargeSearchTimeFromUnixTime(&ft, unixTime); - - if (!FileTimeToDosDateTime(&ft, &wDate, &wTime)) - osi_Log1(smb_logp, "Failed to convert filetime to dos datetime: %d", GetLastError()); - else { - int day, month, year, sec, min, hour; - char msg[256]; - - day = ExtractBits(wDate, 0, 5); - month = ExtractBits(wDate, 5, 4); - year = ExtractBits(wDate, 9, 7) + 1980; - - sec = ExtractBits(wTime, 0, 5); - min = ExtractBits(wTime, 5, 6); - hour = ExtractBits(wTime, 11, 5); - - sprintf(msg, "%s = %02d-%02d-%04d %02d:%02d:%02d", FuncName, month, day, year, hour, min, sec); - osi_Log1(smb_logp, "%s", osi_LogSaveString(smb_logp, msg)); - } -} -#endif /* DJGPP */ - -#ifndef DJGPP -/* Determine if we are observing daylight savings time */ -void GetTimeZoneInfo(BOOL *pDST, LONG *pDstBias, LONG *pBias) -{ - TIME_ZONE_INFORMATION timeZoneInformation; - SYSTEMTIME utc, local, localDST; - - /* Get the time zone info. NT uses this to calc if we are in DST. */ - GetTimeZoneInformation(&timeZoneInformation); - - /* Return the daylight bias */ - *pDstBias = timeZoneInformation.DaylightBias; - - /* Return the bias */ - *pBias = timeZoneInformation.Bias; - - /* Now determine if DST is being observed */ - - /* Get the UTC (GMT) time */ - GetSystemTime(&utc); - - /* Convert UTC time to local time using the time zone info. If we are - observing DST, the calculated local time will include this. - */ - SystemTimeToTzSpecificLocalTime(&timeZoneInformation, &utc, &localDST); - - /* Set the daylight bias to 0. The daylight bias is the amount of change - * in time that we use for daylight savings time. By setting this to 0 - * we cause there to be no change in time during daylight savings time. - */ - timeZoneInformation.DaylightBias = 0; - - /* Convert the utc time to local time again, but this time without any - adjustment for daylight savings time. - */ - SystemTimeToTzSpecificLocalTime(&timeZoneInformation, &utc, &local); - - /* If the two times are different, then it means that the localDST that - we calculated includes the daylight bias, and therefore we are - observing daylight savings time. - */ - *pDST = localDST.wHour != local.wHour; -} -#else -/* Determine if we are observing daylight savings time */ -void GetTimeZoneInfo(BOOL *pDST, LONG *pDstBias, LONG *pBias) -{ - struct timeb t; - - ftime(&t); - *pDST = t.dstflag; - *pDstBias = -60; /* where can this be different? */ - *pBias = t.timezone; -} -#endif /* DJGPP */ - - -void CompensateForSmbClientLastWriteTimeBugs(afs_uint32 *pLastWriteTime) -{ - BOOL dst; /* Will be TRUE if observing DST */ - LONG dstBias; /* Offset from local time if observing DST */ - LONG bias; /* Offset from GMT for local time */ - - /* - * This function will adjust the last write time to compensate - * for two bugs in the smb client: - * - * 1) During Daylight Savings Time, the LastWriteTime is ahead - * in time by the DaylightBias (ignoring the sign - the - * DaylightBias is always stored as a negative number). If - * the DaylightBias is -60, then the LastWriteTime will be - * ahead by 60 minutes. - * - * 2) If the local time zone is a positive offset from GMT, then - * the LastWriteTime will be the correct local time plus the - * Bias (ignoring the sign - a positive offset from GMT is - * always stored as a negative Bias). If the Bias is -120, - * then the LastWriteTime will be ahead by 120 minutes. - * - * These bugs can occur at the same time. - */ - - GetTimeZoneInfo(&dst, &dstBias, &bias); - - /* First adjust for DST */ - if (dst) - *pLastWriteTime -= (-dstBias * 60); /* Convert dstBias to seconds */ - - /* Now adjust for a positive offset from GMT (a negative bias). */ - if (bias < 0) - *pLastWriteTime -= (-bias * 60); /* Convert bias to seconds */ -} - -#ifndef USE_NUMERIC_TIME_CONV -/* - * Calculate the difference (in seconds) between local time and GMT. - * This enables us to convert file times to kludge-GMT. - */ -static void -smb_CalculateNowTZ() -{ - time_t t; - struct tm gmt_tm, local_tm; - int days, hours, minutes, seconds; - - t = time(NULL); - gmt_tm = *(gmtime(&t)); - local_tm = *(localtime(&t)); - - days = local_tm.tm_yday - gmt_tm.tm_yday; - hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour; - minutes = 60 * hours + local_tm.tm_min - gmt_tm.tm_min; - seconds = 60 * minutes + local_tm.tm_sec - gmt_tm.tm_sec; - - smb_NowTZ = seconds; -} -#endif /* USE_NUMERIC_TIME_CONV */ - -#ifndef DJGPP -#ifdef USE_NUMERIC_TIME_CONV -void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) -{ - // Note that LONGLONG is a 64-bit value - LONGLONG ll; - - ll = Int32x32To64(unixTime, 10000000) + 116444736000000000; - largeTimep->dwLowDateTime = (DWORD)(ll & 0xFFFFFFFF); - largeTimep->dwHighDateTime = (DWORD)(ll >> 32); -} -#else -void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) -{ - struct tm *ltp; - SYSTEMTIME stm; - struct tm localJunk; - time_t ersatz_unixTime; - - /* - * Must use kludge-GMT instead of real GMT. - * kludge-GMT is computed by adding time zone difference to localtime. - * - * real GMT would be: - * ltp = gmtime(&unixTime); - */ - ersatz_unixTime = unixTime - smb_NowTZ; - ltp = localtime(&ersatz_unixTime); - - /* if we fail, make up something */ - if (!ltp) { - ltp = &localJunk; - localJunk.tm_year = 89 - 20; - localJunk.tm_mon = 4; - localJunk.tm_mday = 12; - localJunk.tm_hour = 0; - localJunk.tm_min = 0; - localJunk.tm_sec = 0; - } - - stm.wYear = ltp->tm_year + 1900; - stm.wMonth = ltp->tm_mon + 1; - stm.wDayOfWeek = ltp->tm_wday; - stm.wDay = ltp->tm_mday; - stm.wHour = ltp->tm_hour; - stm.wMinute = ltp->tm_min; - stm.wSecond = ltp->tm_sec; - stm.wMilliseconds = 0; - - SystemTimeToFileTime(&stm, largeTimep); -} -#endif /* USE_NUMERIC_TIME_CONV */ -#else /* DJGPP */ -void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) -{ - /* unixTime: seconds since 1/1/1970 00:00:00 GMT */ - /* FILETIME: 100ns intervals since 1/1/1601 00:00:00 ??? */ - LARGE_INTEGER *ft = (LARGE_INTEGER *) largeTimep; - LARGE_INTEGER ut; - int leap_years = 89; /* leap years betw 1/1/1601 and 1/1/1970 */ - - /* set ft to number of 100ns intervals betw 1/1/1601 and 1/1/1970 GMT */ - *ft = ConvertLongToLargeInteger(((EPOCH_YEAR-1601) * 365 + leap_years) - * 24 * 60); - *ft = LargeIntegerMultiplyByLong(*ft, 60); - *ft = LargeIntegerMultiplyByLong(*ft, 10000000); - - /* add unix time */ - ut = ConvertLongToLargeInteger(unixTime); - ut = LargeIntegerMultiplyByLong(ut, 10000000); - *ft = LargeIntegerAdd(*ft, ut); -} -#endif /* !DJGPP */ - -#ifndef DJGPP -#ifdef USE_NUMERIC_TIME_CONV -void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) -{ - // Note that LONGLONG is a 64-bit value - LONGLONG ll; - - ll = largeTimep->dwHighDateTime; - ll <<= 32; - ll += largeTimep->dwLowDateTime; - - ll -= 116444736000000000; - ll /= 10000000; - - *unixTimep = (DWORD)ll; -} -#else /* USE_NUMERIC_TIME_CONV */ -void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) -{ - SYSTEMTIME stm; - struct tm lt; - long save_timezone; - - FileTimeToSystemTime(largeTimep, &stm); - - lt.tm_year = stm.wYear - 1900; - lt.tm_mon = stm.wMonth - 1; - lt.tm_wday = stm.wDayOfWeek; - lt.tm_mday = stm.wDay; - lt.tm_hour = stm.wHour; - lt.tm_min = stm.wMinute; - lt.tm_sec = stm.wSecond; - lt.tm_isdst = -1; - - save_timezone = _timezone; - _timezone += smb_NowTZ; - *unixTimep = mktime(<); - _timezone = save_timezone; -} -#endif /* USE_NUMERIC_TIME_CONV */ -#else /* DJGPP */ -void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) -{ - /* unixTime: seconds since 1/1/1970 00:00:00 GMT */ - /* FILETIME: 100ns intervals since 1/1/1601 00:00:00 GMT? */ - LARGE_INTEGER *ft = (LARGE_INTEGER *) largeTimep; - LARGE_INTEGER a; - int leap_years = 89; - - /* set to number of 100ns intervals betw 1/1/1601 and 1/1/1970 */ - a = ConvertLongToLargeInteger(((EPOCH_YEAR-1601) * 365 + leap_years) * 24 * 60); - a = LargeIntegerMultiplyByLong(a, 60); - a = LargeIntegerMultiplyByLong(a, 10000000); - - /* subtract it from ft */ - a = LargeIntegerSubtract(*ft, a); - - /* divide down to seconds */ - *unixTimep = LargeIntegerDivideByLong(a, 10000000); -} -#endif /* !DJGPP */ - -void smb_SearchTimeFromUnixTime(afs_uint32 *searchTimep, time_t unixTime) -{ - struct tm *ltp; - int dosDate; - int dosTime; - struct tm localJunk; - time_t t = unixTime; - - ltp = localtime((time_t*) &t); - - /* if we fail, make up something */ - if (!ltp) { - ltp = &localJunk; - localJunk.tm_year = 89 - 20; - localJunk.tm_mon = 4; - localJunk.tm_mday = 12; - localJunk.tm_hour = 0; - localJunk.tm_min = 0; - localJunk.tm_sec = 0; - } - - dosDate = ((ltp->tm_year-80)<<9) | ((ltp->tm_mon+1) << 5) | (ltp->tm_mday); - dosTime = (ltp->tm_hour<<11) | (ltp->tm_min << 5) | (ltp->tm_sec / 2); - *searchTimep = (dosDate<<16) | dosTime; -} - -void smb_UnixTimeFromSearchTime(time_t *unixTimep, afs_uint32 searchTime) -{ - unsigned short dosDate; - unsigned short dosTime; - struct tm localTm; - - dosDate = (unsigned short) (searchTime & 0xffff); - dosTime = (unsigned short) ((searchTime >> 16) & 0xffff); - - localTm.tm_year = 80 + ((dosDate>>9) & 0x3f); - localTm.tm_mon = ((dosDate >> 5) & 0xf) - 1; /* January is 0 in localTm */ - localTm.tm_mday = (dosDate) & 0x1f; - localTm.tm_hour = (dosTime>>11) & 0x1f; - localTm.tm_min = (dosTime >> 5) & 0x3f; - localTm.tm_sec = (dosTime & 0x1f) * 2; - localTm.tm_isdst = -1; /* compute whether DST in effect */ - - *unixTimep = mktime(&localTm); -} - -void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime) -{ - *dosUTimep = unixTime - smb_localZero; -} - -void smb_UnixTimeFromDosUTime(time_t *unixTimep, afs_uint32 dosTime) -{ -#ifndef DJGPP - *unixTimep = dosTime + smb_localZero; -#else /* DJGPP */ - /* dosTime seems to be already adjusted for GMT */ - *unixTimep = dosTime; -#endif /* !DJGPP */ -} - -smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana) -{ - smb_vc_t *vcp; - - lock_ObtainWrite(&smb_rctLock); - for (vcp = smb_allVCsp; vcp; vcp=vcp->nextp) { - if (lsn == vcp->lsn && lana == vcp->lana) { - smb_HoldVCNoLock(vcp); - break; - } - } - if (!vcp && (flags & SMB_FLAG_CREATE)) { - vcp = malloc(sizeof(*vcp)); - memset(vcp, 0, sizeof(*vcp)); - vcp->vcID = numVCs++; - vcp->refCount = 1; - vcp->tidCounter = 1; - vcp->fidCounter = 1; - vcp->uidCounter = 1; /* UID 0 is reserved for blank user */ - vcp->nextp = smb_allVCsp; - smb_allVCsp = vcp; - lock_InitializeMutex(&vcp->mx, "vc_t mutex"); - vcp->lsn = lsn; - vcp->lana = lana; - vcp->secCtx = NULL; - - if (smb_authType == SMB_AUTH_NTLM || smb_authType == SMB_AUTH_EXTENDED) { - /* We must obtain a challenge for extended auth - * in case the client negotiates smb v3 - */ - NTSTATUS nts = STATUS_UNSUCCESSFUL, ntsEx = STATUS_UNSUCCESSFUL; - MSV1_0_LM20_CHALLENGE_REQUEST lsaReq; - PMSV1_0_LM20_CHALLENGE_RESPONSE lsaResp; - ULONG lsaRespSize = 0; - - lsaReq.MessageType = MsV1_0Lm20ChallengeRequest; - - nts = LsaCallAuthenticationPackage( smb_lsaHandle, - smb_lsaSecPackage, - &lsaReq, - sizeof(lsaReq), - &lsaResp, - &lsaRespSize, - &ntsEx); - if (nts != STATUS_SUCCESS) - osi_Log4(smb_logp,"MsV1_0Lm20ChallengeRequest failure: nts 0x%x ntsEx 0x%x respSize is %u needs %u", - nts, ntsEx, sizeof(lsaReq), lsaRespSize); - osi_assert(nts == STATUS_SUCCESS); /* this had better work! */ - - memcpy(vcp->encKey, lsaResp->ChallengeToClient, MSV1_0_CHALLENGE_LENGTH); - LsaFreeReturnBuffer(lsaResp); - } - else - memset(vcp->encKey, 0, MSV1_0_CHALLENGE_LENGTH); - } - lock_ReleaseWrite(&smb_rctLock); - return vcp; -} - -int smb_IsStarMask(char *maskp) -{ - int i; - char tc; - - for(i=0; i<11; i++) { - tc = *maskp++; - if (tc == '?' || tc == '*' || tc == '>') return 1; - } - return 0; -} - -void smb_ReleaseVCNoLock(smb_vc_t *vcp) -{ - osi_Log2(smb_logp,"smb_ReleaseVCNoLock vcp %x ref %d",vcp, vcp->refCount); -#ifdef DEBUG - osi_assert(vcp->refCount-- != 0); -#else - vcp->refCount--; -#endif -} - -void smb_ReleaseVC(smb_vc_t *vcp) -{ - lock_ObtainWrite(&smb_rctLock); - osi_Log2(smb_logp,"smb_ReleaseVC vcp %x ref %d",vcp, vcp->refCount); -#ifdef DEBUG - osi_assert(vcp->refCount-- != 0); -#else - vcp->refCount--; -#endif - lock_ReleaseWrite(&smb_rctLock); -} - -void smb_HoldVCNoLock(smb_vc_t *vcp) -{ - vcp->refCount++; - osi_Log2(smb_logp,"smb_HoldVCNoLock vcp %x ref %d",vcp, vcp->refCount); -} - -void smb_HoldVC(smb_vc_t *vcp) -{ - lock_ObtainWrite(&smb_rctLock); - vcp->refCount++; - osi_Log2(smb_logp,"smb_HoldVC vcp %x ref %d",vcp, vcp->refCount); - lock_ReleaseWrite(&smb_rctLock); -} - -smb_tid_t *smb_FindTID(smb_vc_t *vcp, unsigned short tid, int flags) -{ - smb_tid_t *tidp; - - lock_ObtainWrite(&smb_rctLock); - for (tidp = vcp->tidsp; tidp; tidp = tidp->nextp) { - if (tid == tidp->tid) { - tidp->refCount++; - break; - } - } - if (!tidp && (flags & SMB_FLAG_CREATE)) { - tidp = malloc(sizeof(*tidp)); - memset(tidp, 0, sizeof(*tidp)); - tidp->nextp = vcp->tidsp; - tidp->refCount = 1; - tidp->vcp = vcp; - smb_HoldVCNoLock(vcp); - vcp->tidsp = tidp; - lock_InitializeMutex(&tidp->mx, "tid_t mutex"); - tidp->tid = tid; - } - lock_ReleaseWrite(&smb_rctLock); - return tidp; -} - -void smb_ReleaseTID(smb_tid_t *tidp) -{ - smb_tid_t *tp; - smb_tid_t **ltpp; - cm_user_t *userp; - - userp = NULL; - lock_ObtainWrite(&smb_rctLock); - osi_assert(tidp->refCount-- > 0); - if (tidp->refCount == 0 && (tidp->flags & SMB_TIDFLAG_DELETE)) { - ltpp = &tidp->vcp->tidsp; - for(tp = *ltpp; tp; ltpp = &tp->nextp, tp = *ltpp) { - if (tp == tidp) - break; - } - osi_assert(tp != NULL); - *ltpp = tp->nextp; - lock_FinalizeMutex(&tidp->mx); - userp = tidp->userp; /* remember to drop ref later */ - tidp->userp = NULL; - smb_ReleaseVCNoLock(tidp->vcp); - tidp->vcp = 0; - } - lock_ReleaseWrite(&smb_rctLock); - if (userp) - cm_ReleaseUser(userp); -} - -smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags) -{ - smb_user_t *uidp = NULL; - - lock_ObtainWrite(&smb_rctLock); - for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) { - if (uid == uidp->userID) { - uidp->refCount++; - osi_LogEvent("AFS smb_FindUID (Find by UID)",NULL," VCP[%x] found-uid[%d] name[%s]", - (int)vcp, uidp->userID, - osi_LogSaveString(smb_logp, (uidp->unp) ? uidp->unp->name : "")); - break; - } - } - if (!uidp && (flags & SMB_FLAG_CREATE)) { - uidp = malloc(sizeof(*uidp)); - memset(uidp, 0, sizeof(*uidp)); - uidp->nextp = vcp->usersp; - uidp->refCount = 1; - uidp->vcp = vcp; - smb_HoldVCNoLock(vcp); - vcp->usersp = uidp; - lock_InitializeMutex(&uidp->mx, "user_t mutex"); - uidp->userID = uid; - osi_LogEvent("AFS smb_FindUID (Find by UID)",NULL,"VCP[%x] new-uid[%d] name[%s]",(int)vcp,uidp->userID,(uidp->unp ? uidp->unp->name : "")); - } - lock_ReleaseWrite(&smb_rctLock); - return uidp; -} - -smb_username_t *smb_FindUserByName(char *usern, char *machine, int flags) -{ - smb_username_t *unp= NULL; - - lock_ObtainWrite(&smb_rctLock); - for(unp = usernamesp; unp; unp = unp->nextp) { - if (stricmp(unp->name, usern) == 0 && - stricmp(unp->machine, machine) == 0) { - unp->refCount++; - break; - } - } - if (!unp && (flags & SMB_FLAG_CREATE)) { - unp = malloc(sizeof(*unp)); - memset(unp, 0, sizeof(*unp)); - unp->refCount = 1; - unp->nextp = usernamesp; - unp->name = strdup(usern); - unp->machine = strdup(machine); - usernamesp = unp; - lock_InitializeMutex(&unp->mx, "username_t mutex"); - } - lock_ReleaseWrite(&smb_rctLock); - return unp; -} - -smb_user_t *smb_FindUserByNameThisSession(smb_vc_t *vcp, char *usern) -{ - smb_user_t *uidp= NULL; - - lock_ObtainWrite(&smb_rctLock); - for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) { - if (!uidp->unp) - continue; - if (stricmp(uidp->unp->name, usern) == 0) { - uidp->refCount++; - osi_LogEvent("AFS smb_FindUserByNameThisSession",NULL,"VCP[%x] uid[%d] match-name[%s]",(int)vcp,uidp->userID,usern); - break; - } else - continue; - } - lock_ReleaseWrite(&smb_rctLock); - return uidp; -} -void smb_ReleaseUID(smb_user_t *uidp) -{ - smb_user_t *up; - smb_user_t **lupp; - cm_user_t *userp; - - userp = NULL; - lock_ObtainWrite(&smb_rctLock); - osi_assert(uidp->refCount-- > 0); - if (uidp->refCount == 0 && (uidp->flags & SMB_USERFLAG_DELETE)) { - lupp = &uidp->vcp->usersp; - for(up = *lupp; up; lupp = &up->nextp, up = *lupp) { - if (up == uidp) - break; - } - osi_assert(up != NULL); - *lupp = up->nextp; - lock_FinalizeMutex(&uidp->mx); - if (uidp->unp) { - userp = uidp->unp->userp; /* avoid deadlock by releasing */ - uidp->unp->userp = NULL; /* after releasing the lock */ - } - smb_ReleaseVCNoLock(uidp->vcp); - uidp->vcp = NULL; - } - lock_ReleaseWrite(&smb_rctLock); - if (userp) { - cm_ReleaseUserVCRef(userp); - cm_ReleaseUser(userp); - } -} - - -/* retrieve a held reference to a user structure corresponding to an incoming - * request. - * corresponding release function is cm_ReleaseUser. - */ -cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp) -{ - smb_user_t *uidp; - cm_user_t *up; - smb_t *smbp; - - smbp = (smb_t *) inp; - uidp = smb_FindUID(vcp, smbp->uid, 0); - if ((!uidp) || (!uidp->unp)) - return NULL; - - lock_ObtainMutex(&uidp->mx); - up = uidp->unp->userp; - cm_HoldUser(up); - lock_ReleaseMutex(&uidp->mx); - - smb_ReleaseUID(uidp); - - return up; -} - -/* - * Return a pointer to a pathname extracted from a TID structure. The - * TID structure is not held; assume it won't go away. - */ -long smb_LookupTIDPath(smb_vc_t *vcp, unsigned short tid, char ** treepath) -{ - smb_tid_t *tidp; - long code = 0; - - tidp = smb_FindTID(vcp, tid, 0); - if (!tidp) { - *treepath = NULL; - } else { - if (tidp->flags & SMB_TIDFLAG_IPC) { - code = CM_ERROR_TIDIPC; - /* tidp->pathname would be NULL, but that's fine */ - } - *treepath = tidp->pathname; - smb_ReleaseTID(tidp); - } - return code; -} - -/* check to see if we have a chained fid, that is, a fid that comes from an - * OpenAndX message that ran earlier in this packet. In this case, the fid - * field in a read, for example, request, isn't set, since the value is - * supposed to be inherited from the openAndX call. - */ -int smb_ChainFID(int fid, smb_packet_t *inp) -{ - if (inp->fid == 0 || inp->inCount == 0) - return fid; - else - return inp->fid; -} - -/* are we a priv'd user? What does this mean on NT? */ -int smb_SUser(cm_user_t *userp) -{ - return 1; -} - -/* find a file ID. If we pass in 0 we select an used File ID. - * If the SMB_FLAG_CREATE flag is set, we allocate a new - * smb_fid_t data structure if desired File ID cannot be found. - */ -smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags) -{ - smb_fid_t *fidp; - int newFid = 0; - - if (fid == 0 && !(flags & SMB_FLAG_CREATE)) - return NULL; - - lock_ObtainWrite(&smb_rctLock); - /* figure out if we need to allocate a new file ID */ - if (fid == 0) { - newFid = 1; - fid = vcp->fidCounter; - } - - retry: - for(fidp = vcp->fidsp; fidp; fidp = (smb_fid_t *) osi_QNext(&fidp->q)) { - if (fid == fidp->fid) { - if (newFid) { - fid++; - if (fid == 0) - fid = 1; - goto retry; - } - fidp->refCount++; - break; - } - } - if (!fidp && (flags & SMB_FLAG_CREATE)) { - char eventName[MAX_PATH]; - EVENT_HANDLE event; - sprintf(eventName,"fid_t event vcp=%d fid=%d", vcp->vcID, fid); - event = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) { - osi_Log1(smb_logp, "Event Object Already Exists: %s", osi_LogSaveString(smb_logp, eventName)); - thrd_CloseHandle(event); - fid++; - if (fid == 0) - fid = 1; - goto retry; - } - - fidp = malloc(sizeof(*fidp)); - memset(fidp, 0, sizeof(*fidp)); - osi_QAdd((osi_queue_t **)&vcp->fidsp, &fidp->q); - fidp->refCount = 1; - fidp->vcp = vcp; - smb_HoldVCNoLock(vcp); - lock_InitializeMutex(&fidp->mx, "fid_t mutex"); - fidp->fid = fid; - fidp->curr_chunk = fidp->prev_chunk = -2; - fidp->raw_write_event = event; - if (newFid) { - vcp->fidCounter = fid+1; - if (vcp->fidCounter == 0) - vcp->fidCounter = 1; - } - } - lock_ReleaseWrite(&smb_rctLock); - return fidp; -} - -void smb_ReleaseFID(smb_fid_t *fidp) -{ - cm_scache_t *scp; - smb_vc_t *vcp = NULL; - smb_ioctl_t *ioctlp; - - if (!fidp) - return; - - scp = NULL; - lock_ObtainWrite(&smb_rctLock); - osi_assert(fidp->refCount-- > 0); - if (fidp->refCount == 0 && (fidp->flags & SMB_FID_DELETE)) { - vcp = fidp->vcp; - fidp->vcp = 0; - scp = fidp->scp; /* release after lock is released */ - fidp->scp = 0; - - osi_QRemove((osi_queue_t **) &vcp->fidsp, &fidp->q); - thrd_CloseHandle(fidp->raw_write_event); - - /* and see if there is ioctl stuff to free */ - ioctlp = fidp->ioctlp; - if (ioctlp) { - if (ioctlp->prefix) - cm_FreeSpace(ioctlp->prefix); - if (ioctlp->inAllocp) - free(ioctlp->inAllocp); - if (ioctlp->outAllocp) - free(ioctlp->outAllocp); - free(ioctlp); - } - - free(fidp); - - smb_ReleaseVCNoLock(vcp); - } - lock_ReleaseWrite(&smb_rctLock); - - /* now release the scache structure */ - if (scp) - cm_ReleaseSCache(scp); -} - -/* - * Case-insensitive search for one string in another; - * used to find variable names in submount pathnames. - */ -static char *smb_stristr(char *str1, char *str2) -{ - char *cursor; - - for (cursor = str1; *cursor; cursor++) - if (stricmp(cursor, str2) == 0) - return cursor; - - return NULL; -} - -/* - * Substitute a variable value for its name in a submount pathname. Variable - * name has been identified by smb_stristr() and is in substr. Variable name - * length (plus one) is in substr_size. Variable value is in newstr. - */ -static void smb_subst(char *str1, char *substr, unsigned int substr_size, - char *newstr) -{ - char temp[1024]; - - strcpy(temp, substr + substr_size - 1); - strcpy(substr, newstr); - strcat(str1, temp); -} - -char VNUserName[] = "%USERNAME%"; -char VNLCUserName[] = "%LCUSERNAME%"; -char VNComputerName[] = "%COMPUTERNAME%"; -char VNLCComputerName[] = "%LCCOMPUTERNAME%"; - -#ifdef DJGPP -/* List available shares */ -int smb_ListShares() -{ - char sbmtpath[256]; - char pathName[256]; - char shareBuf[4096]; - int num_shares=0; - char *this_share; - int len; - char *p; - int print_afs = 0; - int code; - - /*strcpy(shareNameList[num_shares], "all"); - strcpy(pathNameList[num_shares++], "/afs");*/ - fprintf(stderr, "The following shares are available:\n"); - fprintf(stderr, "Share Name (AFS Path)\n"); - fprintf(stderr, "---------------------\n"); - fprintf(stderr, "\\\\%s\\%-16s (%s)\n", smb_localNamep, "ALL", cm_mountRoot); - -#ifndef DJGPP - code = GetWindowsDirectory(sbmtpath, sizeof(sbmtpath)); - if (code == 0 || code > sizeof(sbmtpath)) return -1; -#else - strcpy(sbmtpath, cm_confDir); -#endif /* !DJGPP */ - strcat(sbmtpath, "/afsdsbmt.ini"); - len = GetPrivateProfileString("AFS Submounts", NULL, NULL, - shareBuf, sizeof(shareBuf), - sbmtpath); - if (len == 0) { - return num_shares; - } - - this_share = shareBuf; - do - { - print_afs = 0; - /*strcpy(shareNameList[num_shares], this_share);*/ - len = GetPrivateProfileString("AFS Submounts", this_share, - NULL, - pathName, 256, - sbmtpath); - if (!len) - return num_shares; - p = pathName; - if (strncmp(p, cm_mountRoot, strlen(cm_mountRoot)) != 0) - print_afs = 1; - while (*p) { - if (*p == '\\') *p = '/'; /* change to / */ - p++; - } - - fprintf(stderr, "\\\\%s\\%-16s (%s%s)\n", - smb_localNamep, this_share, (print_afs ? cm_mountRoot : "\0"), - pathName); - num_shares++; - while (*this_share != 0) this_share++; /* find next NUL */ - this_share++; /* skip past the NUL */ - } while (*this_share != 0); /* stop at final NUL */ - - return num_shares; -} -#endif /* DJGPP */ - -typedef struct smb_findShare_rock { - char * shareName; - char * match; - int matchType; -} smb_findShare_rock_t; - -#define SMB_FINDSHARE_EXACT_MATCH 1 -#define SMB_FINDSHARE_PARTIAL_MATCH 2 - -long smb_FindShareProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *rockp, - osi_hyper_t *offp) -{ - int matchType = 0; - smb_findShare_rock_t * vrock = (smb_findShare_rock_t *) rockp; - if (!strnicmp(dep->name, vrock->shareName, 12)) { - if(!stricmp(dep->name, vrock->shareName)) - matchType = SMB_FINDSHARE_EXACT_MATCH; - else - matchType = SMB_FINDSHARE_PARTIAL_MATCH; - if(vrock->match) free(vrock->match); - vrock->match = strdup(dep->name); - vrock->matchType = matchType; - - if(matchType == SMB_FINDSHARE_EXACT_MATCH) - return CM_ERROR_STOPNOW; - } - return 0; -} - - -/* find a shareName in the table of submounts */ -int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp, char *shareName, - char **pathNamep) -{ - DWORD len; - char pathName[1024]; - char *var; - char temp[1024]; - DWORD sizeTemp; -#ifdef DJGPP - char sbmtpath[MAX_PATH]; -#endif - char *p, *q; - HKEY parmKey; - DWORD code; - DWORD allSubmount = 1; - - /* if allSubmounts == 0, only return the //mountRoot/all share - * if in fact it has been been created in the subMounts table. - * This is to allow sites that want to restrict access to the - * world to do so. - */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - len = sizeof(allSubmount); - code = RegQueryValueEx(parmKey, "AllSubmount", NULL, NULL, - (BYTE *) &allSubmount, &len); - if (code != ERROR_SUCCESS) { - allSubmount = 1; - } - RegCloseKey (parmKey); - } - - if (allSubmount && _stricmp(shareName, "all") == 0) { - *pathNamep = NULL; - return 1; - } - - /* In case, the all share is disabled we need to still be able - * to handle ioctl requests - */ - if (_stricmp(shareName, "ioctl$") == 0) { - *pathNamep = strdup("/.__ioctl__"); - return 1; - } - - if (_stricmp(shareName, "IPC$") == 0 || - _stricmp(shareName, SMB_IOCTL_FILENAME_NOSLASH) == 0 || - _stricmp(shareName, "DESKTOP.INI") == 0 - ) { - *pathNamep = NULL; - return 0; - } - -#ifndef DJGPP - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, KEY_QUERY_VALUE, &parmKey); - if (code == ERROR_SUCCESS) { - len = sizeof(pathName); - code = RegQueryValueEx(parmKey, shareName, NULL, NULL, - (BYTE *) pathName, &len); - if (code != ERROR_SUCCESS) - len = 0; - RegCloseKey (parmKey); - } else { - len = 0; - } -#else /* DJGPP */ - strcpy(sbmtpath, cm_confDir); - strcat(sbmtpath, "/afsdsbmt.ini"); - len = GetPrivateProfileString("AFS Submounts", shareName, "", - pathName, sizeof(pathName), sbmtpath); -#endif /* !DJGPP */ - if (len != 0 && len != sizeof(pathName) - 1) { - /* We can accept either unix or PC style AFS pathnames. Convert - * Unix-style to PC style here for internal use. - */ - p = pathName; - if (strncmp(p, cm_mountRoot, strlen(cm_mountRoot)) == 0) - p += strlen(cm_mountRoot); /* skip mount path */ - q = p; - while (*q) { - if (*q == '/') *q = '\\'; /* change to \ */ - q++; - } - - while (1) - { - if (var = smb_stristr(p, VNUserName)) { - if (uidp && uidp->unp) - smb_subst(p, var, sizeof(VNUserName),uidp->unp->name); - else - smb_subst(p, var, sizeof(VNUserName)," "); - } - else if (var = smb_stristr(p, VNLCUserName)) - { - if (uidp && uidp->unp) - strcpy(temp, uidp->unp->name); - else - strcpy(temp, " "); - _strlwr(temp); - smb_subst(p, var, sizeof(VNLCUserName), temp); - } - else if (var = smb_stristr(p, VNComputerName)) - { - sizeTemp = sizeof(temp); - GetComputerName((LPTSTR)temp, &sizeTemp); - smb_subst(p, var, sizeof(VNComputerName), temp); - } - else if (var = smb_stristr(p, VNLCComputerName)) - { - sizeTemp = sizeof(temp); - GetComputerName((LPTSTR)temp, &sizeTemp); - _strlwr(temp); - smb_subst(p, var, sizeof(VNLCComputerName), temp); - } - else - break; - } - *pathNamep = strdup(p); - return 1; - } - else - { - /* First lookup shareName in root.afs */ - cm_req_t req; - smb_findShare_rock_t vrock; - osi_hyper_t thyper; - char * p = shareName; - int rw = 0; - - /* attempt to locate a partial match in root.afs. This is because - when using the ANSI RAP calls, the share name is limited to 13 chars - and hence is truncated. Of course we prefer exact matches. */ - cm_InitReq(&req); - thyper.HighPart = 0; - thyper.LowPart = 0; - - vrock.shareName = shareName; - vrock.match = NULL; - vrock.matchType = 0; - - cm_HoldSCache(cm_data.rootSCachep); - code = cm_ApplyDir(cm_data.rootSCachep, smb_FindShareProc, &vrock, &thyper, - (uidp? (uidp->unp ? uidp->unp->userp : NULL) : NULL), &req, NULL); - cm_ReleaseSCache(cm_data.rootSCachep); - - if (vrock.matchType) { - sprintf(pathName,"/%s/",vrock.match); - *pathNamep = strdup(strlwr(pathName)); - free(vrock.match); - return 1; - } - - /* if we get here, there was no match for the share in root.afs */ - /* so try to create \\\ */ - if ( *p == '.' ) { - p++; - rw = 1; - } - /* Get the full name for this cell */ - code = cm_SearchCellFile(p, temp, 0, 0); -#ifdef AFS_AFSDB_ENV - if (code && cm_dnsEnabled) { - int ttl; - code = cm_SearchCellByDNS(p, temp, &ttl, 0, 0); - } -#endif - /* construct the path */ - if (code == 0) { - sprintf(pathName,rw ? "/.%s/" : "/%s/",temp); - *pathNamep = strdup(strlwr(pathName)); - return 1; - } - } - /* failure */ - *pathNamep = NULL; - return 0; -} - -/* Client-side offline caching policy types */ -#define CSC_POLICY_MANUAL 0 -#define CSC_POLICY_DOCUMENTS 1 -#define CSC_POLICY_PROGRAMS 2 -#define CSC_POLICY_DISABLE 3 - -int smb_FindShareCSCPolicy(char *shareName) -{ - DWORD len; - char policy[1024]; - DWORD dwType; - HKEY hkCSCPolicy; - int retval = CSC_POLICY_MANUAL; - - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\CSCPolicy", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ, - NULL, - &hkCSCPolicy, - NULL ); - - len = sizeof(policy); - if ( RegQueryValueEx( hkCSCPolicy, shareName, 0, &dwType, policy, &len ) || - len == 0) { - retval = stricmp("all",shareName) ? CSC_POLICY_MANUAL : CSC_POLICY_DISABLE; - } - else if (stricmp(policy, "documents") == 0) - { - retval = CSC_POLICY_DOCUMENTS; - } - else if (stricmp(policy, "programs") == 0) - { - retval = CSC_POLICY_PROGRAMS; - } - else if (stricmp(policy, "disable") == 0) - { - retval = CSC_POLICY_DISABLE; - } - - RegCloseKey(hkCSCPolicy); - return retval; -} - -/* find a dir search structure by cookie value, and return it held. - * Must be called with smb_globalLock held. - */ -smb_dirSearch_t *smb_FindDirSearchNoLock(long cookie) -{ - smb_dirSearch_t *dsp; - - for (dsp = smb_firstDirSearchp; dsp; dsp = (smb_dirSearch_t *) osi_QNext(&dsp->q)) { - if (dsp->cookie == cookie) { - if (dsp != smb_firstDirSearchp) { - /* move to head of LRU queue, too, if we're not already there */ - if (smb_lastDirSearchp == (smb_dirSearch_t *) &dsp->q) - smb_lastDirSearchp = (smb_dirSearch_t *) osi_QPrev(&dsp->q); - osi_QRemove((osi_queue_t **) &smb_firstDirSearchp, &dsp->q); - osi_QAdd((osi_queue_t **) &smb_firstDirSearchp, &dsp->q); - if (!smb_lastDirSearchp) - smb_lastDirSearchp = (smb_dirSearch_t *) &dsp->q; - } - lock_ObtainMutex(&dsp->mx); - dsp->refCount++; - lock_ReleaseMutex(&dsp->mx); - break; - } - } - - if (dsp == NULL) { - osi_Log1(smb_logp,"smb_FindDirSearch(%d) == NULL",cookie); - for (dsp = smb_firstDirSearchp; dsp; dsp = (smb_dirSearch_t *) osi_QNext(&dsp->q)) { - osi_Log1(smb_logp,"... valid id: %d", dsp->cookie); - } - } - return dsp; -} - -void smb_DeleteDirSearch(smb_dirSearch_t *dsp) -{ - lock_ObtainWrite(&smb_globalLock); - lock_ObtainMutex(&dsp->mx); - dsp->flags |= SMB_DIRSEARCH_DELETE; - if (dsp->scp != NULL) { - lock_ObtainMutex(&dsp->scp->mx); - if (dsp->flags & SMB_DIRSEARCH_BULKST) { - dsp->flags &= ~SMB_DIRSEARCH_BULKST; - dsp->scp->flags &= ~CM_SCACHEFLAG_BULKSTATTING; - dsp->scp->bulkStatProgress = hones; - } - lock_ReleaseMutex(&dsp->scp->mx); - } - lock_ReleaseMutex(&dsp->mx); - lock_ReleaseWrite(&smb_globalLock); -} - -/* Must be called with the smb_globalLock held */ -void smb_ReleaseDirSearchNoLock(smb_dirSearch_t *dsp) -{ - cm_scache_t *scp = NULL; - - lock_ObtainMutex(&dsp->mx); - osi_assert(dsp->refCount-- > 0); - if (dsp->refCount == 0 && (dsp->flags & SMB_DIRSEARCH_DELETE)) { - if (&dsp->q == (osi_queue_t *) smb_lastDirSearchp) - smb_lastDirSearchp = (smb_dirSearch_t *) osi_QPrev(&smb_lastDirSearchp->q); - osi_QRemove((osi_queue_t **) &smb_firstDirSearchp, &dsp->q); - lock_ReleaseMutex(&dsp->mx); - lock_FinalizeMutex(&dsp->mx); - scp = dsp->scp; - free(dsp); - } else { - lock_ReleaseMutex(&dsp->mx); - } - /* do this now to avoid spurious locking hierarchy creation */ - if (scp) cm_ReleaseSCache(scp); -} - -void smb_ReleaseDirSearch(smb_dirSearch_t *dsp) -{ - lock_ObtainWrite(&smb_globalLock); - smb_ReleaseDirSearchNoLock(dsp); - lock_ReleaseWrite(&smb_globalLock); -} - -/* find a dir search structure by cookie value, and return it held */ -smb_dirSearch_t *smb_FindDirSearch(long cookie) -{ - smb_dirSearch_t *dsp; - - lock_ObtainWrite(&smb_globalLock); - dsp = smb_FindDirSearchNoLock(cookie); - lock_ReleaseWrite(&smb_globalLock); - return dsp; -} - -/* GC some dir search entries, in the address space expected by the specific protocol. - * Must be called with smb_globalLock held; release the lock temporarily. - */ -#define SMB_DIRSEARCH_GCMAX 10 /* how many at once */ -void smb_GCDirSearches(int isV3) -{ - smb_dirSearch_t *prevp; - smb_dirSearch_t *tp; - smb_dirSearch_t *victimsp[SMB_DIRSEARCH_GCMAX]; - int victimCount; - int i; - - victimCount = 0; /* how many have we got so far */ - for (tp = smb_lastDirSearchp; tp; tp=prevp) { - /* we'll move tp from queue, so - * do this early. - */ - prevp = (smb_dirSearch_t *) osi_QPrev(&tp->q); - /* if no one is using this guy, and we're either in the new protocol, - * or we're in the old one and this is a small enough ID to be useful - * to the old protocol, GC this guy. - */ - if (tp->refCount == 0 && (isV3 || tp->cookie <= 255)) { - /* hold and delete */ - tp->flags |= SMB_DIRSEARCH_DELETE; - victimsp[victimCount++] = tp; - tp->refCount++; - } - - /* don't do more than this */ - if (victimCount >= SMB_DIRSEARCH_GCMAX) - break; - } - - /* now release them */ - for (i = 0; i < victimCount; i++) { - smb_ReleaseDirSearchNoLock(victimsp[i]); - } -} - -/* function for allocating a dir search entry. We need these to remember enough context - * since we don't get passed the path from call to call during a directory search. - * - * Returns a held dir search structure, and bumps the reference count on the vnode, - * since it saves a pointer to the vnode. - */ -smb_dirSearch_t *smb_NewDirSearch(int isV3) -{ - smb_dirSearch_t *dsp; - int counter; - int maxAllowed; - int start; - int wrapped = 0; - - lock_ObtainWrite(&smb_globalLock); - counter = 0; - - /* what's the biggest ID allowed in this version of the protocol */ - maxAllowed = isV3 ? 65535 : 255; - if (smb_dirSearchCounter > maxAllowed) - smb_dirSearchCounter = 1; - - start = smb_dirSearchCounter; - - while (1) { - /* twice so we have enough tries to find guys we GC after one pass; - * 10 extra is just in case I mis-counted. - */ - if (++counter > 2*maxAllowed+10) - osi_panic("afsd: dir search cookie leak", __FILE__, __LINE__); - - if (smb_dirSearchCounter > maxAllowed) { - smb_dirSearchCounter = 1; - } - if (smb_dirSearchCounter == start) { - if (wrapped) - smb_GCDirSearches(isV3); - wrapped++; - } - dsp = smb_FindDirSearchNoLock(smb_dirSearchCounter); - if (dsp) { - /* don't need to watch for refcount zero and deleted, since - * we haven't dropped the global lock. - */ - lock_ObtainMutex(&dsp->mx); - dsp->refCount--; - lock_ReleaseMutex(&dsp->mx); - ++smb_dirSearchCounter; - continue; - } - - dsp = malloc(sizeof(*dsp)); - memset(dsp, 0, sizeof(*dsp)); - dsp->cookie = smb_dirSearchCounter; - ++smb_dirSearchCounter; - dsp->refCount = 1; - lock_InitializeMutex(&dsp->mx, "cm_dirSearch_t"); - dsp->lastTime = osi_Time(); - osi_QAdd((osi_queue_t **) &smb_firstDirSearchp, &dsp->q); - if (!smb_lastDirSearchp) - smb_lastDirSearchp = (smb_dirSearch_t *) &dsp->q; - break; - } - lock_ReleaseWrite(&smb_globalLock); - return dsp; -} - -static smb_packet_t *GetPacket(void) -{ - smb_packet_t *tbp; -#ifdef DJGPP - unsigned int npar, seg, tb_sel; -#endif - - lock_ObtainWrite(&smb_globalLock); - tbp = smb_packetFreeListp; - if (tbp) - smb_packetFreeListp = tbp->nextp; - lock_ReleaseWrite(&smb_globalLock); - if (!tbp) { -#ifndef DJGPP - tbp = calloc(65540,1); -#else /* DJGPP */ - tbp = malloc(sizeof(smb_packet_t)); -#endif /* !DJGPP */ - tbp->magic = SMB_PACKETMAGIC; - tbp->ncbp = NULL; - tbp->vcp = NULL; - tbp->resumeCode = 0; - tbp->inCount = 0; - tbp->fid = 0; - tbp->wctp = NULL; - tbp->inCom = 0; - tbp->oddByte = 0; - tbp->ncb_length = 0; - tbp->flags = 0; - tbp->spacep = NULL; - -#ifdef DJGPP - npar = SMB_PACKETSIZE >> 4; /* number of paragraphs */ - { - signed int retval = - __dpmi_allocate_dos_memory(npar, &tb_sel); /* DOS segment */ - if (retval == -1) { - osi_Log1(smb_logp, "Cannot allocate %d paragraphs of DOS memory", - npar); - osi_panic("",__FILE__,__LINE__); - } - else { - osi_Log2(smb_logp, "Allocated %d paragraphs of DOS mem at 0x%X", - npar, retval); - seg = retval; - } - } - tbp->dos_pkt = (seg * 16) + 0; /* DOS physical address */ - tbp->dos_pkt_sel = tb_sel; -#endif /* DJGPP */ - } - osi_assert(tbp->magic == SMB_PACKETMAGIC); - - return tbp; -} - -smb_packet_t *smb_CopyPacket(smb_packet_t *pkt) -{ - smb_packet_t *tbp; - tbp = GetPacket(); - memcpy(tbp, pkt, sizeof(smb_packet_t)); - tbp->wctp = tbp->data + ((unsigned int)pkt->wctp - (unsigned int)pkt->data); - if (tbp->vcp) - smb_HoldVC(tbp->vcp); - return tbp; -} - -static NCB *GetNCB(void) -{ - smb_ncb_t *tbp; - NCB *ncbp; -#ifdef DJGPP - unsigned int npar, seg, tb_sel; -#endif /* DJGPP */ - - lock_ObtainWrite(&smb_globalLock); - tbp = smb_ncbFreeListp; - if (tbp) - smb_ncbFreeListp = tbp->nextp; - lock_ReleaseWrite(&smb_globalLock); - if (!tbp) { -#ifndef DJGPP - tbp = calloc(sizeof(*tbp),1); -#else /* DJGPP */ - tbp = malloc(sizeof(*tbp)); - npar = (sizeof(NCB)+15) >> 4; /* number of paragraphs */ - { - signed int retval = - __dpmi_allocate_dos_memory(npar, &tb_sel); /* DOS segment */ - if (retval == -1) { - osi_Log1(smb_logp, "Cannot allocate %d paragraphs of DOS mem in GetNCB", - npar); - osi_panic("",__FILE__,__LINE__); - } else { - osi_Log2(smb_logp, "Allocated %d paragraphs of DOS mem at 0x%X in GetNCB", - npar, retval); - seg = retval; - } - } - tbp->dos_ncb = (seg * 16) + 0; /* DOS physical address */ - tbp->dos_ncb_sel = tb_sel; -#endif /* !DJGPP */ - tbp->magic = SMB_NCBMAGIC; - } - - osi_assert(tbp->magic == SMB_NCBMAGIC); - - memset(&tbp->ncb, 0, sizeof(NCB)); - ncbp = &tbp->ncb; -#ifdef DJGPP - dos_memset(tbp->dos_ncb, 0, sizeof(NCB)); -#endif /* DJGPP */ - return ncbp; -} - -void smb_FreePacket(smb_packet_t *tbp) -{ - smb_vc_t * vcp = NULL; - osi_assert(tbp->magic == SMB_PACKETMAGIC); - - lock_ObtainWrite(&smb_globalLock); - tbp->nextp = smb_packetFreeListp; - smb_packetFreeListp = tbp; - tbp->magic = SMB_PACKETMAGIC; - tbp->ncbp = NULL; - vcp = tbp->vcp; - tbp->vcp = NULL; - tbp->resumeCode = 0; - tbp->inCount = 0; - tbp->fid = 0; - tbp->wctp = NULL; - tbp->inCom = 0; - tbp->oddByte = 0; - tbp->ncb_length = 0; - tbp->flags = 0; - lock_ReleaseWrite(&smb_globalLock); - - if (vcp) - smb_ReleaseVC(vcp); -} - -static void FreeNCB(NCB *bufferp) -{ - smb_ncb_t *tbp; - - tbp = (smb_ncb_t *) bufferp; - osi_assert(tbp->magic == SMB_NCBMAGIC); - - lock_ObtainWrite(&smb_globalLock); - tbp->nextp = smb_ncbFreeListp; - smb_ncbFreeListp = tbp; - lock_ReleaseWrite(&smb_globalLock); -} - -/* get a ptr to the data part of a packet, and its count */ -unsigned char *smb_GetSMBData(smb_packet_t *smbp, int *nbytesp) -{ - int parmBytes; - int dataBytes; - unsigned char *afterParmsp; - - parmBytes = *smbp->wctp << 1; - afterParmsp = smbp->wctp + parmBytes + 1; - - dataBytes = afterParmsp[0] + (afterParmsp[1]<<8); - if (nbytesp) *nbytesp = dataBytes; - - /* don't forget to skip the data byte count, since it follows - * the parameters; that's where the "2" comes from below. - */ - return (unsigned char *) (afterParmsp + 2); -} - -/* must set all the returned parameters before playing around with the - * data region, since the data region is located past the end of the - * variable number of parameters. - */ -void smb_SetSMBDataLength(smb_packet_t *smbp, unsigned int dsize) -{ - unsigned char *afterParmsp; - - afterParmsp = smbp->wctp + ((*smbp->wctp)<<1) + 1; - - *afterParmsp++ = dsize & 0xff; - *afterParmsp = (dsize>>8) & 0xff; -} - -/* return the parm'th parameter in the smbp packet */ -unsigned int smb_GetSMBParm(smb_packet_t *smbp, int parm) -{ - int parmCount; - unsigned char *parmDatap; - - parmCount = *smbp->wctp; - - if (parm >= parmCount) { - char s[100]; -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); -#endif - sprintf(s, "Bad SMB param %d out of %d, ncb len %d", - parm, parmCount, smbp->ncb_length); -#ifndef DJGPP - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1006, NULL, - 1, smbp->ncb_length, ptbuf, smbp); - DeregisterEventSource(h); -#endif - osi_Log3(smb_logp,"Bad SMB param %d out of %d, ncb len %d", - parm, parmCount, smbp->ncb_length); - osi_panic(s, __FILE__, __LINE__); - } - parmDatap = smbp->wctp + (2*parm) + 1; - - return parmDatap[0] + (parmDatap[1] << 8); -} - -/* return the parm'th parameter in the smbp packet */ -unsigned int smb_GetSMBOffsetParm(smb_packet_t *smbp, int parm, int offset) -{ - int parmCount; - unsigned char *parmDatap; - - parmCount = *smbp->wctp; - - if (parm * 2 + offset >= parmCount * 2) { - char s[100]; -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); -#endif - sprintf(s, "Bad SMB param %d offset %d out of %d, ncb len %d", - parm, offset, parmCount, smbp->ncb_length); -#ifndef DJGPP - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1006, NULL, - 1, smbp->ncb_length, ptbuf, smbp); - DeregisterEventSource(h); -#endif - osi_Log4(smb_logp, "Bad SMB param %d offset %d out of %d, ncb len %d", - parm, offset, parmCount, smbp->ncb_length); - osi_panic(s, __FILE__, __LINE__); - } - parmDatap = smbp->wctp + (2*parm) + 1 + offset; - - return parmDatap[0] + (parmDatap[1] << 8); -} - -void smb_SetSMBParm(smb_packet_t *smbp, int slot, unsigned int parmValue) -{ - char *parmDatap; - - /* make sure we have enough slots */ - if (*smbp->wctp <= slot) - *smbp->wctp = slot+1; - - parmDatap = smbp->wctp + 2*slot + 1 + smbp->oddByte; - *parmDatap++ = parmValue & 0xff; - *parmDatap = (parmValue>>8) & 0xff; -} - -void smb_SetSMBParmLong(smb_packet_t *smbp, int slot, unsigned int parmValue) -{ - char *parmDatap; - - /* make sure we have enough slots */ - if (*smbp->wctp <= slot) - *smbp->wctp = slot+2; - - parmDatap = smbp->wctp + 2*slot + 1 + smbp->oddByte; - *parmDatap++ = parmValue & 0xff; - *parmDatap++ = (parmValue>>8) & 0xff; - *parmDatap++ = (parmValue>>16) & 0xff; - *parmDatap++ = (parmValue>>24) & 0xff; -} - -void smb_SetSMBParmDouble(smb_packet_t *smbp, int slot, char *parmValuep) -{ - char *parmDatap; - int i; - - /* make sure we have enough slots */ - if (*smbp->wctp <= slot) - *smbp->wctp = slot+4; - - parmDatap = smbp->wctp + 2*slot + 1 + smbp->oddByte; - for (i=0; i<8; i++) - *parmDatap++ = *parmValuep++; -} - -void smb_SetSMBParmByte(smb_packet_t *smbp, int slot, unsigned int parmValue) -{ - char *parmDatap; - - /* make sure we have enough slots */ - if (*smbp->wctp <= slot) { - if (smbp->oddByte) { - smbp->oddByte = 0; - *smbp->wctp = slot+1; - } else - smbp->oddByte = 1; - } - - parmDatap = smbp->wctp + 2*slot + 1 + (1 - smbp->oddByte); - *parmDatap++ = parmValue & 0xff; -} - -void smb_StripLastComponent(char *outPathp, char **lastComponentp, char *inPathp) -{ - char *lastSlashp; - - lastSlashp = strrchr(inPathp, '\\'); - if (lastComponentp) - *lastComponentp = lastSlashp; - if (lastSlashp) { - while (1) { - if (inPathp == lastSlashp) - break; - *outPathp++ = *inPathp++; - } - *outPathp++ = 0; - } - else { - *outPathp++ = 0; - } -} - -unsigned char *smb_ParseASCIIBlock(unsigned char *inp, char **chainpp) -{ - if (*inp++ != 0x4) - return NULL; - if (chainpp) { - *chainpp = inp + strlen(inp) + 1; /* skip over null-terminated string */ - } - return inp; -} - -unsigned char *smb_ParseVblBlock(unsigned char *inp, char **chainpp, int *lengthp) -{ - int tlen; - - if (*inp++ != 0x5) - return NULL; - tlen = inp[0] + (inp[1]<<8); - inp += 2; /* skip length field */ - - if (chainpp) { - *chainpp = inp + tlen; - } - - if (lengthp) - *lengthp = tlen; - - return inp; -} - -/* format a packet as a response */ -void smb_FormatResponsePacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *op) -{ - smb_t *outp; - smb_t *inSmbp; - - outp = (smb_t *) op; - - /* zero the basic structure through the smb_wct field, and zero the data - * size field, assuming that wct stays zero; otherwise, you have to - * explicitly set the data size field, too. - */ - inSmbp = (smb_t *) inp; - memset(outp, 0, sizeof(smb_t)+2); - outp->id[0] = 0xff; - outp->id[1] = 'S'; - outp->id[2] = 'M'; - outp->id[3] = 'B'; - if (inp) { - outp->com = inSmbp->com; - outp->tid = inSmbp->tid; - outp->pid = inSmbp->pid; - outp->uid = inSmbp->uid; - outp->mid = inSmbp->mid; - outp->res[0] = inSmbp->res[0]; - outp->res[1] = inSmbp->res[1]; - op->inCom = inSmbp->com; - } - outp->reb = SMB_FLAGS_SERVER_TO_CLIENT | SMB_FLAGS_CANONICAL_PATHNAMES; - outp->flg2 = SMB_FLAGS2_KNOWS_LONG_NAMES; - - /* copy fields in generic packet area */ - op->wctp = &outp->wct; -} - -/* send a (probably response) packet; vcp tells us to whom to send it. - * we compute the length by looking at wct and bcc fields. - */ -void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp) -{ - NCB *ncbp; - int extra; - long code = 0; - unsigned char *tp; - int localNCB = 0; -#ifdef DJGPP - dos_ptr dos_ncb; -#endif /* DJGPP */ - - ncbp = inp->ncbp; - if (ncbp == NULL) { - ncbp = GetNCB(); - localNCB = 1; - } -#ifdef DJGPP - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; -#endif /* DJGPP */ - - memset((char *)ncbp, 0, sizeof(NCB)); - - extra = 2 * (*inp->wctp); /* space used by parms, in bytes */ - tp = inp->wctp + 1+ extra; /* points to count of data bytes */ - extra += tp[0] + (tp[1]<<8); - extra += ((unsigned int)inp->wctp - (unsigned int)inp->data); /* distance to last wct field */ - extra += 3; /* wct and length fields */ - - ncbp->ncb_length = extra; /* bytes to send */ - ncbp->ncb_lsn = (unsigned char) vcp->lsn; /* vc to use */ - ncbp->ncb_lana_num = vcp->lana; - ncbp->ncb_command = NCBSEND; /* op means send data */ -#ifndef DJGPP - ncbp->ncb_buffer = (char *) inp;/* packet */ - code = Netbios(ncbp); -#else /* DJGPP */ - ncbp->ncb_buffer = inp->dos_pkt;/* packet */ - ((smb_ncb_t*)ncbp)->orig_pkt = inp; - - /* copy header information from virtual to DOS address space */ - dosmemput((char*)inp, SMB_PACKETSIZE, inp->dos_pkt); - code = Netbios(ncbp, dos_ncb); -#endif /* !DJGPP */ - - if (code != 0) - osi_Log1(smb_logp, "SendPacket failure code %d", code); - - if (localNCB) - FreeNCB(ncbp); -} - -void smb_MapNTError(long code, unsigned long *NTStatusp) -{ - unsigned long NTStatus; - - /* map CM_ERROR_* errors to NT 32-bit status codes */ - /* NT Status codes are listed in ntstatus.h not winerror.h */ - if (code == CM_ERROR_NOSUCHCELL) { - NTStatus = 0xC000000FL; /* No such file */ - } - else if (code == CM_ERROR_NOSUCHVOLUME) { - NTStatus = 0xC000000FL; /* No such file */ - } - else if (code == CM_ERROR_TIMEDOUT) { - NTStatus = 0xC00000CFL; /* Sharing Paused */ - } - else if (code == CM_ERROR_RETRY) { - NTStatus = 0xC000022DL; /* Retry */ - } - else if (code == CM_ERROR_NOACCESS) { - NTStatus = 0xC0000022L; /* Access denied */ - } - else if (code == CM_ERROR_READONLY) { - NTStatus = 0xC00000A2L; /* Write protected */ - } - else if (code == CM_ERROR_NOSUCHFILE) { - NTStatus = 0xC000000FL; /* No such file */ - } - else if (code == CM_ERROR_NOSUCHPATH) { - NTStatus = 0xC000003AL; /* Object path not found */ - } - else if (code == CM_ERROR_TOOBIG) { - NTStatus = 0xC000007BL; /* Invalid image format */ - } - else if (code == CM_ERROR_INVAL) { - NTStatus = 0xC000000DL; /* Invalid parameter */ - } - else if (code == CM_ERROR_BADFD) { - NTStatus = 0xC0000008L; /* Invalid handle */ - } - else if (code == CM_ERROR_BADFDOP) { - NTStatus = 0xC0000022L; /* Access denied */ - } - else if (code == CM_ERROR_EXISTS) { - NTStatus = 0xC0000035L; /* Object name collision */ - } - else if (code == CM_ERROR_NOTEMPTY) { - NTStatus = 0xC0000101L; /* Directory not empty */ - } - else if (code == CM_ERROR_CROSSDEVLINK) { - NTStatus = 0xC00000D4L; /* Not same device */ - } - else if (code == CM_ERROR_NOTDIR) { - NTStatus = 0xC0000103L; /* Not a directory */ - } - else if (code == CM_ERROR_ISDIR) { - NTStatus = 0xC00000BAL; /* File is a directory */ - } - else if (code == CM_ERROR_BADOP) { -#ifdef COMMENT - /* I have no idea where this comes from */ - NTStatus = 0xC09820FFL; /* SMB no support */ -#else - NTStatus = 0xC00000BBL; /* Not supported */ -#endif /* COMMENT */ - } - else if (code == CM_ERROR_BADSHARENAME) { - NTStatus = 0xC00000CCL; /* Bad network name */ - } - else if (code == CM_ERROR_NOIPC) { -#ifdef COMMENT - NTStatus = 0xC0000022L; /* Access Denied */ -#else - NTStatus = 0xC000013DL; /* Remote Resources */ -#endif - } - else if (code == CM_ERROR_CLOCKSKEW) { - NTStatus = 0xC0000133L; /* Time difference at DC */ - } - else if (code == CM_ERROR_BADTID) { - NTStatus = 0xC0982005L; /* SMB bad TID */ - } - else if (code == CM_ERROR_USESTD) { - NTStatus = 0xC09820FBL; /* SMB use standard */ - } - else if (code == CM_ERROR_QUOTA) { -#ifdef COMMENT - NTStatus = 0xC0000044L; /* Quota exceeded */ -#else - NTStatus = 0xC000007FL; /* Disk full */ -#endif - } - else if (code == CM_ERROR_SPACE) { - NTStatus = 0xC000007FL; /* Disk full */ - } - else if (code == CM_ERROR_ATSYS) { - NTStatus = 0xC0000033L; /* Object name invalid */ - } - else if (code == CM_ERROR_BADNTFILENAME) { - NTStatus = 0xC0000033L; /* Object name invalid */ - } - else if (code == CM_ERROR_WOULDBLOCK) { - NTStatus = 0xC0000055L; /* Lock not granted */ - } - else if (code == CM_ERROR_PARTIALWRITE) { - NTStatus = 0xC000007FL; /* Disk full */ - } - else if (code == CM_ERROR_BUFFERTOOSMALL) { - NTStatus = 0xC0000023L; /* Buffer too small */ - } - else if (code == CM_ERROR_AMBIGUOUS_FILENAME) { - NTStatus = 0xC0000035L; /* Object name collision */ - } - else if (code == CM_ERROR_BADPASSWORD) { - NTStatus = 0xC000006DL; /* unknown username or bad password */ - } - else if (code == CM_ERROR_BADLOGONTYPE) { - NTStatus = 0xC000015BL; /* logon type not granted */ - } - else if (code == CM_ERROR_GSSCONTINUE) { - NTStatus = 0xC0000016L; /* more processing required */ - } - else if (code == CM_ERROR_TOO_MANY_SYMLINKS) { -#ifdef COMMENT - NTStatus = 0xC0000280L; /* reparse point not resolved */ -#else - NTStatus = 0xC0000022L; /* Access Denied */ -#endif - } - else if (code == CM_ERROR_PATH_NOT_COVERED) { - NTStatus = 0xC0000257L; /* Path Not Covered */ - } - else if (code == CM_ERROR_ALLBUSY) { - NTStatus = 0xC00000BFL; /* Network Busy */ - } else { - NTStatus = 0xC0982001L; /* SMB non-specific error */ - } - - *NTStatusp = NTStatus; - osi_Log2(smb_logp, "SMB SEND code %lX as NT %lX", code, NTStatus); -} - -void smb_MapCoreError(long code, smb_vc_t *vcp, unsigned short *scodep, - unsigned char *classp) -{ - unsigned char class; - unsigned short error; - - /* map CM_ERROR_* errors to SMB errors */ - if (code == CM_ERROR_NOSUCHCELL) { - class = 1; - error = 3; /* bad path */ - } - else if (code == CM_ERROR_NOSUCHVOLUME) { - class = 1; - error = 3; /* bad path */ - } - else if (code == CM_ERROR_TIMEDOUT) { - class = 2; - error = 81; /* server is paused */ - } - else if (code == CM_ERROR_RETRY) { - class = 2; /* shouldn't happen */ - error = 1; - } - else if (code == CM_ERROR_NOACCESS) { - class = 2; - error = 4; /* bad access */ - } - else if (code == CM_ERROR_READONLY) { - class = 3; - error = 19; /* read only */ - } - else if (code == CM_ERROR_NOSUCHFILE) { - class = 1; - error = 2; /* ENOENT! */ - } - else if (code == CM_ERROR_NOSUCHPATH) { - class = 1; - error = 3; /* Bad path */ - } - else if (code == CM_ERROR_TOOBIG) { - class = 1; - error = 11; /* bad format */ - } - else if (code == CM_ERROR_INVAL) { - class = 2; /* server non-specific error code */ - error = 1; - } - else if (code == CM_ERROR_BADFD) { - class = 1; - error = 6; /* invalid file handle */ - } - else if (code == CM_ERROR_BADFDOP) { - class = 1; /* invalid op on FD */ - error = 5; - } - else if (code == CM_ERROR_EXISTS) { - class = 1; - error = 80; /* file already exists */ - } - else if (code == CM_ERROR_NOTEMPTY) { - class = 1; - error = 5; /* delete directory not empty */ - } - else if (code == CM_ERROR_CROSSDEVLINK) { - class = 1; - error = 17; /* EXDEV */ - } - else if (code == CM_ERROR_NOTDIR) { - class = 1; /* bad path */ - error = 3; - } - else if (code == CM_ERROR_ISDIR) { - class = 1; /* access denied; DOS doesn't have a good match */ - error = 5; - } - else if (code == CM_ERROR_BADOP) { - class = 2; - error = 65535; - } - else if (code == CM_ERROR_BADSHARENAME) { - class = 2; - error = 6; - } - else if (code == CM_ERROR_NOIPC) { - class = 2; - error = 4; /* bad access */ - } - else if (code == CM_ERROR_CLOCKSKEW) { - class = 1; /* invalid function */ - error = 1; - } - else if (code == CM_ERROR_BADTID) { - class = 2; - error = 5; - } - else if (code == CM_ERROR_USESTD) { - class = 2; - error = 251; - } - else if (code == CM_ERROR_REMOTECONN) { - class = 2; - error = 82; - } - else if (code == CM_ERROR_QUOTA) { - if (vcp->flags & SMB_VCFLAG_USEV3) { - class = 3; - error = 39; /* disk full */ - } - else { - class = 1; - error = 5; /* access denied */ - } - } - else if (code == CM_ERROR_SPACE) { - if (vcp->flags & SMB_VCFLAG_USEV3) { - class = 3; - error = 39; /* disk full */ - } - else { - class = 1; - error = 5; /* access denied */ - } - } - else if (code == CM_ERROR_PARTIALWRITE) { - class = 3; - error = 39; /* disk full */ - } - else if (code == CM_ERROR_ATSYS) { - class = 1; - error = 2; /* ENOENT */ - } - else if (code == CM_ERROR_WOULDBLOCK) { - class = 1; - error = 33; /* lock conflict */ - } - else if (code == CM_ERROR_NOFILES) { - class = 1; - error = 18; /* no files in search */ - } - else if (code == CM_ERROR_RENAME_IDENTICAL) { - class = 1; - error = 183; /* Samba uses this */ - } - else if (code == CM_ERROR_BADPASSWORD || code == CM_ERROR_BADLOGONTYPE) { - /* we don't have a good way of reporting CM_ERROR_BADLOGONTYPE */ - class = 2; - error = 2; /* bad password */ - } - else if (code == CM_ERROR_PATH_NOT_COVERED) { - class = 2; - error = 3; /* bad path */ - } - else { - class = 2; - error = 1; - } - - *scodep = error; - *classp = class; - osi_Log3(smb_logp, "SMB SEND code %lX as SMB %d: %d", code, class, error); -} - -long smb_SendCoreBadOp(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"SendCoreBadOp - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long smb_ReceiveCoreEcho(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned short EchoCount, i; - char *data, *outdata; - int dataSize; - - EchoCount = (unsigned short) smb_GetSMBParm(inp, 0); - - for (i=1; i<=EchoCount; i++) { - data = smb_GetSMBData(inp, &dataSize); - smb_SetSMBParm(outp, 0, i); - smb_SetSMBDataLength(outp, dataSize); - outdata = smb_GetSMBData(outp, NULL); - memcpy(outdata, data, dataSize); - smb_SendPacket(vcp, outp); - } - - return 0; -} - -long smb_ReceiveCoreReadRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_hyper_t offset; - long count, minCount, finalCount; - unsigned short fd; - smb_fid_t *fidp; - long code = 0; - cm_user_t *userp = NULL; - NCB *ncbp; - int rc; -#ifndef DJGPP - char *rawBuf = NULL; -#else - dos_ptr rawBuf = NULL; - dos_ptr dos_ncb; -#endif /* DJGPP */ - - rawBuf = NULL; - finalCount = 0; - - fd = smb_GetSMBParm(inp, 0); - count = smb_GetSMBParm(inp, 3); - minCount = smb_GetSMBParm(inp, 4); - offset.HighPart = 0; /* too bad */ - offset.LowPart = smb_GetSMBParm(inp, 1) | (smb_GetSMBParm(inp, 2) << 16); - - osi_Log3(smb_logp, "smb_ReceieveCoreReadRaw fd %d, off 0x%x, size 0x%x", - fd, offset.LowPart, count); - - fidp = smb_FindFID(vcp, fd, 0); - if (!fidp) - goto send1; - - lock_ObtainMutex(&smb_RawBufLock); - if (smb_RawBufs) { - /* Get a raw buf, from head of list */ - rawBuf = smb_RawBufs; -#ifndef DJGPP - smb_RawBufs = *(char **)smb_RawBufs; -#else /* DJGPP */ - smb_RawBufs = _farpeekl(_dos_ds, smb_RawBufs); -#endif /* !DJGPP */ - } - lock_ReleaseMutex(&smb_RawBufLock); - if (!rawBuf) - goto send1a; - - if (fidp->flags & SMB_FID_IOCTL) - { -#ifndef DJGPP - rc = smb_IoctlReadRaw(fidp, vcp, inp, outp); -#else - rc = smb_IoctlReadRaw(fidp, vcp, inp, outp, rawBuf); -#endif - if (rawBuf) { - /* Give back raw buffer */ - lock_ObtainMutex(&smb_RawBufLock); -#ifndef DJGPP - *((char **) rawBuf) = smb_RawBufs; -#else /* DJGPP */ - _farpokel(_dos_ds, rawBuf, smb_RawBufs); -#endif /* !DJGPP */ - - smb_RawBufs = rawBuf; - lock_ReleaseMutex(&smb_RawBufLock); - } - - smb_ReleaseFID(fidp); - return rc; - } - - userp = smb_GetUser(vcp, inp); - -#ifndef DJGPP - code = smb_ReadData(fidp, &offset, count, rawBuf, userp, &finalCount); -#else /* DJGPP */ - /* have to give ReadData flag so it will treat buffer as DOS mem. */ - code = smb_ReadData(fidp, &offset, count, (unsigned char *)rawBuf, - userp, &finalCount, TRUE /* rawFlag */); -#endif /* !DJGPP */ - - if (code != 0) - goto send; - - send: - cm_ReleaseUser(userp); - - send1a: - smb_ReleaseFID(fidp); - - send1: - ncbp = outp->ncbp; -#ifdef DJGPP - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; -#endif /* DJGPP */ - memset((char *)ncbp, 0, sizeof(NCB)); - - ncbp->ncb_length = (unsigned short) finalCount; - ncbp->ncb_lsn = (unsigned char) vcp->lsn; - ncbp->ncb_lana_num = vcp->lana; - ncbp->ncb_command = NCBSEND; - ncbp->ncb_buffer = rawBuf; - -#ifndef DJGPP - code = Netbios(ncbp); -#else /* DJGPP */ - code = Netbios(ncbp, dos_ncb); -#endif /* !DJGPP */ - if (code != 0) - osi_Log1(smb_logp, "ReadRaw send failure code %d", code); - - if (rawBuf) { - /* Give back raw buffer */ - lock_ObtainMutex(&smb_RawBufLock); -#ifndef DJGPP - *((char **) rawBuf) = smb_RawBufs; -#else /* DJGPP */ - _farpokel(_dos_ds, rawBuf, smb_RawBufs); -#endif /* !DJGPP */ - - smb_RawBufs = rawBuf; - lock_ReleaseMutex(&smb_RawBufLock); - } - - return 0; -} - -long smb_ReceiveCoreLockRecord(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_Log1(smb_logp, "SMB receive core lock record (not implemented); %d + 1 ongoing ops", - ongoingOps - 1); - return 0; -} - -long smb_ReceiveCoreUnlockRecord(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_Log1(smb_logp, "SMB receive core unlock record (not implemented); %d + 1 ongoing ops", - ongoingOps - 1); - return 0; -} - -long smb_ReceiveNegotiate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *namep; - char *datap; - int coreProtoIndex; - int v3ProtoIndex; - int NTProtoIndex; - int protoIndex; /* index we're using */ - int namex; - int dbytes; - int entryLength; - int tcounter; - char protocol_array[10][1024]; /* protocol signature of the client */ - int caps; /* capabilities */ - time_t unixTime; - afs_uint32 dosTime; - TIME_ZONE_INFORMATION tzi; - - osi_Log1(smb_logp, "SMB receive negotiate; %d + 1 ongoing ops", - ongoingOps - 1); - if (!isGateway) { - if (active_vcp) { - DWORD now = GetCurrentTime(); - if (now - last_msg_time >= 30000 - && now - last_msg_time <= 90000) { - osi_Log1(smb_logp, - "Setting dead_vcp %x", active_vcp); - if (dead_vcp) { - smb_ReleaseVC(dead_vcp); - osi_Log1(smb_logp, - "Previous dead_vcp %x", dead_vcp); - } - smb_HoldVC(active_vcp); - dead_vcp = active_vcp; - dead_vcp->flags |= SMB_VCFLAG_ALREADYDEAD; - } - } - } - - inp->flags |= SMB_PACKETFLAG_PROFILE_UPDATE_OK; - - namep = smb_GetSMBData(inp, &dbytes); - namex = 0; - tcounter = 0; - coreProtoIndex = -1; /* not found */ - v3ProtoIndex = -1; - NTProtoIndex = -1; - while(namex < dbytes) { - osi_Log1(smb_logp, "Protocol %s", - osi_LogSaveString(smb_logp, namep+1)); - strcpy(protocol_array[tcounter], namep+1); - - /* namep points at the first protocol, or really, a 0x02 - * byte preceding the null-terminated ASCII name. - */ - if (strcmp("PC NETWORK PROGRAM 1.0", namep+1) == 0) { - coreProtoIndex = tcounter; - } - else if (smb_useV3 && strcmp("LM1.2X002", namep+1) == 0) { - v3ProtoIndex = tcounter; - } - else if (smb_useV3 && strcmp("NT LM 0.12", namep+1) == 0) { - NTProtoIndex = tcounter; - } - - /* compute size of protocol entry */ - entryLength = strlen(namep+1); - entryLength += 2; /* 0x02 bytes and null termination */ - - /* advance over this protocol entry */ - namex += entryLength; - namep += entryLength; - tcounter++; /* which proto entry we're looking at */ - } - - if (NTProtoIndex != -1) { - protoIndex = NTProtoIndex; - vcp->flags |= (SMB_VCFLAG_USENT | SMB_VCFLAG_USEV3); - } - else if (v3ProtoIndex != -1) { - protoIndex = v3ProtoIndex; - vcp->flags |= SMB_VCFLAG_USEV3; - } - else if (coreProtoIndex != -1) { - protoIndex = coreProtoIndex; - vcp->flags |= SMB_VCFLAG_USECORE; - } - else protoIndex = -1; - - if (protoIndex == -1) - return CM_ERROR_INVAL; - else if (NTProtoIndex != -1) { - smb_SetSMBParm(outp, 0, protoIndex); - if (smb_authType != SMB_AUTH_NONE) { - smb_SetSMBParmByte(outp, 1, - NEGOTIATE_SECURITY_USER_LEVEL | - NEGOTIATE_SECURITY_CHALLENGE_RESPONSE); /* user level security, challenge response */ - } else { - smb_SetSMBParmByte(outp, 1, 0); /* share level auth with plaintext password. */ - } - smb_SetSMBParm(outp, 1, smb_maxMpxRequests); /* max multiplexed requests */ - smb_SetSMBParm(outp, 2, smb_maxVCPerServer); /* max VCs per consumer/server connection */ - smb_SetSMBParmLong(outp, 3, SMB_PACKETSIZE); /* xmit buffer size */ - smb_SetSMBParmLong(outp, 5, SMB_MAXRAWSIZE); /* raw buffer size */ - /* The session key is not a well documented field however most clients - * will echo back the session key to the server. Currently we are using - * the same value for all sessions. We should generate a random value - * and store it into the vcp - */ - smb_SetSMBParm(outp, 7, 1); /* next 2: session key */ - smb_SetSMBParm(outp, 8, 1); - /* - * Tried changing the capabilities to support for W2K - defect 117695 - * Maybe something else needs to be changed here? - */ - /* - if (isWindows2000) - smb_SetSMBParmLong(outp, 9, 0x43fd); - else - smb_SetSMBParmLong(outp, 9, 0x251); - */ - /* Capabilities: * - * 32-bit error codes * - * and NT Find * - * and NT SMB's * - * and raw mode - * and DFS */ - caps = NTNEGOTIATE_CAPABILITY_NTSTATUS | -#ifdef DFS_SUPPORT - NTNEGOTIATE_CAPABILITY_DFS | -#endif - NTNEGOTIATE_CAPABILITY_NTFIND | - NTNEGOTIATE_CAPABILITY_RAWMODE | - NTNEGOTIATE_CAPABILITY_NTSMB; - - if ( smb_authType == SMB_AUTH_EXTENDED ) - caps |= NTNEGOTIATE_CAPABILITY_EXTENDED_SECURITY; - - smb_SetSMBParmLong(outp, 9, caps); - time(&unixTime); - smb_SearchTimeFromUnixTime(&dosTime, unixTime); - smb_SetSMBParmLong(outp, 11, LOWORD(dosTime));/* server time */ - smb_SetSMBParmLong(outp, 13, HIWORD(dosTime));/* server date */ - - GetTimeZoneInformation(&tzi); - smb_SetSMBParm(outp, 15, (unsigned short) tzi.Bias); /* server tzone */ - - if (smb_authType == SMB_AUTH_NTLM) { - smb_SetSMBParmByte(outp, 16, MSV1_0_CHALLENGE_LENGTH);/* Encryption key length */ - smb_SetSMBDataLength(outp, MSV1_0_CHALLENGE_LENGTH + smb_ServerDomainNameLength); - /* paste in encryption key */ - datap = smb_GetSMBData(outp, NULL); - memcpy(datap,vcp->encKey,MSV1_0_CHALLENGE_LENGTH); - /* and the faux domain name */ - strcpy(datap + MSV1_0_CHALLENGE_LENGTH,smb_ServerDomainName); - } else if ( smb_authType == SMB_AUTH_EXTENDED ) { - void * secBlob; - int secBlobLength; - - smb_SetSMBParmByte(outp, 16, 0); /* Encryption key length */ - - smb_NegotiateExtendedSecurity(&secBlob, &secBlobLength); - - smb_SetSMBDataLength(outp, secBlobLength + sizeof(smb_ServerGUID)); - - datap = smb_GetSMBData(outp, NULL); - memcpy(datap, &smb_ServerGUID, sizeof(smb_ServerGUID)); - - if (secBlob) { - datap += sizeof(smb_ServerGUID); - memcpy(datap, secBlob, secBlobLength); - free(secBlob); - } - } else { - smb_SetSMBParmByte(outp, 16, 0); /* Encryption key length */ - smb_SetSMBDataLength(outp, 0); /* Perhaps we should specify 8 bytes anyway */ - } - } - else if (v3ProtoIndex != -1) { - smb_SetSMBParm(outp, 0, protoIndex); - - /* NOTE: Extended authentication cannot be negotiated with v3 - * therefore we fail over to NTLM - */ - if (smb_authType == SMB_AUTH_NTLM || smb_authType == SMB_AUTH_EXTENDED) { - smb_SetSMBParm(outp, 1, - NEGOTIATE_SECURITY_USER_LEVEL | - NEGOTIATE_SECURITY_CHALLENGE_RESPONSE); /* user level security, challenge response */ - } else { - smb_SetSMBParm(outp, 1, 0); /* share level auth with clear password */ - } - smb_SetSMBParm(outp, 2, SMB_PACKETSIZE); - smb_SetSMBParm(outp, 3, smb_maxMpxRequests); /* max multiplexed requests */ - smb_SetSMBParm(outp, 4, smb_maxVCPerServer); /* max VCs per consumer/server connection */ - smb_SetSMBParm(outp, 5, 0); /* no support of block mode for read or write */ - smb_SetSMBParm(outp, 6, 1); /* next 2: session key */ - smb_SetSMBParm(outp, 7, 1); - time(&unixTime); - smb_SearchTimeFromUnixTime(&dosTime, unixTime); - smb_SetSMBParm(outp, 8, LOWORD(dosTime)); /* server time */ - smb_SetSMBParm(outp, 9, HIWORD(dosTime)); /* server date */ - - GetTimeZoneInformation(&tzi); - smb_SetSMBParm(outp, 10, (unsigned short) tzi.Bias); /* server tzone */ - - /* NOTE: Extended authentication cannot be negotiated with v3 - * therefore we fail over to NTLM - */ - if (smb_authType == SMB_AUTH_NTLM || smb_authType == SMB_AUTH_EXTENDED) { - smb_SetSMBParm(outp, 11, MSV1_0_CHALLENGE_LENGTH); /* encryption key length */ - smb_SetSMBParm(outp, 12, 0); /* resvd */ - smb_SetSMBDataLength(outp, MSV1_0_CHALLENGE_LENGTH + smb_ServerDomainNameLength); /* perhaps should specify 8 bytes anyway */ - datap = smb_GetSMBData(outp, NULL); - /* paste in a new encryption key */ - memcpy(datap, vcp->encKey, MSV1_0_CHALLENGE_LENGTH); - /* and the faux domain name */ - strcpy(datap + MSV1_0_CHALLENGE_LENGTH, smb_ServerDomainName); - } else { - smb_SetSMBParm(outp, 11, 0); /* encryption key length */ - smb_SetSMBParm(outp, 12, 0); /* resvd */ - smb_SetSMBDataLength(outp, 0); - } - } - else if (coreProtoIndex != -1) { /* not really supported anymore */ - smb_SetSMBParm(outp, 0, protoIndex); - smb_SetSMBDataLength(outp, 0); - } - return 0; -} - -void smb_Daemon(void *parmp) -{ - afs_uint32 count = 0; - - while(smbShutdownFlag == 0) { - count++; - thrd_Sleep(10000); - - if (smbShutdownFlag == 1) - break; - - if ((count % 72) == 0) { /* every five minutes */ - struct tm myTime; - time_t old_localZero = smb_localZero; - - /* Initialize smb_localZero */ - myTime.tm_isdst = -1; /* compute whether on DST or not */ - myTime.tm_year = 70; - myTime.tm_mon = 0; - myTime.tm_mday = 1; - myTime.tm_hour = 0; - myTime.tm_min = 0; - myTime.tm_sec = 0; - smb_localZero = mktime(&myTime); - -#ifndef USE_NUMERIC_TIME_CONV - smb_CalculateNowTZ(); -#endif /* USE_NUMERIC_TIME_CONV */ -#ifdef AFS_FREELANCE - if ( smb_localZero != old_localZero ) - cm_noteLocalMountPointChange(); -#endif - } - /* XXX GC dir search entries */ - } -} - -void smb_WaitingLocksDaemon() -{ - smb_waitingLock_t *wL, *nwL; - int first; - smb_vc_t *vcp; - smb_packet_t *inp, *outp; - NCB *ncbp; - long code = 0; - - while (smbShutdownFlag == 0) { - lock_ObtainWrite(&smb_globalLock); - nwL = smb_allWaitingLocks; - if (nwL == NULL) { - osi_SleepW((long)&smb_allWaitingLocks, &smb_globalLock); - thrd_Sleep(1000); - continue; - } else - first = 1; - - do { - if (first) - first = 0; - else - lock_ObtainWrite(&smb_globalLock); - wL = nwL; - nwL = (smb_waitingLock_t *) osi_QNext(&wL->q); - lock_ReleaseWrite(&smb_globalLock); - code = cm_RetryLock((cm_file_lock_t *) wL->lockp, - wL->vcp->flags & SMB_VCFLAG_ALREADYDEAD); - if (code == CM_ERROR_WOULDBLOCK) { - /* no progress */ - if (wL->timeRemaining != 0xffffffff - && (wL->timeRemaining -= 1000) < 0) - goto endWait; - continue; - } - - endWait: - vcp = wL->vcp; - inp = wL->inp; - outp = wL->outp; - ncbp = GetNCB(); - ncbp->ncb_length = inp->ncb_length; - inp->spacep = cm_GetSpace(); - - /* Remove waitingLock from list */ - lock_ObtainWrite(&smb_globalLock); - osi_QRemove((osi_queue_t **)&smb_allWaitingLocks, - &wL->q); - lock_ReleaseWrite(&smb_globalLock); - - /* Resume packet processing */ - if (code == 0) - smb_SetSMBDataLength(outp, 0); - outp->flags |= SMB_PACKETFLAG_SUSPENDED; - outp->resumeCode = code; - outp->ncbp = ncbp; - smb_DispatchPacket(vcp, inp, outp, ncbp, NULL); - - /* Clean up */ - cm_FreeSpace(inp->spacep); - smb_FreePacket(inp); - smb_FreePacket(outp); - smb_ReleaseVC(vcp); - FreeNCB(ncbp); - free(wL); - } while (nwL && smbShutdownFlag == 0); - thrd_Sleep(1000); - } -} - -long smb_ReceiveCoreGetDiskAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_Log0(smb_logp, "SMB receive get disk attributes"); - - smb_SetSMBParm(outp, 0, 32000); - smb_SetSMBParm(outp, 1, 64); - smb_SetSMBParm(outp, 2, 1024); - smb_SetSMBParm(outp, 3, 30000); - smb_SetSMBParm(outp, 4, 0); - smb_SetSMBDataLength(outp, 0); - return 0; -} - -long smb_ReceiveCoreTreeConnect(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *rsp) -{ - smb_tid_t *tidp; - smb_user_t *uidp; - unsigned short newTid; - char shareName[256]; - char *sharePath; - int shareFound; - char *tp; - char *pathp; - char *passwordp; - cm_user_t *userp; - - osi_Log0(smb_logp, "SMB receive tree connect"); - - /* parse input parameters */ - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - passwordp = smb_ParseASCIIBlock(tp, &tp); - tp = strrchr(pathp, '\\'); - if (!tp) - return CM_ERROR_BADSMB; - strcpy(shareName, tp+1); - - userp = smb_GetUser(vcp, inp); - - lock_ObtainMutex(&vcp->mx); - newTid = vcp->tidCounter++; - lock_ReleaseMutex(&vcp->mx); - - tidp = smb_FindTID(vcp, newTid, SMB_FLAG_CREATE); - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - shareFound = smb_FindShare(vcp, uidp, shareName, &sharePath); - if (uidp) - smb_ReleaseUID(uidp); - if (!shareFound) { - smb_ReleaseTID(tidp); - return CM_ERROR_BADSHARENAME; - } - lock_ObtainMutex(&tidp->mx); - tidp->userp = userp; - tidp->pathname = sharePath; - lock_ReleaseMutex(&tidp->mx); - smb_ReleaseTID(tidp); - - smb_SetSMBParm(rsp, 0, SMB_PACKETSIZE); - smb_SetSMBParm(rsp, 1, newTid); - smb_SetSMBDataLength(rsp, 0); - - osi_Log1(smb_logp, "SMB tree connect created ID %d", newTid); - return 0; -} - -unsigned char *smb_ParseDataBlock(unsigned char *inp, char **chainpp, int *lengthp) -{ - int tlen; - - if (*inp++ != 0x1) return NULL; - tlen = inp[0] + (inp[1]<<8); - inp += 2; /* skip length field */ - - if (chainpp) { - *chainpp = inp + tlen; - } - - if (lengthp) *lengthp = tlen; - - return inp; -} - -/* set maskp to the mask part of the incoming path. - * Mask is 11 bytes long (8.3 with the dot elided). - * Returns true if succeeds with a valid name, otherwise it does - * its best, but returns false. - */ -int smb_Get8Dot3MaskFromPath(unsigned char *maskp, unsigned char *pathp) -{ - char *tp; - char *up; - int i; - int tc; - int valid8Dot3; - - /* starts off valid */ - valid8Dot3 = 1; - - /* mask starts out all blanks */ - memset(maskp, ' ', 11); - - /* find last backslash, or use whole thing if there is none */ - tp = strrchr(pathp, '\\'); - if (!tp) tp = pathp; - else tp++; /* skip slash */ - - up = maskp; - - /* names starting with a dot are illegal */ - if (*tp == '.') valid8Dot3 = 0; - - for(i=0;; i++) { - tc = *tp++; - if (tc == 0) return valid8Dot3; - if (tc == '.' || tc == '"') break; - if (i < 8) *up++ = tc; - else valid8Dot3 = 0; - } - - /* if we get here, tp point after the dot */ - up = maskp+8; /* ext goes here */ - for(i=0;;i++) { - tc = *tp++; - if (tc == 0) - return valid8Dot3; - - /* too many dots */ - if (tc == '.' || tc == '"') - valid8Dot3 = 0; - - /* copy extension if not too long */ - if (i < 3) - *up++ = tc; - else - valid8Dot3 = 0; - } - - /* unreachable */ -} - -int smb_Match8Dot3Mask(char *unixNamep, char *maskp) -{ - char umask[11]; - int valid; - int i; - char tc1; - char tc2; - char *tp1; - char *tp2; - - /* XXX redo this, calling smb_V3MatchMask with a converted mask */ - - valid = smb_Get8Dot3MaskFromPath(umask, unixNamep); - if (!valid) - return 0; - - /* otherwise, we have a valid 8.3 name; see if we have a match, - * treating '?' as a wildcard in maskp (but not in the file name). - */ - tp1 = umask; /* real name, in mask format */ - tp2 = maskp; /* mask, in mask format */ - for(i=0; i<11; i++) { - tc1 = *tp1++; /* char from real name */ - tc2 = *tp2++; /* char from mask */ - tc1 = (char) cm_foldUpper[(unsigned char)tc1]; - tc2 = (char) cm_foldUpper[(unsigned char)tc2]; - if (tc1 == tc2) - continue; - if (tc2 == '?' && tc1 != ' ') - continue; - if (tc2 == '>') - continue; - return 0; - } - - /* we got a match */ - return 1; -} - -char *smb_FindMask(char *pathp) -{ - char *tp; - - tp = strrchr(pathp, '\\'); /* find last slash */ - - if (tp) - return tp+1; /* skip the slash */ - else - return pathp; /* no slash, return the entire path */ -} - -long smb_ReceiveCoreSearchVolume(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned char *pathp; - unsigned char *tp; - unsigned char mask[11]; - unsigned char *statBlockp; - unsigned char initStatBlock[21]; - int statLen; - - osi_Log0(smb_logp, "SMB receive search volume"); - - /* pull pathname and stat block out of request */ - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, (char **) &tp); - osi_assert(pathp != NULL); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - statBlockp = smb_ParseVblBlock(tp, (char **) &tp, &statLen); - osi_assert(statBlockp != NULL); - if (statLen == 0) { - statBlockp = initStatBlock; - statBlockp[0] = 8; - } - - /* for returning to caller */ - smb_Get8Dot3MaskFromPath(mask, pathp); - - smb_SetSMBParm(outp, 0, 1); /* we're returning one entry */ - tp = smb_GetSMBData(outp, NULL); - *tp++ = 5; - *tp++ = 43; /* bytes in a dir entry */ - *tp++ = 0; /* high byte in counter */ - - /* now marshall the dir entry, starting with the search status */ - *tp++ = statBlockp[0]; /* Reserved */ - memcpy(tp, mask, 11); tp += 11; /* FileName */ - - /* now pass back server use info, with 1st byte non-zero */ - *tp++ = 1; - memset(tp, 0, 4); tp += 4; /* reserved for server use */ - - memcpy(tp, statBlockp+17, 4); tp += 4; /* reserved for consumer */ - - *tp++ = 0x8; /* attribute: volume */ - - /* copy out time */ - *tp++ = 0; - *tp++ = 0; - - /* copy out date */ - *tp++ = 18; - *tp++ = 178; - - /* 4 byte file size */ - *tp++ = 0; - *tp++ = 0; - *tp++ = 0; - *tp++ = 0; - - /* finally, null-terminated 8.3 pathname, which we set to AFS */ - memset(tp, ' ', 13); - strcpy(tp, "AFS"); - - /* set the length of the data part of the packet to 43 + 3, for the dir - * entry plus the 5 and the length fields. - */ - smb_SetSMBDataLength(outp, 46); - return 0; -} - -long smb_ApplyDirListPatches(smb_dirListPatch_t **dirPatchespp, - cm_user_t *userp, cm_req_t *reqp) -{ - long code = 0; - cm_scache_t *scp; - char *dptr; - afs_uint32 dosTime; - u_short shortTemp; - char attr; - smb_dirListPatch_t *patchp; - smb_dirListPatch_t *npatchp; - - for (patchp = *dirPatchespp; patchp; patchp = - (smb_dirListPatch_t *) osi_QNext(&patchp->q)) { - - dptr = patchp->dptr; - - code = cm_GetSCache(&patchp->fid, &scp, userp, reqp); - if (code) { - if( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) - *dptr++ = SMB_ATTR_HIDDEN; - continue; - } - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - if (patchp->flags & SMB_DIRLISTPATCH_DOTFILE) - *dptr++ = SMB_ATTR_HIDDEN; - continue; - } - - attr = smb_Attributes(scp); - /* check hidden attribute (the flag is only ON when dot file hiding is on ) */ - if (patchp->flags & SMB_DIRLISTPATCH_DOTFILE) - attr |= SMB_ATTR_HIDDEN; - *dptr++ = attr; - - /* get dos time */ - smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime); - - /* copy out time */ - shortTemp = (unsigned short) (dosTime & 0xffff); - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* and copy out date */ - shortTemp = (unsigned short) ((dosTime>>16) & 0xffff); - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out file length */ - *((u_long *)dptr) = scp->length.LowPart; - dptr += 4; - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - } - - /* now free the patches */ - for (patchp = *dirPatchespp; patchp; patchp = npatchp) { - npatchp = (smb_dirListPatch_t *) osi_QNext(&patchp->q); - free(patchp); - } - - /* and mark the list as empty */ - *dirPatchespp = NULL; - - return code; -} - -long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - int attribute; - long nextCookie; - char *tp; - long code = 0; - char *pathp; - cm_dirEntry_t *dep; - int maxCount; - smb_dirListPatch_t *dirListPatchesp; - smb_dirListPatch_t *curPatchp; - int dataLength; - cm_buf_t *bufferp; - long temp; - osi_hyper_t dirLength; - osi_hyper_t bufferOffset; - osi_hyper_t curOffset; - osi_hyper_t thyper; - unsigned char *inCookiep; - smb_dirSearch_t *dsp; - cm_scache_t *scp; - long entryInDir; - long entryInBuffer; - unsigned long clientCookie; - cm_pageHeader_t *pageHeaderp; - cm_user_t *userp = NULL; - int slotInPage; - char shortName[13]; - char *actualName; - char *shortNameEnd; - char mask[11]; - int returnedNames; - long nextEntryCookie; - int numDirChunks; /* # of 32 byte dir chunks in this entry */ - char resByte; /* reserved byte from the cookie */ - char *op; /* output data ptr */ - char *origOp; /* original value of op */ - cm_space_t *spacep; /* for pathname buffer */ - int starPattern; - int rootPath = 0; - int caseFold; - char *tidPathp; - cm_req_t req; - cm_fid_t fid; - int fileType; - - cm_InitReq(&req); - - maxCount = smb_GetSMBParm(inp, 0); - - dirListPatchesp = NULL; - - caseFold = CM_FLAG_CASEFOLD; - - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - inCookiep = smb_ParseVblBlock(tp, &tp, &dataLength); - - /* bail out if request looks bad */ - if (!tp || !pathp) { - return CM_ERROR_BADSMB; - } - - /* We can handle long names */ - if (vcp->flags & SMB_VCFLAG_USENT) - ((smb_t *)outp)->flg2 |= SMB_FLAGS2_IS_LONG_NAME; - - /* make sure we got a whole search status */ - if (dataLength < 21) { - nextCookie = 0; /* start at the beginning of the dir */ - resByte = 0; - clientCookie = 0; - attribute = smb_GetSMBParm(inp, 1); - - /* handle volume info in another function */ - if (attribute & 0x8) - return smb_ReceiveCoreSearchVolume(vcp, inp, outp); - - osi_Log2(smb_logp, "SMB receive search dir count %d [%s]", - maxCount, osi_LogSaveString(smb_logp, pathp)); - - if (*pathp == 0) { /* null pathp, treat as root dir */ - if (!(attribute & SMB_ATTR_DIRECTORY)) /* exclude dirs */ - return CM_ERROR_NOFILES; - rootPath = 1; - } - - dsp = smb_NewDirSearch(0); - dsp->attribute = attribute; - smb_Get8Dot3MaskFromPath(mask, pathp); - memcpy(dsp->mask, mask, 11); - - /* track if this is likely to match a lot of entries */ - if (smb_IsStarMask(mask)) - starPattern = 1; - else - starPattern = 0; - } else { - /* pull the next cookie value out of the search status block */ - nextCookie = inCookiep[13] + (inCookiep[14]<<8) + (inCookiep[15]<<16) - + (inCookiep[16]<<24); - dsp = smb_FindDirSearch(inCookiep[12]); - if (!dsp) { - /* can't find dir search status; fatal error */ - osi_Log3(smb_logp, "SMB receive search dir bad cookie: cookie %d nextCookie %u [%s]", - inCookiep[12], nextCookie, osi_LogSaveString(smb_logp, pathp)); - return CM_ERROR_BADFD; - } - attribute = dsp->attribute; - resByte = inCookiep[0]; - - /* copy out client cookie, in host byte order. Don't bother - * interpreting it, since we're just passing it through, anyway. - */ - memcpy(&clientCookie, &inCookiep[17], 4); - - memcpy(mask, dsp->mask, 11); - - /* assume we're doing a star match if it has continued for more - * than one call. - */ - starPattern = 1; - } - - osi_Log3(smb_logp, "SMB search dir cookie 0x%x, connection %d, attr 0x%x", - nextCookie, dsp->cookie, attribute); - - userp = smb_GetUser(vcp, inp); - - /* try to get the vnode for the path name next */ - lock_ObtainMutex(&dsp->mx); - if (dsp->scp) { - scp = dsp->scp; - cm_HoldSCache(scp); - code = 0; - } else { - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, NULL, pathp); - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - lock_ReleaseMutex(&dsp->mx); - cm_ReleaseUser(userp); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return CM_ERROR_NOFILES; - } - code = cm_NameI(cm_data.rootSCachep, spacep->data, - caseFold | CM_FLAG_FOLLOW, userp, tidPathp, &req, &scp); - if (code == 0) { -#ifdef DFS_SUPPORT - if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - lock_ReleaseMutex(&dsp->mx); - cm_ReleaseUser(userp); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - dsp->scp = scp; - /* we need one hold for the entry we just stored into, - * and one for our own processing. When we're done with this - * function, we'll drop the one for our own processing. - * We held it once from the namei call, and so we do another hold - * now. - */ - cm_HoldSCache(scp); - lock_ObtainMutex(&scp->mx); - if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0 - && LargeIntegerGreaterOrEqualToZero(scp->bulkStatProgress)) { - scp->flags |= CM_SCACHEFLAG_BULKSTATTING; - dsp->flags |= SMB_DIRSEARCH_BULKST; - } - lock_ReleaseMutex(&scp->mx); - } - } - lock_ReleaseMutex(&dsp->mx); - if (code) { - cm_ReleaseUser(userp); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return code; - } - - /* reserves space for parameter; we'll adjust it again later to the - * real count of the # of entries we returned once we've actually - * assembled the directory listing. - */ - smb_SetSMBParm(outp, 0, 0); - - /* get the directory size */ - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return code; - } - - dirLength = scp->length; - bufferp = NULL; - bufferOffset.LowPart = bufferOffset.HighPart = 0; - curOffset.HighPart = 0; - curOffset.LowPart = nextCookie; - origOp = op = smb_GetSMBData(outp, NULL); - /* and write out the basic header */ - *op++ = 5; /* variable block */ - op += 2; /* skip vbl block length; we'll fill it in later */ - code = 0; - returnedNames = 0; - while (1) { - /* make sure that curOffset.LowPart doesn't point to the first - * 32 bytes in the 2nd through last dir page, and that it doesn't - * point at the first 13 32-byte chunks in the first dir page, - * since those are dir and page headers, and don't contain useful - * information. - */ - temp = curOffset.LowPart & (2048-1); - if (curOffset.HighPart == 0 && curOffset.LowPart < 2048) { - /* we're in the first page */ - if (temp < 13*32) temp = 13*32; - } - else { - /* we're in a later dir page */ - if (temp < 32) temp = 32; - } - - /* make sure the low order 5 bits are zero */ - temp &= ~(32-1); - - /* now put temp bits back ito curOffset.LowPart */ - curOffset.LowPart &= ~(2048-1); - curOffset.LowPart |= temp; - - /* check if we've returned all the names that will fit in the - * response packet. - */ - if (returnedNames >= maxCount) { - osi_Log2(smb_logp, "SMB search dir returnedNames %d >= maxCount %d", - returnedNames, maxCount); - break; - } - - /* check if we've passed the dir's EOF */ - if (LargeIntegerGreaterThanOrEqualTo(curOffset, dirLength)) break; - - /* see if we can use the bufferp we have now; compute in which page - * the current offset would be, and check whether that's the offset - * of the buffer we have. If not, get the buffer. - */ - thyper.HighPart = curOffset.HighPart; - thyper.LowPart = curOffset.LowPart & ~(cm_data.buf_blockSize-1); - if (!bufferp || !LargeIntegerEqualTo(thyper, bufferOffset)) { - /* wrong buffer */ - if (bufferp) { - buf_Release(bufferp); - bufferp = NULL; - } - lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); - code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); - lock_ObtainMutex(&dsp->mx); - - /* now, if we're doing a star match, do bulk fetching of all of - * the status info for files in the dir. - */ - if (starPattern) { - smb_ApplyDirListPatches(&dirListPatchesp, userp, &req); - lock_ObtainMutex(&scp->mx); - if ((dsp->flags & SMB_DIRSEARCH_BULKST) && - LargeIntegerGreaterThanOrEqualTo(thyper, - scp->bulkStatProgress)) { - /* Don't bulk stat if risking timeout */ - int now = GetCurrentTime(); - if (now - req.startTime > 5000) { - scp->bulkStatProgress = thyper; - scp->flags &= ~CM_SCACHEFLAG_BULKSTATTING; - dsp->flags &= ~SMB_DIRSEARCH_BULKST; - } else - cm_TryBulkStat(scp, &thyper, userp, &req); - } - } else { - lock_ObtainMutex(&scp->mx); - } - lock_ReleaseMutex(&dsp->mx); - if (code) { - osi_Log2(smb_logp, "SMB search dir buf_Get scp %x failed %d", scp, code); - break; - } - - bufferOffset = thyper; - - /* now get the data in the cache */ - while (1) { - code = cm_SyncOp(scp, bufferp, userp, &req, - PRSFS_LOOKUP, - CM_SCACHESYNC_NEEDCALLBACK | - CM_SCACHESYNC_READ); - if (code) { - osi_Log2(smb_logp, "SMB search dir cm_SyncOp scp %x failed %d", scp, code); - break; - } - - if (cm_HaveBuffer(scp, bufferp, 0)) { - osi_Log2(smb_logp, "SMB search dir !HaveBuffer scp %x bufferp %x", scp, bufferp); - break; - } - - /* otherwise, load the buffer and try again */ - code = cm_GetBuffer(scp, bufferp, NULL, userp, &req); - if (code) { - osi_Log3(smb_logp, "SMB search dir cm_GetBuffer failed scp %x bufferp %x code %d", - scp, bufferp, code); - break; - } - } - if (code) { - buf_Release(bufferp); - bufferp = NULL; - break; - } - } /* if (wrong buffer) ... */ - - /* now we have the buffer containing the entry we're interested in; copy - * it out if it represents a non-deleted entry. - */ - entryInDir = curOffset.LowPart & (2048-1); - entryInBuffer = curOffset.LowPart & (cm_data.buf_blockSize - 1); - - /* page header will help tell us which entries are free. Page header - * can change more often than once per buffer, since AFS 3 dir page size - * may be less than (but not more than a buffer package buffer. - */ - temp = curOffset.LowPart & (cm_data.buf_blockSize - 1); /* only look intra-buffer */ - temp &= ~(2048 - 1); /* turn off intra-page bits */ - pageHeaderp = (cm_pageHeader_t *) (bufferp->datap + temp); - - /* now determine which entry we're looking at in the page. If it is - * free (there's a free bitmap at the start of the dir), we should - * skip these 32 bytes. - */ - slotInPage = (entryInDir & 0x7e0) >> 5; - if (!(pageHeaderp->freeBitmap[slotInPage>>3] & (1 << (slotInPage & 0x7)))) { - /* this entry is free */ - numDirChunks = 1; /* only skip this guy */ - goto nextEntry; - } - - tp = bufferp->datap + entryInBuffer; - dep = (cm_dirEntry_t *) tp; /* now points to AFS3 dir entry */ - - /* while we're here, compute the next entry's location, too, - * since we'll need it when writing out the cookie into the dir - * listing stream. - * - * XXXX Probably should do more sanity checking. - */ - numDirChunks = cm_NameEntries(dep->name, NULL); - - /* compute the offset of the cookie representing the next entry */ - nextEntryCookie = curOffset.LowPart + (CM_DIR_CHUNKSIZE * numDirChunks); - - /* Compute 8.3 name if necessary */ - actualName = dep->name; - if (dep->fid.vnode != 0 && !cm_Is8Dot3(actualName)) { - cm_Gen8Dot3Name(dep, shortName, &shortNameEnd); - actualName = shortName; - } - - osi_Log3(smb_logp, "SMB search dir vn %d name %s (%s)", - dep->fid.vnode, osi_LogSaveString(smb_logp, dep->name), - osi_LogSaveString(smb_logp, actualName)); - - if (dep->fid.vnode != 0 && smb_Match8Dot3Mask(actualName, mask)) { - /* this is one of the entries to use: it is not deleted - * and it matches the star pattern we're looking for. - */ - - /* Eliminate entries that don't match requested - * attributes */ - - /* no hidden files */ - if (smb_hideDotFiles && !(dsp->attribute & SMB_ATTR_HIDDEN) && smb_IsDotFile(actualName)) { - osi_Log0(smb_logp, "SMB search dir skipping hidden"); - goto nextEntry; - } - - if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ - { - /* We have already done the cm_TryBulkStat above */ - fid.cell = scp->fid.cell; - fid.volume = scp->fid.volume; - fid.vnode = ntohl(dep->fid.vnode); - fid.unique = ntohl(dep->fid.unique); - fileType = cm_FindFileType(&fid); - osi_Log2(smb_logp, "smb_ReceiveCoreSearchDir: file %s " - "has filetype %d", osi_LogSaveString(smb_logp, dep->name), - fileType); - if (fileType == CM_SCACHETYPE_DIRECTORY || - fileType == CM_SCACHETYPE_DFSLINK || - fileType == CM_SCACHETYPE_INVALID) - osi_Log0(smb_logp, "SMB search dir skipping directory or bad link"); - goto nextEntry; - } - - *op++ = resByte; - memcpy(op, mask, 11); op += 11; - *op++ = (char) dsp->cookie; /* they say it must be non-zero */ - *op++ = nextEntryCookie & 0xff; - *op++ = (nextEntryCookie>>8) & 0xff; - *op++ = (nextEntryCookie>>16) & 0xff; - *op++ = (nextEntryCookie>>24) & 0xff; - memcpy(op, &clientCookie, 4); op += 4; - - /* now we emit the attribute. This is sort of tricky, - * since we need to really stat the file to find out - * what type of entry we've got. Right now, we're - * copying out data from a buffer, while holding the - * scp locked, so it isn't really convenient to stat - * something now. We'll put in a place holder now, - * and make a second pass before returning this to get - * the real attributes. So, we just skip the data for - * now, and adjust it later. We allocate a patch - * record to make it easy to find this point later. - * The replay will happen at a time when it is safe to - * unlock the directory. - */ - curPatchp = malloc(sizeof(*curPatchp)); - osi_QAdd((osi_queue_t **) &dirListPatchesp, &curPatchp->q); - curPatchp->dptr = op; - curPatchp->fid.cell = scp->fid.cell; - curPatchp->fid.volume = scp->fid.volume; - curPatchp->fid.vnode = ntohl(dep->fid.vnode); - curPatchp->fid.unique = ntohl(dep->fid.unique); - - /* do hidden attribute here since name won't be around when applying - * dir list patches - */ - - if ( smb_hideDotFiles && smb_IsDotFile(actualName) ) - curPatchp->flags = SMB_DIRLISTPATCH_DOTFILE; - else - curPatchp->flags = 0; - - op += 9; /* skip attr, time, date and size */ - - /* zero out name area. The spec says to pad with - * spaces, but Samba doesn't, and neither do we. - */ - memset(op, 0, 13); - - /* finally, we get to copy out the name; we know that - * it fits in 8.3 or the pattern wouldn't match, but it - * never hurts to be sure. - */ - strncpy(op, actualName, 13); - if (smb_StoreAnsiFilenames) - CharToOem(op, op); - - /* Uppercase if requested by client */ - if (!KNOWS_LONG_NAMES(inp)) - _strupr(op); - - op += 13; - - /* now, adjust the # of entries copied */ - returnedNames++; - } /* if we're including this name */ - - nextEntry: - /* and adjust curOffset to be where the new cookie is */ - thyper.HighPart = 0; - thyper.LowPart = CM_DIR_CHUNKSIZE * numDirChunks; - curOffset = LargeIntegerAdd(thyper, curOffset); - } /* while copying data for dir listing */ - - /* release the mutex */ - lock_ReleaseMutex(&scp->mx); - if (bufferp) buf_Release(bufferp); - - /* apply and free last set of patches; if not doing a star match, this - * will be empty, but better safe (and freeing everything) than sorry. - */ - smb_ApplyDirListPatches(&dirListPatchesp, userp, &req); - - /* special return code for unsuccessful search */ - if (code == 0 && dataLength < 21 && returnedNames == 0) - code = CM_ERROR_NOFILES; - - osi_Log2(smb_logp, "SMB search dir done, %d names, code %d", - returnedNames, code); - - if (code != 0) { - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return code; - } - - /* finalize the output buffer */ - smb_SetSMBParm(outp, 0, returnedNames); - temp = (long) (op - origOp); - smb_SetSMBDataLength(outp, temp); - - /* the data area is a variable block, which has a 5 (already there) - * followed by the length of the # of data bytes. We now know this to - * be "temp," although that includes the 3 bytes of vbl block header. - * Deduct for them and fill in the length field. - */ - temp -= 3; /* deduct vbl block info */ - osi_assert(temp == (43 * returnedNames)); - origOp[1] = temp & 0xff; - origOp[2] = (temp>>8) & 0xff; - if (returnedNames == 0) - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return code; -} - -/* verify that this is a valid path to a directory. I don't know why they - * don't use the get file attributes call. - */ -long smb_ReceiveCoreCheckPath(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp; - long code = 0; - cm_scache_t *rootScp; - cm_scache_t *newScp; - cm_user_t *userp; - unsigned int attrs; - int caseFold; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - pathp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(pathp, NULL); - if (!pathp) - return CM_ERROR_BADFD; - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - osi_Log1(smb_logp, "SMB receive check path %s", - osi_LogSaveString(smb_logp, pathp)); - - rootScp = cm_data.rootSCachep; - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - code = cm_NameI(rootScp, pathp, - caseFold | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, - userp, tidPathp, &req, &newScp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (newScp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* now lock the vnode with a callback; returns with newScp locked */ - lock_ObtainMutex(&newScp->mx); - code = cm_SyncOp(newScp, NULL, userp, &req, PRSFS_LOOKUP, - CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK); - if (code && code != CM_ERROR_NOACCESS) { - lock_ReleaseMutex(&newScp->mx); - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - return code; - } - - attrs = smb_Attributes(newScp); - - if (!(attrs & SMB_ATTR_DIRECTORY)) - code = CM_ERROR_NOTDIR; - - lock_ReleaseMutex(&newScp->mx); - - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - return code; -} - -long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp; - long code = 0; - cm_scache_t *rootScp; - unsigned short attribute; - cm_attr_t attr; - cm_scache_t *newScp; - afs_uint32 dosTime; - cm_user_t *userp; - int caseFold; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - /* decode basic attributes we're passed */ - attribute = smb_GetSMBParm(inp, 0); - dosTime = smb_GetSMBParm(inp, 1) | (smb_GetSMBParm(inp, 2) << 16); - - pathp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(pathp, NULL); - if (!pathp) - return CM_ERROR_BADSMB; - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - osi_Log2(smb_logp, "SMB receive setfile attributes time %d, attr 0x%x", - dosTime, attribute); - - rootScp = cm_data.rootSCachep; - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHFILE; - } - code = cm_NameI(rootScp, pathp, caseFold | CM_FLAG_FOLLOW, userp, - tidPathp, &req, &newScp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (newScp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* now lock the vnode with a callback; returns with newScp locked; we - * need the current status to determine what the new status is, in some - * cases. - */ - lock_ObtainMutex(&newScp->mx); - code = cm_SyncOp(newScp, NULL, userp, &req, 0, - CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK); - if (code) { - lock_ReleaseMutex(&newScp->mx); - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - return code; - } - - /* Check for RO volume */ - if (newScp->flags & CM_SCACHEFLAG_RO) { - lock_ReleaseMutex(&newScp->mx); - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - return CM_ERROR_READONLY; - } - - /* prepare for setattr call */ - attr.mask = 0; - if (dosTime != 0) { - attr.mask |= CM_ATTRMASK_CLIENTMODTIME; - smb_UnixTimeFromDosUTime(&attr.clientModTime, dosTime); - } - if ((newScp->unixModeBits & 0222) && (attribute & 1) != 0) { - /* we're told to make a writable file read-only */ - attr.unixModeBits = newScp->unixModeBits & ~0222; - attr.mask |= CM_ATTRMASK_UNIXMODEBITS; - } - else if ((newScp->unixModeBits & 0222) == 0 && (attribute & 1) == 0) { - /* we're told to make a read-only file writable */ - attr.unixModeBits = newScp->unixModeBits | 0222; - attr.mask |= CM_ATTRMASK_UNIXMODEBITS; - } - lock_ReleaseMutex(&newScp->mx); - - /* now call setattr */ - if (attr.mask) - code = cm_SetAttr(newScp, &attr, userp, &req); - else - code = 0; - - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - - return code; -} - -long smb_ReceiveCoreGetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp; - long code = 0; - cm_scache_t *rootScp; - cm_scache_t *newScp, *dscp; - afs_uint32 dosTime; - int attrs; - cm_user_t *userp; - int caseFold; - char *tidPathp; - cm_space_t *spacep; - char *lastComp; - cm_req_t req; - - cm_InitReq(&req); - - pathp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(pathp, NULL); - if (!pathp) - return CM_ERROR_BADSMB; - - if (*pathp == 0) /* null path */ - pathp = "\\"; - else - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - osi_Log1(smb_logp, "SMB receive getfile attributes path %s", - osi_LogSaveString(smb_logp, pathp)); - - rootScp = cm_data.rootSCachep; - - userp = smb_GetUser(vcp, inp); - - /* we shouldn't need this for V3 requests, but we seem to */ - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHFILE; - } - - /* - * XXX Strange hack XXX - * - * As of Patch 5 (16 July 97), we are having the following problem: - * In NT Explorer 4.0, whenever we click on a directory, AFS gets - * requests to look up "desktop.ini" in all the subdirectories. - * This can cause zillions of timeouts looking up non-existent cells - * and volumes, especially in the top-level directory. - * - * We have not found any way to avoid this or work around it except - * to explicitly ignore the requests for mount points that haven't - * yet been evaluated and for directories that haven't yet been - * fetched. - * - * We should modify this hack to provide a fake desktop.ini file - * http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/custom.asp - */ - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastComp, pathp); -#ifndef SPECIAL_FOLDERS - if (lastComp && stricmp(lastComp, "\\desktop.ini") == 0) { - code = cm_NameI(rootScp, spacep->data, - caseFold | CM_FLAG_DIRSEARCH | CM_FLAG_FOLLOW, - userp, tidPathp, &req, &dscp); - if (code == 0) { -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } else -#endif /* DFS_SUPPORT */ - if (dscp->fileType == CM_SCACHETYPE_MOUNTPOINT && !dscp->mountRootFid.volume) - code = CM_ERROR_NOSUCHFILE; - else if (dscp->fileType == CM_SCACHETYPE_DIRECTORY) { - cm_buf_t *bp = buf_Find(dscp, &hzero); - if (bp) - buf_Release(bp); - else - code = CM_ERROR_NOSUCHFILE; - } - cm_ReleaseSCache(dscp); - if (code) { - cm_ReleaseUser(userp); - return code; - } - } - } -#endif /* SPECIAL_FOLDERS */ - - code = cm_NameI(rootScp, pathp, caseFold | CM_FLAG_FOLLOW, userp, - tidPathp, &req, &newScp); - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (newScp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* now lock the vnode with a callback; returns with newScp locked */ - lock_ObtainMutex(&newScp->mx); - code = cm_SyncOp(newScp, NULL, userp, &req, 0, - CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK); - if (code) { - lock_ReleaseMutex(&newScp->mx); - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - return code; - } - -#ifdef undef - /* use smb_Attributes instead. Also the fact that a file is - * in a readonly volume doesn't mean it shojuld be marked as RO - */ - if (newScp->fileType == CM_SCACHETYPE_DIRECTORY || - newScp->fileType == CM_SCACHETYPE_MOUNTPOINT) - attrs = SMB_ATTR_DIRECTORY; - else - attrs = 0; - if ((newScp->unixModeBits & 0222) == 0 || (newScp->flags & CM_SCACHEFLAG_RO)) - attrs |= SMB_ATTR_READONLY; /* turn on read-only flag */ -#else - attrs = smb_Attributes(newScp); -#endif - - smb_SetSMBParm(outp, 0, attrs); - - smb_DosUTimeFromUnixTime(&dosTime, newScp->clientModTime); - smb_SetSMBParm(outp, 1, (unsigned int)(dosTime & 0xffff)); - smb_SetSMBParm(outp, 2, (unsigned int)((dosTime>>16) & 0xffff)); - smb_SetSMBParm(outp, 3, newScp->length.LowPart & 0xffff); - smb_SetSMBParm(outp, 4, (newScp->length.LowPart >> 16) & 0xffff); - smb_SetSMBParm(outp, 5, 0); - smb_SetSMBParm(outp, 6, 0); - smb_SetSMBParm(outp, 7, 0); - smb_SetSMBParm(outp, 8, 0); - smb_SetSMBParm(outp, 9, 0); - smb_SetSMBDataLength(outp, 0); - lock_ReleaseMutex(&newScp->mx); - - cm_ReleaseSCache(newScp); - cm_ReleaseUser(userp); - - return 0; -} - -long smb_ReceiveCoreTreeDisconnect(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_tid_t *tidp; - - osi_Log0(smb_logp, "SMB receive tree disconnect"); - - /* find the tree and free it */ - tidp = smb_FindTID(vcp, ((smb_t *)inp)->tid, 0); - if (tidp) { - lock_ObtainMutex(&tidp->mx); - tidp->flags |= SMB_TIDFLAG_DELETE; - lock_ReleaseMutex(&tidp->mx); - smb_ReleaseTID(tidp); - } - - return 0; -} - -long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_fid_t *fidp; - char *pathp; - char *lastNamep; - int share; - int attribute; - long code = 0; - cm_user_t *userp; - cm_scache_t *scp; - afs_uint32 dosTime; - int caseFold; - cm_space_t *spacep; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - pathp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(pathp, NULL); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - osi_Log1(smb_logp, "SMB receive open file [%s]", osi_LogSaveString(smb_logp, pathp)); - -#ifdef DEBUG_VERBOSE - { - char *hexpath; - - hexpath = osi_HexifyString( pathp ); - DEBUG_EVENT2("AFS", "CoreOpen H[%s] A[%s]", hexpath, pathp); - free(hexpath); - } -#endif - - share = smb_GetSMBParm(inp, 0); - attribute = smb_GetSMBParm(inp, 1); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - if (lastNamep && strcmp(lastNamep, SMB_IOCTL_FILENAME) == 0) { - /* special case magic file name for receiving IOCTL requests - * (since IOCTL calls themselves aren't getting through). - */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - smb_SetupIoctlFid(fidp, spacep); - smb_SetSMBParm(outp, 0, fidp->fid); - smb_SetSMBParm(outp, 1, 0); /* attrs */ - smb_SetSMBParm(outp, 2, 0); /* next 2 are DOS time */ - smb_SetSMBParm(outp, 3, 0); - smb_SetSMBParm(outp, 4, 0); /* next 2 are length */ - smb_SetSMBParm(outp, 5, 0x7fff); - /* pass the open mode back */ - smb_SetSMBParm(outp, 6, (share & 0xf)); - smb_SetSMBDataLength(outp, 0); - smb_ReleaseFID(fidp); - return 0; - } - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - code = cm_NameI(cm_data.rootSCachep, pathp, caseFold | CM_FLAG_FOLLOW, userp, - tidPathp, &req, &scp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - code = cm_CheckOpen(scp, share & 0x7, 0, userp, &req); - if (code) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return code; - } - - /* don't need callback to check file type, since file types never - * change, and namei and cm_Lookup all stat the object at least once on - * a successful return. - */ - if (scp->fileType != CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return CM_ERROR_ISDIR; - } - - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); - - /* save a pointer to the vnode */ - fidp->scp = scp; - - if ((share & 0xf) == 0) - fidp->flags |= SMB_FID_OPENREAD; - else if ((share & 0xf) == 1) - fidp->flags |= SMB_FID_OPENWRITE; - else - fidp->flags |= (SMB_FID_OPENREAD | SMB_FID_OPENWRITE); - - lock_ObtainMutex(&scp->mx); - smb_SetSMBParm(outp, 0, fidp->fid); - smb_SetSMBParm(outp, 1, smb_Attributes(scp)); - smb_DosUTimeFromUnixTime(&dosTime, scp->clientModTime); - smb_SetSMBParm(outp, 2, (unsigned int)(dosTime & 0xffff)); - smb_SetSMBParm(outp, 3, (unsigned int)((dosTime >> 16) & 0xffff)); - smb_SetSMBParm(outp, 4, scp->length.LowPart & 0xffff); - smb_SetSMBParm(outp, 5, (scp->length.LowPart >> 16) & 0xffff); - /* pass the open mode back; XXXX add access checks */ - smb_SetSMBParm(outp, 6, (share & 0xf)); - smb_SetSMBDataLength(outp, 0); - lock_ReleaseMutex(&scp->mx); - - /* notify open */ - cm_Open(scp, 0, userp); - - /* send and free packet */ - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); - /* don't release scp, since we've squirreled away the pointer in the fid struct */ - return 0; -} - -typedef struct smb_unlinkRock { - cm_scache_t *dscp; - cm_user_t *userp; - cm_req_t *reqp; - smb_vc_t *vcp; - char *maskp; /* pointer to the star pattern */ - int flags; - int any; -} smb_unlinkRock_t; - -int smb_UnlinkProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp) -{ - long code = 0; - smb_unlinkRock_t *rockp; - int caseFold; - int match; - char shortName[13]; - char *matchName; - - rockp = vrockp; - - caseFold = ((rockp->flags & SMB_MASKFLAG_CASEFOLD)? CM_FLAG_CASEFOLD : 0); - if (!(rockp->vcp->flags & SMB_VCFLAG_USEV3)) - caseFold |= CM_FLAG_8DOT3; - - matchName = dep->name; - match = smb_V3MatchMask(matchName, rockp->maskp, caseFold); - if (!match && - (rockp->flags & SMB_MASKFLAG_TILDE) && - !cm_Is8Dot3(dep->name)) { - cm_Gen8Dot3Name(dep, shortName, NULL); - matchName = shortName; - /* 8.3 matches are always case insensitive */ - match = smb_V3MatchMask(matchName, rockp->maskp, caseFold | CM_FLAG_CASEFOLD); - } - if (match) { - osi_Log1(smb_logp, "Unlinking %s", - osi_LogSaveString(smb_logp, matchName)); - code = cm_Unlink(dscp, dep->name, rockp->userp, rockp->reqp); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, dep->name, NULL, TRUE); - if (code == 0) { - rockp->any = 1; - - /* If we made a case sensitive exact match, we might as well quit now. */ - if (!(rockp->flags & SMB_MASKFLAG_CASEFOLD) && !strcmp(matchName, rockp->maskp)) - code = CM_ERROR_STOPNOW; - } - } - else code = 0; - - return code; -} - -long smb_ReceiveCoreUnlink(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - int attribute; - long code = 0; - char *pathp; - char *tp; - cm_space_t *spacep; - cm_scache_t *dscp; - char *lastNamep; - smb_unlinkRock_t rock; - cm_user_t *userp; - osi_hyper_t thyper; - int caseFold; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - attribute = smb_GetSMBParm(inp, 0); - - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - osi_Log1(smb_logp, "SMB receive unlink %s", - osi_LogSaveString(smb_logp, pathp)); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold, userp, tidPathp, - &req, &dscp); - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* otherwise, scp points to the parent directory. */ - if (!lastNamep) - lastNamep = pathp; - else - lastNamep++; - - rock.any = 0; - rock.maskp = smb_FindMask(pathp); - rock.flags = ((strchr(rock.maskp, '~') != NULL) ? SMB_MASKFLAG_TILDE : 0); - - thyper.LowPart = 0; - thyper.HighPart = 0; - rock.userp = userp; - rock.reqp = &req; - rock.dscp = dscp; - rock.vcp = vcp; - - /* Now, if we aren't dealing with a wildcard match, we first try an exact - * match. If that fails, we do a case insensitve match. - */ - if (!(rock.flags & SMB_MASKFLAG_TILDE) && - !smb_IsStarMask(rock.maskp)) { - code = cm_ApplyDir(dscp, smb_UnlinkProc, &rock, &thyper, userp, &req, NULL); - if (!rock.any) { - thyper.LowPart = 0; - thyper.HighPart = 0; - rock.flags |= SMB_MASKFLAG_CASEFOLD; - } - } - - if (!rock.any) - code = cm_ApplyDir(dscp, smb_UnlinkProc, &rock, &thyper, userp, &req, NULL); - - if (code == CM_ERROR_STOPNOW) - code = 0; - - cm_ReleaseUser(userp); - - cm_ReleaseSCache(dscp); - - if (code == 0 && !rock.any) - code = CM_ERROR_NOSUCHFILE; - return code; -} - -typedef struct smb_renameRock { - cm_scache_t *odscp; /* old dir */ - cm_scache_t *ndscp; /* new dir */ - cm_user_t *userp; /* user */ - cm_req_t *reqp; /* request struct */ - smb_vc_t *vcp; /* virtual circuit */ - char *maskp; /* pointer to star pattern of old file name */ - int flags; /* tilde, casefold, etc */ - char *newNamep; /* ptr to the new file's name */ -} smb_renameRock_t; - -int smb_RenameProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp) -{ - long code = 0; - smb_renameRock_t *rockp; - int caseFold; - int match; - char shortName[13]; - - rockp = (smb_renameRock_t *) vrockp; - - caseFold = ((rockp->flags & SMB_MASKFLAG_CASEFOLD)? CM_FLAG_CASEFOLD : 0); - if (!(rockp->vcp->flags & SMB_VCFLAG_USEV3)) - caseFold |= CM_FLAG_8DOT3; - - match = smb_V3MatchMask(dep->name, rockp->maskp, caseFold); - if (!match && - (rockp->flags & SMB_MASKFLAG_TILDE) && - !cm_Is8Dot3(dep->name)) { - cm_Gen8Dot3Name(dep, shortName, NULL); - match = smb_V3MatchMask(shortName, rockp->maskp, caseFold); - } - if (match) { - code = cm_Rename(rockp->odscp, dep->name, - rockp->ndscp, rockp->newNamep, rockp->userp, - rockp->reqp); - /* if the call worked, stop doing the search now, since we - * really only want to rename one file. - */ - if (code == 0) - code = CM_ERROR_STOPNOW; - } - else code = 0; - - return code; -} - - -long -smb_Rename(smb_vc_t *vcp, smb_packet_t *inp, char * oldPathp, char * newPathp, int attrs) -{ - long code = 0; - cm_space_t *spacep = NULL; - smb_renameRock_t rock; - cm_scache_t *oldDscp = NULL; - cm_scache_t *newDscp = NULL; - cm_scache_t *tmpscp= NULL; - cm_scache_t *tmpscp2 = NULL; - char *oldLastNamep; - char *newLastNamep; - osi_hyper_t thyper; - cm_user_t *userp; - int caseFold; - char *tidPathp; - DWORD filter; - cm_req_t req; - - userp = smb_GetUser(vcp, inp); - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - - cm_InitReq(&req); - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &oldLastNamep, oldPathp); - - /* - * Changed to use CASEFOLD always. This enables us to rename Foo/baz when - * what actually exists is foo/baz. I don't know why the code used to be - * the way it was. 1/29/96 - * - * caseFold = ((vcp->flags & SMB_VCFLAG_USEV3) ? 0: CM_FLAG_CASEFOLD); - * - * Changed to use CM_FLAG_FOLLOW. 7/24/96 - * - * caseFold = CM_FLAG_CASEFOLD; - */ - caseFold = CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD; - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold, - userp, tidPathp, &req, &oldDscp); - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (oldDscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - smb_StripLastComponent(spacep->data, &newLastNamep, newPathp); - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold, - userp, tidPathp, &req, &newDscp); - - if (code) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (newDscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseSCache(newDscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - - /* otherwise, oldDscp and newDscp point to the corresponding directories. - * next, get the component names, and lower case them. - */ - - /* handle the old name first */ - if (!oldLastNamep) - oldLastNamep = oldPathp; - else - oldLastNamep++; - - /* and handle the new name, too */ - if (!newLastNamep) - newLastNamep = newPathp; - else - newLastNamep++; - - /* TODO: The old name could be a wildcard. The new name must not be */ - - /* do the vnode call */ - rock.odscp = oldDscp; - rock.ndscp = newDscp; - rock.userp = userp; - rock.reqp = &req; - rock.vcp = vcp; - rock.maskp = oldLastNamep; - rock.flags = ((strchr(oldLastNamep, '~') != NULL) ? SMB_MASKFLAG_TILDE : 0); - rock.newNamep = newLastNamep; - - /* Check if the file already exists; if so return error */ - code = cm_Lookup(newDscp,newLastNamep,CM_FLAG_CHECKPATH,userp,&req,&tmpscp); - if ((code != CM_ERROR_NOSUCHFILE) && (code != CM_ERROR_NOSUCHPATH) && (code != CM_ERROR_NOSUCHVOLUME) ) { - osi_Log2(smb_logp, " lookup returns %ld for [%s]", code, - osi_LogSaveString(afsd_logp, newLastNamep)); - - /* Check if the old and the new names differ only in case. If so return - * success, else return CM_ERROR_EXISTS - */ - if (!code && oldDscp == newDscp && !stricmp(oldLastNamep, newLastNamep)) { - - /* This would be a success only if the old file is *as same as* the new file */ - code = cm_Lookup(oldDscp, oldLastNamep, CM_FLAG_CHECKPATH, userp, &req, &tmpscp2); - if (!code) { - if (tmpscp == tmpscp2) - code = 0; - else - code = CM_ERROR_EXISTS; - cm_ReleaseSCache(tmpscp2); - tmpscp2 = NULL; - } else { - code = CM_ERROR_NOSUCHFILE; - } - } else { - /* file exist, do not rename, also fixes move */ - osi_Log0(smb_logp, "Can't rename. Target already exists"); - code = CM_ERROR_EXISTS; - } - - if (tmpscp != NULL) - cm_ReleaseSCache(tmpscp); - cm_ReleaseSCache(newDscp); - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - return code; - } - - /* Now search the directory for the pattern, and do the appropriate rename when found */ - thyper.LowPart = 0; /* search dir from here */ - thyper.HighPart = 0; - - code = cm_ApplyDir(oldDscp, smb_RenameProc, &rock, &thyper, userp, &req, NULL); - - if (code == CM_ERROR_STOPNOW) - code = 0; - else if (code == 0) - code = CM_ERROR_NOSUCHFILE; - - /* Handle Change Notification */ - /* - * Being lazy, not distinguishing between files and dirs in this - * filter, since we'd have to do a lookup. - */ - filter = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME; - if (oldDscp == newDscp) { - if (oldDscp->flags & CM_SCACHEFLAG_ANYWATCH) - smb_NotifyChange(FILE_ACTION_RENAMED_OLD_NAME, - filter, oldDscp, oldLastNamep, - newLastNamep, TRUE); - } else { - if (oldDscp->flags & CM_SCACHEFLAG_ANYWATCH) - smb_NotifyChange(FILE_ACTION_RENAMED_OLD_NAME, - filter, oldDscp, oldLastNamep, - NULL, TRUE); - if (newDscp->flags & CM_SCACHEFLAG_ANYWATCH) - smb_NotifyChange(FILE_ACTION_RENAMED_NEW_NAME, - filter, newDscp, newLastNamep, - NULL, TRUE); - } - - if (tmpscp != NULL) - cm_ReleaseSCache(tmpscp); - cm_ReleaseUser(userp); - cm_ReleaseSCache(oldDscp); - cm_ReleaseSCache(newDscp); - return code; -} - -long -smb_Link(smb_vc_t *vcp, smb_packet_t *inp, char * oldPathp, char * newPathp) -{ - long code = 0; - cm_space_t *spacep = NULL; - cm_scache_t *oldDscp = NULL; - cm_scache_t *newDscp = NULL; - cm_scache_t *tmpscp= NULL; - cm_scache_t *tmpscp2 = NULL; - cm_scache_t *sscp = NULL; - char *oldLastNamep; - char *newLastNamep; - cm_user_t *userp; - int caseFold; - char *tidPathp; - DWORD filter; - cm_req_t req; - - userp = smb_GetUser(vcp, inp); - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - - cm_InitReq(&req); - - caseFold = CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD; - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &oldLastNamep, oldPathp); - - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold, - userp, tidPathp, &req, &oldDscp); - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (oldDscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - smb_StripLastComponent(spacep->data, &newLastNamep, newPathp); - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold, - userp, tidPathp, &req, &newDscp); - if (code) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (newDscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(newDscp); - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* Now, although we did two lookups for the two directories (because the same - * directory can be referenced through different paths), we only allow hard links - * within the same directory. */ - if (oldDscp != newDscp) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseSCache(newDscp); - cm_ReleaseUser(userp); - return CM_ERROR_CROSSDEVLINK; - } - - /* handle the old name first */ - if (!oldLastNamep) - oldLastNamep = oldPathp; - else - oldLastNamep++; - - /* and handle the new name, too */ - if (!newLastNamep) - newLastNamep = newPathp; - else - newLastNamep++; - - /* now lookup the old name */ - osi_Log1(smb_logp," looking up [%s]", osi_LogSaveString(smb_logp,oldLastNamep)); - code = cm_Lookup(oldDscp, oldLastNamep, CM_FLAG_CHECKPATH | CM_FLAG_CASEFOLD, userp, &req, &sscp); - if (code) { - cm_ReleaseSCache(oldDscp); - cm_ReleaseSCache(newDscp); - cm_ReleaseUser(userp); - return code; - } - - /* Check if the file already exists; if so return error */ - code = cm_Lookup(newDscp,newLastNamep,CM_FLAG_CHECKPATH,userp,&req,&tmpscp); - if ((code != CM_ERROR_NOSUCHFILE) && (code != CM_ERROR_NOSUCHPATH) && (code != CM_ERROR_NOSUCHVOLUME) ) { - osi_Log2(smb_logp, " lookup returns %ld for [%s]", code, - osi_LogSaveString(afsd_logp, newLastNamep)); - - /* if the existing link is to the same file, then we return success */ - if (!code) { - if(sscp == tmpscp) { - code = 0; - } else { - osi_Log0(smb_logp, "Can't create hardlink. Target already exists"); - code = CM_ERROR_EXISTS; - } - } - - if (tmpscp != NULL) - cm_ReleaseSCache(tmpscp); - cm_ReleaseSCache(sscp); - cm_ReleaseSCache(newDscp); - cm_ReleaseSCache(oldDscp); - cm_ReleaseUser(userp); - return code; - } - - /* now create the hardlink */ - osi_Log1(smb_logp," Attempting to create new link [%s]", osi_LogSaveString(smb_logp, newLastNamep)); - code = cm_Link(newDscp, newLastNamep, sscp, 0, userp, &req); - osi_Log1(smb_logp," Link returns %d", code); - - /* Handle Change Notification */ - if (code == 0) { - filter = (sscp->fileType == CM_SCACHETYPE_FILE)? FILE_NOTIFY_CHANGE_FILE_NAME : FILE_NOTIFY_CHANGE_DIR_NAME; - if (newDscp->flags & CM_SCACHEFLAG_ANYWATCH) - smb_NotifyChange(FILE_ACTION_ADDED, - filter, newDscp, newLastNamep, - NULL, TRUE); - } - - if (tmpscp != NULL) - cm_ReleaseSCache(tmpscp); - cm_ReleaseUser(userp); - cm_ReleaseSCache(sscp); - cm_ReleaseSCache(oldDscp); - cm_ReleaseSCache(newDscp); - return code; -} - -long -smb_ReceiveCoreRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *oldPathp; - char *newPathp; - char *tp; - - tp = smb_GetSMBData(inp, NULL); - oldPathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(oldPathp,oldPathp); - newPathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(newPathp,newPathp); - - osi_Log2(smb_logp, "smb rename [%s] to [%s]", - osi_LogSaveString(smb_logp, oldPathp), - osi_LogSaveString(smb_logp, newPathp)); - - return smb_Rename(vcp,inp,oldPathp,newPathp,0); -} - - - -typedef struct smb_rmdirRock { - cm_scache_t *dscp; - cm_user_t *userp; - cm_req_t *reqp; - char *maskp; /* pointer to the star pattern */ - int flags; - int any; -} smb_rmdirRock_t; - -int smb_RmdirProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp) -{ - long code = 0; - smb_rmdirRock_t *rockp; - int match; - char shortName[13]; - char *matchName; - - rockp = (smb_rmdirRock_t *) vrockp; - - matchName = dep->name; - if (rockp->flags & SMB_MASKFLAG_CASEFOLD) - match = (cm_stricmp(matchName, rockp->maskp) == 0); - else - match = (strcmp(matchName, rockp->maskp) == 0); - if (!match && - (rockp->flags & SMB_MASKFLAG_TILDE) && - !cm_Is8Dot3(dep->name)) { - cm_Gen8Dot3Name(dep, shortName, NULL); - matchName = shortName; - match = (cm_stricmp(matchName, rockp->maskp) == 0); - } - if (match) { - osi_Log1(smb_logp, "Removing directory %s", - osi_LogSaveString(smb_logp, matchName)); - code = cm_RemoveDir(dscp, dep->name, rockp->userp, rockp->reqp); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, dep->name, NULL, TRUE); - if (code == 0) - rockp->any = 1; - } - else code = 0; - - return code; -} - -long smb_ReceiveCoreRemoveDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - long code = 0; - char *pathp; - char *tp; - cm_space_t *spacep; - cm_scache_t *dscp; - char *lastNamep; - smb_rmdirRock_t rock; - cm_user_t *userp; - osi_hyper_t thyper; - int caseFold; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold | CM_FLAG_FOLLOW, - userp, tidPathp, &req, &dscp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* otherwise, scp points to the parent directory. */ - if (!lastNamep) - lastNamep = pathp; - else - lastNamep++; - - rock.any = 0; - rock.maskp = lastNamep; - rock.flags = ((strchr(rock.maskp, '~') != NULL) ? SMB_MASKFLAG_TILDE : 0); - - thyper.LowPart = 0; - thyper.HighPart = 0; - rock.userp = userp; - rock.reqp = &req; - rock.dscp = dscp; - /* First do a case sensitive match, and if that fails, do a case insensitive match */ - code = cm_ApplyDir(dscp, smb_RmdirProc, &rock, &thyper, userp, &req, NULL); - if (code == 0 && !rock.any) { - thyper.LowPart = 0; - thyper.HighPart = 0; - rock.flags |= SMB_MASKFLAG_CASEFOLD; - code = cm_ApplyDir(dscp, smb_RmdirProc, &rock, &thyper, userp, &req, NULL); - } - - cm_ReleaseUser(userp); - - cm_ReleaseSCache(dscp); - - if (code == 0 && !rock.any) - code = CM_ERROR_NOSUCHFILE; - return code; -} - -long smb_ReceiveCoreFlush(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned short fid; - smb_fid_t *fidp; - cm_user_t *userp; - long code = 0; - cm_req_t req; - - cm_InitReq(&req); - - fid = smb_GetSMBParm(inp, 0); - - osi_Log1(smb_logp, "SMB flush fid %d", fid); - - fid = smb_ChainFID(fid, inp); - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp || (fidp->flags & SMB_FID_IOCTL)) { - if (fidp) - smb_ReleaseFID(fidp); - return CM_ERROR_BADFD; - } - - userp = smb_GetUser(vcp, inp); - - lock_ObtainMutex(&fidp->mx); - if (fidp->flags & SMB_FID_OPENWRITE) - code = cm_FSync(fidp->scp, userp, &req); - else - code = 0; - lock_ReleaseMutex(&fidp->mx); - - smb_ReleaseFID(fidp); - - cm_ReleaseUser(userp); - - return code; -} - -struct smb_FullNameRock { - char *name; - cm_scache_t *vnode; - char *fullName; -}; - -int smb_FullNameProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *rockp, - osi_hyper_t *offp) -{ - char shortName[13]; - struct smb_FullNameRock *vrockp; - - vrockp = (struct smb_FullNameRock *)rockp; - - if (!cm_Is8Dot3(dep->name)) { - cm_Gen8Dot3Name(dep, shortName, NULL); - - if (cm_stricmp(shortName, vrockp->name) == 0) { - vrockp->fullName = strdup(dep->name); - return CM_ERROR_STOPNOW; - } - } - if (cm_stricmp(dep->name, vrockp->name) == 0 && - ntohl(dep->fid.vnode) == vrockp->vnode->fid.vnode && - ntohl(dep->fid.unique) == vrockp->vnode->fid.unique) { - vrockp->fullName = strdup(dep->name); - return CM_ERROR_STOPNOW; - } - return 0; -} - -void smb_FullName(cm_scache_t *dscp, cm_scache_t *scp, char *pathp, - char **newPathp, cm_user_t *userp, cm_req_t *reqp) -{ - struct smb_FullNameRock rock; - long code = 0; - - rock.name = pathp; - rock.vnode = scp; - - code = cm_ApplyDir(dscp, smb_FullNameProc, &rock, NULL, userp, reqp, NULL); - if (code == CM_ERROR_STOPNOW) - *newPathp = rock.fullName; - else - *newPathp = strdup(pathp); -} - -long smb_ReceiveCoreClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned short fid; - smb_fid_t *fidp; - cm_user_t *userp; - afs_uint32 dosTime; - long code = 0; - cm_req_t req; - - cm_InitReq(&req); - - fid = smb_GetSMBParm(inp, 0); - dosTime = smb_GetSMBParm(inp, 1) | (smb_GetSMBParm(inp, 2) << 16); - - osi_Log1(smb_logp, "SMB close fid %d", fid); - - fid = smb_ChainFID(fid, inp); - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp) { - return CM_ERROR_BADFD; - } - - userp = smb_GetUser(vcp, inp); - - lock_ObtainMutex(&fidp->mx); - - /* Don't jump the gun on an async raw write */ - while (fidp->raw_writers) { - lock_ReleaseMutex(&fidp->mx); - thrd_WaitForSingleObject_Event(fidp->raw_write_event, RAWTIMEOUT); - lock_ObtainMutex(&fidp->mx); - } - - fidp->flags |= SMB_FID_DELETE; - - /* watch for ioctl closes, and read-only opens */ - if (fidp->scp != NULL && - (fidp->flags & (SMB_FID_OPENWRITE | SMB_FID_DELONCLOSE)) - == SMB_FID_OPENWRITE) { - if (dosTime != 0 && dosTime != -1) { - fidp->scp->mask |= CM_SCACHEMASK_CLIENTMODTIME; - /* This fixes defect 10958 */ - CompensateForSmbClientLastWriteTimeBugs(&dosTime); - smb_UnixTimeFromDosUTime(&fidp->scp->clientModTime, dosTime); - } - code = cm_FSync(fidp->scp, userp, &req); - } - else - code = 0; - - if (fidp->flags & SMB_FID_DELONCLOSE) { - cm_scache_t *dscp = fidp->NTopen_dscp; - char *pathp = fidp->NTopen_pathp; - char *fullPathp; - - smb_FullName(dscp, fidp->scp, pathp, &fullPathp, userp, &req); - if (fidp->scp->fileType == CM_SCACHETYPE_DIRECTORY) { - code = cm_RemoveDir(dscp, fullPathp, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, fullPathp, NULL, TRUE); - } - else - { - code = cm_Unlink(dscp, fullPathp, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, fullPathp, NULL, TRUE); - } - free(fullPathp); - } - lock_ReleaseMutex(&fidp->mx); - - if (fidp->flags & SMB_FID_NTOPEN) { - cm_ReleaseSCache(fidp->NTopen_dscp); - free(fidp->NTopen_pathp); - } - if (fidp->NTopen_wholepathp) - free(fidp->NTopen_wholepathp); - - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); - return code; -} - -/* - * smb_ReadData -- common code for Read, Read And X, and Raw Read - */ -#ifndef DJGPP -long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op, - cm_user_t *userp, long *readp) -#else /* DJGPP */ -long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op, - cm_user_t *userp, long *readp, int dosflag) -#endif /* !DJGPP */ -{ - osi_hyper_t offset; - long code = 0; - cm_scache_t *scp; - cm_buf_t *bufferp; - osi_hyper_t fileLength; - osi_hyper_t thyper; - osi_hyper_t lastByte; - osi_hyper_t bufferOffset; - long bufIndex, nbytes; - int chunk; - int sequential = 0; - cm_req_t req; - - cm_InitReq(&req); - - bufferp = NULL; - offset = *offsetp; - - lock_ObtainMutex(&fidp->mx); - scp = fidp->scp; - lock_ObtainMutex(&scp->mx); - - if (offset.HighPart == 0) { - chunk = offset.LowPart >> cm_logChunkSize; - if (chunk != fidp->curr_chunk) { - fidp->prev_chunk = fidp->curr_chunk; - fidp->curr_chunk = chunk; - } - if (fidp->curr_chunk == fidp->prev_chunk + 1) - sequential = 1; - } - - /* start by looking up the file's end */ - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) goto done; - - /* now we have the entry locked, look up the length */ - fileLength = scp->length; - - /* adjust count down so that it won't go past EOF */ - thyper.LowPart = count; - thyper.HighPart = 0; - thyper = LargeIntegerAdd(offset, thyper); /* where read should end */ - lastByte = thyper; - if (LargeIntegerGreaterThan(thyper, fileLength)) { - /* we'd read past EOF, so just stop at fileLength bytes. - * Start by computing how many bytes remain in the file. - */ - thyper = LargeIntegerSubtract(fileLength, offset); - - /* if we are past EOF, read 0 bytes */ - if (LargeIntegerLessThanZero(thyper)) - count = 0; - else - count = thyper.LowPart; - } - - *readp = count; - - /* now, copy the data one buffer at a time, - * until we've filled the request packet - */ - while (1) { - /* if we've copied all the data requested, we're done */ - if (count <= 0) break; - - /* otherwise, load up a buffer of data */ - thyper.HighPart = offset.HighPart; - thyper.LowPart = offset.LowPart & ~(cm_data.buf_blockSize-1); - if (!bufferp || !LargeIntegerEqualTo(thyper, bufferOffset)) { - /* wrong buffer */ - if (bufferp) { - buf_Release(bufferp); - bufferp = NULL; - } - lock_ReleaseMutex(&scp->mx); - - lock_ObtainRead(&scp->bufCreateLock); - code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); - - lock_ObtainMutex(&scp->mx); - if (code) goto done; - bufferOffset = thyper; - - /* now get the data in the cache */ - while (1) { - code = cm_SyncOp(scp, bufferp, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | - CM_SCACHESYNC_READ); - if (code) goto done; - - if (cm_HaveBuffer(scp, bufferp, 0)) break; - - /* otherwise, load the buffer and try again */ - code = cm_GetBuffer(scp, bufferp, NULL, userp, &req); - if (code) break; - } - if (code) { - buf_Release(bufferp); - bufferp = NULL; - goto done; - } - } /* if (wrong buffer) ... */ - - /* now we have the right buffer loaded. Copy out the - * data from here to the user's buffer. - */ - bufIndex = offset.LowPart & (cm_data.buf_blockSize - 1); - - /* and figure out how many bytes we want from this buffer */ - nbytes = cm_data.buf_blockSize - bufIndex; /* what remains in buffer */ - if (nbytes > count) nbytes = count; /* don't go past EOF */ - - /* now copy the data */ -#ifdef DJGPP - if (dosflag) - dosmemput(bufferp->datap + bufIndex, nbytes, (dos_ptr)op); - else -#endif /* DJGPP */ - memcpy(op, bufferp->datap + bufIndex, nbytes); - - /* adjust counters, pointers, etc. */ - op += nbytes; - count -= nbytes; - thyper.LowPart = nbytes; - thyper.HighPart = 0; - offset = LargeIntegerAdd(thyper, offset); - } /* while 1 */ - - done: - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&fidp->mx); - if (bufferp) - buf_Release(bufferp); - - if (code == 0 && sequential) - cm_ConsiderPrefetch(scp, &lastByte, userp, &req); - - return code; -} - -/* - * smb_WriteData -- common code for Write and Raw Write - */ -#ifndef DJGPP -long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op, - cm_user_t *userp, long *writtenp) -#else /* DJGPP */ -long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op, - cm_user_t *userp, long *writtenp, int dosflag) -#endif /* !DJGPP */ -{ - osi_hyper_t offset; - long code = 0; - long written = 0; - cm_scache_t *scp; - osi_hyper_t fileLength; /* file's length at start of write */ - osi_hyper_t minLength; /* don't read past this */ - long nbytes; /* # of bytes to transfer this iteration */ - cm_buf_t *bufferp; - osi_hyper_t thyper; /* hyper tmp variable */ - osi_hyper_t bufferOffset; - long bufIndex; /* index in buffer where our data is */ - int doWriteBack; - osi_hyper_t writeBackOffset;/* offset of region to write back when - * I/O is done */ - DWORD filter = 0; - cm_req_t req; - - osi_Log3(smb_logp, "smb_WriteData fid %d, off 0x%x, size 0x%x", - fidp->fid, offsetp->LowPart, count); - - *writtenp = 0; - - cm_InitReq(&req); - - bufferp = NULL; - doWriteBack = 0; - offset = *offsetp; - - lock_ObtainMutex(&fidp->mx); - scp = fidp->scp; - lock_ObtainMutex(&scp->mx); - - /* start by looking up the file's end */ - osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|SETSTATUS|GETSTATUS", - fidp->fid); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_SETSTATUS - | CM_SCACHESYNC_GETSTATUS); - osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|SETSTATUS|GETSTATUS returns %d", - fidp->fid,code); - if (code) - goto done; - - /* make sure we have a writable FD */ - if (!(fidp->flags & SMB_FID_OPENWRITE)) { - code = CM_ERROR_BADFDOP; - goto done; - } - - /* now we have the entry locked, look up the length */ - fileLength = scp->length; - minLength = fileLength; - if (LargeIntegerGreaterThan(minLength, scp->serverLength)) - minLength = scp->serverLength; - - /* adjust file length if we extend past EOF */ - thyper.LowPart = count; - thyper.HighPart = 0; - thyper = LargeIntegerAdd(offset, thyper); /* where write should end */ - if (LargeIntegerGreaterThan(thyper, fileLength)) { - /* we'd write past EOF, so extend the file */ - scp->mask |= CM_SCACHEMASK_LENGTH; - scp->length = thyper; - filter |= (FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SIZE); - } else - filter |= FILE_NOTIFY_CHANGE_LAST_WRITE; - - /* now, if the new position (thyper) and the old (offset) are in - * different storeback windows, remember to store back the previous - * storeback window when we're done with the write. - */ - if ((thyper.LowPart & (-cm_chunkSize)) != - (offset.LowPart & (-cm_chunkSize))) { - /* they're different */ - doWriteBack = 1; - writeBackOffset.HighPart = offset.HighPart; - writeBackOffset.LowPart = offset.LowPart & (-cm_chunkSize); - } - - *writtenp = count; - - /* now, copy the data one buffer at a time, until we've filled the - * request packet */ - while (1) { - /* if we've copied all the data requested, we're done */ - if (count <= 0) - break; - - /* handle over quota or out of space */ - if (scp->flags & (CM_SCACHEFLAG_OVERQUOTA | CM_SCACHEFLAG_OUTOFSPACE)) { - *writtenp = written; - code = CM_ERROR_QUOTA; - break; - } - - /* otherwise, load up a buffer of data */ - thyper.HighPart = offset.HighPart; - thyper.LowPart = offset.LowPart & ~(cm_data.buf_blockSize-1); - if (!bufferp || !LargeIntegerEqualTo(thyper, bufferOffset)) { - /* wrong buffer */ - if (bufferp) { - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - bufferp = NULL; - } - lock_ReleaseMutex(&scp->mx); - - lock_ObtainRead(&scp->bufCreateLock); - code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); - - lock_ObtainMutex(&bufferp->mx); - lock_ObtainMutex(&scp->mx); - if (code) goto done; - - bufferOffset = thyper; - - /* now get the data in the cache */ - while (1) { - osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|WRITE|BUFLOCKED", - fidp->fid); - code = cm_SyncOp(scp, bufferp, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_WRITE - | CM_SCACHESYNC_BUFLOCKED); - osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|WRITE|BUFLOCKED returns %d", - fidp->fid,code); - if (code) - goto done; - - /* If we're overwriting the entire buffer, or - * if we're writing at or past EOF, mark the - * buffer as current so we don't call - * cm_GetBuffer. This skips the fetch from the - * server in those cases where we're going to - * obliterate all the data in the buffer anyway, - * or in those cases where there is no useful - * data at the server to start with. - * - * Use minLength instead of scp->length, since - * the latter has already been updated by this - * call. - */ - if (LargeIntegerGreaterThanOrEqualTo(bufferp->offset, minLength) - || LargeIntegerEqualTo(offset, bufferp->offset) - && (count >= cm_data.buf_blockSize - || LargeIntegerGreaterThanOrEqualTo(LargeIntegerAdd(offset, - ConvertLongToLargeInteger(count)), - minLength))) { - if (count < cm_data.buf_blockSize - && bufferp->dataVersion == -1) - memset(bufferp->datap, 0, - cm_data.buf_blockSize); - bufferp->dataVersion = scp->dataVersion; - } - - if (cm_HaveBuffer(scp, bufferp, 1)) break; - - /* otherwise, load the buffer and try again */ - lock_ReleaseMutex(&bufferp->mx); - code = cm_GetBuffer(scp, bufferp, NULL, userp, - &req); - lock_ReleaseMutex(&scp->mx); - lock_ObtainMutex(&bufferp->mx); - lock_ObtainMutex(&scp->mx); - if (code) break; - } - if (code) { - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - bufferp = NULL; - goto done; - } - } /* if (wrong buffer) ... */ - - /* now we have the right buffer loaded. Copy out the - * data from here to the user's buffer. - */ - bufIndex = offset.LowPart & (cm_data.buf_blockSize - 1); - - /* and figure out how many bytes we want from this buffer */ - nbytes = cm_data.buf_blockSize - bufIndex; /* what remains in buffer */ - if (nbytes > count) - nbytes = count; /* don't go past end of request */ - - /* now copy the data */ -#ifdef DJGPP - if (dosflag) - dosmemget((dos_ptr)op, nbytes, bufferp->datap + bufIndex); - else -#endif /* DJGPP */ - memcpy(bufferp->datap + bufIndex, op, nbytes); - buf_SetDirty(bufferp); - - /* and record the last writer */ - if (bufferp->userp != userp) { - cm_HoldUser(userp); - if (bufferp->userp) - cm_ReleaseUser(bufferp->userp); - bufferp->userp = userp; - } - - /* adjust counters, pointers, etc. */ - op += nbytes; - count -= nbytes; - written += nbytes; - thyper.LowPart = nbytes; - thyper.HighPart = 0; - offset = LargeIntegerAdd(thyper, offset); - } /* while 1 */ - - done: - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&fidp->mx); - if (bufferp) { - lock_ReleaseMutex(&bufferp->mx); - buf_Release(bufferp); - } - - if (code == 0 && filter != 0 && (fidp->flags & SMB_FID_NTOPEN) - && (fidp->NTopen_dscp->flags & CM_SCACHEFLAG_ANYWATCH)) { - smb_NotifyChange(FILE_ACTION_MODIFIED, filter, - fidp->NTopen_dscp, fidp->NTopen_pathp, - NULL, TRUE); - } - - if (code == 0 && doWriteBack) { - long code2; - lock_ObtainMutex(&scp->mx); - osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp ASYNCSTORE", - fidp->fid); - code2 = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_ASYNCSTORE); - osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp ASYNCSTORE returns %d", - fidp->fid,code2); - lock_ReleaseMutex(&scp->mx); - cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart, - writeBackOffset.HighPart, cm_chunkSize, 0, userp); - } - - osi_Log3(smb_logp, "smb_WriteData fid %d returns %d written %d", - fidp->fid, code, *writtenp); - return code; -} - -long smb_ReceiveCoreWrite(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_hyper_t offset; - long count, written = 0, total_written = 0; - unsigned short fd; - smb_fid_t *fidp; - long code = 0; - cm_user_t *userp; - cm_attr_t truncAttr; /* attribute struct used for truncating file */ - char *op; - int inDataBlockCount; - - fd = smb_GetSMBParm(inp, 0); - count = smb_GetSMBParm(inp, 1); - offset.HighPart = 0; /* too bad */ - offset.LowPart = smb_GetSMBParm(inp, 2) | (smb_GetSMBParm(inp, 3) << 16); - - op = smb_GetSMBData(inp, NULL); - op = smb_ParseDataBlock(op, NULL, &inDataBlockCount); - - osi_Log3(smb_logp, "smb_ReceiveCoreWrite fid %d, off 0x%x, size 0x%x", - fd, offset.LowPart, count); - - fd = smb_ChainFID(fd, inp); - fidp = smb_FindFID(vcp, fd, 0); - if (!fidp) { - return CM_ERROR_BADFD; - } - - if (fidp->flags & SMB_FID_IOCTL) - return smb_IoctlWrite(fidp, vcp, inp, outp); - - userp = smb_GetUser(vcp, inp); - - /* special case: 0 bytes transferred means truncate to this position */ - if (count == 0) { - cm_req_t req; - - cm_InitReq(&req); - - truncAttr.mask = CM_ATTRMASK_LENGTH; - truncAttr.length.LowPart = offset.LowPart; - truncAttr.length.HighPart = 0; - lock_ObtainMutex(&fidp->mx); - code = cm_SetAttr(fidp->scp, &truncAttr, userp, &req); - lock_ReleaseMutex(&fidp->mx); - smb_SetSMBParm(outp, 0, /* count */ 0); - smb_SetSMBDataLength(outp, 0); - fidp->flags |= SMB_FID_LENGTHSETDONE; - goto done; - } - - /* - * Work around bug in NT client - * - * When copying a file, the NT client should first copy the data, - * then copy the last write time. But sometimes the NT client does - * these in the wrong order, so the data copies would inadvertently - * cause the last write time to be overwritten. We try to detect this, - * and don't set client mod time if we think that would go against the - * intention. - */ - if ((fidp->flags & SMB_FID_MTIMESETDONE) != SMB_FID_MTIMESETDONE) { - fidp->scp->mask |= CM_SCACHEMASK_CLIENTMODTIME; - fidp->scp->clientModTime = time(NULL); - } - - code = 0; - while ( code == 0 && count > 0 ) { -#ifndef DJGPP - code = smb_WriteData(fidp, &offset, count, op, userp, &written); -#else /* DJGPP */ - code = smb_WriteData(fidp, &offset, count, op, userp, &written, FALSE); -#endif /* !DJGPP */ - if (code == 0 && written == 0) - code = CM_ERROR_PARTIALWRITE; - - offset.LowPart += written; - count -= written; - total_written += written; - written = 0; - } - - /* set the packet data length to 3 bytes for the data block header, - * plus the size of the data. - */ - smb_SetSMBParm(outp, 0, total_written); - smb_SetSMBDataLength(outp, 0); - - done: - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); - - return code; -} - -void smb_CompleteWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, - NCB *ncbp, raw_write_cont_t *rwcp) -{ - unsigned short fd; - smb_fid_t *fidp; - cm_user_t *userp; -#ifndef DJGPP - char *rawBuf; -#else /* DJGPP */ - dos_ptr rawBuf; -#endif /* !DJGPP */ - long written = 0; - long code = 0; - - fd = smb_GetSMBParm(inp, 0); - fidp = smb_FindFID(vcp, fd, 0); - - osi_Log2(smb_logp, "Completing Raw Write offset %x count %x", - rwcp->offset.LowPart, rwcp->count); - - userp = smb_GetUser(vcp, inp); - -#ifndef DJGPP - rawBuf = rwcp->buf; - code = smb_WriteData(fidp, &rwcp->offset, rwcp->count, rawBuf, userp, - &written); -#else /* DJGPP */ - rawBuf = (dos_ptr) rwcp->buf; - code = smb_WriteData(fidp, &rwcp->offset, rwcp->count, - (unsigned char *) rawBuf, userp, - &written, TRUE); -#endif /* !DJGPP */ - - if (rwcp->writeMode & 0x1) { /* synchronous */ - smb_t *op; - - smb_FormatResponsePacket(vcp, inp, outp); - op = (smb_t *) outp; - op->com = 0x20; /* SMB_COM_WRITE_COMPLETE */ - smb_SetSMBParm(outp, 0, written + rwcp->alreadyWritten); - smb_SetSMBDataLength(outp, 0); - smb_SendPacket(vcp, outp); - smb_FreePacket(outp); - } - else { /* asynchronous */ - lock_ObtainMutex(&fidp->mx); - fidp->raw_writers--; - if (fidp->raw_writers == 0) - thrd_SetEvent(fidp->raw_write_event); - lock_ReleaseMutex(&fidp->mx); - } - - /* Give back raw buffer */ - lock_ObtainMutex(&smb_RawBufLock); -#ifndef DJGPP - *((char **)rawBuf) = smb_RawBufs; -#else /* DJGPP */ - _farpokel(_dos_ds, rawBuf, smb_RawBufs); -#endif /* !DJGPP */ - smb_RawBufs = rawBuf; - lock_ReleaseMutex(&smb_RawBufLock); - - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); -} - -long smb_ReceiveCoreWriteRawDummy(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - return 0; -} - -long smb_ReceiveCoreWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, raw_write_cont_t *rwcp) -{ - osi_hyper_t offset; - long count, written = 0, total_written = 0; - long totalCount; - unsigned short fd; - smb_fid_t *fidp; - long code = 0; - cm_user_t *userp; - char *op; - unsigned short writeMode; -#ifndef DJGPP - char *rawBuf; -#else /* DJGPP */ - dos_ptr rawBuf; -#endif /* !DJGPP */ - - fd = smb_GetSMBParm(inp, 0); - totalCount = smb_GetSMBParm(inp, 1); - count = smb_GetSMBParm(inp, 10); - offset.HighPart = 0; /* too bad */ - offset.LowPart = smb_GetSMBParm(inp, 3) | (smb_GetSMBParm(inp, 4) << 16); - writeMode = smb_GetSMBParm(inp, 7); - - op = (char *) inp->data; - op += smb_GetSMBParm(inp, 11); - - osi_Log4(smb_logp, - "smb_ReceiveCoreWriteRaw fd %d, off 0x%x, size 0x%x, WriteMode 0x%x", - fd, offset.LowPart, count, writeMode); - - fd = smb_ChainFID(fd, inp); - fidp = smb_FindFID(vcp, fd, 0); - if (!fidp) { - return CM_ERROR_BADFD; - } - - userp = smb_GetUser(vcp, inp); - - /* - * Work around bug in NT client - * - * When copying a file, the NT client should first copy the data, - * then copy the last write time. But sometimes the NT client does - * these in the wrong order, so the data copies would inadvertently - * cause the last write time to be overwritten. We try to detect this, - * and don't set client mod time if we think that would go against the - * intention. - */ - if ((fidp->flags & SMB_FID_LOOKSLIKECOPY) != SMB_FID_LOOKSLIKECOPY) { - fidp->scp->mask |= CM_SCACHEMASK_CLIENTMODTIME; - fidp->scp->clientModTime = time(NULL); - } - - code = 0; - while ( code == 0 && count > 0 ) { -#ifndef DJGPP - code = smb_WriteData(fidp, &offset, count, op, userp, &written); -#else /* DJGPP */ - code = smb_WriteData(fidp, &offset, count, op, userp, &written, FALSE); -#endif /* !DJGPP */ - if (code == 0 && written == 0) - code = CM_ERROR_PARTIALWRITE; - - offset.LowPart += written; - count -= written; - total_written += written; - written = 0; - } - - /* Get a raw buffer */ - if (code == 0) { - rawBuf = NULL; - lock_ObtainMutex(&smb_RawBufLock); - if (smb_RawBufs) { - /* Get a raw buf, from head of list */ - rawBuf = smb_RawBufs; -#ifndef DJGPP - smb_RawBufs = *(char **)smb_RawBufs; -#else /* DJGPP */ - smb_RawBufs = _farpeekl(_dos_ds, smb_RawBufs); -#endif /* !DJGPP */ - } - else - code = CM_ERROR_USESTD; - - lock_ReleaseMutex(&smb_RawBufLock); - } - - /* Don't allow a premature Close */ - if (code == 0 && (writeMode & 1) == 0) { - lock_ObtainMutex(&fidp->mx); - fidp->raw_writers++; - thrd_ResetEvent(fidp->raw_write_event); - lock_ReleaseMutex(&fidp->mx); - } - - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); - - if (code) { - smb_SetSMBParm(outp, 0, total_written); - smb_SetSMBDataLength(outp, 0); - ((smb_t *)outp)->com = 0x20; /* SMB_COM_WRITE_COMPLETE */ - rwcp->code = code; - return code; - } - - rwcp->code = 0; - rwcp->buf = rawBuf; - rwcp->offset.HighPart = 0; - rwcp->offset.LowPart = offset.LowPart + count; - rwcp->count = totalCount - count; - rwcp->writeMode = writeMode; - rwcp->alreadyWritten = total_written; - - /* set the packet data length to 3 bytes for the data block header, - * plus the size of the data. - */ - smb_SetSMBParm(outp, 0, 0xffff); - smb_SetSMBDataLength(outp, 0); - - return 0; -} - -long smb_ReceiveCoreRead(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_hyper_t offset; - long count, finalCount; - unsigned short fd; - smb_fid_t *fidp; - long code = 0; - cm_user_t *userp; - char *op; - - fd = smb_GetSMBParm(inp, 0); - count = smb_GetSMBParm(inp, 1); - offset.HighPart = 0; /* too bad */ - offset.LowPart = smb_GetSMBParm(inp, 2) | (smb_GetSMBParm(inp, 3) << 16); - - osi_Log3(smb_logp, "smb_ReceiveCoreRead fd %d, off 0x%x, size 0x%x", - fd, offset.LowPart, count); - - fd = smb_ChainFID(fd, inp); - fidp = smb_FindFID(vcp, fd, 0); - if (!fidp) { - return CM_ERROR_BADFD; - } - - if (fidp->flags & SMB_FID_IOCTL) { - return smb_IoctlRead(fidp, vcp, inp, outp); - } - - userp = smb_GetUser(vcp, inp); - - /* remember this for final results */ - smb_SetSMBParm(outp, 0, count); - smb_SetSMBParm(outp, 1, 0); - smb_SetSMBParm(outp, 2, 0); - smb_SetSMBParm(outp, 3, 0); - smb_SetSMBParm(outp, 4, 0); - - /* set the packet data length to 3 bytes for the data block header, - * plus the size of the data. - */ - smb_SetSMBDataLength(outp, count+3); - - /* get op ptr after putting in the parms, since otherwise we don't - * know where the data really is. - */ - op = smb_GetSMBData(outp, NULL); - - /* now emit the data block header: 1 byte of type and 2 bytes of length */ - *op++ = 1; /* data block marker */ - *op++ = (unsigned char) (count & 0xff); - *op++ = (unsigned char) ((count >> 8) & 0xff); - -#ifndef DJGPP - code = smb_ReadData(fidp, &offset, count, op, userp, &finalCount); -#else /* DJGPP */ - code = smb_ReadData(fidp, &offset, count, op, userp, &finalCount, FALSE); -#endif /* !DJGPP */ - - /* fix some things up */ - smb_SetSMBParm(outp, 0, finalCount); - smb_SetSMBDataLength(outp, finalCount+3); - - smb_ReleaseFID(fidp); - - cm_ReleaseUser(userp); - return code; -} - -long smb_ReceiveCoreMakeDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp; - long code = 0; - cm_space_t *spacep; - char *tp; - cm_user_t *userp; - cm_scache_t *dscp; /* dir we're dealing with */ - cm_scache_t *scp; /* file we're creating */ - cm_attr_t setAttr; - int initialModeBits; - char *lastNamep; - int caseFold; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - scp = NULL; - - /* compute initial mode bits based on read-only flag in attributes */ - initialModeBits = 0777; - - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - if (strcmp(pathp, "\\") == 0) - return CM_ERROR_EXISTS; - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - - code = cm_NameI(cm_data.rootSCachep, spacep->data, - caseFold | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, - userp, tidPathp, &req, &dscp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* otherwise, scp points to the parent directory. Do a lookup, and - * fail if we find it. Otherwise, we do the create. - */ - if (!lastNamep) - lastNamep = pathp; - else - lastNamep++; - code = cm_Lookup(dscp, lastNamep, 0, userp, &req, &scp); - if (scp) cm_ReleaseSCache(scp); - if (code != CM_ERROR_NOSUCHFILE) { - if (code == 0) code = CM_ERROR_EXISTS; - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - return code; - } - - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - setAttr.clientModTime = time(NULL); - code = cm_MakeDir(dscp, lastNamep, 0, &setAttr, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, lastNamep, NULL, TRUE); - - /* we don't need this any longer */ - cm_ReleaseSCache(dscp); - - if (code) { - /* something went wrong creating or truncating the file */ - cm_ReleaseUser(userp); - return code; - } - - /* otherwise we succeeded */ - smb_SetSMBDataLength(outp, 0); - cm_ReleaseUser(userp); - - return 0; -} - -BOOL smb_IsLegalFilename(char *filename) -{ - /* - * Find the longest substring of filename that does not contain - * any of the chars in illegalChars. If that substring is less - * than the length of the whole string, then one or more of the - * illegal chars is in filename. - */ - if (strcspn(filename, illegalChars) < strlen(filename)) - return FALSE; - - return TRUE; -} - -long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp; - long code = 0; - cm_space_t *spacep; - char *tp; - int excl; - cm_user_t *userp; - cm_scache_t *dscp; /* dir we're dealing with */ - cm_scache_t *scp; /* file we're creating */ - cm_attr_t setAttr; - int initialModeBits; - smb_fid_t *fidp; - int attributes; - char *lastNamep; - int caseFold; - afs_uint32 dosTime; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - scp = NULL; - excl = (inp->inCom == 0x03)? 0 : 1; - - attributes = smb_GetSMBParm(inp, 0); - dosTime = smb_GetSMBParm(inp, 1) | (smb_GetSMBParm(inp, 2) << 16); - - /* compute initial mode bits based on read-only flag in attributes */ - initialModeBits = 0666; - if (attributes & 1) initialModeBits &= ~0222; - - tp = smb_GetSMBData(inp, NULL); - pathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - userp = smb_GetUser(vcp, inp); - - caseFold = CM_FLAG_CASEFOLD; - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold | CM_FLAG_FOLLOW, - userp, tidPathp, &req, &dscp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* otherwise, scp points to the parent directory. Do a lookup, and - * truncate the file if we find it, otherwise we create the file. - */ - if (!lastNamep) - lastNamep = pathp; - else - lastNamep++; - - if (!smb_IsLegalFilename(lastNamep)) - return CM_ERROR_BADNTFILENAME; - - osi_Log1(smb_logp, "SMB receive create [%s]", osi_LogSaveString( smb_logp, pathp )); -#ifdef DEBUG_VERBOSE - { - char *hexp; - hexp = osi_HexifyString( lastNamep ); - DEBUG_EVENT2("AFS", "CoreCreate H[%s] A[%s]", hexp, lastNamep ); - free(hexp); - } -#endif - - code = cm_Lookup(dscp, lastNamep, 0, userp, &req, &scp); - if (code && code != CM_ERROR_NOSUCHFILE) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - return code; - } - - /* if we get here, if code is 0, the file exists and is represented by - * scp. Otherwise, we have to create it. - */ - if (code == 0) { - if (excl) { - /* oops, file shouldn't be there */ - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return CM_ERROR_EXISTS; - } - - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - code = cm_SetAttr(scp, &setAttr, userp, &req); - } - else { - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - smb_UnixTimeFromDosUTime(&setAttr.clientModTime, dosTime); - code = cm_Create(dscp, lastNamep, 0, &setAttr, &scp, userp, - &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, lastNamep, NULL, TRUE); - if (!excl && code == CM_ERROR_EXISTS) { - /* not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after - * we started this call. - */ - code = cm_Lookup(dscp, lastNamep, caseFold, userp, - &req, &scp); - if (code == 0) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - code = cm_SetAttr(scp, &setAttr, userp, &req); - } - } - } - - /* we don't need this any longer */ - cm_ReleaseSCache(dscp); - - if (code) { - /* something went wrong creating or truncating the file */ - if (scp) cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return code; - } - - /* make sure we only open files */ - if (scp->fileType != CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return CM_ERROR_ISDIR; - } - - /* now all we have to do is open the file itself */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); - - /* save a pointer to the vnode */ - fidp->scp = scp; - - /* always create it open for read/write */ - fidp->flags |= (SMB_FID_OPENREAD | SMB_FID_OPENWRITE); - - smb_ReleaseFID(fidp); - - smb_SetSMBParm(outp, 0, fidp->fid); - smb_SetSMBDataLength(outp, 0); - - cm_Open(scp, 0, userp); - - cm_ReleaseUser(userp); - /* leave scp held since we put it in fidp->scp */ - return 0; -} - -long smb_ReceiveCoreSeek(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - long code = 0; - long offset; - int whence; - unsigned short fd; - smb_fid_t *fidp; - cm_scache_t *scp; - cm_user_t *userp; - cm_req_t req; - - cm_InitReq(&req); - - fd = smb_GetSMBParm(inp, 0); - whence = smb_GetSMBParm(inp, 1); - offset = smb_GetSMBParm(inp, 2) | (smb_GetSMBParm(inp, 3) << 16); - - /* try to find the file descriptor */ - fd = smb_ChainFID(fd, inp); - fidp = smb_FindFID(vcp, fd, 0); - if (!fidp || (fidp->flags & SMB_FID_IOCTL)) { - return CM_ERROR_BADFD; - } - - userp = smb_GetUser(vcp, inp); - - lock_ObtainMutex(&fidp->mx); - scp = fidp->scp; - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code == 0) { - if (whence == 1) { - /* offset from current offset */ - offset += fidp->offset; - } - else if (whence == 2) { - /* offset from current EOF */ - offset += scp->length.LowPart; - } - fidp->offset = offset; - smb_SetSMBParm(outp, 0, offset & 0xffff); - smb_SetSMBParm(outp, 1, (offset>>16) & 0xffff); - smb_SetSMBDataLength(outp, 0); - } - lock_ReleaseMutex(&scp->mx); - lock_ReleaseMutex(&fidp->mx); - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); - return code; -} - -/* dispatch all of the requests received in a packet. Due to chaining, this may - * be more than one request. - */ -void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, - NCB *ncbp, raw_write_cont_t *rwcp) -{ - smb_dispatch_t *dp; - smb_t *smbp; - unsigned long code = 0; - unsigned char *outWctp; - int nparms; /* # of bytes of parameters */ - char tbuffer[200]; - int nbytes; /* bytes of data, excluding count */ - int temp; - unsigned char *tp; - unsigned short errCode; - unsigned long NTStatus; - int noSend; - unsigned char errClass; - unsigned int oldGen; - DWORD oldTime, newTime; - - /* get easy pointer to the data */ - smbp = (smb_t *) inp->data; - - if (!(outp->flags & SMB_PACKETFLAG_SUSPENDED)) { - /* setup the basic parms for the initial request in the packet */ - inp->inCom = smbp->com; - inp->wctp = &smbp->wct; - inp->inCount = 0; - inp->ncb_length = ncbp->ncb_length; - } - noSend = 0; - - /* Sanity check */ - if (ncbp->ncb_length < offsetof(struct smb, vdata)) { - /* log it and discard it */ -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - char s[100]; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "SMB message too short, len %d", ncbp->ncb_length); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1007, NULL, - 1, ncbp->ncb_length, ptbuf, inp); - DeregisterEventSource(h); -#else /* DJGPP */ - osi_Log1(smb_logp, "SMB message too short, len %d", ncbp->ncb_length); -#endif /* !DJGPP */ - return; - } - - /* We are an ongoing op */ - thrd_Increment(&ongoingOps); - - /* set up response packet for receiving output */ - if (!(outp->flags & SMB_PACKETFLAG_SUSPENDED)) - smb_FormatResponsePacket(vcp, inp, outp); - outWctp = outp->wctp; - - /* Remember session generation number and time */ - oldGen = sessionGen; - oldTime = GetCurrentTime(); - - while (inp->inCom != 0xff) { - dp = &smb_dispatchTable[inp->inCom]; - - if (outp->flags & SMB_PACKETFLAG_SUSPENDED) { - outp->flags &= ~SMB_PACKETFLAG_SUSPENDED; - code = outp->resumeCode; - goto resume; - } - - /* process each request in the packet; inCom, wctp and inCount - * are already set up. - */ - osi_Log2(smb_logp, "SMB received op 0x%x lsn %d", inp->inCom, - ncbp->ncb_lsn); - - /* now do the dispatch */ - /* start by formatting the response record a little, as a default */ - if (dp->flags & SMB_DISPATCHFLAG_CHAINED) { - outWctp[0] = 2; - outWctp[1] = 0xff; /* no operation */ - outWctp[2] = 0; /* padding */ - outWctp[3] = 0; - outWctp[4] = 0; - } - else { - /* not a chained request, this is a more reasonable default */ - outWctp[0] = 0; /* wct of zero */ - outWctp[1] = 0; /* and bcc (word) of zero */ - outWctp[2] = 0; - } - - /* once set, stays set. Doesn't matter, since we never chain - * "no response" calls. - */ - if (dp->flags & SMB_DISPATCHFLAG_NORESPONSE) - noSend = 1; - - if (dp->procp) { - /* we have a recognized operation */ - - if (inp->inCom == 0x1d) - /* Raw Write */ - code = smb_ReceiveCoreWriteRaw (vcp, inp, outp, - rwcp); - else { - osi_LogEvent("AFS Dispatch %s",(myCrt_Dispatch(inp->inCom)),"vcp 0x%x lana %d lsn %d",(int)vcp,vcp->lana,vcp->lsn); - osi_Log4(smb_logp,"Dispatch %s vcp 0x%x lana %d lsn %d",myCrt_Dispatch(inp->inCom),vcp,vcp->lana,vcp->lsn); - code = (*(dp->procp)) (vcp, inp, outp); - osi_LogEvent("AFS Dispatch return",NULL,"Code 0x%x",(code==0)?0:code-CM_ERROR_BASE); - osi_Log4(smb_logp,"Dispatch return code 0x%x vcp 0x%x lana %d lsn %d",(code==0)?0:code-CM_ERROR_BASE,vcp,vcp->lana,vcp->lsn); -#ifdef LOG_PACKET - if ( code == CM_ERROR_BADSMB || - code == CM_ERROR_BADOP ) - smb_LogPacket(inp); -#endif /* LOG_PACKET */ - } - - if (oldGen != sessionGen) { -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - char s[100]; - newTime = GetCurrentTime(); - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "Pkt straddled session startup, took %d ms, ncb length %d", - newTime - oldTime, ncbp->ncb_length); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, - 1005, NULL, 1, ncbp->ncb_length, ptbuf, smbp); - DeregisterEventSource(h); -#endif /* !DJGPP */ - osi_Log1(smb_logp, "Pkt straddled session startup, " - "ncb length %d", ncbp->ncb_length); - } - } - else { - /* bad opcode, fail the request, after displaying it */ - osi_Log1(smb_logp, "Received bad SMB req 0x%X", inp->inCom); -#ifdef LOG_PACKET - smb_LogPacket(inp); -#endif /* LOG_PACKET */ - -#ifndef DJGPP - if (showErrors) { - sprintf(tbuffer, "Received bad SMB req 0x%x", inp->inCom); - code = (*smb_MBfunc)(NULL, tbuffer, "Cancel: don't show again", - MB_OKCANCEL|MB_SERVICE_NOTIFICATION); - if (code == IDCANCEL) - showErrors = 0; - } -#endif /* DJGPP */ - code = CM_ERROR_BADOP; - } - - /* catastrophic failure: log as much as possible */ - if (code == CM_ERROR_BADSMB) { -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - char s[100]; - - osi_Log1(smb_logp, - "Invalid SMB, ncb_length %d", - ncbp->ncb_length); - - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "Invalid SMB message, length %d", - ncbp->ncb_length); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1002, NULL, - 1, ncbp->ncb_length, ptbuf, smbp); - DeregisterEventSource(h); -#ifdef LOG_PACKET - smb_LogPacket(inp); -#endif /* LOG_PACKET */ -#endif /* !DJGPP */ - osi_Log1(smb_logp, "Invalid SMB message, length %d", - ncbp->ncb_length); - - code = CM_ERROR_INVAL; - } - - if (outp->flags & SMB_PACKETFLAG_NOSEND) { - thrd_Decrement(&ongoingOps); - return; - } - - resume: - /* now, if we failed, turn the current response into an empty - * one, and fill in the response packet's error code. - */ - if (code) { - if (vcp->flags & SMB_VCFLAG_STATUS32) { - smb_MapNTError(code, &NTStatus); - outWctp = outp->wctp; - smbp = (smb_t *) &outp->data; - if (code != CM_ERROR_PARTIALWRITE - && code != CM_ERROR_BUFFERTOOSMALL - && code != CM_ERROR_GSSCONTINUE) { - /* nuke wct and bcc. For a partial - * write or an in-process authentication handshake, - * assume they're OK. - */ - *outWctp++ = 0; - *outWctp++ = 0; - *outWctp++ = 0; - } - smbp->rcls = (unsigned char) (NTStatus & 0xff); - smbp->reh = (unsigned char) ((NTStatus >> 8) & 0xff); - smbp->errLow = (unsigned char) ((NTStatus >> 16) & 0xff); - smbp->errHigh = (unsigned char) ((NTStatus >> 24) & 0xff); - smbp->flg2 |= SMB_FLAGS2_32BIT_STATUS; - break; - } - else { - smb_MapCoreError(code, vcp, &errCode, &errClass); - outWctp = outp->wctp; - smbp = (smb_t *) &outp->data; - if (code != CM_ERROR_PARTIALWRITE) { - /* nuke wct and bcc. For a partial - * write, assume they're OK. - */ - *outWctp++ = 0; - *outWctp++ = 0; - *outWctp++ = 0; - } - smbp->errLow = (unsigned char) (errCode & 0xff); - smbp->errHigh = (unsigned char) ((errCode >> 8) & 0xff); - smbp->rcls = errClass; - break; - } - } /* error occurred */ - - /* if we're here, we've finished one request. Look to see if - * this is a chained opcode. If it is, setup things to process - * the chained request, and setup the output buffer to hold the - * chained response. Start by finding the next input record. - */ - if (!(dp->flags & SMB_DISPATCHFLAG_CHAINED)) - break; /* not a chained req */ - tp = inp->wctp; /* points to start of last request */ - /* in a chained request, the first two - * parm fields are required, and are - * AndXCommand/AndXReserved and - * AndXOffset. */ - if (tp[0] < 2) break; - if (tp[1] == 0xff) break; /* no more chained opcodes */ - inp->inCom = tp[1]; - inp->wctp = inp->data + tp[3] + (tp[4] << 8); - inp->inCount++; - - /* and now append the next output request to the end of this - * last request. Begin by finding out where the last response - * ends, since that's where we'll put our new response. - */ - outWctp = outp->wctp; /* ptr to out parameters */ - osi_assert (outWctp[0] >= 2); /* need this for all chained requests */ - nparms = outWctp[0] << 1; - tp = outWctp + nparms + 1; /* now points to bcc field */ - nbytes = tp[0] + (tp[1] << 8); /* # of data bytes */ - tp += 2 /* for the count itself */ + nbytes; - /* tp now points to the new output record; go back and patch the - * second parameter (off2) to point to the new record. - */ - temp = (unsigned int)tp - ((unsigned int) outp->data); - outWctp[3] = (unsigned char) (temp & 0xff); - outWctp[4] = (unsigned char) ((temp >> 8) & 0xff); - outWctp[2] = 0; /* padding */ - outWctp[1] = inp->inCom; /* next opcode */ - - /* finally, setup for the next iteration */ - outp->wctp = tp; - outWctp = tp; - } /* while loop over all requests in the packet */ - - /* done logging out, turn off logging-out flag */ - if (!(inp->flags & SMB_PACKETFLAG_PROFILE_UPDATE_OK)) { - vcp->justLoggedOut = NULL; - if (loggedOut) { - loggedOut = 0; - free(loggedOutName); - loggedOutName = NULL; - smb_ReleaseUID(loggedOutUserp); - loggedOutUserp = NULL; - } - } - - /* now send the output packet, and return */ - if (!noSend) - smb_SendPacket(vcp, outp); - thrd_Decrement(&ongoingOps); - - if (!(vcp->flags & SMB_VCFLAG_ALREADYDEAD)) { - if (active_vcp != vcp) { - if (active_vcp) { - smb_ReleaseVC(active_vcp); - osi_Log2(smb_logp, - "Replacing active_vcp %x with %x", active_vcp, vcp); - } - smb_HoldVC(vcp); - active_vcp = vcp; - } - last_msg_time = GetCurrentTime(); - } else if (active_vcp == vcp) { - smb_ReleaseVC(active_vcp); - active_vcp = NULL; - } - - return; -} - -#ifndef DJGPP -/* Wait for Netbios() calls to return, and make the results available to server - * threads. Note that server threads can't wait on the NCBevents array - * themselves, because NCB events are manual-reset, and the servers would race - * each other to reset them. - */ -void smb_ClientWaiter(void *parmp) -{ - DWORD code; - int idx; - - while (smbShutdownFlag == 0) { - code = thrd_WaitForMultipleObjects_Event(numNCBs, NCBevents, - FALSE, INFINITE); - if (code == WAIT_OBJECT_0) - continue; - - /* error checking */ - if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) - { - int abandonIdx = code - WAIT_ABANDONED_0; - osi_Log2(smb_logp, "Error: smb_ClientWaiter event %d abandoned, errno %d\n", abandonIdx, GetLastError()); - } - - if (code == WAIT_IO_COMPLETION) - { - osi_Log0(smb_logp, "Error: smb_ClientWaiter WAIT_IO_COMPLETION\n"); - continue; - } - - if (code == WAIT_TIMEOUT) - { - osi_Log1(smb_logp, "Error: smb_ClientWaiter WAIT_TIMEOUT, errno %d\n", GetLastError()); - } - - if (code == WAIT_FAILED) - { - osi_Log1(smb_logp, "Error: smb_ClientWaiter WAIT_FAILED, errno %d\n", GetLastError()); - } - - idx = code - WAIT_OBJECT_0; - - /* check idx range! */ - if (idx < 0 || idx > (sizeof(NCBevents) / sizeof(NCBevents[0]))) - { - /* this is fatal - log as much as possible */ - osi_Log1(smb_logp, "Fatal: NCBevents idx [ %d ] out of range.\n", idx); - osi_assert(0); - } - - thrd_ResetEvent(NCBevents[idx]); - thrd_SetEvent(NCBreturns[0][idx]); - } -} -#endif /* !DJGPP */ - -/* - * Try to have one NCBRECV request waiting for every live session. Not more - * than one, because if there is more than one, it's hard to handle Write Raw. - */ -void smb_ServerWaiter(void *parmp) -{ - DWORD code; - int idx_session, idx_NCB; - NCB *ncbp; -#ifdef DJGPP - dos_ptr dos_ncb; -#endif /* DJGPP */ - - while (smbShutdownFlag == 0) { - /* Get a session */ - code = thrd_WaitForMultipleObjects_Event(numSessions, SessionEvents, - FALSE, INFINITE); - if (code == WAIT_OBJECT_0) - continue; - - if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numSessions)) - { - int abandonIdx = code - WAIT_ABANDONED_0; - osi_Log2(smb_logp, "Error: smb_ServerWaiter (SessionEvents) event %d abandoned, errno %d\n", abandonIdx, GetLastError()); - } - - if (code == WAIT_IO_COMPLETION) - { - osi_Log0(smb_logp, "Error: smb_ServerWaiter (SessionEvents) WAIT_IO_COMPLETION\n"); - continue; - } - - if (code == WAIT_TIMEOUT) - { - osi_Log1(smb_logp, "Error: smb_ServerWaiter (SessionEvents) WAIT_TIMEOUT, errno %d\n", GetLastError()); - } - - if (code == WAIT_FAILED) - { - osi_Log1(smb_logp, "Error: smb_ServerWaiter (SessionEvents) WAIT_FAILED, errno %d\n", GetLastError()); - } - - idx_session = code - WAIT_OBJECT_0; - - /* check idx range! */ - if (idx_session < 0 || idx_session > (sizeof(SessionEvents) / sizeof(SessionEvents[0]))) - { - /* this is fatal - log as much as possible */ - osi_Log1(smb_logp, "Fatal: session idx [ %d ] out of range.\n", idx_session); - osi_assert(0); - } - - /* Get an NCB */ - NCBretry: - code = thrd_WaitForMultipleObjects_Event(numNCBs, NCBavails, - FALSE, INFINITE); - if (code == WAIT_OBJECT_0) { - if (smbShutdownFlag == 1) - break; - else - goto NCBretry; - } - - /* error checking */ - if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) - { - int abandonIdx = code - WAIT_ABANDONED_0; - osi_Log2(smb_logp, "Error: smb_ClientWaiter (NCBavails) event %d abandoned, errno %d\n", abandonIdx, GetLastError()); - } - - if (code == WAIT_IO_COMPLETION) - { - osi_Log0(smb_logp, "Error: smb_ClientWaiter (NCBavails) WAIT_IO_COMPLETION\n"); - continue; - } - - if (code == WAIT_TIMEOUT) - { - osi_Log1(smb_logp, "Error: smb_ClientWaiter (NCBavails) WAIT_TIMEOUT, errno %d\n", GetLastError()); - } - - if (code == WAIT_FAILED) - { - osi_Log1(smb_logp, "Error: smb_ClientWaiter (NCBavails) WAIT_FAILED, errno %d\n", GetLastError()); - } - - idx_NCB = code - WAIT_OBJECT_0; - - /* check idx range! */ - if (idx_NCB < 0 || idx_NCB > (sizeof(NCBsessions) / sizeof(NCBsessions[0]))) - { - /* this is fatal - log as much as possible */ - osi_Log1(smb_logp, "Fatal: idx_NCB [ %d ] out of range.\n", idx_NCB); - osi_assert(0); - } - - /* Link them together */ - NCBsessions[idx_NCB] = idx_session; - - /* Fire it up */ - ncbp = NCBs[idx_NCB]; - ncbp->ncb_lsn = (unsigned char) LSNs[idx_session]; - ncbp->ncb_command = NCBRECV | ASYNCH; - ncbp->ncb_lana_num = lanas[idx_session]; -#ifndef DJGPP - ncbp->ncb_buffer = (unsigned char *) bufs[idx_NCB]; - ncbp->ncb_event = NCBevents[idx_NCB]; - ncbp->ncb_length = SMB_PACKETSIZE; - Netbios(ncbp); -#else /* DJGPP */ - ncbp->ncb_buffer = bufs[idx_NCB]->dos_pkt; - ((smb_ncb_t*)ncbp)->orig_pkt = bufs[idx_NCB]; - ncbp->ncb_event = NCBreturns[0][idx_NCB]; - ncbp->ncb_length = SMB_PACKETSIZE; - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; - Netbios(ncbp, dos_ncb); -#endif /* !DJGPP */ - } -} - -/* - * The top level loop for handling SMB request messages. Each server thread - * has its own NCB and buffer for sending replies (outncbp, outbufp), but the - * NCB and buffer for the incoming request are loaned to us. - * - * Write Raw trickery starts here. When we get a Write Raw, we are supposed - * to immediately send a request for the rest of the data. This must come - * before any other traffic for that session, so we delay setting the session - * event until that data has come in. - */ -void smb_Server(VOID *parmp) -{ - int myIdx = (int) parmp; - NCB *ncbp; - NCB *outncbp; - smb_packet_t *bufp; - smb_packet_t *outbufp; - DWORD code, rcode; - int idx_NCB, idx_session; - UCHAR rc; - smb_vc_t *vcp = NULL; - smb_t *smbp; -#ifdef DJGPP - dos_ptr dos_ncb; -#endif /* DJGPP */ - - rx_StartClientThread(); - - outncbp = GetNCB(); - outbufp = GetPacket(); - outbufp->ncbp = outncbp; - - while (1) { - code = thrd_WaitForMultipleObjects_Event(numNCBs, NCBreturns[myIdx], - FALSE, INFINITE); - - /* terminate silently if shutdown flag is set */ - if (code == WAIT_OBJECT_0) { - if (smbShutdownFlag == 1) { - thrd_SetEvent(smb_ServerShutdown[myIdx]); - break; - } else - continue; - } - - /* error checking */ - if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) - { - int abandonIdx = code - WAIT_ABANDONED_0; - osi_Log3(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) event %d abandoned, errno %d\n", myIdx, abandonIdx, GetLastError()); - } - - if (code == WAIT_IO_COMPLETION) - { - osi_Log1(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) WAIT_IO_COMPLETION\n", myIdx); - continue; - } - - if (code == WAIT_TIMEOUT) - { - osi_Log2(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) WAIT_TIMEOUT, errno %d\n", myIdx, GetLastError()); - } - - if (code == WAIT_FAILED) - { - osi_Log2(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) WAIT_FAILED, errno %d\n", myIdx, GetLastError()); - } - - idx_NCB = code - WAIT_OBJECT_0; - - /* check idx range! */ - if (idx_NCB < 0 || idx_NCB > (sizeof(NCBs) / sizeof(NCBs[0]))) - { - /* this is fatal - log as much as possible */ - osi_Log1(smb_logp, "Fatal: idx_NCB %d out of range.\n", idx_NCB); - osi_assert(0); - } - - ncbp = NCBs[idx_NCB]; -#ifdef DJGPP - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; -#endif /* DJGPP */ - idx_session = NCBsessions[idx_NCB]; - rc = ncbp->ncb_retcode; - - if (rc != NRC_PENDING && rc != NRC_GOODRET) { - switch (rc) { - case 0x01: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: illegal buffer length", ncbp->ncb_lsn, idx_session); - break; - case 0x03: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: illegal command", ncbp->ncb_lsn, idx_session); - break; - case 0x05: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: command timed out", ncbp->ncb_lsn, idx_session); - break; - case 0x06: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: message incomplete, issue another command", ncbp->ncb_lsn, idx_session); - break; - case 0x07: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: illegal buffer address", ncbp->ncb_lsn, idx_session); - break; - case 0x08: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: session number out of range", ncbp->ncb_lsn, idx_session); - break; - case 0x09: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: no resource available", ncbp->ncb_lsn, idx_session); - break; - case 0x0a: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: session closed", ncbp->ncb_lsn, idx_session); - break; - case 0x0b: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: command cancelled", ncbp->ncb_lsn, idx_session); - break; - case 0x0d: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: duplicate name", ncbp->ncb_lsn, idx_session); - break; - case 0x0e: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: name table full", ncbp->ncb_lsn, idx_session); - break; - case 0x0f: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: no deletions, name has active lsn %d sessions", ncbp->ncb_lsn, idx_session); - break; - case 0x11: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: local session table full", ncbp->ncb_lsn, idx_session); - break; - case 0x12: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: remote session table full", ncbp->ncb_lsn, idx_session); - break; - case 0x13: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: illegal name number", ncbp->ncb_lsn, idx_session); - break; - case 0x14: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: no callname", ncbp->ncb_lsn, idx_session); - break; - case 0x15: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: cannot put * in NCB_NAME", ncbp->ncb_lsn, idx_session); - break; - case 0x16: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: name in use on remote adapter", ncbp->ncb_lsn, idx_session); - break; - case 0x17: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: name deleted", ncbp->ncb_lsn, idx_session); - break; - case 0x18: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: session ended abnormally", ncbp->ncb_lsn, idx_session); - break; - case 0x19: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: name conflict detected", ncbp->ncb_lsn, idx_session); - break; - case 0x21: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: interface busy, IRET before retrying", ncbp->ncb_lsn, idx_session); - break; - case 0x22: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: too many commands outstanding, retry later", ncbp->ncb_lsn, idx_session); - break; - case 0x23: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: ncb_lana_num field invalid", ncbp->ncb_lsn, idx_session); - break; - case 0x24: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: command completed while cancel occurring", ncbp->ncb_lsn, idx_session); - break; - case 0x26: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: command not valid to cancel", ncbp->ncb_lsn, idx_session); - break; - case 0x30: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: name defined by anther local process", ncbp->ncb_lsn, idx_session); - break; - case 0x34: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: environment undefined. RESET required", ncbp->ncb_lsn, idx_session); - break; - case 0x35: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: required OS resources exhausted", ncbp->ncb_lsn, idx_session); - break; - case 0x36: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: max number of applications exceeded", ncbp->ncb_lsn, idx_session); - break; - case 0x37: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: no saps available for netbios", ncbp->ncb_lsn, idx_session); - break; - case 0x38: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: requested resources are not available", ncbp->ncb_lsn, idx_session); - break; - case 0x39: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: invalid ncb address or length > segment", ncbp->ncb_lsn, idx_session); - break; - case 0x3B: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: invalid NCB DDID", ncbp->ncb_lsn, idx_session); - break; - case 0x3C: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: lock of user area failed", ncbp->ncb_lsn, idx_session); - break; - case 0x3f: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: NETBIOS not loaded", ncbp->ncb_lsn, idx_session); - break; - case 0x40: - osi_Log2(smb_logp, "NCBRECV failure lsn %d session %d: system error", ncbp->ncb_lsn, idx_session); - break; - default: - osi_Log3(smb_logp, "NCBRECV failure lsn %d session %d code %d", ncbp->ncb_lsn, idx_session, rc); - break; - } - } - - switch (rc) { - case NRC_GOODRET: - break; - - case NRC_PENDING: - /* Can this happen? Or is it just my UNIX paranoia? */ - osi_Log2(smb_logp, "NCBRECV pending lsn %d session %d", ncbp->ncb_lsn, idx_session); - continue; - - case NRC_SCLOSED: - case NRC_SNUMOUT: - /* Client closed session */ - dead_sessions[idx_session] = TRUE; - if (vcp) - smb_ReleaseVC(vcp); - vcp = smb_FindVC(ncbp->ncb_lsn, 0, lanas[idx_session]); - /* Should also release vcp. [done] 2004-05-11 jaltman - * Also, should do - * sanity check that all TID's are gone. - * - * TODO: check if we could use LSNs[idx_session] instead, - * also cleanup after dead vcp - */ - if (vcp) { - if (dead_vcp == vcp) - osi_Log1(smb_logp, "dead_vcp already set, 0x%x", dead_vcp); - else if (!(vcp->flags & SMB_VCFLAG_ALREADYDEAD)) { - osi_Log2(smb_logp, "setting dead_vcp 0x%x, user struct 0x%x", - vcp, vcp->usersp); - smb_HoldVC(vcp); - if (dead_vcp) { - smb_ReleaseVC(dead_vcp); - osi_Log1(smb_logp, - "Previous dead_vcp %x", dead_vcp); - } - dead_vcp = vcp; - vcp->flags |= SMB_VCFLAG_ALREADYDEAD; - } - if (vcp->justLoggedOut) { - loggedOut = 1; - loggedOutTime = vcp->logoffTime; - loggedOutName = strdup(vcp->justLoggedOut->unp->name); - loggedOutUserp = vcp->justLoggedOut; - lock_ObtainWrite(&smb_rctLock); - loggedOutUserp->refCount++; - lock_ReleaseWrite(&smb_rctLock); - } - } - goto doneWithNCB; - - case NRC_INCOMP: - /* Treat as transient error */ - { -#ifndef DJGPP - EVENT_HANDLE h; - char *ptbuf[1]; - char s[100]; - - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "SMB message incomplete, length %d", - ncbp->ncb_length); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, - 1001, NULL, 1, - ncbp->ncb_length, ptbuf, - bufp); - DeregisterEventSource(h); -#endif /* !DJGPP */ - osi_Log1(smb_logp, - "dispatch smb recv failed, message incomplete, ncb_length %d", - ncbp->ncb_length); - osi_Log1(smb_logp, - "SMB message incomplete, " - "length %d", ncbp->ncb_length); - - /* - * We used to discard the packet. - * Instead, try handling it normally. - * - continue; - */ - break; - } - - default: - /* A weird error code. Log it, sleep, and - * continue. */ - if (vcp && vcp->errorCount++ > 3) { - osi_Log2(smb_logp, "session [ %d ] closed, vcp->errorCount = %d", idx_session, vcp->errorCount); - dead_sessions[idx_session] = TRUE; - } - else { - thrd_Sleep(1000); - thrd_SetEvent(SessionEvents[idx_session]); - } - continue; - } - - /* Success, so now dispatch on all the data in the packet */ - - smb_concurrentCalls++; - if (smb_concurrentCalls > smb_maxObsConcurrentCalls) - smb_maxObsConcurrentCalls = smb_concurrentCalls; - - if (vcp) - smb_ReleaseVC(vcp); - vcp = smb_FindVC(ncbp->ncb_lsn, 0, ncbp->ncb_lana_num); - /* - * If at this point vcp is NULL (implies that packet was invalid) - * then we are in big trouble. This means either : - * a) we have the wrong NCB. - * b) Netbios screwed up the call. - * Obviously this implies that - * ( LSNs[idx_session] != ncbp->ncb_lsn || - * lanas[idx_session] != ncbp->ncb_lana_num ) - * Either way, we can't do anything with this packet. - * Log, sleep and resume. - */ - if (!vcp) { - HANDLE h; - char buf[1000]; - char *ptbuf[1]; - - sprintf(buf, - "Bad vcp!! : " - "LSNs[idx_session]=[%d]," - "lanas[idx_session]=[%d]," - "ncbp->ncb_lsn=[%d]," - "ncbp->ncb_lana_num=[%d]", - LSNs[idx_session], - lanas[idx_session], - ncbp->ncb_lsn, - ncbp->ncb_lana_num); - - ptbuf[0] = buf; - - h = RegisterEventSource(NULL,AFS_DAEMON_EVENT_NAME); - if (h) { - ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1001, NULL,1,sizeof(*ncbp),ptbuf,(void*)ncbp); - DeregisterEventSource(h); - } - - /* Also log in the trace log. */ - osi_Log4(smb_logp, "Server: BAD VCP!" - "LSNs[idx_session]=[%d]," - "lanas[idx_session]=[%d]," - "ncbp->ncb_lsn=[%d]," - "ncbp->ncb_lana_num=[%d]", - LSNs[idx_session], - lanas[idx_session], - ncbp->ncb_lsn, - ncbp->ncb_lana_num); - - /* thrd_Sleep(1000); Don't bother sleeping */ - thrd_SetEvent(SessionEvents[idx_session]); - smb_concurrentCalls--; - continue; - } - - - vcp->errorCount = 0; - bufp = (struct smb_packet *) ncbp->ncb_buffer; -#ifdef DJGPP - bufp = ((smb_ncb_t *) ncbp)->orig_pkt; - /* copy whole packet to virtual memory */ - /*fprintf(stderr, "smb_Server: copying dos packet at 0x%x, " - "bufp=0x%x\n", - bufp->dos_pkt / 16, bufp);*/ - fflush(stderr); - dosmemget(bufp->dos_pkt, ncbp->ncb_length, bufp->data); -#endif /* DJGPP */ - smbp = (smb_t *)bufp->data; - outbufp->flags = 0; - -#if !defined(DJGPP) && !defined(AFS_WIN32_ENV) - __try - { -#endif - if (smbp->com == 0x1d) { - /* Special handling for Write Raw */ - raw_write_cont_t rwc; - EVENT_HANDLE rwevent; - char eventName[MAX_PATH]; - - smb_DispatchPacket(vcp, bufp, outbufp, ncbp, &rwc); - if (rwc.code == 0) { - rwevent = thrd_CreateEvent(NULL, FALSE, FALSE, TEXT("smb_Server() rwevent")); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - osi_Log1(smb_logp, "Event Object Already Exists: %s", osi_LogSaveString(smb_logp, eventName)); - ncbp->ncb_command = NCBRECV | ASYNCH; - ncbp->ncb_lsn = (unsigned char) vcp->lsn; - ncbp->ncb_lana_num = vcp->lana; - ncbp->ncb_buffer = rwc.buf; - ncbp->ncb_length = 65535; - ncbp->ncb_event = rwevent; -#ifndef DJGPP - Netbios(ncbp); -#else - Netbios(ncbp, dos_ncb); -#endif /* !DJGPP */ - rcode = thrd_WaitForSingleObject_Event(rwevent, RAWTIMEOUT); - thrd_CloseHandle(rwevent); - } - thrd_SetEvent(SessionEvents[idx_session]); - if (rwc.code == 0) - smb_CompleteWriteRaw(vcp, bufp, outbufp, ncbp, &rwc); - } - else if (smbp->com == 0xa0) { - /* - * Serialize the handling for NT Transact - * (defect 11626) - */ - smb_DispatchPacket(vcp, bufp, outbufp, ncbp, NULL); - thrd_SetEvent(SessionEvents[idx_session]); - } else { - thrd_SetEvent(SessionEvents[idx_session]); - /* TODO: what else needs to be serialized? */ - smb_DispatchPacket(vcp, bufp, outbufp, ncbp, NULL); - } -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - } - __except( smb_ServerExceptionFilter() ) { - } -#endif - - smb_concurrentCalls--; - - doneWithNCB: - thrd_SetEvent(NCBavails[idx_NCB]); - } - if (vcp) - smb_ReleaseVC(vcp); -} - -/* - * Exception filter for the server threads. If an exception occurs in the - * dispatch routines, which is where exceptions are most common, then do a - * force trace and give control to upstream exception handlers. Useful for - * debugging. - */ -#if !defined(DJGPP) && !defined(AFS_WIN95_ENV) -DWORD smb_ServerExceptionFilter(void) { - /* While this is not the best time to do a trace, if it succeeds, then - * we have a trace (assuming tracing was enabled). Otherwise, this should - * throw a second exception. - */ - HANDLE h; - char *ptbuf[1]; - - ptbuf[0] = "Unhandled exception forcing trace"; - - h = RegisterEventSource(NULL,AFS_DAEMON_EVENT_NAME); - if(h) { - ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1001, NULL,1,0,ptbuf,NULL); - DeregisterEventSource(h); - } - - afsd_ForceTrace(TRUE); - buf_ForceTrace(TRUE); - return EXCEPTION_CONTINUE_SEARCH; -} -#endif - -/* - * Create a new NCB and associated events, packet buffer, and "space" buffer. - * If the number of server threads is M, and the number of live sessions is - * N, then the number of NCB's in use at any time either waiting for, or - * holding, received messages is M + N, so that is how many NCB's get created. - */ -void InitNCBslot(int idx) -{ - struct smb_packet *bufp; - EVENT_HANDLE retHandle; - int i; - char eventName[MAX_PATH]; - - osi_assert( idx < (sizeof(NCBs) / sizeof(NCBs[0])) ); - - NCBs[idx] = GetNCB(); - sprintf(eventName,"NCBavails[%d]", idx); - NCBavails[idx] = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - osi_Log1(smb_logp, "Event Object Already Exists: %s", osi_LogSaveString(smb_logp, eventName)); -#ifndef DJGPP - sprintf(eventName,"NCBevents[%d]", idx); - NCBevents[idx] = thrd_CreateEvent(NULL, TRUE, FALSE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - osi_Log1(smb_logp, "Event Object Already Exists: %s", osi_LogSaveString(smb_logp, eventName)); -#endif /* !DJGPP */ - sprintf(eventName,"NCBReturns[0<=ispacep = cm_GetSpace(); - bufs[idx] = bufp; -} - -/* listen for new connections */ -void smb_Listener(void *parmp) -{ - NCB *ncbp; - long code = 0; - long len; - long i, j; - smb_vc_t *vcp = 0; - int flags = 0; - char rname[NCBNAMSZ+1]; - char cname[MAX_COMPUTERNAME_LENGTH+1]; - int cnamelen = MAX_COMPUTERNAME_LENGTH+1; -#ifdef DJGPP - dos_ptr dos_ncb; - time_t now; -#endif /* DJGPP */ - int lana = (int) parmp; - - ncbp = GetNCB(); -#ifdef DJGPP - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; -#endif /* DJGPP */ - - /* retrieve computer name */ - GetComputerName(cname, &cnamelen); - _strupr(cname); - - while (1) { - memset(ncbp, 0, sizeof(NCB)); - flags = 0; - - ncbp->ncb_command = NCBLISTEN; - ncbp->ncb_rto = 0; /* No receive timeout */ - ncbp->ncb_sto = 0; /* No send timeout */ - - /* pad out with spaces instead of null termination */ - len = strlen(smb_localNamep); - strncpy(ncbp->ncb_name, smb_localNamep, NCBNAMSZ); - for (i=len; incb_name[i] = ' '; - - strcpy(ncbp->ncb_callname, "*"); - for (i=1; incb_callname[i] = ' '; - - ncbp->ncb_lana_num = lana; - -#ifndef DJGPP - code = Netbios(ncbp); -#else /* DJGPP */ - code = Netbios(ncbp, dos_ncb); -#endif - - if (code != 0) - { -#ifndef DJGPP - char tbuffer[256]; -#endif - - /* terminate silently if shutdown flag is set */ - if (smbShutdownFlag == 1) { -#ifndef DJGPP - ExitThread(1); -#else - thrd_Exit(1); -#endif - } - - osi_Log2(smb_logp, - "NCBLISTEN lana=%d failed with code %d", - ncbp->ncb_lana_num, code); - osi_Log0(smb_logp, - "Client exiting due to network failure. Please restart client.\n"); - -#ifndef DJGPP - sprintf(tbuffer, - "Client exiting due to network failure. Please restart client.\n" - "NCBLISTEN lana=%d failed with code %d", - ncbp->ncb_lana_num, code); - if (showErrors) - code = (*smb_MBfunc)(NULL, tbuffer, "AFS Client Service: Fatal Error", - MB_OK|MB_SERVICE_NOTIFICATION); - osi_assert(tbuffer); - ExitThread(1); -#else - fprintf(stderr, "NCBLISTEN lana=%d failed with code %d\n", - ncbp->ncb_lana_num, code); - fprintf(stderr, "\nClient exiting due to network failure " - "(possibly due to power-saving mode)\n"); - fprintf(stderr, "Please restart client.\n"); - afs_exit(AFS_EXITCODE_NETWORK_FAILURE); -#endif /* !DJGPP */ - } - - /* check for remote conns */ - /* first get remote name and insert null terminator */ - memcpy(rname, ncbp->ncb_callname, NCBNAMSZ); - for (i=NCBNAMSZ; i>0; i--) { - if (rname[i-1] != ' ' && rname[i-1] != 0) { - rname[i] = 0; - break; - } - } - - /* compare with local name */ - if (!isGateway) - if (strncmp(rname, cname, NCBNAMSZ) != 0) - flags |= SMB_VCFLAG_REMOTECONN; - - osi_Log1(smb_logp, "New session lsn %d", ncbp->ncb_lsn); - /* lock */ - lock_ObtainMutex(&smb_ListenerLock); - - /* New generation */ - sessionGen++; - - /* Log session startup */ -#ifdef NOTSERVICE - fprintf(stderr, "New session(ncb_lsn,ncb_lana_num) %d,%d starting from host " - "%s\n", - ncbp->ncb_lsn,ncbp->ncb_lana_num, rname); -#endif /* NOTSERVICE */ - osi_Log4(smb_logp, "New session(ncb_lsn,ncb_lana_num) (%d,%d) starting from host %s, %d ongoing ops", - ncbp->ncb_lsn,ncbp->ncb_lana_num, osi_LogSaveString(smb_logp, rname), ongoingOps); - - if (reportSessionStartups) { -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - char s[100]; - - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - sprintf(s, "SMB session startup, %d ongoing ops", ongoingOps); - ptbuf[0] = s; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1004, NULL, - 1, 0, ptbuf, NULL); - DeregisterEventSource(h); -#else /* DJGPP */ - time(&now); - fprintf(stderr, "%s: New session %d starting from host %s\n", - asctime(localtime(&now)), ncbp->ncb_lsn, rname); - fflush(stderr); -#endif /* !DJGPP */ - } - osi_Log1(smb_logp, "NCBLISTEN completed, call from %s", osi_LogSaveString(smb_logp, rname)); - osi_Log1(smb_logp, "SMB session startup, %d ongoing ops", - ongoingOps); - - /* now ncbp->ncb_lsn is the connection ID */ - vcp = smb_FindVC(ncbp->ncb_lsn, SMB_FLAG_CREATE, ncbp->ncb_lana_num); - vcp->flags |= flags; - strcpy(vcp->rname, rname); - - /* Allocate slot in session arrays */ - /* Re-use dead session if possible, otherwise add one more */ - /* But don't look at session[0], it is reserved */ - for (i = 1; i < numSessions; i++) { - if (dead_sessions[i]) { - osi_Log1(smb_logp, "connecting to dead session [ %d ]", i); - dead_sessions[i] = FALSE; - break; - } - } - - if (i >= Sessionmax - 1 || numNCBs >= NCBmax - 1) { - unsigned long code = CM_ERROR_ALLBUSY; - smb_packet_t * outp = GetPacket(); - unsigned char *outWctp; - smb_t *smbp; - - outp->ncbp = ncbp; - - if (vcp->flags & SMB_VCFLAG_STATUS32) { - unsigned long NTStatus; - smb_MapNTError(code, &NTStatus); - outWctp = outp->wctp; - smbp = (smb_t *) &outp->data; - *outWctp++ = 0; - *outWctp++ = 0; - *outWctp++ = 0; - smbp->rcls = (unsigned char) (NTStatus & 0xff); - smbp->reh = (unsigned char) ((NTStatus >> 8) & 0xff); - smbp->errLow = (unsigned char) ((NTStatus >> 16) & 0xff); - smbp->errHigh = (unsigned char) ((NTStatus >> 24) & 0xff); - smbp->flg2 |= SMB_FLAGS2_32BIT_STATUS; - } else { - unsigned short errCode; - unsigned char errClass; - smb_MapCoreError(code, vcp, &errCode, &errClass); - outWctp = outp->wctp; - smbp = (smb_t *) &outp->data; - *outWctp++ = 0; - *outWctp++ = 0; - *outWctp++ = 0; - smbp->errLow = (unsigned char) (errCode & 0xff); - smbp->errHigh = (unsigned char) ((errCode >> 8) & 0xff); - smbp->rcls = errClass; - } - smb_SendPacket(vcp, outp); - smb_FreePacket(outp); - } else { - /* assert that we do not exceed the maximum number of sessions or NCBs. - * we should probably want to wait for a session to be freed in case - * we run out. - */ - osi_assert(i < Sessionmax - 1); - osi_assert(numNCBs < NCBmax - 1); /* if we pass this test we can allocate one more */ - - LSNs[i] = ncbp->ncb_lsn; - lanas[i] = ncbp->ncb_lana_num; - - if (i == numSessions) { - /* Add new NCB for new session */ - char eventName[MAX_PATH]; - - osi_Log1(smb_logp, "smb_Listener creating new session %d", i); - - InitNCBslot(numNCBs); - numNCBs++; - thrd_SetEvent(NCBavails[0]); - thrd_SetEvent(NCBevents[0]); - for (j = 0; j < smb_NumServerThreads; j++) - thrd_SetEvent(NCBreturns[j][0]); - /* Also add new session event */ - sprintf(eventName, "SessionEvents[%d]", i); - SessionEvents[i] = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - osi_Log1(smb_logp, "Event Object Already Exists: %s", osi_LogSaveString(smb_logp, eventName)); - numSessions++; - osi_Log2(smb_logp, "increasing numNCBs [ %d ] numSessions [ %d ]", numNCBs, numSessions); - thrd_SetEvent(SessionEvents[0]); - } else { - thrd_SetEvent(SessionEvents[i]); - } - } - - smb_ReleaseVC(vcp); - - /* unlock */ - lock_ReleaseMutex(&smb_ListenerLock); - } /* dispatch while loop */ -} - -/* initialize Netbios */ -void smb_NetbiosInit() -{ - NCB *ncbp; -#ifdef DJGPP - dos_ptr dos_ncb; -#endif /* DJGPP */ - int i, lana, code, l; - char s[100]; - int delname_tried=0; - int len; - int lana_found = 0; - OSVERSIONINFO Version; - - /* Get the version of Windows */ - memset(&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - GetVersionEx(&Version); - - /* setup the NCB system */ - ncbp = GetNCB(); -#ifdef DJGPP - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; -#endif /* DJGPP */ - -#ifndef DJGPP - if (smb_LANadapter == -1) { - ncbp->ncb_command = NCBENUM; - ncbp->ncb_buffer = (PUCHAR)&lana_list; - ncbp->ncb_length = sizeof(lana_list); - code = Netbios(ncbp); - if (code != 0) { - osi_Log1(smb_logp, "Netbios NCBENUM error code %d", code); - osi_panic(s, __FILE__, __LINE__); - } - } - else { - lana_list.length = 1; - lana_list.lana[0] = smb_LANadapter; - } - - for (i = 0; i < lana_list.length; i++) { - /* reset the adaptor: in Win32, this is required for every process, and - * acts as an init call, not as a real hardware reset. - */ - ncbp->ncb_command = NCBRESET; - ncbp->ncb_callname[0] = 100; - ncbp->ncb_callname[2] = 100; - ncbp->ncb_lana_num = lana_list.lana[i]; - code = Netbios(ncbp); - if (code == 0) - code = ncbp->ncb_retcode; - if (code != 0) { - osi_Log2(smb_logp, "Netbios NCBRESET lana %d error code %d", lana_list.lana[i], code); - lana_list.lana[i] = 255; /* invalid lana */ - } else { - osi_Log1(smb_logp, "Netbios NCBRESET lana %d succeeded", lana_list.lana[i]); - } - } -#else - /* for DJGPP, there is no NCBENUM and NCBRESET is a real reset. so - we will just fake the LANA list */ - if (smb_LANadapter == -1) { - for (i = 0; i < 8; i++) - lana_list.lana[i] = i; - lana_list.length = 8; - } - else { - lana_list.length = 1; - lana_list.lana[0] = smb_LANadapter; - } -#endif /* !DJGPP */ - - /* and declare our name so we can receive connections */ - memset(ncbp, 0, sizeof(*ncbp)); - len=lstrlen(smb_localNamep); - memset(smb_sharename,' ',NCBNAMSZ); - memcpy(smb_sharename,smb_localNamep,len); - osi_Log1(smb_logp, "lana_list.length %d", lana_list.length); - - /* Keep the name so we can unregister it later */ - for (l = 0; l < lana_list.length; l++) { - lana = lana_list.lana[l]; - - ncbp->ncb_command = NCBADDNAME; - ncbp->ncb_lana_num = lana; - memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); -#ifndef DJGPP - code = Netbios(ncbp); -#else /* DJGPP */ - code = Netbios(ncbp, dos_ncb); -#endif /* !DJGPP */ - - osi_Log4(smb_logp, "Netbios NCBADDNAME lana=%d code=%d retcode=%d complete=%d", - lana, code, ncbp->ncb_retcode, ncbp->ncb_cmd_cplt); - { - char name[NCBNAMSZ+1]; - name[NCBNAMSZ]=0; - memcpy(name,ncbp->ncb_name,NCBNAMSZ); - osi_Log1(smb_logp, "Netbios NCBADDNAME added new name >%s<",osi_LogSaveString(smb_logp, name)); - } - - if (code == 0) code = ncbp->ncb_retcode; - if (code == 0) { - osi_Log1(smb_logp, "Netbios NCBADDNAME succeeded on lana %d\n", lana); -#ifdef DJGPP - /* we only use one LANA with djgpp */ - lana_list.lana[0] = lana; - lana_list.length = 1; -#endif - } - else { - osi_Log2(smb_logp, "Netbios NCBADDNAME lana %d error code %d", lana, code); - if (code == NRC_BRIDGE) { /* invalid LANA num */ - lana_list.lana[l] = 255; - continue; - } - else if (code == NRC_DUPNAME) { - osi_Log0(smb_logp, "Name already exists; try to delete it"); - memset(ncbp, 0, sizeof(*ncbp)); - ncbp->ncb_command = NCBDELNAME; - memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); - ncbp->ncb_lana_num = lana; -#ifndef DJGPP - code = Netbios(ncbp); -#else - code = Netbios(ncbp, dos_ncb); -#endif /* DJGPP */ - if (code == 0) - code = ncbp->ncb_retcode; - else { - osi_Log2(smb_logp, "Netbios NCBDELNAME lana %d error code %d\n", lana, code); - } - if (code != 0 || delname_tried) { - lana_list.lana[l] = 255; - } - else if (code == 0) { - if (!delname_tried) { - lana--; - delname_tried = 1; - continue; - } - } - } - else { - osi_Log2(smb_logp, "Netbios NCBADDNAME lana %d error code %d", lana, code); - lana_list.lana[l] = 255; /* invalid lana */ - osi_panic(s, __FILE__, __LINE__); - } - } - if (code == 0) { - lana_found = 1; /* at least one worked */ -#ifdef DJGPP - break; -#endif - } - } - - osi_assert(lana_list.length >= 0); - if (!lana_found) { - osi_panic("No valid LANA numbers found!", __FILE__, __LINE__); - } - - /* we're done with the NCB now */ - FreeNCB(ncbp); -} - -void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt, - int nThreads -#ifndef DJGPP - , void *aMBfunc -#endif - ) - -{ - thread_t phandle; - int lpid; - int i; - int len; - struct tm myTime; -#ifdef DJGPP - int npar, seg, sel; - dos_ptr rawBuf; -#endif /* DJGPP */ - EVENT_HANDLE retHandle; - char eventName[MAX_PATH]; - -#ifndef DJGPP - smb_MBfunc = aMBfunc; -#endif /* DJGPP */ - - smb_useV3 = useV3; - smb_LANadapter = LANadapt; - - /* Initialize smb_localZero */ - myTime.tm_isdst = -1; /* compute whether on DST or not */ - myTime.tm_year = 70; - myTime.tm_mon = 0; - myTime.tm_mday = 1; - myTime.tm_hour = 0; - myTime.tm_min = 0; - myTime.tm_sec = 0; - smb_localZero = mktime(&myTime); - -#ifndef USE_NUMERIC_TIME_CONV - /* Initialize kludge-GMT */ - smb_CalculateNowTZ(); -#endif /* USE_NUMERIC_TIME_CONV */ -#ifdef AFS_FREELANCE_CLIENT - /* Make sure the root.afs volume has the correct time */ - cm_noteLocalMountPointChange(); -#endif - - /* initialize the remote debugging log */ - smb_logp = logp; - - /* remember the name */ - len = strlen(snamep); - smb_localNamep = malloc(len+1); - strcpy(smb_localNamep, snamep); - afsi_log("smb_localNamep is >%s<", smb_localNamep); - - /* and the global lock */ - lock_InitializeRWLock(&smb_globalLock, "smb global lock"); - lock_InitializeRWLock(&smb_rctLock, "smb refct and tree struct lock"); - - /* Raw I/O data structures */ - lock_InitializeMutex(&smb_RawBufLock, "smb raw buffer lock"); - - lock_InitializeMutex(&smb_ListenerLock, "smb listener lock"); - - /* 4 Raw I/O buffers */ -#ifndef DJGPP - smb_RawBufs = calloc(65536,1); - *((char **)smb_RawBufs) = NULL; - for (i=0; i<3; i++) { - char *rawBuf = calloc(65536,1); - *((char **)rawBuf) = smb_RawBufs; - smb_RawBufs = rawBuf; - } -#else /* DJGPP */ - npar = 65536 >> 4; /* number of paragraphs */ - seg = __dpmi_allocate_dos_memory(npar, &smb_RawBufSel[0]); - if (seg == -1) { - afsi_log("Cannot allocate %d paragraphs of DOS memory", - npar); - osi_panic("",__FILE__,__LINE__); - } - else { - afsi_log("Allocated %d paragraphs of DOS mem at 0x%X", - npar, seg); - } - smb_RawBufs = (seg * 16) + 0; /* DOS physical address */ - - _farpokel(_dos_ds, smb_RawBufs, NULL); - for (i=0; i> 4; /* number of paragraphs */ - seg = __dpmi_allocate_dos_memory(npar, &smb_RawBufSel[i+1]); - if (seg == -1) { - afsi_log("Cannot allocate %d paragraphs of DOS memory", - npar); - osi_panic("",__FILE__,__LINE__); - } - else { - afsi_log("Allocated %d paragraphs of DOS mem at 0x%X", - npar, seg); - } - rawBuf = (seg * 16) + 0; /* DOS physical address */ - /*_farpokel(_dos_ds, smb_RawBufs, smb_RawBufs);*/ - _farpokel(_dos_ds, rawBuf, smb_RawBufs); - smb_RawBufs = rawBuf; - } -#endif /* !DJGPP */ - - /* global free lists */ - smb_ncbFreeListp = NULL; - smb_packetFreeListp = NULL; - - smb_NetbiosInit(); - - /* Initialize listener and server structures */ - numVCs = 0; - memset(dead_sessions, 0, sizeof(dead_sessions)); - sprintf(eventName, "SessionEvents[0]"); - SessionEvents[0] = thrd_CreateEvent(NULL, FALSE, FALSE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", eventName); - numSessions = 1; - smb_NumServerThreads = nThreads; - sprintf(eventName, "NCBavails[0]"); - NCBavails[0] = thrd_CreateEvent(NULL, FALSE, FALSE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", eventName); - sprintf(eventName, "NCBevents[0]"); - NCBevents[0] = thrd_CreateEvent(NULL, FALSE, FALSE, eventName); - if ( GetLastError() == ERROR_ALREADY_EXISTS ) - afsi_log("Event Object Already Exists: %s", eventName); - NCBreturns = malloc(smb_NumServerThreads * sizeof(EVENT_HANDLE *)); - sprintf(eventName, "NCBreturns[0<=idos_ncb; -#endif - - /* Block new sessions by setting shutdown flag */ - smbShutdownFlag = 1; - - /* Hang up all sessions */ - memset((char *)ncbp, 0, sizeof(NCB)); - for (i = 1; i < numSessions; i++) - { - if (dead_sessions[i]) - continue; - - /*fprintf(stderr, "NCBHANGUP session %d LSN %d\n", i, LSNs[i]);*/ - ncbp->ncb_command = NCBHANGUP; - ncbp->ncb_lana_num = lanas[i]; /*smb_LANadapter;*/ - ncbp->ncb_lsn = LSNs[i]; -#ifndef DJGPP - code = Netbios(ncbp); -#else - code = Netbios(ncbp, dos_ncb); -#endif - /*fprintf(stderr, "returned from NCBHANGUP session %d LSN %d\n", i, LSNs[i]);*/ - if (code == 0) code = ncbp->ncb_retcode; - if (code != 0) { - osi_Log1(smb_logp, "Netbios NCBHANGUP error code %d", code); - fprintf(stderr, "Session %d Netbios NCBHANGUP error code %d", i, code); - } - } - - /* Trigger the shutdown of all SMB threads */ - for (i = 0; i < smb_NumServerThreads; i++) - thrd_SetEvent(NCBreturns[i][0]); - - thrd_SetEvent(NCBevents[0]); - thrd_SetEvent(SessionEvents[0]); - thrd_SetEvent(NCBavails[0]); - - for (i = 0;i < smb_NumServerThreads; i++) { - DWORD code = thrd_WaitForSingleObject_Event(smb_ServerShutdown[i], 500); - if (code == WAIT_OBJECT_0) { - continue; - } else { - afsi_log("smb_Shutdown thread [%d] did not stop; retry ...",i); - thrd_SetEvent(NCBreturns[i--][0]); - } - } - - /* Delete Netbios name */ - memset((char *)ncbp, 0, sizeof(NCB)); - for (i = 0; i < lana_list.length; i++) { - if (lana_list.lana[i] == 255) continue; - ncbp->ncb_command = NCBDELNAME; - ncbp->ncb_lana_num = lana_list.lana[i]; - memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); -#ifndef DJGPP - code = Netbios(ncbp); -#else - code = Netbios(ncbp, dos_ncb); -#endif - if (code == 0) - code = ncbp->ncb_retcode; - if (code != 0) { - fprintf(stderr, "Netbios NCBDELNAME lana %d error code %d", - ncbp->ncb_lana_num, code); - } - fflush(stderr); - } - - /* Release the reference counts held by the VCs */ - lock_ObtainWrite(&smb_rctLock); - for (vcp = smb_allVCsp; vcp; vcp=vcp->nextp) - { - smb_fid_t *fidp; - smb_tid_t *tidp; - - for (fidp = vcp->fidsp; fidp; fidp = (smb_fid_t *) osi_QNext(&fidp->q)) - { - if (fidp->scp != NULL) { - cm_scache_t * scp; - - lock_ObtainMutex(&fidp->mx); - if (fidp->scp != NULL) { - scp = fidp->scp; - fidp->scp = NULL; - cm_ReleaseSCache(scp); - } - lock_ReleaseMutex(&fidp->mx); - } - } - - for (tidp = vcp->tidsp; tidp; tidp = tidp->nextp) { - if (tidp->vcp) - smb_ReleaseVCNoLock(tidp->vcp); - if (tidp->userp) { - cm_user_t *userp = tidp->userp; - tidp->userp = NULL; - lock_ReleaseWrite(&smb_rctLock); - cm_ReleaseUser(userp); - lock_ObtainWrite(&smb_rctLock); - } - } - } - lock_ReleaseWrite(&smb_rctLock); -} - -/* Get the UNC \\\ prefix. */ -char *smb_GetSharename() -{ - char *name; - - /* Make sure we have been properly initialized. */ - if (smb_localNamep == NULL) - return NULL; - - /* Allocate space for \\\, plus the - * terminator. - */ - name = malloc(strlen(smb_localNamep) + strlen("ALL") + 4); - sprintf(name, "\\\\%s\\%s", smb_localNamep, "ALL"); - return name; -} - - -#ifdef LOG_PACKET -void smb_LogPacket(smb_packet_t *packet) -{ - BYTE *vp, *cp; - unsigned length, paramlen, datalen, i, j; - char buf[81]; - char hex[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; - - if (!packet) return; - - osi_Log0(smb_logp, "*** SMB packet dump ***"); - - vp = (BYTE *) packet->data; - - datalen = *((WORD*)(vp + (paramlen = ((unsigned)*(vp+20)) << 1))); - length = paramlen + 2 + datalen; - - - for (i=0;i < length; i+=16) - { - memset( buf, ' ', 80 ); - buf[80] = 0; - - itoa( i, buf, 16 ); - - buf[strlen(buf)] = ' '; - - cp = (BYTE*) buf + 7; - - for (j=0;j < 16 && (i+j)> 4]; - *(cp++) = hex[vp[i+j] & 0xf]; - *(cp++) = ' '; - - if (j==7) - { - *(cp++) = '-'; - *(cp++) = ' '; - } - } - - for (j=0;j < 16 && (i+j) vp[i+j] )? vp[i+j]:'.'; - if (j==7) - { - *(cp++) = ' '; - *(cp++) = '-'; - *(cp++) = ' '; - } - } - - *cp = 0; - - osi_Log0( smb_logp, osi_LogSaveString(smb_logp, buf)); - } - - osi_Log0(smb_logp, "*** End SMB packet dump ***"); -} -#endif /* LOG_PACKET */ - - -int smb_DumpVCP(FILE *outputFile, char *cookie, int lock) -{ - int zilch; - char output[1024]; - - smb_vc_t *vcp; - - if (lock) - lock_ObtainRead(&smb_rctLock); - - sprintf(output, "begin dumping smb_vc_t\n"); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - for (vcp = smb_allVCsp; vcp; vcp=vcp->nextp) - { - smb_fid_t *fidp; - - sprintf(output, "%s vcp=0x%08X, refCount=%d, flags=%d, vcID=%d, lsn=%d, uidCounter=%d, tidCounter=%d, fidCounter=%d\n", - cookie, vcp, vcp->refCount, vcp->flags, vcp->vcID, vcp->lsn, vcp->uidCounter, vcp->tidCounter, vcp->fidCounter); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - sprintf(output, "begin dumping smb_fid_t\n"); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - for (fidp = vcp->fidsp; fidp; fidp = (smb_fid_t *) osi_QNext(&fidp->q)) - { - sprintf(output, "%s -- smb_fidp=0x%08X, refCount=%d, fid=%d, vcp=0x%08X, scp=0x%08X, ioctlp=0x%08X, NTopen_pathp=%s, NTopen_wholepathp=%s\n", - cookie, fidp, fidp->refCount, fidp->fid, fidp->vcp, fidp->scp, fidp->ioctlp, - fidp->NTopen_pathp ? fidp->NTopen_pathp : "NULL", - fidp->NTopen_wholepathp ? fidp->NTopen_wholepathp : "NULL"); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - } - - sprintf(output, "done dumping smb_fid_t\n"); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - } - - sprintf(output, "done dumping smb_vc_t\n"); - WriteFile(outputFile, output, strlen(output), &zilch, NULL); - - if (lock) - lock_ReleaseRead(&smb_rctLock); - return 0; -} diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h deleted file mode 100644 index 4a8e3cca0..000000000 --- a/src/WINNT/afsd/smb.h +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __SMB_H_ENV__ -#define __SMB_H_ENV__ 1 - -#ifdef DJGPP -#include "netbios95.h" -#endif /* DJGPP */ - -#include - -/* basic core protocol SMB structure */ -typedef struct smb { - unsigned char id[4]; - unsigned char com; - unsigned char rcls; - unsigned char reh; - unsigned char errLow; - unsigned char errHigh; - unsigned char reb; - unsigned short flg2; - unsigned short res[6]; - unsigned short tid; - unsigned short pid; - unsigned short uid; - unsigned short mid; - unsigned char wct; - unsigned char vdata[1]; -} smb_t; - - -/* reb values */ -#define SMB_FLAGS_SUPPORT_LOCKREAD 0x01 -#define SMB_FLAGS_CLIENT_BUF_AVAIL 0x02 -#define SMB_FLAGS_CASELESS_PATHNAMES 0x08 -#define SMB_FLAGS_CANONICAL_PATHNAMES 0x10 -#define SMB_FLAGS_REQUEST_OPLOCK 0x20 -#define SMB_FLAGS_REQUEST_BATCH_OPLOCK 0x40 -#define SMB_FLAGS_SERVER_TO_CLIENT 0x80 - -/* flg2 values */ - -#define SMB_FLAGS2_KNOWS_LONG_NAMES 0x0001 -#define SMB_FLAGS2_KNOWS_EAS 0x0002 -#define SMB_FLAGS2_SECURITY_SIGNATURE 0x0004 -#define SMB_FLAGS2_RESERVED1 0x0008 -#define SMB_FLAGS2_IS_LONG_NAME 0x0040 -#define SMB_FLAGS2_EXT_SEC 0x0800 -#define SMB_FLAGS2_DFS_PATHNAMES 0x1000 -#define SMB_FLAGS2_PAGING_IO 0x2000 -#define SMB_FLAGS2_32BIT_STATUS 0x4000 -#define SMB_FLAGS2_UNICODE 0x8000 - -#define KNOWS_LONG_NAMES(inp) ((((smb_t *)inp)->flg2 & SMB_FLAGS2_KNOWS_LONG_NAMES)?1:0) -#define WANTS_DFS_PATHNAMES(inp) ((((smb_t *)inp)->flg2 & SMB_FLAGS2_DFS_PATHNAMES)?1:0) - -/* Information Levels */ -#define SMB_INFO_STANDARD 1 -#define SMB_INFO_QUERY_EA_SIZE 2 -#define SMB_INFO_QUERY_EAS_FROM_LIST 3 -#define SMB_INFO_QUERY_ALL_EAS 4 -#define SMB_INFO_IS_NAME_VALID 6 - -#define SMB_QUERY_FILE_BASIC_INFO 0x101 -#define SMB_QUERY_FILE_STANDARD_INFO 0x102 -#define SMB_QUERY_FILE_EA_INFO 0x103 -#define SMB_QUERY_FILE_NAME_INFO 0x104 -#define SMB_QUERY_FILE_ALL_INFO 0x107 -#define SMB_QUERY_FILE_ALT_NAME_INFO 0x108 -#define SMB_QUERY_FILE_STREAM_INFO 0x109 -#define SMB_QUERY_FILE_COMPRESSION_INFO 0x10B -#define SMB_QUERY_FILE_UNIX_BASIC 0x200 -#define SMB_QUERY_FILE_UNIX_LINK 0x201 - -#define SMB_SET_FILE_UNIX_BASIC 0x200 -#define SMB_SET_FILE_UNIX_LINK 0x201 -#define SMB_SET_FILE_UNIX_HLINK 0x203 - -/* more defines */ -#define SMB_NOPCODES 256 /* # of opcodes in the dispatch table */ - -/* threads per VC */ -#define SMB_THREADSPERVC 4 /* threads per VC */ - -/* flags for functions */ -#define SMB_FLAG_CREATE 1 /* create the structure if necessary */ - -/* max # of bytes we'll receive in an incoming SMB message */ -/* the maximum is 2^18-1 for NBT and 2^25-1 for Raw transport messages */ -/* we will use something smaller but large enough to be efficient */ -#define SMB_PACKETSIZE 32768 /* was 8400 */ -/* raw mode is considered obsolete and cannot be used with message signing */ -#define SMB_MAXRAWSIZE 65536 - -/* Negotiate protocol constants */ -/* Security */ -#define NEGOTIATE_SECURITY_USER_LEVEL 0x01 -#define NEGOTIATE_SECURITY_CHALLENGE_RESPONSE 0x02 -#define NEGOTIATE_SECURITY_SIGNATURES_ENABLED 0x04 -#define NEGOTIATE_SECURITY_SIGNATURES_REQUIRED 0x08 - -/* Capabilities */ -#define NTNEGOTIATE_CAPABILITY_RAWMODE 0x00000001L -#define NTNEGOTIATE_CAPABILITY_MPXMODE 0x00000002L -#define NTNEGOTIATE_CAPABILITY_UNICODE 0x00000004L -#define NTNEGOTIATE_CAPABILITY_LARGEFILES 0x00000008L -#define NTNEGOTIATE_CAPABILITY_NTSMB 0x00000010L -#define NTNEGOTIATE_CAPABILITY_RPCAPI 0x00000020L -#define NTNEGOTIATE_CAPABILITY_NTSTATUS 0x00000040L -#define NTNEGOTIATE_CAPABILITY_LEVEL_II_OPLOCKS 0x00000080L -#define NTNEGOTIATE_CAPABILITY_LOCK_AND_READ 0x00000100L -#define NTNEGOTIATE_CAPABILITY_NTFIND 0x00000200L -#define NTNEGOTIATE_CAPABILITY_DFS 0x00001000L -#define NTNEGOTIATE_CAPABILITY_NT_INFO_PASSTHRU 0x00002000L -#define NTNEGOTIATE_CAPABILITY_LARGE_READX 0x00004000L -#define NTNEGOTIATE_CAPABILITY_LARGE_WRITEX 0x00008000L -#define NTNEGOTIATE_CAPABILITY_UNIX 0x00800000L -#define NTNEGOTIATE_CAPABILITY_BULK_TRANSFER 0x20000000L -#define NTNEGOTIATE_CAPABILITY_COMPRESSED 0x40000000L -#define NTNEGOTIATE_CAPABILITY_EXTENDED_SECURITY 0x80000000L - -/* a packet structure for receiving SMB messages; locked by smb_globalLock. - * Most of the work involved is in handling chained requests and responses. - * - * When handling input, inWctp points to the current request's wct field (and - * the other parameters and request data can be found from this field). The - * opcode, unfortunately, isn't available there, so is instead copied to the - * packet's inCom field. It is initially set to com, but each chained - * operation sets it, also. - * The function smb_AdvanceInput advances an input packet to the next request - * in the chain. The inCom field is set to 0xFF when there are no more - * requests. The inCount field is 0 if this is the first request, and - * otherwise counts which request it is. - * - * When handling output, we also have to chain all of the responses together. - * The function smb_GetResponsePacket will setup outWctp to point to the right - * place. - */ -#define SMB_PACKETMAGIC 0x7436353 /* magic # for packets */ -typedef struct smb_packet { - char data[SMB_PACKETSIZE]; - struct smb_packet *nextp; /* in free list, or whatever */ - long magic; - cm_space_t *spacep; /* use this for stripping last component */ - NCB *ncbp; /* use this for sending */ - struct smb_vc *vcp; - unsigned long resumeCode; - unsigned short inCount; - unsigned short fid; /* for calls bundled with openAndX */ - unsigned char *wctp; - unsigned char inCom; - unsigned char oddByte; - unsigned short ncb_length; - unsigned char flags; -#ifdef DJGPP - dos_ptr dos_pkt; - unsigned int dos_pkt_sel; -#endif /* DJGPP */ -} smb_packet_t; - -/* smb_packet flags */ -#define SMB_PACKETFLAG_PROFILE_UPDATE_OK 1 -#define SMB_PACKETFLAG_NOSEND 2 -#define SMB_PACKETFLAG_SUSPENDED 4 - -/* a structure for making Netbios calls; locked by smb_globalLock */ -#define SMB_NCBMAGIC 0x2334344 -typedef struct myncb { - NCB ncb; /* ncb to use */ - struct myncb *nextp; /* when on free list */ - long magic; -#ifdef DJGPP - dos_ptr dos_ncb; - smb_packet_t *orig_pkt; - unsigned int dos_ncb_sel; -#endif /* DJGPP */ -} smb_ncb_t; - -/* structures representing environments from kernel / SMB network. - * Most have their own locks, but the tree connection fields and - * reference counts are locked by the smb_rctLock. Those fields will - * be marked in comments. - */ - -/* one per virtual circuit */ -typedef struct smb_vc { - struct smb_vc *nextp; /* not used */ - unsigned long refCount; /* the reference count */ - long flags; /* the flags, if any; locked by mx */ - osi_mutex_t mx; /* the mutex */ - long vcID; /* VC id */ - unsigned short lsn; /* the NCB LSN associated with this */ - unsigned short uidCounter; /* session ID counter */ - unsigned short tidCounter; /* tree ID counter */ - unsigned short fidCounter; /* file handle ID counter */ - struct smb_tid *tidsp; /* the first child in the tid list */ - struct smb_user *usersp; /* the first child in the user session list */ - struct smb_fid *fidsp; /* the first child in the open file list */ - struct smb_user *justLoggedOut; /* ready for profile upload? */ - time_t logoffTime; /* tick count when logged off */ - unsigned char errorCount; - char rname[17]; - int lana; - char encKey[MSV1_0_CHALLENGE_LENGTH]; /* MSV1_0_CHALLENGE_LENGTH is 8 */ - void * secCtx; /* security context when negotiating SMB extended auth - * valid when SMB_VCFLAG_AUTH_IN_PROGRESS is set - */ -} smb_vc_t; - - /* have we negotiated ... */ -#define SMB_VCFLAG_USEV3 1 /* ... version 3 of the protocol */ -#define SMB_VCFLAG_USECORE 2 /* ... the core protocol */ -#define SMB_VCFLAG_USENT 4 /* ... NT LM 0.12 or beyond */ -#define SMB_VCFLAG_STATUS32 8 /* use 32-bit NT status codes */ -#define SMB_VCFLAG_REMOTECONN 0x10 /* bad: remote conns not allowed */ -#define SMB_VCFLAG_ALREADYDEAD 0x20 /* do not get tokens from this vc */ -#define SMB_VCFLAG_SESSX_RCVD 0x40 /* we received at least one session setups on this vc */ -#define SMB_VCFLAG_AUTH_IN_PROGRESS 0x80 /* a SMB NT extended authentication is in progress */ - -/* one per user session */ -typedef struct smb_user { - struct smb_user *nextp; /* next sibling */ - unsigned long refCount; /* ref count */ - long flags; /* flags; locked by mx */ - osi_mutex_t mx; - long userID; /* the session identifier */ - struct smb_vc *vcp; /* back ptr to virtual circuit */ - struct smb_username *unp; /* user name struct */ -} smb_user_t; - -typedef struct smb_username { - struct smb_username *nextp; /* next sibling */ - unsigned long refCount; /* ref count */ - long flags; /* flags; locked by mx */ - osi_mutex_t mx; - struct cm_user *userp; /* CM user structure */ - char *name; /* user name */ - char *machine; /* machine name */ -} smb_username_t; - -#define SMB_USERFLAG_DELETE 1 /* delete struct when ref count zero */ - -#define SMB_MAX_USERNAME_LENGTH 256 - -/* one per tree-connect */ -typedef struct smb_tid { - struct smb_tid *nextp; /* next sibling */ - unsigned long refCount; - long flags; - osi_mutex_t mx; /* for non-tree-related stuff */ - unsigned short tid; /* the tid */ - struct smb_vc *vcp; /* back ptr */ - struct cm_user *userp; /* user logged in at the - * tree connect level (base) */ - char *pathname; /* pathname derived from sharename */ -} smb_tid_t; - -#define SMB_TIDFLAG_DELETE 1 /* delete struct when ref count zero */ -#define SMB_TIDFLAG_IPC 2 /* IPC$ */ - -/* one per process ID */ -typedef struct smb_pid { - struct smb_pid *nextp; /* next sibling */ - unsigned long refCount; - long flags; - osi_mutex_t mx; /* for non-tree-related stuff */ - unsigned short pid; /* the pid */ - struct smb_tid *tidp; /* back ptr */ -} smb_pid_t; - -/* ioctl parameter, while being assembled and/or processed */ -typedef struct smb_ioctl { - /* input side */ - char *inDatap; /* ioctl func's current position - * in input parameter block */ - char *inAllocp; /* allocated input parameter block */ - long inCopied; /* # of input bytes copied in so far - * by write calls */ - cm_space_t *prefix; /* prefix for subst drives */ - char *tidPathp; /* Pathname associated with Tree ID */ - - /* output side */ - char *outDatap; /* output results assembled so far */ - char *outAllocp; /* output results assembled so far */ - long outCopied; /* # of output bytes copied back so far - * by read calls */ - - /* flags */ - long flags; - - /* fid pointer */ - struct smb_fid *fidp; - - /* uid pointer */ - smb_user_t *uidp; -} smb_ioctl_t; - -/* flags for smb_ioctl_t */ -#define SMB_IOCTLFLAG_DATAIN 1 /* reading data from client to server */ -#define SMB_IOCTLFLAG_LOGON 2 /* got tokens from integrated logon */ - -/* one per file ID; these are really file descriptors */ -typedef struct smb_fid { - osi_queue_t q; - unsigned long refCount; - unsigned long flags; - osi_mutex_t mx; /* for non-tree-related stuff */ - unsigned short fid; /* the file ID */ - struct smb_vc *vcp; /* back ptr */ - struct cm_scache *scp; /* scache of open file */ - long offset; /* our file pointer */ - smb_ioctl_t *ioctlp; /* ptr to ioctl structure */ - /* Under NT, we may need to know the - * parent directory and pathname used - * to open the file, either to delete - * the file on close, or to do a - * change notification */ - struct cm_scache *NTopen_dscp; /* parent directory (NT) */ - char *NTopen_pathp; /* path used in open (NT) */ - char *NTopen_wholepathp; /* entire path, not just last name */ - int curr_chunk; /* chunk being read */ - int prev_chunk; /* previous chunk read */ - int raw_writers; /* pending async raw writes */ - EVENT_HANDLE raw_write_event; /* signal this when raw_writers zero */ -} smb_fid_t; - -#define SMB_FID_OPENREAD 1 /* open for reading */ -#define SMB_FID_OPENWRITE 2 /* open for writing */ -#define SMB_FID_DELETE 4 /* delete struct on ref count 0 */ -#define SMB_FID_IOCTL 8 /* a file descriptor for the - * magic ioctl file */ -#define SMB_FID_OPENDELETE 0x10 /* open for deletion (NT) */ -#define SMB_FID_DELONCLOSE 0x20 /* marked for deletion */ -/* - * Now some special flags to work around a bug in NT Client - */ -#define SMB_FID_LENGTHSETDONE 0x40 /* have done 0-length write */ -#define SMB_FID_MTIMESETDONE 0x80 /* have set modtime via Tr2 */ -#define SMB_FID_LOOKSLIKECOPY (SMB_FID_LENGTHSETDONE | SMB_FID_MTIMESETDONE) -#define SMB_FID_NTOPEN 0x100 /* have dscp and pathp */ - -/* - * SMB file attributes (32-bit) - */ -#define SMB_ATTR_READONLY 0x0001 -#define SMB_ATTR_HIDDEN 0x0002 /* hidden file for the purpose of dir listings */ -#define SMB_ATTR_SYSTEM 0x0004 -#define SMB_ATTR_VOLUMEID 0x0008 /* obsolete */ -#define SMB_ATTR_DIRECTORY 0x0010 -#define SMB_ATTR_ARCHIVE 0x0020 -#define SMB_ATTR_DEVICE 0x0040 -#define SMB_ATTR_NORMAL 0x0080 /* normal file. Only valid if used alone */ -#define SMB_ATTR_TEMPORARY 0x0100 -#define SMB_ATTR_SPARSE_FILE 0x0200 /* used with dfs links */ -#define SMB_ATTR_REPARSE_POINT 0x0400 -#define SMB_ATTR_COMPRESSED 0x0800 /* file or dir is compressed */ -#define SMB_ATTR_OFFLINE 0x1000 -#define SMB_ATTR_NOT_CONTENT_INDEXED 0x2000 -#define SMB_ATTR_ENCRYPTED 0x4000 - -#define LOCKING_ANDX_SHARED_LOCK 0x01 /* Read-only lock */ -#define LOCKING_ANDX_OPLOCK_RELEASE 0x02 /* Oplock break notification */ -#define LOCKING_ANDX_CHANGE_LOCKTYPE 0x04 /* Change lock type */ -#define LOCKING_ANDX_CANCEL_LOCK 0x08 /* Cancel outstanding request */ -#define LOCKING_ANDX_LARGE_FILES 0x10 /* Large file locking format */ - -/* for tracking in-progress directory searches */ -typedef struct smb_dirSearch { - osi_queue_t q; /* queue of all outstanding cookies */ - osi_mutex_t mx; /* just in case the caller screws up */ - unsigned long refCount; /* reference count */ - long cookie; /* value returned to the caller */ - struct cm_scache *scp; /* vnode of the dir we're searching */ - unsigned long lastTime; /* last time we used this (osi_Time) */ - long flags; /* flags (see below); - * locked by smb_globalLock */ - unsigned short attribute; /* search attribute - * (used for extended protocol) */ - char mask[256]; /* search mask for V3 */ -} smb_dirSearch_t; - -#define SMB_DIRSEARCH_DELETE 1 /* delete struct when ref count zero */ -#define SMB_DIRSEARCH_HITEOF 2 /* perhaps useful for advisory later */ -#define SMB_DIRSEARCH_SMALLID 4 /* cookie can only be 8 bits, not 16 */ -#define SMB_DIRSEARCH_BULKST 8 /* get bulk stat info */ - -/* type for patching directory listings */ -typedef struct smb_dirListPatch { - osi_queue_t q; - char *dptr; /* ptr to attr, time, data, sizel, sizeh */ - long flags; /* flags. See below */ - cm_fid_t fid; - cm_dirEntry_t *dep; /* temp */ -} smb_dirListPatch_t; - -/* dirListPatch Flags */ -#define SMB_DIRLISTPATCH_DOTFILE 1 -/* the file referenced is a dot file - * Note: will not be set if smb_hideDotFiles is false - */ - -/* waiting lock list elements */ -typedef struct smb_waitingLock { - osi_queue_t q; - smb_vc_t *vcp; - smb_packet_t *inp; - smb_packet_t *outp; - time_t timeRemaining; - void *lockp; -} smb_waitingLock_t; - -extern smb_waitingLock_t *smb_allWaitingLocks; - -typedef long (smb_proc_t)(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -typedef struct smb_dispatch { - smb_proc_t *procp; /* proc to call */ - int flags; /* flags describing function */ -} smb_dispatch_t; - -#define SMB_DISPATCHFLAG_CHAINED 1 /* this is an _AND_X function */ -#define SMB_DISPATCHFLAG_NORESPONSE 2 /* don't send the response - * packet, typically because - * the response was already - * sent. - */ -#define SMB_MAX_PATH 256 /* max path length */ - -/* prototypes */ - -extern void smb_Init(osi_log_t *logp, char *smbNamep, int useV3, int LANadapt, - int nThreads -#ifndef DJGPP - , void *aMBfunc -#endif - ); - -extern void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime); - -extern void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep); - -extern void smb_SearchTimeFromUnixTime(afs_uint32 *searchTimep, time_t unixTime); - -extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, afs_uint32 searchTime); - -extern void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime); - -extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, afs_uint32 dosUTime); - -extern void CompensateForSmbClientLastWriteTimeBugs(afs_uint32 *dosTimep); - -extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana); - -extern void smb_ReleaseVC(smb_vc_t *vcp); - -extern void smb_ReleaseVCNoLock(smb_vc_t *vcp); - -extern smb_tid_t *smb_FindTID(smb_vc_t *vcp, unsigned short tid, int flags); - -extern void smb_ReleaseTID(smb_tid_t *tidp); - -extern smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags); - -extern smb_username_t *smb_FindUserByName(char *usern, char *machine, int flags); - -extern smb_user_t *smb_FindUserByNameThisSession(smb_vc_t *vcp, char *usern); - -extern smb_username_t *smb_FindUserByName(char *usern, char *machine, int flags); - -extern smb_user_t *smb_FindUserByNameThisSession(smb_vc_t *vcp, char *usern); - -extern void smb_ReleaseUID(smb_user_t *uidp); - -extern cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp); - -extern long smb_LookupTIDPath(smb_vc_t *vcp, unsigned short tid, char ** tidPathp); - -extern smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags); - -extern void smb_ReleaseFID(smb_fid_t *fidp); - -extern int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp, char *shareName, char **pathNamep); - -extern int smb_FindShareCSCPolicy(char *shareName); - -extern smb_dirSearch_t *smb_FindDirSearchNL(long cookie); - -extern void smb_DeleteDirSearch(smb_dirSearch_t *dsp); - -extern void smb_ReleaseDirSearch(smb_dirSearch_t *dsp); - -extern smb_dirSearch_t *smb_FindDirSearch(long cookie); - -extern smb_dirSearch_t *smb_NewDirSearch(int isV3); - -extern smb_packet_t *smb_CopyPacket(smb_packet_t *packetp); - -extern void smb_FreePacket(smb_packet_t *packetp); - -extern unsigned char *smb_GetSMBData(smb_packet_t *smbp, int *nbytesp); - -extern void smb_SetSMBDataLength(smb_packet_t *smbp, unsigned int dsize); - -extern unsigned int smb_GetSMBParm(smb_packet_t *smbp, int parm); - -extern unsigned int smb_GetSMBOffsetParm(smb_packet_t *smbp, int parm, int offset); - -extern void smb_SetSMBParm(smb_packet_t *smbp, int slot, unsigned int parmValue); - -extern void smb_SetSMBParmLong(smb_packet_t *smbp, int slot, unsigned int parmValue); - -extern void smb_SetSMBParmDouble(smb_packet_t *smbp, int slot, char *parmValuep); - -extern void smb_SetSMBParmByte(smb_packet_t *smbp, int slot, unsigned int parmValue); - -extern void smb_StripLastComponent(char *outPathp, char **lastComponentp, - char *inPathp); - -extern unsigned char *smb_ParseASCIIBlock(unsigned char *inp, char **chainpp); - -extern unsigned char *smb_ParseVblBlock(unsigned char *inp, char **chainpp, - int *lengthp); - -extern smb_packet_t *smb_GetResponsePacket(smb_vc_t *vcp, smb_packet_t *inp); - -extern void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp); - -extern void smb_MapCoreError(long code, smb_vc_t *vcp, unsigned short *scodep, - unsigned char *classp); - -extern void smb_MapNTError(long code, unsigned long *NTStatusp); - -extern void smb_HoldVC(smb_vc_t *vcp); - -extern void smb_HoldVCNoLock(smb_vc_t *vcp); - -/* some globals, too */ -extern char *smb_localNamep; -extern int loggedOut; -extern time_t loggedOutTime; -extern char *loggedOutName; -extern smb_user_t *loggedOutUserp; - -extern osi_log_t *smb_logp; - -extern osi_rwlock_t smb_globalLock; - -extern osi_rwlock_t smb_rctLock; - -extern int smb_LogoffTokenTransfer; -extern time_t smb_LogoffTransferTimeout; - -extern int smb_maxVCPerServer; /* max # of VCs per server */ -extern int smb_maxMpxRequests; /* max # of mpx requests */ - -extern int smb_StoreAnsiFilenames; -extern int smb_hideDotFiles; -extern unsigned int smb_IsDotFile(char *lastComp); - -/* the following are used for smb auth */ -extern int smb_authType; /* Type of SMB authentication to be used. One from below. */ - -#define SMB_AUTH_NONE 0 -#define SMB_AUTH_NTLM 1 -#define SMB_AUTH_EXTENDED 2 - -extern HANDLE smb_lsaHandle; /* LSA handle obtained during smb_init if using SMB auth */ -extern ULONG smb_lsaSecPackage; /* LSA security package id. Set during smb_init */ -extern char smb_ServerDomainName[]; -extern int smb_ServerDomainNameLength; -extern char smb_ServerOS[]; -extern int smb_ServerOSLength; -extern char smb_ServerLanManager[]; -extern int smb_ServerLanManagerLength; -extern GUID smb_ServerGUID; -extern LSA_STRING smb_lsaLogonOrigin; - -/* used for getting a challenge for SMB auth */ -typedef struct _MSV1_0_LM20_CHALLENGE_REQUEST { - MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; -} MSV1_0_LM20_CHALLENGE_REQUEST, *PMSV1_0_LM20_CHALLENGE_REQUEST; - -typedef struct _MSV1_0_LM20_CHALLENGE_RESPONSE { - MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; - UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; -} MSV1_0_LM20_CHALLENGE_RESPONSE, *PMSV1_0_LM20_CHALLENGE_RESPONSE; -/**/ - -extern long smb_AuthenticateUserLM(smb_vc_t *vcp, char * accountName, char * primaryDomain, char * ciPwd, unsigned ciPwdLength, char * csPwd, unsigned csPwdLength); - -extern long smb_GetNormalizedUsername(char * usern, const char * accountName, const char * domainName); - -extern void smb_FormatResponsePacket(smb_vc_t *vcp, smb_packet_t *inp, - smb_packet_t *op); - -extern char *myCrt_Dispatch(int i); - -extern char *myCrt_2Dispatch(int i); - -extern char *myCrt_RapDispatch(int i); - -extern unsigned int smb_Attributes(cm_scache_t *scp); - -extern int smb_ChainFID(int fid, smb_packet_t *inp); - -extern smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags); - -extern void smb_ReleaseFID(smb_fid_t *fidp); - -extern unsigned char *smb_ParseDataBlock(unsigned char *inp, char **chainpp, int *lengthp); - -extern unsigned char *smb_ParseASCIIBlock(unsigned char *inp, char **chainpp); - -extern unsigned char *smb_ParseVblBlock(unsigned char *inp, char **chainpp, int *lengthp); - -extern int smb_SUser(cm_user_t *userp); - -#ifndef DJGPP -extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, - char *op, cm_user_t *userp, long *readp); -#else /* DJGPP */ -extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, - char *op, cm_user_t *userp, long *readp, int dosflag); -#endif /* !DJGPP */ - -extern long smb_Rename(smb_vc_t *vcp, smb_packet_t *inp, char *oldPathp, char *newPathp, int attrs); - -extern long smb_Link(smb_vc_t *vcp, smb_packet_t *inp, char *oldPathp, char *newPathp); - -extern BOOL smb_IsLegalFilename(char *filename); - -extern char *smb_GetSharename(void); - -extern DWORD smb_ServerExceptionFilter(void); - -/* include other include files */ -#include "smb3.h" -#include "smb_ioctl.h" -#include "smb_iocons.h" - -cm_user_t *smb_FindOrCreateUser(smb_vc_t *vcp, char *usern); - -#ifdef NOTSERVICE -extern void smb_LogPacket(smb_packet_t *packet); -#endif /* NOTSERVICE */ - -#ifndef MSV1_0_OPTION_ALLOW_BLANK_PASSWORD -#define MSV1_0_OPTION_ALLOW_BLANK_PASSWORD 0x1 -#define MSV1_0_OPTION_DISABLE_ADMIN_LOCKOUT 0x2 -#define MSV1_0_OPTION_DISABLE_FORCE_GUEST 0x4 -#define MSV1_0_OPTION_TRY_CACHE_FIRST 0x10 - -typedef struct _MSV1_0_SETPROCESSOPTION_REQUEST { - MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; - ULONG ProcessOptions; - BOOLEAN DisableOptions; -} MSV1_0_SETPROCESSOPTION_REQUEST, *PMSV1_0_SETPROCESSOPTION_REQUEST; -#endif - -#endif /* whole file */ diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c deleted file mode 100644 index cbdf54fe4..000000000 --- a/src/WINNT/afsd/smb3.c +++ /dev/null @@ -1,6897 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#include -#define SECURITY_WIN32 -#include -#include -#endif /* !DJGPP */ -#include -#include -#include -#include -#include -#include - -#include "afsd.h" -#include - -#include "smb.h" - -extern osi_hyper_t hzero; - -smb_packet_t *smb_Directory_Watches = NULL; -osi_mutex_t smb_Dir_Watch_Lock; - -smb_tran2Dispatch_t smb_tran2DispatchTable[SMB_TRAN2_NOPCODES]; - -smb_tran2Dispatch_t smb_rapDispatchTable[SMB_RAP_NOPCODES]; - -/* protected by the smb_globalLock */ -smb_tran2Packet_t *smb_tran2AssemblyQueuep; - -/* retrieve a held reference to a user structure corresponding to an incoming - * request */ -cm_user_t *smb_GetTran2User(smb_vc_t *vcp, smb_tran2Packet_t *inp) -{ - smb_user_t *uidp; - cm_user_t *up = NULL; - - uidp = smb_FindUID(vcp, inp->uid, 0); - if (!uidp) return NULL; - - lock_ObtainMutex(&uidp->mx); - if (uidp->unp) { - up = uidp->unp->userp; - cm_HoldUser(up); - } - lock_ReleaseMutex(&uidp->mx); - - smb_ReleaseUID(uidp); - - return up; -} - -/* - * Return extended attributes. - * Right now, we aren't using any of the "new" bits, so this looks exactly - * like smb_Attributes() (see smb.c). - */ -unsigned long smb_ExtAttributes(cm_scache_t *scp) -{ - unsigned long attrs; - - if (scp->fileType == CM_SCACHETYPE_DIRECTORY || - scp->fileType == CM_SCACHETYPE_MOUNTPOINT || - scp->fileType == CM_SCACHETYPE_INVALID) - { - attrs = SMB_ATTR_DIRECTORY; -#ifdef SPECIAL_FOLDERS - attrs |= SMB_ATTR_SYSTEM; /* FILE_ATTRIBUTE_SYSTEM */ -#endif /* SPECIAL_FOLDERS */ - } else if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - attrs = SMB_ATTR_DIRECTORY | SMB_ATTR_SPARSE_FILE; - } else - attrs = 0; - /* - * We used to mark a file RO if it was in an RO volume, but that - * turns out to be impolitic in NT. See defect 10007. - */ -#ifdef notdef - if ((scp->unixModeBits & 0222) == 0 || (scp->flags & CM_SCACHEFLAG_RO)) - attrs |= SMB_ATTR_READONLY; /* Read-only */ -#else - if ((scp->unixModeBits & 0222) == 0) - attrs |= SMB_ATTR_READONLY; /* Read-only */ -#endif - - if (attrs == 0) - attrs = SMB_ATTR_NORMAL; /* FILE_ATTRIBUTE_NORMAL */ - - return attrs; -} - -int smb_V3IsStarMask(char *maskp) -{ - char tc; - - while (tc = *maskp++) - if (tc == '?' || tc == '*' || tc == '<' || tc == '>') - return 1; - return 0; -} - -unsigned char *smb_ParseString(unsigned char *inp, char **chainpp) -{ - if (chainpp) { - /* skip over null-terminated string */ - *chainpp = inp + strlen(inp) + 1; - } - return inp; -} - -/*DEBUG do not checkin*/ -void OutputDebugF(char * format, ...) { - va_list args; - int len; - char * buffer; - - va_start( args, format ); - len = _vscprintf( format, args ) // _vscprintf doesn't count - + 3; // terminating '\0' + '\n' - buffer = malloc( len * sizeof(char) ); - vsprintf( buffer, format, args ); - osi_Log0(smb_logp, osi_LogSaveString(smb_logp, buffer)); - strcat(buffer, "\n"); - OutputDebugString(buffer); - free( buffer ); -} - -void OutputDebugHexDump(unsigned char * buffer, int len) { - int i,j,k; - char buf[256]; - static char tr[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; - - OutputDebugF("Hexdump length [%d]",len); - - for (i=0;i7)?1:0); - k = buffer[i]; - - buf[j] = tr[k / 16]; buf[j+1] = tr[k % 16]; - - j = (i%16); - j = j + 56 + ((j>7)?1:0); - - buf[j] = (k>32 && k<127)?k:'.'; - } - if(i) { - osi_Log0(smb_logp, osi_LogSaveString(smb_logp, buf)); - strcat(buf,"\n"); - OutputDebugString(buf); - } -} -/**/ - -#define SMB_EXT_SEC_PACKAGE_NAME "Negotiate" -void smb_NegotiateExtendedSecurity(void ** secBlob, int * secBlobLength) { - SECURITY_STATUS status, istatus; - CredHandle creds = {0,0}; - TimeStamp expiry; - SecBufferDesc secOut; - SecBuffer secTok; - CtxtHandle ctx; - ULONG flags; - - *secBlob = NULL; - *secBlobLength = 0; - - OutputDebugF("Negotiating Extended Security"); - - status = AcquireCredentialsHandle( NULL, - SMB_EXT_SEC_PACKAGE_NAME, - SECPKG_CRED_INBOUND, - NULL, - NULL, - NULL, - NULL, - &creds, - &expiry); - - if (status != SEC_E_OK) { - /* Really bad. We return an empty security blob */ - OutputDebugF("AcquireCredentialsHandle failed with %lX", status); - goto nes_0; - } - - secOut.cBuffers = 1; - secOut.pBuffers = &secTok; - secOut.ulVersion = SECBUFFER_VERSION; - - secTok.BufferType = SECBUFFER_TOKEN; - secTok.cbBuffer = 0; - secTok.pvBuffer = NULL; - - ctx.dwLower = ctx.dwUpper = 0; - - status = AcceptSecurityContext( &creds, - NULL, - NULL, - ASC_REQ_CONNECTION | ASC_REQ_EXTENDED_ERROR | ASC_REQ_ALLOCATE_MEMORY, - SECURITY_NETWORK_DREP, - &ctx, - &secOut, - &flags, - &expiry - ); - - if (status == SEC_I_COMPLETE_NEEDED || status == SEC_I_COMPLETE_AND_CONTINUE) { - OutputDebugF("Completing token..."); - istatus = CompleteAuthToken(&ctx, &secOut); - if ( istatus != SEC_E_OK ) - OutputDebugF("Token completion failed: %x", istatus); - } - - if (status == SEC_I_COMPLETE_AND_CONTINUE || status == SEC_I_CONTINUE_NEEDED) { - if (secTok.pvBuffer) { - *secBlobLength = secTok.cbBuffer; - *secBlob = malloc( secTok.cbBuffer ); - memcpy(*secBlob, secTok.pvBuffer, secTok.cbBuffer ); - } - } else { - if ( status != SEC_E_OK ) - OutputDebugF("AcceptSecurityContext status != CONTINUE %lX", status); - } - - /* Discard partial security context */ - DeleteSecurityContext(&ctx); - - if (secTok.pvBuffer) FreeContextBuffer( secTok.pvBuffer ); - - /* Discard credentials handle. We'll reacquire one when we get the session setup X */ - FreeCredentialsHandle(&creds); - - nes_0: - return; -} - -struct smb_ext_context { - CredHandle creds; - CtxtHandle ctx; - int partialTokenLen; - void * partialToken; -}; - -long smb_AuthenticateUserExt(smb_vc_t * vcp, char * usern, char * secBlobIn, int secBlobInLength, char ** secBlobOut, int * secBlobOutLength) { - SECURITY_STATUS status, istatus; - CredHandle creds; - TimeStamp expiry; - long code = 0; - SecBufferDesc secBufIn; - SecBuffer secTokIn; - SecBufferDesc secBufOut; - SecBuffer secTokOut; - CtxtHandle ctx; - struct smb_ext_context * secCtx = NULL; - struct smb_ext_context * newSecCtx = NULL; - void * assembledBlob = NULL; - int assembledBlobLength = 0; - ULONG flags; - - OutputDebugF("In smb_AuthenticateUserExt"); - - *secBlobOut = NULL; - *secBlobOutLength = 0; - - if (vcp->flags & SMB_VCFLAG_AUTH_IN_PROGRESS) { - secCtx = vcp->secCtx; - lock_ObtainMutex(&vcp->mx); - vcp->flags &= ~SMB_VCFLAG_AUTH_IN_PROGRESS; - vcp->secCtx = NULL; - lock_ReleaseMutex(&vcp->mx); - } - - if (secBlobIn) { - OutputDebugF("Received incoming token:"); - OutputDebugHexDump(secBlobIn,secBlobInLength); - } - - if (secCtx) { - OutputDebugF("Continuing with existing context."); - creds = secCtx->creds; - ctx = secCtx->ctx; - - if (secCtx->partialToken) { - assembledBlobLength = secCtx->partialTokenLen + secBlobInLength; - assembledBlob = malloc(assembledBlobLength); - memcpy(assembledBlob,secCtx->partialToken, secCtx->partialTokenLen); - memcpy(((BYTE *)assembledBlob) + secCtx->partialTokenLen, secBlobIn, secBlobInLength); - } - } else { - status = AcquireCredentialsHandle( NULL, - SMB_EXT_SEC_PACKAGE_NAME, - SECPKG_CRED_INBOUND, - NULL, - NULL, - NULL, - NULL, - &creds, - &expiry); - - if (status != SEC_E_OK) { - OutputDebugF("Can't acquire Credentials handle [%lX]", status); - code = CM_ERROR_BADPASSWORD; /* means "try again when I'm sober" */ - goto aue_0; - } - - ctx.dwLower = 0; - ctx.dwUpper = 0; - } - - secBufIn.cBuffers = 1; - secBufIn.pBuffers = &secTokIn; - secBufIn.ulVersion = SECBUFFER_VERSION; - - secTokIn.BufferType = SECBUFFER_TOKEN; - if (assembledBlob) { - secTokIn.cbBuffer = assembledBlobLength; - secTokIn.pvBuffer = assembledBlob; - } else { - secTokIn.cbBuffer = secBlobInLength; - secTokIn.pvBuffer = secBlobIn; - } - - secBufOut.cBuffers = 1; - secBufOut.pBuffers = &secTokOut; - secBufOut.ulVersion = SECBUFFER_VERSION; - - secTokOut.BufferType = SECBUFFER_TOKEN; - secTokOut.cbBuffer = 0; - secTokOut.pvBuffer = NULL; - - status = AcceptSecurityContext( &creds, - ((secCtx)?&ctx:NULL), - &secBufIn, - ASC_REQ_CONNECTION | ASC_REQ_EXTENDED_ERROR | ASC_REQ_ALLOCATE_MEMORY, - SECURITY_NETWORK_DREP, - &ctx, - &secBufOut, - &flags, - &expiry - ); - - if (status == SEC_I_COMPLETE_NEEDED || status == SEC_I_COMPLETE_AND_CONTINUE) { - OutputDebugF("Completing token..."); - istatus = CompleteAuthToken(&ctx, &secBufOut); - if ( istatus != SEC_E_OK ) - OutputDebugF("Token completion failed: %lX", istatus); - } - - if (status == SEC_I_COMPLETE_AND_CONTINUE || status == SEC_I_CONTINUE_NEEDED) { - OutputDebugF("Continue needed"); - - newSecCtx = malloc(sizeof(*newSecCtx)); - - newSecCtx->creds = creds; - newSecCtx->ctx = ctx; - newSecCtx->partialToken = NULL; - newSecCtx->partialTokenLen = 0; - - lock_ObtainMutex( &vcp->mx ); - vcp->flags |= SMB_VCFLAG_AUTH_IN_PROGRESS; - vcp->secCtx = newSecCtx; - lock_ReleaseMutex( &vcp->mx ); - - code = CM_ERROR_GSSCONTINUE; - } - - if ((status == SEC_I_COMPLETE_NEEDED || status == SEC_E_OK || - status == SEC_I_COMPLETE_AND_CONTINUE || status == SEC_I_CONTINUE_NEEDED) && - secTokOut.pvBuffer) { - OutputDebugF("Need to send token back to client"); - - *secBlobOutLength = secTokOut.cbBuffer; - *secBlobOut = malloc(secTokOut.cbBuffer); - memcpy(*secBlobOut, secTokOut.pvBuffer, secTokOut.cbBuffer); - - OutputDebugF("Outgoing token:"); - OutputDebugHexDump(*secBlobOut,*secBlobOutLength); - } else if (status == SEC_E_INCOMPLETE_MESSAGE) { - OutputDebugF("Incomplete message"); - - newSecCtx = malloc(sizeof(*newSecCtx)); - - newSecCtx->creds = creds; - newSecCtx->ctx = ctx; - newSecCtx->partialToken = malloc(secTokOut.cbBuffer); - memcpy(newSecCtx->partialToken, secTokOut.pvBuffer, secTokOut.cbBuffer); - newSecCtx->partialTokenLen = secTokOut.cbBuffer; - - lock_ObtainMutex( &vcp->mx ); - vcp->flags |= SMB_VCFLAG_AUTH_IN_PROGRESS; - vcp->secCtx = newSecCtx; - lock_ReleaseMutex( &vcp->mx ); - - code = CM_ERROR_GSSCONTINUE; - } - - if (status == SEC_E_OK || status == SEC_I_COMPLETE_NEEDED) { - /* woo hoo! */ - SecPkgContext_Names names; - - OutputDebugF("Authentication completed"); - OutputDebugF("Returned flags : [%lX]", flags); - - if (!QueryContextAttributes(&ctx, SECPKG_ATTR_NAMES, &names)) { - OutputDebugF("Received name [%s]", names.sUserName); - strcpy(usern, names.sUserName); - strlwr(usern); /* in tandem with smb_GetNormalizedUsername */ - FreeContextBuffer(names.sUserName); - } else { - /* Force the user to retry if the context is invalid */ - OutputDebugF("QueryContextAttributes Names failed [%x]", GetLastError()); - code = CM_ERROR_BADPASSWORD; - } - } else if (!code) { - switch ( status ) { - case SEC_E_INVALID_TOKEN: - OutputDebugF("Returning bad password :: INVALID_TOKEN"); - break; - case SEC_E_INVALID_HANDLE: - OutputDebugF("Returning bad password :: INVALID_HANDLE"); - break; - case SEC_E_LOGON_DENIED: - OutputDebugF("Returning bad password :: LOGON_DENIED"); - break; - case SEC_E_UNKNOWN_CREDENTIALS: - OutputDebugF("Returning bad password :: UNKNOWN_CREDENTIALS"); - break; - case SEC_E_NO_CREDENTIALS: - OutputDebugF("Returning bad password :: NO_CREDENTIALS"); - break; - case SEC_E_CONTEXT_EXPIRED: - OutputDebugF("Returning bad password :: CONTEXT_EXPIRED"); - break; - case SEC_E_INCOMPLETE_CREDENTIALS: - OutputDebugF("Returning bad password :: INCOMPLETE_CREDENTIALS"); - break; - case SEC_E_WRONG_PRINCIPAL: - OutputDebugF("Returning bad password :: WRONG_PRINCIPAL"); - break; - case SEC_E_TIME_SKEW: - OutputDebugF("Returning bad password :: TIME_SKEW"); - break; - default: - OutputDebugF("Returning bad password :: Status == %lX", status); - } - code = CM_ERROR_BADPASSWORD; - } - - if (secCtx) { - if (secCtx->partialToken) free(secCtx->partialToken); - free(secCtx); - } - - if (assembledBlob) { - free(assembledBlob); - } - - if (secTokOut.pvBuffer) - FreeContextBuffer(secTokOut.pvBuffer); - - if (code != CM_ERROR_GSSCONTINUE) { - DeleteSecurityContext(&ctx); - FreeCredentialsHandle(&creds); - } - - aue_0: - return code; -} - -#define P_LEN 256 -#define P_RESP_LEN 128 - -/* LsaLogonUser expects input parameters to be in a contiguous block of memory. - So put stuff in a struct. */ -struct Lm20AuthBlob { - MSV1_0_LM20_LOGON lmlogon; - BYTE ciResponse[P_RESP_LEN]; /* Unicode representation */ - BYTE csResponse[P_RESP_LEN]; /* ANSI representation */ - WCHAR accountNameW[P_LEN]; - WCHAR primaryDomainW[P_LEN]; - WCHAR workstationW[MAX_COMPUTERNAME_LENGTH + 1]; - TOKEN_GROUPS tgroups; - TOKEN_SOURCE tsource; -}; - -long smb_AuthenticateUserLM(smb_vc_t *vcp, char * accountName, char * primaryDomain, char * ciPwd, unsigned ciPwdLength, char * csPwd, unsigned csPwdLength) -{ - NTSTATUS nts, ntsEx; - struct Lm20AuthBlob lmAuth; - PMSV1_0_LM20_LOGON_PROFILE lmprofilep; - QUOTA_LIMITS quotaLimits; - DWORD size; - ULONG lmprofilepSize; - LUID lmSession; - HANDLE lmToken; - - OutputDebugF("In smb_AuthenticateUser for user [%s] domain [%s]", accountName, primaryDomain); - OutputDebugF("ciPwdLength is %d and csPwdLength is %d", ciPwdLength, csPwdLength); - - if (ciPwdLength > P_RESP_LEN || csPwdLength > P_RESP_LEN) { - OutputDebugF("ciPwdLength or csPwdLength is too long"); - return CM_ERROR_BADPASSWORD; - } - - memset(&lmAuth,0,sizeof(lmAuth)); - - lmAuth.lmlogon.MessageType = MsV1_0NetworkLogon; - - lmAuth.lmlogon.LogonDomainName.Buffer = lmAuth.primaryDomainW; - mbstowcs(lmAuth.primaryDomainW, primaryDomain, P_LEN); - lmAuth.lmlogon.LogonDomainName.Length = wcslen(lmAuth.primaryDomainW) * sizeof(WCHAR); - lmAuth.lmlogon.LogonDomainName.MaximumLength = P_LEN * sizeof(WCHAR); - - lmAuth.lmlogon.UserName.Buffer = lmAuth.accountNameW; - mbstowcs(lmAuth.accountNameW, accountName, P_LEN); - lmAuth.lmlogon.UserName.Length = wcslen(lmAuth.accountNameW) * sizeof(WCHAR); - lmAuth.lmlogon.UserName.MaximumLength = P_LEN * sizeof(WCHAR); - - lmAuth.lmlogon.Workstation.Buffer = lmAuth.workstationW; - lmAuth.lmlogon.Workstation.MaximumLength = (MAX_COMPUTERNAME_LENGTH + 1) * sizeof(WCHAR); - size = MAX_COMPUTERNAME_LENGTH + 1; - GetComputerNameW(lmAuth.workstationW, &size); - lmAuth.lmlogon.Workstation.Length = wcslen(lmAuth.workstationW) * sizeof(WCHAR); - - memcpy(lmAuth.lmlogon.ChallengeToClient, vcp->encKey, MSV1_0_CHALLENGE_LENGTH); - - lmAuth.lmlogon.CaseInsensitiveChallengeResponse.Buffer = lmAuth.ciResponse; - lmAuth.lmlogon.CaseInsensitiveChallengeResponse.Length = ciPwdLength; - lmAuth.lmlogon.CaseInsensitiveChallengeResponse.MaximumLength = P_RESP_LEN; - memcpy(lmAuth.ciResponse, ciPwd, ciPwdLength); - - lmAuth.lmlogon.CaseSensitiveChallengeResponse.Buffer = lmAuth.csResponse; - lmAuth.lmlogon.CaseSensitiveChallengeResponse.Length = csPwdLength; - lmAuth.lmlogon.CaseSensitiveChallengeResponse.MaximumLength = P_RESP_LEN; - memcpy(lmAuth.csResponse, csPwd, csPwdLength); - - lmAuth.lmlogon.ParameterControl = 0; - - lmAuth.tgroups.GroupCount = 0; - lmAuth.tgroups.Groups[0].Sid = NULL; - lmAuth.tgroups.Groups[0].Attributes = 0; - - lmAuth.tsource.SourceIdentifier.HighPart = 0; - lmAuth.tsource.SourceIdentifier.LowPart = (DWORD) vcp; - strcpy(lmAuth.tsource.SourceName,"OpenAFS"); /* 8 char limit */ - - nts = LsaLogonUser( smb_lsaHandle, - &smb_lsaLogonOrigin, - Network, /*3*/ - smb_lsaSecPackage, - &lmAuth, - sizeof(lmAuth), - &lmAuth.tgroups, - &lmAuth.tsource, - &lmprofilep, - &lmprofilepSize, - &lmSession, - &lmToken, - "aLimits, - &ntsEx); - - if (nts != STATUS_SUCCESS || ntsEx != STATUS_SUCCESS) - osi_Log2(smb_logp,"LsaLogonUser failure: nts %u ntsEx %u", - nts, ntsEx); - - OutputDebugF("Return from LsaLogonUser is 0x%lX", nts); - OutputDebugF("Extended status is 0x%lX", ntsEx); - - if (nts == ERROR_SUCCESS) { - /* free the token */ - LsaFreeReturnBuffer(lmprofilep); - CloseHandle(lmToken); - return 0; - } else { - /* No AFS for you */ - if (nts == 0xC000015BL) - return CM_ERROR_BADLOGONTYPE; - else /* our catchall is a bad password though we could be more specific */ - return CM_ERROR_BADPASSWORD; - } -} - -/* The buffer pointed to by usern is assumed to be at least SMB_MAX_USERNAME_LENGTH bytes */ -long smb_GetNormalizedUsername(char * usern, const char * accountName, const char * domainName) -{ - char * atsign; - const char * domain; - - /* check if we have sane input */ - if ((strlen(accountName) + strlen(domainName) + 1) > SMB_MAX_USERNAME_LENGTH) - return 1; - - /* we could get : [accountName][domainName] - [user][domain] - [user@domain][] - [user][]/[user][?] - [][]/[][?] */ - - atsign = strchr(accountName, '@'); - - if (atsign) /* [user@domain][] -> [user@domain][domain] */ - domain = atsign + 1; - else - domain = domainName; - - /* if for some reason the client doesn't know what domain to use, - it will either return an empty string or a '?' */ - if (!domain[0] || domain[0] == '?') - /* Empty domains and empty usernames are usually sent from tokenless contexts. - This way such logins will get an empty username (easy to check). I don't know - when a non-empty username would be supplied with an anonymous domain, but *shrug* */ - strcpy(usern,accountName); - else { - /* TODO: what about WIN.MIT.EDU\user vs. WIN\user? */ - strcpy(usern,domain); - strcat(usern,"\\"); - if (atsign) - strncat(usern,accountName,atsign - accountName); - else - strcat(usern,accountName); - } - - strlwr(usern); - - return 0; -} - -/* When using SMB auth, all SMB sessions have to pass through here first to - * authenticate the user. - * Caveat: If not use the SMB auth the protocol does not require sending a - * session setup packet, which means that we can't rely on a UID in subsequent - * packets. Though in practice we get one anyway. - */ -long smb_ReceiveV3SessionSetupX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *tp; - smb_user_t *uidp; - unsigned short newUid; - unsigned long caps = 0; - cm_user_t *userp; - smb_username_t *unp; - char *s1 = " "; - long code = 0; - char usern[SMB_MAX_USERNAME_LENGTH]; - char *secBlobOut = NULL; - int secBlobOutLength = 0; - - /* Check for bad conns */ - if (vcp->flags & SMB_VCFLAG_REMOTECONN) - return CM_ERROR_REMOTECONN; - - if (vcp->flags & SMB_VCFLAG_USENT) { - if (smb_authType == SMB_AUTH_EXTENDED) { - /* extended authentication */ - char *secBlobIn; - int secBlobInLength; - - OutputDebugF("NT Session Setup: Extended"); - - if (!(vcp->flags & SMB_VCFLAG_SESSX_RCVD)) { - caps = smb_GetSMBParm(inp,10) | (((unsigned long) smb_GetSMBParm(inp,11)) << 16); - } - - secBlobInLength = smb_GetSMBParm(inp, 7); - secBlobIn = smb_GetSMBData(inp, NULL); - - code = smb_AuthenticateUserExt(vcp, usern, secBlobIn, secBlobInLength, &secBlobOut, &secBlobOutLength); - - if (code == CM_ERROR_GSSCONTINUE) { - smb_SetSMBParm(outp, 2, 0); - smb_SetSMBParm(outp, 3, secBlobOutLength); - smb_SetSMBDataLength(outp, secBlobOutLength + smb_ServerOSLength + smb_ServerLanManagerLength + smb_ServerDomainNameLength); - tp = smb_GetSMBData(outp, NULL); - if (secBlobOutLength) { - memcpy(tp, secBlobOut, secBlobOutLength); - free(secBlobOut); - tp += secBlobOutLength; - } - memcpy(tp,smb_ServerOS,smb_ServerOSLength); - tp += smb_ServerOSLength; - memcpy(tp,smb_ServerLanManager,smb_ServerLanManagerLength); - tp += smb_ServerLanManagerLength; - memcpy(tp,smb_ServerDomainName,smb_ServerDomainNameLength); - tp += smb_ServerDomainNameLength; - } - - /* TODO: handle return code and continue auth. Also free secBlobOut if applicable. */ - } else { - unsigned ciPwdLength, csPwdLength; - char *ciPwd, *csPwd; - char *accountName; - char *primaryDomain; - int datalen; - - if (smb_authType == SMB_AUTH_NTLM) - OutputDebugF("NT Session Setup: NTLM"); - else - OutputDebugF("NT Session Setup: None"); - - /* TODO: parse for extended auth as well */ - ciPwdLength = smb_GetSMBParm(inp, 7); /* case insensitive password length */ - csPwdLength = smb_GetSMBParm(inp, 8); /* case sensitive password length */ - - tp = smb_GetSMBData(inp, &datalen); - - OutputDebugF("Session packet data size [%d]",datalen); - - ciPwd = tp; - tp += ciPwdLength; - csPwd = tp; - tp += csPwdLength; - - accountName = smb_ParseString(tp, &tp); - primaryDomain = smb_ParseString(tp, NULL); - - OutputDebugF("Account Name: %s",accountName); - OutputDebugF("Primary Domain: %s", primaryDomain); - OutputDebugF("Case Sensitive Password: %s", csPwd && csPwd[0] ? "yes" : "no"); - OutputDebugF("Case Insensitive Password: %s", ciPwd && ciPwd[0] ? "yes" : "no"); - - if (smb_GetNormalizedUsername(usern, accountName, primaryDomain)) { - /* shouldn't happen */ - code = CM_ERROR_BADSMB; - goto after_read_packet; - } - - /* capabilities are only valid for first session packet */ - if (!(vcp->flags & SMB_VCFLAG_SESSX_RCVD)) { - caps = smb_GetSMBParm(inp, 11) | (((unsigned long)smb_GetSMBParm(inp, 12)) << 16); - } - - if (smb_authType == SMB_AUTH_NTLM) { - code = smb_AuthenticateUserLM(vcp, accountName, primaryDomain, ciPwd, ciPwdLength, csPwd, csPwdLength); - if ( code ) - OutputDebugF("LM authentication failed [%d]", code); - else - OutputDebugF("LM authentication succeeded"); - } - } - } else { /* V3 */ - unsigned ciPwdLength; - char *ciPwd; - char *accountName; - char *primaryDomain; - - switch ( smb_authType ) { - case SMB_AUTH_EXTENDED: - OutputDebugF("V3 Session Setup: Extended"); - break; - case SMB_AUTH_NTLM: - OutputDebugF("V3 Session Setup: NTLM"); - break; - default: - OutputDebugF("V3 Session Setup: None"); - } - ciPwdLength = smb_GetSMBParm(inp, 7); - tp = smb_GetSMBData(inp, NULL); - ciPwd = tp; - tp += ciPwdLength; - - accountName = smb_ParseString(tp, &tp); - primaryDomain = smb_ParseString(tp, NULL); - - OutputDebugF("Account Name: %s",accountName); - OutputDebugF("Primary Domain: %s", primaryDomain); - OutputDebugF("Case Insensitive Password: %s", ciPwd && ciPwd[0] ? "yes" : "no"); - - if ( smb_GetNormalizedUsername(usern, accountName, primaryDomain)) { - /* shouldn't happen */ - code = CM_ERROR_BADSMB; - goto after_read_packet; - } - - /* even if we wanted extended auth, if we only negotiated V3, we have to fallback - * to NTLM. - */ - if (smb_authType == SMB_AUTH_NTLM || smb_authType == SMB_AUTH_EXTENDED) { - code = smb_AuthenticateUserLM(vcp,accountName,primaryDomain,ciPwd,ciPwdLength,"",0); - if ( code ) - OutputDebugF("LM authentication failed [%d]", code); - else - OutputDebugF("LM authentication succeeded"); - } - } - - after_read_packet: - /* note down that we received a session setup X and set the capabilities flag */ - if (!(vcp->flags & SMB_VCFLAG_SESSX_RCVD)) { - lock_ObtainMutex(&vcp->mx); - vcp->flags |= SMB_VCFLAG_SESSX_RCVD; - /* for the moment we can only deal with NTSTATUS */ - if (caps & NTNEGOTIATE_CAPABILITY_NTSTATUS) { - vcp->flags |= SMB_VCFLAG_STATUS32; - } - lock_ReleaseMutex(&vcp->mx); - } - - /* code would be non-zero if there was an authentication failure. - Ideally we would like to invalidate the uid for this session or break - early to avoid accidently stealing someone else's tokens. */ - - if (code) { - return code; - } - - OutputDebugF("Received username=[%s]", usern); - - /* On Windows 2000, this function appears to be called more often than - it is expected to be called. This resulted in multiple smb_user_t - records existing all for the same user session which results in all - of the users tokens disappearing. - - To avoid this problem, we look for an existing smb_user_t record - based on the users name, and use that one if we find it. - */ - - uidp = smb_FindUserByNameThisSession(vcp, usern); - if (uidp) { /* already there, so don't create a new one */ - unp = uidp->unp; - userp = unp->userp; - newUid = (unsigned short)uidp->userID; /* For some reason these are different types!*/ - osi_LogEvent("AFS smb_ReceiveV3SessionSetupX",NULL,"FindUserByName:Lana[%d],lsn[%d],userid[%d],name[%s]",vcp->lana,vcp->lsn,newUid,osi_LogSaveString(smb_logp, usern)); - osi_Log3(smb_logp,"smb_ReceiveV3SessionSetupX FindUserByName:Lana[%d],lsn[%d],userid[%d]",vcp->lana,vcp->lsn,newUid); - smb_ReleaseUID(uidp); - } - else { - /* do a global search for the username/machine name pair */ - unp = smb_FindUserByName(usern, vcp->rname, SMB_FLAG_CREATE); - - /* Create a new UID and cm_user_t structure */ - userp = unp->userp; - if (!userp) - userp = cm_NewUser(); - lock_ObtainMutex(&vcp->mx); - if (!vcp->uidCounter) - vcp->uidCounter++; /* handle unlikely wraparounds */ - newUid = (strlen(usern)==0)?0:vcp->uidCounter++; - lock_ReleaseMutex(&vcp->mx); - - /* Create a new smb_user_t structure and connect them up */ - lock_ObtainMutex(&unp->mx); - unp->userp = userp; - lock_ReleaseMutex(&unp->mx); - - uidp = smb_FindUID(vcp, newUid, SMB_FLAG_CREATE); - lock_ObtainMutex(&uidp->mx); - uidp->unp = unp; - osi_LogEvent("AFS smb_ReceiveV3SessionSetupX",NULL,"MakeNewUser:VCP[%x],Lana[%d],lsn[%d],userid[%d],TicketKTCName[%s]",(int)vcp,vcp->lana,vcp->lsn,newUid,osi_LogSaveString(smb_logp, usern)); - osi_Log4(smb_logp,"smb_ReceiveV3SessionSetupX MakeNewUser:VCP[%x],Lana[%d],lsn[%d],userid[%d]",vcp,vcp->lana,vcp->lsn,newUid); - lock_ReleaseMutex(&uidp->mx); - smb_ReleaseUID(uidp); - } - - /* Return UID to the client */ - ((smb_t *)outp)->uid = newUid; - /* Also to the next chained message */ - ((smb_t *)inp)->uid = newUid; - - osi_Log3(smb_logp, "SMB3 session setup name %s creating ID %d%s", - osi_LogSaveString(smb_logp, usern), newUid, osi_LogSaveString(smb_logp, s1)); - - smb_SetSMBParm(outp, 2, 0); - - if (vcp->flags & SMB_VCFLAG_USENT) { - if (smb_authType == SMB_AUTH_EXTENDED) { - smb_SetSMBParm(outp, 3, secBlobOutLength); - smb_SetSMBDataLength(outp, secBlobOutLength + smb_ServerOSLength + smb_ServerLanManagerLength + smb_ServerDomainNameLength); - tp = smb_GetSMBData(outp, NULL); - if (secBlobOutLength) { - memcpy(tp, secBlobOut, secBlobOutLength); - free(secBlobOut); - tp += secBlobOutLength; - } - memcpy(tp,smb_ServerOS,smb_ServerOSLength); - tp += smb_ServerOSLength; - memcpy(tp,smb_ServerLanManager,smb_ServerLanManagerLength); - tp += smb_ServerLanManagerLength; - memcpy(tp,smb_ServerDomainName,smb_ServerDomainNameLength); - tp += smb_ServerDomainNameLength; - } else { - smb_SetSMBDataLength(outp, 0); - } - } else { - if (smb_authType == SMB_AUTH_EXTENDED) { - smb_SetSMBDataLength(outp, smb_ServerOSLength + smb_ServerLanManagerLength + smb_ServerDomainNameLength); - tp = smb_GetSMBData(outp, NULL); - memcpy(tp,smb_ServerOS,smb_ServerOSLength); - tp += smb_ServerOSLength; - memcpy(tp,smb_ServerLanManager,smb_ServerLanManagerLength); - tp += smb_ServerLanManagerLength; - memcpy(tp,smb_ServerDomainName,smb_ServerDomainNameLength); - tp += smb_ServerDomainNameLength; - } else { - smb_SetSMBDataLength(outp, 0); - } - } - - return 0; -} - -long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_user_t *uidp; - - /* don't get tokens from this VC */ - vcp->flags |= SMB_VCFLAG_ALREADYDEAD; - - inp->flags |= SMB_PACKETFLAG_PROFILE_UPDATE_OK; - - /* find the tree and free it */ - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - /* TODO: smb_ReleaseUID() ? */ - if (uidp) { - char *s1 = NULL, *s2 = NULL; - - if (s2 == NULL) s2 = " "; - if (s1 == NULL) {s1 = s2; s2 = " ";} - - osi_Log4(smb_logp, "SMB3 user logoffX uid %d name %s%s%s", uidp->userID, - osi_LogSaveString(smb_logp, (uidp->unp) ? uidp->unp->name: " "), - osi_LogSaveString(smb_logp,s1), osi_LogSaveString(smb_logp,s2)); - - lock_ObtainMutex(&uidp->mx); - uidp->flags |= SMB_USERFLAG_DELETE; - /* - * it doesn't get deleted right away - * because the vcp points to it - */ - lock_ReleaseMutex(&uidp->mx); - } - else - osi_Log0(smb_logp, "SMB3 user logoffX"); - - smb_SetSMBDataLength(outp, 0); - return 0; -} - -#define SMB_SUPPORT_SEARCH_BITS 0x0001 -#define SMB_SHARE_IS_IN_DFS 0x0002 - -long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_tid_t *tidp; - smb_user_t *uidp; - unsigned short newTid; - char shareName[256]; - char *sharePath; - int shareFound; - char *tp; - char *pathp; - char *passwordp; - char *servicep; - cm_user_t *userp; - int ipc = 0; - - osi_Log0(smb_logp, "SMB3 receive tree connect"); - - /* parse input parameters */ - tp = smb_GetSMBData(inp, NULL); - passwordp = smb_ParseString(tp, &tp); - pathp = smb_ParseString(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - servicep = smb_ParseString(tp, &tp); - - tp = strrchr(pathp, '\\'); - if (!tp) { - return CM_ERROR_BADSMB; - } - strcpy(shareName, tp+1); - - osi_Log2(smb_logp, "Tree connect pathp[%s] shareName[%s]", - osi_LogSaveString(smb_logp, pathp), - osi_LogSaveString(smb_logp, shareName)); - - if (strcmp(servicep, "IPC") == 0 || strcmp(shareName, "IPC$") == 0) { -#ifndef NO_IPC - osi_Log0(smb_logp, "TreeConnectX connecting to IPC$"); - ipc = 1; -#else - return CM_ERROR_NOIPC; -#endif - } - - userp = smb_GetUser(vcp, inp); - - lock_ObtainMutex(&vcp->mx); - newTid = vcp->tidCounter++; - lock_ReleaseMutex(&vcp->mx); - - tidp = smb_FindTID(vcp, newTid, SMB_FLAG_CREATE); - - if (!ipc) { - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - shareFound = smb_FindShare(vcp, uidp, shareName, &sharePath); - if (uidp) - smb_ReleaseUID(uidp); - if (!shareFound) { - smb_ReleaseTID(tidp); - return CM_ERROR_BADSHARENAME; - } - - if (vcp->flags & SMB_VCFLAG_USENT) - { - int policy = smb_FindShareCSCPolicy(shareName); - smb_SetSMBParm(outp, 2, SMB_SUPPORT_SEARCH_BITS | -#ifdef DFS_SUPPORT - SMB_SHARE_IS_IN_DFS | -#endif - (policy << 2)); - } - } else { - smb_SetSMBParm(outp, 2, 0); - sharePath = NULL; - } - - lock_ObtainMutex(&tidp->mx); - tidp->userp = userp; - tidp->pathname = sharePath; - if (ipc) - tidp->flags |= SMB_TIDFLAG_IPC; - lock_ReleaseMutex(&tidp->mx); - smb_ReleaseTID(tidp); - - ((smb_t *)outp)->tid = newTid; - ((smb_t *)inp)->tid = newTid; - tp = smb_GetSMBData(outp, NULL); - if (!ipc) { - /* XXX - why is this a drive letter? */ - *tp++ = 'A'; - *tp++ = ':'; - *tp++ = 0; - *tp++ = 'N'; - *tp++ = 'T'; - *tp++ = 'F'; - *tp++ = 'S'; - *tp++ = 0; - smb_SetSMBDataLength(outp, 8); - } else { - strcpy(tp, "IPC"); - smb_SetSMBDataLength(outp, 4); - } - - osi_Log1(smb_logp, "SMB3 tree connect created ID %d", newTid); - return 0; -} - -/* must be called with global tran lock held */ -smb_tran2Packet_t *smb_FindTran2Packet(smb_vc_t *vcp, smb_packet_t *inp) -{ - smb_tran2Packet_t *tp; - smb_t *smbp; - - smbp = (smb_t *) inp->data; - for (tp = smb_tran2AssemblyQueuep; tp; tp = (smb_tran2Packet_t *) osi_QNext(&tp->q)) { - if (tp->vcp == vcp && tp->mid == smbp->mid && tp->tid == smbp->tid) - return tp; - } - return NULL; -} - -smb_tran2Packet_t *smb_NewTran2Packet(smb_vc_t *vcp, smb_packet_t *inp, - int totalParms, int totalData) -{ - smb_tran2Packet_t *tp; - smb_t *smbp; - - smbp = (smb_t *) inp->data; - tp = malloc(sizeof(*tp)); - memset(tp, 0, sizeof(*tp)); - tp->vcp = vcp; - smb_HoldVC(vcp); - tp->curData = tp->curParms = 0; - tp->totalData = totalData; - tp->totalParms = totalParms; - tp->tid = smbp->tid; - tp->mid = smbp->mid; - tp->uid = smbp->uid; - tp->pid = smbp->pid; - tp->res[0] = smbp->res[0]; - osi_QAdd((osi_queue_t **)&smb_tran2AssemblyQueuep, &tp->q); - if (totalParms != 0) - tp->parmsp = malloc(totalParms); - if (totalData != 0) - tp->datap = malloc(totalData); - if (smbp->com == 0x25 || smbp->com == 0x26) - tp->com = 0x25; - else { - tp->opcode = smb_GetSMBParm(inp, 14); - tp->com = 0x32; - } - tp->flags |= SMB_TRAN2PFLAG_ALLOC; - return tp; -} - -smb_tran2Packet_t *smb_GetTran2ResponsePacket(smb_vc_t *vcp, - smb_tran2Packet_t *inp, smb_packet_t *outp, - int totalParms, int totalData) -{ - smb_tran2Packet_t *tp; - unsigned short parmOffset; - unsigned short dataOffset; - unsigned short dataAlign; - - tp = malloc(sizeof(*tp)); - memset(tp, 0, sizeof(*tp)); - tp->vcp = NULL; - tp->curData = tp->curParms = 0; - tp->totalData = totalData; - tp->totalParms = totalParms; - tp->oldTotalParms = totalParms; - tp->tid = inp->tid; - tp->mid = inp->mid; - tp->uid = inp->uid; - tp->pid = inp->pid; - tp->res[0] = inp->res[0]; - tp->opcode = inp->opcode; - tp->com = inp->com; - - /* - * We calculate where the parameters and data will start. - * This calculation must parallel the calculation in - * smb_SendTran2Packet. - */ - - parmOffset = 10*2 + 35; - parmOffset++; /* round to even */ - tp->parmsp = (unsigned short *) (outp->data + parmOffset); - - dataOffset = parmOffset + totalParms; - dataAlign = dataOffset & 2; /* quad-align */ - dataOffset += dataAlign; - tp->datap = outp->data + dataOffset; - - return tp; -} - -/* free a tran2 packet; must be called with smb_globalLock held */ -void smb_FreeTran2Packet(smb_tran2Packet_t *t2p) -{ - if (t2p->vcp) - smb_ReleaseVC(t2p->vcp); - if (t2p->flags & SMB_TRAN2PFLAG_ALLOC) { - if (t2p->parmsp) - free(t2p->parmsp); - if (t2p->datap) - free(t2p->datap); - } - free(t2p); -} - -/* called with a VC, an input packet to respond to, and an error code. - * sends an error response. - */ -void smb_SendTran2Error(smb_vc_t *vcp, smb_tran2Packet_t *t2p, - smb_packet_t *tp, long code) -{ - smb_t *smbp; - unsigned short errCode; - unsigned char errClass; - unsigned long NTStatus; - - if (vcp->flags & SMB_VCFLAG_STATUS32) - smb_MapNTError(code, &NTStatus); - else - smb_MapCoreError(code, vcp, &errCode, &errClass); - - smb_FormatResponsePacket(vcp, NULL, tp); - smbp = (smb_t *) tp; - - /* We can handle long names */ - if (vcp->flags & SMB_VCFLAG_USENT) - smbp->flg2 |= SMB_FLAGS2_IS_LONG_NAME; - - /* now copy important fields from the tran 2 packet */ - smbp->com = t2p->com; - smbp->tid = t2p->tid; - smbp->mid = t2p->mid; - smbp->pid = t2p->pid; - smbp->uid = t2p->uid; - smbp->res[0] = t2p->res[0]; - if (vcp->flags & SMB_VCFLAG_STATUS32) { - smbp->rcls = (unsigned char) (NTStatus & 0xff); - smbp->reh = (unsigned char) ((NTStatus >> 8) & 0xff); - smbp->errLow = (unsigned char) ((NTStatus >> 16) & 0xff); - smbp->errHigh = (unsigned char) ((NTStatus >> 24) & 0xff); - smbp->flg2 |= SMB_FLAGS2_32BIT_STATUS; - } - else { - smbp->rcls = errClass; - smbp->errLow = (unsigned char) (errCode & 0xff); - smbp->errHigh = (unsigned char) ((errCode >> 8) & 0xff); - } - - /* send packet */ - smb_SendPacket(vcp, tp); -} - -void smb_SendTran2Packet(smb_vc_t *vcp, smb_tran2Packet_t *t2p, smb_packet_t *tp) -{ - smb_t *smbp; - unsigned short parmOffset; - unsigned short dataOffset; - unsigned short totalLength; - unsigned short dataAlign; - char *datap; - - smb_FormatResponsePacket(vcp, NULL, tp); - smbp = (smb_t *) tp; - - /* We can handle long names */ - if (vcp->flags & SMB_VCFLAG_USENT) - smbp->flg2 |= SMB_FLAGS2_IS_LONG_NAME; - - /* now copy important fields from the tran 2 packet */ - smbp->com = t2p->com; - smbp->tid = t2p->tid; - smbp->mid = t2p->mid; - smbp->pid = t2p->pid; - smbp->uid = t2p->uid; - smbp->res[0] = t2p->res[0]; - - totalLength = 1 + t2p->totalData + t2p->totalParms; - - /* now add the core parameters (tran2 info) to the packet */ - smb_SetSMBParm(tp, 0, t2p->totalParms); /* parm bytes */ - smb_SetSMBParm(tp, 1, t2p->totalData); /* data bytes */ - smb_SetSMBParm(tp, 2, 0); /* reserved */ - smb_SetSMBParm(tp, 3, t2p->totalParms); /* parm bytes in this packet */ - parmOffset = 10*2 + 35; /* parm offset in packet */ - parmOffset++; /* round to even */ - smb_SetSMBParm(tp, 4, parmOffset); /* 11 parm words plus * - * hdr, bcc and wct */ - smb_SetSMBParm(tp, 5, 0); /* parm displacement */ - smb_SetSMBParm(tp, 6, t2p->totalData); /* data in this packet */ - dataOffset = parmOffset + t2p->oldTotalParms; - dataAlign = dataOffset & 2; /* quad-align */ - dataOffset += dataAlign; - smb_SetSMBParm(tp, 7, dataOffset); /* offset of data */ - smb_SetSMBParm(tp, 8, 0); /* data displacement */ - smb_SetSMBParm(tp, 9, 0); /* low: setup word count * - * high: resvd */ - - datap = smb_GetSMBData(tp, NULL); - *datap++ = 0; /* we rounded to even */ - - totalLength += dataAlign; - smb_SetSMBDataLength(tp, totalLength); - - /* next, send the datagram */ - smb_SendPacket(vcp, tp); -} - -long smb_ReceiveV3Trans(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_tran2Packet_t *asp; - int totalParms; - int totalData; - int parmDisp; - int dataDisp; - int parmOffset; - int dataOffset; - int parmCount; - int dataCount; - int firstPacket; - int rapOp; - long code = 0; - - /* We sometimes see 0 word count. What to do? */ - if (*inp->wctp == 0) { -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - - osi_Log0(smb_logp, "TRANSACTION word count = 0"); - - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = "Transaction2 word count = 0"; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1003, NULL, - 1, inp->ncb_length, ptbuf, inp); - DeregisterEventSource(h); -#else /* DJGPP */ - osi_Log0(smb_logp, "TRANSACTION word count = 0"); -#endif /* !DJGPP */ - - smb_SetSMBDataLength(outp, 0); - smb_SendPacket(vcp, outp); - return 0; - } - - totalParms = smb_GetSMBParm(inp, 0); - totalData = smb_GetSMBParm(inp, 1); - - firstPacket = (inp->inCom == 0x25); - - /* find the packet we're reassembling */ - lock_ObtainWrite(&smb_globalLock); - asp = smb_FindTran2Packet(vcp, inp); - if (!asp) { - asp = smb_NewTran2Packet(vcp, inp, totalParms, totalData); - } - lock_ReleaseWrite(&smb_globalLock); - - /* now merge in this latest packet; start by looking up offsets */ - if (firstPacket) { - parmDisp = dataDisp = 0; - parmOffset = smb_GetSMBParm(inp, 10); - dataOffset = smb_GetSMBParm(inp, 12); - parmCount = smb_GetSMBParm(inp, 9); - dataCount = smb_GetSMBParm(inp, 11); - asp->maxReturnParms = smb_GetSMBParm(inp, 2); - asp->maxReturnData = smb_GetSMBParm(inp, 3); - - osi_Log3(smb_logp, "SMB3 received Trans init packet total data %d, cur data %d, max return data %d", - totalData, dataCount, asp->maxReturnData); - } - else { - parmDisp = smb_GetSMBParm(inp, 4); - parmOffset = smb_GetSMBParm(inp, 3); - dataDisp = smb_GetSMBParm(inp, 7); - dataOffset = smb_GetSMBParm(inp, 6); - parmCount = smb_GetSMBParm(inp, 2); - dataCount = smb_GetSMBParm(inp, 5); - - osi_Log2(smb_logp, "SMB3 received Trans aux packet parms %d, data %d", - parmCount, dataCount); - } - - /* now copy the parms and data */ - if ( asp->totalParms > 0 && parmCount != 0 ) - { - memcpy(((char *)asp->parmsp) + parmDisp, inp->data + parmOffset, parmCount); - } - if ( asp->totalData > 0 && dataCount != 0 ) { - memcpy(asp->datap + dataDisp, inp->data + dataOffset, dataCount); - } - - /* account for new bytes */ - asp->curData += dataCount; - asp->curParms += parmCount; - - /* finally, if we're done, remove the packet from the queue and dispatch it */ - if (asp->totalParms > 0 && - asp->curParms > 0 && - asp->totalData <= asp->curData && - asp->totalParms <= asp->curParms) { - /* we've received it all */ - lock_ObtainWrite(&smb_globalLock); - osi_QRemove((osi_queue_t **) &smb_tran2AssemblyQueuep, &asp->q); - lock_ReleaseWrite(&smb_globalLock); - - /* now dispatch it */ - rapOp = asp->parmsp[0]; - - if ( rapOp >= 0 && rapOp < SMB_RAP_NOPCODES && smb_rapDispatchTable[rapOp].procp) { - osi_LogEvent("AFS-Dispatch-RAP[%s]",myCrt_RapDispatch(rapOp),"vcp[%x] lana[%d] lsn[%d]",(int)vcp,vcp->lana,vcp->lsn); - osi_Log4(smb_logp,"AFS Server - Dispatch-RAP %s vcp[%x] lana[%d] lsn[%d]",myCrt_RapDispatch(rapOp),vcp,vcp->lana,vcp->lsn); - code = (*smb_rapDispatchTable[rapOp].procp)(vcp, asp, outp); - } - else { - osi_LogEvent("AFS-Dispatch-RAP [invalid]", NULL, "op[%x] vcp[%x] lana[%d] lsn[%d]", rapOp, vcp, vcp->lana, vcp->lsn); - osi_Log4(smb_logp,"AFS Server - Dispatch-RAP [INVALID] op[%x] vcp[%x] lana[%d] lsn[%d]", rapOp, vcp, vcp->lana, vcp->lsn); - code = CM_ERROR_BADOP; - } - - /* if an error is returned, we're supposed to send an error packet, - * otherwise the dispatched function already did the data sending. - * We give dispatched proc the responsibility since it knows how much - * space to allocate. - */ - if (code != 0) { - smb_SendTran2Error(vcp, asp, outp, code); - } - - /* free the input tran 2 packet */ - lock_ObtainWrite(&smb_globalLock); - smb_FreeTran2Packet(asp); - lock_ReleaseWrite(&smb_globalLock); - } - else if (firstPacket) { - /* the first packet in a multi-packet request, we need to send an - * ack to get more data. - */ - smb_SetSMBDataLength(outp, 0); - smb_SendPacket(vcp, outp); - } - - return 0; -} - -/* ANSI versions. The unicode versions support arbitrary length - share names, but we don't support unicode yet. */ - -typedef struct smb_rap_share_info_0 { - char shi0_netname[13]; -} smb_rap_share_info_0_t; - -typedef struct smb_rap_share_info_1 { - char shi1_netname[13]; - char shi1_pad; - WORD shi1_type; - DWORD shi1_remark; /* char *shi1_remark; data offset */ -} smb_rap_share_info_1_t; - -typedef struct smb_rap_share_info_2 { - char shi2_netname[13]; - char shi2_pad; - unsigned short shi2_type; - DWORD shi2_remark; /* char *shi2_remark; data offset */ - unsigned short shi2_permissions; - unsigned short shi2_max_uses; - unsigned short shi2_current_uses; - DWORD shi2_path; /* char *shi2_path; data offset */ - unsigned short shi2_passwd[9]; - unsigned short shi2_pad2; -} smb_rap_share_info_2_t; - -#define SMB_RAP_MAX_SHARES 512 - -typedef struct smb_rap_share_list { - int cShare; - int maxShares; - smb_rap_share_info_0_t * shares; -} smb_rap_share_list_t; - -int smb_rapCollectSharesProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp) { - smb_rap_share_list_t * sp; - char * name; - - name = dep->name; - - if (name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2]))) - return 0; /* skip over '.' and '..' */ - - sp = (smb_rap_share_list_t *) vrockp; - - strncpy(sp->shares[sp->cShare].shi0_netname, name, 12); - sp->shares[sp->cShare].shi0_netname[12] = 0; - - sp->cShare++; - - if (sp->cShare >= sp->maxShares) - return CM_ERROR_STOPNOW; - else - return 0; -} - -long smb_ReceiveRAPNetShareEnum(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - smb_tran2Packet_t *outp; - unsigned short * tp; - int len; - int infoLevel; - int bufsize; - int outParmsTotal; /* total parameter bytes */ - int outDataTotal; /* total data bytes */ - int code = 0; - DWORD rv; - DWORD allSubmount; - USHORT nShares; - DWORD nRegShares; - DWORD nSharesRet; - HKEY hkParam; - HKEY hkSubmount = NULL; - smb_rap_share_info_1_t * shares; - USHORT cshare = 0; - char * cstrp; - char thisShare[256]; - int i,j; - int nonrootShares; - smb_rap_share_list_t rootShares; - cm_req_t req; - cm_user_t * userp; - osi_hyper_t thyper; - - tp = p->parmsp + 1; /* skip over function number (always 0) */ - (void) smb_ParseString((char *) tp, (char **) &tp); /* skip over parm descriptor */ - (void) smb_ParseString((char *) tp, (char **) &tp); /* skip over data descriptor */ - infoLevel = tp[0]; - bufsize = tp[1]; - - if (infoLevel != 1) { - return CM_ERROR_INVAL; - } - - /* first figure out how many shares there are */ - rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, 0, - KEY_QUERY_VALUE, &hkParam); - if (rv == ERROR_SUCCESS) { - len = sizeof(allSubmount); - rv = RegQueryValueEx(hkParam, "AllSubmount", NULL, NULL, - (BYTE *) &allSubmount, &len); - if (rv != ERROR_SUCCESS || allSubmount != 0) { - allSubmount = 1; - } - RegCloseKey (hkParam); - } - - rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, KEY_QUERY_VALUE, &hkSubmount); - if (rv == ERROR_SUCCESS) { - rv = RegQueryInfoKey(hkSubmount, NULL, NULL, NULL, NULL, - NULL, NULL, &nRegShares, NULL, NULL, NULL, NULL); - if (rv != ERROR_SUCCESS) - nRegShares = 0; - } else { - hkSubmount = NULL; - } - - /* fetch the root shares */ - rootShares.maxShares = SMB_RAP_MAX_SHARES; - rootShares.cShare = 0; - rootShares.shares = malloc( sizeof(smb_rap_share_info_0_t) * SMB_RAP_MAX_SHARES ); - - cm_InitReq(&req); - - userp = smb_GetTran2User(vcp,p); - - thyper.HighPart = 0; - thyper.LowPart = 0; - - cm_HoldSCache(cm_data.rootSCachep); - cm_ApplyDir(cm_data.rootSCachep, smb_rapCollectSharesProc, &rootShares, &thyper, userp, &req, NULL); - cm_ReleaseSCache(cm_data.rootSCachep); - - cm_ReleaseUser(userp); - - nShares = rootShares.cShare + nRegShares + allSubmount; - -#define REMARK_LEN 1 - outParmsTotal = 8; /* 4 dwords */ - outDataTotal = (sizeof(smb_rap_share_info_1_t) + REMARK_LEN) * nShares ; - if(outDataTotal > bufsize) { - nSharesRet = bufsize / (sizeof(smb_rap_share_info_1_t) + REMARK_LEN); - outDataTotal = (sizeof(smb_rap_share_info_1_t) + REMARK_LEN) * nSharesRet; - } - else { - nSharesRet = nShares; - } - - outp = smb_GetTran2ResponsePacket(vcp, p, op, outParmsTotal, outDataTotal); - - /* now for the submounts */ - shares = (smb_rap_share_info_1_t *) outp->datap; - cstrp = outp->datap + sizeof(smb_rap_share_info_1_t) * nSharesRet; - - memset(outp->datap, 0, (sizeof(smb_rap_share_info_1_t) + REMARK_LEN) * nSharesRet); - - if (allSubmount) { - strcpy( shares[cshare].shi1_netname, "all" ); - shares[cshare].shi1_remark = cstrp - outp->datap; - /* type and pad are zero already */ - cshare++; - cstrp+=REMARK_LEN; - } - - if (hkSubmount) { - for (i=0; i < nRegShares && cshare < nSharesRet; i++) { - len = sizeof(thisShare); - rv = RegEnumValue(hkSubmount, i, thisShare, &len, NULL, NULL, NULL, NULL); - if (rv == ERROR_SUCCESS && strlen(thisShare) && (!allSubmount || stricmp(thisShare,"all"))) { - strncpy(shares[cshare].shi1_netname, thisShare, sizeof(shares->shi1_netname)-1); - shares[cshare].shi1_netname[sizeof(shares->shi1_netname)-1] = 0; /* unfortunate truncation */ - shares[cshare].shi1_remark = cstrp - outp->datap; - cshare++; - cstrp+=REMARK_LEN; - } - else - nShares--; /* uncount key */ - } - - RegCloseKey(hkSubmount); - } - - nonrootShares = cshare; - - for (i=0; i < rootShares.cShare && cshare < nSharesRet; i++) { - /* in case there are collisions with submounts, submounts have higher priority */ - for (j=0; j < nonrootShares; j++) - if (!stricmp(shares[j].shi1_netname, rootShares.shares[i].shi0_netname)) - break; - - if (j < nonrootShares) { - nShares--; /* uncount */ - continue; - } - - strcpy(shares[cshare].shi1_netname, rootShares.shares[i].shi0_netname); - shares[cshare].shi1_remark = cstrp - outp->datap; - cshare++; - cstrp+=REMARK_LEN; - } - - outp->parmsp[0] = ((cshare == nShares)? ERROR_SUCCESS : ERROR_MORE_DATA); - outp->parmsp[1] = 0; - outp->parmsp[2] = cshare; - outp->parmsp[3] = nShares; - - outp->totalData = cstrp - outp->datap; - outp->totalParms = outParmsTotal; - - smb_SendTran2Packet(vcp, outp, op); - smb_FreeTran2Packet(outp); - - free(rootShares.shares); - - return code; -} - -long smb_ReceiveRAPNetShareGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - smb_tran2Packet_t *outp; - unsigned short * tp; - char * shareName; - BOOL shareFound = FALSE; - unsigned short infoLevel; - unsigned short bufsize; - int totalData; - int totalParam; - DWORD len; - HKEY hkParam; - HKEY hkSubmount; - DWORD allSubmount; - LONG rv; - long code = 0; - - tp = p->parmsp + 1; /* skip over function number (always 1) */ - (void) smb_ParseString( (char *) tp, (char **) &tp); /* skip over param descriptor */ - (void) smb_ParseString( (char *) tp, (char **) &tp); /* skip over data descriptor */ - shareName = smb_ParseString( (char *) tp, (char **) &tp); - infoLevel = *tp++; - bufsize = *tp++; - - totalParam = 6; - - if (infoLevel == 0) - totalData = sizeof(smb_rap_share_info_0_t); - else if(infoLevel == SMB_INFO_STANDARD) - totalData = sizeof(smb_rap_share_info_1_t) + 1; /* + empty string */ - else if(infoLevel == SMB_INFO_QUERY_EA_SIZE) - totalData = sizeof(smb_rap_share_info_2_t) + 2; /* + two empty strings */ - else - return CM_ERROR_INVAL; - - outp = smb_GetTran2ResponsePacket(vcp, p, op, totalParam, totalData); - - if(!stricmp(shareName,"all")) { - rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, 0, - KEY_QUERY_VALUE, &hkParam); - if (rv == ERROR_SUCCESS) { - len = sizeof(allSubmount); - rv = RegQueryValueEx(hkParam, "AllSubmount", NULL, NULL, - (BYTE *) &allSubmount, &len); - if (rv != ERROR_SUCCESS || allSubmount != 0) { - allSubmount = 1; - } - RegCloseKey (hkParam); - } - - if (allSubmount) - shareFound = TRUE; - - } else { - rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY "\\Submounts", 0, - KEY_QUERY_VALUE, &hkSubmount); - if (rv == ERROR_SUCCESS) { - rv = RegQueryValueEx(hkSubmount, shareName, NULL, NULL, NULL, NULL); - if (rv == ERROR_SUCCESS) { - shareFound = TRUE; - } - RegCloseKey(hkSubmount); - } - } - - if (!shareFound) { - smb_FreeTran2Packet(outp); - return CM_ERROR_BADSHARENAME; - } - - memset(outp->datap, 0, totalData); - - outp->parmsp[0] = 0; - outp->parmsp[1] = 0; - outp->parmsp[2] = totalData; - - if (infoLevel == 0) { - smb_rap_share_info_0_t * info = (smb_rap_share_info_0_t *) outp->datap; - strncpy(info->shi0_netname, shareName, sizeof(info->shi0_netname)-1); - info->shi0_netname[sizeof(info->shi0_netname)-1] = 0; - } else if(infoLevel == SMB_INFO_STANDARD) { - smb_rap_share_info_1_t * info = (smb_rap_share_info_1_t *) outp->datap; - strncpy(info->shi1_netname, shareName, sizeof(info->shi1_netname)-1); - info->shi1_netname[sizeof(info->shi1_netname)-1] = 0; - info->shi1_remark = ((unsigned char *) (info + 1)) - outp->datap; - /* type and pad are already zero */ - } else { /* infoLevel==2 */ - smb_rap_share_info_2_t * info = (smb_rap_share_info_2_t *) outp->datap; - strncpy(info->shi2_netname, shareName, sizeof(info->shi2_netname)-1); - info->shi2_netname[sizeof(info->shi2_netname)-1] = 0; - info->shi2_remark = ((unsigned char *) (info + 1)) - outp->datap; - info->shi2_permissions = ACCESS_ALL; - info->shi2_max_uses = (unsigned short) -1; - info->shi2_path = 1 + (((unsigned char *) (info + 1)) - outp->datap); - } - - outp->totalData = totalData; - outp->totalParms = totalParam; - - smb_SendTran2Packet(vcp, outp, op); - smb_FreeTran2Packet(outp); - - return code; -} - -typedef struct smb_rap_wksta_info_10 { - DWORD wki10_computername; /*char *wki10_computername;*/ - DWORD wki10_username; /* char *wki10_username; */ - DWORD wki10_langroup; /* char *wki10_langroup;*/ - unsigned char wki10_ver_major; - unsigned char wki10_ver_minor; - DWORD wki10_logon_domain; /*char *wki10_logon_domain;*/ - DWORD wki10_oth_domains; /* char *wki10_oth_domains;*/ -} smb_rap_wksta_info_10_t; - - -long smb_ReceiveRAPNetWkstaGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - smb_tran2Packet_t *outp; - long code = 0; - int infoLevel; - int bufsize; - unsigned short * tp; - int totalData; - int totalParams; - smb_rap_wksta_info_10_t * info; - char * cstrp; - smb_user_t *uidp; - - tp = p->parmsp + 1; /* Skip over function number */ - (void) smb_ParseString((unsigned char*) tp, (char **) &tp); /* skip over param descriptor */ - (void) smb_ParseString((unsigned char*) tp, (char **) &tp); /* skip over data descriptor */ - infoLevel = *tp++; - bufsize = *tp++; - - if (infoLevel != 10) { - return CM_ERROR_INVAL; - } - - totalParams = 6; - - /* infolevel 10 */ - totalData = sizeof(*info) + /* info */ - MAX_COMPUTERNAME_LENGTH + /* wki10_computername */ - SMB_MAX_USERNAME_LENGTH + /* wki10_username */ - MAX_COMPUTERNAME_LENGTH + /* wki10_langroup */ - MAX_COMPUTERNAME_LENGTH + /* wki10_logon_domain */ - 1; /* wki10_oth_domains (null)*/ - - outp = smb_GetTran2ResponsePacket(vcp, p, op, totalParams, totalData); - - memset(outp->parmsp,0,totalParams); - memset(outp->datap,0,totalData); - - info = (smb_rap_wksta_info_10_t *) outp->datap; - cstrp = (char *) (info + 1); - - info->wki10_computername = (DWORD) (cstrp - outp->datap); - strcpy(cstrp, smb_localNamep); - cstrp += strlen(cstrp) + 1; - - info->wki10_username = (DWORD) (cstrp - outp->datap); - uidp = smb_FindUID(vcp, p->uid, 0); - if (uidp) { - lock_ObtainMutex(&uidp->mx); - if(uidp->unp && uidp->unp->name) - strcpy(cstrp, uidp->unp->name); - lock_ReleaseMutex(&uidp->mx); - smb_ReleaseUID(uidp); - } - cstrp += strlen(cstrp) + 1; - - info->wki10_langroup = (DWORD) (cstrp - outp->datap); - strcpy(cstrp, "WORKGROUP"); - cstrp += strlen(cstrp) + 1; - - /* TODO: Not sure what values these should take, but these work */ - info->wki10_ver_major = 5; - info->wki10_ver_minor = 1; - - info->wki10_logon_domain = (DWORD) (cstrp - outp->datap); - strcpy(cstrp, smb_ServerDomainName); - cstrp += strlen(cstrp) + 1; - - info->wki10_oth_domains = (DWORD) (cstrp - outp->datap); - cstrp ++; /* no other domains */ - - outp->totalData = (unsigned short) (cstrp - outp->datap); /* actual data size */ - outp->parmsp[2] = outp->totalData; - outp->totalParms = totalParams; - - smb_SendTran2Packet(vcp,outp,op); - smb_FreeTran2Packet(outp); - - return code; -} - -typedef struct smb_rap_server_info_0 { - char sv0_name[16]; -} smb_rap_server_info_0_t; - -typedef struct smb_rap_server_info_1 { - char sv1_name[16]; - char sv1_version_major; - char sv1_version_minor; - unsigned long sv1_type; - DWORD *sv1_comment_or_master_browser; /* char *sv1_comment_or_master_browser;*/ -} smb_rap_server_info_1_t; - -char smb_ServerComment[] = "OpenAFS Client"; -int smb_ServerCommentLen = sizeof(smb_ServerComment); - -#define SMB_SV_TYPE_SERVER 0x00000002L -#define SMB_SV_TYPE_NT 0x00001000L -#define SMB_SV_TYPE_SERVER_NT 0x00008000L - -long smb_ReceiveRAPNetServerGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - smb_tran2Packet_t *outp; - long code = 0; - int infoLevel; - int bufsize; - unsigned short * tp; - int totalData; - int totalParams; - smb_rap_server_info_0_t * info0; - smb_rap_server_info_1_t * info1; - char * cstrp; - - tp = p->parmsp + 1; /* Skip over function number */ - (void) smb_ParseString((unsigned char*) tp, (char **) &tp); /* skip over param descriptor */ - (void) smb_ParseString((unsigned char*) tp, (char **) &tp); /* skip over data descriptor */ - infoLevel = *tp++; - bufsize = *tp++; - - if (infoLevel != 0 && infoLevel != 1) { - return CM_ERROR_INVAL; - } - - totalParams = 6; - - totalData = - (infoLevel == 0) ? sizeof(smb_rap_server_info_0_t) - : (sizeof(smb_rap_server_info_1_t) + smb_ServerCommentLen); - - outp = smb_GetTran2ResponsePacket(vcp, p, op, totalParams, totalData); - - memset(outp->parmsp,0,totalParams); - memset(outp->datap,0,totalData); - - if (infoLevel == 0) { - info0 = (smb_rap_server_info_0_t *) outp->datap; - cstrp = (char *) (info0 + 1); - strcpy(info0->sv0_name, "AFS"); - } else { /* infoLevel == SMB_INFO_STANDARD */ - info1 = (smb_rap_server_info_1_t *) outp->datap; - cstrp = (char *) (info1 + 1); - strcpy(info1->sv1_name, "AFS"); - - info1->sv1_type = - SMB_SV_TYPE_SERVER | - SMB_SV_TYPE_NT | - SMB_SV_TYPE_SERVER_NT; - - info1->sv1_version_major = 5; - info1->sv1_version_minor = 1; - info1->sv1_comment_or_master_browser = (DWORD *) (cstrp - outp->datap); - - strcpy(cstrp, smb_ServerComment); - - cstrp += smb_ServerCommentLen; - } - - totalData = cstrp - outp->datap; - outp->totalData = min(bufsize,totalData); /* actual data size */ - outp->parmsp[0] = (outp->totalData == totalData)? 0 : ERROR_MORE_DATA; - outp->parmsp[2] = totalData; - outp->totalParms = totalParams; - - smb_SendTran2Packet(vcp,outp,op); - smb_FreeTran2Packet(outp); - - return code; -} - -long smb_ReceiveV3Tran2A(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_tran2Packet_t *asp; - int totalParms; - int totalData; - int parmDisp; - int dataDisp; - int parmOffset; - int dataOffset; - int parmCount; - int dataCount; - int firstPacket; - long code = 0; - - /* We sometimes see 0 word count. What to do? */ - if (*inp->wctp == 0) { -#ifndef DJGPP - HANDLE h; - char *ptbuf[1]; - - osi_Log0(smb_logp, "TRANSACTION2 word count = 0"); - - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = "Transaction2 word count = 0"; - ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1003, NULL, - 1, inp->ncb_length, ptbuf, inp); - DeregisterEventSource(h); -#else /* DJGPP */ - osi_Log0(smb_logp, "TRANSACTION2 word count = 0"); -#endif /* !DJGPP */ - - smb_SetSMBDataLength(outp, 0); - smb_SendPacket(vcp, outp); - return 0; - } - - totalParms = smb_GetSMBParm(inp, 0); - totalData = smb_GetSMBParm(inp, 1); - - firstPacket = (inp->inCom == 0x32); - - /* find the packet we're reassembling */ - lock_ObtainWrite(&smb_globalLock); - asp = smb_FindTran2Packet(vcp, inp); - if (!asp) { - asp = smb_NewTran2Packet(vcp, inp, totalParms, totalData); - } - lock_ReleaseWrite(&smb_globalLock); - - /* now merge in this latest packet; start by looking up offsets */ - if (firstPacket) { - parmDisp = dataDisp = 0; - parmOffset = smb_GetSMBParm(inp, 10); - dataOffset = smb_GetSMBParm(inp, 12); - parmCount = smb_GetSMBParm(inp, 9); - dataCount = smb_GetSMBParm(inp, 11); - asp->maxReturnParms = smb_GetSMBParm(inp, 2); - asp->maxReturnData = smb_GetSMBParm(inp, 3); - - osi_Log3(smb_logp, "SMB3 received T2 init packet total data %d, cur data %d, max return data %d", - totalData, dataCount, asp->maxReturnData); - } - else { - parmDisp = smb_GetSMBParm(inp, 4); - parmOffset = smb_GetSMBParm(inp, 3); - dataDisp = smb_GetSMBParm(inp, 7); - dataOffset = smb_GetSMBParm(inp, 6); - parmCount = smb_GetSMBParm(inp, 2); - dataCount = smb_GetSMBParm(inp, 5); - - osi_Log2(smb_logp, "SMB3 received T2 aux packet parms %d, data %d", - parmCount, dataCount); - } - - /* now copy the parms and data */ - if ( asp->totalParms > 0 && parmCount != 0 ) - { - memcpy(((char *)asp->parmsp) + parmDisp, inp->data + parmOffset, parmCount); - } - if ( asp->totalData > 0 && dataCount != 0 ) { - memcpy(asp->datap + dataDisp, inp->data + dataOffset, dataCount); - } - - /* account for new bytes */ - asp->curData += dataCount; - asp->curParms += parmCount; - - /* finally, if we're done, remove the packet from the queue and dispatch it */ - if (asp->totalParms > 0 && - asp->curParms > 0 && - asp->totalData <= asp->curData && - asp->totalParms <= asp->curParms) { - /* we've received it all */ - lock_ObtainWrite(&smb_globalLock); - osi_QRemove((osi_queue_t **) &smb_tran2AssemblyQueuep, &asp->q); - lock_ReleaseWrite(&smb_globalLock); - - /* now dispatch it */ - if ( asp->opcode >= 0 && asp->opcode < 20 && smb_tran2DispatchTable[asp->opcode].procp) { - osi_LogEvent("AFS-Dispatch-2[%s]",myCrt_2Dispatch(asp->opcode),"vcp[%x] lana[%d] lsn[%d]",(int)vcp,vcp->lana,vcp->lsn); - osi_Log4(smb_logp,"AFS Server - Dispatch-2 %s vcp[%x] lana[%d] lsn[%d]",myCrt_2Dispatch(asp->opcode),vcp,vcp->lana,vcp->lsn); - code = (*smb_tran2DispatchTable[asp->opcode].procp)(vcp, asp, outp); - } - else { - osi_LogEvent("AFS-Dispatch-2 [invalid]", NULL, "op[%x] vcp[%x] lana[%d] lsn[%d]", asp->opcode, vcp, vcp->lana, vcp->lsn); - osi_Log4(smb_logp,"AFS Server - Dispatch-2 [INVALID] op[%x] vcp[%x] lana[%d] lsn[%d]", asp->opcode, vcp, vcp->lana, vcp->lsn); - code = CM_ERROR_BADOP; - } - - /* if an error is returned, we're supposed to send an error packet, - * otherwise the dispatched function already did the data sending. - * We give dispatched proc the responsibility since it knows how much - * space to allocate. - */ - if (code != 0) { - smb_SendTran2Error(vcp, asp, outp, code); - } - - /* free the input tran 2 packet */ - lock_ObtainWrite(&smb_globalLock); - smb_FreeTran2Packet(asp); - lock_ReleaseWrite(&smb_globalLock); - } - else if (firstPacket) { - /* the first packet in a multi-packet request, we need to send an - * ack to get more data. - */ - smb_SetSMBDataLength(outp, 0); - smb_SendPacket(vcp, outp); - } - - return 0; -} - -long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - char *pathp; - smb_tran2Packet_t *outp; - long code = 0; - cm_space_t *spacep; - int excl; - cm_user_t *userp; - cm_scache_t *dscp; /* dir we're dealing with */ - cm_scache_t *scp; /* file we're creating */ - cm_attr_t setAttr; - int initialModeBits; - smb_fid_t *fidp; - int attributes; - char *lastNamep; - afs_uint32 dosTime; - int openFun; - int trunc; - int openMode; - int extraInfo; - int openAction; - int parmSlot; /* which parm we're dealing with */ - long returnEALength; - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - scp = NULL; - - extraInfo = (p->parmsp[0] & 1); /* return extra info */ - returnEALength = (p->parmsp[0] & 8); /* return extended attr length */ - - openFun = p->parmsp[6]; /* open function */ - excl = ((openFun & 3) == 0); - trunc = ((openFun & 3) == 2); /* truncate it */ - openMode = (p->parmsp[1] & 0x7); - openAction = 0; /* tracks what we did */ - - attributes = p->parmsp[3]; - dosTime = p->parmsp[4] | (p->parmsp[5] << 16); - - /* compute initial mode bits based on read-only flag in attributes */ - initialModeBits = 0666; - if (attributes & 1) - initialModeBits &= ~0222; - - pathp = (char *) (&p->parmsp[14]); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - outp = smb_GetTran2ResponsePacket(vcp, p, op, 40, 0); - - spacep = cm_GetSpace(); - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - if (lastNamep && strcmp(lastNamep, SMB_IOCTL_FILENAME) == 0) { - /* special case magic file name for receiving IOCTL requests - * (since IOCTL calls themselves aren't getting through). - */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - smb_SetupIoctlFid(fidp, spacep); - - /* copy out remainder of the parms */ - parmSlot = 0; - outp->parmsp[parmSlot++] = fidp->fid; - if (extraInfo) { - outp->parmsp[parmSlot++] = 0; /* attrs */ - outp->parmsp[parmSlot++] = 0; /* mod time */ - outp->parmsp[parmSlot++] = 0; - outp->parmsp[parmSlot++] = 0; /* len */ - outp->parmsp[parmSlot++] = 0x7fff; - outp->parmsp[parmSlot++] = openMode; - outp->parmsp[parmSlot++] = 0; /* file type 0 ==> normal file or dir */ - outp->parmsp[parmSlot++] = 0; /* IPC junk */ - } - /* and the final "always present" stuff */ - outp->parmsp[parmSlot++] = 1; /* openAction found existing file */ - /* next write out the "unique" ID */ - outp->parmsp[parmSlot++] = 0x1234; - outp->parmsp[parmSlot++] = 0x5678; - outp->parmsp[parmSlot++] = 0; - if (returnEALength) { - outp->parmsp[parmSlot++] = 0; - outp->parmsp[parmSlot++] = 0; - } - - outp->totalData = 0; - outp->totalParms = parmSlot * 2; - - smb_SendTran2Packet(vcp, outp, op); - - smb_FreeTran2Packet(outp); - - /* and clean up fid reference */ - smb_ReleaseFID(fidp); - return 0; - } - -#ifdef DEBUG_VERBOSE - { - char *hexp, *asciip; - asciip = (lastNamep ? lastNamep : pathp); - hexp = osi_HexifyString( asciip ); - DEBUG_EVENT2("AFS","T2Open H[%s] A[%s]", hexp, asciip); - free(hexp); - } -#endif - - userp = smb_GetTran2User(vcp, p); - /* In the off chance that userp is NULL, we log and abandon */ - if (!userp) { - osi_Log1(smb_logp, "ReceiveTran2Open user [%d] not resolvable", p->uid); - smb_FreeTran2Packet(outp); - return CM_ERROR_BADSMB; - } - - code = smb_LookupTIDPath(vcp, p->tid, &tidPathp); - if (code == CM_ERROR_TIDIPC) { - /* Attempt to use a TID allocated for IPC. The client - * is probably looking for DCE RPC end points which we - * don't support OR it could be looking to make a DFS - * referral request. - */ - osi_Log0(smb_logp, "Tran2Open received IPC TID"); -#ifndef DFS_SUPPORT - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return CM_ERROR_NOSUCHPATH; -#endif - } - - dscp = NULL; - code = cm_NameI(cm_data.rootSCachep, pathp, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &scp); - if (code != 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->data, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &dscp); - cm_FreeSpace(spacep); - - if (code) { - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return code; - } - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - if ( WANTS_DFS_PATHNAMES(p) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* otherwise, scp points to the parent directory. Do a lookup, - * and truncate the file if we find it, otherwise we create the - * file. - */ - if (!lastNamep) - lastNamep = pathp; - else - lastNamep++; - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, userp, - &req, &scp); - if (code && code != CM_ERROR_NOSUCHFILE) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return code; - } - } else { -#ifdef DFS_SUPPORT - if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - if ( WANTS_DFS_PATHNAMES(p) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* macintosh is expensive to program for it */ - cm_FreeSpace(spacep); - } - - /* if we get here, if code is 0, the file exists and is represented by - * scp. Otherwise, we have to create it. - */ - if (code == 0) { - code = cm_CheckOpen(scp, openMode, trunc, userp, &req); - if (code) { - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return code; - } - - if (excl) { - /* oops, file shouldn't be there */ - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return CM_ERROR_EXISTS; - } - - if (trunc) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - code = cm_SetAttr(scp, &setAttr, userp, &req); - openAction = 3; /* truncated existing file */ - } - else - openAction = 1; /* found existing file */ - } - else if (!(openFun & 0x10)) { - /* don't create if not found */ - if (dscp) - cm_ReleaseSCache(dscp); - osi_assert(scp == NULL); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return CM_ERROR_NOSUCHFILE; - } - else { - osi_assert(dscp != NULL && scp == NULL); - openAction = 2; /* created file */ - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - smb_UnixTimeFromSearchTime(&setAttr.clientModTime, dosTime); - code = cm_Create(dscp, lastNamep, 0, &setAttr, &scp, userp, - &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, lastNamep, NULL, TRUE); - if (!excl && code == CM_ERROR_EXISTS) { - /* not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after we - * started this call. - */ - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, - userp, &req, &scp); - if (code == 0) { - if (trunc) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - code = cm_SetAttr(scp, &setAttr, userp, - &req); - } - } /* lookup succeeded */ - } - } - - /* we don't need this any longer */ - if (dscp) - cm_ReleaseSCache(dscp); - - if (code) { - /* something went wrong creating or truncating the file */ - if (scp) - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return code; - } - - /* make sure we're about to open a file */ - if (scp->fileType != CM_SCACHETYPE_FILE) { - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - cm_scache_t * targetScp = 0; - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - if (scp->fileType != CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - return CM_ERROR_ISDIR; - } - } - - /* now all we have to do is open the file itself */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); - - /* save a pointer to the vnode */ - fidp->scp = scp; - - /* compute open mode */ - if (openMode != 1) fidp->flags |= SMB_FID_OPENREAD; - if (openMode == 1 || openMode == 2) - fidp->flags |= SMB_FID_OPENWRITE; - - smb_ReleaseFID(fidp); - - cm_Open(scp, 0, userp); - - /* copy out remainder of the parms */ - parmSlot = 0; - outp->parmsp[parmSlot++] = fidp->fid; - lock_ObtainMutex(&scp->mx); - if (extraInfo) { - outp->parmsp[parmSlot++] = smb_Attributes(scp); - smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime); - outp->parmsp[parmSlot++] = (unsigned short)(dosTime & 0xffff); - outp->parmsp[parmSlot++] = (unsigned short)((dosTime>>16) & 0xffff); - outp->parmsp[parmSlot++] = (unsigned short) (scp->length.LowPart & 0xffff); - outp->parmsp[parmSlot++] = (unsigned short) ((scp->length.LowPart >> 16) & 0xffff); - outp->parmsp[parmSlot++] = openMode; - outp->parmsp[parmSlot++] = 0; /* file type 0 ==> normal file or dir */ - outp->parmsp[parmSlot++] = 0; /* IPC junk */ - } - /* and the final "always present" stuff */ - outp->parmsp[parmSlot++] = openAction; - /* next write out the "unique" ID */ - outp->parmsp[parmSlot++] = (unsigned short) (scp->fid.vnode & 0xffff); - outp->parmsp[parmSlot++] = (unsigned short) (scp->fid.volume & 0xffff); - outp->parmsp[parmSlot++] = 0; - if (returnEALength) { - outp->parmsp[parmSlot++] = 0; - outp->parmsp[parmSlot++] = 0; - } - lock_ReleaseMutex(&scp->mx); - outp->totalData = 0; /* total # of data bytes */ - outp->totalParms = parmSlot * 2; /* shorts are two bytes */ - - smb_SendTran2Packet(vcp, outp, op); - - smb_FreeTran2Packet(outp); - - cm_ReleaseUser(userp); - /* leave scp held since we put it in fidp->scp */ - return 0; -} - -long smb_ReceiveTran2FindFirst(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2FindFirst - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long smb_ReceiveTran2FindNext(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2FindNext - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long smb_ReceiveTran2QFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - smb_tran2Packet_t *outp; - smb_tran2QFSInfo_t qi; - int responseSize; - osi_hyper_t temp; - static char FSname[6] = {'A', 0, 'F', 0, 'S', 0}; - - osi_Log1(smb_logp, "T2 QFSInfo type 0x%x", p->parmsp[0]); - - switch (p->parmsp[0]) { - case 1: responseSize = sizeof(qi.u.allocInfo); break; - case 2: responseSize = sizeof(qi.u.volumeInfo); break; - case 0x102: responseSize = sizeof(qi.u.FSvolumeInfo); break; - case 0x103: responseSize = sizeof(qi.u.FSsizeInfo); break; - case 0x104: responseSize = sizeof(qi.u.FSdeviceInfo); break; - case 0x105: responseSize = sizeof(qi.u.FSattributeInfo); break; - case 0x200: /* CIFS Unix Info */ - case 0x301: /* Mac FS Info */ - default: return CM_ERROR_INVAL; - } - - outp = smb_GetTran2ResponsePacket(vcp, p, op, 0, responseSize); - switch (p->parmsp[0]) { - case 1: - /* alloc info */ - qi.u.allocInfo.FSID = 0; - qi.u.allocInfo.sectorsPerAllocUnit = 1; - qi.u.allocInfo.totalAllocUnits = 0x7fffffff; - qi.u.allocInfo.availAllocUnits = 0x3fffffff; - qi.u.allocInfo.bytesPerSector = 1024; - break; - - case 2: - /* volume info */ - qi.u.volumeInfo.vsn = 1234; - qi.u.volumeInfo.vnCount = 4; - /* we're supposed to pad it out with zeroes to the end */ - memset(&qi.u.volumeInfo.label, 0, sizeof(qi.u.volumeInfo.label)); - memcpy(qi.u.volumeInfo.label, "AFS", 4); - break; - - case 0x102: - /* FS volume info */ - memset((char *)&qi.u.FSvolumeInfo.vct, 0, sizeof(FILETIME)); - qi.u.FSvolumeInfo.vsn = 1234; - qi.u.FSvolumeInfo.vnCount = 8; - memcpy(qi.u.FSvolumeInfo.label, "A\0F\0S\0\0", 8); - break; - - case 0x103: - /* FS size info */ - temp.HighPart = 0; - temp.LowPart = 0x7fffffff; - qi.u.FSsizeInfo.totalAllocUnits = temp; - temp.LowPart = 0x3fffffff; - qi.u.FSsizeInfo.availAllocUnits = temp; - qi.u.FSsizeInfo.sectorsPerAllocUnit = 1; - qi.u.FSsizeInfo.bytesPerSector = 1024; - break; - - case 0x104: - /* FS device info */ - qi.u.FSdeviceInfo.devType = 0; /* don't have a number */ - qi.u.FSdeviceInfo.characteristics = 0x50; /* remote, virtual */ - break; - - case 0x105: - /* FS attribute info */ - /* attributes, defined in WINNT.H: - * FILE_CASE_SENSITIVE_SEARCH 0x1 - * FILE_CASE_PRESERVED_NAMES 0x2 - * 0x4000 - * If bit 0x4000 is not set, Windows 95 thinks - * we can't handle long (non-8.3) names, - * despite our protestations to the contrary. - */ - qi.u.FSattributeInfo.attributes = 0x4003; - qi.u.FSattributeInfo.maxCompLength = 255; - qi.u.FSattributeInfo.FSnameLength = 6; - memcpy(qi.u.FSattributeInfo.FSname, FSname, 6); - break; - } - - /* copy out return data, and set corresponding sizes */ - outp->totalParms = 0; - outp->totalData = responseSize; - memcpy(outp->datap, &qi, responseSize); - - /* send and free the packets */ - smb_SendTran2Packet(vcp, outp, op); - smb_FreeTran2Packet(outp); - - return 0; -} - -long smb_ReceiveTran2SetFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2SetFSInfo - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -struct smb_ShortNameRock { - char *maskp; - unsigned int vnode; - char *shortName; - size_t shortNameLen; -}; - -int cm_GetShortNameProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *vrockp, - osi_hyper_t *offp) -{ - struct smb_ShortNameRock *rockp; - char *shortNameEnd; - - rockp = vrockp; - /* compare both names and vnodes, though probably just comparing vnodes - * would be safe enough. - */ - if (cm_stricmp(dep->name, rockp->maskp) != 0) - return 0; - if (ntohl(dep->fid.vnode) != rockp->vnode) - return 0; - /* This is the entry */ - cm_Gen8Dot3Name(dep, rockp->shortName, &shortNameEnd); - rockp->shortNameLen = shortNameEnd - rockp->shortName; - return CM_ERROR_STOPNOW; -} - -long cm_GetShortName(char *pathp, cm_user_t *userp, cm_req_t *reqp, - char *tidPathp, int vnode, char *shortName, size_t *shortNameLenp) -{ - struct smb_ShortNameRock rock; - char *lastNamep; - cm_space_t *spacep; - cm_scache_t *dscp; - int caseFold = CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD; - long code = 0; - osi_hyper_t thyper; - - spacep = cm_GetSpace(); - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - code = cm_NameI(cm_data.rootSCachep, spacep->data, caseFold, userp, tidPathp, - reqp, &dscp); - cm_FreeSpace(spacep); - if (code) - return code; - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - return CM_ERROR_PATH_NOT_COVERED; - } -#endif /* DFS_SUPPORT */ - - if (!lastNamep) lastNamep = pathp; - else lastNamep++; - thyper.LowPart = 0; - thyper.HighPart = 0; - rock.shortName = shortName; - rock.vnode = vnode; - rock.maskp = lastNamep; - code = cm_ApplyDir(dscp, cm_GetShortNameProc, &rock, &thyper, userp, reqp, NULL); - - cm_ReleaseSCache(dscp); - - if (code == 0) - return CM_ERROR_NOSUCHFILE; - if (code == CM_ERROR_STOPNOW) { - *shortNameLenp = rock.shortNameLen; - return 0; - } - return code; -} - -long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *opx) -{ - smb_tran2Packet_t *outp; - afs_uint32 dosTime; - FILETIME ft; - unsigned short infoLevel; - int nbytesRequired; - unsigned short attributes; - unsigned long extAttributes; - char shortName[13]; - unsigned int len; - cm_user_t *userp; - cm_space_t *spacep; - cm_scache_t *scp, *dscp; - long code = 0; - char *op; - char *tidPathp; - char *lastComp; - cm_req_t req; - - cm_InitReq(&req); - - infoLevel = p->parmsp[0]; - if (infoLevel == SMB_INFO_IS_NAME_VALID) - nbytesRequired = 0; - else if (infoLevel == SMB_INFO_STANDARD) - nbytesRequired = 22; - else if (infoLevel == SMB_INFO_QUERY_EA_SIZE) - nbytesRequired = 26; - else if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) - nbytesRequired = 40; - else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) - nbytesRequired = 24; - else if (infoLevel == SMB_QUERY_FILE_EA_INFO) - nbytesRequired = 4; - else if (infoLevel == SMB_QUERY_FILE_ALT_NAME_INFO) - nbytesRequired = 30; - else { - osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x", - p->opcode, infoLevel); - smb_SendTran2Error(vcp, p, opx, CM_ERROR_INVAL); - return 0; - } - osi_Log2(smb_logp, "T2 QPathInfo type 0x%x path %s", infoLevel, - osi_LogSaveString(smb_logp, (char *)(&p->parmsp[3]))); - - outp = smb_GetTran2ResponsePacket(vcp, p, opx, 2, nbytesRequired); - - if (infoLevel > 0x100) - outp->totalParms = 2; - else - outp->totalParms = 0; - outp->totalData = nbytesRequired; - - /* now, if we're at infoLevel 6, we're only being asked to check - * the syntax, so we just OK things now. In particular, we're *not* - * being asked to verify anything about the state of any parent dirs. - */ - if (infoLevel == SMB_INFO_IS_NAME_VALID) { - smb_SendTran2Packet(vcp, outp, opx); - smb_FreeTran2Packet(outp); - return 0; - } - - userp = smb_GetTran2User(vcp, p); - if (!userp) { - osi_Log1(smb_logp, "ReceiveTran2QPathInfo unable to resolve user [%d]", p->uid); - smb_FreeTran2Packet(outp); - return CM_ERROR_BADSMB; - } - - code = smb_LookupTIDPath(vcp, p->tid, &tidPathp); - if(code) { - cm_ReleaseUser(userp); - smb_SendTran2Error(vcp, p, opx, CM_ERROR_NOSUCHPATH); - smb_FreeTran2Packet(outp); - return 0; - } - - /* - * XXX Strange hack XXX - * - * As of Patch 7 (13 January 98), we are having the following problem: - * In NT Explorer 4.0, whenever we click on a directory, AFS gets - * requests to look up "desktop.ini" in all the subdirectories. - * This can cause zillions of timeouts looking up non-existent cells - * and volumes, especially in the top-level directory. - * - * We have not found any way to avoid this or work around it except - * to explicitly ignore the requests for mount points that haven't - * yet been evaluated and for directories that haven't yet been - * fetched. - */ - if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) { - spacep = cm_GetSpace(); - smb_StripLastComponent(spacep->data, &lastComp, - (char *)(&p->parmsp[3])); -#ifndef SPECIAL_FOLDERS - /* Make sure that lastComp is not NULL */ - if (lastComp) { - if (stricmp(lastComp, "\\desktop.ini") == 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->data, - CM_FLAG_CASEFOLD - | CM_FLAG_DIRSEARCH - | CM_FLAG_FOLLOW, - userp, tidPathp, &req, &dscp); - if (code == 0) { -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - if ( WANTS_DFS_PATHNAMES(p) ) - code = CM_ERROR_PATH_NOT_COVERED; - else - code = CM_ERROR_BADSHARENAME; - } else -#endif /* DFS_SUPPORT */ - if (dscp->fileType == CM_SCACHETYPE_MOUNTPOINT && !dscp->mountRootFid.volume) - code = CM_ERROR_NOSUCHFILE; - else if (dscp->fileType == CM_SCACHETYPE_DIRECTORY) { - cm_buf_t *bp = buf_Find(dscp, &hzero); - if (bp) - buf_Release(bp); - else - code = CM_ERROR_NOSUCHFILE; - } - cm_ReleaseSCache(dscp); - if (code) { - cm_FreeSpace(spacep); - cm_ReleaseUser(userp); - smb_SendTran2Error(vcp, p, opx, code); - smb_FreeTran2Packet(outp); - return 0; - } - } - } - } -#endif /* SPECIAL_FOLDERS */ - - cm_FreeSpace(spacep); - } - - /* now do namei and stat, and copy out the info */ - code = cm_NameI(cm_data.rootSCachep, (char *)(&p->parmsp[3]), - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); - - if (code) { - cm_ReleaseUser(userp); - smb_SendTran2Error(vcp, p, opx, code); - smb_FreeTran2Packet(outp); - return 0; - } - -#ifdef DFS_SUPPORT - if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(p) ) - code = CM_ERROR_PATH_NOT_COVERED; - else - code = CM_ERROR_BADSHARENAME; - smb_SendTran2Error(vcp, p, opx, code); - smb_FreeTran2Packet(outp); - return 0; - } -#endif /* DFS_SUPPORT */ - - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) goto done; - - /* now we have the status in the cache entry, and everything is locked. - * Marshall the output data. - */ - op = outp->datap; - /* for info level 108, figure out short name */ - if (infoLevel == 0x108) { - code = cm_GetShortName((char *)(&p->parmsp[3]), userp, &req, - tidPathp, scp->fid.vnode, shortName, - (size_t *) &len); - if (code) { - goto done; - } - - op = outp->datap; - *((u_long *)op) = len * 2; op += 4; - mbstowcs((unsigned short *)op, shortName, len); - op += (len * 2); - - goto done; - } - if (infoLevel == SMB_INFO_STANDARD || infoLevel == SMB_INFO_QUERY_EA_SIZE) { - smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime); - *((u_long *)op) = dosTime; op += 4; /* creation time */ - *((u_long *)op) = dosTime; op += 4; /* access time */ - *((u_long *)op) = dosTime; op += 4; /* write time */ - *((u_long *)op) = scp->length.LowPart; op += 4; /* length */ - *((u_long *)op) = scp->length.LowPart; op += 4; /* alloc size */ - attributes = smb_Attributes(scp); - *((u_short *)op) = attributes; op += 2; /* attributes */ - } - else if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) { - smb_LargeSearchTimeFromUnixTime(&ft, scp->clientModTime); - *((FILETIME *)op) = ft; op += 8; /* creation time */ - *((FILETIME *)op) = ft; op += 8; /* last access time */ - *((FILETIME *)op) = ft; op += 8; /* last write time */ - *((FILETIME *)op) = ft; op += 8; /* last change time */ - extAttributes = smb_ExtAttributes(scp); - *((u_long *)op) = extAttributes; op += 4; /* extended attribs */ - *((u_long *)op) = 0; op += 4; /* don't know what this is */ - } - else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) { - *((LARGE_INTEGER *)op) = scp->length; op += 8; /* alloc size */ - *((LARGE_INTEGER *)op) = scp->length; op += 8; /* EOF */ - *((u_long *)op) = scp->linkCount; op += 4; - *op++ = 0; - *op++ = 0; - *op++ = (scp->fileType == CM_SCACHETYPE_DIRECTORY ? 1 : 0); - *op++ = 0; - } - else if (infoLevel == SMB_QUERY_FILE_EA_INFO) { - memset(op, 0, 4); op += 4; /* EA size */ - } - - /* now, if we are being asked about extended attrs, return a 0 size */ - if (infoLevel == SMB_INFO_QUERY_EA_SIZE) { - *((u_long *)op) = 0; op += 4; - } - - - /* send and free the packets */ - done: - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - if (code == 0) - smb_SendTran2Packet(vcp, outp, opx); - else - smb_SendTran2Error(vcp, p, opx, code); - smb_FreeTran2Packet(outp); - - return 0; -} - -long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2SetPathInfo - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long smb_ReceiveTran2QFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *opx) -{ - smb_tran2Packet_t *outp; - FILETIME ft; - unsigned long attributes; - unsigned short infoLevel; - int nbytesRequired; - unsigned short fid; - cm_user_t *userp; - smb_fid_t *fidp; - cm_scache_t *scp; - char *op; - long code = 0; - cm_req_t req; - - cm_InitReq(&req); - - fid = p->parmsp[0]; - fidp = smb_FindFID(vcp, fid, 0); - - if (fidp == NULL) { - smb_SendTran2Error(vcp, p, opx, CM_ERROR_BADFD); - return 0; - } - - infoLevel = p->parmsp[1]; - if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) - nbytesRequired = 40; - else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) - nbytesRequired = 24; - else if (infoLevel == SMB_QUERY_FILE_EA_INFO) - nbytesRequired = 4; - else if (infoLevel == SMB_QUERY_FILE_NAME_INFO) - nbytesRequired = 6; - else { - osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x", - p->opcode, infoLevel); - smb_SendTran2Error(vcp, p, opx, CM_ERROR_INVAL); - smb_ReleaseFID(fidp); - return 0; - } - osi_Log2(smb_logp, "T2 QFileInfo type 0x%x fid %d", infoLevel, fid); - - outp = smb_GetTran2ResponsePacket(vcp, p, opx, 2, nbytesRequired); - - if (infoLevel > 0x100) - outp->totalParms = 2; - else - outp->totalParms = 0; - outp->totalData = nbytesRequired; - - userp = smb_GetTran2User(vcp, p); - if (!userp) { - osi_Log1(smb_logp, "ReceiveTran2QFileInfo unable to resolve user [%d]", p->uid); - code = CM_ERROR_BADSMB; - goto done; - } - - scp = fidp->scp; - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) - goto done; - - /* now we have the status in the cache entry, and everything is locked. - * Marshall the output data. - */ - op = outp->datap; - if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) { - smb_LargeSearchTimeFromUnixTime(&ft, scp->clientModTime); - *((FILETIME *)op) = ft; op += 8; /* creation time */ - *((FILETIME *)op) = ft; op += 8; /* last access time */ - *((FILETIME *)op) = ft; op += 8; /* last write time */ - *((FILETIME *)op) = ft; op += 8; /* last change time */ - attributes = smb_ExtAttributes(scp); - *((u_long *)op) = attributes; op += 4; - *((u_long *)op) = 0; op += 4; - } - else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) { - *((LARGE_INTEGER *)op) = scp->length; op += 8; /* alloc size */ - *((LARGE_INTEGER *)op) = scp->length; op += 8; /* EOF */ - *((u_long *)op) = scp->linkCount; op += 4; - *op++ = ((fidp->flags & SMB_FID_DELONCLOSE) ? 1 : 0); - *op++ = (scp->fileType == CM_SCACHETYPE_DIRECTORY ? 1 : 0); - *op++ = 0; - *op++ = 0; - } - else if (infoLevel == SMB_QUERY_FILE_EA_INFO) { - *((u_long *)op) = 0; op += 4; - } - else if (infoLevel == SMB_QUERY_FILE_NAME_INFO) { - unsigned long len; - char *name; - - if (fidp->NTopen_wholepathp) - name = fidp->NTopen_wholepathp; - else - name = "\\"; /* probably can't happen */ - len = strlen(name); - outp->totalData = (len*2) + 4; /* this is actually what we want to return */ - *((u_long *)op) = len * 2; op += 4; - mbstowcs((unsigned short *)op, name, len); op += (len * 2); - } - - /* send and free the packets */ - done: - lock_ReleaseMutex(&scp->mx); - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - if (code == 0) - smb_SendTran2Packet(vcp, outp, opx); - else - smb_SendTran2Error(vcp, p, opx, code); - smb_FreeTran2Packet(outp); - - return 0; -} - -long smb_ReceiveTran2SetFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - long code = 0; - unsigned short fid; - smb_fid_t *fidp; - unsigned short infoLevel; - smb_tran2Packet_t *outp; - cm_user_t *userp; - cm_scache_t *scp; - cm_req_t req; - - cm_InitReq(&req); - - fid = p->parmsp[0]; - fidp = smb_FindFID(vcp, fid, 0); - - if (fidp == NULL) { - smb_SendTran2Error(vcp, p, op, CM_ERROR_BADFD); - return 0; - } - - infoLevel = p->parmsp[1]; - osi_Log2(smb_logp,"ReceiveTran2SetFileInfo type=[%x] fid=[%x]", infoLevel, fid); - if (infoLevel > 0x104 || infoLevel < 0x101) { - osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x", - p->opcode, infoLevel); - smb_SendTran2Error(vcp, p, op, CM_ERROR_INVAL); - smb_ReleaseFID(fidp); - return 0; - } - - if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO && !(fidp->flags & SMB_FID_OPENDELETE)) { - smb_SendTran2Error(vcp, p, op, CM_ERROR_NOACCESS); - smb_ReleaseFID(fidp); - return 0; - } - if ((infoLevel == SMB_QUERY_FILE_EA_INFO || infoLevel == SMB_QUERY_FILE_NAME_INFO) - && !(fidp->flags & SMB_FID_OPENWRITE)) { - smb_SendTran2Error(vcp, p, op, CM_ERROR_NOACCESS); - smb_ReleaseFID(fidp); - return 0; - } - - osi_Log1(smb_logp, "T2 SFileInfo type 0x%x", infoLevel); - - outp = smb_GetTran2ResponsePacket(vcp, p, op, 2, 0); - - outp->totalParms = 2; - outp->totalData = 0; - - userp = smb_GetTran2User(vcp, p); - if (!userp) { - osi_Log1(smb_logp,"ReceiveTran2SetFileInfo unable to resolve user [%d]", p->uid); - code = CM_ERROR_BADSMB; - goto done; - } - - scp = fidp->scp; - - if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) { - FILETIME lastMod; - unsigned int attribute; - cm_attr_t attr; - - /* lock the vnode with a callback; we need the current status - * to determine what the new status is, in some cases. - */ - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_NEEDCALLBACK); - if (code) { - lock_ReleaseMutex(&scp->mx); - goto done; - } - - /* prepare for setattr call */ - attr.mask = 0; - - lastMod = *((FILETIME *)(p->datap + 16)); - /* when called as result of move a b, lastMod is (-1, -1). - * If the check for -1 is not present, timestamp - * of the resulting file will be 1969 (-1) - */ - if (LargeIntegerNotEqualToZero(*((LARGE_INTEGER *)&lastMod)) && - lastMod.dwLowDateTime != -1 && lastMod.dwHighDateTime != -1) { - attr.mask |= CM_ATTRMASK_CLIENTMODTIME; - smb_UnixTimeFromLargeSearchTime(&attr.clientModTime, &lastMod); - fidp->flags |= SMB_FID_MTIMESETDONE; - } - - attribute = *((u_long *)(p->datap + 32)); - if (attribute != 0) { - if ((scp->unixModeBits & 0222) - && (attribute & 1) != 0) { - /* make a writable file read-only */ - attr.mask |= CM_ATTRMASK_UNIXMODEBITS; - attr.unixModeBits = scp->unixModeBits & ~0222; - } - else if ((scp->unixModeBits & 0222) == 0 - && (attribute & 1) == 0) { - /* make a read-only file writable */ - attr.mask |= CM_ATTRMASK_UNIXMODEBITS; - attr.unixModeBits = scp->unixModeBits | 0222; - } - } - lock_ReleaseMutex(&scp->mx); - - /* call setattr */ - if (attr.mask) - code = cm_SetAttr(scp, &attr, userp, &req); - else - code = 0; - } - else if (infoLevel == SMB_QUERY_FILE_EA_INFO || infoLevel == SMB_QUERY_FILE_NAME_INFO) { - LARGE_INTEGER size = *((LARGE_INTEGER *)(p->datap)); - cm_attr_t attr; - - attr.mask = CM_ATTRMASK_LENGTH; - attr.length.LowPart = size.LowPart; - attr.length.HighPart = size.HighPart; - code = cm_SetAttr(scp, &attr, userp, &req); - } - else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) { - if (*((char *)(p->datap))) { - code = cm_CheckNTDelete(fidp->NTopen_dscp, scp, userp, - &req); - if (code == 0) - fidp->flags |= SMB_FID_DELONCLOSE; - } - else { - code = 0; - fidp->flags &= ~SMB_FID_DELONCLOSE; - } - } - - done: - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - if (code == 0) - smb_SendTran2Packet(vcp, outp, op); - else - smb_SendTran2Error(vcp, p, op, code); - smb_FreeTran2Packet(outp); - - return 0; -} - -long -smb_ReceiveTran2FSCTL(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2FSCTL - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long -smb_ReceiveTran2IOCTL(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2IOCTL - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long -smb_ReceiveTran2FindNotifyFirst(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2FindNotifyFirst - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long -smb_ReceiveTran2FindNotifyNext(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2FindNotifyNext - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long -smb_ReceiveTran2CreateDirectory(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2CreateDirectory - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long -smb_ReceiveTran2SessionSetup(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - osi_Log0(smb_logp,"ReceiveTran2SessionSetup - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -struct smb_v2_referral { - USHORT ServerType; - USHORT ReferralFlags; - ULONG Proximity; - ULONG TimeToLive; - USHORT DfsPathOffset; - USHORT DfsAlternativePathOffset; - USHORT NetworkAddressOffset; -}; - -long -smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) -{ - /* This is a UNICODE only request (bit15 of Flags2) */ - /* The TID must be IPC$ */ - - /* The documentation for the Flags response field is contradictory */ - - /* Use Version 1 Referral Element Format */ - /* ServerType = 0; indicates the next server should be queried for the file */ - /* ReferralFlags = 0x01; PathConsumed characters should be stripped */ - /* Node = UnicodeString of UNC path of the next share name */ -#ifdef DFS_SUPPORT - long code = 0; - int maxReferralLevel = 0; - char requestFileName[1024] = ""; - smb_tran2Packet_t *outp = 0; - cm_user_t *userp = 0; - cm_scache_t *scp; - cm_req_t req; - CPINFO CodePageInfo; - int i, nbnLen, reqLen; - int idx; - - cm_InitReq(&req); - - maxReferralLevel = p->parmsp[0]; - - GetCPInfo(CP_ACP, &CodePageInfo); - WideCharToMultiByte(CP_ACP, 0, (LPCWSTR) &p->parmsp[1], -1, - requestFileName, 1024, NULL, NULL); - - osi_Log2(smb_logp,"ReceiveTran2GetDfsReferral [%d][%s]", - maxReferralLevel, osi_LogSaveString(smb_logp, requestFileName)); - - nbnLen = strlen(cm_NetbiosName); - reqLen = strlen(requestFileName); - - if (reqLen == nbnLen + 5 && - requestFileName[0] == '\\' && - !_strnicmp(cm_NetbiosName,&requestFileName[1],nbnLen) && - requestFileName[nbnLen+1] == '\\' && - !_strnicmp("all",&requestFileName[nbnLen+2],3)) - { - USHORT * sp; - struct smb_v2_referral * v2ref; - outp = smb_GetTran2ResponsePacket(vcp, p, op, 0, 2 * (reqLen + 8)); - - sp = (USHORT *)outp->datap; - idx = 0; - sp[idx++] = reqLen; /* path consumed */ - sp[idx++] = 1; /* number of referrals */ - sp[idx++] = 0x03; /* flags */ -#ifdef DFS_VERSION_1 - sp[idx++] = 1; /* Version Number */ - sp[idx++] = reqLen + 4; /* Referral Size */ - sp[idx++] = 1; /* Type = SMB Server */ - sp[idx++] = 0; /* Do not strip path consumed */ - for ( i=0;i<=reqLen; i++ ) - sp[i+idx] = requestFileName[i]; -#else /* DFS_VERSION_2 */ - sp[idx++] = 2; /* Version Number */ - sp[idx++] = sizeof(struct smb_v2_referral); /* Referral Size */ - idx += (sizeof(struct smb_v2_referral) / 2); - v2ref = (struct smb_v2_referral *) &sp[5]; - v2ref->ServerType = 1; /* SMB Server */ - v2ref->ReferralFlags = 0x03; - v2ref->Proximity = 0; /* closest */ - v2ref->TimeToLive = 3600; /* seconds */ - v2ref->DfsPathOffset = idx * 2; - v2ref->DfsAlternativePathOffset = idx * 2; - v2ref->NetworkAddressOffset = 0; - for ( i=0;i<=reqLen; i++ ) - sp[i+idx] = requestFileName[i]; -#endif - } else { - userp = smb_GetTran2User(vcp, p); - if (!userp) { - osi_Log1(smb_logp,"ReceiveTran2GetDfsReferral unable to resolve user [%d]", p->uid); - code = CM_ERROR_BADSMB; - goto done; - } - - /* not done yet */ - code = CM_ERROR_NOSUCHPATH; - } - - done: - if (userp) - cm_ReleaseUser(userp); - if (code == 0) - smb_SendTran2Packet(vcp, outp, op); - else - smb_SendTran2Error(vcp, p, op, code); - if (outp) - smb_FreeTran2Packet(outp); - - return 0; -#else /* DFS_SUPPORT */ - osi_Log0(smb_logp,"ReceiveTran2GetDfsReferral - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -#endif /* DFS_SUPPORT */ -} - -long -smb_ReceiveTran2ReportDFSInconsistency(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *outp) -{ - /* This is a UNICODE only request (bit15 of Flags2) */ - - /* There is nothing we can do about this operation. The client is going to - * tell us that there is a Version 1 Referral Element for which there is a DFS Error. - * Unfortunately, there is really nothing we can do about it other then log it - * somewhere. Even then I don't think there is anything for us to do. - * So let's return an error value. - */ - - osi_Log0(smb_logp,"ReceiveTran2ReportDFSInconsistency - NOT_SUPPORTED"); - return CM_ERROR_BADOP; -} - -long -smb_ApplyV3DirListPatches(cm_scache_t *dscp, - smb_dirListPatch_t **dirPatchespp, int infoLevel, cm_user_t *userp, - cm_req_t *reqp) -{ - long code = 0; - cm_scache_t *scp; - cm_scache_t *targetScp; /* target if scp is a symlink */ - char *dptr; - afs_uint32 dosTime; - FILETIME ft; - int shortTemp; - unsigned short attr; - unsigned long lattr; - smb_dirListPatch_t *patchp; - smb_dirListPatch_t *npatchp; - - for(patchp = *dirPatchespp; patchp; patchp = - (smb_dirListPatch_t *) osi_QNext(&patchp->q)) { - code = cm_GetSCache(&patchp->fid, &scp, userp, reqp); - if (code) continue; - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, reqp, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - - dptr = patchp->dptr; - - /* Plug in fake timestamps. A time stamp of 0 causes 'invalid parameter' - errors in the client. */ - if (infoLevel >= 0x101) { - /* 1969-12-31 23:59:59 +00 */ - ft.dwHighDateTime = 0x19DB200; - ft.dwLowDateTime = 0x5BB78980; - - /* copy to Creation Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* copy to Last Access Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* copy to Last Write Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* copy to Change Time */ - *((FILETIME *)dptr) = ft; - dptr += 24; - - /* merge in hidden attribute */ - if ( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) { - *((u_long *)dptr) = SMB_ATTR_HIDDEN; - } - dptr += 4; - } else { - /* 1969-12-31 23:59:58 +00*/ - dosTime = 0xEBBFBF7D; - - /* and copy out date */ - shortTemp = (dosTime>>16) & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out creation time */ - shortTemp = dosTime & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* and copy out date */ - shortTemp = (dosTime>>16) & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out access time */ - shortTemp = dosTime & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* and copy out date */ - shortTemp = (dosTime>>16) & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out mod time */ - shortTemp = dosTime & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 10; - - /* merge in hidden (dot file) attribute */ - if ( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) { - attr = SMB_ATTR_HIDDEN; - *dptr++ = attr & 0xff; - *dptr++ = (attr >> 8) & 0xff; - } - } - continue; - } - - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - lock_ReleaseMutex(&scp->mx); - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, reqp); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - lock_ObtainMutex(&scp->mx); - } - - dptr = patchp->dptr; - - if (infoLevel >= 0x101) { - /* get filetime */ - smb_LargeSearchTimeFromUnixTime(&ft, scp->clientModTime); - - /* copy to Creation Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* copy to Last Access Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* copy to Last Write Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* copy to Change Time */ - *((FILETIME *)dptr) = ft; - dptr += 8; - - /* Use length for both file length and alloc length */ - *((LARGE_INTEGER *)dptr) = scp->length; - dptr += 8; - *((LARGE_INTEGER *)dptr) = scp->length; - dptr += 8; - - /* Copy attributes */ - lattr = smb_ExtAttributes(scp); - if (code == CM_ERROR_NOSUCHPATH && scp->fileType == CM_SCACHETYPE_SYMLINK) { - if (lattr == SMB_ATTR_NORMAL) - lattr = SMB_ATTR_DIRECTORY; - else - lattr |= SMB_ATTR_DIRECTORY; - } - /* merge in hidden (dot file) attribute */ - if ( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) { - if (lattr == SMB_ATTR_NORMAL) - lattr = SMB_ATTR_HIDDEN; - else - lattr |= SMB_ATTR_HIDDEN; - } - *((u_long *)dptr) = lattr; - dptr += 4; - } else { - /* get dos time */ - smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime); - - /* and copy out date */ - shortTemp = (dosTime>>16) & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out creation time */ - shortTemp = dosTime & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* and copy out date */ - shortTemp = (dosTime>>16) & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out access time */ - shortTemp = dosTime & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* and copy out date */ - shortTemp = (dosTime>>16) & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out mod time */ - shortTemp = dosTime & 0xffff; - *((u_short *)dptr) = shortTemp; - dptr += 2; - - /* copy out file length and alloc length, - * using the same for both - */ - *((u_long *)dptr) = scp->length.LowPart; - dptr += 4; - *((u_long *)dptr) = scp->length.LowPart; - dptr += 4; - - /* finally copy out attributes as short */ - attr = smb_Attributes(scp); - /* merge in hidden (dot file) attribute */ - if ( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) { - if (lattr == SMB_ATTR_NORMAL) - lattr = SMB_ATTR_HIDDEN; - else - lattr |= SMB_ATTR_HIDDEN; - } - *dptr++ = attr & 0xff; - *dptr++ = (attr >> 8) & 0xff; - } - - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - } - - /* now free the patches */ - for (patchp = *dirPatchespp; patchp; patchp = npatchp) { - npatchp = (smb_dirListPatch_t *) osi_QNext(&patchp->q); - free(patchp); - } - - /* and mark the list as empty */ - *dirPatchespp = NULL; - - return code; -} - -#ifndef USE_OLD_MATCHING -// char table for case insensitive comparison -char mapCaseTable[256]; - -VOID initUpperCaseTable(VOID) -{ - int i; - for (i = 0; i < 256; ++i) - mapCaseTable[i] = toupper(i); - // make '"' match '.' - mapCaseTable[(int)'"'] = toupper('.'); - // make '<' match '*' - mapCaseTable[(int)'<'] = toupper('*'); - // make '>' match '?' - mapCaseTable[(int)'>'] = toupper('?'); -} - -// Compare 'pattern' (containing metacharacters '*' and '?') with the file -// name 'name'. -// Note : this procedure works recursively calling itself. -// Parameters -// PSZ pattern : string containing metacharacters. -// PSZ name : file name to be compared with 'pattern'. -// Return value -// BOOL : TRUE/FALSE (match/mistmatch) - -BOOL -szWildCardMatchFileName(PSZ pattern, PSZ name, int casefold) -{ - PSZ pename; // points to the last 'name' character - PSZ p; - pename = name + strlen(name) - 1; - while (*name) { - switch (*pattern) { - case '?': - if (*name == '.') - return FALSE; - ++pattern, ++name; - break; - case '*': - ++pattern; - if (*pattern == '\0') - return TRUE; - for (p = pename; p >= name; --p) { - if ((casefold && (mapCaseTable[*p] == mapCaseTable[*pattern]) || - !casefold && (*p == *pattern)) && - szWildCardMatchFileName(pattern + 1, p + 1, casefold)) - return TRUE; - } /* endfor */ - return FALSE; - default: - if ((casefold && mapCaseTable[*name] != mapCaseTable[*pattern]) || - (!casefold && *name != *pattern)) - return FALSE; - ++pattern, ++name; - break; - } /* endswitch */ - } /* endwhile */ - - if (*pattern == '\0' || *pattern == '*' && *(pattern+1) == '\0') - return TRUE; - else - return FALSE; -} - -/* do a case-folding search of the star name mask with the name in namep. - * Return 1 if we match, otherwise 0. - */ -int smb_V3MatchMask(char *namep, char *maskp, int flags) -{ - char * newmask; - int i, j, star, qmark, casefold, retval; - - /* make sure we only match 8.3 names, if requested */ - if ((flags & CM_FLAG_8DOT3) && !cm_Is8Dot3(namep)) - return 0; - - casefold = (flags & CM_FLAG_CASEFOLD) ? 1 : 0; - - /* optimize the pattern: - * if there is a mixture of '?' and '*', - * for example the sequence "*?*?*?*" - * must be turned into the form "*" - */ - newmask = (char *)malloc(strlen(maskp)+1); - for ( i=0, j=0, star=0, qmark=0; maskp[i]; i++) { - switch ( maskp[i] ) { - case '?': - case '>': - qmark++; - break; - case '<': - case '*': - star++; - break; - default: - if ( star ) { - newmask[j++] = '*'; - } else if ( qmark ) { - while ( qmark-- ) - newmask[j++] = '?'; - } - newmask[j++] = maskp[i]; - star = 0; - qmark = 0; - } - } - if ( star ) { - newmask[j++] = '*'; - } else if ( qmark ) { - while ( qmark-- ) - newmask[j++] = '?'; - } - newmask[j++] = '\0'; - - retval = szWildCardMatchFileName(newmask, namep, casefold) ? 1:0; - - free(newmask); - return retval; -} - -#else /* USE_OLD_MATCHING */ -/* do a case-folding search of the star name mask with the name in namep. - * Return 1 if we match, otherwise 0. - */ -int smb_V3MatchMask(char *namep, char *maskp, int flags) -{ - unsigned char tcp1, tcp2; /* Pattern characters */ - unsigned char tcn1; /* Name characters */ - int sawDot = 0, sawStar = 0, req8dot3 = 0; - char *starNamep, *starMaskp; - static char nullCharp[] = {0}; - int casefold = flags & CM_FLAG_CASEFOLD; - - /* make sure we only match 8.3 names, if requested */ - req8dot3 = (flags & CM_FLAG_8DOT3); - if (req8dot3 && !cm_Is8Dot3(namep)) - return 0; - - /* loop */ - while (1) { - /* Next pattern character */ - tcp1 = *maskp++; - - /* Next name character */ - tcn1 = *namep; - - if (tcp1 == 0) { - /* 0 - end of pattern */ - if (tcn1 == 0) - return 1; - else - return 0; - } - else if (tcp1 == '.' || tcp1 == '"') { - if (sawDot) { - if (tcn1 == '.') { - namep++; - continue; - } else - return 0; - } - else { - /* - * first dot in pattern; - * must match dot or end of name - */ - sawDot = 1; - if (tcn1 == 0) - continue; - else if (tcn1 == '.') { - sawStar = 0; - namep++; - continue; - } - else - return 0; - } - } - else if (tcp1 == '?') { - if (tcn1 == 0 || tcn1 == '.') - return 0; - namep++; - continue; - } - else if (tcp1 == '>') { - if (tcn1 != 0 && tcn1 != '.') - namep++; - continue; - } - else if (tcp1 == '*' || tcp1 == '<') { - tcp2 = *maskp++; - if (tcp2 == 0) - return 1; - else if ((req8dot3 && tcp2 == '.') || tcp2 == '"') { - while (req8dot3 && tcn1 != '.' && tcn1 != 0) - tcn1 = *++namep; - if (tcn1 == 0) { - if (sawDot) - return 0; - else - continue; - } - else { - namep++; - continue; - } - } - else { - /* - * pattern character after '*' is not null or - * period. If it is '?' or '>', we are not - * going to understand it. If it is '*' or - * '<', we are going to skip over it. None of - * these are likely, I hope. - */ - /* skip over '*' and '<' */ - while (tcp2 == '*' || tcp2 == '<') - tcp2 = *maskp++; - - /* skip over characters that don't match tcp2 */ - while (req8dot3 && tcn1 != '.' && tcn1 != 0 && - ((casefold && cm_foldUpper[tcn1] != cm_foldUpper[tcp2]) || - (!casefold && tcn1 != tcp2))) - tcn1 = *++namep; - - /* No match */ - if ((req8dot3 && tcn1 == '.') || tcn1 == 0) - return 0; - - /* Remember where we are */ - sawStar = 1; - starMaskp = maskp; - starNamep = namep; - - namep++; - continue; - } - } - else { - /* tcp1 is not a wildcard */ - if ((casefold && cm_foldUpper[tcn1] == cm_foldUpper[tcp1]) || - (!casefold && tcn1 == tcp1)) { - /* they match */ - namep++; - continue; - } - /* if trying to match a star pattern, go back */ - if (sawStar) { - maskp = starMaskp - 2; - namep = starNamep + 1; - sawStar = 0; - continue; - } - /* that's all */ - return 0; - } - } -} -#endif /* USE_OLD_MATCHING */ - -long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *opx) -{ - int attribute; - long nextCookie; - char *tp; - long code = 0, code2 = 0; - char *pathp; - cm_dirEntry_t *dep; - int maxCount; - smb_dirListPatch_t *dirListPatchesp; - smb_dirListPatch_t *curPatchp; - cm_buf_t *bufferp; - long temp; - long orbytes; /* # of bytes in this output record */ - long ohbytes; /* # of bytes, except file name */ - long onbytes; /* # of bytes in name, incl. term. null */ - osi_hyper_t dirLength; - osi_hyper_t bufferOffset; - osi_hyper_t curOffset; - osi_hyper_t thyper; - smb_dirSearch_t *dsp; - cm_scache_t *scp; - long entryInDir; - long entryInBuffer; - cm_pageHeader_t *pageHeaderp; - cm_user_t *userp = NULL; - int slotInPage; - int returnedNames; - long nextEntryCookie; - int numDirChunks; /* # of 32 byte dir chunks in this entry */ - char *op; /* output data ptr */ - char *origOp; /* original value of op */ - cm_space_t *spacep; /* for pathname buffer */ - long maxReturnData; /* max # of return data */ - long maxReturnParms; /* max # of return parms */ - long bytesInBuffer; /* # data bytes in the output buffer */ - int starPattern; - char *maskp; /* mask part of path */ - int infoLevel; - int searchFlags; - int eos; - smb_tran2Packet_t *outp; /* response packet */ - char *tidPathp; - int align; - char shortName[13]; /* 8.3 name if needed */ - int NeedShortName; - int foundInexact; - char *shortNameEnd; - int fileType; - cm_fid_t fid; - cm_req_t req; - - cm_InitReq(&req); - - eos = 0; - if (p->opcode == 1) { - /* find first; obtain basic parameters from request */ - attribute = p->parmsp[0]; - maxCount = p->parmsp[1]; - infoLevel = p->parmsp[3]; - searchFlags = p->parmsp[2]; - dsp = smb_NewDirSearch(1); - dsp->attribute = attribute; - pathp = ((char *) p->parmsp) + 12; /* points to path */ - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - nextCookie = 0; - maskp = strrchr(pathp, '\\'); - if (maskp == NULL) - maskp = pathp; - else - maskp++; /* skip over backslash */ - strcpy(dsp->mask, maskp); /* and save mask */ - /* track if this is likely to match a lot of entries */ - starPattern = smb_V3IsStarMask(maskp); - } - else { - osi_assert(p->opcode == 2); - /* find next; obtain basic parameters from request or open dir file */ - dsp = smb_FindDirSearch(p->parmsp[0]); - maxCount = p->parmsp[1]; - infoLevel = p->parmsp[2]; - nextCookie = p->parmsp[3] | (p->parmsp[4] << 16); - searchFlags = p->parmsp[5]; - if (!dsp) { - osi_Log2(smb_logp, "T2 search dir bad search ID: id %d nextCookie 0x%x", - p->parmsp[0], nextCookie); - return CM_ERROR_BADFD; - } - attribute = dsp->attribute; - pathp = NULL; - maskp = dsp->mask; - starPattern = 1; /* assume, since required a Find Next */ - } - - osi_Log4(smb_logp, - "T2 search dir attr 0x%x, info level %d, max count %d, flags 0x%x", - attribute, infoLevel, maxCount, searchFlags); - - osi_Log3(smb_logp, "...T2 search op %d, id %d, nextCookie 0x%x", - p->opcode, dsp->cookie, nextCookie); - - if (infoLevel >= 0x101) - searchFlags &= ~4; /* no resume keys */ - - dirListPatchesp = NULL; - - maxReturnData = p->maxReturnData; - if (p->opcode == 1) /* find first */ - maxReturnParms = 10; /* bytes */ - else - maxReturnParms = 8; /* bytes */ - -#ifndef CM_CONFIG_MULTITRAN2RESPONSES - if (maxReturnData > 6000) - maxReturnData = 6000; -#endif /* CM_CONFIG_MULTITRAN2RESPONSES */ - - outp = smb_GetTran2ResponsePacket(vcp, p, opx, maxReturnParms, - maxReturnData); - - osi_Log2(smb_logp, "T2 receive search dir count %d [%s]", - maxCount, osi_LogSaveString(smb_logp, pathp)); - - /* bail out if request looks bad */ - if (p->opcode == 1 && !pathp) { - smb_ReleaseDirSearch(dsp); - smb_FreeTran2Packet(outp); - return CM_ERROR_BADSMB; - } - - osi_Log3(smb_logp, "T2 search dir id %d, nextCookie 0x%x, attr 0x%x", - dsp->cookie, nextCookie, attribute); - - userp = smb_GetTran2User(vcp, p); - if (!userp) { - osi_Log1(smb_logp, "T2 search dir unable to resolve user [%d]", p->uid); - smb_ReleaseDirSearch(dsp); - smb_FreeTran2Packet(outp); - return CM_ERROR_BADSMB; - } - - /* try to get the vnode for the path name next */ - lock_ObtainMutex(&dsp->mx); - if (dsp->scp) { - scp = dsp->scp; - cm_HoldSCache(scp); - code = 0; - } else { - spacep = cm_GetSpace(); - smb_StripLastComponent(spacep->data, NULL, pathp); - code = smb_LookupTIDPath(vcp, p->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - smb_SendTran2Error(vcp, p, opx, CM_ERROR_NOFILES); - smb_FreeTran2Packet(outp); - lock_ReleaseMutex(&dsp->mx); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return 0; - } - code = cm_NameI(cm_data.rootSCachep, spacep->data, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &scp); - cm_FreeSpace(spacep); - - if (code == 0) { -#ifdef DFS_SUPPORT_BUT_NOT_FIND_FIRST - if (scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(p) ) - code = CM_ERROR_PATH_NOT_COVERED; - else - code = CM_ERROR_BADSHARENAME; - smb_SendTran2Error(vcp, p, opx, code); - smb_FreeTran2Packet(outp); - lock_ReleaseMutex(&dsp->mx); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return 0; - } -#endif /* DFS_SUPPORT */ - dsp->scp = scp; - /* we need one hold for the entry we just stored into, - * and one for our own processing. When we're done - * with this function, we'll drop the one for our own - * processing. We held it once from the namei call, - * and so we do another hold now. - */ - cm_HoldSCache(scp); - lock_ObtainMutex(&scp->mx); - if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0 && - LargeIntegerGreaterOrEqualToZero(scp->bulkStatProgress)) { - scp->flags |= CM_SCACHEFLAG_BULKSTATTING; - dsp->flags |= SMB_DIRSEARCH_BULKST; - } - lock_ReleaseMutex(&scp->mx); - } - } - lock_ReleaseMutex(&dsp->mx); - if (code) { - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return code; - } - - /* get the directory size */ - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - smb_FreeTran2Packet(outp); - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - return code; - } - - startsearch: - dirLength = scp->length; - bufferp = NULL; - bufferOffset.LowPart = bufferOffset.HighPart = 0; - curOffset.HighPart = 0; - curOffset.LowPart = nextCookie; - origOp = outp->datap; - - foundInexact = 0; - code = 0; - returnedNames = 0; - bytesInBuffer = 0; - while (1) { - op = origOp; - if (searchFlags & 4) - /* skip over resume key */ - op += 4; - - /* make sure that curOffset.LowPart doesn't point to the first - * 32 bytes in the 2nd through last dir page, and that it doesn't - * point at the first 13 32-byte chunks in the first dir page, - * since those are dir and page headers, and don't contain useful - * information. - */ - temp = curOffset.LowPart & (2048-1); - if (curOffset.HighPart == 0 && curOffset.LowPart < 2048) { - /* we're in the first page */ - if (temp < 13*32) temp = 13*32; - } - else { - /* we're in a later dir page */ - if (temp < 32) temp = 32; - } - - /* make sure the low order 5 bits are zero */ - temp &= ~(32-1); - - /* now put temp bits back ito curOffset.LowPart */ - curOffset.LowPart &= ~(2048-1); - curOffset.LowPart |= temp; - - /* check if we've passed the dir's EOF */ - if (LargeIntegerGreaterThanOrEqualTo(curOffset, dirLength)) { - osi_Log0(smb_logp, "T2 search dir passed eof"); - eos = 1; - break; - } - - /* check if we've returned all the names that will fit in the - * response packet; we check return count as well as the number - * of bytes requested. We check the # of bytes after we find - * the dir entry, since we'll need to check its size. - */ - if (returnedNames >= maxCount) { - osi_Log2(smb_logp, "T2 search dir returnedNames %d >= maxCount %d", - returnedNames, maxCount); - break; - } - - /* see if we can use the bufferp we have now; compute in which - * page the current offset would be, and check whether that's - * the offset of the buffer we have. If not, get the buffer. - */ - thyper.HighPart = curOffset.HighPart; - thyper.LowPart = curOffset.LowPart & ~(cm_data.buf_blockSize-1); - if (!bufferp || !LargeIntegerEqualTo(thyper, bufferOffset)) { - /* wrong buffer */ - if (bufferp) { - buf_Release(bufferp); - bufferp = NULL; - } - lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); - code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); - lock_ObtainMutex(&dsp->mx); - - /* now, if we're doing a star match, do bulk fetching - * of all of the status info for files in the dir. - */ - if (starPattern) { - smb_ApplyV3DirListPatches(scp, &dirListPatchesp, - infoLevel, userp, - &req); - lock_ObtainMutex(&scp->mx); - if ((dsp->flags & SMB_DIRSEARCH_BULKST) && - LargeIntegerGreaterThanOrEqualTo(thyper, scp->bulkStatProgress)) { - /* Don't bulk stat if risking timeout */ - int now = GetCurrentTime(); - if (now - req.startTime > 5000) { - scp->bulkStatProgress = thyper; - scp->flags &= ~CM_SCACHEFLAG_BULKSTATTING; - dsp->flags &= ~SMB_DIRSEARCH_BULKST; - } else - cm_TryBulkStat(scp, &thyper, userp, &req); - } - } else { - lock_ObtainMutex(&scp->mx); - } - lock_ReleaseMutex(&dsp->mx); - if (code) { - osi_Log2(smb_logp, "T2 search dir buf_Get scp %x failed %d", scp, code); - break; - } - - bufferOffset = thyper; - - /* now get the data in the cache */ - while (1) { - code = cm_SyncOp(scp, bufferp, userp, &req, - PRSFS_LOOKUP, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_READ); - if (code) { - osi_Log2(smb_logp, "T2 search dir cm_SyncOp scp %x failed %d", scp, code); - break; - } - - if (cm_HaveBuffer(scp, bufferp, 0)) { - osi_Log2(smb_logp, "T2 search dir !HaveBuffer scp %x bufferp %x", scp, bufferp); - break; - } - - /* otherwise, load the buffer and try again */ - code = cm_GetBuffer(scp, bufferp, NULL, userp, - &req); - if (code) { - osi_Log3(smb_logp, "T2 search dir cm_GetBuffer failed scp %x bufferp %x code %d", - scp, bufferp, code); - break; - } - } - if (code) { - buf_Release(bufferp); - bufferp = NULL; - break; - } - } /* if (wrong buffer) ... */ - - /* now we have the buffer containing the entry we're interested - * in; copy it out if it represents a non-deleted entry. - */ - entryInDir = curOffset.LowPart & (2048-1); - entryInBuffer = curOffset.LowPart & (cm_data.buf_blockSize - 1); - - /* page header will help tell us which entries are free. Page - * header can change more often than once per buffer, since - * AFS 3 dir page size may be less than (but not more than) - * a buffer package buffer. - */ - /* only look intra-buffer */ - temp = curOffset.LowPart & (cm_data.buf_blockSize - 1); - temp &= ~(2048 - 1); /* turn off intra-page bits */ - pageHeaderp = (cm_pageHeader_t *) (bufferp->datap + temp); - - /* now determine which entry we're looking at in the page. - * If it is free (there's a free bitmap at the start of the - * dir), we should skip these 32 bytes. - */ - slotInPage = (entryInDir & 0x7e0) >> 5; - if (!(pageHeaderp->freeBitmap[slotInPage>>3] & - (1 << (slotInPage & 0x7)))) { - /* this entry is free */ - numDirChunks = 1; /* only skip this guy */ - goto nextEntry; - } - - tp = bufferp->datap + entryInBuffer; - dep = (cm_dirEntry_t *) tp; /* now points to AFS3 dir entry */ - - /* while we're here, compute the next entry's location, too, - * since we'll need it when writing out the cookie into the dir - * listing stream. - * - * XXXX Probably should do more sanity checking. - */ - numDirChunks = cm_NameEntries(dep->name, &onbytes); - - /* compute offset of cookie representing next entry */ - nextEntryCookie = curOffset.LowPart + (CM_DIR_CHUNKSIZE * numDirChunks); - - /* Need 8.3 name? */ - NeedShortName = 0; - if (infoLevel == SMB_QUERY_FILE_NAME_INFO - && dep->fid.vnode != 0 - && !cm_Is8Dot3(dep->name)) { - cm_Gen8Dot3Name(dep, shortName, &shortNameEnd); - NeedShortName = 1; - } - - osi_Log3(smb_logp, "T2 search dir vn %u name %s (%s)", - dep->fid.vnode, osi_LogSaveString(smb_logp, dep->name), - NeedShortName ? osi_LogSaveString(smb_logp, shortName) : ""); - - /* When matching, we are using doing a case fold if we have a wildcard mask. - * If we get a non-wildcard match, it's a lookup for a specific file. - */ - if (dep->fid.vnode != 0 && - (smb_V3MatchMask(dep->name, maskp, (starPattern? CM_FLAG_CASEFOLD : 0)) || - (NeedShortName && - smb_V3MatchMask(shortName, maskp, CM_FLAG_CASEFOLD)))) { - - /* Eliminate entries that don't match requested attributes */ - if (smb_hideDotFiles && !(dsp->attribute & SMB_ATTR_HIDDEN) && - smb_IsDotFile(dep->name)) { - osi_Log0(smb_logp, "T2 search dir skipping hidden"); - goto nextEntry; /* no hidden files */ - } - if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ - { - /* We have already done the cm_TryBulkStat above */ - fid.cell = scp->fid.cell; - fid.volume = scp->fid.volume; - fid.vnode = ntohl(dep->fid.vnode); - fid.unique = ntohl(dep->fid.unique); - fileType = cm_FindFileType(&fid); - /*osi_Log2(smb_logp, "smb_ReceiveTran2SearchDir: file %s " - "has filetype %d", dep->name, - fileType);*/ - if (fileType == CM_SCACHETYPE_DIRECTORY || - fileType == CM_SCACHETYPE_DFSLINK || - fileType == CM_SCACHETYPE_INVALID) - osi_Log0(smb_logp, "T2 search dir skipping directory or bad link"); - goto nextEntry; - } - - /* finally check if this name will fit */ - - /* standard dir entry stuff */ - if (infoLevel < 0x101) - ohbytes = 23; /* pre-NT */ - else if (infoLevel == SMB_QUERY_FILE_EA_INFO) - ohbytes = 12; /* NT names only */ - else - ohbytes = 64; /* NT */ - - if (infoLevel == SMB_QUERY_FILE_NAME_INFO) - ohbytes += 26; /* Short name & length */ - - if (searchFlags & 4) { - ohbytes += 4; /* if resume key required */ - } - - if (infoLevel != 1 - && infoLevel != 0x101 - && infoLevel != 0x103) - ohbytes += 4; /* EASIZE */ - - /* add header to name & term. null */ - orbytes = onbytes + ohbytes + 1; - - /* now, we round up the record to a 4 byte alignment, - * and we make sure that we have enough room here for - * even the aligned version (so we don't have to worry - * about an * overflow when we pad things out below). - * That's the reason for the alignment arithmetic below. - */ - if (infoLevel >= 0x101) - align = (4 - (orbytes & 3)) & 3; - else - align = 0; - if (orbytes + bytesInBuffer + align > maxReturnData) { - osi_Log1(smb_logp, "T2 dir search exceed max return data %d", - maxReturnData); - break; - } - - /* this is one of the entries to use: it is not deleted - * and it matches the star pattern we're looking for. - * Put out the name, preceded by its length. - */ - /* First zero everything else */ - memset(origOp, 0, ohbytes); - - if (infoLevel <= 0x101) - *(origOp + ohbytes - 1) = (unsigned char) onbytes; - else if (infoLevel == SMB_QUERY_FILE_EA_INFO) - *((u_long *)(op + 8)) = onbytes; - else - *((u_long *)(op + 60)) = onbytes; - strcpy(origOp+ohbytes, dep->name); - if (smb_StoreAnsiFilenames) - CharToOem(origOp+ohbytes, origOp+ohbytes); - - /* Short name if requested and needed */ - if (infoLevel == SMB_QUERY_FILE_NAME_INFO) { - if (NeedShortName) { - strcpy(op + 70, shortName); - if (smb_StoreAnsiFilenames) - CharToOem(op + 70, op + 70); - *(op + 68) = shortNameEnd - shortName; - } - } - - /* now, adjust the # of entries copied */ - returnedNames++; - - /* NextEntryOffset and FileIndex */ - if (infoLevel >= 101) { - int entryOffset = orbytes + align; - *((u_long *)op) = entryOffset; - *((u_long *)(op+4)) = nextEntryCookie; - } - - /* now we emit the attribute. This is tricky, since - * we need to really stat the file to find out what - * type of entry we've got. Right now, we're copying - * out data from a buffer, while holding the scp - * locked, so it isn't really convenient to stat - * something now. We'll put in a place holder - * now, and make a second pass before returning this - * to get the real attributes. So, we just skip the - * data for now, and adjust it later. We allocate a - * patch record to make it easy to find this point - * later. The replay will happen at a time when it is - * safe to unlock the directory. - */ - if (infoLevel != 0x103) { - curPatchp = malloc(sizeof(*curPatchp)); - osi_QAdd((osi_queue_t **) &dirListPatchesp, - &curPatchp->q); - curPatchp->dptr = op; - if (infoLevel >= 0x101) - curPatchp->dptr += 8; - - if (smb_hideDotFiles && smb_IsDotFile(dep->name)) { - curPatchp->flags = SMB_DIRLISTPATCH_DOTFILE; - } - else - curPatchp->flags = 0; - - curPatchp->fid.cell = scp->fid.cell; - curPatchp->fid.volume = scp->fid.volume; - curPatchp->fid.vnode = ntohl(dep->fid.vnode); - curPatchp->fid.unique = ntohl(dep->fid.unique); - - /* temp */ - curPatchp->dep = dep; - } - - if (searchFlags & 4) - /* put out resume key */ - *((u_long *)origOp) = nextEntryCookie; - - /* Adjust byte ptr and count */ - origOp += orbytes; /* skip entire record */ - bytesInBuffer += orbytes; - - /* and pad the record out */ - while (--align >= 0) { - *origOp++ = 0; - bytesInBuffer++; - } - } /* if we're including this name */ - else if (!starPattern && - !foundInexact && - dep->fid.vnode != 0 && - smb_V3MatchMask(dep->name, maskp, CM_FLAG_CASEFOLD)) { - /* We were looking for exact matches, but here's an inexact one*/ - foundInexact = 1; - } - - nextEntry: - /* and adjust curOffset to be where the new cookie is */ - thyper.HighPart = 0; - thyper.LowPart = CM_DIR_CHUNKSIZE * numDirChunks; - curOffset = LargeIntegerAdd(thyper, curOffset); - } /* while copying data for dir listing */ - - /* If we didn't get a star pattern, we did an exact match during the first pass. - * If there were no exact matches found, we fail over to inexact matches by - * marking the query as a star pattern (matches all case permutations), and - * re-running the query. - */ - if (returnedNames == 0 && !starPattern && foundInexact) { - osi_Log0(afsd_logp,"T2 Search: No exact matches. Re-running for inexact matches"); - starPattern = 1; - goto startsearch; - } - - /* release the mutex */ - lock_ReleaseMutex(&scp->mx); - if (bufferp) - buf_Release(bufferp); - - /* apply and free last set of patches; if not doing a star match, this - * will be empty, but better safe (and freeing everything) than sorry. - */ - code2 = smb_ApplyV3DirListPatches(scp, &dirListPatchesp, infoLevel, userp, - &req); - - /* now put out the final parameters */ - if (returnedNames == 0) - eos = 1; - if (p->opcode == 1) { - /* find first */ - outp->parmsp[0] = (unsigned short) dsp->cookie; - outp->parmsp[1] = returnedNames; - outp->parmsp[2] = eos; - outp->parmsp[3] = 0; /* nothing wrong with EAS */ - outp->parmsp[4] = 0; - /* don't need last name to continue - * search, cookie is enough. Normally, - * this is the offset of the file name - * of the last entry returned. - */ - outp->totalParms = 10; /* in bytes */ - } - else { - /* find next */ - outp->parmsp[0] = returnedNames; - outp->parmsp[1] = eos; - outp->parmsp[2] = 0; /* EAS error */ - outp->parmsp[3] = 0; /* last name, as above */ - outp->totalParms = 8; /* in bytes */ - } - - /* return # of bytes in the buffer */ - outp->totalData = bytesInBuffer; - - /* Return error code if unsuccessful on first request */ - if (code == 0 && p->opcode == 1 && returnedNames == 0) - code = CM_ERROR_NOSUCHFILE; - - osi_Log4(smb_logp, "T2 search dir done, opcode %d, id %d, %d names, code %d", - p->opcode, dsp->cookie, returnedNames, code); - - /* if we're supposed to close the search after this request, or if - * we're supposed to close the search if we're done, and we're done, - * or if something went wrong, close the search. - */ - /* ((searchFlags & 1) || ((searchFlags & 2) && eos) */ - if ((searchFlags & 1) || (returnedNames == 0) || - ((searchFlags & 2) && eos) || code != 0) - smb_DeleteDirSearch(dsp); - if (code) - smb_SendTran2Error(vcp, p, opx, code); - else - smb_SendTran2Packet(vcp, outp, opx); - - smb_FreeTran2Packet(outp); - smb_ReleaseDirSearch(dsp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return 0; -} - -long smb_ReceiveV3FindClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - int dirHandle; - smb_dirSearch_t *dsp; - - dirHandle = smb_GetSMBParm(inp, 0); - - osi_Log1(smb_logp, "SMB3 find close handle %d", dirHandle); - - dsp = smb_FindDirSearch(dirHandle); - - if (!dsp) - return CM_ERROR_BADFD; - - /* otherwise, we have an FD to destroy */ - smb_DeleteDirSearch(dsp); - smb_ReleaseDirSearch(dsp); - - /* and return results */ - smb_SetSMBDataLength(outp, 0); - - return 0; -} - -long smb_ReceiveV3FindNotifyClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_SetSMBDataLength(outp, 0); - return 0; -} - -long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp; - long code = 0; - cm_space_t *spacep; - int excl; - cm_user_t *userp; - cm_scache_t *dscp; /* dir we're dealing with */ - cm_scache_t *scp; /* file we're creating */ - cm_attr_t setAttr; - int initialModeBits; - smb_fid_t *fidp; - int attributes; - char *lastNamep; - afs_uint32 dosTime; - int openFun; - int trunc; - int openMode; - int extraInfo; - int openAction; - int parmSlot; /* which parm we're dealing with */ - char *tidPathp; - cm_req_t req; - - cm_InitReq(&req); - - scp = NULL; - - extraInfo = (smb_GetSMBParm(inp, 2) & 1); /* return extra info */ - openFun = smb_GetSMBParm(inp, 8); /* open function */ - excl = ((openFun & 3) == 0); - trunc = ((openFun & 3) == 2); /* truncate it */ - openMode = (smb_GetSMBParm(inp, 3) & 0x7); - openAction = 0; /* tracks what we did */ - - attributes = smb_GetSMBParm(inp, 5); - dosTime = smb_GetSMBParm(inp, 6) | (smb_GetSMBParm(inp, 7) << 16); - - /* compute initial mode bits based on read-only flag in attributes */ - initialModeBits = 0666; - if (attributes & 1) initialModeBits &= ~0222; - - pathp = smb_GetSMBData(inp, NULL); - if (smb_StoreAnsiFilenames) - OemToChar(pathp,pathp); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, pathp); - - if (lastNamep && strcmp(lastNamep, SMB_IOCTL_FILENAME) == 0) { - /* special case magic file name for receiving IOCTL requests - * (since IOCTL calls themselves aren't getting through). - */ -#ifdef NOTSERVICE - osi_Log0(smb_logp, "IOCTL Open"); -#endif - - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - smb_SetupIoctlFid(fidp, spacep); - - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fidp->fid; - - /* copy out remainder of the parms */ - parmSlot = 2; - smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++; - if (extraInfo) { - smb_SetSMBParm(outp, parmSlot, /* attrs */ 0); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* mod time */ - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* len */ - smb_SetSMBParm(outp, parmSlot, 0x7fff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, openMode); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* file type 0 ==> normal file or dir */ - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* IPC junk */ - } - /* and the final "always present" stuff */ - smb_SetSMBParm(outp, parmSlot, /* openAction found existing file */ 1); parmSlot++; - /* next write out the "unique" ID */ - smb_SetSMBParm(outp, parmSlot, 0x1234); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0x5678); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; - smb_SetSMBDataLength(outp, 0); - - /* and clean up fid reference */ - smb_ReleaseFID(fidp); - return 0; - } - -#ifdef DEBUG_VERBOSE - { - char *hexp, *asciip; - asciip = (lastNamep ? lastNamep : pathp ); - hexp = osi_HexifyString(asciip); - DEBUG_EVENT2("AFS", "V3Open H[%s] A[%s]", hexp, asciip ); - free(hexp); - } -#endif - userp = smb_GetUser(vcp, inp); - - dscp = NULL; - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - code = cm_NameI(cm_data.rootSCachep, pathp, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &scp); - -#ifdef DFS_SUPPORT - if (code == 0 && scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - if (code != 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->data, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &dscp); - if (code) { - cm_ReleaseUser(userp); - return code; - } - -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - /* otherwise, scp points to the parent directory. Do a lookup, - * and truncate the file if we find it, otherwise we create the - * file. - */ - if (!lastNamep) - lastNamep = pathp; - else - lastNamep++; - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, userp, - &req, &scp); - if (code && code != CM_ERROR_NOSUCHFILE) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - return code; - } - } - - /* if we get here, if code is 0, the file exists and is represented by - * scp. Otherwise, we have to create it. The dir may be represented - * by dscp, or we may have found the file directly. If code is non-zero, - * scp is NULL. - */ - if (code == 0) { - code = cm_CheckOpen(scp, openMode, trunc, userp, &req); - if (code) { - if (dscp) cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return code; - } - - if (excl) { - /* oops, file shouldn't be there */ - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return CM_ERROR_EXISTS; - } - - if (trunc) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - code = cm_SetAttr(scp, &setAttr, userp, &req); - openAction = 3; /* truncated existing file */ - } - else openAction = 1; /* found existing file */ - } - else if (!(openFun & SMB_ATTR_DIRECTORY)) { - /* don't create if not found */ - if (dscp) cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHFILE; - } - else { - osi_assert(dscp != NULL); - osi_Log1(smb_logp, "smb_ReceiveV3OpenX creating file %s", - osi_LogSaveString(smb_logp, lastNamep)); - openAction = 2; /* created file */ - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - smb_UnixTimeFromDosUTime(&setAttr.clientModTime, dosTime); - code = cm_Create(dscp, lastNamep, 0, &setAttr, &scp, userp, - &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, lastNamep, NULL, TRUE); - if (!excl && code == CM_ERROR_EXISTS) { - /* not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after we - * started this call. - */ - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, - userp, &req, &scp); - if (code == 0) { - if (trunc) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - code = cm_SetAttr(scp, &setAttr, userp, &req); - } - } /* lookup succeeded */ - } - } - - /* we don't need this any longer */ - if (dscp) - cm_ReleaseSCache(dscp); - - if (code) { - /* something went wrong creating or truncating the file */ - if (scp) - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return code; - } - - /* make sure we're about to open a file */ - if (scp->fileType != CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - return CM_ERROR_ISDIR; - } - - /* now all we have to do is open the file itself */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); - - /* save a pointer to the vnode */ - fidp->scp = scp; - - /* compute open mode */ - if (openMode != 1) - fidp->flags |= SMB_FID_OPENREAD; - if (openMode == 1 || openMode == 2) - fidp->flags |= SMB_FID_OPENWRITE; - - smb_ReleaseFID(fidp); - - cm_Open(scp, 0, userp); - - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fidp->fid; - - /* copy out remainder of the parms */ - parmSlot = 2; - smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++; - lock_ObtainMutex(&scp->mx); - if (extraInfo) { - smb_SetSMBParm(outp, parmSlot, smb_Attributes(scp)); parmSlot++; - smb_DosUTimeFromUnixTime(&dosTime, scp->clientModTime); - smb_SetSMBParm(outp, parmSlot, dosTime & 0xffff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, (dosTime>>16) & 0xffff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, scp->length.LowPart & 0xffff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, (scp->length.LowPart >> 16) & 0xffff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, openMode); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* file type 0 ==> normal file or dir */ - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* IPC junk */ - } - /* and the final "always present" stuff */ - smb_SetSMBParm(outp, parmSlot, openAction); parmSlot++; - /* next write out the "unique" ID */ - smb_SetSMBParm(outp, parmSlot, scp->fid.vnode & 0xffff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, scp->fid.volume & 0xffff); parmSlot++; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; - lock_ReleaseMutex(&scp->mx); - smb_SetSMBDataLength(outp, 0); - - osi_Log1(smb_logp, "SMB OpenX opening fid %d", fidp->fid); - - cm_ReleaseUser(userp); - /* leave scp held since we put it in fidp->scp */ - return 0; -} - -long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - cm_req_t req; - cm_user_t *userp; - unsigned short fid; - smb_fid_t *fidp; - cm_scache_t *scp; - unsigned char LockType; - unsigned short NumberOfUnlocks, NumberOfLocks; - unsigned long Timeout; - char *op; - LARGE_INTEGER LOffset, LLength; - smb_waitingLock_t *waitingLock; - void *lockp; - long code = 0; - int i; - - cm_InitReq(&req); - - fid = smb_GetSMBParm(inp, 2); - fid = smb_ChainFID(fid, inp); - - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp || (fidp->flags & SMB_FID_IOCTL)) { - return CM_ERROR_BADFD; - } - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fid; - - userp = smb_GetUser(vcp, inp); - - scp = fidp->scp; - - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK - | CM_SCACHESYNC_GETSTATUS - | CM_SCACHESYNC_LOCK); - if (code) - goto doneSync; - - LockType = smb_GetSMBParm(inp, 3) & 0xff; - Timeout = (smb_GetSMBParm(inp, 5) << 16) + smb_GetSMBParm(inp, 4); - NumberOfUnlocks = smb_GetSMBParm(inp, 6); - NumberOfLocks = smb_GetSMBParm(inp, 7); - - op = smb_GetSMBData(inp, NULL); - - for (i=0; ilength)) - continue; - - code = cm_Lock(scp, LockType, LOffset, LLength, Timeout, - userp, &req, &lockp); - if (code == CM_ERROR_WOULDBLOCK && Timeout != 0) { - /* Put on waiting list */ - waitingLock = malloc(sizeof(smb_waitingLock_t)); - waitingLock->vcp = vcp; - smb_HoldVC(vcp); - waitingLock->inp = smb_CopyPacket(inp); - waitingLock->outp = smb_CopyPacket(outp); - waitingLock->timeRemaining = Timeout; - waitingLock->lockp = lockp; - lock_ObtainWrite(&smb_globalLock); - osi_QAdd((osi_queue_t **)&smb_allWaitingLocks, - &waitingLock->q); - osi_Wakeup((long) &smb_allWaitingLocks); - lock_ReleaseWrite(&smb_globalLock); - /* don't send reply immediately */ - outp->flags |= SMB_PACKETFLAG_NOSEND; - } - if (code) - break; - } - - if (code) { - /* release any locks acquired before the failure */ - } - else - smb_SetSMBDataLength(outp, 0); - done: - cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK); - doneSync: - lock_ReleaseMutex(&scp->mx); - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - - return code; -} - -long smb_ReceiveV3GetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned short fid; - smb_fid_t *fidp; - cm_scache_t *scp; - long code = 0; - afs_uint32 searchTime; - cm_user_t *userp; - cm_req_t req; - - cm_InitReq(&req); - - fid = smb_GetSMBParm(inp, 0); - fid = smb_ChainFID(fid, inp); - - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp || (fidp->flags & SMB_FID_IOCTL)) { - return CM_ERROR_BADFD; - } - - userp = smb_GetUser(vcp, inp); - - scp = fidp->scp; - - /* otherwise, stat the file */ - lock_ObtainMutex(&scp->mx); - code = cm_SyncOp(scp, NULL, userp, &req, 0, - CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) goto done; - - /* decode times. We need a search time, but the response to this - * call provides the date first, not the time, as returned in the - * searchTime variable. So we take the high-order bits first. - */ - smb_SearchTimeFromUnixTime(&searchTime, scp->clientModTime); - smb_SetSMBParm(outp, 0, (searchTime >> 16) & 0xffff); /* ctime */ - smb_SetSMBParm(outp, 1, searchTime & 0xffff); - smb_SetSMBParm(outp, 2, (searchTime >> 16) & 0xffff); /* atime */ - smb_SetSMBParm(outp, 3, searchTime & 0xffff); - smb_SetSMBParm(outp, 4, (searchTime >> 16) & 0xffff); /* mtime */ - smb_SetSMBParm(outp, 5, searchTime & 0xffff); - - /* now handle file size and allocation size */ - smb_SetSMBParm(outp, 6, scp->length.LowPart & 0xffff); /* file size */ - smb_SetSMBParm(outp, 7, (scp->length.LowPart >> 16) & 0xffff); - smb_SetSMBParm(outp, 8, scp->length.LowPart & 0xffff); /* alloc size */ - smb_SetSMBParm(outp, 9, (scp->length.LowPart >> 16) & 0xffff); - - /* file attribute */ - smb_SetSMBParm(outp, 10, smb_Attributes(scp)); - - /* and finalize stuff */ - smb_SetSMBDataLength(outp, 0); - code = 0; - - done: - lock_ReleaseMutex(&scp->mx); - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - return code; -} - -long smb_ReceiveV3SetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned short fid; - smb_fid_t *fidp; - cm_scache_t *scp; - long code = 0; - afs_uint32 searchTime; - time_t unixTime; - cm_user_t *userp; - cm_attr_t attrs; - cm_req_t req; - - cm_InitReq(&req); - - fid = smb_GetSMBParm(inp, 0); - fid = smb_ChainFID(fid, inp); - - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp || (fidp->flags & SMB_FID_IOCTL)) { - return CM_ERROR_BADFD; - } - - userp = smb_GetUser(vcp, inp); - - scp = fidp->scp; - - /* now prepare to call cm_setattr. This message only sets various times, - * and AFS only implements mtime, and we'll set the mtime if that's - * requested. The others we'll ignore. - */ - searchTime = smb_GetSMBParm(inp, 5) | (smb_GetSMBParm(inp, 6) << 16); - - if (searchTime != 0) { - smb_UnixTimeFromSearchTime(&unixTime, searchTime); - - if ( unixTime != -1 ) { - attrs.mask = CM_ATTRMASK_CLIENTMODTIME; - attrs.clientModTime = unixTime; - code = cm_SetAttr(scp, &attrs, userp, &req); - - osi_Log1(smb_logp, "SMB receive V3SetAttributes [fid=%ld]", fid); - } else { - osi_Log1(smb_logp, "**smb_UnixTimeFromSearchTime failed searchTime=%ld", searchTime); - } - } - else code = 0; - - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - return code; -} - - -long smb_ReceiveV3ReadX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - osi_hyper_t offset; - long count, finalCount; - unsigned short fd; - smb_fid_t *fidp; - long code = 0; - cm_user_t *userp; - char *op; - - fd = smb_GetSMBParm(inp, 2); - count = smb_GetSMBParm(inp, 5); - offset.HighPart = 0; /* too bad */ - offset.LowPart = smb_GetSMBParm(inp, 3) | (smb_GetSMBParm(inp, 4) << 16); - - osi_Log3(smb_logp, "smb_ReceiveV3Read fd %d, off 0x%x, size 0x%x", - fd, offset.LowPart, count); - - fd = smb_ChainFID(fd, inp); - fidp = smb_FindFID(vcp, fd, 0); - if (!fidp) { - return CM_ERROR_BADFD; - } - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fd; - - if (fidp->flags & SMB_FID_IOCTL) { - return smb_IoctlV3Read(fidp, vcp, inp, outp); - } - - userp = smb_GetUser(vcp, inp); - - /* 0 and 1 are reserved for request chaining, were setup by our caller, - * and will be further filled in after we return. - */ - smb_SetSMBParm(outp, 2, 0); /* remaining bytes, for pipes */ - smb_SetSMBParm(outp, 3, 0); /* resvd */ - smb_SetSMBParm(outp, 4, 0); /* resvd */ - smb_SetSMBParm(outp, 5, count); /* # of bytes we're going to read */ - /* fill in #6 when we have all the parameters' space reserved */ - smb_SetSMBParm(outp, 7, 0); /* resv'd */ - smb_SetSMBParm(outp, 8, 0); /* resv'd */ - smb_SetSMBParm(outp, 9, 0); /* resv'd */ - smb_SetSMBParm(outp, 10, 0); /* resv'd */ - smb_SetSMBParm(outp, 11, 0); /* reserved */ - - /* get op ptr after putting in the parms, since otherwise we don't - * know where the data really is. - */ - op = smb_GetSMBData(outp, NULL); - - /* now fill in offset from start of SMB header to first data byte (to op) */ - smb_SetSMBParm(outp, 6, ((int) (op - outp->data))); - - /* set the packet data length the count of the # of bytes */ - smb_SetSMBDataLength(outp, count); - -#ifndef DJGPP - code = smb_ReadData(fidp, &offset, count, op, userp, &finalCount); -#else /* DJGPP */ - code = smb_ReadData(fidp, &offset, count, op, userp, &finalCount, FALSE); -#endif /* !DJGPP */ - - /* fix some things up */ - smb_SetSMBParm(outp, 5, finalCount); - smb_SetSMBDataLength(outp, finalCount); - - smb_ReleaseFID(fidp); - - cm_ReleaseUser(userp); - return code; -} - -/* - * Values for createDisp, copied from NTDDK.H - */ -#define FILE_SUPERSEDE 0 // (???) -#define FILE_OPEN 1 // (open) -#define FILE_CREATE 2 // (exclusive) -#define FILE_OPEN_IF 3 // (non-exclusive) -#define FILE_OVERWRITE 4 // (open & truncate, but do not create) -#define FILE_OVERWRITE_IF 5 // (open & truncate, or create) - -/* Flags field */ -#define REQUEST_OPLOCK 2 -#define REQUEST_BATCH_OPLOCK 4 -#define OPEN_DIRECTORY 8 -#define EXTENDED_RESPONSE_REQUIRED 0x10 - -/* CreateOptions field. */ -#define FILE_DIRECTORY_FILE 0x0001 -#define FILE_WRITE_THROUGH 0x0002 -#define FILE_SEQUENTIAL_ONLY 0x0004 -#define FILE_NON_DIRECTORY_FILE 0x0040 -#define FILE_NO_EA_KNOWLEDGE 0x0200 -#define FILE_EIGHT_DOT_THREE_ONLY 0x0400 -#define FILE_RANDOM_ACCESS 0x0800 -#define FILE_DELETE_ON_CLOSE 0x1000 -#define FILE_OPEN_BY_FILE_ID 0x2000 - -long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp, *realPathp; - long code = 0; - cm_space_t *spacep; - cm_user_t *userp; - cm_scache_t *dscp; /* parent dir */ - cm_scache_t *scp; /* file to create or open */ - cm_scache_t *targetScp; /* if scp is a symlink */ - cm_attr_t setAttr; - char *lastNamep; - char *treeStartp; - unsigned short nameLength; - unsigned int flags; - unsigned int requestOpLock; - unsigned int requestBatchOpLock; - unsigned int mustBeDir; - unsigned int extendedRespRequired; - unsigned int treeCreate; - int realDirFlag; - unsigned int desiredAccess; - unsigned int extAttributes; - unsigned int createDisp; - unsigned int createOptions; - int initialModeBits; - unsigned short baseFid; - smb_fid_t *baseFidp; - smb_fid_t *fidp; - cm_scache_t *baseDirp; - unsigned short openAction; - int parmSlot; - long fidflags; - FILETIME ft; - LARGE_INTEGER sz; - char *tidPathp; - BOOL foundscp; - cm_req_t req; - - cm_InitReq(&req); - - /* This code is very long and has a lot of if-then-else clauses - * scp and dscp get reused frequently and we need to ensure that - * we don't lose a reference. Start by ensuring that they are NULL. - */ - scp = NULL; - dscp = NULL; - treeCreate = FALSE; - foundscp = FALSE; - - nameLength = smb_GetSMBOffsetParm(inp, 2, 1); - flags = smb_GetSMBOffsetParm(inp, 3, 1) - | (smb_GetSMBOffsetParm(inp, 4, 1) << 16); - requestOpLock = flags & REQUEST_OPLOCK; - requestBatchOpLock = flags & REQUEST_BATCH_OPLOCK; - mustBeDir = flags & OPEN_DIRECTORY; - extendedRespRequired = flags & EXTENDED_RESPONSE_REQUIRED; - - /* - * Why all of a sudden 32-bit FID? - * We will reject all bits higher than 16. - */ - if (smb_GetSMBOffsetParm(inp, 6, 1) != 0) - return CM_ERROR_INVAL; - baseFid = smb_GetSMBOffsetParm(inp, 5, 1); - desiredAccess = smb_GetSMBOffsetParm(inp, 7, 1) - | (smb_GetSMBOffsetParm(inp, 8, 1) << 16); - extAttributes = smb_GetSMBOffsetParm(inp, 13, 1) - | (smb_GetSMBOffsetParm(inp, 14, 1) << 16); - createDisp = smb_GetSMBOffsetParm(inp, 17, 1) - | (smb_GetSMBOffsetParm(inp, 18, 1) << 16); - createOptions = smb_GetSMBOffsetParm(inp, 19, 1) - | (smb_GetSMBOffsetParm(inp, 20, 1) << 16); - - /* mustBeDir is never set; createOptions directory bit seems to be - * more important - */ - if (createOptions & FILE_DIRECTORY_FILE) - realDirFlag = 1; - else if (createOptions & FILE_NON_DIRECTORY_FILE) - realDirFlag = 0; - else - realDirFlag = -1; - - /* - * compute initial mode bits based on read-only flag in - * extended attributes - */ - initialModeBits = 0666; - if (extAttributes & 1) - initialModeBits &= ~0222; - - pathp = smb_GetSMBData(inp, NULL); - /* Sometimes path is not null-terminated, so we make a copy. */ - realPathp = malloc(nameLength+1); - memcpy(realPathp, pathp, nameLength); - realPathp[nameLength] = 0; - if (smb_StoreAnsiFilenames) - OemToChar(realPathp,realPathp); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->data, &lastNamep, realPathp); - - osi_Log1(smb_logp,"NTCreateX for [%s]",osi_LogSaveString(smb_logp,realPathp)); - osi_Log4(smb_logp,"... da=[%x] ea=[%x] cd=[%x] co=[%x]", desiredAccess, extAttributes, createDisp, createOptions); - osi_Log2(smb_logp,"... flags=[%x] lastNamep=[%s]", flags, osi_LogSaveString(smb_logp,(lastNamep?lastNamep:"null"))); - - if (lastNamep && strcmp(lastNamep, SMB_IOCTL_FILENAME) == 0) { - /* special case magic file name for receiving IOCTL requests - * (since IOCTL calls themselves aren't getting through). - */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - smb_SetupIoctlFid(fidp, spacep); - osi_Log1(smb_logp,"NTCreateX Setting up IOCTL on fid[%d]",fidp->fid); - - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fidp->fid; - - /* out parms */ - parmSlot = 2; - smb_SetSMBParmByte(outp, parmSlot, 0); /* oplock */ - smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++; - smb_SetSMBParmLong(outp, parmSlot, 1); parmSlot += 2; /* Action */ - /* times */ - memset(&ft, 0, sizeof(ft)); - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; /* attr */ - sz.HighPart = 0x7fff; sz.LowPart = 0; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&sz); parmSlot += 4; /* alen */ - smb_SetSMBParmDouble(outp, parmSlot, (char *)&sz); parmSlot += 4; /* len */ - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* filetype */ - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* dev state */ - smb_SetSMBParmByte(outp, parmSlot, 0); /* is a dir? */ - smb_SetSMBDataLength(outp, 0); - - /* clean up fid reference */ - smb_ReleaseFID(fidp); - free(realPathp); - return 0; - } - -#ifdef DEBUG_VERBOSE - { - char *hexp, *asciip; - asciip = (lastNamep? lastNamep : realPathp); - hexp = osi_HexifyString( asciip ); - DEBUG_EVENT2("AFS", "NTCreateX H[%s] A[%s]", hexp, asciip); - free(hexp); - } -#endif - userp = smb_GetUser(vcp, inp); - if (!userp) { - osi_Log1(smb_logp, "NTCreateX Invalid user [%d]", ((smb_t *) inp)->uid); - free(realPathp); - return CM_ERROR_INVAL; - } - - if (baseFid == 0) { - baseDirp = cm_data.rootSCachep; - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code == CM_ERROR_TIDIPC) { - /* Attempt to use a TID allocated for IPC. The client - * is probably looking for DCE RPC end points which we - * don't support OR it could be looking to make a DFS - * referral request. - */ - osi_Log0(smb_logp, "NTCreateX received IPC TID"); -#ifndef DFS_SUPPORT - free(realPathp); - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHFILE; -#endif /* DFS_SUPPORT */ - } - } else { - baseFidp = smb_FindFID(vcp, baseFid, 0); - if (!baseFidp) { - osi_Log1(smb_logp, "NTCreateX Invalid base fid [%d]", baseFid); - free(realPathp); - cm_ReleaseUser(userp); - return CM_ERROR_INVAL; - } - baseDirp = baseFidp->scp; - tidPathp = NULL; - } - - osi_Log1(smb_logp, "NTCreateX tidPathp=[%s]", (tidPathp==NULL)?"null": osi_LogSaveString(smb_logp,tidPathp)); - - /* compute open mode */ - fidflags = 0; - if (desiredAccess & DELETE) - fidflags |= SMB_FID_OPENDELETE; - if (desiredAccess & AFS_ACCESS_READ) - fidflags |= SMB_FID_OPENREAD; - if (desiredAccess & AFS_ACCESS_WRITE) - fidflags |= SMB_FID_OPENWRITE; - - code = 0; - - /* For an exclusive create, we want to do a case sensitive match for the last component. */ - if ( createDisp == FILE_CREATE || - createDisp == FILE_OVERWRITE || - createDisp == FILE_OVERWRITE_IF) { - code = cm_NameI(baseDirp, spacep->data, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &dscp); - if (code == 0) { -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - code = cm_Lookup(dscp, (lastNamep)?(lastNamep+1):realPathp, CM_FLAG_FOLLOW, - userp, &req, &scp); - if (code == CM_ERROR_NOSUCHFILE) { - code = cm_Lookup(dscp, (lastNamep)?(lastNamep+1):realPathp, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, &req, &scp); - if (code == 0 && realDirFlag == 1) { - cm_ReleaseSCache(scp); - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_EXISTS; - } - } - } - /* we have both scp and dscp */ - } else { - code = cm_NameI(baseDirp, realPathp, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &scp); -#ifdef DFS_SUPPORT - if (code == 0 && scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - /* we might have scp but not dscp */ - } - - if (scp) - foundscp = TRUE; - - if (!foundscp || (fidflags & (SMB_FID_OPENDELETE | SMB_FID_OPENWRITE))) { - /* look up parent directory */ - /* If we are trying to create a path (i.e. multiple nested directories), then we don't *need* - * the immediate parent. We have to work our way up realPathp until we hit something that we - * recognize. - */ - - /* we might or might not have scp */ - - if (dscp == NULL) { - do { - char *tp; - - code = cm_NameI(baseDirp, spacep->data, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &dscp); - -#ifdef DFS_SUPPORT - if (code == 0 && dscp->fileType == CM_SCACHETYPE_DFSLINK) { - if (scp) - cm_ReleaseSCache(scp); - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - - if (code && - (tp = strrchr(spacep->data,'\\')) && - (createDisp == FILE_CREATE) && - (realDirFlag == 1)) { - *tp++ = 0; - treeCreate = TRUE; - treeStartp = realPathp + (tp - spacep->data); - - if (*tp && !smb_IsLegalFilename(tp)) { - if (baseFid != 0) - smb_ReleaseFID(baseFidp); - cm_ReleaseUser(userp); - free(realPathp); - if (scp) - cm_ReleaseSCache(scp); - return CM_ERROR_BADNTFILENAME; - } - code = 0; - } - } while (dscp == NULL && code == 0); - } else - code = 0; - - /* we might have scp and we might have dscp */ - - if (baseFid != 0) - smb_ReleaseFID(baseFidp); - - if (code) { - osi_Log0(smb_logp,"NTCreateX parent not found"); - if (scp) - cm_ReleaseSCache(scp); - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - - if (treeCreate && dscp->fileType == CM_SCACHETYPE_FILE) { - /* A file exists where we want a directory. */ - if (scp) - cm_ReleaseSCache(scp); - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_EXISTS; - } - - if (!lastNamep) - lastNamep = realPathp; - else - lastNamep++; - - if (!smb_IsLegalFilename(lastNamep)) { - if (scp) - cm_ReleaseSCache(scp); - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_BADNTFILENAME; - } - - if (!foundscp && !treeCreate) { - if ( createDisp == FILE_CREATE || - createDisp == FILE_OVERWRITE || - createDisp == FILE_OVERWRITE_IF) - { - code = cm_Lookup(dscp, lastNamep, - CM_FLAG_FOLLOW, userp, &req, &scp); - } else { - code = cm_Lookup(dscp, lastNamep, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, &req, &scp); - } - if (code && code != CM_ERROR_NOSUCHFILE) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - } - /* we have scp and dscp */ - } else { - /* we have scp but not dscp */ - if (baseFid != 0) - smb_ReleaseFID(baseFidp); - } - - /* if we get here, if code is 0, the file exists and is represented by - * scp. Otherwise, we have to create it. The dir may be represented - * by dscp, or we may have found the file directly. If code is non-zero, - * scp is NULL. - */ - if (code == 0 && !treeCreate) { - if (createDisp == FILE_CREATE) { - /* oops, file shouldn't be there */ - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_EXISTS; - } - - if ( createDisp == FILE_OVERWRITE || - createDisp == FILE_OVERWRITE_IF) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - targetScp = 0; - osi_assert(dscp != NULL); - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - code = cm_SetAttr(scp, &setAttr, userp, &req); - openAction = 3; /* truncated existing file */ - } - else - openAction = 1; /* found existing file */ - - code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req); - if (code) { - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - } else if (createDisp == FILE_OPEN || createDisp == FILE_OVERWRITE) { - /* don't create if not found */ - if (dscp) - cm_ReleaseSCache(dscp); - if (scp) - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_NOSUCHFILE; - } else if (realDirFlag == 0 || realDirFlag == -1) { - osi_assert(dscp != NULL); - osi_Log1(smb_logp, "smb_ReceiveNTCreateX creating file %s", - osi_LogSaveString(smb_logp, lastNamep)); - openAction = 2; /* created file */ - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - setAttr.clientModTime = time(NULL); - code = cm_Create(dscp, lastNamep, 0, &setAttr, &scp, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, lastNamep, NULL, TRUE); - if (code == CM_ERROR_EXISTS && createDisp != FILE_CREATE) { - /* Not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after we - * started this call. - */ - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, - userp, &req, &scp); - if (code == 0) { - if (createDisp == FILE_OVERWRITE_IF) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - targetScp = 0; - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - code = cm_SetAttr(scp, &setAttr, userp, &req); - } - } /* lookup succeeded */ - } - } else { - char *tp, *pp; - char *cp; /* This component */ - int clen = 0; /* length of component */ - cm_scache_t *tscp1, *tscp2; - int isLast = 0; - - /* create directory */ - if ( !treeCreate ) - treeStartp = lastNamep; - osi_assert(dscp != NULL); - osi_Log1(smb_logp, "smb_ReceiveNTCreateX creating directory [%s]", - osi_LogSaveString(smb_logp, treeStartp)); - openAction = 2; /* created directory */ - - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - setAttr.clientModTime = time(NULL); - - pp = treeStartp; - cp = spacep->data; - tscp1 = dscp; - cm_HoldSCache(tscp1); - tscp2 = NULL; - - while (pp && *pp) { - tp = strchr(pp, '\\'); - if (!tp) { - strcpy(cp,pp); - clen = strlen(cp); - isLast = 1; /* indicate last component. the supplied path never ends in a slash */ - } else { - clen = tp - pp; - strncpy(cp,pp,clen); - *(cp + clen) = 0; - tp++; - } - pp = tp; - - if (clen == 0) - continue; /* the supplied path can't have consecutive slashes either , but */ - - /* cp is the next component to be created. */ - code = cm_MakeDir(tscp1, cp, 0, &setAttr, userp, &req); - if (code == 0 && (tscp1->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_DIR_NAME, - tscp1, cp, NULL, TRUE); - if (code == 0 || - (code == CM_ERROR_EXISTS && createDisp != FILE_CREATE)) { - /* Not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after we - * started this call. - */ - code = cm_Lookup(tscp1, cp, CM_FLAG_CASEFOLD, - userp, &req, &tscp2); - } - if (code) - break; - - if (!isLast) { /* for anything other than dscp, release it unless it's the last one */ - cm_ReleaseSCache(tscp1); - tscp1 = tscp2; /* Newly created directory will be next parent */ - /* the hold is transfered to tscp1 from tscp2 */ - } - } - - if (dscp) - cm_ReleaseSCache(dscp); - dscp = tscp1; - if (scp) - cm_ReleaseSCache(scp); - scp = tscp2; - /* - * if we get here and code == 0, then scp is the last directory created, and dscp is the - * parent of scp. - */ - } - - if (code) { - /* something went wrong creating or truncating the file */ - if (scp) - cm_ReleaseSCache(scp); - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - - /* make sure we have file vs. dir right (only applies for single component case) */ - if (realDirFlag == 0 && scp->fileType != CM_SCACHETYPE_FILE) { - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - cm_scache_t * targetScp = 0; - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - - if (scp->fileType != CM_SCACHETYPE_FILE) { - if (dscp) - cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_ISDIR; - } - } - - /* (only applies to single component case) */ - if (realDirFlag == 1 && scp->fileType == CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_NOTDIR; - } - - /* open the file itself */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); - /* save a pointer to the vnode */ - fidp->scp = scp; /* Hold transfered to fidp->scp and no longer needed */ - - fidp->flags = fidflags; - - /* save parent dir and pathname for delete or change notification */ - if (fidflags & (SMB_FID_OPENDELETE | SMB_FID_OPENWRITE)) { - fidp->flags |= SMB_FID_NTOPEN; - fidp->NTopen_dscp = dscp; - cm_HoldSCache(dscp); - fidp->NTopen_pathp = strdup(lastNamep); - } - fidp->NTopen_wholepathp = realPathp; - - /* we don't need this any longer */ - if (dscp) { - cm_ReleaseSCache(dscp); - dscp = NULL; - } - cm_Open(scp, 0, userp); - - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fidp->fid; - - /* out parms */ - parmSlot = 2; - lock_ObtainMutex(&scp->mx); - smb_SetSMBParmByte(outp, parmSlot, 0); /* oplock */ - smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++; - smb_SetSMBParmLong(outp, parmSlot, openAction); parmSlot += 2; - smb_LargeSearchTimeFromUnixTime(&ft, scp->clientModTime); - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&ft); parmSlot += 4; - smb_SetSMBParmLong(outp, parmSlot, smb_ExtAttributes(scp)); - parmSlot += 2; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&scp->length); parmSlot += 4; - smb_SetSMBParmDouble(outp, parmSlot, (char *)&scp->length); parmSlot += 4; - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* filetype */ - smb_SetSMBParm(outp, parmSlot, 0); parmSlot++; /* dev state */ - smb_SetSMBParmByte(outp, parmSlot, - scp->fileType == CM_SCACHETYPE_DIRECTORY); /* is a dir? */ - lock_ReleaseMutex(&scp->mx); - smb_SetSMBDataLength(outp, 0); - - osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %s", fidp->fid, - osi_LogSaveString(smb_logp, realPathp)); - - smb_ReleaseFID(fidp); - - cm_ReleaseUser(userp); - - /* Can't free realPathp if we get here since fidp->NTopen_wholepathp is pointing there */ - - /* leave scp held since we put it in fidp->scp */ - return 0; -} - -/* - * A lot of stuff copied verbatim from NT Create&X to NT Tran Create. - * Instead, ultimately, would like to use a subroutine for common code. - */ -long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *pathp, *realPathp; - long code = 0; - cm_space_t *spacep; - cm_user_t *userp; - cm_scache_t *dscp; /* parent dir */ - cm_scache_t *scp; /* file to create or open */ - cm_scache_t *targetScp; /* if scp is a symlink */ - cm_attr_t setAttr; - char *lastNamep; - unsigned long nameLength; - unsigned int flags; - unsigned int requestOpLock; - unsigned int requestBatchOpLock; - unsigned int mustBeDir; - unsigned int extendedRespRequired; - int realDirFlag; - unsigned int desiredAccess; -#ifdef DEBUG_VERBOSE - unsigned int allocSize; - unsigned int shareAccess; -#endif - unsigned int extAttributes; - unsigned int createDisp; -#ifdef DEBUG_VERBOSE - unsigned int sdLen; -#endif - unsigned int createOptions; - int initialModeBits; - unsigned short baseFid; - smb_fid_t *baseFidp; - smb_fid_t *fidp; - cm_scache_t *baseDirp; - unsigned short openAction; - int parmSlot; - long fidflags; - FILETIME ft; - char *tidPathp; - BOOL foundscp; - int parmOffset, dataOffset; - char *parmp; - ULONG *lparmp; - char *outData; - cm_req_t req; - - cm_InitReq(&req); - - foundscp = FALSE; - scp = NULL; - - parmOffset = smb_GetSMBOffsetParm(inp, 11, 1) - | (smb_GetSMBOffsetParm(inp, 12, 1) << 16); - parmp = inp->data + parmOffset; - lparmp = (ULONG *) parmp; - - flags = lparmp[0]; - requestOpLock = flags & REQUEST_OPLOCK; - requestBatchOpLock = flags & REQUEST_BATCH_OPLOCK; - mustBeDir = flags & OPEN_DIRECTORY; - extendedRespRequired = flags & EXTENDED_RESPONSE_REQUIRED; - - /* - * Why all of a sudden 32-bit FID? - * We will reject all bits higher than 16. - */ - if (lparmp[1] & 0xFFFF0000) - return CM_ERROR_INVAL; - baseFid = (unsigned short)lparmp[1]; - desiredAccess = lparmp[2]; -#ifdef DEBUG_VERBOSE - allocSize = lparmp[3]; -#endif /* DEBUG_VERSOSE */ - extAttributes = lparmp[5]; -#ifdef DEBUG_VEROSE - shareAccess = lparmp[6]; -#endif - createDisp = lparmp[7]; - createOptions = lparmp[8]; -#ifdef DEBUG_VERBOSE - sdLen = lparmp[9]; -#endif - nameLength = lparmp[11]; - -#ifdef DEBUG_VERBOSE - osi_Log4(smb_logp,"NTTranCreate with da[%x],ea[%x],sa[%x],cd[%x]",desiredAccess,extAttributes,shareAccess,createDisp); - osi_Log3(smb_logp,"... co[%x],sdl[%x],as[%x]",createOptions,sdLen,allocSize); - osi_Log1(smb_logp,"... flags[%x]",flags); -#endif - - /* mustBeDir is never set; createOptions directory bit seems to be - * more important - */ - if (createOptions & FILE_DIRECTORY_FILE) - realDirFlag = 1; - else if (createOptions & FILE_NON_DIRECTORY_FILE) - realDirFlag = 0; - else - realDirFlag = -1; - - /* - * compute initial mode bits based on read-only flag in - * extended attributes - */ - initialModeBits = 0666; - if (extAttributes & 1) - initialModeBits &= ~0222; - - pathp = parmp + (13 * sizeof(ULONG)) + sizeof(UCHAR); - /* Sometimes path is not null-terminated, so we make a copy. */ - realPathp = malloc(nameLength+1); - memcpy(realPathp, pathp, nameLength); - realPathp[nameLength] = 0; - if (smb_StoreAnsiFilenames) - OemToChar(realPathp,realPathp); - - spacep = cm_GetSpace(); - smb_StripLastComponent(spacep->data, &lastNamep, realPathp); - - /* - * Nothing here to handle SMB_IOCTL_FILENAME. - * Will add it if necessary. - */ - -#ifdef DEBUG_VERBOSE - { - char *hexp, *asciip; - asciip = (lastNamep? lastNamep : realPathp); - hexp = osi_HexifyString( asciip ); - DEBUG_EVENT2("AFS", "NTTranCreate H[%s] A[%s]", hexp, asciip); - free(hexp); - } -#endif - - userp = smb_GetUser(vcp, inp); - if (!userp) { - osi_Log1(smb_logp, "NTTranCreate invalid user [%d]", ((smb_t *) inp)->uid); - free(realPathp); - return CM_ERROR_INVAL; - } - - if (baseFid == 0) { - baseDirp = cm_data.rootSCachep; - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); - if (code == CM_ERROR_TIDIPC) { - /* Attempt to use a TID allocated for IPC. The client - * is probably looking for DCE RPC end points which we - * don't support OR it could be looking to make a DFS - * referral request. - */ - osi_Log0(smb_logp, "NTTranCreate received IPC TID"); -#ifndef DFS_SUPPORT - free(realPathp); - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; -#endif - } - } else { - baseFidp = smb_FindFID(vcp, baseFid, 0); - if (!baseFidp) { - osi_Log1(smb_logp, "NTTranCreate Invalid fid [%d]", baseFid); - free(realPathp); - cm_ReleaseUser(userp); - return CM_ERROR_INVAL; - } - baseDirp = baseFidp->scp; - tidPathp = NULL; - } - - /* compute open mode */ - fidflags = 0; - if (desiredAccess & DELETE) - fidflags |= SMB_FID_OPENDELETE; - if (desiredAccess & AFS_ACCESS_READ) - fidflags |= SMB_FID_OPENREAD; - if (desiredAccess & AFS_ACCESS_WRITE) - fidflags |= SMB_FID_OPENWRITE; - - dscp = NULL; - code = 0; - if ( createDisp == FILE_OPEN || - createDisp == FILE_OVERWRITE || - createDisp == FILE_OVERWRITE_IF) { - code = cm_NameI(baseDirp, spacep->data, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &dscp); - if (code == 0) { -#ifdef DFS_SUPPORT - if (dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - code = cm_Lookup(dscp, (lastNamep)?(lastNamep+1):realPathp, CM_FLAG_FOLLOW, - userp, &req, &scp); - if (code == CM_ERROR_NOSUCHFILE) { - code = cm_Lookup(dscp, (lastNamep)?(lastNamep+1):realPathp, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, &req, &scp); - if (code == 0 && realDirFlag == 1) { - cm_ReleaseSCache(scp); - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_EXISTS; - } - } - } else - dscp = NULL; - } else { - code = cm_NameI(baseDirp, realPathp, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &scp); -#ifdef DFS_SUPPORT - if (code == 0 && scp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - } - - if (code == 0) - foundscp = TRUE; - - if (code != 0 || (fidflags & (SMB_FID_OPENDELETE | SMB_FID_OPENWRITE))) { - /* look up parent directory */ - if ( !dscp ) { - code = cm_NameI(baseDirp, spacep->data, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, tidPathp, &req, &dscp); -#ifdef DFS_SUPPORT - if (code == 0 && dscp->fileType == CM_SCACHETYPE_DFSLINK) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - if ( WANTS_DFS_PATHNAMES(inp) ) - return CM_ERROR_PATH_NOT_COVERED; - else - return CM_ERROR_BADSHARENAME; - } -#endif /* DFS_SUPPORT */ - } else - code = 0; - - cm_FreeSpace(spacep); - - if (baseFid != 0) { - smb_ReleaseFID(baseFidp); - baseFidp = 0; - } - - if (code) { - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - - if (!lastNamep) lastNamep = realPathp; - else lastNamep++; - - if (!smb_IsLegalFilename(lastNamep)) - return CM_ERROR_BADNTFILENAME; - - if (!foundscp) { - if (createDisp == FILE_CREATE || createDisp == FILE_OVERWRITE_IF) { - code = cm_Lookup(dscp, lastNamep, - CM_FLAG_FOLLOW, userp, &req, &scp); - } else { - code = cm_Lookup(dscp, lastNamep, - CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, - userp, &req, &scp); - } - if (code && code != CM_ERROR_NOSUCHFILE) { - cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - } - } else { - if (baseFid != 0) { - smb_ReleaseFID(baseFidp); - baseFidp = 0; - } - cm_FreeSpace(spacep); - } - - /* if we get here, if code is 0, the file exists and is represented by - * scp. Otherwise, we have to create it. The dir may be represented - * by dscp, or we may have found the file directly. If code is non-zero, - * scp is NULL. - */ - if (code == 0) { - code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, - &req); - if (code) { - if (dscp) cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - - if (createDisp == FILE_CREATE) { - /* oops, file shouldn't be there */ - if (dscp) cm_ReleaseSCache(dscp); - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_EXISTS; - } - - if (createDisp == FILE_OVERWRITE || - createDisp == FILE_OVERWRITE_IF) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - targetScp = 0; - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - code = cm_SetAttr(scp, &setAttr, userp, &req); - openAction = 3; /* truncated existing file */ - } - else openAction = 1; /* found existing file */ - } - else if (createDisp == FILE_OPEN || createDisp == FILE_OVERWRITE) { - /* don't create if not found */ - if (dscp) cm_ReleaseSCache(dscp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_NOSUCHFILE; - } - else if (realDirFlag == 0 || realDirFlag == -1) { - osi_assert(dscp != NULL); - osi_Log1(smb_logp, "smb_ReceiveNTTranCreate creating file %s", - osi_LogSaveString(smb_logp, lastNamep)); - openAction = 2; /* created file */ - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - setAttr.clientModTime = time(NULL); - code = cm_Create(dscp, lastNamep, 0, &setAttr, &scp, userp, - &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME, - dscp, lastNamep, NULL, TRUE); - if (code == CM_ERROR_EXISTS && createDisp != FILE_CREATE) { - /* Not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after we - * started this call. - */ - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, - userp, &req, &scp); - if (code == 0) { - if (createDisp == FILE_OVERWRITE_IF) { - setAttr.mask = CM_ATTRMASK_LENGTH; - setAttr.length.LowPart = 0; - setAttr.length.HighPart = 0; - - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - targetScp = 0; - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - code = cm_SetAttr(scp, &setAttr, userp, &req); - } - } /* lookup succeeded */ - } - } else { - /* create directory */ - osi_assert(dscp != NULL); - osi_Log1(smb_logp, - "smb_ReceiveNTTranCreate creating directory %s", - osi_LogSaveString(smb_logp, lastNamep)); - openAction = 2; /* created directory */ - setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; - setAttr.clientModTime = time(NULL); - code = cm_MakeDir(dscp, lastNamep, 0, &setAttr, userp, &req); - if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) - smb_NotifyChange(FILE_ACTION_ADDED, - FILE_NOTIFY_CHANGE_DIR_NAME, - dscp, lastNamep, NULL, TRUE); - if (code == 0 || - (code == CM_ERROR_EXISTS && createDisp != FILE_CREATE)) { - /* Not an exclusive create, and someone else tried - * creating it already, then we open it anyway. We - * don't bother retrying after this, since if this next - * fails, that means that the file was deleted after we - * started this call. - */ - code = cm_Lookup(dscp, lastNamep, CM_FLAG_CASEFOLD, - userp, &req, &scp); - } - } - - if (code) { - /* something went wrong creating or truncating the file */ - if (scp) cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return code; - } - - /* make sure we have file vs. dir right */ - if (realDirFlag == 0 && scp->fileType != CM_SCACHETYPE_FILE) { - /* now watch for a symlink */ - code = 0; - while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) { - targetScp = 0; - code = cm_EvaluateSymLink(dscp, scp, &targetScp, userp, &req); - if (code == 0) { - /* we have a more accurate file to use (the - * target of the symbolic link). Otherwise, - * we'll just use the symlink anyway. - */ - osi_Log2(smb_logp, "symlink vp %x to vp %x", - scp, targetScp); - cm_ReleaseSCache(scp); - scp = targetScp; - } - } - - if (scp->fileType != CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_ISDIR; - } - } - - if (realDirFlag == 1 && scp->fileType == CM_SCACHETYPE_FILE) { - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); - free(realPathp); - return CM_ERROR_NOTDIR; - } - - /* open the file itself */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assert(fidp); - - /* save a pointer to the vnode */ - fidp->scp = scp; - - fidp->flags = fidflags; - - /* save parent dir and pathname for deletion or change notification */ - if (fidflags & (SMB_FID_OPENDELETE | SMB_FID_OPENWRITE)) { - fidp->flags |= SMB_FID_NTOPEN; - fidp->NTopen_dscp = dscp; - cm_HoldSCache(dscp); - fidp->NTopen_pathp = strdup(lastNamep); - } - fidp->NTopen_wholepathp = realPathp; - - /* we don't need this any longer */ - if (dscp) cm_ReleaseSCache(dscp); - - cm_Open(scp, 0, userp); - - /* set inp->fid so that later read calls in same msg can find fid */ - inp->fid = fidp->fid; - - /* check whether we are required to send an extended response */ - if (!extendedRespRequired) { - /* out parms */ - parmOffset = 8*4 + 39; - parmOffset += 1; /* pad to 4 */ - dataOffset = parmOffset + 70; - - parmSlot = 1; - outp->oddByte = 1; - /* Total Parameter Count */ - smb_SetSMBParmLong(outp, parmSlot, 70); parmSlot += 2; - /* Total Data Count */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Parameter Count */ - smb_SetSMBParmLong(outp, parmSlot, 70); parmSlot += 2; - /* Parameter Offset */ - smb_SetSMBParmLong(outp, parmSlot, parmOffset); parmSlot += 2; - /* Parameter Displacement */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Data Count */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Data Offset */ - smb_SetSMBParmLong(outp, parmSlot, dataOffset); parmSlot += 2; - /* Data Displacement */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - smb_SetSMBParmByte(outp, parmSlot, 0); /* Setup Count */ - smb_SetSMBDataLength(outp, 70); - - lock_ObtainMutex(&scp->mx); - outData = smb_GetSMBData(outp, NULL); - outData++; /* round to get to parmOffset */ - *outData = 0; outData++; /* oplock */ - *outData = 0; outData++; /* reserved */ - *((USHORT *)outData) = fidp->fid; outData += 2; /* fid */ - *((ULONG *)outData) = openAction; outData += 4; - *((ULONG *)outData) = 0; outData += 4; /* EA error offset */ - smb_LargeSearchTimeFromUnixTime(&ft, scp->clientModTime); - *((FILETIME *)outData) = ft; outData += 8; /* creation time */ - *((FILETIME *)outData) = ft; outData += 8; /* last access time */ - *((FILETIME *)outData) = ft; outData += 8; /* last write time */ - *((FILETIME *)outData) = ft; outData += 8; /* change time */ - *((ULONG *)outData) = smb_ExtAttributes(scp); outData += 4; - *((LARGE_INTEGER *)outData) = scp->length; outData += 8; /* alloc sz */ - *((LARGE_INTEGER *)outData) = scp->length; outData += 8; /* EOF */ - *((USHORT *)outData) = 0; outData += 2; /* filetype */ - *((USHORT *)outData) = 0; outData += 2; /* dev state */ - *((USHORT *)outData) = (scp->fileType == CM_SCACHETYPE_DIRECTORY); - outData += 2; /* is a dir? */ - lock_ReleaseMutex(&scp->mx); - } else { - /* out parms */ - parmOffset = 8*4 + 39; - parmOffset += 1; /* pad to 4 */ - dataOffset = parmOffset + 104; - - parmSlot = 1; - outp->oddByte = 1; - /* Total Parameter Count */ - smb_SetSMBParmLong(outp, parmSlot, 101); parmSlot += 2; - /* Total Data Count */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Parameter Count */ - smb_SetSMBParmLong(outp, parmSlot, 101); parmSlot += 2; - /* Parameter Offset */ - smb_SetSMBParmLong(outp, parmSlot, parmOffset); parmSlot += 2; - /* Parameter Displacement */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Data Count */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Data Offset */ - smb_SetSMBParmLong(outp, parmSlot, dataOffset); parmSlot += 2; - /* Data Displacement */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - smb_SetSMBParmByte(outp, parmSlot, 0); /* Setup Count */ - smb_SetSMBDataLength(outp, 105); - - lock_ObtainMutex(&scp->mx); - outData = smb_GetSMBData(outp, NULL); - outData++; /* round to get to parmOffset */ - *outData = 0; outData++; /* oplock */ - *outData = 1; outData++; /* response type */ - *((USHORT *)outData) = fidp->fid; outData += 2; /* fid */ - *((ULONG *)outData) = openAction; outData += 4; - *((ULONG *)outData) = 0; outData += 4; /* EA error offset */ - smb_LargeSearchTimeFromUnixTime(&ft, scp->clientModTime); - *((FILETIME *)outData) = ft; outData += 8; /* creation time */ - *((FILETIME *)outData) = ft; outData += 8; /* last access time */ - *((FILETIME *)outData) = ft; outData += 8; /* last write time */ - *((FILETIME *)outData) = ft; outData += 8; /* change time */ - *((ULONG *)outData) = smb_ExtAttributes(scp); outData += 4; - *((LARGE_INTEGER *)outData) = scp->length; outData += 8; /* alloc sz */ - *((LARGE_INTEGER *)outData) = scp->length; outData += 8; /* EOF */ - *((USHORT *)outData) = 0; outData += 2; /* filetype */ - *((USHORT *)outData) = 0; outData += 2; /* dev state */ - *((USHORT *)outData) = (scp->fileType == CM_SCACHETYPE_DIRECTORY); - outData += 1; /* is a dir? */ - memset(outData,0,24); outData += 24; /* Volume ID and file ID */ - *((ULONG *)outData) = 0x001f01ffL; outData += 4; /* Maxmimal access rights */ - *((ULONG *)outData) = 0; outData += 4; /* Guest Access rights */ - lock_ReleaseMutex(&scp->mx); - } - - osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid); - - smb_ReleaseFID(fidp); - - cm_ReleaseUser(userp); - - /* free(realPathp); Can't free realPathp here because fidp->NTopen_wholepathp points there */ - /* leave scp held since we put it in fidp->scp */ - return 0; -} - -long smb_ReceiveNTTranNotifyChange(smb_vc_t *vcp, smb_packet_t *inp, - smb_packet_t *outp) -{ - smb_packet_t *savedPacketp; - ULONG filter; USHORT fid, watchtree; - smb_fid_t *fidp; - cm_scache_t *scp; - - filter = smb_GetSMBParm(inp, 19) | - (smb_GetSMBParm(inp, 20) << 16); - fid = smb_GetSMBParm(inp, 21); - watchtree = smb_GetSMBParm(inp, 22) && 0xffff; /* TODO: should this be 0xff ? */ - - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp) { - osi_Log1(smb_logp, "ERROR: NotifyChange given invalid fid [%d]", fid); - return CM_ERROR_BADFD; - } - - savedPacketp = smb_CopyPacket(inp); - smb_HoldVC(vcp); - savedPacketp->vcp = vcp; - lock_ObtainMutex(&smb_Dir_Watch_Lock); - savedPacketp->nextp = smb_Directory_Watches; - smb_Directory_Watches = savedPacketp; - lock_ReleaseMutex(&smb_Dir_Watch_Lock); - - osi_Log4(smb_logp, "Request for NotifyChange filter 0x%x fid %d wtree %d file %s", - filter, fid, watchtree, osi_LogSaveString(smb_logp, fidp->NTopen_wholepathp)); - - scp = fidp->scp; - lock_ObtainMutex(&scp->mx); - if (watchtree) - scp->flags |= CM_SCACHEFLAG_WATCHEDSUBTREE; - else - scp->flags |= CM_SCACHEFLAG_WATCHED; - lock_ReleaseMutex(&scp->mx); - smb_ReleaseFID(fidp); - - outp->flags |= SMB_PACKETFLAG_NOSEND; - return 0; -} - -unsigned char nullSecurityDesc[36] = { - 0x01, /* security descriptor revision */ - 0x00, /* reserved, should be zero */ - 0x00, 0x80, /* security descriptor control; - * 0x8000 : self-relative format */ - 0x14, 0x00, 0x00, 0x00, /* offset of owner SID */ - 0x1c, 0x00, 0x00, 0x00, /* offset of group SID */ - 0x00, 0x00, 0x00, 0x00, /* offset of DACL would go here */ - 0x00, 0x00, 0x00, 0x00, /* offset of SACL would go here */ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* "null SID" owner SID */ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - /* "null SID" group SID */ -}; - -long smb_ReceiveNTTranQuerySecurityDesc(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - int parmOffset, parmCount, dataOffset, dataCount; - int parmSlot; - int maxData; - char *outData; - char *parmp; - USHORT *sparmp; - ULONG *lparmp; - USHORT fid; - ULONG securityInformation; - - parmOffset = smb_GetSMBOffsetParm(inp, 11, 1) - | (smb_GetSMBOffsetParm(inp, 12, 1) << 16); - parmp = inp->data + parmOffset; - sparmp = (USHORT *) parmp; - lparmp = (ULONG *) parmp; - - fid = sparmp[0]; - securityInformation = lparmp[1]; - - maxData = smb_GetSMBOffsetParm(inp, 7, 1) - | (smb_GetSMBOffsetParm(inp, 8, 1) << 16); - - if (maxData < 36) - dataCount = 0; - else - dataCount = 36; - - /* out parms */ - parmOffset = 8*4 + 39; - parmOffset += 1; /* pad to 4 */ - parmCount = 4; - dataOffset = parmOffset + parmCount; - - parmSlot = 1; - outp->oddByte = 1; - /* Total Parameter Count */ - smb_SetSMBParmLong(outp, parmSlot, parmCount); parmSlot += 2; - /* Total Data Count */ - smb_SetSMBParmLong(outp, parmSlot, dataCount); parmSlot += 2; - /* Parameter Count */ - smb_SetSMBParmLong(outp, parmSlot, parmCount); parmSlot += 2; - /* Parameter Offset */ - smb_SetSMBParmLong(outp, parmSlot, parmOffset); parmSlot += 2; - /* Parameter Displacement */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - /* Data Count */ - smb_SetSMBParmLong(outp, parmSlot, dataCount); parmSlot += 2; - /* Data Offset */ - smb_SetSMBParmLong(outp, parmSlot, dataOffset); parmSlot += 2; - /* Data Displacement */ - smb_SetSMBParmLong(outp, parmSlot, 0); parmSlot += 2; - smb_SetSMBParmByte(outp, parmSlot, 0); /* Setup Count */ - smb_SetSMBDataLength(outp, 1 + parmCount + dataCount); - - outData = smb_GetSMBData(outp, NULL); - outData++; /* round to get to parmOffset */ - *((ULONG *)outData) = 36; outData += 4; /* length */ - - if (maxData >= 36) { - memcpy(outData, nullSecurityDesc, 36); - outData += 36; - return 0; - } else - return CM_ERROR_BUFFERTOOSMALL; -} - -long smb_ReceiveNTTransact(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned short function; - - function = smb_GetSMBParm(inp, 18); - - osi_Log1(smb_logp, "SMB NT Transact function %d", function); - - /* We can handle long names */ - if (vcp->flags & SMB_VCFLAG_USENT) - ((smb_t *)outp)->flg2 |= SMB_FLAGS2_IS_LONG_NAME; - - switch (function) { - case 6: - return smb_ReceiveNTTranQuerySecurityDesc(vcp, inp, outp); - case 4: - return smb_ReceiveNTTranNotifyChange(vcp, inp, outp); - case 1: - return smb_ReceiveNTTranCreate(vcp, inp, outp); - default: - return CM_ERROR_INVAL; - } -} - -/* - * smb_NotifyChange -- find relevant change notification messages and - * reply to them - * - * If we don't know the file name (i.e. a callback break), filename is - * NULL, and we return a zero-length list. - */ -void smb_NotifyChange(DWORD action, DWORD notifyFilter, - cm_scache_t *dscp, char *filename, char *otherFilename, - BOOL isDirectParent) -{ - smb_packet_t *watch, *lastWatch, *nextWatch; - ULONG parmSlot, parmCount, parmOffset, dataOffset, nameLen; - char *outData, *oldOutData; - ULONG filter; - USHORT fid, wtree; - ULONG maxLen; - BOOL twoEntries = FALSE; - ULONG otherNameLen, oldParmCount = 0; - DWORD otherAction; - smb_vc_t *vcp; - smb_fid_t *fidp; - - /* Get ready for rename within directory */ - if (action == FILE_ACTION_RENAMED_OLD_NAME && otherFilename != NULL) { - twoEntries = TRUE; - otherAction = FILE_ACTION_RENAMED_NEW_NAME; - } - - osi_Log2(smb_logp,"in smb_NotifyChange for file [%s] dscp [%x]", - osi_LogSaveString(smb_logp,filename),dscp); - - lock_ObtainMutex(&smb_Dir_Watch_Lock); - watch = smb_Directory_Watches; - while (watch) { - filter = smb_GetSMBParm(watch, 19) - | (smb_GetSMBParm(watch, 20) << 16); - fid = smb_GetSMBParm(watch, 21); - wtree = smb_GetSMBParm(watch, 22) & 0xffff; /* TODO: should this be 0xff ? */ - maxLen = smb_GetSMBOffsetParm(watch, 5, 1) - | (smb_GetSMBOffsetParm(watch, 6, 1) << 16); - vcp = watch->vcp; - - /* - * Strange hack - bug in NT Client and NT Server that we - * must emulate? - */ - if (filter == 3 && wtree) - filter = 0x17; - - fidp = smb_FindFID(vcp, fid, 0); - if (!fidp) { - osi_Log1(smb_logp," no fidp for fid[%d]",fid); - lastWatch = watch; - watch = watch->nextp; - continue; - } - if (fidp->scp != dscp - || (filter & notifyFilter) == 0 - || (!isDirectParent && !wtree)) { - osi_Log1(smb_logp," passing fidp->scp[%x]", fidp->scp); - smb_ReleaseFID(fidp); - lastWatch = watch; - watch = watch->nextp; - continue; - } - smb_ReleaseFID(fidp); - - osi_Log4(smb_logp, - "Sending Change Notification for fid %d filter 0x%x wtree %d file %s", - fid, filter, wtree, osi_LogSaveString(smb_logp, filename)); - - nextWatch = watch->nextp; - if (watch == smb_Directory_Watches) - smb_Directory_Watches = nextWatch; - else - lastWatch->nextp = nextWatch; - - /* Turn off WATCHED flag in dscp */ - lock_ObtainMutex(&dscp->mx); - if (wtree) - dscp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE; - else - dscp->flags &= ~CM_SCACHEFLAG_WATCHED; - lock_ReleaseMutex(&dscp->mx); - - /* Convert to response packet */ - ((smb_t *) watch)->reb = SMB_FLAGS_SERVER_TO_CLIENT | SMB_FLAGS_CANONICAL_PATHNAMES; - ((smb_t *) watch)->wct = 0; - - /* out parms */ - if (filename == NULL) - parmCount = 0; - else { - nameLen = strlen(filename); - parmCount = 3*4 + nameLen*2; - parmCount = (parmCount + 3) & ~3; /* pad to 4 */ - if (twoEntries) { - otherNameLen = strlen(otherFilename); - oldParmCount = parmCount; - parmCount += 3*4 + otherNameLen*2; - parmCount = (parmCount + 3) & ~3; /* pad to 4 */ - } - if (maxLen < parmCount) - parmCount = 0; /* not enough room */ - } - parmOffset = 8*4 + 39; - parmOffset += 1; /* pad to 4 */ - dataOffset = parmOffset + parmCount; - - parmSlot = 1; - watch->oddByte = 1; - /* Total Parameter Count */ - smb_SetSMBParmLong(watch, parmSlot, parmCount); parmSlot += 2; - /* Total Data Count */ - smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2; - /* Parameter Count */ - smb_SetSMBParmLong(watch, parmSlot, parmCount); parmSlot += 2; - /* Parameter Offset */ - smb_SetSMBParmLong(watch, parmSlot, parmOffset); parmSlot += 2; - /* Parameter Displacement */ - smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2; - /* Data Count */ - smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2; - /* Data Offset */ - smb_SetSMBParmLong(watch, parmSlot, dataOffset); parmSlot += 2; - /* Data Displacement */ - smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2; - smb_SetSMBParmByte(watch, parmSlot, 0); /* Setup Count */ - smb_SetSMBDataLength(watch, parmCount + 1); - - if (parmCount != 0) { - char * p; - outData = smb_GetSMBData(watch, NULL); - outData++; /* round to get to parmOffset */ - oldOutData = outData; - *((DWORD *)outData) = oldParmCount; outData += 4; - /* Next Entry Offset */ - *((DWORD *)outData) = action; outData += 4; - /* Action */ - *((DWORD *)outData) = nameLen*2; outData += 4; - /* File Name Length */ - p = strdup(filename); - if (smb_StoreAnsiFilenames) - CharToOem(p,p); - mbstowcs((WCHAR *)outData, p, nameLen); - free(p); - /* File Name */ - if (twoEntries) { - outData = oldOutData + oldParmCount; - *((DWORD *)outData) = 0; outData += 4; - /* Next Entry Offset */ - *((DWORD *)outData) = otherAction; outData += 4; - /* Action */ - *((DWORD *)outData) = otherNameLen*2; - outData += 4; /* File Name Length */ - p = strdup(otherFilename); - if (smb_StoreAnsiFilenames) - CharToOem(p,p); - mbstowcs((WCHAR *)outData, p, otherNameLen); /* File Name */ - free(p); - } - } - - /* - * If filename is null, we don't know the cause of the - * change notification. We return zero data (see above), - * and set error code to NT_STATUS_NOTIFY_ENUM_DIR - * (= 0x010C). We set the error code here by hand, without - * modifying wct and bcc. - */ - if (filename == NULL) { - ((smb_t *) watch)->rcls = 0x0C; - ((smb_t *) watch)->reh = 0x01; - ((smb_t *) watch)->errLow = 0; - ((smb_t *) watch)->errHigh = 0; - /* Set NT Status codes flag */ - ((smb_t *) watch)->flg2 |= SMB_FLAGS2_32BIT_STATUS; - } - - smb_SendPacket(vcp, watch); - smb_FreePacket(watch); - watch = nextWatch; - } - lock_ReleaseMutex(&smb_Dir_Watch_Lock); -} - -long smb_ReceiveNTCancel(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - unsigned char *replyWctp; - smb_packet_t *watch, *lastWatch; - USHORT fid, watchtree; - smb_fid_t *fidp; - cm_scache_t *scp; - - osi_Log0(smb_logp, "SMB3 receive NT cancel"); - - lock_ObtainMutex(&smb_Dir_Watch_Lock); - watch = smb_Directory_Watches; - while (watch) { - if (((smb_t *)watch)->uid == ((smb_t *)inp)->uid - && ((smb_t *)watch)->pid == ((smb_t *)inp)->pid - && ((smb_t *)watch)->mid == ((smb_t *)inp)->mid - && ((smb_t *)watch)->tid == ((smb_t *)inp)->tid) { - if (watch == smb_Directory_Watches) - smb_Directory_Watches = watch->nextp; - else - lastWatch->nextp = watch->nextp; - lock_ReleaseMutex(&smb_Dir_Watch_Lock); - - /* Turn off WATCHED flag in scp */ - fid = smb_GetSMBParm(watch, 21); - watchtree = smb_GetSMBParm(watch, 22) & 0xffff; - - if (vcp != watch->vcp) - osi_Log2(smb_logp, "smb_ReceiveNTCancel: vcp %x not equal to watch vcp %x", - vcp, watch->vcp); - - fidp = smb_FindFID(vcp, fid, 0); - if (fidp) { - osi_Log3(smb_logp, "Cancelling change notification for fid %d wtree %d file %s", - fid, watchtree, - osi_LogSaveString(smb_logp, (fidp)?fidp->NTopen_wholepathp:"")); - - scp = fidp->scp; - lock_ObtainMutex(&scp->mx); - if (watchtree) - scp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE; - else - scp->flags &= ~CM_SCACHEFLAG_WATCHED; - lock_ReleaseMutex(&scp->mx); - smb_ReleaseFID(fidp); - } else { - osi_Log2(smb_logp,"NTCancel unable to resolve fid [%d] in vcp[%x]", fid,vcp); - } - - /* assume STATUS32; return 0xC0000120 (CANCELED) */ - replyWctp = watch->wctp; - *replyWctp++ = 0; - *replyWctp++ = 0; - *replyWctp++ = 0; - ((smb_t *)watch)->rcls = 0x20; - ((smb_t *)watch)->reh = 0x1; - ((smb_t *)watch)->errLow = 0; - ((smb_t *)watch)->errHigh = 0xC0; - ((smb_t *)watch)->flg2 |= SMB_FLAGS2_32BIT_STATUS; - smb_SendPacket(vcp, watch); - smb_FreePacket(watch); - return 0; - } - lastWatch = watch; - watch = watch->nextp; - } - lock_ReleaseMutex(&smb_Dir_Watch_Lock); - - return 0; -} - -/* - * NT rename also does hard links. - */ - -#define RENAME_FLAG_MOVE_CLUSTER_INFORMATION 0x102 -#define RENAME_FLAG_HARD_LINK 0x103 -#define RENAME_FLAG_RENAME 0x104 -#define RENAME_FLAG_COPY 0x105 - -long smb_ReceiveNTRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - char *oldPathp, *newPathp; - long code = 0; - char * tp; - int attrs; - int rename_type; - - attrs = smb_GetSMBParm(inp, 0); - rename_type = smb_GetSMBParm(inp, 1); - - if (rename_type != RENAME_FLAG_RENAME && rename_type != RENAME_FLAG_HARD_LINK) { - osi_Log1(smb_logp, "NTRename invalid infolevel [%x]", rename_type); - return CM_ERROR_NOACCESS; - } - - tp = smb_GetSMBData(inp, NULL); - oldPathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(oldPathp,oldPathp); - newPathp = smb_ParseASCIIBlock(tp, &tp); - if (smb_StoreAnsiFilenames) - OemToChar(newPathp,newPathp); - - osi_Log3(smb_logp, "NTRename for [%s]->[%s] type [%s]", - osi_LogSaveString(smb_logp, oldPathp), - osi_LogSaveString(smb_logp, newPathp), - ((rename_type==RENAME_FLAG_RENAME)?"rename":"hardlink")); - - if (rename_type == RENAME_FLAG_RENAME) { - code = smb_Rename(vcp,inp,oldPathp,newPathp,attrs); - } else { /* RENAME_FLAG_HARD_LINK */ - code = smb_Link(vcp,inp,oldPathp,newPathp); - } - return code; -} - -void smb3_Init() -{ - lock_InitializeMutex(&smb_Dir_Watch_Lock, "Directory Watch List Lock"); -} - -cm_user_t *smb_FindCMUserByName(/*smb_vc_t *vcp,*/ char *usern, char *machine) -{ - /*int newUid;*/ - smb_username_t *unp; - - unp = smb_FindUserByName(usern, machine, SMB_FLAG_CREATE); - if (!unp->userp) { - lock_ObtainMutex(&unp->mx); - unp->userp = cm_NewUser(); - lock_ReleaseMutex(&unp->mx); - osi_Log2(smb_logp,"smb_FindCMUserByName New user name[%s] machine[%s]",osi_LogSaveString(smb_logp,usern),osi_LogSaveString(smb_logp,machine)); - osi_LogEvent("AFS smb_FindCMUserByName : New User",NULL,"name[%s] machine[%s]",usern,machine); - } else { - osi_Log2(smb_logp,"smb_FindCMUserByName Not found name[%s] machine[%s]",osi_LogSaveString(smb_logp,usern),osi_LogSaveString(smb_logp,machine)); - osi_LogEvent("AFS smb_FindCMUserByName : Found",NULL,"name[%s] machine[%s]",usern,machine); - } - return unp->userp; -} - diff --git a/src/WINNT/afsd/smb3.h b/src/WINNT/afsd/smb3.h deleted file mode 100644 index c9b5ac443..000000000 --- a/src/WINNT/afsd/smb3.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __SMB3_H_ENV__ -#define __SMB3_H_ENV__ 1 - -typedef struct smb_tran2Packet { - osi_queue_t q; /* queue of all packets */ - int com; /* Trans or Trans2 (0x25 or 0x32) */ - int totalData; /* total # of expected data bytes */ - int totalParms; /* total # of expected parm bytes */ - int oldTotalParms; /* initial estimate of parm bytes */ - int curData; /* current # of received data bytes */ - int curParms; /* current # of received parm bytes */ - int maxReturnData; /* max # of returned data bytes */ - int maxReturnParms; /* max # of returned parm bytes */ - int opcode; /* subopcode we're handling */ - long flags; /* flags */ - smb_vc_t *vcp; /* virtual circuit we're dealing with */ - unsigned short tid; /* tid to match */ - unsigned short mid; /* mid to match */ - unsigned short pid; /* pid to remember */ - unsigned short uid; /* uid to remember */ - unsigned short res[6]; /* contains PidHigh */ - unsigned short *parmsp; /* parms */ - unsigned char *datap; /* data bytes */ -} smb_tran2Packet_t; - -/* for flags field */ -#define SMB_TRAN2PFLAG_ALLOC 1 - -typedef struct smb_tran2Dispatch { - long (*procp)(smb_vc_t *, smb_tran2Packet_t *, smb_packet_t *); - long flags; -} smb_tran2Dispatch_t; - -typedef struct smb_tran2QFSInfo { - union { -#pragma pack(push, 2) - struct { - long FSID; /* file system ID */ - long sectorsPerAllocUnit; - long totalAllocUnits; /* on the disk */ - long availAllocUnits; /* free blocks */ - unsigned short bytesPerSector; /* bytes per sector */ - } allocInfo; -#pragma pack(pop) - struct { - long vsn; /* volume serial number */ - char vnCount; /* count of chars in label, incl null */ - char label[12]; /* pad out with nulls */ - } volumeInfo; - struct { - FILETIME vct; /* volume creation time */ - long vsn; /* volume serial number */ - long vnCount; /* length of volume label in bytes */ - char res[2]; /* reserved */ - char label[10]; /* volume label */ - } FSvolumeInfo; - struct { - osi_hyper_t totalAllocUnits; /* on the disk */ - osi_hyper_t availAllocUnits; /* free blocks */ - long sectorsPerAllocUnit; - long bytesPerSector; /* bytes per sector */ - } FSsizeInfo; - struct { - long devType; /* device type */ - long characteristics; - } FSdeviceInfo; - struct { - long attributes; - long maxCompLength; /* max path component length */ - long FSnameLength; /* length of file system name */ - char FSname[12]; - } FSattributeInfo; - } u; -} smb_tran2QFSInfo_t; - -/* more than enough opcodes for today, anyway */ -#define SMB_TRAN2_NOPCODES 20 - -extern smb_tran2Dispatch_t smb_tran2DispatchTable[SMB_TRAN2_NOPCODES]; - -#define SMB_RAP_NOPCODES 64 - -extern smb_tran2Dispatch_t smb_rapDispatchTable[SMB_RAP_NOPCODES]; - -extern long smb_ReceiveV3SessionSetupX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3Trans(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3Tran2A(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveRAPNetShareEnum(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op); - -extern long smb_ReceiveRAPNetShareGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op); - -extern long smb_ReceiveRAPNetWkstaGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op); - -extern long smb_ReceiveRAPNetServerGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op); - -extern long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2FindFirst(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2FindNext(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2QFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2SetFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2QFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2SetFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2FSCTL(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2IOCTL(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2FindNotifyFirst(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2FindNotifyNext(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2CreateDirectory(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2SessionSetup(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveTran2ReportDFSInconsistency(smb_vc_t *vcp, smb_tran2Packet_t *p, - smb_packet_t *outp); - -extern long smb_ReceiveV3FindClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3FindNotifyClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3GetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3ReadX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveV3SetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveNTTransact(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern void smb_NotifyChange(DWORD action, DWORD notifyFilter, - cm_scache_t *dscp, char *filename, char *otherFilename, - BOOL isDirectParent); - -extern long smb_ReceiveNTCancel(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_ReceiveNTRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern int smb_V3MatchMask(char *namep, char *maskp, int flags); - -extern void smb3_Init(); -extern cm_user_t *smb_FindCMUserByName(/*smb_vc_t *vcp,*/ char *usern, char *machine); - -/* SMB auth related functions */ -extern void smb_NegotiateExtendedSecurity(void ** secBlob, int * secBlobLength); - -#ifdef DJGPP -#define DELETE (0x00010000) -#define READ_CONTROL (0x00020000) -#define SYNCHRONIZE (0x00100000) -#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) -#define FILE_GENERIC_READ (0x00120089) -#define FILE_GENERIC_WRITE (0x00120116) -#define FILE_GENERIC_EXECUTE (0x001200a0) -#endif /* DJGPP */ - -#endif /* __SMB3_H_ENV__ */ diff --git a/src/WINNT/afsd/smb_iocons.h b/src/WINNT/afsd/smb_iocons.h deleted file mode 100644 index 9e98567a5..000000000 --- a/src/WINNT/afsd/smb_iocons.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __SMB_IOCONS_H_ENV_ -#define __SMB_IOCONS_H_ENV_ 1 - -/* included in both AFSD and fs commands */ - -typedef struct chservinfo { - int magic; - char tbuffer[128]; - int tsize; - long tinterval; - long tflags; -} chservinfo_t; - -struct gaginfo { - unsigned long showflags, logflags, logwritethruflag, spare[3]; - unsigned char spare2[128]; -}; - -#define GAGUSER 1 -#define GAGCONSOLE 2 - -struct ClearToken { - int AuthHandle; - char HandShakeKey[8]; - int ViceId; - int BeginTimestamp; - int EndTimestamp; -}; - -struct sbstruct { - int sb_thisfile; - int sb_default; -}; - -#define CM_IOCTLCACHEPARMS 16 -typedef struct cm_cacheParms { - long parms[CM_IOCTLCACHEPARMS]; -} cm_cacheParms_t; - -/* set cell flags */ -#define CM_SETCELLFLAG_SUID 2 - -#define VIOC_FILE_CELL_NAME 0x1 -#define VIOCGETAL 0x2 -#define VIOCSETAL 0x3 -#define VIOC_FLUSHVOLUME 0x4 -#define VIOCFLUSH 0x5 -#define VIOCSETVOLSTAT 0x6 -#define VIOCGETVOLSTAT 0x7 -#define VIOCWHEREIS 0x8 -#define VIOC_AFS_STAT_MT_PT 0x9 -#define VIOC_AFS_DELETE_MT_PT 0xa -#define VIOCCKSERV 0xb -#define VIOC_GAG 0xc -#define VIOCCKBACK 0xd -#define VIOCSETCACHESIZE 0xe -#define VIOCGETCACHEPARMS 0xf -#define VIOCGETCELL 0x10 -#define VIOCNEWCELL 0x11 -#define VIOC_GET_WS_CELL 0x12 -#define VIOC_AFS_MARINER_HOST 0x13 -#define VIOC_AFS_SYSNAME 0x14 -#define VIOC_EXPORTAFS 0x15 -#define VIOC_GETCELLSTATUS 0x16 -#define VIOC_SETCELLSTATUS 0x17 -#define VIOC_SETSPREFS 0x18 -#define VIOC_GETSPREFS 0x19 -#define VIOC_STOREBEHIND 0x1a -#define VIOC_AFS_CREATE_MT_PT 0x1b -#define VIOC_TRACECTL 0x1c -#define VIOCSETTOK 0x1d -#define VIOCGETTOK 0x1e -#define VIOCNEWGETTOK 0x1f -#define VIOCDELTOK 0x20 -#define VIOCDELALLTOK 0x21 -#define VIOC_ISSYMLINK 0x22 -#define VIOC_SYMLINK 0x23 -#define VIOC_LISTSYMLINK 0x24 -#define VIOC_DELSYMLINK 0x25 -#define VIOC_MAKESUBMOUNT 0x26 -#define VIOC_GETRXKCRYPT 0x27 -#define VIOC_SETRXKCRYPT 0x28 -#define VIOC_TRACEMEMDUMP 0x29 -#define VIOC_SHUTDOWN 0x2a -#endif /* __SMB_IOCONS_H_ENV_ */ diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c deleted file mode 100644 index 2bfebde51..000000000 --- a/src/WINNT/afsd/smb_ioctl.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#ifndef DJGPP -#include -#endif /* !DJGPP */ -#include -#include -#include -#include -#include - -#include - -#include "afsd.h" - -#include "smb.h" - -smb_ioctlProc_t *smb_ioctlProcsp[SMB_IOCTL_MAXPROCS]; - -/*extern unsigned char smb_LANadapter;*/ - -void smb_InitIoctl(void) -{ - smb_ioctlProcsp[VIOCGETAL] = cm_IoctlGetACL; - smb_ioctlProcsp[VIOC_FILE_CELL_NAME] = cm_IoctlGetFileCellName; - smb_ioctlProcsp[VIOCSETAL] = cm_IoctlSetACL; - smb_ioctlProcsp[VIOC_FLUSHVOLUME] = cm_IoctlFlushVolume; - smb_ioctlProcsp[VIOCFLUSH] = cm_IoctlFlushFile; - smb_ioctlProcsp[VIOCSETVOLSTAT] = cm_IoctlSetVolumeStatus; - smb_ioctlProcsp[VIOCGETVOLSTAT] = cm_IoctlGetVolumeStatus; - smb_ioctlProcsp[VIOCWHEREIS] = cm_IoctlWhereIs; - smb_ioctlProcsp[VIOC_AFS_STAT_MT_PT] = cm_IoctlStatMountPoint; - smb_ioctlProcsp[VIOC_AFS_DELETE_MT_PT] = cm_IoctlDeleteMountPoint; - smb_ioctlProcsp[VIOCCKSERV] = cm_IoctlCheckServers; - smb_ioctlProcsp[VIOC_GAG] = cm_IoctlGag; - smb_ioctlProcsp[VIOCCKBACK] = cm_IoctlCheckVolumes; - smb_ioctlProcsp[VIOCSETCACHESIZE] = cm_IoctlSetCacheSize; - smb_ioctlProcsp[VIOCGETCACHEPARMS] = cm_IoctlGetCacheParms; - smb_ioctlProcsp[VIOCGETCELL] = cm_IoctlGetCell; - smb_ioctlProcsp[VIOCNEWCELL] = cm_IoctlNewCell; - smb_ioctlProcsp[VIOC_GET_WS_CELL] = cm_IoctlGetWsCell; - smb_ioctlProcsp[VIOC_AFS_SYSNAME] = cm_IoctlSysName; - smb_ioctlProcsp[VIOC_GETCELLSTATUS] = cm_IoctlGetCellStatus; - smb_ioctlProcsp[VIOC_SETCELLSTATUS] = cm_IoctlSetCellStatus; - smb_ioctlProcsp[VIOC_SETSPREFS] = cm_IoctlSetSPrefs; - smb_ioctlProcsp[VIOC_GETSPREFS] = cm_IoctlGetSPrefs; - smb_ioctlProcsp[VIOC_STOREBEHIND] = cm_IoctlStoreBehind; - smb_ioctlProcsp[VIOC_AFS_CREATE_MT_PT] = cm_IoctlCreateMountPoint; - smb_ioctlProcsp[VIOC_TRACECTL] = cm_IoctlTraceControl; - smb_ioctlProcsp[VIOCSETTOK] = cm_IoctlSetToken; - smb_ioctlProcsp[VIOCGETTOK] = cm_IoctlGetTokenIter; - smb_ioctlProcsp[VIOCNEWGETTOK] = cm_IoctlGetToken; - smb_ioctlProcsp[VIOCDELTOK] = cm_IoctlDelToken; - smb_ioctlProcsp[VIOCDELALLTOK] = cm_IoctlDelAllToken; - smb_ioctlProcsp[VIOC_SYMLINK] = cm_IoctlSymlink; - smb_ioctlProcsp[VIOC_LISTSYMLINK] = cm_IoctlListlink; - smb_ioctlProcsp[VIOC_DELSYMLINK] = cm_IoctlDeletelink; - smb_ioctlProcsp[VIOC_MAKESUBMOUNT] = cm_IoctlMakeSubmount; - smb_ioctlProcsp[VIOC_GETRXKCRYPT] = cm_IoctlGetRxkcrypt; - smb_ioctlProcsp[VIOC_SETRXKCRYPT] = cm_IoctlSetRxkcrypt; - smb_ioctlProcsp[VIOC_ISSYMLINK] = cm_IoctlIslink; -#ifdef DJGPP - smb_ioctlProcsp[VIOC_SHUTDOWN] = cm_IoctlShutdown; -#endif - smb_ioctlProcsp[VIOC_TRACEMEMDUMP] = cm_IoctlMemoryDump; - smb_ioctlProcsp[VIOC_ISSYMLINK] = cm_IoctlIslink; -} - -/* called to make a fid structure into an IOCTL fid structure */ -void smb_SetupIoctlFid(smb_fid_t *fidp, cm_space_t *prefix) -{ - smb_ioctl_t *iop; - cm_space_t *copyPrefix; - - lock_ObtainMutex(&fidp->mx); - fidp->flags |= SMB_FID_IOCTL; - fidp->scp = &cm_data.fakeSCache; - cm_HoldSCache(fidp->scp); - if (fidp->ioctlp == NULL) { - iop = malloc(sizeof(*iop)); - memset(iop, 0, sizeof(*iop)); - fidp->ioctlp = iop; - iop->fidp = fidp; - } - if (prefix) { - copyPrefix = cm_GetSpace(); - strcpy(copyPrefix->data, prefix->data); - fidp->ioctlp->prefix = copyPrefix; - } - lock_ReleaseMutex(&fidp->mx); -} - -/* called when we receive a read call, does the send of the received data if - * this is the first read call. This is the function that actually makes the - * call to the ioctl code. - */ -smb_IoctlPrepareRead(smb_fid_t *fidp, smb_ioctl_t *ioctlp, cm_user_t *userp) -{ - long opcode; - smb_ioctlProc_t *procp; - long code; - - if (ioctlp->flags & SMB_IOCTLFLAG_DATAIN) { - ioctlp->flags &= ~SMB_IOCTLFLAG_DATAIN; - - /* do the call now, or fail if we didn't get an opcode, or - * enough of an opcode. - */ - if (ioctlp->inCopied < sizeof(long)) - return CM_ERROR_INVAL; - memcpy(&opcode, ioctlp->inDatap, sizeof(long)); - ioctlp->inDatap += sizeof(long); - - osi_Log1(afsd_logp, "Ioctl opcode 0x%x", opcode); - - /* check for opcode out of bounds */ - if (opcode < 0 || opcode >= SMB_IOCTL_MAXPROCS) - return CM_ERROR_TOOBIG; - - /* check for no such proc */ - procp = smb_ioctlProcsp[opcode]; - if (procp == NULL) - return CM_ERROR_BADOP; - - /* otherwise, make the call */ - ioctlp->outDatap += sizeof(long); /* reserve room for return code */ - code = (*procp)(ioctlp, userp); - - osi_Log1(afsd_logp, "Ioctl return code 0x%x", code); - - /* copy in return code */ - memcpy(ioctlp->outAllocp, &code, sizeof(long)); - } - return 0; -} - -/* called when we receive a write call. If this is the first write call after - * a series of reads (or the very first call), then we start a new call. - * We also ensure that things are properly initialized for the start of a call. - */ -void smb_IoctlPrepareWrite(smb_fid_t *fidp, smb_ioctl_t *ioctlp) -{ - /* make sure the buffer(s) are allocated */ - if (!ioctlp->inAllocp) ioctlp->inAllocp = malloc(SMB_IOCTL_MAXDATA); - if (!ioctlp->outAllocp) ioctlp->outAllocp = malloc(SMB_IOCTL_MAXDATA); - - /* Fixes fs la problem. We do a StrToOEM later and if this data isn't initialized we get memory issues. */ - (void) memset(ioctlp->inAllocp, 0, SMB_IOCTL_MAXDATA); - (void) memset(ioctlp->outAllocp, 0, SMB_IOCTL_MAXDATA); - - /* and make sure that we've reset our state for the new incoming request */ - if (!(ioctlp->flags & SMB_IOCTLFLAG_DATAIN)) { - ioctlp->inCopied = 0; - ioctlp->outCopied = 0; - ioctlp->inDatap = ioctlp->inAllocp; - ioctlp->outDatap = ioctlp->outAllocp; - ioctlp->flags |= SMB_IOCTLFLAG_DATAIN; - } -} - -/* called from smb_ReceiveCoreRead when we receive a read on the ioctl fid */ -long smb_IoctlRead(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, - smb_packet_t *outp) -{ - smb_ioctl_t *iop; - long count; - long leftToCopy; - char *op; - long code; - cm_user_t *userp; - - iop = fidp->ioctlp; - count = smb_GetSMBParm(inp, 1); - userp = smb_GetUser(vcp, inp); - - /* Identify tree */ - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &iop->tidPathp); - if(code) { - cm_ReleaseUser(userp); - return CM_ERROR_NOSUCHPATH; - } - - /* turn the connection around, if required */ - code = smb_IoctlPrepareRead(fidp, iop, userp); - - if (code) { - cm_ReleaseUser(userp); - return code; - } - - leftToCopy = (iop->outDatap - iop->outAllocp) - iop->outCopied; - if (count > leftToCopy) count = leftToCopy; - - /* now set the parms for a read of count bytes */ - smb_SetSMBParm(outp, 0, count); - smb_SetSMBParm(outp, 1, 0); - smb_SetSMBParm(outp, 2, 0); - smb_SetSMBParm(outp, 3, 0); - smb_SetSMBParm(outp, 4, 0); - - smb_SetSMBDataLength(outp, count+3); - - op = smb_GetSMBData(outp, NULL); - *op++ = 1; - *op++ = (char)(count & 0xff); - *op++ = (char)((count >> 8) & 0xff); - - /* now copy the data into the response packet */ - memcpy(op, iop->outCopied + iop->outAllocp, count); - - /* and adjust the counters */ - iop->outCopied += count; - - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - - return 0; -} - -/* called from smb_ReceiveCoreWrite when we receive a write call on the IOCTL - * file descriptor. - */ -long smb_IoctlWrite(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_ioctl_t *iop; - long count; - long code; - char *op; - int inDataBlockCount; - - code = 0; - count = smb_GetSMBParm(inp, 1); - iop = fidp->ioctlp; - - smb_IoctlPrepareWrite(fidp, iop); - - op = smb_GetSMBData(inp, NULL); - op = smb_ParseDataBlock(op, NULL, &inDataBlockCount); - - if (count + iop->inCopied > SMB_IOCTL_MAXDATA) { - code = CM_ERROR_TOOBIG; - goto done; - } - - /* copy data */ - memcpy(iop->inDatap + iop->inCopied, op, count); - - /* adjust counts */ - iop->inCopied += count; - -done: - /* return # of bytes written */ - if (code == 0) { - smb_SetSMBParm(outp, 0, count); - smb_SetSMBDataLength(outp, 0); - } - - smb_ReleaseFID(fidp); - return code; -} - -/* called from V3 read to handle IOCTL descriptor reads */ -long smb_IoctlV3Read(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) -{ - smb_ioctl_t *iop; - long count; - long code; - long leftToCopy; - char *op; - cm_user_t *userp; - smb_user_t *uidp; - - iop = fidp->ioctlp; - count = smb_GetSMBParm(inp, 5); - - userp = smb_GetUser(vcp, inp); - osi_assert(userp != 0); - - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - iop->uidp = uidp; - if (uidp && uidp->unp) - osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", - uidp->userID, userp, - osi_LogSaveString(afsd_logp, uidp->unp->name)); - else { - if (uidp) - osi_Log2(afsd_logp, "Ioctl uid %d user %x no name", - uidp->userID, userp); - else - osi_Log1(afsd_logp, "Ioctl no uid user %x no name", - userp); - } - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &iop->tidPathp); - if(code) { - smb_ReleaseUID(uidp); - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - return CM_ERROR_NOSUCHPATH; - } - - code = smb_IoctlPrepareRead(fidp, iop, userp); - if (uidp) { - iop->uidp = 0; - smb_ReleaseUID(uidp); - } - if (code) { - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - return code; - } - - leftToCopy = (iop->outDatap - iop->outAllocp) - iop->outCopied; - if (count > leftToCopy) count = leftToCopy; - - /* 0 and 1 are reserved for request chaining, were setup by our caller, - * and will be further filled in after we return. - */ - smb_SetSMBParm(outp, 2, 0); /* remaining bytes, for pipes */ - smb_SetSMBParm(outp, 3, 0); /* resvd */ - smb_SetSMBParm(outp, 4, 0); /* resvd */ - smb_SetSMBParm(outp, 5, count); /* # of bytes we're going to read */ - /* fill in #6 when we have all the parameters' space reserved */ - smb_SetSMBParm(outp, 7, 0); /* resv'd */ - smb_SetSMBParm(outp, 8, 0); /* resv'd */ - smb_SetSMBParm(outp, 9, 0); /* resv'd */ - smb_SetSMBParm(outp, 10, 0); /* resv'd */ - smb_SetSMBParm(outp, 11, 0); /* reserved */ - - /* get op ptr after putting in the last parm, since otherwise we don't - * know where the data really is. - */ - op = smb_GetSMBData(outp, NULL); - - /* now fill in offset from start of SMB header to first data byte (to op) */ - smb_SetSMBParm(outp, 6, ((int) (op - outp->data))); - - /* set the packet data length the count of the # of bytes */ - smb_SetSMBDataLength(outp, count); - - /* now copy the data into the response packet */ - memcpy(op, iop->outCopied + iop->outAllocp, count); - - /* and adjust the counters */ - iop->outCopied += count; - - /* and cleanup things */ - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - - return 0; -} - -/* called from Read Raw to handle IOCTL descriptor reads */ -long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, - smb_packet_t *outp -#ifdef DJGPP -, dos_ptr rawBuf -#endif /* DJGPP */ -) -{ - smb_ioctl_t *iop; - long leftToCopy; - NCB *ncbp; - long code; - cm_user_t *userp; -#ifdef DJGPP - dos_ptr dos_ncb; - - if (rawBuf == 0) - { - osi_Log0(afsd_logp, "Failed to get raw buf for smb_IoctlReadRaw"); - return -1; - } -#endif /* DJGPP */ - - iop = fidp->ioctlp; - - userp = smb_GetUser(vcp, inp); - - { - smb_user_t *uidp; - - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - if (uidp && uidp->unp) - osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", - uidp->userID, userp, - osi_LogSaveString(afsd_logp, uidp->unp->name)); - else if (uidp) - osi_Log2(afsd_logp, "Ioctl uid %d user %x no name", - uidp->userID, userp); - else - osi_Log1(afsd_logp, "Ioctl no uid user %x no name", - userp); - if (uidp) smb_ReleaseUID(uidp); - } - - code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &iop->tidPathp); - if(code) { - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - return CM_ERROR_NOSUCHPATH; - } - - code = smb_IoctlPrepareRead(fidp, iop, userp); - if (code) { - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - return code; - } - - leftToCopy = (iop->outDatap - iop->outAllocp) - iop->outCopied; - - ncbp = outp->ncbp; - memset((char *)ncbp, 0, sizeof(NCB)); - - ncbp->ncb_length = (unsigned short) leftToCopy; - ncbp->ncb_lsn = (unsigned char) vcp->lsn; - ncbp->ncb_command = NCBSEND; - /*ncbp->ncb_lana_num = smb_LANadapter;*/ - ncbp->ncb_lana_num = vcp->lana; - -#ifndef DJGPP - ncbp->ncb_buffer = iop->outCopied + iop->outAllocp; - code = Netbios(ncbp); -#else /* DJGPP */ - dosmemput(iop->outCopied + iop->outAllocp, ncbp->ncb_length, rawBuf); - ncbp->ncb_buffer = rawBuf; - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; - code = Netbios(ncbp, dos_ncb); -#endif /* !DJGPP */ - - if (code != 0) - osi_Log1(afsd_logp, "ReadRaw send failure code %d", code); - - cm_ReleaseUser(userp); - smb_ReleaseFID(fidp); - - return 0; -} diff --git a/src/WINNT/afsd/smb_ioctl.h b/src/WINNT/afsd/smb_ioctl.h deleted file mode 100644 index bce9e849a..000000000 --- a/src/WINNT/afsd/smb_ioctl.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __SMB_IOCTL_H_ENV__ -#define __SMB_IOCTL_H_ENV__ 1 - -/* magic file name for ioctl opens */ -#define SMB_IOCTL_FILENAME "\\_._AFS_IOCTL_._" /* double backslashes for C compiler */ -#define SMB_IOCTL_FILENAME_NOSLASH "_._AFS_IOCTL_._" - -/* max parms for ioctl, in either direction */ -#define SMB_IOCTL_MAXDATA 8192 - -#define SMB_IOCTL_MAXPROCS 64 /* max # of calls */ - -/* procedure implementing an ioctl */ -typedef long (smb_ioctlProc_t)(smb_ioctl_t *, struct cm_user *userp); - -extern void smb_InitIoctl(void); - -extern void smb_SetupIoctlFid(smb_fid_t *fidp, cm_space_t *prefix); - -extern long smb_IoctlRead(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_IoctlWrite(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -extern long smb_IoctlV3Read(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp); - -#ifndef DJGPP -extern long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, - smb_packet_t *outp); -#else /* DJGPP */ -extern long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, - smb_packet_t *outp, dos_ptr rawBuf); -#endif /* !DJGPP */ - -#endif /* __SMB_IOCTL_H_ENV__ */ diff --git a/src/WINNT/afsd/symlink.c b/src/WINNT/afsd/symlink.c deleted file mode 100644 index 0b7322ae1..000000000 --- a/src/WINNT/afsd/symlink.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "fs_utils.h" -#include "cmd.h" - -#define MAXNAME 100 -#define MAXSIZE 2048 -#define MAXINSIZE 1300 /* pioctl complains if data is larger than this */ - -static char space[MAXSIZE]; -static char tspace[1024]; - -#ifndef WIN32 -static struct ubik_client *uclient; -#endif /* not WIN32 */ - - -static char pn[] = "symlink"; -static int rxInitDone = 0; - -void Die(); - -foldcmp (a, b) - register char *a; - register char *b; { - register char t, u; - while (1) { - t = *a++; - u = *b++; - if (t >= 'A' && t <= 'Z') t += 0x20; - if (u >= 'A' && u <= 'Z') u += 0x20; - if (t != u) return 1; - if (t == 0) return 0; - } -} - -/* this function returns TRUE (1) if the file is in AFS, otherwise false (0) */ -static int InAFS(apath) -register char *apath; { - struct ViceIoctl blob; - register afs_int32 code; - - blob.in_size = 0; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl(apath, VIOC_FILE_CELL_NAME, &blob, 1); - if (code) { - if ((errno == EINVAL) || (errno == ENOENT)) return 0; - } - return 1; -} - -/* return a static pointer to a buffer */ -static char *Parent(apath) -char *apath; { - register char *tp; - strcpy(tspace, apath); - tp = strrchr(tspace, '\\'); - if (tp) { - *(tp+1) = 0; /* lv trailing slash so Parent("k:\foo") is "k:\" not "k:" */ - } - else { - fs_ExtractDriveLetter(apath, tspace); - strcat(tspace, "."); - } - return tspace; -} - - -static ListLinkCmd(as) -register struct cmd_syndesc *as; { - register afs_int32 code; - struct ViceIoctl blob; - int error; - register struct cmd_item *ti; - char orig_name[1024]; /*Original name, may be modified*/ - char true_name[1024]; /*``True'' dirname (e.g., symlink target)*/ - char parent_dir[1024]; /*Parent directory of true name*/ - register char *last_component; /*Last component of true name*/ -#ifndef WIN32 - struct stat statbuff; /*Buffer for status info*/ -#endif /* not WIN32 */ -#ifndef WIN32 - int link_chars_read; /*Num chars read in readlink()*/ -#endif /* not WIN32 */ - int thru_symlink; /*Did we get to a mount point via a symlink?*/ - - error = 0; - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - thru_symlink = 0; -#ifdef WIN32 - strcpy(orig_name, ti->data); -#else /* not WIN32 */ - sprintf(orig_name, "%s%s", - (ti->data[0] == '/') ? "" : "./", - ti->data); -#endif /* not WIN32 */ - -#ifndef WIN32 - if (lstat(orig_name, &statbuff) < 0) { - /* if lstat fails, we should still try the pioctl, since it - may work (for example, lstat will fail, but pioctl will - work if the volume of offline (returning ENODEV). */ - statbuff.st_mode = S_IFDIR; /* lie like pros */ - } - - /* - * The lstat succeeded. If the given file is a symlink, substitute - * the file name with the link name. - */ - if ((statbuff.st_mode & S_IFMT) == S_IFLNK) { - thru_symlink = 1; - /* - * Read name of resolved file. - */ - link_chars_read = readlink(orig_name, true_name, 1024); - if (link_chars_read <= 0) { - fprintf(stderr,"%s: Can't read target name for '%s' symbolic link!\n", - pn, orig_name); - exit(1); - } - - /* - * Add a trailing null to what was read, bump the length. - */ - true_name[link_chars_read++] = 0; - - /* - * If the symlink is an absolute pathname, we're fine. Otherwise, we - * have to create a full pathname using the original name and the - * relative symlink name. Find the rightmost slash in the original - * name (we know there is one) and splice in the symlink value. - */ - if (true_name[0] != '\\') { - last_component = (char *) strrchr(orig_name, '\\'); - strcpy(++last_component, true_name); - strcpy(true_name, orig_name); - } - } - else - strcpy(true_name, orig_name); -#else /* WIN32 */ - strcpy(true_name, orig_name); -#endif /* WIN32 */ - - /* - * Find rightmost slash, if any. - */ - last_component = (char *) strrchr(true_name, '\\'); - if (!last_component) - last_component = (char *) strrchr(true_name, '/'); - if (last_component) { - /* - * Found it. Designate everything before it as the parent directory, - * everything after it as the final component. - */ - strncpy(parent_dir, true_name, last_component - true_name + 1); - parent_dir[last_component - true_name + 1] = 0; - last_component++; /*Skip the slash*/ - } - else { - /* - * No slash appears in the given file name. Set parent_dir to the current - * directory, and the last component as the given name. - */ - fs_ExtractDriveLetter(true_name, parent_dir); - strcat(parent_dir, "."); - last_component = true_name; - fs_StripDriveLetter(true_name, true_name, sizeof(true_name)); - } - - if (strcmp(last_component, ".") == 0 || strcmp(last_component, "..") == 0) { - fprintf(stderr,"%s: you may not use '.' or '..' as the last component\n", pn); - fprintf(stderr,"%s: of a name in the 'symlink list' command.\n", pn); - error = 1; - continue; - } - blob.in = last_component; - blob.in_size = strlen(last_component)+1; - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, MAXSIZE); - - code = pioctl(parent_dir, VIOC_LISTSYMLINK, &blob, 1); - - if (code == 0) - printf("'%s' is a %ssymlink to '%s'\n", - ti->data, - (thru_symlink ? "symbolic link, leading to a " : ""), - space); - - else { - error = 1; - if (errno == EINVAL) - fprintf(stderr,"'%s' is not a symlink.\n", - ti->data); - else { - Die(errno, (ti->data ? ti->data : parent_dir)); - } - } - } - return error; -} - -static MakeLinkCmd(as) -register struct cmd_syndesc *as; { - register afs_int32 code; - struct ViceIoctl blob; - - if (!InAFS(Parent(as->parms[0].items->data))) { - fprintf(stderr,"%s: symlinks must be created within the AFS file system\n", pn); - return 1; - } - - strcpy(space, as->parms[1].items->data); -#ifdef WIN32 - /* create symlink with a special pioctl for Windows NT, since it doesn't - * have a symlink system call. - */ - - /* TODO: Code needs to go here to prevent the creation of symlinks - * in \\AFS\all when not in the "AFS Client Admins" group. - */ - - blob.out_size = 0; - blob.in_size = 1 + strlen(space); - blob.in = space; - blob.out = NULL; - code = pioctl(as->parms[0].items->data, VIOC_SYMLINK, &blob, 0); -#else /* not WIN32 */ - code = symlink(space, as->parms[0].items->data); -#endif /* not WIN32 */ - if (code) { - Die(errno, as->parms[0].items->data); - return 1; - } - return 0; -} - -/* - * Delete AFS symlinks. Variables are used as follows: - * tbuffer: Set to point to the null-terminated directory name of the - * symlink (or ``.'' if none is provided) - * tp: Set to point to the actual name of the symlink to nuke. - */ -static RemoveLinkCmd(as) -register struct cmd_syndesc *as; { - register afs_int32 code=0; - struct ViceIoctl blob; - register struct cmd_item *ti; - char tbuffer[1024]; - char lsbuffer[1024]; - register char *tp; - - for(ti=as->parms[0].items; ti; ti=ti->next) { - /* once per file */ - tp = (char *) strrchr(ti->data, '\\'); - if (!tp) - tp = (char *) strrchr(ti->data, '/'); - if (tp) { - strncpy(tbuffer, ti->data, code=tp-ti->data+1); /* the dir name */ - tbuffer[code] = 0; - tp++; /* skip the slash */ - } - else { - fs_ExtractDriveLetter(ti->data, tbuffer); - strcat(tbuffer, "."); - tp = ti->data; - fs_StripDriveLetter(tp, tp, 0); - } - blob.in = tp; - blob.in_size = strlen(tp)+1; - blob.out = lsbuffer; - blob.out_size = sizeof(lsbuffer); - code = pioctl(tbuffer, VIOC_LISTSYMLINK, &blob, 0); - if (code) { - if (errno == EINVAL) - fprintf(stderr,"fs: '%s' is not a symlink.\n", ti->data); - else { - Die(errno, ti->data); - } - continue; /* don't bother trying */ - } - blob.out_size = 0; - blob.in = tp; - blob.in_size = strlen(tp)+1; - code = pioctl(tbuffer, VIOC_DELSYMLINK, &blob, 0); - if (code) { - Die(errno, ti->data); - } - - } - return code; -} - -static struct ViceIoctl gblob; -static int debug = 0; - -main(argc, argv) -int argc; -char **argv; { - register afs_int32 code; - register struct cmd_syndesc *ts; - -#ifdef AFS_AIX32_ENV - /* - * The following signal action for AIX is necessary so that in case of a - * crash (i.e. core is generated) we can include the user's data section - * in the core dump. Unfortunately, by default, only a partial core is - * generated which, in many cases, isn't too useful. - */ - struct sigaction nsa; - - sigemptyset(&nsa.sa_mask); - nsa.sa_handler = SIG_DFL; - nsa.sa_flags = SA_FULLDUMP; - sigaction(SIGSEGV, &nsa, NULL); -#endif - -#ifdef WIN32 - WSADATA WSAjunk; - WSAStartup(0x0101, &WSAjunk); -#endif /* WIN32 */ - - /* try to find volume location information */ - - - osi_Init(); - - ts = cmd_CreateSyntax("list", ListLinkCmd, 0, "list symlink"); - cmd_AddParm(ts, "-name", CMD_LIST, 0, "name"); - - ts = cmd_CreateSyntax("make", MakeLinkCmd, 0, "make symlink"); - cmd_AddParm(ts, "-name", CMD_SINGLE, 0, "name"); - cmd_AddParm(ts, "-to", CMD_SINGLE, 0, "target"); - - ts = cmd_CreateSyntax("rm", RemoveLinkCmd, 0, "remove symlink"); - cmd_AddParm(ts, "-name", CMD_LIST, 0, "name"); - - code = cmd_Dispatch(argc, argv); - -#ifndef WIN32 - if (rxInitDone) rx_Finalize(); -#endif /* not WIN32 */ - - return code; -} - -void Die(code, filename) - int code; - char *filename; -{ /*Die*/ - - if (code == EINVAL) { - if (filename) - fprintf(stderr,"%s: Invalid argument; it is possible that %s is not in AFS.\n", pn, filename); - else fprintf(stderr,"%s: Invalid argument.\n", pn); - } - else if (code == ENOENT) { - if (filename) fprintf(stderr,"%s: File '%s' doesn't exist\n", pn, filename); - else fprintf(stderr,"%s: no such file returned\n", pn); - } - else if (code == EROFS) fprintf(stderr,"%s: You can not change a backup or readonly volume\n", pn); - else if (code == EACCES || code == EPERM) { - if (filename) fprintf(stderr,"%s: You don't have the required access rights on '%s'\n", pn, filename); - else fprintf(stderr,"%s: You do not have the required rights to do this operation\n", pn); - } - else if (code == ENODEV) { - fprintf(stderr,"%s: AFS service may not have started.\n", pn); - } - else if (code == ESRCH) { - fprintf(stderr,"%s: Cell name not recognized.\n", pn); - } - else if (code == EPIPE) { - fprintf(stderr,"%s: Volume name or ID not recognized.\n", pn); - } - else if (code == EFBIG) { - fprintf(stderr,"%s: Cache size too large.\n", pn); - } - else if (code == ETIMEDOUT) { - if (filename) - fprintf(stderr,"%s:'%s': Connection timed out", pn, filename); - else - fprintf(stderr,"%s: Connection timed out", pn); - } - else { - if (filename) fprintf(stderr,"%s:'%s'", pn, filename); - else fprintf(stderr,"%s", pn); -#ifdef WIN32 - fprintf(stderr, ": code 0x%x\n", code); -#else /* not WIN32 */ - fprintf(stderr,": %s\n", error_message(code)); -#endif /* not WIN32 */ - } -} /*Die*/ diff --git a/src/WINNT/afsd/symlink.rc b/src/WINNT/afsd/symlink.rc deleted file mode 100644 index 5a97a71a7..000000000 --- a/src/WINNT/afsd/symlink.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Symbolic Link Command" -#define AFS_VERINFO_NAME "symlink" -#define AFS_VERINFO_FILENAME "symlink.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/tokens.rc b/src/WINNT/afsd/tokens.rc deleted file mode 100644 index 169166208..000000000 --- a/src/WINNT/afsd/tokens.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Tokens Command" -#define AFS_VERINFO_NAME "tokens" -#define AFS_VERINFO_FILENAME "tokens.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afsd/unlog.rc b/src/WINNT/afsd/unlog.rc deleted file mode 100644 index f453e6178..000000000 --- a/src/WINNT/afsd/unlog.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Unlog Command" -#define AFS_VERINFO_NAME "unlog" -#define AFS_VERINFO_FILENAME "unlog.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/afslegal/NTMakefile b/src/WINNT/afslegal/NTMakefile deleted file mode 100644 index 522230e70..000000000 --- a/src/WINNT/afslegal/NTMakefile +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# include the primary makefile -RELDIR=WINNT\afslegal -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# Build afslegal.exe - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\afslegal.exe - -EXEOBJS = \ - $(OUT)\afslegal_stub.res \ - $(OUT)\afslegal.obj - -EXELIBS = \ - $(DESTDIR)\lib\afs\talocale.lib \ - comctl32.lib - -$(EXEFILE) : $(EXEOBJS) - $(EXEGUILINK) $(EXELIBS) - $(EXEPREP) - -############################################################################ -install : $(EXEFILE) lang - -lang :: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -############################################################################ -# Dependencies - -$(OUT)\afslegal_stub.res : AFS_component_version_number.h - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/afslegal/afslegal.cpp b/src/WINNT/afslegal/afslegal.cpp deleted file mode 100644 index 1f1a8db00..000000000 --- a/src/WINNT/afslegal/afslegal.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include "resource.h" - - // The following definition specifies the length of time that the - // stupid lawyer message will remain on the screen - // -#define cmsecSHOW_LAWYER_MESSAGE 5000 - - // Individual string resources in .RC files can't be more than 256 - // characters long. - // -#define cchRESOURCE 256 - - - // Lawyer_OnInitDialog - Populates the lawyer message window - // -void Lawyer_OnInitDialog (HWND hDlg) -{ - // Make the title item boldfaced - // - HFONT hfOld = (HFONT)SendDlgItemMessage (hDlg, IDC_TITLE, WM_GETFONT, 0, 0); - - LOGFONT lf; - GetObject (hfOld, sizeof(lf), &lf); - - lf.lfWeight = FW_BOLD; - - SendDlgItemMessage (hDlg, IDC_TITLE, WM_SETFONT, (WPARAM)CreateFontIndirect (&lf), 0); - - // Allocate a buffer, load the string, and shove the text - // in the main window. - // - LPTSTR pszMessage = FormatString (TEXT("%1"), TEXT("%m"), IDS_MESSAGE_1); - - SetDlgItemText (hDlg, IDC_MESSAGE, pszMessage); - - FreeString (pszMessage); -} - - - // Lawyer_DlgProc - The window procedure for the lawyer message - // -BOOL CALLBACK Lawyer_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Lawyer_OnInitDialog (hDlg); - SetTimer (hDlg, 0, cmsecSHOW_LAWYER_MESSAGE, NULL); - break; - - case WM_DESTROY: - PostQuitMessage (0); - break; - - case WM_TIMER: - DestroyWindow (hDlg); - KillTimer (hDlg, 0); - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_MESSAGE)) - { - static HBRUSH hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - SetBkColor ((HDC)wp, GetSysColor (COLOR_BTNFACE)); - SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT)); - return (BOOL)hbrBackground; - } - break; - - case WM_COMMAND: - if (LOWORD(wp) == IDCANCEL) - DestroyWindow (hDlg); - break; - } - - return FALSE; -} - - - // WinMain - Creates the window, waits for it to terminate - // -int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pCmdLine, int nCmdShow) -{ - TaLocale_LoadCorrespondingModule (hInst); - - HWND hDlg = ModelessDialog (IDD_LAWYER, NULL, (DLGPROC)Lawyer_DlgProc); - SetWindowPos (hDlg, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW); - - MSG msg; - while (GetMessage (&msg, NULL, 0, 0)) - { - if (!IsDialogMessage (hDlg, &msg)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - } - - return 0; -} - diff --git a/src/WINNT/afslegal/afslegal_stub.rc b/src/WINNT/afslegal/afslegal_stub.rc deleted file mode 100644 index 8f4ae5fd8..000000000 --- a/src/WINNT/afslegal/afslegal_stub.rc +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Startup Message" -#define AFS_VERINFO_NAME "afslegal_stub" -#define AFS_VERINFO_FILENAME "afslegal_stub.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED diff --git a/src/WINNT/afslegal/lang/NTMakefile b/src/WINNT/afslegal/lang/NTMakefile deleted file mode 100644 index c80da333e..000000000 --- a/src/WINNT/afslegal/lang/NTMakefile +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\afslegal\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\afslegal_$(LANGID).dll - -RCFILE = $(LANGNAME)\afslegal.rc - -RESFILE = $(OUT)\afslegal_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist *.res del *.res - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/afslegal/lang/de_DE/afslegal.rc b/src/WINNT/afslegal/lang/de_DE/afslegal.rc deleted file mode 100644 index 3fe35ea4e..000000000 --- a/src/WINNT/afslegal/lang/de_DE/afslegal.rc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Startup Message" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Server" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "(Dieser Text wird zur Laufzeit festgelegt)",IDC_MESSAGE,7,22,285,91 - CTEXT "",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Startup Message""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/src/WINNT/afslegal/lang/en_US/afslegal.rc b/src/WINNT/afslegal/lang/en_US/afslegal.rc deleted file mode 100644 index 8795f1c87..000000000 --- a/src/WINNT/afslegal/lang/en_US/afslegal.rc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Startup Message" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Server" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "(This text set at runtime)",IDC_MESSAGE,7,22,285,91 - CTEXT "U.S. Government Restricted Rights ",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Startup Message""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afslegal/lang/es_ES/afslegal.rc b/src/WINNT/afslegal/lang/es_ES/afslegal.rc deleted file mode 100644 index b1856ce96..000000000 --- a/src/WINNT/afslegal/lang/es_ES/afslegal.rc +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "Mensaje de inicio de AFS Server" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Server" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "(Texto definido en el momento de la ejecución)",IDC_MESSAGE,7,22,285,91 - CTEXT "Derechos restringidos del Gobierno de los EE.UU.",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Startup Message""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "Si está licenciando el Software en nombre del Gobierno de los EE.UU. (""Gobierno""), son aplicables los siguientes apartados. Si el Software ha sido facilitado al Departamento de Defensa (""DoD""), +" - IDS_MESSAGE_2 "éste está clasificado como ""Software de sistema comercial"" en el párrafo 252.227-7014 del Suplemento del DoD a las Normas de adquisición federales (""DFARS"") (o en cualquier norma que suceda a las mismas) + " - IDS_MESSAGE_3 "y el Gobierno sólo está adquiriendo los derechos sobre licencias otorgados en este apartado (los derechos sobre licencias que habitualmente se proporcionan a usuarios no gubernamentales). Si el software se proporciona a cualquier unidad o agencia +" - IDS_MESSAGE_4 "del Gobierno que no sea el DoD, éste se clasifica como ""Software restringido del sistema"" y los derechos del Gobierno sobre el Software se definen en el párrafo 52.227-19 de las Normas de adquisición federales +" - IDS_MESSAGE_5 "(""FAR"") (o en cualquier norma que suceda a las mismas), o bien, en el caso de la NASA, en el párrafo 18.52.227-86 del Suplemento de la NASA de las FAR (o en cualquier norma que suceda a las mismas)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - - diff --git a/src/WINNT/afslegal/lang/ja_JP/afslegal.rc b/src/WINNT/afslegal/lang/ja_JP/afslegal.rc deleted file mode 100644 index a3ce5fcae..000000000 --- a/src/WINNT/afslegal/lang/ja_JP/afslegal.rc +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒT[ƒo[Žn“®ƒƒbƒZ[ƒW" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ƒT[ƒo[" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "(‚±‚̃eƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·)",IDC_MESSAGE,7,22,285,91 - CTEXT "U.S. Government Restricted Rights ",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ƒT[ƒo[Žn“®ƒƒbƒZ[ƒW""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afslegal/lang/ko_KR/afslegal.rc b/src/WINNT/afslegal/lang/ko_KR/afslegal.rc deleted file mode 100644 index d9b55ad8c..000000000 --- a/src/WINNT/afslegal/lang/ko_KR/afslegal.rc +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ¼­¹ö ½Ãµ¿ ¸Þ½ÃÁö" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¼­¹ö" -FONT 9, "±¼¸²" -BEGIN - LTEXT "(ÀÌ ÅØ½ºÆ®´Â ½ÇÇà Áß ¼³Á¤µË´Ï´Ù)",IDC_MESSAGE,7,22,285, - 91 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ¼­¹ö ½Ãµ¿ ¸Þ½ÃÁö""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afslegal/lang/pt_BR/afslegal.rc b/src/WINNT/afslegal/lang/pt_BR/afslegal.rc deleted file mode 100644 index deb0014a9..000000000 --- a/src/WINNT/afslegal/lang/pt_BR/afslegal.rc +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "Mensagem de Inicialização de AFS Server" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Server" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "(Este texto definido no runtime)",IDC_MESSAGE,7,22,285,91 - CTEXT " ",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""Mensagem de Inicialização de AFS Server""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - - diff --git a/src/WINNT/afslegal/lang/zh_CN/afslegal.rc b/src/WINNT/afslegal/lang/zh_CN/afslegal.rc deleted file mode 100644 index 2bb2b04dd..000000000 --- a/src/WINNT/afslegal/lang/zh_CN/afslegal.rc +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ·þÎñÆ÷Æô¶¯ÏûÏ¢" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED - -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ·þÎñÆ÷" -FONT 8, "System" -BEGIN - LTEXT "(ÔËÐÐʱÉèÖøÃÎı¾)",IDC_MESSAGE,7,22,285,91 - CTEXT "U.S. Government Restricted Rights",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ·þÎñÆ÷Æô¶¯ÏûÏ¢""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/src/WINNT/afslegal/lang/zh_TW/afslegal.rc b/src/WINNT/afslegal/lang/zh_TW/afslegal.rc deleted file mode 100644 index a12e0a327..000000000 --- a/src/WINNT/afslegal/lang/zh_TW/afslegal.rc +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Startup Message" -#define AFS_VERINFO_NAME "afslegal" -#define AFS_VERINFO_FILENAME "afslegal.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAWYER DIALOG DISCARDABLE 0, 0, 299, 120 -STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Server" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "(This text set at runtime)",IDC_MESSAGE,7,22,285,91 - CTEXT "U.S. Government Restricted Rights ",IDC_TITLE,7,7,285,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAWYER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 113 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Startup Message""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MESSAGE_1 "If you are licensing the Software on behalf of the U.S. Government (""Government""), the following provisions apply to you. If the Software is supplied to the Department of Defense (""DoD""), +" - IDS_MESSAGE_2 "it is classified as ""Commercial Computer Software"" under paragraph 252.227-7014 of the DoD Supplement to the Federal Acquisition Regulations (""DFARS"") (or any successor regulations) +" - IDS_MESSAGE_3 "and the Government is acquiring only the license rights granted herein (the license rights customarily provided to non-Government users). If the Software is supplied to any unit or agency +" - IDS_MESSAGE_4 "of the Government other than DoD, it is classified as ""Restricted Computer Software"" and the Government's rights in the Software are defined in paragraph 52.227-19 of the Federal Acquisition +" - IDS_MESSAGE_5 "Regulations (""FAR"") (or any successor regulations) or, in the case of NASA, in paragraph 18.52.227-86 of the NASA Supplement in the FAR (or any successor regulations)." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afslegal/resource.h b/src/WINNT/afslegal/resource.h deleted file mode 100644 index 818d5952f..000000000 --- a/src/WINNT/afslegal/resource.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_MESSAGE_1 0 -#define IDS_MESSAGE_2 1 -#define IDS_MESSAGE_3 2 -#define IDS_MESSAGE_4 3 -#define IDS_MESSAGE_5 4 -#define IDD_LAWYER 101 -#define IDC_TITLE 1000 -#define IDC_MESSAGE 1001 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/afsreg/NTMakefile b/src/WINNT/afsreg/NTMakefile deleted file mode 100644 index d7c26a226..000000000 --- a/src/WINNT/afsreg/NTMakefile +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -RELDIR=WINNT\afsreg -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) - -INCFILES = \ - $(DESTDIR)\include\WINNT\afsreg.h \ - $(DESTDIR)\include\WINNT\syscfg.h \ - $(DESTDIR)\include\WINNT\afssw.h \ - $(DESTDIR)\include\WINNT\vptab.h - - -LIBFILE = $(DESTDIR)\lib\afs\afsreg.lib - -LIBOBJS = \ - $(OUT)\afsreg.obj \ - $(OUT)\syscfg.obj \ - $(OUT)\afssw.obj \ - $(OUT)\vptab.obj - -$(LIBOBJS): $$(@B).c - $(C2OBJ) $** - -$(LIBFILE): $(LIBOBJS) - $(LIBARCH) Iphlpapi.lib - -install_headers: $(INCFILES) - -install: install_headers $(LIBFILE) - -install9x: install - -clean:: - $(DEL) $(LIBFILE) \ No newline at end of file diff --git a/src/WINNT/afsreg/afsreg.c b/src/WINNT/afsreg/afsreg.c deleted file mode 100644 index 24a9ae085..000000000 --- a/src/WINNT/afsreg/afsreg.c +++ /dev/null @@ -1,476 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include - -#include "afsreg.h" - - -/* Extended (alternative) versions of registry access functions. - * All functions return WIN32 style error codes. - */ - - -static long CopyKey(const char *sourceKey, const char *targetKey); -static long CopyValues(HKEY srcKey, HKEY dupKey); -static long CopySubkeys(const char *srcName, HKEY srcKey, - const char *dupName, HKEY dupKey); - - -/* ----------------------- exported functions ----------------------- */ - - -/* RegOpenKeyAlt() -- Open a key in the registry and return its handle. - * If create is set, the subkey (and all its parent keys on the path) - * is created if it does not exist. In either case, the disposition of - * the key is indicated as REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY. - * - * Note: if key is null (AFSREG_NULL_KEY) then the first component of - * subKeyName must be one of the predefined keys; resultKeyDispP - * can always be NULL. - */ - -long -RegOpenKeyAlt(HKEY key, /* [in] open key from which to start */ - const char *subKeyName, /* [in] sub key path */ - DWORD mode, /* [in] desired access */ - int create, /* [in] if set, creates key(s) on path */ - HKEY *resultKeyP, /* [out] open key handle */ - DWORD *resultKeyDispP) /* [out] open key disposition */ -{ - long status; - DWORD keyDisp = REG_OPENED_EXISTING_KEY; - - if (key == AFSREG_NULL_KEY) { - /* No starting key; first path component must be predefined key. - * NOTE: predefined keys are always open (i.e., don't need opening). - */ - const char *tokenP = subKeyName + strspn(subKeyName, "\\"); - size_t tokenSz = strcspn(tokenP, "\\"); - - if (!strncmp(tokenP, "HKEY_LOCAL_MACHINE", tokenSz)) - key = HKEY_LOCAL_MACHINE; - else if (!strncmp(tokenP, "HKEY_CURRENT_USER", tokenSz)) - key = HKEY_CURRENT_USER; - else if (!strncmp(tokenP, "HKEY_CURRENT_CONFIG", tokenSz)) - key = HKEY_CURRENT_CONFIG; - else if (!strncmp(tokenP, "HKEY_USERS", tokenSz)) - key = HKEY_USERS; - else if (!strncmp(tokenP, "HKEY_CLASSES_ROOT", tokenSz)) - key = HKEY_CLASSES_ROOT; - else if (!strncmp(tokenP, "HKEY_PERFORMANCE_DATA", tokenSz)) - key = HKEY_PERFORMANCE_DATA; - else if (!strncmp(tokenP, "HKEY_DYN_DATA", tokenSz)) - key = HKEY_DYN_DATA; - else { - return ERROR_INVALID_PARAMETER; - } - - subKeyName = tokenP + tokenSz + 1; - } - - /* open (and possibly create) sub key */ - if (create) { - status = RegCreateKeyEx(key, subKeyName, - (DWORD)0, "AFS", REG_OPTION_NON_VOLATILE, - mode, NULL, resultKeyP, &keyDisp); - } else { - status = RegOpenKeyEx(key, subKeyName, (DWORD)0, mode, resultKeyP); - } - - if (resultKeyDispP) { - *resultKeyDispP = keyDisp; - } - - return status; -} - - -/* - * RegQueryValueAlt() -- Read data associated with a key value. - * If a buffer is supplied (i.e., *dataPP is not NULL) then - * the data is placed in that buffer; in this case *dataSizeP - * is the buffer size on input and the data size on output. - * Otherwise, if *dataPP is NULL, a data buffer is allocated - * and *dataPP is set to point to that buffer. - * - * NOTE: dataTypeP can always be NULL, and dataSizeP can be NULL - * only if *dataPP is NULL. - */ - -long -RegQueryValueAlt(HKEY key, /* [in] open key handle */ - const char *valueName, /* [in] value name */ - DWORD *dataTypeP, /* [out] type of value's data */ - void **dataPP, /* [in/out] buffer for value's data */ - DWORD *dataSizeP) /* [in/out] size of data (buffer) */ -{ - long status; - - if (*dataPP) { - /* Use user-supplied data buffer; no real work */ - status = RegQueryValueEx(key, valueName, NULL, - dataTypeP, *dataPP, dataSizeP); - } else { - DWORD bufType, bufSize, dwordData; - char *buf; - - /* get size of value's data; optimize read for common REG_DWORD */ - bufSize = sizeof(DWORD); - - status = RegQueryValueEx(key, valueName, NULL, - &bufType, (void*)&dwordData, &bufSize); - - if (status == ERROR_SUCCESS || status == ERROR_MORE_DATA) { - /* allocate buffer for value's data */ - buf = malloc(bufSize); - - if (!buf) { - status = ERROR_NOT_ENOUGH_MEMORY; - } else { - if (status == ERROR_SUCCESS) { - /* data fit in DWORD buffer; don't read registry again */ - memcpy(buf, &dwordData, bufSize); - } else { - /* data did not fit in DWORD buffer; read registry again */ - status = RegQueryValueEx(key, valueName, NULL, - &bufType, buf, &bufSize); - } - - if (status == ERROR_SUCCESS) { - /* return requested results */ - *dataPP = buf; - if (dataTypeP) *dataTypeP = bufType; - if (dataSizeP) *dataSizeP = bufSize; - } else { - /* registry read failed */ - free(buf); - } - } - } - } - - return status; -} - - - -/* - * RegEnumKeyAlt() -- Enumerate subkey names of specified key. - * Subkey names are returned in a single multistring (REG_MULTI_SZ). - * If the key has no subkeys, then *subkeyNames is set to NULL. - * - * Note: A multistring is a char buffer containing individual strings - * separated by a '\0' char with the last string being followed by - * two '\0' chars. - */ - -long -RegEnumKeyAlt(HKEY key, /* [in] open key handle */ - char **subkeyNames) /* [out] subkey name buf (multistring) */ -{ - long status; - DWORD skCount, skNameLenMax; - char *skNameBuf = NULL; - - status = RegQueryInfoKey(key, - NULL, NULL, NULL, - &skCount, &skNameLenMax, - NULL, NULL, NULL, NULL, NULL, NULL); - - if (status == ERROR_SUCCESS && skCount > 0) { - skNameBuf = malloc((skCount * (skNameLenMax + 1)) + 1); - - if (!skNameBuf) { - status = ERROR_NOT_ENOUGH_MEMORY; - } else { - DWORD i, skFillLen; - char *skBufP = skNameBuf; - - for (i = 0; i < skCount && status == ERROR_SUCCESS; i++) { - skFillLen = skNameLenMax + 1; - status = RegEnumKeyEx(key, i, skBufP, &skFillLen, - NULL, NULL, NULL, NULL); - if (status == ERROR_SUCCESS) { - skBufP += skFillLen + 1; - } - } - *skBufP = '\0'; - - if (status != ERROR_SUCCESS) { - free(skNameBuf); - skNameBuf = NULL; - } - } - } - - *subkeyNames = skNameBuf; - return status; -} - - -/* - * RegDeleteKeyAlt() -- Delete named subkey and all its subkeys and values. - * - * This is just a recursive version of RegDeleteKey(), which does not - * recurse on NT (though it does on Win95/98). - */ -long -RegDeleteKeyAlt(HKEY key, - const char *subKeyName) -{ - long status; - - status = RegDeleteKey(key, subKeyName); - - if (status != ERROR_SUCCESS) { - /* determine if delete failed due to subkeys */ - HKEY subKey; - - status = RegOpenKeyEx(key, subKeyName, 0, KEY_ALL_ACCESS, &subKey); - if (status == ERROR_SUCCESS) { - char *keyEnum; - - status = RegEnumKeyAlt(subKey, &keyEnum); - if (status == ERROR_SUCCESS && keyEnum != NULL) { - /* subkeys found; try to delete each; ignore errors */ - char *keyEnumName; - - for (keyEnumName = keyEnum; - *keyEnumName != '\0'; - keyEnumName += strlen(keyEnumName) + 1) { - (void) RegDeleteKeyAlt(subKey, keyEnumName); - } - free(keyEnum); - } - (void) RegCloseKey(subKey); - } - - /* try delete again */ - status = RegDeleteKey(key, subKeyName); - } - return status; -} - - -/* - * RegDeleteEntryAlt() -- delete named key or value; if key, then all subkeys - * and values are removed; entryName must be in canonical path format. - */ -long -RegDeleteEntryAlt(const char *entryName, regentry_t entryType) -{ - long status = ERROR_SUCCESS; - char *entryBuf = _strdup(entryName); - - if (entryBuf == NULL) { - status = ERROR_NOT_ENOUGH_MEMORY; - } else { - char *keyPath = entryBuf; - char *entryName = strrchr(entryBuf, '\\'); - - if (entryName == NULL) { - status = ERROR_INVALID_PARAMETER; - } else { - HKEY key; - - *entryName = '\0'; - entryName++; - - status = RegOpenKeyAlt(AFSREG_NULL_KEY, - keyPath, KEY_ALL_ACCESS, 0, &key, NULL); - if (status == ERROR_SUCCESS) { - if (entryType == REGENTRY_KEY) { - status = RegDeleteKeyAlt(key, entryName); - } else if (entryType == REGENTRY_VALUE) { - status = RegDeleteValue(key, entryName); - } else { - status = ERROR_INVALID_PARAMETER; - } - (void) RegCloseKey(key); - } - } - free(entryBuf); - } - return status; -} - - -/* - * RegDupKeyAlt() -- duplicate sourceKey as targetKey; both sourceKey and - * targetKey must be in canonical path format. - * - * NOTE: if targetKey already exists it will be replaced. - */ -long -RegDupKeyAlt(const char *sourceKey, const char *targetKey) -{ - long status; - - /* delete target key if extant */ - status = RegDeleteEntryAlt(targetKey, REGENTRY_KEY); - - if (status == ERROR_SUCCESS || status == ERROR_FILE_NOT_FOUND) { - status = CopyKey(sourceKey, targetKey); - - if (status != ERROR_SUCCESS) { - /* clean-up partial duplication */ - (void) RegDeleteEntryAlt(targetKey, REGENTRY_KEY); - } - } - return status; -} - - - -/* ----------------------- local functions ----------------------- */ - - -/* - * CopyKey() -- worker function implementing RegDupKeyAlt(). - * - * Note: - assumes target does not exist (i.e., deleted by RegDupKeyAlt()) - * - no cleanup on failure (i.e., assumes done by RegDupKeyAlt()) - */ -static long -CopyKey(const char *sourceKey, const char *targetKey) -{ - long status; - HKEY srcKey, dupKey; - - /* open source key */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, sourceKey, - KEY_READ, 0, &srcKey, NULL); - if (status == ERROR_SUCCESS) { - /* create target key */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, targetKey, - KEY_ALL_ACCESS, 1 /* create */, &dupKey, NULL); - if (status == ERROR_SUCCESS) { - /* copy values and their data from source to target */ - status = CopyValues(srcKey, dupKey); - - if (status == ERROR_SUCCESS) { - /* copy subkeys from source to target */ - status = CopySubkeys(sourceKey, srcKey, targetKey, dupKey); - } - (void) RegCloseKey(dupKey); - } - (void) RegCloseKey(srcKey); - } - return status; -} - - -/* - * CopyValues() -- copy values and their data from srcKey to dupKey - */ -static long -CopyValues(HKEY srcKey, HKEY dupKey) -{ - long status; - DWORD valCount, valNameLenMax, valDataLenMax; - - status = RegQueryInfoKey(srcKey, - NULL, NULL, NULL, NULL, NULL, NULL, - &valCount, &valNameLenMax, &valDataLenMax, - NULL, NULL); - - if (status == ERROR_SUCCESS && valCount > 0) { - char *valBuffer = malloc(valNameLenMax + 1 + valDataLenMax); - - if (valBuffer == NULL) { - status = ERROR_NOT_ENOUGH_MEMORY; - } else { - DWORD i; - char *valName = valBuffer; - char *valData = valBuffer + (valNameLenMax + 1); - - for (i = 0; i < valCount && status == ERROR_SUCCESS; i++) { - DWORD valNameFillLen = valNameLenMax + 1; - DWORD valDataFillLen = valDataLenMax; - DWORD valDataType; - - status = RegEnumValue(srcKey, i, - valName, &valNameFillLen, - NULL, - &valDataType, - valData, &valDataFillLen); - - if (status == ERROR_SUCCESS) { - status = RegSetValueEx(dupKey, - valName, 0, - valDataType, - valData, valDataFillLen); - } - } - free(valBuffer); - } - } - return status; -} - - -/* - * CopySubkeys() -- copy subkeys from srcKey to dupKey - * - * Note - srcName and dupName are the canonical path names of the - * open keys srcKey and dupKey, respectively. - */ -static long -CopySubkeys(const char *srcName, HKEY srcKey, const char *dupName, HKEY dupKey) -{ - long status; - char *skEnum; - - status = RegEnumKeyAlt(srcKey, &skEnum); - - if (status == ERROR_SUCCESS && skEnum != NULL) { - char *skEnumName, *skNameBuf; - size_t skSrcNameMax, skDupNameMax, skNameMax; - - skNameMax = 0; - skEnumName = skEnum; - while (*skEnumName != '\0') { - size_t skNameLen = strlen(skEnumName); - skNameMax = max(skNameMax, skNameLen); - - skEnumName += skNameLen + 1; - } - - skSrcNameMax = strlen(srcName) + 1 + skNameMax + 1; - skDupNameMax = strlen(dupName) + 1 + skNameMax + 1; - - skNameBuf = malloc(skSrcNameMax + skDupNameMax); - if (skNameBuf == NULL) { - status = ERROR_NOT_ENOUGH_MEMORY; - } else { - char *skSrcName = skNameBuf; - char *skDupName = skNameBuf + skSrcNameMax; - - for (skEnumName = skEnum; - *skEnumName != '\0' && status == ERROR_SUCCESS; - skEnumName += strlen(skEnumName) + 1) { - sprintf(skSrcName, "%s\\%s", srcName, skEnumName); - sprintf(skDupName, "%s\\%s", dupName, skEnumName); - - status = CopyKey(skSrcName, skDupName); - } - free(skNameBuf); - } - free(skEnum); - } - return status; -} diff --git a/src/WINNT/afsreg/afsreg.h b/src/WINNT/afsreg/afsreg.h deleted file mode 100644 index 8126a6df3..000000000 --- a/src/WINNT/afsreg/afsreg.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSREG_H_ -#define AFSREG_H_ - -/* Registry keys and values accessed by AFS server processes and - * the AFS software installation and configuration utilities. - */ - -#define AFSREG_NULL_KEY ((HKEY)0) - -#define AFSREG_SVR_SVC_NAME "TransarcAFSServer" -#define AFSREG_SVR_SW_NAME "AFS Server" - -#define AFSREG_CLT_SVC_NAME "TransarcAFSDaemon" -#define AFSREG_CLT_SW_NAME "AFS Client" - - - -/* ---- NT system configuration information ---- */ - -/* TCP/IP registry keys and values of interest: - * - * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services - * - * Tcpip\Linkage - * Bind:REG_MULTI_SZ: - * - * \Parameters\Tcpip - * IPAddress:REG_MULTI_SZ: - * SubnetMask:REG_MULTI_SZ: - * DhcpIPAddress:REG_SZ: - * DhcpSubnetMask:REG_SZ: - */ - -#define AFSREG_IPSRV_KEY \ -"HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services" - -/* Adapter list subkey and subkey values */ -#define AFSREG_IPSRV_IFACELIST_SUBKEY "Tcpip\\Linkage" -#define AFSREG_IPSRV_IFACELIST_BIND_VALUE "Bind" - -/* Per-adapter subkey and subkey values */ -#define AFSREG_IPSRV_ADAPTER_PARAM_SUBKEY "Parameters\\Tcpip" -#define AFSREG_IPSRV_ADAPTER_PARAM_ADDR_VALUE "IPAddress" -#define AFSREG_IPSRV_ADAPTER_PARAM_MASK_VALUE "SubnetMask" -#define AFSREG_IPSRV_ADAPTER_PARAM_DHCPADDR_VALUE "DhcpIPAddress" -#define AFSREG_IPSRV_ADAPTER_PARAM_DHCPMASK_VALUE "DhcpSubnetMask" - -/* - * Event logging registry keys and values of interest: - * - * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog - * - * Application\AFSREG_SVR_APPLOG_SUBKEY - * EventMessageFile:REG_EXPAND_SZ: - * TypesSupported:REG_DWORD: - */ - -#define AFSREG_APPLOG_SUBKEY \ - "System\\CurrentControlSet\\Services\\EventLog\\Application" -#define AFSREG_APPLOG_KEY "HKEY_LOCAL_MACHINE\\" AFSREG_APPLOG_SUBKEY - -/* AFS event source subkey and subkey values -- client and server services */ -#define AFSREG_SVR_APPLOG_SUBKEY "AFS Service" -#define AFSREG_SVR_APPLOG_MSGFILE_VALUE "EventMessageFile" -#define AFSREG_SVR_APPLOG_MSGTYPE_VALUE "TypesSupported" - - - - -/* ---- AFS software configuration information ---- */ - -/* HKEY_LOCAL_MACHINE\SOFTWARE\TransarcCorporation\AFSREG_SVR_SW_NAME - * - * CurrentVersion - * PathName:REG_SZ: - * MajorVersion:REG_DWORD: - * MinorVersion:REG_DWORD: - * PatchLevel:REG_DWORD: - */ - -#define AFSREG_SVR_SW_SUBKEY \ - "Software\\TransarcCorporation\\" AFSREG_SVR_SW_NAME -#define AFSREG_SVR_SW_KEY "HKEY_LOCAL_MACHINE\\" AFSREG_SVR_SW_SUBKEY - -#define AFSREG_SVR_SW_VERSION_KEY AFSREG_SVR_SW_KEY "\\CurrentVersion" -#define AFSREG_SVR_SW_VERSION_SUBKEY AFSREG_SVR_SW_SUBKEY "\\CurrentVersion" - -/* AFSREG_SVR_SW_VERSION_KEY values */ -#define AFSREG_SVR_SW_VERSION_DIR_VALUE "PathName" -#define AFSREG_SVR_SW_VERSION_MAJOR_VALUE "MajorVersion" -#define AFSREG_SVR_SW_VERSION_MINOR_VALUE "MinorVersion" -#define AFSREG_SVR_SW_VERSION_PATCH_VALUE "PatchLevel" - - -/* HKEY_LOCAL_MACHINE\SOFTWARE\TransarcCorporation\AFSREG_CLT_SW_NAME - * - * CurrentVersion - * PathName:REG_SZ: - * MajorVersion:REG_DWORD: - * MinorVersion:REG_DWORD: - * PatchLevel:REG_DWORD: - */ - -#define AFSREG_CLT_SW_SUBKEY \ - "Software\\TransarcCorporation\\" AFSREG_CLT_SW_NAME -#define AFSREG_CLT_SW_KEY "HKEY_LOCAL_MACHINE\\" AFSREG_CLT_SW_SUBKEY - -#define AFSREG_CLT_SW_VERSION_KEY AFSREG_CLT_SW_KEY "\\CurrentVersion" -#define AFSREG_CLT_SW_VERSION_SUBKEY AFSREG_CLT_SW_SUBKEY "\\CurrentVersion" - -/* AFSREG_CLT_SW_VERSION_KEY values */ -#define AFSREG_CLT_SW_VERSION_DIR_VALUE "PathName" -#define AFSREG_CLT_SW_VERSION_MAJOR_VALUE "MajorVersion" -#define AFSREG_CLT_SW_VERSION_MINOR_VALUE "MinorVersion" -#define AFSREG_CLT_SW_VERSION_PATCH_VALUE "PatchLevel" - - - -/* ---- AFS service configuration information ---- */ - -/* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFSREG_SVR_SVC_NAME - * - * DisplayName:REG_SZ: - * ImagePath:REG_EXPAND_SZ: - * - * Afstab - * - * DeviceName:REG_SZ: - */ - -#define AFSREG_SVR_SVC_DISPLAYNAME_DATA "IBM AFS Server" -#define AFSREG_SVR_SVC_IMAGENAME_DATA "bosctlsvc.exe" - -#define AFSREG_SVR_SVC_SUBKEY "System\\CurrentControlSet\\Services\\" AFSREG_SVR_SVC_NAME -#define AFSREG_SVR_SVC_KEY "HKEY_LOCAL_MACHINE\\" AFSREG_SVR_SVC_SUBKEY - -#define AFSREG_SVR_SVC_AFSTAB_KEY AFSREG_SVR_SVC_KEY "\\Afstab" - -/* AFSREG_SVR_SVC_AFSTAB_KEY partition subkey values */ -#define AFSREG_SVR_SVC_AFSTAB_DEVNAME_VALUE "DeviceName" - - -/* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFSREG_CLT_SVC_NAME - * - * DisplayName:REG_SZ: - * ImagePath:REG_EXPAND_SZ: - * - * Parameters - * Cell:REG_SZ: - */ - -#define AFSREG_CLT_SVC_DISPLAYNAME_DATA "IBM AFS Client" -#define AFSREG_CLT_SVC_IMAGENAME_DATA "afsd_service.exe" - -#define AFSREG_CLT_SVC_SUBKEY "System\\CurrentControlSet\\Services\\" AFSREG_CLT_SVC_NAME -#define AFSREG_CLT_SVC_KEY "HKEY_LOCAL_MACHINE\\" AFSREG_CLT_SVC_SUBKEY - -#define AFSREG_CLT_SVC_PARAM_KEY AFSREG_CLT_SVC_KEY "\\Parameters" -#define AFSREG_CLT_SVC_PARAM_SUBKEY AFSREG_CLT_SVC_SUBKEY "\\Parameters" -#define AFSREG_CLT_SVC_PROVIDER_KEY AFSREG_CLT_SVC_KEY "\\NetworkProvider" -#define AFSREG_CLT_SVC_PROVIDER_SUBKEY AFSREG_CLT_SVC_SUBKEY "\\NetworkProvider" - -/* AFSREG_CLT_SVC_PARAM_KEY values */ -#define AFSREG_CLT_SVC_PARAM_CELL_VALUE "Cell" - -#define AFSREG_CLT_OPENAFS_SUBKEY "Software\\OpenAFS\\Client" -#define AFSREG_CLT_OPENAFS_KEY "HKEY_LOCAL_MACHINE\\" AFSREG_CLT_OPENAFS_SUBKEY -#define AFSREG_CLT_OPENAFS_CELLSERVDB_DIR_VALUE "CellServDBDir" - -#define AFSREG_USER_OPENAFS_SUBKEY "Software\\OpenAFS\\Client" -#define AFSREG_USER_OPENAFS_KEY "HKEY_CURRENT_USER" AFSREG_USER_OPENAFS_SUBKEY - - -/* Extended (alternative) versions of registry access functions */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - REGENTRY_KEY, - REGENTRY_VALUE -} regentry_t; - -extern long -RegOpenKeyAlt(HKEY key, - const char *subKeyName, - DWORD mode, - int create, - HKEY *resultKeyP, - DWORD *resultKeyDispP); - -extern long -RegQueryValueAlt(HKEY key, - const char *valueName, - DWORD *dataTypeP, - void **dataPP, - DWORD *dataSizeP); - -extern long -RegEnumKeyAlt(HKEY key, - char **subkeyNames); - -extern long -RegDeleteKeyAlt(HKEY key, - const char *subKeyName); - -extern long -RegDeleteEntryAlt(const char *entryName, - regentry_t entryType); - -extern long -RegDupKeyAlt(const char *sourceKey, - const char *targetKey); - -#ifdef __cplusplus -}; -#endif - -#endif /* AFSREG_H_ */ diff --git a/src/WINNT/afsreg/afssw.c b/src/WINNT/afsreg/afssw.c deleted file mode 100644 index ffe63508e..000000000 --- a/src/WINNT/afsreg/afssw.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "afsreg.h" -#include "afssw.h" - -static int -StringDataRead(const char *keyName, const char *valueName, char **bufPP); - -static int -StringDataWrite(const char *keyName, const char *valueName, const char *data); - -static int -DwordDataRead(const char *keyName, const char *valueName, DWORD *data); - - - -/* Functions for accessing AFS software configuration information. */ - -/* - * afssw_GetServerInstallDir() -- Get directory in which AFS server software is - * installed. Sets *bufPP to point to allocated buffer containing string. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_GetServerInstallDir(char **bufPP) /* [out] data buffer */ -{ - return StringDataRead(AFSREG_SVR_SW_VERSION_KEY, - AFSREG_SVR_SW_VERSION_DIR_VALUE, - bufPP); -} - - -/* - * afssw_GetClientInstallDir() -- Get directory in which AFS client software is - * installed. Sets *bufPP to point to allocated buffer containing string. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_GetClientInstallDir(char **bufPP) /* [out] data buffer */ -{ - return StringDataRead(AFSREG_CLT_SW_VERSION_KEY, - AFSREG_CLT_SW_VERSION_DIR_VALUE, - bufPP); -} - -/* - * afssw_GetClientCellServDBDir() -- Get directory in which AFS client CellServDB - * file is installed. Sets *bufPP to point to allocated buffer containing string. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_GetClientCellServDBDir(char **bufPP) /* [out] data buffer */ -{ - return StringDataRead(AFSREG_CLT_OPENAFS_KEY, - AFSREG_CLT_OPENAFS_CELLSERVDB_DIR_VALUE, - bufPP); -} - - -/* - * afssw_GetClientCellName() -- Get name of cell in which AFS client is - * configured. Sets *bufPP to point to allocated buffer containing string. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_GetClientCellName(char **bufPP) /* [out] data buffer */ -{ - return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY, - AFSREG_CLT_SVC_PARAM_CELL_VALUE, - bufPP); -} - - -/* - * afssw_SetClientCellName() -- Set name of cell in which AFS client is - * configured. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_SetClientCellName(const char *cellName) -{ - return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY, - AFSREG_CLT_SVC_PARAM_CELL_VALUE, - cellName); -} - - -/* - * afssw_GetServerVersion() -- Get version number of installed server. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_GetServerVersion(unsigned *major, /* major version number */ - unsigned *minor, /* minor version number */ - unsigned *patch) /* patch level */ -{ - DWORD dwMajor, dwMinor, dwPatch; - - if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY, - AFSREG_SVR_SW_VERSION_MAJOR_VALUE, - &dwMajor) || - - DwordDataRead(AFSREG_SVR_SW_VERSION_KEY, - AFSREG_SVR_SW_VERSION_MINOR_VALUE, - &dwMinor) || - - DwordDataRead(AFSREG_SVR_SW_VERSION_KEY, - AFSREG_SVR_SW_VERSION_PATCH_VALUE, - &dwPatch)) { - /* a read failed */ - return -1; - } else { - /* return values */ - *major = dwMajor; - *minor = dwMinor; - *patch = dwPatch; - return 0; - } -} - - -/* - * afssw_GetClientVersion() -- Get version number of installed client. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -afssw_GetClientVersion(unsigned *major, /* major version number */ - unsigned *minor, /* minor version number */ - unsigned *patch) /* patch level */ -{ - DWORD dwMajor, dwMinor, dwPatch; - - if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY, - AFSREG_CLT_SW_VERSION_MAJOR_VALUE, - &dwMajor) || - - DwordDataRead(AFSREG_CLT_SW_VERSION_KEY, - AFSREG_CLT_SW_VERSION_MINOR_VALUE, - &dwMinor) || - - DwordDataRead(AFSREG_CLT_SW_VERSION_KEY, - AFSREG_CLT_SW_VERSION_PATCH_VALUE, - &dwPatch)) { - /* a read failed */ - return -1; - } else { - /* return values */ - *major = dwMajor; - *minor = dwMinor; - *patch = dwPatch; - return 0; - } -} - - - - -/* ----------------------- local functions ------------------------- */ - -/* - * StringDataRead() -- read registry data of type REG_SZ and return in - * allocated buffer. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -static int -StringDataRead(const char *keyName, const char *valueName, char **bufPP) -{ - long status; - HKEY key; - - if (bufPP == NULL) { - errno = EINVAL; - return -1; - } - - status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL); - - if (status == ERROR_SUCCESS) { - DWORD dataType; - char *dataBuf = NULL; - - status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL); - - if (status == ERROR_SUCCESS) { - if (dataType == REG_SZ) { - *bufPP = dataBuf; - } else { - /* invalid data type */ - free(dataBuf); - status = ERROR_INVALID_DATA; - } - } - (void)RegCloseKey(key); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} - - -/* - * StringDataWrite() -- write registry data of type REG_SZ. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -static int -StringDataWrite(const char *keyName, const char *valueName, const char *data) -{ - long status; - HKEY key; - - if (data == NULL) { - errno = EINVAL; - return -1; - } - - status = RegOpenKeyAlt(AFSREG_NULL_KEY, - keyName, KEY_WRITE, 1 /* create */, &key, NULL); - - if (status == ERROR_SUCCESS) { - status = RegSetValueEx(key, - valueName, - 0, REG_SZ, data, strlen(data) + 1); - - (void)RegCloseKey(key); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} - - -/* - * DwordDataRead() -- read registry data of type REG_DWORD. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -static int -DwordDataRead(const char *keyName, const char *valueName, DWORD *data) -{ - long status; - HKEY key; - - status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL); - - if (status == ERROR_SUCCESS) { - DWORD dataType; - DWORD dataBuf; - DWORD dataSize = sizeof(DWORD); - - status = RegQueryValueEx(key, valueName, - NULL, &dataType, (void *)&dataBuf, &dataSize); - - if (status == ERROR_SUCCESS) { - if (dataType == REG_DWORD) { - *data = dataBuf; - } else { - /* invalid data type */ - status = ERROR_INVALID_DATA; - } - } - (void)RegCloseKey(key); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} diff --git a/src/WINNT/afsreg/afssw.h b/src/WINNT/afsreg/afssw.h deleted file mode 100644 index 5eaecbe73..000000000 --- a/src/WINNT/afsreg/afssw.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSSW_H_ -#define AFSSW_H_ - -/* Functions for accessing AFS software configuration information. */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int -afssw_GetServerInstallDir(char **bufPP); - -extern int -afssw_GetClientCellServDBDir(char **bufPP); - -extern int -afssw_GetClientCellDir(char **bufPP); - -extern int -afssw_GetClientCellName(char **bufPP); - -extern int -afssw_SetClientCellName(const char *cellName); - -extern int -afssw_GetServerVersion(unsigned *major, - unsigned *minor, - unsigned *patch); - -extern int -afssw_GetClientVersion(unsigned *major, - unsigned *minor, - unsigned *patch); - -#ifdef __cplusplus -}; -#endif - -#endif /* AFSSW_H_ */ diff --git a/src/WINNT/afsreg/syscfg.c b/src/WINNT/afsreg/syscfg.c deleted file mode 100644 index eafcd7fec..000000000 --- a/src/WINNT/afsreg/syscfg.c +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Functions for accessing NT system configuration information. */ - -#include -#include -#include -#include -#include -#include -#include - -#include "afsreg.h" -#include "syscfg.h" - -static int IsLoopback(char * guid); - -/* syscfg_GetIFInfo - * - * Retrieve IP addresses, subnet masks, MTU sizes, and flags for all - * configured interfaces. - * - * Arguments: - * IN/OUT: - * count - in is max size of arrays. out is number of elements used. - * - * OUT: - * addrs - array of configured IP addresses, in host order. - * masks - array of subnet masks, in host order. - * mtus - array of MTU sizes. - * flags - array of flags. - * - * Return Value: - * Total number of configured interfaces (>= count) or -1 on error. - */ - -int syscfg_GetIFInfo(int *count, int *addrs, int *masks, int *mtus, int *flags) -{ - PMIB_IPADDRTABLE pIpAddrTable = NULL; - ULONG dwSize; - DWORD code; - DWORD index; - DWORD validAddrs = 0; - - int maxCount = *count; - int nConfig = 0; - PIP_ADAPTER_ADDRESSES pAddresses, cAddress; - PMIB_IPADDRTABLE pIpTbl; - ULONG outBufLen = 0; - DWORD dwRetVal = 0; - int n = 0; - DWORD i; - - HMODULE hIpHlp; - DWORD (WINAPI *pGetAdaptersAddresses)(ULONG, DWORD, PVOID, - PIP_ADAPTER_ADDRESSES, PULONG) = 0; - - hIpHlp = LoadLibrary("iphlpapi"); - if (hIpHlp != NULL) { - (FARPROC) pGetAdaptersAddresses = GetProcAddress(hIpHlp, "GetAdaptersAddresses"); - if (pGetAdaptersAddresses == NULL) - FreeLibrary(hIpHlp); - } - - if (pGetAdaptersAddresses == NULL) - return syscfg_GetIFInfo_2000(count, addrs, masks, mtus, flags); - - /* first pass to get the required size of the IP table */ - pIpTbl = (PMIB_IPADDRTABLE) malloc(sizeof(MIB_IPADDRTABLE)); - outBufLen = sizeof(MIB_IPADDRTABLE); - - dwRetVal = GetIpAddrTable(pIpTbl, &outBufLen, FALSE); - if (dwRetVal != ERROR_INSUFFICIENT_BUFFER) { - /* this should have failed with an insufficient buffer because we - didn't give any space to place the IP addresses */ - free(pIpTbl); - *count = 0; - nConfig = -1; - goto done; - } - - /* second pass to get the actual data */ - free(pIpTbl); - pIpTbl = (PMIB_IPADDRTABLE) malloc(outBufLen); - - dwRetVal = GetIpAddrTable(pIpTbl, &outBufLen, FALSE); - if (dwRetVal != NO_ERROR) { - free(pIpTbl); - *count = 0; - nConfig = -1; - goto done; - } - - pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(sizeof(IP_ADAPTER_ADDRESSES)); - - /* first call gets required buffer size */ - if (pGetAdaptersAddresses(AF_INET, - 0, - NULL, - pAddresses, - &outBufLen) == ERROR_BUFFER_OVERFLOW) - { - free(pAddresses); - pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen); - } else { - free(pIpTbl); - *count = 0; - nConfig = -1; - goto done; - } - - /* second call to get the actual data */ - if ((dwRetVal = pGetAdaptersAddresses(AF_INET, - 0, - NULL, - pAddresses, - &outBufLen)) == NO_ERROR) - { - /* we have a list of addresses. go through them and figure out - the IP addresses */ - for (cAddress = pAddresses; cAddress; cAddress = cAddress->Next) { - - /* skip software loopback adapters */ - if (cAddress->IfType == IF_TYPE_SOFTWARE_LOOPBACK) - continue; - - /* also skip interfaces that are not up */ - if (cAddress->OperStatus != 1) - continue; - - /* starting with the AdapterName, which is actually the adapter - instance GUID, check if this is a MS loopback device */ - if (IsLoopback(cAddress->AdapterName)) - continue; - - /* ok. looks good. Now fish out all the addresses from the - address table corresponding to the interface, and add them - to the list */ - for (i=0;idwNumEntries;i++) { - if (pIpTbl->table[i].dwIndex == cAddress->IfIndex) - { - if (n < maxCount) { - addrs[n] = ntohl(pIpTbl->table[i].dwAddr); - masks[n] = ntohl(pIpTbl->table[i].dwMask); - mtus[n] = cAddress->Mtu; - flags[n] = 0; - n++; - } - nConfig++; - } - } - } - - free(pAddresses); - free(pIpTbl); - - *count = n; - } else { - /* again. this is bad */ - free(pAddresses); - free(pIpTbl); - *count = 0; - nConfig = -1; - } - - done: - FreeLibrary(hIpHlp); - return nConfig; -} - -static int IsLoopback(char * guid) -{ - int isloopback = FALSE; - - HKEY hkNet = NULL; - HKEY hkDev = NULL; - HKEY hkDevConn = NULL; - HKEY hkEnum = NULL; - HKEY hkAdapter = NULL; - - char pnpIns[MAX_PATH]; - char hwId[MAX_PATH]; - char service[MAX_PATH]; - - DWORD size; - - /* Open the network adapters key */ - if (FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &hkNet))) - goto _exit; - - /* open the guid key */ - if (FAILED(RegOpenKeyEx(hkNet, guid, 0, KEY_READ, &hkDev))) - goto _exit; - - /* then the connection */ - if (FAILED(RegOpenKeyEx(hkDev, "Connection", 0, KEY_READ, &hkDevConn))) - goto _exit; - - /* and find out the plug-n-play instance ID */ - size = MAX_PATH; - if (FAILED(RegQueryValueEx(hkDevConn, "PnpInstanceID", NULL, NULL, pnpIns, &size))) - goto _exit; - - /* now look in the device ENUM */ - if (FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Enum", 0, KEY_READ, &hkEnum))) - goto _exit; - - /* for the instance that we found above */ - if (FAILED(RegOpenKeyEx(hkEnum, pnpIns, 0, KEY_READ, &hkAdapter))) - goto _exit; - - /* and fetch the harware ID */ - size = MAX_PATH; - if (FAILED(RegQueryValueEx(hkAdapter, "HardwareID", NULL, NULL, hwId, &size))) - goto _exit; - - size = MAX_PATH; - if (FAILED(RegQueryValueEx(hkAdapter, "Service", NULL, NULL, service, &size))) - goto _exit; - - /* and see if it is the loopback adapter */ - if (!stricmp(hwId, "*msloop") || !stricmp(service, "msloop")) - isloopback = TRUE; - - _exit: - if (hkAdapter) - RegCloseKey(hkAdapter); - if (hkEnum) - RegCloseKey(hkEnum); - if (hkDevConn) - RegCloseKey(hkDevConn); - if (hkDev) - RegCloseKey(hkDev); - if (hkNet) - RegCloseKey(hkNet); - - return isloopback; -} - -static int GetInterfaceList(HKEY skey, char **list); -static char *GetNextInterface(char *iflist); -static int GetIP(HKEY skey, char *ifname, int *addr, int *mask); - -int syscfg_GetIFInfo_2000(int *count, int *addrs, int *masks, int *mtus, int *flags) -{ - int maxCount = *count; - char *IFListBase = NULL; - char *IFList, *ifname; - HKEY skey; - int i, n, nConfig; - - if (RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_IPSRV_KEY, - KEY_READ, 0, &skey, NULL)) - return -1; - - if ((nConfig = GetInterfaceList(skey, &IFListBase)) < 0) { - (void) RegCloseKey(skey); - return -1; - } - - IFList = IFListBase; - n = 0; - - while ((n < maxCount) && (ifname = GetNextInterface(IFList))) { - if (!IsLoopback(ifname) && GetIP(skey, ifname, &addrs[n], &masks[n]) == 0 && addrs[n] != 0) { - n++; - } else { - maxCount--; - } - IFList = ifname; - } - - /* And until we get mtu's and flags */ - for (i = 0; i < n; i++) { - mtus[i] = 1500; - flags[i] = 0; - } - - (void) RegCloseKey(skey); - free(IFListBase); - - *count = n; - return nConfig; -} - - -/* GetInterfaceList - * - * Get interface list; list is represented as a multistring. - * Returns number of elements in interface list or -1 on error. - */ -static int GetInterfaceList(HKEY skey, char **list) -{ - HKEY key; - long status; - char *str = NULL; - int size; - DWORD valType; - - if (RegOpenKeyAlt(skey, AFSREG_IPSRV_IFACELIST_SUBKEY, - KEY_READ, 0, &key, NULL)) - return -1; - - status = RegQueryValueAlt(key, AFSREG_IPSRV_IFACELIST_BIND_VALUE, - &valType, &str, NULL); - (void) RegCloseKey(key); - if (status || (valType != REG_MULTI_SZ)) - return -1; - - /* Count strings in multistring. */ - size = 0; - - if (*str != '\0') { - int i; - - for (i = 1; ; i++) { - if (str[i] == '\0') { - /* hit end of string */ - size++; - i++; - if (str[i] == '\0') { - /* hit end of multistring */ - break; - } - } - } - } - *list = str; - return size; -} - - -/* GetNextInterface - * - * Parse interface list. In first call to GetNextInterface(), iflist is - * the list returned by GetInterfaceList(); in successive calls, iflist is - * the pointer returned by the previous call to GetNextInterface(). - * - * Returns pointer to next adapter name, or NULL if done. - */ - -static char *GetNextInterface(char *iflist) -{ - char *ifname; - - /* interface substrings are assumed to be of form \Device\ - * \Tcpip\Parameters\Interfaces\ - */ - ifname = strrchr(iflist, '\\'); - - if (!ifname) { - /* subsequent (not first) call; advance to next interface substring */ - iflist += strlen(iflist) + 1; - /* iflist now points to next interface or end-of-multistring char */ - ifname = strrchr(iflist, '\\'); - } - - if (ifname) { - /* advance to first character of adapter name */ - ifname++; - } - - return ifname; -} - - -/* GetIP - * - * Get IP address associated with interface (adapter name). - * Returns 0 on success and -1 on error. - */ - -static int GetIP(HKEY skey, char *ifname, int *addr, int *mask) -{ - HKEY key; - char *s; - long status; - int len; - char *ipStr = NULL; - char *snMask = NULL; - DWORD valType; - DWORD dwDHCP; - DWORD dwLease; - DWORD dwSize; - - len = strlen(ifname) + 1 + sizeof(AFSREG_IPSRV_ADAPTER_PARAM_SUBKEY); - s = malloc(len); - if (!s) - return -1; - - sprintf(s, "%s\\%s", ifname, AFSREG_IPSRV_ADAPTER_PARAM_SUBKEY); - - status = RegOpenKeyAlt(skey, s, KEY_READ, 0, &key, NULL); - free(s); - - if (status) - return -1; - - dwSize = sizeof(DWORD); - status = RegQueryValueEx(key, "EnableDHCP", NULL, - &valType, &dwDHCP, &dwSize); - if (status || (valType != REG_DWORD)) - dwDHCP = 0; - - if (dwDHCP == 0) { - status = RegQueryValueAlt(key, AFSREG_IPSRV_ADAPTER_PARAM_ADDR_VALUE, - &valType, &ipStr, NULL); - if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { - if (ipStr) free(ipStr); - (void) RegCloseKey(key); - return -1; - } - - status = RegQueryValueAlt(key, AFSREG_IPSRV_ADAPTER_PARAM_MASK_VALUE, - &valType, &snMask, NULL); - if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { - if (snMask) free(snMask); - snMask = NULL; - } - } else { - /* adapter configured via DHCP; address/mask in alternate values */ - dwSize = sizeof(DWORD); - status = RegQueryValueEx(key, "Lease", NULL, - &valType, &dwLease, &dwSize); - if (status || (valType != REG_DWORD) || dwLease == 0) { - (void) RegCloseKey(key); - return -1; - } - - status = RegQueryValueAlt(key, - AFSREG_IPSRV_ADAPTER_PARAM_DHCPADDR_VALUE, - &valType, &ipStr, NULL); - - if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { - if (ipStr) free(ipStr); - (void) RegCloseKey(key); - return -1; - } - - status = RegQueryValueAlt(key, - AFSREG_IPSRV_ADAPTER_PARAM_DHCPMASK_VALUE, - &valType, &snMask, NULL); - - if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { - if (snMask) free(snMask); - snMask = NULL; - } - } - - /* convert ip and subnet. */ - *addr = (int)inet_addr(ipStr); - *addr = ntohl(*addr); - free(ipStr); - - if (snMask) { - *mask = (int)inet_addr(snMask); - *mask = ntohl(*mask); - free(snMask); - } else { - *mask = 0; - } - - (void) RegCloseKey(key); - - return 0; -} - diff --git a/src/WINNT/afsreg/syscfg.h b/src/WINNT/afsreg/syscfg.h deleted file mode 100644 index 6ee002871..000000000 --- a/src/WINNT/afsreg/syscfg.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SYSCFG_H_ -#define SYSCFG_H_ - -/* Functions for accessing NT system configuration information. */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int -syscfg_GetIFInfo(int *count, int *addrs, int *masks, int *mtus, int *flags); - -#ifdef __cplusplus -}; -#endif - -#endif /* SYSCFG_H_ */ diff --git a/src/WINNT/afsreg/test/NTMakefile b/src/WINNT/afsreg/test/NTMakefile deleted file mode 100644 index 62b8749bf..000000000 --- a/src/WINNT/afsreg/test/NTMakefile +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -RELDIR=WINNT\afsreg\test -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) - -test tests: $(OUT)\getifinfo.exe $(OUT)\regman.exe $(OUT)\dupkey.exe - -$(OUT)\getifinfo.exe: $(OUT)\getifinfo.obj $(DESTDIR)\lib\afs\afsreg.lib - $(EXECONLINK) - -$(OUT)\dupkey.exe: $(OUT)\dupkey.obj $(DESTDIR)\lib\afs\afsreg.lib - $(EXECONLINK) - -REGMAN_EXELIBS =\ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afscmd.lib \ - $(DESTDIR)\lib\afs\afscom_err.lib \ - $(DESTDIR)\lib\afs\afsutil.lib - -$(OUT)\regman.exe: $(OUT)\regman.obj $(REGMAN_EXELIBS) - $(EXECONLINK) - -mkdir: - diff --git a/src/WINNT/afsreg/test/dupkey.c b/src/WINNT/afsreg/test/dupkey.c deleted file mode 100644 index de6c90099..000000000 --- a/src/WINNT/afsreg/test/dupkey.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Test of RegDupKeyAlt() */ - -#include -#include - -#include -#include -#include -#include - -#include - -int main(int argc, char *argv[]) -{ - long status; - - if (argc != 3) { - printf("Usage: %s key1 key2\n", argv[0]); - return 1; - } - - status = RegDupKeyAlt(argv[1], argv[2]); - - if (status == ERROR_SUCCESS) { - printf("Registry key duplication succeeded\n"); - } else { - printf("Registry key duplication failed (%d)\n", status); - } -} diff --git a/src/WINNT/afsreg/test/getifinfo.c b/src/WINNT/afsreg/test/getifinfo.c deleted file mode 100644 index 2ad472eb9..000000000 --- a/src/WINNT/afsreg/test/getifinfo.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* -/* getifinfo.c retrives the IP configuration information for the machine. - * NT stores this information in different places depending on the type - * on interface. - */ - -#include -#include - -#include -#include -#include -#include - -#include - - - -#define MAXIPADDRS 16 -int rxi_numNetAddrs; -int addrs[MAXIPADDRS]; -int masks[MAXIPADDRS]; -int mtus[MAXIPADDRS]; -int flags[MAXIPADDRS]; - -main(int ac, char **av) -{ - int maxAddrs = 0; - int i; - char addrStr[32]; - struct in_addr ina; - - rxi_numNetAddrs = MAXIPADDRS; - - if ((maxAddrs = syscfg_GetIFInfo(&rxi_numNetAddrs, - addrs, masks, mtus, flags)) < 0) { - printf("Failed reading interface information\n"); - } else { - printf("Found %d useable addresses, max = %d\n", - rxi_numNetAddrs, maxAddrs); - - for (i=0; i -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - - -static char* whoami; - - -static int DoVptList(struct cmd_syndesc *as, char *arock) -{ - struct vpt_iter vpiter; - struct vptab vpentry; - - if (!vpt_Start(&vpiter)) { - while (!vpt_NextEntry(&vpiter, &vpentry)) { - printf("Partition: %s Device: %s\n", - vpentry.vp_name, vpentry.vp_dev); - } - - (void)vpt_Finish(&vpiter); - } - return 0; -} - -static int DoVptAdd(struct cmd_syndesc *as, char *arock) -{ - char *vpName, *vpDev; - struct vptab vpentry; - - vpName = as->parms[0].items->data; - vpDev = as->parms[1].items->data; - - if (!vpt_PartitionNameValid(vpName)) { - com_err(whoami, 0, "Partition name invalid"); - return 1; - } - - if (!vpt_DeviceNameValid(vpDev)) { - com_err(whoami, 0, "Device name invalid"); - return 1; - } - - strcpy(vpentry.vp_name, vpName); - strcpy(vpentry.vp_dev, vpDev); - - if (vpt_AddEntry(&vpentry)) { - com_err(whoami, 0, "Unable to create vice partition table entry"); - return 1; - } - return 0; -} - -static int DoVptDel(struct cmd_syndesc *as, char *arock) -{ - char *vpName; - - vpName = as->parms[0].items->data; - - if (!vpt_PartitionNameValid(vpName)) { - com_err(whoami, 0, "Partition name invalid"); - return 1; - } - - if (vpt_RemoveEntry(vpName) && errno != ENOENT) { - com_err(whoami, 0, "Unable to remove vice partition table entry"); - return 1; - } - return 0; -} - - -static int DoDirGet(struct cmd_syndesc *as, char *arock) -{ - char *buf; - - if (afssw_GetServerInstallDir(&buf)) { - com_err(whoami, 0, - "Failed reading AFS install dir entry (or does not exist)"); - return 1; - } - - printf("AFS server installation directory: %s\n", buf); - - free(buf); - return (0); -} - - -static int DoDirSet(struct cmd_syndesc *as, char *arock) -{ - long status; - HKEY key; - char *afsPath; - - afsPath = as->parms[0].items->data; - - /* open AFS sw version key; create if does not exist */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_SVR_SW_VERSION_KEY, - KEY_WRITE, 1 /* create */, &key, NULL); - - if (status == ERROR_SUCCESS) { - /* write AFS directory value */ - status = RegSetValueEx(key, AFSREG_SVR_SW_VERSION_DIR_VALUE, - 0, REG_SZ, afsPath, strlen(afsPath) + 1); - - RegCloseKey(key); - } - - if (status) { - com_err(whoami, 0, "Unable to set AFS installation directory entry"); - } - - return (status ? 1 : 0); -} - - -static int DoBosCfg(struct cmd_syndesc *as, char *arock) -{ - char bosSvcPath[AFSDIR_PATH_MAX]; - SC_HANDLE scmHandle, svcHandle; - - /* determine if using specified or default service binary path */ - if (as->parms[0].items) { - /* BOS control service binary path specified */ - sprintf(bosSvcPath, "\"%s\"", as->parms[0].items->data); - } else { - /* no BOS control service binary path specified; check for default */ - char *dirBuf; - - if (afssw_GetServerInstallDir(&dirBuf)) { - com_err(whoami, 0, - "binary path not specified and AFS server installation directory not set"); - return 1; - } - sprintf(bosSvcPath, "\"%s%s/%s\"", - dirBuf, - AFSDIR_CANONICAL_SERVER_BIN_DIRPATH, - AFSREG_SVR_SVC_IMAGENAME_DATA); - } - - /* create BOS control service */ - scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); - - if (scmHandle == NULL) { - DWORD status = GetLastError(); - char *reason = ""; - - if (status == ERROR_ACCESS_DENIED) { - reason = "(insufficient privilege)"; - } - com_err(whoami, 0, "unable to connect to the SCM %s", reason); - return 1; - } - - svcHandle = CreateService(scmHandle, - AFSREG_SVR_SVC_NAME, - AFSREG_SVR_SVC_DISPLAYNAME_DATA, - STANDARD_RIGHTS_REQUIRED, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, - SERVICE_ERROR_NORMAL, - bosSvcPath, - NULL, /* load order group */ - NULL, /* tag id */ - NULL, /* dependencies */ - NULL, /* service start name */ - NULL); /* password */ - - if (svcHandle == NULL) { - DWORD status = GetLastError(); - char *reason = ""; - - if (status == ERROR_SERVICE_EXISTS || status == ERROR_DUP_NAME) { - reason = "(service or display name already exists)"; - } - com_err(whoami, 0, "unable to create service %s", reason); - CloseServiceHandle(scmHandle); - return 1; - } - - CloseServiceHandle(svcHandle); - CloseServiceHandle(scmHandle); - return (0); -} - - -static int DoBosDel(struct cmd_syndesc *as, char *arock) -{ - int rc = 0; - SC_HANDLE scmHandle, svcHandle; - - scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - - if (scmHandle == NULL) { - DWORD status = GetLastError(); - char *reason = ""; - - if (status == ERROR_ACCESS_DENIED) { - reason = "(insufficient privilege)"; - } - com_err(whoami, 0, "unable to connect to the SCM %s", reason); - return 1; - } - - svcHandle = OpenService(scmHandle, - AFSREG_SVR_SVC_NAME, STANDARD_RIGHTS_REQUIRED); - - if (svcHandle == NULL) { - DWORD status = GetLastError(); - - if (status != ERROR_SERVICE_DOES_NOT_EXIST) { - com_err(whoami, 0, "unable to open service"); - rc = 1; - } - CloseServiceHandle(scmHandle); - return rc; - } - - if (!DeleteService(svcHandle)) { - DWORD status = GetLastError(); - - if (status != ERROR_SERVICE_MARKED_FOR_DELETE) { - com_err(whoami, 0, "service delete failed"); - rc = 1; - } - } - CloseServiceHandle(svcHandle); - CloseServiceHandle(scmHandle); - return (rc); -} - -static int DoVersionGet(struct cmd_syndesc *as, char *arock) -{ - unsigned major, minor, patch; - - printf("\n"); - - if (!afssw_GetClientVersion(&major, &minor, &patch)) { - printf("Client: major = %u, minor = %u, patch = %u\n", - major, minor, patch); - } else { - printf("Client version information not available.\n"); - } - - if (!afssw_GetServerVersion(&major, &minor, &patch)) { - printf("Server: major = %u, minor = %u, patch = %u\n", - major, minor, patch); - } else { - printf("Server version information not available.\n"); - } - return 0; -} - - -static void -SetupVptCmd(void) -{ - struct cmd_syndesc *ts; - - ts = cmd_CreateSyntax("vptlist", DoVptList, 0, - "list vice partition table"); - - ts = cmd_CreateSyntax("vptadd", DoVptAdd, 0, - "add entry to vice partition table"); - cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED, "partition name"); - cmd_AddParm(ts, "-dev", CMD_SINGLE, CMD_REQUIRED, "device name"); - - ts = cmd_CreateSyntax("vptdel", DoVptDel, 0, - "remove entry from vice partition table"); - cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_REQUIRED, "partition name"); -} - -static void -SetupDirCmd(void) -{ - struct cmd_syndesc *ts; - - ts = cmd_CreateSyntax("dirget", DoDirGet, 0, - "display the AFS server installation directory"); - - ts = cmd_CreateSyntax("dirset", DoDirSet, 0, - "set the AFS server installation directory"); - cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_REQUIRED, "directory path"); -} - -static void -SetupBosCmd(void) -{ - struct cmd_syndesc *ts; - - ts = cmd_CreateSyntax("boscfg", DoBosCfg, 0, - "configure the AFS BOS control service"); - cmd_AddParm(ts, "-path", CMD_SINGLE, CMD_OPTIONAL, "service binary path"); - - ts = cmd_CreateSyntax("bosdel", DoBosDel, 0, - "delete (unconfigure) the AFS BOS control service"); -} - -static void -SetupVersionCmd(void) -{ - struct cmd_syndesc *ts; - - ts = cmd_CreateSyntax("version", DoVersionGet, 0, - "display AFS version information"); -} - - - - -int main(int argc, char *argv[]) -{ - int code; - - whoami = argv[0]; - - /* initialize command syntax */ - initialize_CMD_error_table(); - - SetupVptCmd(); - SetupDirCmd(); - SetupBosCmd(); - SetupVersionCmd(); - - /* execute command */ - code = cmd_Dispatch(argc, argv); - - return (code); -} diff --git a/src/WINNT/afsreg/vptab.c b/src/WINNT/afsreg/vptab.c deleted file mode 100644 index 9cb3f1d0a..000000000 --- a/src/WINNT/afsreg/vptab.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Functions and definitions for accessing the vice partition table */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "afsreg.h" -#include "vptab.h" - -#define PARTITION_NAME_PREFIX "/vicep" - - -/* - * vpt_PartitionNameValid() -- Check partition name syntax. - * - * RETURN CODES: 1 valid, 0 not valid - */ -int -vpt_PartitionNameValid(const char *vpname) -{ - int rc = 0; - - /* Only allowing full name, not any of the standard shorthands. - * Assumes C locale. - * NOTE: yet another incarnation of parsing code; should be consolidated. - */ - if (!strncmp(vpname, - PARTITION_NAME_PREFIX, sizeof(PARTITION_NAME_PREFIX) - 1)) { - /* prefix is correct; check suffix */ - const char *vpsuffix = vpname + (sizeof(PARTITION_NAME_PREFIX) - 1); - size_t vpsuffixLen = strlen(vpsuffix); - - if (vpsuffixLen == 1) { - /* must be 'a' - 'z' (0 .. 25) */ - if (islower(vpsuffix[0])) { - rc = 1; - } - } else if (vpsuffixLen == 2) { - /* must be 'aa' - 'zz' and in range (26 .. 255) */ - if (islower(vpsuffix[0]) && islower(vpsuffix[1])) { - int vpsuffixVal = ((vpsuffix[0] - 'a') * 26 + - (vpsuffix[1] - 'a') + 26); - if (vpsuffixVal <= 255) { - rc = 1; - } - } - } - } - return rc; -} - - -/* - * vpt_DeviceNameValid() -- Check device name syntax. - * - * RETURN CODES: 1 valid, 0 not valid - */ -int -vpt_DeviceNameValid(const char *devname) -{ - /* assuming C locale */ - if (isupper(devname[0]) && devname[1] == ':' && devname[2] == '\0') { - return 1; - } else { - return 0; - } -} - - -/* - * vpt_Start() -- Initialize iteration for reading vice partition table. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ - -int -vpt_Start(struct vpt_iter *iterp) /* [out] iteration handle to initialize */ -{ - long status; - HKEY key; - - memset(iterp, 0, sizeof(*iterp)); - - /* open canonical Afstab key */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_SVR_SVC_AFSTAB_KEY, - KEY_READ, 0, &key, NULL); - - if (status == ERROR_SUCCESS) { - /* enumerate subkeys, each of which represents a vice partition */ - status = RegEnumKeyAlt(key, &iterp->vpenum); - (void)RegCloseKey(key); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} - - -/* - * vpt_NextEntry() -- Return next vice partition table entry. - * - * RETURN CODES: 0 success, -1 no more entries (ENOENT) or failed (errno set). - */ - -int -vpt_NextEntry(struct vpt_iter *iterp, /* [in] valid iteration handle */ - struct vptab *vptabp) /* [out] next partiton table entry */ -{ - long status; - HKEY tabKey, vpKey; - char *nextNamep; - - if (iterp->vpenum == NULL) { - /* no partition entries (or invalid iteration handle) */ - errno = ENOENT; - return -1; - } - - /* find name of next partition entry to examine in multistring enum */ - if (iterp->last == NULL) { - /* first call */ - nextNamep = iterp->last = iterp->vpenum; - } else { - /* subsequent call */ - if (*iterp->last != '\0') { - /* not at end of multistring; advance to next name */ - iterp->last += strlen(iterp->last) + 1; - } - nextNamep = iterp->last; - } - - if (*nextNamep == '\0') { - /* end of multistring; no more entries */ - errno = ENOENT; - return -1; - } - - if (strlen(nextNamep) >= VPTABSIZE_NAME) { - /* invalid partition name entry */ - errno = EINVAL; - return -1; - } - strcpy(vptabp->vp_name, nextNamep); - - /* open canonical Afstab key */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_SVR_SVC_AFSTAB_KEY, - KEY_READ, 0, &tabKey, NULL); - - if (status == ERROR_SUCCESS) { - /* open key representing vice partition */ - status = RegOpenKeyAlt(tabKey, nextNamep, - KEY_READ, 0, &vpKey, NULL); - - if (status == ERROR_SUCCESS) { - /* read partition attributes */ - DWORD dataType, dataSize = VPTABSIZE_DEV; - - status = RegQueryValueEx(vpKey, - AFSREG_SVR_SVC_AFSTAB_DEVNAME_VALUE, - NULL, &dataType, vptabp->vp_dev, - &dataSize); - - if (status == ERROR_SUCCESS && dataType != REG_SZ) { - /* invalid device name type */ - status = ERROR_INVALID_PARAMETER; - } - (void)RegCloseKey(vpKey); - } - (void)RegCloseKey(tabKey); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} - - -/* - * vpt_Finish() -- Terminate iteration for vice partition table. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -vpt_Finish(struct vpt_iter *iterp) /* [in] iteration handle to terminate */ -{ - if (iterp->vpenum) { - free(iterp->vpenum); - } - memset(iterp, 0, sizeof(*iterp)); - return 0; -} - - -/* - * vpt_AddEntry() -- Add or update vice partition table entry. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -vpt_AddEntry(const struct vptab *vptabp) -{ - long status; - HKEY tabKey, vpKey; - const char *vpName, *vpDev; - - vpName = vptabp->vp_name; - vpDev = vptabp->vp_dev; - - if (!vpt_PartitionNameValid(vpName) || !vpt_DeviceNameValid(vpDev)) { - errno = EINVAL; - return -1; - } - - /* open canonical Afstab key; create if doesn't exist */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_SVR_SVC_AFSTAB_KEY, - KEY_WRITE, 1 /* create */, &tabKey, NULL); - - if (status == ERROR_SUCCESS) { - /* open key representing vice partition; create if doesn't exist */ - status = RegOpenKeyAlt(tabKey, vpName, - KEY_WRITE, 1 /* create */, &vpKey, NULL); - - if (status == ERROR_SUCCESS) { - /* write partition attributes */ - status = RegSetValueEx(vpKey, AFSREG_SVR_SVC_AFSTAB_DEVNAME_VALUE, - 0, REG_SZ, vpDev, strlen(vpDev) + 1); - - RegCloseKey(vpKey); - } - - RegCloseKey(tabKey); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} - - -/* - * vpt_RemoveEntry() -- Remove vice partition table entry. - * - * RETURN CODES: 0 success, -1 failed (errno set) - */ -int -vpt_RemoveEntry(const char *vpname) -{ - long status; - HKEY tabKey; - - if (!vpt_PartitionNameValid(vpname)) { - errno = EINVAL; - return -1; - } - - /* open canonical Afstab key */ - status = RegOpenKeyAlt(AFSREG_NULL_KEY, AFSREG_SVR_SVC_AFSTAB_KEY, - KEY_WRITE, 0, &tabKey, NULL); - - if (status == ERROR_SUCCESS) { - /* delete key representing vice partition */ - status = RegDeleteKey(tabKey, vpname); - } - - if (status) { - errno = nterr_nt2unix(status, EIO); - return -1; - } - return 0; -} diff --git a/src/WINNT/afsreg/vptab.h b/src/WINNT/afsreg/vptab.h deleted file mode 100644 index 69fbab650..000000000 --- a/src/WINNT/afsreg/vptab.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef VPTAB_H_ -#define VPTAB_H_ - -/* Functions and definitions for accessing the vice partition table */ - -/* Sizes of strings */ - -#define VPTABSIZE_NAME 32 -#define VPTABSIZE_DEV 32 - -/* Entry structure */ - -struct vptab { - char vp_name[VPTABSIZE_NAME]; /* vice partition name */ - char vp_dev[VPTABSIZE_DEV]; /* device path */ -}; - -struct vpt_iter { - char *last; - char *vpenum; -}; - - -#ifdef __cplusplus -extern "C" { -#endif - -extern int -vpt_Start(struct vpt_iter *iterp); - -extern int -vpt_NextEntry(struct vpt_iter *iterp, - struct vptab *vptabp); - -extern int -vpt_Finish(struct vpt_iter *iterp); - -extern int -vpt_AddEntry(const struct vptab *vptabp); - -extern int -vpt_RemoveEntry(const char *vpname); - -extern int -vpt_PartitionNameValid(const char *vpname); - -extern int -vpt_DeviceNameValid(const char *devname); - -#ifdef __cplusplus -} -#endif - -#endif /* VPTAB_H_ */ diff --git a/src/WINNT/afssvrcfg/.cvsignore b/src/WINNT/afssvrcfg/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/afssvrcfg/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/afssvrcfg/NTMakefile b/src/WINNT/afssvrcfg/NTMakefile deleted file mode 100644 index 8ce0056b9..000000000 --- a/src/WINNT/afssvrcfg/NTMakefile +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# AFSDEV_AUXCDEFINES = /DUNICODE -RELDIR=WINNT\afssvrcfg -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# Definitions for building afssvrcfg.exe. - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\afssvrcfg.exe - -EXEOBJS =\ - $(OUT)\char_conv.obj \ - $(OUT)\admin_info_dlg.obj \ - $(OUT)\cfg_utils.obj \ - $(OUT)\create_partition_dlg.obj \ - $(OUT)\file_server_page.obj \ - $(OUT)\graphics.obj \ - $(OUT)\info_page.obj \ - $(OUT)\intro_page.obj \ - $(OUT)\partitions_page.obj \ - $(OUT)\partition_page.obj \ - $(OUT)\replicatition_page.obj \ - $(OUT)\services_page.obj \ - $(OUT)\toolbox.obj \ - $(OUT)\afscfg.obj \ - $(OUT)\backup_server_page.obj \ - $(OUT)\config_server_page.obj \ - $(OUT)\db_server_page.obj \ - $(OUT)\get_cur_config.obj \ - $(OUT)\help.obj \ - $(OUT)\info2_page.obj \ - $(OUT)\logfile.obj \ - $(OUT)\partition_utils.obj \ - $(OUT)\root_afs_page.obj \ - $(OUT)\sys_control_page.obj \ - $(OUT)\volume_utils.obj \ - $(OUT)\salvage_dlg.obj \ - $(OUT)\get_pw_dlg.obj \ - $(OUT)\salvage_results_dlg.obj \ - $(OUT)\validation.obj \ - $(OUT)\afscfg_stub.res - -VCLIBS =\ - comctl32.lib \ - mpr.lib - -EXELIBS =\ - $(DESTDIR)\lib\afs\taafsapplib.lib \ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\afs\afscfgadmin.lib \ - $(DESTDIR)\lib\afs\afsbosadmin.lib \ - $(DESTDIR)\lib\afs\afsvosadmin.lib \ - $(DESTDIR)\lib\afs\afsclientadmin.lib \ - $(DESTDIR)\lib\afs\afsadminutil.lib \ - $(DESTDIR)\lib\lanahelper.lib - -$(EXEFILE): $(EXEOBJS) $(EXELIBS) - $(EXEGUILINK) $(VCLIBS) - $(EXEPREP) - - -############################################################################ -# Definitions for generating versioninfo resource via RC - -$(OUT)\afscfg_stub.res:afscfg_stub.rc AFS_component_version_number.h - -############################################################################ -# Install target; primary makefile target - -install: $(EXEFILE) lang - - -############################################################################ -# Language target - -lang:: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - $(CD) lang - @if exist AFS_component_version_number.h del AFS_component_version_number.h - for /f %l in ('dir /B ??_??') do ( if exist @$(NTLANG) do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile clean ) - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/afssvrcfg/admin_info_dlg.cpp b/src/WINNT/afssvrcfg/admin_info_dlg.cpp deleted file mode 100644 index b179c5084..000000000 --- a/src/WINNT/afssvrcfg/admin_info_dlg.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - - -/* - * INCLUDES ___________________________________________________________________ - * - */ -#include "afscfg.h" // Main header for this application -#include "resource.h" -#include "admin_info_dlg.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; // HWND for this page's dialog -static GET_ADMIN_INFO_OPTIONS eOptions; // Are we asking user for another server? - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void CheckEnableButtons(); -static void SaveDlgInfo(); -static void ShowPageInfo(); - -BOOL CALLBACK AdminInfoDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL GetAdminInfo(HWND hParent, GET_ADMIN_INFO_OPTIONS options) -{ - eOptions = options; - - int nResult = ModalDialog(IDD_ADMIN_INFO, hParent, (DLGPROC)AdminInfoDlgProc); - - return (nResult == IDOK); -} - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK AdminInfoDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp(IDD_ADMIN_INFO, hwndDlg, msg, wp, lp)) - return TRUE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDC_ADMIN_NAME: - case IDC_ADMIN_PW: - case IDC_HOSTNAME: - case IDC_SCS: - if (HIWORD(wp) == EN_CHANGE) - CheckEnableButtons(); - break; - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - break; - - - case IDOK: - SaveDlgInfo(); - EndDialog(hDlg, IDOK); - break; - } - break; - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - static int nOffset = 0; - - hDlg = hwndDlg; - - // Hide the additional server stuff if we don't need it - if (eOptions == GAIO_LOGIN_ONLY) { - HideAndDisable(hDlg, IDC_HOSTNAME_FRAME); - HideAndDisable(hDlg, IDC_HOSTNAME_PROMPT); - HideAndDisable(hDlg, IDC_HOSTNAME_LABEL); - HideAndDisable(hDlg, IDC_HOSTNAME); - - if (nOffset == 0) { - // Get dimensions of the frame containing the things we will hide or show - RECT rectFrame; - GetWindowRect(GetDlgItem(hDlg, IDC_HOSTNAME_FRAME), &rectFrame); - - // Get original position of the buttons - RECT rectButton; - GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rectButton); - - // Figure out how far the buttons will have to move to be at the top - // of the frame. - nOffset = rectButton.top - rectFrame.top; - } - - // Move the buttons - MoveWnd(hDlg, IDOK, 0, -nOffset); - MoveWnd(hDlg, IDCANCEL, 0, -nOffset); - MoveWnd(hDlg, IDHELP, 0, -nOffset); - - // Resize the dialog - RECT rectDlg; - GetWindowRect(hDlg, &rectDlg); - MoveWindow(hDlg, rectDlg.left, rectDlg.top, rectDlg.right - rectDlg.left + 1, rectDlg.bottom - rectDlg.top - nOffset, TRUE); - - } - - ShowPageInfo(); -} - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CheckEnableButtons() -{ - BOOL bDisable = FALSE; - - TCHAR szDummy[cchRESOURCE]; - - bDisable |= lstrlen(GetWndText(hDlg, IDC_ADMIN_NAME, szDummy)) == 0; - bDisable |= lstrlen(GetWndText(hDlg, IDC_ADMIN_PW, szDummy)) == 0; - - SetEnable(hDlg, IDOK, (ENABLE_STATE)!bDisable); -} - -static void SaveDlgInfo() -{ - TCHAR szText[cchRESOURCE]; - - lstrncpy(g_CfgData.szAdminName, GetWndText(hDlg, IDC_ADMIN_NAME, szText), MAX_ADMIN_NAME_LEN); - lstrncpy(g_CfgData.szAdminPW, GetWndText(hDlg, IDC_ADMIN_PW, szText), MAX_ADMIN_PW_LEN); - - if (eOptions == GAIO_GET_SCS) - lstrncpy(g_CfgData.szSysControlMachine, GetWndText(hDlg, IDC_HOSTNAME, szText), MAX_MACHINE_NAME_LEN); -} - -static void ShowPageInfo() -{ - SetWndText(hDlg, IDC_ADMIN_NAME, g_CfgData.szAdminName); - SetWndText(hDlg, IDC_ADMIN_PW, g_CfgData.szAdminPW); - - if (eOptions == GAIO_GET_SCS) - SetWndText(hDlg, IDC_HOSTNAME, g_CfgData.szSysControlMachine); -} - diff --git a/src/WINNT/afssvrcfg/admin_info_dlg.h b/src/WINNT/afssvrcfg/admin_info_dlg.h deleted file mode 100644 index 735bb1c20..000000000 --- a/src/WINNT/afssvrcfg/admin_info_dlg.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _ADMIN_INFO_DLG_H_ -#define _ADMIN_INFO_DLG_H_ - -// Each option includes the ones before it. -enum GET_ADMIN_INFO_OPTIONS { GAIO_LOGIN_ONLY, GAIO_GET_SCS }; - -BOOL GetAdminInfo(HWND hParent, GET_ADMIN_INFO_OPTIONS eOptions); - -#endif // _ADMIN_INFO_DLG_H_ - diff --git a/src/WINNT/afssvrcfg/afscfg.cpp b/src/WINNT/afssvrcfg/afscfg.cpp deleted file mode 100644 index 511a43543..000000000 --- a/src/WINNT/afssvrcfg/afscfg.cpp +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ - -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" -#include "graphics.h" -#include -#include "get_cur_config.h" -#include "partition_utils.h" -extern "C" { -#include -#include -} -#include - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void SetConfigDefaults(); -static void RunCfgTool(); -static void RunWizard(); -static void CloseLibHandles(BOOL bExiting = FALSE); - -void RegisterWizardHelp(); -void RegisterConfigToolHelp(); - -// These are the prototypes for the dialog procs of each wizard page. -BOOL CALLBACK IntroPageDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK InfoPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK InfoPage2DlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK FileServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK DBServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK BackupPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK PartitionPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK RootAfsPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK ReplicationPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK SysControlPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK ConfigServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); - - -static WIZARD_STATE g_aStates[] = { - { sidSTEP_ONE, IDD_INTRO_PAGE, (DLGPROC)IntroPageDlgProc, 0 }, - { sidSTEP_TWO, IDD_INFO_PAGE, (DLGPROC)InfoPageDlgProc, 0 }, - { sidSTEP_THREE, IDD_INFO_PAGE2_FIRST_SERVER, (DLGPROC)InfoPage2DlgProc, 0 }, - { sidSTEP_FOUR, IDD_INFO_PAGE2_NOT_FIRST_SERVER,(DLGPROC)InfoPage2DlgProc, 0 }, - { sidSTEP_FIVE, IDD_FILE_SERVER_PAGE, (DLGPROC)FileServerPageDlgProc, 0 }, - { sidSTEP_SIX, IDD_DB_SERVER_PAGE, (DLGPROC)DBServerPageDlgProc, 0 }, - { sidSTEP_SEVEN, IDD_BACKUP_SERVER_PAGE, (DLGPROC)BackupPageDlgProc, 0 }, - { sidSTEP_EIGHT, IDD_PARTITION_PAGE, (DLGPROC)PartitionPageDlgProc, 0 }, - { sidSTEP_NINE, IDD_ROOT_VOLUMES_PAGE, (DLGPROC)RootAfsPageDlgProc, 0 }, - { sidSTEP_TEN, IDD_REPLICATION_PAGE, (DLGPROC)ReplicationPageDlgProc, 0 }, - { sidSTEP_ELEVEN, IDD_SYS_CONTROL_PAGE, (DLGPROC)SysControlPageDlgProc, 0 }, - { sidSTEP_TWELVE, IDD_CONFIG_SERVER_PAGE, (DLGPROC)ConfigServerPageDlgProc, 0 } -}; - -size_t g_nNumStates = sizeof(g_aStates) / sizeof(g_aStates[0]); - - -// Res ID's of text descriptions of each state -UINT g_StateDesc[] = { - IDS_INTRO_PAGE, - IDS_INFO_PAGE, - IDS_INFO_PAGE2, - IDS_INFO_PAGE2, - IDS_FS_PAGE, - IDS_DB_PAGE, - IDS_BK_PAGE, - IDS_PARTITION_PAGE, - IDS_ROOT_AFS_PAGE, - IDS_REP_PAGE, - IDS_SC_PAGE, - IDS_CONFIG_PAGE -}; - - - -/* - * EXPORTED VARIABLES _________________________________________________________________ - * - */ -LPWIZARD g_pWiz = NULL; -LPPROPSHEET g_pSheet = NULL; - -CFG_DATA g_CfgData; - -void *g_hToken = 0; -void *g_hCell = 0; -void *g_hClient = 0; -void *g_hServer = 0; - -static void *hClientCell = 0; - -LOGFILE g_LogFile; - - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ -extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pszCmdLineA, int nCmdShow) -{ - afs_status_t nStatus; - - TaLocale_LoadCorrespondingModule (hInst); - - // Tell the applib our application's name - TCHAR szAppName[cchRESOURCE]; - AfsAppLib_SetAppName(GetResString(GetAppTitleID(), szAppName)); - - // Open the admin libraries - int nResult = afsclient_Init(&nStatus); - if (!nResult) { - ShowError(0, nStatus, IDS_CANT_INIT_ADMIN_LIBS); - return 0; - } - - // Open the log file - char szLogPath[MAX_PATH]; - sprintf(szLogPath, "%s\\%s", AFSDIR_SERVER_LOGS_DIRPATH, LOG_FILE_NAME); - if (!g_LogFile.Open(szLogPath)) - ShowError(0, 0, IDS_CANT_OPEN_LOG_FILE); - - // Register the help file with the applib's help system - AfsAppLib_RegisterHelpFile(TEXT("TaAfsCfg.hlp")); - - /* Start up sockets */ - WSADATA WSAjunk; - WSAStartup(0x0101, &WSAjunk); - - memset(&g_CfgData, 0, sizeof(CFG_DATA)); - - // Get this machine's local name - char szLocalName[sizeof(g_CfgData.szLocalName) / sizeof(TCHAR)]; - if (gethostname(szLocalName, sizeof(szLocalName)) != 0) { - ShowError(GetFocus(), WSAGetLastError(), IDS_ERROR_LOCAL_HOST_NAME); - return 0; - } - CopyAnsiToString(g_CfgData.szLocalName, szLocalName); - - // Turn the local name into a host name - struct hostent *pHostEnt = gethostbyname(szLocalName); - if (!pHostEnt) { - ShowError(GetFocus(), WSAGetLastError(), IDS_ERROR_HOST_NAME); - return 0; - } - CopyAnsiToString(g_CfgData.szHostname, pHostEnt->h_name, sizeof(g_CfgData.szHostname)); - - RegisterFastListClass(); - - // Get current config status - BOOL bCanceled = FALSE; - DWORD dwStatus = GetCurrentConfig(NULL, bCanceled); - if (dwStatus || bCanceled) { - if (!bCanceled) - ShowError(GetFocus(), dwStatus, IDS_CONFIG_CHECK_FAILED); - return 0; - } - - // Run the appropriate interface - if ((strstr(_strlwr(pszCmdLineA), "wizard") != 0)) - RunWizard(); - else - RunCfgTool(); - - FreePartitionTable(); - - // Disconnect from the config and admin libraries - CloseLibHandles(TRUE); - - return 0; -} - -/* - * This is a dialog proc that is shared by all of the wizard pages. It - * handles things that are common to all of them. Each page also has its - * own dialog proc. - */ -BOOL CALLBACK WizStep_Common_DlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - // Get the dialog's resource ID - int nIDD = GetWindowLong(hRHS, GWL_ID); - - if (AfsAppLib_HandleHelp(nIDD, hRHS, msg, wp, lp)) - return TRUE; - - switch (msg) { - case WM_INITDIALOG: MakeBold(hRHS, IDC_TITLE); - RedrawGraphic(); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDCANCEL: - QueryCancelWiz(); - return TRUE; - } - break; - } - - return FALSE; -} - -BOOL QueryCancelWiz() -{ - int nChoice = Message(MB_YESNO, IDS_WIZARD_APP_TITLE, IDS_CANCEL_DESC); - if (nChoice == IDYES) { - g_LogFile.Write("User has chosen to cancel the program.\r\n"); - if (g_pWiz) - g_pWiz->Show(FALSE); - return TRUE; - } - - return FALSE; -} - - -/* - * Accessor functions for the g_CfgData variable. There are versions - * for both TCHARs and char *'s. - */ -TCHAR GetDeviceName() { return g_CfgData.chDeviceName; } -LPTSTR GetPartitionName() { return g_CfgData.szPartitionName; } -LPTSTR GetHostName() { return g_CfgData.szHostname; } -LPTSTR GetSysControlMachine() { return g_CfgData.szSysControlMachine; } -LPTSTR GetCellName() { return g_CfgData.szCellName; } -LPTSTR GetServerPW() { return g_CfgData.szServerPW; } -LPTSTR GetAdminName() { return g_CfgData.szAdminName; } -LPTSTR GetAdminPW() { return g_CfgData.szAdminPW; } -LPTSTR GetAdminUID() { return g_CfgData.szAdminUID; } -LPTSTR GetLocalName() { return g_CfgData.szLocalName; } -LPTSTR GetHostname() { return g_CfgData.szHostname; } -LPTSTR GetCellServDbHostname() { return g_CfgData.szCellServDbHostname; } -LPTSTR GetClientCellName() { return g_CfgData.szClientCellName; } -LPTSTR GetSalvageLogFileName() { return g_CfgData.szSalvageLogFileName; } - -LPTSTR GetClientNetbiosName() -{ - static TCHAR szValue[MAX_MACHINE_NAME_LEN + 1] = ""; - - if ( szValue[0] == 0 ) - CopyAnsiToString(GetClientNetbiosNameA(), szValue); - - return szValue; -} - -char GetDeviceNameA() -{ - static char szValueA[2]; - - TCHAR devName[2] = TEXT("X"); - devName[0] = g_CfgData.chDeviceName; - - CopyStringToAnsi(szValueA, devName); - - return szValueA[0]; -} - -char *GetPartitionNameA() -{ - static char szValueA[MAX_PARTITION_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szPartitionName); - - return szValueA; -} - -char *GetSysControlMachineA() -{ - static char szValueA[MAX_MACHINE_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szSysControlMachine); - - return szValueA; -} - -char *GetCellNameA() -{ - static char szValueA[MAX_CELL_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szCellName); - - return szValueA; -} - -char *GetServerPWA() -{ - static char szValueA[MAX_SERVER_PW_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szServerPW); - - return szValueA; -} - -char *GetAdminNameA() -{ - static char szValueA[MAX_ADMIN_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szAdminName); - - return szValueA; -} - -char *GetAdminPWA() -{ - static char szValueA[MAX_ADMIN_PW_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szAdminPW); - - return szValueA; -} - -char *GetAdminUIDA() -{ - static char szValueA[MAX_UID_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szAdminUID); - - return szValueA; -} - -char *GetLocalNameA() -{ - static char szValueA[MAX_MACHINE_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szLocalName); - - return szValueA; -} - -char *GetHostnameA() -{ - static char szValueA[MAX_MACHINE_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szHostname); - - return szValueA; -} - -char *GetCellServDbHostnameA() -{ - static char szValueA[MAX_MACHINE_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szCellServDbHostname); - - return szValueA; -} - -char *GetClientCellNameA() -{ - static char szValueA[MAX_CELL_NAME_LEN + 1]; - - CopyStringToAnsi(szValueA, g_CfgData.szClientCellName); - - return szValueA; -} - -char *GetClientNetbiosNameA() -{ - static char szValueA[MAX_MACHINE_NAME_LEN + 1]=""; - - if ( szValueA[0] == 0 ) - lana_GetNetbiosName(szValueA, LANA_NETBIOS_NAME_FULL); - - return szValueA; -} - -char *GetSalvageLogFileNameA() -{ - static char szValueA[_MAX_PATH]; - - CopyStringToAnsi(szValueA, g_CfgData.szSalvageLogFileName); - - return szValueA; -} - - -BOOL GetLibHandles(afs_status_t *pStatus) -{ - ASSERT(g_CfgData.szHostname[0]); - - int nResult; - - // ************************* NOTE ******************************** - // * You MUST have already determined whether or not the host - // * and client config info is valid before calling this function. - // *************************************************************** - - // This function can be called at any time to get handles to the cell and - // the config library. It will try to get the most powerful handle to the - // cell that it can, and then use that to open the config library. If the - // libraries are already open, it will close them first. Two handles to - // the config library will be opened, one to the server to be configured, - // and one to the client machine we are configuring from. - - // There are two types of cell handles, NULL and Standard. A null handle - // can make calls to any server except DB servers. We need this primarily - // to talk to the bos server to determine the machine's current configuration, - // and to configure the client information if it is not already. A standard - // handle can talk to any server. Standard handles can be either authenticated - // or unauthenticated. - - // Close all current handles - CloseLibHandles(); - - g_LogFile.Write("Getting handles to the cell and the config library.\r\n"); - - if (!hClientCell) { - // Start by getting a null cell handle and using it to open the client - // connection to the config library. - g_LogFile.Write("Opening a NULL cell handle to use with the client config library handle.\r\n"); - nResult = afsclient_NullCellOpen(&hClientCell, pStatus); - if (!nResult) { - g_LogFile.Write("Failed to open a NULL cell handle: %lx.\r\n", (unsigned long)*pStatus); - return FALSE; - } - - // Get the client handle. We never need a better handle than this - // for the client, and so this handle will never be upgraded. - g_LogFile.Write("Getting config handle for the client.\r\n"); - if (!cfg_HostOpen(hClientCell, GetHostnameA(), &g_hClient, pStatus)) { - g_LogFile.Write("Failed to get config handle: %lx.\r\n", (unsigned long)*pStatus); - return FALSE; - } - } - - // Now we need to get the most powerful cell handle that we can and use it - // to open the config library for the server. - - // If the client info is valid and we know what cell the server should be in, - // and the client has that cell in its CellServDB, then we can get a Standard cell - // handle. However there is an exception: if this is the first server in the - // cell then there may not yet be an authentication server to talk to. In that - // case we use a null cell handle. - if (g_CfgData.bValidClientInfo && // Client config is valid - g_CfgData.szCellName[0] && // We have a cell name - (!g_CfgData.bFirstServer || g_CfgData.bAuthServerRunning)) // Auth server is running - { - g_LogFile.Write("Opening a non-NULL cell handle to use with the server config library handle.\r\n"); - - // Do we have the user info necessary to authenticate? - BOOL bHaveUserInfo = g_CfgData.szAdminName[0] && g_CfgData.szAdminPW[0]; - - // Open a standard cell handle. szAdminName and szAdminPW will either be NULL, or - // if they have been entered by the user, will be the admin name and password strings. - if ((!g_CfgData.bFirstServer || g_CfgData.bAdminPrincipalCreated) && bHaveUserInfo) { - g_LogFile.Write("Getting tokens in cell %s for user '%s'.\r\n", GetCellNameA(), GetAdminNameA()); - nResult = afsclient_TokenGetNew(GetCellNameA(), GetAdminNameA(), GetAdminPWA(), &g_hToken, pStatus); - } else { - g_LogFile.Write("Getting unauthenticated tokens for cell '%s'.\r\n", GetCellNameA()); - nResult = afsclient_TokenGetNew(GetCellNameA(), "", "", &g_hToken, pStatus); - } - - if (!nResult) { - g_LogFile.Write("Failed to get tokens for the specified cell: %lx.\r\n", (unsigned long)*pStatus); - return FALSE; - } - - // If the admin name and password are NULL, then this will be an unauthenticated - // connection to the cell. - g_LogFile.Write("Getting cell handle for cell %s.\r\n", GetCellNameA()); - nResult = afsclient_CellOpen(GetCellNameA(), g_hToken, &g_hCell, pStatus); - if (!nResult) { - g_LogFile.Write("Failed to open the cell: %lx.\r\n", (unsigned long)*pStatus); - return FALSE; - } - } else { - g_LogFile.Write("Opening a NULL cell handle to use with the server config library handle.\r\n"); - nResult = afsclient_NullCellOpen(&g_hCell, pStatus); - if (!nResult) { - g_LogFile.Write("Failed to open a NULL cell handle: %lx.\r\n", (unsigned long)*pStatus); - return FALSE; - } - } - - // Get the server handle - g_LogFile.Write("Getting config library handle for the server.\r\n"); - if (!cfg_HostOpen(g_hCell, GetHostnameA(), &g_hServer, pStatus)) { - g_LogFile.Write("Failed to get config library handle for the server: %lx.\r\n", (unsigned long)*pStatus); - return FALSE; - } - - return TRUE; -} - -BOOL GetHandles(HWND hParentDlg) -{ - afs_status_t nStatus; - - if (!GetLibHandles(&nStatus)) { - ShowError(hParentDlg, nStatus, IDS_GET_TOKENS_ERROR); - g_CfgData.szAdminPW[0] = 0; - return FALSE; - } - - return TRUE; -} - - -/* - * Static FUNCTIONS _________________________________________________________________ - * - */ -static void CloseLibHandles(BOOL bExiting) -{ - afs_status_t nStatus; - - // We will close them in the reverse order of their creation. - - if (g_hServer) { - cfg_HostClose(g_hServer, &nStatus); - g_hServer = 0; - } - - if (g_hCell) { - afsclient_CellClose(g_hCell, &nStatus); - g_hCell = 0; - } - - if (g_hToken) { - afsclient_TokenClose(g_hToken, &nStatus); - g_hToken = 0; - } - - // Only close the client cfg and cell handles if we are exiting. - if (bExiting) { - if (g_hClient) { - cfg_HostClose(g_hClient, &nStatus); - g_hClient = 0; - } - - if (hClientCell) { - afsclient_CellClose(hClientCell, &nStatus); - hClientCell = 0; - } - } -} - -static void SetConfigDefaults() -{ - if (g_CfgData.bWizard) { - if (g_CfgData.configFS == CS_NULL) - g_CfgData.configFS = CS_CONFIGURE; - - if (g_CfgData.configDB == CS_NULL) - g_CfgData.configDB = CS_CONFIGURE; - - if (g_CfgData.configBak == CS_NULL) - g_CfgData.configBak = CS_CONFIGURE; - - if (g_CfgData.configPartition == CS_NULL) - g_CfgData.configPartition = CS_CONFIGURE; - - if (g_CfgData.configRootVolumes == CS_NULL) - g_CfgData.configRootVolumes = CS_CONFIGURE; - - if (g_CfgData.configRep == CS_NULL) - g_CfgData.configRep = CS_CONFIGURE; - - if (g_CfgData.configSCS == CS_NULL) - g_CfgData.configSCS = CS_DONT_CONFIGURE; - - if (g_CfgData.configSCC == CS_NULL) - g_CfgData.configSCC = CS_DONT_CONFIGURE; - } - - lstrcpy(g_CfgData.szAdminName, TEXT("admin")); - lstrcpy(g_CfgData.szAdminUID, TEXT("0")); - - g_CfgData.bUseNextUid = TRUE; -} - - -// Prototypes for each property page's dialog proc -BOOL CALLBACK PartitionsPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -BOOL CALLBACK ServicesPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); - -static void RunCfgTool() -{ - // If the client info is invalid, then the config tool cannot run. Inform the user and - // ask if they want to run the wizard instead. - if (!g_CfgData.bValidClientInfo) { - int nChoice = MsgBox(0, IDS_NEED_CLIENT_INFO, GetAppTitleID(), MB_YESNO | MB_ICONSTOP); - if (nChoice == IDYES) - RunWizard(); - return; - } - - // If the server info is invalid, then the config tool cannot run. The Wizard must be run - // to initially configure the server. Inform the user and ask if they want to run the wizard instead. - if (!g_CfgData.bValidServerInfo) { - int nChoice = MsgBox(0, IDS_NEED_SERVER_INFO, GetAppTitleID(), MB_OKCANCEL | MB_ICONEXCLAMATION); - if (nChoice == IDOK) - RunWizard(); - return; - } - - g_CfgData.bWizard = FALSE; - - SetConfigDefaults(); - - RegisterConfigToolHelp(); - - // Create the prop sheet - g_pSheet = PropSheet_Create(IDS_CFG_TOOL_APP_TITLE, TRUE); - - // Add the pages - PropSheet_AddTab(g_pSheet, IDS_PARTITIONS_PAGE_TITLE, IDD_PARTITIONS_PAGE, (DLGPROC)PartitionsPageDlgProc, 0, TRUE, TRUE); - PropSheet_AddTab(g_pSheet, IDS_SERVICES_PAGE_TITLE, IDD_SERVICES_PAGE, (DLGPROC)ServicesPageDlgProc, 0, TRUE); - - // Let the user see it - PropSheet_ShowModal(g_pSheet); -} - -static void RunWizard() -{ - g_CfgData.bWizard = TRUE; - - SetConfigDefaults(); - - RegisterWizardHelp(); - - g_pWiz = new WIZARD; - g_pWiz->SetDialogTemplate(IDD_WIZARD, IDC_WIZARD_LEFTPANE, IDC_WIZARD_RIGHTPANE, IDBACK, IDNEXT); - g_pWiz->SetGraphic(IDB_GRAPHIC_16, IDB_GRAPHIC_256); - g_pWiz->SetStates(g_aStates, g_nNumStates); - g_pWiz->SetGraphicCallback(PaintPageGraphic); - - g_pWiz->SetState(sidSTEP_ONE); - g_pWiz->Show(); - - delete g_pWiz; - - g_pWiz = 0; -} - diff --git a/src/WINNT/afssvrcfg/afscfg.h b/src/WINNT/afssvrcfg/afscfg.h deleted file mode 100644 index c94f08483..000000000 --- a/src/WINNT/afssvrcfg/afscfg.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _H_AFSCFG_H_ -#define _H_AFSCFG_H_ - - -extern "C" { -#include -#include -} -#include -#include -#include -#include "hourglass.h" -#include "toolbox.h" -#include "logfile.h" -#include "char_conv.h" -#include "validation.h" - - -#define ASSERT(x) _ASSERTE((x)) - -#define LOG_FILE_NAME "afs_server_config_log.txt" - - -/* Enum for the steps in the wizard. Used to index into the array of steps. */ -enum StateID { - sidSTEP_ONE, - sidSTEP_TWO, - sidSTEP_THREE, - sidSTEP_FOUR, - sidSTEP_FIVE, - sidSTEP_SIX, - sidSTEP_SEVEN, - sidSTEP_EIGHT, - sidSTEP_NINE, - sidSTEP_TEN, - sidSTEP_ELEVEN, - sidSTEP_TWELVE -}; - - -// These are the possible states for a configuration step. -// The first 4 are mutually exclusive. The last one can -// be combined with any of the others, though it doesn't -// mean anything to combine it with CS_NULL. -#define CS_NULL 0 // NULL state -#define CS_DONT_CONFIGURE 1 // Do not perform the configuration step -#define CS_CONFIGURE 2 // Perform the configuration step -#define CS_ALREADY_CONFIGURED 3 // The step has already been performed, so we don't - // need to do it. -#define CS_UNCONFIGURE 4 // Unconfigure the step -#define CS_DISABLED 32 // The step cannot be performed because it is dependent - // on some other step that is not to be performed and - // has not already been performed. - -// I know I could have used an enum for this, but then tacking on the CS_DISABLED -// flag to the enum would have been a bit sleazy. -typedef int CONFIG_STATE; - -// Timeout values -#define BOSSERVER_START_TIMEOUT 2 * 60 // 2 minutes in seconds -#define BOSSERVER_STOP_TIMEOUT 30 * 60 // 30 minutes in seconds - -// Sizes for various arrays -#define MAX_PARTITION_NAME_LEN 8 //cfg_maxPartitionNameLen -#define MAX_MACHINE_NAME_LEN 128 //AFS_MAX_SERVER_NAME_LEN -#define MAX_CELL_NAME_LEN 64 -#define MAX_SERVER_PW_LEN 32 -#define MAX_ADMIN_NAME_LEN 256 -#define MAX_ADMIN_PW_LEN 32 -#define MAX_UID_LEN 12 - - -/* - * This sturcture contains all of the information needed to configure - * a machine. - */ -struct CFG_DATA { - BOOL bWizard; - - CONFIG_STATE configFS; // File server - CONFIG_STATE configDB; // Database server - CONFIG_STATE configBak; // Backup server - CONFIG_STATE configPartition; // Create a partition - CONFIG_STATE configRootVolumes; // Create root.afs and root.cell - CONFIG_STATE configRep; // Replicate root.afs and root.cell - CONFIG_STATE configSCS; // System Control server - CONFIG_STATE configSCC; // System Control client - - BOOL bLastDBServer; - - UINT nRootAfsID; // Volume ID of root.afs - UINT nRootCellID; // Volume ID of root.cell - - BOOL bRootAfsExists; - BOOL bRootCellExists; - - // If we cannot determine if the root volumes exist, then this - // variable will be FALSE. - BOOL bRootVolumesExistanceKnown; - - BOOL bRootAfsReplicated; - BOOL bRootCellReplicated; - BOOL bRootVolumesReplicationKnown; - - // Partition info - TCHAR chDeviceName; // Just the drive to use - TCHAR szPartitionName[MAX_PARTITION_NAME_LEN + 1]; - - // Sys control machine if configuring as a system control client and also to - // use to propagate CellServDB, if configuring a db server - TCHAR szSysControlMachine[MAX_MACHINE_NAME_LEN + 1]; - - // Server and Cell information - TCHAR szCellName[MAX_CELL_NAME_LEN + 1]; - TCHAR szServerPW[MAX_SERVER_PW_LEN + 1]; - TCHAR szAdminName[MAX_ADMIN_NAME_LEN + 1]; - TCHAR szAdminPW[MAX_ADMIN_PW_LEN + 1]; - TCHAR szAdminUID[MAX_UID_LEN + 1]; - BOOL bUseNextUid; - BOOL bFirstServer; - BOOL bAuthServerRunning; // Only used when bFirstServer is true - BOOL bAdminPrincipalCreated; // Only used when bFirstServer is true - - // This machine's local name - TCHAR szLocalName[MAX_MACHINE_NAME_LEN + 1]; - - // This machine's hostname - TCHAR szHostname[MAX_MACHINE_NAME_LEN + 1]; - - // Hostname of machine to get CellServDB from - TCHAR szCellServDbHostname[MAX_MACHINE_NAME_LEN + 1]; - - // Is the AFS Client configured? - BOOL bValidClientInfo; - TCHAR szClientCellName[MAX_CELL_NAME_LEN + 1]; - unsigned nClientVersion; - - // Does this machine have valid config info? - BOOL bValidServerInfo; - - // Can we reuse the admin name and password? - // For use by config manager - if false we will prompt user to login. - BOOL bReuseAdminInfo; - - // Handle of the thread performing a salvage - HANDLE hSalvageThread; - TCHAR szSalvageLogFileName[_MAX_PATH]; -}; - - -// Must include this after the definition of CONFIG_STATE; -#include "cfg_utils.h" - - -// These are defined in afscfg.cpp -extern LPWIZARD g_pWiz; // The wizard -extern LPPROPSHEET g_pSheet; // The config tool property sheet -extern CFG_DATA g_CfgData; // The config data - -extern void *g_hToken; // Current token obtained by this app -extern void *g_hCell; // Handle to the cell we are configuring into -extern void *g_hClient; // Client's config library handle -extern void *g_hServer; // Server's config library handle - -extern size_t g_nNumStates; -extern UINT g_StateDesc[]; // Res ID's of descriptions of each wizard step - -extern LOGFILE g_LogFile; // Our log file - -BOOL CALLBACK WizStep_Common_DlgProc (HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); -BOOL QueryCancelWiz(); -BOOL GetLibHandles(afs_status_t *pStatus); -BOOL GetHandles(HWND hParentDlg); // More convenient version if you only need to know if it succeeded - - -/* - * Accessor functions for g_CfgData__________________________________________ - */ - -// TCHAR versions -TCHAR GetDeviceName(); -LPTSTR GetPartitionName(); -LPTSTR GetHostName(); -LPTSTR GetSysControlMachine(); -LPTSTR GetCellName(); -LPTSTR GetServerPW(); -LPTSTR GetAdminName(); -LPTSTR GetAdminPW(); -LPTSTR GetAdminUID(); -LPTSTR GetLocalName(); -LPTSTR GetHostname(); -LPTSTR GetCellServDbHostname(); -LPTSTR GetClientCellName(); -LPTSTR GetClientNetbiosName(); -LPTSTR GetSalvageLogFileName(); - -// char versions -char GetDeviceNameA(); -char *GetPartitionNameA(); -char *GetSysControlMachineA(); -char *GetCellNameA(); -char *GetServerPWA(); -char *GetAdminNameA(); -char *GetAdminPWA(); -char *GetAdminUIDA(); -char *GetLocalNameA(); -char *GetHostnameA(); -char *GetCellServDbHostnameA(); -char *GetClientCellNameA(); -char *GetClientNetbiosNameA(); -char *GetSalvageLogFileNameA(); - -#endif // _H_AFSCFG_H_ - diff --git a/src/WINNT/afssvrcfg/afscfg_stub.rc b/src/WINNT/afssvrcfg/afscfg_stub.rc deleted file mode 100644 index 2e83d6847..000000000 --- a/src/WINNT/afssvrcfg/afscfg_stub.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Configuration" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" diff --git a/src/WINNT/afssvrcfg/afsdrive.ico b/src/WINNT/afssvrcfg/afsdrive.ico deleted file mode 100644 index d2f88d753d4412fa1a7d29ffe57862f21a34bddd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmah^F%H5o47>mXV<+ayOS%()Q@0&%wQtcw#lKw=ET zfWVZ1Qz$E(k(F>D18w7PWB?OpUC3~JE}@nHPmI2S`85FMm`=S)F0@3#4cQa&msQ*6Go%ae_Vn4tzZ>Pe&4y*fXn2kq=9>Zt8hbS= zz1Qc}1p~w9M@`@0$U7QcU}`NNZP3dA{cm1fGdVD-=zsUYX1&+`7GueNi}!kpCVhSD ztA~G9eYcbCe(bw6G`GsmLRX&~z4mg{9QYwPT0wPp-kb&fsHLKt0}RZ#*K-FLM16-7 zk9*WupMYPrP@xYL&_7C}T+shas5HHx{{?Nl`0V=pXfwVVU!s4hD2l&c^k2Pj=gyrU zZP4RJPtoTI`pzc3o@$f+(tZdPegB*B^6q6Fe_8)`2e>;f8}<46mwOz?F+b|U_p?@? zudfp0$c^vnnxOaPJkRLP>o_2DgOEFN>D_LgA1l9==O>o$?;EA9{rxkQX~6QKbCzEZ z`5@>A%v9k9N9R6|`thMJpO4q|hv!cXKR(oY>G0EJ%Fo9>KRow&)Pqy~R;b?!diZ&L z%rDcQd;eRn_V7*6e{hMu?>FM3p58qcFZ3tM(W~Q>>w#}Ix%Qb?NH<9X$7UsAPwESv zP-XV%?=#wCj{kA&s=xiw-Dc0ZeVeUDQ00!x?aXD^XSisnXuxnq-MGEIJ?9+BvOS-1 zHML8q)9$KiQ8+6m=n`}Zx)5hZGJ4Z8co23u(vyQMT??@4$+-b5PdR zw4K8#r_r1SayaF*&9Y8HN85Z8{BT&?=xINv{hanSL^UAgH0zm6mV$Z(7>U918zv*;lL6{0uKjVlhDJV zfkOj_1_BN37dT@(Cox9&NGYfAXw0`Tsr&fjkKJ2uz2)xSz3cAZzwaJBdgMO&-NE!?nv^>jqW9-$<7

VxdA^*X0v4Xqv^We8T;7 z`a}+>l)?O~*$$VV%|LWAa2&*7c5G0i&ASS4YRl~9>>v=gTBLHvSWLef!Rl|B%&W5u|^nj|GgDLBU0Tx4yXS%#$i)z!iUu7?E0=LW?+ESw}W*#T=-+c7!nhY<`P5+m2~>5Y;m)ooK3J-kLuyWL&SDG_PAa>dtunEJV5m;a?8m(dw#Rl zRfrAsJR|#CH7uu_>z7tP?9{gnnE$1=`Z@EbweQt$SHtaU`||oFEzr-G*|S-jY^Y!8 z`92I{^>e->asDwh)bCCI5=8vg>&4$TfA)Vx02}MqI=F8i2R`OjZ()O`hCP@%cQVn` z)I1=lXsZ=kAlCgrB*RH5!=`y^A=mB+r!xY9Ez~HS*Z}DZGi}hKne`eQ&r9k1(46e z&}L9i-&pNgimO(zc|_rNQgcl9A(O=+@tI}O!i2I<3_2_~e76lSGmq@VU@Mb=UsN6@Rm{uxdttYpw&X&CFos-`^<^{BOit)D&&VF}uRQoT~bvMa%?qLA?K71Msofxfegnm$hyObMbQ8V~c!K6`*sKQD z@RNz&f3a%)FZ^M-A z=&apt=5J>!mMed}@&~NA=~#c3;UwiJovpW85ZCb0U}t9?&HT4{BZKh$iU%|sjxPFS zs~HSzgzkj>3Y=7l3jXE%`)oL z`+WMpdoY1euFJ?~)w}q6SK{2rBy%Hvb-DW>^9_xtIG~*ElaKZvkhy~!sn1^yITOb8 zyi!vx2lv#NepFX(A_^JLpV7z1`fUNNQWX=rs+Z0vKh>CE`x>~Lq}!zUe?;yYg^iMV z`t%8RB>uS3@4H{OpB|_?g2-3=XBc&#o^o_H%J#!&-vHU!IDS+f?YG782*s$5?&v1^ zXH@_42d23f%fJ59-MjQV-RkRAdrzJDU{&@$tZW16FK6m+A%oaB$y1R1c3eDQ^gtCF zV3T_qX3D$4<-JTrcVLb4|1+`tF2B|B%WAiL&{W+r-LzId=$C(79Cz?PS9P~6_nor; zUy)UNVkKT#$oF2xt7p3B-ItbL{ZGc$e*tlDM63V+ diff --git a/src/WINNT/afssvrcfg/backup_server_page.cpp b/src/WINNT/afssvrcfg/backup_server_page.cpp deleted file mode 100644 index 400397cc4..000000000 --- a/src/WINNT/afssvrcfg/backup_server_page.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; -int nOptionButtonSeparationHeight; // This is used by sys_control_page.cpp - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void CantBackup(UINT nMsgID); -static void CalcOptionButtonSeparationHeight(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK BackupPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - g_pWiz->SetState(sidSTEP_EIGHT); - break; - - case IDBACK: - g_pWiz->SetState(sidSTEP_SIX); - break; - - case IDC_DONT_CONFIG_BACKUP_SERVER: - g_CfgData.configBak = CS_DONT_CONFIGURE; - break; - - case IDC_CONFIG_BACKUP_SERVER: - g_CfgData.configBak = CS_CONFIGURE; - break; - } - break; - - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - CalcOptionButtonSeparationHeight(); - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.configBak == CS_ALREADY_CONFIGURED) { - CantBackup(IDS_ALREADY_A_BACKUP_SERVER); - return; - } - - // Should this step be disabled? Yes, if this machine - // is not configured as a database server. - if (!ConfiguredOrConfiguring(g_CfgData.configDB)) { - CantBackup(IDS_NOT_A_DB_SERVER); - EnableStep(g_CfgData.configBak, FALSE); - return; - } - - // Enable this in case it was disabled the last time - EnableStep(g_CfgData.configBak); - - if (g_CfgData.configBak == CS_DONT_CONFIGURE) - SetCheck(hDlg, IDC_DONT_CONFIG_BACKUP_SERVER); - else if (g_CfgData.configBak == CS_CONFIGURE) - SetCheck(hDlg, IDC_CONFIG_BACKUP_SERVER); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CantBackup(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - ShowWnd(hDlg, IDC_BACKUP_SERVER_QUESTION, FALSE); - ShowWnd(hDlg, IDC_CONFIG_BACKUP_SERVER, FALSE); - ShowWnd(hDlg, IDC_DONT_CONFIG_BACKUP_SERVER, FALSE); - - ShowWnd(hDlg, IDC_CANT_BACKUP_MSG); - SetWndText(hDlg, IDC_CANT_BACKUP_MSG, szMsg); -} - -static void CalcOptionButtonSeparationHeight() -{ - RECT rectOB1, rectOB2; - - GetWindowRect(GetDlgItem(hDlg, IDC_CONFIG_BACKUP_SERVER), &rectOB1); - GetWindowRect(GetDlgItem(hDlg, IDC_DONT_CONFIG_BACKUP_SERVER), &rectOB2); - - nOptionButtonSeparationHeight = rectOB2.top - rectOB1.top; -} - diff --git a/src/WINNT/afssvrcfg/cfg_utils.cpp b/src/WINNT/afssvrcfg/cfg_utils.cpp deleted file mode 100644 index ff6ca87c5..000000000 --- a/src/WINNT/afssvrcfg/cfg_utils.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" -#include "cfg_utils.h" - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL IsStepEnabled(const CONFIG_STATE& step) -{ - return ((step & CS_DISABLED) == 0); -} - -void EnableStep(CONFIG_STATE& step, BOOL bEnable) -{ - if (bEnable) - step &= ~CS_DISABLED; - else - step |= CS_DISABLED; -} - -BOOL ShouldConfig(const CONFIG_STATE& state) -{ - return (state == CS_CONFIGURE); -} - -BOOL DontConfig(const CONFIG_STATE& state) -{ - return (state == CS_DONT_CONFIGURE); -} - -BOOL ShouldUnconfig(const CONFIG_STATE& state) -{ - return (state == CS_UNCONFIGURE); -} - -BOOL ConfiguredOrConfiguring(const CONFIG_STATE& step) -{ - return (step == CS_CONFIGURE) || (step == CS_ALREADY_CONFIGURED); -} - -BOOL Configured(const CONFIG_STATE& step) -{ - return (step == CS_ALREADY_CONFIGURED); -} - -void ToggleConfig(CONFIG_STATE& state) -{ - if (ShouldConfig(state)) - state = CS_DONT_CONFIGURE; - else if (DontConfig(state)) - state = CS_CONFIGURE; -} - -void RedrawGraphic() -{ - HWND hWiz = g_pWiz->GetWindow(); - - HWND hBg = GetDlgItem(hWiz, IDC_WIZARD_LEFTPANE); - - RECT rect; - GetClientRect(hBg, &rect); - - InvalidateRect(hBg, &rect, FALSE); - UpdateWindow(hBg); -} - -UINT GetAppTitleID() -{ - if (g_CfgData.bWizard) - return IDS_WIZARD_APP_TITLE; - - return IDS_CFG_TOOL_APP_TITLE; -} - -const char *GetAdminLibErrorCodeMessage(afs_status_t nErrorCode) -{ - afs_status_t nStatus; - const char *pszMsg = 0; - - int nResult = util_AdminErrorCodeTranslate(nErrorCode, 0, &pszMsg, &nStatus); - if (!nResult) - return 0; - - return pszMsg; -} - -void LogError(afs_status_t nErrorCode) -{ - const char *pszMsg = GetAdminLibErrorCodeMessage(nErrorCode); - - if (pszMsg) - g_LogFile.Write("Error 0x%0x has occurred: %s.\r\n", (UINT)nErrorCode, pszMsg); - else - g_LogFile.Write("Error 0x%0x has occurred.\r\n", (UINT)nErrorCode); -} - -void ShowError(HWND hDlg, afs_status_t nErrorCode, UINT uiErrorMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - LogError(nErrorCode); - - GetString(szMsg, uiErrorMsgID); - - ErrorDialog(nErrorCode, szMsg); - - SetWndText(hDlg, IDC_STATUS_MSG, IDS_CONFIG_FAILED); -} - -int ShowWarning(HWND hDlg, UINT uiMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - TCHAR szTitle[cchRESOURCE]; - - GetString(szTitle, GetAppTitleID()); - GetString(szMsg, uiMsgID); - - return MessageBox(hDlg, szMsg, szTitle, MB_OKCANCEL | MB_ICONWARNING); -} - diff --git a/src/WINNT/afssvrcfg/cfg_utils.h b/src/WINNT/afssvrcfg/cfg_utils.h deleted file mode 100644 index 5769d4d90..000000000 --- a/src/WINNT/afssvrcfg/cfg_utils.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _WIZ_UTILS_H_ -#define _WIZ_UTILS_H_ - - -BOOL IsStepEnabled(const CONFIG_STATE& step); -void EnableStep(CONFIG_STATE& step, BOOL bEnable = TRUE); - -BOOL ShouldConfig(const CONFIG_STATE& state); -BOOL DontConfig(const CONFIG_STATE& state); -void ToggleConfig(CONFIG_STATE& state); -BOOL ConfiguredOrConfiguring(const CONFIG_STATE& step); -BOOL Configured(const CONFIG_STATE& step); -BOOL ShouldUnconfig(const CONFIG_STATE& state); - -void RedrawGraphic(); - -UINT GetAppTitleID(); - -const char *GetAdminLibErrorCodeMessage(afs_status_t nErrorCode); - -void LogError(afs_status_t nErrorCode); - -void ShowError(HWND hDlg, afs_status_t nErrorCode, UINT uiErrorMsgID); -int ShowWarning(HWND hDlg, UINT uiMsgID); - - -#endif // _WIZ_UTILS_H_ - diff --git a/src/WINNT/afssvrcfg/char_conv.cpp b/src/WINNT/afssvrcfg/char_conv.cpp deleted file mode 100644 index e50e16b6d..000000000 --- a/src/WINNT/afssvrcfg/char_conv.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -#include -#include - - - -/* - * Class to convert a TCHAR string to an ANSI string. - */ -S2A::S2A(LPCTSTR pszUnicode) -{ - m_pszAnsi = StringToAnsi(pszUnicode); -} - -S2A::~S2A() -{ -// Only need to free the string if a conversion was performed -#ifdef UNICODE - if (m_pszAnsi) - FreeString(m_pszAnsi); -#endif -} - - -/* - * Class to convert an ANSI string to a TCHAR string. If UNICODE is defined, - * then the TCHAR string will be a UNICODE string, otherwise it will be an - * ANSI string. - */ -A2S::A2S(const char *pszAnsi) -{ - m_pszUnicode = AnsiToString(pszAnsi); -} - -A2S::~A2S() -{ -// Only need to free the string if a conversion was performed -#ifdef UNICODE - if (m_pszUnicode) - FreeString(m_pszUnicode); -#endif -} - diff --git a/src/WINNT/afssvrcfg/char_conv.h b/src/WINNT/afssvrcfg/char_conv.h deleted file mode 100644 index 156865d76..000000000 --- a/src/WINNT/afssvrcfg/char_conv.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _H_CHAR_CONVERSION_H_ -#define _H_CHAR_CONVERSION_H_ - - -/* - * Class to convert a TCHAR string to an ANSI string. - */ -class S2A -{ - char *m_pszAnsi; - -public: - S2A(LPCTSTR pszUnicode); - ~S2A(); - - // Allow casts to char * - operator char *() const { return m_pszAnsi; } - operator const char *() const { return m_pszAnsi; } -}; - - - -/* - * Class to convert an ANSI string to a TCHAR string. If UNICODE is defined, - * then the TCHAR string will be a UNICODE string, otherwise it will be an - * ANSI string. - */ -class A2S -{ - LPTSTR m_pszUnicode; - -public: - A2S(const char *pszAnsi); - ~A2S(); - - // Allow casts to LPTSTR - operator LPTSTR() const { return m_pszUnicode; } - operator LPCTSTR() const { return m_pszUnicode; } -}; - -#endif // _H_CHAR_CONVERSION_H_ - - diff --git a/src/WINNT/afssvrcfg/config.h b/src/WINNT/afssvrcfg/config.h deleted file mode 100644 index 69d9961c8..000000000 --- a/src/WINNT/afssvrcfg/config.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _CONFIG_H_ -#define _CONFIG_H_ - -// Config step states -enum STEP_STATE { SS_STEP_TO_BE_DONE, SS_STEP_IN_PROGRESS, SS_STEP_FINISHED, SS_STEP_FAILED }; - - -#endif // _CONFIG_H_ - diff --git a/src/WINNT/afssvrcfg/config_server_page.cpp b/src/WINNT/afssvrcfg/config_server_page.cpp deleted file mode 100644 index eab047aae..000000000 --- a/src/WINNT/afssvrcfg/config_server_page.cpp +++ /dev/null @@ -1,2215 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" -#include "cfg_utils.h" -extern "C" { -#include -#include -#include -#include -#include -} -#include "config.h" -#include "graphics.h" -#include "get_pw_dlg.h" -#include -#include -#include "get_cur_config.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void SetupConfigSteps(); -static void OnConfig(); -static DWORD WINAPI ConfigServer(LPVOID param); -static BOOL CheckCancel(); -static void ShowCurrentStep(UINT uiMsgID); -static void ShowCurrentStep(TCHAR *pszMsg); -static void InitProgressBar(); -static BOOL CheckResult(int nResult, int nStatus); -static BOOL VosOpenServer(); -static void VosCloseServer(); -static BOOL ConfigPartition(); -static BOOL DefineCellForServer(); -static BOOL DefineCellForClient(); -static BOOL StartBosServer(); -static BOOL StartAuthServer(); -static BOOL CreatePrincipalAndKey(); -static BOOL StartDbServers(); -static BOOL CreateAdminPrincipal(); -static BOOL StartFsVlAndSalvager(); -static BOOL ConfigSCC(); -static BOOL ConfigSCS(); -static BOOL CreateRootAfs(); -static BOOL StartClient(); -static BOOL SetRootAcl(); -static BOOL CreateRootCell(); -static BOOL MountRootCellStandard(); -static BOOL SetRootCellAcl(); -static BOOL MountRootCellRW(); -static BOOL Replicate(); -static BOOL EnableAuthChecking(); -static BOOL UpgradeLibHandles(); -static BOOL RestartServers(); -static BOOL AddToCellServDB(); -static BOOL RemoveFromCellServDB(); -static BOOL UpdateCellServDB(BOOL bAdding); -static BOOL RestartAllDbServers(); -static BOOL UnconfigDB(); -static BOOL UnconfigBak(); -static BOOL UnconfigFS(); -static BOOL UnconfigSCS(); -static BOOL UnconfigSCC(); -static BOOL PostConfig(); -static void ShowConfigControls(BOOL bShow = TRUE); -static void UpdateConfigProgress(int nStepNum); -static void ShowTitle(); -static void ViewLog(); -static void ShowConfigFailedMsg(); -static BOOL Unconfiguring(); -static BOOL GetCellServDB(char **ppszCellServDB); -static BOOL FreeCellServDB(); -static char *GetVicepName(); -static void ShowViewLogButton(); -static BOOL CreateRootAfsDriveMapping(); -static BOOL StopClient(); -static BOOL GetRootVolumeInfo(); - -BOOL CALLBACK ConfigServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -#define QUORUM_WAIT_TIMEOUT 3 * 60 // 3 minutes in seconds -#define ROOT_VOLUMES_QUOTA 5000 // k bytes -#define RX_TIMEOUT 15 * 1000 // 15 seconds in milleseconds -#define CELLSERVDB_UPDATE_TIMEOUT RX_TIMEOUT * 2 -#define INVALID_PARTITION_ID (UINT)VOLMAXPARTS + 1 -#define CLIENT_START_TIMEOUT 2 * 60 // 2 minutes in seconds -#define CLIENT_STOP_TIMEOUT 3 * 60 // 2 minutes in seconds - - -// The code below is used in so many places that I decided to put it -// into macros so that the main line of the code would be easier to follow. -#define CHECK_CANCEL if (CheckCancel()) return FALSE -#define CHECK_RESULT if (!CheckResult(m_nResult, m_nStatus)) return FALSE - -#define IF_WIZ(x) { if (g_pWiz) (x); } - -// Global variables -static HWND m_hDlg = 0; // Window handle of this dialog -static BOOL m_bConfiguring = FALSE; // TRUE if configuring -static BOOL m_bConfigured = FALSE; // TRUE if configuration was successful -static BOOL m_bConfigFailed = FALSE; // TRUE if configuration failed -static BOOL m_bCheckCancel = FALSE; // TRUE if user pressed cancel - we will ask for confirmation -static BOOL m_bCancel = FALSE; // TRUE if user confirmed cancel - we will cancel configuration -static void* m_hvosServer = 0; // vos library server handle -static const MAX_STEPS = 34; // Max number of config steps -static afs_status_t m_nStatus; // Error code if a cfg library function fails -static int m_nResult; // Boolean return code from cfg library calls -static int m_nNumSteps; // Number of config steps that will be performed -static BOOL m_bDbServersRestarted; // TRUE if all Database servers were restarted -static BOOL m_bMustChangeClientCell; // TRUE if client is in different cell than server -static HANDLE m_hCellServDBUpdateEvent; -static LPCTSTR m_pszCellServDBUpdateEventName = TEXT("CellServDBUpdateEvent"); -static const m_CallBackID = 6; -static UINT m_nPartitionID = INVALID_PARTITION_ID; -static BOOL m_bCellServDbUpdateErr = FALSE; -static TCHAR m_szCellServDbUpdateErrMsg[cchRESOURCE]; -static LONG m_nServerUpdates = 0; -static char * m_pszCellDbHosts = 0; -static BOOL m_bNoAuthMode = TRUE; -static char m_szVicepName[9]; -static BOOL m_bMustExit; -static BOOL m_bCfgInfoInvalidated; -static BOOL m_bUnconfiguringLastDBServer; -static BOOL m_bClientTokensSet; -static BOOL m_bRootAfsDriveMappingCreated; -static char m_szDriveToMapTo[3]; -static BOOL m_bWeCreatedRootAfs; -static BOOL m_bWeCreatedRootCell; - -static CRITICAL_SECTION m_CritSec; - -typedef BOOL (*STEP_FUNC)(); // All config functions have this signature - - -/* - * Structure that is used to form an array of all possible configuration steps. - */ -struct CONFIG_STEP { - STEP_STATE eState; // Where we are at in performing this step - STEP_FUNC pFunc; // Function used to perform this step - UINT nDescCtrlID; // Control ID of the static used to hold the steps description - UINT nGraphicCtrlID; // Control ID of the static that will display the graphic - UINT nMsgID; // Message to show when performing this step - UINT nDescID; // Step description to show -}; - - -/* - * Structure that holds info about the static controls that show the step description - * and the graphic that corresponds to the step state. There are 8 of these; they - * are configured at runtime depending on what configuration steps are to be performed. - * These are assigned into the appropriate step structure above. I could have just - * stuck an index from the array of these structures into the struct above, but decided - * to just reproduce the two fields for ease of use. - */ -struct STEP_GUI_INFO { - UINT nDescCtrlID; // Control ID of the static used to hold the steps description - UINT nGraphicCtrlID; // Control ID of the static that will display the graphic -}; - -static STEP_GUI_INFO StepGuiCtrlIDs[] = { - { IDC_STEP1, IDC_STEP1_GRAPHIC }, - { IDC_STEP2, IDC_STEP2_GRAPHIC }, - { IDC_STEP3, IDC_STEP3_GRAPHIC }, - { IDC_STEP4, IDC_STEP4_GRAPHIC }, - { IDC_STEP5, IDC_STEP5_GRAPHIC }, - { IDC_STEP6, IDC_STEP6_GRAPHIC }, - { IDC_STEP7, IDC_STEP7_GRAPHIC }, - { IDC_STEP8, IDC_STEP8_GRAPHIC } -}; - - -/* - * Each step that can possibly be performed is given an ID here. Each - * ID corresponds to an index of a config step in the array below. This - * enum MUST match the order of the steps in the STEPS arrray below. - */ -enum STEP_ID { - SID_CONFIG_PARTITION, - SID_DEFINE_CELL_FOR_SERVER, - SID_DEFINE_CELL_FOR_CLIENT, - SID_START_BOS, - SID_START_AUTH, - SID_CREATE_PRINCIPAL_AND_KEY, - SID_START_DB, - SID_START_DB_AND_BAK, - SID_START_BAK, - SID_CREATE_ADMIN_PRINCIPAL, - SID_START_FS_VL_AND_SALVAGER, - SID_CONFIG_SCC, - SID_CONFIG_SCS, - SID_CREATE_ROOT_AFS, - SID_START_CLIENT, - SID_SET_ROOT_ACL, - SID_CREATE_ROOT_CELL, - SID_MOUNT_ROOT_CELL_STANDARD, - SID_SET_ROOT_CELL_ACL, - SID_MOUNT_ROOT_CELL_RW, - SID_REPLICATE, - SID_ENABLE_AUTH_CHECKING, - SID_RESTART_SERVERS, - SID_ADD_TO_CELLSERVDB, - SID_RESTART_ALL_DB_SERVERS, - SID_VOS_OPEN_SERVER, - SID_UNCONFIG_DB, - SID_UNCONFIG_BAK, - SID_UNCONFIG_FS, - SID_UNCONFIG_SCS, - SID_UNCONFIG_SCC, - SID_POST_CONFIG, - SID_GET_CREDENTIALS, - SID_GET_ROOT_VOLUME_INFO -}; - -static CONFIG_STEP m_ConfigSteps[MAX_STEPS * 2]; // Filled with ID's of steps needed to perform configuration - -/* - * This is our array of config steps. There is one entry for each possible configuration - * step. Not all steps will necessarily be performed; it depends on the current config of - * the machine and what the user chooses. We prefill here the config function, the res - * string to show for the step status message, and if applicable, the res string to show - * for the step description. All steps have a status message that is shown right above the - * progress bar during configuration; only certain steps have a description. These are the - * ones that show up in the list of config steps on the dialog and have a state graphic next - * to them. All other values here are changed to their actual value at runtime. The order - * the steps appear here is NOT necessarily the order they will be performed in. That order - * depends on exactly how the server is being configured. - */ -static CONFIG_STEP STEPS[MAX_STEPS] = { - { SS_STEP_TO_BE_DONE, ConfigPartition, 0, 0, IDS_PARTITION_STEP, IDS_PARTITION_STEP_DESC }, - { SS_STEP_TO_BE_DONE, DefineCellForServer, 0, 0, IDS_DEFINE_CELL_NAME_STEP, 0 }, - { SS_STEP_TO_BE_DONE, DefineCellForClient, 0, 0, IDS_DEFINE_CELL_MEMBERSHIP_STEP, 0 }, - { SS_STEP_TO_BE_DONE, StartBosServer, 0, 0, IDS_START_BOS_SERVER_STEP, 0 }, - { SS_STEP_TO_BE_DONE, StartAuthServer, 0, 0, IDS_START_AUTH_SERVER_STEP, 0 }, - { SS_STEP_TO_BE_DONE, CreatePrincipalAndKey,0, 0, IDS_CREATE_PRINCIPAL_AND_KEY_STEP, 0 }, - { SS_STEP_TO_BE_DONE, StartDbServers, 0, 0, IDS_START_DB_STEP, IDS_DB_STEP_DESC }, - { SS_STEP_TO_BE_DONE, StartDbServers, 0, 0, IDS_START_DB_AND_BK_STEP, IDS_DB_AND_BK_STEP_DESC }, - { SS_STEP_TO_BE_DONE, StartDbServers, 0, 0, IDS_START_BK_STEP, IDS_BK_STEP_DESC }, - { SS_STEP_TO_BE_DONE, CreateAdminPrincipal, 0, 0, IDS_CREATE_ADMIN_PRINCIPAL_STEP, 0 }, - { SS_STEP_TO_BE_DONE, StartFsVlAndSalvager, 0, 0, IDS_START_FS_STEP, IDS_FS_STEP_DESC }, - { SS_STEP_TO_BE_DONE, ConfigSCC, 0, 0, IDS_START_SCC_STEP, IDS_SCC_STEP_DESC }, - { SS_STEP_TO_BE_DONE, ConfigSCS, 0, 0, IDS_START_SCS_STEP, IDS_SCS_STEP_DESC }, - { SS_STEP_TO_BE_DONE, CreateRootAfs, 0, 0, IDS_CREATE_ROOT_AFS_STEP, IDS_ROOT_AFS_STEP_DESC }, - { SS_STEP_TO_BE_DONE, StartClient, 0, 0, IDS_START_CLIENT_STEP, 0 }, - { SS_STEP_TO_BE_DONE, SetRootAcl, 0, 0, IDS_SET_ROOT_ACL_STEP, 0 }, - { SS_STEP_TO_BE_DONE, CreateRootCell, 0, 0, IDS_CREATE_ROOT_CELL_STEP, 0 }, - { SS_STEP_TO_BE_DONE, MountRootCellStandard,0, 0, IDS_MOUNT_ROOT_CELL_STANDARD_STEP, 0 }, - { SS_STEP_TO_BE_DONE, SetRootCellAcl, 0, 0, IDS_SET_ROOT_CELL_ACL_STEP, 0 }, - { SS_STEP_TO_BE_DONE, MountRootCellRW, 0, 0, IDS_MOUNT_ROOT_CELL_RW_STEP, 0 }, - { SS_STEP_TO_BE_DONE, Replicate, 0, 0, IDS_REP_STEP, IDS_REP_STEP_DESC }, - { SS_STEP_TO_BE_DONE, EnableAuthChecking, 0, 0, IDS_ENABLE_AUTH_CHECKING_STEP, 0 }, - { SS_STEP_TO_BE_DONE, RestartServers, 0, 0, IDS_RESTART_SERVERS_STEP, 0 }, - { SS_STEP_TO_BE_DONE, AddToCellServDB, 0, 0, IDS_ADD_TO_CELLSERVDB_STEP, 0 }, - { SS_STEP_TO_BE_DONE, RestartAllDbServers, 0, 0, IDS_RESTART_ALL_DB_SERVERS_STEP, 0 }, - { SS_STEP_TO_BE_DONE, VosOpenServer, 0, 0, IDS_NO_MSG_STEP, 0 }, - { SS_STEP_TO_BE_DONE, UnconfigDB, 0, 0, IDS_UNCONFIG_DB_STEP, IDS_UNCONFIG_DB_STEP_DESC }, - { SS_STEP_TO_BE_DONE, UnconfigBak, 0, 0, IDS_UNCONFIG_BK_STEP, IDS_UNCONFIG_BK_STEP_DESC }, - { SS_STEP_TO_BE_DONE, UnconfigFS, 0, 0, IDS_UNCONFIG_FS_STEP, IDS_UNCONFIG_FS_STEP_DESC }, - { SS_STEP_TO_BE_DONE, UnconfigSCS, 0, 0, IDS_UNCONFIG_SCS_STEP, IDS_UNCONFIG_SCS_STEP_DESC }, - { SS_STEP_TO_BE_DONE, UnconfigSCC, 0, 0, IDS_UNCONFIG_SCC_STEP, IDS_UNCONFIG_SCC_STEP_DESC }, - { SS_STEP_TO_BE_DONE, PostConfig, 0, 0, IDS_NO_MSG_STEP, 0 }, - { SS_STEP_TO_BE_DONE, UpgradeLibHandles, 0, 0, IDS_GET_CREDENTIALS_STEP, 0 }, - { SS_STEP_TO_BE_DONE, GetRootVolumeInfo, 0, 0, IDS_NO_MSG_STEP, 0 }, -}; - - -/* - * These are the steps to perform when configuring the very first server. - */ -static STEP_ID FirstServerSteps[] = { - SID_CONFIG_PARTITION, - SID_DEFINE_CELL_FOR_SERVER, - SID_DEFINE_CELL_FOR_CLIENT, - SID_START_BOS, - SID_START_AUTH, - SID_CREATE_PRINCIPAL_AND_KEY, - SID_START_DB, - SID_CREATE_ADMIN_PRINCIPAL, - SID_START_FS_VL_AND_SALVAGER, - SID_CONFIG_SCS, - SID_VOS_OPEN_SERVER, - SID_CREATE_ROOT_AFS, - SID_START_CLIENT, - SID_SET_ROOT_ACL, - SID_CREATE_ROOT_CELL, - SID_MOUNT_ROOT_CELL_STANDARD, - SID_SET_ROOT_CELL_ACL, - SID_MOUNT_ROOT_CELL_RW, - SID_REPLICATE, - SID_ENABLE_AUTH_CHECKING -}; - -static STEP_ID InvalidServerInfoSteps[] = { - SID_DEFINE_CELL_FOR_SERVER, - SID_START_BOS, - SID_CREATE_PRINCIPAL_AND_KEY, - SID_CREATE_ADMIN_PRINCIPAL, - SID_ENABLE_AUTH_CHECKING -}; - -static STEP_ID InvalidClientInfoSteps[] = { - SID_DEFINE_CELL_FOR_CLIENT, - SID_START_CLIENT -}; - -static STEP_ID PreconfigSteps[] = { - SID_GET_CREDENTIALS, // Always do this so we will always have credentials - need this for the config manager. - SID_VOS_OPEN_SERVER // We'll always do this step so we know we can make vos calls -}; - -static STEP_ID UnconfigDbSteps[] = { - SID_UNCONFIG_DB, - SID_RESTART_ALL_DB_SERVERS -}; - -static STEP_ID UnconfigBakSteps[] = { - SID_UNCONFIG_BAK, - SID_GET_CREDENTIALS -}; - -static STEP_ID UnconfigFsSteps[] = { - SID_UNCONFIG_FS -}; - -static STEP_ID UnconfigScsSteps[] = { - SID_UNCONFIG_SCS -}; - -static STEP_ID UnconfigSccSteps[] = { - SID_UNCONFIG_SCC -}; - -static STEP_ID FsSteps[] = { - SID_START_FS_VL_AND_SALVAGER -}; - -static STEP_ID DbSteps[] = { - SID_ADD_TO_CELLSERVDB, - SID_START_DB, - SID_RESTART_ALL_DB_SERVERS -}; - -static STEP_ID DbAndBakSteps[] = { - SID_ADD_TO_CELLSERVDB, - SID_START_DB_AND_BAK, - SID_RESTART_ALL_DB_SERVERS -}; - -static STEP_ID BakOnlySteps[] = { - SID_START_BAK, -}; - -static STEP_ID PartitionSteps[] = { - SID_CONFIG_PARTITION -}; - -static STEP_ID CheckRootVolumesSteps[] = { - SID_GET_ROOT_VOLUME_INFO -}; - -static STEP_ID RootVolumesSteps[] = { - SID_CREATE_ROOT_AFS, - SID_START_CLIENT, // TODO: Must check what happens if client started previously and failed because root.afs didn't exist. - SID_SET_ROOT_ACL, - SID_CREATE_ROOT_CELL, - SID_MOUNT_ROOT_CELL_STANDARD, - SID_SET_ROOT_CELL_ACL, - SID_MOUNT_ROOT_CELL_RW, -}; - -static STEP_ID ReplicationSteps[] = { - SID_REPLICATE -}; - -static STEP_ID ScsSteps[] = { - SID_CONFIG_SCS -}; - -static STEP_ID SccSteps[] = { - SID_CONFIG_SCC -}; - -static STEP_ID PostConfigSteps[] = { - SID_POST_CONFIG -}; - - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ -BOOL Configure(HWND hParent, BOOL& bMustExit) -{ - int nResult = ModalDialog(IDD_CONFIG_SERVER, hParent, (DLGPROC)ConfigServerPageDlgProc); - - bMustExit = m_bMustExit; - - return !m_bConfigFailed; -} - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK ConfigServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - OnConfig(); - break; - - case IDBACK: - IF_WIZ(g_pWiz->SetState(sidSTEP_ELEVEN)); - break; - - case IDCANCEL: - // If configuring, handle cancel here. - // Otherwise, use common handler below. - if (m_bConfiguring) { - ShowCurrentStep(IDS_CANCEL_PENDING); - m_bCheckCancel = TRUE; - return FALSE; - } else if (!g_pWiz) - EndDialog(m_hDlg, m_bConfigured); - break; - } - break; - } - - if (g_pWiz) { - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - } - - return FALSE; -} - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - - -/* - * This function is the window proc for the static controls used to display the picture - * (blue dot, checkmark, or red X) that indicates the state of each step. - * - * Which step to draw the state for is determined and then the state picture is displayed. - */ -static BOOL CALLBACK StepGrahpicDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - // We only handle the paint message. All other message are passed on to the - // static control's normal window proc. - if (uMsg == WM_PAINT) { - for (int ii = 0; ii < m_nNumSteps; ii++) { - // Find the step that corresponds to the window we are supposed to paint - if (hwnd == GetDlgItem(m_hDlg, m_ConfigSteps[ii].nGraphicCtrlID)) { - PaintStepGraphic(hwnd, m_ConfigSteps[ii].eState); // Show the graphic for this step - return 0; - } - } - } - - return CallWindowProc((WNDPROC)Subclass_FindNextHook(hwnd, StepGrahpicDlgProc), hwnd, uMsg, wParam, lParam); -} - - - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - m_hDlg = hwndDlg; - - // Initialize our global variables - only the ones that should not - // preserve their state if the user leaves and returns to this page. - m_bConfiguring = FALSE; - m_bConfigured = FALSE; - m_bConfigFailed = FALSE; - m_bCheckCancel = FALSE; - m_bCancel = FALSE; - m_bMustChangeClientCell = FALSE; - m_hvosServer = 0; - m_nPartitionID = INVALID_PARTITION_ID; - m_bCellServDbUpdateErr = FALSE; - m_nServerUpdates = 0; - m_pszCellDbHosts = 0; - m_nNumSteps = 0; - m_bNoAuthMode = !g_CfgData.bValidServerInfo; - m_szVicepName[0] = 0; - m_bMustExit = FALSE; - m_bCfgInfoInvalidated = FALSE; - m_bUnconfiguringLastDBServer = g_CfgData.bLastDBServer && ShouldUnconfig(g_CfgData.configDB); - m_bClientTokensSet = FALSE; - m_bRootAfsDriveMappingCreated = FALSE; - m_bWeCreatedRootAfs = FALSE; - m_bWeCreatedRootCell = FALSE; - - IF_WIZ(g_pWiz->EnableButtons(BACK_BUTTON)); - IF_WIZ(g_pWiz->SetButtonText(IDNEXT, IDS_CONFIGURE)); - IF_WIZ(g_pWiz->SetDefaultControl(IDNEXT)); - - TCHAR szMsg[cchRESOURCE] = TEXT(""); - - // Show the cellname in the title - ShowTitle(); - - // If this is the wizard, then check if there is nothing to do and - // inform the user. If this is not the wizard, then we should - // not even get to this point. The config tool will not call - // the config function if there is nothing to do. - if (g_pWiz) { - // Is everything already configured? - if ((g_CfgData.configFS == CS_ALREADY_CONFIGURED) && - (g_CfgData.configDB == CS_ALREADY_CONFIGURED) && - (g_CfgData.configBak == CS_ALREADY_CONFIGURED) && - (g_CfgData.configPartition == CS_ALREADY_CONFIGURED) && - (g_CfgData.configRootVolumes == CS_ALREADY_CONFIGURED) && - (g_CfgData.configRep == CS_ALREADY_CONFIGURED) && - ((g_CfgData.configSCS == CS_ALREADY_CONFIGURED) || - (g_CfgData.configSCC == CS_ALREADY_CONFIGURED))) - { - GetString(szMsg, IDS_ALREADY_CONFIGURED); - } - // Is there nothing to configure? - else if ((g_CfgData.configFS != CS_CONFIGURE) && - (g_CfgData.configDB != CS_CONFIGURE) && - (g_CfgData.configBak != CS_CONFIGURE) && - (g_CfgData.configPartition != CS_CONFIGURE) && - (g_CfgData.configRootVolumes != CS_CONFIGURE) && - (g_CfgData.configRep != CS_CONFIGURE) && - (g_CfgData.configSCS != CS_CONFIGURE) && - (g_CfgData.configSCC != CS_CONFIGURE)) - { - GetString(szMsg, IDS_NOTHING_TO_CONFIGURE); - } - - // If there's a can't configure message, then show it - if (*szMsg) { - // Hide all controls except for the message window - ShowWnd(m_hDlg, IDC_ALL_NEEDED_MSG, FALSE); - ShowWnd(m_hDlg, IDC_FOLLOWING_STEPS_MSG, FALSE); - - for (int i = 0; i < sizeof(StepGuiCtrlIDs) / sizeof(StepGuiCtrlIDs[0]); i++) { - ShowWnd(m_hDlg, StepGuiCtrlIDs[i].nDescCtrlID, FALSE); - ShowWnd(m_hDlg, StepGuiCtrlIDs[i].nGraphicCtrlID, FALSE); - } - - ShowWnd(m_hDlg, IDC_CURRENT_STEP_LABEL, FALSE); - ShowWnd(m_hDlg, IDC_CURRENT_STEP, FALSE); - ShowWnd(m_hDlg, IDC_CONFIG_PROGRESS, FALSE); - ShowWnd(m_hDlg, IDC_PERCENT_COMPLETE_LABEL, FALSE); - ShowWnd(m_hDlg, IDC_PERCENT_COMPLETE, FALSE); - ShowWnd(m_hDlg, IDC_CANT_CONFIG_MSG, FALSE); - - // Show the message - SetWndText(m_hDlg, IDC_STATUS_MSG, szMsg); - - return; - } - } - - // Determine which steps to perform and which should be displayed - SetupConfigSteps(); - - if (!g_CfgData.bWizard) { - OnConfig(); - return; - } - - // This must be done after SetupConfigSteps(), which assings a nGraphicCtrlID - // value to the appropriate steps. After the following code is executed, the graphic - // for each step will be drawn automatically whenever the dialog is repainted. - for (UINT ii = 0; ii < MAX_STEPS; ii++) { - if (m_ConfigSteps[ii].nGraphicCtrlID) - Subclass_AddHook(GetDlgItem(m_hDlg, m_ConfigSteps[ii].nGraphicCtrlID), StepGrahpicDlgProc); - } - - IF_WIZ(g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON)); -} - -// User has pressed the Config (or Exit) button. -static void OnConfig() -{ - ASSERT(g_CfgData.szCellName[0]); - - // Has user pressed the Exit button? - if (m_bConfigured) { - IF_WIZ(g_pWiz->Show(FALSE)); - return; - } - - // Has user pressed the View Log button? - if (m_bConfigFailed) { - ViewLog(); - return; - } - - // Must we change the client's cell? See if user minds... - if (m_bMustChangeClientCell) { - if (ShowWarning(m_hDlg, IDS_CLIENT_CELL_WILL_CHANGE) == IDCANCEL) { - return; - } - } - - // Create a thread to perform the configuration steps - DWORD dwThreadID; - - // Start configuring... - HANDLE hThread = CreateThread(0, 0, ConfigServer, 0, 0, &dwThreadID); - - CloseHandle(hThread); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void ShowExitButton() -{ - if (g_pWiz) - g_pWiz->SetButtonText(IDNEXT, IDS_EXIT); - else { - if (m_bMustExit) - SetWndText(m_hDlg, IDCANCEL, IDS_EXIT); - else - SetWndText(m_hDlg, IDCANCEL, IDS_CLOSE); - } -} - -static void ShowTitle() -{ - ASSERT(g_CfgData.szCellName[0]); - - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, IDS_CONFIG_INTO_CELL_MSG); - - lstrcat(szMsg, g_CfgData.szCellName); - lstrcat(szMsg, TEXT(".")); - - SetWndText(m_hDlg, IDC_TITLE, szMsg); -} - -static BOOL Unconfiguring() -{ - return ShouldUnconfig(g_CfgData.configFS) || - ShouldUnconfig(g_CfgData.configDB) || - ShouldUnconfig(g_CfgData.configBak) || - ShouldUnconfig(g_CfgData.configSCS) || - ShouldUnconfig(g_CfgData.configSCC); -} - -static void AddSteps(STEP_ID *pSteps, int nNumNewSteps) -{ - ASSERT(pSteps); - ASSERT(nNumNewSteps > 0); - - if (m_nNumSteps + nNumNewSteps > MAX_STEPS) { - ASSERT(FALSE); - return; - } - - // Add the new steps to the array of steps - for (int nNewStep = 0; nNewStep < nNumNewSteps; nNewStep++) { - STEP_ID nStepID = pSteps[nNewStep]; - - // Add the new step - m_ConfigSteps[m_nNumSteps++] = STEPS[nStepID]; - } -} - -static void GetStepsToPerform() -{ -#define NUM_STEPS(x) (sizeof((x)) / sizeof(STEP_ID)) - - // Is this the first server? - if (g_CfgData.bFirstServer) { - // We may have to change the FirstServerSteps, so loop over them - // and only add the ones we need. All of the FirstServerSteps - // are required except for the ones for backup and sys control - // machine. If the user doesn't want those then we won't put - // them into the array of steps to perform. Also, we may not need - // to make the AFS partition (if it already exists). - for (int i = 0; i < NUM_STEPS(FirstServerSteps); i++) { - STEP_ID curStep = FirstServerSteps[i]; - - if ((curStep == SID_START_DB) && ShouldConfig(g_CfgData.configBak)) - curStep = SID_START_DB_AND_BAK; - else if ((curStep == SID_CONFIG_SCS) && !ShouldConfig(g_CfgData.configSCS)) - continue; - else if ((curStep == SID_CONFIG_PARTITION) && !ShouldConfig(g_CfgData.configPartition)) - continue; - - AddSteps(&curStep, 1); - } - - return; - } - - // Make sure client info is valid - if (!g_CfgData.bValidClientInfo || (lstrcmp(g_CfgData.szClientCellName, g_CfgData.szCellName) != 0)) { - m_bMustChangeClientCell = TRUE; - AddSteps(InvalidClientInfoSteps, NUM_STEPS(InvalidClientInfoSteps)); - } - - // Make sure server info is valid - if (!g_CfgData.bValidServerInfo) - AddSteps(InvalidServerInfoSteps, NUM_STEPS(InvalidServerInfoSteps)); - - // Add steps that should always be performed - AddSteps(PreconfigSteps, NUM_STEPS(PreconfigSteps)); - - /* - * Do unconfiguration first - */ - - // Unconfigure File Server? - if (ShouldUnconfig(g_CfgData.configFS)) - AddSteps(UnconfigFsSteps, NUM_STEPS(UnconfigFsSteps)); - - // Unconfigure Database Server? Will also automatically unconfig backup server. - if (ShouldUnconfig(g_CfgData.configDB)) - AddSteps(UnconfigDbSteps, NUM_STEPS(UnconfigDbSteps)); - // Unconfigure Backup Server? - else if (ShouldUnconfig(g_CfgData.configBak)) - AddSteps(UnconfigBakSteps, NUM_STEPS(UnconfigBakSteps)); - - // Unconfigure System Control Server? - if (ShouldUnconfig(g_CfgData.configSCS)) - AddSteps(UnconfigScsSteps, NUM_STEPS(UnconfigScsSteps)); - - // Unconfigure System Control Client? - if (ShouldUnconfig(g_CfgData.configSCC)) - AddSteps(UnconfigSccSteps, NUM_STEPS(UnconfigSccSteps)); - - /* - * Now do configuration - */ - - // AFS Partition - if (ShouldConfig(g_CfgData.configPartition)) - AddSteps(PartitionSteps, NUM_STEPS(PartitionSteps)); - - // Database and backup server - if (ShouldConfig(g_CfgData.configDB)) { - if (ShouldConfig(g_CfgData.configBak)) - AddSteps(DbAndBakSteps, NUM_STEPS(DbAndBakSteps)); - else - AddSteps(DbSteps, NUM_STEPS(DbSteps)); - } else if (ShouldConfig(g_CfgData.configBak)) - AddSteps(BakOnlySteps, NUM_STEPS(BakOnlySteps)); - - // File server - if (ShouldConfig(g_CfgData.configFS)) - AddSteps(FsSteps, NUM_STEPS(FsSteps)); - - if (!g_CfgData.bRootVolumesExistanceKnown || !g_CfgData.bRootVolumesReplicationKnown) - AddSteps(CheckRootVolumesSteps, NUM_STEPS(CheckRootVolumesSteps)); - - // Root volumes - if (ShouldConfig(g_CfgData.configRootVolumes)) - AddSteps(RootVolumesSteps, NUM_STEPS(RootVolumesSteps)); - - // Replication - if (ShouldConfig(g_CfgData.configRep)) - AddSteps(ReplicationSteps, NUM_STEPS(ReplicationSteps)); - - // System control server - if (ShouldConfig(g_CfgData.configSCS)) - AddSteps(ScsSteps, NUM_STEPS(ScsSteps)); - - // System control client - if (ShouldConfig(g_CfgData.configSCC)) - AddSteps(SccSteps, NUM_STEPS(SccSteps)); - - // Perform any steps necessary after all normal configuration has finished. - // For instance, if all servers were shut down, then we ask the user if they - // want the config info invalidated. Also, if the last db server was stopped, - // then we will stop the client as well. - AddSteps(PostConfigSteps, NUM_STEPS(PostConfigSteps)); -} - -// For steps that should have a place on the dialog, assign them the -// next available position. -static void SetupStepGUI(CONFIG_STEP& step, UINT& nDispPos) -{ - step.eState = SS_STEP_TO_BE_DONE; - - // If this step has a msg ID then it is a step that gets displayed to the - // user. Show it in the dialog. - if (step.nDescID) { - // Give this step a position on the dialog in which to show its message - step.nDescCtrlID = StepGuiCtrlIDs[nDispPos].nDescCtrlID; - step.nGraphicCtrlID = StepGuiCtrlIDs[nDispPos].nGraphicCtrlID; - - // Show this step's text in the proper static control - SetWndText(m_hDlg, step.nDescCtrlID, step.nDescID); - - // Show the static control - ShowWnd(m_hDlg, step.nDescCtrlID); - - // Show the graphic control - ShowWnd(m_hDlg, step.nGraphicCtrlID); - - nDispPos++; - } -} - -static void SetupConfigSteps() -{ - UINT nDispPos = 0; // Which StepGuiCtrlID to use, if applicable - int nStep = 0; - - // Determine which steps are going to be performed. For the ones that - // will be, show their description message in the appropriate place on - // the dialog. - GetStepsToPerform(); - ASSERT(m_nNumSteps > 0); - - // For steps that should have a place on the dialog, assign them the - // next available position. - for (int i = 0; i < m_nNumSteps; i++) - SetupStepGUI(m_ConfigSteps[i], nDispPos); -} - -static BOOL CheckResult(int nResult, int nStatus) -{ - CHECK_CANCEL; - - if (nResult) - return TRUE; - - ShowError(m_hDlg, nStatus, IDS_CONFIG_ERROR); - - return FALSE; -} - -static BOOL CheckCancel() -{ - // If we already know we are cancelling then return - if (m_bCancel) - return TRUE; - - // If user didn't press Cancel button, then return FALSE - if (!m_bCheckCancel) - return FALSE; - - ASSERT(m_bConfiguring); - - TCHAR szMsg[cchRESOURCE]; - TCHAR szTitle[cchRESOURCE]; - - GetString(szMsg, IDS_CANCEL_CONFIG_MSG); - GetString(szTitle, GetAppTitleID()); - - // Ask user if they really want to cancel - int nChoice = MessageBox(m_hDlg, szMsg, szTitle, MB_YESNO | MB_ICONQUESTION); - - m_bCancel = (nChoice == IDYES); - - m_bCheckCancel = FALSE; - - return m_bCancel; -} - -/* - * Show the current config step, UNLESS the user has pressed the Cancel - * button, in which case a "cancel pending" message is already being - * displayed and we don't want it replace with this new message. - */ -static void ShowCurrentStep(UINT uiMsgID) -{ - if (!m_bCheckCancel && uiMsgID) { - SetWndText(m_hDlg, IDC_CURRENT_STEP, uiMsgID); - ForceUpdateWindow(m_hDlg, IDC_CURRENT_STEP); - } -} - -static void ShowCurrentStep(TCHAR *pszMsg) -{ - if (!m_bCheckCancel && pszMsg) { - SetWndText(m_hDlg, IDC_CURRENT_STEP, pszMsg); - ForceUpdateWindow(m_hDlg, IDC_CURRENT_STEP); - } -} - -// Set the range and step increment for the progress bar. -static void InitProgressBar() -{ - SendDlgItemMessage(m_hDlg, IDC_CONFIG_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, m_nNumSteps)); - SendDlgItemMessage(m_hDlg, IDC_CONFIG_PROGRESS, PBM_SETSTEP, 1, 0); -} - -static char *GetVicepName() -{ - ASSERT((lstrlen(g_CfgData.szPartitionName) == 1) || (lstrlen(g_CfgData.szPartitionName) == 2)); - - // Construct the partition name - if (!m_szVicepName[0]) - sprintf(m_szVicepName, "/vicep%s", GetPartitionNameA()); - - return m_szVicepName; -} - - -/* - * Configuration Functions _________________________________________________________________ - * - */ - -static BOOL VosOpenServer() -{ - ASSERT(m_hvosServer == 0); - ASSERT(g_CfgData.szHostname[0]); - ASSERT(g_hCell); - - g_LogFile.Write("Opening server %s.\r\n", GetHostnameA()); - - m_nResult = vos_ServerOpen(g_hCell, GetHostnameA(), &m_hvosServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL ConfigPartition() -{ - ASSERT(g_hServer); - ASSERT(g_CfgData.chDeviceName); - - // Constuct the device name - char szDevName[] = "?:"; - szDevName[0] = GetDeviceNameA(); - - g_LogFile.Write("Adding an AFS partition on device '%s' with name '%s'.\r\n", szDevName, GetVicepName()); - - m_nResult = cfg_HostPartitionTableAddEntry(g_hServer, GetVicepName(), szDevName, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL FreeCellServDB() -{ - afs_status_t nIgnore; - - if (m_pszCellDbHosts) { - cfg_StringDeallocate(m_pszCellDbHosts, &nIgnore); - CHECK_RESULT; - } - - return TRUE; -} - -static BOOL GetCellServDB(char **ppszCellServDB) -{ - ASSERT(g_CfgData.szCellServDbHostname[0]); - - afs_status_t nIgnore; - char *pszCellname = 0; - - g_LogFile.Write("Getting CellServDB from host %s.\r\n", GetCellServDbHostnameA()); - m_nResult = cfg_CellServDbEnumerate(GetCellServDbHostnameA(), &pszCellname, ppszCellServDB, &m_nStatus); - CHECK_RESULT; - - // The cell name from this call better match the cell name we got previously - if (strcmp(GetCellNameA(), pszCellname) != 0) { - ShowError(m_hDlg, 0, IDS_WRONG_CELL); - m_nResult = 0; - return FALSE; - } - - cfg_StringDeallocate(pszCellname, &nIgnore); - - g_LogFile.WriteMultistring(*ppszCellServDB); - - return TRUE; -} - -// Define cell name and cell membership for server -static BOOL DefineCellForServer() -{ - ASSERT(g_hServer); - ASSERT(g_CfgData.szCellName[0]); - - // CellServDB entries - char *pszEntries = 0; - - // If not first server, get list of other hosts - if (!g_CfgData.bFirstServer) { - if (!m_pszCellDbHosts) { - m_nResult = GetCellServDB(&m_pszCellDbHosts); - if (!m_nResult) - return m_nResult; - } - pszEntries = m_pszCellDbHosts; - } else { - // Make the hostname a multistring - _tcsncat(g_CfgData.szHostname, TEXT("\0"), MAX_PARTITION_NAME_LEN); - pszEntries = GetHostnameA(); - } - - g_LogFile.Write("Putting this host in cell '%s'.\r\n", GetCellNameA()); - - ASSERT(g_CfgData.szCellName[0]); - - m_nResult = cfg_HostSetCell(g_hServer, GetCellNameA(), pszEntries, &m_nStatus); - CHECK_RESULT; - - g_CfgData.bValidServerInfo = TRUE; - - return TRUE; -} - -static BOOL StopClient() -{ - g_LogFile.Write("Stopping the client.\r\n"); - - m_nResult = cfg_ClientStop(g_hClient, CLIENT_STOP_TIMEOUT, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL DefineCellForClient() -{ - ASSERT(g_hClient); - ASSERT(g_CfgData.szCellName[0]); - - // Stop the client - if (!StopClient()) - return FALSE; - - // CellServDB entries - char *pszEntries = 0; - - // If not first server, get list of other hosts - if (!g_CfgData.bFirstServer) { - if (!m_pszCellDbHosts) { - m_nResult = GetCellServDB(&m_pszCellDbHosts); - if (!m_nResult) - return m_nResult; - } - pszEntries = m_pszCellDbHosts; - } else { - // Make the hostname a multistring - _tcsncat(g_CfgData.szHostname, TEXT("\0"), MAX_PARTITION_NAME_LEN); - pszEntries = GetHostnameA(); - } - - g_LogFile.Write("Putting the AFS Client in this host's cell.\r\n"); - - m_nResult = cfg_ClientSetCell(g_hClient, GetCellNameA(), pszEntries, &m_nStatus); - CHECK_RESULT; - - // Update our state info about the client - g_CfgData.bValidClientInfo = TRUE; - lstrcpy(g_CfgData.szClientCellName, g_CfgData.szCellName); - - if (!g_CfgData.bFirstServer) { - if (!UpgradeLibHandles()) - return FALSE; - } - - return TRUE; -} - -static BOOL StartBosServer() -{ - ASSERT(g_hServer); - - g_LogFile.Write("Starting the bos server in %s mode.\r\n", m_bNoAuthMode ? "no auth" : "auth"); - - m_nResult = cfg_BosServerStart(g_hServer, m_bNoAuthMode, BOSSERVER_START_TIMEOUT, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL StartAuthServer() -{ - ASSERT(g_hServer); - ASSERT(g_CfgData.bFirstServer); - - g_LogFile.Write("Starting the authentication server.\r\n"); - - m_nResult = cfg_AuthServerStart(g_hServer, &m_nStatus); - CHECK_RESULT; - - g_CfgData.bAuthServerRunning = TRUE; - - return TRUE; -} - -static BOOL CreatePrincipalAndKey() -{ - ASSERT(g_hServer); - - if (!UpgradeLibHandles()) - return FALSE; - - // Create AFS server principal and put key in local Keyfile - LPTSTR pszServerPW = 0; - - g_LogFile.Write("Setting the AFS Principal.\r\n"); - - if (g_CfgData.bFirstServer) { - ASSERT(g_CfgData.szServerPW[0]); - pszServerPW = GetServerPW(); - } - - BOOL bDone = FALSE; - - while (!bDone) { - m_nResult = cfg_HostSetAfsPrincipal(g_hServer, (short)g_CfgData.bFirstServer, S2A(pszServerPW), &m_nStatus); - - if (m_nStatus == ADMCFGAFSPASSWDINVALID) - MsgBox(m_hDlg, IDS_BAD_PW, GetAppTitleID(), MB_OK); - - if ((m_nStatus == ADMCFGAFSPASSWDINVALID) || (m_nStatus == ADMCFGAFSKEYNOTAVAILABLE)) { - // Ask user for the AFS principal password - if (!GetAfsPrincipalPassword(m_hDlg, pszServerPW)) { - m_bCancel = TRUE; - return FALSE; - } - } else - bDone = TRUE; - } - - CHECK_RESULT; - - return TRUE; -} - -static BOOL StartDbServers() -{ - ASSERT(g_hServer); - - g_LogFile.Write("Starting the following servers: Protection Volume Location "); - if (IsStepEnabled(g_CfgData.configBak)) - g_LogFile.Write("Backup "); - if (!g_CfgData.bFirstServer) - g_LogFile.Write("Authentication"); - g_LogFile.Write("\r\n"); - - // Start Protection, Volume Location, and Backup (optional) database servers - m_nResult = cfg_DbServersStart(g_hServer, ShouldConfig(g_CfgData.configBak), &m_nStatus); - CHECK_RESULT; - - // Must wait for this now so we can then talk to them. - if (g_CfgData.bFirstServer) { - g_LogFile.Write("Waiting for database servers to reach quorum.\r\n"); - m_nResult = cfg_DbServersWaitForQuorum(g_hServer, QUORUM_WAIT_TIMEOUT, &m_nStatus); - CHECK_RESULT; - } - - return TRUE; -} - -static BOOL CreateAdminPrincipal() -{ - ASSERT(g_hServer); - ASSERT(g_CfgData.szAdminName[0]); - - // Create generic admin principal and put in local Userlist - char *pszAdminPW = 0; - int nUID = 0; - - if (g_CfgData.bFirstServer) { - ASSERT(g_CfgData.szAdminPW[0]); - ASSERT(g_CfgData.szAdminUID[0]); - pszAdminPW = GetAdminPWA(); - nUID = atoi(GetAdminUIDA()); - g_LogFile.Write("Setting Admin Principal to '%s' and UID to %d.\r\n", GetAdminNameA(), nUID); - } else - g_LogFile.Write("Setting Admin Principal to '%s'.\r\n", GetAdminNameA()); - - m_nResult = cfg_HostSetAdminPrincipal(g_hServer, (short)g_CfgData.bFirstServer, GetAdminNameA(), pszAdminPW, nUID, &m_nStatus); - CHECK_RESULT; - - g_CfgData.bAdminPrincipalCreated = TRUE; - - if (g_CfgData.bFirstServer) { - if (!UpgradeLibHandles()) - return FALSE; - } - - return TRUE; -} - -static BOOL StartFsVlAndSalvager() -{ - ASSERT(g_hServer); - - g_LogFile.Write("Starting the File Server.\r\n"); - - m_nResult = cfg_FileServerStart(g_hServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL ConfigSCS() -{ - ASSERT(g_hServer); - - g_LogFile.Write("Configuring the System Control Server.\r\n"); - - m_nResult = cfg_SysBinServerStart(g_hServer, TRUE, FALSE, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL ConfigSCC() -{ - ASSERT(g_hServer); - ASSERT(g_CfgData.szSysControlMachine[0]); - - g_LogFile.Write("Configuring the System Control Client.\r\n"); - - m_nResult = cfg_SysControlClientStart(g_hServer, GetSysControlMachineA(), &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL GetPartitionID() -{ - if (m_nPartitionID != INVALID_PARTITION_ID) - return TRUE; - - g_LogFile.Write("Translating the parition name '%s' to an ID.\r\n", GetVicepName()); - - m_nResult = vos_PartitionNameToId(GetVicepName(), &m_nPartitionID, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("The ID for partition '%s' is %d.\r\n", GetVicepName(), m_nPartitionID); - - ASSERT(m_nPartitionID != INVALID_PARTITION_ID); - - return TRUE; -} - -static BOOL GetRootVolumeInfo() -{ - BOOL bResult; - - if (!g_CfgData.bRootVolumesExistanceKnown) { - m_nStatus = DoRootVolumesExist(bResult); - m_nResult = !m_nStatus; - CHECK_RESULT; - - g_CfgData.bRootVolumesExistanceKnown = TRUE; - } - - if (!g_CfgData.bRootVolumesReplicationKnown) { - m_nStatus = AreRootVolumesReplicated(bResult); - m_nResult = !m_nStatus; - CHECK_RESULT; - - g_CfgData.bRootVolumesReplicationKnown = TRUE; - } - - return TRUE; -} - -static BOOL CreateRootAfs() -{ - ASSERT(g_hCell); - ASSERT(m_hvosServer); - - // If the root.afs volume already exists, then just return. We can get to this step - // and root.afs already exist if: - // - // 1) We could not determine the status of the root volumes when the app was started - // and the user asked us to create the root volumes if they don't exist. - // - // 2) Since there is only one page from which the user decides if they want to create - // the root volumes, there is a chance that one of the root volumes may exist while - // the other doesn't. If that is the case the user is told that the "root volumes" - // don't exist. If they choose to create them, we do this check here to make sure - // we only create the one that doesn't exist. - // - if (g_CfgData.bRootAfsExists) - return TRUE; - - if (!GetPartitionID()) - return FALSE; - - // If the client is running then stop it - creating root.afs will confuse it. - // It will be started again after root.afs is created. - if (!StopClient()) - return FALSE; - - g_LogFile.Write("Creating volume root.afs on partition %d with a quota of %d.\r\n", m_nPartitionID, ROOT_VOLUMES_QUOTA); - - m_nResult = vos_VolumeCreate(g_hCell, m_hvosServer, 0, m_nPartitionID, "root.afs", ROOT_VOLUMES_QUOTA, &g_CfgData.nRootAfsID, &m_nStatus); - - CHECK_RESULT; - - g_LogFile.Write("Volume root.afs was created with an ID of %d.\r\n", g_CfgData.nRootAfsID); - - g_CfgData.bRootAfsExists = TRUE; - - m_bWeCreatedRootAfs = TRUE; - - return TRUE; -} - -static BOOL StartClient() -{ - ASSERT(g_hClient); - - g_LogFile.Write("Starting the AFS Client.\r\n"); - - m_nResult = cfg_ClientStart(g_hClient, CLIENT_START_TIMEOUT, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL SetTokensInClient() -{ - if (m_bClientTokensSet) - return TRUE; - - g_LogFile.Write("Putting our tokens into the AFS Client.\r\n"); - - m_nResult = afsclient_TokenSet(g_hToken, &m_nStatus); - CHECK_RESULT; - - m_bClientTokensSet = TRUE; - - return TRUE; -} - -static BOOL CreateRootAfsDriveMapping() -{ - if (m_bRootAfsDriveMappingCreated) - return TRUE; - - g_LogFile.Write("Attempting to create a drive mapping into AFS.\r\n"); - - char szAfsRootDir[_MAX_PATH]; - sprintf(szAfsRootDir, "\\\\%s\\all", GetClientNetbiosNameA()); - - strcpy(m_szDriveToMapTo, "_:"); - - // We will try all drives from D to Z. - char chDriveLetter; - -try_again: - NETRESOURCE nr; - memset (&nr, 0x00, sizeof(NETRESOURCE)); - - for (chDriveLetter = 'D'; (chDriveLetter <= 'Z') && !m_bRootAfsDriveMappingCreated; chDriveLetter++) { - m_szDriveToMapTo[0] = chDriveLetter; - g_LogFile.Write("Attempting to map %s to %s: ", m_szDriveToMapTo, szAfsRootDir); - - nr.dwType=RESOURCETYPE_DISK; - nr.lpLocalName=m_szDriveToMapTo; - nr.lpRemoteName=szAfsRootDir; - nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE; - DWORD res=WNetAddConnection2(&nr,NULL,NULL,0); - m_bRootAfsDriveMappingCreated = (res == NO_ERROR); - // m_bRootAfsDriveMappingCreated = (WNetAddConnection(A2S(szAfsRootDir), TEXT(""), A2S(m_szDriveToMapTo)) == NO_ERROR); - g_LogFile.Write(m_bRootAfsDriveMappingCreated ? "succeeded.\r\n" : "failed.\r\n"); - } - - // If we couldn't map a drive, then ask the user to unmap something. - if (!m_bRootAfsDriveMappingCreated) { - int nChoice = MsgBox(m_hDlg, IDS_CANT_MAP_ROOT_AFS, GetAppTitleID(), MB_ICONEXCLAMATION | MB_OKCANCEL); - if (nChoice == IDOK) - goto try_again; - } - - return m_bRootAfsDriveMappingCreated; -} - -static BOOL SetRootAcl() -{ - // Only do this if we just created root.afs - if (!m_bWeCreatedRootAfs) - return TRUE; - - if (!SetTokensInClient()) - return FALSE; - - if (!CreateRootAfsDriveMapping()) - return FALSE; - - g_LogFile.Write("Setting the ACL on root.afs.\r\n"); - - acl_t acl = { READ, NO_WRITE, LOOKUP, NO_DELETE, NO_INSERT, NO_LOCK, NO_ADMIN }; - - m_nResult = afsclient_ACLEntryAdd(m_szDriveToMapTo, "system:anyuser", &acl, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - - -static BOOL CreateRootCell() -{ - ASSERT(g_hCell); - ASSERT(m_hvosServer); - - // If the root.cell volume already exists, then just return. We can get to this step - // and root.cell already exist if: - // - // 1) We could not determine the status of the root volumes when the app was started - // and the user asked us to create the root volumes if they don't exist. - // - // 2) Since there is only one page from which the user decides if they want to create - // the root volumes, there is a chance that one of the root volumes may exist while - // the other doesn't. If that is the case the user is told that the "root volumes" - // don't exist. If they choose to create them, we do this check here to make sure - // we only create the one that doesn't exist. - // - if (g_CfgData.bRootCellExists) - return TRUE; - - // If root.afs exists and we did not just create it, then we cannot make root.cell. For - // now, just pretend we succeeded. TODO: We must handle this better in a future version. - // We can't at this time because the program strings are frozen - we can't add new - // error messages. - if (g_CfgData.bRootAfsExists && !m_bWeCreatedRootAfs) - return TRUE; - - if (!GetPartitionID()) - return FALSE; - - g_LogFile.Write("Creating volume root.cell on partition %d with a quota of %d.\r\n", m_nPartitionID, ROOT_VOLUMES_QUOTA); - - m_nResult = vos_VolumeCreate(g_hCell, m_hvosServer, 0, m_nPartitionID, "root.cell", ROOT_VOLUMES_QUOTA, &g_CfgData.nRootCellID, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Volume root.cell was created with an ID of %d.\r\n", g_CfgData.nRootCellID); - - g_CfgData.bRootCellExists = TRUE; - - m_bWeCreatedRootCell = TRUE; - - return TRUE; -} - -static char *GetRootCellDir() -{ - static char szDir[MAX_CELL_NAME_LEN + 5] = ""; - - if (!szDir[0]) { - ASSERT(g_CfgData.szCellName[0]); - sprintf(szDir, "%s\\%s", m_szDriveToMapTo, GetCellNameA()); - } - - return szDir; -} - -static char *GetRootCellReadWriteDir() -{ - static char szDir[MAX_CELL_NAME_LEN + 5] = ""; - - if (!szDir[0]) { - ASSERT(g_CfgData.szCellName[0]); - sprintf(szDir, "%s\\.%s", m_szDriveToMapTo, GetCellNameA()); - } - - return szDir; -} - -static BOOL MountRootCellStandard() -{ - ASSERT(g_CfgData.szCellName[0]); - - // Only do this if we just created root.cell - if (!m_bWeCreatedRootCell) - return TRUE; - - if (!SetTokensInClient()) - return FALSE; - - if (!CreateRootAfsDriveMapping()) - return FALSE; - - g_LogFile.Write("Mouting root.cell with a Standard mount point at path %s.\r\n", GetRootCellDir()); - - m_nResult = afsclient_MountPointCreate(g_hCell, GetRootCellDir(), "root.cell", READ_ONLY, CHECK_VOLUME, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL SetRootCellAcl() -{ - // Only do this if we just created root.cell - if (!m_bWeCreatedRootCell) - return TRUE; - - if (!SetTokensInClient()) - return FALSE; - - g_LogFile.Write("Setting the ACL on root.cell (dir %s).\r\n", GetRootCellDir()); - - acl_t acl = { READ, NO_WRITE, LOOKUP, NO_DELETE, NO_INSERT, NO_LOCK, NO_ADMIN }; - - m_nResult = afsclient_ACLEntryAdd(GetRootCellDir(), "system:anyuser", &acl, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL MountRootCellRW() -{ - ASSERT(g_CfgData.szCellName[0]); - - // Only do this if we just created root.cell - if (!m_bWeCreatedRootCell) - return TRUE; - - if (!SetTokensInClient()) - return FALSE; - - if (!CreateRootAfsDriveMapping()) - return FALSE; - - g_LogFile.Write("Mounting root.cell with a Read/Write mount point at path %s.\r\n", GetRootCellReadWriteDir()); - - m_nResult = afsclient_MountPointCreate(g_hCell, GetRootCellReadWriteDir(), "root.cell", READ_WRITE, CHECK_VOLUME, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL Replicate() -{ - ASSERT(g_hCell); - ASSERT(m_hvosServer); - - if (!GetPartitionID()) - return FALSE; - - // If only one of the volumes is not replicated, then only replicate - // that volume, or if we could not determine if they were replicated - // until configuration began, and they are replicated, then do nothing. - - if (g_CfgData.bRootAfsExists && !g_CfgData.bRootAfsReplicated) { - g_LogFile.Write("Creating a read only site for volume root.afs using partition ID %d and volume ID %d.\r\n", m_nPartitionID, g_CfgData.nRootAfsID); - - m_nResult = vos_VLDBReadOnlySiteCreate(g_hCell, m_hvosServer, 0, m_nPartitionID, g_CfgData.nRootAfsID, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Releasing the root.afs volume using volume ID %d.\r\n", g_CfgData.nRootAfsID); - - m_nResult = vos_VolumeRelease(g_hCell, 0, g_CfgData.nRootAfsID, VOS_NORMAL, &m_nStatus); - CHECK_RESULT; - - g_CfgData.bRootAfsReplicated = TRUE; - } - - if (g_CfgData.bRootCellExists && !g_CfgData.bRootCellReplicated) { - g_LogFile.Write("Creating a read only site for volume root.cell using partition ID %d and volume ID %d.\r\n", m_nPartitionID, g_CfgData.nRootCellID); - - m_nResult = vos_VLDBReadOnlySiteCreate(g_hCell, m_hvosServer, 0, m_nPartitionID, g_CfgData.nRootCellID, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Releasing the root.cell volume using volume ID %d.\r\n", g_CfgData.nRootCellID); - - m_nResult = vos_VolumeRelease(g_hCell, 0, g_CfgData.nRootCellID, VOS_NORMAL, &m_nStatus); - CHECK_RESULT; - - g_CfgData.bRootCellReplicated = TRUE; - } - - return TRUE; -} - -static BOOL EnableAuthChecking() -{ - ASSERT(g_hCell); - ASSERT(g_CfgData.szHostname[0]); - - void *hbosServer; - - g_LogFile.Write("Bos open of server '%s'.\r\n", GetHostnameA()); - m_nResult = bos_ServerOpen(g_hCell, GetHostnameA(), &hbosServer, &m_nStatus); - CHECK_RESULT; - - ASSERT(hbosServer); - - g_LogFile.Write("Enabling auth checking.\r\n"); - m_nResult = bos_AuthSet(hbosServer, BOS_AUTH_REQUIRED, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Closing bos server connection.\r\n"); - m_nResult = bos_ServerClose(hbosServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL UpgradeLibHandles() -{ - ASSERT(g_CfgData.szCellName[0]); - ASSERT(g_CfgData.szAdminName[0]); - ASSERT(g_CfgData.szAdminPW[0]); - - g_LogFile.Write("Getting credentials in cell '%s' as admin '%s'.\r\n", GetCellNameA(), GetAdminNameA()); - - m_nResult = GetLibHandles(&m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL RestartServers() -{ - ASSERT(g_hCell); - - void *hbosServer; - - g_LogFile.Write("Bos open of server '%s'.\r\n", GetHostnameA()); - m_nResult = bos_ServerOpen(g_hCell, GetHostnameA(), &hbosServer, &m_nStatus); - CHECK_RESULT; - - ASSERT(hbosServer); - - g_LogFile.Write("Stopping and restarting all bos processes.\r\n"); - m_nResult = bos_ProcessAllStopAndRestart(hbosServer, BOS_RESTART_BOS_SERVER, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Closing bos server connection.\r\n"); - m_nResult = bos_ServerClose(hbosServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -void DbAddHostCallback(void *callBackId, cfg_cellServDbStatus_t *statusItemP, int status) -{ - // Is this our call back ID? - if (callBackId != (void *)&m_CallBackID) - return; - - // Update the var that tracks server updates so the main config thread won't - // think we have timed out. - EnterCriticalSection(&m_CritSec); - m_nServerUpdates++; - LeaveCriticalSection(&m_CritSec); - - // Is this the last callback? - if (!statusItemP) { - m_nStatus = status; - m_nResult = !status; - SetEvent(m_hCellServDBUpdateEvent); // Signal config thread that we are done - return; - } - - UINT nStrID; - - // Did the update of the current host succeed? - if (statusItemP->status == 0) - nStrID = IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED; - else { - m_bCellServDbUpdateErr = TRUE; - nStrID = IDS_UPDATING_CELLSERVDB_HOST_FAILED; - } - - TCHAR szMsg[cchRESOURCE]; - GetString(szMsg, nStrID); - _tcscat(szMsg, A2S(statusItemP->fsDbHost)); - ShowCurrentStep(szMsg); - - g_LogFile.Write("Update of the CellServDB file on host %s %s.\r\n", statusItemP->fsDbHost, statusItemP->status ? "failed" : "succeeded"); - - cfg_CellServDbStatusDeallocate(statusItemP, &m_nStatus); - // We don't care if this fails -} - -static BOOL UpdateCellServDB(BOOL bAdding) -{ - ASSERT(g_hServer); - ASSERT(g_CfgData.szCellName[0]); - - int nMaxUpdates; - - cfg_cellServDbUpdateCallBack_t callBack = (cfg_cellServDbUpdateCallBack_t)DbAddHostCallback; - - // Create the event that the callback routine will use to tell us it is finished. - // If we fail to create the event then don't use a callback routine. - m_hCellServDBUpdateEvent = CreateEvent(NULL /* Sec */, FALSE /* Manual Reset */, FALSE /* Initial State */, m_pszCellServDBUpdateEventName); - if (!m_hCellServDBUpdateEvent) { - // Cause the CHECK_RESULT below to fail - m_nResult = 0; - m_nStatus = GetLastError(); - } - CHECK_RESULT; - - // Create our critical section - InitializeCriticalSection(&m_CritSec); - - // Update CellServDB via a SCM if the user specified one - char *pszSCM = 0; - if (g_CfgData.szSysControlMachine[0]) { - pszSCM = GetSysControlMachineA(); - g_LogFile.Write("We will update CellServDB using Sys Control Machine %s.\r\n", pszSCM); - } - - // Update CellServDB on all servers - g_LogFile.Write("Updating CellServDB on all servers in the cell.\r\n"); - if (bAdding) - m_nResult = cfg_CellServDbAddHost(g_hServer, pszSCM, callBack, (void *)&m_CallBackID, &nMaxUpdates, &m_nStatus); - else - m_nResult = cfg_CellServDbRemoveHost(g_hServer, pszSCM, callBack, (void *)&m_CallBackID, &nMaxUpdates, &m_nStatus); - CHECK_RESULT; - - // Update CellServDB for the client on this machine - g_LogFile.Write("Updating the client's CellServDB.\r\n"); - if (bAdding) - cfg_ClientCellServDbAdd(g_hClient, GetCellNameA(), GetHostnameA(), &m_nStatus); - else - cfg_ClientCellServDbRemove(g_hClient, GetCellNameA(), GetHostnameA(), &m_nStatus); - CHECK_RESULT; - - BOOL bDone = FALSE; - - while (!bDone) { - switch (WaitForSingleObject(m_hCellServDBUpdateEvent, CELLSERVDB_UPDATE_TIMEOUT)) - { - case WAIT_OBJECT_0: bDone = TRUE; // The callback function signalled us that it is done. - break; - - case WAIT_TIMEOUT: - // We timed out so see if a server was updated. If it was then all is cool - // and we can keep going (after clearing the server update count flag). - EnterCriticalSection(&m_CritSec); - - if (m_nServerUpdates) - m_nServerUpdates = 0; - else { - // There were no server updates, so we really did timeout - TCHAR szMsg[cchRESOURCE]; - GetString(szMsg, IDS_CELLSERVDB_UPDATE_PROBLEM); - _tcscat(m_szCellServDbUpdateErrMsg, szMsg); - bDone = TRUE; - } - - LeaveCriticalSection(&m_CritSec); - - break; - default: - // No other return values are valid when waiting on an event object - ASSERT(FALSE); - break; - } - } - - DeleteCriticalSection(&m_CritSec); - - CloseHandle(m_hCellServDBUpdateEvent); - - // See if a failure occurred in the callback - CHECK_RESULT; - - return TRUE; -} - -static BOOL AddToCellServDB() -{ - return UpdateCellServDB(TRUE); -} - -static BOOL RemoveFromCellServDB() -{ - return UpdateCellServDB(FALSE); -} - -static BOOL RestartAllDbServers() -{ - ASSERT(g_hServer); - - if (m_bUnconfiguringLastDBServer) - return TRUE; - - g_LogFile.Write("Restarting all DB servers.\r\n"); - m_nResult = cfg_DbServersRestartAll(g_hServer, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Waiting for all DB servers to reach quorum.\r\n"); - m_nResult = cfg_DbServersWaitForQuorum(g_hServer, QUORUM_WAIT_TIMEOUT, &m_nStatus); - CHECK_RESULT; - - m_bDbServersRestarted = TRUE; - - return TRUE; -} - -static BOOL UnconfigDB() -{ - ASSERT(g_hServer); - - m_nResult = RemoveFromCellServDB(); - CHECK_RESULT; - - m_nResult = cfg_DbServersStop(g_hServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL UnconfigBak() -{ - ASSERT(g_hServer); - - int nResult = cfg_DbServersStopAllBackup(g_hServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL UnconfigFS() -{ - ASSERT(g_hServer); - - m_nResult = cfg_FileServerStop(g_hServer, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL UnconfigSCS() -{ - ASSERT(g_hServer); - - m_nResult = cfg_UpdateServerStop(g_hServer, &m_nStatus); - CHECK_RESULT; - - // Since we are no longer the SCS machine, we better null this guy. - g_CfgData.szSysControlMachine[0] = 0; - - return TRUE; -} - -static BOOL UnconfigSCC() -{ - ASSERT(g_hServer); - - m_nResult = cfg_UpdateClientStop(g_hServer, cfg_upclientSysBosSuffix, &m_nStatus); - CHECK_RESULT; - - return TRUE; -} - -static BOOL AllServicesUnconfigured() -{ -#define NOTCONFIGURED(x) (((x) == CS_UNCONFIGURE) || ((x) == CS_NULL)) - - return (NOTCONFIGURED(g_CfgData.configFS) && - NOTCONFIGURED(g_CfgData.configDB) && - NOTCONFIGURED(g_CfgData.configBak) && - NOTCONFIGURED(g_CfgData.configSCS) && - NOTCONFIGURED(g_CfgData.configSCC)); -} - -static BOOL PostConfig() -{ - ASSERT(g_hServer); - - short isStarted = 0, bosProcsRunning = 0; - - if (!AllServicesUnconfigured()) - return TRUE; - - // If there is now no cell, then stop the client - if (m_bUnconfiguringLastDBServer) { - ShowCurrentStep(IDS_STOP_CLIENT_STEP); - StopClient(); - m_bMustExit = TRUE; - } - - // Ask user if the config info should be invalided - g_LogFile.Write("No services are configured so we will ask the user if they want to invalidate the server config info.\r\n"); - int nChoice = Message(MB_OK | MB_YESNO, GetAppTitleID(), IDS_INVALIDATE_CFG_INFO); - if (nChoice == IDNO) { - g_LogFile.Write("User has chosen NOT to invalidate the server config info.\r\n"); - return TRUE; - } - - ShowCurrentStep(IDS_INVALIDATE_CONFIG_INFO_STEP); - - g_LogFile.Write("User has chosen to invalidate the server config info.\r\n"); - - g_LogFile.Write("Stopping the bos server.\r\n"); - m_nResult = cfg_BosServerStop(g_hServer, BOSSERVER_STOP_TIMEOUT, &m_nStatus); - CHECK_RESULT; - - g_LogFile.Write("Invalidating the config info.\r\n"); - m_nResult = cfg_HostInvalidate(g_hServer, &m_nStatus); - CHECK_RESULT; - - m_bCfgInfoInvalidated = TRUE; - - m_bMustExit = TRUE; - - return TRUE; -} - -static void VosCloseServer() -{ - if (m_hvosServer) { - g_LogFile.Write("Closing the connection to this server.\r\n"); - vos_ServerClose(m_hvosServer, &m_nStatus); - m_hvosServer = 0; - } -} - -static void ShowConfigControls(BOOL bShow) -{ - ShowWnd(m_hDlg, IDC_CURRENT_STEP_LABEL, bShow); - ShowWnd(m_hDlg, IDC_CURRENT_STEP, bShow); - ShowWnd(m_hDlg, IDC_CONFIG_PROGRESS, bShow); - ShowWnd(m_hDlg, IDC_PERCENT_COMPLETE_LABEL, bShow); - ShowWnd(m_hDlg, IDC_PERCENT_COMPLETE, bShow); - ShowWnd(m_hDlg, IDC_STATUS_MSG, !bShow); -} - -static void UpdateConfigProgress(int nStepNum) -{ - // Update the progress bar - SendDlgItemMessage(m_hDlg, IDC_CONFIG_PROGRESS, PBM_STEPIT, 0, 0); - - // Update the percent complete - TCHAR buf[16]; - _stprintf(buf, TEXT("%2d%%"), nStepNum * 100 / m_nNumSteps); - - SetWndText(m_hDlg, IDC_PERCENT_COMPLETE, buf); - ForceUpdateWindow(m_hDlg, IDC_PERCENT_COMPLETE); -} - -static void ViewLog() -{ - char szCmdLine[MAX_PATH]; - - if (_access(g_LogFile.GetPath(), 0) != 0) { - ShowError(m_hDlg, 0, IDS_ERROR_NO_LOG_FILE); - return; - } - - sprintf(szCmdLine, "notepad.exe %s", g_LogFile.GetPath()); - - UINT result = WinExec(szCmdLine, SW_SHOW); - if (result < 32) - ShowError(m_hDlg, result, IDS_VIEW_LOG_ERROR); -} - -static void AssignFailure(int nCurStep, int nLastMainStep) -{ - // A config step has failed, so we will first set its state to - // failure. If the step does not have a place on the dialog - // the we must find some other control to show the red X that - // indicates failure. - - m_ConfigSteps[nCurStep].eState = SS_STEP_FAILED; - - // Is the step displayed on the dialog? - if (m_ConfigSteps[nCurStep].nDescID != 0) - return; - - // It isn't so find nearest one that is - for (int ii = nCurStep + 1; ii < m_nNumSteps; ii++) { - CONFIG_STEP& step = m_ConfigSteps[ii]; - if (step.nDescID != 0) { - step.eState = SS_STEP_FAILED; - IF_WIZ(ForceUpdateWindow(m_hDlg, step.nGraphicCtrlID)); - return; - } - } - - // There is no step on the dialog that is after us, so - // use the last one that is there. - m_ConfigSteps[nLastMainStep].eState = SS_STEP_FAILED; - IF_WIZ(ForceUpdateWindow(m_hDlg, m_ConfigSteps[nLastMainStep].nGraphicCtrlID)); -} - -static int GetLastMainStep() -{ - for (int ii = m_nNumSteps - 1; ii >= 0; ii--) { - if (m_ConfigSteps[ii].nDescID != 0) - return ii; - } - - ASSERT(FALSE); // This should never happen! - - return 0; -} - -static void ShowConfigFailedMsg() -{ - LPTSTR pszMsg = FormatString(IDS_CONFIG_FAILED, TEXT("%hs%hs"), LOG_FILE_NAME, AFSDIR_SERVER_LOGS_DIRPATH); - - SetWndText(m_hDlg, IDC_STATUS_MSG, pszMsg); - - FreeString(pszMsg); -} - -static void ShowViewLogButton() -{ - if (g_pWiz) - g_pWiz->SetButtonText(IDNEXT, IDS_VIEW_LOG); - else { - ShowAndEnable(m_hDlg, IDNEXT); - MoveWnd(m_hDlg, IDCANCEL, -45, 0); - // I had to add the code below because of a problem, where if config failed, the - // error message dialog would display over our window, and when our window next got - // fully displayed, the buttons would be misdrawn. - ForceUpdateWindow(m_hDlg, IDNEXT); - ForceUpdateWindow(m_hDlg, IDCANCEL); - } -} - -static DWORD WINAPI ConfigServer(LPVOID param) -{ - HWND hLogo; - - if (!g_pWiz) { - hLogo = GetDlgItem(m_hDlg, IDC_LOGO); - AfsAppLib_StartAnimation(hLogo); - } - - // Disable all buttons (doesn't affect the Cancel button) - IF_WIZ(g_pWiz->EnableButtons(0)); - - g_LogFile.Write("Configuring server\r\n"); - - m_bConfiguring = TRUE; - m_bConfigured = FALSE; - m_bDbServersRestarted = FALSE; - - // Hide the message window and show the config controls - ShowConfigControls(); - - InitProgressBar(); - - BOOL bResult = TRUE; - int nStepNum = 0; - - int nLastMainStep; - IF_WIZ(nLastMainStep = GetLastMainStep()); - - // Loop over each config step performing the ones that are enabled. - for (int nCurStep = 0; (nCurStep < m_nNumSteps) && bResult; nCurStep++) { - CONFIG_STEP& step = m_ConfigSteps[nCurStep]; - - nStepNum++; - - // Show this step's status message - ShowCurrentStep(step.nMsgID); - - step.eState = SS_STEP_IN_PROGRESS; - - // If this is a displayed step, then update its display - if (step.nGraphicCtrlID) - IF_WIZ(ForceUpdateWindow(m_hDlg, step.nGraphicCtrlID)); - - if (CheckCancel()) - break; - - // Perform the config function - bResult = step.pFunc(); - - if (bResult) { - if (g_pWiz) { - // Changing a step's state changes what picture is shown on the dialog - // (if that state is displayed on the dialog). - - // If this is the last displayed step, then don't change its state - // because there may still be more steps to perform. We want to use - // the last step's picture to indicate the final config state. - - // If not last step, then change state - if (nCurStep != nLastMainStep) - step.eState = SS_STEP_FINISHED; - - // If last step then go ahead and show the state - but do it on the last - // step displayed on the dialog (nLastMainStep). - if (nCurStep == m_nNumSteps - 1) { - m_ConfigSteps[nLastMainStep].eState = SS_STEP_FINISHED; - // Do the next line so ForceUpdateWindow below will redraw the - // correct control - step = m_ConfigSteps[nLastMainStep]; - } - } - - UpdateConfigProgress(nStepNum); - } else { - // Show the 'X' error marker on the next unprocessed step, or on the - // last step if there are no more. - IF_WIZ(AssignFailure(nCurStep, nLastMainStep)); - step.eState = SS_STEP_FAILED; - } - - if (step.nGraphicCtrlID) - IF_WIZ(ForceUpdateWindow(m_hDlg, step.nGraphicCtrlID)); - } - - // Close m_hvosServer if it is open - VosCloseServer(); - - // Hide the config controls and show the message window - ShowConfigControls(FALSE); - - // Did we succeed? - if (CheckCancel()) { - g_LogFile.Write("User has canceled configuration.\r\n"); - SetWndText(m_hDlg, IDC_STATUS_MSG, IDS_CONFIG_CANCELED); - IF_WIZ(g_pWiz->EnableButtons(BACK_BUTTON)); - if (!g_pWiz) - ShowExitButton(); - } else if (bResult) { - g_LogFile.Write("Configuration succeeded.\r\n"); - if (g_CfgData.bFirstServer) - SetWndText(m_hDlg, IDC_STATUS_MSG, IDS_CONFIG_SUCCEEDED_FIRST_SERVER); - else if (m_bDbServersRestarted) - SetWndText(m_hDlg, IDC_STATUS_MSG, IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE); - else - SetWndText(m_hDlg, IDC_STATUS_MSG, IDS_CONFIG_SUCCEEDED); - IF_WIZ(g_pWiz->EnableButtons(NEXT_BUTTON)); - ShowExitButton(); - m_bConfigured = TRUE; - - // Disable cancel button - IF_WIZ(SetEnable(g_pWiz->GetWindow(), IDCANCEL, ES_DISABLE)); - } else { - g_LogFile.Write("Configuration has failed.\r\n"); - ShowConfigFailedMsg(); - // Prevent partial configuration - if (!g_CfgData.bValidServerInfo) - cfg_HostInvalidate(g_hServer, &m_nStatus); - IF_WIZ(g_pWiz->EnableButtons(NEXT_BUTTON)); - ShowViewLogButton(); - m_bConfigFailed = TRUE; - } - - if (!g_pWiz) - AfsAppLib_StopAnimation(hLogo); - - IF_WIZ(g_pWiz->SetDefaultControl(IDNEXT)); - - m_bConfiguring = FALSE; - - // Show the user any CellServDB update errors - if (m_bCellServDbUpdateErr) { - TCHAR szTitle[cchRESOURCE], szMsg[cchRESOURCE + MAX_PATH]; - GetString(szTitle, GetAppTitleID()); - GetString(szMsg, IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE); - lstrcat(szMsg, A2S(g_LogFile.GetPath())); - lstrcat(szMsg, TEXT(".")); - MessageBox(m_hDlg, szMsg, szTitle, MB_OK | MB_ICONEXCLAMATION); - } - - // Warn the user if we are going to force the config manager to exit - if (m_bMustExit) { - if (m_bUnconfiguringLastDBServer) - MsgBox(m_hDlg, IDS_CELL_IS_GONE_MUST_EXIT, GetAppTitleID(), MB_OK | MB_ICONSTOP); - else - MsgBox(m_hDlg, IDS_CONFIG_INFO_INVALIDATED, GetAppTitleID(), MB_OK); - } - - // Unmap the root afs drive if we had one - if (m_bRootAfsDriveMappingCreated) { - // Let's not bother the user if this fails; we'll just log it. - g_LogFile.Write("Attempting to remove the drive mapping to root.afs: "); - BOOL bCanceled = WNetCancelConnection(A2S(m_szDriveToMapTo), TRUE) == NO_ERROR; - g_LogFile.Write(bCanceled ? "succeeded.\r\n" : "failed.\r\n"); - m_bRootAfsDriveMappingCreated = !bCanceled; - } - - return 0; -} - diff --git a/src/WINNT/afssvrcfg/create_partition_dlg.cpp b/src/WINNT/afssvrcfg/create_partition_dlg.cpp deleted file mode 100644 index 93f419bef..000000000 --- a/src/WINNT/afssvrcfg/create_partition_dlg.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" // Main header for this application -#include "resource.h" -#include "create_partition_dlg.h" -#include "volume_utils.h" -#include "partition_utils.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ -static HWND hDlg = 0; // This dialog's HWND -static HWND hDriveList = 0; -static BOOL bAutoSetPartitionName = TRUE; -static HLISTITEM hSelectedItem = 0; -static BOOL bCreated; // TRUE if a partition was created - -static const UINT IDD = IDD_CREATE_PARTITION; // Dialog's resource ID - -static TCHAR szPartitionName[MAX_PARTITION_NAME_LEN]; -static TCHAR szDrive[4]; -static TCHAR szSize[32]; - -static rwWindowData arwDialog[] = { - { IDC_TITLE, raSizeX | raRepaint, 0, 0 }, - { IDC_DRIVE_LIST, raSizeX | raSizeY, MAKELONG(350, 150), 0 }, - { IDC_ARGS_FRAME, raSizeX | raMoveY, 0, 0 }, - { IDC_NAME_STATIC, raMoveY | raRepaint, 0, 0 }, - { IDC_VICEP_STATIC, raMoveY | raRepaint, 0, 0 }, - { IDC_PARTITION_NAME, raMoveY | raRepaint, 0, 0 }, - { IDC_CREATE, raMoveX | raMoveY, 0, 0 }, - { IDC_CLOSE, raMoveX | raMoveY, 0, 0 }, - { 9, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } -}; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -static void OnInitDialog(HWND hwndDlg); -static void OnClose(); -static void OnCreate(); -static void OnListSelection(LPFLN_ITEMSELECT_PARAMS pItemParms); -static void OnPartitionName(); -static void CheckEnableButtons(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL CreatePartition(HWND hParent) -{ - ModalDialog(IDD, hParent, (DLGPROC)DlgProc); - - return bCreated; -} - - -/* - * STATIC FUNCTIONS ___________________________________________________________ - * - */ - -/* - * Dialog Proc ________________________________________________________________ - * - */ -static BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (AfsAppLib_HandleHelp(IDD_CREATE_PARTITION, hwndDlg, uMsg, wParam, lParam)) - return TRUE; - - switch (uMsg) { - case WM_INITDIALOG: OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: switch (LOWORD(wParam)) { - case IDC_CLOSE: OnClose(); - break; - - case IDC_CREATE: OnCreate(); - break; - - case IDC_PARTITION_NAME: - if (HIWORD(wParam) == EN_CHANGE) { - OnPartitionName(); - SetFocus((HWND)lParam); - } - break; - } - break; - - case WM_NCACTIVATE: if (wParam) - UpdateDriveList(); - break; - - case WM_NOTIFY: if ((((LPNMHDR)lParam)->code) == FLN_ITEMSELECT) - OnListSelection((LPFLN_ITEMSELECT_PARAMS)lParam); - break; - - case WM_SIZE: if (lParam != 0) - ResizeWindow(hwndDlg, arwDialog, rwaFixupGuts); - break; - - } - - return FALSE; -} - - -/* - * Event Handler Functions ____________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - ResizeWindow(hDlg, arwDialog, rwaFixupGuts); - - hDriveList = GetDlgItem(hDlg, IDC_DRIVE_LIST); - - bAutoSetPartitionName = TRUE; - hSelectedItem = 0; - - SetupDriveList(hDriveList); - - bCreated = FALSE; -} - -static void OnClose() -{ - EndDialog(hDlg, IDCANCEL); -} - -static void OnCreate() -{ - ASSERT(g_hServer); - - HLISTITEM hItem = FastList_FindFirstSelected(hDriveList); - _ASSERTE(hItem); - - GetWindowText(GetDlgItem(hDlg, IDC_PARTITION_NAME), szPartitionName, sizeof(szPartitionName)); - if (!Validation_IsValid(szPartitionName, VALID_AFS_PARTITION_NAME)) - return; - - lstrcpy(szDrive, FastList_GetItemText(hDriveList, hItem, 0)); - lstrcpy(szSize, FastList_GetItemText(hDriveList, hItem, 2)); - - // Constuct the device name - char szDevNameA[] = "?:"; - S2A drive(szDrive); - szDevNameA[0] = ((char*)drive)[0]; - - // Construct the partition name - char szPartNameA[9] = "/vicep"; - strncat(szPartNameA, (char *)S2A(szPartitionName), 2); - - if (DoesPartitionExist(A2S(szPartNameA))) { - MsgBox(hDlg, IDS_PARTITION_EXISTS, GetAppTitleID(), MB_OK | MB_ICONSTOP); - return; - } - - g_LogFile.Write("Adding an AFS partition on device '%s' with name '%s'.\r\n", szDevNameA, szPartNameA); - - afs_status_t nStatus; - int nResult = cfg_HostPartitionTableAddEntry(g_hServer, szPartNameA, szDevNameA, &nStatus); - if (!nResult) { - ShowError(hDlg, nStatus, IDS_CREATE_PARTITION_ERROR); - return; - } - - MsgBox(hDlg, IDS_PARTITION_CREATED, GetAppTitleID(), MB_OK); - - bCreated = TRUE; - - SetWndText(hDlg, IDC_PARTITION_NAME, TEXT("")); -} - -static void OnPartitionName() -{ - TCHAR szBuf[MAX_PARTITION_NAME_LEN]; - GetWindowText(GetDlgItem(hDlg, IDC_PARTITION_NAME), szBuf, MAX_PARTITION_NAME_LEN); - - bAutoSetPartitionName = szBuf[0] == 0; - - CheckEnableButtons(); -} - -static void OnListSelection(LPFLN_ITEMSELECT_PARAMS pItemParms) -{ - ASSERT(pItemParms); - - hSelectedItem = 0; - - if (pItemParms->hItem) { - LPARAM lParam = FastList_GetItemParam(hDriveList, pItemParms->hItem); - if (lParam == 0) { - hSelectedItem = pItemParms->hItem; - - if (bAutoSetPartitionName) { - TCHAR szName[2]; - LPCTSTR pDrive = FastList_GetItemText(hDriveList, hSelectedItem, 0); - szName[0] = _totlower(pDrive[0]); - szName[1] = 0; - - TCHAR szFullName[6] = TEXT("vice"); - lstrcat(szFullName, szName); - - if (!DoesPartitionExist(szFullName)) { - SetWndText(hDlg, IDC_PARTITION_NAME, szName); - - // Must set this to true because the call to SetWndText will cause - // a call to OnPartitionName, which would incorrectly think that the - // Partition Name had been set by the user rather than by us, thus - // setting bAutoSetPartitionName to false. - bAutoSetPartitionName = TRUE; - } - } - } - } - - CheckEnableButtons(); -} - -static void CheckEnableButtons() -{ - TCHAR szBuf[MAX_PARTITION_NAME_LEN]; - - GetWindowText(GetDlgItem(hDlg, IDC_PARTITION_NAME), szBuf, MAX_PARTITION_NAME_LEN); - - ENABLE_STATE es = ES_ENABLE; - - if ((hSelectedItem == 0) || (szBuf[0] == 0)) - es = ES_DISABLE; - - SetEnable(hDlg, IDC_CREATE, es); -} - diff --git a/src/WINNT/afssvrcfg/create_partition_dlg.h b/src/WINNT/afssvrcfg/create_partition_dlg.h deleted file mode 100644 index 52746c671..000000000 --- a/src/WINNT/afssvrcfg/create_partition_dlg.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _CREATE_PARTITION_DLG_H_ -#define _CREATE_PARTITION_DLG_H_ - -BOOL CreatePartition(HWND hParent); - -#endif // _CREATE_PARTITION_DLG_H_ - diff --git a/src/WINNT/afssvrcfg/db_server_page.cpp b/src/WINNT/afssvrcfg/db_server_page.cpp deleted file mode 100644 index 1f6c54999..000000000 --- a/src/WINNT/afssvrcfg/db_server_page.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void ConfigMsg(UINT nMsgID); -static void EnableSCM(ENABLE_STATE enable); -static void SavePageInfo(); -static void ShowPageInfo(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK DBServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - SavePageInfo(); - g_pWiz->SetState(sidSTEP_SEVEN); - break; - - case IDBACK: - SavePageInfo(); - g_pWiz->SetState(sidSTEP_FIVE); - break; - - case IDC_DONT_CONFIG_DB_SERVER: - g_CfgData.configDB = CS_DONT_CONFIGURE; - EnableSCM(ES_DISABLE); - break; - - case IDC_CONFIG_DB_SERVER: - g_CfgData.configDB = CS_CONFIGURE; - EnableSCM(ES_ENABLE); - break; - } - break; - - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.bFirstServer) { - ConfigMsg(IDS_MUST_CONFIG_DB); - g_CfgData.configDB = CS_CONFIGURE; - return; - } - - ShowPageInfo(); - - switch (g_CfgData.configDB) { - case CS_ALREADY_CONFIGURED: - ConfigMsg(IDS_ALREADY_A_DB_SERVER); - break; - - case CS_DONT_CONFIGURE: - SetCheck(hDlg, IDC_DONT_CONFIG_DB_SERVER); - EnableSCM(ES_DISABLE); - break; - - case CS_CONFIGURE: - default: - SetCheck(hDlg, IDC_CONFIG_DB_SERVER); - EnableSCM(ES_ENABLE); - break; - } -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ - -static void ConfigMsg(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - // Hide the controls that are at the same position as the message - ShowWnd(hDlg, IDC_DB_SERVER_QUESTION, FALSE); - ShowWnd(hDlg, IDC_CONFIG_DB_SERVER, FALSE); - ShowWnd(hDlg, IDC_SCM_PROMPT, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE_LABEL, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE, FALSE); - - ShowWnd(hDlg, IDC_DONT_CONFIG_DB_SERVER, FALSE); - - SetWndText(hDlg, IDC_MSG, szMsg); - ShowWnd(hDlg, IDC_MSG); -} - -static void EnableSCM(ENABLE_STATE enable) -{ - SetEnable(hDlg, IDC_SCM_PROMPT, enable); - SetEnable(hDlg, IDC_SYS_CONTROL_MACHINE_LABEL, enable); - SetEnable(hDlg, IDC_SYS_CONTROL_MACHINE, enable); -} - -static void ShowPageInfo() -{ - SetWndText(hDlg, IDC_SYS_CONTROL_MACHINE, g_CfgData.szSysControlMachine); -} - -static void SavePageInfo() -{ - GetWndText(hDlg, IDC_SYS_CONTROL_MACHINE, g_CfgData.szSysControlMachine); -} - diff --git a/src/WINNT/afssvrcfg/disabled.ico b/src/WINNT/afssvrcfg/disabled.ico deleted file mode 100644 index 8ac750e3129edf6c8c50c617f4d0e89a6a12b0e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmah^D;5GV44gg?;8vlLoDb8ki)&Yb>qhNWdIOHZ0Wi2Q****p9{J4VP0}_60(}?; zxSaxUaAvx4WCm=BKwI$}2*7|yCn8I<*2vzlHDKlylkSqkAIlsvOUTn)iYCcX<5-=? zs^=sZGhOT{yBM{`C@9mcr3j$dUwOHM{(hwI;k$7C4d?j(PZJ7_`eOm^w?6wm_X2?G BNi+Ze diff --git a/src/WINNT/afssvrcfg/disk_dri.ico b/src/WINNT/afssvrcfg/disk_dri.ico deleted file mode 100644 index 00e858081a879a3a253e22179e6fa7268bab1289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmah^F%rTs43m!xbj!rdF)@}mb?VeH9lfO+U&^!CjFfV)a92B$a+Z@gfH8B^?3tZSo%CLABLyLQRwMp7@2<7=P8YxJ2{? emUzA^?eDgEfAVc@0JbMk!k6fXo5Pj;qnTF~* -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void ConfigMsg(UINT nMsgID); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK FileServerPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - g_pWiz->SetState(sidSTEP_SIX); - break; - - case IDBACK: - g_pWiz->SetState(sidSTEP_FOUR); - break; - - case IDC_DONT_CONFIG_FILE_SERVER: - g_CfgData.configFS = CS_DONT_CONFIGURE; - break; - - case IDC_SHOULD_CONFIG_FILE_SERVER: - g_CfgData.configFS = CS_CONFIGURE; - break; - } - break; - - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.bFirstServer) { - ConfigMsg(IDS_MUST_CONFIG_FS); - g_CfgData.configFS = CS_CONFIGURE; - return; - } - - switch (g_CfgData.configFS) { - case CS_ALREADY_CONFIGURED: - ConfigMsg(IDS_ALREADY_A_FS_SERVER); - break; - - case CS_DONT_CONFIGURE: - SetCheck(hDlg, IDC_DONT_CONFIG_FILE_SERVER); - break; - - case CS_CONFIGURE: - default: - SetCheck(hDlg, IDC_SHOULD_CONFIG_FILE_SERVER); - break; - } -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void ConfigMsg(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - // Hide the controls that are at the same position as the message - ShowWnd(hDlg, IDC_CREATE_FS_QUESTION, FALSE); - ShowWnd(hDlg, IDC_SHOULD_CONFIG_FILE_SERVER, FALSE); - ShowWnd(hDlg, IDC_DONT_CONFIG_FILE_SERVER, FALSE); - - SetWndText(hDlg, IDC_MSG, szMsg); - ShowWnd(hDlg, IDC_MSG); -} - diff --git a/src/WINNT/afssvrcfg/folder.ico b/src/WINNT/afssvrcfg/folder.ico deleted file mode 100644 index 3e9459420e6f0dcfd60652115b33641ce49ff01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmeHHI}XAy41H-Cm{5<93H2Bp3yA@5bn9_oOmD*xx`pTbimD<&WyGz2d9CxY9l)T1 zwGEW+6|kpnn&`I%*wsMGF-ty>4K|d3@Y`h)f<#23qNEAu9JK;IyzpKvG9MjM@u#m& zpo>)g>90z+$v>Y+$H|}L3a`PLH1Ed}|HAlOQt`LX!F9Cjq<{-X2=@aahQ;&=*WL@~ z8`7Lw=UVxeoa@}tUM69U6JbpUMM-m2o#%Y!JoYJn#ZUQq>4$xc$ayH|KRfr>Z(KV2 Qn;U)4yaR;oIfOn19szd#0ssI2 diff --git a/src/WINNT/afssvrcfg/get_cur_config.cpp b/src/WINNT/afssvrcfg/get_cur_config.cpp deleted file mode 100644 index 6766e791f..000000000 --- a/src/WINNT/afssvrcfg/get_cur_config.cpp +++ /dev/null @@ -1,537 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "partition_utils.h" -#include "resource.h" - -extern "C" { -#include "afs_vosAdmin.h" -#include "afs\vlserver.h" -} - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static LPPROGRESSDISPLAY pProg; -static const int MAX_STEPS = 10; -static BOOL bCancel; -static BOOL bBakConfigured; -static vos_vldbEntry_t vldbRootAfsEntry; -static vos_vldbEntry_t vldbRootCellEntry; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -BOOL CALLBACK GetCurConfigDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp); -static DWORD CALLBACK GetCurrentConfigState(LPPROGRESSDISPLAY ppd, LPARAM lp); -static void ShowMsg(UINT uiMsgID); -static void NextStep(UINT uiMsgID); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ -int GetCurrentConfig(HWND hParent, BOOL& bCanceled) -{ - pProg = 0; - bCancel = FALSE; - bBakConfigured = FALSE; - - pProg = New2 (PROGRESSDISPLAY,(hParent, IDD_GET_CURRENT_CONFIG, (DLGPROC)GetCurConfigDlgProc)); - pProg->SetProgressRange(0, MAX_STEPS); - - HWND hLogo = GetDlgItem(pProg->GetWindow(), IDC_LOGO); - AfsAppLib_StartAnimation(hLogo); - - pProg->Show(GetCurrentConfigState, 0); - - AfsAppLib_StopAnimation(hLogo); - - int dwResult = pProg->GetStatus(); - - pProg->Close(); - - bCanceled = bCancel; - - return dwResult; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -static BOOL CALLBACK GetCurConfigDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - BOOL bOn = FALSE; - - switch (msg) { - case WM_INITDIALOG: - bCancel = FALSE; - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: if (QueryCancelWiz()) { - bCancel = TRUE; - ShowMsg(IDS_CANCEL_GET_CONFIG); - } - break; - } - break; - } - - return FALSE; -} - -static BOOL IsClientConfigured(BOOL& bConfigured, afs_status_t& nStatus) -{ - if (bCancel) - return FALSE; - - bConfigured = FALSE; - - NextStep(IDS_CHECK_AFS_CLIENT); - - short isInstalled; - afs_status_t configStatus; - char *pszCellName = 0; - - g_LogFile.Write("Is the AFS Client installed on this machine: "); - if (!cfg_ClientQueryStatus(GetHostnameA(), &isInstalled, &g_CfgData.nClientVersion, &configStatus, &pszCellName, &nStatus)) { - ImmediateErrorDialog(nStatus, IDS_ERROR_AFS_CLIENT_CHECK); - return FALSE; - } - - g_LogFile.WriteBoolResult((BOOL)isInstalled); - - bConfigured = (BOOL)(configStatus == 0); - if (bConfigured) - lstrncpy(g_CfgData.szClientCellName, A2S(pszCellName), MAX_CELL_NAME_LEN); - else - g_LogFile.WriteError("The client configuration information on this host is not valid", configStatus); - - if (!isInstalled) { - g_LogFile.Write("ERROR: AFS Client is not installed. The AFS Server requires the AFS Client.\r\n"); - ImmediateErrorDialog(0, IDS_ERROR_AFS_CLIENT_NOT_INSTALLED); - nStatus = -1; // Just need something nonzero - return FALSE; - } - - return TRUE; -} - -/* - * NOTE: This function has an important side effect. If this machine - * is not the first in a new cell, then this function will get the - * cell name from the config info. The cell name may be needed in - * config calls that come later, and so this function must be called - * before they are. - */ -static int IsConfigInfoValid(BOOL& bValid, afs_status_t& nStatus) -{ - if (bCancel) - return FALSE; - - afs_status_t configStatus; - char *pszCellName = 0; - - NextStep(IDS_CHECK_CONFIG_INFO); - - bValid = FALSE; - - g_LogFile.Write("Is there valid configuration information on this machine: "); - int nResult = cfg_HostQueryStatus(GetHostnameA(), &configStatus, &pszCellName, &nStatus); - if (!nResult) - return FALSE; - - g_LogFile.WriteBoolResult((configStatus == 0)); - - if (configStatus == 0) - lstrncpy(g_CfgData.szCellName, A2S(pszCellName), MAX_CELL_NAME_LEN); - else - g_LogFile.WriteError("The configuration information on this host is not valid", configStatus); - - bValid = (BOOL)(configStatus == 0); - - return TRUE; -} - -static int StartBosServer(afs_status_t& nStatus) -{ - short isStarted; - short isBosProc; - - g_LogFile.Write("Checking if bos server is running.\r\n"); - int nResult = cfg_BosServerQueryStatus(g_hServer, &isStarted, &isBosProc, &nStatus); - if (!nResult) - return nResult; - - if (!isStarted) { - g_LogFile.Write("Starting the bos server in %s mode.\r\n", g_CfgData.bValidServerInfo ? "auth" : "no auth"); - nResult = cfg_BosServerStart(g_hServer, !g_CfgData.bValidServerInfo, BOSSERVER_START_TIMEOUT, &nStatus); - } - - return nResult; -} - -static BOOL AreWeLastDBServer(BOOL& bLast, afs_status_t& nStatus) -{ - ASSERT(g_CfgData.szHostname[0]); - - char *pszCellname = 0; - char *pszCellServDB = 0; - - bLast = FALSE; - - g_LogFile.Write("Checking if this machine is the last DB server in the cell.\r\n"); - - g_LogFile.Write("Getting CellServDB from host %s.\r\n", GetHostnameA()); - int nResult = cfg_CellServDbEnumerate(GetHostnameA(), &pszCellname, &pszCellServDB, &nStatus); - if (!nResult) - return FALSE; - - if (!pszCellServDB) { - g_LogFile.Write("There are no DB servers in CellServDB!!!!!"); - ASSERT(FALSE); // This should not be possible - return FALSE; - } - - char *psz = pszCellServDB; - - for (int i = 0; *psz; psz += strlen(psz) + 1) - i++; - - if (i == 1) { - ASSERT(lstrcmp(g_CfgData.szHostname, A2S(pszCellServDB)) == 0); - g_LogFile.Write("This machine IS the last DB server in the cell.\r\n"); - bLast = TRUE; - } else - g_LogFile.Write("This machine is NOT the last DB server in the cell.\r\n"); - - return TRUE; -} - -static afs_status_t IsFSConfigured(BOOL& bConfigured) -{ - g_LogFile.Write("Is this machine a file server: "); - - bConfigured = FALSE; - - short isStarted; - afs_status_t nStatus; - - int nResult = cfg_FileServerQueryStatus(g_hServer, &isStarted, &nStatus); - if (!nResult) - return nStatus; - - bConfigured = isStarted; - - g_LogFile.WriteBoolResult(bConfigured); - - return 0; -} - -static afs_status_t IsDBConfigured(BOOL& bConfigured) -{ - g_LogFile.Write("Is this machine a db (or bak) server: "); - - bConfigured = FALSE; - - short isStarted, isBakStarted; - afs_status_t nStatus; - - int nResult = cfg_DbServersQueryStatus(g_hServer, &isStarted, &isBakStarted, 0, &nStatus); - if (!nResult) - return nStatus; - - bConfigured = isStarted; - bBakConfigured = isBakStarted; - - g_LogFile.Write(bConfigured ? "Yes DB" : "No DB"); - g_LogFile.Write(", %s.\r\n", bBakConfigured ? "Yes Bak" : "No Bak"); - - return 0; -} - -static afs_status_t IsBakConfigured(BOOL& bConfigured) -{ - bConfigured = bBakConfigured; - - return 0; -} - -static afs_status_t DoesAPartitionExist(BOOL& bExists) -{ - g_LogFile.Write("Does a partition exist on this machine: "); - - bExists = FALSE; - - afs_status_t nStatus; - - int nResult = ReadPartitionTable(&nStatus); - if (!nResult) - return nStatus; - - int nNumPartitions = 0; - - cfg_partitionEntry_t *pTable = GetPartitionTable(nNumPartitions); - - bExists = nNumPartitions > 0; - if (bExists) { - g_CfgData.chDeviceName = pTable->deviceName[0]; - lstrcpy(g_CfgData.szPartitionName, ((TCHAR *)A2S(pTable->partitionName)) + lstrlen(TEXT("/vicep"))); - } - - g_LogFile.WriteBoolResult(bExists); - - return 0; -} - -afs_status_t DoRootVolumesExist(BOOL& bExists) -{ - bExists = FALSE; - - afs_status_t nStatus; - - g_LogFile.Write("Do the root volumes exist: "); - - // Does root.afs exist? If it does not, the call will fail with the VL_NOENT - // status. Any other error causes this function to fail. - int nResult = vos_VLDBGet(g_hCell, 0, 0, "root.afs", &vldbRootAfsEntry, &nStatus); - if (nResult) { - g_CfgData.bRootAfsExists = TRUE; - g_CfgData.nRootAfsID = vldbRootAfsEntry.volumeId[0]; - } else if (nStatus != VL_NOENT) - return nStatus; - - // Does root.cell exist? - nResult = vos_VLDBGet(g_hCell, 0, 0, "root.cell", &vldbRootCellEntry, &nStatus); - if (nResult) { - g_CfgData.bRootCellExists = TRUE; - g_CfgData.nRootCellID = vldbRootCellEntry.volumeId[0]; - } else if (nStatus != VL_NOENT) - return nStatus; - - bExists = g_CfgData.bRootAfsExists && g_CfgData.bRootCellExists; - - g_LogFile.WriteBoolResult(bExists); - - return 0; -} - -static BOOL IsVolumeReplicated(vos_vldbEntry_t& vldbEntry) -{ - if (vldbEntry.numServers <= 1) - return FALSE; - - for (int i = 0; i < vldbEntry.numServers; i++) { - if ((vldbEntry.volumeSites[i].serverFlags & VOS_VLDB_READ_ONLY) || - (vldbEntry.volumeSites[i].serverFlags & VOS_VLDB_NEW_REPSITE)) - return TRUE; - } - - return FALSE; -} - -afs_status_t AreRootVolumesReplicated(BOOL& bReplicated) -{ - g_LogFile.Write("Are the root volumes replicated: "); - - // Is root.afs replicated? - g_CfgData.bRootAfsReplicated = IsVolumeReplicated(vldbRootAfsEntry); - - // Is root.cell replicated? - g_CfgData.bRootCellReplicated = IsVolumeReplicated(vldbRootCellEntry); - - bReplicated = g_CfgData.bRootAfsReplicated && g_CfgData.bRootCellReplicated; - - g_LogFile.WriteBoolResult(bReplicated); - - return 0; -} - -static afs_status_t IsSCSConfigured(BOOL& bConfigured) -{ - g_LogFile.Write("Is this machine a System Control Server: "); - - bConfigured = FALSE; - - short isUpserver, isSC, isBin; - afs_status_t nStatus; - - int nResult = cfg_UpdateServerQueryStatus(g_hServer, &isUpserver, &isSC, &isBin, &nStatus); - if (!nResult) - return nStatus; - - bConfigured = isUpserver && isSC; - - g_LogFile.WriteBoolResult(bConfigured); - - return 0; -} - -static afs_status_t IsSCCConfigured(BOOL& bConfigured) -{ - g_LogFile.Write("Is this machine a System Control Client: "); - - bConfigured = FALSE; - - short isUpclient, isSCC, isBin; - afs_status_t nStatus; - - int nResult = cfg_UpdateClientQueryStatus(g_hServer, &isUpclient, &isSCC, &isBin, &nStatus); - if (!nResult) - return nStatus; - - bConfigured = isUpclient && isSCC; - - g_LogFile.WriteBoolResult(bConfigured); - - return 0; -} - -static void ShowMsg(UINT uiMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, uiMsgID); - - pProg->SetOperation(szMsg); -} - -static void NextStep(UINT uiMsgID) -{ - static nCurStep = 1; - - if (bCancel) - return; - - ShowMsg(uiMsgID); - - pProg->SetProgress(nCurStep++); - - Sleep(50); -} - -static BOOL CheckConfigState(afs_status_t (*ConfigCheckFunc)(BOOL&), CONFIG_STATE& state, afs_status_t& nStatus, UINT uiMsgID) -{ - BOOL bState = FALSE; - - if (bCancel) - return FALSE; - - NextStep(uiMsgID); - - nStatus = ConfigCheckFunc(bState); - if (nStatus) { - g_LogFile.WriteError("Config check failed", nStatus); - return FALSE; - } - - state = bState ? CS_ALREADY_CONFIGURED : CS_NULL; - - return TRUE; -} - -static DWORD CALLBACK GetCurrentConfigState(LPPROGRESSDISPLAY ppd, LPARAM lp) -{ - afs_status_t nStatus = 0; - - ASSERT(pProg); - - g_LogFile.Write("Checking this machine's current configuration...\r\n"); - - if (!IsClientConfigured(g_CfgData.bValidClientInfo, nStatus)) - return nStatus; - - if (!IsConfigInfoValid(g_CfgData.bValidServerInfo, nStatus)) - return nStatus; - - // If the server and client have good config info, and the client is in a - // different cell than the server, then the config routines will want to - // reconfigure the client. To do so they need information that we already - // know and don't have to ask the user for. Prefill this information here. - if (g_CfgData.bValidClientInfo && g_CfgData.bValidServerInfo && - (lstrcmp(g_CfgData.szCellName, g_CfgData.szClientCellName) != 0)) - { - lstrcpy(g_CfgData.szCellServDbHostname, g_CfgData.szHostname); - } - - if (!GetLibHandles(&nStatus)) - return nStatus; - - if (!CheckConfigState(DoesAPartitionExist, g_CfgData.configPartition, nStatus, IDS_CHECK_PARTITION)) - return nStatus; - - if (g_CfgData.bValidServerInfo) { - // Must check if bos server is running, and start it if it isn't. We can't determine - // if the services are running except by asking the bosserver. - if (!StartBosServer(nStatus)) - return nStatus; - - if (!CheckConfigState(IsFSConfigured, g_CfgData.configFS, nStatus, IDS_CHECK_FS_CONFIG)) - return nStatus; - - if (!CheckConfigState(IsDBConfigured, g_CfgData.configDB, nStatus, IDS_CHECK_DB_CONFIG)) - return nStatus; - - if (g_CfgData.configDB == CS_ALREADY_CONFIGURED) { - if (!AreWeLastDBServer(g_CfgData.bLastDBServer, nStatus)) - return nStatus; - } - - if (!CheckConfigState(IsBakConfigured, g_CfgData.configBak, nStatus, IDS_CHECK_BAK_CONFIG)) - return nStatus; - - if (!CheckConfigState(DoRootVolumesExist, g_CfgData.configRootVolumes, nStatus, IDS_CHECK_ROOT_AFS)) - return nStatus; - - g_CfgData.bRootVolumesExistanceKnown = TRUE; - - if (!CheckConfigState(AreRootVolumesReplicated, g_CfgData.configRep, nStatus, IDS_CHECK_REP)) - return nStatus; - - g_CfgData.bRootVolumesReplicationKnown = TRUE; - - if (!CheckConfigState(IsSCSConfigured, g_CfgData.configSCS, nStatus, IDS_CHECK_SCS)) - return nStatus; - - if (!CheckConfigState(IsSCCConfigured, g_CfgData.configSCC, nStatus, IDS_CHECK_SCC)) - return nStatus; - } - - if (!bCancel) - pProg->SetProgress(MAX_STEPS); - - return 0; -} - diff --git a/src/WINNT/afssvrcfg/get_cur_config.h b/src/WINNT/afssvrcfg/get_cur_config.h deleted file mode 100644 index 963db8613..000000000 --- a/src/WINNT/afssvrcfg/get_cur_config.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _GET_CUR_CONFIG_H_ -#define _GET_CUR_CONFIG_H_ - -afs_status_t DoRootVolumesExist(BOOL& bExists); -afs_status_t AreRootVolumesReplicated(BOOL& bReplicated); - -int GetCurrentConfig(HWND hParent, BOOL& bCanceled); - -#endif // _GET_CUR_CONFIG_H_ - diff --git a/src/WINNT/afssvrcfg/get_pw_dlg.cpp b/src/WINNT/afssvrcfg/get_pw_dlg.cpp deleted file mode 100644 index 968013d58..000000000 --- a/src/WINNT/afssvrcfg/get_pw_dlg.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" // Main header for this application -#include "resource.h" -#include "get_pw_dlg.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; // HWND for this page's dialog - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void CheckEnableButtons(); -static void SaveDlgInfo(); -static void ShowPageInfo(); - -BOOL CALLBACK GetPwDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL GetAfsPrincipalPassword(HWND hParent, TCHAR *&pszServerPW) -{ - int nResult = ModalDialog(IDD_GET_PW, hParent, (DLGPROC)GetPwDlgProc); - if (nResult == IDOK) { - pszServerPW = g_CfgData.szServerPW; - return TRUE; - } - - pszServerPW = 0; - - return FALSE; -} - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK GetPwDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp(IDD_GET_PW, hwndDlg, msg, wp, lp)) - return TRUE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDC_PW: - if (HIWORD(wp) == EN_CHANGE) - CheckEnableButtons(); - break; - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - break; - - - case IDOK: - SaveDlgInfo(); - EndDialog(hDlg, IDOK); - break; - } - break; - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CheckEnableButtons() -{ - BOOL bDisable = FALSE; - - TCHAR szDummy[cchRESOURCE]; - - bDisable |= lstrlen(GetWndText(hDlg, IDC_PW, szDummy)) == 0; - - SetEnable(hDlg, IDOK, (ENABLE_STATE)!bDisable); -} - -static void SaveDlgInfo() -{ - TCHAR szText[cchRESOURCE]; - - lstrncpy(g_CfgData.szServerPW, GetWndText(hDlg, IDC_PW, szText), MAX_SERVER_PW_LEN); -} - -static void ShowPageInfo() -{ - SetWndText(hDlg, IDC_PW, g_CfgData.szServerPW); -} - diff --git a/src/WINNT/afssvrcfg/get_pw_dlg.h b/src/WINNT/afssvrcfg/get_pw_dlg.h deleted file mode 100644 index 7e6cc0205..000000000 --- a/src/WINNT/afssvrcfg/get_pw_dlg.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _GET_PW_DLG_H_ -#define _GET_PW_DLG_H_ - -BOOL GetAfsPrincipalPassword(HWND hParent, TCHAR *&pszServerPW); - -#endif // _GET_PW_DLG_H_ - diff --git a/src/WINNT/afssvrcfg/graphics.cpp b/src/WINNT/afssvrcfg/graphics.cpp deleted file mode 100644 index 98287352a..000000000 --- a/src/WINNT/afssvrcfg/graphics.cpp +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "config.h" -#include "graphics.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static const COLORREF STEP_IN_PROGRESS_COLOR = 0x00FF00; // Green -static const COLORREF STEP_TO_BE_DONE_COLOR = 0xFF0000; // Blue - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ -static void EraseRect(HDC hdc, RECT rect) -{ - HBRUSH hbr = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); - HGDIOBJ hbrOld = SelectObject(hdc, hbr); - - HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE)); - HGDIOBJ hOldPen = SelectObject(hdc, hPen); - - Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); - - SelectObject(hdc, hOldPen); - SelectObject(hdc, hbrOld); - - DeleteObject(hPen); - DeleteObject(hbr); -} - -static void DrawCircle(HDC hdc, RECT rect, COLORREF crCircleColor) -{ - HBRUSH hBrush = CreateSolidBrush(crCircleColor); - HGDIOBJ hOldBrush = SelectObject(hdc, hBrush); - - HPEN hPen = CreatePen(PS_SOLID, 1, crCircleColor); - HGDIOBJ hOldPen = SelectObject(hdc, hPen); - - OffsetRect(&rect, 1, -1); - - int midX = rect.left + ((rect.right - rect.left) / 2); - int midY = rect.top + ((rect.bottom - rect.top) / 2); - - MoveToEx(hdc, midX - 1, midY - 2, 0); - LineTo(hdc, midX + 2, midY - 2); - - MoveToEx(hdc, midX - 2, midY - 1, 0); - LineTo(hdc, midX + 3, midY - 1); - - MoveToEx(hdc, midX - 2, midY, 0); - LineTo(hdc, midX + 3, midY); - - MoveToEx(hdc, midX - 2, midY + 1, 0); - LineTo(hdc, midX + 3, midY + 1); - - MoveToEx(hdc, midX - 1, midY + 2, 0); - LineTo(hdc, midX + 2, midY + 2); - - SelectObject(hdc, hOldPen); - SelectObject(hdc, hOldBrush); - - DeleteObject(hPen); - DeleteObject(hBrush); -} - -static void DrawCheckmark(HDC hdc, RECT rect) -{ -#define cxCHECKBOX (2+9+2) -#define cyCHECKBOX (2+9+2) - - // Checkmark - HPEN hpNew = CreatePen(PS_SOLID, 1, RGB(0,0,0)); - HGDIOBJ hpOld = (HPEN)SelectObject(hdc, hpNew); - - POINT ptCheckbox; - ptCheckbox.x = rect.left; - ptCheckbox.y = rect.top + ((rect.bottom - rect.top) - cyCHECKBOX) / 2; - - MoveToEx(hdc, ptCheckbox.x +3, ptCheckbox.y+5, NULL); - LineTo(hdc, ptCheckbox.x +5, ptCheckbox.y+7); - LineTo(hdc, ptCheckbox.x+10, ptCheckbox.y+2); - - MoveToEx(hdc, ptCheckbox.x +3, ptCheckbox.y+6, NULL); - LineTo(hdc, ptCheckbox.x +5, ptCheckbox.y+8); - LineTo(hdc, ptCheckbox.x+10, ptCheckbox.y+3); - - MoveToEx(hdc, ptCheckbox.x +3, ptCheckbox.y+7, NULL); - LineTo(hdc, ptCheckbox.x +5, ptCheckbox.y+9); - LineTo(hdc, ptCheckbox.x+10, ptCheckbox.y+4); - - SelectObject(hdc, hpOld); - DeleteObject(hpNew); -} - -static void DrawX(HDC hdc, RECT rect) -{ - // Red X - static COLORREF crXColor = 0X0000FF; - - HBRUSH hbrRed = CreateSolidBrush(crXColor); - HGDIOBJ hbrOld = SelectObject(hdc, hbrRed); - - HPEN hPen = CreatePen(PS_SOLID, 1, crXColor); - HGDIOBJ hOldPen = SelectObject(hdc, hPen); - - OffsetRect(&rect, 3, 0); - - rect.top++; - rect.bottom++; - - int nLen = 7; - - MoveToEx(hdc, rect.left, rect.top, 0); - LineTo(hdc, rect.left + nLen, rect.top + nLen); - - MoveToEx(hdc, rect.left, rect.top + 1, 0); - LineTo(hdc, rect.left + nLen, rect.top + nLen + 1); - - MoveToEx(hdc, rect.left, rect.top - 1, 0); - LineTo(hdc, rect.left + nLen, rect.top + nLen - 1); - - - MoveToEx(hdc, rect.left + nLen - 1, rect.top, 0); - LineTo(hdc, rect.left - 1, rect.top + nLen); - - MoveToEx(hdc, rect.left + nLen - 1, rect.top + 1, 0); - LineTo(hdc, rect.left - 1, rect.top + nLen + 1); - - MoveToEx(hdc, rect.left + nLen - 1, rect.top - 1, 0); - LineTo(hdc, rect.left - 1, rect.top + nLen - 1); - - SelectObject(hdc, hOldPen); - SelectObject(hdc, hbrOld); - - DeleteObject(hPen); - DeleteObject(hbrRed); -} - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -void PaintStepGraphic(HWND hwnd, STEP_STATE state) -{ - PAINTSTRUCT ps; - - HDC hdc = BeginPaint(hwnd, &ps); - _ASSERTE(hdc); - - RECT rect; - GetClientRect(hwnd, &rect); - - InflateRect(&rect, -2, -2); - - // First erase the background - EraseRect(hdc, rect); - - // Draw an image that corresponds to the state - switch (state) { - case SS_STEP_IN_PROGRESS: DrawCircle(hdc, rect, STEP_IN_PROGRESS_COLOR); - break; - - case SS_STEP_TO_BE_DONE: DrawCircle(hdc, rect, STEP_TO_BE_DONE_COLOR); - break; - - case SS_STEP_FINISHED: DrawCheckmark(hdc, rect); - break; - - case SS_STEP_FAILED: DrawX(hdc, rect); - break; - } - - EndPaint(hwnd, &ps); -} - - -#define clrWHITE RGB(255,255,255) -#define clrHIGHLIGHT RGB(192,192,192) -#define clrSHADOW RGB(128,128,128) -#define clrBLACK RGB(100,100,100) -#define clrBAR_INT_LEFT RGB(0,255,0) -#define clrBAR_INT_RIGHT RGB(128,0,0) -#define clrARROW_INTERIOR RGB(128,128,0) -#define clrTEXT_CURRENT RGB(255,255,255) -#define clrTEXT_STEP RGB(0,255,0) - -#define cxLEFT_MARGIN 10 -#define cxRIGHT_MARGIN 10 -#define cyBOTTOM_MARGIN 5 -#define cyAREA 100 -#define cyBELOW_CURRENT 15 -#define cyBELOW_ARROW 10 - -void CALLBACK PaintPageGraphic(LPWIZARD pWiz, HDC hdc, LPRECT prTarget, HPALETTE hpal) -{ - static HFONT hFont = AfsAppLib_CreateFont(IDS_GRAPHIC_FONT); - static HPEN hPenWhite = CreatePen(PS_SOLID, 1, clrWHITE); - static HPEN hPenHighlight = CreatePen(PS_SOLID, 1, clrHIGHLIGHT); - static HPEN hPenShadow = CreatePen(PS_SOLID, 1, clrSHADOW); - static HPEN hPenBlack = CreatePen(PS_SOLID, 1, clrBLACK); - static HPEN hPenBarIntLeft = CreatePen(PS_SOLID, 1, clrBAR_INT_LEFT); - static HPEN hPenBarIntRight = CreatePen(PS_SOLID, 1, clrBAR_INT_RIGHT); - static HPEN hPenArrowInterior = CreatePen(PS_SOLID, 1, clrARROW_INTERIOR); - - // First find out where we'll be drawing things. - RECT rArea; - rArea.top = prTarget->bottom - cyAREA - cyBOTTOM_MARGIN; - rArea.bottom = prTarget->bottom - cyBOTTOM_MARGIN; - rArea.left = prTarget->left + cxLEFT_MARGIN; - rArea.right = prTarget->right - cxRIGHT_MARGIN; - - // Draw the "Current Step:" text - HGDIOBJ hFontOld = SelectObject(hdc, hFont); - COLORREF clrTextOld = SetTextColor (hdc, clrTEXT_CURRENT); - SetBkMode (hdc, TRANSPARENT); - - TCHAR szText[cchRESOURCE]; - GetResString(IDS_CURRENT_STEP, szText); - - RECT rText = rArea; - DWORD dwFlags = DT_CENTER | DT_TOP | DT_SINGLELINE; - DrawTextEx (hdc, szText, lstrlen(szText), &rText, dwFlags | DT_CALCRECT, NULL); - - rText.right = rArea.right; - DrawTextEx (hdc, szText, lstrlen(szText), &rText, dwFlags, NULL); - - // Draw the progress bar; it should look like this: - // wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww // (w=white, b=black... - // whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb // h=highlight, s=shadow... - // whllllllllllllllllrrrrrrrrrrrrrrrsb // l=left/int, r=right/int) - // whllllllllllllllllrrrrrrrrrrrrrrrsb // l=left/int, r=right/int) - // whssssssssssssssssssssssssssssssssb // h=highlight, s=shadow... - // wbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb // h=highlight, s=shadow... - - // Oh--we'll need to know where the pointer's point should go. We'll - // make that be where the leftmost dot of the pointer's tip, and the - // rightmost dot that's colored "l". One state 0, we want the pointer - // to be all the way to the left--and on state {g_nNumStates-1}, we want - // it all the way to the right - - RECT rBar = rArea; - rBar.top = rText.bottom + cyBELOW_CURRENT; - rBar.bottom = rBar.top + 6; - - RECT rBarInterior = rBar; - InflateRect (&rBarInterior, -2, -2); - - int nStepSize = (rBarInterior.right - rBarInterior.left) / (g_nNumStates-1); - int xCurPos = rBarInterior.left + (g_pWiz->GetState() * nStepSize); - if (!g_pWiz->GetState()) - xCurPos = rBarInterior.left-1; // don't draw *any* green - else if (g_pWiz->GetState() == (int)(g_nNumStates-1)) - xCurPos = rBarInterior.right-1; // don't draw *any* red - - // Draw that bar! - HGDIOBJ hPenOld = SelectObject (hdc, hPenWhite); - MoveToEx (hdc, rBar.left, rBar.bottom-1, 0); - LineTo (hdc, rBar.left, rBar.top); - LineTo (hdc, rBar.right, rBar.top); - MoveToEx (hdc, rBar.left, rBar.bottom, 0); - - SelectObject (hdc, hPenHighlight); - MoveToEx (hdc, rBar.left+1, rBar.bottom-2, 0); - LineTo (hdc, rBar.left+1, rBar.top+1); - LineTo (hdc, rBar.right-1, rBar.top+1); - - SelectObject (hdc, hPenShadow); - MoveToEx (hdc, rBar.left+2, rBar.bottom-2, 0); - LineTo (hdc, rBar.right-2, rBar.bottom-2); - LineTo (hdc, rBar.right-2, rBar.top+1); - - SelectObject (hdc, hPenBlack); - MoveToEx (hdc, rBar.left+1, rBar.bottom-1, 0); - LineTo (hdc, rBar.right-1, rBar.bottom-1); - LineTo (hdc, rBar.right-1, rBar.top); - - if (xCurPos >= rBarInterior.left) { - SelectObject (hdc, hPenBarIntLeft); - MoveToEx (hdc, rBarInterior.left, rBarInterior.top, 0); - LineTo (hdc, xCurPos+1, rBarInterior.top); - MoveToEx (hdc, rBarInterior.left, rBarInterior.top+1, 0); - LineTo (hdc, xCurPos+1, rBarInterior.top+1); - } - - if (xCurPos < rBarInterior.right-1) { - SelectObject (hdc, hPenBarIntRight); - MoveToEx (hdc, xCurPos+1, rBarInterior.top, 0); - LineTo (hdc, rBarInterior.right, rBarInterior.top); - MoveToEx (hdc, xCurPos+1, rBarInterior.top+1, 0); - LineTo (hdc, rBarInterior.right, rBarInterior.top+1); - } - SelectObject (hdc, hPenOld); - - // Draw the arrow underneath it; it should look like this: - // wb - // whsb - // whassb - // whaaassb - // whaaaaassb - // wssssssssssb - // Remember that the topmost "w" is where xCurPos is. - - RECT rArrow; - rArrow.top = rBar.bottom +1; - rArrow.bottom = rArrow.top +6; - rArrow.left = xCurPos -5; - rArrow.right = xCurPos +7; - - hPenOld = SelectObject (hdc, hPenWhite); - MoveToEx (hdc, rArrow.left, rArrow.bottom-1, 0); - LineTo (hdc, xCurPos+1, rArrow.top-1); - - SelectObject (hdc, hPenHighlight); - MoveToEx (hdc, rArrow.left+2, rArrow.bottom-2, 0); - LineTo (hdc, xCurPos+1, rArrow.top); - - SelectObject (hdc, hPenShadow); - MoveToEx (hdc, rArrow.left+1, rArrow.bottom-1, 0); - LineTo (hdc, rArrow.right-1, rArrow.bottom-1); - MoveToEx (hdc, xCurPos+1, rArrow.top+1, 0); - LineTo (hdc, rArrow.right, rArrow.bottom); - MoveToEx (hdc, xCurPos+1, rArrow.top+2, 0); - LineTo (hdc, rArrow.right-1, rArrow.bottom); - - SelectObject (hdc, hPenBlack); - MoveToEx (hdc, xCurPos+1, rArrow.top, 0); - LineTo (hdc, rArrow.right, rArrow.bottom); - - // wb - // whsb - // whassb - // whaaassb - // whaaaaassb - // wssssssssssb - - SelectObject (hdc, hPenArrowInterior); - MoveToEx (hdc, xCurPos, rArrow.top+2, 0); - LineTo (hdc, xCurPos+1, rArrow.top+2); - MoveToEx (hdc, xCurPos-1, rArrow.top+3, 0); - LineTo (hdc, xCurPos+2, rArrow.top+3); - MoveToEx (hdc, xCurPos-2, rArrow.top+4, 0); - LineTo (hdc, xCurPos+3, rArrow.top+4); - - SelectObject (hdc, hPenOld); - - // Draw the description text - SetTextColor (hdc, clrTEXT_STEP); - GetResString(g_StateDesc[g_pWiz->GetState()], szText); - - rText = rArea; - rText.top = rArrow.bottom + cyBELOW_ARROW; - dwFlags = DT_CENTER | DT_TOP | DT_WORDBREAK; - DrawTextEx (hdc, szText, lstrlen(szText), &rText, dwFlags, NULL); - - SetTextColor (hdc, clrTextOld); - SelectObject (hdc, hFontOld); -} - diff --git a/src/WINNT/afssvrcfg/graphics.h b/src/WINNT/afssvrcfg/graphics.h deleted file mode 100644 index 2392768cd..000000000 --- a/src/WINNT/afssvrcfg/graphics.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _GRAPHICS_H_ -#define _GRAPHICS_H_ - -#include "config.h" - -void PaintStepGraphic(HWND hwnd, STEP_STATE state); - -void CALLBACK PaintPageGraphic(LPWIZARD pWiz, HDC hdcTarget, LPRECT prTarget, HPALETTE hpal); - -#endif // _GRAPHICS_H_ - diff --git a/src/WINNT/afssvrcfg/help.cpp b/src/WINNT/afssvrcfg/help.cpp deleted file mode 100644 index 73fb729b6..000000000 --- a/src/WINNT/afssvrcfg/help.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "resource.h" -#include - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ - -/* - * Wizard Help _________________________________________________________________ - * - */ - -// Intro page -static UINT IDH_INTRO_PAGE = 101; - -// Config server page -static UINT IDH_CONFIG_SERVER_PAGE = 102; - -// Backup server page -static UINT IDH_BACKUP_SERVER_PAGE = 0; -static UINT IDH_CONFIG_BACKUP_SERVER = 1; -static UINT IDH_DONT_CONFIG_BACKUP_SERVER = 2; - -// File server page -static UINT IDH_FILE_SERVER_PAGE = 3; -static UINT IDH_SHOULD_CONFIG_FILE_SERVER = 4; -static UINT IDH_DONT_CONFIG_FILE_SERVER = 5; - -// Cell and Server info page -static UINT IDH_INFO_PAGE = 6; -static UINT IDH_JOIN_EXISTING_CELL = 7; -static UINT IDH_FIRST_SERVER = 8; -static UINT IDH_CELL_NAME = 9; -static UINT IDH_PRINCIPAL = 10; -static UINT IDH_SERVER_PW = 11; -static UINT IDH_VERIFY_PW = 12; - -// Administrative info page (when configuring first server) -static UINT IDH_FIRST_SERVER_PAGE = 13; -static UINT IDH_ADMIN_NAME = 14; -static UINT IDH_ADMIN_PW = 15; -static UINT IDH_VERIFY_ADMIN_PW = 16; -static UINT IDH_USE_NEXT_UID = 17; -static UINT IDH_USE_THIS_UID = 18; -static UINT IDH_AFS_UID = 19; -static UINT IDH_AFS_UID_SPINNER = 20; - -// Administrative info page (when configuring into an existing cell) -static UINT IDH_EXISTING_CELL_PAGE = 21; -static UINT IDH_ADMIN_NAME2 = 22; -static UINT IDH_ADMIN_PW2 = 23; -static UINT IDH_HOSTNAME = 24; - -// Database server page -static UINT IDH_DB_SERVER_PAGE = 100; -static UINT IDH_CONFIG_DB_SERVER = 25; -static UINT IDH_DONT_CONFIG_DB_SERVER = 26; -static UINT IDH_SYS_CONTROL_MACHINE = 27; - -// Partition page -static UINT IDH_PARTITION_PAGE = 28; -static UINT IDH_CREATE_PARTITION = 29; -static UINT IDH_DRIVE_LIST = 30; -static UINT IDH_PARTITION_NAME = 31; -static UINT IDH_DONT_CREATE_PARTITION = 32; - -// Root volumes page -static UINT IDH_ROOT_VOLUMES_PAGE = 33; -static UINT IDH_CREATE_VOLUME = 34; -static UINT IDH_DONT_CREATE_ROOT_VOLUMES = 35; - -// Replication page -static UINT IDH_REPLICATION_PAGE = 36; -static UINT IDH_REPLICATE = 37; -static UINT IDH_DONT_REPLICATE = 38; - -// System control page -static UINT IDH_SYS_CONTROL_PAGE = 39; -static UINT IDH_SYS_CONTROL_SERVER = 40; -static UINT IDH_SYS_CONTROL_CLIENT = 41; -static UINT IDH_SYS_CONTROL_MACHINE2 = 42; -static UINT IDH_DONT_CONFIGURE = 43; - - - -/* - * - * Arrays that map help topics to the appropriate controls___________________ - * - */ - -static DWORD IDH_INTRO_CTX_HELP[] = { - 0, 0 -}; - -static DWORD IDH_CONFIG_SERVER_CTX_HELP[] = { - 0, 0 -}; - -static DWORD IDH_BACKUP_SERVER_CTX_HELP[] = { - IDC_CONFIG_BACKUP_SERVER, IDH_CONFIG_BACKUP_SERVER, - IDC_DONT_CONFIG_BACKUP_SERVER, IDH_DONT_CONFIG_BACKUP_SERVER, - 0, 0 -}; - -static DWORD IDH_FILE_SERVER_CTX_HELP[] = { - IDC_SHOULD_CONFIG_FILE_SERVER, IDH_SHOULD_CONFIG_FILE_SERVER, - IDC_DONT_CONFIG_FILE_SERVER, IDH_DONT_CONFIG_FILE_SERVER, - 0, 0 -}; - -static DWORD IDH_CELL_AND_SERVER_INFO_CTX_HELP[] = { - IDC_JOIN_EXISTING_CELL, IDH_JOIN_EXISTING_CELL, - IDC_FIRST_SERVER, IDH_FIRST_SERVER, - IDC_CELL_NAME, IDH_CELL_NAME, - IDC_PRINCIPAL, IDH_PRINCIPAL, - IDC_SERVER_PW, IDH_SERVER_PW, - IDC_VERIFY_PW, IDH_VERIFY_PW, - 0, 0 -}; - -static DWORD IDH_FIRST_SERVER_CTX_HELP[] = { - IDC_ADMIN_NAME, IDH_ADMIN_NAME, - IDC_ADMIN_PW, IDH_ADMIN_PW, - IDC_VERIFY_ADMIN_PW, IDH_VERIFY_ADMIN_PW, - IDC_USE_NEXT_UID, IDH_USE_NEXT_UID, - IDC_USE_THIS_UID, IDH_USE_THIS_UID, - IDC_AFS_UID, IDH_AFS_UID, - IDC_AFS_UID_SPINNER, IDH_AFS_UID_SPINNER, - 0, 0 -}; - -static DWORD IDH_EXISTING_CELL_CTX_HELP[] = { - IDC_ADMIN_NAME, IDH_ADMIN_NAME2, - IDC_ADMIN_PW, IDH_ADMIN_PW2, - IDC_HOSTNAME, IDH_HOSTNAME, - 0, 0 -}; - -static DWORD IDH_DB_SERVER_CTX_HELP[] = { - IDC_CONFIG_DB_SERVER, IDH_CONFIG_DB_SERVER, - IDC_DONT_CONFIG_DB_SERVER, IDH_DONT_CONFIG_DB_SERVER, - IDC_SYS_CONTROL_MACHINE, IDH_SYS_CONTROL_MACHINE, - 0, 0 -}; - -static DWORD IDH_PARTITION_CTX_HELP[] = { - IDC_CREATE_PARTITION, IDH_CREATE_PARTITION, - IDC_DRIVE_LIST, IDH_DRIVE_LIST, - IDC_PARTITION_NAME, IDH_PARTITION_NAME, - IDC_DONT_CREATE_PARTITION, IDH_DONT_CREATE_PARTITION, - 0, 0 -}; - -static DWORD IDH_ROOT_VOLUMES_CTX_HELP[] = { - IDC_CREATE_ROOT_VOLUMES, IDH_CREATE_VOLUME, - IDC_DONT_CREATE_ROOT_VOLUMES, IDH_DONT_CREATE_ROOT_VOLUMES, - 0, 0 -}; - -static DWORD IDH_REPLICATION_CTX_HELP[] = { - IDC_REPLICATE, IDH_REPLICATE, - IDC_DONT_REPLICATE, IDH_DONT_REPLICATE, - 0, 0 -}; - -static DWORD IDH_SYS_CONTROL_CTX_HELP[] = { - IDC_SYS_CONTROL_SERVER, IDH_SYS_CONTROL_SERVER, - IDC_SYS_CONTROL_CLIENT, IDH_SYS_CONTROL_CLIENT, - IDC_SYS_CONTROL_MACHINE, IDH_SYS_CONTROL_MACHINE2, - IDC_DONT_CONFIGURE, IDH_DONT_CONFIGURE, - 0, 0 -}; - - -/* - * - * Config tool help__________________________________________________________ - * - */ - -// Create partition dialog -static UINT IDH_CREATE_PARTITION_DLG = 44; -static UINT IDH_CT_DRIVE_LIST = 45; -static UINT IDH_CT_PARTITION_NAME = 46; -static UINT IDH_CREATE = 47; -static UINT IDH_CLOSE = 48; - -// Partitions property page -static UINT IDH_PARTITIONS_PAGE = 49; -static UINT IDH_PARTITIONS_LIST = 50; -static UINT IDH_CREATE_PARTITIONS = 51; -static UINT IDH_SALVAGE = 52; -static UINT IDH_REFORMAT = 53; -static UINT IDH_REMOVE = 54; - -// Services page -static UINT IDH_SERVICES_PAGE = 55; -static UINT IDH_FS_SERVICE = 56; -static UINT IDH_DB_SERVICE = 57; -static UINT IDH_DB_DETAILS = 58; -static UINT IDH_BK_SERVICE = 59; -static UINT IDH_SCS = 60; -static UINT IDH_SCC = 61; -static UINT IDH_SC_MACHINE = 62; - -// Admin info (and other server) page -static UINT IDH_ADMIN_INFO_DLG = 63; -static UINT IDH_CT_ADMIN_NAME = 64; -static UINT IDH_CT_ADMIN_PW = 65; -static UINT IDH_CT_HOSTNAME = 66; -static UINT IDH_CONFIG = 67; - -// Salvage dialog -static UINT IDH_SALVAGE_DLG = 68; -static UINT IDH_SERVER = 69; -static UINT IDH_PARTITION = 70; -static UINT IDH_VOLUME = 71; -static UINT IDH_VOLUME_NAME = 72; -static UINT IDH_ADVANCED = 73; -static UINT IDH_LOG_FILE = 74; -static UINT IDH_NUM_PROCESSES = 75; -static UINT IDH_TEMP_DIR = 76; -static UINT IDH_NUM_PROCESSES_CHECKBOX = 77; - -// Salvage results dialog -static UINT IDH_SALVAGE_RESULTS_DLG = 80; -static UINT IDH_LOG = 81; -static UINT IDH_CLOSE_LOG = 82; - - -/* - * - * Arrays that map help topics to the appropriate controls___________________ - * -*/ - -static DWORD IDH_CREATE_PARTITION_CTX_HELP[] = { - IDC_DRIVE_LIST, IDH_DRIVE_LIST, - IDC_PARTITION_NAME, IDH_CT_PARTITION_NAME, - IDC_CREATE, IDH_CREATE, - IDC_CLOSE, IDH_CLOSE, - 0, 0 -}; - -static DWORD IDH_PARTITIONS_CTX_HELP[] = { - IDC_PARTITION_LIST, IDH_PARTITIONS_LIST, - IDC_CREATE_PARTITIONS, IDH_CREATE_PARTITIONS, - IDC_SALVAGE, IDH_SALVAGE, - IDC_REFORMAT, IDH_REFORMAT, - IDC_REMOVE, IDH_REMOVE, - 0, 0 -}; - -static DWORD IDH_SERVICES_CTX_HELP[] = { - IDC_FS_SERVICE, IDH_FS_SERVICE, - IDC_DB_SERVICE, IDH_DB_SERVICE, - IDC_DB_DETAILS, IDH_DB_DETAILS, - IDC_BK_SERVICE, IDH_BK_SERVICE, - IDC_SCS, IDH_SCS, - IDC_SCC, IDH_SCC, - IDC_SC_MACHINE, IDH_SC_MACHINE, - 0, 0 -}; - -static DWORD IDH_ADMIN_INFO_CTX_HELP[] = { - IDC_ADMIN_NAME, IDH_CT_ADMIN_NAME, - IDC_ADMIN_PW, IDH_CT_ADMIN_PW, - IDC_HOSTNAME, IDH_CT_HOSTNAME, - IDOK, IDH_CONFIG, - 0, 0 -}; - -static DWORD IDH_SALVAGE_CTX_HELP[] = { - IDC_SERVER, IDH_SERVER, - IDC_PARTITION, IDH_PARTITION, - IDC_VOLUME, IDH_VOLUME, - IDC_VOLUME_NAME, IDH_VOLUME_NAME, - IDC_ADVANCED, IDH_ADVANCED, - IDC_LOG_FILE, IDH_LOG_FILE, - IDC_NUM_PROCESSES, IDH_NUM_PROCESSES, - IDC_TEMP_DIR, IDH_TEMP_DIR, - IDC_NUM_PROCESSES_CHECKBOX, IDH_NUM_PROCESSES_CHECKBOX, - 0, 0 -}; - -static DWORD IDH_SALVAGE_RESULTS_CTX_HELP[] = { - IDC_LOG, IDH_LOG, - IDC_CLOSE, IDH_CLOSE_LOG, - 0, 0 -}; - - -/* - * - * Help for both__________________________________________________________ - * - */ - -// Get 3.4 server afs principal password dialog -static UINT IDH_GET_PW_DLG = 78; -static UINT IDH_PW = 79; - - -/* - * - * Arrays that map help topics to the appropriate controls___________________ - * -*/ - -static DWORD IDH_GET_PW_CTX_HELP[] = { - IDC_PW, IDH_PW, - 0, 0 -}; - - - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -void RegisterConfigToolHelp() -{ - AfsAppLib_RegisterHelp(IDD_CREATE_PARTITION, IDH_CREATE_PARTITION_CTX_HELP, IDH_CREATE_PARTITION_DLG); - AfsAppLib_RegisterHelp(IDD_PARTITIONS_PAGE, IDH_PARTITIONS_CTX_HELP, IDH_PARTITIONS_PAGE); - AfsAppLib_RegisterHelp(IDD_SERVICES_PAGE, IDH_SERVICES_CTX_HELP, IDH_SERVICES_PAGE); - AfsAppLib_RegisterHelp(IDD_ADMIN_INFO, IDH_ADMIN_INFO_CTX_HELP, IDH_ADMIN_INFO_DLG); - AfsAppLib_RegisterHelp(IDD_GET_PW, IDH_GET_PW_CTX_HELP, IDH_GET_PW_DLG); - AfsAppLib_RegisterHelp(IDD_SALVAGE, IDH_SALVAGE_CTX_HELP, IDH_SALVAGE_DLG); - AfsAppLib_RegisterHelp(IDD_SALVAGE_RESULTS, IDH_SALVAGE_RESULTS_CTX_HELP, IDH_SALVAGE_RESULTS_DLG); -} - -void RegisterWizardHelp() -{ - AfsAppLib_RegisterHelp(IDD_INTRO_PAGE, IDH_INTRO_CTX_HELP, IDH_INTRO_PAGE); - AfsAppLib_RegisterHelp(IDD_INFO_PAGE, IDH_CELL_AND_SERVER_INFO_CTX_HELP, IDH_INFO_PAGE); - AfsAppLib_RegisterHelp(IDD_INFO_PAGE2_FIRST_SERVER, IDH_FIRST_SERVER_CTX_HELP, IDH_FIRST_SERVER_PAGE); - AfsAppLib_RegisterHelp(IDD_INFO_PAGE2_NOT_FIRST_SERVER, IDH_EXISTING_CELL_CTX_HELP, IDH_EXISTING_CELL_PAGE); - AfsAppLib_RegisterHelp(IDD_FILE_SERVER_PAGE, IDH_FILE_SERVER_CTX_HELP, IDH_FILE_SERVER_PAGE); - AfsAppLib_RegisterHelp(IDD_DB_SERVER_PAGE, IDH_DB_SERVER_CTX_HELP, IDH_DB_SERVER_PAGE); - AfsAppLib_RegisterHelp(IDD_BACKUP_SERVER_PAGE, IDH_BACKUP_SERVER_CTX_HELP, IDH_BACKUP_SERVER_PAGE); - AfsAppLib_RegisterHelp(IDD_PARTITION_PAGE, IDH_PARTITION_CTX_HELP, IDH_PARTITION_PAGE); - AfsAppLib_RegisterHelp(IDD_ROOT_VOLUMES_PAGE, IDH_ROOT_VOLUMES_CTX_HELP, IDH_ROOT_VOLUMES_PAGE); - AfsAppLib_RegisterHelp(IDD_REPLICATION_PAGE, IDH_REPLICATION_CTX_HELP, IDH_REPLICATION_PAGE); - AfsAppLib_RegisterHelp(IDD_SYS_CONTROL_PAGE, IDH_SYS_CONTROL_CTX_HELP, IDH_SYS_CONTROL_PAGE); - AfsAppLib_RegisterHelp(IDD_GET_PW, IDH_GET_PW_CTX_HELP, IDH_GET_PW_DLG); - AfsAppLib_RegisterHelp(IDD_CONFIG_SERVER_PAGE, IDH_CONFIG_SERVER_CTX_HELP, IDH_CONFIG_SERVER_PAGE); -} - diff --git a/src/WINNT/afssvrcfg/hourglass.h b/src/WINNT/afssvrcfg/hourglass.h deleted file mode 100755 index 4b58c6a7b..000000000 --- a/src/WINNT/afssvrcfg/hourglass.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -typedef class HOURGLASS -{ - protected: - HCURSOR m_OldCursor; - - public: - HOURGLASS (LPCSTR idCursor = IDC_WAIT) - { - m_OldCursor = GetCursor(); - SetCursor (LoadCursor (NULL, idCursor)); - } - - virtual ~HOURGLASS (void) - { - SetCursor (m_OldCursor); - } - -} HOURGLASS, *PHOURGLASS; diff --git a/src/WINNT/afssvrcfg/info2_page.cpp b/src/WINNT/afssvrcfg/info2_page.cpp deleted file mode 100644 index 233290fc1..000000000 --- a/src/WINNT/afssvrcfg/info2_page.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; // HWND for this page's dialog - -#define FIRST_SERVER_STEP sidSTEP_THREE -#define NOT_FIRST_SERVER_STEP sidSTEP_FOUR - -#define MIN_AFS_UID 1 -#define MAX_AFS_UID UD_MAXVAL - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void CheckEnableButtons(); -static void SavePageInfo(); -static void ShowPageInfo(); -static void UseNextUid(BOOL bUseNext); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Procs _________________________________________________________________ - * - */ -BOOL CALLBACK InfoPage2DlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hRHS, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hRHS); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDC_WIZARD: - if (HIWORD(wp) == wcIS_STATE_DISABLED) { - int nState = g_pWiz->GetState(); - - // Disable step 3 if we are not the first server - if (nState == sidSTEP_THREE) - return !g_CfgData.bFirstServer; - - // Disable step 4 if we are the first server - if (nState == sidSTEP_FOUR) - return g_CfgData.bFirstServer; - } - break; - - case IDNEXT: - SavePageInfo(); - g_pWiz->SetState (sidSTEP_FIVE); - break; - - case IDBACK: - SavePageInfo(); - g_pWiz->SetState (sidSTEP_TWO); - break; - - case IDC_USE_NEXT_UID: - UseNextUid(TRUE); - CheckEnableButtons(); - break; - - case IDC_USE_THIS_UID: - UseNextUid(FALSE); - CheckEnableButtons(); - break; - - case IDC_ADMIN_NAME: - case IDC_ADMIN_PW: - case IDC_VERIFY_ADMIN_PW: - case IDC_HOSTNAME: - if (HIWORD(wp) == EN_CHANGE) - CheckEnableButtons(); - break; - - } - break; - } - - return FALSE; -} - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON); - - SetUpDownRange(hDlg, IDC_AFS_UID_SPINNER, MIN_AFS_UID, MAX_AFS_UID); - - ShowPageInfo(); - - g_pWiz->SetDefaultControl(IDC_ADMIN_NAME); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CheckEnableButtons() -{ - BOOL bDisable = FALSE; - - TCHAR szDummy[cchRESOURCE]; - TCHAR szPW[cchRESOURCE]; - TCHAR szVerifyPW[cchRESOURCE]; - - bDisable |= lstrlen(GetWndText(hDlg, IDC_ADMIN_NAME, szDummy)) == 0; - - bDisable |= lstrlen(GetWndText(hDlg, IDC_ADMIN_PW, szPW)) == 0; - - if (IsWindowEnabled(GetDlgItem(hDlg, IDC_VERIFY_ADMIN_PW))) { - GetWndText(hDlg, IDC_VERIFY_ADMIN_PW, szVerifyPW); - bDisable |= !lstrlen(szVerifyPW) || lstrcmp(szPW, szVerifyPW); - } - - if (IsWindowEnabled(GetDlgItem(hDlg, IDC_ADMIN_UID))) - bDisable |= lstrlen(GetWndText(hDlg, IDC_ADMIN_UID, szDummy)) == 0; - - if (IsWindowEnabled(GetDlgItem(hDlg, IDC_HOSTNAME))) - bDisable |= lstrlen(GetWndText(hDlg, IDC_HOSTNAME, szDummy)) == 0; - - if (bDisable) - g_pWiz->EnableButtons(BACK_BUTTON); - else - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); -} - -static void SavePageInfo() -{ - TCHAR szText[cchRESOURCE]; - - lstrncpy(g_CfgData.szAdminName, GetWndText(hDlg, IDC_ADMIN_NAME, szText), MAX_ADMIN_NAME_LEN); - lstrncpy(g_CfgData.szAdminPW, GetWndText(hDlg, IDC_ADMIN_PW, szText), MAX_ADMIN_PW_LEN); - - if (g_pWiz->GetState() == FIRST_SERVER_STEP) { - g_CfgData.bUseNextUid = IsButtonChecked(hDlg, IDC_USE_NEXT_UID); - if (!g_CfgData.bUseNextUid) - lstrncpy(g_CfgData.szAdminUID, GetWndText(hDlg, IDC_ADMIN_UID, szText), MAX_UID_LEN); - } - - if (g_pWiz->GetState() == NOT_FIRST_SERVER_STEP) - lstrncpy(g_CfgData.szCellServDbHostname, GetWndText(hDlg, IDC_HOSTNAME, szText), MAX_MACHINE_NAME_LEN); -} - -static void ShowPageInfo() -{ - SetWndText(hDlg, IDC_ADMIN_NAME, g_CfgData.szAdminName); - SetWndText(hDlg, IDC_ADMIN_PW, g_CfgData.szAdminPW); - SetWndText(hDlg, IDC_VERIFY_ADMIN_PW, g_CfgData.szAdminPW); - SetWndText(hDlg, IDC_HOSTNAME, g_CfgData.szCellServDbHostname); - - if (g_pWiz->GetState() == FIRST_SERVER_STEP) { - if (g_CfgData.bUseNextUid) - SetCheck(hDlg, IDC_USE_NEXT_UID); - else - SetCheck(hDlg, IDC_USE_THIS_UID); - UseNextUid(g_CfgData.bUseNextUid); - SetWndText(hDlg, IDC_ADMIN_UID, g_CfgData.szAdminUID); - } -} - -static void UseNextUid(BOOL bUseNext) -{ - ENABLE_STATE es = bUseNext ? ES_DISABLE : ES_ENABLE; - - SetEnable(hDlg, IDC_ADMIN_UID, es); - SetEnable(hDlg, IDC_AFS_UID_SPINNER, es); -} - diff --git a/src/WINNT/afssvrcfg/info_page.cpp b/src/WINNT/afssvrcfg/info_page.cpp deleted file mode 100644 index adfd7a1c9..000000000 --- a/src/WINNT/afssvrcfg/info_page.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; // HWND for this page's dialog - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void CheckEnableButtons(); -static BOOL SavePageInfo(); -static void ShowPageInfo(); -static void IsFirstServer(BOOL bIs = TRUE); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Procs _________________________________________________________________ - * - */ -BOOL CALLBACK InfoPageDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hRHS, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hRHS); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - if (SavePageInfo()) - g_pWiz->SetState (sidSTEP_THREE); - break; - - case IDBACK: - if (SavePageInfo()) - g_pWiz->SetState (sidSTEP_ONE); - break; - - case IDC_FIRST_SERVER: - IsFirstServer(); - break; - - case IDC_JOIN_EXISTING_CELL: - IsFirstServer(FALSE); - break; - - case IDC_CELL_NAME: - case IDC_SERVER_PW: - case IDC_VERIFY_PW: - if (HIWORD(wp) == EN_CHANGE) - CheckEnableButtons(); - break; - - } - break; - } - - return FALSE; -} - -/* - * STATIC FUNCTIONS ________________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON); - - ShowPageInfo(); - - if (g_CfgData.bFirstServer) - IsFirstServer(); - - g_pWiz->SetDefaultControl(IDC_CELL_NAME); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CheckEnableButtons() -{ - BOOL bDisable = FALSE; - - TCHAR szCellName[cchRESOURCE]; - TCHAR szPW[cchRESOURCE]; - TCHAR szVerifyPW[cchRESOURCE]; - - bDisable = lstrlen(GetWndText(hDlg, IDC_CELL_NAME, szCellName)) == 0; - - GetWndText(hDlg, IDC_SERVER_PW, szPW); - GetWndText(hDlg, IDC_VERIFY_PW, szVerifyPW); - - if (IsButtonChecked(hDlg, IDC_FIRST_SERVER)) - bDisable |= !lstrlen(szPW) || !lstrlen(szVerifyPW) || lstrcmp(szPW, szVerifyPW); - - if (bDisable) - g_pWiz->EnableButtons(BACK_BUTTON); - else - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); -} - -static BOOL SavePageInfo() -{ - TCHAR szText[cchRESOURCE]; - - GetWndText(hDlg, IDC_CELL_NAME, szText); - if (lstrlen(szText) > MAX_CELL_NAME_LEN) { - MsgBox(hDlg, IDS_CELL_NAME_LEN_ERROR, GetAppTitleID(), MB_ICONSTOP | MB_OK); - return FALSE; - } - - lstrcpy(g_CfgData.szCellName, szText); - lstrncpy(g_CfgData.szServerPW, GetWndText(hDlg, IDC_SERVER_PW, szText), MAX_SERVER_PW_LEN); - g_CfgData.bFirstServer = IsButtonChecked(hDlg, IDC_FIRST_SERVER); - - return TRUE; -} - -static void ShowPageInfo() -{ - SetWndText(hDlg, IDC_CELL_NAME, g_CfgData.szCellName); - SetWndText(hDlg, IDC_SERVER_PW, g_CfgData.szServerPW); - SetWndText(hDlg, IDC_VERIFY_PW, g_CfgData.szServerPW); - - if (g_CfgData.bFirstServer) - SetCheck(hDlg, IDC_FIRST_SERVER); - else - SetCheck(hDlg, IDC_JOIN_EXISTING_CELL); -} - -static void IsFirstServer(BOOL bIs) -{ - ENABLE_STATE es; - - if (bIs) - es = ES_ENABLE; - else - es = ES_DISABLE; - - SetEnable(hDlg, IDC_PRINCIPAL_LABEL, es); - SetEnable(hDlg, IDC_PRINCIPAL, es); - - SetEnable(hDlg, IDC_SERVER_PW_FRAME, es); - SetEnable(hDlg, IDC_SERVER_PW_LABEL, es); - SetEnable(hDlg, IDC_SERVER_PW_PROMPT, es); - SetEnable(hDlg, IDC_SERVER_PW, es); - SetEnable(hDlg, IDC_VERIFY_PW_LABEL, es); - SetEnable(hDlg, IDC_VERIFY_PW, es); - - CheckEnableButtons(); -} - diff --git a/src/WINNT/afssvrcfg/intro_page.cpp b/src/WINNT/afssvrcfg/intro_page.cpp deleted file mode 100644 index 52f67cd42..000000000 --- a/src/WINNT/afssvrcfg/intro_page.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ - -static HWND hDlg = 0; // HWND for this page's dialog - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static BOOL OnInitDialog(HWND hwndDlg); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Procs _________________________________________________________________ - * - */ -BOOL CALLBACK IntroPageDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hRHS, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hRHS); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - g_pWiz->SetState(sidSTEP_TWO); - break; - } - break; - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static BOOL OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(NEXT_BUTTON); - - return TRUE; -} - diff --git a/src/WINNT/afssvrcfg/lang/.cvsignore b/src/WINNT/afssvrcfg/lang/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/afssvrcfg/lang/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/afssvrcfg/lang/NTMakefile b/src/WINNT/afssvrcfg/lang/NTMakefile deleted file mode 100644 index 333d338fb..000000000 --- a/src/WINNT/afssvrcfg/lang/NTMakefile +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\afssvrcfg\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\afssvrcfg_$(LANGID).dll - -RCFILE = $(LANGNAME)\afscfg.rc - -RESFILE = $(OUT)\afscfg_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist $(OUT)\*.res del $(OUT)\*.res - @if exist AFS_component_version_number.h del AFS_component_version_number.h - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/afssvrcfg/lang/de_DE/afscfg.rc b/src/WINNT/afssvrcfg/lang/de_DE/afscfg.rc deleted file mode 100644 index 67073a23d..000000000 --- a/src/WINNT/afssvrcfg/lang/de_DE/afscfg.rc +++ /dev/null @@ -1,1212 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS® Configuration-Anwendung und -Assistent" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "AFS® Server Quick-Start-Assistent" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Abbrechen",IDCANCEL,101,225,50,14 - PUSHBUTTON "< &Zurück",IDBACK,155,225,50,14 - DEFPUSHBUTTON "&Weiter >",IDNEXT,209,225,50,14 - PUSHBUTTON "&Hilfe",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Ja, eine Partition erstellen.",IDC_CREATE_PARTITION, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,94,105,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,116, - 186,52,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,101,172,20,12,ES_AUTOHSCROLL - CONTROL "&Nein, keine Partition erstellen.", - IDC_DONT_CREATE_PARTITION,"Button",BS_AUTORADIOBUTTON,0, - 191,126,8 - LTEXT "Dieser Datei-Server speichert und liefert Dateien und Programme an AFS-Clients. Für in diesem System gespeicherte Daten, die über AFS gemeinsam benutzt werden, muß mindestens ein NTFS-Volume als AFS-Partition gekennzeichnet sein.", - -1,0,12,209,32 - LTEXT "&Wählen Sie das für die Partition zu verwendende Volume:", - IDC_SELECT_DRIVE,12,106,192,9 - LTEXT "Na&me der AFS-Partition: /vicep",IDC_NAME_LABEL,12,174, - 89,8 - LTEXT "Eine AFS-Partition auf diesem Datei-Server erstellen.", - IDC_TITLE,0,0,209,8 - LTEXT "Eine AFS-Partition entspricht physisch einem NTFS-Volume, enthält aber auch spezielle Metadaten über Struktur und Speicherort der Informationen zur Partition.", - -1,0,48,209,25 - LTEXT "Möchten Sie auf diesem Datei-Server eine Partition erstellen?", - IDC_ASK_CREATE_PARTITION,0,75,209,17 - LTEXT "Zur Laufzeit bei Bedarf erzeugte Nachricht.", - IDC_PARTITION_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Ja, als File Server konfigurieren.", - IDC_SHOULD_CONFIG_FILE_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,114,10 - CONTROL "&Nein, nicht als File Server konfigurieren.", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,190,143,10 - LTEXT "Der AFS File Service liefert angeforderte Dateien und Programme von diesem Server an AFS-Clients. Dieser Service führt weiterhin alle Operationen zur Volume-Verwaltung aus wie Erstellen, Löschen, Bewegen und Nachbilden von Volumes.", - -1,0,38,210,34 - LTEXT "Diese Maschine als File Server konfigurieren.", - IDC_TITLE,0,0,209,8 - LTEXT "Möchten Sie diese Maschine als File Server konfigurieren?", - IDC_CREATE_FS_QUESTION,0,166,210,8 - LTEXT "Um diese Maschine als File Server zu konfigurieren, müssen Sie den File Service konfigurieren.", - -1,0,14,210,17 - LTEXT "Hinweis: Diese Maschine hat zur Zeit kein Plattenlaufwerk, das für das Speichern von Dateien in AFS verfügbar ist. Obwohl Sie diese Maschine als File Server konfigurieren können, werden Sie AFS-Daten auf der Maschine nicht speichern können.", - IDC_NO_DRIVES_NOTE,0,77,210,32,NOT WS_VISIBLE - LTEXT "Um Plattenlaufwerke zu erstellen, verwenden Sie den Windows NT Disk Administrator.", - IDC_DISK_ADMIN_NOTE,0,112,210,16,NOT WS_VISIBLE - LTEXT "Diese Maschine ist bereits als File Server konfiguriert.", - IDC_MSG,0,166,209,34,NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Willkommen beim AFS Server Quick Start-Assistenten. Dieser Assistent wird Sie beim schnellen Konfigurieren des AFS Servers auf diesem Windows NT-System unterstützen.", - IDC_TITLE,0,0,209,52 - LTEXT "Drücken Sie Weiter, um mit der Konfiguration des AFS Servers zu beginnen.", - IDC_STATIC,0,166,209,17 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Ja, die Root-Volumes nachbilden.",IDC_REPLICATE,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,115,10 - CONTROL "&Nein, die Root-Volumes nicht nachbilden.", - IDC_DONT_REPLICATE,"Button",BS_AUTORADIOBUTTON,0,190,158, - 10 - LTEXT "Nachbildung ist der Prozeß des Erstellens von Kopien eines Volumes mit Lesezugriff in mehreren Partitionen, üblicherweise auf anderen Datei-Servern. Durch Nachbildung wird die Verfügbarkeit eines Volumes bei Ausfall eines Netzwerks oder", - IDC_STATIC,0,36,209,25 - LTEXT "Möchten Sie die Root-Volumes nachbilden?", - IDC_REPLICATE_QUESTION,0,148,209,17 - LTEXT "Nachbildung hilft ebenfalls, zu verhindern, daß ein Server mit Anforderungen an häufig angesprochene Volumes überlastet wird.", - IDC_STATIC,0,90,209,24 - LTEXT "Die Root-Volumes der Zelle nachbilden.",IDC_TITLE,0,0, - 209,8 - LTEXT "Wenn Sie andere Volumes in dieser AFS-Zelle nachbilden möchten, müssen Sie zuerst die Root-Volumes nachbilden.", - IDC_STATIC,0,15,209,16 - LTEXT "eines Servers erhöht, weil auf das Volume noch von einem anderen Server zugegriffen werden kann, wenn der Server, der das Volume beherbergt, ausfällt.", - IDC_STATIC,0,60,209,25 - LTEXT "Zur Laufzeit bei Bedarf erzeugte Nachricht.", - IDC_CANT_REPLICATE_MSG,0,166,209,34,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Ja, die Root-Volumes erstellen.", - IDC_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,179,108,10 - CONTROL "&Nein, die Root-Volumes nicht erstellen.", - IDC_DONT_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON, - 0,190,139,10 - LTEXT "In AFS sind Volumes Objektgruppen zusammengehörender Dateien, die als einzelne, leicht zu verwaltende Einheiten strukturiert sind, um die Systemverwaltung zu erleichtern.", - IDC_STATIC,0,15,209,24 - LTEXT "Möchten Sie die Root-Volumes erstellen?", - IDC_ROOT_AFS_QUESTION,0,166,209,8 - LTEXT "Die Root-Volumes der Zelle erstellen.",IDC_TITLE,0,0, - 209,8 - LTEXT "Einmal erstellt, sind die Root-Volumes im AFS-Dateibereich automatisch erreichbar.", - IDC_STATIC,0,78,209,17 - LTEXT "Zur Laufzeit bei Bedarf erzeugte Nachricht.", - IDC_ROOT_AFS_MSG,0,166,209,33,NOT WS_VISIBLE - LTEXT "Das Volume root.afs ist das Root des AFS-Dateibereichs. Das Volume root.cell ist das Root der untergeordneten Baumstruktur des AFS-Dateibereichs der Zelle, worauf über einen Mount-Punkt vom root.afs aus zugegriffen werden kann.", - IDC_STATIC,0,42,209,34 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Konfiguration des AFS® Servers" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,38,148,14 - LTEXT "Zur Laufzeit erzeugter Arbeitsfolgetext.",IDC_OPERATION, - 35,20,145,10 - ICON "",IDC_LOGO,7,7,20,20 - PUSHBUTTON "Abbrechen",IDCANCEL,73,63,50,14 - LTEXT "Ermitteln der aktuellen Konfiguration:",IDC_OPERATION2, - 35,7,156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Ja, als Backup-Server konfigurieren.", - IDC_CONFIG_BACKUP_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,179,128,10 - CONTROL "&Nein, nicht als Backup-Server konfigurieren.", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,0,190,157,10 - LTEXT "Der Backup-Server kann nur auf Maschinen ausgeführt werden, die als Database Server konfiguriert sind. Wird der Backup-Server auf einem Database Server in der Zelle ausgeführt, so muß er auf ALLEN Database Servern in der Zelle ausgeführt werden.", - -1,0,38,199,42 - LTEXT "Möchten Sie diese Maschine als Backup-Server konfigurieren?", - IDC_BACKUP_SERVER_QUESTION,0,166,209,10 - LTEXT "Diese Maschine als Backup-Server konfigurieren.", - IDC_TITLE,0,0,207,8 - LTEXT "Der Backup-Server ist eine Zusatzfunktion des Database Service.", - -1,0,14,209,16 - LTEXT "Diese Maschine ist bereits als Database Server konfiguriert.", - IDC_CANT_BACKUP_MSG,0,166,210,33,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Als den System Control &Server konfigurieren.", - IDC_SYS_CONTROL_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,151,166,10 - CONTROL "Als einen System Control &Client konfigurieren.", - IDC_SYS_CONTROL_CLIENT,"Button",BS_AUTORADIOBUTTON,0,164, - 173,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,90,174,119,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "&Nicht als System Control Client oder Server konfigurieren.", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,0,190,199, - 9 - LTEXT "Der System Control Server stellt anderen AFS-Server-Maschinen, die als System Control Clients konfiguriert sind, allgemeine Konfigurationsdateien zur Verfügung. AFS-Zellen dürfen nur einen einzigen System Control Server ausführen.", - -1,0,14,209,33 - LTEXT "Als System Control Server oder Client konfigurieren.", - IDC_TITLE,0,0,209,8 - LTEXT "Möchten Sie diese Maschine als System Control Server oder Client konfigurieren?", - IDC_SYS_CONTROL_MACHINE_QUESTION,0,131,207,17 - LTEXT "Ein System Control Client erhält vom System Control Server der Zelle alle verfügbaren Aktualisierungen zu seinen AFS-Konfigurationsdateien.", - IDC_SYS_CONTROL_CLIENT_DESC,0,52,209,26 - LTEXT "S&ystem Control Server:",IDC_SYS_CONTROL_MACHINE_LABEL, - 15,176,73,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "WARNUNG: Standorte, die den Vertrieb von AFS® in den Vereinigten Staaten nicht nutzen, sollten Konfigurationsdateien nicht über den System Control Server verteilen. Es würden dabei sensible Systeminformationen in unverschlüsselter Form übertragen.", - -1,9,81,200,49 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Dies sind die gesamten Informationen, die zum Konfigurieren des AFS Servers in diesem System benötigt werden.", - IDC_ALL_NEEDED_MSG,1,14,209,17 - LTEXT "Diese Maschine in die Zelle konfigurieren", - IDC_TITLE,1,0,208,8 - LTEXT "Die folgenden Konfigurationsschritte werden ausgeführt:", - IDC_FOLLOWING_STEPS_MSG,1,36,187,8 - LTEXT "Schritt 1 - zur Laufzeit erzeugter Text",IDC_STEP1,22, - 49,179,8,NOT WS_VISIBLE - LTEXT "Schritt 3 - zur Laufzeit erzeugter Text",IDC_STEP3,22, - 73,179,8,NOT WS_VISIBLE - LTEXT "Schritt 2 - zur Laufzeit erzeugter Text",IDC_STEP2,22, - 61,179,8,NOT WS_VISIBLE - LTEXT "Schritt 4 - zur Laufzeit erzeugter Text",IDC_STEP4,22, - 85,179,8,NOT WS_VISIBLE - LTEXT "Schritt 5 - zur Laufzeit erzeugter Text",IDC_STEP5,22, - 97,179,8,NOT WS_VISIBLE - LTEXT "Schritt 6 - zur Laufzeit erzeugter Text",IDC_STEP6,22, - 109,179,8,NOT WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,178,200,11 - LTEXT "Schritt 8 - zur Laufzeit erzeugter Text",IDC_STEP8,22, - 133,179,8,NOT WS_VISIBLE - LTEXT "Schritt 7 - zur Laufzeit erzeugter Text",IDC_STEP7,22, - 121,179,8,NOT WS_VISIBLE - LTEXT "Zur Laufzeit bei Bedarf erzeugte Nachricht.", - IDC_CANT_CONFIG_MSG,1,13,209,17,NOT WS_VISIBLE - LTEXT "Vollständig in Prozent:",IDC_PERCENT_COMPLETE_LABEL,1, - 191,76,8,NOT WS_VISIBLE - LTEXT "Laufender Prozeß:",IDC_CURRENT_STEP_LABEL,1,157,108,8, - NOT WS_VISIBLE - LTEXT "Beschreibung des laufenden Schrittes - zur Laufzeit erzeugt", - IDC_CURRENT_STEP,1,167,208,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,92,191,49,8,NOT WS_VISIBLE - LTEXT "Um mit der Konfiguration dieses Computers zu beginnen, drücken Sie Konfigurieren. Um die auszuführenden Konfigurationsschritte zu verändern, drücken Sie Zurück.", - IDC_STATUS_MSG,1,159,208,41 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,112,158,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,149,156,11,14 - LTEXT "Verwaltungsinformationen",IDC_TITLE,0,0,202,8 - LTEXT "&Name:",IDC_ADMIN_NAME_LABEL,7,57,22,8 - LTEXT "&Kennwort:",IDC_ADMIN_PW_LABEL,7,73,34,8 - GROUPBOX "Name und Kennwort des Kontos",IDC_ADMIN_INFO_FRAME,0,41, - 210,65 - LTEXT "&Prüfkennwort:",IDC_VERIFY_ADMIN_PW_LABEL,7,90,52,8 - LTEXT "Die untenstehenden Informationen werden benötigt, um das Verwaltungskonto für diese neue Zelle zu erstellen.", - IDC_STATIC,0,15,209,17 - CONTROL "&Diese AFS UID verwenden:",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,159,99,10 - CONTROL "Die &nächste verfügbare AFS UID verwenden", - IDC_USE_NEXT_UID,"Button",BS_AUTORADIOBUTTON,6,144,160, - 10 - GROUPBOX "AFS UID",IDC_STATIC,0,118,209,57 - LTEXT "Geben Sie die Benutzer-ID für das AFS-Verwaltungskonto ein:", - IDC_STATIC,6,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Ja, als Database Server konfigurieren.", - IDC_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,131,134,10 - CONTROL "&Nein, nicht als Database Server konfigurieren.", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 188,160,10 - LTEXT "Der Database Service verwaltet die durch eine AFS-Zelle benötigte Gruppe nachgebildeter Datenbanken. Dieser Service verwaltet für die Zelle alle Informationen zu Konten, Volume-Speicherorten und (optional) zur Sicherung.", - -1,0,38,209,54 - LTEXT "Möchten Sie diese Maschine als Database Server konfigurieren?", - IDC_DB_SERVER_QUESTION,0,108,209,10 - LTEXT "Diese Maschine als Database Server konfigurieren.", - IDC_TITLE,0,0,209,8 - LTEXT "Um diese Maschine als Database Server zu konfigurieren, müssen Sie den Database Service konfigurieren.", - -1,0,14,209,16 - LTEXT "Diese Maschine ist bereits als Database Server konfiguriert.", - IDC_MSG,0,167,210,33,NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,86,174,119,12,ES_AUTOHSCROLL - LTEXT "S&ystem Control Server:",IDC_SYS_CONTROL_MACHINE_LABEL, - 12,176,73,8 - LTEXT "Wenn Ihre Zelle einen System Control Server besitzt, geben Sie seinen Hostnamen unter ein. Die AFS-Konfigurations-\ndateien werden über diesen Server aktualisiert.", - IDC_SCM_PROMPT,10,144,195,27 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "Diesen Host zu einem Server in einer vorhandenen AFS-Zelle &machen", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,0,41,203,15 - CONTROL "&Dies wird der erste Server in einer neuen AFS-Zelle sein", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,0,59,197,8 - EDITTEXT IDC_CELL_NAME,64,96,139,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,64,166,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,64,180,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Zellen- und Server-Informationen",IDC_TITLE,0,0,203,8 - LTEXT "&Zellenname:",IDC_CELL_NAME_LABEL,7,97,40,8 - LTEXT "&Kennwort:",IDC_SERVER_PW_LABEL,7,167,34,8,WS_DISABLED - LTEXT "Geben Sie den Namen der AFS-Zelle ein:", - IDC_CELL_NAME_PROMPT,8,86,195,9 - LTEXT "Geben Sie das Kennwort für den AFS-Principal ein. Alle AFS Server erhalten Token als dieser Principal.", - IDC_SERVER_PW_PROMPT,7,130,196,19,WS_DISABLED - GROUPBOX "Zellenname",IDC_CELL_NAME_FRAME,0,75,210,43 - GROUPBOX "Server-Kennwort",IDC_SERVER_PW_FRAME,0,119,210,81, - WS_DISABLED - LTEXT "&Prüfkennwort:",IDC_VERIFY_PW_LABEL,7,180,52,8, - WS_DISABLED - LTEXT "Eine AFS-Zelle ist eine Objektgruppe von Servern, die für den Dateizugriff einen einheitlichen Namespace zur Verfügung stellen.", - IDC_CELL_NAME_PROMPT2,1,13,202,24 - LTEXT "Name:",IDC_PRINCIPAL_LABEL,7,152,22,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,150,139,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,53,43,149,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,53,59,149,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,53,132,149,12,ES_AUTOHSCROLL - LTEXT "Verwaltungsinformationen",IDC_TITLE,0,0,209,8 - LTEXT "Geben Sie die Verwaltungsinformationen zum Konto unten ein:", - IDC_ADMIN_INFO_PROMPT,7,30,196,10 - LTEXT "&Name:",IDC_ADMIN_NAME_LABEL,7,46,22,8 - LTEXT "&Kennwort:",IDC_ADMIN_PW_LABEL,7,62,34,8 - GROUPBOX "Name und Kennwort des Kontos",IDC_ADMIN_INFO_FRAME,0,17, - 210,62 - GROUPBOX "Vorhandene AFS Server",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS Server:",IDC_HOSTNAME_LABEL,9,134,43,8 - LTEXT "Geben Sie den Hostnamen eines anderen AFS Servers in der Zelle ein, die Sie verknüpfen möchten. Von diesem Server werden die AFS-Konfigurationsdaten empfangen.", - IDC_HOSTNAME_PROMPT,7,105,202,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 284 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Services" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_STATIC,7,20,281,45 - GROUPBOX "",IDC_STATIC,7,70,281,43 - GROUPBOX "",IDC_STATIC,7,119,281,45 - GROUPBOX "",IDC_STATIC,7,169,281,44 - CONTROL "File Service",IDC_FS_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,19,60,10 - CONTROL "Database Service",IDC_DB_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,69,82,10 - PUSHBUTTON "Einzeldaten...",IDC_DB_DETAILS,230,85,50,14,NOT - WS_VISIBLE - CONTROL "Backup-Server",IDC_BK_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,118,71,10 - CONTROL "System Control Server",IDC_SCS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,168,98,10 - EDITTEXT IDC_SC_MACHINE,107,241,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Wählen Sie die Services aus, die auf diesem AFS Server laufen sollen:", - IDC_STATIC,7,7,217,8 - LTEXT "Der File Service ist zur Zeit aktiv.",IDC_FS_STATUS_MSG, - 14,32,261,8 - LTEXT "Der Database Service ist zur Zeit teilweise installiert.", - IDC_DB_STATUS_MSG,14,82,195,8 - LTEXT "S&ystem Control Server:",IDC_SC_MACHINE_LABEL,31,243,73, - 8,WS_DISABLED - LTEXT "Um den File Service zu stoppen, machen Sie die Markierung des obigen Fensters rückgängig.", - IDC_FS_ACTION_MSG,14,44,262,17 - LTEXT "Für weitere Informationen klicken Sie auf Einzeldaten.", - IDC_DB_ACTION_MSG,14,93,212,15 - LTEXT "Der Backup-Server ist zur Zeit aktiv.", - IDC_BK_STATUS_MSG,14,131,259,8 - LTEXT "Um den Backup-Server zu stoppen, machen Sie die Markierung des obigen Fensters rückgängig.", - IDC_BK_ACTION_MSG,14,143,262,16 - LTEXT "Um diesen Server zu aktivieren, müssen Sie entweder den File Service oder den Database Service ausführen.", - IDC_SCS_ACTION_MSG,14,193,268,18 - LTEXT "Der Service System Control ist zur Zeit nicht aktiv.", - IDC_SCS_STATUS_MSG,14,180,263,9 - GROUPBOX "",IDC_STATIC,7,220,281,57 - CONTROL "System Control Client",IDC_SCC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,219,95,10 - LTEXT "Um diesen Server zu aktivieren, müssen Sie entweder den File Service oder den Database Service ausführen.", - IDC_SCC_ACTION_MSG,14,257,268,15 - LTEXT "Der Service System Control ist zur Zeit nicht aktiv.", - IDC_SCC_STATUS_MSG,14,230,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Partitionen" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Die folgenden &AFS-Partitionen sind auf Ihrem Computer vorhanden:", - IDC_STATIC,8,7,220,8 - PUSHBUTTON "&Erstellen...",IDC_CREATE_PARTITIONS,17,118,71,14 - LTEXT "Um eine Partition oder ein Volume auf einer Partition zurückzugewinnen, wählen Sie in der Liste die Partition aus und klicken auf die obige Schaltfläche. Um alle Partitionen auf diesem Server zurückzugewinnen, klicken Sie auf die obige Schaltfläche.", - IDC_SALVAGE_MSG,30,179,250,32 - PUSHBUTTON "&Zurückgewinnen...",IDC_SALVAGE,17,159,71,14 - LTEXT "Um eine Partition zu entfernen, wählen Sie in der Liste die Partition aus und klicken auf die obige Schaltfläche.", - IDC_REMOVE_MSG,30,235,253,17,WS_DISABLED - PUSHBUTTON "&Entfernen",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "Partitionen",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "Um auf diesem Server eine neue Partition zu erstellen, klicken Sie auf die obige Schaltfläche.", - IDC_CREATE_MSG,30,136,254,16 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS-Partition erstellen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Wählen Sie aus der unten stehenden Liste ein NTFS-Volume aus, auf dem die neue Partition erstellt werden soll:", - IDC_TITLE,7,5,250,18 - LTEXT "Name der AFS-Partition:",IDC_NAME_STATIC,14,131,76,8 - EDITTEXT IDC_PARTITION_NAME,123,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Erstellen",IDC_CREATE,96,158,50,14,WS_DISABLED - PUSHBUTTON "&Schließen",IDC_CLOSE,152,158,50,14 - PUSHBUTTON "Hilfe",9,207,158,50,14 - GROUPBOX "Parameter der Partition",IDC_ARGS_FRAME,7,117,250,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,25,250, - 85,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,99,131,22,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 225, 159 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Konfiguration des AFS® Servers" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,59,33,151,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,59,49,151,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,59,113,151,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Konfigurieren",IDOK,108,138,50,14,WS_DISABLED - PUSHBUTTON "Abbrechen",IDCANCEL,48,138,50,14 - PUSHBUTTON "Hilfe",9,168,138,50,14 - LTEXT "Geben Sie die Verwaltungsinformationen zum Konto unten ein:", - IDC_ADMIN_INFO_PROMPT,14,20,196,10 - LTEXT "&Name:",IDC_ADMIN_NAME_LABEL,15,36,22,8 - LTEXT "&Kennwort:",IDC_ADMIN_PW_LABEL,15,52,34,8 - GROUPBOX "Name und Kennwort des Kontos",IDC_ADMIN_INFO_FRAME,7,7, - 211,62 - GROUPBOX "System Control Server",IDC_HOSTNAME_FRAME,7,73,211,59 - LTEXT "&Host-Name:",IDC_HOSTNAME_LABEL,15,115,40,8 - LTEXT "Wenn Ihre Zelle einen System Control Server besitzt, geben Sie seinen Hostnamen unter ein. Die AFS-Konfigurationsdateien werden über diesen Server aktualisiert.", - IDC_HOSTNAME_PROMPT,13,84,205,24 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,150,225,9,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 87 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Konfiguration des AFS® Servers" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Abbrechen",IDCANCEL,103,66,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,37,200,11 - LTEXT "Vollständig in Prozent:",IDC_PERCENT_COMPLETE_LABEL,40, - 50,76,8,NOT WS_VISIBLE - LTEXT "Laufender Prozeß:",IDC_CURRENT_STEP_LABEL,40,15,108,8, - NOT WS_VISIBLE - LTEXT "Beschreibung des laufenden Schrittes - zur Laufzeit erzeugt", - IDC_CURRENT_STEP,40,26,210,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,117,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "Um mit der Konfiguration dieses Computers zu beginnen, drücken Sie Konfigurieren. Um die auszuführenden Konfigurationsschritte zu verändern, drücken Sie Zurück.", - IDC_STATUS_MSG,40,16,210,41 - PUSHBUTTON "Protokoll &anzeigen",IDNEXT,156,66,62,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "CellServCB-Aktualisierungsfehler" -FONT 9, "MS Shell Dlg" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,22,162,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,75,162,50,14 - PUSHBUTTON "Hilfe",9,130,162,50,14 - LTEXT "Die Datei CellServDB auf den folgenden AFS-Servern konnte nicht automatisch aktualisiert werden:", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 243, 188 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Wiederherstellung" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,78,97,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,132,97,50,14 - PUSHBUTTON "&Hilfe",9,186,97,50,14 - CONTROL "Alle Partitionen auf diesem Datei-Server &zurückgewinnen", - IDC_SERVER,"Button",BS_AUTORADIOBUTTON,14,35,205,10 - CONTROL "Alle Volumes auf der ausgewählten &Partition zurückgewinnen", - IDC_PARTITION,"Button",BS_AUTORADIOBUTTON,14,48,211,10 - CONTROL "Ein spezielles &Volume der ausgewählten Partition zurückgewinnen", - IDC_VOLUME,"Button",BS_AUTORADIOBUTTON,14,61,222,10 - EDITTEXT IDC_VOLUME_NAME,76,74,97,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< &Erweitert",IDC_ADVANCED,7,97,50,14 - GROUPBOX "",IDC_STATIC,7,25,229,67 - LTEXT "Volume-&Name:",IDC_VOLUME_NAME_LABEL,27,75,47,8, - WS_DISABLED - GROUPBOX "Erweiterte Optionen zur Wiederherstellung ", - IDC_ADVANCED_FRAME,7,119,229,62 - LTEXT "Pfad für &Temporärdateien:",IDC_TEMP_DIR_LABEL,13,162, - 84,12 - EDITTEXT IDC_LOG_FILE,97,146,133,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,209,129,21,12,ES_AUTOHSCROLL - LTEXT "Dateiname für &Ergebnisprotokoll:",IDC_LOG_FILE_LABEL, - 13,144,68,16 - EDITTEXT IDC_TEMP_DIR,97,161,133,12,ES_AUTOHSCROLL - CONTROL "Pa&rallele Wiederherstellungsoperationen; Anz. Prozesse:", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,131,189,10 - LTEXT "Während Sie den Server oder eine ganze Partition zurückgewinnen, ist der Server zeitweilig offline.", - IDC_STATIC,50,7,186,17 - LTEXT "HINWEIS:",IDC_STATIC,7,7,38,8 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is\\bresized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,180,243,8,NOT WS_VISIBLE -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Kennwort des AFS-Principals" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_PW,48,42,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,31,61,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,85,61,50,14 - PUSHBUTTON "Hilfe",9,140,61,50,14 - LTEXT "Der Schlüssel eines AFS-Principals kann nicht von einem Authentifizierungs-Server mit einem Stand vor 3.5 abgerufen werden. Geben Sie bitte das Kennwort des AFS-Principals unten ein.", - IDC_STATIC,7,7,183,34 - LTEXT "Kennwort:",IDC_STATIC,7,44,35,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Wiederherstellung von Volumes - Ergebnisse" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "&Schließen",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "Hilfe",9,280,266,50,14 - LTEXT "",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 203 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 53 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 277 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 218 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 152 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 80 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS® Configuration-Anwendung und -Assistent""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "&Weiter >" - IDS_FINISH "&Fertigstellen" - IDS_HELP_TITLE "Schaltfläche Hilfe gedrückt" - IDS_HELP_DESC "Hilfe ist zur Zeit nicht verfügbar." - IDS_CANCEL_DESC "Den AFS Quick-Start-Assistenten abbrechen?" - IDS_PARTITION_ALREADY_CREATED - "Auf dieser Maschine ist bereits eine AFS-Partition vorhanden." - IDS_NOT_A_FS_SERVER "Diese Maschine ist nicht als File Server konfiguriert. Volumes können nur auf File Server-Maschinen erstellt werden." - IDS_ROOT_AFS_ALREADY_EXISTS "Die Root-Volumes sind bereits vorhanden." - IDS_NO_PARTITION_EXISTS "Es sind keine Partitionen vorhanden, auf denen die Root-Volumes \nerstellt werden können. Eine Partition muß vorhanden sein, bevor die Root-Volumes erstellt \nwerden können." - IDS_ALREADY_REPLICATED "Die Root-Volumes wurden bereits nachgebildet." - IDS_ROOT_AFS_DOESNT_EXIST - "Die Root-Volumes sind nicht vorhanden. Die Root-Volumes müssen vorhanden sein, bevor sie nachgebildet werden können." - IDS_ALREADY_CONFIGURED "Diese Maschine ist bereits als AFS Server konfiguriert." - IDS_NOTHING_TO_CONFIGURE - "Sie haben für die Konfiguration nichts ausgewählt." - IDS_EXIT "Exit" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "Starten des File Service" - IDS_CANCEL_CONFIG_MSG "Wenn Sie an diesem Punkt abbrechen, ist Computer nur teilweise als AFS-Server konfiguriert. Trotzdem abbrechen?" - IDS_WIZARD_APP_TITLE "AFS® Server Quick Start-Assistent" - IDS_CANCEL_PENDING "*** Abbruch läuft - einen Moment bitte... ***" - IDS_CHECK_FS_CONFIG "Überprüfung des File Servers..." - IDS_CHECK_DB_CONFIG "Überprüfung des Database Servers..." - IDS_CHECK_BAK_CONFIG "Überprüfung des Backup-Servers..." - IDS_CHECK_PARTITION "Überprüfung der AFS-Partition..." - IDS_CHECK_ROOT_AFS "Überprüfung der Root-Volumes..." - IDS_CHECK_REP "Überprüfung der Nachbildungen der Root-Volumes..." - IDS_CANCEL_GET_CONFIG "Abbrechen...Einen Moment bitte..." - IDS_ALREADY_A_BACKUP_SERVER - "Diese Maschine ist bereits als Backup-Server konfiguriert." - IDS_NOT_A_DB_SERVER "Diese Maschine ist nicht als Database Server konfiguriert. Backup-Server können nur auf Database Server-Maschinen ausgeführt werden." - IDS_ALREADY_A_SYS_CONTROL_SERVER - "Diese Maschine ist bereits als System Control Server konfiguriert." - IDS_ALREADY_A_SYS_CONTROL_CLIENT - "Diese Maschine ist bereits als System Control Client konfiguriert." - IDS_SC_NOT_A_DB_OR_FS_SERVER - "Diese Maschine ist nicht als Database oder File Server \nkonfiguriert. Ein Computer kann nur als System Control-Maschine konfiguriert werden, wenn er auch als Database oder File Server-Maschine konfiguriert ist." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "Volume" - IDS_NAME_OR_ERROR "Name (oder Fehlernachricht)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "Diese Maschine ist nicht als Database oder File Server \nkonfiguriert. Ein Computer kann nur als Binary Distribution-Maschine konfiguriert werden, wenn \ner auch als Database oder File Server-Maschine konfiguriert ist." - IDS_CHECK_SCS "Überprüfung des System Control Servers..." - IDS_CHECK_SCC "Überprüfung des System Control Clients..." - IDS_SIZE "Größe" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "Wenn dies der erste AFS Server in der Zelle ist, wird der File Service standardmäßig konfiguriert." - IDS_MUST_CONFIG_DB "Wenn dies der erste AFS Server in der Zelle ist, wird der Database Service standardmäßig konfiguriert." - IDS_MUST_MAKE_PARTITION "Wenn dies der erste AFS Server in der Zelle ist, muß eine Partition erstellt werden." - IDS_MUST_CREATE_ROOT_AFS - "Wenn dies der erste AFS Server in der Zelle ist, werden die Volumes root.afs und root.cell standardmäßig erstellt." - IDS_MUST_REPLICATE "Wenn dies der erste AFS Server in der Zelle ist, werden die Volumes root.afs und root.cell standardmäßig nachgebildet." - IDS_CHECK_AFS_CLIENT "Überprüfung der Installation des AFS Clients..." - IDS_ERROR_HOST_NAME "Der Host-Name dieser Maschine konnte nicht ermittelt werden." - IDS_ERROR_DRIVE_COMPRESSED "Laufwerk ist komprimiert" - IDS_ERROR_CFG_HOST_OPEN "Die Server Configuration Library konnte nicht initialisiert werden." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "Stoppen des AFS Clients" - IDS_ERROR_LOCAL_HOST_NAME - "Der lokale Host-Name dieser Maschine konnte nicht ermittelt werden." - IDS_GET_TOKENS_ERROR "Keine Token erhalten. Überprüfen Sie, ob Sie Benutzername und Kennwort korrekt eingegeben haben." - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "Wiederherstellung kann nicht durchgeführt werden, weil der File \nService noch nicht gestartet worden ist. Bitte starten Sie den File Service und versuchen Sie \nes erneut." - IDS_SALVAGING "Wiederherstellung in Bearbeitung. Bitte warten..." - IDS_CURRENT_SALVAGE_LOG "Aktueller Inhalt des Wiederherstellungsprotokolls:" - IDS_FINAL_SALVAGE_LOG "Letzter Inhalt des Wiederherstellungsprotokolls:" - IDS_SALVAGE_COMPLETE "Die Wiederherstellung ist beendet." - IDS_CANT_GET_SALVAGE_LOG - "Wiederherstellungsprotokoll konnte nicht abgerufen werden." - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK - "Wiederherstellungsprotokoll konnte nicht auf Platte gesichert werden." - IDS_VALIDATION_ERROR_TEMPLATE - "Angegebene(s) %1 ist ungültig. Bitte geben Sie %2 neu ein." - IDS_CELL_NAME_VALIDATION_TYPE "Zellenname" - IDS_SERVER_NAME_VALIDATION_TYPE "Server-Name" - IDS_PASSWORD_VALIDATION_TYPE "Kennwort" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "Benutzername" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "Der AFS Client ist nicht installiert. Der AFS Client muß installiert sein, bevor der AFS Server konfiguriert werden kann." - IDS_ERROR_AFS_CLIENT_CHECK - "Es konnte nicht ermittelt werden, ob der AFS Client installiert ist." - IDS_ERROR_FS_IS_NOT_NTFS "Dateisystem ist kein NTFS-Dateisystem" - IDS_ERROR_DRIVE_HAS_DATA "Laufwerk enthält Daten" - IDS_PARTITION_STEP_DESC "AFS-Partition erstellen" - IDS_ERROR_DRIVE_CONTAINS_NT "Laufwerk enthält NT-Installation" - IDS_DB_STEP_DESC "Database Service starten" - IDS_FS_STEP_DESC "File Service starten" - IDS_SCC_STEP_DESC "System Control Client starten" - IDS_SCS_STEP_DESC "System Control Server starten" - IDS_ROOT_AFS_STEP_DESC "Root-Volumes erstellen" - IDS_REP_STEP_DESC "Root-Volumes nachbilden" - IDS_PARTITIONS_PAGE_TITLE "Partitionen" - IDS_CONFIGURE "&Konfigurieren" - IDS_DB_AND_BK_STEP_DESC "Database Service starten (beinhaltet Backup-Server)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "Erstellen der AFS-Partition" - IDS_CONFIG_COMMON_FUNCS "Konfigurieren der allen Services gemeinsamen Funktionen" - IDS_START_DB_STEP "Starten des Database Service" - IDS_START_SCC_STEP "Starten des System Control Service als System Control Client" - IDS_START_SCS_STEP "Starten des System Control Service als System Control Server" - IDS_CREATE_ROOT_AFS_STEP "Erstellen des Volumes root.afs" - IDS_REP_STEP "Nachbilden des Root-Volumes" - IDS_START_AUTH_STEP "Abrufen von Token für diesen Server" - IDS_SERVICES_PAGE_TITLE "Services" - IDS_CONFIG_SUCCEEDED "Konfiguration war erfolgreich." - IDS_CONFIG_CANCELED "Konfiguration wurde abgebrochen." - IDS_CONFIG_FAILED "Konfiguration fehlgeschlagen.\r\n\r\nDie detaillierte Protokolldatei %1 ist an Adresse %2 erstellt worden." - IDS_ERROR_NO_LICENSE_NUM "Keine AFS-Lizenznummer gefunden." - IDS_VERIFY_CLIENT_INSTALL_STEP - "Überprüfen der Installation des AFS Clients" - IDS_SET_SERVER_LICENSE_STEP "Einstellung der Lizenz für diesen Server" - IDS_DEFINE_CELL_NAME_STEP "Definieren des Namens für diese Zelle" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP - "Aus diesem Server ein Mitglied der Zelle machen" - IDS_START_BOS_SERVER_STEP "Starten des BOS-Servers" - IDS_START_AUTH_SERVER_STEP "Starten des Authentifizierungs-Servers" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP - "Erstellen eines Principals und eines Schlüssels für diesen Server" - IDS_START_DB_AND_BK_STEP - "Starten des Database Service (beinhaltet Backup-Server)" - IDS_CREATE_ADMIN_PRINCIPAL_STEP "Erstellen des Principals cell admin" - IDS_START_CLIENT_STEP "Starten des AFS Clients" - IDS_SET_ROOT_ACL_STEP "Einstellung der ACL auf dem Volume root.afs" - IDS_CREATE_ROOT_CELL_STEP "Erstellen des Volumes root.cell" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP - "Anhängen des Volumes root.cell mit Hilfe eines Standard-Mount-Punktes" - IDS_SET_ROOT_CELL_ACL_STEP "Einstellung der ACL auf dem Volume root.cell" - IDS_MOUNT_ROOT_CELL_RW_STEP - "Anhängen des Volumes root.cell mit Hilfe eines Read/Write-Mount-Punktes" - IDS_ENABLE_AUTH_CHECKING_STEP - "Aktivieren der Überprüfung der Authentifizierung" - IDS_OBTAIN_ADMIN_CREDS_STEP "Erlangen von Verwaltungs-Token" - IDS_RESTART_SERVERS_STEP - "Erneutes Starten aller Server auf dieser Maschine als authentifizierte Server" - IDS_ALREADY_A_FS_SERVER "Diese Maschine ist bereits als File Server konfiguriert." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "Diese Maschine ist bereits als Database Server konfiguriert." - IDS_INTRO_PAGE "Einführung" - IDS_INFO_PAGE "Zellen- und Serverinformationen" - IDS_FS_PAGE "File Service" - IDS_DB_PAGE "Database Service" - IDS_CFG_TOOL_APP_TITLE "Konfiguration des AFS® Servers" - IDS_BK_PAGE "Backup-Server" - IDS_ROOT_AFS_PAGE "AFS-Root-Volumes" - IDS_NAME "Name" - IDS_REP_PAGE "Nachbildung" - IDS_SC_PAGE "System Control Service" - IDS_CONFIG_PAGE "Das System konfigurieren" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "AFS-Partition" - IDS_GRAPHIC_FONT "Ms Sans Serif, 6, B" - IDS_CURRENT_STEP "Aktueller Schritt:" - IDS_ADD_TO_CELLSERVDB_STEP "Hinzufügen dieses Servers zu CellServDB" - IDS_RESTART_ALL_DB_SERVERS_STEP - "Erneutes Starten aller Datenbank-Server in der Zelle" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "Konfiguration war erfolgreich. HINWEIS: Die Datei CellServDB aller \nAFS-Clients in Ihrer Zelle muß aktualisiert werden. Gewährleisten Sie, daß Sie den AFS Product \nSupport mit einer aktuellen Liste Ihrer Database Servers verwenden, wenn Sie Ihre Zelle für \nandere Standorte zugänglich machen." - IDS_SYS_CONTROL_SERVER_ONLY_MSG - "Möchten Sie diese Maschine als System Control Server konfigurieren?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG - "&Nicht als System Control Server konfigurieren." - IDS_CLIENT_CELL_WILL_CHANGE - "Konfiguration des AFS Servers erfordert, daß der AFS Client in derselben Zelle wie der Server konfiguriert ist. Dies erfolgt automatisch." - IDS_INFO_PAGE2 "Informationen zur Verwaltung" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "Konfiguration war erfolgreich.\r\n\r\nHINWEIS: Gewährleisten Sie, daß Sie den AFS Product Support mit einer Liste Ihrer Database Server verwenden, wenn Sie Ihre Zelle für andere Standorte zugänglich machen." - IDS_CONFIG_SCS "Als System Control Server der Zelle konfigurieren." - IDS_CONFIG_INTO_CELL_MSG "Diesen Host konfigurieren in Zelle " - IDS_VIEW_LOG "Protokoll ö&ffen" - IDS_VIEW_LOG_ERROR "Die Protokolldatei kann nicht angezeigt werden" - IDS_ERROR_NO_LOG_FILE "Die Protokolldatei ist nicht vorhanden." - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED - "Aktualisierter CellServDB auf Host " - IDS_UPDATING_CELLSERVDB_HOST_FAILED - "Fehlgeschlagene Aktualisierung von CellServDB auf Host " - IDS_CELL_NAME_LEN_ERROR "Der von Ihnen eingegebene Zellenname ist zu lang. Zellennamen können nicht länger als 64 Zeichen sein." - IDS_CONFIG_CHECK_FAILED "Die aktuelle Konfiguration auf dieser Maschine konnte nicht ermittelt werden." - IDS_YES "Ja" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "Nein" - IDS_FREE "Freier Speicherbereich" - IDS_TOTAL "Größe insgesamt" - IDS_DRIVE2 "Laufwerk" - IDS_SERVICE_STATUS "Status" - IDS_SERVICE "Service" - IDS_FS_RUNNING "Der File Service ist zur Zeit aktiv." - IDS_FS_STOPPED "Der File Service ist zur Zeit nicht aktiv." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "Der Database Service ist zur Zeit aktiv." - IDS_DB_STOPPED "Der Database Service ist zur Zeit nicht aktiv." - IDS_BK_RUNNING "Der Backup-Service ist zur Zeit aktiv." - IDS_BK_STOPPED "Der Backup-Service ist zur Zeit nicht aktiv." - IDS_SCS_STOPPED "Der System Control Server ist zur Zeit nicht aktiv." - IDS_SCC_STOPPED "Der System Contol Client ist zur Zeit nicht aktiv." - IDS_FS_HOW_TO_RUN "Um den File Service zu starten, überprüfen Sie das obige Fenster." - IDS_FS_HOW_TO_STOP "Um den File Service zu stoppen, machen Sie die Markierung des \nobigen Fensters rückgängig." - IDS_DB_HOW_TO_RUN "Um den Database Service zu starten, überprüfen Sie das obige \nFenster." - IDS_DB_HOW_TO_STOP "Um den Database Service zu stoppen, machen Sie die Markierung des \nobigen Fensters rückgängig." - IDS_BK_HOW_TO_RUN "Um den Backup-Service zu starten, überprüfen Sie das obige \nFenster." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "Um den Backup-Service zu stoppen, machen Sie die Markierung des \nobigen Fensters rückgängig." - IDS_SCS_HOW_TO_RUN "Um den System Control Server zu starten, überprüfen Sie das obige \nFenster." - IDS_SCS_HOW_TO_STOP "Um den System Control Server zu stoppen, machen Sie die Markierung \ndes obigen Fensters rückgängig." - IDS_DB_PARTIAL_CONFIG "Der Database Service ist teilweise konfiguriert." - IDS_DB_DETAILS "Für weitere Informationen klicken Sie auf Einzeldaten." - IDS_BK_DISABLED "Der Backup-Service ist gesperrt." - IDS_BK_ENABLE "Um den Backup-Service zu aktivieren, müssen Sie den Database Service ausführen." - IDS_SC_DISABLED "Dieser Server ist gesperrt." - IDS_SC_ENABLE "Um diesen Server zu aktivieren, müssen Sie entweder den File Service oder den Database Service ausführen." - IDS_FS_WILL_RUN "Der File Service wird gestartet." - IDS_FS_WILL_STOP "Der File Service wird gestoppt." - IDS_DB_WILL_RUN "Der Database Service wird gestartet." - IDS_DB_WILL_STOP "Der Database Service wird gestoppt." - IDS_BK_WILL_RUN "Der Backup-Service wird gestartet." - IDS_BK_WILL_STOP "Der Backup-Service wird gestoppt." - IDS_SCS_WILL_RUN "Der System Control Server wird gestartet." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "Der System Control Server wird gestoppt." - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "Laufwerk ist bereits eine AFS-Partition" - IDS_VOLUME_HAS_NO_NAME "" - IDS_PARTITION_CREATED "Eine neue AFS-Partition wurde erfolgreich erstellt." - IDS_PARTITION_EXISTS "Der von Ihnen eingegebene Name der Partition wird bereits durch eine andere Partition benutzt." - IDS_SCS_RUNNING "Der System Control Server ist zur Zeit aktiv." - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN - "Dieses Laufwerk enthält nur der Papierkorb." - IDS_SCC_WILL_RUN "Der System Control Client wird gestartet." - IDS_SCC_WILL_STOP "Der System Control Client wird gestoppt." - IDS_SCC_RUNNING "Der System Control Client ist zur Zeit aktiv." - IDS_SCC_HOW_TO_RUN "Um den System Control Client zu starten, überprüfen Sie das obige \nFenster." - IDS_SCC_HOW_TO_STOP "Um den System Control Client zu stoppen, machen Sie die Markierung \ndes obigen Fensters rückgängig." - IDS_SCS_ENABLE "Um diesen Server zu aktivieren, müssen Sie den System Control \nClient stoppen." - IDS_SCC_ENABLE "Um diesen Server zu aktivieren, müssen Sie den System Control \nServer stoppen." - IDS_UNCONFIG_DB_STEP "Dekonfigurieren des Database Service" - IDS_UNCONFIG_DB_STEP_DESC "Database Service dekonfigurieren" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP - "Dekonfigurieren des Database Service (und Backup-Servers)" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC - "Database Service dekonfigurieren (und Backup-Server)" - IDS_UNCONFIG_BK_STEP "Dekonfigurieren des Backup-Servers" - IDS_UNCONFIG_BK_STEP_DESC "Backup-Server dekonfigurieren" - IDS_UNCONFIG_FS_STEP "Dekonfigurieren des File Service" - IDS_UNCONFIG_FS_STEP_DESC "File Service dekonfigurieren" - IDS_UNCONFIG_SCS_STEP "Dekonfigurieren des System Control Servers" - IDS_UNCONFIG_SCS_STEP_DESC "System Control Server dekonfigurieren" - IDS_UNCONFIG_SCC_STEP "Dekonfigurieren des System Control Clients" - IDS_UNCONFIG_SCC_STEP_DESC "System Control Client dekonfigurieren" - IDS_INVALIDATE_CONFIG_INFO_STEP - "Ungültigmachen der Konfigurationsdaten dieser Maschine" - IDS_CLOSE "&Schließen" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "Die Datei CellServDB konnte auf den unten angegebenen AFS-Servern nicht aktualisiert werden. Dies ist ein behebbarer Fehler.\r\n" - IDS_DELETE_PARTITION_PROMPT "Partition '%1' wirklich löschen?" - IDS_INVALIDATE_CFG_INFO "Auf diesem Computer ist zur Zeit kein AFS-Server-Prozeß aktiv. Möchten Sie die Konfigurationsdaten von dieser Maschine entfernen?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "Die Zelle existiert nicht mehr. Die Anwendung AFS Configuration kann nur verwendet werden, um bereits konfigurierte Server-Maschinen in eine AFS-Zelle zu konfigurieren. Der AFS Configuration-Assistent kann verwendet werden, um eine neue Zelle zu starten." - IDS_CFG_MAN_CANT_CONTINUE - "Die Anwendung AFS Configuration muß jetzt beendet werden. Sie kann \nauf Maschinen ausgeführt werden, die bereits als AFS Server konfiguriert sind. Um diese \nMaschine erneut als AFS Server zu konfigurieren, verwenden Sie den AFS \nConfiguration-Assistenten." - IDS_CONFIG_INFO_INVALIDATED - "Die Maschine ist nicht mehr als AFS Server konfiguriert. Die \nAnwendung AFS Configuration kann nur verwendet werden, um AFS Server-Maschinen zu \nkonfigurieren. Der AFS Configuration-Assistent kann verwendet werden, um diese Maschine als \nAFS Server zu rekonfigurieren." - IDS_GET_TOKENS_FAILED "Für die angegebene Zelle konnten keine Token erlangt werden." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "Starten des Backup-Servers" - IDS_BK_STEP_DESC "Backup-Server starten" - IDS_CONFIG_ERROR "Ein Konfigurationsfehler ist aufgetreten" - IDS_CREATE_PARTITION_ERROR "Partition konnte nicht erstellt werden" - IDS_REMOVE_PARTITION_ERROR "Partition konnte nicht entfernt werden" - IDS_READ_PARTITIONS_ERROR "Partitionstabelle konnte nicht gelesen werden" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\nDer Aktualisierungsprozeß für CellServDB wurde vorzeitig beendet. Nicht alle Server konnten aktualisiert werden." - IDS_GET_PARTITION_LIST_ERROR - "Die Partitionen auf diesem Server konnten nicht ermittelt werden" - IDS_EXPORTED "Exportiert" - IDS_CANT_DELETE_EXPORTED_PARTITION - "Exportierte Partitionen können nicht entfernt werden, während der File Service aktiv ist. Sie müssen den File Service vor dem Entfernen dieser Partition stoppen." - IDS_CHECK_CONFIG_INFO "Überprüfung auf gültige Konfigurationsdaten..." - IDS_ERROR_CFG_HOST_CLOSE - "Die Server Configuration Library konnte nicht geschlossen werden." - IDS_FAILED_OPEN_CELL "Die Zelle konnte nicht geöffnet werden." - IDS_FAILED_OPEN_NULL_CELL - "Eine Zelle mit NULL-Kennung konnte nicht geöffnet werden" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Möchten Sie die Root-Volumes erstellen, wenn sie noch nicht vorhanden sind?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Möchten Sie die Root-Volumes nachbilden, wenn sie noch nicht nachgebildet sind?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS Server" - IDS_CANT_INIT_ADMIN_LIBS - "Diese Anwendung kann nicht ausgeführt werden: Initialisierung der Bibliothek ist fehlgeschlagen." - IDS_CANT_OPEN_LOG_FILE "Die Protokolldatei konnte nicht geöffnet werden." - IDS_NEED_CLIENT_INFO "Die Anwendung AFS Configuration kann nicht ausgeführt werden, weil AFS Client auf diesem Computer nicht konfiguriert ist. In dieser Situation kann der AFS Configuration-Assistent verwendet werden. Den AFS Configuration-Assistenten ausführen?" - IDS_NEED_SERVER_INFO "Die Maschine ist nicht als AFS Server konfiguriert. Der AFS Configuration-Assistent muß verwendet werden, um einen AFS Server zum ersten Mal zu konfigurieren. Die Anwendung AFS Configuration kann dann verwendet werden. Den AFS Configuration-Assistenten ausführen, um diesen Computer erstmalig zu konfigurieren?" - IDS_ADVANCED_OPEN "<< &Erweitert" - IDS_ADVANCED_CLOSED "&Erweitert >>" - IDS_BOS_OPEN_FAILED "Verbindung zum Server konnte nicht hergestellt werden (bos open fehlgeschlagen)." - IDS_SALVAGE_ERROR "Die Wiederherstellungsoperation ist fehlgeschlagen." - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "Die angegebene Anzahl der Wiederherstellungsprozesse ist ungültig. Die Anzahl der Wiederherstellungsprozesse muß zwischen 1 und 32 liegen." - IDS_WRONG_CELL "In einem vorhergegangenen Schritt haben Sie einen Server angegeben, von dem die Konfigurationsdaten abgerufen werden sollen. Der angegebene Server gehört nicht zu der Zelle, die Sie verknüpfen möchten!" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "Die Datei CellServDB auf einigen Servern in der Zelle konnte nicht aktualisiert werden. Eine Liste mit Servern, die aktualisiert wurden oder nicht, enthält das Konfigurationsprotokoll in der Datei " - IDS_GET_CREDENTIALS_STEP "Erlangen von Verwaltungs-Token" - IDS_MUST_ENTER_SCS_NAME "Der Name einer System Control-Maschine muß eingegeben werden, bevor die Konfiguration beginnen kann." - IDS_NOT_SAME_CELL "Der AFS Client ist in eine andere Zelle als der AFS Server \nkonfiguriert. Vor dem Konfigurieren des AFS Servers müssen Sie zuerst den AFS Client in die \nZelle des Servers neu konfigurieren." - IDS_LAST_DB_SERVER "Diese Maschine führt den letzten Database Server in der Zelle aus. \nWenn Sie fortsetzen und den Database Service auf dieser Maschine dekonfigurieren, wird die \nZelle nicht mehr existieren, und alle anderen auf dieser Maschine aktiven AFS-Services werden \ndekonfiguriert. Trotzdem fortsetzen?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "Das Kennwort für den AFS-Principal ist ungültig." - IDS_ERROR_CLIENT_VERSION - "Die Version des AFS Clients auf diesem Computer ist mit dem AFS Server nicht kompatibel. Der AFS Server erfordert mindestens Version 3.5 des AFS Clients." - IDS_CANT_MAP_ROOT_AFS "Um die ACLs auf den Root-Volumes einzustellen, muß in AFS ein \nLaufwerkbuchstabe zugeordnet werden. Zur Zeit sind keine Laufwerkbuchstaben verfügbar. Bitte \nmachen Sie einen Laufwerkbuchstaben frei und drücken Sie dann OK." - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "Partitionsname" - IDS_VOLUME_NAME_VALIDATION_TYPE "Datenbereichsname" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE - "Anzahl von Wiederherstellungsprozessen" - IDS_PATH_NAME_VALIDATION_TYPE "Pfadname" - IDS_FILE_NAME_VALIDATION_TYPE "Dateiname" - IDS_GENERIC_VALIDATION_TYPE "Wert" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/en_US/afscfg.rc b/src/WINNT/afssvrcfg/lang/en_US/afscfg.rc deleted file mode 100644 index 7235ebabd..000000000 --- a/src/WINNT/afssvrcfg/lang/en_US/afscfg.rc +++ /dev/null @@ -1,1199 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Configuration" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "AFS® Server Quick-Start Wizard" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Cance&l",IDCANCEL,101,225,50,14 - PUSHBUTTON "< &Back",IDBACK,155,225,50,14 - DEFPUSHBUTTON "&Next >",IDNEXT,209,225,50,14 - PUSHBUTTON "&Help",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "&Yes, create a partition.",IDC_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,94,87,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,116, - 186,52,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,101,172,20,12,ES_AUTOHSCROLL - CONTROL "N&o, do not create a partition.", - IDC_DONT_CREATE_PARTITION,"Button",BS_AUTORADIOBUTTON,0, - 191,102,8 - LTEXT "This File Server will store and deliver files and programs to AFS clients. For data stored on this system to be shared via AFS, at least one NTFS volume must be dedicated as an AFS partition.", - -1,0,12,209,25 - LTEXT "&Select the volume to use for the partition:", - IDC_SELECT_DRIVE,12,106,163,9 - LTEXT "AFS Partition Na&me: /vicep",IDC_NAME_LABEL,12,174,89, - 8 - LTEXT "Create an AFS partition on this File Server.",IDC_TITLE, - 0,0,209,8 - LTEXT "An AFS partition is physically equivalent to a NTFS volume, but it also contains specialized metadata about the structure and location of information on the partition.", - -1,0,40,209,25 - LTEXT "Do you want to create a partition on this File Server?", - IDC_ASK_CREATE_PARTITION,0,75,209,18 - LTEXT "Message set at runtime, if necessary.", - IDC_PARTITION_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Yes, configure as a File Server.", - IDC_SHOULD_CONFIG_FILE_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,114,10 - CONTROL "N&o, do not configure as a File Server.", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,190,133,10 - LTEXT "The AFS File Service delivers requested files and programs from this server to AFS clients. This service also handles all volume administration operations, such as creating, deleting, moving and replicating volumes.", - -1,0,38,210,34 - LTEXT "Configure this machine as a File Server.",IDC_TITLE,0,0, - 209,8 - LTEXT "Do you want to configure this machine as a File Server?", - IDC_CREATE_FS_QUESTION,0,166,210,8 - LTEXT "To configure this machine as a File Server, you must configure the File Service.", - -1,0,14,210,17 - LTEXT "Note: This machine does not currently have a disk drive available to store files in AFS. Although you can configure this machine as a File Server, you will not be able to store AFS data on the machine.", - IDC_NO_DRIVES_NOTE,0,77,210,32,NOT WS_VISIBLE - LTEXT "To create disk drives, use the Windows NT Disk Administrator.", - IDC_DISK_ADMIN_NOTE,0,112,210,16,NOT WS_VISIBLE - LTEXT "This machine is already configured as a File Server.", - IDC_MSG,0,166,209,34,NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Welcome to the AFS Server Quick Start wizard. This wizard will help you quickly configure the AFS Server on this Windows NT system.", - IDC_TITLE,0,0,209,26 - LTEXT "Press Next to begin configuration of the AFS Server.", - IDC_STATIC,0,166,209,8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Yes, replicate the root volumes.",IDC_REPLICATE,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,115,10 - CONTROL "N&o, do not replicate the root volumes.", - IDC_DONT_REPLICATE,"Button",BS_AUTORADIOBUTTON,0,190,134, - 10 - LTEXT "Replication is the process of creating read-only copies of a volume in multiple partitions, usually on other File Servers. Replication increases the availability of a volume in the event of a network or", - IDC_STATIC,0,36,209,25 - LTEXT "Do you want to replicate the root volumes?", - IDC_REPLICATE_QUESTION,0,166,209,8 - LTEXT "Replication also helps to prevent any one server from being overburdened with requests for frequently accessed volumes. ", - IDC_STATIC,0,90,209,25 - LTEXT "Replicate the cell’s root volumes.",IDC_TITLE,0,0,209,8 - LTEXT "If you plan to replicate other volumes in this AFS cell, you must first replicate the root volumes.", - IDC_STATIC,0,15,209,16 - LTEXT "server outage because if one of the servers that houses the volume becomes unavailable, the volume can still be accessed from another server. ", - IDC_STATIC,0,60,209,25 - LTEXT "Message set at runtime, if necessary.", - IDC_CANT_REPLICATE_MSG,0,166,209,34,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Yes, create the root volumes.",IDC_CREATE_ROOT_VOLUMES, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,179,108,10 - CONTROL "N&o, do not create the root volumes.", - IDC_DONT_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON, - 0,190,124,10 - LTEXT "In AFS, volumes are collections of related files that are organized into single, easily managed units to facilitate system administration. ", - IDC_STATIC,0,15,209,17 - LTEXT "Do you want to create the root volumes?", - IDC_ROOT_AFS_QUESTION,0,166,209,8 - LTEXT "Create the cell's root volumes.",IDC_TITLE,0,0,209,8 - LTEXT "Once created, the root volumes are automatically accessible in the AFS filespace.", - IDC_STATIC,0,67,209,17 - LTEXT "Message set at runtime, if necessary.",IDC_ROOT_AFS_MSG, - 0,166,209,33,NOT WS_VISIBLE - LTEXT "The root.afs volume is the root of the AFS filespace. The root.cell volume is the root of this cell's subtree of the AFS filespace, and is accessed via a mount point from root.afs.", - IDC_STATIC,0,31,209,25 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "AFS® Server Configuration" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,38,148,14 - LTEXT "Operation text - set at runtime.",IDC_OPERATION,35,20, - 145,10 - ICON "",IDC_LOGO,7,7,20,20 - PUSHBUTTON "Cancel",IDCANCEL,73,63,50,14 - LTEXT "Determining current configuration:",IDC_OPERATION2,35,7, - 156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Yes, configure as a Backup Server.", - IDC_CONFIG_BACKUP_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,179,128,10 - CONTROL "N&o, do not configure as a Backup Server.", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,0,190,147,10 - LTEXT "The Backup Server can only run on machines configured as Database Servers. Additionally, if the Backup Server is run on one Database Server in the cell, it must run on ALL Database Servers in the cell.", - -1,0,38,199,32 - LTEXT "Do you want to configure this machine as a Backup Server?", - IDC_BACKUP_SERVER_QUESTION,0,166,209,10 - LTEXT "Configure this machine as a Backup Server.",IDC_TITLE,0, - 0,207,8 - LTEXT "The Backup Server is an optional feature of the Database Service.", - -1,0,14,209,16 - LTEXT "This machine is already configured as a Database Server.", - IDC_CANT_BACKUP_MSG,0,166,210,33,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Configure as the System Control &Server.", - IDC_SYS_CONTROL_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,151,141,10 - CONTROL "Configure as a System Control &Client.", - IDC_SYS_CONTROL_CLIENT,"Button",BS_AUTORADIOBUTTON,0,164, - 131,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,90,174,119,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "D&o not configure as a System Control Client or Server.", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,0,190,183, - 9 - LTEXT "The System Control Server provides common configuration files to other AFS Server machines running as System Control Clients. AFS cells must run only a single System Control Server.", - -1,0,14,209,25 - LTEXT "Configure as a System Control Server or Client.", - IDC_TITLE,0,0,209,8 - LTEXT "Do you want to configure this machine as a System Control Server or Client?", - IDC_SYS_CONTROL_MACHINE_QUESTION,0,131,207,17 - LTEXT "A System Control Client receives any available updates to its AFS configuration files from the cell's System Control Server.", - IDC_SYS_CONTROL_CLIENT_DESC,0,43,209,18 - LTEXT "S&ystem Control Server:",IDC_SYS_CONTROL_MACHINE_LABEL, - 15,176,73,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "WARNING: Sites not using the United States distribution of AFS® should not distribute configuration files via the System Control Server. Doing so will result in unencrypted transmission of sensitive system information.", - -1,9,73,183,34 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "That is all the information needed to configure the AFS Server on this system.", - IDC_ALL_NEEDED_MSG,1,14,209,17 - LTEXT "Configure this machine into cell ", - IDC_TITLE,1,0,208,8 - LTEXT "The following configuration steps will be performed:", - IDC_FOLLOWING_STEPS_MSG,1,36,187,8 - LTEXT "Step 1 - Text set at runtime",IDC_STEP1,22,49,179,8,NOT - WS_VISIBLE - LTEXT "Step 3 - Text set at runtime",IDC_STEP3,22,73,179,8,NOT - WS_VISIBLE - LTEXT "Step 2 - Text set at runtime",IDC_STEP2,22,61,179,8,NOT - WS_VISIBLE - LTEXT "Step 4 - Text set at runtime",IDC_STEP4,22,85,179,8,NOT - WS_VISIBLE - LTEXT "Step 5 - Text set at runtime",IDC_STEP5,22,97,179,8,NOT - WS_VISIBLE - LTEXT "Step 6 - Text set at runtime",IDC_STEP6,22,109,179,8, - NOT WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,178,200,11 - LTEXT "Step 8 - Text set at runtime",IDC_STEP8,22,133,179,8, - NOT WS_VISIBLE - LTEXT "Step 7 - Text set at runtime",IDC_STEP7,22,121,179,8, - NOT WS_VISIBLE - LTEXT "Message set at runtime, if necessary.", - IDC_CANT_CONFIG_MSG,1,13,209,17,NOT WS_VISIBLE - LTEXT "Percent Complete:",IDC_PERCENT_COMPLETE_LABEL,1,191,61, - 8,NOT WS_VISIBLE - LTEXT "Current Operation:",IDC_CURRENT_STEP_LABEL,1,157,108,8, - NOT WS_VISIBLE - LTEXT "Current step description - set at runtime", - IDC_CURRENT_STEP,1,167,208,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,63,191,49,8,NOT WS_VISIBLE - LTEXT "To begin configuration of this computer, press the Configure button. To change the configuration steps to be performed, press the Back button.", - IDC_STATUS_MSG,1,159,208,41 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,80,155,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,117,154,11,14 - LTEXT "Administrative Information",IDC_TITLE,0,0,202,8 - LTEXT "&Name:",IDC_ADMIN_NAME_LABEL,7,57,22,8 - LTEXT "&Password:",IDC_ADMIN_PW_LABEL,7,73,34,8 - GROUPBOX "Account Name and Password",IDC_ADMIN_INFO_FRAME,0,41, - 210,65 - LTEXT "&Verify password:",IDC_VERIFY_ADMIN_PW_LABEL,7,90,52,8 - LTEXT "The information below is needed to create the administrative account for this new cell.", - IDC_STATIC,0,15,209,17 - CONTROL "U&se this AFS UID:",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,157,73,10 - CONTROL "&Use the next available AFS UID",IDC_USE_NEXT_UID, - "Button",BS_AUTORADIOBUTTON,6,144,116,10 - GROUPBOX "AFS UID",IDC_STATIC,0,118,209,57 - LTEXT "Enter the user ID for the AFS administrative account:", - IDC_STATIC,6,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Yes, configure as a Database Server.", - IDC_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,142,134,10 - CONTROL "N&o, do not configure as a Database Server.", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 190,153,10 - LTEXT "The Database Service maintains the set of replicated databases required by an AFS cell. This service maintains all account, volume location, and (optionally) backup information for the cell.", - -1,0,38,209,54 - LTEXT "Do you want to configure this machine as a Database Server?", - IDC_DB_SERVER_QUESTION,0,129,209,10 - LTEXT "Configure this machine as a Database Server.",IDC_TITLE, - 0,0,209,8 - LTEXT "To configure this machine as a Database Server, you must configure the Database Service. ", - -1,0,14,209,16 - LTEXT "This machine is already configured as a Database Server.", - IDC_MSG,0,167,210,33,NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,86,174,119,12,ES_AUTOHSCROLL - LTEXT "S&ystem Control Server:",IDC_SYS_CONTROL_MACHINE_LABEL, - 12,176,73,8 - LTEXT "If your cell has a System Control Server, enter its hostname below. AFS configuration files will be updated via this server.", - IDC_SCM_PROMPT,12,154,195,17 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "&Make this host a server in an existing AFS cell", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,0,37, - 160,10 - CONTROL "&This will be the first server in a new AFS cell", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,0,49,153,10 - EDITTEXT IDC_CELL_NAME,64,91,139,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,64,166,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,64,180,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Cell and Server Information",IDC_TITLE,0,0,203,8 - LTEXT "&Cell name:",IDC_CELL_NAME_LABEL,7,93,35,8 - LTEXT "&Password:",IDC_SERVER_PW_LABEL,7,167,34,8,WS_DISABLED - LTEXT "Enter the name of the AFS cell.",IDC_CELL_NAME_PROMPT,8, - 78,195,11 - LTEXT "Enter the password for the AFS principal. All AFS servers get tokens as this principal.", - IDC_SERVER_PW_PROMPT,7,130,196,19,WS_DISABLED - GROUPBOX "Cell Name",IDC_CELL_NAME_FRAME,0,67,210,43 - GROUPBOX "Server Password",IDC_SERVER_PW_FRAME,0,119,210,81, - WS_DISABLED - LTEXT "&Verify password:",IDC_VERIFY_PW_LABEL,7,180,52,8, - WS_DISABLED - LTEXT "An AFS cell is a collection of servers that provide a uniform namespace for file access.", - IDC_CELL_NAME_PROMPT2,1,14,202,17 - LTEXT "Name:",IDC_PRINCIPAL_LABEL,7,152,22,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,150,139,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,53,43,149,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,53,59,149,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,53,132,149,12,ES_AUTOHSCROLL - LTEXT "Administrative Information",IDC_TITLE,0,0,209,8 - LTEXT "Enter the administrative account information below:", - IDC_ADMIN_INFO_PROMPT,7,30,196,10 - LTEXT "&Name:",IDC_ADMIN_NAME_LABEL,7,46,22,8 - LTEXT "&Password:",IDC_ADMIN_PW_LABEL,7,62,34,8 - GROUPBOX "Account Name and Password",IDC_ADMIN_INFO_FRAME,0,17, - 210,62 - GROUPBOX "Existing AFS Server",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS Server:",IDC_HOSTNAME_LABEL,9,134,43,8 - LTEXT "Enter the hostname of some other AFS Server in the cell you wish to join. AFS configuration information will be retrieved from this server.", - IDC_HOSTNAME_PROMPT,7,105,202,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 265 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Services" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_STATIC,7,20,281,40 - GROUPBOX "",IDC_STATIC,7,66,281,43 - GROUPBOX "",IDC_STATIC,7,115,281,40 - GROUPBOX "",IDC_STATIC,7,161,281,40 - CONTROL "File Service",IDC_FS_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,19,60,10 - CONTROL "Database Service",IDC_DB_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,65,82,10 - PUSHBUTTON "Details...",IDC_DB_DETAILS,215,81,50,14,NOT WS_VISIBLE - CONTROL "Backup Server",IDC_BK_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,114,71,10 - CONTROL "System Control Server",IDC_SCS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,160,98,10 - EDITTEXT IDC_SC_MACHINE,107,230,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Select the services to run on this AFS Server:", - IDC_STATIC,7,7,144,8 - LTEXT "The File Service is currently running.", - IDC_FS_STATUS_MSG,14,32,261,8 - LTEXT "The Database Service is currently partially installed.", - IDC_DB_STATUS_MSG,14,78,195,8 - LTEXT "S&ystem Control Server:",IDC_SC_MACHINE_LABEL,31,232,73, - 8,WS_DISABLED - LTEXT "To stop the File Service, uncheck the box above.", - IDC_FS_ACTION_MSG,14,44,262,8 - LTEXT "Click details for more information.",IDC_DB_ACTION_MSG, - 14,92,186,8 - LTEXT "The Backup Server is currently running.", - IDC_BK_STATUS_MSG,14,127,259,8 - LTEXT "To stop the Backup Server, uncheck the box above.", - IDC_BK_ACTION_MSG,14,139,262,8 - LTEXT "To enable this server, you must run either the File Service or the Database Service.", - IDC_SCS_ACTION_MSG,14,185,268,9 - LTEXT "The System Control service is not currently running.", - IDC_SCS_STATUS_MSG,14,172,263,9 - GROUPBOX "",IDC_STATIC,7,207,281,51 - CONTROL "System Control Client",IDC_SCC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,206,95,10 - LTEXT "To enable this server, you must run either the File Service or the Database Service.", - IDC_SCC_ACTION_MSG,14,245,268,9 - LTEXT "The System Control service is not currently running.", - IDC_SCC_STATUS_MSG,14,219,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Partitions" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "The following &AFS partitions exist on your computer:", - IDC_STATIC,8,7,175,8 - PUSHBUTTON "&Create...",IDC_CREATE_PARTITIONS,17,118,53,14 - LTEXT "To salvage a partition or a volume on a partition, select the partition in the list and click the button above. To salvage all partitions on this server, click the button above.", - IDC_SALVAGE_MSG,30,179,250,25 - PUSHBUTTON "&Salvage...",IDC_SALVAGE,17,159,53,14 - LTEXT "To remove a partition, select the partition in the list and click the button above.", - IDC_REMOVE_MSG,30,235,253,8,WS_DISABLED - PUSHBUTTON "Re&move",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "Partitions",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "To create a new partition on this server, click the button above.", - IDC_CREATE_MSG,30,136,254,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Create AFS Partition" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Select a NTFS volume from the list below on which to create the new partition:", - IDC_TITLE,7,5,250,8 - LTEXT "AFS Partition Name:",IDC_NAME_STATIC,17,131,66,8 - EDITTEXT IDC_PARTITION_NAME,112,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Create",IDC_CREATE,96,158,50,14,WS_DISABLED - PUSHBUTTON "Cl&ose",IDC_CLOSE,152,158,50,14 - PUSHBUTTON "Help",9,207,158,50,14 - GROUPBOX "Partition Parameters",IDC_ARGS_FRAME,7,117,250,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,15,250, - 95,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,90,131,22,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 225, 159 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS® Server Configuration" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,59,33,151,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,59,49,151,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,59,110,151,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Configure",IDOK,108,138,50,14,WS_DISABLED - PUSHBUTTON "Cancel",IDCANCEL,48,138,50,14 - PUSHBUTTON "Help",9,168,138,50,14 - LTEXT "Enter the administrative account information below:", - IDC_ADMIN_INFO_PROMPT,14,20,196,10 - LTEXT "&Name:",IDC_ADMIN_NAME_LABEL,15,36,22,8 - LTEXT "&Password:",IDC_ADMIN_PW_LABEL,15,52,34,8 - GROUPBOX "Account Name and Password",IDC_ADMIN_INFO_FRAME,7,7,211, - 62 - GROUPBOX "System Control Server",IDC_HOSTNAME_FRAME,7,76,211,54 - LTEXT "&Hostname:",IDC_HOSTNAME_LABEL,15,112,40,8 - LTEXT "If your cell has a System Control Server, enter its hostname below. AFS configuration files will be updated via this server.", - IDC_HOSTNAME_PROMPT,13,88,197,18 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,150,225,9,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 87 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS® Server Configuration" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Cancel",IDCANCEL,103,66,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,37,200,11 - LTEXT "Percent Complete:",IDC_PERCENT_COMPLETE_LABEL,40,50,61, - 8,NOT WS_VISIBLE - LTEXT "Current Operation:",IDC_CURRENT_STEP_LABEL,40,15,108,8, - NOT WS_VISIBLE - LTEXT "Current step description - set at runtime", - IDC_CURRENT_STEP,40,26,210,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "To begin configuration of this computer, press the Configure button. To change the configuration steps to be performed, press the Back button.", - IDC_STATUS_MSG,40,16,210,41 - PUSHBUTTON "&View Log",IDNEXT,140,66,50,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "CellServCB Update Errors" -FONT 9, "MS Shell Dlg" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,22,162,50,14 - PUSHBUTTON "Cancel",IDCANCEL,75,162,50,14 - PUSHBUTTON "Help",9,130,162,50,14 - LTEXT "The CellServDB file on the following AFS servers could not be automatically updated:", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 243, 188 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Salvage" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,79,99,50,14 - PUSHBUTTON "Cancel",IDCANCEL,133,99,50,14 - PUSHBUTTON "&Help",9,187,99,50,14 - CONTROL "&Salvage all of the partitions on this File Server", - IDC_SERVER,"Button",BS_AUTORADIOBUTTON,14,35,176,10 - CONTROL "Salvage all of the volumes on the selected &partition", - IDC_PARTITION,"Button",BS_AUTORADIOBUTTON,14,48,177,10 - CONTROL "Salvage a specific &volume on the selected partition", - IDC_VOLUME,"Button",BS_AUTORADIOBUTTON,14,61,177,10 - EDITTEXT IDC_VOLUME_NAME,76,74,97,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< &Advanced ",IDC_ADVANCED,7,99,50,14 - GROUPBOX "",IDC_STATIC,7,25,229,67 - LTEXT "Volume &Name:",IDC_VOLUME_NAME_LABEL,27,75,47,8, - WS_DISABLED - GROUPBOX "Advanced Salvage Options",IDC_ADVANCED_FRAME,7,119,229, - 62 - LTEXT "Path for &temporary files:",IDC_TEMP_DIR_LABEL,17,165, - 74,8 - EDITTEXT IDC_LOG_FILE,93,147,133,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,188,130,21,12,ES_AUTOHSCROLL - LTEXT "Filename for results &log:",IDC_LOG_FILE_LABEL,17,149, - 74,8 - EDITTEXT IDC_TEMP_DIR,93,163,133,12,ES_AUTOHSCROLL - CONTROL "Pa&rallel salvage operations; number of processes:", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,132,168,10 - LTEXT "If you salvage the server or an entire partition, the server will be taken off-line temporarily.", - IDC_STATIC,38,7,198,17 - LTEXT "NOTE:",IDC_STATIC,7,7,23,8 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,180,243,8,NOT WS_VISIBLE -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS Principal Password" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_PW,48,39,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,31,61,50,14 - PUSHBUTTON "Cancel",IDCANCEL,85,61,50,14 - PUSHBUTTON "Help",9,140,61,50,14 - LTEXT "The AFS principal key cannot be retrieved from a pre-3.5 Authentication Server. Please enter the AFS principal password below.", - IDC_STATIC,7,7,183,26 - LTEXT "Password:",IDC_STATIC,7,41,35,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Salvage Volumes - Results" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "&Close",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "Help",9,280,266,50,14 - LTEXT "",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 203 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 53 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 218 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 152 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 80 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS® Configuration application and wizard""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "&Next >" - IDS_FINISH "&Finish" - IDS_HELP_TITLE "Help Button Pressed" - IDS_HELP_DESC "Help is not available at this time." - IDS_CANCEL_DESC "Cancel the AFS Quick-Start Wizard?" - IDS_PARTITION_ALREADY_CREATED - "An AFS partition already exists on this machine." - IDS_NOT_A_FS_SERVER "This machine is not configured as a File Server. Volumes can only be created on File Server machines." - IDS_ROOT_AFS_ALREADY_EXISTS "The root volumes already exist." - IDS_NO_PARTITION_EXISTS "No partitions exist on which to create the root volumes. A partition must exist before the root volumes can be created." - IDS_ALREADY_REPLICATED "The root volumes are already replicated." - IDS_ROOT_AFS_DOESNT_EXIST - "The root volumes do not exist. The root volumes must exist before they can be replicated." - IDS_ALREADY_CONFIGURED "This machine is already configured as an AFS Server." - IDS_NOTHING_TO_CONFIGURE "You have not chosen anything to configure." - IDS_EXIT "Exit" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "Starting the File Service" - IDS_CANCEL_CONFIG_MSG "Canceling at this point will leave your computer partially configured as an AFS server. Cancel anyway?" - IDS_WIZARD_APP_TITLE "AFS® Server Quick Start Wizard" - IDS_CANCEL_PENDING "*** Cancel pending - one moment please... ***" - IDS_CHECK_FS_CONFIG "File server check..." - IDS_CHECK_DB_CONFIG "Database server check..." - IDS_CHECK_BAK_CONFIG "Backup server check..." - IDS_CHECK_PARTITION "AFS partition check..." - IDS_CHECK_ROOT_AFS "Root volumes check..." - IDS_CHECK_REP "Root volumes replication check..." - IDS_CANCEL_GET_CONFIG "Canceling...One moment please..." - IDS_ALREADY_A_BACKUP_SERVER - "This machine is already configured as a Backup Server." - IDS_NOT_A_DB_SERVER "This machine is not configured as a Database Server. The Backup Server can only be run on Database Server machines." - IDS_ALREADY_A_SYS_CONTROL_SERVER - "This machine is already configured as a System Control Server." - IDS_ALREADY_A_SYS_CONTROL_CLIENT - "This machine is already configured as a System Control Client." - IDS_SC_NOT_A_DB_OR_FS_SERVER - "This machine is not configured as a Database or File Server. A computer can only be configured as a System Control machine if it is also configured as a Database or File Server machine." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "Volume" - IDS_NAME_OR_ERROR "Name (or Error Message)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "This machine is not configured as a Database or File Server. A computer can only be configured as a Binary Distribution machine if it is also configured as a Database or File Server machine." - IDS_CHECK_SCS "System Control Server check..." - IDS_CHECK_SCC "System Control Client check..." - IDS_SIZE "Size" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "The File Service will be configured by default since this is the first AFS Server in the cell." - IDS_MUST_CONFIG_DB "The Database Service will be configured by default since this is the first AFS Server in the cell." - IDS_MUST_MAKE_PARTITION "A partition must be created since this is the first AFS Server in the cell." - IDS_MUST_CREATE_ROOT_AFS - "The root.afs and root.cell volumes will be created by default since this is the first AFS Server in the cell." - IDS_MUST_REPLICATE "The root.afs and root.cell volumes will be replicated by default since this is the first AFS Server in the cell." - IDS_CHECK_AFS_CLIENT "AFS Client installation check..." - IDS_ERROR_HOST_NAME "Failed to determine this machine's host name." - IDS_ERROR_DRIVE_COMPRESSED "Drive is compressed" - IDS_ERROR_CFG_HOST_OPEN "Failed to initialize the Server Configuration Library." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "Stopping the AFS Client" - IDS_ERROR_LOCAL_HOST_NAME - "Failed to determine this machine's local host name." - IDS_GET_TOKENS_ERROR "Failed to get tokens. Verify that the username and password that you entered are correct." - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "Salvage cannot be performed because the file service has not been started. Please start file service and then retry the salvage." - IDS_SALVAGING "Salvage in progress. Please wait..." - IDS_CURRENT_SALVAGE_LOG "Current contents of the salvage log:" - IDS_FINAL_SALVAGE_LOG "Final contents of the salvage log:" - IDS_SALVAGE_COMPLETE "The salvage has completed." - IDS_CANT_GET_SALVAGE_LOG "Unable to retrieve the salvage log." - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK - "Unable to save the salvage log to disk." - IDS_VALIDATION_ERROR_TEMPLATE - "The specified %1 is invalid. Please re-enter the %2." - IDS_CELL_NAME_VALIDATION_TYPE "cell name" - IDS_SERVER_NAME_VALIDATION_TYPE "server name" - IDS_PASSWORD_VALIDATION_TYPE "password" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "user name" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "The AFS Client is not installed. The AFS Client must be installed before the AFS Server can be configured." - IDS_ERROR_AFS_CLIENT_CHECK - "Failed to determine if the AFS Client is installed." - IDS_ERROR_FS_IS_NOT_NTFS "Filesystem is not NTFS" - IDS_ERROR_DRIVE_HAS_DATA "Drive contains data" - IDS_PARTITION_STEP_DESC "Create the AFS partition" - IDS_ERROR_DRIVE_CONTAINS_NT "Drive contains NT installation" - IDS_DB_STEP_DESC "Start the Database Service" - IDS_FS_STEP_DESC "Start the File Service" - IDS_SCC_STEP_DESC "Start the System Control Client" - IDS_SCS_STEP_DESC "Start the System Control Server" - IDS_ROOT_AFS_STEP_DESC "Create the root volumes" - IDS_REP_STEP_DESC "Replicate the root volumes" - IDS_PARTITIONS_PAGE_TITLE "Partitions" - IDS_CONFIGURE "&Configure" - IDS_DB_AND_BK_STEP_DESC "Start the Database Service (includes Backup Server)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "Creating the AFS partition" - IDS_CONFIG_COMMON_FUNCS "Configuring functions common to all services" - IDS_START_DB_STEP "Starting Database Service" - IDS_START_SCC_STEP "Starting the System Control Service as a System Control Client" - IDS_START_SCS_STEP "Starting the System Control Service as a System Control Server" - IDS_CREATE_ROOT_AFS_STEP "Creating the root.afs volume" - IDS_REP_STEP "Replicating the root volumes" - IDS_START_AUTH_STEP "Getting tokens for this server" - IDS_SERVICES_PAGE_TITLE "Services" - IDS_CONFIG_SUCCEEDED "Configuration has succeeded." - IDS_CONFIG_CANCELED "Configuration was canceled." - IDS_CONFIG_FAILED "Configuration has failed.\r\n\r\nA detailed log file, %1, has been created at the location %2." - IDS_ERROR_NO_LICENSE_NUM "An AFS license number was not found." - IDS_VERIFY_CLIENT_INSTALL_STEP "Verifying installation of the AFS Client" - IDS_SET_SERVER_LICENSE_STEP "Setting the license for this server" - IDS_DEFINE_CELL_NAME_STEP "Defining the name for this cell" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP "Making this server a member of the cell" - IDS_START_BOS_SERVER_STEP "Starting the BOS server" - IDS_START_AUTH_SERVER_STEP "Starting the authentication server" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP - "Creating a principal and key for this server" - IDS_START_DB_AND_BK_STEP - "Starting the Database Service (including Backup Server)" - IDS_CREATE_ADMIN_PRINCIPAL_STEP "Creating cell admin principal" - IDS_START_CLIENT_STEP "Starting the AFS Client" - IDS_SET_ROOT_ACL_STEP "Setting the ACL on the root.afs volume" - IDS_CREATE_ROOT_CELL_STEP "Creating the root.cell volume" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP - "Mounting the root.cell volume using a standard mount point" - IDS_SET_ROOT_CELL_ACL_STEP "Setting the ACL on the root.cell volume" - IDS_MOUNT_ROOT_CELL_RW_STEP - "Mounting the root.cell volume using a read/write mount point" - IDS_ENABLE_AUTH_CHECKING_STEP "Enabling authentication checking" - IDS_OBTAIN_ADMIN_CREDS_STEP "Obtaining administrative tokens" - IDS_RESTART_SERVERS_STEP - "Restarting all the servers on this machine as authticated servers" - IDS_ALREADY_A_FS_SERVER "This machine is already configured as a File Server." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "This machine is already configured as a Database Server." - IDS_INTRO_PAGE "Introduction" - IDS_INFO_PAGE "Cell and Server Information" - IDS_FS_PAGE "File Service" - IDS_DB_PAGE "Database Service" - IDS_CFG_TOOL_APP_TITLE "AFS® Server Configuration" - IDS_BK_PAGE "Backup Server" - IDS_ROOT_AFS_PAGE "Root AFS Volumes" - IDS_NAME "Name" - IDS_REP_PAGE "Replication" - IDS_SC_PAGE "System Control Service" - IDS_CONFIG_PAGE "Configure the System" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "AFS Partition" - IDS_GRAPHIC_FONT "Times New Roman, 12, B" - IDS_CURRENT_STEP "Current Step:" - IDS_ADD_TO_CELLSERVDB_STEP "Adding this server to CellServDB" - IDS_RESTART_ALL_DB_SERVERS_STEP - "Restarting all database servers in the cell" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "Configuration has succeeded. NOTE: The CellServDB file of all AFS clients in your cell must be updated. Be sure to provide AFS Product Support with an up-to-date list of your Database Servers if you are making your cell available to other sites." - IDS_SYS_CONTROL_SERVER_ONLY_MSG - "Do you want to configure this machine as the System Control Server?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG - "D&o not configure as the System Control Server." - IDS_CLIENT_CELL_WILL_CHANGE - "Configuration of the AFS Server requires that the AFS Client be configured into the same cell as the Server. This will be done automatically." - IDS_INFO_PAGE2 "Administrative Information" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "Configuration has succeeded.\r\n\r\nNOTE: Be sure to provide AFS Product Support with a list of your Database Servers if you are making your cell available to other sites." - IDS_CONFIG_SCS "Configure as the cell's System Control Server." - IDS_CONFIG_INTO_CELL_MSG "Configure this host into cell " - IDS_VIEW_LOG "&View Log" - IDS_VIEW_LOG_ERROR "Cannot view the log file" - IDS_ERROR_NO_LOG_FILE "The log file does not exist." - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED "Updated CellServDB on host " - IDS_UPDATING_CELLSERVDB_HOST_FAILED "Failed to update CellServDB on host " - IDS_CELL_NAME_LEN_ERROR "The cellname you entered is too long. Cellnames can be no longer than 64 characters." - IDS_CONFIG_CHECK_FAILED "Failed to determine the current configuration of this machine." - IDS_YES "Yes" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "No" - IDS_FREE "Free Space" - IDS_TOTAL "Total Size" - IDS_DRIVE2 "Drive" - IDS_SERVICE_STATUS "Status" - IDS_SERVICE "Service" - IDS_FS_RUNNING "The File Service is currently running." - IDS_FS_STOPPED "The File Service is currently not running." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "The Database Service is currently running." - IDS_DB_STOPPED "The Database Service is currently not running." - IDS_BK_RUNNING "The Backup Service is currently running." - IDS_BK_STOPPED "The Backup Service is currently not running." - IDS_SCS_STOPPED "The System Control Server is currently not running." - IDS_SCC_STOPPED "The System Contol Client is currently not running." - IDS_FS_HOW_TO_RUN "To start the File Service, check the box above." - IDS_FS_HOW_TO_STOP "To stop the File Service, uncheck the box above." - IDS_DB_HOW_TO_RUN "To start the Database Service, check the box above." - IDS_DB_HOW_TO_STOP "To stop the Database Service, uncheck the box above." - IDS_BK_HOW_TO_RUN "To start the Backup Service, check the box above." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "To stop the Backup Service, uncheck the box above." - IDS_SCS_HOW_TO_RUN "To start the System Control Server, check the box above." - IDS_SCS_HOW_TO_STOP "To stop the System Control Server, uncheck the box above." - IDS_DB_PARTIAL_CONFIG "The Database Service is partially configured." - IDS_DB_DETAILS "Press the Details button for more information." - IDS_BK_DISABLED "The Backup Service is disabled." - IDS_BK_ENABLE "To enable the Backup Service, you must run the Database Service." - IDS_SC_DISABLED "This server is disabled." - IDS_SC_ENABLE "To enable this server, you must run either the File Service or the Database Service." - IDS_FS_WILL_RUN "The File Service will be started." - IDS_FS_WILL_STOP "The File Service will be stopped." - IDS_DB_WILL_RUN "The Database Service will be started." - IDS_DB_WILL_STOP "The Database Service will be stopped." - IDS_BK_WILL_RUN "The Backup Service will be started." - IDS_BK_WILL_STOP "The Backup Service will be stopped." - IDS_SCS_WILL_RUN "The System Control Server will be started." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "The System Control Server will be stopped." - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "Drive is already an AFS partition" - IDS_VOLUME_HAS_NO_NAME "" - IDS_PARTITION_CREATED "A new AFS Partition was successfully created." - IDS_PARTITION_EXISTS "The partition name you have entered is already in use by another partition." - IDS_SCS_RUNNING "The System Control Server is currently running." - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN - "This drive contains only the Recycle Bin." - IDS_SCC_WILL_RUN "The System Control Client will be started." - IDS_SCC_WILL_STOP "The System Control Client will be stopped." - IDS_SCC_RUNNING "The System Control Client is currently running." - IDS_SCC_HOW_TO_RUN "To start the System Control Client, check the box above." - IDS_SCC_HOW_TO_STOP "To stop the System Control Client, uncheck the box above." - IDS_SCS_ENABLE "To enable this server, you must stop running the System Control Client." - IDS_SCC_ENABLE "To enable this server, you must stop running the System Control Server." - IDS_UNCONFIG_DB_STEP "Unconfiguring the Database Service" - IDS_UNCONFIG_DB_STEP_DESC "Unconfigure the Database Service" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP - "Unconfiguring the Database Service (and Backup Server)" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC - "Unconfigure the Database Service (and Backup Server)" - IDS_UNCONFIG_BK_STEP "Unconfiguring the Backup Server" - IDS_UNCONFIG_BK_STEP_DESC "Unconfigure the Backup Server" - IDS_UNCONFIG_FS_STEP "Unconfiguring the File Service" - IDS_UNCONFIG_FS_STEP_DESC "Unconfigure the File Service" - IDS_UNCONFIG_SCS_STEP "Unconfiguring the System Control Server" - IDS_UNCONFIG_SCS_STEP_DESC "Unconfigure the System Control Server" - IDS_UNCONFIG_SCC_STEP "Unconfiguring the System Control Client" - IDS_UNCONFIG_SCC_STEP_DESC "Unconfigure the System Control Client" - IDS_INVALIDATE_CONFIG_INFO_STEP - "Invalidating this machine's configuration information" - IDS_CLOSE "&Close" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "The CellServDB file could not be updated on the AFS servers below. This is a non-fatal error.\r\n" - IDS_DELETE_PARTITION_PROMPT "Really delete partition '%1'?" - IDS_INVALIDATE_CFG_INFO "There are now no AFS server processes running on this computer. Do you wish to remove the configuration information from this machine?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "The cell no longer exists. The AFS Configuration application can only be used to configure server machines already configured into an AFS cell. The AFS Configuration Wizard can be used to start a new cell." - IDS_CFG_MAN_CANT_CONTINUE - "The AFS Configuration application must now terminate. It can only run on machines already configured as AFS servers. To again configure this machine as an AFS server, run the AFS Configuration Wizard." - IDS_CONFIG_INFO_INVALIDATED - "This machine is no longer configured as an AFS Server. The AFS Configuration application can only be used to configure AFS Server machines. The AFS Configuration Wizard may be used to reconfigure this machine as an AFS Server." - IDS_GET_TOKENS_FAILED "Failed to get tokens for the specified cell." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "Starting the Backup server" - IDS_BK_STEP_DESC "Start the Backup server" - IDS_CONFIG_ERROR "A configuration error has occurred" - IDS_CREATE_PARTITION_ERROR "Unable to create partition" - IDS_REMOVE_PARTITION_ERROR "Unable to remove partition" - IDS_READ_PARTITIONS_ERROR "Unable to read the partition table" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\nThe CellServDB update process was prematurely terminated. Not all servers may have been updated." - IDS_GET_PARTITION_LIST_ERROR - "Unable to determine the partition's on this server" - IDS_EXPORTED "Exported" - IDS_CANT_DELETE_EXPORTED_PARTITION - "Exported partitions cannot be removed while the File Service is running. You must stop the File Service before removing this partition." - IDS_CHECK_CONFIG_INFO "Checking for valid configuration information..." - IDS_ERROR_CFG_HOST_CLOSE - "Failed to close the Server Configuration Library" - IDS_FAILED_OPEN_CELL "Failed to open the cell." - IDS_FAILED_OPEN_NULL_CELL "Failed to open a NULL cell handle" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "If the root volumes do not exist, would you like to create them?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "If the root volumes are not replicated, would you to replicate them?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS Server" - IDS_CANT_INIT_ADMIN_LIBS - "Cannot execute this application: library initialization has failed." - IDS_CANT_OPEN_LOG_FILE "The log file could not be opened." - IDS_NEED_CLIENT_INFO "The AFS Configuration application cannot run because the AFS Client is not configured on this computer. The AFS Configuration Wizard can be used in this situation. Run the AFS Configuration Wizard?" - IDS_NEED_SERVER_INFO "This computer is not configured as an AFS Server. The AFS Configuration Wizard must be used to initially configure an AFS Server. The AFS Configuration application can then be used. Run the AFS Configuration Wizard to initially configure this computer?" - IDS_ADVANCED_OPEN "<< &Advanced" - IDS_ADVANCED_CLOSED "&Advanced >>" - IDS_BOS_OPEN_FAILED "Unable to connect to server (bos open failed)." - IDS_SALVAGE_ERROR "The salvage operation has failed." - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "The specified number of salvage processes is invalid. The number of salvage processes must be between 1 and 32." - IDS_WRONG_CELL "In a previous step you specified a server from which configuration information should be retrieved. The server specified does not belong to the cell you wish to join!" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "The CellServDB file on some servers in the cell could not be updated. For a list of which servers were updated and which were not, view the configuration log stored in the file " - IDS_GET_CREDENTIALS_STEP "Getting administrative tokens" - IDS_MUST_ENTER_SCS_NAME "A System Control Machine name must be entered before configuration can begin." - IDS_NOT_SAME_CELL "The AFS Client is configured into a different cell than the AFS Server. Before configuring the AFS Server, you must first reconfigure the AFS Client into the Server's cell." - IDS_LAST_DB_SERVER "This machine is running the last database server in the cell. If you proceed and unconfigure the database service on this machine, the cell will no longer exist, and any other AFS services running on this machine will be unconfigured. Continue anyway?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "The password for the AFS principal is invalid." - IDS_ERROR_CLIENT_VERSION - "The version of the AFS Client on this computer is not compatible with the AFS Server. The AFS Server requires at least version 3.5 of the AFS Client." - IDS_CANT_MAP_ROOT_AFS "In order to set the ACLs on the root volumes, a drive letter must be mapped into AFS. No drive letters are currently available. Please free a drive letter and then press OK." - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "partition name" - IDS_VOLUME_NAME_VALIDATION_TYPE "volume name" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "number of salvage processes" - IDS_PATH_NAME_VALIDATION_TYPE "path name" - IDS_FILE_NAME_VALIDATION_TYPE "file name" - IDS_GENERIC_VALIDATION_TYPE "value" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/es_ES/afscfg.rc b/src/WINNT/afssvrcfg/lang/es_ES/afscfg.rc deleted file mode 100644 index 85bad6684..000000000 --- a/src/WINNT/afssvrcfg/lang/es_ES/afscfg.rc +++ /dev/null @@ -1,1237 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS® Configuration application and wizard" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "Asistente de inicio rápido de AFS® Server" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Cance&lar",IDCANCEL,101,225,50,14 - PUSHBUTTON "< &Anterior",IDBACK,155,225,50,14 - DEFPUSHBUTTON "&Siguiente >",IDNEXT,209,225,50,14 - PUSHBUTTON "A&yuda",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Sí, &crear una partición.",IDC_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,91,191,8 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,114, - 186,52,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,132,175,20,12,ES_AUTOHSCROLL - CONTROL "N&o, no crear una partición.",IDC_DONT_CREATE_PARTITION, - "Button",BS_AUTORADIOBUTTON,0,191,102,8 - LTEXT "Este Servidor de archivos almacenará y entregará archivos y programas a clientes de AFS. Para los datos almacenados en este sistema que han de compartirse por medio de AFS, debe dedicarse como mínimo un volumen NTFS como partición de AFS. ", - -1,0,12,209,35 - LTEXT "&Seleccione el volumen a utilizar para la partición:", - IDC_SELECT_DRIVE,12,103,184,9 - LTEXT "No&mbre de partición de AFS: /vicep",IDC_NAME_LABEL,12, - 176,116,8 - LTEXT "Crear partición AFS en el Servidor de archivos", - IDC_TITLE,0,0,209,8 - LTEXT "Una partición de AFS es físicamente equivalente a un volumen NTFS, pero contiene asimismo metadatos especializados acerca de la estructura y ubicación de información en la partición.", - -1,0,50,209,25 - LTEXT "¿Desea crear una partición en este Servidor de archivos?", - IDC_ASK_CREATE_PARTITION,1,78,209,13 - LTEXT "Mensaje definido al ejecutar, si es necesario.", - IDC_PARTITION_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sí, configurar como Servidor de archivos.", - IDC_SHOULD_CONFIG_FILE_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,198,10 - CONTROL "N&o, no configurar como Servidor de archivos.", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,190,201,10 - LTEXT "El Servicio de archivos de AFS proporciona los archivos y programas solicitados desde este servidor a los clientes de AFS. Este servicio maneja también las operaciones de administración de volúmenes, como la creación, supresión, traslado y duplicación.", - -1,0,38,210,35 - LTEXT "Configurar esta máquina como Servidor de archivos.", - IDC_TITLE,0,0,209,8 - LTEXT "¿Desea configurar esta máquina como Servidor de archivos?", - IDC_CREATE_FS_QUESTION,0,166,210,8 - LTEXT "Para configurar esta máquina como Servidor de archivos, debe configurar el Servicio de archivos.", - -1,0,14,210,17 - LTEXT "Nota: Esta máquina no tiene en la actualidad una unidad de disco disponible para almacenar archivos en AFS. Si bien puede configurar esta máquina como Servidor de archivos, no podrá almacenar datos de AFS en la máquina. ", - IDC_NO_DRIVES_NOTE,0,77,210,32,NOT WS_VISIBLE - LTEXT "Para crear unidades de disco, utilice el Administrador de disco de Windows NT.", - IDC_DISK_ADMIN_NOTE,0,117,210,16,NOT WS_VISIBLE - LTEXT "Esta máquina ya está configurada como Servidor de archivos.", - IDC_MSG,0,166,209,34,NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Bienvenido al Asistente de inicio rápido de AFS Server. Este asistente le ayudará a configurar con rapidez el AFS Server en este sistema Windows NT.", - IDC_TITLE,0,0,209,26 - LTEXT "Pulse Siguiente para comenzar la configuración de AFS Server.", - IDC_STATIC,0,166,209,8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sí, duplicar los volúmenes de raíz.",IDC_REPLICATE, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,179,196,10 - CONTROL "N&o, no duplicar los volúmenes de raíz.", - IDC_DONT_REPLICATE,"Button",BS_AUTORADIOBUTTON,0,190,197, - 10 - LTEXT "La duplicación es el proceso de crear copias de sólo lectura de un volumen en múltiples particiones, normalmente en otros Servidores de archivos. La duplicación aumenta la disponibilidad de un volumen en la eventualidad de una interrupción de la red o ", - IDC_STATIC,0,36,209,32 - LTEXT "¿Desea duplicar los volúmenes de raíz?", - IDC_REPLICATE_QUESTION,0,166,209,8 - LTEXT "La duplicación también ayuda a evitar que se sobrecargue un servidor con peticiones de volúmenes a los que se accede con frecuencia. ", - IDC_STATIC,0,98,209,25 - LTEXT "Duplicar los volúmenes de raíz de la célula.",IDC_TITLE, - 0,0,209,8 - LTEXT "Si piensa duplicar otros volúmenes de esta célula de AFS, en primer lugar debe duplicar los volúmenes de raíz. ", - IDC_STATIC,0,15,209,16 - LTEXT "interrupción del servidor porque, cuando no puede disponerse de uno de los servidores que aloja el volumen, sigue siendo posible acceder al volumen desde otro servidor. ", - IDC_STATIC,0,69,209,25 - LTEXT "Mensaje definido al ejecutar, si es necesario.", - IDC_CANT_REPLICATE_MSG,0,166,209,34,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sí, crear los volúmenes de raíz.", - IDC_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,179,197,10 - CONTROL "N&o, no crear los volúmenes de raíz.", - IDC_DONT_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON, - 0,190,194,10 - LTEXT "En AFS, los volúmenes son conjuntos de archivos relacionados que están organizados en unidades sencillas, fácilmente gestionables para facilitar la administración del sistema. ", - IDC_STATIC,0,15,209,28 - LTEXT "¿Desea crear los volúmenes de raíz?", - IDC_ROOT_AFS_QUESTION,0,166,209,8 - LTEXT "Crear los volúmenes de raíz de la célula. ",IDC_TITLE,0, - 0,209,8 - LTEXT "Una vez creados, puede accederse automáticamente a los volúmenes de raíz en el espacio de archivos de AFS.", - IDC_STATIC,0,80,209,17 - LTEXT "Mensaje definido al ejecutar, si es necesario.", - IDC_ROOT_AFS_MSG,0,166,209,33,NOT WS_VISIBLE - LTEXT "El volumen root.afs es la raíz del espacio de archivos de AFS. El volumen root.cell es la raíz de este subárbol de célula del espacio de archivos de AFS y se accede al mismo por medio de un punto de montaje desde root.afs.", - IDC_STATIC,0,43,209,34 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 90 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Configuración de AFS® Server" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,40,148,14 - LTEXT "Texto de operación - definido al ejecutar.", - IDC_OPERATION,35,20,145,16 - ICON "",IDC_LOGO,7,7,21,20 - PUSHBUTTON "Cancelar",IDCANCEL,73,69,50,14 - LTEXT "Determinación de la configuración actual:", - IDC_OPERATION2,35,7,156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 201 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sí, configurar como Servidor de copia de seguridad.", - IDC_CONFIG_BACKUP_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,170,206,10 - CONTROL "&No, no configurar como Servidor de copia de seguridad.", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,0,181,205,10 - LTEXT "El Servidor de copia de seguridad sólo puede ejecutarse en máquinas configuradas como Servidores de base de datos. Además, si se ejecuta en un Servidor de base de datos de célula, debe ejecutar TODOS los Servidores de este tipo.", - -1,0,38,199,32 - LTEXT "¿Desea configurar esta máquina como Servidor de copia de seguridad?", - IDC_BACKUP_SERVER_QUESTION,0,150,209,19 - LTEXT "Configurar como Servidor de copia de seguridad.", - IDC_TITLE,0,0,207,8 - LTEXT "El Servidor de copia de seguridad es una característica opcional del Servicio de base de datos.", - -1,0,14,209,16 - LTEXT "Esta máquina ya está configurada como Servidor de base de datos.", - IDC_CANT_BACKUP_MSG,0,149,210,33,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 220 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Configurar como &Servidor de control del sistema.", - IDC_SYS_CONTROL_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,142,205,10 - CONTROL "Configurar como &Cliente de control del sistema.", - IDC_SYS_CONTROL_CLIENT,"Button",BS_AUTORADIOBUTTON,0,154, - 203,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,82,172,119,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "N&o configurar como Servidor o Cliente de control del sistema.", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,0,188,205, - 9 - LTEXT "El Servidor de control del sistema facilita archivos de configuración habituales a otras máquinas de AFS Server que se ejecutan como Clientes de control del sistema. Las células de AFS deben ejecutar un único Servidor de control del sistema. ", - -1,0,14,209,34 - LTEXT "Configurar como Servidor/Cliente control sistema", - IDC_TITLE,0,0,209,8 - LTEXT "¿Desea configurar esta máquina como Cliente o Servidor de control del sistema?", - IDC_SYS_CONTROL_MACHINE_QUESTION,0,123,207,17 - LTEXT "Un Cliente de control del sistema recibe las actualizaciones disponibles para sus archivos de configuración de AFS desde el Servidor de control del sistema de la célula.", - IDC_SYS_CONTROL_CLIENT_DESC,0,50,209,29 - LTEXT "S&ervidor de control del sistema:", - IDC_SYS_CONTROL_MACHINE_LABEL,10,168,65,18,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,0,185,210,34,NOT WS_VISIBLE - LTEXT "AVISO: Las ubicaciones que no utilicen la distribución de AFS® de EE.UU. no deben distribuir archivos de configuración por medio del Servidor de control del sistema. Esto causará la transmisión no cifrada de información confidencial.", - -1,8,78,183,46 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 231 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Esa es toda la información necesaria para configurar el AFS Server en este sistema.", - IDC_ALL_NEEDED_MSG,1,14,209,17 - LTEXT "Configurar esta máquina en la célula ", - IDC_TITLE,1,0,208,8 - LTEXT "Se efectuarán los siguientes pasos de configuración:", - IDC_FOLLOWING_STEPS_MSG,1,36,187,8 - LTEXT "Paso 1 - Texto definido al ejecutar",IDC_STEP1,22,49, - 179,8,NOT WS_VISIBLE - LTEXT "Paso 3 - Texto definido al ejecutar",IDC_STEP3,22,73, - 179,8,NOT WS_VISIBLE - LTEXT "Paso 2 - Texto definido al ejecutar",IDC_STEP2,22,61, - 179,8,NOT WS_VISIBLE - LTEXT "Paso 4 - Texto definido al ejecutar",IDC_STEP4,22,85, - 179,8,NOT WS_VISIBLE - LTEXT "Paso 5 - Texto definido al ejecutar",IDC_STEP5,22,97, - 179,8,NOT WS_VISIBLE - LTEXT "Paso 6 - Texto definido al ejecutar",IDC_STEP6,22,109, - 179,8,NOT WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,203,200,11 - LTEXT "Paso 8 - Texto definido al ejecutar",IDC_STEP8,22,133, - 179,8,NOT WS_VISIBLE - LTEXT "Paso 7 - Texto definido al ejecutar",IDC_STEP7,22,121, - 179,8,NOT WS_VISIBLE - LTEXT "Mensaje definido al ejecutar, si es necesario.", - IDC_CANT_CONFIG_MSG,1,13,209,17,NOT WS_VISIBLE - LTEXT "% completado:",IDC_PERCENT_COMPLETE_LABEL,1,218,48,8, - NOT WS_VISIBLE - LTEXT "Operación actual:",IDC_CURRENT_STEP_LABEL,1,157,108,8, - NOT WS_VISIBLE - LTEXT "Descripción del paso actual - definido al ejecutar", - IDC_CURRENT_STEP,1,167,208,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,63,191,49,8,NOT WS_VISIBLE - LTEXT "Para comenzar la configuración de este sistema, pulse el botón Configurar. Para cambiar los pasos de configuración a efectuar, pulse el botón Anterior.", - IDC_STATUS_MSG,1,167,208,31 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 215, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,106,155,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,145,154,11,14 - LTEXT "Información administrativa",IDC_TITLE,4,0,202,8 - LTEXT "&Nombre:",IDC_ADMIN_NAME_LABEL,11,57,40,8 - LTEXT "&Contraseña:",IDC_ADMIN_PW_LABEL,11,73,46,8 - GROUPBOX "Nombre de cuenta y contraseña",IDC_ADMIN_INFO_FRAME,6, - 41,202,65 - LTEXT "&Verificar:",IDC_VERIFY_ADMIN_PW_LABEL,11,90,52,8 - LTEXT "La información que hay a continuación es necesaria para crear la cuenta administrativa para esta nueva célula.", - IDC_STATIC,4,15,209,17 - CONTROL "U&tilizar este UID de AFS:",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,11,157,95,10 - CONTROL "&Utilizar el siguiente UID de AFS disponible", - IDC_USE_NEXT_UID,"Button",BS_AUTORADIOBUTTON,11,144,189, - 10 - GROUPBOX "UID de AFS",IDC_STATIC,6,118,202,57 - LTEXT "Entre el ID de usuario para la cuenta administrativa de AFS:", - IDC_STATIC,11,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 244 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sí, configurar como Servidor de base de datos.", - IDC_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,118,202,10 - CONTROL "N&o, no configurar como Servidor de base de datos.", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 197,202,10 - LTEXT "El Servicio de base de datos mantiene el grupo de bases de datos duplicadas que necesita una célula de AFS. Este servicio mantiene toda la información de cuenta, ubicación de volumen y (opcionalmente) de copia de seguridad para la célula. ", - -1,0,38,209,54 - LTEXT "¿Desea configurar esta máquina como Servidor de bases de datos?", - IDC_DB_SERVER_QUESTION,0,98,209,17 - LTEXT "Configurar como Servidor de base de datos.",IDC_TITLE,0, - 0,209,8 - LTEXT "Para configurar esta máquina como Servidor de base de datos, debe configurar el Servicio de base de datos.", - -1,0,14,209,16 - LTEXT "Esta máquina ya está configurada como Servidor de base de datos.", - IDC_MSG,0,179,210,33,NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,80,165,119,12,ES_AUTOHSCROLL - LTEXT "S&ervidor de control del sistema:", - IDC_SYS_CONTROL_MACHINE_LABEL,12,162,65,20 - LTEXT "Si la célula tiene un Servidor de control del sistema, entre su nombre de sistema principal a continuación. Los archivos de configuración de AFS se actualizarán por medio de este servidor. ", - IDC_SCM_PROMPT,12,130,194,32 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 274, 202 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Hacer que este sistema principal sea un servidor en una célula de AFS existente", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,2,38, - 264,10 - CONTROL "&Este será el primer servidor de una célula de AFS nueva", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,2,53,261,10 - EDITTEXT IDC_CELL_NAME,57,94,193,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,59,166,192,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,59,180,192,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Información de célula y servidor",IDC_TITLE,2,0,261,8 - LTEXT "Nombre de &célula:",IDC_CELL_NAME_LABEL,18,90,38,16 - LTEXT "C&ontraseña:",IDC_SERVER_PW_LABEL,19,167,40,8, - WS_DISABLED - LTEXT "Entre el nombre de la célula de AFS.", - IDC_CELL_NAME_PROMPT,20,80,199,11 - LTEXT "Entre la contraseña del principal de AFS. Todos los servidores de AFS obtienen señales como este principal.", - IDC_SERVER_PW_PROMPT,17,130,239,19,WS_DISABLED - GROUPBOX "Nombre de célula",IDC_CELL_NAME_FRAME,14,69,246,43 - GROUPBOX "Contraseña de servidor",IDC_SERVER_PW_FRAME,15,117,245, - 81,WS_DISABLED - LTEXT "&Verificar:",IDC_VERIFY_PW_LABEL,21,180,32,8, - WS_DISABLED - LTEXT "Una célula de AFS es un conjunto de servidores que proporcionan un espacio de nombres uniforme para el acceso al archivo.", - IDC_CELL_NAME_PROMPT2,11,13,228,25 - LTEXT "Nombre:",IDC_PRINCIPAL_LABEL,19,152,33,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,59,148,192,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 217, 201 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,53,55,149,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,53,72,149,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,53,132,149,12,ES_AUTOHSCROLL - LTEXT "Información administrativa",IDC_TITLE,4,0,202,8 - LTEXT "Entre la información de cuenta administrativa que hay a continuación:", - IDC_ADMIN_INFO_PROMPT,12,30,170,18 - LTEXT "&Nombre:",IDC_ADMIN_NAME_LABEL,12,58,33,8 - LTEXT "&Contraseña:",IDC_ADMIN_PW_LABEL,11,74,39,8 - GROUPBOX "Nombre de cuenta y contraseña",IDC_ADMIN_INFO_FRAME,8, - 17,202,73 - GROUPBOX "AFS Server existente",IDC_HOSTNAME_FRAME,8,92,201,60 - LTEXT "AFS Server:",IDC_HOSTNAME_LABEL,12,134,41,8 - LTEXT "Entre el nombre de sistema principal de algún otro AFS Server en la célula que desea unir. La información de configuración de AFS se recuperará desde este servidor. ", - IDC_HOSTNAME_PROMPT,12,105,196,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 268 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Servicios" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_STATIC,7,20,281,40 - GROUPBOX "",IDC_STATIC,7,66,281,43 - GROUPBOX "",IDC_STATIC,7,115,281,40 - GROUPBOX "",IDC_STATIC,7,161,281,46 - CONTROL "Servicio de archivos",IDC_FS_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,19,84,10 - CONTROL "Servicio de base de datos",IDC_DB_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,65,100,10 - PUSHBUTTON "Detalles...",IDC_DB_DETAILS,219,81,50,14,NOT WS_VISIBLE - CONTROL "Servidor de copia de seguridad",IDC_BK_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,114,116,10 - CONTROL "Servidor de control del sistema",IDC_SCS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,160,115,10 - EDITTEXT IDC_SC_MACHINE,137,229,120,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Seleccione los servicios a ejecutar en este AFS Server:", - IDC_STATIC,7,7,265,8 - LTEXT "El Servicio de archivos se está ejecutando en la actualidad.", - IDC_FS_STATUS_MSG,14,32,261,8 - LTEXT "El Servicio de base de datos está instalado parcialmente en la actualidad.", - IDC_DB_STATUS_MSG,14,78,195,16 - LTEXT "S&ervidor de control del sistema:",IDC_SC_MACHINE_LABEL, - 31,231,101,8,WS_DISABLED - LTEXT "Para detener el Servicio de archivos, deseleccione el recuadro anterior.", - IDC_FS_ACTION_MSG,14,44,262,8 - LTEXT "Pulse en detalles para obtener más información.", - IDC_DB_ACTION_MSG,14,96,186,8 - LTEXT "El Servidor de copia de seguridad se está ejecutando en la actualidad.", - IDC_BK_STATUS_MSG,14,127,259,8 - LTEXT "Para detener el Servidor de copia de seguridad, deseleccione el recuadro anterior.", - IDC_BK_ACTION_MSG,14,139,262,8 - LTEXT "Para habilitar este servidor, debe ejecutar el Servicio de archivos o el Servicio de base de datos.", - IDC_SCS_ACTION_MSG,14,185,268,17 - LTEXT "El servicio de Control del sistema no está ejecutándose en la actualidad.", - IDC_SCS_STATUS_MSG,14,172,263,9 - GROUPBOX "",IDC_STATIC,7,210,281,51 - CONTROL "Cliente de control del sistema",IDC_SCC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,209,109,10 - LTEXT "Para habilitar este servidor, debe ejecutar el Servicio de archivos o el Servicio de base de datos.", - IDC_SCC_ACTION_MSG,14,243,268,16 - LTEXT "El servicio de Control del sistema no está ejecutándose en la actualidad.", - IDC_SCC_STATUS_MSG,14,219,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Particiones" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "En el sistema existen las siguientes particiones de &AFS:", - IDC_STATIC,8,7,175,8 - PUSHBUTTON "&Crear...",IDC_CREATE_PARTITIONS,17,118,53,14 - LTEXT "Para recuperar una partición o un volumen de una partición, seleccione la partición en la lista y pulse el botón anterior. Para recuperar todas las particiones de este servidor, pulse el botón anterior. ", - IDC_SALVAGE_MSG,30,179,250,25 - PUSHBUTTON "&Recuperar...",IDC_SALVAGE,17,159,53,14 - LTEXT "Para eliminar una partición, seleccione la partición en la lista y pulse el botón anterior. ", - IDC_REMOVE_MSG,30,235,253,17,WS_DISABLED - PUSHBUTTON "Eli&minar",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "Particiones",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "Para crear una nueva partición en este servidor, pulse el botón anterior.", - IDC_CREATE_MSG,30,136,254,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 198 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Crear partición de AFS" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Seleccione un volumen NTFS de la lista siguiente en la que crear la nueva partición:", - IDC_TITLE,7,5,250,18 - LTEXT "Nombre de partición de AFS:",IDC_NAME_STATIC,16,144,97, - 8 - EDITTEXT IDC_PARTITION_NAME,142,141,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Crear",IDC_CREATE,96,175,50,14,WS_DISABLED - PUSHBUTTON "C&errar",IDC_CLOSE,152,175,50,14 - PUSHBUTTON "Ayuda",9,207,175,50,14 - GROUPBOX "Parámetros de partición",IDC_ARGS_FRAME,7,129,250,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,28,250, - 95,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,112,144,28,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 229, 186 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Configuración de AFS® Server" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,66,44,151,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,66,60,151,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,64,138,151,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Configurar",IDOK,108,165,50,14,WS_DISABLED - PUSHBUTTON "Cancelar",IDCANCEL,48,165,50,14 - PUSHBUTTON "Ayuda",9,172,165,50,14 - LTEXT "Entre la información de cuenta administrativa que hay a continuación:", - IDC_ADMIN_INFO_PROMPT,14,20,196,19 - LTEXT "&Nombre:",IDC_ADMIN_NAME_LABEL,15,47,38,8 - LTEXT "C&ontraseña:",IDC_ADMIN_PW_LABEL,15,63,44,8 - GROUPBOX "Nombre de cuenta y contraseña",IDC_ADMIN_INFO_FRAME,7,7, - 215,75 - GROUPBOX "Servidor de control del sistema",IDC_HOSTNAME_FRAME,7, - 84,215,73 - LTEXT "Nombre de &sist. principal:",IDC_HOSTNAME_LABEL,13,134, - 46,19 - LTEXT "Si la célula tiene un Servidor de control del sistema, entre su nombre de sistema principal a continuación. Los archivos de configuración de AFS se actualizarán por medio de este servidor. ", - IDC_HOSTNAME_PROMPT,13,98,197,31 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,7,170,225,9,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 89 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuración de AFS® Server" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Cancelar",IDCANCEL,103,68,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,37,200,11 - LTEXT "Porcentaje completado:",IDC_PERCENT_COMPLETE_LABEL,40, - 51,95,8,NOT WS_VISIBLE - LTEXT "Operación actual:",IDC_CURRENT_STEP_LABEL,40,7,57,8,NOT - WS_VISIBLE - LTEXT "Descripción del paso actual - definido en la ejecución", - IDC_CURRENT_STEP,40,15,210,9,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "Para comenzar la configuración de este sistema, pulse el botón Configurar. Para cambiar los pasos de configuración a efectuar, pulse el botón Anterior.", - IDC_STATUS_MSG,40,7,210,41 - PUSHBUTTON "&Ver registro",IDNEXT,161,68,50,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Errores de actualización de CellServCB" -FONT 9, "MS Shell Dlg" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "Aceptar",IDOK,22,162,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,75,162,50,14 - PUSHBUTTON "Ayuda",9,130,162,50,14 - LTEXT "El archivo CellServDB no ha podido actualizarse automáticamente en los siguientes servidores de AFS:", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 298, 189 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Recuperar" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,120,99,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,177,99,50,14 - PUSHBUTTON "A&yuda",9,234,99,50,14 - CONTROL "&Recuperar todas las particiones de este Servidor de archivos", - IDC_SERVER,"Button",BS_AUTORADIOBUTTON,14,35,248,10 - CONTROL "Recuperar todos los volúmenes de la &partición seleccionada", - IDC_PARTITION,"Button",BS_AUTORADIOBUTTON,17,48,251,10 - CONTROL "Recuperar un &volumen específico en la partición seleccionada", - IDC_VOLUME,"Button",BS_AUTORADIOBUTTON,14,61,254,10 - EDITTEXT IDC_VOLUME_NAME,99,74,97,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< &Avanzado ",IDC_ADVANCED,7,99,50,14 - GROUPBOX "",IDC_STATIC,7,25,284,67 - LTEXT "&Nombre de volumen:",IDC_VOLUME_NAME_LABEL,27,75,67,8, - WS_DISABLED - GROUPBOX "Opciones de recuperación avanzadas",IDC_ADVANCED_FRAME, - 7,120,284,62 - LTEXT "Vía de acceso para archivos &temporales:", - IDC_TEMP_DIR_LABEL,17,165,129,8 - EDITTEXT IDC_LOG_FILE,151,147,133,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,227,130,21,12,ES_AUTOHSCROLL - LTEXT "No&mbre del archivo para registro de resultados:", - IDC_LOG_FILE_LABEL,17,144,129,17 - EDITTEXT IDC_TEMP_DIR,151,163,133,12,ES_AUTOHSCROLL - CONTROL "Opera&ciones de recuperación paralelas; número de procesos:", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,132,208,10 - LTEXT "Si recupera el servidor o toda una partición, se llevará el servidor a fuera de línea de modo temporal.", - IDC_STATIC,35,7,256,17 - LTEXT "NOTA:",IDC_STATIC,7,7,23,8 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,180,243,8,NOT WS_VISIBLE -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Contraseña de Principal de AFS" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_PW,48,39,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,31,61,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,85,61,50,14 - PUSHBUTTON "Ayuda",9,140,61,50,14 - LTEXT "La clave de principal de AFS no puede recuperarse de un Servidor de autentificación anterior a 3.5. Por favor, entre la contraseña de principal de AFS a continuación.", - IDC_STATIC,7,7,183,26 - LTEXT "Contraseña:",IDC_STATIC,7,41,38,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Recuperar volúmenes - Resultados" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "&Cerrar",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "Ayuda",9,280,266,50,14 - LTEXT "",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 83 - END - - IDD_BACKUP_SERVER_PAGE, DIALOG - BEGIN - BOTTOMMARGIN, 191 - END - - IDD_SYS_CONTROL_PAGE, DIALOG - BEGIN - BOTTOMMARGIN, 219 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - BOTTOMMARGIN, 200 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - RIGHTMARGIN, 210 - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 267 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - BOTTOMMARGIN, 200 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - RIGHTMARGIN, 210 - VERTGUIDE, 53 - VERTGUIDE, 202 - TOPMARGIN, 7 - BOTTOMMARGIN, 200 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 261 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_CREATE_PARTITION, DIALOG - BEGIN - BOTTOMMARGIN, 177 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 222 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 179 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 82 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 291 - TOPMARGIN, 7 - BOTTOMMARGIN, 182 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS® Configuration application and wizard""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "&Siguiente >" - IDS_FINISH "&Finalizar" - IDS_HELP_TITLE "Se ha pulsado el botón de ayuda" - IDS_HELP_DESC "La ayuda no está disponible en este momento." - IDS_CANCEL_DESC "¿Cancelar el Asistente de inicio rápido de AFS?" - IDS_PARTITION_ALREADY_CREATED - "Ya existe una partición de AFS en esta máquina." - IDS_NOT_A_FS_SERVER "Esta máquina no está configurada como Servidor de archivos. Los volúmenes sólo pueden crearse en máquinas de Servidor de archivos." - IDS_ROOT_AFS_ALREADY_EXISTS "Los volúmenes de raíz ya existen." - IDS_NO_PARTITION_EXISTS "No hay particiones en las que crear los volúmenes de raíz. Debe haber una partición en la que crear los volúmenes de raíz. " - IDS_ALREADY_REPLICATED "Los volúmenes de raíz ya están duplicados." - IDS_ROOT_AFS_DOESNT_EXIST - "Los volúmenes de raíz no existen. Los volúmenes de raíz deben existir para poder duplicarse." - IDS_ALREADY_CONFIGURED "Esta máquina ya está configurada como Servidor de AFS." - IDS_NOTHING_TO_CONFIGURE "No ha elegido nada para configurarlo." - IDS_EXIT "Salir" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "Iniciar el Servicio de archivos" - IDS_CANCEL_CONFIG_MSG "La cancelación en este punto dejará el sistema parcialmente configurado como servidor de AFS. ¿Se ha de cancelar de todos modos?" - IDS_WIZARD_APP_TITLE "Asistente de inicio rápido de AFS® Server" - IDS_CANCEL_PENDING "*** Cancelación pendiente - un momento, por favor... ***" - IDS_CHECK_FS_CONFIG "Comprobación del servidor de archivos..." - IDS_CHECK_DB_CONFIG "Comprobación del servidor de base de datos..." - IDS_CHECK_BAK_CONFIG "Comprobación del servidor de copia de seguridad..." - IDS_CHECK_PARTITION "Comprobación de la partición de AFS..." - IDS_CHECK_ROOT_AFS "Comprobación de volúmenes de raíz..." - IDS_CHECK_REP "Comprobación de duplicación de volúmenes de raíz..." - IDS_CANCEL_GET_CONFIG "Cancelando...Un momento por favor..." - IDS_ALREADY_A_BACKUP_SERVER - "Esta máquina ya está configurada como Servidor de copia de seguridad." - IDS_NOT_A_DB_SERVER "Esta máquina no está configurada como Servidor de base de datos. El Servidor de copia de seguridad sólo puede ejecutarse en máquinas del Servidor de base de datos." - IDS_ALREADY_A_SYS_CONTROL_SERVER - "Esta máquina ya está configurada como Servidor de control del sistema." - IDS_ALREADY_A_SYS_CONTROL_CLIENT - "Esta máquina ya está configurada como Cliente de control del sistema." - IDS_SC_NOT_A_DB_OR_FS_SERVER - "Esta máquina no está configurada como Servidor de archivos o de Base de datos. Un sistema sólo puede configurarse como máquina de Control del sistema si también está configurado como máquina de Servidor de archivos o de Base de datos." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "Volumen" - IDS_NAME_OR_ERROR "Nombre (o Mensaje de error)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "Esta máquina no está configurada como Servidor de archivos o de Base de datos. Un sistema sólo puede configurarse como máquina de Distribución binaria si también está configurado como máquina de Servidor de archivos o de Base de datos." - IDS_CHECK_SCS "Comprobación de Servidor de control del sistema..." - IDS_CHECK_SCC "Comprobación de Cliente de control del sistema..." - IDS_SIZE "Tamaño" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "El Servicio de archivos se configurará por omisión ya que éste es el primer AFS Server de la célula." - IDS_MUST_CONFIG_DB "El Servicio de base de datos se configurará por omisión ya que éste es el primer AFS Server de la célula." - IDS_MUST_MAKE_PARTITION "Debe crearse una partición ya que éste es el primer AFS Server de la célula." - IDS_MUST_CREATE_ROOT_AFS - "Los volúmenes root.afs y root.cell se crearán por omisión ya que éste es el primer AFS Server de la célula." - IDS_MUST_REPLICATE "Los volúmenes root.afs y root.cell se duplicarán por omisión ya que éste es el primer AFS Server de la célula." - IDS_CHECK_AFS_CLIENT "Comprobación de instalación de AFS Client..." - IDS_ERROR_HOST_NAME "No se ha podido determinar el nombre de sistema principal de esta máquina." - IDS_ERROR_DRIVE_COMPRESSED "La unidad está comprimida" - IDS_ERROR_CFG_HOST_OPEN "No se ha podido inicializar la Biblioteca de configuración del servidor." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "Detención del AFS Client" - IDS_ERROR_LOCAL_HOST_NAME - "No se ha podido determinar el nombre de sistema principal local de esta máquina." - IDS_GET_TOKENS_ERROR "No se han podido obtener señales. Compruebe que el nombre de usuario y contraseña entrados sean correctos." - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "No puede efectuarse la recuperación ya que no se ha iniciado el servicio de archivos. Por favor, inicie el servicio de archivos y después vuelva a intentar la recuperación." - IDS_SALVAGING "Recuperación en curso. Espere por favor..." - IDS_CURRENT_SALVAGE_LOG "Contenido actual del registro de recuperación:" - IDS_FINAL_SALVAGE_LOG "Contenido final del registro de recuperación:" - IDS_SALVAGE_COMPLETE "Ha finalizado la recuperación." - IDS_CANT_GET_SALVAGE_LOG - "No se ha podido recuperar el registro de recuperación." - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK - "No se ha podido guardar el registro de recuperación en disco." - IDS_VALIDATION_ERROR_TEMPLATE - "El %1 especificado no es válido. Por favor, entre el %2." - IDS_CELL_NAME_VALIDATION_TYPE "nombre de célula" - IDS_SERVER_NAME_VALIDATION_TYPE "nombre de servidor" - IDS_PASSWORD_VALIDATION_TYPE "contraseña" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "nombre de usuario" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "No se ha instalado el AFS Client. El AFS Client debe estar instalado antes de que pueda configurarse el AFS Server." - IDS_ERROR_AFS_CLIENT_CHECK - "No se ha podido determinar si está instalado el AFS Client." - IDS_ERROR_FS_IS_NOT_NTFS "El sistema de archivos no es NTFS" - IDS_ERROR_DRIVE_HAS_DATA "La unidad contiene datos" - IDS_PARTITION_STEP_DESC "Crear la partición de AFS" - IDS_ERROR_DRIVE_CONTAINS_NT "La unidad contiene instalación de NT" - IDS_DB_STEP_DESC "Iniciar el Servicio de base de datos" - IDS_FS_STEP_DESC "Iniciar el Servicio de archivos" - IDS_SCC_STEP_DESC "Iniciar el Cliente de control del sistema" - IDS_SCS_STEP_DESC "Iniciar el Servidor de control del sistema" - IDS_ROOT_AFS_STEP_DESC "Crear los volúmenes de raíz" - IDS_REP_STEP_DESC "Duplicar los volúmenes de raíz" - IDS_PARTITIONS_PAGE_TITLE "Particiones" - IDS_CONFIGURE "&Configurar" - IDS_DB_AND_BK_STEP_DESC "Iniciar el Servicio de base de datos (incluye Servidor de copia de seguridad)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "Creación de la partición de AFS" - IDS_CONFIG_COMMON_FUNCS "Configuración de las funciones comunes a todos los servicios" - IDS_START_DB_STEP "Cómo iniciar el servicio de base de datos" - IDS_START_SCC_STEP "Cómo iniciar el Servicio de control del sistema como Cliente de control del sistema" - IDS_START_SCS_STEP "Cómo iniciar el Servicio de control del sistema como Servidor de control del sistema" - IDS_CREATE_ROOT_AFS_STEP "Creación del volumen root.afs" - IDS_REP_STEP "Duplicación de los volúmenes de raíz" - IDS_START_AUTH_STEP "Obtención de señales para este servidor" - IDS_SERVICES_PAGE_TITLE "Servicios" - IDS_CONFIG_SUCCEEDED "La configuración ha resultado satisfactoria." - IDS_CONFIG_CANCELED "La configuración se ha cancelado." - IDS_CONFIG_FAILED "La configuración ha fallado.\r\n\r\nSe ha creado un archivo de registro detallado, %1, en la ubicación %2." - IDS_ERROR_NO_LICENSE_NUM - "No se ha encontrado un número de licencia de AFS." - IDS_VERIFY_CLIENT_INSTALL_STEP - "Verificación de la instalación de AFS Client" - IDS_SET_SERVER_LICENSE_STEP "Definición de la licencia para este servidor" - IDS_DEFINE_CELL_NAME_STEP "Definición del nombre para esta célula" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP - "Conversión de este servidor en miembro de la célula" - IDS_START_BOS_SERVER_STEP "Iniciando el servidor BOS" - IDS_START_AUTH_SERVER_STEP "Iniciando el servidor de autentificación" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP - "Creación de un principal y una clave para este servidor" - IDS_START_DB_AND_BK_STEP - "Cómo iniciar el Servicio de base de datos (incluyendo Servidor de copia de seguridad)" - IDS_CREATE_ADMIN_PRINCIPAL_STEP - "Creación del principal de admin de célula" - IDS_START_CLIENT_STEP "Iniciando el AFS Client" - IDS_SET_ROOT_ACL_STEP "Definición de la ACL en el volumen root.afs" - IDS_CREATE_ROOT_CELL_STEP "Creación del volumen root.cell" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP - "Montaje del volumen root.cell utilizando un punto de montaje estándar." - IDS_SET_ROOT_CELL_ACL_STEP "Definición de la ACL en el volumen root.cell" - IDS_MOUNT_ROOT_CELL_RW_STEP - "Montaje del volumen root.cell utilizando un punto de montaje de lectura/grabación." - IDS_ENABLE_AUTH_CHECKING_STEP - "Habilitación de la comprobación de autentificación" - IDS_OBTAIN_ADMIN_CREDS_STEP "Obtención de las señales administrativas" - IDS_RESTART_SERVERS_STEP - "Reinicio de todos los servidores de esta máquina como servidores autentificados" - IDS_ALREADY_A_FS_SERVER "Esta máquina ya está configurada como Servidor de archivos." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "Esta máquina ya está configurada como Servidor de base de datos." - IDS_INTRO_PAGE "Introducción" - IDS_INFO_PAGE "Información de célula y servidor" - IDS_FS_PAGE "Servicio de archivos" - IDS_DB_PAGE "Servicio de base de datos" - IDS_CFG_TOOL_APP_TITLE "Configuración de AFS® Server" - IDS_BK_PAGE "Servidor de copia de seguridad" - IDS_ROOT_AFS_PAGE "Volúmenes de AFS de raíz" - IDS_NAME "Nombre" - IDS_REP_PAGE "Duplicación" - IDS_SC_PAGE "Servicio de control del sistema" - IDS_CONFIG_PAGE "Configurar el sistema" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "Partición de AFS" - IDS_GRAPHIC_FONT "Times New Roman, 12, B" - IDS_CURRENT_STEP "Paso actual:" - IDS_ADD_TO_CELLSERVDB_STEP "Cómo añadir este servidor a CellServDB" - IDS_RESTART_ALL_DB_SERVERS_STEP - "Reinicio de todos los servidores de base de datos de la célula" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "La configuración ha resultado satisfactoria. NOTA: El archivo CellServDB de todos los clientes de AFS de la célula debe actualizarse. Asegúrese de facilitar al Soporte de producto de AFS una lista actualizada de los Servidores de base de datos si pone la célula a disposición de otros sitios. " - IDS_SYS_CONTROL_SERVER_ONLY_MSG - "¿Desea configurar esta máquina como Servidor de control del sistema?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG - "N&o configurar como Servidor de control del sistema." - IDS_CLIENT_CELL_WILL_CHANGE - "La configuración de AFS Server requiere que el AFS Client se configure en la misma célula que el Servidor. Esto se efectuará de modo automático." - IDS_INFO_PAGE2 "Información administrativa" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "La configuración ha resultado satisfactoria.\r\n\r\nNOTA: Asegúrese de facilitar al Soporte de producto de AFS una lista actualizada de los Servidores de base de datos si pone la célula a disposición de otros sitios." - IDS_CONFIG_SCS "Configurar como Servidor de control del sistema de la célula." - IDS_CONFIG_INTO_CELL_MSG "Configurar este sistema principal en la célula " - IDS_VIEW_LOG "&Ver registro" - IDS_VIEW_LOG_ERROR "No puede verse el archivo de registro" - IDS_ERROR_NO_LOG_FILE "El archivo de registro no existe." - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED - "CellServDB actualizado en el sistema principal " - IDS_UPDATING_CELLSERVDB_HOST_FAILED - "No ha podido actualizarse CellServDB en el sistema principal " - IDS_CELL_NAME_LEN_ERROR "El nombre de célula entrado es demasiado largo. Los nombres de célula no pueden superar los 64 caracteres." - IDS_CONFIG_CHECK_FAILED "No se ha podido determinar la configuración actual de esta máquina." - IDS_YES "Sí" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "No" - IDS_FREE "Espacio libre" - IDS_TOTAL "Tamaño total" - IDS_DRIVE2 "Unidad" - IDS_SERVICE_STATUS "Estado" - IDS_SERVICE "Servicio" - IDS_FS_RUNNING "El Servicio de archivos se está ejecutando en la actualidad." - IDS_FS_STOPPED "El Servicio de archivos no se está ejecutando en la actualidad." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "El Servicio de base de datos se está ejecutando en la actualidad." - IDS_DB_STOPPED "El Servicio de base de datos no se está ejecutando en la actualidad." - IDS_BK_RUNNING "El Servicio de copia de seguridad se está ejecutando en la actualidad." - IDS_BK_STOPPED "El Servicio de copia de seguridad no se está ejecutando en la actualidad." - IDS_SCS_STOPPED "El Servidor de control del sistema no se está ejecutando en la actualidad." - IDS_SCC_STOPPED "El Cliente de control del sistema no se está ejecutando en la actualidad." - IDS_FS_HOW_TO_RUN "Para iniciar el Servicio de archivos, seleccione el recuadro anterior." - IDS_FS_HOW_TO_STOP "Para detener el Servicio de archivos, deseleccione el recuadro anterior." - IDS_DB_HOW_TO_RUN "Para iniciar el Servicio de base de datos, seleccione el recuadro anterior." - IDS_DB_HOW_TO_STOP "Para detener el Servicio de base de datos, deseleccione el recuadro anterior." - IDS_BK_HOW_TO_RUN "Para iniciar el Servicio de copia de seguridad, seleccione el recuadro anterior." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "Para detener el Servicio de copia de seguridad, deseleccione el recuadro anterior." - IDS_SCS_HOW_TO_RUN "Para iniciar el Servidor de control del sistema, seleccione el recuadro anterior." - IDS_SCS_HOW_TO_STOP "Para detener el Servidor de control del sistema, deseleccione el recuadro anterior." - IDS_DB_PARTIAL_CONFIG "El Servicio de base de datos está parcialmente configurado." - IDS_DB_DETAILS "Pulse en el botón Detalles para obtener más información." - IDS_BK_DISABLED "El Servicio de copia de seguridad está inhabilitado." - IDS_BK_ENABLE "Para habilitar el Servicio de copia de seguridad, debe ejecutar el Servicio de base de datos." - IDS_SC_DISABLED "Este servidor está inhabilitado." - IDS_SC_ENABLE "Para habilitar este servidor, debe ejecutar el Servicio de archivos o el Servicio de base de datos." - IDS_FS_WILL_RUN "Se iniciará el Servicio de archivos." - IDS_FS_WILL_STOP "Se detendrá el Servicio de archivos." - IDS_DB_WILL_RUN "Se iniciará el Servicio de base de datos." - IDS_DB_WILL_STOP "Se detendrá el Servicio de base de datos." - IDS_BK_WILL_RUN "Se iniciará el Servicio de copia de seguridad." - IDS_BK_WILL_STOP "Se detendrá el Servicio de copia de seguridad." - IDS_SCS_WILL_RUN "Se iniciará el Servidor de control del sistema." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "Se detendrá el Servidor de control del sistema." - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "La unidad ya es una partición de AFS" - IDS_VOLUME_HAS_NO_NAME "" - IDS_PARTITION_CREATED "Se ha creado satisfactoriamente una nueva Partición de AFS." - IDS_PARTITION_EXISTS "El nombre de partición entrado ya lo está utilizando otra partición." - IDS_SCS_RUNNING "El Servidor de control del sistema se está ejecutando en la actualidad." - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN - "Esta unidad sólo contiene la Papelera de reciclaje." - IDS_SCC_WILL_RUN "Se iniciará el Cliente de control del sistema." - IDS_SCC_WILL_STOP "Se detendrá el Cliente de control del sistema." - IDS_SCC_RUNNING "El Cliente de control del sistema se está ejecutando en la actualidad." - IDS_SCC_HOW_TO_RUN "Para iniciar el Cliente de control del sistema, seleccione el recuadro anterior." - IDS_SCC_HOW_TO_STOP "Para detener el Cliente de control del sistema, deseleccione el recuadro anterior." - IDS_SCS_ENABLE "Para habilitar este servidor, debe detener la ejecución del Cliente de control del sistema." - IDS_SCC_ENABLE "Para habilitar este servidor, debe detener la ejecución del Servidor de control del sistema." - IDS_UNCONFIG_DB_STEP "Desconfiguración del Servicio de base de datos" - IDS_UNCONFIG_DB_STEP_DESC "Desconfigurar el Servicio de base de datos" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP - "Desconfiguración del Servicio de base de datos (y del Servidor de copia de seguridad)" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC - "Desconfigurar el Servicio de base de datos (y el Servidor de copia de seguridad)" - IDS_UNCONFIG_BK_STEP "Desconfiguración del Servidor de copia de seguridad" - IDS_UNCONFIG_BK_STEP_DESC - "Desconfigurar el Servidor de copia de seguridad" - IDS_UNCONFIG_FS_STEP "Desconfiguración del Servicio de archivos" - IDS_UNCONFIG_FS_STEP_DESC "Desconfigurar el Servicio de archivos" - IDS_UNCONFIG_SCS_STEP "Desconfiguración del Servidor de control del sistema" - IDS_UNCONFIG_SCS_STEP_DESC - "Desconfigurar el Servidor de control del sistema" - IDS_UNCONFIG_SCC_STEP "Desconfiguración del Cliente de control del sistema" - IDS_UNCONFIG_SCC_STEP_DESC - "Desconfigurar el Cliente de control del sistema" - IDS_INVALIDATE_CONFIG_INFO_STEP - "Invalidación de la información de configuración de esta máquina" - IDS_CLOSE "&Cerrar" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "El archivo CellServDB no ha podido actualizarse en los servidores de AFS que hay a continuación. Este error no es grave.\r\n" - IDS_DELETE_PARTITION_PROMPT "¿Desea realmente suprimir la partición '%1'?" - IDS_INVALIDATE_CFG_INFO "En este momento no hay procesos de AFS ejecutándose en este sistema. ¿Desea eliminar la información de configuración desde esta máquina?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "La célula ya no existe. La aplicación de Configuración de AFS sólo puede utilizarse para configurar máquinas de servidor ya configuradas en una célula de AFS. El Asistente de configuración de AFS puede utilizarse para iniciar una nueva célula." - IDS_CFG_MAN_CANT_CONTINUE - "La aplicación de Configuración de AFS debe finalizar en este momento. Sólo puede ejecutarse en máquinas ya configuradas en servidores de AFS. Para configurar de nuevo esta máquina como servidor de AFS, ejecute el Asistente de configuración de AFS. " - IDS_CONFIG_INFO_INVALIDATED - "Esta máquina ya no está configurada como AFS Server. La aplicación de Configuración de AFS sólo puede utilizarse para configurar máquinas de AFS Server. El Asistente de configuración de AFS puede utilizarse para volver a configurar esta máquina como AFS Server. " - IDS_GET_TOKENS_FAILED "No se han podido obtener señales para la célula especificada." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "Iniciando el servidor de Copia de seguridad" - IDS_BK_STEP_DESC "Iniciar el servidor de Copia de seguridad" - IDS_CONFIG_ERROR "Se ha producido un error de configuración" - IDS_CREATE_PARTITION_ERROR "No se ha podido crear la partición" - IDS_REMOVE_PARTITION_ERROR "No se ha podido eliminar la partición" - IDS_READ_PARTITIONS_ERROR "No se ha podido leer la tabla de partición" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\nEl proceso de actualización de CellServDB ha finalizado prematuramente. No se han podido actualizar todos los servidores." - IDS_GET_PARTITION_LIST_ERROR - "No se ha podido determinar que la partición esté en este servidor" - IDS_EXPORTED "Exportada" - IDS_CANT_DELETE_EXPORTED_PARTITION - "Las particiones exportadas no pueden eliminarse mientras se esté ejecutando el Servicio de archivos. Debe detener el Servicio de archivos antes de eliminar esta partición." - IDS_CHECK_CONFIG_INFO "Comprobando la información de configuración válida..." - IDS_ERROR_CFG_HOST_CLOSE - "No se ha podido cerrar la Biblioteca de configuración del servidor" - IDS_FAILED_OPEN_CELL "No se ha podido abrir la célula." - IDS_FAILED_OPEN_NULL_CELL - "No se ha podido abrir un controlador de célula NULL" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Si no existen los volúmenes de raíz, ¿desea crearlos?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Si los volúmenes de raíz no están duplicados, ¿desea duplicarlos?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS Server" - IDS_CANT_INIT_ADMIN_LIBS - "No puede ejecutar esta aplicación: ha fallado la inicialización de la biblioteca." - IDS_CANT_OPEN_LOG_FILE "No ha podido abrirse el archivo de registro." - IDS_NEED_CLIENT_INFO "La aplicación de Configuración de AFS no puede ejecutarse debido a que AFS Client no está configurado en este sistema. El asistente de configuración de AFS puede utilizarse en esta situación. ¿Ha de ejecutarse el Asistente de configuración de AFS?" - IDS_NEED_SERVER_INFO "Este sistema no está configurado como AFS Server. El Asistente de configuración de AFS debe utilizarse para configurar inicialmente un AFS Server. Por tanto, puede utilizarse la aplicación Configuración de AFS. ¿Ha de ejecutarse el Asistente de configuración de AFS para configurar inicialmente este sistema? " - IDS_ADVANCED_OPEN "<< &Avanzado" - IDS_ADVANCED_CLOSED "&Avanzado >>" - IDS_BOS_OPEN_FAILED "No se ha podido conectar con el servidor (ha fallado la apertura de bos)." - IDS_SALVAGE_ERROR "Ha fallado la operación de recuperación." - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "El número especificado de procesos de recuperación no es válido. El número de procesos de recuperación debe estar entre 1 y 32. " - IDS_WRONG_CELL "En un paso anterior ha especificado un servidor desde el que debería recuperarse la información de configuración. ¡El servidor especificado no pertenece a la célula que desea unir!" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "No se ha podido actualizar el archivo CellServDB en algunos servidores de la célula. Para obtener una lista de los servidores que se han actualizado y de los que no se han actualizado, vea el registro de configuración almacenado en el archivo" - IDS_GET_CREDENTIALS_STEP "Obtención de señales administrativas" - IDS_MUST_ENTER_SCS_NAME "Debe entrarse un nombre de Máquina de control del sistema antes de que pueda comenzar la configuración." - IDS_NOT_SAME_CELL "El AFS Client está configurado en una célula diferente de la de AFS Server. Antes de configurar el AFS Server, en primer lugar debe volver a configurar el AFS Client en la célula del Servidor." - IDS_LAST_DB_SERVER "Esta máquina está ejecutando el último servidor de base de datos de la célula. Si continúa y desconfigura el servicio de base de datos en esta máquina, la célula ya no existirá y se desconfigurarán todos los demás servicios de AFS que se ejecutan en la máquina. ¿Desea continuar de todos modos?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "La contraseña del principal de AFS no es válida." - IDS_ERROR_CLIENT_VERSION - "La versión del AFS Client de este sistema no es compatible con el AFS Server. El AFS Server requiere como mínimo la versión 3.5 del AFS Client." - IDS_CANT_MAP_ROOT_AFS "Para definir las ACL en los volúmenes de raíz, debe correlacionarse una letra de unidad en AFS. En la actualidad no hay letras de unidad disponibles. Por favor, libere una letra de unidad y después pulse en Aceptar. " - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "nombre de partición" - IDS_VOLUME_NAME_VALIDATION_TYPE "nombre de volumen" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "número de procesos de recuperación" - IDS_PATH_NAME_VALIDATION_TYPE "nombre de vía de acceso" - IDS_FILE_NAME_VALIDATION_TYPE "nombre de archivo" - IDS_GENERIC_VALIDATION_TYPE "valor" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/ja_JP/afscfg.rc b/src/WINNT/afssvrcfg/lang/ja_JP/afscfg.rc deleted file mode 100644 index b98c9f660..000000000 --- a/src/WINNT/afssvrcfg/lang/ja_JP/afscfg.rc +++ /dev/null @@ -1,1212 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS(R) \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚¨‚æ‚уEƒBƒU[ƒh" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 325, 247 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "AFS(R) ƒT[ƒo[EƒNƒBƒbƒNEƒXƒ^[ƒgEƒEƒBƒU[ƒh" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "ŽæÁ‚µ(&L)",IDCANCEL,106,226,50,14 - PUSHBUTTON "< –ß‚é(&B)",IDBACK,161,226,50,14 - DEFPUSHBUTTON "ŽŸ‚Ö(&N) >",IDNEXT,216,226,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,271,226,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,11,219,311,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,104,7,216,207 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚Í‚¢Aƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚µ‚Ü‚·B(&Y)", - IDC_CREATE_PARTITION,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,2,88,162,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,3,116,210, - 49,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,155,180,20,12,ES_AUTOHSCROLL - CONTROL "‚¢‚¢‚¦Aƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚µ‚Ü‚¹‚ñB(&O)", - IDC_DONT_CREATE_PARTITION,"Button",BS_AUTORADIOBUTTON,3, - 195,138,8 - LTEXT "‚±‚̃tƒ@ƒCƒ‹EƒT[ƒo[‚̓tƒ@ƒCƒ‹‚ƃvƒƒOƒ‰ƒ€‚ð AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ɕۊǂ¨‚æ‚шø‚«“n‚µ‚Ü‚·B‚±‚̃VƒXƒeƒ€‚ɕۊǂ³‚ꂽƒf[ƒ^‚ð AFS ‚ð’Ê‚¶‚Ä‹¤—p‚·‚é‚ɂ́A­‚È‚­‚Æ‚à 1 ‚Â‚Ì NTFS ƒ{ƒŠƒ…[ƒ€‚ª AFS ƒp[ƒeƒBƒVƒ‡ƒ“ê—p‚É‚³‚ê‚Ä‚¢‚é•K—v‚ª‚ ‚è‚Ü‚·B", - -1,1,12,212,31 - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“—p‚ÉŽg—p‚·‚éƒ{ƒŠƒ…[ƒ€‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢(&S):", - IDC_SELECT_DRIVE,2,102,211,9 - LTEXT "AFS ƒp[ƒeƒBƒVƒ‡ƒ“–¼(&M): /vicep",IDC_NAME_LABEL,14, - 182,123,8 - LTEXT "‚±‚̃tƒ@ƒCƒ‹EƒT[ƒo[‚É AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚µ‚Ü‚·B", - IDC_TITLE,3,0,210,8 - LTEXT "AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚Í•¨—“I‚É NTFS ƒ{ƒŠƒ…[ƒ€‚Æ“¯“™‚Å‚·‚ªA‚±‚ê‚ɂ̓p[ƒeƒBƒVƒ‡ƒ“‚ÉŠÖ‚·‚éî•ñ‚̍\‘¢‚ƈʒu‚ɂ‚¢‚Ä“ÁŽê‰»‚³‚ꂽƒƒ^ƒf[ƒ^‚à“ü‚Á‚Ä‚¢‚Ü‚·B", - -1,0,48,213,24 - LTEXT "‚±‚̃tƒ@ƒCƒ‹EƒT[ƒo[‚Ƀp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚µ‚Ü‚·‚©?", - IDC_ASK_CREATE_PARTITION,1,76,213,8 - LTEXT "ƒƒbƒZ[ƒW‚Í•K—v‚È‚çŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·B", - IDC_PARTITION_MSG,3,170,208,34,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,208,86,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚Í‚¢A\¬‚µ‚Ü‚·(&Y)B",IDC_SHOULD_CONFIG_FILE_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,3,173,98,10 - CONTROL "‚¢‚¢‚¦A\¬‚µ‚Ü‚¹‚ñ(&O)B",IDC_DONT_CONFIG_FILE_SERVER, - "Button",BS_AUTORADIOBUTTON,3,187,114,10 - LTEXT "AFS ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚Í—v‹‚³‚ꂽƒtƒ@ƒCƒ‹‚âƒvƒƒOƒ‰ƒ€‚ð‚±‚ÌƒT[ƒo[‚©‚ç AFS ƒNƒ‰ƒCƒAƒ“ƒg‚Ɉø‚«“n‚µ‚Ü‚·B‚±‚̃T[ƒrƒX‚͂܂½Aƒ{ƒŠƒ…[ƒ€‚̍쐬AíœAˆÚ“®A•¡»‚̂悤‚ȃ{ƒŠƒ…[ƒ€ŠÇ—‘€ì‚Ì‚·‚×‚Ä‚ðˆµ‚¢‚Ü‚·B", - -1,0,36,209,34 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒtƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·B", - IDC_TITLE,0,0,209,8 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒtƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·‚©?", - IDC_CREATE_FS_QUESTION,2,158,197,8 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒtƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚·‚é‚ɂ́Aƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ð\¬‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B", - -1,0,13,209,17 - LTEXT "’: ‚±‚̃}ƒVƒ“‚ÍŒ»Ý AFS ‚Ƀtƒ@ƒCƒ‹‚ð•ÛŠÇ‚·‚邽‚߂Ɏg—p‰Â”\‚ȃfƒBƒXƒNEƒhƒ‰ƒCƒu‚ðŽ‚Á‚Ä‚¢‚Ü‚¹‚ñB‚±‚̃}ƒVƒ“‚ðƒtƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚·‚邱‚Ƃ͂ł«‚Ü‚·‚ªAAFSƒf[ƒ^‚ð‚±‚Ìƒ}ƒVƒ“‚ɕۊǂ·‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB", - IDC_NO_DRIVES_NOTE,0,77,209,34,NOT WS_VISIBLE - LTEXT "ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ðì¬‚·‚é‚ɂ́AWindows NT ƒfƒBƒXƒNEƒAƒhƒ~ƒjƒXƒgƒŒ[ƒ^‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_DISK_ADMIN_NOTE,0,119,209,16,NOT WS_VISIBLE - LTEXT "‚±‚̃}ƒVƒ“‚Í‚·‚łɃtƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B", - IDC_MSG,0,144,206,56,NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ƒT[ƒo[‚̃NƒBƒbƒNEƒXƒ^[ƒgEƒEƒBƒU[ƒh‚ɂ悤‚±‚»B‚±‚̃EƒBƒU[ƒh‚́A‚±‚Ì Windows NT ƒVƒXƒeƒ€‚Å‚Ì AFS ƒT[ƒo[‚̍\¬‚ð‰‡•‚µ‚Ü‚·B", - IDC_TITLE,0,0,209,26 - LTEXT "AFS ƒT[ƒo[\¬‚ÌŠJŽn‚ɂ́uŽŸ‚ցv‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,0,166,206,8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚Í‚¢(&Y)Aƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚𕡐»‚µ‚Ü‚·B", - IDC_REPLICATE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,3, - 168,178,10 - CONTROL "‚¢‚¢‚¦(&O)Aƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚𕡐»‚µ‚Ü‚¹‚ñB", - IDC_DONT_REPLICATE,"Button",BS_AUTORADIOBUTTON,3,185,178, - 10 - LTEXT "•¡»‚́A’ʏí‚Í‘¼‚̃tƒ@ƒCƒ‹EƒT[ƒo[‚É‚ ‚éA•¡”‚̃p[ƒeƒBƒVƒ‡ƒ““à‚̃{ƒŠƒ…[ƒ€‚̓ǂݎæ‚èê—pƒRƒs[‚ðì¬‚·‚éƒvƒƒZƒX‚Å‚·B•¡»‚É‚æ‚Á‚āAƒ{ƒŠƒ…[ƒ€‚ð“ü‚ê‚éƒT[ƒo[‚Ì‚P‚‚ªŽg—p•s‰Â‚ɂȂÁ‚½ê‡‚Å‚àA", - IDC_STATIC,0,41,213,26 - LTEXT "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚𕡐»‚µ‚Ü‚·‚©?", - IDC_REPLICATE_QUESTION,2,151,205,10 - LTEXT "•¡»‚͂܂½A•p”ɂɃAƒNƒZƒX‚³‚ê‚éƒ{ƒŠƒ…[ƒ€‚Ì—v‹‚ŃT[ƒo[‚ª‰ß•‰‰×‚ɂȂé‚Ì‚ð–h‚®‚±‚Æ‚ð‰Â”\‚É‚µ‚Ü‚·B", - IDC_STATIC,0,99,213,18 - LTEXT "ƒZƒ‹‚̃‹[ƒgEƒ{ƒŠƒ…[ƒ€‚𕡐»‚µ‚Ü‚·B",IDC_TITLE,2,0, - 209,8 - LTEXT "‚±‚Ì AFS ƒZƒ‹“à‚Å‘¼‚̃{ƒŠƒ…[ƒ€‚𕡐»‚·‚éê‡‚́A‚Ü‚¸ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚𕡐»‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,0,16,213,16 - LTEXT "‚»‚̃{ƒŠƒ…[ƒ€‚Í‘¼‚̃T[ƒo[‚©‚çƒAƒNƒZƒX‚Å‚«‚é‚̂ŁAƒlƒbƒgƒ[ƒN‚âƒT[ƒo[‚Ì’âŽ~‚ª‹N‚±‚Á‚½‚Æ‚«‚̃{ƒŠƒ…[ƒ€‚ÌŽg—p‰Â”\«‚ª‘‚µ‚Ü‚·B", - IDC_STATIC,0,73,213,18 - LTEXT "ƒƒbƒZ[ƒW‚Í•K—v‚È‚çŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·B", - IDC_CANT_REPLICATE_MSG,0,128,206,72,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚Í‚¢(&Y)Aƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚µ‚Ü‚·B", - IDC_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,3,165,178,10 - CONTROL "‚¢‚¢‚¦(&O)Aƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚µ‚Ü‚¹‚ñB", - IDC_DONT_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON, - 3,184,178,10 - LTEXT "AFS ‚Ń{ƒŠƒ…[ƒ€‚Ƃ́AƒVƒXƒeƒ€ŠÇ—‚ðŒø—¦“I‚ɍs‚¤‚½‚߂ɁAŠÇ—‚Ì—eˆÕ‚È 1‚‚̒PˆÊ‚ɕҐ¬‚³‚ê‚éŠÖ˜Aƒtƒ@ƒCƒ‹‚̏W‚Ü‚è‚Å‚·B", - IDC_STATIC,2,14,210,20 - LTEXT "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚µ‚Ü‚·‚©?", - IDC_ROOT_AFS_QUESTION,3,141,201,12 - LTEXT "ƒZƒ‹‚̃‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚µ‚Ü‚·B",IDC_TITLE,2,0, - 153,8 - LTEXT "ì¬ŒãAƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ÍŽ©“®“I‚É AFS ƒtƒ@ƒCƒ‹EƒXƒy[ƒX‚ŃAƒNƒZƒX‰Â”\‚ɂȂè‚Ü‚·B", - IDC_STATIC,2,73,210,17 - LTEXT "ƒƒbƒZ[ƒW‚Í•K—v‚È‚çŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·B", - IDC_ROOT_AFS_MSG,2,116,211,80,NOT WS_VISIBLE - LTEXT "root.afs ƒ{ƒŠƒ…[ƒ€‚Í AFS ƒtƒ@ƒCƒ‹EƒXƒy[ƒX‚̃‹[ƒg‚Å‚·Broot.cell ƒ{ƒŠƒ…[ƒ€‚Í AFS ƒtƒ@ƒCƒ‹EƒXƒy[ƒX‚Ì‚±‚̃Zƒ‹‚̃TƒuƒcƒŠ[‚̃‹[ƒg‚ŁAroot.afs ‚©‚çƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ð’Ê‚¶‚ăAƒNƒZƒX‚³‚ê‚Ü‚·B", - IDC_STATIC,2,40,209,27 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "AFS(R) ƒT[ƒo[‚̍\¬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,38,148,14 - LTEXT "‘€ìƒeƒLƒXƒg - ŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·B",IDC_OPERATION,35, - 20,145,10 - ICON "",IDC_LOGO,7,7,20,21 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,73,63,50,14 - LTEXT "Œ»s\¬‚ð”»•Ê’†:",IDC_OPERATION2,35,7,156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚Í‚¢AƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·(&Y)B", - IDC_CONFIG_BACKUP_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,172,210,10 - CONTROL "‚¢‚¢‚¦AƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚¹‚ñ(&O)B", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,0,187,210,10 - LTEXT "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚̓f[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ꂽƒ}ƒVƒ“‚ł̂ݎÀs‰Â”\‚Å‚·B‚Ü‚½AƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ªƒZƒ‹“à‚Ì 1 ‚‚̃f[ƒ^ƒx[ƒXEƒT[ƒo[‚ÅŽÀs‚³‚ê‚Ä‚¢‚éê‡‚́A‚»‚̃Zƒ‹‚Ì‚·‚ׂẴf[ƒ^ƒx[ƒXEƒT[ƒo[‚ÅŽÀs‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B", - -1,0,37,210,41 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·‚©?", - IDC_BACKUP_SERVER_QUESTION,0,157,210,10 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·B", - IDC_TITLE,0,0,210,8 - LTEXT "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚̓f[ƒ^ƒx[ƒXEƒT[ƒrƒX‚̃IƒvƒVƒ‡ƒ“‹@”\‚Å‚·B", - -1,0,15,210,16 - LTEXT "‚±‚̃}ƒVƒ“‚Í‚·‚łɃf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B", - IDC_CANT_BACKUP_MSG,0,142,210,57,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 216, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·(&S)B", - IDC_SYS_CONTROL_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,2,142,178,10 - CONTROL "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚č\¬‚µ‚Ü‚·(&C)B", - IDC_SYS_CONTROL_CLIENT,"Button",BS_AUTORADIOBUTTON,2,156, - 160,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,100,169,108,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚Ü‚½‚̓T[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚¹‚ñ(&O)B", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,2,187,201, - 9 - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚́AƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚ÄŽÀs‚³‚ê‚Ä‚¢‚鑼‚Ì AFS ƒT[ƒo[Eƒ}ƒVƒ“‚ɁA‹¤’ʍ\¬ƒtƒ@ƒCƒ‹‚ð’ñ‹Ÿ‚µ‚Ü‚·BAFS ƒZƒ‹‚̓VƒXƒeƒ€§ŒäƒT[ƒo[‚ð 1‚‚¾‚¯ŽÀs‚µ‚Ä‚¢‚邱‚Æ‚ª•K—v‚Å‚·B", - -1,3,17,208,33 - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚Ü‚½‚̓Nƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚č\¬‚µ‚Ü‚·B", - IDC_TITLE,4,4,208,8 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒVƒXƒeƒ€§ŒäƒT[ƒo[‚Ü‚½‚̓Nƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚č\¬‚µ‚Ü‚·‚©?", - IDC_SYS_CONTROL_MACHINE_QUESTION,3,118,208,17 - LTEXT "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚́AƒZƒ‹‚̃VƒXƒeƒ€§ŒäƒT[ƒo[‚©‚ç‚»‚Ì AFS \¬ƒtƒ@ƒCƒ‹‚ɑ΂·‚é—LŒø‚ȍXV‚ð‚·‚×‚ÄŽó‚¯Žæ‚è‚Ü‚·B", - IDC_SYS_CONTROL_CLIENT_DESC,3,55,208,18 - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒo[(&Y):", - IDC_SYS_CONTROL_MACHINE_LABEL,7,170,81,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,2,116,210,84,NOT WS_VISIBLE - LTEXT "Œx: AFS(R) ‚̕č‘‚Ì”z•z‚ðŽg—p‚µ‚Ä‚¢‚È‚¢ƒTƒCƒg‚́AƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ð‰î‚µ‚č\¬ƒtƒ@ƒCƒ‹‚ð”z•z‚·‚ׂ«‚ł͂ ‚è‚Ü‚¹‚ñB”z•z‚·‚邯A‹@–§‚̃VƒXƒeƒ€î•ñ‚ªˆÃ†‰»‚³‚ꂸ‚É“`‘—‚³‚ê‚Ü‚·B", - -1,9,78,193,33 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‚±‚̃VƒXƒeƒ€‚Å‚Ì AFS ƒT[ƒo[‚̍\¬‚É•K—v‚ȏî•ñ‚Í‚±‚ê‚Å‘S•”‚Å‚·B", - IDC_ALL_NEEDED_MSG,1,11,212,16 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒZƒ‹ ‚֍\¬‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_TITLE,1,0,211,8 - LTEXT "ˆÈ‰º‚̍\¬ƒXƒeƒbƒv‚ªŽÀs‚³‚ê‚Ü‚·:", - IDC_FOLLOWING_STEPS_MSG,1,33,130,8 - LTEXT "ƒXƒeƒbƒv 1 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP1, - 22,47,187,8,NOT WS_VISIBLE - LTEXT "ƒXƒeƒbƒv 3 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP3, - 22,71,187,8,NOT WS_VISIBLE - LTEXT "ƒXƒeƒbƒv 2 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP2, - 22,59,187,8,NOT WS_VISIBLE - LTEXT "ƒXƒeƒbƒv 4 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP4, - 22,83,187,8,NOT WS_VISIBLE - LTEXT "ƒXƒeƒbƒv 5 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP5, - 22,95,187,8,NOT WS_VISIBLE - LTEXT "ƒXƒeƒbƒv 6 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP6, - 22,107,187,8,NOT WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,183,211,10 - LTEXT "ƒXƒeƒbƒv 8 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP8, - 22,131,187,8,NOT WS_VISIBLE - LTEXT "ƒXƒeƒbƒv 7 - ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·",IDC_STEP7, - 22,119,187,8,NOT WS_VISIBLE - LTEXT "ƒƒbƒZ[ƒW‚Í•K—v‚È‚çŽÀsŽž‚ɐݒ肳‚ê‚Ü‚·B", - IDC_CANT_CONFIG_MSG,1,13,209,17,NOT WS_VISIBLE - LTEXT "Š®—¹—¦(%):",IDC_PERCENT_COMPLETE_LABEL,1,195,39,8,NOT - WS_VISIBLE - LTEXT "Œ»s‘€ì:",IDC_CURRENT_STEP_LABEL,1,143,31,8,NOT - WS_VISIBLE - LTEXT "Œ»sƒXƒeƒbƒv‚Ì‹Lq - ŽÀsŽž‚ɐݒè",IDC_CURRENT_STEP,3, - 168,209,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,63,195,51,8,NOT WS_VISIBLE - LTEXT "‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚̍\¬‚ðŠJŽn‚·‚é‚ɂ́Au\¬vƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢BŽÀs‚·‚é\¬ƒXƒeƒbƒv‚ð•ύX‚·‚é‚ɂ́Au–ß‚évƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATUS_MSG,1,158,212,44 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_ADMIN_NAME,92,55,118,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,92,71,118,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,92,87,118,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,110,158,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,149,157,11,14 - LTEXT "ŠÇ—î•ñ",IDC_TITLE,0,0,210,8 - LTEXT "–¼‘O(&N):",IDC_ADMIN_NAME_LABEL,7,57,34,8 - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_ADMIN_PW_LABEL,7,73,57,8 - GROUPBOX "ƒAƒJƒEƒ“ƒg–¼‚¨‚æ‚уpƒXƒ[ƒh",IDC_ADMIN_INFO_FRAME,0,41, - 210,65 - LTEXT "ƒpƒXƒ[ƒh‚ÌŒŸ¸(&V):",IDC_VERIFY_ADMIN_PW_LABEL,7,90, - 68,8 - LTEXT "‚±‚̐V‚µ‚¢ƒZƒ‹‚ÌŠÇ—ƒAƒJƒEƒ“ƒg‚̍쐬‚ɂ͈ȉº‚̏î•ñ‚ª•K—v‚Å‚·B", - IDC_STATIC,0,15,206,17 - CONTROL "‚±‚Ì AFS UID ‚ðŽg—p(&S):",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,160,93,10 - CONTROL "ŽŸ‚ÉŽg—p‰Â”\‚È AFS UID ‚ðŽg—p(&U)",IDC_USE_NEXT_UID, - "Button",BS_AUTORADIOBUTTON,6,144,204,10 - GROUPBOX "AFS UID",IDC_STATIC,0,118,209,57 - LTEXT "AFS ŠÇ—ƒAƒJƒEƒ“ƒg‚̃†[ƒU[ ID ‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_STATIC,3,130,200,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚Í‚¢Aƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·(&Y)B", - IDC_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,2,117,204,10 - CONTROL "‚¢‚¢‚¦Aƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚¹‚ñ(&O)B", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,2, - 188,204,10 - LTEXT "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚Í AFS ƒZƒ‹‚ª—v‹‚·‚é•¡»ƒf[ƒ^ƒx[ƒX‚̃Zƒbƒg‚ð•ێ炵‚Ü‚·B‚±‚̃T[ƒrƒX‚̓Zƒ‹‚Ì‚·‚ׂẴAƒJƒEƒ“ƒgAƒ{ƒŠƒ…[ƒ€ˆÊ’uA‚¨‚æ‚Ñ (ƒIƒvƒVƒ‡ƒ“‚Å) ƒoƒbƒNƒAƒbƒvî•ñ‚ð•ێ炵‚Ü‚·B", - -1,0,38,210,31 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·‚©?", - IDC_DB_SERVER_QUESTION,2,101,205,10 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·B", - IDC_TITLE,0,0,210,8 - LTEXT "‚±‚̃}ƒVƒ“‚ðƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚·‚é‚ɂ́Aƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ð\¬‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B", - -1,0,15,210,16 - LTEXT "‚±‚̃}ƒVƒ“‚Í‚·‚łɃf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B", - IDC_MSG,1,157,206,10,NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,91,171,113,12,ES_AUTOHSCROLL - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒo[(&Y):", - IDC_SYS_CONTROL_MACHINE_LABEL,4,173,80,8 - LTEXT "ƒZƒ‹‚ɃVƒXƒeƒ€§ŒäƒT[ƒo[‚ª‚ ‚éê‡‚́A‚»‚̃zƒXƒg–¼‚ð‰º‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢BAFS \¬ƒtƒ@ƒCƒ‹‚Í‚±‚̃T[ƒo[‚ð‰î‚µ‚čXV‚³‚ê‚Ü‚·B", - IDC_SCM_PROMPT,1,134,207,18 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚±‚̃zƒXƒg‚ðŠù‘¶ AFS ƒZƒ‹‚̃T[ƒo[‚É‚·‚é(&M)", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,0,37, - 189,10 - CONTROL "‚±‚ê‚ðV‹K AFS ƒZƒ‹‚̍ŏ‰‚̃T[ƒo[‚É‚·‚é(&T)", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,0,49,188,10 - EDITTEXT IDC_CELL_NAME,64,93,145,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,90,166,119,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,90,180,119,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "ƒZƒ‹‚¨‚æ‚уT[ƒo[î•ñ",IDC_TITLE,0,0,209,8 - LTEXT "ƒZƒ‹–¼(&C):",IDC_CELL_NAME_LABEL,5,95,41,8 - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_SERVER_PW_LABEL,7,167,57,8, - WS_DISABLED - LTEXT "AFS ƒZƒ‹‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_CELL_NAME_PROMPT,14,78,195,11 - LTEXT "AFS ƒvƒŠƒ“ƒVƒpƒ‹‚̃pƒXƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B‚·‚×‚Ä‚Ì AFS ƒT[ƒo[‚ª‚±‚̃vƒŠƒ“ƒVƒpƒ‹‚Æ‚µ‚ăg[ƒNƒ“‚ðŽæ“¾‚µ‚Ü‚·B", - IDC_SERVER_PW_PROMPT,10,130,199,19,WS_DISABLED - GROUPBOX "ƒZƒ‹–¼",IDC_CELL_NAME_FRAME,0,66,210,44 - GROUPBOX "ƒT[ƒo[EƒpƒXƒ[ƒh",IDC_SERVER_PW_FRAME,0,117,210,83, - WS_DISABLED - LTEXT "ƒpƒXƒ[ƒh‚ÌŒŸ¸(&V):",IDC_VERIFY_PW_LABEL,7,180,69,8, - WS_DISABLED - LTEXT "AFS ƒZƒ‹‚́Aƒtƒ@ƒCƒ‹EƒAƒNƒZƒX‚̃†ƒjƒtƒH[ƒ€Eƒl[ƒ€EƒXƒy[ƒX‚ð’ñ‹Ÿ‚·‚éƒT[ƒo[‚̏W‚Ü‚è‚Å‚·B", - IDC_CELL_NAME_PROMPT2,7,14,202,17 - LTEXT "–¼‘O:",IDC_PRINCIPAL_LABEL,7,154,22,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,153,145,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 216, 207 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_ADMIN_NAME,62,45,139,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,62,61,139,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,62,133,139,12,ES_AUTOHSCROLL - LTEXT "ŠÇ—î•ñ",IDC_TITLE,0,0,209,8 - LTEXT "ˆÈ‰º‚ÌŠÇ—ƒAƒJƒEƒ“ƒgî•ñ‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_ADMIN_INFO_PROMPT,7,31,196,10 - LTEXT "–¼‘O(&N):",IDC_ADMIN_NAME_LABEL,7,49,34,8 - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_ADMIN_PW_LABEL,7,65,46,8 - GROUPBOX "ƒAƒJƒEƒ“ƒg–¼‚¨‚æ‚уpƒXƒ[ƒh",IDC_ADMIN_INFO_FRAME,0,17, - 210,62 - GROUPBOX "Šù‘¶‚Ì AFS ƒT[ƒo[",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS ƒT[ƒo[:",IDC_HOSTNAME_LABEL,5,136,46,8 - LTEXT "Œ‹‡‚µ‚½‚¢ƒZƒ‹“à‚Ì‘¼‚Ì AFS ƒT[ƒo[‚̃zƒXƒg–¼‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢BAFS\¬î•ñ‚Í‚±‚̃T[ƒo[‚©‚çŽæ‚èo‚³‚ê‚Ü‚·B", - IDC_HOSTNAME_PROMPT,5,105,199,19 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 265 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "ƒT[ƒrƒX" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "",IDC_STATIC,7,20,281,40 - GROUPBOX "",IDC_STATIC,7,66,281,43 - GROUPBOX "",IDC_STATIC,7,115,281,40 - GROUPBOX "",IDC_STATIC,7,161,281,40 - CONTROL "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX",IDC_FS_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,22,83,10 - CONTROL "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX",IDC_DB_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,65,99,10 - PUSHBUTTON "Ú×...",IDC_DB_DETAILS,225,91,50,14,NOT WS_VISIBLE - CONTROL "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[",IDC_BK_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,114,99,10 - CONTROL "ƒVƒXƒeƒ€§ŒäƒT[ƒo[",IDC_SCS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,160,91,10 - EDITTEXT IDC_SC_MACHINE,137,226,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "‚±‚Ì AFS ƒT[ƒo[‚ÅŽÀs‚·‚éƒT[ƒrƒX‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_STATIC,7,7,213,8 - LTEXT "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚Å‚·B",IDC_FS_STATUS_MSG, - 14,35,261,8 - LTEXT "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ÍŒ»Ýˆê•”‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚Ü‚·B", - IDC_DB_STATUS_MSG,14,78,241,8 - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒo[(&Y):",IDC_SC_MACHINE_LABEL,31,229, - 97,8,WS_DISABLED - LTEXT "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚Ì’âŽ~‚ɂ͏ã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_FS_ACTION_MSG,14,47,268,8 - LTEXT "Ú‚µ‚­‚́uÚ×v‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_DB_ACTION_MSG,14,92,186,8 - LTEXT "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ÍŒ»ÝŽÀs’†‚Å‚·B", - IDC_BK_STATUS_MSG,14,127,259,8 - LTEXT "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚Ì’âŽ~‚͏ã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_BK_ACTION_MSG,14,139,268,8 - LTEXT "‚±‚̃T[ƒo[‚ðŽg—p‰Â”\‚É‚·‚é‚ɂ́Aƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚Ü‚½‚̓f[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ðŽÀs‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B", - IDC_SCS_ACTION_MSG,14,183,268,16 - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚ł͂ ‚è‚Ü‚¹‚ñB", - IDC_SCS_STATUS_MSG,14,172,263,9 - GROUPBOX "",IDC_STATIC,7,207,281,51 - CONTROL "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg",IDC_SCC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,206,107,10 - LTEXT "‚±‚̃T[ƒo[‚ðŽg—p‰Â”\‚É‚·‚é‚ɂ́Aƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚Ü‚½‚̓f[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ðŽÀs‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B", - IDC_SCC_ACTION_MSG,14,239,268,17 - LTEXT "ƒVƒXƒeƒ€§ŒäƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚ł͂ ‚è‚Ü‚¹‚ñB", - IDC_SCC_STATUS_MSG,14,216,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "ƒp[ƒeƒBƒVƒ‡ƒ“" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ˆÈ‰º‚Ì AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ªƒRƒ“ƒsƒ…[ƒ^[‚É‘¶Ý‚µ‚Ü‚·(&A):", - IDC_STATIC,8,7,227,8 - PUSHBUTTON "ì¬(&C)...",IDC_CREATE_PARTITIONS,17,118,66,14 - LTEXT "1 ‚‚̃p[ƒeƒBƒVƒ‡ƒ“‚Ü‚½‚̓p[ƒeƒBƒVƒ‡ƒ“ã‚Ì 1 ‚‚̃{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚·‚é‚ɂ́AƒŠƒXƒg‚̃p[ƒeƒBƒVƒ‡ƒ“‚ð‘I‘ð‚µ‚Äã‚̃{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B‚±‚̃T[ƒo[ã‚Ì‚·‚ׂẴp[ƒeƒBƒVƒ‡ƒ“‚ðƒTƒ‹ƒx[ƒW‚·‚é‚ɂ́Aã‚̃{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_SALVAGE_MSG,30,179,250,30 - PUSHBUTTON "ƒTƒ‹ƒx[ƒW(&S)...",IDC_SALVAGE,17,159,66,14 - LTEXT "íœ‚É‚ÍƒŠƒXƒg‚̃p[ƒeƒBƒVƒ‡ƒ“‚ð‘I‘ð‚µã‚̃{ƒ^ƒ“‚ðƒNƒŠƒbƒNB", - IDC_REMOVE_MSG,30,238,241,12,WS_DISABLED - PUSHBUTTON "íœ(&M)",IDC_REMOVE,17,217,66,14,WS_DISABLED - GROUPBOX "ƒp[ƒeƒBƒVƒ‡ƒ“",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,23, - 281,72,WS_EX_CLIENTEDGE - LTEXT "‚±‚̃T[ƒo[‚ł̐V‹Kƒp[ƒeƒBƒVƒ‡ƒ“ì¬‚́Aã‚̃{ƒ^ƒ“‚ðƒNƒŠƒbƒNB", - IDC_CREATE_MSG,30,139,250,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚̍쐬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "V‚µ‚¢ƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚·‚é NTFS ƒ{ƒŠƒ…[ƒ€‚ðƒŠƒXƒg‚©‚ç‘I‘ð:", - IDC_TITLE,7,5,250,8 - LTEXT "AFS ƒp[ƒeƒBƒVƒ‡ƒ“–¼:",IDC_NAME_STATIC,17,131,77,8 - EDITTEXT IDC_PARTITION_NAME,132,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "ì¬(&C)",IDC_CREATE,96,158,50,14,WS_DISABLED - PUSHBUTTON "ƒNƒ[ƒY(&O)",IDC_CLOSE,152,158,53,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,210,158,40,14 - GROUPBOX "ƒp[ƒeƒBƒVƒ‡ƒ“Eƒpƒ‰ƒ[ƒ^[",IDC_ARGS_FRAME,7,117,250, - 33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,21,250, - 89,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,102,131,22,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 225, 159 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS(R) ƒT[ƒo[‚̍\¬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_ADMIN_NAME,72,33,141,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,72,52,141,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,72,112,141,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "\¬(&C)",IDOK,108,135,50,14,WS_DISABLED - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,48,135,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,168,135,50,14 - LTEXT "ˆÈ‰º‚ÌŠÇ—ƒAƒJƒEƒ“ƒgî•ñ‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_ADMIN_INFO_PROMPT,21,20,196,10 - LTEXT "–¼‘O(&N):",IDC_ADMIN_NAME_LABEL,15,36,44,8 - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_ADMIN_PW_LABEL,15,55,44,8 - GROUPBOX "ƒAƒJƒEƒ“ƒg–¼‚¨‚æ‚уpƒXƒ[ƒh",IDC_ADMIN_INFO_FRAME,7,7, - 211,62 - GROUPBOX "ƒVƒXƒeƒ€§ŒäƒT[ƒo[",IDC_HOSTNAME_FRAME,7,76,211,54 - LTEXT "ƒzƒXƒg–¼(&H):",IDC_HOSTNAME_LABEL,15,115,44,8 - LTEXT "ƒZƒ‹‚ɃVƒXƒeƒ€§ŒäƒT[ƒo[‚ª‚ ‚éê‡‚́A‚»‚̃zƒXƒg–¼‚ð‰º‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢BAFS \¬ƒtƒ@ƒCƒ‹‚Í‚±‚̃T[ƒo[‚ð’Ê‚¶‚čXV‚³‚ê‚Ü‚·B", - IDC_HOSTNAME_PROMPT,10,87,205,22 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,150,225,9,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 87 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS(R) ƒT[ƒo[‚̍\¬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,103,70,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,38,200,11 - LTEXT "Š®—¹—¦(%):",IDC_PERCENT_COMPLETE_LABEL,40,55,45,8,NOT - WS_VISIBLE - LTEXT "Œ»s‘€ì:",IDC_CURRENT_STEP_LABEL,40,4,108,9,NOT - WS_VISIBLE - LTEXT "Œ»sƒXƒeƒbƒv‚Ì‹Lq - ŽÀsŽž‚ɐݒè",IDC_CURRENT_STEP,40, - 4,213,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,55,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,4,20,21 - LTEXT "‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚̍\¬‚ðŠJŽn‚·‚é‚ɂ́Au\¬vƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢BŽÀs‚·‚é\¬ƒXƒeƒbƒv‚ð•ύX‚·‚é‚ɂ́Au–ß‚évƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATUS_MSG,40,18,213,44 - PUSHBUTTON "ƒƒO‚Ì•\ަ(&V)",IDNEXT,160,70,61,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "CellServCB XVƒGƒ‰[" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LISTBOX IDC_LIST,7,32,173,121,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "—¹‰ð",IDOK,22,162,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,75,162,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,130,162,50,14 - LTEXT "ˆÈ‰º‚Ì AFS ƒT[ƒo[‚Ì CellServDB ƒtƒ@ƒCƒ‹‚ðŽ©“®“I‚ɍXV‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½:", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 273, 188 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒTƒ‹ƒx[ƒW" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,79,97,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,133,97,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,187,97,50,14 - CONTROL "‚±‚̃tƒ@ƒCƒ‹EƒT[ƒo[ã‚̃p[ƒeƒBƒVƒ‡ƒ“‚ð‚·‚×‚ÄƒTƒ‹ƒx[ƒW(&S)", - IDC_SERVER,"Button",BS_AUTORADIOBUTTON,11,35,234,10 - CONTROL "‘I‘ð‚µ‚½ƒp[ƒeƒBƒVƒ‡ƒ“ã‚̃{ƒŠƒ…[ƒ€‚ð‚·‚×‚ÄƒTƒ‹ƒx[ƒW(&P)", - IDC_PARTITION,"Button",BS_AUTORADIOBUTTON,11,48,234,10 - CONTROL "‘I‘ð‚µ‚½ƒp[ƒeƒBƒVƒ‡ƒ“ã‚Ì“Á’èƒ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW(&V)", - IDC_VOLUME,"Button",BS_AUTORADIOBUTTON,11,61,234,10 - EDITTEXT IDC_VOLUME_NAME,96,75,97,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< Šg’£(&A) ",IDC_ADVANCED,7,97,50,14 - GROUPBOX "",IDC_STATIC,7,25,261,67 - LTEXT "ƒ{ƒŠƒ…[ƒ€–¼(&N):",IDC_VOLUME_NAME_LABEL,27,76,60,8, - WS_DISABLED - GROUPBOX "Šg’£ƒTƒ‹ƒx[ƒWEƒIƒvƒVƒ‡ƒ“",IDC_ADVANCED_FRAME,7,119, - 259,62 - LTEXT "ˆêŽžƒtƒ@ƒCƒ‹‚̃pƒX(&T):",IDC_TEMP_DIR_LABEL,17,165,89,8 - EDITTEXT IDC_LOG_FILE,113,147,133,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,188,130,21,12,ES_AUTOHSCROLL - LTEXT "Œ‹‰ÊƒƒO‚̃tƒ@ƒCƒ‹–¼(&L):",IDC_LOG_FILE_LABEL,17,149,89, - 8 - EDITTEXT IDC_TEMP_DIR,113,163,133,12,ES_AUTOHSCROLL - CONTROL "•ÀsƒTƒ‹ƒx[ƒW‘€ìAƒvƒƒZƒX”(&R):", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,132,142,10 - LTEXT "ƒT[ƒo[‚Ü‚½‚̓p[ƒeƒBƒVƒ‡ƒ“‘S‘Ì‚ðƒTƒ‹ƒx[ƒW‚·‚邯AƒT[ƒo[‚͈ꎞ“I‚ɃIƒtƒ‰ƒCƒ“‚ɂȂè‚Ü‚·B", - IDC_STATIC,37,7,198,17 - LTEXT "’:",IDC_STATIC,9,7,15,8 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,180,243,8,NOT WS_VISIBLE -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS ƒvƒŠƒ“ƒVƒpƒ‹EƒpƒXƒ[ƒh" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_PW,50,39,140,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,31,61,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,85,61,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,140,61,50,14 - LTEXT "AFS ƒvƒŠƒ“ƒVƒpƒ‹Œ®‚Í 3.5 ˆÈ‘O‚Ì”FØƒT[ƒo[‚©‚çŽæ‚èo‚¹‚Ü‚¹‚ñBAFS ƒvƒŠƒ“ƒVƒpƒ‹EƒpƒXƒ[ƒh‚ð‰º‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,7,7,183,21 - LTEXT "ƒpƒXƒ[ƒh:",IDC_STATIC,7,41,37,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃Tƒ‹ƒx[ƒW - Œ‹‰Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "ƒNƒ[ƒY(&C)",IDC_CLOSE,225,266,53,14,WS_DISABLED - PUSHBUTTON "ƒwƒ‹ƒv",9,280,266,50,14 - LTEXT "<ŽÀsŽž‚ɐݒè>",IDC_LOG_TITLE,9,36,317,8 - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "<ŽÀsŽž‚ɐݒè>",IDC_SALVAGE_STATUS,33,9,293,16 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 322 - TOPMARGIN, 7 - BOTTOMMARGIN, 240 - HORZGUIDE, 207 - END - - IDD_PARTITION_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 214 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 215 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_SYS_CONTROL_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 214 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 209 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 210 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - VERTGUIDE, 64 - VERTGUIDE, 209 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 53 - VERTGUIDE, 209 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 218 - VERTGUIDE, 59 - VERTGUIDE, 217 - TOPMARGIN, 7 - BOTTOMMARGIN, 152 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 253 - VERTGUIDE, 40 - TOPMARGIN, 4 - BOTTOMMARGIN, 84 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS(R) \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚¨‚æ‚уEƒBƒU[ƒh""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "ŽŸ‚Ö(&N) >" - IDS_FINISH "I—¹(&F)" - IDS_HELP_TITLE "ƒwƒ‹ƒvEƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ê‚Ü‚µ‚½B" - IDS_HELP_DESC "ƒwƒ‹ƒv‚ÍŒ»Žž“_‚ł͎g—p‚Å‚«‚Ü‚¹‚ñB" - IDS_CANCEL_DESC "AFS ƒNƒBƒbƒNEƒXƒ^[ƒgEƒEƒBƒU[ƒh‚ðŽæ‚èÁ‚µ‚Ü‚·‚©?" - IDS_PARTITION_ALREADY_CREATED - "AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ª‚·‚łɂ±‚̃}ƒVƒ“‚É‘¶Ý‚µ‚Ü‚·B" - IDS_NOT_A_FS_SERVER "‚±‚̃}ƒVƒ“‚̓tƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBƒ{ƒŠƒ…[ƒ€‚̓tƒ@ƒCƒ‹EƒT[ƒo[Eƒ}ƒVƒ“ã‚ł̂ݍ쐬‚ª‰Â”\‚Å‚·B" - IDS_ROOT_AFS_ALREADY_EXISTS "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ª‚·‚łɑ¶Ý‚µ‚Ü‚·B" - IDS_NO_PARTITION_EXISTS "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚·‚éƒp[ƒeƒBƒVƒ‡ƒ“‚ª‘¶Ý‚µ‚Ü‚¹‚ñBƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚·‚邽‚߂ɂ́Aƒp[ƒeƒBƒVƒ‡ƒ“‚ª‘¶Ý‚µ‚Ä‚¢‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_ALREADY_REPLICATED "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚Í‚·‚łɕ¡»‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_ROOT_AFS_DOESNT_EXIST - "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ª‘¶Ý‚µ‚Ü‚¹‚ñB•¡»‚·‚邽‚߂ɂ́Aƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ª‘¶Ý‚µ‚Ä‚¢‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_ALREADY_CONFIGURED "‚±‚̃}ƒVƒ“‚Í‚·‚Å‚É AFS ƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_NOTHING_TO_CONFIGURE "\¬‚·‚é‘Ώۂª‘I‘ð‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_EXIT "I—¹" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "ƒtƒ@ƒCƒ‹EƒT[ƒo[‚ÌŠJŽn’†" - IDS_CANCEL_CONFIG_MSG "‚±‚ÌŽž“_‚ÅŽæ‚èÁ‚·‚ƁAƒRƒ“ƒsƒ…[ƒ^[‚ª•”•ª“I‚É AFS ƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ꂽ‚܂܂ɂȂè‚Ü‚·BŽæ‚èÁ‚µ‚Ü‚·‚©?" - IDS_WIZARD_APP_TITLE "AFS(R) ƒT[ƒo[EƒNƒBƒbƒNEƒXƒ^[ƒgEƒEƒBƒU[ƒh" - IDS_CANCEL_PENDING "*** Žæ‚èÁ‚µ•Û—¯’† - ‚¨‘Ò‚¿‚­‚¾‚³‚¢... ***" - IDS_CHECK_FS_CONFIG "ƒtƒ@ƒCƒ‹EƒT[ƒo[ŒŸ¸..." - IDS_CHECK_DB_CONFIG "ƒf[ƒ^ƒx[ƒXEƒT[ƒo[ŒŸ¸..." - IDS_CHECK_BAK_CONFIG "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[ŒŸ¸..." - IDS_CHECK_PARTITION "AFS ƒp[ƒeƒBƒVƒ‡ƒ“ŒŸ¸..." - IDS_CHECK_ROOT_AFS "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€ŒŸ¸..." - IDS_CHECK_REP "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€•¡»ŒŸ¸..." - IDS_CANCEL_GET_CONFIG "Žæ‚èÁ‚µ’†...‚¨‘Ò‚¿‚­‚¾‚³‚¢..." - IDS_ALREADY_A_BACKUP_SERVER - "‚±‚̃}ƒVƒ“‚Í‚·‚łɃoƒbƒNƒAƒbƒvEƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_NOT_A_DB_SERVER "‚±‚̃}ƒVƒ“‚̓f[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚̓f[ƒ^ƒx[ƒXEƒT[ƒo[Eƒ}ƒVƒ“ã‚ł̂ݎÀs‚ª‰Â”\‚Å‚·B" - IDS_ALREADY_A_SYS_CONTROL_SERVER - "‚±‚̃}ƒVƒ“‚Í‚·‚łɃVƒXƒeƒ€§ŒäƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_ALREADY_A_SYS_CONTROL_CLIENT - "‚±‚̃}ƒVƒ“‚Í‚·‚łɃVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_SC_NOT_A_DB_OR_FS_SERVER - "‚±‚̃}ƒVƒ“‚̓f[ƒ^ƒx[ƒX‚Ü‚½‚̓tƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBƒRƒ“ƒsƒ…[ƒ^[‚̓f[ƒ^ƒx[ƒX‚Ü‚½‚̓tƒ@ƒCƒ‹EƒT[ƒo[Eƒ}ƒVƒ“‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚éê‡‚ɂ̂݁AƒVƒXƒeƒ€§Œäƒ}ƒVƒ“‚Æ‚µ‚č\¬‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "ƒ{ƒŠƒ…[ƒ€" - IDS_NAME_OR_ERROR "–¼‘O (‚Ü‚½‚̓Gƒ‰[EƒƒbƒZ[ƒW)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "‚±‚̃}ƒVƒ“‚̓f[ƒ^ƒx[ƒX‚Ü‚½‚̓tƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBƒRƒ“ƒsƒ…[ƒ^[‚̓f[ƒ^ƒx[ƒX‚Ü‚½‚̓tƒ@ƒCƒ‹EƒT[ƒo[Eƒ}ƒVƒ“‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚éê‡‚ɂ̂݁AƒoƒCƒiƒŠ[”z•zƒ}ƒVƒ“‚Æ‚µ‚č\¬‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B" - IDS_CHECK_SCS "ƒVƒXƒeƒ€§ŒäƒT[ƒo[ŒŸ¸..." - IDS_CHECK_SCC "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒgŒŸ¸..." - IDS_SIZE "ƒTƒCƒY" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "ƒZƒ‹“à‚̍ŏ‰‚Ì AFS ƒT[ƒo[‚Å‚ ‚邽‚߁Aƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚̓fƒtƒHƒ‹ƒg‚ō\¬‚³‚ê‚Ü‚·B" - IDS_MUST_CONFIG_DB "ƒZƒ‹“à‚̍ŏ‰‚Ì AFS ƒT[ƒo[‚Å‚ ‚邽‚߁Aƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚̓fƒtƒHƒ‹ƒg‚ō\¬‚³‚ê‚Ü‚·B" - IDS_MUST_MAKE_PARTITION "ƒZƒ‹“à‚̍ŏ‰‚Ì AFS ƒT[ƒo[‚Å‚ ‚邽‚߁Aƒp[ƒeƒBƒVƒ‡ƒ“‚̍쐬‚ª•K—v‚Å‚·B" - IDS_MUST_CREATE_ROOT_AFS - "ƒZƒ‹“à‚̍ŏ‰‚Ì AFS ƒT[ƒo[‚Å‚ ‚邽‚߁Aroot.afs ‚¨‚æ‚Ñ root.cell ƒ{ƒŠƒ…[ƒ€‚̓fƒtƒHƒ‹ƒg‚ō쐬‚³‚ê‚Ü‚·B" - IDS_MUST_REPLICATE "ƒZƒ‹“à‚̍ŏ‰‚Ì AFS ƒT[ƒo[‚Å‚ ‚邽‚߁Aroot.afs ‚¨‚æ‚Ñ root.cell ƒ{ƒŠƒ…[ƒ€‚̓fƒtƒHƒ‹ƒg‚Å•¡»‚³‚ê‚Ü‚·B" - IDS_CHECK_AFS_CLIENT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒCƒ“ƒXƒg[ƒ‹ŒŸ¸..." - IDS_ERROR_HOST_NAME "‚±‚̃}ƒVƒ“‚̃zƒXƒg–¼‚𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_DRIVE_COMPRESSED "ƒhƒ‰ƒCƒu‚ªˆ³k‚³‚ê‚Ä‚¢‚Ü‚·" - IDS_ERROR_CFG_HOST_OPEN "ƒT[ƒo[\¬ƒ‰ƒCƒuƒ‰ƒŠ[‚̏‰Šú‰»‚ªŽ¸”s‚µ‚Ü‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ð’âŽ~’†‚Å‚·" - IDS_ERROR_LOCAL_HOST_NAME - "‚±‚̃}ƒVƒ“‚̃[ƒJƒ‹EƒzƒXƒg–¼‚𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_GET_TOKENS_ERROR "ƒg[ƒNƒ“‚̎擾‚ÉŽ¸”s‚µ‚Ü‚µ‚½B“ü—Í‚µ‚½ƒ†[ƒU[–¼‚ƃpƒXƒ[ƒh‚ª³‚µ‚¢‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ªŽn“®‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁AƒTƒ‹ƒx[ƒW‚ðŽÀs‚Å‚«‚Ü‚¹‚ñBƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ðŽn“®‚µ‚Ä‚©‚çAƒTƒ‹ƒx[ƒW‚ðÄŽŽs‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SALVAGING "ƒTƒ‹ƒx[ƒW‚ªis’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢..." - IDS_CURRENT_SALVAGE_LOG "ƒTƒ‹ƒx[ƒWEƒƒO‚ÌŒ»sƒRƒ“ƒeƒ“ƒc:" - IDS_FINAL_SALVAGE_LOG "ƒTƒ‹ƒx[ƒWEƒƒO‚̍ŏIƒRƒ“ƒeƒ“ƒc:" - IDS_SALVAGE_COMPLETE "ƒTƒ‹ƒx[ƒW‚ªŠ®—¹‚µ‚Ü‚µ‚½B" - IDS_CANT_GET_SALVAGE_LOG "ƒTƒ‹ƒx[ƒWEƒƒO‚ðŒŸõ‚Å‚«‚Ü‚¹‚ñB" - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK - "ƒTƒ‹ƒx[ƒWEƒƒO‚ðƒfƒBƒXƒN‚ɕۊǂł«‚Ü‚¹‚ñB" - IDS_VALIDATION_ERROR_TEMPLATE - "Žw’肳‚ꂽ %1 ‚ª–³Œø‚Å‚·B%2 ‚ðÄ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_CELL_NAME_VALIDATION_TYPE "ƒZƒ‹–¼" - IDS_SERVER_NAME_VALIDATION_TYPE "ƒT[ƒo[–¼" - IDS_PASSWORD_VALIDATION_TYPE "ƒpƒXƒ[ƒh" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "ƒ†[ƒU[–¼" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBAFS ƒT[ƒo[‚ð\¬‚·‚邽‚߂ɂ́AAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚Ä‚¨‚­•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_ERROR_AFS_CLIENT_CHECK - "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_FS_IS_NOT_NTFS "ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ª NTFS ‚ł͂ ‚è‚Ü‚¹‚ñ" - IDS_ERROR_DRIVE_HAS_DATA "ƒhƒ‰ƒCƒu‚Ƀf[ƒ^‚ªŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·" - IDS_PARTITION_STEP_DESC "AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚µ‚Ü‚·" - IDS_ERROR_DRIVE_CONTAINS_NT - "ƒhƒ‰ƒCƒu‚É NT ƒCƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚ªŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·" - IDS_DB_STEP_DESC "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ðŠJŽn‚µ‚Ü‚·" - IDS_FS_STEP_DESC "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ðŠJŽn‚µ‚Ü‚·" - IDS_SCC_STEP_DESC "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ðŠJŽn‚µ‚Ü‚·" - IDS_SCS_STEP_DESC "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ðŠJŽn‚µ‚Ü‚·" - IDS_ROOT_AFS_STEP_DESC "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ðì¬‚µ‚Ü‚·" - IDS_REP_STEP_DESC "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚𕡐»‚µ‚Ü‚·" - IDS_PARTITIONS_PAGE_TITLE "ƒp[ƒeƒBƒVƒ‡ƒ“" - IDS_CONFIGURE "\¬(&C)" - IDS_DB_AND_BK_STEP_DESC "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX (ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ðŠÜ‚Þ) ‚ðŠJŽn‚µ‚Ü‚·" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚̍쐬’†" - IDS_CONFIG_COMMON_FUNCS "‚·‚ׂẴT[ƒrƒX‚É‹¤’ʂ̋@”\‚ð\¬’†" - IDS_START_DB_STEP "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ÌŠJŽn’†" - IDS_START_SCC_STEP "ƒVƒXƒeƒ€§ŒäƒT[ƒrƒX‚ðƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚Æ‚µ‚ÄŠJŽn’†" - IDS_START_SCS_STEP "ƒVƒXƒeƒ€§ŒäƒT[ƒrƒX‚ðƒVƒXƒeƒ€§ŒäƒT[ƒo[‚Æ‚µ‚ÄŠJŽn’†" - IDS_CREATE_ROOT_AFS_STEP "root.afs ƒ{ƒŠƒ…[ƒ€‚̍쐬’†" - IDS_REP_STEP "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚Ì•¡»’†" - IDS_START_AUTH_STEP "‚±‚̃T[ƒo[‚̃g[ƒNƒ“‚ðŽæ“¾’†" - IDS_SERVICES_PAGE_TITLE "ƒT[ƒrƒX" - IDS_CONFIG_SUCCEEDED "\¬‚ª³í‚ɍs‚í‚ê‚Ü‚µ‚½B" - IDS_CONFIG_CANCELED "\¬‚ªŽæ‚èÁ‚³‚ê‚Ü‚µ‚½B" - IDS_CONFIG_FAILED "\¬‚ªŽ¸”s‚µ‚Ü‚µ‚½B\r\n\r\nÚ×ƒƒOEƒtƒ@ƒCƒ‹ %1 ‚ª %2 ‚ɍ쐬‚³‚ê‚Ü‚µ‚½B" - IDS_ERROR_NO_LICENSE_NUM "AFS ƒ‰ƒCƒZƒ“ƒX”ԍ†‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_VERIFY_CLIENT_INSTALL_STEP "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚̃Cƒ“ƒXƒg[ƒ‹‚ðŒŸ¸’†" - IDS_SET_SERVER_LICENSE_STEP "‚±‚̃T[ƒo[‚̃‰ƒCƒZƒ“ƒX‚ðÝ’è’†" - IDS_DEFINE_CELL_NAME_STEP "‚±‚̃Zƒ‹‚Ì–¼‘O‚ð’è‹`’†" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP "‚±‚̃T[ƒo[‚ðƒZƒ‹‚̃ƒ“ƒo[‚É‚µ‚Ä‚¢‚Ü‚·" - IDS_START_BOS_SERVER_STEP "BOS ƒT[ƒo[‚ÌŠJŽn’†" - IDS_START_AUTH_SERVER_STEP "”FØƒT[ƒo[‚ÌŠJŽn’†" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP "‚±‚̃T[ƒo[‚̃vƒŠƒ“ƒVƒpƒ‹‚ÆŒ®‚ðì¬’†" - IDS_START_DB_AND_BK_STEP - "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX (ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ðŠÜ‚Þ) ‚ÌŠJŽn’†" - IDS_CREATE_ADMIN_PRINCIPAL_STEP "ƒZƒ‹ŠÇ—ƒvƒŠƒ“ƒVƒpƒ‹‚̍쐬’†" - IDS_START_CLIENT_STEP "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ÌŠJŽn’†" - IDS_SET_ROOT_ACL_STEP "root.afs ƒ{ƒŠƒ…[ƒ€‚Ì ACL ‚ðÝ’è’†" - IDS_CREATE_ROOT_CELL_STEP "root.cell ƒ{ƒŠƒ…[ƒ€‚̍쐬’†" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP - "•W€ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðŽg—p‚µ‚Ä root.cell ƒ{ƒŠƒ…[ƒ€‚ðƒ}ƒEƒ“ƒg’†" - IDS_SET_ROOT_CELL_ACL_STEP "root.cell ƒ{ƒŠƒ…[ƒ€‚Ì ACL ‚ðÝ’è’†" - IDS_MOUNT_ROOT_CELL_RW_STEP - "“ǂݎæ‚è/‘‚«ž‚݃}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðŽg—p‚µ‚Ä root.cell ƒ{ƒŠƒ…[ƒ€‚ðƒ}ƒEƒ“ƒg’†" - IDS_ENABLE_AUTH_CHECKING_STEP "”FØƒ`ƒFƒbƒN‚ðŽg—p‰Â”\‚É‚µ‚Ä‚¢‚Ü‚·" - IDS_OBTAIN_ADMIN_CREDS_STEP "ŠÇ—ƒg[ƒNƒ“‚̎擾’†" - IDS_RESTART_SERVERS_STEP - "‚±‚̃}ƒVƒ“‚Ì‚·‚ׂẴT[ƒo[‚ð”FØƒT[ƒo[‚Æ‚µ‚čĎn“®’†" - IDS_ALREADY_A_FS_SERVER "‚±‚̃}ƒVƒ“‚Í‚·‚łɃtƒ@ƒCƒ‹EƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "‚±‚̃}ƒVƒ“‚Í‚·‚łɃf[ƒ^ƒx[ƒXEƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_INTRO_PAGE "Ð‰î" - IDS_INFO_PAGE "ƒZƒ‹‚¨‚æ‚уT[ƒo[î•ñ" - IDS_FS_PAGE "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX" - IDS_DB_PAGE "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX" - IDS_CFG_TOOL_APP_TITLE "AFS(R) ƒT[ƒo[‚̍\¬" - IDS_BK_PAGE "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[" - IDS_ROOT_AFS_PAGE "ƒ‹[ƒg AFS ƒ{ƒŠƒ…[ƒ€" - IDS_NAME "–¼‘O" - IDS_REP_PAGE "•¡»" - IDS_SC_PAGE "ƒVƒXƒeƒ€§ŒäƒT[ƒrƒX" - IDS_CONFIG_PAGE "ƒVƒXƒeƒ€‚̍\¬" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "AFS ƒp[ƒeƒBƒVƒ‡ƒ“" - IDS_GRAPHIC_FONT "‚l‚r ‚oƒSƒVƒbƒN, 9, B" - IDS_CURRENT_STEP "Œ»sƒXƒeƒbƒv:" - IDS_ADD_TO_CELLSERVDB_STEP "‚±‚̃T[ƒo[‚ð CellServDB ‚ɒljÁ’†" - IDS_RESTART_ALL_DB_SERVERS_STEP - "ƒZƒ‹“à‚Ì‚·‚ׂẴf[ƒ^ƒx[ƒXEƒT[ƒo[‚ðÄŽn“®’†" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "\¬‚ª³í‚ɍs‚í‚ê‚Ü‚µ‚½B’: ƒZƒ‹“à‚Ì‚·‚×‚Ä‚Ì AFS ƒNƒ‰ƒCƒAƒ“ƒg‚Ì CellServDB ƒtƒ@ƒCƒ‹‚ªXV‚³‚ê‚Ä‚¢‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñBƒZƒ‹‚𑼂̃TƒCƒg‚ÅŽg—p‰Â”\‚É‚·‚éê‡‚́Aƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚̍ŐVƒŠƒXƒg‚ð AFS »•iƒTƒ|[ƒg‚É’ñ‹Ÿ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SYS_CONTROL_SERVER_ONLY_MSG - "‚±‚̃}ƒVƒ“‚ðƒVƒXƒeƒ€§ŒäƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG - "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚Æ‚µ‚č\¬‚µ‚Ü‚¹‚ñ(&O)B" - IDS_CLIENT_CELL_WILL_CHANGE - "AFS ƒT[ƒo[‚̍\¬‚ł́AAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ªƒT[ƒo[‚Æ“¯‚¶ƒZƒ‹‚ɍ\¬‚³‚ê‚Ä‚¢‚邱‚Æ‚ª•K—v‚Å‚·B‚±‚ê‚ÍŽ©“®“I‚ɍs‚í‚ê‚Ü‚·B" - IDS_INFO_PAGE2 "ŠÇ—î•ñ" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "\¬‚ª³í‚ɍs‚í‚ê‚Ü‚µ‚½B\r\n\r\n’: ƒZƒ‹‚𑼂̃TƒCƒg‚ÅŽg—p‰Â”\‚É‚·‚éê‡‚́Aƒf[ƒ^ƒx[ƒXEƒT[ƒo[‚ÌƒŠƒXƒg‚ð AFS »•iƒTƒ|[ƒg‚É’ñ‹Ÿ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_CONFIG_SCS "ƒZƒ‹‚̃VƒXƒeƒ€§ŒäƒT[ƒo[‚Æ‚µ‚č\¬B" - IDS_CONFIG_INTO_CELL_MSG "‚±‚̃zƒXƒg‚ðƒZƒ‹‚ɍ\¬‚µ‚Ü‚·" - IDS_VIEW_LOG "ƒƒO‚Ì•\ަ(&V)" - IDS_VIEW_LOG_ERROR "ƒƒOEƒtƒ@ƒCƒ‹‚ð•\ަ‚Å‚«‚Ü‚¹‚ñ" - IDS_ERROR_NO_LOG_FILE "ƒƒOEƒtƒ@ƒCƒ‹‚ª‘¶Ý‚µ‚Ü‚¹‚ñB" - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED - "ƒzƒXƒg‚Ì CellServDB ‚ªXV‚³‚ê‚Ü‚µ‚½ " - IDS_UPDATING_CELLSERVDB_HOST_FAILED - "ƒzƒXƒg‚Ì CellServDB ‚̍XV‚ªŽ¸”s‚µ‚Ü‚µ‚½ " - IDS_CELL_NAME_LEN_ERROR "“ü—Í‚µ‚½ƒZƒ‹–¼‚ª’·‚·‚¬‚Ü‚·BƒZƒ‹–¼‚Í 64 •¶ŽšˆÈ“à‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B" - IDS_CONFIG_CHECK_FAILED "‚±‚̃}ƒVƒ“‚ÌŒ»s\¬‚𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_YES "‚Í‚¢" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "‚¢‚¢‚¦" - IDS_FREE "‹ó‚«ƒXƒy[ƒX" - IDS_TOTAL "‡ŒvƒTƒCƒY" - IDS_DRIVE2 "ƒhƒ‰ƒCƒu" - IDS_SERVICE_STATUS "ó‹µ" - IDS_SERVICE "ƒT[ƒrƒX" - IDS_FS_RUNNING "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚Å‚·B" - IDS_FS_STOPPED "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ÍŒ»ÝŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚Å‚·B" - IDS_DB_STOPPED "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ÍŒ»ÝŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_BK_RUNNING "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚Å‚·B" - IDS_BK_STOPPED "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ÍŒ»ÝŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_SCS_STOPPED "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ÍŒ»ÝŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_SCC_STOPPED "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ÍŒ»ÝŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_FS_HOW_TO_RUN "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ðŠJŽn‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_FS_HOW_TO_STOP "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ð’âŽ~‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_DB_HOW_TO_RUN "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ðŠJŽn‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_DB_HOW_TO_STOP "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ð’âŽ~‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_BK_HOW_TO_RUN "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ðŠJŽn‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ð’âŽ~‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SCS_HOW_TO_RUN "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ðŠJŽn‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SCS_HOW_TO_STOP "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ð’âŽ~‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_DB_PARTIAL_CONFIG "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚Í•”•ª“I‚ɍ\¬‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_DB_DETAILS "Ú‚µ‚­‚́uÚ×vƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_BK_DISABLED "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ªŽg—p•s‰Â‚ɂȂÁ‚Ä‚¢‚Ü‚·B" - IDS_BK_ENABLE "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ðŽg—p‰Â”\‚É‚·‚é‚ɂ́Aƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ðŽÀs‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_SC_DISABLED "‚±‚̃T[ƒo[‚ÍŽg—p•s‰Â‚ɂȂÁ‚Ä‚¢‚Ü‚·B" - IDS_SC_ENABLE "‚±‚̃T[ƒo[‚ðŽg—p‰Â”\‚É‚·‚é‚ɂ́Aƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚Ü‚½‚̓f[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ðŽÀs‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_FS_WILL_RUN "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ªŠJŽn‚³‚ê‚Ü‚·B" - IDS_FS_WILL_STOP "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ª’âŽ~‚³‚ê‚Ü‚·B" - IDS_DB_WILL_RUN "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ªŠJŽn‚³‚ê‚Ü‚·B" - IDS_DB_WILL_STOP "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ª’âŽ~‚³‚ê‚Ü‚·B" - IDS_BK_WILL_RUN "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ªŠJŽn‚³‚ê‚Ü‚·B" - IDS_BK_WILL_STOP "ƒoƒbƒNƒAƒbƒvEƒT[ƒrƒX‚ª’âŽ~‚³‚ê‚Ü‚·B" - IDS_SCS_WILL_RUN "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ªŠJŽn‚³‚ê‚Ü‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ª’âŽ~‚³‚ê‚Ü‚·B" - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "ƒhƒ‰ƒCƒu‚Í‚·‚Å‚É AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚Å‚·" - IDS_VOLUME_HAS_NO_NAME "<ƒ{ƒŠƒ…[ƒ€‚É–¼‘O‚ª‚ ‚è‚Ü‚¹‚ñ>" - IDS_PARTITION_CREATED "V‹K AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ª³í‚ɍ쐬‚³‚ê‚Ü‚µ‚½B" - IDS_PARTITION_EXISTS "“ü—Í‚µ‚½ƒp[ƒeƒBƒVƒ‡ƒ“–¼‚Í‚·‚łɑ¼‚̃p[ƒeƒBƒVƒ‡ƒ“‚ÉŽg—p‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_SCS_RUNNING "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ÍŒ»ÝŽÀs’†‚Å‚·B" - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN - "‚±‚̃hƒ‰ƒCƒu‚ɂ͂²‚Ý” ‚݂̂ªŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·B" - IDS_SCC_WILL_RUN "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ªŠJŽn‚³‚ê‚Ü‚·B" - IDS_SCC_WILL_STOP "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ª’âŽ~‚³‚ê‚Ü‚·B" - IDS_SCC_RUNNING "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ÍŒ»ÝŽÀs’†‚Å‚·B" - IDS_SCC_HOW_TO_RUN "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ðŠJŽn‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SCC_HOW_TO_STOP "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ð’âŽ~‚·‚é‚ɂ́Aã‚̃{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‰ðœ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SCS_ENABLE "‚±‚̃T[ƒo[‚ðŽg—p‰Â”\‚É‚·‚é‚ɂ́AƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ÌŽÀs‚ð’âŽ~‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_SCC_ENABLE "‚±‚̃T[ƒo[‚ðŽg—p‰Â”\‚É‚·‚é‚ɂ́AƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ÌŽÀs‚ð’âŽ~‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_UNCONFIG_DB_STEP "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚̍\¬‰ðœ" - IDS_UNCONFIG_DB_STEP_DESC "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ð\¬‰ðœ‚µ‚Ü‚·" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP - "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX (‚¨‚æ‚уoƒbƒNƒAƒbƒvEƒT[ƒo[) ‚̍\¬‰ðœ" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC - "ƒf[ƒ^ƒx[ƒXEƒT[ƒrƒX (‚¨‚æ‚уoƒbƒNƒAƒbƒvEƒT[ƒo[) ‚ð\¬‰ðœ‚µ‚Ü‚·" - IDS_UNCONFIG_BK_STEP "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚̍\¬‰ðœ" - IDS_UNCONFIG_BK_STEP_DESC "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ð\¬‰ðœ‚µ‚Ü‚·" - IDS_UNCONFIG_FS_STEP "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚̍\¬‰ðœ" - IDS_UNCONFIG_FS_STEP_DESC "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ð\¬‰ðœ‚µ‚Ü‚·" - IDS_UNCONFIG_SCS_STEP "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚̍\¬‰ðœ" - IDS_UNCONFIG_SCS_STEP_DESC "ƒVƒXƒeƒ€§ŒäƒT[ƒo[‚ð\¬‰ðœ‚µ‚Ü‚·" - IDS_UNCONFIG_SCC_STEP "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚̍\¬‰ðœ" - IDS_UNCONFIG_SCC_STEP_DESC "ƒVƒXƒeƒ€§ŒäƒNƒ‰ƒCƒAƒ“ƒg‚ð\¬‰ðœ‚µ‚Ü‚·" - IDS_INVALIDATE_CONFIG_INFO_STEP "‚±‚̃}ƒVƒ“‚̍\¬î•ñ‚𖳌ø‚É‚·‚é" - IDS_CLOSE "ƒNƒ[ƒY(&C)" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "CellServDB ƒtƒ@ƒCƒ‹‚ª‰º‚Ì AFS ƒT[ƒo[‚ōXV‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B‚±‚ê‚͏d‘å‚ȃGƒ‰[‚ł͂ ‚è‚Ü‚¹‚ñB\r\n" - IDS_DELETE_PARTITION_PROMPT "ƒp[ƒeƒBƒVƒ‡ƒ“ '%1' ‚ðíœ‚µ‚Ü‚·‚©?" - IDS_INVALIDATE_CFG_INFO "Œ»Ý‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚ÅŽÀs’†‚Ì AFS ƒT[ƒo[EƒvƒƒZƒX‚Í‚ ‚è‚Ü‚¹‚ñB‚±‚̃}ƒVƒ“‚©‚ç\¬î•ñ‚ðíœ‚µ‚Ü‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "ƒZƒ‹‚ª‘¶Ý‚µ‚Ü‚¹‚ñBAFS \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚́AAFS ƒZƒ‹‚ɍ\¬Ï‚݂ł ‚éƒT[ƒo[Eƒ}ƒVƒ“‚̍\¬‚ɂ̂ݎg—p‚Å‚«‚Ü‚·BAFS \¬ƒEƒBƒU[ƒh‚ðŽg—p‚µ‚ĐV‚µ‚¢ƒZƒ‹‚ðŠJŽn‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B" - IDS_CFG_MAN_CANT_CONTINUE - "AFS \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðI—¹‚µ‚Ü‚·B‚±‚ê‚Í AFS ƒT[ƒo[‚Æ‚µ‚č\¬Ï‚݂̃}ƒVƒ“‚ł̂ݎÀs‚ª‰Â”\‚Å‚·B‚±‚̃}ƒVƒ“‚ð AFS ƒT[ƒo[‚Æ‚µ‚Ä‚à‚¤ˆê“x\¬‚·‚é‚ɂ́AAFS \¬ƒEƒBƒU[ƒh‚ðŽÀs‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_CONFIG_INFO_INVALIDATED - "‚±‚̃}ƒVƒ“‚Í AFS ƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBAFS \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚́AAFS ƒT[ƒo[Eƒ}ƒVƒ“‚̍\¬‚ɂ̂ݎg—p‚Å‚«‚Ü‚·BAFS \¬ƒEƒBƒU[ƒh‚ðŽg—p‚µ‚āA‚±‚̃}ƒVƒ“‚ð AFS ƒT[ƒo[‚Æ‚µ‚čč\¬‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B" - IDS_GET_TOKENS_FAILED "Žw’肳‚ꂽƒZƒ‹‚̃g[ƒNƒ“‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ÌŠJŽn" - IDS_BK_STEP_DESC "ƒoƒbƒNƒAƒbƒvEƒT[ƒo[‚ðŠJŽn‚µ‚Ü‚·" - IDS_CONFIG_ERROR "\¬ƒGƒ‰[‚ª‹N‚«‚Ü‚µ‚½" - IDS_CREATE_PARTITION_ERROR "ƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚Å‚«‚Ü‚¹‚ñ" - IDS_REMOVE_PARTITION_ERROR "ƒp[ƒeƒBƒVƒ‡ƒ“‚ðíœ‚Å‚«‚Ü‚¹‚ñ" - IDS_READ_PARTITIONS_ERROR "ƒp[ƒeƒBƒVƒ‡ƒ“Eƒe[ƒuƒ‹‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\nCellServDB XVƒvƒƒZƒX‚ª—\Šú‚¹‚¸I—¹‚µ‚Ü‚µ‚½BƒT[ƒo[‚Ì‚·‚ׂĂ͍XV‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_GET_PARTITION_LIST_ERROR - "‚±‚̃T[ƒo[‚̃p[ƒeƒBƒVƒ‡ƒ“‚𔻕ʂł«‚Ü‚¹‚ñ" - IDS_EXPORTED "ƒGƒNƒXƒ|[ƒgÏ‚Ý" - IDS_CANT_DELETE_EXPORTED_PARTITION - "ƒtƒ@ƒCƒ‹EƒT[ƒrƒX‚ÌŽÀs’†‚ɃGƒNƒXƒ|[ƒg‚³‚ꂽƒp[ƒeƒBƒVƒ‡ƒ“‚ðíœ‚·‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚ðíœ‚·‚é‘O‚Ƀtƒ@ƒCƒ‹EƒT[ƒrƒX‚ð’âŽ~‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_CHECK_CONFIG_INFO "—LŒø‚ȍ\¬î•ñ‚ÌŒŸ¸’†‚Å‚·..." - IDS_ERROR_CFG_HOST_CLOSE - "ƒT[ƒo[\¬ƒ‰ƒCƒuƒ‰ƒŠ[‚̃Nƒ[ƒY‚ÉŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_FAILED_OPEN_CELL "ƒZƒ‹‚̃I[ƒvƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_FAILED_OPEN_NULL_CELL "NULL ƒZƒ‹Eƒnƒ“ƒhƒ‹‚̃I[ƒvƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ª‘¶Ý‚µ‚È‚¢ê‡‚͍쐬‚µ‚Ü‚·‚©?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚ª•¡»‚³‚ê‚Ä‚¢‚È‚¢ê‡‚Í•¡»‚µ‚Ü‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS ƒT[ƒo[" - IDS_CANT_INIT_ADMIN_LIBS - "‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ðŽÀs‚Å‚«‚Ü‚¹‚ñBƒ‰ƒCƒuƒ‰ƒŠ[‰Šú‰»‚ªŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_CANT_OPEN_LOG_FILE "ƒƒOEƒtƒ@ƒCƒ‹‚ðƒI[ƒvƒ“‚Å‚«‚Ü‚¹‚ñB" - IDS_NEED_CLIENT_INFO "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ª‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚ō\¬‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðŽÀs‚Å‚«‚Ü‚¹‚ñB‚±‚̏ó‘Ô‚Å AFS \¬ƒEƒBƒU[ƒh‚ðŽg—p‚Å‚«‚Ü‚·BAFS \¬ƒEƒBƒU[ƒh‚ðŽÀs‚µ‚Ü‚·‚©?" - IDS_NEED_SERVER_INFO "‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚Í AFS ƒT[ƒo[‚Æ‚µ‚č\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB‰‚ß‚Ä AFS ƒT[ƒo[‚ð\¬‚·‚é‚ɂ́AAFS \¬ƒEƒBƒU[ƒh‚ðŽg—p‚·‚é•K—v‚ª‚ ‚è‚Ü‚·BAFS \¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚Í‚»‚ÌŒã‚ÅŽg—p‰Â”\‚ɂȂè‚Ü‚·BAFS \¬ƒEƒBƒU[ƒh‚ðŽÀs‚µ‚Ä‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚ð‰Šú\¬‚µ‚Ü‚·‚©?" - IDS_ADVANCED_OPEN "<< Šg’£(&A)" - IDS_ADVANCED_CLOSED "Šg’£(&A) >>" - IDS_BOS_OPEN_FAILED "ƒT[ƒo[‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ (bos ƒI[ƒvƒ“‚ªŽ¸”s)B" - IDS_SALVAGE_ERROR "ƒTƒ‹ƒx[ƒW‘€ì‚ªŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "Žw’肵‚½ƒTƒ‹ƒx[ƒWEƒvƒƒZƒX”‚ª–³Œø‚Å‚·BƒTƒ‹ƒx[ƒWEƒvƒƒZƒX”‚Í 1 ‚©‚ç 32 ‚͈̔͂łȂ¯‚ê‚΂Ȃè‚Ü‚¹‚ñB" - IDS_WRONG_CELL "‘O‚̃Xƒeƒbƒv‚ŁA\¬î•ñ‚ðŒŸõ‚·‚éƒT[ƒo[‚ðŽw’肵‚Ü‚µ‚½BŽw’肵‚½ƒT[ƒo[‚́AŒ‹‡‚·‚éƒZƒ‹‚É‘®‚µ‚Ä‚¢‚Ü‚¹‚ñB" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "ƒZƒ‹“à‚Ì‚¢‚­‚‚©‚̃T[ƒo[ã‚Ì CellServDB ƒtƒ@ƒCƒ‹‚ªXV‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½BXV‚³‚ꂽƒT[ƒo[‚ƍXV‚³‚ê‚Ä‚¢‚È‚¢ƒT[ƒo[‚ÌƒŠƒXƒg‚́AŽŸ‚̃tƒ@ƒCƒ‹‚ɕۊǂ³‚ꂽ\¬ƒƒO‚ÅŒ©‚邱‚Æ‚ª‚Å‚«‚Ü‚·B " - IDS_GET_CREDENTIALS_STEP "ŠÇ—ƒg[ƒNƒ“‚̎擾" - IDS_MUST_ENTER_SCS_NAME "\¬‚ðŠJŽn‚·‚é‘O‚ɁAƒVƒXƒeƒ€§Œäƒ}ƒVƒ“–¼‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_NOT_SAME_CELL "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ª AFS ƒT[ƒo[ˆÈŠO‚̃Zƒ‹‚ɍ\¬‚³‚ê‚Ä‚¢‚Ü‚·BAFS ƒT[ƒo[‚ð\¬‚·‚é‘O‚ɁA‚Ü‚¸ AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ðƒT[ƒo[‚̃Zƒ‹‚ɍč\¬‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_LAST_DB_SERVER "‚±‚̃}ƒVƒ“‚̓Zƒ‹“à‚ÅŽÀs‚³‚ê‚Ä‚¢‚éÅŒã‚̃f[ƒ^ƒx[ƒXEƒT[ƒo[‚Å‚·B‘±s‚µ‚Ä‚±‚̃}ƒVƒ“‚̃f[ƒ^ƒx[ƒXEƒT[ƒrƒX‚ð\¬‰ðœ‚µ‚½ê‡AƒZƒ‹‚Í‘¶Ý‚µ‚È‚­‚È‚èA‚±‚̃}ƒVƒ“‚ÅŽÀs’†‚Ì‘¼‚Ì AFS ƒT[ƒrƒX‚Í‚·‚ׂč\¬‰ðœ‚³‚ê‚Ü‚·B‘±s‚µ‚Ü‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "AFS ƒvƒŠƒ“ƒVƒpƒ‹‚̃pƒXƒ[ƒh‚ª–³Œø‚Å‚·B" - IDS_ERROR_CLIENT_VERSION - "‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚Ì AFS ƒNƒ‰ƒCƒAƒ“ƒg‚̃o[ƒWƒ‡ƒ“‚ƁAAFS ƒT[ƒo[‚Ƃ̌݊·«‚ª‚ ‚è‚Ü‚¹‚ñBAFS ƒT[ƒo[‚͏­‚È‚­‚Æ‚à AFS ƒNƒ‰ƒCƒAƒ“ƒg‚̃o[ƒWƒ‡ƒ“ 3.5 ‚ð•K—v‚Æ‚µ‚Ü‚·B" - IDS_CANT_MAP_ROOT_AFS "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€‚Ì ACL ‚ðÝ’è‚·‚é‚ɂ́Aƒhƒ‰ƒCƒu–¼‚ð AFS ‚Ƀ}ƒbƒsƒ“ƒO‚·‚é•K—v‚ª‚ ‚è‚Ü‚·BŒ»ÝŽg—p‰Â”\‚ȃhƒ‰ƒCƒu–¼‚ª‚ ‚è‚Ü‚¹‚ñBƒhƒ‰ƒCƒu–¼‚ð‰ð•ú‚µ‚āAu—¹‰ðv‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "ƒp[ƒeƒBƒVƒ‡ƒ“–¼" - IDS_VOLUME_NAME_VALIDATION_TYPE "ƒ{ƒŠƒ…[ƒ€–¼" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "ƒTƒ‹ƒx[ƒWEƒvƒƒZƒX”" - IDS_PATH_NAME_VALIDATION_TYPE "ƒpƒX–¼" - IDS_FILE_NAME_VALIDATION_TYPE "ƒtƒ@ƒCƒ‹–¼" - IDS_GENERIC_VALIDATION_TYPE "’l" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/ko_KR/afscfg.rc b/src/WINNT/afssvrcfg/lang/ko_KR/afscfg.rc deleted file mode 100644 index 34cdeaad9..000000000 --- a/src/WINNT/afssvrcfg/lang/ko_KR/afscfg.rc +++ /dev/null @@ -1,1169 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥ ¹× ¸¶¹ý»ç" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "AFS ¼­¹ö ºü¸¥ ½ÃÀÛ ¸¶¹ý»ç" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Ãë¼Ò(&L)",IDCANCEL,101,225,50,14 - PUSHBUTTON "< µÚ·Î(&B)",IDBACK,155,225,50,14 - DEFPUSHBUTTON "´ÙÀ½(&N) >",IDNEXT,209,225,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - CONTROL "ÆÄƼ¼Ç ÀÛ¼º(&Y)",IDC_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,81,87,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,104, - 186,52,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,93,172,20,12,ES_AUTOHSCROLL - CONTROL "ÆÄƼ¼ÇÀ» ÀÛ¼ºÇÏÁö ¾ÊÀ½(&O)",IDC_DONT_CREATE_PARTITION, - "Button",BS_AUTORADIOBUTTON,0,191,102,8 - LTEXT "ÀÌ ÆÄÀÏ ¼­¹ö´Â ÆÄÀÏ ¹× ÇÁ·Î±×·¥À» ÀúÀåÇÑ ÈÄ AFS Ŭ¶óÀÌ¾ðÆ®¿¡ Àü´ÞÇÕ´Ï´Ù. ÀÌ ½Ã½ºÅÛ¿¡ ÀúÀåµÇ°í AFS¸¦ ÅëÇØ °øÀ¯µÇ¾îÁú µ¥ÀÌÅ͸¦ À§ÇØ ÃÖ¼ÒÇÑ ÇϳªÀÇ NTFS º¼·ýÀÌ AFS ÆÄƼ¼Ç Àü¿ëÀ¸·Î »ç¿ëµÇ¾î¾ß ÇÕ´Ï´Ù.", - -1,0,12,209,35 - LTEXT "ÆÄƼ¼Ç¿¡ »ç¿ëÇÒ º¼·ý ¼±ÅÃ(&S)",IDC_SELECT_DRIVE,12,93, - 163,9 - LTEXT "AFS ÆÄƼ¼Ç À̸§(&M): /vicep",IDC_NAME_LABEL,12,174,72, - 8 - LTEXT "ÀÌ ÆÄÀÏ ¼­¹ö¿¡ AFS ÆÄƼ¼ÇÀ» ÀÛ¼ºÇϽʽÿÀ.",IDC_TITLE,0, - 0,209,8 - LTEXT "AFS ÆÄƼ¼ÇÀº ¹°¸®ÀûÀ¸·Î NTFS º¼·ý°ú °°Áö¸¸ ÆÄƼ¼Ç Á¤º¸ º¹¿ø ¹× À§Ä¡¿¡ ´ëÇÑ Æ¯¼öÇÑ ¸ÞŸµ¥ÀÌÅͰ¡ µé¾î ÀÖ½À´Ï´Ù.", - -1,0,49,208,18 - LTEXT "ÀÌ ÆÄÀÏ ¼­¹ö¿¡ ÆÄƼ¼ÇÀ» ÀÛ¼ºÇϽðڽÀ´Ï±î?", - IDC_ASK_CREATE_PARTITION,0,69,207,11 - LTEXT "ÇÊ¿äÇÑ °æ¿ì, ½ÇÇà Áß ¸Þ½ÃÁö¸¦ ¼³Á¤ÇϽʽÿÀ.", - IDC_PARTITION_MSG,0,162,209,8,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - CONTROL "ÆÄÀÏ ¼­¹ö·Î ±¸¼º(&Y)",IDC_SHOULD_CONFIG_FILE_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,179,114,10 - CONTROL "ÆÄÀÏ ¼­¹ö·Î ±¸¼ºÇÏÁö ¾ÊÀ½(&O)", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,190,133,10 - LTEXT "AFS ÆÄÀÏ ¼­ºñ½º´Â ¿äûµÈ ÆÄÀÏ ¹× ÇÁ·Î±×·¥À» ÀÌ ¼­¹ö¿¡¼­ AFS Ŭ¶óÀÌ¾ðÆ®·Î Àü´ÞÇÕ´Ï´Ù. ÀÌ ¼­ºñ½º´Â ¶ÇÇÑ º¼·ý ÀÛ¼º, »èÁ¦, À̵¿ ¹× º¹Á¦¿Í °°Àº ¸ðµç º¼·ý °ü¸® Á¶ÀÛÀ» ó¸®ÇÕ´Ï´Ù.", - -1,0,38,210,34 - LTEXT "ÀÌ ±â°è¸¦ ÆÄÀÏ ¼­¹ö·Î ±¸¼ºÇϽʽÿÀ.",IDC_TITLE,0,0,209, - 8 - LTEXT "ÀÌ ±â°è¸¦ ÆÄÀÏ ¼­¹ö·Î ±¸¼ºÇϽðڽÀ´Ï±î?", - IDC_CREATE_FS_QUESTION,0,166,210,8 - LTEXT "ÀÌ ±â°è¸¦ ÆÄÀÏ ¼­¹ö·Î ±¸¼ºÇÏ·Á¸é, ÆÄÀÏ ¼­ºñ½º¸¦ ±¸¼ºÇØ¾ß ÇÕ´Ï´Ù.", - -1,0,14,210,17 - LTEXT "ÁÖ: ÀÌ ±â°è¿¡´Â ÇöÀç AFS¿¡ ÆÄÀÏÀ» ÀúÀåÇÒ µð½ºÅ© µå¶óÀ̺갡 ¾ø½À´Ï´Ù. ÀÌ ±â°è¸¦ ÆÄÀÏ ¼­¹ö·Î ±¸¼ºÇÒ ¼ö´Â À־ AFS µ¥ÀÌÅ͸¦ ±â°è¿¡ ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_NO_DRIVES_NOTE,0,77,210,32,NOT WS_VISIBLE - LTEXT "µð½ºÅ© µå¶óÀ̺긦 ÀÛ¼ºÇÏ·Á¸é, Windows NT µð½ºÅ© °ü¸®ÀÚ¸¦ »ç¿ëÇϽʽÿÀ.", - IDC_DISK_ADMIN_NOTE,0,112,210,16,NOT WS_VISIBLE - LTEXT "ÀÌ ±â°è´Â ÀÌ¹Ì ÆÄÀÏ ¼­¹ö·Î ±¸¼ºµÇ¾ú½À´Ï´Ù.",IDC_MSG,0, - 166,209,34,NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - LTEXT "AFS ¼­¹ö ºü¸¥ ½ÃÀÛ ¸¶¹ý»ç¸¦ »ç¿ëÇÏ°Ô µÈ °ÍÀ» ȯ¿µÇÕ´Ï´Ù. ÀÌ ¸¶¹ý»ç¸¦ »ç¿ëÇϸé Windows NT ½Ã½ºÅÛ¿¡¼­ AFS ¼­¹ö¸¦ ºü¸£°Ô ±¸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_TITLE,0,0,209,26 - LTEXT "´ÙÀ½À» ´­·¯ AFS ¼­¹öÀÇ ±¸¼ºÀ» ½ÃÀÛÇϽʽÿÀ.",IDC_STATIC, - 0,166,209,8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - CONTROL "·çÆ® º¼·ý º¹Á¦(&Y)",IDC_REPLICATE,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,115,10 - CONTROL "·çÆ® º¼·ýÀ» º¹Á¦ÇÏÁö ¾ÊÀ½(&O)",IDC_DONT_REPLICATE, - "Button",BS_AUTORADIOBUTTON,0,190,134,10 - LTEXT "º¹Á¦´Â ÁÖ·Î ´Ù¸¥ ÆÄÀÏ ¼­¹öÀÇ ¿©·¯ ÆÄƼ¼Ç¿¡ ÀÖ´Â º¼·ýÀÇ Àбâ-Àü¿ë º¹»çº»À» ÀÛ¼ºÇÏ´Â ÇÁ·Î¼¼½ºÀÔ´Ï´Ù. º¹Á¦´Â ³×Æ®¿öÅ© À̺¥Æ®¿¡¼­ º¼·ýÀÇ °¡¿ëµµ¸¦ Áõ°¡½Ãŵ´Ï´Ù.", - IDC_STATIC,0,36,208,25 - LTEXT "·çÆ® º¼·ýÀ» º¹Á¦ÇϽðڽÀ´Ï±î?",IDC_REPLICATE_QUESTION,0, - 166,209,8 - LTEXT "º¹Á¦´Â ÀÚÁÖ ¾×¼¼½ºµÇ´Â º¼·ý¿¡ ´ëÇÑ ¿äûÀ¸·Î ÀÎÇØ ÇϳªÀÇ ¼­¹ö¿¡ °úºÎÇϰ¡ °É¸®´Â °ÍÀ» ¹æÁöÇÏ´Â µ¥ µµ¿òÀÌ µË´Ï´Ù.", - IDC_STATIC,0,90,209,25 - LTEXT "¼¿ ·çÆ® º¼·ý º¹Á¦",IDC_TITLE,0,0,209,8 - LTEXT "ÀÌ AFS ¼¿¿¡ ÀÖ´Â ´Ù¸¥ º¼·ýÀ» º¹Á¦ÇÒ °èȹÀ̶ó¸é, ¸ÕÀú ·çÆ® º¼·ýÀ» º¹Á¦ÇØ¾ß ÇÕ´Ï´Ù.", - IDC_STATIC,0,15,209,16 - LTEXT "º¼·ýÀÌ µé¾î ÀÖ´Â ¼­¹ö Áß Çϳª¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¹Ç·Î ¼­¹ö ºÎÁ· »óȲÀÌ ¹ß»ýÇÏÁö¸¸, ´Ù¸¥ ¼­¹ö¿¡¼­ ±× º¼·ý¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ", - IDC_STATIC,0,67,209,19 - LTEXT "ÇÊ¿äÇÑ °æ¿ì, ½ÇÇà Áß ¸Þ½ÃÁö¸¦ ¼³Á¤ÇϽʽÿÀ.", - IDC_CANT_REPLICATE_MSG,0,166,209,34,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - CONTROL "·çÆ® º¼·ý ÀÛ¼º(&Y)",IDC_CREATE_ROOT_VOLUMES,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,108,10 - CONTROL "·çÆ® º¼·ýÀ» ÀÛ¼ºÇÏÁö ¾ÊÀ½(&O)", - IDC_DONT_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON, - 0,190,124,10 - LTEXT "AFS¿¡¼­ º¼·ýÀº ½Ã½ºÅÛ °ü¸®¸¦ ½±°ÔÇϱâ À§ÇØ ÇϳªÀÇ ´ÜÀ§·Î Á¤¸®ÇÑ ¿¬°üµÈ ÆÄÀϵéÀÇ ¸ðÀ½ÀÔ´Ï´Ù. ", - IDC_STATIC,0,15,209,17 - LTEXT "·çÆ® º¼·ýÀ» ÀÛ¼ºÇϽðڽÀ´Ï±î?",IDC_ROOT_AFS_QUESTION,0, - 166,209,8 - LTEXT "¼¿ÀÇ ·çÆ® º¼·ýÀ» ÀÛ¼ºÇϽʽÿÀ.",IDC_TITLE,0,0,209,8 - LTEXT "ÀÏ´Ü ·çÆ® º¼·ýÀÌ ÀÛ¼ºµÇ¸é, AFS ÆÄÀÏ °ø°£¿¡¼­ ÀÚµ¿À¸·Î ¾×¼¼½ºÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,0,88,209,17 - LTEXT "ÇÊ¿äÇÑ °æ¿ì, ½ÇÇà Áß ¸Þ½ÃÁö¸¦ ¼³Á¤ÇϽʽÿÀ.", - IDC_ROOT_AFS_MSG,0,166,209,33,NOT WS_VISIBLE - LTEXT "root.afs º¼·ýÀº AFS ÆÄÀÏ °ø°£ÀÇ ·çÆ®ÀÔ´Ï´Ù. root.cell º¼·ýÀº AFS ÆÄÀÏ °ø°£¿¡¼­ ÀÌ ¼¿ÀÇ ¼­ºêÆ®¸®ÀÇ ·çÆ®À̸ç root.afsÀÇ ¸¶¿îÆ® Æ÷ÀÎÆ®¸¦ ÅëÇØ ¾×¼¼½ºµË´Ï´Ù. ", - IDC_STATIC,0,51,209,25 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "AFS ¼­¹ö ±¸¼º" -FONT 9, "±¼¸²" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,38,148,14 - LTEXT "Á¶ÀÛ ÅØ½ºÆ® - ½ÇÇà Áß ¼³Á¤.",IDC_OPERATION,35,20,145,10 - ICON "",IDC_LOGO,7,7,20,20 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,73,63,50,14 - LTEXT "ÇöÀç ±¸¼º ÆÇº°:",IDC_OPERATION2,35,7,156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - CONTROL "¹é¾÷ ¼­¹ö ±¸¼º(&Y)",IDC_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,1,171,128,10 - CONTROL "¹é¾÷ ¼­¹ö¸¦ ±¸¼ºÇÏÁö ¾ÊÀ½(&O)", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,1,183,147,10 - LTEXT "¹é¾÷ ¼­¹ö´Â µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºµÈ ±â°è¿¡¼­¸¸ ½ÇÇàµÉ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ, ¹é¾÷ ¼­¹ö°¡ ¼¿ÀÇ ÇÑ µ¥ÀÌÅͺ£À̽º ¼­¹ö¿¡¼­ ½ÇÇàµÇ¸é, ¼¿ÀÇ ¸ðµç µ¥ÀÌÅͺ£À̽º ¼­¹ö¿¡¼­ ½ÇÇàµÇ¾î¾ß ÇÕ´Ï´Ù. ", - -1,0,38,205,27 - LTEXT "ÀÌ ±â°è¸¦ ¹é¾÷ ¼­¹ö·Î ±¸¼ºÇϽðڽÀ´Ï±î?", - IDC_BACKUP_SERVER_QUESTION,0,147,209,10 - LTEXT "ÀÌ ±â°è¸¦ ¹é¾÷ ¼­¹ö·Î ±¸¼ºÇϽʽÿÀ.",IDC_TITLE,0,0,207, - 8 - LTEXT "¹é¾÷ ¼­¹ö´Â µ¥ÀÌÅͺ£À̽º ¼­ºñ½ºÀÇ ¼±ÅÃÀû ±â´ÉÀÔ´Ï´Ù.", - -1,0,14,209,16 - LTEXT "ÀÌ ±â°è´Â ÀÌ¹Ì µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù.", - IDC_CANT_BACKUP_MSG,0,158,210,33,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - CONTROL "½Ã½ºÅÛ Á¦¾î ¼­¹ö·Î ±¸¼º(&S)",IDC_SYS_CONTROL_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,151,141,10 - CONTROL "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®·Î ±¸¼º(&C)", - IDC_SYS_CONTROL_CLIENT,"Button",BS_AUTORADIOBUTTON,0,164, - 131,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,90,174,113,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ® ¶Ç´Â ¼­¹ö·Î ±¸¼ºÇÏÁö ¾ÊÀ½(&O)", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,0,190,183, - 9 - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­¹ö´Â ½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®·Î ½ÇÇà ÁßÀÎ ±âŸ AFS ¼­¹ö ±â°è¿¡ °øÅë ±¸¼º ÆÄÀÏÀ» Á¦°øÇÕ´Ï´Ù. AFS ¼¿Àº ÇϳªÀÇ ½Ã½ºÅÛ Á¦¾î ¼­¹ö¸¸ ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù.", - -1,0,14,209,25 - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­¹ö ¶Ç´Â Ŭ¶óÀÌ¾ðÆ®·Î ±¸¼ºÇϽʽÿÀ.", - IDC_TITLE,0,0,209,8 - LTEXT "ÀÌ ±â°è¸¦ ½Ã½ºÅÛ Á¦¾î ¼­¹ö ¶Ç´Â Ŭ¶óÀÌ¾ðÆ®·Î ±¸¼ºÇϽðڽÀ´Ï±î?", - IDC_SYS_CONTROL_MACHINE_QUESTION,0,131,207,17 - LTEXT "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®´Â ¼¿ÀÇ ½Ã½ºÅÛ Á¦¾î ¼­¹ö¿¡¼­ AFS ±¸¼º ÆÄÀÏ¿¡ »ç¿ë°¡´ÉÇÑ ¸ðµç °»½ÅÀ» ¼ö½ÅÇÕ´Ï´Ù.", - IDC_SYS_CONTROL_CLIENT_DESC,0,43,209,18 - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­¹ö(&Y):",IDC_SYS_CONTROL_MACHINE_LABEL,15, - 176,73,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,0,166,210,34,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÀÌ´Â ÀÌ ½Ã½ºÅÛ¿¡¼­ AFS ¼­¹ö¸¦ ±¸¼ºÇÏ´Â ÇÊ¿äÇÑ Á¤º¸ÀÔ´Ï´Ù.", - IDC_ALL_NEEDED_MSG,1,19,209,9 - LTEXT "ÀÌ ±â°è¸¦ ¼¿ <½ÇÇà Áß ¼³Á¤>À¸·Î ±¸¼ºÇϽʽÿÀ",IDC_TITLE, - 1,0,208,8 - LTEXT "´ÙÀ½ ±¸¼º ´Ü°è°¡ ¼öÇàµË´Ï´Ù.",IDC_FOLLOWING_STEPS_MSG,1, - 30,187,8 - LTEXT "´Ü°è 1 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP1,22,42,179,8, - NOT WS_VISIBLE - LTEXT "´Ü°è 3 - ·±Å¸Àӽà ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP3,22,65,179,8, - NOT WS_VISIBLE - LTEXT "´Ü°è 2 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP2,22,53,179,8, - NOT WS_VISIBLE - LTEXT "´Ü°è 4 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP4,22,77,179,8, - NOT WS_VISIBLE - LTEXT "´Ü°è 5 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP5,22,89,179,8, - NOT WS_VISIBLE - LTEXT "´Ü°è 6 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP6,22,101,179,8, - NOT WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,190,200,9 - LTEXT "´Ü°è 8 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP8,22,125,179,8, - NOT WS_VISIBLE - LTEXT "´Ü°è 7 - ½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®",IDC_STEP7,22,113,179,8, - NOT WS_VISIBLE - LTEXT "ÇÊ¿äÇÑ °æ¿ì, ½ÇÇà Áß ¸Þ½ÃÁö¸¦ ¼³Á¤ÇϽʽÿÀ.", - IDC_CANT_CONFIG_MSG,1,9,200,9,NOT WS_VISIBLE - LTEXT "ÇöÀç Á¶ÀÛ:",IDC_CURRENT_STEP_LABEL,1,137,39,8,NOT - WS_VISIBLE - LTEXT "ÀÌ ÄÄÇ»ÅÍÀÇ ±¸¼ºÀ» ½ÃÀÛÇÏ·Á¸é, ±¸¼º ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À. ¼öÇàÇÒ ±¸¼º ´Ü°è¸¦ º¯°æÇÏ·Á¸é, µÚ·Î ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATUS_MSG,1,147,206,32 - LTEXT "ÇöÀç ´Ü°è ¼³¸í - ½ÇÇà Áß ¼³Á¤",IDC_CURRENT_STEP,1,167, - 208,8,NOT WS_VISIBLE - LTEXT "¿Ï·á ÁøÇà·ü:",IDC_PERCENT_COMPLETE_LABEL,1,179,42,8,NOT - WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,49,177,49,8,NOT WS_VISIBLE - LTEXT "",IDC_STEP1_GRAPHIC,11,40,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,11,52,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,11,64,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,11,76,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,11,88,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,11,100,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,11,112,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,11,124,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,101,155,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,140,154,9,14 - LTEXT "°ü¸® Á¤º¸",IDC_TITLE,0,0,202,8 - LTEXT "À̸§(&N):",IDC_ADMIN_NAME_LABEL,7,57,22,8 - LTEXT "¾ÏÈ£(&P):",IDC_ADMIN_PW_LABEL,7,73,34,8 - GROUPBOX "°èÁ¤ À̸§ ¹× ¾ÏÈ£",IDC_ADMIN_INFO_FRAME,0,41,210,65 - LTEXT "¾ÏÈ£ È®ÀÎ(&V):",IDC_VERIFY_ADMIN_PW_LABEL,7,90,48,8 - LTEXT "´ÙÀ½ Á¤º¸´Â »õ·Î¿î ¼¿¿¡ ´ëÇÑ °ü¸® °èÁ¤À» ÀÛ¼ºÇÒ ¶§ ÇÊ¿äÇÕ´Ï´Ù.", - IDC_STATIC,0,15,209,17 - CONTROL "±âÁ¸ AFS UID »ç¿ë(&S)",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,157,88,10 - CONTROL "´ÙÀ½À¸·Î »ç¿ë°¡´ÉÇÑ AFS UID »ç¿ë(&U)",IDC_USE_NEXT_UID, - "Button",BS_AUTORADIOBUTTON,6,144,159,10 - GROUPBOX "AFS UID",IDC_STATIC,0,118,209,57 - LTEXT "AFS °ü¸® °èÁ¤¿¡ ´ëÇÑ »ç¿ëÀÚ ID¸¦ ÀÔ·ÂÇϽʽÿÀ.", - IDC_STATIC,6,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - CONTROL "µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºÇÔ(&Y)",IDC_CONFIG_DB_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,110,134,10 - CONTROL "µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºÇÏÁö ¾ÊÀ½(&O)", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 167,153,10 - LTEXT "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º´Â AFS ¼¿¿¡¼­ ÇÊ¿äÇÑ º¹Á¦µÈ µ¥ÀÌÅͺ£À̽º ¼¼Æ®¸¦ À¯ÁöÇÕ´Ï´Ù. ÀÌ ¼­ºñ½º´Â ¼¿¿¡ ´ëÇÑ ¸ðµç °èÁ¤, º¼·ý À§Ä¡ ¹×(¼±ÅÃÀû) ¹é¾÷ Á¤º¸¸¦ À¯ÁöÇÕ´Ï´Ù.", - -1,0,38,209,54 - LTEXT "ÀÌ ±â°è¸¦ µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºÇϽðڽÀ´Ï±î?", - IDC_DB_SERVER_QUESTION,1,97,209,10 - LTEXT "ÀÌ ±â°è¸¦ µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºÇϽʽÿÀ.",IDC_TITLE, - 0,0,209,8 - LTEXT "ÀÌ ±â°è¸¦ µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºÇÏ·Á¸é, µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ±¸¼ºÇØ¾ß ÇÕ´Ï´Ù. ", - -1,0,14,209,16 - LTEXT "ÀÌ ±â°è´Â ÀÌ¹Ì µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù.", - IDC_MSG,1,182,201,9,NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,81,143,119,12,ES_AUTOHSCROLL - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­¹ö(&y):",IDC_SYS_CONTROL_MACHINE_LABEL,9, - 145,69,10 - LTEXT "¼¿¿¡ ½Ã½ºÅÛ Á¦¾î ¼­¹ö°¡ ÀÖÀ¸¸é, ±× È£½ºÆ® À̸§À» ¾Æ·¡¿¡ ÀÔ·ÂÇϽʽÿÀ. AFS ±¸¼º ÆÄÀÏÀº ÀÌ ¼­¹ö¸¦ ÅëÇØ °»½ÅµË´Ï´Ù.", - IDC_SCM_PROMPT,9,124,195,17 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - CONTROL "ÀÌ È£½ºÆ®¸¦ ±âÁ¸ AFS ¼¿ ³»ÀÇ ¼­¹ö·Î ¸¸µê(&M)", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,0,37, - 160,10 - CONTROL "À̰ÍÀÌ »õ AFS ¼¿ ³»ÀÇ Ã¹ ¹øÂ° ¼­¹ö°¡ µÊ(&T)", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,0,49,153,10 - EDITTEXT IDC_CELL_NAME,64,91,139,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,64,166,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,64,180,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "¼¿ ¹× ¼­¹ö Á¤º¸",IDC_TITLE,0,0,203,8 - LTEXT "¼¿ À̸§(&C):",IDC_CELL_NAME_LABEL,7,93,35,8 - LTEXT "¾ÏÈ£(&P):",IDC_SERVER_PW_LABEL,7,167,34,8,WS_DISABLED - LTEXT "AFS ¼¿ÀÇ À̸§À» ÀÔ·ÂÇϽʽÿÀ.",IDC_CELL_NAME_PROMPT,8, - 78,195,11 - LTEXT "AFS °èÁ¤¿¡ ´ëÇÑ ¾ÏÈ£¸¦ ÀÔ·ÂÇϽʽÿÀ. ¸ðµç AFS ¼­¹ö´Â ÀÌ °èÁ¤À¸·Î¼­ ÅäÅ«À» È®º¸ÇÕ´Ï´Ù.", - IDC_SERVER_PW_PROMPT,7,130,196,19,WS_DISABLED - GROUPBOX "¼¿ À̸§",IDC_CELL_NAME_FRAME,0,67,210,43 - GROUPBOX "¼­¹ö ¾ÏÈ£",IDC_SERVER_PW_FRAME,0,119,210,81,WS_DISABLED - LTEXT "¾ÏÈ£ È®ÀÎ(&V):",IDC_VERIFY_PW_LABEL,7,180,52,8, - WS_DISABLED - LTEXT "AFS ¼¿Àº ÆÄÀÏ ¾×¼¼½º¿¡ ´ëÇØ ÀÏÁ¤ÇÑ À̸§ °ø°£À» Á¦°øÇÏ´Â ¼­¹öÀÇ ¸ðÀ½ÀÔ´Ï´Ù.", - IDC_CELL_NAME_PROMPT2,1,14,202,17 - LTEXT "À̸§:",IDC_PRINCIPAL_LABEL,7,152,22,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,150,139,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_ADMIN_NAME,53,43,149,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,53,59,149,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,53,132,149,12,ES_AUTOHSCROLL - LTEXT "°ü¸® Á¤º¸",IDC_TITLE,0,0,209,8 - LTEXT "¾Æ·¡¿¡ °ü¸® °èÁ¤ Á¤º¸¸¦ ÀÔ·ÂÇϽʽÿÀ.", - IDC_ADMIN_INFO_PROMPT,7,30,196,10 - LTEXT "À̸§(&N):",IDC_ADMIN_NAME_LABEL,7,46,22,8 - LTEXT "¾ÏÈ£(&P):",IDC_ADMIN_PW_LABEL,7,62,34,8 - GROUPBOX "°èÁ¤ À̸§ ¹× ¾ÏÈ£",IDC_ADMIN_INFO_FRAME,0,17,210,62 - GROUPBOX "±âÁ¸ÀÇ AFS ¼­¹ö",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS ¼­¹ö:",IDC_HOSTNAME_LABEL,9,134,37,8 - LTEXT "Á¶ÀÎÇÒ ¼¿¿¡¼­ ´Ù¸¥ AFS ¼­¹öÀÇ È£½ºÆ® À̸§À» ÀÔ·ÂÇϽʽÿÀ. AFS ±¸¼º Á¤º¸´Â ÀÌ ¼­¹ö¿¡¼­ Á¶È¸µË´Ï´Ù.", - IDC_HOSTNAME_PROMPT,7,105,202,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 285 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "¼­ºñ½º" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "",IDC_STATIC,7,20,281,40 - GROUPBOX "",IDC_STATIC,7,66,281,43 - GROUPBOX "",IDC_STATIC,7,115,281,42 - GROUPBOX "",IDC_STATIC,7,161,281,44 - CONTROL "ÆÄÀÏ ¼­ºñ½º",IDC_FS_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,25,60,10 - CONTROL "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º",IDC_DB_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,72,82,10 - PUSHBUTTON "ÀÚ¼¼È÷...",IDC_DB_DETAILS,230,91,52,14,NOT WS_VISIBLE - CONTROL "¹é¾÷ ¼­¹ö",IDC_BK_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,121,71,10 - CONTROL "½Ã½ºÅÛ Á¦¾î ¼­¹ö",IDC_SCS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,168,98,10 - EDITTEXT IDC_SC_MACHINE,107,245,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "ÀÌ AFS ¼­¹ö¿¡¼­ ½ÇÇàÇÒ ¼­ºñ½º¸¦ ¼±ÅÃÇϽʽÿÀ.", - IDC_STATIC,7,7,156,8 - LTEXT "ÆÄÀÏ ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù.",IDC_FS_STATUS_MSG,14, - 38,261,8 - LTEXT "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º°¡ ÇöÀç ÀϺθ¸ ¼³Ä¡µÇ¾ú½À´Ï´Ù.", - IDC_DB_STATUS_MSG,14,85,208,8 - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­¹ö(&Y):",IDC_SC_MACHINE_LABEL,31,247,70,8, - WS_DISABLED - LTEXT "ÆÄÀÏ ¼­ºñ½º¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ.", - IDC_FS_ACTION_MSG,14,50,262,8 - LTEXT "´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾òÀ¸·Á¸é, ÀÚ¼¼È÷¸¦ ´©¸£½Ê½Ã¿À.", - IDC_DB_ACTION_MSG,14,96,209,8 - LTEXT "¹é¾÷ ¼­¹ö°¡ ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù.",IDC_BK_STATUS_MSG,14, - 135,259,8 - LTEXT "¹é¾÷ ¼­¹ö¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ.", - IDC_BK_ACTION_MSG,14,147,262,8 - LTEXT "ÀÌ ¼­¹ö¸¦ »ç¿ëÇÏ·Á¸é, ÆÄÀÏ ¼­ºñ½º ¶Ç´Â µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù.", - IDC_SCS_ACTION_MSG,14,193,268,9 - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­ºñ½º´Â ÇöÀç ½ÇÇàµÇÁö ¾Ê°í ÀÖ½À´Ï´Ù.", - IDC_SCS_STATUS_MSG,14,180,263,9 - GROUPBOX "",IDC_STATIC,7,214,281,59 - CONTROL "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀ̾ðÆ®",IDC_SCC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,221,95,10 - LTEXT "ÀÌ ¼­¹ö¸¦ »ç¿ë ÇÏ·Á¸é, ÆÄÀÏ ¼­ºñ½º ¶Ç´Â µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù.", - IDC_SCC_ACTION_MSG,14,261,268,9 - LTEXT "½Ã½ºÅÛ Á¦¾î ¼­ºñ½º´Â ÇöÀç ½ÇÇàµÇÁö ¾Ê°í ÀÖ½À´Ï´Ù.", - IDC_SCC_STATUS_MSG,14,235,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "ÆÄƼ¼Ç" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "´ÙÀ½ AFS ÆÄƼ¼ÇÀÌ ÄÄÇ»ÅÍ¿¡ ÀÖÀ½(&A)",IDC_STATIC,8,7,175, - 8 - PUSHBUTTON "ÀÛ¼º(&C)...",IDC_CREATE_PARTITIONS,17,118,53,14 - LTEXT "ÆÄƼ¼Ç ¶Ç´Â ÆÄƼ¼ÇÀÇ º¼·ýÀ» º¹¿øÇÏ·Á¸é, ¸ñ·Ï¿¡¼­ ÆÄƼ¼ÇÀ» ¼±ÅÃÇϰí À§ÀÇ ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À. ÀÌ ¼­¹ö¿¡ ÀÖ´Â ¸ðµç ÆÄƼ¼ÇÀ» º¹¿øÇÏ·Á¸é, À§ÀÇ ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_SALVAGE_MSG,30,179,250,25 - PUSHBUTTON "º¹¿ø(&S)...",IDC_SALVAGE,17,159,53,14 - LTEXT "ÆÄƼ¼ÇÀ» Á¦°ÅÇÏ·Á¸é, ¸ñ·Ï¿¡¼­ ÆÄƼ¼ÇÀ» ¼±ÅÃÇϰí À§ÀÇ ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_REMOVE_MSG,30,235,253,8,WS_DISABLED - PUSHBUTTON "Á¦°Å(&M)",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "ÆÄƼ¼Ç",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "ÀÌ ¼­¹ö¿¡ »õ ÆÄƼ¼ÇÀ» ÀÛ¼ºÇÏ·Á¸é, À§ÀÇ ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_CREATE_MSG,30,136,254,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ÆÄƼ¼Ç ÀÛ¼º" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "¾Æ·¡ ¸ñ·Ï¿¡¼­ »õ ÆÄƼ¼ÇÀ» ÀÛ¼ºÇÒ NTFS º¼·ýÀ» ¼±ÅÃÇϽʽÿÀ.", - IDC_TITLE,7,5,250,8 - LTEXT "AFS ÆÄƼ¼Ç À̸§:",IDC_NAME_STATIC,17,131,66,8 - EDITTEXT IDC_PARTITION_NAME,119,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "ÀÛ¼º(&C)",IDC_CREATE,96,158,50,14,WS_DISABLED - PUSHBUTTON "´Ý±â(&O)",IDC_CLOSE,152,158,50,14 - PUSHBUTTON "µµ¿ò¸»",9,207,158,50,14 - GROUPBOX "ÆÄƼ¼Ç ¸Å°³º¯¼ö",IDC_ARGS_FRAME,7,117,250,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,15,250, - 95,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,90,131,22,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 249, 193 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS ¼­¹ö ±¸¼º" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_ADMIN_NAME,59,33,151,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,59,49,151,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,59,110,151,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "±¸¼º(&C)",IDOK,108,172,50,14,WS_DISABLED - PUSHBUTTON "Ãë¼Ò",IDCANCEL,48,172,50,14 - PUSHBUTTON "µµ¿ò¸»",9,192,172,50,14 - LTEXT "¾Æ·¡¿¡ °ü¸® °èÁ¤ Á¤º¸¸¦ ÀÔ·ÂÇϽʽÿÀ.", - IDC_ADMIN_INFO_PROMPT,14,20,196,10 - LTEXT "À̸§(&N):",IDC_ADMIN_NAME_LABEL,15,36,22,8 - LTEXT "¾ÏÈ£(&P):",IDC_ADMIN_PW_LABEL,15,52,34,8 - GROUPBOX "°èÁ¤ À̸§ ¹× ¾ÏÈ£",IDC_ADMIN_INFO_FRAME,7,7,235,62 - GROUPBOX "½Ã½ºÅÛ Á¦¾î ¼­¹ö",IDC_HOSTNAME_FRAME,7,76,235,54 - LTEXT "È£½ºÆ® À̸§(&H):",IDC_HOSTNAME_LABEL,15,112,40,8 - LTEXT "¼¿¿¡ ½Ã½ºÅÛ Á¦¾î ¼­¹ö°¡ ÀÖÀ¸¸é, ±× È£½ºÆ® À̸§À» ¾Æ·¡¿¡ ÀÔ·ÂÇϽʽÿÀ. AFS ±¸¼º ÆÄÀÏÀº ÀÌ ¼­¹ö¸¦ ÅëÇØ °»½ÅµË´Ï´Ù.", - IDC_HOSTNAME_PROMPT,13,88,197,18 -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 273, 107 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¼­¹ö ±¸¼º" -FONT 9, "±¼¸²" -BEGIN - PUSHBUTTON "Ãë¼Ò",IDCANCEL,107,88,50,12 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,76,200,8 - LTEXT "¿Ï·á ÁøÇà·ü:",IDC_PERCENT_COMPLETE_LABEL,40,65,61,8,NOT - WS_VISIBLE - LTEXT "ÇöÀç Á¶ÀÛ:",IDC_CURRENT_STEP_LABEL,40,7,34,8,NOT - WS_VISIBLE - LTEXT "ÇöÀç ´Ü°è ¼³¸í - ½ÇÇà Áß ¼³Á¤",IDC_CURRENT_STEP,40,54, - 226,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "ÀÌ ÄÄÇ»ÅÍÀÇ ±¸¼ºÀ» ½ÃÀÛÇÏ·Á¸é, ±¸¼º ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À. ¼öÇàÇÒ ±¸¼º ´Ü°è¸¦ º¯°æÇÏ·Á¸é, µÚ·Î ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATUS_MSG,40,19,226,31 - PUSHBUTTON "·Î±× º¸±â(&V)",IDNEXT,159,88,50,12,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "CellServDB °»½Å ¿À·ù" -FONT 9, "±¼¸²" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "È®ÀÎ",IDOK,22,162,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,75,162,50,14 - PUSHBUTTON "µµ¿ò¸»",9,130,162,50,14 - LTEXT "´ÙÀ½ AFS ¼­¹öÀÇ CellServDB ÆÄÀÏÀº ÀÚµ¿À¸·Î °»½ÅµÉ ¼ö ¾ø½À´Ï´Ù.", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 259, 239 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "º¹¿ø" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,79,99,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,133,99,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,187,99,50,14 - CONTROL "ÇØ´ç ÆÄÀÏ ¼­¹ö»óÀÇ ¸ðµç ÆÄƼ¼Ç º¹¿ø(&S)",IDC_SERVER, - "Button",BS_AUTORADIOBUTTON,14,35,176,10 - CONTROL "¼±ÅÃµÈ ÆÄƼ¼Ç»óÀÇ ¸ðµç º¼·ý º¹¿ø(&P)",IDC_PARTITION, - "Button",BS_AUTORADIOBUTTON,14,48,177,10 - CONTROL "¼±ÅÃµÈ ÆÄƼ¼Ç»óÀÇ Æ¯Á¤ º¼·ý º¹¿ø(&V)",IDC_VOLUME,"Button", - BS_AUTORADIOBUTTON,14,61,177,10 - EDITTEXT IDC_VOLUME_NAME,79,73,88,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< °í±Þ(&A) ",IDC_ADVANCED,7,99,50,14 - GROUPBOX "",IDC_STATIC,7,25,245,67 - LTEXT "º¼·ý À̸§(&N):",IDC_VOLUME_NAME_LABEL,27,75,47,8, - WS_DISABLED - GROUPBOX "°í±Þ º¹¿ø ¿É¼Ç",IDC_ADVANCED_FRAME,7,180,245,52 - LTEXT "Àӽà ÆÄÀÏ °æ·Î(&T):",IDC_TEMP_DIR_LABEL,17,165,74,8 - EDITTEXT IDC_LOG_FILE,93,147,133,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,188,130,21,12,ES_AUTOHSCROLL - LTEXT "°á°ú ·Î±×ÀÇ ÆÄÀÏ À̸§(&L):",IDC_LOG_FILE_LABEL,17,149, - 74,8 - EDITTEXT IDC_TEMP_DIR,93,163,133,12,ES_AUTOHSCROLL - CONTROL "º´·Ä º¹¿ø Á¶ÀÛ(&R), ÇÁ·Î¼¼½º ¼ö:", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,132,165,10 - LTEXT "¼­¹ö ¶Ç´Â Àüü ÆÄƼ¼ÇÀ» º¹¿øÇÒ °æ¿ì, ¼­¹ö´Â ÀϽÃÀûÀ¸·Î ¿ÀÇÁ¶óÀÎÀÌ µË´Ï´Ù.", - IDC_STATIC,34,7,218,17 - LTEXT "ÁÖ:",IDC_STATIC,7,7,16,8 -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS °èÁ¤ ¾ÏÈ£" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_PW,48,39,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,31,61,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,85,61,50,14 - PUSHBUTTON "µµ¿ò¸»",9,140,61,50,14 - LTEXT "AFS °èÁ¤ Ű´Â 3.5 ÀÌÀü ÀÎÁõ ¼­¹ö¿¡¼­´Â °Ë»öµÉ ¼ö ¾ø½À´Ï´Ù. ¾Æ·¡¿¡ AFS °èÁ¤ ¾ÏÈ£¸¦ ÀÔ·ÂÇϽʽÿÀ.", - IDC_STATIC,7,7,183,21 - LTEXT "¾ÏÈ£:",IDC_STATIC,7,41,35,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "º¼·ý º¹¿ø - °á°ú" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "´Ý±â(&C)",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "µµ¿ò¸»",9,280,266,50,14 - LTEXT "<½ÇÇà Áß ¼³Á¤>",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "<½ÇÇà Áß ¼³Á¤>",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 203 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 53 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 278 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 242 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 266 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 100 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 252 - TOPMARGIN, 7 - BOTTOMMARGIN, 232 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥ ¹× ¸¶¹ý»ç""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "´ÙÀ½(&N) >" - IDS_FINISH "Á¾·á(&F)" - IDS_HELP_TITLE "µµ¿ò¸» ´ÜÃ߸¦ ´©¸§" - IDS_HELP_DESC "Áö±ÝÀº µµ¿ò¸»À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_CANCEL_DESC "AFS ºü¸¥ ½ÃÀÛ ¸¶¹ý»ç¸¦ Ãë¼ÒÇϽðڽÀ´Ï±î?" - IDS_PARTITION_ALREADY_CREATED "AFS ÆÄƼ¼ÇÀÌ ÀÌ¹Ì ÀÌ ±â°è¿¡ Á¸ÀçÇÕ´Ï´Ù." - IDS_NOT_A_FS_SERVER "ÀÌ ±â°è´Â ÆÄÀÏ ¼­¹ö·Î ±¸¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù. º¼·ýÀº ÆÄÀÏ ¼­¹ö ±â°è¿¡¼­¸¸ ÀÛ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_ROOT_AFS_ALREADY_EXISTS "·çÆ® º¼·ýÀÌ ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù." - IDS_NO_PARTITION_EXISTS "·çÆ® º¼·ýÀ» ÀÛ¼ºÇÒ ÆÄƼ¼ÇÀÌ ¾ø½À´Ï´Ù. ·çÆ® º¼·ýÀ» ÀÛ¼ºÇÏ·Á¸é ¸ÕÀú ÆÄƼ¼ÇÀÌ Á¸ÀçÇØ¾ß ÇÕ´Ï´Ù." - IDS_ALREADY_REPLICATED "·çÆ® º¼·ýÀÌ ÀÌ¹Ì º¹Á¦µÇ¾ú½À´Ï´Ù." - IDS_ROOT_AFS_DOESNT_EXIST - "·çÆ® º¼·ýÀÌ ¾ø½À´Ï´Ù. ·çÆ® º¼·ýÀÌ ÀÖ¾î¾ß À̸¦ º¹Á¦ÇÒ ¼ö ÀÖ½À´Ï´Ù." - IDS_ALREADY_CONFIGURED "ÀÌ ±â°è´Â ÀÌ¹Ì AFS ¼­¹ö·Î ±¸¼ºµÇ¾ú½À´Ï´Ù." - IDS_NOTHING_TO_CONFIGURE "±¸¼ºÇÒ ³»¿ëÀ» ¼±ÅÃÇÏÁö ¾Ê¾Ò½À´Ï´Ù." - IDS_EXIT "Á¾·á" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "ÆÄÀÏ ¼­ºñ½º ½ÃÀÛ Áß" - IDS_CANCEL_CONFIG_MSG "ÀÌ ½ÃÁ¡¿¡¼­ Ãë¼ÒÇϸé, ÄÄÇ»ÅÍ´Â ºÎºÐÀûÀ¸·Î¸¸ AFS ¼­¹ö·Î ±¸¼ºµË´Ï´Ù. ±×·¡µµ Ãë¼ÒÇϽðڽÀ´Ï±î?" - IDS_WIZARD_APP_TITLE "AFS ¼­¹ö ºü¸¥ ½ÃÀÛ ¸¶¹ý»ç" - IDS_CANCEL_PENDING "*** º¸·ù Ãë¼Ò - Àá½Ã¸¸ ±â´Ù¸®½Ê½Ã¿À...***" - IDS_CHECK_FS_CONFIG "ÆÄÀÏ ¼­¹ö È®ÀÎ..." - IDS_CHECK_DB_CONFIG "µ¥ÀÌÅͺ£À̽º ¼­¹ö È®ÀÎ..." - IDS_CHECK_BAK_CONFIG "¹é¾÷ ¼­¹ö È®ÀÎ..." - IDS_CHECK_PARTITION "AFS ÆÄƼ¼Ç È®ÀÎ..." - IDS_CHECK_ROOT_AFS "·çÆ® º¼·ý È®ÀÎ..." - IDS_CHECK_REP "·çÆ® º¼·ý º¹Á¦ È®ÀÎ..." - IDS_CANCEL_GET_CONFIG "Ãë¼Ò Áß...Àá½Ã¸¸ ±â´Ù¸®½Ê½Ã¿À..." - IDS_ALREADY_A_BACKUP_SERVER "ÀÌ ±â°è´Â ÀÌ¹Ì ¹é¾÷ ¼­¹ö·Î ±¸¼ºµÇ¾ú½À´Ï´Ù." - IDS_NOT_A_DB_SERVER "ÀÌ ±â°è´Â µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù. ¹é¾÷ ¼­¹ö´Â µ¥ÀÌÅͺ£À̽º ¼­¹ö ±â°è¿¡¼­¸¸ ½ÇÇàµÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_ALREADY_A_SYS_CONTROL_SERVER - "ÀÌ ±â°è´Â ÀÌ¹Ì ½Ã½ºÅÛ Á¦¾î ¼­¹ö·Î ±¸¼ºµÇ¾ú½À´Ï´Ù." - IDS_ALREADY_A_SYS_CONTROL_CLIENT - "ÀÌ ±â°è´Â ÀÌ¹Ì ½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®·Î ±¸¼ºµÇ¾ú½À´Ï´Ù." - IDS_SC_NOT_A_DB_OR_FS_SERVER - "ÀÌ ±â°è´Â µ¥ÀÌÅͺ£À̽º ¶Ç´Â ÆÄÀÏ ¼­¹ö·Î ±¸¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù. ÄÄÇ»ÅÍ´Â µ¥ÀÌÅͺ£À̽º ¶Ç´Â ÆÄÀÏ ¼­¹ö ±â°è·Î ±¸¼ºµÈ °æ¿ì¿¡¸¸ ½Ã½ºÅÛ Á¦¾î ±â°è·Î ±¸¼ºµÉ ¼ö ÀÖ½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "º¼·ý" - IDS_NAME_OR_ERROR "À̸§(¶Ç´Â ¿À·ù ¸Þ½ÃÁö)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "ÀÌ ±â°è´Â µ¥ÀÌÅͺ£À̽º ¶Ç´Â ÆÄÀÏ ¼­¹ö·Î ±¸¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù. ÄÄÇ»ÅÍ´Â µ¥ÀÌÅͺ£À̽º ¶Ç´Â ÆÄÀÏ ¼­¹ö ±â°è·Î ±¸¼ºµÈ °æ¿ì¿¡¸¸ ÀÌÁø ºÐ¹è ±â°è·Î ±¸¼ºµÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_CHECK_SCS "½Ã½ºÅÛ Á¦¾î ¼­¹ö È®ÀÎ..." - IDS_CHECK_SCC "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ® È®ÀÎ..." - IDS_SIZE "Å©±â" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "¼¿ÀÇ Ã¹¹øÂ° AFS ¼­¹öÀ̹ǷΠÆÄÀÏ ¼­ºñ½º°¡ ±¸¼ºµË´Ï´Ù." - IDS_MUST_CONFIG_DB "¼¿ÀÇ Ã¹¹øÂ° AFS ¼­¹öÀ̹ǷÎ, µ¥ÀÌŸº£À̽º ¼­ºñ½º°¡ ±¸¼ºµË´Ï´Ù." - IDS_MUST_MAKE_PARTITION "ÆÄƼ¼ÇÀº ¼¿ÀÇ Ã¹¹øÂ° AFS ¼­¹öÀ̹ǷΠÀÛ¼ºµÇ¾î¾ß ÇÕ´Ï´Ù." - IDS_MUST_CREATE_ROOT_AFS - "¼¿ÀÇ Ã¹¹øÂ° AFS ¼­¹öÀ̹ǷΠroot.afs ¹× root.cell º¼·ýÀÌ ÀÛ¼ºµË´Ï´Ù." - IDS_MUST_REPLICATE "¼¿ÀÇ Ã¹¹øÂ° AFS ¼­¹öÀ̹ǷΠroot.afs ¹× root.cell º¼·ýÀÌ º¹Á¦µË´Ï´Ù." - IDS_CHECK_AFS_CLIENT "AFS Ŭ¶óÀÌ¾ðÆ® ¼³Ä¡ È®ÀÎ..." - IDS_ERROR_HOST_NAME "ÀÌ ±â°èÀÇ È£½ºÆ® À̸§À» ÆÇº°ÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù." - IDS_ERROR_DRIVE_COMPRESSED "µå¶óÀ̺갡 ¾ÐÃàµÇ¾ú½À´Ï´Ù" - IDS_ERROR_CFG_HOST_OPEN "¼­¹ö ±¸¼º ¶óÀ̺귯¸®¸¦ Ãʱ⠼³Á¤ÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "AFS Ŭ¶óÀÌ¾ðÆ® Á¤Áö Áß" - IDS_ERROR_LOCAL_HOST_NAME - "ÀÌ ±â°èÀÇ Áö¿ª È£½ºÆ® À̸§À» ÆÇº°ÇÏÁö ¸øÇß½À´Ï´Ù." - IDS_GET_TOKENS_ERROR "ÅäÅ«À» È®º¸ÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù. ÀÔ·ÂÇÑ »ç¿ëÀÚ À̸§ ¹× ¾ÏÈ£°¡ ¿Ã¹Ù¸¥Áö °ËÁõÇϽʽÿÀ." - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "ÆÄÀÏ ¼­ºñ½º°¡ ½ÃÀÛµÇÁö ¾Ê¾Æ º¹¿øÀ» ¼öÇàÇÒ ¼ö ¾ø½À´Ï´Ù. ÆÄÀÏ ¼­ºñ½º¸¦ ½ÃÀÛÇÑ ÈÄ º¹¿øÀ» Àç½ÃµµÇϽʽÿÀ." - IDS_SALVAGING "º¹¿øÀÌ ÁøÇà ÁßÀÔ´Ï´Ù. ±â´Ù¸®½Ê½Ã¿À..." - IDS_CURRENT_SALVAGE_LOG "ÇöÀç º¹¿ø ·Î±× ³»¿ë:" - IDS_FINAL_SALVAGE_LOG "ÃÖÁ¾ º¹¿ø ·Î±× ³»¿ë:" - IDS_SALVAGE_COMPLETE "º¹¿øÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù." - IDS_CANT_GET_SALVAGE_LOG "º¹¿ø ·Î±×¸¦ °Ë»öÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK - "º¹¿ø ·Î±×¸¦ µð½ºÅ©¿¡ ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_VALIDATION_ERROR_TEMPLATE - "ÁöÁ¤µÈ %1ÀÌ(°¡) À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù. %2À»(¸¦) ´Ù½Ã ÀÔ·ÂÇϽʽÿÀ." - IDS_CELL_NAME_VALIDATION_TYPE "¼¿ À̸§" - IDS_SERVER_NAME_VALIDATION_TYPE "¼­¹ö À̸§" - IDS_PASSWORD_VALIDATION_TYPE "¾ÏÈ£" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "»ç¿ëÀÚ À̸§" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "AFS Ŭ¶óÀÌ¾ðÆ®°¡ ¼³Ä¡µÇÁö ¾Ê¾Ò½À´Ï´Ù. AFS Ŭ¶óÀÌ¾ðÆ®´Â AFS ¼­¹ö°¡ ±¸¼ºµÇ±â Àü¿¡ ¼³Ä¡µÇ¾î¾ß ÇÕ´Ï´Ù." - IDS_ERROR_AFS_CLIENT_CHECK "AFS ¼³Ä¡ ¿©ºÎ¸¦ ÆÇº°ÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù." - IDS_ERROR_FS_IS_NOT_NTFS "ÆÄÀÏ ½Ã½ºÅÛÀÌ NTFS°¡ ¾Æ´Õ´Ï´Ù" - IDS_ERROR_DRIVE_HAS_DATA "µå¶óÀ̺꿡 µ¥ÀÌÅͰ¡ ÀÖ½À´Ï´Ù" - IDS_PARTITION_STEP_DESC "AFS ÆÄƼ¼ÇÀ» ÀÛ¼ºÇϽʽÿÀ" - IDS_ERROR_DRIVE_CONTAINS_NT "µå¶óÀ̺꿡 NT ¼³Ä¡°¡ ÀÖ½À´Ï´Ù" - IDS_DB_STEP_DESC "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ½ÃÀÛÇϽʽÿÀ" - IDS_FS_STEP_DESC "ÆÄÀÏ ¼­ºñ½º¸¦ ½ÃÀÛÇϽʽÿÀ" - IDS_SCC_STEP_DESC "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÃÀÛÇϽʽÿÀ" - IDS_SCS_STEP_DESC "½Ã½ºÅÛ Á¦¾î ¼­¹ö¸¦ ½ÃÀÛÇϽʽÿÀ" - IDS_ROOT_AFS_STEP_DESC "·çÆ® º¼·ýÀ» ÀÛ¼ºÇϽʽÿÀ" - IDS_REP_STEP_DESC "·çÆ® º¼·ýÀ» º¹Á¦ÇϽʽÿÀ" - IDS_PARTITIONS_PAGE_TITLE "ÆÄƼ¼Ç" - IDS_CONFIGURE "±¸¼º(&C)" - IDS_DB_AND_BK_STEP_DESC "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º(¹é¾÷ ¼­¹ö Æ÷ÇÔ)¸¦ ½ÃÀÛÇϽʽÿÀ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "AFS ÆÄƼ¼Ç ÀÛ¼º Áß" - IDS_CONFIG_COMMON_FUNCS "¸ðµç ¼­ºñ½º¿¡ °øÅëÀÎ ±â´É ±¸¼º Áß" - IDS_START_DB_STEP "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º ½ÃÀÛ Áß" - IDS_START_SCC_STEP "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®·Î ½Ã½ºÅÛ Á¦¾î ¼­ºñ½º ½ÃÀÛ Áß" - IDS_START_SCS_STEP "½Ã½ºÅÛ Á¦¾î ¼­¹ö·Î ½Ã½ºÅÛ Á¦¾î ¼­ºñ½º ½ÃÀÛ Áß" - IDS_CREATE_ROOT_AFS_STEP "root.afs º¼·ý ÀÛ¼º Áß" - IDS_REP_STEP "·çÆ® º¼·ý º¹Á¦ Áß" - IDS_START_AUTH_STEP "ÀÌ ¼­¹ö¿¡ ´ëÇÑ ÅäÅ« È®º¸ Áß" - IDS_SERVICES_PAGE_TITLE "¼­ºñ½º" - IDS_CONFIG_SUCCEEDED "±¸¼ºÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù." - IDS_CONFIG_CANCELED "±¸¼ºÀÌ Ãë¼ÒµÇ¾ú½À´Ï´Ù." - IDS_CONFIG_FAILED "±¸¼º¿¡ ½ÇÆÐÇß½À´Ï´Ù.\r\nÀÚ¼¼ÇÑ %1 ·Î±× ÆÄÀÏÀÌ %2 À§Ä¡¿¡ ÀÛ¼ºµÇ¾ú½À´Ï´Ù." - IDS_ERROR_NO_LICENSE_NUM "AFS »ç¿ë±Ç ¹øÈ£¸¦ ãÁö ¸øÇß½À´Ï´Ù." - IDS_VERIFY_CLIENT_INSTALL_STEP "AFS Ŭ¶óÀ̾ðÆ®ÀÇ ¼³Ä¡ È®ÀÎ Áß" - IDS_SET_SERVER_LICENSE_STEP "ÀÌ ¼­¹ö¿¡ ´ëÇÑ »ç¿ë±Ç ¼³Á¤ Áß" - IDS_DEFINE_CELL_NAME_STEP "ÀÌ ¼¿¿¡ ´ëÇÑ À̸§ Á¤ÀÇ Áß" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP "ÀÌ ¼­¹ö¸¦ ¼¿ÀÇ ±¸¼º¿øÀ¸·Î ÀÛ¼º Áß" - IDS_START_BOS_SERVER_STEP "BOS ¼­¹ö ½ÃÀÛ Áß" - IDS_START_AUTH_SERVER_STEP "ÀÎÁõ ¼­¹ö ½ÃÀÛ Áß" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP "ÀÌ ¼­¹ö¿¡ ´ëÇÑ °èÁ¤ ¹× Ű ÀÛ¼º Áß" - IDS_START_DB_AND_BK_STEP "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º(¹é¾÷ ¼­¹ö Æ÷ÇÔ) ½ÃÀÛ Áß" - IDS_CREATE_ADMIN_PRINCIPAL_STEP "¼¿ °ü¸® °èÁ¤ ÀÛ¼º Áß" - IDS_START_CLIENT_STEP "AFS Ŭ¶óÀÌ¾ðÆ® ½ÃÀÛ Áß" - IDS_SET_ROOT_ACL_STEP "root.afs º¼·ý¿¡¼­ ACL ¼³Á¤ Áß" - IDS_CREATE_ROOT_CELL_STEP "root.cell º¼·ý ÀÛ¼º Áß" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP - "Ç¥ÁØ ¸¶¿îÆ® Æ÷ÀÎÆ®¸¦ »ç¿ëÇÏ¿© root.cell ¸¶¿îÆ® Áß" - IDS_SET_ROOT_CELL_ACL_STEP "root.cell º¼·ý¿¡¼­ ACL ¼³Á¤ Áß" - IDS_MOUNT_ROOT_CELL_RW_STEP - "Àбâ/¾²±â ¸¶¿îÆ® Æ÷ÀÎÆ®¸¦ »ç¿ëÇÏ¿© root.cell º¼·ý ¸¶¿îÆ® Áß" - IDS_ENABLE_AUTH_CHECKING_STEP "ÀÎÁõ È®ÀÎ ÀÛµ¿ Áß" - IDS_OBTAIN_ADMIN_CREDS_STEP "°ü¸® ÅäÅ« È®º¸ Áß" - IDS_RESTART_SERVERS_STEP "ÀÌ ±â°è¿¡¼­ ¸ðµç ¼­¹ö¸¦ ÀÎÁõµÈ ¼­¹ö·Î Àç½ÃÀÛ Áß" - IDS_ALREADY_A_FS_SERVER "ÀÌ ±â°è´Â ÀÌ¹Ì ÆÄÀÏ ¼­¹ö·Î ±¸¼ºµÇ¾ú½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "ÀÌ ±â°è´Â ÀÌ¹Ì µ¥ÀÌÅͺ£À̽º ¼­¹ö·Î ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù." - IDS_INTRO_PAGE "°³¿ä" - IDS_INFO_PAGE "¼¿ ¹× ¼­¹ö Á¤º¸" - IDS_FS_PAGE "ÆÄÀÏ ¼­ºñ½º" - IDS_DB_PAGE "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º" - IDS_CFG_TOOL_APP_TITLE "AFS ¼­¹ö ±¸¼º" - IDS_BK_PAGE "¹é¾÷ ¼­¹ö" - IDS_ROOT_AFS_PAGE "·çÆ® AFS º¼·ý" - IDS_NAME "À̸§" - IDS_REP_PAGE "º¹Á¦" - IDS_SC_PAGE "½Ã½ºÅÛ Á¦¾î ¼­ºñ½º" - IDS_CONFIG_PAGE "½Ã½ºÅÛÀ» ±¸¼ºÇϽʽÿÀ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "AFS ÆÄƼ¼Ç" - IDS_GRAPHIC_FONT "±¼¸², 12, B" - IDS_CURRENT_STEP "ÇöÀç ´Ü°è:" - IDS_ADD_TO_CELLSERVDB_STEP "ÀÌ ¼­¹ö¸¦ CellServDB¿¡ Ãß°¡ Áß" - IDS_RESTART_ALL_DB_SERVERS_STEP "¼¿ ³»ÀÇ ¸ðµç µ¥ÀÌÅͺ£À̽º ¼­¹ö Àç½ÃÀÛ Áß" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "±¸¼ºÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù. ÁÖ: »ç¿ëÀÚ ¼¿¿¡ ÀÖ´Â ¸ðµç AFS Ŭ¶óÀ̾ðÆ®ÀÇ CellServDB ÆÄÀÏÀ» °»½ÅÇØ¾ß ÇÕ´Ï´Ù. ´Ù¸¥ »çÀÌÆ®¿¡¼­ »ç¿ëÀÚ ¼¿À» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ·Á¸é AFS Á¦Ç° Áö¿ø¿¡ Ãֽе¥ÀÌÅͺ£À̽º ¼­¹öÀÇ ¸ñ·ÏÀ» Á¦°øÇØ¾ß ÇÕ´Ï´Ù. " - IDS_SYS_CONTROL_SERVER_ONLY_MSG - "ÀÌ ±â°è¸¦ ½Ã½ºÅÛ Á¦¾î ¼­¹ö·Î ±¸¼ºÇϽðڽÀ´Ï±î?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG - "½Ã½ºÅÛ Á¦¾î ¼­¹ö·Î ±¸¼ºÇÏÁö ¾ÊÀ½(&O)" - IDS_CLIENT_CELL_WILL_CHANGE - "AFS ¼­¹öÀÇ ±¸¼º¿¡¼­´Â AFS Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö¿Í °°Àº ¼¿¿¡ ±¸¼ºµÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ´Â ÀÚµ¿À¸·Î ÀÌ·ç¾îÁý´Ï´Ù." - IDS_INFO_PAGE2 "°ü¸® Á¤º¸" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "±¸¼ºÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù.\r\nÁÖ: ´Ù¸¥ »çÀÌÆ®¿¡¼­ ¼¿À» »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ·Á¸é »ç¿ëÀÚÀÇ µ¥ÀÌÅͺ£À̽º ¼­¹ö ¸ñ·ÏÀ» Á¦°øÇØ¾ß ÇÕ´Ï´Ù." - IDS_CONFIG_SCS "¼¿ÀÇ ½Ã½ºÅÛ Á¦¾î ¼­¹ö·Î ±¸¼ºÇϽʽÿÀ." - IDS_CONFIG_INTO_CELL_MSG "ÀÌ È£½ºÆ®¸¦ ¼¿¿¡ ±¸¼ºÇϽʽÿÀ " - IDS_VIEW_LOG "·Î±× º¸±â(&V)" - IDS_VIEW_LOG_ERROR "·Î±× ÆÄÀÏÀ» º¼ ¼ö ¾ø½À´Ï´Ù" - IDS_ERROR_NO_LOG_FILE "·Î±× ÆÄÀÏÀÌ ¾ø½À´Ï´Ù." - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED - "È£½ºÆ®¿¡¼­ CellServDB¸¦ °»½ÅÇß½À´Ï´Ù " - IDS_UPDATING_CELLSERVDB_HOST_FAILED - "È£½ºÆ®¿¡¼­ CellServDB¸¦ °»½ÅÇÏÁö ¸øÇß½À´Ï´Ù " - IDS_CELL_NAME_LEN_ERROR "ÀÔ·ÂÇÑ ¼¿ À̸§ÀÌ ³Ê¹« ±é´Ï´Ù. ¼¿ À̸§Àº 64 ¹®ÀÚ¸¦ ÃʰúÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_CONFIG_CHECK_FAILED "ÀÌ ±â°èÀÇ ÇöÀç ±¸¼ºÀ» ÆÇº°ÇÏÁö ¸øÇß½À´Ï´Ù." - IDS_YES "¿¹" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "¾Æ´Ï¿À" - IDS_FREE "»ç¿ë°¡´ÉÇÑ °ø°£" - IDS_TOTAL "ÃÑ Å©±â" - IDS_DRIVE2 "µå¶óÀ̺ê" - IDS_SERVICE_STATUS "»óÅÂ" - IDS_SERVICE "¼­ºñ½º" - IDS_FS_RUNNING "ÆÄÀÏ ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_FS_STOPPED "ÆÄÀÏ ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÌ ¾Æ´Õ´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_DB_STOPPED "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÌ ¾Æ´Õ´Ï´Ù." - IDS_BK_RUNNING "¹é¾÷ ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_BK_STOPPED "¹é¾÷ ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÌ ¾Æ´Õ´Ï´Ù." - IDS_SCS_STOPPED "½Ã½ºÅÛ Á¦¾î ¼­¹ö°¡ ÇöÀç ½ÇÇà ÁßÀÌ ¾Æ´Õ´Ï´Ù." - IDS_SCC_STOPPED "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®°¡ ÇöÀç ½ÇÇà ÁßÀÌ ¾Æ´Õ´Ï´Ù." - IDS_FS_HOW_TO_RUN "ÆÄÀÏ ¼­ºñ½º¸¦ ½ÃÀÛÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÇϽʽÿÀ." - IDS_FS_HOW_TO_STOP "ÆÄÀÏ ¼­ºñ½º¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ." - IDS_DB_HOW_TO_RUN "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ½ÃÀÛÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÇϽʽÿÀ." - IDS_DB_HOW_TO_STOP "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ." - IDS_BK_HOW_TO_RUN "¹é¾÷ ¼­ºñ½º¸¦ ½ÃÀÛÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÇϽʽÿÀ." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "¹é¾÷ ¼­ºñ½º¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ." - IDS_SCS_HOW_TO_RUN "½Ã½ºÅÛ Á¦¾î ¼­¹ö¸¦ ½ÃÀÛÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÇϽʽÿÀ." - IDS_SCS_HOW_TO_STOP "½Ã½ºÅÛ Á¦¾î ¼­¹ö¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ." - IDS_DB_PARTIAL_CONFIG "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º´Â ºÎºÐÀûÀ¸·Î ±¸¼ºµË´Ï´Ù." - IDS_DB_DETAILS "´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾òÀ¸·Á¸é, ÀÚ¼¼È÷¸¦ ´©¸£½Ê½Ã¿À." - IDS_BK_DISABLED "¹é¾÷ ¼­ºñ½º´Â »ç¿ëºÒ°¡´ÉÇÕ´Ï´Ù." - IDS_BK_ENABLE "¹é¾÷ ¼­ºñ½º¸¦ »ç¿ë °¡´ÉÇÏ°Ô ÇÏ·Á¸é, µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù." - IDS_SC_DISABLED "ÀÌ ¼­¹ö´Â »ç¿ëºÒ°¡´ÉÇÕ´Ï´Ù." - IDS_SC_ENABLE "ÀÌ ¼­¹ö¸¦ »ç¿ë ÇÏ·Á¸é, ÆÄÀÏ ¼­ºñ½º ¶Ç´Â µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù." - IDS_FS_WILL_RUN "ÆÄÀÏ ¼­ºñ½º°¡ ½ÃÀ۵˴ϴÙ." - IDS_FS_WILL_STOP "ÆÄÀÏ ¼­¹ö°¡ Á¤ÁöµË´Ï´Ù." - IDS_DB_WILL_RUN "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º°¡ ½ÃÀ۵˴ϴÙ." - IDS_DB_WILL_STOP "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º°¡ Á¤ÁöµË´Ï´Ù." - IDS_BK_WILL_RUN "¹é¾÷ ¼­ºñ½º°¡ ½ÃÀ۵˴ϴÙ." - IDS_BK_WILL_STOP "¹é¾÷ ¼­ºñ½º°¡ Á¤ÁöµË´Ï´Ù." - IDS_SCS_WILL_RUN "½Ã½ºÅÛ Á¦¾î ¼­¹ö°¡ ½ÃÀ۵˴ϴÙ." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "½Ã½ºÅÛ Á¦¾î ¼­¹ö°¡ Á¤ÁöµË´Ï´Ù." - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "µå¶óÀ̺ê´Â ÀÌ¹Ì AFS ÆÄƼ¼ÇÀÔ´Ï´Ù" - IDS_VOLUME_HAS_NO_NAME "<º¼·ý¿¡ À̸§ÀÌ ¾ø½À´Ï´Ù>" - IDS_PARTITION_CREATED "»õ AFS ÆÄƼ¼ÇÀÌ ÀÛ¼ºµÇ¾ú½À´Ï´Ù." - IDS_PARTITION_EXISTS "ÀÔ·ÂÇÑ ÆÄƼ¼Ç À̸§ÀÌ ÀÌ¹Ì ´Ù¸¥ ÆÄƼ¼Ç¿¡¼­ »ç¿ëÇϰí ÀÖ½À´Ï´Ù." - IDS_SCS_RUNNING "½Ã½ºÅÛ Á¦¾î ¼­¹ö´Â ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN "ÀÌ µå¶óÀ̺꿡´Â ÈÞÁöÅ븸 ÀÖ½À´Ï´Ù." - IDS_SCC_WILL_RUN "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®°¡ ½ÃÀ۵˴ϴÙ." - IDS_SCC_WILL_STOP "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®°¡ Á¤ÁöµË´Ï´Ù." - IDS_SCC_RUNNING "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®´Â ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_SCC_HOW_TO_RUN "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÃÀÛÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÇϽʽÿÀ." - IDS_SCC_HOW_TO_STOP "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®¸¦ Á¤ÁöÇÏ·Á¸é, À§ÀÇ »óÀÚ¸¦ ¼±ÅÃÃë¼ÒÇϽʽÿÀ." - IDS_SCS_ENABLE "ÀÌ ¼­¹ö¸¦ ÀÛµ¿½ÃŰ·Á¸é, ½Ã½ºÅÛ Á¦¾î Ŭ¶óÀ̾ðÆ®ÀÇ ½ÇÇàÀ» Á¤Áö½ÃÄÑ¾ß ÇÕ´Ï´Ù." - IDS_SCC_ENABLE "ÀÌ ¼­¹ö¸¦ ÀÛµ¿½ÃŰ·Á¸é, ½Ã½ºÅÛ Á¦¾î ¼­¹öÀÇ ½ÇÇàÀ» Á¤Áö½ÃÄÑ¾ß ÇÕ´Ï´Ù." - IDS_UNCONFIG_DB_STEP "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_DB_STEP_DESC "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ±¸¼ºÃë¼ÒÇϽʽÿÀ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP - "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º(¹é¾÷ ¼­¹ö Æ÷ÇÔ) ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC - "µ¥ÀÌÅͺ£À̽º ¼­ºñ½º(¹× ¹é¾÷ ¼­¹ö) ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_BK_STEP "¹é¾÷ ¼­¹ö ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_BK_STEP_DESC "¹é¾÷ ¼­¹ö¸¦ ±¸¼ºÃë¼ÒÇϽʽÿÀ" - IDS_UNCONFIG_FS_STEP "ÆÄÀÏ ¼­ºñ½º ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_FS_STEP_DESC "ÆÄÀÏ ¼­ºñ½º¸¦ ±¸¼ºÃë¼ÒÇϽʽÿÀ" - IDS_UNCONFIG_SCS_STEP "½Ã½ºÅÛ Á¦¾î ¼­¹ö ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_SCS_STEP_DESC "½Ã½ºÅÛ Á¦¾î ¼­¹ö¸¦ ±¸¼ºÃë¼ÒÇϽʽÿÀ" - IDS_UNCONFIG_SCC_STEP "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ® ±¸¼ºÃë¼Ò Áß" - IDS_UNCONFIG_SCC_STEP_DESC "½Ã½ºÅÛ Á¦¾î Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸¼ºÃë¼ÒÇϽʽÿÀ" - IDS_INVALIDATE_CONFIG_INFO_STEP "ÀÌ ±â°èÀÇ ±¸¼º Á¤º¸ ¹«È¿È­" - IDS_CLOSE "´Ý±â(&C)" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "¾Æ·¡ÀÇ AFS ¼­¹ö¿¡¼­´Â CellServDB ÆÄÀÏÀ» °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ´Â Ä¡¸íÀûÀÎ ¿À·ù´Â ¾Æ´Õ´Ï´Ù.\r\n" - IDS_DELETE_PARTITION_PROMPT "'%1' ÆÄƼ¼ÇÀ» »èÁ¦ÇϽðڽÀ´Ï±î?" - IDS_INVALIDATE_CFG_INFO "Áö±Ý ÀÌ ÄÄÇ»ÅÍ¿¡¼­ ½ÇÇà ÁßÀÎ AFS ¼­¹ö ÇÁ·Î¼¼½º°¡ ¾ø½À´Ï´Ù. ÀÌ ±â°è¿¡¼­ ±¸¼º Á¤º¸¸¦ Á¦°ÅÇϽðڽÀ´Ï±î?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "´õ ÀÌ»ó ¼¿ÀÌ ¾ø½À´Ï´Ù. AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥Àº AFS ¼¿¿¡ ÀÌ¹Ì ±¸¼ºµÈ ¼­¹ö ±â°è¸¦ ±¸¼ºÇÒ ¶§¸¸ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. AFS ±¸¼º ¸¶¹ý»ç´Â »õ ¼¿À» ½ÃÀÛÇÒ ¶§ »ç¿ëµË´Ï´Ù." - IDS_CFG_MAN_CANT_CONTINUE - "AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥Àº ÀÌÁ¦ ÁߴܵǾî¾ß ÇÕ´Ï´Ù. ÀÌ´Â ÀÌ¹Ì AFS ¼­¹ö·Î ±¸¼ºµÈ ±â°è¿¡¼­¸¸ ½ÇÇàµÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ±â°è¸¦ ´Ù½Ã AFS ¼­¹ö·Î ±¸¼ºÇÏ·Á¸é, AFS ±¸¼º ¸¶¹ý»ç¸¦ ½ÇÇàÇϽʽÿÀ." - IDS_CONFIG_INFO_INVALIDATED - "ÀÌ ±â°è´Â ´õ ÀÌ»ó AFS ¼­¹ö·Î ±¸¼ºµÇÁö ¾Ê½À´Ï´Ù. AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥Àº AFS ¼­¹ö ±â°è¸¦ ±¸¼ºÇÒ ¶§¸¸ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. AFS ±¸¼º ¸¶¹ý»ç´Â ÀÌ ±â°è¸¦ AFS ¼­¹ö·Î À籸¼ºÇÒ ¶§ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_GET_TOKENS_FAILED "ÁöÁ¤µÈ ¼¿¿¡ ´ëÇÑ ÅäÅ« È®º¸¿¡ ½ÇÆÐÇß½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "¹é¾÷ ¼­¹ö ½ÃÀÛ Áß" - IDS_BK_STEP_DESC "¹é¾÷ ¼­¹ö¸¦ ½ÃÀÛÇϽʽÿÀ" - IDS_CONFIG_ERROR "±¸¼º ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù" - IDS_CREATE_PARTITION_ERROR "ÆÄƼ¼ÇÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù" - IDS_REMOVE_PARTITION_ERROR "ÆÄƼ¼ÇÀ» Á¦°ÅÇÒ ¼ö ¾ø½À´Ï´Ù" - IDS_READ_PARTITIONS_ERROR "ÆÄƼ¼Ç Å×À̺íÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\nCellServDB °»½Å ÇÁ·Î¼¼½º°¡ ¹Ì¿ÏÀÇ »óÅ·ΠÁߴܵǾú½À´Ï´Ù. ¸ðµç ¼­¹ö°¡ °»½ÅµÇÁö ¾Ê¾ÒÀ» ¼öµµ ÀÖ½À´Ï´Ù." - IDS_GET_PARTITION_LIST_ERROR "ÀÌ ¼­¹ö¿¡¼­ ÆÄƼ¼ÇÀ» ÆÇº°ÇÒ ¼ö ¾ø½À´Ï´Ù" - IDS_EXPORTED "¹ÝÃâµÊ" - IDS_CANT_DELETE_EXPORTED_PARTITION - "ÆÄÀÏ ¼­ºñ½º°¡ ½ÇÇà ÁßÀÏ ¶§´Â ¹ÝÃâµÈ ÆÄƼ¼ÇÀ» Á¦°ÅµÉ ¼ö ¾ø½À´Ï´Ù. ÀÌ ÆÄƼ¼ÇÀ» Á¦°ÅÇϱâ Àü¿¡ ÆÄÀÏ ¼­ºñ½º¸¦ Á¤ÁöÇØ¾ß ÇÕ´Ï´Ù." - IDS_CHECK_CONFIG_INFO "À¯È¿ÇÑ ±¸¼º Á¤º¸ È®ÀÎ Áß..." - IDS_ERROR_CFG_HOST_CLOSE "¼­¹ö ±¸¼º ¶óÀ̺귯¸®¸¦ ´Ý´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù" - IDS_FAILED_OPEN_CELL "¼¿À» ¿©´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù" - IDS_FAILED_OPEN_NULL_CELL "³Î ¼¿ ÇÚµéÀ» ¿©´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "·çÆ® º¼·ýÀÌ ¾øÀ» °æ¿ì, À̸¦ ÀÛ¼ºÇϽðڽÀ´Ï±î?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "·çÆ® º¼·ýÀÌ º¹Á¦µÇÁö ¾Ê¾ÒÀ» °æ¿ì, À̸¦ º¹Á¦ÇϽðڽÀ´Ï±î?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS ¼­¹ö" - IDS_CANT_INIT_ADMIN_LIBS - "ÀÌ ÀÀ¿ëÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù. ¶óÀ̺귯¸®¸¦ Ãʱ⼳Á¤ÇÏÁö ¸øÇß½À´Ï´Ù." - IDS_CANT_OPEN_LOG_FILE "·Î±× ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù." - IDS_NEED_CLIENT_INFO "AFS Ŭ¶óÀÌ¾ðÆ®°¡ ÀÌ ÄÄÇ»ÅÍ¿¡ ±¸¼ºµÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù. AFS ±¸¼º ¸¶¹ý»ç´Â ÀÌ·± °æ¿ì¿¡ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. AFS ±¸¼º ¸¶¹ý»ç¸¦ ½ÇÇàÇϽðڽÀ´Ï±î?" - IDS_NEED_SERVER_INFO "ÀÌ ÄÄÇ»ÅÍ´Â AFS ¼­¹ö·Î ±¸¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù. AFS ±¸¼º ¸¶¹ý»ç´Â AFS ¼­¹ö¸¦ Ãʱ⠱¸¼ºÇÒ ¶§ »ç¿ëµÇ¾î¾ß ÇÕ´Ï´Ù. ±×·± ´ÙÀ½, AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. AFS ±¸¼º ¸¶¹ý»ç¸¦ ½ÇÇàÇÏ¿© ÀÌ ÄÄÇ»Å͸¦ Ãʱ⠱¸¼ºÇϽðڽÀ´Ï±î?" - IDS_ADVANCED_OPEN "<< °í±Þ(&A)" - IDS_ADVANCED_CLOSED "°í±Þ(&A) >>" - IDS_BOS_OPEN_FAILED "¼­¹ö¿¡ ¿¬°áÇÒ ¼ö ¾ø½À´Ï´Ù(bos ¿­±â ½ÇÆÐ)." - IDS_SALVAGE_ERROR "º¹¿ø Á¶ÀÛÀÌ ½ÇÆÐÇß½À´Ï´Ù." - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "ÁöÁ¤µÈ º¹¿ø ÇÁ·Î¼¼½ºÀÇ ¼ö°¡ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù. º¹¿ø ÇÁ·Î¼¼½ºÀÇ ¼ö´Â 1-32°³ÀÔ´Ï´Ù." - IDS_WRONG_CELL "ÀÌÀü ´Ü°è¿¡¼­ ±¸¼º Á¤º¸¸¦ °Ë»öÇØ¾ß ÇÒ ¼­¹ö¸¦ ÁöÁ¤Çß½À´Ï´Ù. ÁöÁ¤µÈ ¼­¹ö´Â Á¶ÀÎÇÒ ¼¿¿¡ ¼ÓÇÏÁö ¾Ê½À´Ï´Ù." - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "¼¿ÀÇ ÀϺΠ¼­¹ö¿¡ ÀÖ´Â CellServDB ÆÄÀÏÀº °»½ÅµÉ ¼ö ¾ø½À´Ï´Ù. °»½ÅµÈ ¼­¹ö ¹× °»½ÅµÇÁö ¾ÊÀº ¼­¹ö ¸ñ·ÏÀ» ¾òÀ¸·Á¸é ÆÄÀÏ¿¡ ÀúÀåµÈ ±¸¼º ·Î±×¸¦ º¸½Ê½Ã¿À." - IDS_GET_CREDENTIALS_STEP "°ü¸® ÅäÅ« È®º¸ Áß" - IDS_MUST_ENTER_SCS_NAME "½Ã½ºÅÛ Á¦¾î ±â°è À̸§Àº ±¸¼ºÀÌ ½ÃÀ۵DZâ Àü¿¡ ÀԷµǾî¾ß ÇÕ´Ï´Ù." - IDS_NOT_SAME_CELL "AFS Ŭ¶óÀÌ¾ðÆ®´Â AFS ¼­¹ö¿Í ´Ù¸¥ ¼¿¿¡ ±¸¼ºµË´Ï´Ù. AFS ¼­¹ö¸¦ ±¸¼ºÇÏ·Á¸é ¸ÕÀú AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ¼­¹öÀÇ ¼¿¿¡ À籸¼ºÇØ¾ß ÇÕ´Ï´Ù." - IDS_LAST_DB_SERVER "ÀÌ ±â°è´Â ¼¿ÀÇ ¸¶Áö¸· µ¥ÀÌÅͺ£À̽º ¼­¹ö¸¦ ½ÇÇà ÁßÀÔ´Ï´Ù. °è¼Ó ÁøÇàÇÏ¿© ÀÌ ±â°è¿¡¼­ µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¸¦ ±¸¼ºÇØÁ¦Çϸé, ¼¿Àº ´õ ÀÌ»ó Á¸ÀçÇÏÁö ¾Ê°í ÀÌ ±â°è¿¡¼­ ½ÇÇà ÁßÀÎ ´Ù¸¥ ¸ðµç AFS ¼­ºñ½ºµµ ±¸¼ºÇØÁ¦µË´Ï´Ù. ±×·¡µµ °è¼ÓÇϽðڽÀ´Ï±î?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "AFS °èÁ¤¿¡ ´ëÇÑ ¾ÏÈ£°¡ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù." - IDS_ERROR_CLIENT_VERSION - "ÀÌ ÄÄÇ»ÅÍ¿¡¼­ AFS Ŭ¶óÀ̾ðÆ®ÀÇ ¹öÀüÀº AFS ¼­¹ö¿Í ȣȯµÉ ¼ö ¾ø½À´Ï´Ù. AFS ¼­¹ö´Â ÃÖ¼ÒÇÑ ¹öÀü 3.5ÀÇ AFS Ŭ¶óÀÌ¾ðÆ®°¡ ÇÊ¿äÇÕ´Ï´Ù." - IDS_CANT_MAP_ROOT_AFS "ACLÀ» ·çÆ® º¼·ý¿¡ ¼³Á¤ÇÏ·Á¸é, µå¶óÀ̺ê À̸§ÀÌ AFS¿¡ ´ëÀÀµÇ¾î¾ß ÇÕ´Ï´Ù. ÇöÀç »ç¿ë°¡´ÉÇÑ µå¶óÀ̺ê À̸§ÀÌ ¾ø½À´Ï´Ù. µå¶óÀ̺ê À̸§À» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁ¦Çϰí È®ÀÎÀ» ´©¸£½Ê½Ã¿À." - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "ÆÄƼ¼Ç À̸§" - IDS_VOLUME_NAME_VALIDATION_TYPE "º¼·ý À̸§" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "º¹¿ø ÇÁ·Î¼¼½º ¼ö" - IDS_PATH_NAME_VALIDATION_TYPE "°æ·Î À̸§" - IDS_FILE_NAME_VALIDATION_TYPE "ÆÄÀÏ À̸§" - IDS_GENERIC_VALIDATION_TYPE "°ª" -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/ko_KR/status_16.bmp b/src/WINNT/afssvrcfg/lang/ko_KR/status_16.bmp deleted file mode 100644 index e2a09d8673d18c36643297001004bcf3882c904b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23158 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 diff --git a/src/WINNT/afssvrcfg/lang/pt_BR/afscfg.rc b/src/WINNT/afssvrcfg/lang/pt_BR/afscfg.rc deleted file mode 100644 index 1b6657734..000000000 --- a/src/WINNT/afssvrcfg/lang/pt_BR/afscfg.rc +++ /dev/null @@ -1,1204 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "Aplicação e assistente de Configuração do AFS®" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "Assistente de Iniciação Rápida do AFS® Server" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Cance&lar",IDCANCEL,101,225,50,14 - PUSHBUTTON "< Vol&tar",IDBACK,155,225,50,14 - DEFPUSHBUTTON "A&vançar >",IDNEXT,209,225,50,14 - PUSHBUTTON "&Ajuda",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "&Sim, crie uma partição.",IDC_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,94,87,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,116, - 186,52,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,101,177,20,12,ES_AUTOHSCROLL - CONTROL "&Não, não crie uma partição.",IDC_DONT_CREATE_PARTITION, - "Button",BS_AUTORADIOBUTTON,0,191,102,8 - LTEXT "Este Servidor de Arquivos irá armazenar e entregar arquivos e programas a clientes do AFS. Para que dados armazenados neste sistema sejam compartilhados através do AFS, pelo menos um volume NTFS deve estar dedicado como uma partição do AFS.", - -1,0,12,209,34 - LTEXT "&Selecione o volume para ser usado na partição:", - IDC_SELECT_DRIVE,12,106,163,9 - LTEXT "No&me da partição do AFS: /vicep",IDC_NAME_LABEL,12, - 179,89,8 - LTEXT "Criar uma partição do AFS neste Servidor de Arquivos.", - IDC_TITLE,0,0,209,8 - LTEXT "Uma partição do AFS é fisicamente equivalente a um volume NTFS, mas ela também contém metadados especializados sobre a estrutura e localização das informações na partição.", - -1,0,49,209,25 - LTEXT "Deseja criar uma partição neste Servidor de Arquivos?", - IDC_ASK_CREATE_PARTITION,0,79,209,12 - LTEXT "Mensagem definida no runtime, se necessário.", - IDC_PARTITION_MSG,0,167,210,33,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sim, configure como Servidor de Arquivos.", - IDC_SHOULD_CONFIG_FILE_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,153,10 - CONTROL "&Não, não configure como Servidor de Arquivos.", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,190,177,10 - LTEXT "O Serviço de Arquivos do AFS entrega arquivos e programas solicitados deste servidor a clientes do AFS. Este serviço também manipula todas as operações de administração de volumes, tais como criar, excluir, mover e replicar.", - -1,0,38,210,34 - LTEXT "Configurar esta máquina como Servidor de Arquivos.", - IDC_TITLE,0,0,209,8 - LTEXT "Deseja configurar esta máquina como Servidor de Arquivos?", - IDC_CREATE_FS_QUESTION,0,166,210,8 - LTEXT "Para configurar esta máquina como Servidor de Arquivos, é preciso configurar o Serviço de Arquivos.", - -1,0,14,210,17 - LTEXT "Nota: Esta máquina não possui no momento uma unidade de disco disponível para armazenar arquivos no AFS. Embora esta máquina possa ser configurada como Servidor de Arquivos, não será possível armazenar nela dados do AFS.", - IDC_NO_DRIVES_NOTE,0,77,210,32,NOT WS_VISIBLE - LTEXT "Para criar unidades de disco, use o Administrador de Discos do Windows NT.", - IDC_DISK_ADMIN_NOTE,0,112,210,16,NOT WS_VISIBLE - LTEXT "Esta máquina já está configurada como Servidor de Arquivos.", - IDC_MSG,0,166,209,34,NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Bem-vindo ao Assistente de Iniciação Rápida para o AFS Server. Este assistente irá ajudá-lo a configurar rapidamente o AFS Server neste sistema Windows NT.", - IDC_TITLE,0,0,209,26 - LTEXT "Pressione Avançar para iniciar a configuração para o AFS Server.", - IDC_STATIC,0,166,209,8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sim, replique os volumes da raiz.",IDC_REPLICATE, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,179,115,10 - CONTROL "&Não, não replique os volumes da raiz.", - IDC_DONT_REPLICATE,"Button",BS_AUTORADIOBUTTON,0,190,134, - 10 - LTEXT "Replicação é o processo de criar cópias somente de leitura de um volume em várias partições, geralmente em outros Servidores de Arquivos. A replicação aumenta a disponibilidade de um volume em caso de interrupção", - IDC_STATIC,0,35,193,34 - LTEXT "Deseja replicar os volumes da raiz?", - IDC_REPLICATE_QUESTION,0,159,209,8 - LTEXT "A replicação também ajuda a evitar que qualquer servidor seja sobrecarregado com pedidos para volumes acessados freqüentemente.", - IDC_STATIC,0,98,193,25 - LTEXT "Replicar os volumes da raiz da célula.",IDC_TITLE,0,0, - 209,8 - LTEXT "Se planejar replicar outros volumes nesta célula do AFS, você deve antes replicar os volumes da raiz.", - IDC_STATIC,0,15,209,16 - LTEXT "da rede ou do servidor, porque se um dos servidores que abriga o volume não estiver disponível, o volume ainda poderá ser acessado a partir de outro servidor.", - IDC_STATIC,0,67,193,24 - LTEXT "Mensagem definida no runtime, se necessário.", - IDC_CANT_REPLICATE_MSG,0,159,209,34,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sim, crie os volumes da raiz.",IDC_CREATE_ROOT_VOLUMES, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,179,108,10 - CONTROL "Nã&o, não crie os volumes da raiz.", - IDC_DONT_CREATE_ROOT_VOLUMES,"Button",BS_AUTORADIOBUTTON, - 0,190,124,10 - LTEXT "No AFS, volumes são coleções de arquivos relacionados que são organizados em unidades únicas, facilmente gerenciadas para facilitar a administração do sistema.", - IDC_STATIC,0,15,209,17 - LTEXT "Deseja criar os volumes da raiz?",IDC_ROOT_AFS_QUESTION, - 0,157,209,8 - LTEXT "Criar os volumes da raiz da célula.",IDC_TITLE,0,0,209, - 8 - LTEXT "Uma vez criados, os volumes da raiz estarão automaticamente acessíveis no espaço de arquivos do AFS.", - IDC_STATIC,0,67,209,17 - LTEXT "Mensagem definida no runtime, se necessário.", - IDC_ROOT_AFS_MSG,0,156,209,33,NOT WS_VISIBLE - LTEXT "O volume root.afs é a raiz do espaço de arquivos do AFS. O volume root.cell é a raiz da subárvore do espaço de arquivos do AFS nesta célula, e é acessado através de um ponto de montagem de root.afs.", - IDC_STATIC,0,31,209,32 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Configuração do AFS® Server" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,41,148,14 - LTEXT "Texto de operação - definido no runtime.",IDC_OPERATION, - 35,19,156,17 - ICON "",IDC_LOGO,7,7,20,20 - PUSHBUTTON "Cancelar",IDCANCEL,73,63,50,14 - LTEXT "Determinando a configuração atual:",IDC_OPERATION2,35,5, - 156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sim, configure como Servidor de Backup.", - IDC_CONFIG_BACKUP_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,179,143,10 - CONTROL "&Não, não configure como Servidor de Backup.", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,0,190,163,10 - LTEXT "O Servidor de Backup só pode ser executado em máquinas configuradas como Servidores de Banco de Dados. Além disso, se ele for executado em um Servidor de Banco de Dados na célula, deve ser executado em TODOS os Servidores de Bancos de Dados na célula.", - -1,0,38,207,40 - LTEXT "Deseja configurar esta máquina como Servidor de Backup?", - IDC_BACKUP_SERVER_QUESTION,0,166,209,10 - LTEXT "Configurar esta máquina como Servidor de Backup.", - IDC_TITLE,0,0,207,8 - LTEXT "O Servidor de Backup é um recurso opcional do Serviço de Banco de Dados.", - -1,0,14,209,16 - LTEXT "Esta máquina já está configurada como Servidor de Banco de Dados.", - IDC_CANT_BACKUP_MSG,0,163,210,33,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Configure como o &Servidor de Controle do Sistema.", - IDC_SYS_CONTROL_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,146,179,10 - CONTROL "Configure como um &Cliente de Controle do Sistema.", - IDC_SYS_CONTROL_CLIENT,"Button",BS_AUTORADIOBUTTON,0,158, - 182,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,106,167,101,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "Nã&o configure como um Cliente ou Servidor de Controle do Sistema.", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,0,182,206,17 - LTEXT "O Servidor de Controle do Sistema fornece arquivos comuns de configuração a outras máquinas de Servidores do AFS em execução como Clientes de Controle do Sistema. Deve haver um único Servidor de Controle do Sistema em execução nas células do AFS.", - -1,0,18,209,40 - LTEXT "Configurar como um Servidor ou Cliente de Controle do Sistema.", - IDC_TITLE,1,1,195,18 - LTEXT "Deseja configurar esta máquina como Servidor ou Cliente de Controle do Sistema?", - IDC_SYS_CONTROL_MACHINE_QUESTION,0,127,207,17 - LTEXT "Um Cliente de Controle do Sistema recebe do Servidor de Controle do Sistema da célula quaisquer atualizações disponíveis para seus arquivos de configuração do AFS.", - IDC_SYS_CONTROL_CLIENT_DESC,0,59,209,25 - LTEXT "Ser&vidor de Controle do Sistema:", - IDC_SYS_CONTROL_MACHINE_LABEL,1,169,104,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "AVISO: Locais que não usem a distribuição norte-americana do AFS® não devem distribuir arquivos de configuração via Servidor de Controle do Sistema. Isto resultará em uma transmissão não criptografada das informações delicadas do sistema.", - -1,2,86,207,35 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Estas são todas as informações necessárias para configurar o AFS Server neste sistema.", - IDC_ALL_NEEDED_MSG,1,14,209,17 - LTEXT "Configurar esta máquina na célula ", - IDC_TITLE,1,3,208,8 - LTEXT "As seguintes etapas de configuração serão realizadas:", - IDC_FOLLOWING_STEPS_MSG,1,36,187,8 - LTEXT "Etapa 1 - Texto definido no runtime",IDC_STEP1,30,50, - 165,8,NOT WS_VISIBLE - LTEXT "Etapa 3 - Texto definido no runtime",IDC_STEP3,30,74, - 165,8,NOT WS_VISIBLE - LTEXT "Etapa 2 - Texto definido no runtime",IDC_STEP2,30,62, - 165,8,NOT WS_VISIBLE - LTEXT "Etapa 4 - Texto definido no runtime",IDC_STEP4,30,86, - 165,8,NOT WS_VISIBLE - LTEXT "Etapa 5 - Texto definido no runtime",IDC_STEP5,30,98, - 165,8,NOT WS_VISIBLE - LTEXT "Etapa 6 - Texto definido no runtime",IDC_STEP6,30,110, - 165,8,NOT WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,178,200,11 - LTEXT "Etapa 8 - Texto definido no runtime",IDC_STEP8,30,134, - 165,8,NOT WS_VISIBLE - LTEXT "Etapa 7 - Texto definido no runtime",IDC_STEP7,30,122, - 165,8,NOT WS_VISIBLE - LTEXT "Mensagem definida no runtime, se necessário.", - IDC_CANT_CONFIG_MSG,1,13,209,17,NOT WS_VISIBLE - LTEXT "Porcentagem Concluída:",IDC_PERCENT_COMPLETE_LABEL,1, - 191,61,8,NOT WS_VISIBLE - LTEXT "Operação Atual:",IDC_CURRENT_STEP_LABEL,1,157,108,8,NOT - WS_VISIBLE - LTEXT "Descrição da etapa atual - definida no runtime", - IDC_CURRENT_STEP,1,167,208,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,63,191,49,8,NOT WS_VISIBLE - LTEXT "Para iniciar a configuração deste computador, pressione o botão Configurar. Para alterar as etapas de configuração a serem realizadas, pressione o botão Voltar.", - IDC_STATUS_MSG,1,159,208,41 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,100,155,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,137,154,11,14 - LTEXT "Informações Administrativas",IDC_TITLE,0,0,202,8 - LTEXT "&Nome:",IDC_ADMIN_NAME_LABEL,7,57,22,8 - LTEXT "&Senha:",IDC_ADMIN_PW_LABEL,7,73,34,8 - GROUPBOX "Nome e Senha da Conta",IDC_ADMIN_INFO_FRAME,0,41,210,65 - LTEXT "Veri&ficar senha:",IDC_VERIFY_ADMIN_PW_LABEL,7,90,52,8 - LTEXT "As informações abaixo são necessárias para criar a conta administrativa para esta nova célula.", - IDC_STATIC,0,15,209,17 - CONTROL "&Usar esta UID do AFS:",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,157,89,10 - CONTROL "Usar a &próxima UID disponível do AFS",IDC_USE_NEXT_UID, - "Button",BS_AUTORADIOBUTTON,6,144,153,10 - GROUPBOX "UID do AFS",IDC_STATIC,0,118,209,57 - LTEXT "Digite a ID de usuário para a conta administrativa do AFS:", - IDC_STATIC,6,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Sim, configure como Servidor de Banco de Dados.", - IDC_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,0,100,183,10 - CONTROL "&Não, não configure como Servidor de Banco de Dados.", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 190,200,10 - LTEXT "O Serviço de Banco de Dados mantém o conjunto de bancos de dados replicados requeridos por uma célula do AFS. Este serviço mantém todas as informações de conta, localização de volumes e (opcionalmente) de backup para a célula.", - -1,0,43,209,38 - LTEXT "Deseja configurar esta máquina como Servidor de Banco de Dados?", - IDC_DB_SERVER_QUESTION,0,81,209,17 - LTEXT "Configurar esta máquina como Servidor de Banco de Dados.", - IDC_TITLE,0,0,209,18 - LTEXT "Para configurar esta máquina como Servidor de Banco de Dados, é preciso configurar o Serviço de Banco de Dados. ", - -1,0,21,209,16 - LTEXT "Esta máquina já está configurada como Servidor de Banco de Dados.", - IDC_MSG,6,148,200,17,NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,74,171,131,12,ES_AUTOHSCROLL - LTEXT "Ser&vidor de Controle do Sistema:", - IDC_SYS_CONTROL_MACHINE_LABEL,3,172,67,17 - LTEXT "Se sua célula possui um Servidor de Controle do Sistema, informe seu nome de host abaixo. Os arquivos de configuração do AFS serão atualizados através desse servidor.", - IDC_SCM_PROMPT,12,113,195,34 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "Tornar este &host um servidor em uma célula existente do AFS", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,0,37, - 203,11 - CONTROL "&Este será o primeiro servidor em uma nova célula do AFS", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,0,51,203,10 - EDITTEXT IDC_CELL_NAME,64,91,139,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,64,166,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,64,180,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Informações sobre a Célula e o Servidor",IDC_TITLE,0,0, - 203,8 - LTEXT "Nome da &Célula:",IDC_CELL_NAME_LABEL,7,93,57,8 - LTEXT "&Senha:",IDC_SERVER_PW_LABEL,7,167,34,8,WS_DISABLED - LTEXT "Digite o nome da célula do AFS.",IDC_CELL_NAME_PROMPT,8, - 78,195,11 - LTEXT "Digite a senha para o proprietário do AFS. Todos os servidores do AFS obtêm tokens como este proprietário.", - IDC_SERVER_PW_PROMPT,7,130,196,19,WS_DISABLED - GROUPBOX "Nome da Célula",IDC_CELL_NAME_FRAME,0,67,210,43 - GROUPBOX "Senha do Servidor",IDC_SERVER_PW_FRAME,0,119,210,81, - WS_DISABLED - LTEXT "Veri&ficar senha:",IDC_VERIFY_PW_LABEL,7,180,52,8, - WS_DISABLED - LTEXT "Uma célula do AFS é uma coleção de servidores que fornecem um espaço de nome uniforme para acesso a arquivos.", - IDC_CELL_NAME_PROMPT2,1,12,202,17 - LTEXT "Nome:",IDC_PRINCIPAL_LABEL,7,152,22,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,150,139,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,53,43,149,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,53,59,149,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,53,132,149,12,ES_AUTOHSCROLL - LTEXT "Informações Administrativas",IDC_TITLE,0,0,209,8 - LTEXT "Forneça abaixo as informações administrativas da conta:", - IDC_ADMIN_INFO_PROMPT,7,30,196,10 - LTEXT "&Nome:",IDC_ADMIN_NAME_LABEL,7,46,22,8 - LTEXT "&Senha:",IDC_ADMIN_PW_LABEL,7,62,34,8 - GROUPBOX "Nome e Senha da Conta",IDC_ADMIN_INFO_FRAME,0,17,210,62 - GROUPBOX "AFS Server Existente",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS Server:",IDC_HOSTNAME_LABEL,9,134,43,8 - LTEXT "Digite o nome de host de algum outro AFS Server na célula à qual deseja se unir. As informações de configuração do AFS serão recuperadas a partir desse servidor.", - IDC_HOSTNAME_PROMPT,7,105,202,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 265 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Serviços" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_STATIC,7,17,281,40 - GROUPBOX "",IDC_STATIC,7,63,281,43 - GROUPBOX "",IDC_STATIC,7,112,281,40 - GROUPBOX "",IDC_STATIC,7,158,281,40 - CONTROL "Serviço de Arquivos",IDC_FS_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,16,94,10 - CONTROL "Serviço de Banco de Dados",IDC_DB_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,62,132,10 - PUSHBUTTON "Detalhes...",IDC_DB_DETAILS,215,72,50,14,NOT WS_VISIBLE - CONTROL "Servidor de Backup",IDC_BK_SERVICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,111,104,10 - CONTROL "Servidor de Controle do Sistema",IDC_SCS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,157,135,10 - EDITTEXT IDC_SC_MACHINE,147,225,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Selecione os serviços a serem executados neste AFS Server:", - IDC_STATIC,7,4,144,8 - LTEXT "O Serviço de Arquivos está em execução.", - IDC_FS_STATUS_MSG,14,29,261,8 - LTEXT "O Serviço de Banco de Dados está parcialmente instalado.", - IDC_DB_STATUS_MSG,14,77,195,8 - LTEXT "Ser&vidor de Controle do Sistema:",IDC_SC_MACHINE_LABEL, - 31,227,110,8,WS_DISABLED - LTEXT "Para interromper o Serviço de Arquivos, desmarque a caixa acima.", - IDC_FS_ACTION_MSG,14,41,262,8 - LTEXT "Clique em detalhes para obter maiores informações.", - IDC_DB_ACTION_MSG,14,89,264,8 - LTEXT "O Servidor de Backup está em execução.", - IDC_BK_STATUS_MSG,14,124,259,8 - LTEXT "Para interromper o Servidor de Backup, desmarque a caixa acima.", - IDC_BK_ACTION_MSG,14,136,262,8 - LTEXT "Para ativar este servidor, é preciso executar o Serviço de Arquivos ou o Serviço de Banco de Dados.", - IDC_SCS_ACTION_MSG,14,180,268,16 - LTEXT "O Serviço de Controle do Sistema não está em execução.", - IDC_SCS_STATUS_MSG,14,169,263,9 - GROUPBOX "",IDC_STATIC,7,204,281,51 - CONTROL "Cliente de Controle do Sistema.",IDC_SCC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,203,135,10 - LTEXT "Para ativar este servidor, é preciso executar o Serviço de Arquivos ou o Serviço de Banco de Dados.", - IDC_SCC_ACTION_MSG,14,239,268,15 - LTEXT "O serviço de Controle do Sistema não está em execução.", - IDC_SCC_STATUS_MSG,14,216,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Partições" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "As seguintes partições do &AFS existem em seu computador:", - IDC_STATIC,8,7,222,8 - PUSHBUTTON "&Criar...",IDC_CREATE_PARTITIONS,17,118,53,14 - LTEXT "Para recuperar uma partição ou um volume em uma partição, selecione a partição na lista e clique no botão acima. Para recuperar todas as partições neste servidor, clique no botão acima.", - IDC_SALVAGE_MSG,30,179,250,25 - PUSHBUTTON "&Recuperar...",IDC_SALVAGE,17,159,53,14 - LTEXT "Para remover uma partição, selecione a partição na lista e clique no botão acima.", - IDC_REMOVE_MSG,30,235,253,16,WS_DISABLED - PUSHBUTTON "Re&mover",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "Partições",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "Para criar uma nova partição neste servidor, clique no botão acima.", - IDC_CREATE_MSG,30,136,254,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 313, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Criar Partição do AFS" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Selecione um volume NTFS na lista abaixo para criar nele a nova partição:", - IDC_TITLE,7,5,250,8 - LTEXT "Nome da Partição do AFS:",IDC_NAME_STATIC,17,131,66,8 - EDITTEXT IDC_PARTITION_NAME,117,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Criar",IDC_CREATE,134,158,50,14,WS_DISABLED - PUSHBUTTON "&Fechar",IDC_CLOSE,190,158,50,14 - PUSHBUTTON "Ajuda",9,245,158,50,14 - GROUPBOX "Parâmetros da Partição",IDC_ARGS_FRAME,7,117,293,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,15,293, - 95,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,90,131,22,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 247, 175 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Configuração do AFS® Server" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_ADMIN_NAME,69,33,151,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,69,49,151,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,69,119,151,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Configurar",IDOK,108,154,50,14,WS_DISABLED - PUSHBUTTON "Cancelar",IDCANCEL,48,154,50,14 - PUSHBUTTON "Ajuda",9,190,154,50,14 - LTEXT "Forneça abaixo as informações administrativas da conta:", - IDC_ADMIN_INFO_PROMPT,14,20,196,10 - LTEXT "&Nome:",IDC_ADMIN_NAME_LABEL,15,36,22,8 - LTEXT "&Senha:",IDC_ADMIN_PW_LABEL,15,52,34,8 - GROUPBOX "Nome e Senha da Conta",IDC_ADMIN_INFO_FRAME,7,7,233,62 - GROUPBOX "Servidor de Controle do Sistema",IDC_HOSTNAME_FRAME,7, - 76,233,66 - LTEXT "Nome do &Host:",IDC_HOSTNAME_LABEL,15,121,52,8 - LTEXT "Se sua célula possui um Servidor de Controle do Sistema, informe seu nome de host abaixo. Os arquivos de configuração do AFS serão atualizados através desse servidor.", - IDC_HOSTNAME_PROMPT,13,88,221,27 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,150,225,9,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 81 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuração do AFS® Server" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Cancelar",IDCANCEL,103,60,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,35,200,11 - LTEXT "Porcentagem Concluída:",IDC_PERCENT_COMPLETE_LABEL,40, - 48,61,8,NOT WS_VISIBLE - LTEXT "Operação Atual:",IDC_CURRENT_STEP_LABEL,40,11,108,8,NOT - WS_VISIBLE - LTEXT "Descrição da etapa atual - definida no runtime", - IDC_CURRENT_STEP,40,23,210,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "Para iniciar a configuração deste computador, pressione o botão Configurar. Para alterar as etapas de configuração a serem realizadas, pressione o botão Voltar.", - IDC_STATUS_MSG,40,11,210,41 - PUSHBUTTON "E&xibir Log",IDNEXT,161,60,50,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erros de Atualização de CellServCB" -FONT 9, "MS Shell Dlg" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,22,162,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,75,162,50,14 - PUSHBUTTON "Ajuda",9,130,162,50,14 - LTEXT "O arquivo CellServDB nos seguintes servidores do AFS não pôde ser atualizado automaticamente:", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 243, 188 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Recuperar" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,79,99,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,133,99,50,14 - PUSHBUTTON "&Ajuda",9,187,99,50,14 - CONTROL "Recuperar todas as partições neste &Servidor de Arquivos", - IDC_SERVER,"Button",BS_AUTORADIOBUTTON,11,35,206,10 - CONTROL "Recuperar todos os volumes na &partição selecionada", - IDC_PARTITION,"Button",BS_AUTORADIOBUTTON,11,48,199,10 - CONTROL "Recuperar um volume &específico na partição selecionada", - IDC_VOLUME,"Button",BS_AUTORADIOBUTTON,11,61,203,10 - EDITTEXT IDC_VOLUME_NAME,81,74,97,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< A&vançado ",IDC_ADVANCED,4,99,50,14 - GROUPBOX "",IDC_STATIC,4,25,232,67 - LTEXT "&Nome do Volume:",IDC_VOLUME_NAME_LABEL,17,75,60,8, - WS_DISABLED - GROUPBOX "Opções Avançadas de Recuperação",IDC_ADVANCED_FRAME,4, - 119,232,62 - LTEXT "Caminho para arquivos &temporários:",IDC_TEMP_DIR_LABEL, - 9,160,84,21 - EDITTEXT IDC_LOG_FILE,95,146,133,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,211,129,21,12,ES_AUTOHSCROLL - LTEXT "Nome do arquivo para o &log de resultados:", - IDC_LOG_FILE_LABEL,9,142,83,17 - EDITTEXT IDC_TEMP_DIR,95,163,133,12,ES_AUTOHSCROLL - CONTROL "Operações Pa&ralelas de recuperação; número de processos:", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,130,204,10 - LTEXT "Se você recuperar o servidor ou toda uma partição, o servidor será posto temporariamente em estado off-line.", - IDC_STATIC,35,7,198,17 - LTEXT "NOTA:",IDC_STATIC,4,7,23,8 - LTEXT "Translators: Please Read This! This dialog resizes at runtime. In certain situaions, the dialog is resized and everything that is part of the bottom group box is hidden.", - IDC_STATIC,0,180,243,8,NOT WS_VISIBLE -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Senha de Usuário Principal do AFS" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_PW,48,42,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,31,61,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,85,61,50,14 - PUSHBUTTON "Ajuda",9,140,61,50,14 - LTEXT "A chave de proprietário do AFS não pode ser recuperada de um Servidor de Autenticação da versão anterior à 3.5. Digite abaixo a senha do proprietário do AFS.", - IDC_STATIC,7,7,183,31 - LTEXT "Senha:",IDC_STATIC,7,44,35,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Recuperar Volumes - Resultados" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "&Fechar",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "Ajuda",9,280,266,50,14 - LTEXT "",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 203 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 53 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 168 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 74 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""Aplicação e assistente de Configuração do AFS®""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "A&vançar >" - IDS_FINISH "&Finalizar" - IDS_HELP_TITLE "Botão de Ajuda Pressionado" - IDS_HELP_DESC "Não há ajuda disponível no momento." - IDS_CANCEL_DESC "Cancelar o Assistente de Iniciação Rápida do AFS?" - IDS_PARTITION_ALREADY_CREATED - "Já existe uma partição do AFS nesta máquina." - IDS_NOT_A_FS_SERVER "Esta máquina não está configurada como Servidor de Arquivos. Volumes só podem ser criados em máquinas de Servidores de Arquivos." - IDS_ROOT_AFS_ALREADY_EXISTS "Os volumes da raiz já existem." - IDS_NO_PARTITION_EXISTS "Não existem partições onde criar os volumes da raiz. É preciso que exista uma partição para que os volumes da raiz possam ser criados." - IDS_ALREADY_REPLICATED "Os volumes da raiz já estão replicados." - IDS_ROOT_AFS_DOESNT_EXIST - "Os volumes da raiz não existem. Eles devem existir para que possam ser replicados." - IDS_ALREADY_CONFIGURED "Esta máquina já está configurada como um AFS Server." - IDS_NOTHING_TO_CONFIGURE "Nada foi selecionado para ser configurado." - IDS_EXIT "Sair" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "Iniciando o Serviço de Arquivos" - IDS_CANCEL_CONFIG_MSG "Cancelar neste ponto deixará seu computador configurado parcialmente como um AFS Server. Deseja cancelar assim mesmo?" - IDS_WIZARD_APP_TITLE "Assistente de Iniciação Rápida do AFS® Server" - IDS_CANCEL_PENDING "*** Cancelamento pendente - aguarde... ***" - IDS_CHECK_FS_CONFIG "Verificação do servidor de arquivos..." - IDS_CHECK_DB_CONFIG "Verificação do servidor de banco de dados..." - IDS_CHECK_BAK_CONFIG "Verificação do servidor de backup..." - IDS_CHECK_PARTITION "Verificação da partição do AFS..." - IDS_CHECK_ROOT_AFS "Verificação dos volumes da raiz..." - IDS_CHECK_REP "Verificação da replicação dos volumes da raiz..." - IDS_CANCEL_GET_CONFIG "Cancelando...Aguarde..." - IDS_ALREADY_A_BACKUP_SERVER - "Esta máquina já está configurada como Servidor de Backup." - IDS_NOT_A_DB_SERVER "Esta máquina não está configurada como Servidor de Banco de Dados. O Servidor de Backup só pode ser executado em máquinas de Servidores de Bancos de Dados." - IDS_ALREADY_A_SYS_CONTROL_SERVER - "Esta máquina já está configurada como Servidor de Controle do Sistema." - IDS_ALREADY_A_SYS_CONTROL_CLIENT - "Esta máquina já está configurada como Cliente de Controle do Sistema." - IDS_SC_NOT_A_DB_OR_FS_SERVER - "Esta máquina não está configurada como Servidor de Arquivos ou de Banco de Dados. Um computador só pode ser configurado como uma máquina de Controle do Sistema se estiver também configurado como uma máquina de Servidor de Arquivos ou de Banco de Dados." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "Volume" - IDS_NAME_OR_ERROR "Nome (ou Mensagem de Erro)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "Esta máquina não está configurada como Servidor de Arquivos ou de Banco de Dados. Um computador só pode ser configurado como uma máquina de Distribuição Binária se estiver também configurado como uma máquina Servidor de Arquivos ou de Banco de Dados." - IDS_CHECK_SCS "Verificação do Servidor de Controle do Sistema..." - IDS_CHECK_SCC "Verificação do Cliente de Controle do Sistema..." - IDS_SIZE "Tamanho" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "O Serviço de Arquivos será configurado como padrão por ser este o primeiro AFS Server na célula." - IDS_MUST_CONFIG_DB "O Serviço de Banco de Dados será configurado como padrão por ser este o primeiro AFS Server na célula." - IDS_MUST_MAKE_PARTITION "Uma partição deve ser criada por ser este o primeiro AFS Server na célula." - IDS_MUST_CREATE_ROOT_AFS - "Os volumes root.afs e root.cell serão criados como padrão por ser este o primeiro AFS Server na célula." - IDS_MUST_REPLICATE "Os volumes root.afs e root.cell serão replicados como padrão por ser este o primeiro AFS Server na célula." - IDS_CHECK_AFS_CLIENT "Verificação da instalação do AFS Client..." - IDS_ERROR_HOST_NAME "Não foi possível determinar o nome de host desta máquina." - IDS_ERROR_DRIVE_COMPRESSED "A unidade está compactada" - IDS_ERROR_CFG_HOST_OPEN "Não foi possível inicializar a Biblioteca de Configuração do Servidor." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "Parando o AFS Client." - IDS_ERROR_LOCAL_HOST_NAME - "Não foi possível determinar o nome de host local desta máquina." - IDS_GET_TOKENS_ERROR "Não foi possível obter tokens. Verifique se o nome de usuário e senha informados estão corretos." - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "A recuperação não pode ser realizada porque o serviço de arquivos não foi iniciado. Inicie o serviço de arquivos e tente novamente a recuperação." - IDS_SALVAGING "Recuperação em andamento. Aguarde..." - IDS_CURRENT_SALVAGE_LOG "Conteúdo atual do log de recuperação:" - IDS_FINAL_SALVAGE_LOG "Conteúdo final do log de recuperação:" - IDS_SALVAGE_COMPLETE "A recuperação foi concluída." - IDS_CANT_GET_SALVAGE_LOG "Incapaz de recuperar o log de recuperação." - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK - "Incapaz de salvar o log de recuperação no disco." - IDS_VALIDATION_ERROR_TEMPLATE - "O %1 especificado é inválido. Digite novamente o %2." - IDS_CELL_NAME_VALIDATION_TYPE "nome da célula" - IDS_SERVER_NAME_VALIDATION_TYPE "nome do servidor" - IDS_PASSWORD_VALIDATION_TYPE "senha" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "nome do usuário" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "O AFS Client não está instalado. Ele deve estar instalado para que o AFS Client possa ser configurado." - IDS_ERROR_AFS_CLIENT_CHECK - "Não foi possível determinar se o cliente do AFS está instalado." - IDS_ERROR_FS_IS_NOT_NTFS "O sistema de arquivos não é NTFS" - IDS_ERROR_DRIVE_HAS_DATA "A unidade contém dados" - IDS_PARTITION_STEP_DESC "Criar a partição AFS" - IDS_ERROR_DRIVE_CONTAINS_NT "A unidade contém instalação NT" - IDS_DB_STEP_DESC "Iniciar o Serviço de Banco de Dados" - IDS_FS_STEP_DESC "Iniciar o Serviço de Arquivos" - IDS_SCC_STEP_DESC "Iniciar o Cliente de Controle do Sistema" - IDS_SCS_STEP_DESC "Iniciar o Servidor de Controle do Sistema" - IDS_ROOT_AFS_STEP_DESC "Criar os volumes da raiz" - IDS_REP_STEP_DESC "Replicar os volumes da raiz" - IDS_PARTITIONS_PAGE_TITLE "Partições" - IDS_CONFIGURE "&Configurar" - IDS_DB_AND_BK_STEP_DESC "Iniciar o Serviço de Banco de Dados (inclui Backup)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "Criando a partição AFS" - IDS_CONFIG_COMMON_FUNCS "Configurando funções comuns a todos os serviços" - IDS_START_DB_STEP "Iniciando o Serviço de Banco de Dados" - IDS_START_SCC_STEP "Iniciando o Serviço de Controle do Sistema como Cliente de Controle do Sistema" - IDS_START_SCS_STEP "Iniciando o Serviço de Controle do Sistema como Servidor de Controle do Sistema" - IDS_CREATE_ROOT_AFS_STEP "Criando o volume root.afs" - IDS_REP_STEP "Replicando os volumes da raiz" - IDS_START_AUTH_STEP "Obtendo tokens para este servidor" - IDS_SERVICES_PAGE_TITLE "Serviços" - IDS_CONFIG_SUCCEEDED "A configuração obteve êxito." - IDS_CONFIG_CANCELED "A configuração foi cancelada." - IDS_CONFIG_FAILED "A configuração falhou.\r\n\r\nUm arquivo detalhado de log, %1, foi criado na localização %2." - IDS_ERROR_NO_LICENSE_NUM "Não foi encontrado um número de licença do AFS." - IDS_VERIFY_CLIENT_INSTALL_STEP "Verificando a instalação do AFS Client" - IDS_SET_SERVER_LICENSE_STEP "Definindo a licença para este servidor" - IDS_DEFINE_CELL_NAME_STEP "Definindo o nome para esta célula" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP - "Tornando este servidor um membro da célula" - IDS_START_BOS_SERVER_STEP "Iniciando o servidor BOS" - IDS_START_AUTH_SERVER_STEP "Iniciando o servidor de autenticação" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP - "Criando um proprietário e uma chave para este servidor" - IDS_START_DB_AND_BK_STEP - "Iniciando o Serviço de Banco de Dados (inclusive o Servidor de Backup)" - IDS_CREATE_ADMIN_PRINCIPAL_STEP - "Criando o proprietário de administração da célula" - IDS_START_CLIENT_STEP "Iniciando o AFS Client" - IDS_SET_ROOT_ACL_STEP "Definindo a ACL no volume root.afs" - IDS_CREATE_ROOT_CELL_STEP "Criando o volume root.cell" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP - "Montando o volume root.cell usando um ponto de montagem padrão" - IDS_SET_ROOT_CELL_ACL_STEP "Definindo a ACL no volume root.cell" - IDS_MOUNT_ROOT_CELL_RW_STEP - "Montando o volume root.cell usando um ponto de montagem de leitura/gravação" - IDS_ENABLE_AUTH_CHECKING_STEP "Ativando verificação de autenticação" - IDS_OBTAIN_ADMIN_CREDS_STEP "Obtendo tokens administrativos" - IDS_RESTART_SERVERS_STEP - "Reiniciando todos os servidores nesta máquina como servidores autenticados" - IDS_ALREADY_A_FS_SERVER "Esta máquina já está configurada como Servidor de Arquivos." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "Esta máquina já está configurada como Servidor de Banco de Dados." - IDS_INTRO_PAGE "Introdução" - IDS_INFO_PAGE "Informações do Servidor e da Célula" - IDS_FS_PAGE "Serviço de Arquivos" - IDS_DB_PAGE "Serviço de Banco de Dados" - IDS_CFG_TOOL_APP_TITLE "Configuração do AFS® Server" - IDS_BK_PAGE "Servidor de Backup" - IDS_ROOT_AFS_PAGE "Volumes da Raiz do AFS" - IDS_NAME "Nome" - IDS_REP_PAGE "Replicação" - IDS_SC_PAGE "Serviço de Controle do Sistema" - IDS_CONFIG_PAGE "Configurar o Sistema" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "Partição do AFS" - IDS_GRAPHIC_FONT "Times New Roman, 10, B" - IDS_CURRENT_STEP "Etapa Atual:" - IDS_ADD_TO_CELLSERVDB_STEP "Incluindo este servidor em CellServDB" - IDS_RESTART_ALL_DB_SERVERS_STEP - "Reiniciando todos os servidores de bancos de dados na célula" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "A configuração obteve êxito. NOTA: O arquivo CellServDB de todos os clientes do AFS em sua célula precisa ser atualizado. Certifique-se de fornecer ao Suporte de Produto do AFS uma lista atualizada de seus Servidores de Bancos de Dados se for tornar sua célula disponível a outros locais." - IDS_SYS_CONTROL_SERVER_ONLY_MSG - "Deseja configurar esta máquina como o Servidor de Controle do Sistema?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG - "Nã&o configurar como o Servidor de Controle do Sistema." - IDS_CLIENT_CELL_WILL_CHANGE - "A configuração de AFS Server exige que o AFS Client seja configurado na mesma célula do Servidor. Isto será feito automaticamente." - IDS_INFO_PAGE2 "Informações Administrativas" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "A configuração obteve êxito.\r\n\r\nNoTa: Certifique-se de fornecer ao Suporte de Produto do AFS uma lista atualizada de seus Servidores de Bancos de Dados se for tornar sua célula disponível a outros locais." - IDS_CONFIG_SCS "Configurar como o Servidor de Controle do Sistema da célula." - IDS_CONFIG_INTO_CELL_MSG "Configurar este host na célula " - IDS_VIEW_LOG "E&xibir Log" - IDS_VIEW_LOG_ERROR "Não é possível exibir o arquivo de log" - IDS_ERROR_NO_LOG_FILE "O arquivo de log não existe." - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED "CellServDB atualizado no host " - IDS_UPDATING_CELLSERVDB_HOST_FAILED - "Não foi possível atualizar CellServDB no host " - IDS_CELL_NAME_LEN_ERROR "O nome de célula fornecido é muito longo. Nomes de células não podem ter mais que 64 caracteres." - IDS_CONFIG_CHECK_FAILED "Não foi possível determinar a configuração atual desta máquina." - IDS_YES "Sim" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "Não" - IDS_FREE "Espaço Livre" - IDS_TOTAL "Tamanho Total" - IDS_DRIVE2 "Unidade" - IDS_SERVICE_STATUS "Status" - IDS_SERVICE "Serviço" - IDS_FS_RUNNING "O Serviço de Arquivos está em execução." - IDS_FS_STOPPED "O Serviço de Arquivos não está em execução." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "O Serviço de Banco de Dados está em execução." - IDS_DB_STOPPED "O Serviço de Banco de Dados não está em execução." - IDS_BK_RUNNING "O Serviço de Backup está em execução." - IDS_BK_STOPPED "O Serviço de Backup não está em execução." - IDS_SCS_STOPPED "O Servidor de Controle do Sistema não está em execução." - IDS_SCC_STOPPED "O Cliente de Controle do Sistema não está em execução." - IDS_FS_HOW_TO_RUN "Para iniciar o Serviço de Arquivos, marque a caixa acima." - IDS_FS_HOW_TO_STOP "Para interromper o Serviço de Arquivos, desmarque a caixa acima." - IDS_DB_HOW_TO_RUN "Para iniciar o Serviço de Banco de Dados, marque a caixa acima." - IDS_DB_HOW_TO_STOP "Para interromper o Serviço de Banco de Dados, desmarque a caixa acima." - IDS_BK_HOW_TO_RUN "Para iniciar o Serviço de Backup, marque a caixa acima." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "Para interromper o Serviço de Backup, desmarque a caixa acima." - IDS_SCS_HOW_TO_RUN "Para iniciar o Servidor de Controle do Sistema, marque a caixa acima." - IDS_SCS_HOW_TO_STOP "Para interromper o Servidor de Controle do Sistema, desmarque a caixa acima." - IDS_DB_PARTIAL_CONFIG "O Serviço de Banco de Dados está parcialmente configurado." - IDS_DB_DETAILS "Pressione o botão Detalhes para obter maiores informações." - IDS_BK_DISABLED "O Serviço de Backup está desativado." - IDS_BK_ENABLE "Para ativar o Serviço de Backup, é preciso executar o Serviço de Banco de Dados." - IDS_SC_DISABLED "Este servidor está desativado." - IDS_SC_ENABLE "Para ativar este servidor, é preciso executar o Serviço de Arquivos ou o Serviço de Banco de Dados." - IDS_FS_WILL_RUN "O Serviço de Arquivos será iniciado." - IDS_FS_WILL_STOP "O Serviço de Arquivos será interrompido." - IDS_DB_WILL_RUN "O Serviço de Banco de Dados será iniciado." - IDS_DB_WILL_STOP "O Serviço de Banco de Dados será interrompido." - IDS_BK_WILL_RUN "O Serviço de Backup será iniciado." - IDS_BK_WILL_STOP "O Serviço de Backup será interrompido." - IDS_SCS_WILL_RUN "O Servidor de Controle do sistema será iniciado." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "O Servidor de Controle do sistema será interrompido." - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "A unidade já é uma partição do AFS" - IDS_VOLUME_HAS_NO_NAME "" - IDS_PARTITION_CREATED "Uma nova partição do AFS foi criada com êxito." - IDS_PARTITION_EXISTS "O nome da partição fornecido já está em uso por outra partição." - IDS_SCS_RUNNING "O Servidor de Controle do Sistema está em execução." - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN "Esta unidade contém somente a Lixeira." - IDS_SCC_WILL_RUN "O Cliente de Controle do sistema será iniciado." - IDS_SCC_WILL_STOP "O Cliente de Controle do sistema será interrompido." - IDS_SCC_RUNNING "O Cliente de Controle do Sistema está em execução." - IDS_SCC_HOW_TO_RUN "Para iniciar o Cliente de Controle do Sistema, marque a caixa acima." - IDS_SCC_HOW_TO_STOP "Para interromper o Cliente de Controle do Sistema, desmarque a caixa acima." - IDS_SCS_ENABLE "Para ativar este servidor, é preciso interromper a execução do Cliente de Controle do Sistema." - IDS_SCC_ENABLE "Para ativar este servidor, é preciso interromper a execução do Servidor de Controle do Sistema." - IDS_UNCONFIG_DB_STEP "Removendo a configuração do Serviço de Banco de Dados" - IDS_UNCONFIG_DB_STEP_DESC - "Remover Configuração do Serviço de Banco de Dados" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP - "Removendo Configuração do Serviço de Banco de Dados (e Servidor de Backup)" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC - "Remover Configuração do Serviço de Banco de Dados (e Servidor de Backup)" - IDS_UNCONFIG_BK_STEP "Removendo Configuração do Servidor de Backup" - IDS_UNCONFIG_BK_STEP_DESC "Remover Configuração do Servidor de Backup" - IDS_UNCONFIG_FS_STEP "Removendo a configuração do Serviço Arquivos" - IDS_UNCONFIG_FS_STEP_DESC "Remover Configuração do Serviço de Arquivos" - IDS_UNCONFIG_SCS_STEP "Removendo a Configuração do Servidor de Controle do Sistema" - IDS_UNCONFIG_SCS_STEP_DESC - "Remover Configuração do Servidor de Controle do Sistema" - IDS_UNCONFIG_SCC_STEP "Removendo a Configuração do Cliente de Controle do Sistema" - IDS_UNCONFIG_SCC_STEP_DESC - "Remover Configuração do Cliente de Controle do Sistema" - IDS_INVALIDATE_CONFIG_INFO_STEP - "Invalidando as informações de configuração desta máquina" - IDS_CLOSE "&Fechar" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "O arquivo CellServDB não pôde ser atualizado nos servidores do AFS abaixo. Este não é um erro grave.\r\n" - IDS_DELETE_PARTITION_PROMPT "Realmente excluir a partição '%1'?" - IDS_INVALIDATE_CFG_INFO "Não há processos do AFS em execução neste computador. Deseja remover as informações de configuração desta máquina?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "A célula não existe mais. A aplicação de configuração do AFS pode ser usada somente para configurar máquinas de servidor já configuradas em uma célula do AFS. O Assistente de Configuração do AFS pode ser usado para iniciar uma nova célula." - IDS_CFG_MAN_CANT_CONTINUE - "A aplicação de Configuração do AFS deve ser terminada agora. Ela pode ser executada somente em máquinas já configuradas como servidores do AFS. Para configurar novamente esta máquina como um AFS Server, execute o Assistente de Configuração do AFS." - IDS_CONFIG_INFO_INVALIDATED - "Esta máquina não está mais configurada como um AFS Server. A aplicação de configuração do AFS pode ser usada somente para configurar máquinas de AFS Server. O Assistente de Configuração do AFS pode ser usado para reconfigurar esta máquina como um AFS Server." - IDS_GET_TOKENS_FAILED "Não foi possível obter tokens para a célula especificada." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "Iniciando o Servidor de Backup" - IDS_BK_STEP_DESC "Iniciar o Servidor de Backup" - IDS_CONFIG_ERROR "Ocorreu um erro de configuração" - IDS_CREATE_PARTITION_ERROR "Incapaz de criar partição" - IDS_REMOVE_PARTITION_ERROR "Incapaz de remover partição" - IDS_READ_PARTITIONS_ERROR "Incapaz de ler a tabela de partição" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\nO processo de atualização de CellServDB foi terminado prematuramente. É possível que nem todos os servidores tenham sido atualizados." - IDS_GET_PARTITION_LIST_ERROR - "Incapaz de determinar as partições neste servidor" - IDS_EXPORTED "Exportada" - IDS_CANT_DELETE_EXPORTED_PARTITION - "Partições exportadas não podem ser removidas enquanto o Serviço de Arquivos estiver em execução. Deve-se interromper o Serviço de Arquivos antes de remover esta partição." - IDS_CHECK_CONFIG_INFO "Verificando a validade das informações de configuração..." - IDS_ERROR_CFG_HOST_CLOSE - "Não foi possível fechar a Biblioteca de Configuração do Servidor" - IDS_FAILED_OPEN_CELL "não foi possível abrir a célula." - IDS_FAILED_OPEN_NULL_CELL - "Não foi possível abrir um identificador de célula NULL" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Se os volumes da raiz não existirem, gostaria de criá-los?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Se os volumes da raiz não estiverem replicados, gostaria de replicá-los?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS Server" - IDS_CANT_INIT_ADMIN_LIBS - "Não é possível executar esta aplicação: falha na inicialização da biblioteca." - IDS_CANT_OPEN_LOG_FILE "O arquivo de log não pôde ser aberto." - IDS_NEED_CLIENT_INFO "A aplicação de Configuração do AFS não pode ser executada porque o AFS Client não está configurado neste computador. O Assistente de Configuração do AFS pode ser usado nesta situação. Executar o Assistente de Configuração do AFS?" - IDS_NEED_SERVER_INFO "Esta máquina não está configurada como AFS Server. Deve-se usar o Assistente de Configuração do AFS para a configuração inicial do AFS Server. A aplicação de Configuração do AFS pode ser usada depois disso. Executar o Assistente de Configuração do AFS?" - IDS_ADVANCED_OPEN "<< A&vançado" - IDS_ADVANCED_CLOSED "A&vançado >>" - IDS_BOS_OPEN_FAILED "Incapaz de efetuar conexão com o servidor (falha ao abrir bos)." - IDS_SALVAGE_ERROR "Falha na operação de recuperação." - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "O número especificado de processos de recuperação é inválido. O número de processos de recuperação deve estar entre 1 e 32." - IDS_WRONG_CELL "Em uma etapa anterior, foi especificado um servidor no qual as informações de configuração deveriam ser recuperadas. O servidor especificado não pertence à célula a qual você deseja se unir!" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "O arquivo CellServDB em alguns servidores na célula não pôde ser atualizado. Para obter a lista dos servidores que foram ou não atualizados, veja o arquivo de log armazenado no arquivo " - IDS_GET_CREDENTIALS_STEP "Obtendo tokens administrativos" - IDS_MUST_ENTER_SCS_NAME "Um nome de Máquina de Controle do Sistema deve ser fornecido para que a configuração possa começar." - IDS_NOT_SAME_CELL "O AFS Client está configurado em uma célula diferente daquela do AFS Server. Antes de configurar o AFS Server, é preciso reconfigurar o AFS Client na célula do Server." - IDS_LAST_DB_SERVER "Esta máquina está executando o último servidor de servidor na célula. Se você prosseguir e remover a configuração do serviço de banco de dados nesta máquina, a célula deixará de existir, e será removida a configuração de quaisquer outros serviços do AFS nesta máquina. Deseja continuar mesmo assim?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "A senha para o proprietário do AFS é inválida." - IDS_ERROR_CLIENT_VERSION - "A versão do AFS Client neste computador não é compatível com o AFS Server. Este exige no mínimo a versão 3.5 do AFS Client." - IDS_CANT_MAP_ROOT_AFS "Para definir as ACLs nos volumes da raiz, uma letra de unidade deve ser mapeada para o AFS. No momento não há letras de unidades disponíveis. Libere uma letra de unidade e, em seguida, pressione OK." - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "nome da partição" - IDS_VOLUME_NAME_VALIDATION_TYPE "nome do volume" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "número de processos de recuperação" - IDS_PATH_NAME_VALIDATION_TYPE "nome do caminho" - IDS_FILE_NAME_VALIDATION_TYPE "nome do arquivo" - IDS_GENERIC_VALIDATION_TYPE "valor" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/zh_CN/afscfg.rc b/src/WINNT/afssvrcfg/lang/zh_CN/afscfg.rc deleted file mode 100644 index 89c55b08f..000000000 --- a/src/WINNT/afssvrcfg/lang/zh_CN/afscfg.rc +++ /dev/null @@ -1,1140 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ÅäÖÃÓ¦ÓóÌÐòºÍÏòµ¼" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "AFS ·þÎñÆ÷¿ìËÙÆô¶¯Ïòµ¼" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - PUSHBUTTON "È¡Ïû(&L)",IDCANCEL,101,225,50,14 - PUSHBUTTON "< ÉÏÒ»²½(&B)",IDBACK,155,225,50,14 - DEFPUSHBUTTON "ÏÂÒ»²½(&N) >",IDNEXT,209,225,50,14 - PUSHBUTTON "°ïÖú(&H)",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - CONTROL "ÊÇ£¬´´½¨·ÖÇø(&Y)",IDC_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,94,87,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,116, - 186,41,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,101,175,20,12,ES_AUTOHSCROLL - CONTROL "·ñ£¬²»Òª´´½¨·ÖÇø(&O)",IDC_DONT_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON,0,191,102,8 - LTEXT "¸ÃÎļþ·þÎñÆ÷½«ÎļþºÍ³ÌÐò´æ´¢ºÍ´«ËÍÖÁ AFS ¿Í»§»ú¡£¶ÔÓÚ´æ´¢ÔÚ¸ÃϵͳÉϲ¢ÒªÍ¨¹ý AFS ʵÏÖ¹²ÏíµÄÊý¾Ý£¬ÖÁÉÙÓÐÒ»¸ö NTFS ¾í±ØÐë×÷ΪרÓÃµÄ AFS ·ÖÇø¡£", - -1,0,12,209,25 - LTEXT "Ñ¡ÔñÓÃÓÚ´Ë·ÖÇøµÄ¾í(&S)£º",IDC_SELECT_DRIVE,12,106,163,9 - LTEXT "AFS ·ÖÇøÃû(&M)£º/vicep",IDC_NAME_LABEL,12,177,89,8 - LTEXT "ÔÚ¸ÃÎļþ·þÎñÆ÷ÉÏ´´½¨Ò»¸ö AFS ·ÖÇø¡£",IDC_TITLE,0,0,209, - 8 - LTEXT "Ò»¸ö AFS ·ÖÇøÔÚÎïÀíÉϵȼÛÓÚÒ»¸ö NTFS ¾í£¬µ«ÊÇËüÒ²°üº¬¹ØÓÚ·ÖÇøÖÐÐÅÏ¢µÄ½á¹¹ºÍλÖõÄÌØÊâÔªÊý¾Ý¡£", - -1,0,40,209,25 - LTEXT "ÄúÊÇ·ñÏ£ÍûÔÚ¸ÃÎļþ·þÎñÆ÷ÉÏ´´½¨Ò»¸ö·ÖÇø?", - IDC_ASK_CREATE_PARTITION,0,75,209,18 - LTEXT "Èç¹û±ØÒªµÄ»°£¬ÔÚÔËÐÐʱÉèÖõÄÏûÏ¢¡£",IDC_PARTITION_MSG,0, - 159,210,41,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÊÇ£¬ÅäÖóÉÎļþ·þÎñÆ÷(&Y)¡£", - IDC_SHOULD_CONFIG_FILE_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,114,10 - CONTROL "·ñ£¬²»ÒªÅäÖóÉÎļþ·þÎñÆ÷(&O)¡£", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,190,133,10 - LTEXT "AFS Îļþ·þÎñ½«ÇëÇóµÄÎļþºÍ³ÌÐò´Ó¸Ã·þÎñÆ÷´«ËÍÖÁ AFS ¿Í»§»ú¡£¸Ã·þÎñÒ²´¦ÀíËùÓеľí¹ÜÀí²Ù×÷£¬ÀýÈç´´½¨¡¢É¾³ý¡¢Òƶ¯ºÍ¸´ÖÆ¾í¡£", - -1,0,38,210,34 - LTEXT "½«»úÆ÷ÅäÖóÉÎļþ·þÎñÆ÷¡£",IDC_TITLE,0,0,209,8 - LTEXT "ÄúÊÇ·ñÏ£Íû½«¸Ã»úÆ÷ÅäÖóÉÎļþ·þÎñÆ÷?", - IDC_CREATE_FS_QUESTION,0,166,210,8 - LTEXT "Òª½«¸Ã»úÆ÷ÅäÖóÉÎļþ·þÎñÆ÷£¬Äú±ØÐëÅäÖÃÎļþ·þÎñ¡£",-1,0, - 14,210,17 - LTEXT "×¢Ò⣺¸Ã»úÆ÷µ±Ç°Ã»ÓпÉÓõĴÅÅÌÇý¶¯Æ÷½«Îļþ´æ´¢ÔÚ AFS ÖС£¾¡¹ÜÄú¿ÉÒÔ½«¸Ã»úÆ÷ÅäÖóÉÎļþ·þÎñÆ÷£¬µ«Äú½«ÎÞ·¨ÔڸûúÆ÷ÉÏ´æ´¢ AFS Êý¾Ý¡£", - IDC_NO_DRIVES_NOTE,0,77,210,32,NOT WS_VISIBLE - LTEXT "Òª´´½¨´ÅÅÌÇý¶¯Æ÷£¬ÇëʹÓà Windows NT ´ÅÅ̹ÜÀíÆ÷¡£", - IDC_DISK_ADMIN_NOTE,0,112,210,16,NOT WS_VISIBLE - LTEXT "¸Ã»úÆ÷ÒÑÅäÖóÉÎļþ·þÎñÆ÷¡£",IDC_MSG,0,166,209,34,NOT - WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - LTEXT "»¶Ó­Ê¹Óà AFS ·þÎñÆ÷¿ìËÙÆô¶¯Ïòµ¼¡£¸ÃÏòµ¼½«°ïÖúÄúÔÚ Windows NT ϵͳÉÏ¿ìËÙµØÅäÖà AFS ·þÎñÆ÷¡£", - IDC_TITLE,0,0,209,26 - LTEXT "°´¡°ÏÂÒ»²½¡±¿ªÊ¼ÅäÖà AFS ·þÎñÆ÷¡£",IDC_STATIC,0,166,209, - 8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÊÇ£¬¸´ÖƸù¾í(&Y)¡£",IDC_REPLICATE,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,115,10 - CONTROL "·ñ£¬²»Òª¸´ÖƸù¾í(&O)¡£",IDC_DONT_REPLICATE,"Button", - BS_AUTORADIOBUTTON,0,190,134,10 - LTEXT "¸´ÖÆÊÇÔÚ¶à¸ö·ÖÇø´´½¨¾íµÄÖ»¶Á¸±±¾µÄ¹ý³Ì£¬Í¨³£ÊÇÔÚÆäËüÎļþ·þÎñÆ÷ÉÏ¡£¸´ÖÆÔö¼ÓÁ˾íÔÚÍøÂçʼþÖеĿÉÓÃÐÔ¡£", - IDC_STATIC,0,36,209,25 - LTEXT "ÄúÊÇ·ñÏ£Íû¸´ÖƸù¾í?",IDC_REPLICATE_QUESTION,0,166,209,8 - LTEXT "¸´ÖÆÒ²¿ÉÒÔ·ÀÖ¹ÈκηþÎñÆ÷µÄ¾­³£´æÈ¡µÄ¾íÒòÇëÇó¹ý¶à¶ø³¬¸ººÉ¡£", - IDC_STATIC,0,90,209,25 - LTEXT "¸´ÖƵ¥Ôª¸ù¾í¡£",IDC_TITLE,0,0,209,8 - LTEXT "Èç¹ûÄú¼Æ»®¸´ÖƸà AFS µ¥ÔªÖÐµÄÆäËü¾í£¬Ê×ÏȱØÐë¸´ÖÆ¸ù¾í¡£", - IDC_STATIC,0,15,209,16 - LTEXT "ÓÉÓÚÌṩ¾íµÄ·þÎñÆ÷Ö®Ò»²»¿ÉÓã¬ËùÒÔ·þÎñÆ÷Í£»ú£¬µ«´ÓÆäËü·þÎñÆ÷ÈÔ¿É´æÈ¡¸Ã¾í¡£", - IDC_STATIC,0,63,209,22 - LTEXT "Èç¹û±ØÒªµÄ»°£¬ÔÚÔËÐÐʱÉèÖõÄÏûÏ¢¡£", - IDC_CANT_REPLICATE_MSG,0,166,209,34,NOT WS_VISIBLE | NOT - WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÊÇ£¬´´½¨¸ù¾í(&Y)¡£",IDC_CREATE_ROOT_VOLUMES,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,179,108,10 - CONTROL "·ñ£¬²»Òª´´½¨¸ù¾í(&O)¡£",IDC_DONT_CREATE_ROOT_VOLUMES, - "Button",BS_AUTORADIOBUTTON,0,190,124,10 - LTEXT "ÔÚ AFS ÖУ¬¾íÊÇÏà¹ØÎļþµÄ¼¯ºÏ£¬ËüÃÇ×éÖ¯³Éµ¥¸ö¡¢Ò×ÓÚ¹ÜÀíµÄµ¥ÔªÒÔ¼ò»¯ÏµÍ³¹ÜÀí¡£", - IDC_STATIC,0,15,209,17 - LTEXT "ÄúÊÇ·ñÏ£Íû´´½¨¸ù¾í?",IDC_ROOT_AFS_QUESTION,0,166,209,8 - LTEXT "´´½¨µ¥ÔªµÄ¸ù¾í¡£",IDC_TITLE,0,0,209,8 - LTEXT "Ò»µ©´´½¨£¬¸ù¾í½«×Ô¶¯³ÉΪ AFS Îļþ¿Õ¼äÖпɴæÈ¡µÄ¾í¡£", - IDC_STATIC,0,67,209,17 - LTEXT "Èç¹û±ØÒªµÄ»°£¬ÔÚÔËÐÐʱÉèÖõÄÏûÏ¢¡£",IDC_ROOT_AFS_MSG,0, - 166,209,33,NOT WS_VISIBLE - LTEXT "root.afs ¾íÊÇ AFS Îļþ¿Õ¼äµÄ¸ù¾í¡£root.cell ¾íÊǸõ¥ÔªµÄ AFS Îļþ¿Õ¼ä×ÓÊ÷µÄ¸ù¾í£¬²¢Í¨¹ýÒ»¸öÀ´×ÔÓÚ root.afs µÄ°²×°µã´æÈ¡Ëü¡£", - IDC_STATIC,0,35,209,25 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "AFS ·þÎñÆ÷ÅäÖÃ" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,38,148,14 - LTEXT "ÔËÐÐʱÉèÖõIJÙ×÷Îı¾¡£",IDC_OPERATION,35,20,145,10 - ICON "",IDC_LOGO,7,7,20,20 - PUSHBUTTON "È¡Ïû",IDCANCEL,73,63,50,14 - LTEXT "È·¶¨µ±Ç°ÅäÖãº",IDC_OPERATION2,35,7,156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÊÇ£¬ÅäÖóɱ¸·Ý·þÎñÆ÷(&Y)¡£",IDC_CONFIG_BACKUP_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,179,128,10 - CONTROL "·ñ£¬²»ÒªÅäÖóɱ¸·Ý·þÎñÆ÷(&O)¡£", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,0,190,147,10 - LTEXT "±¸·Ý·þÎñÆ÷Ö»ÄÜÔËÐÐÔÚÅäÖóÉÊý¾Ý¿â·þÎñÆ÷µÄ»úÆ÷ÉÏ¡£ÁíÍ⣬Èç¹û±¸·Ý·þÎñÆ÷ÔËÐÐÔÚµ¥ÔªÖеÄij¸öÊý¾Ý¿â·þÎñÆ÷ÉÏ£¬ÔòËü±ØÐëÔËÐÐÔÚµ¥ÔªÖеÄËùÓÐÊý¾Ý¿â·þÎñÆ÷ÉÏ¡£", - -1,0,38,199,32 - LTEXT "ÄúÊÇ·ñÏ£Íû½«¸Ã»úÆ÷ÅäÖóɱ¸·Ý·þÎñÆ÷?", - IDC_BACKUP_SERVER_QUESTION,0,166,209,10 - LTEXT "½«¸Ã»úÆ÷ÅäÖóɱ¸·Ý·þÎñÆ÷¡£",IDC_TITLE,0,0,207,8 - LTEXT "±¸·Ý·þÎñÆ÷ÊÇÊý¾Ý¿â·þÎñµÄÒ»¸ö¿ÉÑ¡Ïî¡£",-1,0,14,209,16 - LTEXT "¸Ã»úÆ÷ÒÑÅäÖóÉÊý¾Ý¿â·þÎñÆ÷¡£",IDC_CANT_BACKUP_MSG,0,166, - 210,33,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÅäÖóÉϵͳ¿ØÖÆ·þÎñÆ÷(&S)¡£",IDC_SYS_CONTROL_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,151,141,10 - CONTROL "ÅäÖóÉϵͳ¿ØÖƿͻ§»ú(&C)¡£",IDC_SYS_CONTROL_CLIENT, - "Button",BS_AUTORADIOBUTTON,0,164,131,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,90,174,119,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "²»ÒªÅäÖóÉϵͳ¿ØÖƿͻ§»ú»ò·þÎñÆ÷(&O)¡£", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,0,190,183, - 9 - LTEXT "ϵͳ¿ØÖÆ·þÎñÆ÷ÏòÆäËü×÷Ϊϵͳ¿ØÖƿͻ§»úÔËÐÐµÄ AFS ·þÎñÆ÷ÌṩÁ˹«¹²ÅäÖÃÎļþ¡£AFS µ¥Ôª±ØÐë½öÔËÐе¥¸öϵͳ¿ØÖÆ·þÎñÆ÷¡£", - -1,0,14,209,25 - LTEXT "ÅäÖóÉϵͳ¿ØÖÆ·þÎñÆ÷»ò¿Í»§»ú¡£",IDC_TITLE,0,0,209,8 - LTEXT "ÄúÊÇ·ñÏ£Íû½«¸Ã»úÆ÷ÅäÖóÉϵͳ¿ØÖÆ·þÎñÆ÷»ò¿Í»§»ú?", - IDC_SYS_CONTROL_MACHINE_QUESTION,0,131,207,17 - LTEXT "ϵͳ¿ØÖƿͻ§»ú´Óµ¥ÔªµÄϵͳ¿ØÖÆ·þÎñÆ÷½ÓÊÕÈÎºÎ¶ÔÆä AFS ÅäÖÃÎļþµÄ¿ÉÓøüС£", - IDC_SYS_CONTROL_CLIENT_DESC,0,43,209,18 - LTEXT "ϵͳ¿ØÖÆ·þÎñÆ÷(&Y)£º",IDC_SYS_CONTROL_MACHINE_LABEL,11, - 176,76,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,0,166,210,34,NOT WS_VISIBLE - LTEXT "¾¯¸æ£º²»Ê¹ÓÃÃÀ¹ú·Ö²¼µÄ AFS Õ¾µã²»ÄÜͨ¹ýϵͳ¿ØÖÆ·þÎñÆ÷·Ö²¼ÅäÖÃÎļþ¡£Èç¹ûÕâÑù×öµÄ»°£¬½«µ¼ÖÂÃô¸ÐϵͳÐÅϢδ¾­¼ÓÃܶø´«Êä¡£", - -1,9,73,183,34 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÕâÊÇÔÚ¸ÃϵͳÖÐÅäÖà AFS ·þÎñÆ÷ËùÐèµÄËùÓÐÐÅÏ¢¡£", - IDC_ALL_NEEDED_MSG,1,14,209,17 - LTEXT "½«¸Ã»úÆ÷ÅäÖõ½µ¥ÔªÄÚ <ÔËÐÐʱÉèÖÃ>",IDC_TITLE,1,0,208,8 - LTEXT "½«Ö´ÐÐÏÂÁÐÅäÖò½Ö裺",IDC_FOLLOWING_STEPS_MSG,1,36,187, - 8 - LTEXT "²½Öè 1 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP1,22,49,179,8,NOT - WS_VISIBLE - LTEXT "²½Öè 3 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP3,22,73,179,8,NOT - WS_VISIBLE - LTEXT "²½Öè 2 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP2,22,61,179,8,NOT - WS_VISIBLE - LTEXT "²½Öè 4 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP4,22,85,179,8,NOT - WS_VISIBLE - LTEXT "²½Öè 5 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP5,22,97,179,8,NOT - WS_VISIBLE - LTEXT "²½Öè 6 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP6,22,109,179,8,NOT - WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,178,200,11 - LTEXT "²½Öè 8 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP8,22,133,179,8,NOT - WS_VISIBLE - LTEXT "²½Öè 7 - ÔËÐÐʱÉèÖõÄÎı¾",IDC_STEP7,22,121,179,8,NOT - WS_VISIBLE - LTEXT "Èç¹û±ØÒªµÄ»°£¬ÔÚÔËÐÐʱÉèÖõÄÏûÏ¢¡£",IDC_CANT_CONFIG_MSG, - 1,13,209,17,NOT WS_VISIBLE - LTEXT "Íê³É°Ù·Ö±È£º",IDC_PERCENT_COMPLETE_LABEL,1,191,61,8,NOT - WS_VISIBLE - LTEXT "µ±Ç°²Ù×÷£º",IDC_CURRENT_STEP_LABEL,1,157,108,8,NOT - WS_VISIBLE - LTEXT "µ±Ç°²½ÖèÃèÊö - ÔËÐÐʱÉèÖÃ",IDC_CURRENT_STEP,1,167,208,8, - NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,63,191,49,8,NOT WS_VISIBLE - LTEXT "Òª¿ªÊ¼ÅäÖøüÆËã»ú£¬Çë°´¡°ÅäÖá±°´Å¥¡£Òª¸ü¸ÄÒÑÖ´ÐеÄÅäÖò½Ö裬Çë°´¡°ÉÏÒ»²½¡±°´Å¥¡£", - IDC_STATUS_MSG,1,159,208,41 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,97,155,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,134,154,11,14 - LTEXT "¹ÜÀíÐÅÏ¢",IDC_TITLE,0,0,202,8 - LTEXT "Ãû³Æ(&M)£º",IDC_ADMIN_NAME_LABEL,7,57,52,8 - LTEXT "¿ÚÁî(&P)£º",IDC_ADMIN_PW_LABEL,7,73,52,8 - GROUPBOX "ÕÊ»§ÃûºÍ¿ÚÁî",IDC_ADMIN_INFO_FRAME,0,41,210,65 - LTEXT "ÑéÖ¤¿ÚÁî(&V)£º",IDC_VERIFY_ADMIN_PW_LABEL,7,90,52,8 - LTEXT "ÒÔÏÂÐÅÏ¢ÊÇΪ¸Ãе¥Ôª´´½¨¹ÜÀíÕÊ»§Ê±±ØÐëµÄ¡£",IDC_STATIC, - 0,15,209,17 - CONTROL "ʹÓÃ´Ë AFS UID(&S)£º",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,157,87,10 - CONTROL "ʹÓÃÏÂÒ»¸ö¿ÉÓÃµÄ AFS UID(&U)",IDC_USE_NEXT_UID,"Button", - BS_AUTORADIOBUTTON,6,144,126,10 - GROUPBOX "AFS UID",IDC_STATIC,0,118,209,57 - LTEXT "ÊäÈë AFS ¹ÜÀíÕÊ»§µÄÓû§±êʶ·û£º",IDC_STATIC,6,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÊÇ£¬ÅäÖóÉÊý¾Ý¿â·þÎñÆ÷(&Y)¡£",IDC_CONFIG_DB_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,0,142,134,10 - CONTROL "·ñ£¬²»ÒªÅäÖóÉÊý¾Ý¿â·þÎñÆ÷(&O)¡£", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 190,153,10 - LTEXT "Êý¾Ý¿â·þÎñά»¤ AFS µ¥Ôª±ØÐëµÄÒ»Ì׸´ÖÆÊý¾Ý¿â¡£¸Ã·þÎñά»¤µ¥ÔªµÄËùÓÐÕÊ»§¡¢¾íλÖúͱ¸·ÝÐÅÏ¢(¿ÉÑ¡)¡£", - -1,0,38,209,54 - LTEXT "ÄúÊÇ·ñÏ£Íû½«¸Ã»úÆ÷ÅäÖóÉÊý¾Ý¿â·þÎñÆ÷?", - IDC_DB_SERVER_QUESTION,0,129,209,10 - LTEXT "½«¸Ã»úÆ÷ÅäÖóÉÊý¾Ý¿â·þÎñÆ÷¡£",IDC_TITLE,0,0,209,8 - LTEXT "Òª½«¸Ã»úÆ÷ÅäÖóÉÊý¾Ý¿â·þÎñÆ÷£¬Äú±ØÐëÅäÖÃÊý¾Ý¿â·þÎñ¡£", - -1,0,14,209,16 - LTEXT "¸Ã»úÆ÷ÒÑÅäÖóÉÊý¾Ý¿â·þÎñÆ÷¡£",IDC_MSG,0,167,210,33,NOT - WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,86,174,119,12,ES_AUTOHSCROLL - LTEXT "ϵͳ¿ØÖÆ·þÎñÆ÷(&Y)£º",IDC_SYS_CONTROL_MACHINE_LABEL,12, - 176,73,8 - LTEXT "Èç¹ûÄúµÄµ¥ÔªÖÐÓÐϵͳ¿ØÖÆ·þÎñÆ÷£¬ÇëÔÚÏÂÃæÊäÈëËüµÄÖ÷»úÃû¡£½«Í¨¹ý¸Ã·þÎñÆ÷¸üРAFS ÅäÖÃÎļþ¡£", - IDC_SCM_PROMPT,12,154,195,17 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - CONTROL "½«¸ÃÖ÷»úÉèÖóÉÏÖÓÐ AFS µ¥ÔªÖеķþÎñÆ÷(&M)", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,0,37, - 180,10 - CONTROL "Õ⽫ÊÇÐ嵀 AFS µ¥ÔªÖеĵÚÒ»¸ö·þÎñÆ÷(&T)", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,0,49,180,10 - EDITTEXT IDC_CELL_NAME,64,91,139,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,64,166,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,64,180,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "µ¥ÔªºÍ·þÎñÆ÷ÐÅÏ¢",IDC_TITLE,0,0,203,8 - LTEXT "µ¥ÔªÃû(&C)£º",IDC_CELL_NAME_LABEL,7,93,49,8 - LTEXT "¿ÚÁî(&P)£º",IDC_SERVER_PW_LABEL,7,167,52,8,WS_DISABLED - LTEXT "ÊäÈë AFS µ¥ÔªÃû¡£",IDC_CELL_NAME_PROMPT,8,78,195,11 - LTEXT "ÊäÈë AFS ίÍÐÈ˵ĿÚÁî¡£ËùÓÐ AFS ·þÎñÆ÷¶¼×÷Ϊ¸ÃίÍÐÈË»ñµÃÁîÅÆ¡£ ", - IDC_SERVER_PW_PROMPT,7,130,196,19,WS_DISABLED - GROUPBOX "µ¥ÔªÃû",IDC_CELL_NAME_FRAME,0,67,210,43 - GROUPBOX "·þÎñÆ÷¿ÚÁî",IDC_SERVER_PW_FRAME,0,119,210,81, - WS_DISABLED - LTEXT "ÑéÖ¤¿ÚÁî(&V)£º",IDC_VERIFY_PW_LABEL,7,180,52,8, - WS_DISABLED - LTEXT "AFS µ¥ÔªÊÇΪÎļþ´æÈ¡ÌṩͳһÃû³Æ¿Õ¼äµÄ·þÎñÆ÷µÄ¼¯ºÏ¡£", - IDC_CELL_NAME_PROMPT2,1,14,202,17 - LTEXT "Ãû³Æ£º",IDC_PRINCIPAL_LABEL,7,152,52,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,150,139,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_ADMIN_NAME,66,43,136,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,66,59,136,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,65,132,137,12,ES_AUTOHSCROLL - LTEXT "¹ÜÀíÐÅÏ¢",IDC_TITLE,0,0,209,8 - LTEXT "ÔÚÏÂÃæÊäÈë¹ÜÀíÕÊ»§ÐÅÏ¢£º",IDC_ADMIN_INFO_PROMPT,7,30, - 196,10 - LTEXT "Ãû³Æ(&M)£º",IDC_ADMIN_NAME_LABEL,7,46,40,8 - LTEXT "¿ÚÁî(&P)£º",IDC_ADMIN_PW_LABEL,7,62,40,8 - GROUPBOX "ÕÊ»§ÃûºÍ¿ÚÁî",IDC_ADMIN_INFO_FRAME,0,17,210,62 - GROUPBOX "ÏÖÓÐ AFS ·þÎñÆ÷",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS ·þÎñÆ÷£º",IDC_HOSTNAME_LABEL,7,134,52,8 - LTEXT "ÊäÈëÄúÏ£Íû¼ÓÈëµÄµ¥ÔªÖÐÆäËü AFS ·þÎñÆ÷µÄÖ÷»úÃû¡£¿É´Ó¸Ã·þÎñÆ÷¼ìË÷ AFS ÅäÖÃÐÅÏ¢¡£", - IDC_HOSTNAME_PROMPT,7,105,202,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 265 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "·þÎñ" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "",IDC_STATIC,7,20,281,40 - GROUPBOX "",IDC_STATIC,7,66,281,43 - GROUPBOX "",IDC_STATIC,7,115,281,40 - GROUPBOX "",IDC_STATIC,7,161,281,40 - CONTROL "Îļþ·þÎñ",IDC_FS_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,19,60,10 - CONTROL "Êý¾Ý¿â·þÎñ",IDC_DB_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,65,82,10 - PUSHBUTTON "ÏêϸÐÅÏ¢...",IDC_DB_DETAILS,215,81,50,14,NOT WS_VISIBLE - CONTROL "±¸·Ý·þÎñÆ÷",IDC_BK_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,114,71,10 - CONTROL "ϵͳ¿ØÖÆ·þÎñÆ÷",IDC_SCS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,160,98,10 - EDITTEXT IDC_SC_MACHINE,107,230,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Ñ¡ÔñÒªÔËÐÐÔڸà AFS ·þÎñÆ÷ÉϵķþÎñ£º",IDC_STATIC,7,7,144, - 8 - LTEXT "µ±Ç°Îļþ·þÎñÕýÔÚÔËÐС£",IDC_FS_STATUS_MSG,14,32,261,8 - LTEXT "µ±Ç°ÒѲ¿·Ö°²×°ÁËÊý¾Ý¿â·þÎñ¡£",IDC_DB_STATUS_MSG,14,78, - 195,8 - LTEXT "ϵͳ¿ØÖÆ·þÎñÆ÷(&Y)£º",IDC_SC_MACHINE_LABEL,21,232,79,8, - WS_DISABLED - LTEXT "ҪֹͣÎļþ·þÎñ£¬Ç벻Ҫѡȡ´Ë¸´Ñ¡¿ò¡£",IDC_FS_ACTION_MSG, - 14,44,262,8 - LTEXT "ÈçÐè¸ü¶àÐÅÏ¢£¬Çëµ¥»÷¡°ÏêϸÐÅÏ¢¡±°´Å¥¡£", - IDC_DB_ACTION_MSG,14,92,186,8 - LTEXT "µ±Ç°±¸·Ý·þÎñÆ÷ÕýÔÚÔËÐС£",IDC_BK_STATUS_MSG,14,127,259, - 8 - LTEXT "Ҫֹͣ±¸·Ý·þÎñÆ÷£¬Ç벻Ҫѡȡ´Ë¸´Ñ¡¿ò¡£", - IDC_BK_ACTION_MSG,14,139,262,8 - LTEXT "ÒªÆôÓø÷þÎñÆ÷£¬Äú±ØÐëÔËÐÐÎļþ·þÎñ»òÊý¾Ý¿â·þÎñ¡£", - IDC_SCS_ACTION_MSG,14,185,268,9 - LTEXT "µ±Ç°ÏµÍ³¿ØÖÆ·þÎñδÔËÐС£",IDC_SCS_STATUS_MSG,14,172,263, - 9 - GROUPBOX "",IDC_STATIC,7,207,281,51 - CONTROL "ϵͳ¿ØÖƿͻ§»ú",IDC_SCC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,206,95,10 - LTEXT "ÒªÆôÓø÷þÎñÆ÷£¬Äú±ØÐëÔËÐÐÎļþ·þÎñ»òÊý¾Ý¿â·þÎñ¡£", - IDC_SCC_ACTION_MSG,14,245,268,9 - LTEXT "µ±Ç°ÏµÍ³¿ØÖÆ·þÎñδÔËÐС£",IDC_SCC_STATUS_MSG,14,219,263, - 9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "·ÖÇø" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "ÄúµÄ¼ÆËã»úÉÏÓÐÏÂÁÐ AFS ·ÖÇø(&A)£º",IDC_STATIC,8,7,175,8 - PUSHBUTTON "´´½¨(&C)...",IDC_CREATE_PARTITIONS,17,118,53,14 - LTEXT "ÒªÍì¾È·ÖÇø»ò·ÖÇøÉÏµÄ¾í£¬ÇëÑ¡ÔñÁбíÖеķÖÇø²¢µ¥»÷ÉÏÃæµÄ°´Å¥¡£ÒªÍì¾È·þÎñÆ÷ÉϵÄËùÓзÖÇø£¬µ¥»÷ÉÏÃæµÄ°´Å¥¡£", - IDC_SALVAGE_MSG,30,179,250,25 - PUSHBUTTON "Íì¾È(&S)...",IDC_SALVAGE,17,159,53,14 - LTEXT "Ҫɾ³ý·ÖÇø£¬ÇëÑ¡ÔñÁбíÖеķÖÇø²¢µ¥»÷ÉÏÃæµÄ°´Å¥¡£", - IDC_REMOVE_MSG,30,235,253,8,WS_DISABLED - PUSHBUTTON "³ýÈ¥(&M)",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "·ÖÇø",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "ÒªÔڸ÷þÎñÆ÷ÉÏн¨·ÖÇø£¬µ¥»÷ÉÏÃæµÄ°´Å¥¡£", - IDC_CREATE_MSG,30,136,254,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "´´½¨ AFS ·ÖÇø" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "´ÓÏÂÃæÁбíÖÐÑ¡ÔñҪн¨·ÖÇøËùÔÚµÄ NTFS ¾í£º",IDC_TITLE,7, - 5,250,8 - LTEXT "AFS ·ÖÇøÃû£º",IDC_NAME_STATIC,17,131,66,8 - EDITTEXT IDC_PARTITION_NAME,119,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "´´½¨(&C)",IDC_CREATE,96,158,50,14,WS_DISABLED - PUSHBUTTON "¹Ø±Õ(&O)",IDC_CLOSE,152,158,50,14 - PUSHBUTTON "°ïÖú",9,207,158,50,14 - GROUPBOX "·ÖÇø²ÎÊý",IDC_ARGS_FRAME,7,117,250,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,15,250, - 95,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,90,131,24,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 225, 159 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS ·þÎñÆ÷ÅäÖÃ" -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_ADMIN_NAME,61,33,151,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,61,49,151,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,61,110,151,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "ÅäÖÃ(&C)",IDOK,108,138,50,14,WS_DISABLED - PUSHBUTTON "È¡Ïû",IDCANCEL,48,138,50,14 - PUSHBUTTON "°ïÖú",9,168,138,50,14 - LTEXT "ÔÚÏÂÃæÊäÈë¹ÜÀíÕÊ»§ÐÅÏ¢£º",IDC_ADMIN_INFO_PROMPT,14,20, - 196,10 - LTEXT "Ãû³Æ(&M)£º",IDC_ADMIN_NAME_LABEL,15,36,38,8 - LTEXT "¿ÚÁî(&P)£º",IDC_ADMIN_PW_LABEL,15,52,38,8 - GROUPBOX "ÕÊ»§ÃûºÍ¿ÚÁî",IDC_ADMIN_INFO_FRAME,7,7,211,62 - GROUPBOX "ϵͳ¿ØÖÆ·þÎñÆ÷",IDC_HOSTNAME_FRAME,7,76,211,54 - LTEXT "Ö÷»úÃû(&H)£º",IDC_HOSTNAME_LABEL,15,112,44,8 - LTEXT "Èç¹ûÄúµÄµ¥ÔªÖÐÓÐϵͳ¿ØÖÆ·þÎñÆ÷£¬ÇëÔÚÏÂÃæÊäÈëËüµÄÖ÷»úÃû¡£½«Í¨¹ý¸Ã·þÎñÆ÷¸üРAFS ÅäÖÃÎļþ¡£", - IDC_HOSTNAME_PROMPT,13,88,197,18 -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 87 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ·þÎñÆ÷ÅäÖÃ" -FONT 9, "ËÎÌå" -BEGIN - PUSHBUTTON "È¡Ïû",IDCANCEL,103,66,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,37,200,11 - LTEXT "Íê³É°Ù·Ö±È£º",IDC_PERCENT_COMPLETE_LABEL,40,50,61,8,NOT - WS_VISIBLE - LTEXT "µ±Ç°²Ù×÷£º",IDC_CURRENT_STEP_LABEL,40,15,108,8,NOT - WS_VISIBLE - LTEXT "µ±Ç°²½ÖèÃèÊö - ÔËÐÐʱÉèÖÃ",IDC_CURRENT_STEP,40,26,210,8, - NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "Òª¿ªÊ¼ÅäÖøüÆËã»ú£¬Çë°´¡°ÅäÖá±°´Å¥¡£Òª¸ü¸ÄÒÑÖ´ÐеÄÅäÖò½Ö裬Çë°´¡°ÉÏÒ»²½¡±°´Å¥¡£", - IDC_STATUS_MSG,40,16,210,41 - PUSHBUTTON "²é¿´ÈÕÖ¾(&V)",IDNEXT,158,66,50,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "CellServCB ¸üгö´í" -FONT 9, "ËÎÌå" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "È·¶¨",IDOK,22,162,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,75,162,50,14 - PUSHBUTTON "°ïÖú",9,130,162,50,14 - LTEXT "ÏÂÁÐ AFS ·þÎñÆ÷É쵀 CellServDB ÎļþÎÞ·¨×Ô¶¯¸üУº", - IDC_STATIC,7,7,173,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 243, 188 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Íì¾È" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,79,99,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,133,99,50,14 - PUSHBUTTON "°ïÖú(&H)",9,187,99,50,14 - CONTROL "Íì¾È¸ÃÎļþ·þÎñÆ÷ÉϵÄËùÓзÖÇø(&S)",IDC_SERVER,"Button", - BS_AUTORADIOBUTTON,14,35,176,10 - CONTROL "Íì¾ÈËùÑ¡·ÖÇøÉϵÄËùÓоí(&P)",IDC_PARTITION,"Button", - BS_AUTORADIOBUTTON,14,48,177,10 - CONTROL "Íì¾ÈËùÑ¡·ÖÇøÉϵÄÌØ¶¨¾í(&V)",IDC_VOLUME,"Button", - BS_AUTORADIOBUTTON,14,61,177,10 - EDITTEXT IDC_VOLUME_NAME,76,74,97,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "<< ¸ß¼¶(&A) ",IDC_ADVANCED,7,99,50,14 - GROUPBOX "",IDC_STATIC,7,25,229,67 - LTEXT "¾íÃû(&N)£º",IDC_VOLUME_NAME_LABEL,27,75,47,8, - WS_DISABLED - GROUPBOX "¸ß¼¶Íì¾ÈÑ¡Ïî",IDC_ADVANCED_FRAME,7,119,229,62 - LTEXT "ÁÙʱÎļþµÄ·¾¶(&T)£º",IDC_TEMP_DIR_LABEL,17,165,92,8 - EDITTEXT IDC_LOG_FILE,112,147,114,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,188,130,21,12,ES_AUTOHSCROLL - LTEXT "½á¹ûÈÕÖ¾µÄÎļþÃû(&L)£º",IDC_LOG_FILE_LABEL,17,149,92,8 - EDITTEXT IDC_TEMP_DIR,112,163,114,12,ES_AUTOHSCROLL - CONTROL "²¢ÐÐÍì¾È²Ù×÷(&R)£»½ø³ÌÊý£º",IDC_NUM_PROCESSES_CHECKBOX, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,132,168,10 - LTEXT "Èç¹ûÄúÍì¾È·þÎñÆ÷»òÒ»¸öÍêÕû·ÖÇø£¬Ôò·þÎñÆ÷½«ÁÙʱÍÑ»ú¡£", - IDC_STATIC,38,7,198,17 - LTEXT "×¢Ò⣺",IDC_STATIC,7,7,28,8 -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS ίÍÐÈË¿ÚÁî" -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_PW,48,39,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,31,61,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,85,61,50,14 - PUSHBUTTON "°ïÖú",9,140,61,50,14 - LTEXT "AFS ίÍÐÈËÃÜÔ¿²»ÄÜ´ÓÔçÓÚ 3.5 µÄÈÏÖ¤·þÎñÆ÷ÉϼìË÷¡£ÇëÔÚÏÂÃæÊäÈë AFS ίÍÐÈË¿ÚÁî¡£", - IDC_STATIC,7,7,183,26 - LTEXT "¿ÚÁ",IDC_STATIC,7,41,35,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Íì¾È¾í - ½á¹û" -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "¹Ø±Õ(&C)",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "°ïÖú",9,280,266,50,14 - LTEXT "<ÔËÐÐʱÉèÖÃ>",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "<ÔËÐÐʱÉèÖÃ>",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 203 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 66 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 218 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 152 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 80 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ÅäÖÃÓ¦ÓóÌÐòºÍÏòµ¼""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "ÏÂÒ»²½(&N) >" - IDS_FINISH "Íê³É(&F)" - IDS_HELP_TITLE "°´Ï°ïÖú°´Å¥" - IDS_HELP_DESC "°ïÖú´Ëʱ²»¿ÉÓá£" - IDS_CANCEL_DESC "È¡Ïû AFS ¿ìËÙÆô¶¯Ïòµ¼?" - IDS_PARTITION_ALREADY_CREATED "¸Ã»úÆ÷ÉÏÒÑ´æÔÚ AFS ·ÖÇø¡£" - IDS_NOT_A_FS_SERVER "¸Ã»úÆ÷δÅäÖóÉÎļþ·þÎñÆ÷¡£¾íÖ»ÄÜÔÚÎļþ·þÎñÆ÷ÉÏ´´½¨¡£" - IDS_ROOT_AFS_ALREADY_EXISTS "¸ù¾íÒÑ´æÔÚ¡£" - IDS_NO_PARTITION_EXISTS "²»´æÔÚÒª´´½¨¸ù¾íµÄ·ÖÇø¡£´´½¨¸ù¾íǰ£¬±ØÐë´æÔÚ·ÖÇø¡£" - IDS_ALREADY_REPLICATED "ÒѸ´ÖƸù¾í¡£" - IDS_ROOT_AFS_DOESNT_EXIST "²»´æÔÚ¸ù¾í¡£¸´ÖƸù¾íǰ£¬±ØÐë´æÔڸøù¾í¡£" - IDS_ALREADY_CONFIGURED "¸Ã»úÆ÷ÒÑÅäÖÃ³É AFS ·þÎñÆ÷¡£" - IDS_NOTHING_TO_CONFIGURE "ÄúûÓÐÑ¡ÔñÈκζÔÏó½øÐÐÅäÖá£" - IDS_EXIT "Í˳ö" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "Æô¶¯Îļþ·þÎñ" - IDS_CANCEL_CONFIG_MSG "ÔÚ´Ë´¦È¡Ïû½«Ê¹ÄúµÄ¼ÆËã»ú²¿·ÖµØÅäÖÃ³É AFS ·þÎñÆ÷¡£ÈÔҪȡÏûÂð?" - IDS_WIZARD_APP_TITLE "AFS ·þÎñÆ÷¿ìËÙÆô¶¯Ïòµ¼" - IDS_CANCEL_PENDING "*** È¡ÏûÔÝ¹Ò - ÇëÉÔºò... ***" - IDS_CHECK_FS_CONFIG "¼ì²éÎļþ·þÎñÆ÷..." - IDS_CHECK_DB_CONFIG "¼ì²éÊý¾Ý¿â·þÎñÆ÷..." - IDS_CHECK_BAK_CONFIG "¼ì²é±¸·Ý·þÎñÆ÷..." - IDS_CHECK_PARTITION "¼ì²é AFS ·ÖÇø..." - IDS_CHECK_ROOT_AFS "¼ì²é¸ù¾í..." - IDS_CHECK_REP "¼ì²é¸ù¾í¸´ÖÆ..." - IDS_CANCEL_GET_CONFIG "ÕýÔÚÈ¡Ïû...ÇëÉÔºò..." - IDS_ALREADY_A_BACKUP_SERVER "¸Ã»úÆ÷ÒÑÅäÖóɱ¸·Ý·þÎñÆ÷¡£" - IDS_NOT_A_DB_SERVER "¸Ã»úÆ÷δÅäÖóÉÊý¾Ý¿â·þÎñÆ÷¡£±¸·Ý·þÎñÆ÷Ö»ÄÜÔËÐÐÔÚÊý¾Ý¿â·þÎñÆ÷»úÆ÷ÉÏ¡£" - IDS_ALREADY_A_SYS_CONTROL_SERVER "¸Ã»úÆ÷ÒÑÅäÖóÉϵͳ¿ØÖÆ·þÎñÆ÷¡£" - IDS_ALREADY_A_SYS_CONTROL_CLIENT "¸Ã»úÆ÷ÒÑÅäÖóÉϵͳ¿ØÖƿͻ§»ú¡£" - IDS_SC_NOT_A_DB_OR_FS_SERVER - "¸Ã»úÆ÷δÅäÖóÉÊý¾Ý¿â·þÎñÆ÷»òÎļþ·þÎñÆ÷¡£Èç¹û¼ÆËã»úÅäÖóÉÊý¾Ý¿â»òÎļþ·þÎñÆ÷»úÆ÷ʱ£¬ÔòͬʱËüÖ»ÄÜÅäÖóÉϵͳ¿ØÖÆÆ÷¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "¾í" - IDS_NAME_OR_ERROR "Ãû³Æ(»ò³ö´íÏûÏ¢)" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "½«¸Ã»úÆ÷δÅäÖóÉÊý¾Ý¿â·þÎñÆ÷»òÎļþ·þÎñÆ÷¡£Èç¹û¼ÆËã»úÅäÖóÉÊý¾Ý¿â»òÎļþ·þÎñÆ÷»úÆ÷ʱ£¬ÔòͬʱËüÖ»ÄÜÅäÖóɶþ½øÖÆ·Ö²¼»úÆ÷¡£" - IDS_CHECK_SCS "¼ì²éϵͳ¿ØÖÆ·þÎñÆ÷..." - IDS_CHECK_SCC "¼ì²éϵͳ¿ØÖƿͻ§»ú..." - IDS_SIZE "´óС" - IDS_ERROR_SEP "," - IDS_MUST_CONFIG_FS "ÓÉÓÚËüÊǵ¥ÔªÖеĵÚÒ»¸ö AFS ·þÎñÆ÷£¬Òò´Ë½«È±Ê¡µØÅäÖÃÎļþ·þÎñ¡£" - IDS_MUST_CONFIG_DB "ÓÉÓÚËüÊǵ¥ÔªÖеĵÚÒ»¸ö AFS ·þÎñÆ÷£¬Òò´Ë½«È±Ê¡µØÅäÖÃÊý¾Ý¿â·þÎñ¡£" - IDS_MUST_MAKE_PARTITION "ÓÉÓÚËüÊǵ¥ÔªÖеĵÚÒ»¸ö AFS ·þÎñÆ÷£¬Òò´Ë±ØÐë´´½¨·ÖÇø¡£" - IDS_MUST_CREATE_ROOT_AFS - "ÓÉÓÚËüÊǵ¥ÔªÖеĵÚÒ»¸ö AFS ·þÎñÆ÷£¬Òò´Ë½«È±Ê¡µØ´´½¨ root.afs ºÍ root.cell ¾í¡£" - IDS_MUST_REPLICATE "ÓÉÓÚËüÊǵ¥ÔªÖеĵÚÒ»¸ö AFS ·þÎñÆ÷£¬Òò´Ë½«È±Ê¡µØ¸´ÖÆ root.afs ºÍ root.cell ¾í¡£" - IDS_CHECK_AFS_CLIENT "¼ì²é AFS ¿Í»§»ú°²×°..." - IDS_ERROR_HOST_NAME "ÎÞ·¨È·¶¨»úÆ÷µÄÖ÷»úÃû¡£" - IDS_ERROR_DRIVE_COMPRESSED "Çý¶¯Æ÷ÒÑѹËõ" - IDS_ERROR_CFG_HOST_OPEN "³õʼ»¯·þÎñÆ÷ÅäÖÿâʧ°Ü¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "ÕýÔÚÍ£Ö¹ AFS ¿Í»§»ú" - IDS_ERROR_LOCAL_HOST_NAME "ÎÞ·¨È·¶¨»úÆ÷µÄ±¾µØÖ÷»úÃû¡£" - IDS_GET_TOKENS_ERROR "ÎÞ·¨»ñµÃÁîÅÆ¡£ÇëÑéÖ¤ÄúÊäÈëÁËÕýÈ·µÄÓû§ÃûºÍ¿ÚÁî¡£" - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "ÓÉÓÚÎļþ·þÎñδÆô¶¯£¬²»ÄÜÖ´ÐÐÍì¾È¡£ÇëÆô¶¯Îļþ·þÎñ£¬È»ºóÖØÊÔÍì¾È¡£" - IDS_SALVAGING "ÕýÔÚ½øÐÐÍì¾È¡£ÇëµÈ´ý..." - IDS_CURRENT_SALVAGE_LOG "µ±Ç°Íì¾ÈÈÕÖ¾µÄÄÚÈÝ:" - IDS_FINAL_SALVAGE_LOG "Íì¾ÈÈÕÖ¾µÄ×îºóÄÚÈÝ:" - IDS_SALVAGE_COMPLETE "Íì¾ÈÒÑÍê³É¡£" - IDS_CANT_GET_SALVAGE_LOG "ÎÞ·¨¼ìË÷Íì¾ÈÈÕÖ¾¡£" - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK "ÎÞ·¨½«Íì¾ÈÈÕÖ¾±£´æµ½´ÅÅÌ¡£" - IDS_VALIDATION_ERROR_TEMPLATE "Ö¸¶¨µÄ %1 ÎÞЧ¡£ÇëÖØÐÂÊäÈë %2 ¡£" - IDS_CELL_NAME_VALIDATION_TYPE "µ¥ÔªÃû" - IDS_SERVER_NAME_VALIDATION_TYPE "·þÎñÆ÷Ãû" - IDS_PASSWORD_VALIDATION_TYPE "¿ÚÁî" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "Óû§Ãû" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "ûÓа²×° AFS ¿Í»§»ú¡£±ØÐëÔÚÄܹ»ÅäÖà AFS ·þÎñÆ÷ǰ°²×° AFS ¿Í»§»ú¡£" - IDS_ERROR_AFS_CLIENT_CHECK "ÎÞ·¨È·¶¨ÊÇ·ñÒѰ²×° AFS ¿Í»§»ú¡£" - IDS_ERROR_FS_IS_NOT_NTFS "Îļþϵͳ²»ÊÇ NTFS" - IDS_ERROR_DRIVE_HAS_DATA "Çý¶¯Æ÷°üº¬Êý¾Ý" - IDS_PARTITION_STEP_DESC "´´½¨ AFS ·ÖÇø" - IDS_ERROR_DRIVE_CONTAINS_NT "Çý¶¯Æ÷°üº¬ NT °²×°" - IDS_DB_STEP_DESC "Æô¶¯Êý¾Ý¿â·þÎñ" - IDS_FS_STEP_DESC "Æô¶¯Îļþ·þÎñ" - IDS_SCC_STEP_DESC "Æô¶¯ÏµÍ³¿ØÖƿͻ§»ú" - IDS_SCS_STEP_DESC "Æô¶¯ÏµÍ³¿ØÖÆ·þÎñÆ÷" - IDS_ROOT_AFS_STEP_DESC "´´½¨¸ù¾í" - IDS_REP_STEP_DESC "¸´ÖƸù¾í" - IDS_PARTITIONS_PAGE_TITLE "·ÖÇø" - IDS_CONFIGURE "ÅäÖÃ(&C)" - IDS_DB_AND_BK_STEP_DESC "Æô¶¯Êý¾Ý¿â·þÎñ(°üÀ¨±¸·Ý·þÎñÆ÷)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "ÕýÔÚ´´½¨ AFS ·ÖÇø" - IDS_CONFIG_COMMON_FUNCS "ÕýÔÚÅäÖÃËùÓзþÎñµÄ¹«¹²¹¦ÄÜ" - IDS_START_DB_STEP "ÕýÔÚÆô¶¯Êý¾Ý¿â·þÎñ" - IDS_START_SCC_STEP "ϵͳ¿ØÖÆ·þÎñ×÷Ϊϵͳ¿ØÖƿͻ§»úÕýÔÚÆô¶¯" - IDS_START_SCS_STEP "ϵͳ¿ØÖÆ·þÎñ×÷Ϊϵͳ¿ØÖÆ·þÎñÆ÷ÕýÔÚÆô¶¯" - IDS_CREATE_ROOT_AFS_STEP "ÕýÔÚ´´½¨ root.afs ¾í" - IDS_REP_STEP "ÕýÔÚ¸´ÖƸù¾í" - IDS_START_AUTH_STEP "ÕýÔÚ»ñµÃ·þÎñÆ÷ÁîÅÆ" - IDS_SERVICES_PAGE_TITLE "·þÎñ" - IDS_CONFIG_SUCCEEDED "ÅäÖóɹ¦Íê³É¡£" - IDS_CONFIG_CANCELED "ÅäÖÃÒÑÈ¡Ïû¡£" - IDS_CONFIG_FAILED "ÅäÖÃʧ°Ü¡£\r\n\r\nÒÑÔÚλÖà %2 ´´½¨ÁËÏêϸµÄÈÕÖ¾Îļþ %1¡£" - IDS_ERROR_NO_LICENSE_NUM "ûÓÐÕÒµ½ AFS Ðí¿ÉÖ¤ºÅÂë¡£" - IDS_VERIFY_CLIENT_INSTALL_STEP "ÕýÔÚÑéÖ¤ AFS ¿Í»§»úµÄ°²×°" - IDS_SET_SERVER_LICENSE_STEP "ÕýÔÚÉèÖø÷þÎñÆ÷µÄÐí¿ÉÖ¤" - IDS_DEFINE_CELL_NAME_STEP "ÕýÔÚ¶¨Òå¸Ãµ¥ÔªµÄÃû³Æ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP "ÕýÔÚ½«¸Ã·þÎñÆ÷ÉèÖÃΪµ¥Ôª³ÉÔ±" - IDS_START_BOS_SERVER_STEP "ÕýÔÚÆô¶¯ BOS ·þÎñÆ÷" - IDS_START_AUTH_SERVER_STEP "ÕýÔÚÆô¶¯ÈÏÖ¤·þÎñÆ÷" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP "ÕýÔÚ´´½¨¸Ã·þÎñÆ÷µÄίÍÐÈ˺ÍÃÜÔ¿" - IDS_START_DB_AND_BK_STEP "ÕýÔÚÆô¶¯Êý¾Ý¿â·þÎñ(°üÀ¨±¸·Ý·þÎñÆ÷)" - IDS_CREATE_ADMIN_PRINCIPAL_STEP "ÕýÔÚ´´½¨µ¥Ôª¹ÜÀíίÍÐÈË" - IDS_START_CLIENT_STEP "ÕýÔÚÆô¶¯ AFS ¿Í»§»ú" - IDS_SET_ROOT_ACL_STEP "ÕýÔÚ root.afs ¾íÉÏÉèÖà ACL" - IDS_CREATE_ROOT_CELL_STEP "ÕýÔÚ´´½¨ root.cell ¾í" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP "ÕýÔÚʹÓñê×¼°²×°µã°²×° root.cell ¾í" - IDS_SET_ROOT_CELL_ACL_STEP "ÕýÔÚ root.cell ¾íÉÏÉèÖà ACL" - IDS_MOUNT_ROOT_CELL_RW_STEP "ÕýÔÚʹÓÃÒ»¸ö¶Á£¯Ð´°²×°µã°²×° root.cell ¾í" - IDS_ENABLE_AUTH_CHECKING_STEP "ÕýÔÚÆôÓÃÈÏÖ¤¼ì²é" - IDS_OBTAIN_ADMIN_CREDS_STEP "ÕýÔÚ»ñµÃ¹ÜÀíÁîÅÆ" - IDS_RESTART_SERVERS_STEP "ÕýÔڸûúÆ÷ÉϽ«ËùÓзþÎñÆ÷×÷ΪÈÏÖ¤·þÎñÆ÷ÖØÐÂÆô¶¯" - IDS_ALREADY_A_FS_SERVER "¸Ã»úÆ÷ÒÑÅäÖóÉÎļþ·þÎñÆ÷¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "¸Ã»úÆ÷ÒÑÅäÖóÉÊý¾Ý¿â·þÎñÆ÷¡£" - IDS_INTRO_PAGE "½éÉÜ" - IDS_INFO_PAGE "µ¥ÔªºÍ·þÎñÆ÷ÐÅÏ¢" - IDS_FS_PAGE "Îļþ·þÎñ" - IDS_DB_PAGE "Êý¾Ý¿â·þÎñ" - IDS_CFG_TOOL_APP_TITLE "AFS ·þÎñÆ÷ÅäÖÃ" - IDS_BK_PAGE "±¸·Ý·þÎñÆ÷" - IDS_ROOT_AFS_PAGE "¸ù AFS ¾í" - IDS_NAME "Ãû³Æ" - IDS_REP_PAGE "¸´ÖÆ" - IDS_SC_PAGE "ϵͳ¿ØÖÆ·þÎñ" - IDS_CONFIG_PAGE "ÅäÖÃϵͳ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "AFS ·ÖÇø" - IDS_GRAPHIC_FONT "Times New Roman, 12, B" - IDS_CURRENT_STEP "µ±Ç°²½Ö裺" - IDS_ADD_TO_CELLSERVDB_STEP "ÕýÔÚ½«¸Ã·þÎñÆ÷Ìí¼ÓÖÁ CellServDB" - IDS_RESTART_ALL_DB_SERVERS_STEP "ÕýÔÚÖØÐÂÆô¶¯µ¥ÔªÖеÄËùÓÐÊý¾Ý¿â·þÎñÆ÷" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "ÅäÖÃÒѳɹ¦Íê³É¡£×¢Ò⣺±ØÐë¸üÐÂÄúµ¥ÔªÖÐËùÓÐ AFS ¿Í»§»úµÄ CellServDB Îļþ¡£Èç¹ûÄúҪʹÆäËüÕ¾µã¿ÉÓÃÄúµÄµ¥Ôª£¬ÔòÇëÈ·ÈÏÌṩ´øÓÐÄúµÄÊý¾Ý¿â·þÎñÆ÷×îÐÂÁбíµÄ AFS ²úÆ·Ö§³Ö¡£" - IDS_SYS_CONTROL_SERVER_ONLY_MSG "ÄúÊÇ·ñÏ£Íû½«¸Ã»úÆ÷ÅäÖóÉϵͳ¿ØÖÆ·þÎñÆ÷?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG "²»ÒªÅäÖóÉϵͳ¿ØÖÆ·þÎñÆ÷(&O)¡£" - IDS_CLIENT_CELL_WILL_CHANGE - "AFS ·þÎñÆ÷µÄÅäÖÃÐ轫 AFS ¿Í»§»úºÍ·þÎñÆ÷ÅäÖÃÔÚͬһµ¥ÔªÖС£ÕâЩ½«×Ô¶¯Ö´ÐС£" - IDS_INFO_PAGE2 "¹ÜÀíÐÅÏ¢" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "ÅäÖÃÒѳɹ¦Íê³É¡£\r\n\r\n×¢Ò⣺Èç¹ûÄúҪʹÆäËüÕ¾µã¿ÉÓÃÄúµÄµ¥Ôª£¬ÔòÇëÈ·ÈÏÌṩ´øÓÐÄúµÄÊý¾Ý¿â·þÎñÆ÷ÁбíµÄ AFS ²úÆ·Ö§³Ö¡£" - IDS_CONFIG_SCS "ÅäÖóɵ¥ÔªµÄϵͳ¿ØÖÆ·þÎñÆ÷¡£" - IDS_CONFIG_INTO_CELL_MSG "½«Ö÷»úÅäÖÃÖÁµ¥Ôª" - IDS_VIEW_LOG "²é¿´ÈÕÖ¾(&V)" - IDS_VIEW_LOG_ERROR "ÎÞ·¨²é¿´ÈÕÖ¾Îļþ" - IDS_ERROR_NO_LOG_FILE "ÈÕÖ¾Îļþ²»´æÔÚ¡£" - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED "Ö÷»úÉϸüÐ嵀 CellServDB" - IDS_UPDATING_CELLSERVDB_HOST_FAILED "ÔÚÖ÷»úÉϸüРCellServDB ʧ°Ü" - IDS_CELL_NAME_LEN_ERROR "ÄúÊäÈëµÄµ¥ÔªÃûÌ«³¤¡£µ¥ÔªÃû²»Äܳ¬¹ý 64 ¸ö×Ö·û¡£" - IDS_CONFIG_CHECK_FAILED "ÎÞ·¨È·¶¨¸Ã»úÆ÷Éϵĵ±Ç°ÅäÖá£" - IDS_YES "ÊÇ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "·ñ" - IDS_FREE "¿ÕÏпռä" - IDS_TOTAL "×ܼƴóС" - IDS_DRIVE2 "Çý¶¯Æ÷" - IDS_SERVICE_STATUS "״̬" - IDS_SERVICE "·þÎñ" - IDS_FS_RUNNING "µ±Ç°ÕýÔÚÔËÐÐÎļþ·þÎñ¡£" - IDS_FS_STOPPED "µ±Ç°Ã»ÓÐÔËÐÐÎļþ·þÎñ¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "µ±Ç°ÕýÔÚÔËÐÐÊý¾Ý¿â·þÎñ¡£" - IDS_DB_STOPPED "µ±Ç°Ã»ÓÐÔËÐÐÊý¾Ý¿â·þÎñ¡£" - IDS_BK_RUNNING "µ±Ç°ÕýÔÚÔËÐб¸·Ý·þÎñ¡£" - IDS_BK_STOPPED "µ±Ç°Ã»ÓÐÔËÐб¸·Ý·þÎñ¡£" - IDS_SCS_STOPPED "µ±Ç°Ã»ÓÐÔËÐÐϵͳ¿ØÖÆ·þÎñÆ÷¡£" - IDS_SCC_STOPPED "µ±Ç°Ã»ÓÐÔËÐÐϵͳ¿ØÖÆ·þÎñÆ÷¡£" - IDS_FS_HOW_TO_RUN "ÒªÆô¶¯Îļþ·þÎñ£¬ÇëѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_FS_HOW_TO_STOP "ҪֹͣÎļþ·þÎñ£¬Ç벻ҪѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_DB_HOW_TO_RUN "ÒªÆô¶¯Êý¾Ý¿â·þÎñ£¬ÇëѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_DB_HOW_TO_STOP "ҪֹͣÊý¾Ý¿â·þÎñ£¬Ç벻ҪѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_BK_HOW_TO_RUN "ÒªÆô¶¯±¸·Ý·þÎñ£¬ÇëѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "Ҫֹͣ±¸·Ý·þÎñ£¬Ç벻ҪѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_SCS_HOW_TO_RUN "ÒªÆô¶¯ÏµÍ³¿ØÖÆ·þÎñÆ÷£¬ÇëѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_SCS_HOW_TO_STOP "Ҫֹͣϵͳ¿ØÖÆ·þÎñÆ÷£¬Ç벻ҪѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_DB_PARTIAL_CONFIG "ÒÑÅäÖÃÁ˲¿·ÖÊý¾Ý¿â·þÎñ¡£" - IDS_DB_DETAILS "ÈçÐè¸ü¶àÐÅÏ¢£¬Çë°´¡°ÏêϸÐÅÏ¢¡±°´Å¥¡£" - IDS_BK_DISABLED "½ûÓñ¸·Ý·þÎñ¡£" - IDS_BK_ENABLE "ÒªÆôÓñ¸·Ý·þÎñ£¬Äú±ØÐëÔËÐÐÊý¾Ý¿â·þÎñ¡£" - IDS_SC_DISABLED "½ûÓø÷þÎñÆ÷¡£" - IDS_SC_ENABLE "ÒªÆôÓø÷þÎñÆ÷£¬Äú±ØÐëÔËÐÐÎļþ·þÎñ»òÊý¾Ý¿â·þÎñ¡£" - IDS_FS_WILL_RUN "½«Æô¶¯Îļþ·þÎñ¡£" - IDS_FS_WILL_STOP "½«Í£Ö¹Îļþ·þÎñ¡£" - IDS_DB_WILL_RUN "½«Æô¶¯Êý¾Ý¿â·þÎñ¡£" - IDS_DB_WILL_STOP "½«Í£Ö¹Êý¾Ý¿â·þÎñ¡£" - IDS_BK_WILL_RUN "½«Æô¶¯±¸·Ý·þÎñ¡£" - IDS_BK_WILL_STOP "½«Í£Ö¹±¸·Ý·þÎñ¡£" - IDS_SCS_WILL_RUN "½«Æô¶¯ÏµÍ³¿ØÖÆ·þÎñÆ÷¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "½«Í£Ö¹ÏµÍ³¿ØÖÆ·þÎñÆ÷¡£" - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "Çý¶¯Æ÷ÒÑÓÐÒ»¸ö AFS ·ÖÇø" - IDS_VOLUME_HAS_NO_NAME "< ¾íûÓÐÃû³Æ >" - IDS_PARTITION_CREATED "Òѳɹ¦Ð½¨ AFS ·ÖÇø¡£" - IDS_PARTITION_EXISTS "ÄúÊäÈëµÄ·ÖÇøÃûÒѱ»ÁíÒ»¸ö·ÖÇøÊ¹Óá£" - IDS_SCS_RUNNING "µ±Ç°ÕýÔÚÔËÐÐϵͳ¿ØÖÆ·þÎñÆ÷¡£" - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN "¸ÃÇý¶¯Æ÷½ö°üº¬»ØÊÕÕ¾¡£" - IDS_SCC_WILL_RUN "½«Æô¶¯ÏµÍ³¿ØÖƿͻ§»ú¡£" - IDS_SCC_WILL_STOP "½«Í£Ö¹ÏµÍ³¿ØÖƿͻ§»ú¡£" - IDS_SCC_RUNNING "µ±Ç°ÕýÔÚÔËÐÐϵͳ¿ØÖƿͻ§»ú¡£" - IDS_SCC_HOW_TO_RUN "ÒªÆô¶¯ÏµÍ³¿ØÖƿͻ§»ú£¬ÇëѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_SCC_HOW_TO_STOP "Ҫֹͣϵͳ¿ØÖƿͻ§»ú£¬Ç벻ҪѡȡÉÏÃæµÄ¸´Ñ¡¿ò¡£" - IDS_SCS_ENABLE "ÒªÆôÓø÷þÎñÆ÷£¬Äú±ØÐëÍ£Ö¹ÕýÔÚÔËÐеÄϵͳ¿ØÖƿͻ§»ú¡£" - IDS_SCC_ENABLE "ÒªÆôÓø÷þÎñÆ÷£¬Äú±ØÐëÍ£Ö¹ÕýÔÚÔËÐеÄϵͳ¿ØÖÆ·þÎñÆ÷¡£" - IDS_UNCONFIG_DB_STEP "ÕýÔÚÈ¡Ïû¶ÔÊý¾Ý¿â·þÎñµÄÅäÖÃ" - IDS_UNCONFIG_DB_STEP_DESC "È¡Ïû¶ÔÊý¾Ý¿â·þÎñµÄÅäÖÃ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP "ÕýÔÚÈ¡Ïû¶ÔÊý¾Ý¿â·þÎñ(ºÍ±¸·Ý·þÎñÆ÷)µÄÅäÖÃ" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC "È¡Ïû¶ÔÊý¾Ý¿â·þÎñ(ºÍ±¸·Ý·þÎñÆ÷)µÄÅäÖÃ" - IDS_UNCONFIG_BK_STEP "ÕýÔÚÈ¡Ïû¶Ô±¸·Ý·þÎñÆ÷µÄÅäÖÃ" - IDS_UNCONFIG_BK_STEP_DESC "È¡Ïû±¸·Ý·þÎñÆ÷µÄÅäÖÃ" - IDS_UNCONFIG_FS_STEP "ÕýÔÚÈ¡Ïû¶ÔÎļþ·þÎñµÄÅäÖÃ" - IDS_UNCONFIG_FS_STEP_DESC "È¡Ïû¶ÔÎļþ·þÎñµÄÅäÖÃ" - IDS_UNCONFIG_SCS_STEP "ÕýÔÚÈ¡Ïû¶Ôϵͳ¿ØÖÆ·þÎñÆ÷µÄÅäÖÃ" - IDS_UNCONFIG_SCS_STEP_DESC "È¡Ïû¶Ôϵͳ¿ØÖÆ·þÎñÆ÷µÄÅäÖÃ" - IDS_UNCONFIG_SCC_STEP "ÕýÔÚÈ¡Ïû¶Ôϵͳ¿ØÖƿͻ§»úµÄÅäÖÃ" - IDS_UNCONFIG_SCC_STEP_DESC "È¡Ïû¶Ôϵͳ¿ØÖƿͻ§»úµÄÅäÖÃ" - IDS_INVALIDATE_CONFIG_INFO_STEP "ÕýÔÚʹ¸Ã»úÆ÷µÄÅäÖÃÐÅϢʧЧ" - IDS_CLOSE "¹Ø±Õ(&C)" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "ÔÚÒÔÏ AFS ·þÎñÆ÷ÉÏÎÞ·¨¸üРCellServDB Îļþ¡£ÕâÊÇÒ»¸ö·ÇÖÂÃüÐÔ´íÎó¡£\r\n" - IDS_DELETE_PARTITION_PROMPT "ȷʵҪɾ³ý·ÖÇø¡®%1¡¯Âð?" - IDS_INVALIDATE_CFG_INFO "¸Ã¼ÆËã»úÉÏÏÖÔÚûÓÐÔËÐÐ AFS ·þÎñÆ÷½ø³Ì¡£ÄúÊÇ·ñÏ£Íû´Ó¸Ã»úÆ÷ÉϳýÈ¥ÅäÖÃÐÅÏ¢?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "µ¥ÔªÒѲ»´æÔÚ¡£AFS ÅäÖÃÓ¦ÓóÌÐò½öÓÃÓÚÅäÖÃÒÑÅäÖõ½ AFS µ¥ÔªÖеķþÎñÆ÷¡£AFS ÅäÖÃÏòµ¼¿ÉÓÃÓÚÆô¶¯Ðµ¥Ôª¡£" - IDS_CFG_MAN_CANT_CONTINUE - "AFS ÅäÖÃÓ¦ÓóÌÐòÏÖÔÚ±ØÐëÖÕÖ¹¡£ËüÖ»ÄÜÔËÐÐÔÚÒÑÅäÖÃ³É AFS ·þÎñÆ÷µÄ»úÆ÷ÉÏ¡£ÒªÔٴν«¸Ã»úÆ÷ÅäÖÃ³É AFS ·þÎñÆ÷£¬ÇëÔËÐÐ AFS ÅäÖÃÏòµ¼¡£" - IDS_CONFIG_INFO_INVALIDATED - "²»ÔÙ½«¸Ã»úÆ÷ÅäÖÃ³É AFS ·þÎñÆ÷¡£AFS ÅäÖÃÓ¦ÓóÌÐòÖ»ÄÜÓÃÓÚÅäÖà AFS ·þÎñÆ÷»úÆ÷¡£AFS ÅäÖÃÏòµ¼¿ÉÓÃÓÚ½«¸Ã»úÆ÷ÖØÐÂÅäÖÃ³É AFS ·þÎñÆ÷¡£" - IDS_GET_TOKENS_FAILED "»ñµÃÖ¸¶¨µ¥ÔªµÄÁîÅÆÊ§°Ü¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "ÕýÔÚÆô¶¯±¸·Ý·þÎñÆ÷" - IDS_BK_STEP_DESC "Æô¶¯±¸·Ý·þÎñÆ÷" - IDS_CONFIG_ERROR "ÅäÖóö´í" - IDS_CREATE_PARTITION_ERROR "ÎÞ·¨´´½¨·ÖÇø" - IDS_REMOVE_PARTITION_ERROR "ÎÞ·¨³ýÈ¥·ÖÇø" - IDS_READ_PARTITIONS_ERROR "ÎÞ·¨¶ÁÈ¡·ÖÇø±í" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\n CellServDB ¸üнø³Ì¹ýÔçÖÕÖ¹¡£¿ÉÄÜÓзþÎñÆ÷δ¸üС£" - IDS_GET_PARTITION_LIST_ERROR "ÎÞ·¨È·¶¨¸Ã·þÎñÆ÷ÉϵķÖÇø" - IDS_EXPORTED "Òѵ¼³ö" - IDS_CANT_DELETE_EXPORTED_PARTITION - "µ±Îļþ·þÎñÔËÐÐʱ£¬ÎÞ·¨³ýÈ¥Òѵ¼³öµÄ·ÖÇø¡£Äú±ØÐëÔÚ³ýÈ¥¸Ã·ÖÇøÇ°Í£Ö¹Îļþ·þÎñ¡£" - IDS_CHECK_CONFIG_INFO "ÕýÔÚ¼ì²éÓÐЧµÄÅäÖÃÐÅÏ¢..." - IDS_ERROR_CFG_HOST_CLOSE "¹Ø±Õ·þÎñÆ÷ÅäÖÿâʧ°Ü" - IDS_FAILED_OPEN_CELL "´ò¿ªµ¥ÔªÊ§°Ü¡£" - IDS_FAILED_OPEN_NULL_CELL "´ò¿ª¿Õµ¥Ôª¾ä±úʧ°Ü" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Èç¹û²»´æÔÚ¸ù¾í£¬ÄúÊÇ·ñÏ£Íû´´½¨¸ù¾í?" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "Èç¹ûûÓи´ÖƸù¾í£¬ÄúÊÇ·ñÏ£Íû¸´ÖƸù¾í?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS ·þÎñÆ÷" - IDS_CANT_INIT_ADMIN_LIBS "ÎÞ·¨Ö´ÐиÃÓ¦ÓóÌÐò£º¿â³õʼ»¯Ê§°Ü¡£" - IDS_CANT_OPEN_LOG_FILE "ÎÞ·¨´ò¿ªÈÕÖ¾Îļþ¡£" - IDS_NEED_CLIENT_INFO "AFS ÅäÖÃÓ¦ÓóÌÐòÎÞ·¨ÔËÐУ¬ÒòΪ¸Ã¼ÆËã»úÉÏûÓÐÅäÖà AFS ¿Í»§»ú¡£ÕâÖÖÇé¿öÏ¿ÉʹÓà AFS ÅäÖÃÏòµ¼¡£ÊÇ·ñÔËÐÐ AFS ÅäÖÃÏòµ¼?" - IDS_NEED_SERVER_INFO "ûÓн«¼ÆËã»úÅäÖÃ³É AFS ·þÎñÆ÷¡£AFS ÅäÖÃÏòµ¼ÓÃÓÚ³õʼÅäÖà AFS ·þÎñÆ÷¡£È»ºó¿ÉÒÔʹÓà AFS ÅäÖÃÓ¦ÓóÌÐò¡£ÊÇ·ñÔËÐÐ AFS ÅäÖÃÏòµ¼ÒÔ³õʼÅäÖøüÆËã»ú?" - IDS_ADVANCED_OPEN "<< ¸ß¼¶(&A)" - IDS_ADVANCED_CLOSED "¸ß¼¶(&A) >>" - IDS_BOS_OPEN_FAILED "ÎÞ·¨Á¬½Óµ½·þÎñÆ÷(´ò¿ª bos ʧ°Ü)¡£" - IDS_SALVAGE_ERROR "Íì¾È²Ù×÷ʧ°Ü¡£" - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "Ö¸¶¨µÄÍì¾È½ø³ÌÊýÎÞЧ¡£Íì¾È½ø³ÌÊý±ØÐëÔÚ 1 µ½ 32 Ö®¼ä¡£" - IDS_WRONG_CELL "ÔÚÇ°Ãæ²½ÖèÖÐÄúÖ¸¶¨ÁËÓÃÓÚ¼ìË÷ÅäÖÃÐÅÏ¢µÄ·þÎñÆ÷¡£¸ÃÖ¸¶¨µÄ·þÎñÆ÷²»ÊôÓÚÄúÏ£Íû¼ÓÈëµÄµ¥Ôª¡£" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "ÎÞ·¨¸üе¥ÔªÖÐijЩ·þÎñÆ÷É쵀 CellServDB Îļþ¡£ÈçÐèÒ»ÕÅÁбí(¸ÃÁбíÏÔʾ·þÎñÆ÷µÄ¸üÐÂÇé¿ö)£¬Çë²é¿´´æ´¢ÔÚÎļþÖеÄÅäÖÃÈÕÖ¾¡£" - IDS_GET_CREDENTIALS_STEP "ÕýÔÚ»ñµÃ¹ÜÀíÁîÅÆ" - IDS_MUST_ENTER_SCS_NAME "±ØÐëÔÚÅäÖÃǰÊäÈëϵͳ¿ØÖÆÆ÷Ãû¡£" - IDS_NOT_SAME_CELL "AFS ¿Í»§»úÅäÖõ½ÁËÓë AFS ·þÎñÆ÷²»Í¬µÄµ¥ÔªÖС£ÅäÖà AFS ·þÎñÆ÷ǰ£¬ÄúÊ×ÏȱØÐ뽫 AFS ¿Í»§»úÖØÐÂÅäÖõ½·þÎñÆ÷µÄµ¥ÔªÖС£" - IDS_LAST_DB_SERVER "¸Ã»úÆ÷ÕýÔÚÔËÐе¥ÔªÖÐ×îºóµÄÊý¾Ý¿â·þÎñÆ÷¡£Èç¹ûÄú¼ÌÐø²¢È¡Ïû¸Ã»úÆ÷ÉϵÄÊý¾Ý¿â·þÎñÅäÖ㬵¥Ôª½«²»ÔÙ´æÔÚ£¬²¢½«È¡ÏûÕýÔËÐÐÔڸûúÆ÷ÉϵÄËùÓÐÆäËü AFS ·þÎñµÄÅäÖ᣻¹Òª¼ÌÐøÂð?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "AFS ίÍÐÈË¿ÚÁîÎÞЧ¡£" - IDS_ERROR_CLIENT_VERSION - "¸Ã¼ÆËã»úÉ쵀 AFS ¿Í»§»ú°æ±¾Óë AFS ·þÎñÆ÷°æ±¾²»¼æÈÝ¡£AFS ·þÎñÆ÷ÖÁÉÙÐèÒª AFS ¿Í»§»ú°æ±¾ 3.5¡£" - IDS_CANT_MAP_ROOT_AFS "ΪÁËÔÚ¸ù¾íÉÏÉèÖà ACL£¬ÅÌ·û±ØÐëÓ³Éäµ½ AFS ¡£µ±Ç°Ã»ÓпÉÓõÄÅÌ·û¡£ÇëÊÍ·ÅÒ»¸öÅÌ·û²¢°´È·¶¨¡£" - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "·ÖÇøÃû" - IDS_VOLUME_NAME_VALIDATION_TYPE "¾íÃû" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "Íì¾È½ø³ÌºÅ" - IDS_PATH_NAME_VALIDATION_TYPE "·¾¶Ãû" - IDS_FILE_NAME_VALIDATION_TYPE "ÎļþÃû" - IDS_GENERIC_VALIDATION_TYPE "Öµ" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/lang/zh_TW/afscfg.rc b/src/WINNT/afssvrcfg/lang/zh_TW/afscfg.rc deleted file mode 100644 index 1f2581091..000000000 --- a/src/WINNT/afssvrcfg/lang/zh_TW/afscfg.rc +++ /dev/null @@ -1,1159 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Configuration application and wizard" -#define AFS_VERINFO_NAME "afscfg" -#define AFS_VERINFO_FILENAME "afscfg.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Taiwan) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_WIZARD DIALOGEX 0, 0, 320, 246 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP | WS_EX_CONTROLPARENT -CAPTION "AFS ¦øªA¾¹§Ö³t±Ò°ÊºëÆF" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - PUSHBUTTON "¨ú®ø(&L)",IDCANCEL,101,225,50,14 - PUSHBUTTON "< ¤W¤@¨B(&B)",IDBACK,155,225,50,14 - DEFPUSHBUTTON "¤U¤@¨B(&N) >",IDNEXT,209,225,50,14 - PUSHBUTTON "»¡©ú(&H)",9,263,225,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,8,214,305,1 - LTEXT "",IDC_WIZARD_LEFTPANE,7,7,91,200,SS_SUNKEN - LTEXT "",IDC_WIZARD_RIGHTPANE,103,7,210,200 -END - -IDD_PARTITION_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - CONTROL "¬O(&Y)¡A«Ø¥ß¤À³Î°Ï¡C",IDC_CREATE_PARTITION,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,94,87,10 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,12,121, - 186,38,WS_EX_CLIENTEDGE - EDITTEXT IDC_PARTITION_NAME,124,165,33,12,ES_AUTOHSCROLL - CONTROL "§_(&O)¡A¤£­n«Ø¥ß¤À³Î°Ï¡C",IDC_DONT_CREATE_PARTITION, - "Button",BS_AUTORADIOBUTTON,0,184,102,8 - LTEXT "¡uÀɮצøªA¾¹¡v·|Àx¦s¨Ã¶Ç°eÀÉ®×»Pµ{¦¡¨ì AFS ¥Î¤áºÝ¡C¦pªG­n³z¹L AFS ¦@¨ÉÀx¦s¦b¥»¨t²Îªº¸ê®Æ¡A¦Ü¤Ö¦³¤@­Ó NTFS ®eÅ饲¶·¬O±MÄݪº AFS ¤À³Î°Ï¡C", - -1,4,15,198,25 - LTEXT "¿ï¨ú§@¬°¤À³Î°Ï¨Ï¥Îªº®eÅé(&S)¡G",IDC_SELECT_DRIVE,12,106, - 163,9 - LTEXT "AFS ¤À³Î°Ï¦WºÙ(&M)¡G /vicep",IDC_NAME_LABEL,11,167,107, - 8 - LTEXT "¦b¥»¡uÀɮצøªA¾¹¡v¤W«Ø¥ß AFS ¤À³Î°Ï¡C",IDC_TITLE,4,2, - 198,8 - LTEXT "AFS ¤À³Î°Ï¹ê»Ú¤W¬Û·í©ó NTFS ®eÅé¡AµM¦Ó¥¦ÁÙ¥]¬A¤À³Î°Ï¤W¡A¦³Ãö¸ê°Tµ²ºc»P¦ì¸mªº¯S©w meta ¸ê®Æ¡C", - -1,4,42,198,25 - LTEXT "±z­n¦b³o­Ó¡uÀɮצøªA¾¹¡v¤W«Ø¥ß¤À³Î°Ï¶Ü¡H", - IDC_ASK_CREATE_PARTITION,4,75,198,18 - LTEXT "¥²­n®É¡A©ó°õ¦æ´Á¶¡³]©w°T®§¡C",IDC_PARTITION_MSG,3,167, - 186,31,NOT WS_VISIBLE - LTEXT "",IDC_PARTITION_COVER,0,75,210,92,NOT WS_VISIBLE -END - -IDD_FILE_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¬O(&Y)¡A¬[ºc¬°¡uÀɮצøªA¾¹¡v¡C", - IDC_SHOULD_CONFIG_FILE_SERVER,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,0,178,114,10 - CONTROL "§_(&O)¡A¤£­n¬[ºc¬°¡uÀɮצøªA¾¹¡v¡C", - IDC_DONT_CONFIG_FILE_SERVER,"Button",BS_AUTORADIOBUTTON, - 0,189,133,10 - LTEXT "¡uAFS ÀɮתA°È¡v±N±q¦¹¦øªA¾¹¤W±N©Ò­n¨DªºÀÉ®×»Pµ{¦¡¶Ç°e¨ì AFS ¥Î¤áºÝ¡C³o¶µªA°È¦P®É¤]³B²z©Ò¦³ªº®eÅéºÞ²z§@·~¡A¨Ò¦p«Ø¥ß¡B§R°£¡B²¾°£»P½Æ»s®eÅé¡C", - -1,4,38,198,34 - LTEXT "±N¥»¾÷¾¹¬[ºc¬°¡uÀɮצøªA¾¹¡v¡C",IDC_TITLE,4,1,198,8 - LTEXT "±z­n±N¥»¾÷¾¹¬[ºc¬°¡uÀɮצøªA¾¹¡v¶Ü¡H", - IDC_CREATE_FS_QUESTION,4,166,198,8 - LTEXT "¦p­n±N¥»¾÷¾¹¬[ºc¬°¡uÀɮצøªA¾¹¡v¡A±z¥²¶·¬[ºc¡uÀɮתA°È¡v¡C", - -1,4,15,198,17 - LTEXT "ªþµù¡G¦¹¾÷¾¹¥Ø«e¨S¦³¥i¥ÎªººÏºÐ¾÷¡A¦]¦¹µLªk±NÀÉ®×Àx¦s¨ì AFS¡CÁöµM±z¥i¥H±N¥»¾÷¾¹¬[ºc¬°¡uÀɮצøªA¾¹¡v¡A¦ý¬O±z¤£¯à±N AFS ¸ê®ÆÀx¦s¦b¦¹¾÷¾¹¤W¡C", - IDC_NO_DRIVES_NOTE,4,77,198,32,NOT WS_VISIBLE - LTEXT "¦p­n«Ø¥ßºÏºÐ¾÷¡A½Ð¨Ï¥Î Windows NT ºÏºÐ¨t²ÎºÞ²zªÌ¡C", - IDC_DISK_ADMIN_NOTE,4,112,198,16,NOT WS_VISIBLE - LTEXT "¦¹¾÷¾¹¤w¬[ºc¬°¡uÀɮצøªA¾¹¡v¡C",IDC_MSG,10,166,199,34, - NOT WS_VISIBLE -END - -IDD_INTRO_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "Åwªï¨Ï¥Î¡uAFS ¦øªA¾¹§Ö³t±Ò°ÊºëÆF¡v¡A¥»ºëÆF±NÀ°§U±z§Ö³t¦a¦b¦¹ Windows NT ¨t²Î¤W¬[ºc¡uAFS ¦øªA¾¹¡v¡C", - IDC_TITLE,2,4,198,25 - LTEXT "½Ð«ö¡u¤U¤@¨B¡v¡A¶}©l¬[ºc¡uAFS ¦øªA¾¹¡v¡C",IDC_STATIC,0, - 166,209,8 -END - -IDD_REPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¬O(&Y)¡A½Æ»s®Ú®eÅé¡C",IDC_REPLICATE,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,4,178,198,10 - CONTROL "§_(&O)¡A¤£­n½Æ»s®Ú®eÅé¡C",IDC_DONT_REPLICATE,"Button", - BS_AUTORADIOBUTTON,4,189,198,10 - LTEXT "½Æ»s´N¬O¦b¼Æ­Ó¤À³Î°Ï¡A³q±`¬O¦b¨ä¥Lªº¡uÀɮצøªA¾¹¡v¤W¡A«Ø¥ß®eÅé°ßŪ½Æ¥»ªºµ{§Ç¡C¦bºô¸ô©Î¦øªA¾¹µo¥Í¹B§@¤¤Â_ªº±¡ªp¤U¡A½Æ»s¥i¥H¼W¥[®eÅ骺¥i¥Î©Ê¡A", - IDC_STATIC,4,38,198,25 - LTEXT "±z­n½Æ»s®Ú®eÅé¶Ü¡H",IDC_REPLICATE_QUESTION,4,165,198,8 - LTEXT "½Æ»s¤]¥iÁ×§K¥ô¤@¦øªA¾¹¦]®eÅé¦s¨úÀW²v¹L°ª¦Ó­t²ü¹L­«¡C", - IDC_STATIC,4,85,187,25 - LTEXT "½Æ»s Cell ®Ú®eÅé¡C",IDC_TITLE,4,2,198,8 - LTEXT "­Y±z­pµe½Æ»s¦¹ AFS Cell ªº¨ä¥L®eÅé¡A±z¥²¶·¥ý½Æ»s®Ú®eÅé¡C", - IDC_STATIC,4,17,191,16 - LTEXT "¸U¤@¦¹®eÅé©Ò¦bªº¦øªA¾¹¤§¤@ÅܱoµLªk¨Ï¥Î¡A±z¤´¥i±q¨ä¥L¦øªA¾¹¤W¦s¨ú¸Ó®eÅé¡C", - IDC_STATIC,4,64,198,21 - LTEXT "¥²­n®É¡A©ó°õ¦æ´Á¶¡³]©w°T®§¡C",IDC_CANT_REPLICATE_MSG,7, - 166,202,34,NOT WS_VISIBLE | NOT WS_GROUP -END - -IDD_ROOT_VOLUMES_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¬O(&Y)¡A«Ø¥ß®Ú®eÅé¡C",IDC_CREATE_ROOT_VOLUMES,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,4,177,203,10 - CONTROL "§_(&O)¡A¤£­n«Ø¥ß®Ú®eÅé¡C",IDC_DONT_CREATE_ROOT_VOLUMES, - "Button",BS_AUTORADIOBUTTON,4,188,203,10 - LTEXT "¦b AFS ¤¤¡A®eÅ鬰¬ÛÃöÀɮתº¶°¦X¡A¦Ó³o¨ÇÀɮ׫h²Õ´¦¨³æ¤@¥B©ö©óºÞ²zªº³æ¤¸¡A¥H§Q¨t²ÎºÞ²z¡C", - IDC_STATIC,4,15,198,17 - LTEXT "±z­n«Ø¥ß®Ú®eÅé¶Ü¡H",IDC_ROOT_AFS_QUESTION,4,164,203,8 - LTEXT "«Ø¥ß Cell ªº®Ú®eÅé¡C",IDC_TITLE,4,0,203,8 - LTEXT "¤@¥¹«Ø¥ß¤§«á¡A§Y¥i¦b AFS ÀɮתŶ¡¤¤¦Û°Ê¦s¨ú®Ú®eÅé¡C", - IDC_STATIC,4,67,202,17 - LTEXT "¥²­n®É¡A©ó°õ¦æ´Á¶¡³]©wªº°T®§¡C",IDC_ROOT_AFS_MSG,5,164, - 202,33,NOT WS_VISIBLE - LTEXT "root.afs ®eÅé¬O AFS ÀɮתŶ¡ªº®Ú¡Croot.Cell ®eÅ鬰 AFS ÀɮתŶ¡¤§ Cell ¤l¾ðªº®Ú¡A¨Ã¥B±q root.afs ³z¹L¸Ë¸üÂI¨Ó¦s¨ú¡C", - IDC_STATIC,4,36,198,25 -END - -IDD_GET_CURRENT_CONFIG DIALOG DISCARDABLE 0, 0, 198, 84 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "AFS ¦øªA¾¹¬[ºc" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, - 36,38,148,14 - LTEXT "§@·~¤å¦r - ©ó°õ¦æ®É´Á³]©w¡C",IDC_OPERATION,35,20,145,10 - ICON "",IDC_LOGO,7,7,20,20 - PUSHBUTTON "¨ú®ø",IDCANCEL,73,63,50,14 - LTEXT "¨M©w¥Ø«eªº¬[ºc¡G",IDC_OPERATION2,35,7,156,10 -END - -IDD_BACKUP_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 213, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¬O(&Y)¡A¬[ºc¬°¡u³Æ¥÷¦øªA¾¹¡v¡C", - IDC_CONFIG_BACKUP_SERVER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,3,156,128,10 - CONTROL "¤£(&O)¡A¤£­n¬[ºc¬°¡u³Æ¥÷¦øªA¾¹¡v¡C", - IDC_DONT_CONFIG_BACKUP_SERVER,"Button", - BS_AUTORADIOBUTTON,3,174,147,10 - LTEXT "¡u³Æ¥÷¦øªA¾¹¡v¥u¯à¦b¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡vªº¾÷¾¹¤W°õ¦æ¡C¥t¥~¡A¦pªG¡u³Æ¥÷¦øªA¾¹¡v¬O¦b Cell ¸Ìªº¤@­Ó¡u¸ê®Æ®w¦øªA¾¹¡v¤W°õ¦æ¡A¨º»ò¤]¥²¶·¦b Cell ¸Ìªº©Ò¦³¡u¸ê®Æ®w¦øªA¾¹¡v¤W°õ¦æ¡C", - -1,3,38,199,32 - LTEXT "±z­n±N¥»¾÷¾¹¬[ºc¬°¡u³Æ¥÷¦øªA¾¹¡v¶Ü¡H", - IDC_BACKUP_SERVER_QUESTION,4,142,177,10 - LTEXT "±N¥»¾÷¾¹¬[ºc¬°¡u³Æ¥÷¦øªA¾¹¡v¡C",IDC_TITLE,4,6,207,8 - LTEXT "¡u³Æ¥÷¦øªA¾¹¡v¬°¡u¸ê®Æ®wªA°È¡vªº¿ï¥Î¥\¯à¡C",-1,3,20,209, - 16 - LTEXT "¦¹¾÷¾¹¤w¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¡C",IDC_CANT_BACKUP_MSG, - 14,157,168,15,NOT WS_VISIBLE -END - -IDD_SYS_CONTROL_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¬[ºc¬°¡u¨t²Î±±¨î¦øªA¾¹¡v(&S)¡C",IDC_SYS_CONTROL_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,4,146,141,10 - CONTROL "¬[ºc¬°¡u¨t²Î±±¨î¥Î¤áºÝ¡v(&C)¡C",IDC_SYS_CONTROL_CLIENT, - "Button",BS_AUTORADIOBUTTON,4,159,131,9 - EDITTEXT IDC_SYS_CONTROL_MACHINE,91,171,118,12,ES_AUTOHSCROLL | - WS_DISABLED - CONTROL "¤£­n¬[ºc¬°¨t²Î±±¨î¥Î¤áºÝ©Î¦øªA¾¹(&O)¡C", - IDC_DONT_CONFIGURE,"Button",BS_AUTORADIOBUTTON,4,187,183, - 9 - LTEXT "¡u¨t²Î±±¨î¦øªA¾¹¡v´£¨Ñ¤@¯ëªº¬[ºcÀɵ¹¨ä¥L§@¬°¡u¨t²Î±±¨î¥Î¤áºÝ¡vªº¡uAFS ¦øªA¾¹¡v¾÷¾¹¡CAFS Cell ¶È¥i°õ¦æ³æ¤@ªº¡u¨t²Î±±¨î¦øªA¾¹¡v¡C", - -1,4,20,200,25 - LTEXT "¬[ºc¬°¡u¨t²Î±±¨î¦øªA¾¹¡v©Î¡u¥Î¤áºÝ¡v¡C",IDC_TITLE,4,4, - 200,8 - LTEXT "±z­n±N¦¹¾÷¾¹¬[ºc¬°¡u¨t²Î±±¨î¦øªA¾¹¡v©Î¡u¥Î¤áºÝ¡v¶Ü¡H", - IDC_SYS_CONTROL_MACHINE_QUESTION,4,127,205,17 - LTEXT "¡u¨t²Î±±¨î¥Î¤áºÝ¡v±µ¦¬¥ô¦ó±q Cell ªº¡u¨t²Î±±¨î¦øªA¾¹¡v¦b AFS ¬[ºcÀɤWªº¥i¥Î§ó·s¡C", - IDC_SYS_CONTROL_CLIENT_DESC,4,49,200,18 - LTEXT "¨t²Î±±¨î¦øªA¾¹(&Y)¡G",IDC_SYS_CONTROL_MACHINE_LABEL,11, - 173,78,8,WS_DISABLED - LTEXT "",IDC_CANT_CONFIG_MSG,7,163,197,34,NOT WS_VISIBLE - LTEXT "ĵ§i¡G¥¼¨Ï¥Î AFS ¬ü°ê¤À°eªººô¯¸¡A¤£±o³z¹L¡u¨t²Î±±¨î¦øªA¾¹¡v¤À°e¬[ºcÀɮסA§_«h·|¥H¥¼¥[±Kªº¤è¦¡¶Ç°e±Ó·Pªº¨t²Î¸ê°T¡C", - -1,9,79,183,34 -END - -IDD_CONFIG_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¤w¨ã¦³¦b¦¹¨t²Î¤W¬[ºc¡uAFS ¦øªA¾¹¡v®É©Ò»Ýªº¥þ³¡¸ê°T¡C", - IDC_ALL_NEEDED_MSG,1,13,209,17 - LTEXT "±N¦¹¾÷¾¹¬[ºc¦Ü Cell <©ó°õ¦æ´Á¶¡³]©w>",IDC_TITLE,2,2,198, - 8 - LTEXT "±N·|°õ¦æ¥H¤Uªº¬[ºc¨BÆJ¡G",IDC_FOLLOWING_STEPS_MSG,1,36, - 187,8 - LTEXT "¨BÆJ 1 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP1,22,49,179,8,NOT - WS_VISIBLE - LTEXT "¨BÆJ 3 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP3,22,73,179,8,NOT - WS_VISIBLE - LTEXT "¨BÆJ 2 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP2,22,61,179,8,NOT - WS_VISIBLE - LTEXT "¨BÆJ 4 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP4,22,85,179,8,NOT - WS_VISIBLE - LTEXT "¨BÆJ 5 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP5,22,97,179,8,NOT - WS_VISIBLE - LTEXT "¨BÆJ 6 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP6,22,109,179,8,NOT - WS_VISIBLE - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,1,178,200,11 - LTEXT "¨BÆJ 8 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP8,22,133,179,8,NOT - WS_VISIBLE - LTEXT "¨BÆJ 7 - °õ¦æ´Á¶¡³]©wªº¤å¦r",IDC_STEP7,22,121,179,8,NOT - WS_VISIBLE - LTEXT "¥²­n®É¡A©ó°õ¦æ´Á¶¡³]©wªº°T®§¡C",IDC_CANT_CONFIG_MSG,1, - 13,209,17,NOT WS_VISIBLE - LTEXT "§¹¦¨¦Ê¤À¤ñ¡G",IDC_PERCENT_COMPLETE_LABEL,1,191,61,8,NOT - WS_VISIBLE - LTEXT "¥Ø«eªº§@·~¡G",IDC_CURRENT_STEP_LABEL,1,157,50,8,NOT - WS_VISIBLE - LTEXT "¥Ø«eªº¨BÆJ»¡©ú - ©ó°õ¦æ´Á¶¡³]©w",IDC_CURRENT_STEP,1,167, - 208,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,63,191,49,8,NOT WS_VISIBLE - LTEXT "¦p­n¶}©l¬[ºc¦¹¹q¸£¡A½Ð«ö¡u¬[ºc¡v«ö¶s¡C¦p­nÅܧó©Ò°õ¦æªº¬[ºc¨BÆJ¡A½Ð«ö¡u¤W¤@¨B¡v«ö¶s¡C", - IDC_STATUS_MSG,1,159,200,41 - LTEXT "",IDC_STEP1_GRAPHIC,10,49,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP2_GRAPHIC,10,61,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP3_GRAPHIC,10,73,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP4_GRAPHIC,10,85,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP5_GRAPHIC,10,97,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP6_GRAPHIC,10,109,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP7_GRAPHIC,10,121,9,9,NOT WS_VISIBLE - LTEXT "",IDC_STEP8_GRAPHIC,10,133,9,9,NOT WS_VISIBLE -END - -IDD_INFO_PAGE2_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_ADMIN_NAME,64,55,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,64,71,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_VERIFY_ADMIN_PW,64,87,138,12,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_AFS_UID,94,156,37,12,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_AFS_UID_SPINNER,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,132,155,11,14 - LTEXT "ºÞ²z¤Wªº¸ê°T",IDC_TITLE,0,2,189,8 - LTEXT "¦WºÙ(&M)¡G",IDC_ADMIN_NAME_LABEL,7,57,38,8 - LTEXT "±K½X(&P)¡G",IDC_ADMIN_PW_LABEL,7,73,34,8 - GROUPBOX "±b¤á¦WºÙ»P±K½X",IDC_ADMIN_INFO_FRAME,0,41,210,65 - LTEXT "ÅçÃÒ±K½X(&V)¡G",IDC_VERIFY_ADMIN_PW_LABEL,7,90,52,8 - LTEXT "¤U¦C¬O«Ø¥ß·s Cell ®É©Ò»ÝªººÞ²z±b¤á¸ê°T¡C",IDC_STATIC,0, - 15,209,17 - CONTROL "¨Ï¥Î¦¹ AFS UID (&S)¡G",IDC_USE_THIS_UID,"Button", - BS_AUTORADIOBUTTON,6,157,85,10 - CONTROL "¨Ï¥Î¤U­Ó¥i¥Îªº AFS UID (&U)",IDC_USE_NEXT_UID,"Button", - BS_AUTORADIOBUTTON,6,144,136,10 - GROUPBOX "AFS UID",IDC_STATIC,0,118,209,57 - LTEXT "¿é¤J AFS ºÞ²z±b¤áªº¨Ï¥ÎªÌ ID¡G",IDC_STATIC,6,130,196,9 -END - -IDD_DB_SERVER_PAGE DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¬O¡A¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v(&Y)¡C",IDC_CONFIG_DB_SERVER, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,2,145,134,10 - CONTROL "¤£¡A¤£­n¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v(&O)¡C", - IDC_DONT_CONFIG_DB_SERVER,"Button",BS_AUTORADIOBUTTON,0, - 187,153,10 - LTEXT "¡u¸ê®Æ®wªA°È¡vºûÅ@ AFS Cell ©Ò»Ýªº½Æ»s¸ê®Æ®w¶°¡C¦¹ªA°ÈºûÅ@ Cell ©Ò¦³±b¤á¡B®eÅé¦ì¸m¥H¤Î¡]¿ï¥Î©Êªº¡^³Æ¥÷¸ê°T¡C", - -1,4,37,191,54 - LTEXT "±z­n±N¥»¾÷¾¹¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¶Ü¡H", - IDC_DB_SERVER_QUESTION,4,135,205,10 - LTEXT "±N¥»¾÷¾¹¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¡C",IDC_TITLE,4,4,204,8 - LTEXT "¦p­n±N¥»¾÷¾¹¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¡A±z¥²¶·¬[ºc¡u¸ê®Æ®wªA°È¡v¡C", - -1,4,15,186,16 - LTEXT "¦¹¾÷¾¹¤w¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¡C",IDC_MSG,10,177,194,23, - NOT WS_VISIBLE - EDITTEXT IDC_SYS_CONTROL_MACHINE,97,174,108,12,ES_AUTOHSCROLL - LTEXT "¨t²Î±±¨î¦øªA¾¹(&S)¡G",IDC_SYS_CONTROL_MACHINE_LABEL,9, - 175,77,8 - LTEXT "¦pªG±zªº Cell ¨ã¦³¡u¨t²Î±±¨î¦øªA¾¹¡v¡A½Ð¦b¤U¤è¿é¤J¨ä¥D¹q¸£¦WºÙ¡CAFS ¬[ºcÀÉ·|³z¹L¦¹¦øªA¾¹¥[¥H§ó·s¡C", - IDC_SCM_PROMPT,13,155,195,17 -END - -IDD_INFO_PAGE DIALOGEX 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - CONTROL "¦b²{¦³ªº AFS Cell ¤¤¡A±N¦¹¥D¹q¸£Åܦ¨¦øªA¾¹(&M)", - IDC_JOIN_EXISTING_CELL,"Button",BS_AUTORADIOBUTTON,3,37, - 187,10 - CONTROL "³o±N¬O·sªº AFS Cell ¤¤ªº²Ä¤@­Ó¦øªA¾¹(&T)", - IDC_FIRST_SERVER,"Button",BS_AUTORADIOBUTTON,3,49,167,10 - EDITTEXT IDC_CELL_NAME,64,91,139,12,ES_LOWERCASE | ES_AUTOHSCROLL - EDITTEXT IDC_SERVER_PW,64,166,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - EDITTEXT IDC_VERIFY_PW,64,180,139,12,ES_PASSWORD | ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "Cell »P¦øªA¾¹¸ê°T",IDC_TITLE,3,1,203,8 - LTEXT "Cell ¦WºÙ(&C)¡G",IDC_CELL_NAME_LABEL,7,93,57,8 - LTEXT "±K½X(&P)¡G",IDC_SERVER_PW_LABEL,7,167,34,8,WS_DISABLED - LTEXT "¿é¤J AFS Cell ¦WºÙ¡C",IDC_CELL_NAME_PROMPT,8,78,195,11 - LTEXT "¿é¤J AFS ¥DÅ骺±K½X¡C©Ò¦³ªº AFS ¦øªA¾¹³£·|¨ú±o¦¹¥DÅ骺°O¸¹¡C", - IDC_SERVER_PW_PROMPT,7,130,196,19,WS_DISABLED - GROUPBOX "Cell ¦WºÙ",IDC_CELL_NAME_FRAME,0,67,210,43 - GROUPBOX "¦øªA¾¹±K½X",IDC_SERVER_PW_FRAME,0,119,210,81, - WS_DISABLED - LTEXT "ÅçÃÒ±K½X(&V)¡G",IDC_VERIFY_PW_LABEL,7,180,52,8, - WS_DISABLED - LTEXT "AFS Cell ¬O´£¨ÑÀɮצs¨ú²Î¤@«Å§i¦WºÙÀx¦s°Ïªº¦øªA¾¹¶°¦X¡C", - IDC_CELL_NAME_PROMPT2,3,15,191,17 - LTEXT "¦WºÙ¡G",IDC_PRINCIPAL_LABEL,7,152,34,8,WS_DISABLED - LTEXT "afs",IDC_PRINCIPAL,64,150,139,12,WS_DISABLED, - WS_EX_CLIENTEDGE -END - -IDD_INFO_PAGE2_NOT_FIRST_SERVER DIALOG DISCARDABLE 0, 0, 210, 200 -STYLE DS_CONTROL | WS_CHILD | WS_BORDER -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_ADMIN_NAME,65,43,138,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,65,59,138,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,65,132,138,12,ES_AUTOHSCROLL - LTEXT "ºÞ²z¤Wªº¸ê°T",IDC_TITLE,4,2,198,8 - LTEXT "¦b¤U¤è¿é¤JºÞ²z±b¤á¸ê°T¡G",IDC_ADMIN_INFO_PROMPT,7,30, - 196,10 - LTEXT "¦WºÙ(&N)¡G",IDC_ADMIN_NAME_LABEL,7,46,37,8 - LTEXT "±K½X(&P)¡G",IDC_ADMIN_PW_LABEL,7,62,34,8 - GROUPBOX "±b¤á¦WºÙ»P±K½X",IDC_ADMIN_INFO_FRAME,0,17,210,62 - GROUPBOX "²{¦³ªº AFS ¦øªA¾¹",IDC_HOSTNAME_FRAME,1,92,209,60 - LTEXT "AFS ¦øªA¾¹¡G",IDC_HOSTNAME_LABEL,9,134,53,8 - LTEXT "¿é¤J¨ä¥L­n¥[¦b Cell ¤¤ªº AFS ¦øªA¾¹¥D¹q¸£¦WºÙ¡C±N±q¦¹¦øªA¾¹¤W¨ú±o AFS ¬[ºc¸ê°T¡C", - IDC_HOSTNAME_PROMPT,7,105,195,25 -END - -IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 295, 265 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "ªA°È" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "",IDC_STATIC,7,25,281,35 - GROUPBOX "",IDC_STATIC,7,72,281,37 - GROUPBOX "",IDC_STATIC,7,120,281,35 - GROUPBOX "",IDC_STATIC,7,166,281,35 - CONTROL "ÀɮתA°È",IDC_FS_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,19,60,10 - CONTROL "¸ê®Æ®wªA°È",IDC_DB_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,65,82,10 - PUSHBUTTON "©ú²Ó...",IDC_DB_DETAILS,230,88,50,14,NOT WS_VISIBLE - CONTROL "³Æ¥÷¦øªA¾¹",IDC_BK_SERVICE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,114,71,10 - CONTROL "¨t²Î±±¨î¦øªA¾¹",IDC_SCS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,160,98,10 - EDITTEXT IDC_SC_MACHINE,107,230,119,12,ES_AUTOHSCROLL | - WS_DISABLED - LTEXT "¿ï¨ú¦b¦¹ AFS ¦øªA¾¹¤W°õ¦æªºªA°È¡G",IDC_STATIC,7,7,144,8 - LTEXT "¥Ø«e¥¿¦b°õ¦æ¡uÀɮתA°È¡v¡C",IDC_FS_STATUS_MSG,14,32,261, - 8 - LTEXT "¥Ø«e¤w³¡¥÷¦w¸Ë¡u¸ê®Æ®wªA°È¡v¡C",IDC_DB_STATUS_MSG,14,78, - 195,8 - LTEXT "¨t²Î±±¨î¦øªA¾¹(&Y)¡G",IDC_SC_MACHINE_LABEL,25,232,79,8, - WS_DISABLED - LTEXT "¦p­n°±¤î¡uÀɮתA°È¡v¡A½Ð¨ú®ø¤W­±ªº¤è¶ô¤Ä¿ï¡C", - IDC_FS_ACTION_MSG,14,44,262,8 - LTEXT "«ö¤@¤U©ú²Ó¡A¥H¬d¾\¸Ô²Ó¸ê°T¡C",IDC_DB_ACTION_MSG,14,92, - 208,8 - LTEXT "¥Ø«e¥¿¦b°õ¦æ¡u³Æ¥÷¦øªA¾¹¡v¡C",IDC_BK_STATUS_MSG,14,127, - 259,8 - LTEXT "¦p­n°±¤î¡u³Æ¥÷¦øªA¾¹¡v¡A½Ð¨ú®ø¤W­±ªº¤è¶ô¤Ä¿ï¡C", - IDC_BK_ACTION_MSG,14,139,262,8 - LTEXT "¦p­n±Ò°Ê¦¹¦øªA¾¹¡A±z¥²¶·°õ¦æ¡uÀɮתA°È¡v©Î¡u¸ê®Æ®wªA°È¡v¡C", - IDC_SCS_ACTION_MSG,14,185,268,9 - LTEXT "¥Ø«e¨Ã¥¼°õ¦æ¡u¨t²Î±±¨î¡vªA°È¡C",IDC_SCS_STATUS_MSG,14, - 172,263,9 - GROUPBOX "",IDC_STATIC,7,213,281,45 - CONTROL "¨t²Î±±¨î¥Î¤áºÝ",IDC_SCC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,206,95,10 - LTEXT "¦p­n±Ò°Ê¦¹¦øªA¾¹¡A±z¥²¶·°õ¦æ¡uÀɮתA°È¡v©Î¡u¸ê®Æ®wªA°È¡v¡C", - IDC_SCC_ACTION_MSG,14,245,268,9 - LTEXT "¥Ø«e¨Ã¥¼°õ¦æ¡u¨t²Î±±¨î¡vªA°È¡C",IDC_SCC_STATUS_MSG,14, - 219,263,9 -END - -IDD_PARTITIONS_PAGE DIALOGEX 0, 0, 295, 265 -STYLE DS_CONTEXTHELP | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "¤À³Î°Ï" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "±zªº¹q¸£¤W¦³¤U¦C AFS ¤À³Î°Ï(&A)¡G",IDC_STATIC,8,7,175, - 8 - PUSHBUTTON "«Ø¥ß(&C)...",IDC_CREATE_PARTITIONS,17,118,53,14 - LTEXT "¦p­n´©±Ï¤À³Î°Ï©Î¤À³Î°Ï¤Wªº®eÅé¡A½Ð¿ï¾Ü²M³æ¤Wªº¤À³Î°Ï¡A¨Ã«ö¤W­±ªº«ö¶s¡C¦p­n´©±Ï¦¹¦øªA¾¹¤Wªº©Ò¦³¤À³Î°Ï¡A½Ð«ö¤W­±ªº«ö¶s¡C", - IDC_SALVAGE_MSG,30,179,250,25 - PUSHBUTTON "´©±Ï(&S)...",IDC_SALVAGE,17,159,53,14 - LTEXT "¦p­n²¾°£¤À³Î°Ï¡A½Ð¿ï¾Ü²M³æ¤Wªº¤À³Î°Ï¡A¨Ã«ö¤@¤U¤W­±ªº«ö¶s¡C", - IDC_REMOVE_MSG,30,235,253,8,WS_DISABLED - PUSHBUTTON "²¾°£(&M)",IDC_REMOVE,17,217,53,14,WS_DISABLED - GROUPBOX "¤À³Î°Ï",IDC_AGGR_FRAME,7,103,281,155 - CONTROL "",IDC_PARTITION_LIST,"FastList",WS_TABSTOP | 0x83,7,16, - 281,79,WS_EX_CLIENTEDGE - LTEXT "¦p­n¦b¦¹¦øªA¾¹¤W«Ø¥ß·sªº¤À³Î°Ï¡A½Ð«ö¤W­±ªº«ö¶s¡C", - IDC_CREATE_MSG,30,136,254,8 -END - -IDD_CREATE_PARTITION DIALOGEX 0, 0, 264, 177 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "«Ø¥ß AFS ¤À³Î°Ï" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¦b¤U¤è²M³æ¤¤¿ï¨ú NTFS ®eÅé¡A¥H«Ø¥ß·sªº¤À³Î°Ï¡G", - IDC_TITLE,7,5,250,8 - LTEXT "AFS ¤À³Î°Ï¦WºÙ¡G",IDC_NAME_STATIC,17,131,66,8 - EDITTEXT IDC_PARTITION_NAME,112,129,20,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "«Ø¥ß(&C)",IDC_CREATE,96,158,50,14,WS_DISABLED - PUSHBUTTON "Ãö³¬(&O)",IDC_CLOSE,152,158,50,14 - PUSHBUTTON "»¡©ú",9,207,158,50,14 - GROUPBOX "¤À³Î°Ï°Ñ¼Æ",IDC_ARGS_FRAME,7,117,250,33 - CONTROL "",IDC_DRIVE_LIST,"FastList",WS_TABSTOP | 0x8b,7,15,250, - 95,WS_EX_CLIENTEDGE - LTEXT "/vicep",IDC_VICEP_STATIC,90,131,22,8 -END - -IDD_ADMIN_INFO DIALOG DISCARDABLE 0, 0, 225, 157 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS ¦øªA¾¹¬[ºc" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_ADMIN_NAME,80,33,130,12,ES_AUTOHSCROLL - EDITTEXT IDC_ADMIN_PW,80,49,130,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_HOSTNAME,80,110,130,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "¬[ºc(&C)",IDOK,109,132,50,14,WS_DISABLED - PUSHBUTTON "¨ú®ø",IDCANCEL,49,132,50,14 - PUSHBUTTON "»¡©ú",9,169,132,50,14 - LTEXT "¦b¤U¤è¿é¤JºÞ²z±b¤á¸ê°T¡G",IDC_ADMIN_INFO_PROMPT,14,20, - 196,10 - LTEXT "¦WºÙ(&N)¡G",IDC_ADMIN_NAME_LABEL,15,36,44,8 - LTEXT "±K½X(&P)¡G",IDC_ADMIN_PW_LABEL,15,52,34,8 - GROUPBOX "±b¤á¦WºÙ»P±K½X",IDC_ADMIN_INFO_FRAME,7,7,211,62 - GROUPBOX "¨t²Î±±¨î¦øªA¾¹",IDC_HOSTNAME_FRAME,7,76,211,54 - LTEXT "¥D¹q¸£¦WºÙ(&H)¡G",IDC_HOSTNAME_LABEL,15,112,62,8 - LTEXT "¦pªG±zªº Cell ¨ã¦³¡u¨t²Î±±¨î¦øªA¾¹¡v¡A½Ð¦b¤U¤è¿é¤J¨ä¥D¹q¸£¦WºÙ¡CAFS ¬[ºcÀÉ·|³z¹L¦¹¦øªA¾¹¥[¥H§ó·s¡C", - IDC_HOSTNAME_PROMPT,13,88,197,18 - LTEXT "Âà´«µ{¦¡¡G½Ð¥J²Ó¾\\\Ū¥H¤U»¡©ú¡I¦¹¹ï¸Ü¤è¶ô·|¦b°õ¦æ´Á¶¡·|­«·s½Õ¾ã¤j¤p¡C¦b¯S©w±¡ªp¤U¡A¹ï¸Ü¤è¶ô·|­«·s½Õ¾ã¤j¤p¡A¦ÓÄݩ󩳺ݸs²Õ¤è¶ôªº¤@¤Á³£·|ÁôÂð_¨Ó¡C", - IDC_STATIC,7,140,211,16,NOT WS_VISIBLE -END - -IDD_CONFIG_SERVER DIALOG DISCARDABLE 0, 0, 257, 97 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¦øªA¾¹¬[ºc" -FONT 9, "·s²Ó©úÅé" -BEGIN - PUSHBUTTON "¨ú®ø",IDCANCEL,74,75,50,14 - CONTROL "Progress1",IDC_CONFIG_PROGRESS,"msctls_progress32",NOT - WS_VISIBLE,40,44,200,11 - LTEXT "§¹¦¨¦Ê¤À¤ñ¡G",IDC_PERCENT_COMPLETE_LABEL,40,60,61,8,NOT - WS_VISIBLE - LTEXT "¥Ø«eªº§@·~¡G",IDC_CURRENT_STEP_LABEL,39,24,60,8,NOT - WS_VISIBLE - LTEXT "¥Ø«e¨BÆJªº»¡©ú - ©ó°õ¦æ´Á¶¡³]©w",IDC_CURRENT_STEP,40,33, - 210,8,NOT WS_VISIBLE - LTEXT "",IDC_PERCENT_COMPLETE,101,50,49,8,NOT WS_VISIBLE - ICON "",IDC_LOGO,7,7,20,20 - LTEXT "­Y­n¶}©l¬[ºc¦¹¹q¸£¡A½Ð«ö¡u¬[ºc¡v«ö¶s¡C­Y­nÅܧó©Ò°õ¦æªº¬[ºc¨BÆJ¡A½Ð«ö¡u¤W¤@¨B¡v«ö¶s¡C", - IDC_STATUS_MSG,40,7,210,50 - PUSHBUTTON "À˵ø¤é»x(&V)",IDNEXT,130,75,50,14,NOT WS_VISIBLE | - WS_DISABLED -END - -IDD_CELLSERVDB_ERRORS DIALOG DISCARDABLE 0, 0, 187, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "CellServCB §ó·s¿ù»~" -FONT 9, "·s²Ó©úÅé" -BEGIN - LISTBOX IDC_LIST,7,26,173,127,NOT LBS_NOTIFY | LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - DEFPUSHBUTTON "½T©w",IDOK,22,162,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,75,162,50,14 - PUSHBUTTON "»¡©ú",9,130,162,50,14 - LTEXT "µLªk¦Û°Ê§ó·s¤U¦C AFS ¦øªA¾¹¤Wªº CellServDB ÀɮסG", - IDC_STATIC,12,7,165,18 -END - -IDD_SALVAGE DIALOG DISCARDABLE 0, 0, 243, 179 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "´©±Ï" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,67,93,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,127,93,50,14 - PUSHBUTTON "»¡©ú(&H)",9,187,93,50,14 - CONTROL "´©±Ï¦¹¡uÀɮצøªA¾¹¡v¤Wªº©Ò¦³¤À³Î°Ï(&S)",IDC_SERVER, - "Button",BS_AUTORADIOBUTTON,14,29,176,10 - CONTROL "´©±Ï¿ï¨ú¤À³Î°Ï¤Wªº©Ò¦³®eÅé(&P)",IDC_PARTITION,"Button", - BS_AUTORADIOBUTTON,14,42,177,10 - CONTROL "´©±Ï¿ï¨ú¤À³Î°Ï¤Wªº¯S©w®eÅé(&V)",IDC_VOLUME,"Button", - BS_AUTORADIOBUTTON,14,55,177,10 - EDITTEXT IDC_VOLUME_NAME,93,68,133,12,ES_AUTOHSCROLL | - WS_DISABLED - PUSHBUTTON "<< ¶i¶¥(&A) ",IDC_ADVANCED,7,93,50,14 - GROUPBOX "",IDC_STATIC,7,19,229,67 - LTEXT "®eÅé¦WºÙ(&N)¡G",IDC_VOLUME_NAME_LABEL,27,69,56,8, - WS_DISABLED - GROUPBOX "¶i¶¥´©±Ï¿ï¶µ",IDC_ADVANCED_FRAME,7,113,229,62 - LTEXT "¼È¦sÀɸô®|(&T)¡G",IDC_TEMP_DIR_LABEL,17,159,74,8 - EDITTEXT IDC_LOG_FILE,106,141,120,12,ES_AUTOHSCROLL - EDITTEXT IDC_NUM_PROCESSES,140,124,86,12,ES_AUTOHSCROLL - LTEXT "µ²ªG¤é»xªºÀɮצWºÙ(&L)¡G",IDC_LOG_FILE_LABEL,17,143,90, - 8 - EDITTEXT IDC_TEMP_DIR,93,157,133,12,ES_AUTOHSCROLL - CONTROL "¥­¦æ´©±Ï§@·~¡F³B²z¼Æ¥Ø(&R)¡G", - IDC_NUM_PROCESSES_CHECKBOX,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,126,125,10 - LTEXT "­Y±z´©±Ï¦øªA¾¹©Î¾ã­Ó¤À³Î°Ï¡A¦øªA¾¹·|¼È®ÉÂ÷½u¡C", - IDC_STATIC,38,1,198,17 - LTEXT "ªþµù¡G",IDC_STATIC,7,1,26,8 - LTEXT "Âà´«µ{¦¡¡G½Ð¥J²Ó¾\\\Ū¥H¤U»¡©ú¡I¦¹¹ï¸Ü¤è¶ô·|¦b°õ¦æ´Á¶¡­«·s½Õ¾ã¤j¤p¡C¦b¯S©w±¡ªp¤U¡A¹ï¸Ü¤è¶ô·|­«·s½Õ¾ã¤j¤p¡A¦ÓÄݩ󩳺ݸs²Õ¤è¶ôªº¤@¤Á³£·|ÁôÂð_¨Ó¡C", - IDC_STATIC,14,171,229,8,NOT WS_VISIBLE -END - -IDD_GET_PW DIALOG DISCARDABLE 0, 0, 197, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "AFS ¥DÅé±K½X" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_PW,48,39,142,12,ES_PASSWORD | ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,31,61,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,85,61,50,14 - PUSHBUTTON "»¡©ú",9,140,61,50,14 - LTEXT "µLªk±q pre-3.5 ¡uŲ§O¦øªA¾¹¡v¤W¨ú±o AFS ¥DÅéª÷Æ_¡C½Ð¦b¤U¤è¿é¤J AFS ¥DÅé±K½X¡C", - IDC_STATIC,7,7,183,26 - LTEXT "±K½X¡G",IDC_STATIC,7,41,35,8 -END - -IDD_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 337, 287 -STYLE DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "´©±Ï®eÅé - µ²ªG" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_LOG,7,48,323,211,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Ãö³¬(&C)",IDC_CLOSE,225,266,50,14,WS_DISABLED - PUSHBUTTON "»¡©ú",9,280,266,50,14 - LTEXT "<©ó°õ¦æ´Á¶¡³]©w>",IDC_LOG_TITLE,7,38,263,8 - ICON "",IDC_LOGO,7,7,21,20 - LTEXT "<©ó°õ¦æ´Á¶¡³]©w>",IDC_SALVAGE_STATUS,37,15,185,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 207 - END - - IDD_INTRO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 209 - END - - IDD_GET_CURRENT_CONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 191 - VERTGUIDE, 35 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_BACKUP_SERVER_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 212 - BOTTOMMARGIN, 197 - END - - IDD_CONFIG_SERVER_PAGE, DIALOG - BEGIN - LEFTMARGIN, 1 - VERTGUIDE, 11 - VERTGUIDE, 22 - VERTGUIDE, 201 - END - - IDD_INFO_PAGE2_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 6 - VERTGUIDE, 64 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE, DIALOG - BEGIN - RIGHTMARGIN, 203 - VERTGUIDE, 64 - VERTGUIDE, 203 - TOPMARGIN, 7 - END - - IDD_INFO_PAGE2_NOT_FIRST_SERVER, DIALOG - BEGIN - VERTGUIDE, 53 - VERTGUIDE, 202 - TOPMARGIN, 7 - END - - IDD_SERVICES_PAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_PARTITIONS_PAGE, DIALOG - BEGIN - VERTGUIDE, 17 - VERTGUIDE, 30 - TOPMARGIN, 7 - BOTTOMMARGIN, 258 - END - - IDD_ADMIN_INFO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 218 - VERTGUIDE, 59 - VERTGUIDE, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 150 - END - - IDD_CONFIG_SERVER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 40 - TOPMARGIN, 7 - BOTTOMMARGIN, 90 - END - - IDD_CELLSERVDB_ERRORS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 180 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 172 - HORZGUIDE, 7 - END - - IDD_GET_PW, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 330 - TOPMARGIN, 7 - BOTTOMMARGIN, 280 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include \r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Configuration application and wizard""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_GRAPHIC_16 BITMAP DISCARDABLE "status_16.bmp" -IDB_GRAPHIC_256 BITMAP DISCARDABLE "status_256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_DISABLED_DISK_DRIVE ICON DISCARDABLE "disabled.ico" -IDI_DISK_DRIVE ICON DISCARDABLE "disk_dri.ico" -IDI_APP_ICON ICON DISCARDABLE "app_icon.ico" -IDI_FOLDER ICON DISCARDABLE "folder.ico" -IDI_FILE ICON DISCARDABLE "file.ico" -IDI_DISK_DRIVE_WITH_WARNING ICON DISCARDABLE "warn_dri.ico" -IDI_AFS_DISK_DRIVE ICON DISCARDABLE "afsdrive.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEXT "¤U¤@¨B(&N) >" - IDS_FINISH "§¹¦¨(&F)" - IDS_HELP_TITLE "¤w«ö¤U»¡©ú«ö¶s" - IDS_HELP_DESC "¥Ø«eµLªk´£¨Ñ»¡©ú¡C" - IDS_CANCEL_DESC "­n¨ú®ø¡uAFS §Ö³t±Ò°ÊºëÆF¡v¶Ü¡H" - IDS_PARTITION_ALREADY_CREATED "¦¹¾÷¾¹¤W¤w¦³ AFS ¤À³Î°Ï¡C" - IDS_NOT_A_FS_SERVER "¦¹¾÷¾¹¨Ã¥¼¬[ºc¬°¡uÀɮצøªA¾¹¡v¡C®eÅé¥u¯à«Ø¥ß¦b¡uÀɮצøªA¾¹¡v¾÷¾¹¤W¡C" - IDS_ROOT_AFS_ALREADY_EXISTS "®Ú®eÅé¤w¸g¦s¦b¡C" - IDS_NO_PARTITION_EXISTS "¨S¦³¥i«Ø¥ß®Ú®eÅ骺¤À³Î°Ï¡C­n«Ø¥ß¤§«e¡A¤À³Î°Ï¥²¶·¥ý¦s¦b¡C" - IDS_ALREADY_REPLICATED "¤w¸g½Æ»s®Ú®eÅé¡C" - IDS_ROOT_AFS_DOESNT_EXIST "®Ú®eÅé¨Ã¤£¦s¦b¡C¥²¶·¥ý¦³®Ú®eÅé¡A¤~¯à¥[¥H½Æ»s¡C" - IDS_ALREADY_CONFIGURED "¦¹¾÷¾¹¤w¬[ºc¬°¡uAFS ¦øªA¾¹¡v¡C" - IDS_NOTHING_TO_CONFIGURE "±z©|¥¼¿ï¾Ü©Ò­n¬[ºcªº¶µ¥Ø¡C" - IDS_EXIT "µ²§ô" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_FS_STEP "±Ò°ÊÀɮתA°È" - IDS_CANCEL_CONFIG_MSG "¦pªG²{¦b¨ú®ø¡A¹q¸£¶È·|§¹¦¨³¡¥÷ªº AFS ¦øªA¾¹¬[ºc¡C½T©w­n¨ú®ø¡H" - IDS_WIZARD_APP_TITLE "AFS ¦øªA¾¹§Ö³t±Ò°ÊºëÆF" - IDS_CANCEL_PENDING "*** ¨ú®øÀÁ¸m - ½Ðµy«Ý... ***" - IDS_CHECK_FS_CONFIG "ÀɮצøªA¾¹Àˬd..." - IDS_CHECK_DB_CONFIG "¸ê®Æ®w¦øªA¾¹Àˬd..." - IDS_CHECK_BAK_CONFIG "³Æ¥÷¦øªA¾¹Àˬd..." - IDS_CHECK_PARTITION "AFS ¤À³Î°ÏÀˬd..." - IDS_CHECK_ROOT_AFS "®Ú®eÅéÀˬd..." - IDS_CHECK_REP "®Ú®eÅ齯»sÀˬd..." - IDS_CANCEL_GET_CONFIG "¨ú®ø¤¤...½Ðµy«Ý..." - IDS_ALREADY_A_BACKUP_SERVER "¦¹¾÷¾¹¤w¬[ºc¬°¡u³Æ¥÷¦øªA¾¹¡v¡C" - IDS_NOT_A_DB_SERVER "¦¹¾÷¾¹¨Ã¥¼¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¡C¡u³Æ¥÷¦øªA¾¹¡v¥u¯à¦b¡u¸ê®Æ®w¦øªA¾¹¡v¾÷¾¹¤W°õ¦æ¡C" - IDS_ALREADY_A_SYS_CONTROL_SERVER "¦¹¾÷¾¹¤w¬[ºc¬°¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" - IDS_ALREADY_A_SYS_CONTROL_CLIENT "¦¹¾÷¾¹¤w¬[ºc¬°¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡C" - IDS_SC_NOT_A_DB_OR_FS_SERVER - "¦¹¾÷¾¹¨Ã¥¼¬[ºc¬°¡u¸ê®Æ®w¡v©Î¡uÀɮצøªA¾¹¡v¡C¹q¸£¥²¶·¦P®É¬[ºc¬°¡u¸ê®Æ®w¡v©Î¡uÀɮצøªA¾¹¡v¾÷¾¹¡A¤~¯à¬[ºc¬°¡u¨t²Î±±¨î¡v¾÷¾¹¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE "®eÅé" - IDS_NAME_OR_ERROR "¦WºÙ¡]©Î¿ù»~°T®§¡^" - IDS_BIN_NOT_A_DB_OR_FS_SERVER - "¦¹¾÷¾¹¨Ã¥¼¬[ºc¬°¡u¸ê®Æ®w¡v©Î¡uÀɮצøªA¾¹¡v¡C¹q¸£¥²¶·¦P®É¬[ºc¬°¡u¸ê®Æ®w¡v©Î¡uÀɮצøªA¾¹¡v¾÷¾¹¡A¤~¯à¬[ºc¬°¡u¤G¶i¦ì¤À°t¡v¾÷¾¹¡C" - IDS_CHECK_SCS "¨t²Î±±¨î¦øªA¾¹Àˬd..." - IDS_CHECK_SCC "¨t²Î±±¨î¥Î¤áºÝÀˬd..." - IDS_SIZE "¤j¤p" - IDS_ERROR_SEP ", " - IDS_MUST_CONFIG_FS "¥Ñ©ó³o¬O Cell ¤¤ªº²Ä¤@­Ó¡uAFS ¦øªA¾¹¡v¡A¦]¦¹±N¨Ì¹w³]¨Ó¬[ºc¡uÀɮתA°È¡v¡C" - IDS_MUST_CONFIG_DB "¥Ñ©ó³o¬O Cell ¤¤ªº²Ä¤@­Ó¡u AFS ¦øªA¾¹¡v¡A¦]¦¹±N¨Ì¹w³]¨Ó¬[ºc¡u¸ê®Æ®wªA°È¡v¡C" - IDS_MUST_MAKE_PARTITION "¥Ñ©ó³o¬O Cell ¤¤ªº²Ä¤@­Ó¡uAFS ¦øªA¾¹¡v¡A¦]¦¹¥²¶·«Ø¥ß¤À³Î°Ï¡C" - IDS_MUST_CREATE_ROOT_AFS - "¥Ñ©ó³o¬O Cell ¤¤ªº²Ä¤@­Ó¡uAFS ¦øªA¾¹¡v¡A¦]¦¹±N¨Ì¹w³]«Ø¥ß root.afs »P root.cell ®eÅé¡C" - IDS_MUST_REPLICATE "¥Ñ©ó³o¬O Cell ¤¤ªº²Ä¤@­Ó¡uAFS ¦øªA¾¹¡v¡A¦]¦¹±N¨Ì¹w³]½Æ»s root.afs »P root.cell ®eÅé¡C" - IDS_CHECK_AFS_CLIENT "AFS ¥Î¤áºÝ¦w¸ËÀˬd..." - IDS_ERROR_HOST_NAME "µLªk¨M©w¦¹¾÷¾¹ªº¥D¹q¸£¦WºÙ¡C" - IDS_ERROR_DRIVE_COMPRESSED "¤wÀ£ÁYºÏºÐ¾÷" - IDS_ERROR_CFG_HOST_OPEN "µLªk°_©l³]©w¡u¦øªA¾¹¬[ºcµ{¦¡®w¡v¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_CLIENT_STEP "°±¤î AFS ¥Î¤áºÝ" - IDS_ERROR_LOCAL_HOST_NAME "µLªk¨M©w¦¹¾÷¾¹ªº¥»ºÝ¥D¹q¸£¦WºÙ¡C" - IDS_GET_TOKENS_ERROR "µLªk¨ú±o°O¸¹¡C½Ð½T»{±z©Ò¿é¤Jªº¨Ï¥ÎªÌ¦WºÙ»P±K½X¬O§_¥¿½T¡C" - IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED - "¥Ñ©ó©|¥¼±Ò°ÊÀɮתA°È¡A¦]¦¹µLªk¶i¦æ´©±Ï¡C½Ð±Ò°ÊÀɮתA°È¡AµM«á­«·s°õ¦æ´©±Ï¡C" - IDS_SALVAGING "¥¿¶i¦æ´©±Ï¤¤¡C½Ðµy«Ý..." - IDS_CURRENT_SALVAGE_LOG "´©±Ï¤é»x¥Ø«eªº¤º®e¡G" - IDS_FINAL_SALVAGE_LOG "´©±Ï¤é»xªº³Ì²×¤º®e¡G" - IDS_SALVAGE_COMPLETE "´©±Ï¤w§¹¦¨¡C" - IDS_CANT_GET_SALVAGE_LOG "µLªk¨ú¥X´©±Ï¤é»x¡C" - IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK "µLªk±N´©±Ï¤é»xÀx¦s¨ìºÏºÐ¤W¡C" - IDS_VALIDATION_ERROR_TEMPLATE "«ü©wªº %1 µL®Ä¡C½Ð­«·s¿é¤J %2¡C" - IDS_CELL_NAME_VALIDATION_TYPE "Cell ¦WºÙ" - IDS_SERVER_NAME_VALIDATION_TYPE "¦øªA¾¹¦WºÙ" - IDS_PASSWORD_VALIDATION_TYPE "±K½X" - IDS_UID_VALIDATION_TYPE "UID" - IDS_USER_NAME_VALIDATION_TYPE "¨Ï¥ÎªÌ¦WºÙ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_AFS_CLIENT_NOT_INSTALLED - "©|¥¼¦w¸Ë¡uAFS ¥Î¤áºÝ¡v¡C¥²¶·¥ý¦w¸Ë¡uAFS ¥Î¤áºÝ¡v¡A¤~¯à¬[ºc¡uAFS ¦øªA¾¹¡v¡C" - IDS_ERROR_AFS_CLIENT_CHECK "µLªk¨M©w¬O§_¤w¦w¸Ë¤F¡uAFS ¥Î¤áºÝ¡v¡C" - IDS_ERROR_FS_IS_NOT_NTFS "Àɮרt²Î¨Ã«D NTFS" - IDS_ERROR_DRIVE_HAS_DATA "ºÏºÐ¾÷¥]§t¸ê®Æ" - IDS_PARTITION_STEP_DESC "«Ø¥ß AFS ¤À³Î°Ï" - IDS_ERROR_DRIVE_CONTAINS_NT "ºÏºÐ¾÷¥]¬A NT ¦w¸Ë" - IDS_DB_STEP_DESC "±Ò°Ê¸ê®Æ®wªA°È" - IDS_FS_STEP_DESC "±Ò°ÊÀɮתA°È" - IDS_SCC_STEP_DESC "±Ò°Ê¨t²Î±±¨î¥Î¤áºÝ" - IDS_SCS_STEP_DESC "±Ò°Ê¨t²Î±±¨î¦øªA¾¹" - IDS_ROOT_AFS_STEP_DESC "«Ø¥ß®Ú®eÅé" - IDS_REP_STEP_DESC "½Æ»s®Ú®eÅé" - IDS_PARTITIONS_PAGE_TITLE "¤À³Î°Ï" - IDS_CONFIGURE "¬[ºc(&C)" - IDS_DB_AND_BK_STEP_DESC "±Ò°Ê¸ê®Æ®wªA°È¡]¥]¬A³Æ¥÷¦øªA¾¹¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_STEP "«Ø¥ß AFS ¤À³Î°Ï" - IDS_CONFIG_COMMON_FUNCS "¬[ºc©Ò¦³ªA°È¦@³qªº¥\¯à" - IDS_START_DB_STEP "±Ò°Ê¸ê®Æ®wªA°È" - IDS_START_SCC_STEP "±N¨t²Î±±¨î¦øªA¾¹±Ò°Ê¬°¨t²Î±±¨î¥Î¤áºÝ" - IDS_START_SCS_STEP "±N¨t²Î±±¨î¦øªA¾¹±Ò°Ê¬°¨t²Î±±¨î¦øªA¾¹" - IDS_CREATE_ROOT_AFS_STEP "«Ø¥ß root.afs ®eÅé" - IDS_REP_STEP "½Æ»s®Ú®eÅé" - IDS_START_AUTH_STEP "¨ú±o¦¹¦øªA¾¹ªº°O¸¹" - IDS_SERVICES_PAGE_TITLE "ªA°È" - IDS_CONFIG_SUCCEEDED "¤w¶¶§Q§¹¦¨¬[ºc¡C" - IDS_CONFIG_CANCELED "¤w¨ú®ø¬[ºc¡C" - IDS_CONFIG_FAILED "¬[ºc¥¢±Ñ¡C\r\n\r\n¸Ô²Óªº¤é»xÀÉ %1 ¤w¦b¦ì¸m %2 «Ø¥ß¡C" - IDS_ERROR_NO_LICENSE_NUM "§ä¤£¨ì AFS ±ÂÅv¸¹½X¡C" - IDS_VERIFY_CLIENT_INSTALL_STEP "ÅçÃÒ AFS ¥Î¤áºÝªº¦w¸Ë" - IDS_SET_SERVER_LICENSE_STEP "³]©w¦¹¦øªA¾¹ªº±ÂÅv" - IDS_DEFINE_CELL_NAME_STEP "©w¸q¥» Cell ªº¦WºÙ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DEFINE_CELL_MEMBERSHIP_STEP "±N¦¹¦øªA¾¹Åܦ¨ Cell ªº¤@­û" - IDS_START_BOS_SERVER_STEP "±Ò°Ê BOS ¦øªA¾¹" - IDS_START_AUTH_SERVER_STEP "±Ò°ÊŲ§O¦øªA¾¹" - IDS_CREATE_PRINCIPAL_AND_KEY_STEP "¬°¦¹¦øªA¾¹«Ø¥ß¥DÅé»Pª÷Æ_" - IDS_START_DB_AND_BK_STEP "±Ò°Ê¸ê®Æ®wªA°È¡]¥]¬A³Æ¥÷¦øªA¾¹¡^" - IDS_CREATE_ADMIN_PRINCIPAL_STEP "«Ø¥ß Cell ºÞ²zªÌ¥DÅé" - IDS_START_CLIENT_STEP "±Ò°Ê AFS ¥Î¤áºÝ" - IDS_SET_ROOT_ACL_STEP "¦b root.afs ®eÅé¤W³]©w ACL" - IDS_CREATE_ROOT_CELL_STEP "«Ø¥ß root.cell ®eÅé" - IDS_MOUNT_ROOT_CELL_STANDARD_STEP "¨Ï¥Î¼Ð·Ç¸Ë¸üÂI¸Ë¸ü root.cell ®eÅé" - IDS_SET_ROOT_CELL_ACL_STEP "¦b root.cell ®eÅé¤W³]©w ACL" - IDS_MOUNT_ROOT_CELL_RW_STEP "¨Ï¥ÎŪ¨ú / ¼g¤J¸Ë¸üÂI¸Ë¸ü root.cell" - IDS_ENABLE_AUTH_CHECKING_STEP "±Ò°ÊŲ§OÀˬd" - IDS_OBTAIN_ADMIN_CREDS_STEP "¨ú±oºÞ²z°O¸¹" - IDS_RESTART_SERVERS_STEP "­«·s±N¦¹¾÷¾¹¤Wªº©Ò¦³¦øªA¾¹±Ò°Ê¬°Å²§O¦øªA¾¹" - IDS_ALREADY_A_FS_SERVER "¦¹¾÷¾¹¤w¬[ºc¬°¡uÀɮצøªA¾¹¡v¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALREADY_A_DB_SERVER "¦¹¾÷¾¹¤w¬[ºc¬°¡u¸ê®Æ®w¦øªA¾¹¡v¡C" - IDS_INTRO_PAGE "²¤¶" - IDS_INFO_PAGE "Cell »P¦øªA¾¹¸ê°T" - IDS_FS_PAGE "ÀɮתA°È" - IDS_DB_PAGE "¸ê®Æ®wªA°È" - IDS_CFG_TOOL_APP_TITLE "AFS ¦øªA¾¹¬[ºc" - IDS_BK_PAGE "³Æ¥÷¦øªA¾¹" - IDS_ROOT_AFS_PAGE "®Ú AFS ®eÅé" - IDS_NAME "¦WºÙ" - IDS_REP_PAGE "½Æ»s" - IDS_SC_PAGE "¨t²Î±±¨î¦øªA¾¹" - IDS_CONFIG_PAGE "¬[ºc¨t²Î" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_PAGE "AFS ¤À³Î°Ï" - IDS_GRAPHIC_FONT "·s²Ó©úÅé, 9, B" - IDS_CURRENT_STEP "¥Ø«eªº¨BÆJ¡G" - IDS_ADD_TO_CELLSERVDB_STEP "±N¦¹¦øªA¾¹·s¼W¦Ü CellServDB" - IDS_RESTART_ALL_DB_SERVERS_STEP "­«·s±Ò°Ê Cell ¤W©Ò¦³ªº¸ê®Æ®w¦øªA¾¹" - IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE - "¤w§¹¦¨¬[ºc¡Cªþµù¡G¥²¶·§ó·s Cell ¤¤©Ò¦³ªº AFS ¥Î¤áºÝ CellServDB ÀɮסC¦pªG±zªº Cell ­n¨Ñ¨ä¥Lºô¯¸¨Ï¥Î¡A½Ð±N³Ì·sªº¡u¸ê®Æ®w¦øªA¾¹¡v²M³æ´£¨Ñµ¹¡uAFS ²£«~¤ä´©¡v¡C" - IDS_SYS_CONTROL_SERVER_ONLY_MSG "±z­n±N¦¹¾÷¾¹¬[ºc¬°¡u¨t²Î±±¨î¦øªA¾¹¡v¶Ü¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG "¤£­n¬[ºc¬°¨t²Î±±¨î¦øªA¾¹(&O)¡C" - IDS_CLIENT_CELL_WILL_CHANGE - "¦p­n¬[ºc¡uAFS ¦øªA¾¹¡v¡A¡uAFS ¥Î¤áºÝ¡v¤]¥²¶·¦b¬Û¦Pªº Cell ¤¤¬[ºc¬°¡u¦øªA¾¹¡v¡C±N·|¦Û°Ê§¹¦¨¦¹¨BÆJ¡C" - IDS_INFO_PAGE2 "ºÞ²z¤Wªº¸ê°T" - IDS_CONFIG_SUCCEEDED_FIRST_SERVER - "¤w§¹¦¨¬[ºc¡C\r\n\r\nªþµù¡G¦pªG±zªº Cell ­n¨Ñ¨ä¥Lºô¯¸¨Ï¥Î¡A½Ð±N³Ì·sªº¡u¸ê®Æ®w¦øªA¾¹¡v²M³æ´£¨Ñµ¹¡uAFS ²£«~¤ä´©¡v¡C" - IDS_CONFIG_SCS "¬[ºc¬° Cell ªº¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" - IDS_CONFIG_INTO_CELL_MSG "±N¦¹¥D¹q¸£¬[ºc¬° Cell" - IDS_VIEW_LOG "À˵ø¤é»x(&V)" - IDS_VIEW_LOG_ERROR "µLªkÀ˵ø¤é»xÀÉ" - IDS_ERROR_NO_LOG_FILE "¤é»xÀɤ£¦s¦b¡C" - IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED "§ó·s¥D¹q¸£¤Wªº CellServDB " - IDS_UPDATING_CELLSERVDB_HOST_FAILED "µLªk§ó·s¥D¹q¸£¤Wªº CellServDB " - IDS_CELL_NAME_LEN_ERROR "±z©Ò¿é¤Jªº Cell ¦WºÙ¤Óªø¡CCell ¦WºÙ¤£±o¶W¹L 64 ­Ó¦r¤¸¡C" - IDS_CONFIG_CHECK_FAILED "µLªk¨M©w¦¹¾÷¾¹¥Ø«eªº¬[ºc¡C" - IDS_YES "¬O" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO "§_" - IDS_FREE "¥i¥ÎªÅ¶¡" - IDS_TOTAL "Á`­p¤j¤p" - IDS_DRIVE2 "ºÏºÐ¾÷" - IDS_SERVICE_STATUS "ª¬ºA" - IDS_SERVICE "ªA°È" - IDS_FS_RUNNING "¥Ø«e¥¿¦b°õ¦æ¡uÀɮתA°È¡v¡C" - IDS_FS_STOPPED "¥Ø«e¨Ã¥¼°õ¦æ¡uÀɮתA°È¡v¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DB_RUNNING "¥Ø«e¥¿¦b°õ¦æ¡u¸ê®Æ®wªA°È¡v¡C" - IDS_DB_STOPPED "¥Ø«e¨Ã¥¼°õ¦æ¡u¸ê®Æ®wªA°È¡v¡C" - IDS_BK_RUNNING "¥Ø«e¥¿¦b°õ¦æ¡u³Æ¥÷ªA°È¡v¡C" - IDS_BK_STOPPED "¥Ø«e¨Ã¥¼°õ¦æ¡u³Æ¥÷ªA°È¡v¡C" - IDS_SCS_STOPPED "¥Ø«e¨Ã¥¼°õ¦æ¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" - IDS_SCC_STOPPED "¥Ø«e¨Ã¥¼°õ¦æ¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡C" - IDS_FS_HOW_TO_RUN "¦p­n±Ò°Ê¡uÀɮתA°È¡v¡A½Ð¤Ä¿ï¤W­±ªº¤è¶ô¡C" - IDS_FS_HOW_TO_STOP "¦p­n°±¤î¡uÀɮתA°È¡v¡A½Ð¨ú®ø¤W­±ªº¤è¶ô¤Ä¿ï¡C" - IDS_DB_HOW_TO_RUN "¦p­n±Ò°Ê¡u¸ê®Æ®wªA°È¡v¡A½Ð¤Ä¿ï¤W­±ªº¤è¶ô¡C" - IDS_DB_HOW_TO_STOP "¦p­n°±¤î¡u¸ê®Æ®wªA°È¡v¡A½Ð¨ú®ø¤W­±ªº¤è¶ô¤Ä¿ï¡C" - IDS_BK_HOW_TO_RUN "¦p­n±Ò°Ê¡u³Æ¥÷ªA°È¡v¡A½Ð¤Ä¿ï¤W­±ªº¤è¶ô¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BK_HOW_TO_STOP "¦p­n°±¤î¡u³Æ¥÷ªA°È¡v¡A½Ð¨ú®ø¤W­±ªº¤è¶ô¤Ä¿ï¡C" - IDS_SCS_HOW_TO_RUN "¦p­n±Ò°Ê¡u¨t²Î±±¨î¦øªA¾¹¡v¡A½Ð¤Ä¿ï¤W­±ªº¤è¶ô¡C" - IDS_SCS_HOW_TO_STOP "¦p­n°±¤î¡u¨t²Î±±¨î¦øªA¾¹¡v¡A½Ð¨ú®ø¤W­±ªº¤è¶ô¤Ä¿ï¡C" - IDS_DB_PARTIAL_CONFIG "¤w³¡¥÷¬[ºc¡u¸ê®Æ®wªA°È¡v¡C" - IDS_DB_DETAILS "«ö¤@¤U¡u©ú²Ó¡v«ö¶s¡A¬d¾\¸Ô²Ó¸ê°T¡C" - IDS_BK_DISABLED "¤w°±¥Î¡u³Æ¥÷ªA°È¡v¡C" - IDS_BK_ENABLE "¦p­n±Ò°Ê¡u³Æ¥÷ªA°È¡v¡A±z¥²¶·°õ¦æ¡u¸ê®Æ®wªA°È¡v¡C" - IDS_SC_DISABLED "¤w°±¥Î¦¹¦øªA¾¹¡C" - IDS_SC_ENABLE "¦p­n±Ò°Ê¦¹¦øªA¾¹¡A±z¥²¶·°õ¦æ¡uÀɮתA°È¡v©Î¡u¸ê®Æ®wªA°È¡v¡C" - IDS_FS_WILL_RUN "±N·|±Ò°Ê¡uÀɮתA°È¡v¡C" - IDS_FS_WILL_STOP "±N·|°±¤î¡uÀɮתA°È¡v¡C" - IDS_DB_WILL_RUN "±N·|±Ò°Ê¡u¸ê®Æ®wªA°È¡v¡C" - IDS_DB_WILL_STOP "±N·|°±¤î¡u¸ê®Æ®wªA°È¡v¡C" - IDS_BK_WILL_RUN "±N·|±Ò°Ê¡u³Æ¥÷ªA°È¡v¡C" - IDS_BK_WILL_STOP "±N·|°±¤î¡u³Æ¥÷ªA°È¡v¡C" - IDS_SCS_WILL_RUN "±N·|±Ò°Ê¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SCS_WILL_STOP "±N·|°±¤î¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" - IDS_ERROR_DRIVE_ALREADY_HAS_AFS "ºÏºÐ¾÷¤w¬O AFS ¤À³Î°Ï" - IDS_VOLUME_HAS_NO_NAME "<®eÅé¨S¦³¦WºÙ>" - IDS_PARTITION_CREATED "¤w¶¶§Q«Ø¥ß·sªº¡uAFS ¤À³Î°Ï¡v¡C" - IDS_PARTITION_EXISTS "±z©Ò¿é¤Jªº¤À³Î°Ï¦WºÙ¤w¦³¨ä¥L¤À³Î°Ï¦b¨Ï¥Î¡C" - IDS_SCS_RUNNING "¥Ø«e¥¿¦b°õ¦æ¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" - IDS_WARNING_DRIVE_HAS_RECYCLE_BIN "¦¹ºÏºÐ¾÷¥u¥]§t¡u¸ê·½¦^¦¬µ©¡v¡C" - IDS_SCC_WILL_RUN "±N·|±Ò°Ê¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡C" - IDS_SCC_WILL_STOP "±N·|°±¤î¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡C" - IDS_SCC_RUNNING "¥Ø«e¥¿¦b°õ¦æ¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡C" - IDS_SCC_HOW_TO_RUN "¦p­n±Ò°Ê¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡A½Ð¤Ä¿ï¤W­±ªº¤è¶ô¡C" - IDS_SCC_HOW_TO_STOP "¦p­n°±¤î¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡A½Ð¨ú®ø¤Ä¿ï¤W­±ªº¤è¶ô¡C" - IDS_SCS_ENABLE "¦p­n±Ò°Ê¦¹¦øªA¾¹¡A±z¥²¶·°±¤î°õ¦æ¡u¨t²Î±±¨î¥Î¤áºÝ¡v¡C" - IDS_SCC_ENABLE "¦p­n±Ò°Ê¦¹¦øªA¾¹¡A±z¥²¶·°±¤î°õ¦æ¡u¨t²Î±±¨î¦øªA¾¹¡v¡C" - IDS_UNCONFIG_DB_STEP "¨ú®ø¬[ºc¸ê®Æ®wªA°È" - IDS_UNCONFIG_DB_STEP_DESC "¨ú®ø¬[ºc¸ê®Æ®wªA°È" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UNCONFIG_DB_AND_BK_STEP "¨ú®ø¬[ºc¸ê®Æ®wªA°È¡]»P³Æ¥÷¦øªA¾¹¡^" - IDS_UNCONFIG_DB_AND_BK_STEP_DESC "¨ú®ø¬[ºc¸ê®Æ®wªA°È¡]»P³Æ¥÷¦øªA¾¹¡^" - IDS_UNCONFIG_BK_STEP "¨ú®ø¬[ºc³Æ¥÷¦øªA¾¹" - IDS_UNCONFIG_BK_STEP_DESC "¨ú®ø¬[ºc³Æ¥÷¦øªA¾¹" - IDS_UNCONFIG_FS_STEP "¨ú®ø¬[ºcÀɮתA°È" - IDS_UNCONFIG_FS_STEP_DESC "¨ú®ø¬[ºcÀɮתA°È" - IDS_UNCONFIG_SCS_STEP "¨ú®ø¬[ºc¨t²Î±±¨î¦øªA¾¹" - IDS_UNCONFIG_SCS_STEP_DESC "¨ú®ø¬[ºc¨t²Î±±¨î¦øªA¾¹" - IDS_UNCONFIG_SCC_STEP "¨ú®ø¬[ºc¨t²Î±±¨î¥Î¤áºÝ" - IDS_UNCONFIG_SCC_STEP_DESC "¨ú®ø¬[ºc¨t²Î±±¨î¥Î¤áºÝ" - IDS_INVALIDATE_CONFIG_INFO_STEP "¨Ï¦¹¾÷¾¹ªº¬[ºc¸ê°T¥¢®Ä" - IDS_CLOSE "Ãö³¬(&C)" - IDS_CELLSERVDB_UPDATE_ERR_MSG - "®×µLªk¦b¤U¦C AFS ¦øªA¾¹¤W§ó·s CellServDB ÀÉ¡C³o¨Ã«DÄY­«ªº¿ù»~¡C\r\n" - IDS_DELETE_PARTITION_PROMPT "¯uªº­n§R°£¤À³Î°Ï '%1'¡H" - IDS_INVALIDATE_CFG_INFO "¥Ø«e¦¹¹q¸£¨Ã¨S¦³¥¿¦b°õ¦æªº AFS ¦øªA¾¹³B²z¡C±z­n±N¬[ºc¸ê°T±q¦¹¾÷¾¹¤W²¾°£¶Ü¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CELL_IS_GONE_MUST_EXIT - "Cell ¤w¸g¤£¦s¦b¡C¡uAFS ¬[ºc¡vÀ³¥Îµ{¦¡¥u¯à¥Î¨Ó¬[ºc¤w¬[ºc¦b AFS Cell ¤§¦øªA¾¹¾÷¾¹¡C¡uAFS ¬[ºcºëÆF¡v¥i¥Î¨Ó±Ò°Ê·sªº Cell¡C" - IDS_CFG_MAN_CANT_CONTINUE - "¡uAFS ¬[ºc¡vÀ³¥Îµ{¦¡¥²¶·¥ß§Y²×¤î¡A¦]¬°¸Óµ{¦¡¥u¯à¦b¤w¬[ºc¬° AFS¦øªA¾¹¤§¾÷¾¹¤W°õ¦æ¡C¦p­n±N¦¹¾÷¾¹¦A¦¸¬[ºc¬° AFS ¦øªA¾¹¡A½Ð°õ¦æ¡uAFS ¬[ºcºëÆF¡v¡C" - IDS_CONFIG_INFO_INVALIDATED - "¦¹¾÷¾¹¤w¤£¦A¬[ºc¬°¡uAFS ¦øªA¾¹¡v¡C¡uAFS ¬[ºc¡vÀ³¥Îµ{¦¡¥u¯à¥Î¨Ó¬[ºc¡uAFS ¦øªA¾¹¡v¾÷¾¹¡C¡uAFS ¬[ºcºëÆF¡v¥i±N¦¹¾÷¾¹¦A¦¸¬[ºc¬°¡uAFS ¦øªA¾¹¡v¡C" - IDS_GET_TOKENS_FAILED "µLªk¨ú±o«ü©w Cell ªº°O¸¹¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_START_BK_STEP "±Ò°Ê³Æ¥÷¦øªA¾¹" - IDS_BK_STEP_DESC "±Ò°Ê³Æ¥÷¦øªA¾¹" - IDS_CONFIG_ERROR "µo¥Í¤F¬[ºc¿ù»~" - IDS_CREATE_PARTITION_ERROR "µLªk«Ø¥ß¤À³Î°Ï" - IDS_REMOVE_PARTITION_ERROR "µLªk²¾°£¤À³Î°Ï" - IDS_READ_PARTITIONS_ERROR "µLªkŪ¨ú¤À³Î°Ïªí®æ" - IDS_CELLSERVDB_UPDATE_PROBLEM - "\r\n ¹L¦­²×¤î CellServDB §ó·s³B²z¡C³¡¥÷¦øªA¾¹¥i¯à©|¥¼§ó·s¡C" - IDS_GET_PARTITION_LIST_ERROR "µLªk¨M©w¦¹¦øªA¾¹ªº¤À³Î°Ï" - IDS_EXPORTED "¶×¥X" - IDS_CANT_DELETE_EXPORTED_PARTITION - "¶×¥Xªº¤À³Î°Ï¦b¡uÀɮתA°È¡v°õ¦æ´Á¶¡µLªk²¾°£¡C²¾°£¦¹¤À³Î°Ï¤§«e¡A±z¥²¶·°±¤î¡uÀɮתA°È¡v¡C" - IDS_CHECK_CONFIG_INFO "Àˬd¦³®Äªº¬[ºc¸ê°T..." - IDS_ERROR_CFG_HOST_CLOSE "µLªkÃö³¬¡u¦øªA¾¹¬[ºcµ{¦¡®w¡v¡C" - IDS_FAILED_OPEN_CELL "µLªk¶}±Ò Cell¡C" - IDS_FAILED_OPEN_NULL_CELL "µLªk¶}±Ò NULL Cell ±±ÂI" - IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "¦pªG®Ú®eÅ餣¦s¦b¡A±z­n¥[¥H«Ø¥ß¶Ü¡H" - IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT - "¦pªG®Ú®eÅ饼½Æ»s¡A±z­n¥[¥H½Æ»s¶Ü¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TRANSARC_AFS_SERVER "AFS ¦øªA¾¹" - IDS_CANT_INIT_ADMIN_LIBS "µLªk°õ¦æ¦¹À³¥Îµ{¦¡¡Gµ{¦¡®w°_©l³]©w¤w¥¢±Ñ¡C" - IDS_CANT_OPEN_LOG_FILE "µLªk¶}±Ò¤é»xÀÉ¡C" - IDS_NEED_CLIENT_INFO "¥Ñ©ó¦¹¹q¸£¨Ã¥¼¬[ºc¡uAFS ¥Î¤áºÝ¡v¡A¦]¦¹µLªk°õ¦æ¡uAFS ¬[ºc¡vÀ³¥Îµ{¦¡¡C¦b³oºØ±¡§Î¤U¡A¥i¥H¨Ï¥Î¡uAFS ¬[ºcºëÆF¡v¡C­n°õ¦æ¡uAFS ¬[ºcºëÆF¡v¶Ü¡H" - IDS_NEED_SERVER_INFO "¦¹¹q¸£¥¼¬[ºc¬°¡uAFS ¦øªA¾¹¡v¡C¦p­n±N¦¹¹q¸£¬[ºc¬°¡uAFS ¦øªA¾¹¡v¡A­º¥ý¥²¶·¨Ï¥Î¡uAFS ¬[ºcºëÆF¡v¡AµM«á¤~¯à¨Ï¥Î¡uAFS ¬[ºc¡vÀ³¥Îµ{¦¡¡C­n¥ý°õ¦æ¡uAFS ¬[ºcºëÆF¡v¥H¬[ºc¦¹¹q¸£¶Ü¡H" - IDS_ADVANCED_OPEN "<< ¶i¶¥(&A)" - IDS_ADVANCED_CLOSED "¶i¶¥(&A) >>" - IDS_BOS_OPEN_FAILED "µLªk³s±µ¦øªA¾¹¡]bos ¶}±Ò¥¢±Ñ¡^¡C" - IDS_SALVAGE_ERROR "´©±Ï§@·~¥¢±Ñ¡C" - IDS_INVALID_NUM_SALVAGE_PROCESSSES - "©Ò«ü©wªº´©±Ï³B²z¼Æ¥ØµL®Ä¡C´©±Ï³B²zªº¼Æ¥Ø¥²¶·¤¶©ó 1 ¨ì 32 ¤§¶¡¡C" - IDS_WRONG_CELL "±z¦b«e¶µ¨BÆJ«ü©w¤F¨ú±o¬[ºc¸ê°Tªº¦øªA¾¹¡C©Ò«ü©wªº¦øªA¾¹¨Ã¤£ÄÝ©ó±z­n¥[¤Jªº Cell ¤¤¡I" - IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE - "µLªk§ó·s¤@¨Ç¦b Cell ¤¤¦øªA¾¹¤Wªº CellServDB ÀÉ¡C¦p­nÀ˵ø¤w§ó·s»P¥¼§ó·sªº¦øªA¾¹²M³æ¡A½ÐÀ˵øÀx¦s¦bÀɮפWªº¬[ºc¤é»x" - IDS_GET_CREDENTIALS_STEP "¨ú±oºÞ²z°O¸¹" - IDS_MUST_ENTER_SCS_NAME "®i¶}¬[ºc¤§«e¡A¥²¶·¥ý¿é¤J¡u¨t²Î±±¨î¾÷¾¹¡v¦WºÙ¡C" - IDS_NOT_SAME_CELL "¡uAFS ¥Î¤áºÝ¡v¬[ºc¦b¡uAFS ¦øªA¾¹¡v¥H¥~ªº¤£¦P Cell ¤¤¡C¦b±z¬[ºc¡u AFS ¦øªA¾¹¡v¤§«e¡A±z¥²¶·¥ý±N¡uAFS ¥Î¤áºÝ¡v­«·s¬[ºc¦b¡u¦øªA¾¹¡vªº Cell ¤¤¡C" - IDS_LAST_DB_SERVER "¦¹¾÷¾¹¥¿¦b°õ¦æ Cell ¤W³Ì«áªº¸ê®Æ®w¦øªA¾¹¡C­Y±zÄ~Äò¨Ã¨ú®ø¦b¦¹¾÷¾¹¤Wªº¸ê®Æ®wªA°È¬[ºc¡ACell ±N¤£¦A¦s¦b¡A¦Ó¥B¨ä¥L¦b¦¹¾÷¾¹¤W°õ¦æªº AFS ªA°È±N¨ú®ø¬[ºc¡C±z½T©w­nÄ~Äò¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BAD_PW "AFS ¥DÅ骺±K½XµL®Ä¡C" - IDS_ERROR_CLIENT_VERSION - "¦¹¹q¸£¤W¡uAFS ¥Î¤áºÝ¡vªºª©¥»»P¡uAFS ¦øªA¾¹¡v¤£¬Û®e¡C¡uAFS ¦øªA¾¹¡v¦Ü¤Ö»Ý­n¡uAFS ¥Î¤áºÝ¡v3.5 ¥H¤Wªºª©¥»¡C" - IDS_CANT_MAP_ROOT_AFS "¦p­n¦b®Ú®eÅé¤W³]©w ACL¡AºÏºÐ¾÷¥N¸¹¥²¶·¹ïÀ³¦Ü AFS ¤W¡C¥Ø«e¨Ã¨S¦³¥i¥ÎªººÏºÐ¾÷¥N¸¹¡C½ÐÄÀ©ñ¤@­ÓºÏºÐ¾÷¥N¸¹¨Ã«ö¤@¤U¡u½T©w¡v¡C" - IDS_NO_MSG_STEP " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PARTITION_NAME_VALIDATION_TYPE "¤À³Î°Ï¦WºÙ" - IDS_VOLUME_NAME_VALIDATION_TYPE "®eÅé¦WºÙ" - IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE "´©±Ï³B²zªº¼Æ¥Ø" - IDS_PATH_NAME_VALIDATION_TYPE "¸ô®|¦WºÙ" - IDS_FILE_NAME_VALIDATION_TYPE "ÀɦW" - IDS_GENERIC_VALIDATION_TYPE "­È" -END - -#endif // Chinese (Taiwan) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrcfg/logfile.cpp b/src/WINNT/afssvrcfg/logfile.cpp deleted file mode 100644 index ae38ab6b7..000000000 --- a/src/WINNT/afssvrcfg/logfile.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -extern "C" { -#include -} - -#include -#include -#include "logfile.h" -#include -#include - - -/* - * MEMBER FUNCTIONS _________________________________________________________ - * - */ -LOGFILE::LOGFILE() -{ - m_fp = 0; -} - -LOGFILE::~LOGFILE() -{ - if (m_fp) - Close(); -} - -BOOL LOGFILE::Open(const char *pszLogFilePath, - LOGFILE_OPEN_MODE eOpenMode, - LOGFILE_TIMESTAMP_MODE eTimeStampMode) -{ - char *pszOpenMode; - - m_eTimeStampMode = eTimeStampMode; - - if (eOpenMode == OM_OVERWRITE) - pszOpenMode = "w"; - else - pszOpenMode = "a+"; - - strcpy(m_szPath, pszLogFilePath); - - m_fp = fopen(pszLogFilePath, pszOpenMode); - if (m_fp) { - if (m_eTimeStampMode != TSM_NEVER) - WriteTimeStamp(); - fprintf(m_fp, "Log file open.\r\n"); - - return TRUE; - } - - return FALSE; -} - -BOOL LOGFILE::Close() -{ - int nResult = 0; - - if (m_fp) { - if (m_eTimeStampMode != TSM_NEVER) - WriteTimeStamp(); - fprintf(m_fp, "Closing log file.\r\n"); - nResult = fclose(m_fp); - if (nResult == 0) - m_fp = 0; - } - - return (nResult == 0); -} - -BOOL LOGFILE::Write(const char *pszEntry, ...) -{ - static BOOL bTimestampNextLine = TRUE; - - if (!m_fp) - return FALSE; - - if (bTimestampNextLine && (m_eTimeStampMode == TSM_EACH_ENTRY)) - WriteTimeStamp(); - - va_list args; - - va_start(args, pszEntry); - - int nWritten = vfprintf(m_fp, pszEntry, args); - - va_end(args); - - fflush(m_fp); - - // Don't timestamp next line unless current line ended with a newline - bTimestampNextLine = (pszEntry[strlen(pszEntry) - 1] == '\n'); - - return (nWritten > 0); -} - -BOOL LOGFILE::WriteError(const char *pszMsg, DWORD nErrorCode, ...) -{ - if (!m_fp) - return FALSE; - - if (m_eTimeStampMode == TSM_EACH_ENTRY) - WriteTimeStamp(); - - va_list args; - - va_start(args, nErrorCode); - - int nWritten = vfprintf(m_fp, pszMsg, args); - va_end(args); - - if (nWritten < 1) - return FALSE; - - afs_status_t nStatus; - const char *pszErrorText; - - int nResult = util_AdminErrorCodeTranslate(nErrorCode, TaLocale_GetLanguage(), &pszErrorText, &nStatus); - if (nResult) - fprintf(m_fp, ": (0x%lx), %s.\r\n", nErrorCode, pszErrorText); - else - fprintf(m_fp, ": (0x%lx).\r\n", nErrorCode); - - fflush(m_fp); - - return (nWritten > 0); -} - -BOOL LOGFILE::WriteTimeStamp() -{ - if (!m_fp) - return FALSE; - - char szTime[64], szDate[64]; - - _strtime(szTime); - _strdate(szDate); - - fprintf(m_fp, "%s %s: ", szTime, szDate); - - return TRUE; -} - -BOOL LOGFILE::WriteBoolResult(BOOL bResult) -{ - if (!m_fp) - return FALSE; - - fprintf(m_fp, "%s.\r\n", bResult ? "Yes" : "No"); - - fflush(m_fp); - - return TRUE; -} - -BOOL LOGFILE::WriteMultistring(const char *pszMultiStr) -{ - if (!m_fp) - return FALSE; - - for (const char *p = pszMultiStr; *p; p += strlen(p)) - Write("%s\r\n", p); - - return TRUE; -} - diff --git a/src/WINNT/afssvrcfg/logfile.h b/src/WINNT/afssvrcfg/logfile.h deleted file mode 100644 index 3bba05a2e..000000000 --- a/src/WINNT/afssvrcfg/logfile.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -enum LOGFILE_TIMESTAMP_MODE { TSM_NEVER, TSM_AT_OPEN_AND_CLOSE, TSM_EACH_ENTRY }; -enum LOGFILE_OPEN_MODE { OM_OVERWRITE, OM_APPEND }; - - -class LOGFILE -{ - FILE *m_fp; - - char m_szPath[MAX_PATH]; - - LOGFILE_TIMESTAMP_MODE m_eTimeStampMode; - -public: - LOGFILE(); - ~LOGFILE(); - - BOOL Open( const char *pszLogFilePath, - LOGFILE_OPEN_MODE eOpenMode = OM_OVERWRITE, - LOGFILE_TIMESTAMP_MODE eTimeStampMode = TSM_EACH_ENTRY - ); - BOOL Close(); - - char *GetPath() { return m_szPath; } - - BOOL Write(const char *pszMsg, ...); - - BOOL WriteError(const char *pszMsg, DWORD nErrorCode, ...); - - BOOL WriteMultistring(const char *pszMultiStr); - - BOOL WriteTimeStamp(); - - BOOL WriteBoolResult(BOOL bResult); -}; - diff --git a/src/WINNT/afssvrcfg/partition_page.cpp b/src/WINNT/afssvrcfg/partition_page.cpp deleted file mode 100644 index eebff5abc..000000000 --- a/src/WINNT/afssvrcfg/partition_page.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include -#include "resource.h" -#include "volume_utils.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; -static HWND hDriveList = 0; -static BOOL bCantCreate = FALSE; -static HLISTITEM hSelectedItem = 0; - -// The idea for this var is that if the user clicks on a drive and the vice name -// hasn't been set by the user, then we will set the vice name to the drive letter -// selected. However, if the user sets the vice name, then clicking on a drive -// letter doesn't change the vice name. This var tells us whether it is ok to set -// the vice name or not. -static BOOL bAutoSetPartitionName = TRUE; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void EnableDriveListCtrls(BOOL bEnable = TRUE); -static BOOL SavePartitionInfo(BOOL bValidate); -static void ShowPartitionInfo(); -static void CheckEnableButtons(); -static void OnListSelection(LPFLN_ITEMSELECT_PARAMS pItemParms); -static void CantMakePartition(UINT nMsgID); -static void MustMakePartition(); -static void OnPartitionName(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -/* - * WndProc for our subclass of the wizard's dialog. We do this to detect - * the WM_ACTIVATEAPP message, which we use as a trigger to refresh the - * partition info that we display. - */ -static BOOL CALLBACK WizardDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if ((g_pWiz->GetState() == sidSTEP_EIGHT) && (uMsg == WM_ACTIVATEAPP) && wParam) { - UpdateDriveList(); - ShowPartitionInfo(); - } - - return CallWindowProc((WNDPROC)Subclass_FindNextHook(hwndDlg, WizardDlgProc), hwndDlg, uMsg, wParam, lParam); -} - -BOOL CALLBACK PartitionPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - CheckEnableButtons(); - break; - - case WM_DESTROY_SHEET: - Subclass_RemoveHook(g_pWiz->GetWindow(), WizardDlgProc); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - if (SavePartitionInfo(TRUE)) - g_pWiz->SetState(sidSTEP_NINE); - break; - - case IDBACK: - if (SavePartitionInfo(FALSE)) - g_pWiz->SetState(sidSTEP_SEVEN); - break; - - case IDC_CREATE_PARTITION: - g_CfgData.configPartition = CS_CONFIGURE; - CheckEnableButtons(); - EnableDriveListCtrls(); - break; - - case IDC_DONT_CREATE_PARTITION: - g_CfgData.configPartition = CS_DONT_CONFIGURE; - CheckEnableButtons(); - EnableDriveListCtrls(FALSE); - break; - - case IDC_PARTITION_NAME: - if (HIWORD(wp) == EN_CHANGE) { - OnPartitionName(); - SetFocus((HWND)lp); - } - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) { - case FLN_ITEMSELECT: OnListSelection((LPFLN_ITEMSELECT_PARAMS)lp); - } - break; - - } - - return FALSE; -} - - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - HOURGLASS hg; - - hDlg = hwndDlg; - - hDriveList = GetDlgItem(hDlg, IDC_DRIVE_LIST); - - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.configPartition == CS_ALREADY_CONFIGURED) { - CantMakePartition(IDS_PARTITION_ALREADY_CREATED); - return; - } - - // Should this step be disabled? Yes, if this machine is - // not configured as a file server. - if (!ConfiguredOrConfiguring(g_CfgData.configFS)) { - CantMakePartition(IDS_NOT_A_FS_SERVER); - EnableStep(g_CfgData.configPartition, FALSE); - return; - } - - // Do this in case it was disabled the last time - EnableStep(g_CfgData.configPartition); - - switch (g_CfgData.configPartition) { - case CS_DONT_CONFIGURE: - SetCheck(hDlg, IDC_DONT_CREATE_PARTITION); - EnableDriveListCtrls(FALSE); - break; - - case CS_CONFIGURE: - default: - SetCheck(hDlg, IDC_CREATE_PARTITION); - EnableDriveListCtrls(); - break; - } - - Subclass_AddHook(g_pWiz->GetWindow(), WizardDlgProc); - - SetupDriveList(hDriveList); - UpdateDriveList(); - ShowPartitionInfo(); - - if (g_CfgData.bFirstServer) - MustMakePartition(); -} - -static void OnPartitionName() -{ - TCHAR szBuf[MAX_PARTITION_NAME_LEN]; - GetWindowText(GetDlgItem(hDlg, IDC_PARTITION_NAME), szBuf, MAX_PARTITION_NAME_LEN); - - bAutoSetPartitionName = szBuf[0] == 0; - - CheckEnableButtons(); -} - -static void OnListSelection(LPFLN_ITEMSELECT_PARAMS pItemParms) -{ - ASSERT(pItemParms); - - hSelectedItem = 0; - - if (pItemParms->hItem) { - LPARAM lParam = FastList_GetItemParam(hDriveList, pItemParms->hItem); - if (lParam == 0) { - hSelectedItem = pItemParms->hItem; - - if (bAutoSetPartitionName) { - LPCTSTR pDrive = FastList_GetItemText(hDriveList, hSelectedItem, 0); - g_CfgData.szPartitionName[0] = _totlower(pDrive[0]); - g_CfgData.szPartitionName[1] = 0; - SetWndText(hDlg, IDC_PARTITION_NAME, g_CfgData.szPartitionName); - - // Must set this to true because the call to SetWndText will cause - // a call to OnPartitionName, which would incorrectly think that the - // Partition Name had been set by the user rather than by us, thus - // setting bAutoSetPartitionName to false. - bAutoSetPartitionName = TRUE; - } - } - } - - CheckEnableButtons(); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CantMakePartition(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - ShowWnd(hDlg, IDC_CREATE_PARTITION, FALSE); - ShowWnd(hDlg, IDC_DONT_CREATE_PARTITION, FALSE); - ShowWnd(hDlg, IDC_ASK_CREATE_PARTITION, FALSE); - ShowWnd(hDlg, IDC_SELECT_DRIVE, FALSE); - ShowWnd(hDlg, IDC_DRIVE_LIST, FALSE); - ShowWnd(hDlg, IDC_NAME_LABEL, FALSE); - ShowWnd(hDlg, IDC_PARTITION_NAME, FALSE); - - ShowWnd(hDlg, IDC_PARTITION_COVER); - HWND hMsg = GetDlgItem(hDlg, IDC_PARTITION_MSG); - ShowWindow(hMsg, SW_SHOW); - SetWindowText(hMsg, szMsg); - - bCantCreate = TRUE; -} - -static void MustMakePartition() -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, IDS_MUST_MAKE_PARTITION); - - ShowWnd(hDlg, IDC_CREATE_PARTITION, FALSE); - ShowWnd(hDlg, IDC_DONT_CREATE_PARTITION, FALSE); - - SetWndText(hDlg, IDC_ASK_CREATE_PARTITION, szMsg); -} - -static void EnableDriveListCtrls(BOOL bEnable) -{ - EnableWnd(hDlg, IDC_SELECT_DRIVE, bEnable); - EnableWnd(hDlg, IDC_DRIVE_LIST, bEnable); - EnableWnd(hDlg, IDC_NAME_LABEL, bEnable); - EnableWnd(hDlg, IDC_PARTITION_NAME, bEnable); -} - -static BOOL SavePartitionInfo(BOOL bValidate) -{ - if (bCantCreate) - return TRUE; - - if (GetButtonState(hDlg, IDC_CREATE_PARTITION) != BST_CHECKED) { - g_CfgData.szPartitionName[0] = 0; - bAutoSetPartitionName = TRUE; - } else { - GetWindowText(GetDlgItem(hDlg, IDC_PARTITION_NAME), g_CfgData.szPartitionName, MAX_PARTITION_NAME_LEN); - if (bValidate && !Validation_IsValid(g_CfgData.szPartitionName, VALID_AFS_PARTITION_NAME)) - return FALSE; - } - - if (hSelectedItem == 0) - g_CfgData.chDeviceName = 0; - else { - LPCTSTR pDrive = FastList_GetItemText(hDriveList, hSelectedItem, 0); - g_CfgData.chDeviceName = pDrive[0]; - } - - return TRUE; -} - -static void ShowPartitionInfo() -{ - // The SetWndText call below will mess up our bAutoSetPartitionName variable. - // It will trigger the change event on the partition name field causing our - // OnPartitionName function to get called, and making it look to us like the - // user set the partition name. Therefore, we will save the current value, - // make the call, then restore the value. - BOOL bAutoSet = bAutoSetPartitionName; - SetWndText(hDlg, IDC_PARTITION_NAME, g_CfgData.szPartitionName); - bAutoSetPartitionName = bAutoSet; - - if (g_CfgData.chDeviceName != 0) { - HLISTITEM hItem = NULL; - while ((hItem = FastList_FindNext(hDriveList, hItem)) != NULL) { - LPCTSTR pDrive = FastList_GetItemText(hDriveList, hItem, 0); - if (pDrive[0] == g_CfgData.chDeviceName) { - FastList_SelectItem(hDriveList, hItem, TRUE); - hSelectedItem = hItem; - break; - } - } - } -} - -static void CheckEnableButtons() -{ - if (IsButtonChecked(hDlg, IDC_CREATE_PARTITION)) { - TCHAR szBuf[MAX_PARTITION_NAME_LEN]; - - GetWindowText(GetDlgItem(hDlg, IDC_PARTITION_NAME), szBuf, MAX_PARTITION_NAME_LEN); - if ((hSelectedItem == 0) || (szBuf[0] == 0)) { - g_pWiz->EnableButtons(BACK_BUTTON); - g_pWiz->SetDefaultControl(IDBACK); - return; - } - } - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); -} - diff --git a/src/WINNT/afssvrcfg/partition_utils.cpp b/src/WINNT/afssvrcfg/partition_utils.cpp deleted file mode 100644 index 30076d0f2..000000000 --- a/src/WINNT/afssvrcfg/partition_utils.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "partition_utils.h" -#include - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static cfg_partitionEntry_t *pTable = 0; // Partition table -static int cPartitions = 0; // Count of partitions - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -cfg_partitionEntry_t *GetPartitionTable(int &nNumPartitions) -{ - nNumPartitions = cPartitions; - - return pTable; -} - -int GetNumPartitions() -{ - return cPartitions; -} - -int ReadPartitionTable(afs_status_t *pStatus) -{ - ASSERT(g_hServer); - - FreePartitionTable(); - - cPartitions = 0; - pTable = 0; - - int nResult = cfg_HostPartitionTableEnumerate(g_hServer, &pTable, &cPartitions, pStatus); - - return nResult; -} - -BOOL IsAnAfsPartition(LPCTSTR pszRootDir) -{ - for (int ii = 0; ii < cPartitions; ii++) { - - TCHAR ch1 = pTable[ii].deviceName[0]; - if (_istupper(ch1)) - ch1 = _totlower(ch1); - - TCHAR ch2 = pszRootDir[0]; - if (_istupper(ch2)) - ch2 = _totlower(ch2); - - if (ch1 == ch2) - return TRUE; - } - - return FALSE; -} - -BOOL DoesPartitionExist(LPCTSTR pszName) -{ - for (int ii = 0; ii < cPartitions; ii++) { - if (lstrcmp(A2S(pTable[ii].partitionName), pszName) == 0) - return TRUE; - } - - return FALSE; -} - -void FreePartitionTable() -{ - if (pTable) { - afs_status_t nStatus; - cfg_PartitionListDeallocate(pTable, &nStatus); - } - - pTable = 0; - cPartitions = 0; -} - diff --git a/src/WINNT/afssvrcfg/partition_utils.h b/src/WINNT/afssvrcfg/partition_utils.h deleted file mode 100644 index 6d2022452..000000000 --- a/src/WINNT/afssvrcfg/partition_utils.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _PARTITION_UTILS_H_ -#define _PARTITION_UTILS_H_ - -int ReadPartitionTable(afs_status_t *pStatus); -cfg_partitionEntry_t *GetPartitionTable(int &nNumPartitions); -int GetNumPartitions(); -BOOL IsAnAfsPartition(LPCTSTR pszRootDir); -BOOL DoesPartitionExist(LPCTSTR pszName); -void FreePartitionTable(); - -#endif // _PARTITION_UTILS_H_ - diff --git a/src/WINNT/afssvrcfg/partitions_page.cpp b/src/WINNT/afssvrcfg/partitions_page.cpp deleted file mode 100644 index ffa1f6b70..000000000 --- a/src/WINNT/afssvrcfg/partitions_page.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" -#include "create_partition_dlg.h" -#include "partition_utils.h" -#include "salvage_results_dlg.h" -extern "C" { -#include -#include -} - - -// TODO: Add context menu to fastlist - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -#define MAX_PARTITIONS 26 - -static HWND hDlg = 0; -static HWND hPartitionList = 0; -static HLISTITEM hSelectedItem; - -static TCHAR szYes[cchRESOURCE]; -static TCHAR szNo[cchRESOURCE]; - -static const UINT DISK_DRIVE_IMAGE = 0; -//static const UINT DISABLED_DISK_DRIVE_IMAGE = 1; -//static const UINT DISK_DRIVE_WITH_WARNING_IMAGE = 2; - -// Remember the config state of the FS so we can detect when it changes. -// When it changes we must redisplay the partition info. -static CONFIG_STATE configFS; - - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -BOOL ShowSalvageDlg(HWND hParent, LPCTSTR pszPartitionName); - -static void OnCreatePartitions(); -static void OnInitDialog(HWND hwndDlg); -static void SetupListCols(); -static void AddColumn(int nWidth, LPCTSTR pszTitle, DWORD dwFlags = FLCF_JUSTIFY_LEFT); -static void ShowPartitions(); -cfg_partitionEntry_t *GetPartitionTableFromRegistry(int& cEntries); -static vos_partitionEntry_t *GetPartitionTableFromVos(int &nNumPartitions); -static void OnListSelection(LPFLN_ITEMSELECT_PARAMS pItemParms); -static void SetupImageLists(); -static void OnRemove(); -static BOOL CheckShowPartitions(); -static void OnSalvage(); -static void CheckEnableSalvage(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK PartitionsPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (AfsAppLib_HandleHelp(IDD_PARTITIONS_PAGE, hwndDlg, uMsg, wParam, lParam)) - return TRUE; - - switch (uMsg) { - case WM_INITDIALOG: OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: switch (LOWORD(wParam)) { - case IDINIT: CheckShowPartitions(); - break; - - case IDC_CREATE_PARTITIONS: - OnCreatePartitions(); - break; - - case IDC_REMOVE: OnRemove(); - break; - - case IDC_SALVAGE: OnSalvage(); - break; - } - break; - - case WM_NOTIFY: if ((((LPNMHDR)lParam)->code) == FLN_ITEMSELECT) - OnListSelection((LPFLN_ITEMSELECT_PARAMS)lParam); - break; - } - - return FALSE; -} - -void UpdatePartitionList() -{ - ShowPartitions(); - CheckEnableSalvage(); -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - -// PropSheet_CancelToClose(GetParent(hDlg)); - - hSelectedItem = 0; - - hPartitionList = GetDlgItem(hDlg, IDC_PARTITION_LIST); - _ASSERTE(hPartitionList); - - SetupImageLists(); - - GetString(szYes, IDS_YES); - GetString(szNo, IDS_NO); - - SetupListCols(); - - configFS = g_CfgData.configFS; - - ShowPartitions(); - - CheckEnableSalvage(); -} - -static void OnCreatePartitions() -{ - if (CreatePartition(hDlg)) - ShowPartitions(); -} - -static void OnListSelection(LPFLN_ITEMSELECT_PARAMS pItemParms) -{ - ASSERT(pItemParms); - - hSelectedItem = pItemParms->hItem; - - ENABLE_STATE es = pItemParms->hItem ? ES_ENABLE : ES_DISABLE; - - SetEnable(hDlg, IDC_REMOVE, es); - SetEnable(hDlg, IDC_REMOVE_MSG, es); -} - -static void OnRemove() -{ - ASSERT(hSelectedItem); - ASSERT(g_hServer); - - afs_status_t nStatus; - - BOOL bExported = (BOOL)FastList_GetItemParam(hPartitionList, hSelectedItem); - if (bExported) { - MsgBox(hDlg, IDS_CANT_DELETE_EXPORTED_PARTITION, GetAppTitleID(), MB_OK | MB_ICONSTOP); - return; - } - - LPCTSTR pszPartitionName = FastList_GetItemText(hPartitionList, hSelectedItem, 0); - ASSERT(pszPartitionName); - - int nResult = Message(MB_ICONQUESTION | MB_YESNO, GetAppTitleID(), IDS_DELETE_PARTITION_PROMPT, TEXT("%s"), pszPartitionName); - if (nResult == IDNO) - return; - - g_LogFile.Write("Removing partition '%s'.\r\n", (char *)S2A(pszPartitionName)); - nResult = cfg_HostPartitionTableRemoveEntry(g_hServer, S2A(pszPartitionName), &nStatus); - if (!nResult) { - ShowError(hDlg, nStatus, IDS_REMOVE_PARTITION_ERROR); - return; - } - - FastList_RemoveItem(hPartitionList, hSelectedItem); - - CheckEnableSalvage(); -} - -static void OnSalvage() -{ - // Can't salvage if the file server is not configured - if (!Configured(g_CfgData.configFS)) { - ShowError(hDlg, 0, IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED); - return; - } - - LPCTSTR pszPartitionName = TEXT(""); - - if (hSelectedItem) { - pszPartitionName = FastList_GetItemText(hPartitionList, hSelectedItem, 0); - ASSERT(pszPartitionName); - } - - if (!ShowSalvageDlg(hDlg, pszPartitionName)) - return; - - ShowSalvageResults(hDlg); - - // Since a salvage was performed, there may be partitions exported that were - // not exported before the salvage. Salvage may stop and restart the file - // server, which will pick up the previously unexported partitions. We will - // update our partition list in case this has happened. - UpdatePartitionList(); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static BOOL CheckShowPartitions() -{ - if (configFS != g_CfgData.configFS) { - configFS = g_CfgData.configFS; - UpdatePartitionList(); - return TRUE; - } - - return FALSE; -} - -static void SetupImageLists() -{ - HIMAGELIST hiList = ImageList_Create(16, 16, TRUE, 1, 1); - - AfsAppLib_AddToImageList(hiList, IDI_AGGREGATE, FALSE); - AfsAppLib_AddToImageList(hiList, IDI_DISABLED_DISK_DRIVE, FALSE); - - FastList_SetImageLists(hPartitionList, hiList, 0); -} - -static void AddColumn(int nWidth, LPCTSTR pszTitle, DWORD dwFlags) -{ - static int nCol = 1; - FASTLISTCOLUMN col; - - col.dwFlags = dwFlags; - col.cxWidth = nWidth; - lstrcpy(col.szText, pszTitle); - - FastList_SetColumn(hPartitionList, nCol++, &col); -} - -static void SetupListCols() -{ - TCHAR szMsg[cchRESOURCE]; - - AddColumn(75, GetResString(IDS_NAME, szMsg)); - AddColumn(55, GetResString(IDS_DRIVE, szMsg)); - AddColumn(60, GetResString(IDS_EXPORTED, szMsg)); - AddColumn(75, GetResString(IDS_TOTAL, szMsg), FLCF_JUSTIFY_RIGHT); - AddColumn(75, GetResString(IDS_FREE, szMsg), FLCF_JUSTIFY_RIGHT); -} - -cfg_partitionEntry_t *GetPartitionTableFromRegistry(int& cEntries) -{ - afs_status_t nStatus; - - // Read the parition table out of the registry - int nResult = ReadPartitionTable(&nStatus); - if (!nResult) { - ShowError(hDlg, nStatus, IDS_READ_PARTITIONS_ERROR); - return 0; - } - - return GetPartitionTable(cEntries); -} - -static vos_partitionEntry_t *GetPartitionTableFromVos(int &nNumPartitions) -{ - ASSERT(g_hCell); - ASSERT(g_CfgData.szHostname[0]); - - nNumPartitions = 0; - - if (g_CfgData.configFS != CS_ALREADY_CONFIGURED) - return 0; - - static vos_partitionEntry_t aPartitions[MAX_PARTITIONS]; - afs_status_t nStatus, nIgnore; - void *hServer = 0; - int nNumParts = 0; - - // Open this server - g_LogFile.Write("Opening server %s.\r\n", GetHostnameA()); - int nResult = vos_ServerOpen(g_hCell, GetHostnameA(), &hServer, &nStatus); - if (nResult) { - - // Read the partition info - g_LogFile.Write("Reading paritition information for this server.\r\n"); - void *iterID; - - nResult = vos_PartitionGetBegin(g_hCell, hServer, 0, &iterID, &nStatus); - if (nResult) { - while (nNumParts < MAX_PARTITIONS) { - nResult = vos_PartitionGetNext(iterID, &aPartitions[nNumParts], &nStatus); - if (!nResult) { - if (nStatus == ADMITERATORDONE) { - nResult = 1; - nStatus = 0; - } - break; - } - - nNumParts++; - } - vos_PartitionGetDone(iterID, &nIgnore); - } - vos_ServerClose(hServer, &nIgnore); - } - - if (!nResult) { - ShowError(hDlg, nStatus, IDS_GET_PARTITION_LIST_ERROR); - return 0; - } - - nNumPartitions = nNumParts; - - return aPartitions; -} - -// Convert a disk space value in Kbytes into a string -static LPTSTR DiskSpaceToString(int nSpace) -{ - const float oneMB = 1024; // in K bytes - const double oneGB = oneMB * 1024; - const double oneTB = oneGB * 1024; - - static TCHAR szSpace[64]; - double space; - LPTSTR pszUnits; - - space = nSpace; - - if (space >= oneTB) { - space /= oneTB; - pszUnits = TEXT(" TB"); - } else if (space >= oneGB) { - space /= oneGB; - pszUnits = TEXT(" GB"); - } else if (space >= oneMB) { - space /= oneMB; - pszUnits = TEXT(" MB"); - } else - pszUnits = TEXT(" KB"); - - int nNumDecimals = 0; - if (space - double(int(space)) > 0) - nNumDecimals = 2; - - _stprintf(szSpace, TEXT("%3.*f%s"), nNumDecimals, space, pszUnits); - - return szSpace; -} - -static void ShowPartitions() -{ - FastList_RemoveAll(hPartitionList); - - int cRegParts = 0, cVosParts = 0; - - // If we got nothing from the registry, then leave the list empty - cfg_partitionEntry_t *pRegParts = GetPartitionTableFromRegistry(cRegParts); - if (!pRegParts) - return; - - // If we failed to get vos info, then only show the registry info - vos_partitionEntry_t *pVosParts = GetPartitionTableFromVos(cVosParts); - if (!pVosParts) - cVosParts = 0; - - // We have two partition tables, one from the registry and one from the vos - // library. The one from the vos library tells us the partitions that are - // currently exported. The one from the registry tells us the partitions - // that will be exported after the file server restarts. The registry list - // should always be at least as big as the vos list. The vos list can be - // smaller if one of the disks could not be exported. To add a new partition, - // an entry must be added to the registry table and then the file server must - // be restarted. To remove an entry, the partition must not be exported (due - // to an error) or the file server must not be running, in which case nothing - // will be exported. - - // To display the partitions to the user, we use the list from the registry, - // looking up each of its entries in the vos list to see if it is exported, - // and if it is, to get its size info. - - - for (int nCurRegPart = 0; nCurRegPart < cRegParts; nCurRegPart++) { - LPTSTR pPartNameAsString = AnsiToString(pRegParts[nCurRegPart].partitionName); - - // Show the partition in the list - FASTLISTADDITEM ai = { 0, DISK_DRIVE_IMAGE, IMAGE_NOIMAGE, pPartNameAsString, 0, 0 }; - HLISTITEM hItem = FastList_AddItem(hPartitionList, &ai); - - FreeString(pPartNameAsString); - - FastList_SetItemText(hPartitionList, hItem, 1, pRegParts[nCurRegPart].deviceName); - - // For the rest of the info we need to know if this guy is exported. - // Look him up in the vos table. - BOOL bExported = FALSE; - int nTotalSpace = 0; - int nFreeSpace = 0; - - for (int nCurVosPart = 0; nCurVosPart < cVosParts; nCurVosPart++) { - if (stricmp(pVosParts[nCurVosPart].name, pRegParts[nCurRegPart].partitionName) == 0) { - bExported = TRUE; - nTotalSpace = pVosParts[nCurVosPart].totalSpace; - nFreeSpace = pVosParts[nCurVosPart].totalFreeSpace; - break; - } - } - - FastList_SetItemText(hPartitionList, hItem, 2, bExported ? szYes : szNo); - FastList_SetItemText(hPartitionList, hItem, 3, bExported ? DiskSpaceToString(nTotalSpace) : TEXT("")); - FastList_SetItemText(hPartitionList, hItem, 4, bExported ? DiskSpaceToString(nFreeSpace) : TEXT("")); - - // Set the item param to indicate that this partition is exported or not - FastList_SetItemParam(hPartitionList, hItem, bExported); - - - } -} - -static void CheckEnableSalvage() -{ - ENABLE_STATE es = (FastList_GetItemCount(hPartitionList) > 0) ? ES_ENABLE : ES_DISABLE; - - SetEnable(hDlg, IDC_SALVAGE, es); - SetEnable(hDlg, IDC_SALVAGE_MSG, es); -} - diff --git a/src/WINNT/afssvrcfg/replicatition_page.cpp b/src/WINNT/afssvrcfg/replicatition_page.cpp deleted file mode 100644 index 064532486..000000000 --- a/src/WINNT/afssvrcfg/replicatition_page.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void ShowStatusMsg(UINT nMsgID); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK ReplicationPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - g_pWiz->SetState(sidSTEP_ELEVEN); - break; - - case IDBACK: - g_pWiz->SetState(sidSTEP_NINE); - break; - - case IDC_DONT_REPLICATE: - g_CfgData.configRep = CS_DONT_CONFIGURE; - break; - - case IDC_REPLICATE: - g_CfgData.configRep = CS_CONFIGURE; - break; - } - break; - - } - - return FALSE; -} - - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.bFirstServer) { - ShowStatusMsg(IDS_MUST_REPLICATE); - g_CfgData.configRep = CS_CONFIGURE; - return; - } - - if (g_CfgData.configRep == CS_ALREADY_CONFIGURED) { - ShowStatusMsg(IDS_ALREADY_REPLICATED); - return; - } - - // If the replication of the root volumes could not be determined, we'll - // ask the user if they want to create them if they don't already exist. - if (!g_CfgData.bRootVolumesReplicationKnown) { - SetWndText(hDlg, IDC_REPLICATE_QUESTION, IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT); - g_CfgData.configRep = CS_CONFIGURE; - SetCheck(hDlg, IDC_REPLICATE); - return; - } - - // Should this step be disabled? Yes, if this machine does - // not have a root.afs volume. - if (!ConfiguredOrConfiguring(g_CfgData.configRootVolumes)) { - ShowStatusMsg(IDS_ROOT_AFS_DOESNT_EXIST); - EnableStep(g_CfgData.configRep, FALSE); - return; - } - - // Must do this in case it was disabled on the last run through - EnableStep(g_CfgData.configRep); - - if (g_CfgData.configRep == CS_DONT_CONFIGURE) - SetCheck(hDlg, IDC_DONT_REPLICATE); - else if (g_CfgData.configRep == CS_CONFIGURE) - SetCheck(hDlg, IDC_REPLICATE); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void ShowStatusMsg(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - ShowWnd(hDlg, IDC_REPLICATE_QUESTION, FALSE); - ShowWnd(hDlg, IDC_REPLICATE, FALSE); - ShowWnd(hDlg, IDC_DONT_REPLICATE, FALSE); - - ShowWnd(hDlg, IDC_CANT_REPLICATE_MSG); - SetWndText(hDlg, IDC_CANT_REPLICATE_MSG, szMsg); -} - diff --git a/src/WINNT/afssvrcfg/resource.h b/src/WINNT/afssvrcfg/resource.h deleted file mode 100644 index e4f5c7cf8..000000000 --- a/src/WINNT/afssvrcfg/resource.h +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_NEXT 0 -#define IDS_FINISH 1 -#define IDS_HELP_TITLE 2 -#define IDS_HELP_DESC 3 -#define IDS_CANCEL_DESC 4 -#define IDS_PARTITION_ALREADY_CREATED 5 -#define IDS_NOT_A_FS_SERVER 6 -#define IDS_ROOT_AFS_ALREADY_EXISTS 7 -#define IDS_NO_PARTITION_EXISTS 8 -#define IDS_ALREADY_REPLICATED 9 -#define IDS_ROOT_AFS_DOESNT_EXIST 10 -#define IDS_ALREADY_CONFIGURED 11 -#define IDS_NOTHING_TO_CONFIGURE 12 -#define IDS_EXIT 13 - -#define IDS_START_FS_STEP 16 -#define IDS_CANCEL_CONFIG_MSG 17 -#define IDS_WIZARD_APP_TITLE 18 -#define IDS_CANCEL_PENDING 19 -#define IDS_CHECK_FS_CONFIG 20 -#define IDS_CHECK_DB_CONFIG 21 -#define IDS_CHECK_BAK_CONFIG 22 -#define IDS_CHECK_PARTITION 23 -#define IDS_CHECK_ROOT_AFS 24 -#define IDS_CHECK_REP 25 -#define IDS_CANCEL_GET_CONFIG 26 -#define IDS_ALREADY_A_BACKUP_SERVER 27 -#define IDS_NOT_A_DB_SERVER 28 -#define IDS_ALREADY_A_SYS_CONTROL_SERVER 29 -#define IDS_ALREADY_A_SYS_CONTROL_CLIENT 30 -#define IDS_SC_NOT_A_DB_OR_FS_SERVER 31 - -#define IDS_DRIVE 32 -#define IDS_NAME_OR_ERROR 33 -#define IDS_BIN_NOT_A_DB_OR_FS_SERVER 34 -#define IDS_CHECK_SCS 35 -#define IDS_CHECK_SCC 36 -#define IDS_SIZE 37 -#define IDS_ERROR_SEP 38 -#define IDS_MUST_CONFIG_FS 39 -#define IDS_MUST_CONFIG_DB 40 -#define IDS_MUST_MAKE_PARTITION 41 -#define IDS_MUST_CREATE_ROOT_AFS 42 -#define IDS_MUST_REPLICATE 43 -#define IDS_CHECK_AFS_CLIENT 44 -#define IDS_ERROR_HOST_NAME 45 -#define IDS_ERROR_DRIVE_COMPRESSED 46 -#define IDS_ERROR_CFG_HOST_OPEN 47 - -#define IDS_STOP_CLIENT_STEP 48 -#define IDS_ERROR_LOCAL_HOST_NAME 49 -#define IDS_GET_TOKENS_ERROR 50 -#define IDS_CANT_SALVAGE_WHEN_FS_NOT_CONFIGURED 51 -#define IDS_SALVAGING 52 -#define IDS_CURRENT_SALVAGE_LOG 53 -#define IDS_FINAL_SALVAGE_LOG 54 -#define IDS_SALVAGE_COMPLETE 55 -#define IDS_CANT_GET_SALVAGE_LOG 56 -#define IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK 57 -#define IDS_VALIDATION_ERROR_TEMPLATE 58 -#define IDS_CELL_NAME_VALIDATION_TYPE 59 -#define IDS_SERVER_NAME_VALIDATION_TYPE 60 -#define IDS_PASSWORD_VALIDATION_TYPE 61 -#define IDS_UID_VALIDATION_TYPE 62 -#define IDS_USER_NAME_VALIDATION_TYPE 63 - -#define IDS_ERROR_AFS_CLIENT_NOT_INSTALLED 64 -#define IDS_ERROR_AFS_CLIENT_CHECK 65 -#define IDS_ERROR_FS_IS_NOT_NTFS 66 -#define IDS_ERROR_DRIVE_HAS_DATA 67 -#define IDS_PARTITION_STEP_DESC 68 -#define IDS_ERROR_DRIVE_CONTAINS_NT 69 -#define IDS_DB_STEP_DESC 70 -#define IDS_FS_STEP_DESC 71 -#define IDS_SCC_STEP_DESC 72 -#define IDS_SCS_STEP_DESC 73 -#define IDS_ROOT_AFS_STEP_DESC 74 -#define IDS_REP_STEP_DESC 75 -#define IDS_PARTITIONS_PAGE_TITLE 76 -#define IDS_CONFIGURE 77 -#define IDS_DB_AND_BK_STEP_DESC 78 - -#define IDS_PARTITION_STEP 80 -#define IDS_CONFIG_COMMON_FUNCS 81 -#define IDS_START_DB_STEP 82 -#define IDS_START_SCC_STEP 83 -#define IDS_START_SCS_STEP 84 -#define IDS_CREATE_ROOT_AFS_STEP 85 -#define IDS_REP_STEP 86 -#define IDS_START_AUTH_STEP 87 -#define IDS_SERVICES_PAGE_TITLE 88 -#define IDS_CONFIG_SUCCEEDED 89 -#define IDS_CONFIG_CANCELED 90 -#define IDS_CONFIG_FAILED 91 -#define IDS_ERROR_NO_LICENSE_NUM 92 -#define IDS_VERIFY_CLIENT_INSTALL_STEP 93 -#define IDS_SET_SERVER_LICENSE_STEP 94 -#define IDS_DEFINE_CELL_NAME_STEP 95 - -#define IDS_DEFINE_CELL_MEMBERSHIP_STEP 96 -#define IDS_START_BOS_SERVER_STEP 97 -#define IDS_START_AUTH_SERVER_STEP 98 -#define IDS_CREATE_PRINCIPAL_AND_KEY_STEP 99 -#define IDS_START_DB_AND_BK_STEP 100 -#define IDS_CREATE_ADMIN_PRINCIPAL_STEP 101 -#define IDS_START_CLIENT_STEP 102 -#define IDS_SET_ROOT_ACL_STEP 103 -#define IDS_CREATE_ROOT_CELL_STEP 104 -#define IDS_MOUNT_ROOT_CELL_STANDARD_STEP 105 -#define IDS_SET_ROOT_CELL_ACL_STEP 106 -#define IDS_MOUNT_ROOT_CELL_RW_STEP 107 -#define IDS_ENABLE_AUTH_CHECKING_STEP 108 -#define IDS_OBTAIN_ADMIN_CREDS_STEP 109 -#define IDS_RESTART_SERVERS_STEP 110 -#define IDS_ALREADY_A_FS_SERVER 111 - -#define IDS_ALREADY_A_DB_SERVER 112 -#define IDS_INTRO_PAGE 113 -#define IDS_INFO_PAGE 114 -#define IDS_FS_PAGE 115 -#define IDS_DB_PAGE 116 -#define IDS_CFG_TOOL_APP_TITLE 117 -#define IDS_BK_PAGE 118 -#define IDS_ROOT_AFS_PAGE 119 -#define IDS_NAME 120 -#define IDS_REP_PAGE 121 -#define IDS_SC_PAGE 122 -#define IDS_CONFIG_PAGE 123 - -#define IDS_PARTITION_PAGE 128 -#define IDS_GRAPHIC_FONT 129 -#define IDS_CURRENT_STEP 130 -#define IDS_ADD_TO_CELLSERVDB_STEP 131 -#define IDS_RESTART_ALL_DB_SERVERS_STEP 132 -#define IDS_CONFIG_SUCCEEDED_NEED_CELLSERVDB_UPDATE 133 -#define IDS_SYS_CONTROL_SERVER_ONLY_MSG 134 - -#define IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG 144 -#define IDS_CLIENT_CELL_WILL_CHANGE 145 -#define IDS_INFO_PAGE2 146 -#define IDS_CONFIG_SUCCEEDED_FIRST_SERVER 147 -#define IDS_CONFIG_SCS 148 -#define IDS_CONFIG_INTO_CELL_MSG 149 -#define IDS_VIEW_LOG 150 -#define IDS_VIEW_LOG_ERROR 151 -#define IDS_ERROR_NO_LOG_FILE 152 -#define IDS_UPDATING_CELLSERVDB_HOST_SUCCEEDED 153 -#define IDS_UPDATING_CELLSERVDB_HOST_FAILED 154 -#define IDS_CELL_NAME_LEN_ERROR 155 -#define IDS_CONFIG_CHECK_FAILED 156 -#define IDS_YES 157 - -#define IDS_NO 160 -#define IDS_FREE 161 -#define IDS_TOTAL 162 -#define IDS_DRIVE2 163 -#define IDS_SERVICE_STATUS 164 -#define IDS_SERVICE 165 -#define IDS_FS_RUNNING 166 -#define IDS_FS_STOPPED 167 - -#define IDS_DB_RUNNING 176 -#define IDS_DB_STOPPED 177 -#define IDS_BK_RUNNING 178 -#define IDS_BK_STOPPED 179 -#define IDS_SC_RUNNING 180 -#define IDS_SCS_STOPPED 181 -#define IDS_SC_STOPPED 182 -#define IDS_SCC_STOPPED 183 -#define IDS_FS_HOW_TO_RUN 184 -#define IDS_FS_HOW_TO_STOP 185 -#define IDS_DB_HOW_TO_RUN 186 -#define IDS_DB_HOW_TO_STOP 187 -#define IDS_BK_HOW_TO_RUN 188 - -#define IDS_BK_HOW_TO_STOP 192 -#define IDS_SCS_HOW_TO_RUN 193 -#define IDS_SCS_HOW_TO_STOP 194 -#define IDS_DB_PARTIAL_CONFIG 195 -#define IDS_DB_DETAILS 196 -#define IDS_BK_DISABLED 197 -#define IDS_BK_ENABLE 198 -#define IDS_SC_DISABLED 199 -#define IDS_SC_ENABLE 200 -#define IDS_FS_WILL_RUN 201 -#define IDS_FS_WILL_STOP 202 -#define IDS_DB_WILL_RUN 203 -#define IDS_DB_WILL_STOP 204 -#define IDS_BK_WILL_RUN 205 -#define IDS_BK_WILL_STOP 206 -#define IDS_SCS_WILL_RUN 207 - -#define IDS_SCS_WILL_STOP 208 -#define IDS_ERROR_DRIVE_ALREADY_HAS_AFS 209 -#define IDS_VOLUME_HAS_NO_NAME 210 -#define IDS_PARTITION_CREATED 211 -#define IDS_PARTITION_EXISTS 212 -#define IDS_SCS_RUNNING 213 -#define IDS_WARNING_DRIVE_HAS_RECYCLE_BIN 214 -#define IDS_SCC_WILL_RUN 215 -#define IDS_SCC_WILL_STOP 216 -#define IDS_SCC_RUNNING 217 -#define IDS_SCC_HOW_TO_RUN 218 -#define IDS_SCC_HOW_TO_STOP 219 -#define IDS_SCS_ENABLE 220 -#define IDS_SCC_ENABLE 221 -#define IDS_UNCONFIG_DB_STEP 222 -#define IDS_UNCONFIG_DB_STEP_DESC 223 - -#define IDS_UNCONFIG_DB_AND_BK_STEP 224 -#define IDS_UNCONFIG_DB_AND_BK_STEP_DESC 225 -#define IDS_UNCONFIG_BK_STEP 226 -#define IDS_UNCONFIG_BK_STEP_DESC 227 -#define IDS_UNCONFIG_FS_STEP 228 -#define IDS_UNCONFIG_FS_STEP_DESC 229 -#define IDS_UNCONFIG_SCS_STEP 230 -#define IDS_UNCONFIG_SCS_STEP_DESC 231 -#define IDS_UNCONFIG_SCC_STEP 232 -#define IDS_UNCONFIG_SCC_STEP_DESC 233 -#define IDS_INVALIDATE_CONFIG_INFO_STEP 234 -#define IDS_GET_OTHER_HOSTNAME 235 -#define IDS_CLOSE 236 -#define IDS_CELLSERVDB_UPDATE_ERR_MSG 237 -#define IDS_DELETE_PARTITION_PROMPT 238 -#define IDS_INVALIDATE_CFG_INFO 239 - -#define IDS_CELL_IS_GONE_MUST_EXIT 240 -#define IDS_CFG_MAN_CANT_CONTINUE 241 -#define IDS_CONFIG_INFO_INVALIDATED 242 -#define IDS_GET_TOKENS_FAILED 243 - -#define IDS_START_BK_STEP 256 -#define IDS_BK_STEP_DESC 257 -#define IDS_CONFIG_ERROR 258 -#define IDS_CREATE_PARTITION_ERROR 259 -#define IDS_REMOVE_PARTITION_ERROR 260 -#define IDS_READ_PARTITIONS_ERROR 261 -#define IDS_CELLSERVDB_UPDATE_PROBLEM 262 -#define IDS_GET_PARTITION_LIST_ERROR 263 -#define IDS_EXPORTED 264 -#define IDS_CANT_DELETE_EXPORTED_PARTITION 265 -#define IDS_CHECK_CONFIG_INFO 266 -#define IDS_ERROR_CFG_HOST_CLOSE 267 -#define IDS_FAILED_OPEN_CELL 268 -#define IDS_FAILED_OPEN_NULL_CELL 269 -#define IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT 270 -#define IDS_REP_ROOT_VOLUMES_IF_NECESSARY_PROMPT 271 - -#define IDS_TRANSARC_AFS_SERVER 272 -#define IDS_CANT_INIT_ADMIN_LIBS 273 -#define IDS_CANT_OPEN_LOG_FILE 274 -#define IDS_NEED_CLIENT_INFO 275 -#define IDS_NEED_SERVER_INFO 276 -#define IDS_ADVANCED_OPEN 277 -#define IDS_ADVANCED_CLOSED 278 -#define IDS_BOS_OPEN_FAILED 279 -#define IDS_SALVAGE_ERROR 280 -#define IDS_INVALID_NUM_SALVAGE_PROCESSSES 281 -#define IDS_WRONG_CELL 282 -#define IDS_CELLSERVDB_UPDATE_ERRORS_ARE_IN_LOG_FILE 283 -#define IDS_GET_CREDENTIALS_STEP 284 -#define IDS_MUST_ENTER_SCS_NAME 285 -#define IDS_NOT_SAME_CELL 286 -#define IDS_LAST_DB_SERVER 287 - -#define IDS_BAD_PW 288 -#define IDS_ERROR_CLIENT_VERSION 289 -#define IDS_CANT_MAP_ROOT_AFS 290 -#define IDS_NO_MSG_STEP 291 - -#define IDS_PARTITION_NAME_VALIDATION_TYPE 304 -#define IDS_VOLUME_NAME_VALIDATION_TYPE 305 -#define IDS_NUM_SALVAGE_PROCS_VALIDATION_TYPE 306 -#define IDS_PATH_NAME_VALIDATION_TYPE 307 -#define IDS_FILE_NAME_VALIDATION_TYPE 308 -#define IDS_GENERIC_VALIDATION_TYPE 309 - -#define IDI_APP_ICON 100 -#define IDD_WIZARD 101 -#define IDB_GRAPHIC_256 102 -#define IDI_FOLDER 103 -#define IDB_GRAPHIC_16 104 -#define IDI_FILE 105 -#define IDD_INITIAL_CONFIG 106 -#define IDD_PARTITION_PAGE 107 -#define IDI_UPSERVER 108 -#define IDD_DB_SERVER_PAGE 109 -#define IDD_ROOT_VOLUMES_PAGE 110 -#define IDD_GET_CURRENT_CONFIG 111 -#define IDD_FILE_SERVER_PAGE 112 -#define IDD_REPLICATION_PAGE 113 -#define IDD_CONFIG_SERVER_PAGE 114 -#define IDD_INFO_PAGE 115 -#define IDD_CREATE_PARTITION 116 -#define IDD_INTRO_PAGE 117 -#define IDD_BACKUP_SERVER_PAGE 118 -#define IDD_SYS_CONTROL_PAGE 119 -#define IDD_INFO_PAGE2_FIRST_SERVER 120 -#define IDD_INFO_PAGE2_NOT_FIRST_SERVER 121 -#define IDI_DISABLED_DISK_DRIVE 122 -#define IDD_SERVICES_PAGE 123 -#define IDI_DISK_DRIVE 124 -#define IDD_PARTITIONS_PAGE 125 -#define IDD_SERVICES_PAGE1 126 -#define IDI_DISK_DRIVE_WITH_WARNING 127 -#define IDI_AFS_DISK_DRIVE 128 -#define IDD_ADMIN_INFO 129 -#define IDD_CONFIG_SERVER 130 -#define IDD_CELLSERVDB_ERRORS 131 -#define IDD_SALVAGE 132 -#define IDD_SALVAGE1 133 -#define IDD_GET_PW 134 -#define IDD_SALVAGE_RESULTS 135 - -#define IDC_OPERATION 836 -#define IDC_PROGRESS 837 -#define IDC_OPERATION2 838 -#define IDNEXT 1001 -#define IDC_CREATE_PARTITIONS 1002 -#define IDBACK 1003 -#define IDC_PARTITION_LIST 1004 -#define IDC_CREATE_ROOT_VOLUMES 1006 -#define IDC_DONT_CONFIG_DB_SERVER 1009 -#define IDC_WIZARD_LEFTPANE 1010 -#define IDC_SALVAGE 1011 -#define IDC_WIZARD_RIGHTPANE 1012 -#define IDC_REFORMAT 1013 -#define IDC_PARTITION_NAME 1016 -#define IDC_DRIVE_LIST 1017 -#define IDC_NAME_STATIC 1018 -#define IDC_VICEP_STATIC 1019 -#define IDC_MSG 1020 -#define IDC_CONFIG_PROGRESS 1022 -#define IDC_LOGO 1023 -#define IDC_PARTITION_COVER 1024 -#define IDC_SHOULD_CONFIG_FILE_SERVER 1025 -#define IDC_PARTITION_MSG 1026 -#define IDC_DB_DETAILS 1027 -#define IDC_NO_DRIVES_NOTE 1028 -#define IDC_ASK_CREATE_PARTITION 1029 -#define IDC_DISK_ADMIN_NOTE 1030 -#define IDC_SELECT_DRIVE 1031 -#define IDC_CREATE_FS_QUESTION 1032 -#define IDC_CONFIG_DB_SERVER 1033 -#define IDC_DB_SERVER_QUESTION 1034 -#define IDC_CREATE_PARTITION 1035 -#define IDC_DONT_CREATE_PARTITION 1036 -#define IDC_BK_SERVICE 1037 -#define IDC_REPLICATE 1038 -#define IDC_FILE_SERVER 1039 -#define IDC_DB_SERVER 1040 -#define IDC_PARTITION 1041 -#define IDC_ROOT_AFS_VOLUME 1042 -#define IDC_DONT_CONFIG_FILE_SERVER 1043 -#define IDC_REPLICATION 1044 -#define IDC_DONT_CREATE_ROOT_VOLUMES 1046 -#define IDC_NAME_LABEL 1047 -#define IDC_FS_SERVICE 1048 -#define IDC_SC_SERVICE 1049 -#define IDC_ROOT_AFS_MSG 1050 -#define IDC_FS_ACTION_MSG 1051 -#define IDC_DB_SERVICE 1052 -#define IDC_DONT_REPLICATE 1053 -#define IDC_SERVER_PW 1054 -#define IDC_DB_ACTION_MSG 1055 -#define IDC_CANT_REPLICATE_MSG 1056 -#define IDC_ADMIN_NAME 1057 -#define IDC_VERIFY_PW 1058 -#define IDC_BK_ACTION_MSG 1059 -#define IDC_ADMIN_PW 1060 -#define IDC_SC_ACTION_MSG 1061 -#define IDC_CELL_NAME 1062 -#define IDC_VERIFY_ADMIN_PW 1063 -#define IDC_AFS_UID 1065 -#define IDC_HOSTNAME 1066 -#define IDC_CANT_BACKUP_MSG 1067 -#define IDC_CONFIG_BACKUP_SERVER 1068 -#define IDC_DONT_CONFIG_BACKUP_SERVER 1069 -#define IDC_BACKUP_SERVER_QUESTION 1071 -#define IDC_SYS_CONTROL_MACHINE_QUESTION 1073 -#define IDC_SYS_CONTROL_CLIENT 1074 -#define IDC_SC_CLIENT 1075 -#define IDC_SYS_CONTROL_SERVER 1076 -#define IDC_SC_SERVER 1077 -#define IDC_DONT_CONFIGURE 1078 -#define IDC_AGGR_FRAME 1079 -#define IDC_SYS_CONTROL_MACHINE 1080 -#define IDC_SC_MACHINE 1081 -#define IDC_SYS_CONTROL_MACHINE_LABEL 1082 -#define IDC_SC_MACHINE_LABEL 1083 -#define IDC_ARGS_FRAME 1085 -#define IDC_CANT_CONFIG_MSG 1091 -#define IDC_JOIN_EXISTING_CELL 1092 -#define IDC_ROOT_AFS_QUESTION 1095 -#define IDC_REPLICATE_QUESTION 1096 -#define IDC_ALL_NEEDED_MSG 1097 -#define IDC_FOLLOWING_STEPS_MSG 1098 -#define IDC_STEP1 1099 -#define IDC_STEP2 1100 -#define IDC_STEP3 1101 -#define IDC_STEP4 1102 -#define IDC_STEP5 1103 -#define IDC_STEP6 1104 -#define IDC_STEP7 1105 -#define IDC_STEP8 1106 -#define IDC_CURRENT_STEP 1107 -#define IDC_PERCENT_COMPLETE 1108 -#define IDC_REMOVE 1109 -#define IDC_PERCENT_COMPLETE_LABEL 1110 -#define IDC_CURRENT_STEP_LABEL 1111 -#define IDC_STATUS_MSG 1112 -#define IDC_STEP1_GRAPHIC 1113 -#define IDC_STEP2_GRAPHIC 1114 -#define IDC_STEP3_GRAPHIC 1115 -#define IDC_STEP4_GRAPHIC 1116 -#define IDC_STEP5_GRAPHIC 1117 -#define IDC_STEP6_GRAPHIC 1118 -#define IDC_STEP7_GRAPHIC 1119 -#define IDC_STEP8_GRAPHIC 1120 -#define IDC_CELL_NAME_FRAME 1121 -#define IDC_SERVER_PW_FRAME 1122 -#define IDC_ADMIN_INFO_FRAME 1123 -#define IDC_CELL_NAME_LABEL 1124 -#define IDC_CELL_NAME_PROMPT 1125 -#define IDC_SERVER_PW_PROMPT 1126 -#define IDC_SERVER_PW_LABEL 1127 -#define IDC_ADMIN_INFO_PROMPT 1128 -#define IDC_VERIFY_PW_LABEL 1129 -#define IDC_ADMIN_NAME_LABEL 1130 -#define IDC_CELL_NAME_PROMPT2 1131 -#define IDC_ADMIN_PW_LABEL 1132 -#define IDC_PRINCIPAL_LABEL 1133 -#define IDC_DB_STATUS_MSG 1134 -#define IDC_BK_STATUS_MSG 1136 -#define IDC_SYS_CONTROL_CLIENT_DESC 1137 -#define IDC_VERIFY_ADMIN_PW_LABEL 1138 -#define IDC_SC_STATUS_MSG 1139 -#define IDC_HOSTNAME_PROMPT 1140 -#define IDC_FS_STATUS_MSG 1141 -#define IDC_SCS_PROMPT 1141 -#define IDC_HOSTNAME_FRAME 1142 -#define IDC_HOSTNAME_LABEL 1143 -#define IDC_SCM_PROMPT 1144 -#define IDC_SCS_FRAME 1144 -#define IDC_FIRST_SERVER 1145 -#define IDC_SCS_LABEL 1145 -#define IDC_AFS_UID_SPINNER 1146 -#define IDC_PRINCIPAL 1147 -#define IDC_USE_THIS_UID 1148 -#define IDC_USE_NEXT_UID 1149 -#define IDC_TITLE 1150 -#define IDC_VALID_CONFIG_INFO 1151 -#define IDC_SCS 1152 -#define IDC_SCC 1153 -#define IDC_SCM 1154 -#define IDC_BAK 1155 -#define IDC_CLIENT_INSTALLED 1156 -#define IDC_FORCE_ERROR 1157 -#define IDC_ADMIN_UID 1158 -#define IDC_SALVAGE_MSG 1159 -#define IDC_REFORMAT_MSG 1160 -#define IDC_REMOVE_MSG 1161 -#define IDC_CREATE 1162 -#define IDC_CLOSE 1163 -#define IDC_SC_ACTION_MSG2 1164 -#define IDC_SCS_ACTION_MSG 1165 -#define IDC_SCS_STATUS_MSG 1166 -#define IDC_SCC_ACTION_MSG 1167 -#define IDC_SCC_STATUS_MSG 1168 -#define IDC_BUTTON2 1169 -#define IDC_LIST 1171 -#define IDC_CREATE_MSG 1172 -#define IDC_SERVER 1173 -#define IDC_VOLUME 1175 -#define IDC_VOLUME_NAME 1176 -#define IDC_ADVANCED 1177 -#define IDC_LOG_FILE 1178 -#define IDC_NUM_PROCESSES 1179 -#define IDC_TEMP_DIR 1180 -#define IDC_TEMP_DIR_LABEL 1182 -#define IDC_LOG_FILE_LABEL 1184 -#define IDC_NUM_PROCESSES_CHECKBOX 1186 -#define IDC_DAMAGED_VOLUMES 1187 -#define IDC_SMALL_BLOCK_READS 1188 -#define IDC_FORCE_SALVAGE 1189 -#define IDC_FORCE_REBUILD 1190 -#define IDC_LIST_DAMAGED_INODES 1191 -#define IDC_LIST_OWNED_INDOES 1192 -#define IDC_VOLUME_NAME_LABEL 1194 -#define IDC_ADVANCED_FRAME 1195 -#define IDC_PW 1197 -#define IDC_LOG 1198 -#define IDC_LOG_TITLE 1199 -#define IDC_SALVAGE_STATUS 1200 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 326 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1201 -#define _APS_NEXT_SYMED_VALUE 102 -#endif -#endif diff --git a/src/WINNT/afssvrcfg/root_afs_page.cpp b/src/WINNT/afssvrcfg/root_afs_page.cpp deleted file mode 100644 index 95e04c7d2..000000000 --- a/src/WINNT/afssvrcfg/root_afs_page.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void ShowStatusMsg(UINT nMsgID); - - -/* - * EXPORTED FUNCTIONS __________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK RootAfsPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - g_pWiz->SetState(sidSTEP_TEN); - break; - - case IDBACK: - g_pWiz->SetState(sidSTEP_EIGHT); - break; - - case IDC_DONT_CREATE_ROOT_VOLUMES: - g_CfgData.configRootVolumes = CS_DONT_CONFIGURE; - break; - - case IDC_CREATE_ROOT_VOLUMES: - g_CfgData.configRootVolumes = CS_CONFIGURE; - break; - } - break; - - } - - return FALSE; -} - - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.bFirstServer) { - ShowStatusMsg(IDS_MUST_CREATE_ROOT_AFS); - g_CfgData.configRootVolumes = CS_CONFIGURE; - return; - } - - if (g_CfgData.configRootVolumes == CS_ALREADY_CONFIGURED) { - ShowStatusMsg(IDS_ROOT_AFS_ALREADY_EXISTS); - return; - } - - // If the existence of the root volumes could not be determined, we'll - // ask the user if they want to create them if they don't already exist. - if (!g_CfgData.bRootVolumesExistanceKnown) { - SetWndText(hDlg, IDC_ROOT_AFS_QUESTION, IDS_CREATE_ROOT_VOLUMES_IF_NECESSARY_PROMPT); - SetCheck(hDlg, IDC_CREATE_ROOT_VOLUMES); - g_CfgData.configRootVolumes = CS_CONFIGURE; - return; - } - - // Should this step be disabled? Yes, if this machine does - // not have a partition to make root.afs on. - if (!ConfiguredOrConfiguring(g_CfgData.configPartition)) { - ShowStatusMsg(IDS_NO_PARTITION_EXISTS); - EnableStep(g_CfgData.configRootVolumes, FALSE); - return; - } - - // If root.afs exists already but root.cell does not exist, then - // the wizard cannot make root.cell and must disable this option. - // However, since the root volumes don't both exist, we will leave - // this option enabled, and only disable the yes check box. - // TODO: We should handle this better in a future version where we can - // add new messages. The message catalog is frozen for this version - // so we have to handle this case without adding new messages. - if (g_CfgData.bRootAfsExists && !g_CfgData.bRootCellExists) { - EnableWnd(hDlg, IDC_CREATE_ROOT_VOLUMES, FALSE); - SetCheck(hDlg, IDC_DONT_CREATE_ROOT_VOLUMES); - g_CfgData.configRootVolumes = CS_DONT_CONFIGURE; - return; - } - - // Must do this in case it was disabled on the last run through - EnableStep(g_CfgData.configRootVolumes); - - if (g_CfgData.configRootVolumes == CS_DONT_CONFIGURE) - SetCheck(hDlg, IDC_DONT_CREATE_ROOT_VOLUMES); - else - SetCheck(hDlg, IDC_CREATE_ROOT_VOLUMES); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void ShowStatusMsg(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - // Hide the controls that are at the same position as the message - ShowWnd(hDlg, IDC_ROOT_AFS_QUESTION, FALSE); - ShowWnd(hDlg, IDC_CREATE_ROOT_VOLUMES, FALSE); - ShowWnd(hDlg, IDC_DONT_CREATE_ROOT_VOLUMES, FALSE); - - SetWndText(hDlg, IDC_ROOT_AFS_MSG, szMsg); - ShowWnd(hDlg, IDC_ROOT_AFS_MSG); -} - diff --git a/src/WINNT/afssvrcfg/salvage_dlg.cpp b/src/WINNT/afssvrcfg/salvage_dlg.cpp deleted file mode 100644 index 4b30e1362..000000000 --- a/src/WINNT/afssvrcfg/salvage_dlg.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" // Main header for this application -#include "resource.h" -extern "C" { -#include "afs_bosAdmin.h" -} -#include "admin_info_dlg.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static const int DEFAULT_NUM_PROCESSES = 4; -static const char *DEFAULT_LOG_FILE = ""; -static const int NUM_PROCS_BUF_SIZE = 5; -static const int MIN_NUM_PROCESSES = 1; -static const int MAX_NUM_PROCESSES = 32; - -static HWND hDlg = 0; // HWND for this page's dialog -static BOOL bAdvanced; -static TCHAR szPartitionName[25]; -static TCHAR szVolumeName[cchRESOURCE]; -static TCHAR szNumProcesses[NUM_PROCS_BUF_SIZE]; -static TCHAR szTempDir[_MAX_PATH]; -static LPTSTR pszPartitionName; -static LPTSTR pszVolumeName; -static int nNumProcesses; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void OnAdvanced(); -static void UpdateControls(); -static BOOL OnSalvage(); -static DWORD WINAPI Salvage(LPVOID param); - -BOOL CALLBACK SalvageDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL ShowSalvageDlg(HWND hParent, LPCTSTR pszPartitionName) -{ - ASSERT(pszPartitionName); - - lstrcpy(szPartitionName, pszPartitionName); - - int nResult = ModalDialog(IDD_SALVAGE, hParent, (DLGPROC)SalvageDlgProc); - - if (nResult != IDOK) - return FALSE; - - // Create a thread to perform the salvage - DWORD dwThreadID; - g_CfgData.hSalvageThread = CreateThread(0, 0, Salvage, 0, 0, &dwThreadID); - - return (g_CfgData.hSalvageThread != 0); -} - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK SalvageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp(IDD_SALVAGE, hwndDlg, msg, wp, lp)) - return TRUE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDC_VOLUME_NAME: - case IDC_NUM_PROCESSES: - case IDC_LOG_FILE: - case IDC_TEMP_DIR: - if (HIWORD(wp) == EN_CHANGE) - UpdateControls(); - break; - - case IDC_SERVER: - case IDC_PARTITION: - case IDC_VOLUME: - case IDC_NUM_PROCESSES_CHECKBOX: - UpdateControls(); - break; - - case IDC_ADVANCED: - OnAdvanced(); - break; - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - break; - - case IDOK: - if (OnSalvage()) - EndDialog(hDlg, IDOK); - break; - } - break; - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - bAdvanced = TRUE; - - TCHAR szNumProcesses[32]; - _itot(DEFAULT_NUM_PROCESSES, szNumProcesses, 10); - - SetWndText(hDlg, IDC_NUM_PROCESSES, szNumProcesses); - SetCheck(hDlg, IDC_NUM_PROCESSES_CHECKBOX); - SetWndText(hDlg, IDC_LOG_FILE, A2S(DEFAULT_LOG_FILE)); - - // If a partition name isn't selected, then only allow the salvage server option - if (szPartitionName[0] == 0) { - SetEnable(hDlg, IDC_PARTITION, ES_DISABLE); - SetEnable(hDlg, IDC_VOLUME, ES_DISABLE); - SetCheck(hDlg, IDC_SERVER); - } else - SetCheck(hDlg, IDC_PARTITION); - - // Close the Advanced portion of the dialog - OnAdvanced(); -} - -static void OnAdvanced() -{ - static int nOffset = 0; - - bAdvanced = !bAdvanced; - - ShowAndEnable(hDlg, IDC_ADVANCED_FRAME, bAdvanced); - ShowAndEnable(hDlg, IDC_LOG_FILE, bAdvanced); - ShowAndEnable(hDlg, IDC_LOG_FILE_LABEL, bAdvanced); - ShowAndEnable(hDlg, IDC_NUM_PROCESSES, bAdvanced); - ShowAndEnable(hDlg, IDC_TEMP_DIR, bAdvanced); - ShowAndEnable(hDlg, IDC_TEMP_DIR_LABEL, bAdvanced); - ShowAndEnable(hDlg, IDC_NUM_PROCESSES_CHECKBOX, bAdvanced); - ShowAndEnable(hDlg, IDC_DAMAGED_VOLUMES, bAdvanced); - ShowAndEnable(hDlg, IDC_SMALL_BLOCK_READS, bAdvanced); - ShowAndEnable(hDlg, IDC_FORCE_SALVAGE, bAdvanced); - ShowAndEnable(hDlg, IDC_FORCE_REBUILD, bAdvanced); - ShowAndEnable(hDlg, IDC_LIST_DAMAGED_INODES, bAdvanced); - ShowAndEnable(hDlg, IDC_LIST_OWNED_INDOES, bAdvanced); - - // To show or hide the advanced section, we have to resize the dialog - - // Get current position of the dialog - RECT rectDlg; - GetWindowRect(hDlg, &rectDlg); - - // Figure out offset between full dialog and short dialog - if (nOffset == 0) { - // Find the frame containing the things we will hide or show - HWND hFrame = GetDlgItem(hDlg, IDC_ADVANCED_FRAME); - - // Get its dimensions - RECT rectFrame; - GetWindowRect(hFrame, &rectFrame); - - // Find the distance between the bottom of the dialog and the top of the frame - nOffset = rectDlg.bottom - rectFrame.top - 3; - } - - int nCurOffset = nOffset; - - if (!bAdvanced) - nCurOffset *= -1; - - // Adjust dialog position - MoveWindow(hDlg, rectDlg.left, rectDlg.top, rectDlg.right - rectDlg.left, rectDlg.bottom - rectDlg.top + nCurOffset, TRUE); - - SetWndText(hDlg, IDC_ADVANCED, bAdvanced ? IDS_ADVANCED_OPEN : IDS_ADVANCED_CLOSED); -} - -static void UpdateControls() -{ - // Update volume name controls - BOOL bVolume = IsButtonChecked(hDlg, IDC_VOLUME); - ENABLE_STATE es = bVolume ? ES_ENABLE : ES_DISABLE; - SetEnable(hDlg, IDC_VOLUME_NAME, es); - SetEnable(hDlg, IDC_VOLUME_NAME_LABEL, es); - GetWndText(hDlg, IDC_VOLUME_NAME, szVolumeName); - - // Num processes edit control - BOOL bParallel = IsButtonChecked(hDlg, IDC_NUM_PROCESSES_CHECKBOX); - SetEnable(hDlg, IDC_NUM_PROCESSES, (ENABLE_STATE)bParallel); - GetWndText(hDlg, IDC_NUM_PROCESSES, szNumProcesses, NUM_PROCS_BUF_SIZE); - - GetWndText(hDlg, IDC_LOG_FILE, g_CfgData.szSalvageLogFileName, _MAX_PATH); - GetWndText(hDlg, IDC_TEMP_DIR, szTempDir, _MAX_PATH); - - // Should OK button be enabled or disabled? - BOOL bEnable = TRUE; - - if (bVolume) - bEnable = !!lstrlen(szVolumeName); - - if (bEnable && bParallel) - bEnable = !!lstrlen(szNumProcesses); - - SetEnable(hDlg, IDOK, (ENABLE_STATE)bEnable); -} - -/* - * Utility Functions _________________________________________________________________ - * - */ -static BOOL OnSalvage() -{ - if (IsButtonChecked(hDlg, IDC_SERVER)) { - pszPartitionName = 0; - pszVolumeName = 0; - } else if (IsButtonChecked(hDlg, IDC_PARTITION)) { - pszPartitionName = szPartitionName; - pszVolumeName = 0; - } else if (IsButtonChecked(hDlg, IDC_VOLUME)) { - pszPartitionName = szPartitionName; - pszVolumeName = szVolumeName; - } - - nNumProcesses = DEFAULT_NUM_PROCESSES; - if (IsButtonChecked(hDlg, IDC_NUM_PROCESSES_CHECKBOX)) { - nNumProcesses = _ttoi(szNumProcesses); - if ((nNumProcesses < MIN_NUM_PROCESSES) || (nNumProcesses > MAX_NUM_PROCESSES)) { - ShowError(hDlg, 0, IDS_INVALID_NUM_SALVAGE_PROCESSSES); - return FALSE; - } - } - - if (!g_CfgData.bReuseAdminInfo) { - if (!GetAdminInfo(hDlg, GAIO_LOGIN_ONLY)) - return FALSE; - - if (!GetHandles(hDlg)) - return FALSE; - } - - return TRUE; -} - -static DWORD WINAPI Salvage(LPVOID param) -{ - afs_status_t nStatus; - void *hServer; - int nResult; - - nResult = bos_ServerOpen(g_hCell, GetHostnameA(), &hServer, &nStatus); - if (!nResult) { - ShowError(hDlg, nStatus, IDS_BOS_OPEN_FAILED); - return FALSE; - } - - nResult = bos_Salvage(g_hCell, hServer, S2A(pszPartitionName), S2A(pszVolumeName), nNumProcesses, S2A(szTempDir), 0, VOS_NORMAL, - BOS_SALVAGE_DAMAGED_VOLUMES, BOS_SALVAGE_DONT_WRITE_INODES, BOS_SALVAGE_DONT_WRITE_ROOT_INODES, - BOS_SALVAGE_DONT_FORCE_DIRECTORIES, BOS_SALVAGE_DONT_FORCE_BLOCK_READS, &nStatus); - if (!nResult) - ShowError(hDlg, nStatus, IDS_SALVAGE_ERROR); - - bos_ServerClose(hServer, &nStatus); - - g_CfgData.bReuseAdminInfo = nResult; - - return nResult; -} - diff --git a/src/WINNT/afssvrcfg/salvage_results_dlg.cpp b/src/WINNT/afssvrcfg/salvage_results_dlg.cpp deleted file mode 100644 index 41e983917..000000000 --- a/src/WINNT/afssvrcfg/salvage_results_dlg.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -#include "afscfg.h" // Main header for this application -#include "resource.h" -#include "salvage_results_dlg.h" -extern "C" { -#include "afs_bosAdmin.h" -} - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static const int UPDATE_INTERVAL = 5000; // milleseconds -static const int LOG_BUF_SIZE = 25000; // bytes -static const int EDIT_CONTROL_MAX_CHARS = 64000; // Max chars an edit control can hold -static const char *SALVAGE_LOG_FILE_NAME = "SalvageLog.txt"; - -static rwWindowData arwDialog[] = { - { IDC_LOG, raSizeX | raSizeY, MAKELONG(350, 150), 0 }, - { IDC_CLOSE, raMoveX | raMoveY, 0, 0 }, - { 9, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } -}; - - -/* - * Variables _________________________________________________________________ - * - */ -static HWND hDlg = 0; // HWND for this page's dialog -static HWND hLogo; -static afs_status_t nStatus; -static void *hServer; -static int nResult; -static BOOL bSalvageComplete; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void OnClose(); -static void SetMessages(int nStatusMsgID, int nLogMsgID); -static DWORD WINAPI ShowResults(LPVOID param); -static void SaveLogToDisk(char *pszLogBuf, char *pszFileName); -static char *AddCarriageReturnsToLog(char *pszInBuf, char *&pszOutBuf); -static char *GetMaxPartOfLogWeCanShow(char *pszLogBuf); -static BOOL AllocMemory(char *&pszLogBuf, int nBufSize); - -BOOL CALLBACK SalvageResultsDlgProc(HWND hRHS, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -BOOL ShowSalvageResults(HWND hParent) -{ - int nResult = ModalDialog(IDD_SALVAGE_RESULTS, hParent, (DLGPROC)SalvageResultsDlgProc); - - return (nResult == IDOK); -} - - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK SalvageResultsDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp(IDD_SALVAGE_RESULTS, hwndDlg, msg, wp, lp)) - return TRUE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDC_CLOSE: - OnClose(); - break; - - case IDCANCEL: - if (bSalvageComplete) - OnClose(); - } - break; - - case WM_SIZE: - if (lp != 0) - ResizeWindow(hwndDlg, arwDialog, rwaFixupGuts); - break; - } - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions __________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - bSalvageComplete = FALSE; - - ResizeWindow(hDlg, arwDialog, rwaFixupGuts); - - hLogo = GetDlgItem(hDlg, IDC_LOGO); - - AfsAppLib_StartAnimation(hLogo, 8); - - SetMessages(IDS_SALVAGING, IDS_CURRENT_SALVAGE_LOG); - - nResult = bos_ServerOpen(g_hCell, GetHostnameA(), &hServer, &nStatus); - if (!nResult) { - ShowError(hDlg, nStatus, IDS_BOS_OPEN_FAILED); - return; - } - - // Remove the start menu - we do this so the user can't close - // the dialog while salvage is being performed. - DWORD dw; - dw = GetWindowLong(hDlg, GWL_STYLE); - dw &= ~WS_SYSMENU; - SetWindowLong(hDlg, GWL_STYLE, dw); - - // Create a thread to keep the view of the log up to date - DWORD dwThreadID; - HANDLE hThread = CreateThread(0, 0, ShowResults, 0, 0, &dwThreadID); - CloseHandle(hThread); -} - -static void OnClose() -{ - bos_ServerClose(hServer, &nStatus); - - EndDialog(hDlg, IDOK); -} - - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void SetMessages(int nStatusMsgID, int nLogMsgID) -{ - TCHAR szMsgBuf[cchRESOURCE]; - - SetDlgItemText(hDlg, IDC_SALVAGE_STATUS, GetResString(nStatusMsgID, szMsgBuf)); - SetDlgItemText(hDlg, IDC_LOG_TITLE, GetResString(nLogMsgID, szMsgBuf)); -} - -static char *AddCarriageReturnsToLog(char *pszInBuf, char *& pszOutBuf) -{ - ASSERT(pszInBuf); - - char *pInBuf = pszInBuf; - - // How man new lines are there? - int nNumNLs = 0; - - while (*pInBuf) { - if (*pInBuf == '\n') - nNumNLs++; - pInBuf++; - } - - // Allocate enough memory for the log buffer plus CRs plus a NULL - if (!AllocMemory(pszOutBuf, strlen(pszInBuf) + nNumNLs + 1)) - return 0; - - // Copy over the whole buffer, adding \r's as we go. The edit control - // seems to need \r before \n, so we set it up that way. - pInBuf = pszInBuf; - char *pOutBuf = pszOutBuf; - - while (*pInBuf) { - if (*pInBuf == '\n') { - *pOutBuf++ = '\r'; - *pOutBuf++ = '\n'; - } else - *pOutBuf++ = *pInBuf; - - pInBuf++; - } - - *pOutBuf = 0; - - return pszOutBuf; -} - -static char *GetMaxPartOfLogWeCanShow(char *pszLogBuf) -{ - ASSERT(pszLogBuf); - - // Find out how much of the log buffer is in use - int nLen = strlen(pszLogBuf); - - if (nLen < EDIT_CONTROL_MAX_CHARS) - return pszLogBuf; - - // Buffer is bigger than maximum, so find the last full line - // under the limit and return it. - char *psz = pszLogBuf + nLen - EDIT_CONTROL_MAX_CHARS; - - // Make sure we return the beginning of a line - while (*psz && (*psz != '\n')) - psz++; - - if (*psz == '\n') - psz++; - - return psz; -} - -static BOOL AllocMemory(char *&pszLogBuf, int nBufSize) -{ - if (pszLogBuf) - delete pszLogBuf; - - pszLogBuf = new char[nBufSize]; - - if (!pszLogBuf) { - g_LogFile.Write("Failed to allocate memory (%d bytes) for the salvage log buffer.\r\n", nBufSize); - return FALSE; - } - - return TRUE; -} - -static void SaveLogToDisk(char *pszLogBuf, char *pszFileName) -{ - // If no log file was specified by the user, then do nothing - if (!pszFileName[0]) - return; - - FILE *fp = fopen(pszFileName, "w"); - if (!fp) { - ShowError(hDlg, 0, IDS_ERROR_SAVING_SALVAGE_LOG_TO_DISK); - return; - } - - fprintf(fp, "%s", pszLogBuf); - - fclose(fp); -} - -static DWORD WINAPI ShowResults(LPVOID param) -{ - ULONG nBufSize = LOG_BUF_SIZE; - char *pszLogBuf = 0; - char *pszLogBufWithCRs = 0; - DWORD dwWait = WAIT_TIMEOUT; - DWORD rc = 1; - ULONG nLogSize = LOG_BUF_SIZE; - - if (!AllocMemory(pszLogBuf, nBufSize)) - return 0; - - while (dwWait != WAIT_OBJECT_0) { - // Wait for either the salvage thread to terminate or our update - // interval to pass. - dwWait = WaitForSingleObject(g_CfgData.hSalvageThread, UPDATE_INTERVAL); - - // In either case, update the log display for the user - - // Get the salvage log as it currently exists -getlog: nResult = bos_LogGet(hServer, "SalvageLog", &nLogSize, pszLogBuf, &nStatus); - if (!nResult) { - if (nStatus == ADMMOREDATA) { - // If salvage isn't done, then get a bigger buffer than we need to - // prevent future ADMMOREDATA errors. - nBufSize = nLogSize; - if (dwWait != WAIT_OBJECT_0) { - nBufSize += LOG_BUF_SIZE; - nLogSize = nBufSize; - } - if (AllocMemory(pszLogBuf, nBufSize)) - goto getlog; - } - - rc = 0; - break; - } - - // NULL-terminate the log - pszLogBuf[nLogSize] = 0; - - // The edit control that we use to show the log to the user needs \r\n at the end - // of each line, but the salvage log only has \n. We must replace the \n with - // \r\n before showing the log. - if (!AddCarriageReturnsToLog(pszLogBuf, pszLogBufWithCRs)) { - rc = 0; - break; - } - - // The edit control has a limit to the number of characters it can hold. If the log - // is bigger than that limit, then we will show the maximum portion of the end of the - // log that we can fit in the edit control. - char *pszLogToShow = GetMaxPartOfLogWeCanShow(pszLogBufWithCRs); - - // Put it into the edit control so the user can see it - SetDlgItemText(hDlg, IDC_LOG, A2S(pszLogToShow)); - } - - AfsAppLib_StopAnimation(hLogo); - - if (rc) { - SetMessages(IDS_SALVAGE_COMPLETE, IDS_FINAL_SALVAGE_LOG); - SaveLogToDisk(pszLogBufWithCRs, GetSalvageLogFileNameA()); - MsgBox(hDlg, IDS_SALVAGE_COMPLETE, GetAppTitleID(), MB_OK); - } else { - SetMessages(IDS_SALVAGING, IDS_CANT_GET_SALVAGE_LOG); - ShowError(hDlg, nStatus, IDS_CANT_GET_SALVAGE_LOG); - } - - CloseHandle(g_CfgData.hSalvageThread); - - if (pszLogBuf) - delete pszLogBuf; - - if (pszLogBufWithCRs) - delete pszLogBufWithCRs; - - SetEnable(hDlg, IDC_CLOSE); - - bSalvageComplete = TRUE; - - return rc; -} - diff --git a/src/WINNT/afssvrcfg/salvage_results_dlg.h b/src/WINNT/afssvrcfg/salvage_results_dlg.h deleted file mode 100644 index 86e976367..000000000 --- a/src/WINNT/afssvrcfg/salvage_results_dlg.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _SALVAGE_RESULTS_DLG_H_ -#define _SALVAGE_RESULTS_DLG_H_ - -BOOL ShowSalvageResults(HWND hParent); - -#endif // _SALVAGE_RESULTS_DLG_H_ - diff --git a/src/WINNT/afssvrcfg/services_page.cpp b/src/WINNT/afssvrcfg/services_page.cpp deleted file mode 100644 index 50457394d..000000000 --- a/src/WINNT/afssvrcfg/services_page.cpp +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" -#include -#include "admin_info_dlg.h" -#include "get_cur_config.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; -static BOOL bSettingScMachine; - -// These indicate if the named service is currently running, and if the user wants it on -// or off. -static BOOL bFsRunning = FALSE; -static BOOL bFsOn = FALSE; - -static BOOL bDbRunning = TRUE; -static BOOL bDbOn = FALSE; -static BOOL bDbParial = FALSE; - -static BOOL bBakRunning = FALSE; -static BOOL bBakOn = FALSE; - -static BOOL bScsRunning = FALSE; -static BOOL bScsOn = FALSE; - -static BOOL bSccRunning = FALSE; -static BOOL bSccOn = FALSE; - -static TCHAR szScMachine[MAX_MACHINE_NAME_LEN + 1]; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -// From config_server_page.cpp -BOOL Configure(HWND hParent, BOOL& bMustExit); - -static void OnInitDialog(HWND hwndDlg); -static void ShowInitialConfig(); -static void ShowServiceStates(); -static void OnDbService(); -static void OnBakService(); -static void OnFsService(); -static void OnScServer(); -static void OnScClient(); -static void CheckEnableSc(); -static void EnableScMachine(BOOL bEnable = TRUE); -static void OnScMachineChange(); -static void CheckEnableBak(); -static BOOL PrepareToConfig(CONFIG_STATE& state, BOOL bRunning, BOOL bOn, UINT uiCtrlID); -static BOOL PrepareToConfig(); -static void CheckEnableApply(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK ServicesPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (AfsAppLib_HandleHelp(IDD_SERVICES_PAGE, hwndDlg, uMsg, wParam, lParam)) - return TRUE; - - switch (uMsg) { - case WM_INITDIALOG: OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: switch (LOWORD(wParam)) { - case IDC_DB_SERVICE: OnDbService(); - break; - - case IDC_BK_SERVICE: OnBakService(); - break; - - case IDC_FS_SERVICE: OnFsService(); - break; - - case IDC_SCC: OnScClient(); - break; - - case IDC_SCS: OnScServer(); - break; - - case IDC_SC_MACHINE: if (HIWORD(wParam) == EN_CHANGE) { - OnScMachineChange(); - } - break; - - case IDAPPLY: PrepareToConfig(); - break; - } - break; - } - - CheckEnableApply(); - - return FALSE; -} - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - // Show the initial services config - ShowInitialConfig(); - ShowServiceStates(); - - MakeBold(hDlg, IDC_DB_SERVICE); - MakeBold(hDlg, IDC_FS_SERVICE); - MakeBold(hDlg, IDC_BK_SERVICE); - MakeBold(hDlg, IDC_SCC); - MakeBold(hDlg, IDC_SCS); -} - -static void EnableScMachine(BOOL bEnable) -{ - SetEnable(hDlg, IDC_SC_MACHINE_LABEL, (ENABLE_STATE)bEnable); - SetEnable(hDlg, IDC_SC_MACHINE, (ENABLE_STATE)bEnable); - - bSettingScMachine = TRUE; - SetWndText(hDlg, IDC_SC_MACHINE, bEnable ? szScMachine : TEXT("")); - bSettingScMachine = FALSE; -} - -static void ShowInitialConfig() -{ - // FS - bFsRunning = Configured(g_CfgData.configFS); - if (bFsRunning) { - SetCheck(hDlg, IDC_FS_SERVICE); - SetWndText(hDlg, IDC_FS_STATUS_MSG, IDS_FS_RUNNING); - SetWndText(hDlg, IDC_FS_ACTION_MSG, IDS_FS_HOW_TO_STOP); - } else { - SetCheck(hDlg, IDC_FS_SERVICE, FALSE); - SetWndText(hDlg, IDC_FS_STATUS_MSG, IDS_FS_STOPPED); - SetWndText(hDlg, IDC_FS_ACTION_MSG, IDS_FS_HOW_TO_RUN); - } - - bFsOn = bFsRunning; - - // DB - Set2State(hDlg, IDC_DB_SERVICE); - - bDbRunning = Configured(g_CfgData.configDB); - if (bDbRunning) { - SetCheck(hDlg, IDC_DB_SERVICE); - SetWndText(hDlg, IDC_DB_STATUS_MSG, IDS_DB_RUNNING); - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_HOW_TO_STOP); - } else if (bDbParial) { - SetCheck(hDlg, IDC_DB_SERVICE, BST_INDETERMINATE); - SetWndText(hDlg, IDC_DB_STATUS_MSG, IDS_DB_PARTIAL_CONFIG); - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_DETAILS); - ShowWnd(hDlg, IDC_DB_DETAILS); - Set3State(hDlg, IDC_DB_SERVICE); - } else { - SetCheck(hDlg, IDC_DB_SERVICE, FALSE); - SetWndText(hDlg, IDC_DB_STATUS_MSG, IDS_DB_STOPPED); - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_HOW_TO_RUN); - } - - bDbOn = bDbRunning; - - // BK - bBakRunning = Configured(g_CfgData.configBak); - SetEnable(hDlg, IDC_BK_SERVICE, ES_ENABLE); - if (bBakRunning) { - SetCheck(hDlg, IDC_BK_SERVICE); - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_RUNNING); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_HOW_TO_STOP); - } else { - SetCheck(hDlg, IDC_BK_SERVICE, FALSE); - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_STOPPED); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_HOW_TO_RUN); - } - - bBakOn = bBakRunning; - - // SC Server - bScsRunning = Configured(g_CfgData.configSCS); - SetEnable(hDlg, IDC_SCS, ES_ENABLE); - if (bScsRunning) { - SetCheck(hDlg, IDC_SCS); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, IDS_SCS_HOW_TO_STOP); - } else { - SetCheck(hDlg, IDC_SCS, FALSE); - SetWndText(hDlg, IDC_SCS_STATUS_MSG, IDS_SCS_STOPPED); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, IDS_SCS_HOW_TO_RUN); - } - - bScsOn = bScsRunning; - - // SC Client - bSccRunning = Configured(g_CfgData.configSCC); - SetEnable(hDlg, IDC_SCC, ES_ENABLE); - if (bSccRunning) { - SetCheck(hDlg, IDC_SCC); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, IDS_SCC_HOW_TO_STOP); - EnableScMachine(); - lstrcpy(szScMachine, g_CfgData.szSysControlMachine); - } else { - SetCheck(hDlg, IDC_SCC, FALSE); - SetWndText(hDlg, IDC_SCC_STATUS_MSG, IDS_SCC_STOPPED); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, IDS_SCC_HOW_TO_RUN); - EnableScMachine(FALSE); - } - - bSccOn = bSccRunning; -} - -static void ShowServiceStates() -{ - // FS - if (bFsOn) { - if (bFsRunning) - SetWndText(hDlg, IDC_FS_ACTION_MSG, IDS_FS_HOW_TO_STOP); - else - SetWndText(hDlg, IDC_FS_ACTION_MSG, IDS_FS_WILL_RUN); - } else { - if (bFsRunning) - SetWndText(hDlg, IDC_FS_ACTION_MSG, IDS_FS_WILL_STOP); - else - SetWndText(hDlg, IDC_FS_ACTION_MSG, IDS_FS_HOW_TO_RUN); - } - - // DB - switch (GetButtonState(hDlg, IDC_DB_SERVICE)) { - case BST_CHECKED: - if (bDbRunning) - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_HOW_TO_STOP); - else - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_WILL_RUN); - break; - - case BST_UNCHECKED: - if (bDbRunning) - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_WILL_STOP); - else - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_HOW_TO_RUN); - break; - - case BST_INDETERMINATE: - SetWndText(hDlg, IDC_DB_ACTION_MSG, IDS_DB_DETAILS); - break; - } - - // For the ones below, in addition to setting the action message, we also - // set the status message. This is because the status can change to the - // disabled state depending on how other servers are configured. The - // servers before this cannot have their status change except by re- - // configuring them. - - // BK - if (bDbOn) { - if (IsButtonChecked(hDlg, IDC_BK_SERVICE)) { - if (bBakRunning) { - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_RUNNING); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_HOW_TO_STOP); - } else { - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_STOPPED); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_WILL_RUN); - } - } else { - if (bBakRunning) { - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_RUNNING); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_WILL_STOP); - } else { - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_STOPPED); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_HOW_TO_RUN); - } - } - } - - CheckEnableBak(); - - // SC Server - if (bFsOn || bDbOn && !bSccOn) { - if (bScsOn) { - if (bScsRunning) { - SetWndText(hDlg, IDC_SCS_STATUS_MSG, IDS_SCS_RUNNING); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, IDS_SCS_HOW_TO_STOP); - } else { - SetWndText(hDlg, IDC_SCS_STATUS_MSG, IDS_SCS_STOPPED); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, IDS_SCS_WILL_RUN); - } - } else { - if (bScsRunning) { - SetWndText(hDlg, IDC_SCS_STATUS_MSG, IDS_SCS_RUNNING); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, IDS_SCS_WILL_STOP); - } else { - SetWndText(hDlg, IDC_SCS_STATUS_MSG, IDS_SCS_STOPPED); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, IDS_SCS_HOW_TO_RUN); - } - } - } - - // SC Client - if (bFsOn || bDbOn && !bScsOn) { - if (bSccOn) { - if (bSccRunning) { - SetWndText(hDlg, IDC_SCC_STATUS_MSG, IDS_SCC_RUNNING); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, IDS_SCC_HOW_TO_STOP); - } else { - SetWndText(hDlg, IDC_SCC_STATUS_MSG, IDS_SCC_STOPPED); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, IDS_SCC_WILL_RUN); - } - } else { - if (bSccRunning) { - SetWndText(hDlg, IDC_SCC_STATUS_MSG, IDS_SCC_RUNNING); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, IDS_SCC_WILL_STOP); - } else { - SetWndText(hDlg, IDC_SCC_STATUS_MSG, IDS_SCC_STOPPED); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, IDS_SCC_HOW_TO_RUN); - } - } - - - } - - CheckEnableSc(); -} - -static void OnDbService() -{ - bDbOn = GetButtonState(hDlg, IDC_DB_SERVICE) == BST_CHECKED; - - CheckEnableBak(); - CheckEnableSc(); - - ShowServiceStates(); -} - -static void OnBakService() -{ - bBakOn = !bBakOn; - - ShowServiceStates(); -} - -static void OnFsService() -{ - bFsOn = !bFsOn; - - CheckEnableSc(); - - ShowServiceStates(); -} - -static void CheckEnableBak() -{ - // Enable/disable bk service based on db service. - if (!bDbOn) { - SetCheck(hDlg, IDC_BK_SERVICE, FALSE); - SetEnable(hDlg, IDC_BK_SERVICE, ES_DISABLE); - SetWndText(hDlg, IDC_BK_STATUS_MSG, IDS_BK_DISABLED); - SetWndText(hDlg, IDC_BK_ACTION_MSG, IDS_BK_ENABLE); - } else { - SetCheck(hDlg, IDC_BK_SERVICE, bBakOn); - SetEnable(hDlg, IDC_BK_SERVICE, ES_ENABLE); - } -} - -static void CheckEnableSc() -{ - BOOL bSccEnable = TRUE; - UINT uiSccStatusMsg; - UINT uiSccActionMsg; - BOOL bScsEnable = TRUE; - UINT uiScsStatusMsg; - UINT uiScsActionMsg; - - // Disable SCS and SCC? - if (!bFsOn && !bDbOn) { - bScsEnable = FALSE; - uiScsStatusMsg = IDS_SC_DISABLED; - uiScsActionMsg = IDS_SC_ENABLE; - - bSccEnable = FALSE; - uiSccStatusMsg = IDS_SC_DISABLED; - uiSccActionMsg = IDS_SC_ENABLE; - // Disable SCS? - } else if (bSccOn) { - bScsEnable = FALSE; - uiScsStatusMsg = IDS_SC_DISABLED; - uiScsActionMsg = IDS_SCS_ENABLE; - // Disable SCC - } else if (bScsOn) { - bSccEnable = FALSE; - uiSccStatusMsg = IDS_SC_DISABLED; - uiSccActionMsg = IDS_SCC_ENABLE; - } - - // Enable the sc server GUI - if (bScsEnable) { - SetEnable(hDlg, IDC_SCS, ES_ENABLE); - SetCheck(hDlg, IDC_SCS, bScsOn); - } else { // Disable the sc server gui - SetEnable(hDlg, IDC_SCS, ES_DISABLE); - SetCheck(hDlg, IDC_SCS, FALSE); - SetWndText(hDlg, IDC_SCS_STATUS_MSG, uiScsStatusMsg); - SetWndText(hDlg, IDC_SCS_ACTION_MSG, uiScsActionMsg); - } - - // Enable the sc client GUI - if (bSccEnable) { - SetEnable(hDlg, IDC_SCC, ES_ENABLE); - SetCheck(hDlg, IDC_SCC, bSccOn); - EnableScMachine(bSccOn); - } else { // Disable the sc client gui - SetEnable(hDlg, IDC_SCC, ES_DISABLE); - SetCheck(hDlg, IDC_SCC, FALSE); - SetWndText(hDlg, IDC_SCC_STATUS_MSG, uiSccStatusMsg); - SetWndText(hDlg, IDC_SCC_ACTION_MSG, uiSccActionMsg); - EnableScMachine(FALSE); - } -} - -static void OnScServer() -{ - bScsOn = !bScsOn; - - ShowServiceStates(); -} - -static void OnScClient() -{ - bSccOn = !bSccOn; - - ShowServiceStates(); -} - -static void OnScMachineChange() -{ - if (!bSettingScMachine && IsButtonChecked(hDlg, IDC_SCC)) - GetWndText(hDlg, IDC_SC_MACHINE, szScMachine, sizeof(szScMachine) / sizeof(szScMachine[0])); -} - -static BOOL PrepareToConfig(CONFIG_STATE& state, BOOL bRunning, BOOL bOn, UINT uiCtrlID) -{ - BOOL bEnabled = IsWindowEnabled(GetDlgItem(hDlg, uiCtrlID)); - - if (bRunning && (!bOn || !bEnabled)) - state = CS_UNCONFIGURE; - else if (!bRunning && (bOn && bEnabled)) - state = CS_CONFIGURE; - - return (state == CS_UNCONFIGURE) || (state == CS_CONFIGURE); -} - -static BOOL PrepareToConfig() -{ - BOOL bMustExit = FALSE; - - // Use a local copy of the config info to decide what should be configured - // or unconfigured. We do this so that if the user cancels for some reason, - // the real config state will still be what the user expects (what was - // previously read from the system plus the user's changes). - CONFIG_STATE configFS = g_CfgData.configFS; // File server - CONFIG_STATE configDB = g_CfgData.configDB; // Database server - CONFIG_STATE configBak = g_CfgData.configBak; // Backup server - CONFIG_STATE configSCS = g_CfgData.configSCS; // System Control server - CONFIG_STATE configSCC = g_CfgData.configSCC; // System Control client - - BOOL bWorkToDo = FALSE; - - bWorkToDo |= PrepareToConfig(configFS, bFsRunning, bFsOn, IDC_FS_SERVICE); - bWorkToDo |= PrepareToConfig(configDB, bDbRunning, bDbOn, IDC_DB_SERVICE); - bWorkToDo |= PrepareToConfig(configBak, bBakRunning, bBakOn, IDC_BK_SERVICE); - bWorkToDo |= PrepareToConfig(configSCS, bScsRunning, bScsOn, IDC_SCS); - bWorkToDo |= PrepareToConfig(configSCC, bSccRunning, bSccOn, IDC_SCC); - - // If there is nothing to do, then just return TRUE. - if (!bWorkToDo) - return TRUE; - - // If we are unconfiguring the last DB server: - // 1) Warn user and ask for confirmation - // 2) Unconfigure all other servers that are running on this machine - // 3) Tell them (after unconfiguring) that they must run the Wizard if they - // wish to reconfigure the machine, then exit the program. - if (configDB == CS_UNCONFIGURE) { - if (g_CfgData.bLastDBServer) { - int nChoice = MsgBox(hDlg, IDS_LAST_DB_SERVER, GetAppTitleID(), MB_YESNO | MB_ICONEXCLAMATION); - if (nChoice == IDNO) - return FALSE; - - // Make sure these all get unconfigured as well. If they are not configured, then - // nothing bad will happen because the config calls are idempotent. - configFS = CS_UNCONFIGURE; - configBak = CS_UNCONFIGURE; - configSCS = CS_UNCONFIGURE; - configSCC = CS_UNCONFIGURE; - } - } - - // Get additional needed information from the user - GET_ADMIN_INFO_OPTIONS eOptions; - BOOL bDB = (ShouldConfig(configDB) || ShouldUnconfig(configDB)); - - // Use this as our default - eOptions = GAIO_LOGIN_ONLY; - - // If we already have a sys control machine, then we don't need to ask for it - if (ShouldConfig(configSCC)) { - if (szScMachine[0] == 0) { - ShowWarning(hDlg, IDS_MUST_ENTER_SCS_NAME); - return FALSE; - } - lstrcpy(g_CfgData.szSysControlMachine, szScMachine); - } else if (bDB && !g_CfgData.bLastDBServer) { - // We need to know the name of the SCM machine. Are we the SCM machine? - if (bScsRunning) - lstrcpy(g_CfgData.szSysControlMachine, g_CfgData.szHostname); - else - eOptions = GAIO_GET_SCS; - } - - // If doing a login only and the admin info is reusable - if ((eOptions != GAIO_LOGIN_ONLY) || !g_CfgData.bReuseAdminInfo) { - if (!GetAdminInfo(hDlg, eOptions)) - return FALSE; - - // Use the admin info to get new handles - if (!GetHandles(hDlg)) - return FALSE; - } - - // Now that we are ready to configure, copy our local config info - // into the structure that the config engine uses. - g_CfgData.configFS = configFS; - g_CfgData.configDB = configDB; - g_CfgData.configBak = configBak; - g_CfgData.configSCS = configSCS; - g_CfgData.configSCC = configSCC; - - // Configure the server - BOOL bConfigSucceeded = Configure(hDlg, bMustExit); - if (bConfigSucceeded) { - if (bMustExit) { - PostQuitMessage(0); - return TRUE; - } - g_CfgData.bReuseAdminInfo = TRUE; - } else - g_CfgData.szAdminPW[0] = 0; - - // Get current config status - BOOL bCanceled = FALSE; - DWORD dwStatus = GetCurrentConfig(hDlg, bCanceled); - if (dwStatus || bCanceled) { - if (!bCanceled) - ErrorDialog(dwStatus, IDS_CONFIG_CHECK_FAILED); - } - - // Show the initial services config - ShowInitialConfig(); - ShowServiceStates(); - - return TRUE; -} - -static void CheckEnableApply() -{ - BOOL bEnable = FALSE; - - bEnable = (bFsRunning != bFsOn) || (bDbRunning != bDbOn) || (bBakRunning != bBakOn) || - (bScsRunning != bScsOn) || (bSccRunning != bSccOn); - - if (bEnable) - PropSheet_Changed(GetParent(hDlg), hDlg); - else - PropSheet_UnChanged(GetParent(hDlg), hDlg); -} - - diff --git a/src/WINNT/afssvrcfg/status_16.bmp b/src/WINNT/afssvrcfg/status_16.bmp deleted file mode 100644 index bbda7331da2775b7841d350a12afeddaf56da372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23158 zcmeI3O^)0)5QSyHivhez$D27qwnqB^jYJCrf-jJRcs+|=bneqTZRTc^_ll&%pJKK8 zXAIaVWm+OxLnZU37okAKL*t>h@6+y?)#u+W|Z3 z_2d574%ktzANR+0z>a$TxIeZ7cGT;~{jnXeqh3GmkL`dR_4;vtYzOS9*N^*SJ77n> ze%v3;fq(XLX`y1wuAfLDs#w)_Ois`e?_b-+*@(p{F#Ej;GB_2+2K6}&#sqaanZ+wH zGo)(vI4Z{2wH{~HP_(*UcQ_q6eL)>gAtLYe1nHcvoUS09lPjp&9YHF`kkb>Saw-XB zR~MvlOgSAv@5w3iXnJa5ik=H;>507~r%9w9&=OPh)XSRwHqJ$RRD)VQkK#0Gv;#_F zt)6ySGx9Sz8|=}HZu0tFInCy11MP-2{%Ff~yInbaJEuh5#o2vcMBT^PEu?!n33N9n z8vX!|NO}Z^poee(dJJdxD9-LddUnsp>R&V4|L;aSfAFO!ujf+@YQCo%Ij2g{&74Zm z&74Y5!x@(^_1Y-SLGOgC6m&bM6!d-^Wy9*co|#vfSgU6fC zoP5U=J#Auf{eB-B!Jg8fO`IqM1tqP-$rDpJia|jM3zMLjRBO;W&a=PVQrvze1JDu312{4VP`999Ne z>(Zj7a-QPKbU>`2W3f2vn4EQeXmu$)pASQgKtFqX+f?;%+EYO~wkyk#E~lJ!vF9Ay zBKODru^q6ZUO(=S?SLKi`f-132kfZV&rkJd8mHNQ;e}}0ulYRQ1xlRrh4)$Fg=sJ%<+=M35ozF7{IE*QyG$%}7h9!^4;c`rxCtP@fgjHamcLtliGZ>@H!w@H= zVFuHGr*IBpm=>n9&k;e&D<~y#_$mbXW_cix^l%PIkpr!eo;b2DaHuaV=R-IWXgOHT zbize4r$cDqNKRL4Ba7V(_Avtq4|HOQ%#RXe95|kq~4C5V3UNQ;$GO--FVcb6^ z&khWo&T}YKV$R$~%#~q2Y7Uo%OWqx{q@k#XoMmX8oa%>3W^r~yPV1Ik;Auypr>(Q4~2;O@Mfkd=anQyXnm<1@q)0x;+=;ieoX|2S5)8ljvnDq zLo|Y-@YUxb$%7jEDQ9V}N!26AGdW^WyyvUhcArDWy&TF8oUq}%+n26~zRWZ_9Ei=a i*fKkucH)H*=hz0hKkkq1fF1Svaer(F?C9@YKmP-=3LPu} diff --git a/src/WINNT/afssvrcfg/status_256.bmp b/src/WINNT/afssvrcfg/status_256.bmp deleted file mode 100644 index 09e692d44b347c91ff9367f2e920ff59af491bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45878 zcmd^|&6{1-b>@$*6W0xPqq_K`OR6M955ht=-EG`41T5ng#N=t&#zMv>Aqjy}ANG^-&V`4CvPw|b7!L)nip@$yyAd?=bniOKlC&w0!@pi5`7C5$WZ0ER?qw6lB{YA9rb330LTR6rSam~?n zmvZdlxE}qNa_pl06&!nzdj;(-rQN070&N%g+`{LUeD3MCliyDM3O>h|(&tjz^0~n0 z0-sy>9AB}k8}HiFjrUyN&0j$quIG1o?CIwB?CBOLTcB)#vIWW(DBEIR%C}Iyh4Sr} z@8pwm>Mo-EqN{dwyO6zy{O|tmH@oqTH+P%9{5RcM`)}($_|=2mdHcWFz5ljD-T2Vm z-S6{x(cj+PU3%Ny-JaV{cH_H`b@P;;^N;s+^LKN7>|{63u|WA2%D3=&#i3)}F6wqs z-gT!r-sbof$8WlB{3Hiu*<-*n!PyXw_a{RVC{acQI`?v0O zj{o1&s2kO9M~2jm#{6s`Hy(2k8d8|raV~6S8`@SE3!0c#RIN8mt4oMf({enQ*7itB zVMk92_^_<1T6@dYrqcNdr#b2gQz^5&Qu>VNP(>~mIVl$jO;$B^9Q3AsIv@vZKbzJ^ zU2~Np`;*c?G;k6?v>`^lg_1T5&|VFo@^ak~a+Og6X{9(Dq1-I_*2N~KYTfeHFQuM1 z#%e0PgD%y|%`mWJl-9K&H}%R!#-L}=TR2p!Sh_S`P$n2FlInvt48mp<787)upUjUj zlO3eR6qI%(r&?tvYgtkW^c-9?Y+_4gyRf>N2g|xnidH8{Ag*O*Ns|dAO)QpY)!M=l zmH|r0AXq7sSm;NIiJR_KNyFmGi^f(hB02)71|KNvbSPmeMeUW+ zdqW^6+bVE>gtdzeLCVF@!mK|*6FH5Kw3sV;u+O|;Fd_zP6vy)RMrL)SOGBdkDpgOk zsacw<#V{mUsCv(Xn96pe#Xyfr{bS@Qz$0-qVv;M5vNBg_OMwl-uvL^GnveQb%S?*( zwnz`p*0uI2q^rJ*s=3i*GFf!W*g^9|Or0#T*xpH8ARES7A;pD77HDd@CF=}Uic{XQ z$`(umNiVw1*;xss_y}#1p&|{uW=1tEbf>(|Djl3M>J<&fl-q=hmZk#z&^gn0r=z${J@fPs+MP89+ajJ+weLnRdtseDi@LKn;cCs@K>_z)5GQ!xpuVZ)RC zQHZIwE$T0_RXym$FDRp8P#ZZ_Lc<|rtt29fBGq|TZ=Jn%7_BTqRAqY!O=xwp2xW26 z-w9aCW9=GHHq0>VNa7X{WYQ2C5=P@Z6Y%O-h@Bb79={9>VPxG8PfEdXGwafD>kc~O`I zV-q!Gts)n}4%DAv=M(9Xj3g9Ap

2J;@eS@u5VQ022n8IQnYKBBa-XrD>!&ATzr} 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 LUcnqn?z;a6CMQXX diff --git a/src/WINNT/afssvrcfg/sys_control_page.cpp b/src/WINNT/afssvrcfg/sys_control_page.cpp deleted file mode 100644 index 203bb8822..000000000 --- a/src/WINNT/afssvrcfg/sys_control_page.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include "resource.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ -static HWND hDlg = 0; -extern int nOptionButtonSeparationHeight; // Comes from backup_server_page.cpp - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg); -static void CantConfig(UINT nMsgID); -static void EnableSysControlMachine(BOOL bEnable); -static void ShowSysControlMachine(TCHAR *pszSysControlMachine); -static void CheckEnableNextButton(); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Dialog Proc _________________________________________________________________ - * - */ -BOOL CALLBACK SysControlPageDlgProc(HWND hwndDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (WizStep_Common_DlgProc (hwndDlg, msg, wp, lp)) - return FALSE; - - switch (msg) { - case WM_INITDIALOG: - OnInitDialog(hwndDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) { - case IDNEXT: - g_pWiz->SetState(sidSTEP_TWELVE); - break; - - case IDBACK: - g_pWiz->SetState(sidSTEP_TEN); - break; - - case IDC_SYS_CONTROL_SERVER: - g_CfgData.configSCS = CS_CONFIGURE; - g_CfgData.configSCC = CS_DONT_CONFIGURE; - EnableSysControlMachine(FALSE); - break; - - case IDC_SYS_CONTROL_CLIENT: - g_CfgData.configSCS = CS_DONT_CONFIGURE; - g_CfgData.configSCC = CS_CONFIGURE; - EnableSysControlMachine(TRUE); - SetFocus(GetDlgItem(hDlg, IDC_SYS_CONTROL_MACHINE)); - break; - - case IDC_DONT_CONFIGURE: - g_CfgData.configSCS = CS_DONT_CONFIGURE; - g_CfgData.configSCC = CS_DONT_CONFIGURE; - EnableSysControlMachine(FALSE); - break; - - case IDC_SYS_CONTROL_MACHINE: - if (HIWORD(wp) == EN_CHANGE) - CheckEnableNextButton(); - break; - } - break; - - } - - return FALSE; -} - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - -/* - * Event Handler Functions _________________________________________________________________ - * - */ -static void OnInitDialog(HWND hwndDlg) -{ - hDlg = hwndDlg; - - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - g_pWiz->SetButtonText(IDNEXT, IDS_NEXT); - g_pWiz->SetDefaultControl(IDNEXT); - - if (g_CfgData.configSCS == CS_ALREADY_CONFIGURED) { - CantConfig(IDS_ALREADY_A_SYS_CONTROL_SERVER); - return; - } else if (g_CfgData.configSCC == CS_ALREADY_CONFIGURED) { - CantConfig(IDS_ALREADY_A_SYS_CONTROL_CLIENT); - return; - } - - // Should this step be disabled? Yes, if this machine - // is not configured as a database or file server. - if (!ConfiguredOrConfiguring(g_CfgData.configFS) && !ConfiguredOrConfiguring(g_CfgData.configDB)) { - CantConfig(IDS_SC_NOT_A_DB_OR_FS_SERVER); - EnableStep(g_CfgData.configSCS, FALSE); - EnableStep(g_CfgData.configSCC, FALSE); - return; - } - - // Do this in case they were disabled on the last run through - EnableStep(g_CfgData.configSCS); - EnableStep(g_CfgData.configSCC); - - // If this is the first server, then it can't be a SCC - if (g_CfgData.bFirstServer) { - // Disable the SCC step - EnableStep(g_CfgData.configSCC, FALSE); - - // Hide the SCC controls - ShowWnd(hDlg, IDC_SYS_CONTROL_CLIENT_DESC, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_CLIENT, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE_LABEL, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE, FALSE); - - // Move remaining controls to fill the holes left from - // hiding the SCC controls - - // Get position of the "Do not configure" option button; we will position - // the other controls relative to this one - RECT rectDNC; - GetWindowRect(GetDlgItem(hDlg, IDC_DONT_CONFIGURE), &rectDNC); - - // Get position of the SCS option button - RECT rectSCS; - GetWindowRect(GetDlgItem(hDlg, IDC_SYS_CONTROL_SERVER), &rectSCS); - - // Calc offset between the two - int nOffset = rectDNC.top - rectSCS.top; - - // Separate the two option controls - nOffset -= nOptionButtonSeparationHeight; - - // Move the controls - MoveWnd(hDlg, IDC_SYS_CONTROL_MACHINE_QUESTION, 0, nOffset); - MoveWnd(hDlg, IDC_SYS_CONTROL_SERVER, 0, nOffset); - - SetWndText(hDlg, IDC_TITLE, IDS_CONFIG_SCS); - SetWndText(hDlg, IDC_SYS_CONTROL_MACHINE_QUESTION, IDS_SYS_CONTROL_SERVER_ONLY_MSG); - SetWndText(hDlg, IDC_DONT_CONFIGURE, IDS_DONT_CONFIG_SYS_CONTROL_SERVER_MSG); - } - - if (g_CfgData.configSCS == CS_CONFIGURE) - SetCheck(hDlg, IDC_SYS_CONTROL_SERVER); - else if (g_CfgData.configSCC == CS_CONFIGURE) { - SetCheck(hDlg, IDC_SYS_CONTROL_CLIENT); - EnableSysControlMachine(TRUE); - } else - SetCheck(hDlg, IDC_DONT_CONFIGURE); -} - -/* - * Utility Functions _________________________________________________________________ - * - */ -static void CantConfig(UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE_QUESTION, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_SERVER, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_CLIENT, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE_LABEL, FALSE); - ShowWnd(hDlg, IDC_SYS_CONTROL_MACHINE, FALSE); - ShowWnd(hDlg, IDC_DONT_CONFIGURE, FALSE); - - ShowWnd(hDlg, IDC_CANT_CONFIG_MSG); - SetWndText(hDlg, IDC_CANT_CONFIG_MSG, szMsg); -} - -static void EnableSysControlMachine(BOOL bEnable) -{ - EnableWnd(hDlg, IDC_SYS_CONTROL_MACHINE_LABEL, bEnable); - EnableWnd(hDlg, IDC_SYS_CONTROL_MACHINE, bEnable); - - if (bEnable) - ShowSysControlMachine(g_CfgData.szSysControlMachine); - else - ShowSysControlMachine(TEXT("")); - - CheckEnableNextButton(); -} - -static void ShowSysControlMachine(TCHAR *pszSysControlMachine) -{ - SetWndText(hDlg, IDC_SYS_CONTROL_MACHINE, pszSysControlMachine); -} - -static void CheckEnableNextButton() -{ - BOOL bEnable = TRUE; - - if (IsButtonChecked(hDlg, IDC_SYS_CONTROL_CLIENT)) { - GetWndText(hDlg, IDC_SYS_CONTROL_MACHINE, g_CfgData.szSysControlMachine, MAX_MACHINE_NAME_LEN); - - if (lstrlen(g_CfgData.szSysControlMachine) == 0) - bEnable = FALSE; - } - - if (bEnable) - g_pWiz->EnableButtons(BACK_BUTTON | NEXT_BUTTON); - else - g_pWiz->EnableButtons(BACK_BUTTON); -} - diff --git a/src/WINNT/afssvrcfg/toolbox.cpp b/src/WINNT/afssvrcfg/toolbox.cpp deleted file mode 100644 index fde339d1f..000000000 --- a/src/WINNT/afssvrcfg/toolbox.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES ___________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include -#include -#include "toolbox.h" - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -void SetEnable(HWND hDlg, UINT nControl, ENABLE_STATE eState) -{ - HWND hControl = GetDlgItem(hDlg, nControl); - - BOOL bEnable; - - switch (eState) { - case ES_ENABLE: bEnable = TRUE; - break; - - case ES_DISABLE: bEnable = FALSE; - break; - - case ES_TOGGLE: bEnable = !IsWindowEnabled(hControl); - break; - } - - EnableWindow(hControl, bEnable); -} - -void SetElapsedTime(HWND hwnd, DWORD nCtrlID, ULONG ulMin, ULONG ulMax, ULONG ulTime) -{ - SYSTEMTIME stMin; - SET_ELAPSED_TIME_FROM_SECONDS (&stMin, ulMin); - - SYSTEMTIME stMax; - SET_ELAPSED_TIME_FROM_SECONDS (&stMax, ulMax); - - SYSTEMTIME st; - SET_ELAPSED_TIME_FROM_SECONDS (&st, ulTime); - - HWND hElapsed = ::GetDlgItem(hwnd, nCtrlID); - EL_SetRange (hElapsed, &stMin, &stMax); - EL_SetTime (hElapsed, &st); -} - -void GetElapsedTime(HWND hwnd, DWORD nCtrlID, DWORD& dwTime) -{ - SYSTEMTIME stFinal; - - HWND hElapsed = ::GetDlgItem(hwnd, nCtrlID); - EL_GetTime (hElapsed, &stFinal); - - dwTime = GET_SECONDS_FROM_ELAPSED_TIME(&stFinal); -} - -LPCTSTR SecondsToElapsedTime(UINT uiNumSeconds) -{ - static TCHAR szTime[64], sz[32]; - - *szTime = 0; - *sz = 0; - - int nHours, nMinutes, nSeconds; - - nHours = uiNumSeconds / 3600; - nMinutes = (uiNumSeconds % 3600) / 60; - nSeconds = (uiNumSeconds % 3600) % 60; - - if (nHours) - _stprintf(szTime, TEXT("%d hours"), nHours); - - if (nMinutes) { - if (nHours) - lstrcat(szTime, TEXT(", ")); - _stprintf(sz, TEXT("%d minutes"), nMinutes); - lstrcat(szTime, sz); - } - - if (nSeconds) { - if (nHours || nMinutes) - lstrcat(szTime, TEXT(", ")); - _stprintf(sz, TEXT("%d seconds"), nSeconds); - lstrcat(szTime, sz); - } - - return szTime; -} - -BOOL IsButtonChecked(HWND hDlg, UINT uiCtrlID) -{ - return SendMessage(GetDlgItem(hDlg, uiCtrlID), BM_GETCHECK, 0, 0) == BST_CHECKED; -} - -int GetButtonState(HWND hDlg, UINT uiCtrlID) -{ - return SendMessage(GetDlgItem(hDlg, uiCtrlID), BM_GETCHECK, 0, 0); -} - -void SetCheck(HWND hDlg, UINT uiCtrlID, int nChecked) -{ - SendMessage(GetDlgItem(hDlg, uiCtrlID), BM_SETCHECK, nChecked, 0); -} - -TCHAR *GetResString(UINT nMsgID, TCHAR *pszMsg, UINT nLen) -{ - GetString(pszMsg, nMsgID, nLen); - - return pszMsg; -} - -void ShowWnd(HWND hDlg, UINT uiCtrlID, BOOL bShow) -{ - ShowWindow(GetDlgItem(hDlg, uiCtrlID), bShow ? SW_SHOW : SW_HIDE); -} - -void EnableWnd(HWND hDlg, UINT uiCtrlID, BOOL bEnable) -{ - EnableWindow(GetDlgItem(hDlg, uiCtrlID), bEnable); -} - -void SetWndText(HWND hDlg, UINT uiCtrlID, LPCTSTR pszMsg) -{ - SetWindowText(GetDlgItem(hDlg, uiCtrlID), pszMsg); -} - -void SetWndText(HWND hDlg, UINT uiCtrlID, UINT nMsgID) -{ - TCHAR szMsg[cchRESOURCE]; - - GetString(szMsg, nMsgID); - - SetWndText(hDlg, uiCtrlID, szMsg); -} - -TCHAR *GetWndText(HWND hDlg, UINT uiCtrlID, TCHAR *pszTextBuffer, int nTextLen) -{ - GetWindowText(GetDlgItem(hDlg, uiCtrlID), pszTextBuffer, nTextLen); - - return pszTextBuffer; -} - -void ForceUpdateWindow(HWND hWnd) -{ - InvalidateRect(hWnd, 0, TRUE); - UpdateWindow(hWnd); -} - -void ForceUpdateWindow(HWND hDlg, UINT uiCtrlID) -{ - ForceUpdateWindow(GetDlgItem(hDlg, uiCtrlID)); -} - -int AddLBString(HWND hDlg, UINT uiCtrlID, LPCTSTR pszString) -{ - return SendMessage(GetDlgItem(hDlg, uiCtrlID), LB_ADDSTRING, 0, (LONG)pszString); -} - -int ClearListBox(HWND hDlg, UINT uiCtrlID) -{ - return SendMessage(GetDlgItem(hDlg, uiCtrlID), LB_RESETCONTENT, 0, 0); -} - -void SetUpDownRange(HWND hDlg, UINT uiCtrlID, int nMinVal, int nMaxVal) -{ - SendMessage(GetDlgItem(hDlg, uiCtrlID), UDM_SETRANGE, 0, (LPARAM)MAKELONG((short)nMaxVal, (short)nMinVal)); -} - -void MakeBold(HWND hWnd) -{ - HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0); - - LOGFONT logFont; - - GetObject(hFont, sizeof(LOGFONT), &logFont); - - logFont.lfWeight = FW_BOLD; - - HFONT hNewFont = CreateFontIndirect(&logFont); - ASSERT(hNewFont); - - SendMessage(hWnd, WM_SETFONT, (WPARAM)hNewFont, MAKELPARAM(TRUE, 0)); -} - -int MsgBox(HWND hParent, UINT uiTextID, UINT uiCaptionID, UINT uType) -{ - TCHAR szText[cchRESOURCE]; - TCHAR szCaption[cchRESOURCE]; - - GetString(szText, uiTextID); - GetString(szCaption, uiCaptionID); - - return MessageBox(hParent, szText, szCaption, uType); -} - -void HideAndDisable(HWND hDlg, UINT uiCtrlID) -{ - ShowWnd(hDlg, uiCtrlID, SW_HIDE); - SetEnable(hDlg, uiCtrlID, ES_DISABLE); -} - -void ShowAndEnable(HWND hDlg, UINT uiCtrlID, BOOL bShowAndEnable) -{ - int nShow = SW_SHOW; - ENABLE_STATE es = ES_ENABLE; - - if (!bShowAndEnable) { - nShow = SW_HIDE; - es = ES_DISABLE; - } - - ShowWnd(hDlg, uiCtrlID, nShow); - SetEnable(hDlg, uiCtrlID, es); -} - -void MoveWnd(HWND hDlg, UINT nCtrlID, int xOffset, int yOffset) -{ - HWND hCtrl = GetDlgItem(hDlg, nCtrlID); - - RECT rect; - GetWindowRect(hCtrl, &rect); - - POINT p1, p2; - p1.x = rect.left; - p1.y = rect.top; - p2.x = rect.right; - p2.y = rect.bottom; - - ScreenToClient(hDlg, &p1); - ScreenToClient(hDlg, &p2); - - rect.left = p1.x; - rect.top = p1.y; - rect.right = p2.x; - rect.bottom = p2.y; - - MoveWindow(hCtrl, rect.left + xOffset, rect.top + yOffset, rect.right - rect.left, rect.bottom - rect.top, TRUE); -} - diff --git a/src/WINNT/afssvrcfg/toolbox.h b/src/WINNT/afssvrcfg/toolbox.h deleted file mode 100644 index 37e5de5e3..000000000 --- a/src/WINNT/afssvrcfg/toolbox.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _TOOLBOX_H_ -#define _TOOLBOX_H_ - -enum ENABLE_STATE { ES_DISABLE, ES_ENABLE, ES_TOGGLE }; - -void SetEnable(HWND hDlg, UINT nControl, ENABLE_STATE eState = ES_ENABLE); - -void SetElapsedTime(HWND hwnd, DWORD nCtrlID, ULONG ulMin, ULONG ulMax, ULONG ulTime); -void GetElapsedTime(HWND hwnd, DWORD nCtrlID, DWORD& dwTime); -LPCTSTR SecondsToElapsedTime(UINT uiNumSeconds); - -void ShowWnd(HWND hDlg, UINT uiCtrlID, BOOL bShow = TRUE); -void EnableWnd(HWND hDlg, UINT uiCtrlID, BOOL bEnable = TRUE); -void HideAndDisable(HWND hDlg, UINT uiCtrlID); -void ShowAndEnable(HWND hDlg, UINT uiCtrlID, BOOL bShowAndEnable = TRUE); -void MoveWnd(HWND hDlg, UINT nCtrlID, int xOffset, int yOffset); - -void SetWndText(HWND hDlg, UINT uiCtrlID, LPCTSTR pszMsg); -void SetWndText(HWND hDlg, UINT uiCtrlID, UINT uiMsgID); -TCHAR *GetWndText(HWND hDlg, UINT uiCtrlID, TCHAR *pszTextBuffer, int nTextLen = cchRESOURCE); -inline int GetWndTextLength(HWND hDlg, UINT uiCtrlID) { return GetWindowTextLength(GetDlgItem(hDlg, uiCtrlID)); } - -void ForceUpdateWindow(HWND hWnd); -void ForceUpdateWindow(HWND hDlg, UINT uiCtrlID); - -void SetCheck(HWND hDlg, UINT uiCtrlID, BOOL bChecked = TRUE); -BOOL IsButtonChecked(HWND hDlg, UINT uiCtrlID); -int GetButtonState(HWND hDlg, UINT uiCtrlID); - -int AddLBString(HWND hDlg, UINT uiCtrlID, LPCTSTR pszString); -int ClearListBox(HWND hDlg, UINT uiCtrlID); - -TCHAR *GetResString(UINT nMsgID, TCHAR *pszMsg, UINT nLen = cchRESOURCE); - -void ShowWnd(HWND hDlg, UINT uiCtrlID, BOOL bShow); - -void SetUpDownRange(HWND hDlg, UINT uiCtrlID, int nMinVal, int nMaxVal); - -void MakeBold(HWND hWnd); -inline void MakeBold(HWND hDlg, UINT uiCtrlID) { MakeBold(GetDlgItem(hDlg, uiCtrlID)); } - -int MsgBox(HWND hParent, UINT uiTextID, UINT uiCaptionID, UINT uiType); - - -#endif // _TOOLBOX_H_ - diff --git a/src/WINNT/afssvrcfg/validation.cpp b/src/WINNT/afssvrcfg/validation.cpp deleted file mode 100644 index 0bfb75a19..000000000 --- a/src/WINNT/afssvrcfg/validation.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* -* INCLUDES _________________________________________________________________ -* -*/ -#include "afscfg.h" -#include "resource.h" -#include "validation.h" - - -/* - * DEFINITIONS _________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -static BOOL CheckAfsPartitionName(TCHAR *pszInput, int &nErrorMsgResID); -static BOOL CheckAfsCellName(TCHAR *pszInput, int &nErrorMsgResID); -static BOOL CheckAfsPassword(TCHAR *pszInput, int &nErrorMsgResID); -static BOOL CheckAfsUid(TCHAR *pszInput, int &nErrorMsgResID); -static BOOL CheckAfsServerName(TCHAR *pszInput, int &nErrorMsgResID); -static void ShowError(int nErrorMsgResID); - - -/* - * EXPORTED FUNCTIONS _________________________________________________________________ - * - */ -BOOL Validation_IsValid(TCHAR *pszInput, VALIDATION_TYPE type, BOOL bShowError) -{ - BOOL bValid; - int nErrorMsgResID; - - switch (type) { - case VALID_AFS_PARTITION_NAME: bValid = CheckAfsPartitionName(pszInput, nErrorMsgResID); - break; - - case VALID_AFS_CELL_NAME: bValid = CheckAfsCellName(pszInput, nErrorMsgResID); - break; - - case VALID_AFS_PASSWORD: bValid = CheckAfsPassword(pszInput, nErrorMsgResID); - break; - - case VALID_AFS_UID: bValid = CheckAfsUid(pszInput, nErrorMsgResID); - break; - - case VALID_AFS_SERVER_NAME: bValid = CheckAfsServerName(pszInput, nErrorMsgResID); - break; - - default: nErrorMsgResID = 0; - ASSERT(FALSE); - return FALSE; - } - - if (!bValid && bShowError) - ShowError(nErrorMsgResID); - - return bValid; -} - - - -/* - * STATIC FUNCTIONS _________________________________________________________________ - * - */ - - /* - * Utility Functions _________________________________________________________________ - * - */ -static BOOL CheckAfsPartitionName(TCHAR *pszPartitionName, int &nErrorMsgResID) -{ - short bIsValid; - afs_status_t nStatus; - - char *pszName = new char[strlen("/vicpe") + lstrlen(pszPartitionName) + 1]; - if (!pszName) { - ASSERT(FALSE); - return TRUE; - } - - strcpy(pszName, "/vicep"); - strcat(pszName, S2A(pszPartitionName)); - - int nResult = cfg_HostPartitionNameValid(pszName, &bIsValid, &nStatus); - ASSERT(nResult); - - if (!bIsValid) - nErrorMsgResID = IDS_PARTITION_NAME_VALIDATION_TYPE; - - delete pszName; - - return bIsValid; -} - -static BOOL CheckAfsCellName(TCHAR *pszInput, int &nErrorMsgResID) -{ - nErrorMsgResID = 0; - - return TRUE; -} - -static BOOL CheckAfsPassword(TCHAR *pszInput, int &nErrorMsgResID) -{ - nErrorMsgResID = 0; - - return TRUE; -} - -static BOOL CheckAfsUid(TCHAR *pszInput, int &nErrorMsgResID) -{ - nErrorMsgResID = 0; - - return TRUE; -} - -static BOOL CheckAfsServerName(TCHAR *pszInput, int &nErrorMsgResID) -{ - nErrorMsgResID = 0; - - return TRUE; -} - -static void ShowError(int nErrorMsgResID) -{ - Message(MB_ICONSTOP | MB_OK, GetAppTitleID(), IDS_VALIDATION_ERROR_TEMPLATE, TEXT("%m%m"), nErrorMsgResID, nErrorMsgResID); -} diff --git a/src/WINNT/afssvrcfg/validation.h b/src/WINNT/afssvrcfg/validation.h deleted file mode 100644 index 1621763fc..000000000 --- a/src/WINNT/afssvrcfg/validation.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _VALIDATION_H_ -#define _VALIDATION_H_ - - -enum VALIDATION_TYPE { - VALID_AFS_PARTITION_NAME, - VALID_AFS_CELL_NAME, - VALID_AFS_PASSWORD, - VALID_AFS_UID, - VALID_AFS_SERVER_NAME, - VALID_FILENAME, - VALID_PATH -}; - - -BOOL Validation_IsValid(TCHAR *pszInput, VALIDATION_TYPE type, BOOL bShowErorr = TRUE); - -#endif // _VALIDATION_H_ diff --git a/src/WINNT/afssvrcfg/volume_utils.cpp b/src/WINNT/afssvrcfg/volume_utils.cpp deleted file mode 100644 index 039176a38..000000000 --- a/src/WINNT/afssvrcfg/volume_utils.cpp +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * Includes _________________________________________________________________ - * - */ -extern "C" { -#include -#include -} - -#include "afscfg.h" -#include -#include "volume_utils.h" -#include "resource.h" -#include "partition_utils.h" - - -/* - * Definitions _________________________________________________________________ - * - */ -static HWND m_hDriveList = 0; - -//static const UINT MAX_DRIVES = 26; -static const UINT DISK_DRIVE_IMAGE = 0; -static const UINT DISABLED_DISK_DRIVE_IMAGE = 1; -static const UINT DISK_DRIVE_WITH_WARNING_IMAGE = 2; -static const UINT AFS_DISK_DRIVE_IMAGE = 3; - - -struct DRIVE_INFO -{ - TCHAR szRootDir[4]; // Drive letter plus colon plus slash, ex: "c:\" - TCHAR szVolName[256]; - TCHAR szSize[32]; // Drive size in megabytes - DWORD dwFlags; - BOOL bDisabled; // Disabled is TRUE if partition not suitable for AFS - UINT nImage; // Image to show in the FastList -}; - - -/* - * Prototypes ____________________________________________________________________ - * - */ - - -/* - * Static Functions _________________________________________________________________ - * - */ -LPTSTR GetString(UINT nStrID) -{ - static TCHAR szText[cchRESOURCE]; - - GetString(szText, nStrID); - - return szText; -} - -static BOOL SetupImageLists() -{ - HIMAGELIST hiList = ImageList_Create(16, 16, TRUE, 1, 1); - - AfsAppLib_AddToImageList(hiList, IDI_DISK_DRIVE, FALSE); - AfsAppLib_AddToImageList(hiList, IDI_DISABLED_DISK_DRIVE, FALSE); - AfsAppLib_AddToImageList(hiList, IDI_DISK_DRIVE_WITH_WARNING, FALSE); - AfsAppLib_AddToImageList(hiList, IDI_AGGREGATE, FALSE); - - FastList_SetImageLists(m_hDriveList, hiList, 0); - - return TRUE; -} - -static void AddColumn(int nWidth, LPCTSTR pszTitle) -{ - static int nCol = 1; - FASTLISTCOLUMN col; - - col.dwFlags = FLCF_JUSTIFY_LEFT; - col.cxWidth = nWidth; - lstrcpy(col.szText, pszTitle); - - FastList_SetColumn(m_hDriveList, nCol++, &col); -} - -static void SetupDriveListCols() -{ - // Set width of cols based on width of the list - RECT rect; - GetClientRect(m_hDriveList, &rect); - - int nWidth = rect.right - rect.left; - - // If the width of the list is too small to show all - // three cols in a reasonable size that will fit without - // scrolling, then set the width to the ideal size and - // make the user scroll. - if (nWidth < 150) // Minimum we will accept - nWidth = 370; // The ideal size - - AddColumn(50, GetString(IDS_DRIVE)); - AddColumn(nWidth - 100, GetString(IDS_NAME_OR_ERROR)); - AddColumn(50, GetString(IDS_SIZE)); -} - -static LPCTSTR GetDriveSizeAsString(LPCTSTR pszRootDir) -{ - _ASSERTE(pszRootDir != 0); - - ULARGE_INTEGER liDummy; - ULARGE_INTEGER liSize; - static TCHAR szSize[64]; - - *szSize = 0; - - // Get partition size in bytes - if (GetDiskFreeSpaceEx(pszRootDir, &liDummy, &liSize, &liDummy)) { - // Covert to megabytes - ULONG nSize = (ULONG)(liSize.QuadPart / (1024 * 1024)); - // Convert to a string - _ultot(nSize, szSize, 10); - lstrcat(szSize, TEXT(" MB")); - } - - return szSize; -} - -static BOOL DoesDriveContainData(LPCTSTR pszDriveRootDir) -{ - TCHAR szSearchSpec[16]; - WIN32_FIND_DATA findData; - - _stprintf(szSearchSpec, TEXT("%s*.*"), pszDriveRootDir); - - HANDLE hFind = FindFirstFile(szSearchSpec, &findData); - if (hFind == INVALID_HANDLE_VALUE) - return FALSE; - - FindClose(hFind); - - return TRUE; -} - -static BOOL OnlyHasFolder(LPCTSTR pszRootDir, LPCTSTR pszFolder) -{ - TCHAR szSearchSpec[MAX_PATH]; - WIN32_FIND_DATA findData; - BOOL bFound = FALSE; - - _stprintf(szSearchSpec, TEXT("%s*.*"), pszRootDir); - - // If there is nothing in the root dir, then return FALSE - HANDLE hFind = FindFirstFile(szSearchSpec, &findData); - if (hFind == INVALID_HANDLE_VALUE) - return bFound; - - // Is the first thing on the disk the recycle bin? If not - // the the recycle bin is not the only thing on the disk. - if (_tcsicmp(findData.cFileName, pszFolder) == 0) { - // Is anything else on the disk? - if (!FindNextFile(hFind, &findData)) - bFound = TRUE; - } - - FindClose(hFind); - - return bFound; -} - -static BOOL DriveHasRecycleBin(LPCTSTR pszDriveRootDir) -{ - if (OnlyHasFolder(pszDriveRootDir, TEXT("Recycled"))) - return TRUE; - - if (OnlyHasFolder(pszDriveRootDir, TEXT("Recycle Bin"))) - return TRUE; - - if (OnlyHasFolder(pszDriveRootDir, TEXT("Recycler"))) - return TRUE; - - return FALSE; -} - -static BOOL DoesDriveContainNT(LPCTSTR pszDriveRootDir) -{ - UINT nBufSize = MAX_PATH; - LPTSTR pszWinDir = 0; - - while (!pszWinDir) { - pszWinDir = new TCHAR[nBufSize]; - - UINT nWinDirLen = GetWindowsDirectory(pszWinDir, nBufSize); - - if (nWinDirLen > nBufSize) { - nBufSize = nWinDirLen; - delete [] pszWinDir; - pszWinDir = 0; - } - } - - BOOL bNT = (_tcsncmp(pszDriveRootDir, pszWinDir, 3) == 0); - - delete [] pszWinDir; - - return bNT; -} - -static BOOL ValidateDrive(BOOL bInvalid, UINT uiErrorMsgID, LPTSTR pszErrorStr) -{ - if (!bInvalid) - return FALSE; - - if (*pszErrorStr) - lstrcat(pszErrorStr, GetString(IDS_ERROR_SEP)); - lstrcat(pszErrorStr, GetString(uiErrorMsgID)); - - return TRUE; -} - -static BOOL GetDriveInfo(TCHAR chDrive, DRIVE_INFO& di) -{ - DWORD dwDummy; - TCHAR szFileSys[64]; - DWORD dwDriveFlags; - - _stprintf(di.szRootDir, TEXT("%c:\\"), chDrive); - - if (GetDriveType(di.szRootDir) != DRIVE_FIXED) - return FALSE; - - if (!GetVolumeInformation(di.szRootDir, di.szVolName, sizeof(di.szVolName), 0, &dwDummy, &dwDriveFlags, szFileSys, sizeof(szFileSys))) - return FALSE; - - TCHAR szError[256] = TEXT(""); - - BOOL bInvalid = FALSE, bHasData = FALSE; - BOOL bIsAfs = ValidateDrive(IsAnAfsPartition(di.szRootDir), IDS_ERROR_DRIVE_ALREADY_HAS_AFS, szError); - if (!bIsAfs) { - bInvalid |= ValidateDrive(dwDriveFlags & FS_VOL_IS_COMPRESSED, IDS_ERROR_DRIVE_COMPRESSED, szError); - bInvalid |= ValidateDrive(lstrcmp(szFileSys, TEXT("NTFS")) != 0, IDS_ERROR_FS_IS_NOT_NTFS, szError); - - /* - * We are no longer going to require that afs drives be empty; we will give a warning instead. - * - * bInvalid |= ValidateDrive(DoesDriveContainNT(di.szRootDir), IDS_ERROR_DRIVE_CONTAINS_NT, szError); - * bRecycle = ValidateDrive(DriveHasRecycleBin(di.szRootDir), IDS_WARNING_DRIVE_HAS_RECYCLE_BIN, szError); - */ - if (!bInvalid) - bHasData = ValidateDrive(DoesDriveContainData(di.szRootDir), IDS_ERROR_DRIVE_HAS_DATA, szError); - } - - if (*szError) { - lstrcpy(di.szVolName, szError); - - if (bIsAfs) - di.nImage = AFS_DISK_DRIVE_IMAGE; - else if (bHasData) - di.nImage = DISK_DRIVE_WITH_WARNING_IMAGE; // Treat this as a warning - else - di.nImage = DISABLED_DISK_DRIVE_IMAGE; - - if (bIsAfs || bInvalid) { - di.bDisabled = TRUE; - di.dwFlags |= FLIF_DISALLOW_SELECT; - } - } else { - di.nImage = DISK_DRIVE_IMAGE; - - if (lstrlen(di.szVolName) == 0) - GetString(di.szVolName, IDS_VOLUME_HAS_NO_NAME); - } - - lstrncpy(di.szSize, GetDriveSizeAsString(di.szRootDir), sizeof(di.szSize)); - - return TRUE; -} - -static BOOL FillDriveList() -{ - DRIVE_INFO di; - - TCHAR chDrive = TEXT('A'); - DWORD dwDrives = GetLogicalDrives(); - - // This failing is not fatal to this function - // Make sure the partition table is up to date - afs_status_t nStatus; - int nResult = ReadPartitionTable(&nStatus); - ASSERT(nResult); - - while (dwDrives) { - if (dwDrives & 1) { - memset(&di, 0, sizeof(di)); - - if (GetDriveInfo(chDrive, di)) { - FASTLISTADDITEM ai = { 0, di.nImage, IMAGE_NOIMAGE, di.szRootDir, di.bDisabled, di.dwFlags }; - HLISTITEM hItem = FastList_AddItem(m_hDriveList, &ai); - FastList_SetItemText(m_hDriveList, hItem, 1, di.szVolName); - FastList_SetItemText(m_hDriveList, hItem, 2, di.szSize); - } - } - - chDrive++; - dwDrives >>= 1; - } - - return TRUE; -} - -static int CALLBACK DriveListSortFunc(HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - _ASSERTE(hList == m_hDriveList); - - // Ignore the first call which is only used to initialize static data - if (!hItem1 && !hItem2) - return 0; - - // The lpItem vars contain 1 if the item is disabled, 0 if not - // Show enabled items before disabled items - if (lpItem1 != lpItem2) - return lpItem1 - lpItem2; - - LPCTSTR pszItem1 = FastList_GetItemText(m_hDriveList, hItem1, 0); - LPCTSTR pszItem2 = FastList_GetItemText(m_hDriveList, hItem2, 0); - - return lstrcmp(pszItem1, pszItem2); -} - - -/* - * Exported Functions _________________________________________________________________ - * - */ -void SetupDriveList(HWND driveList) -{ - m_hDriveList = driveList; - - SetupImageLists(); - - SetupDriveListCols(); - - FastList_SetSortFunction(m_hDriveList, DriveListSortFunc); -} - -BOOL UpdateDriveList() -{ - FastList_RemoveAll(m_hDriveList); - - return FillDriveList(); -} - diff --git a/src/WINNT/afssvrcfg/volume_utils.h b/src/WINNT/afssvrcfg/volume_utils.h deleted file mode 100644 index 9efb416ab..000000000 --- a/src/WINNT/afssvrcfg/volume_utils.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _VOLUME_UTILS_H_ -#define _VOLUME_UTILS_H_ - -#include "toolbox.h" - -void SetupDriveList(HWND hDriveList); -BOOL UpdateDriveList(); - -#endif // _VOLUME_UTILS_H_ - diff --git a/src/WINNT/afssvrcfg/warn_dri.ico b/src/WINNT/afssvrcfg/warn_dri.ico deleted file mode 100644 index dca3b237942c623b7a62f654ca41bbe680d15580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmah^F$%&!5S*ZeV3W$)(o!^P9kmHqh+v&(T)<|#9Hj6Ge!(t*E6fjkh7Yi@TW4dd zxO+3R>@0VCK*WsW7#5QV7?~2*850ruWI#IpMs&;+`3RXM+P0;dq1}P1RRq&oMt`E@ zkZOUlYP=7HlrFeaZF;JME99&iZu*jebD?%l;HxHhFF?TX%FB(y??+U3N3Jnfok4ml jes-M$=^ofnF$1QFV7qRkL;AdAo5y{zR86@1oXGMw4(w6e diff --git a/src/WINNT/afssvrcpa/.cvsignore b/src/WINNT/afssvrcpa/.cvsignore deleted file mode 100644 index 2a4923cb0..000000000 --- a/src/WINNT/afssvrcpa/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -AFS_component_version_number.c -AFS_component_version_number.h diff --git a/src/WINNT/afssvrcpa/NTMakefile b/src/WINNT/afssvrcpa/NTMakefile deleted file mode 100644 index f02231f9a..000000000 --- a/src/WINNT/afssvrcpa/NTMakefile +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -RELDIR=WINNT\afssvrcpa -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# Definitions for building a DLL. - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\afsserver.cpl - -DLLOBJS =\ - $(OUT)\cpl_interface.obj \ - $(OUT)\AFS_component_version_number.obj \ - $(OUT)\afssvrcpa_stub.res - -DLLLIBS =\ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\TaLocale.lib \ - comctl32.lib - -DEFFILE = afssvrcpa.def - -$(DLLFILE): $(DLLOBJS) - $(DLLGUILINK) $(DLLLIBS) /DEF:$(DEFFILE) - $(DLLPREP) - - -############################################################################ -# Definitions for generating versioninfo resource via RC - -$(OUT)\afssvrcpa_stub.res: afssvrcpa_stub.rc AFS_component_version_number.h - -############################################################################ -# Install target; primary makefile target - -install: $(DLLFILE) lang - - -############################################################################ -# Language target - -lang:: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - $(CD) lang - @if exist AFS_component_version_number.h del AFS_component_version_number.h - for /f %l in ('dir /B ??_??') do ( if exist @$(NTLANG) do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile clean ) - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/afssvrcpa/afssvrcpa.def b/src/WINNT/afssvrcpa/afssvrcpa.def deleted file mode 100644 index 439adbc04..000000000 --- a/src/WINNT/afssvrcpa/afssvrcpa.def +++ /dev/null @@ -1,10 +0,0 @@ -; afs_cpa.def : Declares the module parameters for AFS for NT -; Control Panel Applet -; -LIBRARY AFSSERVER.CPL - -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD SINGLE - -EXPORTS - CPlApplet diff --git a/src/WINNT/afssvrcpa/afssvrcpa.ico b/src/WINNT/afssvrcpa/afssvrcpa.ico deleted file mode 100644 index c4276a58bf69141937c8bc4ea2bee02b853e197b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZ`$v5pfl5Piw6*cCb{RJ26CEzr^B2X1A#%*Uj2IxK{=b5+`_^Boisa)AUNk&^NX zq}$@e@W#n;3moHpW4|}{jAsqZIF`#-^fkWEf!6@u5=){dOfSaR^OgX9Na-}ub4er| z4hIIbd{DI&!C{iQ|C^*gVsaZd6G24cRQQ+cu$>$bjqNbu8fDW?Dn#Zh;Z{l&5gklu zZ-!`ssEj<{iVV>NWkKHXH#b`NZj1v^qfoTF`;A1@AwW_MEbg}h1m5{Tu}8CIK9F}I z1m80s&&RrO-vyo@cM>nWW0=5Vv^sUpIrvoweQQ+aYnoqmOlSgJ#|`Wmp@L$O4ETms{f&vb`b S!H7x?4`}qK-6mbD9`zUc!Mx)D diff --git a/src/WINNT/afssvrcpa/afssvrcpa_stub.rc b/src/WINNT/afssvrcpa/afssvrcpa_stub.rc deleted file mode 100644 index bceb7a2d3..000000000 --- a/src/WINNT/afssvrcpa/afssvrcpa_stub.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Configuration application" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" diff --git a/src/WINNT/afssvrcpa/cpl_interface.cpp b/src/WINNT/afssvrcpa/cpl_interface.cpp deleted file mode 100644 index 014b83b4a..000000000 --- a/src/WINNT/afssvrcpa/cpl_interface.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - * INCLUDES _________________________________________________________________ - * - */ -#include -#include -#include -#include "cpl_interface.h" -#include "resource.h" -#include -#include - - - -/* - * DEFINITIONS _______________________________________________________________ - * - */ -#define APP_INSTALL_DIR_REG_SUBKEY AFSREG_SVR_SW_VERSION_SUBKEY -#define APP_INSTALL_DIR_REG_VALUE AFSREG_SVR_SW_VERSION_DIR_VALUE -#define APP_EXE_PATH "\\usr\\afs\\bin\\afssvrcfg.exe" - - - -/* - * VARIABLES _________________________________________________________________ - * - */ -static HINSTANCE hinst = 0; -static HINSTANCE hinstResources = 0; - - - -/* - * STATIC FUNCTIONS ___________________________________________________________ - * - */ -static char *LoadResString(UINT uID) -{ - static char str[256]; - GetString (str, uID); - return str; -} - -static char *GetInstallDir() -{ - HKEY hKey; - LONG nResult; - DWORD dwType; - static char szInstallDir[256]; - DWORD dwSize; - - dwSize = sizeof(szInstallDir); - - nResult = RegOpenKeyAlt(HKEY_LOCAL_MACHINE, APP_INSTALL_DIR_REG_SUBKEY, KEY_READ, FALSE, &hKey, 0); - if (nResult == ERROR_SUCCESS) { - nResult = RegQueryValueEx(hKey, APP_INSTALL_DIR_REG_VALUE, 0, &dwType, (PBYTE)szInstallDir, &dwSize); - RegCloseKey(hKey); - } - - if (nResult != ERROR_SUCCESS) - szInstallDir[0] = 0; - - return szInstallDir; -} - - - -/* - * EXPORTED FUNCTIONS _________________________________________________________ - * - */ -extern "C" LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2) -{ - int i; - LPNEWCPLINFO lpNewCPlInfo; - HICON hIcon; - static char szAppName[64]; - static char szAppPath[MAX_PATH]; - - - i = (int)lParam1; - - switch (uMsg) { - case CPL_INIT: /* first message, sent once */ - hinst = GetModuleHandle("afsserver.cpl"); - hinstResources = TaLocale_LoadCorrespondingModule (hinst); - strcpy(szAppName, LoadResString(IDS_APP_NAME)); - sprintf(szAppPath, "%s%s", GetInstallDir(), APP_EXE_PATH); - return (hinst != 0); - - case CPL_GETCOUNT: /* second message, sent once */ - return 1; - break; - - case CPL_NEWINQUIRE: /* third message, sent once per app */ - lpNewCPlInfo = (LPNEWCPLINFO) lParam2; - - lpNewCPlInfo->dwSize = (DWORD) sizeof(NEWCPLINFO); - lpNewCPlInfo->dwFlags = 0; - lpNewCPlInfo->dwHelpContext = 0; - lpNewCPlInfo->lData = 0; - hIcon = TaLocale_LoadIcon(IDI_AFSD); - if (hIcon == 0) - MessageBox(0, LoadResString(IDS_ERROR_LOADING_ICON), szAppName, MB_ICONEXCLAMATION); - lpNewCPlInfo->hIcon = hIcon; - lpNewCPlInfo->szHelpFile[0] = '\0'; - strcpy(lpNewCPlInfo->szName, szAppName); - strcpy(lpNewCPlInfo->szInfo, LoadResString(IDS_CPA_TITLE)); - break; - - case CPL_SELECT: /* applet icon selected */ - break; - - case CPL_DBLCLK: /* applet icon double-clicked */ - if (WinExec(szAppPath, SW_SHOW) < 32) - MessageBox(0, LoadResString(IDS_EXECUTION_ERROR), szAppName, MB_ICONSTOP); - break; - - case CPL_STOP: /* sent once per app. before CPL_EXIT */ - break; - - case CPL_EXIT: /* sent once before FreeLibrary called */ - if (hinstResources) - FreeLibrary (hinstResources); - break; - - default: - break; - } - - return 0; -} - diff --git a/src/WINNT/afssvrcpa/cpl_interface.h b/src/WINNT/afssvrcpa/cpl_interface.h deleted file mode 100644 index 6613c58d1..000000000 --- a/src/WINNT/afssvrcpa/cpl_interface.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* -* Exported functions. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2); - -#ifdef __cplusplus -} -#endif - - diff --git a/src/WINNT/afssvrcpa/lang/.cvsignore b/src/WINNT/afssvrcpa/lang/.cvsignore deleted file mode 100644 index d0fe629e6..000000000 --- a/src/WINNT/afssvrcpa/lang/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -AFS_component_version_number.h - diff --git a/src/WINNT/afssvrcpa/lang/NTMakefile b/src/WINNT/afssvrcpa/lang/NTMakefile deleted file mode 100644 index d3c9c18b0..000000000 --- a/src/WINNT/afssvrcpa/lang/NTMakefile +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\afssvrcpa\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\afsserver_$(LANGID).dll - -RCFILE = $(LANGNAME)\afssvrcpa.rc - -RESFILE = $(OUT)\afssvrcpa_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist $(OUT)\*.res del $(OUT)\*.res - @if exist AFS_component_version_number.h del AFS_component_version_number.h - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/afssvrcpa/lang/de_DE/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/de_DE/afssvrcpa.rc deleted file mode 100644 index 9cc2be6f8..000000000 --- a/src/WINNT/afssvrcpa/lang/de_DE/afssvrcpa.rc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "Die Anwendung AFS Server Configuration" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "Fehler beim Laden des Symbols" - IDS_CPA_TITLE "AFS Server Configuration" - IDS_EXECUTION_ERROR "Die Anwendung AFS Server Configuration kann nicht geöffnet werden." - IDS_APP_NAME "AFS Server Configuration" -END - diff --git a/src/WINNT/afssvrcpa/lang/en_US/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/en_US/afssvrcpa.rc deleted file mode 100644 index 094d6b62f..000000000 --- a/src/WINNT/afssvrcpa/lang/en_US/afssvrcpa.rc +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Configuration application" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "Error loading icon" - IDS_CPA_TITLE "AFS Server Configuration" - IDS_EXECUTION_ERROR "Unable to open the AFS Server Configuration application." - IDS_APP_NAME "AFS Server Configuration" -END diff --git a/src/WINNT/afssvrcpa/lang/es_ES/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/es_ES/afssvrcpa.rc deleted file mode 100644 index 838afbea1..000000000 --- a/src/WINNT/afssvrcpa/lang/es_ES/afssvrcpa.rc +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "Aplicación de Configuración de AFS Server" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "Icono de carga de errores" - IDS_CPA_TITLE "Configuración de AFS Server" - IDS_EXECUTION_ERROR "No se ha podido abrir la aplicación de Configuración de AFS Server." - IDS_APP_NAME "Configuración de AFS Server" -END - - diff --git a/src/WINNT/afssvrcpa/lang/ja_JP/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/ja_JP/afssvrcpa.rc deleted file mode 100644 index 17d316d26..000000000 --- a/src/WINNT/afssvrcpa/lang/ja_JP/afssvrcpa.rc +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒT[ƒo[\¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "ƒAƒCƒRƒ“‚̃[ƒhEƒGƒ‰[" - IDS_CPA_TITLE "AFS ƒT[ƒo[\¬" - IDS_EXECUTION_ERROR "AFS ƒT[ƒo[\¬ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðƒI[ƒvƒ“‚Å‚«‚Ü‚¹‚ñB" - IDS_APP_NAME "AFS ƒT[ƒo[\¬" -END diff --git a/src/WINNT/afssvrcpa/lang/ko_KR/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/ko_KR/afssvrcpa.rc deleted file mode 100644 index daab79db4..000000000 --- a/src/WINNT/afssvrcpa/lang/ko_KR/afssvrcpa.rc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ¼­¹ö ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "¾ÆÀÌÄÜ ·Îµå ¿À·ù" - IDS_CPA_TITLE "AFS ¼­¹ö ±¸¼º" - IDS_EXECUTION_ERROR "AFS ±¸¼º ÀÀ¿ëÇÁ·Î±×·¥À» ¿­ ¼ö ¾ø½À´Ï´Ù." - IDS_APP_NAME "AFS ¼­¹ö ±¸¼º" -END - diff --git a/src/WINNT/afssvrcpa/lang/pt_BR/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/pt_BR/afssvrcpa.rc deleted file mode 100644 index 4ef7fdb5a..000000000 --- a/src/WINNT/afssvrcpa/lang/pt_BR/afssvrcpa.rc +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Configuration application" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "Erro no carregamento do ícone" - IDS_CPA_TITLE "Configuração do AFS Server" - IDS_EXECUTION_ERROR "Incapaz de abrir a aplicação de Configuração do AFS Server" - IDS_APP_NAME "Configuração do AFS Server" -END diff --git a/src/WINNT/afssvrcpa/lang/zh_CN/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/zh_CN/afssvrcpa.rc deleted file mode 100644 index 075fe3159..000000000 --- a/src/WINNT/afssvrcpa/lang/zh_CN/afssvrcpa.rc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ·þÎñÆ÷ÅäÖÃÓ¦ÓóÌÐò" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "×°Èëͼ±ê³ö´í" - IDS_CPA_TITLE "AFS ·þÎñÆ÷ÅäÖÃ" - IDS_EXECUTION_ERROR "ÎÞ·¨´ò¿ª AFS ·þÎñÆ÷ÅäÖÃÓ¦ÓóÌÐò¡£" - IDS_APP_NAME "AFS ·þÎñÆ÷ÅäÖÃ" -END - diff --git a/src/WINNT/afssvrcpa/lang/zh_TW/afssvrcpa.rc b/src/WINNT/afssvrcpa/lang/zh_TW/afssvrcpa.rc deleted file mode 100644 index 86cfd3030..000000000 --- a/src/WINNT/afssvrcpa/lang/zh_TW/afssvrcpa.rc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Configuration application" -#define AFS_VERINFO_NAME "afssvrcpa" -#define AFS_VERINFO_FILENAME "afssvrcpa.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icons -// -IDI_AFSD ICON DISCARDABLE "afssvrcpa.ico" - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_LOADING_ICON "¸ü¤J¹Ï¥Ü®Éµo¥Í¿ù»~" - IDS_CPA_TITLE "AFS ¦øªA¾¹¬[ºc" - IDS_EXECUTION_ERROR "µLªk¶}±Ò¡uAFS ¦øªA¾¹¬[ºc¡vÀ³¥Îµ{¦¡¡C" - IDS_APP_NAME "AFS ¦øªA¾¹¬[ºc" -END - diff --git a/src/WINNT/afssvrcpa/resource.h b/src/WINNT/afssvrcpa/resource.h deleted file mode 100644 index 03a8fe2ec..000000000 --- a/src/WINNT/afssvrcpa/resource.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_ERROR_LOADING_ICON 0 -#define IDS_CPA_TITLE 1 -#define IDS_EXECUTION_ERROR 2 -#define IDS_APP_NAME 3 - -#define IDI_AFSD 103 diff --git a/src/WINNT/afssvrmgr/NTMakefile b/src/WINNT/afssvrmgr/NTMakefile deleted file mode 100644 index 72e852460..000000000 --- a/src/WINNT/afssvrmgr/NTMakefile +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include - -# include the primary makefile -RELDIR=WINNT\afssvrmgr -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# -# BUILD TARGETS -# - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsServerManager.exe - -EXEOBJS = \ - $(OUT)\svrmgr_stub.res \ - $(OUT)\action.obj \ - $(OUT)\agg_col.obj \ - $(OUT)\agg_general.obj \ - $(OUT)\agg_prop.obj \ - $(OUT)\agg_tab.obj \ - $(OUT)\alert.obj \ - $(OUT)\cmdline.obj \ - $(OUT)\columns.obj \ - $(OUT)\command.obj \ - $(OUT)\creds.obj \ - $(OUT)\dispatch.obj \ - $(OUT)\dispguts.obj \ - $(OUT)\display.obj \ - $(OUT)\general.obj \ - $(OUT)\helpfunc.obj \ - $(OUT)\options.obj \ - $(OUT)\prefs.obj \ - $(OUT)\problems.obj \ - $(OUT)\propcache.obj \ - $(OUT)\set_clone.obj \ - $(OUT)\set_col.obj \ - $(OUT)\set_create.obj \ - $(OUT)\set_createrep.obj \ - $(OUT)\set_delete.obj \ - $(OUT)\set_dump.obj \ - $(OUT)\set_general.obj \ - $(OUT)\set_move.obj \ - $(OUT)\set_prop.obj \ - $(OUT)\set_quota.obj \ - $(OUT)\set_release.obj \ - $(OUT)\set_rename.obj \ - $(OUT)\set_repprop.obj \ - $(OUT)\set_restore.obj \ - $(OUT)\set_tab.obj \ - $(OUT)\subset.obj \ - $(OUT)\svc_col.obj \ - $(OUT)\svc_create.obj \ - $(OUT)\svc_delete.obj \ - $(OUT)\svc_general.obj \ - $(OUT)\svc_prop.obj \ - $(OUT)\svc_startstop.obj \ - $(OUT)\svc_tab.obj \ - $(OUT)\svc_viewlog.obj \ - $(OUT)\svr_address.obj \ - $(OUT)\svr_col.obj \ - $(OUT)\svr_execute.obj \ - $(OUT)\svr_general.obj \ - $(OUT)\svr_getdates.obj \ - $(OUT)\svr_hosts.obj \ - $(OUT)\svr_install.obj \ - $(OUT)\svr_prop.obj \ - $(OUT)\svr_prune.obj \ - $(OUT)\svr_salvage.obj \ - $(OUT)\svr_security.obj \ - $(OUT)\svr_syncvldb.obj \ - $(OUT)\svr_uninstall.obj \ - $(OUT)\svr_window.obj \ - $(OUT)\svrmgr.obj \ - $(OUT)\task.obj \ - $(OUT)\window.obj - -VCLIBS =\ - comctl32.lib \ - shell32.lib - -EXELIBS = \ - $(DESTDIR)\lib\afs\AfsClass.lib \ - $(DESTDIR)\lib\afs\TaAfsAppLib.lib - -############################################################################ - -$(EXEFILE) : $(EXEOBJS) $(EXELIBS) - $(EXEGUILINK) $(VCLIBS) - $(EXEPREP) - -lang :: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -install : $(EXEFILE) lang - -############################################################################ -# -# Dependencies -# - -$(OUT)\svrmgr_stub.res : AFS_component_version_number.h - -clean:: - $(CD) lang - @if exist AFS_component_version_number.h del AFS_component_version_number.h - for /f %l in ('dir /B ??_??') do ( if exist @$(NTLANG) do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile clean ) - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/afssvrmgr/action.cpp b/src/WINNT/afssvrmgr/action.cpp deleted file mode 100644 index 4f9301721..000000000 --- a/src/WINNT/afssvrmgr/action.cpp +++ /dev/null @@ -1,1743 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "action.h" -#include "window.h" -#include "messages.h" -#include "display.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_ACTIONLIST 4 - -typedef enum - { - actcolOPERATION, - actcolELAPSED, - } ACTIONCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -ACTIONCOLUMNS[] = - { - { IDS_ACTCOL_OPERATION, 100 }, // actcolOPERATIONS - { IDS_ACTCOL_ELAPSED, 100 }, // actcolELAPSED - }; - -#define nACTIONCOLUMNS (sizeof(ACTIONCOLUMNS)/sizeof(ACTIONCOLUMNS[0])) - -#define cxMIN_ACTION 75 -#define cyMIN_ACTION 50 - - -/* - * ACTION TYPES _______________________________________________________________ - * - */ - -typedef enum - { - atUNUSED = 0, - atOPENCELL, - atSCOUT, - atTIMEOUT, - atREFRESH, - atGETSERVERLOGFILE, - atSETSERVERAUTH, - atSTARTSERVICE, - atSTOPSERVICE, - atRESTARTSERVICE, - atCREATEFILESET, - atDELETEFILESET, - atMOVEFILESET, - atSETFILESETQUOTA, - atSYNCVLDB, - atSALVAGE, - atSETFILESETREPPARAMS, - atCREATEREPLICA, - atPRUNEFILES, - atINSTALLFILE, - atUNINSTALLFILE, - atRENAMEFILESET, - atCREATESERVICE, - atDELETESERVICE, - atRELEASEFILESET, - atGETFILEDATES, - atEXECUTECOMMAND, - atADMINLIST_LOAD, - atADMINLIST_SAVE, - atHOSTLIST_LOAD, - atHOSTLIST_SAVE, - atCLONE, - atCLONESYS, - atDUMP, - atRESTORE, - atSETRESTART, - atCHANGEADDR, - } ACTIONTYPE; - -typedef struct - { - ACTIONTYPE Type; - NOTIFYPARAMS Params; - DWORD dwTickStart; - HWND hDlg; - } ACTION, *PACTION; - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct l - { - PACTION *aActions; - size_t cActions; - size_t cActionsInUse; - BOOL fShowConfirmations; - } l; - -rwWindowData awdActions[] = { - { IDC_ACTION_DESC, raSizeX | raRepaint, 0, 0 }, - { IDC_ACTION_LIST, raSizeX | raSizeY, MAKELONG(cxMIN_ACTION,cyMIN_ACTION), 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void TicksToElapsedTime (LPSYSTEMTIME pst, DWORD dwTicks); -void CopyFirstWord (LPTSTR pszTarget, LPTSTR pszSource); - -BOOL CALLBACK Action_Window_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Action_Window_Refresh (void); -LPTSTR Action_GetDescription (size_t ii); - -BOOL Action_CompareNotifyParams (PNOTIFYPARAMS pParams1, PNOTIFYPARAMS pParams2); -PACTION Action_Begin (ACTIONTYPE Type, PNOTIFYPARAMS pParams); -PACTION Action_Find (ACTIONTYPE Type, PNOTIFYPARAMS pParams); -void Action_OnDestroy (HWND hDlg); -void Action_SpecifyWindow (PACTION pParams, HWND hDlg); -void Action_End (PACTION pParams, DWORD dwStatus); - -void Action_GetServerLogFile_Begin (PNOTIFYPARAMS pParams); -void Action_GetServerLogFile_End (PNOTIFYPARAMS pParams); -void Action_SetServerAuth_Begin (PNOTIFYPARAMS pParams); -void Action_SetServerAuth_End (PNOTIFYPARAMS pParams); -void Action_InstallFile_Begin (PNOTIFYPARAMS pParams); -void Action_InstallFile_End (PNOTIFYPARAMS pParams); -void Action_UninstallFile_Begin (PNOTIFYPARAMS pParams); -void Action_UninstallFile_End (PNOTIFYPARAMS pParams); -void Action_PruneFiles_Begin (PNOTIFYPARAMS pParams); -void Action_PruneFiles_End (PNOTIFYPARAMS pParams); -void Action_StartService_Begin (PNOTIFYPARAMS pParams); -void Action_StartService_End (PNOTIFYPARAMS pParams); -void Action_StopService_Begin (PNOTIFYPARAMS pParams); -void Action_StopService_End (PNOTIFYPARAMS pParams); -void Action_RestartService_Begin (PNOTIFYPARAMS pParams); -void Action_RestartService_End (PNOTIFYPARAMS pParams); -void Action_CreateFileset_Begin (PNOTIFYPARAMS pParams); -void Action_CreateFileset_End (PNOTIFYPARAMS pParams); -void Action_DeleteFileset_Begin (PNOTIFYPARAMS pParams); -void Action_DeleteFileset_End (PNOTIFYPARAMS pParams); -void Action_SetFilesetQuota_Begin (PNOTIFYPARAMS pParams); -void Action_SetFilesetQuota_End (PNOTIFYPARAMS pParams); -void Action_SyncVLDB_Begin (PNOTIFYPARAMS pParams); -void Action_SyncVLDB_End (PNOTIFYPARAMS pParams); -void Action_Salvage_Begin (PNOTIFYPARAMS pParams); -void Action_Salvage_End (PNOTIFYPARAMS pParams); -void Action_Scout_Begin (PNOTIFYPARAMS pParams); -void Action_Scout_End (PNOTIFYPARAMS pParams); -void Action_SetFilesetRepParams_Begin (PNOTIFYPARAMS pParams); -void Action_SetFilesetRepParams_End (PNOTIFYPARAMS pParams); -void Action_CreateReplica_Begin (PNOTIFYPARAMS pParams); -void Action_CreateReplica_End (PNOTIFYPARAMS pParams); -void Action_RenameFileset_Begin (PNOTIFYPARAMS pParams); -void Action_RenameFileset_End (PNOTIFYPARAMS pParams); -void Action_CreateService_Begin (PNOTIFYPARAMS pParams); -void Action_CreateService_End (PNOTIFYPARAMS pParams); -void Action_DeleteService_Begin (PNOTIFYPARAMS pParams); -void Action_DeleteService_End (PNOTIFYPARAMS pParams); -void Action_ReleaseFileset_Begin (PNOTIFYPARAMS pParams); -void Action_ReleaseFileset_End (PNOTIFYPARAMS pParams); -void Action_GetFileDates_Begin (PNOTIFYPARAMS pParams); -void Action_GetFileDates_End (PNOTIFYPARAMS pParams); -void Action_ExecuteCommand_Begin (PNOTIFYPARAMS pParams); -void Action_ExecuteCommand_End (PNOTIFYPARAMS pParams); -void Action_AdminListLoad_Begin (PNOTIFYPARAMS pParams); -void Action_AdminListLoad_End (PNOTIFYPARAMS pParams); -void Action_AdminListSave_Begin (PNOTIFYPARAMS pParams); -void Action_AdminListSave_End (PNOTIFYPARAMS pParams); -void Action_HostListLoad_Begin (PNOTIFYPARAMS pParams); -void Action_HostListLoad_End (PNOTIFYPARAMS pParams); -void Action_HostListSave_Begin (PNOTIFYPARAMS pParams); -void Action_HostListSave_End (PNOTIFYPARAMS pParams); -void Action_Clone_Begin (PNOTIFYPARAMS pParams); -void Action_Clone_End (PNOTIFYPARAMS pParams); -void Action_Clonesys_Begin (PNOTIFYPARAMS pParams); -void Action_Clonesys_End (PNOTIFYPARAMS pParams); -void Action_SetRestart_Begin (PNOTIFYPARAMS pParams); -void Action_SetRestart_End (PNOTIFYPARAMS pParams); -void Action_ChangeAddr_Begin (PNOTIFYPARAMS pParams); -void Action_ChangeAddr_End (PNOTIFYPARAMS pParams); - -void Action_Refresh_Begin (PNOTIFYPARAMS pParams); -void Action_Refresh_Update (PNOTIFYPARAMS pParams); -void Action_Refresh_SectionStart (PNOTIFYPARAMS pParams); -void Action_Refresh_SectionEnd (PNOTIFYPARAMS pParams); -void Action_Refresh_End (PNOTIFYPARAMS pParams); -void Action_Refresh_UpdateText (HWND hDlg, LPIDENT lpi, DWORD dwPerComplete); -void Action_Refresh_SetSection (HWND hDlg, BOOL fStart, int idSection); -void Action_Refresh_SkipSection (HWND hDlg); -BOOL CALLBACK Action_Refresh_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Action_MoveFileset_Begin (PNOTIFYPARAMS pParams); -void Action_MoveFileset_End (PNOTIFYPARAMS pParams); -BOOL CALLBACK Action_MoveFileset_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Action_DumpFileset_Begin (PNOTIFYPARAMS pParams); -void Action_DumpFileset_End (PNOTIFYPARAMS pParams); -BOOL CALLBACK Action_DumpFileset_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Action_RestoreFileset_Begin (PNOTIFYPARAMS pParams); -void Action_RestoreFileset_End (PNOTIFYPARAMS pParams); -BOOL CALLBACK Action_RestoreFileset_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Action_OpenCell_Begin (PNOTIFYPARAMS pParams); -void Action_OpenCell_End (PNOTIFYPARAMS pParams); -BOOL CALLBACK Action_OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void ActionNotification_MainThread (NOTIFYEVENT evt, PNOTIFYPARAMS pParams) -{ - BOOL fRefresh = TRUE; - - switch (evt) - { - - // When Scout starts and stops checking a server, it'll notify us. - // - case evtScoutBegin: Action_Scout_Begin (pParams); break; - case evtScoutEnd: Action_Scout_End (pParams); break; - - // If AFSClass is going to perform a lengthy refresh, it will send - // us notifications for when it starts, when it's done, and periodic - // updates about how far along it is. Use that information to present - // a dialog to the user... - // - case evtRefreshAllBegin: Action_Refresh_Begin (pParams); break; - case evtRefreshAllUpdate: Action_Refresh_Update (pParams); break; - case evtRefreshAllSectionStart: Action_Refresh_SectionStart (pParams); break; - case evtRefreshAllSectionEnd: Action_Refresh_SectionEnd (pParams); break; - case evtRefreshAllEnd: Action_Refresh_End(pParams); break; - - case evtGetServerLogFileBegin: Action_GetServerLogFile_Begin (pParams); break; - case evtGetServerLogFileEnd: Action_GetServerLogFile_End (pParams); break; - case evtSetServerAuthBegin: Action_SetServerAuth_Begin (pParams); break; - case evtSetServerAuthEnd: Action_SetServerAuth_End (pParams); break; - case evtInstallFileBegin: Action_InstallFile_Begin (pParams); break; - case evtInstallFileEnd: Action_InstallFile_End (pParams); break; - case evtUninstallFileBegin: Action_UninstallFile_Begin (pParams); break; - case evtUninstallFileEnd: Action_UninstallFile_End (pParams); break; - case evtPruneFilesBegin: Action_PruneFiles_Begin (pParams); break; - case evtPruneFilesEnd: Action_PruneFiles_End (pParams); break; - case evtStartServiceBegin: Action_StartService_Begin (pParams); break; - case evtStartServiceEnd: Action_StartService_End (pParams); break; - case evtStopServiceBegin: Action_StopService_Begin (pParams); break; - case evtStopServiceEnd: Action_StopService_End (pParams); break; - case evtRestartServiceBegin: Action_RestartService_Begin (pParams); break; - case evtRestartServiceEnd: Action_RestartService_End (pParams); break; - case evtCreateFilesetBegin: Action_CreateFileset_Begin (pParams); break; - case evtCreateFilesetEnd: Action_CreateFileset_End (pParams); break; - case evtDeleteFilesetBegin: Action_DeleteFileset_Begin (pParams); break; - case evtDeleteFilesetEnd: Action_DeleteFileset_End (pParams); break; - case evtMoveFilesetBegin: Action_MoveFileset_Begin (pParams); break; - case evtMoveFilesetEnd: Action_MoveFileset_End (pParams); break; - case evtSetFilesetQuotaBegin: Action_SetFilesetQuota_Begin (pParams); break; - case evtSetFilesetQuotaEnd: Action_SetFilesetQuota_End (pParams); break; - case evtSyncVLDBBegin: Action_SyncVLDB_Begin (pParams); break; - case evtSyncVLDBEnd: Action_SyncVLDB_End (pParams); break; - case evtSalvageBegin: Action_Salvage_Begin (pParams); break; - case evtSalvageEnd: Action_Salvage_End (pParams); break; - case evtSetFilesetRepParamsBegin: Action_SetFilesetRepParams_Begin (pParams); break; - case evtSetFilesetRepParamsEnd: Action_SetFilesetRepParams_End (pParams); break; - case evtCreateReplicaBegin: Action_CreateReplica_Begin (pParams); break; - case evtCreateReplicaEnd: Action_CreateReplica_End (pParams); break; - case evtRenameFilesetBegin: Action_RenameFileset_Begin (pParams); break; - case evtRenameFilesetEnd: Action_RenameFileset_End (pParams); break; - case evtCreateServiceBegin: Action_CreateService_Begin (pParams); break; - case evtCreateServiceEnd: Action_CreateService_End (pParams); break; - case evtDeleteServiceBegin: Action_DeleteService_Begin (pParams); break; - case evtDeleteServiceEnd: Action_DeleteService_End (pParams); break; - case evtReleaseFilesetBegin: Action_ReleaseFileset_Begin (pParams); break; - case evtReleaseFilesetEnd: Action_ReleaseFileset_End (pParams); break; - case evtGetFileDatesBegin: Action_GetFileDates_Begin (pParams); break; - case evtGetFileDatesEnd: Action_GetFileDates_End (pParams); break; - case evtExecuteCommandBegin: Action_ExecuteCommand_Begin (pParams); break; - case evtExecuteCommandEnd: Action_ExecuteCommand_End (pParams); break; - case evtAdminListLoadBegin: Action_AdminListLoad_Begin (pParams); break; - case evtAdminListLoadEnd: Action_AdminListLoad_End (pParams); break; - case evtAdminListSaveBegin: Action_AdminListSave_Begin (pParams); break; - case evtAdminListSaveEnd: Action_AdminListSave_End (pParams); break; - case evtHostListLoadBegin: Action_HostListLoad_Begin (pParams); break; - case evtHostListLoadEnd: Action_HostListLoad_End (pParams); break; - case evtHostListSaveBegin: Action_HostListSave_Begin (pParams); break; - case evtHostListSaveEnd: Action_HostListSave_End (pParams); break; - case evtCloneBegin: Action_Clone_Begin (pParams); break; - case evtCloneEnd: Action_Clone_End (pParams); break; - case evtCloneMultipleBegin: Action_Clonesys_Begin (pParams); break; - case evtCloneMultipleEnd: Action_Clonesys_End (pParams); break; - case evtDumpFilesetBegin: Action_DumpFileset_Begin (pParams); break; - case evtDumpFilesetEnd: Action_DumpFileset_End (pParams); break; - case evtRestoreFilesetBegin: Action_RestoreFileset_Begin (pParams); break; - case evtRestoreFilesetEnd: Action_RestoreFileset_End (pParams); break; - case evtSetRestartTimesBegin: Action_SetRestart_Begin (pParams); break; - case evtSetRestartTimesEnd: Action_SetRestart_End (pParams); break; - case evtChangeAddressBegin: Action_ChangeAddr_Begin (pParams); break; - case evtChangeAddressEnd: Action_ChangeAddr_End (pParams); break; - case evtOpenCellBegin: Action_OpenCell_Begin (pParams); break; - case evtOpenCellEnd: Action_OpenCell_End (pParams); break; - - default: - fRefresh = FALSE; - } - - if (fRefresh) - Action_Window_Refresh(); -} - - -void TicksToElapsedTime (LPSYSTEMTIME pst, DWORD dwTicks) -{ -#define msecSECOND (1000L) -#define msecMINUTE (1000L * 60L) -#define msecHOUR (1000L * 60L * 60L) -#define msecDAY (1000L * 60L * 60L * 24L) - - memset (pst, 0x00, sizeof(SYSTEMTIME)); - - pst->wDay = (int)( dwTicks / msecDAY ); - dwTicks %= msecDAY; - pst->wHour = (int)( dwTicks / msecHOUR ); - dwTicks %= msecHOUR; - pst->wMinute = (int)( dwTicks / msecMINUTE ); - dwTicks %= msecMINUTE; - pst->wSecond = (int)( dwTicks / msecSECOND ); - dwTicks %= msecSECOND; - pst->wMilliseconds = (int)( dwTicks ); -} - - -void CopyFirstWord (LPTSTR pszTarget, LPTSTR pszSource) -{ - lstrcpy (pszTarget, pszSource); - - LPTSTR pch; - if ((pch = (LPTSTR)lstrchr (pszTarget, TEXT(' '))) != NULL) - *pch = TEXT('\0'); - if ((pch = (LPTSTR)lstrchr (pszTarget, TEXT('\t'))) != NULL) - *pch = TEXT('\0'); -} - - -void Action_OpenWindow (void) -{ - if (!g.hAction || !IsWindow (g.hAction)) - { - g.hAction = ModelessDialog (IDD_ACTIONS, NULL, (DLGPROC)Action_Window_DlgProc); - ShowWindow (g.hAction, SW_SHOW); - } -} - - -void Action_CloseWindow (void) -{ - if (g.hAction && IsWindow (g.hAction)) - { - DestroyWindow (g.hAction); - } -} - - -BOOL CALLBACK Action_Window_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAct)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - g.hAction = hDlg; - HWND hList; - hList = GetDlgItem (hDlg, IDC_ACTION_LIST); - FL_RestoreView (hList, &gr.viewAct); - - if (gr.rActions.right == 0) - GetWindowRect (hDlg, &gr.rActions); - ResizeWindow (hDlg, awdActions, rwaMoveToHere, &gr.rActions); - - Action_Window_Refresh(); - SetTimer (hDlg, ID_ACTION_TIMER, 1000, NULL); // timer message every sec - - SetWindowPos (g.hAction, HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); - break; - - case WM_DESTROY: - gr.fActions = FALSE; - g.hAction = NULL; - Main_SetActionMenus(); - FL_StoreView (GetDlgItem (hDlg, IDC_ACTION_LIST), &gr.viewAct); - KillTimer (hDlg, ID_ACTION_TIMER); - break; - - case WM_TIMER: - if (FastList_GetItemCount (GetDlgItem (hDlg, IDC_ACTION_LIST))) - Action_Window_Refresh(); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - { - ResizeWindow (hDlg, awdActions, rwaFixupGuts); - GetWindowRect (hDlg, &gr.rActions); - } - break; - - case WM_MOVE: - GetWindowRect (hDlg, &gr.rActions); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Action_WindowToTop (BOOL fTop) -{ - if (g.hAction && IsWindow(g.hAction)) - { - if (fTop) - { - SetWindowPos (g.hAction, HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); - } - else //(!fTop) - { - SetWindowPos (g.hAction, g.hMain, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); - } - } -} - - -void Action_Window_Refresh (void) -{ - size_t nItems = 0; - TCHAR szText[ cchRESOURCE ]; - - HWND hList = GetDlgItem (g.hAction, IDC_ACTION_LIST); - if (hList != NULL) - { - LPARAM lpOld = FL_StartChange (hList, TRUE); - - for (size_t ii = 0; ii < l.cActions; ++ii) - { - LPTSTR pszDesc; - if ((pszDesc = Action_GetDescription (ii)) != NULL) - { - SYSTEMTIME st; - TicksToElapsedTime (&st, GetTickCount() - l.aActions[ ii ]->dwTickStart); - FormatElapsed (szText, TEXT("%s"), &st); - FL_AddItem (hList, &gr.viewAct, (LPARAM)ii, IMAGE_NOIMAGE, pszDesc, szText); - ++nItems; - - FreeString (pszDesc); - } - } - - FL_EndChange (hList, lpOld); - } - - if (nItems == 0) - GetString (szText, IDS_ACTION_DESC_NONE); - else if (nItems == 1) - GetString (szText, IDS_ACTION_DESC_ONE); - else // (nItems >= 2) - GetString (szText, IDS_ACTION_DESC_MULT); - SetDlgItemText (g.hAction, IDC_ACTION_DESC, szText); -} - - -LPTSTR Action_GetDescription (size_t ii) -{ - TCHAR szText[ cchRESOURCE ]; - TCHAR szText2[ cchRESOURCE ]; - TCHAR szText3[ cchRESOURCE ]; - LPTSTR pszDesc = NULL; - - if (!l.aActions[ ii ]) - return NULL; - - switch (l.aActions[ ii ]->Type) - { - case atSCOUT: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_SCOUT, TEXT("%s"), szText); - break; - - case atREFRESH: - pszDesc = FormatString (IDS_ACTION_REFRESH); - break; - - case atGETSERVERLOGFILE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_GETSERVERLOGFILE, TEXT("%s%s"), szText, l.aActions[ ii ]->Params.sz1); - break; - - case atSETSERVERAUTH: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_SETSERVERAUTH, TEXT("%s"), szText); - break; - - case atINSTALLFILE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - CopyBaseFileName (szText2, l.aActions[ ii ]->Params.sz1); - pszDesc = FormatString (IDS_ACTION_INSTALLFILE, TEXT("%s%s"), szText, szText2); - break; - - case atUNINSTALLFILE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - CopyBaseFileName (szText2, l.aActions[ ii ]->Params.sz1); - pszDesc = FormatString (IDS_ACTION_UNINSTALLFILE, TEXT("%s%s"), szText, szText2); - break; - - case atPRUNEFILES: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_PRUNEFILES, TEXT("%s"), szText); - break; - - case atSTARTSERVICE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetServiceName (szText2); - pszDesc = FormatString (IDS_ACTION_STARTSERVICE, TEXT("%s%s"), szText, szText2); - break; - - case atSTOPSERVICE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetServiceName (szText2); - pszDesc = FormatString (IDS_ACTION_STOPSERVICE, TEXT("%s%s"), szText, szText2); - break; - - case atRESTARTSERVICE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetServiceName (szText2); - pszDesc = FormatString (IDS_ACTION_RESTARTSERVICE, TEXT("%s%s"), szText, szText2); - break; - - case atCREATEFILESET: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - pszDesc = FormatString (IDS_ACTION_CREATEFILESET, TEXT("%s%s%s"), szText, szText2, l.aActions[ ii ]->Params.sz1); - break; - - case atDELETEFILESET: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_DELETEFILESET, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atMOVEFILESET: - l.aActions[ ii ]->Params.lpi2->GetServerName (szText); - l.aActions[ ii ]->Params.lpi2->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_MOVEFILESET, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atSETFILESETQUOTA: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_SETFILESETQUOTA, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atSETFILESETREPPARAMS: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_SETREPPARAMS, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atCREATEREPLICA: - l.aActions[ ii ]->Params.lpi2->GetServerName (szText); - l.aActions[ ii ]->Params.lpi2->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_CREATEREPLICA, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atSYNCVLDB: - if (l.aActions[ ii ]->Params.lpi1->fIsServer()) - { - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_SYNCVLDB_SVR, TEXT("%s"), szText); - } - else - { - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - pszDesc = FormatString (IDS_ACTION_SYNCVLDB_AGG, TEXT("%s%s"), szText, szText2); - } - break; - - case atSALVAGE: - if (l.aActions[ ii ]->Params.lpi1->fIsServer()) - { - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_SALVAGE_SVR, TEXT("%s"), szText); - } - else if (l.aActions[ ii ]->Params.lpi1->fIsAggregate()) - { - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - pszDesc = FormatString (IDS_ACTION_SALVAGE_AGG, TEXT("%s%s"), szText, szText2); - } - else // (l.aActions[ ii ]->Params.lpi1->fIsFileset()) - { - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_SALVAGE_VOL, TEXT("%s%s%s"), szText, szText2, szText3); - } - break; - - case atRENAMEFILESET: - pszDesc = FormatString (IDS_ACTION_RENAMEFILESET, TEXT("%s%s"), l.aActions[ ii ]->Params.sz1, l.aActions[ ii ]->Params.sz2); - break; - - case atCREATESERVICE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_CREATESERVICE, TEXT("%s%s"), szText, l.aActions[ ii ]->Params.sz1); - break; - - case atDELETESERVICE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetServiceName (szText2); - pszDesc = FormatString (IDS_ACTION_DELETESERVICE, TEXT("%s%s"), szText, szText2); - break; - - case atRELEASEFILESET: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_RELEASEFILESET, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atGETFILEDATES: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - CopyBaseFileName (szText2, l.aActions[ ii ]->Params.sz1); - pszDesc = FormatString (IDS_ACTION_GETDATES, TEXT("%s%s"), szText, szText2); - break; - - case atEXECUTECOMMAND: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - CopyFirstWord (szText2, l.aActions[ ii ]->Params.sz1); - pszDesc = FormatString (IDS_ACTION_EXECUTE, TEXT("%s%s"), szText, szText2); - break; - - case atADMINLIST_LOAD: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_ADMINLIST_LOAD, TEXT("%s"), szText); - break; - - case atADMINLIST_SAVE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_ADMINLIST_SAVE, TEXT("%s"), szText); - break; - - case atHOSTLIST_LOAD: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_HOSTLIST_LOAD, TEXT("%s"), szText); - break; - - case atHOSTLIST_SAVE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_HOSTLIST_SAVE, TEXT("%s"), szText); - break; - - case atCLONE: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_CLONE, TEXT("%s%s%s"), szText, szText2, szText3); - break; - - case atCLONESYS: - pszDesc = FormatString (IDS_ACTION_CLONESYS); - break; - - case atDUMP: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - l.aActions[ ii ]->Params.lpi1->GetAggregateName (szText2); - l.aActions[ ii ]->Params.lpi1->GetFilesetName (szText3); - pszDesc = FormatString (IDS_ACTION_DUMP, TEXT("%s%s%s%s"), szText, szText2, szText3, FindBaseFileName(l.aActions[ ii ]->Params.sz1)); - break; - - case atRESTORE: - pszDesc = FormatString (IDS_ACTION_RESTORE, TEXT("%s%s"), l.aActions[ ii ]->Params.sz1, FindBaseFileName(l.aActions[ ii ]->Params.sz2)); - break; - - case atSETRESTART: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_SETRESTART, TEXT("%s"), szText); - break; - - case atCHANGEADDR: - l.aActions[ ii ]->Params.lpi1->GetServerName (szText); - pszDesc = FormatString (IDS_ACTION_CHANGEADDR, TEXT("%s"), szText); - break; - - case atOPENCELL: - pszDesc = FormatString (IDS_ACTION_OPENCELL, TEXT("%s"), l.aActions[ ii ]->Params.sz1); - break; - } - - return pszDesc; -} - - -void Action_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nACTIONCOLUMNS; - - for (size_t iCol = 0; iCol < nACTIONCOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = ACTIONCOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = ACTIONCOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = actcolELAPSED | COLUMN_SORTREV; - - lpvi->nColsShown = 2; - lpvi->aColumns[0] = (int)actcolOPERATION; - lpvi->aColumns[1] = (int)actcolELAPSED; -} - - -void Action_ShowConfirmations (BOOL fShow) -{ - l.fShowConfirmations = fShow; -} - - -BOOL Action_CompareNotifyParams (PNOTIFYPARAMS pParams1, PNOTIFYPARAMS pParams2) -{ - if (!pParams1 || !pParams2) - return FALSE; - - if (pParams1->lpi1 != pParams2->lpi1) - return FALSE; - if (pParams1->lpi2 != pParams2->lpi2) - return FALSE; - if (lstrcmp (pParams1->sz1, pParams2->sz1)) - return FALSE; - if (lstrcmp (pParams1->sz2, pParams2->sz2)) - return FALSE; - if (pParams1->dw1 != pParams2->dw1) - return FALSE; - - return TRUE; -} - - -PACTION Action_Begin (ACTIONTYPE Type, PNOTIFYPARAMS pParams) -{ - for (size_t ii = 0; ii < l.cActions; ++ii) - { - if (!l.aActions[ii]) - break; - } - if (!REALLOC (l.aActions, l.cActions, 1+ii, cREALLOC_ACTIONLIST)) - return NULL; - - PACTION pAction = New (ACTION); - memcpy (&pAction->Params, pParams, sizeof(NOTIFYPARAMS)); - pAction->Type = Type; - pAction->dwTickStart = GetTickCount(); - pAction->hDlg = NULL; - - l.aActions[ii] = pAction; - - if (Type != atREFRESH) - l.cActionsInUse++; - - return l.aActions[ii]; -} - - -void Action_SpecifyWindow (PACTION pAction, HWND hDlg) -{ - pAction->hDlg = hDlg; - ShowWindow (hDlg, SW_SHOW); -} - - -PACTION Action_Find (ACTIONTYPE Type, PNOTIFYPARAMS pParams) -{ - for (size_t ii = 0; ii < l.cActions; ++ii) - { - if (!l.aActions[ ii ]) - continue; - - if (l.aActions[ ii ]->Type != Type) - continue; - - if (Action_CompareNotifyParams (&l.aActions[ ii ]->Params, pParams)) - return l.aActions[ ii ]; - } - - return NULL; -} - - -void Action_End (PACTION pParams, DWORD dwStatus) -{ - if (!pParams) - return; - - ACTIONTYPE TypeClosed = atUNUSED; - - for (size_t ii = 0; ii < l.cActions; ++ii) - { - if (l.aActions[ ii ] == pParams) - { - if (l.fShowConfirmations && !dwStatus) - { - switch (l.aActions[ ii ]->Type) - { - case atUNUSED: - case atSCOUT: - case atTIMEOUT: - case atREFRESH: - // don't show confirmation messages for these operations - break; - - default: - LPTSTR pszDesc; - if ((pszDesc = Action_GetDescription (ii)) != NULL) - { - Message (MB_OK | MB_ICONINFORMATION | MB_MODELESS, IDS_CONFIRMATION_TITLE, TEXT("%1"), TEXT("%s"), pszDesc); - FreeString (pszDesc); - } - break; - } - } - - TypeClosed = l.aActions[ ii ]->Type; - - if (IsWindow (l.aActions[ ii ]->hDlg)) - PostMessage (l.aActions[ ii ]->hDlg, WM_COMMAND, IDCANCEL, 0); - - Delete (l.aActions[ii]); - l.aActions[ii] = NULL; - } - } - - // If we've finished all operations in progress, and if the user has - // already closed the app (well, tried to--we would've just hidden the - // window), close for real. - // - if ((TypeClosed != atUNUSED) && (TypeClosed != atREFRESH)) - { - if ((--l.cActionsInUse) == 0) - { - if (g.lpiCell && !IsWindowVisible (g.hMain)) - { - Quit (0); - } - } - } -} - - -BOOL Action_fAnyActive (void) -{ - return (l.cActionsInUse >= 1) ? TRUE : FALSE; -} - - -void Action_OnDestroy (HWND hDlg) -{ - for (size_t ii = 0; ii < l.cActions; ++ii) - { - if (!l.aActions[ ii ]) - continue; - if (l.aActions[ ii ]->hDlg == hDlg) - l.aActions[ ii ]->hDlg = NULL; - } -} - - -/* - * NO-DIALOG OPERATIONS - * - */ - -void Action_Scout_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSCOUT, pParams); -} - -void Action_Scout_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSCOUT, pParams), pParams->status); -} - -void Action_GetServerLogFile_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atGETSERVERLOGFILE, pParams); -} - -void Action_GetServerLogFile_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atGETSERVERLOGFILE, pParams), pParams->status); -} - -void Action_SetServerAuth_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSETSERVERAUTH, pParams); -} - -void Action_SetServerAuth_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSETSERVERAUTH, pParams), pParams->status); -} - -void Action_InstallFile_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atINSTALLFILE, pParams); -} - -void Action_InstallFile_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atINSTALLFILE, pParams), pParams->status); -} - -void Action_UninstallFile_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atUNINSTALLFILE, pParams); -} - -void Action_UninstallFile_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atUNINSTALLFILE, pParams), pParams->status); -} - -void Action_PruneFiles_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atPRUNEFILES, pParams); -} - -void Action_PruneFiles_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atPRUNEFILES, pParams), pParams->status); -} - -void Action_StartService_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSTARTSERVICE, pParams); -} - -void Action_StartService_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSTARTSERVICE, pParams), pParams->status); -} - -void Action_StopService_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSTOPSERVICE, pParams); -} - -void Action_StopService_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSTOPSERVICE, pParams), pParams->status); -} - -void Action_RestartService_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atRESTARTSERVICE, pParams); -} - -void Action_RestartService_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atRESTARTSERVICE, pParams), pParams->status); -} - -void Action_CreateFileset_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atCREATEFILESET, pParams); -} - -void Action_CreateFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atCREATEFILESET, pParams), pParams->status); -} - -void Action_DeleteFileset_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atDELETEFILESET, pParams); -} - -void Action_DeleteFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atDELETEFILESET, pParams), pParams->status); -} - -void Action_SetFilesetQuota_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSETFILESETQUOTA, pParams); -} - -void Action_SetFilesetQuota_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSETFILESETQUOTA, pParams), pParams->status); -} - -void Action_SyncVLDB_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSYNCVLDB, pParams); -} - -void Action_SyncVLDB_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSYNCVLDB, pParams), pParams->status); -} - -void Action_Salvage_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSALVAGE, pParams); -} - -void Action_Salvage_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSALVAGE, pParams), pParams->status); -} - -void Action_SetFilesetRepParams_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSETFILESETREPPARAMS, pParams); -} - -void Action_SetFilesetRepParams_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSETFILESETREPPARAMS, pParams), pParams->status); -} - -void Action_CreateReplica_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atCREATEREPLICA, pParams); -} - -void Action_CreateReplica_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atCREATEREPLICA, pParams), pParams->status); -} - -void Action_RenameFileset_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atRENAMEFILESET, pParams); -} - -void Action_RenameFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atRENAMEFILESET, pParams), pParams->status); -} - -void Action_CreateService_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atCREATESERVICE, pParams); -} - -void Action_CreateService_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atCREATESERVICE, pParams), pParams->status); -} - -void Action_DeleteService_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atDELETESERVICE, pParams); -} - -void Action_DeleteService_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atDELETESERVICE, pParams), pParams->status); -} - -void Action_ReleaseFileset_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atRELEASEFILESET, pParams); -} - -void Action_ReleaseFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atRELEASEFILESET, pParams), pParams->status); -} - -void Action_GetFileDates_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atGETFILEDATES, pParams); -} - -void Action_GetFileDates_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atGETFILEDATES, pParams), pParams->status); -} - -void Action_ExecuteCommand_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atEXECUTECOMMAND, pParams); -} - -void Action_ExecuteCommand_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atEXECUTECOMMAND, pParams), pParams->status); -} - -void Action_AdminListLoad_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atADMINLIST_LOAD, pParams); -} - -void Action_AdminListLoad_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atADMINLIST_LOAD, pParams), pParams->status); -} - -void Action_AdminListSave_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atADMINLIST_SAVE, pParams); -} - -void Action_AdminListSave_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atADMINLIST_SAVE, pParams), pParams->status); -} - -void Action_HostListLoad_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atHOSTLIST_LOAD, pParams); -} - -void Action_HostListLoad_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atHOSTLIST_LOAD, pParams), pParams->status); -} - -void Action_HostListSave_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atHOSTLIST_SAVE, pParams); -} - -void Action_HostListSave_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atHOSTLIST_SAVE, pParams), pParams->status); -} - -void Action_Clone_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atCLONE, pParams); -} - -void Action_Clone_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atCLONE, pParams), pParams->status); -} - -void Action_Clonesys_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atCLONESYS, pParams); -} - -void Action_Clonesys_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atCLONESYS, pParams), pParams->status); -} - -void Action_SetRestart_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atSETRESTART, pParams); -} - -void Action_SetRestart_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atSETRESTART, pParams), pParams->status); -} - -void Action_ChangeAddr_Begin (PNOTIFYPARAMS pParams) -{ - Action_Begin (atCHANGEADDR, pParams); -} - -void Action_ChangeAddr_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atCHANGEADDR, pParams), pParams->status); -} - - -/* - * REFRESHALL DIALOGS - * - */ - -void Action_Refresh_Begin (PNOTIFYPARAMS pParams) -{ - NOTIFYPARAMS ZeroParams; - memset (&ZeroParams, 0x00, sizeof(NOTIFYPARAMS)); - - PACTION pAction; - if ((pAction = Action_Find (atREFRESH, &ZeroParams)) == NULL) - { - if ((pAction = Action_Begin (atREFRESH, &ZeroParams)) != NULL) - { - HWND hDlg = ModelessDialogParam (IDD_REFRESHALL, NULL, (DLGPROC)Action_Refresh_DlgProc, (LPARAM)(pParams->lpi1)); - - if (hDlg == NULL) - Action_End (pAction, pParams->status); - else - Action_SpecifyWindow (pAction, hDlg); - } - } -} - - -void Action_Refresh_Update (PNOTIFYPARAMS pParams) -{ - NOTIFYPARAMS ZeroParams; - memset (&ZeroParams, 0x00, sizeof(NOTIFYPARAMS)); - - PACTION pAction; - if ((pAction = Action_Find (atREFRESH, &ZeroParams)) != NULL) - { - if (pAction->hDlg && IsWindow(pAction->hDlg)) - PostMessage (pAction->hDlg, WM_REFRESH_UPDATE, (WPARAM)pParams->dw1, (LPARAM)pParams->lpi1); - } -} - - -void Action_Refresh_SectionStart (PNOTIFYPARAMS pParams) -{ - NOTIFYPARAMS ZeroParams; - memset (&ZeroParams, 0x00, sizeof(NOTIFYPARAMS)); - - PACTION pAction; - if ((pAction = Action_Find (atREFRESH, &ZeroParams)) != NULL) - { - if (pAction->hDlg && IsWindow(pAction->hDlg)) - PostMessage (pAction->hDlg, WM_REFRESH_SETSECTION, (WPARAM)TRUE, (LPARAM)pParams->dw1); - } -} - - -void Action_Refresh_SectionEnd (PNOTIFYPARAMS pParams) -{ - NOTIFYPARAMS ZeroParams; - memset (&ZeroParams, 0x00, sizeof(NOTIFYPARAMS)); - - PACTION pAction; - if ((pAction = Action_Find (atREFRESH, &ZeroParams)) != NULL) - { - if (pAction->hDlg && IsWindow(pAction->hDlg)) - PostMessage (pAction->hDlg, WM_REFRESH_SETSECTION, (WPARAM)FALSE, (LPARAM)pParams->dw1); - } -} - - -void Action_Refresh_End (PNOTIFYPARAMS pParams) -{ - NOTIFYPARAMS ZeroParams; - memset (&ZeroParams, 0x00, sizeof(NOTIFYPARAMS)); - - Action_End (Action_Find (atREFRESH, &ZeroParams), pParams->status); -} - - -BOOL CALLBACK Action_Refresh_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - LPIDENT lpi; - if ((lpi = (LPIDENT)lp) != NULL) - { - LPTSTR pszDesc = NULL; - TCHAR szName[ cchRESOURCE ]; - - if (lpi->fIsCell()) - { - lpi->GetCellName (szName); - pszDesc = FormatString (IDS_REFRESH_DESC_CELL, TEXT("%s"), szName); - } - else - { - lpi->GetServerName (szName); - pszDesc = FormatString (IDS_REFRESH_DESC_SERVER, TEXT("%s"), szName); - } - if (pszDesc != NULL) - { - SetDlgItemText (hDlg, IDC_REFRESH_DESC, pszDesc); - FreeString (pszDesc); - } - } - - SendDlgItemMessage (hDlg, IDC_REFRESH_PERCENTBAR, PBM_SETRANGE, 0, MAKELPARAM(0,100)); - Action_Refresh_UpdateText (hDlg, lpi, 0); - Action_Refresh_SetSection (hDlg, TRUE, -1); - break; - - case WM_REFRESH_UPDATE: - Action_Refresh_UpdateText (hDlg, (LPIDENT)lp, (DWORD)wp); - break; - - case WM_REFRESH_SETSECTION: - Action_Refresh_SetSection (hDlg, (BOOL)wp, (int)lp); - break; - - case WM_DESTROY: - Action_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_REFRESH_SKIP: - Action_Refresh_SkipSection (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Action_Refresh_UpdateText (HWND hDlg, LPIDENT lpi, DWORD dwPerComplete) -{ - dwPerComplete = limit (0, dwPerComplete, 100); - - SendDlgItemMessage (hDlg, IDC_REFRESH_PERCENTBAR, PBM_SETPOS, (WPARAM)dwPerComplete, 0); - - LPTSTR pszComplete = FormatString (IDS_REFRESH_PERCENT, TEXT("%lu"), dwPerComplete); - SetDlgItemText (hDlg, IDC_REFRESH_PERCENT, pszComplete); - FreeString (pszComplete); - - if (lpi == NULL) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_REFRESH_CURRENT_VLDB); - SetDlgItemText (hDlg, IDC_REFRESH_CURRENT, szText); - } - else - { - TCHAR szCell[ cchNAME ]; - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - TCHAR szService[ cchNAME ]; - - lpi->GetCellName (szCell); - if (!lpi->fIsCell()) - lpi->GetServerName (szServer); - if (lpi->fIsAggregate() || lpi->fIsFileset()) - lpi->GetAggregateName (szAggregate); - if (lpi->fIsFileset()) - lpi->GetFilesetName (szFileset); - if (lpi->fIsService()) - lpi->GetServiceName (szService); - - LPTSTR pszCurrent = NULL; - if (lpi->fIsCell()) - pszCurrent = FormatString (IDS_REFRESH_CURRENT_CELL, TEXT("%s"), szCell); - if (lpi->fIsServer()) - pszCurrent = FormatString (IDS_REFRESH_CURRENT_SERVER, TEXT("%s%s"), szCell, szServer); - else if (lpi->fIsAggregate()) - pszCurrent = FormatString (IDS_REFRESH_CURRENT_AGGREGATE, TEXT("%s%s%s"), szCell, szServer, szAggregate); - else if (lpi->fIsFileset()) - pszCurrent = FormatString (IDS_REFRESH_CURRENT_FILESET, TEXT("%s%s%s%s"), szCell, szServer, szAggregate, szFileset); - else if (lpi->fIsService()) - pszCurrent = FormatString (IDS_REFRESH_CURRENT_SERVICE, TEXT("%s%s%s"), szCell, szServer, szService); - - if (pszCurrent != NULL) - { - SetDlgItemText (hDlg, IDC_REFRESH_CURRENT, pszCurrent); - FreeString (pszCurrent); - } - } -} - - -void Action_Refresh_SetSection (HWND hDlg, BOOL fStart, int idSection) -{ - // Are we ending a section that we don't care about? - // - if ((!fStart) && (idSection != (int)GetWindowLong (hDlg, DWL_USER))) - return; - - if (!fStart) - idSection = -1; // ending a section means new section = -1 (invalid) - - SetWindowLong (hDlg, DWL_USER, idSection); - EnableWindow (GetDlgItem (hDlg, IDC_REFRESH_SKIP), (idSection == -1) ? FALSE : TRUE); -} - - -void Action_Refresh_SkipSection (HWND hDlg) -{ - int idSection; - if ((idSection = (int)GetWindowLong (hDlg, DWL_USER)) != -1) - { - AfsClass_SkipRefresh (idSection); - Action_Refresh_SetSection (hDlg, FALSE, idSection); - } -} - - -/* - * MOVE-FILESET DIALOGS - * - */ - -void Action_MoveFileset_Begin (PNOTIFYPARAMS pParams) -{ - PACTION pAction; - if ((pAction = Action_Begin (atMOVEFILESET, pParams)) != NULL) - { - HWND hDlg = ModelessDialogParam (IDD_SET_MOVING, NULL, (DLGPROC)Action_MoveFileset_DlgProc, (LPARAM)pAction); - - if (hDlg == NULL) - Action_End (pAction, pParams->status); - else - Action_SpecifyWindow (pAction, hDlg); - } -} - - -void Action_MoveFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atMOVEFILESET, pParams), pParams->status); -} - - -BOOL CALLBACK Action_MoveFileset_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - HWND hAnimate = GetDlgItem (hDlg, IDC_ANIMATE); - - switch (msg) - { - case WM_INITDIALOG: - Animate_Open (hAnimate, MAKEINTRESOURCE( AVI_SETMOVE )); - Animate_Play (hAnimate, 0, -1, -1); - - PACTION pAction; - if ((pAction = (PACTION)lp) != NULL) - { - TCHAR szServerSource[ cchNAME ]; - TCHAR szServerTarget[ cchNAME ]; - TCHAR szAggregateSource[ cchNAME ]; - TCHAR szAggregateTarget[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - pAction->Params.lpi1->GetServerName (szServerSource); - pAction->Params.lpi1->GetAggregateName (szAggregateSource); - pAction->Params.lpi1->GetFilesetName (szFileset); - pAction->Params.lpi2->GetServerName (szServerTarget); - pAction->Params.lpi2->GetAggregateName (szAggregateTarget); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_MOVESET_DESC, szText, cchRESOURCE); - - LPTSTR pszText; - pszText = FormatString (szText, TEXT("%s%s%s%s%s"), szServerSource, szAggregateSource, szFileset, szServerTarget, szAggregateTarget); - SetDlgItemText (hDlg, IDC_MOVESET_DESC, pszText); - FreeString (pszText); - } - break; - - case WM_DESTROY: - Animate_Stop (hAnimate); - Animate_Close (hAnimate); - Action_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - - -/* - * DUMP-FILESET DIALOGS - * - */ - -void Action_DumpFileset_Begin (PNOTIFYPARAMS pParams) -{ - PACTION pAction; - if ((pAction = Action_Begin (atDUMP, pParams)) != NULL) - { - HWND hDlg = ModelessDialogParam (IDD_SET_DUMPING, NULL, (DLGPROC)Action_DumpFileset_DlgProc, (LPARAM)pAction); - - if (hDlg == NULL) - Action_End (pAction, pParams->status); - else - Action_SpecifyWindow (pAction, hDlg); - } -} - -void Action_DumpFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atDUMP, pParams), pParams->status); -} - -BOOL CALLBACK Action_DumpFileset_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - HWND hAnimate = GetDlgItem (hDlg, IDC_ANIMATE); - - switch (msg) - { - case WM_INITDIALOG: - Animate_Open (hAnimate, MAKEINTRESOURCE( AVI_SETMOVE )); - Animate_Play (hAnimate, 0, -1, -1); - - PACTION pAction; - if ((pAction = (PACTION)lp) != NULL) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - pAction->Params.lpi1->GetServerName (szServer); - pAction->Params.lpi1->GetAggregateName (szAggregate); - pAction->Params.lpi1->GetFilesetName (szFileset); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_DUMPSET_DESC, szText, cchRESOURCE); - - LPTSTR pszText; - pszText = FormatString (szText, TEXT("%s%s%s%s"), szServer, szAggregate, szFileset, FindBaseFileName(pAction->Params.sz1)); - SetDlgItemText (hDlg, IDC_DUMPSET_DESC, pszText); - FreeString (pszText); - } - break; - - case WM_DESTROY: - Animate_Stop (hAnimate); - Animate_Close (hAnimate); - Action_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - - -/* - * RESTORE-FILESET DIALOGS - * - */ - -void Action_RestoreFileset_Begin (PNOTIFYPARAMS pParams) -{ - PACTION pAction; - if ((pAction = Action_Begin (atRESTORE, pParams)) != NULL) - { - HWND hDlg = ModelessDialogParam (IDD_SET_RESTORING, NULL, (DLGPROC)Action_RestoreFileset_DlgProc, (LPARAM)pAction); - - if (hDlg == NULL) - Action_End (pAction, pParams->status); - else - Action_SpecifyWindow (pAction, hDlg); - } -} - -void Action_RestoreFileset_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atRESTORE, pParams), pParams->status); -} - -BOOL CALLBACK Action_RestoreFileset_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - HWND hAnimate = GetDlgItem (hDlg, IDC_ANIMATE); - - switch (msg) - { - case WM_INITDIALOG: - Animate_Open (hAnimate, MAKEINTRESOURCE( AVI_SETMOVE )); - Animate_Play (hAnimate, 0, -1, -1); - - PACTION pAction; - if ((pAction = (PACTION)lp) != NULL) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_RESTORESET_DESC, szText, cchRESOURCE); - - LPTSTR pszText; - pszText = FormatString (szText, TEXT("%s%s"), ((LPTSTR)pAction->Params.sz1), FindBaseFileName(pAction->Params.sz2)); - SetDlgItemText (hDlg, IDC_RESTORESET_DESC, pszText); - FreeString (pszText); - } - break; - - case WM_DESTROY: - Animate_Stop (hAnimate); - Animate_Close (hAnimate); - Action_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - - -/* - * OPEN-CELL DIALOGS - * - */ - -void Action_OpenCell_Begin (PNOTIFYPARAMS pParams) -{ - PACTION pAction; - if ((pAction = Action_Begin (atOPENCELL, pParams)) != NULL) - { - if (!IsWindow (g.hMain) || !IsWindowVisible (g.hMain)) - { - HWND hDlg = ModelessDialogParam (IDD_OPENINGCELL, NULL, (DLGPROC)Action_OpenCell_DlgProc, (LPARAM)pAction); - - if (hDlg == NULL) - Action_End (pAction, pParams->status); - else - Action_SpecifyWindow (pAction, hDlg); - } - } -} - -void Action_OpenCell_End (PNOTIFYPARAMS pParams) -{ - Action_End (Action_Find (atOPENCELL, pParams), pParams->status); -} - -BOOL CALLBACK Action_OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static int iFrameLast = 0; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - switch (msg) - { - case WM_INITDIALOG: - AfsAppLib_StartAnimation (GetDlgItem (hDlg, IDC_ANIMATE)); - - PACTION pAction; - if ((pAction = (PACTION)lp) != NULL) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_DESC, szText, cchRESOURCE); - - LPTSTR pszText; - pszText = FormatString (szText, TEXT("%s"), pAction->Params.sz1); - SetDlgItemText (hDlg, IDC_OPENCELL_DESC, pszText); - FreeString (pszText); - } - break; - - case WM_DESTROY: - Action_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - diff --git a/src/WINNT/afssvrmgr/action.h b/src/WINNT/afssvrmgr/action.h deleted file mode 100644 index 96cdcaf6a..000000000 --- a/src/WINNT/afssvrmgr/action.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef ACTION_H -#define ACTION_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ActionNotification_MainThread (NOTIFYEVENT evt, PNOTIFYPARAMS pParams); - -void Action_OpenWindow (void); -void Action_CloseWindow (void); -void Action_SetDefaultView (LPVIEWINFO lpvi); -void Action_WindowToTop (BOOL fTop); - -BOOL Action_fAnyActive (void); - -void Action_ShowConfirmations (BOOL fShow); - - -#endif - diff --git a/src/WINNT/afssvrmgr/agg_col.cpp b/src/WINNT/afssvrmgr/agg_col.cpp deleted file mode 100644 index b319a1754..000000000 --- a/src/WINNT/afssvrmgr/agg_col.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "agg_col.h" - - -/* - * AGGREGATE-VIEW COLUMNS _____________________________________________________ - * - */ - -void Aggregates_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nAGGREGATECOLUMNS; - - for (size_t iCol = 0; iCol < nAGGREGATECOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = AGGREGATECOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = AGGREGATECOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = aggcolNAME; - - lpvi->nColsShown = 7; - lpvi->aColumns[0] = (int)aggcolNAME; - lpvi->aColumns[1] = (int)aggcolID; - lpvi->aColumns[2] = (int)aggcolDEVICE; - lpvi->aColumns[3] = (int)aggcolUSED; - lpvi->aColumns[4] = (int)aggcolTOTAL; - lpvi->aColumns[5] = (int)aggcolUSED_PER; - lpvi->aColumns[6] = (int)aggcolSTATUS; -} - - -size_t Aggregates_GetAlertCount (LPAGGREGATE lpAggregate) -{ - return Alert_GetCount (lpAggregate->GetIdentifier()); -} - - -LPTSTR Aggregates_GetColumnText (LPIDENT lpi, AGGREGATECOLUMN aggcol, BOOL fShowServerName) -{ - static TCHAR aszBuffer[ nAGGREGATECOLUMNS ][ cchRESOURCE ]; - static size_t iBufferNext = 0; - LPTSTR pszBuffer = aszBuffer[ iBufferNext++ ]; - if (iBufferNext == nAGGREGATECOLUMNS) - iBufferNext = 0; - pszBuffer[0] = TEXT('\0'); - - LPAGGREGATE_PREF lpap; - LPAGGREGATESTATUS lpas = NULL; - LPTSTR pszDevice = NULL; - if ((lpap = (LPAGGREGATE_PREF)lpi->GetUserParam()) != NULL) - { - lpas = &lpap->asLast; - pszDevice = lpap->szDevice; - } - - switch (aggcol) - { - case aggcolNAME: - if (!fShowServerName) - lpi->GetAggregateName (pszBuffer); - else - { - TCHAR szNameSvr[ cchNAME ]; - TCHAR szNameAgg[ cchNAME ]; - lpi->GetServerName (szNameSvr); - lpi->GetAggregateName (szNameAgg); - LPTSTR pszName = FormatString (IDS_SERVER_AGGREGATE, TEXT("%s%s"), szNameSvr, szNameAgg); - lstrcpy (pszBuffer, pszName); - FreeString (pszName); - } - break; - - case aggcolID: - if (lpas) - wsprintf (pszBuffer, TEXT("%lu"), lpas->dwID); - break; - - case aggcolDEVICE: - if (pszDevice) - lstrcpy (pszBuffer, pszDevice); - break; - - case aggcolUSED: - if (lpas) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * (lpas->ckStorageTotal - lpas->ckStorageFree)); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case aggcolUSED_PER: - if (lpas) - { - DWORD dwPer = 100; - if (lpas->ckStorageTotal != 0) - dwPer = (DWORD)( 100.0 * (lpas->ckStorageTotal - lpas->ckStorageFree) / lpas->ckStorageTotal ); - - dwPer = limit( 0, dwPer, 100 ); - - LPTSTR psz = FormatString (IDS_PERCENTAGE, TEXT("%lu"), dwPer); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case aggcolALLOCATED: - if (lpas) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * lpas->ckStorageAllocated); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case aggcolFREE: - if (lpas) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * lpas->ckStorageFree); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case aggcolTOTAL: - if (lpas) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * lpas->ckStorageTotal); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case aggcolSTATUS: - LPTSTR pszDesc; - if ((pszDesc = Alert_GetQuickDescription (lpi)) == NULL) - GetString (pszBuffer, IDS_STATUS_NOALERTS); - else - { - lstrcpy (pszBuffer, pszDesc); - FreeString (pszDesc); - } - break; - } - - return pszBuffer; -} - diff --git a/src/WINNT/afssvrmgr/agg_col.h b/src/WINNT/afssvrmgr/agg_col.h deleted file mode 100644 index 639749eeb..000000000 --- a/src/WINNT/afssvrmgr/agg_col.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AGGREGS_H -#define AGGREGS_H - - -/* - * AGGREGATE-VIEW COLUMNS _____________________________________________________ - * - */ - -typedef enum - { - aggcolNAME, - aggcolID, - aggcolDEVICE, - aggcolUSED, - aggcolUSED_PER, - aggcolALLOCATED, - aggcolFREE, - aggcolTOTAL, - aggcolSTATUS - } AGGREGATECOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -AGGREGATECOLUMNS[] = - { - { IDS_AGGCOL_NAME, 100 }, // aggcolNAME - { IDS_AGGCOL_ID, 100 | COLUMN_RIGHTJUST }, // aggcolID - { IDS_AGGCOL_DEVICE, 100 }, // aggcolDEVICE - { IDS_AGGCOL_USED, 100 | COLUMN_RIGHTJUST }, // aggcolUSED - { IDS_AGGCOL_USED_PER, 100 | COLUMN_RIGHTJUST }, // aggcolUSED_PER - { IDS_AGGCOL_ALLOCATED,100 | COLUMN_RIGHTJUST }, // aggcolALLOCATED - { IDS_AGGCOL_FREE, 100 | COLUMN_RIGHTJUST }, // aggcolFREE - { IDS_AGGCOL_TOTAL, 100 | COLUMN_RIGHTJUST }, // aggcolTOTAL - { IDS_AGGCOL_STATUS, 300 }, // aggcolSTATUS - }; - -#define nAGGREGATECOLUMNS (sizeof(AGGREGATECOLUMNS)/sizeof(AGGREGATECOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Aggregates_SetDefaultView (LPVIEWINFO lpvi); - -size_t Aggregates_GetAlertCount (LPAGGREGATE lpAggregate); -LPTSTR Aggregates_GetColumnText (LPIDENT lpi, AGGREGATECOLUMN aggcol, BOOL fShowServerName = FALSE); - - -#endif - diff --git a/src/WINNT/afssvrmgr/agg_general.cpp b/src/WINNT/afssvrmgr/agg_general.cpp deleted file mode 100644 index 12e02fff5..000000000 --- a/src/WINNT/afssvrmgr/agg_general.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "agg_general.h" -#include "svr_general.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - - -/* - * AGGREGATE PREFERENCES ______________________________________________________ - * - */ - -PVOID Aggregates_LoadPreferences (LPIDENT lpiAggregate) -{ - LPAGGREGATE_PREF pap = New (AGGREGATE_PREF); - - if (!RestorePreferences (lpiAggregate, pap, sizeof(AGGREGATE_PREF))) - { - pap->perWarnAggFull = -1; // use the server's default value - pap->fWarnAggAlloc = FALSE; - - Alert_SetDefaults (&pap->oa); - } - - Alert_Initialize (&pap->oa); - return pap; -} - - -BOOL Aggregates_SavePreferences (LPIDENT lpiAggregate) -{ - BOOL rc = FALSE; - - PVOID pap = lpiAggregate->GetUserParam(); - if (pap != NULL) - { - rc = StorePreferences (lpiAggregate, pap, sizeof(AGGREGATE_PREF)); - } - - return rc; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPIDENT Aggregates_GetFocused (HWND hDlg) -{ - return (LPIDENT)FL_GetFocusedData (GetDlgItem (hDlg, IDC_AGG_LIST)); -} - - -LPIDENT Aggregates_GetSelected (HWND hDlg) -{ - return (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); -} - diff --git a/src/WINNT/afssvrmgr/agg_general.h b/src/WINNT/afssvrmgr/agg_general.h deleted file mode 100644 index 279d71d77..000000000 --- a/src/WINNT/afssvrmgr/agg_general.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AGG_GENERAL_H -#define AGG_GENERAL_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -PVOID Aggregates_LoadPreferences (LPIDENT lpiAggregate); -BOOL Aggregates_SavePreferences (LPIDENT lpiAggregate); - -LPIDENT Aggregates_GetFocused (HWND hDlg); -LPIDENT Aggregates_GetSelected (HWND hDlg); - - -#endif - diff --git a/src/WINNT/afssvrmgr/agg_prop.cpp b/src/WINNT/afssvrmgr/agg_prop.cpp deleted file mode 100644 index eadbd139a..000000000 --- a/src/WINNT/afssvrmgr/agg_prop.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "agg_prop.h" -#include "agg_general.h" -#include "svr_general.h" -#include "propcache.h" -#include "problems.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Aggregates_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Aggregates_General_OnInitDialog (HWND hDlg); -void Aggregates_General_OnApply (HWND hDlg); -void Aggregates_General_OnWarnings (HWND hDlg); -void Aggregates_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp); -void Aggregates_General_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Aggregates_ShowProperties (LPIDENT lpiAggregate, size_t nAlerts, BOOL fJumpToThreshold, HWND hParentModal) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcAGG_PROP, lpiAggregate)) != NULL) - { - SetFocus (hCurrent); - - if (fJumpToThreshold) - { - HWND hTab; - if ((hTab = GetDlgItem (hCurrent, IDC_PROPSHEET_TABCTRL)) != NULL) - { - int nTabs = TabCtrl_GetItemCount (hTab); - TabCtrl_SetCurSel (hTab, nTabs-1); - - NMHDR nm; - nm.hwndFrom = hTab; - nm.idFrom = IDC_PROPSHEET_TABCTRL; - nm.code = TCN_SELCHANGE; - SendMessage (hCurrent, WM_NOTIFY, 0, (LPARAM)&nm); - } - } - } - else - { - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - lpiAggregate->GetServerName (szSvrName); - lpiAggregate->GetAggregateName (szAggName); - LPTSTR pszTitle = FormatString (IDS_AGG_PROP_TITLE, TEXT("%s%s"), szSvrName, szAggName); - - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - psh->fMadeCaption = TRUE; - psh->sh.hwndParent = hParentModal; - - if (PropSheet_AddProblemsTab (psh, IDD_AGG_PROBLEMS, lpiAggregate, nAlerts) && - PropSheet_AddTab (psh, IDS_AGG_GENERAL_TAB, IDD_AGG_GENERAL, (DLGPROC)Aggregates_General_DlgProc, (LPARAM)lpiAggregate, TRUE, FALSE)) - { - if (fJumpToThreshold) - psh->sh.nStartPage = psh->sh.nPages-1; - - if (hParentModal) - PropSheet_ShowModal (psh, PumpMessage); - else - PropSheet_ShowModeless (psh); - } - } -} - - -BOOL CALLBACK Aggregates_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_AGG_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcAGG_PROP, (LPIDENT)lp, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Aggregates_General_OnInitDialog (hDlg); - StartTask (taskAGG_PROP_INIT, hDlg, lpi); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskAGG_PROP_INIT) - Aggregates_General_OnEndTask_InitDialog (hDlg, ptp); - else if (ptp->idTask == taskAGG_PROP_APPLY) - Aggregates_General_OnEndTask_Apply (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - break; - - case IDAPPLY: - Aggregates_General_OnApply (hDlg); - break; - - case IDC_AGG_WARNALLOC: - PropSheetChanged (hDlg); - break; - - case IDC_AGG_WARN: - case IDC_AGG_WARN_AGGFULL: - case IDC_AGG_WARN_AGGFULL_DEF: - Aggregates_General_OnWarnings (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_AGG_WARN_AGGFULL_PERCENT: - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Aggregates_General_OnInitDialog (HWND hDlg) -{ - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetAggregateName (szAggName); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_AGG_NAME, szText, cchRESOURCE); - LPTSTR pszText = FormatString (szText, TEXT("%s%s"), szSvrName, szAggName); - SetDlgItemText (hDlg, IDC_AGG_NAME, pszText); - FreeString (pszText); - - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARNALLOC), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), FALSE); -} - - -void Aggregates_General_OnApply (HWND hDlg) -{ - LPAGG_PROP_APPLY_PACKET lpp; - if ((lpp = New (AGG_PROP_APPLY_PACKET)) != NULL) - { - lpp->lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - lpp->fIDC_AGG_WARNALLOC = IsDlgButtonChecked (hDlg, IDC_AGG_WARNALLOC); - lpp->fIDC_AGG_WARN = IsDlgButtonChecked (hDlg, IDC_AGG_WARN); - lpp->fIDC_AGG_WARN_AGGFULL_DEF = IsDlgButtonChecked (hDlg, IDC_AGG_WARN_AGGFULL_DEF); - lpp->wIDC_AGG_WARN_AGGFULL_PERCENT = (short)SP_GetPos (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT)); - - StartTask (taskAGG_PROP_APPLY, hDlg, lpp); - } -} - - -void Aggregates_General_OnWarnings (HWND hDlg) -{ - if (!IsDlgButtonChecked (hDlg, IDC_AGG_WARN)) - { - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DESC), FALSE); - } - else if (IsDlgButtonChecked (hDlg, IDC_AGG_WARN_AGGFULL)) - { - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DESC), TRUE); - } - else // (IsDlgButtonChecked (hDlg, IDC_AGG_WARN_AGGFULL_DEF)) - { - CheckDlgButton (hDlg, IDC_AGG_WARN_AGGFULL_DEF, TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DESC), FALSE); - } -} - - -void Aggregates_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - if (!ptp->rc) - { - TCHAR szUnknown[ cchRESOURCE ]; - GetString (szUnknown, IDS_UNKNOWN); - SetDlgItemText (hDlg, IDC_AGG_ID, szUnknown); - SetDlgItemText (hDlg, IDC_AGG_DEVICE, szUnknown); - SetDlgItemText (hDlg, IDC_AGG_FILESETS, szUnknown); - SetDlgItemText (hDlg, IDC_AGG_USAGE, szUnknown); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetAggregateName (szAggName); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_AGGREGATE_STATUS, TEXT("%s%s"), szSvrName, szAggName); - } - else - { - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%lu"), TASKDATA(ptp)->as.dwID); - SetDlgItemText (hDlg, IDC_AGG_ID, szText); - - SetDlgItemText (hDlg, IDC_AGG_DEVICE, TASKDATA(ptp)->pszText1); - - LPTSTR pszText = FormatString (IDS_AGG_FILESETS, TEXT("%lu%.1B"), TASKDATA(ptp)->nFilesets, (double)cb1KB * (double)(TASKDATA(ptp)->as.ckStorageAllocated)); - SetDlgItemText (hDlg, IDC_AGG_FILESETS, pszText); - FreeString (pszText); - - double dUsed = 1024.0 * (TASKDATA(ptp)->as.ckStorageTotal - TASKDATA(ptp)->as.ckStorageFree); - double dTotal = 1024.0 * TASKDATA(ptp)->as.ckStorageTotal; - DWORD dwPer = 100; - if (TASKDATA(ptp)->as.ckStorageTotal != 0) - { - dwPer = (DWORD)( 100.0 * (TASKDATA(ptp)->as.ckStorageTotal - TASKDATA(ptp)->as.ckStorageFree) / TASKDATA(ptp)->as.ckStorageTotal ); - dwPer = limit( 0, dwPer, 100 ); - } - - LPTSTR pszUsage = FormatString (IDS_USAGE_AGGREGATE, TEXT("%.1B%.1B%lu"), dUsed, dTotal, dwPer); - SetDlgItemText (hDlg, IDC_AGG_USAGE, pszUsage); - FreeString (pszUsage); - - SendDlgItemMessage (hDlg, IDC_AGG_USAGEBAR, PBM_SETRANGE, 0, MAKELPARAM(0,100)); - SendDlgItemMessage (hDlg, IDC_AGG_USAGEBAR, PBM_SETPOS, (WPARAM)dwPer, 0); - - if (TASKDATA(ptp)->lpsp->fWarnAggAlloc) - { - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARNALLOC), TRUE); - CheckDlgButton (hDlg, IDC_AGG_WARNALLOC, TASKDATA(ptp)->lpap->fWarnAggAlloc); - } - - EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN), TRUE); - - if (TASKDATA(ptp)->lpsp->perWarnAggFull == 0) - { - GetString (szText, IDS_AGGFULL_WARN_OFF); - SetDlgItemText (hDlg, IDC_AGG_WARN_AGGFULL_DEF, szText); - } - else - { - pszText = FormatString (IDS_AGGFULL_WARN_ON, TEXT("%lu"), TASKDATA(ptp)->lpsp->perWarnAggFull); - SetDlgItemText (hDlg, IDC_AGG_WARN_AGGFULL_DEF, pszText); - FreeString (pszText); - } - - CheckDlgButton (hDlg, IDC_AGG_WARN, (TASKDATA(ptp)->lpap->perWarnAggFull != 0)); - if (TASKDATA(ptp)->lpap->perWarnAggFull != 0) - { - if (TASKDATA(ptp)->lpap->perWarnAggFull != -1) - CheckDlgButton (hDlg, IDC_AGG_WARN_AGGFULL, TRUE); - else - CheckDlgButton (hDlg, IDC_AGG_WARN_AGGFULL_DEF, TRUE); - } - - CreateSpinner (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), - 10, FALSE, // base, signed - 1, - (TASKDATA(ptp)->lpap->perWarnAggFull == 0 || TASKDATA(ptp)->lpap->perWarnAggFull == -1) ? perDEFAULT_AGGFULL_WARNING : TASKDATA(ptp)->lpap->perWarnAggFull, - 100); // min, default, max - - Aggregates_General_OnWarnings (hDlg); - } -} - - -void Aggregates_General_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetAggregateName (szAggName); - ErrorDialog (ptp->status, IDS_ERROR_CHANGE_AGGREGATE_STATUS, TEXT("%s%s"), szSvrName, szAggName); - } -} - diff --git a/src/WINNT/afssvrmgr/agg_prop.h b/src/WINNT/afssvrmgr/agg_prop.h deleted file mode 100644 index 1c7360f99..000000000 --- a/src/WINNT/afssvrmgr/agg_prop.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AGG_PROP_H -#define AGG_PROP_H - -/* - * TYPEDEFS ___________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - BOOL fIDC_AGG_WARNALLOC; - BOOL fIDC_AGG_WARN; - BOOL fIDC_AGG_WARN_AGGFULL_DEF; - short wIDC_AGG_WARN_AGGFULL_PERCENT; - } AGG_PROP_APPLY_PACKET, *LPAGG_PROP_APPLY_PACKET; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Aggregates_ShowProperties (LPIDENT lpi, size_t nAlerts, BOOL fThreshold = FALSE, HWND hParentModal = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/agg_tab.cpp b/src/WINNT/afssvrmgr/agg_tab.cpp deleted file mode 100644 index a4ac9150d..000000000 --- a/src/WINNT/afssvrmgr/agg_tab.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "agg_tab.h" -#include "agg_general.h" -#include "svr_window.h" -#include "svr_general.h" -#include "display.h" -#include "command.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdAggregates[] = { - { IDC_AGG_DESC, raSizeX, 0, 0 }, - { IDC_AGG_LIST, raSizeX | raSizeY, 0, 0 }, - { IDC_AGG_CREATESET, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Aggregates_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns); - -void Aggregates_SubclassList (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Aggregates_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAgg)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - { - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - ResizeWindow (hDlg, awdAggregates, rwaMoveToHere, &rTab); - - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAgg); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAgg); - - Aggregates_SubclassList (hDlg); - } - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - DontNotifyMeEver (hDlg); - FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAgg); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdAggregates, rwaFixupGuts); - break; - - case WM_SERVER_CHANGED: - { - LPIDENT lpiServer = Server_GetServerForChild (hDlg); - DontNotifyMeEver (hDlg); - NotifyMe (WHEN_AGGS_CHANGE, lpiServer, hDlg, 0); - - // Fix the text at the top of the Aggregates tab: - // - TCHAR szName[ cchRESOURCE ]; - LPTSTR pszText; - - if (lpiServer != NULL) - { - LPSERVER_PREF lpsp = (LPSERVER_PREF)lpiServer->GetUserParam(); - lpiServer->GetServerName (szName); - if (lpsp && !lpsp->fIsMonitored) - pszText = FormatString (IDS_AGGREGATE_UNMON, TEXT("%s"), szName); - else - pszText = FormatString (IDS_AGGREGATES_IN_SERVER, TEXT("%s"), szName); - } - else if (g.lpiCell != NULL) - { - g.lpiCell->GetCellName (szName); - if (g.sub) - pszText = FormatString (IDS_AGGREGATE_SOME, TEXT("%s"), szName); - else - pszText = FormatString (IDS_AGGREGATES_IN_CELL, TEXT("%s"), szName); - } - else - { - pszText = FormatString (IDS_AGGREGATES_IN_NOTHING); - } - - SetDlgItemText (hDlg, IDC_AGG_DESC, pszText); - FreeString (pszText); - - UpdateDisplay_Aggregates (FALSE, GetDlgItem (hDlg, IDC_AGG_LIST), NULL, 0, NULL, NULL, NULL); - } - break; - - case WM_NOTIFY_FROM_DISPATCH: - Aggregates_OnNotifyFromDispatch ((LPNOTIFYSTRUCT)lp); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_LDBLCLICK: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_AGG_LIST)) - { - if (FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) - PostMessage (GetDlgItem (hDlg, IDC_AGG_LIST), WM_COMMAND, M_PROPERTIES, 0); - return TRUE; - } - break; - } - break; - - case WM_CONTEXTMENU: - { - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient ((HWND)wp, &ptClient); - - if ((HWND)wp == GetDlgItem (hDlg, IDC_AGG_LIST)) - Aggregates_ShowPopupMenu ((HWND)wp, ptClient, ptScreen); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_AGG_CREATESET: - SendMessage (GetDlgItem (hDlg, IDC_AGG_LIST), WM_COMMAND, M_SET_CREATE, 0); - break; - } - break; - } - - return FALSE; -} - - -void Aggregates_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns) -{ - switch (lpns->evt) - { - case evtRefreshAggregatesEnd: - case evtRefreshStatusEnd: - case evtAlertsChanged: - case evtDestroy: - UpdateDisplay_Aggregates (FALSE, GetDlgItem (lpns->hwndTarget, IDC_AGG_LIST), lpns->Params.lpi1, lpns->Params.status, NULL, NULL, NULL); - break; - } -} - - -static LONG procAggregatesList = 0; - -LRESULT CALLBACK Aggregates_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procAggregatesList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procAggregatesList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procAggregatesList != 0) - SetWindowLong (hList, GWL_WNDPROC, procAggregatesList); - break; - - case WM_COMMAND: - StartContextCommand (Server_GetWindowForChild (GetParent(hList)), - Server_GetServerForChild (GetParent(hList)), - Aggregates_GetFocused (GetParent(hList)), - LOWORD(wp)); - break; - } - - return rc; -} - - -void Aggregates_SubclassList (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST); - procAggregatesList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Aggregates_SubclassListProc); -} - - -void Aggregates_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen) -{ - if (!ptScreen.x && !ptScreen.y) - { - RECT rWindow; - GetWindowRect (hList, &rWindow); - ptScreen.x = rWindow.left + (rWindow.right -rWindow.left)/2; - ptScreen.y = rWindow.top + (rWindow.bottom -rWindow.top)/2; - Aggregates_ShowParticularPopupMenu (hList, ptScreen, NULL); - } - else if (FL_HitTestForHeaderBar (hList, ptList)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - else - { - LPIDENT lpiSelected = NULL; - - HLISTITEM hItem; - if ((hItem = FastList_ItemFromPoint (hList, &ptList, TRUE)) != NULL) - lpiSelected = (LPIDENT)FastList_GetItemParam (hList, hItem); - - if (lpiSelected && (lpiSelected != (LPIDENT)FL_GetSelectedData (hList))) - lpiSelected = NULL; - - if (lpiSelected && lpiSelected->fIsServer()) - Server_ShowParticularPopupMenu (hList, ptScreen, lpiSelected); - else - Aggregates_ShowParticularPopupMenu (hList, ptScreen, lpiSelected); - } -} - - -void Aggregates_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiAggregate) -{ - HMENU hm; - - if (lpiAggregate == NULL) - hm = TaLocale_LoadMenu (MENU_AGG_NONE); - else - hm = TaLocale_LoadMenu (MENU_AGG); - - if (hm != NULL) - { - if (lpiAggregate == NULL) - { - HMENU hmView = GetSubMenu (hm, 0); - - CheckMenuRadioItem (hmView, - M_VIEW_ONEICON, M_VIEW_STATUS, - (gr.ivAgg == ivTWOICONS) ? M_VIEW_TWOICONS : - (gr.ivAgg == ivONEICON) ? M_VIEW_ONEICON : M_VIEW_STATUS, - MF_BYCOMMAND); - } - - DisplayContextMenu (hm, ptScreen, hParent); - } -} - diff --git a/src/WINNT/afssvrmgr/agg_tab.h b/src/WINNT/afssvrmgr/agg_tab.h deleted file mode 100644 index 7de008bcb..000000000 --- a/src/WINNT/afssvrmgr/agg_tab.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AGG_TAB_H -#define AGG_TAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Aggregates_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Aggregates_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen); -void Aggregates_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiAggregate); - - -#endif - diff --git a/src/WINNT/afssvrmgr/alert.cpp b/src/WINNT/afssvrmgr/alert.cpp deleted file mode 100644 index 597db4cca..000000000 --- a/src/WINNT/afssvrmgr/alert.cpp +++ /dev/null @@ -1,1126 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "alert.h" -#include "creds.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL Alert_Scout_CheckServer (LPSERVER lpServer); - -void Alert_BeginUpdate (LPIDENT lpi, LPSERVER *ppServer); -void Alert_EndUpdate (LPIDENT lpi, LPSERVER lpServer); - -void Alert_RemoveFunc (LPOBJECTALERTS lpoa, size_t iAlert); -LPTSTR Alert_GetDescriptionFunc (LPIDENT lpiPrimary, size_t iAlertPrimary, LPIDENT lpiServer, BOOL fFull); -LPTSTR Alert_GetRemedyFunc (LPIDENT lpiPrimary, size_t iAlertPrimary, LPIDENT lpiServer); -LPTSTR Alert_GetButtonFunc (LPIDENT lpiPrimary, size_t iAlertPrimary, LPIDENT lpiServer); - -DWORD WINAPI Alert_ScoutProc (LPVOID lp); -void Alert_Scout_SetUpToDate (LPOBJECTALERTS lpoa); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPOBJECTALERTS Alert_GetObjectAlerts (LPIDENT lpi, BOOL fAlwaysServer, ULONG *pStatus) -{ - LPOBJECTALERTS lpoa = NULL; - - if (fAlwaysServer || lpi->fIsServer()) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpi->GetServer()->GetUserParam()) != NULL) - { - lpoa = &lpsp->oa; - } - } - else if (lpi->fIsService()) - { - LPSERVICE_PREF lpsp; - if ((lpsp = (LPSERVICE_PREF)lpi->GetUserParam()) != NULL) - { - lpoa = &lpsp->oa; - } - } - else if (lpi->fIsAggregate()) - { - LPAGGREGATE_PREF lpap; - if ((lpap = (LPAGGREGATE_PREF)lpi->GetUserParam()) != NULL) - { - lpoa = &lpap->oa; - } - } - else if (lpi->fIsFileset()) - { - LPFILESET_PREF lpfp; - if ((lpfp = (LPFILESET_PREF)lpi->GetUserParam()) != NULL) - { - lpoa = &lpfp->oa; - } - } - - return lpoa; -} - - -void Alert_BeginUpdate (LPIDENT lpi, LPSERVER *ppServer) -{ - if (lpi->fIsServer()) - { - *ppServer = NULL; - } - else - { - *ppServer = lpi->OpenServer(); - } -} - - -void Alert_EndUpdate (LPIDENT lpi, LPSERVER lpServer) -{ - // If we just updated some aggregate, fileset or service, then the - // associated server's secondary alerts are probably out-of-date. - // Update them. - // - if (lpServer != NULL) - { - LPOBJECTALERTS lpoaServer = Alert_GetObjectAlerts (lpServer->GetIdentifier()); - LPOBJECTALERTS lpoaChild = Alert_GetObjectAlerts (lpi); - - if (lpoaServer) - { - for (size_t iAlert = 0; iAlert < lpoaServer->nAlerts; ) - { - if ( (lpoaServer->aAlerts[ iAlert ].alert == alertSECONDARY) && - (lpoaServer->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary == lpi) ) - { - Alert_RemoveFunc (lpoaServer, iAlert); - } - else - { - ++iAlert; - } - } - } - - if (lpoaServer && lpoaChild) - { - BOOL fNeedBadCredsWarning = FALSE; - BOOL fHaveBadCredsWarning = FALSE; - - for (size_t iAlert = 0; iAlert < lpoaServer->nAlerts; ++iAlert) - { - if (lpoaServer->aAlerts[ iAlert ].alert == alertSECONDARY) - { - ALERT alert = Alert_GetAlert (lpoaServer->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary, - lpoaServer->aAlerts[ iAlert ].aiSECONDARY.iSecondary); - if (alert == alertNO_SVRENT) - fNeedBadCredsWarning = TRUE; - } - } - for (iAlert = 0; iAlert < lpoaChild->nAlerts; ++iAlert) - { - if (lpoaChild->aAlerts[ iAlert ].alert == alertNO_SVRENT) - fNeedBadCredsWarning = TRUE; - } - if (lpoaServer->nAlerts && - lpoaServer->aAlerts[ 0 ].alert == alertBADCREDS) - { - fHaveBadCredsWarning = TRUE; - } - - if (fNeedBadCredsWarning) - { - fNeedBadCredsWarning = !CheckCredentials (FALSE); - } - - if (fHaveBadCredsWarning && !fNeedBadCredsWarning) - { - Alert_RemoveFunc (lpoaServer, 0); - } - else if (fNeedBadCredsWarning && !fHaveBadCredsWarning) - { - for (iAlert = min( lpoaServer->nAlerts, nAlertsMAX-1 ); - iAlert > 0; - --iAlert) - { - memcpy (&lpoaServer->aAlerts[ iAlert ], &lpoaServer->aAlerts[ iAlert-1 ], sizeof(ALERTINFO)); - } - lpoaServer->aAlerts[0].alert = alertBADCREDS; - lpoaServer->nAlerts = min( nAlertsMAX, lpoaServer->nAlerts+1 ); - } - - for (iAlert = 0; iAlert < lpoaChild->nAlerts; ++iAlert) - { - if (lpoaServer->nAlerts < nAlertsMAX) - { - lpoaServer->aAlerts[ lpoaServer->nAlerts ].alert = alertSECONDARY; - lpoaServer->aAlerts[ lpoaServer->nAlerts ].aiSECONDARY.lpiSecondary = lpi; - lpoaServer->aAlerts[ lpoaServer->nAlerts ].aiSECONDARY.iSecondary = iAlert; - lpoaServer->nAlerts ++; - } - } - } - - lpServer->Close(); - } -} - - -void Alert_SetDefaults (LPOBJECTALERTS lpoa) -{ - if (lpoa != NULL) - { - memset (lpoa, 0x00, sizeof(OBJECTALERTS)); - lpoa->cTickRefresh = DEFAULT_SCOUT_REFRESH_RATE; - } -} - - -void Alert_Initialize (LPOBJECTALERTS lpoa) -{ - if (lpoa != NULL) - { - lpoa->dwTickNextTest = 0; - lpoa->dwTickNextRefresh = 0; - lpoa->nAlerts = 0; - } -} - - -void Alert_RemoveSecondary (LPIDENT lpiChild) -{ - BOOL fChangedAlerts = FALSE; - - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpiChild, TRUE)) != NULL) - { - for (size_t iAlert = 0; iAlert < lpoa->nAlerts; ) - { - if ( (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) && - (lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary == lpiChild) ) - { - Alert_RemoveFunc (lpoa, iAlert); - fChangedAlerts = TRUE; - } - else - { - ++iAlert; - } - } - - - BOOL fNeedBadCredsWarning = FALSE; - - for (iAlert = 0; iAlert < lpoa->nAlerts; ++iAlert) - { - if (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) - { - ALERT alert = Alert_GetAlert (lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary, - lpoa->aAlerts[ iAlert ].aiSECONDARY.iSecondary); - if (alert == alertNO_SVRENT) - fNeedBadCredsWarning = TRUE; - } - } - - if ( (!fNeedBadCredsWarning) && - (lpoa->nAlerts && (lpoa->aAlerts[ 0 ].alert == alertBADCREDS)) ) - { - Alert_RemoveFunc (lpoa, 0); - fChangedAlerts = TRUE; - } - } - - if (fChangedAlerts) - { - PostNotification (evtAlertsChanged, lpiChild->GetServer()); - PostNotification (evtAlertsChanged, lpiChild); - } -} - - -void Alert_Remove (LPIDENT lpi, size_t iAlert) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) != NULL) - { - if (iAlert < lpoa->nAlerts) - { - LPSERVER lpServer; - Alert_BeginUpdate (lpi, &lpServer); - - Alert_RemoveFunc (lpoa, iAlert); - - Alert_EndUpdate (lpi, lpServer); - } - } -} - - -void Alert_RemoveFunc (LPOBJECTALERTS lpoa, size_t iAlert) -{ - if (iAlert < lpoa->nAlerts-1) - { - memcpy (&lpoa->aAlerts[ iAlert ], &lpoa->aAlerts[ lpoa->nAlerts-1 ], sizeof(ALERTINFO)); - } - lpoa->nAlerts --; -} - - -void Alert_AddPrimary (LPIDENT lpi, LPALERTINFO lpai) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) != NULL) - { - if (lpoa->nAlerts < nAlertsMAX) - { - LPSERVER lpServer; - Alert_BeginUpdate (lpi, &lpServer); - - memcpy (&lpoa->aAlerts[ lpoa->nAlerts ], lpai, sizeof(ALERTINFO)); - lpoa->nAlerts ++; - - Alert_EndUpdate (lpi, lpServer); - } - } -} - - -void Alert_Scout_ServerStatus (LPIDENT lpi, ULONG status) -{ - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpi)) != NULL) - { - BOOL fChanged = FALSE; - - for (size_t iAlert = 0; iAlert < lpoa->nAlerts; ++iAlert) - { - if (lpoa->aAlerts[ iAlert ].alert == alertTIMEOUT) - { - fChanged = TRUE; - Alert_RemoveFunc (lpoa, iAlert); - break; - } - } - - if (status != 0) - { - size_t iInsert = 0; - if (lpoa->nAlerts && (lpoa->aAlerts[0].alert == alertBADCREDS)) - iInsert = 1; - - for (size_t iHole = iInsert; iHole < lpoa->nAlerts; ++iHole) - { - if (lpoa->aAlerts[ iHole ].alert == alertINVALID) - break; - } - if (iHole < nAlertsMAX) - { - for (size_t iTarget = iHole; iTarget > iInsert; --iTarget) - { - memcpy (&lpoa->aAlerts[ iTarget ], &lpoa->aAlerts[ iTarget-1 ], sizeof(ALERTINFO)); - } - - lpoa->nAlerts ++; - lpoa->aAlerts[ iInsert ].alert = alertTIMEOUT; - lpoa->aAlerts[ iInsert ].aiTIMEOUT.status = status; - GetSystemTime (&lpoa->aAlerts[ iInsert ].aiTIMEOUT.stLastAttempt); - - fChanged = TRUE; - } - } - - if (fChanged) - { - PostNotification (evtAlertsChanged, lpi); - } - } -} - - -size_t Alert_GetCount (LPIDENT lpi) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) == NULL) - return 0; - - return lpoa->nAlerts; -} - - -ALERT Alert_GetAlert (LPIDENT lpi, size_t iAlert) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) == NULL) - return alertINVALID; - - if (iAlert > lpoa->nAlerts) - return alertINVALID; - - if (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) - { - return Alert_GetAlert (lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary, - lpoa->aAlerts[ iAlert ].aiSECONDARY.iSecondary); - } - - return lpoa->aAlerts[ iAlert ].alert; -} - - -LPIDENT Alert_GetIdent (LPIDENT lpi, size_t iAlert) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) == NULL) - return NULL; - - if (iAlert > lpoa->nAlerts) - return NULL; - - if (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) - { - return lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary; - } - - return lpi; -} - - -LPTSTR Alert_GetQuickDescription (LPIDENT lpi) -{ - LPTSTR pszStatus = NULL; - - size_t cAlerts; - if ((cAlerts = Alert_GetCount (lpi)) <= 1) - pszStatus = Alert_GetDescription (lpi, 0, FALSE); - else if (lpi->fIsServer()) - pszStatus = FormatString (IDS_SERVER_MULTIPLE_PROBLEMS, TEXT("%lu"), cAlerts); - else if (lpi->fIsService()) - pszStatus = FormatString (IDS_SERVICE_MULTIPLE_PROBLEMS, TEXT("%lu"), cAlerts); - else if (lpi->fIsAggregate()) - pszStatus = FormatString (IDS_AGGREGATE_MULTIPLE_PROBLEMS, TEXT("%lu"), cAlerts); - else if (lpi->fIsFileset()) - pszStatus = FormatString (IDS_FILESET_MULTIPLE_PROBLEMS, TEXT("%lu"), cAlerts); - - return pszStatus; -} - - -LPTSTR Alert_GetDescription (LPIDENT lpi, size_t iAlert, BOOL fFull) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) == NULL) - return NULL; - - if (!lpoa->nAlerts && lpi->fIsServer()) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpi->GetUserParam()) != NULL) - { - if (!lpsp->fIsMonitored) - { - TCHAR szName[ cchNAME ]; - lpi->GetServerName (szName); - return FormatString (IDS_ALERT_DESCSHORT_UNMONITORED, TEXT("%s"), szName); - } - } - } - - if (iAlert >= lpoa->nAlerts) - return NULL; - - if (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) - { - return Alert_GetDescriptionFunc (lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary, - lpoa->aAlerts[ iAlert ].aiSECONDARY.iSecondary, - lpi, - fFull); - } - - return Alert_GetDescriptionFunc (lpi, iAlert, NULL, fFull); -} - - -LPTSTR Alert_GetRemedy (LPIDENT lpi, size_t iAlert) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) == NULL) - return NULL; - - if (iAlert >= lpoa->nAlerts) - return NULL; - - if (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) - { - return Alert_GetRemedyFunc (lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary, - lpoa->aAlerts[ iAlert ].aiSECONDARY.iSecondary, - lpi); - } - - return Alert_GetRemedyFunc (lpi, iAlert, NULL); -} - - -LPTSTR Alert_GetButton (LPIDENT lpi, size_t iAlert) -{ - LPOBJECTALERTS lpoa; - - if ((lpoa = Alert_GetObjectAlerts (lpi)) == NULL) - return NULL; - - if (iAlert >= lpoa->nAlerts) - return NULL; - - if (lpoa->aAlerts[ iAlert ].alert == alertSECONDARY) - { - return Alert_GetButtonFunc (lpoa->aAlerts[ iAlert ].aiSECONDARY.lpiSecondary, - lpoa->aAlerts[ iAlert ].aiSECONDARY.iSecondary, - lpi); - } - - return Alert_GetButtonFunc (lpi, iAlert, NULL); -} - - -LPTSTR Alert_GetDescriptionFunc (LPIDENT lpiPrimary, size_t iAlertPrimary, LPIDENT lpiServer, BOOL fFull) -{ - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpiPrimary)) != NULL) - { - int ids; - TCHAR szServer[ cchRESOURCE ]; - TCHAR szService[ cchRESOURCE ]; - TCHAR szAggregate[ cchRESOURCE ]; - TCHAR szFileset[ cchRESOURCE ]; - - switch (lpoa->aAlerts[ iAlertPrimary ].alert) - { - case alertTIMEOUT: - ids = (fFull) ? IDS_ALERT_DESCFULL_TIMEOUT : IDS_ALERT_DESCSHORT_TIMEOUT; - lpiPrimary->GetServerName (szServer); - return FormatString (ids, TEXT("%s%t%e"), szServer, &lpoa->aAlerts[ iAlertPrimary ].aiTIMEOUT.stLastAttempt, lpoa->aAlerts[ iAlertPrimary ].aiTIMEOUT.status); - - case alertFULL: - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - if (lpiPrimary->fIsAggregate()) - { - ids = (fFull) ? IDS_ALERT_DESCFULL_AGG_FULL : IDS_ALERT_DESCSHORT_AGG_FULL; - return FormatString (ids, TEXT("%s%s%d%.1B"), szServer, szAggregate, lpoa->aAlerts[ iAlertPrimary ].aiFULL.perWarning, 1024.0 * (double)lpoa->aAlerts[ iAlertPrimary ].aiFULL.ckWarning); - } - else if (lpiPrimary->fIsFileset()) - { - ids = (fFull) ? IDS_ALERT_DESCFULL_SET_FULL : IDS_ALERT_DESCSHORT_SET_FULL; - lpiPrimary->GetFilesetName (szFileset); - return FormatString (ids, TEXT("%s%s%s%d%.1B"), szServer, szAggregate, szFileset, lpoa->aAlerts[ iAlertPrimary ].aiFULL.perWarning, 1024.0 * (double)lpoa->aAlerts[ iAlertPrimary ].aiFULL.ckWarning); - } - break; - - case alertNO_VLDBENT: - ids = (fFull) ? IDS_ALERT_DESCFULL_NO_VLDBENT : IDS_ALERT_DESCSHORT_NO_VLDBENT; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - lpiPrimary->GetFilesetName (szFileset); - return FormatString (ids, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - - case alertNO_SVRENT: - if (lpiPrimary->fIsFileset()) - { - ids = (fFull) ? IDS_ALERT_DESCFULL_NO_SVRENT_SET : IDS_ALERT_DESCSHORT_NO_SVRENT_SET; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - lpiPrimary->GetFilesetName (szFileset); - return FormatString (ids, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - else - { - ids = (fFull) ? IDS_ALERT_DESCFULL_NO_SVRENT_AGG : IDS_ALERT_DESCSHORT_NO_SVRENT_AGG; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - return FormatString (ids, TEXT("%s%s"), szServer, szAggregate); - } - break; - - case alertSTOPPED: - ids = (fFull) ? IDS_ALERT_DESCFULL_STOPPED : IDS_ALERT_DESCSHORT_STOPPED; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetServiceName (szService); - return FormatString (ids, TEXT("%s%s%t%t%lu"), szServer, szService, &lpoa->aAlerts[ iAlertPrimary ].aiSTOPPED.stStopped, &lpoa->aAlerts[ iAlertPrimary ].aiSTOPPED.stLastError, lpoa->aAlerts[ iAlertPrimary ].aiSTOPPED.errLastError); - - case alertBADCREDS: - ids = (fFull) ? IDS_ALERT_DESCFULL_BADCREDS : IDS_ALERT_DESCSHORT_BADCREDS; - lpiPrimary->GetServerName (szServer); - return FormatString (ids, TEXT("%s"), szServer); - - case alertOVERALLOC: - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - ids = (fFull) ? IDS_ALERT_DESCFULL_AGG_ALLOC : IDS_ALERT_DESCSHORT_AGG_ALLOC; - return FormatString (ids, TEXT("%s%s%.1B%.1B"), szServer, szAggregate, 1024.0 * (double)(lpoa->aAlerts[ iAlertPrimary ].aiOVERALLOC.ckCapacity), 1024.0 * (double)(lpoa->aAlerts[ iAlertPrimary ].aiOVERALLOC.ckAllocated)); - - case alertSTATE_NO_VNODE: - ids = (fFull) ? IDS_ALERT_DESCFULL_STATE_NO_VNODE : IDS_ALERT_DESCSHORT_STATE_NO_VNODE; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - lpiPrimary->GetFilesetName (szFileset); - return FormatString (ids, TEXT("%s%s%s%08lX"), szServer, szAggregate, szFileset, lpoa->aAlerts[ iAlertPrimary ].aiSTATE.State); - - case alertSTATE_NO_SERVICE: - ids = (fFull) ? IDS_ALERT_DESCFULL_STATE_NO_SERVICE : IDS_ALERT_DESCSHORT_STATE_NO_SERVICE; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - lpiPrimary->GetFilesetName (szFileset); - return FormatString (ids, TEXT("%s%s%s%08lX"), szServer, szAggregate, szFileset, lpoa->aAlerts[ iAlertPrimary ].aiSTATE.State); - - case alertSTATE_OFFLINE: - ids = (fFull) ? IDS_ALERT_DESCFULL_STATE_OFFLINE : IDS_ALERT_DESCSHORT_STATE_OFFLINE; - lpiPrimary->GetServerName (szServer); - lpiPrimary->GetAggregateName (szAggregate); - lpiPrimary->GetFilesetName (szFileset); - return FormatString (ids, TEXT("%s%s%s%08lX"), szServer, szAggregate, szFileset, lpoa->aAlerts[ iAlertPrimary ].aiSTATE.State); - } - } - - return NULL; -} - - -LPTSTR Alert_GetRemedyFunc (LPIDENT lpiPrimary, size_t iAlertPrimary, LPIDENT lpiServer) -{ - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpiPrimary)) != NULL) - { - switch (lpoa->aAlerts[ iAlertPrimary ].alert) - { - case alertTIMEOUT: - return FormatString (IDS_ALERT_FIX_TIMEOUT); - case alertFULL: - if (lpiPrimary->fIsAggregate()) - return FormatString (IDS_ALERT_FIX_AGG_FULL); - else if (lpiPrimary->fIsFileset()) - return FormatString (IDS_ALERT_FIX_SET_FULL); - break; - case alertNO_VLDBENT: - return FormatString (IDS_ALERT_FIX_NO_VLDBENT); - case alertNO_SVRENT: - if (lpiPrimary->fIsFileset()) - return FormatString (IDS_ALERT_FIX_NO_SVRENT_SET); - else - return FormatString (IDS_ALERT_FIX_NO_SVRENT_AGG); - break; - case alertSTOPPED: - return FormatString (IDS_ALERT_FIX_STOPPED); - case alertBADCREDS: - return FormatString (IDS_ALERT_FIX_BADCREDS); - case alertOVERALLOC: - return FormatString (IDS_ALERT_FIX_AGG_ALLOC); - case alertSTATE_NO_VNODE: - return FormatString (IDS_ALERT_FIX_STATE_NO_VNODE); - case alertSTATE_NO_SERVICE: - return FormatString (IDS_ALERT_FIX_STATE_NO_SERVICE); - case alertSTATE_OFFLINE: - return FormatString (IDS_ALERT_FIX_STATE_OFFLINE); - } - } - - return NULL; -} - - -LPTSTR Alert_GetButtonFunc (LPIDENT lpiPrimary, size_t iAlertPrimary, LPIDENT lpiServer) -{ - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpiPrimary)) != NULL) - { - switch (lpoa->aAlerts[ iAlertPrimary ].alert) - { - case alertTIMEOUT: - return FormatString (IDS_ALERT_BUTTON_TRYAGAIN); - case alertFULL: - return FormatString (IDS_ALERT_BUTTON_WARNINGS); - case alertNO_VLDBENT: - return NULL; - case alertNO_SVRENT: - return NULL; - case alertSTOPPED: - return FormatString (IDS_ALERT_BUTTON_VIEWLOG); - case alertBADCREDS: - return FormatString (IDS_ALERT_BUTTON_GETCREDS); - case alertOVERALLOC: - return NULL; - case alertSTATE_NO_VNODE: - return NULL; - case alertSTATE_NO_SERVICE: - return NULL; - case alertSTATE_OFFLINE: - return NULL; - } - } - - return NULL; -} - - -/* - * SCOUT ______________________________________________________________________ - * - * (okay, well, our simulated Scout anyway) - * - */ - -static HANDLE hScout = 0; // scout's thread -static HANDLE heScoutWakeup = 0; // scout's wakeup event - -BOOL Alert_StartScout (ULONG *pStatus) -{ - if (hScout == 0) // create scout? - { - heScoutWakeup = CreateEvent (NULL, FALSE, FALSE, TEXT("AfsSvrMgr Alert Scout Wakeup")); - - DWORD dwThreadID; - if ((hScout = CreateThread (NULL, 0, - (LPTHREAD_START_ROUTINE)Alert_ScoutProc, - NULL, 0, - &dwThreadID)) == NULL) - { - if (pStatus) - *pStatus = GetLastError(); - return FALSE; - } - - SetThreadPriority (hScout, THREAD_PRIORITY_BELOW_NORMAL); - } - else // or just wake up scout from its slumber? - { - PulseEvent (heScoutWakeup); - } - - return TRUE; -} - - -BOOL Alert_Scout_QueueCheckServer (LPIDENT lpiServer, ULONG *pStatus) -{ - Alert_Scout_SetOutOfDate (lpiServer); - return Alert_StartScout (pStatus); -} - - -DWORD WINAPI Alert_ScoutProc (LPVOID lp) -{ - // We'll keep working forever... - // - for (;;) - { - AfsClass_Enter(); - - LPCELL lpCell = (g.lpiCell == NULL) ? NULL : g.lpiCell->OpenCell(); - if (lpCell != NULL) - { - // See if our credentials have expired - // - CheckForExpiredCredentials(); - - // See if any new servers have arrived, or old servers disappeared. - // - lpCell->RefreshServerList(); - - // Check all the out-of-date servers we can find. - // - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - LPIDENT lpiServer = lpServer->GetIdentifier(); - LPOBJECTALERTS lpoa; - - if ( ((lpoa = Alert_GetObjectAlerts (lpiServer)) != NULL) && - (lpoa->dwTickNextTest <= GetTickCount()) ) - { - - // Okay! We've found a server that needs to be tested for - // alert conditions. Do that now, and when we're done, set - // its next query-time to some distance in the future. - // - if (lpoa->dwTickNextRefresh == 0) - { - if (lpoa->cTickRefresh != 0) - lpoa->dwTickNextRefresh = lpoa->cTickRefresh + GetTickCount(); - } - else if (lpoa->dwTickNextRefresh <= GetTickCount()) - { - (void)lpServer->Invalidate(); - (void)lpServer->RefreshAll(); - lpoa->dwTickNextRefresh = lpoa->cTickRefresh + GetTickCount(); - } - - (void)Alert_Scout_CheckServer (lpServer); - } - - lpServer->Close(); - } - - lpCell->Close(); - } - - AfsClass_Leave(); - - // Now that we have completed a pass over the servers in this cell, - // and now that we're not holding any critical sections on which - // other threads would otherwise block, go to sleep for a while. - // - WaitForSingleObjectEx (heScoutWakeup, 45L * cmsec1SECOND, FALSE); - } - - return 0; -} - - -void Alert_Scout_SetOutOfDate (LPIDENT lpi) -{ - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpi, TRUE)) != NULL) - { - lpoa->dwTickNextTest = GetTickCount() -1; - } -} - - -void Alert_Scout_SetUpToDate (LPOBJECTALERTS lpoa) -{ - if (lpoa != NULL) - { - lpoa->dwTickNextTest = GetTickCount() + lpoa->cTickRefresh; - } -} - - -BOOL Alert_Scout_CheckServer (LPSERVER lpServer) -{ - BOOL rc = TRUE; - - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpServer->GetUserParam()) != NULL) - { - LPOBJECTALERTS lpoa; - if ((lpoa = Alert_GetObjectAlerts (lpServer->GetIdentifier())) != NULL) - { - PostNotification (evtScoutBegin, lpServer->GetIdentifier()); - - BOOL fChangedServerAlerts = FALSE; - - DWORD dwTickNextTestWhenStarted = lpoa->dwTickNextTest; - - // First look through the server's aggregates and filesets, to - // find any which have usages over their warning threshholds. - // - HENUM heAggregate; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&heAggregate); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&heAggregate)) - { - BOOL fChangedAggregateAlerts = FALSE; - LPIDENT lpiAggregate = lpAggregate->GetIdentifier(); - - LPOBJECTALERTS lpoaAggregate; - if ((lpoaAggregate = Alert_GetObjectAlerts (lpAggregate->GetIdentifier())) != NULL) - { - for (size_t iAlert = 0; iAlert < lpoaAggregate->nAlerts; ) - { - if ( (lpoaAggregate->aAlerts[ iAlert ].alert == alertFULL) || - (lpoaAggregate->aAlerts[ iAlert ].alert == alertOVERALLOC) || - (lpoaAggregate->aAlerts[ iAlert ].alert == alertNO_SVRENT) ) - { - fChangedAggregateAlerts = TRUE; - fChangedServerAlerts = TRUE; - Alert_Remove (lpAggregate->GetIdentifier(), iAlert); - } - else - ++iAlert; - } - - LPAGGREGATE_PREF lpap; - if ((lpap = (LPAGGREGATE_PREF)lpAggregate->GetUserParam()) != NULL) - { - short wGhost = lpAggregate->GetGhostStatus(); - if (lpsp->fWarnAggNoServ && !(wGhost & GHOST_HAS_SERVER_ENTRY)) - { - ALERTINFO ai; - ai.alert = alertNO_SVRENT; - Alert_AddPrimary (lpAggregate->GetIdentifier(), &ai); - fChangedAggregateAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - - if (lpsp->fWarnAggAlloc && lpap->fWarnAggAlloc) - { - AGGREGATESTATUS as; - if (lpAggregate->GetStatus (&as, TRUE)) - { - if (as.ckStorageAllocated > as.ckStorageTotal) - { - ALERTINFO ai; - ai.alert = alertOVERALLOC; - ai.aiOVERALLOC.ckAllocated = as.ckStorageAllocated; - ai.aiOVERALLOC.ckCapacity = as.ckStorageTotal; - Alert_AddPrimary (lpAggregate->GetIdentifier(), &ai); - fChangedAggregateAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - } - } - - short perWarnAggFull = lpap->perWarnAggFull; - if (perWarnAggFull == -1) - perWarnAggFull = lpsp->perWarnAggFull; - if (perWarnAggFull != 0) - { - AGGREGATESTATUS as; - if (lpAggregate->GetStatus (&as, TRUE)) - { - if (as.ckStorageTotal != 0) - { - short perNow = (short)( (double)(as.ckStorageTotal - as.ckStorageFree) * 100.0 / (double)(as.ckStorageTotal) ); - - if (perNow > perWarnAggFull) - { - ALERTINFO ai; - ai.alert = alertFULL; - ai.aiFULL.perWarning = perWarnAggFull; - ai.aiFULL.ckWarning = (ULONG)( (double)perWarnAggFull * (double)(as.ckStorageTotal) / 100.0 ); - Alert_AddPrimary (lpAggregate->GetIdentifier(), &ai); - fChangedAggregateAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - } - } - } - } - } - - HENUM heFileset; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&heFileset); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&heFileset)) - { - BOOL fChangedFilesetAlerts = FALSE; - LPIDENT lpiFileset = lpFileset->GetIdentifier(); - - LPOBJECTALERTS lpoaFileset; - if ((lpoaFileset = Alert_GetObjectAlerts (lpFileset->GetIdentifier())) != NULL) - { - for (size_t iAlert = 0; iAlert < lpoaFileset->nAlerts; ) - { - if ( (lpoaFileset->aAlerts[ iAlert ].alert == alertFULL) || - (lpoaFileset->aAlerts[ iAlert ].alert == alertSTATE_NO_VNODE) || - (lpoaFileset->aAlerts[ iAlert ].alert == alertSTATE_NO_SERVICE) || - (lpoaFileset->aAlerts[ iAlert ].alert == alertSTATE_OFFLINE) || - (lpoaFileset->aAlerts[ iAlert ].alert == alertNO_VLDBENT) || - (lpoaFileset->aAlerts[ iAlert ].alert == alertNO_SVRENT) ) - { - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - Alert_Remove (lpFileset->GetIdentifier(), iAlert); - } - else - ++iAlert; - } - } - - LPFILESET_PREF lpfp; - if ((lpfp = (LPFILESET_PREF)lpFileset->GetUserParam()) != NULL) - { - FILESETSTATUS fs; - if (lpFileset->GetStatus (&fs, TRUE)) - { - if (fs.State & fsNO_VNODE) - { - ALERTINFO ai; - ai.alert = alertSTATE_NO_VNODE; - ai.aiSTATE.State = fs.State; - Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - else if (fs.State & fsNO_SERVICE) - { - ALERTINFO ai; - ai.alert = alertSTATE_NO_SERVICE; - ai.aiSTATE.State = fs.State; - Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - else if (fs.State & fsOFFLINE) - { - ALERTINFO ai; - ai.alert = alertSTATE_OFFLINE; - ai.aiSTATE.State = fs.State; - Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - - short perWarnSetFull = lpfp->perWarnSetFull; - if (perWarnSetFull == -1) - perWarnSetFull = lpsp->perWarnSetFull; - if (perWarnSetFull != 0) - { - if (fs.Type == ftREADWRITE) - { - if (fs.ckQuota != 0) - { - short perNow = (short)( (double)(fs.ckUsed) * 100.0 / (double)(fs.ckQuota) ); - - if (perNow > perWarnSetFull) - { - ALERTINFO ai; - ai.alert = alertFULL; - ai.aiFULL.perWarning = perWarnSetFull; - ai.aiFULL.ckWarning = (ULONG)( (double)perWarnSetFull * (double)(fs.ckQuota) / 100.0 ); - Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - } - } - } - } - - short wGhost = lpFileset->GetGhostStatus(); - if (lpsp->fWarnSetNoVLDB && !(wGhost & GHOST_HAS_VLDB_ENTRY)) - { - ALERTINFO ai; - ai.alert = alertNO_VLDBENT; - Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - if (lpsp->fWarnSetNoServ && !(wGhost & GHOST_HAS_SERVER_ENTRY) && !(fs.Type == ftREPLICA)) - { - ALERTINFO ai; - ai.alert = alertNO_SVRENT; - Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); - fChangedFilesetAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - } - - lpFileset->Close(); - if (fChangedFilesetAlerts) - { - PostNotification (evtAlertsChanged, lpiFileset); - } - } - - lpAggregate->Close(); - if (fChangedAggregateAlerts) - { - PostNotification (evtAlertsChanged, lpiAggregate); - } - } - - // Next look through the server's servces to find any - // which have stopped. - // - HENUM heService; - for (LPSERVICE lpService = lpServer->ServiceFindFirst (&heService); lpService; lpService = lpServer->ServiceFindNext (&heService)) - { - BOOL fChangedServiceAlerts = FALSE; - LPIDENT lpiService = lpService->GetIdentifier(); - - LPOBJECTALERTS lpoaService; - if ((lpoaService = Alert_GetObjectAlerts (lpService->GetIdentifier())) != NULL) - { - for (size_t iAlert = 0; iAlert < lpoaService->nAlerts; ) - { - if (lpoaService->aAlerts[ iAlert ].alert == alertSTOPPED) - { - fChangedServiceAlerts = TRUE; - fChangedServerAlerts = TRUE; - Alert_Remove (lpService->GetIdentifier(), iAlert); - } - else - ++iAlert; - } - - LPSERVICE_PREF lpcp; - if ((lpcp = (LPSERVICE_PREF)lpService->GetUserParam()) != NULL) - { - if (lpcp->fWarnSvcStop && lpsp->fWarnSvcStop) - { - SERVICESTATUS ss; - if (lpService->GetStatus (&ss, TRUE)) - { - if (ss.state != SERVICESTATE_RUNNING) - { - ALERTINFO ai; - ai.alert = alertSTOPPED; - memcpy (&ai.aiSTOPPED.stStopped, &ss.timeLastStop, sizeof(SYSTEMTIME)); - memcpy (&ai.aiSTOPPED.stLastError, &ss.timeLastFail, sizeof(SYSTEMTIME)); - ai.aiSTOPPED.errLastError = ss.dwErrLast; - Alert_AddPrimary (lpService->GetIdentifier(), &ai); - fChangedServiceAlerts = TRUE; - fChangedServerAlerts = TRUE; - } - } - } - } - } - - lpService->Close(); - if (fChangedServiceAlerts) - { - PostNotification (evtAlertsChanged, lpiService); - } - } - - if (rc && (dwTickNextTestWhenStarted == lpoa->dwTickNextTest)) - { - Alert_Scout_SetUpToDate (lpoa); - } - - if (fChangedServerAlerts) - { - PostNotification (evtAlertsChanged, lpServer->GetIdentifier()); - } - - PostNotification (evtScoutEnd, lpServer->GetIdentifier()); - } - } - - return rc; -} - diff --git a/src/WINNT/afssvrmgr/alert.h b/src/WINNT/afssvrmgr/alert.h deleted file mode 100644 index ce02c2e51..000000000 --- a/src/WINNT/afssvrmgr/alert.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef ALERT_H -#define ALERT_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define nAlertsMAX 32 - -#define cmsec1SECOND (1000L) -#define cmsec1MINUTE (cmsec1SECOND * 60L) -#define cmsec1HOUR (cmsec1MINUTE * 60L) -#define cmsec1DAY (cmsec1HOUR * 24L) - -#define DEFAULT_SCOUT_REFRESH_RATE (1L * cmsec1HOUR) - -typedef enum - { - alertINVALID = 0, // (end-of-list) - alertSECONDARY, // Server alerted because agg(etc) did - alertTIMEOUT, // Server could not be contacted - alertFULL, // Usage is above warning threshold - alertNO_VLDBENT, // Fileset has no VLDB entry - alertNO_SVRENT, // Fileset has no Server entry - alertSTOPPED, // Service stopped unexpectedly - alertBADCREDS, // May not be able to access FTSERVER - alertOVERALLOC, // Aggregate allocation exceeds capacity - alertSTATE_NO_VNODE, // Fileset has not VNode - alertSTATE_NO_SERVICE, // Fileset has no service - alertSTATE_OFFLINE, // Fileset is offline - } ALERT; - - -typedef struct - { - ALERT alert; - - struct - { - struct { - LPIDENT lpiSecondary; - size_t iSecondary; - } aiSECONDARY; - - struct { - SYSTEMTIME stLastAttempt; - ULONG status; - } aiTIMEOUT; - - struct { - short perWarning; - ULONG ckWarning; - } aiFULL; - - struct { - int nothing; - } aiNO_VLDBENT; - - struct { - int nothing; - } aiNO_SVRENT; - - struct { - SYSTEMTIME stStopped; - SYSTEMTIME stLastError; - ULONG errLastError; - } aiSTOPPED; - - struct { - int nothing; - } aiBADCREDS; - - struct { - ULONG ckAllocated; - ULONG ckCapacity; - } aiOVERALLOC; - - struct { - FILESETSTATE State; - } aiSTATE; - }; - } ALERTINFO, *LPALERTINFO; - - -typedef struct - { - DWORD cTickRefresh; // zero indicates no auto-refresh - DWORD dwTickNextRefresh; - DWORD dwTickNextTest; - size_t nAlerts; - ALERTINFO aAlerts[ nAlertsMAX ]; - } OBJECTALERTS, *LPOBJECTALERTS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -LPOBJECTALERTS Alert_GetObjectAlerts (LPIDENT lpi, BOOL fAlwaysServer = FALSE, ULONG *pStatus = NULL); - -void Alert_SetDefaults (LPOBJECTALERTS lpoa); -void Alert_Initialize (LPOBJECTALERTS lpoa); -void Alert_Scout_SetOutOfDate (LPIDENT lpi); -void Alert_Scout_ServerStatus (LPIDENT lpi, ULONG status); - -size_t Alert_GetCount (LPIDENT lpi); -ALERT Alert_GetAlert (LPIDENT lpi, size_t iIndex); -LPIDENT Alert_GetIdent (LPIDENT lpi, size_t iIndex); -LPTSTR Alert_GetDescription (LPIDENT lpi, size_t iIndex, BOOL fFull); -LPTSTR Alert_GetRemedy (LPIDENT lpi, size_t iIndex); -LPTSTR Alert_GetButton (LPIDENT lpi, size_t iIndex); -LPTSTR Alert_GetQuickDescription (LPIDENT lpi); - -void Alert_RemoveSecondary (LPIDENT lpiChild); -void Alert_Remove (LPIDENT lpi, size_t iIndex); -void Alert_AddPrimary (LPIDENT lpi, LPALERTINFO lpai); - -BOOL Alert_StartScout (ULONG *pStatus = NULL); - -BOOL Alert_Scout_QueueCheckServer (LPIDENT lpi, ULONG *pStatus = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/cmdline.cpp b/src/WINNT/afssvrmgr/cmdline.cpp deleted file mode 100644 index 287250ba3..000000000 --- a/src/WINNT/afssvrmgr/cmdline.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "../afsapplib/afsapplib.h" - -#include "svrmgr.h" -#include "cmdline.h" -#include "action.h" -#include "creds.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef enum { - swCELL, - swSUBSET, - swSERVER, - swRESET, - swCONFIRM, - swUSER, - swPASSWORD, - swLOOKUP, - swUSEEXISTING -} SWITCH; - -static struct { - TCHAR szSwitch[ cchRESOURCE ]; - BOOL fGetsValue; - BOOL fPresent; - TCHAR szValue[ cchRESOURCE ]; -} aSWITCHES[] = { - { TEXT("cell"), TRUE, FALSE, TEXT("") }, - { TEXT("subset"), TRUE, FALSE, TEXT("") }, - { TEXT("server"), TRUE, FALSE, TEXT("") }, - { TEXT("reset"), FALSE, FALSE, TEXT("") }, - { TEXT("confirm"), FALSE, FALSE, TEXT("") }, - { TEXT("user"), TRUE, FALSE, TEXT("") }, - { TEXT("password"), TRUE, FALSE, TEXT("") }, - { TEXT("lookup"), FALSE, FALSE, TEXT("") }, - { TEXT("useexisting"), FALSE, FALSE, TEXT("") } -}; - -#define nSWITCHES (sizeof(aSWITCHES) / sizeof(aSWITCHES[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -#define iswhite(_ch) ( ((_ch)==TEXT(' ')) || ((_ch)==TEXT('\t')) ) - -void cdecl CommandLineHelp (int ids, LPTSTR pszFormat = NULL, ...); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -CMDLINEOP ParseCommandLine (LPTSTR pszCmdLine) -{ - for (size_t ii = 0; ii < nSWITCHES; ++ii) - aSWITCHES[ ii ].fPresent = FALSE; - - // Search through pszCmdLine for switches; each switch must be - // preceeded by "/" or "-". - // - while (pszCmdLine && *pszCmdLine) - { - while (iswhite(*pszCmdLine)) - ++pszCmdLine; - if (!*pszCmdLine) - break; - - if ( (*pszCmdLine != '-') && (*pszCmdLine != '/') ) - { - CommandLineHelp (IDS_CMDLINE_SYNTAX); - return opCLOSEAPP; - } - - ++pszCmdLine; - - // Okay, we've found what is probably the start of a switch. - // See if it matches anything. - // - for (ii = 0; ii < nSWITCHES; ++ii) - { - size_t cch = lstrlen(aSWITCHES[ ii ].szSwitch); - if (lstrncmpi (pszCmdLine, aSWITCHES[ ii ].szSwitch, cch)) - continue; - - // If the switch wants a value, it must be followed by ":" - // or whitespace; if it doesn't, it must be followed by "/" - // or whitespace. - // - LPTSTR pszAfter = &pszCmdLine[ cch ]; - if (iswhite (*pszAfter) || (!*pszAfter) || - ((*pszAfter == TEXT(':')) && (aSWITCHES[ ii ].fGetsValue)) || - ((*pszAfter == TEXT('/')) && (!aSWITCHES[ ii ].fGetsValue)) ) - { - break; // found a switch! - } - } - - if (ii >= nSWITCHES) - { - TCHAR szCopy[ cchRESOURCE ]; - lstrcpy (szCopy, pszCmdLine); - for (LPTSTR pch = szCopy; - *pch && !iswhite(*pch) && !(*pch == TEXT('/')) && !(*pch == TEXT(':')); - ++pch) - ; - *pch = TEXT('\0'); - CommandLineHelp (IDS_CMDLINE_UNRECOGNIZED, TEXT("%s"), szCopy); - return opCLOSEAPP; - } - if (aSWITCHES[ ii ].fPresent) - { - CommandLineHelp (IDS_CMDLINE_DUPLICATE, TEXT("%s"), aSWITCHES[ ii ].szSwitch); - return opCLOSEAPP; - } - - // Woo hoo! Found what appears to be a valid switch. Parse it now. - // - aSWITCHES[ ii ].fPresent = TRUE; - pszCmdLine += lstrlen( aSWITCHES[ ii ].szSwitch ); - while (iswhite (*pszCmdLine)) - ++pszCmdLine; - - if (*pszCmdLine == TEXT(':')) - { - if (!aSWITCHES[ ii ].fGetsValue) - { - CommandLineHelp (IDS_CMDLINE_UNEXPECTVALUE, TEXT("%s"), aSWITCHES[ ii ].szSwitch); - return opCLOSEAPP; - } - for (++pszCmdLine; iswhite (*pszCmdLine); ++pszCmdLine) - ; - } - - if (aSWITCHES[ ii ].fGetsValue) - { - if ( (*pszCmdLine == TEXT('/')) || (*pszCmdLine == TEXT('\0')) ) - { - CommandLineHelp (IDS_CMDLINE_MISSINGVAL, TEXT("%s"), aSWITCHES[ ii ].szSwitch); - return opCLOSEAPP; - } - BOOL fQuoted = FALSE; - for (LPTSTR pszTarget = aSWITCHES[ ii ].szValue; - *pszCmdLine && !(*pszCmdLine == TEXT('/') && !fQuoted) - && !(iswhite(*pszCmdLine) && !fQuoted); ) - { - if (*pszCmdLine == TEXT('"')) - { - ++pszCmdLine; - if (fQuoted) - break; - fQuoted = TRUE; - continue; - } - *pszTarget++ = *pszCmdLine++; - } - *pszTarget++ = TEXT('\0'); - } - } - - // Was the -CONFIRM switch given? It works with any other switch - // combination. - // - if (aSWITCHES[ swCONFIRM ].fPresent) - { - Action_ShowConfirmations (TRUE); - } - - // Now test the command-line for syntactical correctness. - // First test: if the SUBSET switch is given, the CELL switch must - // be given as well. - // - if ( (aSWITCHES[ swSUBSET ].fPresent) && - (!aSWITCHES[ swCELL ].fPresent) ) - { - CommandLineHelp (IDS_CMDLINE_SUBSETNOTCELL); - return opCLOSEAPP; - } - - // Similarly, if the SERVER switch is given, the CELL switch must - // be given as well. - // - if ( (aSWITCHES[ swSERVER ].fPresent) && - (!aSWITCHES[ swCELL ].fPresent) ) - { - CommandLineHelp (IDS_CMDLINE_SERVERNOTCELL); - return opCLOSEAPP; - } - - // And if the USER or PASSWORD switch is given, the other is required. - // - if ( (aSWITCHES[ swUSER ].fPresent && !aSWITCHES[ swPASSWORD ].fPresent) || - (aSWITCHES[ swPASSWORD ].fPresent && !aSWITCHES[ swUSER ].fPresent) ) - { - CommandLineHelp (IDS_CMDLINE_USERPASSWORD); - return opCLOSEAPP; - } - - // Implement the command-line switches. - // - if (aSWITCHES[ swRESET ].fPresent) - { - if (aSWITCHES[ swSERVER ].fPresent) - { - ErasePreferences (aSWITCHES[ swCELL ].szValue, aSWITCHES[ swSERVER ].szValue); - } - else if (aSWITCHES[ swCELL ].fPresent) - { - ErasePreferences (aSWITCHES[ swCELL ].szValue); - } - else // neither cell nor server specified--kill just the general stuff - { - EraseSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS); - } - - Message (MB_OK | MB_ICONINFORMATION, IDS_CMDLINE_RESET_TITLE, IDS_CMDLINE_RESET_DESC); - return opCLOSEAPP; - } - - if (aSWITCHES[ swUSER ].fPresent) - { - LPTSTR pszCell = (aSWITCHES[ swCELL ].fPresent) ? (aSWITCHES[ swCELL ].szValue) : NULL; - - ULONG status; - if (!AfsAppLib_SetCredentials (pszCell, aSWITCHES[ swUSER ].szValue, aSWITCHES[ swPASSWORD ].szValue, &status)) - { - ImmediateErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS); - return opCLOSEAPP; - } - } - - if (aSWITCHES[ swLOOKUP ].fPresent) - { - return opLOOKUPERRORCODE; - } - - if (aSWITCHES[ swUSEEXISTING ].fPresent) - { - ULONG ulStatus; - TCHAR szDefCell[ cchNAME ]; - - if (aSWITCHES[ swCELL ].fPresent) - { - lstrcpy(szDefCell,aSWITCHES[ swCELL ].szValue); - } - else - { - AfsAppLib_GetLocalCell(szDefCell); - } - g.hCreds = AfsAppLib_GetCredentials(szDefCell,&ulStatus); - if (g.hCreds != NULL) - { - LPOPENCELL_PACKET lpocp = New (OPENCELL_PACKET); - - memset(lpocp,0x00,sizeof(OPENCELL_PACKET)); - lstrcpy(lpocp->szCell,szDefCell); - lpocp->fCloseAppOnFail = TRUE; - lpocp->hCreds = g.hCreds; - lpocp->sub = NULL; - StartTask(taskOPENCELL,NULL,lpocp); - return opNOCELLDIALOG; - } - else - return opCLOSEAPP; - } - - if (aSWITCHES[ swCELL ].fPresent) - { - LPOPENCELL_PACKET lpp = New (OPENCELL_PACKET); - memset (lpp, 0x00, sizeof(OPENCELL_PACKET)); - - lstrcpy (lpp->szCell, aSWITCHES[ swCELL ].szValue); - lpp->fCloseAppOnFail = TRUE; - - if (aSWITCHES[ swSUBSET ].fPresent) - { - lpp->sub = Subsets_LoadSubset (lpp->szCell, aSWITCHES[ swSUBSET ].szValue); - if (lpp->sub == NULL) - { - Delete (lpp); - lpp = NULL; - - CommandLineHelp (IDS_CMDLINE_INVALIDSUBSET, TEXT("%s%s"), aSWITCHES[ swCELL ].szValue, aSWITCHES[ swSUBSET ].szValue); - return opCLOSEAPP; - } - } - else if (aSWITCHES[ swSERVER ].fPresent) - { - lpp->sub = New (SUBSET); - memset (lpp->sub, 0x0, sizeof(SUBSET)); - FormatMultiString (&lpp->sub->pszMonitored, TRUE, TEXT("%1"), TEXT("%s"), aSWITCHES[ swSERVER ].szValue); - } - - StartTask (taskOPENCELL, NULL, lpp); - return opNOCELLDIALOG; - } - - // Okay--nothing sufficiently special took place to prevent us - // from running the tool normally. - // - return opNORMAL; -} - - -void cdecl CommandLineHelp (int ids, LPTSTR pszFormat, ...) -{ - va_list arg; - va_start (arg, pszFormat); - vMessage (MB_OK | MB_ICONHAND, IDS_CMDLINE_TITLE, ids, pszFormat, arg); -} - diff --git a/src/WINNT/afssvrmgr/cmdline.h b/src/WINNT/afssvrmgr/cmdline.h deleted file mode 100644 index 14a668bf3..000000000 --- a/src/WINNT/afssvrmgr/cmdline.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CMDLINE_H -#define CMDLINE_H - -/* - * TYPEDEFS _________________________________________________________________ - * - */ - -typedef enum - { - opCLOSEAPP, // close the application entirely - opNORMAL, // proceed normally - opNOCELLDIALOG, // ...but don't ask for a cell - opLOOKUPERRORCODE, // just show the "lookup error code" dlg - } CMDLINEOP; - -CMDLINEOP ParseCommandLine (LPTSTR pszCmdLine); - - -#endif - diff --git a/src/WINNT/afssvrmgr/columns.cpp b/src/WINNT/afssvrmgr/columns.cpp deleted file mode 100644 index 50a1c4feb..000000000 --- a/src/WINNT/afssvrmgr/columns.cpp +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "columns.h" -#include "svr_window.h" -#include "propcache.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault); -void Columns_OnSelect (HWND hDlg); -void Columns_OnSelAvail (HWND hDlg); -void Columns_OnSelShown (HWND hDlg); -void Columns_OnInsert (HWND hDlg); -void Columns_OnDelete (HWND hDlg); -void Columns_OnMoveUp (HWND hDlg); -void Columns_OnMoveDown (HWND hDlg); -BOOL Columns_OnApply (HWND hDlg, LPVIEWINFO lpviDefault); - - -/* - * COLUMNS DIALOG _____________________________________________________________ - * - */ - -typedef enum - { - ceSERVERS = 0, // gr.di*.viewSvr - ceFILESETS, // gr.viewSet - ceAGGREGATES, // gr.viewAgg - ceSERVICES, // gr.viewSvc - ceREPLICAS, // gr.viewRep - ceAGGS_MOVE, // gr.viewAggMove - ceAGGS_CREATE, // gr.viewAggCreate - ceAGGS_RESTORE // gr.viewAggRestore - } COLUMNS_ENTRY; - -static struct - { - int ids; - BOOL fUsuallyHidden; - VIEWINFO vi; - BOOL fChanged; - } -COLUMNS[] = - { - { IDS_COL_SERVERS, FALSE, {0}, FALSE }, // ceSERVERS - { IDS_COL_FILESETS, FALSE, {0}, FALSE }, // ceFILESETS - { IDS_COL_AGGREGATES, FALSE, {0}, FALSE }, // ceAGGREGATES - { IDS_COL_SERVICES, FALSE, {0}, FALSE }, // ceSERVICES - { IDS_COL_REPLICAS, FALSE, {0}, FALSE }, // ceREPLICAS - { IDS_COL_AGGS_MOVE, TRUE, {0}, FALSE }, // ceAGG_MOVE - { IDS_COL_AGGS_CREATE, TRUE, {0}, FALSE }, // ceAGG_CREATE - { IDS_COL_AGGS_RESTORE, TRUE, {0}, FALSE } // ceAGG_RESTORE - }; - -#define nCOLUMNS (sizeof(COLUMNS)/sizeof(COLUMNS[0])) - -typedef struct - { - HWND hParent; - LPVIEWINFO lpviDefault; - } ShowColumnsParams; - -void ShowColumnsDialog (HWND hParent, LPVIEWINFO lpvi) -{ - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - COLUMNS[ iCol ].fChanged = FALSE; - } - - if (gr.fPreview && !gr.fVert) - memcpy (&COLUMNS[ ceSERVERS ].vi, &gr.diHorz.viewSvr, sizeof(VIEWINFO)); - else - memcpy (&COLUMNS[ ceSERVERS ].vi, &gr.diVert.viewSvr, sizeof(VIEWINFO)); - - memcpy (&COLUMNS[ ceFILESETS ].vi, &gr.viewSet, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceAGGREGATES ].vi, &gr.viewAgg, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceSERVICES ].vi, &gr.viewSvc, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceREPLICAS ].vi, &gr.viewRep, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceAGGS_MOVE ].vi, &gr.viewAggMove, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceAGGS_CREATE ].vi, &gr.viewAggCreate, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceAGGS_RESTORE ].vi, &gr.viewAggRestore, sizeof(VIEWINFO)); - - if (lpvi == &gr.viewSet) - lpvi = &COLUMNS[ ceFILESETS ].vi; - else if (lpvi == &gr.viewAgg) - lpvi = &COLUMNS[ ceAGGREGATES ].vi; - else if (lpvi == &gr.viewSvc) - lpvi = &COLUMNS[ ceSERVICES ].vi; - else if (lpvi == &gr.viewRep) - lpvi = &COLUMNS[ ceREPLICAS ].vi; - else if (lpvi == &gr.viewAggMove) - lpvi = &COLUMNS[ ceAGGS_MOVE ].vi; - else if (lpvi == &gr.viewAggCreate) - lpvi = &COLUMNS[ ceAGGS_CREATE ].vi; - else if (lpvi == &gr.viewAggRestore) - lpvi = &COLUMNS[ ceAGGS_RESTORE ].vi; - else - lpvi = &COLUMNS[ ceSERVERS ].vi; - - LPPROPSHEET psh = PropSheet_Create (IDS_COLUMNS_TITLE, FALSE); - psh->sh.hwndParent = hParent; - - ShowColumnsParams *pscp = New (ShowColumnsParams); - pscp->hParent = hParent; - pscp->lpviDefault = lpvi; - - PropSheet_AddTab (psh, 0, IDD_COLUMNS, (DLGPROC)Columns_DlgProc, (LPARAM)pscp, TRUE); - PropSheet_ShowModal (psh, PumpMessage); -} - - -BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_COLUMNS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - ShowColumnsParams *pscp; - pscp = (ShowColumnsParams *)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcGENERAL, NULL, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Columns_OnInitDialog (hDlg, (pscp) ? pscp->lpviDefault : NULL); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - if (Columns_OnApply (hDlg, (pscp) ? pscp->lpviDefault : NULL)) - { - if (pscp) - { - PostMessage (pscp->hParent, WM_COLUMNS_CHANGED, 0, 0); - } - } - break; - - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_COLUMNS: - if (HIWORD(wp) == CBN_SELCHANGE) - { - Columns_OnSelect (hDlg); - } - break; - - case IDC_COL_AVAIL: - if (HIWORD(wp) == LBN_SELCHANGE) - { - Columns_OnSelAvail (hDlg); - } - break; - - case IDC_COL_SHOWN: - if (HIWORD(wp) == LBN_SELCHANGE) - { - Columns_OnSelShown (hDlg); - } - break; - - case IDC_COL_INSERT: - Columns_OnInsert (hDlg); - break; - - case IDC_COL_DELETE: - Columns_OnDelete (hDlg); - break; - - case IDC_COL_UP: - Columns_OnMoveUp (hDlg); - break; - - case IDC_COL_DOWN: - Columns_OnMoveDown (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault) -{ - if (!lpviDefault) - { - lpviDefault = (gr.fPreview && !gr.fVert) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr; - } - - HWND hList = GetDlgItem (hDlg, IDC_COLUMNS); - CB_StartChange (hList); - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if ((COLUMNS[iCol].fUsuallyHidden) && (lpviDefault != &COLUMNS[iCol].vi)) - continue; - - CB_AddItem (hList, COLUMNS[iCol].ids, (LPARAM)&COLUMNS[iCol].vi); - } - - CB_EndChange (hList, (LPARAM)lpviDefault); - - Columns_OnSelect (hDlg); -} - - -void Columns_OnSelect (HWND hDlg) -{ - HWND hList; - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem(hDlg,IDC_COLUMNS)); - - // Fill in the Available list... - // - hList = GetDlgItem (hDlg, IDC_COL_AVAIL); - LB_StartChange (hList); - - for (size_t iAvail = 0; iAvail < lpvi->nColsAvail; ++iAvail) - { - for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown) - { - if (lpvi->aColumns[ iShown ] == iAvail) - break; - } - if (iShown == lpvi->nColsShown) - { - LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail); - } - } - - LB_EndChange (hList); - Columns_OnSelAvail (hDlg); - - // Fill in the Shown list... - // - hList = GetDlgItem (hDlg, IDC_COL_SHOWN); - LB_StartChange (hList); - - for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown) - { - iAvail = lpvi->aColumns[ iShown ]; - LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail); - } - - LB_EndChange (hList); - Columns_OnSelShown (hDlg); -} - - -void Columns_OnSelAvail (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_COL_AVAIL); - int ii = LB_GetSelected (hList); - - EnableWindow (GetDlgItem (hDlg, IDC_COL_INSERT), (ii != -1)); -} - - -void Columns_OnSelShown (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hList); - - if (ii == -1) - { - EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_COL_UP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), FALSE); - } - else - { - int iAvail = LB_GetData (hList, ii); - EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), (iAvail != 0)); - - int ci = (int)SendMessage (hList, LB_GETCOUNT, 0, 0); - EnableWindow (GetDlgItem (hDlg, IDC_COL_UP), (ii > 1)); - EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), (ii > 0 && ii < ci-1)); - } -} - - -void Columns_OnInsert (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hAvail); - - if (ii != -1) - { - size_t iAvail = LB_GetData (hAvail, ii); - int iShown = 1+ LB_GetSelected (hShown); - - TCHAR szText[ cchRESOURCE ]; - SendMessage (hAvail, LB_GETTEXT, ii, (LPARAM)szText); - - LB_AddItem (hShown, szText, iAvail); - SendMessage (hAvail, LB_DELETESTRING, ii, 0); - - lpvi->aColumns[ lpvi->nColsShown ] = iAvail; - lpvi->nColsShown ++; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelAvail (hDlg); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnDelete (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hShown); - - if (ii != -1) - { - TCHAR szText[ cchRESOURCE ]; - SendMessage (hShown, LB_GETTEXT, ii, (LPARAM)szText); - - size_t iAvail = (size_t)LB_GetData (hShown, ii); - LB_AddItem (hAvail, szText, iAvail); - SendMessage (hShown, LB_DELETESTRING, ii, 0); - - for ( ; ii < (int)lpvi->nColsShown-1; ++ii) - { - lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ]; - } - lpvi->nColsShown --; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelAvail (hDlg); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnMoveUp (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hShown); - - if (ii > 0) - { - size_t iAvail = (size_t)LB_GetData (hShown, ii); - lpvi->aColumns[ ii ] = lpvi->aColumns[ ii-1 ]; - lpvi->aColumns[ ii-1 ] = iAvail; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelect (hDlg); - LB_SetSelectedByData (hShown, (LPARAM)iAvail); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnMoveDown (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hShown); - - if (ii != -1) - { - size_t iAvail = (size_t)LB_GetData (hShown, ii); - lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ]; - lpvi->aColumns[ ii+1 ] = iAvail; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelect (hDlg); - LB_SetSelectedByData (hShown, (LPARAM)iAvail); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -BOOL Columns_OnApply (HWND hDlg, LPVIEWINFO lpviDefault) -{ - BOOL fPostMessage = FALSE; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (COLUMNS[ iCol ].fChanged) - { - CHILDTAB iTab = (CHILDTAB)-1; - int idcList; - - VIEWINFO vi; - memcpy (&vi, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO)); - - LPVIEWINFO lpviTarget = NULL; - - switch (iCol) - { - case ceSERVERS: - if (gr.fPreview && !gr.fVert) - lpviTarget = &gr.diHorz.viewSvr; - else - lpviTarget = &gr.diVert.viewSvr; - FL_RestoreView (GetDlgItem (g.hMain, IDC_SERVERS), &COLUMNS[ iCol ].vi); - UpdateDisplay_Servers (FALSE, NULL, 0); - break; - - case ceFILESETS: - lpviTarget = &gr.viewSet; - iTab = tabFILESETS; - idcList = IDC_SET_LIST; - break; - - case ceAGGREGATES: - lpviTarget = &gr.viewAgg; - iTab = tabAGGREGATES; - idcList = IDC_AGG_LIST; - break; - - case ceSERVICES: - lpviTarget = &gr.viewSvc; - iTab = tabSERVICES; - idcList = IDC_SVC_LIST; - break; - - case ceREPLICAS: - lpviTarget = &gr.viewRep; - break; - - case ceAGGS_MOVE: - lpviTarget = &gr.viewAggMove; - break; - - case ceAGGS_CREATE: - lpviTarget = &gr.viewAggCreate; - break; - - case ceAGGS_RESTORE: - lpviTarget = &gr.viewAggRestore; - break; - } - - if (lpviTarget != NULL) - { - memcpy (lpviTarget, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO)); - if (lpviDefault == &COLUMNS[ iCol ].vi) - fPostMessage = TRUE; - } - - if (iTab != (CHILDTAB)-1) - { - for (HWND hServer = g.hMain; - hServer != NULL; - hServer = PropCache_Search (pcSERVER, ANYVALUE, hServer)) - { - HWND hTab = GetDlgItem (hServer, IDC_TABS); - int iTabShown = TabCtrl_GetCurSel (hTab); - - if (iTab == iTabShown) - { - HWND hChild = Server_GetCurrentTab (hServer); - HWND hList = GetDlgItem (hChild, idcList); - - TCHAR szClassName[ cchRESOURCE ]; - if (GetClassName (hList, szClassName, cchRESOURCE)) - { - if (lstrcmp (szClassName, WC_FASTLIST)) - continue; - } - - FL_StoreView (hList, &vi); - COLUMNS[ iCol ].vi.lvsView = vi.lvsView; - FL_RestoreView (hList, &COLUMNS[ iCol ].vi); - Server_ForceRedraw (hServer); - } - - if (hServer == g.hMain) - hServer = NULL; - } - } - } - } - - return fPostMessage; -} - diff --git a/src/WINNT/afssvrmgr/columns.h b/src/WINNT/afssvrmgr/columns.h deleted file mode 100644 index d9115b153..000000000 --- a/src/WINNT/afssvrmgr/columns.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef COLUMNS_H -#define COLUMNS_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowColumnsDialog (HWND hParent, LPVIEWINFO lpvi = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/command.cpp b/src/WINNT/afssvrmgr/command.cpp deleted file mode 100644 index 73c2f4250..000000000 --- a/src/WINNT/afssvrmgr/command.cpp +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "command.h" -#include "columns.h" -#include "subset.h" -#include "creds.h" -#include "task.h" -#include "helpfunc.h" -#include "options.h" -#include "display.h" -#include "svr_window.h" -#include "svr_security.h" -#include "svr_syncvldb.h" -#include "svr_salvage.h" -#include "svc_create.h" -#include "svc_delete.h" -#include "svc_startstop.h" -#include "svc_viewlog.h" -#include "svr_prop.h" -#include "svr_install.h" -#include "svr_uninstall.h" -#include "svr_prune.h" -#include "svr_getdates.h" -#include "svr_execute.h" -#include "svr_hosts.h" -#include "svc_prop.h" -#include "agg_prop.h" -#include "set_prop.h" -#include "set_repprop.h" -#include "set_create.h" -#include "set_delete.h" -#include "set_move.h" -#include "set_quota.h" -#include "set_rename.h" -#include "set_release.h" -#include "set_clone.h" -#include "set_dump.h" -#include "set_restore.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Command_OnProperties (LPIDENT lpi); -void Command_OnIconView (HWND hDialog, BOOL fServerView, CHILDTAB iTab, int cmd); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void StartContextCommand (HWND hDialog, - LPIDENT lpiRepresentedByWindow, - LPIDENT lpiChosenByClick, - int cmd) -{ - CHILDTAB iTab = Server_GetDisplayedTab (hDialog); - LPIDENT lpi = (lpiChosenByClick) ? lpiChosenByClick : lpiRepresentedByWindow; - - if (lpi && lpi->fIsCell()) - lpi = NULL; - - switch (cmd) - { - case M_COLUMNS: - if (iTab == tabSERVICES) - ShowColumnsDialog (hDialog, &gr.viewSvc); - else if (iTab == tabAGGREGATES) - ShowColumnsDialog (hDialog, &gr.viewAgg); - else if (iTab == tabFILESETS) - ShowColumnsDialog (hDialog, &gr.viewSet); - else - ShowColumnsDialog (hDialog, NULL); - break; - - case M_SVR_VIEW_ONEICON: - case M_SVR_VIEW_TWOICONS: - case M_SVR_VIEW_STATUS: - Command_OnIconView (hDialog, TRUE, iTab, cmd); - break; - - case M_VIEW_ONEICON: - case M_VIEW_TWOICONS: - case M_VIEW_STATUS: - Command_OnIconView (hDialog, FALSE, iTab, cmd); - break; - - case M_PROPERTIES: - if (lpi) - Command_OnProperties (lpi); - break; - - case M_SUBSET: - ShowSubsetsDialog(); - break; - - case M_REFRESHALL: - if (g.lpiCell) - StartTask (taskREFRESH, NULL, g.lpiCell); - break; - - case M_REFRESH: - if (lpi) - StartTask (taskREFRESH, NULL, lpi); - else if (g.lpiCell) - StartTask (taskREFRESH, NULL, g.lpiCell); - break; - - case M_SYNCVLDB: - if (lpi) - Server_SyncVLDB (lpi); - break; - - case M_SALVAGE: - if (lpi) - Server_Salvage (lpi); - break; - - case M_SET_CREATE: - Filesets_Create (lpi); - break; - - case M_SET_REPLICATION: - if (lpi && lpi->fIsFileset()) - Filesets_ShowReplication (Server_GetWindowForChild (hDialog), lpi); - break; - - case M_SET_DELETE: - if (lpi && lpi->fIsFileset()) - Filesets_Delete (lpi); - break; - - case M_SET_CLONE: - Filesets_Clone (lpi); - break; - - case M_SET_DUMP: - if (lpi && lpi->fIsFileset()) - Filesets_Dump (lpi); - break; - - case M_SET_RESTORE: - Filesets_Restore (lpi); - break; - - case M_SET_RELEASE: - if (lpi && lpi->fIsFileset()) - Filesets_Release (lpi); - break; - - case M_SET_MOVETO: - if (lpi && lpi->fIsFileset()) - Filesets_ShowMoveTo (lpi, NULL); - break; - - case M_SET_SETQUOTA: - if (lpi && lpi->fIsFileset()) - Filesets_SetQuota (lpi); - break; - - case M_SET_LOCK: - if (lpi && lpi->fIsFileset()) - StartTask (taskSET_LOCK, NULL, lpi); - break; - - case M_SET_UNLOCK: - if (lpi && !lpi->fIsService()) - StartTask (taskSET_UNLOCK, NULL, lpi); - else if (!lpi && g.lpiCell) - StartTask (taskSET_UNLOCK, NULL, g.lpiCell); - break; - - case M_SET_RENAME: - if (lpi && lpi->fIsFileset()) - Filesets_ShowRename (lpi); - break; - - case M_SVR_OPEN: - if (lpi && lpi->fIsServer()) - StartTask (taskSVR_GETWINDOWPOS, g.hMain, lpi); - break; - - case M_SVR_CLOSE: - if (lpi && lpi->fIsServer()) - Server_Close (lpi); - break; - - case M_SVR_CLOSEALL: - Server_CloseAll (TRUE); - break; - - case M_SVR_SECURITY: - Server_Security (lpi); - break; - - case M_SVR_HOSTS: - Server_Hosts (lpi); - break; - - case M_SVR_INSTALL: - Server_Install (lpi); - break; - - case M_SVR_UNINSTALL: - Server_Uninstall (lpi); - break; - - case M_SVR_PRUNE: - Server_Prune (lpi); - break; - - case M_SVR_GETDATES: - Server_GetDates (lpi); - break; - - case M_EXECUTE: - Server_Execute (lpi); - break; - - case M_VIEWLOG: - if (lpi && lpi->fIsService()) - Services_ShowServiceLog (lpi); - else - Services_ShowServerLog (lpi); - break; - - case M_SVR_MONITOR: - if (lpi && lpi->fIsServer()) - StartTask (taskSVR_MONITOR_ONOFF, NULL, lpi); - break; - - case M_SVC_CREATE: - if (!lpi) - Services_Create (NULL); - else - Services_Create (lpi->GetServer()); - break; - - case M_SVC_DELETE: - if (lpi && lpi->fIsService()) - Services_Delete (lpi); - break; - - case M_SVC_START: - if (lpi && lpi->fIsService()) - Services_Start (lpi); - break; - - case M_SVC_STOP: - if (lpi && lpi->fIsService()) - Services_Stop (lpi); - break; - - case M_SVC_RESTART: - if (lpi && lpi->fIsService()) - Services_Restart (lpi); - break; - - case M_CELL_OPEN: - OpenCellDialog(); - break; - - case M_CREDENTIALS: - NewCredsDialog(); - break; - - case M_OPTIONS: - ShowOptionsDialog(); - break; - - case M_HELP: - WinHelp (g.hMain, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case M_HELP_FIND: - Help_FindCommand(); - break; - - case M_HELP_XLATE: - Help_FindError(); - break; - - case M_ABOUT: - Help_About(); - break; - } -} - - -void Command_OnProperties (LPIDENT lpi) -{ - if (lpi) - { - size_t nAlerts = Alert_GetCount (lpi); - - if (lpi->fIsServer()) - { - Server_ShowProperties (lpi, nAlerts); - } - else if (lpi->fIsService()) - { - Services_ShowProperties (lpi, nAlerts); - } - else if (lpi->fIsAggregate()) - { - Aggregates_ShowProperties (lpi, nAlerts); - } - else if (lpi->fIsFileset()) - { - Filesets_ShowProperties (lpi, nAlerts); - } - } -} - - -void Command_OnIconView (HWND hDialog, BOOL fServerView, CHILDTAB iTab, int cmd) -{ - ICONVIEW *piv = NULL; - - if (fServerView) - { - piv = &gr.ivSvr; - } - else if (iTab == tabAGGREGATES) - { - piv = &gr.ivAgg; - } - else if (iTab == tabSERVICES) - { - piv = &gr.ivSvc; - } - else if (iTab == tabFILESETS) - { - piv = &gr.ivSet; - } - - ICONVIEW iv; - switch (cmd) - { - case M_SVR_VIEW_TWOICONS: - case M_VIEW_TWOICONS: - iv = ivTWOICONS; - break; - - case M_SVR_VIEW_STATUS: - case M_VIEW_STATUS: - iv = ivSTATUS; - break; - - case M_SVR_VIEW_ONEICON: - case M_VIEW_ONEICON: - default: - iv = ivONEICON; - break; - } - - if (piv) - { - UpdateDisplay_SetIconView (FALSE, hDialog, piv, iv); - } - - if (fServerView) - Main_SetServerViewMenus(); -} - diff --git a/src/WINNT/afssvrmgr/command.h b/src/WINNT/afssvrmgr/command.h deleted file mode 100644 index 02264044b..000000000 --- a/src/WINNT/afssvrmgr/command.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef COMMAND_H -#define COMMAND_H - -void StartContextCommand (HWND hDialog, // g.hMain or a server window - LPIDENT lpiRepresentedByWindow, - LPIDENT lpiChosenByClick, - int cmd); - - -#endif - diff --git a/src/WINNT/afssvrmgr/creds.cpp b/src/WINNT/afssvrmgr/creds.cpp deleted file mode 100644 index 0ad004e5f..000000000 --- a/src/WINNT/afssvrmgr/creds.cpp +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "creds.h" -#include "display.h" -#include "time.h" -#include "subset.h" - - -/* - * OPENCELL DIALOG ____________________________________________________________ - * - */ - -void OpenCell_OnSubset (HWND hDlg) -{ - BOOL fEnable; - - fEnable = TRUE; - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_ONE))) - fEnable = FALSE; - if (!IsDlgButtonChecked (hDlg, IDC_MON_ONE)) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_MON_SERVER), fEnable); - - fEnable = TRUE; - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_SOME))) - fEnable = FALSE; - if (!IsDlgButtonChecked (hDlg, IDC_MON_SOME)) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_MON_SUBSET), fEnable); -} - - -void OpenCell_Hook_Enable (HWND hDlg, BOOL fEnable) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); - EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable); - EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_ADVANCED), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_MON_ALL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_MON_ONE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable); - - if (fEnable) - { - BOOL fAnySubsets = !!SendDlgItemMessage (hDlg, IDC_MON_SUBSET, CB_GETCOUNT, 0, 0); - EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), fAnySubsets); - } - else - { - EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), FALSE); - } - - OpenCell_OnSubset (hDlg); -} - - -void OpenCellDlg_Hook_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp) -{ - BOOL rc = FALSE; - OpenCell_Hook_Enable (hDlg, FALSE); - StartHourGlass (); - - // Remember what cell the user chose to edit - // - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME); - - // Try to obtain the credentials specified by the user. - // - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME); - - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME); - - ULONG status; - if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL) - { - ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS); - } - else - { - // See if those credentials are sufficient - // - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - pp.bcdp.hParent = hDlg; - pp.hCreds = lpp->hCreds; - pp.fShowWarning = TRUE; - - if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE) - { - SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin")); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE); - } - } - - if (rc) - { - g.hCreds = lpp->hCreds; - - // Instead of closing the dialog, start an taskOPENCELL task; - // we'll wait for that to complete successfully before we'll - // close the dialog. - // - LPOPENCELL_PACKET lpocp = New (OPENCELL_PACKET); - memset (lpocp, 0x00, sizeof(OPENCELL_PACKET)); - lstrcpy (lpocp->szCell, lpp->szCell); - lpocp->fCloseAppOnFail = FALSE; - lpocp->hCreds = lpp->hCreds; - - if (IsDlgButtonChecked (hDlg, IDC_MON_ALL)) - { - lpocp->sub = NULL; - } - else if (IsDlgButtonChecked (hDlg, IDC_MON_ONE)) - { - TCHAR szServer[ cchNAME ]; - GetDlgItemText (hDlg, IDC_MON_SERVER, szServer, cchNAME); - lpocp->sub = New (SUBSET); - memset (lpocp->sub, 0x0, sizeof(SUBSET)); - if (szServer[0]) - FormatMultiString (&lpocp->sub->pszMonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer); - else - { - lpocp->sub->pszMonitored = AllocateString (2); - lpocp->sub->pszMonitored[0] = TEXT('\0'); - lpocp->sub->pszMonitored[1] = TEXT('\0'); - } - } - else // (IsDlgButtonChecked (hDlg, IDC_MON_SOME)) - { - TCHAR szSubset[ cchNAME ]; - GetDlgItemText (hDlg, IDC_MON_SUBSET, szSubset, cchNAME); - lpocp->sub = Subsets_LoadSubset (szCell, szSubset); - } - - StartTask (taskOPENCELL, hDlg, lpocp); - } - - if (!rc) - OpenCell_Hook_Enable (hDlg, TRUE); - StopHourGlass (); -} - - -void OpenCell_OnCellChange (HWND hDlg, BOOL fMoveCaret) -{ - HWND hCombo = GetDlgItem (hDlg, IDC_MON_SUBSET); - CB_StartChange (hCombo, TRUE); - int iSel = 0; - BOOL fAddedAny = FALSE; - - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - - if (szCell[0] != TEXT('\0')) - { - BOOL fSelectedCurrentCell = FALSE; - if (g.lpiCell) - { - TCHAR szCurrentCell[ cchNAME ]; - g.lpiCell->GetCellName (szCurrentCell); - - if (!lstrcmpi (szCell, szCurrentCell)) - fSelectedCurrentCell = TRUE; - - if (g.sub && g.sub->pszMonitored) - SetDlgItemText (hDlg, IDC_MON_SERVER, g.sub->pszMonitored); - else - SetDlgItemText (hDlg, IDC_MON_SERVER, TEXT("")); - } - - TCHAR szSubset[ cchNAME ]; - for (size_t iIndex = 0; Subsets_EnumSubsets (szCell, iIndex, szSubset); ++iIndex) - { - CB_AddItem (hCombo, szSubset, (LPARAM)iIndex+1); - fAddedAny = TRUE; - - if (fSelectedCurrentCell && !lstrcmpi (szSubset, g.sub->szSubset)) - iSel = iIndex+1; - } - } - - CB_EndChange (hCombo, (LPARAM)(iSel == 0) ? 1 : iSel); - - if (fAddedAny && iSel) - { - CheckDlgButton (hDlg, IDC_MON_ALL, FALSE); - CheckDlgButton (hDlg, IDC_MON_ONE, FALSE); - CheckDlgButton (hDlg, IDC_MON_SOME, TRUE); - } - else if (!fAddedAny && IsDlgButtonChecked (hDlg, IDC_MON_SOME)) - { - CheckDlgButton (hDlg, IDC_MON_ALL, FALSE); - CheckDlgButton (hDlg, IDC_MON_SOME, FALSE); - CheckDlgButton (hDlg, IDC_MON_ONE, TRUE); - } - - BOOL fEnable = fAddedAny; - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_ALL))) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), fEnable); - - OpenCell_OnSubset (hDlg); -} - - -void OpenCell_OnAdvanced (HWND hDlg) -{ - HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP); - - RECT rWindow; - RECT rClient; - RECT rGroup; - - GetWindowRect (hDlg, &rWindow); - GetClientRect (hDlg, &rClient); - GetRectInParent (hGroup, &rGroup); - - if (cyRECT(rClient) <= rGroup.top) // closed now? - { - SetWindowPos (hDlg, NULL, - 0, 0, - cxRECT(rWindow), - cyRECT(rWindow) + cyRECT(rGroup) + 14, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_ADVANCEDIN_BUTTON); - SetDlgItemText (hDlg, IDC_ADVANCED, szText); - } - else // open now? - { - SetWindowPos (hDlg, NULL, - 0, 0, - cxRECT(rWindow), - cyRECT(rWindow) - cyRECT(rGroup) - 14, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_ADVANCEDOUT_BUTTON); - SetDlgItemText (hDlg, IDC_ADVANCED, szText); - } -} - - -void OpenCellDlg_Hook_OnEndTask_OpenCell (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc) - { - EndDialog (hDlg, IDOK); - } - else - { - OpenCell_Hook_Enable (hDlg, TRUE); - - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - ErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), szCell); - } -} - - -BOOL CALLBACK OpenCellDlg_Hook (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_SHOWWINDOW: - CheckDlgButton (hDlg, IDC_MON_ALL, TRUE); - CheckDlgButton (hDlg, IDC_MON_ONE, FALSE); - CheckDlgButton (hDlg, IDC_MON_SOME, FALSE); - OpenCell_OnSubset (hDlg); - OpenCell_OnAdvanced (hDlg); - OpenCell_OnCellChange (hDlg, TRUE); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskOPENCELL) - OpenCellDlg_Hook_OnEndTask_OpenCell (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - OpenCellDlg_Hook_OnOK (hDlg, (LPOPENCELLDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)); - return TRUE; - - case IDC_OPENCELL_CELL: - switch (HIWORD(wp)) - { - case CBN_SELCHANGE: - TCHAR szCell[ cchNAME ]; - SendDlgItemMessage (hDlg, IDC_OPENCELL_CELL, CB_GETLBTEXT, CB_GetSelected(GetDlgItem (hDlg, IDC_OPENCELL_CELL)), (LPARAM)szCell); - SetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell); - OpenCell_OnCellChange (hDlg, FALSE); - break; - - case CBN_EDITCHANGE: - OpenCell_OnCellChange (hDlg, FALSE); - break; - } - break; - - case IDC_ADVANCED: - OpenCell_OnAdvanced (hDlg); - break; - - case IDC_MON_ALL: - case IDC_MON_ONE: - case IDC_MON_SOME: - OpenCell_OnSubset (hDlg); - break; - } - break; - } - - return FALSE; -} - - -/* - * CREDENTIALS ________________________________________________________________ - * - */ - -void GetBadCredsDlgParams (LPBADCREDSDLG_PARAMS lpp) -{ - memset (lpp, 0x00, sizeof(BADCREDSDLG_PARAMS)); - lpp->pfShowWarningEver = &gr.fWarnBadCreds; - lpp->idsDesc = IDS_BADCREDS_DESC; -} - - -void GetCredentialsDlgParams (LPCREDENTIALSDLG_PARAMS lpp) -{ - memset (lpp, 0x00, sizeof(CREDENTIALSDLG_PARAMS)); - lpp->hParent = g.hMain; - if (g.lpiCell) - g.lpiCell->GetCellName (lpp->szCell); - else - AfsAppLib_GetLocalCell (lpp->szCell); - lpp->hCreds = g.hCreds; - GetBadCredsDlgParams (&lpp->bcdp); -} - - -/* - * OPERATIONS _________________________________________________________________ - * - */ - -BOOL OpenCellDialog (void) -{ - if (!Subsets_SaveIfDirty (g.sub)) - return FALSE; - - OPENCELLDLG_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.idd = IDD_OPENCELL; - pp.hookproc = (DLGPROC)OpenCellDlg_Hook; - pp.hParent = g.hMain; - pp.idsDesc = 0; - pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS); - pp.hCreds = g.hCreds; - GetBadCredsDlgParams (&pp.bcdp); - - BOOL rc = AfsAppLib_ShowOpenCellDialog (&pp); - - AfsAppLib_FreeCellList (pp.lpcl); - return rc; -} - - -BOOL NewCredsDialog (void) -{ - CREDENTIALSDLG_PARAMS pp; - GetCredentialsDlgParams (&pp); - return AfsAppLib_ShowCredentialsDialog (&pp); -} - - -void CheckForExpiredCredentials (void) -{ - CREDENTIALSDLG_PARAMS pp; - GetCredentialsDlgParams (&pp); - AfsAppLib_CheckForExpiredCredentials (&pp); -} - - -BOOL CheckCredentials (BOOL fComplain) -{ - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.fShowWarning = fComplain; - pp.hCreds = g.hCreds; - GetBadCredsDlgParams (&pp.bcdp); - - return AfsAppLib_CheckCredentials (&pp); -} - diff --git a/src/WINNT/afssvrmgr/creds.h b/src/WINNT/afssvrmgr/creds.h deleted file mode 100644 index f96f7d09f..000000000 --- a/src/WINNT/afssvrmgr/creds.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CREDS_H -#define CREDS_H - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -int OpenCellDialog (void); -BOOL NewCredsDialog (void); -void CheckForExpiredCredentials (void); -BOOL CheckCredentials (BOOL fComplain); - -#endif - diff --git a/src/WINNT/afssvrmgr/dispatch.cpp b/src/WINNT/afssvrmgr/dispatch.cpp deleted file mode 100644 index cde4581de..000000000 --- a/src/WINNT/afssvrmgr/dispatch.cpp +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "dispatch.h" -#include "action.h" -#include "svr_general.h" -#include "svc_general.h" -#include "agg_general.h" -#include "set_general.h" -#include "subset.h" -#include "display.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_DISPATCH 32 - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static CRITICAL_SECTION csDispatch; - -static LPNOTIFYCALLBACK Handler = NULL; - -static struct - { - NOTIFYWHEN when; - LPIDENT lpiObject; - HWND hWnd; - LPARAM lpUser; - } *aDispatchList = NULL; - -static size_t nDispatchList = 0; - - -typedef struct NOTIFYQUEUEITEM - { - struct NOTIFYQUEUEITEM *pNext; - NOTIFYEVENT evt; - NOTIFYPARAMS Params; - } NOTIFYQUEUEITEM, *LPNOTIFYQUEUEITEM; - -static LPNOTIFYQUEUEITEM pDispatchQueuePop = NULL; -static LPNOTIFYQUEUEITEM pDispatchQueuePushAfter = NULL; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK DispatchNotification (NOTIFYEVENT evt, PNOTIFYPARAMS pParams); - -void DispatchNotification_AltThread (NOTIFYEVENT evt, PNOTIFYPARAMS pParams); - -void DispatchNotification_MainThread (NOTIFYEVENT evt, PNOTIFYPARAMS pParams); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void CreateNotificationDispatch (void) -{ - InitializeCriticalSection (&csDispatch); - - Handler = New2 (NOTIFYCALLBACK,((NOTIFYCALLBACKPROC)DispatchNotification, 0L)); -} - - -void PostNotification (NOTIFYEVENT evt, LPIDENT lpi) -{ - NOTIFYCALLBACK::SendNotificationToAll (evt, lpi); -} - - -/* - * DispatchNotification - * - * This routine is called by our NOTIFYCALLBACK object ("Handler") whenever - * anything interesting happens within the library. Note that it's called - * on whatever thread the library is using--for that reason, we only handle - * some of the requests right away. The rest get posted to our DispatchQueue, - * to be popped off by g.hMain's thread. - * - */ - -BOOL CALLBACK DispatchNotification (NOTIFYEVENT evt, PNOTIFYPARAMS pParams) -{ - // Some things must be done right now--for instance, if we've just created - // or deleted a SERVER object, we'll load or free that server's preferences - // instantly. So, give our on-alternate-thread handler a chance to - // look over the notification. - // - DispatchNotification_AltThread (evt, pParams); - - // Then push this notification onto our DispatchQueue, so that the main - // pump will pop off each request in turn and take a look at it. - // - EnterCriticalSection (&csDispatch); - - LPNOTIFYQUEUEITEM lpnqi = New (NOTIFYQUEUEITEM); - lpnqi->pNext = NULL; - lpnqi->evt = evt; - memcpy (&lpnqi->Params, pParams, sizeof(NOTIFYPARAMS)); - - if (pDispatchQueuePushAfter != NULL) - pDispatchQueuePushAfter->pNext = lpnqi; - pDispatchQueuePushAfter = lpnqi; - - if (pDispatchQueuePop == NULL) - pDispatchQueuePop = lpnqi; - - LeaveCriticalSection (&csDispatch); - - return TRUE; -} - - -void DispatchNotification_OnPump (void) -{ - BOOL fFound = TRUE; - - do { - NOTIFYQUEUEITEM nqi; - - EnterCriticalSection (&csDispatch); - - if (!pDispatchQueuePop) - fFound = FALSE; - else - { - LPNOTIFYQUEUEITEM lpnqiNext = pDispatchQueuePop->pNext; - memcpy (&nqi, pDispatchQueuePop, sizeof(NOTIFYQUEUEITEM)); - - if (pDispatchQueuePushAfter == pDispatchQueuePop) - pDispatchQueuePushAfter = NULL; - Delete (pDispatchQueuePop); - pDispatchQueuePop = lpnqiNext; - } - - LeaveCriticalSection (&csDispatch); - - if (fFound) - { - DispatchNotification_MainThread (nqi.evt, &nqi.Params); - } - } while (fFound); -} - - -void DispatchNotification_AltThread (NOTIFYEVENT evt, PNOTIFYPARAMS pParams) -{ - LPIDENT lpiEvt = pParams->lpi1; - - switch (evt) - { - case evtRefreshStatusEnd: - if (lpiEvt && (lpiEvt->fIsService() || lpiEvt->fIsAggregate() || lpiEvt->fIsFileset())) - { - Alert_RemoveSecondary (lpiEvt); - Alert_Scout_QueueCheckServer (lpiEvt); - } - if (lpiEvt && lpiEvt->fIsServer()) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpiEvt->GetUserParam()) != NULL) - { - LPSERVER lpServer; - if ((lpServer = lpiEvt->OpenServer()) != NULL) - { - if (lpsp->fIsMonitored != lpServer->fIsMonitored()) - { - g.sub = Subsets_SetMonitor (g.sub, lpiEvt, lpServer->fIsMonitored()); - UpdateDisplay_ServerWindow (FALSE, lpiEvt); - } - lpsp->fIsMonitored = lpServer->fIsMonitored(); - lpServer->Close(); - } - } - - Alert_Scout_ServerStatus (lpiEvt, pParams->status); - } - break; - - // When we get a create request, use the object's Get/SetUserParam() - // methods to attach an allocated structure to the thing--the structure - // contains the preferences for the server/fileset/etc (for instance, - // its warning threshholds, any current scout problems, etc). - // On delete requests, free that structure. - // - case evtCreate: - if (lpiEvt->fIsServer()) - { - PVOID pPref = Server_LoadPreferences (lpiEvt); - lpiEvt->SetUserParam (pPref); - - // Should this server be monitored? - // - if (!Subsets_fMonitorServer (g.sub, lpiEvt)) - { - LPSERVER lpServer; - if ((lpServer = lpiEvt->OpenServer()) != NULL) - { - lpServer->SetMonitor (FALSE); - lpServer->Close(); - } - } - - Alert_Scout_SetOutOfDate (lpiEvt); - } - else if (lpiEvt->fIsService()) - { - PVOID pPref = Services_LoadPreferences (lpiEvt); - lpiEvt->SetUserParam (pPref); - } - else if (lpiEvt->fIsAggregate()) - { - PVOID pPref = Aggregates_LoadPreferences (lpiEvt); - lpiEvt->SetUserParam (pPref); - } - else if (lpiEvt->fIsFileset()) - { - PVOID pPref = Filesets_LoadPreferences (lpiEvt); - lpiEvt->SetUserParam (pPref); - } - if (!lpiEvt->fIsCell()) - { - Alert_Scout_QueueCheckServer (lpiEvt); - } - break; - - // When we get a create request, use the object's Get/SetUserParam() - // methods to attach an allocated structure to the thing--the structure - // contains the preferences for the server/fileset/etc (for instance, - // its warning threshholds, any current scout problems, etc). - // On delete requests, free that structure. - // - case evtDestroy: - if (lpiEvt->fIsServer()) - { - PVOID pPref = lpiEvt->GetUserParam(); - lpiEvt->SetUserParam (0); - if (pPref) Delete (pPref); - } - else if (lpiEvt->fIsService() || lpiEvt->fIsAggregate() || lpiEvt->fIsFileset()) - { - Alert_RemoveSecondary (lpiEvt); - PVOID pPref = lpiEvt->GetUserParam(); - lpiEvt->SetUserParam (0); - if (pPref) Delete (pPref); - } - break; - } -} - - -void DispatchNotification_MainThread (NOTIFYEVENT evt, PNOTIFYPARAMS pParams) -{ - LPIDENT lpiEvt = pParams->lpi1; - - // There are several notifications which are sent when beginning or ending - // lengthy operations. These "actions" each get a window indicating - // progress, and get added to our ongoing list of actions-in-progress. - // - ActionNotification_MainThread (evt, pParams); - - // The real reason for this routine is as a dispatcher for the AFSClass's - // notifications: various windows throughout the app register themselves - // with this dispatcher, and thereby get a message whenever a particular - // event of interest to that window happens. Just what notifications - // are "of interest" is specified by the window when it registers with - // this dispatcher. - // - for (size_t iDispatch = 0; iDispatch < nDispatchList; ++iDispatch) - { - if (!aDispatchList[ iDispatch ].hWnd) - continue; - - BOOL fDispatch = FALSE; - - // WHEN_CELL_OPENED + NULL -> notify if any new cell is opened - // WHEN_OBJECT_CHANGES + NULL -> notify if anything at all changes - // WHEN_OBJECT_CHANGES + lpi -> notify if this object changes - // WHEN_SVCS(etc)_CHANGE + NULL -> notify if any service at all changes - // WHEN_SVCS(etc)_CHANGE + lpi -> notify if any svc on this svr changes - - switch (aDispatchList[ iDispatch ].when) - { - case WHEN_CELL_OPENED: - if (evt == evtCreate && lpiEvt->fIsCell()) - fDispatch = TRUE; - break; - - case WHEN_OBJECT_CHANGES: - if ( (aDispatchList[ iDispatch ].lpiObject == lpiEvt) || - (aDispatchList[ iDispatch ].lpiObject == NULL) ) - { - if (evt != evtCreate) - fDispatch = TRUE; - } - break; - - case WHEN_SVRS_CHANGE: - switch (evt) - { - case evtInvalidate: - case evtRefreshServersBegin: - case evtRefreshServersEnd: - if ( (lpiEvt && lpiEvt->fIsCell()) || - (aDispatchList[ iDispatch ].lpiObject == lpiEvt) || - (aDispatchList[ iDispatch ].lpiObject == NULL) ) - { - if (lpiEvt && lpiEvt->fIsCell()) - fDispatch = TRUE; - } - break; - - case evtCreate: - case evtDestroy: - case evtRefreshStatusBegin: - case evtRefreshStatusEnd: - case evtAlertsChanged: - if (lpiEvt && lpiEvt->fIsServer()) - { - if (aDispatchList[ iDispatch ].lpiObject == NULL) - fDispatch = TRUE; - else - { - LPIDENT lpiEvtCell = lpiEvt->GetCell(); - - if (aDispatchList[ iDispatch ].lpiObject == lpiEvtCell) - fDispatch = TRUE; - } - } - break; - } - break; - - case WHEN_SETS_CHANGE: - switch (evt) - { - case evtInvalidate: - case evtRefreshFilesetsBegin: - case evtRefreshFilesetsEnd: - { - LPIDENT lpiEvtSvr = NULL; - if (lpiEvt && !lpiEvt->fIsCell()) - lpiEvtSvr = lpiEvt->GetServer(); - - if ( (lpiEvt && lpiEvt->fIsCell()) || - (aDispatchList[ iDispatch ].lpiObject == lpiEvt) || - (aDispatchList[ iDispatch ].lpiObject == lpiEvtSvr) || - (aDispatchList[ iDispatch ].lpiObject == NULL) ) - { - if (lpiEvt && (lpiEvt->fIsCell() || lpiEvt->fIsServer() || lpiEvt->fIsAggregate())) - fDispatch = TRUE; - } - } - break; - - case evtCreate: - case evtDestroy: - case evtRefreshStatusBegin: - case evtRefreshStatusEnd: - case evtAlertsChanged: - if (lpiEvt && lpiEvt->fIsFileset()) - { - if (aDispatchList[ iDispatch ].lpiObject == NULL) - fDispatch = TRUE; - else - { - LPIDENT lpiEvtAgg = lpiEvt->GetAggregate(); - LPIDENT lpiEvtSvr = lpiEvt->GetServer(); - - if (aDispatchList[ iDispatch ].lpiObject == lpiEvtAgg) - fDispatch = TRUE; - if (aDispatchList[ iDispatch ].lpiObject == lpiEvtSvr) - fDispatch = TRUE; - } - } - break; - } - break; - - case WHEN_AGGS_CHANGE: - switch (evt) - { - case evtRefreshAggregatesBegin: - case evtRefreshAggregatesEnd: - if ( (lpiEvt && lpiEvt->fIsCell()) || - (aDispatchList[ iDispatch ].lpiObject == lpiEvt) || - (aDispatchList[ iDispatch ].lpiObject == NULL) ) - { - if (lpiEvt && (lpiEvt->fIsCell() || lpiEvt->fIsServer())) - fDispatch = TRUE; - } - break; - - case evtCreate: - case evtDestroy: - case evtRefreshStatusBegin: - case evtRefreshStatusEnd: - case evtAlertsChanged: - if (lpiEvt && lpiEvt->fIsAggregate()) - { - if (aDispatchList[ iDispatch ].lpiObject == NULL) - fDispatch = TRUE; - else - { - LPIDENT lpiEvtSvr = lpiEvt->GetServer(); - - if (aDispatchList[ iDispatch ].lpiObject == lpiEvtSvr) - fDispatch = TRUE; - } - } - break; - } - break; - - case WHEN_SVCS_CHANGE: - switch (evt) - { - case evtRefreshServicesBegin: - case evtRefreshServicesEnd: - if ( (lpiEvt && lpiEvt->fIsCell()) || - (aDispatchList[ iDispatch ].lpiObject == lpiEvt) || - (aDispatchList[ iDispatch ].lpiObject == NULL) ) - { - if (lpiEvt && (lpiEvt->fIsCell() || lpiEvt->fIsServer())) - fDispatch = TRUE; - } - break; - - case evtCreate: - case evtDestroy: - case evtRefreshStatusBegin: - case evtRefreshStatusEnd: - case evtAlertsChanged: - if (lpiEvt && lpiEvt->fIsService()) - { - if (aDispatchList[ iDispatch ].lpiObject == NULL) - fDispatch = TRUE; - else - { - LPIDENT lpiEvtSvr = lpiEvt->GetServer(); - - if (aDispatchList[ iDispatch ].lpiObject == lpiEvtSvr) - fDispatch = TRUE; - } - } - break; - } - break; - } - - if (fDispatch) - { - LPNOTIFYSTRUCT lpns = New (NOTIFYSTRUCT); - lpns->hwndTarget = aDispatchList[ iDispatch ].hWnd; - lpns->evt = evt; - memcpy (&lpns->Params, pParams, sizeof(NOTIFYPARAMS)); - lpns->Params.lpUser = aDispatchList[ iDispatch ].lpUser; - - PostMessage (aDispatchList[ iDispatch ].hWnd, - WM_NOTIFY_FROM_DISPATCH, - (WPARAM)0, - (LPARAM)lpns); - } - } -} - - -void NotifyMe (NOTIFYWHEN when, LPIDENT lpiObject, HWND hWnd, LPARAM lpUser) -{ - EnterCriticalSection (&csDispatch); - - for (size_t iDispatch = 0; iDispatch < nDispatchList; ++iDispatch) - { - if ( (aDispatchList[ iDispatch ].hWnd == hWnd) && - (aDispatchList[ iDispatch ].when == when) && - (aDispatchList[ iDispatch ].lpiObject == lpiObject) ) - { - LeaveCriticalSection (&csDispatch); - return; - } - } - - for (iDispatch = 0; iDispatch < nDispatchList; ++iDispatch) - { - if (!aDispatchList[ iDispatch ].hWnd) - break; - } - - if (iDispatch >= nDispatchList) - { - if (!REALLOC (aDispatchList, nDispatchList, 1+iDispatch, cREALLOC_DISPATCH)) - { - LeaveCriticalSection (&csDispatch); - return; - } - } - - aDispatchList[ iDispatch ].hWnd = hWnd; - aDispatchList[ iDispatch ].when = when; - aDispatchList[ iDispatch ].lpiObject = lpiObject; - aDispatchList[ iDispatch ].lpUser = lpUser; - - LeaveCriticalSection (&csDispatch); -} - - -void DontNotifyMe (NOTIFYWHEN when, LPIDENT lpiObject, HWND hWnd) -{ - EnterCriticalSection (&csDispatch); - - for (size_t iDispatch = 0; iDispatch < nDispatchList; ++iDispatch) - { - if ( (aDispatchList[ iDispatch ].hWnd == hWnd) && - (aDispatchList[ iDispatch ].when == when) && - (aDispatchList[ iDispatch ].lpiObject == lpiObject) ) - { - aDispatchList[ iDispatch ].hWnd = NULL; - } - } - - LeaveCriticalSection (&csDispatch); -} - - -void DontNotifyMeEver (HWND hWnd) -{ - EnterCriticalSection (&csDispatch); - - for (size_t iDispatch = 0; iDispatch < nDispatchList; ++iDispatch) - { - if (aDispatchList[ iDispatch ].hWnd == hWnd) - { - aDispatchList[ iDispatch ].hWnd = NULL; - } - } - - LeaveCriticalSection (&csDispatch); -} - diff --git a/src/WINNT/afssvrmgr/dispatch.h b/src/WINNT/afssvrmgr/dispatch.h deleted file mode 100644 index f37319623..000000000 --- a/src/WINNT/afssvrmgr/dispatch.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef DISPATCH_H -#define DISPATCH_H - -#include "messages.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - WHEN_CELL_OPENED, - WHEN_OBJECT_CHANGES, // (supply PVOID=lpiObject) - WHEN_SVRS_CHANGE, // (supply PVOID=lpiCell) - WHEN_SETS_CHANGE, // (supply PVOID=lpiServer or lpiAgg) - WHEN_AGGS_CHANGE, // (supply PVOID=lpiServer) - WHEN_SVCS_CHANGE // (supply PVOID=lpiServer) - } NOTIFYWHEN; - -typedef struct - { - HWND hwndTarget; - NOTIFYEVENT evt; - NOTIFYPARAMS Params; - } NOTIFYSTRUCT, *LPNOTIFYSTRUCT; - -#define evtAlertsChanged (NOTIFYEVENT)(evtUser) -#define evtScoutBegin (NOTIFYEVENT)(evtUser+1) // lpEvt = (LPIDENT)lpiServer -#define evtScoutEnd (NOTIFYEVENT)(evtUser+2) // lpEvt = (LPIDENT)lpiServer - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void CreateNotificationDispatch (void); - -void PostNotification (NOTIFYEVENT evt, LPIDENT lpi1); - -void NotifyMe (NOTIFYWHEN when, LPIDENT lpObject, HWND hWnd, LPARAM lpUser); -void DontNotifyMe (NOTIFYWHEN when, LPIDENT lpObject, HWND hWnd); -void DontNotifyMeEver (HWND hWnd); - -void DispatchNotification_OnPump (void); - - -#endif - diff --git a/src/WINNT/afssvrmgr/dispguts.cpp b/src/WINNT/afssvrmgr/dispguts.cpp deleted file mode 100644 index dae9a3760..000000000 --- a/src/WINNT/afssvrmgr/dispguts.cpp +++ /dev/null @@ -1,1156 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "display.h" -#include "dispguts.h" -#include "svr_col.h" -#include "svr_window.h" -#include "svc_col.h" -#include "svc_startstop.h" -#include "agg_col.h" -#include "set_col.h" -#include "set_general.h" -#include "creds.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Display_Servers_Internal_Clean (LPDISPLAYREQUEST pdr); -void Display_Servers_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer); - -void Display_Services_Internal_Clean (LPDISPLAYREQUEST pdr); -void Display_Services_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer); -void Display_Services_Internal_AddService (LPDISPLAYREQUEST pdr, LPSERVICE lpService, HLISTITEM hServer); - -void Display_Aggregates_Internal_Clean (LPDISPLAYREQUEST pdr); -void Display_Aggregates_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer); -void Display_Aggregates_Internal_AddAggregate (LPDISPLAYREQUEST pdr, LPAGGREGATE lpAggregate, HLISTITEM hServer); - -void Display_Filesets_Internal_Clean (LPDISPLAYREQUEST pdr); -HLISTITEM Display_Filesets_Internal_AddCell (LPDISPLAYREQUEST pdr, LPCELL lpCell); -void Display_Filesets_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer, HLISTITEM hCell); -void Display_Filesets_Internal_AddAggregate (LPDISPLAYREQUEST pdr, LPAGGREGATE lpAggregate, HLISTITEM hServer); -void Display_Filesets_Internal_AddFileset (LPDISPLAYREQUEST pdr, LPFILESET lpFileset, HLISTITEM hAggregate); - -#define PIF_ALWAYSSHOWICON 0x00000001 -#define PIF_ONLYONEICON 0x00000002 -#define PIF_TREEVIEW_ONLY 0x00000004 -#define PIF_DISALLOW_COLLAPSE 0x00000008 -void Display_PickImages (int *piFirstImage, int *piSecondImage, int iTypeImage, int iStatusImage, ICONVIEW iv, DWORD dwPickImageFlags = 0); -HLISTITEM Display_InsertItem (HWND hList, HLISTITEM hParent, LPTSTR pszText, LPARAM lp, int iImage0 = IMAGE_NOIMAGE, int iImage1 = IMAGE_NOIMAGE, ICONVIEW iv = (ICONVIEW)-1, DWORD dwPickImageFlags = 0); - - -/* - * CELL _______________________________________________________________________ - * - */ - -void Display_Cell_Internal (LPDISPLAYREQUEST pdr) -{ - // Update the "Current Cell:" field on g.hMain - // - TCHAR szCell[ cchNAME ]; - if (g.lpiCell == NULL) - GetString (szCell, IDS_NO_CELL_SELECTED); - else - g.lpiCell->GetCellName (szCell); - - SetDlgItemText (g.hMain, IDC_CELL, szCell); - - // Update the "AFS Identity:" field on g.hMain - // - TCHAR szUser[ cchNAME ]; - SYSTEMTIME stExpire; - if (!AfsAppLib_CrackCredentials (g.hCreds, szCell, szUser, &stExpire)) - { - GetString (szUser, IDS_NO_AFS_ID); - SetDlgItemText (g.hMain, IDC_AFS_ID, szUser); - } - else - { - int ids = (AfsAppLib_IsTimeInFuture (&stExpire)) ? IDS_AFS_ID_WILLEXP : IDS_AFS_ID_DIDEXP; - LPTSTR pszText = FormatString (ids, TEXT("%s%t"), szUser, &stExpire); - SetDlgItemText (g.hMain, IDC_AFS_ID, pszText); - FreeString (pszText); - } -} - - -/* - * SERVERS ____________________________________________________________________ - * - */ - -void Display_Servers_Internal (LPDISPLAYREQUEST pdr) -{ - pdr->hList = GetDlgItem (g.hMain, IDC_SERVERS); - pdr->lpvi = (gr.fPreview && !gr.fVert) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr; - - if (!IsWindow (pdr->hList)) - return; - - // Fix up the image lists for the Servers window - // - HIMAGELIST hiSmall; - HIMAGELIST hiLarge; - FastList_GetImageLists (pdr->hList, &hiSmall, &hiLarge); - if (!hiSmall || !hiLarge) - { - hiSmall = AfsAppLib_CreateImageList (FALSE); - hiLarge = AfsAppLib_CreateImageList (TRUE); - FastList_SetImageLists (pdr->hList, hiSmall, hiLarge); - } - - // Add an entry in the Servers list for each server in the cell. - // -// LPIDENT lpiSelStart = (LPIDENT)FL_GetSelectedData (pdr->hList); -// BOOL fRefresh = FALSE; - - LPCELL lpCell; - if (!g.lpiCell || !(lpCell = g.lpiCell->OpenCell())) - { - LPTSTR pszCover = FormatString (IDS_ERROR_REFRESH_CELLSERVERS_NOCELL); - AfsAppLib_CoverWindow (pdr->hList, pszCover); - FreeString (pszCover); - } - else - { - BOOL rc = TRUE; - - pdr->lpiToSelect = (LPIDENT)FL_StartChange (pdr->hList, (pdr->lpiNotify) ? FALSE : TRUE); - pdr->actOnDone = ACT_ENDCHANGE | ACT_SELPREVIEW; - - // Remove any to-be-replaced old servers - // - Display_Servers_Internal_Clean (pdr); - - // Add a server entry for each server as appropriate - // - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum, pdr->lpiNotify, FALSE); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - Display_Servers_Internal_AddServer (pdr, lpServer); - lpServer->Close(); - } - - if (rc) - pdr->actOnDone |= ACT_UNCOVER; - - lpCell->Close(); - } -} - - -void Display_Servers_Internal_Clean (LPDISPLAYREQUEST pdr) -{ - if (pdr->lpiNotify) // else, we already emptied the list - { - HLISTITEM hItem; - if ((hItem = FastList_FindItem (pdr->hList, (LPARAM)(pdr->lpiNotify))) != NULL) - FastList_RemoveItem (pdr->hList, hItem); - } -} - - -void Display_Servers_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer) -{ - ULONG status = 0; - SERVERSTATUS ss; - - if (lpServer->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - - if (!status) - { - lpServer->GetStatus (&ss, FALSE, &status); - - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpServer->GetUserParam()) != NULL) - memcpy (&lpsp->ssLast, &ss, sizeof(SERVERSTATUS)); - } - - ICONVIEW ivSvr = Display_GetServerIconView(); - - if (status != 0) - { - LPTSTR pszCol1 = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), status); - - Display_InsertItem (pdr->hList, - NULL, - pszCol1, - (LPARAM)lpServer->GetIdentifier(), - imageSERVER, imageSERVER_ALERT, ivSvr); - - FreeString (pszCol1); - } - else - { - int iStatusImage = IMAGE_NOIMAGE; - if (!lpServer->fIsMonitored()) - iStatusImage = imageSERVER_UNMON; - else if (Server_GetAlertCount (lpServer)) - iStatusImage = imageSERVER_ALERT; - - Display_InsertItem (pdr->hList, - NULL, - NULL, - (LPARAM)lpServer->GetIdentifier(), - imageSERVER, iStatusImage, ivSvr); - } -} - - -/* - * SERVICES ___________________________________________________________________ - * - */ - -void Display_Services_Internal (LPDISPLAYREQUEST pdr) -{ - pdr->hList = GetDlgItem (pdr->hChild, IDC_SVC_LIST); - pdr->lpvi = &gr.viewSvc; - - if (!IsWindow (pdr->hList)) - return; - - // First off, can we totally ignore this request? - // - LPIDENT lpiWindow = Server_GetServerForChild (pdr->hChild); - if (lpiWindow && pdr->lpiNotify && (lpiWindow != pdr->lpiNotify->GetServer())) - return; - - // Fix up the image lists for the Services window - // - HIMAGELIST hiSmall; - FastList_GetImageLists (pdr->hList, &hiSmall, NULL); - if (!hiSmall) - { - hiSmall = AfsAppLib_CreateImageList (FALSE); - FastList_SetImageLists (pdr->hList, hiSmall, NULL); - } - - // Add either all services, or one server's services, or one service. - // - LPCELL lpCell; - if (g.lpiCell && (lpCell = g.lpiCell->OpenCell())) - { - pdr->lpiToSelect = (LPIDENT)FL_StartChange (pdr->hList, (pdr->lpiNotify) ? FALSE : TRUE); - pdr->actOnDone = ACT_ENDCHANGE; - - // Remove any to-be-replaced old services - // - Display_Services_Internal_Clean (pdr); - - // Update all appropriate service entries - // - LPIDENT lpiRefresh = (pdr->lpiNotify) ? pdr->lpiNotify : lpiWindow; - - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum, lpiRefresh, FALSE); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - if (lpServer->fIsMonitored()) - Display_Services_Internal_AddServer (pdr, lpServer); - lpServer->Close(); - } - - if (pdr->lpiToSelect) - FL_SetSelectedByData (pdr->hList, (LPARAM)pdr->lpiToSelect); - lpCell->Close(); - } -} - - -void Display_Services_Internal_Clean (LPDISPLAYREQUEST pdr) -{ - if (pdr->lpiNotify) // else, we already emptied the list - { - HLISTITEM hItem; - if ((hItem = FastList_FindItem (pdr->hList, (LPARAM)(pdr->lpiNotify))) != NULL) - FastList_RemoveItem (pdr->hList, hItem); - } -} - - -void Display_Services_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer) -{ - ULONG status = 0; - SERVERSTATUS ss; - - if (lpServer->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpServer->GetStatus (&ss, FALSE, &status); - - LPTSTR pszServerText = NULL; - int iStatusImage = imageSERVER; - BOOL fContinue = TRUE; - - if (status != 0) - { - pszServerText = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), status); - iStatusImage = imageSERVER_ALERT; - fContinue = FALSE; - } - else if (Server_GetAlertCount (lpServer)) - { - pszServerText = FormatString (TEXT("%1 - %2"), TEXT("%s%s"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), Server_GetColumnText (lpServer->GetIdentifier(), svrcolSTATUS)); - iStatusImage = imageSERVER_ALERT; - } - - HLISTITEM hServer; - if ((hServer = FastList_FindItem (pdr->hList, (LPARAM)(lpServer->GetIdentifier()))) == NULL) - { - hServer = Display_InsertItem (pdr->hList, NULL, pszServerText, - (LPARAM)lpServer->GetIdentifier(), - imageSERVER, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - } - else - { - int iImage1, iImage2; - Display_PickImages (&iImage1, &iImage2, imageSERVER, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - FastList_SetItemFirstImage (pdr->hList, hServer, iImage1); - FastList_SetItemSecondImage (pdr->hList, hServer, iImage2); - FastList_SetItemText (pdr->hList, hServer, 0, pszServerText); - } - - if (pszServerText) - FreeString (pszServerText); - - if (fContinue) - { - // Update icons for all appropriate services - // - LPIDENT lpiSearch = (pdr->lpiNotify && pdr->lpiNotify->fIsService()) ? (pdr->lpiNotify) : NULL; - - HENUM hEnum; - for (LPSERVICE lpService = lpServer->ServiceFindFirst (&hEnum, lpiSearch, FALSE); lpService; lpService = lpServer->ServiceFindNext (&hEnum)) - { - Display_Services_Internal_AddService (pdr, lpService, hServer); - lpService->Close(); - } - } -} - - -void Display_Services_Internal_AddService (LPDISPLAYREQUEST pdr, LPSERVICE lpService, HLISTITEM hServer) -{ - ULONG status = 0; - SERVICESTATUS ss; - - if (lpService->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpService->GetStatus (&ss, FALSE, &status); - - BOOL fShowServerName = !Server_GetServer (pdr->hChild); - - if (status != 0) - { - LPTSTR pszCol1 = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Services_GetColumnText (lpService->GetIdentifier(), svccolNAME, fShowServerName), status); - - Display_InsertItem (pdr->hList, - hServer, - pszCol1, - (LPARAM)lpService->GetIdentifier(), - imageSERVICE, imageSERVICE_ALERT, gr.ivSvc); - - FreeString (pszCol1); - } - else - { - TCHAR szName[ cchRESOURCE ]; - lpService->GetName (szName); - - BOOL fIsBOS = !lstrcmpi (szName, TEXT("BOS")); - - LPSERVICE_PREF lpsp; - if ((lpsp = (LPSERVICE_PREF)lpService->GetUserParam()) != NULL) - memcpy (&lpsp->ssLast, &ss, sizeof(SERVICESTATUS)); - - int iTypeImage = imageSERVICE; - if (fIsBOS) - iTypeImage = imageBOSSERVICE; - - int iStatusImage = IMAGE_NOIMAGE; - if (Services_GetAlertCount (lpService)) - iStatusImage = imageSERVICE_ALERT; - else if (!Services_fRunning (lpService)) - iStatusImage = imageSERVICE_STOPPED; - else if (fIsBOS) - iStatusImage = imageBOSSERVICE; - - Display_InsertItem (pdr->hList, - hServer, - NULL, - (LPARAM)lpService->GetIdentifier(), - iTypeImage, iStatusImage, gr.ivSvc); - } -} - - -/* - * AGGREGATES _________________________________________________________________ - * - */ - -void Display_Aggregates_Internal (LPDISPLAYREQUEST pdr) -{ - if (pdr->lpvi == NULL) - pdr->lpvi = &gr.viewAgg; - - if (!IsWindow (pdr->hList)) - return; - - TCHAR szClassName[ cchRESOURCE ]; - if (GetClassName (pdr->hList, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, WC_FASTLIST)) - pdr->fList = TRUE; - } - - // First off, can we totally ignore this request? - // - if (pdr->lpiServer && pdr->lpiNotify && (pdr->lpiServer != pdr->lpiNotify->GetServer())) - return; - - // Fix up the image lists for the Aggregates window - // - if (pdr->fList) - { - HIMAGELIST hiSmall; - FastList_GetImageLists (pdr->hList, &hiSmall, NULL); - if (!hiSmall) - { - hiSmall = AfsAppLib_CreateImageList (FALSE); - FastList_SetImageLists (pdr->hList, hiSmall, NULL); - } - } - - // Add either all aggregates, or one server's aggregates, or one aggregate. - // - LPCELL lpCell; - if (g.lpiCell && (lpCell = g.lpiCell->OpenCell())) - { - LPIDENT lpiSelectedNow; - if (pdr->fList) - lpiSelectedNow = (LPIDENT)FL_StartChange (pdr->hList, (pdr->lpiNotify) ? FALSE : TRUE); - else - lpiSelectedNow = (LPIDENT)CB_StartChange (pdr->hList, (pdr->lpiNotify) ? FALSE : TRUE); - - if (!pdr->lpiToSelect) - pdr->lpiToSelect = lpiSelectedNow; - - pdr->actOnDone = ACT_ENDCHANGE; - - // Remove any to-be-replaced old services - // - Display_Aggregates_Internal_Clean (pdr); - - // Update all appropriate aggregate entries - // - LPIDENT lpiRefresh = (pdr->lpiNotify) ? pdr->lpiNotify : pdr->lpiServer; - - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum, lpiRefresh, FALSE); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - if (lpServer->fIsMonitored()) - Display_Aggregates_Internal_AddServer (pdr, lpServer); - lpServer->Close(); - } - - if (pdr->lpiToSelect) - { - if (pdr->fList) - FL_SetSelectedByData (pdr->hList, (LPARAM)pdr->lpiToSelect); - else - CB_SetSelectedByData (pdr->hList, (LPARAM)pdr->lpiToSelect); - } - if (!pdr->fList) // combobox? then always pick *something*... - { - if (!CB_GetSelectedData (pdr->hList)) - { - pdr->lpiToSelect = (LPIDENT)CB_GetData (pdr->hList, 0); - } - } - - lpCell->Close(); - } -} - - -void Display_Aggregates_Internal_Clean (LPDISPLAYREQUEST pdr) -{ - if (pdr->lpiNotify) // else, we already emptied the list - { - if (pdr->fList) - { - HLISTITEM hItem; - if ((hItem = FastList_FindItem (pdr->hList, (LPARAM)(pdr->lpiNotify))) != NULL) - FastList_RemoveItem (pdr->hList, hItem); - } - else - { - size_t iMax = SendMessage (pdr->hList, CB_GETCOUNT, 0, 0); - - for (size_t iItem = 0; iItem < iMax; ) - { - BOOL fDelete = FALSE; - - LPIDENT lpiItem; - if ((lpiItem = (LPIDENT)CB_GetData (pdr->hList, iItem)) != NULL) - { - // delete the entry if it's the TBD server or aggregate - // - if (lpiItem == pdr->lpiNotify) - fDelete = TRUE; - - // delete the entry if it's the server of a TBD aggregate - // - if (lpiItem == pdr->lpiNotify->GetServer()) - fDelete = TRUE; - - // delete the entry if it's an aggregate on the TBD server - // - if (lpiItem->GetServer() == pdr->lpiNotify) - fDelete = TRUE; - } - - if (!fDelete) - ++iItem; - else - { - SendMessage (pdr->hList, CB_DELETESTRING, iItem, 0); - --iMax; - } - } - } - } -} - - -void Display_Aggregates_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer) -{ - ULONG status = 0; - SERVERSTATUS ss; - - if (lpServer->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpServer->GetStatus (&ss, FALSE, &status); - - HLISTITEM hServer = NULL; - if (pdr->fList) - { - LPTSTR pszServerText = NULL; - int iStatusImage = imageSERVER; - - if (status != 0) - { - pszServerText = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), status); - iStatusImage = imageSERVER_ALERT; - } - else if (Server_GetAlertCount (lpServer)) - { - pszServerText = FormatString (TEXT("%1 - %2"), TEXT("%s%s"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), Server_GetColumnText (lpServer->GetIdentifier(), svrcolSTATUS)); - iStatusImage = imageSERVER_ALERT; - } - - if ((hServer = FastList_FindItem (pdr->hList, (LPARAM)(lpServer->GetIdentifier()))) == NULL) - { - hServer = Display_InsertItem (pdr->hList, NULL, pszServerText, - (LPARAM)lpServer->GetIdentifier(), - imageSERVER, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - } - else - { - int iImage1, iImage2; - Display_PickImages (&iImage1, &iImage2, imageSERVER, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - FastList_SetItemFirstImage (pdr->hList, hServer, iImage1); - FastList_SetItemSecondImage (pdr->hList, hServer, iImage2); - FastList_SetItemText (pdr->hList, hServer, 0, pszServerText); - } - - if (pszServerText) - FreeString (pszServerText); - } - - if ((hServer || !pdr->fList) && !status) - { - // Update icons for all appropriate aggregates - // - LPIDENT lpiSearch = (pdr->lpiNotify && pdr->lpiNotify->fIsAggregate()) ? (pdr->lpiNotify) : NULL; - - HENUM hEnum; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&hEnum, lpiSearch, FALSE); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&hEnum)) - { - Display_Aggregates_Internal_AddAggregate (pdr, lpAggregate, hServer); - lpAggregate->Close(); - } - } -} - - -void Display_Aggregates_Internal_AddAggregate (LPDISPLAYREQUEST pdr, LPAGGREGATE lpAggregate, HLISTITEM hServer) -{ - ULONG status = 0; - AGGREGATESTATUS as; - - if (lpAggregate->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpAggregate->GetStatus (&as, FALSE, &status); - - BOOL fShowServerName = !Server_GetServer (pdr->hChild); - - if (status != 0) - { - LPTSTR pszCol1 = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Aggregates_GetColumnText (lpAggregate->GetIdentifier(), aggcolNAME, fShowServerName), status); - - if (pdr->fList) - { - Display_InsertItem (pdr->hList, hServer, pszCol1, - (LPARAM)lpAggregate->GetIdentifier(), - imageAGGREGATE, imageAGGREGATE_ALERT, gr.ivAgg); - } - else - { - CB_AddItem (pdr->hList, pszCol1, (LPARAM)lpAggregate->GetIdentifier()); - } - - FreeString (pszCol1); - } - else - { - LPAGGREGATE_PREF lpap; - if ((lpap = (LPAGGREGATE_PREF)lpAggregate->GetUserParam()) != NULL) - { - memcpy (&lpap->asLast, &as, sizeof(AGGREGATESTATUS)); - lpAggregate->GetDevice (lpap->szDevice); - } - - if (pdr->fList) - { - int iStatusImage = IMAGE_NOIMAGE; - if (Aggregates_GetAlertCount (lpAggregate)) - iStatusImage = imageAGGREGATE_ALERT; - - Display_InsertItem (pdr->hList, hServer, NULL, - (LPARAM)lpAggregate->GetIdentifier(), - imageAGGREGATE, iStatusImage, gr.ivAgg); - } - else - { - TCHAR szName[ cchNAME ]; - lpAggregate->GetIdentifier()->GetAggregateName (szName); - CB_AddItem (pdr->hList, szName, (LPARAM)lpAggregate->GetIdentifier()); - } - } -} - - -/* - * FILESETS ___________________________________________________________________ - * - */ - -void Display_Filesets_Internal (LPDISPLAYREQUEST pdr) -{ - if (pdr->hList == NULL) - pdr->hList = GetDlgItem (pdr->hChild, IDC_SET_LIST); - - if (!IsWindow (pdr->hList)) - return; - - TCHAR szClassName[ cchRESOURCE ]; - if (GetClassName (pdr->hList, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, WC_FASTLIST)) - pdr->fList = TRUE; - } - - pdr->lpvi = (pdr->fList) ? &gr.viewSet : NULL; - - // First off, can we totally ignore this request? - // - if (pdr->lpiServer && pdr->lpiNotify && (pdr->lpiServer != pdr->lpiNotify->GetServer())) - return; - - // Fix up the image lists for the Filesets window - // - if (pdr->fList) - { - HIMAGELIST hiSmall; - FastList_GetImageLists (pdr->hList, &hiSmall, NULL); - if (!hiSmall) - { - hiSmall = AfsAppLib_CreateImageList (FALSE); - FastList_SetImageLists (pdr->hList, hiSmall, NULL); - } - } - - // Add either all filesets, or one server's filesets, or one fileset. - // - LPCELL lpCell; - if (g.lpiCell && (lpCell = g.lpiCell->OpenCell())) - { - pdr->actOnDone = ACT_ENDCHANGE; - - // Remove any to-be-replaced old services - // - LPIDENT lpiSelectedNow; - if (pdr->fList) - lpiSelectedNow = (LPIDENT)FL_StartChange (pdr->hList, (pdr->lpiNotify) ? FALSE : TRUE); - else - lpiSelectedNow = (LPIDENT)CB_StartChange (pdr->hList, (pdr->lpiNotify) ? FALSE : TRUE); - Display_Filesets_Internal_Clean (pdr); - - if (! pdr->lpiToSelect) - pdr->lpiToSelect = lpiSelectedNow; - - HLISTITEM hCell; - hCell = Display_Filesets_Internal_AddCell (pdr, lpCell); - - // Update all appropriate fileset entries - // - LPIDENT lpiRefresh = (pdr->lpiNotify) ? pdr->lpiNotify : pdr->lpiServer; - - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum, lpiRefresh, FALSE); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - if (lpServer->fIsMonitored()) - Display_Filesets_Internal_AddServer (pdr, lpServer, hCell); - lpServer->Close(); - } - - if (pdr->lpiToSelect) - { - if (pdr->fList) - FL_SetSelectedByData (pdr->hList, (LPARAM)pdr->lpiToSelect); - else - CB_SetSelectedByData (pdr->hList, (LPARAM)pdr->lpiToSelect); - } - if (!pdr->fList) // combobox? then always pick *something*... - { - if (!CB_GetSelectedData (pdr->hList)) - { - pdr->lpiToSelect = (LPIDENT)CB_GetData (pdr->hList, 0); - } - } - - lpCell->Close(); - } -} - - -void Display_Filesets_Internal_Clean (LPDISPLAYREQUEST pdr) -{ - if (pdr->lpiNotify) - { - if (pdr->fList) - { - HLISTITEM hItem; - if ((hItem = FastList_FindItem (pdr->hList, (LPARAM)pdr->lpiNotify)) != NULL) - { - FastList_RemoveItem (pdr->hList, hItem); - } - } - else // Must be a combobox - { - size_t iMax = SendMessage (pdr->hList, CB_GETCOUNT, 0, 0); - - for (size_t iItem = 0; iItem < iMax; ) - { - BOOL fDelete = FALSE; - - LPIDENT lpiItem; - if ((lpiItem = (LPIDENT)CB_GetData (pdr->hList, iItem)) != NULL) - { - if (lpiItem->GetServer() == pdr->lpiNotify) - fDelete = TRUE; - if (lpiItem->GetAggregate() == pdr->lpiNotify) - fDelete = TRUE; - if (lpiItem == pdr->lpiNotify) - fDelete = TRUE; - } - - if (!fDelete) - ++iItem; - else - { - SendMessage (pdr->hList, CB_DELETESTRING, iItem, 0); - --iMax; - } - } - } - } -} - - -HLISTITEM Display_Filesets_Internal_AddCell (LPDISPLAYREQUEST pdr, LPCELL lpCell) -{ - if (!pdr->fList) - return NULL; - - HLISTITEM hCell; - if ((hCell = FastList_FindItem (pdr->hList, (LPARAM)lpCell->GetIdentifier())) == NULL) - { - TCHAR szName[ cchNAME ]; - lpCell->GetName (szName); - - hCell = Display_InsertItem (pdr->hList, NULL, szName, - (LPARAM)lpCell->GetIdentifier(), - imageCELL, IMAGE_NOIMAGE, gr.ivSet, - PIF_ALWAYSSHOWICON | PIF_ONLYONEICON | PIF_TREEVIEW_ONLY | PIF_DISALLOW_COLLAPSE); - } - - return hCell; -} - - -void Display_Filesets_Internal_AddServer (LPDISPLAYREQUEST pdr, LPSERVER lpServer, HLISTITEM hCell) -{ - ULONG status = 0; - SERVERSTATUS ss; - - if (lpServer->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpServer->GetStatus (&ss, FALSE, &status); - - HLISTITEM hServer = NULL; - if (pdr->fList) - { - LPTSTR pszServerText = NULL; - int iStatusImage = imageSERVER; - - if (status != 0) - { - pszServerText = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), status); - iStatusImage = imageSERVER_ALERT; - } - else if (Server_GetAlertCount (lpServer)) - { - pszServerText = FormatString (TEXT("%1 - %2"), TEXT("%s%s"), Server_GetColumnText (lpServer->GetIdentifier(), svrcolNAME), Server_GetColumnText (lpServer->GetIdentifier(), svrcolSTATUS)); - iStatusImage = imageSERVER_ALERT; - } - - if ((hServer = FastList_FindItem (pdr->hList, (LPARAM)(lpServer->GetIdentifier()))) == NULL) - { - hServer = Display_InsertItem (pdr->hList, hCell, pszServerText, - (LPARAM)lpServer->GetIdentifier(), - imageSERVER, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - } - else - { - int iImage1, iImage2; - Display_PickImages (&iImage1, &iImage2, imageSERVER, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - FastList_SetItemFirstImage (pdr->hList, hServer, iImage1); - FastList_SetItemSecondImage (pdr->hList, hServer, iImage2); - FastList_SetItemText (pdr->hList, hServer, 0, pszServerText); - } - - if (pszServerText) - FreeString (pszServerText); - } - - if (status == 0) - { - // Update filesets on all appropriate aggregates - // - LPIDENT lpiSearch = (pdr->lpiNotify && !pdr->lpiNotify->fIsServer()) ? (pdr->lpiNotify->GetAggregate()) : pdr->lpiAggregate; - - HENUM hEnum; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&hEnum, lpiSearch, FALSE); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&hEnum)) - { - Display_Filesets_Internal_AddAggregate (pdr, lpAggregate, hServer); - lpAggregate->Close(); - } - - if (pdr->fList && hServer) - { - BOOL fExpand = TRUE; - - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpServer->GetUserParam()) != NULL) - fExpand = lpsp->fExpandTree; - - FastList_SetExpanded (pdr->hList, hServer, fExpand); - } - } -} - - -void Display_Filesets_Internal_AddAggregate (LPDISPLAYREQUEST pdr, LPAGGREGATE lpAggregate, HLISTITEM hServer) -{ - ULONG status = 0; - AGGREGATESTATUS as; - - if (lpAggregate->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpAggregate->GetStatus (&as, FALSE, &status); - - HLISTITEM hAggregate = NULL; - if (pdr->fList) - { - LPTSTR pszAggregateText = NULL; - int iStatusImage = imageAGGREGATE; - - if (status != 0) - { - pszAggregateText = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Aggregates_GetColumnText (lpAggregate->GetIdentifier(), aggcolNAME, FALSE), status); - iStatusImage = imageAGGREGATE_ALERT; - } - else if (Aggregates_GetAlertCount (lpAggregate)) - { - pszAggregateText = FormatString (TEXT("%1 - %2"), TEXT("%s%s"), Aggregates_GetColumnText (lpAggregate->GetIdentifier(), aggcolNAME), Aggregates_GetColumnText (lpAggregate->GetIdentifier(), aggcolSTATUS)); - iStatusImage = imageAGGREGATE_ALERT; - } - - if ((hAggregate = FastList_FindItem (pdr->hList, (LPARAM)lpAggregate->GetIdentifier())) == NULL) - { - hAggregate = Display_InsertItem (pdr->hList, hServer, pszAggregateText, - (LPARAM)lpAggregate->GetIdentifier(), - imageAGGREGATE, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - } - else - { - int iImage1, iImage2; - Display_PickImages (&iImage1, &iImage2, imageAGGREGATE, iStatusImage, gr.ivSet, PIF_ALWAYSSHOWICON | PIF_TREEVIEW_ONLY); - FastList_SetItemFirstImage (pdr->hList, hAggregate, iImage1); - FastList_SetItemSecondImage (pdr->hList, hAggregate, iImage2); - FastList_SetItemText (pdr->hList, hAggregate, 0, pszAggregateText); - } - - if (pszAggregateText) - FreeString (pszAggregateText); - } - - if (status == 0) - { - // Update all appropriate filesets from this aggregate - // - LPIDENT lpiSearch = (pdr->lpiNotify && pdr->lpiNotify->fIsFileset()) ? (pdr->lpiNotify) : NULL; - - HENUM hEnum; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&hEnum, lpiSearch, FALSE); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&hEnum)) - { - Display_Filesets_Internal_AddFileset (pdr, lpFileset, hAggregate); - lpFileset->Close(); - } - - if (pdr->fList && hAggregate) - { - BOOL fExpand = (hServer == NULL) ? TRUE : FALSE; - - LPAGGREGATE_PREF lpap; - if ((lpap = (LPAGGREGATE_PREF)lpAggregate->GetUserParam()) != NULL) - fExpand = lpap->fExpandTree; - - FastList_SetExpanded (pdr->hList, hAggregate, fExpand); - } - } -} - - -void Display_Filesets_Internal_AddFileset (LPDISPLAYREQUEST pdr, LPFILESET lpFileset, HLISTITEM hAggregate) -{ - ULONG status = 0; - FILESETSTATUS fs; - - if (lpFileset->GetIdentifier() == pdr->lpiNotify) - status = pdr->status; - if (!status) - lpFileset->GetStatus (&fs, FALSE, &status); - - if (status != 0) - { - if (pdr->fList) - { - LPTSTR pszFilesetText = FormatString (TEXT("%1 - %2"), TEXT("%s%e"), Filesets_GetColumnText (lpFileset->GetIdentifier(), setcolNAME), status); - - Display_InsertItem (pdr->hList, hAggregate, pszFilesetText, - (LPARAM)lpFileset->GetIdentifier(), - imageFILESET, imageFILESET_ALERT, gr.ivSet); - - FreeString (pszFilesetText); - } - } - else - { - if (!pdr->fList) - { - TCHAR szName[ cchNAME ]; - lpFileset->GetName (szName); - CB_AddItem (pdr->hList, szName, (LPARAM)lpFileset->GetIdentifier()); - } - else - { - LPFILESET_PREF lpfp; - if ((lpfp = (LPFILESET_PREF)lpFileset->GetUserParam()) != NULL) - { - memcpy (&lpfp->fsLast, &fs, sizeof(FILESETSTATUS)); - lpfp->lpiRW = lpFileset->GetReadWriteIdentifier(); - } - - int iStatusImage = IMAGE_NOIMAGE; - if (Filesets_GetAlertCount (lpFileset)) - iStatusImage = imageFILESET_ALERT; - else if (Filesets_fIsLocked (&fs)) - iStatusImage = imageFILESET_LOCKED; - - Display_InsertItem (pdr->hList, hAggregate, NULL, - (LPARAM)lpFileset->GetIdentifier(), - imageFILESET, iStatusImage, gr.ivSet); - } - } -} - - -/* - * REPLICAS ___________________________________________________________________ - * - * (lpiNotify is the RW for which to list all replicas) - * - */ - -void Display_Replicas_Internal (LPDISPLAYREQUEST pdr) -{ - if (!IsWindow (pdr->hList)) - return; - - pdr->lpvi = &gr.viewRep; - pdr->actOnDone = ACT_ENDCHANGE; - - LPIDENT lpiRW = pdr->lpiNotify; - VOLUMEID vidReadWrite; - lpiRW->GetFilesetID (&vidReadWrite); - - FL_StartChange (pdr->hList, TRUE); - - LPCELL lpCell; - if ((lpCell = lpiRW->OpenCell()) != NULL) - { - HENUM heServer; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&heServer); lpServer; lpServer = lpCell->ServerFindNext (&heServer)) - { - HENUM heAggregate; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&heAggregate); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&heAggregate)) - { - HENUM heFileset; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&heFileset); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&heFileset)) - { - FILESETSTATUS fs; - if (lpFileset->GetStatus (&fs)) - { - if ( (fs.Type == ftREPLICA) && - (!memcmp (&vidReadWrite, &fs.idReadWrite, sizeof(VOLUMEID))) ) - { - LPFILESET_PREF lpfp; - if ((lpfp = (LPFILESET_PREF)lpFileset->GetUserParam()) != NULL) - { - memcpy (&lpfp->fsLast, &fs, sizeof(FILESETSTATUS)); - lpfp->lpiRW = lpiRW; - } - - Display_InsertItem (pdr->hList, NULL, NULL, - (LPARAM)lpFileset->GetIdentifier()); - } - } - lpFileset->Close(); - } - lpAggregate->Close(); - } - lpServer->Close(); - } - lpCell->Close(); - } -} - - -/* - * SERVER WINDOWS _____________________________________________________________ - * - */ - -void Display_ServerWindow_Internal (LPDISPLAYREQUEST pdr) -{ - Server_SelectServer (pdr->hChild, pdr->lpiServer, TRUE); // redraw svr window -} - - -/* - * ICON SELECTION _____________________________________________________________ - * - */ - -void Display_PickImages (int *piImage0, int *piImage1, int iTypeImage, int iStatusImage, ICONVIEW iv, DWORD dwFlags) -{ - switch (iv) - { - case ivTWOICONS: - *piImage0 = iTypeImage; - *piImage1 = (iStatusImage == IMAGE_NOIMAGE) ? IMAGE_BLANKIMAGE : iStatusImage; - if (*piImage1 == *piImage0) - *piImage1 = IMAGE_BLANKIMAGE; - if (dwFlags & PIF_ONLYONEICON) - *piImage1 = IMAGE_NOIMAGE; - break; - - case ivONEICON: - *piImage0 = (iStatusImage == IMAGE_NOIMAGE) ? IMAGE_BLANKIMAGE : iStatusImage; - *piImage1 = IMAGE_NOIMAGE; - dwFlags |= PIF_ALWAYSSHOWICON; - break; - - case ivSTATUS: - *piImage0 = (iStatusImage == IMAGE_NOIMAGE) ? IMAGE_BLANKIMAGE : iStatusImage; - *piImage1 = IMAGE_NOIMAGE; - break; - - default: - *piImage0 = iTypeImage; - *piImage1 = iStatusImage; - return; - } - - if ((dwFlags & PIF_ALWAYSSHOWICON) && ((*piImage0 == IMAGE_NOIMAGE) || (*piImage0 == IMAGE_BLANKIMAGE))) - { - *piImage0 = iTypeImage; - } -} - - -HLISTITEM Display_InsertItem (HWND hList, HLISTITEM hParent, LPTSTR pszText, LPARAM lp, int iImage0, int iImage1, ICONVIEW iv, DWORD dwPickImageFlags) -{ - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.hParent = hParent; - flai.pszText = pszText; - flai.lParam = lp; - Display_PickImages (&flai.iFirstImage, &flai.iSecondImage, iImage0, iImage1, iv, dwPickImageFlags); - - if (dwPickImageFlags & PIF_TREEVIEW_ONLY) - flai.dwFlags |= FLIF_TREEVIEW_ONLY; - - if (dwPickImageFlags & PIF_DISALLOW_COLLAPSE) - flai.dwFlags |= FLIF_DISALLOW_COLLAPSE; - - return FastList_AddItem (hList, &flai); -} - diff --git a/src/WINNT/afssvrmgr/dispguts.h b/src/WINNT/afssvrmgr/dispguts.h deleted file mode 100644 index 655db2e3b..000000000 --- a/src/WINNT/afssvrmgr/dispguts.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef DISPGUTS_H -#define DISPGUTS_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -/* - *** Display_*_Internal() - * - * These routines should not be called directly; their interface is through - * UpdateDisplay() [see display.h] - * - */ - -void Display_Cell_Internal (LPDISPLAYREQUEST pdr); -void Display_Servers_Internal (LPDISPLAYREQUEST pdr); -void Display_Services_Internal (LPDISPLAYREQUEST pdr); -void Display_Aggregates_Internal (LPDISPLAYREQUEST pdr); -void Display_Filesets_Internal (LPDISPLAYREQUEST pdr); -void Display_Replicas_Internal (LPDISPLAYREQUEST pdr); -void Display_ServerWindow_Internal (LPDISPLAYREQUEST pdr); - - -#endif - diff --git a/src/WINNT/afssvrmgr/display.cpp b/src/WINNT/afssvrmgr/display.cpp deleted file mode 100644 index 1eee29733..000000000 --- a/src/WINNT/afssvrmgr/display.cpp +++ /dev/null @@ -1,726 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "display.h" -#include "dispguts.h" -#include "svr_window.h" -#include "svr_col.h" -#include "svc_col.h" -#include "agg_col.h" -#include "set_col.h" -#include "propcache.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_DISPLAYQUEUE 128 - -#define cUPDATE_THREADS_MAX 4 - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static size_t cDisplayQueueActive = 0; -static size_t cDisplayQueue = 0; -static size_t cUpdateThreadsActive = 0; -static DISPLAYREQUEST *aDisplayQueue = NULL; -static CRITICAL_SECTION *pcsDisplayQueue = NULL; - -static DISPLAYREQUEST drActiveSERVERS; -static DISPLAYREQUEST drActiveSERVICES; -static DISPLAYREQUEST drActiveAGGREGATES; -static DISPLAYREQUEST drActiveFILESETS; -static DISPLAYREQUEST drActiveSERVERWINDOW; - -static struct { - HWND hWnd; - WORD actOnDone; - LPIDENT lpiSelectOnDone; -} *aWindowActOnDone = NULL; -static size_t cWindowActOnDone = 0; -static CRITICAL_SECTION *pcsWindowActOnDone = NULL; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -DWORD WINAPI DisplayQueue_ThreadProc (PVOID lp); - -BOOL DisplayQueueFilter (size_t idqVictim, size_t idqKiller); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK GetItemText (HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)dwCookie; - LPIDENT lpi = (LPIDENT)(pfln->item.lParam); - LPTSTR psz = NULL; - - if (pfln->item.icol < (int)lpvi->nColsShown) - { - size_t iCol = lpvi->aColumns[ pfln->item.icol ]; - - BOOL fShowServerName = !Server_GetServerForChild (GetParent(hList)); - - if (lpi != NULL) - { - DISPLAYTARGET dt = dtSERVERS; - if (lpvi == &gr.viewSet) - dt = dtFILESETS; - else if (lpvi == &gr.viewSvc) - dt = dtSERVICES; - else if ((lpvi == &gr.viewAgg) || (lpvi == &gr.viewAggMove) || (lpvi == &gr.viewAggCreate) || (lpvi == &gr.viewAggRestore)) - dt = dtAGGREGATES; - else if (lpvi == &gr.viewRep) - dt = dtREPLICAS; - - switch (dt) - { - case dtSERVERS: - if (lpi->fIsServer()) - psz = Server_GetColumnText (lpi, (SERVERCOLUMN)iCol); - break; - - case dtSERVICES: - if (lpi->fIsService()) - psz = Services_GetColumnText (lpi, (SERVICECOLUMN)iCol, fShowServerName); - break; - - case dtAGGREGATES: - if (lpi->fIsAggregate()) - psz = Aggregates_GetColumnText (lpi, (AGGREGATECOLUMN)iCol, fShowServerName); - break; - - case dtFILESETS: - if (lpi->fIsFileset()) - psz = Filesets_GetColumnText (lpi, (FILESETCOLUMN)iCol, fShowServerName); - else if (lpi->fIsAggregate() && (pfln->item.icol == setcolNAME)) - psz = Aggregates_GetColumnText (lpi, aggcolNAME, FALSE); - else if (lpi->fIsServer() && (pfln->item.icol == setcolNAME)) - psz = Server_GetColumnText (lpi, svrcolNAME); - break; - - case dtREPLICAS: - if (lpi->fIsFileset()) - psz = Replicas_GetColumnText (lpi, (REPLICACOLUMN)iCol); - break; - } - } - } - - lstrcpy (pfln->item.pszText, (psz) ? psz : TEXT("")); - return TRUE; -} - - -void Display_AddActOnDone (HWND hWnd, WORD wAct, LPIDENT lpiSelectOnDone) -{ - if (pcsWindowActOnDone == NULL) - { - pcsWindowActOnDone = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsWindowActOnDone); - } - EnterCriticalSection (pcsWindowActOnDone); - - for (size_t ii = 0; ii < cWindowActOnDone; ++ii) - { - if (aWindowActOnDone[ ii ].hWnd == hWnd) - break; - } - if (ii == cWindowActOnDone) - { - for (ii = 0; ii < cWindowActOnDone; ++ii) - { - if (aWindowActOnDone[ ii ].hWnd == 0) - break; - } - } - if (ii == cWindowActOnDone) - { - (void)REALLOC( aWindowActOnDone, cWindowActOnDone, 1+ii, 1 ); - } - if (ii < cWindowActOnDone) - { - aWindowActOnDone[ ii ].hWnd = hWnd; - aWindowActOnDone[ ii ].actOnDone |= wAct; - if (!aWindowActOnDone[ ii ].lpiSelectOnDone) - aWindowActOnDone[ ii ].lpiSelectOnDone = lpiSelectOnDone; - } - - LeaveCriticalSection (pcsWindowActOnDone); -} - - -WORD Display_FreeActOnDone (HWND hWnd, LPIDENT *plpiSelectOnDone) -{ - WORD wAct = 0; - - if (pcsWindowActOnDone == NULL) - { - pcsWindowActOnDone = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsWindowActOnDone); - } - EnterCriticalSection (pcsWindowActOnDone); - - for (size_t ii = 0; ii < cWindowActOnDone; ++ii) - { - if (aWindowActOnDone[ ii ].hWnd == hWnd) - { - wAct = aWindowActOnDone[ ii ].actOnDone; - if (!(*plpiSelectOnDone)) - *plpiSelectOnDone = aWindowActOnDone[ ii ].lpiSelectOnDone; - - aWindowActOnDone[ ii ].actOnDone = 0; - aWindowActOnDone[ ii ].hWnd = 0; - aWindowActOnDone[ ii ].lpiSelectOnDone = 0; - break; - } - } - - LeaveCriticalSection (pcsWindowActOnDone); - return wAct; -} - - -void UpdateDisplay (LPDISPLAYREQUEST pdr, BOOL fWait) -{ - BOOL fRunBeforeReturning = FALSE; - - if (!ASSERT( pdr && pdr->hChild )) - return; - if (pdr->lpiNotify && pdr->lpiNotify->fIsCell()) - pdr->lpiNotify = NULL; - - if (pcsDisplayQueue == NULL) - { - pcsDisplayQueue = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsDisplayQueue); - memset (&drActiveSERVERS, 0x00, sizeof(DISPLAYREQUEST)); - memset (&drActiveSERVICES, 0x00, sizeof(DISPLAYREQUEST)); - memset (&drActiveAGGREGATES, 0x00, sizeof(DISPLAYREQUEST)); - memset (&drActiveFILESETS, 0x00, sizeof(DISPLAYREQUEST)); - memset (&drActiveSERVERWINDOW, 0x00, sizeof(DISPLAYREQUEST)); - } - - EnterCriticalSection (pcsDisplayQueue); - - for (size_t idq = 0; idq < cDisplayQueue; ++idq) - { - if (!aDisplayQueue[idq].hChild) - break; - } - if (idq == cDisplayQueue) - { - (void)REALLOC (aDisplayQueue, cDisplayQueue, 1+idq, cREALLOC_DISPLAYQUEUE); - } - if (idq < cDisplayQueue) - { - memcpy (&aDisplayQueue[idq], pdr, sizeof(DISPLAYREQUEST)); - - // Filter the display queue--for instance, if there's a request - // to update all filesets, we don't need to file a request to - // update an individual fileset. Likewise, if we're about to - // file a request to update all filesets, nix all existing update- - // this-fileset and update-filesets-on-this-server requests. - // - for (size_t idqKiller = 0; idqKiller < cDisplayQueue; ++idqKiller) - { - if (DisplayQueueFilter (idq, idqKiller)) - { - aDisplayQueue[idq].hChild = 0; - break; - } - } - - // Hmmmm...even if there is no request in the queue which lets us - // kill this request, there may be a request actively being serviced - // *right now* which does so. Test for that case too. - // - if (aDisplayQueue[idq].hChild) - { - if (DisplayQueueFilter (idq, (size_t)-1)) - aDisplayQueue[idq].hChild = 0; - } - - // Did the new request make it through all those tests? If so, - // see if we can remove any other entries because of this one. - // Then initiate a thread to actually do the work if there isn't one. - // - if (aDisplayQueue[idq].hChild) - { - for (size_t idqVictim = 0; idqVictim < cDisplayQueue; ++idqVictim) - { - if (DisplayQueueFilter (idqVictim, idq)) - { - InterlockedDecrementByWindow (aDisplayQueue[idqVictim].hChild); - aDisplayQueue[idqVictim].hChild = 0; - --cDisplayQueueActive; - } - } - - if (aDisplayQueue[idq].hChild) - { - InterlockedIncrementByWindow (aDisplayQueue[ idq ].hChild); - - if (fWait) - { - aDisplayQueue[idq].hChild = NULL; // we'll handle this one. - fRunBeforeReturning = TRUE; // (remember to do so) - } - else if ((++cDisplayQueueActive) >= 1) - { - if (cUpdateThreadsActive < cUPDATE_THREADS_MAX) - { - ++cUpdateThreadsActive; - StartThread (DisplayQueue_ThreadProc, 0); - } - } - } - } - } - - LeaveCriticalSection (pcsDisplayQueue); - - if (fRunBeforeReturning) - { - DisplayQueue_ThreadProc (pdr); - } -} - - -DWORD WINAPI DisplayQueue_ThreadProc (PVOID lp) -{ - LPDISPLAYREQUEST pdr = (LPDISPLAYREQUEST)lp; - LPDISPLAYREQUEST pdrActive = NULL; - - Main_StartWorking(); - - do { - DISPLAYREQUEST dr; - - EnterCriticalSection (pcsDisplayQueue); - if (pdr) - { - memcpy (&dr, pdr, sizeof(DISPLAYREQUEST)); - } - else - { - for (size_t idq = 0; idq < cDisplayQueue; ++idq) - { - if (aDisplayQueue[idq].hChild) - { - memcpy (&dr, &aDisplayQueue[idq], sizeof(DISPLAYREQUEST)); - memset (&aDisplayQueue[idq], 0x00, sizeof(DISPLAYREQUEST)); - --cDisplayQueueActive; - break; - } - } - if (idq == cDisplayQueue) - { - if (!pdr) // Are we losing a background thread? - --cUpdateThreadsActive; - LeaveCriticalSection (pcsDisplayQueue); - break; - } - } - - switch (dr.dt) - { - case dtSERVERS: pdrActive = &drActiveSERVERS; break; - case dtSERVICES: pdrActive = &drActiveSERVICES; break; - case dtAGGREGATES: pdrActive = &drActiveAGGREGATES; break; - case dtFILESETS: pdrActive = &drActiveFILESETS; break; - case dtSERVERWINDOW: pdrActive = &drActiveSERVERWINDOW; break; - } - if (pdrActive) - memcpy (pdrActive, &dr, sizeof(DISPLAYREQUEST)); - - LeaveCriticalSection (pcsDisplayQueue); - - AfsClass_Enter(); - - switch (dr.dt) - { - case dtCELL: - Display_Cell_Internal (&dr); - break; - - case dtSERVERS: - Display_Servers_Internal (&dr); - break; - - case dtSERVICES: - Display_Services_Internal (&dr); - break; - - case dtAGGREGATES: - Display_Aggregates_Internal (&dr); - break; - - case dtFILESETS: - Display_Filesets_Internal (&dr); - break; - - case dtREPLICAS: - Display_Replicas_Internal (&dr); - break; - - case dtSERVERWINDOW: - Display_ServerWindow_Internal (&dr); - break; - } - - EnterCriticalSection (pcsDisplayQueue); - LONG dw = InterlockedDecrementByWindow (dr.hChild); - if (pdrActive) - memset (pdrActive, 0x00, sizeof(DISPLAYREQUEST)); - LeaveCriticalSection (pcsDisplayQueue); - - if (dw == 0) - { - WORD actOnDone = dr.actOnDone; - LPIDENT lpiSelectOnDone = dr.lpiToSelect; - if (dr.hList) - { - actOnDone |= Display_FreeActOnDone (dr.hList, &lpiSelectOnDone); - } - - if ((actOnDone & ACT_ENDCHANGE) && dr.hList) - { - if (dr.fList) - FL_EndChange (dr.hList, (LPARAM)lpiSelectOnDone); - else // must be a combobox - CB_EndChange (dr.hList, (LPARAM)lpiSelectOnDone); - } - - if ((actOnDone & ACT_UNCOVER) && dr.hList) - AfsAppLib_Uncover (dr.hList); - - if (actOnDone & ACT_SELPREVIEW) - { - LPIDENT lpiOld = Server_GetServer (SERVERWINDOW_PREVIEWPANE); - LPIDENT lpiNew = (LPIDENT)FL_GetSelectedData (GetDlgItem (g.hMain, IDC_SERVERS)); - if (lpiOld != lpiNew) - Server_SelectServer (SERVERWINDOW_PREVIEWPANE, lpiNew, TRUE); - } - } - else if (dr.hList) - { - Display_AddActOnDone (dr.hList, dr.actOnDone, dr.lpiToSelect); - } - - AfsClass_Leave(); - - } while (!lp); // if given one task to do, stop; otherwise, loop forever - - Main_StopWorking(); - - return 0; -} - - -BOOL DisplayQueueFilter (size_t idqVictim, size_t idqKiller) -{ - if (idqVictim == idqKiller) - return FALSE; - - LPDISPLAYREQUEST pdrKiller = (idqKiller == (size_t)-1) ? NULL : &aDisplayQueue[ idqKiller ]; - LPDISPLAYREQUEST pdrVictim = &aDisplayQueue[ idqVictim ]; - - // if there's currently an operation in progress for this window, - // we may have just been asked to filter out a new request based on - // what's being done now. {idqKiller==-1} signifies this case. - // - if (pdrKiller == NULL) // was idqKiller==-1 etc? - { - switch (pdrVictim->dt) - { - case dtSERVERS: - pdrKiller = &drActiveSERVERS; - break; - - case dtSERVICES: - pdrKiller = &drActiveSERVICES; - break; - - case dtAGGREGATES: - pdrKiller = &drActiveAGGREGATES; - break; - - case dtFILESETS: - pdrKiller = &drActiveFILESETS; - break; - - case dtSERVERWINDOW: - pdrKiller = &drActiveSERVERWINDOW; - break; - } - - if (!pdrKiller) - return FALSE; - } - - if ( (pdrVictim->dt == pdrKiller->dt) && - (pdrVictim->hChild == pdrKiller->hChild) ) - { - // only some windows are subject to this filtering. - // - switch (pdrVictim->dt) - { - case dtCELL: - case dtREPLICAS: - return FALSE; // don't bother filtering these. - - case dtSERVERWINDOW: - return TRUE; // update svr window twice? why? - } - - // if the new request talks about displaying information for a different - // server, the user must have selected or deselected a server in the - // list. we'll keep the new request. - // - if (pdrKiller->lpiServer != pdrVictim->lpiServer) - return FALSE; - - // if pdrKiller is told to update everything, then all other requests - // are unnecessary. - // - if (!pdrKiller->lpiNotify || pdrKiller->lpiNotify->fIsCell()) - return TRUE; - - // if pdrVictim is told to update everything, then we'll always bow to it. - // - if (!pdrVictim->lpiNotify || pdrVictim->lpiNotify->fIsCell()) - return FALSE; - - // kill any duplicate request to update a particular object. - // - if (pdrVictim->lpiNotify == pdrKiller->lpiNotify) - return TRUE; - - // kill any request to update a service or aggregate or fileset, - // if updating the entire associated server. - // - if ( (pdrKiller->lpiNotify->fIsServer()) && - (pdrVictim->lpiNotify->GetServer() == pdrKiller->lpiNotify) ) - return TRUE; - - // kill any request to update a fileset, if updating the entire - // associated aggregate. - // - if ( (pdrKiller->lpiNotify->fIsAggregate()) && - (pdrVictim->lpiNotify->fIsFileset()) && - (pdrVictim->lpiNotify->GetAggregate() == pdrKiller->lpiNotify) ) - return TRUE; - } - - // hmmm...guess we need this request after all. - // - return FALSE; -} - - -void UpdateDisplay_Cell (BOOL fWait) -{ - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtCELL; - dr.hChild = GetDlgItem (g.hMain, IDC_CELL); - UpdateDisplay (&dr, fWait); -} - -void UpdateDisplay_Servers (BOOL fWait, LPIDENT lpiNotify, ULONG status) -{ - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtSERVERS; - dr.hChild = GetDlgItem (g.hMain, IDC_SERVERS); - dr.lpiNotify = lpiNotify; - dr.status = status; - dr.fList = TRUE; - UpdateDisplay (&dr, fWait); -} - -void UpdateDisplay_Services (BOOL fWait, HWND hChild, LPIDENT lpiNotify, ULONG status) -{ - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtSERVICES; - dr.hChild = hChild; - dr.lpiNotify = lpiNotify; - dr.status = status; - dr.fList = TRUE; - UpdateDisplay (&dr, fWait); -} - -void UpdateDisplay_Aggregates (BOOL fWait, HWND hListOrCombo, LPIDENT lpiNotify, ULONG status, LPIDENT lpiServer, LPIDENT lpiToSelect, LPVIEWINFO lpvi) -{ - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtAGGREGATES; - dr.hList = hListOrCombo; - dr.hChild = GetParent (hListOrCombo); - dr.lpiNotify = lpiNotify; - dr.status = status; - dr.lpiServer = (lpiServer == NULL) ? Server_GetServerForChild (dr.hChild) : lpiServer; - dr.lpiToSelect = lpiToSelect; - dr.lpvi = lpvi; - UpdateDisplay (&dr, fWait); -} - -void UpdateDisplay_Filesets (BOOL fWait, HWND hListOrCombo, LPIDENT lpiNotify, ULONG status, LPIDENT lpiServer, LPIDENT lpiAggregate, LPIDENT lpiToSelect) -{ - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtFILESETS; - dr.hList = hListOrCombo; - dr.hChild = GetParent (hListOrCombo); - dr.lpiNotify = lpiNotify; - dr.status = status; - dr.lpiServer = (lpiServer == NULL) ? Server_GetServerForChild (dr.hChild) : lpiServer; - dr.lpiAggregate = lpiAggregate; - dr.lpiToSelect = lpiToSelect; - UpdateDisplay (&dr, fWait); -} - -void UpdateDisplay_Replicas (BOOL fWait, HWND hList, LPIDENT lpiRW, LPIDENT lpiRO) -{ - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtREPLICAS; - dr.hChild = GetParent (hList); - dr.hList = hList; - dr.lpiNotify = lpiRW; - dr.lpiToSelect = lpiRO; - dr.fList = TRUE; - UpdateDisplay (&dr, fWait); -} - - -void UpdateDisplay_ServerWindow (BOOL fWait, LPIDENT lpiServer) -{ - // First, if there is a dedicated server window out there, update it. - // - HWND hServer; - if ((hServer = PropCache_Search (pcSERVER, lpiServer)) != NULL) - { - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtSERVERWINDOW; - dr.hChild = hServer; - dr.lpiServer = lpiServer; - - UpdateDisplay (&dr, fWait); - } - - // Second, if the preview pane is visible and showing this server, - // update it too. - // - if (gr.fPreview) - { - LPIDENT lpiPreview = Server_GetServer (g.hMain); - if ((lpiPreview == NULL) || (lpiPreview == lpiServer)) - { - DISPLAYREQUEST dr; - memset (&dr, 0x00, sizeof(dr)); - dr.dt = dtSERVERWINDOW; - dr.hChild = g.hMain; - dr.lpiServer = lpiPreview; - - UpdateDisplay (&dr, fWait); - } - } -} - - -void UpdateDisplay_SetIconView (BOOL fWait, HWND hDialog, LPICONVIEW piv, ICONVIEW ivNew) -{ - *piv = ivNew; - - if (piv == &gr.ivSvr) - { - UpdateDisplay_Servers (fWait, NULL, 0); - } - else - { - LPIDENT lpi = Server_GetServer (hDialog); - UpdateDisplay_ServerWindow (fWait, lpi); - } -} - - -ICONVIEW Display_GetServerIconView (void) -{ - LONG lvs; - - if (gr.fPreview && !gr.fVert) - lvs = gr.diHorz.viewSvr.lvsView; - else - lvs = gr.diVert.viewSvr.lvsView; - - - if (lvs != FLS_VIEW_LIST) - return ivONEICON; - - return gr.ivSvr; -} - - -BOOL HandleColumnNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp, LPVIEWINFO pvi) -{ - if (msg == WM_NOTIFY) - { - HWND hList = GetDlgItem (hDlg, ((LPNMHDR)lp)->idFrom); - if (fIsFastList (hList)) - { - switch (((LPNMHDR)lp)->code) - { - case FLN_COLUMNRESIZE: - FL_StoreView (hList, pvi); - return TRUE; - - case FLN_COLUMNCLICK: - LPFLN_COLUMNCLICK_PARAMS pp = (LPFLN_COLUMNCLICK_PARAMS)lp; - - int iCol; - BOOL fRev; - FastList_GetSortStyle (hList, &iCol, &fRev); - - if (iCol == pp->icol) - FastList_SetSortStyle (hList, iCol, !fRev); - else - FastList_SetSortStyle (hList, pp->icol, FALSE); - - FL_StoreView (hList, pvi); - return TRUE; - } - } - } - - return FALSE; -} - diff --git a/src/WINNT/afssvrmgr/display.h b/src/WINNT/afssvrmgr/display.h deleted file mode 100644 index eb2c7cc32..000000000 --- a/src/WINNT/afssvrmgr/display.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef DISPLAY_H -#define DISPLAY_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - dtINVALID = 0, - dtCELL, - dtSERVERS, - dtSERVICES, - dtAGGREGATES, - dtFILESETS, - dtREPLICAS, - dtSERVERWINDOW - } DISPLAYTARGET; - -#define ACT_ENDCHANGE 0x0002 -#define ACT_UNCOVER 0x0004 -#define ACT_SELPREVIEW 0x0008 - -typedef struct - { - HWND hChild; // g.hMain or server window to update - DISPLAYTARGET dt; // expect which kind of listview? - LPIDENT lpiNotify; // NULL or specific LPIDENT to update - ULONG status; // if (lpiNotify), associated error code - LPIDENT lpiServer; // NULL or parent server - LPIDENT lpiAggregate; // NULL or parent aggregate - LPIDENT lpiToSelect; // NULL or LPIDENT to select when done - LPVIEWINFO lpvi; // NULL or specific viewinfo to use - HWND hList; // (worker routines set this) - WORD actOnDone; // (worker routines set this) - BOOL fList; // (worker routines set this) - } DISPLAYREQUEST, *LPDISPLAYREQUEST; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -ICONVIEW Display_GetServerIconView (void); - -BOOL CALLBACK GetItemText (HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie); - -/* - *** HandleColumnNotify - * - * This routine handles the FLN_COLUMNCLICK and FLN_COLUMNRESIZE notifications. - * This routine returns TRUE if it handled the message; if so, its caller - * should return FASLE from the dlgproc. - * - */ - -BOOL HandleColumnNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp, LPVIEWINFO pvi); - -/* - *** UpdateDisplay - * - * This routine is the interface to updating any list-of-LPIDENTs in the tool; - * that includes the list-of-servers, the listviews and treeviews on each - * of the server window's tabs, and things like aggregate lists and fileset - * replica lists in various dialogs. - * - * If called with fWait=FALSE, the request is queued and performed on a - * separate worker thread; if it's TRUE, the request is performed before - * returning (as always, don't ever block the main thread this way). - * - * You'll need to pass in a filled-in DISPLAYREQUEST structure; this is copied - * to local storage, so it can be a local variable even if !fWait. - * - */ - -void UpdateDisplay (LPDISPLAYREQUEST pdr, BOOL fWait); - - -/* - *** UpdateDisplay_* - * - * These routines act as wrappers to UpdateDisplay(); they create an - * appropriate DISPLAYREQUEST packet and pass it along. - * - */ - -void UpdateDisplay_Cell (BOOL fWait); -void UpdateDisplay_Servers (BOOL fWait, LPIDENT lpiNotify, ULONG status); -void UpdateDisplay_Services (BOOL fWait, HWND hChild, LPIDENT lpiNotify, ULONG status); -void UpdateDisplay_Aggregates (BOOL fWait, HWND hListOrCombo, LPIDENT lpiNotify, ULONG status, LPIDENT lpiServer, LPIDENT lpiToSelect, LPVIEWINFO lpvi); -void UpdateDisplay_Filesets (BOOL fWait, HWND hListOrCombo, LPIDENT lpiNotify, ULONG status, LPIDENT lpiServer, LPIDENT lpiAggregate, LPIDENT lpiToSelect); -void UpdateDisplay_Replicas (BOOL fWait, HWND hList, LPIDENT lpiRW, LPIDENT lpiRO); -void UpdateDisplay_ServerWindow (BOOL fWait, LPIDENT lpiServer); -void UpdateDisplay_SetIconView (BOOL fWait, HWND hDialog, LPICONVIEW piv, ICONVIEW ivNew); - - -#endif - diff --git a/src/WINNT/afssvrmgr/exportcl.h b/src/WINNT/afssvrmgr/exportcl.h deleted file mode 100644 index b50a3b528..000000000 --- a/src/WINNT/afssvrmgr/exportcl.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef EXPORT_CELL_H -#define EXPORT_CELL_H -#ifdef DEBUG - -#define eckCELL TEXT("cell") -#define eckSERVER TEXT("server") -#define eckSERVICE TEXT("service") -#define eckAGGREGATE TEXT("partition") -#define eckFILESET TEXT("volume") -#define eckPRINCIPAL TEXT("principal") - - // For a server: - // -#define eckADDRESS TEXT("address") // if server is DB and Vol server -#define eckDBADDRESS TEXT("dbaddress") // if server is just DB server -#define eckVOLADDRESS TEXT("voladdress") // if server is just Vol server -#define eckHOST TEXT("hostname") -#define eckADMIN TEXT("admin") -//#def eckKEYVERSION TEXT("key_version") // from principal codes -//#def eckKEYDATA TEXT("key_data") // from principal codes - - // For a service: - // -#define eckRUNNING TEXT("running") -#define eckSIMPLE TEXT("simple") -#define eckCRON TEXT("cron") -#define eckTYPE TEXT("type") -#define eckFS TEXT("fs") -#define eckSTATE TEXT("state") -#define eckNSTARTS TEXT("nstarts") -#define eckERRLAST TEXT("lasterr") -#define eckSIGLAST TEXT("lastsig") -#define eckPARAMS TEXT("parameters") -#define eckNOTIFIER TEXT("notifier") -#define eckSTARTTIME TEXT("starttime") -#define eckSTOPTIME TEXT("stoptime") -#define eckERRORTIME TEXT("errortime") - - // For an partition: - // -#define eckDEVICE TEXT("device") -#define eckTOTAL TEXT("total") -#define eckFREECUR TEXT("curfree") - - // For a volume: - // -#define eckID TEXT("identifier") -#define eckID_RW TEXT("id_rwlink") -#define eckID_BK TEXT("id_bklink") -#define eckUSED TEXT("used") -#define eckQUOTA TEXT("quota") -#define eckCREATETIME TEXT("createtime") -#define eckUPDATETIME TEXT("updatetime") -#define eckACCESSTIME TEXT("accesstime") -#define eckBACKUPTIME TEXT("backuptime") - - // For a replicated volume: - // -#define eckRP_MAXSITEAGE TEXT("maxsiteage") -#define eckRP_MAXAGE TEXT("maxage") -#define eckRP_FAILAGE TEXT("failage") -#define eckRP_MINREP TEXT("minrepdelay") -#define eckRP_DEFSITEAGE TEXT("defsiteage") -#define eckRP_RECWAIT TEXT("reclaimwait") - - // For a principal: - // -#define eckEXPIRES TEXT("expires") -#define eckLASTMOD TEXT("modified") -#define eckLASTPWMOD TEXT("pw_modified") -#define eckLIFETIME TEXT("lifetime") -#define eckLOCKTIME TEXT("locktime") -#define eckPWEXPIRES TEXT("pw_expires") -#define eckFAILLOGIN TEXT("fail_login") -#define eckKEYVERSION TEXT("key_version") -#define eckKEYDATA TEXT("key_data") -#define eckKEYCSUM TEXT("key_csum") -#define eckPWREUSE TEXT("pw_reuse") -#define eckCREATOR TEXT("creator") -#define eckGRP_QUOTA TEXT("grp_quota") - - // For a group: - // -#define eckGROUP TEXT("group") -#define eckMEMBER TEXT("member") -#define eckOWNER TEXT("owner") - -#endif -#endif - diff --git a/src/WINNT/afssvrmgr/general.cpp b/src/WINNT/afssvrmgr/general.cpp deleted file mode 100644 index 7ba40e101..000000000 --- a/src/WINNT/afssvrmgr/general.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "general.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -/* - *** InterlockedIncrementByWindow - *** InterlockedDecrementByWindow - * - * Associates a zero-initialized LONG with an HWND, and calls Interlocked*() - * on that LONG. - * - */ - -#define cREALLOC_WINDOWLIST 16 - -static struct - { - HWND hWnd; - LONG dw; - } *aWindowList = NULL; - -static size_t cWindowList = 0; -static LPCRITICAL_SECTION pcsWindowList = NULL; - -LONG *FindLongByWindow (HWND hWnd) -{ - LONG *lpdw = NULL; - - if (pcsWindowList == NULL) - { - pcsWindowList = New (CRITICAL_SECTION); - InitializeCriticalSection (pcsWindowList); - } - - EnterCriticalSection (pcsWindowList); - - for (size_t ii = 0; !lpdw && ii < cWindowList; ++ii) - { - if (aWindowList[ ii ].hWnd == hWnd) - lpdw = &aWindowList[ ii ].dw; - } - if (ii == cWindowList) - { - if (REALLOC( aWindowList, cWindowList, 1+ii, cREALLOC_WINDOWLIST )) - { - aWindowList[ ii ].hWnd = hWnd; - aWindowList[ ii ].dw = 0; - lpdw = &aWindowList[ ii ].dw; - } - } - - LeaveCriticalSection (pcsWindowList); - return lpdw; -} - -LONG InterlockedIncrementByWindow (HWND hWnd) -{ - LONG *lpdw; - if ((lpdw = FindLongByWindow (hWnd)) == NULL) - return 0; - return InterlockedIncrement (lpdw); -} - -LONG InterlockedDecrementByWindow (HWND hWnd) -{ - LONG *lpdw; - if ((lpdw = FindLongByWindow (hWnd)) == NULL) - return 0; - return InterlockedDecrement (lpdw); -} - diff --git a/src/WINNT/afssvrmgr/general.h b/src/WINNT/afssvrmgr/general.h deleted file mode 100644 index 5cad8a7e6..000000000 --- a/src/WINNT/afssvrmgr/general.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GENERAL_H -#define GENERAL_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -/* - *** InterlockedIncrementByWindow - *** InterlockedDecrementByWindow - * - * Associates a zero-initialized LONG with an HWND, and calls Interlocked*() - * on that LONG. - * - */ - -LONG InterlockedIncrementByWindow (HWND hWnd); -LONG InterlockedDecrementByWindow (HWND hWnd); - - -#endif - diff --git a/src/WINNT/afssvrmgr/help.hid b/src/WINNT/afssvrmgr/help.hid deleted file mode 100644 index 2410f8872..000000000 --- a/src/WINNT/afssvrmgr/help.hid +++ /dev/null @@ -1,532 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - *** Overview Topics - * - */ - -#define IDH_SVRMGR_NEWCELL_OVERVIEW 1000 -#define IDH_SVRMGR_NEWCREDS_OVERVIEW 1001 -#define IDH_SVRMGR_COLUMNS_OVERVIEW 1002 -#define IDH_SVRMGR_PROP_SERVER_OVERVIEW 1003 -#define IDH_SVRMGR_PROP_SERVER_WARNINGS_OVERVIEW 1004 -#define IDH_SVRMGR_PROP_SERVICE_OVERVIEW 1005 -#define IDH_SVRMGR_PROP_AGGREGATE_OVERVIEW 1006 -#define IDH_SVRMGR_PROP_FILESET_OVERVIEW 1007 -#define IDH_SVRMGR_PROP_REPSITES_OVERVIEW 1009 -#define IDH_SVRMGR_PROP_MOVEFILESET_OVERVIEW 1010 -#define IDH_SVRMGR_PROBLEMS_OVERVIEW 1011 -#define IDH_SVRMGR_FILESET_REPLICATION 1012 -#define IDH_SVRMGR_CREATEFILESET_OVERVIEW 1013 -#define IDH_SVRMGR_DELETEFILESET_OVERVIEW 1014 -#define IDH_SVRMGR_SETFILESETQUOTA_OVERVIEW 1015 -#define IDH_SVRMGR_BROWSE_USER_OVERVIEW 1018 -#define IDH_SVRMGR_BROWSE_GROUP_OVERVIEW 1019 -#define IDH_SVRMGR_SYNCVLDB_OVERVIEW 1020 -#define IDH_SVRMGR_CREATEREPLICA_OVERVIEW 1022 -#define IDH_SVRMGR_INSTALLFILE_OVERVIEW 1023 -#define IDH_SVRMGR_UNINSTALLFILE_OVERVIEW 1024 -#define IDH_SVRMGR_PRUNEFILES_OVERVIEW 1025 -#define IDH_SVRMGR_RENAMEFILESET_OVERVIEW 1026 -#define IDH_SVRMGR_CREATESERVICE_OVERVIEW 1028 -#define IDH_SVRMGR_DELETESERVICE_OVERVIEW 1029 -#define IDH_SVRMGR_RELEASEFILESET_OVERVIEW 1030 -#define IDH_SVRMGR_GETDATES_OVERVIEW 1031 -#define IDH_SVRMGR_GETDATES_RESULTS_OVERVIEW 1032 -#define IDH_SVRMGR_ADMINLIST_EDIT_OVERVIEW 1034 -#define IDH_SVRMGR_CLONE_OVERVIEW 1035 -#define IDH_SVRMGR_DUMPFILESET_OVERVIEW 1037 -#define IDH_SVRMGR_RESTOREFILESET_OVERVIEW 1038 -#define IDH_SVRMGR_PROP_SERVICE_BOS_OVERVIEW 1039 -#define IDH_SVRMGR_CLONESYS_OVERVIEW 1040 -#define IDH_SVRMGR_SUBSETS_OVERVIEW 1041 -#define IDH_SVRMGR_OPTIONS_GENERAL_OVERVIEW 1042 -#define IDH_SVRMGR_BADCREDS_OVERVIEW 1043 -#define IDH_SVRMGR_DELETEREPLICA_OVERVIEW 1045 -#define IDH_SVRMGR_DELETECLONE_OVERVIEW 1046 -#define IDH_SVRMGR_SERVERKEY_EDIT_OVERVIEW 1047 -#define IDH_SVRMGR_STARTSERVICE_OVERVIEW 1048 -#define IDH_SVRMGR_STOPSERVICE_OVERVIEW 1049 -#define IDH_SVRMGR_EXECUTECOMMAND_OVERVIEW 1050 -#define IDH_SVRMGR_SALVAGE_OVERVIEW 1051 -#define IDH_SVRMGR_SALVAGE_RESULTS_OVERVIEW 1052 -#define IDH_SVRMGR_HOSTS_EDIT_OVERVIEW 1053 -#define IDH_SVRMGR_HOSTS_ADD_OVERVIEW 1054 -#define IDH_SVRMGR_SERVERADDRESSES_OVERVIEW 1055 -#define IDH_SVRMGR_CHANGEADDRESS_OVERVIEW 1056 - - -/* - *** VOS, BOS, KAS, PTS and AfsClient Command Topics - * - */ - -#define IDH_SVRMGR_COMMAND_VOS_ADDSITE 2000 -#define IDH_SVRMGR_COMMAND_VOS_BACKUP 2001 -#define IDH_SVRMGR_COMMAND_VOS_BACKUPSYS 2002 -#define IDH_SVRMGR_COMMAND_VOS_CREATE 2003 -#define IDH_SVRMGR_COMMAND_VOS_DELENTRY 2004 -#define IDH_SVRMGR_COMMAND_VOS_DUMP 2005 -#define IDH_SVRMGR_COMMAND_VOS_EXAMINE 2006 -#define IDH_SVRMGR_COMMAND_VOS_LISTPART 2007 -#define IDH_SVRMGR_COMMAND_VOS_LISTVLDB 2008 -#define IDH_SVRMGR_COMMAND_VOS_LISTVOL 2009 -#define IDH_SVRMGR_COMMAND_VOS_LOCK 2010 -#define IDH_SVRMGR_COMMAND_VOS_MOVE 2011 -#define IDH_SVRMGR_COMMAND_VOS_PARTINFO 2012 -#define IDH_SVRMGR_COMMAND_VOS_RELEASE 2013 -#define IDH_SVRMGR_COMMAND_VOS_REMOVE 2014 -#define IDH_SVRMGR_COMMAND_VOS_REMSITE 2015 -#define IDH_SVRMGR_COMMAND_VOS_RENAME 2016 -#define IDH_SVRMGR_COMMAND_VOS_RESTORE 2017 -#define IDH_SVRMGR_COMMAND_VOS_SYNCVLDB 2018 -#define IDH_SVRMGR_COMMAND_VOS_UNLOCK 2019 -#define IDH_SVRMGR_COMMAND_VOS_UNLOCKVLDB 2020 -#define IDH_SVRMGR_COMMAND_VOS_ZAP 2021 -#define IDH_SVRMGR_COMMAND_BOS_ADDHOST 2022 -#define IDH_SVRMGR_COMMAND_BOS_ADDKEY 2023 -#define IDH_SVRMGR_COMMAND_BOS_ADDUSER 2024 -#define IDH_SVRMGR_COMMAND_BOS_CREATE 2025 -#define IDH_SVRMGR_COMMAND_BOS_DELETE 2026 -#define IDH_SVRMGR_COMMAND_BOS_EXEC 2027 -#define IDH_SVRMGR_COMMAND_BOS_GETDATE 2028 -#define IDH_SVRMGR_COMMAND_BOS_GETLOG 2029 -#define IDH_SVRMGR_COMMAND_BOS_GETRESTART 2030 -#define IDH_SVRMGR_COMMAND_BOS_INSTALL 2031 -#define IDH_SVRMGR_COMMAND_BOS_LISTHOSTS 2032 -#define IDH_SVRMGR_COMMAND_BOS_LISTKEYS 2033 -#define IDH_SVRMGR_COMMAND_BOS_LISTUSERS 2034 -#define IDH_SVRMGR_COMMAND_BOS_PRUNE 2035 -#define IDH_SVRMGR_COMMAND_BOS_REMOVEHOST 2036 -#define IDH_SVRMGR_COMMAND_BOS_REMOVEKEY 2037 -#define IDH_SVRMGR_COMMAND_BOS_REMOVEUSER 2038 -#define IDH_SVRMGR_COMMAND_BOS_RESTART 2039 -#define IDH_SVRMGR_COMMAND_BOS_SALVAGE 2040 -#define IDH_SVRMGR_COMMAND_BOS_SETAUTH 2041 -#define IDH_SVRMGR_COMMAND_BOS_SETRESTART 2042 -#define IDH_SVRMGR_COMMAND_BOS_SHUTDOWN 2043 -#define IDH_SVRMGR_COMMAND_BOS_START 2044 -#define IDH_SVRMGR_COMMAND_BOS_STARTUP 2045 -#define IDH_SVRMGR_COMMAND_BOS_STATUS 2046 -#define IDH_SVRMGR_COMMAND_BOS_STOP 2047 -#define IDH_SVRMGR_COMMAND_BOS_UNINSTALL 2048 -#define IDH_SVRMGR_COMMAND_KAS_GETRANDOMKEY 2049 -#define IDH_SVRMGR_COMMAND_FS_LISTQUOTA 2050 -#define IDH_SVRMGR_COMMAND_FS_QUOTA 2051 -#define IDH_SVRMGR_COMMAND_FS_SETQUOTA 2052 - - -/* - *** CONTEXT HELP TOPICS - * - */ - -// Context help for IDD_SVR_LISTS: -// -#define IDH_SVRMGR_LIST_LIST 3000 -#define IDH_SVRMGR_LIST_ADD 3001 -#define IDH_SVRMGR_LIST_REMOVE 3002 -#define IDH_SVRMGR_LIST_NAME 3005 - -// Context help for IDD_AGG_GENERAL: -// -#define IDH_SVRMGR_AGGPROP_NAME 3100 -#define IDH_SVRMGR_AGGPROP_ID 3101 -#define IDH_SVRMGR_AGGPROP_DEVICE 3102 -#define IDH_SVRMGR_AGGPROP_USAGE 3104 -#define IDH_SVRMGR_AGGPROP_USAGEBAR 3105 -#define IDH_SVRMGR_AGGPROP_WARN 3106 -#define IDH_SVRMGR_AGGPROP_WARN_AGGFULL_DEF 3107 -#define IDH_SVRMGR_AGGPROP_WARN_AGGFULL 3108 -#define IDH_SVRMGR_AGGPROP_WARN_AGGFULL_PERCENT 3109 -#define IDH_SVRMGR_AGGPROP_NUMFILESETS 3110 -#define IDH_SVRMGR_AGGPROP_WARNALLOC 3111 - -// Context help for IDD_SVR_GENERAL: -// -#define IDH_SVRMGR_SVRPROP_NAME 3200 -#define IDH_SVRMGR_SVRPROP_ADDRESSES 3201 -#define IDH_SVRMGR_SVRPROP_AUTH_YES 3202 -#define IDH_SVRMGR_SVRPROP_AUTH_NO 3203 -#define IDH_SVRMGR_SVRPROP_CAPACITY 3204 -#define IDH_SVRMGR_SVRPROP_ALLOCATION 3205 -#define IDH_SVRMGR_SVRPROP_NUMAGGREGATES 3208 -#define IDH_SVRMGR_SVRPROP_CHANGEADDR 3209 - -// Context help for IDD_SVR_SCOUT: -// -#define IDH_SVRMGR_SVRPROP_WARN_AGGFULL 3300 -#define IDH_SVRMGR_SVRPROP_WARN_AGGFULL_PERCENT 3301 -#define IDH_SVRMGR_SVRPROP_WARN_SETFULL 3302 -#define IDH_SVRMGR_SVRPROP_WARN_SETFULL_PERCENT 3303 -#define IDH_SVRMGR_SVRPROP_WARN_SVCSTOP 3304 -#define IDH_SVRMGR_SVRPROP_WARN_SETNOVLDB 3305 -#define IDH_SVRMGR_SVRPROP_WARN_AGGNOSERV 3306 -#define IDH_SVRMGR_SVRPROP_WARN_SETNOSERV 3307 -#define IDH_SVRMGR_SVRPROP_AUTOREFRESH 3308 -#define IDH_SVRMGR_SVRPROP_AUTOREFRESH_MINUTES 3309 -#define IDH_SVRMGR_SVRPROP_WARNALLOC 3310 - -// Context help for IDD_SVC_GENERAL: -// -#define IDH_SVRMGR_SVCPROP_NAME 3400 -#define IDH_SVRMGR_SVCPROP_TYPE 3401 -#define IDH_SVRMGR_SVCPROP_PARAMS 3402 -#define IDH_SVRMGR_SVCPROP_STARTDATE 3403 -#define IDH_SVRMGR_SVCPROP_STOPDATE 3404 -#define IDH_SVRMGR_SVCPROP_LASTERROR 3405 -#define IDH_SVRMGR_SVCPROP_STATUS 3406 -#define IDH_SVRMGR_SVCPROP_NOTIFIER 3407 -#define IDH_SVRMGR_SVCPROP_WARNSTOP 3408 -#define IDH_SVRMGR_SVCPROP_VIEWLOG 3410 -#define IDH_SVRMGR_SVCPROP_START 3411 -#define IDH_SVRMGR_SVCPROP_STOP 3412 - -// Context help for IDD_SET_GENERAL: -// -#define IDH_SVRMGR_SETPROP_NAME 3500 -#define IDH_SVRMGR_SETPROP_ID 3501 -#define IDH_SVRMGR_SETPROP_CREATEDATE 3502 -#define IDH_SVRMGR_SETPROP_UPDATEDATE 3503 -#define IDH_SVRMGR_SETPROP_ACCESSDATE 3504 -#define IDH_SVRMGR_SETPROP_BACKUPDATE 3505 -#define IDH_SVRMGR_SETPROP_STATUS 3506 -#define IDH_SVRMGR_SETPROP_LOCK 3507 -#define IDH_SVRMGR_SETPROP_UNLOCK 3508 -#define IDH_SVRMGR_SETPROP_USAGE 3509 -#define IDH_SVRMGR_SETPROP_QUOTA 3510 -#define IDH_SVRMGR_SETPROP_USAGEBAR 3511 -#define IDH_SVRMGR_SETPROP_WARN 3512 -#define IDH_SVRMGR_SETPROP_WARN_SETFULL_DEF 3513 -#define IDH_SVRMGR_SETPROP_WARN_SETFULL 3514 -#define IDH_SVRMGR_SETPROP_WARN_SETFULL_PERCENT 3515 -#define IDH_SVRMGR_SETPROP_FILES 3516 - -// Context help for IDD_SVC_CREATE: -// -#define IDH_SVRMGR_SVCCREATE_SERVER 3600 -#define IDH_SVRMGR_SVCCREATE_NAME 3601 -#define IDH_SVRMGR_SVCCREATE_PARAMS 3602 -#define IDH_SVRMGR_SVCCREATE_LOGFILE 3603 -#define IDH_SVRMGR_SVCCREATE_SIMPLE 3604 -#define IDH_SVRMGR_SVCCREATE_SIMPLE_RUNNOW 3605 -#define IDH_SVRMGR_SVCCREATE_CRON 3607 -#define IDH_SVRMGR_SVCCREATE_CRON_RUNDAY 3608 -#define IDH_SVRMGR_SVCCREATE_CRON_RUNTIME 3609 -#define IDH_SVRMGR_SVCCREATE_COMMAND 3610 -#define IDH_SVRMGR_SVCCREATE_NOTIFIER 3611 -#define IDH_SVRMGR_SVCCREATE_FS 3612 - -// Context help for IDD_SET_RELEASE: -// -#define IDH_SVRMGR_SETRELEASE_OK 3700 -#define IDH_SVRMGR_SETRELEASE_CANCEL 3701 -#define IDH_SVRMGR_SETRELEASE_NORMAL 3702 -#define IDH_SVRMGR_SETRELEASE_FORCE 3703 - -// Context help for IDD_SET_REPSITES: -// -#define IDH_SVRMGR_SETREPSITES_NAME 3800 -#define IDH_SVRMGR_SETREPSITES_RW_SERVER 3801 -#define IDH_SVRMGR_SETREPSITES_RW_AGGREGATE 3802 -#define IDH_SVRMGR_SETREPSITES_REPSITES 3803 -#define IDH_SVRMGR_SETREPSITES_REPSITE_ADD 3804 -#define IDH_SVRMGR_SETREPSITES_REPSITE_DELETE 3805 -#define IDH_SVRMGR_SETREPSITES_REPSITE_RELEASE 3806 - -// Context help for IDD_DCE_NEWCELL: -// -#define IDH_SVRMGR_NEWCELL_CELL 3900 -#define IDH_SVRMGR_NEWCELL_CURRENTID 3901 -#define IDH_SVRMGR_NEWCELL_ID 3902 -#define IDH_SVRMGR_NEWCELL_PASSWORD 3903 -#define IDH_SVRMGR_NEWCELL_ADVANCED 3904 -#define IDH_SVRMGR_NEWCELL_MONALL 3905 -#define IDH_SVRMGR_NEWCELL_MONONE 3906 -#define IDH_SVRMGR_NEWCELL_MONSERVER 3907 -#define IDH_SVRMGR_NEWCELL_MONSOME 3908 -#define IDH_SVRMGR_NEWCELL_MONSUBSET 3909 - -// Context help for IDD_DCE_NEWCREDS: -// -#define IDH_SVRMGR_NEWCREDS_CELL 4000 -#define IDH_SVRMGR_NEWCREDS_CURRENTID 4001 -#define IDH_SVRMGR_NEWCREDS_EXPDATE 4002 -#define IDH_SVRMGR_NEWCREDS_LOGIN 4003 -#define IDH_SVRMGR_NEWCREDS_ID 4004 -#define IDH_SVRMGR_NEWCREDS_PASSWORD 4005 - -// Context help for IDD_COLUMNS: -// -#define IDH_SVRMGR_COLUMNS_WHICH 4100 -#define IDH_SVRMGR_COLUMNS_AVAIL 4101 -#define IDH_SVRMGR_COLUMNS_SHOWN 4102 -#define IDH_SVRMGR_COLUMNS_INSERT 4103 -#define IDH_SVRMGR_COLUMNS_DELETE 4104 -#define IDH_SVRMGR_COLUMNS_MOVEUP 4105 -#define IDH_SVRMGR_COLUMNS_MOVEDOWN 4106 - -// Context help for IDD_SET_CREATE: -// -#define IDH_SVRMGR_SETCREATE_NAME 4300 -#define IDH_SVRMGR_SETCREATE_QUOTA 4301 -#define IDH_SVRMGR_SETCREATE_QUOTA_UNITS 4302 -#define IDH_SVRMGR_SETCREATE_CLONE 4303 -#define IDH_SVRMGR_SETCREATE_SERVER 4304 -#define IDH_SVRMGR_SETCREATE_AGGLIST 4305 - -// Context help for IDD_SET_DELETE: -// -#define IDH_SVRMGR_SETDELETE_OK 4400 -#define IDH_SVRMGR_SETDELETE_CANCEL 4401 -#define IDH_SVRMGR_SETDELETE_DELFROM_SERVER 4402 -#define IDH_SVRMGR_SETDELETE_DELFROM_VLDB 4403 - -// Context help for IDD_SET_CLONE: -// -#define IDH_SVRMGR_SETCLONE_OK 4500 -#define IDH_SVRMGR_SETCLONE_CANCEL 4501 - -// Context help for IDD_PROBLEMS: -// -#define IDH_SVRMGR_PROBLEMS_TEXT 4600 -#define IDH_SVRMGR_PROBLEMS_REMEDY 4601 -#define IDH_SVRMGR_PROBLEMS_SCROLL 4602 - -// Context help for IDD_SET_MOVETO: -// -#define IDH_SVRMGR_SETMOVE_AGGLIST 4700 -#define IDH_SVRMGR_SETMOVE_SERVER 4702 - -// Context help for IDD_SVC_LOGNAME: -// -#define IDH_SVRMGR_LOGNAME_SERVER 4900 -#define IDH_SVRMGR_LOGNAME_FILENAME 4901 -#define IDH_SVRMGR_LOGNAME_OK 4902 -#define IDH_SVRMGR_LOGNAME_CANCEL 4903 - -// Context help for IDD_SVC_VIEWLOG: -// -#define IDH_SVRMGR_VIEWLOG_FILENAME 5000 -#define IDH_SVRMGR_VIEWLOG_TEXT 5001 -#define IDH_SVRMGR_VIEWLOG_SAVEAS 5002 - -// Context help for IDD_SET_SETQUOTA: -// -#define IDH_SVRMGR_SETQUOTA_NAME 5200 -#define IDH_SVRMGR_SETQUOTA_AGGREGATE 5201 -#define IDH_SVRMGR_SETQUOTA_AGGPROPERTIES 5202 -#define IDH_SVRMGR_SETQUOTA_USAGE 5203 -#define IDH_SVRMGR_SETQUOTA_USAGEBAR 5204 -#define IDH_SVRMGR_SETQUOTA_VALUE 5205 -#define IDH_SVRMGR_SETQUOTA_UNITS 5206 -#define IDH_SVRMGR_SETQUOTA_OK 5207 -#define IDH_SVRMGR_SETQUOTA_CANCEL 5208 - -// Context help for IDD_SVR_SYNCVLDB: -// -#define IDH_SVRMGR_SYNCVLDB_OK 5402 -#define IDH_SVRMGR_SYNCVLDB_CANCEL 5403 - -// Context help for IDD_SET_CREATEREP: -// -#define IDH_SVRMGR_SETCREATEREP_NAME 5600 -#define IDH_SVRMGR_SETCREATEREP_AGGLIST 5601 -#define IDH_SVRMGR_SETCREATEREP_SERVER 5603 - -// Context help for IDD_SVR_INSTALL: -// -#define IDH_SVRMGR_INSTALL_SOURCE 5700 -#define IDH_SVRMGR_INSTALL_BROWSE 5701 -#define IDH_SVRMGR_INSTALL_SERVER 5702 -#define IDH_SVRMGR_INSTALL_TARGET 5703 - -// Context help for IDD_SVR_UNINSTALL: -// -#define IDH_SVRMGR_UNINSTALL_SERVER 5800 -#define IDH_SVRMGR_UNINSTALL_FILENAME 5801 - -// Context help for IDD_SVR_PRUNE: -// -#define IDH_SVRMGR_PRUNE_SERVER 5900 -#define IDH_SVRMGR_PRUNE_OP_DELETE_CORE 5901 -#define IDH_SVRMGR_PRUNE_OP_DELETE_BAK 5902 -#define IDH_SVRMGR_PRUNE_OP_DELETE_OLD 5903 - -// Context help for IDD_SET_RENAME: -// -#define IDH_SVRMGR_RENAMESET_OLDNAME 6000 -#define IDH_SVRMGR_RENAMESET_NEWNAME 6001 - -// Context help for IDD_SVC_DELETE: -// -#define IDH_SVRMGR_DELETESERVICE_CANCEL 6100 -#define IDH_SVRMGR_DELETESERVICE_OK 6101 - -// Context help for IDD_SVR_GETDATES: -// -#define IDH_SVRMGR_GETDATES_SERVER 6500 -#define IDH_SVRMGR_GETDATES_FILENAME 6501 - -// Context help for IDD_SVR_GETDATES_RESULTS: -// -// #define IDH_SVRMGR_GETDATES_SERVER 6500 -// #define IDH_SVRMGR_GETDATES_FILENAME 6501 -#define IDH_SVRMGR_GETDATES_DATE_FILE 6602 -#define IDH_SVRMGR_GETDATES_DATE_BAK 6603 -#define IDH_SVRMGR_GETDATES_DATE_OLD 6604 - -// Context help for IDD_SET_DUMP: -// -#define IDH_SVRMGR_SETDUMP_FILENAME 6900 -#define IDH_SVRMGR_SETDUMP_FULL 6901 -#define IDH_SVRMGR_SETDUMP_BYTIME 6902 -#define IDH_SVRMGR_SETDUMP_BYTIME_TIME 6903 -#define IDH_SVRMGR_SETDUMP_BYTIME_DATE 6904 - -// Context help for IDD_SET_RESTORE: -// -#define IDH_SVRMGR_SETRESTORE_FILENAME 7000 -#define IDH_SVRMGR_SETRESTORE_BROWSE 7001 -#define IDH_SVRMGR_SETRESTORE_SETNAME 7002 -#define IDH_SVRMGR_SETRESTORE_SERVER 7003 -#define IDH_SVRMGR_SETRESTORE_AGGLIST 7004 -#define IDH_SVRMGR_SETRESTORE_INCREMENTAL 7005 - -// Context help for IDD_SVC_BOS: -// -#define IDH_SVRMGR_SVCPROP_BOS_NAME 7100 -#define IDH_SVRMGR_SVCPROP_BOS_GENRES 7101 -#define IDH_SVRMGR_SVCPROP_BOS_GENRES_DATE 7102 -#define IDH_SVRMGR_SVCPROP_BOS_GENRES_TIME 7103 -#define IDH_SVRMGR_SVCPROP_BOS_BINRES 7104 -#define IDH_SVRMGR_SVCPROP_BOS_BINRES_DATE 7105 -#define IDH_SVRMGR_SVCPROP_BOS_BINRES_TIME 7106 - -// Context help for IDD_SET_CLONESYS: -// -#define IDH_SVRMGR_CLONESYS_ALL 7200 -#define IDH_SVRMGR_CLONESYS_SOME 7201 -#define IDH_SVRMGR_CLONESYS_BYSERVER 7202 -#define IDH_SVRMGR_CLONESYS_BYSERVER_SERVER 7203 -#define IDH_SVRMGR_CLONESYS_BYAGG 7204 -#define IDH_SVRMGR_CLONESYS_BYAGG_AGGREGATE 7205 -#define IDH_SVRMGR_CLONESYS_BYPREFIX 7206 -#define IDH_SVRMGR_CLONESYS_BYPREFIX_PREFIX 7207 - -// Context help for IDD_SUBSETS: -// -#define IDH_SVRMGR_SUBSET_NAME 7300 -#define IDH_SVRMGR_SUBSET_LOAD 7301 -#define IDH_SVRMGR_SUBSET_SAVE 7302 -#define IDH_SVRMGR_SUBSET_SERVERLIST 7303 -#define IDH_SVRMGR_SUBSET_MONITORALL 7304 -#define IDH_SVRMGR_SUBSET_MONITORNONE 7305 - -// Context help for IDD_SUBSET_LOADSAVE: -// -// #define IDH_SVRMGR_SUBSET_NAME 7300 -#define IDH_SVRMGR_SUBSET_SUBSETLIST 7401 -#define IDH_SVRMGR_SUBSET_DELETE 7402 -#define IDH_SVRMGR_SUBSET_RENAME 7403 - -// Context help for IDD_OPTIONS_GENERAL: -// -#define IDH_SVRMGR_OPT_SVR_LONGNAMES 7500 -#define IDH_SVRMGR_OPT_SVR_DBL_PROP 7501 -#define IDH_SVRMGR_OPT_SVR_DBL_DEPENDS 7502 -#define IDH_SVRMGR_OPT_SVR_DBL_OPEN 7503 -#define IDH_SVRMGR_OPT_SVR_OPENMON 7504 -#define IDH_SVRMGR_OPT_SVR_CLOSEUNMON 7505 -#define IDH_SVRMGR_OPT_WARN_BADCREDS 7506 - -// Context help for IDD_BADCREDS: -// -#define IDH_SVRMGR_BADCREDS_SHUTUP 7600 -#define IDH_SVRMGR_BADCREDS_YES 7601 -#define IDH_SVRMGR_BADCREDS_NO 7602 - -// Context help for IDD_SET_DELREP: -// -#define IDH_SVRMGR_SETDELREP_OK 7700 -#define IDH_SVRMGR_SETDELREP_CANCEL 7701 - -// Context help for IDD_SET_DELCLONE: -// -#define IDH_SVRMGR_SETDELCLONE_OK 7800 -#define IDH_SVRMGR_SETDELCLONE_CANCEL 7801 - -// Context help for IDD_SVR_KEYS: -// -#define IDH_SVRMGR_KEY_LIST 7900 -#define IDH_SVRMGR_KEY_ADD 7901 -#define IDH_SVRMGR_KEY_REMOVE 7902 -#define IDH_SVRMGR_KEY_NAME 7903 - -// Context help for IDD_SVC_START: -// -#define IDH_SVRMGR_STARTSERVICE_TEMPORARY 8000 -#define IDH_SVRMGR_STARTSERVICE_PERMANENT 8001 - -// Context help for IDD_SVC_STOP: -// -#define IDH_SVRMGR_STOPSERVICE_TEMPORARY 8100 -#define IDH_SVRMGR_STOPSERVICE_PERMANENT 8101 - -// Context help for IDD_SVR_EXECUTE: -// -#define IDH_SVRMGR_EXECUTECOMMAND_SERVER 8200 -#define IDH_SVRMGR_EXECUTECOMMAND_COMMAND 8201 - -// Context help for IDD_SVR_SALVAGE: -// -#define IDH_SVRMGR_SALVAGE_SERVER 8300 -#define IDH_SVRMGR_SALVAGE_AGGREGATE 8301 -#define IDH_SVRMGR_SALVAGE_AGGREGATE_ALL 8302 -#define IDH_SVRMGR_SALVAGE_FILESET 8303 -#define IDH_SVRMGR_SALVAGE_FILESET_ALL 8304 -#define IDH_SVRMGR_SALVAGE_ADVANCED 8305 -#define IDH_SVRMGR_SALVAGE_TEMPDIR 8306 -#define IDH_SVRMGR_SALVAGE_SIMUL 8307 -#define IDH_SVRMGR_SALVAGE_NUM 8308 -#define IDH_SVRMGR_SALVAGE_READONLY 8309 -#define IDH_SVRMGR_SALVAGE_BLOCK 8310 -#define IDH_SVRMGR_SALVAGE_FORCE 8311 -#define IDH_SVRMGR_SALVAGE_FIXDIRS 8312 -#define IDH_SVRMGR_SALVAGE_LOG_FILE 8313 -#define IDH_SVRMGR_SALVAGE_LOG_INODES 8314 -#define IDH_SVRMGR_SALVAGE_LOG_ROOT 8315 - -// Context help for IDD_SVR_SALVAGE_RESULTS: -// -#define IDH_SVRMGR_SALVAGE_DETAILS 8400 - -// Context help for IDD_SVR_HOSTS: -// -#define IDH_SVRMGR_HOST_LIST 8500 -#define IDH_SVRMGR_HOST_ADD 8501 -#define IDH_SVRMGR_HOST_REMOVE 8502 -#define IDH_SVRMGR_HOST_TITLE 8503 - -// Context help for IDD_SVR_ADDHOST: -// -#define IDH_SVRMGR_ADDHOST_HOST 8600 -#define IDH_SVRMGR_ADDHOST_OK 8601 - -// Context help for IDD_SVR_ADDRESS: -// -#define IDH_SVRMGR_ADDRESS_LIST 8700 -#define IDH_SVRMGR_ADDRESS_CHANGE 8701 -#define IDH_SVRMGR_ADDRESS_REMOVE 8702 - -// Context help for IDD_SVR_NEWADDR: -// -#define IDH_SVRMGR_CHANGEADDR_ADDRESS 8800 - diff --git a/src/WINNT/afssvrmgr/helpfunc.cpp b/src/WINNT/afssvrmgr/helpfunc.cpp deleted file mode 100644 index 8643c8fb8..000000000 --- a/src/WINNT/afssvrmgr/helpfunc.cpp +++ /dev/null @@ -1,1072 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "helpfunc.h" -#include - -#ifndef iswhite -#define iswhite(_ch) ( ((_ch) == TEXT(' ')) || ((_ch) == TEXT('\t')) ) -#endif - - -/* - * VARIABLES ________________________________________________________________ - * - */ - -typedef enum { - uuUNSPECIFIED, - uuVOS, // VOS commands - uuBOS, // BOS commands - uuKAS, // KAS commands - uuFS // FS commands -} UNIXUTIL; - -// One entry per help context -static struct { - UNIXUTIL uu; - int ids; - int hid; -} aCOMMANDS[] = { - { uuVOS, IDS_COMMAND_VOS_ADDSITE, IDH_SVRMGR_COMMAND_VOS_ADDSITE }, - { uuVOS, IDS_COMMAND_VOS_BACKUP, IDH_SVRMGR_COMMAND_VOS_BACKUP }, - { uuVOS, IDS_COMMAND_VOS_BACKUPSYS, IDH_SVRMGR_COMMAND_VOS_BACKUPSYS }, - { uuVOS, IDS_COMMAND_VOS_CREATE, IDH_SVRMGR_COMMAND_VOS_CREATE }, - { uuVOS, IDS_COMMAND_VOS_DELENTRY, IDH_SVRMGR_COMMAND_VOS_DELENTRY }, - { uuVOS, IDS_COMMAND_VOS_DUMP, IDH_SVRMGR_COMMAND_VOS_DUMP }, - { uuVOS, IDS_COMMAND_VOS_EXAMINE, IDH_SVRMGR_COMMAND_VOS_EXAMINE }, - { uuVOS, IDS_COMMAND_VOS_LISTPART, IDH_SVRMGR_COMMAND_VOS_LISTPART }, - { uuVOS, IDS_COMMAND_VOS_LISTVLDB, IDH_SVRMGR_COMMAND_VOS_LISTVLDB }, - { uuVOS, IDS_COMMAND_VOS_LISTVOL, IDH_SVRMGR_COMMAND_VOS_LISTVOL }, - { uuVOS, IDS_COMMAND_VOS_LOCK, IDH_SVRMGR_COMMAND_VOS_LOCK }, - { uuVOS, IDS_COMMAND_VOS_MOVE, IDH_SVRMGR_COMMAND_VOS_MOVE }, - { uuVOS, IDS_COMMAND_VOS_PARTINFO, IDH_SVRMGR_COMMAND_VOS_PARTINFO }, - { uuVOS, IDS_COMMAND_VOS_RELEASE, IDH_SVRMGR_COMMAND_VOS_RELEASE }, - { uuVOS, IDS_COMMAND_VOS_REMOVE, IDH_SVRMGR_COMMAND_VOS_REMOVE }, - { uuVOS, IDS_COMMAND_VOS_REMSITE, IDH_SVRMGR_COMMAND_VOS_REMSITE }, - { uuVOS, IDS_COMMAND_VOS_RENAME, IDH_SVRMGR_COMMAND_VOS_RENAME }, - { uuVOS, IDS_COMMAND_VOS_RESTORE, IDH_SVRMGR_COMMAND_VOS_RESTORE }, - { uuVOS, IDS_COMMAND_VOS_SYNCVLDB, IDH_SVRMGR_COMMAND_VOS_SYNCVLDB }, - { uuVOS, IDS_COMMAND_VOS_UNLOCK, IDH_SVRMGR_COMMAND_VOS_UNLOCK }, - { uuVOS, IDS_COMMAND_VOS_UNLOCKVLDB, IDH_SVRMGR_COMMAND_VOS_UNLOCKVLDB }, - { uuVOS, IDS_COMMAND_VOS_ZAP, IDH_SVRMGR_COMMAND_VOS_ZAP }, - { uuBOS, IDS_COMMAND_BOS_ADDHOST, IDH_SVRMGR_COMMAND_BOS_ADDHOST }, - { uuBOS, IDS_COMMAND_BOS_ADDKEY, IDH_SVRMGR_COMMAND_BOS_ADDKEY }, - { uuBOS, IDS_COMMAND_BOS_ADDUSER, IDH_SVRMGR_COMMAND_BOS_ADDUSER }, - { uuBOS, IDS_COMMAND_BOS_CREATE, IDH_SVRMGR_COMMAND_BOS_CREATE }, - { uuBOS, IDS_COMMAND_BOS_DELETE, IDH_SVRMGR_COMMAND_BOS_DELETE }, - { uuBOS, IDS_COMMAND_BOS_EXEC, IDH_SVRMGR_COMMAND_BOS_EXEC }, - { uuBOS, IDS_COMMAND_BOS_GETDATE, IDH_SVRMGR_COMMAND_BOS_GETDATE }, - { uuBOS, IDS_COMMAND_BOS_GETLOG, IDH_SVRMGR_COMMAND_BOS_GETLOG }, - { uuBOS, IDS_COMMAND_BOS_GETRESTART, IDH_SVRMGR_COMMAND_BOS_GETRESTART }, - { uuBOS, IDS_COMMAND_BOS_INSTALL, IDH_SVRMGR_COMMAND_BOS_INSTALL }, - { uuBOS, IDS_COMMAND_BOS_LISTHOSTS, IDH_SVRMGR_COMMAND_BOS_LISTHOSTS }, - { uuBOS, IDS_COMMAND_BOS_LISTKEYS, IDH_SVRMGR_COMMAND_BOS_LISTKEYS }, - { uuBOS, IDS_COMMAND_BOS_LISTUSERS, IDH_SVRMGR_COMMAND_BOS_LISTUSERS }, - { uuBOS, IDS_COMMAND_BOS_PRUNE, IDH_SVRMGR_COMMAND_BOS_PRUNE }, - { uuBOS, IDS_COMMAND_BOS_REMOVEHOST, IDH_SVRMGR_COMMAND_BOS_REMOVEHOST }, - { uuBOS, IDS_COMMAND_BOS_REMOVEKEY, IDH_SVRMGR_COMMAND_BOS_REMOVEKEY }, - { uuBOS, IDS_COMMAND_BOS_REMOVEUSER, IDH_SVRMGR_COMMAND_BOS_REMOVEUSER }, - { uuBOS, IDS_COMMAND_BOS_RESTART, IDH_SVRMGR_COMMAND_BOS_RESTART }, - { uuBOS, IDS_COMMAND_BOS_SALVAGE, IDH_SVRMGR_COMMAND_BOS_SALVAGE }, - { uuBOS, IDS_COMMAND_BOS_SETAUTH, IDH_SVRMGR_COMMAND_BOS_SETAUTH }, - { uuBOS, IDS_COMMAND_BOS_SETRESTART, IDH_SVRMGR_COMMAND_BOS_SETRESTART }, - { uuBOS, IDS_COMMAND_BOS_SHUTDOWN, IDH_SVRMGR_COMMAND_BOS_SHUTDOWN }, - { uuBOS, IDS_COMMAND_BOS_START, IDH_SVRMGR_COMMAND_BOS_START }, - { uuBOS, IDS_COMMAND_BOS_STARTUP, IDH_SVRMGR_COMMAND_BOS_STARTUP }, - { uuBOS, IDS_COMMAND_BOS_STATUS, IDH_SVRMGR_COMMAND_BOS_STATUS }, - { uuBOS, IDS_COMMAND_BOS_STOP, IDH_SVRMGR_COMMAND_BOS_STOP }, - { uuBOS, IDS_COMMAND_BOS_UNINSTALL, IDH_SVRMGR_COMMAND_BOS_UNINSTALL }, - { uuKAS, IDS_COMMAND_KAS_GETRANDOMKEY, IDH_SVRMGR_COMMAND_KAS_GETRANDOMKEY }, - { uuFS, IDS_COMMAND_FS_LISTQUOTA, IDH_SVRMGR_COMMAND_FS_LISTQUOTA }, - { uuFS, IDS_COMMAND_FS_QUOTA, IDH_SVRMGR_COMMAND_FS_QUOTA }, - { uuFS, IDS_COMMAND_FS_SETQUOTA, IDH_SVRMGR_COMMAND_FS_SETQUOTA }, -}; - -// Precalculated hashing values for faster searching through help topics -static DWORD aSEARCHVALUES[] = { - 0x16765627, 0x02D416E6, 0x27675627, 0x35023556, - 0x36021464, 0xE6371627, 0x02452716, 0x00458656, - 0x16E6B300, 0x27E69676, 0x4602A456, 0x36861627, - 0x97022596, 0x56E60226, 0x27964747, 0x97E20075, - 0xD4F67727, 0x24F62602, 0x02269702, 0x27965637, - 0x96262716, 0x675602C6, 0x27164796, 0xE6963747, - 0x1446D696, 0x97000000, 0x96C69647, 0x37025747, - 0x02478696, 0x0266F627, 0x66163656, 0xE6475627, - 0x56270296, 0x56025737, 0xA3004586, 0x7796E676, - 0xF6C6C6F6, 0x86560266, 0x26970247, 0x77564602, - 0x56679656, 0xE6460227, 0x56460216, 0x379676E6, - 0x37024656, 0x00007716, 0x74271697, 0x16E65602, - 0xE65602A4, 0x560014E6, 0xB4565666, 0xE602F472, - 0x24279616, 0x3716C600, 0x86D65627, 0xE6023536, - 0x24279716, 0x4756B600, 0x02A416E6, 0x9616E656, - 0x56C60044, 0x02642756, 0xB6005446, 0x26573756, - 0x374702F4, 0x5427E656, 0xC696E600, 0x02645627, - 0x96369616, 0x006456C6, 0xD4573796, 0x27567602, - 0x27460074, 0x96368616, 0x47860225, 0x27564696, - 0x2700D456, 0x34F6D656, 0x1656C602, 0xD4963686, - 0x77169700, 0xC4162716, 0x5696C602, 0x16E600E4, - 0x27E69676, 0x4602A456, 0x36861627, 0x27002596, - 0xC6B6E656, 0x02641657, 0x0025F6E6, 0x56765627, - 0xE6024527, 0x3716C697, 0x160025F6, 0xB4F647C6, - 0x67163702, 0x2796E696, 0xE6960035, 0x24969716, - 0x2716D602, 0x006596B6, 0x00000000 -}; - -#define nCOMMANDS (sizeof(aCOMMANDS)/sizeof(aCOMMANDS[0])) -#define nSEARCHVALUES (sizeof(aSEARCHVALUES)/sizeof(aSEARCHVALUES[0])) - - -/* - * ROUTINES _________________________________________________________________ - * - */ - -LPCTSTR lstrstr (LPCTSTR pszBuffer, LPCTSTR pszFind) -{ - if (!pszBuffer || !pszFind || !*pszFind) - return pszBuffer; - - for ( ; *pszBuffer; ++pszBuffer) - { - if (*pszBuffer == *pszFind) - { - if (!lstrncmpi (pszBuffer, pszFind, lstrlen(pszFind))) - return pszBuffer; - } - } - - return NULL; -} - - -/* - * FIND COMMAND _____________________________________________________________ - * - */ - -BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Help_FindCommand_OnInitDialog (HWND hDlg); -BOOL Help_FindCommand_OnOK (HWND hDlg); - - -void Help_FindCommand (void) -{ - ModalDialog (IDD_HELP_FIND, g.hMain, (DLGPROC)Help_FindCommand_DlgProc); -} - - -BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Help_FindCommand_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (Help_FindCommand_OnOK (hDlg)) - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - } - - return FALSE; -} - - -void Help_FindCommand_OnInitDialog (HWND hDlg) -{ - HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND); - CB_StartChange (hCombo, TRUE); - - for (size_t ii = 0; ii < nCOMMANDS; ++ii) - { - CB_AddItem (hCombo, aCOMMANDS[ii].ids, 0); - } - - CB_EndChange (hCombo, -1); -} - - -LPTSTR Help_FindCommand_Search (UNIXUTIL *puu, LPTSTR pszKeyword) -{ - // search for a usable keyword--skip "vos" or "bos" (etc). - // - while (*pszKeyword) - { - // strip any initial whitespace - while (iswhite(*pszKeyword)) - ++pszKeyword; - - // find the end of this word - for (LPTSTR pszNext = pszKeyword; *pszNext && !iswhite(*pszNext); ) - ++pszNext; - if (!*pszNext) // last word? Gotta use it. - break; - *pszNext = TEXT('\0'); - - BOOL fSkip = FALSE; - if (!lstrcmpi (pszKeyword, TEXT("vos"))) - { - fSkip = TRUE; - *puu = uuVOS; - } - if (!lstrcmpi (pszKeyword, TEXT("bos"))) - { - fSkip = TRUE; - *puu = uuBOS; - } - if (!lstrcmpi (pszKeyword, TEXT("kas"))) - { - fSkip = TRUE; - *puu = uuKAS; - } - if (!lstrcmpi (pszKeyword, TEXT("fs"))) - { - fSkip = TRUE; - *puu = uuFS; - } - - if (fSkip) - pszKeyword = 1+pszNext; - else - break; - } - - return pszKeyword; -} - - -DWORD NextSearch (int &ii) -{ - ii = ((ii>>2) == nSEARCHVALUES) ? 1 : ii+1; - return ( (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))>>4)&15) | - (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))<<4)&240) ); -} - - -BOOL Help_FindCommand_OnOK (HWND hDlg) -{ - HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND); - int iiDisplay = -1; - - UNIXUTIL uu = uuUNSPECIFIED; - TCHAR szText[ cchRESOURCE ]; - GetWindowText (hCombo, szText, cchRESOURCE); - - if (!szText[0]) - { - Message (MB_ICONASTERISK | MB_OK, IDS_FIND_NOTHING_TITLE, IDS_FIND_NOTHING_DESC); - return FALSE; - } - - LPTSTR pszKeyword = Help_FindCommand_Search (&uu, szText); - - for (size_t ii = 0; (iiDisplay == -1) && ii < nCOMMANDS; ++ii) - { - TCHAR szCommand[ cchRESOURCE ]; - GetString (szCommand, aCOMMANDS[ ii ].ids); - - if (lstrstr (szCommand, pszKeyword) != NULL) - { - if ((uu == uuUNSPECIFIED) || (uu == aCOMMANDS[ ii ].uu)) - iiDisplay = ii; - } - } - - if (iiDisplay == -1) - { - Message (MB_ICONASTERISK | MB_OK, IDS_FIND_UNKNOWN_TITLE, IDS_FIND_UNKNOWN_DESC, TEXT("%s"), pszKeyword); - return FALSE; - } - - WinHelp (g.hMain, cszHELPFILENAME, HELP_CONTEXT, aCOMMANDS[ iiDisplay ].hid); - return TRUE; -} - - -/* - * FIND ERROR _______________________________________________________________ - * - */ - -BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Help_FindError_OnInitDialog (HWND hDlg); -void Help_FindError_OnTranslate (HWND hDlg); -void Help_FindError_Shrink (HWND hDlg, BOOL fShrink); - -void Help_FindError (void) -{ - ModalDialog (IDD_HELP_ERROR, g.hMain, (DLGPROC)Help_FindError_DlgProc); -} - - -BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Help_FindError_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_ERROR_TRANSLATE: - Help_FindError_OnTranslate (hDlg); - break; - - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - } - - return FALSE; -} - - -void Help_FindError_OnInitDialog (HWND hDlg) -{ - Help_FindError_Shrink (hDlg, TRUE); - - SetDlgItemText (hDlg, IDC_ERROR_NUMBER, TEXT("")); -} - - -void Help_FindError_OnTranslate (HWND hDlg) -{ - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_ERROR_NUMBER, szText, cchRESOURCE); - - LPSTR pszTextA = StringToAnsi (szText); - DWORD dwError = strtoul (pszTextA, NULL, 0); - FreeString (pszTextA, szText); - - TCHAR szDesc[ cchRESOURCE ]; - FormatError (szDesc, TEXT("%s"), dwError); - - // The output string either looks like this (if successful): - // successful completion (0x00000000) - // Or like this: - // 0x00000000 - // Since we list the error code elsewhere, remove it from the - // former case. In the latter case, empty the string entirely - // so we'll know there was no translation. - // - LPTSTR pszTruncate; - if ((pszTruncate = (LPTSTR)lstrrchr (szDesc, TEXT('('))) == NULL) - pszTruncate = szDesc; - else if ((pszTruncate > szDesc) && (*(pszTruncate-1) == TEXT(' '))) - --pszTruncate; - *pszTruncate = TEXT('\0'); - - LPTSTR pszText; - if (szDesc[0] == TEXT('\0')) - pszText = FormatString (IDS_ERROR_NOTTRANSLATED, TEXT("%08lX%lu"), dwError, dwError); - else - pszText = FormatString (IDS_ERROR_TRANSLATED, TEXT("%08lX%lu%s"), dwError, dwError, szDesc); - SetDlgItemText (hDlg, IDC_ERROR_DESC, pszText); - FreeString (pszText); - - Help_FindError_Shrink (hDlg, FALSE); -} - - -void Help_FindError_Shrink (HWND hDlg, BOOL fShrink) -{ - static BOOL fShrunk = FALSE; - static LONG cyShrunk = 0; - - if (fShrink) - { - fShrunk = TRUE; - - // shrink the window--move the IDCANCEL button up so that its - // top edge is where the IDC_ADVANCED_BOX line's top edge is, and - // hide IDC_ADVANCED_BOX and IDC_ERROR_DESC. - // - RECT rAdvanced; - GetRectInParent (GetDlgItem (hDlg, IDC_ADVANCED_BOX), &rAdvanced); - - RECT rClose; - GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose); - - cyShrunk = rClose.top - rAdvanced.top - 9; - - ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_HIDE); - - SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL, - rClose.left, rClose.top -cyShrunk, 0, 0, - SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - RECT rDialog; - GetWindowRect (hDlg, &rDialog); - SetWindowPos (hDlg, NULL, - 0, 0, cxRECT(rDialog), cyRECT(rDialog) -cyShrunk, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - } - else if (fShrunk) - { - fShrunk = FALSE; - - // expand the window--move the IDCANCEL button down, and - // show IDC_ADVANCED_BOX and IDC_ERROR_DESC. - // - RECT rClose; - GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose); - - RECT rDialog; - GetWindowRect (hDlg, &rDialog); - SetWindowPos (hDlg, NULL, - 0, 0, cxRECT(rDialog), cyRECT(rDialog) +cyShrunk, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL, - rClose.left, rClose.top +cyShrunk, 0, 0, - SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_SHOW); - } -} - - -/* - * HELP ABOUT _______________________________________________________________ - * - */ - - -BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Help_About_OnInitDialog (HWND hDlg); -void Help_About_OnSysCommand (HWND hDlg, int &cmd); -LONG procAbout; - -void Help_About (void) -{ - ModalDialog (IDD_HELP_ABOUT, g.hMain, (DLGPROC)Help_About_DlgProc); -} - - -BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static int cmd; - switch (msg) - { - case WM_INITDIALOG: - cmd = 0; - Help_About_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - - case WM_SYSCOMMAND+1: - Help_About_OnSysCommand (hDlg, cmd); - break; - } - - return FALSE; -} - - -BOOL CALLBACK Help_About_Proc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_DESTROY) - { - KillTimer (GetParent(hDlg), 1000); - } - else if (msg == WM_DESTROY+0x200) - { - RECT rr; - GetWindowRect(GetDlgItem(GetParent(hDlg),0x051E),&rr); - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - if (PtInRect (&rr, pt)) - { - SetDlgItemText (GetParent(hDlg), 0x051F, TEXT("\n\n\n\n\n\n\n")); - SetTimer (GetParent(hDlg), 1000, 1000/8, NULL); - } - } - return CallWindowProc ((WNDPROC)procAbout, hDlg, msg, wp, lp); -} - - -void Help_About_OnInitDialog (HWND hDlg) -{ - HWND hAbout = GetDlgItem (hDlg, IDOK); - procAbout = (LONG)GetWindowLong (hAbout, GWL_WNDPROC); - SetWindowLong (hAbout, GWL_WNDPROC, (LONG)Help_About_Proc); - - LPTSTR pszText = FormatString (IDS_HELPABOUT_DESC1); - SetDlgItemText (hDlg, IDC_HELPABOUT_DESC, pszText); - FreeString (pszText); -} - - -void Help_About_OnSysCommand (HWND hDlg, int &cmd) -{ - DWORD dw; - TCHAR szSys[cchRESOURCE]; - TCHAR szSys2[cchRESOURCE]; - GetDlgItemText (hDlg, 0x051F, szSys, cchRESOURCE); - if ((dw = NextSearch (cmd)) != 0) - { - for (LPTSTR psz = &szSys[ lstrlen(szSys)-1 ]; *(psz-1) != TEXT('\n'); --psz); - lstrcpy (szSys2, psz); - wsprintf (psz, TEXT("%c%s"), (TCHAR)dw, szSys2); - SetDlgItemText (hDlg, 0x051F, szSys); - } - else // (dw == 0) - { - for (LPTSTR psz = szSys; *psz && (*psz != TEXT('\n')); ++psz); - wsprintf (szSys2, TEXT("%s\n"), 1+psz); - SetDlgItemText (hDlg, 0x051F, szSys2); - } -} - - - -/* - * CONTEXT HELP _____________________________________________________________ - * - */ - -static DWORD IDD_SVR_LISTS_HELP[] = { - IDC_LIST_LIST, IDH_SVRMGR_LIST_LIST, - IDC_LIST_ADD, IDH_SVRMGR_LIST_ADD, - IDC_LIST_REMOVE, IDH_SVRMGR_LIST_REMOVE, - IDC_LIST_NAME, IDH_SVRMGR_LIST_NAME, - 0, 0 -}; - -static DWORD IDD_AGG_GENERAL_HELP[] = { - IDC_AGG_NAME, IDH_SVRMGR_AGGPROP_NAME, - IDC_AGG_ID, IDH_SVRMGR_AGGPROP_ID, - IDC_AGG_DEVICE, IDH_SVRMGR_AGGPROP_DEVICE, - IDC_AGG_USAGE, IDH_SVRMGR_AGGPROP_USAGE, - IDC_AGG_USAGEBAR, IDH_SVRMGR_AGGPROP_USAGEBAR, - IDC_AGG_WARN, IDH_SVRMGR_AGGPROP_WARN, - IDC_AGG_WARN_AGGFULL_DEF, IDH_SVRMGR_AGGPROP_WARN_AGGFULL_DEF, - IDC_AGG_WARN_AGGFULL, IDH_SVRMGR_AGGPROP_WARN_AGGFULL, - IDC_AGG_WARN_AGGFULL_PERCENT, IDH_SVRMGR_AGGPROP_WARN_AGGFULL_PERCENT, - IDC_AGG_FILESETS, IDH_SVRMGR_AGGPROP_NUMFILESETS, - IDC_AGG_WARNALLOC, IDH_SVRMGR_AGGPROP_WARNALLOC, - 0, 0 -}; - -static DWORD IDD_SVR_GENERAL_HELP[] = { - IDC_SVR_NAME, IDH_SVRMGR_SVRPROP_NAME, - IDC_SVR_ADDRESSES, IDH_SVRMGR_SVRPROP_ADDRESSES, - IDC_SVR_NUMAGGREGATES, IDH_SVRMGR_SVRPROP_NUMAGGREGATES, - IDC_SVR_AUTH_YES, IDH_SVRMGR_SVRPROP_AUTH_YES, - IDC_SVR_AUTH_NO, IDH_SVRMGR_SVRPROP_AUTH_NO, - IDC_SVR_CAPACITY, IDH_SVRMGR_SVRPROP_CAPACITY, - IDC_SVR_ALLOCATION, IDH_SVRMGR_SVRPROP_ALLOCATION, - IDC_SVR_CHANGEADDR, IDH_SVRMGR_SVRPROP_CHANGEADDR, - 0, 0 -}; - -static DWORD IDD_SVR_SCOUT_HELP[] = { - IDC_SVR_WARN_AGGFULL, IDH_SVRMGR_SVRPROP_WARN_AGGFULL, - IDC_SVR_WARN_AGGFULL_PERCENT, IDH_SVRMGR_SVRPROP_WARN_AGGFULL_PERCENT, - IDC_SVR_WARN_SETFULL, IDH_SVRMGR_SVRPROP_WARN_SETFULL, - IDC_SVR_WARN_SETFULL_PERCENT, IDH_SVRMGR_SVRPROP_WARN_SETFULL_PERCENT, - IDC_SVR_WARN_SVCSTOP, IDH_SVRMGR_SVRPROP_WARN_SVCSTOP, - IDC_SVR_WARN_SETNOVLDB, IDH_SVRMGR_SVRPROP_WARN_SETNOVLDB, - IDC_SVR_WARN_AGGNOSERV, IDH_SVRMGR_SVRPROP_WARN_AGGNOSERV, - IDC_SVR_WARN_SETNOSERV, IDH_SVRMGR_SVRPROP_WARN_SETNOSERV, - IDC_SVR_AUTOREFRESH, IDH_SVRMGR_SVRPROP_AUTOREFRESH, - IDC_SVR_AUTOREFRESH_MINUTES, IDH_SVRMGR_SVRPROP_AUTOREFRESH_MINUTES, - IDC_SVR_WARN_AGGALLOC, IDH_SVRMGR_SVRPROP_WARNALLOC, - 0, 0 -}; - -static DWORD IDD_SVC_GENERAL_HELP[] = { - IDC_SVC_NAME, IDH_SVRMGR_SVCPROP_NAME, - IDC_SVC_TYPE, IDH_SVRMGR_SVCPROP_TYPE, - IDC_SVC_PARAMS, IDH_SVRMGR_SVCPROP_PARAMS, - IDC_SVC_STARTDATE, IDH_SVRMGR_SVCPROP_STARTDATE, - IDC_SVC_STOPDATE, IDH_SVRMGR_SVCPROP_STOPDATE, - IDC_SVC_LASTERROR, IDH_SVRMGR_SVCPROP_LASTERROR, - IDC_SVC_STATUS, IDH_SVRMGR_SVCPROP_STATUS, - IDC_SVC_NOTIFIER, IDH_SVRMGR_SVCPROP_NOTIFIER, - IDC_SVC_WARNSTOP, IDH_SVRMGR_SVCPROP_WARNSTOP, - IDC_SVC_VIEWLOG, IDH_SVRMGR_SVCPROP_VIEWLOG, - IDC_SVC_START, IDH_SVRMGR_SVCPROP_START, - IDC_SVC_STOP, IDH_SVRMGR_SVCPROP_STOP, - 0, 0 -}; - -static DWORD IDD_SET_GENERAL_HELP[] = { - IDC_SET_NAME, IDH_SVRMGR_SETPROP_NAME, - IDC_SET_ID, IDH_SVRMGR_SETPROP_ID, - IDC_SET_CREATEDATE, IDH_SVRMGR_SETPROP_CREATEDATE, - IDC_SET_UPDATEDATE, IDH_SVRMGR_SETPROP_UPDATEDATE, - IDC_SET_ACCESSDATE, IDH_SVRMGR_SETPROP_ACCESSDATE, - IDC_SET_BACKUPDATE, IDH_SVRMGR_SETPROP_BACKUPDATE, - IDC_SET_STATUS, IDH_SVRMGR_SETPROP_STATUS, - IDC_SET_LOCK, IDH_SVRMGR_SETPROP_LOCK, - IDC_SET_UNLOCK, IDH_SVRMGR_SETPROP_UNLOCK, - IDC_SET_USAGE, IDH_SVRMGR_SETPROP_USAGE, - IDC_SET_QUOTA, IDH_SVRMGR_SETPROP_QUOTA, - IDC_SET_USAGEBAR, IDH_SVRMGR_SETPROP_USAGEBAR, - IDC_SET_WARN, IDH_SVRMGR_SETPROP_WARN, - IDC_SET_WARN_SETFULL_DEF, IDH_SVRMGR_SETPROP_WARN_SETFULL_DEF, - IDC_SET_WARN_SETFULL, IDH_SVRMGR_SETPROP_WARN_SETFULL, - IDC_SET_WARN_SETFULL_PERCENT, IDH_SVRMGR_SETPROP_WARN_SETFULL_PERCENT, - IDC_SET_FILES, IDH_SVRMGR_SETPROP_FILES, - 0, 0 -}; - -static DWORD IDD_SVC_CREATE_HELP[] = { - IDC_SVC_SERVER, IDH_SVRMGR_SVCCREATE_SERVER, - IDC_SVC_NAME, IDH_SVRMGR_SVCCREATE_NAME, - IDC_SVC_COMMAND, IDH_SVRMGR_SVCCREATE_COMMAND, - IDC_SVC_PARAMS, IDH_SVRMGR_SVCCREATE_PARAMS, - IDC_SVC_NOTIFIER, IDH_SVRMGR_SVCCREATE_NOTIFIER, - IDC_SVC_LOGFILE, IDH_SVRMGR_SVCCREATE_LOGFILE, - IDC_SVC_TYPE_SIMPLE, IDH_SVRMGR_SVCCREATE_SIMPLE, - IDC_SVC_RUNNOW, IDH_SVRMGR_SVCCREATE_SIMPLE_RUNNOW, - IDC_SVC_TYPE_FS, IDH_SVRMGR_SVCCREATE_FS, - IDC_SVC_TYPE_CRON, IDH_SVRMGR_SVCCREATE_CRON, - IDC_SVC_RUNDAY, IDH_SVRMGR_SVCCREATE_CRON_RUNDAY, - IDC_SVC_RUNTIME, IDH_SVRMGR_SVCCREATE_CRON_RUNTIME, - 0, 0 -}; - -static DWORD IDD_SET_RELEASE_HELP[] = { - IDOK, IDH_SVRMGR_SETRELEASE_OK, - IDCANCEL, IDH_SVRMGR_SETRELEASE_CANCEL, - IDC_RELSET_NORMAL, IDH_SVRMGR_SETRELEASE_NORMAL, - IDC_RELSET_FORCE, IDH_SVRMGR_SETRELEASE_FORCE, - 0, 0 -}; - -static DWORD IDD_SET_REPSITES_HELP[] = { - IDC_SET_NAME, IDH_SVRMGR_SETREPSITES_NAME, - IDC_SET_SERVER, IDH_SVRMGR_SETREPSITES_RW_SERVER, - IDC_SET_AGGREGATE, IDH_SVRMGR_SETREPSITES_RW_AGGREGATE, - IDC_SET_REP_LIST, IDH_SVRMGR_SETREPSITES_REPSITES, - IDC_SET_REPSITE_ADD, IDH_SVRMGR_SETREPSITES_REPSITE_ADD, - IDC_SET_REPSITE_DELETE, IDH_SVRMGR_SETREPSITES_REPSITE_DELETE, - IDC_SET_RELEASE, IDH_SVRMGR_SETREPSITES_REPSITE_RELEASE, - 0, 0 -}; - -static DWORD IDD_DCE_NEWCELL_HELP[] = { - IDC_OPENCELL_CELL, IDH_SVRMGR_NEWCELL_CELL, - IDC_OPENCELL_OLDCREDS, IDH_SVRMGR_NEWCELL_CURRENTID, - IDC_OPENCELL_ID, IDH_SVRMGR_NEWCELL_ID, - IDC_OPENCELL_PASSWORD, IDH_SVRMGR_NEWCELL_PASSWORD, - IDC_ADVANCED, IDH_SVRMGR_NEWCELL_ADVANCED, - IDC_MON_ALL, IDH_SVRMGR_NEWCELL_MONALL, - IDC_MON_ONE, IDH_SVRMGR_NEWCELL_MONONE, - IDC_MON_SERVER, IDH_SVRMGR_NEWCELL_MONSERVER, - IDC_MON_SOME, IDH_SVRMGR_NEWCELL_MONSOME, - IDC_MON_SUBSET, IDH_SVRMGR_NEWCELL_MONSUBSET, - 0, 0 -}; - -static DWORD IDD_DCE_NEWCREDS_HELP[] = { - IDC_CREDS_CELL, IDH_SVRMGR_NEWCREDS_CELL, - IDC_CREDS_CURRENTID, IDH_SVRMGR_NEWCREDS_CURRENTID, - IDC_CREDS_EXPDATE, IDH_SVRMGR_NEWCREDS_EXPDATE, - IDC_CREDS_LOGIN, IDH_SVRMGR_NEWCREDS_LOGIN, - IDC_CREDS_ID, IDH_SVRMGR_NEWCREDS_ID, - IDC_CREDS_PASSWORD, IDH_SVRMGR_NEWCREDS_PASSWORD, - (DWORD)IDC_STATIC, 0, - 0, 0 -}; - -static DWORD IDD_COLUMNS_HELP[] = { - IDC_COLUMNS, IDH_SVRMGR_COLUMNS_WHICH, - IDC_COL_AVAIL, IDH_SVRMGR_COLUMNS_AVAIL, - IDC_COL_SHOWN, IDH_SVRMGR_COLUMNS_SHOWN, - IDC_COL_INSERT, IDH_SVRMGR_COLUMNS_INSERT, - IDC_COL_DELETE, IDH_SVRMGR_COLUMNS_DELETE, - IDC_COL_UP, IDH_SVRMGR_COLUMNS_MOVEUP, - IDC_COL_DOWN, IDH_SVRMGR_COLUMNS_MOVEDOWN, - 0, 0 -}; - -static DWORD IDD_SET_CREATE_HELP[] = { - IDC_SET_NAME, IDH_SVRMGR_SETCREATE_NAME, - IDC_SET_QUOTA, IDH_SVRMGR_SETCREATE_QUOTA, - IDC_SET_QUOTA_UNITS, IDH_SVRMGR_SETCREATE_QUOTA_UNITS, - IDC_SET_CLONE, IDH_SVRMGR_SETCREATE_CLONE, - IDC_SET_SERVER, IDH_SVRMGR_SETCREATE_SERVER, - IDC_AGG_LIST, IDH_SVRMGR_SETCREATE_AGGLIST, - 0, 0 -}; - -static DWORD IDD_SET_DELETE_HELP[] = { - IDOK, IDH_SVRMGR_SETDELETE_OK, - IDCANCEL, IDH_SVRMGR_SETDELETE_CANCEL, - IDC_DELSET_SERVER, IDH_SVRMGR_SETDELETE_DELFROM_SERVER, - IDC_DELSET_VLDB, IDH_SVRMGR_SETDELETE_DELFROM_VLDB, - 0, 0 -}; - -static DWORD IDD_SET_DELREP_HELP[] = { - IDOK, IDH_SVRMGR_SETDELREP_OK, - IDCANCEL, IDH_SVRMGR_SETDELREP_CANCEL, - 0, 0 -}; - -static DWORD IDD_SET_DELCLONE_HELP[] = { - IDOK, IDH_SVRMGR_SETDELCLONE_OK, - IDCANCEL, IDH_SVRMGR_SETDELCLONE_CANCEL, - 0, 0 -}; - -static DWORD IDD_SET_CLONE_HELP[] = { - IDOK, IDH_SVRMGR_SETCLONE_OK, - IDCANCEL, IDH_SVRMGR_SETCLONE_CANCEL, - 0, 0 -}; - -static DWORD IDD_PROBLEMS_HELP[] = { - IDC_PROBLEM_TEXT, IDH_SVRMGR_PROBLEMS_TEXT, - IDC_PROBLEM_REMEDY, IDH_SVRMGR_PROBLEMS_REMEDY, - IDC_PROBLEM_SCROLL, IDH_SVRMGR_PROBLEMS_SCROLL, - 0, 0 -}; - -static DWORD IDD_SET_MOVETO_HELP[] = { - IDC_AGG_LIST, IDH_SVRMGR_SETMOVE_AGGLIST, - IDC_MOVESET_SERVER, IDH_SVRMGR_SETMOVE_SERVER, - 0, 0 -}; - -static DWORD IDD_SVC_LOGNAME_HELP[] = { - IDC_VIEWLOG_SERVER, IDH_SVRMGR_LOGNAME_SERVER, - IDC_VIEWLOG_FILENAME, IDH_SVRMGR_LOGNAME_FILENAME, - IDOK, IDH_SVRMGR_LOGNAME_OK, - IDCANCEL, IDH_SVRMGR_LOGNAME_CANCEL, - 0, 0 -}; - -static DWORD IDD_SVC_VIEWLOG_HELP[] = { - IDC_SVC_VIEWLOG_FILENAME, IDH_SVRMGR_VIEWLOG_FILENAME, - IDC_VIEWLOG_TEXT, IDH_SVRMGR_VIEWLOG_TEXT, - IDC_VIEWLOG_SAVEAS, IDH_SVRMGR_VIEWLOG_SAVEAS, - 0, 0 -}; - -static DWORD IDD_SET_SETQUOTA_HELP[] = { - IDC_SET_NAME, IDH_SVRMGR_SETQUOTA_NAME, - IDC_SET_AGGREGATE, IDH_SVRMGR_SETQUOTA_AGGREGATE, - IDC_AGG_PROPERTIES, IDH_SVRMGR_SETQUOTA_AGGPROPERTIES, - IDC_SET_USAGE, IDH_SVRMGR_SETQUOTA_USAGE, - IDC_SET_USAGEBAR, IDH_SVRMGR_SETQUOTA_USAGEBAR, - IDC_SET_QUOTA, IDH_SVRMGR_SETQUOTA_VALUE, - IDC_SET_QUOTA_UNITS, IDH_SVRMGR_SETQUOTA_UNITS, - IDOK, IDH_SVRMGR_SETQUOTA_OK, - IDCANCEL, IDH_SVRMGR_SETQUOTA_CANCEL, - 0, 0 -}; - -static DWORD IDD_SVR_SYNCVLDB_HELP[] = { - IDOK, IDH_SVRMGR_SYNCVLDB_OK, - IDCANCEL, IDH_SVRMGR_SYNCVLDB_CANCEL, - 0, 0 -}; - -static DWORD IDD_SET_CREATEREP_HELP[] = { - IDC_SET_NAME, IDH_SVRMGR_SETCREATEREP_NAME, - IDC_AGG_LIST, IDH_SVRMGR_SETCREATEREP_AGGLIST, - IDC_SET_SERVER, IDH_SVRMGR_SETCREATEREP_SERVER, - 0, 0 -}; - -static DWORD IDD_SVR_INSTALL_HELP[] = { - IDC_FILENAME, IDH_SVRMGR_INSTALL_SOURCE, - IDC_BROWSE, IDH_SVRMGR_INSTALL_BROWSE, - IDC_SERVER, IDH_SVRMGR_INSTALL_SERVER, - IDC_DIRECTORY, IDH_SVRMGR_INSTALL_TARGET, - 0, 0 -}; - -static DWORD IDD_SVR_UNINSTALL_HELP[] = { - IDC_SERVER, IDH_SVRMGR_UNINSTALL_SERVER, - IDC_FILENAME, IDH_SVRMGR_UNINSTALL_FILENAME, - 0, 0 -}; - -static DWORD IDD_SVR_PRUNE_HELP[] = { - IDC_SERVER, IDH_SVRMGR_PRUNE_SERVER, - IDC_OP_DELETE_CORE, IDH_SVRMGR_PRUNE_OP_DELETE_CORE, - IDC_OP_DELETE_BAK, IDH_SVRMGR_PRUNE_OP_DELETE_BAK, - IDC_OP_DELETE_OLD, IDH_SVRMGR_PRUNE_OP_DELETE_OLD, - 0, 0 -}; - -static DWORD IDD_SET_RENAME_HELP[] = { - IDC_RENSET_OLD, IDH_SVRMGR_RENAMESET_OLDNAME, - IDC_RENSET_NEW, IDH_SVRMGR_RENAMESET_NEWNAME, - 0, 0 -}; - -static DWORD IDD_SVC_DELETE_HELP[] = { - IDCANCEL, IDH_SVRMGR_DELETESERVICE_CANCEL, - IDOK, IDH_SVRMGR_DELETESERVICE_OK, - 0, 0 -}; - -static DWORD IDD_SVR_GETDATES_HELP[] = { - IDC_SERVER, IDH_SVRMGR_GETDATES_SERVER, - IDC_FILENAME, IDH_SVRMGR_GETDATES_FILENAME, - 0, 0 -}; - -static DWORD IDD_SVR_GETDATES_RESULTS_HELP[] = { - IDC_SERVER, IDH_SVRMGR_GETDATES_SERVER, - IDC_FILENAME, IDH_SVRMGR_GETDATES_FILENAME, - IDC_DATE_FILE, IDH_SVRMGR_GETDATES_DATE_FILE, - IDC_DATE_BAK, IDH_SVRMGR_GETDATES_DATE_BAK, - IDC_DATE_OLD, IDH_SVRMGR_GETDATES_DATE_OLD, - 0, 0 -}; - -static DWORD IDD_SET_DUMP_HELP[] = { - IDC_DUMP_FILENAME, IDH_SVRMGR_SETDUMP_FILENAME, - IDC_DUMP_FULL, IDH_SVRMGR_SETDUMP_FULL, - IDC_DUMP_LIMIT_TIME, IDH_SVRMGR_SETDUMP_BYTIME, - IDC_DUMP_TIME, IDH_SVRMGR_SETDUMP_BYTIME_TIME, - IDC_DUMP_DATE, IDH_SVRMGR_SETDUMP_BYTIME_DATE, - 0, 0 -}; - -static DWORD IDD_SET_RESTORE_HELP[] = { - IDC_RESTORE_FILENAME, IDH_SVRMGR_SETRESTORE_FILENAME, - IDC_RESTORE_BROWSE, IDH_SVRMGR_SETRESTORE_BROWSE, - IDC_RESTORE_SETNAME, IDH_SVRMGR_SETRESTORE_SETNAME, - IDC_RESTORE_SERVER, IDH_SVRMGR_SETRESTORE_SERVER, - IDC_AGG_LIST, IDH_SVRMGR_SETRESTORE_AGGLIST, - IDC_RESTORE_INCREMENTAL, IDH_SVRMGR_SETRESTORE_INCREMENTAL, - 0, 0 -}; - -static DWORD IDD_SVC_BOS_HELP[] = { - IDC_SVC_NAME, IDH_SVRMGR_SVCPROP_BOS_NAME, - IDC_BOS_GENRES, IDH_SVRMGR_SVCPROP_BOS_GENRES, - IDC_BOS_GENRES_DATE, IDH_SVRMGR_SVCPROP_BOS_GENRES_DATE, - IDC_BOS_GENRES_TIME, IDH_SVRMGR_SVCPROP_BOS_GENRES_TIME, - IDC_BOS_BINRES, IDH_SVRMGR_SVCPROP_BOS_BINRES, - IDC_BOS_BINRES_DATE, IDH_SVRMGR_SVCPROP_BOS_BINRES_DATE, - IDC_BOS_BINRES_TIME, IDH_SVRMGR_SVCPROP_BOS_BINRES_TIME, - 0, 0 -}; - -static DWORD IDD_SET_CLONESYS_HELP[] = { - IDC_CLONE_ALL, IDH_SVRMGR_CLONESYS_ALL, - IDC_CLONE_SOME, IDH_SVRMGR_CLONESYS_SOME, - IDC_CLONE_SVR_LIMIT, IDH_SVRMGR_CLONESYS_BYSERVER, - IDC_CLONE_SVR, IDH_SVRMGR_CLONESYS_BYSERVER_SERVER, - IDC_CLONE_AGG_LIMIT, IDH_SVRMGR_CLONESYS_BYAGG, - IDC_CLONE_AGG, IDH_SVRMGR_CLONESYS_BYAGG_AGGREGATE, - IDC_CLONE_PREFIX_LIMIT, IDH_SVRMGR_CLONESYS_BYPREFIX, - IDC_CLONE_PREFIX, IDH_SVRMGR_CLONESYS_BYPREFIX_PREFIX, - 0, 0 -}; - -static DWORD IDD_SUBSETS_HELP[] = { - IDC_SUBSET_NAME, IDH_SVRMGR_SUBSET_NAME, - IDC_SUBSET_LOAD, IDH_SVRMGR_SUBSET_LOAD, - IDC_SUBSET_SAVE, IDH_SVRMGR_SUBSET_SAVE, - IDC_SUBSET_LIST, IDH_SVRMGR_SUBSET_SERVERLIST, - IDC_SUBSET_ALL, IDH_SVRMGR_SUBSET_MONITORALL, - IDC_SUBSET_NONE, IDH_SVRMGR_SUBSET_MONITORNONE, - 0, 0 -}; - -static DWORD IDD_SUBSET_LOADSAVE_HELP[] = { - IDC_SUBSET_NAME, IDH_SVRMGR_SUBSET_NAME, - IDC_SUBSET_LIST, IDH_SVRMGR_SUBSET_SUBSETLIST, - IDC_SUBSET_DELETE, IDH_SVRMGR_SUBSET_DELETE, - IDC_SUBSET_RENAME, IDH_SVRMGR_SUBSET_RENAME, - 0, 0 -}; - -static DWORD IDD_OPTIONS_GENERAL_HELP[] = { - IDC_OPT_SVR_LONGNAMES, IDH_SVRMGR_OPT_SVR_LONGNAMES, - IDC_OPT_SVR_DBL_PROP, IDH_SVRMGR_OPT_SVR_DBL_PROP, - IDC_OPT_SVR_DBL_DEPENDS, IDH_SVRMGR_OPT_SVR_DBL_DEPENDS, - IDC_OPT_SVR_DBL_OPEN, IDH_SVRMGR_OPT_SVR_DBL_OPEN, - IDC_OPT_SVR_OPENMON, IDH_SVRMGR_OPT_SVR_OPENMON, - IDC_OPT_SVR_CLOSEUNMON, IDH_SVRMGR_OPT_SVR_CLOSEUNMON, - IDC_OPT_WARN_BADCREDS, IDH_SVRMGR_OPT_WARN_BADCREDS, - 0, 0 -}; - -static DWORD IDD_BADCREDS_HELP[] = { - IDC_BADCREDS_SHUTUP, IDH_SVRMGR_BADCREDS_SHUTUP, - IDOK, IDH_SVRMGR_BADCREDS_YES, - IDCANCEL, IDH_SVRMGR_BADCREDS_NO, - 0, 0 -}; - -static DWORD IDD_SVR_KEYS_HELP[] = { - IDC_KEY_LIST, IDH_SVRMGR_KEY_LIST, - IDC_KEY_ADD, IDH_SVRMGR_KEY_ADD, - IDC_KEY_REMOVE, IDH_SVRMGR_KEY_REMOVE, - IDC_KEY_NAME, IDH_SVRMGR_KEY_NAME, - 0, 0 -}; - -static DWORD IDD_SVC_START_HELP[] = { - IDC_STARTSTOP_TEMPORARY, IDH_SVRMGR_STARTSERVICE_TEMPORARY, - IDC_STARTSTOP_PERMANENT, IDH_SVRMGR_STARTSERVICE_PERMANENT, - 0, 0 -}; - -static DWORD IDD_SVC_STOP_HELP[] = { - IDC_STARTSTOP_TEMPORARY, IDH_SVRMGR_STOPSERVICE_TEMPORARY, - IDC_STARTSTOP_PERMANENT, IDH_SVRMGR_STOPSERVICE_PERMANENT, - 0, 0 -}; - -static DWORD IDD_SVR_EXECUTE_HELP[] = { - IDC_SERVER, IDH_SVRMGR_EXECUTECOMMAND_SERVER, - IDC_COMMAND, IDH_SVRMGR_EXECUTECOMMAND_COMMAND, - 0, 0 -}; - -static DWORD IDD_SVR_SALVAGE_HELP[] = { - IDC_SERVER, IDH_SVRMGR_SALVAGE_SERVER, - IDC_AGGREGATE, IDH_SVRMGR_SALVAGE_AGGREGATE, - IDC_AGGREGATE_ALL, IDH_SVRMGR_SALVAGE_AGGREGATE_ALL, - IDC_FILESET, IDH_SVRMGR_SALVAGE_FILESET, - IDC_FILESET_ALL, IDH_SVRMGR_SALVAGE_FILESET_ALL, - IDC_ADVANCED, IDH_SVRMGR_SALVAGE_ADVANCED, - IDC_SALVAGE_TEMPDIR, IDH_SVRMGR_SALVAGE_TEMPDIR, - IDC_SALVAGE_SIMUL, IDH_SVRMGR_SALVAGE_SIMUL, - IDC_SALVAGE_NUM, IDH_SVRMGR_SALVAGE_NUM, - IDC_SALVAGE_READONLY, IDH_SVRMGR_SALVAGE_READONLY, - IDC_SALVAGE_BLOCK, IDH_SVRMGR_SALVAGE_BLOCK, - IDC_SALVAGE_FORCE, IDH_SVRMGR_SALVAGE_FORCE, - IDC_SALVAGE_FIXDIRS, IDH_SVRMGR_SALVAGE_FIXDIRS, - IDC_SALVAGE_LOG_FILE, IDH_SVRMGR_SALVAGE_LOG_FILE, - IDC_SALVAGE_LOG_INODES, IDH_SVRMGR_SALVAGE_LOG_INODES, - IDC_SALVAGE_LOG_ROOT, IDH_SVRMGR_SALVAGE_LOG_ROOT, - 0, 0 -}; - -static DWORD IDD_SVR_SALVAGE_RESULTS_HELP[] = { - IDC_SALVAGE_DETAILS, IDH_SVRMGR_SALVAGE_DETAILS, - 0, 0 -}; - -static DWORD IDD_SVR_HOSTS_HELP[] = { - IDC_HOST_LIST, IDH_SVRMGR_HOST_LIST, - IDC_HOST_ADD, IDH_SVRMGR_HOST_ADD, - IDC_HOST_REMOVE, IDH_SVRMGR_HOST_REMOVE, - IDC_HOST_TITLE, IDH_SVRMGR_HOST_TITLE, - 0, 0 -}; - -static DWORD IDD_SVR_ADDHOST_HELP[] = { - IDC_ADDHOST_HOST, IDH_SVRMGR_ADDHOST_HOST, - IDOK, IDH_SVRMGR_ADDHOST_OK, - 0, 0 -}; - -static DWORD IDD_SVR_ADDRESS_HELP[] = { - IDC_SVR_ADDRESSES, IDH_SVRMGR_ADDRESS_LIST, - IDC_ADDR_CHANGE, IDH_SVRMGR_ADDRESS_CHANGE, - IDC_ADDR_REMOVE, IDH_SVRMGR_ADDRESS_REMOVE, - 0, 0 -}; - -static DWORD IDD_SVR_NEWADDR_HELP[] = { - IDC_ADDRESS, IDH_SVRMGR_CHANGEADDR_ADDRESS, - 0, 0 -}; - - -void Main_ConfigureHelp (void) -{ - AfsAppLib_RegisterHelpFile (cszHELPFILENAME); - - AfsAppLib_RegisterHelp (IDD_SVR_LISTS, IDD_SVR_LISTS_HELP, IDH_SVRMGR_ADMINLIST_EDIT_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_AGG_GENERAL, IDD_AGG_GENERAL_HELP, IDH_SVRMGR_PROP_AGGREGATE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_GENERAL, IDD_SVR_GENERAL_HELP, IDH_SVRMGR_PROP_SERVER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_SCOUT, IDD_SVR_SCOUT_HELP, IDH_SVRMGR_PROP_SERVER_WARNINGS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_GENERAL, IDD_SVC_GENERAL_HELP, IDH_SVRMGR_PROP_SERVICE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_GENERAL, IDD_SET_GENERAL_HELP, IDH_SVRMGR_PROP_FILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_CREATE, IDD_SVC_CREATE_HELP, IDH_SVRMGR_CREATESERVICE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_RELEASE, IDD_SET_RELEASE_HELP, IDH_SVRMGR_RELEASEFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_REPSITES, IDD_SET_REPSITES_HELP, IDH_SVRMGR_PROP_REPSITES_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_OPENCELL, IDD_DCE_NEWCELL_HELP, IDH_SVRMGR_NEWCELL_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_APPLIB_CREDENTIALS, IDD_DCE_NEWCREDS_HELP, IDH_SVRMGR_NEWCREDS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_COLUMNS, IDD_COLUMNS_HELP, IDH_SVRMGR_COLUMNS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_CREATE, IDD_SET_CREATE_HELP, IDH_SVRMGR_CREATEFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_DELETE, IDD_SET_DELETE_HELP, IDH_SVRMGR_DELETEFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_DELREP, IDD_SET_DELREP_HELP, IDH_SVRMGR_DELETEREPLICA_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_DELCLONE, IDD_SET_DELCLONE_HELP, IDH_SVRMGR_DELETECLONE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_CLONE, IDD_SET_CLONE_HELP, IDH_SVRMGR_CLONE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_PROBLEMS, IDD_PROBLEMS_HELP, IDH_SVRMGR_PROBLEMS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_MOVETO, IDD_SET_MOVETO_HELP, IDH_SVRMGR_PROP_MOVEFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_LOGNAME, IDD_SVC_LOGNAME_HELP, 0); - AfsAppLib_RegisterHelp (IDD_SVC_VIEWLOG, IDD_SVC_VIEWLOG_HELP, 0); - AfsAppLib_RegisterHelp (IDD_SET_SETQUOTA, IDD_SET_SETQUOTA_HELP, IDH_SVRMGR_SETFILESETQUOTA_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_SYNCVLDB, IDD_SVR_SYNCVLDB_HELP, IDH_SVRMGR_SYNCVLDB_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_CREATEREP, IDD_SET_CREATEREP_HELP, IDH_SVRMGR_CREATEREPLICA_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_INSTALL, IDD_SVR_INSTALL_HELP, IDH_SVRMGR_INSTALLFILE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_UNINSTALL, IDD_SVR_UNINSTALL_HELP, IDH_SVRMGR_UNINSTALLFILE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_PRUNE, IDD_SVR_PRUNE_HELP, IDH_SVRMGR_PRUNEFILES_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_RENAME, IDD_SET_RENAME_HELP, IDH_SVRMGR_RENAMEFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_DELETE, IDD_SVC_DELETE_HELP, IDH_SVRMGR_DELETESERVICE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_GETDATES, IDD_SVR_GETDATES_HELP, IDH_SVRMGR_GETDATES_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_GETDATES_RESULTS, IDD_SVR_GETDATES_RESULTS_HELP, IDH_SVRMGR_GETDATES_RESULTS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_DUMP, IDD_SET_DUMP_HELP, IDH_SVRMGR_DUMPFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_RESTORE, IDD_SET_RESTORE_HELP, IDH_SVRMGR_RESTOREFILESET_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_BOS, IDD_SVC_BOS_HELP, IDH_SVRMGR_PROP_SERVICE_BOS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SET_CLONESYS, IDD_SET_CLONESYS_HELP, IDH_SVRMGR_CLONESYS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SUBSETS, IDD_SUBSETS_HELP, IDH_SVRMGR_SUBSETS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SUBSET_LOADSAVE, IDD_SUBSET_LOADSAVE_HELP, 0); - AfsAppLib_RegisterHelp (IDD_OPTIONS_GENERAL, IDD_OPTIONS_GENERAL_HELP, IDH_SVRMGR_OPTIONS_GENERAL_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_APPLIB_BADCREDS, IDD_BADCREDS_HELP, IDH_SVRMGR_BADCREDS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_KEYS, IDD_SVR_KEYS_HELP, IDH_SVRMGR_SERVERKEY_EDIT_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_START, IDD_SVC_START_HELP, IDH_SVRMGR_STARTSERVICE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVC_STOP, IDD_SVC_STOP_HELP, IDH_SVRMGR_STOPSERVICE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_EXECUTE, IDD_SVR_EXECUTE_HELP, IDH_SVRMGR_EXECUTECOMMAND_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_SALVAGE, IDD_SVR_SALVAGE_HELP, IDH_SVRMGR_SALVAGE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_SALVAGE_RESULTS, IDD_SVR_SALVAGE_RESULTS_HELP, IDH_SVRMGR_SALVAGE_RESULTS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_HOSTS, IDD_SVR_HOSTS_HELP, IDH_SVRMGR_HOSTS_EDIT_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_ADDHOST, IDD_SVR_ADDHOST_HELP, IDH_SVRMGR_HOSTS_ADD_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_ADDRESS, IDD_SVR_ADDRESS_HELP, IDH_SVRMGR_SERVERADDRESSES_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SVR_NEWADDR, IDD_SVR_NEWADDR_HELP, IDH_SVRMGR_CHANGEADDRESS_OVERVIEW); -} - diff --git a/src/WINNT/afssvrmgr/helpfunc.h b/src/WINNT/afssvrmgr/helpfunc.h deleted file mode 100644 index 1a87cd2fa..000000000 --- a/src/WINNT/afssvrmgr/helpfunc.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef HELPFUNC_H -#define HELPFUNC_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Help_FindCommand (void); -void Help_FindError (void); -void Help_About (void); - -void Main_ConfigureHelp (void); - - -#endif - diff --git a/src/WINNT/afssvrmgr/lang/NTMakefile b/src/WINNT/afssvrmgr/lang/NTMakefile deleted file mode 100644 index 1d0f2d846..000000000 --- a/src/WINNT/afssvrmgr/lang/NTMakefile +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\afssvrmgr\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsServerManager_$(LANGID).dll - -RCFILE = $(LANGNAME)\svrmgr.rc - -RESFILE = $(OUT)\svrmgr_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist $(OUT)\*.res del $(OUT)\*.res - @if exist AFS_component_version_number.h del AFS_component_version_number.h - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/afssvrmgr/lang/de_DE/svrmgr.rc b/src/WINNT/afssvrmgr/lang/de_DE/svrmgr.rc deleted file mode 100644 index f09fb9be9..000000000 --- a/src/WINNT/afssvrmgr/lang/de_DE/svrmgr.rc +++ /dev/null @@ -1,3033 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Manager" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - RIGHTMARGIN, 165 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 154 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 253 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 163 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 257 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 291 - TOPMARGIN, 7 - BOTTOMMARGIN, 140 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 300 - TOPMARGIN, 7 - BOTTOMMARGIN, 158 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 276 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 141 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 267 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 297 - TOPMARGIN, 7 - BOTTOMMARGIN, 99 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Zelle" - BEGIN - MENUITEM "Aus&wählen...", M_CELL_OPEN - MENUITEM "&Authentifizierung...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "E&xit", M_EXIT - END - POPUP "&Anzeige" - BEGIN - POPUP "&Server" - BEGIN - MENUITEM "&Große Symbole", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "&Kleine Symbole", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "&Details", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "&Alle Symbole", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "Nur &Status", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "Schnellansicht-&Teilfenster" - BEGIN - MENUITEM "&Keine", M_DIVIDE_NONE, CHECKED - MENUITEM "&Vertikal teilen", M_DIVIDE_H, CHECKED - MENUITEM "&Horizontal teilen", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Laufende O&perationen", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Über&wachte Server...", M_SUBSET - MENUITEM "Spa<en...", M_COLUMNS - MENUITEM "&Optionen...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Alles &aktualisieren", M_REFRESHALL - END - POPUP "&Hilfe" - BEGIN - MENUITEM "&Inhalt", M_HELP - MENUITEM "Befehl &suchen...", M_HELP_FIND - MENUITEM "&Fehlercode suchen...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "&Info zu AFS Server Manager...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "Volume &erstellen...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "Volumes &sichern...", M_SET_CLONE - MENUITEM "Alle Vol&umes freigeben", M_SET_UNLOCK - MENUITEM "VLDB s&ynchronisieren...", M_SYNCVLDB - MENUITEM "Volumes &wiederherstellen...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM "&Merkmale", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "&Starten", M_SVC_START - MENUITEM "Sto&ppen", M_SVC_STOP - MENUITEM "E&rneut starten", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "Protokolldatei &anzeigen", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "&Löschen", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM "&Merkmale", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWOICONS, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Volume &erstellen...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "Alles &aktualisieren", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWOICONS, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Servi&ce erstellen...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "Alles &aktualisieren", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "Re&plikation...", M_SET_REPLICATION - MENUITEM "&Jetzt freigeben", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "&Sicherung...", M_SET_CLONE - MENUITEM "Speicherauszug in &Datei...", M_SET_DUMP - MENUITEM "Aus Datei &wiederherstellen...", M_SET_RESTORE - MENUITEM "&Quote festlegen...", M_SET_SETQUOTA - MENUITEM "Wieder&herstellung...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Verschieben nach...", M_SET_MOVETO - MENUITEM "Umbe&nennen...", M_SET_RENAME - MENUITEM "&Löschen", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Spe&rren", M_SET_LOCK - MENUITEM "Sperre a&ufheben", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM "&Merkmale", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "Server-Fenster ö&ffnen", M_SVR_OPEN - MENUITEM "Server-Fenster s&chließen", M_SVR_CLOSE - MENUITEM "Diesen Server über&wachen", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Server-Sicherheit editieren...", M_SVR_SECURITY - MENUITEM "Datenbank-&Hosts verwalten...", M_SVR_HOSTS - MENUITEM "Volumes &sichern...", M_SET_CLONE - MENUITEM "Alle Vol&umes freigeben", M_SET_UNLOCK - MENUITEM "VLDB s&ynchronisieren...", M_SYNCVLDB - MENUITEM "Volumes &wiederherstellen...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "Datei &installieren...", M_SVR_INSTALL - MENUITEM "Datei &deinstallieren...", M_SVR_UNINSTALL - MENUITEM "Al&te Dateien löschen...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "Da&teidatumsangaben abrufen...", M_SVR_GETDATES - MENUITEM "Protokolldatei &anzeigen...", M_VIEWLOG - MENUITEM "Befehl a&usführen...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM "&Merkmale", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "&Große Symbole", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "&Kleine Symbole", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "&Alle Symbole", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "Nur &Status", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Über&wachte Server...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "Alle Vol&umes freigeben", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "Alle s&chließen", M_SVR_CLOSEALL - MENUITEM "Alles &aktualisieren", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "Nach &Volume", M_SET_VIEW_REPORT, CHECKED - MENUITEM "Nach &Partition", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "Keine &Details", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWOICONS, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Volume &erstellen...", M_SET_CREATE - MENUITEM "Aus Datei &wiederherstellen...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "Volumes &sichern...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "Alle frei&geben", M_SET_UNLOCK - MENUITEM "Alles &aktualisieren", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Spalten...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "E&rneut starten", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "Protokolldatei &anzeigen", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM "&Merkmale", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "Hierher &verschieben...", M_SET_MOVEHERE - MENUITEM "Hie&r nachbilden...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "&Abbrechen", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Services:",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Erstellen...",IDC_SVC_CREATE,44,80,39,12 - PUSHBUTTON "&Löschen",IDC_SVC_DELETE,86,80,39,12 - PUSHBUTTON "E&rneut starten",IDC_SVC_RESTART,128,80,49,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Partitionen:",IDC_AGG_DESC,0,5,165,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,17,165, - 53,WS_EX_STATICEDGE - PUSHBUTTON "Volume &erstellen...",IDC_AGG_CREATESET,102,72,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 194, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Volumes:",IDC_SET_DESC,0,5,194,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,194, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Erstellen...",IDC_SET_CREATE,1,80,39,12 - PUSHBUTTON "&Löschen",IDC_SET_DELETE,41,80,39,12 - PUSHBUTTON "&Nachbildung...",IDC_SET_REP,82,80,51,12 - PUSHBUTTON "&Quote festlegen...",IDC_SET_SETQUOTA,135,80,57,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Administrator hinzufügen",IDC_LIST_ADD,51,160,87,14 - PUSHBUTTON "Administ&rator entfernen",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "Administratoren für Server %1:",IDC_LIST_NAME,5,7,216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "ID:",IDC_STATIC,5,30,31,8 - LTEXT "(Abfragen)",IDC_AGG_ID,38,30,214,8 - LTEXT "Gerät:",IDC_STATIC,5,46,31,8 - LTEXT "(Abfragen)",IDC_AGG_DEVICE,38,46,214,8 - LTEXT "Volumes:",IDC_STATIC,5,62,31,8 - LTEXT "(Abfragen)",IDC_AGG_FILESETS,38,62,214,8 - CONTROL "&Warnung anzeigen, wenn kombinierte Volume-Quote Kapazität überschreitet", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,38,75,224,15 - LTEXT "Syntax:",IDC_STATIC,5,93,31,8 - LTEXT "(Abfragen)",IDC_AGG_USAGE,38,93,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,105,224,8, - WS_EX_STATICEDGE - CONTROL "&Warnung anzeigen, wenn die Belegung der Partition den", - IDC_AGG_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38, - 116,222,10 - CONTROL "Stan&dardschwellenwert für diesen Server überschreitet", - IDC_AGG_WARN_AGGFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,49,131,203,9 - CONTROL "den Schwellenwer&t von",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,88,8 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,140,142,29,12, - ES_AUTOHSCROLL - LTEXT "% der Größe überschreitet",IDC_AGG_WARN_AGGFULL_DESC, - 171,145,88,8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,20,20 - LTEXT "Partition %2 (Server %1)",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "IP-Adresse:",IDC_STATIC,5,29,43,8 - LISTBOX IDC_SVR_ADDRESSES,53,29,70,12,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "&Adressen ändern...",IDC_SVR_CHANGEADDR,144,27,77,12 - PUSHBUTTON "Authentifizie&rung anfordern",IDC_SVR_AUTH_YES,16,87,93, - 14 - PUSHBUTTON "Nicht a&uthentifizierte erlauben",IDC_SVR_AUTH_NO,113, - 87,99,14 - LTEXT "Anzahl der Partitionen:",IDC_STATIC,11,131,90,8 - LTEXT "(Abfragen)",IDC_SVR_NUMAGGREGATES,108,131,99,8 - LTEXT "Gesamtkapazität:",IDC_STATIC,11,148,60,8 - LTEXT "(Abfragen)",IDC_SVR_CAPACITY,108,148,99,8 - LTEXT "Kombinierte Volume-Quote:",IDC_STATIC,11,165,89,8 - LTEXT "(Abfragen)",IDC_SVR_ALLOCATION,108,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(Server-Name)",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "Sicherheit",IDC_STATIC,5,52,216,57 - GROUPBOX "Speicher",IDC_STATIC,5,115,216,68 - LTEXT "Sie können festlegen, daß nur authentifizierte Zugriffe auf diesen Server möglich sind.", - IDC_STATIC,11,66,198,16 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 221, 158 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "eine Partition dieses Servers zu",IDC_SVR_WARN_AGGFULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,18,116,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,127,16,24,12,ES_AUTOHSCROLL - LTEXT "% belegt ist",IDC_STATIC,168,18,45,8 - CONTROL "ein Volume dieses Servers zu",IDC_SVR_WARN_SETFULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,32,109,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,121,30,24,12,ES_AUTOHSCROLL - LTEXT "% belegt ist",IDC_STATIC,165,32,39,8 - CONTROL "die kombinierte Quote einer Partition die Kapazität überschreitet", - IDC_SVR_WARN_AGGALLOC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,46,212,9 - CONTROL "ein Service dieses Servers gestoppt wird", - IDC_SVR_WARN_SVCSTOP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,60,195,9 - CONTROL "ein Volume dieses Servers keinen VLDB-Eintrag besitzt", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,74,195,9 - CONTROL "VLDB auf eine Offline-Partition dieses Servers verweist", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,88,195,9 - CONTROL "VLDB auf ein Offline-Volume dieses Servers verweist", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,103,195,9 - CONTROL "Server-Informationen aktualisieren: alle", - IDC_SVR_AUTOREFRESH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,142,137,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,145,140,27,13,ES_AUTOHSCROLL - LTEXT "Minuten",IDC_STATIC,189,142,25,8 - LTEXT "Warnung anzeigen, falls",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Service-Protokoll &anzeigen",IDC_SVC_VIEWLOG,24,182,91, - 14 - PUSHBUTTON "Jetzt &starten",IDC_SVC_START,118,182,45,14 - PUSHBUTTON "Jetzt sto&ppen",IDC_SVC_STOP,166,182,49,14 - CONTROL "&Warnung anzeigen, falls dieser Service stoppt", - IDC_SVC_WARNSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Service %2 (Server %1)",IDC_SVC_NAME,52,13,168,8 - LTEXT "Typ:",IDC_STATIC,5,29,44,8 - LTEXT "(Abfragen)",IDC_SVC_TYPE,76,29,141,8 - LTEXT "Parameter:",IDC_STATIC,5,45,44,8 - EDITTEXT IDC_SVC_PARAMS,76,45,141,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Benachrichtigung:",IDC_STATIC,5,61,58,8 - LTEXT "(Abfragen)",IDC_SVC_NOTIFIER,76,61,141,8 - LTEXT "Zuletzt gestartet:",IDC_STATIC,5,77,57,8 - LTEXT "(Abfragen)",IDC_SVC_STARTDATE,76,77,141,8 - LTEXT "Zuletzt gestoppt:",IDC_STATIC,5,93,54,8 - LTEXT "(Abfragen)",IDC_SVC_STOPDATE,76,93,141,8 - LTEXT "Letzter Fehler:",IDC_STATIC,5,109,46,8 - EDITTEXT IDC_SVC_LASTERROR,76,109,141,13,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "Service-Status",IDC_STATIC,5,127,215,75 - LTEXT "Der aktuelle Status dieses Services wird ermittelt...", - IDC_SVC_STATUS,11,142,200,8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Volume-ID:",IDC_STATIC,5,30,39,8 - LTEXT "(Unbekannt)",IDC_SET_ID,49,30,219,8 - LTEXT "Erstellt:",IDC_STATIC,5,46,39,8 - LTEXT "(Abfragen)",IDC_SET_CREATEDATE,49,46,219,8 - LTEXT "Aktualisiert:",IDC_STATIC,5,62,39,8 - LTEXT "(Abfragen)",IDC_SET_UPDATEDATE,49,62,112,8 - LTEXT "Zugriff:",IDC_STATIC,5,78,39,8 - LTEXT "(Abfragen)",IDC_SET_ACCESSDATE,49,78,219,8 - LTEXT "Gesichert:",IDC_STATIC,5,94,39,8 - LTEXT "(Abfragen)",IDC_SET_BACKUPDATE,49,94,219,8 - LTEXT "Dateianzahl:",IDC_STATIC,5,110,40,8 - LTEXT "(Abfragen)",IDC_SET_FILES,49,110,219,8 - LTEXT "Status:",IDC_STATIC,5,126,39,8 - LTEXT "(Abfragen)",IDC_SET_STATUS,49,126,101,8 - PUSHBUTTON "&Sperren",IDC_SET_LOCK,156,124,49,13 - PUSHBUTTON "Sperre a&ufheben",IDC_SET_UNLOCK,207,124,61,13 - LTEXT "Syntax:",IDC_STATIC,5,142,31,8 - LTEXT "(Abfragen)",IDC_SET_USAGE,49,142,136,8 - PUSHBUTTON "&Quote festlegen...",IDC_SET_QUOTA,207,140,61,13 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,219,8, - WS_EX_STATICEDGE - CONTROL "&Warnung anzeigen, falls die Belegung dieses Volumes", - IDC_SET_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,28, - 170,240,10 - CONTROL "den Stan&dardschwellenwert für diesen Server (%1%% seiner Größe) überschreitet", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,34,181,227,16 - CONTROL "den Schwellenwer&t von",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,34,199,88,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,129,197,29,12, - ES_AUTOHSCROLL - LTEXT "% der Größe überschreitet",IDC_SET_WARN_SETFULL_DESC, - 163,199,105,8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "Volume %3 (Server %1, Partition %2)",IDC_SET_NAME,49,14, - 219,8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS Server Manager" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Ausgewählte Zelle:",IDC_STATIC,2,8,61,8 - LTEXT "(Der Zellenname wird hier plaziert)",IDC_CELL,69,8,202, - 9 - LTEXT "AFS-Token:",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1 (Token laufen %3 ab)",IDC_AFS_ID,69,19,208,9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Server" -CLASS "ServerWindowClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,65,33,111,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ser&vice:",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,65,50,111,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Befehl:",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,65,68,152,13,ES_AUTOHSCROLL - LTEXT "&Parameter:",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,66,86,151,13,ES_AUTOHSCROLL - LTEXT "Be&nachrichtigung:",IDC_STATIC,5,105,57,8 - EDITTEXT IDC_SVC_NOTIFIER,65,103,152,13,ES_AUTOHSCROLL - LTEXT "Pro&tokolldatei:",IDC_STATIC,5,122,44,8 - EDITTEXT IDC_SVC_LOGFILE,65,120,152,13,ES_AUTOHSCROLL - CONTROL "E&infach (fortlaufende Ausführung)",IDC_SVC_TYPE_SIMPLE, - "Button",BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "Diesen Se&rvice jetzt starten",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "&FS (Dateisystem)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "&Cron (Ausführung in bestimmten Intervallen)", - IDC_SVC_TYPE_CRON,"Button",BS_AUTORADIOBUTTON,11,195,201, - 10 - LTEXT "&Ausführung bei:",IDC_STATIC,23,209,41,8 - COMBOBOX IDC_SVC_RUNDAY,70,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "um",IDC_STATIC,143,209,11,8 - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,159,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Neuer Service",IDC_SVC_DESC,52,13,168,8 - GROUPBOX "Service-Typ",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "Jetzt f&reigeben",IDC_SET_RELEASE,11,143,56,14 - PUSHBUTTON "&Erstellen...",IDC_SET_REPSITE_ADD,129,143,38,14 - PUSHBUTTON "&Löschen",IDC_SET_REPSITE_DELETE,172,143,38,14 - LTEXT "Server:",-1,11,31,37,8 - LTEXT "(Server-Name)",IDC_SET_SERVER,55,31,147,8 - LTEXT "Partition:",-1,11,44,37,8 - LTEXT "(Partitionsname)",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "Volume:",-1,11,18,37,8 - LTEXT "(Volume-Name)",IDC_SET_NAME,55,18,147,8 - GROUPBOX "Volume lesen/schreiben",-1,5,5,211,56 - GROUPBOX "Volume-Replikate",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 257 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Zelle auswählen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Zelle:",IDC_STATIC,4,24,17,8 - COMBOBOX IDC_OPENCELL_CELL,24,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "AFS-Authentifizierung",IDC_STATIC,4,44,211,92 - LTEXT "AFS-&Identität:",IDC_STATIC,22,103,55,8 - EDITTEXT IDC_OPENCELL_ID,80,101,129,14,ES_AUTOHSCROLL - LTEXT "AFS-&Kennwort:",IDC_STATIC,22,119,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,117,129,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "&Weitere >>",IDC_ADVANCED,4,140,53,14 - DEFPUSHBUTTON "OK",IDOK,86,140,41,14 - PUSHBUTTON "Abbrechen",IDCANCEL,130,140,41,14 - PUSHBUTTON "&Hilfe",9,174,140,41,14 - CONTROL "A&lle Server dieser Zelle überwachen",IDC_MON_ALL, - "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,10,203,185,9 - CONTROL "&Nur einen Server überwachen:",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,216,110,10 - EDITTEXT IDC_MON_SERVER,125,215,83,13,ES_AUTOHSCROLL - CONTROL "Nur &Server in Untergruppe überwachen:",IDC_MON_SOME, - "Button",BS_AUTORADIOBUTTON | BS_MULTILINE | WS_TABSTOP, - 10,232,107,14 - COMBOBOX IDC_MON_SUBSET,125,231,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Wählen Sie die AFS-Zelle, mit der Sie arbeiten möchten.", - IDC_STATIC,4,7,200,8 - GROUPBOX "Server überwachen",IDC_ADVANCED_GROUP,4,164,211,89 - LTEXT "Sie können die Überwachung auf eine Untergruppe der in dieser Zelle verfügbaren Server begrenzen, um die Geschwindigkeit zu erhöhen.", - IDC_STATIC,10,176,201,24 - LTEXT "(Abfrage läuft...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Sie müssen Ihr AFS-Kennwort erneut eingeben, um eine Zelle zu verwalten:", - IDC_STATIC,10,82,196,16 - LTEXT "Ihre aktuellen AFS-Token in der ausgewählten Zelle:", - IDC_STATIC,10,57,196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Warnung - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Weiter warten, bis der Task normal beendet wird", - IDC_TIMEOUT_WAIT,"Button",BS_AUTORADIOBUTTON,24,91,208, - 10 - CONTROL "&Task beenden",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,24,105,208,10 - DEFPUSHBUTTON "OK",IDOK,93,139,50,14 - LTEXT "Zeit, die der Task aktiv war:",IDC_STATIC,4,123,142,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,151,123,29,8 - LTEXT "Der AFS Server Manager hat unerwartet lange auf die Beendigung eines Netzwerk-Tasks gewartet.", - IDC_STATIC,4,7,228,18 - LTEXT "Der Task kann weiter ausgeführt werden (empfohlen), oder Sie können dem AFS Server Manager erlauben, den Task zu beenden, wenn Sie sicher sind, daß dieser niemals abgeschlossen wird.", - IDC_STATIC,4,30,228,26 - LTEXT "Beachten Sie, daß der Task weiterhin aktiv ist, auch wenn dieses Fenster angezeigt wird; wenn der Task abgeschlossen ist, schließt sich dieses Fenster automatisch.", - IDC_STATIC,4,61,228,24 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Spalten" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Anzuzeigende Spalten für Auflistung au&swählen:", - IDC_STATIC,5,7,154,10 - COMBOBOX IDC_COLUMNS,164,5,118,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Verfügbare Spalten:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Anzuzeigende Spalten:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Hinzufügen >>",IDC_COL_INSERT,117,68,50,14 - PUSHBUTTON "<< Entfe&rnen",IDC_COL_DELETE,117,88,50,14 - PUSHBUTTON "Nach &oben",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "Nach &unten",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "Spalten auflisten",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Aktualisieren - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "0%% abgeschlossen",IDC_REFRESH_PERCENT,4,49,202,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,201,8 - LTEXT "Bitte warten...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "Über&springen",IDC_REFRESH_SKIP,209,54,51,15,NOT - WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume erstellen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Name:",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,46,28,116,14,ES_AUTOHSCROLL - LTEXT "&Quote:",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,46,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,90,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Sicherung:",IDC_STATIC,4,66,39,8 - CONTROL "Siche&rungsversion dieses Volumes ebenfalls erstellen", - IDC_SET_CLONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46, - 66,185,8 - LTEXT "&Server:",IDC_STATIC,4,84,39,8 - COMBOBOX IDC_SET_SERVER,46,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partition:",IDC_STATIC,4,102,39,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,102,271, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,156,191,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,211,191,50,14 - PUSHBUTTON "&Hilfe",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Neues Volume",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume löschen" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Abbrechen",IDCANCEL,169,84,50,14 - PUSHBUTTON "OK",IDOK,115,84,50,14 - PUSHBUTTON "&Hilfe",9,223,84,50,14 - CONTROL "Volume %3 von Server %1, Partition %2 &löschen", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 34,45,236,10 - CONTROL "&VLDB-Eintrag für Volume %3 löschen",IDC_DELSET_VLDB, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,60,236,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "Achtung!\n\nDiese Operation löscht Volume %3 dauerhaft.", - IDC_DELSET_DESC,31,7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Volume sichern - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,183,67,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,237,67,50,14 - PUSHBUTTON "&Hilfe",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "Eine Volume-Sicherung stellt sich als schreibgeschützte Kopie dieses Volumes dar. Ein Read/Write-Volume kann über nur eine Sicherungsversion verfügen.", - IDC_STATIC,34,9,307,17 - LTEXT "Klicken Sie auf OK, um eine Sicherung des Volumes %3 auf Server %1, Partition %2 zu erstellen. Wenn bereits eine Sicherung dieses Volumes vorhanden ist, wird die Sicherung aktualisiert.", - IDC_CLONE_DESC,34,32,307,24 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Bekannte Probleme",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Service %2 (Server %1)",IDC_PROBLEM_TITLE,52,13,168,8 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Bekannte Probleme",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Bekannte Probleme",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Partition %2 (Server %1)",IDC_PROBLEM_TITLE,38,14,214,8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Bekannte Probleme",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Volume %3 (Server %1, Partition %2)",IDC_PROBLEM_TITLE, - 49,14,219,8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume verschieben" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,115,156,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,169,156,50,14 - PUSHBUTTON "&Hilfe",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "Volu&me verschieben nach:",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Volume verschieben - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Volume %3 wird von Partition %2 auf Server %1 zu Partition %5 auf Server %4 verschoben...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Protokolldatei anzeigen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Protokolldatei anzeigen auf &Server:",IDC_STATIC,4,40, - 73,17 - COMBOBOX IDC_VIEWLOG_SERVER,82,42,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Au&f Server anzuzeigende Datei:",IDC_STATIC,4,61,73,18 - EDITTEXT IDC_VIEWLOG_FILENAME,82,62,191,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,169,88,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,223,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,20,20 - LTEXT "Geben Sie den vollständigen Pfad der anzuzeigenden Protokolldatei ein.", - IDC_VIEWLOG_DESC,31,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Protokolldatei anzeigen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Dateiinhalt:",IDC_SVC_VIEWLOG_CONTENTS,4,41,277,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Speichern &unter...",IDC_VIEWLOG_SAVEAS,168,167,61,14 - DEFPUSHBUTTON "S&chließen",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "Protokolldatei [für Service %2] auf Server %1", - IDC_SVC_VIEWLOG_DESC,33,7,246,10 - LTEXT "Dateiname auf Server: %1",IDC_SVC_VIEWLOG_FILENAME,33, - 23,248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume-Quote festlegen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Aktuelle Quote:",IDC_STATIC,4,49,50,8 - LTEXT "(Unbekannt)",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "Neue &Quote:",IDC_STATIC,4,81,47,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,109,112,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,163,112,50,14 - PUSHBUTTON "&Hilfe",9,217,112,50,14 - PUSHBUTTON "&Merkmale...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "Partition:",IDC_STATIC,4,30,47,8 - LTEXT "Partition %2 von Server %1",IDC_SET_AGGREGATE,59,30,141, - 8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Volume %1",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Laufende Operationen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Die folgenden Operationen sind momentan aktiv:", - IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "VLDB synchronisieren" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,107,81,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,161,81,50,14 - PUSHBUTTON "&Hilfe",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "(Wird zur Laufzeit festgelegt)",IDC_SYNC_DESC,37,4,228, - 32 - LTEXT "(Wird zur Laufzeit festgelegt)",IDC_SYNC_DESC2,37,44, - 228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume nachbilden" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,115,153,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,169,153,50,14 - PUSHBUTTON "&Hilfe",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Neues Replikat von Volume %3",IDC_SET_NAME,31,12,242,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "E&rstellen eines neuen Replikats dieses Volumes auf:", - IDC_STATIC,4,35,166,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 248, 167 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Datei installieren" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Quellendatei:",IDC_STATIC,4,81,49,8 - EDITTEXT IDC_FILENAME,56,79,129,14,ES_AUTOHSCROLL - PUSHBUTTON "&Durchsuchen...",IDC_BROWSE,188,79,55,14 - LTEXT "Ziel-&Server:",IDC_STATIC,4,101,45,8 - COMBOBOX IDC_SERVER,56,99,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ziel&name:",IDC_STATIC,4,121,49,8 - EDITTEXT IDC_DIRECTORY,56,119,129,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,149,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,140,149,50,14 - PUSHBUTTON "&Hilfe",9,194,149,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,21,20 - LTEXT "Installieren der Datei auf Server",IDC_STATIC,32,12,175, - 8 - LTEXT "(Text wird zur Laufzeit festgelegt)\n(Text wird zur Laufzeit festgelegt)\n(Text wird zur Laufzeit festgelegt)\n(Text wird zur Laufzeit festgelegt)", - IDC_INSTALL_DESC,4,29,240,41 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Datei deinstallieren" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,4,68,35,8 - COMBOBOX IDC_SERVER,41,66,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ziel&datei:",IDC_STATIC,4,87,35,8 - EDITTEXT IDC_FILENAME,41,85,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,88,121,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,141,121,50,14 - PUSHBUTTON "&Hilfe",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "Deinstallieren der Datei von Server",IDC_STATIC,32,12, - 128,8 - LTEXT "Diese Operation ermöglicht Ihnen die Wiederherstellung einer zuvor installierten Kopie einer Datei auf einem bestimmten Server. Wenn keine zuvor installierte Kopie der ausgewählten Datei vorhanden ist, wird die Datei entfernt.", - IDC_STATIC,4,29,240,32 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 261, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Alte Dateien löschen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Server:",-1,4,56,44,8 - COMBOBOX IDC_SERVER,80,54,119,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Alle &Kerndateien löschen",IDC_OP_DELETE_CORE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,80,73,176,10 - CONTROL "Alle .&BAK-Dateien löschen (Dateisicherungen)", - IDC_OP_DELETE_BAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 80,84,176,10 - CONTROL "Alle .&OLD-Dateien löschen (ältere Dateisicherungen)", - IDC_OP_DELETE_OLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 80,95,176,10 - DEFPUSHBUTTON "OK",IDOK,98,123,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,152,123,50,14 - PUSHBUTTON "&Hilfe",9,205,123,50,14 - ICON IDI_PRUNE,-1,4,4,20,20 - LTEXT "Löschen alter Dateien vom Server",-1,32,12,123,8 - LTEXT "Diese Operation löscht Sicherungskopien installierter Dateien auf einem bestimmten Server.", - -1,4,29,238,16 - LTEXT "Zu löschende Dateien:",-1,3,73,73,17 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume umbenennen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Alter Name:",IDC_STATIC,31,67,39,8 - EDITTEXT IDC_RENSET_OLD,78,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&Neuer Name:",IDC_STATIC,31,85,43,8 - EDITTEXT IDC_RENSET_NEW,78,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,115,115,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,169,115,50,14 - PUSHBUTTON "Hilfe",9,223,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Geben Sie einen neuen Namen für Volume %3 ein. Die Namen der Sicherung und der Replikate eines Volumes werden automatisch geändert.\n\nAchtung: Wenn Sie ein angehängtes Volume umbenennen, müssen Sie dessen Mount-Punkte löschen und erneut erstellen.", - IDC_RENSET_DESC,31,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 277, 68 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Service löschen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Abbrechen",IDCANCEL,169,50,50,14 - PUSHBUTTON "OK",IDOK,115,50,50,14 - PUSHBUTTON "Hilfe",9,223,50,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "Achtung!\n\nDiese Operation stoppt Service %2 und löscht ihn von Server %1.", - IDC_DELSVC_DESC,31,7,242,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Dateidatumsangaben abrufen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",-1,4,56,42,8 - COMBOBOX IDC_SERVER,94,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Abzu&fragende Datei:",-1,4,73,79,16 - EDITTEXT IDC_FILENAME,94,73,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,107,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,140,107,50,14 - PUSHBUTTON "&Hilfe",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "Abrufen der Datumsangaben von Dateien auf Server",-1,32, - 12,185,8 - LTEXT "Diese Operation ruft das Datum ab, an dem eine Datei sowie ihre Sicherungskopien (falls vorhanden) zuletzt bearbeitet wurden.", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Dateidatumsangaben abrufen - Ergebnisse" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Server:",IDC_STATIC,4,30,39,8 - LTEXT "(Wird zur Laufzeit festgelegt)",IDC_SERVER,48,30,132,8 - LTEXT "Dateiname:",IDC_STATIC,4,45,39,8 - LTEXT "(Wird zur Laufzeit festgelegt)",IDC_FILENAME,48,45,132, - 8 - LTEXT "Dateidatum:",IDC_STATIC,4,60,39,8 - LTEXT "(Unbekannt; Datei konnte nicht gefunden werden)", - IDC_DATE_FILE,48,60,197,8 - LTEXT ".BAK-Datum:",IDC_STATIC,4,75,41,8 - LTEXT "(Unbekannt; Datei konnte nicht gefunden werden)", - IDC_DATE_BAK,48,75,196,8 - LTEXT ".OLD-Datum:",IDC_STATIC,4,90,42,8 - LTEXT "(Unbekannt; Datei konnte nicht gefunden werden)", - IDC_DATE_OLD,48,90,196,8 - DEFPUSHBUTTON "S&chließen",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "Abrufen der Datumsangaben von Dateien auf Server", - IDC_STATIC,32,12,186,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 295, 144 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Speicherauszug von Volume erstellen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Speicherauszugsdatei erstellen; &Name:",IDC_STATIC,4,40, - 100,16 - EDITTEXT IDC_DUMP_FILENAME,109,40,121,14,ES_AUTOHSCROLL - PUSHBUTTON "&Durchsuchen...",IDC_DUMP_BROWSE,237,40,54,14 - CONTROL "Sp&eicherauszug des gesamten Inhalts von Volume %3 (Partition %1:%2) erstellen", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | - WS_GROUP,10,76,274,16 - CONTROL "Speicherauszug nur für Dateien erstellen, die geändert wurden &seit", - IDC_DUMP_LIMIT_TIME,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,10,98,143,16 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,160,100, - 51,13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,218,100, - 56,13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,131,126,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,185,126,50,14 - PUSHBUTTON "&Hilfe",9,241,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Diese Operation kopiert den Inhalt eines Volumes in eine einzelne Datei, damit das Volume einfach gesichert werden kann. Die auf diese Weise erstellten Inhaltskopien von Volumes können später wiederhergestellt werden.", - IDC_STATIC,30,7,255,26 - GROUPBOX "Speicherauszugparameter",IDC_STATIC,4,62,287,59 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume wiederherstellen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Wiede&rherzustellende Datei:",IDC_STATIC,4,29,69,16 - EDITTEXT IDC_RESTORE_FILENAME,78,30,150,14,ES_AUTOHSCROLL - PUSHBUTTON "&Durchsuchen...",IDC_RESTORE_BROWSE,232,30,55,14 - CONTROL "Diese &ist eine schrittweise steigende Speicherauszugsdatei", - IDC_RESTORE_INCREMENTAL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,77,48,201,10 - LTEXT "&Volume:",IDC_STATIC,11,108,26,8 - EDITTEXT IDC_RESTORE_SETNAME,50,106,115,14,ES_AUTOHSCROLL - LTEXT "&Server:",IDC_STATIC,11,145,24,8 - COMBOBOX IDC_RESTORE_SERVER,51,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Partition:",IDC_STATIC,11,162,36,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,50,161,231, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,128,230,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,183,230,50,14 - PUSHBUTTON "&Hilfe",9,238,230,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Volume aus Speicherauszugsdatei wiederherstellen", - IDC_STATIC,33,11,224,8 - GROUPBOX "Ziel-Volume",IDC_STATIC,4,63,284,160 - LTEXT "Wenn Sie ein Volume aus einer Speicherauszugsdatei wiederherstellen, können Sie entweder ein neues Volume erstellen oder ein vorhandenes Read/Write-Volume überschreiben.", - IDC_STATIC,11,76,267,24 - LTEXT "(Wird zur Laufzeit festgelegt)\n(Wird zur Laufzeit festgelegt)", - IDC_RESTORE_CREATE,51,121,229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Periodisch alle Services auf diesem Server stoppen und erneut starten", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | - WS_TABSTOP,11,71,196,16 - LTEXT "E&rneut starten",IDC_BOS_GENRES_DESC1,23,96,25,8 - COMBOBOX IDC_BOS_GENRES_DATE,54,94,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "&um",IDC_BOS_GENRES_DESC2,127,97,12,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,147, - 94,53,13,WS_EX_CLIENTEDGE - CONTROL "Periodisch alle Services auf diesem Server auf neue &Binärdateien testen", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | - WS_TABSTOP,11,153,201,14 - LTEXT "Te&st",IDC_BOS_BINRES_DESC1,23,178,25,8 - COMBOBOX IDC_BOS_BINRES_DATE,54,176,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "u&m",IDC_BOS_BINRES_DESC2,127,179,12,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,147, - 176,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Service %2 (Server %1)",IDC_SVC_NAME,52,13,168,8 - GROUPBOX "BOS-Service",IDC_STATIC,5,27,215,175 - LTEXT "Mit dem BOS-Service können periodisch alle Services auf diesem Server gestoppt und erneut gestartet werden (einschließlich des BOS-Services selbst).", - IDC_STATIC,11,41,200,24 - LTEXT "Der BOS-Service kann ebenfalls dazu verwendet werden, um alle Services auf einem Server periodisch zu testen oder um nur die Services zu stoppen und erneut zu starten, deren Binärdateien aktualisiert wurden.", - IDC_STATIC,11,115,200,32 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Speicherauszug von Volume erstellen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Speicherauszugsdatei %4 wird von Volume %3 erstellt...", - IDC_DUMPSET_DESC,4,41,229,19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Volume wiederherstellen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Volume %1 wird aus Speicherauszugsdatei %2 wiederhergestellt...", - IDC_RESTORESET_DESC,4,41,229,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 306, 162 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volumes sichern - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Sicherungsversionen &aller Volumes dieser Zelle erstellen", - IDC_CLONE_ALL,"Button",BS_AUTORADIOBUTTON,30,49,214,10 - GROUPBOX " ",IDC_STATIC,25,66,260,67 - CONTROL "Nur Sicherungen für V&olumes erstellen, die folgenden Kriterien entsprechen:", - IDC_CLONE_SOME,"Button",BS_AUTORADIOBUTTON,30,64,250,11 - CONTROL "Nur Volumes auf &Server:",IDC_CLONE_SVR_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,45,83,92,10 - COMBOBOX IDC_CLONE_SVR,191,82,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Nur Volumes auf &Partition:",IDC_CLONE_AGG_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,45,99,97,10 - COMBOBOX IDC_CLONE_AGG,191,98,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Nur Volumes, die &beginnen mit:",IDC_CLONE_PREFIX_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,45,116,109,10 - EDITTEXT IDC_CLONE_PREFIX,191,115,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,140,144,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,194,144,50,14 - PUSHBUTTON "&Hilfe",9,250,144,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Eine Volume-Sicherung stellt sich als schreibgeschützte Kopie des Volumes dar. Ein Read/Write-Volume kann über nur eine Sicherungskopie verfügen.\n\nSie können Sicherungsversionen für mehrere Volumes gleichzeitig erstellen.", - IDC_STATIC,28,7,272,40 -END - -IDD_SUBSETS DIALOGEX 0, 0, 281, 182 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Überwachte Server" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Untergruppenname:",IDC_STATIC,11,77,63,8 - EDITTEXT IDC_SUBSET_NAME,76,75,106,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "Ö&ffnen...",IDC_SUBSET_LOAD,185,75,39,14 - PUSHBUTTON "&Speichern...",IDC_SUBSET_SAVE,229,75,41,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "&Alle überwachen",IDC_SUBSET_ALL,209,122,64,14 - PUSHBUTTON "Kei&ne überwachen",IDC_SUBSET_NONE,209,140,64,14 - LTEXT "Wenn Sie mit einer sehr großen Zelle arbeiten, können Sie bestimmte Server von der Überwachung ausnehmen, um die Leistung zu verbessern. Der AFS Server Manager zeigt keine Volumes, Partitionen oder Services von Servern an, die nicht überwacht werden.", - IDC_STATIC,5,5,271,32 - LTEXT "Sie können die Überwachung eines Servers jederzeit aktivieren (oder inaktivieren). Sie können Server-Untergruppen erstellen, um Listen mit zu überwachenden Servern zu bestimmen.", - IDC_STATIC,5,37,271,23 - GROUPBOX "Aktuelle Untergruppe",IDC_STATIC,5,63,271,114 - LTEXT "Zu überwachende Server:",IDC_STATIC,12,95,91,8 -END - -IDD_SUBSET_LOADSAVE DIALOGEX 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(Titel wird zur Laufzeit festgelegt)" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Untergruppen&name:",1090,5,112,63,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,73,110,149,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Ö&ffnen",IDOK,226,110,50,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,226,127,50,14 - CONTROL "Liste 1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "Bereits für diese Zelle definierte Untergruppen:", - IDC_STATIC,4,6,150,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Befehl suchen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "&Hilfe anzeigen",IDOK,147,38,67,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,147,55,67,14 - LTEXT "Um festzustellen, wie Sie mit dem AFS Server Manager eine Aufgabe durchführen, wählen Sie unten eine Befehlszeile aus und klicken auf ""Hilfe anzeigen"".", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Fehlercode suchen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "F&ehlernummer:",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Überse&tzen",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "S&chließen",IDCANCEL,85,123,48,14 - LTEXT "(Text wird zur Laufzeit festgelegt)",IDC_ERROR_DESC,4, - 71,210,42 - LTEXT "Um die Bedeutung eines Fehlercodes festzustellen, geben Sie den Code unten ein und klicken dann auf ""Übersetzen"".", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Informationen zu AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS Server Manager Version 3.5",IDC_STATIC,33,8,163,8 - LTEXT "Copyright © IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "S&chließen",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Der AFS Server Manager sucht in Zelle %1 nach Servern...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 279, 136 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Vollständige Domänennamen für Server anzeigen (z.B. ""machine.company.com"")", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,5,269,10 - CONTROL "&Warnung anzeigen, wenn ohne Verwaltungs-Token gearbeitet wird", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,19,269,10 - CONTROL "...werden immer die Merkmale des Servers angezeigt", - IDC_OPT_SVR_DBL_PROP,"Button",BS_AUTORADIOBUTTON,7,50, - 253,10 - CONTROL "...werden die Merkmale des Servers nur angezeigt, wenn die Schnellansicht geöffnet ist", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,7,60,255,16 - CONTROL "...wird immer ein Fenster für diesen Server geöffnet", - IDC_OPT_SVR_DBL_OPEN,"Button",BS_AUTORADIOBUTTON,7,77, - 253,10 - CONTROL "...führt das Öffnen eines Server-Fensters zur Überwachung dieses Servers", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,103,253,10 - CONTROL "...führt das Schließen eines Server-Fensters dazu, daß dieser Server nicht mehr überwacht wird", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,7,114,261,15 - LTEXT "Durch Doppelklicken auf das Symbol eines Servers...", - IDC_STATIC,5,38,269,8 - LTEXT "Wenn eine Server-Untergruppe im Gebrauch und die Schnellansicht geschlossen ist...", - IDC_STATIC,5,91,272,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "Server-Schlüssel &hinzufügen",IDC_KEY_ADD,29,160,96,14 - PUSHBUTTON "Server-Schlüssel entfe&rnen",IDC_KEY_REMOVE,129,160,93, - 14 - LTEXT "Schlüssel für Server:",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Server-Schlüssel hinzufügen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Version:",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "Wert:",IDC_STATIC,7,58,21,8 - CONTROL "Diese Zeichenfolge verschlüsseln:",IDC_KEY_BYSTRING, - "Button",BS_AUTORADIOBUTTON | BS_MULTILINE,39,53,75,23 - CONTROL "Diesen Schlüssel verwenden:",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,40,75,72,15 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "Wahlf&rei",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "Erinnerung: Nach dem Hinzufügen eines neuen Schlüssels zu einem Server sollten Sie das AFS-Konto ändern, um den neuen Schlüssel zu verwenden. Nach ein paar Tagen können Sie alle alten Server-Schlüssel entfernen.", - IDC_STATIC,7,99,267,25 - DEFPUSHBUTTON "OK",IDOK,116,129,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,170,129,50,14 - PUSHBUTTON "Hilfe",9,224,129,50,14 - LTEXT "Neuer Schlüssel für Server %1",IDC_KEY_TITLE,43,14,181, - 8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 277, 145 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Service starten/stoppen" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,115,127,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,169,127,50,14 - PUSHBUTTON "&Hilfe",9,223,127,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,21,20 - LTEXT "Klicken Sie auf OK, um Service %2 auf Server %1 zu starten/stoppen.", - IDC_STARTSTOP_TEXT,31,12,242,9 - CONTROL "&Permanent (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,37,64,226,18 - CONTROL "&Temporär (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,37,85,226,18 - GROUPBOX "Servicestart",IDC_STATIC,31,31,242,81 - LTEXT "Sie können diese Änderung permanent gestalten, damit Service %2 (nicht) automatisch gestartet wird, wenn Server %1 erneut gestartet wird.", - IDC_STARTSTOP_STARTUP,38,45,228,16 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Befehl ausführen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,4,56,42,8 - COMBOBOX IDC_SERVER,50,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Befehl:",IDC_STATIC,4,75,42,8 - EDITTEXT IDC_COMMAND,50,73,194,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,107,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,140,107,50,14 - PUSHBUTTON "&Hilfe",9,194,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "Befehl auf Server ausführen",IDC_STATIC,32,12,195,8 - LTEXT "Mit dieser Operation können Sie einen Befehl auf einem fernen Server ausführen.\nEr wird normalerweise dazu verwendet, um einen Server erneut zu starten, indem das Skript /etc/reboot ausgeführt wird.", - IDC_STATIC,4,29,240,16 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 286, 271 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volumes wiederherstellen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,30,59,35,8 - COMBOBOX IDC_SERVER,67,57,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partition:",IDC_STATIC,30,76,35,8 - COMBOBOX IDC_AGGREGATE,67,74,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "&Alle Partitionen wiederherstellen",IDC_AGGREGATE_ALL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,164,76,113,10 - LTEXT "V&olume:",IDC_STATIC,29,94,35,8 - COMBOBOX IDC_FILESET,67,92,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "A&lle Volumes wiederherstellen",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,163,94,107,10 - DEFPUSHBUTTON "OK",IDOK,85,114,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,139,114,50,14 - PUSHBUTTON "&Hilfe",9,232,114,50,14 - PUSHBUTTON "&Weitere >>",IDC_ADVANCED,4,114,53,14 - LTEXT "Pfad für &temporäre Dateien:",IDC_STATIC,10,148,89,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,102,147,173,13,ES_AUTOHSCROLL - CONTROL "Pa&rallele Wiederherstellungen; Anzahl der Prozesse:", - IDC_SALVAGE_SIMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,163,178,10 - EDITTEXT IDC_SALVAGE_NUM,214,162,25,13,ES_AUTOHSCROLL - CONTROL "Kei&ne beschädigten Volumes wiederherstellen", - IDC_SALVAGE_READONLY,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,29,173,165,10 - CONTROL "Lesevorgänge in kleine &Blöcke unterteilen", - IDC_SALVAGE_BLOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,183,152,10 - CONTROL "&Wiederherstellung aller gekennzeichneten Volumes erzwingen", - IDC_SALVAGE_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,193,218,10 - CONTROL "Wi&ederaufbau der Verzeichnisstruktur erzwingen", - IDC_SALVAGE_FIXDIRS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,29,203,170,10 - LTEXT "Dateiname für Ergebnisprotoko&ll:",IDC_STATIC,10,217, - 104,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,118,216,156,13,ES_AUTOHSCROLL - CONTROL "L&iste beschädigter inodes in Ergebnisprotokoll aufnehmen", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,230,213,10 - CONTROL "Liste der im Besitz von AFS befindlichen root inodes in Ergebnisprotokoll aufnehmen", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,30,241,246,15 - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "Mit dieser Operation können Sie Probleme auf einem oder mehreren Volumes beheben.\n\nHinweis: Wenn Sie eine komplette Partition oder einen Server in einem Schritt wiederherstellen, wird der Server temporär offline geschaltet.", - IDC_STATIC,31,8,247,46 - GROUPBOX "Erweiterte Wiederherstellungsoptionen", - IDC_ADVANCED_GROUP,4,134,278,128 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Volumes wiederherstellen - Ergebnisse" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "S&chließen",IDOK,232,160,50,14 - LTEXT "Ergebnisse der Wiederherstellungsoperationen:", - IDC_STATIC,4,33,277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "Volume %3 auf Partition %2 des Servers %1 wiederherstellen", - IDC_SALVAGE_TITLE,33,15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 301, 103 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volume freigeben" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,140,85,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,194,85,50,14 - PUSHBUTTON "&Hilfe",9,247,85,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "Mit dieser Operation können Sie die Replikate von Volume %3 aktualisieren. Sie können entweder Replikate aktualisieren, die nicht auf dem neuesten Stand sind, oder aber alle Replikate.", - IDC_RELSET_DESC,34,7,254,25 - CONTROL "N&ur Volume-Replikate aktualisieren, die nicht nicht auf dem neuesten Stand sind", - IDC_RELSET_NORMAL,"Button",BS_AUTORADIOBUTTON,8,41,264, - 10 - CONTROL "&Alle Volume-Replikate aktualisieren, auch wenn diese auf dem neuesten Stand sind", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,8,56,276,10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Host-Server &hinzufügen",IDC_HOST_ADD,56,160,82,14 - PUSHBUTTON "Host-Server entfe&rnen",IDC_HOST_REMOVE,141,160,80,14 - LTEXT "Vom Server erkannte Datenbank-Host-Server:", - IDC_HOST_TITLE,5,7,216,8 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 242, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Host-Server hinzufügen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Host:",-1,31,55,26,8 - EDITTEXT IDC_ADDHOST_HOST,61,53,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,80,88,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,134,88,50,14 - ICON IDI_SERVER,-1,4,4,21,20 - LTEXT "Sie haben das Hinzufügen eines Datenbank-Host-Servers zur Liste gewählt, die auf Server %1 gespeichert wird.\n\nGeben Sie unten den Namen des neuen Datenbank-Hosts ein.", - IDC_ADDHOST_DESC,27,8,211,40 - PUSHBUTTON "Hilfe",9,188,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Server-Adressen ändern" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "In VLDB aufgezeichnete IP-Adressen für Server %1:", - IDC_TITLE,4,4,200,8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Ä&ndern...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "&Entfernen",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "OK",IDOK,46,97,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,100,97,50,14 - PUSHBUTTON "Hilfe",9,154,97,50,14 - LTEXT "Hinweis: Beim Start eines Datei-Servers registriert dieser seine aktuellen IP-Adressen automatisch mit VLDB.", - IDC_STATIC,4,64,200,18 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "IP-Adresse ändern" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,61,51,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,115,51,50,14 - PUSHBUTTON "Hilfe",9,169,51,50,14 - LTEXT "Geben Sie die neue IP-Adresse ein, die %1 in VLDB ersetzen soll:", - IDC_TITLE,4,4,215,17 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,42,28, - 87,11 - LTEXT "Adresse:",IDC_STATIC,4,30,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "Server %1 - Admin-Listen" - IDS_TAB_SERVICES "Services" - IDS_TAB_AGGREGATES "Partitionen" - IDS_TAB_FILESETS "Volumes" - IDS_SERVICE_NONESELECTED "Wählen Sie einen anzuzeigenden Server aus." - IDS_SERVICE_GOTSELECTED "Service-Prozesse auf Server %1:" - IDS_AGGREGATE_ALL "Partitionen auf allen Servern:" - IDS_AGGREGATE_ONE "Partitionen auf Server %1:" - IDS_FILESET_ALL "Alle Volumes in Zelle %1:" - IDS_FILESET_ONE "Volumes auf Server %1:" - IDS_SVR_LISTS_TAB "Admin-Listen" - IDS_SVR_PROP_TITLE "Server %1 - Merkmale" - IDS_SVR_GENERAL_TAB "Allgemein" - IDS_SVR_SCOUT_TAB "Einstellungen" - IDS_SERVER_TITLE "Server %1 - AFS Server Manager" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "Server %1 in Zelle %2:" - IDS_SVC_PROP_TITLE "Service %2 auf Server %1 - Merkmale" - IDS_SVC_GENERAL_TAB "Allgemein" - IDS_SVC_ADD_TITLE "Service erstellen" - IDS_SVC_ADD_TAB "Service erstellen" - IDS_AGG_PROP_TITLE "Partition %2 auf Server %1 - Merkmale" - IDS_AGG_GENERAL_TAB "Allgemein" - IDS_SET_REP_TITLE "Volume %1 - Nachbildung" - IDS_SET_REPSITES_TAB "Nachbildungsstandorte" - IDS_SET_PROP_TITLE "Volume %1 - Merkmale" - IDS_SET_GENERAL_TAB "Allgemein" - IDS_SET_UNLOCKBTN "Jetzt Sperre &aufheben" - IDS_SET_LOCKBTN "Jetzt &sperren" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%1 verwendet von %2 Quote (%3%%)" - IDS_USAGE_AGGREGATE "%1 verwendet von %2 Kapazität (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "Kombinierte Quote" - IDS_SVRCOL_NAME "Server" - IDS_SVRCOL_STATUS "Status" - IDS_SETCOL_DATE_ACCESS "Letzter Zugriff" - IDS_SETCOL_DATE_BACKUP "Letzte Sicherung" - IDS_SVCCOL_NAME "Service" - IDS_SVCCOL_TYPE "Typ" - IDS_SVCCOL_PARAMS "Parameter" - IDS_SVCCOL_STATUS "Status" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "Zuletzt gestartet" - IDS_SVCCOL_DATE_STOP "Zuletzt gestoppt" - IDS_SVCCOL_DATE_STARTSTOP "Zuletzt gestartet/gestoppt" - IDS_SVCCOL_DATE_FAILED "Zuletzt fehlgeschlagen" - IDS_SVCCOL_LASTERROR "Letzter Exit-Code" - IDS_AGGCOL_NAME "Partition" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "Gerät" - IDS_AGGCOL_USED "Verwendet" - IDS_AGGCOL_USED_PER "% verwendet" - IDS_AGGCOL_FREE "Frei" - IDS_AGGCOL_TOTAL "Kapazität" - IDS_AGGCOL_STATUS "Status" - IDS_SETCOL_NAME "Volume" - IDS_SETCOL_TYPE "Typ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "Erstellt" - IDS_SETCOL_DATE_UPDATE "Zuletzt aktualisiert" - IDS_SETCOL_STATUS "Status" - IDS_SETCOL_QUOTA_USED "Verwendet" - IDS_SETCOL_QUOTA_USED_PER "% verwendet" - IDS_SETCOL_QUOTA_FREE "Frei" - IDS_SETCOL_QUOTA_TOTAL "Quote" - IDS_TRYAGAINBTN "Erneut &versuchen" - IDS_NO_CELL_SELECTED "(Es wurde keine Zelle angegeben)" - IDS_NO_AFS_ID "(Es sind keine Token verfügbar)" - IDS_AFS_ID_WILLEXP "%1 (Token laufen %2 ab)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS - "Bitte warten; Informationen über Zelle %1 werden abgerufen..." - IDS_STATUS_NOALERTS "Normal" - IDS_TITLE_BROWSE_USER "Benutzer auswählen" - IDS_AGGTYPE_OTHER "Unbekannt (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "Volume %3 wird auf Partition %1:%2 erstellt" - IDS_ACTION_DELETEFILESET "Volume %3 wird von Partition %1:%2 gelöscht" - IDS_ACTION_MOVEFILESET "Volume %3 wird auf Partition %1:%2 verschoben" - IDS_ACTION_SETFILESETQUOTA "Die Quote für Volume %3 wird geändert" - IDS_SVCSTOP_DESC2 "Klicken Sie auf OK, um diesen Service zu stoppen." - IDS_SVCSTART_DESC2 "Klicken Sie auf OK, um diesen Service zu starten." - IDS_SYNCVLDB_SVR_DESC "Achtung!\n\nWenn Sie fortfahren, ändert der AFS Server Manager die VLDB, um die Inhalte aller Partitionen auf Server %1 abzugleichen." - IDS_SYNCVLDB_SVR_DESC2 "Wenn die VLDB ein Volume aufführt, das momentan in keiner Partition auf Server %1 gefunden werden kann, dann wird der VLDB-Eintrag für dieses Volume gelöscht!" - IDS_SYNCVLDB_AGG_DESC "Achtung!\n\nWenn Sie fortfahren, ändert der AFS Server Manager die VLDB, um die Inhalte von Partition %2 auf Server %1 abzugleichen." - IDS_SYNCVLDB_AGG_DESC2 "Wenn die VLDB ein Volume aufführt, das momentan nicht in dieser Partition gefunden werden kann, dann wird der VLDB-Eintrag für dieses Volume gelöscht!" - IDS_PROMPT_BROWSE_USER "Benutzer:" - IDS_PREVIEWIN_BUTTON "<< &Voranzeige" - IDS_PREVIEWOUT_BUTTON "Voran&zeige >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "Benutzer" - IDS_TITLE_BROWSE_PRINCIPAL "Principal auswählen" - IDS_TITLE_BROWSE_OWNGROUP "Eignergruppe auswählen" - IDS_PROMPT_BROWSE_PRINCIPAL "Principal:" - IDS_PROMPT_BROWSE_OWNGROUP "Eignergruppe:" - IDS_ACTION_CLONE "Sicherungsversion von Volume %3 wird erstellt" - IDS_ACTION_CLONESYS "Es werden mehrere Volume-Sicherungen erstellt" - IDS_CLONESYS_FAILED "Von Volume %1 konnte keine Sicherung erstellt werden, da der Fehler 0x%2 (%3) aufgetreten ist." - IDS_SET_UNSPECIFIED "(Nicht angegeben)" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "Dateianzahl" - IDS_SET_DUMP_NAME "Speicherauszug von %1.DMP" - IDS_ACTION_DUMP "Speicherauszug von Volume %3 wird erstellt (Partition %1:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "Partition" - IDS_REFRESH_DESC_CELL "Der AFS Server Manager ermittelt den Status von Servern in Zelle %1. Dies kann einen Moment dauern..." - IDS_REFRESH_DESC_SERVER "Der AFS Server Manager ermittelt den Status von Server %1. Dies kann einen Moment dauern..." - IDS_REFRESH_CURRENT_CELL "Aktuelle Prüfung von: Zelle %1" - IDS_REFRESH_CURRENT_SERVER "Aktuelle Prüfung von: Server %2" - IDS_REFRESH_CURRENT_AGGREGATE - "Aktuelle Prüfung von: Partition %3 auf Server %2" - IDS_REFRESH_CURRENT_FILESET - "Aktuelle Prüfung von: Volume %4 auf Server %2, Partition %3" - IDS_REFRESH_CURRENT_SERVICE - "Aktuelle Prüfung von: Service %3 auf Server %2" - IDS_REFRESH_PERCENT "%1%% abgeschlossen" - IDS_PROBLEMS "Probleme" - IDS_SERVER_NO_PROBLEMS "Dieser Server weist keine bekannten Probleme auf." - IDS_SERVICE_NO_PROBLEMS "Dieser Service weist keine bekannten Probleme auf." - IDS_AGGREGATE_NO_PROBLEMS - "Diese Partition weist keine bekannten Probleme auf." - IDS_FILESET_NO_PROBLEMS "Dieses Volume weist keine bekannten Probleme auf." - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB - "Aktuelle Prüfung von: Volume Location Database (VLDB, Datenbank der Volume-Adressen)" - IDS_FILESETTYPE_RW "Read/Write" - IDS_FILESETTYPE_RO "Replikat" - IDS_FILESETTYPE_CLONE "Sicherung" - IDS_MOVESET_READWRITE "Wenn Sie fortfahren, wird Volume %3 von Partition %2 auf Server %1 an eine andere Position verschoben." - IDS_MOVESET_READONLY "Wenn Sie fortfahren, wird das Volume-Replikat %3 von Partition %2 auf Server %1 entfernt. Desweiteren wird ein weiteres Volume-Replikat auf der Partition erstellt, die Sie unten angeben." - IDS_SVC_START_TITLE "Service starten" - IDS_SVC_STOP_TITLE "Service stoppen" - IDS_SERVICESTATUS_STARTING "Dieser Service wird momentan gestartet." - IDS_SERVICESTATUS_RUNNING "Dieser Service ist momentan aktiv." - IDS_SERVICESTATUS_STOPPED "Dieser Service wird momentan angehalten." - IDS_SERVICESTATUS_STOPPING "Dieser Service wird momentan gestoppt." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "Der Status dieses Services ist unbekannt." - IDS_SVC_RESTART_BUTTON "Jetzt stoppen und &neu starten" - IDS_PROBLEM_BOX "Bekannte Probleme (%1)" - IDS_VIEWLOG_DESC_NOFILE "Der AFS Server Manager konnte die Protokolldatei für Service %2 auf Server %1 nicht finden. Geben Sie unten den vollständigen Pfad zur Protokolldatei des Services ein." - IDS_NO_GROUP "(Keine Eignergruppe)" - IDS_VIEWLOG_FROMSERVER "Protokolldatei auf Server %1" - IDS_VIEWLOG_FROMSERVICE "Protokolldatei für Service %2 auf Server %1" - IDS_VIEWLOG_TRUNCATED "Dateiinhalte (es werden nur die letzten %1 Zeilen angezeigt):" - IDS_SAVELOG_FILTER "Textdatei|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< &Weitere" - IDS_ADVANCEDOUT_BUTTON "&Weitere >>" - IDS_REPTYPE_RELEASE "Nachbildung freigeben" - IDS_REPTYPE_SCHEDULED "Geplante Nachbildung" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "Alles akt&ualisieren" - IDS_UPDATETHIS_BUTTON "Akt&ualisieren" - IDS_SERVER_MULTIPLE_PROBLEMS - "Dieser Server weist %1 bekannte Probleme auf." - IDS_SERVICE_MULTIPLE_PROBLEMS - "Dieser Service weist %1 bekannte Probleme auf." - IDS_AGGREGATE_MULTIPLE_PROBLEMS - "Diese Partition weist %1 bekannte Probleme auf." - IDS_FILESET_MULTIPLE_PROBLEMS - "Dieses Volume weist %1 bekannte Probleme auf." - IDS_FILESETTYPE_RO_STAGE "Replikat" - IDS_SERVICETYPE_SIMPLE_LONG "Einfach (fortlaufende Ausführung)" - IDS_SERVICETYPE_CRON_LONG "Cron (Ausführung in bestimmten Intervallen)" - IDS_QUOTAUNITS_KB "KB" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "(Bei diese Volume handelt es sich um ein Replikat und daher verfügt es über keine Quote)" - IDS_NO_QUOTA_CLONE "(Bei diese Volume handelt es sich um eine Sicherung und daher verfügt es über keine Quote)" - IDS_USAGE_REPLICA "%1 verwendet" - IDS_USAGE_CLONE "%1 verwendet" - IDS_COL_AGGS_MOVE "Bei der Erstellung eines Volumes erfolgt eine Partitionierung" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "Partitionen auf Server %1:" - IDS_AGGREGATES_IN_CELL "Alle Partitionen in Zelle %1:" - IDS_AGGREGATES_IN_NOTHING "Partitionen:" - IDS_FILESETS_IN_SERVER "Volumes auf Server %1:" - IDS_FILESETS_IN_CELL "Alle Volumes in Zelle %1:" - IDS_FILESETS_IN_NOTHING "Volumes:" - IDS_SERVICES_IN_SERVER "Services auf Server %1:" - IDS_SERVICES_IN_NOTHING "Services:" - IDS_UNKNOWN "(Unbekannt)" - IDS_UNKNOWN_GROUP "Gruppe #%1 (Name nicht bekannt)" - IDS_AGGFULL_WARN_OFF "der Standardschwellenwert (Warnung ist auf dem Server inaktiviert)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "der Standardschwellenwert (Warnung ist auf dem Server inaktiviert)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - Exit-Code %2" - IDS_COL_SERVERS "Server in einer Zelle" - IDS_COL_FILESETS "Volumes auf einem Server" - IDS_COL_AGGREGATES "Partitionen auf einem Server" - IDS_COL_SERVICES "Services auf einem Server" - IDS_COL_REPLICAS "Replikate eines Volumes" - IDS_COLUMNS_TITLE "Anzeigespalten auswählen - AFS Server Manager" - IDS_REPCOL_SERVER "Server" - IDS_REPCOL_AGGREGATE "Partition" - IDS_REPCOL_DATE_UPDATE "Letzte Aktualisierung" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "Beim Verschieben eines Volumes erfolgt eine Partitionierung" - IDS_WARN_TITLE "Achtung" - IDS_WARN_DISABLE_AUTH "Wenn Sie auf ""Nicht authentifizierte erlauben"" klicken, ermöglichen Sie es nicht authentifizierten Principals, die Services auf diesem Server zu ändern. Da viele die Identität Root besitzen, stellt diese Aktion +" - IDS_WARN_DISABLE_AUTH2 "eine beachtliche Schwachstelle für die Sicherheit des Servers dar.\n\nSind Sie sicher, daß Sie diese Änderung vornehmen möchten?" - IDS_SVR_NO_ADDR "(Nicht angegeben)" - IDS_TITLE_BAD_CELL "Unbekannter Zellenname" - IDS_DESC_BAD_CELL "Der von Ihnen eingegebene Zellenname konnte nicht im Netzwerk gefunden werden.\n\nÜberprüfen Sie Ihren Eintrag erneut, um sicherzustellen, daß dieser korrekt ist." - IDS_AGGFULL_WARN_ON "der Stan&dardschwellenwert für diesen Server (%1%% seiner Größe)" - IDS_SETFULL_WARN_ON "der Stan&dardschwellenwert für diesen Server (%1%% seiner Größe)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "Die eingegebene AFS-ID wurde nicht erkannt, oder das angegebene Kennwort ist falsch." - IDS_SVR_CREDS_NONE "(keine Token)" - IDS_SVR_CREDS_VALID "%2, läuft %3 ab" - IDS_SVR_CREDS_EXPIRED "(Token %3 abgelaufen)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 (Kombinierte Quote: %2)" - IDS_ACTION_DESC_NONE "Momentan laufen keine Operationen." - IDS_ACTION_DESC_ONE "Momentan läuft die folgende Operation:" - IDS_ACTION_DESC_MULT "Die folgenden Operationen sind momentan aktiv:" - IDS_ACTCOL_OPERATION "Operation" - IDS_ACTCOL_ELAPSED "Abgelaufene Zeit" - IDS_ACTION_REFRESH "Neuanzeige der Zelleninformationen" - IDS_ACTION_CREATESERVER "Server %1 wird erstellt" - IDS_ACTION_DELETESERVER "Server %1 wird gelöscht" - IDS_ACTION_GETSERVERLOGFILE - "Protokolldatei %2 wird von Server %1 abgerufen" - IDS_ACTION_SETSERVERAUTH - "Für Server %1 werden die Zugriffsbeschränkungen geändert" - IDS_ACTION_CHANGESERVERSTATUS "Die Merkmale von Server %1 werden geändert" - IDS_ACTION_STARTSERVICE "Service %2 wird auf Server %1 gestartet" - IDS_ACTION_STOPSERVICE "Service %2 wird auf Server %1 gestoppt" - IDS_ACTION_RESTARTSERVICE "Service %2 wird auf Server %1 erneut gestartet" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "VLDB wird mit Server %1 synchronisiert" - IDS_ACTION_SYNCVLDB_AGG "VLDB wird mit Partition %1:%2 synchronisiert" - IDS_ACTION_SCOUT "Server %1 wird auf Probleme untersucht" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "Die Nachbildungsmerkmale für Volume %3 werden geändert" - IDS_ACTION_CREATEREPLICA - "Von Volume %3 wird auf Partition %1:%2 ein Replikat erstellt" - IDS_DELSET_REPLICA_DESC "Achtung!\n\nWenn Sie fortfahren, wird das Replikat von Volume %3 auf Partition %2 des Servers %1 entfernt." - IDS_DELSET_CLONE_DESC "Achtung!\n\nWenn Sie fortfahren, wird die Volume-Sicherung %3 von Partition %2 des Servers %1 entfernt." - IDS_INSTALL_DESC1 "Diese Operation kopiert eine Datei von diesem Computer auf einen anderen. +" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "Wenn die Datei bereits auf dem Zielcomputer vorhanden ist, wird diese gesichert und sie erhält die Erweiterung .BAK; vorhandene Sicherungen der Datei erhalten die Erweiterung .OLD, und vorhandene .OLD-Dateien werden gelöscht." - IDS_ACTION_INSTALLFILE "Datei %2 wird auf Server %1 installiert" - IDS_ACTION_UNINSTALLFILE "Datei %2 wird von Server %1 deinstalliert" - IDS_ACTION_PRUNEFILES "Dateien werden von Server %1 entfernt" - IDS_FILTER_ALLFILES "Alle Dateien|*.*|" - IDS_ACTION_RENAMEFILESET "Volume %1 wird in %2 umbenannt" - IDS_RECUR_DAILY "jeden Tag" - IDS_RECUR_SUNDAY "jeden Sonntag" - IDS_RECUR_MONDAY "jeden Montag" - IDS_RECUR_TUESDAY "jeden Dienstag" - IDS_RECUR_WEDNESDAY "jeden Mittwoch" - IDS_RECUR_THURSDAY "jeden Donnerstag" - IDS_RECUR_FRIDAY "jeden Freitag" - IDS_RECUR_SATURDAY "jeden Samstag" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "Service %2 wird auf Server %1 erstellt" - IDS_ACTION_DELETESERVICE "Service %2 wird von Server %1 gelöscht" - IDS_ACTION_RELEASEFILESET "Volume %3 wird freigegeben" - IDS_ACTION_GETDATES "Datumsangaben werden für Datei %2 auf Server %1 abgerufen" - IDS_LASTMODIFIED "Letzte Änderung %1" - IDS_SVR_SECURITY_TITLE "Server-Sicherheit - %1" - IDS_SVR_LIST_TAB "Administratoren" - IDS_ACTION_ADMINLIST_LOAD "Administratoren werden für Server %1 abgerufen" - IDS_ACTION_ADMINLIST_SAVE - "Administratoren werden für Server %1 geschrieben" - IDS_ADMCOL_PRINCIPAL "Mitglied" - IDS_ADMCOL_TYPE "Typ" - IDS_ADMCOL_TYPE_GROUP "Gruppe" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "Volume %1 wird wiederhergestellt" - IDS_COL_AGGS_RESTORE "Beim Wiederherstellen eines Volumes erfolgt eine Partitionierung" - IDS_RESTORE_FILTER "Volume-Speicherauszugsdateien|*.DMP|Alle Dateien|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "Neustartzeiten der Services werden für Server %1 geändert" - IDS_RESTORE_CREATESET "Volume %1 wird auf dem Server und der Partition erstellt, die von Ihnen unten angegeben werden." - IDS_RESTORE_OVERWRITESET - "Achtung! Volume %3 ist auf Partition %2 von Server %1 vorhanden und wird überschrieben, wenn Sie fortfahren!" - IDS_SUBSET_TITLE_LOAD "Server-Untergruppe öffnen" - IDS_SUBSET_TITLE_SAVE "Server-Untergruppe speichern" - IDS_BUTTON_OPEN "Ö&ffnen" - IDS_BUTTON_SAVE "&Speichern" - IDS_SUBSET_SAVE_TITLE "Achtung" - IDS_SUBSET_SAVE_DESC "Es ist bereits eine Server-Untergruppe mit Namen %1 vorhanden.\n\nMöchten Sie diese Untergruppe überschreiben?" - IDS_SUBSET_CHANGED "%1 [GEÄNDERT]" - IDS_SUBSET_TAB "Überwachte Server" - IDS_SUBSET_DISCARD_TITLE "Untergruppen speichern?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "Sie haben die Liste momentan überwachter Server nicht als Untergruppe gespeichert. Wenn Sie diese Liste speichern, können Sie sie später verwenden, um mit der Überwachung derselben Server-Gruppe fortzufahren.\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "Möchten Sie eine Untergruppe erstellen, die die Liste der momentan überwachten Server enthält?" - IDS_SUBSET_NONAME "(Nicht benannt)" - IDS_SUBSET_NOSUBSET "(Alle Server werden überwacht)" - IDS_SUBSET_SERVERSUBSET "Server %1" - IDS_FILESET_SOME "Volumes aller überwachten Server in Zelle %1:" - IDS_AGGREGATE_SOME "Partitionen aller überwachten Server in Zelle %1:" - IDS_SERVICE_SOME "Services aller überwachten Server in Zelle %1:" - IDS_FILESET_UNMON "Server %1 wird nicht überwacht" - IDS_AGGREGATE_UNMON "Server %1 wird nicht überwacht" - IDS_SERVICE_UNMON "Server %1 wird nicht überwacht" - IDS_SUBSET_DELETE_TITLE "Untergruppe löschen?" - IDS_SUBSET_DELETE_DESC "Sind Sie sicher, daß Sie die Server-Untergruppe %1 löschen möchten?" - IDS_ERROR_TRANSLATED "Fehlernummer 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Fehlernummer 0x%1 (%2) wurde nicht erkannt." - IDS_FIND_NOTHING_TITLE "Kein Befehl ausgewählt" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "Um festzustellen, wie eine Operation durchgeführt wird, wählen Sie zunächst eine Befehlszeile aus der Liste aus, oder geben Sie ein Schlüsselwort ein." - IDS_FIND_UNKNOWN_TITLE "Unbekannter Befehl" - IDS_FIND_UNKNOWN_DESC "Der AFS Server Manager konnte für den Befehl ""%1"" keine Hilfethemen finden." - IDS_HELPABOUT_DESC1 "Achtung: Dieses Computerprogramm ist durch Copyright und internationale Verträge geschützt. +" - IDS_HELPABOUT_DESC2 "Nicht autorisierte Vervielfältigung oder Verteilung dieser Lizenzsoftware oder Teilen davon wird strafrechtlich verfolgt.\n\n+" - IDS_HELPABOUT_DESC3 "AFS ist eine Marke von Transarc Corporation, einer Firma von IBM." - IDS_CANT_QUIT_TITLE "AFS Server Manager" - IDS_CANT_QUIT_REBOOT "Achtung!\n\nDer AFS Server Manager führt momentan eine oder mehrere Operationen durch. Wenn Sie Windows jetzt herunterfahren, können diese Operationen nicht erfolgreich abgeschlossen werden.\n\nSind Sie sicher, daß Sie Windows neu starten möchten?" - IDS_APP_TITLE "AFS Server Manager" - IDS_ACTION_OPENCELL "In Zelle %1 wird nach Servern gesucht" - IDS_OPTIONS_TITLE "Optionen - AFS Server Manager" - IDS_OPTIONS_GENERAL_TAB "Allgemein" - IDS_BADCREDS_DESC "Wenn Sie nicht als Administrator angemeldet sind, besitzen Sie keine ausreichenden Berechtigungen, die Zelle %1 zu verwalten. Nicht ausreichende Berechtigungen können dazu führen, daß der AFS Server Manager Probleme in einer Zelle entdeckt, in der keine Probleme existieren." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "Bestätigung - AFS Server Manager" - IDS_NO_GROUP_CHECKBOX "Keine Eignergruppe" - IDS_AFS_ID_DIDEXP "%1 (Token abgelaufen %2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(Abfragen)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "Fremdgruppe" - IDS_ADMCOL_TYPE_FOREIGN_USER "Fremdbenutzer" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "Benachrichtigung" - IDS_SVC_NONOTIFIER "(keine)" - IDS_SVR_KEY_TAB "Server-Schlüssel" - IDS_KEYNAME_NOTIME "Schlüssel für Server %1:" - IDS_KEYNAME_WITHTIME "Schlüssel für Server %1 (geändert %2):" - IDS_SVRKEY_VERSION "Version" - IDS_SVRKEY_DATA "Wert" - IDS_SVRKEY_CHECKSUM "Kontrollsumme" - IDS_SVRKEY_DATA_UNKNOWN "(verdeckt)" - IDS_STARTSERVICE_TITLE "Service starten" - IDS_STOPSERVICE_TITLE "Service stoppen" - IDS_STARTSERVICE_TEXT "Klicken Sie auf OK, um Service %2 auf Server %1 zu starten." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "Klicken Sie auf OK, um Service %2 auf Server %1 zu stoppen." - IDS_STARTSERVICE_STARTUP - "Sie können diese Änderung permanent machen, damit Service %2 automatisch gestartet wird, wenn Server %1 erneut gestartet wird." - IDS_STOPSERVICE_STARTUP "Sie können diese Änderung permanent machen, damit Service %2 nicht automatisch gestartet wird, wenn Server %1 erneut gestartet wird." - IDS_STARTSERVICE_PERMANENT - "&Permanent (Service %2 starten, wenn Server %1 neu gestartet wird)" - IDS_STARTSERVICE_TEMPORARY - "&Temporär (Service %2 nicht starten, wenn Server %1 neu gestartet wird)" - IDS_STOPSERVICE_PERMANENT - "&Permanent (Service %2 nicht starten, wenn Server %1 neu gestartet wird)" - IDS_STOPSERVICE_TEMPORARY - "&Temporär (Service %2 starten, wenn Server %1 neu gestartet wird)" - IDS_ACTION_EXECUTE "%2 wird auf Server %1 ausgeführt" - IDS_ACTION_SALVAGE_SVR "Alle Volumes auf Server %1 werden wiederhergestellt" - IDS_ACTION_SALVAGE_AGG "Alle Volumes auf Partition %1:2 werden wiederhergestellt" - IDS_ACTION_SALVAGE_VOL "Volume %3 wird auf Partition %1:2 wiederhergestellt" - IDS_SALVAGE_SVR "Alle Volumes auf Server %1 wiederherstellen" - IDS_SALVAGE_AGG "Alle Volumes auf Server %1, Partition %2 wiederherstellen" - IDS_SALVAGE_SET "Volume %3 auf Server %1, Partition %2 wiederherstellen" - IDS_SETSTATUS_SALVAGE "Volume wird wiederhergestellt" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "Volume ist gesperrt" - IDS_SETSTATUS_NO_VOL "Volume fehlt" - IDS_SETSTATUS_BUSY "Volume ist momentan ausgelastet" - IDS_SETSTATUS_MOVED "Volume wurde verschoben" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "Adresse" - IDS_HOST_TITLE "Vom Server %1 erkannte Datenbank-Host-Server:" - IDS_SVR_HOSTS_TITLE "Server %1 - Datenbank-Hosts" - IDS_SVR_HOST_TAB "Datenbank-Hosts" - IDS_ACTION_HOSTLIST_LOAD "Host-Liste wird von Server %1 abgerufen" - IDS_ACTION_HOSTLIST_SAVE "Host-Liste wird auf Server %1 geschrieben" - IDS_SETSTATUS_1ALERT "Volume weist ein Problem auf" - IDS_SETSTATUS_2ALERT "Volume weist %1 Probleme auf" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "IP-Adresse wird für Server %1 geändert" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED - "Server %1 wird nicht auf Probleme hin überwacht" - IDS_ALERT_DESCSHORT_TIMEOUT - "Kontakt zu Server %1 konnte nicht hergestellt werden; letzter Fehler: %3" - IDS_ALERT_DESCSHORT_AGG_FULL - "Die Partitionsbelegung für %2 überschreitet den Warnschwellenwert von %3%% (%4)" - IDS_ALERT_DESCSHORT_SET_FULL - "Die Volume-Belegung für %3 überschreitet den Warnschwellenwert von %4%% (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT - "Volume %3 verfügt über keinen VLDB-Eintrag" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "Volume %3 besitzt einen VLDB-Eintrag, konnte aber nicht auf Partition %2 des Servers %1 gefunden werden" - IDS_ALERT_DESCSHORT_STOPPED "Service %2 um %3 gestoppt" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "Verweis auf Partition %2 von VLDB; diese konnte aber auf Server %1 nicht gefunden werden" - IDS_ALERT_DESCSHORT_BADCREDS - "Sie verfügen möglicherweise nicht über ausreichende Berechtigungen, um Server %1 zu verwalten" - IDS_ALERT_DESCSHORT_AGG_ALLOC - "Die kombinierte Volume-Quote auf Partition %2 überschreitet ihre Kapazität" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE - "Das Volume %3 ist beschädigt und kann nicht verwendet werden." - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "Es ist kein Service aktiv, um Volume %3 zu dienen." - IDS_ALERT_DESCSHORT_STATE_OFFLINE - "Volume %3 ist offline und kann nicht verwendet werden." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "Der Kontakt konnte zu Server %1 nicht hergestellt werden. Der letzte Versuch, der um %2 durchgeführt wurde, hat den Fehler ""%3"" ergeben." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "Die Belegung von Partition %2 auf Server %1 überschreitet ihren Warnschwellenwert von %3%% (%4)." - IDS_ALERT_DESCFULL_SET_FULL - "Die Belegung von Volume %3 (Server %1, Partition %2) überschreitet dessen Warnschwellenwert von %4%% (%5)." - IDS_ALERT_DESCFULL_NO_VLDBENT - "Volume %3 ist auf Partition %2 des Servers %1 vorhanden, verfügt aber über keinen entsprechenden VLDB-Eintrag." - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "Für Volume %3 ist ein VLDB-Eintrag vorhanden, das Volume konnte aber auf Partition %2 des Servers %1 nicht gefunden werden." - IDS_ALERT_DESCFULL_STOPPED - "Der Service %2 des Servers %1 wurde um %3 mit Exit-Code %5 gestoppt." - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "Die VLDB verweist auf Volumes der Partition %2 des Servers %1, die Partition konnte jedoch nicht gefunden werden." - IDS_ALERT_DESCFULL_BADCREDS - "Der AFS Server Manager kann möglicherweise Fehler entdecken, die auf Server %1 nicht existieren, da Sie nicht über AFS-Token als Administrator in dieser Zelle verfügen." - IDS_ALERT_DESCFULL_AGG_ALLOC - "Die kombinierte Quote von Volumes auf Partition %2 des Servers %1, die zusammen %4 ergibt, überschreitet die Kapazität der Partition von %3." - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "Das Volume %3 auf Partition %2 des Servers %1 verfügt über keinen zugeordneten Vnode. (Volume-Status ist 0x%4.)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "Auf Server %1 ist kein Dateiexportservice aktiv, daher kann Volume %3 auf Partition %2 nicht verwendet werden. (Volume-Status ist 0x%4.)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "Das Volume %3 auf Partition %2 des Servers %1 ist offline und kann nicht verwendet werden. (Volume-Status ist 0x%4.)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "Klicken Sie auf Erneut versuchen, um erneut zu versuchen, den Kontakt zu diesem Server herzustellen." - IDS_ALERT_FIX_AGG_FULL "Klicken Sie auf Warnungen, um den Warnschwellenwert für die Belegung dieser Partition zu ändern." - IDS_ALERT_FIX_SET_FULL "Klicken Sie auf Warnungen, um den Warnschwellenwert für die Belegung dieses Volumes zu ändern." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "Die VLDB ist möglicherweise nicht auf dem neuesten Stand; in diesem Fall verwenden Sie den Befehl VLDB synchronisieren, um diese zu aktualisieren." - IDS_ALERT_FIX_NO_SVRENT_SET - "Prüfen Sie den Server und die Partition, um sicherzustellen, daß diese einwandfrei funktionieren." - IDS_ALERT_FIX_STOPPED "Klicken Sie auf Protokoll anzeigen, um das Service-Protokoll für diesen Service anzuzeigen." - IDS_ALERT_FIX_NO_SVRENT_AGG - "Prüfen Sie den Server, um sicherzustellen, daß die Partition exportiert wurde und einwandfrei funktioniert." - IDS_ALERT_FIX_BADCREDS "Klicken Sie auf Authentifizierung, um neue AFS-Token zu erhalten." - IDS_ALERT_FIX_AGG_ALLOC "Verkleinern Sie die Quote für Volumes auf dieser Partition, oder verschieben Sie ein oder mehrere Volumes auf eine andere Partition." - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "Erneut &versuchen" - IDS_ALERT_BUTTON_WARNINGS "&Warnungen..." - IDS_ALERT_BUTTON_VIEWLOG "Protokoll &anzeigen" - IDS_ALERT_BUTTON_SHOWME "A&nzeigen" - IDS_ALERT_BUTTON_GETCREDS "Au&thentifizierung" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "Es wurde keine Zelle angegeben. Sie müssen die AFS-Zelle angeben, mit der Sie arbeiten möchten, um den AFS Server Manager zu verwenden. Wählen Sie eine Zelle aus, indem Sie das Menüelement ""Öffnen..."" im Menü ""Zelle"" auswählen." - IDS_ERROR_REFRESH_CELLSERVERS - "Die Liste der Server konnte für die Zelle %1 nicht abgerufen werden.\n\nFehler: %2" - IDS_ERROR_CANT_OPEN_CELL - "Der AFS Server Manager konnte keine Server in der Zelle %1 erreichen.\n\nBitte überprüfen Sie, ob der Name der Zelle richtig eingegeben wurde." - IDS_ERROR_REFRESH_AGGREGATES - "Die Liste der Partitionen konnte für Server %1 nicht abgerufen werden.\n\nFehler: %2" - IDS_ERROR_REFRESH_SERVER_STATUS - "Der aktuelle Status von Server %1 konnte nicht abgerufen werden." - IDS_ERROR_CHANGE_SERVER_STATUS - "Der AFS Server Manager konnte die Merkmale für Server %1 nicht ändern." - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "Der aktuelle Status von Partition %2 auf Server %1 konnte nicht abgerufen werden." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "Der aktuelle Status von Volume %3 (Server %1, Partition %2) konnte nicht abgerufen werden." - IDS_ERROR_REFRESH_SERVICE_STATUS - "Der aktuelle Status von Service %2 auf Server %1 konnte nicht ermittelt werden." - IDS_ERROR_MOVE_FILESET "Der AFS Server Manager konnte Volume %3 nicht von Partition %2 des Servers %1 zu Partition %5 auf Server %4 verschieben." - IDS_ERROR_VIEW_LOGFILE "Die Datei %2 konnte von Server %1 nicht gelesen werden.\n\nPrüfen Sie, ob der Name der Datei richtig eingegeben wurde, und ob Sie über ausreichende Berechtigungen verfügen, um die Datei anzuzeigen." - IDS_ERROR_NOT_REPLICATED - "Der Nachbildungsstatus von Volume %1 konnte nicht ermittelt werden." - IDS_ERROR_CANT_CREATE_FILESET - "Der AFS Server Manager konnte Volume %3 auf Partition %2 des Servers %1 nicht erstellen." - IDS_ERROR_CANT_DELETE_FILESET - "Der AFS Server Manager konnte Volume %3 (Partition %2 von Server %1) nicht löschen." - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "Der AFS Server Manager konnte keinen VLDB-Eintrag für Volume %3 auf Partition %2 des Servers %1 erstellen." - IDS_ERROR_CANT_SET_FILESET_QUOTA - "Der AFS Server Manager konnte die Quote für Volume %3 auf Partition %2 des Servers %1 nicht ändern." - IDS_ERROR_CANT_CREATE_SERVER - "Der AFS Server Manager konnte den angeforderten Server-Eintrag in Zelle %1 nicht erstellen." - IDS_ERROR_CANT_PING_SERVER - "Der AFS Server Manager konnte die IP-Adresse von Server %1 nicht ermitteln." - IDS_ERROR_CANT_DELETE_SERVER - "Der AFS Server Manager konnte Server %1 nicht löschen." - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "Server %1 konnte nicht gelöscht werden, da er weiterhin ein oder mehrere Volumes enthält. Ein Server kann nur gelöscht werden, wenn er keine Volumes enthält." - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "Der AFS Server Manager konnte die Merkmale für Partition %2 auf Server %1 nicht ändern." - IDS_ERROR_CHANGE_SERVICE_STATUS - "Der AFS Server Manager konnte die Merkmale für Service %2 auf Server %1 nicht ändern." - IDS_ERROR_CANT_START_SERVICE - "Der AFS Server Manager konnte Service %2 auf Server %1 nicht starten." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "Der AFS Server Manager konnte Service %2 auf Server %1 nicht stoppen." - IDS_ERROR_CANT_RESTART_SERVICE - "Der AFS Server Manager konnte Service %2 auf Server %1 nicht stoppen und erneut starten." - IDS_ERROR_CHANGE_REPLICA_STATUS - "Der AFS Server Manager konnte die Nachbildungsmerkmale für Volume %3 auf Partition %2 des Servers %1 nicht ändern." - IDS_ERROR_CANT_SYNCVLDB "Der AFS Server Manager konnte die VLDB nicht aktualisieren." - IDS_ERROR_CANT_CREATE_REPLICA - "Der AFS Server Manager konnte kein Replikat von Volume %3 auf Partition %2 des Servers %1 erstellen." - IDS_ERROR_CANT_INSTALL_FILE - "Der AFS Server Manager konnte die Datei %2 auf Server %1 nicht installieren." - IDS_ERROR_CANT_UNINSTALL_FILE - "Der AFS Server Manager konnte die Datei %2 von Server %1 nicht deinstallieren." - IDS_ERROR_CANT_PRUNE_FILES - "Der AFS Server Manager konnte die angeforderten Dateien nicht von Server %1 entfernen." - IDS_ERROR_CANT_RENAME_FILESET - "Der AFS Server Manager konnte Volume %1 nicht in ""%2"" umbenennen." - IDS_ERROR_CANT_CREATE_SERVICE - "Der AFS Server Manager konnte Service %2 nicht auf Server %1 erstellen." - IDS_ERROR_CANT_DELETE_SERVICE - "Der AFS Server Manager konnte Service %2 nicht von Server %1 löschen." - IDS_ERROR_CANT_RELEASE_FILESET - "Der AFS Server Manager konnte das nachgebildete Volume %3 nicht freigeben." - IDS_ERROR_CANT_UPDATE_FILESET - "Der AFS Server Manager konnte das Volume-Replikat %3 auf Partition %1 des Servers %2 nicht aktualisieren." - IDS_ERROR_CANT_UPDATE_ALL - "Der AFS Server Manager konnte Replikate von Volume %3 nicht aktualisieren." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "Der AFS Server Manager konnte die Liste der Administratoren für Server %1 nicht lesen." - IDS_ERROR_CANT_LOAD_KEYLIST - "Der AFS Server Manager konnte die Liste der Server-Schlüssel für Server %1 nicht lesen." - IDS_ERROR_CANT_CREATE_KEY - "Der AFS Server Manager konnte keinen neuen Server-Schlüssel für Server %1 erstellen." - IDS_ERROR_CANT_SAVE_ADMLIST - "Der AFS Server Manager konnte die Liste der Administratoren für Server %1 nicht ändern." - IDS_ERROR_CANT_CLONE "Der AFS Server Manager konnte keine Sicherungskopie von Volume %3 auf Partition %2 des Servers %1 erstellen." - IDS_ERROR_CANT_CLONESYS "Der AFS Server Manager konnte keine der angeforderten Sicherungs-Volumes erstellen." - IDS_ERROR_CANT_DUMP_FILESET - "Der AFS Server Manager konnte keinen Speicherauszug von Volume %3 (Server %1, Partition %2) in Datei %4 erstellen." - IDS_ERROR_CANT_RESTORE_FILESET - "Der AFS Server Manager konnte Datei %4 auf Volume %3 (Server %1, Partition %2) nicht wiederherstellen." - IDS_ERROR_CANT_SET_RESTART_TIMES - "Der AFS Server Manager konnte die Neustartzeiten für Services auf Server %1 nicht ändern." - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "Der AFS Server Manager konnte Volume %3 von Partition %2 des Servers %1 nicht löschen.\n\nVolume %3 kann nicht gelöscht werden, bevor alle Replikate gelöscht wurden." - IDS_CMDLINE_TITLE "Fehler - AFS Server Manager" - IDS_CMDLINE_SYNTAX "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig." - IDS_CMDLINE_UNRECOGNIZED - "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nParameter ""%1"" wurde nicht erkannt." - IDS_CMDLINE_DUPLICATE "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nDer Parameter ""%1"" wurde mehrmals angegeben." - IDS_CMDLINE_UNEXPECTVALUE - "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nDem Parameter ""%1"" darf kein Wert zugewiesen werden." - IDS_CMDLINE_MISSINGVAL "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nDem Parameter ""%1"" muß ein Wert folgen." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nDer Parameter ""/SUBSET"" kann nur zusammen mit dem Parameter ""/CELL"" angegeben werden." - IDS_CMDLINE_INVALIDSUBSET - "Die von Ihnen angegebene Server-Untergruppe, ""%2"", wurde nicht für die Zelle %1 definiert." - IDS_CMDLINE_SERVERNOTCELL - "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nDer Parameter ""/SERVER"" kann nur zusammen mit dem Parameter ""/CELL"" angegeben werden." - IDS_CMDLINE_RESET_TITLE "AFS Server Manager" - IDS_CMDLINE_RESET_DESC "Der AFS Server Manager hat die angegebenen Einstellungen gelöscht." - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "Der AFS Server Manager konnte die VLDB nicht mit Partition %2 von Server %1 synchronisieren, da die Partition entweder nicht vorhanden ist oder nicht exportiert wurde.\n\nWenn Sie diese Partition vom Server %1 entfernen möchten, müssen Sie die VLDB-Einträge der Volumes löschen, die darauf verweisen." - IDS_CMDLINE_USERPASSWORD - "Die von Ihnen für den AFS Server Manager angegebene Befehlszeile ist ungültig.\n\nUm neue AFS-Token zu erhalten, müssen die Parameter ""/USER"" und ""/PASSWORD"" angegeben werden." - IDS_ERROR_CANT_DELETE_KEY - "Der AFS Server Manager konnte Server-Schlüssel %2 nicht von Server %1 löschen." - IDS_ERROR_CANT_GETRANDOMKEY - "Der AFS Server Manager konnte keinen wahlfreien Schlüssel für Server %1 erstellen." - IDS_ERROR_CANT_EXECUTE_COMMAND - "Der AFS Server Manager konnte den folgenden Befehl nicht auf Server %1 ausführen:\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "Der AFS Server Manager hat die Wiederherstellung erfolgreich abgeschlossen, konnte jedoch die Protokolldatei nicht abrufen, die die einzelnen Ergebnisse der Wiederherstellung beschreibt." - IDS_ERROR_CANT_SALVAGE "Der AFS Server Manager konnte die angeforderte Wiederherstellung nicht durchführen." - IDS_ERROR_CANT_AUTH_ON "Der AFS Server Manager konnte die Überprüfung der Authentifizierung für Server %1 nicht aktivieren." - IDS_ERROR_CANT_AUTH_OFF "Der AFS Server Manager konnte die Überprüfung der Authentifizierung für Server %1 nicht inaktivieren." - IDS_ERROR_CANT_LOAD_HOSTLIST - "Der AFS Server Manager konnte die Liste der Datenbank-Host-Server nicht von Server %1 lesen." - IDS_ERROR_CANT_SAVE_HOSTLIST - "Der AFS Server Manager konnte die Liste der Datenbank-Host-Server auf Server %1 nicht ändern." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "Der AFS Server Manager konnte nicht gestartet werden, da das AFS Control Center nicht ordnungsgemäß installiert wurde.\n\nSie müssen das AFS Control Center möglicherweise erneut installieren." - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "Der AFS Server Manager konnte aufgrund eines unbekannten Problems nicht gestartet werden.\n\nSie müssen das AFS Control Center möglicherweise erneut installieren." - IDS_ERROR_CANT_CHANGEADDR - "Der AFS Server Manager konnte die IP-Adresse in der VLDB für Server %1 nicht ändern." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "Einfach" - IDS_SERVICETYPE_CRON "Cron" - IDS_SERVICESTATE_STOPPED "Gestoppt" - IDS_SERVICESTATE_STOPPING "Wird gestoppt" - IDS_SERVICESTATE_STARTING "Wird gestartet" - IDS_SERVICESTATE_RUNNING "Aktiv" - IDS_SERVICETYPE_FS_LONG "FS (Dateisystem)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "Alle Services in Zelle %1:" - IDS_SERVICE_STARTDATE "%1 wurde gestartet" - IDS_SERVICE_STOPDATE "%1 wurde gestoppt" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/en_US/svrmgr.rc b/src/WINNT/afssvrmgr/lang/en_US/svrmgr.rc deleted file mode 100644 index 60b509370..000000000 --- a/src/WINNT/afssvrmgr/lang/en_US/svrmgr.rc +++ /dev/null @@ -1,3004 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Manager" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - RIGHTMARGIN, 165 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 253 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 152 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 196 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 291 - TOPMARGIN, 7 - BOTTOMMARGIN, 140 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 276 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 250 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 221 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Cell" - BEGIN - MENUITEM "&Select...", M_CELL_OPEN - MENUITEM "&Authentication...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "E&xit", M_EXIT - END - POPUP "&View" - BEGIN - POPUP "&Servers" - BEGIN - MENUITEM "Lar&ge Icons", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "S&mall Icons", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "&Details", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "&All Icons", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "&Status Only", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "&Quick-View Pane" - BEGIN - MENUITEM "&None", M_DIVIDE_NONE, CHECKED - MENUITEM "Split &Vertically", M_DIVIDE_H, CHECKED - MENUITEM "Split &Horizontally", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "O&perations In Progress", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Monitored Servers...", M_SUBSET - MENUITEM "&Columns...", M_COLUMNS - MENUITEM "&Options...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL - END - POPUP "&Help" - BEGIN - MENUITEM "&Contents", M_HELP - MENUITEM "&Find Command...", M_HELP_FIND - MENUITEM "&Look Up Error Code...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "&About AFS Server Manager...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "&Create Volume...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "&Backup Volumes...", M_SET_CLONE - MENUITEM "&Unlock All Volumes", M_SET_UNLOCK - MENUITEM "S&ynchronize VLDB...", M_SYNCVLDB - MENUITEM "Salva&ge Volumes...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "Re&fresh", M_REFRESH - MENUITEM "P&roperties", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "&Start", M_SVC_START - MENUITEM "&Stop", M_SVC_STOP - MENUITEM "&Restart", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "&View Log File", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "De&lete", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "Re&fresh", M_REFRESH - MENUITEM "P&roperties", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&All Icons", M_VIEW_TWOICONS, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Create Volume...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&All Icons", M_VIEW_TWOICONS, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Create Service...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "Re&plication...", M_SET_REPLICATION - MENUITEM "Relea&se Now", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "&Backup...", M_SET_CLONE - MENUITEM "&Dump to File...", M_SET_DUMP - MENUITEM "&Restore from File...", M_SET_RESTORE - MENUITEM "Set &Quota...", M_SET_SETQUOTA - MENUITEM "Salva&ge...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Move To...", M_SET_MOVETO - MENUITEM "Re&name...", M_SET_RENAME - MENUITEM "De&lete", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Loc&k", M_SET_LOCK - MENUITEM "&Unlock", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "Re&fresh", M_REFRESH - MENUITEM "P&roperties", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "&Open Server Window", M_SVR_OPEN - MENUITEM "&Close Server Window", M_SVR_CLOSE - MENUITEM "&Monitor this Server", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "Edit Server &Security...", M_SVR_SECURITY - MENUITEM "Manage Database &Hosts...", M_SVR_HOSTS - MENUITEM "&Backup Volumes...", M_SET_CLONE - MENUITEM "&Unlock All Volumes", M_SET_UNLOCK - MENUITEM "S&ynchronize VLDB...", M_SYNCVLDB - MENUITEM "Salva&ge Volumes...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Install File...", M_SVR_INSTALL - MENUITEM "&Uninstall File...", M_SVR_UNINSTALL - MENUITEM "&Prune Old Files...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "Get File Da&tes...", M_SVR_GETDATES - MENUITEM "&View Log File...", M_VIEWLOG - MENUITEM "E&xecute Command...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "Re&fresh", M_REFRESH - MENUITEM "P&roperties", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "Lar&ge Icons", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "S&mall Icons", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "&All Icons", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "&Status Only", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Monitored Servers...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "&Unlock All Volumes", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "&Close All", M_SVR_CLOSEALL - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "By &Volume", M_SET_VIEW_REPORT, CHECKED - MENUITEM "By &Partition", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "No &Details", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&All Icons", M_VIEW_TWOICONS, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Create Volume...", M_SET_CREATE - MENUITEM "&Restore from File...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "&Backup Volumes...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "&Unlock All", M_SET_UNLOCK - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Columns...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "&Restart", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "&View Log File", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "Re&fresh", M_REFRESH - MENUITEM "P&roperties", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "&Move Here...", M_SET_MOVEHERE - MENUITEM "&Replicate Here...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "&Cancel", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Services:",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Create...",IDC_SVC_CREATE,56,80,39,12 - PUSHBUTTON "De&lete",IDC_SVC_DELETE,98,80,39,12 - PUSHBUTTON "&Restart",IDC_SVC_RESTART,140,80,39,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Partitions:",IDC_AGG_DESC,0,5,165,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,17,165, - 53,WS_EX_STATICEDGE - PUSHBUTTON "&Create Volume...",IDC_AGG_CREATESET,102,72,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 194, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Volumes:",IDC_SET_DESC,0,5,194,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,194, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Create...",IDC_SET_CREATE,6,80,39,12 - PUSHBUTTON "De&lete",IDC_SET_DELETE,48,80,39,12 - PUSHBUTTON "&Replication...",IDC_SET_REP,90,80,51,12 - PUSHBUTTON "Set &Quota...",IDC_SET_SETQUOTA,144,80,49,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Add Administrator",IDC_LIST_ADD,72,160,65,14 - PUSHBUTTON "&Remove Administrator",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "Administrators for server %1:",IDC_LIST_NAME,5,7,216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "ID:",IDC_STATIC,5,30,31,8 - LTEXT "(querying)",IDC_AGG_ID,38,30,214,8 - LTEXT "Device:",IDC_STATIC,5,46,31,8 - LTEXT "(querying)",IDC_AGG_DEVICE,38,46,214,8 - LTEXT "Volumes:",IDC_STATIC,5,62,31,8 - LTEXT "(querying)",IDC_AGG_FILESETS,38,62,214,8 - CONTROL "Display a &warning if combined volume quota exceed capacity", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 38,76,224,10 - LTEXT "Usage:",IDC_STATIC,5,90,31,8 - LTEXT "(querying)",IDC_AGG_USAGE,38,90,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,103,224,8, - WS_EX_STATICEDGE - CONTROL "Display a &warning if the partition's usage exceeds", - IDC_AGG_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38, - 116,214,10 - CONTROL "the &default threshold for this server", - IDC_AGG_WARN_AGGFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,49,131,203,9 - CONTROL "a &threshold of",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,62,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,112,143,29,12, - ES_AUTOHSCROLL - LTEXT "% of its size",IDC_AGG_WARN_AGGFULL_DESC,152,145,100,8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,21,20 - LTEXT "Partition %2 (server %1)",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "IP Address:",IDC_STATIC,5,29,43,8 - LISTBOX IDC_SVR_ADDRESSES,53,29,70,12,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "Change &Addresses...",IDC_SVR_CHANGEADDR,144,27,77,12 - PUSHBUTTON "&Require Authentication",IDC_SVR_AUTH_YES,41,81,84,12 - PUSHBUTTON "Allow &Unathenticated",IDC_SVR_AUTH_NO,129,81,80,12 - LTEXT "Number of partitions:",IDC_STATIC,11,131,90,8 - LTEXT "(querying)",IDC_SVR_NUMAGGREGATES,108,131,99,8 - LTEXT "Total capacity:",IDC_STATIC,11,148,48,8 - LTEXT "(querying)",IDC_SVR_CAPACITY,108,148,99,8 - LTEXT "Combined volume quota:",IDC_STATIC,11,165,79,8 - LTEXT "(querying)",IDC_SVR_ALLOCATION,108,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(server name)",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "Security",IDC_STATIC,5,52,216,52 - GROUPBOX "Storage",IDC_STATIC,5,115,216,68 - LTEXT "You can require that all access to this server be authenticated.", - IDC_STATIC,11,67,198,8 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 221, 158 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "any partition on this server becomes", - IDC_SVR_WARN_AGGFULL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,18,133,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,148,16,24,12,ES_AUTOHSCROLL - LTEXT "% full",IDC_STATIC,188,18,28,8 - CONTROL "any volume on this server becomes",IDC_SVR_WARN_SETFULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,32,125,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,144,30,24,12,ES_AUTOHSCROLL - LTEXT "% full",IDC_STATIC,184,32,24,8 - CONTROL "the combined quota on any partition exceed its capacity", - IDC_SVR_WARN_AGGALLOC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,46,200,9 - CONTROL "any service on this server stops running", - IDC_SVR_WARN_SVCSTOP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,60,195,9 - CONTROL "any volume on this server has no VLDB entry", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,74,195,9 - CONTROL "VLDB references any offline partition on this server", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,88,195,9 - CONTROL "VLDB references any offline volume on this server", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,103,195,9 - CONTROL "Refresh server information every",IDC_SVR_AUTOREFRESH, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,142,116,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,123,140,27,13,ES_AUTOHSCROLL - LTEXT "minutes",IDC_STATIC,164,142,25,8 - LTEXT "Display a warning if",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "&View Service Log",IDC_SVC_VIEWLOG,55,182,66,14 - PUSHBUTTON "&Start Now",IDC_SVC_START,126,182,43,14 - PUSHBUTTON "Sto&p Now",IDC_SVC_STOP,169,182,43,14 - CONTROL "Display a &warning if this service ever stops", - IDC_SVC_WARNSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Service %2 (server %1)",IDC_SVC_NAME,52,13,168,8 - LTEXT "Type:",IDC_STATIC,5,29,44,8 - LTEXT "(querying)",IDC_SVC_TYPE,52,29,168,8 - LTEXT "Parameters:",IDC_STATIC,5,45,44,8 - EDITTEXT IDC_SVC_PARAMS,52,45,168,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Notifier:",IDC_STATIC,5,61,44,8 - LTEXT "(querying)",IDC_SVC_NOTIFIER,52,61,168,8 - LTEXT "Last Started:",IDC_STATIC,5,77,44,8 - LTEXT "(querying)",IDC_SVC_STARTDATE,52,77,168,8 - LTEXT "Last Stopped:",IDC_STATIC,5,93,44,8 - LTEXT "(querying)",IDC_SVC_STOPDATE,52,93,168,8 - LTEXT "Last Failure:",IDC_STATIC,5,109,44,8 - EDITTEXT IDC_SVC_LASTERROR,52,109,168,13,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "Service Status",IDC_STATIC,5,127,215,75 - LTEXT "This current status of this service is being determined...", - IDC_SVC_STATUS,11,142,200,8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Volume ID:",IDC_STATIC,5,30,39,8 - LTEXT "(unknown)",IDC_SET_ID,49,30,219,8 - LTEXT "Created:",IDC_STATIC,5,46,39,8 - LTEXT "(querying)",IDC_SET_CREATEDATE,49,46,219,8 - LTEXT "Updated:",IDC_STATIC,5,62,39,8 - LTEXT "(querying)",IDC_SET_UPDATEDATE,49,62,112,8 - LTEXT "Accessed:",IDC_STATIC,5,78,39,8 - LTEXT "(querying)",IDC_SET_ACCESSDATE,49,78,219,8 - LTEXT "Backed Up:",IDC_STATIC,5,94,39,8 - LTEXT "(querying)",IDC_SET_BACKUPDATE,49,94,219,8 - LTEXT "File Count:",IDC_STATIC,5,110,34,8 - LTEXT "(querying)",IDC_SET_FILES,49,110,219,8 - LTEXT "Status:",IDC_STATIC,5,126,39,8 - LTEXT "(querying)",IDC_SET_STATUS,49,126,115,8 - PUSHBUTTON "&Lock",IDC_SET_LOCK,169,124,49,12 - PUSHBUTTON "&Unlock",IDC_SET_UNLOCK,219,124,49,12 - LTEXT "Usage:",IDC_STATIC,5,142,31,8 - LTEXT "(querying)",IDC_SET_USAGE,49,142,136,8 - PUSHBUTTON "Set &Quota...",IDC_SET_QUOTA,219,140,49,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,219,8, - WS_EX_STATICEDGE - CONTROL "Display a &warning if this volume's usage exceeds", - IDC_SET_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,49, - 170,219,10 - CONTROL "the &default threshold for this server (%1%% of its size)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,61,185,207,9 - CONTROL "a &threshold of",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,61,199,62,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,123,197,29,12, - ES_AUTOHSCROLL - LTEXT "% of its size",IDC_SET_WARN_SETFULL_DESC,163,199,105,8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "Volume %3 (server %1, partition %2)",IDC_SET_NAME,49,14, - 219,8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS Server Manager" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Selected Cell:",IDC_STATIC,2,8,55,8 - LTEXT "(cell name will be placed here)",IDC_CELL,62,8,208,9 - LTEXT "AFS Tokens:",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1 (tokens will expire %3)",IDC_AFS_ID,62,19,208,9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Server" -CLASS "ServerWindowClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Server:",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,52,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ser&vice:",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,52,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Command:",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,52,68,168,13,ES_AUTOHSCROLL - LTEXT "&Parameters:",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,52,86,168,13,ES_AUTOHSCROLL - LTEXT "&Notifier:",IDC_STATIC,5,105,44,8 - EDITTEXT IDC_SVC_NOTIFIER,52,103,168,13,ES_AUTOHSCROLL - LTEXT "&Log File:",IDC_STATIC,5,122,44,8 - EDITTEXT IDC_SVC_LOGFILE,52,120,168,13,ES_AUTOHSCROLL - CONTROL "S&imple (runs continuously)",IDC_SVC_TYPE_SIMPLE,"Button", - BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "S&tart this service now",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "&FS (filesystem)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "&Cron (runs at specified intervals)",IDC_SVC_TYPE_CRON, - "Button",BS_AUTORADIOBUTTON,11,195,201,10 - LTEXT "&When to run:",IDC_STATIC,23,209,41,8 - COMBOBOX IDC_SVC_RUNDAY,70,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "at",IDC_STATIC,143,209,8,8 - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,154,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "New service",IDC_SVC_DESC,52,13,168,8 - GROUPBOX "Service Type",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "&Release Now",IDC_SET_RELEASE,11,143,52,14 - PUSHBUTTON "&Create...",IDC_SET_REPSITE_ADD,129,143,38,14 - PUSHBUTTON "De&lete",IDC_SET_REPSITE_DELETE,172,143,38,14 - LTEXT "Server:",-1,11,31,37,8 - LTEXT "(server name)",IDC_SET_SERVER,55,31,147,8 - LTEXT "Partition:",-1,11,44,37,8 - LTEXT "(partition name)",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "Volume:",-1,11,18,37,8 - LTEXT "(volume name)",IDC_SET_NAME,55,18,147,8 - GROUPBOX "Read/Write Volume",-1,5,5,211,56 - GROUPBOX "Volume Replicas",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 257 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select Cell - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Cell:",IDC_STATIC,4,24,16,8 - COMBOBOX IDC_OPENCELL_CELL,24,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "AFS Authentication",IDC_STATIC,4,44,211,92 - LTEXT "AFS &Identity:",IDC_STATIC,22,100,55,8 - EDITTEXT IDC_OPENCELL_ID,80,98,129,14,ES_AUTOHSCROLL - LTEXT "AFS &Password:",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,129,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "Ad&vanced >>",IDC_ADVANCED,4,146,53,14 - DEFPUSHBUTTON "OK",IDOK,86,146,41,14 - PUSHBUTTON "Cancel",IDCANCEL,130,146,41,14 - PUSHBUTTON "&Help",9,174,146,41,14 - CONTROL "Monitor a&ll servers in this cell",IDC_MON_ALL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,204,185,9 - CONTROL "&Monitor only one server:",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,219,110,10 - EDITTEXT IDC_MON_SERVER,125,218,83,13,ES_AUTOHSCROLL - CONTROL "Monitor only servers in &subset:",IDC_MON_SOME,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,235,110,10 - COMBOBOX IDC_MON_SUBSET,125,233,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Select the AFS cell with which you would like to work.", - IDC_STATIC,4,7,200,8 - GROUPBOX "Monitor Servers",IDC_ADVANCED_GROUP,4,169,211,84 - LTEXT "For faster performance, you can choose to monitor only a subset of the servers available in this cell.", - IDC_STATIC,10,182,199,17 - LTEXT "(querying...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "To administer a cell, you must re-enter your AFS password:", - IDC_STATIC,10,85,196,8 - LTEXT "Your current AFS tokens within the selected cell:", - IDC_STATIC,10,57,196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Warning - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Continue waiting until the task completes normally", - IDC_TIMEOUT_WAIT,"Button",BS_AUTORADIOBUTTON,24,87,208, - 10 - CONTROL "&Terminate the task",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,24,101,208,10 - DEFPUSHBUTTON "OK",IDOK,93,139,50,14 - LTEXT "Elapsed time that the task has been running:", - IDC_STATIC,4,119,142,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,151,119,29,8 - LTEXT "The AFS Server Manager has been waiting an unexpectedly long time for a network task to complete.", - IDC_STATIC,4,7,228,18 - LTEXT "You can continue to let the task run (recommended), or if you are confident that the task will never complete, you can allow the AFS Server Manager to terminate the task.", - IDC_STATIC,4,30,228,26 - LTEXT "Please note that the task is still in progress even while this window is displayed; if the task completes, this window will close automatically.", - IDC_STATIC,4,63,228,17 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Columns" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Select columns to display when listing:",IDC_STATIC,5, - 7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Available &Columns:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Columns to D&isplay:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Add >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< &Remove",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "Move &Up",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "Move &Down",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "List Columns",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Refreshing - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "0%% complete",IDC_REFRESH_PERCENT,4,49,216,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,216,8 - LTEXT "Please Wait...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "&Skip",IDC_REFRESH_SKIP,222,58,38,12,NOT WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Create Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Name:",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,46,28,116,14,ES_AUTOHSCROLL - LTEXT "&Quota:",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,46,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,90,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Backup:",IDC_STATIC,4,66,39,8 - CONTROL "C&reate a backup version of this volume as well", - IDC_SET_CLONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46, - 66,162,8 - LTEXT "&Server:",IDC_STATIC,4,84,39,8 - COMBOBOX IDC_SET_SERVER,46,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partition:",IDC_STATIC,4,102,39,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,102,271, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,156,191,50,14 - PUSHBUTTON "Cancel",IDCANCEL,211,191,50,14 - PUSHBUTTON "&Help",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "New volume",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Delete Volume" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Cancel",IDCANCEL,169,84,50,14 - PUSHBUTTON "OK",IDOK,115,84,50,14 - PUSHBUTTON "&Help",9,223,84,50,14 - CONTROL "&Delete volume %3 from server %1, partition %2", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 46,45,227,10 - CONTROL "Delete &VLDB entry for volume %3",IDC_DELSET_VLDB, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,60,227,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "Caution!\n\nThis operation will cause volume %3 to be permanently deleted.", - IDC_DELSET_DESC,31,7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Backup Volume - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,183,67,50,14 - PUSHBUTTON "Cancel",IDCANCEL,237,67,50,14 - PUSHBUTTON "&Help",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "A volume backup acts like a read-only copy of that volume. A read/write volume can have only one backup version.", - IDC_STATIC,34,9,307,17 - LTEXT "Click OK to create a backup of the %3 volume on server %1, partition %2. If a backup of this volume already exists, the backup will be updated.", - IDC_CLONE_DESC,34,32,307,24 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Known Problems",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Service %2 (server %1)",IDC_PROBLEM_TITLE,52,13,168,8 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Known Problems",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Known Problems",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Partition %2 (server %1)",IDC_PROBLEM_TITLE,38,14,214,8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Known Problems",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Volume %3 (server %1, partition %2)",IDC_PROBLEM_TITLE, - 49,14,219,8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Move Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,115,156,50,14 - PUSHBUTTON "Cancel",IDCANCEL,169,156,50,14 - PUSHBUTTON "&Help",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "&Move volume to:",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Moving Volume - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Moving volume %3 from partition %2 on server %1 to partition %5 on server %4...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "View Log File" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "View log file on &server:",IDC_STATIC,4,45,73,8 - COMBOBOX IDC_VIEWLOG_SERVER,82,43,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&File on server to view:",IDC_STATIC,4,64,73,8 - EDITTEXT IDC_VIEWLOG_FILENAME,82,62,191,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,169,88,50,14 - PUSHBUTTON "Cancel",IDCANCEL,223,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,20,20 - LTEXT "Please enter the full path of the log file which you wish to view.", - IDC_VIEWLOG_DESC,31,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "View Log File" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "File contents:",IDC_SVC_VIEWLOG_CONTENTS,4,41,277,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Save &As...",IDC_VIEWLOG_SAVEAS,173,167,53,14 - DEFPUSHBUTTON "&Close",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "Log file [for service %2] on server %1", - IDC_SVC_VIEWLOG_DESC,33,7,248,8 - LTEXT "Filename on server: %1",IDC_SVC_VIEWLOG_FILENAME,33,23, - 248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Set Volume Quota" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Current Quota:",IDC_STATIC,4,49,47,8 - LTEXT "(unknown)",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "New &Quota:",IDC_STATIC,4,81,47,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,109,112,50,14 - PUSHBUTTON "Cancel",IDCANCEL,163,112,50,14 - PUSHBUTTON "&Help",9,217,112,50,14 - PUSHBUTTON "&Properties...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "Partition:",IDC_STATIC,4,30,47,8 - LTEXT "Partition %2 of server %1",IDC_SET_AGGREGATE,59,30,141, - 8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Volume %1",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Operations In Progress - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "The following operations are currently in progress:", - IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Synchronize VLDB" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,107,81,50,14 - PUSHBUTTON "Cancel",IDCANCEL,161,81,50,14 - PUSHBUTTON "&Help",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "(set at runtime)",IDC_SYNC_DESC,37,4,228,32 - LTEXT "(set at runtime)",IDC_SYNC_DESC2,37,44,228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Replicate Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,115,153,50,14 - PUSHBUTTON "Cancel",IDCANCEL,169,153,50,14 - PUSHBUTTON "&Help",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "New replica of volume %3",IDC_SET_NAME,31,12,242,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "&Create a new replica of this volume on:",IDC_STATIC,4, - 35,125,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 248, 156 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Install File" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Source &file:",IDC_STATIC,4,74,49,8 - EDITTEXT IDC_FILENAME,56,72,135,14,ES_AUTOHSCROLL - PUSHBUTTON "&Browse...",IDC_BROWSE,194,72,50,14 - LTEXT "Target &server:",IDC_STATIC,4,94,45,8 - COMBOBOX IDC_SERVER,56,92,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Target &name:",IDC_STATIC,4,114,49,8 - EDITTEXT IDC_DIRECTORY,56,112,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,138,50,14 - PUSHBUTTON "Cancel",IDCANCEL,140,138,50,14 - PUSHBUTTON "&Help",9,194,138,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,20,20 - LTEXT "Install file on server",IDC_STATIC,32,12,127,8 - LTEXT "(text set at runtime)\n(text set at runtime)\n(text set at runtime)\n(text set at runtime)", - IDC_INSTALL_DESC,4,29,240,33 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Uninstall File" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,4,66,35,8 - COMBOBOX IDC_SERVER,41,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Target &file:",IDC_STATIC,4,85,35,8 - EDITTEXT IDC_FILENAME,41,83,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,88,121,50,14 - PUSHBUTTON "Cancel",IDCANCEL,141,121,50,14 - PUSHBUTTON "&Help",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "Uninstall file from server",IDC_STATIC,32,12,127,8 - LTEXT "This operation allows you to restore a previously-installed copy of a file on a particular server. If no previously-installed copy of the selected file exists, the file will be removed.", - IDC_STATIC,4,29,240,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 200, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Prune Old Files" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Server:",-1,4,56,44,8 - COMBOBOX IDC_SERVER,53,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Delete all &core files",IDC_OP_DELETE_CORE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,53,73,143,10 - CONTROL "Delete all .&BAK files (file backups)", - IDC_OP_DELETE_BAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 53,84,143,10 - CONTROL "Delete all .&OLD files (older file backups)", - IDC_OP_DELETE_OLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 53,95,143,10 - DEFPUSHBUTTON "OK",IDOK,39,123,50,14 - PUSHBUTTON "Cancel",IDCANCEL,93,123,50,14 - PUSHBUTTON "&Help",9,146,123,50,14 - ICON IDI_PRUNE,-1,4,4,20,20 - LTEXT "Prune old files from server",-1,32,12,101,8 - LTEXT "This operation deletes backup copies of files installed on a particular server.", - -1,4,29,192,16 - LTEXT "Files to delete:",-1,4,73,45,8 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Rename Volume" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Old name:",IDC_STATIC,31,67,39,8 - EDITTEXT IDC_RENSET_OLD,74,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&New name:",IDC_STATIC,31,85,39,8 - EDITTEXT IDC_RENSET_NEW,74,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,115,115,50,14 - PUSHBUTTON "Cancel",IDCANCEL,169,115,50,14 - PUSHBUTTON "Help",9,223,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "To rename volume %3, enter a new name below. Renaming automatically changes the name of a volume's backup and all its replicas.\n\nCaution: if you rename a mounted volume, you will have to delete and recreate its mount points.", - IDC_RENSET_DESC,31,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 277, 68 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Delete Service" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Cancel",IDCANCEL,169,50,50,14 - PUSHBUTTON "OK",IDOK,115,50,50,14 - PUSHBUTTON "Help",9,223,50,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "Caution!\n\nThis operation will cause service %2 to be stopped and deleted from server %1.", - IDC_DELSVC_DESC,31,7,242,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Get File Dates" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",-1,4,56,42,8 - COMBOBOX IDC_SERVER,50,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&File to query:",-1,4,75,42,8 - EDITTEXT IDC_FILENAME,50,73,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,107,50,14 - PUSHBUTTON "Cancel",IDCANCEL,140,107,50,14 - PUSHBUTTON "&Help",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "Get dates of files on server",-1,32,12,127,8 - LTEXT "This operation obtains the date that a file and its backups (if any exist) were last modified.", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Get File Dates - Results" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Server:",IDC_STATIC,4,30,39,8 - LTEXT "(set at runtime)",IDC_SERVER,45,30,137,8 - LTEXT "Filename:",IDC_STATIC,4,45,39,8 - LTEXT "(set at runtime)",IDC_FILENAME,45,45,137,8 - LTEXT "File date:",IDC_STATIC,4,60,39,8 - LTEXT "(unknown; file could not be found)",IDC_DATE_FILE,45,60, - 199,8 - LTEXT ".BAK date:",IDC_STATIC,4,75,39,8 - LTEXT "(unknown; file could not be found)",IDC_DATE_BAK,45,75, - 199,8 - LTEXT ".OLD date:",IDC_STATIC,4,90,39,8 - LTEXT "(unknown; file could not be found)",IDC_DATE_OLD,45,90, - 199,8 - DEFPUSHBUTTON "&Close",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "Get dates of files on server",IDC_STATIC,32,12,127,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 295, 144 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Dump Volume - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Create dump file &named:",IDC_STATIC,4,42,77,8 - EDITTEXT IDC_DUMP_FILENAME,86,40,151,14,ES_AUTOHSCROLL - PUSHBUTTON "&Browse...",IDC_DUMP_BROWSE,241,40,50,14 - CONTROL "Dump the &entire contents of volume %3 (partition %1:%2)", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,10, - 78,274,10 - CONTROL "Dump only files that have changed &since", - IDC_DUMP_LIMIT_TIME,"Button",BS_AUTORADIOBUTTON,10,94, - 144,10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,160,93,51, - 13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,218,93,56, - 13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,131,126,50,14 - PUSHBUTTON "Cancel",IDCANCEL,185,126,50,14 - PUSHBUTTON "&Help",9,241,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "This operation copies the contents of a volume into a single file, so that the volume can be easily backed up. The contents of volumes dumped in this way can be restored later.", - IDC_STATIC,30,7,261,24 - GROUPBOX "Dump Parameters",IDC_STATIC,4,62,287,53 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Restore Volume - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "File to &restore:",IDC_STATIC,4,33,48,8 - EDITTEXT IDC_RESTORE_FILENAME,57,30,175,14,ES_AUTOHSCROLL - PUSHBUTTON "&Browse...",IDC_RESTORE_BROWSE,238,30,50,14 - CONTROL "This is an &incremental dump file", - IDC_RESTORE_INCREMENTAL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,57,46,114,10 - LTEXT "&Volume:",IDC_STATIC,11,102,23,8 - EDITTEXT IDC_RESTORE_SETNAME,50,100,115,14,ES_AUTOHSCROLL - LTEXT "&Server:",IDC_STATIC,11,145,24,8 - COMBOBOX IDC_RESTORE_SERVER,51,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Partition:",IDC_STATIC,11,162,36,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,50,161,231, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,128,230,50,14 - PUSHBUTTON "Cancel",IDCANCEL,183,230,50,14 - PUSHBUTTON "&Help",9,238,230,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Restore volume from dump file",IDC_STATIC,33,11,224,8 - GROUPBOX "Target Volume",IDC_STATIC,4,63,284,160 - LTEXT "When you restore a volume from a dump file, you can either create a new volume or overwrite an existing read/write volume.", - IDC_STATIC,11,78,259,16 - LTEXT "(set at runtime)\n(set at runtime)",IDC_RESTORE_CREATE, - 51,119,229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "&Periodically stop and restart all services on this server", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 71,193,10 - LTEXT "&Restart",IDC_BOS_GENRES_DESC1,23,87,25,8 - COMBOBOX IDC_BOS_GENRES_DATE,54,84,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "&at",IDC_BOS_GENRES_DESC2,127,87,8,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,138, - 84,53,13,WS_EX_CLIENTEDGE - CONTROL "Periodically test all services on this server for new &binaries", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 151,201,10 - LTEXT "Te&st",IDC_BOS_BINRES_DESC1,23,167,25,8 - COMBOBOX IDC_BOS_BINRES_DATE,54,164,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "a&t",IDC_BOS_BINRES_DESC2,127,167,8,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,138, - 164,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Service %2 (server %1)",IDC_SVC_NAME,52,13,168,8 - GROUPBOX "BOS Service",IDC_STATIC,5,27,215,175 - LTEXT "The BOS service can be used to periodically stop and restart all services on this server (including the BOS service itself).", - IDC_STATIC,11,45,200,18 - LTEXT "The BOS service can also be used to periodically test all services on a server, stopping and restarting only those services whose binary files have been updated.", - IDC_STATIC,11,118,200,25 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Dumping Volume - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Creating dump file %4 from volume %3...", - IDC_DUMPSET_DESC,4,41,229,19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Restoring Volume - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Restoring volume %1 from dump file %2...", - IDC_RESTORESET_DESC,4,41,229,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 258, 163 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Backup Volumes - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Create backup versions of &all volumes in this cell", - IDC_CLONE_ALL,"Button",BS_AUTORADIOBUTTON,30,53,214,10 - GROUPBOX " ",IDC_STATIC,23,68,231,67 - CONTROL "&Only create backups for volumes matching the following criteria:", - IDC_CLONE_SOME,"Button",BS_AUTORADIOBUTTON,30,67,214,11 - CONTROL "Only volumes on &server:",IDC_CLONE_SVR_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,83,92,10 - COMBOBOX IDC_CLONE_SVR,152,82,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Only volumes on &partition:",IDC_CLONE_AGG_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,99,97,10 - COMBOBOX IDC_CLONE_AGG,152,98,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Only volumes &beginning with:",IDC_CLONE_PREFIX_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,116,106,10 - EDITTEXT IDC_CLONE_PREFIX,152,115,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,95,145,50,14 - PUSHBUTTON "Cancel",IDCANCEL,149,145,50,14 - PUSHBUTTON "&Help",9,204,145,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "A volume backup acts like a read-only copy of that volume. A read/write volume can have only one backup version.\n\nYou can create backup versions for more than one volume at the same time.", - IDC_STATIC,30,7,214,40 -END - -IDD_SUBSETS DIALOG DISCARDABLE 0, 0, 281, 182 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Monitored Servers" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Subset name:",IDC_STATIC,12,77,44,8 - EDITTEXT IDC_SUBSET_NAME,64,75,116,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "&Open...",IDC_SUBSET_LOAD,185,75,39,14 - PUSHBUTTON "&Save...",IDC_SUBSET_SAVE,229,75,39,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "Monitor &All",IDC_SUBSET_ALL,211,122,57,14 - PUSHBUTTON "Monitor &None",IDC_SUBSET_NONE,211,140,57,14 - LTEXT "To improve performance when working in a large cell, you can choose not to monitor certain servers for problems. The AFS Server Manager will not show the volumes, partitions or services on any server which is not monitored.", - IDC_STATIC,5,5,271,24 - LTEXT "You can choose to monitor (or not to monitor) a server at any time. You can create server subsets to designate lists of servers which should be monitored.", - IDC_STATIC,5,37,271,18 - GROUPBOX "Current Subset",IDC_STATIC,5,63,271,114 - LTEXT "Servers to monitor:",IDC_STATIC,12,95,60,8 -END - -IDD_SUBSET_LOADSAVE DIALOG DISCARDABLE 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(title set at runtime)" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Subset &name:",1090,5,112,45,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,54,110,165,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Open",IDOK,226,110,50,14 - PUSHBUTTON "Cance&l",IDCANCEL,226,127,50,14 - CONTROL "List1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "Subsets already defined for this cell:",IDC_STATIC,4,6, - 114,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Find Command" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Display &Help",IDOK,147,38,67,14 - PUSHBUTTON "&Cancel",IDCANCEL,147,55,67,14 - LTEXT "To find out how to use the AFS Server Manager to perform a task, select a command-line below and click the Display Help button.", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Look Up Error Code" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Error number:",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Translate",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "&Close",IDCANCEL,85,123,48,14 - LTEXT "(text set at runtime)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "To find out what an error code means, type in the code below and click the ""Translate"" button.", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "About AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS Server Manager version 3.5",IDC_STATIC,33,8,163,8 - LTEXT "Copyright © IBM Corporation 1989, 1999", - IDC_STATIC,33,20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "&Close",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "The AFS Server Manager is searching for servers within the %1 cell...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 279, 136 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Show fully-qualified domain names for servers (e.g., ""machine.company.com"")", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,5,269,10 - CONTROL "Show a &warning if working without administrative tokens", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,19,269,10 - CONTROL "...always shows that server's properties", - IDC_OPT_SVR_DBL_PROP,"Button",BS_AUTORADIOBUTTON,21,50, - 253,10 - CONTROL "...shows that server's properties only if the Quick-View Pane is open", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON,21, - 63,253,10 - CONTROL "...always opens a window for that server", - IDC_OPT_SVR_DBL_OPEN,"Button",BS_AUTORADIOBUTTON,21,75, - 253,10 - CONTROL "...opening a server window causes that server to be monitored", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,107,253,10 - CONTROL "...closing a server window causes that server to be unmonitored", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,121,253,10 - LTEXT "Double-clicking a server's icon...",IDC_STATIC,5,38,269, - 8 - LTEXT "If a server subset is in use and the Quick-View pane is closed...", - IDC_STATIC,5,95,269,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Add Server Key",IDC_KEY_ADD,72,160,65,14 - PUSHBUTTON "&Remove Server Key",IDC_KEY_REMOVE,141,160,80,14 - LTEXT "Keys for server:",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add Server Key" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Version:",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "Value:",IDC_STATIC,7,58,21,8 - CONTROL "Encrypt this string:",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,43,58,73,10 - CONTROL "Use this key:",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,43,76,57,10 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "&Random",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "Reminder: after adding a new key to a server, you should modify the AFS account to use the new key. After a few days, you can remove any old server keys.", - IDC_STATIC,7,99,267,18 - DEFPUSHBUTTON "OK",IDOK,116,129,50,14 - PUSHBUTTON "Cancel",IDCANCEL,170,129,50,14 - PUSHBUTTON "Help",9,224,129,50,14 - LTEXT "New key for server %1",IDC_KEY_TITLE,43,14,181,8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 277, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Start/Stop Service" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,115,114,50,14 - PUSHBUTTON "Cancel",IDCANCEL,169,114,50,14 - PUSHBUTTON "&Help",9,223,114,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,21,20 - LTEXT "Click OK to start/stop service %2 on server %1.", - IDC_STARTSTOP_TEXT,31,12,242,9 - CONTROL "&Permanent (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,37, - 68,226,10 - CONTROL "&Temporary (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,37, - 83,226,10 - GROUPBOX "Service Startup",IDC_STATIC,31,31,242,70 - LTEXT "You can make this change permanent, so that service %2 will (not) automatically start if server %1 is restarted.", - IDC_STARTSTOP_STARTUP,38,45,223,16 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Execute Command" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,4,56,42,8 - COMBOBOX IDC_SERVER,50,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Command:",IDC_STATIC,4,75,42,8 - EDITTEXT IDC_COMMAND,50,73,194,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,107,50,14 - PUSHBUTTON "Cancel",IDCANCEL,140,107,50,14 - PUSHBUTTON "&Help",9,194,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "Execute command on server",IDC_STATIC,32,12,185,8 - LTEXT "This operation allows you to issue a command on a remote server.\nIt is typically used to restart a server by executing the /etc/reboot script.", - IDC_STATIC,4,29,240,16 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 248, 254 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Salvage Volumes - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Server:",IDC_STATIC,30,50,35,8 - COMBOBOX IDC_SERVER,67,48,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partition:",IDC_STATIC,30,67,35,8 - COMBOBOX IDC_AGGREGATE,67,65,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "S&alvage all partitions",IDC_AGGREGATE_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,163,67,81,10 - LTEXT "V&olume:",IDC_STATIC,29,85,35,8 - COMBOBOX IDC_FILESET,67,83,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Sa&lvage all volumes",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,163,85,79,10 - DEFPUSHBUTTON "OK",IDOK,85,108,50,14 - PUSHBUTTON "Cancel",IDCANCEL,139,108,50,14 - PUSHBUTTON "&Help",9,194,108,50,14 - PUSHBUTTON "Ad&vanced >>",IDC_ADVANCED,4,108,53,14 - LTEXT "Path for &temporary files:",IDC_STATIC,10,142,74,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,92,141,144,13,ES_AUTOHSCROLL - CONTROL "Pa&rallel salvage operations; number of processes:", - IDC_SALVAGE_SIMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,157,171,10 - EDITTEXT IDC_SALVAGE_NUM,202,156,25,13,ES_AUTOHSCROLL - CONTROL "Do ¬ salvage damaged volumes",IDC_SALVAGE_READONLY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,167,123,10 - CONTROL "&Break read operations into small blocks", - IDC_SALVAGE_BLOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,177,139,10 - CONTROL "&Force salvage of all indicated volumes", - IDC_SALVAGE_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,187,136,10 - CONTROL "Force r&ebuild of directory structure", - IDC_SALVAGE_FIXDIRS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,29,197,123,10 - LTEXT "Filename for results &log:",IDC_STATIC,10,211,74,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,92,210,144,13,ES_AUTOHSCROLL - CONTROL "&Include list of damaged inodes in results log", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,224,203,10 - CONTROL "Include list of AFS-o&wned root inodes in results log", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,235,203,10 - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "This operation allows you to fix problems on one or more volumes.\n\nNote: If you salvage an entire partition or server at once, the server will be temporarily taken off-line.", - IDC_STATIC,30,7,214,32 - GROUPBOX "Advanced Salvage Options",IDC_ADVANCED_GROUP,4,128,240, - 122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Salvage Volumes - Results" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Close",IDOK,232,160,50,14 - LTEXT "Results of salvage operation:",IDC_STATIC,4,33,277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "Salvage volume %3 on partition %2 of server %1", - IDC_SALVAGE_TITLE,33,15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Release Volume" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,115,84,50,14 - PUSHBUTTON "Cancel",IDCANCEL,169,84,50,14 - PUSHBUTTON "&Help",9,223,84,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "This operation allows you to update the replicas of the %3 volume. You can choose to update only out-of-date replicas, or to update all replicas.", - IDC_RELSET_DESC,31,7,242,26 - CONTROL "&Update only volume replicas which are out-of-date", - IDC_RELSET_NORMAL,"Button",BS_AUTORADIOBUTTON,46,41,173, - 10 - CONTROL "Update &all volume replicas, even if not out-of-date", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,46,56,172, - 10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Add Host Server",IDC_HOST_ADD,72,160,65,14 - PUSHBUTTON "&Remove Host Server",IDC_HOST_REMOVE,141,160,80,14 - LTEXT "Database host servers recognized by server:", - IDC_HOST_TITLE,5,7,216,8 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 225, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Add Host Server" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Host:",-1,31,55,26,8 - EDITTEXT IDC_ADDHOST_HOST,61,53,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,63,88,50,14 - PUSHBUTTON "Cancel",IDCANCEL,117,88,50,14 - ICON IDI_SERVER,-1,4,4,21,20 - LTEXT "You have chosen to add a database host server to the list which is stored on server %1.\n\nEnter the name of the new database host below.", - IDC_ADDHOST_DESC,31,10,190,34 - PUSHBUTTON "Help",9,171,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Change Server Addresses" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "IP addresses recorded in VLDB for server %1:",IDC_TITLE, - 4,4,200,8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Change...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "&Remove",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "OK",IDOK,46,97,50,14 - PUSHBUTTON "Cancel",IDCANCEL,100,97,50,14 - PUSHBUTTON "Help",9,154,97,50,14 - LTEXT "Note: when a file server starts, it automatically registers its current IP address(es) with VLDB.", - IDC_STATIC,4,64,200,18 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Change IP Address" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,61,51,50,14 - PUSHBUTTON "Cancel",IDCANCEL,115,51,50,14 - PUSHBUTTON "Help",9,169,51,50,14 - LTEXT "Enter the new IP address that should replace %1 in VLDB:", - IDC_TITLE,4,4,215,8 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,42,23, - 90,14 - LTEXT "Address:",IDC_STATIC,4,26,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AVI -// - -AVI_SETMOVE AVI DISCARDABLE "Resource\\setmove.avi" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "Server %1 - Admin Lists" - IDS_TAB_SERVICES "Services" - IDS_TAB_AGGREGATES "Partitions" - IDS_TAB_FILESETS "Volumes" - IDS_SERVICE_NONESELECTED "Select a server to view." - IDS_SERVICE_GOTSELECTED "Service processes on server %1:" - IDS_AGGREGATE_ALL "Partitions on all servers:" - IDS_AGGREGATE_ONE "Partitions on server %1:" - IDS_FILESET_ALL "All volumes in cell %1:" - IDS_FILESET_ONE "Volumes on server %1:" - IDS_SVR_LISTS_TAB "Admin Lists" - IDS_SVR_PROP_TITLE "Server %1 - Properties" - IDS_SVR_GENERAL_TAB "General" - IDS_SVR_SCOUT_TAB "Settings" - IDS_SERVER_TITLE "Server %1 - AFS Server Manager" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "Server %1 within cell %2:" - IDS_SVC_PROP_TITLE "Service %2 on Server %1 - Properties" - IDS_SVC_GENERAL_TAB "General" - IDS_SVC_ADD_TITLE "Create Service" - IDS_SVC_ADD_TAB "Create Service" - IDS_AGG_PROP_TITLE "Partition %2 on Server %1 - Properties" - IDS_AGG_GENERAL_TAB "General" - IDS_SET_REP_TITLE "Volume %1 - Replication" - IDS_SET_REPSITES_TAB "Replication Sites" - IDS_SET_PROP_TITLE "Volume %1 - Properties" - IDS_SET_GENERAL_TAB "General" - IDS_SET_UNLOCKBTN "Un&lock Now" - IDS_SET_LOCKBTN "&Lock Now" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%1 used of %2 quota (%3%%)" - IDS_USAGE_AGGREGATE "%1 used of %2 capacity (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "Combined Quota" - IDS_SVRCOL_NAME "Server" - IDS_SVRCOL_STATUS "Status" - IDS_SETCOL_DATE_ACCESS "Last Accessed" - IDS_SETCOL_DATE_BACKUP "Last Backup" - IDS_SVCCOL_NAME "Service" - IDS_SVCCOL_TYPE "Type" - IDS_SVCCOL_PARAMS "Parameters" - IDS_SVCCOL_STATUS "Status" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "Last Started" - IDS_SVCCOL_DATE_STOP "Last Stopped" - IDS_SVCCOL_DATE_STARTSTOP "Last Started/Stopped" - IDS_SVCCOL_DATE_FAILED "Last Failed" - IDS_SVCCOL_LASTERROR "Last Exit Code" - IDS_AGGCOL_NAME "Partition" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "Device" - IDS_AGGCOL_USED "Used" - IDS_AGGCOL_USED_PER "% Used" - IDS_AGGCOL_FREE "Free" - IDS_AGGCOL_TOTAL "Capacity" - IDS_AGGCOL_STATUS "Status" - IDS_SETCOL_NAME "Volume" - IDS_SETCOL_TYPE "Type" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "Created" - IDS_SETCOL_DATE_UPDATE "Last Updated" - IDS_SETCOL_STATUS "Status" - IDS_SETCOL_QUOTA_USED "Used" - IDS_SETCOL_QUOTA_USED_PER "% Used" - IDS_SETCOL_QUOTA_FREE "Free" - IDS_SETCOL_QUOTA_TOTAL "Quota" - IDS_TRYAGAINBTN "Try &Again" - IDS_NO_CELL_SELECTED "(no cell has been specified)" - IDS_NO_AFS_ID "(no tokens are available)" - IDS_AFS_ID_WILLEXP "%1 (tokens will expire %2)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS - "Please wait; obtaining information about the %1 cell..." - IDS_STATUS_NOALERTS "Normal" - IDS_TITLE_BROWSE_USER "Select User" - IDS_AGGTYPE_OTHER "Unknown (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "Creating volume %3 on partition %1:%2" - IDS_ACTION_DELETEFILESET "Deleting volume %3 from partition %1:%2" - IDS_ACTION_MOVEFILESET "Moving volume %3 to partition %1:%2" - IDS_ACTION_SETFILESETQUOTA "Changing the quota for volume %3" - IDS_SVCSTOP_DESC2 "Click OK to stop this service." - IDS_SVCSTART_DESC2 "Click OK to start this service." - IDS_SYNCVLDB_SVR_DESC "Caution!\n\nIf you proceed, the AFS Server Manager will modify VLDB to match the contents of all partitions on server %1." - IDS_SYNCVLDB_SVR_DESC2 "If VLDB mentions a volume that for any reason cannot currently be found on any partition on server %1, the VLDB entry for that volume will be deleted!" - IDS_SYNCVLDB_AGG_DESC "Caution!\n\nIf you proceed, the AFS Server Manager will modify VLDB to match the contents of partition %2 on server %1." - IDS_SYNCVLDB_AGG_DESC2 "If VLDB mentions a volume that for any reason cannot currently be found on this partition, the VLDB entry for that volume will be deleted!" - IDS_PROMPT_BROWSE_USER "User:" - IDS_PREVIEWIN_BUTTON "<< &Preview" - IDS_PREVIEWOUT_BUTTON "&Preview >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "User" - IDS_TITLE_BROWSE_PRINCIPAL "Select Principal" - IDS_TITLE_BROWSE_OWNGROUP "Select Owning Group" - IDS_PROMPT_BROWSE_PRINCIPAL "Principal:" - IDS_PROMPT_BROWSE_OWNGROUP "Owning Group:" - IDS_ACTION_CLONE "Creating backup version of volume %3" - IDS_ACTION_CLONESYS "Creating multiple volume backups" - IDS_CLONESYS_FAILED "A backup of volume %1 could not be created because of error 0x%2 (%3)." - IDS_SET_UNSPECIFIED "(unspecified)" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "File Count" - IDS_SET_DUMP_NAME "Dump of %1.DMP" - IDS_ACTION_DUMP "Dumping volume %3 (partition %1:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "Partition" - IDS_REFRESH_DESC_CELL "The AFS Server Manager is determining the status of servers within the %1 cell. This might take a few moments..." - IDS_REFRESH_DESC_SERVER "The AFS Server Manager is determining the status of server %1. This might take a few moments..." - IDS_REFRESH_CURRENT_CELL "Currently examining: cell %1" - IDS_REFRESH_CURRENT_SERVER "Currently examining: server %2" - IDS_REFRESH_CURRENT_AGGREGATE - "Currently examining: partition %3 on server %2" - IDS_REFRESH_CURRENT_FILESET - "Currently examining: volume %4 on server %2, partition %3" - IDS_REFRESH_CURRENT_SERVICE "Currently examining: service %3 on server %2" - IDS_REFRESH_PERCENT "%1%% complete" - IDS_PROBLEMS "Problems" - IDS_SERVER_NO_PROBLEMS "This server has no known problems." - IDS_SERVICE_NO_PROBLEMS "This service has no known problems." - IDS_AGGREGATE_NO_PROBLEMS "This partition has no known problems." - IDS_FILESET_NO_PROBLEMS "This volume has no known problems." - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB - "Currently examining: volume location database (VLDB)" - IDS_FILESETTYPE_RW "Read/Write" - IDS_FILESETTYPE_RO "Replica" - IDS_FILESETTYPE_CLONE "Backup" - IDS_MOVESET_READWRITE "Proceeding will cause volume %3 to be moved from partition %2 of server %1 to another location." - IDS_MOVESET_READONLY "Proceeding will cause volume replica %3 to be removed from partition %2 of server %1, and another volume replica created on the partition you specify below." - IDS_SVC_START_TITLE "Start Service" - IDS_SVC_STOP_TITLE "Stop Service" - IDS_SERVICESTATUS_STARTING "This service is currently starting." - IDS_SERVICESTATUS_RUNNING "This service is currently running." - IDS_SERVICESTATUS_STOPPED "This service is currently stopped." - IDS_SERVICESTATUS_STOPPING "This service is currently stopping." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "The status of this service is unknown." - IDS_SVC_RESTART_BUTTON "Stop and &Restart Now" - IDS_PROBLEM_BOX "Known Problems (%1)" - IDS_VIEWLOG_DESC_NOFILE "The AFS Server Manager was unable to find the log file for service %2 on server %1. Please enter the full path to the service's log file below." - IDS_NO_GROUP "(no owning group)" - IDS_VIEWLOG_FROMSERVER "Log file on server %1" - IDS_VIEWLOG_FROMSERVICE "Log file for service %2 on server %1" - IDS_VIEWLOG_TRUNCATED "File contents (only last %1 lines shown):" - IDS_SAVELOG_FILTER "Text File|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< &Advanced" - IDS_ADVANCEDOUT_BUTTON "&Advanced >>" - IDS_REPTYPE_RELEASE "Release Replication" - IDS_REPTYPE_SCHEDULED "Scheduled Replication" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "&Update All" - IDS_UPDATETHIS_BUTTON "&Update" - IDS_SERVER_MULTIPLE_PROBLEMS "This server has %1 known problems." - IDS_SERVICE_MULTIPLE_PROBLEMS "This service has %1 known problems." - IDS_AGGREGATE_MULTIPLE_PROBLEMS "This partition has %1 known problems." - IDS_FILESET_MULTIPLE_PROBLEMS "This volume has %1 known problems." - IDS_FILESETTYPE_RO_STAGE "Replica" - IDS_SERVICETYPE_SIMPLE_LONG "Simple (runs continuously)" - IDS_SERVICETYPE_CRON_LONG "Cron (runs at specified intervals)" - IDS_QUOTAUNITS_KB "kb" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "(this volume is a replica and therefore has no quota)" - IDS_NO_QUOTA_CLONE "(this volume is a backup and therefore has no quota)" - IDS_USAGE_REPLICA "%1 used" - IDS_USAGE_CLONE "%1 used" - IDS_COL_AGGS_MOVE "partitions when creating a volume" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "Partitions on server %1:" - IDS_AGGREGATES_IN_CELL "All partitions in cell %1:" - IDS_AGGREGATES_IN_NOTHING "Partitions:" - IDS_FILESETS_IN_SERVER "Volumes on server %1:" - IDS_FILESETS_IN_CELL "All volumes in cell %1:" - IDS_FILESETS_IN_NOTHING "Volumes:" - IDS_SERVICES_IN_SERVER "Services on server %1:" - IDS_SERVICES_IN_NOTHING "Services:" - IDS_UNKNOWN "(unknown)" - IDS_UNKNOWN_GROUP "group #%1 (name unknown)" - IDS_AGGFULL_WARN_OFF "the default threshold (warning disabled on server)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "the default threshold (warning disabled on server)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - Exit code %2" - IDS_COL_SERVERS "servers in a cell" - IDS_COL_FILESETS "volumes on a server" - IDS_COL_AGGREGATES "partitions on a server" - IDS_COL_SERVICES "services on a server" - IDS_COL_REPLICAS "replicas of a volume" - IDS_COLUMNS_TITLE "Select Display Columns - AFS Server Manager" - IDS_REPCOL_SERVER "Server" - IDS_REPCOL_AGGREGATE "Partition" - IDS_REPCOL_DATE_UPDATE "Last Update" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "partitions when moving a volume" - IDS_WARN_TITLE "Caution" - IDS_WARN_DISABLE_AUTH "By clicking the ""Allow Unauthenticated"" button, you will allow unauthenticated principals to manipulate the services on this server. Since many services run under the root identity, this action represents +" - IDS_WARN_DISABLE_AUTH2 "a significant flaw in the server's security.\n\nAre you sure you want to make this change?" - IDS_SVR_NO_ADDR "(unspecified)" - IDS_TITLE_BAD_CELL "Unrecognized Cell Name" - IDS_DESC_BAD_CELL "The cell name you have entered could not be found on the network.\n\nPlease check your entry again, to make sure it is correct." - IDS_AGGFULL_WARN_ON "the &default threshold for this server (%1%% of its size)" - IDS_SETFULL_WARN_ON "the &default threshold for this server (%1%% of its size)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "The AFS identity you have entered is unrecognized, or the password you have specified is incorrect." - IDS_SVR_CREDS_NONE "(no tokens)" - IDS_SVR_CREDS_VALID "%2, expires %3" - IDS_SVR_CREDS_EXPIRED "(tokens expired %3)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 (Combined quota: %2)" - IDS_ACTION_DESC_NONE "There are no operations in progress." - IDS_ACTION_DESC_ONE "The following operation is currently in progress:" - IDS_ACTION_DESC_MULT "The following operations are currently in progress:" - IDS_ACTCOL_OPERATION "Operation" - IDS_ACTCOL_ELAPSED "Elapsed Time" - IDS_ACTION_REFRESH "Refreshing cell information" - IDS_ACTION_CREATESERVER "Creating server %1" - IDS_ACTION_DELETESERVER "Deleting server %1" - IDS_ACTION_GETSERVERLOGFILE "Getting log file %2 from server %1" - IDS_ACTION_SETSERVERAUTH "Changing access restrictions for server %1" - IDS_ACTION_CHANGESERVERSTATUS "Changing properties of server %1" - IDS_ACTION_STARTSERVICE "Starting service %2 on server %1" - IDS_ACTION_STOPSERVICE "Stopping service %2 on server %1" - IDS_ACTION_RESTARTSERVICE "Restarting service %2 on server %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "Synchronizing VLDB with server %1" - IDS_ACTION_SYNCVLDB_AGG "Synchronizing VLDB with partition %1:%2" - IDS_ACTION_SCOUT "Checking server %1 for problems" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "Changing replication properties for volume %3" - IDS_ACTION_CREATEREPLICA - "Creating replica of volume %3 on partition %1:%2" - IDS_DELSET_REPLICA_DESC "Caution!\n\nProceeding will cause the replica of volume %3 on partition %2 of server %1 to be removed." - IDS_DELSET_CLONE_DESC "Caution!\n\nProceeding will cause the volume backup %3 to be removed from partition %2 of server %1." - IDS_INSTALL_DESC1 "This operation copies a file from this computer to another. +" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "If the file already exists on the target computer, it will be backed up and given a .BAK extension; any existing backup will be given a .OLD extension, and any existing .OLD file will be deleted." - IDS_ACTION_INSTALLFILE "Installing file %2 on server %1" - IDS_ACTION_UNINSTALLFILE "Uninstalling file %2 from server %1" - IDS_ACTION_PRUNEFILES "Pruning files from server %1" - IDS_FILTER_ALLFILES "All Files|*.*|" - IDS_ACTION_RENAMEFILESET "Renaming volume %1 to %2" - IDS_RECUR_DAILY "every day" - IDS_RECUR_SUNDAY "every Sunday" - IDS_RECUR_MONDAY "every Monday" - IDS_RECUR_TUESDAY "every Tuesday" - IDS_RECUR_WEDNESDAY "every Wednesday" - IDS_RECUR_THURSDAY "every Thursday" - IDS_RECUR_FRIDAY "every Friday" - IDS_RECUR_SATURDAY "every Saturday" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "Creating service %2 on server %1" - IDS_ACTION_DELETESERVICE "Deleting service %2 from server %1" - IDS_ACTION_RELEASEFILESET "Releasing volume %3" - IDS_ACTION_GETDATES "Getting dates for file %2 on server %1" - IDS_LASTMODIFIED "Last modified %1" - IDS_SVR_SECURITY_TITLE "Server Security - %1" - IDS_SVR_LIST_TAB "Administrators" - IDS_ACTION_ADMINLIST_LOAD "Getting administrators for server %1" - IDS_ACTION_ADMINLIST_SAVE "Writing administrators for server %1" - IDS_ADMCOL_PRINCIPAL "Member" - IDS_ADMCOL_TYPE "Type" - IDS_ADMCOL_TYPE_GROUP "Group" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "Restoring volume %1" - IDS_COL_AGGS_RESTORE "partitions when restoring a volume" - IDS_RESTORE_FILTER "Volume Dump Files|*.DMP|All Files|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "Changing service restart times for server %1" - IDS_RESTORE_CREATESET "The volume %1 will be created on the server and partition you specify below." - IDS_RESTORE_OVERWRITESET - "Caution! Volume %3 exists on partition %2 of server %1, and will be overwritten if you proceed!" - IDS_SUBSET_TITLE_LOAD "Open Server Subset" - IDS_SUBSET_TITLE_SAVE "Save Server Subset" - IDS_BUTTON_OPEN "&Open" - IDS_BUTTON_SAVE "&Save" - IDS_SUBSET_SAVE_TITLE "Caution" - IDS_SUBSET_SAVE_DESC "A server subset already exists under the name %1.\n\nDo you want to overwrite this subset?" - IDS_SUBSET_CHANGED "%1 [MODIFIED]" - IDS_SUBSET_TAB "Monitored Servers" - IDS_SUBSET_DISCARD_TITLE "Save Subset?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "You have not saved the list of currently-monitored servers as a subset. If you save this list, you can use it later to continue monitoring this same set of servers.\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "Do you want to create a subset to contain the list of currently-monitored servers?" - IDS_SUBSET_NONAME "(untitled)" - IDS_SUBSET_NOSUBSET "(all servers are being monitored)" - IDS_SUBSET_SERVERSUBSET "Server %1" - IDS_FILESET_SOME "Volumes on all monitored servers in cell %1:" - IDS_AGGREGATE_SOME "Partitions on all monitored servers in cell %1:" - IDS_SERVICE_SOME "Services on all monitored servers in cell %1:" - IDS_FILESET_UNMON "Server %1 is not being monitored" - IDS_AGGREGATE_UNMON "Server %1 is not being monitored" - IDS_SERVICE_UNMON "Server %1 is not being monitored" - IDS_SUBSET_DELETE_TITLE "Delete Subset?" - IDS_SUBSET_DELETE_DESC "Are you sure you want to delete the server subset %1?" - IDS_ERROR_TRANSLATED "Error number 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Error number 0x%1 (%2) is unrecognized." - IDS_FIND_NOTHING_TITLE "No Command Selected" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "To find out how to perform an operation, first select a command-line from the list or type in a keyword." - IDS_FIND_UNKNOWN_TITLE "Unknown Command" - IDS_FIND_UNKNOWN_DESC "The AFS Server Manager could not find any help topics for the ""%1"" command." - IDS_HELPABOUT_DESC1 "Warning: this computer program is protected by copyright and international treaties. +" - IDS_HELPABOUT_DESC2 "Unauthorized reproduction or distribution of this software may result in severe civil and criminal penalties, and will be prosecuted to the maximum extent possible under the law.\n\n+" - IDS_HELPABOUT_DESC3 "AFS is a trademark of Transarc Corporation, an IBM company." - IDS_CANT_QUIT_TITLE "AFS Server Manager" - IDS_CANT_QUIT_REBOOT "Caution!\n\nThe AFS Server Manager is currently performing one or more operations. If you shut down Windows now, those operations will not complete successfully.\n\nAre you sure you want to restart Windows?" - IDS_APP_TITLE "AFS Server Manager" - IDS_ACTION_OPENCELL "Finding servers within the %1 cell" - IDS_OPTIONS_TITLE "Options - AFS Server Manager" - IDS_OPTIONS_GENERAL_TAB "General" - IDS_BADCREDS_DESC "Unless you are logged in as an administrator, you may have insufficient privileges to successfully administer the %1 cell. Having insufficient access privileges may cause the AFS Server Manager to find problems with a cell when no problems exist." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "Confirmation - AFS Server Manager" - IDS_NO_GROUP_CHECKBOX "No Owning Group" - IDS_AFS_ID_DIDEXP "%1 (tokens expired %2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(querying)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "Foreign Group" - IDS_ADMCOL_TYPE_FOREIGN_USER "Foreign User" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "Notifier" - IDS_SVC_NONOTIFIER "(none)" - IDS_SVR_KEY_TAB "Server Keys" - IDS_KEYNAME_NOTIME "Keys for server %1:" - IDS_KEYNAME_WITHTIME "Keys for server %1 (modified %2):" - IDS_SVRKEY_VERSION "Version" - IDS_SVRKEY_DATA "Value" - IDS_SVRKEY_CHECKSUM "Checksum" - IDS_SVRKEY_DATA_UNKNOWN "(hidden)" - IDS_STARTSERVICE_TITLE "Start Service" - IDS_STOPSERVICE_TITLE "Stop Service" - IDS_STARTSERVICE_TEXT "Click OK to start service %2 on server %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "Click OK to stop service %2 on server %1." - IDS_STARTSERVICE_STARTUP - "You can make this change permanent, so that service %2 will automatically start if server %1 is restarted." - IDS_STOPSERVICE_STARTUP "You can make this change permanent, so that service %2 will not automatically start if server %1 is restarted." - IDS_STARTSERVICE_PERMANENT - "&Permanent (start service %2 if server %1 restarts)" - IDS_STARTSERVICE_TEMPORARY - "&Temporary (do not start service %2 if server %1 restarts)" - IDS_STOPSERVICE_PERMANENT - "&Permanent (do not start service %2 if server %1 restarts)" - IDS_STOPSERVICE_TEMPORARY - "&Temporary (start service %2 if server %1 restarts)" - IDS_ACTION_EXECUTE "Executing %2 on server %1" - IDS_ACTION_SALVAGE_SVR "Salvaging all volumes on server %1" - IDS_ACTION_SALVAGE_AGG "Salvaging all volumes on partition %1:2" - IDS_ACTION_SALVAGE_VOL "Salvaging volume %3 on partition %1:2" - IDS_SALVAGE_SVR "Salvage all volumes on server %1" - IDS_SALVAGE_AGG "Salvage all volumes on server %1, partition %2" - IDS_SALVAGE_SET "Salvage volume %3 on server %1, partition %2" - IDS_SETSTATUS_SALVAGE "Salvaging volume" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "Volume is locked" - IDS_SETSTATUS_NO_VOL "Volume missing" - IDS_SETSTATUS_BUSY "Volume currently busy" - IDS_SETSTATUS_MOVED "Volume moved" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "Address" - IDS_HOST_TITLE "Database host servers recognized by server %1:" - IDS_SVR_HOSTS_TITLE "Server %1 - Database Hosts" - IDS_SVR_HOST_TAB "Database Hosts" - IDS_ACTION_HOSTLIST_LOAD "Getting host list from server %1" - IDS_ACTION_HOSTLIST_SAVE "Writing host list to server %1" - IDS_SETSTATUS_1ALERT "Volume has one problem" - IDS_SETSTATUS_2ALERT "Volume has %1 problems" - IDS_ACTION_CHANGEADDR "Changing IP address for server %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED - "Server %1 is not being monitored for problems" - IDS_ALERT_DESCSHORT_TIMEOUT - "Server %1 could not be contacted; last error: %3" - IDS_ALERT_DESCSHORT_AGG_FULL - "Partition usage for %2 exceeds warning threshold of %3%% (%4)" - IDS_ALERT_DESCSHORT_SET_FULL - "Volume usage for %3 exceeds warning threshold of %4%% (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT "Volume %3 has no VLDB entry" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "Volume %3 has a VLDB entry but was not found on partition %2 of server %1" - IDS_ALERT_DESCSHORT_STOPPED "Service %2 stopped at %3" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "Partition %2 is referenced by VLDB but was not found on server %1" - IDS_ALERT_DESCSHORT_BADCREDS - "You may have insufficient privileges to administer server %1" - IDS_ALERT_DESCSHORT_AGG_ALLOC - "Combined volume quota on partition %2 exceed its capacity" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE - "The %3 volume is damaged and cannot be used." - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "There is no service running to serve volume %3." - IDS_ALERT_DESCSHORT_STATE_OFFLINE - "The %3 volume is offline and cannot be used." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "The server %1 could not be contacted. The last attempt, made at %2, resulted in the error ""%3""." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "The usage of partition %2 on server %1 exceeds its warning threshold of %3%% (%4)." - IDS_ALERT_DESCFULL_SET_FULL - "The usage of volume %3 (server %1, partition %2) exceeds its warning threshold of %4%% (%5)." - IDS_ALERT_DESCFULL_NO_VLDBENT - "Volume %3 exists on partition %2 of server %1, but has no corresponding VLDB entry." - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "A VLDB entry exists for volume %3, but the volume was not found on partition %2 of server %1." - IDS_ALERT_DESCFULL_STOPPED - "The %2 service on server %1 stopped at %3 with exit code %5." - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "VLDB refers to volumes on partition %2 of server %1, but the partition could not be found." - IDS_ALERT_DESCFULL_BADCREDS - "The AFS Server Manager may be detecting errors that do not exist on server %1 because you do not have AFS tokens as an administrator within this cell." - IDS_ALERT_DESCFULL_AGG_ALLOC - "The combined quota of volumes on partition %2 of server %1, totalling %4, exceed the partition's capacity of %3." - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "The %3 volume on partition %2 of server %1 has no Vnode associated with it. (Volume state is 0x%4.)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "There is no file exporter service running on server %1, so the %3 volume on partition %2 cannot be used. (Volume state is 0x%4.)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "The %3 volume on partition %2 of server %1 is offline and cannot be used. (Volume state is 0x%4.)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "Click the Try Again button to attempt to recontact this server." - IDS_ALERT_FIX_AGG_FULL "Click the Warnings button to change the warning threshold for this partition's usage." - IDS_ALERT_FIX_SET_FULL "Click the Warnings button to change the warning threshold for this volume's usage." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "VLDB is possibly out-of-date; if so, use the Synchronize VLDB command to update it." - IDS_ALERT_FIX_NO_SVRENT_SET - "Check the server and partition to ensure they are functioning properly." - IDS_ALERT_FIX_STOPPED "Click the View Log button to view the service log for this service." - IDS_ALERT_FIX_NO_SVRENT_AGG - "Check the server to ensure that the partition is exported and functioning properly." - IDS_ALERT_FIX_BADCREDS "Click the Authentication button to obtain new AFS tokens." - IDS_ALERT_FIX_AGG_ALLOC "Reduce quota for volumes on this partition, or move one or more volumes to another partition." - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "Try &Again" - IDS_ALERT_BUTTON_WARNINGS "&Warnings..." - IDS_ALERT_BUTTON_VIEWLOG "&View Log" - IDS_ALERT_BUTTON_SHOWME "&Show Me" - IDS_ALERT_BUTTON_GETCREDS "&Authentication" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "No cell has been specified. To use the AFS Server Manager, you must specify the AFS cell with which you would like to work. Choose a cell by selecting the ""Open..."" menu item within the ""Cell"" menu above." - IDS_ERROR_REFRESH_CELLSERVERS - "The list of servers could not be obtained for the %1 cell.\n\nError: %2" - IDS_ERROR_CANT_OPEN_CELL - "The AFS Server Manager was unable to contact any servers in the %1 cell.\n\nPlease recheck to ensure you have typed the name of the cell correctly." - IDS_ERROR_REFRESH_AGGREGATES - "The list of partitions could not be obtained for server %1.\n\nError: %2" - IDS_ERROR_REFRESH_SERVER_STATUS - "The current status of server %1 could not be obtained." - IDS_ERROR_CHANGE_SERVER_STATUS - "The AFS Server Manager was unable to change the properties for server %1." - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "The current status of partition %2 on server %1 could not be obtained." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "The current status of volume %3 (server %1, partition %2) could not be obtained." - IDS_ERROR_REFRESH_SERVICE_STATUS - "The current status of service %2 on server %1 could not be determined." - IDS_ERROR_MOVE_FILESET "The AFS Server Manager was unable to move the %3 volume from partition %2 of server %1 to partition %5 on server %4." - IDS_ERROR_VIEW_LOGFILE "The %2 file could not be read from server %1.\n\nCheck to make sure that you have entered the name of the file correctly, and that you have sufficient permissions to view the file." - IDS_ERROR_NOT_REPLICATED - "The replication status of volume %1 could not be determined." - IDS_ERROR_CANT_CREATE_FILESET - "The AFS Server Manager was unable to create volume %3 on partition %2 of server %1." - IDS_ERROR_CANT_DELETE_FILESET - "The AFS Server Manager was unable to delete volume %3 (partition %2 of server %1)." - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "The AFS Server Manager was unable to create a VLDB entry for volume %3 on partition %2 of server %1." - IDS_ERROR_CANT_SET_FILESET_QUOTA - "The AFS Server Manager was unable to change the quota for volume %3 on partition %2 of server %1." - IDS_ERROR_CANT_CREATE_SERVER - "The AFS Server Manager was unable to create the requested server entry within cell %1." - IDS_ERROR_CANT_PING_SERVER - "The AFS Server Manager was unable to determine the IP address of server %1." - IDS_ERROR_CANT_DELETE_SERVER - "The AFS Server Manager was unable to delete server %1." - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "Server %1 cannot be deleted because it still hosts one or more volumes. A server cannot be deleted unless it contains no volumes." - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "The AFS Server Manager was unable to change the properties for partition %2 on server %1." - IDS_ERROR_CHANGE_SERVICE_STATUS - "The AFS Server Manager was unable to change the properties for service %2 on server %1." - IDS_ERROR_CANT_START_SERVICE - "The AFS Server Manager was unable to start service %2 on server %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "The AFS Server Manager was unable to stop service %2 on server %1." - IDS_ERROR_CANT_RESTART_SERVICE - "The AFS Server Manager was unable to stop and restart the %2 service on server %1." - IDS_ERROR_CHANGE_REPLICA_STATUS - "The AFS Server Manager was unable to change the replication properties for volume %3 on partition %2 of server %1." - IDS_ERROR_CANT_SYNCVLDB "The AFS Server Manager was unable to update VLDB." - IDS_ERROR_CANT_CREATE_REPLICA - "The AFS Server Manager was unable to create a replica of volume %3 on partition %2 of server %1." - IDS_ERROR_CANT_INSTALL_FILE - "The AFS Server Manager was unable to install the %2 file on server %1." - IDS_ERROR_CANT_UNINSTALL_FILE - "The AFS Server Manager was unable to uninstall the %2 file on server %1." - IDS_ERROR_CANT_PRUNE_FILES - "The AFS Server Manager was unable to remove the requested files from server %1." - IDS_ERROR_CANT_RENAME_FILESET - "The AFS Server Manager was unable to rename volume %1 to ""%2""." - IDS_ERROR_CANT_CREATE_SERVICE - "The AFS Server Manager was unable to create service %2 on server %1." - IDS_ERROR_CANT_DELETE_SERVICE - "The AFS Server Manager was unable to delete service %2 from server %1." - IDS_ERROR_CANT_RELEASE_FILESET - "The AFS Server Manager was unable to release replicated volume %3." - IDS_ERROR_CANT_UPDATE_FILESET - "The AFS Server Manager was unable to update volume replica %3 on partition %1 of server %2." - IDS_ERROR_CANT_UPDATE_ALL - "The AFS Server Manager was unable to update any replicas of volume %3." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "The AFS Server Manager was unable to read the list of administrators for server %1." - IDS_ERROR_CANT_LOAD_KEYLIST - "The AFS Server Manager was unable to read the list of server keys for server %1." - IDS_ERROR_CANT_CREATE_KEY - "The AFS Server Manager was unable to create a new server key for server %1." - IDS_ERROR_CANT_SAVE_ADMLIST - "The AFS Server Manager was unable to change the list of administrators for server %1." - IDS_ERROR_CANT_CLONE "The AFS Server Manager was unable to create a backup version of volume %3 on partition %2 of server %1." - IDS_ERROR_CANT_CLONESYS "The AFS Server Manager was unable to create any of the requested backup volumes." - IDS_ERROR_CANT_DUMP_FILESET - "The AFS Server Manager was unable to dump the contents of volume %3 (server %1, partition %2) into the %4 file." - IDS_ERROR_CANT_RESTORE_FILESET - "The AFS Server Manager was unable to restore the %4 file to volume %3 (server %1, partition %2)." - IDS_ERROR_CANT_SET_RESTART_TIMES - "The AFS Server Manager was unable to change the restart times for services on server %1." - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "The AFS Server Manager is unable to delete volume %3 from partition %2 of server %1.\n\nVolume %3 cannot be deleted unless all of its replicas have been deleted first." - IDS_CMDLINE_TITLE "Error - AFS Server Manager" - IDS_CMDLINE_SYNTAX "The command-line you have specified for the AFS Server Manager is invalid." - IDS_CMDLINE_UNRECOGNIZED - "The command-line you have specified for the AFS Server Manager is invalid.\n\nThe ""%1"" parameter is not recognized." - IDS_CMDLINE_DUPLICATE "The command-line you have specified for the AFS Server Manager is invalid.\n\nThe ""%1"" parameter is specified more than once." - IDS_CMDLINE_UNEXPECTVALUE - "The command-line you have specified for the AFS Server Manager is invalid.\n\nThe ""%1"" parameter should not be given a value." - IDS_CMDLINE_MISSINGVAL "The command-line you have specified for the AFS Server Manager is invalid.\n\nThe ""%1"" parameter must be followed by a value." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "The command-line you have specified for the AFS Server Manager is invalid.\n\nThe ""/SUBSET"" parameter can only be specified if the ""/CELL"" parameter is specified as well." - IDS_CMDLINE_INVALIDSUBSET - "The server subset you have specified, ""%2"", has not been defined for the %1 cell." - IDS_CMDLINE_SERVERNOTCELL - "The command-line you have specified for the AFS Server Manager is invalid.\n\nThe ""/SERVER"" parameter can only be specified if the ""/CELL"" parameter is specified as well." - IDS_CMDLINE_RESET_TITLE "AFS Server Manager" - IDS_CMDLINE_RESET_DESC "The AFS Server Manager has cleared the specified settings." - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "The AFS Server Manager is unable to synchronize VLDB with partition %2 of server %1 because the partition either does not exist or is not exported.\n\nTo remove this partition from server %1, you must delete the volume VLDB entries which refer to it." - IDS_CMDLINE_USERPASSWORD - "The command-line you have specified for the AFS Server Manager is invalid.\n\nTo obtain new AFS tokens, the ""/USER"" and ""/PASSWORD"" parameters must both be specified." - IDS_ERROR_CANT_DELETE_KEY - "The AFS Server Manager was unable to delete server key %2 from server %1." - IDS_ERROR_CANT_GETRANDOMKEY - "The AFS Server Manager was unable to generate a random key for server %1." - IDS_ERROR_CANT_EXECUTE_COMMAND - "The AFS Server Manager was unable to execute the following command on server %1:\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "The AFS Server Manager completed the salvage operation successfully, but was unable to retrieve the log file describing the specific results of the salvage operation." - IDS_ERROR_CANT_SALVAGE "The AFS Server Manager was unable to perform the requested salvage operation." - IDS_ERROR_CANT_AUTH_ON "The AFS Server Manager was unable to enable authentication checking for server %1." - IDS_ERROR_CANT_AUTH_OFF "The AFS Server Manager was unable to disable authentication checking for server %1." - IDS_ERROR_CANT_LOAD_HOSTLIST - "The AFS Server Manager was unable to read the list of database host servers from server %1." - IDS_ERROR_CANT_SAVE_HOSTLIST - "The AFS Server Manager was unable to change the list of database host servers on server %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "The AFS Server Manager was unable to start because the AFS Control Center is not properly installed on this computer.\n\nYou may need to reinstall the AFS Control Center." - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "The AFS Server Manager was unable to start because of an unknown problem.\n\nYou may need to reinstall the AFS Control Center." - IDS_ERROR_CANT_CHANGEADDR - "The AFS Server Manager was unable to change the IP address in VLDB for server %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "Simple" - IDS_SERVICETYPE_CRON "Cron" - IDS_SERVICESTATE_STOPPED "Stopped" - IDS_SERVICESTATE_STOPPING "Stopping" - IDS_SERVICESTATE_STARTING "Starting" - IDS_SERVICESTATE_RUNNING "Running" - IDS_SERVICETYPE_FS_LONG "FS (filesystem)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "All services in cell %1:" - IDS_SERVICE_STARTDATE "Started %1" - IDS_SERVICE_STOPDATE "Stopped %1" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/es_ES/svrmgr.rc b/src/WINNT/afssvrmgr/lang/es_ES/svrmgr.rc deleted file mode 100644 index 75d5e7378..000000000 --- a/src/WINNT/afssvrmgr/lang/es_ES/svrmgr.rc +++ /dev/null @@ -1,3060 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Manager" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - RIGHTMARGIN, 165 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 301 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 261 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 228 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 294 - TOPMARGIN, 5 - BOTTOMMARGIN, 208 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 237 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 224 - TOPMARGIN, 7 - BOTTOMMARGIN, 254 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 307 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 4 - BOTTOMMARGIN, 153 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 314 - TOPMARGIN, 4 - BOTTOMMARGIN, 129 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 307 - TOPMARGIN, 7 - BOTTOMMARGIN, 139 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 297 - TOPMARGIN, 4 - BOTTOMMARGIN, 243 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 291 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 326 - TOPMARGIN, 7 - BOTTOMMARGIN, 158 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 300 - TOPMARGIN, 5 - BOTTOMMARGIN, 178 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 368 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 251 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 285 - TOPMARGIN, 7 - BOTTOMMARGIN, 99 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 241 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 221 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Célula" - BEGIN - MENUITEM "S&eleccionar...", M_CELL_OPEN - MENUITEM "&Autentificación...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "&Salir", M_EXIT - END - POPUP "&Ver" - BEGIN - POPUP "&Servidores" - BEGIN - MENUITEM "Iconos &grandes", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "Iconos &pequeños", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "&Detalles", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "&Todos los iconos", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "Sólo &estado", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "Panel de &vista rápida" - BEGIN - MENUITEM "&Ninguno", M_DIVIDE_NONE, CHECKED - MENUITEM "Barra de división &vertical", M_DIVIDE_H, CHECKED - MENUITEM "Barra de división &horizontal", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "O&peraciones en curso", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Servidores s&upervisados...", M_SUBSET - MENUITEM "&Columnas...", M_COLUMNS - MENUITEM "&Opciones...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL - END - POPUP "A&yuda" - BEGIN - MENUITEM "&Contenido", M_HELP - MENUITEM "Buscar &mandato...", M_HELP_FIND - MENUITEM "Buscar código de &error...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "&Acerca de AFS Server Manager...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "&Crear volumen...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "C&opia de seguridad de volúmenes...", M_SET_CLONE - MENUITEM "&Desbloquear todos los volúmenes", M_SET_UNLOCK - MENUITEM "S&incronizar VLDB...", M_SYNCVLDB - MENUITEM "Recu&perar volúmenes...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM "P&ropiedades", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "&Iniciar", M_SVC_START - MENUITEM "&Detener", M_SVC_STOP - MENUITEM "R&einiciar", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "&Ver archivo de registro", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "Su&primir", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM "P&ropiedades", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWOICONS, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Crear volumen...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWOICONS, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Crear servicio...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "Du&plicación...", M_SET_REPLICATION - MENUITEM "Li&berar ahora", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "&Copia de seguridad...", M_SET_CLONE - MENUITEM "&Volcar en archivo...", M_SET_DUMP - MENUITEM "Restaurar desde arc&hivo...", M_SET_RESTORE - MENUITEM "Establecer c&uota...", M_SET_SETQUOTA - MENUITEM "R&ecuperar...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Mover a...", M_SET_MOVETO - MENUITEM "Cambiar &nombre...", M_SET_RENAME - MENUITEM "&Suprimir", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Blo&quear", M_SET_LOCK - MENUITEM "&Desbloquear", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM "P&ropiedades", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "&Abrir ventana de servidor", M_SVR_OPEN - MENUITEM "&Cerrar ventana de servidor", M_SVR_CLOSE - MENUITEM "&Supervisar este servidor", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "Editar seguridad de ser&vidor...", M_SVR_SECURITY - MENUITEM "Ad&ministrar sistemas principales de base de datos...", - M_SVR_HOSTS - MENUITEM "C&opia de seguridad de seguridad de volúmenes...", M_SET_CLONE - MENUITEM "Desblo&quear todos los volúmenes", M_SET_UNLOCK - MENUITEM "Sincroni&zar VLDB...", M_SYNCVLDB - MENUITEM "Rec&uperar volúmenes...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Instalar archivo...", M_SVR_INSTALL - MENUITEM "&Desinstalar archivo...", M_SVR_UNINSTALL - MENUITEM "&Podar archivos antiguos...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "Obtener &fechas de archivo...", M_SVR_GETDATES - MENUITEM "Ver archivo de re&gistro...", M_VIEWLOG - MENUITEM "E&jecutar mandato...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM "P&ropiedades", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "Iconos &grandes", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "Iconos &pequeños", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "&Detalles", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "&Todos los iconos", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "Sólo &estado", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Servidores &supervisados...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "&Desbloquear todos los volúmenes", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "&Cerrar todo", M_SVR_CLOSEALL - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "Por &volumen", M_SET_VIEW_REPORT, CHECKED - MENUITEM "Por &partición", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "Sin &detalles", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWOICONS, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Crear volumen...", M_SET_CREATE - MENUITEM "&Restaurar desde archivo...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "C&opia de seguridad de volúmenes,...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "&Desbloquear todo", M_SET_UNLOCK - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Columnas...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "R&einiciar", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "&Ver archivo de registro", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM "P&ropiedades", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "&Mover aquí...", M_SET_MOVEHERE - MENUITEM "&Duplicar aquí...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "&Cancelar", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Servicios:",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Crear...",IDC_SVC_CREATE,56,80,39,12 - PUSHBUTTON "Su&primir",IDC_SVC_DELETE,98,80,39,12 - PUSHBUTTON "&Reiniciar",IDC_SVC_RESTART,140,80,39,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Particiones:",IDC_AGG_DESC,0,5,165,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,17,165, - 53,WS_EX_STATICEDGE - PUSHBUTTON "&Crear volumen...",IDC_AGG_CREATESET,102,72,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 194, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Volúmenes:",IDC_SET_DESC,0,5,194,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,194, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Crear...",IDC_SET_CREATE,4,80,34,12 - PUSHBUTTON "Su&primir",IDC_SET_DELETE,40,80,36,12 - PUSHBUTTON "&Duplicación...",IDC_SET_REP,78,80,50,12 - PUSHBUTTON "Establecer c&uota...",IDC_SET_SETQUOTA,130,80,62,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Añadir administrador",IDC_LIST_ADD,66,160,71,14 - PUSHBUTTON "&Eliminar administrador",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "Administradores para servidor %1:",IDC_LIST_NAME,5,7, - 216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 306, 160 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "ID:",IDC_STATIC,5,30,31,8 - LTEXT "(consultando)",IDC_AGG_ID,47,30,214,8 - LTEXT "Dispositivo:",IDC_STATIC,5,46,40,8 - LTEXT "(consultando)",IDC_AGG_DEVICE,47,46,214,8 - LTEXT "Volúmenes:",IDC_STATIC,5,62,39,8 - LTEXT "(consultando)",IDC_AGG_FILESETS,47,62,214,8 - CONTROL "Visualizar un a&viso si la cuota de volumen combinada supera la capacidad", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 48,76,253,10 - LTEXT "Uso:",IDC_STATIC,5,90,31,8 - LTEXT "(consultando)",IDC_AGG_USAGE,47,90,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,30,103,224,8, - WS_EX_STATICEDGE - CONTROL "Visualizar un a&viso si el uso de la partición supera ", - IDC_AGG_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47, - 116,214,10 - CONTROL "el umbral &por omisión para este servidor", - IDC_AGG_WARN_AGGFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,49,131,203,9 - CONTROL "un &umbral de",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,62,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,112,143,29,12, - ES_AUTOHSCROLL - LTEXT "% de su tamaño",IDC_AGG_WARN_AGGFULL_DESC,152,145,100,8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,21,20 - LTEXT "Partición %2 (servidor %1)",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Dirección IP:",IDC_STATIC,5,29,43,8 - LISTBOX IDC_SVR_ADDRESSES,53,29,70,12,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "Cambiar &direcciones...",IDC_SVR_CHANGEADDR,144,27,77, - 12 - PUSHBUTTON "&Requerir autentificación",IDC_SVR_AUTH_YES,41,81,84,12 - PUSHBUTTON "Permitir &no autentificado",IDC_SVR_AUTH_NO,129,81,80, - 12 - LTEXT "Número de particiones",IDC_STATIC,11,131,75,8 - LTEXT "(consultando)",IDC_SVR_NUMAGGREGATES,112,131,99,8 - LTEXT "Capacidad total:",IDC_STATIC,11,148,77,8 - LTEXT "(consultando)",IDC_SVR_CAPACITY,112,147,99,8 - LTEXT "Cuota de volumen combinada:",IDC_STATIC,11,165,96,8 - LTEXT "(consultando)",IDC_SVR_ALLOCATION,112,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(nombre de servidor)",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "Seguridad",IDC_STATIC,5,52,216,52 - GROUPBOX "Almacenamiento",IDC_STATIC,5,115,216,68 - LTEXT "Puede requerir que se autentifique el acceso a este servidor.", - IDC_STATIC,11,67,210,8 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 266, 158 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "cualquier partición de este servidor se llena en un", - IDC_SVR_WARN_AGGFULL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,18,171,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,186,16,24,12,ES_AUTOHSCROLL - LTEXT "%",IDC_STATIC,215,18,28,8 - CONTROL "cualquier volumen de este servidor se llena en un", - IDC_SVR_WARN_SETFULL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,32,169,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,186,30,24,12,ES_AUTOHSCROLL - LTEXT "%",IDC_STATIC,215,32,44,8 - CONTROL "la cuota combinada de cualquier partición supera su capacidad", - IDC_SVR_WARN_AGGALLOC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,46,218,9 - CONTROL "se detiene la ejecución de algún servicio de este servidor", - IDC_SVR_WARN_SVCSTOP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,60,218,9 - CONTROL "algún volumen de este servidor carece de entrada de VLDB", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,74,218,9 - CONTROL "VLDB hace referencia a cualquier partición fuera de línea de este servidor", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,88,249,9 - CONTROL "VLDB hace referencia a cualquier volumen fuera de línea de este servidor", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,103,249,9 - CONTROL "Actualizar información de servidor cada", - IDC_SVR_AUTOREFRESH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,142,138,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,151,140,27,13,ES_AUTOHSCROLL - LTEXT "minutos",IDC_STATIC,184,142,25,8 - LTEXT "Visualizar un aviso si",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 233, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "&Ver registro de servicio",IDC_SVC_VIEWLOG,34,182,78,14 - PUSHBUTTON "&Iniciar ahora",IDC_SVC_START,123,182,46,14 - PUSHBUTTON "De&tener ahora",IDC_SVC_STOP,172,182,50,14 - CONTROL "Visualizar un &aviso si se detiene el servicio", - IDC_SVC_WARNSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 15,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Servicio %2 (servidor %1)",IDC_SVC_NAME,40,13,168,8 - LTEXT "Tipo:",IDC_STATIC,5,29,44,8 - LTEXT "(consultando)",IDC_SVC_TYPE,60,29,168,8 - LTEXT "Parámetros:",IDC_STATIC,5,45,44,8 - EDITTEXT IDC_SVC_PARAMS,60,45,168,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Notificador:",IDC_STATIC,5,61,44,8 - LTEXT "(consultando)",IDC_SVC_NOTIFIER,60,61,168,8 - LTEXT "Último inicio:",IDC_STATIC,5,78,42,8 - LTEXT "(consultando)",IDC_SVC_STARTDATE,60,77,168,8 - LTEXT "Última parada:",IDC_STATIC,5,93,47,8 - LTEXT "(consultando)",IDC_SVC_STOPDATE,60,93,168,8 - LTEXT "Última anomalía:",IDC_STATIC,5,109,53,8 - EDITTEXT IDC_SVC_LASTERROR,60,109,168,13,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "Estado de servicio",IDC_STATIC,5,127,223,75 - LTEXT "El estado actual de este servicio se está determinando...", - IDC_SVC_STATUS,11,142,200,8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 299, 214 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "ID de volumen:",IDC_STATIC,5,30,52,8 - LTEXT "(desconocido)",IDC_SET_ID,73,30,219,8 - LTEXT "Creado:",IDC_STATIC,5,46,39,8 - LTEXT "(consultando)",IDC_SET_CREATEDATE,73,46,219,8 - LTEXT "Actualizado:",IDC_STATIC,5,62,39,8 - LTEXT "(consultando)",IDC_SET_UPDATEDATE,73,62,112,8 - LTEXT "Accedido:",IDC_STATIC,5,78,39,8 - LTEXT "(consultando)",IDC_SET_ACCESSDATE,73,78,219,8 - LTEXT "Copia de seguridad:",IDC_STATIC,5,94,65,8 - LTEXT "(consultando)",IDC_SET_BACKUPDATE,73,94,219,8 - LTEXT "Cuenta de archivos:",IDC_STATIC,5,110,67,8 - LTEXT "(consultando)",IDC_SET_FILES,73,110,219,8 - LTEXT "Estado",IDC_STATIC,5,126,26,8 - LTEXT "(consultando)",IDC_SET_STATUS,73,126,115,8 - PUSHBUTTON "&Bloquear",IDC_SET_LOCK,191,124,49,12 - PUSHBUTTON "&Desbloquear",IDC_SET_UNLOCK,245,124,49,12 - LTEXT "Uso:",IDC_STATIC,5,142,31,8 - LTEXT "(consultando)",IDC_SET_USAGE,73,142,136,8 - PUSHBUTTON "&Establecer cuota...",IDC_SET_QUOTA,229,140,65,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,75,156,219,8, - WS_EX_STATICEDGE - CONTROL "&Visualizar un aviso si el uso de este volumen supera", - IDC_SET_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20, - 170,219,10 - CONTROL "el umbral por &omisión para este servidor (%1%% de su tamaño)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,39,185,207,9 - CONTROL "un &umbral de",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,39,199,62,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,102,196,29,12, - ES_AUTOHSCROLL - LTEXT "% de su tamaño",IDC_SET_WARN_SETFULL_DESC,139,199,105,8 - ICON IDI_FILESET,IDC_STATIC,5,5,21,20 - LTEXT "Volumen %3 (servidor %1, partición %2)",IDC_SET_NAME,75, - 14,219,8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS Server Manager" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Célula seleccionada:",IDC_STATIC,2,8,69,8 - LTEXT "(el nombre de célula se colocará aquí)",IDC_CELL,73,8, - 208,9 - LTEXT "Señales de AFS:",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1 (caducarán las señales %3)",IDC_AFS_ID,74,19,208, - 9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Servidor" -CLASS "ServerWindowClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 242, 233 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Servidor:",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,69,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ser&vicio:",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,69,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Mandato:",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,69,68,168,13,ES_AUTOHSCROLL - LTEXT "&Parámetros:",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,69,86,168,13,ES_AUTOHSCROLL - LTEXT "&Notificador:",IDC_STATIC,5,105,44,8 - EDITTEXT IDC_SVC_NOTIFIER,69,103,168,13,ES_AUTOHSCROLL - LTEXT "Archivo de ®istro:",IDC_STATIC,5,122,63,8 - EDITTEXT IDC_SVC_LOGFILE,69,120,168,13,ES_AUTOHSCROLL - CONTROL "S&encillo (se ejecuta de modo continuo)", - IDC_SVC_TYPE_SIMPLE,"Button",BS_AUTORADIOBUTTON,11,154, - 201,10 - CONTROL "Iniciar este servicio a&hora",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "&FS (sistema de archivos)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "&Cron (se ejecuta a intervalos especificados)", - IDC_SVC_TYPE_CRON,"Button",BS_AUTORADIOBUTTON,11,195,201, - 10 - LTEXT "C&uándo ejecutar:",IDC_STATIC,23,209,56,8 - COMBOBOX IDC_SVC_RUNDAY,84,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "a las",IDC_STATIC,157,209,18,8 - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,178,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Servicio nuevo",IDC_SVC_DESC,39,13,168,8 - GROUPBOX "Tipo de servicio",IDC_STATIC,5,141,232,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "&Liberar ahora",IDC_SET_RELEASE,11,143,52,14 - PUSHBUTTON "&Crear...",IDC_SET_REPSITE_ADD,129,143,38,14 - PUSHBUTTON "Su&primir",IDC_SET_REPSITE_DELETE,172,143,38,14 - LTEXT "Servidor:",-1,11,31,37,8 - LTEXT "(nombre de servidor)",IDC_SET_SERVER,55,31,147,8 - LTEXT "Partición:",-1,11,44,37,8 - LTEXT "(nombre de partición)",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "Volumen:",-1,11,18,37,8 - LTEXT "(nombre de volumen)",IDC_SET_NAME,55,18,147,8 - GROUPBOX "Leer/Grabar volumen",-1,5,5,211,56 - GROUPBOX "Duplicados de volumen",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 228, 258 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Seleccionar célula - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Célula:",IDC_STATIC,4,24,27,8 - COMBOBOX IDC_OPENCELL_CELL,33,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "Autentificación de AFS",IDC_STATIC,4,44,220,92 - LTEXT "&Identidad de AFS:",IDC_STATIC,22,104,60,8 - EDITTEXT IDC_OPENCELL_ID,89,102,129,14,ES_AUTOHSCROLL - LTEXT "C&ontraseña de AFS:",IDC_STATIC,22,120,66,8 - EDITTEXT IDC_OPENCELL_PASSWORD,89,118,129,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "A&vanzado >>",IDC_ADVANCED,4,146,53,14 - DEFPUSHBUTTON "Aceptar",IDOK,86,146,41,14 - PUSHBUTTON "Cancelar",IDCANCEL,135,146,41,14 - PUSHBUTTON "A&yuda",9,183,146,41,14 - CONTROL "Supervisar &todos los servidores de esta célula", - IDC_MON_ALL,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,10, - 204,185,9 - CONTROL "&Sólo un servidor:",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,219,110,10 - EDITTEXT IDC_MON_SERVER,137,218,83,13,ES_AUTOHSCROLL - CONTROL "Sólo los servidores del s&ubconjunto:",IDC_MON_SOME, - "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,10,235,126,13 - COMBOBOX IDC_MON_SUBSET,137,233,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Seleccione la célula de AFS con la que le gustaría trabajar.", - IDC_STATIC,4,7,200,8 - GROUPBOX "Supervisar servidores",IDC_ADVANCED_GROUP,4,170,220,84 - LTEXT "Para un rendimiento más rápido, puede optar por supervisar sólo un subconjunto de los servidores disponibles en esta célula.", - IDC_STATIC,10,182,206,17 - LTEXT "(consultando...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Para administrar una célula, debe volver a entrar la contraseña de AFS:", - IDC_STATIC,10,83,204,17 - LTEXT "Las señales de AFS actuales dentro de la célula seleccionada:", - IDC_STATIC,10,57,207,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Aviso - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Continuar esperando hasta que la tarea finalice con normalidad", - IDC_TIMEOUT_WAIT,"Button",BS_AUTORADIOBUTTON,15,87,211, - 10 - CONTROL "&Finalizar la tarea",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,15,101,208,10 - DEFPUSHBUTTON "Aceptar",IDOK,93,139,50,14 - LTEXT "Tiempo transcurrido para la ejecución de la tarea:", - IDC_STATIC,4,119,160,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,169,119,29,8 - LTEXT "El AFS Server Manager ha estado esperando durante un período de tiempo inesperadamente largo a que finalizase una tarea de red.", - IDC_STATIC,4,7,228,18 - LTEXT "Puede continuar permitiendo la ejecución de la tarea (recomendado), o bien en el caso de que crea que la tarea no finalizará nunca, puede dejar que el AFS Server Manager la finalice.", - IDC_STATIC,4,30,228,26 - LTEXT "Por favor, tenga en cuenta que la tarea sigue en curso mientras se muestra esta ventana; si finaliza la tarea, esta ventana se cerrará automáticamente.", - IDC_STATIC,4,60,228,24 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Columnas" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Seleccione las columnas para visualizar al efectuar el listado:", - IDC_STATIC,5,7,126,18 - COMBOBOX IDC_COLUMNS,134,9,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Columnas disponibles:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Columnas para &visualizar:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Aña&dir >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< &Eliminar",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "Mover hacia a&rriba",IDC_COL_UP,142,122,63,14 - PUSHBUTTON "Mover hacia a&bajo",IDC_COL_DOWN,208,122,65,14 - GROUPBOX "Listar columnas",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Actualizando - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "0% completado",IDC_REFRESH_PERCENT,4,49,216,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,216,8 - LTEXT "Espere, por favor...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "&Omitir",IDC_REFRESH_SKIP,222,58,38,12,NOT WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Crear volumen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Nombre:",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,46,28,116,14,ES_AUTOHSCROLL - LTEXT "&Cuota:",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,46,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,90,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "C&opia de seguridad:",IDC_STATIC,4,66,65,8 - CONTROL "C&rear también una versión de copia de seguridad de este volumen", - IDC_SET_CLONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,90, - 66,224,8 - LTEXT "&Servidor:",IDC_STATIC,4,84,39,8 - COMBOBOX IDC_SET_SERVER,46,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partición:",IDC_STATIC,4,102,39,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,102,271, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "Aceptar",IDOK,156,191,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,211,191,50,14 - PUSHBUTTON "A&yuda",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Volumen nuevo",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Suprimir volumen" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Cancelar",IDCANCEL,169,84,50,14 - PUSHBUTTON "Aceptar",IDOK,115,84,50,14 - PUSHBUTTON "A&yuda",9,223,84,50,14 - CONTROL "&Suprimir volumen %3 del servidor %1, partición %2", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 46,45,227,10 - CONTROL "Suprimir entrada de &VLDB para volumen %3", - IDC_DELSET_VLDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46, - 60,227,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "¡Precaución!\n\nEsta operación hará que el volumen %3 se elimine permanentemente.", - IDC_DELSET_DESC,31,7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Volumen de copia de seguridad - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,183,67,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,237,67,50,14 - PUSHBUTTON "A&yuda",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "Una copia de seguridad de volumen actúa como una copia de sólo lectura de dicho volumen. Un volumen de leer/grabar sólo puede tener una versión de copia de seguridad. ", - IDC_STATIC,34,9,307,17 - LTEXT "Pulse en Aceptar para crear una copia de seguridad del volumen %3 en el servidor %1, partición %2. Si ya existe una copia de seguridad de este volumen, la copia de seguridad se actualizará. ", - IDC_CLONE_DESC,34,32,307,24 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas conocidos",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Servicio %2 (servidor %1)",IDC_PROBLEM_TITLE,52,13,168, - 8 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas conocidos",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas conocidos",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Partición %2 (servidor %1)",IDC_PROBLEM_TITLE,38,14,214, - 8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas conocidos",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Volumen %3 (servidor %1, partición %2)", - IDC_PROBLEM_TITLE,49,14,219,8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Mover volumen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "Aceptar",IDOK,115,156,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,156,50,14 - PUSHBUTTON "A&yuda",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "&Mover volumen a:",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Moviendo volumen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Moviendo volumen %3 desde partición %2 en servidor %1 a partición %5 en servidor %4...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 311, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Ver archivo de registro" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Ver archivo de registro en &servidor:",IDC_STATIC,4,45, - 110,8 - COMBOBOX IDC_VIEWLOG_SERVER,115,43,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Archivo en servidor a visualizar:",IDC_STATIC,4,64,100, - 8 - EDITTEXT IDC_VIEWLOG_FILENAME,115,62,191,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,199,88,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,257,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,21,20 - LTEXT "Por favor, entre la vía de acceso completa del archivo de registro que desea visualizar.", - IDC_VIEWLOG_DESC,65,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Ver archivo de registro" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Contenido del archivo:",IDC_SVC_VIEWLOG_CONTENTS,4,41, - 277,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Guardar &como...",IDC_VIEWLOG_SAVEAS,170,167,56,14 - DEFPUSHBUTTON "Ce&rrar",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "Registrar archivo [para servicio %2] en servidor %1", - IDC_SVC_VIEWLOG_DESC,33,7,248,8 - LTEXT "Nombre de archivo en servidor: %1", - IDC_SVC_VIEWLOG_FILENAME,33,23,248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Establecer cuota de volumen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Cuota actual:",IDC_STATIC,4,49,47,8 - LTEXT "(desconocido)",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "Nueva &cuota:",IDC_STATIC,4,81,47,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Aceptar",IDOK,109,112,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,163,112,50,14 - PUSHBUTTON "A&yuda",9,217,112,50,14 - PUSHBUTTON "&Propiedades...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "Partición:",IDC_STATIC,4,30,47,8 - LTEXT "Partición %2 de servidor %1",IDC_SET_AGGREGATE,59,30, - 141,8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Volumen %1",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Operaciones en curso - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "La operaciones siguientes están actualmente en curso:", - IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Sincronizar VLDB" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,107,81,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,161,81,50,14 - PUSHBUTTON "A&yuda",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "(definido en el momento de la ejecución)",IDC_SYNC_DESC, - 37,4,228,32 - LTEXT "(definido en el momento de la ejecución)", - IDC_SYNC_DESC2,37,44,228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Duplicar volumen" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "Aceptar",IDOK,115,153,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,153,50,14 - PUSHBUTTON "A&yuda",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Duplicado nuevo del volumen %3",IDC_SET_NAME,31,12,242, - 8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "&Crear un duplicado nuevo de este volumen en:", - IDC_STATIC,4,35,149,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 264, 157 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Instalar archivo" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Archivo de origen:",IDC_STATIC,4,74,63,8 - EDITTEXT IDC_FILENAME,71,72,135,14,ES_AUTOHSCROLL - PUSHBUTTON "&Examinar...",IDC_BROWSE,210,72,50,14 - LTEXT "&Servidor de destino:",IDC_STATIC,4,94,63,8 - COMBOBOX IDC_SERVER,71,92,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Nombre de destino:",IDC_STATIC,4,114,63,8 - EDITTEXT IDC_DIRECTORY,71,112,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,86,139,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,140,139,50,14 - PUSHBUTTON "A&yuda",9,210,139,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,21,20 - LTEXT "Instalar archivo en servidor",IDC_STATIC,32,12,127,8 - LTEXT "(texto definido en el momento de la ejecución)\n(texto definido en el momento de la ejecución)\n(texto definido en el momento de la ejecución)\n(texto definido en el momento de la ejecución)", - IDC_INSTALL_DESC,4,29,256,33 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Desinstalar archivo" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",IDC_STATIC,4,66,35,8 - COMBOBOX IDC_SERVER,67,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Archivo de destino:",IDC_STATIC,4,85,61,8 - EDITTEXT IDC_FILENAME,67,83,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,88,121,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,141,121,50,14 - PUSHBUTTON "A&yuda",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "Desinstalar archivo del servidor",IDC_STATIC,32,12,127, - 8 - LTEXT "Esta operación le permite restaurar una copia instalada con anterioridad de un archivo en un determinado servidor. Si no existe ninguna copia instalada con anterioridad del archivo seleccionado, se eliminará el archivo. ", - IDC_STATIC,4,29,240,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 318, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Podar archivos antiguos" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Servidor:",-1,4,56,44,8 - COMBOBOX IDC_SERVER,53,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Todos los archivos de &imagen de la memoria", - IDC_OP_DELETE_CORE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 70,73,178,10 - CONTROL "Todos los archivos .&BAK (copias de seguridad de archivo)", - IDC_OP_DELETE_BAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 70,84,220,10 - CONTROL "Todos los archivos .&OLD (copias de seguridad de archivos más antiguos)", - IDC_OP_DELETE_OLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 70,95,243,10 - DEFPUSHBUTTON "Aceptar",IDOK,148,115,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,202,115,50,14 - PUSHBUTTON "A&yuda",9,264,115,50,14 - ICON IDI_PRUNE,-1,4,4,21,20 - LTEXT "Podar archivos antiguos del servidor",-1,32,12,128,8 - LTEXT "Esta operación elimina copias de seguridad de los archivos instalados en un determinado servidor.", - -1,4,29,310,16 - LTEXT "Archivos a suprimir:",-1,4,73,62,8 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Cambiar nombre de volumen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Nombre &antiguo",IDC_STATIC,31,67,54,8 - EDITTEXT IDC_RENSET_OLD,89,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "Nombre &nuevo",IDC_STATIC,31,85,55,8 - EDITTEXT IDC_RENSET_NEW,89,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,115,115,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,115,50,14 - PUSHBUTTON "Ayuda",9,223,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Para cambiar el nombre del volumen %3, entre uno nuevo. Se redenominan automáticamente el nombre de copia de seguridad del volumen y sus duplicados.\n\nPrecaución: si es un volumen montado, elimínelo y cree nuevos puntos de montaje.", - IDC_RENSET_DESC,31,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 277, 68 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Suprimir servicio" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Cancelar",IDCANCEL,169,50,50,14 - PUSHBUTTON "Aceptar",IDOK,115,50,50,14 - PUSHBUTTON "Ayuda",9,223,50,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "¡Precaución!\n\nEsta operación hará que el servicio %2 se detenga y se elimine del servidor %1.", - IDC_DELSVC_DESC,31,7,242,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Obtener fechas de archivo" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",-1,4,56,42,8 - COMBOBOX IDC_SERVER,71,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Archivo a consultar:",-1,4,75,64,8 - EDITTEXT IDC_FILENAME,71,73,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,86,107,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,140,107,50,14 - PUSHBUTTON "A&yuda",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "Obtener fechas de archivos del servidor",-1,32,12,127,8 - LTEXT "Esta operación obtiene la fecha en que se modificaron por última vez un archivo y sus copias de seguridad (si es que existen).", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Obtener fechas de archivos - Resultados" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Servidor:",IDC_STATIC,4,30,39,8 - LTEXT "(definido en el momento de la ejecución)",IDC_SERVER,72, - 30,137,8 - LTEXT "Nombre de archivo:",IDC_STATIC,4,45,63,8 - LTEXT "(definido en el momento de la ejecución)",IDC_FILENAME, - 72,45,137,8 - LTEXT "Fecha de archivo:",IDC_STATIC,4,60,60,8 - LTEXT "(desconocida; no ha podido encontrarse el archivo)", - IDC_DATE_FILE,72,60,168,8 - LTEXT "Fecha de .BAK:",IDC_STATIC,4,75,59,8 - LTEXT "(desconocida; no ha podido encontrarse el archivo)", - IDC_DATE_BAK,72,75,167,8 - LTEXT "Fecha de .OLD:",IDC_STATIC,4,90,60,8 - LTEXT "(desconocida; no ha podido encontrarse el archivo)", - IDC_DATE_OLD,72,90,166,8 - DEFPUSHBUTTON "Ce&rrar",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "Obtener fechas de archivos del servidor",IDC_STATIC,32, - 12,127,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 311, 143 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Volumen de vuelco - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Crear archivo de vuelco con el &nombre:",IDC_STATIC,4, - 42,79,18 - EDITTEXT IDC_DUMP_FILENAME,86,44,151,14,ES_AUTOHSCROLL - PUSHBUTTON "&Examinar...",IDC_DUMP_BROWSE,257,44,50,14 - CONTROL "Volcar &todo el contenido del volumen %3 (partición %1:%2)", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,10, - 78,274,10 - CONTROL "Volcar sólo los archivos que hayan cambiado &desde", - IDC_DUMP_LIMIT_TIME,"Button",BS_AUTORADIOBUTTON,10,94, - 178,10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,190,93,51, - 13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,248,93,56, - 13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "Aceptar",IDOK,131,125,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,185,125,50,14 - PUSHBUTTON "A&yuda",9,257,125,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "Esta operación copia el contenido de un volumen en un único archivo, por lo que puede efectuarse la copia de seguridad del volumen de una manera sencilla. El contenido de los volúmenes volcados de este modo puede restaurarse con posterioridad.", - IDC_STATIC,46,7,261,33 - GROUPBOX "Parámetros de vuelco",IDC_STATIC,4,62,303,53 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 301, 247 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Restaurar volumen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Archivo a &restaurar:",IDC_STATIC,4,33,61,8 - EDITTEXT IDC_RESTORE_FILENAME,69,30,175,14,ES_AUTOHSCROLL - PUSHBUTTON "&Examinar...",IDC_RESTORE_BROWSE,247,30,50,14 - CONTROL "Este es un archivo de vuelco &gradual", - IDC_RESTORE_INCREMENTAL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,69,46,214,10 - LTEXT "&Volumen:",IDC_STATIC,11,102,38,8 - EDITTEXT IDC_RESTORE_SETNAME,52,100,115,14,ES_AUTOHSCROLL - LTEXT "&Servidor:",IDC_STATIC,11,145,36,8 - COMBOBOX IDC_RESTORE_SERVER,53,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Partición:",IDC_STATIC,11,162,36,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,52,161,231, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "Aceptar",IDOK,128,229,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,183,229,50,14 - PUSHBUTTON "A&yuda",9,247,229,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "Restaurar volumen desde archivo de vuelco",IDC_STATIC, - 33,11,224,8 - GROUPBOX "Volumen de destino",IDC_STATIC,4,63,293,160 - LTEXT "Al restaurar un volumen desde un archivo de vuelco, puede crear un volumen nuevo o sobregrabar un volumen de leer/grabar existente.", - IDC_STATIC,11,78,259,16 - LTEXT "(definido en el momento de la ejecución)\n(definido en el momento de la ejecución)", - IDC_RESTORE_CREATE,53,119,229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 296, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "Detener y reiniciar &periódicamente todos los servicios en este servidor", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 71,231,10 - LTEXT "&Reiniciar",IDC_BOS_GENRES_DESC1,23,87,35,8 - COMBOBOX IDC_BOS_GENRES_DATE,61,84,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "&en",IDC_BOS_GENRES_DESC2,134,87,8,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,145, - 84,53,13,WS_EX_CLIENTEDGE - CONTROL "Probar periódicamente si hay &binarios nuevos en todos los servicios de este servidor", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 151,278,10 - LTEXT "Pr&obar",IDC_BOS_BINRES_DESC1,23,167,25,8 - COMBOBOX IDC_BOS_BINRES_DATE,59,164,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "e&n",IDC_BOS_BINRES_DESC2,132,167,8,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,143, - 164,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,21,20 - LTEXT "Servicio %2 (servidor %1)",IDC_SVC_NAME,37,13,168,8 - GROUPBOX "Servicio BOS",IDC_STATIC,5,27,285,175 - LTEXT "El servicio BOS puede utilizarse para detener y reiniciar periódicamente todos los servicios en este servidor (incluyendo el propio servicio BOS).", - IDC_STATIC,11,45,260,18 - LTEXT "El servicio BOS también puede utilizarse para probar periódicamente todos los servicios de un servidor, deteniendo y reiniciando sólo los servicios cuyos archivos binarios se hayan actualizado.", - IDC_STATIC,11,118,263,25 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Volcando volumen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Creando archivo de vuelco %4 desde volumen %3...", - IDC_DUMPSET_DESC,4,41,229,19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Restaurando volumen - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "Restaurando volumen %1 desde archivo de vuelco %2...", - IDC_RESTORESET_DESC,4,41,229,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 330, 162 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Copia de seguridad de volúmenes- AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Crear versiones de copia de seguridad de &todos los volúmenes de esta célula", - IDC_CLONE_ALL,"Button",BS_AUTORADIOBUTTON,30,53,277,10 - GROUPBOX " ",IDC_STATIC,21,77,265,60 - CONTROL "Crear &sólo copias de seguridad para los volúmenes que satisfagan los siguientes criterios:", - IDC_CLONE_SOME,"Button",BS_AUTORADIOBUTTON,30,67,293,11 - CONTROL "Sólo los volúmenes del s&ervidor:",IDC_CLONE_SVR_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,87,124,10 - COMBOBOX IDC_CLONE_SVR,186,86,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Sólo los volúmenes de la &partición:", - IDC_CLONE_AGG_LIMIT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,41,103,128,10 - COMBOBOX IDC_CLONE_AGG,186,102,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Sólo los volúmenes que &comiencen por:", - IDC_CLONE_PREFIX_LIMIT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,41,120,141,10 - EDITTEXT IDC_CLONE_PREFIX,186,119,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,154,144,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,208,144,50,14 - PUSHBUTTON "A&yuda",9,276,144,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Un volumen actúa como una copia de sólo lectura de dicho volumen. Un volumen de leer/grabar sólo puede tener una versión de copia de seguridad.\n\nPuede crear versiones de copia de seguridad para más de un volumen a la vez.", - IDC_STATIC,30,7,244,40 -END - -IDD_SUBSETS DIALOGEX 0, 0, 305, 183 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Servidores supervisados" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Nombre de subconjunto:",IDC_STATIC,12,77,79,8 - EDITTEXT IDC_SUBSET_NAME,93,75,116,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "&Abrir...",IDC_SUBSET_LOAD,214,75,39,14 - PUSHBUTTON "&Guardar...",IDC_SUBSET_SAVE,257,75,39,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "Supervisar &todos",IDC_SUBSET_ALL,216,122,77,14 - PUSHBUTTON "No supervisar &ninguno",IDC_SUBSET_NONE,216,140,77,14 - LTEXT "Para mejorar el rendimiento al trabajar en una célula grande, puede optar por no supervisar los problemas de determinados servidores. El AFS Server Manager no mostrará los volúmenes, particiones o servicios del servidor no supervisado. ", - IDC_STATIC,5,5,295,24 - LTEXT "Puede optar por supervisar (o no supervisar) un servidor en cualquier momento. Puede crear subconjuntos de servidor para designar las listas de servidores que deben supervisarse. ", - IDC_STATIC,5,37,295,18 - GROUPBOX "Subconjunto actual",IDC_STATIC,5,64,295,114 - LTEXT "Servidores a supervisar:",IDC_STATIC,12,95,112,8 -END - -IDD_SUBSET_LOADSAVE DIALOGEX 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(título definido en el momento de la ejecución)" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Nombre de subconjunto:",1090,5,109,45,18,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,54,110,165,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Abrir",IDOK,226,110,50,14 - PUSHBUTTON "Cance&lar",IDCANCEL,226,127,50,14 - CONTROL "List1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "Subconjuntos ya definidos para esta célula:",IDC_STATIC, - 4,6,166,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Buscar mandato" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Visualizar a&yuda",IDOK,147,38,67,14 - PUSHBUTTON "&Cancelar",IDCANCEL,147,55,67,14 - LTEXT "Para averiguar el modo de utilizar el AFS Server Manager para efectuar una tarea, seleccione una línea de mandatos a continuación y pulse en el botón Mostrar ayuda.", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Buscar código de error" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Número de &error:",IDC_STATIC,4,41,53,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Convertir",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "Ce&rrar",IDCANCEL,85,123,48,14 - LTEXT "(texto definido en el momento de la ejecución)", - IDC_ERROR_DESC,4,71,210,42 - LTEXT "Para averiguar que es lo que significa un código de error, escriba el código a continuación y pulse en el botón ""Convertir"".", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Acerca de AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS Server Manager versión 3.5",IDC_STATIC,33,8,163,8 - LTEXT "Copyright © IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "Ce&rrar",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "El AFS Server Manager está buscando servidores en la célula %1...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 373, 136 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Mostrar nombres de dominio totalmente calificados para los servidores (por ejemplo, ""máquina.compañía.com"")", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,5,363,10 - CONTROL "Mostrar un &aviso si se trabaja sin señales administrativas", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,19,363,10 - CONTROL "...muestra siempre las propiedades de dicho servidor", - IDC_OPT_SVR_DBL_PROP,"Button",BS_AUTORADIOBUTTON,17,50, - 253,10 - CONTROL "...muestra las propiedades del servidor sólo si el Panel de Vista rápida está abierto.", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON,17, - 63,341,10 - CONTROL "...siempre abre una ventana para dicho servidor", - IDC_OPT_SVR_DBL_OPEN,"Button",BS_AUTORADIOBUTTON,17,75, - 253,10 - CONTROL "...abrir una ventana de servidor hace que se supervise dicho servidor", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,107,253,10 - CONTROL "...cerrar una ventana de servidor hace que no se supervise dicho servidor", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,121,253,10 - LTEXT "Haciendo una doble pulsación en un icono de servidor...", - IDC_STATIC,5,38,363,8 - LTEXT "Si se está utilizando un subconjunto de servidor y se cierra el panel de Vista rápida...", - IDC_STATIC,5,95,363,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Añadir clave de servidor",IDC_KEY_ADD,46,160,82,14 - PUSHBUTTON "&Eliminar clave de servidor",IDC_KEY_REMOVE,133,160,87, - 14 - LTEXT "Claves para servidor:",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Añadir clave de servidor" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Versión:",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "Valor:",IDC_STATIC,7,58,21,8 - CONTROL "Cifrar esta serie:",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,43,58,73,10 - CONTROL "Utilizar esta clave:",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,43,76,71,10 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "A&leatorio",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "Aviso: después de añadir una clave nueva al servidor, debería modificar la cuenta de AFS para utilizar la clave nueva. Después de algunos días, puede eliminar las claves de servidor antiguas. ", - IDC_STATIC,7,99,267,27 - DEFPUSHBUTTON "Aceptar",IDOK,116,129,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,170,129,50,14 - PUSHBUTTON "Ayuda",9,224,129,50,14 - LTEXT "Clave nueva para servidor %1",IDC_KEY_TITLE,43,14,181,8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 277, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Iniciar/detener servicio" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,115,114,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,114,50,14 - PUSHBUTTON "A&yuda",9,223,114,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,21,20 - LTEXT "Pulsar en Aceptar para iniciar/detener servicio %2 en servidor %1.", - IDC_STARTSTOP_TEXT,31,12,242,9 - CONTROL "&Permanente (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,37, - 68,226,10 - CONTROL "&Temporal (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,37, - 83,226,10 - GROUPBOX "Inicio de servicio",IDC_STATIC,31,31,242,70 - LTEXT "Puede hacer que este cambio sea permanente, por lo que el servicio %2 (no) se iniciciará automáticamente si se reinicia el servidor %1.", - IDC_STARTSTOP_STARTUP,38,45,223,16 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Ejecutar mandato" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",IDC_STATIC,4,63,42,8 - COMBOBOX IDC_SERVER,50,61,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Mandato:",IDC_STATIC,4,82,42,8 - EDITTEXT IDC_COMMAND,50,80,194,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,86,107,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,140,107,50,14 - PUSHBUTTON "A&yuda",9,194,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,21,20 - LTEXT "Ejecutar mandato en servidor",IDC_STATIC,32,12,185,8 - LTEXT "Esta operación le permite emitir un mandato en un servidor remoto.\nNormalmente se utiliza para reiniciar un servidor ejecutando el archivo de mandatos /etc/reboot.", - IDC_STATIC,4,29,240,27 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 310, 255 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Recuperar volúmenes - AFS Server Manager" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",IDC_STATIC,30,55,35,8 - COMBOBOX IDC_SERVER,67,53,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partición:",IDC_STATIC,30,72,35,8 - COMBOBOX IDC_AGGREGATE,67,70,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Re&cuperar todas las particiones",IDC_AGGREGATE_ALL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,163,72,117,10 - LTEXT "V&olumen:",IDC_STATIC,29,90,35,8 - COMBOBOX IDC_FILESET,67,88,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Rec&uperar todos los volúmenes",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,162,90,118,10 - DEFPUSHBUTTON "Aceptar",IDOK,131,108,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,188,108,50,14 - PUSHBUTTON "A&yuda",9,254,108,50,14 - PUSHBUTTON "A&vanzado >>",IDC_ADVANCED,4,108,53,14 - LTEXT "Vía de acceso para archivos &temporales:",IDC_STATIC,10, - 142,130,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,145,141,144,13,ES_AUTOHSCROLL - CONTROL "Operaciones de recuperación pa&ralelas; número de procesos:", - IDC_SALVAGE_SIMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,157,207,10 - EDITTEXT IDC_SALVAGE_NUM,239,156,25,13,ES_AUTOHSCROLL - CONTROL "&No recuperar volúmenes dañados",IDC_SALVAGE_READONLY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,167,194,10 - CONTROL "&Descomponer operaciones de lectura en bloques pequeños", - IDC_SALVAGE_BLOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,177,250,10 - CONTROL "&Forzar la recuperación de todos los volúmenes indicados", - IDC_SALVAGE_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,187,241,10 - CONTROL "Forzar r&econstrucción de estructura de directorios", - IDC_SALVAGE_FIXDIRS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,29,197,244,10 - LTEXT "Nombre del arc&hivo para registro de resultados:", - IDC_STATIC,10,211,148,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,159,210,144,13,ES_AUTOHSCROLL - CONTROL "&Incluir lista de inodos dañados en registro de resultados", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,224,226,10 - CONTROL "Incluir lista de inodos de raíz que &posee AFS en registro de resultados", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,235,267,10 - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "Esta operación le permite arreglar problemas en uno o más volúmenes.\n\nNota: Si recupera toda una partición o servidor a la vez, el servidor se llevará fuera de línea temporalmente.", - IDC_STATIC,33,7,254,42 - GROUPBOX "Opciones de recuperación avanzadas",IDC_ADVANCED_GROUP, - 4,129,302,122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Recuperar volúmenes - Resultados" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Ce&rrar",IDOK,232,160,50,14 - LTEXT "Resultados de operación de recuperación:",IDC_STATIC,4, - 33,277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "Volumen de recuperación %3 en partición %2 del servidor %1", - IDC_SALVAGE_TITLE,33,15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 289, 103 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Liberar volumen" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,115,85,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,85,50,14 - PUSHBUTTON "A&yuda",9,235,85,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Esta operación le permite actualizar los duplicados del volumen %3. Puede optar por actualizar sólo los duplicados obsoletos, o todos los duplicados. ", - IDC_RELSET_DESC,43,7,242,28 - CONTROL "Actualizar &sólo los duplicados de volumen que estén obsoletos", - IDC_RELSET_NORMAL,"Button",BS_AUTORADIOBUTTON,46,41,221, - 10 - CONTROL "Actualizar &todos los duplicados de volumen, aunque no estén obsoletos", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,46,56,237, - 10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 246, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Añadir servidor de sistema principal",IDC_HOST_ADD,6, - 160,115,14 - PUSHBUTTON "&Eliminar servidor de sistema principal", - IDC_HOST_REMOVE,123,160,118,14 - LTEXT "Servidores de sistemas principales de base de datos reconocidos por el servidor:", - IDC_HOST_TITLE,5,5,223,17 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,236, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 225, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Añadir servidor de sistema principal" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Sistema principal:",-1,31,63,26,8 - EDITTEXT IDC_ADDHOST_HOST,61,61,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,63,88,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,117,88,50,14 - ICON IDI_SERVER,-1,4,4,20,20 - LTEXT "Ha optado por añadir un servidor de sistema principal de base de datos a la lista que está almacenado en el servidor %1.\n\nEntre a continuación el nombre del sistema principal de base de datos nuevo.", - IDC_ADDHOST_DESC,31,10,190,48 - PUSHBUTTON "Ayuda",9,171,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Cambiar direcciones de servidor" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Direcciones IP registradas en VLDB para servidor %1:", - IDC_TITLE,4,4,200,8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Cambiar...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "&Eliminar",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "Aceptar",IDOK,46,97,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,100,97,50,14 - PUSHBUTTON "Ayuda",9,154,97,50,14 - LTEXT "Nota: cuando se inicia un servidor de archivos, registra automáticamente su(s) dirección(es) de IP actual(es) con VLDB.", - IDC_STATIC,4,64,200,28 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Cambiar dirección IP" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,61,51,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,115,51,50,14 - PUSHBUTTON "Ayuda",9,169,51,50,14 - LTEXT "Entre la dirección IP nueva que debería sustituir %1 en VLDB:", - IDC_TITLE,4,4,215,8 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,42,23, - 90,14 - LTEXT "Dirección:",IDC_STATIC,4,26,35,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AVI -// - -AVI_SETMOVE AVI DISCARDABLE -BEGIN - -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "Servidor %1 - Listas de administración" - IDS_TAB_SERVICES "Servicios" - IDS_TAB_AGGREGATES "Particiones" - IDS_TAB_FILESETS "Volúmenes" - IDS_SERVICE_NONESELECTED "Seleccione un servidor a visualizar." - IDS_SERVICE_GOTSELECTED "Procesos de servicio en servidor %1:" - IDS_AGGREGATE_ALL "Particiones en todos los servidores:" - IDS_AGGREGATE_ONE "Particiones en servidor %1:" - IDS_FILESET_ALL "Todos los volúmenes de la célula %1:" - IDS_FILESET_ONE "Volúmenes en servidor %1:" - IDS_SVR_LISTS_TAB "Listas de administración" - IDS_SVR_PROP_TITLE "Servidor %1 - Propiedades" - IDS_SVR_GENERAL_TAB "General" - IDS_SVR_SCOUT_TAB "Configuración" - IDS_SERVER_TITLE "Servidor %1 - AFS Server Manager" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "Servidor %1 en célula %2:" - IDS_SVC_PROP_TITLE "Servicio %2 en servidor %1 - Propiedades" - IDS_SVC_GENERAL_TAB "General" - IDS_SVC_ADD_TITLE "Crear servicio" - IDS_SVC_ADD_TAB "Crear servicio" - IDS_AGG_PROP_TITLE "Partición %2 en servidor %1 - Propiedades" - IDS_AGG_GENERAL_TAB "General" - IDS_SET_REP_TITLE "Volumen %1 - Duplicación" - IDS_SET_REPSITES_TAB "Sitios de duplicación" - IDS_SET_PROP_TITLE "Volumen %1 - Propiedades" - IDS_SET_GENERAL_TAB "General" - IDS_SET_UNLOCKBTN "Desb&loquear ahora" - IDS_SET_LOCKBTN "&Bloquear ahora" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%1 utilizado de cuota de %2 (%3%%)" - IDS_USAGE_AGGREGATE "%1 utilizado de capacidad de %2 (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "Cuota combinada" - IDS_SVRCOL_NAME "Servidor" - IDS_SVRCOL_STATUS "Estado" - IDS_SETCOL_DATE_ACCESS "Último acceso" - IDS_SETCOL_DATE_BACKUP "Última copia de seguridad" - IDS_SVCCOL_NAME "Servicio" - IDS_SVCCOL_TYPE "Tipo" - IDS_SVCCOL_PARAMS "Parámetros" - IDS_SVCCOL_STATUS "Estado" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "Último inicio" - IDS_SVCCOL_DATE_STOP "Última parada" - IDS_SVCCOL_DATE_STARTSTOP "Último inicio/parada" - IDS_SVCCOL_DATE_FAILED "Última anomalía" - IDS_SVCCOL_LASTERROR "Último código de salida" - IDS_AGGCOL_NAME "Partición" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "Dispositivo" - IDS_AGGCOL_USED "Utilizado" - IDS_AGGCOL_USED_PER "% Utilizado" - IDS_AGGCOL_FREE "Libre" - IDS_AGGCOL_TOTAL "Capacidad" - IDS_AGGCOL_STATUS "Estado" - IDS_SETCOL_NAME "Volumen" - IDS_SETCOL_TYPE "Tipo" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "Creado" - IDS_SETCOL_DATE_UPDATE "Última actualización" - IDS_SETCOL_STATUS "Estado" - IDS_SETCOL_QUOTA_USED "Utilizado" - IDS_SETCOL_QUOTA_USED_PER "% Utilizado" - IDS_SETCOL_QUOTA_FREE "Libre" - IDS_SETCOL_QUOTA_TOTAL "Cuota" - IDS_TRYAGAINBTN "Volver &a intentar" - IDS_NO_CELL_SELECTED "(no se ha especificado ninguna célula)" - IDS_NO_AFS_ID "(no hay señales disponibles)" - IDS_AFS_ID_WILLEXP "%1 (caducarán las señales %2)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS - "Espere, por favor; obteniendo información acerca de la célula %1 ..." - IDS_STATUS_NOALERTS "Normal" - IDS_TITLE_BROWSE_USER "Seleccionar usuario" - IDS_AGGTYPE_OTHER "Desconocido (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "Creando volumen %3 en partición %1:%2" - IDS_ACTION_DELETEFILESET "Suprimiendo volumen %3 de partición %1:%2" - IDS_ACTION_MOVEFILESET "Moviendo volumen %3 a partición %1:%2" - IDS_ACTION_SETFILESETQUOTA "Cambiando la cuota para volumen %3" - IDS_SVCSTOP_DESC2 "Pulsar en Aceptar para detener este servicio." - IDS_SVCSTART_DESC2 "Pulsar en Aceptar para iniciar este servicio." - IDS_SYNCVLDB_SVR_DESC "¡Precaución!\n\nSi continúa, el AFS Server Manager modificará VLDB para se corresponda con el contenido de todas las particiones del servidor %1." - IDS_SYNCVLDB_SVR_DESC2 "Si VLDB menciona un volumen que, por cualquier motivo, no puede encontrarse en la actualidad en ninguna partición del servidor %1, se eliminará la entrada de VLDB para dicho volumen!" - IDS_SYNCVLDB_AGG_DESC "¡Precaución!\n\nSi continúa, el AFS Server Manager modificará VLDB para que se corresponda con el contenido de la partición %2 en el servidor %1." - IDS_SYNCVLDB_AGG_DESC2 "Si VLDB menciona un volumen que, por cualquier motivo, no puede encontrarse en la actualidad en esta partición, se eliminará la entrada de VLDB para dicho volumen!" - IDS_PROMPT_BROWSE_USER "Usuario:" - IDS_PREVIEWIN_BUTTON "<< &Vista preliminar" - IDS_PREVIEWOUT_BUTTON "&Vista preliminar >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "Usuario" - IDS_TITLE_BROWSE_PRINCIPAL "Seleccionar principal" - IDS_TITLE_BROWSE_OWNGROUP "Seleccionar grupo propietario" - IDS_PROMPT_BROWSE_PRINCIPAL "Principal:" - IDS_PROMPT_BROWSE_OWNGROUP "Grupo propietario" - IDS_ACTION_CLONE "Creando versión predeterminada de volumen %3" - IDS_ACTION_CLONESYS "Creando múltiples copias de seguridad de volumen" - IDS_CLONESYS_FAILED "No se ha podido crear una copia de seguridad del volumen %1 debido al error 0x%2 (%3)." - IDS_SET_UNSPECIFIED "(no especificado)" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "Contador de archivo" - IDS_SET_DUMP_NAME "Vuelco de %1.DMP" - IDS_ACTION_DUMP "Volcando volumen %3 (partición %1:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "Partición" - IDS_REFRESH_DESC_CELL "El AFS Server Manager está determinando el estado de los servidores en la célula %1. Esta operación puede llevar algunos momentos..." - IDS_REFRESH_DESC_SERVER "El AFS Server Manager está determinando el estado del servidor %1. Esta operación puede llevar algunos momentos..." - IDS_REFRESH_CURRENT_CELL "En la actualidad se está examinando : célula %1" - IDS_REFRESH_CURRENT_SERVER - "En la actualidad se está examinando : servidor %2" - IDS_REFRESH_CURRENT_AGGREGATE - "En la actualidad se está examinando : partición %3 en servidor %2" - IDS_REFRESH_CURRENT_FILESET - "En la actualidad se está examinando : volumen %4 en servidor %2, partición %3" - IDS_REFRESH_CURRENT_SERVICE - "En la actualidad se está examinando : servicio %3 en servidor %2" - IDS_REFRESH_PERCENT "%1%% finalizado" - IDS_PROBLEMS "Problemas" - IDS_SERVER_NO_PROBLEMS "Este servidor no tiene problemas conocidos." - IDS_SERVICE_NO_PROBLEMS "Este servicio no tiene problemas conocidos." - IDS_AGGREGATE_NO_PROBLEMS "Esta partición no tiene problemas conocidos." - IDS_FILESET_NO_PROBLEMS "Este volumen no tiene problemas conocidos." - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB - "En la actualidad se está examinando : base de datos de ubicación de volumen (VLDB)" - IDS_FILESETTYPE_RW "Leer/Grabar" - IDS_FILESETTYPE_RO "Duplicado" - IDS_FILESETTYPE_CLONE "Copia de seguridad" - IDS_MOVESET_READWRITE "Continuar hará que el volumen %3 se mueva de la partición %2 del servidor %1 a otra ubicación." - IDS_MOVESET_READONLY "Continuar hará que el duplicado de volúmenes %3 se elimine de la partición %2 del servidor %1 y que se cree otro duplicado de volumen creado en la partición especificada a continuación. " - IDS_SVC_START_TITLE "Iniciar servicio" - IDS_SVC_STOP_TITLE "Detener servicio" - IDS_SERVICESTATUS_STARTING - "Este servicio se está iniciando en la actualidad." - IDS_SERVICESTATUS_RUNNING - "El servicio se está ejecutando en la actualidad." - IDS_SERVICESTATUS_STOPPED "Este servicio está detenido en la actualidad." - IDS_SERVICESTATUS_STOPPING - "Este servicio se está deteniendo en la actualidad." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "El estado de este servicio es desconocido." - IDS_SVC_RESTART_BUTTON "Detener y &reiniciar ahora" - IDS_PROBLEM_BOX "Problemas conocidos (%1)" - IDS_VIEWLOG_DESC_NOFILE "El AFS Server Manager no ha podido encontrar el archivo de registro para el servicio %2 en el servidor %1. Por favor, entre a continuación la vía de acceso completa al archivo de registro de servicio." - IDS_NO_GROUP "(no hay grupo propietario)" - IDS_VIEWLOG_FROMSERVER "Registrar archivo en servidor %1" - IDS_VIEWLOG_FROMSERVICE "Registrar archivo para servicio %2 en servidor %1" - IDS_VIEWLOG_TRUNCATED "Contenido de archivo (sólo se muestran las últimas %1 líneas):" - IDS_SAVELOG_FILTER "Archivo de texto|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< &Avanzado" - IDS_ADVANCEDOUT_BUTTON "&Avanzado >>" - IDS_REPTYPE_RELEASE "Liberar duplicación" - IDS_REPTYPE_SCHEDULED "Duplicación programada" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "&Actualizar todo" - IDS_UPDATETHIS_BUTTON "&Actualizar" - IDS_SERVER_MULTIPLE_PROBLEMS "Este servidor tiene %1 problemas conocidos." - IDS_SERVICE_MULTIPLE_PROBLEMS - "Este servicio tiene %1 problemas conocidos." - IDS_AGGREGATE_MULTIPLE_PROBLEMS - "Esta partición tiene %1 problemas conocidos." - IDS_FILESET_MULTIPLE_PROBLEMS "Este volumen tiene %1 problemas conocidos." - IDS_FILESETTYPE_RO_STAGE "Duplicado" - IDS_SERVICETYPE_SIMPLE_LONG "Sencillo (se ejecuta de modo continuo)" - IDS_SERVICETYPE_CRON_LONG "Cron (se ejecuta a intervalos especificados)" - IDS_QUOTAUNITS_KB "Kb" - IDS_QUOTAUNITS_MB "Mb" - IDS_NO_QUOTA_REPLICA "(este volumen es un duplicado y por tanto no tiene cuota)" - IDS_NO_QUOTA_CLONE "(este volumen es una copia de seguridad y por tanto no tiene cuota)" - IDS_USAGE_REPLICA "%1 utilizado" - IDS_USAGE_CLONE "%1 utilizado" - IDS_COL_AGGS_MOVE "particiones al crear un volumen" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "Particiones en servidor %1:" - IDS_AGGREGATES_IN_CELL "Todas las particiones de la célula %1:" - IDS_AGGREGATES_IN_NOTHING "Particiones:" - IDS_FILESETS_IN_SERVER "Volúmenes en servidor %1:" - IDS_FILESETS_IN_CELL "Todos los volúmenes de la célula %1:" - IDS_FILESETS_IN_NOTHING "Volúmenes:" - IDS_SERVICES_IN_SERVER "Servicios en servidor %1:" - IDS_SERVICES_IN_NOTHING "Servicios:" - IDS_UNKNOWN "(desconocido)" - IDS_UNKNOWN_GROUP "grupo #%1 (nombre desconocido)" - IDS_AGGFULL_WARN_OFF "El umbral por omisión (aviso inhabilitado en el servidor)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "El umbral por omisión (aviso inhabilitado en el servidor)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - Código de salida %2" - IDS_COL_SERVERS "servidores de una célula" - IDS_COL_FILESETS "volúmenes de un servidor" - IDS_COL_AGGREGATES "particiones de un servidor" - IDS_COL_SERVICES "servicios de un servidor" - IDS_COL_REPLICAS "duplicados de un volumen" - IDS_COLUMNS_TITLE "Seleccionar Mostrar columnas - AFS Server Manager" - IDS_REPCOL_SERVER "Servidor" - IDS_REPCOL_AGGREGATE "Partición" - IDS_REPCOL_DATE_UPDATE "Última actualización" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "particiones al mover un volumen" - IDS_WARN_TITLE "Precaución" - IDS_WARN_DISABLE_AUTH "Al pulsar en el botón ""Permitir no autentificados"", permitirá que principales no autentificados manipulen los servicios de este servidor. Puesto que hay muchos servicios que se ejecutan bajo la identidad de raíz, esta acción representa +" - IDS_WARN_DISABLE_AUTH2 "un defecto significativo en la seguridad del servidor.\n\n¿Está seguro de que desea efectuar este cambio?" - IDS_SVR_NO_ADDR "(no especificado)" - IDS_TITLE_BAD_CELL "Nombre de célula no reconocido" - IDS_DESC_BAD_CELL "El nombre de célula que ha entrado no se ha podido encontrar en la red.\n\nPor favor compruebe la entrada de nuevo para asegurarse de que es correcta." - IDS_AGGFULL_WARN_ON "el umbral &por omisión para este servidor (%1%% de su tamaño)" - IDS_SETFULL_WARN_ON "el umbral &por omisión para este servidor (%1%% de su tamaño)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "La identidad de AFS que ha entrado no está reconocida, o bien la contraseña que ha especificado es incorrecta." - IDS_SVR_CREDS_NONE "(no hay señales)" - IDS_SVR_CREDS_VALID "%2, caduca %3" - IDS_SVR_CREDS_EXPIRED "(señales caducadas %3)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 (Cuota combinada: %2)" - IDS_ACTION_DESC_NONE "No hay operaciones en curso." - IDS_ACTION_DESC_ONE "La operación siguiente está actualmente en curso:" - IDS_ACTION_DESC_MULT "La operaciones siguientes están actualmente en curso:" - IDS_ACTCOL_OPERATION "Operación" - IDS_ACTCOL_ELAPSED "Tiempo transcurrido" - IDS_ACTION_REFRESH "Renovando información de célula" - IDS_ACTION_CREATESERVER "Creación de servidor %1" - IDS_ACTION_DELETESERVER "Suprimiendo servidor %1" - IDS_ACTION_GETSERVERLOGFILE - "Obtención del archivo de registro %2 desde el servidor %1" - IDS_ACTION_SETSERVERAUTH - "Cambiando restricciones de acceso para servidor %1" - IDS_ACTION_CHANGESERVERSTATUS "Cambiando propiedades del servidor %1" - IDS_ACTION_STARTSERVICE "Iniciando servicio %2 en servidor %1" - IDS_ACTION_STOPSERVICE "Deteniendo servicio %2 en servidor %1" - IDS_ACTION_RESTARTSERVICE "Reiniciando servicio %2 en servidor %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "Sincronizando VLDB con servidor %1" - IDS_ACTION_SYNCVLDB_AGG "Sincronizando VLDB con partición %1:%2" - IDS_ACTION_SCOUT "Comprobando si hay problemas en el servidor %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "Cambiando propiedades de duplicación para volumen %3" - IDS_ACTION_CREATEREPLICA - "Creando duplicado de volumen %3 en partición %1:%2" - IDS_DELSET_REPLICA_DESC "¡Precaución!\n\nContinuar hará que se elimine el duplicado del volumen %3 en la partición %2 del servidor %1." - IDS_DELSET_CLONE_DESC "¡Precaución!\n\nContinuar hará que se elimine la copia de seguridad del volumen %3 de la partición %2 del servidor %1." - IDS_INSTALL_DESC1 "Esta operación copia un archivo de este sistema en otro. +" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "Si el archivo ya existe en el sistema de destino, se hará copia de seguridad del mismo y se le otorgará una extensión .BAK; a cualquier copia de seguridad existente se le dará una extensión .OLD y, se eliminará cualquier archivo .OLD existente." - IDS_ACTION_INSTALLFILE "Instalando el archivo %2 en el servidor %1" - IDS_ACTION_UNINSTALLFILE "Desinstalando el archivo %2 del servidor %1" - IDS_ACTION_PRUNEFILES "Podando archivos del servidor %1" - IDS_FILTER_ALLFILES "Todos los archivos|*.*|" - IDS_ACTION_RENAMEFILESET "Cambiando el nombre del volumen %1 por %2" - IDS_RECUR_DAILY "cada día" - IDS_RECUR_SUNDAY "cada domingo" - IDS_RECUR_MONDAY "cada lunes" - IDS_RECUR_TUESDAY "cada martes" - IDS_RECUR_WEDNESDAY "cada miércoles" - IDS_RECUR_THURSDAY "cada jueves" - IDS_RECUR_FRIDAY "cada viernes" - IDS_RECUR_SATURDAY "cada sábado" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "Creando el servicio %2 en servidor %1" - IDS_ACTION_DELETESERVICE "Suprimiendo el archivo %2 del servidor %1" - IDS_ACTION_RELEASEFILESET "Liberando el volumen %3" - IDS_ACTION_GETDATES "Obtención de fechas para el archivo %2 en el servidor %1" - IDS_LASTMODIFIED "Modificado por última vez %1" - IDS_SVR_SECURITY_TITLE "Seguridad de servidor - %1" - IDS_SVR_LIST_TAB "Administradores" - IDS_ACTION_ADMINLIST_LOAD "Obtención de administradores para servidor %1" - IDS_ACTION_ADMINLIST_SAVE - "Escribiendo administradores para el servidor %1" - IDS_ADMCOL_PRINCIPAL "Miembro" - IDS_ADMCOL_TYPE "Tipo" - IDS_ADMCOL_TYPE_GROUP "Grupo" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "Restaurando el volumen %1" - IDS_COL_AGGS_RESTORE "particiones al restaurar un volumen" - IDS_RESTORE_FILTER "Archivos de vuelco de volumen|*.DMP|Todos los archivos|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "Cambiando horas de reinicio de servicio para el servidor %1" - IDS_RESTORE_CREATESET "El volumen %1 se creará en el servidor y partición especificada a continuación." - IDS_RESTORE_OVERWRITESET - "¡Precaución! El volumen %3 existe en la partición %2 del servidor %1 y si continúa se sobregrabará!" - IDS_SUBSET_TITLE_LOAD "Abrir subconjunto de servidor" - IDS_SUBSET_TITLE_SAVE "Guardar subconjunto de servidor" - IDS_BUTTON_OPEN "&Abrir" - IDS_BUTTON_SAVE "&Guardar" - IDS_SUBSET_SAVE_TITLE "Precaución" - IDS_SUBSET_SAVE_DESC "Ya hay un subconjunto de servidor con el nombre %1.\n\n¿Desea sobregrabar este subconjunto?" - IDS_SUBSET_CHANGED "%1 [MODIFICADO]" - IDS_SUBSET_TAB "Servidores supervisados" - IDS_SUBSET_DISCARD_TITLE "¿Guardar subconjunto?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "No ha guardado como subconjunto la lista de los servidores supervisados en la actualidad. Si guarda esta lista, puede utilizarla con posterioridad para proseguir la supervisión de este mismo conjunto de servidores.\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "¿Desea crear un subconjunto que contenga la lista de servidores supervisados en la actualidad?" - IDS_SUBSET_NONAME "(sin título)" - IDS_SUBSET_NOSUBSET "(se están supervisando todos los servidores)" - IDS_SUBSET_SERVERSUBSET "Servidor %1" - IDS_FILESET_SOME "Volúmenes de todos los servidores supervisados en la célula %1:" - IDS_AGGREGATE_SOME "Particiones en todos los servidores supervisados en la célula %1:" - IDS_SERVICE_SOME "Servicios en todos los servidores supervisados en la célula %1:" - IDS_FILESET_UNMON "El servidor %1 no está siendo supervisado" - IDS_AGGREGATE_UNMON "El servidor %1 no está siendo supervisado" - IDS_SERVICE_UNMON "El servidor %1 no está siendo supervisado" - IDS_SUBSET_DELETE_TITLE "¿Suprimir subconjunto?" - IDS_SUBSET_DELETE_DESC "¿Está seguro de que desea suprimir el subconjunto de servidor %1?" - IDS_ERROR_TRANSLATED "Número de error 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "El número de error 0x%1 (%2) no está reconocido." - IDS_FIND_NOTHING_TITLE "No hay ningún mandato seleccionado" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "Para averiguar el modo de efectuar una operación, seleccione en primer lugar una línea de mandatos de la lista o escriba una palabra clave." - IDS_FIND_UNKNOWN_TITLE "Mandato desconocido" - IDS_FIND_UNKNOWN_DESC "El AFS Server Manager no ha podido encontrar ningún tema de ayuda para el mandato ""%1""." - IDS_HELPABOUT_DESC1 "Aviso: este programa de sistema está protegido por el copyright y tratados internacionales. +" - IDS_HELPABOUT_DESC2 "La reproducción o distribución no autorizada de este software puede dar como resultado la aplicación de graves sanciones civiles y penales y se perseguirá por todos los medios legales posibles.\n\n+" - IDS_HELPABOUT_DESC3 "AFS es una marca registrada de Transarc Corporation, una compañía de IBM." - IDS_CANT_QUIT_TITLE "AFS Server Manager" - IDS_CANT_QUIT_REBOOT "¡Precaución!\n\nEl AFS Server Manager está efectuando en la actualidad una o más operaciones. Si cierra Windows en este momento, dichas operaciones no finalizarán satisfactoriamente.\n\n¿Está seguro de que desea reiniciar Windows?" - IDS_APP_TITLE "AFS Server Manager" - IDS_ACTION_OPENCELL "Búsqueda de servidores en la célula %1" - IDS_OPTIONS_TITLE "Opciones - AFS Server Manager" - IDS_OPTIONS_GENERAL_TAB "General" - IDS_BADCREDS_DESC "A menos que inicie la sesión como administrador, es posible que no disponga de privilegios suficientes para administrar satisfactoriamente la célula %1. No disponer de suficientes privilegios de acceso puede hacer que el AFS Server Manager encuentre problemas en una célula en la que no existan dichos problemas." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "Confirmación - AFS Server Manager" - IDS_NO_GROUP_CHECKBOX "No hay grupo propietario" - IDS_AFS_ID_DIDEXP "%1 (han caducado las señales %2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(consultando)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "Grupo exterior" - IDS_ADMCOL_TYPE_FOREIGN_USER "Usuario exterior" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "Notificador" - IDS_SVC_NONOTIFIER "(ninguno)" - IDS_SVR_KEY_TAB "Claves de servidor" - IDS_KEYNAME_NOTIME "Claves para servidor %1:" - IDS_KEYNAME_WITHTIME "Claves para servidor %1: (modificado %2):" - IDS_SVRKEY_VERSION "Versión" - IDS_SVRKEY_DATA "Valor" - IDS_SVRKEY_CHECKSUM "Suma de comprobación" - IDS_SVRKEY_DATA_UNKNOWN "(oculto)" - IDS_STARTSERVICE_TITLE "Iniciar servicio" - IDS_STOPSERVICE_TITLE "Detener servicio" - IDS_STARTSERVICE_TEXT "Pulsar en Aceptar para iniciar el servicio %2 en el servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "Pulsar en Aceptar para detener el servicio %2 en el servidor %1." - IDS_STARTSERVICE_STARTUP - "Puede hacer que este cambio sea permanente, por lo que el servicio %2 se iniciciará automáticamente si se reinicia el servidor %1." - IDS_STOPSERVICE_STARTUP "Puede hacer que este cambio sea permanente, por lo que el servicio %2 no se iniciciará automáticamente si se reinicia el servidor %1." - IDS_STARTSERVICE_PERMANENT - "&Permanente (iniciar servicio %2 si se reinicia el servidor %1)" - IDS_STARTSERVICE_TEMPORARY - "&Temporal (no iniciar servicio %2 si se reinicia el servidor %1)" - IDS_STOPSERVICE_PERMANENT - "&Permanente (no iniciar servicio %2 si se reinicia el servidor %1)" - IDS_STOPSERVICE_TEMPORARY - "&Temporal (iniciar servicio %2 si se reinicia el servidor %1)" - IDS_ACTION_EXECUTE "Ejecutando %2 en el servidor %1" - IDS_ACTION_SALVAGE_SVR "Recuperando todos los volúmenes en el servidor %1:" - IDS_ACTION_SALVAGE_AGG "Recuperando todos los volúmenes en la partición %1:2:" - IDS_ACTION_SALVAGE_VOL "Recuperando el volumen %3 en la partición %1:2" - IDS_SALVAGE_SVR "Recuperar todos los volúmenes en el servidor %1:" - IDS_SALVAGE_AGG "Recuperar todos los volúmenes en el servidor %1, partición %2:" - IDS_SALVAGE_SET "Recuperar el volumen %3 en el servidor %1, partición %2" - IDS_SETSTATUS_SALVAGE "Recuperando el volumen" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "El volumen está bloqueado" - IDS_SETSTATUS_NO_VOL "Falta el volumen" - IDS_SETSTATUS_BUSY "El volumen está ocupado en la actualidad" - IDS_SETSTATUS_MOVED "Se ha movido el volumen" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "Dirección" - IDS_HOST_TITLE "Servidores de sistema principal de base de datos que reconoce el servidor %1:" - IDS_SVR_HOSTS_TITLE "Servidor %1 - Sistemas principales de bases de datos" - IDS_SVR_HOST_TAB "Sistemas principales de base de datos" - IDS_ACTION_HOSTLIST_LOAD - "Obtención de lista de sistemas principales desde el servidor %1" - IDS_ACTION_HOSTLIST_SAVE - "Escribiendo lista de sistemas principales en el servidor %1" - IDS_SETSTATUS_1ALERT "El volumen tiene un problema" - IDS_SETSTATUS_2ALERT "El volumen tiene %1 problemas" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "Cambiando dirección IP para el servidor %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED - "No se están supervisando problemas en el servidor %1" - IDS_ALERT_DESCSHORT_TIMEOUT - "No se ha podido entrar en contacto con el servidor %1; último error: %3" - IDS_ALERT_DESCSHORT_AGG_FULL - "La utilización de la partición para %2 supera el umbral de aviso de %3%% (%4)" - IDS_ALERT_DESCSHORT_SET_FULL - "La utilización de volumen para %3 supera el umbral de aviso de %4%% (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT - "El volumen %3 no tiene ninguna entrada de VLDB" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "El volumen %3 tiene una entrada de VLDB pero no se ha encontrado en la partición %2 del servidor %1" - IDS_ALERT_DESCSHORT_STOPPED "Servicio %2 detenido en %3" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "VLDB hace referencia a la partición %2 pero no se ha encontrado en el servidor %1" - IDS_ALERT_DESCSHORT_BADCREDS - "Es posible que no tenga suficientes privilegios para administrar el servidor %1" - IDS_ALERT_DESCSHORT_AGG_ALLOC - "La cuota de volumen combinada de la partición %2 ha superado su capacidad" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE - "El volumen %3 está dañado y no puede utilizarse." - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "No hay ningún servicio que esté ejecutándose para servir el volumen %3." - IDS_ALERT_DESCSHORT_STATE_OFFLINE - "El volumen %3 está fuera de línea y no puede utilizarse." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "No ha podido contactarse con el servidor %1. El último intento, efectuado en %2, ha dado como resultado el error ""%3""." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "La utilización de la partición %2 en el servidor %1 supera su umbral de aviso de %3%% (%4)." - IDS_ALERT_DESCFULL_SET_FULL - "La utilización del volumen %3 (servidor %1, partición %2) supera su umbral de aviso de %4%% (%5)." - IDS_ALERT_DESCFULL_NO_VLDBENT - "El volumen %3 existe en la partición %2 del servidor %1, pero no tiene ninguna entrada de VLDB correspondiente." - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "Existe una entrada de VLDB para el volumen %3, pero el volumen pero no se ha encontrado en la partición %2 del servidor %1." - IDS_ALERT_DESCFULL_STOPPED - "El servicio %2 del servidor %1 se ha detenido en %3 con código de salida %5." - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "VLDB hace referencia a volúmenes en la partición %2 del servidor %1, pero no se ha encontrado la partición. " - IDS_ALERT_DESCFULL_BADCREDS - "Es posible que el AFS Server Manager esté detectando errores que no existen en el servidor %1 debido a que no dispone de señales de AFS como administrador dentro de esta célula." - IDS_ALERT_DESCFULL_AGG_ALLOC - "La cuota combinada de volúmenes de la partición %2 del servidor %1, que totaliza %4, supera la capacidad de la partición de %3." - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "El volumen %3 de la partición %2 del servidor %1 no tiene ningún Vnode asociado con el mismo. (El estado del volumen es 0x%4.)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "No hay ningún servicio de exportador de archivos ejecutándose en el servidor %1, por lo que no puede utilizarse el volumen %3 de la partición %2. (El estado del volumen es 0x%4.)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "El volumen %3 de la partición %2 del servidor %1 está fuera de línea y no puede utilizarse. (El estado del volumen es 0x%4.)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "Pulse en el botón Intentar de nuevo para intentar volver a contactar con este servidor." - IDS_ALERT_FIX_AGG_FULL "Pulse en el botón Avisos para cambiar el umbral de aviso para la utilización de esta partición." - IDS_ALERT_FIX_SET_FULL "Pulse en el botón Avisos para cambiar el umbral de aviso para la utilización de este volumen." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "VLDB está posiblemente sin actualizar; si es así, utilice el mandato Sincronizar VLDB para actualizarlo." - IDS_ALERT_FIX_NO_SVRENT_SET - "Compruebe el servidor y la partición para asegurarse de que están funcionando de modo adecuado." - IDS_ALERT_FIX_STOPPED "Pulse en el botón Ver registro para ver el registro de servicio para este servicio." - IDS_ALERT_FIX_NO_SVRENT_AGG - "Compruebe el servidor para asegurarse de que se ha exportado la partición y de que está funcionando debidamente." - IDS_ALERT_FIX_BADCREDS "Pulse en el botón Autentificación para obtener señales de AFS nuevas." - IDS_ALERT_FIX_AGG_ALLOC "Reduzca la cuota para los volúmenes de esta partición, o mueva uno o más volúmenes a otra partición." - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "Volver &a intentar" - IDS_ALERT_BUTTON_WARNINGS "Av&isos..." - IDS_ALERT_BUTTON_VIEWLOG "&Ver registro" - IDS_ALERT_BUTTON_SHOWME "&Personalizar" - IDS_ALERT_BUTTON_GETCREDS "&Autentificación" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "No se ha especificado ninguna célula. Para utilizar el AFS Server Manager, debe especificar la célula de AFS con la que desearía trabajar. Elija una célula seleccionando el elemento ""Abrir..."" menu de ""Célula"" menu más arriba." - IDS_ERROR_REFRESH_CELLSERVERS - "No ha podido obtenerse la lista de servidores para la célula %1.\n\nError: %2" - IDS_ERROR_CANT_OPEN_CELL - "El AFS Server Manager no ha podido ponerse en contacto con ningún servidor de la célula %1.\n\nPor favor, vuelva a efectuar la comprobación para asegurarse de que ha escrito correctamente el nombre de la célula." - IDS_ERROR_REFRESH_AGGREGATES - "No ha podido obtenerse la lista de particiones para el servidor %1.\n\nError: %2" - IDS_ERROR_REFRESH_SERVER_STATUS - "No ha podido obtenerse el estado actual del servidor %1." - IDS_ERROR_CHANGE_SERVER_STATUS - "El AFS Server Manager no ha podido cambiar las propiedades para el servidor %1." - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "No ha podido obtenerse el estado actual de la partición %2 en el servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "No puede obtenerse el estado actual del volumen %3 (servidor %1, partición %2)." - IDS_ERROR_REFRESH_SERVICE_STATUS - "No ha podido determinarse el estado actual del servicio %2 en el servidor %1." - IDS_ERROR_MOVE_FILESET "El AFS Server Manager no ha podido mover el volumen %3 desde la partición %2 del servidor %1 a la partición %5 en el servidor %4." - IDS_ERROR_VIEW_LOGFILE "No ha podido leerse el archivo %2 desde el servidor %1.\n\nAsegúrese de que ha entrado correctamente el nombre del archivo y de que tiene suficientes permisos para ver el archivo. " - IDS_ERROR_NOT_REPLICATED - "No se ha podido determinar el estado de duplicación del volumen %1." - IDS_ERROR_CANT_CREATE_FILESET - "El AFS Server Manager no ha podido crear el volumen %3 en la partición %2 del servidor %1." - IDS_ERROR_CANT_DELETE_FILESET - "El AFS Server Manager no ha podido suprimir el volumen %3 (partición %2 del servidor %1)." - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "El AFS Server Manager no ha podido crear una entrada VLDB para el volumen %3 en la partición %2 del servidor %1." - IDS_ERROR_CANT_SET_FILESET_QUOTA - "El AFS Server Manager no ha podido cambiar la cuota para el volumen %3 en la partición %2 del servidor %1." - IDS_ERROR_CANT_CREATE_SERVER - "El AFS Server Manager no ha podido crear la entrada de servidor solicitada en la célula %1. " - IDS_ERROR_CANT_PING_SERVER - "El AFS Server Manager no ha podido determinar la dirección IP del servidor %1." - IDS_ERROR_CANT_DELETE_SERVER - "El AFS Server Manager no ha podido suprimir el servidor %1." - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "No puede suprimirse el servidor %1 debido a que es el sistema principal de uno o más volúmenes. Un servidor sólo puede eliminarse en el caso de que no contenga ningún volumen." - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "El AFS Server Manager no ha podido cambiar las propiedades de la partición %2 del servidor %1." - IDS_ERROR_CHANGE_SERVICE_STATUS - "El AFS Server Manager no ha podido cambiar las propiedades del servicio %2 en el servidor %1." - IDS_ERROR_CANT_START_SERVICE - "El AFS Server Manager no ha podido iniciar el servicio %2 en el servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "El AFS Server Manager no ha podido detener el servicio %2 en el servidor %1." - IDS_ERROR_CANT_RESTART_SERVICE - "El AFS Server Manager no ha podido detener y reiniciar el servicio %2 en el servidor %1." - IDS_ERROR_CHANGE_REPLICA_STATUS - "El AFS Server Manager no ha podido cambiar las propiedades de duplicación para el volumen %3 en la partición %2 del servidor %1." - IDS_ERROR_CANT_SYNCVLDB "El AFS Server Manager no ha podido actualizar VLDB." - IDS_ERROR_CANT_CREATE_REPLICA - "El AFS Server Manager no ha podido crear un duplicado del volumen %3 en la partición %2 del servidor %1." - IDS_ERROR_CANT_INSTALL_FILE - "El AFS Server Manager no ha podido instalar el archivo %2 en el servidor %1." - IDS_ERROR_CANT_UNINSTALL_FILE - "El AFS Server Manager no ha podido desinstalar el archivo %2 en el servidor %1." - IDS_ERROR_CANT_PRUNE_FILES - "El AFS Server Manager no ha podido eliminar los archivos solicitados del servidor %1." - IDS_ERROR_CANT_RENAME_FILESET - "El AFS Server Manager no ha podido cambiar el nombre del volumen %1 por ""%2""." - IDS_ERROR_CANT_CREATE_SERVICE - "El AFS Server Manager no ha podido crear el servicio %2 en el servidor %1." - IDS_ERROR_CANT_DELETE_SERVICE - "El AFS Server Manager no ha podido suprimir el servicio %2 del servidor %1." - IDS_ERROR_CANT_RELEASE_FILESET - "El AFS Server Manager no ha podido liberar el volumen duplicado %3." - IDS_ERROR_CANT_UPDATE_FILESET - "El AFS Server Manager no ha podido actualizar el duplicado de volumen %3 en la partición %1 del servidor %2." - IDS_ERROR_CANT_UPDATE_ALL - "El AFS Server Manager no ha podido actualizar ningún duplicado del volumen %3." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "El AFS Server Manager no ha podido leer la lista de administradores para el servidor %1." - IDS_ERROR_CANT_LOAD_KEYLIST - "El AFS Server Manager no ha podido leer la lista de claves de servidor para el servidor %1." - IDS_ERROR_CANT_CREATE_KEY - "El AFS Server Manager no ha podido crear una clave de servidor nueva para el servidor %1." - IDS_ERROR_CANT_SAVE_ADMLIST - "El AFS Server Manager no ha podido cambiar la lista de administradores para el servidor %1." - IDS_ERROR_CANT_CLONE "El AFS Server Manager no ha podido crear una versión de copia de seguridad del volumen %3 en la partición %2 del servidor %1." - IDS_ERROR_CANT_CLONESYS "El AFS Server Manager no ha podido crear ninguno de los volúmenes de copia de seguridad solicitados." - IDS_ERROR_CANT_DUMP_FILESET - "El AFS Server Manager no ha podido volcar el contenido del volumen %3 (servidor %1, partición %2) en el archivo %4." - IDS_ERROR_CANT_RESTORE_FILESET - "El AFS Server Manager no ha podido restaurar el archivo %4 en el volumen %3 (servidor %1, partición %2)." - IDS_ERROR_CANT_SET_RESTART_TIMES - "El AFS Server Manager no ha podido cambiar las horas de reinicio para los servicios del servidor %1." - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "El AFS Server Manager no ha podido suprimir el volumen %3 de la partición %2 del servidor %1.\n\nEl volumen %3 no puede eliminarse a menos que en primer lugar se hayan eliminado todos sus duplicados." - IDS_CMDLINE_TITLE "Error - AFS Server Manager" - IDS_CMDLINE_SYNTAX "La línea de mandatos que ha especificado para el AFS Server Manager no es válida." - IDS_CMDLINE_UNRECOGNIZED - "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nNo se reconoce el parámetro ""%1""." - IDS_CMDLINE_DUPLICATE "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nEl parámetro ""%1"" se ha especificado más de una vez." - IDS_CMDLINE_UNEXPECTVALUE - "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nNo se debe proporcionar un valor al parámetro ""%1""." - IDS_CMDLINE_MISSINGVAL "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nEl parámetro ""%1"" debe ir seguido de un valor." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nEl parámetro ""/SUBSET"" sólo puede especificarse en el caso de que también se haya especificado el parámetro ""/CELL""." - IDS_CMDLINE_INVALIDSUBSET - "El subconjunto de servidor que ha especificado, ""%2"", no se ha definido para la célula %1." - IDS_CMDLINE_SERVERNOTCELL - "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nEl parámetro ""/SERVER"" sólo puede especificarse en el caso de que también se haya especificado el parámetro ""/CELL""." - IDS_CMDLINE_RESET_TITLE "AFS Server Manager" - IDS_CMDLINE_RESET_DESC "El AFS Server Manager ha borrado la configuración especificada." - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "El AFS Server Manager no puede sincronizar VLDB con la partición %2 del servidor %1 ya que la partición no existe o no ha sido exportada.\n\nPara eliminar esta partición del servidor %1, debe eliminar la entradas de VLDB de volumen que hacen referencia a la misma." - IDS_CMDLINE_USERPASSWORD - "La línea de mandatos que ha especificado para el AFS Server Manager no es válida.\n\nPara obtener señales de AFS nuevas, deben especificarse tanto el parámetro ""/USER"" como el parámetro ""/PASSWORD"". " - IDS_ERROR_CANT_DELETE_KEY - "El AFS Server Manager no ha podido suprimir la clave de servidor %2 del servidor %1." - IDS_ERROR_CANT_GETRANDOMKEY - "El AFS Server Manager no ha podido generar una clave aleatoria para el servidor %1." - IDS_ERROR_CANT_EXECUTE_COMMAND - "El AFS Server Manager no ha podido ejecutar el mandato siguiente en el servidor %1.\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "El AFS Server Manager ha completado la operación de recuperación de modo satisfactorio, pero no ha podido recuperar el archivo de registro que describe el resultado específico de la operación de recuperación." - IDS_ERROR_CANT_SALVAGE "El AFS Server Manager no ha podido efectuar la operación de recuperación solicitada." - IDS_ERROR_CANT_AUTH_ON "El AFS Server Manager no ha podido habilitar la comprobación de autentificación para el servidor %1." - IDS_ERROR_CANT_AUTH_OFF "El AFS Server Manager no ha podido inhabilitar la comprobación de autentificación para el servidor %1." - IDS_ERROR_CANT_LOAD_HOSTLIST - "El AFS Server Manager no ha podido leer la lista de servidores de sistema principal de base de datos del servidor %1." - IDS_ERROR_CANT_SAVE_HOSTLIST - "El AFS Server Manager no ha podido cambiar la lista de servidores de sistemas principales de base de datos en el servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "El AFS Server Manager no ha podido iniciarse debido a que el AFS Control Center no se ha instalado debidamente en este sistema.\n\nEs posible que tenga que volver a instalar el AFS Control Center." - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "El AFS Server Manager no ha podido iniciarse debido a un problema desconocido.\n\nEs posible que tenga que volver a instalar el AFS Control Center." - IDS_ERROR_CANT_CHANGEADDR - "El AFS Server Manager no ha podido cambiar la dirección IP en VLDB para el servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "Sencillo" - IDS_SERVICETYPE_CRON "Cron" - IDS_SERVICESTATE_STOPPED "Detenido" - IDS_SERVICESTATE_STOPPING "Deteniéndose" - IDS_SERVICESTATE_STARTING "Iniciándose" - IDS_SERVICESTATE_RUNNING "Ejecutándose" - IDS_SERVICETYPE_FS_LONG "FS (sistema de archivos)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "Todos los servicios de la célula %1:" - IDS_SERVICE_STARTDATE "Iniciado %1" - IDS_SERVICE_STOPDATE "Detenido %1" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/ja_JP/svrmgr.rc b/src/WINNT/afssvrmgr/lang/ja_JP/svrmgr.rc deleted file mode 100644 index 37d45bd73..000000000 --- a/src/WINNT/afssvrmgr/lang/ja_JP/svrmgr.rc +++ /dev/null @@ -1,3010 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 253 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 303 - TOPMARGIN, 7 - BOTTOMMARGIN, 99 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 1 - RIGHTMARGIN, 306 - TOPMARGIN, 2 - BOTTOMMARGIN, 63 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 274 - TOPMARGIN, 1 - BOTTOMMARGIN, 105 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 305 - TOPMARGIN, 7 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 127 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 2 - BOTTOMMARGIN, 154 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 251 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 303 - TOPMARGIN, 7 - BOTTOMMARGIN, 65 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 303 - TOPMARGIN, 7 - BOTTOMMARGIN, 141 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 259 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 302 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 302 - TOPMARGIN, 2 - BOTTOMMARGIN, 64 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 276 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 250 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 303 - TOPMARGIN, 4 - BOTTOMMARGIN, 103 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 207 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 228 - TOPMARGIN, 4 - BOTTOMMARGIN, 62 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "ƒZƒ‹(&C)" - BEGIN - MENUITEM "‘I‘ð(&S)...", M_CELL_OPEN - MENUITEM "”FØ(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "I—¹(&X)", M_EXIT - END - POPUP "•\ަ(&V)" - BEGIN - POPUP "ƒT[ƒo[(&S)" - BEGIN - MENUITEM "‘åƒAƒCƒRƒ“(&G)", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "¬ƒAƒCƒRƒ“(&M)", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "Ú×(&D)", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "ƒNƒBƒbƒNEƒrƒ…[EƒyƒCƒ“(&Q)" - BEGIN - MENUITEM "‚È‚µ(&N)", M_DIVIDE_NONE, CHECKED - MENUITEM "c‚É•ªŠ„(&V)", M_DIVIDE_H, CHECKED - MENUITEM "‰¡‚É•ªŠ„(&H)", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "is’†‚Ì‘€ì(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "ƒ‚ƒjƒ^[‚³‚ê‚éƒT[ƒo[(&M)...", M_SUBSET - MENUITEM "—ñ(&C)...", M_COLUMNS - MENUITEM "ƒIƒvƒVƒ‡ƒ“(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL - END - POPUP "ƒwƒ‹ƒv(&H)" - BEGIN - MENUITEM "–ÚŽŸ(&C)", M_HELP - MENUITEM "ƒRƒ}ƒ“ƒhŒŸõ(&F)...", M_HELP_FIND - MENUITEM "ƒGƒ‰[EƒR[ƒh‚ÌŒŸõ(&L)...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ɂ‚¢‚Ä(&A)...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̍쐬(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv(&B)...", M_SET_CLONE - MENUITEM "‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒƒbƒN‰ðœ(&U)", M_SET_UNLOCK - MENUITEM "VLDB ‚Ì“¯Šú‰»(&Y)...", M_SYNCVLDB - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̃Tƒ‹ƒx[ƒW(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM "ƒvƒƒpƒeƒB[(&R)", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "ŠJŽn(&S)", M_SVC_START - MENUITEM "’âŽ~(&S)", M_SVC_STOP - MENUITEM "ÄŽn“®(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "ƒƒOEƒtƒ@ƒCƒ‹‚Ì•\ަ(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "íœ(&L)", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM "ƒvƒƒpƒeƒB[(&R)", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "•W€(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̍쐬(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "•W€(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒT[ƒrƒX‚̍쐬(&C)...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "•¡»(&P)...", M_SET_REPLICATION - MENUITEM "‘¦Žž‰ð•ú(&S)", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "ƒoƒbƒNƒAƒbƒv(&B)...", M_SET_CLONE - MENUITEM "ƒtƒ@ƒCƒ‹‚Ƀ_ƒ“ƒv(&D)...", M_SET_DUMP - MENUITEM "ƒtƒ@ƒCƒ‹‚©‚畜Œ³(&R)...", M_SET_RESTORE - MENUITEM "Š„‚è“–‚ėʂ̐ݒè(&Q)...", M_SET_SETQUOTA - MENUITEM "ƒTƒ‹ƒx[ƒW(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "ˆÚ“®æ(&M)...", M_SET_MOVETO - MENUITEM "–¼‘O•ύX(&N)...", M_SET_RENAME - MENUITEM "íœ(&L)", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "ƒƒbƒN(&K)", M_SET_LOCK - MENUITEM "ƒƒbƒN‰ðœ(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM "ƒvƒƒpƒeƒB[(&R)", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "ƒT[ƒo[EƒEƒBƒ“ƒhƒE‚̃I[ƒvƒ“(&O)", M_SVR_OPEN - MENUITEM "ƒT[ƒo[EƒEƒBƒ“ƒhƒE‚̃Nƒ[ƒY(&C)", M_SVR_CLOSE - MENUITEM "‚±‚̃T[ƒo[‚ðƒ‚ƒjƒ^[(&M)", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "ƒT[ƒo[EƒZƒLƒ…ƒŠƒeƒB[‚̕ҏW(&S)...", M_SVR_SECURITY - MENUITEM "ƒf[ƒ^ƒx[ƒXEƒzƒXƒg‚ÌŠÇ—(&H)...", M_SVR_HOSTS - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv(&B)...", M_SET_CLONE - MENUITEM "‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒƒbƒN‰ðœ(&U)", M_SET_UNLOCK - MENUITEM "VLDB ‚Ì“¯Šú‰»(&Y)...", M_SYNCVLDB - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̃Tƒ‹ƒx[ƒW(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "ƒtƒ@ƒCƒ‹‚̃Cƒ“ƒXƒg[ƒ‹(&I)...", M_SVR_INSTALL - MENUITEM "ƒtƒ@ƒCƒ‹‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹(&U)...", M_SVR_UNINSTALL - MENUITEM "‹Œƒtƒ@ƒCƒ‹‚̍폜(&P)...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "ƒtƒ@ƒCƒ‹“ú•t‚̎擾(&T)...", M_SVR_GETDATES - MENUITEM "ƒƒOEƒtƒ@ƒCƒ‹‚Ì•\ަ(&V)...", M_VIEWLOG - MENUITEM "ƒRƒ}ƒ“ƒh‚ÌŽÀs(&X)...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM "ƒvƒƒpƒeƒB[(&R)", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "‘åƒAƒCƒRƒ“(&G)", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "¬ƒAƒCƒRƒ“(&M)", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "Ú×(&D)", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒ‚ƒjƒ^[‚³‚ê‚éƒT[ƒo[(&M)...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒƒbƒN‰ðœ(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂăNƒ[ƒY(&C)", M_SVR_CLOSEALL - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚²‚Æ(&V)", M_SET_VIEW_REPORT, CHECKED - MENUITEM "ƒp[ƒeƒBƒVƒ‡ƒ“‚²‚Æ(&P)", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "Ú×‚È‚µ(&D)", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̍쐬(&C)...", M_SET_CREATE - MENUITEM "ƒtƒ@ƒCƒ‹‚©‚畜Œ³(&R)...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv(&B)...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂăƒbƒN‰ðœ(&U)", M_SET_UNLOCK - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "—ñ(&C)...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "ÄŽn“®(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "ƒƒOEƒtƒ@ƒCƒ‹‚Ì•\ަ(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM "ƒvƒƒpƒeƒB[(&R)", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "‚±‚±‚Ɉړ®(&M)...", M_SET_MOVEHERE - MENUITEM "‚±‚±‚É•¡»(&R)...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "ŽæÁ‚µ(&C)", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "ƒT[ƒrƒX:",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 55,WS_EX_STATICEDGE - PUSHBUTTON "ì¬(&C)...",IDC_SVC_CREATE,44,78,42,12 - PUSHBUTTON "íœ(&L)",IDC_SVC_DELETE,88,78,39,12 - PUSHBUTTON "ÄŽn“®(&R)",IDC_SVC_RESTART,129,78,45,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“:",IDC_AGG_DESC,0,5,159,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,16,165, - 47,WS_EX_STATICEDGE - PUSHBUTTON "ƒ{ƒŠƒ…[ƒ€‚̍쐬(&C)...",IDC_AGG_CREATESET,71,70,90,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 231, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "ƒ{ƒŠƒ…[ƒ€:",IDC_SET_DESC,0,5,224,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,224, - 51,WS_EX_STATICEDGE - PUSHBUTTON "ì¬(&C)...",IDC_SET_CREATE,1,77,42,12 - PUSHBUTTON "íœ(&L)",IDC_SET_DELETE,45,77,39,12 - PUSHBUTTON "•¡»(&R)...",IDC_SET_REP,85,77,51,12 - PUSHBUTTON "Š„‚è“–‚ėʂ̐ݒè(&Q)...",IDC_SET_SETQUOTA,137,77,90,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,23,216, - 129,WS_EX_CLIENTEDGE - PUSHBUTTON "ŠÇ—ŽÒ‚̒ljÁ(&A)",IDC_LIST_ADD,69,157,69,14 - PUSHBUTTON "ŠÇ—ŽÒ‚̍폜(&R)",IDC_LIST_REMOVE,138,157,80,14 - LTEXT "ƒT[ƒo[ %1 ‚ÌŠÇ—ŽÒ:",IDC_LIST_NAME,5,7,216,10 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ID:",IDC_STATIC,7,30,31,8 - LTEXT "(Æ‰ï’†)",IDC_AGG_ID,54,30,208,8 - LTEXT "‘•’u:",IDC_STATIC,7,46,31,8 - LTEXT "(Æ‰ï’†)",IDC_AGG_DEVICE,54,46,208,8 - LTEXT "ƒ{ƒŠƒ…[ƒ€:",IDC_STATIC,7,62,39,8 - LTEXT "(Æ‰ï’†)",IDC_AGG_FILESETS,54,62,208,8 - CONTROL "Œ‹‡ƒ{ƒŠƒ…[ƒ€Š„‚è“–‚Ä—Ê‚ª—e—ʂ𒴂¦‚½ê‡‚ÍŒx‚ð•\ަ(&V)", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 18,76,221,10 - LTEXT "Žg—p—¦:",IDC_STATIC,7,90,27,8 - LTEXT "(Æ‰ï’†)",IDC_AGG_USAGE,54,90,200,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,103,224,8, - WS_EX_STATICEDGE - CONTROL "ƒp[ƒeƒBƒVƒ‡ƒ“‚ÌŽg—p—¦‚ª’´‰ß‚µ‚½ê‡‚ÉŒx‚ð•\ަ(&W)", - IDC_AGG_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18, - 116,220,10 - CONTROL "‚±‚̃T[ƒo[‚̃fƒtƒHƒ‹ƒg‚µ‚«‚¢’l(&D)", - IDC_AGG_WARN_AGGFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,49,129,203,9 - CONTROL "‚»‚̃TƒCƒY‚Ì",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,143,55,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,112,141,29,12, - ES_AUTOHSCROLL - LTEXT "% ‚Ì‚µ‚«‚¢’l(&T)",IDC_AGG_WARN_AGGFULL_DESC,166,143,92, - 8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,20,20 - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“ %2 (ƒT[ƒo[ %1)",IDC_AGG_NAME,34,8,228, - 16 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "IP ƒAƒhƒŒƒX:",IDC_STATIC,5,34,37,8 - LISTBOX IDC_SVR_ADDRESSES,53,32,70,10,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "ƒAƒhƒŒƒX‚̕ύX(&A)...",IDC_SVR_CHANGEADDR,134,32,82,12 - PUSHBUTTON "”FØ‚ª•K—v(&R)",IDC_SVR_AUTH_YES,41,81,84,12 - PUSHBUTTON "–¢”FØ‚ð‹–‰Â(&U)",IDC_SVR_AUTH_NO,129,81,80,12 - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“”:",IDC_STATIC,11,131,90,8 - LTEXT "(Æ‰ï’†)",IDC_SVR_NUMAGGREGATES,113,131,99,8 - LTEXT "‘—e—Ê:",IDC_STATIC,11,148,48,8 - LTEXT "(Æ‰ï’†)",IDC_SVR_CAPACITY,113,148,99,8 - LTEXT "Œ‹‡ƒ{ƒŠƒ…[ƒ€Š„‚è“–‚Ä—Ê:",IDC_STATIC,11,165,93,8 - LTEXT "(Æ‰ï’†)",IDC_SVR_ALLOCATION,113,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(ƒT[ƒo[–¼)",IDC_SVR_NAME,39,10,179,15 - GROUPBOX "ƒZƒLƒ…ƒŠƒeƒB[",IDC_STATIC,5,52,216,52 - GROUPBOX "‹L‰¯ˆæ",IDC_STATIC,5,115,216,68 - LTEXT "‚±‚̃T[ƒo[‚Ö‚Ì‘SƒAƒNƒZƒX‚Ì”FØ‚ð•K—v‚ɂł«‚Ü‚·B", - IDC_STATIC,11,67,201,8 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 244, 158 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚±‚̃T[ƒo[‚̃p[ƒeƒBƒVƒ‡ƒ“‚ª",IDC_SVR_WARN_AGGFULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,116,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,144,16,24,12,ES_AUTOHSCROLL - LTEXT "% ƒtƒ‹",IDC_STATIC,184,18,25,8 - CONTROL "‚±‚̃T[ƒo[‚̃{ƒŠƒ…[ƒ€‚ª",IDC_SVR_WARN_SETFULL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,12,32,116,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,144,30,24,12,ES_AUTOHSCROLL - LTEXT "% ƒtƒ‹",IDC_STATIC,184,32,25,8 - CONTROL "ƒp[ƒeƒBƒVƒ‡ƒ“‚ÌŒ‹‡Š„‚è“–‚Ä—Ê‚ª—e—ʂ𒴂¦‚½", - IDC_SVR_WARN_AGGALLOC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,46,195,9 - CONTROL "‚±‚̃T[ƒo[‚̃T[ƒrƒX‚ªŽÀs‚ð’âŽ~‚µ‚½", - IDC_SVR_WARN_SVCSTOP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,60,195,9 - CONTROL "‚±‚̃T[ƒo[‚̃{ƒŠƒ…[ƒ€‚É VLDB €–Ú‚ª‚È‚¢", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,74,195,9 - CONTROL "VLDB ‚ª‚±‚̃T[ƒo[‚̃Iƒtƒ‰ƒCƒ“Eƒp[ƒeƒBƒVƒ‡ƒ“‚ðŽQÆ", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,88,195,9 - CONTROL "VLDB ‚ª‚±‚̃T[ƒo[‚̃Iƒtƒ‰ƒCƒ“Eƒ{ƒŠƒ…[ƒ€‚ðŽQÆ", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,103,195,9 - CONTROL "ƒT[ƒo[î•ñ‚ð",IDC_SVR_AUTOREFRESH,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,6,140,63,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,79,138,27,13,ES_AUTOHSCROLL - LTEXT "•ª‚²‚ƂɍŐV•\ަ",IDC_STATIC,125,140,65,8 - LTEXT "ˆÈ‰º‚̏ꍇ‚ÉŒx‚ð•\ަ",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "ƒT[ƒrƒXEƒƒO‚Ì•\ަ(&V)",IDC_SVC_VIEWLOG,8,184,101,14 - PUSHBUTTON "‘¦ŽžŠJŽn(&S)",IDC_SVC_START,110,184,53,14 - PUSHBUTTON "‘¦Žž’âŽ~(&P)",IDC_SVC_STOP,164,184,53,14 - CONTROL "ƒT[ƒrƒX‚ª’âŽ~‚µ‚Ä‚¢‚½ê‡‚ÍŒx‚ð•\ަ(&W)", - IDC_SVC_WARNSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,164,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "ƒT[ƒrƒX %2 (ƒT[ƒo[ %1)",IDC_SVC_NAME,31,6,188,20 - LTEXT "ƒ^ƒCƒv:",IDC_STATIC,7,34,37,8 - LTEXT "(Æ‰ï’†)",IDC_SVC_TYPE,77,34,138,8 - LTEXT "ƒpƒ‰ƒ[ƒ^[:",IDC_STATIC,7,50,42,8 - EDITTEXT IDC_SVC_PARAMS,58,50,156,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "ƒm[ƒeƒBƒtƒ@ƒCƒ„[:",IDC_STATIC,7,66,63,8 - LTEXT "(Æ‰ï’†)",IDC_SVC_NOTIFIER,77,66,138,8 - LTEXT "ÅIŠJŽn:",IDC_STATIC,7,82,34,8 - LTEXT "(Æ‰ï’†)",IDC_SVC_STARTDATE,77,82,138,8 - LTEXT "ÅI’âŽ~:",IDC_STATIC,7,98,34,8 - LTEXT "(Æ‰ï’†)",IDC_SVC_STOPDATE,77,98,138,8 - LTEXT "ÅIáŠQ:",IDC_STATIC,7,115,34,8 - EDITTEXT IDC_SVC_LASTERROR,58,114,156,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "ƒT[ƒrƒXó‹µ",IDC_STATIC,5,131,215,71 - LTEXT "‚±‚̃T[ƒrƒX‚ÌŒ»Ý‚̏󋵂𔻕ʒ†...",IDC_SVC_STATUS,11, - 147,203,8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒ{ƒŠƒ…[ƒ€ ID:",IDC_STATIC,5,30,51,8 - LTEXT "(•s–¾)",IDC_SET_ID,89,30,173,8 - LTEXT "ì¬:",IDC_STATIC,5,46,39,8 - LTEXT "(Æ‰ï’†)",IDC_SET_CREATEDATE,89,46,173,8 - LTEXT "XV:",IDC_STATIC,5,62,39,8 - LTEXT "(Æ‰ï’†)",IDC_SET_UPDATEDATE,89,62,173,8 - LTEXT "ƒAƒNƒZƒX:",IDC_STATIC,5,78,39,8 - LTEXT "(Æ‰ï’†)",IDC_SET_ACCESSDATE,89,78,173,8 - LTEXT "ƒoƒbƒNƒAƒbƒv:",IDC_STATIC,5,94,50,8 - LTEXT "(Æ‰ï’†)",IDC_SET_BACKUPDATE,89,94,173,8 - LTEXT "ƒtƒ@ƒCƒ‹EƒJƒEƒ“ƒg:",IDC_STATIC,5,110,74,8 - LTEXT "(Æ‰ï’†)",IDC_SET_FILES,89,110,173,8 - LTEXT "ó‹µ:",IDC_STATIC,5,125,18,8 - LTEXT "(Æ‰ï’†)",IDC_SET_STATUS,38,125,108,8 - PUSHBUTTON "ƒƒbƒN(&L)",IDC_SET_LOCK,152,123,49,12 - PUSHBUTTON "ƒƒbƒN‰ðœ(&U)",IDC_SET_UNLOCK,204,123,61,12 - LTEXT "Žg—p—¦:",IDC_STATIC,5,141,24,8 - LTEXT "(Æ‰ï’†)",IDC_SET_USAGE,38,141,125,8 - PUSHBUTTON "Š„‚è“–‚ėʂ̐ݒè(&Q)...",IDC_SET_QUOTA,175,139,90,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,213,8, - WS_EX_STATICEDGE - CONTROL "ƒ{ƒŠƒ…[ƒ€Žg—p—¦‚ª’´‰ß‚µ‚½ê‡‚ÍŒx‚ð•\ަ(&W)", - IDC_SET_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10, - 170,219,10 - CONTROL "‚±‚̃T[ƒo[‚̃fƒtƒHƒ‹ƒg‚µ‚«‚¢’l(&D) (ƒTƒCƒY‚Ì %1%%)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,19,184,249,9 - CONTROL "‚»‚̃TƒCƒY‚Ì",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,19,197,59,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,86,195,29,12,ES_AUTOHSCROLL - LTEXT "% ‚Ì‚µ‚«‚¢’l(&T)",IDC_SET_WARN_SETFULL_DESC,147,197,64, - 8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2)", - IDC_SET_NAME,31,5,237,17 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‘I‘ð‚µ‚½ƒZƒ‹:",IDC_STATIC,2,8,50,8 - LTEXT "(ƒZƒ‹–¼‚ª‚±‚±‚É“ü‚è‚Ü‚·)",IDC_CELL,62,8,208,9 - LTEXT "AFS ƒg[ƒNƒ“:",IDC_STATIC,2,21,50,8 - LTEXT "%2:%1 (ƒg[ƒNƒ“‚ÌŠúŒÀ %3 ‚ɐ؂ê‚Ü‚·)",IDC_AFS_ID,62,21, - 218,16 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,43,313, - 181,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "ƒT[ƒo[" -CLASS "ServerWindowClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,5,36,49,8 - COMBOBOX IDC_SVC_SERVER,62,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒT[ƒrƒX(&V):",IDC_STATIC,5,52,49,8 - COMBOBOX IDC_SVC_NAME,62,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒRƒ}ƒ“ƒh(&C):",IDC_STATIC,5,70,49,8 - EDITTEXT IDC_SVC_COMMAND,89,68,128,13,ES_AUTOHSCROLL - LTEXT "ƒpƒ‰ƒ[ƒ^[(&P):",IDC_STATIC,5,88,65,8 - EDITTEXT IDC_SVC_PARAMS,89,86,128,13,ES_AUTOHSCROLL - LTEXT "ƒm[ƒeƒBƒtƒ@ƒCƒ„[(&N):",IDC_STATIC,5,105,75,8 - EDITTEXT IDC_SVC_NOTIFIER,89,103,128,13,ES_AUTOHSCROLL - LTEXT "ƒƒOEƒtƒ@ƒCƒ‹(&L):",IDC_STATIC,5,122,72,8 - EDITTEXT IDC_SVC_LOGFILE,89,120,128,13,ES_AUTOHSCROLL - CONTROL "ƒVƒ“ƒvƒ‹(&I) (˜A‘±‚µ‚ÄŽÀs)",IDC_SVC_TYPE_SIMPLE,"Button", - BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "‚±‚̃T[ƒrƒX‚𑦎žŠJŽn(&T)",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "FS(&F) (ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "Cron(&R) (Žw’è‚ÌŠÔŠu‚ÅŽÀs)",IDC_SVC_TYPE_CRON,"Button", - BS_AUTORADIOBUTTON,11,195,201,10 - LTEXT "ŽÀs“úŽž(&W):",IDC_STATIC,23,209,42,8 - COMBOBOX IDC_SVC_RUNDAY,76,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,158,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "V‹KƒT[ƒrƒX",IDC_SVC_DESC,35,9,179,14 - GROUPBOX "ƒT[ƒrƒXEƒ^ƒCƒv",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "‘¦Žž‰ð•ú(&R)",IDC_SET_RELEASE,11,145,53,14 - PUSHBUTTON "ì¬(&C)...",IDC_SET_REPSITE_ADD,126,145,42,14 - PUSHBUTTON "íœ(&L)",IDC_SET_REPSITE_DELETE,172,145,38,14 - LTEXT "ƒT[ƒo[:",-1,9,31,42,8 - LTEXT "(ƒT[ƒo[–¼)",IDC_SET_SERVER,58,31,156,8 - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“:",-1,9,44,42,8 - LTEXT "(ƒp[ƒeƒBƒVƒ‡ƒ“–¼)",IDC_SET_AGGREGATE,58,44,156,8 - LTEXT "ƒ{ƒŠƒ…[ƒ€:",-1,9,18,42,8 - LTEXT "(ƒ{ƒŠƒ…[ƒ€–¼)",IDC_SET_NAME,58,18,156,8 - GROUPBOX "“ǂݎæ‚è / ‘‚«ž‚݃{ƒŠƒ…[ƒ€",-1,5,5,211,56 - GROUPBOX "ƒ{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 257 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒZƒ‹‚Ì‘I‘ð - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒZƒ‹(&C):",IDC_STATIC,4,24,33,8 - COMBOBOX IDC_OPENCELL_CELL,43,22,171,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "AFS ”FØ",IDC_STATIC,4,44,211,92 - LTEXT "AFS ID(&I):",IDC_STATIC,22,100,55,8 - EDITTEXT IDC_OPENCELL_ID,100,98,109,14,ES_AUTOHSCROLL - LTEXT "AFS ƒpƒXƒ[ƒh(&P):",IDC_STATIC,22,116,67,8 - EDITTEXT IDC_OPENCELL_PASSWORD,100,114,109,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "Šg’£(&V) >>",IDC_ADVANCED,4,140,53,14 - DEFPUSHBUTTON "—¹‰ð",IDOK,76,140,41,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,120,140,41,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,164,140,45,14 - CONTROL "‚±‚̃Zƒ‹‚Ì‚·‚ׂẴT[ƒo[‚ðƒ‚ƒjƒ^[(&L)",IDC_MON_ALL, - "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,10,196,185,9 - CONTROL "1 ƒT[ƒo[‚̂݃‚ƒjƒ^[(&M):",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,209,106,10 - EDITTEXT IDC_MON_SERVER,125,207,83,13,ES_AUTOHSCROLL - CONTROL "ŽŸ‚̃TƒuƒZƒbƒg‚̃T[ƒo[‚̂݃‚ƒjƒ^[(&S):",IDC_MON_SOME, - "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,10,223,146,10 - COMBOBOX IDC_MON_SUBSET,125,235,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "‘€ì‚µ‚½‚¢ AFS ƒZƒ‹‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B",IDC_STATIC,4,7, - 200,8 - GROUPBOX "ƒT[ƒo[‚̃‚ƒjƒ^[",IDC_ADVANCED_GROUP,4,162,211,91 - LTEXT "‚æ‚è‚æ‚¢ƒpƒtƒH[ƒ}ƒ“ƒX‚Ì‚½‚߂ɁA‚±‚̃Zƒ‹‚ÅŽg—p‰Â”\‚ȃT[ƒo[‚̃TƒuƒZƒbƒg‚Ì‚Ý‚ðƒ‚ƒjƒ^[‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,10,172,199,20 - LTEXT "(Æ‰ï’†...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "ƒZƒ‹‚ÌŠÇ—‚É‚Í AFS ƒpƒXƒ[ƒh‚ðÄ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_STATIC,10,85,197,8 - LTEXT "‘I‘ð‚µ‚½ƒZƒ‹“à‚ÌŒ»Ý‚Ì AFS ƒg[ƒNƒ“:",IDC_STATIC,10,57, - 196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Œx - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "ƒ^ƒXƒN‚ª³í‚ÉŠ®—¹‚·‚é‚܂őҋ@‚𑱍s(&C)", - IDC_TIMEOUT_WAIT,"Button",BS_AUTORADIOBUTTON,21,87,208, - 10 - CONTROL "ƒ^ƒXƒN‚̏I—¹(&T)",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,21,101,208,10 - DEFPUSHBUTTON "—¹‰ð",IDOK,93,137,50,14 - LTEXT "ƒ^ƒXƒN‚ÌŽÀsŒo‰ßŽžŠÔ:",IDC_STATIC,6,119,137,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,155,119,29,8 - LTEXT "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚Í—\‘zŠO‚É’·‚¢ŽžŠÔAƒlƒbƒgƒ[ƒNEƒ^ƒXƒN‚ÌŠ®—¹‚ð‘Ò‹@‚µ‚Ü‚µ‚½B", - IDC_STATIC,4,7,228,18 - LTEXT "ƒ^ƒXƒN‚ÉŽÀs‚𑱂¯‚³‚¹‚é („§) ‚©Aƒ^ƒXƒN‚ªŠ®—¹‚µ‚È‚¢‚ÆŽv‚í‚ê‚éê‡‚Í AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚Ƀ^ƒXƒN‚ðI—¹‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,4,28,228,23 - LTEXT "‚±‚̃EƒBƒ“ƒhƒE‚ª•\ަ‚³‚ê‚Ä‚àAƒ^ƒXƒN‚ª‚Ü‚¾is’†‚Å‚ ‚邱‚ƂɒˆÓ‚µ‚Ä‚­‚¾‚³‚¢Bƒ^ƒXƒN‚ªŠ®—¹‚·‚邯A‚±‚̃EƒBƒ“ƒhƒE‚ÍŽ©“®“I‚ɃNƒ[ƒY‚µ‚Ü‚·B", - IDC_STATIC,4,59,228,21 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "—ñ" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒŠƒXƒgŽž‚É•\ަ‚·‚é—ñ‚Ì‘I‘ð(&S):",IDC_STATIC,5,7,111,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Žg—p‰Â”\‚È—ñ(&C):",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "•\ަ‚·‚é—ñ(&I):",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "’ljÁ(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< íœ(&R)",IDC_COL_DELETE,119,88,47,14 - PUSHBUTTON "ã‚Ɉړ®(&U)",IDC_COL_UP,170,124,53,14 - PUSHBUTTON "‰º‚Ɉړ®(&D)",IDC_COL_DOWN,224,124,53,14 - GROUPBOX "—ñ‚ÌƒŠƒXƒg",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 269, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ƒŠƒtƒŒƒbƒVƒ…’† - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "0%% Š®—¹",IDC_REFRESH_PERCENT,4,49,171,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,192,8 - LTEXT "‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "ƒXƒLƒbƒv(&S)",IDC_REFRESH_SKIP,205,54,53,12,NOT - WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̍쐬" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "–¼‘O(&N):",IDC_STATIC,6,30,39,8 - EDITTEXT IDC_SET_NAME,76,28,116,14,ES_AUTOHSCROLL - LTEXT "Š„‚è“–‚Ä—Ê(&Q):",IDC_STATIC,6,48,58,8 - EDITTEXT IDC_SET_QUOTA,76,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,120,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒoƒbƒNƒAƒbƒv(&B):",IDC_STATIC,6,66,60,8 - CONTROL "‚±‚̃{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚àì¬(&R)", - IDC_SET_CLONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,76, - 66,210,8 - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,6,84,49,8 - COMBOBOX IDC_SET_SERVER,76,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“(&P):",IDC_STATIC,6,100,73,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,112,271, - 70,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "—¹‰ð",IDOK,152,188,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,207,188,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,263,188,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "V‹Kƒ{ƒŠƒ…[ƒ€",IDC_STATIC,31,7,284,15 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 307, 103 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̍폜" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ŽæÁ‚µ",IDCANCEL,196,85,50,14 - CONTROL "ƒ{ƒŠƒ…[ƒ€ %3 ‚ðƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚©‚çíœ(&D)", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 8,48,295,11 - PUSHBUTTON "—¹‰ð",IDOK,142,85,50,14 - CONTROL "ƒ{ƒŠƒ…[ƒ€ %3 ‚Ì VLDB €–Ú‚ðíœ(&V)",IDC_DELSET_VLDB, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,67,282,10 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,250,85,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "’ˆÓ!\n\n‚±‚Ì‘€ì‚ðs‚¤‚ƁAƒ{ƒŠƒ…[ƒ€ %3 ‚͉i‹v‚ɍ폜‚³‚ê‚Ü‚·B", - IDC_DELSET_DESC,31,8,272,29 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,178,66,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,232,66,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,286,66,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "ƒ{ƒŠƒ…[ƒ€EƒoƒbƒNƒAƒbƒv‚́A‚»‚̃{ƒŠƒ…[ƒ€‚̓ǂݎæ‚èê—pƒRƒs[‚̂悤‚È“­‚«‚ð‚µ‚Ü‚·B“ǂݎæ‚è/‘‚«ž‚݃{ƒŠƒ…[ƒ€‚̓oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ð 1 ‚‚¾‚¯Ž‚‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,29,5,312,16 - LTEXT "ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€ %3 ‚̃oƒbƒNƒAƒbƒv‚ðì¬‚·‚é‚ɂ́Au—¹‰ðv‚ðƒNƒŠƒbƒN‚µ‚Ü‚·B‚±‚̃{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv‚ª‚·‚łɑ¶Ý‚·‚éê‡AƒoƒbƒNƒAƒbƒv‚͍XV‚³‚ê‚Ü‚·B", - IDC_CLONE_DESC,29,29,312,30 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "Šù’m‚Ì–â‘è",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "ƒT[ƒrƒX %2 (ƒT[ƒo[ %1)",IDC_PROBLEM_TITLE,32,8,186, - 21 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "Šù’m‚Ì–â‘è",IDC_PROBLEM_BOX,5,38,216,112 - LTEXT "99:",IDC_PROBLEM_HEADER,11,51,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,27,60,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,204,51,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,139,134,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,32,10,189,20 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "Šù’m‚Ì–â‘è",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“ %2 (ƒT[ƒo[ %1)",IDC_PROBLEM_TITLE,33,8, - 219,16 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "Šù’m‚Ì–â‘è",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2)", - IDC_PROBLEM_TITLE,31,5,237,20 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̈ړ®" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,72,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "—¹‰ð",IDOK,115,153,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,167,153,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,219,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,236,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "ƒ{ƒŠƒ…[ƒ€‚̈ړ®æ(&M):",IDC_STATIC,4,41,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 307, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€ˆÚ“®’† - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,5,0,295,26 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %3 ‚ðƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚©‚çƒT[ƒo[ %4 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %5 ‚Ɉړ®’†...", - IDC_MOVESET_DESC,1,29,305,34 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒƒOEƒtƒ@ƒCƒ‹‚Ì•\ަ" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[‚̃ƒOEƒtƒ@ƒCƒ‹‚ð•\ަ(&S):",IDC_STATIC,2,35, - 137,8 - COMBOBOX IDC_VIEWLOG_SERVER,82,45,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "•\ަ‚·‚éƒT[ƒo[‚̃tƒ@ƒCƒ‹(&F):",IDC_STATIC,2,63,121,8 - EDITTEXT IDC_VIEWLOG_FILENAME,82,73,185,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,166,91,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,220,91,50,14 - ICON IDI_SERVICE,IDC_STATIC,2,1,20,20 - LTEXT "•\ަ‚µ‚½‚¢ƒƒOEƒtƒ@ƒCƒ‹‚Ì‘SƒpƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_VIEWLOG_DESC,29,1,243,28 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 307, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "ƒƒOEƒtƒ@ƒCƒ‹‚Ì•\ަ" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒtƒ@ƒCƒ‹EƒRƒ“ƒeƒ“ƒc:",IDC_SVC_VIEWLOG_CONTENTS,4,48, - 280,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,61,280,99,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "•Ê–¼•ÛŠÇ(&A)...",IDC_VIEWLOG_SAVEAS,167,167,58,14 - DEFPUSHBUTTON "ƒNƒ[ƒY(&C)",IDOK,227,167,53,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "ƒT[ƒo[ %1 ‚Ì [ƒT[ƒrƒX %2 ‚Ì] ƒƒOEƒtƒ@ƒCƒ‹", - IDC_SVC_VIEWLOG_DESC,30,9,273,15 - LTEXT "ƒT[ƒo[‚̃tƒ@ƒCƒ‹–¼: %1",IDC_SVC_VIEWLOG_FILENAME,30, - 32,273,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€Š„‚è“–‚ėʂ̐ݒè" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "Œ»sŠ„‚è“–‚Ä—Ê:",IDC_STATIC,4,66,50,8 - LTEXT "(•s–¾)",IDC_SET_USAGE,62,66,194,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,62,78,201,8, - WS_EX_STATICEDGE - LTEXT "V‹KŠ„‚è“–‚Ä—Ê(&Q):",IDC_STATIC,4,95,65,8 - EDITTEXT IDC_SET_QUOTA,79,93,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,123,93,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "—¹‰ð",IDOK,106,113,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,160,113,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,214,113,50,14 - PUSHBUTTON "ƒvƒƒpƒeƒB[(&P)...",IDC_AGG_PROPERTIES,193,34,69,12 - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“:",IDC_STATIC,4,36,50,8 - LTEXT "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2",IDC_SET_AGGREGATE,62, - 36,123,21 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %1",IDC_SET_NAME,36,8,228,19 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "is’†‚Ì‘€ì - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "ŽŸ‚Ì‘€ì‚ªŒ»Ýis’†‚Å‚·:",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "VLDB ‚Ì“¯Šú‰»" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,107,79,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,161,79,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,215,79,50,14 - ICON 32515,IDC_STATIC,4,4,20,20 - LTEXT "(ŽÀsŽž‚ɐݒè)",IDC_SYNC_DESC,29,4,236,32 - LTEXT "(ŽÀsŽž‚ɐݒè)",IDC_SYNC_DESC2,29,46,236,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚Ì•¡»" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,67,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "—¹‰ð",IDOK,112,150,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,166,150,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,220,150,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,21 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %3 ‚̐V‹KƒŒƒvƒŠƒJ",IDC_SET_NAME,31,7,242,17 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "‚±‚̃{ƒŠƒ…[ƒ€‚̐V‹KƒŒƒvƒŠƒJ‚ðì¬‚·‚éêŠ(&C):", - IDC_STATIC,4,34,259,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 248, 156 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒtƒ@ƒCƒ‹‚̃Cƒ“ƒXƒg[ƒ‹" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒ\[ƒXEƒtƒ@ƒCƒ‹(&F):",IDC_STATIC,6,62,81,8 - EDITTEXT IDC_FILENAME,51,72,135,14,ES_AUTOHSCROLL - PUSHBUTTON "ŽQÆ(&B)...",IDC_BROWSE,191,72,50,14 - LTEXT "ƒ^[ƒQƒbƒgEƒT[ƒo[(&S):",IDC_STATIC,6,88,97,8 - COMBOBOX IDC_SERVER,51,97,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒ^[ƒQƒbƒg–¼(&N):",IDC_STATIC,6,112,66,8 - EDITTEXT IDC_DIRECTORY,51,121,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,83,140,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,137,140,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,191,140,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,2,20,20 - LTEXT "ƒT[ƒo[‚Ƀtƒ@ƒCƒ‹‚ðƒCƒ“ƒXƒg[ƒ‹",IDC_STATIC,32,6,205, - 15 - LTEXT "(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)\n(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)\n(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)\n(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)", - IDC_INSTALL_DESC,4,27,240,31 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒtƒ@ƒCƒ‹‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,6,66,49,8 - COMBOBOX IDC_SERVER,64,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒ^[ƒQƒbƒgEƒtƒ@ƒCƒ‹(&F):",IDC_STATIC,6,85,97,8 - EDITTEXT IDC_FILENAME,64,97,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,88,119,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,141,119,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,194,119,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "ƒT[ƒo[‚©‚çƒtƒ@ƒCƒ‹‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹",IDC_STATIC,32, - 12,205,8 - LTEXT "‚±‚Ì‘€ì‚́A“Á’è‚̃T[ƒo[ã‚ɈȑO‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ꂽƒtƒ@ƒCƒ‹‚̃Rƒs[‚𕜌³‚µ‚Ü‚·B‘I‘ð‚µ‚½ƒtƒ@ƒCƒ‹‚ɈȑOƒCƒ“ƒXƒg[ƒ‹‚³‚ꂽƒRƒs[‚ª‚È‚¢ê‡Aƒtƒ@ƒCƒ‹‚͍폜‚³‚ê‚Ü‚·B", - IDC_STATIC,6,29,234,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 255, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "‹Œƒtƒ@ƒCƒ‹‚̍폜" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[:",-1,4,56,41,8 - COMBOBOX IDC_SERVER,57,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "‚·‚ׂẴRƒAEƒtƒ@ƒCƒ‹‚ðíœ(&C)",IDC_OP_DELETE_CORE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,85,138,10 - CONTROL "‚·‚×‚Ä‚Ì .BAK ƒtƒ@ƒCƒ‹‚ðíœ(&B) (ƒtƒ@ƒCƒ‹EƒoƒbƒNƒAƒbƒv)", - IDC_OP_DELETE_BAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 13,96,229,10 - CONTROL "‚·‚×‚Ä‚Ì .OLD ƒtƒ@ƒCƒ‹‚ðíœ(&O) (‹Œƒtƒ@ƒCƒ‹EƒoƒbƒNƒAƒbƒv)", - IDC_OP_DELETE_OLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 13,107,232,10 - DEFPUSHBUTTON "—¹‰ð",IDOK,38,121,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,92,121,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,201,121,50,14 - ICON IDI_PRUNE,-1,6,5,20,20 - LTEXT "‹Œƒtƒ@ƒCƒ‹‚ðƒT[ƒo[‚©‚çíœ",-1,39,10,205,11 - LTEXT "‚±‚Ì‘€ì‚́A“Á’è‚̃T[ƒo[‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ꂽƒtƒ@ƒCƒ‹‚̃oƒbƒNƒAƒbƒvEƒRƒs[‚ðíœ‚µ‚Ü‚·B", - -1,7,32,240,16 - LTEXT "íœ‚·‚éƒtƒ@ƒCƒ‹:",-1,4,73,66,8 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚Ì–¼‘O•ύX" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "Œ»Ý‚Ì–¼‘O(&O):",IDC_STATIC,31,67,51,8 - EDITTEXT IDC_RENSET_OLD,94,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "V‚µ‚¢–¼‘O(&N):",IDC_STATIC,31,85,51,8 - EDITTEXT IDC_RENSET_NEW,94,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,112,111,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,166,111,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,220,111,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,21 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %3 ‚𖼑O•ύX‚·‚é‚ɂ́AV‚µ‚¢–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢BŽ©“®“I‚Ƀ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv‚Æ‚»‚Ì‚·‚ׂẴŒƒvƒŠƒJ‚Ì–¼‘O‚ª•ύX‚³‚ê‚Ü‚·B\n\n’ˆÓ: ƒ}ƒEƒ“ƒg‚³‚ꂽƒ{ƒŠƒ…[ƒ€‚𖼑O•ύX‚·‚éê‡‚́A‚»‚̃}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚̍폜‚ƍč쐬‚ª•K—v‚ɂȂè‚Ü‚·B", - IDC_RENSET_DESC,29,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 307, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒT[ƒrƒX‚̍폜" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ŽæÁ‚µ",IDCANCEL,195,47,50,14 - PUSHBUTTON "—¹‰ð",IDOK,141,47,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,249,47,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "’ˆÓ!\n\n‚±‚Ì‘€ì‚É‚æ‚èAƒT[ƒrƒX %2 ‚Í’âŽ~‚³‚êAƒT[ƒo[ %1 ‚©‚çíœ‚³‚ê‚Ü‚·B", - IDC_DELSVC_DESC,31,7,266,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒtƒ@ƒCƒ‹“ú•t‚̎擾" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[(&S):",-1,4,56,49,8 - COMBOBOX IDC_SERVER,62,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Æ‰ï‚·‚éƒtƒ@ƒCƒ‹(&F):",-1,4,73,81,8 - EDITTEXT IDC_FILENAME,62,85,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,84,104,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,138,104,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,192,104,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "ƒT[ƒo[‚̃tƒ@ƒCƒ‹‚Ì“ú•t‚ðŽæ“¾",-1,32,10,212,10 - LTEXT "‚±‚Ì‘€ì‚́Aƒtƒ@ƒCƒ‹‚Æ‚»‚̃oƒbƒNƒAƒbƒv (‘¶Ý‚·‚éê‡) ‚ªÅŒã‚ɕύX‚³‚ꂽ“ú•t‚ðŽæ“¾‚µ‚Ü‚·B", - -1,6,29,234,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒtƒ@ƒCƒ‹“ú•t‚̎擾 - Œ‹‰Ê" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[:",IDC_STATIC,6,30,39,8 - LTEXT "(ŽÀsŽž‚ɐݒè)",IDC_SERVER,58,30,179,8 - LTEXT "ƒtƒ@ƒCƒ‹–¼:",IDC_STATIC,6,45,42,8 - LTEXT "(ŽÀsŽž‚ɐݒè)",IDC_FILENAME,58,45,179,8 - LTEXT "ƒtƒ@ƒCƒ‹“ú•t:",IDC_STATIC,6,60,44,8 - LTEXT "(•s–¾Aƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ)",IDC_DATE_FILE,58,60, - 179,8 - LTEXT ".BAK “ú•t:",IDC_STATIC,6,75,37,8 - LTEXT "(•s–¾Aƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ)",IDC_DATE_BAK,58,75, - 179,8 - LTEXT ".OLD “ú•t:",IDC_STATIC,6,90,37,8 - LTEXT "(•s–¾Aƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ)",IDC_DATE_OLD,58,90, - 179,8 - DEFPUSHBUTTON "ƒNƒ[ƒY(&C)",IDOK,99,112,53,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "ƒT[ƒo[‚̃tƒ@ƒCƒ‹‚Ì“ú•t‚ðŽæ“¾",IDC_STATIC,32,12,212,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 307, 145 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃_ƒ“ƒv - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ì¬‚·‚éƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹(&N):",IDC_STATIC,4,36,114,8 - EDITTEXT IDC_DUMP_FILENAME,82,46,151,14,ES_AUTOHSCROLL - PUSHBUTTON "ŽQÆ(&B)...",IDC_DUMP_BROWSE,239,46,49,14 - CONTROL "ƒ{ƒŠƒ…[ƒ€ %3 (ƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2) ‚Ì“à—e‘S‘Ì‚ðƒ_ƒ“ƒv(&E)", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,8, - 75,289,13 - CONTROL "‚±‚Ì“úŽžˆÈ~‚ɕύX‚³‚ꂽƒtƒ@ƒCƒ‹‚̂݃_ƒ“ƒv(&S)", - IDC_DUMP_LIMIT_TIME,"Button",BS_AUTORADIOBUTTON,8,96,157, - 10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,171,103, - 51,13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,231,103, - 56,13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "—¹‰ð",IDOK,141,126,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,193,126,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,249,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "‚±‚Ì‘€ì‚̓{ƒŠƒ…[ƒ€‚Ì“à—e‚ð 1 ‚‚̃tƒ@ƒCƒ‹‚ɃRƒs[‚·‚邽‚߁Aƒ{ƒŠƒ…[ƒ€‚ðŠÈ’P‚ɃoƒbƒNƒAƒbƒv‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚±‚Ì•û–@‚Ń_ƒ“ƒv‚³‚ꂽƒ{ƒŠƒ…[ƒ€‚Ì“à—e‚́AŒã‚Å•œŒ³‚ª‰Â”\‚Å‚·B", - IDC_STATIC,30,7,255,24 - GROUPBOX "ƒ_ƒ“ƒvEƒpƒ‰ƒ[ƒ^[",IDC_STATIC,4,62,299,58 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚Ì•œŒ³ - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "•œŒ³‚·‚éƒtƒ@ƒCƒ‹(&R):",IDC_STATIC,4,32,62,8 - EDITTEXT IDC_RESTORE_FILENAME,75,29,154,14,ES_AUTOHSCROLL - PUSHBUTTON "ŽQÆ(&B)...",IDC_RESTORE_BROWSE,236,29,50,14 - CONTROL "‚±‚ê‚Í‘•ªƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹‚Å‚·(&I)", - IDC_RESTORE_INCREMENTAL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,75,50,142,10 - LTEXT "ƒ{ƒŠƒ…[ƒ€(&V):",IDC_STATIC,11,103,48,8 - EDITTEXT IDC_RESTORE_SETNAME,75,101,115,14,ES_AUTOHSCROLL - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,11,146,44,8 - COMBOBOX IDC_RESTORE_SERVER,75,145,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“(&P):",IDC_STATIC,11,161,55,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,50,176,231, - 42,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "—¹‰ð",IDOK,125,229,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,180,229,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,235,229,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "ƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹‚©‚çƒ{ƒŠƒ…[ƒ€‚𕜌³",IDC_STATIC,33,8, - 255,9 - GROUPBOX "ƒ^[ƒQƒbƒgEƒ{ƒŠƒ…[ƒ€",IDC_STATIC,4,63,284,160 - LTEXT "ƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹‚©‚çƒ{ƒŠƒ…[ƒ€‚𕜌³‚·‚邯‚«‚́AV‚µ‚¢ƒ{ƒŠƒ…[ƒ€‚ðì¬‚·‚é‚©AŠù‘¶‚̓ǂݎæ‚è/‘‚«ž‚݃{ƒŠƒ…[ƒ€‚ɏ㏑‚«‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,8,76,276,18 - LTEXT "(ŽÀsŽž‚ɐݒè)\n(ŽÀsŽž‚ɐݒè)",IDC_RESTORE_CREATE,31, - 120,253,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 265, 207 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚±‚̃T[ƒo[‚Ì‘SƒT[ƒrƒX‚ð’èŠú“I‚É’âŽ~/ÄŽn“®(&P)", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 76,204,10 - LTEXT "ÄŽn“®(&R)",IDC_BOS_GENRES_DESC1,21,92,37,8 - COMBOBOX IDC_BOS_GENRES_DATE,65,89,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,157, - 89,53,13,WS_EX_CLIENTEDGE - CONTROL "‚±‚̃T[ƒo[‚Ì‘SƒT[ƒrƒX‚̐V‹KƒoƒCƒiƒŠ[‚ð’èŠú“I‚ɃeƒXƒg(&B)", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 157,246,10 - LTEXT "ƒeƒXƒg(&S)",IDC_BOS_BINRES_DESC1,21,173,36,8 - COMBOBOX IDC_BOS_BINRES_DATE,65,170,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,157, - 170,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "ƒT[ƒrƒX %2 (ƒT[ƒo[ %1)",IDC_SVC_NAME,33,8,224,16 - GROUPBOX "BOS ƒT[ƒrƒX",IDC_STATIC,5,33,254,169 - LTEXT "BOS ƒT[ƒrƒX‚ðŽg—p‚µ‚āA‚±‚̃T[ƒo[‚Ì‚·‚ׂẴT[ƒrƒX (BOS ƒT[ƒrƒXŽ©‘Ì‚ðŠÜ‚Þ) ‚ð’âŽ~‚¨‚æ‚эĎn“®‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,9,47,248,22 - LTEXT "‚Ü‚½ABOS ƒT[ƒrƒX‚ðŽg—p‚µ‚āAƒT[ƒo[‚Ì‚·‚ׂẴT[ƒrƒX‚ð’èŠú“I‚ɃeƒXƒg‚µAƒoƒCƒiƒŠ[Eƒtƒ@ƒCƒ‹‚ªXV‚³‚ꂽƒT[ƒrƒX‚݂̂ð’âŽ~‚¨‚æ‚эĎn“®‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,11,113,240,35 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 307, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃_ƒ“ƒv’† - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,4,0,296,30 - LTEXT "ƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹ %4 ‚ðƒ{ƒŠƒ…[ƒ€ %3 ‚©‚çì¬’†...", - IDC_DUMPSET_DESC,4,36,294,24 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 307, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚Ì•œŒ³’† - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,4,0,295,29 - LTEXT "ƒ{ƒŠƒ…[ƒ€ %1 ‚ðƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹ %2 ‚©‚畜Œ³’†...", - IDC_RESTORESET_DESC,4,34,294,30 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 258, 163 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚±‚̃Zƒ‹‚Ì‘Sƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ðì¬(&A)", - IDC_CLONE_ALL,"Button",BS_AUTORADIOBUTTON,6,53,242,10 - GROUPBOX " ",IDC_STATIC,4,68,249,67 - CONTROL "ˆÈ‰º‚̊‚Ɉê’v‚·‚éƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒv‚̂ݍ쐬(&O)", - IDC_CLONE_SOME,"Button",BS_AUTORADIOBUTTON,6,67,234,11 - CONTROL "ŽŸ‚̃T[ƒo[‚̃{ƒŠƒ…[ƒ€‚Ì‚Ý(&S):",IDC_CLONE_SVR_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,83,140,10 - COMBOBOX IDC_CLONE_SVR,164,82,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "ŽŸ‚̃p[ƒeƒBƒVƒ‡ƒ“‚̃{ƒŠƒ…[ƒ€‚Ì‚Ý(&P):", - IDC_CLONE_AGG_LIMIT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,6,99,140,10 - COMBOBOX IDC_CLONE_AGG,164,98,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "–¼‘O‚ªŽŸ‚ÅŽn‚Ü‚éƒ{ƒŠƒ…[ƒ€‚Ì‚Ý(&B):", - IDC_CLONE_PREFIX_LIMIT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,6,116,140,10 - EDITTEXT IDC_CLONE_PREFIX,164,115,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,92,142,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,146,142,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,201,142,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "ƒ{ƒŠƒ…[ƒ€EƒoƒbƒNƒAƒbƒv‚́A‚»‚̃{ƒŠƒ…[ƒ€‚̓ǂݎæ‚èê—pƒRƒs[‚̂悤‚È“­‚«‚ð‚µ‚Ü‚·B“ǂݎæ‚è/‘‚«ž‚݃{ƒŠƒ…[ƒ€‚̓oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ð 1 ‚‚¾‚¯Ž‚‚±‚Æ‚ª‚Å‚«‚Ü‚·B\n\n•¡”‚̃{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚𓯎ž‚ɍ쐬‚Å‚«‚Ü‚·B", - IDC_STATIC,30,7,214,40 -END - -IDD_SUBSETS DIALOGEX 0, 0, 281, 182 -STYLE WS_POPUP | WS_CAPTION -CAPTION "ƒ‚ƒjƒ^[‚³‚ê‚éƒT[ƒo[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒTƒuƒZƒbƒg–¼:",IDC_STATIC,13,73,50,8 - EDITTEXT IDC_SUBSET_NAME,54,84,111,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "ƒI[ƒvƒ“(&O)...",IDC_SUBSET_LOAD,171,84,58,14 - PUSHBUTTON "•ÛŠÇ(&S)...",IDC_SUBSET_SAVE,230,84,42,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,7,111,182,58,WS_EX_CLIENTEDGE - PUSHBUTTON "‚·‚ׂă‚ƒjƒ^[(&A)",IDC_SUBSET_ALL,196,122,77,14 - PUSHBUTTON "ƒ‚ƒjƒ^[‚µ‚È‚¢(&N)",IDC_SUBSET_NONE,196,140,77,14 - LTEXT "‘å‚«‚ȃZƒ‹‚ł̃pƒtƒH[ƒ}ƒ“ƒX‚ð‰ü‘P‚·‚é‚ɂ́A–â‘è‚ɂ‚¢‚Ä“Á’è‚̃T[ƒo[‚ðƒ‚ƒjƒ^[‚µ‚È‚¢‚±‚Æ‚ð‘I‘ð‚µ‚Ü‚·BAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚́Aƒ‚ƒjƒ^[‚³‚ê‚È‚¢ƒT[ƒo[‚̃{ƒŠƒ…[ƒ€Aƒp[ƒeƒBƒVƒ‡ƒ“A‚Ü‚½‚̓T[ƒrƒX‚Í•\ަ‚µ‚Ü‚¹‚ñB", - IDC_STATIC,5,2,271,27 - LTEXT "ƒT[ƒo[‚̃‚ƒjƒ^[ (‚Ü‚½‚̓‚ƒjƒ^[‚µ‚È‚¢) ‚Í‚¢‚‚łà‘I‘ð‚Å‚«‚Ü‚·BƒT[ƒo[EƒTƒuƒZƒbƒg‚ðì¬‚µ‚āAƒ‚ƒjƒ^[‚·‚éƒT[ƒo[‚ÌƒŠƒXƒg‚ðŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,36,271,20 - GROUPBOX "Œ»sƒTƒuƒZƒbƒg",IDC_STATIC,5,63,271,114 - LTEXT "ƒ‚ƒjƒ^[‚·‚éƒT[ƒo[:",IDC_STATIC,12,100,82,8 -END - -IDD_SUBSET_LOADSAVE DIALOGEX 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(ƒ^ƒCƒgƒ‹‚ÍŽÀsŽž‚ɐݒè)" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "ƒTƒuƒZƒbƒg–¼(&N):",1090,5,108,66,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,54,120,159,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "ƒI[ƒvƒ“(&O)",IDOK,221,108,53,14 - PUSHBUTTON "ŽæÁ‚µ(&L)",IDCANCEL,221,125,53,14 - CONTROL "List1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "‚±‚̃Zƒ‹‚É‚·‚łɒè‹`‚³‚ê‚Ä‚¢‚éƒTƒuƒZƒbƒg:",IDC_STATIC,4, - 6,162,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ƒRƒ}ƒ“ƒhŒŸõ" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,36,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "ƒwƒ‹ƒv‚Ì•\ަ(&H)",IDOK,144,36,69,14 - PUSHBUTTON "ŽæÁ‚µ(&C)",IDCANCEL,144,53,69,14 - LTEXT "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ðŽg—p‚µ‚ă^ƒXƒN‚ðŽÀs‚·‚é•û–@‚ðŒ©‚é‚ɂ́A‰º‚̃Rƒ}ƒ“ƒhs‚ð‘I‘ð‚µ‚Äuƒwƒ‹ƒv‚Ì•\ަvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ƒGƒ‰[EƒR[ƒh‚ÌŒŸõ" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒGƒ‰[”ԍ†(&E):",IDC_STATIC,4,41,50,8 - EDITTEXT IDC_ERROR_NUMBER,63,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "•ÏŠ·(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "ƒNƒ[ƒY(&C)",IDCANCEL,85,121,53,14 - LTEXT "(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)",IDC_ERROR_DESC,4,65,210,48 - LTEXT "ƒGƒ‰[EƒR[ƒh‚̈Ӗ¡‚𒲂ׂé‚ɂ́AƒR[ƒh‚ð‰º‚É“ü—Í‚µ‚āu•ÏŠ·vƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ɂ‚¢‚Ä" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[ ƒo[ƒWƒ‡ƒ“ 3.5",IDC_STATIC, - 33,8,163,8 - LTEXT "Copyright (C) IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "ƒNƒ[ƒY(&C)",IDOK,89,121,53,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ª %1 ƒZƒ‹“à‚̃T[ƒo[‚ðŒŸõ’†...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 309, 136 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "ƒT[ƒo[‚ÌŠ®‘SCüƒhƒƒCƒ“–¼ (—á: ""machine.company.com"") ‚ð•\ަ", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,5,238,10 - CONTROL "ŠÇ—ƒg[ƒNƒ“‚È‚µ‚Å‹@”\‚·‚éê‡‚ÉŒx‚ð•\ަ(&W)", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,19,238,10 - CONTROL "...í‚ɃT[ƒo[EƒvƒƒpƒeƒB[‚ð•\ަ", - IDC_OPT_SVR_DBL_PROP,"Button",BS_AUTORADIOBUTTON,11,50, - 238,10 - CONTROL "...ƒNƒBƒbƒNEƒrƒ…[EƒyƒCƒ“‚̃I[ƒvƒ“Žž‚̂݃T[ƒo[EƒvƒƒpƒeƒB[‚ð•\ަ", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON,11, - 63,238,10 - CONTROL "...í‚É‚»‚̃T[ƒo[‚̃EƒBƒ“ƒhƒE‚ðƒI[ƒvƒ“", - IDC_OPT_SVR_DBL_OPEN,"Button",BS_AUTORADIOBUTTON,11,75, - 238,10 - CONTROL "...ƒT[ƒo[EƒEƒBƒ“ƒhƒE‚̃I[ƒvƒ“‚ŁA‚»‚̃T[ƒo[‚ðƒ‚ƒjƒ^[", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,107,238,10 - CONTROL "...ƒT[ƒo[EƒEƒBƒ“ƒhƒE‚̃Nƒ[ƒY‚ŁA‚»‚̃T[ƒo[‚ðƒ‚ƒjƒ^[‰ðœ", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,121,238,10 - LTEXT "ƒT[ƒo[‚̃AƒCƒRƒ“‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚·‚邯...",IDC_STATIC, - 7,38,238,8 - LTEXT "ƒT[ƒo[EƒTƒuƒZƒbƒg‚ªŽg—p’†‚ŃNƒBƒbƒNEƒrƒ…[EƒyƒCƒ“‚̃Nƒ[ƒYŽž...", - IDC_STATIC,7,95,238,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,23,216, - 129,WS_EX_CLIENTEDGE - PUSHBUTTON "ƒT[ƒo[Œ®‚̒ljÁ(&A)",IDC_KEY_ADD,46,157,85,14 - PUSHBUTTON "ƒT[ƒo[Œ®‚̍폜(&R)",IDC_KEY_REMOVE,133,157,85,14 - LTEXT "ƒT[ƒo[‚ÌŒ®:",IDC_KEY_NAME,5,5,216,11 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒT[ƒo[Œ®‚̒ljÁ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒo[ƒWƒ‡ƒ“:",IDC_STATIC,9,37,38,8 - EDITTEXT IDC_KEY_VERSION,57,35,43,14,ES_AUTOHSCROLL - LTEXT "’l:",IDC_STATIC,9,55,21,8 - CONTROL "‚±‚̃XƒgƒŠƒ“ƒO‚ðˆÃ†‰»:",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,43,54,101,10 - CONTROL "‚±‚ÌŒ®‚ðŽg—p:",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,43,86,61,10 - EDITTEXT IDC_KEY_STRING,112,65,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,112,83,103,14,ES_AUTOHSCROLL - PUSHBUTTON "ƒ‰ƒ“ƒ_ƒ€(&R)",IDC_KEY_RANDOM,220,83,53,14 - LTEXT "’ˆÓ: V‚µ‚¢Œ®‚ðƒT[ƒo[‚ɒljÁ‚µ‚½ŒãAV‚µ‚¢Œ®‚ðŽg—p‚·‚邿‚¤‚É AFS ƒAƒJƒEƒ“ƒg‚ð•ύX‚µ‚Ä‚­‚¾‚³‚¢B”“úŒãAŒÃ‚¢ƒT[ƒo[Œ®‚Í‚·‚ׂč폜‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,9,101,260,21 - DEFPUSHBUTTON "—¹‰ð",IDOK,113,127,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,167,127,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,221,127,50,14 - LTEXT "ƒT[ƒo[ %1 ‚̐V‹KŒ®",IDC_KEY_TITLE,39,11,229,18 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 307, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒT[ƒrƒX‚ÌŠJŽn/’âŽ~" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,112,116,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,166,116,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,220,116,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,20,20 - LTEXT "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ðŠJŽn/’âŽ~‚·‚é‚ɂ́u—¹‰ðv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STARTSTOP_TEXT,31,8,272,17 - CONTROL "‰i‘±(&P) (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,8,79, - 294,10 - CONTROL "ˆêŽž(&T) (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,8,96, - 294,10 - GROUPBOX "ƒT[ƒrƒXŽn“®",IDC_STATIC,4,35,302,76 - LTEXT "‚±‚̕ύX‚͉i‘±“I‚È‚à‚̂ɂ·‚邱‚Æ‚ª‚Å‚«AƒT[ƒo[ %1 ‚ªÄŽn“®‚³‚ê‚邯ީ“®“I‚ɃT[ƒrƒX %2 ‚ªŠJŽn‚³‚ê‚Ü‚· (‚³‚ê‚Ü‚¹‚ñ)B", - IDC_STARTSTOP_STARTUP,8,48,294,23 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒRƒ}ƒ“ƒh‚ÌŽÀs" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,7,56,44,8 - COMBOBOX IDC_SERVER,58,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒRƒ}ƒ“ƒh(&C):",IDC_STATIC,7,75,44,8 - EDITTEXT IDC_COMMAND,58,73,183,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,84,105,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,138,105,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,192,105,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "ƒT[ƒo[‚̃Rƒ}ƒ“ƒh‚ðŽÀs",IDC_STATIC,36,12,204,8 - LTEXT "‚±‚Ì‘€ì‚́AƒŠƒ‚[ƒgEƒT[ƒo[‚ł̃Rƒ}ƒ“ƒh‚Ì”­s‚ð‰Â”\‚É‚µ‚Ü‚·B\nˆê”Ê‚É /etc/reboot ƒXƒNƒŠƒvƒg‚ÌŽÀs‚É‚æ‚éƒT[ƒo[‚̍Ďn“®‚ÉŽg—p‚³‚ê‚Ü‚·B", - IDC_STATIC,7,29,231,16 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 248, 254 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃Tƒ‹ƒx[ƒW - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,9,43,44,8 - COMBOBOX IDC_SERVER,78,41,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ƒp[ƒeƒBƒVƒ‡ƒ“(&P):",IDC_STATIC,9,55,59,8 - COMBOBOX IDC_AGGREGATE,78,54,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "‚·‚ׂẴp[ƒeƒBƒVƒ‡ƒ“‚ðƒTƒ‹ƒx[ƒW(&A)", - IDC_AGGREGATE_ALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 81,70,145,10 - LTEXT "ƒ{ƒŠƒ…[ƒ€(&O):",IDC_STATIC,9,83,49,8 - COMBOBOX IDC_FILESET,78,81,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW(&L)",IDC_FILESET_ALL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,81,96,145,10 - DEFPUSHBUTTON "—¹‰ð",IDOK,85,108,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,139,108,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,193,108,50,14 - PUSHBUTTON "Šg’£(&V) >>",IDC_ADVANCED,6,108,53,14 - LTEXT "ˆêŽžƒtƒ@ƒCƒ‹‚̃pƒX(&T):",IDC_STATIC,5,141,77,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,97,140,144,13,ES_AUTOHSCROLL - CONTROL "•ÀsƒTƒ‹ƒx[ƒW‘€ìAƒvƒƒZƒX”(&R):",IDC_SALVAGE_SIMUL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,157,148,10 - EDITTEXT IDC_SALVAGE_NUM,202,156,25,13,ES_AUTOHSCROLL - CONTROL "‘¹ƒ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚µ‚È‚¢(&N)", - IDC_SALVAGE_READONLY,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,29,167,154,10 - CONTROL "“ǂݎæ‚è‘€ì‚ð¬‚³‚ȃuƒƒbƒN‚É•ªŠ„(&B)", - IDC_SALVAGE_BLOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,177,162,10 - CONTROL "ަ‚³‚ꂽ‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ð‹­§ƒTƒ‹ƒx[ƒW(&F)", - IDC_SALVAGE_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 29,187,193,10 - CONTROL "ƒfƒBƒŒƒNƒgƒŠ[\‘¢‚ð‹­§Äì¬(&E)",IDC_SALVAGE_FIXDIRS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,197,146,10 - LTEXT "Œ‹‰ÊƒƒO‚̃tƒ@ƒCƒ‹–¼(&M):",IDC_STATIC,8,211,79,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,98,210,140,13,ES_AUTOHSCROLL - CONTROL "‘¹ inode ‚ÌƒŠƒXƒg‚ðŒ‹‰ÊƒƒO‚É“ü‚ê‚é(&I)", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,225,165,10 - CONTROL "AFS Š—L‚̃‹[ƒginode‚ÌƒŠƒXƒg‚ðŒ‹‰ÊƒƒO‚É“ü‚ê‚é(&W)", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,236,206,10 - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "‚±‚Ì‘€ì‚́A•¡”‚̃{ƒŠƒ…[ƒ€‚ł̖â‘è‚̏C³‚ð‰Â”\‚É‚µ‚Ü‚·B\n\n’ˆÓ: ƒp[ƒeƒBƒVƒ‡ƒ“‘S‘Ì‚©ƒT[ƒo[‘S‘Ì‚ðˆê“x‚ɃTƒ‹ƒx[ƒW‚·‚éê‡AƒT[ƒo[‚͈ꎞ“I‚ɃIƒtƒ‰ƒCƒ“‚ɂȂè‚Ü‚·B", - IDC_STATIC,27,5,210,33 - GROUPBOX "Šg’£ƒTƒ‹ƒx[ƒWEƒIƒvƒVƒ‡ƒ“",IDC_ADVANCED_GROUP,4,128, - 240,122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̃Tƒ‹ƒx[ƒW - Œ‹‰Ê" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ƒNƒ[ƒY(&C)",IDOK,222,158,53,14 - LTEXT "ƒTƒ‹ƒx[ƒW‘€ì‚ÌŒ‹‰Ê:",IDC_STATIC,7,41,271,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,55,277,99,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€ %3 ‚ðƒTƒ‹ƒx[ƒW", - IDC_SALVAGE_TITLE,30,10,249,24 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€‚̉ð•ú" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,112,82,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,166,82,50,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,220,82,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "‚±‚Ì‘€ì‚́A%3 ƒ{ƒŠƒ…[ƒ€‚̃ŒƒvƒŠƒJ‚ðXV‚µ‚Ü‚·BŒÃ‚­‚È‚Á‚½ƒŒƒvƒŠƒJ‚݂̂ðXV‚·‚é‚©A‚·‚ׂẴŒƒvƒŠƒJ‚ðXV‚·‚é‚©‚ð‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_RELSET_DESC,30,7,242,29 - CONTROL "ŒÃ‚¢ƒ{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ‚̂ݍXV(&U)",IDC_RELSET_NORMAL, - "Button",BS_AUTORADIOBUTTON,31,46,239,10 - CONTROL "‚·‚ׂẴ{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ‚ðXV(&A)", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,31,63,239, - 10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "ƒzƒXƒgEƒT[ƒo[‚̒ljÁ(&A)",IDC_HOST_ADD,10,157,100,14 - PUSHBUTTON "ƒzƒXƒgEƒT[ƒo[‚̍폜(&R)",IDC_HOST_REMOVE,115,157,100, - 14 - LTEXT "ƒT[ƒo[‚ª”Fޝ‚·‚éƒf[ƒ^ƒx[ƒXEƒzƒXƒgEƒT[ƒo[:", - IDC_HOST_TITLE,5,7,216,13 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,26,216, - 126,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 307, 107 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "ƒzƒXƒgEƒT[ƒo[‚̒ljÁ" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒzƒXƒg(&H):",-1,31,61,42,8 - EDITTEXT IDC_ADDHOST_HOST,81,59,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,60,85,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,114,85,50,14 - ICON IDI_SERVER,-1,4,4,20,20 - LTEXT "ƒf[ƒ^ƒx[ƒXEƒzƒXƒgEƒT[ƒo[‚ðƒT[ƒo[ %1 ‚ɕۊǂ³‚ꂽƒŠƒXƒg‚ɒljÁ‚·‚邱‚Æ‚ð‘I‘ð‚µ‚Ü‚µ‚½B\n\nV‚µ‚¢ƒf[ƒ^ƒx[ƒXEƒzƒXƒg‚Ì–¼‘O‚ð‰º‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_ADDHOST_DESC,31,5,268,42 - PUSHBUTTON "ƒwƒ‹ƒv",9,168,85,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 211, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "ƒT[ƒo[EƒAƒhƒŒƒX‚̕ύX" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒT[ƒo[ %1 ‚Ì VLDB ‚É‹L˜^‚³‚ꂽ IP ƒAƒhƒŒƒX:", - IDC_TITLE,4,2,200,16 - LISTBOX IDC_SVR_ADDRESSES,4,23,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "•ύX(&C)...",IDC_ADDR_CHANGE,152,33,50,14 - PUSHBUTTON "íœ(&R)",IDC_ADDR_REMOVE,152,49,50,14 - DEFPUSHBUTTON "—¹‰ð",IDOK,43,95,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,97,95,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,151,95,50,14 - LTEXT "’: ƒtƒ@ƒCƒ‹EƒT[ƒo[‚ÍŽn“®Žž‚ɁAŽ©“®“I‚É‚»‚ÌŒ»s IP ƒAƒhƒŒƒX‚ð VLDB ‚É“o˜^‚µ‚Ü‚·B", - IDC_STATIC,4,71,200,18 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 233, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "IP ƒAƒhƒŒƒX‚̕ύX" -CLASS "AFSManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,66,48,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,120,48,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,174,48,50,14 - LTEXT "VLDB ‚Ì %1 ‚ð’u‚«Š·‚¦‚éV‹K IP ƒAƒhƒŒƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_TITLE,8,6,220,15 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,52,27, - 168,14 - LTEXT "ƒAƒhƒŒƒX:",IDC_STATIC,9,30,34,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AVI -// - -AVI_SETMOVE AVI DISCARDABLE "Resource\\setmove.avi" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "ƒT[ƒo[ %1 - ŠÇ—ƒŠƒXƒg" - IDS_TAB_SERVICES "ƒT[ƒrƒX" - IDS_TAB_AGGREGATES "ƒp[ƒeƒBƒVƒ‡ƒ“" - IDS_TAB_FILESETS "ƒ{ƒŠƒ…[ƒ€" - IDS_SERVICE_NONESELECTED "•\ަ‚·‚éƒT[ƒo[‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SERVICE_GOTSELECTED "ƒT[ƒo[ %1 ‚̃T[ƒrƒXEƒvƒƒZƒX:" - IDS_AGGREGATE_ALL "‚·‚ׂẴT[ƒo[‚̃p[ƒeƒBƒVƒ‡ƒ“:" - IDS_AGGREGATE_ONE "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“:" - IDS_FILESET_ALL "ƒZƒ‹ %1 ‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€:" - IDS_FILESET_ONE "ƒT[ƒo[ %1 ‚̃{ƒŠƒ…[ƒ€:" - IDS_SVR_LISTS_TAB "ŠÇ—ƒŠƒXƒg" - IDS_SVR_PROP_TITLE "ƒT[ƒo[ %1 - ƒvƒƒpƒeƒB[" - IDS_SVR_GENERAL_TAB "ˆê”Ê" - IDS_SVR_SCOUT_TAB "Ý’è" - IDS_SERVER_TITLE "ƒT[ƒo[ %1 - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "ƒZƒ‹ %2 ‚̃T[ƒo[ %1:" - IDS_SVC_PROP_TITLE "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 - ƒvƒƒpƒeƒB[" - IDS_SVC_GENERAL_TAB "ˆê”Ê" - IDS_SVC_ADD_TITLE "ƒT[ƒrƒX‚̍쐬" - IDS_SVC_ADD_TAB "ƒT[ƒrƒX‚̍쐬" - IDS_AGG_PROP_TITLE "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 - ƒvƒƒpƒeƒB[" - IDS_AGG_GENERAL_TAB "ˆê”Ê" - IDS_SET_REP_TITLE "ƒ{ƒŠƒ…[ƒ€ %1 - ƒŒƒvƒŠƒJ" - IDS_SET_REPSITES_TAB "•¡»ƒTƒCƒg" - IDS_SET_PROP_TITLE "ƒ{ƒŠƒ…[ƒ€ %1 - ƒvƒƒpƒeƒB[" - IDS_SET_GENERAL_TAB "ˆê”Ê" - IDS_SET_UNLOCKBTN "‘¦ŽžƒƒbƒN‰ðœ(&L)" - IDS_SET_LOCKBTN "‘¦ŽžƒƒbƒN(&L)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%2 Š„‚è“–‚Ä—Ê‚Ì %1 ‚ðŽg—p (%3%%)" - IDS_USAGE_AGGREGATE "%2 —e—Ê‚Ì %1 ‚ðŽg—p (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "Œ‹‡Š„‚è“–‚Ä—Ê" - IDS_SVRCOL_NAME "ƒT[ƒo[" - IDS_SVRCOL_STATUS "ó‹µ" - IDS_SETCOL_DATE_ACCESS "ÅIƒAƒNƒZƒX" - IDS_SETCOL_DATE_BACKUP "ÅIƒoƒbƒNƒAƒbƒv" - IDS_SVCCOL_NAME "ƒT[ƒrƒX" - IDS_SVCCOL_TYPE "ƒ^ƒCƒv" - IDS_SVCCOL_PARAMS "ƒpƒ‰ƒ[ƒ^[" - IDS_SVCCOL_STATUS "ó‹µ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "ÅIŠJŽn" - IDS_SVCCOL_DATE_STOP "ÅI’âŽ~" - IDS_SVCCOL_DATE_STARTSTOP "ÅIŠJŽn/’âŽ~" - IDS_SVCCOL_DATE_FAILED "ÅIáŠQ" - IDS_SVCCOL_LASTERROR "ÅII—¹ƒR[ƒh" - IDS_AGGCOL_NAME "ƒp[ƒeƒBƒVƒ‡ƒ“" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "‘•’u" - IDS_AGGCOL_USED "Žg—p—Ê" - IDS_AGGCOL_USED_PER "Žg—p—¦ (%)" - IDS_AGGCOL_FREE "‹ó‚«" - IDS_AGGCOL_TOTAL "—e—Ê" - IDS_AGGCOL_STATUS "ó‹µ" - IDS_SETCOL_NAME "ƒ{ƒŠƒ…[ƒ€" - IDS_SETCOL_TYPE "ƒ^ƒCƒv" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "ì¬" - IDS_SETCOL_DATE_UPDATE "ÅIXV" - IDS_SETCOL_STATUS "ó‹µ" - IDS_SETCOL_QUOTA_USED "Žg—p—Ê" - IDS_SETCOL_QUOTA_USED_PER "Žg—p—¦ (%)" - IDS_SETCOL_QUOTA_FREE "‹ó‚«" - IDS_SETCOL_QUOTA_TOTAL "Š„‚è“–‚Ä—Ê" - IDS_TRYAGAINBTN "ÄŽŽs(&A)" - IDS_NO_CELL_SELECTED "(ƒZƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñ)" - IDS_NO_AFS_ID "(Žg—p‰Â”\‚ȃg[ƒNƒ“‚ª‚ ‚è‚Ü‚¹‚ñ)" - IDS_AFS_ID_WILLEXP "%1 (ƒg[ƒNƒ“‚ÌŠúŒÀ‚ª %2 ‚ɐ؂ê‚Ü‚·)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS - "‚¨‘Ò‚¿‚­‚¾‚³‚¢BƒZƒ‹ %1 ‚ÉŠÖ‚·‚éî•ñ‚ðŽæ“¾’†‚Å‚·..." - IDS_STATUS_NOALERTS "•W€" - IDS_TITLE_BROWSE_USER "ƒ†[ƒU[‚Ì‘I‘ð" - IDS_AGGTYPE_OTHER "•s–¾ (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "ƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2 ‚Ƀ{ƒŠƒ…[ƒ€ %3 ‚ðì¬" - IDS_ACTION_DELETEFILESET "ƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2 ‚©‚çƒ{ƒŠƒ…[ƒ€ %3 ‚ðíœ" - IDS_ACTION_MOVEFILESET "ƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2 ‚Öƒ{ƒŠƒ…[ƒ€ %3 ‚ðˆÚ“®" - IDS_ACTION_SETFILESETQUOTA "ƒ{ƒŠƒ…[ƒ€ %3 ‚ÌŠ„‚è“–‚Ä—Ê‚ð•ύX" - IDS_SVCSTOP_DESC2 "‚±‚̃T[ƒrƒX‚ð’âŽ~‚·‚é‚ɂ́u—¹‰ðv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SVCSTART_DESC2 "‚±‚̃T[ƒrƒX‚ðŠJŽn‚·‚é‚ɂ́u—¹‰ðv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_SYNCVLDB_SVR_DESC "’ˆÓ!\n\n‘±s‚·‚邯AAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚̓T[ƒo[ %1 ‚Ì‚·‚ׂẴp[ƒeƒBƒVƒ‡ƒ“‚Ì“à—e‚Ɉê’v‚·‚邿‚¤‚É VLDB ‚ð•ύX‚µ‚Ü‚·B" - IDS_SYNCVLDB_SVR_DESC2 "VLDB ‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“‚ÉŒ»Ýƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢‚±‚Æ‚ð’Ê’m‚µ‚½ê‡A‚»‚̃{ƒŠƒ…[ƒ€‚Ì VLDB €–ڂ͍폜‚³‚ê‚Ü‚·!" - IDS_SYNCVLDB_AGG_DESC "’ˆÓ!\n\n‘±s‚·‚邯AAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚̓T[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ì“à—e‚Ɉê’v‚·‚邿‚¤‚É VLDB ‚ð•ύX‚µ‚Ü‚·B" - IDS_SYNCVLDB_AGG_DESC2 "VLDB ‚ª‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚ÉŒ»Ýƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢‚±‚Æ‚ð’Ê’m‚µ‚½ê‡A‚»‚̃{ƒŠƒ…[ƒ€‚Ì VLDB €–ڂ͍폜‚³‚ê‚Ü‚·!" - IDS_PROMPT_BROWSE_USER "ƒ†[ƒU[:" - IDS_PREVIEWIN_BUTTON "<< ƒvƒŠƒrƒ…[(&P)" - IDS_PREVIEWOUT_BUTTON "ƒvƒŠƒrƒ…[(&P) >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "ƒ†[ƒU[" - IDS_TITLE_BROWSE_PRINCIPAL "ƒvƒŠƒ“ƒVƒpƒ‹‚Ì‘I‘ð" - IDS_TITLE_BROWSE_OWNGROUP "Š—LƒOƒ‹[ƒv‚Ì‘I‘ð" - IDS_PROMPT_BROWSE_PRINCIPAL "ƒvƒŠƒ“ƒVƒpƒ‹:" - IDS_PROMPT_BROWSE_OWNGROUP "Š—LƒOƒ‹[ƒv:" - IDS_ACTION_CLONE "ƒ{ƒŠƒ…[ƒ€ %3 ‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ðì¬’†" - IDS_ACTION_CLONESYS "•¡”‚̃{ƒŠƒ…[ƒ€EƒoƒbƒNƒAƒbƒv‚ðì¬’†" - IDS_CLONESYS_FAILED "ƒGƒ‰[ 0x%2 ‚Ì‚½‚߁Aƒ{ƒŠƒ…[ƒ€ %1 ‚̃oƒbƒNƒAƒbƒv‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½ (%3)B" - IDS_SET_UNSPECIFIED "(–¢Žw’è)" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "ƒtƒ@ƒCƒ‹EƒJƒEƒ“ƒg" - IDS_SET_DUMP_NAME "%1.DMP ‚̃_ƒ“ƒv" - IDS_ACTION_DUMP "ƒ{ƒŠƒ…[ƒ€ %3 ‚̃_ƒ“ƒv’† (ƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "ƒp[ƒeƒBƒVƒ‡ƒ“" - IDS_REFRESH_DESC_CELL "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ª %1 ƒZƒ‹“à‚̃T[ƒo[‚̏󋵂𔻕ʒ†‚Å‚·B‚µ‚Î‚ç‚­ŽžŠÔ‚ª‚©‚©‚è‚Ü‚·..." - IDS_REFRESH_DESC_SERVER "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̏󋵂𔻕ʒ†‚Å‚·B‚µ‚Î‚ç‚­ŽžŠÔ‚ª‚©‚©‚è‚Ü‚·..." - IDS_REFRESH_CURRENT_CELL "Œ»ÝŒŸ¸’†: ƒZƒ‹ %1" - IDS_REFRESH_CURRENT_SERVER "Œ»ÝŒŸ¸’†: ƒT[ƒo[ %2" - IDS_REFRESH_CURRENT_AGGREGATE - "Œ»ÝŒŸ¸’†: ƒT[ƒo[ %2 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %3" - IDS_REFRESH_CURRENT_FILESET - "Œ»ÝŒŸ¸’†: ƒT[ƒo[ %2 ‚̃{ƒŠƒ…[ƒ€ %4Aƒp[ƒeƒBƒVƒ‡ƒ“ %3" - IDS_REFRESH_CURRENT_SERVICE "Œ»ÝŒŸ¸’†: ƒT[ƒo[ %2 ‚̃T[ƒrƒX %3" - IDS_REFRESH_PERCENT "%1%% Š®—¹" - IDS_PROBLEMS "–â‘è" - IDS_SERVER_NO_PROBLEMS "‚±‚̃T[ƒo[‚ɂ͊ù’m‚Ì–â‘è‚Í‚ ‚è‚Ü‚¹‚ñB" - IDS_SERVICE_NO_PROBLEMS "‚±‚̃T[ƒrƒX‚ɂ͊ù’m‚Ì–â‘è‚Í‚ ‚è‚Ü‚¹‚ñB" - IDS_AGGREGATE_NO_PROBLEMS "‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚ɂ͊ù’m‚Ì–â‘è‚Í‚ ‚è‚Ü‚¹‚ñB" - IDS_FILESET_NO_PROBLEMS "‚±‚̃{ƒŠƒ…[ƒ€‚ɂ͊ù’m‚Ì–â‘è‚Í‚ ‚è‚Ü‚¹‚ñB" - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB - "Œ»ÝŒŸ¸’†: ƒ{ƒŠƒ…[ƒ€EƒƒP[ƒVƒ‡ƒ“Eƒf[ƒ^ƒx[ƒX(VLDB)" - IDS_FILESETTYPE_RW "“ǂݎæ‚è/‘‚«ž‚Ý" - IDS_FILESETTYPE_RO "ƒŒƒvƒŠƒJ" - IDS_FILESETTYPE_CLONE "ƒoƒbƒNƒAƒbƒv" - IDS_MOVESET_READWRITE "‘±s‚·‚邯Aƒ{ƒŠƒ…[ƒ€ %3 ‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚©‚瑼‚̏ꏊ‚ÖˆÚ“®‚³‚ê‚Ü‚·B" - IDS_MOVESET_READONLY "‘±s‚·‚邯Aƒ{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ %3 ‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 A‚¨‚æ‚шȉº‚ÉŽw’肵‚½ƒp[ƒeƒBƒVƒ‡ƒ“ã‚ɍ쐬‚³‚ꂽ•ʂ̃{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ‚©‚çíœ‚³‚ê‚Ü‚·B" - IDS_SVC_START_TITLE "ƒT[ƒrƒX‚ÌŠJŽn" - IDS_SVC_STOP_TITLE "ƒT[ƒrƒX‚Ì’âŽ~" - IDS_SERVICESTATUS_STARTING "‚±‚̃T[ƒrƒX‚ÍŒ»ÝŠJŽn’†‚Å‚·B" - IDS_SERVICESTATUS_RUNNING "‚±‚̃T[ƒrƒX‚ÍŒ»ÝŽÀs’†‚Å‚·B" - IDS_SERVICESTATUS_STOPPED "‚±‚̃T[ƒrƒX‚ÍŒ»Ý’âŽ~‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_SERVICESTATUS_STOPPING "‚±‚̃T[ƒrƒX‚ÍŒ»Ý’âŽ~’†‚Å‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "‚±‚̃T[ƒrƒX‚̏󋵂͕s–¾‚Å‚·B" - IDS_SVC_RESTART_BUTTON "‘¦Žž’âŽ~‚¨‚æ‚эĎn“®(&R)" - IDS_PROBLEM_BOX "Šù’m‚Ì–â‘è (%1)" - IDS_VIEWLOG_DESC_NOFILE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚̃ƒOEƒtƒ@ƒCƒ‹‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½BƒT[ƒrƒX‚̃ƒOEƒtƒ@ƒCƒ‹‚Ì‘SƒpƒX‚ð‰º‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_NO_GROUP "(Š—LƒOƒ‹[ƒv‚È‚µ)" - IDS_VIEWLOG_FROMSERVER "ƒT[ƒo[ %1 ‚̃ƒOEƒtƒ@ƒCƒ‹" - IDS_VIEWLOG_FROMSERVICE "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ƒƒOEƒtƒ@ƒCƒ‹" - IDS_VIEWLOG_TRUNCATED "ƒtƒ@ƒCƒ‹‚Ì“à—e (ÅŒã‚Ì %1 s‚̂ݕ\ަ):" - IDS_SAVELOG_FILTER "ƒeƒLƒXƒgEƒtƒ@ƒCƒ‹|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< Šg’£(&A)" - IDS_ADVANCEDOUT_BUTTON "Šg’£(&A) >>" - IDS_REPTYPE_RELEASE "ƒŠƒŠ[ƒX•¡»" - IDS_REPTYPE_SCHEDULED "ƒXƒPƒWƒ…[ƒ‹•¡»" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "‚·‚ׂčXV(&U)" - IDS_UPDATETHIS_BUTTON "XV(&U)" - IDS_SERVER_MULTIPLE_PROBLEMS "‚±‚̃T[ƒo[‚É‚Í %1 ‚ÌŠù’m–â‘肪‚ ‚è‚Ü‚·B" - IDS_SERVICE_MULTIPLE_PROBLEMS "‚±‚̃T[ƒrƒX‚É‚Í %1 ‚ÌŠù’m–â‘肪‚ ‚è‚Ü‚·B" - IDS_AGGREGATE_MULTIPLE_PROBLEMS - "‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚É‚Í %1 ‚ÌŠù’m–â‘肪‚ ‚è‚Ü‚·B" - IDS_FILESET_MULTIPLE_PROBLEMS - "‚±‚̃{ƒŠƒ…[ƒ€‚É‚Í %1 ‚ÌŠù’m–â‘肪‚ ‚è‚Ü‚·B" - IDS_FILESETTYPE_RO_STAGE "ƒŒƒvƒŠƒJ" - IDS_SERVICETYPE_SIMPLE_LONG "ƒVƒ“ƒvƒ‹ (˜A‘±‚µ‚ÄŽÀs)" - IDS_SERVICETYPE_CRON_LONG "Cron (Žw’è‚ÌŠÔŠu‚ÅŽÀs)" - IDS_QUOTAUNITS_KB "kb" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "(‚±‚̃{ƒŠƒ…[ƒ€‚̓ŒƒvƒŠƒJ‚Ì‚½‚߁AŠ„‚è“–‚Ä—Ê‚ðŽ‚Á‚Ä‚¢‚Ü‚¹‚ñ)" - IDS_NO_QUOTA_CLONE "(‚±‚̃{ƒŠƒ…[ƒ€‚̓oƒbƒNƒAƒbƒv‚Ì‚½‚߁AŠ„‚è“–‚Ä—Ê‚ðŽ‚Á‚Ä‚¢‚Ü‚¹‚ñ)" - IDS_USAGE_REPLICA "%1 Žg—p" - IDS_USAGE_CLONE "%1 Žg—p" - IDS_COL_AGGS_MOVE "ƒ{ƒŠƒ…[ƒ€ì¬Žž‚̃p[ƒeƒBƒVƒ‡ƒ“" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“:" - IDS_AGGREGATES_IN_CELL "ƒZƒ‹ %1 ‚Ì‚·‚ׂẴp[ƒeƒBƒVƒ‡ƒ“:" - IDS_AGGREGATES_IN_NOTHING "ƒp[ƒeƒBƒVƒ‡ƒ“:" - IDS_FILESETS_IN_SERVER "ƒT[ƒo[ %1 ‚̃{ƒŠƒ…[ƒ€:" - IDS_FILESETS_IN_CELL "ƒZƒ‹ %1 ‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€:" - IDS_FILESETS_IN_NOTHING "ƒ{ƒŠƒ…[ƒ€:" - IDS_SERVICES_IN_SERVER "ƒT[ƒo[ %1 ‚̃T[ƒrƒX:" - IDS_SERVICES_IN_NOTHING "ƒT[ƒrƒX:" - IDS_UNKNOWN "(•s–¾)" - IDS_UNKNOWN_GROUP "ƒOƒ‹[ƒv #%1 (–¼‘O‚Í•s–¾)" - IDS_AGGFULL_WARN_OFF "ƒfƒtƒHƒ‹ƒg‚µ‚«‚¢’l (Œx‚̓T[ƒo[‚ÅŽg—p•s‰Â)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "ƒfƒtƒHƒ‹ƒg‚µ‚«‚¢’l (Œx‚̓T[ƒo[‚ÅŽg—p•s‰Â)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - I—¹ƒR[ƒh %2" - IDS_COL_SERVERS "ƒZƒ‹‚̃T[ƒo[" - IDS_COL_FILESETS "ƒT[ƒo[‚̃{ƒŠƒ…[ƒ€" - IDS_COL_AGGREGATES "ƒT[ƒo[‚̃p[ƒeƒBƒVƒ‡ƒ“" - IDS_COL_SERVICES "ƒT[ƒo[‚̃T[ƒrƒX" - IDS_COL_REPLICAS "ƒ{ƒŠƒ…[ƒ€‚̃ŒƒvƒŠƒJ" - IDS_COLUMNS_TITLE "•\ަ—ñ‚Ì‘I‘ð - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_REPCOL_SERVER "ƒT[ƒo[" - IDS_REPCOL_AGGREGATE "ƒp[ƒeƒBƒVƒ‡ƒ“" - IDS_REPCOL_DATE_UPDATE "ÅIXV" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "ƒ{ƒŠƒ…[ƒ€ˆÚ“®Žž‚̃p[ƒeƒBƒVƒ‡ƒ“" - IDS_WARN_TITLE "’ˆÓ" - IDS_WARN_DISABLE_AUTH "u–¢”FØ‚ð‹–‰Âvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚·‚邯A–¢”FØ‚̃vƒŠƒ“ƒVƒpƒ‹‚ª‚±‚̃T[ƒo[‚̃T[ƒrƒX‚𑀍삷‚邱‚Æ‚ª‰Â”\‚ɂȂè‚Ü‚·Bƒ‹[ƒg ID ‚̉º‚ł͐”‘½‚­‚̃T[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚邽‚߁A‚±‚̃AƒNƒVƒ‡ƒ“‚Í+" - IDS_WARN_DISABLE_AUTH2 "ƒT[ƒo[‚̃ZƒLƒ…ƒŠƒeƒB[‚ɏd‘å‚ÈŒ‡Š×‚ð‚à‚½‚炵‚Ü‚·B\n\n‚±‚̕ύX‚ðs‚Á‚Ä‚à‚¢‚¢‚Å‚·‚©?" - IDS_SVR_NO_ADDR "(–¢Žw’è)" - IDS_TITLE_BAD_CELL "”Fޝ‚³‚ê‚Ä‚¢‚È‚¢ƒZƒ‹–¼" - IDS_DESC_BAD_CELL "“ü—Í‚µ‚½ƒZƒ‹–¼‚ªƒlƒbƒgƒ[ƒNã‚ÉŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n“ü—Í‚ª³‚µ‚¢‚©‚Ç‚¤‚©‚ð‚à‚¤ˆê“xŠm”F‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_AGGFULL_WARN_ON "‚±‚̃T[ƒo[‚̃fƒtƒHƒ‹ƒg‚µ‚«‚¢’l(&D) (ƒTƒCƒY‚Ì %1%%)" - IDS_SETFULL_WARN_ON "‚±‚̃T[ƒo[‚̃fƒtƒHƒ‹ƒg‚µ‚«‚¢’l(&D) (ƒTƒCƒY‚Ì %1%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "“ü—Í‚µ‚½ AFS ID ‚ª”Fޝ‚³‚ê‚È‚¢‚©A‚Ü‚½‚ÍŽw’肵‚½ƒpƒXƒ[ƒh‚ª³‚µ‚­‚ ‚è‚Ü‚¹‚ñB" - IDS_SVR_CREDS_NONE "(ƒg[ƒNƒ“‚È‚µ)" - IDS_SVR_CREDS_VALID "%2, ŠúŒÀØ‚ê %3" - IDS_SVR_CREDS_EXPIRED "(ƒg[ƒNƒ“‚ªŠúŒÀØ‚ê %3)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 (Œ‹‡Š„‚è“–‚Ä—Ê: %2)" - IDS_ACTION_DESC_NONE "is’†‚Ì‘€ì‚Í‚ ‚è‚Ü‚¹‚ñB" - IDS_ACTION_DESC_ONE "ŽŸ‚Ì‘€ì‚ªŒ»Ýis’†‚Å‚·:" - IDS_ACTION_DESC_MULT "ŽŸ‚Ì‘€ì‚ªŒ»Ýis’†‚Å‚·:" - IDS_ACTCOL_OPERATION "‘€ì" - IDS_ACTCOL_ELAPSED "Œo‰ßŽžŠÔ" - IDS_ACTION_REFRESH "ƒZƒ‹î•ñ‚̍ŐV•\ަ’†" - IDS_ACTION_CREATESERVER "ƒT[ƒo[ %1 ‚̍쐬’†" - IDS_ACTION_DELETESERVER "ƒT[ƒo[ %1 ‚̍폜’†" - IDS_ACTION_GETSERVERLOGFILE "ƒƒOEƒtƒ@ƒCƒ‹ %2 ‚ðƒT[ƒo[ %1 ‚©‚çŽæ“¾’†" - IDS_ACTION_SETSERVERAUTH "ƒT[ƒo[ %1 ‚̃AƒNƒZƒX§ŒÀ‚ð•ύX’†" - IDS_ACTION_CHANGESERVERSTATUS "ƒT[ƒo[ %1 ‚̃vƒƒpƒeƒB[‚ð•ύX’†" - IDS_ACTION_STARTSERVICE "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ðŠJŽn’†" - IDS_ACTION_STOPSERVICE "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ð’âŽ~’†" - IDS_ACTION_RESTARTSERVICE "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ðÄŽn“®’†" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "VLDB ‚ðƒT[ƒo[ %1 ‚Æ“¯Šú‰»’†" - IDS_ACTION_SYNCVLDB_AGG "VLDB ‚ðƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2 ‚Æ“¯Šú‰»’†" - IDS_ACTION_SCOUT "ƒT[ƒo[ %1 ‚Ì–â‘è‚ðŒŸ¸’†" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "ƒ{ƒŠƒ…[ƒ€ %3 ‚Ì•¡»ƒvƒƒpƒeƒB[‚ð•ύX’†" - IDS_ACTION_CREATEREPLICA - "ƒp[ƒeƒBƒVƒ‡ƒ“ %1:%2 ‚Ƀ{ƒŠƒ…[ƒ€ %3 ‚̃ŒƒvƒŠƒJ‚ðì¬’†" - IDS_DELSET_REPLICA_DESC "’ˆÓ!\n\n‘±s‚·‚邯AƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€ %3 ‚̃ŒƒvƒŠƒJ‚ªíœ‚³‚ê‚Ü‚·B" - IDS_DELSET_CLONE_DESC "’ˆÓ!\n\n‘±s‚·‚邯Aƒ{ƒŠƒ…[ƒ€EƒoƒbƒNƒAƒbƒv %3 ‚ªƒT[ƒo[ %1‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚©‚çíœ‚³‚ê‚Ü‚·B" - IDS_INSTALL_DESC1 "‚±‚Ì‘€ì‚́Aƒtƒ@ƒCƒ‹‚ð‚±‚ÌƒRƒ“ƒsƒ…[ƒ^[‚©‚瑼‚ÖƒRƒs[‚µ‚Ü‚·B+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "ƒtƒ@ƒCƒ‹‚ª‚·‚łɃRƒs[æ‚̃Rƒ“ƒsƒ…[ƒ^[‚É‘¶Ý‚·‚éê‡‚́A‚»‚̃tƒ@ƒCƒ‹‚̓oƒbƒNƒAƒbƒv‚³‚êA.BAK Šg’£Žq‚ª•t‚¯‚ç‚ê‚Ü‚·BŠù‘¶‚̃oƒbƒNƒAƒbƒv‚É‚Í .OLD Šg’£Žq‚ª•t‚¯‚ç‚êAŠù‘¶‚Ì .OLD ƒtƒ@ƒCƒ‹‚͍폜‚³‚ê‚Ü‚·B" - IDS_ACTION_INSTALLFILE "ƒT[ƒo[ %1 ‚Ƀtƒ@ƒCƒ‹ %2 ‚ðƒCƒ“ƒXƒg[ƒ‹’†" - IDS_ACTION_UNINSTALLFILE - "ƒT[ƒo[ %1 ‚©‚çƒtƒ@ƒCƒ‹ %2 ‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹’†" - IDS_ACTION_PRUNEFILES "ƒT[ƒo[ %1 ‚©‚çƒtƒ@ƒCƒ‹‚ðíœ’†" - IDS_FILTER_ALLFILES "‚·‚ׂẴtƒ@ƒCƒ‹|*.*|" - IDS_ACTION_RENAMEFILESET "ƒ{ƒŠƒ…[ƒ€ %1 ‚ð %2 ‚É–¼‘O•ύX’†" - IDS_RECUR_DAILY "–ˆ“ú" - IDS_RECUR_SUNDAY "–ˆ“ú—j“ú" - IDS_RECUR_MONDAY "–ˆŒŽ—j“ú" - IDS_RECUR_TUESDAY "–ˆ‰Î—j“ú" - IDS_RECUR_WEDNESDAY "–ˆ…—j“ú" - IDS_RECUR_THURSDAY "–ˆ–Ø—j“ú" - IDS_RECUR_FRIDAY "–ˆ‹à—j“ú" - IDS_RECUR_SATURDAY "–ˆ“y—j“ú" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "ƒT[ƒo[ %1 ‚ɃT[ƒrƒX %2 ‚ðì¬’†" - IDS_ACTION_DELETESERVICE "ƒT[ƒo[ %1 ‚©‚çƒT[ƒrƒX %2 ‚ðíœ’†" - IDS_ACTION_RELEASEFILESET "ƒ{ƒŠƒ…[ƒ€ %3 ‚ð‰ð•ú’†" - IDS_ACTION_GETDATES "ƒT[ƒo[ %1 ‚̃tƒ@ƒCƒ‹ %2 ‚Ì“ú•t‚ðŽæ“¾’†" - IDS_LASTMODIFIED "ÅI•ύX %1" - IDS_SVR_SECURITY_TITLE "ƒT[ƒo[EƒZƒLƒ…ƒŠƒeƒB[ - %1" - IDS_SVR_LIST_TAB "ŠÇ—ŽÒ" - IDS_ACTION_ADMINLIST_LOAD "ƒT[ƒo[ %1 ‚ÌŠÇ—ŽÒ‚ðŽæ“¾’†" - IDS_ACTION_ADMINLIST_SAVE "ƒT[ƒo[ %1 ‚ÌŠÇ—ŽÒ‚ð‘‚«ž‚Ý’†" - IDS_ADMCOL_PRINCIPAL "ƒƒ“ƒo[" - IDS_ADMCOL_TYPE "ƒ^ƒCƒv" - IDS_ADMCOL_TYPE_GROUP "ƒOƒ‹[ƒv" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "ƒ{ƒŠƒ…[ƒ€ %1 ‚Ì•œŒ³’†" - IDS_COL_AGGS_RESTORE "ƒ{ƒŠƒ…[ƒ€•œŒ³Žž‚̃p[ƒeƒBƒVƒ‡ƒ“" - IDS_RESTORE_FILTER "ƒ{ƒŠƒ…[ƒ€Eƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹|*.DMP|‚·‚ׂẴtƒ@ƒCƒ‹|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "ƒT[ƒo[ %1 ‚̃T[ƒrƒXÄŽn“®Žž‚ð•ύX’†" - IDS_RESTORE_CREATESET "‰º‚ÅŽw’肵‚½ƒT[ƒo[‚¨‚æ‚уp[ƒeƒBƒVƒ‡ƒ“‚Ƀ{ƒŠƒ…[ƒ€ %1 ‚ªì¬‚³‚ê‚Ü‚·B" - IDS_RESTORE_OVERWRITESET - "’ˆÓ! ƒ{ƒŠƒ…[ƒ€ %3 ‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚É‘¶Ý‚µ‚Ü‚·B‘±s‚·‚邯ã‘‚«‚³‚ê‚Ü‚·!" - IDS_SUBSET_TITLE_LOAD "ƒT[ƒo[EƒTƒuƒZƒbƒg‚̃I[ƒvƒ“" - IDS_SUBSET_TITLE_SAVE "ƒT[ƒo[EƒTƒuƒZƒbƒg‚̕ۊÇ" - IDS_BUTTON_OPEN "ƒI[ƒvƒ“(&O)" - IDS_BUTTON_SAVE "•ÛŠÇ(&S)" - IDS_SUBSET_SAVE_TITLE "’ˆÓ" - IDS_SUBSET_SAVE_DESC "ƒT[ƒo[EƒTƒuƒZƒbƒg‚Í %1 ‚Ì–¼‘O‚Å‚·‚łɑ¶Ý‚µ‚Ü‚·B\n\n‚±‚̃TƒuƒZƒbƒg‚ðã‘‚«‚µ‚Ü‚·‚©?" - IDS_SUBSET_CHANGED "%1 [•ύXÏ‚Ý]" - IDS_SUBSET_TAB "ƒ‚ƒjƒ^[‚³‚ê‚éƒT[ƒo[" - IDS_SUBSET_DISCARD_TITLE "ƒTƒuƒZƒbƒg‚ð•ÛŠÇ‚µ‚Ü‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "Œ»Ýƒ‚ƒjƒ^[‚³‚ê‚Ä‚¢‚éƒT[ƒo[‚ÌƒŠƒXƒg‚ðƒTƒuƒZƒbƒg‚Æ‚µ‚ĕۊǂµ‚Ä‚¢‚Ü‚¹‚ñB‚±‚ÌƒŠƒXƒg‚ð•ÛŠÇ‚·‚邯AŒã‚Å‚±‚ê‚ðŽg—p‚µ‚ăT[ƒo[‚̂邱‚ê‚Æ“¯‚¶ƒZƒbƒg‚̃‚ƒjƒ^[‚𑱂¯‚邱‚Æ‚ª‚Å‚«‚Ü‚·B\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "Œ»Ýƒ‚ƒjƒ^[‚³‚ê‚Ä‚¢‚éƒT[ƒo[‚ÌƒŠƒXƒg‚ðŠÜ‚ÞƒTƒuƒZƒbƒg‚ðì¬‚µ‚Ü‚·‚©?" - IDS_SUBSET_NONAME "(–³‘è)" - IDS_SUBSET_NOSUBSET "(‚·‚ׂẴT[ƒo[‚ªƒ‚ƒjƒ^[‚³‚ê‚Ä‚¢‚Ü‚·)" - IDS_SUBSET_SERVERSUBSET "ƒT[ƒo[ %1" - IDS_FILESET_SOME "ƒZƒ‹ %1 ‚Ń‚ƒjƒ^[‚³‚ê‚Ä‚¢‚é‚·‚ׂẴT[ƒo[‚̃{ƒŠƒ…[ƒ€:" - IDS_AGGREGATE_SOME "ƒZƒ‹ %1 ‚Ń‚ƒjƒ^[‚³‚ê‚Ä‚¢‚é‚·‚ׂẴT[ƒo[‚̃p[ƒeƒBƒVƒ‡ƒ“:" - IDS_SERVICE_SOME "ƒZƒ‹ %1 ‚Ń‚ƒjƒ^[‚³‚ê‚Ä‚¢‚é‚·‚ׂẴT[ƒo[‚̃T[ƒrƒX:" - IDS_FILESET_UNMON "ƒT[ƒo[ %1 ‚̓‚ƒjƒ^[‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_AGGREGATE_UNMON "ƒT[ƒo[ %1 ‚̓‚ƒjƒ^[‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_SERVICE_UNMON "ƒT[ƒo[ %1 ‚̓‚ƒjƒ^[‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_SUBSET_DELETE_TITLE "ƒTƒuƒZƒbƒg‚ðíœ‚µ‚Ü‚·‚©?" - IDS_SUBSET_DELETE_DESC "ƒT[ƒo[EƒTƒuƒZƒbƒg %1 ‚ðíœ‚µ‚Ä‚à‚¢‚¢‚Å‚·‚©?" - IDS_ERROR_TRANSLATED "ƒGƒ‰[”ԍ† 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "ƒGƒ‰[”ԍ† 0x%1 (%2) ‚ª”Fޝ‚Å‚«‚Ü‚¹‚ñB" - IDS_FIND_NOTHING_TITLE "ƒRƒ}ƒ“ƒh‚ª‘I‘ð‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "‘€ì‚ÌŽÀs•û–@‚ɂ‚¢‚ẮAƒŠƒXƒg‚©‚çƒRƒ}ƒ“ƒhs‚ð‘I‘ð‚·‚é‚©AƒL[ƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_FIND_UNKNOWN_TITLE "•s–¾‚ȃRƒ}ƒ“ƒh" - IDS_FIND_UNKNOWN_DESC "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚Í ""%1"" ƒRƒ}ƒ“ƒh‚̃wƒ‹ƒvEƒgƒsƒbƒN‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_HELPABOUT_DESC1 "Œx: ‚±‚̃Rƒ“ƒsƒ…[ƒ^[EƒvƒƒOƒ‰ƒ€‚́A’˜ìŒ ‚¨‚æ‚э‘Û‹K–ñ‚É‚æ‚è•ی삳‚ê‚Ä‚¢‚Ü‚·B+" - IDS_HELPABOUT_DESC2 "‹–‰Â‚È‚­‚±‚̃\ƒtƒgƒEƒFƒA‚ð•¡ŽÊ‚ ‚é‚¢‚Í”z•z‚·‚邯A–¯Ž–‚Ü‚½‚ÍŒYŽ–ã‚̔ƍ߂ƂȂèA–@—¥‚Ì‚à‚Æ‘i‚³‚ê‚éê‡‚ª‚ ‚è‚Ü‚·B\n\n+" - IDS_HELPABOUT_DESC3 "AFS ‚Í Transarc Corporation (IBM company) ‚̏¤•W‚Å‚·B" - IDS_CANT_QUIT_TITLE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_CANT_QUIT_REBOOT "’ˆÓ!\n\nAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÍŒ»Ý‘€ì‚ðŽÀs’†‚Å‚·B‚¢‚Ü Windows ‚ðƒVƒƒƒbƒgƒ_ƒEƒ“‚·‚邯A‚±‚ê‚ç‚Ì‘€ì‚͐³í‚ÉŠ®—¹‚µ‚Ü‚¹‚ñB\n\nWindows ‚ðÄŽn“®‚µ‚Ü‚·‚©?" - IDS_APP_TITLE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_ACTION_OPENCELL "%1 ƒZƒ‹“à‚̃T[ƒo[‚ðŒŸõ’†" - IDS_OPTIONS_TITLE "ƒIƒvƒVƒ‡ƒ“ - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_OPTIONS_GENERAL_TAB "ˆê”Ê" - IDS_BADCREDS_DESC "ŠÇ—ŽÒ‚Æ‚µ‚ăƒOƒCƒ“‚µ‚È‚¢‚ƁA%1 ƒZƒ‹‚ÌŠÇ—‚ɏ\•ª‚ÈŒ ŒÀ‚ª—^‚¦‚ç‚ê‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·BƒAƒNƒZƒXŒ ŒÀ‚ª\•ª‚łȂ¢‚ƁA–â‘肪‘¶Ý‚µ‚È‚¢‚Æ‚«‚É AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒZƒ‹‚Å–â‘è‚ðŒ©‚Â‚¯‚éê‡‚ª‚ ‚è‚Ü‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "Šm”F - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_NO_GROUP_CHECKBOX "Š—LƒOƒ‹[ƒv‚È‚µ" - IDS_AFS_ID_DIDEXP "%1 (ƒg[ƒNƒ“‚ÌŠúŒÀ‚ª %2 ‚ɐ؂ê‚Ü‚µ‚½)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(Æ‰ï’†)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "ŠO•”ƒOƒ‹[ƒv" - IDS_ADMCOL_TYPE_FOREIGN_USER "ŠO•”ƒ†[ƒU[" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "ƒm[ƒeƒBƒtƒ@ƒCƒ„[" - IDS_SVC_NONOTIFIER "(‚È‚µ)" - IDS_SVR_KEY_TAB "ƒT[ƒo[Œ®" - IDS_KEYNAME_NOTIME "ƒT[ƒo[ %1 ‚ÌŒ®:" - IDS_KEYNAME_WITHTIME "ƒT[ƒo[ %1 ‚ÌŒ® (•ύX %2):" - IDS_SVRKEY_VERSION "ƒo[ƒWƒ‡ƒ“" - IDS_SVRKEY_DATA "’l" - IDS_SVRKEY_CHECKSUM "ƒ`ƒFƒbƒNƒTƒ€" - IDS_SVRKEY_DATA_UNKNOWN "(‰B‚·)" - IDS_STARTSERVICE_TITLE "ƒT[ƒrƒX‚ÌŠJŽn" - IDS_STOPSERVICE_TITLE "ƒT[ƒrƒX‚Ì’âŽ~" - IDS_STARTSERVICE_TEXT "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ðŠJŽn‚·‚é‚ɂ́u—¹‰ðv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ð’âŽ~‚·‚é‚ɂ́u—¹‰ðv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_STARTSERVICE_STARTUP - "‚±‚̕ύX‚͉i‘±“I‚È‚à‚̂ɂ·‚邱‚Æ‚ª‚Å‚«A‚»‚ê‚É‚æ‚Á‚ăT[ƒo[ %1 ‚ªÄŽn“®‚³‚ê‚邯ީ“®“I‚ɃT[ƒrƒX %2 ‚ªŠJŽn‚³‚ê‚Ü‚·B" - IDS_STOPSERVICE_STARTUP "‚±‚̕ύX‚͉i‘±“I‚È‚à‚̂ɂ·‚邱‚Æ‚ª‚Å‚«A‚»‚ê‚É‚æ‚Á‚ăT[ƒo[ %1‚ªÄŽn“®‚³‚ê‚邯ީ“®“I‚ɂ̓T[ƒrƒX %2 ‚ªŠJŽn‚³‚ê‚Ü‚¹‚ñB" - IDS_STARTSERVICE_PERMANENT - "‰i‘±(&P) (ƒT[ƒo[ %1 ‚̍Ďn“®Žž‚ɃT[ƒrƒX %2 ‚ðŠJŽn)" - IDS_STARTSERVICE_TEMPORARY - "ˆêŽž(&T) (ƒT[ƒo[ %1 ‚̍Ďn“®Žž‚ɃT[ƒrƒX %2 ‚ðŠJŽn‚µ‚È‚¢)" - IDS_STOPSERVICE_PERMANENT - "‰i‘±(&P) (ƒT[ƒo[ %1 ‚̍Ďn“®Žž‚ɃT[ƒrƒX %2 ‚ðŠJŽn‚µ‚È‚¢)" - IDS_STOPSERVICE_TEMPORARY - "ˆêŽž(&T) (ƒT[ƒo[ %1 ‚̍Ďn“®Žž‚ɃT[ƒrƒX %2 ‚ðŠJŽn)" - IDS_ACTION_EXECUTE "ƒT[ƒo[ %1 ‚Å %2 ‚ðŽÀs’†" - IDS_ACTION_SALVAGE_SVR "ƒT[ƒo[ %1 ‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW’†" - IDS_ACTION_SALVAGE_AGG "ƒp[ƒeƒBƒVƒ‡ƒ“ %1:2 ‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW’†" - IDS_ACTION_SALVAGE_VOL "ƒp[ƒeƒBƒVƒ‡ƒ“ %1:2 ‚̃{ƒŠƒ…[ƒ€ %3 ‚ðƒTƒ‹ƒx[ƒW’†" - IDS_SALVAGE_SVR "ƒT[ƒo[ %1 ‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW" - IDS_SALVAGE_AGG "ƒT[ƒo[ %1 ƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW" - IDS_SALVAGE_SET "ƒT[ƒo[ %1 ƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€ %3 ‚ðƒTƒ‹ƒx[ƒW" - IDS_SETSTATUS_SALVAGE "ƒ{ƒŠƒ…[ƒ€‚̃Tƒ‹ƒx[ƒW’†" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "ƒ{ƒŠƒ…[ƒ€‚ªƒƒbƒN‚³‚ê‚Ä‚¢‚Ü‚·" - IDS_SETSTATUS_NO_VOL "ƒ{ƒŠƒ…[ƒ€‚ª‚ ‚è‚Ü‚¹‚ñ" - IDS_SETSTATUS_BUSY "ƒ{ƒŠƒ…[ƒ€‚ªŒ»ÝŽg—p’†‚Å‚·" - IDS_SETSTATUS_MOVED "ƒ{ƒŠƒ…[ƒ€‚ªˆÚ“®‚³‚ê‚Ü‚µ‚½" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "ƒAƒhƒŒƒX" - IDS_HOST_TITLE "ƒT[ƒo[ %1 ‚ª”Fޝ‚·‚éƒf[ƒ^ƒx[ƒXEƒzƒXƒgEƒT[ƒo[:" - IDS_SVR_HOSTS_TITLE "ƒT[ƒo[ %1 - ƒf[ƒ^ƒx[ƒXEƒzƒXƒg" - IDS_SVR_HOST_TAB "ƒf[ƒ^ƒx[ƒXEƒzƒXƒg" - IDS_ACTION_HOSTLIST_LOAD "ƒT[ƒo[ %1 ‚©‚çƒzƒXƒgEƒŠƒXƒg‚ðŽæ“¾’†" - IDS_ACTION_HOSTLIST_SAVE "ƒT[ƒo[ %1 ‚ɃzƒXƒgEƒŠƒXƒg‚ð‘‚«ž‚Ý’†" - IDS_SETSTATUS_1ALERT "ƒ{ƒŠƒ…[ƒ€‚É 1 ‚–â‘肪‚ ‚è‚Ü‚·" - IDS_SETSTATUS_2ALERT "ƒ{ƒŠƒ…[ƒ€‚É %1 ‚Ì–â‘肪‚ ‚è‚Ü‚·" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "ƒT[ƒo[ %1 ‚Ì IP ƒAƒhƒŒƒX‚ð•ύX’†" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED - "ƒT[ƒo[ %1 ‚Í–â‘è‚ɂ‚¢‚ă‚ƒjƒ^[‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_ALERT_DESCSHORT_TIMEOUT - "ƒT[ƒo[ %1 ‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½BÅIƒGƒ‰[: %3" - IDS_ALERT_DESCSHORT_AGG_FULL - "%2 ‚̃p[ƒeƒBƒVƒ‡ƒ“Žg—p—¦‚ªŒx‚µ‚«‚¢’l %3%% ‚ð’´‚¦‚Ü‚µ‚½ (%4)" - IDS_ALERT_DESCSHORT_SET_FULL - "%3 ‚̃{ƒŠƒ…[ƒ€Žg—p—¦‚ªŒx‚µ‚«‚¢’l %4%% ‚ð’´‚¦‚Ü‚µ‚½ (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT "ƒ{ƒŠƒ…[ƒ€ %3 ‚É VLDB €–Ú‚ª‚ ‚è‚Ü‚¹‚ñ" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "ƒ{ƒŠƒ…[ƒ€ %3 ‚Í VLDB €–Ú‚ðŽ‚Á‚Ä‚¢‚Ü‚·‚ªAƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚ÉŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ALERT_DESCSHORT_STOPPED "ƒT[ƒrƒX %2 ‚ª %3 ‚É’âŽ~‚µ‚Ü‚µ‚½" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "ƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚Í VLDB ‚É‚æ‚Á‚ÄƒŠƒtƒŒƒbƒVƒ…‚³‚ê‚Ü‚µ‚½‚ªAƒT[ƒo[ %1 ‚ÉŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ALERT_DESCSHORT_BADCREDS - "ƒT[ƒo[ %1 ‚ðŠÇ—‚·‚邽‚߂ɏ\•ª‚ÈŒ ŒÀ‚ª‚ ‚è‚Ü‚¹‚ñ" - IDS_ALERT_DESCSHORT_AGG_ALLOC - "ƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚ÌŒ‹‡ƒ{ƒŠƒ…[ƒ€Š„‚è“–‚Ä—Ê‚ª‚»‚Ì—e—ʂ𒴂¦‚Ü‚µ‚½" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE - "%3 ƒ{ƒŠƒ…[ƒ€‚͉ó‚ê‚Ä‚¢‚邽‚ߎg—p‚Å‚«‚Ü‚¹‚ñB" - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "ƒ{ƒŠƒ…[ƒ€ %3 ‚ðˆµ‚¤ƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_ALERT_DESCSHORT_STATE_OFFLINE - "%3 ƒ{ƒŠƒ…[ƒ€‚̓Iƒtƒ‰ƒCƒ“‚Ì‚½‚ߎg—p‚Å‚«‚Ü‚¹‚ñB" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "ƒT[ƒo[ %1 ‚ɐڑ±‚Å‚«‚Ü‚¹‚ñB%2 ‚ɍs‚í‚ꂽÅŒã‚ÌŽŽs‚̓Gƒ‰[ ""%3"" ‚ɂȂè‚Ü‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚ÌŽg—p—¦‚ª‚»‚ÌŒx‚µ‚«‚¢’l %3%% ‚ð’´‚¦‚Ü‚µ‚½ (%4)B" - IDS_ALERT_DESCFULL_SET_FULL - "ƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2) ‚ÌŽg—p—¦‚ª‚»‚ÌŒx‚µ‚«‚¢’l %4%% ‚ð’´‚¦‚Ü‚µ‚½ (%5)B" - IDS_ALERT_DESCFULL_NO_VLDBENT - "ƒ{ƒŠƒ…[ƒ€ %3 ‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚É‘¶Ý‚µ‚Ü‚·‚ªA‘Ήž‚·‚é VLDB €–Ú‚ª‚ ‚è‚Ü‚¹‚ñB" - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "ƒ{ƒŠƒ…[ƒ€ %3 ‚Ì VLDB €–Ú‚ª‘¶Ý‚µ‚Ü‚·‚ªAƒ{ƒŠƒ…[ƒ€‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚ÉŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ALERT_DESCFULL_STOPPED - "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ª %3 ‚ɏI—¹ƒR[ƒh %5 ‚Å’âŽ~‚µ‚Ü‚µ‚½B" - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "VLDB ‚̓T[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€‚ðŽQÆ‚µ‚Ü‚·‚ªAƒp[ƒeƒBƒVƒ‡ƒ“‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ALERT_DESCFULL_BADCREDS - "‚±‚̃Zƒ‹“à‚ÅŠÇ—ŽÒ‚Æ‚µ‚Ä‚Ì AFS ƒg[ƒNƒ“‚ðŽ‚Á‚Ä‚¢‚È‚¢‚½‚߁AAFSƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚É‘¶Ý‚µ‚È‚¢ƒGƒ‰[‚ðŒŸo‚µ‚Ü‚µ‚½B" - IDS_ALERT_DESCFULL_AGG_ALLOC - "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€‚ÌŒ‹‡Š„‚è“–‚ėʁA‡Œv %4A‚ªƒp[ƒeƒBƒVƒ‡ƒ“‚Ì—e—Ê %3 ‚ð’´‚¦‚Ü‚µ‚½B" - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ì %3 ƒ{ƒŠƒ…[ƒ€‚ªŠÖ˜A‚·‚é Vnode ‚ðŽ‚Á‚Ä‚¢‚Ü‚¹‚ñB(ƒ{ƒŠƒ…[ƒ€ó‹µ‚Í 0x%4)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "ƒT[ƒo[ %1 ‚Ńtƒ@ƒCƒ‹EƒGƒNƒXƒ|[ƒ^[EƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁Aƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ì %3 ƒ{ƒŠƒ…[ƒ€‚ðŽg—p‚Å‚«‚Ü‚¹‚ñB(ƒ{ƒŠƒ…[ƒ€ó‹µ‚Í 0x%4)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ì %3 ƒ{ƒŠƒ…[ƒ€‚ªƒIƒtƒ‰ƒCƒ“‚Ì‚½‚ߎg—p‚Å‚«‚Ü‚¹‚ñB(ƒ{ƒŠƒ…[ƒ€ó‹µ‚Í 0x%4)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "‚±‚̃T[ƒo[‚ɍĐڑ±‚·‚é‚ɂ́AuÄŽŽsvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_AGG_FULL "‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚ÌŽg—p—¦‚ÌŒx‚µ‚«‚¢’l‚ð•ύX‚·‚é‚ɂ́AuŒxvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_SET_FULL "‚±‚̃{ƒŠƒ…[ƒ€‚ÌŽg—p—¦‚ÌŒx‚µ‚«‚¢’l‚ð•ύX‚·‚é‚ɂ́AuŒxvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "VLDB ‚ªŒÃ‚­‚È‚Á‚Ä‚¢‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B‚»‚̏ꍇ‚́AuVLDB ‚Ì“¯Šú‰»vƒRƒ}ƒ“ƒh‚Å‚±‚ê‚ðXV‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_NO_SVRENT_SET - "ƒT[ƒo[‚ƃp[ƒeƒBƒVƒ‡ƒ“‚ª³‚µ‚­‹@”\‚µ‚Ä‚¢‚é‚©‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_STOPPED "‚±‚̃T[ƒrƒX‚̃T[ƒrƒXEƒƒO‚ðŒ©‚é‚ɂ́AuƒƒO‚Ì•\ަvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_NO_SVRENT_AGG - "ƒT[ƒo[‚𒲂ׂāAƒp[ƒeƒBƒVƒ‡ƒ“‚ªƒGƒNƒXƒ|[ƒg‚³‚êA³‚µ‚­‹@”\‚µ‚Ä‚¢‚é‚©‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_BADCREDS "V‚µ‚¢ AFS ƒg[ƒNƒ“‚ðŽæ“¾‚·‚é‚ɂ́Au”FØvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_AGG_ALLOC "‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚̃{ƒŠƒ…[ƒ€‚ÌŠ„‚è“–‚Ä—Ê‚ðŒ¸‚ç‚·‚©A1 ‚‚܂½‚Í•¡”‚̃{ƒŠƒ…[ƒ€‚𑼂̃p[ƒeƒBƒVƒ‡ƒ“‚ÖˆÚ“®‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "ÄŽŽs(&A)" - IDS_ALERT_BUTTON_WARNINGS "Œx(&W)..." - IDS_ALERT_BUTTON_VIEWLOG "ƒƒO‚Ì•\ަ(&V)" - IDS_ALERT_BUTTON_SHOWME "•\ަ(&S)" - IDS_ALERT_BUTTON_GETCREDS "”FØ(&A)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "ƒZƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñBAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ðŽg—p‚·‚邽‚߂ɂ́A‘€ì‚µ‚½‚¢ AFS ƒZƒ‹‚ðŽw’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·Bã‚́uƒZƒ‹vƒƒjƒ…[‚ŁuƒI[ƒvƒ“...vƒƒjƒ…[€–Ú‚ð‘I‚ñ‚ŁAƒZƒ‹‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ERROR_REFRESH_CELLSERVERS - "ƒT[ƒo[‚ÌƒŠƒXƒg‚ð %1 ƒZƒ‹‚ɂ‚¢‚Ď擾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[: %2" - IDS_ERROR_CANT_OPEN_CELL - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒZƒ‹ %1 “à‚̃T[ƒo[‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒZƒ‹‚Ì–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ð‚à‚¤ˆê“xŠm”F‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ERROR_REFRESH_AGGREGATES - "ƒp[ƒeƒBƒVƒ‡ƒ“‚ÌƒŠƒXƒg‚ð %1 ƒT[ƒo[‚ɂ‚¢‚Ď擾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[: %2" - IDS_ERROR_REFRESH_SERVER_STATUS - "ƒT[ƒo[ %1 ‚ÌŒ»Ý‚Ìó‹µ‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CHANGE_SERVER_STATUS - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃vƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚ÌŒ»Ý‚Ìó‹µ‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "ƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2) ‚ÌŒ»Ý‚Ìó‹µ‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_REFRESH_SERVICE_STATUS - "ƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ÌŒ»Ý‚̏󋵂𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_MOVE_FILESET "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒ{ƒŠƒ…[ƒ€ %3 ‚ðƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚©‚çƒT[ƒo[ %4 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %5 ‚ÖˆÚ“®‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_VIEW_LOGFILE "%2 ƒtƒ@ƒCƒ‹‚ðƒT[ƒo[ %1 ‚©‚ç“ǂݎæ‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒtƒ@ƒCƒ‹–¼‚𐳂µ‚­“ü—Í‚µ‚½‚©A‚Ü‚½ƒtƒ@ƒCƒ‹‚ðŒ©‚é‚½‚߂ɏ\•ª‚È‹–‰Â‚ðŽ‚Á‚Ä‚¢‚é‚©‚𒲂ׂĂ­‚¾‚³‚¢B" - IDS_ERROR_NOT_REPLICATED - "ƒ{ƒŠƒ…[ƒ€ %1 ‚Ì•¡»ó‹µ‚𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ƀ{ƒŠƒ…[ƒ€ %3 ‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2) ‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ƀ{ƒŠƒ…[ƒ€ %3 ‚Ì VLDB €–Ú‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SET_FILESET_QUOTA - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€ %3‚ÌŠ„‚è“–‚Ä—Ê‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_SERVER - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒZƒ‹ %1 “à‚Å•K—v‚ȃT[ƒo[€–Ú‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_PING_SERVER - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚Ì IP ƒAƒhƒŒƒX‚𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_SERVER - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "ƒT[ƒo[ %1 ‚͂܂¾ƒ{ƒŠƒ…[ƒ€‚̃zƒXƒg‚Å‚ ‚邽‚ߍ폜‚Å‚«‚Ü‚¹‚ñBƒT[ƒo[‚̓{ƒŠƒ…[ƒ€‚ðŽ‚½‚È‚­‚È‚é‚܂ō폜‚Å‚«‚Ü‚¹‚ñB" - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃vƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CHANGE_SERVICE_STATUS - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚̃vƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_START_SERVICE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ðŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ð’âŽ~‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_RESTART_SERVICE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒrƒX %2 ‚ð’âŽ~‚¨‚æ‚эĎn“®‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CHANGE_REPLICA_STATUS - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ƒp[ƒeƒBƒVƒ‡ƒ“ %2 ‚̃{ƒŠƒ…[ƒ€ %3‚Ì•¡»ƒvƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SYNCVLDB "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ª VLDB ‚ðXV‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_REPLICA - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ƀ{ƒŠƒ…[ƒ€ %3 ‚̃ŒƒvƒŠƒJ‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_INSTALL_FILE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚É %2 ƒtƒ@ƒCƒ‹‚ðƒCƒ“ƒXƒg[ƒ‹‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_UNINSTALL_FILE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚É %2 ƒtƒ@ƒCƒ‹‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_PRUNE_FILES - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚©‚ç—v‹‚³‚ꂽƒtƒ@ƒCƒ‹‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_RENAME_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒ{ƒŠƒ…[ƒ€ %1 ‚ð ""%2"" ‚É–¼‘O•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_SERVICE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚ɃT[ƒrƒX %2 ‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_SERVICE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚©‚çƒT[ƒrƒX %2 ‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_RELEASE_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ª•¡»‚³‚ꂽƒ{ƒŠƒ…[ƒ€ %3 ‚ð‰ð•ú‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_UPDATE_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %2 ƒp[ƒeƒBƒVƒ‡ƒ“ %1 ‚̃{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ %3 ‚ðXV‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_UPDATE_ALL - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒ{ƒŠƒ…[ƒ€ %3 ‚̃ŒƒvƒŠƒJ‚ðXV‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚ÌŠÇ—ŽÒ‚ÌƒŠƒXƒg‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_LOAD_KEYLIST - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒo[Œ®‚ÌƒŠƒXƒg‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_KEY - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̐V‚µ‚¢ƒT[ƒo[Œ®‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SAVE_ADMLIST - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚ÌŠÇ—ŽÒ‚ÌƒŠƒXƒg‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CLONE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Ƀ{ƒŠƒ…[ƒ€ %3 ‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CLONESYS "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ª—v‹‚³‚ꂽƒoƒbƒNƒAƒbƒvEƒ{ƒŠƒ…[ƒ€‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DUMP_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2) ‚Ì“à—e‚ðƒtƒ@ƒCƒ‹ %4 ‚Öƒ_ƒ“ƒv‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_RESTORE_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒtƒ@ƒCƒ‹ %4 ‚ðƒ{ƒŠƒ…[ƒ€ %3 (ƒT[ƒo[ %1Aƒp[ƒeƒBƒVƒ‡ƒ“ %2) ‚Ö•œŒ³‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SET_RESTART_TIMES - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃T[ƒrƒX‚̍Ďn“®Žž‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚©‚çƒ{ƒŠƒ…[ƒ€ %3 ‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n‚·‚ׂẴŒƒvƒŠƒJ‚ªíœ‚³‚ê‚é‚܂Ń{ƒŠƒ…[ƒ€ %3 ‚͍폜‚Å‚«‚Ü‚¹‚ñB" - IDS_CMDLINE_TITLE "ƒGƒ‰[ - AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_CMDLINE_SYNTAX "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B" - IDS_CMDLINE_UNRECOGNIZED - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1"" ƒpƒ‰ƒ[ƒ^[‚ª”Fޝ‚Å‚«‚Ü‚¹‚ñB" - IDS_CMDLINE_DUPLICATE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1"" ƒpƒ‰ƒ[ƒ^[‚ª•¡”‰ñŽw’肳‚ê‚Ä‚¢‚Ü‚·B" - IDS_CMDLINE_UNEXPECTVALUE - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1"" ƒpƒ‰ƒ[ƒ^[‚É’l‚ª‚ ‚è‚Ü‚¹‚ñB" - IDS_CMDLINE_MISSINGVAL "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1"" ƒpƒ‰ƒ[ƒ^[‚ÌŒã‚É’l‚ª‘±‚¢‚Ä‚¢‚Ü‚¹‚ñB" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""/SUBSET""ƒpƒ‰ƒ[ƒ^[‚Í ""/CELL"" ƒpƒ‰ƒ[ƒ^[‚ªŽw’肳‚ꂽê‡‚ɂ̂ݎw’è‚Å‚«‚Ü‚·B" - IDS_CMDLINE_INVALIDSUBSET - "Žw’肵‚½ƒT[ƒo[EƒTƒuƒZƒbƒg ""%2"" ‚ª %1 ƒZƒ‹‚É’è‹`‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_CMDLINE_SERVERNOTCELL - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""/SERVER""ƒpƒ‰ƒ[ƒ^[‚Í ""/CELL"" ƒpƒ‰ƒ[ƒ^[‚ªŽw’肳‚ꂽê‡‚ɂ̂ݎw’è‚Å‚«‚Ü‚·B" - IDS_CMDLINE_RESET_TITLE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[" - IDS_CMDLINE_RESET_DESC "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªŽw’肳‚ꂽÝ’è‚ðƒNƒŠƒA‚µ‚Ü‚µ‚½B" - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "ƒp[ƒeƒBƒVƒ‡ƒ“‚ª‘¶Ý‚µ‚È‚¢‚©AƒGƒNƒXƒ|[ƒg‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚Í VLDB ‚ðƒT[ƒo[ %1 ‚̃p[ƒeƒBƒVƒ‡ƒ“ %2 ‚Æ“¯Šú‰»‚Å‚«‚Ü‚¹‚ñB\n\n‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚ðƒT[ƒo[ %1 ‚©‚çíœ‚·‚é‚ɂ́A‚±‚ê‚ðŽQÆ‚·‚éƒ{ƒŠƒ…[ƒ€ VLDB €–Ú‚ðíœ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_CMDLINE_USERPASSWORD - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\nV‚µ‚¢ AFS ƒg[ƒNƒ“‚ðŽæ“¾‚·‚é‚ɂ́A ""/USER"" ‚¨‚æ‚Ñ ""/PASSWORD"" ƒpƒ‰ƒ[ƒ^[‚ðŽw’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_ERROR_CANT_DELETE_KEY - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚©‚çƒT[ƒo[Œ® %2 ‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_GETRANDOMKEY - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃‰ƒ“ƒ_ƒ€Œ®‚𐶐¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_EXECUTE_COMMAND - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚ÅŽŸ‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½:\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒTƒ‹ƒx[ƒW‘€ì‚𐳏í‚ÉŠ®—¹‚µ‚Ü‚µ‚½‚ªAƒTƒ‹ƒx[ƒW‘€ì‚ÌŒ‹‰Ê‚ðŽ¦‚·ƒƒOEƒtƒ@ƒCƒ‹‚ðŒŸõ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SALVAGE "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ª—v‹‚³‚ꂽƒTƒ‹ƒx[ƒW‘€ì‚ðŽÀs‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_AUTH_ON "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚Ì”FØŒŸ¸‚ðŽg—p‰Â”\‚ɂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_AUTH_OFF "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚Ì”FØŒŸ¸‚ðŽg—p•s‰Â‚ɂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_LOAD_HOSTLIST - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚©‚çƒf[ƒ^ƒx[ƒXEƒzƒXƒgEƒT[ƒo[‚ÌƒŠƒXƒg‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SAVE_HOSTLIST - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚̃f[ƒ^ƒx[ƒXEƒzƒXƒgEƒT[ƒo[‚ÌƒŠƒXƒg‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚ª‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚ɐ³‚µ‚­ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nAFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚̍ăCƒ“ƒXƒg[ƒ‹‚ª•K—v‚Å‚ ‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B" - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "•s–¾‚È–â‘è‚Ì‚½‚ß‚É AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ðŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nAFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚̍ăCƒ“ƒXƒg[ƒ‹‚ª•K—v‚Å‚ ‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B" - IDS_ERROR_CANT_CHANGEADDR - "AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[‚ªƒT[ƒo[ %1 ‚Ì VLDB “à‚Ì IP ƒAƒhƒŒƒX‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "ƒVƒ“ƒvƒ‹" - IDS_SERVICETYPE_CRON "Cron" - IDS_SERVICESTATE_STOPPED "’âŽ~" - IDS_SERVICESTATE_STOPPING "’âŽ~’†" - IDS_SERVICESTATE_STARTING "ŠJŽn’†" - IDS_SERVICESTATE_RUNNING "ŽÀs’†" - IDS_SERVICETYPE_FS_LONG "FS (ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "ƒZƒ‹ %1 ‚Ì‚·‚ׂẴT[ƒrƒX:" - IDS_SERVICE_STARTDATE "ŠJŽn %1" - IDS_SERVICE_STOPDATE "’âŽ~ %1" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/ko_KR/svrmgr.rc b/src/WINNT/afssvrmgr/lang/ko_KR/svrmgr.rc deleted file mode 100644 index fbe61f7a2..000000000 --- a/src/WINNT/afssvrmgr/lang/ko_KR/svrmgr.rc +++ /dev/null @@ -1,2987 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - RIGHTMARGIN, 165 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 253 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 152 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 196 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 291 - TOPMARGIN, 7 - BOTTOMMARGIN, 140 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 276 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 289 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 250 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 221 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "¼¿(&C)" - BEGIN - MENUITEM "¼±ÅÃ(&S)...", M_CELL_OPEN - MENUITEM "ÀÎÁõ(&A)", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "Á¾·á(&X)", M_EXIT - END - POPUP "º¸±â(&V)" - BEGIN - POPUP "¼­¹ö(&S)" - BEGIN - MENUITEM "Å« ¾ÆÀÌÄÜ(&G)", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "ÀÛÀº ¾ÆÀÌÄÜ(&M)", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "ÀÚ¼¼È÷(&D)", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "»óŸ¸(&S)", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "»¡¸® º¸±â ºÐÇÒ¿µ¿ª(&Q)" - BEGIN - MENUITEM "¾øÀ½(&N)", M_DIVIDE_NONE, CHECKED - MENUITEM "¼öÁ÷ ºÐÇÒ(&V)", M_DIVIDE_H, CHECKED - MENUITEM "¼öÆò ºÐÇÒ(&H)", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ÁøÇà ÁßÀÎ Á¶ÀÛ(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "¸ð´ÏÅ͵Ǵ ¼­¹ö(&M)...", M_SUBSET - MENUITEM "Ä÷³(&C)...", M_COLUMNS - MENUITEM "¿É¼Ç(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL - END - POPUP "µµ¿ò¸»(&H)" - BEGIN - MENUITEM "¸ñÂ÷(&C)", M_HELP - MENUITEM "¸í·É ã±â(&F)...", M_HELP_FIND - MENUITEM "¿À·ù ÄÚµå ã±â(&L)...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ Á¤º¸(&A)...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "º¼·ý ÀÛ¼º(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "º¼·ý ¹é¾÷(&B)...", M_SET_CLONE - MENUITEM "¸ðµç º¼·ý Àá±ÝÇØÁ¦(&U)", M_SET_UNLOCK - MENUITEM "VLDB µ¿±âÈ­(&Y)...", M_SYNCVLDB - MENUITEM "º¼·ý º¹¿ø(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM "Ư¼º(&R)", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "½ÃÀÛ(&S)", M_SVC_START - MENUITEM "Á¤Áö(&T)", M_SVC_STOP - MENUITEM "Àç½ÃÀÛ(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "·Î±× ÆÄÀÏ º¸±â(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "»èÁ¦(&L)", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM "Ư¼º(&R)", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "º¼·ý ÀÛ¼º(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "¼­ºñ½º ÀÛ¼º(&C)...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "º¹Á¦(&E)...", M_SET_REPLICATION - MENUITEM "Áö±Ý ÇØÁ¦(&S)", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "¹é¾÷(&B)...", M_SET_CLONE - MENUITEM "ÆÄÀÏ¿¡ ´ýÇÁ(&D)...", M_SET_DUMP - MENUITEM "ÆÄÀϷκÎÅÍ º¹¿ø(&R)...", M_SET_RESTORE - MENUITEM "ÇÒ´ç·® ¼³Á¤(&Q)...", M_SET_SETQUOTA - MENUITEM "º¹¿ø(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "´ÙÀ½À¸·Î À̵¿(&M)...", M_SET_MOVETO - MENUITEM "À̸§ º¯°æ(&N)...", M_SET_RENAME - MENUITEM "»èÁ¦(&L)", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Àá±Ý(&K)", M_SET_LOCK - MENUITEM "Àá±ÝÇØÁ¦(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM "Ư¼º(&R)", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "¼­¹ö â ¿­±â(&O)", M_SVR_OPEN - MENUITEM "¼­¹ö ⠴ݱâ(&C)", M_SVR_CLOSE - MENUITEM "ÀÌ ¼­¹ö ¸ð´ÏÅÍ(&M)", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "¼­¹ö º¸¾È ÆíÁý(&S)...", M_SVR_SECURITY - MENUITEM "µ¥ÀÌÅͺ£À̽º È£½ºÆ® °ü¸®(&H)...", M_SVR_HOSTS - MENUITEM "º¼·ý ¹é¾÷(&B)...", M_SET_CLONE - MENUITEM "¸ðµç º¼·ý Àá±ÝÇØÁ¦(&U)", M_SET_UNLOCK - MENUITEM "VLDB µ¿±âÈ­(&Y)...", M_SYNCVLDB - MENUITEM "º¼·ý º¹¿ø(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "ÆÄÀÏ ¼³Ä¡(&I)...", M_SVR_INSTALL - MENUITEM "ÆÄÀÏ ¼³Ä¡ ÇØÁ¦(&U)...", M_SVR_UNINSTALL - MENUITEM "ÀÌÀü ÆÄÀÏ Á¤¸®(&P)...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "ÆÄÀÏ ³¯Â¥ È®º¸(&T)...", M_SVR_GETDATES - MENUITEM "·Î±× ÆÄÀÏ º¸±â(&V)...", M_VIEWLOG - MENUITEM "¸í·É ½ÇÇà(&X)...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM "Ư¼º(&R)", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "Å« ¾ÆÀÌÄÜ(&G)", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "ÀÛÀº ¾ÆÀÌÄÜ(&M)", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "ÀÚ¼¼È÷(&D)", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "»óŸ¸(&S)", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "¸ð´ÏÅ͵Ǵ ¼­¹ö(&M)...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "¸ðµç º¼·ý Àá±ÝÇØÁ¦(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ ´Ý±â(&C)", M_SVR_CLOSEALL - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "º¼·ýº°(&V)", M_SET_VIEW_REPORT, CHECKED - MENUITEM "ÆÄƼ¼Çº°(&P)", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "¼¼ºÎ»çÇ× ¾øÀ½(&D)", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "º¼·ý ÀÛ¼º(&C)...", M_SET_CREATE - MENUITEM "ÆÄÀϷκÎÅÍ º¹¿ø(&R)...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "º¼·ý ¹é¾÷(&B)...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ Àá±ÝÇØÁ¦(&U)", M_SET_UNLOCK - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "Ä÷³(&C)...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "Àç½ÃÀÛ(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "·Î±× ÆÄÀÏ º¸±â(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM "Ư¼º(&R)", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "¿©±â·Î À̵¿(&M)...", M_SET_MOVEHERE - MENUITEM "¿©±â¼­ º¹Á¦(&R)...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "Ãë¼Ò(&C)", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "¼­ºñ½º:",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 61,WS_EX_STATICEDGE - PUSHBUTTON "ÀÛ¼º(&C)...",IDC_SVC_CREATE,56,80,39,12 - PUSHBUTTON "»èÁ¦(&L)",IDC_SVC_DELETE,98,80,39,12 - PUSHBUTTON "Àç½ÃÀÛ(&R)",IDC_SVC_RESTART,140,80,39,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "ÆÄƼ¼Ç:",IDC_AGG_DESC,0,5,165,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,17,165, - 53,WS_EX_STATICEDGE - PUSHBUTTON "º¼·ý ÀÛ¼º(&C)...",IDC_AGG_CREATESET,102,72,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 194, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "º¼·ý:",IDC_SET_DESC,0,5,194,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,194, - 61,WS_EX_STATICEDGE - PUSHBUTTON "ÀÛ¼º(&C)...",IDC_SET_CREATE,3,80,39,12 - PUSHBUTTON "»èÁ¦(&L)",IDC_SET_DELETE,45,80,39,12 - PUSHBUTTON "º¹Á¦(&R)...",IDC_SET_REP,87,80,45,12 - PUSHBUTTON "ÇÒ´ç·® ¼³Á¤(&Q)...",IDC_SET_SETQUOTA,136,80,57,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "°ü¸®ÀÚ Ãß°¡(&A)",IDC_LIST_ADD,72,160,65,14 - PUSHBUTTON "°ü¸®ÀÚ Á¦°Å(&R)",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "%1 ¼­¹öÀÇ °ü¸®ÀÚ:",IDC_LIST_NAME,5,7,216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "ID:",IDC_STATIC,5,30,31,8 - LTEXT "(Á¶È¸ Áß)",IDC_AGG_ID,38,30,214,8 - LTEXT "ÀåÄ¡:",IDC_STATIC,5,46,31,8 - LTEXT "(Á¶È¸ Áß)",IDC_AGG_DEVICE,38,46,214,8 - LTEXT "º¼·ý:",IDC_STATIC,5,62,31,8 - LTEXT "(Á¶È¸ Áß)",IDC_AGG_FILESETS,38,62,214,8 - CONTROL "Á¶ÇÕµÈ º¼·ý ÇÒ´ç·®ÀÌ ¿ë·®À» ÃʰúÇÏ¸é °æ°í Ç¥½Ã", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 38,76,215,10 - LTEXT "»ç¿ë·®:",IDC_STATIC,5,90,31,8 - LTEXT "(Á¶È¸ Áß)",IDC_AGG_USAGE,38,90,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,103,218,8, - WS_EX_STATICEDGE - CONTROL "ÆÄƼ¼Ç »ç¿ë·®ÀÌ ÃʰúµÇ¸é °æ°í Ç¥½Ã",IDC_AGG_WARN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,38,116,214,10 - CONTROL "ÀÌ ¼­¹ö¿¡ ´ëÇÑ ±âº» ÀÓ°è°ª(&D)", - IDC_AGG_WARN_AGGFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,49,131,203,9 - CONTROL "ÀÓ°è°ª(&T)",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,53,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,112,143,29,12, - ES_AUTOHSCROLL - LTEXT "Å©±âÀÇ ¹éºÐÀ²",IDC_AGG_WARN_AGGFULL_DESC,152,145,100,8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,20,20 - LTEXT "%2 ÆÄƼ¼Ç(%1 ¼­¹ö)",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "IP ÁÖ¼Ò",IDC_STATIC,5,29,36,8 - LISTBOX IDC_SVR_ADDRESSES,53,29,70,12,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "ÁÖ¼Ò º¯°æ(&A)...",IDC_SVR_CHANGEADDR,144,28,77,12 - PUSHBUTTON "ÀÎÁõ ÇÊ¿ä(&R)",IDC_SVR_AUTH_YES,41,81,84,12 - PUSHBUTTON "¹ÌÀÎÁõ Çã¿ë(&U)",IDC_SVR_AUTH_NO,129,81,80,12 - LTEXT "ÆÄƼ¼Ç ¼ö:",IDC_STATIC,11,131,90,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVR_NUMAGGREGATES,108,131,99,8 - LTEXT "ÃÑ ¿ë·®:",IDC_STATIC,11,148,48,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVR_CAPACITY,108,148,99,8 - LTEXT "Á¶ÇÕµÈ º¼·ý ÇÒ´ç·®:",IDC_STATIC,11,165,79,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVR_ALLOCATION,108,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(¼­¹ö À̸§)",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "º¸¾È",IDC_STATIC,5,52,216,52 - GROUPBOX "±â¾ï¿µ¿ª",IDC_STATIC,5,115,216,68 - LTEXT "ÀÌ ¼­¹ö¿¡ ´ëÇÑ ¸ðµç ¾×¼¼½º°¡ ÀÎÁõµÇ¾î¾ß ÇÕ´Ï´Ù.", - IDC_STATIC,11,67,198,8 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 221, 158 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - CONTROL "¼­¹ö¿¡ ÀÖ´Â ¸ðµç ÆÄƼ¼ÇÀÇ »ç¿ë·®ÀÌ", - IDC_SVR_WARN_AGGFULL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,18,124,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,140,17,24,12,ES_AUTOHSCROLL - LTEXT "% ÀÎ °æ¿ì",IDC_STATIC,176,19,38,8 - CONTROL "¼­¹ö¿¡ ÀÖ´Â ¸ðµç º¼·ýÀÇ »ç¿ë·®ÀÌ",IDC_SVR_WARN_SETFULL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,32,120,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,135,31,24,12,ES_AUTOHSCROLL - LTEXT "% ÀÎ °æ¿ì",IDC_STATIC,172,33,36,8 - CONTROL "¸ðµç ÆÄƼ¼ÇÀÇ Á¶ÇÕµÈ ÇÒ´ç·®ÀÌ ¿ë·®À» ÃʰúÇÒ °æ¿ì", - IDC_SVR_WARN_AGGALLOC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,46,200,9 - CONTROL "¼­¹ö¿¡ ÀÖ´Â ¸ðµç ¼­ºñ½ºÀÇ ½ÇÇàÀÌ ÁßÁöµÈ °æ¿ì", - IDC_SVR_WARN_SVCSTOP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,60,195,9 - CONTROL "¼­¹öÀÇ ¸ðµç º¼·ý¿¡ VLDB Ç׸ñÀÌ ¾øÀ» °æ¿ì", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,74,195,9 - CONTROL "VLDB°¡ ¼­¹öÀÇ ¸ðµç ¿ÀÇÁ¶óÀÎ ÆÄƼ¼ÇÀ» ÂüÁ¶ÇÒ °æ¿ì", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,88,195,9 - CONTROL "VLDB°¡ ¼­¹öÀÇ ¸ðµç ¿ÀÇÁ¶óÀÎ º¼·ýÀ» ÂüÁ¶ÇÒ °æ¿ì", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,103,195,9 - CONTROL "¼­¹ö Á¤º¸¸¦ ",IDC_SVR_AUTOREFRESH,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,142,51,11 - LTEXT "´ÙÀ½ÀÇ °æ¿ì¿¡ °æ°í¸¦ Ç¥½ÃÇÕ´Ï´Ù",IDC_STATIC,5,5,195,8 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,65,140,27,13,ES_AUTOHSCROLL - LTEXT "ºÐ¸¶´Ù »õ·Î °íħ",IDC_STATIC,106,143,74,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - PUSHBUTTON "¼­ºñ½º ·Î±× º¸±â(&V)",IDC_SVC_VIEWLOG,55,182,66,14 - PUSHBUTTON "Áö±Ý ½ÃÀÛ(&S)",IDC_SVC_START,126,182,43,14 - PUSHBUTTON "Áö±Ý Á¤Áö(&P)",IDC_SVC_STOP,169,182,43,14 - CONTROL "ÀÌ ¼­¹ö°¡ Á¤ÁöÇÏ¸é °æ°í Ç¥½Ã(&W)",IDC_SVC_WARNSTOP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "%2 ¼­ºñ½º(%1 ¼­¹ö)",IDC_SVC_NAME,52,13,168,8 - LTEXT "À¯Çü:",IDC_STATIC,5,29,44,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVC_TYPE,52,29,168,8 - LTEXT "¸Å°³º¯¼ö:",IDC_STATIC,5,45,44,8 - EDITTEXT IDC_SVC_PARAMS,52,45,168,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "ÁöÁ¤ÀÚ:",IDC_STATIC,5,61,44,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVC_NOTIFIER,52,61,168,8 - LTEXT "ÃÖÁ¾ ½ÃÀÛ:",IDC_STATIC,5,77,44,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVC_STARTDATE,52,77,168,8 - LTEXT "ÃÖÁ¾ Á¤Áö:",IDC_STATIC,5,93,44,8 - LTEXT "(Á¶È¸ Áß)",IDC_SVC_STOPDATE,52,90,168,8 - LTEXT "ÃÖÁ¾ Àå¾Ö:",IDC_STATIC,5,109,44,8 - EDITTEXT IDC_SVC_LASTERROR,52,109,168,13,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "¼­ºñ½º »óÅÂ",IDC_STATIC,5,127,215,75 - LTEXT "ÀÌ ¼­ºñ½ºÀÇ ÇöÀç »óŸ¦ ÆÇº° ÁßÀÔ´Ï´Ù...", - IDC_SVC_STATUS,11,142,200,8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "º¼·ý ID:",IDC_STATIC,5,30,39,8 - LTEXT "(¾Ë ¼ö ¾øÀ½)",IDC_SET_ID,49,30,219,8 - LTEXT "ÀÛ¼º:",IDC_STATIC,5,46,39,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_CREATEDATE,49,46,219,8 - LTEXT "°»½Å:",IDC_STATIC,5,62,39,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_UPDATEDATE,49,62,112,8 - LTEXT "¾×¼¼½º:",IDC_STATIC,5,78,39,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_ACCESSDATE,49,78,219,8 - LTEXT "¹é¾÷:",IDC_STATIC,5,94,39,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_BACKUPDATE,49,94,219,8 - LTEXT "ÆÄÀÏ °è¼ö:",IDC_STATIC,5,110,34,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_FILES,49,110,219,8 - LTEXT "»óÅÂ:",IDC_STATIC,5,126,39,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_STATUS,49,126,115,8 - PUSHBUTTON "Àá±Ý(&L)",IDC_SET_LOCK,169,124,49,12 - PUSHBUTTON "Àá±ÝÇØÁ¦(&U)",IDC_SET_UNLOCK,219,124,49,12 - LTEXT "»ç¿ë·®:",IDC_STATIC,5,142,31,8 - LTEXT "(Á¶È¸ Áß)",IDC_SET_USAGE,49,142,136,8 - PUSHBUTTON "ÇÒ´ç·® ¼³Á¤(&Q)...",IDC_SET_QUOTA,210,140,58,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,219,8, - WS_EX_STATICEDGE - CONTROL "ÀÌ º¼·ýÀÇ »ç¿ë·®ÀÌ ÃʰúµÇ¸é °æ°í Ç¥½Ã(&W)",IDC_SET_WARN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,49,170,219,10 - CONTROL "ÀÌ ¼­¹öÀÇ ±âº» ÀÓ°è°ª(&D)(±× Å©±âÀÇ %1%%)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,61,185,207,9 - CONTROL "ÀÓ°è°ª(&T)",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,61,199,44,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,115,197,29,12, - ES_AUTOHSCROLL - LTEXT "Å©±âÀÇ ¹éºÐÀ²",IDC_SET_WARN_SETFULL_DESC,163,199,86,8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "%3 º¼·ý(%1 ¼­¹ö, %2 ÆÄƼ¼Ç)",IDC_SET_NAME,49,14,219,8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼±ÅÃµÈ ¼¿:",IDC_STATIC,2,8,55,8 - LTEXT "(¼¿ À̸§Àº ¿©±â¿¡ À§Ä¡ÇÕ´Ï´Ù)",IDC_CELL,62,8,208,9 - LTEXT "AFS ÅäÅ«:",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1(ÅäÅ«Àº %3¿¡ ¸¸±âµË´Ï´Ù)",IDC_AFS_ID,62,19,217,9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "¼­¹ö" -CLASS "ServerWindowClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "¼­¹ö(&S):",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,52,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¼­ºñ½º(&V):",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,52,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¸í·É(&C):",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,52,68,168,13,ES_AUTOHSCROLL - LTEXT "¸Å°³º¯¼ö(&P):",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,52,86,168,13,ES_AUTOHSCROLL - LTEXT "ÁöÁ¤ÀÚ(&N):",IDC_STATIC,5,105,44,8 - EDITTEXT IDC_SVC_NOTIFIER,52,103,168,13,ES_AUTOHSCROLL - LTEXT "·Î±× ÆÄÀÏ(&L):",IDC_STATIC,5,122,44,8 - EDITTEXT IDC_SVC_LOGFILE,52,120,168,13,ES_AUTOHSCROLL - CONTROL "´Ü¼ø(¿¬¼Ó ½ÇÇà)(&I)",IDC_SVC_TYPE_SIMPLE,"Button", - BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "Áö±Ý ÀÌ ¼­ºñ½º ½ÃÀÛ(&T)",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "FS(ÆÄÀÏ ½Ã½ºÅÛ)(&F)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "Å©·Ð(ÁöÁ¤µÈ °£°ÝÀ¸·Î ½ÇÇà)(&C)",IDC_SVC_TYPE_CRON, - "Button",BS_AUTORADIOBUTTON,11,195,201,10 - LTEXT "½ÇÇà ½Ã±â(&W):",IDC_STATIC,23,209,41,8 - COMBOBOX IDC_SVC_RUNDAY,70,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "½Ã°£",IDC_STATIC,143,209,8,8 - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,154,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "»õ·Î¿î ¼­ºñ½º",IDC_SVC_DESC,52,13,168,8 - GROUPBOX "¼­ºñ½º À¯Çü",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "Áö±Ý ÇØÁ¦(&R)",IDC_SET_RELEASE,11,143,52,14 - PUSHBUTTON "ÀÛ¼º(&C)...",IDC_SET_REPSITE_ADD,129,143,38,14 - PUSHBUTTON "»èÁ¦(&L)",IDC_SET_REPSITE_DELETE,172,143,38,14 - LTEXT "¼­¹ö:",-1,11,31,37,8 - LTEXT "(¼­¹ö À̸§)",IDC_SET_SERVER,55,31,147,8 - LTEXT "ÆÄƼ¼Ç:",-1,11,44,37,8 - LTEXT "(ÆÄƼ¼Ç À̸§)",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "º¼·ý:",-1,11,18,37,8 - LTEXT "(º¼·ý À̸§)",IDC_SET_NAME,55,18,147,8 - GROUPBOX "º¼·ý Àбâ/¾²±â",-1,5,5,211,56 - GROUPBOX "º¼·ý º¹Á¦º»",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 257 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼¿ ¼±Åà - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼¿(&C):",IDC_STATIC,4,24,16,8 - COMBOBOX IDC_OPENCELL_CELL,24,22,191,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "AFS ÀÎÁõ",IDC_STATIC,4,44,211,92 - LTEXT "AFS ½Äº°(&I):",IDC_STATIC,22,100,55,8 - EDITTEXT IDC_OPENCELL_ID,80,98,129,14,ES_AUTOHSCROLL - LTEXT "AFS ¾ÏÈ£(&P):",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,129,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "°í±Þ(&V) >>",IDC_ADVANCED,4,146,53,14 - DEFPUSHBUTTON "È®ÀÎ",IDOK,86,146,41,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,130,146,41,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,174,146,41,14 - CONTROL "ÀÌ ¼¿ÀÇ ¸ðµç ¼­¹ö ¸ð´ÏÅÍ(&L)",IDC_MON_ALL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,204,109,9 - CONTROL "ÇϳªÀÇ ¼­¹ö¸¸ ¸ð´ÏÅÍ(&M):",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,219,103,10 - EDITTEXT IDC_MON_SERVER,125,218,83,13,ES_AUTOHSCROLL - CONTROL "¼­ºê¼¼Æ®ÀÇ ¼­¹ö¸¸ ¸ð´ÏÅÍ(&S):",IDC_MON_SOME,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,235,110,10 - COMBOBOX IDC_MON_SUBSET,125,233,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÀÛ¾÷ÇÒ AFS ¼¿À» ¼±ÅÃÇϽʽÿÀ.",IDC_STATIC,4,7,200,8 - GROUPBOX "¼­¹ö ¸ð´ÏÅÍ",IDC_ADVANCED_GROUP,4,169,211,84 - LTEXT "´õ ºü¸¥ ¼º´ÉÀ» À§ÇØ ÀÌ ¼¿¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¼­¹öÀÇ ºÎºÐÁýÇÕ¸¸ ¸ð´ÏÅÍÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,10,182,199,17 - LTEXT "(Á¶È¸ Áß...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "¼¿À» °ü¸®ÇÏ·Á¸é, AFS ¾ÏÈ£¸¦ ´Ù½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.", - IDC_STATIC,10,85,196,8 - LTEXT "¼±ÅÃµÈ ¼¿¿¡ ÀÖ´Â ÇöÀç AFS ÅäÅ«:",IDC_STATIC,10,57,196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "°æ°í - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "ÀÛ¾÷ÀÌ Á¤»óÀûÀ¸·Î ¿Ï·áÇÒ ¶§±îÁö °è¼Ó ±â´Ù¸²(&C)", - IDC_TIMEOUT_WAIT,"Button",BS_AUTORADIOBUTTON,24,87,208, - 10 - CONTROL "ÀÛ¾÷À» Áö±Ý ÁߴܽÃÅ´(&T)",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,24,101,208,10 - DEFPUSHBUTTON "È®ÀÎ",IDOK,93,139,50,14 - LTEXT "ÀÛ¾÷À» ½ÇÇàÇÏ´Â µ¥ ¼Ò¿äµÈ ½Ã°£:",IDC_STATIC,4,119,140, - 10 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,151,120,38,8 - LTEXT "³×Æ®¿öÅ© ÀÛ¾÷ÀÌ ¿À·£ ½Ã°£µ¿¾È ¿Ï·áÇÏÁö ¸øÇϰí ÀÖ½À´Ï´Ù.", - IDC_STATIC,4,7,228,18 - LTEXT "ÀÛ¾÷ÀÌ Á¾·áµÉ ¶§±îÁö ±â´Ù¸®°Å³ª(±ÇÀå) ÀÛ¾÷ÀÌ ³¡³ªÁö ¾ÊÀ» °ÍÀ¸·Î ÆÇ´ÜµÉ °æ¿ì AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥À¸·Î ÀÛ¾÷À» ÁߴܽÃų ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,4,30,228,26 - LTEXT "ÇöÀçÀÇ Ã¢ÀÌ Ç¥½ÃµÇ´Â µ¿¾È¿¡´Â ÀÛ¾÷ÀÌ °è¼Ó ÁøÇà ÁßÀ̶ó´Â Á¡À» À¯ÀÇÇϽʽÿÀ. ÀÛ¾÷ÀÌ Á¾·áµÇ¸é â ÀÚµ¿À¸·Î ´ÝÈü´Ï´Ù.", - IDC_STATIC,4,63,228,17 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Ä÷³" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¸ñ·Ï ³ª¿­½Ã Ç¥½ÃÇÒ Ä÷³ ¼±ÅÃ(&S).",IDC_STATIC,5,7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "»ç¿ë°¡´ÉÇÑ Ä÷³(&C):",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Ç¥½ÃÇÒ Ä÷³(&I):",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Ãß°¡(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< Á¦°Å(&R)",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "À§·Î À̵¿(&U)",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "¾Æ·¡·Î À̵¿(&D)",IDC_COL_DOWN,224,122,50,14 - GROUPBOX "Ä÷³ Ç¥½Ã",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "»õ·Î °íħ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "0%% ¿Ï·á",IDC_REFRESH_PERCENT,4,49,209,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,208,8 - LTEXT "±â´Ù¸®½Ê½Ã¿À...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "°Ç³Ê¶Ù±â(&S)",IDC_REFRESH_SKIP,217,56,43,12,NOT - WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ÀÛ¼º" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "À̸§(&N):",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,46,28,116,14,ES_AUTOHSCROLL - LTEXT "ÇÒ´ç·®(&Q):",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,46,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,98,47,33,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¹é¾÷(&B):",IDC_STATIC,4,66,39,8 - CONTROL "ÀÌ º¼·ý¿¡ ´ëÇÑ ¹é¾÷ ¹öÀüµµ ÀÛ¼º(&R)",IDC_SET_CLONE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,45,67,162,8 - LTEXT "¼­¹ö(&S):",IDC_STATIC,4,84,39,8 - COMBOBOX IDC_SET_SERVER,46,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÆÄƼ¼Ç(&P):",IDC_STATIC,4,102,39,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,102,271, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È®ÀÎ",IDOK,156,191,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,211,191,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "»õ·Î¿î º¼·ý",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý »èÁ¦" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "Ãë¼Ò",IDCANCEL,169,84,50,14 - PUSHBUTTON "È®ÀÎ",IDOK,115,84,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,223,84,50,14 - CONTROL "%1 ¼­¹ö, %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý »èÁ¦(&D)", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 46,45,227,10 - CONTROL "%3 º¼·ý¿¡¼­ VLDB Ç׸ñ »èÁ¦(&V)",IDC_DELSET_VLDB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,46,60,227,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "ÁÖÀÇ!\n\n%3 º¼·ýÀ» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù.", - IDC_DELSET_DESC,31,7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¹é¾÷ º¼·ý - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,183,67,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,237,67,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "º¼·ý ¹é¾÷Àº ±× º¼·ýÀÇ Àбâ Àü¿ë »çº»Ã³·³ µ¿ÀÛÇÕ´Ï´Ù. Àбâ/¾²±â º¼·ý¿¡´Â ¹é¾÷ ¹öÀüÀÌ Çϳª¸¸ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,34,9,307,17 - LTEXT "È®ÀÎÀ» ´­·¯ %1 ¼­¹ö, %2 ÆÄƼ¼ÇÀÇ %3 º¼·ýÀÇ ¹é¾÷À» ÀÛ¼ºÇϽʽÿÀ. ÀÌ º¼·ýÀÇ ¹é¾÷ÀÌ ÀÌ¹Ì ÀÖÀ¸¸é, ±× ¹é¾÷ÀÌ °»½ÅµË´Ï´Ù.", - IDC_CLONE_DESC,34,32,307,24 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "¹ß°ßµÈ ¹®Á¦Á¡",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "button 1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%2 ¼­ºñ½º(%1 ¼­¹ö)",IDC_PROBLEM_TITLE,52,13,168,16 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "¾Ë·ÁÁø ¹®Á¦Á¡",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "button 1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "¾Ë·ÁÁø ¹®Á¦Á¡",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "button 1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%2 ÆÄƼ¼Ç(%1 ¼­¹ö)",IDC_PROBLEM_TITLE,38,14,214,8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "¾Ë·ÁÁø ¹®Á¦Á¡",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,250,45,12,67,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%3 º¼·ý(%1 ¼­¹ö, %2 ÆÄƼ¼Ç)",IDC_PROBLEM_TITLE,49,14, - 219,8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý À̵¿" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È®ÀÎ",IDOK,115,156,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,169,156,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "´ÙÀ½À¸·Î º¼·ý À̵¿(&M):",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý À̵¿ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "%3 º¼·ýÀ» %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %4 ¼­¹öÀÇ %5 ÆÄƼ¼ÇÀ¸·Î À̵¿ ÁßÀÔ´Ï´Ù...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "·Î±× ÆÄÀÏ º¸±â" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹öÀÇ ·Î±× ÆÄÀÏ º¸±â(&S):",IDC_STATIC,10,45,73,8 - COMBOBOX IDC_VIEWLOG_SERVER,89,43,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼­¹ö¿¡¼­ ¿­¶÷ÇÒ ÆÄÀÏ(&F):",IDC_STATIC,10,64,73,8 - EDITTEXT IDC_VIEWLOG_FILENAME,89,62,179,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,169,88,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,223,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,20,20 - LTEXT "¿­¶÷ÇÒ ÆÄÀÏÀÇ Àüü °æ·Î¸¦ ÀÔ·ÂÇϽʽÿÀ.", - IDC_VIEWLOG_DESC,31,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "·Î±× ÆÄÀÏ º¸±â" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÆÄÀÏ ³»¿ë:",IDC_SVC_VIEWLOG_CONTENTS,4,41,277,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "´Ù¸¥ À̸§À¸·Î ÀúÀå(&A)...",IDC_VIEWLOG_SAVEAS,145,167, - 81,14 - DEFPUSHBUTTON "´Ý±â(&C)",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "%1 ¼­¹öÀÇ ·Î±× ÆÄÀÏ [%2 ¼­ºñ½º¿¡ ´ëÇØ]", - IDC_SVC_VIEWLOG_DESC,33,7,248,8 - LTEXT "¼­¹ö¿¡¼­ÀÇ ÆÄÀÏ À̸§: %1",IDC_SVC_VIEWLOG_FILENAME,33, - 23,248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ÇÒ´ç·® ¼³Á¤" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "ÇöÀç ÇÒ´ç·®:",IDC_STATIC,4,49,47,8 - LTEXT "(¾Ë ¼ö ¾øÀ½)",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "»õ ÇÒ´ç·®(&Q):",IDC_STATIC,4,81,47,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "È®ÀÎ",IDOK,109,112,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,163,112,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,217,112,50,14 - PUSHBUTTON "Ư¼º(&P)...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "ÆÄƼ¼Ç:",IDC_STATIC,4,30,47,8 - LTEXT "%1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç",IDC_SET_AGGREGATE,59,30,141,8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "%1 º¼·ý",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "ÁøÇà ÁßÀÎ Á¶ÀÛ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "´ÙÀ½ Á¶ÀÛÀÌ ÇöÀç ÁøÇà ÁßÀÔ´Ï´Ù.",IDC_ACTION_DESC,2,2, - 232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "VLDB µ¿±âÈ­" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,107,81,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,161,81,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "(½ÇÇà Áß ¼³Á¤)",IDC_SYNC_DESC,37,4,228,32 - LTEXT "(½ÇÇà Áß ¼³Á¤)",IDC_SYNC_DESC2,37,44,228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý º¹Á¦" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È®ÀÎ",IDOK,115,153,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,169,153,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "%3 º¼·ýÀÇ »õ º¹Á¦º»",IDC_SET_NAME,31,12,242,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "´ÙÀ½¿¡¼­ ÀÌ º¼·ýÀÇ »õ º¹Á¦º» ÀÛ¼º(&C):",IDC_STATIC,4,35, - 125,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 248, 156 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÆÄÀÏ ¼³Ä¡" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¿øº» ÆÄÀÏ(&F):",IDC_STATIC,4,74,49,8 - EDITTEXT IDC_FILENAME,56,72,135,14,ES_AUTOHSCROLL - PUSHBUTTON "ã¾Æº¸±â(&B)...",IDC_BROWSE,194,72,50,14 - LTEXT "¸ñÇ¥ ¼­¹ö(&S):",IDC_STATIC,4,94,45,8 - COMBOBOX IDC_SERVER,56,92,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¸ñÇ¥ À̸§(&N):",IDC_STATIC,4,114,49,8 - EDITTEXT IDC_DIRECTORY,56,112,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,86,138,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,140,138,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,194,138,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,20,20 - LTEXT "¼­¹ö¿¡ ÆÄÀÏ ¼³Ä¡",IDC_STATIC,32,12,127,8 - LTEXT "(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)\n(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)\n(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)\n(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)", - IDC_INSTALL_DESC,4,29,240,33 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÆÄÀÏ ¼³Ä¡ ÇØÁ¦" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹ö(&S):",IDC_STATIC,4,66,31,8 - COMBOBOX IDC_SERVER,41,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¸ñÇ¥ ÆÄÀÏ(&F):",IDC_STATIC,4,85,32,8 - EDITTEXT IDC_FILENAME,41,83,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,88,121,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,141,121,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "¼­¹ö¿¡¼­ ÆÄÀÏ ¼³Ä¡¸¦ ÇØÁ¦ÇÕ´Ï´Ù",IDC_STATIC,32,12,127,8 - LTEXT "ÀÌ Á¶ÀÛÀ» »ç¿ëÇÏ¿© »çÀü¿¡ ¼³Ä¡µÈ ÆÄÀÏÀÇ »çº»À» ƯÁ¤ ¼­¹ö¿¡ º¹¿øÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼±ÅÃµÈ ÆÄÀÏÀÇ »çÀü ¼³Ä¡ »çº»ÀÌ ¾øÀ¸¸é, ÆÄÀÏÀº Á¦°ÅµË´Ï´Ù.", - IDC_STATIC,4,29,240,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 200, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÀÌÀü ÆÄÀÏ Á¤¸®" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹ö:",-1,4,56,44,8 - COMBOBOX IDC_SERVER,53,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "¸ðµç ÄÚ¾î ÆÄÀÏ »èÁ¦(&C)",IDC_OP_DELETE_CORE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,53,73,143,9 - CONTROL "¸ðµç .&BAK ÆÄÀÏ(ÆÄÀÏ ¹é¾÷) »èÁ¦",IDC_OP_DELETE_BAK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,84,143,8 - CONTROL "¸ðµç .OLD ÆÄÀÏ(ÀÌÀü ÆÄÀÏ ¹é¾÷) »èÁ¦(&O)", - IDC_OP_DELETE_OLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 53,96,143,9 - DEFPUSHBUTTON "È®ÀÎ",IDOK,39,123,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,93,123,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,146,123,50,14 - ICON IDI_PRUNE,-1,4,4,20,20 - LTEXT "¼­¹ö¿¡¼­ ÀÌÀü ÆÄÀÏÀ» Á¤¸®ÇÕ´Ï´Ù",-1,32,12,117,8 - LTEXT "ÀÌ Á¶ÀÛÀº ƯÁ¤ ¼­¹ö¿¡ ¼³Ä¡µÈ ÆÄÀÏÀÇ ¹é¾÷ »çº»À» »èÁ¦ÇÕ´Ï´Ù.", - -1,4,29,192,16 - LTEXT "»èÁ¦ÇÒ ÆÄÀÏ:",-1,4,73,45,8 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý À̸§ º¯°æ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÀÌÀü À̸§(&O):",IDC_STATIC,31,67,39,8 - EDITTEXT IDC_RENSET_OLD,74,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "»õ À̸§(&N):",IDC_STATIC,31,85,39,8 - EDITTEXT IDC_RENSET_NEW,74,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,115,115,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,169,115,50,14 - PUSHBUTTON "µµ¿ò¸»",9,223,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "%3 º¼·ýÀÇ À̸§À» º¯°æÇÏ·Á¸é, ¾Æ·¡¿¡ »õ À̸§À» ÀÔ·ÂÇϽʽÿÀ. À̸§À» º¯°æÇÏ¸é º¼·ýÀÇ ¹é¾÷ ¹× ±× º¹Á¦º»ÀÌ ¸ðµÎ ÀÚµ¿À¸·Î º¯°æµË´Ï´Ù.\n\nÁÖÀÇ: ¸¶¿îÆ®µÈ º¼·ýÀÇ À̸§À» º¯°æÇÒ °æ¿ì¿¡´Â ÇØ´ç ¸¶¿îÆ® Æ÷ÀÎÆ®¸¦ »èÁ¦ÇÏ°í ´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù.", - IDC_RENSET_DESC,31,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 294, 85 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­ºñ½º »èÁ¦" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "Ãë¼Ò",IDCANCEL,169,67,50,14 - PUSHBUTTON "È®ÀÎ",IDOK,115,67,50,14 - PUSHBUTTON "µµ¿ò¸»",9,240,67,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "ÁÖÀÇ!\n\nÀÌ Á¶ÀÛÀ¸·Î ÀÎÇØ %2 ¼­ºñ½º°¡ Á¤ÁöµÇ°í %1 ¼­¹ö·ÎºÎÅÍ »èÁ¦µË´Ï´Ù.", - IDC_DELSVC_DESC,48,7,242,37 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÆÄÀÏ ³¯Â¥ È®º¸" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹ö(&S):",-1,10,55,42,8 - COMBOBOX IDC_SERVER,66,56,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Á¶È¸ÇÒ ÆÄÀÏ(&F):",-1,10,75,53,8 - EDITTEXT IDC_FILENAME,66,72,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,86,107,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,140,107,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,21 - LTEXT "¼­¹ö¿¡¼­ ÆÄÀÏ ³¯Â¥¸¦ È®º¸ÇϽʽÿÀ",-1,32,12,127,8 - LTEXT "ÀÌ Á¶ÀÛÀ» ÅëÇØ ÆÄÀÏ ¹× ±× ¹é¾÷(ÀÖ´Â °æ¿ì)ÀÌ ÃÖÁ¾ ¼öÁ¤µÈ ³¯Â¥¸¦ È®º¸ÇÕ´Ï´Ù.", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÆÄÀÏ ³¯Â¥ È®º¸ - °á°ú" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹ö:",IDC_STATIC,10,31,39,8 - LTEXT "(½ÇÇà Áß ¼³Á¤)",IDC_SERVER,51,31,137,8 - LTEXT "ÆÄÀÏ À̸§:",IDC_STATIC,10,47,39,8 - LTEXT "(½ÇÇà Áß ¼³Á¤)",IDC_FILENAME,51,47,137,8 - LTEXT "ÆÄÀÏ ³¯Â¥:",IDC_STATIC,10,61,39,8 - LTEXT "(¾Ë ¼ö ¾øÀ½. ÆÄÀÏÀ» ãÀ» ¼ö ¾øÀ½)",IDC_DATE_FILE,51,61, - 184,8 - LTEXT ".BAK ³¯Â¥:",IDC_STATIC,10,77,39,8 - LTEXT "(¾Ë ¼ö ¾øÀ½. ÆÄÀÏÀ» ãÀ» ¼ö ¾øÀ½)",IDC_DATE_BAK,51,77, - 179,8 - LTEXT ".OLD ³¯Â¥:",IDC_STATIC,10,91,39,8 - LTEXT "(¾Ë ¼ö ¾øÀ½. ÆÄÀÏÀ» ãÀ» ¼ö ¾øÀ½)",IDC_DATE_OLD,51,91, - 180,8 - DEFPUSHBUTTON "´Ý±â(&C)",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "¼­¹ö¿¡¼­ ÆÄÀÏ ³¯Â¥¸¦ È®º¸ÇϽʽÿÀ",IDC_STATIC,32,12,127, - 8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 295, 144 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ´ýÇÁ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÀÛ¼ºµÉ ´ýÇÁ ÆÄÀÏ ÀÛ¼º(&N):",IDC_STATIC,4,42,77,8 - EDITTEXT IDC_DUMP_FILENAME,86,40,143,14,ES_AUTOHSCROLL - PUSHBUTTON "ã¾Æº¸±â(&B)...",IDC_DUMP_BROWSE,237,40,48,14 - CONTROL "%3 º¼·ýÀÇ Àüü ³»¿ë ´ýÇÁ(ÆÄƼ¼Ç %1:%2)(&E)", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,10, - 78,197,10 - CONTROL "´ÙÀ½ ÀÌÈÄ¿¡ º¯°æµÈ ÆÄÀϸ¸ ´ýÇÁ(&S)",IDC_DUMP_LIMIT_TIME, - "Button",BS_AUTORADIOBUTTON,10,94,141,10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,160,93,51, - 13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,218,93,56, - 13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È®ÀÎ",IDOK,131,126,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,185,126,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,241,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "ÀÌ Á¶ÀÛÀº º¼·ýÀÇ ³»¿ëÀ» ÇϳªÀÇ ÆÄÀÏ·Î º¹»çÇϹǷΠº¼·ýÀ» ½±°Ô ¹é¾÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·± ¹æ¹ýÀ¸·Î ´ýÇÁµÈ º¼·ýÀÇ ³»¿ëÀº ³ªÁß¿¡ º¹¿øµË´Ï´Ù.", - IDC_STATIC,30,7,261,24 - GROUPBOX "´ýÇÁ ¸Å°³º¯¼ö",IDC_STATIC,4,62,287,53 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý º¹¿ø - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "º¹¿øÇÒ ÆÄÀÏ(&R):",IDC_STATIC,4,33,48,8 - EDITTEXT IDC_RESTORE_FILENAME,57,30,175,14,ES_AUTOHSCROLL - PUSHBUTTON "ã¾Æº¸±â(&B)...",IDC_RESTORE_BROWSE,238,30,50,14 - CONTROL "ÁõºÐ ´ýÇÁ ÆÄÀÏÀÓ(&I)",IDC_RESTORE_INCREMENTAL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,57,46,86,10 - LTEXT "º¼·ý(&V):",IDC_STATIC,11,102,23,8 - EDITTEXT IDC_RESTORE_SETNAME,50,100,115,14,ES_AUTOHSCROLL - LTEXT "¼­¹ö(&S):",IDC_STATIC,11,145,24,8 - COMBOBOX IDC_RESTORE_SERVER,51,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÆÄƼ¼Ç(&P):",IDC_STATIC,11,162,36,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,50,161,231, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È®ÀÎ",IDOK,128,230,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,183,230,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,238,230,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "´ýÇÁ ÆÄÀϷκÎÅÍ º¼·ýÀ» º¹¿øÇϽʽÿÀ",IDC_STATIC,33,11, - 224,8 - GROUPBOX "¸ñÇ¥ º¼·ý",IDC_STATIC,4,63,284,160 - LTEXT "´ýÇÁ ÆÄÀϷκÎÅÍ º¼·ýÀ» º¹¿øÇÒ ¶§ »õ º¼·ýÀ» ÀÛ¼ºÇϰųª ±âÁ¸ÀÇ Àбâ/¾²±â º¼·ý¿¡ °ãÃľµ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,11,78,259,16 - LTEXT "(½ÇÇà Áß ¼³Á¤)\n(½ÇÇà Áß ¼³Á¤)",IDC_RESTORE_CREATE,51, - 119,229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - CONTROL "ÀÌ ¼­¹ö¿¡¼­ Á¤±âÀûÀ¸·Î ¸ðµç ¼­ºñ½º¸¦ Á¤ÁöÇÏ°í ´Ù½Ã ½ÃÀÛ(&P)", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 71,201,10 - LTEXT "Àç½ÃÀÛ(&R)",IDC_BOS_GENRES_DESC1,23,87,25,8 - COMBOBOX IDC_BOS_GENRES_DATE,54,84,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "½Ã°£(&A)",IDC_BOS_GENRES_DESC2,127,87,8,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,138, - 84,53,13,WS_EX_CLIENTEDGE - CONTROL "»õ ÀÌÁø ÆÄÀÏÀÇ °æ¿ì ¸ðµç ¼­ºñ½º¸¦ Á¤±âÀûÀ¸·Î °Ë»ç(&B)", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 151,201,10 - LTEXT "°Ë»ç(&S)",IDC_BOS_BINRES_DESC1,23,167,25,8 - COMBOBOX IDC_BOS_BINRES_DATE,54,164,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "½Ã°£(&T)",IDC_BOS_BINRES_DESC2,127,167,8,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,138, - 164,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "%2 ¼­ºñ½º(%1 ¼­¹ö)",IDC_SVC_NAME,46,13,174,8 - GROUPBOX "BOS ¼­ºñ½º",IDC_STATIC,5,27,215,175 - LTEXT "BOS ¼­ºñ½º¸¦ »ç¿ëÇÏ¿© ÀÌ ¼­¹öÀÇ ¸ðµç ¼­ºñ½º¸¦ Á¤±âÀûÀ¸·Î Á¤ÁöÇÏ°í ´Ù½Ã ½ÃÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù(BOS ¼­ºñ½º ÀÚü Æ÷ÇÔ).", - IDC_STATIC,11,45,200,18 - LTEXT "¶ÇÇÑ BOS ¼­ºñ½º¸¦ »ç¿ëÇÏ¿© ¼­¹öÀÇ ¸ðµç ¼­ºñ½º¸¦ Á¤±âÀûÀ¸·Î °Ë»çÇϰí ÀÌÁø ÆÄÀÏÀÌ °»½ÅµÈ ¼­ºñ½º¸¸ Á¤ÁöÇÏ°í ´Ù½Ã ½ÃÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,11,118,200,25 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ´ýÇÁ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "%3 º¼·ý¿¡¼­ %4 ´ýÇÁ ÆÄÀÏ ÀÛ¼º Áß...",IDC_DUMPSET_DESC,4, - 41,229,19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý º¹¿ø - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "%2 ´ýÇÁ ÆÄÀÏ¿¡¼­ %1 º¼·ý º¹¿ø Áß...", - IDC_RESTORESET_DESC,4,41,229,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 258, 163 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ¹é¾÷ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "ÀÌ ¼¿ÀÇ ¸ðµç º¼·ý¿¡ ´ëÇÑ ¹é¾÷ ¹öÀü ÀÛ¼º(&A)", - IDC_CLONE_ALL,"Button",BS_AUTORADIOBUTTON,30,46,214,10 - GROUPBOX " ",IDC_STATIC,23,68,231,67 - CONTROL "´ÙÀ½ ±âÁذú ÀÏÄ¡ÇÏ´Â º¼·ý¿¡ ´ëÇÑ ¹é¾÷¸¸ ÀÛ¼º(&O)", - IDC_CLONE_SOME,"Button",BS_AUTORADIOBUTTON,30,60,214,10 - CONTROL "¼­¹ö¿¡ ÀÖ´Â º¼·ý¸¸(&S):",IDC_CLONE_SVR_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,83,92,10 - COMBOBOX IDC_CLONE_SVR,152,82,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "ÆÄƼ¼Ç¿¡ ÀÖ´Â º¼·ý¸¸(&P):",IDC_CLONE_AGG_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,99,97,10 - COMBOBOX IDC_CLONE_AGG,152,98,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "´ÙÀ½À¸·Î ½ÃÀÛÇÏ´Â º¼·ý¸¸(&B):",IDC_CLONE_PREFIX_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,116,106,10 - EDITTEXT IDC_CLONE_PREFIX,152,115,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,95,145,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,149,145,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,204,145,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "º¼·ý ¹é¾÷Àº ±× º¼·ýÀÇ Àбâ Àü¿ë »çº»Ã³·³ µ¿ÀÛÇÕ´Ï´Ù. Àбâ/¾²±â º¼·ý¿¡´Â ÇϳªÀÇ ¹é¾÷ ¹öÀü¸¸ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.\n\nµ¿½Ã¿¡ Çϳª ÀÌ»óÀÇ º¼·ý¿¡ ´ëÇÑ ¹é¾÷ ¹öÀüÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,30,7,216,34 -END - -IDD_SUBSETS DIALOGEX 0, 0, 281, 182 -STYLE WS_POPUP | WS_CAPTION -CAPTION "¸ð´ÏÅ͵Ǵ ¼­¹ö" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "¼­ºê¼¼Æ® À̸§:",IDC_STATIC,12,77,56,8 - EDITTEXT IDC_SUBSET_NAME,74,75,106,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "¿­±â(&O)...",IDC_SUBSET_LOAD,185,75,39,14 - PUSHBUTTON "ÀúÀå(&S)...",IDC_SUBSET_SAVE,229,75,39,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "ÀüºÎ ¸ð´ÏÅÍÇÔ(&A)",IDC_SUBSET_ALL,211,122,57,14 - PUSHBUTTON "¸ð´ÏÅÍ ¾ÈÇÔ(&N)",IDC_SUBSET_NONE,211,140,57,14 - LTEXT "Å« ¼¿¿¡¼­ ÀÛ¾÷ÇÒ ¶§ ¼º´ÉÀ» Çâ»ó½ÃŰ·Á¸é ¹®Á¦Á¡À» ã±â À§ÇØ Æ¯Á¤ ¼­¹ö¸¦ ¸ð´ÏÅÍÇÏÁö ¸¶½Ê½Ã¿À. AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº ¸ð´ÏÅ͵ÇÁö ¾ÊÀº ¼­¹öÀÇ º¼·ý, ÆÄƼ¼Ç ¶Ç´Â ¼­ºñ½º¸¦ Ç¥½ÃÇÏÁö ¾Ê½À´Ï´Ù.", - IDC_STATIC,5,5,271,24 - LTEXT "¾ðÁ¦µçÁö ¼­¹ö¸¦ ¸ð´ÏÅÍ(¶Ç´Â ¸ð´ÏÅÍÇÏÁö ¾ÊÀ» ¼ö ÀÖÀ½)ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼­¹ö ¼­ºê¼¼Æ®¸¦ ÀÛ¼ºÇÏ¿© ¸ð´ÏÅÍÇÒ ¼­¹ö ¸ñ·ÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,37,271,18 - GROUPBOX "ÇöÀç ¼­ºê¼¼Æ®",IDC_STATIC,5,63,271,114 - LTEXT "¸ð´ÏÅÍÇÒ ¼­¹ö:",IDC_STATIC,12,95,60,8 -END - -IDD_SUBSET_LOADSAVE DIALOG DISCARDABLE 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(½ÇÇà Áß ¼³Á¤µÈ Á¦¸ñ)" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­ºê¼¼Æ® À̸§(&N):",1090,5,112,45,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,54,110,165,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "¿­±â(&O)",IDOK,226,110,50,14 - PUSHBUTTON "Ãë¼Ò(&L)",IDCANCEL,226,127,50,14 - CONTROL "List1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "ÀÌ ¼¿¿¡ ´ëÇØ Á¤ÀÇµÈ ¼­ºê¼¼Æ®:",IDC_STATIC,4,6,114,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ã±â ¸í·É" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "µµ¿ò¸» Ç¥½Ã(&H)",IDOK,147,38,67,14 - PUSHBUTTON "Ãë¼Ò(&C)",IDCANCEL,147,55,67,14 - LTEXT "ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇØ AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥À» »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸·Á¸é, ¾Æ·¡ÀÇ ¸í·ÉÇàÀ» ¼±ÅÃÇÏ°í µµ¿ò¸» Ç¥½Ã ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¿À·ù ÄÚµå ã±â" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¿À·ù ¹øÈ£(&E):",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "º¯È¯(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "´Ý±â(&C)",IDCANCEL,85,123,48,14 - LTEXT "(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "¿À·ù ÄÚµåÀÇ Àǹ̸¦ ¾Ë¾Æº¸·Á¸é, ¾Æ·¡¿¡ Äڵ带 ÀÔ·ÂÇϰí ""º¯È¯"" ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇÑ Á¤º¸" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ ¹öÀü 3.5",IDC_STATIC,33,8,163,8 - LTEXT "Copyright IBM Corporation 1989, 1999",IDC_STATIC,33,20, - 183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "´Ý±â(&C)",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼¿¿¡ ÀÖ´Â ¼­¹ö¸¦ Ž»ö ÁßÀÔ´Ï´Ù...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 279, 136 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - CONTROL "¼­¹öÀÇ ¿ÏÀüÇÑ µµ¸ÞÀÎ À̸§ Ç¥½Ã(¿¹: ""machine.company.com"")", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,5,269,10 - CONTROL "°ü¸® ÅäÅ« ¾øÀÌ ÀÛ¾÷ÇÏ´Â °æ¿ì, °æ°í Ç¥½Ã(&W)", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,19,269,10 - CONTROL "Ç×»ó ±× ¼­¹öÀÇ Æ¯¼º Ç¥½Ã",IDC_OPT_SVR_DBL_PROP,"Button", - BS_AUTORADIOBUTTON,21,50,253,10 - CONTROL "ºü¸¥ º¸±â ºÐÇÒ ¿µ¿ªÀÌ ¿­·Á ÀÖÀ» ¶§¸¸ ±× ¼­¹öÀÇ Æ¯¼º Ç¥½Ã", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON,21, - 63,253,10 - CONTROL "¾ðÁ¦³ª ±× ¼­¹ö¿¡ ´ëÇÑ Ã¢À» ¿­¾î ³õÀ½", - IDC_OPT_SVR_DBL_OPEN,"Button",BS_AUTORADIOBUTTON,21,75, - 253,10 - CONTROL "±× ¼­¹ö°¡ ¸ð´ÏÅ͵ǵµ·Ï ¼­¹ö â ¿­±â", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,107,253,10 - CONTROL "±× ¼­¹ö°¡ ¸ð´ÏÅ͵ÇÁö ¾Êµµ·Ï ¼­¹ö ⠴ݱâ", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,121,253,10 - LTEXT "¼­¹öÀÇ ¾ÆÀÌÄÜÀ» µÎ ¹ø ´©¸£´Â °æ¿ì",IDC_STATIC,5,38,269, - 8 - LTEXT "¼­¹ö ¼­ºê¼¼Æ®¸¦ »ç¿ë ÁßÀÌ°í ºü¸¥ º¸±â ºÐÇÒ ¿µ¿ªÀÌ ´ÝÈù °æ¿ì", - IDC_STATIC,5,95,269,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "¼­¹ö Ű Ãß°¡(&A)",IDC_KEY_ADD,72,160,65,14 - PUSHBUTTON "¼­¹ö Ű Á¦°Å(&R)",IDC_KEY_REMOVE,141,160,80,14 - LTEXT "¼­¹ö¿ë Ű:",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­¹ö Ű Ãß°¡" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¹öÀü:",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "°ª:",IDC_STATIC,7,58,21,8 - CONTROL "ÇØ´ç ¹®ÀÚ¿­ ¾Ïȣȭ:",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,43,58,73,10 - CONTROL "ÇØ´ç Ű »ç¿ë:",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,43,76,57,10 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "ÀÓÀǼ±ÅÃ(&R)",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "ÁÖÀÇ: ¼­¹ö¿¡ »õ ۸¦ Ãß°¡ÇÑ ÈÄ AFS °èÁ¤À» ¼öÁ¤ÇÏ¿© »õ ۸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¸çÄ¥ÀÌ Áö³ª¸é ÀÌÀü ¼­¹ö ۸¦ Á¦°ÅÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,99,267,18 - DEFPUSHBUTTON "È®ÀÎ",IDOK,116,129,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,170,129,50,14 - PUSHBUTTON "µµ¿ò¸»",9,224,129,50,14 - LTEXT "%1 ¼­¹ö¿¡ ´ëÇÑ »õ Ű",IDC_KEY_TITLE,43,14,181,8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 293, 149 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­ºñ½º ½ÃÀÛ/Á¤Áö" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,115,131,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,169,131,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,239,131,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,20,21 - LTEXT "È®ÀÎÀ» ´­·¯ %1 ¼­¹öÀÇ %2 ¼­ºñ½º¸¦ ½ÃÀÛ/Á¤ÁöÇϽʽÿÀ", - IDC_STARTSTOP_TEXT,47,12,242,9 - CONTROL "¿µ±¸(&P)(IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,37, - 81,226,10 - CONTROL "ÀÓ½Ã(&T)(IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,37, - 97,226,10 - GROUPBOX "¼­ºñ½º ½Ãµ¿",IDC_STATIC,33,32,256,78 - LTEXT "%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛÇÒ ¶§ ÀÚµ¿À¸·Î %2 ¼­ºñ½º¸¦ ½ÃÀÛÇϵµ·Ï(¶Ç´Â ÀÚµ¿À¸·Î ½ÃÀÛÇÏÁö ¾Êµµ·Ï) ÀÌ º¯°æ»çÇ×À» ¿µ±¸ÀûÀ¸·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù.", - IDC_STARTSTOP_STARTUP,38,45,245,28 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 259, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "½ÇÇà ¸í·É" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹ö(&S):",IDC_STATIC,10,56,38,8 - COMBOBOX IDC_SERVER,50,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¸í·É(&C):",IDC_STATIC,10,75,38,8 - EDITTEXT IDC_COMMAND,50,73,194,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,86,107,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,140,107,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,204,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "¼­¹ö¿¡¼­ ¸í·ÉÀ» ½ÇÇàÇÕ´Ï´Ù",IDC_STATIC,32,12,185,8 - LTEXT "ÀÌ Á¶ÀÛÀ» »ç¿ëÇÏ¿© ¿ø°Ý ¼­¹ö¿¡¼­ ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.\nÀÌ´Â ÁÖ·Î /etc/reboot ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ¿© ¼­¹ö¸¦ ´Ù½Ã ½ÃÀÛÇÒ ¶§ »ç¿ëµË´Ï´Ù.", - IDC_STATIC,4,29,250,16 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 248, 254 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý º¹¿ø - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­¹ö(&S):",IDC_STATIC,30,50,35,8 - COMBOBOX IDC_SERVER,67,48,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÆÄƼ¼Ç(&P):",IDC_STATIC,30,67,35,8 - COMBOBOX IDC_AGGREGATE,67,65,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "¸ðµç ÆÄƼ¼Ç º¹¿ø(&A)",IDC_AGGREGATE_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,163,67,81,10 - LTEXT "º¼·ý(&O):",IDC_STATIC,29,85,35,8 - COMBOBOX IDC_FILESET,67,83,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "¸ðµç º¼·ý º¹¿ø(&L)",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,163,85,79,10 - DEFPUSHBUTTON "È®ÀÎ",IDOK,85,108,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,139,108,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,194,108,50,14 - PUSHBUTTON "°í±Þ(&V) >>",IDC_ADVANCED,4,108,53,14 - LTEXT "Àӽà ÆÄÀÏ °æ·Î(&T):",IDC_STATIC,10,142,74,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,89,140,137,13,ES_AUTOHSCROLL - CONTROL "º´·Ä º¹¿ø Á¶ÀÛ(&R), ÇÁ·Î¼¼½º ¼ö:",IDC_SALVAGE_SIMUL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,157,119,10 - EDITTEXT IDC_SALVAGE_NUM,158,155,25,13,ES_AUTOHSCROLL - CONTROL "ÈÑ¼ÕµÈ º¼·ýÀ» º¹¿øÇÏÁö ¾Ê±â(&N)",IDC_SALVAGE_READONLY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,167,123,10 - CONTROL "Àбâ Á¶ÀÛÀ» ÀÛÀº ºí·ÏÀ¸·Î ³ª´®(&B)",IDC_SALVAGE_BLOCK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,177,139,10 - CONTROL "Ç¥½ÃµÈ ¸ðµç º¼·ýÀ» °­Á¦·Î º¹¿ø(&F)",IDC_SALVAGE_FORCE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,187,136,10 - CONTROL "µð·ºÅ丮 ±¸Á¶¸¦ °­Á¦·Î À籸¼º(&E)",IDC_SALVAGE_FIXDIRS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,197,123,10 - LTEXT "°á°ú ·Î±×ÀÇ ÆÄÀÏ À̸§(&L):",IDC_STATIC,10,211,77,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,92,210,137,13,ES_AUTOHSCROLL - CONTROL "°á°ú ·Î±×¿¡ ÈÑ¼ÕµÈ i-³ëµå ¸ñ·Ï Æ÷ÇÔ(&I)", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,224,203,10 - CONTROL "°á°ú ·Î±×¿¡ AFS¿¡ ¼ÓÇÑ ·çÆ® ¸ñ·Ï Æ÷ÇÔ(&W)", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,235,203,10 - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "ÀÌ Á¶ÀÛÀ¸·Î Çϳª ÀÌ»óÀÇ º¼·ý¿¡ ÀÖ´Â ¹®Á¦Á¡À» ¼öÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.\n\nÁÖ: Àüü ÆÄƼ¼Ç ¶Ç´Â ¼­¹ö¸¦ ÇÑ ¹ø¿¡ º¹¿øÇϸé, ¼­¹ö´Â ÀϽÃÀûÀ¸·Î ¿ÀÇÁ¶óÀÎÀÌ µË´Ï´Ù.", - IDC_STATIC,30,7,214,32 - GROUPBOX "°í±Þ º¹¿ø ¿É¼Ç",IDC_ADVANCED_GROUP,4,128,240,122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "º¼·ý º¹¿ø - °á°ú" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "´Ý±â(&C)",IDOK,232,160,50,14 - LTEXT "º¹¿ø Á¶ÀÛÀÇ °á°ú:",IDC_STATIC,4,33,277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "%1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ýÀ» º¹¿øÇÕ´Ï´Ù", - IDC_SALVAGE_TITLE,33,15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "º¼·ý ÇØÁ¦" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,115,84,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,169,84,50,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,223,84,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "ÀÌ Á¶ÀÛÀ¸·Î %3 º¼·ýÀÇ º¹Á¦º»À» °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿À·¡µÈ º¹Á¦º»À» °»½ÅÇϰųª ¸ðµç º¹Á¦º»À» °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_RELSET_DESC,31,7,242,26 - CONTROL "¿À·¡µÈ º¼·ýÀÇ º¹Á¦º»¸¸ °»½Å(&U)",IDC_RELSET_NORMAL, - "Button",BS_AUTORADIOBUTTON,46,41,173,10 - CONTROL "¿À·¡µÇÁö ¾Ê¾Ò¾îµµ ¸ðµç º¼·ýÀÇ º¹Á¦º» °»½Å(&A)", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,46,56,172, - 10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - PUSHBUTTON "È£½ºÆ® ¼­¹ö Ãß°¡(&A)",IDC_HOST_ADD,68,160,69,14 - PUSHBUTTON "È£½ºÆ® ¼­¹ö Á¦°Å(&R)",IDC_HOST_REMOVE,141,160,80,14 - LTEXT "¼­¹ö¿¡¼­ ÀνĵǴ µ¥ÀÌÅͺ£À̽º È£½ºÆ® ¼­¹ö:", - IDC_HOST_TITLE,5,7,216,8 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 225, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "È£½ºÆ® ¼­¹ö Ãß°¡" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "È£½ºÆ®(&H):",-1,31,55,26,8 - EDITTEXT IDC_ADDHOST_HOST,61,53,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,63,88,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,117,88,50,14 - ICON IDI_SERVER,-1,4,4,21,20 - LTEXT "%1 ¼­¹ö¿¡ ÀúÀåµÈ ¸ñ·Ï¿¡ µ¥ÀÌÅͺ£À̽º È£½ºÆ® ¼­¹ö¸¦ Ãß°¡Çϱâ·Î Çß½À´Ï´Ù.\n\n¾Æ·¡¿¡ »õ µ¥ÀÌÅͺ£À̽º È£½ºÆ® À̸§À» ÀÔ·ÂÇϽʽÿÀ.", - IDC_ADDHOST_DESC,31,10,190,34 - PUSHBUTTON "µµ¿ò¸»",9,171,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "¼­¹ö ÁÖ¼Ò º¯°æ" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "VLDB¿¡ ±â·ÏµÈ %1 ¼­¹ö¿ë IP ÁÖ¼Ò:",IDC_TITLE,4,4,200,8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "º¯°æ(&C)...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "È®ÀÎ",IDOK,46,97,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,100,97,50,14 - PUSHBUTTON "µµ¿ò¸»",9,154,97,50,14 - LTEXT "ÁÖ: ÆÄÀÏ ¼­¹ö°¡ ½ÃÀÛµÉ ¶§ VLDB¸¦ ÀÌ¿ëÇÏ¿© ÇöÀç IP ÁÖ¼Ò°¡ ÀÚµ¿À¸·Î µî·ÏµË´Ï´Ù.", - IDC_STATIC,4,64,200,18 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "IP ÁÖ¼Ò º¯°æ" -CLASS "AFSManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,61,51,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,115,51,50,14 - PUSHBUTTON "µµ¿ò¸»",9,169,51,50,14 - LTEXT "VLDB¿¡¼­ %1À»(¸¦) ¹Ù²Ü »õ IP ÁÖ¼Ò¸¦ ÀÔ·ÂÇϽʽÿÀ.", - IDC_TITLE,4,4,215,8 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,42,23, - 90,14 - LTEXT "ÁÖ¼Ò:",IDC_STATIC,4,26,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AVI -// - -AVI_SETMOVE AVI DISCARDABLE "Resource\\setmove.avi" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "%1 ¼­¹ö - °ü¸® ¸ñ·Ï" - IDS_TAB_SERVICES "¼­ºñ½º" - IDS_TAB_AGGREGATES "ÆÄƼ¼Ç" - IDS_TAB_FILESETS "º¼·ý" - IDS_SERVICE_NONESELECTED "º¼ ¼­¹ö¸¦ ¼±ÅÃÇϽʽÿÀ." - IDS_SERVICE_GOTSELECTED "¼­ºñ½º´Â %1 ¼­¹ö¿¡¼­ ÀÛ¾÷ÇÕ´Ï´Ù." - IDS_AGGREGATE_ALL "¸ðµç ¼­¹öÀÇ ÆÄƼ¼Ç:" - IDS_AGGREGATE_ONE "%1 ¼­¹öÀÇ ÆÄƼ¼Ç:" - IDS_FILESET_ALL "%1 ¼¿¿¡ ÀÖ´Â ¸ðµç º¼·ý:" - IDS_FILESET_ONE "%1 ¼­¹ö¿¡ ÀÖ´Â º¼·ý:" - IDS_SVR_LISTS_TAB "°ü¸® ¸ñ·Ï" - IDS_SVR_PROP_TITLE "%1 ¼­¹ö - Ư¼º" - IDS_SVR_GENERAL_TAB "ÀϹÝ" - IDS_SVR_SCOUT_TAB "¼³Á¤" - IDS_SERVER_TITLE "%1 ¼­¹ö - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "%2 ¼¿¿¡ ÀÖ´Â %1 ¼­¹ö:" - IDS_SVC_PROP_TITLE "%1 ¼­¹ö¿¡ ÀÖ´Â %2 ¼­ºñ½º - Ư¼º" - IDS_SVC_GENERAL_TAB "ÀϹÝ" - IDS_SVC_ADD_TITLE "¼­ºñ½º ÀÛ¼º" - IDS_SVC_ADD_TAB "¼­ºñ½º ÀÛ¼º" - IDS_AGG_PROP_TITLE "%1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç - Ư¼º" - IDS_AGG_GENERAL_TAB "ÀϹÝ" - IDS_SET_REP_TITLE "%1 º¼·ý - º¹Á¦" - IDS_SET_REPSITES_TAB "º¹Á¦ »çÀÌÆ®" - IDS_SET_PROP_TITLE "%1 º¼·ý - Ư¼º" - IDS_SET_GENERAL_TAB "ÀϹÝ" - IDS_SET_UNLOCKBTN "Áö±Ý Àá±ÝÇØÁ¦(&L)" - IDS_SET_LOCKBTN "Áö±Ý Àá±Ý(&L)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%2 ÇÒ´ç·® Áß %1 »ç¿ë(%3%%)" - IDS_USAGE_AGGREGATE "%2 ¿ë·® Áß %1 »ç¿ë(%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "°áÇÕÇÑ ÇÒ´ç·®" - IDS_SVRCOL_NAME "¼­¹ö" - IDS_SVRCOL_STATUS "»óÅÂ" - IDS_SETCOL_DATE_ACCESS "ÃÖÁ¾ ¾×¼¼½º" - IDS_SETCOL_DATE_BACKUP "ÃÖÁ¾ ¹é¾÷" - IDS_SVCCOL_NAME "¼­ºñ½º" - IDS_SVCCOL_TYPE "À¯Çü" - IDS_SVCCOL_PARAMS "¸Å°³º¯¼ö" - IDS_SVCCOL_STATUS "»óÅÂ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "ÃÖÁ¾ ½ÃÀÛ" - IDS_SVCCOL_DATE_STOP "ÃÖÁ¾ Á¤Áö" - IDS_SVCCOL_DATE_STARTSTOP "ÃÖÁ¾ ½ÃÀÛ/Á¤Áö" - IDS_SVCCOL_DATE_FAILED "ÃÖÁ¾ ½ÇÆÐ" - IDS_SVCCOL_LASTERROR "ÃÖÁ¾ Á¾·á ÄÚµå" - IDS_AGGCOL_NAME "ÆÄƼ¼Ç" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "ÀåÄ¡" - IDS_AGGCOL_USED "»ç¿ë" - IDS_AGGCOL_USED_PER "% »ç¿ë" - IDS_AGGCOL_FREE "»ç¿ë°¡´É(ÇÑ)" - IDS_AGGCOL_TOTAL "¿ë·®" - IDS_AGGCOL_STATUS "»óÅÂ" - IDS_SETCOL_NAME "º¼·ý" - IDS_SETCOL_TYPE "À¯Çü" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "ÀÛ¼º" - IDS_SETCOL_DATE_UPDATE "ÃÖÁ¾ °»½Å" - IDS_SETCOL_STATUS "»óÅÂ" - IDS_SETCOL_QUOTA_USED "»ç¿ë" - IDS_SETCOL_QUOTA_USED_PER "% »ç¿ë" - IDS_SETCOL_QUOTA_FREE "»ç¿ë°¡´É(ÇÑ)" - IDS_SETCOL_QUOTA_TOTAL "ÇÒ´ç·®" - IDS_TRYAGAINBTN "Àç½Ãµµ(&A)" - IDS_NO_CELL_SELECTED "(ÁöÁ¤µÈ ¼¿ÀÌ ¾øÀ½)" - IDS_NO_AFS_ID "(»ç¿ë°¡´ÉÇÑ ÅäÅ«ÀÌ ¾øÀ½)" - IDS_AFS_ID_WILLEXP "%1(%2¿¡ ¸¸±âµÇ´Â ÅäÅ«)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS - "±â´Ù¸®½Ê½Ã¿À. %1 ¼¿¿¡ ´ëÇÑ Á¤º¸¸¦ È®º¸ÇÏ´Â ÁßÀÔ´Ï´Ù..." - IDS_STATUS_NOALERTS "Ç¥ÁØ" - IDS_TITLE_BROWSE_USER "»ç¿ëÀÚ ¼±ÅÃ" - IDS_AGGTYPE_OTHER "¾Ë ¼ö ¾øÀ½(%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "%1 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý ÀÛ¼º Áß:%2" - IDS_ACTION_DELETEFILESET "%1 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý »èÁ¦ Áß:%2" - IDS_ACTION_MOVEFILESET "%1 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý À̵¿ Áß:%2" - IDS_ACTION_SETFILESETQUOTA "%3 º¼·ý¿¡ ´ëÇÑ ÇÒ´ç·® º¯°æ Áß" - IDS_SVCSTOP_DESC2 "È®ÀÎÀ» ´­·¯ ÀÌ ¼­ºñ½º¸¦ Á¤ÁöÇϽʽÿÀ." - IDS_SVCSTART_DESC2 "È®ÀÎÀ» ´­·¯ ÀÌ ¼­ºñ½º¸¦ ½ÃÀÛÇϽʽÿÀ." - IDS_SYNCVLDB_SVR_DESC "ÁÖÀÇ!\n\n°è¼Ó ÁøÇàÇϸé, AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº VLDB¸¦ ¼öÁ¤ÇÏ¿© %1 ¼­¹öÀÇ ¸ðµç ÆÄƼ¼Ç ³»¿ë°ú ÀÏÄ¡Çϵµ·Ï ¸¸µì´Ï´Ù." - IDS_SYNCVLDB_SVR_DESC2 "VLDB¿¡¼­ %1 ¼­¹öÀÇ ÆÄƼ¼Ç¿¡¼­ ÇöÀç ãÀ» ¼ö ¾ø´Â º¼·ýÀ» ¾ð±ÞÇϸé, ±× º¼·ý¿¡ ´ëÇÑ VLDB°¡ »èÁ¦µË´Ï´Ù." - IDS_SYNCVLDB_AGG_DESC "ÁÖÀÇ!\n\n°è¼Ó ÁøÇàÇϸé, AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº VLDB¸¦ ¼öÁ¤ÇÏ¿© %1 ¼­¹öÀÇ %2 ÆÄƼ¼ÇÀÇ ³»¿ë°ú ÀÏÄ¡Çϵµ·Ï ¸¸µì´Ï´Ù." - IDS_SYNCVLDB_AGG_DESC2 "VLDB¿¡¼­ ÀÌ ÆÄƼ¼Ç¿¡¼­ ÇöÀç ãÀ» ¼ö ¾ø´Â º¼·ýÀ» ¾ð±ÞÇϸé, ±× º¼·ý¿¡ ´ëÇÑ VLDB ÀÔ·Â Ç׸ñÀÌ »èÁ¦µË´Ï´Ù." - IDS_PROMPT_BROWSE_USER "»ç¿ëÀÚ:" - IDS_PREVIEWIN_BUTTON "<< ¹Ì¸®º¸±â(&P)" - IDS_PREVIEWOUT_BUTTON "¹Ì¸®º¸±â(&P) >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "»ç¿ëÀÚ" - IDS_TITLE_BROWSE_PRINCIPAL "°èÁ¤ ¼±ÅÃ" - IDS_TITLE_BROWSE_OWNGROUP "¼ÒÀ¯ÇÏ´Â ±×·ì ¼±ÅÃ" - IDS_PROMPT_BROWSE_PRINCIPAL "°èÁ¤:" - IDS_PROMPT_BROWSE_OWNGROUP "¼ÒÀ¯ÇÏ´Â ±×·ì:" - IDS_ACTION_CLONE "%3 º¼·ýÀÇ ¹é¾÷ ¹öÀü ÀÛ¼º Áß" - IDS_ACTION_CLONESYS "¿©·¯ º¼·ý ¹é¾÷ ÀÛ¼º Áß" - IDS_CLONESYS_FAILED "0x%2(%3) ¿À·ù·Î ÀÎÇØ %1 º¼·ýÀÇ ¹é¾÷À» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_SET_UNSPECIFIED "(¹ÌÁöÁ¤)" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "ÆÄÀÏ °è¼ö" - IDS_SET_DUMP_NAME "%1" - IDS_ACTION_DUMP "%3 º¼·ý ´ýÇÁ Áß(%1 ÆÄƼ¼Ç:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "ÆÄƼ¼Ç" - IDS_REFRESH_DESC_CELL "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼¿¿¡¼­ÀÇ ¼­¹ö »óŸ¦ ÆÇº° ÁßÀÔ´Ï´Ù. ÀÌ´Â ½Ã°£ÀÌ ¾à°£ °É¸± ¼ö ÀÖ½À´Ï´Ù..." - IDS_REFRESH_DESC_SERVER "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼­¹öÀÇ »óŸ¦ ÆÇº° ÁßÀÔ´Ï´Ù. ÀÌ´Â ½Ã°£ÀÌ ¾à°£ °É¸± ¼ö ÀÖ½À´Ï´Ù..." - IDS_REFRESH_CURRENT_CELL "ÇöÀç %1 ¼¿ Á¶»ç Áß" - IDS_REFRESH_CURRENT_SERVER "ÇöÀç %2 ¼­¹ö Á¶»ç Áß" - IDS_REFRESH_CURRENT_AGGREGATE "ÇöÀç %2 ¼­¹öÀÇ %3 ÆÄƼ¼Ç Á¶»ç Áß" - IDS_REFRESH_CURRENT_FILESET "ÇöÀç %2 ¼­¹ö, %3 ÆÄƼ¼ÇÀÇ %4 º¼·ý Á¶»ç Áß" - IDS_REFRESH_CURRENT_SERVICE "ÇöÀç ¼­¹ö %2ÀÇ %3 ¼­ºñ½º Á¶»ç Áß" - IDS_REFRESH_PERCENT "%1%% ¿Ï·á" - IDS_PROBLEMS "¹®Á¦Á¡" - IDS_SERVER_NO_PROBLEMS "ÀÌ ¼­¹ö¿¡´Â ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ¾ø½À´Ï´Ù." - IDS_SERVICE_NO_PROBLEMS "ÀÌ ¼­ºñ½º¿¡´Â ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ¾ø½À´Ï´Ù." - IDS_AGGREGATE_NO_PROBLEMS "ÀÌ ÆÄƼ¼Ç¿¡´Â ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ¾ø½À´Ï´Ù." - IDS_FILESET_NO_PROBLEMS "ÀÌ º¼·ý¿¡´Â ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ¾ø½À´Ï´Ù." - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB "ÇöÀç º¼·ý À§Ä¡ µ¥ÀÌÅͺ£À̽º(VLDB) Á¶»ç Áß" - IDS_FILESETTYPE_RW "Àбâ/¾²±â" - IDS_FILESETTYPE_RO "º¹Á¦º»" - IDS_FILESETTYPE_CLONE "¹é¾÷" - IDS_MOVESET_READWRITE "°è¼Ó ÁøÇàÇϸé %3 º¼·ýÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ ´Ù¸¥ À§Ä¡·Î À̵¿µË´Ï´Ù." - IDS_MOVESET_READONLY "°è¼Ó ÁøÇàÇϸé %3 º¹Á¦º»ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ ¾Æ·¡¿¡ ÁöÁ¤ÇÑ ÆÄƼ¼Ç¿¡ ÀÛ¼ºµÈ ¶Ç´Ù¸¥ º¼·ý º¹Á¦º»À¸·Î À̵¿µË´Ï´Ù." - IDS_SVC_START_TITLE "¼­ºñ½º ½ÃÀÛ" - IDS_SVC_STOP_TITLE "¼­ºñ½º Á¤Áö" - IDS_SERVICESTATUS_STARTING "ÀÌ ¼­ºñ½º´Â ÇöÀç ½ÃÀÛ ÁßÀÔ´Ï´Ù." - IDS_SERVICESTATUS_RUNNING "ÀÌ ¼­ºñ½º´Â ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_SERVICESTATUS_STOPPED "ÀÌ ¼­ºñ½º´Â ÇöÀç Á¤Áö ÁßÀÔ´Ï´Ù." - IDS_SERVICESTATUS_STOPPING "ÀÌ ¼­ºñ½º´Â ÇöÀç Á¤Áö ÁßÀÔ´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "ÀÌ ¼­ºñ½ºÀÇ »óŸ¦ ¾Ë ¼ö ¾ø½À´Ï´Ù." - IDS_SVC_RESTART_BUTTON "Á¤ÁöÇϰí Áö±Ý Àç½ÃÀÛ(&R)" - IDS_PROBLEM_BOX "¾Ë·ÁÁø ¹®Á¦Á¡(%1)" - IDS_VIEWLOG_DESC_NOFILE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¿¡ ´ëÇÑ ·Î±× ÆÄÀÏÀ» ãÁö ¸øÇß½À´Ï´Ù. ¾Æ·¡ÀÇ ¼­ºñ½º ·Î±× ÆÄÀÏ¿¡ ´ëÇÑ Àüü °æ·Î¸¦ ÀÔ·ÂÇϽʽÿÀ." - IDS_NO_GROUP "(¼ÒÀ¯ÇÏ´Â ±×·ì ¾øÀ½)" - IDS_VIEWLOG_FROMSERVER "%1 ¼­¹öÀÇ ·Î±× ÆÄÀÏ" - IDS_VIEWLOG_FROMSERVICE "%1 ¼­¹öÀÇ %2 ¼­ºñ½º¿¡ ´ëÇÑ ·Î±× ÆÄÀÏ" - IDS_VIEWLOG_TRUNCATED "ÆÄÀÏ ³»¿ë(ÃÖÁ¾ %1 Çุ Ç¥½Ã):" - IDS_SAVELOG_FILTER "ÅØ½ºÆ® ÆÄÀÏ|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< °í±Þ(&A)" - IDS_ADVANCEDOUT_BUTTON "°í±Þ(&A) >>" - IDS_REPTYPE_RELEASE "º¹Á¦º» ÇØÁ¦" - IDS_REPTYPE_SCHEDULED "½ºÄÉÁìµÈ º¹Á¦" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "¸ðµÎ °»½Å(&U)" - IDS_UPDATETHIS_BUTTON "°»½Å(&U)" - IDS_SERVER_MULTIPLE_PROBLEMS - "ÀÌ ¼­¹ö¿¡´Â %1°³ÀÇ ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù." - IDS_SERVICE_MULTIPLE_PROBLEMS - "ÀÌ ¼­ºñ½º¿¡´Â %1°³ÀÇ ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù." - IDS_AGGREGATE_MULTIPLE_PROBLEMS - "ÀÌ ÆÄƼ¼Ç¿¡´Â %1°³ÀÇ ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù." - IDS_FILESET_MULTIPLE_PROBLEMS - "ÀÌ º¼·ý¿¡´Â %1°³ÀÇ ¾Ë·ÁÁø ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù." - IDS_FILESETTYPE_RO_STAGE "º¹Á¦º»" - IDS_SERVICETYPE_SIMPLE_LONG "°£´Ü(¿¬¼Ó ½ÇÇà)" - IDS_SERVICETYPE_CRON_LONG "Å©·Ð(ƯÁ¤ °£°Ý ½ÇÇà)" - IDS_QUOTAUNITS_KB "KB" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "(ÀÌ º¼·ýÀº º¹Á¦º»À̹ǷΠÇÒ´ç·®ÀÌ ¾ø½À´Ï´Ù)" - IDS_NO_QUOTA_CLONE "(ÀÌ º¼·ýÀº ¹é¾÷À̹ǷΠÇÒ´ç·®ÀÌ ¾ø½À´Ï´Ù)" - IDS_USAGE_REPLICA "%1 »ç¿ë" - IDS_USAGE_CLONE "%1 »ç¿ë" - IDS_COL_AGGS_MOVE "º¼·ý ÀÛ¼º½Ã ÆÄƼ¼Ç" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "%1 ¼­¹öÀÇ ÆÄƼ¼Ç:" - IDS_AGGREGATES_IN_CELL "%1 ¼¿¿¡¼­ÀÇ ¸ðµç ÆÄƼ¼Ç:" - IDS_AGGREGATES_IN_NOTHING "ÆÄƼ¼Ç:" - IDS_FILESETS_IN_SERVER "%1 ¼­¹ö¿¡ ÀÖ´Â º¼·ý:" - IDS_FILESETS_IN_CELL "%1 ¼¿¿¡ ÀÖ´Â ¸ðµç º¼·ý:" - IDS_FILESETS_IN_NOTHING "º¼·ý:" - IDS_SERVICES_IN_SERVER "%1 ¼­¹ö¿¡ ÀÖ´Â ¼­ºñ½º:" - IDS_SERVICES_IN_NOTHING "¼­ºñ½º:" - IDS_UNKNOWN "(¾Ë ¼ö ¾øÀ½)" - IDS_UNKNOWN_GROUP "#%1 ±×·ì(À̸§À» ¾Ë ¼ö ¾øÀ½)" - IDS_AGGFULL_WARN_OFF "±âº» ÀÓ°è°ª(¼­¹ö¿¡¼­ °æ°í »ç¿ë ºÒ°¡´É)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "±âº» ÀÓ°è°ª(¼­¹ö¿¡¼­ °æ°í »ç¿ë ºÒ°¡´É)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - %2 Á¾·á ÄÚµå" - IDS_COL_SERVERS "¼¿ÀÇ ¼­¹ö" - IDS_COL_FILESETS "¼­¹öÀÇ º¼·ý" - IDS_COL_AGGREGATES "¼­¹öÀÇ ÆÄƼ¼Ç" - IDS_COL_SERVICES "¼­¹öÀÇ ¼­ºñ½º" - IDS_COL_REPLICAS "º¼·ýÀÇ º¹Á¦º»" - IDS_COLUMNS_TITLE "Ä÷³ Ç¥½Ã ¼±Åà - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_REPCOL_SERVER "¼­¹ö" - IDS_REPCOL_AGGREGATE "ÆÄƼ¼Ç" - IDS_REPCOL_DATE_UPDATE "ÃÖÁ¾ °»½Å" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "º¼·ý À̵¿½Ã ÆÄƼ¼Ç" - IDS_WARN_TITLE "ÁÖÀÇ" - IDS_WARN_DISABLE_AUTH """ºñÀÎÁõ Çã¿ë"" ´ÜÃ߸¦ ´­·¯ ÀÎÁõµÇÁö ¾ÊÀº °èÁ¤¿¡¼­ ÀÌ ¼­¹öÀÇ ¼­ºñ½º¸¦ ó¸®ÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¹Àº ¼­ºñ½º°¡ ·çÆ® ½Äº°ÇÏ¿¡¼­ ½ÇÇàµÇ¹Ç·Î ÀÌ Á¶Ä¡´Â +" - IDS_WARN_DISABLE_AUTH2 "¼­¹ö º¸¾È¸é¿¡¼­ °áÁ¤ÀûÀÎ ÇêÁ¡À» µå·¯³À´Ï´Ù.\n\nº¯°æÇϽðڽÀ´Ï±î?" - IDS_SVR_NO_ADDR "(¹ÌÁöÁ¤)" - IDS_TITLE_BAD_CELL "ÀνĵÇÁö ¾ÊÀº ¼¿ À̸§" - IDS_DESC_BAD_CELL "ÀÔ·ÂÇÑ ¼¿ À̸§À» ³×Æ®¿öÅ©¿¡¼­ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\nÀÔ·Â Ç׸ñÀÌ ¸Â´ÂÁö ´Ù½Ã È®ÀÎÇϽʽÿÀ." - IDS_AGGFULL_WARN_ON "ÀÌ ¼­¹öÀÇ ±âº» ÀÓ°è°ª(&D)(±× Å©±âÀÇ %1%%)" - IDS_SETFULL_WARN_ON "ÀÌ ¼­¹öÀÇ ±âº» ÀÓ°è°ª(&D)(±× Å©±âÀÇ %1%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "ÀÔ·ÂÇÑ AFS ½Äº°À» ÀνÄÇÒ ¼ö ¾ø°Å³ª ÁöÁ¤ÇÑ ¾ÏÈ£°¡ Ʋ·È½À´Ï´Ù." - IDS_SVR_CREDS_NONE "(ÅäÅ« ¾øÀ½)" - IDS_SVR_CREDS_VALID "%2, %3 ¸¸±â" - IDS_SVR_CREDS_EXPIRED "(ÅäÅ« %3 ¸¸±â)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1(°áÇÕµÈ ÇÒ´ç·®: %2)" - IDS_ACTION_DESC_NONE "ÁøÇà ÁßÀÎ Á¶ÀÛÀÌ ¾ø½À´Ï´Ù." - IDS_ACTION_DESC_ONE "´ÙÀ½ Á¶ÀÛÀÌ ÇöÀç ÁøÇà ÁßÀÔ´Ï´Ù." - IDS_ACTION_DESC_MULT "´ÙÀ½ Á¶ÀÛÀÌ ÇöÀç ÁøÇà ÁßÀÔ´Ï´Ù." - IDS_ACTCOL_OPERATION "Á¶ÀÛ" - IDS_ACTCOL_ELAPSED "°æ°úµÈ ½Ã°£" - IDS_ACTION_REFRESH "¼¿ Á¤º¸ »õ·Î °íÄ¡´Â Áß" - IDS_ACTION_CREATESERVER "%1 ¼­¹ö ÀÛ¼º Áß" - IDS_ACTION_DELETESERVER "%1 ¼­¹ö »èÁ¦ Áß" - IDS_ACTION_GETSERVERLOGFILE "%1 ¼­¹ö¿¡¼­ %2 ·Î±× ÆÄÀÏ È®º¸ Áß" - IDS_ACTION_SETSERVERAUTH "%1 ¼­¹ö¿¡ ´ëÇÑ ¾×¼¼½º Á¦ÇÑ º¯°æ Áß" - IDS_ACTION_CHANGESERVERSTATUS "%1 ¼­¹öÀÇ Æ¯¼º º¯°æ Áß" - IDS_ACTION_STARTSERVICE "%1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º ½ÃÀÛ Áß" - IDS_ACTION_STOPSERVICE "%1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º Á¤Áö Áß" - IDS_ACTION_RESTARTSERVICE "%1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º ´Ù½Ã ½ÃÀÛ Áß" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "VLDB ¹× %1 ¼­¹öÀÇ µ¿±âÈ­" - IDS_ACTION_SYNCVLDB_AGG "VLDB ¹× %1 ÆÄƼ¼ÇÀÇ µ¿±âÈ­:%2" - IDS_ACTION_SCOUT "¹®Á¦°¡ ÀÖ´ÂÁö %1 ¼­¹ö È®ÀÎ Áß" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "%3 º¼·ý¿¡ ´ëÇÑ º¹Á¦ Ư¼º º¯°æ Áß" - IDS_ACTION_CREATEREPLICA "%1 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ýÀÇ º¹Á¦º» ÀÛ¼º Áß:%2" - IDS_DELSET_REPLICA_DESC "ÁÖÀÇ!\n\n°è¼Ó ÁøÇàÇϸé, %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ýÀÇ º¹Á¦º»ÀÌ Á¦°ÅµË´Ï´Ù." - IDS_DELSET_CLONE_DESC "ÁÖÀÇ!\n\n°è¼Ó ÁøÇàÇϸé, %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý ¹é¾÷ÀÌ Á¦°ÅµË´Ï´Ù." - IDS_INSTALL_DESC1 "ÀÌ Á¶ÀÛÀº ÀÌ ÄÄÇ»ÅÍÀÇ ÆÄÀÏÀ» ¶Ç ´Ù¸¥ ÄÄÇ»ÅÍ·Î º¹»çÇÕ´Ï´Ù. +" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "ÆÄÀÏÀÌ ¸ñÇ¥ ÄÄÇ»ÅÍ¿¡ ÀÌ¹Ì Á¸ÀçÇϸé, ¹é¾÷µÇ°í .BAK È®ÀåÀÚ°¡ ºÎ¿©µË´Ï´Ù. ±âÁ¸ÀÇ ¸ðµç ¹é¾÷¿¡´Â .OLD È®ÀåÀÚ°¡ ºÎ¿©µÇ°í ±âÁ¸ÀÇ .OLD ÆÄÀÏÀº »èÁ¦µË´Ï´Ù." - IDS_ACTION_INSTALLFILE "%1 ¼­¹ö¿¡ %2 ÆÄÀÏ ¼³Ä¡ Áß" - IDS_ACTION_UNINSTALLFILE "%1 ¼­¹ö¿¡¼­ %2 ÆÄÀÏ ¼³Ä¡ÇØÁ¦ Áß" - IDS_ACTION_PRUNEFILES "%1 ¼­¹ö¿¡¼­ ÆÄÀÏ Á¤¸® Áß" - IDS_FILTER_ALLFILES "¸ðµç ÆÄÀÏ|*.*|" - IDS_ACTION_RENAMEFILESET "º¼·ý À̸§À» %1¿¡¼­ %2(À¸)·Î º¯°æ Áß" - IDS_RECUR_DAILY "¸ÅÀÏ" - IDS_RECUR_SUNDAY "ÀÏ¿äÀϸ¶´Ù" - IDS_RECUR_MONDAY "¿ù¿äÀϸ¶´Ù" - IDS_RECUR_TUESDAY "È­¿äÀϸ¶´Ù" - IDS_RECUR_WEDNESDAY "¼ö¿äÀϸ¶´Ù" - IDS_RECUR_THURSDAY "¸ñ¿äÀϸ¶´Ù" - IDS_RECUR_FRIDAY "±Ý¿äÀϸ¶´Ù" - IDS_RECUR_SATURDAY "Åä¿äÀϸ¶´Ù" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "%1 ¼­¹ö¿¡ %2 ¼­ºñ½º ÀÛ¼º Áß" - IDS_ACTION_DELETESERVICE "%1 ¼­¹ö·ÎºÎÅÍ %2 ¼­ºñ½º »èÁ¦ Áß" - IDS_ACTION_RELEASEFILESET "%3 º¼·ý ÇØÁ¦ Áß" - IDS_ACTION_GETDATES "%1 ¼­¹ö¿¡¼­ %2 ÆÄÀÏ¿¡ ´ëÇÑ ³¯Â¥ È®º¸ Áß" - IDS_LASTMODIFIED "%1 ÃÖÁ¾ ¼öÁ¤" - IDS_SVR_SECURITY_TITLE "¼­¹ö º¸¾È - %1" - IDS_SVR_LIST_TAB "°ü¸®ÀÚ" - IDS_ACTION_ADMINLIST_LOAD "%1 ¼­¹ö¿¡ ´ëÇÑ °ü¸®ÀÚ È®º¸ Áß" - IDS_ACTION_ADMINLIST_SAVE "%1 ¼­¹ö¿¡ ´ëÇÑ °ü¸®ÀÚ ±â·Ï Áß" - IDS_ADMCOL_PRINCIPAL "±¸¼º¿ø" - IDS_ADMCOL_TYPE "À¯Çü" - IDS_ADMCOL_TYPE_GROUP "±×·ì" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "%1 º¼·ý º¹¿ø Áß" - IDS_COL_AGGS_RESTORE "º¼·ý º¹¿ø½Ã ÆÄƼ¼Ç" - IDS_RESTORE_FILTER "º¼·ý ´ýÇÁ ÆÄÀÏ|*.DMP|¸ðµç ÆÄÀÏ|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "%1 ¼­¹ö¿¡ ´ëÇÑ ¼­ºñ½º Àç½ÃÀÛ ½Ã°£ º¯°æ Áß" - IDS_RESTORE_CREATESET "%1 º¼·ýÀº ¾Æ·¡¿¡ ÁöÁ¤ÇÑ ¼­¹ö ¹× ÆÄƼ¼Ç¿¡ ÀÛ¼ºµË´Ï´Ù." - IDS_RESTORE_OVERWRITESET - "ÁÖÀÇ! %3 º¼·ýÀº %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ ÀÖÀ¸¸ç, °è¼Ó ÁøÇàÇϸé, °ãÃľ²¿©Áý´Ï´Ù." - IDS_SUBSET_TITLE_LOAD "¼­¹ö ¼­ºê¼¼Æ® ¿­±â" - IDS_SUBSET_TITLE_SAVE "¼­¹ö ¼­ºê¼¼Æ® ÀúÀå" - IDS_BUTTON_OPEN "¿­±â(&O)" - IDS_BUTTON_SAVE "ÀúÀå(&S)" - IDS_SUBSET_SAVE_TITLE "ÁÖÀÇ" - IDS_SUBSET_SAVE_DESC "¼­¹ö ¼­ºê¼¼Æ®´Â ÀÌ¹Ì %1(ÀÌ)¶ó´Â À̸§À¸·Î Á¸ÀçÇÕ´Ï´Ù.\n\nÀÌ ¼­ºê¼¼Æ®¿¡ °ãÃľ²½Ã°Ú½À´Ï±î?" - IDS_SUBSET_CHANGED "%1 [¼öÁ¤µÊ]" - IDS_SUBSET_TAB "¸ð´ÏÅ͵Ǵ ¼­¹ö" - IDS_SUBSET_DISCARD_TITLE "¼­ºê¼¼Æ® ÀúÀå?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "ÇöÀç ¸ð´ÏÅ͵Ǵ ¼­¹ö ¸ñ·ÏÀ» ¼­ºê¼¼Æ®·Î ÀúÀåÇÏÁö ¾Ê¾Ò½À´Ï´Ù. ÀÌ ¸ñ·ÏÀ» ÀúÀåÇϸé, ³ªÁß¿¡ µ¿ÀÏÇÑ ¼­¹ö ¼¼Æ®¸¦ °è¼Ó ¸ð´ÏÅÍÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "ÇöÀç ¸ð´ÏÅ͵Ǵ ¼­¹ö ¸ñ·ÏÀ» Æ÷ÇÔÇÒ ¼­ºê¼¼Æ®¸¦ ÀÛ¼ºÇϽðٽÀ´Ï±î?" - IDS_SUBSET_NONAME "(Á¦¸ñ ¾øÀ½)" - IDS_SUBSET_NOSUBSET "(¸ðµç ¼­¹ö°¡ ¸ð´ÏÅ͵ǰí ÀÖ½À´Ï´Ù)" - IDS_SUBSET_SERVERSUBSET "%1 ¼­¹ö" - IDS_FILESET_SOME "%1 ¼¿¿¡¼­ ¸ð´ÏÅ͵Ǵ ¸ðµç ¼­¹öÀÇ º¼·ý:" - IDS_AGGREGATE_SOME "%1 ¼¿¿¡¼­ ¸ð´ÏÅ͵Ǵ ¸ðµç ¼­¹öÀÇ ÆÄƼ¼Ç:" - IDS_SERVICE_SOME "%1 ¼¿¿¡¼­ ¸ð´ÏÅ͵Ǵ ¸ðµç ¼­¹öÀÇ ¼­ºñ½º:" - IDS_FILESET_UNMON "%1 ¼­¹ö´Â ¸ð´ÏÅ͵ǰí ÀÖÁö ¾Ê½À´Ï´Ù" - IDS_AGGREGATE_UNMON "%1 ¼­¹ö´Â ¸ð´ÏÅ͵ǰí ÀÖÁö ¾Ê½À´Ï´Ù" - IDS_SERVICE_UNMON "%1 ¼­¹ö´Â ¸ð´ÏÅ͵ǰí ÀÖÁö ¾Ê½À´Ï´Ù" - IDS_SUBSET_DELETE_TITLE "¼­ºê¼¼Æ® »èÁ¦?" - IDS_SUBSET_DELETE_DESC "%1 ¼­¹ö ¼­ºê¼¼Æ®¸¦ »èÁ¦ÇϽðڽÀ´Ï±î?" - IDS_ERROR_TRANSLATED "¿À·ù ¹øÈ£ 0x%1(%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "¿À·ù ¹øÈ£ 0x%1(%2)Àº(´Â) ÀνĵÇÁö ¾Ê½À´Ï´Ù." - IDS_FIND_NOTHING_TITLE "¼±ÅÃµÈ ¸í·É ¾øÀ½" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "Á¶ÀÛ ¼öÇà ¹æ¹ýÀ» ¾Ë¾Æº¸·Á¸é, ¸ÕÀú ¸ñ·Ï¿¡¼­ ¸í·ÉÇàÀ» ¼±ÅÃÇϰųª Ű¿öµå¸¦ ÀÔ·ÂÇϽʽÿÀ." - IDS_FIND_UNKNOWN_TITLE "¾Ë ¼ö ¾ø´Â ¸í·É" - IDS_FIND_UNKNOWN_DESC "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ ""%1"" ¸í·É¿¡ ´ëÇÑ µµ¿ò¸» ÁÖÁ¦¸¦ ãÁö ¸øÇß½À´Ï´Ù." - IDS_HELPABOUT_DESC1 "°æ°í: ÀÌ ÄÄÇ»ÅÍ ÇÁ·Î±×·¥Àº ÀúÀÛ±Ç ¹× ±¹Á¦ Çù¾à¿¡ ÀÇÇØ º¸È£µË´Ï´Ù." - IDS_HELPABOUT_DESC2 "Çã°¡ ¾øÀÌ ÀÌ ¼ÒÇÁÆ®¿þ¾î¸¦ Àç»ý»êÇϰųª ºÐ¹èÇÏ¸é ½É°¢ÇÑ ¹Î»ç ¹× Çü»ç »ç°ÇÀ» ÀÏÀ¸Å³ ¼ö ÀÖÀ¸¸ç ¹ýÀÌ Çã¿ëÇÏ´Â ¹üÀ§ ³»¿¡¼­ ÃÖ´ëÀÇ Ã³¹úÀ» ¹Þ°Ô µË´Ï´Ù.\n\n+" - IDS_HELPABOUT_DESC3 "AFS´Â IBM»ç Transarc CorporationÀÇ µî·Ï»óÇ¥ÀÔ´Ï´Ù." - IDS_CANT_QUIT_TITLE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_CANT_QUIT_REBOOT "ÁÖÀÇ!\n\nAFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº ÇöÀç Çϳª ÀÌ»óÀÇ Á¶ÀÛÀ» ¼öÇà ÁßÀÔ´Ï´Ù. Windows¸¦ Áö±Ý Á¾·áÇϸé, ½ÇÇà ÁßÀÎ Á¶ÀÛÀ» ³¡³¾ ¼ö ¾ø½À´Ï´Ù.\n\nWindows¸¦ ´Ù½Ã ½ÃÀÛÇϽðڽÀ´Ï±î?" - IDS_APP_TITLE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_ACTION_OPENCELL "%1 ¼¿¿¡¼­ ¼­¹ö ã´Â Áß" - IDS_OPTIONS_TITLE "¿É¼Ç - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_OPTIONS_GENERAL_TAB "ÀϹÝ" - IDS_BADCREDS_DESC "°ü¸®ÀÚ·Î ·Î±×ÀÎÇÏÁö ¾ÊÀ¸¸é %1 ¼¿À» °ü¸®ÇÏ´Â µ¥ ÇÊ¿äÇÑ Æ¯±ÇÀÌ ºÎÁ·ÇÕ´Ï´Ù. ¾×¼¼½º Ư±ÇÀÌ ºÎÁ·ÇÏ°Ô µÇ¸é, AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº ¹®Á¦°¡ ¾øÀ» °æ¿ì¿¡µµ ¼¿¿¡¼­ ¹®Á¦Á¡À» ã°Ô µË´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "È®ÀÎ - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_NO_GROUP_CHECKBOX "¼ÒÀ¯ÇÏ´Â ±×·ì ¾øÀ½" - IDS_AFS_ID_DIDEXP "%1(%2¿¡ ¸¸±âµÇ´Â ÅäÅ«)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(Á¶È¸ Áß)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "¿Ü·¡ ±×·ì" - IDS_ADMCOL_TYPE_FOREIGN_USER "¿Ü·¡ »ç¿ëÀÚ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "ÁöÁ¤ÀÚ" - IDS_SVC_NONOTIFIER "(¾øÀ½)" - IDS_SVR_KEY_TAB "¼­¹ö Ű" - IDS_KEYNAME_NOTIME "%1 ¼­¹ö¿¡ ´ëÇÑ Å°:" - IDS_KEYNAME_WITHTIME "%1 ¼­¹ö¿¡ ´ëÇÑ Å°(%2 ¼öÁ¤)" - IDS_SVRKEY_VERSION "¹öÀü" - IDS_SVRKEY_DATA "°ª" - IDS_SVRKEY_CHECKSUM "üũ¼¶" - IDS_SVRKEY_DATA_UNKNOWN "(¼û°ÜÁü)" - IDS_STARTSERVICE_TITLE "¼­ºñ½º ½ÃÀÛ" - IDS_STOPSERVICE_TITLE "¼­ºñ½º Á¤Áö" - IDS_STARTSERVICE_TEXT "È®ÀÎÀ» ´­·¯ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ ½ÃÀÛÇϽʽÿÀ." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "È®ÀÎÀ» ´­·¯ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ Á¤ÁöÇϽʽÿÀ." - IDS_STARTSERVICE_STARTUP - "%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛµÉ ¶§ ÀÚµ¿À¸·Î %2 ¼­ºñ½º¸¦ ½ÃÀÛÇϵµ·Ï ÀÌ º¯°æ»çÇ×À» ¿µ±¸ÀûÀ¸·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù." - IDS_STOPSERVICE_STARTUP "%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛÇÒ ¶§ ÀÚµ¿À¸·Î %2 ¼­ºñ½º¸¦ ½ÃÀÛÇÏÁö ¾Êµµ·Ï ÀÌ º¯°æ»çÇ×À» ¿µ±¸ÀûÀ¸·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù." - IDS_STARTSERVICE_PERMANENT - "¿µ±¸(&P)(%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛµÉ ¶§ %2 ¼­ºñ½º ½ÃÀÛ)" - IDS_STARTSERVICE_TEMPORARY - "ÀÓ½Ã(&T)(%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛµÉ ¶§ %2 ¼­ºñ½º¸¦ ½ÃÀÛÇÏÁö ¾ÊÀ½)" - IDS_STOPSERVICE_PERMANENT - "¿µ±¸(&P)(%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛµÉ ¶§ %2 ¼­ºñ½º¸¦ ½ÃÀÛÇÏÁö ¾ÊÀ½)" - IDS_STOPSERVICE_TEMPORARY - "ÀÓ½Ã(&T)(%1 ¼­¹ö°¡ ´Ù½Ã ½ÃÀÛµÉ ¶§ %2 ¼­ºñ½º ½ÃÀÛ)" - IDS_ACTION_EXECUTE "%1 ¼­¹ö¿¡¼­ %2 ½ÇÇà Áß" - IDS_ACTION_SALVAGE_SVR "%1 ¼­¹ö¿¡¼­ ¸ðµç º¼·ý º¹¿ø Áß" - IDS_ACTION_SALVAGE_AGG "%1:2 ÆÄƼ¼Ç»óÀÇ ¸ðµç º¼·ý º¹¿ø Áß" - IDS_ACTION_SALVAGE_VOL "%1:2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý º¹¿ø Áß" - IDS_SALVAGE_SVR "%1 ¼­¹ö»óÀÇ ¸ðµç º¼·ý º¹¿ø" - IDS_SALVAGE_AGG "%1 ¼­¹ö, %2 ÆÄƼ¼Ç»óÀÇ ¸ðµç º¼·ý º¹¿ø" - IDS_SALVAGE_SET "%1 ¼­¹ö, %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý º¹¿ø" - IDS_SETSTATUS_SALVAGE "º¼·ý º¹¿ø Áß" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "º¼·ýÀÌ Àá°å½À´Ï´Ù" - IDS_SETSTATUS_NO_VOL "º¼·ýÀÌ ´©¶ôµÇ¾ú½À´Ï´Ù" - IDS_SETSTATUS_BUSY "ÇöÀç º¼·ýÀÌ »ç¿ë ÁßÀÔ´Ï´Ù" - IDS_SETSTATUS_MOVED "À̵¿µÈ º¼·ý" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1(%2%%)" - IDS_SVRCOL_ADDRESS "ÁÖ¼Ò" - IDS_HOST_TITLE "%1 ¼­¹ö¿¡¼­ ÀÎ½ÄµÈ µ¥ÀÌÅͺ£À̽º È£½ºÆ® ¼­¹ö:" - IDS_SVR_HOSTS_TITLE "%1 ¼­¹ö - µ¥ÀÌÅͺ£À̽º È£½ºÆ®" - IDS_SVR_HOST_TAB "µ¥ÀÌÅͺ£À̽º È£½ºÆ®" - IDS_ACTION_HOSTLIST_LOAD "%1 ¼­¹ö¿¡¼­ È£½ºÆ® ¸ñ·Ï È®º¸ Áß" - IDS_ACTION_HOSTLIST_SAVE "%1 ¼­¹ö¿¡ È£½ºÆ® ¸ñ·Ï ±â·Ï Áß" - IDS_SETSTATUS_1ALERT "º¼·ý¿¡ ÇϳªÀÇ ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù" - IDS_SETSTATUS_2ALERT "º¼·ý¿¡ %1°³ÀÇ ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "%1 ¼­¹ö¿ë IP ÁÖ¼Ò º¯°æ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED - "%1 ¼­¹ö´Â ¹®Á¦Á¡¿¡ ´ëÇØ ¸ð´ÏÅ͵ÇÁö ¾Ê°í ÀÖ½À´Ï´Ù" - IDS_ALERT_DESCSHORT_TIMEOUT "%1 ¼­¹ö¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. ÃÖÁ¾ ¿À·ù: %3" - IDS_ALERT_DESCSHORT_AGG_FULL - "%2¿¡ ´ëÇÑ ÆÄƼ¼Ç »ç¿ë·®ÀÌ °æ°í ÀÓ°è°ªÀÎ %3%%(%4)À»(¸¦) ÃʰúÇÕ´Ï´Ù" - IDS_ALERT_DESCSHORT_SET_FULL - "%3¿¡ ´ëÇÑ º¼·ý »ç¿ë·®ÀÌ °æ°í ÀÓ°è°ªÀÎ %4%%(%5)À»(¸¦) ÃʰúÇÕ´Ï´Ù" - IDS_ALERT_DESCSHORT_NO_VLDBENT "%3 º¼·ý¿¡ VLDB ÀÔ·Â Ç׸ñÀÌ ¾ø½À´Ï´Ù" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "%3 º¼·ý¿¡ VLDB ÀÔ·Â Ç׸ñÀÌ ÀÖÁö¸¸ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ ãÁö ¸øÇß½À´Ï´Ù" - IDS_ALERT_DESCSHORT_STOPPED "%2 ¼­ºñ½º°¡ %3¿¡¼­ Á¤ÁöµÇ¾ú½À´Ï´Ù" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "%2 ÆÄƼ¼ÇÀÌ VLDB¿¡ ÀÇÇØ ÂüÁ¶µÇ¾úÀ¸³ª %1 ¼­¹ö¿¡¼­ ãÁö ¸øÇß½À´Ï´Ù" - IDS_ALERT_DESCSHORT_BADCREDS "%1 ¼­¹ö °ü¸®¿¡ ÇÊ¿äÇÑ Æ¯±ÇÀÌ ºÎÁ·ÇÕ´Ï´Ù" - IDS_ALERT_DESCSHORT_AGG_ALLOC - "%2 ÆÄƼ¼Ç¿¡¼­ °áÇÕµÈ º¼·ý ÇÒ´ç·®ÀÌ ±× ¿ë·®À» ÃʰúÇÕ´Ï´Ù" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE - "%3 º¼·ýÀº ÈѼյǾúÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "%3 º¼·ýÀ» ó¸®ÇÒ ½ÇÇà ÁßÀÎ ¼­ºñ½º°¡ ¾ø½À´Ï´Ù." - IDS_ALERT_DESCSHORT_STATE_OFFLINE - "%3 º¼·ýÀº ¿ÀÇÁ ¶óÀÎÀ̹ǷΠ»ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "%1 ¼­¹ö¿Í Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. %2¿¡¼­ ÀÌ·ç¾îÁø ÃÖÁ¾ ½Ãµµ·Î ""%3"" ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "%1 ¼­¹ö¿¡¼­ÀÇ %2 ÆÄƼ¼Ç »ç¿ë·®ÀÌ °æ°í ÀÓ°è°ªÀÎ %3%%(%4)À»(¸¦) ÃʰúÇÕ´Ï´Ù." - IDS_ALERT_DESCFULL_SET_FULL - "%3 º¼·ý(%1 ¼­¹ö, %2 ÆÄƼ¼Ç)ÀÇ »ç¿ë·®ÀÌ °æ°í ÀÓ°è°ªÀÎ %4%%(%5)À»(¸¦) ÃʰúÇÕ´Ï´Ù." - IDS_ALERT_DESCFULL_NO_VLDBENT - "%3 º¼·ýÀº %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ ÀÖÀ¸³ª ÇØ´ç VLDB ÀÔ·Â Ç׸ñÀÌ ¾ø½À´Ï´Ù." - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "%3 º¼·ý¿¡ ´ëÇÑ VLDB ÀÔ·Â Ç׸ñÀÌ ÀÖÀ¸³ª %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ º¼·ýÀ» ãÁö ¸øÇß½À´Ï´Ù." - IDS_ALERT_DESCFULL_STOPPED - "%1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º°¡ %5 Á¾·á ÄÚµå¿Í ÇÔ²² %3¿¡¼­ Á¤ÁöÇß½À´Ï´Ù." - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "VLDB´Â %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ ÀÖ´Â º¼·ýÀ» ÂüÁ¶ÇÏÁö¸¸ ÆÄƼ¼ÇÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_ALERT_DESCFULL_BADCREDS - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼­¹ö¿¡ ¾ø´Â ¿À·ù¸¦ ¹ß°ßÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¿Ö³ÄÇϸé, ÀÌ ¼¿¿¡¼­´Â AFS ÅäÅ«À» °ü¸®ÀÚ·Î »ç¿ëÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù." - IDS_ALERT_DESCFULL_AGG_ALLOC - "%4ÀÌ(°¡) µÇ´Â %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ °áÇÕµÈ º¼·ý ÇÒ´ç·®ÀÌ %3ÀÇ ÆÄƼ¼Ç ¿ë·®À» ÃʰúÇÕ´Ï´Ù." - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "%1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ ÀÖ´Â %3 º¼·ý¿¡ ¿¬°üµÈ Vnode°¡ ¾ø½À´Ï´Ù.(º¼·ý »óÅ´ 0x%4ÀÔ´Ï´Ù.)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "%1 ¼­¹ö¿¡ ½ÇÇà ÁßÀÎ ÆÄÀÏ ¹ÝÃâ±â ¼­ºñ½º°¡ ¾øÀ¸¹Ç·Î, %2 ÆÄƼ¼ÇÀÇ %3 º¼·ýÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.(º¼·ý »óÅ´ 0x%4ÀÔ´Ï´Ù.)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "%1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ ÀÖ´Â %3 º¼·ýÀº ¿ÀÇÁ ¶óÀÎÀ̹ǷΠ»ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.(º¼·ý »óÅ´ 0x%4ÀÔ´Ï´Ù.)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "´Ù½Ã ½ÃÀÛ ´ÜÃ߸¦ ´­·¯ ÀÌ ¼­¹ö¿¡ ´Ù½Ã Á¢¼ÓÇϽʽÿÀ." - IDS_ALERT_FIX_AGG_FULL "°æ°í ´ÜÃ߸¦ ´­·¯ ÀÌ ÆÄƼ¼ÇÀÇ »ç¿ë·®¿¡ ´ëÇÑ °æ°í ÀÓ°è°ªÀ» º¯°æÇϽʽÿÀ." - IDS_ALERT_FIX_SET_FULL "°æ°í ´ÜÃ߸¦ ´­·¯ ÀÌ º¼·ý »ç¿ë·®¿¡ ´ëÇÑ °æ°í ÀÓ°è°ªÀ» º¯°æÇϽʽÿÀ." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "VLDB°¡ ¿À·¡µÇ¾úÀ» °¡´É¼ºÀÌ ÀÖ´Â °æ¿ì, VLDB µ¿±âÈ­¸¦ »ç¿ëÇÏ¿© °»½ÅÇϽʽÿÀ." - IDS_ALERT_FIX_NO_SVRENT_SET - "¼­¹ö ¹× ÆÄƼ¼ÇÀ» Á¡°ËÇÏ¿© Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇϽʽÿÀ." - IDS_ALERT_FIX_STOPPED "·Î±× º¸±â ´ÜÃ߸¦ ´­·¯ ÀÌ ¼­ºñ½º¿¡ ´ëÇÑ ¼­ºñ½º ·Î±×¸¦ º¸½Ê½Ã¿À." - IDS_ALERT_FIX_NO_SVRENT_AGG - "¼­¹ö¸¦ Á¡°ËÇÏ¿© ÆÄƼ¼ÇÀÌ ¹ÝÃâµÇ´ÂÁö¿Í Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö¸¦ È®ÀÎÇϽʽÿÀ." - IDS_ALERT_FIX_BADCREDS "ÀÎÁõ ´ÜÃ߸¦ ´­·¯ »õ AFS ÅäÅ«À» È®º¸ÇϽʽÿÀ." - IDS_ALERT_FIX_AGG_ALLOC "ÀÌ ÆÄƼ¼Ç¿¡¼­ º¼·ý¿¡ ´ëÇÑ ÇÒ´ç·®À» ÁÙÀ̰ųª Çϳª ÀÌ»óÀÇ º¼·ýÀ» ´Ù¸¥ ÆÄƼ¼ÇÀ¸·Î ¿Å±â½Ê½Ã¿À." - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "Àç½Ãµµ(&A)" - IDS_ALERT_BUTTON_WARNINGS "°æ°í(&W)..." - IDS_ALERT_BUTTON_VIEWLOG "·Î±× º¸±â(&V)" - IDS_ALERT_BUTTON_SHOWME "È­¸é¿¡ Ç¥½Ã(&S)" - IDS_ALERT_BUTTON_GETCREDS "ÀÎÁõ(&A)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "ÁöÁ¤µÈ ¼¿ÀÌ ¾ø½À´Ï´Ù. AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥À» »ç¿ëÇÏ·Á¸é, ÀÛ¾÷ÇÒ AFS ¼¿À» ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù. À§ÀÇ ""¼¿"" ¸Þ´º¿¡¼­ ""¿­±â..."" ¸Þ´º Ç׸ñÀ» ¼±ÅÃÇÏ¿© ¼¿À» ¼±ÅÃÇϽʽÿÀ." - IDS_ERROR_REFRESH_CELLSERVERS - "%1 ¼¿¿¡ ´ëÇÑ ¼­¹ö ¸ñ·ÏÀ» È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù: %2" - IDS_ERROR_CANT_OPEN_CELL - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼¿¿¡ ÀÖ´Â ¼­¹ö¿Í Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¼¿ À̸§À» ¿Ã¹Ù¸£°Ô ÀÔ·ÂÇß´ÂÁö ´Ù½Ã È®ÀÎÇϽʽÿÀ." - IDS_ERROR_REFRESH_AGGREGATES - "%1 ¼­¹ö¿¡ ´ëÇÑ ÆÄƼ¼Ç ¸ñ·ÏÀ» È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù: %2" - IDS_ERROR_REFRESH_SERVER_STATUS - "%1 ¼­¹öÀÇ ÇöÀç »óŸ¦ È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CHANGE_SERVER_STATUS - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ Æ¯¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "%1 ¼­¹ö¿¡¼­ %2 ÆÄƼ¼ÇÀÇ ÇöÀç »óŸ¦ È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "%3 º¼·ý(%1 ¼­¹ö, %2 ÆÄƼ¼Ç)ÀÇ ÇöÀç »óŸ¦ È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_REFRESH_SERVICE_STATUS - "%1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½ºÀÇ ÇöÀç »óŸ¦ ÆÇº°ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_MOVE_FILESET "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ ÀÖ´Â %3 º¼·ýÀ» %4 ¼­¹öÀÇ %5 ÆÄƼ¼ÇÀ¸·Î À̵¿ÇÏÁö ¸øÇß½À´Ï´Ù." - IDS_ERROR_VIEW_LOGFILE "%1 ¼­¹ö¿¡¼­ %2 ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù.\n\nÆÄÀÏ À̸§À» ¿Ã¹Ù¸£°Ô ÀÔ·ÂÇß´ÂÁö È®ÀÎÇÏ°í ÆÄÀÏÀ» º¼ ¼ö Àִ Ư±ÇÀÌ ÃæºÐÇÑÁöµµ È®ÀÎÇϽʽÿÀ." - IDS_ERROR_NOT_REPLICATED "%1 º¼·ýÀÇ º¹Á¦ »óŸ¦ ÆÇº°ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ %3 º¼·ýÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %3 º¼·ý(%1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç)À» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý¿¡ ´ëÇÑ VLDB ÀÔ·Â Ç׸ñÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SET_FILESET_QUOTA - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý¿¡ ´ëÇÑ ÇÒ´ç·®À» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_SERVER - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼¿ ³»¿¡ ¿äûµÈ ¼­¹ö ÀÔ·Â Ç׸ñÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_PING_SERVER - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ IP ÁÖ¼Ò¸¦ ÆÇº°ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_SERVER - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¸¦ »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "%1 ¼­¹ö´Â ¾ÆÁ÷µµ Çϳª ÀÌ»óÀÇ º¼·ýÀ» º¸À¯ÇϹǷΠ»èÁ¦µÉ ¼ö ¾ø½À´Ï´Ù. ¼­¹ö´Â º¼·ýÀÌ ¾øÀ» ¶§¸¸ »èÁ¦µÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ÆÄƼ¼Ç¿¡ ´ëÇÑ Æ¯¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CHANGE_SERVICE_STATUS - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¿¡ ´ëÇÑ Æ¯¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_START_SERVICE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ Á¤ÁöÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_RESTART_SERVICE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ Á¤ÁöÇÑ ÈÄ ´Ù½Ã ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CHANGE_REPLICA_STATUS - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý¿¡ ´ëÇÑ º¹Á¦ Ư¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SYNCVLDB "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ VLDB¸¦ °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_REPLICA - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ýÀÇ º¹Á¦º»À» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_INSTALL_FILE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ÆÄÀÏÀ» ¼³Ä¡ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_UNINSTALL_FILE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ÆÄÀÏÀ» ¼³Ä¡ÇØÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_PRUNE_FILES - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ ¿äûµÈ ÆÄÀÏÀ» Á¦°ÅÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_RENAME_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ º¼·ý À̸§À» %1¿¡¼­ ""%2""(À¸)·Î º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_SERVICE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_SERVICE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ %2 ¼­ºñ½º¸¦ »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_RELEASE_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ º¹Á¦µÈ %3 º¼·ýÀ» ÇØÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_UPDATE_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %2 ¼­¹öÀÇ %1 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ý º¹Á¦º»À» °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_UPDATE_ALL - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %3 º¼·ýÀÇ º¹Á¦º»À» °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ °ü¸®ÀÚ ¸ñ·ÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_LOAD_KEYLIST - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ ¼­¹ö Ű ¸ñ·ÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_KEY - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ »õ ¼­¹ö ۸¦ ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SAVE_ADMLIST - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ °ü¸®ÀÚ ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CLONE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡ %3 º¼·ýÀÇ ¹é¾÷ ¹öÀüÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CLONESYS "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ ¿äûµÈ ¹é¾÷ º¼·ýÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DUMP_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %3 º¼·ý(%1 ¼­¹ö, %2 ÆÄƼ¼Ç)ÀÇ ³»¿ëÀ» %4 ÆÄÀÏ¿¡ ´ýÇÁÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_RESTORE_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %3 º¼·ý(%1 ¼­¹ö, %2 ÆÄƼ¼Ç)¿¡ %4 ÆÄÀÏÀ» º¹¿øÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SET_RESTART_TIMES - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ ¼­ºñ½ºÀÇ Àç½ÃÀÛ ½Ã°£À» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç¿¡¼­ %3 º¼·ýÀ» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n%3 º¼·ýÀº ¸ðµç º¹Á¦º»ÀÌ ¸ÕÀú »èÁ¦µÇÁö ¾Ê´Â ÀÌ»ó »èÁ¦µÉ ¼ö ¾ø½À´Ï´Ù." - IDS_CMDLINE_TITLE "¿À·ù - AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_CMDLINE_SYNTAX "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù." - IDS_CMDLINE_UNRECOGNIZED - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö¸¦ ÀνÄÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_CMDLINE_DUPLICATE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö°¡ ÇÑ ¹ø ÀÌ»ó ÁöÁ¤µÇ¾ú½À´Ï´Ù." - IDS_CMDLINE_UNEXPECTVALUE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö¿¡ °ªÀ» Á¦°øÇÏÁö ¸»¾Æ¾ß ÇÕ´Ï´Ù." - IDS_CMDLINE_MISSINGVAL "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö ´ÙÀ½¿¡ °ªÀÌ ¿Í¾ß ÇÕ´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""/SUBSET"" ¸Å°³º¯¼ö´Â ""/CELL"" ¸Å°³º¯¼ö°¡ ÁöÁ¤µÉ °æ¿ì¿¡¸¸ ÁöÁ¤µÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_CMDLINE_INVALIDSUBSET - "ÁöÁ¤ÇÑ ""%2"" ¼­¹ö ¼­ºê¼¼Æ®´Â %1 ¼¿¿¡ ´ëÇØ Á¤ÀǵÇÁö ¾Ê¾Ò½À´Ï´Ù." - IDS_CMDLINE_SERVERNOTCELL - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""/SERVER"" ¸Å°³º¯¼ö´Â ""/CELL"" ¸Å°³º¯¼ö°¡ ÁöÁ¤µÉ °æ¿ì¿¡¸¸ ÁöÁ¤µÉ ¼ö ÀÖ½À´Ï´Ù." - IDS_CMDLINE_RESET_TITLE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥" - IDS_CMDLINE_RESET_DESC "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ ÁöÁ¤µÈ ¼³Á¤À» Áö¿ü½À´Ï´Ù." - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº ÆÄƼ¼ÇÀÌ ¾ø°Å³ª ¹ÝÃâµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ %1 ¼­¹öÀÇ %2 ÆÄƼ¼Ç°ú VLDB¸¦ µ¿±âÈ­ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n%1 ¼­¹ö¿¡¼­ ÀÌ ÆÄƼ¼ÇÀ» Á¦°ÅÇÏ·Á¸é, À̸¦ ÂüÁ¶ÇÏ´Â º¼·ý VLDB ÀÔ·Â Ç׸ñÀ» »èÁ¦ÇØ¾ß ÇÕ´Ï´Ù." - IDS_CMDLINE_USERPASSWORD - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n»õ AFS ÅäÅ«À» È®º¸ÇÏ·Á¸é, ""/USER"" ¹× ""/PASSWORD"" ¸Å°³º¯¼ö°¡ µÑ ´Ù ÁöÁ¤µÇ¾î¾ß ÇÕ´Ï´Ù." - IDS_ERROR_CANT_DELETE_KEY - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼­¹ö¿¡¼­ %2 ¼­¹ö ۸¦ »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_GETRANDOMKEY - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼­¹ö¿¡ ´ëÇÑ ÀÓÀÇ Å°¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_EXECUTE_COMMAND - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº %1 ¼­¹ö¿¡¼­ ´ÙÀ½ ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ º¹¿ø Á¶ÀÛÀ» ³¡³ÂÁö¸¸ º¹¿ø Á¶ÀÛÀÇ °íÀ¯ÇÑ °á°ú¸¦ ¼³¸íÇÏ´Â ·Î±× ÆÄÀÏÀ» °Ë»öÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SALVAGE "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ ¿äûµÈ º¹¿ø Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_AUTH_ON "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ ÀÎÁõ È®ÀÎÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_AUTH_OFF "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡ ´ëÇÑ ÀÎÁõ È®ÀÎ »ç¿ëÀ» ÁߴܽÃŰÁö ¸øÇß½À´Ï´Ù." - IDS_ERROR_CANT_LOAD_HOSTLIST - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ µ¥ÀÌÅͺ£À̽º È£½ºÆ® ¼­¹ö ¸ñ·ÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SAVE_HOSTLIST - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿¡¼­ µ¥ÀÌÅͺ£À̽º È£½ºÆ® ¼­¹ö ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº AFS Á¦¾î ¼¾ÅͰ¡ ÀÌ ÄÄÇ»ÅÍ¿¡ Á¦´ë·Î ¼³Ä¡µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ½ÃÀÛµÉ ¼ö ¾ø½À´Ï´Ù.\n\nAFS Á¦¾î ¼¾Å͸¦ ´Ù½Ã ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù." - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥Àº ¾Ë ¼ö ¾ø´Â ¹®Á¦Á¡À¸·Î ½ÃÀÛµÉ ¼ö ¾ø½À´Ï´Ù.\n\nAFS Á¦¾î ¼¾Å͸¦ ´Ù½Ã ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù." - IDS_ERROR_CANT_CHANGEADDR - "AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼­¹ö¿ë VLDB¿¡¼­ IP ÁÖ¼Ò¸¦ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "°£´Ü" - IDS_SERVICETYPE_CRON "Å©·Ð" - IDS_SERVICESTATE_STOPPED "Á¤ÁöµÊ" - IDS_SERVICESTATE_STOPPING "Á¤Áö Áß" - IDS_SERVICESTATE_STARTING "½ÃÀÛ Áß" - IDS_SERVICESTATE_RUNNING "½ÇÇà Áß" - IDS_SERVICETYPE_FS_LONG "FS(ÆÄÀÏ ½Ã½ºÅÛ)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "%1 ¼¿ÀÇ ¸ðµç ¼­ºñ½º:" - IDS_SERVICE_STARTDATE "%1 ½ÃÀÛµÊ" - IDS_SERVICE_STOPDATE "%1 Á¤ÁöµÊ" -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/pt_BR/svrmgr.rc b/src/WINNT/afssvrmgr/lang/pt_BR/svrmgr.rc deleted file mode 100644 index 6a6817e2d..000000000 --- a/src/WINNT/afssvrmgr/lang/pt_BR/svrmgr.rc +++ /dev/null @@ -1,3030 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "Gerenciador de Servidor do AFS" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - RIGHTMARGIN, 165 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 250 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 259 - TOPMARGIN, 4 - BOTTOMMARGIN, 153 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 196 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 140 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 292 - TOPMARGIN, 5 - BOTTOMMARGIN, 178 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 296 - TOPMARGIN, 4 - BOTTOMMARGIN, 142 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 315 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 250 - TOPMARGIN, 7 - BOTTOMMARGIN, 267 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 221 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""Gerenciador de Servidor do AFS""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Célula" - BEGIN - MENUITEM "&Selecionar...", M_CELL_OPEN - MENUITEM "&Autenticação...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "Sai&r", M_EXIT - END - POPUP "E&xibir" - BEGIN - POPUP "&Servidores" - BEGIN - MENUITEM "Ícones &Grandes", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "Ícones &Pequenos", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "&Detalhes", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "&Todos os Ícones", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "&Somente Status", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "Painel de &Exibição Rápida" - BEGIN - MENUITEM "&Nenhum", M_DIVIDE_NONE, CHECKED - MENUITEM "Dividir &Verticalmente", M_DIVIDE_H, CHECKED - MENUITEM "Dividir &Horizontalmente", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "O&perações Em Andamento", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Servidores &Monitorados...", M_SUBSET - MENUITEM "&Colunas...", M_COLUMNS - MENUITEM "&Opções...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL - END - POPUP "&Ajuda" - BEGIN - MENUITEM "&Conteúdo", M_HELP - MENUITEM "&Procurar Comando...", M_HELP_FIND - MENUITEM "Pes&quisar Código de Erro...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "&Sobre o Gerenciador de Servidor do AFS...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "&Criar Volume...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "Fazer &Backup de Volumes...", M_SET_CLONE - MENUITEM "&Desbloquear Todos os Volumes", M_SET_UNLOCK - MENUITEM "S&incronizar VLDB...", M_SYNCVLDB - MENUITEM "&Recuperar Volumes...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "A&tualizar", M_REFRESH - MENUITEM "&Propriedades", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "&Iniciar", M_SVC_START - MENUITEM "Pa&rar", M_SVC_STOP - MENUITEM "Rei&niciar", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "Exibir Arquivo de &Log", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "E&xcluir", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "A&tualizar", M_REFRESH - MENUITEM "&Propriedades", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWOICONS, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Criar Volume...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWOICONS, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Criar Serviço...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "R&eplicação...", M_SET_REPLICATION - MENUITEM "&Liberar Agora", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "Fazer &Backup...", M_SET_CLONE - MENUITEM "Descarre&gar para Arquivo...", M_SET_DUMP - MENUITEM "Res&taurar do Arquivo...", M_SET_RESTORE - MENUITEM "Definir &Quota...", M_SET_SETQUOTA - MENUITEM "&Recuperar...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Mover Para...", M_SET_MOVETO - MENUITEM "Re&nomear...", M_SET_RENAME - MENUITEM "E&xcluir", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Bloq&uear", M_SET_LOCK - MENUITEM "&Desbloquear", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "Atuali&zar", M_REFRESH - MENUITEM "&Propriedades", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "Abrir &Janela do Servidor", M_SVR_OPEN - MENUITEM "&Fechar Janela do Servidor", M_SVR_CLOSE - MENUITEM "&Monitorar este Servidor", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "Editar &Segurança do Servidor...", M_SVR_SECURITY - MENUITEM "Gerenciar &Hosts de Banco de Dados...", M_SVR_HOSTS - MENUITEM "Fazer &Backup de Volumes...", M_SET_CLONE - MENUITEM "&Desbloquear Todos os Volumes", M_SET_UNLOCK - MENUITEM "Si&ncronizar VLDB...", M_SYNCVLDB - MENUITEM "Recuperar &Volumes...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "&Instalar Arquivo...", M_SVR_INSTALL - MENUITEM "&Remover Instalação de Arquivo...", M_SVR_UNINSTALL - MENUITEM "Eliminar Arquivos Anti&gos...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "Obter Da&tas de Arquivo...", M_SVR_GETDATES - MENUITEM "Exibir Arquivo de &Log...", M_VIEWLOG - MENUITEM "&Executar Comando...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "Atuali&zar", M_REFRESH - MENUITEM "&Propriedades", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "Ícones &Grandes", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "Ícones &Pequenos", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "&Detalhes", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "&Todos os Ícones", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "&Somente Status", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Servidores &Monitorados...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "&Desbloquear Todos os Volumes", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "&Fechar Tudo", M_SVR_CLOSEALL - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "Por &Volume", M_SET_VIEW_REPORT, CHECKED - MENUITEM "Por &Partição", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "Sem &Detalhes", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONEICON, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWOICONS, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Criar Volume...", M_SET_CREATE - MENUITEM "&Restaurar do Arquivo...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "Fazer &Backup de Volumes...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "&Desbloquear Todos", M_SET_UNLOCK - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Colunas...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "&Reiniciar", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "E&xibir Arquivo de Log", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "A&tualizar", M_REFRESH - MENUITEM "&Propriedades", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "&Mover Aqui...", M_SET_MOVEHERE - MENUITEM "&Replicar Aqui...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "&Cancelar", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Serviços:",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Criar...",IDC_SVC_CREATE,56,80,39,12 - PUSHBUTTON "E&xcluir",IDC_SVC_DELETE,98,80,39,12 - PUSHBUTTON "&Reiniciar",IDC_SVC_RESTART,140,80,39,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Partições:",IDC_AGG_DESC,0,5,165,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,17,165, - 53,WS_EX_STATICEDGE - PUSHBUTTON "&Criar Volume...",IDC_AGG_CREATESET,102,72,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 194, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Volumes:",IDC_SET_DESC,0,5,194,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,194, - 61,WS_EX_STATICEDGE - PUSHBUTTON "&Criar...",IDC_SET_CREATE,6,80,39,12 - PUSHBUTTON "E&xcluir",IDC_SET_DELETE,48,80,39,12 - PUSHBUTTON "&Replicação...",IDC_SET_REP,90,80,51,12 - PUSHBUTTON "Definir &Quota...",IDC_SET_SETQUOTA,144,80,49,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Incluir Administrador",IDC_LIST_ADD,61,160,72,14 - PUSHBUTTON "&Remover Administrador",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "Administradores para o servidor %1:",IDC_LIST_NAME,5,7, - 216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "ID:",IDC_STATIC,5,30,31,8 - LTEXT "(consultando)",IDC_AGG_ID,47,30,214,8 - LTEXT "Dispositivo:",IDC_STATIC,5,46,37,8 - LTEXT "(consultando)",IDC_AGG_DEVICE,47,46,214,8 - LTEXT "Volumes:",IDC_STATIC,5,62,31,8 - LTEXT "(consultando)",IDC_AGG_FILESETS,47,62,214,8 - CONTROL "Exibir um aviso se a "a combinada dos volumes exceder a capacidade", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,76,246,10 - LTEXT "Uso:",IDC_STATIC,5,90,31,8 - LTEXT "(consultando)",IDC_AGG_USAGE,38,90,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,103,224,8, - WS_EX_STATICEDGE - CONTROL "Exibir um aviso se o uso da &partição exceder", - IDC_AGG_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38, - 116,214,10 - CONTROL "o limite padrão para este &servidor", - IDC_AGG_WARN_AGGFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,49,131,203,9 - CONTROL "um &limite de",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,54,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,106,143,29,12, - ES_AUTOHSCROLL - LTEXT "% de seu tamanho",IDC_AGG_WARN_AGGFULL_DESC,152,145,100, - 8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,20,20 - LTEXT "Partição %2 (servidor %1)",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Endereço IP:",IDC_STATIC,5,29,43,8 - LISTBOX IDC_SVR_ADDRESSES,53,29,70,12,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "Alterar &Endereços...",IDC_SVR_CHANGEADDR,144,27,77,12 - PUSHBUTTON "E&xigir Autenticação",IDC_SVR_AUTH_YES,36,85,84,12 - PUSHBUTTON "Permitir &Não Autenticado",IDC_SVR_AUTH_NO,130,85,85,14 - LTEXT "Número de partições:",IDC_STATIC,11,131,90,8 - LTEXT "(consultando)",IDC_SVR_NUMAGGREGATES,115,131,99,8 - LTEXT "Capacidade total:",IDC_STATIC,11,148,63,8 - LTEXT "(consultando)",IDC_SVR_CAPACITY,115,148,99,8 - LTEXT "Quota combinada dos volumes:",IDC_STATIC,11,165,100,8 - LTEXT "(consultando)",IDC_SVR_ALLOCATION,115,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(nome do servidor)",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "Segurança",IDC_STATIC,5,52,216,52 - GROUPBOX "Armazenamento",IDC_STATIC,5,115,216,68 - LTEXT "Pode-se exigir que todo acesso a este servidor seja autenticado.", - IDC_STATIC,11,64,198,16 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 221, 158 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "qualquer partição neste servidor se tornar", - IDC_SVR_WARN_AGGFULL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,18,143,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,154,16,20,12,ES_AUTOHSCROLL - LTEXT "% cheia",IDC_STATIC,188,18,28,8 - CONTROL "qualquer volume neste servidor se tornar", - IDC_SVR_WARN_SETFULL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,32,144,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,154,30,20,12,ES_AUTOHSCROLL - LTEXT "% cheio",IDC_STATIC,188,32,28,8 - CONTROL "a quota combinada em qualquer partição exceder sua capacidade", - IDC_SVR_WARN_AGGALLOC,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,5,46,200,14 - CONTROL "qualquer serviço neste servidor parar de executar", - IDC_SVR_WARN_SVCSTOP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,64,195,9 - CONTROL "qualquer volume neste servidor não tiver entrada no VLDB", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,78,195,9 - CONTROL "o VLDB referenciar qualquer partição offline neste servidor", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,92,199,9 - CONTROL "o VLDB referenciar qualquer volume offline neste servidor", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,107,195,9 - CONTROL "Atualizar informações do servidor a cada", - IDC_SVR_AUTOREFRESH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,132,142,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,147,130,27,13,ES_AUTOHSCROLL - LTEXT "minutos",IDC_STATIC,190,132,25,8 - LTEXT "Exibir um aviso se",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "E&xibir Log do Serviço",IDC_SVC_VIEWLOG,33,182,72,14 - PUSHBUTTON "&Iniciar Agora",IDC_SVC_START,113,182,48,14 - PUSHBUTTON "&Parar Agora",IDC_SVC_STOP,169,182,48,14 - CONTROL "Exibir um &aviso se este serviço alguma vez parar", - IDC_SVC_WARNSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Serviço %2 (servidor %1)",IDC_SVC_NAME,52,13,168,8 - LTEXT "Tipo:",IDC_STATIC,5,29,44,12 - LTEXT "(consultando)",IDC_SVC_TYPE,52,29,168,12 - LTEXT "Parâmetros:",IDC_STATIC,5,45,44,12 - EDITTEXT IDC_SVC_PARAMS,53,45,157,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Notificador:",IDC_STATIC,5,61,44,12 - LTEXT "(consultando)",IDC_SVC_NOTIFIER,53,61,162,12 - LTEXT "Último Início:",IDC_STATIC,5,77,44,12 - LTEXT "(consultando)",IDC_SVC_STARTDATE,53,78,162,12 - LTEXT "Última Parada:",IDC_STATIC,5,93,48,10 - LTEXT "(consultando)",IDC_SVC_STOPDATE,53,93,162,12 - LTEXT "Última Falha:",IDC_STATIC,5,110,44,12 - EDITTEXT IDC_SVC_LASTERROR,53,110,158,12,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "Status do Serviço",IDC_STATIC,5,127,215,75 - LTEXT "O status atual deste serviço está sendo determinado...", - IDC_SVC_STATUS,11,142,200,8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "ID do Volume:",IDC_STATIC,5,30,46,8 - LTEXT "(desconhecido)",IDC_SET_ID,52,30,207,8 - LTEXT "Criado:",IDC_STATIC,5,46,39,8 - LTEXT "(consultando)",IDC_SET_CREATEDATE,52,46,208,8 - LTEXT "Atualizado:",IDC_STATIC,5,62,39,8 - LTEXT "(consultando)",IDC_SET_UPDATEDATE,52,62,216,8 - LTEXT "Acessado:",IDC_STATIC,5,78,39,8 - LTEXT "(consultando)",IDC_SET_ACCESSDATE,52,78,216,8 - LTEXT "Feito Backup:",IDC_STATIC,5,94,45,8 - LTEXT "(consultando)",IDC_SET_BACKUPDATE,52,94,212,8 - LTEXT "Contagem de Arquivos:",IDC_STATIC,5,106,45,16 - LTEXT "(consultando)",IDC_SET_FILES,52,110,193,8 - LTEXT "Status:",IDC_STATIC,5,126,39,8 - LTEXT "(consultando)",IDC_SET_STATUS,52,126,93,8 - PUSHBUTTON "&Bloquear",IDC_SET_LOCK,156,124,54,12 - PUSHBUTTON "&Desbloquear",IDC_SET_UNLOCK,214,124,54,12 - LTEXT "Uso:",IDC_STATIC,5,142,31,8 - LTEXT "(consultando)",IDC_SET_USAGE,52,142,136,8 - PUSHBUTTON "Definir &Quota...",IDC_SET_QUOTA,214,140,54,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,219,8, - WS_EX_STATICEDGE - CONTROL "Exibir um &aviso se o uso deste volume exceder", - IDC_SET_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,49, - 170,219,10 - CONTROL "o limite padrão para este &servidor (%1%% de seu tamanho)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,61,185,207,9 - CONTROL "um &limite de",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,61,199,62,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,123,197,29,12, - ES_AUTOHSCROLL - LTEXT "% de seu tamanho",IDC_SET_WARN_SETFULL_DESC,163,199,105, - 8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "Volume %3 (servidor %1, partição %2)",IDC_SET_NAME,49, - 14,219,8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "Gerenciador de Servidor do AFS" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Célula Selecionada:",IDC_STATIC,2,8,55,8 - LTEXT "(nome da célula será colocado aqui)",IDC_CELL,62,8,208, - 9 - LTEXT "Tokens do AFS:",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1 (tokens expiram em %3)",IDC_AFS_ID,62,19,208,9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Servidor" -CLASS "ServerWindowClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TABS," SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Servidor:",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,52,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ser&viço:",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,52,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Comando:",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,52,68,168,13,ES_AUTOHSCROLL - LTEXT "&Parâmetros:",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,52,86,168,13,ES_AUTOHSCROLL - LTEXT "&Notificador:",IDC_STATIC,5,105,44,8 - EDITTEXT IDC_SVC_NOTIFIER,52,103,168,13,ES_AUTOHSCROLL - LTEXT "Arquivo de &Log:",IDC_STATIC,5,122,44,16 - EDITTEXT IDC_SVC_LOGFILE,52,120,168,13,ES_AUTOHSCROLL - CONTROL "S&imples (executa continuamente)",IDC_SVC_TYPE_SIMPLE, - "Button",BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "Iniciar este serviço a&gora",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "&FS (sistema de arquivos)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "C&ron (executa a intervalos especificados)", - IDC_SVC_TYPE_CRON,"Button",BS_AUTORADIOBUTTON,11,195,201, - 10 - LTEXT "&Quando executar:",IDC_STATIC,13,209,59,8 - COMBOBOX IDC_SVC_RUNDAY,75,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "às",IDC_STATIC,148,209,8,8 - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,159,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Novo serviço",IDC_SVC_DESC,52,13,168,8 - GROUPBOX "Tipo de Serviço",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "&Liberar Agora",IDC_SET_RELEASE,11,143,52,14 - PUSHBUTTON "&Criar...",IDC_SET_REPSITE_ADD,129,143,38,14 - PUSHBUTTON "E&xcluir",IDC_SET_REPSITE_DELETE,172,143,38,14 - LTEXT "Servidor:",-1,11,31,37,8 - LTEXT "(nome do servidor)",IDC_SET_SERVER,55,31,147,8 - LTEXT "Partição:",-1,11,44,37,8 - LTEXT "(nome da partição)",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "Volume:",-1,11,18,37,8 - LTEXT "(nome do volume)",IDC_SET_NAME,55,18,147,8 - GROUPBOX "Volume de Leitura/Gravação",-1,5,5,211,56 - GROUPBOX "Réplicas do Volume",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 254 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Selecionar Célula - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Célula:",IDC_STATIC,4,24,24,8 - COMBOBOX IDC_OPENCELL_CELL,28,22,187,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "Autenticação do AFS",IDC_STATIC,4,44,211,95 - LTEXT "&Identidade do AFS:",IDC_STATIC,15,105,61,8 - EDITTEXT IDC_OPENCELL_ID,80,103,129,14,ES_AUTOHSCROLL - LTEXT "&Senha do AFS:",IDC_STATIC,15,121,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,119,129,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "A&vançado >>",IDC_ADVANCED,4,146,53,14 - DEFPUSHBUTTON "OK",IDOK,86,146,41,14 - PUSHBUTTON "Cancelar",IDCANCEL,130,146,41,14 - PUSHBUTTON "&Ajuda",9,174,146,41,14 - CONTROL "Monitorar &todos os servidores nesta célula", - IDC_MON_ALL,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,10, - 202,185,9 - CONTROL "&Monitorar somente um servidor:",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,215,110,10 - EDITTEXT IDC_MON_SERVER,125,214,83,13,ES_AUTOHSCROLL - CONTROL "Monitorar somente os servidores no s&ubconjunto:", - IDC_MON_SOME,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | - WS_TABSTOP,10,229,110,17 - COMBOBOX IDC_MON_SUBSET,125,231,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Selecione a célula do AFS com a qual deseja trabalhar.", - IDC_STATIC,4,7,200,8 - GROUPBOX "Monitorar Servidores",IDC_ADVANCED_GROUP,4,166,211,84 - LTEXT "Para melhor desempenho, pode-se escolher monitorar somente um subconjunto dos servidores disponíveis nesta célula.", - IDC_STATIC,10,180,199,17 - LTEXT "(consultando...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Para administrar uma célula, é preciso informar novamente sua senha do AFS:", - IDC_STATIC,10,81,196,17 - LTEXT "Seus tokens do AFS atuais dentro da célula selecionada:", - IDC_STATIC,10,57,196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Aviso - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Continuar aguardando até que a tarefa conclua normalmente", - IDC_TIMEOUT_WAIT,"Button",BS_AUTORADIOBUTTON,24,89,208, - 10 - CONTROL "&Terminar a tarefa",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,24,103,208,10 - DEFPUSHBUTTON "OK",IDOK,93,139,50,14 - LTEXT "Tempo decorrido de execução da tarefa:",IDC_STATIC,4, - 119,142,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,151,119,29,8 - LTEXT "O Gerenciador de Servidor do AFS esteve aguardando por um tempo inesperadamente longo que uma tarefa da rede fosse concluída.", - IDC_STATIC,4,7,228,18 - LTEXT "Você pode deixar que a tarefa seja executada (recomendado) ou, se tiver confiança que a tarefa nunca vai terminar, permitir que o Gerenciador de Servidor do AFS termine a tarefa.", - IDC_STATIC,4,30,228,26 - LTEXT "Note que a tarefa ainda está em andamento enquanto esta janela está sendo exibida: se a tarefa concluir, esta janela fechará automaticamente.", - IDC_STATIC,4,60,228,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Colunas" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Selecionar colunas a exibir ao listar:",IDC_STATIC,5,7, - 126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Colunas &Disponíveis:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Colunas a E&xibir:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Incluir >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< &Remover",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "Mover para &Cima",IDC_COL_UP,149,122,60,14 - PUSHBUTTON "Mover para &Baixo",IDC_COL_DOWN,215,122,60,14 - GROUPBOX "Listar Colunas",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Atualizando - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "0%% concluído",IDC_REFRESH_PERCENT,4,49,216,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,216,8 - LTEXT "Aguarde...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "&Saltar",IDC_REFRESH_SKIP,222,58,38,12,NOT WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Criar Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Nome:",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,46,28,116,14,ES_AUTOHSCROLL - LTEXT "&Quota:",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,46,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,90,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Backup:",IDC_STATIC,4,66,39,8 - CONTROL "&Criar também uma versão de backup deste volume", - IDC_SET_CLONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46, - 66,181,8 - LTEXT "&Servidor:",IDC_STATIC,4,84,39,8 - COMBOBOX IDC_SET_SERVER,46,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partição:",IDC_STATIC,4,102,39,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,102,271, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,156,191,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,211,191,50,14 - PUSHBUTTON "&Ajuda",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Novo volume",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Excluir Volume" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Cancelar",IDCANCEL,169,84,50,14 - PUSHBUTTON "OK",IDOK,115,84,50,14 - PUSHBUTTON "&Ajuda",9,223,84,50,14 - CONTROL "&Excluir o volume %3 do servidor %1, partição %2", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 16,45,251,10 - CONTROL "Excluir a entrada no &VLDB para o volume %3", - IDC_DELSET_VLDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16, - 60,251,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "Atenção!\n\nEsta operação excluirá permanentemente o volume %3.", - IDC_DELSET_DESC,31,7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Fazer Backup de Volume - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,183,67,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,237,67,50,14 - PUSHBUTTON "&Ajuda",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Um backup de volume atua como uma cópia somente de leitura desse volume. Um volume de leitura/gravação pode ter somente uma versão de backup.", - IDC_STATIC,34,9,307,17 - LTEXT "Clique em OK para criar um backup do volume %3 no servidor %1, partição %2. Se já existir um backup desse volume, ele será atualizado.", - IDC_CLONE_DESC,34,32,307,28 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas Conhecidos",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Serviço %2 (servidor %1)",IDC_PROBLEM_TITLE,52,13,168,8 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas Conhecidos",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas Conhecidos",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Partição %2 (servidor %1)",IDC_PROBLEM_TITLE,38,14,214, - 8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Problemas Conhecidos",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "Volume %3 (servidor %1, partição %2)",IDC_PROBLEM_TITLE, - 49,14,219,8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Mover Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,115,156,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,156,50,14 - PUSHBUTTON "&Ajuda",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "&Mover volume para:",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Movendo Volume - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE," SysAnimate32",WS_TABSTOP | 0x6,0,0,229, - 33 - LTEXT "Movendo o volume %3 da partição %2 no servidor %1 para a partição %5 no servidor %4...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Exibir Arquivo de Log" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Exibir arquivo de log no &servidor:",IDC_STATIC,4,45, - 107,8 - COMBOBOX IDC_VIEWLOG_SERVER,114,43,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Arquivo no servidor a exibir:",IDC_STATIC,4,64,87,8 - EDITTEXT IDC_VIEWLOG_FILENAME,97,62,176,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,169,88,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,223,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,20,20 - LTEXT "Digite o caminho completo do arquivo de log que deseja exibir.", - IDC_VIEWLOG_DESC,31,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Exibir Arquivo de Log" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Conteúdo do arquivo:",IDC_SVC_VIEWLOG_CONTENTS,4,41,277, - 8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Salvar &Como:",IDC_VIEWLOG_SAVEAS,173,167,53,14 - DEFPUSHBUTTON "&Fechar",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "Arquivo de log [para o serviço %2] no servidor %1", - IDC_SVC_VIEWLOG_DESC,33,7,248,8 - LTEXT "Nome do arquivo no servidor: %1", - IDC_SVC_VIEWLOG_FILENAME,33,23,248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Definir Quota do Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Quota Atual:",IDC_STATIC,4,49,47,8 - LTEXT "(desconhecida)",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "Nova &Quota:",IDC_STATIC,4,81,47,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,109,112,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,163,112,50,14 - PUSHBUTTON "&Ajuda",9,217,112,50,14 - PUSHBUTTON "&Propriedades...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "Partição:",IDC_STATIC,4,30,47,8 - LTEXT "Partição %2 do servidor %1",IDC_SET_AGGREGATE,59,30,141, - 8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Volume %1",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Operações em Andamento - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "As seguintes operações estão em andamento:", - IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Sincronizar VLDB" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,107,81,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,161,81,50,14 - PUSHBUTTON "&Ajuda",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "(definido no runtime)",IDC_SYNC_DESC,37,4,228,32 - LTEXT "(definido no runtime)",IDC_SYNC_DESC2,37,44,228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Replicar Volume" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,115,153,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,153,50,14 - PUSHBUTTON "&Ajuda",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "Nova réplica do volume %3",IDC_SET_NAME,31,12,242,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "&Criar uma nova réplica deste volume em:",IDC_STATIC,4, - 35,125,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 263, 157 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Instalar Arquivo" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Ar&quivo de origem:",IDC_STATIC,4,74,62,8 - EDITTEXT IDC_FILENAME,71,72,135,14,ES_AUTOHSCROLL - PUSHBUTTON "&Procurar...",IDC_BROWSE,209,72,50,14 - LTEXT "&Servidor de destino:",IDC_STATIC,4,94,63,8 - COMBOBOX IDC_SERVER,71,92,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Nome de destino:",IDC_STATIC,4,114,62,8 - EDITTEXT IDC_DIRECTORY,71,112,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,101,139,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,155,139,50,14 - PUSHBUTTON "&Ajuda",9,209,139,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,21,20 - LTEXT "Instalar arquivo no servidor",IDC_STATIC,32,12,127,8 - LTEXT "(texto definido no runtime)\n(texto definido no runtime)\n(texto definido no runtime)\n(texto definido no runtime)", - IDC_INSTALL_DESC,4,29,255,33 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Remover Instalação de Arquivo" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",IDC_STATIC,4,66,35,8 - COMBOBOX IDC_SERVER,67,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Arquivo de destino:",IDC_STATIC,4,85,63,8 - EDITTEXT IDC_FILENAME,67,83,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,88,121,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,141,121,50,14 - PUSHBUTTON "&Ajuda",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "Remover instalação do arquivo do servidor",IDC_STATIC, - 32,12,140,8 - LTEXT "Esta operação permite restaurar uma cópia anteriormente instalada de um arquivo em um servidor específico. Se não existir nenhuma cópia instalada anteriormente do arquivo selecionado, o arquivo será removido.", - IDC_STATIC,4,29,240,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 200, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Eliminar Arquivos Antigos" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Servidor:",-1,8,56,40,8 - COMBOBOX IDC_SERVER,53,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Excluir todos os arquivos de &núcleo", - IDC_OP_DELETE_CORE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 53,70,143,10 - CONTROL "Excluir todos os arquivos .&BAK (backups de arquivos)", - IDC_OP_DELETE_BAK,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,53,82,143,17 - CONTROL "Excluir todos os arquivos .&OLD (backups mais antigos de arquivos)", - IDC_OP_DELETE_OLD,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,53,101,143,17 - DEFPUSHBUTTON "OK",IDOK,39,123,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,93,123,50,14 - PUSHBUTTON "&Ajuda",9,146,123,50,14 - ICON IDI_PRUNE,-1,4,4,20,20 - LTEXT "Eliminar arquivos antigos do servidor",-1,32,12,136,8 - LTEXT "Esta operação exclui cópias de backup de arquivos instalados em um servidor específico.", - -1,4,29,192,16 - LTEXT "Arquivos a excluir:",-1,8,70,45,16 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Renomear Volume" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Nome &Antigo:",IDC_STATIC,25,67,43,8 - EDITTEXT IDC_RENSET_OLD,74,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&Novo nome:",IDC_STATIC,25,85,39,8 - EDITTEXT IDC_RENSET_NEW,74,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,115,115,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,115,50,14 - PUSHBUTTON "Ajuda",9,223,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Para renomear o volume %3, digite abaixo um novo nome. Renomear altera automaticamente o nome do backup de um volume e de suas réplicas.\n\nAtenção: se você renomear um volume montado, será preciso excluir e recriar seu ponto de montagem.", - IDC_RENSET_DESC,31,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 277, 68 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Excluir Serviço" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "Cancelar",IDCANCEL,169,50,50,14 - PUSHBUTTON "OK",IDOK,115,50,50,14 - PUSHBUTTON "Ajuda",9,223,50,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "Atenção!\n\nEsta operação fará com que o serviço %2 seja interrompido e excluído do servidor %1.", - IDC_DELSVC_DESC,31,7,242,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Obter Datas de Arquivo" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",-1,6,56,42,8 - COMBOBOX IDC_SERVER,72,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Arquivo a consultar:",-1,6,75,63,8 - EDITTEXT IDC_FILENAME,72,73,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,107,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,140,107,50,14 - PUSHBUTTON "&Ajuda",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "Obter datas de arquivos no servidor",-1,32,12,127,8 - LTEXT "Esta operação obtém a data em que um arquivo e seus backups (se existirem) foram modificados por último.", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Obter Datas de Arquivo - Resultados" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Servidor:",IDC_STATIC,4,30,39,8 - LTEXT "(definido no runtime)",IDC_SERVER,65,30,137,8 - LTEXT "Nome do Arquivo:",IDC_STATIC,4,45,58,8 - LTEXT "(definido no runtime)",IDC_FILENAME,65,45,137,8 - LTEXT "Data do arquivo:",IDC_STATIC,4,60,53,8 - LTEXT "(desconhecida: o arquivo não foi encontrado)", - IDC_DATE_FILE,65,60,176,8 - LTEXT "Data de .BAK:",IDC_STATIC,4,75,48,8 - LTEXT "(desconhecida: o arquivo não foi encontrado)", - IDC_DATE_BAK,65,75,176,8 - LTEXT "Data de .OLD:",IDC_STATIC,4,90,49,8 - LTEXT "(desconhecida: o arquivo não foi encontrado)", - IDC_DATE_OLD,65,90,176,8 - DEFPUSHBUTTON "&Fechar",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "Obter datas de arquivos no servidor",IDC_STATIC,32,12, - 127,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 295, 144 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Descarregar Volume - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Criar arquivo de descarga &chamado",IDC_STATIC,6,39,77, - 17 - EDITTEXT IDC_DUMP_FILENAME,86,40,151,14,ES_AUTOHSCROLL - PUSHBUTTON "&Procurar...",IDC_DUMP_BROWSE,240,40,50,14 - CONTROL "Descarregar &todo o conteúdo do volume %3 (partição %1:%2)", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,5, - 78,274,10 - CONTROL "Descarregar somente arquivos alterados &desde", - IDC_DUMP_LIMIT_TIME,"Button",BS_AUTORADIOBUTTON,5,94,160, - 10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,169,93,51, - 13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,227,93,56, - 13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,131,126,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,185,126,50,14 - PUSHBUTTON "&Ajuda",9,240,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "Esta operação copia o conteúdo de um volume para um arquivo único, de forma que se pode fazer facilmente o backup de um volume. O conteúdo de volumes descarregados desta forma pode ser restaurado mais tarde.", - IDC_STATIC,29,7,261,24 - GROUPBOX "Parâmetros de Descarga",IDC_STATIC,4,62,286,53 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Restaurar Volume - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Arquivo a &restaurar:",IDC_STATIC,4,33,48,19 - EDITTEXT IDC_RESTORE_FILENAME,57,30,175,14,ES_AUTOHSCROLL - PUSHBUTTON "&Procurar...",IDC_RESTORE_BROWSE,238,30,50,14 - CONTROL "Este é um arquivo de descarga de &incremento", - IDC_RESTORE_INCREMENTAL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,57,46,175,10 - LTEXT "&Volume:",IDC_STATIC,11,102,23,8 - EDITTEXT IDC_RESTORE_SETNAME,50,100,115,14,ES_AUTOHSCROLL - LTEXT "&Servidor:",IDC_STATIC,11,145,33,8 - COMBOBOX IDC_RESTORE_SERVER,51,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Partição:",IDC_STATIC,11,162,36,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,50,161,231, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "OK",IDOK,128,230,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,183,230,50,14 - PUSHBUTTON "&Ajuda",9,238,230,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "Restaurar volume do arquivo de descarga",IDC_STATIC,33, - 11,224,8 - GROUPBOX "Volume de destino",IDC_STATIC,4,63,284,160 - LTEXT "Quando se restaura um volume de um arquivo de descarga, pode-se criar um novo volume ou sobrepor um volume existente de leitura/gravação.", - IDC_STATIC,11,78,259,16 - LTEXT "(definido no runtime)\n(definido no runtime)", - IDC_RESTORE_CREATE,51,119,229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "&Periodicamente parar e reiniciar todos os serviços neste servidor", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | - WS_TABSTOP,11,72,193,14 - LTEXT "&Reiniciar",IDC_BOS_GENRES_DESC1,20,91,30,8 - COMBOBOX IDC_BOS_GENRES_DATE,54,89,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "à&s",IDC_BOS_GENRES_DESC2,127,91,13,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,143, - 89,53,13,WS_EX_CLIENTEDGE - CONTROL "Periodicamente testar todos os serviços neste servidor para novos &binários", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | - WS_TABSTOP,11,149,201,17 - LTEXT "&Testar",IDC_BOS_BINRES_DESC1,23,174,25,8 - COMBOBOX IDC_BOS_BINRES_DATE,54,171,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "às",IDC_BOS_BINRES_DESC2,127,174,8,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,143, - 171,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "Serviço %2 (servidor %1)",IDC_SVC_NAME,44,13,176,8 - GROUPBOX "Serviço BOS",IDC_STATIC,5,27,215,175 - LTEXT "O serviço BOS pode ser usado para parar e reiniciar periodicamente todos os serviços neste servidor (inclusive o próprio serviço BOS).", - IDC_STATIC,11,41,200,27 - LTEXT "O serviço BOS também pode ser usado para testar periodicamente todos os serviços em um servidor, parando e reiniciando somente aqueles cujos arquivos binários forem atualizados.", - IDC_STATIC,11,112,200,32 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Descarregando Volume - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE," SysAnimate32",WS_TABSTOP | 0x6,0,0,229, - 33 - LTEXT "Criando arquivo de descarga %4 do volume %3...", - IDC_DUMPSET_DESC,4,41,229,19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "Restaurando Volume - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_ANIMATE," SysAnimate32",WS_TABSTOP | 0x6,0,0,229, - 33 - LTEXT "Restaurando o volume %1 do arquivo de descarga %2...", - IDC_RESTORESET_DESC,4,41,229,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 258, 163 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Fazer Backup de Volumes - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Criar versões de backup de &todos os volumes nesta célula", - IDC_CLONE_ALL,"Button",BS_AUTORADIOBUTTON,25,48,214,10 - GROUPBOX " ",IDC_STATIC,23,63,231,77 - CONTROL "Somente criar &backups para os volumes que correspondam aos seguintes critérios:", - IDC_CLONE_SOME,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,25,59,214,18 - CONTROL "Somente volumes no &servidor:",IDC_CLONE_SVR_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,84,115,10 - COMBOBOX IDC_CLONE_SVR,158,83,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Somente volumes na &partição:",IDC_CLONE_AGG_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,100,113,10 - COMBOBOX IDC_CLONE_AGG,158,99,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Somente volumes &começando com:",IDC_CLONE_PREFIX_LIMIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,117,125,10 - EDITTEXT IDC_CLONE_PREFIX,158,116,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,95,145,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,149,145,50,14 - PUSHBUTTON "&Ajuda",9,204,145,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Um backup de volume atua como uma cópia somente de leitura desse volume. Somente um volume de leitura/gravação pode ter uma versão de backup.\nPode-se criar versões de backup para mais de um volume ao mesmo tempo.", - IDC_STATIC,30,7,214,40 -END - -IDD_SUBSETS DIALOGEX 0, 0, 297, 183 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Servidores Monitorados" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Nome do subconjunto:",IDC_STATIC,10,77,74,8 - EDITTEXT IDC_SUBSET_NAME,85,75,113,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "&Abrir...",IDC_SUBSET_LOAD,204,75,39,14 - PUSHBUTTON "&Salvar...",IDC_SUBSET_SAVE,248,75,39,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "Monitorar &Todos",IDC_SUBSET_ALL,211,122,78,14 - PUSHBUTTON "Não Monitorar &Nenhum",IDC_SUBSET_NONE,211,140,78,14 - LTEXT "Para melhorar o desempenho ao trabalhar numa célula grande, pode-se optar por não monitorar certos servidores. O Gerenciador de Servidor do AFS não mostrará os volumes, partições ou serviços em nenhum servidor que não seja monitorado.", - IDC_STATIC,5,5,287,24 - LTEXT "Pode-se escolher monitorar (ou não) um servidor por vez. É possível criar subconjuntos de servidores para designar listas de servidores que devem ser monitorados.", - IDC_STATIC,5,34,287,26 - GROUPBOX "Subconjunto Atual",IDC_STATIC,5,64,287,114 - LTEXT "Servidores a Monitorar:",IDC_STATIC,10,95,89,8 -END - -IDD_SUBSET_LOADSAVE DIALOGEX 0, 0, 300, 146 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(título definido no runtime)" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Nome do Subconjunto:",1090,5,112,78,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,84,110,156,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Abrir",IDOK,246,110,50,14 - PUSHBUTTON "Cance&lar",IDCANCEL,246,128,50,14 - CONTROL "List1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,292,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "Subconjuntos já definidos para esta célula:",IDC_STATIC, - 4,6,155,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Procurar Comando" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Exibir &Ajuda",IDOK,147,38,67,14 - PUSHBUTTON "&Cancelar",IDCANCEL,147,55,67,14 - LTEXT "Para descobrir como usar o Gerenciador de Servidor do AFS para realizar uma tarefa, selecione uma linha de comando abaixo e clique no botão Exibir Ajuda.", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Pesquisar Código de Erro" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Número do &Erro:",IDC_STATIC,4,41,51,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Converter",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "&Fechar",IDCANCEL,85,123,48,14 - LTEXT "(texto definido no runtime)",IDC_ERROR_DESC,4,64,210,55 - LTEXT "Para descobrir o que significa um código de erro, digite o código abaixo e clique no botão ""Converter"".", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Sobre o Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "Gerenciador de Servidor do AFS versão 3.5",IDC_STATIC, - 33,8,163,8 - LTEXT "Copyright © IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "&Fechar",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "O Gerenciador de Servidor do AFS está procurando servidores na célula %1...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 279, 136 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Exibir nomes completos de domínio para servidores (tais como, ""machine.company.com"")", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,5,2,269,17 - CONTROL "Exibir um &aviso ao trabalhar sem tokens administrativos", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,20,269,10 - CONTROL "...sempre mostra as propriedades desse servidor", - IDC_OPT_SVR_DBL_PROP,"Button",BS_AUTORADIOBUTTON,17,42, - 253,10 - CONTROL "...mostra as propriedades desse servidor somente se o Painel de Exibição Rápida estiver aberto", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,17,52,253,15 - CONTROL "...sempre abre uma janela para esse servidor", - IDC_OPT_SVR_DBL_OPEN,"Button",BS_AUTORADIOBUTTON,17,67, - 253,10 - CONTROL "...abrir uma janela de servidor faz com que esse servidor seja monitorado", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,17,98,253,10 - CONTROL "...fechar uma janela de servidor faz com que esse servidor deixe de ser monitorado", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,17,109,253,17 - LTEXT "Dar um clique duplo no ícone de um servidor...", - IDC_STATIC,5,32,269,8 - LTEXT "Se um subconjunto de servidores estiver em uso e o painel de Exibição Rápida estiver fechado...", - IDC_STATIC,5,80,269,16 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "&Incluir Chave do Servidor",IDC_KEY_ADD,17,160,98,14 - PUSHBUTTON "&Remover Chave do Servidor",IDC_KEY_REMOVE,123,160,98, - 14 - LTEXT "Chaves para o servidor:",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Incluir chave do Servidor" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Versão:",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "Valor:",IDC_STATIC,7,58,21,8 - CONTROL "Criptografar esta cadeia:",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,27,58,90,10 - CONTROL "Usar esta chave:",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,27,76,73,10 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "&Aleatória",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "Lembrete: após incluir uma chave para um servidor, deve-se modificar a conta do AFS para usar a nova chave. Após alguns dias, pode-se remover quaisquer chaves antigas do servidor.", - IDC_STATIC,7,99,267,25 - DEFPUSHBUTTON "OK",IDOK,116,129,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,170,129,50,14 - PUSHBUTTON "Ajuda",9,224,129,50,14 - LTEXT "Nova chave para o servidor %1",IDC_KEY_TITLE,43,14,181, - 8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 319, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Iniciar/Parar Serviço" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,115,115,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,115,50,14 - PUSHBUTTON "&Ajuda",9,265,115,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,21,20 - LTEXT "Clique em OK para iniciar/parar o serviço %2 no servidor %1.", - IDC_STARTSTOP_TEXT,73,12,242,9 - CONTROL "&Permanente (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,37, - 68,272,10 - CONTROL "&Temporária (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,37, - 83,270,10 - GROUPBOX "Inicialização do Serviço",IDC_STATIC,31,31,284,70 - LTEXT "Pode-se tornar esta alteração permanente, de modo que o serviço %2 inicie (ou não) automaticamente se o servidor %1 for reiniciado.", - IDC_STARTSTOP_STARTUP,38,45,223,16 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Executar Comando" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",IDC_STATIC,4,60,42,8 - COMBOBOX IDC_SERVER,50,58,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Comando:",IDC_STATIC,4,79,42,8 - EDITTEXT IDC_COMMAND,50,77,194,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,86,107,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,140,107,50,14 - PUSHBUTTON "&Ajuda",9,194,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "Executar comando no servidor",IDC_STATIC,32,12,185,8 - LTEXT "Esta operação permite emitir um comando em um servidor remoto.\nNormalmente é usada para reiniciar um servidor executando o script /etc/reboot.", - IDC_STATIC,4,29,240,24 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 254, 271 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Recuperar Volumes - Gerenciador de Servidor do AFS" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Servidor:",IDC_STATIC,9,50,35,8 - COMBOBOX IDC_SERVER,46,48,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Partição:",IDC_STATIC,9,67,35,8 - COMBOBOX IDC_AGGREGATE,46,65,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Re&cuperar todas as partições",IDC_AGGREGATE_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,138,65,108,11 - LTEXT "V&olume:",IDC_STATIC,8,85,35,8 - COMBOBOX IDC_FILESET,46,83,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Rec&uperar todos os volumes",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,138,84,105,10 - DEFPUSHBUTTON "OK",IDOK,85,104,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,142,104,50,14 - PUSHBUTTON "&Ajuda",9,199,104,50,14 - PUSHBUTTON "A&vançado >>",IDC_ADVANCED,4,104,53,14 - LTEXT "Caminho para arquivos &temporários:",IDC_STATIC,10,125, - 74,17 - EDITTEXT IDC_SALVAGE_TEMPDIR,100,124,144,13,ES_AUTOHSCROLL - CONTROL "Operações Pa&ralelas de recuperação; número de processos:", - IDC_SALVAGE_SIMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 8,159,205,10 - EDITTEXT IDC_SALVAGE_NUM,213,156,19,13,ES_AUTOHSCROLL - CONTROL "&Não recuperar volumes danificados", - IDC_SALVAGE_READONLY,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,169,123,10 - CONTROL "&Quebrar operações de leitura em pequenos blocos", - IDC_SALVAGE_BLOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 8,179,180,10 - CONTROL "&Forçar recuperação de todos os volumes indicados", - IDC_SALVAGE_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 8,189,181,10 - CONTROL "Forçar r&econstrução da estrutura de diretórios", - IDC_SALVAGE_FIXDIRS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,199,157,10 - LTEXT "Nome do arquivo para o &log de resultados:",IDC_STATIC, - 10,214,74,17 - EDITTEXT IDC_SALVAGE_LOG_FILE,92,215,144,13,ES_AUTOHSCROLL - CONTROL "Incluir lista de inodes &danificados no log de resultados", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,235,203,10 - CONTROL "&Incluir lista de inodes raiz de propriedade do AFS no log de resultados", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,8,249,232,10 - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "Esta operação permite resolver problemas em um ou mais volumes.\n\nNota: Se você recuperar toda uma partição ou servidor de uma só vez, o servidor será posto temporariamente off-line.", - IDC_STATIC,36,7,214,32 - GROUPBOX "Opções Avançadas de Recuperação",IDC_ADVANCED_GROUP,4, - 145,246,122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Recuperar Volumes - Resultados" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "&Fechar",IDOK,232,160,50,14 - LTEXT "Resultados da operação de recuperação:",IDC_STATIC,4,33, - 277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "Recuperar volume %3 na partição %2 do servidor %1", - IDC_SALVAGE_TITLE,33,15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Liberar Volume" -FONT 9, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,115,84,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,169,84,50,14 - PUSHBUTTON "&Ajuda",9,223,84,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "Esta operação permite atualizar as réplicas do volume %3. Pode-se escolher atualizar somente réplicas desatualizadas, ou todas as réplicas.", - IDC_RELSET_DESC,31,7,242,26 - CONTROL "&Atualizar somente as réplicas do volume que estejam desatualizadas", - IDC_RELSET_NORMAL,"Button",BS_AUTORADIOBUTTON,13,41,227, - 10 - CONTROL "Atualizar &todas as réplicas do volume, mesmo que não estejam desatualizadas", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,13,56,258, - 10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Incluir Servidor Host",IDC_HOST_ADD,67,160,68,14 - PUSHBUTTON "&Remover Servidor Host",IDC_HOST_REMOVE,141,160,80,14 - LTEXT "Servidores host de banco de dados reconhecidos pelo servidor:", - IDC_HOST_TITLE,5,7,216,8 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 225, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Incluir Servidor Host" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "&Host:",-1,31,55,26,8 - EDITTEXT IDC_ADDHOST_HOST,61,53,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,63,88,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,117,88,50,14 - ICON IDI_SERVER,-1,4,4,21,20 - LTEXT "Você escolheu incluir um servidor host de banco de dados à lista armazenada no servidor %1.\n\nDigite abaixo o nome do novo host de banco de dados.", - IDC_ADDHOST_DESC,31,10,190,34 - PUSHBUTTON "Ajuda",9,171,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Alterar Endereços de Servidor" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Endereços IP gravados no VLDB para o servidor %1:", - IDC_TITLE,4,4,200,8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Al&terar...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "&Remover",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "OK",IDOK,46,97,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,100,97,50,14 - PUSHBUTTON "Ajuda",9,154,97,50,14 - LTEXT "Nota: quando um servidor de arquivos é iniciado, ele registra automaticamente seu(s) endereço(s) IP atual (atuais) com o VLDB.", - IDC_STATIC,4,64,200,25 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Alterar Endereço IP" -CLASS "AFSManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,61,51,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,115,51,50,14 - PUSHBUTTON "Ajuda",9,169,51,50,14 - LTEXT "Digite o novo endereço IP que deve substituir %1 no VLDB:", - IDC_TITLE,4,4,215,8 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,45,23, - 90,14 - LTEXT "Endereço:",IDC_STATIC,4,26,36,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "Servidor %1 - Listas de Admin" - IDS_TAB_SERVICES "Serviços" - IDS_TAB_AGGREGATES "Partições" - IDS_TAB_FILESETS "Volumes" - IDS_SERVICE_NONESELECTED "Selecione um servidor para ser exibido." - IDS_SERVICE_GOTSELECTED "Processos de serviço no servidor %1:" - IDS_AGGREGATE_ALL "Partições em todos os servidores:" - IDS_AGGREGATE_ONE "Partições no servidor %1:" - IDS_FILESET_ALL "Todos os volumes na célula %1:" - IDS_FILESET_ONE "Volumes no servidor %1:" - IDS_SVR_LISTS_TAB "Listas de Admin" - IDS_SVR_PROP_TITLE "Servidor %1 - Propriedades" - IDS_SVR_GENERAL_TAB "Geral" - IDS_SVR_SCOUT_TAB "Definições" - IDS_SERVER_TITLE "Servidor %1 - Gerenciador de Servidor do AFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "Servidor %1 na célula %2:" - IDS_SVC_PROP_TITLE "Serviço %2 no Servidor %1 - Propriedades" - IDS_SVC_GENERAL_TAB "Geral" - IDS_SVC_ADD_TITLE "Criar Serviço" - IDS_SVC_ADD_TAB "Criar Serviço" - IDS_AGG_PROP_TITLE "Partição %2 no Servidor %1 - Propriedades" - IDS_AGG_GENERAL_TAB "Geral" - IDS_SET_REP_TITLE "Volume %1 - Replicação" - IDS_SET_REPSITES_TAB "Locais de Replicação" - IDS_SET_PROP_TITLE "Volume %1 - Propriedades" - IDS_SET_GENERAL_TAB "Geral" - IDS_SET_UNLOCKBTN "&Desbloquear Agora" - IDS_SET_LOCKBTN "&Bloquear Agora" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%1 usado da quota de %2 (%3%%)" - IDS_USAGE_AGGREGATE "%1 usado da capacidade de %2 (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "Quota Combinada" - IDS_SVRCOL_NAME "Servidor" - IDS_SVRCOL_STATUS "Status" - IDS_SETCOL_DATE_ACCESS "Último Acesso" - IDS_SETCOL_DATE_BACKUP "Último Backup" - IDS_SVCCOL_NAME "Serviço" - IDS_SVCCOL_TYPE "Tipo" - IDS_SVCCOL_PARAMS "Parâmetros" - IDS_SVCCOL_STATUS "Status" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "Último Início" - IDS_SVCCOL_DATE_STOP "Última Parada" - IDS_SVCCOL_DATE_STARTSTOP "Último Início/Parada" - IDS_SVCCOL_DATE_FAILED "Última Falha" - IDS_SVCCOL_LASTERROR "Último Código de Saída" - IDS_AGGCOL_NAME "Partição" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "Dispositivo" - IDS_AGGCOL_USED "Usado" - IDS_AGGCOL_USED_PER "% Usado" - IDS_AGGCOL_FREE "Livre" - IDS_AGGCOL_TOTAL "Capacidade" - IDS_AGGCOL_STATUS "Status" - IDS_SETCOL_NAME "Volume" - IDS_SETCOL_TYPE "Tipo" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "Criado" - IDS_SETCOL_DATE_UPDATE "Última Atualização" - IDS_SETCOL_STATUS "Status" - IDS_SETCOL_QUOTA_USED "Usado" - IDS_SETCOL_QUOTA_USED_PER "% Usado" - IDS_SETCOL_QUOTA_FREE "Livre" - IDS_SETCOL_QUOTA_TOTAL "Quota" - IDS_TRYAGAINBTN "Tentar &Novamente" - IDS_NO_CELL_SELECTED "(nenhuma célula foi especificada)" - IDS_NO_AFS_ID "(nenhum token está disponível)" - IDS_AFS_ID_WILLEXP "%1 (tokens irão vencer em %2)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS - "Aguarde: obtendo informações sobre a célula %1..." - IDS_STATUS_NOALERTS "Normal" - IDS_TITLE_BROWSE_USER "Selecionar Usuário" - IDS_AGGTYPE_OTHER "Desconhecido (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "Criando volume %3 na partição %1:%2" - IDS_ACTION_DELETEFILESET "Excluindo volume %3 da partição %1:%2" - IDS_ACTION_MOVEFILESET "Movendo volume %3 para a partição %1:%2" - IDS_ACTION_SETFILESETQUOTA "Alterando a quota para o volume %3" - IDS_SVCSTOP_DESC2 "Clique em OK para interromper este serviço." - IDS_SVCSTART_DESC2 "Clique em OK para iniciar este serviço." - IDS_SYNCVLDB_SVR_DESC "Atenção!\n\nSe você prosseguir, o Gerenciador de Servidor do AFS modificará o VLDB para corresponder ao conteúdo de todas as partições no servidor %1." - IDS_SYNCVLDB_SVR_DESC2 "Se o VLDB mencionar um volume que por algum motivo não possa ser localizado no momento em nenhuma partição no servidor %1, a entrada para aquele volume no VLDB será excluída!" - IDS_SYNCVLDB_AGG_DESC "Atenção!\n\nSe você prosseguir, o Gerenciador de Servidor do AFS modificará o VLDB para corresponder ao conteúdo da partição %2 no servidor %1." - IDS_SYNCVLDB_AGG_DESC2 "Se o VLDB mencionar um volume que por algum motivo não possa ser localizado nessa partição, a entrada para aquele volume no VLDB será excluída!" - IDS_PROMPT_BROWSE_USER "Usuário:" - IDS_PREVIEWIN_BUTTON "<< &Pré-exibição" - IDS_PREVIEWOUT_BUTTON "&Pré-exibição >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "Usuário" - IDS_TITLE_BROWSE_PRINCIPAL "Selecionar Usuário Principal" - IDS_TITLE_BROWSE_OWNGROUP "Selecionar Grupo Proprietário" - IDS_PROMPT_BROWSE_PRINCIPAL "Proprietário:" - IDS_PROMPT_BROWSE_OWNGROUP "Grupo Proprietário:" - IDS_ACTION_CLONE "Criando versão de backup do volume %3" - IDS_ACTION_CLONESYS "Criando múltiplos backups do volume" - IDS_CLONESYS_FAILED "Não foi possível criar um backup do volume %1 devido ao erro 0x%2 (%3)." - IDS_SET_UNSPECIFIED "(não especificado)" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "Contagem de Arquivos" - IDS_SET_DUMP_NAME "Descarga de %1.DMP" - IDS_ACTION_DUMP "Descarregando o volume %3 (partição %1:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "Partição" - IDS_REFRESH_DESC_CELL "O Gerenciador de Servidor do AFS está determinando o status dos servidores na célula %1. Isto pode levar alguns minutos..." - IDS_REFRESH_DESC_SERVER "O Gerenciador de Servidor do AFS está determinando o status do servidor %1. Isto pode levar alguns momentos..." - IDS_REFRESH_CURRENT_CELL "Examinando no momento: célula %1" - IDS_REFRESH_CURRENT_SERVER "Examinando no momento: servidor %1" - IDS_REFRESH_CURRENT_AGGREGATE - "Examinando no momento: partição %3 no servidor %2" - IDS_REFRESH_CURRENT_FILESET - "Examinando no momento: volume %4 no servidor %2, partição %3" - IDS_REFRESH_CURRENT_SERVICE - "Examinando no momento: serviço %3 no servidor %2" - IDS_REFRESH_PERCENT "%1%% concluído" - IDS_PROBLEMS "Problemas" - IDS_SERVER_NO_PROBLEMS "Este servidor não tem problemas conhecidos." - IDS_SERVICE_NO_PROBLEMS "Este serviço não tem problemas conhecidos." - IDS_AGGREGATE_NO_PROBLEMS "Esta partição não tem problemas conhecidos." - IDS_FILESET_NO_PROBLEMS "Este volume não tem problemas conhecidos." - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB - "Examinando no momento: banco de dados de localização de volumes (VLDB)" - IDS_FILESETTYPE_RW "Leitura/Gravação" - IDS_FILESETTYPE_RO "Réplica" - IDS_FILESETTYPE_CLONE "Backup" - IDS_MOVESET_READWRITE "Prosseguir fará com que o volume %3 seja movido da partição %2 do servidor %1 para outra localização." - IDS_MOVESET_READONLY "Prosseguir fará com que a réplica do volume %3 seja removida da partição %2 do servidor %1, e que outra réplica do volume seja criada na partição especificada abaixo." - IDS_SVC_START_TITLE "Iniciar Serviço" - IDS_SVC_STOP_TITLE "Parar Serviço" - IDS_SERVICESTATUS_STARTING "Este serviço está iniciando no momento." - IDS_SERVICESTATUS_RUNNING "Este serviço está em execução no momento." - IDS_SERVICESTATUS_STOPPED "Este serviço está parado no momento." - IDS_SERVICESTATUS_STOPPING "Este serviço está parando no momento." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "O status deste serviço é desconhecido." - IDS_SVC_RESTART_BUTTON "Parar e &Reiniciar Agora" - IDS_PROBLEM_BOX "Problemas Conhecidos (%1)" - IDS_VIEWLOG_DESC_NOFILE "O Gerenciador de Servidor do AFS não conseguiu encontrar o arquivo de log para o serviço %2 no servidor %1. Digite abaixo o nome completo do caminho para o arquivo de log do serviço." - IDS_NO_GROUP "(nenhum grupo proprietário)" - IDS_VIEWLOG_FROMSERVER "Arquivo de log no servidor %1" - IDS_VIEWLOG_FROMSERVICE "Arquivo de log para o serviço %2 no servidor %1" - IDS_VIEWLOG_TRUNCATED "Conteúdo do arquivo (somente as últimas %1 linhas são exibidas):" - IDS_SAVELOG_FILTER "Arquivo de Texto|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< A&vançado" - IDS_ADVANCEDOUT_BUTTON "A&vançado >>" - IDS_REPTYPE_RELEASE "Liberar Replicação" - IDS_REPTYPE_SCHEDULED "Replicação Programada" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "A&tualizar Tudo" - IDS_UPDATETHIS_BUTTON "At&ualizar" - IDS_SERVER_MULTIPLE_PROBLEMS "Este servidor tem %1 problemas conhecidos." - IDS_SERVICE_MULTIPLE_PROBLEMS "Este serviço tem %1 problemas conhecidos." - IDS_AGGREGATE_MULTIPLE_PROBLEMS - "Esta partição tem %1 problemas conhecidos." - IDS_FILESET_MULTIPLE_PROBLEMS "Este volume tem %1 problemas conhecidos." - IDS_FILESETTYPE_RO_STAGE "Réplica" - IDS_SERVICETYPE_SIMPLE_LONG "Simples (executa continuamente)" - IDS_SERVICETYPE_CRON_LONG - "Cronometrado (executa a intervalos especificados)" - IDS_QUOTAUNITS_KB "kb" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "(este volume é uma réplica e portanto não tem quota)" - IDS_NO_QUOTA_CLONE "(este volume é um backup e portanto não tem quota)" - IDS_USAGE_REPLICA "%1 usado" - IDS_USAGE_CLONE "%1 usado" - IDS_COL_AGGS_MOVE "partições ao criar um volume" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "Partições no servidor %1:" - IDS_AGGREGATES_IN_CELL "Todas as partições na célula %1:" - IDS_AGGREGATES_IN_NOTHING "Partições:" - IDS_FILESETS_IN_SERVER "Volumes no servidor %1:" - IDS_FILESETS_IN_CELL "Todos os volumes na célula %1:" - IDS_FILESETS_IN_NOTHING "Volumes:" - IDS_SERVICES_IN_SERVER "Serviços no servidor %1:" - IDS_SERVICES_IN_NOTHING "Serviços:" - IDS_UNKNOWN "(desconhecido)" - IDS_UNKNOWN_GROUP "grupo #%1 (nome desconhecido)" - IDS_AGGFULL_WARN_OFF "o limite padrão (aviso desativado no servidor)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "o limite padrão (aviso desativado no servidor)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - Código de saída %2" - IDS_COL_SERVERS "servidores em uma célula" - IDS_COL_FILESETS "volumes em um servidor" - IDS_COL_AGGREGATES "partições em um servidor" - IDS_COL_SERVICES "serviços em um servidor" - IDS_COL_REPLICAS "réplicas de um volume" - IDS_COLUMNS_TITLE "Selecionar Colunas de Exibição - Gerenciador de Servidor do AFS" - IDS_REPCOL_SERVER "Servidor" - IDS_REPCOL_AGGREGATE "Partição" - IDS_REPCOL_DATE_UPDATE "Última Atualização" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "partições ao mover um volume" - IDS_WARN_TITLE "Atenção" - IDS_WARN_DISABLE_AUTH "Clicando o botão ""Permitir Não Autenticado"", você permitirá que proprietários não autenticados manipulem os serviços neste servidor. Como muitos serviços executam sob a identidade root, esta ação representa +" - IDS_WARN_DISABLE_AUTH2 "um risco significativo na segurança do servidor.\n\nDeseja realmente fazer esta alteração?" - IDS_SVR_NO_ADDR "(não especificado)" - IDS_TITLE_BAD_CELL "Nome de Célula Não Reconhecido" - IDS_DESC_BAD_CELL "O nome de célula informado não foi encontrado na rede.\n\nVerifique o nome novamente para certificar-se de que esteja correto." - IDS_AGGFULL_WARN_ON "o &limite padrão para este servidor (%1%% de seu tamanho)" - IDS_SETFULL_WARN_ON "o &limite padrão para este servidor (%1%% de seu tamanho)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "A identificação do AFS informada não é reconhecida, ou a senha especificada está incorreta." - IDS_SVR_CREDS_NONE "(nenhum token)" - IDS_SVR_CREDS_VALID "%2, vence em %3" - IDS_SVR_CREDS_EXPIRED "(tokens vencidos em %3)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 (Quota combinada: %2)" - IDS_ACTION_DESC_NONE "Não há operações em andamento." - IDS_ACTION_DESC_ONE "A seguinte operação está em andamento:" - IDS_ACTION_DESC_MULT "As seguintes operações estão em andamento:" - IDS_ACTCOL_OPERATION "Operação" - IDS_ACTCOL_ELAPSED "Tempo Decorrido" - IDS_ACTION_REFRESH "Atualizando informações da célula" - IDS_ACTION_CREATESERVER "Criando o servidor %1" - IDS_ACTION_DELETESERVER "Excluindo o servidor %1" - IDS_ACTION_GETSERVERLOGFILE "Obtendo o arquivo de log %2 do servidor %1" - IDS_ACTION_SETSERVERAUTH - "Alterando as restrições de acesso para o servidor %1" - IDS_ACTION_CHANGESERVERSTATUS "Alterando as propriedades do servidor %1" - IDS_ACTION_STARTSERVICE "Iniciando o serviço %2 no servidor %1" - IDS_ACTION_STOPSERVICE "Parando o serviço %2 no servidor %1" - IDS_ACTION_RESTARTSERVICE "Reiniciando o serviço %2 no servidor %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "Sincronizando o VLDB com o servidor %1" - IDS_ACTION_SYNCVLDB_AGG "Sincronizando o VLDB com a partição %1:%2" - IDS_ACTION_SCOUT "Verificando o servidor %1 para problemas" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "alterando as propriedades de replicação para o volume %3" - IDS_ACTION_CREATEREPLICA "Criando réplica do volume %3 na partição %1:%2" - IDS_DELSET_REPLICA_DESC " Atenção!\n\nProsseguir fará com que a réplica do volume %3 na partição %2 do servidor %1 seja removida." - IDS_DELSET_CLONE_DESC " Atenção!\n\nProsseguir fará com que a réplica do volume %3 seja removida da partição %2 do servidor %1." - IDS_INSTALL_DESC1 "Esta operação copia um arquivo deste computador para outro. +" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "Se o arquivo já existir no computador de destino, será feito um backup dele com a extensão .BAK; qualquer backup existente receberá a extensão .OLD, e qualquer arquivo .OLD existente será excluído." - IDS_ACTION_INSTALLFILE "Instalando o arquivo %2 no servidor %1." - IDS_ACTION_UNINSTALLFILE - "Removendo a instalação do arquivo %2 a partir do servidor %1." - IDS_ACTION_PRUNEFILES "Eliminando arquivos do servidor %1" - IDS_FILTER_ALLFILES "Todos os arquivos|*.*|" - IDS_ACTION_RENAMEFILESET "Renomeando o volume %1 para %2" - IDS_RECUR_DAILY "todos os dias" - IDS_RECUR_SUNDAY "todo Domingo" - IDS_RECUR_MONDAY "toda Segunda-Feira" - IDS_RECUR_TUESDAY "toda Terça-Feira" - IDS_RECUR_WEDNESDAY "toda Quarta-Feira" - IDS_RECUR_THURSDAY "toda Quinta-Feira" - IDS_RECUR_FRIDAY "toda Sexta-Feira" - IDS_RECUR_SATURDAY "todo Sábado" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "Criando o serviço %2 no servidor %1" - IDS_ACTION_DELETESERVICE "Excluindo o serviço %2 do servidor %1" - IDS_ACTION_RELEASEFILESET "Liberando o volume %3" - IDS_ACTION_GETDATES "Obtendo datas para o arquivo %2 no servidor %1" - IDS_LASTMODIFIED "Modificado por último em %1" - IDS_SVR_SECURITY_TITLE "Segurança do Servidor -%1" - IDS_SVR_LIST_TAB "Administradores" - IDS_ACTION_ADMINLIST_LOAD "Obtendo administradores para o servidor %1" - IDS_ACTION_ADMINLIST_SAVE "Gravando administradores para o servidor %1" - IDS_ADMCOL_PRINCIPAL "Membro" - IDS_ADMCOL_TYPE "Tipo" - IDS_ADMCOL_TYPE_GROUP "Grupo" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "Restaurando o volume %1" - IDS_COL_AGGS_RESTORE "partições ao restaurar um volume" - IDS_RESTORE_FILTER "Arquivos de Descarga de Volume|*.DMP|Todos os arquivos|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "Alterando horários de reinício de serviços para o servidor %1" - IDS_RESTORE_CREATESET "O volume %1 será criado no servidor e na partição que forem especificados abaixo." - IDS_RESTORE_OVERWRITESET - "Atenção! O Volume %3 existe na partição %2 do servidor %1, e será sobreposto se você prosseguir!" - IDS_SUBSET_TITLE_LOAD "Abrir Subconjunto de Servidores" - IDS_SUBSET_TITLE_SAVE "Salvar Subconjunto de Servidores" - IDS_BUTTON_OPEN "&Abrir" - IDS_BUTTON_SAVE "&Salvar" - IDS_SUBSET_SAVE_TITLE "Atenção" - IDS_SUBSET_SAVE_DESC "Já existe um subconjunto de servidores com o nome %1.\n\nDeseja sobrepor este subconjunto?" - IDS_SUBSET_CHANGED "%1 [MODIFICADO]" - IDS_SUBSET_TAB "Servidores Monitorados" - IDS_SUBSET_DISCARD_TITLE "Salvar Subconjunto?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "Você não salvou a lista de servidores monitorados atualmente como um subconjunto. Se a lista for salva, poderá ser usada mais tarde para continuar a monitorar este mesmo conjunto de servidores.\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "Deseja criar um subconjunto para conter a lista dos servidores monitorados atualmente?" - IDS_SUBSET_NONAME "(sem título)" - IDS_SUBSET_NOSUBSET "(todos os servidores estão sendo monitorados)" - IDS_SUBSET_SERVERSUBSET "Servidor %1" - IDS_FILESET_SOME "Volumes em todos os servidores monitorados na célula %1:" - IDS_AGGREGATE_SOME "Partições em todos os servidores monitorados na célula %1:" - IDS_SERVICE_SOME "Serviços em todos os servidores monitorados na célula %1:" - IDS_FILESET_UNMON "O servidor %1 não está sendo monitorado" - IDS_AGGREGATE_UNMON "O servidor %1 não está sendo monitorado" - IDS_SERVICE_UNMON "O servidor %1 não está sendo monitorado" - IDS_SUBSET_DELETE_TITLE "Excluir Subconjunto?" - IDS_SUBSET_DELETE_DESC "Tem certeza que deseja excluir o subconjunto de servidores %1?" - IDS_ERROR_TRANSLATED "Erro número 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Erro número 0x%1 (%2) não é reconhecido." - IDS_FIND_NOTHING_TITLE "Nenhum Comando Selecionado" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "Para descobrir como realizar uma operação, selecione primeiro uma linha de comando na lista ou digite uma palavra-chave." - IDS_FIND_UNKNOWN_TITLE "Comando Desconhecido" - IDS_FIND_UNKNOWN_DESC "O Gerenciador de Servidor do AFS não encontrou nenhum tópico de ajuda para o comando ""%1""." - IDS_HELPABOUT_DESC1 "Aviso: este programa de computador é protegido por direitos autorais e por tratados internacionais. +" - IDS_HELPABOUT_DESC2 "A reprodução ou distribuição não autorizadas neste software pode resultar em pesadas penalidades civis e criminais, e será processada até o máximo possível permitido por lei.\n\n+" - IDS_HELPABOUT_DESC3 "AFS é uma marca da Transarc Corporation, uma empresa IBM." - IDS_CANT_QUIT_TITLE "Gerenciador de Servidor do AFS" - IDS_CANT_QUIT_REBOOT "Atenção!\n\nO Gerenciador de Servidor do AFS está realizando uma ou mais operações no momento. Se você encerrar o Windows agora, essas operações não concluirão com êxito.\n\nTem certeza de que deseja reiniciar o Windows?" - IDS_APP_TITLE "Gerenciador de Servidor do AFS" - IDS_ACTION_OPENCELL "Procurando Servidores na célula %1" - IDS_OPTIONS_TITLE "Opções - Gerenciador de Servidor do AFS" - IDS_OPTIONS_GENERAL_TAB "Geral" - IDS_BADCREDS_DESC "A menos que esteja com logon efetuado como administrador, você pode ter privilégios insuficientes para administrar com êxito na célula %1. Privilégios de acesso insuficientes podem fazer com que o Gerenciador de Servidor do AFS encontre problemas em uma célula quando na verdade tais problemas não existem." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "Confirmação - Gerenciador de Servidor do AFS" - IDS_NO_GROUP_CHECKBOX "Nenhum Grupo Proprietário" - IDS_AFS_ID_DIDEXP "%1 (tokens vencidos em %2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(consultando)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "Grupo Externo" - IDS_ADMCOL_TYPE_FOREIGN_USER "Usuário Externo" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "Notificador" - IDS_SVC_NONOTIFIER "(nenhum)" - IDS_SVR_KEY_TAB "Chaves de Servidor" - IDS_KEYNAME_NOTIME "Chaves para o servidor %1:" - IDS_KEYNAME_WITHTIME "Chaves para o Servidor %1 (modificadas em %2):" - IDS_SVRKEY_VERSION "Versão" - IDS_SVRKEY_DATA "Valor" - IDS_SVRKEY_CHECKSUM "Soma de Verificação" - IDS_SVRKEY_DATA_UNKNOWN "(oculta)" - IDS_STARTSERVICE_TITLE "Iniciar Serviço" - IDS_STOPSERVICE_TITLE "Parar Serviço" - IDS_STARTSERVICE_TEXT "Clique em OK para iniciar o serviço %2 no servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "Clique em OK para parar o serviço %2 no servidor %1." - IDS_STARTSERVICE_STARTUP - "É possível tornar esta alteração permanente, de modo que o serviço %2 inicie automaticamente se o servidor %1 for reiniciado." - IDS_STOPSERVICE_STARTUP "É possível tornar esta alteração permanente, de modo que o serviço %2 não inicie automaticamente se o servidor %1 for reiniciado." - IDS_STARTSERVICE_PERMANENT - "&Permanente (iniciar o serviço %2 se o servidor %1 reiniciar)" - IDS_STARTSERVICE_TEMPORARY - "&Temporária (não iniciar o serviço %2 se o servidor %1 reiniciar)" - IDS_STOPSERVICE_PERMANENT - "&Permanente (não iniciar o serviço %2 se o servidor %1 reiniciar)" - IDS_STOPSERVICE_TEMPORARY - "&Temporária (iniciar o serviço %2 se o servidor %1 reiniciar)" - IDS_ACTION_EXECUTE "Executando %2 no servidor %1" - IDS_ACTION_SALVAGE_SVR "Recuperando todos os volumes no servidor %1" - IDS_ACTION_SALVAGE_AGG "Recuperando todos os volumes na partição %1:2" - IDS_ACTION_SALVAGE_VOL "Recuperando o volume %3 na partição %1:2" - IDS_SALVAGE_SVR "Recuperar todos os volumes no servidor %1" - IDS_SALVAGE_AGG "Recuperar todos os volumes no servidor %1, partição %2" - IDS_SALVAGE_SET "Recuperar o volume %3 no servidor %1, partição %2" - IDS_SETSTATUS_SALVAGE "Recuperando o volume" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "O volume está bloqueado" - IDS_SETSTATUS_NO_VOL "Volume ausente" - IDS_SETSTATUS_BUSY "Volume ocupado no momento" - IDS_SETSTATUS_MOVED "Volume movido" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "Endereço" - IDS_HOST_TITLE "Servidores host de banco de dados reconhecidos pelo servidor %1:" - IDS_SVR_HOSTS_TITLE "Servidor %1 - Hosts de Banco de Dados" - IDS_SVR_HOST_TAB "Hosts de Banco de Dados" - IDS_ACTION_HOSTLIST_LOAD "Obtendo a lista de hosts do servidor %1" - IDS_ACTION_HOSTLIST_SAVE "Gravando a lista de hosts no servidor %1" - IDS_SETSTATUS_1ALERT "O volume tem um problema" - IDS_SETSTATUS_2ALERT "O volume tem %1 problemas" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "Alterando o endereço IP para o servidor %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED - "O servidor %1 não está sendo monitorado para detectar problemas" - IDS_ALERT_DESCSHORT_TIMEOUT - "O servidor %1 não pôde ser contactado; último erro: %3" - IDS_ALERT_DESCSHORT_AGG_FULL - "Uso da partição para %2 excede o limite de aviso de %3%% (%4)" - IDS_ALERT_DESCSHORT_SET_FULL - "O uso do volume para %3 excede o limite de aviso de %4%% (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT "O volume %3 não possui entrada no VLDB" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "O volume %3 tem uma entrada no VLDB mas não foi encontrado na partição %2 do servidor %1" - IDS_ALERT_DESCSHORT_STOPPED "Serviço %2 parado em %3" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "A partição %2 é referenciada pelo VLDB mas não foi encontrada no servidor %1" - IDS_ALERT_DESCSHORT_BADCREDS - "Você pode ter privilégios insuficientes para administrar o servidor %1" - IDS_ALERT_DESCSHORT_AGG_ALLOC - "A quota combinada de volumes na partição %2 excede sua capacidade" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE - "O volume %3 está danificado e não pode ser usado" - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "Não há nenhum serviço em execução para servir o volume %3" - IDS_ALERT_DESCSHORT_STATE_OFFLINE - "O volume %3 está offline e não pode ser usado" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "O servidor %1 não pôde ser contactado. A última tentativa, feita em %2, resultou no erro ""%3""." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "O uso da partição %2 no servidor %1 excede seu limite de aviso de %3%% (%4)." - IDS_ALERT_DESCFULL_SET_FULL - "O uso do volume %3 (servidor %1, partição %2) excede seu limite de aviso do %4%% (%5)." - IDS_ALERT_DESCFULL_NO_VLDBENT - "O volume %3 existe na partição %2 do servidor %1, mas não tem uma entrada correspondente no VLDB." - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "Existe no VLDB uma entrada para o volume %3, mas este não foi encontrado na partição %2 do servidor %1." - IDS_ALERT_DESCFULL_STOPPED - "O serviço %2 no servidor %1 parou em %3 com o código de saída %5." - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "O VLDB faz referência a volumes na partição %2 do servidor %1, mas a partição não pôde ser encontrada." - IDS_ALERT_DESCFULL_BADCREDS - "O Gerenciador de Servidor do AFS pode estar detectando erros inexistentes no servidor %1 porque você não tem tokens do AFS como administrador nesta célula." - IDS_ALERT_DESCFULL_AGG_ALLOC - "A quota combinada de volumes na partição %2 do servidor %1, totalizando %4, excede a capacidade %3 da partição." - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "O volume %3 na partição %2 do servidor %1 não tem um Vnode associado a ele. (O estado do volume é 0x%4.)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "Não existe um serviço exportador de arquivos executando no servidor %1, e portanto o volume %3 na partição %4 não pode ser usado. (O estado do volume é 0x%4.)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "O volume %3 na partição %2 do servidor %1 está offline e não pode ser usado. (O estado do volume é 0x%4.)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "Clique no botão Tentar Novamente para tentar contactar novamente este servidor." - IDS_ALERT_FIX_AGG_FULL "Clique no botão Avisos para alterar o limite de aviso para o uso desta partição." - IDS_ALERT_FIX_SET_FULL "Clique no botão Avisos para alterar o limite de aviso para o uso deste volume." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "O VLDB está possivelmente desatualizado; se for o caso, use o comando Sincronizar VLDB para atualizá-lo." - IDS_ALERT_FIX_NO_SVRENT_SET - "Verifique o servidor e partição para assegurar-se de que eles estão funcionando corretamente." - IDS_ALERT_FIX_STOPPED "Clique no botão Exibir Log para exibir o log de serviço para este serviço." - IDS_ALERT_FIX_NO_SVRENT_AGG - "Verifique o servidor para assegurar que a partição está exportada e funcionando corretamente." - IDS_ALERT_FIX_BADCREDS "Clique no botão Autenticação para obter novos tokens do AFS." - IDS_ALERT_FIX_AGG_ALLOC "Reduza a quota para volumes nesta partição, ou mova um ou mais volumes para outra partição." - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "Tentar &Novamente" - IDS_ALERT_BUTTON_WARNINGS "&Avisos..." - IDS_ALERT_BUTTON_VIEWLOG "E&xibir Log" - IDS_ALERT_BUTTON_SHOWME "&Mostre-me" - IDS_ALERT_BUTTON_GETCREDS "&Autenticação" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "Nenhuma célula foi especificada. Para usar o Gerenciador de Servidor do AFS, deve-se especificar a célula do AFS com a qual se deseja trabalhar. Escolha uma célula selecionando o item de menu ""Abrir..."" no menu ""Célula"" acima." - IDS_ERROR_REFRESH_CELLSERVERS - "A lista de servidores não pode ser obtida para a célula %1.\n\nErro: %2" - IDS_ERROR_CANT_OPEN_CELL - "O Gerenciador de Servidor do AFS não conseguiu contactar nenhum servidor na célula %1.\n\nCertifique-se de ter digitado corretamente o nome da célula." - IDS_ERROR_REFRESH_AGGREGATES - "A lista de servidores não pôde ser obtida para o servidor %1.\n\nErro: %2" - IDS_ERROR_REFRESH_SERVER_STATUS - "O status atual do servidor %1 não pôde ser obtido." - IDS_ERROR_CHANGE_SERVER_STATUS - "O Gerenciador de Servidor do AFS não conseguiu alterar as propriedades para o servidor %1." - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "O status atual da partição %2 no servidor %1 não pôde ser obtido." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "O status atual do volume %3 (servidor %1, partição %2) não pôde ser obtido." - IDS_ERROR_REFRESH_SERVICE_STATUS - "O status atual do serviço %2 no servidor %1 não pôde ser determinado." - IDS_ERROR_MOVE_FILESET "O Gerenciador de Servidor do AFS não conseguiu mover o volume %3 da partição %2 no servidor %1 para a partição %5 no servidor %4." - IDS_ERROR_VIEW_LOGFILE "O arquivo %2 não pôde ser lido a partir do servidor %1.\n\nCertifique-se de que digitou o nome do arquivo corretamente, e de que possui permissões suficientes para exibir o arquivo." - IDS_ERROR_NOT_REPLICATED - "O status de replicação do volume %1 não pôde ser determinado." - IDS_ERROR_CANT_CREATE_FILESET - "O Gerenciador de Servidor do AFS não conseguiu criar o volume %3 na partição %2 do servidor %1." - IDS_ERROR_CANT_DELETE_FILESET - "O Gerenciador de Servidor do AFS não conseguiu excluir o volume %3 (partição %2 do servidor %1)." - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "O Gerenciador de Servidor do AFS não conseguiu criar uma entrada no VLDB para o volume %3 na partição %2 do servidor %1." - IDS_ERROR_CANT_SET_FILESET_QUOTA - "O Gerenciador de Servidor do AFS não conseguiu alterar a quota para o volume %3 na partição %2 do servidor %1." - IDS_ERROR_CANT_CREATE_SERVER - "O Gerenciador de Servidor do AFS não conseguiu criar a entrada pedida de servidor na célula %1." - IDS_ERROR_CANT_PING_SERVER - "O Gerenciador de Servidor do AFS não conseguiu determinar o endereço IP do servidor %1." - IDS_ERROR_CANT_DELETE_SERVER - "O Gerenciador de Servidor do AFS não conseguiu excluir o servidor %1." - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "O servidor %1 não pode ser excluído porque ainda abriga um ou mais volumes. Um servidor não pode ser excluído a menos que não contenha volumes." - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "O Gerenciador de Servidor do AFS não conseguiu alterar as propriedades para a partição %2 no servidor %1." - IDS_ERROR_CHANGE_SERVICE_STATUS - "O Gerenciador de Servidor do AFS não conseguiu alterar as propriedades para o serviço %2 no servidor %1." - IDS_ERROR_CANT_START_SERVICE - "O Gerenciador de Servidor do AFS não conseguiu iniciar o serviço %2 no servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "O Gerenciador de Servidor do AFS não conseguiu parar o serviço %2 no servidor %1." - IDS_ERROR_CANT_RESTART_SERVICE - "O Gerenciador de Servidor do AFS não conseguiu parar e reiniciar o serviço %2 no servidor %1." - IDS_ERROR_CHANGE_REPLICA_STATUS - "O Gerenciador de Servidor do AFS não conseguiu alterar as propriedades de replicação para o volume %3 na partição %2 do servidor %1." - IDS_ERROR_CANT_SYNCVLDB "O Gerenciador de Servidor do AFS não conseguiu atualizar o VLDB." - IDS_ERROR_CANT_CREATE_REPLICA - "O Gerenciador de Servidor do AFS não conseguiu criar uma réplica do volume %3 na partição %2 do servidor %1." - IDS_ERROR_CANT_INSTALL_FILE - "O Gerenciador de Servidor do AFS não conseguiu instalar o arquivo %2 no servidor %1." - IDS_ERROR_CANT_UNINSTALL_FILE - "O Gerenciador de Servidor do AFS não conseguiu remover a instalação do arquivo %2 no servidor %1." - IDS_ERROR_CANT_PRUNE_FILES - "O Gerenciador de Servidor do AFS não conseguiu remover os arquivos pedidos do servidor %1." - IDS_ERROR_CANT_RENAME_FILESET - "O Gerenciador de Servidor do AFS não conseguiu renomear o volume %1 para ""%2""." - IDS_ERROR_CANT_CREATE_SERVICE - "O Gerenciador de Servidor do AFS não conseguiu criar o serviço %2 no servidor %1." - IDS_ERROR_CANT_DELETE_SERVICE - "O Gerenciador de Servidor do AFS não conseguiu excluir o serviço %2 do servidor %1." - IDS_ERROR_CANT_RELEASE_FILESET - "O Gerenciador de Servidor do AFS não conseguiu liberar o volume replicado %3." - IDS_ERROR_CANT_UPDATE_FILESET - "O Gerenciador de Servidor do AFS não conseguiu atualizar a réplica do volume %3 na partição %1 do servidor %2." - IDS_ERROR_CANT_UPDATE_ALL - "O Gerenciador de Servidor do AFS não conseguiu atualizar nenhuma réplica do volume %3." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "O Gerenciador de Servidor do AFS não conseguiu ler a lista de administradores para o servidor %1." - IDS_ERROR_CANT_LOAD_KEYLIST - "O Gerenciador de Servidor do AFS não conseguiu ler a lista de chaves de servidor para o servidor %1." - IDS_ERROR_CANT_CREATE_KEY - "O Gerenciador de Servidor do AFS não conseguiu criar uma nova chave de servidor para o servidor %1." - IDS_ERROR_CANT_SAVE_ADMLIST - "O Gerenciador de Servidor do AFS não conseguiu alterar a lista de administradores para o servidor %1." - IDS_ERROR_CANT_CLONE "O Gerenciador de Servidor do AFS não conseguiu criar uma versão de backup do volume %3 na partição %2 do servidor %1." - IDS_ERROR_CANT_CLONESYS "O Gerenciador de Servidor do AFS não conseguiu criar nenhum dos volumes de backup pedidos." - IDS_ERROR_CANT_DUMP_FILESET - "O Gerenciador de Servidor do AFS não conseguiu descarregar o conteúdo do volume %3 (servidor %1, partição %2) no arquivo %4." - IDS_ERROR_CANT_RESTORE_FILESET - "O Gerenciador de Servidor do AFS não conseguiu o arquivo %4 para o volume %3 (servidor %1, partição %2)." - IDS_ERROR_CANT_SET_RESTART_TIMES - "O Gerenciador de Servidor do AFS não conseguiu alterar os horários de reinício para os serviços no servidor %1." - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "O Gerenciador de Servidor do AFS não consegue excluir o volume %3 da partição %2 do servidor %1.\n\nO volume %3 não pode ser excluído sem antes excluir todas as suas réplicas." - IDS_CMDLINE_TITLE "Erro - Gerenciador de Servidor do AFS" - IDS_CMDLINE_SYNTAX "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida." - IDS_CMDLINE_UNRECOGNIZED - "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nO parâmetro ""%1"" não é reconhecido." - IDS_CMDLINE_DUPLICATE "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nO parâmetro ""%1"" está especificado mais de uma vez." - IDS_CMDLINE_UNEXPECTVALUE - "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nO parâmetro ""%1"" não deveria ter um valor." - IDS_CMDLINE_MISSINGVAL "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nO parâmetro ""%1"" deve ser seguido por um valor." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nO parâmetro ""/SUBSET"" pode ser especificado somente se o parâmetro ""/CELL"" também for especificado." - IDS_CMDLINE_INVALIDSUBSET - "O subconjunto de servidores especificado, ""%2"", não foi definido para a célula %1." - IDS_CMDLINE_SERVERNOTCELL - "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nO parâmetro ""/SERVER"" pode ser especificado somente se o parâmetro ""/CELL"" também for especificado." - IDS_CMDLINE_RESET_TITLE "Gerenciador de Servidor do AFS" - IDS_CMDLINE_RESET_DESC "O Gerenciador de Servidor do AFS limpou as definições especificadas." - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "O Gerenciador de Servidor do AFS não consegue sincronizar o VLDB com a partição %2 do servidor %1 porque a partição não existe ou não está exportada.\n\nPara remover esta partição do servidor %1, é preciso excluir as entradas de volume no VLDB que se referem a ela." - IDS_CMDLINE_USERPASSWORD - "A linha de comando especificada para o Gerenciador de Servidor do AFS é inválida.\n\nPara obter novos tokens do AFS, os parâmetros ""USER"" e ""PASSWORD"" devem ser especificados." - IDS_ERROR_CANT_DELETE_KEY - "O Gerenciador de Servidor do AFS não conseguiu excluir a chave de servidor %2 do servidor %1." - IDS_ERROR_CANT_GETRANDOMKEY - "O Gerenciador de Servidor do AFS não conseguiu gerar uma chave aleatória para o servidor %1." - IDS_ERROR_CANT_EXECUTE_COMMAND - "O Gerenciador de Servidor do AFS não conseguiu executar o seguinte comando no servidor %1:\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "O Gerenciador de Servidor do AFS concluiu a operação de recuperação com êxito, mas não foi capaz de recuperar o arquivo de log descrevendo os resultados específicos da operação de recuperação." - IDS_ERROR_CANT_SALVAGE "O Gerenciador de Servidor do AFS não foi capaz de realizar a operação de recuperação pedida." - IDS_ERROR_CANT_AUTH_ON "O Gerenciador de Servidor do AFS não conseguiu ativar a verificação de autenticação para o servidor %1." - IDS_ERROR_CANT_AUTH_OFF "O Gerenciador de Servidor do AFS não conseguiu desativar a verificação de autenticação para o servidor %1." - IDS_ERROR_CANT_LOAD_HOSTLIST - "O Gerenciador de Servidor do AFS não conseguiu ler a lista de servidores host de banco de dados do servidor %1." - IDS_ERROR_CANT_SAVE_HOSTLIST - "O Gerenciador de Servidor do AFS não conseguiu alterar a lista de servidores host de banco de dados no servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "O Gerenciador de Servidor do AFS não conseguiu iniciar porque o Centro de Controle do AFS não estava instalado corretamente.\n\nPode ser necessário reinstalar o Centro de Controle do AFS." - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "O Gerenciador de Servidor do AFS não conseguiu iniciar devido a um problema desconhecido.\n\nPode ser necessário reinstalar o Centro de Controle do AFS." - IDS_ERROR_CANT_CHANGEADDR - "O Gerenciador de Servidor do AFS não conseguiu alterar o endereço IP no VLDB para o servidor %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "Simples" - IDS_SERVICETYPE_CRON "Cronometrado" - IDS_SERVICESTATE_STOPPED "Parado" - IDS_SERVICESTATE_STOPPING "Parando" - IDS_SERVICESTATE_STARTING "Iniciando" - IDS_SERVICESTATE_RUNNING "Executando" - IDS_SERVICETYPE_FS_LONG "FS (sistema de arquivos)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "Todos os serviços na célula %1:" - IDS_SERVICE_STARTDATE "Iniciado %1" - IDS_SERVICE_STOPDATE "Parado %1" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/zh_CN/svrmgr.rc b/src/WINNT/afssvrmgr/lang/zh_CN/svrmgr.rc deleted file mode 100644 index 3f195e3e8..000000000 --- a/src/WINNT/afssvrmgr/lang/zh_CN/svrmgr.rc +++ /dev/null @@ -1,2932 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ·þÎñÆ÷¹ÜÀíÆ÷" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - RIGHTMARGIN, 165 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 118 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 180 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 253 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 303 - TOPMARGIN, 7 - BOTTOMMARGIN, 99 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 152 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 196 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 291 - TOPMARGIN, 7 - BOTTOMMARGIN, 140 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 276 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 131 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 250 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 221 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ·þÎñÆ÷¹ÜÀíÆ÷""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "µ¥Ôª(&C)" - BEGIN - MENUITEM "Ñ¡Ôñ(&S)...", M_CELL_OPEN - MENUITEM "ÈÏÖ¤(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "Í˳ö(&X)", M_EXIT - END - POPUP "ÊÓͼ(&V)" - BEGIN - POPUP "·þÎñÆ÷(&S)" - BEGIN - MENUITEM "´óͼ±ê(&G)", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "Сͼ±ê(&M)", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "Ïêϸ×ÊÁÏ(&D)", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "¿ìËÙä¯ÀÀÏÔʾ´°¿Ú(&Q)" - BEGIN - MENUITEM "ÎÞ(&N)", M_DIVIDE_NONE, CHECKED - MENUITEM "´¹Ö±·Ö¸î(&V)", M_DIVIDE_H, CHECKED - MENUITEM "ˮƽ·Ö¸î(&H)", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ÕýÔÚ½øÐеIJÙ×÷(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "±»¼àÊӵķþÎñÆ÷(&M)...", M_SUBSET - MENUITEM "ÁÐ(&C)...", M_COLUMNS - MENUITEM "Ñ¡Ïî(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL - END - POPUP "°ïÖú(&H)" - BEGIN - MENUITEM "Ŀ¼(&C)", M_HELP - MENUITEM "²éÕÒÃüÁî(&F)...", M_HELP_FIND - MENUITEM "²éÕÒ´íÎó´úÂë(&L)...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "¹ØÓÚ AFS ·þÎñÆ÷¹ÜÀíÆ÷(&A)...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "´´½¨¾í(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "±¸·Ý¾í(&B)...", M_SET_CLONE - MENUITEM "½âËøËùÓоí(&U)", M_SET_UNLOCK - MENUITEM "ͬ²½ VLDB(&Y)...", M_SYNCVLDB - MENUITEM "Íì¾È¾í(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM "ÌØÐÔ(&R)", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "Æô¶¯(&S)", M_SVC_START - MENUITEM "Í£Ö¹(&S)", M_SVC_STOP - MENUITEM "ÖØÐÂÆô¶¯(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "²é¿´ÈÕÖ¾Îļþ(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "ɾ³ý(&L)", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM "ÌØÐÔ(&R)", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "Õý³£(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "´´½¨¾í(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "Õý³£(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "´´½¨·þÎñ(&C)...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "¸´ÖÆ(&P)...", M_SET_REPLICATION - MENUITEM "ÏÖÔÚÊÍ·Å(&S)", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "±¸·Ý(&B)...", M_SET_CLONE - MENUITEM "ת´¢µ½Îļþ(&D)...", M_SET_DUMP - MENUITEM "´ÓÎļþ»Ö¸´(&R)...", M_SET_RESTORE - MENUITEM "ÉèÖÃÏÞ¶î(&Q)...", M_SET_SETQUOTA - MENUITEM "Íì¾È(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "ÒÆ¶¯µ½(&M)...", M_SET_MOVETO - MENUITEM "ÖØÃüÃû(&N)...", M_SET_RENAME - MENUITEM "ɾ³ý(&L)", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Ëø¶¨(&K)", M_SET_LOCK - MENUITEM "½âËø(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM "ÌØÐÔ(&R)", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "´ò¿ª·þÎñÆ÷´°¿Ú(&O)", M_SVR_OPEN - MENUITEM "¹Ø±Õ·þÎñÆ÷´°¿Ú(&C)", M_SVR_CLOSE - MENUITEM "¼àÊÓ´Ë·þÎñÆ÷(&M)", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "±à¼­·þÎñÆ÷°²È«ÐÔ(&S)...", M_SVR_SECURITY - MENUITEM "¹ÜÀíÊý¾Ý¿âÖ÷»ú(&H)...", M_SVR_HOSTS - MENUITEM "±¸·Ý¾í(&B)...", M_SET_CLONE - MENUITEM "½âËøËùÓоí(&U)", M_SET_UNLOCK - MENUITEM "ͬ²½ VLDB(&Y)...", M_SYNCVLDB - MENUITEM "Íì¾È¾í(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "°²×°Îļþ(&I)...", M_SVR_INSTALL - MENUITEM "жװÎļþ(&U)...", M_SVR_UNINSTALL - MENUITEM "ɾ³ý¾ÉÎļþ(&P)...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "»ñµÃÎļþÈÕÆÚ(&T)...", M_SVR_GETDATES - MENUITEM "²é¿´ÈÕÖ¾Îļþ(&V)...", M_VIEWLOG - MENUITEM "Ö´ÐÐÃüÁî(&X)...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM "ÌØÐÔ(&R)", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "´óͼ±ê(&G)", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "Сͼ±ê(&M)", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "Ïêϸ×ÊÁÏ(&D)", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "±»¼àÊӵķþÎñÆ÷(&M)...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "½âËøËùÓоí(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "¹Ø±ÕËùÓÐ(&C)", M_SVR_CLOSEALL - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "°´¾í(&V)", M_SET_VIEW_REPORT, CHECKED - MENUITEM "°´·ÖÇø(&P)", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "ÎÞÏêϸÐÅÏ¢(&D)", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "´´½¨¾í(&C)...", M_SET_CREATE - MENUITEM "´ÓÎļþ»Ö¸´(&R)...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "±¸·Ý¾í(&B)...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "½âËøËùÓÐ(&U)", M_SET_UNLOCK - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "ÁÐ(&C)...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "ÖØÐÂÆô¶¯(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "²é¿´ÈÕÖ¾Îļþ(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM "ÌØÐÔ(&R)", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "ÒÆ¶¯ÕâÀï(&M)...", M_SET_MOVEHERE - MENUITEM "¸´ÖÆÕâÀï(&R)...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "È¡Ïû(&C)", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 179, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "·þÎñ£º",IDC_SVC_DESC,0,5,179,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,0,17,179, - 61,WS_EX_STATICEDGE - PUSHBUTTON "´´½¨(&C)...",IDC_SVC_CREATE,37,80,46,12 - PUSHBUTTON "ɾ³ý(&L)",IDC_SVC_DELETE,86,80,39,12 - PUSHBUTTON "ÖØÐÂÆô¶¯(&R)",IDC_SVC_RESTART,128,80,48,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 165, 84 -STYLE DS_CENTER | WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "·ÖÇø£º",IDC_AGG_DESC,0,5,165,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,0,17,165, - 53,WS_EX_STATICEDGE - PUSHBUTTON "´´½¨¾í(&C)...",IDC_AGG_CREATESET,102,72,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 194, 92 -STYLE DS_CENTER | WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "¾í£º",IDC_SET_DESC,0,5,194,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,0,17,194, - 61,WS_EX_STATICEDGE - PUSHBUTTON "´´½¨(&C)...",IDC_SET_CREATE,1,80,42,12 - PUSHBUTTON "ɾ³ý(&L)",IDC_SET_DELETE,45,80,36,12 - PUSHBUTTON "¸´ÖÆ(&R)...",IDC_SET_REP,84,80,48,12 - PUSHBUTTON "ÉèÖÃÏÞ¶î(&Q)...",IDC_SET_SETQUOTA,134,80,59,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "Ìí¼Ó¹ÜÀíÔ±(&A)",IDC_LIST_ADD,72,160,65,14 - PUSHBUTTON "³ýÈ¥¹ÜÀíÔ±(&R)",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "·þÎñÆ÷ %1 µÄ¹ÜÀíÔ±£º",IDC_LIST_NAME,5,7,216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "±êʶ·û£º",IDC_STATIC,5,30,36,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_AGG_ID,40,30,214,8 - LTEXT "É豸£º",IDC_STATIC,5,46,31,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_AGG_DEVICE,40,46,214,8 - LTEXT "¾í£º",IDC_STATIC,5,62,31,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_AGG_FILESETS,40,62,214,8 - CONTROL "Èç¹û×éºÏµÄ¾íÏ޶¹ýÈÝÁ¿£¬ÏÔʾ¾¯¸æ(&W)", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 38,76,224,10 - LTEXT "Ó÷¨£º",IDC_STATIC,5,90,31,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_AGG_USAGE,38,90,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,103,224,8, - WS_EX_STATICEDGE - CONTROL "Èç¹û·ÖÇøÊ¹Óó¬³öÏ޶ÏÔʾ¾¯¸æ(&W)",IDC_AGG_WARN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,38,116,214,10 - CONTROL "¸Ã·þÎñÆ÷µÄȱʡãÐÖµ(&D)",IDC_AGG_WARN_AGGFULL_DEF,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,131,203,9 - CONTROL "Æä´óСµÄ",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,62,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,112,143,29,12, - ES_AUTOHSCROLL - LTEXT "% ãÐÖµ(&T)",IDC_AGG_WARN_AGGFULL_DESC,152,145,100,8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,20,20 - LTEXT "·ÖÇø %2 (·þÎñÆ÷ %1)",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "IP µØÖ·£º",IDC_STATIC,5,29,43,8 - LISTBOX IDC_SVR_ADDRESSES,53,29,70,12,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "¸ü¸ÄµØÖ·(&A)...",IDC_SVR_CHANGEADDR,144,27,77,12 - PUSHBUTTON "ÐèÒªÈÏÖ¤(&R)",IDC_SVR_AUTH_YES,41,81,84,12 - PUSHBUTTON "ÔÊÐíδÑéÖ¤µÄ(&U)",IDC_SVR_AUTH_NO,129,81,80,12 - LTEXT "·ÖÇøÊý£º",IDC_STATIC,11,131,90,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVR_NUMAGGREGATES,108,131,99,8 - LTEXT "×ÜÈÝÁ¿£º",IDC_STATIC,11,148,48,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVR_CAPACITY,108,148,99,8 - LTEXT "×éºÏµÄ¾íÏ޶",IDC_STATIC,11,165,79,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVR_ALLOCATION,108,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "(·þÎñÆ÷Ãû)",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "°²È«ÐÔ",IDC_STATIC,5,52,216,52 - GROUPBOX "´æ´¢",IDC_STATIC,5,115,216,68 - LTEXT "Äú¿ÉÒÔÒªÇó¶Ô´Ë·þÎñÆ÷µÄ´æÈ¡¶¼±ØÐë¾­¹ýÈÏÖ¤¡£",IDC_STATIC, - 11,67,198,8 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 221, 158 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - CONTROL "¸Ã·þÎñÆ÷µÄÈκηÖÇø±ä³É",IDC_SVR_WARN_AGGFULL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,12,18,127,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,144,16,24,12,ES_AUTOHSCROLL - LTEXT "% Âú",IDC_STATIC,184,18,28,8 - CONTROL "¸Ã·þÎñÆ÷µÄÈκξí±ä³É",IDC_SVR_WARN_SETFULL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,12,32,125,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,144,30,24,12,ES_AUTOHSCROLL - LTEXT "% Âú",IDC_STATIC,184,32,24,8 - CONTROL "ÈκηÖÇøµÄ×éºÏµÄÏ޶¹ýÆäÈÝÁ¿",IDC_SVR_WARN_AGGALLOC, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,46,200,9 - CONTROL "¸Ã·þÎñÆ÷ÉϵÄÈκηþÎñÍ£Ö¹ÔËÐÐ",IDC_SVR_WARN_SVCSTOP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,60,195,9 - CONTROL "¸Ã·þÎñÆ÷µÄÈκξíûÓÐ VLDB ÌõÄ¿",IDC_SVR_WARN_SETNOVLDB, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,74,195,9 - CONTROL "VLDB ÒýÓø÷þÎñÆ÷ÉϵÄÈκÎÍÑ»ú·ÖÇø", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,88,195,9 - CONTROL "VLDB ÒýÓø÷þÎñÆ÷ÉϵÄÈκÎÍÑ»ú¾í",IDC_SVR_WARN_SETNOSERV, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,103,195,9 - CONTROL "ˢзþÎñÆ÷ÐÅÏ¢£¬Ã¿¸ô",IDC_SVR_AUTOREFRESH,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,142,116,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,123,140,27,13,ES_AUTOHSCROLL - LTEXT "·ÖÖÓ",IDC_STATIC,164,142,25,8 - LTEXT "ÏÔʾ¾¯¸æ£¬Èç¹û",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - PUSHBUTTON "²é¿´·þÎñÈÕÖ¾(&V)",IDC_SVC_VIEWLOG,47,182,66,14 - PUSHBUTTON "ÏÖÔÚÆô¶¯(&S)",IDC_SVC_START,118,182,49,14 - PUSHBUTTON "ÏÖÔÚÍ£Ö¹(&P)",IDC_SVC_STOP,169,182,49,14 - CONTROL "Èç¹û¸Ã·þÎñÔøÍ£Ö¹¹ý£¬ÏÔʾ¾¯¸æ(&W)",IDC_SVC_WARNSTOP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "·þÎñ %2 (·þÎñÆ÷ %1)",IDC_SVC_NAME,52,13,168,8 - LTEXT "ÀàÐÍ£º",IDC_STATIC,5,29,44,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVC_TYPE,64,29,155,8 - LTEXT "²ÎÊý£º",IDC_STATIC,5,45,44,8 - EDITTEXT IDC_SVC_PARAMS,64,45,155,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "֪ͨÆ÷£º",IDC_STATIC,5,61,44,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVC_NOTIFIER,64,61,155,8 - LTEXT "×î½üÒ»´ÎÆô¶¯£º",IDC_STATIC,5,77,57,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVC_STARTDATE,64,77,155,8 - LTEXT "×î½üÒ»´ÎÍ£Ö¹£º",IDC_STATIC,5,93,57,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SVC_STOPDATE,64,93,155,8 - LTEXT "×î½üÒ»´Îʧ°Ü£º",IDC_STATIC,5,109,57,8 - EDITTEXT IDC_SVC_LASTERROR,64,109,155,13,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "·þÎñ״̬",IDC_STATIC,5,127,215,75 - LTEXT "ÕýÔÚÈ·¶¨¸Ã·þÎñµÄµ±Ç°×´Ì¬...",IDC_SVC_STATUS,11,142,200, - 8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "¾í±êʶ·û£º",IDC_STATIC,5,30,45,8 - LTEXT "(δ֪)",IDC_SET_ID,59,30,208,8 - LTEXT "ÒÑ´´½¨µÄ£º",IDC_STATIC,5,46,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_CREATEDATE,59,46,208,8 - LTEXT "ÒѸüеģº",IDC_STATIC,5,62,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_UPDATEDATE,59,62,112,8 - LTEXT "ÒÑ´æÈ¡µÄ£º",IDC_STATIC,5,78,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_ACCESSDATE,59,78,208,8 - LTEXT "Òѱ¸·ÝµÄ£º",IDC_STATIC,5,94,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_BACKUPDATE,59,94,208,8 - LTEXT "Îļþ¼ÆÊý£º",IDC_STATIC,5,110,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_FILES,59,110,208,8 - LTEXT "״̬£º",IDC_STATIC,5,126,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_STATUS,59,126,75,8 - PUSHBUTTON "Ëø¶¨(&L)",IDC_SET_LOCK,142,124,61,12 - PUSHBUTTON "½âËø(&U)",IDC_SET_UNLOCK,207,124,61,12 - LTEXT "Ó÷¨£º",IDC_STATIC,5,142,45,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_SET_USAGE,59,142,136,8 - PUSHBUTTON "ÉèÖÃÏÞ¶î(&Q)...",IDC_SET_QUOTA,207,140,61,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,219,8, - WS_EX_STATICEDGE - CONTROL "Èç¹û¸Ã¾íʹÓó¬³öÏ޶ÏÔʾ¾¯¸æ(&W)",IDC_SET_WARN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,49,170,219,10 - CONTROL "¸Ã·þÎñÆ÷µÄȱʡãÐÖµ(&D) (Æä´óСµÄ %1%%)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,61,185,207,9 - CONTROL "Æä´óСµÄ",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,61,199,62,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,123,197,29,12, - ES_AUTOHSCROLL - LTEXT "% ãÐÖµ(&T)",IDC_SET_WARN_SETFULL_DESC,163,199,105,8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "¾í %3 (·þÎñÆ÷ %1£¬·ÖÇø %2)",IDC_SET_NAME,49,14,219,8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ·þÎñÆ÷¹ÜÀíÆ÷" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "ËùÑ¡µ¥Ôª£º",IDC_STATIC,2,8,55,8 - LTEXT "(µ¥ÔªÃû½«·ÅÓÚ´Ë)",IDC_CELL,62,8,222,9 - LTEXT "AFS ÁîÅÆ£º",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1(ÁîÅÆ½«ÔÚ %3 µ½ÆÚ)",IDC_AFS_ID,62,19,222,9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "·þÎñÆ÷" -CLASS "ServerWindowClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,57,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "·þÎñ(&V)£º",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,57,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÃüÁî(&C)£º",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,57,68,163,13,ES_AUTOHSCROLL - LTEXT "²ÎÊý(&P)£º",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,57,86,163,13,ES_AUTOHSCROLL - LTEXT "֪ͨÆ÷(&N)£º",IDC_STATIC,5,105,44,8 - EDITTEXT IDC_SVC_NOTIFIER,57,103,163,13,ES_AUTOHSCROLL - LTEXT "ÈÕÖ¾Îļþ(&L)£º",IDC_STATIC,5,122,52,8 - EDITTEXT IDC_SVC_LOGFILE,57,120,163,13,ES_AUTOHSCROLL - CONTROL "¼òµ¥(&I)(²»¼ä¶ÏÔËÐÐ)",IDC_SVC_TYPE_SIMPLE,"Button", - BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "ÏÖÔÚÆô¶¯¸Ã·þÎñ(&T)",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "&FS (Îļþϵͳ)",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "C&ron (ÔÚÖ¸¶¨¼ä¸ôÔËÐÐ)",IDC_SVC_TYPE_CRON,"Button", - BS_AUTORADIOBUTTON,11,195,201,10 - LTEXT "ºÎʱÔËÐÐ(&W)£º",IDC_STATIC,23,209,52,8 - COMBOBOX IDC_SVC_RUNDAY,75,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,148,207, - 68,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "н¨·þÎñ",IDC_SVC_DESC,52,13,168,8 - GROUPBOX "·þÎñÀàÐÍ",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "ÏÖÔÚÊÍ·Å(&R)",IDC_SET_RELEASE,11,143,52,14 - PUSHBUTTON "´´½¨(&C)...",IDC_SET_REPSITE_ADD,108,143,47,14 - PUSHBUTTON "ɾ³ý(&L)",IDC_SET_REPSITE_DELETE,162,143,47,14 - LTEXT "·þÎñÆ÷£º",-1,11,31,37,8 - LTEXT "(·þÎñÆ÷Ãû)",IDC_SET_SERVER,55,31,147,8 - LTEXT "·ÖÇø£º",-1,11,44,37,8 - LTEXT "(·ÖÇøÃû)",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "¾í£º",-1,11,18,37,8 - LTEXT "(¾íÃû)",IDC_SET_NAME,55,18,147,8 - GROUPBOX "¶Á£¯Ð´¾í",-1,5,5,211,56 - GROUPBOX "¾í¸±±¾",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 257 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ñ¡Ôñµ¥Ôª - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "µ¥Ôª(&C)£º",IDC_STATIC,4,24,38,8 - COMBOBOX IDC_OPENCELL_CELL,45,22,170,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "AFS ÈÏÖ¤",IDC_STATIC,4,44,211,92 - LTEXT "AFS Éí·Ý(&I)£º",IDC_STATIC,22,100,55,8 - EDITTEXT IDC_OPENCELL_ID,80,98,129,14,ES_AUTOHSCROLL - LTEXT "AFS ¿ÚÁî(&P)£º",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,80,114,129,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "¸ß¼¶(&V) >>",IDC_ADVANCED,4,146,53,14 - DEFPUSHBUTTON "È·¶¨",IDOK,86,146,41,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,130,146,41,14 - PUSHBUTTON "°ïÖú(&H)",9,174,146,41,14 - CONTROL "¼àÊӸõ¥ÔªµÄËùÓзþÎñÆ÷(&L)",IDC_MON_ALL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,204,185,9 - CONTROL "½ö¼àÊÓÒ»¸ö·þÎñÆ÷(&M)£º",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,219,110,10 - EDITTEXT IDC_MON_SERVER,125,218,83,13,ES_AUTOHSCROLL - CONTROL "½ö¼àÊÓ×Ó¼¯ÖеķþÎñÆ÷(&S)£º",IDC_MON_SOME,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,235,110,10 - COMBOBOX IDC_MON_SUBSET,125,233,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ñ¡ÔñÄúÏ£ÍûʹÓÃµÄ AFS µ¥Ôª¡£",IDC_STATIC,4,7,200,8 - GROUPBOX "¼àÊÓ·þÎñÆ÷",IDC_ADVANCED_GROUP,4,169,211,84 - LTEXT "ΪÁ˵õ½¸ü¿ìËÙµÄÐÔÄÜ£¬Äú¿ÉÒÔÑ¡Ôñ½ö¼àÊӸõ¥ÔªÖпÉÓõķþÎñÆ÷×Ó¼¯¡£", - IDC_STATIC,10,182,199,17 - LTEXT "(ÕýÔÚ²éѯ...)",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "Òª¹ÜÀíµ¥Ôª£¬±ØÐëÖØÐÂÊäÈëÄúµÄ AFS ¿ÚÁ",IDC_STATIC,10, - 85,196,8 - LTEXT "ÄúÔÚËùÑ¡µ¥ÔªÄڵĵ±Ç° AFS ÁîÅÆ£º",IDC_STATIC,10,57,196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¾¯¸æ - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "¼ÌÐøµÈ´ýÖ±ÖÁÈÎÎñÕý³£Íê³É(&C)",IDC_TIMEOUT_WAIT,"Button", - BS_AUTORADIOBUTTON,24,87,208,10 - CONTROL "ÖÕÖ¹ÈÎÎñ(&T)",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,24,101,208,10 - DEFPUSHBUTTON "È·¶¨",IDOK,93,139,50,14 - LTEXT "ÈÎÎñÒÑÔËÐеÄʱ¼ä£º",IDC_STATIC,4,119,142,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,151,119,32,8 - LTEXT "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÒѾ­µÈ´ýÁ˺ܳ¤Ò»¶Îʱ¼ä£¬ÍøÂçÈÎÎñ»¹Î´Íê³É¡£", - IDC_STATIC,4,7,228,18 - LTEXT "Äú¿ÉÒÔÈÃÈÎÎñ¼ÌÐøÔËÐÐ(½¨Òé)£¬»òÕßÈç¹ûÄúÈ·ÐÅÈÎÎñÎÞ·¨Íê³É£¬Äú¿ÉÒÔÔÊÐí AFS ·þÎñÆ÷¹ÜÀíÆ÷ÖÕÖ¹ÈÎÎñ¡£", - IDC_STATIC,4,30,228,26 - LTEXT "Çë×¢ÒâÏÔʾ¸Ã´°¿Úʱ£¬ÈÎÎñÈÔÔÚÔËÐУ»Èç¹ûÈÎÎñÍê³É£¬¸Ã´°¿Ú»á×Ô¶¯¹Ø±Õ¡£", - IDC_STATIC,4,63,228,17 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "ÁÐ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Ñ¡ÔñÁÐʾʱÏÔʾµÄÁÐ(&S)£º",IDC_STATIC,5,7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¿ÉÓõÄÁÐ(&C)£º",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÒªÏÔʾµÄÁÐ(&I)£º",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Ìí¼Ó(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< ³ýÈ¥(&R)",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "ÏòÉÏÒÆ¶¯(&U)",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "ÏòÏÂÒÆ¶¯(&D)",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "ÁгöÁÐ",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ˢР- AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "Íê³É 0%%",IDC_REFRESH_PERCENT,4,49,216,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,216,8 - LTEXT "ÇëµÈ´ý...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "Ìø¹ý(&S)",IDC_REFRESH_SKIP,222,58,38,12,NOT WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "´´½¨¾í" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "Ãû³Æ(&N)£º",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,50,28,116,14,ES_AUTOHSCROLL - LTEXT "ÏÞ¶î(&Q)£º",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,50,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,94,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±¸·Ý(&B)£º",IDC_STATIC,4,66,39,8 - CONTROL "ͬʱ´´½¨¸Ã¾íµÄÒ»¸ö±¸·Ý°æ±¾(&R)",IDC_SET_CLONE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,50,66,162,8 - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,4,84,46,8 - COMBOBOX IDC_SET_SERVER,50,82,116,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "·ÖÇø(&P)£º",IDC_STATIC,4,102,39,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,46,102,271, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È·¶¨",IDOK,156,191,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,211,191,50,14 - PUSHBUTTON "°ïÖú(&H)",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "н¨¾í",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 307, 103 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ɾ³ý¾í" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È¡Ïû",IDCANCEL,199,85,50,14 - PUSHBUTTON "È·¶¨",IDOK,144,85,50,14 - PUSHBUTTON "°ïÖú(&H)",9,253,85,50,14 - CONTROL "´Ó·þÎñÆ÷ %1£¬·ÖÇø %2 ÉÏɾ³ý¾í %3(&D)",IDC_DELSET_SERVER, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,61,45,242,10 - CONTROL "ɾ³ý¾í %3 µÄ VLDB ÌõÄ¿(&V)",IDC_DELSET_VLDB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,61,60,242,10 - ICON 32515,IDC_STATIC,4,7,21,21 - LTEXT "×¢Ò⣡\n\n¸Ã²Ù×÷½«µ¼ÖÂÓÀ¾Ãɾ³ý¾í %3",IDC_DELSET_DESC,61, - 7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "±¸·Ý¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,183,67,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,237,67,50,14 - PUSHBUTTON "°ïÖú(&H)",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,21,20 - LTEXT "¾í±¸·ÝÀàËÆÓڸþíµÄÖ»¶Á¸±±¾¡£¶Á£¯Ð´¾íÖ»ÄÜÓÐÒ»¸ö±¸·Ý°æ±¾¡£", - IDC_STATIC,34,9,307,17 - LTEXT "µ¥»÷È·¶¨À´Îª·þÎñÆ÷ %1£¬·ÖÇø %2 Éϵľí %3 ´´½¨Ò»¸ö±¸·Ý¡£ Èç¹û¸Ã¾íÒÑ´æÔÚ±¸·Ý£¬»á×Ô¶¯¸üС£", - IDC_CLONE_DESC,34,32,307,24 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ÒÑÖªÎÊÌâ",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "·þÎñ %2 (·þÎñÆ÷ %1)",IDC_PROBLEM_TITLE,52,13,168,8 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ÒÑÖªÎÊÌâ",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ÒÑÖªÎÊÌâ",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "·ÖÇø %2 (·þÎñÆ÷ %1)",IDC_PROBLEM_TITLE,38,14,214,8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ÒÑÖªÎÊÌâ",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "¾í %3 (·þÎñÆ÷ %1£¬·ÖÇø %2)",IDC_PROBLEM_TITLE,49,14,219, - 8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÒÆ¶¯¾í" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È·¶¨",IDOK,115,156,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,169,156,50,14 - PUSHBUTTON "°ïÖú(&H)",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "ÒÆ¶¯¾íµ½(&M)£º",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "ÒÆ¶¯¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "´Ó·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏÒÆ¶¯¾í %3 µ½·þÎñÆ÷ %4 µÄ·ÖÇø %5...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "²é¿´ÈÕÖ¾Îļþ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "²é¿´ÈÕÖ¾ÎļþµÄ·þÎñÆ÷(&S)£º",IDC_STATIC,4,45,109,8 - COMBOBOX IDC_VIEWLOG_SERVER,116,43,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "·þÎñÆ÷ÉÏÒª²é¿´µÄÎļþ(&F)£º",IDC_STATIC,4,64,109,8 - EDITTEXT IDC_VIEWLOG_FILENAME,116,62,157,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,169,88,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,223,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,20,20 - LTEXT "ÇëÊäÈëÄúÏ£Íû²é¿´µÄÈÕÖ¾ÎļþµÄ¾ø¶Ô·¾¶¡£", - IDC_VIEWLOG_DESC,31,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "²é¿´ÈÕÖ¾Îļþ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÎļþĿ¼£º",IDC_SVC_VIEWLOG_CONTENTS,4,41,277,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "Áí´æÎª(&A)...",IDC_VIEWLOG_SAVEAS,173,167,53,14 - DEFPUSHBUTTON "¹Ø±Õ(&C)",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "ÔÚ·þÎñÆ÷ %1 ÉϵÄ[·þÎñ %2 µÄ]ÈÕÖ¾Îļþ", - IDC_SVC_VIEWLOG_DESC,33,7,248,8 - LTEXT "·þÎñÆ÷ÉϵÄÎļþÃû£º%1",IDC_SVC_VIEWLOG_FILENAME,33,23, - 248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÉèÖþíÏÞ¶î" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "µ±Ç°Ï޶",IDC_STATIC,4,49,47,8 - LTEXT "(δ֪)",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "ÐÂÏÞ¶î(&Q)£º",IDC_STATIC,4,81,47,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "È·¶¨",IDOK,109,112,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,163,112,50,14 - PUSHBUTTON "°ïÖú(&H)",9,217,112,50,14 - PUSHBUTTON "ÌØÐÔ(&P)...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "·ÖÇø£º",IDC_STATIC,4,30,47,8 - LTEXT "·þÎñÆ÷ %1 µÄ·ÖÇø %2",IDC_SET_AGGREGATE,59,30,141,8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "¾í %1",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "ÕýÔÚ½øÐеIJÙ×÷ - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "ÏÂÁвÙ×÷ÕýÔÚ½øÐУº",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ͬ²½ VLDB" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,107,81,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,161,81,50,14 - PUSHBUTTON "°ïÖú(&H)",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "(ÔËÐÐʱÉèÖÃ)",IDC_SYNC_DESC,37,4,228,32 - LTEXT "(ÔËÐÐʱÉèÖÃ)",IDC_SYNC_DESC2,37,44,228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¸´Öƾí" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È·¶¨",IDOK,115,153,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,169,153,50,14 - PUSHBUTTON "°ïÖú(&H)",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "¾í %3 µÄи±±¾",IDC_SET_NAME,31,12,242,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "´´½¨¸Ã¾íµÄÒ»¸öи±±¾ÔÚ(&C)£º",IDC_STATIC,4,35,125,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 248, 156 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "°²×°Îļþ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Ô´Îļþ(&F)£º",IDC_STATIC,4,74,49,8 - EDITTEXT IDC_FILENAME,66,72,126,14,ES_AUTOHSCROLL - PUSHBUTTON "ä¯ÀÀ(&B)...",IDC_BROWSE,194,72,50,14 - LTEXT "Ä¿±ê·þÎñÆ÷(&S)£º",IDC_STATIC,4,93,60,8 - COMBOBOX IDC_SERVER,66,92,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ä¿±êÃû³Æ(&N)£º",IDC_STATIC,4,114,60,8 - EDITTEXT IDC_DIRECTORY,66,112,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,86,138,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,140,138,50,14 - PUSHBUTTON "°ïÖú(&H)",9,194,138,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,20,20 - LTEXT "ÔÚ·þÎñÆ÷Éϰ²×°Îļþ",IDC_STATIC,32,12,127,8 - LTEXT "(ÔËÐÐʱÉèÖõÄÎı¾)\n(ÔËÐÐʱÉèÖõÄÎı¾)\n(ÔËÐÐʱÉèÖõÄÎı¾)\n(ÔËÐÐʱÉèÖõÄÎı¾)", - IDC_INSTALL_DESC,4,29,240,33 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "жװÎļþ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,4,66,52,8 - COMBOBOX IDC_SERVER,58,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Ä¿±êÎļþ(&F)£º",IDC_STATIC,4,85,52,8 - EDITTEXT IDC_FILENAME,58,83,175,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,88,121,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,141,121,50,14 - PUSHBUTTON "°ïÖú(&H)",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "´Ó·þÎñÆ÷жװÎļþ",IDC_STATIC,32,12,127,8 - LTEXT "¸Ã²Ù×÷ÔÊÐíÄúÔÚÒ»¸öÌØÊâ·þÎñÆ÷Éϻָ´Ò»¸öÔ¤ÏȰ²×°µÄÎļþµÄ¸±±¾¡£Èç¹ûËùÑ¡ÎļþÎÞ´ËÀั±¾´æÔÚ£¬½«³ýÈ¥¸ÃÎļþ¡£", - IDC_STATIC,4,29,240,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 200, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ɾ³ý¾ÉÎļþ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "·þÎñÆ÷£º",-1,4,56,44,8 - COMBOBOX IDC_SERVER,53,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "ɾ³ýËùÓкËÐÄÎļþ(&C)",IDC_OP_DELETE_CORE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,53,73,143,10 - CONTROL "ɾ³ý.BAKÀ©Õ¹ÃûÎļþ(Îļþ±¸·Ý)(&B)",IDC_OP_DELETE_BAK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,84,143,10 - CONTROL "ɾ³ý.OLDÀ©Õ¹ÃûÎļþ(¾ÉÎļþ±¸·Ý)(&O)",IDC_OP_DELETE_OLD, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,95,143,10 - DEFPUSHBUTTON "È·¶¨",IDOK,39,123,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,93,123,50,14 - PUSHBUTTON "°ïÖú(&H)",9,146,123,50,14 - ICON IDI_PRUNE,-1,4,4,20,20 - LTEXT "´Ó·þÎñÆ÷ÉÏɾ³ý¾ÉÎļþ",-1,32,12,101,8 - LTEXT "¸Ã²Ù×÷ɾ³ýÔÚÌØ¶¨·þÎñÆ÷ÉϵÄÎļþ±¸·Ý¡£",-1,4,29,192,16 - LTEXT "ɾ³ýÎļþ£º",-1,4,73,45,8 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÖØÃüÃû¾í" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "¾ÉÃû³Æ(&O)£º",IDC_STATIC,31,67,46,8 - EDITTEXT IDC_RENSET_OLD,88,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "ÐÂÃû³Æ(&N)£º",IDC_STATIC,31,85,46,8 - EDITTEXT IDC_RENSET_NEW,88,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,115,115,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,169,115,50,14 - PUSHBUTTON "°ïÖú",9,223,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "ÒªÖØÃüÃû¾í %3£¬ÔÚÏÂÃæÊäÈëÒ»¸öÐÂÃû³Æ¡£ÖØÃüÃû»á×Ô¶¯¸ü¸Ä¾íµÄ±¸·ÝºÍËùÓи±±¾µÄÃû³Æ¡£\n\n×¢Ò⣺Èç¹ûÄúÖØÃüÃûÒ»¸ö°²×°µÄ¾í£¬Äú±ØÐëɾ³ý²¢ÖØÐ´´½¨Æä°²×°µã¡£", - IDC_RENSET_DESC,31,7,242,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 277, 68 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ɾ³ý·þÎñ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È¡Ïû",IDCANCEL,169,50,50,14 - PUSHBUTTON "È·¶¨",IDOK,115,50,50,14 - PUSHBUTTON "°ïÖú",9,223,50,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "×¢Ò⣡\n\n¸Ã²Ù×÷½«µ¼Ö·þÎñ %2 Í£Ö¹²¢´Ó·þÎñÆ÷ %1 ÉÏÓÀ¾Ãɾ³ý", - IDC_DELSVC_DESC,31,7,242,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "»ñµÃÎļþÈÕÆÚ" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "·þÎñÆ÷(&S)£º",-1,4,56,68,8 - COMBOBOX IDC_SERVER,74,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Òª²éѯµÄÎļþ(&F)£º",-1,4,75,68,8 - EDITTEXT IDC_FILENAME,74,73,135,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,86,107,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,140,107,50,14 - PUSHBUTTON "°ïÖú(&H)",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "»ñµÃ·þÎñÆ÷ÉϵÄÎļþÈÕÆÚ",-1,32,12,127,8 - LTEXT "¸Ã²Ù×÷»ñµÃÎļþ¼°Æä±¸·Ý(Èç¹û´æÔڵϰ)×î½üÒ»´ÎÐ޸ĵÄÈÕÆÚ¡£", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "»ñµÃÎļþÈÕÆÚ - ½á¹û" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "·þÎñÆ÷£º",IDC_STATIC,4,30,39,8 - LTEXT "(ÔËÐÐʱÉèÖÃ)",IDC_SERVER,56,30,137,8 - LTEXT "ÎļþÃû£º",IDC_STATIC,4,45,39,8 - LTEXT "(ÔËÐÐʱÉèÖÃ)",IDC_FILENAME,56,45,137,8 - LTEXT "ÎļþÈÕÆÚ£º",IDC_STATIC,4,60,45,8 - LTEXT "(δ֪£»ÎÞ·¨ÕÒµ½Îļþ)",IDC_DATE_FILE,56,60,188,8 - LTEXT ".BAK ÈÕÆÚ£º",IDC_STATIC,4,75,45,8 - LTEXT "(δ֪£»ÎÞ·¨ÕÒµ½Îļþ)",IDC_DATE_BAK,56,75,188,8 - LTEXT ".OLD ÈÕÆÚ£º",IDC_STATIC,4,90,45,8 - LTEXT "(δ֪£»ÎÞ·¨ÕÒµ½Îļþ)",IDC_DATE_OLD,56,90,188,8 - DEFPUSHBUTTON "¹Ø±Õ(&C)",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "»ñµÃ·þÎñÆ÷ÉϵÄÎļþÈÕÆÚ",IDC_STATIC,32,12,127,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 295, 144 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ת´¢¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "´´½¨×ª´¢Îļþ²¢ÃüÃûΪ(&N)£º",IDC_STATIC,4,42,100,8 - EDITTEXT IDC_DUMP_FILENAME,106,40,132,14,ES_AUTOHSCROLL - PUSHBUTTON "ä¯ÀÀ(&B)...",IDC_DUMP_BROWSE,241,40,50,14 - CONTROL "ת´¢¾í %3 ËùÓеÄÄÚÈÝ(·ÖÇø %1:%2)",IDC_DUMP_FULL,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,10,78,274,10 - CONTROL "½öת´¢×ÔÓÒÃæÊ±¼äÒÔÀ´¸ü¸ÄµÄÎļþ(&S)",IDC_DUMP_LIMIT_TIME, - "Button",BS_AUTORADIOBUTTON,10,93,153,10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,170,93,51, - 13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,228,93,56, - 13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È·¶¨",IDOK,131,126,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,185,126,50,14 - PUSHBUTTON "°ïÖú(&H)",9,241,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "¸Ã²Ù×÷¸´ÖÆÒ»¸ö¾íµÄÄÚÈݵ½Ò»¸öµ¥¶ÀÎļþ£¬ÒÔ±ã¸Ã¾í¿ÉÒÔ·½±ãµØ±¸·Ý¡£ÕâÑùת´¢µÄ¾íÄÚÈÝÒÔºó¿ÉÒÔ»Ö¸´¡£", - IDC_STATIC,30,7,261,24 - GROUPBOX "ת´¢²ÎÊý",IDC_STATIC,4,62,287,53 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "»Ö¸´¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "Òª»Ö¸´µÄÎļþ(&R)£º",IDC_STATIC,4,33,70,8 - EDITTEXT IDC_RESTORE_FILENAME,75,30,157,14,ES_AUTOHSCROLL - PUSHBUTTON "ä¯ÀÀ(&B)...",IDC_RESTORE_BROWSE,238,30,50,14 - CONTROL "ÕâÊÇÒ»¸öÔöÁ¿×ª´¢Îļþ(&I)",IDC_RESTORE_INCREMENTAL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,75,46,114,10 - LTEXT "¾í(&V)£º",IDC_STATIC,11,102,31,8 - EDITTEXT IDC_RESTORE_SETNAME,57,100,115,14,ES_AUTOHSCROLL - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,11,145,44,8 - COMBOBOX IDC_RESTORE_SERVER,57,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "·ÖÇø(&P)£º",IDC_STATIC,11,162,36,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,50,161,231, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "È·¶¨",IDOK,128,230,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,183,230,50,14 - PUSHBUTTON "°ïÖú(&H)",9,238,230,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "´Óת´¢Îļþ»Ö¸´¾í",IDC_STATIC,33,11,224,8 - GROUPBOX "Ä¿±ê¾í",IDC_STATIC,4,63,284,160 - LTEXT "µ±Äú´Óת´¢Îļþ»Ö¸´¾íʱ£¬¿ÉÒÔ´´½¨Ò»¸öоí»ò¸²¸ÇÒ»¸öÏÖÓеĶÁ/д¾í¡£", - IDC_STATIC,11,78,259,16 - LTEXT "(ÔËÐÐʱÉèÖÃ)\n(ÔËÐÐʱÉèÖÃ)",IDC_RESTORE_CREATE,57,119, - 229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - CONTROL "ÖÜÆÚÐÔÍ£Ö¹ºÍÖØÐÂÆô¶¯¸Ã·þÎñÆ÷ÉϵÄËùÓзþÎñ(&P)", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 71,193,10 - LTEXT "ÖØÐÂÆô¶¯(&R)",IDC_BOS_GENRES_DESC1,17,87,47,8 - COMBOBOX IDC_BOS_GENRES_DATE,68,84,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÔÚ(&A)",IDC_BOS_GENRES_DESC2,139,87,20,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,164, - 84,53,13,WS_EX_CLIENTEDGE - CONTROL "Ϊжþ½øÖÆÎļþÖÜÆÚÐÔ²âÊԸ÷þÎñÆ÷ÉϵÄËùÓзþÎñ(&B)", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 151,201,10 - LTEXT "²âÊÔ(&S)",IDC_BOS_BINRES_DESC1,17,167,33,8 - COMBOBOX IDC_BOS_BINRES_DATE,68,164,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÔÚ(&T)",IDC_BOS_BINRES_DESC2,139,167,20,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,164, - 164,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "·þÎñ %2 (·þÎñÆ÷ %1)",IDC_SVC_NAME,52,13,168,8 - GROUPBOX "BOS ·þÎñ",IDC_STATIC,5,27,215,175 - LTEXT "BOS ·þÎñÄÜÓÃÀ´ÖÜÆÚÐÔÍ£Ö¹ºÍÖØÐÂÆô¶¯¸Ã·þÎñÆ÷ÉϵÄËùÓзþÎñ(°üÀ¨ BOS ·þÎñ±¾Éí)¡£", - IDC_STATIC,11,45,200,18 - LTEXT "BOS ·þÎñÒ²ÄÜÓÃÀ´ÖÜÆÚÐÔ²âÊÔ·þÎñÆ÷ÉϵÄËùÓзþÎñ£¬½öÍ£Ö¹ºÍÖØÐÂÆô¶¯¶þ½øÖÆÎļþÒѸüеķþÎñ¡£", - IDC_STATIC,11,118,200,25 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "ת´¢¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "´Ó¾í %3 ´´½¨×ª´¢Îļþ %4...",IDC_DUMPSET_DESC,4,41,229, - 19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "»Ö¸´¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "´Óת´¢Îļþ %2 »Ö¸´¾í %1...",IDC_RESTORESET_DESC,4,41, - 229,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 258, 163 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "±¸·Ý¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "´´½¨¸Ãµ¥ÔªÖеÄËùÓоíµÄ±¸·Ý°æ±¾(&A)",IDC_CLONE_ALL, - "Button",BS_AUTORADIOBUTTON,30,53,214,10 - GROUPBOX " ",IDC_STATIC,23,68,231,67 - CONTROL "½öΪ·ûºÏÏÂÁбê×¼µÄ¾í´´½¨±¸·Ý(&O)£º",IDC_CLONE_SOME, - "Button",BS_AUTORADIOBUTTON,43,67,200,11 - CONTROL "½ö¶Ô·þÎñÆ÷Éϵľí(&S)£º",IDC_CLONE_SVR_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,83,92,10 - COMBOBOX IDC_CLONE_SVR,152,82,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "½ö·ÖÇøÉϵľí(&P)£º",IDC_CLONE_AGG_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,99,97,10 - COMBOBOX IDC_CLONE_AGG,152,98,85,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "½ö¶ÔÒÔÓÒÃæ¿ªÊ¼µÄ¾í£º",IDC_CLONE_PREFIX_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,41,116,106,10 - EDITTEXT IDC_CLONE_PREFIX,152,115,85,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,95,145,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,149,145,50,14 - PUSHBUTTON "°ïÖú(&H)",9,204,145,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "¾í±¸·ÝÀàËÆÓڸþíµÄÖ»¶Á¸±±¾¡£¶Á£¯Ð´¾íÖ»ÄÜÓÐÒ»¸ö±¸·Ý°æ±¾¡£\n\nÄú¿ÉÒÔͬʱΪ¶à¸ö¾í´´½¨±¸·Ý°æ±¾¡£", - IDC_STATIC,30,7,214,40 -END - -IDD_SUBSETS DIALOGEX 0, 0, 281, 182 -STYLE WS_POPUP | WS_CAPTION -CAPTION "±»¼àÊӵķþÎñÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "×Ó¼¯Ãû³Æ£º",IDC_STATIC,12,77,44,8 - EDITTEXT IDC_SUBSET_NAME,64,75,116,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "´ò¿ª(&O)...",IDC_SUBSET_LOAD,181,75,47,14 - PUSHBUTTON "±£´æ(&S)...",IDC_SUBSET_SAVE,231,75,43,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "¼àÊÓËùÓÐ(&A)",IDC_SUBSET_ALL,211,122,57,14 - PUSHBUTTON "²»¼àÊÓ(&N)",IDC_SUBSET_NONE,211,140,57,14 - LTEXT "µ±ÔÚÒ»½Ï´óµ¥ÔªÖй¤×÷£¬ÏëÒª¸Ä½øÐÔÄÜ£¬Äú¿ÉÒÔÑ¡Ôñ²»¼àÊÓijЩ·þÎñÆ÷ÊÇ·ñ³öÎÊÌâ¡£AFS ·þÎñÆ÷¹ÜÀíÆ÷²»»áÏÔʾδ±»¼àÊӵķþÎñÆ÷ÉÏµÄ¾í¡¢·ÖÇø»ò·þÎñ¡£", - IDC_STATIC,5,5,271,24 - LTEXT "Äú¿ÉÒÔÔÚÈκÎʱ¿ÌÑ¡Ôñ¼àÊÓ(»ò²»¼àÊÓ)·þÎñÆ÷¡£Äú¿ÉÒÔ´´½¨·þÎñÆ÷×Ó¼¯À´Ö¸¶¨Ó¦¼àÊӵķþÎñÆ÷ÁÐ±í¡£", - IDC_STATIC,5,37,271,18 - GROUPBOX "µ±Ç°×Ó¼¯",IDC_STATIC,5,63,271,114 - LTEXT "Òª¼àÊӵķþÎñÆ÷£º",IDC_STATIC,12,95,69,8 -END - -IDD_SUBSET_LOADSAVE DIALOGEX 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "(ÔËÐÐʱÉèÖõıêÌâ)" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "×Ó¼¯Ãû³Æ(&N)£º",1090,5,112,52,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,60,110,160,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "´ò¿ª(&O)",IDOK,226,110,50,14 - PUSHBUTTON "È¡Ïû(&L)",IDCANCEL,226,127,50,14 - CONTROL "Áбí1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "ÒÑΪ¸Ãµ¥Ôª¶¨ÒåµÄ×Ó¼¯£º",IDC_STATIC,4,6,114,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "²éÕÒÃüÁî" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "ÏÔʾ°ïÖú(&H)",IDOK,147,38,67,14 - PUSHBUTTON "È¡Ïû(&C)",IDCANCEL,147,55,67,14 - LTEXT "Òª²éÕÒÈçºÎʹÓà AFS ÕÊ»§¹ÜÀíÆ÷À´Ö´ÐÐÈÎÎñ£¬Ñ¡ÔñÏÂÃæµÄÒ»¸öÃüÁîÐв¢µ¥»÷¡°ÏÔʾ°ïÖú¡±°´Å¥¡£", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "²éÕÒ´íÎó´úÂë" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "´íÎóºÅ(&E)£º",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "ת»»(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "¹Ø±Õ(&C)",IDCANCEL,85,123,48,14 - LTEXT "(ÔËÐÐʱÉèÖõÄÎı¾)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "Òª²éÕÒ´íÎó´úÂëµÄº¬Ò壬ÔÚÏÂÃæÊäÈë´úÂëÈ»ºóµ¥»÷""ת»»""°´Å¥¡£", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¹ØÓÚ AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ·þÎñÆ÷¹ÜÀíÆ÷£¬°æ±¾ 3.5",IDC_STATIC,33,8,163,8 - LTEXT "°æÈ¨ËùÓÐ(C) IBM ¹«Ë¾ 1989£¬1999",IDC_STATIC,33,20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "¹Ø±Õ(&C)",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÕýÔÚµ¥Ôª %1 ÖÐËÑË÷·þÎñÆ÷...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 279, 136 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - CONTROL "Ϊ·þÎñÆ÷ÏÔʾȫÏÞ¶¨ÓòÃû(ÀýÈ磬""machine.company.com"")", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,5,269,10 - CONTROL "Èç¹û²»ÓùÜÀíÁîÅÆ¹¤×÷£¬ÏÔʾ¾¯¸æ(&W)", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,19,269,10 - CONTROL "...×ÜÊÇÏÔʾ·þÎñÆ÷µÄÌØÐÔ",IDC_OPT_SVR_DBL_PROP,"Button", - BS_AUTORADIOBUTTON,21,50,253,10 - CONTROL "...½öµ±¿ìËٲ鿴ÏÔʾ´°¿Ú´ò¿ªÊ±£¬ÏÔʾ·þÎñÆ÷ÌØÐÔ", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON,21, - 63,253,10 - CONTROL "...×ÜÊÇΪ·þÎñÆ÷´ò¿ªÒ»¸ö´°¿Ú",IDC_OPT_SVR_DBL_OPEN, - "Button",BS_AUTORADIOBUTTON,21,75,253,10 - CONTROL "...´ò¿ªÒ»¸ö·þÎñÆ÷´°¿Ú»áʹ¸Ã·þÎñÆ÷´¦ÓÚ±»¼àÊÓ״̬", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,107,253,10 - CONTROL "...¹Ø±ÕÒ»¸ö·þÎñÆ÷´°¿Ú»áʹ¸Ã·þÎñÆ÷½áÊø±»¼àÊÓ״̬", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,121,253,10 - LTEXT "Ë«»÷·þÎñÆ÷ͼ±ê...",IDC_STATIC,5,38,269,8 - LTEXT "Èç¹û·þÎñÆ÷×Ó¼¯ÕýÔÚʹÓÃÇÒ¿ìËٲ鿴ÏÔʾ´°¿ÚÊǹرյÄ...", - IDC_STATIC,5,95,269,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "Ìí¼Ó·þÎñÆ÷ÃÜÔ¿(&A)",IDC_KEY_ADD,58,160,80,14 - PUSHBUTTON "³ýÈ¥·þÎñÆ÷ÃÜÔ¿(&R)",IDC_KEY_REMOVE,141,160,80,14 - LTEXT "·þÎñÆ÷ÃÜÔ¿£º",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ìí¼Ó·þÎñÆ÷ÃÜÔ¿" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "°æ±¾£º",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "Öµ£º",IDC_STATIC,7,58,21,8 - CONTROL "¼ÓÃܸÃ×Ö·û´®£º",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,43,58,73,10 - CONTROL "ʹÓøÃÃÜÔ¿£º",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,43,76,57,10 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "Ëæ»ú(&R)",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "×¢Ò⣺ÔÚ¶Ô·þÎñÆ÷Ìí¼ÓÐÂÃÜÔ¿ºó£¬Äú±ØÐëÐÞ¸Ä AFS ÕÊ»§ÒÔʹÓÃÐÂÃÜÔ¿¡£¼¸Ììºó£¬Äú¿ÉÒÔ³ýÈ¥ÈκξɵķþÎñÆ÷ÃÜÔ¿¡£", - IDC_STATIC,7,99,267,18 - DEFPUSHBUTTON "È·¶¨",IDOK,116,129,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,170,129,50,14 - PUSHBUTTON "°ïÖú",9,224,129,50,14 - LTEXT "Ϊ·þÎñÆ÷ %1 н¨ÃÜÔ¿",IDC_KEY_TITLE,43,14,181,8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 277, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Æô¶¯£¯Í£Ö¹·þÎñ" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,115,114,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,169,114,50,14 - PUSHBUTTON "°ïÖú(&H)",9,223,114,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,21,20 - LTEXT "µ¥»÷È·¶¨Æô¶¯£¯Í£Ö¹·þÎñÆ÷ %1 µÄ·þÎñ %2¡£", - IDC_STARTSTOP_TEXT,31,12,242,9 - CONTROL "ÓÀ¾Ã(&P) (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,37, - 68,226,10 - CONTROL "ÁÙʱ(&T) (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,37, - 83,226,10 - GROUPBOX "·þÎñÆô¶¯",IDC_STATIC,31,31,242,70 - LTEXT "Äú¿ÉÒÔÓÀ¾Ã±£³Ö¸Ã¸ü¸Ä£¬ÒÔ±ã·þÎñÆ÷ %1 ÖØÐÂÆô¶¯Ê±£¬·þÎñ %2 »á(²»»á)×Ô¶¯Æô¶¯¡£", - IDC_STARTSTOP_STARTUP,38,45,223,16 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Ö´ÐÐÃüÁî" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,4,56,46,8 - COMBOBOX IDC_SERVER,56,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ÃüÁî(&C)£º",IDC_STATIC,4,75,46,8 - EDITTEXT IDC_COMMAND,56,73,188,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,86,107,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,140,107,50,14 - PUSHBUTTON "°ïÖú(&H)",9,194,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "ÔÚ·þÎñÆ÷ÉÏÖ´ÐÐÃüÁî",IDC_STATIC,32,12,185,8 - LTEXT "¸Ã²Ù×÷ÔÊÐíÄúÔÚÒ»¸öÔ¶³Ì·þÎñÆ÷ÉÏ·¢³öÃüÁî¡£\n Ëü±»µäÐ͵ØÓÃÓÚÖ´ÐÐ /etc/reboot ½Å±¾À´ÖØÐÂÆô¶¯·þÎñÆ÷¡£", - IDC_STATIC,4,29,240,16 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 248, 254 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Íì¾È¾í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,30,50,44,8 - COMBOBOX IDC_SERVER,78,48,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "·ÖÇø(&P)£º",IDC_STATIC,30,67,44,8 - COMBOBOX IDC_AGGREGATE,78,65,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Íì¾ÈËùÓзÖÇø(&A)",IDC_AGGREGATE_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,170,67,73,10 - LTEXT "¾í(&O)£º",IDC_STATIC,29,85,44,8 - COMBOBOX IDC_FILESET,78,83,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "Íì¾ÈËùÓоí(&L)",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,170,85,73,10 - DEFPUSHBUTTON "È·¶¨",IDOK,85,108,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,139,108,50,14 - PUSHBUTTON "°ïÖú(&H)",9,194,108,50,14 - PUSHBUTTON "¸ß¼¶(&V) >>",IDC_ADVANCED,4,108,53,14 - LTEXT "ÁÙʱÎļþµÄ·¾¶(&T)£º",IDC_STATIC,10,142,76,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,92,141,144,13,ES_AUTOHSCROLL - CONTROL "²¢ÐÐÍì¾È²Ù×÷£»½ø³ÌÊý(&R)£º",IDC_SALVAGE_SIMUL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,157,171,10 - EDITTEXT IDC_SALVAGE_NUM,202,156,25,13,ES_AUTOHSCROLL - CONTROL "²»ÒªÍì¾ÈÒÑË𻵵ľí(&N)",IDC_SALVAGE_READONLY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,167,123,10 - CONTROL "½«¶ÁÈ¡²Ù×÷·Ö³ÉС¿é",IDC_SALVAGE_BLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,177,139,10 - CONTROL "Ç¿ÖÆÍì¾ÈËùÓÐָʾµÄ¾í(&F)",IDC_SALVAGE_FORCE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,187,136,10 - CONTROL "Ç¿ÖÆÖØ½¨Ä¿Â¼½á¹¹(&E)",IDC_SALVAGE_FIXDIRS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,197,123,10 - LTEXT "½á¹ûÈÕÖ¾µÄÎļþÃû(&U)£º",IDC_STATIC,10,211,85,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,98,210,144,13,ES_AUTOHSCROLL - CONTROL "½á¹ûÈÕÖ¾ÖаüÀ¨Ë𻵵ÄÄÚ½áµãÁбí(&I)", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,224,203,10 - CONTROL "½á¹ûÈÕÖ¾ÖаüÀ¨ AFS ÓµÓеĸùÄÚ½áµãÁбí(&W)", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,235,203,10 - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "¸Ã²Ù×÷ÔÊÐíÄúÔÚÒ»¸ö»ò¶à¸ö¾íÉÏÐÞÕýÎÊÌâ¡£\n\n×¢Ò⣺Èç¹ûÄúÁ¢¼´Íì¾ÈÕû¸ö·ÖÇø»ò·þÎñÆ÷£¬·þÎñÆ÷»áÁÙʱÍÑ»ú¡£", - IDC_STATIC,30,7,214,32 - GROUPBOX "¸ß¼¶Íì¾ÈÑ¡Ïî",IDC_ADVANCED_GROUP,4,128,240,122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Íì¾È¾í - ½á¹û" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "¹Ø±Õ(&C)",IDOK,232,160,50,14 - LTEXT "Íì¾È²Ù×÷½á¹û£º",IDC_STATIC,4,33,277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "Íì¾È·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ¾í %3",IDC_SALVAGE_TITLE,33, - 15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Êͷží" -FONT 9, "ËÎÌå" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,115,84,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,169,84,50,14 - PUSHBUTTON "°ïÖú(&H)",9,223,84,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "¸Ã²Ù×÷ÔÊÐíÄú¸üоí %3 µÄ¸±±¾¡£Äú¿ÉÒÔÑ¡Ôñ½ö¸üйýʱµÄ¸±±¾£¬»ò¸üÐÂËùÓи±±¾¡£", - IDC_RELSET_DESC,31,7,242,26 - CONTROL "½ö¸üйýʱµÄ¸±±¾(&U)",IDC_RELSET_NORMAL,"Button", - BS_AUTORADIOBUTTON,46,41,173,10 - CONTROL "¼´Ê¹ÓÐδ¹ýʱ¸±±¾£¬Ò²¸üÐÂËùÓоí(&A)",IDC_RELSET_FORCE, - "Button",BS_AUTORADIOBUTTON,46,56,172,10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Ìí¼ÓÖ÷»ú·þÎñÆ÷(&A)",IDC_HOST_ADD,59,160,80,14 - PUSHBUTTON "³ýÈ¥Ö÷»ú·þÎñÆ÷(&R)",IDC_HOST_REMOVE,141,160,80,14 - LTEXT "·þÎñÆ÷ʶ±ðµÄÊý¾Ý¿âÖ÷»ú·þÎñÆ÷£º",IDC_HOST_TITLE,5,7,216, - 8 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 225, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Ìí¼ÓÖ÷»ú·þÎñÆ÷" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "Ö÷»ú(&H)£º",-1,31,55,38,8 - EDITTEXT IDC_ADDHOST_HOST,71,53,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,63,88,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,117,88,50,14 - ICON IDI_SERVER,-1,4,4,20,20 - LTEXT "ÄúÒÑÑ¡ÔñÌí¼ÓÒ»¸öÊý¾Ý¿âÖ÷»ú·þÎñÆ÷µ½´æ´¢ÔÚ·þÎñÆ÷ %1 ÉϵÄÁбíÖС£\n\nÔÚÏÂÃæÊäÈëÐÂÊý¾Ý¿âÖ÷»úÃû¡£", - IDC_ADDHOST_DESC,31,10,190,34 - PUSHBUTTON "°ïÖú",9,171,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "¸ü¸Ä·þÎñÆ÷µØÖ·" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "Ϊ·þÎñÆ÷ %1 ¼Ç¼ÔÚ VLDB ÖÐµÄ IP µØÖ·£º",IDC_TITLE,4,4, - 200,8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "È·¶¨",IDOK,46,97,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,100,97,50,14 - PUSHBUTTON "°ïÖú",9,154,97,50,14 - LTEXT "×¢£ºµ±Îļþ·þÎñÆ÷Æô¶¯Ê±£¬ËüÓà VLDB ×Ô¶¯×¢²áÆäµ±Ç°µÄ IP µØÖ·¡£", - IDC_STATIC,4,64,200,18 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "¸ü¸Ä IP µØÖ·" -CLASS "AFSManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,61,51,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,115,51,50,14 - PUSHBUTTON "°ïÖú",9,169,51,50,14 - LTEXT "ÊäÈëÐ嵀 IP µØÖ·ÒÔÌæ»» VLDB ÖÐµÄ %1£º",IDC_TITLE,4,4, - 215,8 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,42,23, - 90,14 - LTEXT "µØÖ·£º",IDC_STATIC,4,26,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "·þÎñÆ÷ %1 - ¹ÜÀíÔ±Áбí" - IDS_TAB_SERVICES "·þÎñ" - IDS_TAB_AGGREGATES "·ÖÇø" - IDS_TAB_FILESETS "¾í" - IDS_SERVICE_NONESELECTED "Ñ¡ÔñÒª²é¿´µÄ·þÎñÆ÷¡£" - IDS_SERVICE_GOTSELECTED "ÔÚ·þÎñÆ÷ %1 ÉϽøÐеķþÎñ£º" - IDS_AGGREGATE_ALL "ËùÓзþÎñÆ÷ÉϵķÖÇø£º" - IDS_AGGREGATE_ONE "·þÎñÆ÷ %1 ÉϵķÖÇø£º" - IDS_FILESET_ALL "µ¥Ôª %1 ÖеÄËùÓÐ¾í£º" - IDS_FILESET_ONE "·þÎñÆ÷ %1 ÉϵÄËùÓÐ¾í£º" - IDS_SVR_LISTS_TAB "¹ÜÀíÔ±Áбí" - IDS_SVR_PROP_TITLE "·þÎñÆ÷ %1 - ÌØÐÔ" - IDS_SVR_GENERAL_TAB "Ò»°ã" - IDS_SVR_SCOUT_TAB "ÉèÖÃ" - IDS_SERVER_TITLE "·þÎñÆ÷ %1 - AFS ·þÎñÆ÷¹ÜÀíÆ÷" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "µ¥Ôª %2 ÖеķþÎñÆ÷ %1£º" - IDS_SVC_PROP_TITLE "·þÎñÆ÷ %1 ÉϵķþÎñ %2 - ÌØÐÔ" - IDS_SVC_GENERAL_TAB "Ò»°ã" - IDS_SVC_ADD_TITLE "´´½¨·þÎñ" - IDS_SVC_ADD_TAB "´´½¨·þÎñ" - IDS_AGG_PROP_TITLE "·þÎñÆ÷ %1 ÉϵķÖÇø %2 - ÌØÐÔ" - IDS_AGG_GENERAL_TAB "Ò»°ã" - IDS_SET_REP_TITLE "¾í %1 - ¸´ÖÆ" - IDS_SET_REPSITES_TAB "¸´ÖÆÕ¾µã" - IDS_SET_PROP_TITLE "¾í %1 - ÌØÐÔ" - IDS_SET_GENERAL_TAB "Ò»°ã" - IDS_SET_UNLOCKBTN "ÏÖÔÚ½âËø(&L)" - IDS_SET_LOCKBTN "ÏÖÔÚËø¶¨(&L)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "ʹÓÃÁË %1£¬ÏÞ¶îΪ %2 (%3%%)" - IDS_USAGE_AGGREGATE "ʹÓÃÁË %1£¬ÈÝÁ¿Îª %2 (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "×éºÏµÄÏÞ¶î" - IDS_SVRCOL_NAME "·þÎñÆ÷" - IDS_SVRCOL_STATUS "״̬" - IDS_SETCOL_DATE_ACCESS "×î½üÒ»´Î´æÈ¡" - IDS_SETCOL_DATE_BACKUP "×î½üÒ»´Î±¸·Ý" - IDS_SVCCOL_NAME "·þÎñ" - IDS_SVCCOL_TYPE "ÀàÐÍ" - IDS_SVCCOL_PARAMS "²ÎÊý" - IDS_SVCCOL_STATUS "״̬" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "×î½üÒ»´ÎÆô¶¯" - IDS_SVCCOL_DATE_STOP "×î½üÒ»´ÎÍ£Ö¹" - IDS_SVCCOL_DATE_STARTSTOP "×î½üÒ»´ÎÆô¶¯£¯Í£Ö¹" - IDS_SVCCOL_DATE_FAILED "×î½üÒ»´Îʧ°Ü" - IDS_SVCCOL_LASTERROR "×î½üÒ»´ÎµÄÍ˳öÂë" - IDS_AGGCOL_NAME "·ÖÇø" - IDS_AGGCOL_ID "±êʶ·û" - IDS_AGGCOL_DEVICE "É豸" - IDS_AGGCOL_USED "ÒÑʹÓÃ" - IDS_AGGCOL_USED_PER "ÒÑʹÓà %" - IDS_AGGCOL_FREE "×ÔÓÉ" - IDS_AGGCOL_TOTAL "ÈÝÁ¿" - IDS_AGGCOL_STATUS "״̬" - IDS_SETCOL_NAME "¾í" - IDS_SETCOL_TYPE "ÀàÐÍ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "ÒÑ´´½¨" - IDS_SETCOL_DATE_UPDATE "×î½üÒ»´Î¸üÐÂ" - IDS_SETCOL_STATUS "״̬" - IDS_SETCOL_QUOTA_USED "ÒÑʹÓÃ" - IDS_SETCOL_QUOTA_USED_PER "ÒÑʹÓà %" - IDS_SETCOL_QUOTA_FREE "×ÔÓÉ" - IDS_SETCOL_QUOTA_TOTAL "ÏÞ¶î" - IDS_TRYAGAINBTN "ÔÙÊÔÒ»´Î(&A)" - IDS_NO_CELL_SELECTED "(δָ¶¨µ¥Ôª)" - IDS_NO_AFS_ID "(ÎÞÁîÅÆ¿ÉÓÃ)" - IDS_AFS_ID_WILLEXP "%1(ÁîÅÆ½«ÔÚ %2 µ½ÆÚ)" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS "ÇëµÈ´ý£»ÕýÔÚ»ñÈ¡¹ØÓÚµ¥Ôª %1 µÄÐÅÏ¢..." - IDS_STATUS_NOALERTS "Õý³£" - IDS_TITLE_BROWSE_USER "Ñ¡ÔñÓû§" - IDS_AGGTYPE_OTHER "δ֪ (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "ÔÚ·ÖÇø %1:%2 ÉÏ´´½¨¾í %3" - IDS_ACTION_DELETEFILESET "´Ó·ÖÇø %1:%2 ÉÏɾ³ý¾í %3" - IDS_ACTION_MOVEFILESET "ÒÆ¶¯¾í %3 µ½·ÖÇø %1:%2" - IDS_ACTION_SETFILESETQUOTA "Ϊ¾í %3 ¸ü¸ÄÏÞ¶î" - IDS_SVCSTOP_DESC2 "µ¥»÷È·¶¨Í£Ö¹¸Ã·þÎñ¡£" - IDS_SVCSTART_DESC2 "µ¥»÷È·¶¨Æô¶¯¸Ã·þÎñ¡£" - IDS_SYNCVLDB_SVR_DESC "×¢Ò⣡\n\nÈç¹ûÄú¼ÌÐø£¬AFS ·þÎñÆ÷¹ÜÀíÆ÷½«ÐÞ¸Ä VLDB ÒÔÆ¥Åä·þÎñÆ÷ %1 ÉÏËùÓзÖÇøµÄÄÚÈÝ¡£" - IDS_SYNCVLDB_SVR_DESC2 "Èç¹û VLDB Ìá¼°Ò»¸ö¾í£¬µ«¸Ã¾íÏÖÔÚÎÞ·¨ÔÚ·þÎñÆ÷ %1 µÄÈκηÖÇøÉÏÕÒµ½£¬½«É¾³ý¸Ã¾íµÄ VLDB ÌõÄ¿£¡" - IDS_SYNCVLDB_AGG_DESC "×¢Ò⣡\n\nÈç¹ûÄú¼ÌÐø£¬AFS ·þÎñÆ÷¹ÜÀíÆ÷½«ÐÞ¸Ä VLDB ÒÔÆ¥Åä·þÎñÆ÷ %1 ÉÏ·ÖÇø %2 µÄÄÚÈÝ¡£" - IDS_SYNCVLDB_AGG_DESC2 "Èç¹û VLDB Ìá¼°Ò»¸ö¾í£¬µ«¸Ã¾íÏÖÔÚÎÞ·¨Ôڸ÷ÖÇøÉÏÕÒµ½£¬½«É¾³ý¸Ã¾íµÄ VLDB ÌõÄ¿£¡" - IDS_PROMPT_BROWSE_USER "Óû§£º" - IDS_PREVIEWIN_BUTTON "<< Ô¤ÀÀ(&P)" - IDS_PREVIEWOUT_BUTTON "Ô¤ÀÀ(&P) >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "Óû§" - IDS_TITLE_BROWSE_PRINCIPAL "Ñ¡ÔñίÍÐÈË" - IDS_TITLE_BROWSE_OWNGROUP "Ñ¡ÔñÓµÓÐ×é" - IDS_PROMPT_BROWSE_PRINCIPAL "ίÍÐÈË£º" - IDS_PROMPT_BROWSE_OWNGROUP "ÓµÓÐ×飺" - IDS_ACTION_CLONE "´´½¨¾í %3 µÄ±¸·Ý°æ±¾" - IDS_ACTION_CLONESYS "´´½¨¶à¸ö¾í±¸·Ý" - IDS_CLONESYS_FAILED "¾í %1 µÄ±¸·ÝÎÞ·¨´´½¨£¬Ô­ÒòÊÇ´íÎó 0x%2 (%3)¡£" - IDS_SET_UNSPECIFIED "(δָ¶¨µÄ)" - IDS_SETCOL_ID "±êʶ·û" - IDS_SETCOL_FILES "Îļþ¼ÆÊý" - IDS_SET_DUMP_NAME "%1.DMP µÄת´¢" - IDS_ACTION_DUMP "ת´¢¾í %3(·ÖÇø %1:%2)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "·ÖÇø" - IDS_REFRESH_DESC_CELL "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÕýÔÚÈ·¶¨µ¥Ôª %1 ÖзþÎñÆ÷µÄ״̬¡£Õâ¿ÉÄÜÐèÒª¼¸·ÖÖÓ..." - IDS_REFRESH_DESC_SERVER "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÕýÔÚÈ·¶¨·þÎñÆ÷ %1 µÄ״̬¡£Õâ¿ÉÄÜÐèÒª¼¸·ÖÖÓ..." - IDS_REFRESH_CURRENT_CELL "ÕýÔÚ¼ì²é£ºµ¥Ôª %1" - IDS_REFRESH_CURRENT_SERVER "ÕýÔÚ¼ì²é£º·þÎñÆ÷ %2" - IDS_REFRESH_CURRENT_AGGREGATE "ÕýÔÚ¼ì²é£º·þÎñÆ÷ %2 µÄ·ÖÇø %3" - IDS_REFRESH_CURRENT_FILESET "ÕýÔÚ¼ì²é£º·þÎñÆ÷ %2£¬·ÖÇø %3 µÄ¾í %4" - IDS_REFRESH_CURRENT_SERVICE "ÕýÔÚ¼ì²é£º·þÎñÆ÷ %2 ÉϵķþÎñ %3" - IDS_REFRESH_PERCENT "%1%% Íê³É" - IDS_PROBLEMS "ÎÊÌâ" - IDS_SERVER_NO_PROBLEMS "¸Ã·þÎñÆ÷ÎÞÒÑÖªÎÊÌâ¡£" - IDS_SERVICE_NO_PROBLEMS "¸Ã·þÎñÎÞÒÑÖªÎÊÌâ¡£" - IDS_AGGREGATE_NO_PROBLEMS "¸Ã·ÖÇøÎÞÒÑÖªÎÊÌâ¡£" - IDS_FILESET_NO_PROBLEMS "¸Ã¾íÎÞÒÑÖªÎÊÌâ¡£" - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB "ÕýÔÚ¼ì²é£º¾íλÖÃÊý¾Ý¿â (VLDB)" - IDS_FILESETTYPE_RW "¶ÁÈ¡£¯Ð´Èë" - IDS_FILESETTYPE_RO "¸±±¾" - IDS_FILESETTYPE_CLONE "±¸·Ý" - IDS_MOVESET_READWRITE "¼ÌÐø½«µ¼Ö¾í %3 ´Ó·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏÒÆ¶¯µ½ÁíÒ»¸öλÖá£" - IDS_MOVESET_READONLY "¼ÌÐø½«µ¼ÖÂ¾í¸±±¾ %3 ´Ó·þÎñÆ÷ %1 µÄ·ÖÇø %2 Éϱ»É¾³ý£¬²¢ÔÚÄúÔÚÏÂÃæÖ¸¶¨µÄ·ÖÇøÉÏ´´½¨ÁíÒ»¸ö¾í¸±±¾¡£" - IDS_SVC_START_TITLE "Æô¶¯·þÎñ" - IDS_SVC_STOP_TITLE "Í£Ö¹·þÎñ" - IDS_SERVICESTATUS_STARTING "¸Ã·þÎñµ±Ç°ÕýÔÚÆô¶¯¡£" - IDS_SERVICESTATUS_RUNNING "¸Ã·þÎñµ±Ç°ÕýÔÚÔËÐС£" - IDS_SERVICESTATUS_STOPPED "¸Ã·þÎñµ±Ç°Í£Ö¹¡£" - IDS_SERVICESTATUS_STOPPING "¸Ã·þÎñµ±Ç°ÕýÔÚÍ£Ö¹¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "¸Ã·þÎñ״̬δ֪¡£" - IDS_SVC_RESTART_BUTTON "ÏÖÔÚÍ£Ö¹²¢ÖØÐÂÆô¶¯(&R)" - IDS_PROBLEM_BOX "ÒÑÖªÎÊÌâ (%1)" - IDS_VIEWLOG_DESC_NOFILE "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÕÒµ½·þÎñÆ÷ %1 ÉϵķþÎñ %2 µÄÈÕÖ¾Îļþ¡£ÇëÔÚÏÂÃæÊäÈë·þÎñÈÕÖ¾ÎļþµÄ¾ø¶Ô·¾¶¡£" - IDS_NO_GROUP "(ÎÞÓµÓÐ×é)" - IDS_VIEWLOG_FROMSERVER "·þÎñÆ÷ %1 ÉϵÄÈÕÖ¾Îļþ" - IDS_VIEWLOG_FROMSERVICE "·þÎñÆ÷ %1 ÉÏ·þÎñ %2 µÄÈÕÖ¾Îļþ" - IDS_VIEWLOG_TRUNCATED "ÎļþĿ¼(½öÏÔʾ×îºó %1 ÐÐ)£º" - IDS_SAVELOG_FILTER "Îı¾Îļþ|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< ¸ß¼¶(&A)" - IDS_ADVANCEDOUT_BUTTON "¸ß¼¶(&A) >>" - IDS_REPTYPE_RELEASE "ÊͷŸ´ÖÆ" - IDS_REPTYPE_SCHEDULED "¶¨ÆÚ¸´ÖÆ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "¸üÐÂËùÓÐ(&U)" - IDS_UPDATETHIS_BUTTON "¸üÐÂ(&U)" - IDS_SERVER_MULTIPLE_PROBLEMS "¸Ã·þÎñÆ÷ÓÐ %1 ¸öÒÑÖªÎÊÌâ¡£" - IDS_SERVICE_MULTIPLE_PROBLEMS "¸Ã·þÎñÓÐ %1 ¸öÒÑÖªÎÊÌâ¡£" - IDS_AGGREGATE_MULTIPLE_PROBLEMS "¸Ã·ÖÇøÓÐ %1 ¸öÒÑÖªÎÊÌâ¡£" - IDS_FILESET_MULTIPLE_PROBLEMS "¸Ã¾íÓÐ %1 ¸öÒÑÖªÎÊÌâ¡£" - IDS_FILESETTYPE_RO_STAGE "¸±±¾" - IDS_SERVICETYPE_SIMPLE_LONG "¼òµ¥£¨²»¼ä¶ÏÔËÐУ©" - IDS_SERVICETYPE_CRON_LONG "Cron £¨ÔÚÖ¸¶¨¼ä¸ôÔËÐУ©" - IDS_QUOTAUNITS_KB "KB" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "(¸Ã¾íÊǸ±±¾£¬Òò¶øÎÞÏÞ¶î)" - IDS_NO_QUOTA_CLONE "(¸Ã¾íÊDZ¸·Ý£¬Òò¶øÎÞÏÞ¶î)" - IDS_USAGE_REPLICA "ÒÑʹÓà %1" - IDS_USAGE_CLONE "ÒÑʹÓà %1" - IDS_COL_AGGS_MOVE "µ±´´½¨¾íʱµÄ·ÖÇø" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "·þÎñÆ÷ %1 ÉϵķÖÇø£º" - IDS_AGGREGATES_IN_CELL "µ¥Ôª %1 ÖÐËùÓзÖÇø£º" - IDS_AGGREGATES_IN_NOTHING "·ÖÇø£º" - IDS_FILESETS_IN_SERVER "·þÎñÆ÷ %1 ÉϵÄËùÓÐ¾í£º" - IDS_FILESETS_IN_CELL "µ¥Ôª %1 ÖеÄËùÓÐ¾í£º" - IDS_FILESETS_IN_NOTHING "¾í£º" - IDS_SERVICES_IN_SERVER "·þÎñÆ÷ %1 ÉÏËùÓзþÎñ£º" - IDS_SERVICES_IN_NOTHING "·þÎñ£º" - IDS_UNKNOWN "(δ֪)" - IDS_UNKNOWN_GROUP "×é #%1 (Ãû³ÆÎ´Öª)" - IDS_AGGFULL_WARN_OFF "ȱʡãÐÖµ(·þÎñÆ÷ÉϽûÓþ¯¸æ)" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "ȱʡãÐÖµ(·þÎñÆ÷ÉϽûÓþ¯¸æ)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - Í˳öÂë %2" - IDS_COL_SERVERS "µ¥ÔªÖеķþÎñÆ÷" - IDS_COL_FILESETS "·þÎñÆ÷Éϵľí" - IDS_COL_AGGREGATES "·þÎñÆ÷ÉϵķÖÇø" - IDS_COL_SERVICES "·þÎñÆ÷ÉϵķþÎñ" - IDS_COL_REPLICAS "¾í¸±±¾" - IDS_COLUMNS_TITLE "Ñ¡ÔñÏÔʾÁÐ - AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_REPCOL_SERVER "·þÎñÆ÷" - IDS_REPCOL_AGGREGATE "·ÖÇø" - IDS_REPCOL_DATE_UPDATE "×î½ü¸üÐÂ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "ÒÆ¶¯¾íʱµÄ·ÖÇø" - IDS_WARN_TITLE "×¢Òâ" - IDS_WARN_DISABLE_AUTH "ͨ¹ýµ¥»÷""ÔÊÐí²»ÑéÖ¤""°´Å¥£¬Äú¿ÉÔÊÐíδ¾­ÑéÖ¤µÄίÍÐÈËÀ´²Ù×÷¸Ã·þÎñÆ÷ÉϵķþÎñ¡£ÓÉÓÚÐí¶à·þÎñÒÔ root Éí·ÝÔËÐУ¬¸Ã²Ù×÷´ú±í +" - IDS_WARN_DISABLE_AUTH2 "·þÎñÆ÷°²È«ÐÔµÄÒ»¸öÑÏÖØÈ±ÏÝ¡£\n\nÄúÈ·ÈÏÒª¸ü¸ÄÂð?" - IDS_SVR_NO_ADDR "(δָ¶¨µÄ)" - IDS_TITLE_BAD_CELL "ÎÞ·¨Ê¶±ðµÄµ¥ÔªÃû" - IDS_DESC_BAD_CELL "ÍøÂçÉÏÕÒ²»µ½ÄúÊäÈëµÄµ¥ÔªÃû¡£\n\n ÇëÔٴμì²éÄúµÄÌõÄ¿£¬ÒÔÈ·ÈÏÊÇÕýÈ·µÄ¡£" - IDS_AGGFULL_WARN_ON "¸Ã·þÎñÆ÷µÄȱʡãÐÖµ(&D) (Æä´óСµÄ %1%%)" - IDS_SETFULL_WARN_ON "¸Ã·þÎñÆ÷µÄȱʡãÐÖµ(&D) (Æä´óСµÄ %1%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "ÎÞ·¨Ê¶±ðÄúÊäÈëµÄ AFS Éí·Ý£¬»òÄúÖ¸¶¨µÄ¿ÚÁî²»ÕýÈ·¡£" - IDS_SVR_CREDS_NONE "(ûÓÐÁîÅÆ)" - IDS_SVR_CREDS_VALID "%2£¬ÔÚ %3 µ½ÆÚ" - IDS_SVR_CREDS_EXPIRED "(ÁîÅÆÒÑÔÚ %3 µ½ÆÚ)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 (×éºÏµÄÏ޶%2)" - IDS_ACTION_DESC_NONE "ûÓÐÕýÔÚ½øÐеIJÙ×÷¡£" - IDS_ACTION_DESC_ONE "´Ë²Ù×÷ÕýÔÚ½øÐУº" - IDS_ACTION_DESC_MULT "ÏÂÁвÙ×÷ÕýÔÚ½øÐУº" - IDS_ACTCOL_OPERATION "²Ù×÷" - IDS_ACTCOL_ELAPSED "Òѹýʱ¼ä" - IDS_ACTION_REFRESH "ÕýÔÚˢе¥ÔªÐÅÏ¢" - IDS_ACTION_CREATESERVER "ÕýÔÚ´´½¨·þÎñÆ÷ %1" - IDS_ACTION_DELETESERVER "ÕýÔÚɾ³ý·þÎñÆ÷ %1" - IDS_ACTION_GETSERVERLOGFILE "ÕýÔÚ´Ó·þÎñÆ÷ %1 »ñÈ¡ÈÕÖ¾Îļþ %2" - IDS_ACTION_SETSERVERAUTH "ÕýÔÚΪ·þÎñÆ÷ %1 ¸ü¸Ä´æÈ¡ÏÞÖÆ" - IDS_ACTION_CHANGESERVERSTATUS "ÕýÔÚ¸ü¸Ä·þÎñÆ÷ %1 µÄÌØÐÔ" - IDS_ACTION_STARTSERVICE "ÕýÔÚÆô¶¯·þÎñÆ÷ %1 µÄ·þÎñ %2" - IDS_ACTION_STOPSERVICE "ÕýÔÚÍ£Ö¹·þÎñÆ÷ %1 µÄ·þÎñ %2" - IDS_ACTION_RESTARTSERVICE "ÕýÔÚÖØÐÂÆô¶¯·þÎñÆ÷ %1 µÄ·þÎñ %2" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "ÕýÔÚʹ VLDB Óë·þÎñÆ÷ %1 ͬ²½" - IDS_ACTION_SYNCVLDB_AGG "ÕýÔÚʹ VLDB Óë·ÖÇø %1:%2 ͬ²½" - IDS_ACTION_SCOUT "ÕýÔÚ¼ì²é·þÎñÆ÷ %1 µÄÎÊÌâ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "ÕýÔÚ¸ü¸Ä¾í %3 µÄ¸´ÖÆÌØÐÔ" - IDS_ACTION_CREATEREPLICA "ÕýÔÚ·ÖÇø %1:%2 ÉÏ´´½¨¾í %3 µÄ¸±±¾" - IDS_DELSET_REPLICA_DESC "×¢Ò⣡\n\n¼ÌÐø½«É¾³ý·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ¾í %3 µÄ¸±±¾¡£" - IDS_DELSET_CLONE_DESC "×¢Ò⣡\n\n¼ÌÐø½«É¾³ý·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ¾í±¸·Ý %3 ¡£" - IDS_INSTALL_DESC1 "¸Ã²Ù×÷¸´ÖÆÎļþµ½Áíһ̨¼ÆËã»ú¡£+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "Èç¹ûÎļþÒÑ´æÔÚÓÚÄ¿±ê¼ÆËã»ú£¬»á½«Ëü×ö±¸·Ý²¢ÒÔ .BAK ×÷ΪÀ©Õ¹Ãû£»ÈκÎÏÖÓеı¸·ÝÎļþÀ©Õ¹Ãû»áת»»Îª .OLD£¬ÈκÎÏÖÓеÄÀ©Õ¹ÃûΪ .OLD µÄÎļþ½«±»É¾³ý¡£" - IDS_ACTION_INSTALLFILE "ÕýÔÚ·þÎñÆ÷ %1 Éϰ²×°Îļþ %2" - IDS_ACTION_UNINSTALLFILE "ÕýÔÚ´Ó·þÎñÆ÷ %1 ÉÏжװÎļþ %2" - IDS_ACTION_PRUNEFILES "ÕýÔÚ´Ó·þÎñÆ÷ %1 ÉÏɾ³ýÎļþ" - IDS_FILTER_ALLFILES "ËùÓÐÎļþ|*.*|" - IDS_ACTION_RENAMEFILESET "ÕýÔÚÖØÃüÃû¾í %1 Ϊ %2" - IDS_RECUR_DAILY "ÿÌì" - IDS_RECUR_SUNDAY "ÿÖÜÈÕ" - IDS_RECUR_MONDAY "ÿÖÜÒ»" - IDS_RECUR_TUESDAY "ÿÖܶþ" - IDS_RECUR_WEDNESDAY "ÿÖÜÈý" - IDS_RECUR_THURSDAY "ÿÖÜËÄ" - IDS_RECUR_FRIDAY "ÿÖÜÎå" - IDS_RECUR_SATURDAY "ÿÖÜÁù" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "ÕýÔÚ·þÎñÆ÷ %1 ÉÏ´´½¨·þÎñ %2" - IDS_ACTION_DELETESERVICE "ÕýÔÚ´Ó·þÎñÆ÷ %1 ÉÏɾ³ýÎļþ %2" - IDS_ACTION_RELEASEFILESET "ÕýÔÚÊͷží %3" - IDS_ACTION_GETDATES "ÕýÔÚ»ñÈ¡·þÎñÆ÷ %1 ÉϵÄÎļþ %2 µÄÈÕÆÚ" - IDS_LASTMODIFIED "×î½üÒ»´ÎÐÞ¸Ä %1" - IDS_SVR_SECURITY_TITLE "·þÎñÆ÷°²È«ÐÔ - %1" - IDS_SVR_LIST_TAB "¹ÜÀíÔ±" - IDS_ACTION_ADMINLIST_LOAD "ÕýÔÚ»ñÈ¡·þÎñÆ÷ %1 µÄ¹ÜÀíÔ±" - IDS_ACTION_ADMINLIST_SAVE "ÕýÔÚдÈë·þÎñÆ÷ %1 µÄ¹ÜÀíÔ±" - IDS_ADMCOL_PRINCIPAL "³ÉÔ±" - IDS_ADMCOL_TYPE "ÀàÐÍ" - IDS_ADMCOL_TYPE_GROUP "×é" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "ÕýÔÚ»Ö¸´¾í %1" - IDS_COL_AGGS_RESTORE "»Ö¸´¾íʱµÄ·ÖÇø" - IDS_RESTORE_FILTER "¾íת´¢Îļþ |*.DMP|ËùÓÐÎļþ|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "ÕýÔÚ¸ü¸Ä·þÎñÆ÷ %1 µÄ·þÎñÖØÐÂÆô¶¯Ê±¼ä" - IDS_RESTORE_CREATESET "¾í %1 ½«´´½¨ÔÚÄúÔÚÏÂÃæÖ¸¶¨µÄ·þÎñÆ÷µÄ·ÖÇøÉÏ¡£" - IDS_RESTORE_OVERWRITESET - "×¢Ò⣡¾í %3 ´æÔÚÓÚ·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏ£¬Èç¹ûÄú¼ÌÐø£¬½«¸²¸ÇËü£¡" - IDS_SUBSET_TITLE_LOAD "´ò¿ª·þÎñÆ÷×Ó¼¯" - IDS_SUBSET_TITLE_SAVE "±£´æ·þÎñÆ÷×Ó¼¯" - IDS_BUTTON_OPEN "´ò¿ª(&O)" - IDS_BUTTON_SAVE "±£´æ(&S)" - IDS_SUBSET_SAVE_TITLE "×¢Òâ" - IDS_SUBSET_SAVE_DESC "ÃûΪ %1 µÄ·þÎñÆ÷×Ó¼¯ÒÑ´æÔÚ¡£\n\nÄúÏ븲¸Ç¸Ã×Ó¼¯Âð£¿" - IDS_SUBSET_CHANGED "%1 [ÒÑÐ޸ĵÄ]" - IDS_SUBSET_TAB "±»¼àÊӵķþÎñÆ÷" - IDS_SUBSET_DISCARD_TITLE "±£´æ×Ó¼¯£¿" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "Äú»¹Î´½«µ±Ç°¼àÊӵķþÎñÆ÷ÁÐ±í±£´æÎª×Ó¼¯¡£Èç¹û±£´æ¸ÃÁÐ±í£¬ÒÔºóÄú¿ÉÒÔ¼ÌÐø¼àÊÓÕâЩ·þÎñÆ÷¡£\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "ÄúÊÇ·ñÒª´´½¨Ò»¸ö×Ó¼¯À´°üº¬µ±Ç°¼àÊӵķþÎñÆ÷µÄÁÐ±í£¿" - IDS_SUBSET_NONAME "(δÃüÃûµÄ)" - IDS_SUBSET_NOSUBSET "(ËùÓзþÎñÆ÷Õý±»¼àÊÓ)" - IDS_SUBSET_SERVERSUBSET "·þÎñÆ÷ %1" - IDS_FILESET_SOME "µ¥Ôª %1 ÖÐËùÓб»¼àÊÓ·þÎñÆ÷µÄ¾í£º" - IDS_AGGREGATE_SOME "µ¥Ôª %1 ÖÐËùÓб»¼àÊÓ·þÎñÆ÷µÄ·ÖÇø£º" - IDS_SERVICE_SOME "µ¥Ôª %1 ÖÐËùÓб»¼àÊÓ·þÎñÆ÷µÄ·þÎñ£º" - IDS_FILESET_UNMON "·þÎñÆ÷ %1 δ±»¼àÊÓ" - IDS_AGGREGATE_UNMON "·þÎñÆ÷ %1 δ±»¼àÊÓ" - IDS_SERVICE_UNMON "·þÎñÆ÷ %1 δ±»¼àÊÓ" - IDS_SUBSET_DELETE_TITLE "ɾ³ý×Ó¼¯£¿" - IDS_SUBSET_DELETE_DESC "ÄúÈ·¶¨ÒªÉ¾³ý·þÎñÆ÷×Ó¼¯ %1£¿" - IDS_ERROR_TRANSLATED "´íÎóºÅ 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "ÎÞ·¨±æÈÏ´íÎóºÅ 0x%1 (%2)¡£" - IDS_FIND_NOTHING_TITLE "δѡÔñÃüÁî" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "Òª²éÕÒÈçºÎÖ´ÐÐÒ»¸ö²Ù×÷£¬Ê×ÏÈ´ÓÁбíÑ¡ÔñÒ»¸öÃüÁîÐлòÊäÈëÒ»¸ö¹Ø¼ü×Ö¡£" - IDS_FIND_UNKNOWN_TITLE "δ֪ÃüÁî" - IDS_FIND_UNKNOWN_DESC "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÕÒµ½ÃüÁî""%1"" µÄÈκΰïÖúÖ÷Ìâ¡£" - IDS_HELPABOUT_DESC1 "¾¯¸æ£º¸Ã¼ÆËã»ú³ÌÐòÊܵ½°æÈ¨¼°¹ú¼ÊÌõÔ¼µÄ±£»¤¡£+" - IDS_HELPABOUT_DESC2 "δ¾­ÊÚȨ¸´ÖÆ»ò·Ö·¢¸ÃÈí¼þ»áÊܵ½ÑÏÀ÷µÄÃñÊ»òÐÌÊ´¦·££¬²¢½«Êܵ½·¨ÂÉÑϳ͡£\n\n+" - IDS_HELPABOUT_DESC3 "AFS ÊÇ Transarc ¹«Ë¾(IBM ¹«Ë¾)µÄÉ̱ꡣ" - IDS_CANT_QUIT_TITLE "AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_CANT_QUIT_REBOOT "×¢Ò⣡\n\n AFS ·þÎñÆ÷¹ÜÀíÆ÷ÕýÔÚÖ´ÐÐÒ»¸ö»ò¸ü¶à²Ù×÷¡£Èç¹ûÄúÏÖÔÚ¹Ø±Õ Windows£¬½«ÎÞ·¨³É¹¦Íê³ÉÄÇЩ²Ù×÷¡£\n\n ÄúÈ·¶¨ÒªÖØÐÂÆô¶¯ Windows Âð£¿" - IDS_APP_TITLE "AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_ACTION_OPENCELL "ÔÚµ¥Ôª %1 ÖвéÕÒ·þÎñÆ÷" - IDS_OPTIONS_TITLE "Ñ¡Ïî - AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_OPTIONS_GENERAL_TAB "Ò»°ã" - IDS_BADCREDS_DESC "³ý·Ç×÷Ϊ¹ÜÀíÔ±µÇ¼£¬·ñÔòÄú¿ÉÄÜ»áûÓгä×ãµÄÌØÈ¨³É¹¦¹ÜÀí %1 µ¥Ôª¡£Ã»Óгä×ãµÄ´æÈ¡ÌØÈ¨¿ÉÄܻᵼÖÂÕý³£Çé¿öÏ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ò²»áÔÚµ¥ÔªÖÐÕÒµ½ÎÊÌâ¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "È·ÈÏ - AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_NO_GROUP_CHECKBOX "ÎÞÓµÓÐ×é" - IDS_AFS_ID_DIDEXP "%1(ÁîÅÆÒÑÔÚ %2 µ½ÆÚ)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "(ÕýÔÚ²éѯ)" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "Íⲿ×é" - IDS_ADMCOL_TYPE_FOREIGN_USER "ÍⲿÓû§" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "֪ͨÆ÷" - IDS_SVC_NONOTIFIER "(ÎÞ)" - IDS_SVR_KEY_TAB "·þÎñÆ÷ÃÜÔ¿" - IDS_KEYNAME_NOTIME "·þÎñÆ÷ %1 µÄÃÜÔ¿£º" - IDS_KEYNAME_WITHTIME "·þÎñÆ÷ %1 µÄÃÜÔ¿(ÒÑÐÞ¸ÄµÄ %2)£º" - IDS_SVRKEY_VERSION "°æ±¾" - IDS_SVRKEY_DATA "Öµ" - IDS_SVRKEY_CHECKSUM "УÑéºÍ" - IDS_SVRKEY_DATA_UNKNOWN "(Òþ²ØµÄ)" - IDS_STARTSERVICE_TITLE "Æô¶¯·þÎñ" - IDS_STOPSERVICE_TITLE "Í£Ö¹·þÎñ" - IDS_STARTSERVICE_TEXT "µ¥»÷¡°È·¶¨¡±ÒÔÆô¶¯·þÎñÆ÷ %1 ÉϵķþÎñ %2¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "µ¥»÷¡°È·¶¨¡±ÒÔÍ£Ö¹·þÎñÆ÷ %1 ÉϵķþÎñ %2¡£" - IDS_STARTSERVICE_STARTUP - "Äú¿ÉÒÔÓÀ¾Ã±£³Ö¸Ã¸ü¸Ä£¬ÒÔ±ã·þÎñÆ÷ %1 ÖØÐÂÆô¶¯Ê±£¬·þÎñ %2 »á×Ô¶¯Æô¶¯¡£" - IDS_STOPSERVICE_STARTUP "Äú¿ÉÒÔÓÀ¾Ã±£³Ö¸Ã¸ü¸Ä£¬ÒÔ±ã·þÎñÆ÷ %1 ÖØÐÂÆô¶¯Ê±£¬·þÎñ %2 ²»»á×Ô¶¯Æô¶¯¡£" - IDS_STARTSERVICE_PERMANENT "ÓÀ¾Ã(Èç¹û·þÎñÆ÷ %1 ÖØÐÂÆô¶¯£¬Æô¶¯·þÎñ %2)(&P)" - IDS_STARTSERVICE_TEMPORARY - "ÁÙʱ(Èç¹û·þÎñÆ÷ %1 ÖØÐÂÆô¶¯£¬²»Æô¶¯·þÎñ %2)(&T)" - IDS_STOPSERVICE_PERMANENT - "ÓÀ¾Ã(Èç¹û·þÎñÆ÷ %1 ÖØÐÂÆô¶¯£¬²»Æô¶¯·þÎñ %2)(&P)" - IDS_STOPSERVICE_TEMPORARY "ÁÙʱ(Èç¹û·þÎñÆ÷ %1 ÖØÐÂÆô¶¯£¬Æô¶¯·þÎñ %2)(&T)" - IDS_ACTION_EXECUTE "Ö´ÐзþÎñÆ÷ %1 µÄ %2" - IDS_ACTION_SALVAGE_SVR "Íì¾È·þÎñÆ÷ %1 ÉϵÄËùÓÐ¾í£º" - IDS_ACTION_SALVAGE_AGG "Íì¾È·ÖÇø %1:2 ÉϵÄËùÓÐ¾í£º" - IDS_ACTION_SALVAGE_VOL "Íì¾È·ÖÇø %1:2 Éϵľí %3" - IDS_SALVAGE_SVR "Íì¾È·þÎñÆ÷ %1 ÉϵÄËùÓоí" - IDS_SALVAGE_AGG "Íì¾È·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄËùÓоí" - IDS_SALVAGE_SET "Íì¾È·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ¾í %3" - IDS_SETSTATUS_SALVAGE "Íì¾È¾í" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "¾í±»Ëø¶¨" - IDS_SETSTATUS_NO_VOL "¾í¶ªÊ§" - IDS_SETSTATUS_BUSY "¾íµ±Ç°½Ïæ" - IDS_SETSTATUS_MOVED "ÒÑÒÆ¶¯µÄ¾í" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "µØÖ·" - IDS_HOST_TITLE "·þÎñÆ÷ %1 ʶ±ðµÄÊý¾Ý¿âÖ÷»ú·þÎñÆ÷£º" - IDS_SVR_HOSTS_TITLE "·þÎñÆ÷ %1 - Êý¾Ý¿âÖ÷»ú" - IDS_SVR_HOST_TAB "Êý¾Ý¿âÖ÷»ú" - IDS_ACTION_HOSTLIST_LOAD "ÕýÔÚ´Ó·þÎñÆ÷ %1 »ñÈ¡Ö÷»úÁбí" - IDS_ACTION_HOSTLIST_SAVE "дÖ÷»úÁÐ±íµ½·þÎñÆ÷ %1" - IDS_SETSTATUS_1ALERT "¾íÓÐÒ»¸öÎÊÌâ" - IDS_SETSTATUS_2ALERT "¾íÓÐ %1 ¸öÎÊÌâ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "Ϊ·þÎñÆ÷ %1 ¸ü¸Ä IP µØÖ·" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED "·þÎñÆ÷ %1 δ±»¼àÊÓ" - IDS_ALERT_DESCSHORT_TIMEOUT "ÎÞ·¨ÁªÏµ·þÎñÆ÷ %1£»×î½üÒ»´Î´íÎó£º%3" - IDS_ALERT_DESCSHORT_AGG_FULL "%2 ʹÓõķÖÇø³¬³ö¾¯¸æãÐÖµ %3%% (%4)" - IDS_ALERT_DESCSHORT_SET_FULL "%3 ʹÓÃµÄ¾í³¬³ö¾¯¸æãÐÖµ %4%% (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT "¾í %3 ÎÞ VLDB ÌõÄ¿" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "¾í %3 ÓÐ VLDB ÌõÄ¿µ«ÔÚ·þÎñÆ÷ %1 µÄ·ÖÇø %1 ÉÏÕÒ²»µ½" - IDS_ALERT_DESCSHORT_STOPPED "·þÎñ %2 Í£Ö¹ÓÚ %3" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "·ÖÇø %2 ±» VLDB ÒýÓõ«ÎÞ·¨ÔÚ·þÎñÆ÷ %1 ÉÏÕÒµ½" - IDS_ALERT_DESCSHORT_BADCREDS "Äú¿ÉÄÜûÓÐ×ã¹»µÄÌØÈ¨¹ÜÀí·þÎñÆ÷ %1" - IDS_ALERT_DESCSHORT_AGG_ALLOC "·ÖÇø %2 ÉÏ×éºÏµÄ¾íÏ޶³öÆäÈÝÁ¿" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE "¾í %3 Ë𻵣¬ÎÞ·¨Ê¹Óá£" - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE "ÎÞÔËÐеķþÎñ¿É¹©¾í %3 ʹÓá£" - IDS_ALERT_DESCSHORT_STATE_OFFLINE "¾í %3 ÍÑ»ú£¬ÎÞ·¨Ê¹Óá£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "ÎÞ·¨ÁªÏµ·þÎñÆ÷ %1¡£×î½üÒ»´Î³¢ÊÔ£¬·¢ÉúÓÚ %2£¬²úÉú´íÎó""%3""¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄʹÓó¬³öÆä¾¯¸æãÐÖµ %3%% (%4)¡£" - IDS_ALERT_DESCFULL_SET_FULL - "¾í %3 (·þÎñÆ÷ %1£¬·ÖÇø %2)µÄʹÓó¬³öÆä¾¯¸æãÐÖµ %4%%(%5)¡£" - IDS_ALERT_DESCFULL_NO_VLDBENT - "¾í %3 ´æÔÚÓÚ·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏ£¬µ«Ã»ÓÐÏàÓ¦µÄ VLDB ÌõÄ¿¡£" - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "¾í %3 ÓÐ VLDB ÌõÄ¿£¬µ«ÔÚ·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏÕÒ²»µ½¡£" - IDS_ALERT_DESCFULL_STOPPED "·þÎñÆ÷ %1 µÄ·þÎñ %2 Í£Ö¹ÓÚ %3£¬Í˳öÂëΪ %5¡£" - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "VLDB Ö¸·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ¾í£¬µ«ÕÒ²»µ½¸Ã·ÖÇø¡£" - IDS_ALERT_DESCFULL_BADCREDS - "AFS ·þÎñÆ÷¹ÜÀíÆ÷¿ÉÄܼì²âµ½·þÎñÆ÷ %1 Éϲ»´æÔڵĴíÎó£¬ÕâÊÇÒòΪÄúûÓиõ¥Ôª¹ÜÀíÔ±µÄ AFS ÁîÅÆ¡£ " - IDS_ALERT_DESCFULL_AGG_ALLOC - "·þÎñÆ÷ %1 µÄ·ÖÇøµÄ %2 ÉÏ×éºÏµÄ¾íÏ޶×ܹ² %4£¬³¬³ö·ÖÇøÈÝÁ¿ %3¡£" - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ %3 ¾íûÓÐ Vnode ÓëÖ®¹ØÁª¡£(¾í״̬Ϊ 0x%4¡£)" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "·þÎñÆ÷ %1 ÉÏûÓÐÎļþµ÷³öÆ÷·þÎñÔËÐУ¬ÎÞ·¨Ê¹Ó÷ÖÇø %2 µÄ¾í %3¡£(¾í״̬Ϊ 0x%4¡£)" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ %3 ¾íÍÑ»ú£¬ÎÞ·¨Ê¹Óá£(¾í״̬Ϊ 0x%4¡£)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "µ¥»÷¡°ÔÙÊÔÒ»´Î¡±°´Å¥£¬³¢ÊÔÖØÐÂÁ¬½Ó¸Ã·þÎñÆ÷¡£" - IDS_ALERT_FIX_AGG_FULL "µ¥»÷¡°¾¯¸æ¡±°´Å¥Îª¸Ã·ÖÇøµÄʹÓøü¸Ä¾¯¸æãÐÖµ¡£" - IDS_ALERT_FIX_SET_FULL "µ¥»÷¡°¾¯¸æ¡±°´Å¥Îª¸Ã¾íµÄʹÓøü¸Ä¾¯¸æãÐÖµ¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "VLDB ¿ÉÄܹýʱ£»Èç¹ûÕâÑù£¬Ê¹Óá°Í¬²½ VLDB¡±ÃüÁî½øÐиüС£" - IDS_ALERT_FIX_NO_SVRENT_SET "¼ì²é·þÎñÆ÷ºÍ·ÖÇøÒÔÈ·±£ËüÃǹ¤×÷Õý³£¡£" - IDS_ALERT_FIX_STOPPED "µ¥»÷¡°²é¿´ÈÕÖ¾¡±°´Å¥Îª¸Ã·þÎñ²é¿´·þÎñÈÕÖ¾¡£" - IDS_ALERT_FIX_NO_SVRENT_AGG "¼ì²é·þÎñÆ÷ÒÔÈ·±£·ÖÇøÒѵ¼³öÇÒ¹¤×÷Õý³£¡£" - IDS_ALERT_FIX_BADCREDS "µ¥»÷¡°ÈÏÖ¤¡±°´Å¥ÒÔ»ñµÃÐ嵀 AFS ÁîÅÆ¡£" - IDS_ALERT_FIX_AGG_ALLOC "¼õÉٸ÷ÖÇøµÄ¾íÏ޶»òÕßÒÆ¶¯Ò»¸ö»ò¶à¸ö¾íµ½ÁíÒ»·ÖÇø¡£" - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "ÔÙÊÔÒ»´Î(&A)" - IDS_ALERT_BUTTON_WARNINGS "¾¯¸æ(&W)..." - IDS_ALERT_BUTTON_VIEWLOG "²é¿´ÈÕÖ¾(&V)" - IDS_ALERT_BUTTON_SHOWME "ÏÔʾ(&S)" - IDS_ALERT_BUTTON_GETCREDS "ÈÏÖ¤(&A)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "δָ¶¨µ¥Ôª¡£ÒªÊ¹Óà AFS ·þÎñÆ÷¹ÜÀíÆ÷£¬Äú±ØÐëÖ¸¶¨ÒªÊ¹ÓÃµÄ AFS µ¥Ôª¡£Í¨¹ýÑ¡Ôñ""´ò¿ª..."" ²Ëµ¥Ïî(ÔÚÉÏÃæµÄ""µ¥Ôª "" ²Ëµ¥ÖÐ)À´Ñ¡Ôñµ¥Ôª¡£" - IDS_ERROR_REFRESH_CELLSERVERS - "ÎÞ·¨»ñµÃµ¥Ôª %1 µÄ·þÎñÆ÷ÁÐ±í¡£\n\n´íÎó£º %2" - IDS_ERROR_CANT_OPEN_CELL - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÁªÏµµ¥Ôª %1 ÖеÄÈκηþÎñÆ÷¡£\n\nÇëÖØÐ¼ì²éÒÔÈ·ÈÏÒÑÕýÈ·ÊäÈëµ¥ÔªÃû¡£" - IDS_ERROR_REFRESH_AGGREGATES "ÎÞ·¨»ñµÃ·þÎñÆ÷ %1 µÄ·ÖÇøÁÐ±í¡£\n\n´íÎó£º%2" - IDS_ERROR_REFRESH_SERVER_STATUS "ÎÞ·¨»ñµÃ·þÎñÆ÷ %1 µÄµ±Ç°×´Ì¬¡£" - IDS_ERROR_CHANGE_SERVER_STATUS - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 ¸ü¸ÄÌØÐÔ¡£" - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "ÎÞ·¨»ñµÃ·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄµ±Ç°×´Ì¬¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "ÎÞ·¨»ñµÃ¾í %3 (·þÎñÆ÷¡¡%1£¬·ÖÇø %2)µÄµ±Ç°×´Ì¬¡£" - IDS_ERROR_REFRESH_SERVICE_STATUS - "ÎÞ·¨È·¶¨·þÎñÆ÷ %1 µÄ·þÎñ %2 µÄµ±Ç°×´Ì¬¡£" - IDS_ERROR_MOVE_FILESET "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´Ó·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏÒÆ¶¯¾í %3 µ½·þÎñÆ÷ %4 µÄ·ÖÇø %5¡£" - IDS_ERROR_VIEW_LOGFILE "ÎÞ·¨´Ó·þÎñÆ÷ %1 ¶ÁÈ¡Îļþ %2¡£\n\n¼ì²éÒÔÈ·ÈÏÄúÒÑÕýÈ·ÊäÈëÎļþÃû£¬²¢ÇÒÓÐ×ã¹»µÄȨÏ޲鿴Îļþ¡£" - IDS_ERROR_NOT_REPLICATED "ÎÞ·¨È·¶¨¾í %1 µÄ¸´ÖÆ×´Ì¬¡£" - IDS_ERROR_CANT_CREATE_FILESET - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚ·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏ´´½¨¾í %3¡£" - IDS_ERROR_CANT_DELETE_FILESET - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨É¾³ý¾í %3 (·þÎñÆ÷ %1 µÄ·ÖÇø %2)¡£" - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚ·þÎñÆ÷ %1 µÄ·ÖÇø %2 ÉÏΪ¾í %3 ´´½¨ VLDB ÌõÄ¿¡£" - IDS_ERROR_CANT_SET_FILESET_QUOTA - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 µÄ·ÖÇø %2 Éϵľí %3 ¸ü¸ÄÏÞ¶î¡£" - IDS_ERROR_CANT_CREATE_SERVER - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚµ¥Ôª %1 Öд´½¨ÇëÇóµÄ·þÎñÆ÷ÌõÄ¿¡£" - IDS_ERROR_CANT_PING_SERVER - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨È·¶¨·þÎñÆ÷ %1 µÄ IP µØÖ·¡£" - IDS_ERROR_CANT_DELETE_SERVER "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨É¾³ý·þÎñÆ÷ %1¡£" - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "ÎÞ·¨É¾³ý·þÎñÆ÷ %1£¬ÒòΪËüÈÔÓµÓÐÒ»¸ö»ò¶à¸ö¾í¡£³ý·Ç·þÎñÆ÷²»°üº¬¾í£¬·ñÔò²»ÄÜɾ³ý¡£" - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸ü¸Ä·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄÌØÐÔ¡£" - IDS_ERROR_CHANGE_SERVICE_STATUS - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸ü¸Ä·þÎñÆ÷ %1 µÄ·þÎñ %2 µÄÌØÐÔ¡£" - IDS_ERROR_CANT_START_SERVICE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Æô¶¯·þÎñÆ÷ %1 µÄ·þÎñ %2¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Í£Ö¹·þÎñÆ÷ %1 µÄ·þÎñ %2¡£" - IDS_ERROR_CANT_RESTART_SERVICE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Í£Ö¹²¢ÖØÐÂÆô¶¯·þÎñÆ÷ %1 µÄ·þÎñ %2¡£" - IDS_ERROR_CHANGE_REPLICA_STATUS - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 µÄ·ÖÇø %2 Éϵľí %3 ¸ü¸Ä¸´ÖÆÌØÐÔ¡£" - IDS_ERROR_CANT_SYNCVLDB "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸üРVLDB¡£" - IDS_ERROR_CANT_CREATE_REPLICA - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´´½¨·þÎñÆ÷ %1 µÄ·ÖÇø %2 Éϵľí %3 µÄ¸±±¾¡£" - IDS_ERROR_CANT_INSTALL_FILE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚ·þÎñÆ÷ %1 Éϰ²×°Îļþ %2¡£" - IDS_ERROR_CANT_UNINSTALL_FILE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚ·þÎñÆ÷ %1 ÉÏжװÎļþ %2¡£" - IDS_ERROR_CANT_PRUNE_FILES - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´Ó·þÎñÆ÷ %1 ÉϳýÈ¥ÇëÇóµÄÎļþ¡£" - IDS_ERROR_CANT_RENAME_FILESET "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÖØÃüÃû¾í %1 Ϊ""%2""¡£" - IDS_ERROR_CANT_CREATE_SERVICE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚ·þÎñÆ÷ %1 ÉÏ´´½¨·þÎñ %2¡£" - IDS_ERROR_CANT_DELETE_SERVICE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´Ó·þÎñÆ÷ %1 ÉÏɾ³ý·þÎñ %2¡£" - IDS_ERROR_CANT_RELEASE_FILESET "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÊͷŸ´ÖƵľí %3¡£" - IDS_ERROR_CANT_UPDATE_FILESET - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸üзþÎñÆ÷ %2 µÄ·ÖÇø %1 µÄ¾í¸±±¾ %3¡£" - IDS_ERROR_CANT_UPDATE_ALL "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸üоí %3 µÄÈκθ±±¾¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¶ÁÈ¡·þÎñÆ÷ %1 µÄ¹ÜÀíÔ±ÁÐ±í¡£" - IDS_ERROR_CANT_LOAD_KEYLIST - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¶ÁÈ¡·þÎñÆ÷ %1 µÄ·þÎñÆ÷ÃÜÔ¿ÁÐ±í¡£" - IDS_ERROR_CANT_CREATE_KEY - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 н¨·þÎñÆ÷ÃÜÔ¿¡£" - IDS_ERROR_CANT_SAVE_ADMLIST - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸ü¸Ä·þÎñÆ÷ %1 µÄ¹ÜÀíÔ±ÁÐ±í¡£" - IDS_ERROR_CANT_CLONE "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´´½¨·þÎñÆ÷ %1 µÄ·ÖÇø %2 Éϵľí %3 µÄ±¸·Ý°æ±¾¡£" - IDS_ERROR_CANT_CLONESYS "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´´½¨ÈκÎÇëÇóµÄ±¸·Ý¾í¡£" - IDS_ERROR_CANT_DUMP_FILESET - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨×ª´¢¾í %3 (·þÎñÆ÷ %1£¬·ÖÇø %2)µÄÄÚÈݵ½Îļþ %4¡£" - IDS_ERROR_CANT_RESTORE_FILESET - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨»Ö¸´Îļþ %4 µ½¾í %3(·þÎñÆ÷ %1£¬·ÖÇø %2)¡£" - IDS_ERROR_CANT_SET_RESTART_TIMES - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸ü¸Ä·þÎñÆ÷ %1 ·þÎñµÄÖØÐÂÆô¶¯Ê±¼ä¡£" - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨É¾³ý·þÎñÆ÷ %1 µÄ·ÖÇø %2 µÄ¾í %3¡£\n\nÎÞ·¨É¾³ý¾í %3£¬³ý·ÇÊ×ÏÈɾ³ýÆäËùÓи±±¾¡£" - IDS_CMDLINE_TITLE "³ö´í - AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_CMDLINE_SYNTAX "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£" - IDS_CMDLINE_UNRECOGNIZED - "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ÎÞ·¨Ê¶±ð²ÎÊý ""%1""¡£" - IDS_CMDLINE_DUPLICATE "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ²ÎÊý""%1""±»Ö¸¶¨¶à´Î¡£" - IDS_CMDLINE_UNEXPECTVALUE - "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ²ÎÊý ""%1"" ²»Ó¦¸³ÓèÖµ¡£" - IDS_CMDLINE_MISSINGVAL "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ²ÎÊý ""%1"" ±ØÐë´øÓÐÖµ¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n²ÎÊý""/SUBSET""½öµ±²ÎÊý""/CELL""Ö¸¶¨Ê±²ÅÖ¸¶¨¡£" - IDS_CMDLINE_INVALIDSUBSET - "ÄúÖ¸¶¨µÄ·þÎñÆ÷×Ó¼¯£¬""%2""£¬Ã»ÓÐΪµ¥Ôª %1 ¶¨Òå¡£" - IDS_CMDLINE_SERVERNOTCELL - "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n²ÎÊý""/SERVER""½öµ±Ö¸¶¨²ÎÊý""/CELL""ʱ²ÅÖ¸¶¨¡£" - IDS_CMDLINE_RESET_TITLE "AFS ·þÎñÆ÷¹ÜÀíÆ÷" - IDS_CMDLINE_RESET_DESC "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÒÑÇå³ýÖ¸¶¨µÄÉèÖá£" - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Ê¹·þÎñÆ÷ %1 µÄ·ÖÇø %2 Óë VLDB ͬ²½£¬ÒòΪ¸Ã·ÖÇø²»´æÔÚ»òδµ¼³ö¡£\n\nÒª´Ó·þÎñÆ÷ %1 ÉϳýÈ¥¸Ã·ÖÇø£¬Äú±ØÐëɾ³ýÏàÓ¦µÄ¾í VLDB ÌõÄ¿¡£" - IDS_CMDLINE_USERPASSWORD - "ÄúΪ AFS ·þÎñÆ÷¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\nÒª»ñµÃÐ嵀 AFS ÁîÅÆ£¬±ØÐëͬʱָ¶¨²ÎÊý""/USER"" ¼° ""/PASSWORD""¡£" - IDS_ERROR_CANT_DELETE_KEY - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´Ó·þÎñÆ÷ %1 ÉÏɾ³ý·þÎñÆ÷ÃÜÔ¿ %2¡£" - IDS_ERROR_CANT_GETRANDOMKEY - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 Éú³ÉÒ»¸öËæ»úÃÜÔ¿¡£" - IDS_ERROR_CANT_EXECUTE_COMMAND - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨ÔÚ·þÎñÆ÷ %1 ÉÏÖ´ÐÐÏÂÁÐÃüÁ\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "AFS ·þÎñÆ÷¹ÜÀíÆ÷³É¹¦Íê³ÉÍì¾È²Ù×÷£¬µ«ÎÞ·¨¼ìË÷ÃèÊöÍì¾È²Ù×÷ÌØ¶¨½á¹ûµÄÈÕÖ¾Îļþ¡£" - IDS_ERROR_CANT_SALVAGE "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Ö´ÐÐÇëÇóµÄÍì¾È²Ù×÷¡£" - IDS_ERROR_CANT_AUTH_ON "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 ÆôÓÃÈÏÖ¤¼ì²é¡£" - IDS_ERROR_CANT_AUTH_OFF "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 ½ûÓÃÈÏÖ¤¼ì²é¡£" - IDS_ERROR_CANT_LOAD_HOSTLIST - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨´Ó·þÎñÆ÷ %1 É϶ÁÈ¡Êý¾Ý¿âÖ÷»ú·þÎñÆ÷ÁÐ±í¡£" - IDS_ERROR_CANT_SAVE_HOSTLIST - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨¸ü¸Ä·þÎñÆ÷ %1 ÉϵÄÊý¾Ý¿âÖ÷»ú·þÎñÆ÷ÁÐ±í¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Æô¶¯£¬ÒòΪ¸Ã¼ÆËã»úÉÏδÕýÈ·°²×° AFS ¿ØÖÆÖÐÐÄ¡£\n\nÄú¿ÉÄÜÐèÒªÖØÐ°²×° AFS ¿ØÖÆÖÐÐÄ¡£" - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "ÓÉÓÚÒ»¸öδ֪ÎÊÌ⣬AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Æô¶¯¡£\n\nÄú¿ÉÄÜÐèÒªÖØÐ°²×° AFS ¿ØÖÆÖÐÐÄ¡£" - IDS_ERROR_CANT_CHANGEADDR - "AFS ·þÎñÆ÷¹ÜÀíÆ÷ÎÞ·¨Îª·þÎñÆ÷ %1 ¸ü¸Ä VLDB ÖÐµÄ IP µØÖ·¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "¼òµ¥" - IDS_SERVICETYPE_CRON "Cron" - IDS_SERVICESTATE_STOPPED "ÒÑÍ£Ö¹" - IDS_SERVICESTATE_STOPPING "ÕýÔÚÍ£Ö¹" - IDS_SERVICESTATE_STARTING "ÕýÔÚÆô¶¯" - IDS_SERVICESTATE_RUNNING "ÕýÔÚÔËÐÐ" - IDS_SERVICETYPE_FS_LONG "FS (Îļþϵͳ)" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "µ¥Ôª %1 ÖÐËùÓзþÎñ£º" - IDS_SERVICE_STARTDATE "ÒÑÆô¶¯ %1" - IDS_SERVICE_STOPDATE "ÒÑÍ£Ö¹ %1" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/lang/zh_TW/svrmgr.rc b/src/WINNT/afssvrmgr/lang/zh_TW/svrmgr.rc deleted file mode 100644 index 357484d49..000000000 --- a/src/WINNT/afssvrmgr/lang/zh_TW/svrmgr.rc +++ /dev/null @@ -1,2965 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Manager" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Taiwan) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVICES, DIALOG - BEGIN - LEFTMARGIN, 3 - RIGHTMARGIN, 162 - END - - IDD_AGGREGATES, DIALOG - BEGIN - RIGHTMARGIN, 121 - END - - IDD_FILESETS, DIALOG - BEGIN - RIGHTMARGIN, 163 - VERTGUIDE, 188 - VERTGUIDE, 189 - END - - IDD_SVR_LISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_AGG_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 262 - TOPMARGIN, 5 - BOTTOMMARGIN, 155 - END - - IDD_SVR_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 183 - END - - IDD_SVR_SCOUT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 153 - END - - IDD_SVC_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 209 - END - - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 315 - TOPMARGIN, 2 - BOTTOMMARGIN, 224 - END - - IDD_SERVER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 207 - TOPMARGIN, 2 - BOTTOMMARGIN, 135 - END - - IDD_SVC_CREATE, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 228 - END - - IDD_SET_REPSITES, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 216 - TOPMARGIN, 5 - BOTTOMMARGIN, 163 - END - - IDD_OPENCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 7 - BOTTOMMARGIN, 253 - HORZGUIDE, 160 - END - - IDD_TIMEOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 232 - TOPMARGIN, 7 - BOTTOMMARGIN, 153 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_REFRESHALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END - - IDD_SET_CREATE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 205 - END - - IDD_SET_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SET_CLONE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 341 - TOPMARGIN, 7 - BOTTOMMARGIN, 81 - END - - IDD_SVC_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 189 - END - - IDD_SVR_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 152 - END - - IDD_AGG_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 252 - TOPMARGIN, 5 - BOTTOMMARGIN, 146 - END - - IDD_SET_PROBLEMS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 268 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SET_MOVETO, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 170 - END - - IDD_SET_MOVING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SVC_LOGNAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVC_VIEWLOG, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 181 - END - - IDD_SET_SETQUOTA, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 267 - TOPMARGIN, 4 - BOTTOMMARGIN, 126 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_SVR_SYNCVLDB, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 265 - TOPMARGIN, 4 - BOTTOMMARGIN, 95 - END - - IDD_SET_CREATEREP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 4 - BOTTOMMARGIN, 167 - END - - IDD_SVR_INSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 152 - END - - IDD_SVR_UNINSTALL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 135 - END - - IDD_SVR_PRUNE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 220 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_SET_RENAME, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 129 - END - - IDD_SVC_DELETE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SVR_GETDATES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_GETDATES_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 128 - END - - IDD_SET_DUMP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 291 - TOPMARGIN, 7 - BOTTOMMARGIN, 140 - END - - IDD_SET_RESTORE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 288 - TOPMARGIN, 4 - BOTTOMMARGIN, 244 - END - - IDD_SVC_BOS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 220 - TOPMARGIN, 5 - BOTTOMMARGIN, 202 - END - - IDD_SET_DUMPING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_RESTORING, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 233 - TOPMARGIN, 2 - BOTTOMMARGIN, 60 - END - - IDD_SET_CLONESYS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_SUBSETS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 276 - TOPMARGIN, 5 - BOTTOMMARGIN, 177 - END - - IDD_SUBSET_LOADSAVE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 276 - TOPMARGIN, 4 - BOTTOMMARGIN, 141 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 131 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 226 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_OPENINGCELL, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 236 - TOPMARGIN, 2 - BOTTOMMARGIN, 41 - END - - IDD_OPTIONS_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 274 - TOPMARGIN, 5 - BOTTOMMARGIN, 134 - END - - IDD_SVR_KEYS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_CREATEKEY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 7 - BOTTOMMARGIN, 143 - END - - IDD_SVC_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_SVR_EXECUTE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 244 - TOPMARGIN, 4 - BOTTOMMARGIN, 121 - END - - IDD_SVR_SALVAGE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 258 - TOPMARGIN, 7 - BOTTOMMARGIN, 251 - END - - IDD_SVR_SALVAGE_RESULTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 174 - END - - IDD_SET_RELEASE, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 273 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END - - IDD_SVR_HOSTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 221 - TOPMARGIN, 5 - BOTTOMMARGIN, 174 - END - - IDD_SVR_ADDHOST, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 221 - TOPMARGIN, 4 - BOTTOMMARGIN, 102 - END - - IDD_SVR_ADDRESS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 204 - TOPMARGIN, 4 - BOTTOMMARGIN, 111 - END - - IDD_SVR_NEWADDR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 65 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Server Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "Cell (&C)" - BEGIN - MENUITEM "¿ï¨ú(&S)...", M_CELL_OPEN - MENUITEM "Ų§O(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "µ²§ô(&X)", M_EXIT - END - POPUP "À˵ø(&V)" - BEGIN - POPUP "¦øªA¾¹(&S)" - BEGIN - MENUITEM "¤j¹Ï¥Ü(&G)", M_SVR_VIEW_LARGE - , CHECKED - MENUITEM "¤p¹Ï¥Ü(&M)", M_SVR_VIEW_SMALL - , CHECKED - MENUITEM "©ú²Ó(&D)", M_SVR_VIEW_REPORT - , CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_SVR_VIEW_ONEICON - , CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_SVR_VIEW_TWOICONS - , CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_SVR_VIEW_STATUS - , CHECKED - END - POPUP "§Ö³tÀ˵øµ¡®æ(&Q)" - BEGIN - MENUITEM "¤£Åã¥Ü(&N)", M_DIVIDE_NONE, CHECKED - MENUITEM "««ª½¤À³Î(&V)", M_DIVIDE_H, CHECKED - MENUITEM "¤ô¥­¤À³Î(&H)", M_DIVIDE_V, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "§@·~¶i¦æ¤¤(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "ºÊµø¤Uªº¦øªA¾¹(&M)...", M_SUBSET - MENUITEM "ª½Äæ(&C)...", M_COLUMNS - MENUITEM "¿ï¶µ(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL - END - POPUP "»¡©ú(&H)" - BEGIN - MENUITEM "¤º®e(&C)", M_HELP - MENUITEM "·j´M«ü¥O(&F)...", M_HELP_FIND - MENUITEM "¬d¾\¿ù»~½X(&L)...", M_HELP_XLATE - MENUITEM SEPARATOR - MENUITEM "Ãö©ó AFS ¦øªA¾¹ºÞ²zµ{¦¡(&A)...", M_ABOUT - END -END - -MENU_AGG MENU DISCARDABLE -BEGIN - MENUITEM "«Ø¥ß®eÅé(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "³Æ¥÷®eÅé(&B)...", M_SET_CLONE - MENUITEM "¸Ñ°£©Ò¦³®eÅ骺Âê©w(&U)", M_SET_UNLOCK - MENUITEM "¦P¨B¤Æ VLDB(&Y)...", M_SYNCVLDB - MENUITEM "´©±Ï®eÅé(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM "¤º®e(&R)", M_PROPERTIES -END - -MENU_SVC MENU DISCARDABLE -BEGIN - MENUITEM "±Ò°Ê(&S)", M_SVC_START - MENUITEM "°±¤î(&S)", M_SVC_STOP - MENUITEM "­«·s±Ò°Ê(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "À˵ø¤é»xÀÉ(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "§R°£(&L)", M_SVC_DELETE - MENUITEM SEPARATOR - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM "¤º®e(&R)", M_PROPERTIES -END - -MENU_AGG_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¤@¯ë(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "«Ø¥ß®eÅé(&C)...", M_SET_CREATE - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_SVC_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¤@¯ë(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "«Ø¥ßªA°È(&C)...", M_SVC_CREATE - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_SET MENU DISCARDABLE -BEGIN - MENUITEM "½Æ»s(&P)...", M_SET_REPLICATION - MENUITEM "¥ß§YÄÀ©ñ(&S)", M_SET_RELEASE - MENUITEM SEPARATOR - MENUITEM "³Æ¥÷(&B)...", M_SET_CLONE - MENUITEM "¶É¥X¦ÜÀÉ®×(&D)...", M_SET_DUMP - MENUITEM "¦ÛÀÉ®×´_­ì(&R)...", M_SET_RESTORE - MENUITEM "³]©w°tÃB(&Q)...", M_SET_SETQUOTA - MENUITEM "´©±Ï(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "²¾°Ê¦Ü(&M)...", M_SET_MOVETO - MENUITEM "­«·s©R¦W(&N)...", M_SET_RENAME - MENUITEM "§R°£(&L)", M_SET_DELETE - MENUITEM SEPARATOR - MENUITEM "Âê©w(&K)", M_SET_LOCK - MENUITEM "¸Ñ°£Âê©w(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM "¤º®e(&R)", M_PROPERTIES -END - -MENU_SVR MENU DISCARDABLE -BEGIN - MENUITEM "¶}±Ò¦øªA¾¹µøµ¡(&O)", M_SVR_OPEN - MENUITEM "Ãö³¬¦øªA¾¹µøµ¡(&C)", M_SVR_CLOSE - MENUITEM "ºÊµø³o­Ó¦øªA¾¹(&M)", M_SVR_MONITOR, CHECKED - MENUITEM SEPARATOR - MENUITEM "½s¿è¦øªA¾¹¦w¥þ(&S)...", M_SVR_SECURITY - MENUITEM "ºÞ²z¸ê®Æ®w¥D¹q¸£(&H)...", M_SVR_HOSTS - MENUITEM "³Æ¥÷®eÅé(&B)...", M_SET_CLONE - MENUITEM "¸Ñ°£©Ò¦³®eÅ骺Âê©w(&U)", M_SET_UNLOCK - MENUITEM "¦P¨B¤Æ VLDB (&Y)...", M_SYNCVLDB - MENUITEM "´©±Ï®eÅé(&G)...", M_SALVAGE - MENUITEM SEPARATOR - MENUITEM "¦w¸ËÀÉ®×(&I)...", M_SVR_INSTALL - MENUITEM "¸Ñ°£¦w¸ËÀÉ®×(&U)...", M_SVR_UNINSTALL - MENUITEM "§R°£ÂÂÀÉ®×(&P)...", M_SVR_PRUNE - MENUITEM SEPARATOR - MENUITEM "¨ú±oÀɮפé´Á(&T)...", M_SVR_GETDATES - MENUITEM "À˵ø¤é»xÀÉ(&V)...", M_VIEWLOG - MENUITEM "°õ¦æ«ü¥O(&X)...", M_EXECUTE - MENUITEM SEPARATOR - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM "¤º®e(&R)", M_PROPERTIES -END - -MENU_SVR_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¤j¹Ï¥Ü(&G)", M_SVR_VIEW_LARGE, CHECKED - MENUITEM "¤p¹Ï¥Ü(&M)", M_SVR_VIEW_SMALL, CHECKED - MENUITEM "©ú²Ó(&D)", M_SVR_VIEW_REPORT, CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_SVR_VIEW_ONEICON, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_SVR_VIEW_TWOICONS, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_SVR_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ºÊµø¤Uªº¦øªA¾¹(&M)...", M_SUBSET - MENUITEM SEPARATOR - MENUITEM "¸Ñ°£©Ò¦³®eÅ骺Âê©w(&U)", M_SET_UNLOCK - MENUITEM SEPARATOR - MENUITEM "¥þ³¡Ãö³¬(&C)", M_SVR_CLOSEALL - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_SET_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¨Ì®eÅé(&V)", M_SET_VIEW_REPORT, CHECKED - MENUITEM "¨Ì¤À³Î°Ï(&P)", M_SET_VIEW_TREELIST, CHECKED - MENUITEM "¨S¦³©ú²Ó(&D)", M_SET_VIEW_TREE, CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_VIEW_ONEICON, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWOICONS, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "«Ø¥ß®eÅé(&C)...", M_SET_CREATE - MENUITEM "¦ÛÀÉ®×´_­ì(&R)...", M_SET_RESTORE - MENUITEM SEPARATOR - MENUITEM "³Æ¥÷®eÅé(&B)...", M_SET_CLONE - MENUITEM SEPARATOR - MENUITEM "¥þ³¡¸Ñ°£Âê©w(&U)", M_SET_UNLOCK - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "ª½Äæ(&C)...", M_COLUMNS -END - -MENU_SVC_BOS MENU DISCARDABLE -BEGIN - MENUITEM "­«·s±Ò°Ê(&R)", M_SVC_RESTART - MENUITEM SEPARATOR - MENUITEM "À˵ø¤é»xÀÉ(&V)", M_VIEWLOG - MENUITEM SEPARATOR - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM "¤º®e(&R)", M_PROPERTIES -END - -MENU_SET_DRAGDROP MENU DISCARDABLE -BEGIN - MENUITEM "²¾¨ì¦¹³B(&M)...", M_SET_MOVEHERE - MENUITEM "½Æ»s¦¹³B(&R)...", M_SET_REPHERE - MENUITEM SEPARATOR - MENUITEM "¨ú®ø(&C)", IDC_STATIC -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SERVICES DIALOGEX 0, 0, 176, 98 -STYLE DS_CENTER | WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "ªA°È¡G",IDC_SVC_DESC,6,5,150,8 - CONTROL "",IDC_SVC_LIST,"FastList",WS_TABSTOP | 0x303,3,17,169, - 61,WS_EX_STATICEDGE - PUSHBUTTON "«Ø¥ß(&C)...",IDC_SVC_CREATE,20,83,47,12 - PUSHBUTTON "§R°£(&L)",IDC_SVC_DELETE,72,83,47,12 - PUSHBUTTON "­«·s±Ò°Ê(&R)",IDC_SVC_RESTART,125,83,47,12 -END - -IDD_AGGREGATES DIALOGEX 0, 0, 168, 87 -STYLE DS_CENTER | WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¤À³Î°Ï¡G",IDC_AGG_DESC,2,5,154,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,1,17,164, - 53,WS_EX_STATICEDGE - PUSHBUTTON "«Ø¥ß®eÅé(&C)...",IDC_AGG_CREATESET,102,75,63,12 -END - -IDD_FILESETS DIALOGEX 0, 0, 195, 96 -STYLE DS_CENTER | WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "®eÅé¡G",IDC_SET_DESC,6,5,166,8 - CONTROL "",IDC_SET_LIST,"FastList",WS_TABSTOP | 0x303,5,17,184, - 61,WS_EX_STATICEDGE - PUSHBUTTON "«Ø¥ß(&C)...",IDC_SET_CREATE,4,82,39,12 - PUSHBUTTON "§R°£(&L)",IDC_SET_DELETE,47,82,39,12 - PUSHBUTTON "½Æ»s(&R)...",IDC_SET_REP,90,82,39,12 - PUSHBUTTON "³]©w°tÃB(&Q)...",IDC_SET_SETQUOTA,134,82,55,12 -END - -IDD_SVR_LISTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_LIST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "·s¼WºÞ²z­û(&A)",IDC_LIST_ADD,55,160,80,14 - PUSHBUTTON "²¾°£ºÞ²z­û(&R)",IDC_LIST_REMOVE,141,160,80,14 - LTEXT "¦øªA¾¹ %1 ªººÞ²z­û¡G",IDC_LIST_NAME,5,7,216,8 -END - -IDD_AGG_GENERAL DIALOGEX 0, 0, 267, 160 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "ID:",IDC_STATIC,5,30,31,8 - LTEXT "¡]¬d¸ß¡^",IDC_AGG_ID,38,30,214,8 - LTEXT "¸Ë¸m¡G",IDC_STATIC,5,46,31,8 - LTEXT "¡]¬d¸ß¡^",IDC_AGG_DEVICE,38,46,214,8 - LTEXT "®eÅé¡G",IDC_STATIC,5,62,31,8 - LTEXT "¡]¬d¸ß¡^",IDC_AGG_FILESETS,38,62,214,8 - CONTROL "­Y¥[Á`ªº®eÅé°tÃB¶W¹L®e¶q¡A«hÅã¥Üĵ§i(&V)", - IDC_AGG_WARNALLOC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 38,76,224,10 - LTEXT "¥Î¶q¡G",IDC_STATIC,5,90,31,8 - LTEXT "¡]¬d¸ß¡^",IDC_AGG_USAGE,38,90,214,8 - CONTROL "",IDC_AGG_USAGEBAR,"msctls_progress32",0x0,38,103,224,8, - WS_EX_STATICEDGE - CONTROL "­Y¤À³Î°Ïªº¨Ï¥Î¹L¶q¡A«hÅã¥Üĵ§i(&W)",IDC_AGG_WARN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,38,116,214,10 - CONTROL "¥»¦øªA¾¹ªº¹w³]Á{¬É­È",IDC_AGG_WARN_AGGFULL_DEF,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,131,203,9 - CONTROL "Á{¬É­È(&T)",IDC_AGG_WARN_AGGFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,49,145,62,9 - EDITTEXT IDC_AGG_WARN_AGGFULL_PERCENT,112,143,29,12, - ES_AUTOHSCROLL - LTEXT "¦û¨ä¤j¤pªº¦Ê¤À¤ñ",IDC_AGG_WARN_AGGFULL_DESC,152,145,100, - 8 - ICON IDI_AGGREGATE,IDC_STATIC,5,5,20,20 - LTEXT "¤À³Î°Ï %2¡]¦øªA¾¹ %1¡^",IDC_AGG_NAME,38,14,214,8 -END - -IDD_SVR_GENERAL DIALOG DISCARDABLE 0, 0, 226, 188 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "IP ¦ì§} ¡G",IDC_STATIC,5,29,36,8 - LISTBOX IDC_SVR_ADDRESSES,42,29,82,14,LBS_NOSEL | NOT WS_BORDER | - WS_VSCROLL - PUSHBUTTON "Åܧó¦ì§}(&A)...",IDC_SVR_CHANGEADDR,144,27,77,12 - PUSHBUTTON "»Ý­nŲ§O(&R)",IDC_SVR_AUTH_YES,41,88,84,12 - PUSHBUTTON "¤¹³\¤£°µÅ²§O(&U)",IDC_SVR_AUTH_NO,129,88,80,12 - LTEXT "¤À³Î°Ï¼Æ¥Ø¡G",IDC_STATIC,11,131,90,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVR_NUMAGGREGATES,108,131,99,8 - LTEXT "Á`®e¶q¡G",IDC_STATIC,11,148,48,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVR_CAPACITY,108,148,99,8 - LTEXT "¥[Á`ªº®eÅé°tÃB¡G",IDC_STATIC,11,165,79,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVR_ALLOCATION,108,165,99,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "¡]¦øªA¾¹¦WºÙ¡^",IDC_SVR_NAME,55,13,93,8 - GROUPBOX "¦w¥þ©Ê",IDC_STATIC,5,52,216,52 - GROUPBOX "Àx¦sÅé",IDC_STATIC,5,115,216,68 - LTEXT "±z¥i¥H­n¨D©Ò¦³¹ï¥»¦øªA¾¹©Ò°µªº¦s¨ú³£¥²¶·¶i¦æÅ²§O¡C", - IDC_STATIC,11,67,194,17 -END - -IDD_SVR_SCOUT DIALOG DISCARDABLE 0, 0, 221, 158 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¥»¦øªA¾¹¤Wªº¥ô¦ó¤À³Î°Ï¹F¨ì",IDC_SVR_WARN_AGGFULL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,12,18,128,9 - EDITTEXT IDC_SVR_WARN_AGGFULL_PERCENT,141,16,30,12,ES_AUTOHSCROLL - LTEXT "% º¡",IDC_STATIC,190,18,21,8 - CONTROL "¥»¦øªA¾¹¤Wªº¥ô¦ó®eÅé¹F¨ì",IDC_SVR_WARN_SETFULL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,12,32,125,9 - EDITTEXT IDC_SVR_WARN_SETFULL_PERCENT,141,30,31,12,ES_AUTOHSCROLL - LTEXT "% º¡",IDC_STATIC,190,32,21,8 - CONTROL "¥ô¦ó¤À³Î°Ï¤Wªº¥[Á`°tÃB¶W¹L¨ä®e¶q",IDC_SVR_WARN_AGGALLOC, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,46,200,9 - CONTROL "°±¤î°õ¦æ¥»¦øªA¾¹¤Wªº¥ô¦óªA°È",IDC_SVR_WARN_SVCSTOP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,60,195,9 - CONTROL "¥»¦øªA¾¹ªº¥ô¦ó®eÅé³£¨S¦³ VLDB ¶µ¥Ø", - IDC_SVR_WARN_SETNOVLDB,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,74,195,9 - CONTROL "VLDB °Ñ·Ó¥»¦øªA¾¹¤Wªº¥ô¦óÂ÷½u¤À³Î°Ï", - IDC_SVR_WARN_AGGNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,88,195,9 - CONTROL "VLDB °Ñ·Ó¥»¦øªA¾¹¤Wªº¥ô¦óÂ÷½u®eÅé", - IDC_SVR_WARN_SETNOSERV,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,12,103,195,9 - CONTROL "­«·s¾ã²z¦øªA¾¹¸ê°T¡A¨C¹j",IDC_SVR_AUTOREFRESH,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,142,111,9 - EDITTEXT IDC_SVR_AUTOREFRESH_MINUTES,124,140,27,13,ES_AUTOHSCROLL - LTEXT "¤ÀÄÁ",IDC_STATIC,178,142,25,8 - LTEXT "·í¦³¤U¦C±¡ªp®É¡A·|Åã¥Üĵ§i",IDC_STATIC,5,5,195,8 -END - -IDD_SVC_GENERAL DIALOG DISCARDABLE 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - PUSHBUTTON "À˵øªA°È¤é»x(&V)",IDC_SVC_VIEWLOG,43,182,66,14 - PUSHBUTTON "¥ß§Y±Ò°Ê(&S)",IDC_SVC_START,113,182,49,14 - PUSHBUTTON "¥ß§Y°±¤î(&P)",IDC_SVC_STOP,166,182,49,14 - CONTROL "¥»ªA°È¦p°±¤î¤U¨Ó¡A«hÅã¥Üĵ§i(&W)",IDC_SVC_WARNSTOP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,159,200,10 - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "ªA°È %2¡]¦øªA¾¹ %1¡^",IDC_SVC_NAME,52,13,168,8 - LTEXT "Ãþ«¬¡G",IDC_STATIC,5,29,44,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVC_TYPE,52,29,168,8 - LTEXT "°Ñ¼Æ¡G",IDC_STATIC,5,45,44,8 - EDITTEXT IDC_SVC_PARAMS,52,45,168,13,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "³qª¾ªÌ¡G",IDC_STATIC,5,61,44,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVC_NOTIFIER,52,61,168,8 - LTEXT "¤W¦¸±Ò°Ê¡G",IDC_STATIC,5,77,44,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVC_STARTDATE,52,77,168,8 - LTEXT "¤W¦¸°±¤î¡G",IDC_STATIC,5,93,44,8 - LTEXT "¡]¬d¸ß¡^",IDC_SVC_STOPDATE,52,93,168,8 - LTEXT "¤W¦¸¥¢®Ä¡G",IDC_STATIC,5,109,44,8 - EDITTEXT IDC_SVC_LASTERROR,52,109,168,13,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - GROUPBOX "ªA°Èª¬ºA",IDC_STATIC,5,127,215,75 - LTEXT "¥¿¦b§PÂ_¥»ªA°È¥Ø«eªºª¬ªp...",IDC_SVC_STATUS,11,142,200, - 8 -END - -IDD_SET_GENERAL DIALOGEX 0, 0, 273, 214 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "®eÅé ID¡G",IDC_STATIC,5,30,39,8 - LTEXT "¡]¤£©ú¡^",IDC_SET_ID,48,30,168,8 - LTEXT "«Ø¥ß¤é´Á¡G",IDC_STATIC,5,46,42,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_CREATEDATE,48,46,167,8 - LTEXT "§ó·s¤é´Á¡G",IDC_STATIC,5,62,41,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_UPDATEDATE,48,62,112,8 - LTEXT "¦s¨ú¤é´Á¡G",IDC_STATIC,5,78,41,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_ACCESSDATE,48,78,167,8 - LTEXT "³Æ¥÷¤é´Á¡G",IDC_STATIC,5,94,40,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_BACKUPDATE,48,94,181,8 - LTEXT "Àɮ׭ӼơG",IDC_STATIC,5,110,42,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_FILES,48,110,179,8 - LTEXT "ª¬ºA¡G",IDC_STATIC,5,126,32,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_STATUS,48,126,62,8 - PUSHBUTTON "Âê©w(&L)",IDC_SET_LOCK,150,124,55,12 - PUSHBUTTON "¸Ñ°£Âê©w(&U)",IDC_SET_UNLOCK,213,124,55,12 - LTEXT "¥Î¶q¡G",IDC_STATIC,5,142,31,8 - LTEXT "¡]¬d¸ß¡^",IDC_SET_USAGE,48,142,109,8 - PUSHBUTTON "³]©w°tÃB(&Q)...",IDC_SET_QUOTA,213,140,55,12 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,49,156,219,8, - WS_EX_STATICEDGE - CONTROL "¦pªG¦¹®eÅ骺¥Î¶q¶W¹L¤U¦C±¡§Î¡A«h·|Åã¥Üĵ§i(&W)", - IDC_SET_WARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,49, - 170,219,10 - CONTROL "¥»¦øªA¾¹ªº¹w³]Á{¬É­È¡]¨ä¤j¤pªº %1%%¡^(&D)", - IDC_SET_WARN_SETFULL_DEF,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,61,185,207,9 - CONTROL "¨ä¤j¤pªº",IDC_SET_WARN_SETFULL,"Button", - BS_AUTORADIOBUTTON | BS_MULTILINE,61,199,62,9 - EDITTEXT IDC_SET_WARN_SETFULL_PERCENT,123,197,29,12, - ES_AUTOHSCROLL - LTEXT " % Á{¬É­È(&T)",IDC_SET_WARN_SETFULL_DESC,163,199,105,8 - ICON IDI_FILESET,IDC_STATIC,5,5,20,20 - LTEXT "®eÅé %3¡]¦øªA¾¹ %1¡A¤À³Î°Ï %2¡^",IDC_SET_NAME,49,14,219, - 8 -END - -IDD_MAIN DIALOGEX 0, 0, 317, 226 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ¦øªA¾¹ºÞ²zµ{¦¡" -MENU MENU_MAIN -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¤w¿ï¨úªº Cell¡G",IDC_STATIC,2,8,67,8 - LTEXT "¡]±N·|§â Cell ¦WºÙ©ñ¦b¦¹³B¡^",IDC_CELL,62,8,208,9 - LTEXT "AFS °O¸¹¡G",IDC_STATIC,2,19,55,8 - LTEXT "%2:%1¡]°O¸¹±N¹L´Á %3¡^",IDC_AFS_ID,62,19,208,9 - CONTROL "",IDC_SERVERS,"FastList",WS_TABSTOP | 0x301,2,31,313, - 193,WS_EX_CLIENTEDGE - CONTROL "",IDC_CELL_BORDER,"Static",SS_ETCHEDHORZ,1,2,315,1 - ICON IDI_MAIN,IDC_ANIMATE,292,7,20,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_SERVER DIALOG DISCARDABLE 0, 0, 209, 137 -STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "¦øªA¾¹" -CLASS "ServerWindowClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,2,2,205,133 -END - -IDD_SVC_CREATE DIALOGEX 0, 0, 225, 233 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,5,36,44,8 - COMBOBOX IDC_SVC_SERVER,52,33,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "ªA°È(&V)¡G",IDC_STATIC,5,52,44,8 - COMBOBOX IDC_SVC_NAME,52,50,116,104,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "«ü¥O(&C)¡G",IDC_STATIC,5,70,44,8 - EDITTEXT IDC_SVC_COMMAND,52,68,168,13,ES_AUTOHSCROLL - LTEXT "°Ñ¼Æ(&P)¡G",IDC_STATIC,5,88,44,8 - EDITTEXT IDC_SVC_PARAMS,52,86,168,13,ES_AUTOHSCROLL - LTEXT "³qª¾ªÌ(&N)¡G",IDC_STATIC,5,105,44,8 - EDITTEXT IDC_SVC_NOTIFIER,52,103,168,13,ES_AUTOHSCROLL - LTEXT "¤é»xÀÉ(&L)¡G",IDC_STATIC,5,122,44,8 - EDITTEXT IDC_SVC_LOGFILE,52,120,168,13,ES_AUTOHSCROLL - CONTROL "²¦¡¡]«ùÄò°õ¦æ¡^(&I) ",IDC_SVC_TYPE_SIMPLE,"Button", - BS_AUTORADIOBUTTON,11,154,201,10 - CONTROL "¥ß§Y±Ò°Ê¥»ªA°È(&T)",IDC_SVC_RUNNOW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,166,183,10 - CONTROL "FS¡]Àɮרt²Î¡^(&F) ",IDC_SVC_TYPE_FS,"Button", - BS_AUTORADIOBUTTON,11,180,201,10 - CONTROL "Cron¡]¦b«ü©w¶¡¹j°õ¦æ¡^(&R) ",IDC_SVC_TYPE_CRON,"Button", - BS_AUTORADIOBUTTON,11,195,201,10 - LTEXT "°õ¦æ¤é´Á(&W)¡G",IDC_STATIC,12,209,54,8 - COMBOBOX IDC_SVC_RUNDAY,70,207,69,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "®É¶¡",IDC_STATIC,143,209,8,8 - CONTROL "",IDC_SVC_RUNTIME,"Time",WS_BORDER | WS_TABSTOP,154,207, - 53,13,WS_EX_CLIENTEDGE - ICON IDI_SERVICE,IDC_STATIC,5,5,20,20 - LTEXT "·sªºªA°È",IDC_SVC_DESC,52,13,168,8 - GROUPBOX "ªA°ÈÃþ«¬",IDC_STATIC,5,141,215,87 -END - -IDD_SET_REPSITES DIALOGEX 0, 0, 221, 168 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_SET_REP_LIST,"FastList",WS_TABSTOP | 0x303,11,80, - 199,58,WS_EX_CLIENTEDGE - PUSHBUTTON "¥ß§YÄÀ©ñ(&R)",IDC_SET_RELEASE,11,143,52,14 - PUSHBUTTON "«Ø¥ß(&C)...",IDC_SET_REPSITE_ADD,129,143,38,14 - PUSHBUTTON "§R°£(&L)",IDC_SET_REPSITE_DELETE,172,143,38,14 - LTEXT "¦øªA¾¹¡G",-1,11,31,37,8 - LTEXT "¡]¦øªA¾¹¦WºÙ¡^",IDC_SET_SERVER,55,31,147,8 - LTEXT "¤À³Î°Ï¡G",-1,11,44,37,8 - LTEXT "¡]¤À³Î°Ï¦WºÙ¡^",IDC_SET_AGGREGATE,55,44,147,8 - LTEXT "®eÅé¡G",-1,11,18,37,8 - LTEXT "¡]®eÅé¦WºÙ¡^",IDC_SET_NAME,55,18,147,8 - GROUPBOX "Ū¨ú / ¼g¤J®eÅé",-1,5,5,211,56 - GROUPBOX "®eÅ齯¥»",-1,5,67,211,96 -END - -IDD_OPENCELL DIALOG DISCARDABLE 0, 0, 219, 257 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¿ï¨ú Cell - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "Cell (&C)¡G",IDC_STATIC,4,24,43,8 - COMBOBOX IDC_OPENCELL_CELL,53,22,162,143,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "AFS Ų§O",IDC_STATIC,4,44,211,92 - LTEXT "AFS ¨­¥÷(&I)¡G",IDC_STATIC,22,100,64,8 - EDITTEXT IDC_OPENCELL_ID,88,98,121,14,ES_AUTOHSCROLL - LTEXT "AFS ±K½X(&P)¡G",IDC_STATIC,22,116,55,8 - EDITTEXT IDC_OPENCELL_PASSWORD,88,114,121,14,ES_PASSWORD | - ES_AUTOHSCROLL - PUSHBUTTON "¶i¶¥(&V) >>",IDC_ADVANCED,4,146,53,14 - DEFPUSHBUTTON "½T©w",IDOK,68,146,41,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,120,146,41,14 - PUSHBUTTON "»¡©ú(&H)",9,172,146,41,14 - CONTROL "ºÊµø³o­Ó Cell ¤¤ªº©Ò¦³¦øªA¾¹(&L)",IDC_MON_ALL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,204,185,9 - CONTROL "¥uºÊµø¤@­Ó¦øªA¾¹(&M)¡G",IDC_MON_ONE,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,219,110,10 - EDITTEXT IDC_MON_SERVER,125,218,83,13,ES_AUTOHSCROLL - CONTROL "¥uºÊµø¤l¶°¤¤ªº¦øªA¾¹(&S)¡G",IDC_MON_SOME,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,10,235,110,10 - COMBOBOX IDC_MON_SUBSET,125,233,83,93,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¿ï¨ú±z­n§@·~ªº AFS Cell",IDC_STATIC,4,7,200,8 - GROUPBOX "ºÊµø¦øªA¾¹",IDC_ADVANCED_GROUP,4,169,211,84 - LTEXT "¦p­n´£°ª°õ¦æ®Ä¯à¡A±z¥i¥H¿ï¾Ü¥uºÊµø³o­Ó Cell ¤§¦øªA¾¹¤l¶°¡C", - IDC_STATIC,10,182,199,17 - LTEXT "¡]¬d¸ß...¡^",IDC_OPENCELL_OLDCREDS,22,70,185,8 - LTEXT "¦p­nºÞ²z Cell¡A±z¥²¶·­«·s¿é¤J±zªº AFS ±K½X¡G", - IDC_STATIC,10,85,196,8 - LTEXT "±z¥Ø«e¦b©Ò¿ï¨ú¤§ Cell ¤¤ªº AFS °O¸¹¡G",IDC_STATIC,10,57, - 196,8 -END - -IDD_TIMEOUT DIALOG DISCARDABLE 0, 0, 236, 157 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ĵ§i - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "Ä~Äòµ¥­Ô¡Aª½¨ì§@·~¥¿±`§¹¦¨¬°¤î(&C)",IDC_TIMEOUT_WAIT, - "Button",BS_AUTORADIOBUTTON,24,87,208,10 - CONTROL "²×¤î§@·~(&T)",IDC_TIMEOUT_KILL,"Button", - BS_AUTORADIOBUTTON,24,101,208,10 - DEFPUSHBUTTON "½T©w",IDOK,93,139,50,14 - LTEXT "°õ¦æ§@·~©Ò¸g¾úªº®É¶¡¡G",IDC_STATIC,4,119,89,8 - LTEXT "88:88:88",IDC_TIMEOUT_ELAPSED,95,119,40,8 - LTEXT "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµ¥­Ôºô¸ô§@·~§¹¦¨ªº®É¶¡¹Lªø¡C", - IDC_STATIC,4,7,228,18 - LTEXT "±z¥i¥HÅý§@·~Ä~Äò°õ¦æ¡]«ØÄ³¡^¡A©ÎªÌ¦pªG§A½T©w§@·~¥Ã»·³£¤£·|§¹¦¨¡A«h¥i¥HÅý¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v²×¤î§@·~¡C", - IDC_STATIC,4,30,228,26 - LTEXT "½Ðª`·N¡A§Y¨Ï³o­Óµøµ¡Åã¥Ü¥X¨Ó¡A§@·~¤´Ä~Äò¶i¦æ¡F§@·~§¹¦¨®É¡A³o­Óµøµ¡·|¦Û°ÊÃö³¬¡C", - IDC_STATIC,4,63,228,17 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "ª½Äæ" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¿ï¨ú¦C¥Ü®É©Ò­nÅã¥Üªºª½Äæ(&S)¡G",IDC_STATIC,5,7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¥i¥Îªºª½Äæ(&C)¡G",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Åã¥Üªºª½Äæ(&I)¡G",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "·s¼W(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< ²¾°£(&R)",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "¦V¤W²¾°Ê(&U)",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "¦V¤U²¾°Ê(&D)",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "¦C¥Xª½Äæ",IDC_STATIC,5,25,276,118 -END - -IDD_REFRESHALL DIALOG DISCARDABLE 0, 0, 264, 72 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "­«·s¾ã²z - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "",IDC_REFRESH_PERCENTBAR,"msctls_progress32",0x0,4,37, - 256,8 - LTEXT "§¹¦¨ 0%%",IDC_REFRESH_PERCENT,4,49,216,8 - LTEXT "",IDC_REFRESH_CURRENT,4,60,216,8 - LTEXT "½Ðµy­Ô...",IDC_REFRESH_DESC,4,7,256,25 - PUSHBUTTON "²¤¹L(&S)",IDC_REFRESH_SKIP,222,58,38,12,NOT WS_TABSTOP -END - -IDD_SET_CREATE DIALOGEX 0, 0, 321, 209 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "«Ø¥ß®eÅé" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¦WºÙ(&N)¡G",IDC_STATIC,4,30,39,8 - EDITTEXT IDC_SET_NAME,51,28,116,14,ES_AUTOHSCROLL - LTEXT "°tÃB(&Q)¡G",IDC_STATIC,4,48,39,8 - EDITTEXT IDC_SET_QUOTA,51,46,32,14,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,95,47,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "³Æ¥÷(&B)¡G",IDC_STATIC,4,66,39,8 - CONTROL "¦P®É«Ø¥ß¥»®eÅ骺³Æ¥÷ª©¥»(&R)",IDC_SET_CLONE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,51,66,162,8 - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,4,84,45,8 - COMBOBOX IDC_SET_SERVER,52,82,115,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¤À³Î°Ï(&P)¡G",IDC_STATIC,4,102,45,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,51,102,266, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "½T©w",IDOK,156,191,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,211,191,50,14 - PUSHBUTTON "»¡©ú(&H)",9,267,191,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "·sªº®eÅé",IDC_STATIC,46,12,170,8 -END - -IDD_SET_DELETE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "§R°£®eÅé" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "¨ú®ø",IDCANCEL,169,84,50,14 - PUSHBUTTON "½T©w",IDOK,115,84,50,14 - PUSHBUTTON "»¡©ú(&H)",9,223,84,50,14 - CONTROL "±N®eÅé %3 ±q¦øªA¾¹ %1¡A¤À³Î°Ï %2 §R°£(&D)", - IDC_DELSET_SERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 46,45,227,10 - CONTROL "§R°£®eÅé %3 ªº &VLDB ¶µ (&V)",IDC_DELSET_VLDB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,46,60,227,10 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "ĵ§i¡I\n\n³o¶µ§@·~±N³y¦¨®eÅé %3 ¥Ã¤[³Q§R°£¡C", - IDC_DELSET_DESC,31,7,242,33 -END - -IDD_SET_CLONE DIALOG DISCARDABLE 0, 0, 345, 85 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "³Æ¥÷®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,183,67,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,237,67,50,14 - PUSHBUTTON "»¡©ú(&H)",9,291,67,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "®eÅ鳯¥÷¬O¸Ó®eÅ骺°ßŪ°Æ¥»¡F¤@­ÓŪ¨ú / ¼g¤J®eÅé¥u¯à¾Ö¦³¤@­Ó³Æ¥÷ª©¥»¡C", - IDC_STATIC,34,9,307,17 - LTEXT "«ö¤@¤U¡u½T©w¡v¥H¦b¦øªA¾¹ %1¡A¤À³Î°Ï %2 ¤W«Ø¥ß %3 ®eÅ鳯¥÷¡C­Y¬O¥»®eÅ骺³Æ¥÷¤w¸g¦s¦b¡A«h·|§ó·s³Æ¥÷¡C", - IDC_CLONE_DESC,34,32,307,24 -END - -IDD_SVC_PROBLEMS DIALOG DISCARDABLE 0, 0, 225, 194 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¤wª¾ªº°ÝÃD",IDC_PROBLEM_BOX,5,36,215,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,174,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,203,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,138,120,61,12 - ICON IDI_SERVICE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "ªA°È %2¡]¦øªA¾¹ %1¡^",IDC_PROBLEM_TITLE,52,13,168,8 -END - -IDD_SVR_PROBLEMS DIALOG DISCARDABLE 0, 0, 226, 157 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¤wª¾ªº°ÝÃD",IDC_PROBLEM_BOX,5,36,216,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,49,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,49,172,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,201,49,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,136,120,61,12 - ICON IDI_SERVER_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "%1",IDC_PROBLEM_TITLE,42,13,179,8 -END - -IDD_AGG_PROBLEMS DIALOG DISCARDABLE 0, 0, 257, 151 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¤wª¾ªº°ÝÃD",IDC_PROBLEM_BOX,5,35,247,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,206,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,235,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,170,119,61,12 - ICON IDI_AGGREGATE_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "¤À³Î°Ï %2¡]¦øªA¾¹ %1¡^",IDC_PROBLEM_TITLE,38,14,214,8 -END - -IDD_SET_PROBLEMS DIALOG DISCARDABLE 0, 0, 273, 182 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¤wª¾ªº°ÝÃD",IDC_PROBLEM_BOX,5,35,263,102 - LTEXT "99:",IDC_PROBLEM_HEADER,11,48,11,8 - LTEXT "A\nB\nC\nD\nA\nB\nC\nD",IDC_PROBLEM_TEXT,25,48,220,66, - SS_SUNKEN - SCROLLBAR IDC_PROBLEM_SCROLL,249,48,10,83,SBS_VERT - PUSHBUTTON "Button1",IDC_PROBLEM_REMEDY,184,119,61,12 - ICON IDI_FILESET_ALERT,IDC_STATIC,5,5,20,20 - LTEXT "®eÅé %3¡]¦øªA¾¹ %1¡A¤À³Î°Ï %2¡^",IDC_PROBLEM_TITLE,49, - 14,219,8 -END - -IDD_SET_MOVETO DIALOGEX 0, 0, 277, 174 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "²¾°Ê®eÅé" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_MOVESET_SERVER,4,54,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,70,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "½T©w",IDOK,115,156,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,169,156,50,14 - PUSHBUTTON "»¡©ú(&H)",9,223,156,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "A\nB\nC",IDC_MOVESET_DESC,31,4,242,24 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,35,269,1 - LTEXT "²¾°Ê®eÅé¦Ü(&M)¡G",IDC_STATIC,4,43,116,8 -END - -IDD_SET_MOVING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "²¾°Ê®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "±N®eÅé %3 ±q¦øªA¾¹ %1 ¤W¤À³Î°Ï %2 ²¾°Ê¦Ü¦øªA¾¹ %4 ¤W¤À³Î°Ï %5...", - IDC_MOVESET_DESC,4,41,229,19 -END - -IDD_SVC_LOGNAME DIALOG DISCARDABLE 0, 0, 277, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "À˵ø¤é»xÀÉ" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "À˵ø¦øªA¾¹¤Wªº¤é»xÀÉ(&S)¡G",IDC_STATIC,4,45,103,8 - COMBOBOX IDC_VIEWLOG_SERVER,111,43,126,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦øªA¾¹¤W©Ò­nÀ˵øªºÀÉ®×(&F)¡G",IDC_STATIC,4,64,107,8 - EDITTEXT IDC_VIEWLOG_FILENAME,111,62,158,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,169,88,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,223,88,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,4,20,20 - LTEXT "½Ð¿é¤J±z­nÀ˵ø¤§¤é»xÀɪº§¹¾ã¸ô®|¦WºÙ¡C", - IDC_VIEWLOG_DESC,31,10,242,21 -END - -IDD_SVC_VIEWLOG DIALOG DISCARDABLE 0, 0, 286, 185 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "À˵ø¤é»xÀÉ" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "Àɮפº®e¡G",IDC_SVC_VIEWLOG_CONTENTS,4,41,277,8 - EDITTEXT IDC_VIEWLOG_TEXT,4,51,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "¥t¦s·sÀÉ(&A)...",IDC_VIEWLOG_SAVEAS,173,167,53,14 - DEFPUSHBUTTON "Ãö³¬(&C)",IDOK,231,167,50,14 - ICON IDI_SERVICE,-1,4,7,20,20 - LTEXT "¦øªA¾¹ %1 ¤Wªº¤é»xÀÉ [ªA°È %2]",IDC_SVC_VIEWLOG_DESC,33, - 7,248,8 - LTEXT "¦øªA¾¹¤WªºÀɮצWºÙ¡G %1",IDC_SVC_VIEWLOG_FILENAME,33,23, - 248,8 -END - -IDD_SET_SETQUOTA DIALOGEX 0, 0, 271, 130 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "³]©w®eÅé°tÃB" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¥Ø«eªº°tÃB¡G",IDC_STATIC,4,49,57,8 - LTEXT "¡]¤£©ú¡^",IDC_SET_USAGE,59,49,208,8 - CONTROL "",IDC_SET_USAGEBAR,"msctls_progress32",0x0,59,60,208,8, - WS_EX_STATICEDGE - LTEXT "·sªº°tÃB(&Q)¡G",IDC_STATIC,4,81,52,8 - EDITTEXT IDC_SET_QUOTA,59,79,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_SET_QUOTA_UNITS,103,79,30,44,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "½T©w",IDOK,109,112,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,163,112,50,14 - PUSHBUTTON "»¡©ú(&H)",9,217,112,50,14 - PUSHBUTTON "¤º®e(&P)...",IDC_AGG_PROPERTIES,212,28,55,12 - LTEXT "¤À³Î°Ï¡G",IDC_STATIC,4,30,47,8 - LTEXT "¦øªA¾¹ %1 ªº¤À³Î°Ï %2",IDC_SET_AGGREGATE,59,30,141,8 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "®eÅé %1",IDC_SET_NAME,59,11,208,8 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "¶i¦æ¤¤ªº§@·~ - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¥Ø«e¥¿¦b¶i¦æ¥H¤Uªº§@·~¡G",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_SVR_SYNCVLDB DIALOG DISCARDABLE 0, 0, 269, 99 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¦P¨B VLDB" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,107,81,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,161,81,50,14 - PUSHBUTTON "»¡©ú(&H)",9,215,81,50,14 - ICON 32515,IDC_STATIC,4,4,21,20 - LTEXT "¡]©ó°õ¦æ´Á¶¡®É³]©w¡^",IDC_SYNC_DESC,37,4,228,32 - LTEXT "¡]©ó°õ¦æ´Á¶¡®É³]©w¡^",IDC_SYNC_DESC2,37,44,228,24 -END - -IDD_SET_CREATEREP DIALOGEX 0, 0, 277, 171 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "½Æ»s®eÅé" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_SET_SERVER,4,46,116,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,4,62,269, - 75,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "½T©w",IDOK,115,153,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,169,153,50,14 - PUSHBUTTON "»¡©ú(&H)",9,223,153,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,21,20 - LTEXT "®eÅé %3 ·sªº½Æ¥»",IDC_SET_NAME,31,12,242,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,27,268,1 - LTEXT "«Ø¥ß¦¹®eÅ骺·s½Æ¥»©ó(&C)¡G",IDC_STATIC,4,35,125,8 -END - -IDD_SVR_INSTALL DIALOG DISCARDABLE 0, 0, 248, 156 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¦w¸ËÀÉ®×" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¨Ó·½ÀÉ(&F)¡G",IDC_STATIC,4,74,49,8 - EDITTEXT IDC_FILENAME,64,72,127,14,ES_AUTOHSCROLL - PUSHBUTTON "ÂsÄý(&B)...",IDC_BROWSE,194,72,50,14 - LTEXT "¥Ø¼Ð¦øªA¾¹(&S)¡G",IDC_STATIC,4,94,59,8 - COMBOBOX IDC_SERVER,64,92,83,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¥Ø¼Ð¦WºÙ(&N)¡G",IDC_STATIC,4,114,55,8 - EDITTEXT IDC_DIRECTORY,64,112,127,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,86,138,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,140,138,50,14 - PUSHBUTTON "»¡©ú(&H)",9,194,138,50,14 - ICON IDI_INSTALL,IDC_STATIC,4,4,20,20 - LTEXT "¦b¦øªA¾¹¤W¦w¸ËÀÉ®×",IDC_STATIC,32,12,127,8 - LTEXT "¡]°õ¦æ´Á¶¡³]©wªº¤å¦r¡^\n¡]°õ¦æ´Á¶¡³]©wªº¤å¦r¡^\n¡]°õ¦æ´Á¶¡³]©wªº¤å¦r¡^\n¡]°õ¦æ´Á¶¡³]©wªº¤å¦r¡^", - IDC_INSTALL_DESC,4,29,240,33 -END - -IDD_SVR_UNINSTALL DIALOG DISCARDABLE 0, 0, 248, 139 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¸Ñ°£¦w¸ËÀÉ®×" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,4,66,46,8 - COMBOBOX IDC_SERVER,55,64,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¥Ø¼ÐÀÉ®×(&F)¡G",IDC_STATIC,4,85,50,8 - EDITTEXT IDC_FILENAME,55,83,161,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,88,121,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,141,121,50,14 - PUSHBUTTON "»¡©ú(&H)",9,194,121,50,14 - ICON IDI_UNINSTALL,IDC_STATIC,4,4,20,20 - LTEXT "±q¦øªA¾¹¸Ñ°£¦w¸ËÀÉ®×",IDC_STATIC,32,12,127,8 - LTEXT "³o¶µ§@·~Åý±z±N¥ý«e¤w¦w¸ËªºÀÉ®×°Æ¥»¡A´_­ì¨ì¯S©wªº¦øªA¾¹¡C¦pªG¿ï©wªºÀɮפ£¨ã¦³¥ý«e¦w¸ËªºÀÉ®×°Æ¥»¡A«hÀÉ®×·|³Q²¾°£¡C", - IDC_STATIC,4,29,240,26 -END - -IDD_SVR_PRUNE DIALOG DISCARDABLE 0, 0, 224, 141 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "§R°£ÂÂÀÉ®×" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹¡G",-1,4,56,44,8 - COMBOBOX IDC_SERVER,53,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "§R°£©Ò¦³®Ö¤ßÀÉ(&C)",IDC_OP_DELETE_CORE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,67,73,134,10 - CONTROL "§R°£©Ò¦³ .&BAK ÀÉ¡]Àɮ׳ƥ÷¡^",IDC_OP_DELETE_BAK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,67,84,137,10 - CONTROL "§R°£©Ò¦³ .&OLD ÀÉ¡]ÂÂÀɮ׳ƥ÷¡^",IDC_OP_DELETE_OLD, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,67,95,143,10 - DEFPUSHBUTTON "½T©w",IDOK,48,123,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,109,123,50,14 - PUSHBUTTON "»¡©ú(&H)",9,170,123,50,14 - ICON IDI_PRUNE,-1,4,4,21,21 - LTEXT "±NÂÂÀÉ®×±q¦øªA¾¹¤W§R°£",-1,32,12,101,8 - LTEXT "³o¶µ§@·~·|§R°£¦w¸Ë©ó¯S©w¦øªA¾¹ªºÀɮ׳ƥ÷°Æ¥»¡C",-1,4,29, - 216,16 - LTEXT "­n§R°£ªºÀɮסG",-1,4,73,60,8 -END - -IDD_SET_RENAME DIALOG DISCARDABLE 0, 0, 277, 133 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "Åܧó®eÅé¦WºÙ" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "ªº¦WºÙ(&O)¡G",IDC_STATIC,31,67,55,8 - EDITTEXT IDC_RENSET_OLD,86,65,122,14,ES_AUTOHSCROLL | ES_READONLY - LTEXT "·sªº¦WºÙ(&N)¡G",IDC_STATIC,31,85,51,8 - EDITTEXT IDC_RENSET_NEW,86,83,122,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,108,115,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,162,115,50,14 - PUSHBUTTON "»¡©ú",9,216,115,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "¦p­n­«·s©R¦W®eÅé %3 ¡A½Ð¦b¤U¤è¿é¤J·sªº¦WºÙ¡C­«·s©R¦W«á¡A®eÅ骺³Æ¥÷¤Î¨ä©Ò¦³½Æ¥»·|¦Û°Ê§ïÅܦWºÙ¡C\n\nĵ§i¡G¦pªG±z¬°¤w¸Ë¸üªº®eÅé­«·s©R¦W¡A±z¥²¶·§R°£¨Ã­«·s«Ø¥ß¨ä¸Ë¸üÂI¡C", - IDC_RENSET_DESC,31,7,235,48 -END - -IDD_SVC_DELETE DIALOG DISCARDABLE 0, 0, 277, 68 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "§R°£ªA°È" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "¨ú®ø",IDCANCEL,169,50,50,14 - PUSHBUTTON "½T©w",IDOK,115,50,50,14 - PUSHBUTTON "»¡©ú",9,223,50,50,14 - ICON 32515,IDC_STATIC,4,7,20,20 - LTEXT "ĵ§i¡I\n\n³o¶µ§@·~·|¾É­PªA°È %2 °±¤î¡A¨Ã±q¦øªA¾¹ %1 ¥[¥H§R°£¡C", - IDC_DELSVC_DESC,31,7,242,33 -END - -IDD_SVR_GETDATES DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¨ú±oÀɮפé´Á" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹(&S)¡G",-1,4,56,42,8 - COMBOBOX IDC_SERVER,70,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "­n¬d¸ßªºÀÉ®×(&F)¡G",-1,4,75,66,8 - EDITTEXT IDC_FILENAME,70,73,132,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,86,107,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,140,107,50,14 - PUSHBUTTON "»¡©ú(&H)",9,194,107,50,14 - ICON IDI_GETDATES,-1,4,4,20,20 - LTEXT "¨ú±o¦b¦øªA¾¹¤WªºÀɮפé´Á",-1,32,12,127,8 - LTEXT "³o¶µ§@·~·|¨ú±oÀÉ®×¤Î¨ä³Æ¥÷¡]¦pªG¦³ªº¸Ü¡^¤W¦¸­×§ïªº¤é´Á¡C", - -1,4,29,240,16 -END - -IDD_SVR_GETDATES_RESULTS DIALOG DISCARDABLE 0, 0, 248, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¨ú±oÀɮפé´Á - µ²ªG" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹¡G",IDC_STATIC,4,30,39,8 - LTEXT "¡]©ó°õ¦æ´Á¶¡®É³]©w¡^",IDC_SERVER,48,30,137,8 - LTEXT "ÀɮצWºÙ¡G",IDC_STATIC,4,45,43,8 - LTEXT "¡]©ó°õ¦æ´Á¶¡®É³]©w¡^",IDC_FILENAME,48,45,137,8 - LTEXT "Àɮפé´Á¡G",IDC_STATIC,4,60,44,8 - LTEXT "¡]¤£©ú¡F§ä¤£¨ìÀɮס^",IDC_DATE_FILE,48,60,174,8 - LTEXT ".BAK ¤é´Á¡G",IDC_STATIC,4,75,45,8 - LTEXT "¡]¤£©ú¡F§ä¤£¨ìÀɮס^",IDC_DATE_BAK,48,75,167,8 - LTEXT ".OLD ¤é´Á¡G",IDC_STATIC,4,90,45,8 - LTEXT "¡]¤£©ú¡F§ä¤£¨ìÀɮס^",IDC_DATE_OLD,48,90,164,8 - DEFPUSHBUTTON "Ãö³¬(&C)",IDOK,99,114,50,14 - ICON IDI_GETDATES,IDC_STATIC,4,4,20,20 - LTEXT "¨ú±o¦b¦øªA¾¹¤WÀɮתº¤é´Á",IDC_STATIC,32,12,127,8 -END - -IDD_SET_DUMP DIALOGEX 0, 0, 295, 144 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¶É¥X®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "«Ø¥ß¶É¥XÀɮצW¬°(&N)¡G",IDC_STATIC,4,42,86,8 - EDITTEXT IDC_DUMP_FILENAME,96,40,141,14,ES_AUTOHSCROLL - PUSHBUTTON "ÂsÄý(&B)...",IDC_DUMP_BROWSE,241,40,50,14 - CONTROL "¶É¥X®eÅé %3 ªº¾ã­Ó¤º®e(&E)¡]¤À³Î°Ï %1:%2¡^", - IDC_DUMP_FULL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,10, - 78,274,10 - CONTROL "¥u¶É¥X¤wÅܧóªºÀɮסAÅܧó®É¶¡¬°(&S)",IDC_DUMP_LIMIT_TIME, - "Button",BS_AUTORADIOBUTTON,10,94,144,10 - CONTROL "",IDC_DUMP_TIME,"Time",WS_BORDER | WS_TABSTOP,160,93,51, - 13,WS_EX_CLIENTEDGE - CONTROL "",IDC_DUMP_DATE,"Date",WS_BORDER | WS_TABSTOP,218,93,56, - 13,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "½T©w",IDOK,131,126,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,185,126,50,14 - PUSHBUTTON "»¡©ú(&H)",9,241,126,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "³o¶µ§@·~±N®eÅ餺®e½Æ»s¨ì³æ¤@ÀɮפW¡A³o»ò¤@¨Ó¡A®eÅé´N¯à»´ÃP³Æ¥÷¡C¥H³oºØ¤è¦¡¶É¥Xªº®eÅ餺®e¥i¥H¦bµy«á¥[¥H´_­ì¡C", - IDC_STATIC,30,7,261,24 - GROUPBOX "¶É¥X°Ñ¼Æ",IDC_STATIC,4,62,287,53 -END - -IDD_SET_RESTORE DIALOGEX 0, 0, 292, 248 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "´_­ì®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "­n´_­ìªºÀÉ®×(&R)¡G",IDC_STATIC,4,33,68,8 - EDITTEXT IDC_RESTORE_FILENAME,74,30,158,14,ES_AUTOHSCROLL - PUSHBUTTON "ÂsÄý(&B)...",IDC_RESTORE_BROWSE,238,30,50,14 - CONTROL "³o¬O»¼¼W¦¡¶É¥XÀÉ®×(&I)",IDC_RESTORE_INCREMENTAL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,74,46,114,10 - LTEXT "®eÅé(&V)¡G",IDC_STATIC,11,102,41,8 - EDITTEXT IDC_RESTORE_SETNAME,54,100,115,14,ES_AUTOHSCROLL - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,11,145,43,8 - COMBOBOX IDC_RESTORE_SERVER,55,143,116,104,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¤À³Î°Ï(&P)¡G",IDC_STATIC,11,162,44,8 - CONTROL "",IDC_AGG_LIST,"FastList",WS_TABSTOP | 0x303,56,161,225, - 55,WS_EX_CLIENTEDGE - DEFPUSHBUTTON "½T©w",IDOK,128,230,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,183,230,50,14 - PUSHBUTTON "»¡©ú(&H)",9,238,230,50,14 - ICON IDI_FILESET,IDC_STATIC,4,4,20,20 - LTEXT "±q¶É¥XÀÉ®×´_­ì®eÅé",IDC_STATIC,33,11,224,8 - GROUPBOX "¥Ø¼Ð®eÅé",IDC_STATIC,4,63,284,160 - LTEXT "·í±z±q¶É¥XÀÉ®×´_­ì®eÅé®É¡A±z¥i¥H«Ø¥ß·sªº®eÅé©Î¬O§ï¼g²{¦³ªºÅª¨ú / ¼g¤J®eÅé¡C", - IDC_STATIC,11,78,259,16 - LTEXT "¡]©ó°õ¦æ´Á¶¡³]©w¡^\n¡]©ó°õ¦æ´Á¶¡³]©w¡^", - IDC_RESTORE_CREATE,51,119,229,17 -END - -IDD_SVC_BOS DIALOGEX 0, 0, 225, 207 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - CONTROL "©w´Á°±¤î¨Ã­«·s±Ò°Ê¦¹¦øªA¾¹¤Wªº©Ò¦³ªA°È(&P)", - IDC_BOS_GENRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 71,193,10 - LTEXT "­«·s±Ò°Ê(&R)",IDC_BOS_GENRES_DESC1,12,87,45,8 - COMBOBOX IDC_BOS_GENRES_DATE,58,84,65,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "¦b(&A)",IDC_BOS_GENRES_DESC2,127,87,8,8 - CONTROL "",IDC_BOS_GENRES_TIME,"Time",WS_BORDER | WS_TABSTOP,138, - 84,53,13,WS_EX_CLIENTEDGE - CONTROL "©w´Á´ú¸Õ¥»¦øªA¾¹¤W·s¤G¶i¦ìÀɪº©Ò¦³ªA°È (&B)", - IDC_BOS_BINRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11, - 151,201,10 - LTEXT "´ú¸Õ(&S)",IDC_BOS_BINRES_DESC1,23,167,25,8 - COMBOBOX IDC_BOS_BINRES_DATE,58,164,65,131,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "¦b(&T)",IDC_BOS_BINRES_DESC2,127,167,8,8 - CONTROL "",IDC_BOS_BINRES_TIME,"Time",WS_BORDER | WS_TABSTOP,138, - 164,53,13,WS_EX_CLIENTEDGE - ICON IDI_BOSSERVICE,IDC_STATIC,5,5,20,20 - LTEXT "ªA°È %2¡]¦øªA¾¹ %1¡^",IDC_SVC_NAME,52,13,168,8 - GROUPBOX "BOS ªA°È",IDC_STATIC,5,27,215,175 - LTEXT "BOS ªA°È¥i¥Î¨Ó©w´Á°±¤î¨Ã­«·s±Ò°Ê¦¹¦øªA¾¹¤W©Ò¦³ªºªA°È¡]¥]¬A BOSªA°È¥»¨­¡^¡C", - IDC_STATIC,11,45,199,18 - LTEXT "BOS ªA°È¤]¥i¥H¥Î¨Ó©w´Á´ú¸Õ¦øªA¾¹¤W©Ò¦³ªºªA°È¡A¥u°±¤î¨Ã­«·s±Ò°Ê¤G¶i¦ìÀɦ³Åܧ󤧪A°È¡C", - IDC_STATIC,11,118,199,25 -END - -IDD_SET_DUMPING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "¶É¥X®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "±q®eÅé %3 «Ø¥ß¶É¥XÀÉ®× %4...",IDC_DUMPSET_DESC,4,41,229, - 19 -END - -IDD_SET_RESTORING DIALOG DISCARDABLE 0, 0, 238, 65 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU -CAPTION "´_­ì®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "",IDC_ANIMATE,"SysAnimate32",ACS_TRANSPARENT | - ACS_AUTOPLAY | WS_TABSTOP,0,0,229,33 - LTEXT "±q¶É¥XÀÉ®× %2 ´_­ì®eÅé %1...",IDC_RESTORESET_DESC,5,41, - 202,19 -END - -IDD_SET_CLONESYS DIALOG DISCARDABLE 0, 0, 258, 163 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "³Æ¥÷®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "«Ø¥ß Cell ©Ò¦³®eÅ骺³Æ¥÷ª©¥»(&A)",IDC_CLONE_ALL,"Button", - BS_AUTORADIOBUTTON,30,45,214,10 - GROUPBOX " ",IDC_STATIC,23,70,231,65 - CONTROL "¥u¬°²Å¦X¤U¦C·Ç«hªº®eÅ髨¥ß³Æ¥÷(&O)¡G",IDC_CLONE_SOME, - "Button",BS_AUTORADIOBUTTON,30,60,155,11 - CONTROL "¥u¦³¦b¦øªA¾¹¤Wªº®eÅé(&S)¡G",IDC_CLONE_SVR_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,34,83,114,10 - COMBOBOX IDC_CLONE_SVR,169,82,68,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "¥u¦³¦b¤À³Î°Ï¤Wªº®eÅé(&P)¡G",IDC_CLONE_AGG_LIMIT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,34,99,110,10 - COMBOBOX IDC_CLONE_AGG,169,98,68,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "¥u¦³¥H¯S©w¦r¤¸¬°¶}ÀYªº®eÅé(&B)¡G", - IDC_CLONE_PREFIX_LIMIT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,34,116,135,10 - EDITTEXT IDC_CLONE_PREFIX,169,115,68,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,95,145,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,149,145,50,14 - PUSHBUTTON "»¡©ú(&H)",9,204,145,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "®eÅ鳯¥÷¬O¸Ó®eÅ骺°ßŪ³Æ¥÷¡F¤@­ÓŪ¨ú / ¼g¤J®eÅé¥u¦³¤@­Ó³Æ¥÷ª©¥»¡C\n\n±z¥i¥H¦P®É¬°¤@­Ó¥H¤Wªº®eÅ髨¥ß³Æ¥÷ª©¥»¡C", - IDC_STATIC,30,7,214,40 -END - -IDD_SUBSETS DIALOGEX 0, 0, 281, 182 -STYLE WS_POPUP | WS_CAPTION -CAPTION "ºÊµø¦øªA¾¹" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¤l¶°¦WºÙ¡G",IDC_STATIC,12,77,44,8 - EDITTEXT IDC_SUBSET_NAME,64,75,109,14,ES_AUTOHSCROLL | - ES_READONLY | NOT WS_TABSTOP - PUSHBUTTON "¶}±Ò(&O)...",IDC_SUBSET_LOAD,188,75,39,14 - PUSHBUTTON "Àx¦s(&S)...",IDC_SUBSET_SAVE,233,75,39,14 - CONTROL "",IDC_SUBSET_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x153,12,111,193,58,WS_EX_CLIENTEDGE - PUSHBUTTON "¥þ³¡ºÊµø(&A)",IDC_SUBSET_ALL,211,122,57,14 - PUSHBUTTON "¤£ºÊµø(&N)",IDC_SUBSET_NONE,211,140,57,14 - LTEXT "¦p­n§ïµ½¦b¤j«¬ Cell ¤¤ªº§@·~®Ä¯à¡A±z¥i¥H¿ï¾Ü¤£ºÊµø¯S©w¦øªA¾¹¡C¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v±N¤£·|Åã¥Ü¥¼ºÊµø¤§¦øªA¾¹¤Wªº®eÅé¡B¤À³Î°Ï©ÎªA°È¡C", - IDC_STATIC,5,5,271,24 - LTEXT "±z¥i¥HÀH®É¿ï¾ÜºÊµø¡]©Î¤£ºÊµø¡^¦øªA¾¹¡C±z¥i¥H«Ø¥ß¦øªA¾¹¤l¶°¡A¥H«ü©w¸ÓºÊµø¤§¦øªA¾¹²M³æ¡C", - IDC_STATIC,5,37,271,18 - GROUPBOX "¥Ø«eªº¤l¶°",IDC_STATIC,5,63,271,114 - LTEXT "­nºÊµøªº¦øªA¾¹¡G",IDC_STATIC,12,95,92,8 -END - -IDD_SUBSET_LOADSAVE DIALOGEX 0, 0, 280, 145 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | - WS_CAPTION | WS_SYSMENU -CAPTION "¡]°õ¦æ´Á¶¡³]©wªº¼ÐÃD¡^" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¤l¶°¦WºÙ(&N)¡G",1090,5,112,51,8,SS_NOTIFY - EDITTEXT IDC_SUBSET_NAME,60,110,159,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "¶}±Ò(&O)",IDOK,226,110,50,14 - PUSHBUTTON "¨ú®ø(&L)",IDCANCEL,226,127,50,14 - CONTROL "List1",IDC_SUBSET_LIST,"SysListView32",LVS_LIST | - LVS_SINGLESEL | LVS_SORTASCENDING | LVS_EDITLABELS | - LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,20,272,82, - WS_EX_CLIENTEDGE - PUSHBUTTON "",IDC_SUBSET_RENAME,187,4,14,13,BS_ICON | NOT - WS_TABSTOP - PUSHBUTTON "",IDC_SUBSET_DELETE,203,4,14,13,BS_ICON | NOT - WS_TABSTOP - LTEXT "¥» Cell ªº¤l¶°¤w©w¸q¡G",IDC_STATIC,4,6,114,8 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 218, 73 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "·j´M«ü¥O" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,137,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Åã¥Ü»¡©ú(&H)",IDOK,147,38,67,14 - PUSHBUTTON "¨ú®ø(&C)",IDCANCEL,147,55,67,14 - LTEXT "¦p­n§ä¥X¨Ï¥Î¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¥H°õ¦æ§@·~ªº¤èªk¡A½Ð¿ï¨ú¥H¤Uªº«ü¥O¦æ¡A¨Ã«ö¡uÅã¥Ü»¡©ú¡v«ö¶s¡C", - IDC_STATIC,4,4,210,25 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 137 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¬d¾\¿ù»~½X" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¿ù»~½X(&E)¡G",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Âà´«(&T)",IDC_ERROR_TRANSLATE,144,39,47,14 - PUSHBUTTON "Ãö³¬(&C)",IDCANCEL,85,117,48,14 - LTEXT "¡]°õ¦æ´Á¶¡³]©w¤å¦r¡^",IDC_ERROR_DESC,4,71,211,42 - LTEXT "¦p­n§ä¥X¿ù»~½Xªº²[·N¡A½ÐÁä¤J¥H¤Uªº¥N½X¡A¨Ã«ö¤@¤U¡uÂà´«¡v«ö¶s¡C", - IDC_STATIC,4,4,192,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 230, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¦³Ãö AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ¦øªA¾¹ºÞ²zµ{¦¡ 3.5 ª©",IDC_STATIC,33,8,163,8 - LTEXT "Copyright (C) IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,183,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,222,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,222,56 - PUSHBUTTON "Ãö³¬(&C)",IDOK,89,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,222,1 -END - -IDD_OPENINGCELL DIALOG DISCARDABLE 0, 0, 241, 46 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¥¿¦b·j´M %1 Cell ¤ºªº¦øªA¾¹ ...", - IDC_OPENCELL_DESC,41,15,183,16 - GROUPBOX "",IDC_STATIC,4,2,231,39 - ICON IDI_MAIN,IDC_ANIMATE,12,12,18,20,SS_REALSIZEIMAGE | - WS_BORDER -END - -IDD_OPTIONS_GENERAL DIALOG DISCARDABLE 0, 0, 279, 139 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "Åã¥Ü¦øªA¾¹ªº§¹¾ã»â°ì¦WºÙ¡]¨Ò¦p""machine.company.com""¡^", - IDC_OPT_SVR_LONGNAMES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,5,269,10 - CONTROL "§@·~®É¦pªG¨S¦³ºÞ²z°O¸¹¡A´N·|Åã¥Üĵ§i(&W)", - IDC_OPT_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,19,269,10 - CONTROL "...Á`¬OÅã¥Ü¦øªA¾¹ªº¤º®e",IDC_OPT_SVR_DBL_PROP,"Button", - BS_AUTORADIOBUTTON,21,50,253,10 - CONTROL "... ¥u¦b¡u§Ö³tÀ˵øµ¡®æ¡v¬°¶}±Òª¬ºA®É¡A¤~Åã¥Ü¦øªA¾¹ªº¤º®e", - IDC_OPT_SVR_DBL_DEPENDS,"Button",BS_AUTORADIOBUTTON,21, - 63,253,10 - CONTROL "...Á`¬O¶}±Ò¸Ó¦øªA¾¹ªºµøµ¡",IDC_OPT_SVR_DBL_OPEN,"Button", - BS_AUTORADIOBUTTON,21,75,253,10 - CONTROL "...¶}±Ò¦øªA¾¹µøµ¡¡A«h¦øªA¾¹·|¨ü¨ìºÊµø", - IDC_OPT_SVR_OPENMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,107,253,10 - CONTROL "...Ãö³¬¦øªA¾¹µøµ¡¡A«h¦øªA¾¹¤£·|¨ü¨ìºÊµø", - IDC_OPT_SVR_CLOSEUNMON,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,124,253,10 - LTEXT "¦b¦øªA¾¹¹Ï¥Ü¤W«ö¨â¤U...",IDC_STATIC,5,38,269,8 - LTEXT "­Y¦øªA¾¹¤l¶°¦b¨Ï¥Îª¬ºA¤U¡A¦Ó¡u§Ö³tÀ˵ø¡vµ¡®æ¬°Ãö³¬ª¬ºA ...", - IDC_STATIC,5,95,269,8 -END - -IDD_SVR_KEYS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_KEY_LIST,"FastList",WS_TABSTOP | 0x30b,5,22,216, - 135,WS_EX_CLIENTEDGE - PUSHBUTTON "·s¼W¦øªA¾¹ª÷Æ_(&A)",IDC_KEY_ADD,58,160,79,14 - PUSHBUTTON "²¾°£¦øªA¾¹ª÷Æ_(&R)",IDC_KEY_REMOVE,141,160,79,14 - LTEXT "¦øªA¾¹ª÷Æ_¡G",IDC_KEY_NAME,5,7,216,8 -END - -IDD_SVR_CREATEKEY DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "·s¼W¦øªA¾¹ª÷Æ_" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "ª©¥»¡G",IDC_STATIC,7,37,26,8 - EDITTEXT IDC_KEY_VERSION,43,35,43,14,ES_AUTOHSCROLL - LTEXT "­È¡G",IDC_STATIC,7,58,21,8 - CONTROL "¬°³o­Ó¦r¦ê¥[±K¡G",IDC_KEY_BYSTRING,"Button", - BS_AUTORADIOBUTTON,43,58,73,10 - CONTROL "¨Ï¥Î³o­Óª÷Æ_¡G",IDC_KEY_BYDATA,"Button", - BS_AUTORADIOBUTTON,43,76,71,10 - EDITTEXT IDC_KEY_STRING,119,56,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_KEY_DATA,119,75,103,14,ES_AUTOHSCROLL - PUSHBUTTON "ÀH¾÷(&R)",IDC_KEY_RANDOM,226,75,48,14 - LTEXT "´£¥Ü¡G±N·sªºª÷Æ_·s¼W¨ì¦øªA¾¹¤§«á¡AÀ³­×§ï AFS ±b¤á¥H¨Ï¥Î·sªºª÷Æ_¡C´X¤Ñ¤§«á¡A´N¥i¥H²¾°£Âªº¦øªA¾¹ª÷Æ_¡C", - IDC_STATIC,7,99,267,18 - DEFPUSHBUTTON "½T©w",IDOK,116,129,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,170,129,50,14 - PUSHBUTTON "»¡©ú",9,224,129,50,14 - LTEXT "¦øªA¾¹ %1 ªº·sª÷Æ_",IDC_KEY_TITLE,43,14,181,8 - ICON IDI_SERVER_KEY,IDC_STATIC,7,7,20,20 -END - -IDD_SVC_STARTSTOP DIALOG DISCARDABLE 0, 0, 277, 132 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "¶}©l / °±¤îªA°È" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,115,114,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,169,114,50,14 - PUSHBUTTON "»¡©ú(&H)",9,223,114,50,14 - ICON IDI_SERVICE,IDC_STATIC,4,7,20,20 - LTEXT "«ö¤@¤U¡u½T©w¡v¥H¶}©l/°±¤î¦øªA¾¹ %1 ¤WªºªA°È %2¡C", - IDC_STARTSTOP_TEXT,31,12,242,9 - CONTROL "¥Ã¤[(&P) (IDS_START/STOPSERVICE_PERMANENT)", - IDC_STARTSTOP_PERMANENT,"Button",BS_AUTORADIOBUTTON,37, - 68,226,10 - CONTROL "¼È®É(&T) (IDS_START/STOPSERVICE_TEMPORARY)", - IDC_STARTSTOP_TEMPORARY,"Button",BS_AUTORADIOBUTTON,37, - 83,226,10 - GROUPBOX "ªA°È±Ò°Ê³]©w",IDC_STATIC,31,31,242,70 - LTEXT "±z¥i¥H§â¥¦Åܦ¨¥Ã¤[Åܧó¡A³o¼ËªA°È %2 ´N·|¡]¤£·|¡^¦b¦øªA¾¹ %1 ­«·s±Ò°Ê®É¦Û°Ê±Ò°Ê¡C", - IDC_STARTSTOP_STARTUP,38,45,223,16 -END - -IDD_SVR_EXECUTE DIALOG DISCARDABLE 0, 0, 248, 125 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "°õ¦æ«ü¥O" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,4,56,42,8 - COMBOBOX IDC_SERVER,50,54,90,107,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "«ü¥O(&C)¡G",IDC_STATIC,4,75,42,8 - EDITTEXT IDC_COMMAND,50,73,194,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,86,107,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,140,107,50,14 - PUSHBUTTON "»¡©ú(&H)",9,194,107,50,14 - ICON IDI_SERVER,IDC_STATIC,4,4,20,20 - LTEXT "¦b¦øªA¾¹¤W°õ¦æ«ü¥O",IDC_STATIC,32,12,185,8 - LTEXT "³o¶µ§@·~Åý±z¦b»·ºÝ¦øªA¾¹¤Wµo¥X«ü¥O¡C\n³o¶µ§@·~³q±`ÂǥѰõ¦æ /etc/reboot script¡A­«·s±Ò°Ê¦øªA¾¹¡C", - IDC_STATIC,4,29,240,16 -END - -IDD_SVR_SALVAGE DIALOG DISCARDABLE 0, 0, 262, 255 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "§Q¥Î®eÅé - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,23,50,42,8 - COMBOBOX IDC_SERVER,67,48,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¤À³Î°Ï(&P)¡G",IDC_STATIC,23,67,41,8 - COMBOBOX IDC_AGGREGATE,67,65,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "´©±Ï©Ò¦³ªº¤À³Î°Ï(&A)",IDC_AGGREGATE_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,164,67,94,10 - LTEXT "®eÅé(&O)¡G",IDC_STATIC,23,85,35,8 - COMBOBOX IDC_FILESET,67,83,88,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - CONTROL "´©±Ï©Ò¦³ªº®eÅé(&L)",IDC_FILESET_ALL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,163,85,79,10 - DEFPUSHBUTTON "½T©w",IDOK,85,107,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,145,107,50,14 - PUSHBUTTON "»¡©ú(&H)",9,208,108,50,14 - PUSHBUTTON "¶i¶¥(&V) >>",IDC_ADVANCED,23,108,53,14 - LTEXT "¼È¦sÀɸô®|(&T)¡G",IDC_STATIC,10,142,74,8 - EDITTEXT IDC_SALVAGE_TEMPDIR,103,141,133,13,ES_AUTOHSCROLL - CONTROL "¨Ã¦æ´©±Ï§@·~(&R)¡F³B²z¼Æ¥Ø¡G",IDC_SALVAGE_SIMUL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,157,123,10 - EDITTEXT IDC_SALVAGE_NUM,157,156,39,13,ES_AUTOHSCROLL - CONTROL "¤£­n´©±Ï·lÃaªº®eÅé(&N)",IDC_SALVAGE_READONLY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,167,123,10 - CONTROL "±NŪ¨ú§@·~¤À¦¨¤p°Ï¶ô(&B)",IDC_SALVAGE_BLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,177,139,10 - CONTROL "±j¨î´©±Ï©Ò¦³«ü¥Xªº®eÅé(&F)",IDC_SALVAGE_FORCE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,187,136,10 - CONTROL "±j¨î­««Ø¥Ø¿ýµ²ºc(&E)",IDC_SALVAGE_FIXDIRS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,29,197,123,10 - LTEXT "µ²ªG¤é»xªºÀɮצWºÙ(&L)¡G",IDC_STATIC,10,211,91,8 - EDITTEXT IDC_SALVAGE_LOG_FILE,103,210,133,13,ES_AUTOHSCROLL - CONTROL "±N·lÃaªº¤º¸`ÂI²M³æ¥]§t¦bµ²ªG¤é»x¤¤(&I)", - IDC_SALVAGE_LOG_INODES,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,226,203,10 - CONTROL "±N AFS ©Ò¾Ö¦³ªº®Ú¤º¸`ÂI²M³æ¥]§t¦bµ²ªG¤é»x¤¤(&W)", - IDC_SALVAGE_LOG_ROOT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,30,237,203,10 - ICON IDI_SERVER,IDC_STATIC,4,7,20,20 - LTEXT "³o¶µ§@·~Åý±z­×´_¤@©Î¼Æ­Ó®eÅ骺°ÝÃD¡C\n\n½Ðª`·N¡G­Y±z¦P®É´©±Ï¾ã­Ó¤À³Î°Ï©Î¦øªA¾¹¡A¦øªA¾¹·|¼È®ÉÂ÷½u¡C", - IDC_STATIC,44,7,214,32 - GROUPBOX "¶i¶¥´©±Ï¿ï¶µ",IDC_ADVANCED_GROUP,4,129,254,122 -END - -IDD_SVR_SALVAGE_RESULTS DIALOG DISCARDABLE 0, 0, 286, 178 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "§Q¥Î®eÅé - µ²ªG" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "Ãö³¬(&C)",IDOK,232,160,50,14 - LTEXT "´©±Ï§@·~µ²ªG¡G",IDC_STATIC,4,33,277,8 - EDITTEXT IDC_SALVAGE_DETAILS,4,43,277,113,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | - WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - ICON IDI_SERVER,IDC_STATIC,4,7,21,20 - LTEXT "¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº±Ï´©®eÅé %3",IDC_SALVAGE_TITLE, - 33,15,248,8 -END - -IDD_SET_RELEASE DIALOG DISCARDABLE 0, 0, 277, 102 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -CAPTION "ÄÀ©ñ®eÅé" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,115,84,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,169,84,50,14 - PUSHBUTTON "»¡©ú(&H)",9,223,84,50,14 - ICON IDI_FILESET,IDC_STATIC,4,7,20,20 - LTEXT "³o¶µ§@·~Åý±z§ó·s %3 ®eÅ骺½Æ¥»¡C±z¥i¥H¿ï¾Ü¥u§ó·s¹L´Áªº½Æ¥»¡A©Î¬O§ó·s©Ò¦³ªº½Æ¥»¡C", - IDC_RELSET_DESC,31,7,242,26 - CONTROL "¥u§ó·s¹L´Áªº®eÅ齯¥»(&U)",IDC_RELSET_NORMAL,"Button", - BS_AUTORADIOBUTTON,46,41,173,10 - CONTROL "§ó·s©Ò¦³®eÅ齯¥»¡A¥]¬A¥¼¹L´Áªº½Æ¥»(&A)", - IDC_RELSET_FORCE,"Button",BS_AUTORADIOBUTTON,46,56,172, - 10 -END - -IDD_SVR_HOSTS DIALOGEX 0, 0, 226, 179 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - PUSHBUTTON "·s¼W¥D¹q¸£¦øªA¾¹(&A)",IDC_HOST_ADD,52,160,83,14 - PUSHBUTTON "²¾°£¥D¹q¸£¦øªA¾¹(&R)",IDC_HOST_REMOVE,138,160,80,14 - LTEXT "¦øªA¾¹©Ò¿ëÃѪº¸ê®Æ®w¥D¹q¸£¦øªA¾¹",IDC_HOST_TITLE,5,7, - 216,8 - CONTROL "",IDC_HOST_LIST,"FastList",WS_TABSTOP | 0x11,5,22,216, - 135,WS_EX_CLIENTEDGE -END - -IDD_SVR_ADDHOST DIALOGEX 0, 0, 225, 106 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "·s¼W¥D¹q¸£¦øªA¾¹" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¥D¹q¸£(&H)¡G",-1,32,55,43,8 - EDITTEXT IDC_ADDHOST_HOST,79,53,103,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,63,88,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,117,88,50,14 - ICON IDI_SERVER,-1,4,4,20,20 - LTEXT "±z¿ï¾Ü·s¼W¸ê®Æ®w¥D¹q¸£¦øªA¾¹¨ìÀx¦s©ó¦øªA¾¹ %1 ªº²M³æ¡C\n\n½Ð¦b¤U¤è¿é¤J·sªº¸ê®Æ®w¥D¹q¸£¦WºÙ¡C", - IDC_ADDHOST_DESC,31,10,177,34 - PUSHBUTTON "»¡©ú",9,171,88,50,14 -END - -IDD_SVR_ADDRESS DIALOGEX 0, 0, 208, 115 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "ÅÜ§ó¦øªA¾¹¦ì§}" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "°O¿ý©ó VLDB ªº¦øªA¾¹ %1 ªº IP ¦ì§}¡G",IDC_TITLE,4,4,200, - 8 - LISTBOX IDC_SVR_ADDRESSES,4,14,147,40,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Åܧó(&C)...",IDC_ADDR_CHANGE,154,24,50,14 - PUSHBUTTON "²¾°£(&R)",IDC_ADDR_REMOVE,154,40,50,14 - DEFPUSHBUTTON "½T©w",IDOK,46,97,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,100,97,50,14 - PUSHBUTTON "»¡©ú",9,154,97,50,14 - LTEXT "ªþµù¡GÀɮצøªA¾¹·|¦b±Ò°Ê®É¡A¦Û°Ê¦V VLDB µn¿ý¨ä¥Ø«eªº IP ¦ì§}¡C", - IDC_STATIC,4,64,200,18 -END - -IDD_SVR_NEWADDR DIALOGEX 0, 0, 223, 69 -STYLE DS_CENTER | DS_CONTEXTHELP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Åܧó IP ¦ì§}" -CLASS "AFSManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,61,51,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,115,51,50,14 - PUSHBUTTON "»¡©ú",9,169,51,50,14 - LTEXT "¿é¤J·sªº IP ¦ì§} ¥H¨ú¥N VLDB ªº %1¡G",IDC_TITLE,4,4,215, - 8 - CONTROL "",IDC_ADDRESS,"SockAddr",WS_BORDER | WS_TABSTOP,32,23, - 100,14 - LTEXT "¦ì§}¡G",IDC_STATIC,4,26,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_INSTALL ICON DISCARDABLE "resource\\install.ico" -IDI_UNINSTALL ICON DISCARDABLE "resource\\uninstal.ico" -IDI_PRUNE ICON DISCARDABLE "resource\\prune.ico" -IDI_GETDATES ICON DISCARDABLE "resource\\getdates.ico" -IDI_SUBSET ICON DISCARDABLE "resource\\subset.ico" -IDI_ADMINLIST ICON DISCARDABLE "resource\\admlist.ico" -IDI_BTN_DELETE ICON DISCARDABLE "resource\\btn_delete.ico" -IDI_BTN_RENAME ICON DISCARDABLE "resource\\btn_rename.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" -IDI_SERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\service.ico" -IDI_AGGREGATE ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg.ico" -IDI_FILESET ICON DISCARDABLE "..\\afsapplib\\resource\\fileset.ico" -IDI_SERVER_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\server1.ico" -IDI_SERVICE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\service1.ico" -IDI_AGGREGATE_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\aggreg1.ico" -IDI_FILESET_ALERT ICON DISCARDABLE "..\\afsapplib\\resource\\fileset1.ico" -IDI_BOSSERVICE ICON DISCARDABLE "..\\afsapplib\\resource\\bos.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_SERVER_KEY ICON DISCARDABLE "..\\afsapplib\\resource\\key.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AVI -// - -AVI_SETMOVE AVI DISCARDABLE "Resource\\setmove.avi" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_LISTS_TITLE "¦øªA¾¹ %1 - ºÞ²z­û²M³æ" - IDS_TAB_SERVICES "ªA°È" - IDS_TAB_AGGREGATES "¤À³Î°Ï" - IDS_TAB_FILESETS "®eÅé" - IDS_SERVICE_NONESELECTED "¿ï¨ú±z­nÀ˵øªº¦øªA¾¹¡C" - IDS_SERVICE_GOTSELECTED "¦øªA¾¹ %1 ¤WªºªA°È³B²z¡G" - IDS_AGGREGATE_ALL "©Ò¦³¦øªA¾¹¤Wªº¤À³Î°Ï¡G" - IDS_AGGREGATE_ONE "¦øªA¾¹ %1 ¤Wªº¤À³Î°Ï¡G " - IDS_FILESET_ALL "Cell %1 ¤¤ªº©Ò¦³®eÅé¡G" - IDS_FILESET_ONE "¦øªA¾¹ %1 ¤Wªº®eÅé¡G" - IDS_SVR_LISTS_TAB "ºÞ²z­û²M³æ" - IDS_SVR_PROP_TITLE "¦øªA¾¹ %1 - ¤º®e" - IDS_SVR_GENERAL_TAB "¤@¯ë¨Æ¶µ" - IDS_SVR_SCOUT_TAB "³]©w" - IDS_SERVER_TITLE "¦øªA¾¹ %1 - AFS ¦øªA¾¹ºÞ²zµ{¦¡" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_DESC "Cell %2 ¤¤ªº¦øªA¾¹ %1¡G" - IDS_SVC_PROP_TITLE "¦øªA¾¹ %1 ¤¤ªºªA°È %2 - ¤º®e" - IDS_SVC_GENERAL_TAB "¤@¯ë¨Æ¶µ" - IDS_SVC_ADD_TITLE "«Ø¥ßªA°È" - IDS_SVC_ADD_TAB "«Ø¥ßªA°È" - IDS_AGG_PROP_TITLE "¦øªA¾¹ %1 ¤Wªº¤À³Î°Ï %2 - ¤º®e" - IDS_AGG_GENERAL_TAB "¤@¯ë¨Æ¶µ" - IDS_SET_REP_TITLE "®eÅé %1 - ½Æ»s" - IDS_SET_REPSITES_TAB "½Æ»sºô¯¸" - IDS_SET_PROP_TITLE "®eÅé %1 - ¤º®e" - IDS_SET_GENERAL_TAB "¤@¯ë¨Æ¶µ" - IDS_SET_UNLOCKBTN "¥ß§Y¸Ñ°£Âê©w(&L)" - IDS_SET_LOCKBTN "¥ß§YÂê©w(&L)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USAGE_FILESET "%2 °tÃB¤w¨Ï¥Îªº %1 (%3%%)" - IDS_USAGE_AGGREGATE "%2 ®e¶q¤w¨Ï¥Îªº %1 (%3%%)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGCOL_ALLOCATED "¥[Á`ªº°tÃB" - IDS_SVRCOL_NAME "¦øªA¾¹" - IDS_SVRCOL_STATUS "ª¬ºA" - IDS_SETCOL_DATE_ACCESS "¤W¦¸¦s¨ú¤é´Á" - IDS_SETCOL_DATE_BACKUP "¤W¦¸³Æ¥÷¤é´Á" - IDS_SVCCOL_NAME "ªA°È" - IDS_SVCCOL_TYPE "Ãþ«¬" - IDS_SVCCOL_PARAMS "°Ñ¼Æ" - IDS_SVCCOL_STATUS "ª¬ºA" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_DATE_START "¤W¦¸±Ò°Ê" - IDS_SVCCOL_DATE_STOP "¤W¦¸°±¤î" - IDS_SVCCOL_DATE_STARTSTOP "¤W¦¸±Ò°Ê / °±¤î" - IDS_SVCCOL_DATE_FAILED "¤W¦¸¥¢±Ñ" - IDS_SVCCOL_LASTERROR "¤W¦¸ªº¥X¤f½X" - IDS_AGGCOL_NAME "¤À³Î°Ï" - IDS_AGGCOL_ID "ID" - IDS_AGGCOL_DEVICE "¸Ë¸m" - IDS_AGGCOL_USED "¤w¨Ï¥Îªº" - IDS_AGGCOL_USED_PER "% ¤w¨Ï¥Î" - IDS_AGGCOL_FREE "ÄÀ©ñ" - IDS_AGGCOL_TOTAL "®e¶q" - IDS_AGGCOL_STATUS "ª¬ºA" - IDS_SETCOL_NAME "®eÅé" - IDS_SETCOL_TYPE "Ãþ«¬" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETCOL_DATE_CREATE "«Ø¥ß¤é´Á" - IDS_SETCOL_DATE_UPDATE "«e¦¸§ó·s" - IDS_SETCOL_STATUS "ª¬ºA" - IDS_SETCOL_QUOTA_USED "¤w¨Ï¥Îªº" - IDS_SETCOL_QUOTA_USED_PER "% ¤w¨Ï¥Îªº" - IDS_SETCOL_QUOTA_FREE "ÄÀ©ñ" - IDS_SETCOL_QUOTA_TOTAL "°tÃB" - IDS_TRYAGAINBTN "­«·s¹Á¸Õ(&A)" - IDS_NO_CELL_SELECTED "¡]©|¥¼«ü©w Cell¡^" - IDS_NO_AFS_ID "¡]¨S¦³¥i¥Îªº°O¸¹¡^" - IDS_AFS_ID_WILLEXP "%1¡]°O¸¹±N¨ì´Á %2¡^" - IDS_ELAPSED_TIME "%1" - IDS_SEARCHING_FOR_SERVERS "½Ðµy­Ô¡F¥¿¦b¨ú±o¦³Ãö %1 Cell ªº¸ê°T ..." - IDS_STATUS_NOALERTS "¤@¯ë" - IDS_TITLE_BROWSE_USER "¿ï¾Ü¨Ï¥ÎªÌ" - IDS_AGGTYPE_OTHER "¤£©ú (%1)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATEFILESET "¦b¤À³Î°Ï %1:%2 «Ø¥ß®eÅé %3" - IDS_ACTION_DELETEFILESET "±q¤À³Î°Ï %1:%2 §R°£®eÅé %3" - IDS_ACTION_MOVEFILESET "±N®eÅé %3 ²¾¦Ü¤À³Î°Ï %1:%2" - IDS_ACTION_SETFILESETQUOTA "Åܧó®eÅé %3 ªº°tÃB" - IDS_SVCSTOP_DESC2 "«ö¡u½T©w¡v¥H°±¤î³o¶µªA°È¡C" - IDS_SVCSTART_DESC2 "½Ð«ö¡u½T©w¡v¥H±Ò°Ê¥»ªA°È¡C" - IDS_SYNCVLDB_SVR_DESC "ĵ§i¡I\n\n¦pªG±zÄ~Äò¡A¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v·|­×§ï VLDB ¥H²Å¦X¦øªA¾¹ %1 ¤Wªº©Ò¦³¤À³Î°Ï¤º®e¡C" - IDS_SYNCVLDB_SVR_DESC2 "­Y VLDB ©Ò´£¨ìªº®eÅ饨«e°ò©ó¥ô¦ó¦]¯À¡AµLªk¦b¦øªA¾¹ %1 ¤Wªº¤À³Î°Ï§ä¨ì¡A¸Ó®eÅ骺 VLDB ¶µ¥Ø´N·|³Q§R°£¡I" - IDS_SYNCVLDB_AGG_DESC "ĵ§i¡I\n\n¦pªG±zÄ~Äò¡A¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v´N·|­×§ï VLDB ¥H²Å¦X¦øªA¾¹ %1 ¤§¤À³Î°Ï %2 ªº¤º®e¡C" - IDS_SYNCVLDB_AGG_DESC2 "­Y VLDB ©Ò´£¨ìªº®eÅ饨«e°ò©ó¥ô¦ó¦]¯À¡AµLªk¦b¥»¤À³Î°Ï¤W§ä¨ì¡A¸Ó®eÅ骺 VLDB ¶µ¥Ø´N·|³Q§R°£¡I" - IDS_PROMPT_BROWSE_USER "¨Ï¥ÎªÌ¡G" - IDS_PREVIEWIN_BUTTON "<< ¹wÄý(&P)" - IDS_PREVIEWOUT_BUTTON "¹wÄý(&P) >>" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ADMCOL_TYPE_USER "¨Ï¥ÎªÌ" - IDS_TITLE_BROWSE_PRINCIPAL "¿ï¨ú¥DÅé" - IDS_TITLE_BROWSE_OWNGROUP "¿ï¨ú¾Ö¦³ªº¸s²Õ" - IDS_PROMPT_BROWSE_PRINCIPAL "¥DÅé¡G" - IDS_PROMPT_BROWSE_OWNGROUP "¾Ö¦³¸s²Õ¡G" - IDS_ACTION_CLONE "«Ø¥ß®eÅé %3 ªº³Æ¥÷ª©¥»" - IDS_ACTION_CLONESYS "«Ø¥ß¦h­«ªº®eÅ鳯¥÷" - IDS_CLONESYS_FAILED "¦]µo¥Í¿ù»~ 0x%2 (%3) ¦ÓµLªk«Ø¥ß®eÅé %1 ªº³Æ¥÷¡C" - IDS_SET_UNSPECIFIED "¡]¥¼¸ü©úªº¡^" - IDS_SETCOL_ID "ID" - IDS_SETCOL_FILES "ÀÉ®×­p¼Æ" - IDS_SET_DUMP_NAME "%1.DMP ªº¶É¥X" - IDS_ACTION_DUMP "¶É¥X®eÅé %3¡]¤À³Î°Ï %1:%¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FILESETNAME_ERROR "%1 - %2" - IDS_SETCOL_AGGREGATE "¤À³Î°Ï" - IDS_REFRESH_DESC_CELL "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¥¿¦b¨M©w %1 Cell ¤¤¤§¦øªA¾¹ªºª¬ºA¡C³o¥i¯à­nªá´X¤ÀÄÁ®É¶¡..." - IDS_REFRESH_DESC_SERVER "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¥¿¦b¨M©w¦øªA¾¹ %1 ªºª¬ºA¡C³o¥i¯à­nªá´X¤ÀÄÁ®É¶¡ ..." - IDS_REFRESH_CURRENT_CELL "¥Ø«e¥¿¦bÀˬd¡GCell %1" - IDS_REFRESH_CURRENT_SERVER "¥Ø«e¥¿¦bÀˬd¡G¦øªA¾¹ %2" - IDS_REFRESH_CURRENT_AGGREGATE "¥Ø«e¥¿¦bÀˬd¡G¦øªA¾¹ %2 ¤Wªº¤À³Î°Ï %3" - IDS_REFRESH_CURRENT_FILESET - "¥Ø«e¥¿¦bÀˬd¡G¦øªA¾¹ %2 ¤Wªº®eÅé %4¡A¤À³Î°Ï %3" - IDS_REFRESH_CURRENT_SERVICE "¥Ø«e¥¿¦bÀˬd¡G¦øªA¾¹ %2 ¤WªºªA°È %3" - IDS_REFRESH_PERCENT "%1%% ¤w§¹¦¨" - IDS_PROBLEMS "°ÝÃD" - IDS_SERVER_NO_PROBLEMS "³o­Ó¦øªA¾¹¨S¦³¤wª¾ªº°ÝÃD¡C" - IDS_SERVICE_NO_PROBLEMS "³o¶µªA°È¨S¦³¤wª¾ªº°ÝÃD¡C" - IDS_AGGREGATE_NO_PROBLEMS "³o­Ó¤À³Î°Ï¨S¦³¤wª¾ªº°ÝÃD¡C" - IDS_FILESET_NO_PROBLEMS "³o­Ó®eÅé¨S¦³¤wª¾ªº°ÝÃD¡C" - IDS_AGGTYPE_TYPE1 "UFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGGTYPE_TYPE2 "LFS" - IDS_AGGTYPE_TYPE3 "AIX" - IDS_AGGTYPE_TYPE4 "VXFS" - IDS_AGGTYPE_TYPE5 "DMEPI" - IDS_REFRESH_CURRENT_VLDB "¥Ø«e¥¿¦bÀˬd¡G®eÅé¦ì¸m¸ê®Æ®w (VLDB)" - IDS_FILESETTYPE_RW "Ū¨ú/¼g¤J" - IDS_FILESETTYPE_RO "½Æ¥»" - IDS_FILESETTYPE_CLONE "³Æ¥÷" - IDS_MOVESET_READWRITE "¦pªGÄ~Äò¡A®eÅé %3 ·|±q¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ²¾°Ê¨ì¥t¤@­Ó¦ì¸m¡C" - IDS_MOVESET_READONLY "¦pªGÄ~Äò¡A®eÅ齯¥» %3 ±N·|±q¦øªA¾¹ %1 ¤À³Î°Ï %2 ²¾°£¡A¦Ó¥t¤@­Ó¦b±z©ó¥H¤U©Ò«ü©w¤§¤À³Î°Ï¤W©Ò«Ø¥ßªº®eÅ齯¥»¤]·|³Q²¾°£¡C" - IDS_SVC_START_TITLE "±Ò°ÊªA°È" - IDS_SVC_STOP_TITLE "°±¤îªA°È" - IDS_SERVICESTATUS_STARTING "¥Ø«e¥¿¦b±Ò°Ê¦¹ªA°È¡C" - IDS_SERVICESTATUS_RUNNING "¥Ø«e¥¿¦b°õ¦æ¦¹ªA°È¡C" - IDS_SERVICESTATUS_STOPPED "¥Ø«e¤w°±¤î¦¹ªA°È¡C" - IDS_SERVICESTATUS_STOPPING "¥Ø«e¥¿¦b°±¤î¦¹ªA°È¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICESTATUS_UNKNOWN "¦¹ªA°Èªºª¬ºA¤£©ú¡C" - IDS_SVC_RESTART_BUTTON "¥ß§Y°±¤î¨Ã­«·s±Ò°Ê(&R)" - IDS_PROBLEM_BOX "¤wª¾ªº°ÝÃD (%1)" - IDS_VIEWLOG_DESC_NOFILE "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v§ä¤£¨ì¦øªA¾¹ %1 ¤§ªA°È %2 ªº¤é»xÀÉ¡C½Ð¦b¤U¤è¿é¤JªA°È¤§¤é»xÀɪº§¹¾ã¸ô®|¡C" - IDS_NO_GROUP "¡]¨S¦³¾Ö¦³ªº¸s²Õ¡^" - IDS_VIEWLOG_FROMSERVER "¦øªA¾¹ %1 ¤Wªº¤é»xÀÉ" - IDS_VIEWLOG_FROMSERVICE "¦øªA¾¹ %1 ¤§ªA°È %2 ªº¤é»xÀÉ" - IDS_VIEWLOG_TRUNCATED "Àɮפº®e¡]¥uÅã¥Ü³Ì«á %1 ¦æ¡^¡G" - IDS_SAVELOG_FILTER "Text File|*.TXT|" - IDS_ADVANCEDIN_BUTTON "<< ¶i¶¥(&A)" - IDS_ADVANCEDOUT_BUTTON "¶i¶¥(&A) >>" - IDS_REPTYPE_RELEASE "ÄÀ©ñ½Æ»s" - IDS_REPTYPE_SCHEDULED "¤w±Æ©wªº½Æ»s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_UPDATEALL_BUTTON "¥þ³¡§ó·s(&U)" - IDS_UPDATETHIS_BUTTON "§ó·s(&U)" - IDS_SERVER_MULTIPLE_PROBLEMS "¦¹¦øªA¾¹¦³ %1 ªº¤wª¾°ÝÃD¡C" - IDS_SERVICE_MULTIPLE_PROBLEMS "¦¹ªA°È¦³ %1 ªº¤wª¾°ÝÃD¡C" - IDS_AGGREGATE_MULTIPLE_PROBLEMS "¦¹¤À³Î°Ï¦³ %1 ªº¤wª¾°ÝÃD¡C" - IDS_FILESET_MULTIPLE_PROBLEMS "¦¹®eÅ馳 %1 ¤wª¾ªº°ÝÃD¡C" - IDS_FILESETTYPE_RO_STAGE "½Æ¥»" - IDS_SERVICETYPE_SIMPLE_LONG "²¦¡¡]«ùÄò°õ¦æ¡^" - IDS_SERVICETYPE_CRON_LONG "Cron¡]¥H«ü©w¶¡¹j°õ¦æ¡^" - IDS_QUOTAUNITS_KB "kb" - IDS_QUOTAUNITS_MB "MB" - IDS_NO_QUOTA_REPLICA "¡]¦¹®eÅ鬰½Æ¥»¡A¦]¦¹¨S¦³°tÃB¡^" - IDS_NO_QUOTA_CLONE "¡]¦¹®eÅ鬰³Æ¥÷¡A¦]¦¹¨S¦³°tÃB¡^" - IDS_USAGE_REPLICA "%1 ¤w¨Ï¥Î" - IDS_USAGE_CLONE "%1 ¤w¨Ï¥Î" - IDS_COL_AGGS_MOVE "«Ø¥ß®eÅé®Éªº¤À³Î°Ï" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_PERCENTAGE "%1 %%" - IDS_AGGREGATES_IN_SERVER "¦øªA¾¹ %1 ¤Wªº¤À³Î°Ï¡G " - IDS_AGGREGATES_IN_CELL "Cell %1 ¤¤ªº©Ò¦³¤À³Î°Ï¡G" - IDS_AGGREGATES_IN_NOTHING "¤À³Î°Ï¡G" - IDS_FILESETS_IN_SERVER "¦øªA¾¹ %1 ¤Wªº®eÅé¡G" - IDS_FILESETS_IN_CELL "Cell %1 ¤¤ªº©Ò¦³®eÅé¡G" - IDS_FILESETS_IN_NOTHING "®eÅé¡G" - IDS_SERVICES_IN_SERVER "¦øªA¾¹ %1 ¤WªºªA°È¡G" - IDS_SERVICES_IN_NOTHING "ªA°È¡G" - IDS_UNKNOWN "¡]¤£©ú¡^" - IDS_UNKNOWN_GROUP "¸s²Õ¸¹½X %1¡]¦WºÙ¤£©ú¡^" - IDS_AGGFULL_WARN_OFF "¹w³]Á{¬É­È¡]¦øªA¾¹ªºÄµ§i¤w°±¥Î¡^" - IDS_SERVER_AGGREGATE "%1:%2" - IDS_SERVERNAME_ERROR "%1 - %2" - IDS_AGGREGATENAME_ERROR "%1 - %2" - IDS_SETFULL_WARN_OFF "¹w³]Á{¬É­È¡]¦øªA¾¹¤WªºÄµ§i¤w°±¥Î¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_LASTERRORDATE "%1 - ¥X¤f½X %2" - IDS_COL_SERVERS "Cell ¤Wªº¦øªA¾¹" - IDS_COL_FILESETS "¦øªA¾¹¤Wªº®eÅé" - IDS_COL_AGGREGATES "¦øªA¾¹¤Wªº¤À³Î°Ï" - IDS_COL_SERVICES "¦øªA¾¹¤WªºªA°È" - IDS_COL_REPLICAS "®eÅ骺½Æ¥»" - IDS_COLUMNS_TITLE "¿ï¨úÅã¥Üª½Äæ - AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_REPCOL_SERVER "¦øªA¾¹" - IDS_REPCOL_AGGREGATE "¤À³Î°Ï" - IDS_REPCOL_DATE_UPDATE "¤W¦¸§ó·s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COL_AGGS_CREATE "²¾°Ê®eÅé®Éªº¤À³Î°Ï" - IDS_WARN_TITLE "ĵ§i" - IDS_WARN_DISABLE_AUTH "±z­Y«ö¤@¤U""¤¹³\¤£°µÅ²§O""«ö¶s¡A¥¼Å²§Oªº¥DÅé´N·|Àò±o¤¹³\¾Þ§@¦¹¦øªA¾¹¤WªºªA°È¡C¥Ñ©ó«Ü¦hªA°È¦b root ¨­¥÷¤§¤U°õ¦æ¡A¦]¦¹³o­Ó°Ê§@ªí¥Ü +" - IDS_WARN_DISABLE_AUTH2 "¦øªA¾¹ªº¦w¥þ©Ê¦³©úÅ㪺·å²«¡C\n\n±z½T©w­n°µ¦¹Åܧó¶Ü¡H" - IDS_SVR_NO_ADDR "¡]¥¼¸ü©úªº¡^" - IDS_TITLE_BAD_CELL "µLªkÃѧOªº Cell ¦WºÙ" - IDS_DESC_BAD_CELL "±z©Ò¿é¤Jªº Cell ¦WºÙµLªk¦bºô¸ô¤W§ä¨ì¡C\n\n½Ð½T©w±z©Ò¿é¤Jªº¶µ¥Ø¬O§_¥¿½T¡C" - IDS_AGGFULL_WARN_ON "¥»¦øªA¾¹ªº¹w³]Á{¬É­È(&D) ¡]¨ä¤j¤pªº %1%%¡^" - IDS_SETFULL_WARN_ON "¥»¦øªA¾¹ªº¹w³]Á{¬É­È(&D) ¡]¨ä¤j¤pªº %1%%¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVR_ERROR_BAD_CREDENTIALS - "µLªkÃѧO±z©Ò¿é¤Jªº AFS ¨­¥÷¡A©Î¬O±z©Ò«ü©wªº±K½X¦³»~¡C" - IDS_SVR_CREDS_NONE "¡]¨S¦³°O¸¹¡^" - IDS_SVR_CREDS_VALID "%2, ¹L´Á %3" - IDS_SVR_CREDS_EXPIRED "¡]°O¸¹¤w¹L´Á %3¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_AGG_FILESETS "%1 ¡]¥[Á`ªº°tÃB¡G %2¡^" - IDS_ACTION_DESC_NONE "¨S¦³¥¿¦b¶i¦æªº§@·~¡C" - IDS_ACTION_DESC_ONE "¤U¦Cªº§@·~¥Ø«e¥¿¦b¶i¦æ¡G" - IDS_ACTION_DESC_MULT "¥Ø«e¥¿¦b¶i¦æ¥H¤Uªº§@·~¡G" - IDS_ACTCOL_OPERATION "§@·~" - IDS_ACTCOL_ELAPSED "¸g¾ú®É¶¡" - IDS_ACTION_REFRESH "­«·s¾ã²z Cell ¸ê°T" - IDS_ACTION_CREATESERVER "«Ø¥ß¦øªA¾¹ %1" - IDS_ACTION_DELETESERVER "¥¿¦b§R°£¦øªA¾¹ %1" - IDS_ACTION_GETSERVERLOGFILE "¥¿¦V¦øªA¾¹ %1 ¨ú±o¤é»xÀÉ %2" - IDS_ACTION_SETSERVERAUTH "¥¿¦bÅÜ§ó¦øªA¾¹ %1 ªº¦s¨ú­­¨î" - IDS_ACTION_CHANGESERVERSTATUS "ÅÜ§ó¦øªA¾¹ %1 ªº¤º®e" - IDS_ACTION_STARTSERVICE "¥¿¦b±Ò°Ê¦øªA¾¹ %1 ªºªA°È %2" - IDS_ACTION_STOPSERVICE "¥¿¦b°±¤î¦øªA¾¹ %1 ¤WªºªA°È %2" - IDS_ACTION_RESTARTSERVICE "­«·s±Ò°Ê¦øªA¾¹ %1 ¤WªºªA°È %2" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SYNCVLDB_SVR "±N VLDB »P¦øªA¾¹ %1 ¶i¦æ¦P¨B" - IDS_ACTION_SYNCVLDB_AGG "±N VLDB »P¤À³Î°Ï %1:%2 ¶i¦æ¦P¨B" - IDS_ACTION_SCOUT "Àˬd¦øªA¾¹ %1 ªº°ÝÃD" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_SETREPPARAMS "Åܧó®eÅé %3 ªº½Æ»s¤º®e" - IDS_ACTION_CREATEREPLICA "¦b¤À³Î°Ï %1:%2 «Ø¥ß®eÅé %3 ªº½Æ¥»" - IDS_DELSET_REPLICA_DESC "ĵ§i¡I\n\n¦pªGÄ~Äò¡A±N¾É¦Ü¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº®eÅé %3 ½Æ¥»³Q²¾°£¡C" - IDS_DELSET_CLONE_DESC "ĵ§i¡I\n\n¦pªGÄ~Äò¡A±N¾É¦Ü®eÅ鳯¥÷ %3 ±q¦øªA¾¹ %1 ¤À³Î°Ï %2 ³Q²¾°£¡C" - IDS_INSTALL_DESC1 "¥»§@·~±NÀÉ®×±q¦¹¹q¸£½Æ»s¨ì¥t¤@¥x¹q¸£¤W¡C +" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INSTALL_DESC2 "¦pªGÀɮפw¦s©ó¥Ø¼Ð¹q¸£¡A´N·|²£¥Í¤@­Ó°ÆÀɦW¬° .BAK ªº³Æ¥÷¡F¦Ó²{¦³ªº³Æ¥÷·|µ¹»P .OLD °ÆÀɦW¡A¨Ã±N¥ô¦ó°ÆÀɦW¬° .OLD ªº²{¦sÀÉ®×§R°£¡C" - IDS_ACTION_INSTALLFILE "±NÀÉ®× %2 ¦w¸Ë©ó¦øªA¾¹ %1" - IDS_ACTION_UNINSTALLFILE "±NÀÉ®× %2 ±q¦øªA¾¹ %1 ¤W¸Ñ°£¦w¸Ë" - IDS_ACTION_PRUNEFILES "±NÀÉ®×±q¦øªA¾¹ %1 §R°£" - IDS_FILTER_ALLFILES "©Ò¦³ÀÉ®×|*.*|" - IDS_ACTION_RENAMEFILESET "±N®eÅé %1 ­«·s©R¦W¬° %2" - IDS_RECUR_DAILY "¨C¤Ñ" - IDS_RECUR_SUNDAY "¨C¬P´Á¤Ñ" - IDS_RECUR_MONDAY "¨C¬P´Á¤@" - IDS_RECUR_TUESDAY "¨C¬P´Á¤G" - IDS_RECUR_WEDNESDAY "¨C¬P´Á¤T" - IDS_RECUR_THURSDAY "¨C¬P´Á¥|" - IDS_RECUR_FRIDAY "¨C¬P´Á¤­" - IDS_RECUR_SATURDAY "¨C¬P´Á¤»" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CREATESERVICE "¦b¦øªA¾¹ %1 ¤W«Ø¥ßªA°È %2" - IDS_ACTION_DELETESERVICE "±NªA°È %2 ±q¦øªA¾¹ %1 ¤W§R°£" - IDS_ACTION_RELEASEFILESET "ÄÀ©ñ®eÅé %3" - IDS_ACTION_GETDATES "±q¦øªA¾¹ %1 ¤W¨ú±oÀÉ®× %2 ªº¤é´Á" - IDS_LASTMODIFIED "¤W¦¸­×§ï %1" - IDS_SVR_SECURITY_TITLE "¦øªA¾¹¦w¥þ©Ê - %1" - IDS_SVR_LIST_TAB "ºÞ²z­û" - IDS_ACTION_ADMINLIST_LOAD "¨ú±o¦øªA¾¹ %1 ªººÞ²z­û" - IDS_ACTION_ADMINLIST_SAVE "¼g¤J¦øªA¾¹ %1 ªººÞ²z­û" - IDS_ADMCOL_PRINCIPAL "¦¨­û" - IDS_ADMCOL_TYPE "Ãþ«¬" - IDS_ADMCOL_TYPE_GROUP "¸s²Õ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_RESTORE "´_­ì®eÅé %1" - IDS_COL_AGGS_RESTORE "´_­ì®eÅé®Éªº¤À³Î°Ï" - IDS_RESTORE_FILTER "®eÅé¶É¥XÀÉ®×|*.DMP|©Ò¦³ÀÉ®×|*.*|" - IDS_SVC_BOS_TAB "BOS" - IDS_ACTION_SETRESTART "ÅÜ§ó¦øªA¾¹ %1 ªºªA°È±Ò°Ê®É¶¡" - IDS_RESTORE_CREATESET "®eÅé %1 ±N©ó±z¦b¤U¤è©Ò«ü©w¤§¦øªA¾¹»P¤À³Î°Ï¤W«Ø¥ß¡C" - IDS_RESTORE_OVERWRITESET - "ĵ§i¡I ®eÅé %3 ¦s¦b©ó¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W¡A¦pªG±zÄ~Äòªº¸Ü¡A¸Ó®eÅé±N·|³Q§ï¼g¡I" - IDS_SUBSET_TITLE_LOAD "¶}±Ò¦øªA¾¹¤l¶°" - IDS_SUBSET_TITLE_SAVE "Àx¦s¦øªA¾¹¤l¶°" - IDS_BUTTON_OPEN "¶}±ÒÂÂÀÉ(&O)" - IDS_BUTTON_SAVE "Àx¦s(&S)" - IDS_SUBSET_SAVE_TITLE "ĵ§i" - IDS_SUBSET_SAVE_DESC "¦W¬° %1 ªº¦øªA¾¹¤l¶°¤w¸g¦s¦b¡C\n\n±z­n§ï¼g³o­Ó¤l¶°¶Ü¡H" - IDS_SUBSET_CHANGED "%1 [­×§ï]" - IDS_SUBSET_TAB "ºÊµø¦øªA¾¹" - IDS_SUBSET_DISCARD_TITLE "Àx¦s¤l¶°¶Ü¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SUBSET_DISCARD_DESC "±z©|¥¼±N¥Ø«e©ÒºÊµøªº¦øªA¾¹²M³æÀx¦s¬°¤l¶°¡C­Y±zÀx¦s¦¹²M³æ¡A§Y¥i¦bµy«áÄ~ÄòºÊµø³o¨Ç¦øªA¾¹¡C\n\n+" - IDS_SUBSET_DISCARD_DESC2 - "±z­n«Ø¥ß¤@­Ó¥]§t¥Ø«e¥¿ºÊµø¤§¦øªA¾¹²M³æªº¤l¶°¶Ü¡H" - IDS_SUBSET_NONAME "¡]¥¼©R¦W¡^" - IDS_SUBSET_NOSUBSET "¡]©Ò¦³ªº¦øªA¾¹³£¦bºÊµøª¬ºA¤U¡^" - IDS_SUBSET_SERVERSUBSET "¦øªA¾¹ %1" - IDS_FILESET_SOME "Cell %1 ¤¤©Ò¦³³QºÊµøªº¦øªA¾¹®eÅé¡G" - IDS_AGGREGATE_SOME "Cell %1 ¤¤©Ò¦³³QºÊµøªº¦øªA¾¹¤À³Î°Ï¡G" - IDS_SERVICE_SOME "Cell %1 ¤¤©Ò¦³³QºÊµøªº¦øªA¾¹ªA°È¡G" - IDS_FILESET_UNMON "¥¼ºÊµø¦øªA¾¹ %1 " - IDS_AGGREGATE_UNMON "¥¼ºÊµø¦øªA¾¹ %1 " - IDS_SERVICE_UNMON "¥¼ºÊµø¦øªA¾¹ %1 " - IDS_SUBSET_DELETE_TITLE "§R°£¤l¶°¶Ü¡H" - IDS_SUBSET_DELETE_DESC "±z½T©w­n§R°£¦øªA¾¹¤l¶° %1¡H" - IDS_ERROR_TRANSLATED "¿ù»~½X 0x%1 (%2)¡G\n\n%3" - IDS_ERROR_NOTTRANSLATED "¿ù»~½X 0x%1 (%2) µLªkÃѧO¡C" - IDS_FIND_NOTHING_TITLE "¥¼¿ï¨ú«ü¥O" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FIND_NOTHING_DESC "¦p­n§ä¥X°õ¦æ§@·~ªº¤èªk¡A­º¥ý½Ð±q²M³æ¤¤¿ï¨ú¤@­Ó«ü¥O¦æ¡A©Î¬OÁä¤JÃöÁä¦r¡C" - IDS_FIND_UNKNOWN_TITLE "¤£©ú«ü¥O" - IDS_FIND_UNKNOWN_DESC "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v§ä¤£¨ì ""%1"" «ü¥Oªº»¡©ú¥DÃD¡C" - IDS_HELPABOUT_DESC1 "ĵ§i¡G¦¹¹q¸£µ{¦¡¨üµÛ§@Åv»P°ê»Úªk³Wªº«OÅ@¡C +" - IDS_HELPABOUT_DESC2 "¥¼¸g±ÂÅv¦Ó½Æ»s©Î¤À°e¦¹³nÅé±N¾É­PÄY­«ªº¥Á¨Æ»P¦D¨Æ³B¤À¡A¨Ã±N¨Ìªk§@³ÌÄY¼Fªº³B¤À¡C\n\n+" - IDS_HELPABOUT_DESC3 "AFS ¬O¤@®a IBM ¤½¥q¡ATransarc Corporation ªº°Ó¼Ð¡C" - IDS_CANT_QUIT_TITLE "AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_CANT_QUIT_REBOOT "ĵ§i¡I\n\n¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¥Ø«e¥¿¦b°õ¦æ¤@©Î¼Æ¶µ§@·~¡C¦pªG±z²{¦bÃö³¬ Windows¡A³o¨Ç§@·~±NµLªk¶¶§Q§¹¦¨¡C\n\n±z½T©w­n­«·s±Ò°Ê Windows ¶Ü¡H" - IDS_APP_TITLE "AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_ACTION_OPENCELL "¦b %1 Cell ¤W´M§ä¦øªA¾¹" - IDS_OPTIONS_TITLE "¿ï¶µ - AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_OPTIONS_GENERAL_TAB "¤@¯ë¨Æ¶µ" - IDS_BADCREDS_DESC "°£«D±z¥HºÞ²z­ûªº¨­¥÷µn¤J¡A§_«h±zªºÅv­­±N¤£¨¬¥H¶¶§QºÞ²z %1 Cell¡C¦s¨úÅv¦pªG¤£¨¬¡A¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v·|¦b Cell ¨S¦³°ÝÃDªº±¡ªp¤U¡A¨ÌµMµo²{°ÝÃD¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CONFIRMATION_TITLE "½T»{ - AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_NO_GROUP_CHECKBOX "¨S¦³¾Ö¦³ªº¸s²Õ" - IDS_AFS_ID_DIDEXP "%1 ¡]°O¸¹¹L´Á %2¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_QUERYING "¡]¬d¸ß¡^" - IDS_ADMCOL_TYPE_FOREIGN_GROUP "¥~³¡¸s²Õ" - IDS_ADMCOL_TYPE_FOREIGN_USER "¥~³¡¨Ï¥ÎªÌ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SVCCOL_NOTIFIER "³qª¾ªÌ" - IDS_SVC_NONOTIFIER "¡]µL¡^" - IDS_SVR_KEY_TAB "¦øªA¾¹ª÷Æ_" - IDS_KEYNAME_NOTIME "¦øªA¾¹ %1 ªº«öÁä¡G" - IDS_KEYNAME_WITHTIME "¦øªA¾¹ %1 ªº«öÁä¡]¤w­×§ï %2¡^¡G" - IDS_SVRKEY_VERSION "ª©¥»" - IDS_SVRKEY_DATA "­È" - IDS_SVRKEY_CHECKSUM "Àˬd¶q" - IDS_SVRKEY_DATA_UNKNOWN "¡]ÁôÂá^" - IDS_STARTSERVICE_TITLE "±Ò°ÊªA°È" - IDS_STOPSERVICE_TITLE "°±¤îªA°È" - IDS_STARTSERVICE_TEXT "«ö¤@¤U¡u½T©w¡v¥H±Ò°Ê¦øªA¾¹ %1 ¤WªºªA°È %2¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOPSERVICE_TEXT "«ö¤@¤U¡u½T©w¡v¥H°±¤î¦øªA¾¹ %1 ¤WªºªA°È %2¡C" - IDS_STARTSERVICE_STARTUP - "±z¥i¥H§â¥¦Åܦ¨¥Ã¤[Åܧó¡A³o¼Ë¦øªA¾¹ %2 ´N·|¦b¦øªA¾¹ %1 ­«·s±Ò°Ê®É¦Û°Ê±Ò°Ê¡C" - IDS_STOPSERVICE_STARTUP "±z¥i¥H§â¥¦Åܦ¨¥Ã¤[Åܧó¡A³o¼ËªA°È %2 ´N¤£·|¦b¦øªA¾¹ %1 ­«·s±Ò°Ê®É¦Û°Ê±Ò°Ê¡C" - IDS_STARTSERVICE_PERMANENT - "¥Ã¤[(&P)¡]¦øªA¾¹ %1 ­«·s±Ò°Ê®É¡A§Y±Ò°ÊªA°È %2¡^" - IDS_STARTSERVICE_TEMPORARY - "¼È®É(&T)¡]¦øªA¾¹ %1 ­«·s±Ò°Ê®É¡A¤£­n±Ò°ÊªA°È %2¡^" - IDS_STOPSERVICE_PERMANENT - "¥Ã¤[(&P)¡]¦øªA¾¹ %1 ­«·s±Ò°Ê®É¡A¤£­n±Ò°ÊªA°È %2¡^" - IDS_STOPSERVICE_TEMPORARY - "¼È®É(&T)¡]¦øªA¾¹ %1 ­«·s±Ò°Ê®É¡A§Y±Ò°ÊªA°È %2¡^" - IDS_ACTION_EXECUTE "°õ¦æ¦øªA¾¹ %1 ¤Wªº %2" - IDS_ACTION_SALVAGE_SVR "´©±Ï¦øªA¾¹ %1 ¤Wªº©Ò¦³®eÅé" - IDS_ACTION_SALVAGE_AGG "´©±Ï¤À³Î°Ï %1:2 ¤Wªº©Ò¦³®eÅé" - IDS_ACTION_SALVAGE_VOL "´©±Ï¤À³Î°Ï %1:2 ¤Wªº®eÅé %3" - IDS_SALVAGE_SVR "´©±Ï¦øªA¾¹ %1 ¤Wªº©Ò¦³®eÅé" - IDS_SALVAGE_AGG "´©±Ï¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº©Ò¦³®eÅé" - IDS_SALVAGE_SET "´©±Ï¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº®eÅé %3" - IDS_SETSTATUS_SALVAGE "§Q¥Î®eÅé" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SETSTATUS_LOCKED "®eÅé¤wÂê©w" - IDS_SETSTATUS_NO_VOL "®eÅé¿òº|" - IDS_SETSTATUS_BUSY "®eÅ饨«e¦£¸L¤¤" - IDS_SETSTATUS_MOVED "®eÅé¤w²¾°Ê" - IDS_SVR_CAPACITY "%1" - IDS_SVR_ALLOCATION "%1 (%2%%)" - IDS_SVRCOL_ADDRESS "¦ì§}" - IDS_HOST_TITLE "¦øªA¾¹ %1 ©Ò¿ëÃѪº¸ê®Æ®w¥D¹q¸£¦øªA¾¹¡G" - IDS_SVR_HOSTS_TITLE "¦øªA¾¹ %1 - ¸ê®Æ®w¥D¹q¸£" - IDS_SVR_HOST_TAB "¸ê®Æ®w¥D¹q¸£" - IDS_ACTION_HOSTLIST_LOAD "±q¦øªA¾¹ %1 ¨ú±o¥D¹q¸£²M³æ" - IDS_ACTION_HOSTLIST_SAVE "±N¥D¹q¸£²M³æ¼g¤J¦øªA¾¹ %1" - IDS_SETSTATUS_1ALERT "®eÅ馳¤@­Ó°ÝÃD" - IDS_SETSTATUS_2ALERT "®eÅ馳 %1 °ÝÃD" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_CHANGEADDR "ÅÜ§ó¦øªA¾¹ %1 ªº IP ¦ì§}" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_ADDSITE "vos addsite" - IDS_COMMAND_VOS_BACKUP "vos backup" - IDS_COMMAND_VOS_BACKUPSYS "vos backupsys" - IDS_COMMAND_VOS_CREATE "vos create" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_DELENTRY "vos delentry" - IDS_COMMAND_VOS_DUMP "vos dump" - IDS_COMMAND_VOS_EXAMINE "vos examine" - IDS_COMMAND_VOS_LISTPART "vos listpart" - IDS_COMMAND_VOS_LISTVLDB "vos listvldb" - IDS_COMMAND_VOS_LISTVOL "vos listvol" - IDS_COMMAND_VOS_LOCK "vos lock" - IDS_COMMAND_VOS_MOVE "vos move" - IDS_COMMAND_VOS_PARTINFO "vos partinfo" - IDS_COMMAND_VOS_RELEASE "vos release" - IDS_COMMAND_VOS_REMOVE "vos remove" - IDS_COMMAND_VOS_REMSITE "vos remsite" - IDS_COMMAND_VOS_RENAME "vos rename" - IDS_COMMAND_VOS_RESTORE "vos restore" - IDS_COMMAND_VOS_SYNCVLDB "vos syncvldb" - IDS_COMMAND_VOS_UNLOCK "vos unlock" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_VOS_UNLOCKVLDB "vos unlockvldb" - IDS_COMMAND_VOS_ZAP "vos zap" - IDS_COMMAND_BOS_ADDHOST "bos addhost" - IDS_COMMAND_BOS_ADDKEY "bos addkey" - IDS_COMMAND_BOS_ADDUSER "bos adduser" - IDS_COMMAND_BOS_CREATE "bos create" - IDS_COMMAND_BOS_DELETE "bos delete" - IDS_COMMAND_BOS_EXEC "bos exec" - IDS_COMMAND_BOS_GETDATE "bos getdate" - IDS_COMMAND_BOS_GETLOG "bos getlog" - IDS_COMMAND_BOS_GETRESTART "bos getrestart" - IDS_COMMAND_BOS_INSTALL "bos install" - IDS_COMMAND_BOS_LISTHOSTS "bos listhosts" - IDS_COMMAND_BOS_LISTKEYS "bos listkeys" - IDS_COMMAND_BOS_LISTUSERS "bos listusers" - IDS_COMMAND_BOS_PRUNE "bos prune" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_BOS_REMOVEHOST "bos removehost" - IDS_COMMAND_BOS_REMOVEKEY "bos removekey" - IDS_COMMAND_BOS_REMOVEUSER "bos removeuser" - IDS_COMMAND_BOS_RESTART "bos restart" - IDS_COMMAND_BOS_SALVAGE "bos salvage" - IDS_COMMAND_BOS_SETAUTH "bos setauth" - IDS_COMMAND_BOS_SETRESTART "bos setrestart" - IDS_COMMAND_BOS_SHUTDOWN "bos shutdown" - IDS_COMMAND_BOS_START "bos start" - IDS_COMMAND_BOS_STARTUP "bos startup" - IDS_COMMAND_BOS_STATUS "bos status" - IDS_COMMAND_BOS_STOP "bos stop" - IDS_COMMAND_BOS_UNINSTALL "bos uninstall" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_FS_LISTQUOTA "fs listquota" - IDS_COMMAND_FS_QUOTA "fs quota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_FS_SETQUOTA "fs setquota" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCSHORT_UNMONITORED "¥¼ºÊµø¦øªA¾¹ %1 ¬O§_¦³°ÝÃD" - IDS_ALERT_DESCSHORT_TIMEOUT "µLªk»P¦øªA¾¹ %1 ¨ú±oÁpô¡F¤W­Ó¿ù»~¡G%3" - IDS_ALERT_DESCSHORT_AGG_FULL "%2 ¤À³Î°Ïªº¨Ï¥Î¶W¹Lĵ§iªºÁ{¬É­È %3%% (%4)" - IDS_ALERT_DESCSHORT_SET_FULL "%3 ®eÅ骺¨Ï¥Î¶W¹Lĵ§iªºÁ{¬É­È %4%% (%5)" - IDS_ALERT_DESCSHORT_NO_VLDBENT "®eÅé %3 ¨S¦³ VLDB ¶µ¥Ø" - IDS_ALERT_DESCSHORT_NO_SVRENT_SET - "®eÅé %3 ¨ã¦³ VLDB ¶µ¥Ø¡A¦ý¬O¦b¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W§ä¤£¨ì" - IDS_ALERT_DESCSHORT_STOPPED "ªA°È %2 ¤w¦b %3 °±¤î" - IDS_ALERT_DESCSHORT_NO_SVRENT_AGG - "VLDB »P¤À³Î°Ï %2 ¬ÛÃö¡A¦ý«o¥¼¦b¦øªA¾¹ %1 ¤W§ä¨ì" - IDS_ALERT_DESCSHORT_BADCREDS "±zªºÅv­­¤£¨¬¥HºÞ²z¦øªA¾¹ %1" - IDS_ALERT_DESCSHORT_AGG_ALLOC "¤À³Î°Ï %2 ¤Wªº¥[Á`®eÅé°tÃB¶W¹L¨ä®e¶q" - IDS_ALERT_DESCSHORT_STATE_NO_VNODE "%3 ®eÅé¦]¨ü·l¦ÓµLªk¨Ï¥Î¡C" - IDS_ALERT_DESCSHORT_STATE_NO_SERVICE - "¦øªA¾¹®eÅé %3 ¤W¨S¦³¥¿¦b°õ¦æªºªA°È¡C" - IDS_ALERT_DESCSHORT_STATE_OFFLINE "%3 ®eÅé¤wÂ÷½u¡A¦]¦¹µLªk¨Ï¥Î¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_TIMEOUT - "µLªk»P¦øªA¾¹ %1 ¨ú±oÁpô¡C¤W¤@¦¸¦b %2 ©Ò¶i¦æªºÀ|¸Õ¾É¦Ü¿ù»~ ""%3"" ªºµo¥Í¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_DESCFULL_AGG_FULL - "¦øªA¾¹ %1 ¤§¤À³Î°Ï %2 ªº¨Ï¥Î¶W¹L¨äĵ§iÁ{¬É­È %3%% (%4)¡C" - IDS_ALERT_DESCFULL_SET_FULL - "®eÅé %3 ªº¨Ï¥Î¡]¦øªA¾¹ %1¡A¤À³Î°Ï %2¡^¶W¹L¨äĵ§iÁ{¬É­È %4%% (%5)¡C" - IDS_ALERT_DESCFULL_NO_VLDBENT - "®eÅé %3 ¦s¦b©ó¦øªA¾¹ %1 ªº¤À³Î°Ï %2¡A¦ý¬O¨S¦³¹ïÀ³ªº VLDB ¶µ¥Ø¡C" - IDS_ALERT_DESCFULL_NO_SVRENT_SET - "®eÅé %3 ¨ã¦³ VLDB ¶µ¥Ø¡A¦ý¬O¸Ó®eÅé¨Ã¥¼¦b¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W§ä¨ì¡C" - IDS_ALERT_DESCFULL_STOPPED - "¦øªA¾¹ %1 ¤Wªº %2 ªA°È©ó %3 °±¤î¡A¦Ó¥X¤f½X¬° %5¡C" - IDS_ALERT_DESCFULL_NO_SVRENT_AGG - "VLDB »P¦øªA¾¹ %1 ¤§¤À³Î°Ï %2 ªº®eÅé¬ÛÃö¡A¦ý¬O«o¤£¨ì¦¹¤À³Î°Ï¡C" - IDS_ALERT_DESCFULL_BADCREDS - "¥Ñ©ó±z¨S¦³¦¹ Cell ºÞ²z­ûªº AFS °O¸¹¡A¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¥i¯à¥¿¦b°»´ú¦øªA¾¹ %1 ¤W©Ò¨S¦³ªº¿ù»~¡C" - IDS_ALERT_DESCFULL_AGG_ALLOC - "¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤W¥[Á`ªº®eÅé°tÃBÁ`­p¬O %4¡A¶W¹L¤À³Î°Ïªº®e¶q %3¡C" - IDS_ALERT_DESCFULL_STATE_NO_VNODE - "¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº %3 ®eÅé¨Ã¨S¦³»P¤§³sµ²ªº Vnode¡C¡]®eÅ骬ºA¬° 0x%4¡C¡^" - IDS_ALERT_DESCFULL_STATE_NO_SERVICE - "¦øªA¾¹ %1 ¤W¨Ã¨S¦³ÀÉ®×¶×¥X¾¹ªA°È¦b°õ¦æ¡A¦]¦¹¤À³Î°Ï %2 ¤Wªº %3 ®eÅéµLªk¨Ï¥Î¡C¡]®eÅ骬ºA¬° 0x%4¡C¡^" - IDS_ALERT_DESCFULL_STATE_OFFLINE - "¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº %3 ®eÅ鬰Â÷½uª¬ºA¡A¦]¦ÓµLªk¨Ï¥Î¡C¡]®eÅ骬ºA¬° 0x%4¡C¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_TIMEOUT "«ö¤@¤U¡u­«¸Õ¡v«ö¶s¡A¸ÕµÛ»P¦¹¦øªA¾¹¨ú±o³sµ²¡C" - IDS_ALERT_FIX_AGG_FULL "«ö¤@¤U¡uĵ§i¡v«ö¶s¡AÅܧ󦹤À³Î°Ï¥Î¶qªºÄµ§iÁ{¬É­È¡C" - IDS_ALERT_FIX_SET_FULL "«ö¤@¤U¡uĵ§i¡v«ö¶s¡AÅܧ󦹮eÅé¥Î¶qªºÄµ§iÁ{¬É­È¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_FIX_NO_VLDBENT - "VLDB ¥i¯à¤w¹L´Á¡FªG¯u¦p¦¹¡A½Ð¨Ï¥Î¡u¦P¨B VLDB¡v«ü¥O¨Ó¥[¥H§ó·s¡C" - IDS_ALERT_FIX_NO_SVRENT_SET "½ÐÀˬd¦øªA¾¹»P¤À³Î°Ï¬O§_¥¿±`¹B§@¡C" - IDS_ALERT_FIX_STOPPED "«ö¤@¤U¡uÀ˵ø¤é»x¡v«ö¶s¡AÀ˵ø¦¹ªA°È¤§ªA°È¤é»x¡C" - IDS_ALERT_FIX_NO_SVRENT_AGG - "½ÐÀˬd¦øªA¾¹¡A¬Ý¬Ý¤À³Î°Ï¬O§_¤w¶×¥X¥B¥¿±`¹B§@¡C" - IDS_ALERT_FIX_BADCREDS "½ÐÀˬd¡uŲ§O¡v«ö¶s¥H¨ú±o·sªº AFS °O¸¹¡C" - IDS_ALERT_FIX_AGG_ALLOC "½Ð´î¤Ö¦¹¤À³Î°Ïªº®eÅé°tÃB¡A©Î¬O±N¤@©Î¦h­Ó®eÅé²¾°Ê¨ì¨ä¥L¤À³Î°Ï¡C" - IDS_ALERT_FIX_STATE_NO_VNODE " " - IDS_ALERT_FIX_STATE_NO_SERVICE " " - IDS_ALERT_FIX_STATE_OFFLINE " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ALERT_BUTTON_TRYAGAIN "­«·s¹Á¸Õ(&A)" - IDS_ALERT_BUTTON_WARNINGS "ĵ§i(&W)..." - IDS_ALERT_BUTTON_VIEWLOG "À˵ø¤é»x(&V)" - IDS_ALERT_BUTTON_SHOWME "Åã¥Ü(&S)" - IDS_ALERT_BUTTON_GETCREDS "Ų§O(&A)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_CELLSERVERS_NOCELL - "¥¼«ü©w Cell¡C¦p­n¨Ï¥Î¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¡A±z¥²¶·«ü©w±z­n³B²zªº AFS Cell¡C½Ð¦b¤W¤èªº""Cell"" ¥\¯àªí¶µ¥Ø¤¤¿ï¨ú""¶}±Ò...""¥\¯àªí¶µ¥Ø¡A¥H¿ï¾Ü Cell¡C" - IDS_ERROR_REFRESH_CELLSERVERS - "µLªk¨ú±o %1 Cell ªº¦øªA¾¹²M³æ¡C\n\n¿ù»~¡G %2" - IDS_ERROR_CANT_OPEN_CELL - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk©M %1 Cell ¤¤¥ô¦ó¦øªA¾¹¨ú±oÁpô¡C \n\n½Ð­«·sÀˬd±z©ÒÁä¤Jªº Cell ¦WºÙ¬O§_¥¿½T¡C" - IDS_ERROR_REFRESH_AGGREGATES - "µLªk¨ú±o¦øªA¾¹ %1 ªº¤À³Î°Ï²M³æ¡C\n\n¿ù»~¡G %2" - IDS_ERROR_REFRESH_SERVER_STATUS "µLªk¨ú±o¦øªA¾¹ %1 ¥Ø«eªºª¬ºA¡C" - IDS_ERROR_CHANGE_SERVER_STATUS - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅÜ§ó¦øªA¾¹ %1 ªº¤º®e¡C" - IDS_ERROR_REFRESH_AGGREGATE_STATUS - "µLªk¨ú±o¦øªA¾¹ %1 ¤À³Î°Ï %2 ¥Ø«eªºª¬ºA¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_REFRESH_FILESET_STATUS - "µLªk¨ú±o®eÅé %3¡]¦øªA¾¹ %1¡A¤À³Î°Ï %2¡^¥Ø«eªºª¬ºA¡C" - IDS_ERROR_REFRESH_SERVICE_STATUS - "µLªk¨M©w¦øªA¾¹ %1 ¤WªA°È %2 ¥Ø«eªºª¬ºA¡C" - IDS_ERROR_MOVE_FILESET "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N %3 ®eÅé±q¦øªA¾¹ %1 ¤Wªº¤À³Î°Ï %2¡A²¾°Ê¦Ü¦øªA¾¹ %4 ¤Wªº¤À³Î°Ï %5¡C" - IDS_ERROR_VIEW_LOGFILE "µLªk±q¦øªA¾¹ %1 ¤WŪ¨ú %2 ÀɮסC\n\n½ÐÀˬd±z©Ò¿é¤JªºÀɮצWºÙ¬O§_¥¿½T¡A¦P®É±z¾Ö¦³À˵ø¸ÓÀɮתº³\\\¥iÅv¡C" - IDS_ERROR_NOT_REPLICATED "µLªk¨M©w®eÅé %1 ªº½Æ»sª¬ºA¡C" - IDS_ERROR_CANT_CREATE_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %3 ªº¤À³Î°Ï %2 «Ø¥ß®eÅé %3¡C" - IDS_ERROR_CANT_DELETE_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk§R°£®eÅé %3¡]¦øªA¾¹ %1 ¤§¤À³Î°Ï %2¡^¡C" - IDS_ERROR_CANT_CREATE_VLDB_ENTRY - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W¡A¬°®eÅé %3 «Ø¥ß VLDB ¶µ¥Ø¡C" - IDS_ERROR_CANT_SET_FILESET_QUOTA - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W¡AÅܧó®eÅé %3 ªº°tÃB¡C" - IDS_ERROR_CANT_CREATE_SERVER - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b Cell %1 ¤W«Ø¥ß©Ò­n¨Dªº¦øªA¾¹¶µ¥Ø¡C" - IDS_ERROR_CANT_PING_SERVER - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk§PÂ_¦øªA¾¹ %1 ªº IP ¦ì§}¡C" - IDS_ERROR_CANT_DELETE_SERVER "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk§R°£¦øªA¾¹ %1¡C" - IDS_ERROR_CANT_DELETE_SERVER_FILESETS - "¦øªA¾¹ %1 ¤´¬O¤@©Î¼Æ­Ó®eÅ骺¥D¹q¸£¡A¦]¦¹µLªk§R°£¡C¦øªA¾¹¦pªGÁÙ¦³®eÅé¡A´NµLªk§R°£¡C" - IDS_ERROR_CHANGE_AGGREGATE_STATUS - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅܧó¤À³Î°Ï %2 ¦b¦øªA¾¹ %1 ¤Wªº¤º®e¡C" - IDS_ERROR_CHANGE_SERVICE_STATUS - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅܧóªA°È %2 ¦b¦øªA¾¹ %1 ¤Wªº¤º®e¡C" - IDS_ERROR_CANT_START_SERVICE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W±Ò°ÊªA°È %2¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_STOP_SERVICE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W°±¤îªA°È %2¡C" - IDS_ERROR_CANT_RESTART_SERVICE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W°±¤î¨Ã­«·s±Ò°ÊªA°È %2¡C" - IDS_ERROR_CHANGE_REPLICA_STATUS - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅܧó®eÅé %3 ¦b¦øªA¾¹ %1 ¤À³Î°Ï %2 ¤Wªº½Æ»s¤º®e¡C" - IDS_ERROR_CANT_SYNCVLDB "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk§ó·s VLDB¡C" - IDS_ERROR_CANT_CREATE_REPLICA - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W¡A¬°®eÅé %3 «Ø¥ß½Æ¥»¡C" - IDS_ERROR_CANT_INSTALL_FILE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W¦w¸Ë %2 ÀɮסC" - IDS_ERROR_CANT_UNINSTALL_FILE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W¸Ñ°£¦w¸Ë %2 ÀɮסC" - IDS_ERROR_CANT_PRUNE_FILES - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±q¦øªA¾¹ %1 ¤W²¾°£©Ò­n¨DªºÀɮסC" - IDS_ERROR_CANT_RENAME_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N®eÅé %1 ­«·s©R¦W¬°""%2""¡C" - IDS_ERROR_CANT_CREATE_SERVICE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W«Ø¥ßªA°È %2¡C" - IDS_ERROR_CANT_DELETE_SERVICE - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W§R°£ªA°È %2¡C" - IDS_ERROR_CANT_RELEASE_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÄÀ©ñ½Æ»sªº®eÅé %3¡C" - IDS_ERROR_CANT_UPDATE_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %2 ªº¤À³Î°Ï %1 ¤W§ó·s®eÅ齯¥» %3¡C" - IDS_ERROR_CANT_UPDATE_ALL - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk§ó·s®eÅé %3 ªº¥ô¦ó½Æ¥»¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_LOAD_ADMLIST - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkŪ¨ú¦øªA¾¹ %1 ªººÞ²z­û²M³æ¡C" - IDS_ERROR_CANT_LOAD_KEYLIST - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkŪ¨ú¦øªA¾¹ %1 ªº¦øªA¾¹ª÷Æ_²M³æ¡C" - IDS_ERROR_CANT_CREATE_KEY - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¬°¦øªA¾¹ %1 «Ø¥ß·sªº¦øªA¾¹ª÷Æ_¡C" - IDS_ERROR_CANT_SAVE_ADMLIST - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅÜ§ó¦øªA¾¹ %1 ªººÞ²z­û²M³æ¡C" - IDS_ERROR_CANT_CLONE "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W¡A¬°®eÅé %3 «Ø¥ß³Æ¥÷ª©¥»¡C" - IDS_ERROR_CANT_CLONESYS "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk«Ø¥ß©Ò­n¨Dªº³Æ¥÷®eÅé¡C" - IDS_ERROR_CANT_DUMP_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N®eÅé %3 ªº¤º®e¡]¦øªA¾¹ %1¡A¤À³Î°Ï %2¡^¡A¶É¥X¦Ü %4 ÀɮסC" - IDS_ERROR_CANT_RESTORE_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N %4 ÀÉ®×´_­ì¨ì®eÅé %3¡]¦øªA¾¹ %1¡A¤À³Î°Ï %2¡^¡C" - IDS_ERROR_CANT_SET_RESTART_TIMES - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅÜ§ó¦øªA¾¹ %1 ¤WªºªA°È­«·s±Ò°Ê®É¶¡¡C" - IDS_ERROR_CANT_DELETE_REPLICATED_FILESET - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N®eÅé %3 ±q¦øªA¾¹ %1 ªº¤À³Î°Ï %2 ¤W§R°£¡C\n\nVolume %3 ¥²¶·¦b¨ä½Æ¥»³£§R°£¤F¤§«á¡A¤~¯à³Q§R°£¡C" - IDS_CMDLINE_TITLE "¿ù»~ - AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_CMDLINE_SYNTAX "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C" - IDS_CMDLINE_UNRECOGNIZED - "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1""°Ñ¼Æ¬OµLªkªº¿ëÃѪº¡C" - IDS_CMDLINE_DUPLICATE "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1""°Ñ¼Æªº«ü©w¦¸¼Æ¶W¹L¤@¦¸¡C" - IDS_CMDLINE_UNEXPECTVALUE - "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1"" °Ñ¼Æ¤£±o³Q½á¤©¤@­Ó­È¡C" - IDS_CMDLINE_MISSINGVAL "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1"" °Ñ¼Æ¤§«á¥²¶·¬O¤@­Ó­È¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_SUBSETNOTCELL - "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""/SUBSET""°Ñ¼Æ¥²¶·¦b ""/CELL"" °Ñ¼Æ¦P®É³Q«ü©wªº±¡ªp¤U¤~¯à¥[¥H«ü©w¡C" - IDS_CMDLINE_INVALIDSUBSET - "±z©Ò«ü©wªº¦øªA¾¹¤l¶°¡A""%2""¡A©|¥¼¦b %1 Cell ¤¤¥[¥H©w¸q¡C" - IDS_CMDLINE_SERVERNOTCELL - "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""/SERVER""°Ñ¼Æ¥²¶·¦b ""/CELL"" °Ñ¼Æ¦P®É³Q«ü©wªº±¡ªp¤U¤~¯à¥[¥H«ü©w¡C" - IDS_CMDLINE_RESET_TITLE "AFS ¦øªA¾¹ºÞ²zµ{¦¡" - IDS_CMDLINE_RESET_DESC "¡uAFS ¦øªA¾¹ºÞ²zµ{¡v¤w²M°£«ü©wªº³]©w¡C" - IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE - "¥Ñ©ó¤À³Î°Ï¤£¬O¤£¦s¦b¡A´N¬O©|¥¼¶×¤J¡A©Ò¥H¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N VLDB »P¦øªA¾¹ %1 ¤§¤À³Î°Ï %2 ¦P¨B¤Æ¡C\n\n¦p­n±N¦¹¤@¤À³Î°Ï±q¦øªA¾¹ %1 ²¾°£¡A±z¥²¶·§R°£»P¸Ó¤À³Î°Ï¬ÛÃöªº®eÅé VLDB ¶µ¥Ø¡C" - IDS_CMDLINE_USERPASSWORD - "±z¬°¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n¦p­n¨ú±o·sªº AFS °O¸¹¡A""/USER"" »P ""/PASSWORD"" °Ñ¼Æ¥²¶·¦P®É«ü©w¡C" - IDS_ERROR_CANT_DELETE_KEY - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±N¦øªA¾¹ª÷Æ_ %2 ±q¦øªA¾¹ %1 ¤W²¾°£¡C" - IDS_ERROR_CANT_GETRANDOMKEY - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¬°¦øªA¾¹ %1 «Ø¥ßÀH¾÷«öÁä¡C" - IDS_ERROR_CANT_EXECUTE_COMMAND - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¦b¦øªA¾¹ %1 ¤W°õ¦æ¥H¤Uªº«ü¥O¡G\n\n ""%2""" - IDS_ERROR_CANT_READ_SALVAGE_LOG - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¶¶§Q§¹¦¨´©±Ï§@·~¡A¦ý¬OµLªk¨ú±o´y±Ô´©±Ï§@·~¤§¯S©wµ²ªGªº¤é»xÀÉ¡C" - IDS_ERROR_CANT_SALVAGE "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk°õ¦æ©Ò­n¨Dªº´©±Ï§@·~¡C" - IDS_ERROR_CANT_AUTH_ON "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¬°¦øªA¾¹ %1 ±Ò¥ÎŲ§OÀˬd¡C" - IDS_ERROR_CANT_AUTH_OFF "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¬°¦øªA¾¹ %1 °±¥ÎŲ§OÀˬd¡C" - IDS_ERROR_CANT_LOAD_HOSTLIST - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk±q¦øªA¾¹ %1 Ū¨ú¸ê®Æ®w¥D¹q¸£¦øªA¾¹ªº²M³æ¡C" - IDS_ERROR_CANT_SAVE_HOSTLIST - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªkÅÜ§ó¦øªA¾¹ %1 ¤Wªº¸ê®Æ®w¥D¹q¸£¦øªA¾¹²M³æ¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL - "¥Ñ©ó¦¹¹q¸£¨S¦³¥¿½T¦w¸Ë¡uAFS ±±¨î¤¤¤ß¡v¡A¦]¦¹µLªk±Ò°Ê¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¡C\n\n±z¥²¶·­«·s¦w¸Ë¡uAFS ±±¨î¤¤¤ß¡v¡C" - IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN - "¥Ñ©ó²£¥Í¤£©ú­ì¦]ªº°ÝÃD¡A¦]¦¹µLªk±Ò°Ê¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¡C\n\n±z¥²¶·­«·s¦w¸Ë¡uAFS ±±¨î¤¤¤ß¡v¡C" - IDS_ERROR_CANT_CHANGEADDR - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk¬°¦øªA¾¹ %1 Åܧó VLDB ªº IP ¦ì§}¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVER_SERVICE "%1:%2" - IDS_SERVICETYPE_SIMPLE "²¦¡" - IDS_SERVICETYPE_CRON "Cron" - IDS_SERVICESTATE_STOPPED "¤w°±¤î" - IDS_SERVICESTATE_STOPPING "¥¿¦b°±¤î" - IDS_SERVICESTATE_STARTING "¥¿¦b±Ò°Ê" - IDS_SERVICESTATE_RUNNING "¥¿¦b°õ¦æ" - IDS_SERVICETYPE_FS_LONG "FS¡]Àɮרt²Î¡^" - IDS_SERVICETYPE_FS "FS" - IDS_SERVICE_LASTERROR "%1" - IDS_SERVICES_IN_CELL "Cell %1 ¤¤ªº©Ò¦³ªA°È¡G" - IDS_SERVICE_STARTDATE "¤w±Ò°Ê %1" - IDS_SERVICE_STOPDATE "¤w°±¤î %1" -END - -#endif // Chinese (Taiwan) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afssvrmgr/messages.h b/src/WINNT/afssvrmgr/messages.h deleted file mode 100644 index 1175c879c..000000000 --- a/src/WINNT/afssvrmgr/messages.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MESSAGES_H -#define MESSAGES_H - -// Timer IDs -// -#define ID_DISPATCH_TIMER 996 -#define ID_ACTION_TIMER 997 - -// WM_NOTIFY_FROM_DISPATCH is posted when the AFSClass library notifies our -// handler that an event has taken place. -// -// LPNOTIFYSTRUCT lpns = (LPNOTIFYSTRUCT)lParam; -// -// Use NotifyMe() to have notifications sent to your window when a -// particular object changes. -// -#define WM_NOTIFY_FROM_DISPATCH (WM_USER + 0x100) - -// WM_SERVER_CHANGED is sent to the child dialog of a server's window's tab -// control whenever that dialog's selected server changes. It causes the -// window to be redisplayed. -// -// LPIDENT lpiServerNew = (LPIDENT)lParam; // NULL indicates no server -// -// Use Server_ForceRedraw() to post this message. -// -#define WM_SERVER_CHANGED (WM_USER + 0x101) - -// WM_REFRESH_UPDATE is sent to the "Refreshing..." dialog to update its -// displayed percent-complete. -// -// DWORD dwPercentComplete = (DWORD)wParam; -// LPIDENT lpiNowRefreshing = (LPIDENT)lParam; -// -#define WM_REFRESH_UPDATE (WM_USER + 0x102) - -// WM_OPEN_SERVERS is used by Display_Servers() to let g.hMain's thread know -// when it is finished updating the list of servers in a cell. When received, -// all known servers are enumerated and secondary windows opened for them -// as appropriate. -// -#define WM_OPEN_SERVERS (WM_USER + 0x103) - -// WM_COLUMNS_CHANGED is sent by ShowColumnsDialog() if the user modified -// the list-of-columns given as the default selection. -// -#define WM_COLUMNS_CHANGED (WM_USER + 0x104) - -// WM_OPEN_SERVER is posted to g.hMain to cause it to call Server_Open(). -// -// LPIDENT lpiServerToOpen = (LPIDENT)lParam; -// -#define WM_OPEN_SERVER (WM_USER + 0x105) - -// WM_SHOW_CREATEREP_DIALOG is posted to g.hMain from any thread to cause -// the "Create Replica" dialog to be presented to the user. In particular, -// this mechanism is used if the user right-drags an unreplicated fileset -// onto an aggregate and selects "replicate here": the user is first presented -// with the NOTREP dialog, and if the user is successful in getting the set -// replicated from there, the NOTREP_APPLY task posts this message to cause -// the "Create Replica" confirmation dialog to appear next. -// -// LPIDENT lpiRW = (LPIDENT)wParam; -// LPIDENT lpiTarget = (LPIDENT)lParam; // may be NULL -// -#define WM_SHOW_CREATEREP_DIALOG (WM_USER + 0x106) - -// WM_SHOW_YOURSELF is posted to g.hMain to cause the main window to be -// displayed iff a cell has already been selected. -// -// BOOL fForce = (BOOL)lp; // if !fForce, only show if g.lpiCell set -// -#define WM_SHOW_YOURSELF (WM_USER + 0x107) - -// WM_OPEN_ACTIONS is used by taskOPENCELL() to open the Operations In -// Progress window when appropriate. The message is posted to g.hMain. -// -#define WM_OPEN_ACTIONS (WM_USER + 0x108) - -// WM_REFRESH_SETSECTION is sent to the "Refreshing..." dialog to tell -// the window what ID to pass to AfsClass_SkipRefresh() when the "Skip" -// button is clicked. -// -// BOOL fStart = (BOOL)wParam; -// int idSection = (int)lParam; -// -#define WM_REFRESH_SETSECTION (WM_USER + 0x109) - - -#endif - diff --git a/src/WINNT/afssvrmgr/options.cpp b/src/WINNT/afssvrmgr/options.cpp deleted file mode 100644 index 0f5418b97..000000000 --- a/src/WINNT/afssvrmgr/options.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "options.h" -#include "display.h" -#include "propcache.h" -#include "creds.h" -#include "set_general.h" -#include "command.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Options_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Options_General_OnInitDialog (HWND hDlg); -void Options_General_OnApply (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void ShowOptionsDialog (void) -{ - TCHAR szCell[ cchNAME ]; - if (g.lpiCell) - g.lpiCell->GetCellName (szCell); - else - AfsAppLib_GetLocalCell (szCell); - - LPPROPSHEET psh = PropSheet_Create (IDS_OPTIONS_TITLE, FALSE); - psh->sh.hwndParent = g.hMain; - PropSheet_AddTab (psh, IDS_OPTIONS_GENERAL_TAB, IDD_OPTIONS_GENERAL, (DLGPROC)Options_General_DlgProc, 0, TRUE); - PropSheet_ShowModal (psh, PumpMessage); -} - - -BOOL CALLBACK Options_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_OPTIONS_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcGENERAL, 0, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - PropCache_Add (pcGENERAL, NULL, hDlg); - Options_General_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Options_General_OnApply (hDlg); - break; - - case IDC_OPT_SVR_LONGNAMES: - case IDC_OPT_SVR_DBL_PROP: - case IDC_OPT_SVR_DBL_DEPENDS: - case IDC_OPT_SVR_DBL_OPEN: - case IDC_OPT_SVR_OPENMON: - case IDC_OPT_SVR_CLOSEUNMON: - case IDC_OPT_WARN_BADCREDS: - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Options_General_OnInitDialog (HWND hDlg) -{ - CheckDlgButton (hDlg, IDC_OPT_SVR_LONGNAMES, (gr.fServerLongNames)); - CheckDlgButton (hDlg, IDC_OPT_SVR_DBL_PROP, (gr.fDoubleClickOpens == 0)); - CheckDlgButton (hDlg, IDC_OPT_SVR_DBL_DEPENDS, (gr.fDoubleClickOpens == 2)); - CheckDlgButton (hDlg, IDC_OPT_SVR_DBL_OPEN, (gr.fDoubleClickOpens == 1)); - CheckDlgButton (hDlg, IDC_OPT_SVR_OPENMON, (gr.fOpenMonitors)); - CheckDlgButton (hDlg, IDC_OPT_SVR_CLOSEUNMON, (gr.fCloseUnmonitors)); - CheckDlgButton (hDlg, IDC_OPT_WARN_BADCREDS, (gr.fWarnBadCreds)); -} - - -void Options_General_OnApply (HWND hDlg) -{ - BOOL fServerLongNamesOld = gr.fServerLongNames; - - gr.fServerLongNames = IsDlgButtonChecked (hDlg, IDC_OPT_SVR_LONGNAMES); - - if (IsDlgButtonChecked (hDlg, IDC_OPT_SVR_DBL_PROP)) - gr.fDoubleClickOpens = 0; - else if (IsDlgButtonChecked (hDlg, IDC_OPT_SVR_DBL_OPEN)) - gr.fDoubleClickOpens = 1; - else // (IsDlgButtonChecked (hDlg, IDC_OPT_SVR_DBL_DEPENDS)) - gr.fDoubleClickOpens = 2; - - gr.fOpenMonitors = IsDlgButtonChecked (hDlg, IDC_OPT_SVR_OPENMON); - gr.fCloseUnmonitors = IsDlgButtonChecked (hDlg, IDC_OPT_SVR_CLOSEUNMON); - gr.fWarnBadCreds = IsDlgButtonChecked (hDlg, IDC_OPT_WARN_BADCREDS); - - StoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED); - - if (fServerLongNamesOld != gr.fServerLongNames) - { - AfsClass_RequestLongServerNames (gr.fServerLongNames); - - // repopulate the list of server names. - UpdateDisplay_Servers (FALSE, NULL, 0); - } - - if (gr.fWarnBadCreds) - { - if (!CheckCredentials (TRUE)) // user needs new creds? - { - PostMessage (g.hMain, WM_COMMAND, MAKELONG(M_CREDENTIALS,0), 0); - } - } -} - diff --git a/src/WINNT/afssvrmgr/options.h b/src/WINNT/afssvrmgr/options.h deleted file mode 100644 index c1aab05a1..000000000 --- a/src/WINNT/afssvrmgr/options.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef OPTIONS_H -#define OPTIONS_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowOptionsDialog (void); - - -#endif - diff --git a/src/WINNT/afssvrmgr/prefs.cpp b/src/WINNT/afssvrmgr/prefs.cpp deleted file mode 100644 index 2363acdec..000000000 --- a/src/WINNT/afssvrmgr/prefs.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "prefs.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define SETTINGS_KW TEXT("Settings") -#define PREFERENCES_KW TEXT("Preferences") -#define SERVICES_KW TEXT("Services") -#define AGGREGATES_KW TEXT("Aggregates") -#define FILESETS_KW TEXT("Filesets") -#define SUBSETS_KW TEXT("Server Subsets") - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL GetPreferencesInfo (LPIDENT lpi, LPTSTR pszPath, WORD *pwVer) -{ - if (lpi == NULL) - return FALSE; - - // HKCU\Software\...\SVRMgr + \CellName - // - lstrcpy (pszPath, REGSTR_SETTINGS_PREFS); - lstrcat (pszPath, TEXT("\\")); - lpi->GetCellName (&pszPath[ lstrlen(pszPath) ]); - - // HKCU\Software\...\SVRMgr\CellName + \ServerName - // - lstrcat (pszPath, TEXT("\\")); - lpi->GetLongServerName (&pszPath[ lstrlen(pszPath) ]); - - *pwVer = wVerSERVER_PREF; - - if (lpi->fIsService()) - { - // HKCU\Software\...\SVRMgr\CellName\ServerName + \Services\ServiceName - // - lstrcat (pszPath, TEXT("\\")); - lstrcat (pszPath, SERVICES_KW); - lstrcat (pszPath, TEXT("\\")); - lpi->GetServiceName (&pszPath[ lstrlen(pszPath) ]); - *pwVer = wVerSERVICE_PREF; - } - else if (lpi->fIsAggregate()) - { - // HKCU\Software\...\SVRMgr\CellName\ServerName + \Aggs\AggregateName - // - lstrcat (pszPath, TEXT("\\")); - lstrcat (pszPath, AGGREGATES_KW); - lstrcat (pszPath, TEXT("\\")); - lpi->GetAggregateName (&pszPath[ lstrlen(pszPath) ]); - *pwVer = wVerAGGREGATE_PREF; - } - else if (lpi->fIsFileset()) - { - // HKCU\Software\...\SVRMgr\CellName\ServerName + \Filesets\FilesetName - // - lstrcat (pszPath, TEXT("\\")); - lstrcat (pszPath, FILESETS_KW); - lstrcat (pszPath, TEXT("\\")); - lpi->GetFilesetName (&pszPath[ lstrlen(pszPath) ]); - *pwVer = wVerFILESET_PREF; - } - - return TRUE; -} - - -BOOL RestorePreferences (LPIDENT lpi, void *pData, size_t cbData) -{ - TCHAR szPath[ MAX_PATH ]; - WORD wVer; - - if (!GetPreferencesInfo (lpi, szPath, &wVer)) - return FALSE; - - return RestoreSettings (REGSTR_SETTINGS_BASE, szPath, SETTINGS_KW, pData, cbData, wVer); -} - - -BOOL StorePreferences (LPIDENT lpi, void *pData, size_t cbData) -{ - TCHAR szPath[ MAX_PATH ]; - WORD wVer; - - if (!GetPreferencesInfo (lpi, szPath, &wVer)) - return FALSE; - - return StoreSettings (REGSTR_SETTINGS_BASE, szPath, SETTINGS_KW, pData, cbData, wVer); -} - - -void ErasePreferences (LPTSTR pszCell, LPTSTR pszServer) -{ - BOOL fWildcard = FALSE; - LPTSTR pszDelete; - - // HKCU\Software\...\SVRMgr - // - TCHAR szPath[ MAX_PATH ]; - lstrcpy (szPath, REGSTR_SETTINGS_PATH); - - if (!pszCell) - pszDelete = PREFERENCES_KW; - else - { - lstrcat (szPath, TEXT("\\")); - lstrcat (szPath, PREFERENCES_KW); - - if (!pszServer) - pszDelete = pszCell; - else - { - lstrcat (szPath, TEXT("\\")); - lstrcat (szPath, pszCell); - pszDelete = pszServer; - fWildcard = TRUE; - } - } - - HKEY hk; - if (RegOpenKey (HKCU, szPath, &hk) == 0) - { - if (!fWildcard) - { - RegDeltreeKey (hk, pszDelete); - } - else - { - TCHAR szFound[ MAX_PATH ]; - for (size_t ii = 0; RegEnumKey (hk, ii, szFound, MAX_PATH) == 0; ++ii) - { - if (lstrncmpi (szFound, pszDelete, lstrlen(pszDelete))) - continue; - - if (RegDeltreeKey (hk, szFound)) - ii = (size_t)-1; // restart search - } - } - - RegCloseKey (hk); - } -} - - -HKEY OpenSubsetsKey (LPTSTR pszCell, BOOL fCreate) -{ - return OpenSubsetsSubKey (pszCell, NULL, fCreate); -} - - -HKEY OpenSubsetsSubKey (LPTSTR pszCell, LPTSTR pszSubset, BOOL fCreate) -{ - // HKCU\Software\...\SVRMgr + \CellName - // - TCHAR szPath[ MAX_PATH ]; - lstrcpy (szPath, REGSTR_SETTINGS_PREFS); - lstrcat (szPath, TEXT("\\")); - - if (pszCell) - lstrcat (szPath, pszCell); - else if (g.lpiCell) - g.lpiCell->GetCellName (&szPath[ lstrlen(szPath) ]); - - // HKCU\Software\...\SVRMgr\CellName + \"Server Subsets" - // - lstrcat (szPath, TEXT("\\")); - lstrcat (szPath, SUBSETS_KW); - - // HKCU\Software\...\SVRMgr\CellName + \"Server Subsets" + \Subset - // - if (pszSubset) - { - lstrcat (szPath, TEXT("\\")); - lstrcat (szPath, pszSubset); - } - - // Open or create that key. - // - HKEY hk = NULL; - - if (fCreate) - { - if (pszSubset) // destroy and recreate a subset key? - RegDeleteKey (HKCU, szPath); - if (fCreate != 2) // okay, ugly hack: pass 2 to just delete the key - { - if (RegCreateKey (HKCU, szPath, &hk) != 0) - hk = NULL; - } - } - else - { - if (RegOpenKey (HKCU, szPath, &hk) != 0) - hk = NULL; - } - - return hk; -} - diff --git a/src/WINNT/afssvrmgr/prefs.h b/src/WINNT/afssvrmgr/prefs.h deleted file mode 100644 index d4fc5711d..000000000 --- a/src/WINNT/afssvrmgr/prefs.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef PREFS_H -#define PREFS_H - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ErasePreferences (LPTSTR pszCell = NULL, LPTSTR pszServer = NULL); -BOOL RestorePreferences (LPIDENT, LPVOID, size_t); -BOOL StorePreferences (LPIDENT, LPVOID, size_t); - -HKEY OpenSubsetsKey (LPTSTR pszCell, BOOL fCreate); // fCreate: 0=open, 1=create, 2=delete -HKEY OpenSubsetsSubKey (LPTSTR pszCell, LPTSTR pszSubset, BOOL fCreate); - - -#endif - diff --git a/src/WINNT/afssvrmgr/problems.cpp b/src/WINNT/afssvrmgr/problems.cpp deleted file mode 100644 index 59151b82a..000000000 --- a/src/WINNT/afssvrmgr/problems.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "problems.h" -#include "alert.h" -#include "svc_viewlog.h" -#include "set_prop.h" -#include "agg_prop.h" -#include "creds.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Problems_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Problems_OnRefresh (HWND hDlg, LPIDENT lpi); -void Problems_OnRedraw (HWND hDlg, LPIDENT lpi); -void Problems_OnRemedy (HWND hDlg, LPIDENT lpi); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Problems_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_PROBLEMS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG: - NotifyMe (WHEN_OBJECT_CHANGES, lpi, hDlg, 0); - Problems_OnInitDialog (hDlg, lpi); - Problems_OnRefresh (hDlg, lpi); - break; - - case WM_NOTIFY_FROM_DISPATCH: - Problems_OnRefresh (hDlg, lpi); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_DESTROY: - DontNotifyMeEver (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_PROBLEM_REMEDY: - Problems_OnRemedy (hDlg, lpi); - break; - } - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_PROBLEM_TEXT)) - { - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - } - break; - - case WM_VSCROLL: - int posOld; - int posNew; - posOld = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL); - posNew = posOld; - - switch (LOWORD(wp)) - { - case SB_LINEUP: - --posNew; - break; - case SB_LINEDOWN: - ++posNew; - break; - case SB_PAGEUP: - --posNew; - break; - case SB_PAGEDOWN: - ++posNew; - break; - case SB_THUMBTRACK: - posNew = HIWORD(wp); - break; - case SB_TOP: - posNew = 0; - break; - case SB_BOTTOM: - posNew = nAlertsMAX; - break; - } - - SCROLLINFO si; - memset (&si, 0x00, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE; - GetScrollInfo (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, &si); - posNew = limit (0, posNew, si.nMax); - - if (posNew != posOld) - { - SetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, posNew, (LOWORD(wp) == SB_THUMBTRACK) ? FALSE : TRUE); - Problems_OnRedraw (hDlg, lpi); - } - break; - } - - return FALSE; -} - - -void Problems_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_PROBLEM_TITLE, szText, cchRESOURCE); - - LPTSTR pszTitle = NULL; - - if (lpi->fIsServer()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - pszTitle = FormatString (szText, TEXT("%s"), szServer); - } - else if (lpi->fIsService()) - { - TCHAR szServer[ cchNAME ]; - TCHAR szService[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetServiceName (szService); - pszTitle = FormatString (szText, TEXT("%s%s"), szServer, szService); - } - else if (lpi->fIsAggregate()) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetAggregateName (szAggregate); - pszTitle = FormatString (szText, TEXT("%s%s"), szServer, szAggregate); - } - else if (lpi->fIsFileset()) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetAggregateName (szAggregate); - lpi->GetFilesetName (szFileset); - pszTitle = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - - if (pszTitle == NULL) - SetDlgItemText (hDlg, IDC_PROBLEM_TITLE, TEXT("")); - else - { - SetDlgItemText (hDlg, IDC_PROBLEM_TITLE, pszTitle); - FreeString (pszTitle); - } - - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE); - SetDlgItemText (hDlg, IDC_PROBLEM_TEXT, TEXT("")); -} - - -void Problems_OnRefresh (HWND hDlg, LPIDENT lpi) -{ - size_t nAlerts = Alert_GetCount (lpi); - - LPTSTR pszText = FormatString (IDS_PROBLEM_BOX, TEXT("%lu"), nAlerts); - SetDlgItemText (hDlg, IDC_PROBLEM_BOX, pszText); - FreeString (pszText); - - switch (nAlerts) - { - case 0: - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE); - - TCHAR szText[ cchRESOURCE ]; - if (lpi->fIsServer()) - GetString (szText, IDS_SERVER_NO_PROBLEMS); - else if (lpi->fIsService()) - GetString (szText, IDS_SERVICE_NO_PROBLEMS); - else if (lpi->fIsAggregate()) - GetString (szText, IDS_AGGREGATE_NO_PROBLEMS); - else if (lpi->fIsFileset()) - GetString (szText, IDS_FILESET_NO_PROBLEMS); - else - wsprintf (szText, TEXT("UNEXPECTED CONDITION in problems.cpp")); - - SetDlgItemText (hDlg, IDC_PROBLEM_TEXT, szText); - break; - - case 1: - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE); - Problems_OnRedraw (hDlg, lpi); - break; - - default: // two or more - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_SHOW); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_SHOW); - - SCROLLINFO si; - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE; - si.nMin = 0; - si.nMax = nAlerts-1; - si.nPage = 1; - si.nPos = 0; - si.nTrackPos = 0; - - SetScrollInfo (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, &si, TRUE); - Problems_OnRedraw (hDlg, lpi); - break; - } -} - - -void Problems_OnRedraw (HWND hDlg, LPIDENT lpi) -{ - int iAlert = 0; - - if (IsWindowVisible (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL))) - { - iAlert = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL); - } - - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%lu:"), 1+iAlert); - SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), szText); - - LPTSTR pszText1 = Alert_GetDescription (lpi, iAlert, TRUE); - LPTSTR pszText2 = Alert_GetRemedy (lpi, iAlert); - LPTSTR pszText3 = Alert_GetButton (lpi, iAlert); - - LPTSTR pszProblem = FormatString (TEXT("%1\n\n%2"), TEXT("%s%s"), - (pszText1) ? pszText1 : TEXT(""), - (pszText2) ? pszText2 : TEXT("")); - SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_TEXT), pszProblem); - FreeString (pszProblem); - - if (pszText3 == NULL) - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE); - else - { - SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), pszText3); - ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_SHOW); - } - - FreeString (pszText3); - FreeString (pszText2); - FreeString (pszText1); -} - - -void Problems_OnRemedy (HWND hDlg, LPIDENT lpi) -{ - int iAlert = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL); - - LPIDENT lpiTarget = Alert_GetIdent (lpi, iAlert); - ALERT alert = Alert_GetAlert (lpi, iAlert); - - switch (alert) - { - case alertTIMEOUT: - if (lpiTarget && lpiTarget->fIsCell()) - { - StartTask (taskREFRESH, NULL, lpiTarget); - } - else if (lpiTarget) - { - StartTask (taskREFRESH, NULL, lpiTarget->GetServer()); - } - break; - - case alertFULL: - if (lpiTarget && lpiTarget->fIsFileset()) - { - size_t nAlerts = Alert_GetCount (lpiTarget); - Filesets_ShowProperties (lpiTarget, nAlerts, TRUE); - } - else if (lpiTarget && lpiTarget->fIsAggregate()) - { - size_t nAlerts = Alert_GetCount (lpiTarget); - Aggregates_ShowProperties (lpiTarget, nAlerts, TRUE); - } - break; - - case alertNO_VLDBENT: - // No button in this case - break; - - case alertNO_SVRENT: - // No button in this case - break; - - case alertSTOPPED: - Services_ShowServiceLog (lpiTarget); - break; - - case alertBADCREDS: - NewCredsDialog(); - break; - - case alertOVERALLOC: - // No button in this case - break; - - case alertSTATE_NO_VNODE: - case alertSTATE_NO_SERVICE: - case alertSTATE_OFFLINE: - // No button in these cases - break; - } -} - - -/* - * ParseFilesetName - * - */ - -void ParseFilesetName (LPIDENT lpiSearch, LPTSTR pszBase, LPTSTR pszEnding) -{ - TCHAR szFileset[ cchNAME ]; - lpiSearch->GetFilesetName (szFileset); - - LPTSTR pszDot; - if ((pszDot = (LPTSTR)lstrrchr (szFileset, TEXT('.'))) != NULL) - { - if ( lstrcmpi (pszDot, cszENDING_CLONE) && - lstrcmpi (pszDot, cszENDING_REPLICA) ) - { - pszDot = NULL; - } - } - - if (pszDot == NULL) - { - lstrcpy (pszBase, szFileset); - *pszEnding = NULL; - } - else // (pszDot != NULL) - { - lstrcpy (pszBase, szFileset); - lstrcpy (pszEnding, pszDot); - pszBase[ pszEnding - szFileset ] = TEXT('\0'); - } -} - diff --git a/src/WINNT/afssvrmgr/problems.h b/src/WINNT/afssvrmgr/problems.h deleted file mode 100644 index c717624ed..000000000 --- a/src/WINNT/afssvrmgr/problems.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef PROBLEMS_H -#define PROBLEMS_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define PropSheet_AddProblemsTab(_psh,_idd,_lpi,_nAlerts) \ - ( ((_nAlerts) == 0) ? TRUE : \ - (PropSheet_AddTab (_psh, IDS_PROBLEMS, _idd, (DLGPROC)Problems_DlgProc, (LPARAM)_lpi, TRUE)) ) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Problems_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/afssvrmgr/propcache.cpp b/src/WINNT/afssvrmgr/propcache.cpp deleted file mode 100644 index 4f7d38a02..000000000 --- a/src/WINNT/afssvrmgr/propcache.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "propcache.h" - - -/* - * PROPERTIES-DIALOG CACHE ____________________________________________________ - * - */ - -typedef struct - { - BOOL fInUse; - PropCache pcType; - PVOID pv; - HWND hDialog; - } PropCacheEntry; - -static size_t PropCache_nEntries = 0; -static PropCacheEntry *PropCache_apce = NULL; - -void PropCache_Add (PropCache pcType, PVOID pv, HWND hDialog) -{ - if (!PropCache_Search (pcType, pv)) - { - for (size_t iEntry = 0; iEntry < PropCache_nEntries; ++iEntry) - { - if (!PropCache_apce[ iEntry ].fInUse) - break; - } - - if (iEntry == PropCache_nEntries) - { - if (!REALLOC (PropCache_apce, PropCache_nEntries, 1+iEntry, 16)) - return; - } - - PropCache_apce[ iEntry ].fInUse = TRUE; - PropCache_apce[ iEntry ].pcType = pcType; - PropCache_apce[ iEntry ].pv = pv; - PropCache_apce[ iEntry ].hDialog = hDialog; - - if (pcType != pcSERVER) - AfsAppLib_RegisterModelessDialog (hDialog); - } -} - - -HWND PropCache_Search (PropCache pcType, PVOID pv, HWND hwndStart) -{ - size_t iEntry = 0; - - if (hwndStart != NULL) - { - for ( ; iEntry < PropCache_nEntries; ++iEntry) - { - if (!PropCache_apce[ iEntry ].fInUse) - continue; - if (PropCache_apce[ iEntry ].hDialog == hwndStart) - { - ++iEntry; - break; - } - } - } - - for ( ; iEntry < PropCache_nEntries; ++iEntry) - { - if (!PropCache_apce[ iEntry ].fInUse) - continue; - - if ( (PropCache_apce[ iEntry ].pcType == pcType) && - ((pv == ANYVALUE) || (PropCache_apce[ iEntry ].pv == pv)) ) - { - if (!IsWindow (PropCache_apce[ iEntry ].hDialog)) - { - PropCache_apce[ iEntry ].fInUse = FALSE; - continue; - } - - return PropCache_apce[ iEntry ].hDialog; - } - } - - return NULL; -} - - -void PropCache_Delete (PropCache pcType, PVOID pv) -{ - for (size_t iEntry = 0; iEntry < PropCache_nEntries; ++iEntry) - { - if (!PropCache_apce[ iEntry ].fInUse) - continue; - - if ( (PropCache_apce[ iEntry ].pcType == pcType) && - ((pv == ANYVALUE) || (PropCache_apce[ iEntry ].pv == pv)) ) - { - PropCache_apce[ iEntry ].fInUse = FALSE; - } - } -} - - -void PropCache_Delete (HWND hDialog) -{ - for (size_t iEntry = 0; iEntry < PropCache_nEntries; ++iEntry) - { - if (!PropCache_apce[ iEntry ].fInUse) - continue; - - if (PropCache_apce[ iEntry ].hDialog == hDialog) - { - PropCache_apce[ iEntry ].fInUse = FALSE; - } - } -} - diff --git a/src/WINNT/afssvrmgr/propcache.h b/src/WINNT/afssvrmgr/propcache.h deleted file mode 100644 index 372393071..000000000 --- a/src/WINNT/afssvrmgr/propcache.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef PROPCACHE_H -#define PROPCACHE_H - - -/* - * PROPERTIES-DIALOG CACHE ____________________________________________________ - * - */ - -typedef enum - { - pcSERVER, // Server window (Open mode only) - pcSVR_PROP, // Server's Properties dialog - pcSVR_LISTS, // Server's Admin Lists dialog - pcSVR_CREATE, // Server's Create dialog - pcSVR_SYNCVLDB, // Syncronize VLDB dialog - pcSVR_INSTALL, // Install File dialog - pcSVR_UNINSTALL, // Uninstall File dialog - pcSVR_PRUNE, // Prune Old Files dialog - pcSVR_GETDATES, // Get File Dates (non-results) dialog - pcSVR_EXECUTE, // Execute Command dialog - pcSVR_SECURITY, // Server's Security dialog - pcSVR_SALVAGE, // Salvage dialog - pcSVR_HOSTS, // Server's Hosts dialog - pcSVC_PROP, // Service's Properties dialog - pcSVC_CREATE, // Service's CreateService dialog - pcAGG_PROP, // Aggregate's Properties dialog - pcSET_REP, // Fileset's Replication information - pcSET_PROP, // Fileset's Properties dialog - pcSET_RELEASE, // Release Fileset dialog - pcSET_CLONE, // Clone Fileset dialog - pcSET_CLONESYS_R, // Clone Filesets Results dialog - pcSET_DELETE, // Delete Fileset dialog - pcERROR, // Error dialog - pcGENERAL, // Any other dialog - } PropCache; - -#define ANYVALUE (PVOID)-1 - -void PropCache_Add (PropCache pcType, PVOID pv, HWND hDialog); -HWND PropCache_Search (PropCache pcType, PVOID pv, HWND hwndSearch = (HWND)NULL); -void PropCache_Delete (PropCache pcType, PVOID pv); -void PropCache_Delete (HWND hDialog); - - -#endif - diff --git a/src/WINNT/afssvrmgr/resource.h b/src/WINNT/afssvrmgr/resource.h deleted file mode 100644 index d0cd1c2b6..000000000 --- a/src/WINNT/afssvrmgr/resource.h +++ /dev/null @@ -1,1105 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_SVR_LISTS_TITLE 0 -#define IDS_TAB_SERVICES 1 -#define IDS_TAB_AGGREGATES 2 -#define IDS_TAB_FILESETS 3 -#define IDS_SERVICE_NONESELECTED 4 -#define IDS_SERVICE_GOTSELECTED 5 -#define IDS_AGGREGATE_ALL 6 -#define IDS_AGGREGATE_ONE 7 -#define IDS_FILESET_ALL 8 -#define IDS_FILESET_ONE 9 -#define IDS_SVR_LISTS_TAB 10 -#define IDS_SVR_PROP_TITLE 11 -#define IDS_SVR_GENERAL_TAB 12 -#define IDS_SVR_SCOUT_TAB 13 -#define IDS_SERVER_TITLE 14 - -#define IDS_SERVER_DESC 16 -#define IDS_SVC_PROP_TITLE 17 -#define IDS_SVC_GENERAL_TAB 18 -#define IDS_SVC_ADD_TITLE 19 -#define IDS_SVC_ADD_TAB 20 -#define IDS_AGG_PROP_TITLE 21 -#define IDS_AGG_GENERAL_TAB 22 -#define IDS_SET_REP_TITLE 23 -#define IDS_SET_REPSITES_TAB 24 -#define IDS_SET_PROP_TITLE 25 -#define IDS_SET_GENERAL_TAB 26 -#define IDS_SET_UNLOCKBTN 27 -#define IDS_SET_LOCKBTN 28 - -#define IDS_USAGE_FILESET 32 -#define IDS_USAGE_AGGREGATE 33 - -#define IDS_AGGCOL_ALLOCATED 48 -#define IDS_SVRCOL_NAME 49 -#define IDS_SVRCOL_STATUS 50 -#define IDS_SETCOL_DATE_ACCESS 51 -#define IDS_SETCOL_DATE_BACKUP 52 -#define IDS_SVCCOL_NAME 53 -#define IDS_SVCCOL_TYPE 54 -#define IDS_SVCCOL_PARAMS 55 -#define IDS_SVCCOL_STATUS 56 - -#define IDS_SVCCOL_DATE_START 64 -#define IDS_SVCCOL_DATE_STOP 65 -#define IDS_SVCCOL_DATE_STARTSTOP 66 -#define IDS_SVCCOL_DATE_FAILED 67 -#define IDS_SVCCOL_LASTERROR 68 -#define IDS_AGGCOL_NAME 69 -#define IDS_AGGCOL_ID 70 -#define IDS_AGGCOL_DEVICE 71 -#define IDS_AGGCOL_USED 72 -#define IDS_AGGCOL_USED_PER 73 -#define IDS_AGGCOL_FREE 74 -#define IDS_AGGCOL_TOTAL 75 -#define IDS_AGGCOL_STATUS 76 -#define IDS_SETCOL_NAME 77 -#define IDS_SETCOL_TYPE 78 - -#define IDS_SETCOL_DATE_CREATE 80 -#define IDS_SETCOL_DATE_UPDATE 81 -#define IDS_SETCOL_STATUS 82 -#define IDS_SETCOL_QUOTA_USED 83 -#define IDS_SETCOL_QUOTA_USED_PER 84 -#define IDS_SETCOL_QUOTA_FREE 85 -#define IDS_SETCOL_QUOTA_TOTAL 86 -#define IDS_TRYAGAINBTN 87 -#define IDS_NO_CELL_SELECTED 88 -#define IDS_NO_AFS_ID 89 -#define IDS_AFS_ID_WILLEXP 90 -#define IDS_ELAPSED_TIME 91 -#define IDS_SEARCHING_FOR_SERVERS 92 -#define IDS_STATUS_NOALERTS 93 -#define IDS_TITLE_BROWSE_USER 94 -#define IDS_AGGTYPE_OTHER 95 - -#define IDS_ACTION_CREATEFILESET 96 -#define IDS_ACTION_DELETEFILESET 97 -#define IDS_ACTION_MOVEFILESET 98 -#define IDS_ACTION_SETFILESETQUOTA 99 -#define IDS_SVCSTOP_DESC2 101 -#define IDS_SVCSTART_DESC2 102 -#define IDS_SYNCVLDB_SVR_DESC 103 -#define IDS_SYNCVLDB_SVR_DESC2 104 -#define IDS_SYNCVLDB_AGG_DESC 105 -#define IDS_SYNCVLDB_AGG_DESC2 106 -#define IDS_PROMPT_BROWSE_USER 107 -#define IDS_PREVIEWIN_BUTTON 108 -#define IDS_PREVIEWOUT_BUTTON 109 - -#define IDS_ADMCOL_TYPE_USER 112 -#define IDS_TITLE_BROWSE_PRINCIPAL 113 -#define IDS_TITLE_BROWSE_OWNGROUP 114 -#define IDS_PROMPT_BROWSE_PRINCIPAL 115 -#define IDS_PROMPT_BROWSE_OWNGROUP 116 -#define IDS_ACTION_CLONE 117 -#define IDS_ACTION_CLONESYS 118 -#define IDS_CLONESYS_FAILED 119 -#define IDS_SET_UNSPECIFIED 120 -#define IDS_SETCOL_ID 121 -#define IDS_SETCOL_FILES 122 -#define IDS_SET_DUMP_NAME 123 -#define IDS_ACTION_DUMP 124 - -#define IDS_FILESETNAME_ERROR 128 -#define IDS_SETCOL_AGGREGATE 129 -#define IDS_REFRESH_DESC_CELL 130 -#define IDS_REFRESH_DESC_SERVER 131 -#define IDS_REFRESH_CURRENT_CELL 132 -#define IDS_REFRESH_CURRENT_SERVER 133 -#define IDS_REFRESH_CURRENT_AGGREGATE 134 -#define IDS_REFRESH_CURRENT_FILESET 135 -#define IDS_REFRESH_CURRENT_SERVICE 136 -#define IDS_REFRESH_PERCENT 137 -#define IDS_PROBLEMS 138 -#define IDS_SERVER_NO_PROBLEMS 139 -#define IDS_SERVICE_NO_PROBLEMS 140 -#define IDS_AGGREGATE_NO_PROBLEMS 141 -#define IDS_FILESET_NO_PROBLEMS 142 -#define IDS_AGGTYPE_TYPE1 143 - -#define IDS_AGGTYPE_TYPE2 144 -#define IDS_AGGTYPE_TYPE3 145 -#define IDS_AGGTYPE_TYPE4 146 -#define IDS_AGGTYPE_TYPE5 147 -#define IDS_REFRESH_CURRENT_VLDB 148 -#define IDS_FILESETTYPE_RW 149 -#define IDS_FILESETTYPE_RO 150 -#define IDS_FILESETTYPE_CLONE 151 -#define IDS_MOVESET_READWRITE 152 -#define IDS_MOVESET_READONLY 153 -#define IDS_SVC_START_TITLE 154 -#define IDS_SVC_STOP_TITLE 155 -#define IDS_SERVICESTATUS_STARTING 156 -#define IDS_SERVICESTATUS_RUNNING 157 -#define IDS_SERVICESTATUS_STOPPED 158 -#define IDS_SERVICESTATUS_STOPPING 159 - -#define IDS_SERVICESTATUS_UNKNOWN 160 -#define IDS_SVC_RESTART_BUTTON 161 -#define IDS_PROBLEM_BOX 162 -#define IDS_VIEWLOG_DESC_NOFILE 163 -#define IDS_NO_GROUP 164 -#define IDS_VIEWLOG_FROMSERVER 165 -#define IDS_VIEWLOG_FROMSERVICE 166 -#define IDS_VIEWLOG_TRUNCATED 167 -#define IDS_SAVELOG_FILTER 168 -#define IDS_ADVANCEDIN_BUTTON 169 -#define IDS_ADVANCEDOUT_BUTTON 170 -#define IDS_REPTYPE_RELEASE 171 -#define IDS_REPTYPE_SCHEDULED 172 - -#define IDS_UPDATEALL_BUTTON 178 -#define IDS_UPDATETHIS_BUTTON 179 -#define IDS_SERVER_MULTIPLE_PROBLEMS 180 -#define IDS_SERVICE_MULTIPLE_PROBLEMS 181 -#define IDS_AGGREGATE_MULTIPLE_PROBLEMS 182 -#define IDS_FILESET_MULTIPLE_PROBLEMS 183 -#define IDS_FILESETTYPE_RO_STAGE 184 -#define IDS_SERVICETYPE_SIMPLE_LONG 185 -#define IDS_SERVICETYPE_CRON_LONG 186 -#define IDS_QUOTAUNITS_KB 187 -#define IDS_QUOTAUNITS_MB 188 -#define IDS_NO_QUOTA_REPLICA 189 -#define IDS_NO_QUOTA_CLONE 190 -#define IDS_USAGE_REPLICA 191 -#define IDS_USAGE_CLONE 192 -#define IDS_COL_AGGS_MOVE 193 - -#define IDS_PERCENTAGE 194 -#define IDS_AGGREGATES_IN_SERVER 195 -#define IDS_AGGREGATES_IN_CELL 196 -#define IDS_AGGREGATES_IN_NOTHING 197 -#define IDS_FILESETS_IN_SERVER 198 -#define IDS_FILESETS_IN_CELL 199 -#define IDS_FILESETS_IN_NOTHING 200 -#define IDS_SERVICES_IN_SERVER 201 -#define IDS_SERVICES_IN_NOTHING 202 -#define IDS_UNKNOWN 203 -#define IDS_UNKNOWN_GROUP 204 -#define IDS_AGGFULL_WARN_OFF 205 -#define IDS_SERVER_AGGREGATE 206 -#define IDS_SERVERNAME_ERROR 207 -#define IDS_AGGREGATENAME_ERROR 208 -#define IDS_SETFULL_WARN_OFF 209 - -#define IDS_SERVICE_LASTERRORDATE 210 -#define IDS_COL_SERVERS 211 -#define IDS_COL_FILESETS 212 -#define IDS_COL_AGGREGATES 213 -#define IDS_COL_SERVICES 214 -#define IDS_COL_REPLICAS 215 -#define IDS_COLUMNS_TITLE 216 -#define IDS_REPCOL_SERVER 217 -#define IDS_REPCOL_AGGREGATE 218 -#define IDS_REPCOL_DATE_UPDATE 219 - -#define IDS_COL_AGGS_CREATE 224 -#define IDS_WARN_TITLE 225 -#define IDS_WARN_DISABLE_AUTH 226 -#define IDS_WARN_DISABLE_AUTH2 227 -#define IDS_SVR_NO_ADDR 228 -#define IDS_TITLE_BAD_CELL 229 -#define IDS_DESC_BAD_CELL 230 -#define IDS_AGGFULL_WARN_ON 231 -#define IDS_SETFULL_WARN_ON 232 - -#define IDS_SVR_ERROR_BAD_CREDENTIALS 240 -#define IDS_SVR_CREDS_NONE 241 -#define IDS_SVR_CREDS_VALID 242 -#define IDS_SVR_CREDS_EXPIRED 243 - -#define IDS_AGG_FILESETS 256 -#define IDS_ACTION_DESC_NONE 257 -#define IDS_ACTION_DESC_ONE 258 -#define IDS_ACTION_DESC_MULT 259 -#define IDS_ACTCOL_OPERATION 260 -#define IDS_ACTCOL_ELAPSED 261 -#define IDS_ACTION_REFRESH 262 -#define IDS_ACTION_CREATESERVER 263 -#define IDS_ACTION_DELETESERVER 264 -#define IDS_ACTION_GETSERVERLOGFILE 265 -#define IDS_ACTION_SETSERVERAUTH 266 -#define IDS_ACTION_CHANGESERVERSTATUS 267 -#define IDS_ACTION_STARTSERVICE 268 -#define IDS_ACTION_STOPSERVICE 269 -#define IDS_ACTION_RESTARTSERVICE 270 - -#define IDS_ACTION_SYNCVLDB_SVR 272 -#define IDS_ACTION_SYNCVLDB_AGG 273 -#define IDS_ACTION_SCOUT 274 - -#define IDS_ACTION_SETREPPARAMS 288 -#define IDS_ACTION_CREATEREPLICA 289 -#define IDS_DELSET_REPLICA_DESC 290 -#define IDS_DELSET_CLONE_DESC 291 -#define IDS_INSTALL_DESC1 292 - -#define IDS_INSTALL_DESC2 304 -#define IDS_ACTION_INSTALLFILE 305 -#define IDS_ACTION_UNINSTALLFILE 306 -#define IDS_ACTION_PRUNEFILES 307 -#define IDS_FILTER_ALLFILES 308 -#define IDS_ACTION_RENAMEFILESET 309 -#define IDS_RECUR_DAILY 310 -#define IDS_RECUR_SUNDAY 311 -#define IDS_RECUR_MONDAY 312 -#define IDS_RECUR_TUESDAY 313 -#define IDS_RECUR_WEDNESDAY 314 -#define IDS_RECUR_THURSDAY 315 -#define IDS_RECUR_FRIDAY 316 -#define IDS_RECUR_SATURDAY 317 - -#define IDS_ACTION_CREATESERVICE 320 -#define IDS_ACTION_DELETESERVICE 321 -#define IDS_ACTION_RELEASEFILESET 322 -#define IDS_ACTION_UPDATEFILESET 323 -#define IDS_ACTION_UPDATEALL 324 -#define IDS_UPDATE_FAILED 325 -#define IDS_ACTION_GETDATES 326 -#define IDS_LASTMODIFIED 327 -#define IDS_SVR_SECURITY_TITLE 328 -#define IDS_SVR_LIST_TAB 329 -#define IDS_ACTION_ADMINLIST_LOAD 330 -#define IDS_ACTION_ADMINLIST_SAVE 331 -#define IDS_ADMCOL_PRINCIPAL 332 -#define IDS_ADMCOL_TYPE 333 -#define IDS_ADMCOL_TYPE_GROUP 334 - -#define IDS_ACTION_RESTORE 336 -#define IDS_COL_AGGS_RESTORE 337 -#define IDS_RESTORE_FILTER 338 -#define IDS_SVC_BOS_TAB 339 -#define IDS_ACTION_SETRESTART 340 -#define IDS_RESTORE_CREATESET 341 -#define IDS_RESTORE_OVERWRITESET 342 -#define IDS_SUBSET_TITLE_LOAD 343 -#define IDS_SUBSET_TITLE_SAVE 344 -#define IDS_BUTTON_OPEN 345 -#define IDS_BUTTON_SAVE 346 -#define IDS_SUBSET_SAVE_TITLE 347 -#define IDS_SUBSET_SAVE_DESC 348 -#define IDS_SUBSET_CHANGED 349 -#define IDS_SUBSET_TAB 350 -#define IDS_SUBSET_DISCARD_TITLE 351 - -#define IDS_SUBSET_DISCARD_DESC 352 -#define IDS_SUBSET_DISCARD_DESC2 353 -#define IDS_SUBSET_NONAME 354 -#define IDS_SUBSET_NOSUBSET 355 -#define IDS_SUBSET_SERVERSUBSET 356 -#define IDS_FILESET_SOME 357 -#define IDS_AGGREGATE_SOME 358 -#define IDS_SERVICE_SOME 359 -#define IDS_FILESET_UNMON 360 -#define IDS_AGGREGATE_UNMON 361 -#define IDS_SERVICE_UNMON 362 -#define IDS_SUBSET_DELETE_TITLE 363 -#define IDS_SUBSET_DELETE_DESC 364 -#define IDS_ERROR_TRANSLATED 365 -#define IDS_ERROR_NOTTRANSLATED 366 -#define IDS_FIND_NOTHING_TITLE 367 - -#define IDS_FIND_NOTHING_DESC 368 -#define IDS_FIND_UNKNOWN_TITLE 369 -#define IDS_FIND_UNKNOWN_DESC 370 -#define IDS_HELPABOUT_DESC1 371 -#define IDS_HELPABOUT_DESC2 372 -#define IDS_HELPABOUT_DESC3 373 -#define IDS_CANT_QUIT_TITLE 374 -#define IDS_CANT_QUIT_REBOOT 375 -#define IDS_APP_TITLE 376 -#define IDS_ACTION_OPENCELL 377 -#define IDS_OPTIONS_TITLE 378 -#define IDS_OPTIONS_GENERAL_TAB 379 -#define IDS_BADCREDS_DESC 380 - -#define IDS_CONFIRMATION_TITLE 384 -#define IDS_NO_GROUP_CHECKBOX 385 -#define IDS_AFS_ID_DIDEXP 386 - -#define IDS_QUERYING 400 -#define IDS_ADMCOL_TYPE_FOREIGN_GROUP 401 -#define IDS_ADMCOL_TYPE_FOREIGN_USER 402 - -#define IDS_SVCCOL_NOTIFIER 416 -#define IDS_SVC_NONOTIFIER 417 -#define IDS_SVR_KEY_TAB 418 -#define IDS_KEYNAME_NOTIME 419 -#define IDS_KEYNAME_WITHTIME 420 -#define IDS_SVRKEY_VERSION 421 -#define IDS_SVRKEY_DATA 422 -#define IDS_SVRKEY_CHECKSUM 423 -#define IDS_SVRKEY_DATA_UNKNOWN 424 -#define IDS_STARTSERVICE_TITLE 425 -#define IDS_STOPSERVICE_TITLE 426 -#define IDS_STARTSERVICE_TEXT 427 - -#define IDS_STOPSERVICE_TEXT 432 -#define IDS_STARTSERVICE_STARTUP 433 -#define IDS_STOPSERVICE_STARTUP 434 -#define IDS_STARTSERVICE_PERMANENT 435 -#define IDS_STARTSERVICE_TEMPORARY 436 -#define IDS_STOPSERVICE_PERMANENT 437 -#define IDS_STOPSERVICE_TEMPORARY 438 -#define IDS_ACTION_EXECUTE 439 -#define IDS_ACTION_SALVAGE_SVR 440 -#define IDS_ACTION_SALVAGE_AGG 441 -#define IDS_ACTION_SALVAGE_VOL 442 -#define IDS_SALVAGE_SVR 443 -#define IDS_SALVAGE_AGG 444 -#define IDS_SALVAGE_SET 445 -#define IDS_SETSTATUS_SALVAGE 446 - -#define IDS_SETSTATUS_LOCKED 448 -#define IDS_SETSTATUS_NO_VOL 449 -#define IDS_SETSTATUS_BUSY 450 -#define IDS_SETSTATUS_MOVED 451 -#define IDS_SVR_CAPACITY 452 -#define IDS_SVR_ALLOCATION 453 -#define IDS_SVRCOL_ADDRESS 454 -#define IDS_HOST_TITLE 456 -#define IDS_SVR_HOSTS_TITLE 457 -#define IDS_SVR_HOST_TAB 458 -#define IDS_ACTION_HOSTLIST_LOAD 459 -#define IDS_ACTION_HOSTLIST_SAVE 460 -#define IDS_SETSTATUS_1ALERT 461 -#define IDS_SETSTATUS_2ALERT 462 - -#define IDS_ACTION_CHANGEADDR 464 - -#define IDS_COMMAND_VOS_ADDSITE 480 -#define IDS_COMMAND_VOS_BACKUP 481 -#define IDS_COMMAND_VOS_BACKUPSYS 482 -#define IDS_COMMAND_VOS_CREATE 483 - -#define IDS_COMMAND_VOS_DELENTRY 496 -#define IDS_COMMAND_VOS_DUMP 497 -#define IDS_COMMAND_VOS_EXAMINE 498 -#define IDS_COMMAND_VOS_LISTPART 499 -#define IDS_COMMAND_VOS_LISTVLDB 500 -#define IDS_COMMAND_VOS_LISTVOL 501 -#define IDS_COMMAND_VOS_LOCK 502 -#define IDS_COMMAND_VOS_MOVE 503 -#define IDS_COMMAND_VOS_PARTINFO 504 -#define IDS_COMMAND_VOS_RELEASE 505 -#define IDS_COMMAND_VOS_REMOVE 506 -#define IDS_COMMAND_VOS_REMSITE 507 -#define IDS_COMMAND_VOS_RENAME 508 -#define IDS_COMMAND_VOS_RESTORE 509 -#define IDS_COMMAND_VOS_SYNCVLDB 510 -#define IDS_COMMAND_VOS_UNLOCK 511 - -#define IDS_COMMAND_VOS_UNLOCKVLDB 512 -#define IDS_COMMAND_VOS_ZAP 513 -#define IDS_COMMAND_BOS_ADDHOST 514 -#define IDS_COMMAND_BOS_ADDKEY 515 -#define IDS_COMMAND_BOS_ADDUSER 516 -#define IDS_COMMAND_BOS_CREATE 517 -#define IDS_COMMAND_BOS_DELETE 518 -#define IDS_COMMAND_BOS_EXEC 519 -#define IDS_COMMAND_BOS_GETDATE 520 -#define IDS_COMMAND_BOS_GETLOG 521 -#define IDS_COMMAND_BOS_GETRESTART 522 -#define IDS_COMMAND_BOS_INSTALL 523 -#define IDS_COMMAND_BOS_LISTHOSTS 524 -#define IDS_COMMAND_BOS_LISTKEYS 525 -#define IDS_COMMAND_BOS_LISTUSERS 526 -#define IDS_COMMAND_BOS_PRUNE 527 - -#define IDS_COMMAND_BOS_REMOVEHOST 528 -#define IDS_COMMAND_BOS_REMOVEKEY 529 -#define IDS_COMMAND_BOS_REMOVEUSER 530 -#define IDS_COMMAND_BOS_RESTART 531 -#define IDS_COMMAND_BOS_SALVAGE 532 -#define IDS_COMMAND_BOS_SETAUTH 533 -#define IDS_COMMAND_BOS_SETRESTART 534 -#define IDS_COMMAND_BOS_SHUTDOWN 535 -#define IDS_COMMAND_BOS_START 536 -#define IDS_COMMAND_BOS_STARTUP 537 -#define IDS_COMMAND_BOS_STATUS 538 -#define IDS_COMMAND_BOS_STOP 539 -#define IDS_COMMAND_BOS_UNINSTALL 540 -#define IDS_COMMAND_KAS_GETRANDOMKEY 541 -#define IDS_COMMAND_FS_LISTQUOTA 542 -#define IDS_COMMAND_FS_QUOTA 543 - -#define IDS_COMMAND_FS_SETQUOTA 544 - -#define IDS_ALERT_DESCSHORT_UNMONITORED 560 -#define IDS_ALERT_DESCSHORT_TIMEOUT 561 -#define IDS_ALERT_DESCSHORT_AGG_FULL 562 -#define IDS_ALERT_DESCSHORT_SET_FULL 563 -#define IDS_ALERT_DESCSHORT_NO_VLDBENT 564 -#define IDS_ALERT_DESCSHORT_NO_SVRENT_SET 565 -#define IDS_ALERT_DESCSHORT_STOPPED 566 -#define IDS_ALERT_DESCSHORT_NO_SVRENT_AGG 567 -#define IDS_ALERT_DESCSHORT_BADCREDS 568 -#define IDS_ALERT_DESCSHORT_AGG_ALLOC 569 -#define IDS_ALERT_DESCSHORT_STATE_NO_VNODE 570 -#define IDS_ALERT_DESCSHORT_STATE_NO_SERVICE 571 -#define IDS_ALERT_DESCSHORT_STATE_OFFLINE 572 - -#define IDS_ALERT_DESCFULL_TIMEOUT 576 - -#define IDS_ALERT_DESCFULL_AGG_FULL 592 -#define IDS_ALERT_DESCFULL_SET_FULL 593 -#define IDS_ALERT_DESCFULL_NO_VLDBENT 594 -#define IDS_ALERT_DESCFULL_NO_SVRENT_SET 595 -#define IDS_ALERT_DESCFULL_STOPPED 596 -#define IDS_ALERT_DESCFULL_NO_SVRENT_AGG 597 -#define IDS_ALERT_DESCFULL_BADCREDS 598 -#define IDS_ALERT_DESCFULL_AGG_ALLOC 599 -#define IDS_ALERT_DESCFULL_STATE_NO_VNODE 600 -#define IDS_ALERT_DESCFULL_STATE_NO_SERVICE 601 -#define IDS_ALERT_DESCFULL_STATE_OFFLINE 602 - -#define IDS_ALERT_FIX_TIMEOUT 608 -#define IDS_ALERT_FIX_AGG_FULL 609 -#define IDS_ALERT_FIX_SET_FULL 610 - -#define IDS_ALERT_FIX_NO_VLDBENT 624 -#define IDS_ALERT_FIX_NO_SVRENT_SET 625 -#define IDS_ALERT_FIX_STOPPED 626 -#define IDS_ALERT_FIX_NO_SVRENT_AGG 627 -#define IDS_ALERT_FIX_BADCREDS 628 -#define IDS_ALERT_FIX_AGG_ALLOC 629 -#define IDS_ALERT_FIX_STATE_NO_VNODE 630 -#define IDS_ALERT_FIX_STATE_NO_SERVICE 631 -#define IDS_ALERT_FIX_STATE_OFFLINE 632 - -#define IDS_ALERT_BUTTON_TRYAGAIN 640 -#define IDS_ALERT_BUTTON_WARNINGS 641 -#define IDS_ALERT_BUTTON_VIEWLOG 642 -#define IDS_ALERT_BUTTON_SHOWME 643 -#define IDS_ALERT_BUTTON_GETCREDS 644 - -#define IDS_ERROR_REFRESH_CELLSERVERS_NOCELL 656 -#define IDS_ERROR_REFRESH_CELLSERVERS 657 -#define IDS_ERROR_CANT_OPEN_CELL 658 -#define IDS_ERROR_REFRESH_AGGREGATES 659 -#define IDS_ERROR_REFRESH_SERVER_STATUS 660 -#define IDS_ERROR_CHANGE_SERVER_STATUS 661 -#define IDS_ERROR_REFRESH_AGGREGATE_STATUS 662 - -#define IDS_ERROR_REFRESH_FILESET_STATUS 672 -#define IDS_ERROR_REFRESH_SERVICE_STATUS 673 -#define IDS_ERROR_MOVE_FILESET 674 -#define IDS_ERROR_VIEW_LOGFILE 675 -#define IDS_ERROR_NOT_REPLICATED 676 -#define IDS_ERROR_CANT_CREATE_FILESET 677 -#define IDS_ERROR_CANT_DELETE_FILESET 678 -#define IDS_ERROR_CANT_CREATE_VLDB_ENTRY 679 -#define IDS_ERROR_CANT_SET_FILESET_QUOTA 680 -#define IDS_ERROR_CANT_CREATE_SERVER 681 -#define IDS_ERROR_CANT_PING_SERVER 682 -#define IDS_ERROR_CANT_DELETE_SERVER 683 -#define IDS_ERROR_CANT_DELETE_SERVER_FILESETS 684 -#define IDS_ERROR_CHANGE_AGGREGATE_STATUS 685 -#define IDS_ERROR_CHANGE_SERVICE_STATUS 686 -#define IDS_ERROR_CANT_START_SERVICE 687 - -#define IDS_ERROR_CANT_STOP_SERVICE 688 -#define IDS_ERROR_CANT_RESTART_SERVICE 689 -#define IDS_ERROR_CHANGE_REPLICA_STATUS 690 -#define IDS_ERROR_CANT_SYNCVLDB 691 -#define IDS_ERROR_CANT_CREATE_REPLICA 692 -#define IDS_ERROR_CANT_INSTALL_FILE 693 -#define IDS_ERROR_CANT_UNINSTALL_FILE 694 -#define IDS_ERROR_CANT_PRUNE_FILES 695 -#define IDS_ERROR_CANT_RENAME_FILESET 696 -#define IDS_ERROR_CANT_CREATE_SERVICE 697 -#define IDS_ERROR_CANT_DELETE_SERVICE 698 -#define IDS_ERROR_CANT_RELEASE_FILESET 699 -#define IDS_ERROR_CANT_UPDATE_FILESET 700 -#define IDS_ERROR_CANT_UPDATE_ALL 701 - -#define IDS_ERROR_CANT_LOAD_ADMLIST 704 -#define IDS_ERROR_CANT_LOAD_KEYLIST 705 -#define IDS_ERROR_CANT_CREATE_KEY 706 -#define IDS_ERROR_CANT_SAVE_ADMLIST 707 -#define IDS_ERROR_CANT_CLONE 708 -#define IDS_ERROR_CANT_CLONESYS 709 -#define IDS_ERROR_CANT_DUMP_FILESET 710 -#define IDS_ERROR_CANT_RESTORE_FILESET 711 -#define IDS_ERROR_CANT_SET_RESTART_TIMES 712 -#define IDS_ERROR_CANT_DELETE_REPLICATED_FILESET 713 -#define IDS_CMDLINE_TITLE 714 -#define IDS_CMDLINE_SYNTAX 715 -#define IDS_CMDLINE_UNRECOGNIZED 716 -#define IDS_CMDLINE_DUPLICATE 717 -#define IDS_CMDLINE_UNEXPECTVALUE 718 -#define IDS_CMDLINE_MISSINGVAL 719 - -#define IDS_CMDLINE_SUBSETNOTCELL 720 -#define IDS_CMDLINE_INVALIDSUBSET 721 -#define IDS_CMDLINE_SERVERNOTCELL 722 -#define IDS_CMDLINE_RESET_TITLE 723 -#define IDS_CMDLINE_RESET_DESC 724 -#define IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE 725 -#define IDS_CMDLINE_USERPASSWORD 726 -#define IDS_ERROR_CANT_DELETE_KEY 727 -#define IDS_ERROR_CANT_GETRANDOMKEY 728 -#define IDS_ERROR_CANT_EXECUTE_COMMAND 729 -#define IDS_ERROR_CANT_READ_SALVAGE_LOG 730 -#define IDS_ERROR_CANT_SALVAGE 731 -#define IDS_ERROR_CANT_AUTH_ON 732 -#define IDS_ERROR_CANT_AUTH_OFF 733 -#define IDS_ERROR_CANT_LOAD_HOSTLIST 734 -#define IDS_ERROR_CANT_SAVE_HOSTLIST 735 - -#define IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL 736 -#define IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN 737 -#define IDS_ERROR_CANT_CHANGEADDR 738 - -#define IDS_SERVER_SERVICE 752 -#define IDS_SERVICETYPE_SIMPLE 753 -#define IDS_SERVICETYPE_CRON 754 -#define IDS_SERVICESTATE_STOPPED 755 -#define IDS_SERVICESTATE_STOPPING 756 -#define IDS_SERVICESTATE_STARTING 757 -#define IDS_SERVICESTATE_RUNNING 758 -#define IDS_SERVICETYPE_FS_LONG 759 -#define IDS_SERVICETYPE_FS 760 -#define IDS_SERVICE_LASTERROR 761 -#define IDS_SERVICES_IN_CELL 762 -#define IDS_SERVICE_STARTDATE 763 -#define IDS_SERVICE_STOPDATE 764 - -#define IDC_CELL 1000 -#define IDC_SERVERS 1001 -#define IDC_TABS 1002 -#define IDC_SPLITTER_SERVER 1004 -#define IDC_SET_LOCK 1006 -#define IDC_SVC_LIST 1007 -#define IDC_SET_UNLOCK 1007 -#define IDC_SVC_RESTART 1008 -#define IDC_SET_QUOTA 1008 -#define IDC_SVC_CREATE 1009 -#define IDC_SVC_DELETE 1010 -#define IDC_AGG_LIST 1011 -#define IDC_SET_LIST 1012 -#define IDC_SET_CREATE 1013 -#define IDC_SET_DELETE 1015 -#define IDC_CELL_BORDER 1016 -#define IDC_SET_REP 1016 -#define IDC_SVC_DESC 1017 -#define IDC_AGG_DESC 1018 -#define IDC_SET_DESC 1019 -#define IDC_SVR_WARN_SETFULL_PERCENT 1028 -#define IDC_AGG_WARN_AGGFULL_DESC 1029 -#define IDC_SET_WARN_SETFULL_DESC 1030 -#define IDC_SVR_WARN_AGGFULL 1031 -#define IDC_SVR_WARN_SETFULL 1032 -#define IDC_SVR_WARN_SVCSTOP 1033 -#define IDC_SVR_WARN_TIMEOUT 1034 -#define IDC_SVR_WARN_AGGALLOC 1035 -#define IDC_SVR_WARN_SETNOVLDB 1036 -#define IDC_SVR_LISTS_ADD 1037 -#define IDC_SVR_WARN_SETNOSERV 1037 -#define IDC_LIST_ADD 1037 -#define IDC_SVR_LISTS_DELETE 1038 -#define IDC_SVR_WARN_AGGNOSERV 1038 -#define IDC_LIST_REMOVE 1038 -#define IDC_SVR_LISTS_EDIT 1039 -#define IDC_SVR_LISTS_LIST 1040 -#define IDC_LIST_LIST 1040 -#define IDC_SVR_WARN_AGGFULL_PERCENT 1042 -#define IDC_SVR_AUTOREFRESH 1050 -#define IDC_SVR_AUTOREFRESH_MINUTES 1051 -#define IDC_AGG_NAME 1052 -#define IDC_SVR_SETAUTH 1052 -#define IDC_AGG_ID 1053 -#define IDC_AGG_DEVICE 1054 -#define IDC_AGG_USAGE 1056 -#define IDC_AGG_USAGEBAR 1057 -#define IDC_AGG_FILESETS 1058 -#define IDC_SVR_NAME 1069 -#define IDC_SVR_SETQUOTA 1071 -#define IDC_SVR_SETQUOTA_INFINITE 1072 -#define IDC_SVR_NUMFILESETS 1073 -#define IDC_SVR_NUMAGGREGATES 1074 -#define IDC_SVR_OWNER 1075 -#define IDC_SVR_CAPACITY 1075 -#define IDC_SVR_GROUP 1076 -#define IDC_SVR_ALLOCATION 1076 -#define IDC_SVR_LOAD 1077 -#define IDC_SVC_NAME 1082 -#define IDC_SVC_TYPE 1083 -#define IDC_SVC_VIEWLOG 1084 -#define IDC_SVC_PARAMS 1086 -#define IDC_SVC_STATUS 1087 -#define IDC_SVC_TYPE_CRON_WHEN 1087 -#define IDC_AGG_WARN 1088 -#define IDC_SVC_START 1089 -#define IDC_SVC_LOGFILE 1089 -#define IDC_AGG_WARNALLOC 1089 -#define IDC_SVC_STARTDATE 1090 -#define IDC_AGG_WARN_AGGFULL 1090 -#define IDC_SVC_COMMAND 1090 -#define IDC_SVC_STOPDATE 1091 -#define IDC_AGG_WARN_AGGFULL_PERCENT 1091 -#define IDC_AGG_WARN_AGGFULL_DEF 1092 -#define IDC_SVC_LASTERROR 1092 -#define IDC_SET_NAME 1093 -#define IDC_SVC_WARNSTOP 1093 -#define IDC_SET_CREATEDATE 1094 -#define IDC_SET_SERVER 1094 -#define IDC_SVC_STOP 1094 -#define IDC_SET_UPDATEDATE 1095 -#define IDC_SET_AGGREGATE 1095 -#define IDC_SVC_NOTIFIER 1095 -#define IDC_SET_USAGE 1096 -#define IDC_SET_USAGEBAR 1097 -#define IDC_SET_WARN 1098 -#define IDC_SET_WARN_SETFULL_DEF 1099 -#define IDC_SET_WARN_SETFULL 1100 -#define IDC_SET_WARN_SETFULL_PERCENT 1101 -#define IDC_SET_LOCKS 1102 -#define IDC_SET_STATUS 1102 -#define IDC_SET_ACCESSDATE 1103 -#define IDC_SET_BACKUPDATE 1104 -#define IDC_SET_ID 1105 -#define IDC_SET_VERSION 1106 -#define IDC_SET_FILES 1106 -#define IDC_SET_LOAD 1107 -#define IDC_SVC_TYPE_SIMPLE 1109 -#define IDC_SVC_TYPE_CRON 1110 -#define IDC_SVC_TYPE_FS 1111 -#define IDC_SVC_TYPE_CRON_WHENPROMPT 1112 -#define IDC_SET_REPTYPE_RELEASE 1114 -#define IDC_SET_REPTYPE_SCHEDULED 1115 -#define IDC_SET_RELEASE 1116 -#define IDC_SET_UPDATE 1117 -#define IDC_SET_REP_MAXAGE 1118 -#define IDC_SET_REP_FAILAGE 1119 -#define IDC_SET_REP_LIST 1119 -#define IDC_SET_REP_RECWAIT 1120 -#define IDC_SET_REPSITE_ADD 1120 -#define IDC_SET_REPSITE_EDIT 1121 -#define IDC_SET_REP_DEFSITEAGE 1122 -#define IDC_SET_REPSITE_DELETE 1122 -#define IDC_AFS_LOGIN 1123 -#define IDC_AFS_ID 1124 -#define IDC_AFS_PASSWORD 1125 -#define IDC_AFS_CURRENTID 1129 -#define IDC_AFS_EXPDATE 1130 -#define IDC_TIMEOUT_WAIT 1134 -#define IDC_TIMEOUT_KILL 1135 -#define IDC_TIMEOUT_ELAPSED 1136 -#define IDC_SVR_ADDRESSES 1140 -#define IDC_SVR_CHOWN 1141 -#define IDC_SVR_CHGRP 1142 -#define IDC_COLUMNS 1142 -#define IDC_SVR_CHADDR 1143 -#define IDC_COL_AVAIL 1144 -#define IDC_COL_INSERT 1145 -#define IDC_COL_DELETE 1146 -#define IDC_COL_SHOWN 1147 -#define IDC_COL_UP 1148 -#define IDC_COL_DOWN 1149 -#define IDC_REFRESH_PERCENTBAR 1149 -#define IDC_REFRESH_PERCENT 1150 -#define IDC_REFRESH_CURRENT 1151 -#define IDC_REFRESH_DESC 1152 -#define IDC_AGG_CREATESET 1153 -#define IDC_SVR_TITLE 1156 -#define IDC_SVR_GROUP_NONE 1157 -#define IDC_DELSET_DESC 1163 -#define IDC_DELSET_SERVER 1165 -#define IDC_DELSET_VLDB 1166 -#define IDC_SVC_RUNNOW 1166 -#define IDC_CLONESET_ONE 1167 -#define IDC_CLONE_ONE 1167 -#define IDC_CLONESET_MULTIPLE 1168 -#define IDC_CLONE_MULTIPLE 1168 -#define IDC_DUMP_LIMIT_TIME 1168 -#define IDC_CLONESET_SVR_LIMIT 1169 -#define IDC_CLONE_SVR_LIMIT 1169 -#define IDC_DUMP_LIMIT_VERSION 1169 -#define IDC_CLONESET_SVR 1170 -#define IDC_CLONE_SVR 1170 -#define IDC_CLONESET_AGG_LIMIT 1171 -#define IDC_CLONE_AGG_LIMIT 1171 -#define IDC_CLONESET_AGG 1172 -#define IDC_CLONE_AGG 1172 -#define IDC_CLONESET_PREFIX_LIMIT 1173 -#define IDC_CLONE_PREFIX_LIMIT 1173 -#define IDC_CLONESET_PREFIX 1174 -#define IDC_CLONE_PREFIX 1174 -#define IDC_PROBLEM_SCROLL 1176 -#define IDC_PROBLEM_TEXT 1178 -#define IDC_PROBLEM_REMEDY 1181 -#define IDC_PROBLEM_HEADER 1185 -#define IDC_PROBLEM_TITLE 1189 -#define IDC_SET_SETQUOTA 1189 -#define IDC_MOVESET_DESC 1190 -#define IDC_MOVESET_SERVER 1191 -#define IDC_REPSET_DESC 1192 -#define IDC_REPSET_DESC2 1193 -#define IDC_ANIMATE 1196 -#define IDC_SET_ENABLE 1197 -#define IDC_SET_DISABLE 1198 -#define IDC_PROBLEM_BOX 1198 -#define IDC_VIEWLOG_DESC 1199 -#define IDC_VIEWLOG_SERVER 1200 -#define IDC_VIEWLOG_FILENAME 1201 -#define IDC_SVC_VIEWLOG_DESC 1202 -#define IDC_SVC_VIEWLOG_FILENAME 1203 -#define IDC_VIEWLOG_TEXT 1204 -#define IDC_SVC_VIEWLOG_CONTENTS 1205 -#define IDC_VIEWLOG_SAVEAS 1207 -#define IDC_REPSET_TYPE 1209 -#define IDC_REPSET_TITLE 1210 -#define IDC_REPSET_ADVANCED 1211 -#define IDC_SET_REP_MAXAGE_PROMPT 1212 -#define IDC_SET_REP_FAILAGE_PROMPT 1213 -#define IDC_SET_REP_RECWAIT_PROMPT 1214 -#define IDC_SET_REP_MINDELAY_PROMPT 1215 -#define IDC_SET_REP_DEFSITEAGE_PROMPT 1216 -#define IDC_SET_REP_MINDELAY 1217 -#define IDC_SET_CLONE 1218 -#define IDC_SET_QUOTA_UNITS 1220 -#define IDC_SVR_ADDR 1225 -#define IDC_SVR_ADDR_ADD 1226 -#define IDC_SVR_ADDR_UP 1227 -#define IDC_SVR_ADDR_DOWN 1228 -#define IDC_SVR_ADDR_REMOVE 1229 -#define IDC_SVR_ADDR_PING 1230 -#define IDC_SVR_ADDR_DESC 1231 -#define IDC_AGG_PROPERTIES 1234 -#define IDC_ACTION_DESC 1235 -#define IDC_ACTION_LIST 1236 -#define IDC_SVC_DESC2 1241 -#define IDC_SYNC_DESC 1242 -#define IDC_SYNC_DESC2 1243 -#define IDC_BROWSE 1247 -#define IDC_SERVER 1248 -#define IDC_FILENAME 1249 -#define IDC_DIRECTORY 1250 -#define IDC_DATE_FILE 1250 -#define IDC_INSTALL_DESC 1251 -#define IDC_DATE_BAK 1251 -#define IDC_OP_RESTORE 1252 -#define IDC_DATE_OLD 1252 -#define IDC_OP_UNINSTALL 1253 -#define IDC_OP_DELETE_CORE 1253 -#define IDC_OP_DELETE_BAK 1254 -#define IDC_RENSET_DESC 1254 -#define IDC_OP_DELETE_OLD 1255 -#define IDC_RENSET_OLD 1255 -#define IDC_RENSET_NEW 1256 -#define IDC_SVC_RUNDAY 1257 -#define IDC_SVC_RUNTIME 1258 -#define IDC_SVC_SERVER 1259 -#define IDC_DUMP_DATE 1259 -#define IDC_DELSVR_DESC 1261 -#define IDC_UPDATE_DETAILS 1262 -#define IDC_UPDATE_DESC 1263 -#define IDC_LIST_NAME 1264 -#define IDC_CLONESYS_DETAILS 1269 -#define IDC_DUMP_FILENAME 1271 -#define IDC_DUMP_FULL 1272 -#define IDC_DUMP_TIME 1274 -#define IDC_DUMP_VERSION 1275 -#define IDC_RESTORE_FILENAME 1276 -#define IDC_RESTORE_BROWSE 1277 -#define IDC_RESTORE_SETNAME 1280 -#define IDC_RESTORE_CREATE 1281 -#define IDC_RESTORE_SERVER 1282 -#define IDC_BOS_GENRES 1283 -#define IDC_BOS_GENRES_DESC1 1284 -#define IDC_BOS_GENRES_DESC2 1285 -#define IDC_BOS_GENRES_DATE 1286 -#define IDC_BOS_GENRES_TIME 1287 -#define IDC_BOS_BINRES 1288 -#define IDC_DUMPSET_DESC 1288 -#define IDC_BOS_BINRES_DESC1 1289 -#define IDC_RESTORESET_DESC 1289 -#define IDC_BOS_BINRES_DESC2 1290 -#define IDC_UPDATESET_DESC 1290 -#define IDC_BOS_BINRES_DATE 1291 -#define IDC_CLONE_ALL 1291 -#define IDC_BOS_BINRES_TIME 1292 -#define IDC_CLONE_SOME 1292 -#define IDC_CLONE_DESC 1293 -#define IDC_ADVANCED 1294 -#define IDC_ADVANCED_GROUP 1295 -#define IDC_MON_ALL 1296 -#define IDC_MON_ONE 1297 -#define IDC_MON_SERVER 1298 -#define IDC_MON_SOME 1299 -#define IDC_MON_SUBSET 1300 -#define IDC_SUBSET_LIST 1301 -#define IDC_SUBSET_NAME 1302 -#define IDC_SUBSET_LOAD 1303 -#define IDC_SUBSET_SAVE 1304 -#define IDC_SUBSET_ALL 1305 -#define IDC_SUBSET_DELETE 1306 -#define IDC_FIND_COMMAND 1306 -#define IDC_SUBSET_NONE 1307 -#define IDC_SUBSET_RENAME 1307 -#define IDC_ERROR_NUMBER 1307 -#define IDC_ERROR_TRANSLATE 1308 -#define IDC_ADVANCED_BOX 1309 -#define IDC_HELPABOUT_ICON 1310 -#define IDC_HELPABOUT_DESC 1311 -#define IDC_OPENCELL_DESC 1313 -#define IDC_OPT_SVR_LONGNAMES 1315 -#define IDC_OPT_SVR_DBL_PROP 1316 -#define IDC_OPT_SVR_OPENMON 1317 -#define IDC_OPT_SVR_DBL_DEPENDS 1318 -#define IDC_OPT_SVR_DBL_OPEN 1319 -#define IDC_OPT_SVR_CLOSEUNMON 1320 -#define IDC_OPT_WARN_BADCREDS 1321 -#define IDC_DELSVR_FILESETS 1324 -#define IDC_DUMP_BROWSE 1325 -#define IDC_REFRESH_SKIP 1326 -#define IDC_KEY_LIST 1328 -#define IDC_KEY_NAME 1329 -#define IDC_KEY_ADD 1330 -#define IDC_KEY_REMOVE 1331 -#define IDC_KEY_TITLE 1332 -#define IDC_KEY_VERSION 1333 -#define IDC_KEY_STRING 1334 -#define IDC_KEY_BYSTRING 1335 -#define IDC_KEY_DATA 1336 -#define IDC_KEY_BYDATA 1337 -#define IDC_KEY_RANDOM 1338 -#define IDC_STARTSTOP_TEXT 1342 -#define IDC_STARTSTOP_PERMANENT 1343 -#define IDC_STARTSTOP_TEMPORARY 1344 -#define IDC_STARTSTOP_STARTUP 1345 -#define IDC_COMMAND 1346 -#define IDC_ADVANCEDBOX 1347 -#define IDC_SET_REP_SITEAGE_PROMPT 1348 -#define IDC_SET_REP_SITEAGE 1349 -#define IDC_DELSVC_DESC 1350 -#define IDC_AGGREGATE_ALL 1353 -#define IDC_AGGREGATE 1354 -#define IDC_FILESET 1355 -#define IDC_FILESET_ALL 1356 -#define IDC_SALVAGE_TEMPDIR 1358 -#define IDC_SALVAGE_LOG_FILE 1359 -#define IDC_SALVAGE_LOG_INODES 1360 -#define IDC_SALVAGE_LOG_ROOT 1361 -#define IDC_SALVAGE_SIMUL 1362 -#define IDC_SALVAGE_NUM 1363 -#define IDC_SALVAGE_READONLY 1364 -#define IDC_SALVAGE_TITLE 1365 -#define IDC_SALVAGE_DETAILS 1366 -#define IDC_SALVAGE_BLOCK 1367 -#define IDC_RELSET_DESC 1367 -#define IDC_SALVAGE_FORCE 1368 -#define IDC_RELSET_NORMAL 1368 -#define IDC_SALVAGE_FIXDIRS 1369 -#define IDC_RELSET_FORCE 1369 -#define IDC_SVR_AUTH_YES 1369 -#define IDC_SVR_AUTH_NO 1370 -#define IDC_HOST_TITLE 1372 -#define IDC_HOST_ADD 1374 -#define IDC_HOST_REMOVE 1375 -#define IDC_HOST_LIST 1376 -#define IDC_ADDHOST_DESC 1377 -#define IDC_ADDHOST_HOST 1379 -#define IDC_RESTORE_INCREMENTAL 1380 -#define IDC_SVR_CHANGEADDR 1381 -#define IDC_ADDR_CHANGE 1382 -#define IDC_ADDR_REMOVE 1383 -#define IDC_TITLE 1384 -#define IDC_ADDRESS 1385 -#define IDD_MAIN 3000 -#define IDD_SERVICES 3001 -#define IDD_AGGREGATES 3002 -#define IDD_FILESETS 3003 -#define IDD_SUBSET_LOADSAVE 3004 -#define ACCEL_MAIN 3005 -#define MENU_MAIN 3006 -#define IDI_MAIN 3007 -#define MENU_SVR 3014 -#define MENU_AGG 3015 -#define MENU_SVC 3016 -#define MENU_AGG_NONE 3017 -#define MENU_SVR_NONE 3018 -#define MENU_SVC_NONE 3019 -#define MENU_SET 3020 -#define MENU_SET_NONE 3021 -#define MENU_COLUMNS 3022 -#define MENU_SVC_BOS 3023 -#define IDD_AGG_GENERAL 3024 -#define MENU_SET_DRAGDROP 3024 -#define IDD_SVR_LISTS 3025 -#define IDD_SVR_GENERAL 3028 -#define IDD_SVR_SCOUT 3030 -#define IDD_SVC_GENERAL 3031 -#define IDD_SET_GENERAL 3032 -#define IDD_SERVER 3034 -#define IDD_SVC_CREATE 3036 -#define IDD_SET_REPINFO 3037 -#define IDD_SET_REPSITES 3038 -#define IDD_OPENCELL 3039 -#define IDD_TIMEOUT 3042 -#define IDD_COLUMNS 3044 -#define IDD_REFRESHALL 3045 -#define IDD_SVR_CREATE 3046 -#define IDD_SET_CREATE 3047 -#define IDD_SET_DELETE 3048 -#define IDD_SET_CLONE 3049 -#define IDD_SVC_PROBLEMS 3050 -#define IDD_SVR_PROBLEMS 3051 -#define IDD_AGG_PROBLEMS 3052 -#define IDD_SET_PROBLEMS 3053 -#define IDD_SET_MOVETO 3054 -#define IDD_SET_MOVING 3055 -#define IDI_INSTALL 3055 -#define IDD_SVC_STARTSTOP 3056 -#define IDI_ADMINLIST 3056 -#define IDD_SVC_LOGNAME 3057 -#define IDI_BTN_RENAME 3057 -#define IDD_SVC_VIEWLOG 3058 -#define IDI_BTN_DELETE 3058 -#define IDD_SET_NOTREP 3059 -#define IDI_UNINSTALL 3059 -#define IDD_SET_SETQUOTA 3060 -#define IDI_PRUNE 3060 -#define IDI_GETDATES 3061 -#define IDD_ACTIONS 3062 -#define IDI_SUBSET 3062 -#define IDD_SVR_SYNCVLDB 3063 -#define IDD_SET_CREATEREP 3065 -#define IDD_SVR_INSTALL 3066 -#define IDD_SVR_UNINSTALL 3067 -#define IDD_SVR_PRUNE 3068 -#define IDD_SET_RENAME 3069 -#define IDD_SVC_DELETE 3070 -#define IDD_SVR_DELETE 3071 -#define IDD_SVR_DELETE_CONFIRM 3072 -#define IDD_SVR_GETDATES 3074 -#define IDD_SVR_GETDATES_RESULTS 3075 -#define IDD_SVR_LISTS_SELECT 3076 -#define IDD_SET_CLONESYS_RESULTS 3077 -#define IDD_SET_DUMP 3078 -#define IDD_SET_RESTORE 3079 -#define IDD_SVC_BOS 3080 -#define IDD_SET_DUMPING 3081 -#define IDD_SET_RESTORING 3082 -#define IDD_SVR_KEYS 3083 -#define IDD_SET_CLONESYS 3084 -#define IDD_SUBSETS 3085 -#define IDD_HELP_FIND 3086 -#define IDD_HELP_ERROR 3087 -#define IDD_HELP_ABOUT 3088 -#define IDD_OPENINGCELL 3089 -#define IDD_OPTIONS_GENERAL 3090 -#define IDD_SET_DELREP 3091 -#define IDD_SET_DELCLONE 3092 -#define IDD_SVR_EXECUTE 3093 -#define IDD_SVC_START 3094 -#define IDD_SVC_STOP 3095 -#define IDD_SET_RELEASE 3096 -#define IDD_SVR_HOSTS 3097 -#define IDD_SVR_ADDHOST 3098 -#define IDD_SVR_ADDRESS 3099 -#define IDD_SVR_NEWADDR 3100 -#define IDD_SVR_SALVAGE_RESULTS 3101 -#define IDD_SVR_CREATEKEY 3102 -#define IDD_SVR_SALVAGE 3103 -#define M_DIVIDE_NONE 5005 -#define M_DIVIDE_V 5006 -#define M_DIVIDE_H 5007 -#define M_CELL_OPEN 5008 -#define M_EXIT 5009 -#define M_CREDENTIALS 5013 -#define M_PROPERTIES 5016 -#define M_SVC_START 5025 -#define M_SVC_DELETE 5026 -#define M_SVC_CREATE 5035 -#define M_SVC_RESTART 5037 -#define M_SVC_STOP 5040 -#define M_SVR_VIEW_LARGE 5042 -#define M_SVR_VIEW_SMALL 5043 -#define M_SVR_VIEW_REPORT 5044 -#define M_SVR_HOSTS 5045 -#define M_SET_DELETE 5048 -#define M_SET_REPLICATION 5049 -#define M_SET_RENAME 5050 -#define M_SET_LOCK 5051 -#define M_SET_UNLOCK 5052 -#define M_SET_RELEASE 5053 -#define M_SET_CLONE 5055 -#define M_SET_VIEW_REPORT 5058 -#define M_SET_VIEW_TREELIST 5059 -#define M_SET_VIEW_TREE 5060 -#define M_SET_CREATE 5061 -#define M_SVR_OPEN 5062 -#define M_SVR_CLOSEALL 5063 -#define M_SVR_CLOSE 5064 -#define M_REFRESH 5065 -#define M_REFRESHALL 5066 -#define M_COLUMNS 5067 -#define M_SVR_CREATE 5072 -#define M_SVR_DELETE 5073 -#define M_SYNCVLDB 5074 -#define M_SVR_INSTALL 5075 -#define M_SVR_PRUNE 5076 -#define M_SVR_UNINSTALL 5077 -#define M_SET_MOVETO 5079 -#define M_SVR_GETDATES 5080 -#define M_VIEWLOG 5081 -#define M_SET_UPDATE 5084 -#define M_SET_DUMP 5085 -#define M_HELP 5088 -#define M_HELP_FIND 5089 -#define M_HELP_XLATE 5090 -#define M_ABOUT 5091 -#define M_SET_MOVEHERE 5092 -#define M_SET_REPHERE 5093 -#define M_OPTIONS 5094 -#define M_ACTIONS 5095 -#define M_SET_SETQUOTA 5096 -#define M_EXPORT 5097 -#define M_SET_RESTORE 5099 -#define AVI_SETMOVE 5100 -#define M_SUBSET 5101 -#define M_SVR_MONITOR 5102 -#define M_VIEW_ONEICON 5103 -#define M_VIEW_TWOICONS 5104 -#define M_VIEW_STATUS 5105 -#define M_SVR_VIEW_ONEICON 5106 -#define M_SVR_VIEW_TWOICONS 5107 -#define M_SVR_VIEW_STATUS 5108 -#define M_KEY_RETURN 5109 -#define M_KEY_TAB 5110 -#define M_KEY_BACKTAB 5111 -#define M_KEY_MENU 5112 -#define M_KEY_ESC 5113 -#define M_KEY_CTRLTAB 5114 -#define M_KEY_CTRLBACKTAB 5115 -#define M_KEY_PROPERTIES 5116 -#define M_SVR_SECURITY 5117 -#define M_SALVAGE 5118 -#define M_EXECUTE 5119 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 3104 -#define _APS_NEXT_COMMAND_VALUE 5120 -#define _APS_NEXT_CONTROL_VALUE 1387 -#define _APS_NEXT_SYMED_VALUE 4000 -#endif -#endif diff --git a/src/WINNT/afssvrmgr/resource/admlist.ico b/src/WINNT/afssvrmgr/resource/admlist.ico deleted file mode 100644 index 492aa2abfba386dbcd194bee8a589fea3d75e684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmbV~J#GUb5QWE?NR*o@^_D4D+JZ7U5)uU^NWR$Kz*lhTay#rMlgC)*M{*Gv_A$J9 zAEH=@4w&=&L1kRth(1xjpc(ps4)l(dC?R`35<(;?-3wN1Y1=l`5{P~zQg#q#X_e(a zV;v!0#|He+;B_R}E(5{dFFnE5*uKHuDe<_KtzAIWJ2-$~-+8A* zDN%hy99)+dK7^JR-ZY={4x)LPqMJHib|vb0ksU@w{K!cgQ>^~pXgO(P_*vyh vbBn=}-xDN?(r$dLM` zW@t+~bjf^BO&yw>lcj+`h7{@4yHgx=5R=#6_fE29$D!@gC%?P*{r~BE@6HmLlag$1 zu8595FNl23ePyMPugr;jS`zGP6?wEE^5wk971o=~o6I>u!DteD{%B&v(rgwtt}K~N z>GgUTtosvdb;abPD!rULzIbaU`V=Q?k(b?KdAF{^7~{ExH*woLljf{E^_#fWPrKLK zxzmom0K=@KmgiTdmzf;eGR{U2oSL_1!{&-Q{aF3x%g5 z@r_*_BA$v1#5ZwJ8Bu2Kc`op%9S7_k>2x|X@oAptHm|F_>Fk}3we7s^3gC~`wyn)w z290+j3iUvqh=m7TsN-LZyp0{jRJM6jw&XQs8g~$feW0wByB(8MCQ)Gf4xcycG+Cjtrp>l)8XwFw?@aE&PKaa*F~fKeM=X6?M_4Q zjdZ!y;=a4wX*5*N=C@kh`8s)nG`bjTJ{Cnr4LiEw*6#9-rz1yxu`JT#+3)cVIB&i{ zpJRWA-|6>3f!v%w$$5I!q$z0Vi@R}U>D~psKYEh>{*%nl&&$HXf-EjB%IfN>T)K2g z*4NkN^5x4?tJP$Cds}YbzAd+I-ID9quS@eQD|hZ#*_Wqc<4Ascn#j{vujJdGf1!}R zEqrFcj0(}9Gw2LDqdJ3l8G;P&H&>pEfx*CFU@$N^Bp3_~1_lFzfx%(IU|=vX7#Iu;4jl#qgMq=o zU|=v79UKM@qa18DRF1;u>cis0;=|&;GAusDeG2&`^wg`@h zdTwi#gC0b1M9RSzbK6Z&1WN=<1VltZcLZRG2#j!wP(-ls$0QGX62TH_KOBpm2Hgd8 zFjyEY3>F3pgN4BzCm13aEDRQg2nNzH@rS{}U}3N@keZ1e1`C6Q!2)2ZACb%wXmRq% z;UoKSSeILUeECd%l)HED@(!-c{rmUj!Gj0#FQ6{ekGMJ8PtyC)2YSo>oVt{d4q`2=S`fmU5_$T{H zdFjK!^k-}3!}ju^n># zNz9k;mn*Xz@wj`S_HjJ);$cjQtuh|RRl;QZyD`>yJRar)D)d(?>MQSk>W`$iB+l~84*d1#8TAvJjCU%e5Zd|Fvj-U9o zvdb{BA7)+>SITiW@zQC0k)eps!lYjwCSLegmL<8?Un>_G3j3RI09lxYqt{sy$K5!t z?5y=Q!!+LWQjDWf7J4BtalBJ?87B73#bOOJJ&ay591aGWV`5K>SgeOSM(H$1VYjN& zSZ8$}lN^Pe=j1S*u{saUF__qSlHMH0P8XxFJD53(_KeFY)c^UjW7gw+t9nj7&bOX; lgtKYStZjJOYSSCG_y7E!^LX2AP;Aep{FXc7hpgSOe**|_l{WwY diff --git a/src/WINNT/afssvrmgr/resource/btn_delete.ico b/src/WINNT/afssvrmgr/resource/btn_delete.ico deleted file mode 100644 index 91e9e17cd6030733487472bdc5535e356f9a291b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmeHGF%E)25FCgP;0Io1_yxYeFL@oMPw*?3TtUebjG@4e5DQ2^*V((+QP5%G-tElp z+!o6u00~lLSq6pc71>WfGXQ-Hj5RRtfp-yE`#W|2O*>aZiE8+wE Ch{1XQ diff --git a/src/WINNT/afssvrmgr/resource/btn_rename.ico b/src/WINNT/afssvrmgr/resource/btn_rename.ico deleted file mode 100644 index 3998e382f045718edd97efa5061f57feb9e8d436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmd6lF>b>!3`M__0vSBWH;AVqyT=Ua33?_S$w0;|I!;Fc-OE18v7;bqnysb%N&ZjT z5-3THR_eM=Zo5W$CHDQqKUUH^+78W?9yEHvOR4yKE=s(LaSC`+5S3D*VC9vWXMo2g zce4eU3n44Z4s8fITOh(qw3(xL-7MR6^zYmA|Jsw=sCGCGd$htSmN>6TOlMTm&*_?y zV*>)%PIKx>-@rVl$PDjWWGGaaO9^<=G9#bWQ*)y0-U&tOBJBY-V9 HJpB7NrBVfQ diff --git a/src/WINNT/afssvrmgr/resource/getdates.ico b/src/WINNT/afssvrmgr/resource/getdates.ico deleted file mode 100644 index 5392ee6974a4dc2571901ac53b110d7e3dbf627e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmaKqF>iw~5QQJ5YLFPxsZ%8qb!bN<#tg|%%GPZ07B>D05~GJQ_GfhLNH(NIT;JJP zP$}(^XZ!Oz-&q78;aas(6%iNaX*OY zisGYNI{X=n_xNDhYyQRJtSnK4k7zc?w&(N3){W?Tc-CVd}#MZ2u3k%5#v`Odb> z>8@(qy6?MCz;RWXkrlN-xPa$6@fWPMn?}y`9BJUDDRLA*U|WziXUuoL>)?+&-?6)o zrSHgJ-`Y(P*cZ_9^Mp;XQ`ezsa>Tw|ts5I=`waj7XvN_~sPoTkS!5n;ayvx&Oop$8 zTz9ebh*TXvi*8S~z}Wy79v!GFKSdS)x%d-U@CC;Su;%g#* VhpgK_XPpe0^jo&1u1AqUfSTW>LcLTK z8|Qpye}Al4mPIl~Q9O#)=bgwC^9v|I2{PHzMLgc^@|ZZ@pC>v?;AI#FjI?}`lCA(l zC2iN0_l=eEu5YZ6ckhiA7T*N$gY{k4x0dGz7lO%)>)Y0F7gG%3astO8V|(GE!qIRQ zEWN#+sKHpu4V5cfxwYY=-43s78<>W16`16qu1tW6bzGC@Cq^`HF~PHfh!p&|u$q zJ^QVH?sPy<@B1aJeck|%iqBFny-ERh8i6GCb4!9EDP4m`O{Iisngn=xK-x@Fx0DUP zw_M*m%(-rSBJb+PCyY0KH#dIHb?|(TdFwsqIt=ar?wPmV>$*d7H ? @ @ A -A A B B B C € C   C  ÿRRR00dc$L K M N O - O P P P ÿQ Q Q R €R € R  ``€`00dc Z  Y [ \ ] ] -] €^ ^ €_ À_ _ `  ` ÿ`  nn00dc$h" g i j j -j k k k m m  m  €n n  n ~00dcT$$####""       ÿ                           -             ]  ^  _ v -v €v Àw w x €x y  }  ~  ~ ~ 00dcÄ$$###  ÿÔ #Ó# Ò " €Ð               ¹                           ¸            ÿ               ¸                       ¸                  ·              € ¸           ÿ   ¹ -       ÿ (ÿ (€G )J )ÿM )P | | | } } } ~  ƒ ƒ ƒ  ’00dcl* ( & $ # # ÿ  %  & € &  ' € ' À '  (  (  ( ÿ) D )  G )  J - ƒ ƒ „ „ „ … … … † †   ’ 00dcX6 4 2 1 1 3 4 4 -5 5 5 6 6  6 € G7  ; 7  €< 7  ?  -FC FF -   - ÿ  - ‘ ‘ - ’ – ™ 𠀤00dcf@ ? A B - C C - D - -D D JE = E ;  E €: F € 9 F  9 F  À; R> RB RE š š › › œ   £ ¤ ªª00dcŠL K M N QO - ÿMO A  -P = P ÿ; P :  Q 9 Q 9 - Q ÿ8 R 8 - R  8 R  : - `= `A - `D § - § ¨ ¨ © ª  ª 00dc޼»€Z Q  -Y M €[ A \ > -  ] ;  -] -9 ] 8 ^ 7 ^ 7 €_ 6 _ 6 _ ÿ5 `  6 ÿ` 7 `  ; n> nB  ² ³ ³ ´ 00dc€ÉÈ€¼  -» €º º  h L € -g ?  -i <  j :  -j -8 j 8 k 7 k ÿ7 k 6 m ÿ6 m  5 m  6 n 8  n  : n = ~00dcpÖÕ€É  -È €Ç Ç  -Æ  -Å  -Å ÿ v F  v C  v A v -? v ÿ> €v > w > w = x = x ÿ=  y  > }  ÿA ~  ~ ~ 00dc`ÞÝ€Ö -Õ Ô Ô ÿ -Ó ÿ -Ò Ò Ñ Ñ { S À { K ÿ{ €I { G ÿ| G | ÿF - | €F } ÿF } G } ÿI ~  ƒ ƒ ƒ  ’00dcp#à# à #º "" ¹ -               ÿ¸                        ¸ -          €             · -  -                Á  -           Á -  -     ÿ       Á À       -      €     Ù -  Ø  Ø  ƒ H -  ƒ ÿG  ƒ - G ƒ G ƒ G „ H  „ J „ … … … † †   ’ 00dc:ç ç    æ    å   å    ä   ä  ä  ã - Àã -  ™H  E  C   -D - Ž D Ž - E  H  -   - ‘ €‘ - €’ – ™ š ¤00dc\ÿÿÿì í î ûî ÿ î  í   ó¥F €™ G ˜  €G — ÿG  — H — ˜ ˜ À™ ™ š š › › €œ   ÿ£ ¤ €ªª00dc„° ¯€¥  -£ €¢ ¢  ¢ £ - £ ¤ - ÿ¤ €¥ - ¥ ¦ - ¦ § - § ¨ ¨ À© ª  ª 00dc¼»€°  -¯ €® ® -  ­  -­ ­ ­ ® €® ÿ¯ ¯ ° ° ± ± À²  ² ³ ³ ´ 00dczÉÈ€¼  -» €º º  ¹  -¸  -¸  ¸  -¸ ¹ ¹ º €º À» » ¼ ½  ¾ ¿ 00dcrÖÕ€É  -È €Ç Ç  -Æ  -Å  -Å ÿ Ä  Ä  Ä Ä Ä Å Æ Æ Ç È  É Ì 00dcbÞÝ€Ö -Õ Ô Ô ÿ -Ó ÿ -Ò Ò Ñ Ñ Ñ  Ñ Ñ Ñ Ò Ò - Ó Ô Ö Ù 00dc8Þ Ý - Ü ÀÜ - Û -  -Ú  -Ú -  -Ù  Ù  Ù -  Ø ÿ Ø  Ø - À Ù  Ú Û Ü Þ  á 00dc*ç ç € -æ  å  å   ä  ä ä  ã - ã - ã â â å - ç é ì 00dc\ÿÿÿÿÿÿÿýï -ïóî î  î   óí ð ò  ô  ÷ 00dc00dcidx1 00dc(00dc400dcR00dc` R00dcº -€00dcB \00dc¦ $00dcÒ&00dc$00dc, 00dcT$00dc€T00dcÜÄ00dc¨l00dcX00dc|f00dcê Š00dc|#Ž00dc&€00dcš(p00dc+`00dcz-p00dcò0:00dc43\00dc˜5„00dc$700dc¼8z00dc>:r00dc¸;b00dc"=800dcb>*00dc”?\00dcø@00dcA diff --git a/src/WINNT/afssvrmgr/resource/subset.ico b/src/WINNT/afssvrmgr/resource/subset.ico deleted file mode 100644 index b5a211069ed951264c6f30a7269c3876961ba4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmbu3u@1v92t?0PrF3(q&K>)CY-TGP$&_F6CuMUsdbn%1g6|$+$rvcibzPD1D!?O2 z<>W~f+~`1`{>u#Df!P;ymXx9Q&Wo4_5m`~p9MM$uO@^BvN%n#|`)x=K71hzCx-a`^ tO@xD_E!Zzoao6EZ+}$p15+|b;@5JkUZN7#}jLlebSD074qksuQ8C{ma{x4=~}qA;l(m)vHNT;>pzDc!{d zV)JL$4k%*G?E3#VGrJ%FhtGICgv9p^aL4_TIc83o4m_?vPIf(VLXteU8&|$Eb10<< zwD~}5d1LYsOO~s#W1K-Cau?eR0#;U4^=V7U_!h)*Y&5a;y8=VS3F48gJqD@~M+VYt z!x4SPz=#bN`{j}~POtrKxun4c+wOl*(-1AQ3^&?NCNC_vI@*@mrS_YsC|JLEwH#5I zWfwYXbz2m|!!HIR{&a1ITdNg}@k0&aGJ_T9G;tRT!~ZnfrG9?KqU*XV@K}yeh4Zc; zNqD;usO#Aj@X|E3jp0lpNfNpyJY%H&ccCXn2mful;Z1W#pMcd7n6$t{GdM(t$#I}o zCs%3hu20c=)4Kaj1LZb&8+56;_lY6im{UCA1@G8HZ`S;Sx!??N7C7^sv!8i}oF!+< F*}u#rtY82D diff --git a/src/WINNT/afssvrmgr/set_clone.cpp b/src/WINNT/afssvrmgr/set_clone.cpp deleted file mode 100644 index b0dbc3fe6..000000000 --- a/src/WINNT/afssvrmgr/set_clone.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_clone.h" -#include "propcache.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Clone_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Clone_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); - -BOOL CALLBACK Filesets_Clonesys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Clonesys_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); -void Filesets_Clonesys_OnOK (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); -void Filesets_Clonesys_OnSelect (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); -void Filesets_Clonesys_OnSelectServer (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); -void Filesets_Clonesys_OnEndTask_EnumServers (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); -void Filesets_Clonesys_OnEndTask_EnumAggregs (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_Clone (LPIDENT lpi) -{ - LPSET_CLONESYS_PARAMS pcsp = New (SET_CLONESYS_PARAMS); - memset (pcsp, 0x00, sizeof(SET_CLONESYS_PARAMS)); - pcsp->lpi = (lpi == NULL) ? g.lpiCell : lpi; - - int rc; - if (pcsp->lpi && pcsp->lpi->fIsFileset()) - rc = ModalDialogParam (IDD_SET_CLONE, NULL, (DLGPROC)Filesets_Clone_DlgProc, (LPARAM)pcsp); - else - rc = ModalDialogParam (IDD_SET_CLONESYS, NULL, (DLGPROC)Filesets_Clonesys_DlgProc, (LPARAM)pcsp); - - if ((rc != IDOK) || (!pcsp->lpi)) - { - Delete (pcsp); - } - else if (pcsp->lpi->fIsFileset()) // clone one fileset? - { - StartTask (taskSET_CLONE, NULL, pcsp->lpi); - Delete (pcsp); - } - else // or clone lots of filesets? - { - StartTask (taskSET_CLONESYS, NULL, pcsp); - // don't delete pcsp--it'll be freed by the StartTask handler - } -} - - - -BOOL CALLBACK Filesets_Clone_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SET_CLONE, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSET_CLONESYS_PARAMS pcsp = (LPSET_CLONESYS_PARAMS)GetWindowLong (hDlg, DWL_USER); - - if (pcsp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSET_CLONE, NULL, hDlg); - Filesets_Clone_OnInitDialog (hDlg, pcsp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - - case WM_DESTROY: - PropCache_Delete (pcSET_CLONE, NULL); - break; - } - } - - return FALSE; -} - - -void Filesets_Clone_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - pcsp->lpi->GetServerName (szServer); - pcsp->lpi->GetAggregateName (szAggregate); - pcsp->lpi->GetFilesetName (szFileset); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CLONE_DESC, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_CLONE_DESC, pszText); - FreeString (pszText); -} - - -BOOL CALLBACK Filesets_Clonesys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SET_CLONESYS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSET_CLONESYS_PARAMS pcsp = (LPSET_CLONESYS_PARAMS)GetWindowLong (hDlg, DWL_USER); - - if (pcsp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSET_CLONE, NULL, hDlg); - Filesets_Clonesys_OnInitDialog (hDlg, pcsp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - { - Filesets_Clonesys_OnEndTask_EnumServers (hDlg, pcsp); - } - else if (ptp->idTask == taskAGG_ENUM_TO_COMBOBOX) - { - Filesets_Clonesys_OnEndTask_EnumAggregs (hDlg, pcsp); - } - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Filesets_Clonesys_OnOK (hDlg, pcsp); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_CLONE_ALL: - case IDC_CLONE_SOME: - case IDC_CLONE_SVR_LIMIT: - case IDC_CLONE_AGG_LIMIT: - case IDC_CLONE_PREFIX_LIMIT: - Filesets_Clonesys_OnSelect (hDlg, pcsp); - break; - - case IDC_CLONE_SVR: - if (HIWORD(wp) == CBN_SELCHANGE) - { - Filesets_Clonesys_OnSelectServer (hDlg, pcsp); - } - break; - } - break; - - case WM_DESTROY: - PropCache_Delete (pcSET_CLONE, NULL); - break; - } - } - - return FALSE; -} - - -void Filesets_Clonesys_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - CheckDlgButton (hDlg, IDC_CLONE_ALL, pcsp->lpi->fIsCell()); - CheckDlgButton (hDlg, IDC_CLONE_SOME, !pcsp->lpi->fIsCell()); - CheckDlgButton (hDlg, IDC_CLONE_SVR_LIMIT, !pcsp->lpi->fIsCell()); - CheckDlgButton (hDlg, IDC_CLONE_AGG_LIMIT, pcsp->lpi->fIsAggregate()); - - pcsp->fEnumedServers = FALSE; - pcsp->fEnumedAggregs = FALSE; - Filesets_Clonesys_OnSelect (hDlg, pcsp); - - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_CLONE_SVR); - lpp->lpiSelect = (pcsp->lpi && !pcsp->lpi->fIsCell()) ? pcsp->lpi->GetServer() : NULL; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); -} - - -void Filesets_Clonesys_OnOK (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - if (IsDlgButtonChecked (hDlg, IDC_CLONE_ALL)) - { - pcsp->lpi = g.lpiCell; - pcsp->fUsePrefix = FALSE; - pcsp->szPrefix[0] = TEXT('\0'); - } - else // (IsDlgButtonChecked (hDlg, IDC_CLONE_SOME)) - { - if (IsDlgButtonChecked (hDlg, IDC_CLONE_AGG_LIMIT)) - pcsp->lpi = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_CLONE_AGG)); - else if (IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT)) - pcsp->lpi = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_CLONE_SVR)); - else - pcsp->lpi = g.lpiCell; - - pcsp->fUsePrefix = IsDlgButtonChecked (hDlg, IDC_CLONE_PREFIX_LIMIT); - GetDlgItemText (hDlg, IDC_CLONE_PREFIX, pcsp->szPrefix, MAX_PATH); - - if (pcsp->fUsePrefix && (pcsp->szPrefix[0] == TEXT('!'))) - { - TCHAR szPrefixNoBang[ cchRESOURCE ]; - lstrcpy (szPrefixNoBang, &pcsp->szPrefix[1]); - lstrcpy (pcsp->szPrefix, szPrefixNoBang); - pcsp->fExcludePrefix = TRUE; - } - } -} - - -void Filesets_Clonesys_OnSelect (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - BOOL fCloneAll = (IsDlgButtonChecked (hDlg, IDC_CLONE_ALL)) ? TRUE : FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_SVR_LIMIT), !fCloneAll); - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_AGG_LIMIT), !fCloneAll); - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_PREFIX_LIMIT), !fCloneAll); - - if (fCloneAll) - { - CheckDlgButton (hDlg, IDC_CLONE_SVR_LIMIT, FALSE); - CheckDlgButton (hDlg, IDC_CLONE_AGG_LIMIT, FALSE); - CheckDlgButton (hDlg, IDC_CLONE_PREFIX_LIMIT, FALSE); - } - - BOOL fEnable; - - fEnable = IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT) && pcsp->fEnumedServers; - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_SVR), fEnable); - - fEnable = IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT); - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_AGG_LIMIT), fEnable); - if (!fEnable) - CheckDlgButton (hDlg, IDC_CLONE_AGG_LIMIT, FALSE); - - fEnable = fEnable && IsDlgButtonChecked (hDlg, IDC_CLONE_AGG_LIMIT) && pcsp->fEnumedAggregs; - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_AGG), fEnable); - - fEnable = IsDlgButtonChecked (hDlg, IDC_CLONE_PREFIX_LIMIT); - EnableWindow (GetDlgItem (hDlg, IDC_CLONE_PREFIX), fEnable); - - fEnable = TRUE; - if (IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT) && !pcsp->fEnumedServers) - fEnable = FALSE; - if (IsDlgButtonChecked (hDlg, IDC_CLONE_AGG_LIMIT) && !pcsp->fEnumedAggregs) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Filesets_Clonesys_OnSelectServer (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - pcsp->fEnumedAggregs = FALSE; - Filesets_Clonesys_OnSelect (hDlg, pcsp); - - LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_CLONE_AGG); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_CLONE_SVR)); - lpp->lpiSelect = (pcsp->lpi->fIsAggregate() && (pcsp->lpi->GetServer() == lpp->lpiServer)) ? pcsp->lpi : NULL; - StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp); -} - - -void Filesets_Clonesys_OnEndTask_EnumServers (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - pcsp->fEnumedServers = TRUE; - Filesets_Clonesys_OnSelectServer (hDlg, pcsp); -} - - -void Filesets_Clonesys_OnEndTask_EnumAggregs (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp) -{ - pcsp->fEnumedAggregs = TRUE; - Filesets_Clonesys_OnSelect (hDlg, pcsp); -} - diff --git a/src/WINNT/afssvrmgr/set_clone.h b/src/WINNT/afssvrmgr/set_clone.h deleted file mode 100644 index 661e9143b..000000000 --- a/src/WINNT/afssvrmgr/set_clone.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_CLONE_H -#define SET_CLONE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - BOOL fUsePrefix; - BOOL fExcludePrefix; - TCHAR szPrefix[ MAX_PATH ]; - BOOL fEnumedServers; - BOOL fEnumedAggregs; - } SET_CLONESYS_PARAMS, *LPSET_CLONESYS_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_Clone (LPIDENT lpi); // pass fileset, aggregate, server or cell - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_col.cpp b/src/WINNT/afssvrmgr/set_col.cpp deleted file mode 100644 index b0b6531f5..000000000 --- a/src/WINNT/afssvrmgr/set_col.cpp +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_col.h" - - -/* - * FILESET-VIEW COLUMNS _______________________________________________________ - * - */ - -void Filesets_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nFILESETCOLUMNS; - - for (size_t iCol = 0; iCol < nFILESETCOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = FILESETCOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = FILESETCOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = setcolNAME; - - lpvi->nColsShown = 7; - lpvi->aColumns[0] = (int)setcolNAME; - lpvi->aColumns[1] = (int)setcolAGGREGATE; - lpvi->aColumns[2] = (int)setcolTYPE; - lpvi->aColumns[3] = (int)setcolQUOTA_USED; - lpvi->aColumns[4] = (int)setcolQUOTA_TOTAL; - lpvi->aColumns[5] = (int)setcolQUOTA_USED_PER; - lpvi->aColumns[6] = (int)setcolSTATUS; -} - - -size_t Filesets_GetAlertCount (LPFILESET lpFileset) -{ - return Alert_GetCount (lpFileset->GetIdentifier()); -} - - -LPTSTR Filesets_GetColumnText (LPIDENT lpi, FILESETCOLUMN setcol, BOOL fShowServerName) -{ - static TCHAR aszBuffer[ nFILESETCOLUMNS ][ cchRESOURCE ]; - static size_t iBufferNext = 0; - LPTSTR pszBuffer = aszBuffer[ iBufferNext++ ]; - if (iBufferNext == nFILESETCOLUMNS) - iBufferNext = 0; - *pszBuffer = TEXT('\0'); - - LPFILESETSTATUS lpfs = NULL; - LPIDENT lpiRW = NULL; - LPFILESET_PREF lpfp; - if ((lpfp = (LPFILESET_PREF)lpi->GetUserParam()) != NULL) - { - lpfs = &lpfp->fsLast; - lpiRW = lpfp->lpiRW; - } - - switch (setcol) - { - case setcolNAME: - lpi->GetFilesetName (pszBuffer); - break; - - case setcolAGGREGATE: - if (!fShowServerName) - lpi->GetAggregateName (pszBuffer); - else - { - TCHAR szNameSvr[ cchNAME ]; - TCHAR szNameAgg[ cchNAME ]; - lpi->GetServerName (szNameSvr); - lpi->GetAggregateName (szNameAgg); - LPTSTR pszName = FormatString (IDS_SERVER_AGGREGATE, TEXT("%s%s"), szNameSvr, szNameAgg); - lstrcpy (pszBuffer, pszName); - FreeString (pszName); - } - break; - - case setcolTYPE: - if (lpfs) - { - switch (lpfs->Type) - { - case ftREADWRITE: - GetString (pszBuffer, IDS_FILESETTYPE_RW); - break; - - case ftCLONE: - GetString (pszBuffer, IDS_FILESETTYPE_CLONE); - break; - - case ftREPLICA: - if (lpiRW == NULL) - GetString (pszBuffer, IDS_FILESETTYPE_RO); - else if (lpiRW->GetServer() != lpi->GetServer()) - GetString (pszBuffer, IDS_FILESETTYPE_RO); - else - GetString (pszBuffer, IDS_FILESETTYPE_RO_STAGE); - break; - } - } - break; - - case setcolDATE_CREATE: - if (lpfs) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpfs->timeCreation)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case setcolDATE_UPDATE: - if (lpfs) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpfs->timeLastUpdate)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case setcolDATE_ACCESS: - if (lpfs) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpfs->timeLastAccess)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case setcolDATE_BACKUP: - if (lpfs) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpfs->timeLastBackup)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case setcolQUOTA_USED: - if (lpfs) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * lpfs->ckUsed); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case setcolQUOTA_USED_PER: - if (lpfs && lpfs->Type == ftREADWRITE) - { - DWORD dwPer = 100; - if (lpfs->ckQuota != 0) - dwPer = (DWORD)( 100.0 * lpfs->ckUsed / lpfs->ckQuota ); - - dwPer = max( 0, dwPer ); - LPTSTR psz = FormatString (IDS_PERCENTAGE, TEXT("%lu"), dwPer); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case setcolQUOTA_FREE: - if (lpfs && lpfs->Type == ftREADWRITE) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * (lpfs->ckQuota - lpfs->ckUsed)); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case setcolQUOTA_TOTAL: - if (lpfs && lpfs->Type == ftREADWRITE) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%.1B"), 1024.0 * lpfs->ckQuota); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case setcolSTATUS: - LPTSTR pszDesc; - if ((pszDesc = Alert_GetQuickDescription (lpi)) != NULL) - { - lstrcpy (pszBuffer,pszDesc); - FreeString (pszDesc); - } - else if (!lpfs) - { - GetString (pszBuffer, IDS_STATUS_NOALERTS); - } - else - { - if (lpfs->State & fsBUSY) - GetString (pszBuffer, IDS_SETSTATUS_BUSY); - else if (lpfs->State & fsSALVAGE) - GetString (pszBuffer, IDS_SETSTATUS_SALVAGE); - else if (lpfs->State & fsMOVED) - GetString (pszBuffer, IDS_SETSTATUS_MOVED); - else if (lpfs->State & fsLOCKED) - GetString (pszBuffer, IDS_SETSTATUS_LOCKED); - else if (lpfs->State & fsNO_VOL) - GetString (pszBuffer, IDS_SETSTATUS_NO_VOL); - else - GetString (pszBuffer, IDS_STATUS_NOALERTS); - } - break; - - case setcolID: - if (lpfs) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%ld"), lpfs->id); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - - case setcolFILES: - if (lpfs) - { - LPTSTR psz = FormatString (TEXT("%1"), TEXT("%ld"), lpfs->nFiles); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - } - - return pszBuffer; -} - - -/* - * REPLICA-VIEW COLUMNS _______________________________________________________ - * - */ - -void Replicas_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nREPLICACOLUMNS; - - for (size_t iCol = 0; iCol < nREPLICACOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = REPLICACOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = REPLICACOLUMNS[ iCol ].idsColumn; - } - - lpvi->nColsShown = 3; - lpvi->aColumns[0] = (int)repcolSERVER; - lpvi->aColumns[1] = (int)repcolAGGREGATE; - lpvi->aColumns[2] = (int)repcolDATE_UPDATE; -} - - -LPTSTR Replicas_GetColumnText (LPIDENT lpi, REPLICACOLUMN repcol) -{ - static TCHAR aszBuffer[ nREPLICACOLUMNS ][ cchRESOURCE ]; - static size_t iBufferNext = 0; - LPTSTR pszBuffer = aszBuffer[ iBufferNext++ ]; - if (iBufferNext == nREPLICACOLUMNS) - iBufferNext = 0; - - LPFILESETSTATUS lpfs = NULL; - LPFILESET_PREF lpfp; - if ((lpfp = (LPFILESET_PREF)lpi->GetUserParam()) != NULL) - { - lpfs = &lpfp->fsLast; - } - - switch (repcol) - { - case repcolSERVER: - lpi->GetServerName (pszBuffer); - break; - - case repcolAGGREGATE: - lpi->GetAggregateName (pszBuffer); - break; - - case repcolDATE_UPDATE: - if (!lpfs) - *pszBuffer = TEXT('\0'); - else if (!FormatTime (pszBuffer, TEXT("%s"), &lpfs->timeLastUpdate)) - *pszBuffer = TEXT('\0'); - break; - - default: - pszBuffer = NULL; - break; - } - - return pszBuffer; -} - diff --git a/src/WINNT/afssvrmgr/set_col.h b/src/WINNT/afssvrmgr/set_col.h deleted file mode 100644 index e273947a1..000000000 --- a/src/WINNT/afssvrmgr/set_col.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_COL_H -#define SET_COL_H - - -/* - * FILESET-VIEW COLUMNS _______________________________________________________ - * - */ - -typedef enum - { - setcolNAME, - setcolTYPE, - setcolDATE_CREATE, - setcolDATE_UPDATE, - setcolDATE_ACCESS, - setcolDATE_BACKUP, - setcolQUOTA_USED, - setcolQUOTA_USED_PER, - setcolQUOTA_FREE, - setcolQUOTA_TOTAL, - setcolSTATUS, - setcolAGGREGATE, - setcolID, - setcolFILES, - } FILESETCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -FILESETCOLUMNS[] = - { - { IDS_SETCOL_NAME, 220 }, // setcolNAME - { IDS_SETCOL_TYPE, 100 }, // setcolTYPE - { IDS_SETCOL_DATE_CREATE, 100 }, // setcolDATE_CREATE - { IDS_SETCOL_DATE_UPDATE, 100 }, // setcolDATE_UPDATE - { IDS_SETCOL_DATE_ACCESS, 100 }, // setcolDATE_ACCESS - { IDS_SETCOL_DATE_BACKUP, 100 }, // setcolDATE_BACKUP - { IDS_SETCOL_QUOTA_USED, 100 | COLUMN_RIGHTJUST }, // setcolQUOTA_USED - { IDS_SETCOL_QUOTA_USED_PER, 100 | COLUMN_RIGHTJUST }, // setcolQUOTA_USED_PER - { IDS_SETCOL_QUOTA_FREE, 100 | COLUMN_RIGHTJUST }, // setcolQUOTA_FREE - { IDS_SETCOL_QUOTA_TOTAL, 100 | COLUMN_RIGHTJUST }, // setcolQUOTA_TOTAL - { IDS_SETCOL_STATUS, 300 }, // setcolSTATUS - { IDS_SETCOL_AGGREGATE, 100 }, // setcolAGGREGATE - { IDS_SETCOL_ID, 100 }, // setcolID - { IDS_SETCOL_FILES, 100 | COLUMN_RIGHTJUST }, // setcolFILES - }; - -#define nFILESETCOLUMNS (sizeof(FILESETCOLUMNS)/sizeof(FILESETCOLUMNS[0])) - - -/* - * REPLICA-VIEW COLUMNS _______________________________________________________ - * - */ - -typedef enum - { - repcolSERVER, - repcolAGGREGATE, - repcolDATE_UPDATE, - } REPLICACOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -REPLICACOLUMNS[] = - { - { IDS_REPCOL_SERVER, 100 }, // repcolSERVER - { IDS_REPCOL_AGGREGATE, 100 }, // repcolAGGREGATE - { IDS_REPCOL_DATE_UPDATE, 100 }, // repcolDATE_UPDATE - }; - -#define nREPLICACOLUMNS (sizeof(REPLICACOLUMNS)/sizeof(REPLICACOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_SetDefaultView (LPVIEWINFO lpvi); - -size_t Filesets_GetAlertCount (LPFILESET lpFileset); -LPTSTR Filesets_GetColumnText (LPIDENT lpi, FILESETCOLUMN setcol, BOOL fShowServerName = FALSE); - - -void Replicas_SetDefaultView (LPVIEWINFO lpvi); - -LPTSTR Replicas_GetColumnText (LPIDENT lpi, REPLICACOLUMN repcol); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_create.cpp b/src/WINNT/afssvrmgr/set_create.cpp deleted file mode 100644 index 49337811b..000000000 --- a/src/WINNT/afssvrmgr/set_create.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_create.h" -#include "set_general.h" -#include "propcache.h" -#include "columns.h" -#include "svr_window.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp); -void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget); -void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp); -void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg); -void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget); -void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_Create (LPIDENT lpiParent) -{ - LPSET_CREATE_PARAMS pscp = New (SET_CREATE_PARAMS); - memset (pscp, 0x00, sizeof(SET_CREATE_PARAMS)); - pscp->lpiParent = lpiParent; - pscp->szName[0] = TEXT('\0'); - pscp->fCreateClone = FALSE; - pscp->ckQuota = ckQUOTA_DEFAULT; - - // Show the Create dialog. - // - int rc = ModalDialogParam (IDD_SET_CREATE, GetActiveWindow(), (DLGPROC)Filesets_Create_DlgProc, (LPARAM)pscp); - - if (rc != IDOK) - { - Delete (pscp); - } - else if (!ASSERT( pscp->lpiParent && pscp->lpiParent->fIsAggregate() )) - { - Delete (pscp); - } - else if (!ASSERT( pscp->szName[0] != TEXT('\0') )) - { - Delete (pscp); - } - else - { - StartTask (taskSET_CREATE, NULL, pscp); - } -} - - -BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPSET_CREATE_PARAMS pscp = NULL; - if (msg == WM_INITDIALOG) - pscp = (LPSET_CREATE_PARAMS)lp; - - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggCreate)) - return FALSE; - - if (AfsAppLib_HandleHelp (IDD_SET_CREATE, hDlg, msg, wp, lp)) - return TRUE; - - if (pscp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAggCreate); - Filesets_Create_OnInitDialog (hDlg, pscp); - break; - - case WM_CONTEXTMENU: - HWND hList; - hList = GetDlgItem (hDlg, IDC_AGG_LIST); - - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient (hList, &ptClient); - - if (FL_HitTestForHeaderBar (hList, ptClient)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskAGG_FIND_QUOTA_LIMITS) - Filesets_Create_OnEndTask_FindQuotaLimits (hDlg, ptp, pscp); - else if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW) - Filesets_Create_OnEndTask_EnumAggregates (hDlg); - else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - { - EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), TRUE); - Filesets_Create_StartDisplay_Aggregates (hDlg, &pscp->lpiParent); - } - FreeTaskPacket (ptp); - } - break; - - case WM_COLUMNS_CHANGED: - LPARAM lpSel; - lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate); - Filesets_Create_OnSelectServer (hDlg, (LPIDENT*)&lpSel); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0]) - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_SET_SERVER: - if (HIWORD(wp) == CBN_SELCHANGE) - Filesets_Create_OnSelectServer (hDlg, &pscp->lpiParent); - break; - - case IDC_SET_NAME: - GetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName, cchNAME); - Filesets_Create_EnableOK (hDlg, pscp); - break; - - case IDC_SET_QUOTA: - if (HIWORD(wp) == SPN_UPDATE) - { - pscp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA)); - if (gr.cbQuotaUnits == cb1MB) - pscp->ckQuota *= ck1MB; - } - break; - - case IDC_SET_QUOTA_UNITS: - if (HIWORD(wp) == CBN_SELCHANGE) - { - gr.cbQuotaUnits = (size_t)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS)); - StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent); - } - break; - - case IDC_SET_CLONE: - pscp->fCreateClone = IsDlgButtonChecked (hDlg, IDC_SET_CLONE); - break; - } - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate); - pscp = NULL; - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - LPIDENT lpi; - if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL) - { - pscp->lpiParent = lpi; - - StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent); - Filesets_Create_EnableOK (hDlg, pscp); - } - break; - } - break; - } - } - - return FALSE; -} - - -static LONG procFilesetsCreateList = 0; - -LRESULT CALLBACK Filesets_Create_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procFilesetsCreateList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procFilesetsCreateList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procFilesetsCreateList != 0) - SetWindowLong (hList, GWL_WNDPROC, procFilesetsCreateList); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case M_COLUMNS: - ShowColumnsDialog (GetParent (hList), &gr.viewAggCreate); - break; - } - break; - } - - return rc; -} - - -void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp) -{ - HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST); - if (procFilesetsCreateList == 0) - procFilesetsCreateList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_Create_SubclassListProc); - - if (gr.viewAggCreate.lvsView == 0) // never initialized this? - { - if (gr.viewAggMove.lvsView == 0) - memcpy (&gr.viewAggCreate, &gr.viewAgg, sizeof(VIEWINFO)); - else - memcpy (&gr.viewAggCreate, &gr.viewAggMove, sizeof(VIEWINFO)); - } - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate); - - SetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName); - - CB_StartChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), TRUE); - CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_KB, (LPARAM)cb1KB); - CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_MB, (LPARAM)cb1MB); - CB_EndChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), (LPARAM)gr.cbQuotaUnits); - - CheckDlgButton (hDlg, IDC_SET_CLONE, pscp->fCreateClone); - - // Create a spinner, and give it an appropriate min/max range. We'll - // have to *find* that range in a separate thread, 'cause it involves - // getting the status of an aggregate. - // - StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent); - - // Fill in the Servers combobox, and select the default server - // (if one was specified). - // - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_SET_SERVER); - lpp->lpiSelect = (pscp->lpiParent) ? pscp->lpiParent->GetServer() : NULL; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); - - EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - - Filesets_Create_StartDisplay_Aggregates (hDlg, plpiTarget); -} - - -void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget) -{ - LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER)); - - if (*plpiTarget && (*plpiTarget)->fIsServer()) - *plpiTarget = NULL; - if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew)) - *plpiTarget = NULL; - - SetWindowLong (hDlg, DWL_USER, (LONG)lpiServerNew); - - LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET); - lpp->lpiServer = lpiServerNew; - lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST); - lpp->lpiSelect = *plpiTarget; - lpp->lpvi = &gr.viewAggCreate; - StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp); -} - - -void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg) -{ - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE); -} - - -void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp) -{ - if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0]) - EnableWindow (GetDlgItem (hDlg, IDOK), TRUE); - else - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp) -{ - size_t cMin = TASKDATA(ptp)->ckMin; - size_t cNow = pscp->ckQuota; - size_t cMax = TASKDATA(ptp)->ckMax; - - if (gr.cbQuotaUnits == cb1MB) - { - cMin /= ck1MB; - cNow /= ck1MB; - cMax /= ck1MB; - } - - HWND hQuota = GetDlgItem (hDlg, IDC_SET_QUOTA); - if (!fHasSpinner (hQuota)) - { - CreateSpinner (hQuota, 10, FALSE, cMin, cNow, cMax); - } - else - { - SP_SetRange (hQuota, cMin, cMax); - SP_SetPos (hQuota, cNow); - } -} - diff --git a/src/WINNT/afssvrmgr/set_create.h b/src/WINNT/afssvrmgr/set_create.h deleted file mode 100644 index 7f279d4c3..000000000 --- a/src/WINNT/afssvrmgr/set_create.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_CREATE_H -#define SET_CREATE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiParent; - TCHAR szName[ cchNAME ]; - size_t ckQuota; - BOOL fCreateClone; - } SET_CREATE_PARAMS, *LPSET_CREATE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_Create (LPIDENT lpiParent = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_createrep.cpp b/src/WINNT/afssvrmgr/set_createrep.cpp deleted file mode 100644 index c5b275eae..000000000 --- a/src/WINNT/afssvrmgr/set_createrep.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_createrep.h" -#include "columns.h" -#include "svr_window.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_CreateReplica_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_CreateReplica_OnInitDialog (HWND hDlg, LPSET_CREATEREP_PARAMS pscp); -void Filesets_CreateReplica_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget); -void Filesets_CreateReplica_OnEndTask_EnumAggregates (HWND hDlg, LPSET_CREATEREP_PARAMS pscp); -void Filesets_CreateReplica_EnableOK (HWND hDlg, LPSET_CREATEREP_PARAMS pscp); -void Filesets_CreateReplica_StartDisplay_Aggregates (HWND hDlg, LPIDENT lpiTarget); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_CreateReplica (LPIDENT lpiSource, LPIDENT lpiTarget) -{ - LPSET_CREATEREP_PARAMS pscp = New (SET_CREATEREP_PARAMS); - pscp->lpiSource = lpiSource; - pscp->lpiTarget = lpiTarget; - - int rc = ModalDialogParam (IDD_SET_CREATEREP, NULL, (DLGPROC)Filesets_CreateReplica_DlgProc, (LPARAM)pscp); - if (rc != IDOK) - { - Delete (pscp); - } - else if (!ASSERT( pscp->lpiTarget && pscp->lpiTarget->fIsAggregate() )) - { - Delete (pscp); - } - else - { - StartTask (taskSET_CREATEREP, NULL, pscp); - } -} - - -BOOL CALLBACK Filesets_CreateReplica_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPSET_CREATEREP_PARAMS pscp = NULL; - if (msg == WM_INITDIALOG) - pscp = (LPSET_CREATEREP_PARAMS)lp; - - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggMove)) - return FALSE; - - if (AfsAppLib_HandleHelp (IDD_SET_CREATEREP, hDlg, msg, wp, lp)) - return TRUE; - - if (pscp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAggMove); - Filesets_CreateReplica_OnInitDialog (hDlg, pscp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW) - Filesets_CreateReplica_OnEndTask_EnumAggregates (hDlg, pscp); - else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - { - EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), TRUE); - Filesets_CreateReplica_OnSelectServer (hDlg, &pscp->lpiTarget); - } - FreeTaskPacket (ptp); - } - break; - - case WM_CONTEXTMENU: - HWND hList; - hList = GetDlgItem (hDlg, IDC_AGG_LIST); - - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient (hList, &ptClient); - - if (FL_HitTestForHeaderBar (hList, ptClient)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - break; - - case WM_COLUMNS_CHANGED: - LPARAM lpSel; - lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove); - Filesets_CreateReplica_OnSelectServer (hDlg, (LPIDENT*)&lpSel); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (pscp->lpiTarget) - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_SET_SERVER: - if (HIWORD(wp) == CBN_SELCHANGE) - Filesets_CreateReplica_OnSelectServer (hDlg, &pscp->lpiTarget); - break; - } - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove); - pscp = NULL; - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - LPIDENT lpi; - if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL) - { - pscp->lpiTarget = lpi; - Filesets_CreateReplica_EnableOK (hDlg, pscp); - } - break; - } - break; - } - } - - return FALSE; -} - - -static LONG procFilesetsCreateReplicaList = 0; - -LRESULT CALLBACK Filesets_CreateReplica_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procFilesetsCreateReplicaList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procFilesetsCreateReplicaList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procFilesetsCreateReplicaList != 0) - SetWindowLong (hList, GWL_WNDPROC, procFilesetsCreateReplicaList); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case M_COLUMNS: - ShowColumnsDialog (GetParent (hList), &gr.viewAggMove); - break; - } - break; - } - - return rc; -} - - -void Filesets_CreateReplica_OnInitDialog (HWND hDlg, LPSET_CREATEREP_PARAMS pscp) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - pscp->lpiSource->GetServerName (szServer); - pscp->lpiSource->GetAggregateName (szAggregate); - pscp->lpiSource->GetFilesetName (szFileset); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SET_NAME, szText, cchRESOURCE); - LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_SET_NAME, pszText); - FreeString (pszText); - - HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST); - if (procFilesetsCreateReplicaList == 0) - procFilesetsCreateReplicaList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_CreateReplica_SubclassListProc); - - if (gr.viewAggMove.lvsView == 0) // never initialized this? - { - if (gr.viewAggCreate.lvsView == 0) - memcpy (&gr.viewAggMove, &gr.viewAgg, sizeof(VIEWINFO)); - else - memcpy (&gr.viewAggMove, &gr.viewAggCreate, sizeof(VIEWINFO)); - } - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove); - - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE); - - // Fill in the Servers combobox, and select the default server - // (if one was specified). - // - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_SET_SERVER); - lpp->lpiSelect = (pscp->lpiTarget) ? pscp->lpiTarget->GetServer() : NULL; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); -} - - -void Filesets_CreateReplica_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget) -{ - LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER)); - - SetWindowLong (hDlg, DWL_USER, (LONG)lpiServerNew); - - if (*plpiTarget && (*plpiTarget)->fIsServer()) - *plpiTarget = NULL; - if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew)) - *plpiTarget = NULL; - - Filesets_CreateReplica_StartDisplay_Aggregates (hDlg, *plpiTarget); -} - - -void Filesets_CreateReplica_OnEndTask_EnumAggregates (HWND hDlg, LPSET_CREATEREP_PARAMS pscp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE); - Filesets_CreateReplica_EnableOK (hDlg, pscp); -} - - -void Filesets_CreateReplica_EnableOK (HWND hDlg, LPSET_CREATEREP_PARAMS pscp) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), (pscp->lpiTarget) ? TRUE : FALSE); -} - - -void Filesets_CreateReplica_StartDisplay_Aggregates (HWND hDlg, LPIDENT lpiTarget) -{ - LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER)); - - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - - LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET); - lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST); - lpp->lpiServer = lpiServerNew; - lpp->lpiSelect = lpiTarget; - lpp->lpvi = &gr.viewAggMove; - StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp); -} - diff --git a/src/WINNT/afssvrmgr/set_createrep.h b/src/WINNT/afssvrmgr/set_createrep.h deleted file mode 100644 index 0f61cf756..000000000 --- a/src/WINNT/afssvrmgr/set_createrep.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_CREATEREP_H -#define SET_CREATEREP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiSource; - LPIDENT lpiTarget; - } SET_CREATEREP_PARAMS, *LPSET_CREATEREP_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_CreateReplica (LPIDENT lpiSource, LPIDENT lpiTarget = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_delete.cpp b/src/WINNT/afssvrmgr/set_delete.cpp deleted file mode 100644 index b67507253..000000000 --- a/src/WINNT/afssvrmgr/set_delete.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_delete.h" -#include "propcache.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Delete_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Filesets_Delete_OnCheckBoxes (HWND hDlg); -void Filesets_Delete_OnEndTask_FindGhost (HWND hDlg, LPTASKPACKET ptp, LPSET_DELETE_PARAMS psdp); -void Filesets_Delete_ShrinkWindow (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_Delete (LPIDENT lpiFileset) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSET_DELETE, lpiFileset)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSET_DELETE_PARAMS psdp = New (SET_DELETE_PARAMS); - memset (psdp, 0x00, sizeof(SET_DELETE_PARAMS)); - psdp->lpiFileset = lpiFileset; - psdp->iddHelp = IDD_SET_DELETE; - - ModelessDialogParam (IDD_SET_DELETE, NULL, (DLGPROC)Filesets_Delete_DlgProc, (LPARAM)psdp); - // NOTE: Don't show window! - } -} - - - -BOOL CALLBACK Filesets_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPSET_DELETE_PARAMS psdp; - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - if ((psdp = (LPSET_DELETE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (AfsAppLib_HandleHelp (psdp->iddHelp, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSET_DELETE, psdp->lpiFileset, hDlg); - Filesets_Delete_OnInitDialog (hDlg, psdp->lpiFileset); - StartTask (taskSET_FIND_GHOST, hDlg, psdp->lpiFileset); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSET_FIND_GHOST) - Filesets_Delete_OnEndTask_FindGhost (hDlg, ptp, psdp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - psdp->fVLDB = IsDlgButtonChecked (hDlg, IDC_DELSET_VLDB); - psdp->fServer = IsDlgButtonChecked (hDlg, IDC_DELSET_SERVER); - - if (psdp->fVLDB || psdp->fServer) - StartTask (taskSET_DELETE, NULL, psdp); - else - Delete (psdp); - DestroyWindow (hDlg); - break; - - case IDCANCEL: - Delete (psdp); - DestroyWindow (hDlg); - break; - - case IDC_DELSET_VLDB: - case IDC_DELSET_SERVER: - Filesets_Delete_OnCheckBoxes (hDlg); - break; - } - break; - - case WM_DESTROY: - PropCache_Delete (hDlg); - SetWindowLong (hDlg, DWL_USER, 0); - psdp = NULL; - break; - } - } - - return FALSE; -} - - -void Filesets_Delete_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - - lpi->GetServerName (szServer); - lpi->GetAggregateName (szAggregate); - lpi->GetFilesetName (szFileset); - - TCHAR szOld[ cchRESOURCE ]; - - GetDlgItemText (hDlg, IDC_DELSET_DESC, szOld, cchRESOURCE); - LPTSTR pszNew = FormatString (szOld, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_DELSET_DESC, pszNew); - FreeString (pszNew); - - GetDlgItemText (hDlg, IDC_DELSET_SERVER, szOld, cchRESOURCE); - pszNew = FormatString (szOld, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_DELSET_SERVER, pszNew); - FreeString (pszNew); - - GetDlgItemText (hDlg, IDC_DELSET_VLDB, szOld, cchRESOURCE); - pszNew = FormatString (szOld, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_DELSET_VLDB, pszNew); - FreeString (pszNew); - - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Filesets_Delete_OnEndTask_FindGhost (HWND hDlg, LPTASKPACKET ptp, LPSET_DELETE_PARAMS psdp) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - psdp->lpiFileset->GetServerName (szServer); - psdp->lpiFileset->GetAggregateName (szAggregate); - psdp->lpiFileset->GetFilesetName (szFileset); - - if (!ptp->rc) - { - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - DestroyWindow (hDlg); - } - else if ( (TASKDATA(ptp)->fs.Type == ftREADWRITE) && (TASKDATA(ptp)->fHasReplicas) ) - { - ErrorDialog (ptp->status, IDS_ERROR_CANT_DELETE_REPLICATED_FILESET, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - DestroyWindow (hDlg); - } - else - { - if (TASKDATA(ptp)->fs.Type == ftREPLICA) - psdp->wGhost = GHOST_HAS_SERVER_ENTRY; - else if (TASKDATA(ptp)->fs.Type == ftCLONE) - psdp->wGhost = GHOST_HAS_SERVER_ENTRY; - else - psdp->wGhost = TASKDATA(ptp)->wGhost; - - psdp->fVLDB = (psdp->wGhost & GHOST_HAS_VLDB_ENTRY) ? TRUE : FALSE; - psdp->fServer = (psdp->wGhost & GHOST_HAS_SERVER_ENTRY) ? TRUE : FALSE; - - CheckDlgButton (hDlg, IDC_DELSET_VLDB, psdp->fVLDB); - CheckDlgButton (hDlg, IDC_DELSET_SERVER, psdp->fServer); - - if (TASKDATA(ptp)->fs.Type == ftREPLICA) - { - psdp->iddHelp = IDD_SET_DELREP; - - LPTSTR pszNew = FormatString (IDS_DELSET_REPLICA_DESC, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_DELSET_DESC, pszNew); - FreeString (pszNew); - - Filesets_Delete_ShrinkWindow (hDlg); - } - else if (TASKDATA(ptp)->fs.Type == ftCLONE) - { - psdp->iddHelp = IDD_SET_DELCLONE; - - LPTSTR pszNew = FormatString (IDS_DELSET_CLONE_DESC, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_DELSET_DESC, pszNew); - FreeString (pszNew); - - Filesets_Delete_ShrinkWindow (hDlg); - } - - if (!(psdp->wGhost & GHOST_HAS_SERVER_ENTRY)) - EnableWindow (GetDlgItem (hDlg, IDC_DELSET_SERVER), FALSE); - - if (!(psdp->wGhost & GHOST_HAS_VLDB_ENTRY)) - EnableWindow (GetDlgItem (hDlg, IDC_DELSET_VLDB), FALSE); - - Filesets_Delete_OnCheckBoxes (hDlg); - - ShowWindow (hDlg, SW_SHOW); - } -} - - -void Filesets_Delete_OnCheckBoxes (HWND hDlg) -{ - BOOL fEnableOK = TRUE; - if ( !IsDlgButtonChecked (hDlg, IDC_DELSET_VLDB) && - !IsDlgButtonChecked (hDlg, IDC_DELSET_SERVER) ) - fEnableOK = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnableOK); -} - - -void Filesets_Delete_ShrinkWindow (HWND hDlg) -{ - RECT rDialog; - GetWindowRect (hDlg, &rDialog); - - RECT rCheckbox; - GetRectInParent (GetDlgItem (hDlg, IDC_DELSET_VLDB), &rCheckbox); - - RECT rButton; - GetRectInParent (GetDlgItem (hDlg, IDOK), &rButton); - - LONG cy = rButton.top -rCheckbox.top; // shrink window by this much - - EnableWindow (GetDlgItem (hDlg, IDC_DELSET_SERVER), FALSE); - ShowWindow (GetDlgItem (hDlg, IDC_DELSET_SERVER), SW_HIDE); - - EnableWindow (GetDlgItem (hDlg, IDC_DELSET_VLDB), FALSE); - ShowWindow (GetDlgItem (hDlg, IDC_DELSET_VLDB), SW_HIDE); - - GetRectInParent (GetDlgItem (hDlg, IDOK), &rButton); - SetWindowPos (GetDlgItem (hDlg, IDOK), NULL, - rButton.left, rButton.top -cy, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - - GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rButton); - SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL, - rButton.left, rButton.top -cy, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - - GetRectInParent (GetDlgItem (hDlg, IDHELP), &rButton); - SetWindowPos (GetDlgItem (hDlg, IDHELP), NULL, - rButton.left, rButton.top -cy, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - - SetWindowPos (hDlg, NULL, - 0, 0, cxRECT(rDialog), cyRECT(rDialog) -cy, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); -} - diff --git a/src/WINNT/afssvrmgr/set_delete.h b/src/WINNT/afssvrmgr/set_delete.h deleted file mode 100644 index 9f1ebe9c5..000000000 --- a/src/WINNT/afssvrmgr/set_delete.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_DELETE_H -#define SET_DELETE_H - - -/* - * TYPEDEFS ___________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiFileset; - BOOL fVLDB; - BOOL fServer; - short wGhost; - int iddHelp; - } SET_DELETE_PARAMS, *LPSET_DELETE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_Delete (LPIDENT lpiFileset); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_dump.cpp b/src/WINNT/afssvrmgr/set_dump.cpp deleted file mode 100644 index e8579cd2e..000000000 --- a/src/WINNT/afssvrmgr/set_dump.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_dump.h" -#include "columns.h" -#include "svr_window.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Dump_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Dump_OnInitDialog (HWND hDlg, LPSET_DUMP_PARAMS psdp); -void Filesets_Dump_OnSelect (HWND hDlg); -void Filesets_Dump_EnableOK (HWND hDlg); -void Filesets_Dump_OnOK (HWND hDlg, LPSET_DUMP_PARAMS psdp); -void Filesets_Dump_OnBrowse (HWND hDlg, LPSET_DUMP_PARAMS psdp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_Dump (LPIDENT lpi) -{ - LPSET_DUMP_PARAMS psdp = New (SET_DUMP_PARAMS); - memset (psdp, 0x00, sizeof(SET_DUMP_PARAMS)); - psdp->lpi = lpi; - - int rc = ModalDialogParam (IDD_SET_DUMP, NULL, (DLGPROC)Filesets_Dump_DlgProc, (LPARAM)psdp); - - if (rc != IDOK) - { - Delete (psdp); - } - else - { - StartTask (taskSET_DUMP, NULL, psdp); - } -} - - -BOOL CALLBACK Filesets_Dump_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SET_DUMP, hDlg, msg, wp, lp)) - return TRUE; - - static LPSET_DUMP_PARAMS psdp = NULL; - if (msg == WM_INITDIALOG) - psdp = (LPSET_DUMP_PARAMS)lp; - - if (psdp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - Filesets_Dump_OnInitDialog (hDlg, psdp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Filesets_Dump_OnOK (hDlg, psdp); - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_DUMP_FULL: - case IDC_DUMP_LIMIT_TIME: - Filesets_Dump_OnSelect (hDlg); - break; - - case IDC_DUMP_FILENAME: - Filesets_Dump_EnableOK (hDlg); - break; - - case IDC_DUMP_BROWSE: - Filesets_Dump_OnBrowse (hDlg, psdp); - break; - } - break; - - case WM_DESTROY: - psdp = NULL; - break; - } - } - - return FALSE; -} - - -void Filesets_Dump_OnInitDialog (HWND hDlg, LPSET_DUMP_PARAMS psdp) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - psdp->lpi->GetServerName (szServer); - psdp->lpi->GetAggregateName (szAggregate); - psdp->lpi->GetFilesetName (szFileset); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_DUMP_FULL, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_DUMP_FULL, pszText); - FreeString (pszText); - - pszText = FormatString (IDS_SET_DUMP_NAME, TEXT("%s"), szFileset); - SetDlgItemText (hDlg, IDC_DUMP_FILENAME, pszText); - FreeString (pszText); - - // Get the local system time - SYSTEMTIME st; - GetSystemTime (&st); - FILETIME ft; - SystemTimeToFileTime (&st, &ft); - FILETIME lft; - FileTimeToLocalFileTime (&ft, &lft); - FileTimeToSystemTime (&lft, &st); - - DA_SetDate (GetDlgItem (hDlg, IDC_DUMP_DATE), &st); - TI_SetTime (GetDlgItem (hDlg, IDC_DUMP_TIME), &st); - - CheckDlgButton (hDlg, IDC_DUMP_FULL, TRUE); - Filesets_Dump_OnSelect (hDlg); - Filesets_Dump_EnableOK (hDlg); -} - - -void Filesets_Dump_OnSelect (HWND hDlg) -{ - BOOL fEnable; - - fEnable = IsDlgButtonChecked (hDlg, IDC_DUMP_LIMIT_TIME); - EnableWindow (GetDlgItem (hDlg, IDC_DUMP_DATE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_DUMP_TIME), fEnable); -} - - -void Filesets_Dump_EnableOK (HWND hDlg) -{ - TCHAR szText[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_DUMP_FILENAME, szText, MAX_PATH); - - EnableWindow (GetDlgItem (hDlg, IDOK), (szText[0] == TEXT('\0')) ? FALSE : TRUE); -} - - -void Filesets_Dump_OnOK (HWND hDlg, LPSET_DUMP_PARAMS psdp) -{ - GetDlgItemText (hDlg, IDC_DUMP_FILENAME, psdp->szFilename, MAX_PATH); - - psdp->fDumpByDate = IsDlgButtonChecked (hDlg, IDC_DUMP_LIMIT_TIME); - memset (&psdp->stDump, 0x00, sizeof(SYSTEMTIME)); - DA_GetDate (GetDlgItem (hDlg, IDC_DUMP_DATE), &psdp->stDump); - TI_GetTime (GetDlgItem (hDlg, IDC_DUMP_TIME), &psdp->stDump); -} - - -void Filesets_Dump_OnBrowse (HWND hDlg, LPSET_DUMP_PARAMS psdp) -{ - TCHAR szFilter[ cchRESOURCE ]; - GetString (szFilter, IDS_RESTORE_FILTER); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - TCHAR szFilename[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_DUMP_FILENAME, szFilename, MAX_PATH); - - OPENFILENAME sfn; - memset (&sfn, 0x00, sizeof(sfn)); - sfn.lStructSize = sizeof(sfn); - sfn.hwndOwner = hDlg; - sfn.hInstance = THIS_HINST; - sfn.lpstrFilter = szFilter; - sfn.nFilterIndex = 1; - sfn.lpstrFile = szFilename; - sfn.nMaxFile = MAX_PATH; - sfn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; - sfn.lpstrDefExt = TEXT("dmp"); - - if (GetSaveFileName (&sfn)) - { - SetDlgItemText (hDlg, IDC_DUMP_FILENAME, szFilename); - Filesets_Dump_EnableOK (hDlg); - } -} - diff --git a/src/WINNT/afssvrmgr/set_dump.h b/src/WINNT/afssvrmgr/set_dump.h deleted file mode 100644 index 1c49fd423..000000000 --- a/src/WINNT/afssvrmgr/set_dump.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_DUMP_H -#define SET_DUMP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - TCHAR szFilename[ MAX_PATH ]; - BOOL fDumpByDate; - SYSTEMTIME stDump; - } SET_DUMP_PARAMS, *LPSET_DUMP_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_Dump (LPIDENT lpi); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_general.cpp b/src/WINNT/afssvrmgr/set_general.cpp deleted file mode 100644 index d42a1bfe8..000000000 --- a/src/WINNT/afssvrmgr/set_general.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_general.h" - - -/* - * FILESET PREFERENCES ________________________________________________________ - * - */ - -PVOID Filesets_LoadPreferences (LPIDENT lpiFileset) -{ - LPFILESET_PREF pfp = New (FILESET_PREF); - - if (!RestorePreferences (lpiFileset, pfp, sizeof(FILESET_PREF))) - { - pfp->perWarnSetFull = -1; // use the server's default value - - Alert_SetDefaults (&pfp->oa); - } - - Alert_Initialize (&pfp->oa); - return pfp; -} - - -BOOL Filesets_SavePreferences (LPIDENT lpiFileset) -{ - BOOL rc = FALSE; - - PVOID pfp = lpiFileset->GetUserParam(); - if (pfp != NULL) - { - rc = StorePreferences (lpiFileset, pfp, sizeof(FILESET_PREF)); - } - - return rc; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPIDENT Filesets_GetSelected (HWND hDlg) -{ - return (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_SET_LIST)); -} - - -LPIDENT Filesets_GetFocused (HWND hDlg, POINT *pptHitTest) -{ - HWND hList = GetDlgItem (hDlg, IDC_SET_LIST); - - if (pptHitTest == NULL) - { - return (LPIDENT)FL_GetFocusedData (hList); - } - - HLISTITEM hItem; - if ((hItem = FastList_ItemFromPoint (hList, pptHitTest, TRUE)) != NULL) - { - return (LPIDENT)FL_GetData (hList, hItem); - } - - return NULL; -} - - -BOOL Filesets_fIsLocked (LPFILESETSTATUS pfs) -{ - return (pfs->State & fsLOCKED) ? TRUE : FALSE; -} - diff --git a/src/WINNT/afssvrmgr/set_general.h b/src/WINNT/afssvrmgr/set_general.h deleted file mode 100644 index 616799ce6..000000000 --- a/src/WINNT/afssvrmgr/set_general.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_GENERAL_H -#define SET_GENERAL_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ckQUOTA_DEFAULT 5000 -#define ckQUOTA_MINIMUM 1 // minimum quota: 1kb -#define ckQUOTA_MAXIMUM (2L*ck1TB-1L) // maximum quota: 0x7FFFFFFF kb (~2TB) - -#define LVIS_ALL (LVIS_FOCUSED | LVIS_SELECTED | LVIS_CUT | LVIS_DROPHILITED) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -PVOID Filesets_LoadPreferences (LPIDENT lpiFileset); -BOOL Filesets_SavePreferences (LPIDENT lpiFileset); - -LPIDENT Filesets_GetSelected (HWND hDlg); -LPIDENT Filesets_GetFocused (HWND hDlg, LPPOINT pptHitTest = NULL); -HTREEITEM Filesets_GetFocusedItem (HWND hDlg, LPPOINT pptHitTest = NULL); - -BOOL Filesets_fIsLocked (LPFILESETSTATUS pfs); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_move.cpp b/src/WINNT/afssvrmgr/set_move.cpp deleted file mode 100644 index f8fd061e3..000000000 --- a/src/WINNT/afssvrmgr/set_move.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_move.h" -#include "columns.h" -#include "svr_window.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_MoveTo_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_MoveTo_OnInitDialog (HWND hDlg, LPSET_MOVE_PARAMS psmp); -void Filesets_MoveTo_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget); -void Filesets_MoveTo_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSET_MOVE_PARAMS psmp); -void Filesets_MoveTo_OnEndTask_EnumAggregates (HWND hDlg, LPSET_MOVE_PARAMS psmp); -void Filesets_MoveTo_EnableOK (HWND hDlg, LPSET_MOVE_PARAMS psmp); -void Filesets_MoveTo_StartDisplay_Aggregates (HWND hDlg, LPIDENT lpiTarget); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_ShowMoveTo (LPIDENT lpiSource, LPIDENT lpiTarget) -{ - LPSET_MOVE_PARAMS psmp = New (SET_MOVE_PARAMS); - psmp->lpiSource = lpiSource; - psmp->lpiTarget = lpiTarget; - - int rc = ModalDialogParam (IDD_SET_MOVETO, GetActiveWindow(), (DLGPROC)Filesets_MoveTo_DlgProc, (LPARAM)psmp); - if (rc != IDOK) - { - Delete (psmp); - } - else if (!ASSERT( psmp->lpiTarget && psmp->lpiTarget->fIsAggregate() )) - { - Delete (psmp); - } - else - { - StartTask (taskSET_MOVE, NULL, psmp); - } -} - - -BOOL CALLBACK Filesets_MoveTo_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPSET_MOVE_PARAMS psmp = NULL; - if (msg == WM_INITDIALOG) - psmp = (LPSET_MOVE_PARAMS)lp; - - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggMove)) - return FALSE; - - if (AfsAppLib_HandleHelp (IDD_SET_MOVETO, hDlg, msg, wp, lp)) - return TRUE; - - if (psmp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAggMove); - Filesets_MoveTo_OnInitDialog (hDlg, psmp); - StartTask (taskSET_MOVETO_INIT, hDlg, psmp->lpiSource); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSET_MOVETO_INIT) - Filesets_MoveTo_OnEndTask_InitDialog (hDlg, ptp, psmp); - else if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW) - Filesets_MoveTo_OnEndTask_EnumAggregates (hDlg, psmp); - else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - { - EnableWindow (GetDlgItem (hDlg, IDC_MOVESET_SERVER), TRUE); - Filesets_MoveTo_OnSelectServer (hDlg, &psmp->lpiTarget); - } - FreeTaskPacket (ptp); - } - break; - - case WM_CONTEXTMENU: - HWND hList; - hList = GetDlgItem (hDlg, IDC_AGG_LIST); - - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient (hList, &ptClient); - - if (FL_HitTestForHeaderBar (hList, ptClient)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - break; - - case WM_COLUMNS_CHANGED: - LPARAM lpSel; - lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove); - Filesets_MoveTo_OnSelectServer (hDlg, (LPIDENT*)&lpSel); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (psmp->lpiTarget) - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_MOVESET_SERVER: - if (HIWORD(wp) == CBN_SELCHANGE) - Filesets_MoveTo_OnSelectServer (hDlg, &psmp->lpiTarget); - break; - } - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove); - psmp = NULL; - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - LPIDENT lpi; - if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL) - { - psmp->lpiTarget = lpi; - Filesets_MoveTo_EnableOK (hDlg, psmp); - } - break; - } - break; - } - } - - return FALSE; -} - - -static LONG procFilesetsMoveToList = 0; - -LRESULT CALLBACK Filesets_MoveTo_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procFilesetsMoveToList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procFilesetsMoveToList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procFilesetsMoveToList != 0) - SetWindowLong (hList, GWL_WNDPROC, procFilesetsMoveToList); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case M_COLUMNS: - ShowColumnsDialog (GetParent (hList), &gr.viewAggMove); - break; - } - break; - } - - return rc; -} - - -void Filesets_MoveTo_OnInitDialog (HWND hDlg, LPSET_MOVE_PARAMS psmp) -{ - HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST); - if (procFilesetsMoveToList == 0) - procFilesetsMoveToList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_MoveTo_SubclassListProc); - - if (gr.viewAggMove.lvsView == 0) // never initialized this? - { - if (gr.viewAggCreate.lvsView == 0) - memcpy (&gr.viewAggMove, &gr.viewAgg, sizeof(VIEWINFO)); - else - memcpy (&gr.viewAggMove, &gr.viewAggCreate, sizeof(VIEWINFO)); - } - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove); - - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_MOVESET_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE); -} - - -void Filesets_MoveTo_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSET_MOVE_PARAMS psmp) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - psmp->lpiSource->GetServerName (szServer); - psmp->lpiSource->GetAggregateName (szAggregate); - psmp->lpiSource->GetFilesetName (szFileset); - - if (!ptp->rc) - { - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - EndDialog (hDlg, IDCANCEL); - } - else - { - int ids = (TASKDATA(ptp)->fs.Type == ftREADWRITE) ? IDS_MOVESET_READWRITE : IDS_MOVESET_READONLY; - LPTSTR pszDesc = FormatString (ids, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_MOVESET_DESC, pszDesc); - FreeString (pszDesc); - - // Fill in the Servers combobox, and select the default server - // (if one was specified). - // - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_MOVESET_SERVER); - lpp->lpiSelect = (psmp->lpiTarget) ? psmp->lpiTarget->GetServer() : NULL; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); - } -} - - -void Filesets_MoveTo_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget) -{ - LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_MOVESET_SERVER)); - - SetWindowLong (hDlg, DWL_USER, (LONG)lpiServerNew); - - if (*plpiTarget && (*plpiTarget)->fIsServer()) - *plpiTarget = NULL; - if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew)) - *plpiTarget = NULL; - - Filesets_MoveTo_StartDisplay_Aggregates (hDlg, *plpiTarget); -} - - -void Filesets_MoveTo_OnEndTask_EnumAggregates (HWND hDlg, LPSET_MOVE_PARAMS psmp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE); - Filesets_MoveTo_EnableOK (hDlg, psmp); -} - - -void Filesets_MoveTo_EnableOK (HWND hDlg, LPSET_MOVE_PARAMS psmp) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), (psmp->lpiTarget) ? TRUE : FALSE); -} - - -void Filesets_MoveTo_StartDisplay_Aggregates (HWND hDlg, LPIDENT lpiTarget) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - - LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET); - lpp->lpiServer = NULL; - lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST); - lpp->lpiSelect = lpiTarget; - lpp->lpvi = &gr.viewAggMove; - StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp); -} - diff --git a/src/WINNT/afssvrmgr/set_move.h b/src/WINNT/afssvrmgr/set_move.h deleted file mode 100644 index ff7e54495..000000000 --- a/src/WINNT/afssvrmgr/set_move.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_MOVE_H -#define SET_MOVE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiSource; - LPIDENT lpiTarget; - } SET_MOVE_PARAMS, *LPSET_MOVE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_ShowMoveTo (LPIDENT lpiSource, LPIDENT lpiTarget); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_prop.cpp b/src/WINNT/afssvrmgr/set_prop.cpp deleted file mode 100644 index 85114fa17..000000000 --- a/src/WINNT/afssvrmgr/set_prop.cpp +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_prop.h" -#include "set_quota.h" -#include "svr_general.h" -#include "propcache.h" -#include "problems.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Filesets_General_OnInitDialog (HWND hDlg, LPIDENT lpiFileset); -void Filesets_General_OnApply (HWND hDlg, LPIDENT lpiFileset); -void Filesets_General_OnWarnings (HWND hDlg, LPIDENT lpiFileset); - -void Filesets_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPIDENT lpi); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_ShowProperties (LPIDENT lpiFileset, size_t nAlerts, BOOL fJumpToThreshold) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSET_PROP, lpiFileset)) != NULL) - { - SetFocus (hCurrent); - - if (fJumpToThreshold) - { - HWND hTab; - if ((hTab = GetDlgItem (hCurrent, IDC_PROPSHEET_TABCTRL)) != NULL) - { - int nTabs = TabCtrl_GetItemCount (hTab); - TabCtrl_SetCurSel (hTab, nTabs-1); - - NMHDR nm; - nm.hwndFrom = hTab; - nm.idFrom = IDC_PROPSHEET_TABCTRL; - nm.code = TCN_SELCHANGE; - SendMessage (hCurrent, WM_NOTIFY, 0, (LPARAM)&nm); - } - } - } - else - { - TCHAR szCell[ cchNAME ]; - lpiFileset->GetCellName (szCell); - - TCHAR szFileset[ cchNAME ]; - lpiFileset->GetFilesetName (szFileset); - - LPTSTR pszTitle = FormatString (IDS_SET_PROP_TITLE, TEXT("%s"), szFileset); - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - psh->fMadeCaption = TRUE; - - if (PropSheet_AddProblemsTab (psh, IDD_SET_PROBLEMS, lpiFileset, nAlerts) && - PropSheet_AddTab (psh, IDS_SET_GENERAL_TAB, IDD_SET_GENERAL, (DLGPROC)Filesets_General_DlgProc, (LPARAM)lpiFileset, TRUE)) - { - if (fJumpToThreshold) - psh->sh.nStartPage = psh->sh.nPages-1; - PropSheet_ShowModeless (psh); - } - } -} - - -BOOL CALLBACK Filesets_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SET_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcSET_PROP, (LPIDENT)lp, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Filesets_General_OnInitDialog (hDlg, lpi); - StartTask (taskSET_PROP_INIT, hDlg, lpi); - NotifyMe (WHEN_OBJECT_CHANGES, lpi, hDlg, 0); - break; - - case WM_DESTROY: - DontNotifyMeEver (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSET_PROP_INIT) - Filesets_General_OnEndTask_InitDialog (hDlg, ptp, lpi); - FreeTaskPacket (ptp); - } - break; - - case WM_NOTIFY_FROM_DISPATCH: - StartTask (taskSET_PROP_INIT, hDlg, lpi); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - break; - - case IDAPPLY: - Filesets_General_OnApply (hDlg, lpi); - break; - - case IDC_SET_WARN: - case IDC_SET_WARN_SETFULL: - case IDC_SET_WARN_SETFULL_DEF: - Filesets_General_OnWarnings (hDlg, lpi); - PropSheetChanged (hDlg); - break; - - case IDC_SET_WARN_SETFULL_PERCENT: - PropSheetChanged (hDlg); - break; - - case IDC_SET_QUOTA: - if (Filesets_SetQuota (lpi)) - { - // this new task will block until the setquota req is done - StartTask (taskSET_PROP_INIT, hDlg, lpi); - } - break; - - case IDC_SET_LOCK: - StartTask (taskSET_LOCK, NULL, lpi); - break; - - case IDC_SET_UNLOCK: - StartTask (taskSET_UNLOCK, NULL, lpi); - break; - } - break; - } - - return FALSE; -} - - -void Filesets_General_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szText[ cchRESOURCE ]; - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - TCHAR szSetName[ cchNAME ]; - VOLUMEID vidFileset; - lpi->GetServerName (szSvrName); - lpi->GetAggregateName (szAggName); - lpi->GetFilesetName (szSetName); - lpi->GetFilesetID (&vidFileset); - - GetDlgItemText (hDlg, IDC_SET_NAME, szText, cchRESOURCE); - LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szSvrName, szAggName, szSetName); - SetDlgItemText (hDlg, IDC_SET_NAME, pszText); - FreeString (pszText); - - pszText = FormatString (TEXT("%1"), TEXT("%lu"), vidFileset); - SetDlgItemText (hDlg, IDC_SET_ID, pszText); - FreeString (pszText); - - EnableWindow (GetDlgItem (hDlg, IDC_SET_LOCK), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_UNLOCK), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE); -} - - -void Filesets_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPIDENT lpi) -{ - LPTSTR pszText; - - TCHAR szUnknown[ cchRESOURCE ]; - GetString (szUnknown, IDS_UNKNOWN); - - if (!ptp->rc) - { - SetDlgItemText (hDlg, IDC_SET_CREATEDATE, szUnknown); - SetDlgItemText (hDlg, IDC_SET_UPDATEDATE, szUnknown); - SetDlgItemText (hDlg, IDC_SET_ACCESSDATE, szUnknown); - SetDlgItemText (hDlg, IDC_SET_BACKUPDATE, szUnknown); - SetDlgItemText (hDlg, IDC_SET_USAGE, szUnknown); - SetDlgItemText (hDlg, IDC_SET_STATUS, szUnknown); - SetDlgItemText (hDlg, IDC_SET_FILES, szUnknown); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - TCHAR szSetName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetAggregateName (szAggName); - lpi->GetFilesetName (szSetName); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szSvrName, szAggName, szSetName); - } - else - { - TCHAR szText[ cchRESOURCE ]; - - EnableWindow (GetDlgItem (hDlg, IDC_SET_LOCK), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_UNLOCK), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), TRUE); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeCreation)) - SetDlgItemText (hDlg, IDC_SET_CREATEDATE, szUnknown); - else - SetDlgItemText (hDlg, IDC_SET_CREATEDATE, szText); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeLastUpdate)) - SetDlgItemText (hDlg, IDC_SET_UPDATEDATE, szUnknown); - else - SetDlgItemText (hDlg, IDC_SET_UPDATEDATE, szText); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeLastAccess)) - SetDlgItemText (hDlg, IDC_SET_ACCESSDATE, szUnknown); - else - SetDlgItemText (hDlg, IDC_SET_ACCESSDATE, szText); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeLastBackup)) - SetDlgItemText (hDlg, IDC_SET_BACKUPDATE, szUnknown); - else - SetDlgItemText (hDlg, IDC_SET_BACKUPDATE, szText); - - wsprintf (szText, TEXT("%lu"), TASKDATA(ptp)->fs.nFiles); - SetDlgItemText (hDlg, IDC_SET_FILES, szText); - - size_t nAlerts = Alert_GetCount (lpi); - if (nAlerts == 1) - { - GetString (szText, IDS_SETSTATUS_1ALERT); - SetDlgItemText (hDlg, IDC_SET_STATUS, szText); - } - else if (nAlerts > 1) - { - pszText = FormatString (IDS_SETSTATUS_2ALERT, TEXT("%lu"), nAlerts); - SetDlgItemText (hDlg, IDC_SET_STATUS, pszText); - FreeString (pszText); - } - else // (nAlerts == 0) - { - if (TASKDATA(ptp)->fs.State & fsBUSY) - GetString (szText, IDS_SETSTATUS_BUSY); - else if (TASKDATA(ptp)->fs.State & fsSALVAGE) - GetString (szText, IDS_SETSTATUS_SALVAGE); - else if (TASKDATA(ptp)->fs.State & fsMOVED) - GetString (szText, IDS_SETSTATUS_MOVED); - else if (TASKDATA(ptp)->fs.State & fsLOCKED) - GetString (szText, IDS_SETSTATUS_LOCKED); - else if (TASKDATA(ptp)->fs.State & fsNO_VOL) - GetString (szText, IDS_SETSTATUS_NO_VOL); - else - GetString (szText, IDS_STATUS_NOALERTS); - SetDlgItemText (hDlg, IDC_SET_STATUS, szText); - } - - if (TASKDATA(ptp)->fs.Type == ftREADWRITE) - { - Filesets_DisplayQuota (hDlg, &TASKDATA(ptp)->fs); - } - else - { - if (TASKDATA(ptp)->fs.Type == ftREPLICA) - GetString (szText, IDS_USAGE_REPLICA); - else // (TASKDATA(ptp)->fs.Type == ftCLONE) - GetString (szText, IDS_USAGE_CLONE); - - pszText = FormatString (szText, TEXT("%.1B"), (double)TASKDATA(ptp)->fs.ckUsed * cb1KB); - SetDlgItemText (hDlg, IDC_SET_USAGE, pszText); - FreeString (pszText); - - if (GetDlgItem (hDlg, IDC_SET_USAGEBAR)) - { - RECT rUsagebar; - GetRectInParent (GetDlgItem (hDlg, IDC_SET_USAGEBAR), &rUsagebar); - - HFONT hf = (HFONT)SendMessage (GetDlgItem (hDlg, IDC_SET_USAGEBAR), WM_GETFONT, 0, 0); - DestroyWindow (GetDlgItem (hDlg, IDC_SET_USAGEBAR)); - - if (TASKDATA(ptp)->fs.Type == ftREPLICA) - GetString (szText, IDS_NO_QUOTA_REPLICA); - else // (TASKDATA(ptp)->fs.Type == ftCLONE) - GetString (szText, IDS_NO_QUOTA_CLONE); - - HWND hDesc = CreateWindow (TEXT("static"), - szText, - WS_CHILD | SS_SIMPLE, - rUsagebar.left, rUsagebar.top, - cxRECT(rUsagebar), cyRECT(rUsagebar), - hDlg, - (HMENU)-1, - THIS_HINST, - 0); - SendMessage (hDesc, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - ShowWindow (hDesc, SW_SHOW); - } - - EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE); - } - - if (TASKDATA(ptp)->lpsp->perWarnSetFull == 0) - { - GetString (szText, IDS_SETFULL_WARN_OFF); - SetDlgItemText (hDlg, IDC_SET_WARN_SETFULL_DEF, szText); - } - else - { - GetString (szText, IDS_SETFULL_WARN_ON); - pszText = FormatString (szText, TEXT("%lu"), TASKDATA(ptp)->lpsp->perWarnSetFull); - SetDlgItemText (hDlg, IDC_SET_WARN_SETFULL_DEF, pszText); - FreeString (pszText); - } - - CheckDlgButton (hDlg, IDC_SET_WARN, (TASKDATA(ptp)->lpfp->perWarnSetFull != 0)); - if (TASKDATA(ptp)->lpfp->perWarnSetFull != 0) - { - if (TASKDATA(ptp)->lpfp->perWarnSetFull != -1) - CheckDlgButton (hDlg, IDC_SET_WARN_SETFULL, TRUE); - else - CheckDlgButton (hDlg, IDC_SET_WARN_SETFULL_DEF, TRUE); - } - - CreateSpinner (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), - 10, FALSE, // base, signed - 1, - (TASKDATA(ptp)->lpfp->perWarnSetFull == 0 || TASKDATA(ptp)->lpfp->perWarnSetFull == -1) ? perDEFAULT_SETFULL_WARNING : TASKDATA(ptp)->lpfp->perWarnSetFull, - 100); // min, default, max - - Filesets_General_OnWarnings (hDlg, lpi); - } -} - - -void Filesets_General_OnApply (HWND hDlg, LPIDENT lpi) -{ - LPSET_PROP_APPLY_PARAMS lpp = New (SET_PROP_APPLY_PARAMS); - - lpp->lpi = lpi; - lpp->fIDC_SET_WARN = IsDlgButtonChecked (hDlg, IDC_SET_WARN); - lpp->fIDC_SET_WARN_SETFULL_DEF = IsDlgButtonChecked (hDlg, IDC_SET_WARN_SETFULL_DEF); - lpp->wIDC_SET_WARN_SETFULL_PERCENT = (WORD)SP_GetPos (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT)); - - StartTask (taskSET_PROP_APPLY, hDlg, lpp); -} - - -void Filesets_General_OnWarnings (HWND hDlg, LPIDENT lpi) -{ - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SET_WARN))) - { - if (!IsDlgButtonChecked (hDlg, IDC_SET_WARN)) - { - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE); - } - else if (IsDlgButtonChecked (hDlg, IDC_SET_WARN_SETFULL)) - { - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), TRUE); - } - else // (IsDlgButtonChecked (hDlg, IDC_SET_WARN_SETFULL_DEF)) - { - CheckDlgButton (hDlg, IDC_SET_WARN_SETFULL_DEF, TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE); - } - } -} - diff --git a/src/WINNT/afssvrmgr/set_prop.h b/src/WINNT/afssvrmgr/set_prop.h deleted file mode 100644 index 2f28e9c48..000000000 --- a/src/WINNT/afssvrmgr/set_prop.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_PROP_H -#define SET_PROP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - BOOL fIDC_SET_WARN; - BOOL fIDC_SET_WARN_SETFULL_DEF; - WORD wIDC_SET_WARN_SETFULL_PERCENT; - } SET_PROP_APPLY_PARAMS, *LPSET_PROP_APPLY_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_ShowProperties (LPIDENT lpiFileset, size_t nAlerts, BOOL fThreshold = FALSE); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_quota.cpp b/src/WINNT/afssvrmgr/set_quota.cpp deleted file mode 100644 index e7d562ce0..000000000 --- a/src/WINNT/afssvrmgr/set_quota.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_quota.h" -#include "agg_prop.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_SetQuota_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Filesets_SetQuota_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Filesets_SetQuota_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSET_SETQUOTA_APPLY_PARAMS lpp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL Filesets_SetQuota (LPIDENT lpiFileset, size_t ckQuota) -{ - if (ckQuota == 0) - { - if ((ckQuota = Filesets_PickQuota (lpiFileset)) == 0) - return FALSE; - } - - LPSET_SETQUOTA_APPLY_PARAMS lpp = New (SET_SETQUOTA_APPLY_PARAMS); - lpp->lpiFileset = lpiFileset; - lpp->ckQuota = ckQuota; - StartTask (taskSET_SETQUOTA_APPLY, NULL, lpp); - return TRUE; -} - - -size_t Filesets_PickQuota (LPIDENT lpiFileset) -{ - SET_SETQUOTA_APPLY_PARAMS ssp; - memset (&ssp, 0x00, sizeof(ssp)); - ssp.lpiFileset = lpiFileset; - - int rc = ModalDialogParam (IDD_SET_SETQUOTA, GetActiveWindow(), (DLGPROC)Filesets_SetQuota_DlgProc, (LPARAM)&ssp); - if (rc != IDOK) - return 0; - else - return ssp.ckQuota; -} - - -BOOL CALLBACK Filesets_SetQuota_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPSET_SETQUOTA_APPLY_PARAMS lpp = NULL; - if (msg == WM_INITDIALOG) - lpp = (LPSET_SETQUOTA_APPLY_PARAMS)lp; - - if (AfsAppLib_HandleHelp (IDD_SET_SETQUOTA, hDlg, msg, wp, lp)) - return TRUE; - - if (lpp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - Filesets_SetQuota_OnInitDialog (hDlg, lpp->lpiFileset); - StartTask (taskSET_SETQUOTA_INIT, hDlg, lpp->lpiFileset); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSET_SETQUOTA_INIT) - Filesets_SetQuota_OnEndTask_InitDialog (hDlg, ptp, lpp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_SET_QUOTA: - if (HIWORD(wp) == SPN_UPDATE) - { - lpp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA)); - if (gr.cbQuotaUnits == cb1MB) - lpp->ckQuota *= ck1MB; - } - break; - - case IDC_SET_QUOTA_UNITS: - if (HIWORD(wp) == CBN_SELCHANGE) - { - lpp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA)); - if (gr.cbQuotaUnits == cb1MB) - lpp->ckQuota *= ck1MB; - - gr.cbQuotaUnits = (size_t)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS)); - StartTask (taskSET_SETQUOTA_INIT, hDlg, lpp->lpiFileset); - } - break; - - case IDC_AGG_PROPERTIES: - size_t nAlerts; - nAlerts = Alert_GetCount (lpp->lpiFileset->GetAggregate()); - Aggregates_ShowProperties (lpp->lpiFileset->GetAggregate(), nAlerts, TRUE, hDlg); - break; - } - break; - - case WM_DESTROY: - lpp = NULL; - break; - } - } - - return FALSE; -} - - -void Filesets_SetQuota_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetAggregateName (szAggregate); - lpi->GetFilesetName (szFileset); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SET_NAME, szText, cchRESOURCE); - LPTSTR pszNew = FormatString (szText, TEXT("%s"), szFileset); - SetDlgItemText (hDlg, IDC_SET_NAME, pszNew); - FreeString (pszNew); - - GetDlgItemText (hDlg, IDC_SET_AGGREGATE, szText, cchRESOURCE); - pszNew = FormatString (szText, TEXT("%s%s"), szServer, szAggregate); - SetDlgItemText (hDlg, IDC_SET_AGGREGATE, pszNew); - FreeString (pszNew); - - EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), FALSE); - - CB_StartChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), TRUE); - CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_KB, (LPARAM)cb1KB); - CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_MB, (LPARAM)cb1MB); - CB_EndChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), (LPARAM)gr.cbQuotaUnits); -} - - -void Filesets_SetQuota_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSET_SETQUOTA_APPLY_PARAMS lpp) -{ - if (!ptp->rc) - { - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - TCHAR szSetName[ cchNAME ]; - lpp->lpiFileset->GetServerName (szSvrName); - lpp->lpiFileset->GetAggregateName (szAggName); - lpp->lpiFileset->GetFilesetName (szSetName); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szSvrName, szAggName, szSetName); - EndDialog (hDlg, IDCANCEL); - } - else - { - BOOL fBeenHereBefore = fHasSpinner (GetDlgItem (hDlg, IDC_SET_QUOTA)); - - size_t cMin = TASKDATA(ptp)->ckMin; - size_t cMax = TASKDATA(ptp)->ckMax; - size_t cNow = (fBeenHereBefore) ? lpp->ckQuota : TASKDATA(ptp)->fs.ckQuota; - - if (gr.cbQuotaUnits == cb1MB) - { - cMin /= ck1MB; - cMax /= ck1MB; - cNow /= ck1MB; - } - - EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), TRUE); - - if (!fBeenHereBefore) - CreateSpinner (GetDlgItem (hDlg, IDC_SET_QUOTA), 10, FALSE, cMin, cNow, cMax); - else - { - SP_SetRange (GetDlgItem (hDlg, IDC_SET_QUOTA), cMin, cMax); - SP_SetPos (GetDlgItem (hDlg, IDC_SET_QUOTA), cNow); - } - Filesets_DisplayQuota (hDlg, &TASKDATA(ptp)->fs); - } -} - - -void Filesets_DisplayQuota (HWND hDlg, LPFILESETSTATUS lpfs) -{ - double dUsed = 1024.0 * lpfs->ckUsed; - double dTotal = 1024.0 * lpfs->ckQuota; - DWORD dwPer = 100; - if (lpfs->ckQuota != 0) - { - dwPer = (DWORD)( 100.0 * lpfs->ckUsed / lpfs->ckQuota ); - dwPer = limit( 0, dwPer, 100 ); - } - - LPTSTR pszUsage = FormatString (IDS_USAGE_FILESET, TEXT("%.1B%.1B%lu"), dUsed, dTotal, dwPer); - SetDlgItemText (hDlg, IDC_SET_USAGE, pszUsage); - FreeString (pszUsage); - - SendDlgItemMessage (hDlg, IDC_SET_USAGEBAR, PBM_SETRANGE, 0, MAKELPARAM(0,100)); - SendDlgItemMessage (hDlg, IDC_SET_USAGEBAR, PBM_SETPOS, (WPARAM)dwPer, 0); -} - diff --git a/src/WINNT/afssvrmgr/set_quota.h b/src/WINNT/afssvrmgr/set_quota.h deleted file mode 100644 index 7c93eaf61..000000000 --- a/src/WINNT/afssvrmgr/set_quota.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_QUOTA_H -#define SET_QUOTA_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiFileset; - size_t ckQuota; - } SET_SETQUOTA_APPLY_PARAMS, *LPSET_SETQUOTA_APPLY_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL Filesets_SetQuota (LPIDENT lpiFileset, size_t ckQuota = 0); // (0==ask) - -size_t Filesets_PickQuota (LPIDENT lpiFileset); - -void Filesets_DisplayQuota (HWND hDlg, LPFILESETSTATUS lpfs); - - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_release.cpp b/src/WINNT/afssvrmgr/set_release.cpp deleted file mode 100644 index 50238c108..000000000 --- a/src/WINNT/afssvrmgr/set_release.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_release.h" -#include "propcache.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Release_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Release_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Filesets_Release_OnOK (HWND hDlg, LPIDENT lpi); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_Release (LPIDENT lpi) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSET_RELEASE, lpi)) != NULL) - { - SetFocus (hCurrent); - } - else - { - HWND hDlg = ModelessDialogParam (IDD_SET_RELEASE, NULL, (DLGPROC)Filesets_Release_DlgProc, (LPARAM)lpi); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL CALLBACK Filesets_Release_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SET_RELEASE, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPIDENT lpi; - if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSET_RELEASE, lpi, hDlg); - Filesets_Release_OnInitDialog (hDlg, lpi); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Filesets_Release_OnOK (hDlg, lpi); - DestroyWindow (hDlg); - break; - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - - case WM_DESTROY: - PropCache_Delete (pcSET_RELEASE, lpi); - break; - } - } - - return FALSE; -} - - -void Filesets_Release_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetAggregateName (szAggregate); - lpi->GetFilesetName (szFileset); - - TCHAR szOld[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_RELSET_DESC, szOld, cchRESOURCE); - - LPTSTR pszText = FormatString (szOld, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_RELSET_DESC, pszText); - FreeString (pszText); - - CheckDlgButton (hDlg, IDC_RELSET_NORMAL, TRUE); - CheckDlgButton (hDlg, IDC_RELSET_FORCE, FALSE); -} - - -void Filesets_Release_OnOK (HWND hDlg, LPIDENT lpi) -{ - LPSET_RELEASE_PARAMS lpp = New (SET_RELEASE_PARAMS); - memset (lpp, 0x00, sizeof(SET_RELEASE_PARAMS)); - lpp->lpiRW = lpi; - lpp->fForce = IsDlgButtonChecked (hDlg, IDC_RELSET_FORCE); - StartTask (taskSET_RELEASE, NULL, lpp); -} - diff --git a/src/WINNT/afssvrmgr/set_release.h b/src/WINNT/afssvrmgr/set_release.h deleted file mode 100644 index c0d191da7..000000000 --- a/src/WINNT/afssvrmgr/set_release.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_RELEASE_H -#define SET_RELEASE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiRW; - BOOL fForce; - } SET_RELEASE_PARAMS, *LPSET_RELEASE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_Release (LPIDENT lpi); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_rename.cpp b/src/WINNT/afssvrmgr/set_rename.cpp deleted file mode 100644 index fd37966cf..000000000 --- a/src/WINNT/afssvrmgr/set_rename.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_rename.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Rename_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Rename_OnInitDialog (HWND hDlg, LPSET_RENAME_APPLY_PARAMS psrp); -void Filesets_Rename_EnableOK (HWND hDlg, LPSET_RENAME_APPLY_PARAMS psrp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_ShowRename (LPIDENT lpiFileset) -{ - LPSET_RENAME_INIT_PARAMS lpp = New (SET_RENAME_INIT_PARAMS); - memset (lpp, 0x00, sizeof(SET_RENAME_INIT_PARAMS)); - lpp->lpiReq = lpiFileset; - - StartTask (taskSET_RENAME_INIT, g.hMain, lpp); -} - - -void Filesets_OnEndTask_ShowRename (LPTASKPACKET ptp) -{ - LPSET_RENAME_INIT_PARAMS lpp = (LPSET_RENAME_INIT_PARAMS)(ptp->lpUser); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - TCHAR szSetName[ cchNAME ]; - lpp->lpiReq->GetServerName (szSvrName); - lpp->lpiReq->GetAggregateName (szAggName); - lpp->lpiReq->GetFilesetName (szSetName); - - if (!ptp->rc) - { - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szSvrName, szAggName, szSetName); - } - else if (!lpp->lpiRW) // couldn't find RW fileset entry? - { - ErrorDialog (ptp->status, IDS_ERROR_NOT_REPLICATED, TEXT("%s"), szSetName); - } - else - { - LPSET_RENAME_APPLY_PARAMS psrp = New (SET_RENAME_APPLY_PARAMS); - memset (psrp, 0x00, sizeof(SET_RENAME_APPLY_PARAMS)); - psrp->lpiFileset = lpp->lpiRW; - - int rc = ModalDialogParam (IDD_SET_RENAME, GetActiveWindow(), (DLGPROC)Filesets_Rename_DlgProc, (LPARAM)psrp); - if (rc != IDOK) - { - Delete (psrp); - } - else - { - StartTask (taskSET_RENAME_APPLY, NULL, psrp); - } - } - - Delete (lpp); -} - - -BOOL CALLBACK Filesets_Rename_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SET_RENAME, hDlg, msg, wp, lp)) - return TRUE; - - static LPSET_RENAME_APPLY_PARAMS psrp = NULL; - if (msg == WM_INITDIALOG) - psrp = (LPSET_RENAME_APPLY_PARAMS)lp; - - if (psrp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - Filesets_Rename_OnInitDialog (hDlg, psrp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_RENSET_NEW: - Filesets_Rename_EnableOK (hDlg, psrp); - break; - - case IDHELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_CONTEXT, IDH_SVRMGR_RENAMEFILESET_OVERVIEW); - break; - } - break; - - case WM_DESTROY: - psrp = NULL; - break; - } - } - - return FALSE; -} - - -void Filesets_Rename_OnInitDialog (HWND hDlg, LPSET_RENAME_APPLY_PARAMS psrp) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - - psrp->lpiFileset->GetServerName (szServer); - psrp->lpiFileset->GetAggregateName (szAggregate); - psrp->lpiFileset->GetFilesetName (szFileset); - - TCHAR szOld[ cchRESOURCE ]; - - GetDlgItemText (hDlg, IDC_RENSET_DESC, szOld, cchRESOURCE); - LPTSTR pszNew = FormatString (szOld, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_RENSET_DESC, pszNew); - FreeString (pszNew); - - SetDlgItemText (hDlg, IDC_RENSET_OLD, szFileset); - SetDlgItemText (hDlg, IDC_RENSET_NEW, szFileset); - - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_RENSET_NEW), TRUE); - - Filesets_Rename_EnableOK (hDlg, psrp); -} - - -void Filesets_Rename_EnableOK (HWND hDlg, LPSET_RENAME_APPLY_PARAMS psrp) -{ - TCHAR szOld[ cchNAME ]; - - GetDlgItemText (hDlg, IDC_RENSET_OLD, szOld, cchNAME); - GetDlgItemText (hDlg, IDC_RENSET_NEW, psrp->szNewName, cchNAME); - - BOOL fEnable = TRUE; - - if (!psrp->szNewName[0]) - { - fEnable = FALSE; - } - else if (!lstrcmpi (szOld, psrp->szNewName)) - { - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - diff --git a/src/WINNT/afssvrmgr/set_rename.h b/src/WINNT/afssvrmgr/set_rename.h deleted file mode 100644 index f1dc92f97..000000000 --- a/src/WINNT/afssvrmgr/set_rename.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_RENAME_H -#define SET_RENAME_H - - -/* - * TYPEDEFS ___________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiReq; - LPIDENT lpiRW; - } SET_RENAME_INIT_PARAMS, *LPSET_RENAME_INIT_PARAMS; - -typedef struct - { - LPIDENT lpiFileset; - TCHAR szNewName[ cchNAME ]; - } SET_RENAME_APPLY_PARAMS, *LPSET_RENAME_APPLY_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_ShowRename (LPIDENT lpiFileset); -void Filesets_OnEndTask_ShowRename (LPTASKPACKET ptp); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_repprop.cpp b/src/WINNT/afssvrmgr/set_repprop.cpp deleted file mode 100644 index 4556bc9cb..000000000 --- a/src/WINNT/afssvrmgr/set_repprop.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_repprop.h" -#include "set_createrep.h" -#include "set_delete.h" -#include "set_release.h" -#include "propcache.h" -#include "display.h" -#include "columns.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiReq; - LPIDENT lpiRW; - FILESETSTATUS fs; - } SET_REPPROP_PARAMS, *LPSET_REPPROP_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_RepSites_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_RepSites_OnInitDialog (HWND hDlg, LPSET_REPPROP_PARAMS prp); -void Filesets_RepSites_OnSelect (HWND hDlg); -void Filesets_RepSites_OnDelete (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_ShowReplication (HWND hDlg, LPIDENT lpiFileset, LPIDENT lpiTarget) -{ - LPSET_REPPROP_INIT_PARAMS lpp = New (SET_REPPROP_INIT_PARAMS); - memset (lpp, 0x00, sizeof(SET_REPPROP_INIT_PARAMS)); - lpp->lpiReq = lpiFileset; - - StartTask (taskSET_REPPROP_INIT, g.hMain, lpp); -} - -void Filesets_OnEndTask_ShowReplication (LPTASKPACKET ptp) -{ - LPSET_REPPROP_INIT_PARAMS lpp = (LPSET_REPPROP_INIT_PARAMS)(ptp->lpUser); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szAggName[ cchNAME ]; - TCHAR szSetName[ cchNAME ]; - lpp->lpiReq->GetServerName (szSvrName); - lpp->lpiReq->GetAggregateName (szAggName); - lpp->lpiReq->GetFilesetName (szSetName); - - if (!ptp->rc) - { - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szSvrName, szAggName, szSetName); - } - else if (!lpp->lpiRW) // couldn't find RW fileset entry? - { - ErrorDialog (ptp->status, IDS_ERROR_NOT_REPLICATED, TEXT("%s"), szSetName); - } - else - { - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSET_REP, lpp->lpiRW)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSET_REPPROP_PARAMS prp = New (SET_REPPROP_PARAMS); - prp->lpiReq = lpp->lpiReq; - prp->lpiRW = lpp->lpiRW; - memcpy (&prp->fs, &lpp->fs, sizeof(lpp->fs)); - - LPTSTR pszTitle = FormatString (IDS_SET_REP_TITLE, TEXT("%s"), szSetName); - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - psh->sh.dwFlags |= PSH_NOAPPLYNOW; - psh->fMadeCaption = TRUE; - - if (PropSheet_AddTab (psh, IDS_SET_REPSITES_TAB, IDD_SET_REPSITES, (DLGPROC)Filesets_RepSites_DlgProc, (LPARAM)prp, TRUE, TRUE)) - { - PropSheet_ShowModeless (psh); - } - } - } - - Delete (lpp); -} - - -BOOL CALLBACK Filesets_RepSites_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewRep)) - return FALSE; - - if (AfsAppLib_HandleHelp (IDD_SET_REPSITES, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - if (msg == WM_INITDIALOG_SHEET) - { - PropCache_Add (pcSET_REP, ((LPSET_REPPROP_PARAMS)lp)->lpiRW, hDlg); - } - else if (msg == WM_DESTROY_SHEET) - { - PropCache_Delete (hDlg); - } - else - { - LPSET_REPPROP_PARAMS prp; - if ((prp = (LPSET_REPPROP_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_SET_REP_LIST), GetItemText, (DWORD)&gr.viewRep); - Filesets_RepSites_OnInitDialog (hDlg, prp); - NotifyMe (WHEN_SETS_CHANGE, NULL, hDlg, 0); - break; - - case WM_DESTROY: - DontNotifyMeEver (hDlg); - SetWindowLong (hDlg, DWL_USER, 0); - Delete (prp); - break; - - case WM_CONTEXTMENU: - if ((HWND)wp == GetDlgItem (hDlg, IDC_SET_REP_LIST)) - { - HWND hList = GetDlgItem (hDlg, IDC_SET_REP_LIST); - - POINT ptScreen; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - POINT ptClient; - ptClient = ptScreen; - ScreenToClient ((HWND)wp, &ptClient); - - if (FL_HitTestForHeaderBar (hList, ptClient)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - } - break; - - case WM_COLUMNS_CHANGED: - HWND hList; - hList = GetDlgItem (hDlg, IDC_SET_REP_LIST); - LPIDENT lpiSel; - lpiSel = (LPIDENT)FL_GetSelectedData (hList); - FL_RestoreView (hList, &gr.viewRep); - UpdateDisplay_Replicas (FALSE, hList, prp->lpiRW, lpiSel); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - case IDAPPLY: - break; - - case IDC_SET_REPSITE_ADD: - Filesets_CreateReplica (prp->lpiRW); - break; - - case IDC_SET_REPSITE_DELETE: - Filesets_RepSites_OnDelete (hDlg); - break; - - case IDC_SET_RELEASE: - Filesets_Release (prp->lpiRW); - break; - } - break; - - case WM_NOTIFY_FROM_DISPATCH: - UpdateDisplay_Replicas (FALSE, GetDlgItem (hDlg, IDC_SET_REP_LIST), prp->lpiRW, prp->lpiReq); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_COLUMNRESIZE: - FL_StoreView (GetDlgItem (hDlg, IDC_SET_REP_LIST), &gr.viewRep); - break; - - case FLN_ITEMSELECT: - Filesets_RepSites_OnSelect (hDlg); - break; - } - break; - } - } - } - - return FALSE; -} - - -static LONG procRepSitesList = 0; - -LRESULT CALLBACK Filesets_RepSites_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procRepSitesList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procRepSitesList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procRepSitesList != 0) - SetWindowLong (hList, GWL_WNDPROC, procRepSitesList); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case M_COLUMNS: - ShowColumnsDialog (GetParent (hList), &gr.viewRep); - break; - } - break; - } - - return rc; -} - - -void Filesets_RepSites_OnInitDialog (HWND hDlg, LPSET_REPPROP_PARAMS prp) -{ - HWND hList = GetDlgItem (hDlg, IDC_SET_REP_LIST); - if (procRepSitesList == 0) - procRepSitesList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_RepSites_SubclassListProc); - - TCHAR szServer[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - prp->lpiRW->GetServerName (szServer); - prp->lpiRW->GetAggregateName (szAggregate); - prp->lpiRW->GetFilesetName (szFileset); - SetDlgItemText (hDlg, IDC_SET_SERVER, szServer); - SetDlgItemText (hDlg, IDC_SET_AGGREGATE, szAggregate); - SetDlgItemText (hDlg, IDC_SET_NAME, szFileset); - - FL_RestoreView (GetDlgItem (hDlg, IDC_SET_REP_LIST), &gr.viewRep); - UpdateDisplay_Replicas (FALSE, GetDlgItem (hDlg, IDC_SET_REP_LIST), prp->lpiRW, prp->lpiReq); -} - - -void Filesets_RepSites_OnSelect (HWND hDlg) -{ - LPIDENT lpiSelected = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_SET_REP_LIST)); - EnableWindow (GetDlgItem (hDlg, IDC_SET_REPSITE_DELETE), (lpiSelected != NULL)); -} - - -void Filesets_RepSites_OnDelete (HWND hDlg) -{ - LPIDENT lpiSelected = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_SET_REP_LIST)); - if (lpiSelected) - Filesets_Delete (lpiSelected); -} - diff --git a/src/WINNT/afssvrmgr/set_repprop.h b/src/WINNT/afssvrmgr/set_repprop.h deleted file mode 100644 index 1b22f886f..000000000 --- a/src/WINNT/afssvrmgr/set_repprop.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_REPPROP_H -#define SET_REPPROP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiReq; - LPIDENT lpiRW; - FILESETSTATUS fs; - } SET_REPPROP_INIT_PARAMS, *LPSET_REPPROP_INIT_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_ShowReplication (HWND hDlg, LPIDENT lpiFileset, LPIDENT lpiTarget = NULL); - -void Filesets_OnEndTask_ShowReplication (LPTASKPACKET ptp); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_restore.cpp b/src/WINNT/afssvrmgr/set_restore.cpp deleted file mode 100644 index 51455a570..000000000 --- a/src/WINNT/afssvrmgr/set_restore.cpp +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "set_restore.h" -#include "set_general.h" -#include "propcache.h" -#include "columns.h" -#include "svr_window.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_Restore_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Filesets_Restore_OnInitDialog (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnEndTask_LookupFileset (HWND hDlg, LPTASKPACKET ptp, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnEndTask_EnumServers (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnEndTask_EnumAggregates (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnSelectServer (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnSetName (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnFileName (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnAggregate (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_OnBrowse (HWND hDlg, LPSET_RESTORE_PARAMS psrp); -void Filesets_Restore_EnableOK (HWND hDlg, LPSET_RESTORE_PARAMS psrp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Filesets_Restore (LPIDENT lpiParent) -{ - LPSET_RESTORE_PARAMS psrp = New (SET_RESTORE_PARAMS); - psrp->lpi = lpiParent; - psrp->szFileset[0] = TEXT('\0'); - psrp->szFilename[0] = TEXT('\0'); - psrp->fIncremental = FALSE; - - if (lpiParent && lpiParent->fIsFileset()) - lpiParent->GetFilesetName (psrp->szFileset); - - int rc = ModalDialogParam (IDD_SET_RESTORE, GetActiveWindow(), (DLGPROC)Filesets_Restore_DlgProc, (LPARAM)psrp); - if (rc != IDOK) - { - Delete (psrp); - } - else if (!ASSERT( psrp->lpi != NULL )) - { - Delete (psrp); - } - else if (!ASSERT( psrp->szFileset[0] != TEXT('\0') )) - { - Delete (psrp); - } - else if (!ASSERT( psrp->szFilename[0] != TEXT('\0') )) - { - Delete (psrp); - } - else - { - StartTask (taskSET_RESTORE, NULL, psrp); - } -} - - -BOOL CALLBACK Filesets_Restore_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPSET_RESTORE_PARAMS psrp = NULL; - if (msg == WM_INITDIALOG) - psrp = (LPSET_RESTORE_PARAMS)lp; - - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggRestore)) - return FALSE; - - if (AfsAppLib_HandleHelp (IDD_SET_RESTORE, hDlg, msg, wp, lp)) - return TRUE; - - if (psrp != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAggRestore); - Filesets_Restore_OnInitDialog (hDlg, psrp); - break; - - case WM_CONTEXTMENU: - HWND hList; - hList = GetDlgItem (hDlg, IDC_AGG_LIST); - - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient (hList, &ptClient); - - if (FL_HitTestForHeaderBar (hList, ptClient)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSET_LOOKUP) - Filesets_Restore_OnEndTask_LookupFileset (hDlg, ptp, psrp); - else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Filesets_Restore_OnEndTask_EnumServers (hDlg, psrp); - else if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW) - Filesets_Restore_OnEndTask_EnumAggregates (hDlg, psrp); - FreeTaskPacket (ptp); - } - break; - - case WM_COLUMNS_CHANGED: - LPARAM lpSel; - lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggRestore); - Filesets_Restore_OnSelectServer (hDlg, psrp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_RESTORE_INCREMENTAL: - psrp->fIncremental = IsDlgButtonChecked (hDlg, IDC_RESTORE_INCREMENTAL); - break; - - case IDC_RESTORE_SERVER: - if (HIWORD(wp) == CBN_SELCHANGE) - Filesets_Restore_OnSelectServer (hDlg, psrp); - break; - - case IDC_RESTORE_SETNAME: - if (HIWORD(wp) == EN_UPDATE) - Filesets_Restore_OnSetName (hDlg, psrp); - break; - - case IDC_RESTORE_FILENAME: - Filesets_Restore_OnFileName (hDlg, psrp); - break; - - case IDC_RESTORE_BROWSE: - Filesets_Restore_OnBrowse (hDlg, psrp); - break; - } - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggRestore); - psrp = NULL; - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Filesets_Restore_OnAggregate (hDlg, psrp); - break; - } - break; - } - } - - return FALSE; -} - - -static LONG procFilesetsRestoreList = 0; - -LRESULT CALLBACK Filesets_Restore_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procFilesetsRestoreList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procFilesetsRestoreList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procFilesetsRestoreList != 0) - SetWindowLong (hList, GWL_WNDPROC, procFilesetsRestoreList); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case M_COLUMNS: - ShowColumnsDialog (GetParent (hList), &gr.viewAggRestore); - break; - } - break; - } - - return rc; -} - - -void Filesets_Restore_OnInitDialog (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST); - if (procFilesetsRestoreList == 0) - procFilesetsRestoreList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_Restore_SubclassListProc); - - if (gr.viewAggRestore.lvsView == 0) // never initialized this? - { - if (gr.viewAggMove.lvsView != 0) - memcpy (&gr.viewAggRestore, &gr.viewAggMove, sizeof(VIEWINFO)); - else if (gr.viewAggCreate.lvsView != 0) - memcpy (&gr.viewAggRestore, &gr.viewAggCreate, sizeof(VIEWINFO)); - else - memcpy (&gr.viewAggRestore, &gr.viewAgg, sizeof(VIEWINFO)); - } - - FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggRestore); - - SetDlgItemText (hDlg, IDC_RESTORE_FILENAME, psrp->szFilename); - SetDlgItemText (hDlg, IDC_RESTORE_SETNAME, psrp->szFileset); - - SetDlgItemText (hDlg, IDC_RESTORE_CREATE, TEXT("")); - Filesets_Restore_OnEndTask_LookupFileset (hDlg, NULL, psrp); - - CheckDlgButton (hDlg, IDC_RESTORE_INCREMENTAL, psrp->fIncremental); - - // Fill in the Servers combobox, and select the default server - // (if one was specified). - // - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_RESTORE_SERVER); - lpp->lpiSelect = (psrp->lpi) ? psrp->lpi->GetServer() : NULL; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); -} - - -void Filesets_Restore_OnSelectServer (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_RESTORE_SERVER)); - - LPIDENT lpiSelect = NULL; - if (psrp->lpi && !psrp->lpi->fIsServer()) - { - if (psrp->lpi->GetServer() == lpiServerNew) - lpiSelect = psrp->lpi->GetAggregate(); - } - - SetWindowLong (hDlg, DWL_USER, (LONG)lpiServerNew); - - LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET); - lpp->lpiServer = lpiServerNew; - lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST); - lpp->lpiSelect = lpiSelect; - lpp->lpvi = &gr.viewAggRestore; - StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp); -} - - -void Filesets_Restore_OnEndTask_EnumServers (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - Filesets_Restore_OnSelectServer (hDlg, psrp); -} - - -void Filesets_Restore_OnEndTask_EnumAggregates (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - ; -} - - -void Filesets_Restore_OnEndTask_LookupFileset (HWND hDlg, LPTASKPACKET ptp, LPSET_RESTORE_PARAMS psrp) -{ - if (ptp) - { - psrp->lpi = (ptp->rc) ? TASKDATA(ptp)->lpi : NULL; - } - if (!psrp->lpi) - { - psrp->lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); - } - - BOOL fCreate = (psrp->lpi && psrp->lpi->fIsFileset()) ? FALSE : TRUE; - - TCHAR szFileset[ cchNAME ]; - GetDlgItemText (hDlg, IDC_RESTORE_SETNAME, szFileset, cchNAME); - - LPTSTR pszText; - if (szFileset[0] == TEXT('\0')) - { - pszText = CloneString (TEXT("")); - } - else if (fCreate) - { - pszText = FormatString (IDS_RESTORE_CREATESET, TEXT("%s"), szFileset); - } - else - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - psrp->lpi->GetServerName (szServer); - psrp->lpi->GetAggregateName (szAggregate); - pszText = FormatString (IDS_RESTORE_OVERWRITESET, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - SetDlgItemText (hDlg, IDC_RESTORE_CREATE, pszText); - FreeString (pszText); - - EnableWindow (GetDlgItem (hDlg, IDC_RESTORE_SERVER), fCreate); - EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), fCreate); - - if (psrp->lpi) - { - LPIDENT lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_RESTORE_SERVER)); - - if (psrp->lpi->GetServer() != lpiServer) - { - CB_SetSelectedByData (GetDlgItem (hDlg, IDC_RESTORE_SERVER), (LPARAM)psrp->lpi->GetServer()); - Filesets_Restore_OnSelectServer (hDlg, psrp); - } - else if (!psrp->lpi->fIsServer()) - { - FL_SetSelectedByData (GetDlgItem (hDlg, IDC_AGG_LIST), (LPARAM)psrp->lpi->GetAggregate()); - } - } - - Filesets_Restore_EnableOK (hDlg, psrp); -} - - -void Filesets_Restore_OnFileName (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - GetDlgItemText (hDlg, IDC_RESTORE_FILENAME, psrp->szFilename, MAX_PATH); - Filesets_Restore_EnableOK (hDlg, psrp); -} - - -void Filesets_Restore_OnSetName (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - GetDlgItemText (hDlg, IDC_RESTORE_SETNAME, psrp->szFileset, cchNAME); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - - LPSET_LOOKUP_PACKET lpp = New (SET_LOOKUP_PACKET); - lstrcpy (lpp->szFileset, psrp->szFileset); - StartTask (taskSET_LOOKUP, hDlg, lpp); -} - - -void Filesets_Restore_OnAggregate (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - if (!( psrp->lpi && psrp->lpi->fIsFileset() )) - { - psrp->lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST)); - } - - Filesets_Restore_EnableOK (hDlg, psrp); -} - - -void Filesets_Restore_EnableOK (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - BOOL fEnable = TRUE; - - if (psrp->szFilename[0] == TEXT('\0')) - fEnable = FALSE; - - if (psrp->szFileset[0] == TEXT('\0')) - fEnable = FALSE; - - if (!psrp->lpi || psrp->lpi->fIsServer()) - fEnable = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Filesets_Restore_OnBrowse (HWND hDlg, LPSET_RESTORE_PARAMS psrp) -{ - TCHAR szFilter[ cchRESOURCE ]; - GetString (szFilter, IDS_RESTORE_FILTER); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - TCHAR szFilename[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_RESTORE_FILENAME, szFilename, MAX_PATH); - - OPENFILENAME ofn; - memset (&ofn, 0x00, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hDlg; - ofn.hInstance = THIS_HINST; - ofn.lpstrFilter = szFilter; - ofn.nFilterIndex = 1; - ofn.lpstrFile = szFilename; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_HIDEREADONLY | OFN_NOREADONLYRETURN | - OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; - ofn.lpstrDefExt = TEXT("dmp"); - - if (GetOpenFileName (&ofn)) - { - SetDlgItemText (hDlg, IDC_RESTORE_FILENAME, szFilename); - Filesets_Restore_OnFileName (hDlg, psrp); - } -} - diff --git a/src/WINNT/afssvrmgr/set_restore.h b/src/WINNT/afssvrmgr/set_restore.h deleted file mode 100644 index dbde74a22..000000000 --- a/src/WINNT/afssvrmgr/set_restore.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_RESTORE_H -#define SET_RESTORE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - TCHAR szFileset[ cchNAME ]; - TCHAR szFilename[ MAX_PATH ]; - BOOL fIncremental; - } SET_RESTORE_PARAMS, *LPSET_RESTORE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_Restore (LPIDENT lpiParent = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/set_tab.cpp b/src/WINNT/afssvrmgr/set_tab.cpp deleted file mode 100644 index 9d6cab3cb..000000000 --- a/src/WINNT/afssvrmgr/set_tab.cpp +++ /dev/null @@ -1,781 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_window.h" -#include "svr_general.h" -#include "svc_tab.h" -#include "agg_tab.h" -#include "agg_general.h" -#include "set_tab.h" -#include "set_general.h" -#include "set_move.h" -#include "set_repprop.h" -#include "set_createrep.h" -#include "display.h" -#include "columns.h" -#include "command.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdFilesets[] = { - { IDC_SET_DESC, raSizeX, 0, 0 }, - { IDC_SET_LIST, raSizeX | raSizeY, 0, 0 }, - { IDC_SET_CREATE, raMoveX | raMoveY, 0, 0 }, - { IDC_SET_DELETE, raMoveX | raMoveY, 0, 0 }, - { IDC_SET_REP, raMoveX | raMoveY, 0, 0 }, - { IDC_SET_SETQUOTA, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct // l - { - BOOL fDragging; - BOOL fRightBtn; - HIMAGELIST hDragImage; - LPIDENT lpiDrag; - LPIDENT lpiTarget; - HWND hwndTarget; - HLISTITEM hItemTarget; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Filesets_OnView (HWND hDlg); -void Filesets_OnSelect (HWND hDlg); -void Filesets_OnEndTask_Select (HWND hDlg, LPTASKPACKET ptp); -void Filesets_OnEndTask_BeginDrag (HWND hDlg, LPTASKPACKET ptp); -void Filesets_OnEndTask_DragMenu (HWND hDlg, LPTASKPACKET ptp); -void Filesets_OnEndTask_Menu (HWND hDlg, LPTASKPACKET ptp); - -void Filesets_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns); - -LPIDENT IdentifyPoint (HWND hTarget, POINT ptClient, HLISTITEM *phItemTarget); - -void Filesets_SubclassList (HWND hDlg); -void Filesets_Subclass_OnCommand (HWND hList, UINT msg, WPARAM wp, LPARAM lp); - -BOOL Filesets_BeginDrag (HWND hDlg, BOOL fRightBtn); -void Filesets_ContinueDrag (HWND hDlg); -void Filesets_FinishDrag (HWND hDlg, BOOL fDropped, BOOL fMenu); -void Filesets_CancelDrag (HWND hDlg); - -void Filesets_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewSet)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - { - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - ResizeWindow (hDlg, awdFilesets, rwaMoveToHere, &rTab); - - FL_RestoreView (GetDlgItem (hDlg, IDC_SET_LIST), &gr.viewSet); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_SET_LIST), GetItemText, (DWORD)&gr.viewSet); - - Filesets_SubclassList (hDlg); - - Filesets_OnView (hDlg); - Filesets_OnSelect (hDlg); - } - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_SET_LIST), &gr.viewSet); - DontNotifyMeEver (hDlg); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdFilesets, rwaFixupGuts); - break; - - case WM_CONTEXTMENU: - { - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient ((HWND)wp, &ptClient); - - if ((HWND)wp == GetDlgItem (hDlg, IDC_SET_LIST)) - Filesets_ShowPopupMenu ((HWND)wp, ptClient, ptScreen); - } - break; - - case WM_SERVER_CHANGED: - { - LPIDENT lpiServer = Server_GetServerForChild (hDlg); - DontNotifyMeEver (hDlg); - NotifyMe (WHEN_OBJECT_CHANGES, NULL, hDlg, 0); - - // Fix the text at the top of the Aggregates tab: - // - TCHAR szName[ cchRESOURCE ]; - LPTSTR pszText; - - if (lpiServer != NULL) - { - LPSERVER_PREF lpsp = (LPSERVER_PREF)lpiServer->GetUserParam(); - lpiServer->GetServerName (szName); - if (lpsp && !lpsp->fIsMonitored) - pszText = FormatString (IDS_FILESET_UNMON, TEXT("%s"), szName); - else - pszText = FormatString (IDS_FILESETS_IN_SERVER, TEXT("%s"), szName); - } - else if (g.lpiCell != NULL) - { - g.lpiCell->GetCellName (szName); - if (g.sub) - pszText = FormatString (IDS_FILESET_SOME, TEXT("%s"), szName); - else - pszText = FormatString (IDS_FILESETS_IN_CELL, TEXT("%s"), szName); - } - else - { - pszText = FormatString (IDS_FILESETS_IN_NOTHING); - } - - SetDlgItemText (hDlg, IDC_SET_DESC, pszText); - FreeString (pszText); - - UpdateDisplay_Filesets (FALSE, GetDlgItem (hDlg, IDC_SET_LIST), NULL, 0, NULL, NULL, NULL); - } - break; - - case WM_NOTIFY_FROM_DISPATCH: - Filesets_OnNotifyFromDispatch ((LPNOTIFYSTRUCT)lp); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_SET_CREATE: - SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_CREATE, 0); - break; - - case IDC_SET_DELETE: - SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_DELETE, 0); - break; - - case IDC_SET_REP: - SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_REPLICATION, 0); - break; - - case IDC_SET_SETQUOTA: - SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_SETQUOTA, 0); - break; - } - break; - - case WM_MOUSEMOVE: - Filesets_ContinueDrag (hDlg); - break; - - case WM_LBUTTONDOWN: - if (l.fDragging && l.fRightBtn) - Filesets_FinishDrag (hDlg, FALSE, FALSE); - break; - - case WM_RBUTTONDOWN: - if (l.fDragging && !l.fRightBtn) - Filesets_FinishDrag (hDlg, FALSE, FALSE); - break; - - case WM_LBUTTONUP: - if (l.fDragging && !l.fRightBtn) - Filesets_FinishDrag (hDlg, TRUE, FALSE); - break; - - case WM_RBUTTONUP: - if (l.fDragging && l.fRightBtn) - Filesets_FinishDrag (hDlg, TRUE, TRUE); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSET_SELECT) - Filesets_OnEndTask_Select (hDlg, ptp); - else if (ptp->idTask == taskSET_BEGINDRAG) - Filesets_OnEndTask_BeginDrag (hDlg, ptp); - else if (ptp->idTask == taskSET_DRAGMENU) - Filesets_OnEndTask_DragMenu (hDlg, ptp); - else if (ptp->idTask == taskSET_MENU) - Filesets_OnEndTask_Menu (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST)) - { - Filesets_OnSelect (hDlg); - } - break; - - case FLN_ITEMEXPAND: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST)) - { - HLISTITEM hItem = ((LPFLN_ITEMEXPAND_PARAMS)lp)->hItem; - LPIDENT lpi = (LPIDENT)FastList_GetItemParam (GetDlgItem (hDlg, IDC_SET_LIST), hItem); - BOOL fExpanded = ((LPFLN_ITEMEXPAND_PARAMS)lp)->fExpanded; - - if (lpi && lpi->fIsServer()) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpi->GetUserParam()) != NULL) - { - lpsp->fExpandTree = fExpanded; - Server_SavePreferences (lpi); - } - } - else if (lpi && lpi->fIsAggregate()) - { - LPAGGREGATE_PREF lpap; - if ((lpap = (LPAGGREGATE_PREF)lpi->GetUserParam()) != NULL) - { - lpap->fExpandTree = fExpanded; - Aggregates_SavePreferences (lpi); - } - } - } - break; - - case FLN_BEGINDRAG: - return Filesets_BeginDrag (hDlg, ((LPFLN_DRAG_PARAMS)lp)->fRightButton); - - case FLN_LDBLCLICK: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST)) - { - BOOL fShowProperties = TRUE; - - HLISTITEM hItem; - if ((hItem = FastList_GetFocus (GetDlgItem (hDlg, IDC_SET_LIST))) != NULL) - { - if (FastList_FindFirstChild (GetDlgItem (hDlg, IDC_SET_LIST), hItem)) - fShowProperties = FALSE; - } - - LPIDENT lpi = Filesets_GetFocused (hDlg); - if (lpi && !lpi->fIsCell() && fShowProperties) - { - PostMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_PROPERTIES, 0); - return TRUE; - } - } - break; - } - break; - } - - return FALSE; -} - - -void Filesets_OnSelect (HWND hDlg) -{ - LPIDENT lpi = Filesets_GetSelected (hDlg); - - if (!lpi || !lpi->fIsFileset()) - { - EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), FALSE); - } - else - { - StartTask (taskSET_SELECT, hDlg, lpi); - } -} - - -void Filesets_OnEndTask_Select (HWND hDlg, LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - if (!ptp->rc) - EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), FALSE); - else - EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), TRUE); - - if ((!ptp->rc) || (TASKDATA(ptp)->fs.Type == ftCLONE)) - EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), FALSE); - else - EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), TRUE); - - if ((!ptp->rc) || (TASKDATA(ptp)->fs.Type != ftREADWRITE)) - EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), FALSE); - else - EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), TRUE); -} - - -void Filesets_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns) -{ - switch (lpns->evt) - { - case evtRefreshFilesetsEnd: - case evtRefreshStatusEnd: - case evtAlertsChanged: - case evtDestroy: - if ( (!lpns->Params.lpi1) || - (lpns->Params.lpi1->fIsServer()) || - (lpns->Params.lpi1->fIsAggregate()) || - (lpns->Params.lpi1->fIsFileset()) ) - { - UpdateDisplay_Filesets (FALSE, GetDlgItem (lpns->hwndTarget, IDC_SET_LIST), lpns->Params.lpi1, lpns->Params.status, NULL, NULL, NULL); - } - break; - } -} - - -static LONG procFilesetsList = 0; - -LRESULT CALLBACK Filesets_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procFilesetsList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procFilesetsList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procFilesetsList != 0) - SetWindowLong (hList, GWL_WNDPROC, procFilesetsList); - break; - - case WM_COMMAND: - Filesets_Subclass_OnCommand (hList, msg, wp, lp); - break; - } - - return rc; -} - - -void Filesets_Subclass_OnCommand (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - HWND hChild = GetParent (hList); - LPIDENT lpi = Filesets_GetSelected (hChild); - - switch (LOWORD(wp)) - { - case M_COLUMNS: - ShowColumnsDialog (hChild, &gr.viewSet); - break; - - case M_SET_VIEW_TREELIST: - gr.viewSet.lvsView = FLS_VIEW_TREELIST; - Filesets_OnView (hChild); - break; - - case M_SET_VIEW_TREE: - gr.viewSet.lvsView = FLS_VIEW_TREE; - Filesets_OnView (hChild); - break; - - case M_SET_VIEW_REPORT: - gr.viewSet.lvsView = FLS_VIEW_LIST; - Filesets_OnView (hChild); - break; - - case M_SET_MOVEHERE: - if (l.lpiDrag && l.lpiDrag->fIsFileset() && l.lpiTarget) - Filesets_ShowMoveTo (l.lpiDrag, l.lpiTarget); - break; - - case M_SET_REPHERE: - if (l.lpiDrag && l.lpiDrag->fIsFileset() && l.lpiTarget) - { - Filesets_CreateReplica (l.lpiDrag, l.lpiTarget); - } - break; - - default: - StartContextCommand (Server_GetWindowForChild (GetParent(hList)), - Server_GetServerForChild (GetParent(hList)), - lpi, - LOWORD(wp)); - break; - } -} - - -void Filesets_SubclassList (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SET_LIST); - procFilesetsList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_SubclassListProc); -} - - -void Filesets_OnView (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SET_LIST); - - DWORD dwStyle = GetWindowLong (hList, GWL_STYLE); - dwStyle &= (~FLS_VIEW_MASK); - dwStyle |= gr.viewSet.lvsView; - - SetWindowLong (hList, GWL_STYLE, dwStyle); -} - - -BOOL Filesets_BeginDrag (HWND hDlg, BOOL fRightBtn) -{ - LPIDENT lpi = Filesets_GetFocused (hDlg); - - if (!lpi || !lpi->fIsFileset()) // can only drag filesets! - return FALSE; - - l.fRightBtn = fRightBtn; - StartTask (taskSET_BEGINDRAG, hDlg, lpi); - return TRUE; -} - - -void Filesets_OnEndTask_BeginDrag (HWND hDlg, LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - if (ptp->rc && TASKDATA(ptp)->fs.Type != ftCLONE) - { - HWND hList = GetDlgItem (hDlg, IDC_SET_LIST); - HLISTITEM hItem = FL_GetSelected (hList); - - // When creating a drag image, we'll temporarily reset the object's - // images so we can be sure it'll draw just the Fileset icon. - // - FastList_Begin (hList); - int iImage1 = FastList_GetItemFirstImage (hList, hItem); - int iImage2 = FastList_GetItemSecondImage (hList, hItem); - FastList_SetItemFirstImage (hList, hItem, imageFILESET); - FastList_SetItemSecondImage (hList, hItem, IMAGE_NOIMAGE); - - l.lpiDrag = lpi; - l.lpiTarget = NULL; - l.fDragging = TRUE; - l.hDragImage = FastList_CreateDragImage (hList, hItem); - - FastList_SetItemFirstImage (hList, hItem, iImage1); - FastList_SetItemSecondImage (hList, hItem, iImage2); - FastList_End (hList); - - // Now we've got a drag image; start dragging. - // - ShowCursor (FALSE); - SetCapture (hDlg); - - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - ScreenToClient (NULL, &pt); - - ImageList_BeginDrag (l.hDragImage, 0, 8, 8); - ImageList_DragEnter (NULL, pt.x, pt.y); - } -} - - -void Filesets_ContinueDrag (HWND hDlg) -{ - if (l.fDragging) - { - LPIDENT lpi = NULL; - HLISTITEM hItemTarget; - - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - HWND hTarget = WindowFromPoint (pt); - - if (hTarget != NULL) - { - POINT ptClient = pt; - ScreenToClient (hTarget, &ptClient); - - if ((lpi = IdentifyPoint (hTarget, ptClient, &hItemTarget)) != NULL) - { - if (!lpi->fIsServer() && !lpi->fIsAggregate()) - lpi = NULL; - } - } - - if (lpi != l.lpiTarget) - { - ImageList_DragLeave (NULL); - - if (l.hItemTarget) - { - DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget); - FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT)); - l.hItemTarget = NULL; - l.lpiTarget = NULL; - } - - if ((l.lpiTarget = lpi) != NULL) - { - l.hwndTarget = hTarget; - l.hItemTarget = hItemTarget; - DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget); - FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags | FLIF_DROPHIGHLIGHT); - } - - ScreenToClient (NULL, &pt); - ImageList_DragEnter (NULL, pt.x, pt.y); - } - - ImageList_DragMove (LOWORD(dw), HIWORD(dw)); - } -} - - -void Filesets_FinishDrag (HWND hDlg, BOOL fDropped, BOOL fMenu) -{ - if (l.fDragging) - { - Filesets_ContinueDrag (hDlg); - ReleaseCapture(); - l.fDragging = FALSE; - - ImageList_EndDrag (); - ImageList_DragLeave (NULL); - ShowCursor (TRUE); - - if (l.lpiTarget != NULL) - { - if (!fDropped) - { - Filesets_CancelDrag (hDlg); - } - else if (fDropped && !fMenu) - { - SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_MOVEHERE, 0); - Filesets_CancelDrag (hDlg); - } - else // (fDropped && fMenu) - { - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - - LPMENUTASK lpp = New (MENUTASK); - lpp->hParent = GetDlgItem (hDlg, IDC_SET_LIST); - lpp->ptScreen = pt; - lpp->lpi = l.lpiDrag; - - StartTask (taskSET_DRAGMENU, hDlg, lpp); - } - } - } -} - - -void Filesets_OnEndTask_DragMenu (HWND hDlg, LPTASKPACKET ptp) -{ - HMENU hm = TaLocale_LoadMenu (MENU_SET_DRAGDROP); - - if (!ptp->rc) - EnableMenu (hm, M_SET_MOVEHERE, FALSE); - - if (!ptp->rc || (TASKDATA(ptp)->fs.Type != ftREADWRITE)) - EnableMenu (hm, M_SET_REPHERE, FALSE); - - DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent); - Filesets_CancelDrag (hDlg); -} - - -void Filesets_CancelDrag (HWND hDlg) -{ - if (l.hItemTarget != NULL) - { - DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget); - FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT)); - l.hItemTarget = NULL; - } -} - - -LPIDENT IdentifyPoint (HWND hTarget, POINT ptClient, HLISTITEM *phItemTarget) -{ - if ((*phItemTarget = FastList_ItemFromPoint (hTarget, &ptClient, TRUE)) == NULL) - return NULL; - - return (LPIDENT)FL_GetData (hTarget, *phItemTarget); -} - - -void Filesets_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen) -{ - if (!ptScreen.x && !ptScreen.y) - { - RECT rWindow; - GetWindowRect (hList, &rWindow); - ptScreen.x = rWindow.left + (rWindow.right -rWindow.left)/2; - ptScreen.y = rWindow.top + (rWindow.bottom -rWindow.top)/2; - Filesets_ShowParticularPopupMenu (hList, ptScreen, NULL); - } - else if (FL_HitTestForHeaderBar (hList, ptList)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - else - { - LPIDENT lpi = Filesets_GetFocused (GetParent (hList), &ptList); - if (lpi && (lpi != Filesets_GetSelected (GetParent (hList)))) - { - lpi = NULL; // right-click on item other than highlighted one? - } - - if (lpi && lpi->fIsFileset()) - { - Filesets_ShowParticularPopupMenu (hList, ptScreen, lpi); - } - else if (lpi && lpi->fIsAggregate()) - { - Aggregates_ShowParticularPopupMenu (hList, ptScreen, lpi); - } - else if (lpi && lpi->fIsServer()) - { - Server_ShowParticularPopupMenu (hList, ptScreen, lpi); - } - else if (!lpi) // display the _NONE menu? (no menu if it's a cell ident) - { - Filesets_ShowParticularPopupMenu (hList, ptScreen, lpi); - } - } -} - - -void Filesets_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiFileset) -{ - LPMENUTASK pmt; - if ((pmt = New (MENUTASK)) != NULL) - { - pmt->hParent = hParent; - pmt->ptScreen = ptScreen; - pmt->lpi = lpiFileset; - StartTask (taskSET_MENU, GetParent(hParent), pmt); - } -} - - -void Filesets_OnEndTask_Menu (HWND hDlg, LPTASKPACKET ptp) -{ - LPIDENT lpiFileset = (LPIDENT)(TASKDATA(ptp)->mt.lpi); - - HMENU hm; - if (lpiFileset != NULL) - hm = TaLocale_LoadMenu (MENU_SET); - else - hm = TaLocale_LoadMenu (MENU_SET_NONE); - - if (hm != NULL) - { - if (lpiFileset == NULL) - { - HMENU hmView = GetSubMenu (hm, 0); - DWORD dwStyle = GetWindowLong (TASKDATA(ptp)->mt.hParent, GWL_STYLE); - - CheckMenuRadioItem (hmView, - M_SET_VIEW_REPORT, M_SET_VIEW_TREE, - ((dwStyle & FLS_VIEW_MASK) == FLS_VIEW_TREELIST) ? M_SET_VIEW_TREELIST : - ((dwStyle & FLS_VIEW_MASK) == FLS_VIEW_TREE) ? M_SET_VIEW_TREE : M_SET_VIEW_REPORT, - MF_BYCOMMAND); - - CheckMenuRadioItem (hmView, - M_VIEW_ONEICON, M_VIEW_STATUS, - (gr.ivSet == ivTWOICONS) ? M_VIEW_TWOICONS : - (gr.ivSet == ivONEICON) ? M_VIEW_ONEICON : M_VIEW_STATUS, - MF_BYCOMMAND); - } - else - { - if (!ptp->rc) - { - EnableMenu (hm, M_SET_REPLICATION, FALSE); - EnableMenu (hm, M_SET_SETQUOTA, FALSE); - EnableMenu (hm, M_SET_RELEASE, FALSE); - EnableMenu (hm, M_SET_CLONE, FALSE); - EnableMenu (hm, M_SET_MOVETO, FALSE); - EnableMenu (hm, M_SET_DUMP, FALSE); - EnableMenu (hm, M_SET_RESTORE, FALSE); - } - else - { - if (TASKDATA(ptp)->fs.Type == ftCLONE) - { - EnableMenu (hm, M_SET_REPLICATION, FALSE); - EnableMenu (hm, M_SET_RELEASE, FALSE); - EnableMenu (hm, M_SET_CLONE, FALSE); - EnableMenu (hm, M_SET_MOVETO, FALSE); - } - - if (TASKDATA(ptp)->fs.Type != ftREADWRITE) - { - EnableMenu (hm, M_SET_CLONE, FALSE); - EnableMenu (hm, M_SET_RELEASE, FALSE); - EnableMenu (hm, M_SET_SETQUOTA, FALSE); - EnableMenu (hm, M_SET_RESTORE, FALSE); - } - } - } - - DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent); - } -} - diff --git a/src/WINNT/afssvrmgr/set_tab.h b/src/WINNT/afssvrmgr/set_tab.h deleted file mode 100644 index 6811ec632..000000000 --- a/src/WINNT/afssvrmgr/set_tab.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SET_TAB_H -#define SET_TAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Filesets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Filesets_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiFileset); - - -#endif - diff --git a/src/WINNT/afssvrmgr/subset.cpp b/src/WINNT/afssvrmgr/subset.cpp deleted file mode 100644 index e810a04a7..000000000 --- a/src/WINNT/afssvrmgr/subset.cpp +++ /dev/null @@ -1,1000 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "subset.h" -#include "propcache.h" - - -#define REGVAL_INCLUSIVE TEXT("Inclusive List") - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Subsets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Subsets_OnInitDialog (HWND hDlg, LPSUBSET sub); -void Subsets_OnApply (HWND hDlg, LPSUBSET sub); -LPSUBSET Subsets_OnLoad (HWND hDlg, LPSUBSET sub); -void Subsets_OnSave (HWND hDlg, LPSUBSET sub); -void Subsets_SetName (HWND hDlg, LPSUBSET sub); -void Subsets_PutSubsetOnDialog (HWND hDlg, LPSUBSET sub); -void Subsets_GetSubsetFromDialog (HWND hDlg, LPSUBSET sub); -LPSUBSET Subsets_OnCheck (HWND hDlg, int iSel, LPSUBSET subOld); -LPSUBSET Subsets_OnCheckAll (HWND hDlg, LPSUBSET subOld, BOOL fCheck); - -BOOL Subsets_GetLoadName (HWND hParent, LPTSTR pszSubset); -BOOL Subsets_GetSaveName (HWND hParent, LPTSTR pszSubset); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL Subsets_fMonitorServer (LPSUBSET sub, LPIDENT lpiServer) -{ - BOOL fMonitor = TRUE; - - TCHAR szLong[ cchNAME ]; - TCHAR szShort[ cchNAME ]; - lpiServer->GetLongServerName (szLong); - lpiServer->GetShortServerName (szShort); - - if (sub) - { - if (sub->pszMonitored) - { - fMonitor = FALSE; // unless it shows up here. - - for (LPTSTR psz = sub->pszMonitored; !fMonitor && *psz; psz += 1+lstrlen(psz)) - { - if (!lstrcmpi (psz, szLong)) - fMonitor = TRUE; - else if (!lstrcmpi (psz, szShort)) - fMonitor = TRUE; - } - } - else if (sub->pszUnmonitored) - { - for (LPTSTR psz = sub->pszUnmonitored; fMonitor && *psz; psz += 1+lstrlen(psz)) - { - if (!lstrcmpi (psz, szLong)) - fMonitor = FALSE; - else if (!lstrcmpi (psz, szShort)) - fMonitor = FALSE; - } - } - } - - return fMonitor; -} - - -LPSUBSET Subsets_SetMonitor (LPSUBSET sub, LPIDENT lpiServer, BOOL fMonitor) -{ - if (sub == NULL) - { - sub = New (SUBSET); - memset (sub, 0x00, sizeof(SUBSET)); - } - - if (fMonitor != Subsets_fMonitorServer (sub, lpiServer)) - { - sub->fModified = TRUE; - - TCHAR szLong[ cchNAME ]; - TCHAR szShort[ cchNAME ]; - lpiServer->GetShortServerName (szShort); - lpiServer->GetLongServerName (szLong); - - // First ensure that the server name doesn't appear anywhere - // in the subset. - // - LPTSTR pszMonitoredNew = NULL; - LPTSTR pszUnmonitoredNew = NULL; - - if (sub->pszMonitored) - { - for (LPTSTR psz = sub->pszMonitored; *psz; psz += 1+lstrlen(psz)) - { - if (lstrcmpi (psz, szLong) && lstrcmpi (psz, szShort)) - { - FormatMultiString (&pszMonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), psz); - } - } - } - else if (sub->pszUnmonitored) - { - for (LPTSTR psz = sub->pszUnmonitored; *psz; psz += 1+lstrlen(psz)) - { - if (lstrcmpi (psz, szLong) && lstrcmpi (psz, szShort)) - { - FormatMultiString (&pszUnmonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), psz); - } - } - } - - // Then ensure it shows up only where necessary. - // - if (sub->pszMonitored && fMonitor) - { - FormatMultiString (&pszMonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), szLong); - } - else if (!sub->pszMonitored && !fMonitor) - { - FormatMultiString (&pszUnmonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), szLong); - } - - if (sub->pszMonitored && !pszMonitoredNew) - { - pszMonitoredNew = AllocateString (2); - pszMonitoredNew[0] = TEXT('\0'); - pszMonitoredNew[1] = TEXT('\0'); - } - if (sub->pszUnmonitored && !pszUnmonitoredNew) - { - pszUnmonitoredNew = AllocateString (2); - pszUnmonitoredNew[0] = TEXT('\0'); - pszUnmonitoredNew[1] = TEXT('\0'); - } - - // Finally, update the subset's members. - // - if (sub->pszMonitored) - FreeString (sub->pszMonitored); - if (sub->pszUnmonitored) - FreeString (sub->pszUnmonitored); - - sub->pszMonitored = pszMonitoredNew; - sub->pszUnmonitored = pszUnmonitoredNew; - } - - return sub; -} - - -void ShowSubsetsDialog (void) -{ - LPPROPSHEET psh = PropSheet_Create (IDS_SUBSET_TAB, FALSE); - psh->sh.hwndParent = g.hMain; - - LPSUBSET sub = Subsets_CopySubset (g.sub); - PropSheet_AddTab (psh, 0, IDD_SUBSETS, (DLGPROC)Subsets_DlgProc, (LPARAM)sub, TRUE); - PropSheet_ShowModal (psh, PumpMessage); -} - - -BOOL CALLBACK Subsets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SUBSETS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPSUBSET sub = (LPSUBSET)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcGENERAL, NULL, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Subsets_OnInitDialog (hDlg, sub); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Subsets_OnApply (hDlg, sub); - break; - - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_SUBSET_LOAD: - LPSUBSET subNew; - subNew = Subsets_OnLoad (hDlg, sub); - if (subNew != NULL) - { - if (sub) - Subsets_FreeSubset (sub); - SetWindowLong (hDlg, DWL_USER, (LONG)subNew); - } - break; - - case IDC_SUBSET_LIST: - if (HIWORD(wp) == LBN_CLICKED) // checked or unchecked? - { - int iSel = LB_GetSelected (GetDlgItem (hDlg, IDC_SUBSET_LIST)); - subNew = Subsets_OnCheck (hDlg, iSel, sub); - if (subNew && (subNew != sub)) - { - if (sub) - Subsets_FreeSubset (sub); - SetWindowLong (hDlg, DWL_USER, (LONG)subNew); - } - } - break; - - case IDC_SUBSET_SAVE: - Subsets_OnSave (hDlg, sub); - break; - - case IDC_SUBSET_ALL: - case IDC_SUBSET_NONE: - subNew = Subsets_OnCheckAll (hDlg, sub, (LOWORD(wp) == IDC_SUBSET_ALL) ? TRUE : FALSE); - if (subNew && (subNew != sub)) - { - if (sub) - Subsets_FreeSubset (sub); - SetWindowLong (hDlg, DWL_USER, (LONG)subNew); - } - break; - } - break; - } - - return FALSE; -} - - -void Subsets_OnInitDialog (HWND hDlg, LPSUBSET sub) -{ - Subsets_SetName (hDlg, sub); - Subsets_PutSubsetOnDialog (hDlg, sub); -} - - -void Subsets_SetName (HWND hDlg, LPSUBSET sub) -{ - LPTSTR pszText; - - BOOL fIsOneServer = FALSE; - if (sub && sub->pszMonitored && *(sub->pszMonitored)) - { - LPTSTR pszNext = &sub->pszMonitored[ 1+lstrlen(sub->pszMonitored) ]; - if (!*pszNext) - fIsOneServer = TRUE; - } - - if (sub && sub->szSubset[0]) - { - if (sub->fModified) - pszText = FormatString (IDS_SUBSET_CHANGED, TEXT("%s"), sub->szSubset); - else - pszText = FormatString (TEXT("%1"), TEXT("%s"), sub->szSubset); - } - else if (fIsOneServer) - { - pszText = FormatString (IDS_SUBSET_SERVERSUBSET, TEXT("%s"), sub->pszMonitored); - } - else if (sub) // && !sub->szSubset[0] - { - if (sub->fModified) - pszText = FormatString (IDS_SUBSET_CHANGED, TEXT("%m"), IDS_SUBSET_NONAME); - else - pszText = FormatString (TEXT("%1"), TEXT("%m"), IDS_SUBSET_NONAME); - } - else // no current subset specified - { - pszText = FormatString (TEXT("%1"), TEXT("%m"), IDS_SUBSET_NOSUBSET); - } - - SetDlgItemText (hDlg, IDC_SUBSET_NAME, pszText); - FreeString (pszText); -} - - -void Subsets_PutSubsetOnDialog (HWND hDlg, LPSUBSET sub) -{ - LPSUBSET_TO_LIST_PACKET lpp = New (SUBSET_TO_LIST_PACKET); - memset (lpp, 0x00, sizeof(SUBSET_TO_LIST_PACKET)); - - lpp->hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - lpp->sub = Subsets_CopySubset (sub); - - StartTask (taskSUBSET_TO_LIST, NULL, lpp); -} - - -void Subsets_GetSubsetFromDialog (HWND hDlg, LPSUBSET sub) -{ - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - - if (sub->pszMonitored) - { - FreeString (sub->pszMonitored); - sub->pszMonitored = NULL; - } - if (sub->pszUnmonitored) - { - FreeString (sub->pszUnmonitored); - sub->pszUnmonitored = NULL; - } - - // Is there only one server box checked? - // - int iiMax = SendMessage (hList, LB_GETCOUNT, 0, 0); - - size_t cChecked = 0; - int iiChecked; - for (int ii = 0; ii < iiMax; ++ii) - { - if (LB_GetCheck (hList, ii)) - { - iiChecked = ii; - if ((++cChecked) > 1) - break; - } - } - if (cChecked == 1) // Only one is checked--use pszMonitored. - { - TCHAR szServer[ cchNAME ]; - SendMessage (hList, LB_GETTEXT, iiChecked, (LPARAM)szServer); - FormatMultiString (&sub->pszMonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer); - } - else // Use pszUnmonitored. - { - for (int ii = 0; ii < iiMax; ++ii) - { - if (!LB_GetCheck (hList, ii)) - { - TCHAR szServer[ cchNAME ]; - SendMessage (hList, LB_GETTEXT, ii, (LPARAM)szServer); - FormatMultiString (&sub->pszUnmonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer); - } - } - } -} - - -LPSUBSET Subsets_OnCheck (HWND hDlg, int iSel, LPSUBSET subOld) -{ - LPSUBSET sub = subOld; - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - - if (!LB_GetCheck (hList, iSel)) // unchecked? - { - if (!sub) - { - sub = New (SUBSET); - memset (sub, 0x00, sizeof(SUBSET)); - } - } - - if (sub) - { - sub->fModified = TRUE; - Subsets_GetSubsetFromDialog (hDlg, sub); - Subsets_SetName (hDlg, sub); - PropSheetChanged (hDlg); - } - - return sub; -} - - -LPSUBSET Subsets_OnCheckAll (HWND hDlg, LPSUBSET subOld, BOOL fCheck) -{ - LPSUBSET sub = subOld; - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - - if (!fCheck) // unchecking things? - { - if (!sub) - { - sub = New (SUBSET); - memset (sub, 0x00, sizeof(SUBSET)); - } - } - - int iiMax = SendMessage (hList, LB_GETCOUNT, 0, 0); - - for (int ii = 0; ii < iiMax; ++ii) - { - if (LB_GetCheck (hList, ii) != fCheck) - { - LB_SetCheck (hList, ii, fCheck); - } - } - - if (sub) - { - sub->fModified = TRUE; - Subsets_GetSubsetFromDialog (hDlg, sub); - Subsets_SetName (hDlg, sub); - PropSheetChanged (hDlg); - } - - return sub; -} - - -LPSUBSET Subsets_OnLoad (HWND hDlg, LPSUBSET subOld) -{ - LPSUBSET subNew = NULL; - - TCHAR szSubset[ cchNAME ] = TEXT(""); - if (subOld) - lstrcpy (szSubset, subOld->szSubset); - - if (Subsets_GetLoadName (hDlg, szSubset)) - { - if ((subNew = Subsets_LoadSubset (NULL, szSubset)) != NULL) - { - Subsets_SetName (hDlg, subNew); - Subsets_PutSubsetOnDialog (hDlg, subNew); - PropSheetChanged (hDlg); - } - } - - return subNew; -} - - -void Subsets_OnSave (HWND hDlg, LPSUBSET sub) -{ - if (sub) - { - TCHAR szSubset[ cchNAME ]; - lstrcpy (szSubset, sub->szSubset); - - if (Subsets_GetSaveName (hDlg, szSubset)) - { - Subsets_GetSubsetFromDialog (hDlg, sub); - - if (Subsets_SaveSubset (NULL, szSubset, sub)) - { - lstrcpy (sub->szSubset, szSubset); - sub->fModified = FALSE; - - Subsets_SetName (hDlg, sub); - } - } - } -} - - -void Subsets_OnApply (HWND hDlg, LPSUBSET sub) -{ - LPSUBSET subCopy; - if ((subCopy = Subsets_CopySubset (sub, TRUE)) != NULL) - { - Subsets_GetSubsetFromDialog (hDlg, subCopy); - } - - LPSUBSET subOld = g.sub; - g.sub = subCopy; - if (subOld) - Subsets_FreeSubset (subOld); - - StartTask (taskAPPLY_SUBSET, NULL, sub); -} - - -BOOL Subsets_SaveIfDirty (LPSUBSET sub) -{ - if (!sub || !sub->fModified) - return TRUE; - - int rc; - rc = Message (MB_YESNOCANCEL | MB_ICONQUESTION, IDS_SUBSET_DISCARD_TITLE, IDS_SUBSET_DISCARD_DESC); - - if (rc == IDNO) - { - sub->fModified = FALSE; - sub->szSubset[0] = TEXT('\0'); - } - else if (rc == IDYES) - { - TCHAR szSubset[ cchNAME ]; - lstrcpy (szSubset, sub->szSubset); - - if (!Subsets_GetSaveName (g.hMain, szSubset)) - return FALSE; - - if (!Subsets_SaveSubset (NULL, szSubset, sub)) - return FALSE; - - sub->fModified = FALSE; - lstrcpy (sub->szSubset, szSubset); - } - else // (rc == IDCANCEL) - { - return FALSE; - } - - return TRUE; -} - - -BOOL Subsets_EnumSubsets (LPTSTR pszCell, size_t iIndex, LPTSTR pszSubset) -{ - BOOL rc = FALSE; - - HKEY hk; - if ((hk = OpenSubsetsKey (pszCell, FALSE)) != NULL) - { - if (RegEnumKey (hk, iIndex, pszSubset, cchNAME) == 0) - rc = TRUE; - - RegCloseKey (hk); - } - - return rc; -} - - -BOOL Subsets_SaveSubset (LPTSTR pszCell, LPTSTR pszSubset, LPSUBSET sub) -{ - BOOL rc = FALSE; - - if (sub && pszSubset && *pszSubset) - { - HKEY hk; - if ((hk = OpenSubsetsSubKey (pszCell, pszSubset, TRUE)) != NULL) - { - DWORD dwMonitored = (sub->pszMonitored) ? 1 : 0; - RegSetValueEx (hk, REGVAL_INCLUSIVE, 0, REG_DWORD, (LPBYTE)&dwMonitored, sizeof(DWORD)); - - for (LPTSTR psz = (sub->pszMonitored) ? sub->pszMonitored : sub->pszUnmonitored; - psz && *psz; - psz += 1+lstrlen(psz)) - { - RegSetValueEx (hk, psz, 0, REG_SZ, (PBYTE)TEXT("X"), sizeof(TCHAR)*2); - } - - rc = TRUE; - - RegCloseKey (hk); - } - } - - return rc; -} - - -LPSUBSET Subsets_LoadSubset (LPTSTR pszCell, LPTSTR pszSubset) -{ - LPSUBSET sub = NULL; - - HKEY hk; - if ((hk = OpenSubsetsSubKey (pszCell, pszSubset, FALSE)) != NULL) - { - DWORD dwMonitored; - DWORD dwSize; - DWORD dwType; - dwSize = sizeof(dwMonitored); - if (RegQueryValueEx (hk, REGVAL_INCLUSIVE, 0, &dwType, (LPBYTE)&dwMonitored, &dwSize) == 0) - { - sub = New (SUBSET); - memset (sub, 0x00, sizeof(SUBSET)); - lstrcpy (sub->szSubset, pszSubset); - sub->fModified = FALSE; - - LPTSTR *ppsz; - ppsz = (dwMonitored) ? &sub->pszMonitored : &sub->pszUnmonitored; - - for (size_t iIndex = 0; ; ++iIndex) - { - TCHAR szServer[ cchNAME ]; - dwSize = sizeof(szServer); - - if (RegEnumValue (hk, iIndex, szServer, &dwSize, 0, NULL, NULL, NULL) != 0) - break; - - if (szServer[0] && lstrcmpi (szServer, REGVAL_INCLUSIVE)) - FormatMultiString (ppsz, FALSE, TEXT("%1"), TEXT("%s"), szServer); - } - - if (dwMonitored && !sub->pszMonitored) - { - sub->pszMonitored = AllocateString(2); - sub->pszMonitored[0] = TEXT('\0'); - sub->pszMonitored[1] = TEXT('\0'); - } - } - - RegCloseKey (hk); - } - - return sub; -} - - -LPSUBSET Subsets_CopySubset (LPSUBSET sub, BOOL fCreateIfNULL) -{ - LPSUBSET subCopy = NULL; - - if (sub != NULL) - { - subCopy = New (SUBSET); - memset (subCopy, 0x00, sizeof(SUBSET)); - lstrcpy (subCopy->szSubset, sub->szSubset); - subCopy->fModified = sub->fModified; - - size_t cch; - if (sub->pszMonitored) - { - cch = 1; - for (LPTSTR psz = sub->pszMonitored; *psz; psz += 1+lstrlen(psz)) - cch += 1+lstrlen(psz); - subCopy->pszMonitored = AllocateString (cch); - memcpy (subCopy->pszMonitored, sub->pszMonitored, sizeof(TCHAR)*cch); - } - - if (sub->pszUnmonitored) - { - cch = 1; - for (LPTSTR psz = sub->pszUnmonitored; *psz; psz += 1+lstrlen(psz)) - cch += 1+lstrlen(psz); - subCopy->pszUnmonitored = AllocateString (cch); - memcpy (subCopy->pszUnmonitored, sub->pszUnmonitored, sizeof(TCHAR)*cch); - } - } - else if (fCreateIfNULL) - { - subCopy = New (SUBSET); - memset (subCopy, 0x00, sizeof(SUBSET)); - } - - return subCopy; -} - - -void Subsets_FreeSubset (LPSUBSET sub) -{ - if (sub != NULL) - { - if (sub->pszMonitored) - FreeString (sub->pszMonitored); - if (sub->pszUnmonitored) - FreeString (sub->pszUnmonitored); - - Delete (sub); - } -} - - -/* - * SUBSET OPEN/SAVE DIALOG ____________________________________________________ - * - */ - -typedef struct - { - BOOL fOpen; - TCHAR szCell[ cchNAME ]; - TCHAR szSubset[ cchNAME ]; - } SUBSET_OPENSAVE_PARAMS, *LPSUBSET_OPENSAVE_PARAMS; - -BOOL CALLBACK Subsets_OpenSave_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Subsets_OpenSave_OnInitDialog (HWND hDlg, LPSUBSET_OPENSAVE_PARAMS lpp); -void Subsets_OpenSave_OnSelect (HWND hDlg); -void Subsets_OpenSave_Populate (HWND hDlg); -void Subsets_OpenSave_OnDelete (HWND hDlg); -void Subsets_OpenSave_OnRename (HWND hDlg); - - -BOOL Subsets_GetLoadName (HWND hParent, LPTSTR pszSubset) -{ - SUBSET_OPENSAVE_PARAMS lpp; - lpp.fOpen = TRUE; - lpp.szCell[0] = TEXT('\0'); - lstrcpy (lpp.szSubset, pszSubset); - - if (g.lpiCell) - g.lpiCell->GetCellName (lpp.szCell); - - int rc; - rc = ModalDialogParam (IDD_SUBSET_LOADSAVE, - hParent, (DLGPROC)Subsets_OpenSave_DlgProc, - (LPARAM)&lpp); - - if (rc == IDOK) - { - lstrcpy (pszSubset, lpp.szSubset); - } - - return (rc == IDOK) ? TRUE : FALSE; -} - - -BOOL Subsets_GetSaveName (HWND hParent, LPTSTR pszSubset) -{ - SUBSET_OPENSAVE_PARAMS lpp; - lpp.fOpen = FALSE; - lpp.szCell[0] = TEXT('\0'); - lstrcpy (lpp.szSubset, pszSubset); - - if (g.lpiCell) - g.lpiCell->GetCellName (lpp.szCell); - - int rc; - rc = ModalDialogParam (IDD_SUBSET_LOADSAVE, - hParent, (DLGPROC)Subsets_OpenSave_DlgProc, - (LPARAM)&lpp); - - if (rc == IDOK) - { - lstrcpy (pszSubset, lpp.szSubset); - } - - return (rc == IDOK) ? TRUE : FALSE; -} - - -BOOL CALLBACK Subsets_OpenSave_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static BOOL fEditing = FALSE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSUBSET_OPENSAVE_PARAMS lpp; - if ((lpp = (LPSUBSET_OPENSAVE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - fEditing = FALSE; - Subsets_OpenSave_OnInitDialog (hDlg, lpp); - break; - - case WM_COMMAND: - if (!fEditing) - { - switch (LOWORD(wp)) - { - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDOK: - GetDlgItemText (hDlg, IDC_SUBSET_NAME, lpp->szSubset, cchNAME); - if (lpp->szSubset[0] != TEXT('\0')) - { - BOOL fClose = TRUE; - - if (!lpp->fOpen) - { - HKEY hk; - if ((hk = OpenSubsetsSubKey (NULL, lpp->szSubset, FALSE)) != NULL) - { - RegCloseKey (hk); - - int rc = Message (MB_YESNO | MB_ICONASTERISK, IDS_SUBSET_SAVE_TITLE, IDS_SUBSET_SAVE_DESC, TEXT("%s"), lpp->szSubset); - if (rc != IDYES) - fClose = FALSE; - } - } - - if (fClose) - EndDialog (hDlg, IDOK); - } - break; - - case IDC_SUBSET_DELETE: - Subsets_OpenSave_OnDelete (hDlg); - break; - - case IDC_SUBSET_RENAME: - Subsets_OpenSave_OnRename (hDlg); - break; - } - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case LVN_ITEMCHANGED: - if (!fEditing) - { - if ( ((LPNM_LISTVIEW)lp)->uNewState & LVIS_SELECTED ) - Subsets_OpenSave_OnSelect (hDlg); - } - break; - - case NM_DBLCLK: - if (!fEditing) - { - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SUBSET_LIST)) - { - Subsets_OpenSave_OnSelect (hDlg); - PostMessage (hDlg, WM_COMMAND, IDOK, 0); - } - } - break; - - case LVN_BEGINLABELEDIT: - fEditing = TRUE; - return FALSE; // okay to edit label - - case LVN_ENDLABELEDIT: - LV_DISPINFO *plvdi; - if ((plvdi = (LV_DISPINFO*)lp) != NULL) - { - if ((plvdi->item.iItem != -1) && - (plvdi->item.pszText != NULL)) - { - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - TCHAR szOldName[ cchNAME ]; - LV_GetItemText (hList, plvdi->item.iItem, 0, szOldName); - - if (lstrcmpi (szOldName, plvdi->item.pszText)) - { - BOOL fRename = TRUE; - BOOL fRepopulate = FALSE; - - HKEY hk; - if ((hk = OpenSubsetsSubKey (NULL, plvdi->item.pszText, FALSE)) != NULL) - { - RegCloseKey (hk); - - int rc = Message (MB_YESNO | MB_ICONASTERISK, IDS_SUBSET_SAVE_TITLE, IDS_SUBSET_SAVE_DESC, TEXT("%s"), lpp->szSubset); - if (rc != IDYES) - fRename = FALSE; - else - fRepopulate = TRUE; - } - - if (fRename) - { - LPSUBSET subRename; - if ((subRename = Subsets_LoadSubset (NULL, szOldName)) != NULL) - { - if (Subsets_SaveSubset (NULL, plvdi->item.pszText, subRename)) - { - (void)OpenSubsetsSubKey (NULL, szOldName, 2); // 0=open,1=create,2=delete - - if (fRepopulate) - Subsets_OpenSave_Populate (hDlg); - else - { - LV_SetItemText (hList, plvdi->item.iItem, 0, plvdi->item.pszText); - Subsets_OpenSave_OnSelect (hDlg); - } - - Subsets_FreeSubset (subRename); - } - } - } - } - } - } - - fEditing = FALSE; - break; - } - break; - } - } - - return FALSE; -} - - -void Subsets_OpenSave_OnInitDialog (HWND hDlg, LPSUBSET_OPENSAVE_PARAMS lpp) -{ - // Fix the buttons in the toolbar, so that they looks pretty - // - HWND hButton = GetDlgItem (hDlg, IDC_SUBSET_DELETE); - HICON hi = TaLocale_LoadIcon (IDI_BTN_DELETE); - SendMessage (hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hi); - - hButton = GetDlgItem (hDlg, IDC_SUBSET_RENAME); - hi = TaLocale_LoadIcon (IDI_BTN_RENAME); - SendMessage (hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hi); - - // Set up an ImageList so we'll have icons in the ListView - // - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - HIMAGELIST hil = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1); - - hi = TaLocale_LoadIcon (IDI_SUBSET); - ImageList_AddIcon (hil, hi); - - ListView_SetImageList (hList, hil, LVSIL_SMALL); - - // Then populate the ListView with the names of the subsets - // defined for this cell - // - Subsets_OpenSave_Populate (hDlg); - // Finally, fill in the rest of the dialog. - // - SetDlgItemText (hDlg, IDC_SUBSET_NAME, lpp->szSubset); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, (lpp->fOpen) ? IDS_SUBSET_TITLE_LOAD : IDS_SUBSET_TITLE_SAVE); - SetWindowText (hDlg, szText); - - GetString (szText, (lpp->fOpen) ? IDS_BUTTON_OPEN : IDS_BUTTON_SAVE); - SetDlgItemText (hDlg, IDOK, szText); -} - - -void Subsets_OpenSave_Populate (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - LV_StartChange (hList, TRUE); - - TCHAR szSubset[ cchNAME ]; - for (size_t iIndex = 0; Subsets_EnumSubsets (NULL, iIndex, szSubset); ++iIndex) - { - LV_AddItem (hList, 1, 0, 0, 0, szSubset); - } - - LV_EndChange (hList); -} - - -void Subsets_OpenSave_OnSelect (HWND hDlg) -{ - TCHAR szSubset[ cchNAME ]; - - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - short idxSelected = LV_GetSelected (hList); - - if (idxSelected == -1) - szSubset[0] = TEXT('\0'); - else - LV_GetItemText (hList, idxSelected, 0, szSubset); - - SetDlgItemText (hDlg, IDC_SUBSET_NAME, szSubset); -} - - -void Subsets_OpenSave_OnDelete (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - short idxSelected = LV_GetSelected (hList); - - if (idxSelected != -1) - { - TCHAR szSubset[ cchNAME ]; - LV_GetItemText (hList, idxSelected, 0, szSubset); - - if (Message (MB_ICONASTERISK | MB_YESNO, IDS_SUBSET_DELETE_TITLE, IDS_SUBSET_DELETE_DESC, TEXT("%s"), szSubset) == IDYES) - { - (void)OpenSubsetsSubKey (NULL, szSubset, 2); // 0=open,1=create,2=delete - Subsets_OpenSave_Populate (hDlg); - } - } -} - - -void Subsets_OpenSave_OnRename (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); - short idxSelected = LV_GetSelected (hList); - - if (idxSelected != -1) - { - SetFocus (hList); - ListView_EditLabel (hList, idxSelected); - } -} - diff --git a/src/WINNT/afssvrmgr/subset.h b/src/WINNT/afssvrmgr/subset.h deleted file mode 100644 index b791729c3..000000000 --- a/src/WINNT/afssvrmgr/subset.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SUBSET_H -#define SUBSET_H - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - TCHAR szSubset[ cchNAME ]; // subset name ("" if unspecified) - BOOL fModified; // TRUE if subset contents changed - LPTSTR pszMonitored; // allocated multistring of servers - LPTSTR pszUnmonitored; // allocated multistring of servers - } SUBSET, *LPSUBSET; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL Subsets_fMonitorServer (LPSUBSET sub, LPIDENT lpiServer); -LPSUBSET Subsets_SetMonitor (LPSUBSET sub, LPIDENT lpiServer, BOOL fMonitor); - -void ShowSubsetsDialog (void); - -BOOL Subsets_SaveIfDirty (LPSUBSET sub); - -BOOL Subsets_EnumSubsets (LPTSTR pszCell, size_t iIndex, LPTSTR pszSubset); -LPSUBSET Subsets_LoadSubset (LPTSTR pszCell, LPTSTR pszSubset); -BOOL Subsets_SaveSubset (LPTSTR pszCell, LPTSTR pszSubset, LPSUBSET sub); -LPSUBSET Subsets_CopySubset (LPSUBSET sub, BOOL fMakeIfNULL = FALSE); -void Subsets_FreeSubset (LPSUBSET sub); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_col.cpp b/src/WINNT/afssvrmgr/svc_col.cpp deleted file mode 100644 index 9c8072046..000000000 --- a/src/WINNT/afssvrmgr/svc_col.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_col.h" - - -/* - * SERVICE-VIEW COLUMNS _______________________________________________________ - * - */ - -void Services_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nSERVICECOLUMNS; - - for (size_t iCol = 0; iCol < nSERVICECOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = SERVICECOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = SERVICECOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = svccolNAME; - - lpvi->nColsShown = 3; - lpvi->aColumns[0] = (int)svccolNAME; - lpvi->aColumns[1] = (int)svccolSTATUS; - lpvi->aColumns[2] = (int)svccolDATE_STARTSTOP; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -size_t Services_GetAlertCount (LPSERVICE lpService) -{ - return Alert_GetCount (lpService->GetIdentifier()); -} - - -LPTSTR Services_GetColumnText (LPIDENT lpi, SERVICECOLUMN svccol, BOOL fShowServerName) -{ - static TCHAR aszBuffer[ nSERVICECOLUMNS ][ cchRESOURCE ]; - static size_t iBufferNext = 0; - LPTSTR pszBuffer = aszBuffer[ iBufferNext++ ]; - if (iBufferNext == nSERVICECOLUMNS) - iBufferNext = 0; - *pszBuffer = TEXT('\0'); - - LPSERVICESTATUS lpss = NULL; - LPSERVICE_PREF lpsp; - if ((lpsp = (LPSERVICE_PREF)lpi->GetUserParam()) != NULL) - lpss = &lpsp->ssLast; - - switch (svccol) - { - case svccolNAME: - if (!fShowServerName) - lpi->GetServiceName (pszBuffer); - else - { - TCHAR szNameSvr[ cchNAME ]; - TCHAR szNameSvc[ cchNAME ]; - lpi->GetServerName (szNameSvr); - lpi->GetServiceName (szNameSvc); - LPTSTR pszName = FormatString (IDS_SERVER_SERVICE, TEXT("%s%s"), szNameSvr, szNameSvc); - lstrcpy (pszBuffer, pszName); - FreeString (pszName); - } - break; - - case svccolTYPE: - if (lpss) - { - if (lpss->type == SERVICETYPE_SIMPLE) - GetString (pszBuffer, IDS_SERVICETYPE_SIMPLE); - else if (lpss->type == SERVICETYPE_FS) - GetString (pszBuffer, IDS_SERVICETYPE_FS); - else - GetString (pszBuffer, IDS_SERVICETYPE_CRON); - } - break; - - case svccolPARAMS: - if (lpss) - { - lstrncpy (pszBuffer, lpss->szParams, cchRESOURCE-1); - pszBuffer[ cchRESOURCE-1 ] = TEXT('\0'); - - for (LPTSTR pch = pszBuffer; *pch; ++pch) - { - if (*pch == TEXT('\r') || *pch == TEXT('\t') || *pch == TEXT('\n')) - *pch = TEXT(' '); - } - } - break; - - case svccolNOTIFIER: - if (lpss) - { - lstrncpy (pszBuffer, lpss->szNotifier, cchRESOURCE-1); - pszBuffer[ cchRESOURCE-1 ] = TEXT('\0'); - - for (LPTSTR pch = pszBuffer; *pch; ++pch) - { - if (*pch == TEXT('\r') || *pch == TEXT('\t') || *pch == TEXT('\n')) - *pch = TEXT(' '); - } - } - break; - - case svccolSTATUS: - if (lpss) - { - if (lpss->state == SERVICESTATE_RUNNING) - GetString (pszBuffer, IDS_SERVICESTATE_RUNNING); - else if (lpss->state == SERVICESTATE_STOPPING) - GetString (pszBuffer, IDS_SERVICESTATE_STOPPING); - else if (lpss->state == SERVICESTATE_STARTING) - GetString (pszBuffer, IDS_SERVICESTATE_STARTING); - else - GetString (pszBuffer, IDS_SERVICESTATE_STOPPED); - } - break; - - case svccolDATE_START: - if (lpss) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpss->timeLastStart)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case svccolDATE_STOP: - if (lpss) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpss->timeLastStop)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case svccolDATE_STARTSTOP: - if (lpss) - { - LPSYSTEMTIME pst; - int ids; - if ((lpss->state == SERVICESTATE_RUNNING) || (lpss->state == SERVICESTATE_STARTING)) - { - ids = IDS_SERVICE_STARTDATE; - pst = &lpss->timeLastStart; - } - else - { - ids = IDS_SERVICE_STOPDATE; - pst = &lpss->timeLastStop; - } - - TCHAR szDate[ cchRESOURCE ]; - if (FormatTime (szDate, TEXT("%s"), pst)) - { - LPTSTR psz = FormatString (ids, TEXT("%s"), szDate); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - } - break; - - case svccolDATE_FAILED: - if (lpss) - { - if (!FormatTime (pszBuffer, TEXT("%s"), &lpss->timeLastFail)) - pszBuffer[0] = TEXT('\0'); - } - break; - - case svccolLASTERROR: - if (lpss) - { - LPTSTR psz = FormatString (IDS_SERVICE_LASTERROR, TEXT("%ld"), lpss->dwErrLast); - lstrcpy (pszBuffer, psz); - FreeString (psz); - } - break; - } - - return pszBuffer; -} - diff --git a/src/WINNT/afssvrmgr/svc_col.h b/src/WINNT/afssvrmgr/svc_col.h deleted file mode 100644 index 635730eb0..000000000 --- a/src/WINNT/afssvrmgr/svc_col.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_COL_H -#define SVC_COL_H - - -/* - * SERVICE-VIEW COLUMNS _______________________________________________________ - * - */ - -typedef enum - { - svccolNAME, - svccolTYPE, - svccolPARAMS, - svccolNOTIFIER, - svccolSTATUS, - svccolDATE_START, - svccolDATE_STOP, - svccolDATE_STARTSTOP, - svccolDATE_FAILED, - svccolLASTERROR, - } SERVICECOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -SERVICECOLUMNS[] = - { - { IDS_SVCCOL_NAME, 100 }, // svccolNAME - { IDS_SVCCOL_TYPE, 100 }, // svccolTYPE - { IDS_SVCCOL_PARAMS, 100 }, // svccolPARAMS - { IDS_SVCCOL_NOTIFIER, 100 }, // svccolNOTIFIER - { IDS_SVCCOL_STATUS, 100 }, // svccolSTATUS - { IDS_SVCCOL_DATE_START, 100 }, // svccolDATE_START - { IDS_SVCCOL_DATE_STOP, 100 }, // svccolDATE_STOP - { IDS_SVCCOL_DATE_STARTSTOP, 100 }, // svccolDATE_STARTSTOP - { IDS_SVCCOL_DATE_FAILED, 100 }, // svccolDATE_FAILED - { IDS_SVCCOL_LASTERROR, 100 }, // svccolLASTERROR - }; - -#define nSERVICECOLUMNS (sizeof(SERVICECOLUMNS)/sizeof(SERVICECOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Services_SetDefaultView (LPVIEWINFO lpvi); - -size_t Services_GetAlertCount (LPSERVICE lpService); -LPTSTR Services_GetColumnText (LPIDENT lpi, SERVICECOLUMN svccol, BOOL fShowServerName = FALSE); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_create.cpp b/src/WINNT/afssvrmgr/svc_create.cpp deleted file mode 100644 index a69be2b2a..000000000 --- a/src/WINNT/afssvrmgr/svc_create.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_create.h" -#include "svc_general.h" -#include "propcache.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Services_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Services_Create_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Services_Create_OnType (HWND hDlg); -void Services_Create_OnApply (HWND hDlg); -void Services_Create_EnableOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Services_Create (LPIDENT lpiServer) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVC_CREATE, NULL)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPPROPSHEET psh = PropSheet_Create (IDS_SVC_ADD_TITLE, FALSE); - psh->sh.dwFlags |= PSH_NOAPPLYNOW; - - PropSheet_AddTab (psh, IDS_SVC_ADD_TAB, IDD_SVC_CREATE, (DLGPROC)Services_Create_DlgProc, (LPARAM)lpiServer, TRUE); - PropSheet_ShowModeless (psh); - } -} - - -BOOL CALLBACK Services_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVC_CREATE, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcSVC_CREATE, NULL, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Services_Create_OnInitDialog (hDlg, (LPIDENT)( ((LPPROPSHEETPAGE)lp)->lParam )); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Services_Create_OnApply (hDlg); - break; - - case IDC_SVC_NAME: - TCHAR szService[ cchNAME ]; - GetDlgItemText (hDlg, IDC_SVC_NAME, szService, cchNAME); - - TCHAR szLogFile[ MAX_PATH ]; - Services_GuessLogName (szLogFile, szService); - if (szLogFile[0] != TEXT('\0')) - SetDlgItemText (hDlg, IDC_SVC_LOGFILE, szLogFile); - - Services_Create_EnableOK (hDlg); - break; - - case IDC_SVC_COMMAND: - Services_Create_EnableOK (hDlg); - break; - - case IDC_SVC_TYPE_SIMPLE: - case IDC_SVC_TYPE_CRON: - Services_Create_OnType (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Services_Create_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - CheckDlgButton (hDlg, IDC_SVC_TYPE_SIMPLE, TRUE); - CheckDlgButton (hDlg, IDC_SVC_RUNNOW, TRUE); - - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpp->hCombo = GetDlgItem (hDlg, IDC_SVC_SERVER); - lpp->lpiSelect = lpi; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); - - HWND hName = GetDlgItem (hDlg, IDC_SVC_NAME); - CB_StartChange (hName, TRUE); - CB_AddItem (hName, TEXT("buserver"), 0); - CB_AddItem (hName, TEXT("fileserver"), 0); - CB_AddItem (hName, TEXT("kaserver"), 0); - CB_AddItem (hName, TEXT("ptserver"), 0); - CB_AddItem (hName, TEXT("salvager"), 0); - CB_AddItem (hName, TEXT("upclient"), 0); - CB_AddItem (hName, TEXT("upserver"), 0); - CB_AddItem (hName, TEXT("vlserver"), 0); - CB_AddItem (hName, TEXT("volserver"), 0); - CB_EndChange (hName, 0); - - Services_Create_EnableOK (hDlg); - Services_Create_OnType (hDlg); -} - - -void Services_Create_OnType (HWND hDlg) -{ - AFSSERVICETYPE type; - if (IsDlgButtonChecked (hDlg, IDC_SVC_TYPE_FS)) - type = SERVICETYPE_FS; - else if (IsDlgButtonChecked (hDlg, IDC_SVC_TYPE_CRON)) - type = SERVICETYPE_CRON; - else // (IsDlgButtonChecked (hDlg, IDC_SVC_TYPE_SIMPLE)) - type = SERVICETYPE_SIMPLE; - - EnableWindow (GetDlgItem (hDlg, IDC_SVC_RUNNOW), (type == SERVICETYPE_SIMPLE)); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_RUNDAY), (type == SERVICETYPE_CRON)); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_RUNTIME), (type == SERVICETYPE_CRON)); - - HWND hDay = GetDlgItem (hDlg, IDC_SVC_RUNDAY); - CB_StartChange (hDay, TRUE); - CB_AddItem (hDay, IDS_RECUR_DAILY, -1); - CB_AddItem (hDay, IDS_RECUR_SUNDAY, 0); - CB_AddItem (hDay, IDS_RECUR_MONDAY, 1); - CB_AddItem (hDay, IDS_RECUR_TUESDAY, 2); - CB_AddItem (hDay, IDS_RECUR_WEDNESDAY, 3); - CB_AddItem (hDay, IDS_RECUR_THURSDAY, 4); - CB_AddItem (hDay, IDS_RECUR_FRIDAY, 5); - CB_AddItem (hDay, IDS_RECUR_SATURDAY, 6); - CB_EndChange (hDay, -1); -} - - -void Services_Create_OnApply (HWND hDlg) -{ - LPSVC_CREATE_PARAMS lpp = New (SVC_CREATE_PARAMS); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SVC_SERVER)); - GetDlgItemText (hDlg, IDC_SVC_NAME, lpp->szService, cchNAME); - GetDlgItemText (hDlg, IDC_SVC_COMMAND, lpp->szCommand, cchNAME); - GetDlgItemText (hDlg, IDC_SVC_PARAMS, lpp->szParams, cchNAME); - GetDlgItemText (hDlg, IDC_SVC_LOGFILE, lpp->szLogFile, cchNAME); - GetDlgItemText (hDlg, IDC_SVC_NOTIFIER, lpp->szNotifier, cchNAME); - - if (IsDlgButtonChecked (hDlg, IDC_SVC_TYPE_FS)) - lpp->type = SERVICETYPE_FS; - else if (IsDlgButtonChecked (hDlg, IDC_SVC_TYPE_CRON)) - lpp->type = SERVICETYPE_CRON; - else // (IsDlgButtonChecked (hDlg, IDC_SVC_TYPE_SIMPLE)) - lpp->type = SERVICETYPE_SIMPLE; - - if (lpp->type == SERVICETYPE_SIMPLE) - { - lpp->fRunNow = IsDlgButtonChecked (hDlg, IDC_SVC_RUNNOW); - } - else if (lpp->type == SERVICETYPE_CRON) - { - TI_GetTime (GetDlgItem (hDlg, IDC_SVC_RUNTIME), &lpp->stIfCron); - lpp->stIfCron.wDayOfWeek = (WORD)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SVC_RUNDAY)); - // wDayOfWeek: -1==daily, 0==sunday etc - } - - StartTask (taskSVC_CREATE, NULL, lpp); -} - - -void Services_Create_EnableOK (HWND hDlg) -{ - BOOL fEnable = TRUE; - - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_SVC_SERVER))) - fEnable = FALSE; - - if (fEnable) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SVC_NAME, szText, cchRESOURCE); - if (szText[0] == TEXT('\0')) - fEnable = FALSE; - } - - if (fEnable) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SVC_COMMAND, szText, cchRESOURCE); - if (szText[0] == TEXT('\0')) - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (GetParent(hDlg), IDOK), fEnable); -} - diff --git a/src/WINNT/afssvrmgr/svc_create.h b/src/WINNT/afssvrmgr/svc_create.h deleted file mode 100644 index 0446b4ce8..000000000 --- a/src/WINNT/afssvrmgr/svc_create.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_CREATE_H -#define SVC_CREATE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - TCHAR szService[ cchNAME ]; - TCHAR szCommand[ cchNAME ]; - TCHAR szParams[ cchNAME ]; - TCHAR szNotifier[ cchNAME ]; - TCHAR szLogFile[ cchNAME ]; - AFSSERVICETYPE type; - BOOL fRunNow; - SYSTEMTIME stIfCron; - } SVC_CREATE_PARAMS, *LPSVC_CREATE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Services_Create (LPIDENT lpiServer); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_delete.cpp b/src/WINNT/afssvrmgr/svc_delete.cpp deleted file mode 100644 index bf622b4a8..000000000 --- a/src/WINNT/afssvrmgr/svc_delete.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_delete.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Services_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Services_Delete_OnInitDialog (HWND hDlg, LPIDENT lpi); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Services_Delete (LPIDENT lpiService) -{ - int rc = ModalDialogParam (IDD_SVC_DELETE, GetActiveWindow(), (DLGPROC)Services_Delete_DlgProc, (LPARAM)lpiService); - if (rc == IDOK) - { - StartTask (taskSVC_DELETE, NULL, lpiService); - } -} - - - -BOOL CALLBACK Services_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVC_DELETE, hDlg, msg, wp, lp)) - return TRUE; - - static LPIDENT lpi = NULL; - if (msg == WM_INITDIALOG) - lpi = (LPIDENT)lp; - - if (lpi != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - Services_Delete_OnInitDialog (hDlg, lpi); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - - case WM_DESTROY: - lpi = NULL; - break; - } - } - - return FALSE; -} - - -void Services_Delete_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szServer[ cchNAME ]; - TCHAR szService[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetServiceName (szService); - - TCHAR szOld[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_DELSVC_DESC, szOld, cchRESOURCE); - - LPTSTR pszNew = FormatString (szOld, TEXT("%s%s"), szServer, szService); - SetDlgItemText (hDlg, IDC_DELSVC_DESC, pszNew); - FreeString (pszNew); -} - diff --git a/src/WINNT/afssvrmgr/svc_delete.h b/src/WINNT/afssvrmgr/svc_delete.h deleted file mode 100644 index d510e3d66..000000000 --- a/src/WINNT/afssvrmgr/svc_delete.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_DELETE_H -#define SVC_DELETE_H - - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Services_Delete (LPIDENT lpiService); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_general.cpp b/src/WINNT/afssvrmgr/svc_general.cpp deleted file mode 100644 index 45bdbcdf9..000000000 --- a/src/WINNT/afssvrmgr/svc_general.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_general.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Services_GuessLogName (LPTSTR pszLogFile, LPIDENT lpiService) -{ - TCHAR szService[ cchRESOURCE ]; - lpiService->GetServiceName (szService); - Services_GuessLogName (pszLogFile, szService); -} - -void Services_GuessLogName (LPTSTR pszLogFile, LPTSTR pszService) -{ - if (!lstrcmpi (pszService, TEXT("BOS"))) - lstrcpy (pszLogFile, TEXT("BosLog")); - else if (!lstrcmpi (pszService, TEXT("kaserver"))) - lstrcpy (pszLogFile, TEXT("AuthLog")); - else if (!lstrcmpi (pszService, TEXT("buserver"))) - lstrcpy (pszLogFile, TEXT("BackupLog")); - else if (!lstrcmpi (pszService, TEXT("fileserver"))) - lstrcpy (pszLogFile, TEXT("FileLog")); - else if (!lstrcmpi (pszService, TEXT("fs"))) - lstrcpy (pszLogFile, TEXT("FileLog")); - else if (!lstrcmpi (pszService, TEXT("volserver"))) - lstrcpy (pszLogFile, TEXT("VolserLog")); - else if (!lstrcmpi (pszService, TEXT("ptserver"))) - lstrcpy (pszLogFile, TEXT("PtLog")); - else if (!lstrcmpi (pszService, TEXT("salvager"))) - lstrcpy (pszLogFile, TEXT("SalvageLog")); - else if (!lstrcmpi (pszService, TEXT("vlserver"))) - lstrcpy (pszLogFile, TEXT("VLLog")); - else if (!lstrcmpi (pszService, TEXT("upclient"))) - pszLogFile[0] = TEXT('\0'); - else if (!lstrcmpi (pszService, TEXT("upserver"))) - pszLogFile[0] = TEXT('\0'); - else - pszLogFile[0] = TEXT('\0'); -} - - -PVOID Services_LoadPreferences (LPIDENT lpiService) -{ - LPSERVICE_PREF psp = New (SERVICE_PREF); - - if (!RestorePreferences (lpiService, psp, sizeof(SERVICE_PREF))) - { - psp->fWarnSvcStop = TRUE; - Alert_SetDefaults (&psp->oa); - - Services_GuessLogName (psp->szLogFile, lpiService); - - // write the logfile down so we won't have to guess again. - StorePreferences (lpiService, psp, sizeof(SERVICE_PREF)); - } - - Alert_Initialize (&psp->oa); - return psp; -} - - -BOOL Services_SavePreferences (LPIDENT lpiService) -{ - BOOL rc = FALSE; - - PVOID psp = lpiService->GetUserParam(); - if (psp != NULL) - { - rc = StorePreferences (lpiService, psp, sizeof(SERVICE_PREF)); - } - - return rc; -} - diff --git a/src/WINNT/afssvrmgr/svc_general.h b/src/WINNT/afssvrmgr/svc_general.h deleted file mode 100644 index 88034ac67..000000000 --- a/src/WINNT/afssvrmgr/svc_general.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_GENERAL_H -#define SVC_GENERAL_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -PVOID Services_LoadPreferences (LPIDENT lpiService); -BOOL Services_SavePreferences (LPIDENT lpiService); - -void Services_GuessLogName (LPTSTR pszLogFile, LPTSTR pszServiceName); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_prop.cpp b/src/WINNT/afssvrmgr/svc_prop.cpp deleted file mode 100644 index cc0851116..000000000 --- a/src/WINNT/afssvrmgr/svc_prop.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_prop.h" -#include "svc_general.h" -#include "svc_startstop.h" -#include "svc_viewlog.h" -#include "propcache.h" -#include "problems.h" - - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Services_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Services_General_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Services_General_OnApply (HWND hDlg, LPIDENT lpi); -void Services_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp); -void Services_General_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp); - -BOOL CALLBACK Services_BOS_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Services_BOS_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Services_BOS_OnEnable (HWND hDlg, LPIDENT lpi); -void Services_BOS_OnApply (HWND hDlg, LPIDENT lpi); -void Services_BOS_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPIDENT lpi); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL PropSheet_AddBOSTab (LPPROPSHEET psh, LPIDENT lpiService) -{ - TCHAR szSvcName[ cchNAME ]; - lpiService->GetServiceName (szSvcName); - - if (lstrcmp (szSvcName, TEXT("BOS"))) - return TRUE; - - return PropSheet_AddTab (psh, IDS_SVC_BOS_TAB, IDD_SVC_BOS, (DLGPROC)Services_BOS_DlgProc, (LPARAM)lpiService, TRUE); -} - - -void Services_ShowProperties (LPIDENT lpiService, size_t nAlerts) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVC_PROP, lpiService)) != NULL) - { - SetFocus (hCurrent); - } - else - { - TCHAR szSvrName[ cchNAME ]; - TCHAR szSvcName[ cchNAME ]; - lpiService->GetServerName (szSvrName); - lpiService->GetServiceName (szSvcName); - LPTSTR pszTitle = FormatString (IDS_SVC_PROP_TITLE, TEXT("%s%s"), szSvrName, szSvcName); - - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - psh->fMadeCaption = TRUE; - - if (PropSheet_AddProblemsTab (psh, IDD_SVC_PROBLEMS, lpiService, nAlerts) && - PropSheet_AddTab (psh, IDS_SVC_GENERAL_TAB, IDD_SVC_GENERAL, (DLGPROC)Services_General_DlgProc, (LPARAM)lpiService, TRUE) && - PropSheet_AddBOSTab (psh, lpiService)) - { - PropSheet_ShowModeless (psh); - } - } -} - - -BOOL CALLBACK Services_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVC_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcSVC_PROP, (LPIDENT)lp, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - NotifyMe (WHEN_OBJECT_CHANGES, lpi, hDlg, 0); - Services_General_OnInitDialog (hDlg, lpi); - StartTask (taskSVC_PROP_INIT, hDlg, lpi); - break; - - case WM_DESTROY: - DontNotifyMeEver (hDlg); - break; - - case WM_NOTIFY_FROM_DISPATCH: - if (((LPNOTIFYSTRUCT)lp)->evt == evtRefreshStatusEnd) - { - if (((LPNOTIFYSTRUCT)lp)->Params.lpi1 == lpi) - { - StartTask (taskSVC_PROP_INIT, hDlg, lpi); - } - } - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVC_PROP_INIT) - Services_General_OnEndTask_InitDialog (hDlg, ptp); - else if (ptp->idTask == taskSVC_PROP_APPLY) - Services_General_OnEndTask_Apply (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - break; - - case IDAPPLY: - Services_General_OnApply (hDlg, lpi); - break; - - case IDC_SVC_WARNSTOP: - PropSheetChanged (hDlg); - break; - - case IDC_SVC_START: - TCHAR szSvcName[ cchNAME ]; - lpi->GetServiceName (szSvcName); - if (!lstrcmpi (szSvcName, TEXT("BOS"))) - Services_Restart (lpi); - else - Services_Start (lpi); - break; - - case IDC_SVC_STOP: - Services_Stop (lpi); - break; - - case IDC_SVC_VIEWLOG: - Services_ShowServiceLog (lpi); - break; - } - break; - } - - return FALSE; -} - - -void Services_General_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szText[ cchRESOURCE ]; - LPTSTR pszText; - - TCHAR szSvrName[ cchNAME ]; - TCHAR szSvcName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetServiceName (szSvcName); - - GetDlgItemText (hDlg, IDC_SVC_NAME, szText, cchRESOURCE); - pszText = FormatString (szText, TEXT("%s%s"), szSvrName, szSvcName); - SetDlgItemText (hDlg, IDC_SVC_NAME, pszText); - FreeString (pszText); - - EnableWindow (GetDlgItem (hDlg, IDC_SVC_WARNSTOP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_VIEWLOG), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_STOP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_START), FALSE); - - if (!lstrcmpi (szSvcName, TEXT("BOS"))) - { - RECT rStart; - RECT rStop; - GetRectInParent (GetDlgItem (hDlg, IDC_SVC_START), &rStart); - GetRectInParent (GetDlgItem (hDlg, IDC_SVC_STOP), &rStop); - DestroyWindow (GetDlgItem (hDlg, IDC_SVC_STOP)); - SetWindowPos (GetDlgItem (hDlg, IDC_SVC_START), NULL, - 0, 0, rStop.right-rStart.left, rStart.bottom-rStart.top, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - GetString (szText, IDS_SVC_RESTART_BUTTON); - SetDlgItemText (hDlg, IDC_SVC_START, szText); - } -} - - -void Services_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - TCHAR szUnknown[ cchRESOURCE ]; - GetString (szUnknown, IDS_UNKNOWN); - - if (!ptp->rc) - { - SetDlgItemText (hDlg, IDC_SVC_STARTDATE, szUnknown); - SetDlgItemText (hDlg, IDC_SVC_STOPDATE, szUnknown); - SetDlgItemText (hDlg, IDC_SVC_LASTERROR, szUnknown); - GetString (szUnknown, IDS_SERVICESTATUS_UNKNOWN); - SetDlgItemText (hDlg, IDC_SVC_STATUS, szUnknown); - SetDlgItemText (hDlg, IDC_SVC_PARAMS, szUnknown); - SetDlgItemText (hDlg, IDC_SVC_NOTIFIER, szUnknown); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szSvcName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetServiceName (szSvcName); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVICE_STATUS, TEXT("%s%s"), szSvrName, szSvcName); - } - else - { - TCHAR szText[ cchRESOURCE ]; - - EnableWindow (GetDlgItem (hDlg, IDC_SVC_WARNSTOP), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_VIEWLOG), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_STOP), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_START), TRUE); - - if (TASKDATA(ptp)->cs.type == SERVICETYPE_FS) - GetString (szText, IDS_SERVICETYPE_FS_LONG); - else if (TASKDATA(ptp)->cs.type == SERVICETYPE_CRON) - GetString (szText, IDS_SERVICETYPE_CRON_LONG); - else // (TASKDATA(ptp)->cs.type == SERVICETYPE_SIMPLE) - GetString (szText, IDS_SERVICETYPE_SIMPLE_LONG); - SetDlgItemText (hDlg, IDC_SVC_TYPE, szText); - - LPTSTR pszParams = CloneString (TASKDATA(ptp)->cs.szParams); - for (LPTSTR pch = pszParams; pch && *pch; ++pch) - { - if (*pch == TEXT('\r') || *pch == TEXT('\t') || *pch == TEXT('\n')) - *pch = TEXT(' '); - } - SetDlgItemText (hDlg, IDC_SVC_PARAMS, pszParams ? pszParams : TEXT("")); - FreeString (pszParams); - - LPTSTR pszNotifier = CloneString (TASKDATA(ptp)->cs.szNotifier); - for (pch = pszNotifier; pch && *pch; ++pch) - { - if (*pch == TEXT('\r') || *pch == TEXT('\t') || *pch == TEXT('\n')) - *pch = TEXT(' '); - } - GetString (szText, IDS_SVC_NONOTIFIER); - SetDlgItemText (hDlg, IDC_SVC_NOTIFIER, (pszNotifier && *pszNotifier) ? pszNotifier : szText); - FreeString (pszNotifier); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->cs.timeLastStart)) - SetDlgItemText (hDlg, IDC_SVC_STARTDATE, szUnknown); - else - SetDlgItemText (hDlg, IDC_SVC_STARTDATE, szText); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->cs.timeLastStop)) - SetDlgItemText (hDlg, IDC_SVC_STOPDATE, szUnknown); - else - SetDlgItemText (hDlg, IDC_SVC_STOPDATE, szText); - - if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->cs.timeLastFail)) - SetDlgItemText (hDlg, IDC_SVC_LASTERROR, szUnknown); - else - { - LPTSTR pszText = FormatString (IDS_SERVICE_LASTERRORDATE, TEXT("%s%ld"), szText, TASKDATA(ptp)->cs.dwErrLast); - SetDlgItemText (hDlg, IDC_SVC_LASTERROR, pszText); - FreeString (pszText); - } - - if (TASKDATA(ptp)->cs.state == SERVICESTATE_RUNNING) - { - GetString (szText, IDS_SERVICESTATUS_RUNNING); - } - else if (TASKDATA(ptp)->cs.state == SERVICESTATE_STARTING) - { - EnableWindow (GetDlgItem (hDlg, IDC_SVC_STOP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_START), FALSE); - GetString (szText, IDS_SERVICESTATUS_STARTING); - } - else if (TASKDATA(ptp)->cs.state == SERVICESTATE_STOPPING) - { - EnableWindow (GetDlgItem (hDlg, IDC_SVC_STOP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_START), FALSE); - GetString (szText, IDS_SERVICESTATUS_STOPPING); - } - else // (TASKDATA(ptp)->cs.state == SERVICESTATE_STOPPED) - { - GetString (szText, IDS_SERVICESTATUS_STOPPED); - } - SetDlgItemText (hDlg, IDC_SVC_STATUS, szText); - - CheckDlgButton (hDlg, IDC_SVC_WARNSTOP, (TASKDATA(ptp)->lpsp->fWarnSvcStop && TASKDATA(ptp)->lpcp->fWarnSvcStop)); - } -} - - -void Services_General_OnApply (HWND hDlg, LPIDENT lpi) -{ - LPSVC_PROP_APPLY_PACKET lpp; - if ((lpp = New (SVC_PROP_APPLY_PACKET)) != NULL) - { - lpp->lpi = lpi; - lpp->fIDC_SVC_WARNSTOP = IsDlgButtonChecked (hDlg, IDC_SVC_WARNSTOP); - - StartTask (taskSVC_PROP_APPLY, hDlg, lpp); - } -} - - -void Services_General_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - TCHAR szSvrName[ cchNAME ]; - TCHAR szSvcName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetServiceName (szSvcName); - ErrorDialog (ptp->status, IDS_ERROR_CHANGE_SERVICE_STATUS, TEXT("%s%s"), szSvrName, szSvcName); - } -} - - -BOOL CALLBACK Services_BOS_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVC_BOS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG: - Services_BOS_OnInitDialog (hDlg, lpi); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVC_GETRESTARTTIMES) - Services_BOS_OnEndTask_InitDialog (hDlg, ptp, lpi); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - break; - - case IDAPPLY: - Services_BOS_OnApply (hDlg, lpi); - break; - - case IDC_BOS_GENRES: - case IDC_BOS_BINRES: - Services_BOS_OnEnable (hDlg, lpi); - PropSheetChanged (hDlg); - break; - - case IDC_BOS_GENRES_DATE: - case IDC_BOS_GENRES_TIME: - case IDC_BOS_BINRES_DATE: - case IDC_BOS_BINRES_TIME: - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Services_BOS_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - TCHAR szText[ cchRESOURCE ]; - LPTSTR pszText; - - TCHAR szSvrName[ cchNAME ]; - TCHAR szSvcName[ cchNAME ]; - lpi->GetServerName (szSvrName); - lpi->GetServiceName (szSvcName); - - GetDlgItemText (hDlg, IDC_SVC_NAME, szText, cchRESOURCE); - pszText = FormatString (szText, TEXT("%s%s"), szSvrName, szSvcName); - SetDlgItemText (hDlg, IDC_SVC_NAME, pszText); - FreeString (pszText); - - HWND hDay = GetDlgItem (hDlg, IDC_BOS_GENRES_DATE); - CB_StartChange (hDay, TRUE); - CB_AddItem (hDay, IDS_RECUR_DAILY, (WORD)-1); - CB_AddItem (hDay, IDS_RECUR_SUNDAY, 0); - CB_AddItem (hDay, IDS_RECUR_MONDAY, 1); - CB_AddItem (hDay, IDS_RECUR_TUESDAY, 2); - CB_AddItem (hDay, IDS_RECUR_WEDNESDAY, 3); - CB_AddItem (hDay, IDS_RECUR_THURSDAY, 4); - CB_AddItem (hDay, IDS_RECUR_FRIDAY, 5); - CB_AddItem (hDay, IDS_RECUR_SATURDAY, 6); - CB_EndChange (hDay, (WORD)-1); - - hDay = GetDlgItem (hDlg, IDC_BOS_BINRES_DATE); - CB_StartChange (hDay, TRUE); - CB_AddItem (hDay, IDS_RECUR_DAILY, (WORD)-1); - CB_AddItem (hDay, IDS_RECUR_SUNDAY, 0); - CB_AddItem (hDay, IDS_RECUR_MONDAY, 1); - CB_AddItem (hDay, IDS_RECUR_TUESDAY, 2); - CB_AddItem (hDay, IDS_RECUR_WEDNESDAY, 3); - CB_AddItem (hDay, IDS_RECUR_THURSDAY, 4); - CB_AddItem (hDay, IDS_RECUR_FRIDAY, 5); - CB_AddItem (hDay, IDS_RECUR_SATURDAY, 6); - CB_EndChange (hDay, (WORD)-1); - - EnableWindow (GetDlgItem (hDlg, IDC_BOS_GENRES), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_BINRES), FALSE); - Services_BOS_OnEnable (hDlg, lpi); - - LPSVC_RESTARTTIMES_PARAMS lpp = New (SVC_RESTARTTIMES_PARAMS); - memset (lpp, 0x00, sizeof(SVC_RESTARTTIMES_PARAMS)); - lpp->lpi = lpi; - StartTask (taskSVC_GETRESTARTTIMES, hDlg, lpp); -} - - -void Services_BOS_OnEnable (HWND hDlg, LPIDENT lpi) -{ - BOOL fEnable; - - fEnable = TRUE; - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_BOS_GENRES))) - fEnable = FALSE; - else if (!IsDlgButtonChecked (hDlg, IDC_BOS_GENRES)) - fEnable = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_BOS_GENRES_DESC1), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_GENRES_DATE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_GENRES_DESC2), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_GENRES_TIME), fEnable); - - fEnable = TRUE; - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_BOS_BINRES))) - fEnable = FALSE; - else if (!IsDlgButtonChecked (hDlg, IDC_BOS_BINRES)) - fEnable = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_BOS_BINRES_DESC1), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_BINRES_DATE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_BINRES_DESC2), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_BINRES_TIME), fEnable); -} - - -void Services_BOS_OnApply (HWND hDlg, LPIDENT lpi) -{ - LPSVC_RESTARTTIMES_PARAMS lpp = New (SVC_RESTARTTIMES_PARAMS); - lpp->lpi = lpi; - - lpp->fGeneral = IsDlgButtonChecked (hDlg, IDC_BOS_GENRES); - TI_GetTime (GetDlgItem (hDlg, IDC_BOS_GENRES_TIME), &lpp->stGeneral); - lpp->stGeneral.wDayOfWeek = (WORD)CB_GetSelectedData (GetDlgItem (hDlg, IDC_BOS_GENRES_DATE)); - - lpp->fNewBinary = IsDlgButtonChecked (hDlg, IDC_BOS_BINRES); - TI_GetTime (GetDlgItem (hDlg, IDC_BOS_BINRES_TIME), &lpp->stNewBinary); - lpp->stNewBinary.wDayOfWeek = (WORD)CB_GetSelectedData (GetDlgItem (hDlg, IDC_BOS_BINRES_DATE)); - - StartTask (taskSVC_SETRESTARTTIMES, NULL, lpp); -} - - -void Services_BOS_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPIDENT lpi) -{ - LPSVC_RESTARTTIMES_PARAMS lpp = (LPSVC_RESTARTTIMES_PARAMS)(ptp->lpUser); - - if (ptp->rc) - { - EnableWindow (GetDlgItem (hDlg, IDC_BOS_GENRES), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_BOS_BINRES), TRUE); - - CheckDlgButton (hDlg, IDC_BOS_GENRES, lpp->fGeneral); - if (!lpp->fGeneral) - { - lpp->stGeneral.wDay = 0; - lpp->stGeneral.wHour = 5; - lpp->stGeneral.wMinute = 0; - } - - TI_SetTime (GetDlgItem (hDlg, IDC_BOS_GENRES_TIME), &lpp->stGeneral); - CB_SetSelectedByData (GetDlgItem (hDlg, IDC_BOS_GENRES_DATE), (LPARAM)lpp->stGeneral.wDayOfWeek); - - CheckDlgButton (hDlg, IDC_BOS_BINRES, lpp->fNewBinary); - if (!lpp->fNewBinary) - { - lpp->stNewBinary.wDay = 0; - lpp->stNewBinary.wHour = 5; - lpp->stNewBinary.wMinute = 0; - } - - TI_SetTime (GetDlgItem (hDlg, IDC_BOS_BINRES_TIME), &lpp->stNewBinary); - CB_SetSelectedByData (GetDlgItem (hDlg, IDC_BOS_BINRES_DATE), (LPARAM)lpp->stNewBinary.wDayOfWeek); - - Services_BOS_OnEnable (hDlg, lpi); - } - - Delete (lpp); -} - diff --git a/src/WINNT/afssvrmgr/svc_prop.h b/src/WINNT/afssvrmgr/svc_prop.h deleted file mode 100644 index cdcc40e1e..000000000 --- a/src/WINNT/afssvrmgr/svc_prop.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_PROP_H -#define SVC_PROP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - BOOL fIDC_SVC_WARNSTOP; - } SVC_PROP_APPLY_PACKET, *LPSVC_PROP_APPLY_PACKET; - -typedef struct - { - LPIDENT lpi; - BOOL fGeneral; - SYSTEMTIME stGeneral; - BOOL fNewBinary; - SYSTEMTIME stNewBinary; - } SVC_RESTARTTIMES_PARAMS, *LPSVC_RESTARTTIMES_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Services_ShowProperties (LPIDENT lpiService, size_t nAlerts); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_startstop.cpp b/src/WINNT/afssvrmgr/svc_startstop.cpp deleted file mode 100644 index 0d498faf5..000000000 --- a/src/WINNT/afssvrmgr/svc_startstop.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_startstop.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - BOOL fStart; - BOOL fTemporary; - } SERVICE_STARTSTOP_PARAMS, *LPSERVICE_STARTSTOP_PARAMS; - -BOOL CALLBACK Services_StartStop_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Services_StartStop_OnInitDialog (HWND hDlg, LPSERVICE_STARTSTOP_PARAMS lpp); -void Services_StartStop_OnOK (HWND hDlg, LPSERVICE_STARTSTOP_PARAMS lpp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL Services_fRunning (LPSERVICE lpService) -{ - SERVICESTATUS ss; - ULONG status; - if (!lpService->GetStatus (&ss, FALSE, &status)) - return FALSE; - - return (ss.state == SERVICESTATE_RUNNING) ? TRUE : FALSE; -} - - - -void Services_Restart (LPIDENT lpiService) -{ - StartTask (taskSVC_RESTART, NULL, lpiService); -} - - -void Services_Start (LPIDENT lpiService) -{ - SERVICE_STARTSTOP_PARAMS dp; - memset (&dp, 0x00, sizeof(dp)); - dp.lpi = lpiService; - dp.fStart = TRUE; - - if (ModalDialogParam (IDD_SVC_STARTSTOP, NULL, (DLGPROC)Services_StartStop_DlgProc, (LPARAM)&dp) == IDOK) - { - LPSVC_START_PARAMS lpp = New (SVC_START_PARAMS); - memset (lpp, 0x00, sizeof(SVC_START_PARAMS)); - lpp->lpiStart = lpiService; - lpp->fTemporary = dp.fTemporary; - StartTask (taskSVC_START, NULL, lpp); - } -} - - -void Services_Stop (LPIDENT lpiService) -{ - SERVICE_STARTSTOP_PARAMS dp; - memset (&dp, 0x00, sizeof(dp)); - dp.lpi = lpiService; - dp.fStart = FALSE; - - if (ModalDialogParam (IDD_SVC_STARTSTOP, NULL, (DLGPROC)Services_StartStop_DlgProc, (LPARAM)&dp) == IDOK) - { - LPSVC_STOP_PARAMS lpp = New (SVC_STOP_PARAMS); - memset (lpp, 0x00, sizeof(SVC_STOP_PARAMS)); - lpp->lpiStop = lpiService; - lpp->fTemporary = dp.fTemporary; - StartTask (taskSVC_STOP, NULL, lpp); - } -} - - -BOOL CALLBACK Services_StartStop_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPSERVICE_STARTSTOP_PARAMS lpp = NULL; - - if (lpp != NULL) - { - if (AfsAppLib_HandleHelp ((lpp->fStart) ? IDD_SVC_START : IDD_SVC_STOP, hDlg, msg, wp, lp)) - return TRUE; - } - - switch (msg) - { - case WM_INITDIALOG: - lpp = (LPSERVICE_STARTSTOP_PARAMS)lp; - Services_StartStop_OnInitDialog (hDlg, lpp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Services_StartStop_OnOK (hDlg, lpp); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - } - break; - } - - return FALSE; -} - - -void Services_StartStop_OnInitDialog (HWND hDlg, LPSERVICE_STARTSTOP_PARAMS lpp) -{ - LPTSTR pszString = FormatString ((lpp->fStart) ? IDS_STARTSERVICE_TITLE : IDS_STOPSERVICE_TITLE); - SetWindowText (hDlg, pszString); - FreeString (pszString); - - TCHAR szServer[ cchNAME ]; - lpp->lpi->GetServerName (szServer); - - TCHAR szService[ cchNAME ]; - lpp->lpi->GetServiceName (szService); - - pszString = FormatString ((lpp->fStart) ? IDS_STARTSERVICE_TEXT : IDS_STOPSERVICE_TEXT, TEXT("%s%s"), szServer, szService); - SetDlgItemText (hDlg, IDC_STARTSTOP_TEXT, pszString); - FreeString (pszString); - - pszString = FormatString ((lpp->fStart) ? IDS_STARTSERVICE_STARTUP : IDS_STOPSERVICE_STARTUP, TEXT("%s%s"), szServer, szService); - SetDlgItemText (hDlg, IDC_STARTSTOP_STARTUP, pszString); - FreeString (pszString); - - pszString = FormatString ((lpp->fStart) ? IDS_STARTSERVICE_PERMANENT : IDS_STOPSERVICE_PERMANENT, TEXT("%s%s"), szServer, szService); - SetDlgItemText (hDlg, IDC_STARTSTOP_PERMANENT, pszString); - FreeString (pszString); - - pszString = FormatString ((lpp->fStart) ? IDS_STARTSERVICE_TEMPORARY : IDS_STOPSERVICE_TEMPORARY, TEXT("%s%s"), szServer, szService); - SetDlgItemText (hDlg, IDC_STARTSTOP_TEMPORARY, pszString); - FreeString (pszString); - - CheckDlgButton (hDlg, IDC_STARTSTOP_PERMANENT, !lpp->fTemporary); - CheckDlgButton (hDlg, IDC_STARTSTOP_TEMPORARY, lpp->fTemporary); -} - - -void Services_StartStop_OnOK (HWND hDlg, LPSERVICE_STARTSTOP_PARAMS lpp) -{ - lpp->fTemporary = IsDlgButtonChecked (hDlg, IDC_STARTSTOP_TEMPORARY); -} - diff --git a/src/WINNT/afssvrmgr/svc_startstop.h b/src/WINNT/afssvrmgr/svc_startstop.h deleted file mode 100644 index b79e2b525..000000000 --- a/src/WINNT/afssvrmgr/svc_startstop.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_STARTSTOP_H -#define SVC_STARTSTOP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiStart; - BOOL fTemporary; - } SVC_START_PARAMS, *LPSVC_START_PARAMS; - -typedef struct - { - LPIDENT lpiStop; - BOOL fTemporary; - } SVC_STOP_PARAMS, *LPSVC_STOP_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL Services_fRunning (LPSERVICE lpService); - -void Services_Start (LPIDENT lpiService); -void Services_Restart (LPIDENT lpiService); -void Services_Stop (LPIDENT lpiService); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_tab.cpp b/src/WINNT/afssvrmgr/svc_tab.cpp deleted file mode 100644 index 4dfc9748a..000000000 --- a/src/WINNT/afssvrmgr/svc_tab.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svc_tab.h" -#include "svr_window.h" -#include "svr_general.h" -#include "display.h" -#include "command.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdServices[] = { - { IDC_SVC_DESC, raSizeX, 0, 0 }, - { IDC_SVC_LIST, raSizeX | raSizeY, 0, 0 }, - { IDC_SVC_CREATE, raMoveX | raMoveY, 0, 0 }, - { IDC_SVC_DELETE, raMoveX | raMoveY, 0, 0 }, - { IDC_SVC_RESTART, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Services_OnSelect (HWND hDlg); - -void Services_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns); - -void Services_SubclassList (HWND hDlg); - -void Services_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen); - -void Services_OnEndTask_Menu (LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Services_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewSvc)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - { - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - ResizeWindow (hDlg, awdServices, rwaMoveToHere, &rTab); - - FL_RestoreView (GetDlgItem (hDlg, IDC_SVC_LIST), &gr.viewSvc); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_SVC_LIST), GetItemText, (DWORD)&gr.viewSvc); - - Services_SubclassList (hDlg); - Services_OnSelect (hDlg); - } - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - DontNotifyMeEver (hDlg); - FL_StoreView (GetDlgItem (hDlg, IDC_SVC_LIST), &gr.viewSvc); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdServices, rwaFixupGuts); - break; - - case WM_SERVER_CHANGED: - { - LPIDENT lpiServer = Server_GetServerForChild (hDlg); - DontNotifyMeEver (hDlg); - NotifyMe (WHEN_SVCS_CHANGE, lpiServer, hDlg, 0); - - // Fix the text at the top of the Services tab: - // - TCHAR szName[ cchRESOURCE ]; - LPTSTR pszText; - - if (lpiServer != NULL) - { - LPSERVER_PREF lpsp = (LPSERVER_PREF)lpiServer->GetUserParam(); - lpiServer->GetServerName (szName); - if (lpsp && !lpsp->fIsMonitored) - pszText = FormatString (IDS_SERVICE_UNMON, TEXT("%s"), szName); - else - pszText = FormatString (IDS_SERVICES_IN_SERVER, TEXT("%s"), szName); - } - else if (g.lpiCell != NULL) - { - g.lpiCell->GetCellName (szName); - if (g.sub) - pszText = FormatString (IDS_SERVICE_SOME, TEXT("%s"), szName); - else - pszText = FormatString (IDS_SERVICES_IN_CELL, TEXT("%s"), szName); - } - else - { - pszText = FormatString (IDS_SERVICES_IN_NOTHING); - } - - SetDlgItemText (hDlg, IDC_SVC_DESC, pszText); - FreeString (pszText); - - UpdateDisplay_Services (FALSE, hDlg, NULL, 0); - } - break; - - case WM_NOTIFY_FROM_DISPATCH: - Services_OnNotifyFromDispatch ((LPNOTIFYSTRUCT)lp); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVC_MENU) - Services_OnEndTask_Menu (ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_SVC_RESTART: - SendMessage (GetDlgItem (hDlg, IDC_SVC_LIST), WM_COMMAND, M_SVC_RESTART, 0); - break; - - case IDC_SVC_CREATE: - SendMessage (GetDlgItem (hDlg, IDC_SVC_LIST), WM_COMMAND, M_SVC_CREATE, 0); - break; - - case IDC_SVC_DELETE: - SendMessage (GetDlgItem (hDlg, IDC_SVC_LIST), WM_COMMAND, M_SVC_DELETE, 0); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Services_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SVC_LIST)) - { - if (FL_GetSelectedData (GetDlgItem (hDlg, IDC_SVC_LIST))) - PostMessage (GetDlgItem (hDlg, IDC_SVC_LIST), WM_COMMAND, M_PROPERTIES, 0); - } - break; - } - break; - - case WM_CONTEXTMENU: - { - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient ((HWND)wp, &ptClient); - - if ((HWND)wp == GetDlgItem (hDlg, IDC_SVC_LIST)) - Services_ShowPopupMenu ((HWND)wp, ptClient, ptScreen); - } - break; - } - - return FALSE; -} - - -void Services_OnSelect (HWND hDlg) -{ - LPIDENT lpi; - if ( ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_SVC_LIST))) == NULL) || - (!lpi->fIsService()) ) - { - EnableWindow (GetDlgItem (hDlg, IDC_SVC_RESTART), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVC_DELETE), FALSE); - } - else - { - TCHAR szName[ cchRESOURCE ]; - lpi->GetServiceName (szName); - - if (!lstrcmpi (szName, TEXT("BOS"))) - EnableWindow (GetDlgItem (hDlg, IDC_SVC_DELETE), FALSE); - else - EnableWindow (GetDlgItem (hDlg, IDC_SVC_DELETE), TRUE); - - EnableWindow (GetDlgItem (hDlg, IDC_SVC_RESTART), TRUE); - } -} - - -void Services_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns) -{ - switch (lpns->evt) - { - case evtRefreshServicesEnd: - case evtRefreshStatusEnd: - case evtAlertsChanged: - case evtDestroy: - UpdateDisplay_Services (FALSE, lpns->hwndTarget, (LPIDENT)lpns->Params.lpi1, lpns->Params.status); - break; - } -} - - -static LONG procServicesList = 0; - -LRESULT CALLBACK Services_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procServicesList == 0) - rc = DefWindowProc (hList, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procServicesList, hList, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procServicesList != 0) - SetWindowLong (hList, GWL_WNDPROC, procServicesList); - break; - - case WM_COMMAND: - StartContextCommand (Server_GetWindowForChild (GetParent(hList)), - Server_GetServerForChild (GetParent(hList)), - (LPIDENT)FL_GetSelectedData (hList), - LOWORD(wp)); - break; - } - - return rc; -} - - -void Services_SubclassList (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SVC_LIST); - procServicesList = GetWindowLong (hList, GWL_WNDPROC); - SetWindowLong (hList, GWL_WNDPROC, (LONG)Services_SubclassListProc); -} - - -void Services_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen) -{ - if (!ptScreen.x && !ptScreen.y) - { - RECT rWindow; - GetWindowRect (hList, &rWindow); - ptScreen.x = rWindow.left + (rWindow.right -rWindow.left)/2; - ptScreen.y = rWindow.top + (rWindow.bottom -rWindow.top)/2; - Services_ShowParticularPopupMenu (hList, ptScreen, NULL); - } - else if (FL_HitTestForHeaderBar (hList, ptList)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - else - { - LPIDENT lpiSelected = NULL; - - HLISTITEM hItem; - if ((hItem = FastList_ItemFromPoint (hList, &ptList, TRUE)) != NULL) - lpiSelected = (LPIDENT)FL_GetData (hList, hItem); - - if (lpiSelected && (lpiSelected != (LPIDENT)FL_GetSelectedData (hList))) - lpiSelected = NULL; - - if (lpiSelected && lpiSelected->fIsServer()) - Server_ShowParticularPopupMenu (hList, ptScreen, lpiSelected); - else - Services_ShowParticularPopupMenu (hList, ptScreen, lpiSelected); - } -} - - -void Services_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiService) -{ - LPMENUTASK pmt; - if ((pmt = New (MENUTASK)) != NULL) - { - pmt->hParent = hParent; - pmt->ptScreen = ptScreen; - pmt->lpi = lpiService; - StartTask (taskSVC_MENU, GetParent(hParent), pmt); - } -} - - -void Services_OnEndTask_Menu (LPTASKPACKET ptp) -{ - HMENU hm; - if (!TASKDATA(ptp)->mt.lpi) - hm = TaLocale_LoadMenu (MENU_SVC_NONE); - else - { - TCHAR szName[ cchRESOURCE ]; - TASKDATA(ptp)->mt.lpi->GetServiceName (szName); - if (!lstrcmpi (szName, TEXT("BOS"))) - hm = TaLocale_LoadMenu (MENU_SVC_BOS); - else - hm = TaLocale_LoadMenu (MENU_SVC); - } - - if (hm != NULL) - { - if (TASKDATA(ptp)->mt.lpi == NULL) - { - HMENU hmView = GetSubMenu (hm, 0); - - CheckMenuRadioItem (hmView, - M_VIEW_ONEICON, M_VIEW_STATUS, - (gr.ivSvc == ivTWOICONS) ? M_VIEW_TWOICONS : - (gr.ivSvc == ivONEICON) ? M_VIEW_ONEICON : M_VIEW_STATUS, - MF_BYCOMMAND); - } - else // (TASKDATA(ptp)->mt.lpi) - { - if (!ptp->rc) - { - EnableMenu (hm, M_SVC_START, FALSE); - EnableMenu (hm, M_SVC_STOP, FALSE); - EnableMenu (hm, M_SVC_RESTART, FALSE); - } - else - { - if (TASKDATA(ptp)->cs.state != SERVICESTATE_STOPPED) - EnableMenu (hm, M_SVC_START, FALSE); - else if (TASKDATA(ptp)->cs.state != SERVICESTATE_RUNNING) - EnableMenu (hm, M_SVC_STOP, FALSE); - } - } - - DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent); - } -} - diff --git a/src/WINNT/afssvrmgr/svc_tab.h b/src/WINNT/afssvrmgr/svc_tab.h deleted file mode 100644 index 0ff472ad2..000000000 --- a/src/WINNT/afssvrmgr/svc_tab.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_TAB_H -#define SVC_TAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Services_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Services_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiService); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svc_viewlog.cpp b/src/WINNT/afssvrmgr/svc_viewlog.cpp deleted file mode 100644 index 7cbc57d13..000000000 --- a/src/WINNT/afssvrmgr/svc_viewlog.cpp +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include -#include "svc_viewlog.h" -#include "svc_general.h" - - -#define cchMAXLOG 20480 // show at most 20k worth of log file - -#define cxMIN_VIEWLOG 250 // minimum size of View Log File dialog -#define cyMIN_VIEWLOG 200 // minimum size of View Log File dialog - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdShowLog[] = { - { IDC_SVC_VIEWLOG_DESC, raSizeX | raRepaint, 0, 0 }, - { IDC_SVC_VIEWLOG_FILENAME, raSizeX | raRepaint, 0, 0 }, - { IDC_VIEWLOG_TEXT, raSizeX | raSizeY | raRepaint, MAKELONG(cxMIN_VIEWLOG,cyMIN_VIEWLOG), 0 }, - { IDC_SVC_VIEWLOG_CONTENTS, raSizeX, 0, 0 }, - { IDOK, raMoveX | raMoveY, 0, 0 }, - { IDC_VIEWLOG_SAVEAS, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Services_ShowLog_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Services_ShowLog_TakeNextStep (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp); -void Services_ShowLog_OnEndTask (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp, LPTASKPACKET ptp); -void Services_ShowLog_OnInitDialog (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp); -void Services_ShowLog_OnSaveAs (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp); -BOOL Services_ShowLog_Pick (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp); - -BOOL CALLBACK Services_PickLog_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Services_PickLog_OnInitDialog (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Services_ShowServiceLog (LPIDENT lpi) -{ - LPSVC_VIEWLOG_PACKET lpp = New (SVC_VIEWLOG_PACKET); - lpp->lpiServer = lpi->GetServer(); - lpp->lpiService = (lpi && lpi->fIsService()) ? lpi : NULL; - lpp->szLocal[0] = TEXT('\0'); - lpp->szRemote[0] = TEXT('\0'); - lpp->nDownloadAttempts = 0; - - HWND hDlg = ModelessDialogParam (IDD_SVC_VIEWLOG, NULL, (DLGPROC)Services_ShowLog_DlgProc, (LPARAM)lpp); - AfsAppLib_RegisterModelessDialog (hDlg); -} - - -void Services_ShowServerLog (LPIDENT lpiServer, LPTSTR pszRemote) -{ - LPSVC_VIEWLOG_PACKET lpp = New (SVC_VIEWLOG_PACKET); - lpp->lpiService = NULL; - lpp->lpiServer = lpiServer; - lpp->szLocal[0] = TEXT('\0'); - lpp->nDownloadAttempts = 0; - - if (pszRemote) - lstrcpy (lpp->szRemote, pszRemote); - else - lpp->szRemote[0] = TEXT('\0'); - - HWND hDlg = ModelessDialogParam (IDD_SVC_VIEWLOG, NULL, (DLGPROC)Services_ShowLog_DlgProc, (LPARAM)lpp); - AfsAppLib_RegisterModelessDialog (hDlg); -} - - -BOOL CALLBACK Services_ShowLog_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVC_VIEWLOG, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSVC_VIEWLOG_PACKET lpp; - if ((lpp = (LPSVC_VIEWLOG_PACKET)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - if (gr.rViewLog.right == 0) - GetWindowRect (hDlg, &gr.rViewLog); - ResizeWindow (hDlg, awdShowLog, rwaMoveToHere, &gr.rViewLog); - - Services_ShowLog_TakeNextStep (hDlg, lpp); - break; - - case WM_DESTROY: - if (lpp->szLocal[0] != TEXT('\0')) - DeleteFile (lpp->szLocal); - GetWindowRect (hDlg, &gr.rViewLog); - SetWindowLong (hDlg, DWL_USER, 0); - Delete (lpp); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdShowLog, rwaFixupGuts); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) == NULL) - Services_ShowLog_TakeNextStep (hDlg, lpp); - else - { - Services_ShowLog_OnEndTask (hDlg, lpp, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_VIEWLOG_SAVEAS: - Services_ShowLog_OnSaveAs (hDlg, lpp); - break; - } - break; - - case WM_CTLCOLOREDIT: - if ((HWND)lp == GetDlgItem (hDlg, IDC_VIEWLOG_TEXT)) - { - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - } - break; - } - } - - return FALSE; -} - - -void Services_ShowLog_TakeNextStep (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp) -{ - if (lpp->szLocal[0] != TEXT('\0')) - { - Services_ShowLog_OnInitDialog (hDlg, lpp); - ShowWindow (hDlg, SW_SHOW); - } - else if (lpp->szRemote[0] != TEXT('\0')) - { - LPSVC_VIEWLOG_PACKET lppNew = New (SVC_VIEWLOG_PACKET); - *lppNew = *lpp; - lpp->nDownloadAttempts++; - StartTask (taskSVC_VIEWLOG, hDlg, lppNew); // downloads log file - } - else if (lpp->lpiService) - { - StartTask (taskSVC_FINDLOG, hDlg, lpp->lpiService); // guesses log name - } - else - { - if (!Services_ShowLog_Pick (hDlg, lpp)) - DestroyWindow (hDlg); - else - PostMessage (hDlg, WM_ENDTASK, 0, 0); // Services_ShowLog_TakeNextStep - } -} - - -void Services_ShowLog_OnEndTask (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp, LPTASKPACKET ptp) -{ - if (ptp->idTask == taskSVC_FINDLOG) // tried to guess log file name? - { - if (ptp->rc) - { - lstrcpy (lpp->szRemote, TASKDATA(ptp)->pszText1); - PostMessage (hDlg, WM_ENDTASK, 0, 0); // Services_ShowLog_TakeNextStep - } - else - { - if (!Services_ShowLog_Pick (hDlg, lpp)) - DestroyWindow (hDlg); - else - PostMessage (hDlg, WM_ENDTASK, 0, 0); // Services_ShowLog_TakeNextStep - } - } - else if (ptp->idTask == taskSVC_VIEWLOG) // tried to download log file? - { - if (ptp->rc) - { - lstrcpy (lpp->szLocal, TASKDATA(ptp)->pszText1); - PostMessage (hDlg, WM_ENDTASK, 0, 0); // Services_ShowLog_TakeNextStep - } - else - { - if (lpp->lpiService && lpp->nDownloadAttempts==1) - { - if (!Services_ShowLog_Pick (hDlg, lpp)) - DestroyWindow (hDlg); - else - PostMessage (hDlg, WM_ENDTASK, 0, 0); // Services_ShowLog_TakeNextStep - } - else - { - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_VIEW_LOGFILE, TEXT("%s%s"), szServer, lpp->szRemote); - DestroyWindow (hDlg); - } - } - } -} - - -void Services_ShowLog_OnInitDialog (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp) -{ - // If we're viewing the log file for a service, record the remote - // filename so the user won't ever have to enter it again. - // - if (lpp->lpiService) - { - LPSERVICE_PREF lpcp; - if ((lpcp = (LPSERVICE_PREF)lpp->lpiService->GetUserParam()) != NULL) - { - lstrcpy (lpcp->szLogFile, lpp->szRemote); - Services_SavePreferences (lpp->lpiService); - } - } - - // Prepare the ShowLog dialog's static text controls - // - LPTSTR psz; - if (lpp->lpiService) - { - TCHAR szServer[ cchNAME ]; - TCHAR szService[ cchNAME ]; - lpp->lpiService->GetServerName (szServer); - lpp->lpiService->GetServiceName (szService); - psz = FormatString (IDS_VIEWLOG_FROMSERVICE, TEXT("%s%s"), szServer, szService); - } - else - { - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - psz = FormatString (IDS_VIEWLOG_FROMSERVER, TEXT("%s"), szServer); - } - SetDlgItemText (hDlg, IDC_SVC_VIEWLOG_DESC, psz); - FreeString (psz); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SVC_VIEWLOG_FILENAME, szText, cchRESOURCE); - psz = FormatString (szText, TEXT("%s"), lpp->szRemote); - SetDlgItemText (hDlg, IDC_SVC_VIEWLOG_FILENAME, psz); - FreeString (psz); - - // Read the log file into memory, and chunk its text into the - // edit control on the dialog. If the file is over cchMAXLOG chars - // long, only read cchMAXLOG bytes from the end (make sure we start - // the read after a carriage return). - // - HANDLE hFile = CreateFile (lpp->szLocal, GENERIC_READ, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile != INVALID_HANDLE_VALUE) - { - BOOL fTruncated = FALSE; - DWORD dwSize = GetFileSize (hFile, NULL); - if (dwSize > cchMAXLOG) - { - // find the first \r\n within the final cchMAXLOG chars of the file - // - SetFilePointer (hFile, 0-cchMAXLOG, NULL, FILE_END); - - TCHAR ch; - DWORD cbRead; - while (ReadFile (hFile, &ch, 1, &cbRead, NULL) && cbRead) - { - if (ch == TEXT('\n')) - break; - } - - dwSize -= SetFilePointer (hFile, 0, 0, FILE_CURRENT); - fTruncated = TRUE; - } - - LPTSTR pszLog; - if ((pszLog = AllocateString (dwSize)) != NULL) - { - DWORD cbRead; - (void)ReadFile (hFile, pszLog, dwSize, &cbRead, NULL); - pszLog[ cbRead ] = TEXT('\0'); - - size_t cch = cbRead; - while ( cch && - (pszLog[ cch-1 ] == TEXT('\r')) || - (pszLog[ cch-1 ] == TEXT('\n')) ) - { - pszLog[ --cch ] = TEXT('\0'); - } - - SetFocus (GetDlgItem (hDlg, IDC_VIEWLOG_TEXT)); - SetDlgItemText (hDlg, IDC_VIEWLOG_TEXT, pszLog); - SendDlgItemMessage (hDlg, IDC_VIEWLOG_TEXT, EM_LINESCROLL, 0, 0xFFFF); - SendDlgItemMessage (hDlg, IDC_VIEWLOG_TEXT, EM_SETSEL, (WPARAM)-1, 0); - - if (fTruncated) - { - size_t nLines = 1; - for (size_t ich = 0; ich < dwSize; ++ich) - { - if (pszLog[ich] == TEXT('\n')) - ++nLines; - } - - psz = FormatString (IDS_VIEWLOG_TRUNCATED, TEXT("%lu"), nLines); - SetDlgItemText (hDlg, IDC_SVC_VIEWLOG_CONTENTS, psz); - FreeString (psz); - } - - FreeString (pszLog); - } - - CloseHandle (hFile); - } -} - - -void Services_ShowLog_OnSaveAs (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp) -{ - TCHAR szFilter[ cchRESOURCE ]; - GetString (szFilter, IDS_SAVELOG_FILTER); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - TCHAR szSaveAs[ MAX_PATH ] = TEXT(""); - - OPENFILENAME sfn; - memset (&sfn, 0x00, sizeof(sfn)); - sfn.lStructSize = sizeof(sfn); - sfn.hwndOwner = hDlg; - sfn.hInstance = THIS_HINST; - sfn.lpstrFilter = szFilter; - sfn.nFilterIndex = 1; - sfn.lpstrFile = szSaveAs; - sfn.nMaxFile = MAX_PATH; - sfn.Flags = OFN_HIDEREADONLY | OFN_NOREADONLYRETURN | - OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; - sfn.lpstrDefExt = TEXT("txt"); - - if (GetSaveFileName (&sfn)) - { - TCHAR szzSource[ MAX_PATH+1 ]; - lstrcpy (szzSource, lpp->szLocal); - szzSource[ lstrlen(szzSource)+1 ] = TEXT('\0'); - - TCHAR szzTarget[ MAX_PATH+1 ]; - lstrcpy (szzTarget, szSaveAs); - szzTarget[ lstrlen(szzTarget)+1 ] = TEXT('\0'); - - SHFILEOPSTRUCT op; - memset (&op, 0x00, sizeof(op)); - op.hwnd = hDlg; - op.wFunc = FO_COPY; - op.pFrom = szzSource; - op.pTo = szzTarget; - op.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; - SHFileOperation (&op); - } -} - - -BOOL Services_ShowLog_Pick (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp) -{ - if (ModalDialogParam (IDD_SVC_LOGNAME, NULL, (DLGPROC)Services_PickLog_DlgProc, (LPARAM)lpp) != IDOK) - { - return FALSE; - } - - if (lpp->szRemote[0] == TEXT('\0')) - { - return FALSE; - } - - return TRUE; -} - - -BOOL CALLBACK Services_PickLog_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVC_LOGNAME, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSVC_VIEWLOG_PACKET lpp; - if ((lpp = (LPSVC_VIEWLOG_PACKET)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - Services_PickLog_OnInitDialog (hDlg, lpp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - GetDlgItemText (hDlg, IDC_VIEWLOG_FILENAME, lpp->szRemote, MAX_PATH); - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - EnableWindow (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER), TRUE); - FreeTaskPacket (ptp); - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER))) - { - LPIDENT lpi; - if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER))) != NULL) - lpp->lpiServer = lpi; - } - break; - } - break; - } - } - - return FALSE; -} - - -void Services_PickLog_OnInitDialog (HWND hDlg, LPSVC_VIEWLOG_PACKET lpp) -{ - SetDlgItemText (hDlg, IDC_VIEWLOG_FILENAME, lpp->szRemote); - EnableWindow (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER), FALSE); - - if (lpp->lpiService) - { - TCHAR szServer[ cchNAME ]; - TCHAR szService[ cchNAME ]; - lpp->lpiService->GetServerName (szServer); - lpp->lpiService->GetServiceName (szService); - - LPTSTR pszText = FormatString (IDS_VIEWLOG_DESC_NOFILE, TEXT("%s%s"), szServer, szService); - SetDlgItemText (hDlg, IDC_VIEWLOG_DESC, pszText); - FreeString (pszText); - - CB_StartChange (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER), TRUE); - CB_AddItem (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER), szServer, (LPARAM)(lpp->lpiServer)); - CB_EndChange (GetDlgItem (hDlg, IDC_VIEWLOG_SERVER), (LPARAM)(lpp->lpiServer)); - } - else - { - LPSVR_ENUM_TO_COMBOBOX_PACKET lpEnum = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lpEnum->hCombo = GetDlgItem (hDlg, IDC_VIEWLOG_SERVER); - lpEnum->lpiSelect = lpp->lpiServer; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpEnum); - } - - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_VIEWLOG_FILENAME), TRUE); -} - diff --git a/src/WINNT/afssvrmgr/svc_viewlog.h b/src/WINNT/afssvrmgr/svc_viewlog.h deleted file mode 100644 index 8c48fe43f..000000000 --- a/src/WINNT/afssvrmgr/svc_viewlog.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVC_VIEWLOG_H -#define SVC_VIEWLOG_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - BOOL fTriedDownload; - LPIDENT lpiService; - LPIDENT lpiServer; - TCHAR szRemote[ MAX_PATH ]; - TCHAR szLocal[ MAX_PATH ]; - size_t nDownloadAttempts; - } SVC_VIEWLOG_PACKET, *LPSVC_VIEWLOG_PACKET; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Services_ShowServiceLog (LPIDENT lpi = NULL); -void Services_ShowServerLog (LPIDENT lpiServer, LPTSTR pszFilename = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_address.cpp b/src/WINNT/afssvrmgr/svr_address.cpp deleted file mode 100644 index 792556d59..000000000 --- a/src/WINNT/afssvrmgr/svr_address.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_address.h" -#include - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp); -void ChangeAddr_Enable (HWND hDlg, BOOL fEnable); -void ChangeAddr_OnSelect (HWND hDlg); -void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp); -void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp); -void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp); - -BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr); -void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr); - - -/* - * SERVER ADDRESSES ___________________________________________________________ - * - */ - -void Server_FillAddrList (HWND hDlg, LPSERVERSTATUS lpss, BOOL fCanAddUnspecified) -{ - HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES); - - LB_StartChange (hList, TRUE); - - if (!lpss || !lpss->nAddresses) - { - if (fCanAddUnspecified) - (void)LB_AddItem (hList, IDS_SVR_NO_ADDR, (LPARAM)-1); - } - else for (size_t iAddr = 0; iAddr < lpss->nAddresses; ++iAddr) - { - int AddrInt; - AfsClass_AddressToInt (&AddrInt, &lpss->aAddresses[ iAddr ]); - if (AddrInt == 0) - continue; - - LPTSTR pszAddress = FormatString (TEXT("%1"), TEXT("%a"), &lpss->aAddresses[ iAddr ]); - (void)LB_AddItem (hList, pszAddress, (LPARAM)iAddr); - FreeString (pszAddress); - } - - LB_EndChange (hList, 0); -} - - -void Server_ParseAddress (LPSOCKADDR_IN pAddr, LPTSTR pszText) -{ - int addrNetwork = inet_addr (pszText); - - memset (pAddr, 0x00, sizeof(SOCKADDR_IN)); - pAddr->sin_family = AF_INET; - pAddr->sin_addr.s_addr = addrNetwork; -} - - -BOOL Server_Ping (LPSOCKADDR_IN pAddr, LPCTSTR pszServerName) -{ - BOOL rc = FALSE; - - try { - struct hostent *phe; - if ((phe = gethostbyname (pszServerName)) == NULL) - memset (pAddr, 0x00, sizeof(SOCKADDR_IN)); - else - { - memset (pAddr, 0x00, sizeof(SOCKADDR_IN)); - pAddr->sin_family = 2; - pAddr->sin_port = 0; - pAddr->sin_addr.s_addr = *(ULONG *)phe->h_addr; - rc = TRUE; - } - } - catch (...) - { - memset (pAddr, 0x00, sizeof(SOCKADDR_IN)); - } - - return rc; -} - - -BOOL CALLBACK ChangeAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_ADDRESS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSVR_CHANGEADDR_PARAMS lpp; - if ((lpp = (LPSVR_CHANGEADDR_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - ChangeAddr_OnInitDialog (hDlg, lpp); - StartTask (taskSVR_PROP_INIT, hDlg, lpp->lpiServer); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_PROP_INIT) - ChangeAddr_OnEndTask_Init (hDlg, lpp, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_SVR_ADDRESSES: - if (HIWORD(wp) == LBN_SELCHANGE) - ChangeAddr_OnSelect (hDlg); - break; - - case IDC_ADDR_CHANGE: - ChangeAddr_OnChange (hDlg, lpp); - break; - - case IDC_ADDR_REMOVE: - ChangeAddr_OnRemove (hDlg, lpp); - break; - - case IDOK: - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - } - break; - } - } - - return FALSE; -} - - -void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp) -{ - TCHAR szName[ cchNAME ]; - lpp->lpiServer->GetServerName (szName); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE); - - LPTSTR pszTitle = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_TITLE, pszTitle); - FreeString (pszTitle); - - HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES); - LB_StartChange (hList, TRUE); - LB_AddItem (hList, IDS_QUERYING, 0); - LB_EndChange (hList, 0); - - ChangeAddr_Enable (hDlg, FALSE); -} - - -void ChangeAddr_Enable (HWND hDlg, BOOL fEnable) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fEnable); - - if (fEnable) - ChangeAddr_OnSelect (hDlg); -} - - -void ChangeAddr_OnSelect (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES); - BOOL fSelected = (LB_GetSelected (hList) != -1) ? TRUE : FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fSelected); - EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fSelected); -} - - -void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - TCHAR szName[ cchNAME ]; - lpp->lpiServer->GetServerName (szName); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVER_STATUS, TEXT("%s"), szName); - } - else - { - memcpy (&lpp->ssOld, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS)); - memcpy (&lpp->ssNew, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS)); - ChangeAddr_Enable (hDlg, TRUE); - } - - Server_FillAddrList (hDlg, &lpp->ssNew, FALSE); -} - - -void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES); - - int iSel; - if ((iSel = LB_GetSelected (hList)) != -1) - { - TCHAR szItem[ cchRESOURCE ] = TEXT(""); - SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem); - - SOCKADDR_IN AddrSel; - Server_ParseAddress (&AddrSel, szItem); - - int AddrSelInt; - AfsClass_AddressToInt (&AddrSelInt, &AddrSel); - - if (AddrSelInt != 0) - { - for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr) - { - int OldAddrInt; - AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]); - - int NewAddrInt; - AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]); - - if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt)) - { - AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], 0); - } - } - } - - Server_FillAddrList (hDlg, &lpp->ssNew, FALSE); - ChangeAddr_OnSelect (hDlg); - } -} - - -void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES); - - int iSel; - if ((iSel = LB_GetSelected (hList)) != -1) - { - TCHAR szItem[ cchRESOURCE ] = TEXT(""); - SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem); - - SOCKADDR_IN AddrSel; - Server_ParseAddress (&AddrSel, szItem); - - int AddrSelInt; - AfsClass_AddressToInt (&AddrSelInt, &AddrSel); - - if (AddrSelInt != 0) - { - SOCKADDR_IN AddrNew = AddrSel; - if (ModalDialogParam (IDD_SVR_NEWADDR, hDlg, (DLGPROC)NewAddr_DlgProc, (LPARAM)&AddrNew) != IDOK) - return; - - int AddrNewInt; - AfsClass_AddressToInt (&AddrNewInt, &AddrNew); - if (AddrNewInt && (AddrNewInt != AddrSelInt)) - { - - // First see if the new IP address is already in the server's - // list of IP addresses--if so, just delete the old address. - // - for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr) - { - int OldAddrInt; - AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]); - - int NewAddrInt; - AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]); - - if ((OldAddrInt == AddrNewInt) || (NewAddrInt == AddrNewInt)) - { - AddrNewInt = 0; - break; - } - } - - // Now update the SERVERSTATUS structure. - // - for (iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr) - { - int OldAddrInt; - AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]); - - int NewAddrInt; - AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]); - - if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt)) - { - AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], AddrNewInt); - break; - } - } - } - } - - Server_FillAddrList (hDlg, &lpp->ssNew, FALSE); - ChangeAddr_OnSelect (hDlg); - } -} - - -BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_NEWADDR, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSOCKADDR_IN pAddr; - if ((pAddr = (LPSOCKADDR_IN)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - NewAddr_OnInitDialog (hDlg, pAddr); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - NewAddr_OnOK (hDlg, pAddr); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - } - break; - } - } - - return FALSE; -} - - -void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr) -{ - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE); - - LPTSTR pszTitle = FormatString (szText, TEXT("%a"), pAddr); - SetDlgItemText (hDlg, IDC_TITLE, pszTitle); - FreeString (pszTitle); - - SA_SetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr); -} - - -void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr) -{ - SA_GetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr); -} - diff --git a/src/WINNT/afssvrmgr/svr_address.h b/src/WINNT/afssvrmgr/svr_address.h deleted file mode 100644 index 841cd4b3f..000000000 --- a/src/WINNT/afssvrmgr/svr_address.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_ADDRESS_H -#define SVR_ADDRESS_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - SERVERSTATUS ssOld; - SERVERSTATUS ssNew; - } SVR_CHANGEADDR_PARAMS, *LPSVR_CHANGEADDR_PARAMS; - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_FillAddrList (HWND hDlg, LPSERVERSTATUS lpss, BOOL fCanAddUnspecified = TRUE); - -void Server_ParseAddress (LPSOCKADDR_IN pAddr, LPTSTR pszText); - -BOOL Server_Ping (LPSOCKADDR_IN pAddr, LPCTSTR pszServerName); - -BOOL CALLBACK ChangeAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_col.cpp b/src/WINNT/afssvrmgr/svr_col.cpp deleted file mode 100644 index 40d0fb091..000000000 --- a/src/WINNT/afssvrmgr/svr_col.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_col.h" - - -/* - * SERVER-VIEW COLUMNS ________________________________________________________ - * - */ - -void Server_SetDefaultView_Horz (LPVIEWINFO lpviHorz) -{ - lpviHorz->lvsView = FLS_VIEW_LIST; - lpviHorz->nColsAvail = nSERVERCOLUMNS; - - for (size_t iCol = 0; iCol < nSERVERCOLUMNS; ++iCol) - { - lpviHorz->cxColumns[ iCol ] = SERVERCOLUMNS[ iCol ].cxWidth; - lpviHorz->idsColumns[ iCol ] = SERVERCOLUMNS[ iCol ].idsColumn; - } - - lpviHorz->iSort = svrcolNAME; - - lpviHorz->nColsShown = 3; - lpviHorz->aColumns[0] = (int)svrcolNAME; - lpviHorz->aColumns[1] = (int)svrcolADDRESS; - lpviHorz->aColumns[2] = (int)svrcolSTATUS; -} - - -void Server_SetDefaultView_Vert (LPVIEWINFO lpviVert) -{ - lpviVert->lvsView = FLS_VIEW_LARGE; - lpviVert->nColsAvail = nSERVERCOLUMNS; - - for (size_t iCol = 0; iCol < nSERVERCOLUMNS; ++iCol) - { - lpviVert->cxColumns[ iCol ] = SERVERCOLUMNS[ iCol ].cxWidth; - lpviVert->idsColumns[ iCol ] = SERVERCOLUMNS[ iCol ].idsColumn; - } - - lpviVert->iSort = svrcolNAME; - - lpviVert->nColsShown = 3; - lpviVert->aColumns[0] = (int)svrcolNAME; - lpviVert->aColumns[1] = (int)svrcolADDRESS; - lpviVert->aColumns[2] = (int)svrcolSTATUS; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -size_t Server_GetAlertCount (LPSERVER lpServer) -{ - return Alert_GetCount (lpServer->GetIdentifier()); -} - - -LPTSTR Server_GetColumnText (LPIDENT lpi, SERVERCOLUMN svrcol) -{ - static TCHAR aszBuffer[ nSERVERCOLUMNS ][ cchRESOURCE ]; - static size_t iBufferNext = 0; - LPTSTR pszBuffer = aszBuffer[ iBufferNext++ ]; - if (iBufferNext == nSERVERCOLUMNS) - iBufferNext = 0; - *pszBuffer = TEXT('\0'); - - LPSERVERSTATUS lpss = NULL; - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpi->GetUserParam()) != NULL) - { - lpss = &lpsp->ssLast; - } - - switch (svrcol) - { - case svrcolNAME: - lpi->GetServerName (pszBuffer); - break; - - case svrcolADDRESS: - if (lpss) - FormatSockAddr (pszBuffer, TEXT("%a"), &lpss->aAddresses[0]); - break; - - case svrcolSTATUS: - { - LPTSTR pszDesc; - if ((pszDesc = Alert_GetQuickDescription (lpi)) == NULL) - GetString (pszBuffer, IDS_STATUS_NOALERTS); - else - { - lstrcpy (pszBuffer, pszDesc); - FreeString (pszDesc); - } - } - break; - } - - return pszBuffer; -} - diff --git a/src/WINNT/afssvrmgr/svr_col.h b/src/WINNT/afssvrmgr/svr_col.h deleted file mode 100644 index ad574eb48..000000000 --- a/src/WINNT/afssvrmgr/svr_col.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_COL_H -#define SVR_COL_H - - -/* - * SERVER-VIEW COLUMNS ________________________________________________________ - * - */ - -typedef enum - { - svrcolNAME, - svrcolADDRESS, - svrcolSTATUS, - } SERVERCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -SERVERCOLUMNS[] = - { - { IDS_SVRCOL_NAME, 150 }, // svrcolNAME - { IDS_SVRCOL_ADDRESS, 100 }, // svrcolADDRESS - { IDS_SVRCOL_STATUS, 400 }, // svrcolSTATUS - }; - -#define nSERVERCOLUMNS (sizeof(SERVERCOLUMNS)/sizeof(SERVERCOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_SetDefaultView_Horz (LPVIEWINFO lpviHorz); -void Server_SetDefaultView_Vert (LPVIEWINFO lpviVert); - -size_t Server_GetAlertCount (LPSERVER lpServer); -LPTSTR Server_GetColumnText (LPIDENT lpi, SERVERCOLUMN col); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_execute.cpp b/src/WINNT/afssvrmgr/svr_execute.cpp deleted file mode 100644 index 6615ee6ee..000000000 --- a/src/WINNT/afssvrmgr/svr_execute.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_execute.h" -#include "propcache.h" - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL WINAPI Server_Execute_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_Execute_OnInitDialog (HWND hDlg, LPSVR_EXECUTE_PARAMS lpp); -void Server_Execute_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_EXECUTE_PARAMS lpp); -void Server_Execute_EnableOK (HWND hDlg); -void Server_Execute_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Execute (LPIDENT lpiServer) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVR_EXECUTE, NULL)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSVR_EXECUTE_PARAMS lpp = New (SVR_EXECUTE_PARAMS); - lpp->lpiServer = lpiServer; - lpp->szCommand[0] = TEXT('\0'); - - HWND hDlg = ModelessDialogParam (IDD_SVR_EXECUTE, NULL, (DLGPROC)Server_Execute_DlgProc, (LPARAM)lpp); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL WINAPI Server_Execute_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_EXECUTE, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_EXECUTE_PARAMS lpp; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPSVR_EXECUTE_PARAMS)GetWindowLong(hDlg,DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_EXECUTE, NULL, hDlg); - Server_Execute_OnInitDialog (hDlg, lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Server_Execute_OnEndTask_InitDialog (hDlg, ptp, lpp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_Execute_OnOK (hDlg); - DestroyWindow (hDlg); - break; - - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_SERVER: - case IDC_COMMAND: - Server_Execute_EnableOK (hDlg); - break; - } - break; - - case WM_DESTROY: - Delete (lpp); - SetWindowLong (hDlg, DWL_USER, 0); - PropCache_Delete (pcSVR_EXECUTE, NULL); - break; - } - } - - return FALSE; -} - - -void Server_Execute_OnInitDialog (HWND hDlg, LPSVR_EXECUTE_PARAMS lpp) -{ - LPSVR_ENUM_TO_COMBOBOX_PACKET lppEnum = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lppEnum->hCombo = GetDlgItem (hDlg, IDC_SERVER); - lppEnum->lpiSelect = lpp->lpiServer; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lppEnum); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Server_Execute_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_EXECUTE_PARAMS lpp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE); - Server_Execute_EnableOK (hDlg); -} - - -void Server_Execute_EnableOK (HWND hDlg) -{ - LPIDENT lpiServer = NULL; - - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SERVER))) - lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - - BOOL fEnable = (lpiServer != NULL) ? TRUE : FALSE; - - if (fEnable) - { - TCHAR szCommand[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_COMMAND, szCommand, MAX_PATH); - if (szCommand[0] == TEXT('\0')) - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Server_Execute_OnOK (HWND hDlg) -{ - LPSVR_EXECUTE_PARAMS lpp = New (SVR_EXECUTE_PARAMS); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - GetDlgItemText (hDlg, IDC_COMMAND, lpp->szCommand, MAX_PATH); - - StartTask (taskSVR_EXECUTE, NULL, lpp); -} - diff --git a/src/WINNT/afssvrmgr/svr_execute.h b/src/WINNT/afssvrmgr/svr_execute.h deleted file mode 100644 index a200d2669..000000000 --- a/src/WINNT/afssvrmgr/svr_execute.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_EXECUTE_H -#define SVR_EXECUTE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - TCHAR szCommand[ MAX_PATH ]; - } SVR_EXECUTE_PARAMS, *LPSVR_EXECUTE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Execute (LPIDENT lpiServer = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_general.cpp b/src/WINNT/afssvrmgr/svr_general.cpp deleted file mode 100644 index 538034eec..000000000 --- a/src/WINNT/afssvrmgr/svr_general.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_general.h" -#include "propcache.h" -#include "display.h" - - -/* - * SERVER PREFERENCES _________________________________________________________ - * - */ - -PVOID Server_LoadPreferences (LPIDENT lpiServer) -{ - LPSERVER_PREF psp = New (SERVER_PREF); - - if (!RestorePreferences (lpiServer, psp, sizeof(SERVER_PREF))) - { - Alert_SetDefaults (&psp->oa); - - psp->perWarnAggFull = perDEFAULT_AGGFULL_WARNING; - psp->perWarnSetFull = perDEFAULT_SETFULL_WARNING; - psp->fWarnSvcStop = fDEFAULT_SVCSTOP_WARNING; - psp->fWarnSvrTimeout = TRUE; - psp->fWarnSetNoVLDB = TRUE; - psp->fWarnSetNoServ = TRUE; - psp->fWarnAggNoServ = TRUE; - psp->fWarnAggAlloc = FALSE; - - psp->rLast.right = 0; - psp->fOpen = FALSE; - psp->fExpandTree = TRUE; - } - - psp->fIsMonitored = TRUE; // until dispatch.cpp sets it otherwise - - Alert_Initialize (&psp->oa); - return psp; -} - - -BOOL Server_SavePreferences (LPIDENT lpiServer) -{ - BOOL rc = FALSE; - - PVOID psp = lpiServer->GetUserParam(); - if (psp != NULL) - { - rc = StorePreferences (lpiServer, psp, sizeof(SERVER_PREF)); - } - - return rc; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen) -{ - if (!ptScreen.x && !ptScreen.y) - { - RECT rWindow; - GetWindowRect (hList, &rWindow); - ptScreen.x = rWindow.left + (rWindow.right -rWindow.left)/2; - ptScreen.y = rWindow.top + (rWindow.bottom -rWindow.top)/2; - Server_ShowParticularPopupMenu (hList, ptScreen, NULL); - } - else if (FL_HitTestForHeaderBar (hList, ptList)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, ptScreen, hList); - } - else - { - LPIDENT lpiServer = NULL; - - HLISTITEM hItem; - if ((hItem = FastList_ItemFromPoint (hList, &ptList, TRUE)) != NULL) - lpiServer = (LPIDENT)FL_GetData (hList, hItem); - - if (lpiServer && (lpiServer != (LPIDENT)FL_GetSelectedData (hList))) - lpiServer = NULL; - - Server_ShowParticularPopupMenu (hList, ptScreen, lpiServer); - } -} - - -void Server_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiServer) -{ - HMENU hm; - - if (lpiServer == NULL) - hm = TaLocale_LoadMenu (MENU_SVR_NONE); - else - hm = TaLocale_LoadMenu (MENU_SVR); - - if (hm != NULL) - { - if (lpiServer == NULL) - { - int lvs = (gr.fPreview && !gr.fVert) ? gr.diHorz.viewSvr.lvsView : gr.diVert.viewSvr.lvsView; - HMENU hmView = GetSubMenu (hm, 0); - - CheckMenuRadioItem (hmView, - M_SVR_VIEW_LARGE, M_SVR_VIEW_REPORT, - ( (lvs == FLS_VIEW_SMALL) ? M_SVR_VIEW_SMALL : - (lvs == FLS_VIEW_LIST) ? M_SVR_VIEW_REPORT : - M_SVR_VIEW_LARGE ), - MF_BYCOMMAND); - - ICONVIEW ivSvr = Display_GetServerIconView(); - - CheckMenuRadioItem (hmView, - M_SVR_VIEW_ONEICON, M_SVR_VIEW_STATUS, - (ivSvr == ivTWOICONS) ? M_SVR_VIEW_TWOICONS : - (ivSvr == ivONEICON) ? M_SVR_VIEW_ONEICON : M_SVR_VIEW_STATUS, - MF_BYCOMMAND); - - if (lvs != FLS_VIEW_LIST) - { - EnableMenu (hmView, M_SVR_VIEW_ONEICON, FALSE); - EnableMenu (hmView, M_SVR_VIEW_TWOICONS, FALSE); - EnableMenu (hmView, M_SVR_VIEW_STATUS, FALSE); - } - - if (!PropCache_Search (pcSERVER, ANYVALUE)) - EnableMenu (hmView, M_SVR_CLOSEALL, FALSE); - } - else - { - BOOL fOpenNow = (BOOL)!!(PropCache_Search (pcSERVER, lpiServer)); - - LPSERVER_PREF lpsp; - if ( ((lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) == NULL) || - (lpsp->fIsMonitored) ) - { - EnableMenu (hm, M_SVR_OPEN, !fOpenNow); - EnableMenu (hm, M_SVR_CLOSE, fOpenNow); - CheckMenu (hm, M_SVR_MONITOR, TRUE); - } - else - { - if (!fOpenNow) - EnableMenu (hm, M_SVR_CLOSE, FALSE); - if (fOpenNow || !gr.fOpenMonitors) - EnableMenu (hm, M_SVR_OPEN, FALSE); - - CheckMenu (hm, M_SVR_MONITOR, FALSE); - - EnableMenu (hm, M_SVR_SECURITY, FALSE); - EnableMenu (hm, M_SALVAGE, FALSE); - EnableMenu (hm, M_SET_CLONE, FALSE); - EnableMenu (hm, M_SET_UNLOCK, FALSE); - EnableMenu (hm, M_SYNCVLDB, FALSE); - } - } - - DisplayContextMenu (hm, ptScreen, hParent); - } -} - diff --git a/src/WINNT/afssvrmgr/svr_general.h b/src/WINNT/afssvrmgr/svr_general.h deleted file mode 100644 index 3c7a3bbbd..000000000 --- a/src/WINNT/afssvrmgr/svr_general.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_GENERAL_H -#define SVR_GENERAL_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define perDEFAULT_AGGFULL_WARNING 90 -#define perDEFAULT_SETFULL_WARNING 75 - -#define fDEFAULT_SVCSTOP_WARNING TRUE - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen); -void Server_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiServer); - -PVOID Server_LoadPreferences (LPIDENT lpiServer); -BOOL Server_SavePreferences (LPIDENT lpiServer); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_getdates.cpp b/src/WINNT/afssvrmgr/svr_getdates.cpp deleted file mode 100644 index daaa0ec9d..000000000 --- a/src/WINNT/afssvrmgr/svr_getdates.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_getdates.h" -#include "propcache.h" - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL WINAPI Server_GetDates_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_GetDates_OnInitDialog (HWND hDlg, LPSVR_GETDATES_PARAMS lpp); -void Server_GetDates_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_GETDATES_PARAMS lpp); -void Server_GetDates_EnableOK (HWND hDlg); -void Server_GetDates_OnOK (HWND hDlg); - -BOOL WINAPI Server_GetDates_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_GetDates_Results_OnInitDialog (HWND hDlg, LPSVR_GETDATES_PARAMS lppIn); -void Server_GetDates_Results_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_GetDates (LPIDENT lpiServer) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVR_GETDATES, NULL)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSVR_GETDATES_PARAMS lpp = New (SVR_GETDATES_PARAMS); - lpp->lpiServer = lpiServer; - lpp->szFilename[0] = TEXT('\0'); - - HWND hDlg = ModelessDialogParam (IDD_SVR_GETDATES, NULL, (DLGPROC)Server_GetDates_DlgProc, (LPARAM)lpp); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL WINAPI Server_GetDates_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_GETDATES, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_GETDATES_PARAMS lpp; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPSVR_GETDATES_PARAMS)GetWindowLong(hDlg,DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_GETDATES, NULL, hDlg); - Server_GetDates_OnInitDialog (hDlg, lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Server_GetDates_OnEndTask_InitDialog (hDlg, ptp, lpp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_GetDates_OnOK (hDlg); - // fall through - - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_SERVER: - case IDC_FILENAME: - Server_GetDates_EnableOK (hDlg); - break; - } - break; - - case WM_DESTROY: - Delete (lpp); - SetWindowLong (hDlg, DWL_USER, 0); - PropCache_Delete (pcSVR_GETDATES, NULL); - break; - } - } - - return FALSE; -} - - -void Server_GetDates_OnInitDialog (HWND hDlg, LPSVR_GETDATES_PARAMS lpp) -{ - LPSVR_ENUM_TO_COMBOBOX_PACKET lppEnum = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lppEnum->hCombo = GetDlgItem (hDlg, IDC_SERVER); - lppEnum->lpiSelect = lpp->lpiServer; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lppEnum); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Server_GetDates_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_GETDATES_PARAMS lpp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE); - Server_GetDates_EnableOK (hDlg); -} - - -void Server_GetDates_EnableOK (HWND hDlg) -{ - LPIDENT lpiServer = NULL; - - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SERVER))) - lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - - BOOL fEnable = (lpiServer != NULL) ? TRUE : FALSE; - - if (fEnable) - { - TCHAR szName[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_FILENAME, szName, MAX_PATH); - if (szName[0] == TEXT('\0')) - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Server_GetDates_OnOK (HWND hDlg) -{ - LPSVR_GETDATES_PARAMS lpp = New (SVR_GETDATES_PARAMS); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - GetDlgItemText (hDlg, IDC_FILENAME, lpp->szFilename, MAX_PATH); - - ModelessDialogParam (IDD_SVR_GETDATES_RESULTS, NULL, (DLGPROC)Server_GetDates_Results_DlgProc, (LPARAM)lpp); -} - - -BOOL WINAPI Server_GetDates_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_GETDATES_RESULTS, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - Server_GetDates_Results_OnInitDialog (hDlg, (LPSVR_GETDATES_PARAMS)lp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_GETDATES) - Server_GetDates_Results_OnEndTask_InitDialog (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Server_GetDates_Results_OnInitDialog (HWND hDlg, LPSVR_GETDATES_PARAMS lppIn) -{ - LPSVR_GETDATES_PARAMS lpp = New (SVR_GETDATES_PARAMS); - memcpy (lpp, lppIn, sizeof(SVR_GETDATES_PARAMS)); - StartTask (taskSVR_GETDATES, hDlg, lpp); - - TCHAR szServer[ cchNAME ]; - lppIn->lpiServer->GetServerName (szServer); - SetDlgItemText (hDlg, IDC_SERVER, szServer); - - SetDlgItemText (hDlg, IDC_FILENAME, lppIn->szFilename); -} - - -void Server_GetDates_Results_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc && TASKDATA(ptp)->pszText1) - { - LPTSTR pszText = FormatString (IDS_LASTMODIFIED, TEXT("%s"), TASKDATA(ptp)->pszText1); - SetDlgItemText (hDlg, IDC_DATE_FILE, pszText); - FreeString (pszText); - } - if (ptp->rc && TASKDATA(ptp)->pszText2) - { - LPTSTR pszText = FormatString (IDS_LASTMODIFIED, TEXT("%s"), TASKDATA(ptp)->pszText2); - SetDlgItemText (hDlg, IDC_DATE_BAK, pszText); - FreeString (pszText); - } - if (ptp->rc && TASKDATA(ptp)->pszText3) - { - LPTSTR pszText = FormatString (IDS_LASTMODIFIED, TEXT("%s"), TASKDATA(ptp)->pszText3); - SetDlgItemText (hDlg, IDC_DATE_OLD, pszText); - FreeString (pszText); - } - - ShowWindow (hDlg, SW_SHOW); -} - diff --git a/src/WINNT/afssvrmgr/svr_getdates.h b/src/WINNT/afssvrmgr/svr_getdates.h deleted file mode 100644 index 46fae0670..000000000 --- a/src/WINNT/afssvrmgr/svr_getdates.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_GETDATES_H -#define SVR_GETDATES_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - TCHAR szFilename[ MAX_PATH ]; - } SVR_GETDATES_PARAMS, *LPSVR_GETDATES_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_GetDates (LPIDENT lpiServer = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_hosts.cpp b/src/WINNT/afssvrmgr/svr_hosts.cpp deleted file mode 100644 index 36e0c25d2..000000000 --- a/src/WINNT/afssvrmgr/svr_hosts.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_hosts.h" -#include "propcache.h" -#include "display.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - LPHOSTLIST lpList; - } SVR_HOSTS_PARAMS, *LPSVR_HOSTS_PARAMS; - -typedef struct - { - LPIDENT lpiServer; - TCHAR szHost[ cchNAME ]; - } SVR_ADDHOST_PARAMS, *LPSVR_ADDHOST_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Hosts_Free (LPSVR_HOSTS_PARAMS lpp); - -BOOL CALLBACK Server_Hosts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_Hosts_OnInitDialog (HWND hDlg, LPSVR_HOSTS_PARAMS lpp); -void Server_Hosts_OnEndTask_ListOpen (HWND hDlg, LPSVR_HOSTS_PARAMS lpp, LPTASKPACKET ptp); -void Server_Hosts_OnApply (HWND hDlg, LPSVR_HOSTS_PARAMS lpp); -void Server_Hosts_OnSelect (HWND hDlg, LPSVR_HOSTS_PARAMS lpp); -void Server_Hosts_OnAddEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp); -void Server_Hosts_OnDelEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp); - -BOOL CALLBACK Server_AddHost_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Server_AddHost_OnInitDialog (HWND hDlg, LPSVR_ADDHOST_PARAMS lpp); -void Server_AddHost_EnableOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Hosts (LPIDENT lpiServer) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSVR_HOSTS, lpiServer)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSVR_HOSTS_PARAMS lpp = New (SVR_HOSTS_PARAMS); - memset (lpp, 0x00, sizeof(SVR_HOSTS_PARAMS)); - lpp->lpiServer = lpiServer; - - TCHAR szServer[ cchNAME ]; - lpiServer->GetServerName (szServer); - LPTSTR pszTitle = FormatString (IDS_SVR_HOSTS_TITLE, TEXT("%s"), szServer); - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - PropSheet_AddTab (psh, IDS_SVR_HOST_TAB, IDD_SVR_HOSTS, (DLGPROC)Server_Hosts_DlgProc, (LONG)lpp, TRUE); - PropSheet_ShowModeless (psh); - FreeString (pszTitle); - } -} - - -void Server_Hosts_Free (LPSVR_HOSTS_PARAMS lpp) -{ - if (lpp->lpList) - AfsClass_HostList_Free (lpp->lpList); - Delete (lpp); -} - - -BOOL CALLBACK Server_Hosts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_HOSTS, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_HOSTS_PARAMS lpp; - if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET)) - lpp = (LPSVR_HOSTS_PARAMS)lp; - else - lpp = (LPSVR_HOSTS_PARAMS)PropSheet_FindTabParam (hDlg); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcSVR_HOSTS, lpp->lpiServer, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Server_Hosts_OnInitDialog (hDlg, lpp); - break; - - case WM_DESTROY: - Server_Hosts_Free (lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_HOSTLIST_OPEN) - Server_Hosts_OnEndTask_ListOpen (hDlg, lpp, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Server_Hosts_OnApply (hDlg, lpp); - break; - - case IDC_HOST_ADD: - Server_Hosts_OnAddEntry (hDlg, lpp); - PropSheetChanged (hDlg); - break; - - case IDC_HOST_REMOVE: - Server_Hosts_OnDelEntry (hDlg, lpp); - PropSheetChanged (hDlg); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_HOST_LIST)) - { - Server_Hosts_OnSelect (hDlg, lpp); - } - break; - } - break; - } - - return FALSE; -} - - -void Server_Hosts_OnInitDialog (HWND hDlg, LPSVR_HOSTS_PARAMS lpp) -{ - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - - LPTSTR pszText = FormatString (IDS_HOST_TITLE, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_HOST_TITLE, pszText); - FreeString (pszText); - - HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST); - - // We'll need an imagelist, if we want icons in the list. - // - HIMAGELIST hLarge; - if ((hLarge = ImageList_Create (32, 32, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0) - AfsAppLib_AddToImageList (hLarge, IDI_SERVER, TRUE); - - HIMAGELIST hSmall; - if ((hSmall = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0) - AfsAppLib_AddToImageList (hSmall, IDI_SERVER, FALSE); - - FastList_SetImageLists (hList, hSmall, hLarge); - - // Start loading the host list - // - StartTask (taskSVR_HOSTLIST_OPEN, hDlg, lpp->lpiServer); - - EnableWindow (hList, FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_HOST_ADD), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_HOST_REMOVE), FALSE); -} - - -void Server_Hosts_OnEndTask_ListOpen (HWND hDlg, LPSVR_HOSTS_PARAMS lpp, LPTASKPACKET ptp) -{ - HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST); - - lpp->lpList = TASKDATA(ptp)->lpHostList; - - // Populate the list - // - FL_StartChange (hList, TRUE); - - if (lpp->lpList) - { - for (size_t iEntry = 0; iEntry < lpp->lpList->cEntries; ++iEntry) - { - LPHOSTLISTENTRY pEntry = &lpp->lpList->aEntries[ iEntry ]; - if (pEntry->szHost[0] == TEXT('\0')) - continue; - - FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pEntry->szHost); - } - } - - FL_EndChange (hList, 0); - EnableWindow (hList, (lpp->lpList != NULL)); - EnableWindow (GetDlgItem (hDlg, IDC_HOST_ADD), (lpp->lpList != NULL)); - - Server_Hosts_OnSelect (hDlg, lpp); -} - - -void Server_Hosts_OnSelect (HWND hDlg, LPSVR_HOSTS_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST); - - BOOL fEnableRemove = TRUE; - - if (!IsWindowEnabled (hList)) - fEnableRemove = FALSE; - - if (FastList_FindFirstSelected (hList) == NULL) - fEnableRemove = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_HOST_REMOVE), fEnableRemove); -} - - -void Server_Hosts_OnApply (HWND hDlg, LPSVR_HOSTS_PARAMS lpp) -{ - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_HOST_LIST))) - { - // Increment the reference counter on this host list before handing - // it off to the Save task. When the Save task is done, it will attempt - // to free the list--which will decrement the counter again, and - // actually free the list if the counter hits zero. - // - InterlockedIncrement (&lpp->lpList->cRef); - StartTask (taskSVR_HOSTLIST_SAVE, NULL, lpp->lpList); - } -} - - -void Server_Hosts_OnAddEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp) -{ - LPSVR_ADDHOST_PARAMS pAdd = New (SVR_ADDHOST_PARAMS); - memset (pAdd, 0x00, sizeof(pAdd)); - pAdd->lpiServer = lpp->lpiServer; - - if (ModalDialogParam (IDD_SVR_ADDHOST, hDlg, (DLGPROC)Server_AddHost_DlgProc, (LPARAM)pAdd) == IDOK) - { - for (size_t iEntry = 0; iEntry < lpp->lpList->cEntries; ++iEntry) - { - LPHOSTLISTENTRY pEntry = &lpp->lpList->aEntries[ iEntry ]; - if (pEntry->szHost[0] == TEXT('\0')) - continue; - if (!lstrcmpi (pEntry->szHost, pAdd->szHost)) - break; - } - - if (iEntry >= lpp->lpList->cEntries) - { - iEntry = AfsClass_HostList_AddEntry (lpp->lpList, pAdd->szHost); - } - - HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST); - FL_StartChange (hList, FALSE); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)iEntry)) == NULL) - { - hItem = FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pAdd->szHost); - } - - FL_EndChange (hList, (LPARAM)hItem); - } - - Delete (pAdd); -} - - -void Server_Hosts_OnDelEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST); - FL_StartChange (hList, FALSE); - - HLISTITEM hItem; - while ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - size_t iEntry = (size_t)FL_GetData (hList, hItem); - AfsClass_HostList_DelEntry (lpp->lpList, iEntry); - FastList_RemoveItem (hList, hItem); - } - - FL_EndChange (hList); -} - - -BOOL CALLBACK Server_AddHost_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_ADDHOST, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPSVR_ADDHOST_PARAMS lpp; - if ((lpp = (LPSVR_ADDHOST_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - Server_AddHost_OnInitDialog (hDlg, lpp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - GetDlgItemText (hDlg, IDC_ADDHOST_HOST, lpp->szHost, cchNAME); - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_ADDHOST_HOST: - Server_AddHost_EnableOK (hDlg); - break; - } - break; - } - } - - return FALSE; -} - - -void Server_AddHost_OnInitDialog (HWND hDlg, LPSVR_ADDHOST_PARAMS lpp) -{ - TCHAR szDesc[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_ADDHOST_DESC, szDesc, cchRESOURCE); - - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - - LPTSTR pszDesc = FormatString (szDesc, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_ADDHOST_DESC, pszDesc); - FreeString (pszDesc); - - Server_AddHost_EnableOK (hDlg); -} - - -void Server_AddHost_EnableOK (HWND hDlg) -{ - TCHAR szHost[ cchNAME ]; - GetDlgItemText (hDlg, IDC_ADDHOST_HOST, szHost, cchNAME); - - EnableWindow (GetDlgItem (hDlg, IDOK), (szHost[0] != TEXT('\0')) ? TRUE : FALSE); -} - diff --git a/src/WINNT/afssvrmgr/svr_hosts.h b/src/WINNT/afssvrmgr/svr_hosts.h deleted file mode 100644 index 140c85e73..000000000 --- a/src/WINNT/afssvrmgr/svr_hosts.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_HOSTS_H -#define SVR_HOSTS_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Hosts (LPIDENT lpiServer); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_install.cpp b/src/WINNT/afssvrmgr/svr_install.cpp deleted file mode 100644 index 385dcb3fa..000000000 --- a/src/WINNT/afssvrmgr/svr_install.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_install.h" -#include "propcache.h" - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL WINAPI Server_Install_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_Install_OnInitDialog (HWND hDlg, LPSVR_INSTALL_PARAMS lpp); -void Server_Install_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_INSTALL_PARAMS lpp); -void Server_Install_OnBrowse (HWND hDlg); -void Server_Install_EnableOK (HWND hDlg); -void Server_Install_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Install (LPIDENT lpiServer) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVR_INSTALL, NULL)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSVR_INSTALL_PARAMS lpp = New (SVR_INSTALL_PARAMS); - lpp->lpiServer = lpiServer; - lpp->szSource[0] = TEXT('\0'); - lpp->szTarget[0] = TEXT('\0'); - - HWND hDlg = ModelessDialogParam (IDD_SVR_INSTALL, NULL, (DLGPROC)Server_Install_DlgProc, (LPARAM)lpp); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL WINAPI Server_Install_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_INSTALL, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_INSTALL_PARAMS lpp; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPSVR_INSTALL_PARAMS)GetWindowLong(hDlg,DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_INSTALL, NULL, hDlg); - Server_Install_OnInitDialog (hDlg, lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Server_Install_OnEndTask_InitDialog (hDlg, ptp, lpp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_Install_OnOK (hDlg); - // fall through - - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_BROWSE: - Server_Install_OnBrowse (hDlg); - break; - - case IDC_FILENAME: - case IDC_DIRECTORY: - case IDC_SERVER: - Server_Install_EnableOK (hDlg); - break; - } - break; - - case WM_DESTROY: - SetWindowLong (hDlg, DWL_USER, 0); - PropCache_Delete (pcSVR_INSTALL, NULL); - Delete (lpp); - break; - } - } - - return FALSE; -} - - -void Server_Install_OnInitDialog (HWND hDlg, LPSVR_INSTALL_PARAMS lpp) -{ - LPTSTR pszText = FormatString (IDS_INSTALL_DESC1); - SetDlgItemText (hDlg, IDC_INSTALL_DESC, pszText); - FreeString (pszText); - - LPSVR_ENUM_TO_COMBOBOX_PACKET lppEnum = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lppEnum->hCombo = GetDlgItem (hDlg, IDC_SERVER); - lppEnum->lpiSelect = lpp->lpiServer; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lppEnum); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Server_Install_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_INSTALL_PARAMS lpp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE); - Server_Install_EnableOK (hDlg); -} - - -void Server_Install_EnableOK (HWND hDlg) -{ - LPIDENT lpiServer = NULL; - - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SERVER))) - lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - - BOOL fEnable = (lpiServer != NULL) ? TRUE : FALSE; - - if (fEnable) - { - TCHAR szName[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_FILENAME, szName, MAX_PATH); - if (szName[0] == TEXT('\0')) - fEnable = FALSE; - } - - if (fEnable) - { - TCHAR szName[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_DIRECTORY, szName, MAX_PATH); - if (szName[0] == TEXT('\0')) - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Server_Install_OnOK (HWND hDlg) -{ - LPSVR_INSTALL_PARAMS lpp = New (SVR_INSTALL_PARAMS); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - GetDlgItemText (hDlg, IDC_FILENAME, lpp->szSource, MAX_PATH); - GetDlgItemText (hDlg, IDC_DIRECTORY, lpp->szTarget, MAX_PATH); - - StartTask (taskSVR_INSTALL, NULL, lpp); -} - - -void Server_Install_OnBrowse (HWND hDlg) -{ - TCHAR szFilter[ cchRESOURCE ]; - GetString (szFilter, IDS_FILTER_ALLFILES); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - TCHAR szFilename[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_FILENAME, szFilename, MAX_PATH); - - OPENFILENAME ofn; - memset (&ofn, 0x00, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hDlg; - ofn.hInstance = THIS_HINST; - ofn.lpstrFilter = szFilter; - ofn.nFilterIndex = 1; - ofn.lpstrFile = szFilename; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - - TCHAR szPath[ MAX_PATH ]; - GetCurrentDirectory (MAX_PATH, szPath); - - BOOL rc = GetOpenFileName (&ofn); - - SetCurrentDirectory (szPath); - - if (rc) - SetDlgItemText (hDlg, IDC_FILENAME, szFilename); -} - diff --git a/src/WINNT/afssvrmgr/svr_install.h b/src/WINNT/afssvrmgr/svr_install.h deleted file mode 100644 index 0196cc147..000000000 --- a/src/WINNT/afssvrmgr/svr_install.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_INSTALL_H -#define SVR_INSTALL_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - TCHAR szSource[ MAX_PATH ]; - TCHAR szTarget[ MAX_PATH ]; - } SVR_INSTALL_PARAMS, *LPSVR_INSTALL_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Install (LPIDENT lpiServer = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_prop.cpp b/src/WINNT/afssvrmgr/svr_prop.cpp deleted file mode 100644 index 429758b46..000000000 --- a/src/WINNT/afssvrmgr/svr_prop.cpp +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_prop.h" -#include "svr_address.h" -#include "svr_general.h" -#include "problems.h" -#include "propcache.h" - - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Server_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK Server_Scout_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_General_OnInitDialog (HWND hDlg, LPIDENT lpiServer); -void Server_General_OnEndTask_InitDialog (HWND hDlg, LPIDENT lpiServer, LPTASKPACKET ptp); -void Server_General_OnAuth (HWND hDlg, LPIDENT lpiServer, BOOL fEnableAuth); -void Server_General_OnChangeAddr (HWND hDlg, LPIDENT lpiServer); - -void Server_Scout_OnInitDialog (HWND hDlg, LPIDENT lpiServer); -void Server_Scout_OnApply (HWND hDlg, LPIDENT lpiServer); -void Server_Scout_OnAggWarn (HWND hDlg, LPIDENT lpiServer); -void Server_Scout_OnSetWarn (HWND hDlg, LPIDENT lpiServer); -void Server_Scout_OnAutoRefresh (HWND hDlg, LPIDENT lpiServer); -void Server_Scout_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp); -void Server_Scout_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_ShowProperties (LPIDENT lpiServer, size_t nAlerts) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVR_PROP, lpiServer)) != NULL) - { - SetFocus (hCurrent); - } - else - { - TCHAR szName[ cchNAME ]; - lpiServer->GetServerName (szName); - LPTSTR pszTitle = FormatString (IDS_SVR_PROP_TITLE, TEXT("%s"), szName); - - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - psh->fMadeCaption = TRUE; - - if ( (PropSheet_AddProblemsTab (psh, IDD_SVR_PROBLEMS, lpiServer, nAlerts)) && - (PropSheet_AddTab (psh, IDS_SVR_GENERAL_TAB, IDD_SVR_GENERAL, (DLGPROC)Server_General_DlgProc, (LPARAM)lpiServer, TRUE)) && - (PropSheet_AddTab (psh, IDS_SVR_SCOUT_TAB, IDD_SVR_SCOUT, (DLGPROC)Server_Scout_DlgProc, (LPARAM)lpiServer, TRUE)) ) - { - PropSheet_ShowModeless (psh); - } - } -} - - -BOOL CALLBACK Server_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpiServer = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - PropCache_Add (pcSVR_PROP, (LPIDENT)lp, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - break; - - case WM_INITDIALOG: - Server_General_OnInitDialog (hDlg, lpiServer); - StartTask (taskSVR_PROP_INIT, hDlg, lpiServer); - break; - - case WM_DESTROY: - SetWindowLong (hDlg, DWL_USER, 0); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_PROP_INIT) - Server_General_OnEndTask_InitDialog (hDlg, lpiServer, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - break; - - case IDC_SVR_AUTH_YES: - Server_General_OnAuth (hDlg, lpiServer, TRUE); - break; - - case IDC_SVR_AUTH_NO: - Server_General_OnAuth (hDlg, lpiServer, FALSE); - break; - - case IDC_SVR_CHANGEADDR: - Server_General_OnChangeAddr (hDlg, lpiServer); - break; - } - break; - - case WM_CTLCOLORLISTBOX: - if ((HWND)lp == GetDlgItem (hDlg, IDC_SVR_ADDRESSES)) - { - SetBkColor ((HDC)wp, GetSysColor (COLOR_BTNFACE)); - return (BOOL)CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); - } - break; - } - - return FALSE; -} - - -void Server_General_OnInitDialog (HWND hDlg, LPIDENT lpiServer) -{ - TCHAR szText[ cchRESOURCE ]; - lpiServer->GetServerName (szText); - SetDlgItemText (hDlg, IDC_SVR_NAME, szText); - - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTH_YES), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTH_NO), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_CHANGEADDR), FALSE); -} - - -void Server_General_OnEndTask_InitDialog (HWND hDlg, LPIDENT lpiServer, LPTASKPACKET ptp) -{ - TCHAR szText[ cchRESOURCE ]; - if (!ptp->rc) - { - GetString (szText, IDS_UNKNOWN); - SetDlgItemText (hDlg, IDC_SVR_NUMAGGREGATES, szText); - SetDlgItemText (hDlg, IDC_SVR_CAPACITY, szText); - SetDlgItemText (hDlg, IDC_SVR_ALLOCATION, szText); - - LB_StartChange (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), TRUE); - LB_AddItem (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), szText, (LPARAM)-1); - LB_EndChange (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), (LPARAM)-1); - - lpiServer->GetServerName (szText); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVER_STATUS, TEXT("%s"), szText); - } - else - { - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTH_YES), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTH_NO), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_CHANGEADDR), TRUE); - - wsprintf (szText, TEXT("%lu"), TASKDATA(ptp)->nAggr); - SetDlgItemText (hDlg, IDC_SVR_NUMAGGREGATES, szText); - - LPTSTR pszText = FormatString (IDS_SVR_CAPACITY, TEXT("%.1B"), (double)TASKDATA(ptp)->ckCapacity * 1024.0); - SetDlgItemText (hDlg, IDC_SVR_CAPACITY, pszText); - FreeString (pszText); - - DWORD dwPercentUsed = 100; - if (TASKDATA(ptp)->ckCapacity) - dwPercentUsed = (DWORD)( (double)100 * TASKDATA(ptp)->ckAllocation / TASKDATA(ptp)->ckCapacity ); - pszText = FormatString (IDS_SVR_ALLOCATION, TEXT("%.1B%lu"), (double)TASKDATA(ptp)->ckAllocation * 1024.0, dwPercentUsed); - SetDlgItemText (hDlg, IDC_SVR_ALLOCATION, pszText); - FreeString (pszText); - - Server_FillAddrList (hDlg, &TASKDATA(ptp)->ss); - } -} - - - -void Server_General_OnAuth (HWND hDlg, LPIDENT lpiServer, BOOL fEnable) -{ - if (!fEnable) - { - if (Message (MB_YESNO | MB_ICONASTERISK, IDS_WARN_TITLE, IDS_WARN_DISABLE_AUTH) != IDYES) - return; - } - - LPSVR_SETAUTH_PARAMS lpp = New (SVR_SETAUTH_PARAMS); - lpp->lpiServer = lpiServer; - lpp->fEnableAuth = fEnable; - StartTask (taskSVR_SETAUTH, NULL, lpp); -} - - -void Server_General_OnChangeAddr (HWND hDlg, LPIDENT lpiServer) -{ - LPSVR_CHANGEADDR_PARAMS lpp = New (SVR_CHANGEADDR_PARAMS); - memset (lpp, 0x00, sizeof(SVR_CHANGEADDR_PARAMS)); - lpp->lpiServer = lpiServer; - - if (ModalDialogParam (IDD_SVR_ADDRESS, hDlg, (DLGPROC)ChangeAddr_DlgProc, (LPARAM)lpp) == IDOK) - { - StartTask (taskSVR_CHANGEADDR, NULL, lpp); - } - else - { - Delete (lpp); - } -} - - -BOOL CALLBACK Server_Scout_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_SCOUT, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - LPIDENT lpiServer = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG: - Server_Scout_OnInitDialog (hDlg, lpiServer); - StartTask (taskSVR_SCOUT_INIT, hDlg, lpiServer); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_SCOUT_INIT) - Server_Scout_OnEndTask_InitDialog (hDlg, ptp); - else if (ptp->idTask == taskSVR_SCOUT_APPLY) - Server_Scout_OnEndTask_Apply (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - break; - - case IDAPPLY: - Server_Scout_OnApply (hDlg, lpiServer); - break; - - case IDC_SVR_WARN_AGGFULL: - Server_Scout_OnAggWarn (hDlg, lpiServer); - PropSheetChanged (hDlg); - break; - - case IDC_SVR_WARN_SETFULL: - Server_Scout_OnSetWarn (hDlg, lpiServer); - PropSheetChanged (hDlg); - break; - - case IDC_SVR_WARN_AGGALLOC: - case IDC_SVR_WARN_SVCSTOP: - case IDC_SVR_WARN_TIMEOUT: - case IDC_SVR_WARN_SETNOVLDB: - case IDC_SVR_WARN_SETNOSERV: - case IDC_SVR_WARN_AGGFULL_PERCENT: - case IDC_SVR_WARN_SETFULL_PERCENT: - case IDC_SVR_AUTOREFRESH_MINUTES: - PropSheetChanged (hDlg); - break; - - case IDC_SVR_AUTOREFRESH: - Server_Scout_OnAutoRefresh (hDlg, lpiServer); - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Server_Scout_OnInitDialog (HWND hDlg, LPIDENT lpiServer) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL_PERCENT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGALLOC), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SVCSTOP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_TIMEOUT), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETNOVLDB), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETNOSERV), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGNOSERV), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH_MINUTES), FALSE); -} - - -void Server_Scout_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - if (!ptp->rc) - { - TCHAR szText[ cchNAME ]; - lpiServer->GetServerName (szText); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVER_STATUS, TEXT("%s"), szText); - } - else - { - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL_PERCENT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL_PERCENT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGALLOC), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SVCSTOP), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_TIMEOUT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETNOVLDB), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETNOSERV), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGNOSERV), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH_MINUTES), TRUE); - - CheckDlgButton (hDlg, IDC_SVR_WARN_AGGFULL, (TASKDATA(ptp)->lpsp->perWarnAggFull != 0)); - CheckDlgButton (hDlg, IDC_SVR_WARN_SETFULL, (TASKDATA(ptp)->lpsp->perWarnSetFull != 0)); - CheckDlgButton (hDlg, IDC_SVR_WARN_AGGALLOC, TASKDATA(ptp)->lpsp->fWarnAggAlloc); - CheckDlgButton (hDlg, IDC_SVR_WARN_SVCSTOP, TASKDATA(ptp)->lpsp->fWarnSvcStop); - CheckDlgButton (hDlg, IDC_SVR_WARN_TIMEOUT, TASKDATA(ptp)->lpsp->fWarnSvrTimeout); - CheckDlgButton (hDlg, IDC_SVR_WARN_SETNOVLDB, TASKDATA(ptp)->lpsp->fWarnSetNoVLDB); - CheckDlgButton (hDlg, IDC_SVR_WARN_SETNOSERV, TASKDATA(ptp)->lpsp->fWarnSetNoServ); - CheckDlgButton (hDlg, IDC_SVR_WARN_AGGNOSERV, TASKDATA(ptp)->lpsp->fWarnAggNoServ); - - CheckDlgButton (hDlg, IDC_SVR_AUTOREFRESH, (TASKDATA(ptp)->lpsp->oa.cTickRefresh != 0)); - - CreateSpinner (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH_MINUTES), - 10, FALSE, // base, signed - 1, - TASKDATA(ptp)->lpsp->oa.cTickRefresh / cmsec1MINUTE, - 60L * 24L); // maximum refresh rate of one day - - Server_Scout_OnAutoRefresh (hDlg, lpiServer); - - - CreateSpinner (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL_PERCENT), - 10, FALSE, // base, signed - 1, - (TASKDATA(ptp)->lpsp->perWarnAggFull == 0) ? perDEFAULT_AGGFULL_WARNING : TASKDATA(ptp)->lpsp->perWarnAggFull, - 100L); - - Server_Scout_OnAggWarn (hDlg, lpiServer); - - CreateSpinner (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL_PERCENT), - 10, FALSE, // base, signed - 1, - (TASKDATA(ptp)->lpsp->perWarnSetFull == 0) ? perDEFAULT_SETFULL_WARNING : TASKDATA(ptp)->lpsp->perWarnSetFull, - 100L); - - Server_Scout_OnSetWarn (hDlg, lpiServer); - } -} - - -void Server_Scout_OnApply (HWND hDlg, LPIDENT lpiServer) -{ - LPSVR_SCOUT_APPLY_PACKET lpp; - - if ((lpp = New (SVR_SCOUT_APPLY_PACKET)) != NULL) - { - lpp->lpiServer = lpiServer; - - lpp->fIDC_SVR_WARN_AGGFULL = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_AGGFULL); - lpp->wIDC_SVR_WARN_AGGFULL_PERCENT = (short)SP_GetPos (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL_PERCENT)); - - lpp->fIDC_SVR_WARN_SETFULL = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_SETFULL); - lpp->wIDC_SVR_WARN_SETFULL_PERCENT = (short)SP_GetPos (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL_PERCENT)); - - lpp->fIDC_SVR_WARN_AGGALLOC = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_AGGALLOC); - lpp->fIDC_SVR_WARN_SVCSTOP = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_SVCSTOP); - lpp->fIDC_SVR_WARN_TIMEOUT = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_TIMEOUT); - lpp->fIDC_SVR_WARN_SETNOVLDB = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_SETNOVLDB); - lpp->fIDC_SVR_WARN_SETNOSERV = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_SETNOSERV); - lpp->fIDC_SVR_WARN_AGGNOSERV = IsDlgButtonChecked (hDlg, IDC_SVR_WARN_AGGNOSERV); - - lpp->fIDC_SVR_AUTOREFRESH = IsDlgButtonChecked (hDlg, IDC_SVR_AUTOREFRESH); - lpp->dwIDC_SVR_AUTOREFRESH_MINUTES = SP_GetPos (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH_MINUTES)); - - StartTask (taskSVR_SCOUT_APPLY, hDlg, lpp); - } -} - - -void Server_Scout_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - LPIDENT lpiServer = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - - TCHAR szText[ cchNAME ]; - lpiServer->GetServerName (szText); - ErrorDialog (ptp->status, IDS_ERROR_CHANGE_SERVER_STATUS, TEXT("%s"), szText); - } -} - - -void Server_Scout_OnAggWarn (HWND hDlg, LPIDENT lpiServer) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_AGGFULL_PERCENT), - IsDlgButtonChecked (hDlg, IDC_SVR_WARN_AGGFULL)); -} - - -void Server_Scout_OnSetWarn (HWND hDlg, LPIDENT lpiServer) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SVR_WARN_SETFULL_PERCENT), - IsDlgButtonChecked (hDlg, IDC_SVR_WARN_SETFULL)); -} - - -void Server_Scout_OnAutoRefresh (HWND hDlg, LPIDENT lpiServer) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SVR_AUTOREFRESH_MINUTES), - IsDlgButtonChecked (hDlg, IDC_SVR_AUTOREFRESH)); -} - diff --git a/src/WINNT/afssvrmgr/svr_prop.h b/src/WINNT/afssvrmgr/svr_prop.h deleted file mode 100644 index 247cc4c9f..000000000 --- a/src/WINNT/afssvrmgr/svr_prop.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_PROP_H -#define SVR_PROP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - BOOL fEnableAuth; - } SVR_SETAUTH_PARAMS, *LPSVR_SETAUTH_PARAMS; - - -typedef struct - { - LPIDENT lpiServer; - - BOOL fIDC_SVR_WARN_AGGFULL; - WORD wIDC_SVR_WARN_AGGFULL_PERCENT; - - BOOL fIDC_SVR_WARN_SETFULL; - WORD wIDC_SVR_WARN_SETFULL_PERCENT; - - BOOL fIDC_SVR_WARN_AGGALLOC; - BOOL fIDC_SVR_WARN_SVCSTOP; - BOOL fIDC_SVR_WARN_TIMEOUT; - BOOL fIDC_SVR_WARN_SETNOVLDB; - BOOL fIDC_SVR_WARN_SETNOSERV; - BOOL fIDC_SVR_WARN_AGGNOSERV; - - BOOL fIDC_SVR_AUTOREFRESH; - size_t dwIDC_SVR_AUTOREFRESH_MINUTES; - } SVR_SCOUT_APPLY_PACKET, *LPSVR_SCOUT_APPLY_PACKET; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_ShowProperties (LPIDENT lpiServer, size_t nAlerts); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_prune.cpp b/src/WINNT/afssvrmgr/svr_prune.cpp deleted file mode 100644 index 2e5f79997..000000000 --- a/src/WINNT/afssvrmgr/svr_prune.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_prune.h" -#include "propcache.h" - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL WINAPI Server_Prune_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_Prune_OnInitDialog (HWND hDlg, LPSVR_PRUNE_PARAMS lpp); -void Server_Prune_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_PRUNE_PARAMS lpp); -void Server_Prune_EnableOK (HWND hDlg); -void Server_Prune_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Prune (LPIDENT lpiServer, BOOL fBAK, BOOL fOLD, BOOL fCore) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVR_PRUNE, NULL)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSVR_PRUNE_PARAMS lpp = New (SVR_PRUNE_PARAMS); - lpp->lpiServer = lpiServer; - lpp->fBAK = fBAK; - lpp->fOLD = fOLD; - lpp->fCore = fCore; - - HWND hDlg = ModelessDialogParam (IDD_SVR_PRUNE, NULL, (DLGPROC)Server_Prune_DlgProc, (LPARAM)lpp); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL WINAPI Server_Prune_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_PRUNE, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_PRUNE_PARAMS lpp; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPSVR_PRUNE_PARAMS)GetWindowLong(hDlg,DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_PRUNE, NULL, hDlg); - Server_Prune_OnInitDialog (hDlg, lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Server_Prune_OnEndTask_InitDialog (hDlg, ptp, lpp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_Prune_OnOK (hDlg); - // fall through - - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_OP_DELETE_BAK: - case IDC_OP_DELETE_OLD: - case IDC_OP_DELETE_CORE: - Server_Prune_EnableOK (hDlg); - break; - } - break; - - case WM_DESTROY: - SetWindowLong (hDlg, DWL_USER, 0); - PropCache_Delete (pcSVR_PRUNE, NULL); - Delete (lpp); - break; - } - } - - return FALSE; -} - - -void Server_Prune_OnInitDialog (HWND hDlg, LPSVR_PRUNE_PARAMS lpp) -{ - CheckDlgButton (hDlg, IDC_OP_DELETE_BAK, lpp->fBAK); - CheckDlgButton (hDlg, IDC_OP_DELETE_OLD, lpp->fOLD); - CheckDlgButton (hDlg, IDC_OP_DELETE_CORE, lpp->fCore); - - LPSVR_ENUM_TO_COMBOBOX_PACKET lppEnum = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lppEnum->hCombo = GetDlgItem (hDlg, IDC_SERVER); - lppEnum->lpiSelect = lpp->lpiServer; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lppEnum); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Server_Prune_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_PRUNE_PARAMS lpp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE); - - Server_Prune_EnableOK (hDlg); -} - - -void Server_Prune_EnableOK (HWND hDlg) -{ - LPIDENT lpiServer = NULL; - - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SERVER))) - { - lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - } - - BOOL fEnable = (lpiServer != NULL) ? TRUE : FALSE; - - if ( !IsDlgButtonChecked (hDlg, IDC_OP_DELETE_BAK) && - !IsDlgButtonChecked (hDlg, IDC_OP_DELETE_OLD) && - !IsDlgButtonChecked (hDlg, IDC_OP_DELETE_CORE) ) - { - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Server_Prune_OnOK (HWND hDlg) -{ - LPSVR_PRUNE_PARAMS lpp = New (SVR_PRUNE_PARAMS); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - lpp->fBAK = IsDlgButtonChecked (hDlg, IDC_OP_DELETE_BAK); - lpp->fOLD = IsDlgButtonChecked (hDlg, IDC_OP_DELETE_OLD); - lpp->fCore = IsDlgButtonChecked (hDlg, IDC_OP_DELETE_CORE); - - StartTask (taskSVR_PRUNE, NULL, lpp); -} - diff --git a/src/WINNT/afssvrmgr/svr_prune.h b/src/WINNT/afssvrmgr/svr_prune.h deleted file mode 100644 index 276fbdf48..000000000 --- a/src/WINNT/afssvrmgr/svr_prune.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_PRUNE_H -#define SVR_PRUNE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - BOOL fBAK; - BOOL fOLD; - BOOL fCore; - } SVR_PRUNE_PARAMS, *LPSVR_PRUNE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Prune (LPIDENT lpiServer = NULL, BOOL fBAK = TRUE, BOOL fOLD = TRUE, BOOL fCore = TRUE); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_salvage.cpp b/src/WINNT/afssvrmgr/svr_salvage.cpp deleted file mode 100644 index 2cc46ba14..000000000 --- a/src/WINNT/afssvrmgr/svr_salvage.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_salvage.h" -#include "propcache.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cxMIN_SALVAGE_R 250 // minimum size of Salvage Results dialog -#define cyMIN_SALVAGE_R 200 // minimum size of Salvage Results dialog - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdSalvageResults[] = { - { IDC_SALVAGE_TITLE, raSizeX | raRepaint, 0, 0 }, - { IDC_SALVAGE_DETAILS, raSizeX | raSizeY | raRepaint, MAKELONG(cxMIN_SALVAGE_R,cyMIN_SALVAGE_R), 0 }, - { IDOK, raMoveX | raMoveY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi); -void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi); -void Server_Salvage_OnAllAggregates (HWND hDlg); -void Server_Salvage_OnAllFilesets (HWND hDlg); -void Server_Salvage_OnSimultaneous (HWND hDlg); -void Server_Salvage_OnAdvanced (HWND hDlg); -void Server_Salvage_OnOK (HWND hDlg); - -void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp); -void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp); -void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp); - -BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage); -void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Salvage (LPIDENT lpi) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSVR_SALVAGE, lpi)) != NULL) - { - SetFocus (hCurrent); - } - else - { - HWND hDlg = ModelessDialogParam (IDD_SVR_SALVAGE, NULL, (DLGPROC)Server_Salvage_DlgProc, (LPARAM)lpi); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPIDENT lpi; - if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_SALVAGE, lpi, hDlg); - Server_Salvage_OnInitDialog (hDlg, lpi); - Server_Salvage_OnAdvanced (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Server_Salvage_OnEndTask_EnumServers (hDlg, lpi, ptp); - else if (ptp->idTask == taskAGG_ENUM_TO_COMBOBOX) - Server_Salvage_OnEndTask_EnumAggregates (hDlg, lpi, ptp); - else if (ptp->idTask == taskSET_ENUM_TO_COMBOBOX) - Server_Salvage_OnEndTask_EnumFilesets (hDlg, lpi, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_Salvage_OnOK (hDlg); - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_SERVER: - Server_Salvage_OnServer (hDlg, lpi); - break; - case IDC_AGGREGATE: - Server_Salvage_OnAggregate (hDlg, lpi); - break; - case IDC_AGGREGATE_ALL: - Server_Salvage_OnAllAggregates (hDlg); - break; - case IDC_FILESET_ALL: - Server_Salvage_OnAllFilesets (hDlg); - break; - case IDC_SALVAGE_SIMUL: - Server_Salvage_OnSimultaneous (hDlg); - break; - - case IDC_ADVANCED: - Server_Salvage_OnAdvanced (hDlg); - break; - } - break; - - case WM_DESTROY: - PropCache_Delete (pcSVR_SALVAGE, lpi); - break; - } - } - - return FALSE; -} - - -void Server_Salvage_OnAdvanced (HWND hDlg) -{ - HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP); - - RECT rWindow; - RECT rClient; - RECT rGroup; - - GetWindowRect (hDlg, &rWindow); - GetClientRect (hDlg, &rClient); - GetRectInParent (hGroup, &rGroup); - - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR))) - { - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_SIMUL), TRUE); - Server_Salvage_OnSimultaneous (hDlg); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_READONLY), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_BLOCK), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FORCE), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FIXDIRS), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_FILE), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_INODES), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_ROOT), TRUE); - - SetWindowPos (hDlg, NULL, - 0, 0, - cxRECT(rWindow), - cyRECT(rWindow) + cyRECT(rGroup) + 14, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_ADVANCEDIN_BUTTON); - SetDlgItemText (hDlg, IDC_ADVANCED, szText); - } - else // open now? - { - SetWindowPos (hDlg, NULL, - 0, 0, - cxRECT(rWindow), - cyRECT(rWindow) - cyRECT(rGroup) - 14, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_ADVANCEDOUT_BUTTON); - SetDlgItemText (hDlg, IDC_ADVANCED, szText); - - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_SIMUL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_READONLY), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_BLOCK), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FORCE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FIXDIRS), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_FILE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_INODES), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_ROOT), FALSE); - } -} - - -void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - CheckDlgButton (hDlg, IDC_AGGREGATE_ALL, (lpi->fIsServer()) ? TRUE : FALSE); - CheckDlgButton (hDlg, IDC_FILESET_ALL, (lpi->fIsFileset()) ? FALSE : TRUE); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); - - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET); - memset (lpp, 0x00, sizeof(SVR_ENUM_TO_COMBOBOX_PACKET)); - lpp->hCombo = GetDlgItem (hDlg, IDC_SERVER); - lpp->lpiSelect = lpi->GetServer(); - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp); - - CheckDlgButton (hDlg, IDC_SALVAGE_SIMUL, TRUE); - CreateSpinner (GetDlgItem(hDlg,IDC_SALVAGE_NUM), 10, FALSE, 2, 4, 12); -} - - -void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi) -{ - LPIDENT lpiServer; - if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL) - { - LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET); - memset (lpp, 0x00, sizeof(AGG_ENUM_TO_COMBOBOX_PACKET)); - lpp->hCombo = GetDlgItem (hDlg, IDC_AGGREGATE); - lpp->lpiServer = lpiServer; - lpp->lpiSelect = (lpi && (!lpi->fIsCell()) && (!lpi->fIsServer()) && (lpiServer == lpi->GetServer())) ? (lpi->GetAggregate()) : NULL; - StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp); - } -} - - -void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi) -{ - LPIDENT lpiServer; - if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL) - { - LPIDENT lpiAggregate; - if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL) - { - LPSET_ENUM_TO_COMBOBOX_PACKET lpp = New (SET_ENUM_TO_COMBOBOX_PACKET); - memset (lpp, 0x00, sizeof(SET_ENUM_TO_COMBOBOX_PACKET)); - lpp->hCombo = GetDlgItem (hDlg, IDC_FILESET); - lpp->lpiServer = lpiServer; - lpp->lpiAggregate = lpiAggregate; - lpp->lpiSelect = ((lpiServer == lpi) && (lpi->fIsFileset())) ? (lpi->GetFileset()) : NULL; - StartTask (taskSET_ENUM_TO_COMBOBOX, hDlg, lpp); - } - } -} - - -void Server_Salvage_OnAllAggregates (HWND hDlg) -{ - BOOL fAllAggs = IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL); - BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL); - - if (fAllAggs) - { - CheckDlgButton (hDlg, IDC_FILESET_ALL, TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), FALSE); - } - else - { - EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets); - } -} - - -void Server_Salvage_OnAllFilesets (HWND hDlg) -{ - BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL); - EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets); -} - - -void Server_Salvage_OnSimultaneous (HWND hDlg) -{ - BOOL fSimul = IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL); - EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), fSimul); -} - - -void Server_Salvage_OnOK (HWND hDlg) -{ - // Prepare a taskSVR_SALVAGE packet - // - LPSVR_SALVAGE_PARAMS lpp = New (SVR_SALVAGE_PARAMS); - memset (lpp, 0x00, sizeof(SVR_SALVAGE_PARAMS)); - GetDlgItemText (hDlg, IDC_SALVAGE_TEMPDIR, lpp->szTempDir, MAX_PATH); - GetDlgItemText (hDlg, IDC_SALVAGE_LOG_FILE, lpp->szLogFile, MAX_PATH); - lpp->fForce = IsDlgButtonChecked (hDlg, IDC_SALVAGE_FORCE); - lpp->fReadonly = IsDlgButtonChecked (hDlg, IDC_SALVAGE_READONLY); - lpp->fLogInodes = IsDlgButtonChecked (hDlg, IDC_SALVAGE_LOG_INODES); - lpp->fLogRootInodes = IsDlgButtonChecked (hDlg, IDC_SALVAGE_LOG_ROOT); - lpp->fRebuildDirs = IsDlgButtonChecked (hDlg, IDC_SALVAGE_FIXDIRS); - lpp->fReadBlocks = IsDlgButtonChecked (hDlg, IDC_SALVAGE_BLOCK); - if (IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL)) - lpp->nProcesses = SP_GetPos (GetDlgItem (hDlg, IDC_SALVAGE_NUM)); - - lpp->lpiSalvage = NULL; - if (!IsDlgButtonChecked (hDlg, IDC_FILESET_ALL)) - lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_FILESET)); - if (!lpp->lpiSalvage && !IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL)) - lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE)); - if (!lpp->lpiSalvage) // salvage the whole server - lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - if (!lpp->lpiSalvage) - Delete (lpp); - else - { - // Create (but don't show) a results dialog for this operation. - // - HWND hResults = ModelessDialogParam (IDD_SVR_SALVAGE_RESULTS, NULL, (DLGPROC)Server_Salvage_Results_DlgProc, (LPARAM)(lpp->lpiSalvage)); - AfsAppLib_RegisterModelessDialog (hDlg); - - // Fire up the background task; when it finishes, have the task scheduler - // send the result packet to that results dialog. - // - StartTask (taskSVR_SALVAGE, hResults, lpp); - } -} - - -void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp) -{ - // We'll only fill the Servers list once, and that during initialization. - // When the filling completes, find out what server is currently selected - // (it should already be the one the user chose earlier), and fill the - // aggregates list for it. We won't enable anything yet. - // - LPIDENT lpiServer; - if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL) - { - LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET); - memset (lpp, 0x00, sizeof(AGG_ENUM_TO_COMBOBOX_PACKET)); - lpp->hCombo = GetDlgItem (hDlg, IDC_AGGREGATE); - lpp->lpiServer = lpiServer; - lpp->lpiSelect = (lpi && (!lpi->fIsCell()) && (!lpi->fIsServer()) && (lpiServer == lpi->GetServer())) ? (lpi->GetAggregate()) : NULL; - StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp); - } -} - - -void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp) -{ - // We'll refill the Aggregates list any time the user selected a new server; - // and whenever it gets filled, we must next fill the filesets list. - // - LPIDENT lpiServer; - if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL) - { - LPIDENT lpiAggregate; - if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL) - { - LPSET_ENUM_TO_COMBOBOX_PACKET lpp = New (SET_ENUM_TO_COMBOBOX_PACKET); - memset (lpp, 0x00, sizeof(SET_ENUM_TO_COMBOBOX_PACKET)); - lpp->hCombo = GetDlgItem (hDlg, IDC_FILESET); - lpp->lpiServer = lpiServer; - lpp->lpiAggregate = lpiAggregate; - lpp->lpiSelect = ((lpiServer == lpi->GetServer()) && (lpi->fIsFileset())) ? (lpi) : NULL; - StartTask (taskSET_ENUM_TO_COMBOBOX, hDlg, lpp); - } - } -} - - -void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp) -{ - // The filesets list is finished; at this point, the user is free to go - // selecting any other server/aggregate/fileset; the OK button should also - // get enabled. - // - EnableWindow (GetDlgItem (hDlg, IDOK), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), TRUE); - - Server_Salvage_OnAllAggregates (hDlg); -} - - -BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE_RESULTS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPIDENT lpi; - if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - RECT rWindow; - GetWindowRect (hDlg, &rWindow); - ResizeWindow (hDlg, awdSalvageResults, rwaMoveToHere, &rWindow); - - Server_Salvage_Results_OnInitDialog (hDlg, lpi); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - if (lp != 0) - ResizeWindow (hDlg, awdSalvageResults, rwaFixupGuts); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_SALVAGE) - Server_Salvage_OnEndTask_Salvage (hDlg, lpi, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - - case WM_CTLCOLOREDIT: - if ((HWND)lp == GetDlgItem (hDlg, IDC_SALVAGE_DETAILS)) - { - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - } - break; - } - } - return FALSE; -} - - -void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage) -{ - TCHAR szServer[ cchNAME ]; - lpiSalvage->GetServerName (szServer); - - TCHAR szAggregate[ cchNAME ]; - if (!lpiSalvage->fIsServer()) - lpiSalvage->GetAggregateName (szAggregate); - - TCHAR szFileset[ cchNAME ]; - if (lpiSalvage->fIsFileset()) - lpiSalvage->GetFilesetName (szFileset); - - LPTSTR pszTitle; - if (lpiSalvage->fIsServer()) - pszTitle = FormatString (IDS_SALVAGE_SVR, TEXT("%s"), szServer); - else if (lpiSalvage->fIsAggregate()) - pszTitle = FormatString (IDS_SALVAGE_AGG, TEXT("%s%s"), szServer, szAggregate); - else // (lpiSalvage->fIsFileset()) - pszTitle = FormatString (IDS_SALVAGE_SET, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - SetDlgItemText (hDlg, IDC_SALVAGE_TITLE, pszTitle); - FreeString (pszTitle); -} - - -void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - ErrorDialog (ptp->status, IDS_ERROR_CANT_SALVAGE); - DestroyWindow (hDlg); - } - else - { - if (TASKDATA(ptp)->pszText1) - { - SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, TASKDATA(ptp)->pszText1); - } - else - { - TCHAR szServer[ cchNAME ]; - lpiSalvage->GetServerName (szServer); - LPTSTR pszNoLog = FormatString (IDS_ERROR_CANT_READ_SALVAGE_LOG, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, pszNoLog); - FreeString (pszNoLog); - } - - ShowWindow (hDlg, SW_SHOW); - } -} - diff --git a/src/WINNT/afssvrmgr/svr_salvage.h b/src/WINNT/afssvrmgr/svr_salvage.h deleted file mode 100644 index 4e4ce049f..000000000 --- a/src/WINNT/afssvrmgr/svr_salvage.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_SALVAGE_H -#define SVR_SALVAGE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiSalvage; - TCHAR szTempDir[ MAX_PATH ]; - TCHAR szLogFile[ MAX_PATH ]; - int nProcesses; - BOOL fForce; - BOOL fReadonly; - BOOL fLogInodes; - BOOL fLogRootInodes; - BOOL fRebuildDirs; - BOOL fReadBlocks; - } SVR_SALVAGE_PARAMS, *LPSVR_SALVAGE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Salvage (LPIDENT lpi); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_security.cpp b/src/WINNT/afssvrmgr/svr_security.cpp deleted file mode 100644 index 0368ecd5b..000000000 --- a/src/WINNT/afssvrmgr/svr_security.cpp +++ /dev/null @@ -1,829 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_security.h" -#include "propcache.h" -#include "display.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ISKEYINUSE(_pkey) ((_pkey)->keyInfo.timeLastModification.wYear != 0) - -typedef struct - { - LONG cRef; - LPIDENT lpiServer; - LPADMINLIST lpAdmList; - LPKEYLIST lpKeyList; - } SVR_SECURITY_PARAMS, *LPSVR_SECURITY_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Security_Free (LPSVR_SECURITY_PARAMS lpp); - -BOOL CALLBACK Server_Lists_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_Lists_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Lists_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp); -void Server_Lists_OnApply (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Lists_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Lists_OnAddEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Lists_OnDelEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); - -BOOL CALLBACK Server_Keys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Server_Keys_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Keys_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp); -void Server_Keys_OnEndTask_CreateKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp); -void Server_Keys_OnEndTask_DeleteKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp); -void Server_Keys_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Keys_OnAddKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); -void Server_Keys_OnDelKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp); - -void FormatServerKey (LPTSTR psz, LPENCRYPTIONKEY pKey); -BOOL ScanServerKey (LPENCRYPTIONKEY pKey, LPTSTR psz); - -BOOL CALLBACK CreateKey_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void CreateKey_OnInitDialog (HWND hDlg, LPKEY_CREATE_PARAMS lpp); -void CreateKey_OnSelect (HWND hDlg); -void CreateKey_OnType (HWND hDlg); -void CreateKey_OnRandom (HWND hDlg, LPKEY_CREATE_PARAMS lpp); -BOOL CreateKey_OnOK (HWND hDlg, LPKEY_CREATE_PARAMS lpp); -void CreateKey_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp); - - -/* - * SERVER-KEY COLUMNS _________________________________________________________ - * - */ - -void Server_Key_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nSERVERKEYCOLUMNS; - - for (size_t iCol = 0; iCol < nSERVERKEYCOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = SERVERKEYCOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = SERVERKEYCOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = svrkeyVERSION; - - lpvi->nColsShown = 3; - lpvi->aColumns[0] = (int)svrkeyVERSION; - lpvi->aColumns[1] = (int)svrkeyDATA; - lpvi->aColumns[2] = (int)svrkeyCHECKSUM; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Security (LPIDENT lpiServer, BOOL fJumpToKeys) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSVR_SECURITY, lpiServer)) != NULL) - { - SetFocus (hCurrent); - - if (fJumpToKeys) - { - HWND hTab; - if ((hTab = GetDlgItem (hCurrent, IDC_PROPSHEET_TABCTRL)) != NULL) - { - int nTabs = TabCtrl_GetItemCount (hTab); - TabCtrl_SetCurSel (hTab, nTabs-1); - - NMHDR nm; - nm.hwndFrom = hTab; - nm.idFrom = IDC_PROPSHEET_TABCTRL; - nm.code = TCN_SELCHANGE; - SendMessage (hCurrent, WM_NOTIFY, 0, (LPARAM)&nm); - } - } - } - else - { - LPSVR_SECURITY_PARAMS lpp = New (SVR_SECURITY_PARAMS); - memset (lpp, 0x00, sizeof(SVR_SECURITY_PARAMS)); - lpp->lpiServer = lpiServer; - - TCHAR szServer[ cchNAME ]; - lpiServer->GetServerName (szServer); - LPTSTR pszTitle = FormatString (IDS_SVR_SECURITY_TITLE, TEXT("%s"), szServer); - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE); - PropSheet_AddTab (psh, IDS_SVR_LIST_TAB, IDD_SVR_LISTS, (DLGPROC)Server_Lists_DlgProc, (LONG)lpp, TRUE, !fJumpToKeys); - PropSheet_AddTab (psh, IDS_SVR_KEY_TAB, IDD_SVR_KEYS, (DLGPROC)Server_Keys_DlgProc, (LONG)lpp, TRUE, fJumpToKeys); - PropSheet_ShowModeless (psh); - FreeString (pszTitle); - } -} - - -void Server_Security_Free (LPSVR_SECURITY_PARAMS lpp) -{ - if (lpp->lpAdmList) - AfsClass_AdminList_Free (lpp->lpAdmList); - if (lpp->lpKeyList) - AfsClass_KeyList_Free (lpp->lpKeyList); - Delete (lpp); -} - - -BOOL CALLBACK Server_Lists_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_LISTS, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_SECURITY_PARAMS lpp; - if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET)) - lpp = (LPSVR_SECURITY_PARAMS)lp; - else - lpp = (LPSVR_SECURITY_PARAMS)PropSheet_FindTabParam (hDlg); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - InterlockedIncrement (&lpp->cRef); - PropCache_Add (pcSVR_SECURITY, lpp->lpiServer, hDlg); - break; - - case WM_DESTROY_SHEET: - PropCache_Delete (hDlg); - if ((InterlockedDecrement (&lpp->cRef)) == 0) - Server_Security_Free (lpp); - break; - - case WM_INITDIALOG: - Server_Lists_OnInitDialog (hDlg, lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ADMLIST_OPEN) - Server_Lists_OnEndTask_ListOpen (hDlg, lpp, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Server_Lists_OnApply (hDlg, lpp); - break; - - case IDC_LIST_ADD: - Server_Lists_OnAddEntry (hDlg, lpp); - PropSheetChanged (hDlg); - break; - - case IDC_LIST_REMOVE: - Server_Lists_OnDelEntry (hDlg, lpp); - PropSheetChanged (hDlg); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_LIST_LIST)) - { - Server_Lists_OnSelect (hDlg, lpp); - } - break; - } - break; - } - - return FALSE; -} - - -void Server_Lists_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - TCHAR szOld[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_LIST_NAME, szOld, cchRESOURCE); - - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - - LPTSTR pszText = FormatString (szOld, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_LIST_NAME, pszText); - FreeString (pszText); - - HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST); - - // We'll need an imagelist, if we want icons in the list. - // - HIMAGELIST hLarge; - if ((hLarge = ImageList_Create (32, 32, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0) - AfsAppLib_AddToImageList (hLarge, IDI_USER, TRUE); - - HIMAGELIST hSmall; - if ((hSmall = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0) - AfsAppLib_AddToImageList (hSmall, IDI_USER, FALSE); - - FastList_SetImageLists (hList, hSmall, hLarge); - - // Start loading the admin list - // - StartTask (taskSVR_ADMLIST_OPEN, hDlg, lpp->lpiServer); - - EnableWindow (hList, FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_LIST_ADD), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_LIST_REMOVE), FALSE); -} - - -void Server_Lists_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST); - - lpp->lpAdmList = TASKDATA(ptp)->lpAdmList; - - // Populate the list - // - FL_StartChange (hList, TRUE); - - if (lpp->lpAdmList) - { - for (size_t iEntry = 0; iEntry < lpp->lpAdmList->cEntries; ++iEntry) - { - LPADMINLISTENTRY pEntry = &lpp->lpAdmList->aEntries[ iEntry ]; - if (pEntry->szAdmin[0] == TEXT('\0')) - continue; - - FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pEntry->szAdmin); - } - } - - FL_EndChange (hList, 0); - EnableWindow (hList, (lpp->lpAdmList != NULL)); - EnableWindow (GetDlgItem (hDlg, IDC_LIST_ADD), (lpp->lpAdmList != NULL)); - - Server_Lists_OnSelect (hDlg, lpp); -} - - -void Server_Lists_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST); - - BOOL fEnableRemove = TRUE; - - if (!IsWindowEnabled (hList)) - fEnableRemove = FALSE; - - if (FastList_FindFirstSelected (hList) == NULL) - fEnableRemove = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_LIST_REMOVE), fEnableRemove); -} - - -void Server_Lists_OnApply (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_LIST_LIST))) - { - // Increment the reference counter on this admin list before handing - // it off to the Save task. When the Save task is done, it will attempt - // to free the list--which will decrement the counter again, and - // actually free the list if the counter hits zero. - // - InterlockedIncrement (&lpp->lpAdmList->cRef); - StartTask (taskSVR_ADMLIST_SAVE, NULL, lpp->lpAdmList); - } -} - - -void Server_Lists_OnAddEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - TCHAR szLocalCell[ cchNAME ]; - g.lpiCell->GetCellName (szLocalCell); - - BROWSEDLG_PARAMS pp; - memset (&pp, 0x00, sizeof(BROWSEDLG_PARAMS)); - pp.hParent = hDlg; - pp.idsTitle = IDS_TITLE_BROWSE_USER; - pp.idsPrompt = IDS_PROMPT_BROWSE_USER; - pp.bt = btLOCAL_USER; - lstrcpy (pp.szCell, szLocalCell); - pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS); - pp.szNamed[0] = TEXT('\0'); - pp.hCreds = g.hCreds; - - if (!AfsAppLib_ShowBrowseDialog (&pp)) - { - AfsAppLib_FreeCellList (pp.lpcl); - return; - } - - AfsAppLib_FreeCellList (pp.lpcl); - - for (size_t iEntry = 0; iEntry < lpp->lpAdmList->cEntries; ++iEntry) - { - LPADMINLISTENTRY pEntry = &lpp->lpAdmList->aEntries[ iEntry ]; - if (pEntry->szAdmin[0] == TEXT('\0')) - continue; - - if (!lstrcmpi (pEntry->szAdmin, pp.szNamed)) - break; - } - - if (iEntry >= lpp->lpAdmList->cEntries) - { - iEntry = AfsClass_AdminList_AddEntry (lpp->lpAdmList, pp.szNamed); - } - - HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST); - FL_StartChange (hList, FALSE); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)iEntry)) == NULL) - { - hItem = FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pp.szNamed); - } - - FL_EndChange (hList, (LPARAM)hItem); -} - - -void Server_Lists_OnDelEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST); - FL_StartChange (hList, FALSE); - - HLISTITEM hItem; - while ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - size_t iEntry = (size_t)FL_GetData (hList, hItem); - AfsClass_AdminList_DelEntry (lpp->lpAdmList, iEntry); - FastList_RemoveItem (hList, hItem); - } - - FL_EndChange (hList); -} - - -BOOL CALLBACK Server_Keys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_KEYS, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_SECURITY_PARAMS lpp; - if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET)) - lpp = (LPSVR_SECURITY_PARAMS)lp; - else - lpp = (LPSVR_SECURITY_PARAMS)PropSheet_FindTabParam (hDlg); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - InterlockedIncrement (&lpp->cRef); - break; - - case WM_DESTROY_SHEET: - if ((InterlockedDecrement (&lpp->cRef)) == 0) - Server_Security_Free (lpp); - break; - - case WM_INITDIALOG: - Server_Keys_OnInitDialog (hDlg, lpp); - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_KEY_LIST), &gr.viewKey); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_KEYLIST_OPEN) - Server_Keys_OnEndTask_ListOpen (hDlg, lpp, ptp); - else if (ptp->idTask == taskSVR_KEY_CREATE) - Server_Keys_OnEndTask_CreateKey (hDlg, lpp, ptp); - else if (ptp->idTask == taskSVR_KEY_DELETE) - Server_Keys_OnEndTask_DeleteKey (hDlg, lpp, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_KEY_ADD: - Server_Keys_OnAddKey (hDlg, lpp); - break; - - case IDC_KEY_REMOVE: - Server_Keys_OnDelKey (hDlg, lpp); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_KEY_LIST)) - { - Server_Keys_OnSelect (hDlg, lpp); - } - break; - } - break; - } - - return FALSE; -} - - -void Server_Keys_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - - LPTSTR pszText = FormatString (IDS_KEYNAME_NOTIME, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_KEY_NAME, pszText); - FreeString (pszText); - - HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST); - FL_RestoreView (hList, &gr.viewKey); - FastList_SetSortFunction (hList, FastList_SortFunc_Numeric); - FastList_SetSortStyle (hList, 0, FALSE); - - // We'll need an imagelist, if we want icons in the list. - // - HIMAGELIST hSmall = AfsAppLib_CreateImageList (FALSE); - FastList_SetImageLists (hList, hSmall, NULL); - - // Start loading the server keys - // - StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer); - - EnableWindow (hList, FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_KEY_ADD), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_KEY_REMOVE), FALSE); -} - - -void Server_Keys_OnEndTask_CreateKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp) -{ - StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer); -} - - -void Server_Keys_OnEndTask_DeleteKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp) -{ - StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer); -} - - -void Server_Keys_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp) -{ - HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST); - - if (lpp->lpKeyList) - AfsClass_KeyList_Free (lpp->lpKeyList); - lpp->lpKeyList = TASKDATA(ptp)->lpKeyList; - - // Populate the list - // - LPARAM iVerSelect = FL_StartChange (hList, TRUE); - - SYSTEMTIME stLastMod; - memset (&stLastMod, 0x00, sizeof(stLastMod)); - - if (lpp->lpKeyList) - { - for (size_t iKey = 0; iKey < lpp->lpKeyList->cKeys; ++iKey) - { - LPSERVERKEY pKey = &lpp->lpKeyList->aKeys[ iKey ]; - if (!ISKEYINUSE(pKey)) - continue; - - TCHAR szVersion[ cchRESOURCE ]; - wsprintf (szVersion, TEXT("%lu"), pKey->keyVersion); - - TCHAR szValue[ cchRESOURCE ]; - FormatServerKey (szValue, &pKey->keyData); - - TCHAR szChecksum[ cchRESOURCE ]; - wsprintf (szChecksum, TEXT("%lu"), pKey->keyInfo.dwChecksum); - - FL_AddItem (hList, &gr.viewKey, (LPARAM)pKey->keyVersion, imageSERVERKEY, szVersion, szValue, szChecksum); - - stLastMod = pKey->keyInfo.timeLastModification; - } - } - - FL_EndChange (hList, iVerSelect); - EnableWindow (hList, (lpp->lpKeyList != NULL)); - EnableWindow (GetDlgItem (hDlg, IDC_KEY_ADD), (lpp->lpKeyList != NULL)); - - // Retitle the list - // - if (lpp->lpKeyList && stLastMod.wYear) - { - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - - LPTSTR pszText = FormatString (IDS_KEYNAME_WITHTIME, TEXT("%s%t"), szServer, &stLastMod); - SetDlgItemText (hDlg, IDC_KEY_NAME, pszText); - FreeString (pszText); - } - - Server_Lists_OnSelect (hDlg, lpp); -} - - -void Server_Keys_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST); - - BOOL fEnableRemove = TRUE; - - if (!IsWindowEnabled (hList)) - fEnableRemove = FALSE; - - if (FastList_FindFirstSelected (hList) == NULL) - fEnableRemove = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_KEY_REMOVE), fEnableRemove); -} - - -void Server_Keys_OnAddKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - LPKEY_CREATE_PARAMS lpCreate = New (KEY_CREATE_PARAMS); - memset (lpCreate, 0x00, sizeof(KEY_CREATE_PARAMS)); - lpCreate->lpiServer = lpp->lpiServer; - lpCreate->keyVersion = 0; - - for (size_t iKey = 0; iKey < lpp->lpKeyList->cKeys; ++iKey) - { - LPSERVERKEY pKey = &lpp->lpKeyList->aKeys[ iKey ]; - if (!ISKEYINUSE(pKey)) - continue; - lpCreate->keyVersion = max (lpCreate->keyVersion, 1+pKey->keyVersion); - } - - if (ModalDialogParam (IDD_SVR_CREATEKEY, hDlg, (DLGPROC)CreateKey_DlgProc, (LPARAM)lpCreate) != IDOK) - { - Delete (lpCreate); - } - else - { - StartTask (taskSVR_KEY_CREATE, hDlg, lpCreate); - } -} - - -void Server_Keys_OnDelKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp) -{ - HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST); - - HLISTITEM hItem; - if ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - LPKEY_DELETE_PARAMS lpDel = New (KEY_DELETE_PARAMS); - lpDel->lpiServer = lpp->lpiServer; - lpDel->keyVersion = (int)FL_GetData (hList, hItem); - StartTask (taskSVR_KEY_DELETE, hDlg, lpDel); - } -} - - -void FormatServerKey (LPTSTR psz, LPENCRYPTIONKEY pKey) -{ - for (size_t ii = 0; ii < ENCRYPTIONKEY_LEN; ++ii) - { - if (pKey->key[ii]) - break; - } - if (ii == ENCRYPTIONKEY_LEN) - { - GetString (psz, IDS_SVRKEY_DATA_UNKNOWN); - return; - } - - for (ii = 0; ii < ENCRYPTIONKEY_LEN; ++ii) - { - WORD ch1 = (WORD)(pKey->key[ii]) / 64; - WORD ch2 = ((WORD)(pKey->key[ii]) - (ch1 * 64)) / 8; - WORD ch3 = ((WORD)(pKey->key[ii]) - (ch1 * 64) - (ch2 * 8)); - wsprintf (psz, TEXT("\\%0d%0d%0d"), ch1, ch2, ch3); - psz += 4; - } - - *psz = TEXT('\0'); -} - - -BOOL ScanServerKey (LPENCRYPTIONKEY pKey, LPTSTR psz) -{ - for (size_t ich = 0; psz && *psz; ) - { - if (ich == ENCRYPTIONKEY_LEN) - return FALSE; - - if (*psz != '\\') - { - pKey->key[ ich++ ] = (BYTE)*psz++; - continue; - } - - if ((lstrlen(psz) < 4) || (!isdigit(*(1+psz)))) - return FALSE; - - ++psz; // skip the backslash - WORD ch1 = (WORD)((*psz++) - TEXT('0')); - WORD ch2 = (WORD)((*psz++) - TEXT('0')); - WORD ch3 = (WORD)((*psz++) - TEXT('0')); - pKey->key[ ich++ ] = (BYTE)( ch1 * 64 + ch2 * 8 + ch3 ); - } - - return (ich == ENCRYPTIONKEY_LEN) ? TRUE : FALSE; -} - - -BOOL CALLBACK CreateKey_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static LPKEY_CREATE_PARAMS lpp = NULL; - - switch (msg) - { - case WM_INITDIALOG: - lpp = (LPKEY_CREATE_PARAMS)lp; - CreateKey_OnInitDialog (hDlg, lpp); - break; - - case WM_DESTROY: - lpp = NULL; - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_GETRANDOMKEY) - CreateKey_OnEndTask_Random (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (CreateKey_OnOK (hDlg, lpp)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_KEY_BYSTRING: - case IDC_KEY_BYDATA: - CreateKey_OnSelect (hDlg); - break; - - case IDC_KEY_STRING: - case IDC_KEY_DATA: - CreateKey_OnType (hDlg); - break; - - case IDC_KEY_RANDOM: - CreateKey_OnRandom (hDlg, lpp); - break; - } - break; - } - - return FALSE; -} - - -void CreateKey_OnInitDialog (HWND hDlg, LPKEY_CREATE_PARAMS lpp) -{ - TCHAR szOld[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_KEY_TITLE, szOld, cchRESOURCE); - - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - - LPTSTR pszText = FormatString (szOld, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_KEY_TITLE, pszText); - FreeString (pszText); - - CheckDlgButton (hDlg, IDC_KEY_BYSTRING, TRUE); - SetDlgItemText (hDlg, IDC_KEY_STRING, lpp->szString); - - CreateSpinner (GetDlgItem (hDlg, IDC_KEY_VERSION), 10, FALSE, 0, lpp->keyVersion, 255); - CreateKey_OnSelect (hDlg); -} - - -void CreateKey_OnSelect (HWND hDlg) -{ - EnableWindow (GetDlgItem (hDlg, IDC_KEY_STRING), IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING)); - EnableWindow (GetDlgItem (hDlg, IDC_KEY_DATA), IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA)); - EnableWindow (GetDlgItem (hDlg, IDC_KEY_RANDOM), IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA)); - CreateKey_OnType (hDlg); -} - - -void CreateKey_OnType (HWND hDlg) -{ - BOOL fEnable = FALSE; - - if (IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING)) - { - TCHAR szKey[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_KEY_STRING, szKey, cchRESOURCE); - if (szKey[0] != TEXT('\0')) - fEnable = TRUE; - } - else // (IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA)) - { - TCHAR szKey[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_KEY_DATA, szKey, cchRESOURCE); - - ENCRYPTIONKEY key; - if (ScanServerKey (&key, szKey)) - fEnable = TRUE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void CreateKey_OnRandom (HWND hDlg, LPKEY_CREATE_PARAMS lpp) -{ - StartTask (taskSVR_GETRANDOMKEY, hDlg, lpp->lpiServer); -} - - -BOOL CreateKey_OnOK (HWND hDlg, LPKEY_CREATE_PARAMS lpp) -{ - if (IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING)) - { - GetDlgItemText (hDlg, IDC_KEY_STRING, lpp->szString, cchRESOURCE); - } - else // (!IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING)) - { - TCHAR szKey[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_KEY_DATA, szKey, cchRESOURCE); - - if (!ScanServerKey (&lpp->key, szKey)) - return FALSE; - } - - lpp->keyVersion = SP_GetPos (GetDlgItem (hDlg, IDC_KEY_VERSION)); - return TRUE; -} - - -void CreateKey_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - EnableWindow (GetDlgItem (hDlg, IDC_KEY_RANDOM), FALSE); - } - else - { - TCHAR szKey[ cchRESOURCE ]; - FormatServerKey (szKey, &TASKDATA(ptp)->key); - SetDlgItemText (hDlg, IDC_KEY_DATA, szKey); - } -} - diff --git a/src/WINNT/afssvrmgr/svr_security.h b/src/WINNT/afssvrmgr/svr_security.h deleted file mode 100644 index 89eb428c4..000000000 --- a/src/WINNT/afssvrmgr/svr_security.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_SECURITY_H -#define SVR_SECURITY_H - - -/* - * SERVER KEY COLUMNS _________________________________________________________ - * - */ - -typedef enum - { - svrkeyVERSION, - svrkeyDATA, - svrkeyCHECKSUM, - } SERVERKEYCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -SERVERKEYCOLUMNS[] = - { - { IDS_SVRKEY_VERSION, 75 }, // svrkeyVERSION - { IDS_SVRKEY_DATA, 150 }, // svrkeyDATA - { IDS_SVRKEY_CHECKSUM, 75 | COLUMN_RIGHTJUST }, // svrkeyCHECKSUM - }; - -#define nSERVERKEYCOLUMNS (sizeof(SERVERKEYCOLUMNS)/sizeof(SERVERKEYCOLUMNS[0])) - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - int keyVersion; - TCHAR szString[ cchRESOURCE ]; - ENCRYPTIONKEY key; - } KEY_CREATE_PARAMS, *LPKEY_CREATE_PARAMS; - -typedef struct - { - LPIDENT lpiServer; - int keyVersion; - } KEY_DELETE_PARAMS, *LPKEY_DELETE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Key_SetDefaultView (LPVIEWINFO lpvi); - -void Server_Security (LPIDENT lpiServer, BOOL fJumpToKeys = FALSE); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_syncvldb.cpp b/src/WINNT/afssvrmgr/svr_syncvldb.cpp deleted file mode 100644 index 81a2d323e..000000000 --- a/src/WINNT/afssvrmgr/svr_syncvldb.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_syncvldb.h" -#include "propcache.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Server_SyncVLDB_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Server_SyncVLDB_OnInitDialog (HWND hDlg, LPIDENT lpi); -void Server_SyncVLDB_OnOK (HWND hDlg, LPIDENT lpi); -void Server_SyncVLDB_OnEndTask_Init (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_SyncVLDB (LPIDENT lpi) -{ - HWND hCurrent; - if ((hCurrent = PropCache_Search (pcSVR_SYNCVLDB, lpi)) != NULL) - { - SetFocus (hCurrent); - } - else - { - ModelessDialogParam (IDD_SVR_SYNCVLDB, NULL, (DLGPROC)Server_SyncVLDB_DlgProc, (LPARAM)lpi); - } -} - - -BOOL CALLBACK Server_SyncVLDB_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_SYNCVLDB, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - LPIDENT lpi; - if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_SYNCVLDB, lpi, hDlg); - Server_SyncVLDB_OnInitDialog (hDlg, lpi); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskAGG_FIND_GHOST) - Server_SyncVLDB_OnEndTask_Init (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_SyncVLDB_OnOK (hDlg, lpi); - DestroyWindow (hDlg); - break; - - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - - case WM_DESTROY: - PropCache_Delete (pcSVR_SYNCVLDB, lpi); - break; - } - } - - return FALSE; -} - - -void Server_SyncVLDB_OnInitDialog (HWND hDlg, LPIDENT lpi) -{ - if (lpi->fIsServer()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - - LPTSTR pszText = FormatString (IDS_SYNCVLDB_SVR_DESC, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_SYNC_DESC, pszText); - FreeString (pszText); - pszText = FormatString (IDS_SYNCVLDB_SVR_DESC2, TEXT("%s"), szServer); - SetDlgItemText (hDlg, IDC_SYNC_DESC2, pszText); - FreeString (pszText); - - ShowWindow (hDlg, SW_SHOW); - } - else // (lpi->fIsAggregate()) - { - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - TCHAR szAggregate[ cchNAME ]; - lpi->GetAggregateName (szAggregate); - - LPTSTR pszText = FormatString (IDS_SYNCVLDB_AGG_DESC, TEXT("%s%s"), szServer, szAggregate); - SetDlgItemText (hDlg, IDC_SYNC_DESC, pszText); - FreeString (pszText); - pszText = FormatString (IDS_SYNCVLDB_AGG_DESC2, TEXT("%s%s"), szServer, szAggregate); - SetDlgItemText (hDlg, IDC_SYNC_DESC2, pszText); - FreeString (pszText); - - StartTask (taskAGG_FIND_GHOST, hDlg, lpi); - } -} - - -void Server_SyncVLDB_OnEndTask_Init (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc && (!(TASKDATA(ptp)->wGhost & GHOST_HAS_SERVER_ENTRY))) - { - LPIDENT lpi = (LPIDENT)( ptp->lpUser ); - - TCHAR szServer[ cchNAME ]; - lpi->GetServerName (szServer); - TCHAR szAggregate[ cchNAME ]; - lpi->GetAggregateName (szAggregate); - - ErrorDialog (0, IDS_ERROR_CANT_SYNC_GHOST_AGGREGATE, TEXT("%s%s"), szServer, szAggregate); - DestroyWindow (hDlg); - return; - } - - ShowWindow (hDlg, SW_SHOW); -} - - -void Server_SyncVLDB_OnOK (HWND hDlg, LPIDENT lpi) -{ - LPSVR_SYNCVLDB_PARAMS lpp = New (SVR_SYNCVLDB_PARAMS); - lpp->lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER); - lpp->fForce = TRUE; - StartTask (taskSVR_SYNCVLDB, NULL, lpp); -} - diff --git a/src/WINNT/afssvrmgr/svr_syncvldb.h b/src/WINNT/afssvrmgr/svr_syncvldb.h deleted file mode 100644 index 16c921bf7..000000000 --- a/src/WINNT/afssvrmgr/svr_syncvldb.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_SYNCVLDB_H -#define SVR_SYNCVLDB_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpi; - BOOL fForce; - } SVR_SYNCVLDB_PARAMS, *LPSVR_SYNCVLDB_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_SyncVLDB (LPIDENT lpi); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_uninstall.cpp b/src/WINNT/afssvrmgr/svr_uninstall.cpp deleted file mode 100644 index 840d72488..000000000 --- a/src/WINNT/afssvrmgr/svr_uninstall.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_uninstall.h" -#include "propcache.h" - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL WINAPI Server_Uninstall_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_Uninstall_OnInitDialog (HWND hDlg, LPSVR_UNINSTALL_PARAMS lpp); -void Server_Uninstall_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_UNINSTALL_PARAMS lpp); -void Server_Uninstall_EnableOK (HWND hDlg); -void Server_Uninstall_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Uninstall (LPIDENT lpiServer) -{ - HWND hCurrent; - - if ((hCurrent = PropCache_Search (pcSVR_UNINSTALL, NULL)) != NULL) - { - SetFocus (hCurrent); - } - else - { - LPSVR_UNINSTALL_PARAMS lpp = New (SVR_UNINSTALL_PARAMS); - lpp->lpiServer = lpiServer; - lpp->szUninstall[0] = TEXT('\0'); - - HWND hDlg = ModelessDialogParam (IDD_SVR_UNINSTALL, NULL, (DLGPROC)Server_Uninstall_DlgProc, (LPARAM)lpp); - ShowWindow (hDlg, SW_SHOW); - } -} - - -BOOL WINAPI Server_Uninstall_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SVR_UNINSTALL, hDlg, msg, wp, lp)) - return TRUE; - - LPSVR_UNINSTALL_PARAMS lpp; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, lp); - - if ((lpp = (LPSVR_UNINSTALL_PARAMS)GetWindowLong(hDlg,DWL_USER)) != NULL) - { - switch (msg) - { - case WM_INITDIALOG: - PropCache_Add (pcSVR_UNINSTALL, NULL, hDlg); - Server_Uninstall_OnInitDialog (hDlg, lpp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX) - Server_Uninstall_OnEndTask_InitDialog (hDlg, ptp, lpp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Server_Uninstall_OnOK (hDlg); - DestroyWindow (hDlg); - break; - - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDC_SERVER: - case IDC_FILENAME: - Server_Uninstall_EnableOK (hDlg); - break; - } - break; - - case WM_DESTROY: - SetWindowLong (hDlg, DWL_USER, 0); - PropCache_Delete (pcSVR_UNINSTALL, NULL); - Delete (lpp); - break; - } - } - - return FALSE; -} - - -void Server_Uninstall_OnInitDialog (HWND hDlg, LPSVR_UNINSTALL_PARAMS lpp) -{ - LPSVR_ENUM_TO_COMBOBOX_PACKET lppEnum = New (SVR_ENUM_TO_COMBOBOX_PACKET); - lppEnum->hCombo = GetDlgItem (hDlg, IDC_SERVER); - lppEnum->lpiSelect = lpp->lpiServer; - StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lppEnum); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); -} - - -void Server_Uninstall_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSVR_UNINSTALL_PARAMS lpp) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE); - Server_Uninstall_EnableOK (hDlg); -} - - -void Server_Uninstall_EnableOK (HWND hDlg) -{ - LPIDENT lpiServer = NULL; - - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SERVER))) - lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - - BOOL fEnable = (lpiServer != NULL) ? TRUE : FALSE; - - if (fEnable) - { - TCHAR szName[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_FILENAME, szName, MAX_PATH); - if (szName[0] == TEXT('\0')) - fEnable = FALSE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Server_Uninstall_OnOK (HWND hDlg) -{ - LPSVR_UNINSTALL_PARAMS lpp = New (SVR_UNINSTALL_PARAMS); - lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER)); - GetDlgItemText (hDlg, IDC_FILENAME, lpp->szUninstall, MAX_PATH); - - StartTask (taskSVR_UNINSTALL, NULL, lpp); -} - diff --git a/src/WINNT/afssvrmgr/svr_uninstall.h b/src/WINNT/afssvrmgr/svr_uninstall.h deleted file mode 100644 index 851072565..000000000 --- a/src/WINNT/afssvrmgr/svr_uninstall.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_UNINSTALL_H -#define SVR_UNINSTALL_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - LPIDENT lpiServer; - TCHAR szUninstall[ MAX_PATH ]; - } SVR_UNINSTALL_PARAMS, *LPSVR_UNINSTALL_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Uninstall (LPIDENT lpiServer = NULL); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svr_window.cpp b/src/WINNT/afssvrmgr/svr_window.cpp deleted file mode 100644 index d57f07008..000000000 --- a/src/WINNT/afssvrmgr/svr_window.cpp +++ /dev/null @@ -1,636 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_window.h" -#include "propcache.h" -#include "set_tab.h" -#include "agg_tab.h" -#include "svc_tab.h" -#include "display.h" -#include "command.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -#define cxMIN_SERVER 100 -#define cyMIN_SERVER 100 - -static rwWindowData awdServer[] = { - { IDC_TABS, raSizeX | raSizeY, MAKELONG(cxMIN_SERVER,cyMIN_SERVER), 0 }, - { idENDLIST, 0, 0, 0 } - }; - -static rwWindowData awdTabChild[] = { - { 0, raSizeX | raSizeY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * CHILD TABS _________________________________________________________________ - * - */ - -static struct // CHILDTABINFO - { - CHILDTAB tab; - int idsTabTitle; - int iImage; - } -CHILDTABINFO[] = - { - { tabFILESETS, IDS_TAB_FILESETS, imageFILESET }, - { tabAGGREGATES, IDS_TAB_AGGREGATES, imageAGGREGATE }, - { tabSERVICES, IDS_TAB_SERVICES, imageSERVICE }, - }; - -#define nCHILDTABS (sizeof(CHILDTABINFO)/sizeof(CHILDTABINFO[0])) - - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Server_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Server_SaveRect (HWND hDlg, BOOL fOpen); - -BOOL Server_HandleDialogKeys (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Server_Open (LPIDENT lpiServer, LPRECT prWindow) -{ - HWND hServer; - - if ((hServer = PropCache_Search (pcSERVER, lpiServer)) != NULL) - { - SetFocus (hServer); - } - else - { - // First off, if this server isn't being monitored, we have - // to start monitoring it or we can't open a window (nothing to - // show otherwise). - // - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) != NULL) - { - BOOL fCanShowWindow = (gr.fOpenMonitors || lpsp->fIsMonitored); - - if (gr.fOpenMonitors && !lpsp->fIsMonitored) - { - StartTask (taskSVR_MONITOR_ONOFF, NULL, lpiServer); - } - - if (fCanShowWindow) - { - hServer = ModelessDialogParam (IDD_SERVER, NULL, (DLGPROC)Server_DlgProc, (LPARAM)lpiServer); - Server_SelectServer (hServer, lpiServer); - - if (prWindow->right != 0) - { - SetWindowPos (hServer, NULL, prWindow->left, prWindow->top, - cxRECT(*prWindow), cyRECT(*prWindow), - SWP_NOZORDER | SWP_NOACTIVATE); - } - - ShowWindow (hServer, SW_NORMAL); - } - } - } -} - - -void Server_Close (LPIDENT lpiServer) -{ - HWND hWnd; - - if ((hWnd = PropCache_Search (pcSERVER, lpiServer)) != NULL) - { - Server_SaveRect (hWnd, FALSE); - DestroyWindow (hWnd); - - // If there's a subset active, the user may want us to stop - // monitoring this server once its window is closed. - // - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) != NULL) - { - if (g.sub && gr.fCloseUnmonitors && lpsp->fIsMonitored && !gr.fPreview) - { - StartTask (taskSVR_MONITOR_ONOFF, NULL, lpiServer); - } - } - } -} - - -void Server_CloseAll (BOOL fUserRequested) -{ - HWND hWnd; - - while ((hWnd = PropCache_Search (pcSERVER, ANYVALUE)) != NULL) - { - LPIDENT lpiServer = Server_GetServer (hWnd); - - Server_SaveRect (hWnd, !fUserRequested); - DestroyWindow (hWnd); - - if (lpiServer && fUserRequested) - { - // If there's a subset active, the user may want us to stop - // monitoring this server once its window is closed. - // - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) != NULL) - { - if (g.sub && gr.fCloseUnmonitors && lpsp->fIsMonitored) - { - StartTask (taskSVR_MONITOR_ONOFF, NULL, lpiServer); - } - } - } - } -} - - -HWND Server_GetCurrentTab (HWND hWnd) -{ - return GetTabChild (GetDlgItem (hWnd, IDC_TABS)); -} - -CHILDTAB Server_GetDisplayedTab (HWND hWnd) -{ - HWND hTabs = GetDlgItem (hWnd, IDC_TABS); - return (hTabs) ? (CHILDTAB)TabCtrl_GetCurSel(hTabs) : tabINVALID; -} - -HWND Server_GetWindowForChild (HWND hChild) -{ - // hChild is the Filesets_DlgProc dialog (or whatever) - // Its parent is the tab control on the server window - // Its grandparent is the Popup HWND (may be g.hMain) that we want. - // - return GetParent (GetParent (hChild)); -} - -void Server_SelectServer (HWND hDlg, LPIDENT lpiNew, BOOL fForceRedraw) -{ - LPIDENT lpiOld = Server_GetServer (hDlg); - if (lpiNew != lpiOld) - { - SetWindowLong (hDlg, DWL_USER, (LONG)lpiNew); - - if (hDlg != g.hMain) - { - if (lpiOld) - PropCache_Delete (pcSERVER, lpiOld); - - if (lpiNew) - { - PropCache_Add (pcSERVER, lpiNew, hDlg); - - TCHAR szName[ cchNAME ]; - lpiNew->GetServerName (szName); - LPTSTR pszTitle = FormatString (IDS_SERVER_TITLE, TEXT("%s"), szName); - SetWindowText (hDlg, pszTitle); - FreeString (pszTitle); - } - } - - fForceRedraw = TRUE; - } - - if (fForceRedraw) - { - Server_ForceRedraw (hDlg); - } -} - -LPIDENT Server_GetServer (HWND hDlg) -{ - return (LPIDENT)GetWindowLong (hDlg, DWL_USER); -} - -LPIDENT Server_GetServerForChild (HWND hChild) -{ - if (GetParent(hChild) == NULL) - return Server_GetServer (hChild); - else - return Server_GetServer (GetParent(GetParent(hChild))); -} - - -void Server_ForceRedraw (HWND hDlg) -{ - HWND hChild = Server_GetCurrentTab (hDlg); - - if (hChild && IsWindow (hChild)) - { - PostMessage (hChild, WM_SERVER_CHANGED, 0, 0); - } -} - - -/* - * SERVER DIALOG ______________________________________________________________ - * - */ - -BOOL CALLBACK Server_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPIDENT lpiServer = Server_GetServer (hDlg); - - if (Server_HandleDialogKeys (hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - RECT rWindow; - Server_PrepareTabControl (GetDlgItem (hDlg, IDC_TABS)); - GetWindowRect (hDlg, &rWindow); - ResizeWindow (hDlg, awdServer, rwaMoveToHere, &rWindow); - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - GetWindowRect (hDlg, &gr.rServerLast); - - if (lpiServer) - PropCache_Delete (pcSERVER, lpiServer); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - { - ResizeWindow (hDlg, awdServer, rwaFixupGuts); - Server_SaveRect (hDlg, TRUE); - } - break; - - case WM_MOVE: - Server_SaveRect (hDlg, TRUE); - break; - - case WM_SETFOCUS: - gr.tabLast = Server_GetDisplayedTab (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - LPIDENT lpi; - if ((lpi = Server_GetServer (hDlg)) != NULL) - Server_Close (lpi); - else - DestroyWindow (hDlg); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case TCN_SELCHANGE: - { - HWND hTab = GetDlgItem (hDlg, IDC_TABS); - int iPage = TabCtrl_GetCurSel (hTab); - - Server_DisplayTab (hDlg, (CHILDTAB)iPage); - gr.tabLast = (CHILDTAB)iPage; - } - break; - } - break; - } - - return FALSE; -} - - -static LONG procTabControl = 0; - -LRESULT CALLBACK Server_SubclassTabControlProc (HWND hTab, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procTabControl == 0) - rc = DefWindowProc (hTab, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procTabControl, hTab, msg, wp, lp); - - switch (msg) - { - // Since this is a subclass proc, it's not around when the window - // is created. Any WM_CREATE processing we'd ordinarily do here - // must therefore be done at the point where the tab control is - // subclassed. - // - // case WM_CREATE: - - case WM_SIZE: - if (lp != 0) - ResizeWindow (hTab, awdTabChild, rwaFixupGuts); - break; - - case WM_DESTROY: - if (procTabControl != 0) - SetWindowLong (hTab, GWL_WNDPROC, procTabControl); - break; - } - - return rc; -} - - -void Server_PrepareTabControl (HWND hTab) -{ - TabCtrl_SetImageList (hTab, AfsAppLib_CreateImageList (FALSE)); - - TCHAR szText[ cchRESOURCE ]; - TC_ITEM tci; - tci.mask = TCIF_TEXT | TCIF_PARAM | TCIF_IMAGE; - tci.pszText = szText; - - for (int iTab = 0; iTab < nCHILDTABS; ++iTab) - { - tci.iImage = CHILDTABINFO[ iTab ].iImage; - tci.lParam = (LPARAM)CHILDTABINFO[ iTab ].tab; - GetString (tci.pszText, CHILDTABINFO[ iTab ].idsTabTitle); - TabCtrl_InsertItem (hTab, iTab, &tci); - } - - // subclass the TCN_ window, so that it will start sending WM_SIZE - // messages to its child window. - // - procTabControl = GetWindowLong (hTab, GWL_WNDPROC); - SetWindowLong (hTab, GWL_WNDPROC, (LONG)Server_SubclassTabControlProc); - - // Since we just subclassed this control, our new wndproc wasn't around - // when the window was created. Any WM_CREATE processing we'd ordinarily - // in that wndproc must therefore be done here. - - // WM_CREATE: - RECT rWindow; - GetRectInParent (hTab, &rWindow); - ResizeWindow (hTab, awdTabChild, rwaMoveToHere, &rWindow); - - // Finally, select an appropriate tab and display it. - // - Server_DisplayTab (GetParent (hTab), gr.tabLast); -} - - -void Server_DisplayTab (HWND hDlg, CHILDTAB iTab) -{ - HWND hTab = GetDlgItem (hDlg, IDC_TABS); - int idd = -1; - DLGPROC dlgproc = NULL; - - switch (iTab) - { - case tabSERVICES: - idd = IDD_SERVICES; - dlgproc = (DLGPROC)Services_DlgProc; - break; - case tabAGGREGATES: - idd = IDD_AGGREGATES; - dlgproc = (DLGPROC)Aggregates_DlgProc; - break; - case tabFILESETS: - idd = IDD_FILESETS; - dlgproc = (DLGPROC)Filesets_DlgProc; - break; - } - - if (idd != -1) - { - HWND hDialogOld = GetTabChild (hTab); - HWND hDialogNew = ModelessDialog (idd, hTab, dlgproc); - - if (hDialogNew != NULL) - { - TabCtrl_SetCurSel (hTab, iTab); - ShowWindow (hDialogNew, SW_SHOW); - - if (hDialogOld != NULL) - { - DestroyWindow (hDialogOld); - } - - Server_ForceRedraw (hDlg); - } - } -} - - -void Server_Uncover (HWND hWnd) -{ - if (hWnd == g.hMain) // uncover the preview pane? - { - AfsAppLib_Uncover (GetDlgItem (g.hMain, IDC_TABS)); - } - else // uncover a standalone server window? - { - AfsAppLib_Uncover (hWnd); - } -} - - -void Server_SaveRect (HWND hDlg, BOOL fOpen) -{ - LPSVR_SETWINDOWPOS_PARAMS lpp = New (SVR_SETWINDOWPOS_PARAMS); - GetWindowRect (hDlg, &lpp->rWindow); - lpp->lpi = Server_GetServer (hDlg); - lpp->fOpen = fOpen; - - StartTask (taskSVR_SETWINDOWPOS, NULL, lpp); -} - - -BOOL Server_HandleDialogKeys (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_COMMAND) - { - switch (LOWORD(wp)) - { - case M_KEY_RETURN: - Server_OnKey_Return(); - return TRUE; - - case M_KEY_CTRLTAB: - Server_OnKey_CtrlTab (hDlg, TRUE); - return TRUE; - - case M_KEY_CTRLBACKTAB: - Server_OnKey_CtrlTab (hDlg, FALSE); - return TRUE; - - case M_KEY_TAB: - Server_OnKey_Tab (hDlg, TRUE); - return TRUE; - - case M_KEY_BACKTAB: - Server_OnKey_Tab (hDlg, FALSE); - return TRUE; - - case M_KEY_MENU: - Server_OnKey_Menu(); - return TRUE; - - case M_KEY_ESC: - Server_OnKey_Esc(); - return TRUE; - - case M_KEY_PROPERTIES: - Server_OnKey_Properties(); - return TRUE; - } - } - - return FALSE; -} - - -void Server_OnKey_Return (void) -{ - static NMHDR hdr; - hdr.hwndFrom = GetFocus(); - hdr.idFrom = GetWindowLong (GetFocus(), GWL_ID); - hdr.code = FLN_LDBLCLICK; - PostMessage (GetParent (GetFocus()), WM_NOTIFY, 0, (LPARAM)&hdr); -} - - -void Server_OnKey_Menu (void) -{ - HWND hFocus = GetFocus(); - if (fIsFastList (hFocus)) - { - POINT ptScreen = { 0, 0 }; - - HLISTITEM hItem; - if ((hItem = FastList_FindFirstSelected (hFocus)) != NULL) - { - FASTLISTITEMREGIONS reg; - FastList_GetItemRegions (hFocus, hItem, ®); - - ptScreen.x = reg.rItem.left + (reg.rItem.right -reg.rItem.left) /2; - ptScreen.y = reg.rItem.top + (reg.rItem.bottom -reg.rItem.top) /2; - ClientToScreen (GetFocus(), &ptScreen); - } - - PostMessage (GetParent (GetFocus()), WM_CONTEXTMENU, (WPARAM)GetFocus(), MAKELONG(ptScreen.x,ptScreen.y)); - } -} - - -void Server_OnKey_Esc (void) -{ - HWND hFocus = GetFocus(); - if (fIsFastList (hFocus)) - { - FastList_SelectNone (hFocus); - } -} - - -void Server_OnKey_Properties (void) -{ - HWND hFocus = GetFocus(); - if (fIsFastList (hFocus)) - { - LPIDENT lpi; - if ((lpi = (LPIDENT)FL_GetSelectedData (hFocus)) != NULL) - { - StartContextCommand (GetParent(hFocus), NULL, lpi, M_PROPERTIES); - } - } -} - - -void Server_OnKey_Tab (HWND hDlg, BOOL fForward) -{ - // The tab-cycle should go: - // TabControl <-> TabChildControls - // - HWND hFocus = GetFocus(); - HWND hTabChild = GetTabChild (GetDlgItem (hDlg, IDC_TABS)); - - if (fForward) - { - if (hFocus == GetDlgItem (hDlg, IDC_TABS)) - { - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, NULL, FALSE), TRUE); - } - else - { - if (GetNextDlgTabItem (hTabChild, hFocus, FALSE) == GetNextDlgTabItem (hTabChild, NULL, FALSE)) - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_TABS), TRUE); - else - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, hFocus, FALSE), TRUE); - } - } - else // (!fForward) - { - if (hFocus == GetDlgItem (hDlg, IDC_TABS)) - { - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetLastDlgTabItem (hTabChild), TRUE); - } - else - { - if (hFocus == GetNextDlgTabItem (hTabChild, NULL, FALSE)) - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_TABS), TRUE); - else - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, hFocus, TRUE), TRUE); - } - } -} - - -void Server_OnKey_CtrlTab (HWND hDlg, BOOL fForward) -{ - HWND hTabs = GetDlgItem (hDlg, IDC_TABS); - int iTab = TabCtrl_GetCurSel(hTabs); - - if (fForward) - iTab = (iTab == nCHILDTABS-1) ? (0) : (iTab+1); - else - iTab = (iTab == 0) ? (nCHILDTABS-1) : (iTab-1); - - TabCtrl_SetCurSel (hTabs, iTab); - Server_DisplayTab (hDlg, (CHILDTAB)iTab); - gr.tabLast = (CHILDTAB)iTab; - - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)hTabs, TRUE); -} - diff --git a/src/WINNT/afssvrmgr/svr_window.h b/src/WINNT/afssvrmgr/svr_window.h deleted file mode 100644 index 3da22b2f9..000000000 --- a/src/WINNT/afssvrmgr/svr_window.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVR_WINDOW_H -#define SVR_WINDOW_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define SERVERWINDOW_PREVIEWPANE g.hMain /* pass this as hWnd below... */ - -typedef struct - { - LPIDENT lpi; - RECT rWindow; - BOOL fOpen; - } SVR_SETWINDOWPOS_PARAMS, *LPSVR_SETWINDOWPOS_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Server_Open (LPIDENT lpiServer, LPRECT prWindow); -void Server_Close (LPIDENT lpiServer); -void Server_CloseAll (BOOL fUserRequested); - -void Server_PrepareTabControl (HWND hTab); - -HWND Server_GetCurrentTab (HWND hWnd); -CHILDTAB Server_GetDisplayedTab (HWND hWnd); -void Server_SelectServer (HWND hDlg, LPIDENT lpiNew, BOOL fForceRedraw = FALSE); -LPIDENT Server_GetServer (HWND hWnd); -LPIDENT Server_GetServerForChild (HWND hChild); -HWND Server_GetWindowForChild (HWND hChild); -void Server_ForceRedraw (HWND hWnd); -void Server_DisplayTab (HWND hWnd, CHILDTAB iTab); -void Server_Uncover (HWND hWnd); - -void Server_OnKey_Return (void); -void Server_OnKey_Menu (void); -void Server_OnKey_Esc (void); -void Server_OnKey_Properties (void); -void Server_OnKey_Tab (HWND hDlg, BOOL fForward); -void Server_OnKey_CtrlTab (HWND hDlg, BOOL fForward); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svrmgr.cpp b/src/WINNT/afssvrmgr/svrmgr.cpp deleted file mode 100644 index eb1aec257..000000000 --- a/src/WINNT/afssvrmgr/svrmgr.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "svr_col.h" -#include "svc_col.h" -#include "agg_col.h" -#include "set_col.h" -#include "svr_security.h" -#include "creds.h" -#include "propcache.h" -#include "action.h" -#include "subset.h" -#include "messages.h" -#include "cmdline.h" - -extern "C" { -#include -} // extern "C" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -GLOBALS g; -GLOBALS_RESTORED gr; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow); -void ExitApplication (void); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmdLineA, int nCmdShow) -{ - LPTSTR pszCmdLine = AnsiToString (pszCmdLineA); - - if (InitApplication (hInst, pszCmdLine, nCmdShow)) - { - AfsAppLib_MainPump(); - - ExitApplication(); - } - - FreeString (pszCmdLine, pszCmdLineA); - return g.rc; -} - - -BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow) -{ - TaLocale_LoadCorrespondingModule (hInst); - - memset (&g, 0x00, sizeof(g)); - g.hInst = hInst; - g.hAccel = TaLocale_LoadAccelerators (ACCEL_MAIN); - - HWND hPrevious; - TCHAR szTitle[ cchRESOURCE ]; - GetString (szTitle, IDS_APP_TITLE); - if ((hPrevious = FindWindow (TEXT("AFSManagerClass"), szTitle)) != NULL) - { - SetFocus (hPrevious); - SendMessage (hPrevious, WM_SHOW_YOURSELF, 0, 0); - return FALSE; - } - - AfsAppLib_SetAppName(szTitle); - AfsAppLib_SetPumpRoutine(PumpMessage); - - TASKQUEUE_PARAMS tqp; - memset (&tqp, 0x00, sizeof(tqp)); - tqp.nThreadsMax = 10; - tqp.fnCreateTaskPacket = CreateTaskPacket; - tqp.fnPerformTask = PerformTask; - tqp.fnFreeTaskPacket = FreeTaskPacket; - AfsAppLib_InitTaskQueue (&tqp); - - Main_ConfigureHelp(); - - // Determine how the app is supposed to look--that is, remember what it - // looked like last time, and if there was no "last time", pick some - // decent defaults. - // - if (!RestoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED)) - { - memset (&gr, 0x00, sizeof(gr)); - SetRectEmpty (&gr.rMain); - SetRectEmpty (&gr.rMainPreview); - SetRectEmpty (&gr.rServerLast); - SetRectEmpty (&gr.rViewLog); - SetRectEmpty (&gr.rActions); - - gr.fPreview = TRUE; - gr.fVert = TRUE; - gr.fActions = FALSE; - - gr.tabLast = tabFILESETS; - - Server_SetDefaultView_Horz (&gr.diHorz.viewSvr); - Server_SetDefaultView_Vert (&gr.diVert.viewSvr); - Services_SetDefaultView (&gr.viewSvc); - Aggregates_SetDefaultView (&gr.viewAgg); - Filesets_SetDefaultView (&gr.viewSet); - Replicas_SetDefaultView (&gr.viewRep); - Action_SetDefaultView (&gr.viewAct); - Server_Key_SetDefaultView (&gr.viewKey); - - gr.diHorz.cSplitter = -100; - gr.diVert.cSplitter = -89; - - gr.cbQuotaUnits = cb1KB; - - gr.fOpenMonitors = TRUE; - gr.fCloseUnmonitors = TRUE; - gr.fServerLongNames = FALSE; - gr.fDoubleClickOpens = 2; - gr.fWarnBadCreds = TRUE; - - gr.ivSvr = ivSTATUS; - gr.ivAgg = ivSTATUS; - gr.ivSet = ivSTATUS; - gr.ivSvc = ivSTATUS; - } - - ULONG status; - if (!AfsClass_Initialize (&status)) - { - if (status == ADMCLIENTCANTINITAFSLOCATION) - ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL); - else - ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN); - return FALSE; - } - - AfsClass_RequestLongServerNames (gr.fServerLongNames); - AfsClass_SpecifyRefreshDomain (AFSCLASS_WANT_VOLUMES); - - // Create a notification object for the AFSClass library, so that it can - // let us know when anything changes. The notification handler we'll - // install will take requests from the rest of the SVRMGR package and - // forward notifications around to whichever windows are actually - // interested. - // - CreateNotificationDispatch(); - - // Create a few variations on WC_DIALOG, so we get appropriate icons on - // our windows. - // - WNDCLASS wc; - GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc); - wc.hInstance = THIS_HINST; - wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); - wc.lpszClassName = TEXT("AFSManagerClass"); - wc.style |= CS_GLOBALCLASS; - RegisterClass (&wc); - - GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc); - wc.hInstance = THIS_HINST; - wc.hIcon = TaLocale_LoadIcon (IDI_SERVER); - wc.lpszClassName = TEXT("ServerWindowClass"); - wc.style |= CS_GLOBALCLASS; - RegisterClass (&wc); - - // Okay, the big step: create the main window (ie, the servers list). - // Note that it doesn't get shown yet! - // - CMDLINEOP op = ParseCommandLine (pszCmdLine); - if (op == opCLOSEAPP) - return FALSE; - - if (op == opLOOKUPERRORCODE) - { - Help_FindError(); - return FALSE; - } - - g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DialogProc); - if (g.hMain == NULL) - return FALSE; - - if (op != opNOCELLDIALOG) - { - if (OpenCellDialog() != IDOK) - return FALSE; - } - - return TRUE; -} - - -void ExitApplication (void) -{ -} - - -void Quit (int rc) -{ - if (g.hMain && IsWindow(g.hMain)) - { - if (gr.fPreview && !gr.fVert) - FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diHorz.viewSvr); - else - FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diVert.viewSvr); - - WINDOWPLACEMENT wpl; - wpl.length = sizeof(wpl); - if (GetWindowPlacement (g.hMain, &wpl)) - { - if (gr.fPreview) - gr.rMainPreview = wpl.rcNormalPosition; - else - gr.rMain = wpl.rcNormalPosition; - } - } - - StoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED); - - if (Subsets_SaveIfDirty (g.sub)) - { - if (Action_fAnyActive()) // just *pretend* to close the app - { - Action_WindowToTop (FALSE); - ShowWindow (g.hMain, SW_HIDE); - } - else - { - g.rc = rc; - PostQuitMessage (g.rc); - } - } -} - - -void PumpMessage (MSG *lpm) -{ - if (g.hMain && IsWindow (g.hMain)) - { - if (GetActiveWindow()) - { - if (TranslateAccelerator (GetActiveWindow(), g.hAccel, lpm)) - return; - } - } - - if (!IsMemoryManagerMessage (lpm)) - { - TranslateMessage (lpm); - DispatchMessage (lpm); - } -} - - -BOOL cdecl StartThread (DWORD (WINAPI *lpfnStart)(PVOID lp), ...) -{ - va_list arg; - va_start (arg, lpfnStart); - PVOID lp = va_arg (arg, PVOID); - - DWORD dwThreadID; - HANDLE hThread; - - if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)lpfnStart, lp, 0, &dwThreadID)) == NULL) - return FALSE; - - SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL); - return TRUE; -} - diff --git a/src/WINNT/afssvrmgr/svrmgr.h b/src/WINNT/afssvrmgr/svrmgr.h deleted file mode 100644 index ed3f4477e..000000000 --- a/src/WINNT/afssvrmgr/svrmgr.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SVRMGR_H -#define SVRMGR_H - - -/* - * COMMON HEADERS _____________________________________________________________ - * - */ - -#include -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifdef _DEBUG -#ifndef DEBUG -#define DEBUG -#endif -#endif - -#ifndef cb1KB -#define cb1KB 1024L -#endif - -#ifndef ck1MB -#define ck1MB 1024L -#endif - -#ifndef cb1MB -#define cb1MB 1048576L -#endif - -#ifndef ck1GB -#define ck1GB 1048576L -#endif - -#ifndef ck1TB -#define ck1TB (unsigned long)0x40000000 // 1073741824L == 1024^3 -#endif - -#define cszENDING_REPLICA TEXT(".readonly") -#define cszENDING_CLONE TEXT(".clone") - -#define REGSTR_SETTINGS_BASE HKCU -#define REGSTR_SETTINGS_PATH TEXT("Software\\TransarcCorporation\\AFS Server Manager") -#define REGVAL_SETTINGS TEXT("Settings") -#define REGSTR_SETTINGS_PREFS TEXT("Software\\TransarcCorporation\\AFS Server Manager\\Preferences") -#define REGSTR_SETTINGS_CELLS REGSTR_SETTINGS_PREFS - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include "resource.h" -#include "window.h" -#include "dispatch.h" -#include "alert.h" -#include "general.h" -#include "subset.h" -#include "prefs.h" - -#include "help.hid" -#define cszHELPFILENAME TEXT("TaAfsSvrMgr.hlp") - - -/* - * STRUCTURES _________________________________________________________________ - * - */ - -typedef enum // CHILDTAB - { - tabINVALID = -1, - tabFILESETS = 0, - tabAGGREGATES, - tabSERVICES - } CHILDTAB; - -typedef struct // DISPLAYINFO - { - LONG cSplitter; // splitter between servers and tabs - VIEWINFO viewSvr; - } DISPLAYINFO; - -typedef struct // SERVER_PREF - { - OBJECTALERTS oa; - - short perWarnAggFull; // ==0 to disable warning - short perWarnSetFull; // ==0 to disable warning - BOOL fWarnSvcStop; // ==FALSE to disable warning - BOOL fWarnSvrTimeout; // ==FALSE to disable warning - BOOL fWarnSetNoVLDB; // ==FALSE to disable warning - BOOL fWarnSetNoServ; // ==FALSE to disable warning - BOOL fWarnAggNoServ; // ==FALSE to disable warning - BOOL fWarnAggAlloc; // ==FALSE to disable warning - - RECT rLast; - BOOL fOpen; - BOOL fIsMonitored; - BOOL fExpandTree; - SERVERSTATUS ssLast; - } SERVER_PREF, *LPSERVER_PREF; - -#define wVerSERVER_PREF MAKEVERSION(2,1) - - -typedef struct // SERVICE_PREF - { - OBJECTALERTS oa; - - BOOL fWarnSvcStop; - TCHAR szLogFile[ MAX_PATH ]; - - SERVICESTATUS ssLast; - } SERVICE_PREF, *LPSERVICE_PREF; - -#define wVerSERVICE_PREF MAKEVERSION(1,0) - - -typedef struct // AGGREGATE_PREF - { - OBJECTALERTS oa; - short perWarnAggFull; // ==0 to disable, ==-1 for svr default - BOOL fWarnAggAlloc; // ==FALSE to disable warning - - TCHAR szDevice[ cchNAME ]; - AGGREGATESTATUS asLast; - BOOL fExpandTree; - } AGGREGATE_PREF, *LPAGGREGATE_PREF; - -#define wVerAGGREGATE_PREF MAKEVERSION(2,1) - - -typedef struct // FILESET_PREF - { - OBJECTALERTS oa; - short perWarnSetFull; // ==0 to disable, ==-1 for svr default - - FILESETSTATUS fsLast; - LPIDENT lpiRW; - } FILESET_PREF, *LPFILESET_PREF; - -#define wVerFILESET_PREF MAKEVERSION(1,1) - - -typedef enum // ICONVIEW - { - ivTWOICONS, - ivONEICON, - ivSTATUS - } ICONVIEW, *LPICONVIEW; - -typedef struct - { - HINSTANCE hInst; - HWND hMain; - HWND hAction; - HACCEL hAccel; - int rc; - LPIDENT lpiCell; - - LPSUBSET sub; - PVOID hCreds; - } GLOBALS; - -typedef struct - { - // Window placement - // - RECT rMain; - RECT rMainPreview; - RECT rServerLast; - RECT rActions; - BOOL fPreview; - BOOL fVert; - BOOL fActions; - - // How is information viewed? - // - CHILDTAB tabLast; - VIEWINFO viewSvc; - VIEWINFO viewAgg; - VIEWINFO viewSet; - VIEWINFO viewRep; - VIEWINFO viewAggMove; - VIEWINFO viewAggCreate; - VIEWINFO viewAggRestore; - VIEWINFO viewAct; - VIEWINFO viewKey; - DISPLAYINFO diHorz; - DISPLAYINFO diVert; - RECT rViewLog; - size_t cbQuotaUnits; - BOOL fOpenMonitors; - BOOL fCloseUnmonitors; - BOOL fServerLongNames; - BOOL fDoubleClickOpens; // 0=Properties, 1=Open, 2=Depends (PreviewPane) - BOOL fWarnBadCreds; - ICONVIEW ivSvr; - ICONVIEW ivAgg; - ICONVIEW ivSet; - ICONVIEW ivSvc; - } GLOBALS_RESTORED; - -#define wVerGLOBALS_RESTORED MAKEVERSION(2,3) - - -extern GLOBALS g; -extern GLOBALS_RESTORED gr; - -/* - * OTHER INCLUSIONS ___________________________________________________________ - * - */ - -#include "task.h" -#include "helpfunc.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Quit (int rc); - -void PumpMessage (MSG *lpm); - -// StartThread() accepts any 32-bit quantity as its second parameter; -// it uses '...' so you won't have to cast the thing regardless of what it -// is--an HWND fits through just as easily as an LPIDENT. -// -BOOL cdecl StartThread (DWORD (WINAPI *lpfnStart)(PVOID lp), ...); - - -#endif - diff --git a/src/WINNT/afssvrmgr/svrmgr_stub.rc b/src/WINNT/afssvrmgr/svrmgr_stub.rc deleted file mode 100644 index eeb526be3..000000000 --- a/src/WINNT/afssvrmgr/svrmgr_stub.rc +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Server Manager" -#define AFS_VERINFO_NAME "svrmgr" -#define AFS_VERINFO_FILENAME "svrmgr.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -IDI_MAIN ICON DISCARDABLE "resource\\afssvrmgr.ico" -AVI_SETMOVE AVI DISCARDABLE "Resource\\setmove.avi" diff --git a/src/WINNT/afssvrmgr/task.cpp b/src/WINNT/afssvrmgr/task.cpp deleted file mode 100644 index 775d2675e..000000000 --- a/src/WINNT/afssvrmgr/task.cpp +++ /dev/null @@ -1,2788 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include "task.h" -#include "display.h" -#include "action.h" -#include "svr_general.h" -#include "svr_window.h" -#include "svr_prop.h" -#include "svr_syncvldb.h" -#include "svr_salvage.h" -#include "svr_install.h" -#include "svr_uninstall.h" -#include "svr_prune.h" -#include "svr_getdates.h" -#include "svr_execute.h" -#include "svr_security.h" -#include "svr_address.h" -#include "svc_prop.h" -#include "svc_create.h" -#include "svc_general.h" -#include "svc_startstop.h" -#include "svc_viewlog.h" -#include "agg_general.h" -#include "agg_prop.h" -#include "set_create.h" -#include "set_delete.h" -#include "set_move.h" -#include "set_prop.h" -#include "set_general.h" -#include "set_quota.h" -#include "set_repprop.h" -#include "set_createrep.h" -#include "set_rename.h" -#include "set_release.h" -#include "set_clone.h" -#include "set_dump.h" -#include "set_restore.h" -#include "subset.h" -#include "messages.h" -#include "creds.h" - - -#ifdef DEBUG -#include -#endif - - -// As an additional debugging measure, you may want to enable the -// definition below--doing so causes the tool to ensure that -// AFSCLASS's critical section (accessed via AfsClass_Enter()/Leave()) is -// not leaking during tasks: for instance, if AfsClass_MoveFileset() -// calls AfsClass_Enter() three times but Leave() only twice, then an -// assertion will trigger in Task_Perform() (at which point it is -// not too late to easily determine which task leaked the critsec). -// Unfortunately, this has a side-effect: enabling the definition -// below prevents the AFSCLASS library from entirely exiting the -// critical section during its work--which means that only one -// AfsClass_* function can ever be run at once. So, enable this -// definition if you see a lockup--and disable it when you're done. -// -#ifdef DEBUG -// #define DEBUG_CRIT -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -#ifdef DEBUG -void Task_ExportCell (LPTASKPACKET ptp); -#endif -void Task_OpenCell (LPTASKPACKET ptp); -void Task_OpenedCell (LPTASKPACKET ptp); -void Task_ClosedCell (LPTASKPACKET ptp); -void Task_Refresh (LPTASKPACKET ptp, BOOL fNewCreds); -void Task_Subset_To_List (LPTASKPACKET ptp); -void Task_Apply_Subset (LPTASKPACKET ptp); -void Task_Svr_Prop_Init (LPTASKPACKET ptp); -void Task_Svr_Scout_Init (LPTASKPACKET ptp); -void Task_Svr_Scout_Apply (LPTASKPACKET ptp); -void Task_Svr_Enum_To_ComboBox (LPTASKPACKET ptp); -void Task_Svr_GetWindowPos (LPTASKPACKET ptp); -void Task_Svr_SetWindowPos (LPTASKPACKET ptp); -void Task_Svr_SyncVLDB (LPTASKPACKET ptp); -void Task_Svr_Salvage (LPTASKPACKET ptp); -void Task_Svr_Install (LPTASKPACKET ptp); -void Task_Svr_Uninstall (LPTASKPACKET ptp); -void Task_Svr_Prune (LPTASKPACKET ptp); -void Task_Svr_GetDates (LPTASKPACKET ptp); -void Task_Svr_Execute (LPTASKPACKET ptp); -void Task_Svr_SetAuth (LPTASKPACKET ptp); -void Task_Svr_AdmList_Open (LPTASKPACKET ptp); -void Task_Svr_AdmList_Save (LPTASKPACKET ptp); -void Task_Svr_KeyList_Open (LPTASKPACKET ptp); -void Task_Svr_Key_Create (LPTASKPACKET ptp); -void Task_Svr_Key_Delete (LPTASKPACKET ptp); -void Task_Svr_HostList_Open (LPTASKPACKET ptp); -void Task_Svr_HostList_Save (LPTASKPACKET ptp); -void Task_Svr_GetRandomKey (LPTASKPACKET ptp); -void Task_Svr_Monitor_OnOff (LPTASKPACKET ptp); -void Task_Svr_ChangeAddr (LPTASKPACKET ptp); -void Task_Svc_Menu (LPTASKPACKET ptp); -void Task_Svc_Prop_Init (LPTASKPACKET ptp); -void Task_Svc_Prop_Apply (LPTASKPACKET ptp); -void Task_Svc_Start (LPTASKPACKET ptp); -void Task_Svc_Stop (LPTASKPACKET ptp); -void Task_Svc_Restart (LPTASKPACKET ptp); -void Task_Svc_FindLog (LPTASKPACKET ptp); -void Task_Svc_ViewLog (LPTASKPACKET ptp); -void Task_Svc_Create (LPTASKPACKET ptp); -void Task_Svc_Delete (LPTASKPACKET ptp); -void Task_Svc_GetRestartTimes (LPTASKPACKET ptp); -void Task_Svc_SetRestartTimes (LPTASKPACKET ptp); -void Task_Agg_Prop_Init (LPTASKPACKET ptp); -void Task_Agg_Prop_Apply (LPTASKPACKET ptp); -void Task_Agg_Find_Quota_Limits (LPTASKPACKET ptp); -void Task_Agg_Enum_To_ListView (LPTASKPACKET ptp); -void Task_Agg_Enum_To_ComboBox (LPTASKPACKET ptp); -void Task_Agg_Find_Ghost (LPTASKPACKET ptp); -void Task_Set_Enum_To_ComboBox (LPTASKPACKET ptp); -void Task_Set_Find_Ghost (LPTASKPACKET ptp); -void Task_Set_Create (LPTASKPACKET ptp); -void Task_Set_Delete (LPTASKPACKET ptp); -void Task_Set_Move (LPTASKPACKET ptp); -void Task_Set_MoveTo_Init (LPTASKPACKET ptp); -void Task_Set_Prop_Init (LPTASKPACKET ptp); -void Task_Set_Prop_Apply (LPTASKPACKET ptp); -void Task_Set_SetQuota_Init (LPTASKPACKET ptp); -void Task_Set_SetQuota_Apply (LPTASKPACKET ptp); -void Task_Set_RepProp_Init (LPTASKPACKET ptp); -void Task_Set_Select (LPTASKPACKET ptp); -void Task_Set_BeginDrag (LPTASKPACKET ptp); -void Task_Set_DragMenu (LPTASKPACKET ptp); -void Task_Set_Menu (LPTASKPACKET ptp); -void Task_Set_Lock (LPTASKPACKET ptp); -void Task_Set_Unlock (LPTASKPACKET ptp); -void Task_Set_CreateRep (LPTASKPACKET ptp); -void Task_Set_Rename_Init (LPTASKPACKET ptp); -void Task_Set_Rename_Apply (LPTASKPACKET ptp); -void Task_Set_Release (LPTASKPACKET ptp); -void Task_Set_Clone (LPTASKPACKET ptp); -void Task_Set_Clonesys (LPTASKPACKET ptp); -void Task_Set_Dump (LPTASKPACKET ptp); -void Task_Set_Restore (LPTASKPACKET ptp); -void Task_Set_Lookup (LPTASKPACKET ptp); -void Task_Expired_Creds (LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPTASKPACKET CreateTaskPacket (int idTask, HWND hReply, PVOID lpUser) -{ - LPTASKPACKET ptp; - - if ((ptp = New (TASKPACKET)) != NULL) - { - memset (ptp, 0x00, sizeof(TASKPACKET)); - - ptp->idTask = idTask; - ptp->hReply = hReply; - ptp->lpUser = lpUser; - - ptp->rc = TRUE; - ptp->status = 0; - - if ((ptp->pReturn = New (TASKPACKETDATA)) != NULL) - { - memset (ptp->pReturn, 0x00, sizeof(TASKPACKETDATA)); - } - } - - return ptp; -} - - -void FreeTaskPacket (LPTASKPACKET ptp) -{ - if (ptp) - { - if (ptp->pReturn) - { - if (TASKDATA(ptp)->pszText1) - FreeString (TASKDATA(ptp)->pszText1); - if (TASKDATA(ptp)->pszText2) - FreeString (TASKDATA(ptp)->pszText2); - if (TASKDATA(ptp)->pszText3) - FreeString (TASKDATA(ptp)->pszText3); - Delete (ptp->pReturn); - } - - Delete (ptp); - } -} - - -void PerformTask (LPTASKPACKET ptp) -{ -#ifdef DEBUG_CRIT - AfsClass_Enter(); - ASSERT( AfsClass_GetEnterCount() == 1 ); -#endif - - switch (ptp->idTask) - { -#ifdef DEBUG - case taskEXPORTCELL: - Task_ExportCell (ptp); - break; -#endif - - case taskOPENCELL: - Task_OpenCell (ptp); - break; - - case taskOPENEDCELL: - Task_OpenedCell (ptp); - break; - - case taskCLOSEDCELL: - Task_ClosedCell (ptp); - break; - - case taskREFRESH: - Task_Refresh (ptp, FALSE); - break; - - case taskREFRESH_CREDS: - Task_Refresh (ptp, TRUE); - break; - - case taskSUBSET_TO_LIST: - Task_Subset_To_List (ptp); - break; - - case taskAPPLY_SUBSET: - Task_Apply_Subset (ptp); - break; - - case taskSVR_PROP_INIT: - Task_Svr_Prop_Init (ptp); - break; - - case taskSVR_SCOUT_INIT: - Task_Svr_Scout_Init (ptp); - break; - - case taskSVR_SCOUT_APPLY: - Task_Svr_Scout_Apply (ptp); - break; - - case taskSVR_ENUM_TO_COMBOBOX: - Task_Svr_Enum_To_ComboBox (ptp); - break; - - case taskSVR_GETWINDOWPOS: - Task_Svr_GetWindowPos (ptp); - break; - - case taskSVR_SETWINDOWPOS: - Task_Svr_SetWindowPos (ptp); - break; - - case taskSVR_SYNCVLDB: - Task_Svr_SyncVLDB (ptp); - break; - - case taskSVR_SALVAGE: - Task_Svr_Salvage (ptp); - break; - - case taskSVR_INSTALL: - Task_Svr_Install (ptp); - break; - - case taskSVR_UNINSTALL: - Task_Svr_Uninstall (ptp); - break; - - case taskSVR_PRUNE: - Task_Svr_Prune (ptp); - break; - - case taskSVR_GETDATES: - Task_Svr_GetDates (ptp); - break; - - case taskSVR_EXECUTE: - Task_Svr_Execute (ptp); - break; - - case taskSVR_SETAUTH: - Task_Svr_SetAuth (ptp); - break; - - case taskSVR_ADMLIST_OPEN: - Task_Svr_AdmList_Open (ptp); - break; - - case taskSVR_ADMLIST_SAVE: - Task_Svr_AdmList_Save (ptp); - break; - - case taskSVR_KEYLIST_OPEN: - Task_Svr_KeyList_Open (ptp); - break; - - case taskSVR_KEY_CREATE: - Task_Svr_Key_Create (ptp); - break; - - case taskSVR_KEY_DELETE: - Task_Svr_Key_Delete (ptp); - break; - - case taskSVR_GETRANDOMKEY: - Task_Svr_GetRandomKey (ptp); - break; - - case taskSVR_HOSTLIST_OPEN: - Task_Svr_HostList_Open (ptp); - break; - - case taskSVR_HOSTLIST_SAVE: - Task_Svr_HostList_Save (ptp); - break; - - case taskSVR_MONITOR_ONOFF: - Task_Svr_Monitor_OnOff (ptp); - break; - - case taskSVR_CHANGEADDR: - Task_Svr_ChangeAddr (ptp); - break; - - case taskSVC_MENU: - Task_Svc_Menu (ptp); - break; - - case taskSVC_PROP_INIT: - Task_Svc_Prop_Init (ptp); - break; - - case taskSVC_PROP_APPLY: - Task_Svc_Prop_Apply (ptp); - break; - - case taskSVC_START: - Task_Svc_Start (ptp); - break; - - case taskSVC_STOP: - Task_Svc_Stop (ptp); - break; - - case taskSVC_RESTART: - Task_Svc_Restart (ptp); - break; - - case taskSVC_FINDLOG: - Task_Svc_FindLog (ptp); - break; - - case taskSVC_VIEWLOG: - Task_Svc_ViewLog (ptp); - break; - - case taskSVC_CREATE: - Task_Svc_Create (ptp); - break; - - case taskSVC_DELETE: - Task_Svc_Delete (ptp); - break; - - case taskSVC_GETRESTARTTIMES: - Task_Svc_GetRestartTimes (ptp); - break; - - case taskSVC_SETRESTARTTIMES: - Task_Svc_SetRestartTimes (ptp); - break; - - case taskAGG_PROP_INIT: - Task_Agg_Prop_Init (ptp); - break; - - case taskAGG_PROP_APPLY: - Task_Agg_Prop_Apply (ptp); - break; - - case taskAGG_FIND_QUOTA_LIMITS: - Task_Agg_Find_Quota_Limits (ptp); - break; - - case taskAGG_ENUM_TO_LISTVIEW: - Task_Agg_Enum_To_ListView (ptp); - break; - - case taskAGG_ENUM_TO_COMBOBOX: - Task_Agg_Enum_To_ComboBox (ptp); - break; - - case taskAGG_FIND_GHOST: - Task_Agg_Find_Ghost (ptp); - break; - - case taskSET_ENUM_TO_COMBOBOX: - Task_Set_Enum_To_ComboBox (ptp); - break; - - case taskSET_FIND_GHOST: - Task_Set_Find_Ghost (ptp); - break; - - case taskSET_CREATE: - Task_Set_Create (ptp); - break; - - case taskSET_DELETE: - Task_Set_Delete (ptp); - break; - - case taskSET_MOVE: - Task_Set_Move (ptp); - break; - - case taskSET_MOVETO_INIT: - Task_Set_MoveTo_Init (ptp); - break; - - case taskSET_PROP_INIT: - Task_Set_Prop_Init (ptp); - break; - - case taskSET_PROP_APPLY: - Task_Set_Prop_Apply (ptp); - break; - - case taskSET_SETQUOTA_INIT: - Task_Set_SetQuota_Init (ptp); - break; - - case taskSET_SETQUOTA_APPLY: - Task_Set_SetQuota_Apply (ptp); - break; - - case taskSET_REPPROP_INIT: - Task_Set_RepProp_Init (ptp); - break; - - case taskSET_SELECT: - Task_Set_Select (ptp); - break; - - case taskSET_BEGINDRAG: - Task_Set_BeginDrag (ptp); - break; - - case taskSET_DRAGMENU: - Task_Set_DragMenu (ptp); - break; - - case taskSET_MENU: - Task_Set_Menu (ptp); - break; - - case taskSET_LOCK: - Task_Set_Lock (ptp); - break; - - case taskSET_UNLOCK: - Task_Set_Unlock (ptp); - break; - - case taskSET_CREATEREP: - Task_Set_CreateRep (ptp); - break; - - case taskSET_RENAME_INIT: - Task_Set_Rename_Init (ptp); - break; - - case taskSET_RENAME_APPLY: - Task_Set_Rename_Apply (ptp); - break; - - case taskSET_RELEASE: - Task_Set_Release (ptp); - break; - - case taskSET_CLONE: - Task_Set_Clone (ptp); - break; - - case taskSET_CLONESYS: - Task_Set_Clonesys (ptp); - break; - - case taskSET_DUMP: - Task_Set_Dump (ptp); - break; - - case taskSET_RESTORE: - Task_Set_Restore (ptp); - break; - - case taskSET_LOOKUP: - Task_Set_Lookup (ptp); - break; - - case taskEXPIRED_CREDS: - Task_Expired_Creds (ptp); - break; - - default: - ptp->rc = FALSE; - ptp->status = ERROR_INVALID_FUNCTION; - break; - } - -#ifdef DEBUG_CRIT - ASSERT( AfsClass_GetEnterCount() == 1 ); - AfsClass_Leave(); -#endif -} - - -void CoverServerList (LPIDENT lpiCell, ULONG status) -{ - TCHAR szName[ cchRESOURCE ]; - lpiCell->GetCellName (szName); - - int idsButton; - - switch (status) - { - case ERROR_NOT_AUTHENTICATED: - idsButton = IDS_ALERT_BUTTON_GETCREDS; - break; - default: - idsButton = IDS_ALERT_BUTTON_TRYAGAIN; - break; - } - - - LPTSTR pszCover = FormatString (IDS_ERROR_REFRESH_CELLSERVERS, TEXT("%s%e"), szName, status); - LPTSTR pszButton = FormatString (idsButton); - - AfsAppLib_CoverWindow (GetDlgItem (g.hMain, IDC_SERVERS), pszCover, pszButton); - - FreeString (pszButton); - FreeString (pszCover); -} - - -#ifdef DEBUG -ULONG SystemTimeToUnixTime (SYSTEMTIME *pst) -{ - SYSTEMTIME st; - if (pst == NULL) - GetSystemTime (&st); - else - st = *pst; - - FILETIME ft; - if (!SystemTimeToFileTime (&st, &ft)) - return 0; - - LARGE_INTEGER now; - now.HighPart = (LONG)ft.dwHighDateTime; - now.LowPart = (ULONG)ft.dwLowDateTime; - - LARGE_INTEGER offset; - offset.HighPart = 0x019db1de; - offset.LowPart = 0xd53e8000; - - LARGE_INTEGER result; - result.QuadPart = (now.QuadPart - offset.QuadPart) / 10000000; - return (ULONG)result.LowPart; -} - -static size_t nExportLevels = 0; -void Task_ExportCell_Spacing (LPTSTR pszSpacing) -{ - wsprintf (pszSpacing, TEXT("%99s"), TEXT("")); - pszSpacing[ nExportLevels *3 ] = TEXT('\0'); -} - -#define chLBRC TEXT('{') -#define chRBRC TEXT('}') - -void Task_ExportCell_Begin (HANDLE fh, LPTSTR eck, LPTSTR pszName) -{ - TCHAR szSpacing[ 256 ]; - Task_ExportCell_Spacing (szSpacing); - TCHAR szLine[ 256 ]; - wsprintf (szLine, TEXT("\r\n%s%s %s %c\r\n"), szSpacing, eck, pszName, chLBRC); - DWORD cbWrote = 0; - WriteFile (fh, szLine, lstrlen(szLine), &cbWrote, NULL); - ++nExportLevels; -} - -void Task_ExportCell_End (HANDLE fh) -{ - --nExportLevels; - TCHAR szSpacing[ 256 ]; - Task_ExportCell_Spacing (szSpacing); - TCHAR szLine[ 256 ]; - wsprintf (szLine, TEXT("%s%c\r\n"), szSpacing, chRBRC); - DWORD cbWrote = 0; - WriteFile (fh, szLine, lstrlen(szLine), &cbWrote, NULL); -} - -void Task_ExportCell_Line (HANDLE fh, LPTSTR eck, LPTSTR pszRHS) -{ - TCHAR szSpacing[ 256 ]; - Task_ExportCell_Spacing (szSpacing); - TCHAR szLine[ 256 ]; - wsprintf (szLine, TEXT("%s%s = \"%s\"\r\n"), szSpacing, eck, pszRHS); - DWORD cbWrote = 0; - WriteFile (fh, szLine, lstrlen(szLine), &cbWrote, NULL); -} - -void Task_ExportCell_LineAddr (HANDLE fh, LPTSTR eck, SOCKADDR_IN *pAddr) -{ - LPSTR pszLine = FormatString (TEXT("%1"), TEXT("%a"), pAddr); - Task_ExportCell_Line (fh, eck, pszLine); - FreeString (pszLine); -} - -void Task_ExportCell_LineInt (HANDLE fh, LPTSTR eck, int dw) -{ - TCHAR szLine[256]; - wsprintf (szLine, TEXT("%lu"), dw); - Task_ExportCell_Line (fh, eck, szLine); -} - -void Task_ExportCell_LineLarge (HANDLE fh, LPTSTR eck, LARGE_INTEGER *pldw) -{ - TCHAR szLine[256]; - wsprintf (szLine, TEXT("%lu,,%lu"), pldw->HighPart, pldw->LowPart); - Task_ExportCell_Line (fh, eck, szLine); -} - -void Task_ExportCell_LineDate (HANDLE fh, LPTSTR eck, SYSTEMTIME *pst) -{ - Task_ExportCell_LineInt (fh, eck, SystemTimeToUnixTime(pst)); -} - -void Task_ExportService (HANDLE fh, LPSERVICE lpService) -{ - TCHAR szName[ cchNAME ]; - lpService->GetName (szName); - Task_ExportCell_Begin (fh, eckSERVICE, szName); - - SERVICESTATUS ss; - if (lpService->GetStatus (&ss)) - { - Task_ExportCell_LineInt (fh, eckRUNNING, (ss.state == SERVICESTATE_RUNNING)); - Task_ExportCell_LineInt (fh, eckSTATE, ss.state); - Task_ExportCell_LineInt (fh, eckNSTARTS, ss.nStarts); - Task_ExportCell_LineInt (fh, eckERRLAST, ss.dwErrLast); - Task_ExportCell_LineInt (fh, eckSIGLAST, ss.dwSigLast); - Task_ExportCell_Line (fh, eckPARAMS, ss.szParams); - Task_ExportCell_Line (fh, eckNOTIFIER, ss.szNotifier); - Task_ExportCell_LineDate (fh, eckSTARTTIME, &ss.timeLastStart); - Task_ExportCell_LineDate (fh, eckSTOPTIME, &ss.timeLastStop); - Task_ExportCell_LineDate (fh, eckERRORTIME, &ss.timeLastFail); - - if (ss.type == SERVICETYPE_SIMPLE) - Task_ExportCell_Line (fh, eckTYPE, eckSIMPLE); - else if (ss.type == SERVICETYPE_CRON) - Task_ExportCell_Line (fh, eckTYPE, eckCRON); - else // (ss.type == SERVICETYPE_FS) - Task_ExportCell_Line (fh, eckTYPE, eckFS); - } - - Task_ExportCell_End (fh); -} - -void Task_ExportFileset (HANDLE fh, LPFILESET lpFileset) -{ - TCHAR szName[ cchNAME ]; - lpFileset->GetName (szName); - Task_ExportCell_Begin (fh, eckFILESET, szName); - - FILESETSTATUS fs; - if (lpFileset->GetStatus (&fs)) - { - Task_ExportCell_LineInt (fh, eckID, fs.id); - Task_ExportCell_LineInt (fh, eckID_RW, fs.idReadWrite); - Task_ExportCell_LineInt (fh, eckID_BK, fs.idClone); - Task_ExportCell_LineInt (fh, eckUSED, fs.ckUsed); - Task_ExportCell_LineInt (fh, eckQUOTA, fs.ckQuota); - Task_ExportCell_LineDate (fh, eckCREATETIME, &fs.timeCreation); - Task_ExportCell_LineDate (fh, eckUPDATETIME, &fs.timeLastUpdate); - Task_ExportCell_LineDate (fh, eckACCESSTIME, &fs.timeLastAccess); - Task_ExportCell_LineDate (fh, eckBACKUPTIME, &fs.timeLastBackup); - } - - Task_ExportCell_End (fh); -} - -void Task_ExportAggregate (HANDLE fh, LPAGGREGATE lpAggregate) -{ - TCHAR szName[ cchNAME ]; - lpAggregate->GetName (szName); - Task_ExportCell_Begin (fh, eckAGGREGATE, szName); - - lpAggregate->GetDevice (szName); - Task_ExportCell_Line (fh, eckDEVICE, szName); - - AGGREGATESTATUS as; - if (lpAggregate->GetStatus (&as)) - { - Task_ExportCell_LineInt (fh, eckID, (int)as.dwID); - Task_ExportCell_LineInt (fh, eckTOTAL, (int)as.ckStorageTotal); - Task_ExportCell_LineInt (fh, eckFREECUR, (int)as.ckStorageFree); - } - - HENUM hEnum; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&hEnum); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&hEnum)) - { - Task_ExportFileset (fh, lpFileset); - lpFileset->Close(); - } - - Task_ExportCell_End (fh); -} - -void Task_ExportServer (HANDLE fh, LPSERVER lpServer) -{ - TCHAR szName[ cchNAME ]; - lpServer->GetLongName (szName); - Task_ExportCell_Begin (fh, eckSERVER, szName); - - // First, properties of the server - // - SERVERSTATUS ss; - if (lpServer->GetStatus (&ss)) - { - for (size_t iAddr = 0; iAddr < ss.nAddresses; ++iAddr) - Task_ExportCell_LineAddr (fh, eckADDRESS, &ss.aAddresses[ iAddr ]); - } - - // Then, services on the server - // - HENUM hEnum; - for (LPSERVICE lpService = lpServer->ServiceFindFirst (&hEnum); lpService; lpService = lpServer->ServiceFindNext (&hEnum)) - { - Task_ExportService (fh, lpService); - lpService->Close(); - } - - // Then, aggregates and filesets on the server - // - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&hEnum); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&hEnum)) - { - Task_ExportAggregate (fh, lpAggregate); - lpAggregate->Close(); - } - - Task_ExportCell_End (fh); -} - -void Task_ExportCell (LPTASKPACKET ptp) -{ - LPTSTR pszFilename = (LPTSTR)(ptp->lpUser); - - HANDLE fh; - fh = CreateFile (pszFilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL); - if (fh != INVALID_HANDLE_VALUE) - { - TCHAR szName[ cchNAME ]; - g.lpiCell->GetCellName (szName); - Task_ExportCell_Begin (fh, eckCELL, szName); - - LPCELL lpCell; - if ((lpCell = g.lpiCell->OpenCell()) != NULL) - { - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - Task_ExportServer (fh, lpServer); - lpServer->Close(); - } - - lpCell->Close(); - } - - Task_ExportCell_End (fh); - CloseHandle (fh); - } - - Delete (pszFilename); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} -#endif - - -void Task_OpenCell (LPTASKPACKET ptp) -{ - LPOPENCELL_PACKET lpp = (LPOPENCELL_PACKET)(ptp->lpUser); - - LPSUBSET subOld = g.sub; - g.sub = lpp->sub; - - if ((TASKDATA(ptp)->lpiCell = CELL::OpenCell (lpp->szCell, lpp->hCreds, &ptp->status)) == NULL) - { - ptp->rc = FALSE; - - g.sub = subOld; - if (lpp->sub) - Subsets_FreeSubset (lpp->sub); - } - else if (subOld) - { - Subsets_FreeSubset (subOld); - } - - if (ptp->rc) - { - PostMessage (g.hMain, WM_SHOW_YOURSELF, 0, 1); - - if (gr.fActions) - PostMessage (g.hMain, WM_OPEN_ACTIONS, 0, 0); - } - else if (lpp->fCloseAppOnFail) - { - FatalErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), lpp->szCell); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_OpenedCell (LPTASKPACKET ptp) -{ - LPIDENT lpiCell = (LPIDENT)(ptp->lpUser); - - if (lpiCell && lpiCell->fIsCell()) - { - AfsClass_Enter(); - - DontNotifyMeEver (g.hMain); - NotifyMe (WHEN_CELL_OPENED, NULL, g.hMain, 0); - NotifyMe (WHEN_OBJECT_CHANGES, lpiCell, g.hMain, 0); - NotifyMe (WHEN_SVRS_CHANGE, lpiCell, g.hMain, 0); - - if (g.lpiCell != NULL) - { - CELL::CloseCell (g.lpiCell); - } - - g.lpiCell = lpiCell; - UpdateDisplay_Cell (TRUE); - - TCHAR szName[ cchRESOURCE ]; - lpiCell->GetCellName (szName); - - LPTSTR pszCover = FormatString (IDS_SEARCHING_FOR_SERVERS, TEXT("%s"), szName); - AfsAppLib_CoverWindow (GetDlgItem (g.hMain, IDC_SERVERS), pszCover); - FreeString (pszCover); - - LPCELL lpCell; - if ((lpCell = g.lpiCell->OpenCell (&ptp->status)) == NULL) - { - CoverServerList (g.lpiCell, ptp->status); - } - else - { - lpCell->Invalidate(); - if ((ptp->rc = lpCell->RefreshAll (&ptp->status)) != TRUE) - { - CoverServerList (g.lpiCell, ptp->status); - } - lpCell->Close(); - } - - PostMessage (g.hMain, WM_OPEN_SERVERS, 0, 0); - - Alert_StartScout(); - AfsClass_Leave(); - } -} - - -void Task_ClosedCell (LPTASKPACKET ptp) -{ - LPIDENT lpiCell = (LPIDENT)(ptp->lpUser); - - if (lpiCell && lpiCell->fIsCell()) - { - AfsClass_Enter(); - - if (g.lpiCell == lpiCell) - { - LPCELL lpCellTest; - if ((lpCellTest = g.lpiCell->OpenCell()) != NULL) - { - // the user must have opened a cell, then opened it again. - // this is a bogus request to close the old copy of the - // cell. - lpCellTest->Close(); - } - else - { - Server_CloseAll (FALSE); - g.lpiCell = NULL; - Main_Redraw_ThreadProc ((PVOID)FALSE); - } - } - - AfsClass_Leave(); - } -} - - -void Task_Refresh (LPTASKPACKET ptp, BOOL fNewCreds) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - AfsClass_Enter(); - - if (lpi && lpi->fIsCell()) - { - AfsAppLib_Uncover (GetDlgItem (g.hMain, IDC_SERVERS)); - - LPCELL lpCell; - if ((lpCell = lpi->OpenCell (&ptp->status)) == NULL) - { - CoverServerList (lpi, ptp->status); - } - else - { - if (fNewCreds) - lpCell->SetCurrentCredentials (g.hCreds); - - lpCell->Invalidate(); - if ((ptp->rc = lpCell->RefreshAll (&ptp->status)) != TRUE) - { - CoverServerList (lpi, ptp->status); - } - lpCell->Close(); - } - } - else if (lpi && lpi->GetServer()) - { - BOOL fWasMonitored = TRUE; - - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer()) != NULL) - { - if ((fWasMonitored = lpServer->fIsMonitored()) == FALSE) - lpServer->SetMonitor (TRUE); - lpServer->Close(); - } - - if (fWasMonitored) // if it was already monitored, we didn't just refresh - { - if (lpi && lpi->fIsServer()) - { - if ((lpServer = lpi->OpenServer()) != NULL) - { - lpServer->Invalidate(); - lpServer->RefreshAll(); - lpServer->Close(); - } - } - else if (lpi && lpi->fIsService()) - { - LPSERVICE lpService; - if ((lpService = lpi->OpenService()) != NULL) - { - lpService->Invalidate(); - lpService->RefreshStatus(); - lpService->Close(); - } - } - else if (lpi && lpi->fIsAggregate()) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate()) != NULL) - { - // if we implied this aggregate from fileset VLDB entries, - // refresh its parent server, not this aggregate. - // - if (!(lpAggregate->GetGhostStatus() & GHOST_HAS_SERVER_ENTRY)) - { - lpAggregate->Close(); - - LPSERVER lpServer; - if ((lpServer = lpi->OpenServer()) != NULL) - { - lpServer->Invalidate(); - lpServer->RefreshAll(); - lpServer->Close(); - } - } - else - { - lpAggregate->Invalidate(); - lpAggregate->RefreshStatus(); - lpAggregate->RefreshFilesets(); - lpAggregate->Close(); - - LPCELL lpCell; - if ((lpCell = lpi->OpenCell()) != NULL) - { - lpCell->RefreshVLDB (lpi); - lpCell->Close(); - } - } - } - } - else if (lpi && lpi->fIsFileset()) - { - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset()) != NULL) - { - lpFileset->Invalidate(); - lpFileset->RefreshStatus(); - lpFileset->Close(); - - LPCELL lpCell; - if ((lpCell = lpi->OpenCell()) != NULL) - { - lpCell->RefreshVLDB (lpi); - lpCell->Close(); - } - } - } - } - - Alert_Scout_QueueCheckServer (lpi); - } - - AfsClass_Leave(); -} - - -void Task_Subset_To_List (LPTASKPACKET ptp) -{ - LPSUBSET_TO_LIST_PACKET lpp = (LPSUBSET_TO_LIST_PACKET)( ptp->lpUser ); - - LB_StartChange (lpp->hList, TRUE); - - LPCELL lpCell = NULL; - if (g.lpiCell) - lpCell = g.lpiCell->OpenCell(); - if (lpCell) - { - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - LPIDENT lpiServer = lpServer->GetIdentifier(); - TCHAR szServer[ cchNAME ]; - lpServer->GetName (szServer); - lpServer->Close(); - - BOOL fMonitor = Subsets_fMonitorServer (lpp->sub, lpiServer); - - LB_AddItem (lpp->hList, szServer, (LPARAM)fMonitor); - } - - lpCell->Close(); - } - - LB_EndChange (lpp->hList); - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let anyone use it. -} - - -void Task_Apply_Subset (LPTASKPACKET ptp) -{ - LPSUBSET sub = (LPSUBSET)( ptp->lpUser ); - - LPCELL lpCell = NULL; - if (g.lpiCell) - lpCell = g.lpiCell->OpenCell(); - if (lpCell) - { - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - LPIDENT lpiServer = lpServer->GetIdentifier(); - TCHAR szServer[ cchNAME ]; - lpServer->GetName (szServer); - - BOOL fMonitor = Subsets_fMonitorServer (sub, lpiServer); - lpServer->SetMonitor (fMonitor); - - lpServer->Close(); - } - - lpCell->Close(); - } -} - - - -void Task_Svr_Prop_Init (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpServer->GetStatus (&TASKDATA(ptp)->ss, TRUE, &ptp->status)) - { - ptp->rc = FALSE; - } - else - { - HENUM hEnum; - for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&hEnum); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&hEnum)) - { - AGGREGATESTATUS as; - if (lpAggregate->GetStatus (&as)) - { - TASKDATA(ptp)->ckCapacity += as.ckStorageTotal; - TASKDATA(ptp)->ckAllocation += as.ckStorageAllocated; - } - - TASKDATA(ptp)->nAggr++; - lpAggregate->Close(); - } - } - - lpServer->Close(); - } -} - - -void Task_Svr_Scout_Init (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - if ((TASKDATA(ptp)->lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } -} - - -void Task_Svr_Scout_Apply (LPTASKPACKET ptp) -{ - LPSVR_SCOUT_APPLY_PACKET lpp = (LPSVR_SCOUT_APPLY_PACKET)(ptp->lpUser); - - BOOL fRefreshVLDB = FALSE; - - LPSERVER_PREF lpsp = NULL; - if ((lpsp = (LPSERVER_PREF)lpp->lpiServer->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - else - { - if (!lpp->fIDC_SVR_WARN_AGGFULL) - lpsp->perWarnAggFull = 0; - else - lpsp->perWarnAggFull = lpp->wIDC_SVR_WARN_AGGFULL_PERCENT; - - if (!lpp->fIDC_SVR_WARN_SETFULL) - lpsp->perWarnSetFull = 0; - else - lpsp->perWarnSetFull = lpp->wIDC_SVR_WARN_SETFULL_PERCENT; - - DWORD fOldWarnSet = (lpsp->fWarnSetNoVLDB << 1) | lpsp->fWarnSetNoServ; - - lpsp->fWarnAggAlloc = lpp->fIDC_SVR_WARN_AGGALLOC; - lpsp->fWarnSvcStop = lpp->fIDC_SVR_WARN_SVCSTOP; - lpsp->fWarnSvrTimeout = lpp->fIDC_SVR_WARN_TIMEOUT; - lpsp->fWarnSetNoVLDB = lpp->fIDC_SVR_WARN_SETNOVLDB; - lpsp->fWarnSetNoServ = lpp->fIDC_SVR_WARN_SETNOSERV; - lpsp->fWarnAggNoServ = lpp->fIDC_SVR_WARN_AGGNOSERV; - - DWORD fNewWarnSet = (lpsp->fWarnSetNoVLDB << 1) | lpsp->fWarnSetNoServ; - - if (fNewWarnSet != fOldWarnSet) - fRefreshVLDB = TRUE; - - if (!lpp->fIDC_SVR_AUTOREFRESH) - lpsp->oa.cTickRefresh = 0; - else - lpsp->oa.cTickRefresh = cmsec1MINUTE * lpp->dwIDC_SVR_AUTOREFRESH_MINUTES; - - if (!Server_SavePreferences (lpp->lpiServer)) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } - - if (fRefreshVLDB) - { - LPCELL lpCell; - if ((lpCell = lpp->lpiServer->OpenCell()) != NULL) - { - lpCell->RefreshVLDB (NULL); - lpCell->Close(); - } - } - - (void)Alert_Scout_QueueCheckServer (lpp->lpiServer); - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let anyone use it. -} - - -void Task_Svr_Enum_To_ComboBox (LPTASKPACKET ptp) -{ - LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = (LPSVR_ENUM_TO_COMBOBOX_PACKET)(ptp->lpUser); - - // Fill in the Servers combobox, and select the default server - // (if one was specified, either as a server or as a fileset). - // - CB_StartChange (lpp->hCombo, TRUE); - - LPCELL lpCell; - if ((lpCell = g.lpiCell->OpenCell (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - TCHAR szName[ cchNAME ]; - lpServer->GetName (szName); - CB_AddItem (lpp->hCombo, szName, (LPARAM)lpServer->GetIdentifier()); - lpServer->Close(); - } - lpCell->Close(); - } - - if (lpp->lpiSelect && lpp->lpiSelect->GetServer()) - CB_EndChange (lpp->hCombo, (LPARAM)(lpp->lpiSelect->GetServer())); - else - { - CB_EndChange (lpp->hCombo, 0); - CB_SetSelected (lpp->hCombo, 0); - } - - Delete (lpp); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. -} - - -void Task_Svr_GetWindowPos (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - SetRectEmpty (&TASKDATA(ptp)->rWindow); - - if (lpi != NULL) - { - LPSERVER_PREF lpsp = (LPSERVER_PREF)lpi->GetUserParam(); - - if (lpsp != NULL && (lpsp->rLast.right != 0)) - { - TASKDATA(ptp)->rWindow = lpsp->rLast; - } - } -} - - -void Task_Svr_SetWindowPos (LPTASKPACKET ptp) -{ - LPSVR_SETWINDOWPOS_PARAMS lpp = (LPSVR_SETWINDOWPOS_PARAMS)(ptp->lpUser); - - if (lpp->lpi) - { - LPSERVER_PREF lpsp = (LPSERVER_PREF)(lpp->lpi->GetUserParam()); - - if (lpsp != NULL) - { - lpsp->rLast = lpp->rWindow; - lpsp->fOpen = lpp->fOpen; - - StorePreferences (lpp->lpi, lpsp, sizeof(SERVER_PREF)); - } - } - - Delete (lpp); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. -} - - -void Task_Svr_SyncVLDB (LPTASKPACKET ptp) -{ - LPSVR_SYNCVLDB_PARAMS lpp = (LPSVR_SYNCVLDB_PARAMS)(ptp->lpUser); - - if (!AfsClass_SyncVLDB (lpp->lpi, lpp->fForce, &ptp->status)) - ptp->rc = FALSE; - - if (!ptp->rc && !IsWindow (ptp->hReply)) - { - ErrorDialog (ptp->status, IDS_ERROR_CANT_SYNCVLDB); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let anyone use it. -} - - -void Task_Svr_Salvage (LPTASKPACKET ptp) -{ - LPSVR_SALVAGE_PARAMS lpp = (LPSVR_SALVAGE_PARAMS)(ptp->lpUser); - - LPTSTR pszTempDir = (lpp->szTempDir[0] != TEXT('\0')) ? lpp->szTempDir : NULL; - LPTSTR pszLogFile = (lpp->szLogFile[0] != TEXT('\0')) ? lpp->szLogFile : NULL; - - if (!AfsClass_Salvage (lpp->lpiSalvage, &TASKDATA(ptp)->pszText1, lpp->nProcesses, pszTempDir, pszLogFile, lpp->fForce, lpp->fReadonly, lpp->fLogInodes, lpp->fLogRootInodes, lpp->fRebuildDirs, lpp->fReadBlocks, &ptp->status)) - ptp->rc = FALSE; - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let anyone use it. -} - - -void Task_Svr_Install (LPTASKPACKET ptp) -{ - LPSVR_INSTALL_PARAMS lpp = (LPSVR_INSTALL_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_InstallFile (lpp->lpiServer, lpp->szTarget, lpp->szSource, &ptp->status); - - if (!ptp->rc && !ptp->hReply) - { - TCHAR szFilename[ MAX_PATH ]; - TCHAR szSvrName[ cchRESOURCE ]; - lpp->lpiServer->GetServerName (szSvrName); - CopyBaseFileName (szFilename, lpp->szSource); - ErrorDialog (ptp->status, IDS_ERROR_CANT_INSTALL_FILE, TEXT("%s%s"), szSvrName, szFilename); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_Uninstall (LPTASKPACKET ptp) -{ - LPSVR_UNINSTALL_PARAMS lpp = (LPSVR_UNINSTALL_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_UninstallFile (lpp->lpiServer, lpp->szUninstall, &ptp->status); - - if (!ptp->rc && !ptp->hReply) - { - TCHAR szFilename[ MAX_PATH ]; - TCHAR szSvrName[ cchRESOURCE ]; - lpp->lpiServer->GetServerName (szSvrName); - CopyBaseFileName (szFilename, lpp->szUninstall); - ErrorDialog (ptp->status, IDS_ERROR_CANT_UNINSTALL_FILE, TEXT("%s%s"), szSvrName, szFilename); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_Prune (LPTASKPACKET ptp) -{ - LPSVR_PRUNE_PARAMS lpp = (LPSVR_PRUNE_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_PruneOldFiles (lpp->lpiServer, lpp->fBAK, lpp->fOLD, lpp->fCore, &ptp->status); - - if (!ptp->rc && !ptp->hReply) - { - TCHAR szSvrName[ cchRESOURCE ]; - lpp->lpiServer->GetServerName (szSvrName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_PRUNE_FILES, TEXT("%s"), szSvrName); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_GetDates (LPTASKPACKET ptp) -{ - LPSVR_GETDATES_PARAMS lpp = (LPSVR_GETDATES_PARAMS)(ptp->lpUser); - - SYSTEMTIME stFile; - SYSTEMTIME stOLD; - SYSTEMTIME stBAK; - - ptp->rc = AfsClass_GetFileDates (lpp->lpiServer, lpp->szFilename, &stFile, &stBAK, &stOLD, &ptp->status); - - if (ptp->rc) - { - TCHAR szText[ cchRESOURCE ]; - if (FormatTime (szText, TEXT("%s"), &stFile)) - TASKDATA(ptp)->pszText1 = CloneString (szText); - - if (FormatTime (szText, TEXT("%s"), &stBAK)) - TASKDATA(ptp)->pszText2 = CloneString (szText); - - if (FormatTime (szText, TEXT("%s"), &stOLD)) - TASKDATA(ptp)->pszText3 = CloneString (szText); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_Execute (LPTASKPACKET ptp) -{ - LPSVR_EXECUTE_PARAMS lpp = (LPSVR_EXECUTE_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_ExecuteCommand (lpp->lpiServer, lpp->szCommand, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_EXECUTE_COMMAND, TEXT("%s%s"), szServer, lpp->szCommand); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_SetAuth (LPTASKPACKET ptp) -{ - LPSVR_SETAUTH_PARAMS lpp = (LPSVR_SETAUTH_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_SetServerAuth (lpp->lpiServer, lpp->fEnableAuth, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, (lpp->fEnableAuth) ? IDS_ERROR_CANT_AUTH_ON : IDS_ERROR_CANT_AUTH_OFF, TEXT("%s"), szServer); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_AdmList_Open (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - if ((TASKDATA(ptp)->lpAdmList = AfsClass_AdminList_Load (lpiServer, &ptp->status)) == NULL) - { - ptp->rc = FALSE; - - TCHAR szServer[ cchNAME ]; - lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_LOAD_ADMLIST, TEXT("%s"), szServer); - } -} - - -void Task_Svr_AdmList_Save (LPTASKPACKET ptp) -{ - LPADMINLIST lpAdmList = (LPADMINLIST)(ptp->lpUser); - - // Increment the reference counter on this admin list before handing - // it off to the Save routine, as that routine will be posting - // notifications using its handle. When our notification handler - // receives the End notification, it will attempt to free the list-- - // which will decrement the counter again, and actually free the list - // if the counter hits zero. - // - InterlockedIncrement (&lpAdmList->cRef); - - ptp->rc = AfsClass_AdminList_Save (lpAdmList, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - lpAdmList->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_SAVE_ADMLIST, TEXT("%s"), szServer); - } - - AfsClass_AdminList_Free (lpAdmList); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_KeyList_Open (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - if ((TASKDATA(ptp)->lpKeyList = AfsClass_KeyList_Load (lpiServer, &ptp->status)) == NULL) - { - ptp->rc = FALSE; - - TCHAR szServer[ cchNAME ]; - lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_LOAD_KEYLIST, TEXT("%s"), szServer); - } -} - - -void Task_Svr_Key_Create (LPTASKPACKET ptp) -{ - LPKEY_CREATE_PARAMS lpp = (LPKEY_CREATE_PARAMS)(ptp->lpUser); - - if (lpp->szString[0]) - ptp->rc = AfsClass_AddKey (lpp->lpiServer, lpp->keyVersion, lpp->szString, &ptp->status); - else - ptp->rc = AfsClass_AddKey (lpp->lpiServer, lpp->keyVersion, &lpp->key, &ptp->status); - - if ((TASKDATA(ptp)->lpKeyList = AfsClass_KeyList_Load (lpp->lpiServer, &ptp->status)) == NULL) - { - ptp->rc = FALSE; - - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CREATE_KEY, TEXT("%s"), szServer); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_Key_Delete (LPTASKPACKET ptp) -{ - LPKEY_DELETE_PARAMS lpp = (LPKEY_DELETE_PARAMS)(ptp->lpUser); - - if (!AfsClass_DeleteKey (lpp->lpiServer, lpp->keyVersion, &ptp->status)) - { - ptp->rc = FALSE; - - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_DELETE_KEY, TEXT("%s%lu"), szServer, lpp->keyVersion); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_GetRandomKey (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - if (!AfsClass_GetRandomKey (lpiServer, &TASKDATA(ptp)->key, &ptp->status)) - { - ptp->rc = FALSE; - - TCHAR szServer[ cchNAME ]; - lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_GETRANDOMKEY, TEXT("%s"), szServer); - } -} - - -void Task_Svr_HostList_Open (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - if ((TASKDATA(ptp)->lpHostList = AfsClass_HostList_Load (lpiServer, &ptp->status)) == NULL) - { - ptp->rc = FALSE; - - TCHAR szServer[ cchNAME ]; - lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_LOAD_HOSTLIST, TEXT("%s"), szServer); - } -} - - -void Task_Svr_HostList_Save (LPTASKPACKET ptp) -{ - LPHOSTLIST lpHostList = (LPHOSTLIST)(ptp->lpUser); - - // Increment the reference counter on this admin list before handing - // it off to the Save routine, as that routine will be posting - // notifications using its handle. When our notification handler - // receives the End notification, it will attempt to free the list-- - // which will decrement the counter again, and actually free the list - // if the counter hits zero. - // - InterlockedIncrement (&lpHostList->cRef); - - ptp->rc = AfsClass_HostList_Save (lpHostList, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - lpHostList->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_SAVE_HOSTLIST, TEXT("%s"), szServer); - } - - AfsClass_HostList_Free (lpHostList); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svr_Monitor_OnOff (LPTASKPACKET ptp) -{ - LPIDENT lpiServer = (LPIDENT)(ptp->lpUser); - - LPSERVER lpServer; - if ((lpServer = lpiServer->OpenServer()) != NULL) - { - BOOL fMonitored = lpServer->fIsMonitored(); - - g.sub = Subsets_SetMonitor (g.sub, lpiServer, !fMonitored); - - lpServer->SetMonitor (!fMonitored); - - lpServer->Close(); - } -} - - -void Task_Svr_ChangeAddr (LPTASKPACKET ptp) -{ - LPSVR_CHANGEADDR_PARAMS lpp = (LPSVR_CHANGEADDR_PARAMS)(ptp->lpUser); - - if ((ptp->rc = AfsClass_ChangeAddress (lpp->lpiServer, &lpp->ssOld, &lpp->ssNew, &ptp->status)) == FALSE) - { - TCHAR szName[ cchRESOURCE ]; - lpp->lpiServer->GetServerName (szName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGEADDR, TEXT("%s"), szName); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svc_Menu (LPTASKPACKET ptp) -{ - TASKDATA(ptp)->mt = *(LPMENUTASK)(ptp->lpUser); - Delete ((LPMENUTASK)(ptp->lpUser)); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. - - if (TASKDATA(ptp)->mt.lpi && TASKDATA(ptp)->mt.lpi->fIsService()) - { - LPSERVICE lpService; - if ((lpService = TASKDATA(ptp)->mt.lpi->OpenService (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpService->GetStatus (&TASKDATA(ptp)->cs, FALSE, &ptp->status)) - ptp->rc = FALSE; - lpService->Close(); - } - } -} - - -void Task_Svc_Prop_Init (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPSERVICE lpService; - if ((lpService = lpi->OpenService (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpService->GetStatus (&TASKDATA(ptp)->cs, TRUE, &ptp->status)) - { - ptp->rc = FALSE; - } - else if ((TASKDATA(ptp)->lpcp = (LPSERVICE_PREF)lpi->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - lpService->Close(); - } - - if (ptp->rc) - { - if ((TASKDATA(ptp)->lpsp = (LPSERVER_PREF)lpi->GetServer()->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } -} - - -void Task_Svc_Prop_Apply (LPTASKPACKET ptp) -{ - LPSVC_PROP_APPLY_PACKET lpp = (LPSVC_PROP_APPLY_PACKET)(ptp->lpUser); - - LPSERVICE lpService; - if ((lpService = lpp->lpi->OpenService (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - LPSERVICE_PREF lpcp = NULL; - if ((lpcp = (LPSERVICE_PREF)lpp->lpi->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - else - { - LPIDENT lpiServer; - if ((lpiServer = lpp->lpi->GetServer()) != NULL) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) != NULL) - { - if (lpsp->fWarnSvcStop) - lpcp->fWarnSvcStop = lpp->fIDC_SVC_WARNSTOP; - } - } - - if (!Services_SavePreferences (lpp->lpi)) - { - ptp->rc = FALSE; - ptp->status = GetLastError(); - } - } - - lpService->Close(); - } - - (void)Alert_Scout_QueueCheckServer (lpp->lpi); - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svc_Start (LPTASKPACKET ptp) -{ - LPSVC_START_PARAMS lpp = (LPSVC_START_PARAMS)(ptp->lpUser); - - if (!AfsClass_StartService (lpp->lpiStart, lpp->fTemporary, &ptp->status)) - ptp->rc = FALSE; - - if (!ptp->rc && !ptp->hReply) - { - TCHAR szSvrName[ cchRESOURCE ]; - TCHAR szSvcName[ cchRESOURCE ]; - lpp->lpiStart->GetServerName (szSvrName); - lpp->lpiStart->GetServiceName (szSvcName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_START_SERVICE, TEXT("%s%s"), szSvrName, szSvcName); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svc_Stop (LPTASKPACKET ptp) -{ - LPSVC_STOP_PARAMS lpp = (LPSVC_STOP_PARAMS)(ptp->lpUser); - - if (!AfsClass_StopService (lpp->lpiStop, lpp->fTemporary, TRUE, &ptp->status)) - ptp->rc = FALSE; - - if (!ptp->rc && !ptp->hReply) - { - TCHAR szSvrName[ cchRESOURCE ]; - TCHAR szSvcName[ cchRESOURCE ]; - lpp->lpiStop->GetServerName (szSvrName); - lpp->lpiStop->GetServiceName (szSvcName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_STOP_SERVICE, TEXT("%s%s"), szSvrName, szSvcName); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svc_Restart (LPTASKPACKET ptp) -{ - LPIDENT lpiService = (LPIDENT)(ptp->lpUser); - - if (!AfsClass_RestartService (lpiService, &ptp->status)) - ptp->rc = FALSE; - - if (!ptp->rc && !ptp->hReply) - { - TCHAR szSvrName[ cchRESOURCE ]; - TCHAR szSvcName[ cchRESOURCE ]; - lpiService->GetServerName (szSvrName); - lpiService->GetServiceName (szSvcName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_RESTART_SERVICE, TEXT("%s%s"), szSvrName, szSvcName); - } -} - - -void Task_Svc_FindLog (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - if ((TASKDATA(ptp)->lpcp = (LPSERVICE_PREF)lpi->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - - if (ptp->rc) - { - if (TASKDATA(ptp)->lpcp->szLogFile[0] == TEXT('\0')) - { - ptp->rc = FALSE; - ptp->status = ERROR_FILE_NOT_FOUND; - } - } - - if (ptp->rc) - { - if ((TASKDATA(ptp)->pszText1 = CloneString (TASKDATA(ptp)->lpcp->szLogFile)) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } -} - - -void Task_Svc_ViewLog (LPTASKPACKET ptp) -{ - LPSVC_VIEWLOG_PACKET lpp = (LPSVC_VIEWLOG_PACKET)(ptp->lpUser); - - TCHAR szTempPath[ MAX_PATH ]; - GetTempPath (MAX_PATH, szTempPath); - - TCHAR szFilename[ MAX_PATH ]; - GetTempFileName (szTempPath, TEXT("log"), 0, szFilename); - - if (!AfsClass_GetServerLogFile (lpp->lpiServer, szFilename, lpp->szRemote, &ptp->status)) - { - DeleteFile (szFilename); - ptp->rc = FALSE; - } - - if (ptp->rc) - { - if ((TASKDATA(ptp)->pszText1 = CloneString (szFilename)) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svc_Create (LPTASKPACKET ptp) -{ - LPSVC_CREATE_PARAMS lpp = (LPSVC_CREATE_PARAMS)(ptp->lpUser); - - LPIDENT lpiService; - if ((lpiService = AfsClass_CreateService (lpp->lpiServer, lpp->szService, lpp->szCommand, lpp->szParams, lpp->szNotifier, lpp->type, &lpp->stIfCron, &ptp->status)) == NULL) - { - ptp->rc = FALSE; - } - - if (ptp->rc) - { - // Start it if necessary - // - if ((lpp->type == SERVICETYPE_SIMPLE) && (lpp->fRunNow)) - { - if (!AfsClass_StartService (lpiService, FALSE, &ptp->status)) - { - ptp->rc = FALSE; - } - } - } - - if (ptp->rc && lpp->szLogFile[0]) - { - LPSERVICE_PREF lpsp; - if ((lpsp = (LPSERVICE_PREF)lpiService->GetUserParam()) != NULL) - { - lstrcpy (lpsp->szLogFile, lpp->szLogFile); - - if (!Services_SavePreferences (lpiService)) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } - } - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - lpp->lpiServer->GetServerName (szServer); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CREATE_SERVICE, TEXT("%s%s"), szServer, lpp->szService); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Svc_Delete (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - ptp->rc = AfsClass_DeleteService (lpi, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szService[ cchNAME ]; - lpi->GetServerName (szServer); - lpi->GetServiceName (szService); - ErrorDialog (ptp->status, IDS_ERROR_CANT_DELETE_SERVICE, TEXT("%s%s"), szServer, szService); - } -} - - -void Task_Svc_GetRestartTimes (LPTASKPACKET ptp) -{ - LPSVC_RESTARTTIMES_PARAMS lpp = (LPSVC_RESTARTTIMES_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_GetRestartTimes (lpp->lpi, &lpp->fGeneral, &lpp->stGeneral, &lpp->fNewBinary, &lpp->stNewBinary, &ptp->status); - - if (!ptp->rc) - { - lpp->fGeneral = FALSE; - lpp->fNewBinary = FALSE; - - TCHAR szSvrName[ cchNAME ]; - lpp->lpi->GetServerName (szSvrName); - ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVICE_STATUS, TEXT("%s%s"), szSvrName, TEXT("BOS")); - } - - if (!ptp->hReply) - { - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. - } -} - - -void Task_Svc_SetRestartTimes (LPTASKPACKET ptp) -{ - LPSVC_RESTARTTIMES_PARAMS lpp = (LPSVC_RESTARTTIMES_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_SetRestartTimes (lpp->lpi, ((lpp->fGeneral) ? &lpp->stGeneral : NULL), ((lpp->fNewBinary) ? &lpp->stNewBinary : NULL), &ptp->status); - - if (!ptp->rc) - { - TCHAR szSvrName[ cchNAME ]; - lpp->lpi->GetServerName (szSvrName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_SET_RESTART_TIMES, TEXT("%s"), szSvrName); - } - - if (!ptp->hReply) - { - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. - } -} - - -void Task_Agg_Prop_Init (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpAggregate->GetStatus (&TASKDATA(ptp)->as, TRUE, &ptp->status)) - { - ptp->rc = FALSE; - } - - if ((TASKDATA(ptp)->lpap = (LPAGGREGATE_PREF)lpAggregate->GetUserParam()) == NULL) - { - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - ptp->rc = FALSE; - } - - TCHAR szText[ cchRESOURCE ]; - lpAggregate->GetDevice (szText); - TASKDATA(ptp)->pszText1 = CloneString (szText); - - if (ptp->rc) - { - TASKDATA(ptp)->nFilesets = 0; - - HENUM hEnum; - for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&hEnum); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&hEnum)) - { - (TASKDATA(ptp)->nFilesets)++; - lpFileset->Close(); - } - } - - lpAggregate->Close(); - } - - if (ptp->rc) - { - if ((TASKDATA(ptp)->lpsp = (LPSERVER_PREF)lpi->GetServer()->GetUserParam()) == NULL) - { - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - ptp->rc = FALSE; - } - } -} - - -void Task_Agg_Prop_Apply (LPTASKPACKET ptp) -{ - LPAGG_PROP_APPLY_PACKET lpp = (LPAGG_PROP_APPLY_PACKET)(ptp->lpUser); - - LPAGGREGATE_PREF lpap; - if ((lpap = (LPAGGREGATE_PREF)lpp->lpi->GetAggregate()->GetUserParam()) == NULL) - { - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - ptp->rc = FALSE; - } - else - { - LPIDENT lpiServer; - if ((lpiServer = lpp->lpi->GetServer()) != NULL) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpiServer->GetUserParam()) != NULL) - { - if (lpsp->fWarnAggAlloc) - lpap->fWarnAggAlloc = lpp->fIDC_AGG_WARNALLOC; - } - } - - if (!lpp->fIDC_AGG_WARN) - lpap->perWarnAggFull = 0; - else if (lpp->fIDC_AGG_WARN_AGGFULL_DEF) - lpap->perWarnAggFull = -1; - else - lpap->perWarnAggFull = lpp->wIDC_AGG_WARN_AGGFULL_PERCENT; - - if (!Aggregates_SavePreferences (lpp->lpi)) - { - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - ptp->rc = FALSE; - } - - (void)Alert_Scout_QueueCheckServer (lpp->lpi); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Agg_Find_Quota_Limits (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - TASKDATA(ptp)->ckMin = ckQUOTA_MINIMUM; - TASKDATA(ptp)->ckMax = ckQUOTA_MAXIMUM; - - if (lpi && (lpi->fIsAggregate() || lpi->fIsFileset())) - { - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - AGGREGATESTATUS as; - if (!lpAggregate->GetStatus (&as, TRUE, &ptp->status)) - ptp->rc = FALSE; - else - { - TASKDATA(ptp)->ckMax = max( 1L, as.ckStorageTotal ); - } - lpAggregate->Close(); - } - } -} - - -void Task_Agg_Enum_To_ListView (LPTASKPACKET ptp) -{ - LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = (LPAGG_ENUM_TO_LISTVIEW_PACKET)(ptp->lpUser); - - UpdateDisplay_Aggregates (TRUE, lpp->hList, NULL, 0, lpp->lpiServer, lpp->lpiSelect, lpp->lpvi); - - Delete (lpp); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. -} - - -void Task_Agg_Enum_To_ComboBox (LPTASKPACKET ptp) -{ - LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = (LPAGG_ENUM_TO_COMBOBOX_PACKET)(ptp->lpUser); - - UpdateDisplay_Aggregates (TRUE, lpp->hCombo, NULL, 0, lpp->lpiServer, lpp->lpiSelect, NULL); - - Delete (lpp); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. -} - - -void Task_Agg_Find_Ghost (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPAGGREGATE lpAggregate; - if ((lpAggregate = lpi->OpenAggregate (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - TASKDATA(ptp)->wGhost = lpAggregate->GetGhostStatus(); - lpAggregate->Close(); - } -} - - -void Task_Set_Enum_To_ComboBox (LPTASKPACKET ptp) -{ - LPSET_ENUM_TO_COMBOBOX_PACKET lpp = (LPSET_ENUM_TO_COMBOBOX_PACKET)(ptp->lpUser); - - UpdateDisplay_Filesets (TRUE, lpp->hCombo, NULL, 0, lpp->lpiServer, lpp->lpiAggregate, lpp->lpiSelect); - - Delete (lpp); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. -} - - -void Task_Set_Find_Ghost (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - TASKDATA(ptp)->wGhost = lpFileset->GetGhostStatus(); - TASKDATA(ptp)->fHasReplicas = FALSE; - - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs)) - { - TASKDATA(ptp)->fs.Type = ftREADWRITE; - } - else if (TASKDATA(ptp)->fs.Type == ftREADWRITE) - { - HENUM hEnum; - for (LPIDENT lpiSearch = IDENT::FindFirst (&hEnum, &TASKDATA(ptp)->fs.idReplica); lpiSearch; lpiSearch = IDENT::FindNext (&hEnum)) - { - LPFILESET lpReplica; - if ((lpReplica = lpiSearch->OpenFileset()) != NULL) - { - lpReplica->Close(); - TASKDATA(ptp)->fHasReplicas = TRUE; - break; - } - } - IDENT::FindClose (&hEnum); - } - - lpFileset->Close(); - } -} - - -void Task_Set_Create (LPTASKPACKET ptp) -{ - LPSET_CREATE_PARAMS lpp = (LPSET_CREATE_PARAMS)(ptp->lpUser); - - LPIDENT lpiFileset; - if ((lpiFileset = AfsClass_CreateFileset (lpp->lpiParent, lpp->szName, lpp->ckQuota, &ptp->status)) == NULL) - ptp->rc = FALSE; - - if (ptp->rc && lpp->fCreateClone) - { - ptp->rc = AfsClass_Clone (lpiFileset, &ptp->status); - } - - if (ptp->rc) - { - TASKDATA(ptp)->lpi = lpiFileset; - } - else - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - lpp->lpiParent->GetServerName (szServer); - lpp->lpiParent->GetAggregateName (szAggregate); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CREATE_FILESET, TEXT("%s%s%s"), szServer, szAggregate, lpp->szName); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_Delete (LPTASKPACKET ptp) -{ - LPSET_DELETE_PARAMS lpp = (LPSET_DELETE_PARAMS)(ptp->lpUser); - - // First, what kind of fileset are we deleting here? - // - LPIDENT lpiClone = NULL; - FILESETTYPE setType = ftREADWRITE; - LPFILESET lpFileset; - if ((lpFileset = lpp->lpiFileset->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - lpiClone = lpFileset->GetCloneIdentifier(); - - if (lpFileset->GetStatus (&TASKDATA(ptp)->fs)) - setType = TASKDATA(ptp)->fs.Type; - - lpFileset->Close(); - } - - // Delete the fileset in whichever way is appropriate - // - if (setType == ftREADWRITE) - { - if (lpp->fVLDB && lpiClone) - { - LPFILESET lpClone; - if ((lpClone = lpiClone->OpenFileset()) != NULL) // clone really there? - { - lpClone->Close(); - - if (!AfsClass_DeleteClone (lpiClone, &ptp->status)) - ptp->rc = FALSE; - } - } - if (ptp->rc) - { - if (!AfsClass_DeleteFileset (lpp->lpiFileset, lpp->fVLDB, lpp->fServer, &ptp->status)) - ptp->rc = FALSE; - } - } - else if (setType == ftREPLICA) - { - if (!AfsClass_DeleteReplica (lpp->lpiFileset, &ptp->status)) - ptp->rc = FALSE; - } - else if (setType == ftCLONE) - { - if (!AfsClass_DeleteClone (lpp->lpiFileset, &ptp->status)) - ptp->rc = FALSE; - } - - // Clean up - // - if ( (!ptp->rc) || - (!lpp->fVLDB && (lpp->wGhost & GHOST_HAS_VLDB_ENTRY)) || - (!lpp->fServer && (lpp->wGhost & GHOST_HAS_SERVER_ENTRY)) ) - { - Alert_Scout_QueueCheckServer (lpp->lpiFileset->GetServer()); - } - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpp->lpiFileset->GetServerName (szServer); - lpp->lpiFileset->GetAggregateName (szAggregate); - lpp->lpiFileset->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_DELETE_FILESET, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_Move (LPTASKPACKET ptp) -{ - LPSET_MOVE_PARAMS lpp = (LPSET_MOVE_PARAMS)(ptp->lpUser); - - BOOL fIsReplica = FALSE; - - LPFILESET lpFileset; - if ((lpFileset = lpp->lpiSource->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - FILESETSTATUS fs; - if (!lpFileset->GetStatus (&fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - else - { - if (fs.Type == ftREPLICA) - fIsReplica = TRUE; - } - lpFileset->Close(); - } - - if (ptp->rc) - { - if (fIsReplica) - { - if (!AfsClass_MoveReplica (lpp->lpiSource, lpp->lpiTarget, &ptp->status)) - ptp->rc = FALSE; - } - else - { - if (!AfsClass_MoveFileset (lpp->lpiSource, lpp->lpiTarget, &ptp->status)) - ptp->rc = FALSE; - } - } - - if (!ptp->rc) - { - TCHAR szServerSource[ cchNAME ]; - TCHAR szServerTarget[ cchNAME ]; - TCHAR szAggregateSource[ cchNAME ]; - TCHAR szAggregateTarget[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpp->lpiSource->GetServerName (szServerSource); - lpp->lpiSource->GetAggregateName (szAggregateSource); - lpp->lpiSource->GetFilesetName (szFileset); - lpp->lpiTarget->GetServerName (szServerTarget); - lpp->lpiTarget->GetAggregateName (szAggregateTarget); - ErrorDialog (ptp->status, IDS_ERROR_MOVE_FILESET, TEXT("%s%s%s%s%s"), szServerSource, szAggregateSource, szFileset, szServerTarget, szAggregateTarget); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_MoveTo_Init (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - lpFileset->Close(); - } -} - - -void Task_Set_Prop_Init (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - else if ((TASKDATA(ptp)->lpfp = (LPFILESET_PREF)lpFileset->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - lpFileset->Close(); - } - - if (ptp->rc) - { - if ((TASKDATA(ptp)->lpsp = (LPSERVER_PREF)lpi->GetServer()->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } -} - - -void Task_Set_Prop_Apply (LPTASKPACKET ptp) -{ - LPSET_PROP_APPLY_PARAMS lpp = (LPSET_PROP_APPLY_PARAMS)(ptp->lpUser); - - LPFILESET_PREF lpfp = NULL; - if ((lpfp = (LPFILESET_PREF)lpp->lpi->GetUserParam()) == NULL) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - else - { - if (!lpp->fIDC_SET_WARN) - lpfp->perWarnSetFull = 0; - else if (lpp->fIDC_SET_WARN_SETFULL_DEF) - lpfp->perWarnSetFull = -1; - else - lpfp->perWarnSetFull = lpp->wIDC_SET_WARN_SETFULL_PERCENT; - - if (!Filesets_SavePreferences (lpp->lpi)) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - } - - Alert_Scout_QueueCheckServer (lpp->lpi); - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_SetQuota_Init (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - - lpFileset->Close(); - } - - if (ptp->rc) - { - Task_Agg_Find_Quota_Limits (ptp); - } -} - - -void Task_Set_SetQuota_Apply (LPTASKPACKET ptp) -{ - LPSET_SETQUOTA_APPLY_PARAMS lpp = (LPSET_SETQUOTA_APPLY_PARAMS)(ptp->lpUser); - - if (!AfsClass_SetFilesetQuota (lpp->lpiFileset, lpp->ckQuota, &ptp->status)) - ptp->rc = FALSE; - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpp->lpiFileset->GetServerName (szServer); - lpp->lpiFileset->GetAggregateName (szAggregate); - lpp->lpiFileset->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_SET_FILESET_QUOTA, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_RepProp_Init (LPTASKPACKET ptp) -{ - LPSET_REPPROP_INIT_PARAMS lpp = (LPSET_REPPROP_INIT_PARAMS)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpp->lpiReq->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if ((lpp->lpiRW = lpFileset->GetReadWriteIdentifier (&ptp->status)) == NULL) - ptp->rc = FALSE; - else if (!lpFileset->GetStatus (&lpp->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - lpFileset->Close(); - } - - // don't delete this packet (ptp->lpUser)! the caller will free it. -} - - -void Task_Set_Select (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - - lpFileset->Close(); - } -} - - -void Task_Set_BeginDrag (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - lpFileset->Close(); - } -} - - -void Task_Set_DragMenu (LPTASKPACKET ptp) -{ - TASKDATA(ptp)->mt = *(LPMENUTASK)(ptp->lpUser); - Delete ((LPMENUTASK)(ptp->lpUser)); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. - - if (TASKDATA(ptp)->mt.lpi && TASKDATA(ptp)->mt.lpi->fIsFileset()) - { - LPFILESET lpFileset; - if ((lpFileset = TASKDATA(ptp)->mt.lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - lpFileset->Close(); - } - } -} - - -void Task_Set_Menu (LPTASKPACKET ptp) -{ - TASKDATA(ptp)->mt = *(LPMENUTASK)(ptp->lpUser); - Delete ((LPMENUTASK)(ptp->lpUser)); - ptp->lpUser = NULL; // we deleted this; don't let the caller use it again. - - if (TASKDATA(ptp)->mt.lpi && TASKDATA(ptp)->mt.lpi->fIsFileset()) - { - LPFILESET lpFileset; - if ((lpFileset = TASKDATA(ptp)->mt.lpi->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if (!lpFileset->GetStatus (&TASKDATA(ptp)->fs, TRUE, &ptp->status)) - ptp->rc = FALSE; - - lpFileset->Close(); - } - } -} - - -void Task_Set_Lock (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - ptp->rc = AfsClass_LockFileset (lpi, &ptp->status); -} - - -void Task_Set_Unlock (LPTASKPACKET ptp) -{ - LPIDENT lpi = (LPIDENT)(ptp->lpUser); - - if (lpi->fIsFileset()) - ptp->rc = AfsClass_UnlockFileset (lpi, &ptp->status); - else - ptp->rc = AfsClass_UnlockAllFilesets (lpi, &ptp->status); -} - - -void Task_Set_CreateRep (LPTASKPACKET ptp) -{ - LPSET_CREATEREP_PARAMS lpp = (LPSET_CREATEREP_PARAMS)(ptp->lpUser); - - LPIDENT lpiReplica; - if ((lpiReplica = AfsClass_CreateReplica (lpp->lpiSource, lpp->lpiTarget, &ptp->status)) == NULL) - ptp->rc = FALSE; - - if (ptp->rc) - { - TASKDATA(ptp)->lpi = lpiReplica; - } - else - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpp->lpiTarget->GetServerName (szServer); - lpp->lpiTarget->GetAggregateName (szAggregate); - lpp->lpiSource->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CREATE_REPLICA, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_Rename_Init (LPTASKPACKET ptp) -{ - LPSET_RENAME_INIT_PARAMS lpp = (LPSET_RENAME_INIT_PARAMS)(ptp->lpUser); - - LPFILESET lpFileset; - if ((lpFileset = lpp->lpiReq->OpenFileset (&ptp->status)) == NULL) - ptp->rc = FALSE; - else - { - if ((lpp->lpiRW = lpFileset->GetReadWriteIdentifier (&ptp->status)) == NULL) - ptp->rc = FALSE; - lpFileset->Close(); - } - - // don't delete this packet (ptp->lpUser)! the caller will free it. -} - - -void Task_Set_Rename_Apply (LPTASKPACKET ptp) -{ - LPSET_RENAME_APPLY_PARAMS lpp = (LPSET_RENAME_APPLY_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_RenameFileset (lpp->lpiFileset, lpp->szNewName, &ptp->status); - - if (!ptp->rc) - { - TCHAR szFileset[ cchNAME ]; - lpp->lpiFileset->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_RENAME_FILESET, TEXT("%s%s"), szFileset, lpp->szNewName); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_Release (LPTASKPACKET ptp) -{ - LPSET_RELEASE_PARAMS lpp = (LPSET_RELEASE_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_ReleaseFileset (lpp->lpiRW, lpp->fForce, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpp->lpiRW->GetServerName (szServer); - lpp->lpiRW->GetAggregateName (szAggregate); - lpp->lpiRW->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_RELEASE_FILESET, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let anyone use it. -} - - -void Task_Set_Clone (LPTASKPACKET ptp) -{ - LPIDENT lpiRW = (LPIDENT)(ptp->lpUser); - - ptp->rc = AfsClass_Clone (lpiRW, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpiRW->GetServerName (szServer); - lpiRW->GetAggregateName (szAggregate); - lpiRW->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CLONE, TEXT("%s%s%s"), szServer, szAggregate, szFileset); - } -} - - -void Task_Set_Clonesys (LPTASKPACKET ptp) -{ - LPSET_CLONESYS_PARAMS lpp = (LPSET_CLONESYS_PARAMS)(ptp->lpUser); - - LPTSTR pszPrefix = (lpp->fUsePrefix) ? lpp->szPrefix : NULL; - if (!AfsClass_CloneMultiple (lpp->lpi, pszPrefix, lpp->fExcludePrefix, &ptp->status)) - ptp->rc = FALSE; - - if (!ptp->rc && !IsWindow (ptp->hReply)) - { - ErrorDialog (ptp->status, IDS_ERROR_CANT_CLONESYS); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let anyone use it. -} - - -void Task_Set_Dump (LPTASKPACKET ptp) -{ - LPSET_DUMP_PARAMS lpp = (LPSET_DUMP_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_DumpFileset (lpp->lpi, lpp->szFilename, - (lpp->fDumpByDate) ? &lpp->stDump : NULL, - &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - TCHAR szFileset[ cchNAME ]; - lpp->lpi->GetServerName (szServer); - lpp->lpi->GetAggregateName (szAggregate); - lpp->lpi->GetFilesetName (szFileset); - ErrorDialog (ptp->status, IDS_ERROR_CANT_DUMP_FILESET, TEXT("%s%s%s%s"), szServer, szAggregate, szFileset, lpp->szFilename); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_Restore (LPTASKPACKET ptp) -{ - LPSET_RESTORE_PARAMS lpp = (LPSET_RESTORE_PARAMS)(ptp->lpUser); - - ptp->rc = AfsClass_RestoreFileset (lpp->lpi, lpp->szFileset, lpp->szFilename, lpp->fIncremental, &ptp->status); - - if (!ptp->rc) - { - TCHAR szServer[ cchNAME ]; - TCHAR szAggregate[ cchNAME ]; - lpp->lpi->GetServerName (szServer); - lpp->lpi->GetAggregateName (szAggregate); - ErrorDialog (ptp->status, IDS_ERROR_CANT_RESTORE_FILESET, TEXT("%s%s%s%s"), szServer, szAggregate, lpp->szFileset, lpp->szFilename); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Set_Lookup (LPTASKPACKET ptp) -{ - LPSET_LOOKUP_PACKET lpp = (LPSET_LOOKUP_PACKET)(ptp->lpUser); - - if ((TASKDATA(ptp)->lpi = IDENT::FindFileset (g.lpiCell, lpp->szFileset)) != NULL) - { - LPFILESET lpFileset; - if ((lpFileset = TASKDATA(ptp)->lpi->OpenFileset()) == NULL) - TASKDATA(ptp)->lpi = NULL; // fileset was probably deleted earlier - else - lpFileset->Close(); - } - - Delete (lpp); - ptp->lpUser = NULL; // deleted this, so don't let the caller use it. -} - - -void Task_Expired_Creds (LPTASKPACKET ptp) -{ - if (g.lpiCell) - { - CheckForExpiredCredentials(); - } -} - diff --git a/src/WINNT/afssvrmgr/task.h b/src/WINNT/afssvrmgr/task.h deleted file mode 100644 index 073991a8a..000000000 --- a/src/WINNT/afssvrmgr/task.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TASK_H -#define TASK_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -typedef struct - { - HWND hParent; - POINT ptScreen; - LPIDENT lpi; - } MENUTASK, *LPMENUTASK; - -typedef struct - { - HWND hCombo; - LPIDENT lpiSelect; - } SVR_ENUM_TO_COMBOBOX_PACKET, *LPSVR_ENUM_TO_COMBOBOX_PACKET; - -typedef struct - { - HWND hList; - LPIDENT lpiServer; - LPIDENT lpiSelect; - LPVIEWINFO lpvi; - } AGG_ENUM_TO_LISTVIEW_PACKET, *LPAGG_ENUM_TO_LISTVIEW_PACKET; - -typedef struct - { - HWND hCombo; - LPIDENT lpiServer; - LPIDENT lpiSelect; - } AGG_ENUM_TO_COMBOBOX_PACKET, *LPAGG_ENUM_TO_COMBOBOX_PACKET; - -typedef struct - { - HWND hCombo; - LPIDENT lpiServer; - LPIDENT lpiAggregate; - LPIDENT lpiSelect; - } SET_ENUM_TO_COMBOBOX_PACKET, *LPSET_ENUM_TO_COMBOBOX_PACKET; - -typedef struct - { - TCHAR szFileset[ cchRESOURCE ]; - } SET_LOOKUP_PACKET, *LPSET_LOOKUP_PACKET; - -typedef struct - { - TCHAR szCell[ cchNAME ]; - LPSUBSET sub; - BOOL fCloseAppOnFail; - PVOID hCreds; - } OPENCELL_PACKET, *LPOPENCELL_PACKET; - -typedef struct - { - HWND hList; - LPSUBSET sub; - } SUBSET_TO_LIST_PACKET, *LPSUBSET_TO_LIST_PACKET; - -typedef enum - { -#ifdef DEBUG - taskEXPORTCELL, // lp = (LPTSTR)pszFileName -#endif - taskOPENCELL, // lp = new OPENCELL_PACKET - taskOPENEDCELL, // lp = (LPIDENT)lpiCellOpened - taskCLOSEDCELL, // lp = (LPIDENT)lpiCellClosed - taskREFRESH, // lp = (LPIDENT)lpiToRefresh - taskREFRESH_CREDS, // lp = (LPIDENT)lpiCellToRefresh - taskSUBSET_TO_LIST, // lp = new SUBSET_TO_LIST_PACKET - taskAPPLY_SUBSET, // lp = (LPSUBSET)subNew - taskSVR_PROP_INIT, // lp = (LPIDENT)lpiServer - taskSVR_SCOUT_INIT, // lp = (LPIDENT)lpiServer - taskSVR_SCOUT_APPLY, // lp = new SVR_SCOUT_APPLY_PACKET - taskSVR_ENUM_TO_COMBOBOX, // lp = new SVR_ENUM_TO_COMBOBOX_PACKET - taskSVR_GETWINDOWPOS, // lp = (LPIDENT)lpiServer - taskSVR_SETWINDOWPOS, // lp = new SVR_SETWINDOWPOS_PARAMS - taskSVR_SYNCVLDB, // lp = new SVR_SYNCVLDB_PARAMS - taskSVR_SALVAGE, // lp = new SVR_SALVAGE_PARAMS - taskSVR_INSTALL, // lp = new SVR_INSTALL_PARAMS - taskSVR_UNINSTALL, // lp = new SVR_UNINSTALL_PARAMS - taskSVR_PRUNE, // lp = new SVR_PRUNE_PARAMS - taskSVR_GETDATES, // lp = new SVR_GETDATES_PARAMS - taskSVR_EXECUTE, // lp = new SVR_EXECUTE_PARAMS - taskSVR_SETAUTH, // lp = new SVR_SETAUTH_PARAMS - taskSVR_ADMLIST_OPEN, // lp = (LPIDENT)lpiServer - taskSVR_ADMLIST_SAVE, // lp = AfsClass_AdminList_Copy(lpList) - taskSVR_KEYLIST_OPEN, // lp = (LPIDENT)lpiServer - taskSVR_KEY_CREATE, // lp = LPKEY_CREATE_PARAMS - taskSVR_KEY_DELETE, // lp = LPKEY_DELETE_PARAMS - taskSVR_GETRANDOMKEY, // lp = (LPIDENT)lpiServer - taskSVR_HOSTLIST_OPEN, // lp = (LPIDENT)lpiServer - taskSVR_HOSTLIST_SAVE, // lp = AfsClass_HostList_Copy(lpList) - taskSVR_MONITOR_ONOFF, // lp = (LPIDENT)lpiServer - taskSVR_CHANGEADDR, // lp = new SVR_CHANGEADDR_PARAMS - taskSVC_MENU, // lp = new MENUTASK - taskSVC_PROP_INIT, // lp = (LPIDENT)lpiService - taskSVC_PROP_APPLY, // lp = new SVC_PROP_APPLY_PACKET - taskSVC_START, // lp = new SVC_START_PARAMS - taskSVC_STOP, // lp = new SVC_STOP_PARAMS - taskSVC_RESTART, // lp = (LPIDENT)lpiService - taskSVC_FINDLOG, // lp = (LPIDENT)lpiService - taskSVC_VIEWLOG, // lp = new LPSVC_VIEWLOG_PACKET - taskSVC_CREATE, // lp = new LPSVC_CREATE_PARAMS - taskSVC_DELETE, // lp = (LPIDENT)lpiService - taskSVC_GETRESTARTTIMES, // lp = new SVC_RESTARTTIMES_PARAMS - taskSVC_SETRESTARTTIMES, // lp = new SVC_RESTARTTIMES_PARAMS - taskAGG_PROP_INIT, // lp = (LPIDENT)lpiAggregate - taskAGG_PROP_APPLY, // lp = new AGG_PROP_APPLY_PACKET - taskAGG_FIND_QUOTA_LIMITS, // lp = (LPIDENT)lpiAggregate - taskAGG_ENUM_TO_LISTVIEW, // lp = new AGG_ENUM_TO_LISTVIEW_PACKET - taskAGG_ENUM_TO_COMBOBOX, // lp = new AGG_ENUM_TO_COMBOBOX_PACKET - taskAGG_FIND_GHOST, // lp = (LPIDENT)lpiAggregate - taskSET_ENUM_TO_COMBOBOX, // lp = new SET_ENUM_TO_COMBOBOX_PACKET - taskSET_FIND_GHOST, // lp = (LPIDENT)lpiFileset - taskSET_CREATE, // lp = new SET_CREATE_PARAMS - taskSET_DELETE, // lp = new SET_DELETE_PARAMS - taskSET_MOVE, // lp = new SET_MOVE_PARAMS - taskSET_MOVETO_INIT, // lp = (LPIDENT)lpiFileset - taskSET_PROP_INIT, // lp = (LPIDENT)lpiFileset - taskSET_PROP_APPLY, // lp = new SET_PROP_APPLY_PARAMS - taskSET_SETQUOTA_INIT, // lp = (LPIDENT)lpiFileset - taskSET_SETQUOTA_APPLY, // lp = new SET_SETQUOTA_APPLY_PARAMS - taskSET_REPPROP_INIT, // lp = (LPIDENT)lpiFileset - taskSET_SELECT, // lp = (LPIDENT)lpiFileset - taskSET_BEGINDRAG, // lp = (LPIDENT)lpiFileset - taskSET_DRAGMENU, // lp = (LPMENUTASK)new MENUTASK - taskSET_MENU, // lp = (LPMENUTASK)new MENUTASK - taskSET_LOCK, // lp = (LPIDENT)lpiFileset - taskSET_UNLOCK, // lp = (LPIDENT)lpi (set,agg,svr,cell) - taskSET_CREATEREP, // lp = new SET_CREATEREP_PARAMS - taskSET_RENAME_INIT, // lp = new SET_RENAME_INIT_PARAMS - taskSET_RENAME_APPLY, // lp = new SET_RENAME_APPLY_PARAMS - taskSET_RELEASE, // lp = new SET_RELEASE_PARAMS - taskSET_CLONE, // lp = (LPIDENT)lpiRW - taskSET_CLONESYS, // lp = new SET_CLONESYS_PARAMS - taskSET_DUMP, // lp = new SET_DUMP_PARAMS - taskSET_RESTORE, // lp = new SET_RESTORE_PARAMS - taskSET_LOOKUP, // lp = new SET_LOOKUP_PACKET - taskEXPIRED_CREDS, // lp = unused - } TASK; - -typedef struct - { - LPIDENT lpiCell; // what was found out? - LPTSTR pszText1; - LPTSTR pszText2; // these parameters are filled in - LPTSTR pszText3; // selectively, depending upon the - ALERT alert; - LPIDENT lpi; - SERVERSTATUS ss; - SERVICESTATUS cs; - AGGREGATESTATUS as; - FILESETSTATUS fs; - LPSERVER_PREF lpsp; - LPSERVICE_PREF lpcp; - LPAGGREGATE_PREF lpap; - LPFILESET_PREF lpfp; - size_t nAggr; - MENUTASK mt; - size_t ckMin; - size_t ckMax; - size_t ckCapacity; - size_t ckAllocation; - short wGhost; - RECT rWindow; - size_t nFilesets; - LPADMINLIST lpAdmList; - LPHOSTLIST lpHostList; - BOOL fHasReplicas; - LPKEYLIST lpKeyList; - ENCRYPTIONKEY key; - } TASKPACKETDATA, *LPTASKPACKETDATA; - -#define TASKDATA(_ptp) ((LPTASKPACKETDATA)(ptp->pReturn)) - - -LPTASKPACKET CreateTaskPacket (int idTask, HWND hReply, PVOID lpUser); -void FreeTaskPacket (LPTASKPACKET ptp); -void PerformTask (LPTASKPACKET ptp); - - -#endif - diff --git a/src/WINNT/afssvrmgr/window.cpp b/src/WINNT/afssvrmgr/window.cpp deleted file mode 100644 index 4b830b1b7..000000000 --- a/src/WINNT/afssvrmgr/window.cpp +++ /dev/null @@ -1,1125 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "svrmgr.h" -#include -#include "display.h" -#include "command.h" -#include "messages.h" -#include "svr_window.h" -#include "svr_general.h" -#include "svr_security.h" -#include "set_repprop.h" -#include "set_createrep.h" -#include "set_rename.h" -#include "columns.h" -#include "propcache.h" -#include "action.h" -#include "creds.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -#define cxMIN_SERVER 75 -#define cyMIN_SERVER 70 - -#define cxMIN_TABS 100 -#define cyMIN_TABS 100 - -#define cxMIN_WINDOW_PREVIEW 220 -#define cyMIN_WINDOW_PREVIEW 250 - -#define cxMIN_WINDOW 120 -#define cyMIN_WINDOW 120 - -rwWindowData awdMain[] = { - { IDC_CELL_BORDER, raSizeX, 0, 0 }, - { IDC_CELL, raSizeX | raRepaint, 0, 0 }, - { IDC_AFS_ID, raSizeX | raRepaint, 0, 0 }, - { IDC_SERVERS, raSizeX | raSizeY, MAKELONG(cxMIN_SERVER,cyMIN_SERVER), 0 }, - { IDC_COVERDLG, raSizeX | raSizeY, 0, 0 }, - { IDC_ANIMATE, raMoveX, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - -rwWindowData awdMainVert[] = { - { IDC_CELL_BORDER, raSizeX, 0, 0 }, - { IDC_CELL, raSizeX | raRepaint, 0, 0 }, - { IDC_AFS_ID, raSizeX | raRepaint, 0, 0 }, - { IDC_SERVERS, raSizeX, MAKELONG(cxMIN_SERVER,cyMIN_SERVER), 0 }, - { IDC_SPLITTER_SERVER, raSizeX, 0, 0 }, - { IDC_TABS, raSizeX | raSizeY, MAKELONG(cxMIN_TABS,cyMIN_TABS), 0 }, - { IDC_COVERDLG, raSizeX, 0, 0 }, - { IDC_ANIMATE, raMoveX, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - -rwWindowData awdMainHorz[] = { - { IDC_CELL_BORDER, raSizeX, 0, 0 }, - { IDC_CELL, raSizeX | raRepaint, 0, 0 }, - { IDC_AFS_ID, raSizeX | raRepaint, 0, 0 }, - { IDC_SERVERS, raSizeY, MAKELONG(cxMIN_SERVER,cyMIN_SERVER), 0 }, - { IDC_SPLITTER_SERVER, raSizeY, 0, 0 }, - { IDC_TABS, raSizeX | raSizeY, MAKELONG(cxMIN_TABS,cyMIN_TABS), 0 }, - { IDC_COVERDLG, raSizeY, 0, 0 }, - { IDC_ANIMATE, raMoveX, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - -rwWindowData awdSplitServer[] = { - { IDC_CELL, raRepaint, 0, 0 }, - { IDC_AFS_ID, raRepaint, 0, 0 }, - { IDC_SERVERS, raSizeX | raSizeY, MAKELONG(cxMIN_SERVER,cyMIN_SERVER), 0 }, - { IDC_SPLITTER_SERVER, raMoveX | raMoveY, 0, 0 }, - { IDC_TABS, raMoveX | raMoveY | raSizeXB | raSizeYB, MAKELONG(cxMIN_TABS,cyMIN_TABS), 0 }, - { IDC_COVERDLG, raSizeX | raSizeY, 0, 0 }, - { IDC_ANIMATE, 0, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Main_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns); - -void Main_OnPreviewPane (BOOL fPreviewNew, BOOL fVertNew, BOOL fStoreView); -DWORD WINAPI Main_OnOpenServers_ThreadProc (PVOID lp); - -void Main_SubclassServers (HWND hDlg); - -void Main_CreateTabControl (void); -void Main_DeleteTabControl (void); -void Main_DisplayTab (CHILDTAB iTab); -void Main_RearrangeChildren (BOOL fSplitNew, BOOL fVertNew); - -BOOL Main_HandleDialogKeys (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Main_OnKey_CtrlTab (BOOL fForward); -void Main_OnKey_Tab (BOOL fForward); - -#ifdef DEBUG -void ExportCell (void); -#endif - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - - -static BOOL fEnforceMinimumSize = TRUE; -static BOOL fNotifyChildrenForResize = TRUE; -static LONG nReqWorking = 0; -static int iFrameLast = 0; - -BOOL CALLBACK Main_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (HandleColumnNotify (hDlg, msg, wp, lp, (gr.fPreview && !gr.fVert) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr)) - return FALSE; - - if (Main_HandleDialogKeys (hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) // get this out of the way. :) - { - g.hMain = hDlg; - AfsAppLib_SetMainWindow (g.hMain); - } - - switch (msg) - { - case WM_INITDIALOG: - { - LPRECT prTarget = (gr.fPreview) ? &gr.rMainPreview : &gr.rMain; - if (prTarget->right == 0) - GetWindowRect (g.hMain, prTarget); - ResizeWindow (g.hMain, awdMain, rwaMoveToHere, prTarget); - - Main_SetActionMenus(); - - // Subclass the Servers window, so we can watch for focus changes - // and context-menu requests - // - Main_SubclassServers (hDlg); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_SERVERS), GetItemText, (DWORD)((gr.fPreview && !gr.fVert) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr)); - - // Create the preview pane and rearrange the children of this dialog. - // This also fixes the Servers display--was it in Large Icons view? - // What columns were shown? - // - Main_OnPreviewPane (gr.fPreview, gr.fVert, FALSE); - - // Tell our notification dispatcher to let this window know whenever - // a cell gets opened or closed (that's what the NULL does--otherwise, - // an LPIDENT would go there to indicate we're interested in a - // particular server etc). - // - NotifyMe (WHEN_CELL_OPENED, NULL, hDlg, 0); // tell me about any cell - - // If we weren't around when the cell was created, we might have - // missed some notifications. Send a redraw just in case. - // - StartThread (Main_Redraw_ThreadProc, FALSE); - - SetTimer (hDlg, ID_DISPATCH_TIMER, 200, NULL); // do all notifications - } - break; - - case WM_DESTROY: - KillTimer (hDlg, ID_DISPATCH_TIMER); - break; - - case WM_QUERYENDSESSION: - if (Action_fAnyActive()) - { - ShowWindow (g.hMain, SW_SHOW); - if (Message (MB_ICONHAND | MB_YESNO, IDS_CANT_QUIT_TITLE, IDS_CANT_QUIT_REBOOT) != IDYES) - return TRUE; - } - break; - - case WM_TIMER: - if (wp == ID_DISPATCH_TIMER) - { - DispatchNotification_OnPump(); - } - break; - - case WM_HELP: - if ((lp == 0) || (IsAncestor (g.hMain, (HWND)(((LPHELPINFO)lp)->hItemHandle)))) - { - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - } - break; - - case WM_NOTIFY_FROM_DISPATCH: - Main_OnNotifyFromDispatch ((LPNOTIFYSTRUCT)lp); - Delete ((LPNOTIFYSTRUCT)lp); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskSVR_GETWINDOWPOS) - Server_Open ((LPIDENT)(ptp->lpUser), &TASKDATA(ptp)->rWindow); - else if (ptp->idTask == taskSET_REPPROP_INIT) - Filesets_OnEndTask_ShowReplication (ptp); - else if (ptp->idTask == taskSET_RENAME_INIT) - Filesets_OnEndTask_ShowRename (ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_OPEN_SERVERS: - StartThread (Main_OnOpenServers_ThreadProc, 0); - break; - - case WM_OPEN_SERVER: - StartTask (taskSVR_GETWINDOWPOS, g.hMain, (LPIDENT)lp); - break; - - case WM_SHOW_CREATEREP_DIALOG: - Filesets_CreateReplica ((LPIDENT)wp, (LPIDENT)lp); - break; - - case WM_SHOW_YOURSELF: - if (lp || g.lpiCell) - { - ShowWindow (g.hMain, SW_SHOW); - BringWindowToTop (g.hMain); - Action_WindowToTop (TRUE); - } - break; - - case WM_OPEN_ACTIONS: - Action_OpenWindow(); - break; - - case WM_REFRESHED_CREDENTIALS: - g.hCreds = (PVOID)lp; - UpdateDisplay_Cell(FALSE); - StartTask (taskREFRESH_CREDS, NULL, g.lpiCell); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - Action_WindowToTop ((lp) ? TRUE : FALSE); - if (lp != 0) - { - rwWindowData *pwdResizeInfo; - - if (!gr.fPreview) - pwdResizeInfo = awdMain; - else if (gr.fVert) - pwdResizeInfo = awdMainVert; - else // (!gr.fVert) - pwdResizeInfo = awdMainHorz; - - if (fNotifyChildrenForResize) - ResizeWindow (hDlg, pwdResizeInfo, rwaFixupGuts); - else - ResizeWindow (hDlg, pwdResizeInfo, rwaJustResync); - } - break; - - case WM_ACTIVATEAPP: - Action_WindowToTop ((wp) ? TRUE : FALSE); - - if (wp) - StartTask (taskEXPIRED_CREDS); - break; - - case WM_CONTEXTMENU: - { - POINT ptScreen; - POINT ptClient; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - - ptClient = ptScreen; - ScreenToClient ((HWND)wp, &ptClient); - - if ((HWND)wp == GetDlgItem (g.hMain, IDC_SERVERS)) - Server_ShowPopupMenu ((HWND)wp, ptClient, ptScreen); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - case M_EXIT: - Quit (0); - break; - - case M_DIVIDE_NONE: - Main_OnPreviewPane (FALSE, gr.fVert, TRUE); - UpdateDisplay_Servers (FALSE, NULL, 0); - break; - case M_DIVIDE_H: - Main_OnPreviewPane (TRUE, FALSE, TRUE); - UpdateDisplay_Servers (FALSE, NULL, 0); - break; - case M_DIVIDE_V: - Main_OnPreviewPane (TRUE, TRUE, TRUE); - UpdateDisplay_Servers (FALSE, NULL, 0); - break; - - case M_SVR_VIEW_LARGE: - Main_OnServerView (FLS_VIEW_LARGE); - break; - case M_SVR_VIEW_SMALL: - Main_OnServerView (FLS_VIEW_SMALL); - break; - case M_SVR_VIEW_REPORT: - Main_OnServerView (FLS_VIEW_LIST); - break; - - case M_COLUMNS: - if (!gr.fPreview) - ShowColumnsDialog (hDlg, NULL); - else - { - CHILDTAB iTab = Server_GetDisplayedTab (g.hMain); - if (iTab == tabSERVICES) - ShowColumnsDialog (hDlg, &gr.viewSvc); - else if (iTab == tabAGGREGATES) - ShowColumnsDialog (hDlg, &gr.viewAgg); - else if (iTab == tabFILESETS) - ShowColumnsDialog (hDlg, &gr.viewSet); - else - ShowColumnsDialog (hDlg, NULL); - } - break; - - case M_ACTIONS: - if ((gr.fActions = !gr.fActions) == TRUE) - Action_OpenWindow(); - else - Action_CloseWindow(); - Main_SetActionMenus(); - break; - -#ifdef DEBUG - case M_EXPORT: - ExportCell(); - break; -#endif - - case IDC_COVER_BUTTON: - // The user must have clicked the "Try Again" or "Credentials" - // button on the cover we placed over the Servers list. - // Refresh the cell or obtain new credentials, as appropriate. - // - if (g.lpiCell) - { - TCHAR szButton[ cchRESOURCE ]; - GetWindowText ((HWND)lp, szButton, cchRESOURCE); - - TCHAR szTest[ cchRESOURCE ]; - - GetString (szTest, IDS_ALERT_BUTTON_TRYAGAIN); - if (!lstrcmp (szTest, szButton)) - { - StartTask (taskREFRESH, NULL, g.lpiCell); - break; - } - - GetString (szTest, IDS_ALERT_BUTTON_GETCREDS); - if (!lstrcmp (szTest, szButton)) - { - NewCredsDialog(); - break; - } - } - break; - - default: - StartContextCommand (g.hMain, NULL, NULL, LOWORD(wp)); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case TCN_SELCHANGE: - { - int iPage = TabCtrl_GetCurSel (GetDlgItem (g.hMain, IDC_TABS)); - Main_DisplayTab ((CHILDTAB)iPage); - } - break; - - case FLN_ITEMSELECT: - if (gr.fPreview) - { - HWND hServers = GetDlgItem (hDlg, IDC_SERVERS); - LPIDENT lpi = (LPIDENT)FL_GetSelectedData (hServers); - - Server_SelectServer (SERVERWINDOW_PREVIEWPANE, lpi); - } - break; - - case FLN_LDBLCLICK: - { - HWND hServers = GetDlgItem (g.hMain, IDC_SERVERS); - - if (((LPNMHDR)lp)->hwndFrom == hServers) - { - LPIDENT lpi = (LPIDENT)FL_GetSelectedData (hServers); - - if (lpi && lpi->fIsServer()) - { - BOOL fOpenWindow; - - if (gr.fDoubleClickOpens == 0) - fOpenWindow = FALSE; - else if (gr.fDoubleClickOpens == 1) - fOpenWindow = TRUE; - else if (gr.fPreview) - fOpenWindow = FALSE; - else // (!gr.Preview) - fOpenWindow = TRUE; - - if (!fOpenWindow) - { - PostMessage (hServers, WM_COMMAND, M_PROPERTIES, 0); - } - else // (fOpenWindow) - { - PostMessage (g.hMain, WM_OPEN_SERVER, 0, (LPARAM)lpi); - } - } - } - } - break; - } - break; - } - - return FALSE; -} - - -void Main_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns) -{ - switch (lpns->evt) - { - case evtCreate: - StartTask (taskOPENEDCELL, NULL, lpns->Params.lpi1); - break; - - case evtDestroy: - StartTask (taskCLOSEDCELL, NULL, lpns->Params.lpi1); - break; - - case evtRefreshStatusEnd: - case evtAlertsChanged: - if (lpns->Params.lpi1 && lpns->Params.lpi1->fIsCell()) - { - UpdateDisplay_Cell (FALSE); - } - else if (lpns->Params.lpi1 && lpns->Params.lpi1->fIsServer()) - { - UpdateDisplay_Servers (FALSE, lpns->Params.lpi1, lpns->Params.status); - } - break; - - case evtRefreshServersEnd: - if (g.lpiCell || lpns->Params.status == 0) - { - UpdateDisplay_Servers (FALSE, NULL, 0); - } - break; - } -} - - -DWORD WINAPI Main_OnOpenServers_ThreadProc (PVOID lp) -{ - AfsClass_Enter(); - - if (g.lpiCell != NULL) - { - LPCELL lpCell; - if ((lpCell = g.lpiCell->OpenCell()) != NULL) - { - HENUM hEnum; - for (LPSERVER lpServer = lpCell->ServerFindFirst (&hEnum); lpServer; lpServer = lpCell->ServerFindNext (&hEnum)) - { - LPSERVER_PREF lpsp; - if ((lpsp = (LPSERVER_PREF)lpServer->GetUserParam()) != NULL) - { - if (lpsp->fOpen && !PropCache_Search (pcSERVER, lpServer->GetIdentifier())) - { - PostMessage (g.hMain, WM_OPEN_SERVER, 0, (LPARAM)(lpServer->GetIdentifier())); - } - } - lpServer->Close(); - } - lpCell->Close(); - } - } - - AfsClass_Leave(); - return 0; -} - - -DWORD WINAPI Main_Redraw_ThreadProc (PVOID lp) -{ - BOOL fInvalidate = (BOOL)lp; - AfsClass_Enter(); - - if (g.lpiCell == NULL) - { - AfsAppLib_Uncover (GetDlgItem (g.hMain, IDC_SERVERS)); - } - else - { - TCHAR szName[ cchRESOURCE ]; - g.lpiCell->GetCellName (szName); - - LPTSTR pszCover = FormatString (IDS_SEARCHING_FOR_SERVERS, TEXT("%s"), szName); - AfsAppLib_CoverWindow (GetDlgItem (g.hMain, IDC_SERVERS), pszCover); - FreeString (pszCover); - } - - LPCELL lpCell = NULL; - if (g.lpiCell != NULL) - lpCell = g.lpiCell->OpenCell(); - - if (lpCell) - { - if (fInvalidate) - { - lpCell->Invalidate(); - lpCell->RefreshAll(); - } - else - { - lpCell->RefreshStatus(); - lpCell->RefreshServers(); - } - } - else // no cell is selected; we'll have to redraw the window directly. - { - UpdateDisplay_Cell (TRUE); - UpdateDisplay_Servers (TRUE, NULL, 0); - } - - if (lpCell != NULL) - lpCell->Close(); - - AfsClass_Leave(); - return 0; -} - - -void Main_OnPreviewPane (BOOL fPreviewNew, BOOL fVertNew, BOOL fStoreCurrentView) -{ - if (fStoreCurrentView) - { - if (gr.fPreview && !gr.fVert) - FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diHorz.viewSvr); - else - FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diVert.viewSvr); - - if (gr.fPreview) - GetWindowRect (g.hMain, &gr.rMainPreview); - else - GetWindowRect (g.hMain, &gr.rMain); - } - - // If switching from having a preview pane to not (or vice-versa), - // and we have an alterate gr.rMain* to switch to, resize the window. - // - if (IsWindowVisible (g.hMain)) - { - RECT rNow; - GetWindowRect (g.hMain, &rNow); - - LPRECT prTarget = (fPreviewNew) ? &gr.rMainPreview : &gr.rMain; - if (prTarget->right == 0) - { - *prTarget = rNow; - if (gr.fPreview && gr.fVert) // preview pane exists below main window? - { - RECT rPreview; - GetWindowRect (GetDlgItem (g.hMain, IDC_TABS), &rPreview); - if (gr.fVert) - prTarget->bottom -= cyRECT(rPreview); - } - } - prTarget->right = prTarget->left + cxRECT(rNow); // keep the same width! - - fEnforceMinimumSize = FALSE; - fNotifyChildrenForResize = FALSE; - - SetWindowPos (g.hMain, NULL, - 0, 0, cxRECT(*prTarget), cyRECT(*prTarget), - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - - fNotifyChildrenForResize = TRUE; - fEnforceMinimumSize = TRUE; - } - - // Create a tab control if necessary, or remove it if it should be gone. - // - if (fPreviewNew && !GetDlgItem (g.hMain, IDC_TABS)) - { - Main_CreateTabControl(); - } - if (!fPreviewNew && GetDlgItem (g.hMain, IDC_TABS)) - { - Main_DeleteTabControl(); - } - - // If there's a tab control, we'll need a splitter; if not, not. - // - if (GetDlgItem (g.hMain, IDC_SPLITTER_SERVER)) - { - DeleteSplitter (g.hMain, IDC_SPLITTER_SERVER); - } - - Main_RearrangeChildren (fPreviewNew, fVertNew); - - if (fPreviewNew) - { - CreateSplitter (g.hMain, IDC_SERVERS, IDC_TABS, IDC_SPLITTER_SERVER, - (fVertNew) ? &gr.diVert.cSplitter : &gr.diHorz.cSplitter, - awdSplitServer, - TRUE); - } - - if (GetDlgItem (g.hMain, IDC_TABS)) - { - ShowWindow (GetDlgItem (g.hMain, IDC_TABS), SW_SHOW); - } - - LPVIEWINFO lpvi = (fPreviewNew && !fVertNew) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr; - - FL_RestoreView (GetDlgItem (g.hMain, IDC_SERVERS), lpvi); - - CheckMenuRadioItem (GetMenu (g.hMain), - M_DIVIDE_NONE, M_DIVIDE_H, - ( (!fPreviewNew) ? M_DIVIDE_NONE : - (fVertNew) ? M_DIVIDE_V : - M_DIVIDE_H ), - MF_BYCOMMAND); - - gr.fVert = fVertNew; - gr.fPreview = fPreviewNew; - - Main_SetServerViewMenus(); -} - - -void Main_OnServerView (int lvsNew) -{ - HWND hServers = GetDlgItem (g.hMain, IDC_SERVERS); - - if (gr.fPreview && !gr.fVert) - FL_StoreView (hServers, &gr.diHorz.viewSvr); - else - FL_StoreView (hServers, &gr.diVert.viewSvr); - - if (gr.fPreview && !gr.fVert) - gr.diHorz.viewSvr.lvsView = lvsNew; - else - gr.diVert.viewSvr.lvsView = lvsNew; - - if (gr.fPreview && !gr.fVert) - FL_RestoreView (hServers, &gr.diHorz.viewSvr); - else - FL_RestoreView (hServers, &gr.diVert.viewSvr); - - Main_SetServerViewMenus(); - FastList_SetTextCallback (GetDlgItem (g.hMain, IDC_SERVERS), GetItemText, (DWORD)((gr.fPreview && !gr.fVert) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr)); - UpdateDisplay_Servers (FALSE, NULL, 0); -} - - -void Main_SetServerViewMenus (void) -{ - LONG lvs; - - if (gr.fPreview && !gr.fVert) - lvs = gr.diHorz.viewSvr.lvsView; - else - lvs = gr.diVert.viewSvr.lvsView; - - CheckMenuRadioItem (GetMenu (g.hMain), - M_SVR_VIEW_LARGE, M_SVR_VIEW_REPORT, - ( (lvs == FLS_VIEW_SMALL) ? M_SVR_VIEW_SMALL : - (lvs == FLS_VIEW_LIST) ? M_SVR_VIEW_REPORT : - M_SVR_VIEW_LARGE ), - MF_BYCOMMAND); - - ICONVIEW ivSvr = Display_GetServerIconView(); - - CheckMenuRadioItem (GetMenu (g.hMain), - M_SVR_VIEW_ONEICON, M_SVR_VIEW_STATUS, - (ivSvr == ivTWOICONS) ? M_SVR_VIEW_TWOICONS : - (ivSvr == ivONEICON) ? M_SVR_VIEW_ONEICON : M_SVR_VIEW_STATUS, - MF_BYCOMMAND); - - EnableMenu (GetMenu (g.hMain), M_SVR_VIEW_ONEICON, (lvs == FLS_VIEW_LIST) ? TRUE : FALSE); - EnableMenu (GetMenu (g.hMain), M_SVR_VIEW_TWOICONS, (lvs == FLS_VIEW_LIST) ? TRUE : FALSE); - EnableMenu (GetMenu (g.hMain), M_SVR_VIEW_STATUS, (lvs == FLS_VIEW_LIST) ? TRUE : FALSE); -} - - -void Main_SetActionMenus (void) -{ - CheckMenu (GetMenu (g.hMain), M_ACTIONS, gr.fActions); -} - - -void Main_CreateTabControl (void) -{ - HWND hTab = CreateWindowEx (WS_EX_CLIENTEDGE, - WC_TABCONTROL, - TEXT(""), - WS_CHILD | WS_CLIPSIBLINGS | WS_TABSTOP, - 0, 0, 128, 128, // arbitrary, but not too small - SERVERWINDOW_PREVIEWPANE, - (HMENU)IDC_TABS, - THIS_HINST, - NULL); - - if (hTab != NULL) - { - HFONT hf = (HFONT)GetStockObject (DEFAULT_GUI_FONT); - SendMessage (hTab, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0)); - - Server_PrepareTabControl (hTab); - - LPIDENT lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (g.hMain, IDC_SERVERS)); - Server_SelectServer (SERVERWINDOW_PREVIEWPANE, lpi); - } -} - - -void Main_DeleteTabControl (void) -{ - if (GetDlgItem (SERVERWINDOW_PREVIEWPANE, IDC_TABS)) - { - DestroyWindow (GetDlgItem (SERVERWINDOW_PREVIEWPANE, IDC_TABS)); - } -} - - -void Main_DisplayTab (CHILDTAB iTab) -{ - if (gr.fPreview) - { - Server_DisplayTab (SERVERWINDOW_PREVIEWPANE, iTab); - gr.tabLast = (CHILDTAB)iTab; - } -} - - -void Main_RearrangeChildren (BOOL fPreviewNew, BOOL fVertNew) -{ - RECT rServers; - RECT rPreview; - - // Start with the Servers window taking up the entire dialog's client area, - // leaving a space at the top for the cell combobox. - // - RECT rCell; - GetRectInParent (GetDlgItem (g.hMain, IDC_AFS_ID), &rCell); - - GetClientRect (g.hMain, &rServers); - rServers.top = rCell.bottom +3; - - // Then, if the preview tab is to be displayed, make the server window - // share the space equally with the tab control (vertically or horizontally) - // - if (fPreviewNew) - { - rPreview = rServers; - - if (fVertNew) - { - rServers.bottom = rServers.top + cyRECT(rServers)/2 - 1; - rPreview.top = rServers.bottom + 2; - } - else - { - rServers.right = rServers.left + cxRECT(rServers)/2 - 1; - rPreview.left = rServers.right + 2; - } - - // Adjust the server/tab windows for the Server splitter's position - // - if (fVertNew) - { - LONG cyMod = gr.diVert.cSplitter; - - if (cyRECT(rServers) > cyMIN_SERVER) - cyMod = min( cyMod, cyRECT(rServers)-cyMIN_SERVER ); - if (cyRECT(rPreview) > cyMIN_TABS) - cyMod = min( cyMod, cyRECT(rPreview)-cyMIN_TABS ); - - rServers.bottom += cyMod; - rPreview.top += cyMod; - } - else - { - LONG cxMod = gr.diHorz.cSplitter; - - if (cxRECT(rServers) > cxMIN_SERVER) - cxMod = min( cxMod, cxRECT(rServers)-cxMIN_SERVER ); - if (cxRECT(rPreview) > cxMIN_TABS) - cxMod = min( cxMod, cxRECT(rPreview)-cxMIN_TABS ); - - rServers.right += cxMod; - rPreview.left += cxMod; - } - } - - // Now move the children to their new places! - // - size_t nWindows = 1; - if (GetDlgItem (g.hMain, IDC_COVERDLG)) - ++nWindows; - if (GetDlgItem (g.hMain, IDC_TABS)) - ++nWindows; - HDWP dwp = BeginDeferWindowPos (nWindows); - - DeferWindowPos (dwp, GetDlgItem (g.hMain, IDC_SERVERS), NULL, - rServers.left, rServers.top, - cxRECT(rServers), cyRECT(rServers), - SWP_NOACTIVATE | SWP_NOZORDER); - - if (GetDlgItem (g.hMain, IDC_COVERDLG)) - { - DeferWindowPos (dwp, GetDlgItem (g.hMain, IDC_COVERDLG), NULL, - rServers.left, rServers.top, - cxRECT(rServers), cyRECT(rServers), - SWP_NOACTIVATE | SWP_NOZORDER); - } - - if (GetDlgItem (g.hMain, IDC_TABS)) - { - DeferWindowPos (dwp, GetDlgItem (g.hMain, IDC_TABS), NULL, - rPreview.left, rPreview.top, - cxRECT(rPreview), cyRECT(rPreview), - SWP_NOACTIVATE | SWP_NOZORDER); - } - - EndDeferWindowPos (dwp); -} - - - -static LONG procServers = 0; - -LRESULT CALLBACK Main_SubclassServersProc (HWND hServers, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc; - - if (procServers == 0) - rc = DefWindowProc (hServers, msg, wp, lp); - else - rc = CallWindowProc ((WNDPROC)procServers, hServers, msg, wp, lp); - - switch (msg) - { - case WM_DESTROY: - if (procServers != 0) - SetWindowLong (hServers, GWL_WNDPROC, procServers); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case M_SVR_VIEW_LARGE: - case M_SVR_VIEW_SMALL: - case M_SVR_VIEW_REPORT: - SendMessage (g.hMain, msg, wp, lp); - break; - - case M_VIEW_ONEICON: - case M_VIEW_TWOICONS: - case M_VIEW_STATUS: - SendMessage (g.hMain, msg, wp, lp); - break; - - case M_COLUMNS: - ShowColumnsDialog (g.hMain, NULL); - break; - - default: - StartContextCommand (g.hMain, - NULL, - (LPIDENT)FL_GetSelectedData (hServers), - LOWORD(wp)); - break; - } - break; - } - - return rc; -} - - -void Main_SubclassServers (HWND hDlg) -{ - HWND hServers = GetDlgItem (hDlg, IDC_SERVERS); - procServers = GetWindowLong (hServers, GWL_WNDPROC); - SetWindowLong (hServers, GWL_WNDPROC, (LONG)Main_SubclassServersProc); -} - - -#ifdef DEBUG -void ExportCell (void) -{ - if (!g.lpiCell) - return; - - TCHAR szFilter[ cchRESOURCE ]; - lstrcpy (szFilter, TEXT("Text File|*.TXT|")); - TCHAR chFilter = szFilter[ lstrlen(szFilter)-1 ]; - for (LPTSTR pszFilter = szFilter; - (*pszFilter) && ((pszFilter = (LPTSTR)lstrchr (pszFilter, chFilter)) != NULL); - ++pszFilter) - { - *pszFilter = TEXT('\0'); - } - - TCHAR szSaveAs[ MAX_PATH ] = TEXT("export"); - - OPENFILENAME sfn; - memset (&sfn, 0x00, sizeof(sfn)); - sfn.lStructSize = sizeof(sfn); - sfn.hwndOwner = g.hMain; - sfn.hInstance = THIS_HINST; - sfn.lpstrFilter = szFilter; - sfn.nFilterIndex = 1; - sfn.lpstrFile = szSaveAs; - sfn.nMaxFile = MAX_PATH; - sfn.Flags = OFN_HIDEREADONLY | OFN_NOREADONLYRETURN | - OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; - sfn.lpstrDefExt = TEXT("txt"); - - if (GetSaveFileName (&sfn)) - { - LPTSTR psz = CloneString (szSaveAs); - StartTask (taskEXPORTCELL, NULL, psz); - } -} -#endif - - -void Main_StartWorking (void) -{ - if (InterlockedIncrement(&nReqWorking) == 1) - { - AfsAppLib_StartAnimation (GetDlgItem (g.hMain, IDC_ANIMATE)); - } -} - -void Main_StopWorking (void) -{ - if (InterlockedDecrement(&nReqWorking) == 0) - { - AfsAppLib_StopAnimation (GetDlgItem (g.hMain, IDC_ANIMATE)); - } -} - - -void Main_AnimateIcon (HWND hIcon, int *piFrameLast) -{ - static HICON hiStop; - static HICON hiFrame[8]; - static BOOL fLoaded = FALSE; - - if (!fLoaded) - { - hiStop = TaLocale_LoadIcon (IDI_SPINSTOP); - hiFrame[0] = TaLocale_LoadIcon (IDI_SPIN1); - hiFrame[1] = TaLocale_LoadIcon (IDI_SPIN2); - hiFrame[2] = TaLocale_LoadIcon (IDI_SPIN3); - hiFrame[3] = TaLocale_LoadIcon (IDI_SPIN4); - hiFrame[4] = TaLocale_LoadIcon (IDI_SPIN5); - hiFrame[5] = TaLocale_LoadIcon (IDI_SPIN6); - hiFrame[6] = TaLocale_LoadIcon (IDI_SPIN7); - hiFrame[7] = TaLocale_LoadIcon (IDI_SPIN8); - fLoaded = TRUE; - } - - if (piFrameLast) - { - *piFrameLast = (*piFrameLast == 7) ? 0 : (1+*piFrameLast); - } - - SendMessage (hIcon, STM_SETICON, (WPARAM)((piFrameLast) ? hiFrame[ *piFrameLast ] : hiStop), 0); -} - - -BOOL Main_HandleDialogKeys (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_COMMAND) - { - switch (LOWORD(wp)) - { - case M_KEY_RETURN: - Server_OnKey_Return(); - return TRUE; - - case M_KEY_CTRLTAB: - Main_OnKey_CtrlTab (TRUE); - return TRUE; - - case M_KEY_CTRLBACKTAB: - Main_OnKey_CtrlTab (FALSE); - return TRUE; - - case M_KEY_TAB: - Main_OnKey_Tab (TRUE); - return TRUE; - - case M_KEY_BACKTAB: - Main_OnKey_Tab (FALSE); - return TRUE; - - case M_KEY_MENU: - Server_OnKey_Menu(); - return TRUE; - - case M_KEY_ESC: - Server_OnKey_Esc(); - return TRUE; - - case M_KEY_PROPERTIES: - Server_OnKey_Properties(); - return TRUE; - } - } - - return FALSE; -} - - -void Main_OnKey_Tab (BOOL fForward) -{ - // The tab-cycle should go: - // ServerList <-> TabsOnQuickViewPane <-> TabChildControls - // - // If the quick-view pane isn't showing, there's nowhere to tab to. - // - if (gr.fPreview) - { - HWND hFocus = GetFocus(); - HWND hTabChild = GetTabChild (GetDlgItem (g.hMain, IDC_TABS)); - - if (fForward) - { - if (hFocus == GetDlgItem (g.hMain, IDC_SERVERS)) - { - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g.hMain, IDC_TABS), TRUE); - } - else if (hFocus == GetDlgItem (g.hMain, IDC_TABS)) - { - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, NULL, FALSE), TRUE); - } - else - { - if (GetNextDlgTabItem (hTabChild, hFocus, FALSE) == GetNextDlgTabItem (hTabChild, NULL, FALSE)) - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g.hMain, IDC_SERVERS), TRUE); - else - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, hFocus, FALSE), TRUE); - } - } - else // (!fForward) - { - if (hFocus == GetDlgItem (g.hMain, IDC_SERVERS)) - { - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetLastDlgTabItem (hTabChild), TRUE); - } - else if (hFocus == GetDlgItem (g.hMain, IDC_TABS)) - { - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g.hMain, IDC_SERVERS), TRUE); - } - else - { - if (hFocus == GetNextDlgTabItem (hTabChild, NULL, FALSE)) - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g.hMain, IDC_TABS), TRUE); - else - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, hFocus, TRUE), TRUE); - } - } - } -} - - -void Main_OnKey_CtrlTab (BOOL fForward) -{ - if (gr.fPreview) - { - Server_OnKey_CtrlTab (SERVERWINDOW_PREVIEWPANE, fForward); - } -} - diff --git a/src/WINNT/afssvrmgr/window.h b/src/WINNT/afssvrmgr/window.h deleted file mode 100644 index 28eb5cc98..000000000 --- a/src/WINNT/afssvrmgr/window.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef WINDOW_H -#define WINDOW_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define WORKING_FPS 8 // try for X frames per second - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Main_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Main_OnPreviewPane (BOOL fPreviewNew, BOOL fVertNew); -void Main_OnServerView (int lvsNew); -void Main_OnViewSets (void); - -void Main_SetFilesetMenus (void); -void Main_SetActionMenus (void); -HWND Main_GetTabChild (HWND hTab); - -DWORD WINAPI Main_Redraw_ThreadProc (PVOID lp); // pass TRUE to invalidate - -HWND GetTabDialog (void); - -void Main_StartWorking (void); -void Main_StopWorking (void); - -void Main_AnimateIcon (HWND hIcon, int *piFrameLast = NULL); - -void Main_SetServerViewMenus (void); - - -#endif - diff --git a/src/WINNT/afsusrmgr/.cvsignore b/src/WINNT/afsusrmgr/.cvsignore deleted file mode 100644 index d0fe629e6..000000000 --- a/src/WINNT/afsusrmgr/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -AFS_component_version_number.h - diff --git a/src/WINNT/afsusrmgr/AfsUsrMgr_stub.rc b/src/WINNT/afsusrmgr/AfsUsrMgr_stub.rc deleted file mode 100644 index aac7ae6eb..000000000 --- a/src/WINNT/afsusrmgr/AfsUsrMgr_stub.rc +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Account Manager" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" diff --git a/src/WINNT/afsusrmgr/NTMakefile b/src/WINNT/afsusrmgr/NTMakefile deleted file mode 100644 index cf958239d..000000000 --- a/src/WINNT/afsusrmgr/NTMakefile +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# make compiler warnings fatal - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX - -# since we're using rpcndr.h, we can't include 's "hyper" type. - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -DIGNORE_STDS_H - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include - -# include the primary makefile -RELDIR=WINNT\afsusrmgr -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# -# BUILD TARGETS -# - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsAccountManager.exe - -EXEOBJS = \ - $(OUT)\AfsUsrMgr_stub.res \ - $(OUT)\action.obj \ - $(OUT)\browse.obj \ - $(OUT)\cell_prop.obj \ - $(OUT)\cmdline.obj \ - $(OUT)\columns.obj \ - $(OUT)\command.obj \ - $(OUT)\creds.obj \ - $(OUT)\display.obj \ - $(OUT)\errdata.obj \ - $(OUT)\general.obj \ - $(OUT)\grp_col.obj \ - $(OUT)\grp_create.obj \ - $(OUT)\grp_delete.obj \ - $(OUT)\grp_prop.obj \ - $(OUT)\grp_rename.obj \ - $(OUT)\grp_tab.obj \ - $(OUT)\helpfunc.obj \ - $(OUT)\main.obj \ - $(OUT)\mch_col.obj \ - $(OUT)\mch_create.obj \ - $(OUT)\mch_delete.obj \ - $(OUT)\mch_tab.obj \ - $(OUT)\options.obj \ - $(OUT)\task.obj \ - $(OUT)\usr_col.obj \ - $(OUT)\usr_cpw.obj \ - $(OUT)\usr_create.obj \ - $(OUT)\usr_delete.obj \ - $(OUT)\usr_prop.obj \ - $(OUT)\usr_search.obj \ - $(OUT)\usr_tab.obj \ - $(OUT)\window.obj \ - $(OUT)\winlist.obj - -VCLIBS =\ - comctl32.lib \ - shell32.lib - -EXELIBS = \ - $(DESTDIR)\lib\afs\TaAfsAdmSvrClient.lib \ - $(DESTDIR)\lib\afs\TaAfsAppLib.lib - -############################################################################ - -$(EXEFILE) : $(EXEOBJS) $(EXELIBS) - $(EXEGUILINK) $(VCLIBS) - $(EXEPREP) - -lang :: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -install : $(EXEFILE) lang - -############################################################################ -# -# Dependencies -# - -$(OUT)\AfsUsrMgr_stub.res : AFS_component_version_number.h - -clean:: - $(CD) lang - @if exist AFS_component_version_number.h del AFS_component_version_number.h - for /f %l in ('dir /B ??_??') do ( if exist @$(NTLANG) do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile clean ) - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/afsusrmgr/TaAfsUsrMgr.h b/src/WINNT/afsusrmgr/TaAfsUsrMgr.h deleted file mode 100644 index 368335e86..000000000 --- a/src/WINNT/afsusrmgr/TaAfsUsrMgr.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAAFSUSRMGR_H -#define TAAFSUSRMGR_H - -#include -#include -#include - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifdef _DEBUG -#ifndef DEBUG -#define DEBUG -#endif -#endif - -#ifndef cb1KB -#define cb1KB 1024L -#endif - -#ifndef ck1MB -#define ck1MB 1024L -#endif - -#ifndef cb1MB -#define cb1MB 1048576L -#endif - -#ifndef ck1GB -#define ck1GB 1048576L -#endif - -#ifndef ck1TB -#define ck1TB (unsigned long)0x40000000 // 1073741824L == 1024^3 -#endif - -#define REGSTR_SETTINGS_BASE HKCU -#define REGSTR_SETTINGS_PATH TEXT("Software\\TransarcCorporation\\AFS Account Manager") -#define REGVAL_SETTINGS TEXT("Settings") -#define REGSTR_SETTINGS_PREFS TEXT("Software\\TransarcCorporation\\AFS Account Manager\\Preferences") -#define REGSTR_SETTINGS_CELLS REGSTR_SETTINGS_PREFS - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include "resource.h" - -#include "help.hid" -#define cszHELPFILENAME TEXT("TaAfsUsrMgr.hlp") - -#include "usr_prop.h" -#include "grp_prop.h" - - -/* - * STRUCTURES _________________________________________________________________ - * - */ - -typedef enum // ICONVIEW - { - ivTWOICONS, - ivONEICON, - ivSTATUS - } ICONVIEW, *LPICONVIEW; - -typedef struct - { - HINSTANCE hInst; - HWND hMain; - HWND hAction; - HACCEL hAccel; - int rc; - - DWORD idClient; - ASID idCell; - PVOID hCreds; - - TCHAR szPatternUsers[ cchNAME ]; - TCHAR szPatternGroups[ cchNAME ]; - TCHAR szPatternMachines[ cchNAME ]; - } GLOBALS; - -typedef struct - { - // Window placement - // - RECT rMain; - RECT rActions; - - // How is information viewed? - // - VIEWINFO viewAct; - VIEWINFO viewUsr; - VIEWINFO viewGrp; - VIEWINFO viewMch; - ICONVIEW ivUsr; - ICONVIEW ivGrp; - ICONVIEW ivMch; - - BOOL fWarnBadCreds; - BOOL fShowActions; - BOOL fWindowsRegexp; - LONG cminRefreshRate; - - int iTabLast; - - // What user preferences have been chosen? - // - USERPROPINFO CreateUser; - GROUPPROPINFO CreateGroup; - USERPROPINFO CreateMachine; - - AFSADMSVR_SEARCH_PARAMS SearchUsers; - - } GLOBALS_RESTORED; - -#define wVerGLOBALS_RESTORED MAKEVERSION(1,0) - - -extern GLOBALS g; -extern GLOBALS_RESTORED gr; - -/* - * OTHER INCLUSIONS ___________________________________________________________ - * - */ - -#include "task.h" -#include "helpfunc.h" -#include "display.h" -#include "general.h" -#include "errdata.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Quit (int rc); - -void PumpMessage (MSG *lpm); - -// StartThread() accepts any 32-bit quantity as its second parameter; -// it uses '...' so you won't have to cast the thing regardless of what it -// is--an HWND fits through just as easily as an LPIDENT. -// -BOOL cdecl StartThread (DWORD (WINAPI *lpfnStart)(PVOID lp), ...); - - -#endif - diff --git a/src/WINNT/afsusrmgr/action.cpp b/src/WINNT/afsusrmgr/action.cpp deleted file mode 100644 index 22bfb76b7..000000000 --- a/src/WINNT/afsusrmgr/action.cpp +++ /dev/null @@ -1,496 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "action.h" -#include "window.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_ACTION_TIMER 100 - -typedef enum - { - actcolOPERATION, - actcolELAPSED, - } ACTIONCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -ACTIONCOLUMNS[] = - { - { IDS_ACTCOL_OPERATION, 100 }, // actcolOPERATIONS - { IDS_ACTCOL_ELAPSED, 100 }, // actcolELAPSED - }; - -#define nACTIONCOLUMNS (sizeof(ACTIONCOLUMNS)/sizeof(ACTIONCOLUMNS[0])) - -#define cxMIN_ACTION 75 -#define cyMIN_ACTION 50 - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct - { - HWND hAction; - LPASACTIONLIST pActionList; - } l; - -rwWindowData awdActions[] = { - { IDC_ACTION_DESC, raSizeX | raRepaint, 0, 0 }, - { IDC_ACTION_LIST, raSizeX | raSizeY, MAKELONG(cxMIN_ACTION,cyMIN_ACTION), 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void TicksToElapsedTime (LPSYSTEMTIME pst, DWORD dwTicks); -LPTSTR GetActionDescription (LPASACTION pAction); - -BOOL CALLBACK Actions_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Actions_OnEndTask_GetActions (LPTASKPACKET ptp); -void Actions_Refresh (void); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void TicksToElapsedTime (LPSYSTEMTIME pst, DWORD dwTicks) -{ -#define msecSECOND (1000L) -#define msecMINUTE (1000L * 60L) -#define msecHOUR (1000L * 60L * 60L) -#define msecDAY (1000L * 60L * 60L * 24L) - - memset (pst, 0x00, sizeof(SYSTEMTIME)); - - pst->wDay = (int)( dwTicks / msecDAY ); - dwTicks %= msecDAY; - pst->wHour = (int)( dwTicks / msecHOUR ); - dwTicks %= msecHOUR; - pst->wMinute = (int)( dwTicks / msecMINUTE ); - dwTicks %= msecMINUTE; - pst->wSecond = (int)( dwTicks / msecSECOND ); - dwTicks %= msecSECOND; - pst->wMilliseconds = (int)( dwTicks ); -} - - -void FixActionTime (DWORD *pcsec) -{ - DWORD dwTickNow = GetTickCount(); - DWORD cTickActive = 1000L * (*pcsec); - (*pcsec) = dwTickNow - cTickActive; -} - - -void Actions_SetDefaultView (LPVIEWINFO lpvi) -{ - lpvi->lvsView = FLS_VIEW_LIST; - lpvi->nColsAvail = nACTIONCOLUMNS; - - for (size_t iCol = 0; iCol < nACTIONCOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = ACTIONCOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = ACTIONCOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = actcolELAPSED | COLUMN_SORTREV; - - lpvi->nColsShown = 2; - lpvi->aColumns[0] = (int)actcolOPERATION; - lpvi->aColumns[1] = (int)actcolELAPSED; -} - - -void Actions_OpenWindow (void) -{ - if (!IsWindow (l.hAction)) - { - l.hAction = ModelessDialog (IDD_ACTIONS, NULL, (DLGPROC)Actions_DlgProc); - ShowWindow (l.hAction, SW_SHOW); - Actions_WindowToTop (TRUE); - } -} - - -void Actions_CloseWindow (void) -{ - if (IsWindow (l.hAction)) - { - DestroyWindow (l.hAction); - l.hAction = NULL; - } -} - - -void Actions_WindowToTop (BOOL fTop) -{ - if (IsWindow(l.hAction)) - { - if (fTop) - { - SetWindowPos (l.hAction, HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); - } - else //(!fTop) - { - SetWindowPos (l.hAction, g.hMain, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); - } - } -} - - -BOOL CALLBACK Actions_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (Display_HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAct)) - return FALSE; - - if (msg == WM_INITDIALOG) - l.hAction = hDlg; - - switch (msg) - { - case WM_INITDIALOG: - { - HWND hList = GetDlgItem (hDlg, IDC_ACTION_LIST); - FL_RestoreView (hList, &gr.viewAct); - - if (gr.rActions.right == 0) - GetWindowRect (hDlg, &gr.rActions); - ResizeWindow (hDlg, awdActions, rwaMoveToHere, &gr.rActions); - - SetTimer (hDlg, ID_ACTION_TIMER, 1000, NULL); // timer message every sec - - StartTask (taskGET_ACTIONS, l.hAction); - gr.fShowActions = TRUE; - break; - } - - case WM_DESTROY: - gr.fShowActions = FALSE; - l.hAction = NULL; - Main_SetMenus(); - KillTimer (hDlg, ID_ACTION_TIMER); - - if (l.pActionList) - asc_ActionListFree (&l.pActionList); - break; - - case WM_TIMER: - if ((FastList_GetItemCount (GetDlgItem (hDlg, IDC_ACTION_LIST))) || (l.pActionList && l.pActionList->cEntries)) - Actions_Refresh(); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - { - ResizeWindow (hDlg, awdActions, rwaFixupGuts); - GetWindowRect (hDlg, &gr.rActions); - } - break; - - case WM_MOVE: - GetWindowRect (hDlg, &gr.rActions); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskGET_ACTIONS) - Actions_OnEndTask_GetActions (ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - DestroyWindow (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Actions_OnNotify (WPARAM wp, LPARAM lp) -{ - LPASACTION pAction = (LPASACTION)lp; - BOOL fFinished = (BOOL)wp; - - if (pAction) - { - // We've just been told something happened; - // - switch (pAction->Action) - { - case ACTION_REFRESH: - // If we get a Finished Refreshing notification, it's a safe bet - // that the admin server has done a significant refresh to its - // cache; so, we'll use that as a trigger to repopulate the lists - // on the main dialog. - // - if (fFinished) - Display_PopulateList(); - break; - } - - // If the Actions window is being displayed, use this notification - // to update our stored list-of-actions. - // - if (IsWindow (l.hAction)) - { - if (!fFinished) - FixActionTime (&pAction->csecActive); - - if (!l.pActionList) - asc_ActionListCreate (&l.pActionList); - - if (l.pActionList) - { - if (fFinished) - asc_ActionListRemoveEntry (&l.pActionList, pAction->idAction); - else if (!asc_ActionListTest (&l.pActionList, pAction->idAction)) - asc_ActionListAddEntry (&l.pActionList, pAction); - } - - Actions_Refresh(); - } - - Delete (pAction); - } -} - - -void Actions_OnEndTask_GetActions (LPTASKPACKET ptp) -{ - if (l.pActionList) - { - asc_ActionListFree (&l.pActionList); - } - if (ptp->rc && TASKDATA(ptp)->pActionList) - { - l.pActionList = TASKDATA(ptp)->pActionList; - TASKDATA(ptp)->pActionList = NULL; // don't let FreeTaskPacket free this - - // Zip through the listed actions and change the reported csec-elapsed - // into an estimated starting tick. - // - for (size_t ii = 0; ii < l.pActionList->cEntries; ++ii) - { - FixActionTime (&l.pActionList->aEntries[ ii ].Action.csecActive); - } - } - Actions_Refresh(); -} - - -void Actions_Refresh (void) -{ - size_t nItems = 0; - TCHAR szText[ cchRESOURCE ]; - - HWND hList; - if ((hList = GetDlgItem (l.hAction, IDC_ACTION_LIST)) != NULL) - { - LPARAM lpOld = FL_StartChange (hList, TRUE); - - if (l.pActionList) - { - for (size_t ii = 0; ii < l.pActionList->cEntries; ++ii) - { - LPTSTR pszDesc; - if ((pszDesc = GetActionDescription (&l.pActionList->aEntries[ ii ].Action)) != NULL) - { - SYSTEMTIME st; - TicksToElapsedTime (&st, GetTickCount() - l.pActionList->aEntries[ ii ].Action.csecActive); - FormatElapsed (szText, TEXT("%s"), &st); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.hParent = NULL; - flai.iFirstImage = IMAGE_NOIMAGE; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = pszDesc; - flai.lParam = (LPARAM)ii; - flai.dwFlags = FLIF_DISALLOW_SELECT; - - HLISTITEM hItem; - if ((hItem = FastList_AddItem (hList, &flai)) != NULL) - FastList_SetItemText (hList, hItem, 1, szText); - - ++nItems; - - FreeString (pszDesc); - } - } - } - - FL_EndChange (hList, lpOld); - } - - if (nItems == 0) - GetString (szText, IDS_ACTION_DESC_NONE); - else if (nItems == 1) - GetString (szText, IDS_ACTION_DESC_ONE); - else // (nItems >= 2) - GetString (szText, IDS_ACTION_DESC_MULT); - SetDlgItemText (l.hAction, IDC_ACTION_DESC, szText); -} - - -LPTSTR GetActionDescription (LPASACTION pAction) -{ - LPTSTR pszDesc = NULL; - - ULONG status; - ASOBJPROP Properties; - ASOBJPROP Properties2; - - switch (pAction->Action) - { - case ACTION_REFRESH: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Refresh.idScope, &Properties, &status)) - { - if (Properties.Type == TYPE_CELL) - pszDesc = FormatString (IDS_ACTION_REFRESH_CELL, TEXT("%s"), Properties.szName); - else if (Properties.Type == TYPE_SERVER) - pszDesc = FormatString (IDS_ACTION_REFRESH_SERVER, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_SCOUT: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Refresh.idScope, &Properties, &status)) - { - if (Properties.Type == TYPE_CELL) - pszDesc = FormatString (IDS_ACTION_SCOUT_CELL, TEXT("%s"), Properties.szName); - else if (Properties.Type == TYPE_SERVER) - pszDesc = FormatString (IDS_ACTION_SCOUT_SERVER, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_USER_CHANGE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.User_Change.idUser, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_USER_CHANGE, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_USER_PW_CHANGE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.User_Pw_Change.idUser, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_USER_PW_CHANGE, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_USER_UNLOCK: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.User_Unlock.idUser, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_USER_UNLOCK, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_USER_CREATE: - pszDesc = FormatString (IDS_ACTION_USER_CREATE, TEXT("%s"), pAction->u.User_Create.szUser); - break; - - case ACTION_USER_DELETE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.User_Delete.idUser, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_USER_DELETE, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_GROUP_CHANGE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Change.idGroup, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_GROUP_CHANGE, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_GROUP_MEMBER_ADD: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Member_Add.idGroup, &Properties, &status)) - { - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Member_Add.idUser, &Properties2, &status)) - { - pszDesc = FormatString (IDS_ACTION_GROUP_MEMBER_ADD, TEXT("%s%s"), Properties.szName, Properties2.szName); - } - } - break; - - case ACTION_GROUP_MEMBER_REMOVE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Member_Remove.idGroup, &Properties, &status)) - { - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Member_Remove.idUser, &Properties2, &status)) - { - pszDesc = FormatString (IDS_ACTION_GROUP_MEMBER_REMOVE, TEXT("%s%s"), Properties.szName, Properties2.szName); - } - } - break; - - case ACTION_GROUP_RENAME: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Rename.idGroup, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_GROUP_RENAME, TEXT("%s%s"), Properties.szName, pAction->u.Group_Rename.szNewName); - } - break; - - case ACTION_GROUP_CREATE: - pszDesc = FormatString (IDS_ACTION_GROUP_CREATE, TEXT("%s"), pAction->u.Group_Create.szGroup); - break; - - case ACTION_GROUP_DELETE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAction->u.Group_Delete.idGroup, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_GROUP_DELETE, TEXT("%s"), Properties.szName); - } - break; - - case ACTION_CELL_CHANGE: - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, g.idCell, &Properties, &status)) - { - pszDesc = FormatString (IDS_ACTION_CELL_CHANGE, TEXT("%s"), Properties.szName); - } - break; - } - - return pszDesc; -} - diff --git a/src/WINNT/afsusrmgr/action.h b/src/WINNT/afsusrmgr/action.h deleted file mode 100644 index e690a73a0..000000000 --- a/src/WINNT/afsusrmgr/action.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef ACTION_H -#define ACTION_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Actions_SetDefaultView (LPVIEWINFO lpvi); - -void Actions_OpenWindow (void); -void Actions_CloseWindow (void); -void Actions_WindowToTop (BOOL fTop); - -void Actions_OnNotify (WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/browse.cpp b/src/WINNT/afsusrmgr/browse.cpp deleted file mode 100644 index af7c7b602..000000000 --- a/src/WINNT/afsusrmgr/browse.cpp +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "browse.h" -#include "usr_col.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_SEARCH_TIMER 0 - -#define msecSEARCH_TIMER 650 - -static struct - { - DWORD dwTickLastType; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Browse_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Browse_OnInitDialog (HWND hDlg); -void Browse_OnOK (HWND hDlg); -void Browse_OnEndTask_EnumObjects (HWND hDlg, LPTASKPACKET ptp); -void Browse_OnEndTask_Translate (HWND hDlg, LPTASKPACKET ptp); -void Browse_OnSelect (HWND hDlg); -void Browse_UpdateDialog (HWND hDlg); -void Browse_Enable (HWND hDlg, BOOL fEnable); -ASOBJTYPE Browse_GetSelectedType (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL ShowBrowseDialog (LPBROWSE_PARAMS lpp) -{ - int nTypesToShow = 0; - if (lpp->TypeToShow & TYPE_USER) - ++nTypesToShow; - if (lpp->TypeToShow & TYPE_GROUP) - ++nTypesToShow; - lpp->fQuerying = FALSE; - - int idd = (nTypesToShow == 1) ? IDD_BROWSE : (lpp->idsCheck) ? IDD_BROWSE_BOTH : IDD_BROWSE_COMBO; - - if (ModalDialogParam (idd, lpp->hParent, (DLGPROC)Browse_DlgProc, (LPARAM)lpp) != IDOK) - return FALSE; - - if (!lpp->pObjectsSelected) - return FALSE; - - return TRUE; -} - - -BOOL CALLBACK Browse_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (AfsAppLib_HandleHelp (lpp->iddForHelp, hDlg, msg, wp, lp)) - return FALSE; - } - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Browse_OnInitDialog (hDlg); - l.dwTickLastType = 0; - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if ((ptp->idTask == taskUSER_ENUM) || (ptp->idTask == taskGROUP_ENUM)) - Browse_OnEndTask_EnumObjects (hDlg, ptp); - else if (ptp->idTask == taskLIST_TRANSLATE) - Browse_OnEndTask_Translate (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_TIMER: - switch (wp) - { - case ID_SEARCH_TIMER: - if ( (l.dwTickLastType) && (GetTickCount() > l.dwTickLastType + msecSEARCH_TIMER) ) - { - KillTimer (hDlg, ID_SEARCH_TIMER); - Browse_UpdateDialog (hDlg); - } - break; - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_BROWSE_SELECT: - Browse_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_BROWSE_CHECK: - Browse_UpdateDialog (hDlg); - break; - - case IDC_BROWSE_COMBO: - if (HIWORD(wp) == CBN_SELCHANGE) - { - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, TEXT("")); - Browse_UpdateDialog (hDlg); - } - break; - - case IDC_BROWSE_RESTART: - Browse_UpdateDialog (hDlg); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_BROWSE_NAMED), (LPARAM)TRUE); - break; - - case IDC_BROWSE_NAMED: - if (HIWORD(wp) == EN_UPDATE) // has the user hit Enter here? - { - TCHAR szTest[ 1024 ]; - GetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest, 1024); - - if ((lstrlen (szTest)) && (szTest[lstrlen(szTest)-1]==TEXT('\n'))) - { - szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); - if ((lstrlen (szTest)) && (szTest[lstrlen(szTest)-1]==TEXT('\r'))) - szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); - - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest); - PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDC_BROWSE_SELECT)); - } - } - break; - - case IDC_BROWSE_PATTERN: - if (HIWORD(wp) == EN_UPDATE) - { - l.dwTickLastType = GetTickCount(); - KillTimer (hDlg, ID_SEARCH_TIMER); - SetTimer (hDlg, ID_SEARCH_TIMER, msecSEARCH_TIMER +15, NULL); - } - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Browse_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem (hDlg, IDC_BROWSE_SELECT)); - break; - } - break; - } - - return FALSE; -} - - -void Browse_OnInitDialog (HWND hDlg) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - // First, the text of the dialog is woefully ugly right now. Put - // in the strings which the caller supplied. - // - TCHAR szText[ cchRESOURCE ]; - GetString (szText, lpp->idsTitle); - SetWindowText (hDlg, szText); - - GetString (szText, lpp->idsPrompt); - SetDlgItemText (hDlg, IDC_BROWSE_TYPE, szText); - - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, lpp->szName); - - SetDlgItemText (hDlg, IDC_BROWSE_PATTERN, TEXT("")); - - ULONG status; - asc_CellNameGet_Fast (g.idClient, g.idCell, szText, &status); - SetDlgItemText (hDlg, IDC_BROWSE_CELL, szText); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CELL), FALSE); - - if (GetDlgItem (hDlg, IDC_BROWSE_CHECK)) - { - if (lpp->idsCheck == 0) - ShowWindow (GetDlgItem (hDlg, IDC_BROWSE_CHECK), FALSE); - else - { - GetString (szText, lpp->idsCheck); - SetDlgItemText (hDlg, IDC_BROWSE_CHECK, szText); - } - - CheckDlgButton (hDlg, IDC_BROWSE_CHECK, (lpp->pObjectsToSkip) ? TRUE : FALSE); - } - - if (GetDlgItem (hDlg, IDC_BROWSE_COMBO)) - { - HWND hCombo = GetDlgItem (hDlg, IDC_BROWSE_COMBO); - LPARAM lpSelect = 0; - CB_StartChange (hCombo, TRUE); - - if (lpp->TypeToShow & TYPE_USER) - { - CB_AddItem (hCombo, IDS_SHOW_USERS, TYPE_USER); - if (!lpSelect) - lpSelect = TYPE_USER; - } - - if (lpp->TypeToShow & TYPE_GROUP) - { - CB_AddItem (hCombo, IDS_SHOW_GROUPS, TYPE_GROUP); - if (!lpSelect) - lpSelect = TYPE_GROUP; - } - - CB_EndChange (hCombo, lpSelect); - } - - // If the caller requested that we disallow multiple selection, - // change the fastlist's styles... - // - if (!lpp->fAllowMultiple) - { - DWORD dwStyle = GetWindowLong (GetDlgItem (hDlg, IDC_BROWSE_LIST), GWL_STYLE); - dwStyle &= ~(FLS_SELECTION_MULTIPLE); - SetWindowLong (GetDlgItem (hDlg, IDC_BROWSE_LIST), GWL_STYLE, dwStyle); - } - - // Finally, update the listbox to show a valid list of users/groups. - // Oh--since we're in initdialog, add an imagelist to the window too. - // - FastList_SetImageLists (GetDlgItem (hDlg, IDC_BROWSE_LIST), AfsAppLib_CreateImageList(FALSE), NULL); - Browse_UpdateDialog (hDlg); - } -} - - -void Browse_OnSelect (HWND hDlg) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (!lpp->fQuerying) - { - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - - static TCHAR szSeparator[ cchRESOURCE ] = TEXT(""); - if (szSeparator[0] == TEXT('\0')) - { - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SLIST, szSeparator, cchRESOURCE)) - lstrcpy (szSeparator, TEXT(",")); - lstrcat (szSeparator, TEXT(" ")); - } - - LPTSTR pszText = NULL; - - HLISTITEM hItem = NULL; - while ((hItem = FastList_FindNextSelected (hList, hItem)) != NULL) - { - LPCTSTR pszName; - if ((pszName = FastList_GetItemText (hList, hItem, 0)) != NULL) - { - LPTSTR pszNew; - if (pszText) - pszNew = FormatString (TEXT("%1%2%3"), TEXT("%s%s%s"), pszText, szSeparator, pszName); - else - pszNew = FormatString (TEXT("%1"), TEXT("%s"), pszName); - if (pszText) - FreeString (pszText); - pszText = pszNew; - } - if (pszText && !lpp->fAllowMultiple) - break; - } - - SetDlgItemText (hDlg, IDC_BROWSE_NAMED, (pszText) ? pszText : TEXT("")); - if (pszText) - FreeString (pszText); - } - } -} - - -void Browse_OnOK (HWND hDlg) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_BROWSE_NAMED)); - - // Disable the controls on the dialog for a bit... - // - Browse_Enable (hDlg, FALSE); - - // Start a background task to translate the typed list-of-names into - // a usable ASID list. When it comes back, we'll close the dialog. - // - LPLIST_TRANSLATE_PARAMS pTask = New (LIST_TRANSLATE_PARAMS); - pTask->Type = Browse_GetSelectedType (hDlg); - pTask->pszNames = pszNames; - StartTask (taskLIST_TRANSLATE, hDlg, pTask); - } -} - - -void Browse_OnEndTask_EnumObjects (HWND hDlg, LPTASKPACKET ptp) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - FastList_Begin (hList); - FastList_RemoveAll (hList); - - // If we were successful, we now have a list of all objects of the - // appropriate type. However, the user may not want us to display - // items which are on our pObjectsToSkip list; if not, convert the - // later to a hashlist (for fast lookup) and remove the offending - // entries from the former. - // - if (ptp->rc && TASKDATA(ptp)->pAsidList) - { - if ((IsDlgButtonChecked (hDlg, IDC_BROWSE_CHECK)) && (lpp->pObjectsToSkip)) - { - LPHASHLIST pListToSkip = New (HASHLIST); - - for (size_t ii = 0; ii < lpp->pObjectsToSkip->cEntries; ++ii) - pListToSkip->AddUnique ((PVOID)(lpp->pObjectsToSkip->aEntries[ii].idObject)); - - for (ii = 0; ii < TASKDATA(ptp)->pAsidList->cEntries; ) - { - if (pListToSkip->fIsInList ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ii].idObject))) - asc_AsidListRemoveEntryByIndex (&TASKDATA(ptp)->pAsidList, ii); - else - ii++; - } - - Delete (pListToSkip); - } - } - - // OK, we're ready to go--populate that list! - // - for (size_t ii = 0; ii < TASKDATA(ptp)->pAsidList->cEntries; ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, TASKDATA(ptp)->pAsidList->aEntries[ii].idObject, &Properties, &status)) - continue; - - TCHAR szName[ MAX_PATH ]; - if (Properties.Type == TYPE_USER) - User_GetDisplayName (szName, &Properties); - else - lstrcpy (szName, Properties.szName); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.iFirstImage = (Properties.Type == TYPE_USER) ? imageUSER : (Properties.Type == TYPE_GROUP) ? imageGROUP : IMAGE_NOIMAGE; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = szName; - FastList_AddItem (hList, &flai); - } - - FastList_End (hList); - lpp->fQuerying --; - } -} - - -void Browse_OnEndTask_Translate (HWND hDlg, LPTASKPACKET ptp) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - if (!ptp->rc || !TASKDATA(ptp)->pAsidList || !TASKDATA(ptp)->pAsidList->cEntries) - { - ErrorDialog (ptp->status, (TASKDATA(ptp)->Type == TYPE_USER) ? IDS_ERROR_CANT_TRANSLATE_USER : IDS_ERROR_CANT_TRANSLATE_GROUP); - Browse_Enable (hDlg, TRUE); - } - else - { - lpp->pObjectsSelected = TASKDATA(ptp)->pAsidList; - TASKDATA(ptp)->pAsidList = NULL; // don't let FreeTaskPacket free this - - // Fill in {lpp->szName}, for convenience - // - lpp->szName[0] = TEXT('\0'); - - if (lpp->pObjectsSelected && lpp->pObjectsSelected->cEntries) - { - ULONG status; - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pObjectsSelected->aEntries[0].idObject, &Properties, &status)) - lstrcpy (lpp->szName, Properties.szName); - } - - EndDialog (hDlg, IDOK); - } - } -} - - -void Browse_UpdateDialog (HWND hDlg) -{ - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - lpp->fQuerying ++; - - // First we'll need to empty the list, and add some non-selectable thing - // that says "querying" - // - HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); - FastList_Begin (hList); - FastList_RemoveAll (hList); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_QUERYING_LONG); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.iFirstImage = IMAGE_NOIMAGE; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = szText; - flai.dwFlags = FLIF_DISALLOW_SELECT; - FastList_AddItem (hList, &flai); - - FastList_End (hList); - - // Then start a background task to obtain the appropriate list - // of stuff to show. When that task completes, we'll populate the - // list. - // - TCHAR szPattern[ cchNAME ]; - GetDlgItemText (hDlg, IDC_BROWSE_PATTERN, szPattern, cchNAME); - - LPTSTR pszPattern = NULL; - if (szPattern[0] != TEXT('\0')) - pszPattern = CloneString (szPattern); - - StartTask ((Browse_GetSelectedType (hDlg) == TYPE_USER) ? taskUSER_ENUM : taskGROUP_ENUM, hDlg, pszPattern); - } -} - - -void Browse_Enable (HWND hDlg, BOOL fEnable) -{ - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_SELECT), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_NAMED), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CHECK), fEnable); - EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable); -} - - -ASOBJTYPE Browse_GetSelectedType (HWND hDlg) -{ - HWND hCombo; - if ((hCombo = GetDlgItem (hDlg, IDC_BROWSE_COMBO)) != NULL) - { - return (ASOBJTYPE)CB_GetSelectedData (hCombo); - } - - LPBROWSE_PARAMS lpp; - if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL) - { - return lpp->TypeToShow; - } - - return (ASOBJTYPE)0; -} - diff --git a/src/WINNT/afsusrmgr/browse.h b/src/WINNT/afsusrmgr/browse.h deleted file mode 100644 index ab2dd7ba8..000000000 --- a/src/WINNT/afsusrmgr/browse.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef BROWSE_H -#define BROWSE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - HWND hParent; - int iddForHelp; - int idsTitle; - int idsPrompt; - int idsCheck; - ASOBJTYPE TypeToShow; - LPASIDLIST pObjectsToSkip; - LPASIDLIST pObjectsSelected; - BOOL fAllowMultiple; - TCHAR szName[ cchNAME ]; - BOOL fQuerying; // used internally - } BROWSE_PARAMS, *LPBROWSE_PARAMS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL ShowBrowseDialog (LPBROWSE_PARAMS lpp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/cell_prop.cpp b/src/WINNT/afsusrmgr/cell_prop.cpp deleted file mode 100644 index 6b79282ba..000000000 --- a/src/WINNT/afsusrmgr/cell_prop.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "cell_prop.h" -#include "winlist.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define nID_USERMAX_MIN 1 -#define nID_USERMAX_MAX -1 - -#define nID_GROUPMAX_MIN -0x7FFFFFFF -#define nID_GROUPMAX_MAX -1 - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK CellProp_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void CellProp_General_OnInitDialog (HWND hDlg); -void CellProp_General_OnDestroy (HWND hDlg); -void CellProp_General_OnApply (HWND hDlg); -void CellProp_General_UpdateDialog (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Cell_ShowProperties (CELLPROPTAB cptTarget) -{ - HWND hSheet = NULL; - - // If there is already a window open for this cell, switch to it. - // - if ((hSheet = WindowList_Search (wltCELL_PROPERTIES, g.idCell)) != NULL) - { - SetForegroundWindow (hSheet); - if (cptTarget != cptANY) - { - HWND hTab = GetDlgItem (hSheet, IDC_PROPSHEET_TABCTRL); - int nTabs = TabCtrl_GetItemCount (hTab); - if (nTabs < nCELLPROPTAB_MAX) - cptTarget = (CELLPROPTAB)( (cptTarget == cptPROBLEMS) ? ((int)cptGENERAL-1) : ((int)cptTarget-1) ); - TabCtrl_SwitchToTab (hTab, cptTarget); - } - return; - } - - // Okay, we're clear to create the new properties window. - // - TCHAR szCell[ cchRESOURCE ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szCell); - - LPTSTR pszTitle = FormatString (IDS_CELL_PROPERTIES_TITLE, TEXT("%s"), szCell); - - LPPROPSHEET psh = PropSheet_Create (pszTitle, TRUE, NULL, (LPARAM)g.idCell); - PropSheet_AddTab (psh, 0, IDD_CELL_GENERAL, (DLGPROC)CellProp_General_DlgProc, (LPARAM)g.idCell, TRUE, (cptTarget == cptGENERAL) ? TRUE : FALSE); - PropSheet_ShowModeless (psh, SW_SHOW); -} - - -BOOL CALLBACK CellProp_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_CELL_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - ASID idCell = (ASID)PropSheet_FindTabParam (hDlg); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - WindowList_Add (hDlg, wltCELL_PROPERTIES, idCell); - break; - - case WM_DESTROY_SHEET: - WindowList_Remove (hDlg); - break; - - case WM_INITDIALOG: - CellProp_General_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - CellProp_General_OnDestroy (hDlg); - break; - - case WM_ASC_NOTIFY_OBJECT: - CellProp_General_UpdateDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - CellProp_General_OnApply (hDlg); - break; - - case IDC_CELL_USERMAX: - case IDC_CELL_GROUPMAX: - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void CellProp_General_OnInitDialog (HWND hDlg) -{ - ASID idCell = (ASID)PropSheet_FindTabParam (hDlg); - - // Indicate we want to know if anything changes with this cell - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - asc_AsidListCreate (&pTask->pAsidList); - asc_AsidListAddEntry (&pTask->pAsidList, idCell, 0); - StartTask (taskOBJECT_LISTEN, NULL, pTask); - - // Fix the name shown on the dialog - // - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CELL_NAME, szText, cchRESOURCE); - - TCHAR szName[ cchRESOURCE ]; - asc_CellNameGet_Fast (g.idClient, idCell, szName); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_CELL_NAME, pszText); - FreeString (pszText); - - // Fill in the rest of the information about the selected users - // - CellProp_General_UpdateDialog (hDlg); -} - - -void CellProp_General_OnDestroy (HWND hDlg) -{ - // Indicate we no longer care if anything changes with this cell - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - StartTask (taskOBJECT_LISTEN, NULL, pTask); -} - - -void CellProp_General_UpdateDialog (HWND hDlg) -{ - ASID idCell = (ASID)PropSheet_FindTabParam (hDlg); - - ULONG status; - ASOBJPROP Properties; - asc_ObjectPropertiesGet_Fast (g.idClient, idCell, idCell, &Properties, &status); - - if (fHasSpinner (GetDlgItem (hDlg, IDC_CELL_USERMAX))) - SP_SetPos (GetDlgItem (hDlg, IDC_CELL_USERMAX), Properties.u.CellProperties.idUserMax); - else - CreateSpinner (GetDlgItem (hDlg, IDC_CELL_USERMAX), 10, FALSE, nID_USERMAX_MIN, Properties.u.CellProperties.idUserMax, nID_USERMAX_MAX); - - if (fHasSpinner (GetDlgItem (hDlg, IDC_CELL_GROUPMAX))) - SP_SetPos (GetDlgItem (hDlg, IDC_CELL_GROUPMAX), Properties.u.CellProperties.idGroupMax); - else - CreateSpinner (GetDlgItem (hDlg, IDC_CELL_GROUPMAX), 10, TRUE, nID_GROUPMAX_MIN, Properties.u.CellProperties.idGroupMax, nID_GROUPMAX_MAX); -} - - -void CellProp_General_OnApply (HWND hDlg) -{ - ASID idCell = (ASID)PropSheet_FindTabParam (hDlg); - - LPCELL_CHANGE_PARAMS pTask = New (CELL_CHANGE_PARAMS); - memset (pTask, 0x00, sizeof(CELL_CHANGE_PARAMS)); - pTask->idCell = idCell; - pTask->idUserMax = SP_GetPos (GetDlgItem (hDlg, IDC_CELL_USERMAX)); - pTask->idGroupMax = SP_GetPos (GetDlgItem (hDlg, IDC_CELL_GROUPMAX)); - StartTask (taskCELL_CHANGE, NULL, pTask); -} - diff --git a/src/WINNT/afsusrmgr/cell_prop.h b/src/WINNT/afsusrmgr/cell_prop.h deleted file mode 100644 index 1f49b1aa3..000000000 --- a/src/WINNT/afsusrmgr/cell_prop.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CELL_PROP_H -#define CELL_PROP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - cptANY = -1, - cptPROBLEMS, - cptGENERAL, - } CELLPROPTAB; - -#define nCELLPROPTAB_MAX 2 - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Cell_ShowProperties (CELLPROPTAB cptTarget = cptANY); - - -#endif - diff --git a/src/WINNT/afsusrmgr/cmdline.cpp b/src/WINNT/afsusrmgr/cmdline.cpp deleted file mode 100644 index 36abdb6e4..000000000 --- a/src/WINNT/afsusrmgr/cmdline.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "cmdline.h" - -extern "C" { -#include -} // extern "C" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef enum { - swCELL, - swREMOTE, - swUSER, - swPASSWORD -} SWITCH; - -static struct { - TCHAR szSwitch[ cchRESOURCE ]; - BOOL fGetsValue; - BOOL fPresent; - TCHAR szValue[ cchRESOURCE ]; -} aSWITCHES[] = { - { TEXT("cell"), TRUE, FALSE, TEXT("") }, - { TEXT("remote"), TRUE, FALSE, TEXT("") }, - { TEXT("user"), TRUE, FALSE, TEXT("") }, - { TEXT("password"), TRUE, FALSE, TEXT("") } -}; - -#define nSWITCHES (sizeof(aSWITCHES) / sizeof(aSWITCHES[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -#define iswhite(_ch) ( ((_ch)==TEXT(' ')) || ((_ch)==TEXT('\t')) ) - -void cdecl CommandLineHelp (int ids, LPTSTR pszFormat = NULL, ...); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -CMDLINEOP ParseCommandLine (LPTSTR pszCmdLine) -{ - for (size_t ii = 0; ii < nSWITCHES; ++ii) - aSWITCHES[ ii ].fPresent = FALSE; - - // Search through pszCmdLine for switches; each switch must be - // preceeded by "/" or "-". - // - while (pszCmdLine && *pszCmdLine) - { - while (iswhite(*pszCmdLine)) - ++pszCmdLine; - if (!*pszCmdLine) - break; - - if ( (*pszCmdLine != '-') && (*pszCmdLine != '/') ) - { - CommandLineHelp (IDS_CMDLINE_SYNTAX); - return opCLOSEAPP; - } - - ++pszCmdLine; - - // Okay, we've found what is probably the start of a switch. - // See if it matches anything. - // - for (ii = 0; ii < nSWITCHES; ++ii) - { - size_t cch = lstrlen(aSWITCHES[ ii ].szSwitch); - if (lstrncmpi (pszCmdLine, aSWITCHES[ ii ].szSwitch, cch)) - continue; - - // If the switch wants a value, it must be followed by ":" - // or whitespace; if it doesn't, it must be followed by "/" - // or whitespace. - // - LPTSTR pszAfter = &pszCmdLine[ cch ]; - if (iswhite (*pszAfter) || (!*pszAfter) || - ((*pszAfter == TEXT(':')) && (aSWITCHES[ ii ].fGetsValue)) || - ((*pszAfter == TEXT('/')) && (!aSWITCHES[ ii ].fGetsValue)) ) - { - break; // found a switch! - } - } - - if (ii >= nSWITCHES) - { - TCHAR szCopy[ cchRESOURCE ]; - lstrcpy (szCopy, pszCmdLine); - for (LPTSTR pch = szCopy; - *pch && !iswhite(*pch) && !(*pch == TEXT('/')) && !(*pch == TEXT(':')); - ++pch) - ; - *pch = TEXT('\0'); - CommandLineHelp (IDS_CMDLINE_UNRECOGNIZED, TEXT("%s"), szCopy); - return opCLOSEAPP; - } - if (aSWITCHES[ ii ].fPresent) - { - CommandLineHelp (IDS_CMDLINE_DUPLICATE, TEXT("%s"), aSWITCHES[ ii ].szSwitch); - return opCLOSEAPP; - } - - // Woo hoo! Found what appears to be a valid switch. Parse it now. - // - aSWITCHES[ ii ].fPresent = TRUE; - pszCmdLine += lstrlen( aSWITCHES[ ii ].szSwitch ); - while (iswhite (*pszCmdLine)) - ++pszCmdLine; - - if (*pszCmdLine == TEXT(':')) - { - if (!aSWITCHES[ ii ].fGetsValue) - { - CommandLineHelp (IDS_CMDLINE_UNEXPECTVALUE, TEXT("%s"), aSWITCHES[ ii ].szSwitch); - return opCLOSEAPP; - } - for (++pszCmdLine; iswhite (*pszCmdLine); ++pszCmdLine) - ; - } - - if (aSWITCHES[ ii ].fGetsValue) - { - if ( (*pszCmdLine == TEXT('/')) || (*pszCmdLine == TEXT('\0')) ) - { - CommandLineHelp (IDS_CMDLINE_MISSINGVAL, TEXT("%s"), aSWITCHES[ ii ].szSwitch); - return opCLOSEAPP; - } - BOOL fQuoted = FALSE; - for (LPTSTR pszTarget = aSWITCHES[ ii ].szValue; - *pszCmdLine && !(*pszCmdLine == TEXT('/') && !fQuoted) - && !(iswhite(*pszCmdLine) && !fQuoted); ) - { - if (*pszCmdLine == TEXT('"')) - { - ++pszCmdLine; - if (fQuoted) - break; - fQuoted = TRUE; - continue; - } - *pszTarget++ = *pszCmdLine++; - } - *pszTarget++ = TEXT('\0'); - } - } - - // Now test the command-line for syntactical correctness. - // First case: if the USER or PASSWORD switch is given, the other - // is required. - // - if ( (aSWITCHES[ swUSER ].fPresent && !aSWITCHES[ swPASSWORD ].fPresent) || - (aSWITCHES[ swPASSWORD ].fPresent && !aSWITCHES[ swUSER ].fPresent) ) - { - CommandLineHelp (IDS_CMDLINE_USERPASSWORD); - return opCLOSEAPP; - } - - // Connect to an administration server - // - if (aSWITCHES[ swREMOTE ].fPresent) - { - ULONG status; - if (!AfsAppLib_OpenAdminServer (aSWITCHES[ swREMOTE ].szValue, &status)) - { - if (status == ADMCLIENTCANTINITAFSLOCATION) - ImmediateErrorDialog (status, IDS_ERROR_BAD_REMOTE_SERVER_INSTALL, aSWITCHES[ swREMOTE ].szValue); - else - ImmediateErrorDialog (status, IDS_ERROR_BAD_REMOTE_SERVER, TEXT("%s"), aSWITCHES[ swREMOTE ].szValue); - return opCLOSEAPP; - } - } - else // (!aSWITCHES[ swREMOTE ].fPresent) - { - ULONG status; - if (!AfsAppLib_OpenAdminServer (NULL, &status)) - { - if (status == ADMCLIENTCANTINITAFSLOCATION) - ImmediateErrorDialog (status, IDS_ERROR_BAD_REMOTE_SERVER_INSTALL, aSWITCHES[ swREMOTE ].szValue); - else - ImmediateErrorDialog (status, IDS_ERROR_BAD_LOCAL_SERVER, TEXT("%s"), aSWITCHES[ swREMOTE ].szValue); - return opCLOSEAPP; - } - } - g.idClient = AfsAppLib_GetAdminServerClientID(); - - // Obtain credentials - // - if (aSWITCHES[ swUSER ].fPresent) - { - LPTSTR pszCell = (aSWITCHES[ swCELL ].fPresent) ? (aSWITCHES[ swCELL ].szValue) : NULL; - - ULONG status; - if (!AfsAppLib_SetCredentials (pszCell, aSWITCHES[ swUSER ].szValue, aSWITCHES[ swPASSWORD ].szValue, &status)) - { - ImmediateErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS); - return opCLOSEAPP; - } - } - - // If the user asked us to, try to open the specified cell - // - if (aSWITCHES[ swCELL ].fPresent) - { - LPOPENCELL_PARAMS lpp = New (OPENCELL_PARAMS); - memset (lpp, 0x00, sizeof(OPENCELL_PARAMS)); - lstrcpy (lpp->szCell, aSWITCHES[ swCELL ].szValue); - lpp->fCloseAppOnFail = TRUE; - StartTask (taskOPENCELL, NULL, lpp); - return opNOCELLDIALOG; - } - - // Okay--nothing sufficiently special took place to prevent us - // from running the tool normally. - // - return opNORMAL; -} - - -void cdecl CommandLineHelp (int ids, LPTSTR pszFormat, ...) -{ - va_list arg; - va_start (arg, pszFormat); - vMessage (MB_OK | MB_ICONHAND, IDS_CMDLINE_TITLE, ids, pszFormat, arg); -} - diff --git a/src/WINNT/afsusrmgr/cmdline.h b/src/WINNT/afsusrmgr/cmdline.h deleted file mode 100644 index d88b0b134..000000000 --- a/src/WINNT/afsusrmgr/cmdline.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CMDLINE_H -#define CMDLINE_H - -/* - * TYPEDEFS _________________________________________________________________ - * - */ - -typedef enum - { - opCLOSEAPP, // close the application entirely - opNORMAL, // proceed normally - opNOCELLDIALOG, // ...but don't ask for a cell - } CMDLINEOP; - -CMDLINEOP ParseCommandLine (LPTSTR pszCmdLine); - - -#endif - diff --git a/src/WINNT/afsusrmgr/columns.cpp b/src/WINNT/afsusrmgr/columns.cpp deleted file mode 100644 index 16eeefea3..000000000 --- a/src/WINNT/afsusrmgr/columns.cpp +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "columns.h" -#include "display.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault); -void Columns_OnSelect (HWND hDlg); -void Columns_OnSelAvail (HWND hDlg); -void Columns_OnSelShown (HWND hDlg); -void Columns_OnInsert (HWND hDlg); -void Columns_OnDelete (HWND hDlg); -void Columns_OnMoveUp (HWND hDlg); -void Columns_OnMoveDown (HWND hDlg); -void Columns_OnApply (HWND hDlg); - - -/* - * COLUMNS DIALOG _____________________________________________________________ - * - */ - -typedef enum - { - ceUSERS, // gr.viewUsr - ceGROUPS, // gr.viewGrp - ceMACHINES, // gr.viewMch - } COLUMNS_ENTRY; - -static struct - { - int ids; - BOOL fUsuallyHidden; - VIEWINFO vi; - BOOL fChanged; - } -COLUMNS[] = - { - { IDS_COL_USERS, FALSE, {0}, FALSE }, // ceUSERS - { IDS_COL_GROUPS, FALSE, {0}, FALSE }, // ceGROUPS - { IDS_COL_MACHINES, FALSE, {0}, FALSE }, // ceMACHINES - }; - -#define nCOLUMNS (sizeof(COLUMNS)/sizeof(COLUMNS[0])) - -typedef struct - { - HWND hParent; - LPVIEWINFO lpviDefault; - } ShowColumnsParams; - -void ShowColumnsDialog (HWND hParent, LPVIEWINFO lpvi) -{ - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - COLUMNS[ iCol ].fChanged = FALSE; - } - - memcpy (&COLUMNS[ ceUSERS ].vi, &gr.viewUsr, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceGROUPS ].vi, &gr.viewGrp, sizeof(VIEWINFO)); - memcpy (&COLUMNS[ ceMACHINES ].vi, &gr.viewMch, sizeof(VIEWINFO)); - - if (lpvi == &gr.viewUsr) - lpvi = &COLUMNS[ ceUSERS ].vi; - else if (lpvi == &gr.viewGrp) - lpvi = &COLUMNS[ ceGROUPS ].vi; - else if (lpvi == &gr.viewMch) - lpvi = &COLUMNS[ ceMACHINES ].vi; - - // If the caller didn't specify which VIEWINFO structure to adjust - // by default, pick whichever one is on the currently-displayed tab - // - if (!lpvi) - { - switch (Display_GetActiveTab()) - { - case ttUSERS: - lpvi = &COLUMNS[ ceUSERS ].vi; - break; - case ttGROUPS: - lpvi = &COLUMNS[ ceGROUPS ].vi; - break; - case ttMACHINES: - lpvi = &COLUMNS[ ceMACHINES ].vi; - break; - } - } - - // Show the Columns dialog - // - LPPROPSHEET psh = PropSheet_Create (IDS_COLUMNS_TITLE, FALSE); - psh->sh.hwndParent = hParent; - - ShowColumnsParams *pscp = New (ShowColumnsParams); - pscp->hParent = hParent; - pscp->lpviDefault = lpvi; - - PropSheet_AddTab (psh, 0, IDD_COLUMNS, (DLGPROC)Columns_DlgProc, (LPARAM)pscp, TRUE); - PropSheet_ShowModal (psh, PumpMessage); -} - - -BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_COLUMNS, hDlg, msg, wp, lp)) - return TRUE; - - if (msg == WM_INITDIALOG) - SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam); - - ShowColumnsParams *pscp; - pscp = (ShowColumnsParams *)GetWindowLong (hDlg, DWL_USER); - - switch (msg) - { - case WM_INITDIALOG: - Columns_OnInitDialog (hDlg, (pscp) ? pscp->lpviDefault : NULL); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Columns_OnApply (hDlg); - break; - - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDC_COLUMNS: - if (HIWORD(wp) == CBN_SELCHANGE) - { - Columns_OnSelect (hDlg); - } - break; - - case IDC_COL_AVAIL: - if (HIWORD(wp) == LBN_SELCHANGE) - { - Columns_OnSelAvail (hDlg); - } - break; - - case IDC_COL_SHOWN: - if (HIWORD(wp) == LBN_SELCHANGE) - { - Columns_OnSelShown (hDlg); - } - break; - - case IDC_COL_INSERT: - Columns_OnInsert (hDlg); - break; - - case IDC_COL_DELETE: - Columns_OnDelete (hDlg); - break; - - case IDC_COL_UP: - Columns_OnMoveUp (hDlg); - break; - - case IDC_COL_DOWN: - Columns_OnMoveDown (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault) -{ - HWND hList = GetDlgItem (hDlg, IDC_COLUMNS); - CB_StartChange (hList); - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if ((COLUMNS[iCol].fUsuallyHidden) && (lpviDefault != &COLUMNS[iCol].vi)) - continue; - - CB_AddItem (hList, COLUMNS[iCol].ids, (LPARAM)&COLUMNS[iCol].vi); - } - - CB_EndChange (hList, (LPARAM)lpviDefault); - - Columns_OnSelect (hDlg); -} - - -void Columns_OnSelect (HWND hDlg) -{ - HWND hList; - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem(hDlg,IDC_COLUMNS)); - - // Fill in the Available list... - // - hList = GetDlgItem (hDlg, IDC_COL_AVAIL); - LB_StartChange (hList); - - for (size_t iAvail = 0; iAvail < lpvi->nColsAvail; ++iAvail) - { - for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown) - { - if (lpvi->aColumns[ iShown ] == iAvail) - break; - } - if (iShown == lpvi->nColsShown) - { - LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail); - } - } - - LB_EndChange (hList); - Columns_OnSelAvail (hDlg); - - // Fill in the Shown list... - // - hList = GetDlgItem (hDlg, IDC_COL_SHOWN); - LB_StartChange (hList); - - for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown) - { - iAvail = lpvi->aColumns[ iShown ]; - LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail); - } - - LB_EndChange (hList); - Columns_OnSelShown (hDlg); -} - - -void Columns_OnSelAvail (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_COL_AVAIL); - int ii = LB_GetSelected (hList); - - EnableWindow (GetDlgItem (hDlg, IDC_COL_INSERT), (ii != -1)); -} - - -void Columns_OnSelShown (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hList); - - if (ii == -1) - { - EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_COL_UP), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), FALSE); - } - else - { - int iAvail = LB_GetData (hList, ii); - EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), (iAvail != 0)); - - int ci = (int)SendMessage (hList, LB_GETCOUNT, 0, 0); - EnableWindow (GetDlgItem (hDlg, IDC_COL_UP), (ii > 1)); - EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), (ii > 0 && ii < ci-1)); - } -} - - -void Columns_OnInsert (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hAvail); - - if (ii != -1) - { - size_t iAvail = LB_GetData (hAvail, ii); - int iShown = 1+ LB_GetSelected (hShown); - - TCHAR szText[ cchRESOURCE ]; - SendMessage (hAvail, LB_GETTEXT, ii, (LPARAM)szText); - - LB_AddItem (hShown, szText, iAvail); - SendMessage (hAvail, LB_DELETESTRING, ii, 0); - - lpvi->aColumns[ lpvi->nColsShown ] = iAvail; - lpvi->nColsShown ++; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelAvail (hDlg); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnDelete (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hShown); - - if (ii != -1) - { - TCHAR szText[ cchRESOURCE ]; - SendMessage (hShown, LB_GETTEXT, ii, (LPARAM)szText); - - size_t iAvail = (size_t)LB_GetData (hShown, ii); - LB_AddItem (hAvail, szText, iAvail); - SendMessage (hShown, LB_DELETESTRING, ii, 0); - - for ( ; ii < (int)lpvi->nColsShown-1; ++ii) - { - lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ]; - } - lpvi->nColsShown --; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelAvail (hDlg); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnMoveUp (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hShown); - - if (ii > 0) - { - size_t iAvail = (size_t)LB_GetData (hShown, ii); - lpvi->aColumns[ ii ] = lpvi->aColumns[ ii-1 ]; - lpvi->aColumns[ ii-1 ] = iAvail; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelect (hDlg); - LB_SetSelectedByData (hShown, (LPARAM)iAvail); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnMoveDown (HWND hDlg) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS)); - HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL); - HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN); - int ii = LB_GetSelected (hShown); - - if (ii != -1) - { - size_t iAvail = (size_t)LB_GetData (hShown, ii); - lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ]; - lpvi->aColumns[ ii+1 ] = iAvail; - - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (lpvi == &COLUMNS[ iCol ].vi) - COLUMNS[ iCol ].fChanged = TRUE; - } - - Columns_OnSelect (hDlg); - LB_SetSelectedByData (hShown, (LPARAM)iAvail); - Columns_OnSelShown (hDlg); - PropSheetChanged (hDlg); - } -} - - -void Columns_OnApply (HWND hDlg) -{ - for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol) - { - if (COLUMNS[ iCol ].fChanged) - { - switch (iCol) - { - case ceUSERS: - if (Display_GetActiveTab() == ttUSERS) - Display_RefreshView (&COLUMNS[ iCol ].vi, gr.ivUsr); - else - memcpy (&gr.viewUsr, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO)); - break; - - case ceGROUPS: - if (Display_GetActiveTab() == ttGROUPS) - Display_RefreshView (&COLUMNS[ iCol ].vi, gr.ivGrp); - else - memcpy (&gr.viewGrp, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO)); - break; - - case ceMACHINES: - if (Display_GetActiveTab() == ttMACHINES) - Display_RefreshView (&COLUMNS[ iCol ].vi, gr.ivMch); - else - memcpy (&gr.viewMch, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO)); - break; - } - } - } -} - diff --git a/src/WINNT/afsusrmgr/columns.h b/src/WINNT/afsusrmgr/columns.h deleted file mode 100644 index d9115b153..000000000 --- a/src/WINNT/afsusrmgr/columns.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef COLUMNS_H -#define COLUMNS_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowColumnsDialog (HWND hParent, LPVIEWINFO lpvi = NULL); - - -#endif - diff --git a/src/WINNT/afsusrmgr/command.cpp b/src/WINNT/afsusrmgr/command.cpp deleted file mode 100644 index 5c1e41c23..000000000 --- a/src/WINNT/afsusrmgr/command.cpp +++ /dev/null @@ -1,722 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "command.h" -#include "window.h" -#include "creds.h" -#include "action.h" -#include "columns.h" -#include "cell_prop.h" -#include "options.h" -#include "usr_prop.h" -#include "usr_cpw.h" -#include "usr_create.h" -#include "usr_delete.h" -#include "grp_prop.h" -#include "grp_rename.h" -#include "grp_create.h" -#include "grp_delete.h" -#include "mch_create.h" -#include "mch_delete.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowContextMenu (POPUPMENU pm, HWND hList, LPASIDLIST pAsidList, POINT *pptScreen); - -void Command_OnView (WORD wCmd); -void Command_OnShowActions (void); -void Command_OnRefresh (void); -void Command_OnUnlock (void); -void Command_OnProperties (void); -void Command_OnMembership (void); -void Command_OnChangePassword (void); -void Command_OnRename (void); -void Command_OnCreateUser (void); -void Command_OnCreateGroup (void); -void Command_OnCreateMachine (void); -void Command_OnDelete (void); - -void Command_OnKey_CtrlTab (BOOL fForward); -void Command_OnKey_Tab (BOOL fForward); -void Command_OnKey_Return (void); -void Command_OnKey_Menu (void); -void Command_OnKey_Esc (void); -void Command_OnKey_Properties (void); - - -/* - * POPUP-MENU SUPPORT _________________________________________________________ - * - */ - -void OnRightClick (POPUPMENU pm, HWND hList, POINT *pptScreen) -{ - if (IsWindow (hList)) - { - // Which items are selected in the given list? (Note: if we're - // responding to a WM_CONTEXTMENU, then the act of clicking the - // mouse button has already changed the selection as appropriate.) - // - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - if (pAsidList->cEntries == 0) - { - asc_AsidListFree (&pAsidList); - pAsidList = NULL; - } - } - - // If we don't have screen coordinates, the user must have clicked - // the Menu key on the keyboard. Pick the center of the first - // selected item's region (or the center of the list if none), - // and display the appropriate menu. - // - if (!pptScreen) - { - RECT rWindow; - GetWindowRect (hList, &rWindow); - - HLISTITEM hItemSelected = NULL; - if (pAsidList) - hItemSelected = FastList_FindItem (hList, (LPARAM)(pAsidList->aEntries[0].idObject)); - - POINT ptScreen; - if (!hItemSelected) - { - ptScreen.x = rWindow.left + (rWindow.right - rWindow.left)/2; - ptScreen.y = rWindow.top + (rWindow.bottom - rWindow.top)/2; - } - else - { - FASTLISTITEMREGIONS Reg; - FastList_GetItemRegions (hList, hItemSelected, &Reg); - ptScreen.x = rWindow.left + Reg.rLabel.left + (Reg.rLabel.right - Reg.rLabel.left)/2; - ptScreen.y = rWindow.top + Reg.rLabel.top + (Reg.rLabel.bottom - Reg.rLabel.top)/2; - ptScreen.x = min (max (ptScreen.x, rWindow.left), rWindow.right); - ptScreen.y = min (max (ptScreen.y, rWindow.top), rWindow.bottom); - } - - ShowContextMenu (pm, hList, pAsidList, &ptScreen); - } - else - { - POINT ptClient = *pptScreen; - ScreenToClient (hList, &ptClient); - - // Did the user click on the header bar for the list? - // - if (FL_HitTestForHeaderBar (hList, ptClient)) - { - HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS); - DisplayContextMenu (hm, *pptScreen, GetParent(hList)); - } - else - { - ShowContextMenu (pm, hList, pAsidList, pptScreen); - } - } - - if (pAsidList) - asc_AsidListFree (&pAsidList); - } -} - - -void ShowContextMenu (POPUPMENU pm, HWND hList, LPASIDLIST pAsidList, POINT *pptScreen) -{ - HMENU hm = NULL; - - switch (pm) - { - case pmUSER: - if (pAsidList) - { - hm = TaLocale_LoadMenu (MENU_USER); - if (pAsidList->cEntries > 1) - EnableMenu (hm, M_CPW, FALSE); - } - else // (!pAsidList) - { - hm = TaLocale_LoadMenu (MENU_USER_NONE); - Main_SetViewMenus (hm); - } - break; - - case pmGROUP: - if (pAsidList) - { - hm = TaLocale_LoadMenu (MENU_GROUP); - if (pAsidList->cEntries > 1) - EnableMenu (hm, M_RENAME, FALSE); - } - else // (!pAsidList) - { - hm = TaLocale_LoadMenu (MENU_GROUP_NONE); - Main_SetViewMenus (hm); - } - break; - - case pmMACHINE: - if (pAsidList) - { - hm = TaLocale_LoadMenu (MENU_MACHINE); - } - else // (!pAsidList) - { - hm = TaLocale_LoadMenu (MENU_MACHINE_NONE); - Main_SetViewMenus (hm); - } - break; - } - - if (hm) - { - DisplayContextMenu (hm, *pptScreen, GetParent(hList)); - } -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void OnContextCommand (WORD wCmd) -{ - switch (wCmd) - { - // Menu commands - // - case M_OPENCELL: - (void)OpenCellDialog(); - break; - - case M_CREDENTIALS: - (void)NewCredsDialog(); - break; - - case M_EXIT: - Quit (0); - break; - - case M_VIEW_LARGE: - case M_VIEW_SMALL: - case M_VIEW_DETAILS: - case M_VIEW_ONE: - case M_VIEW_TWO: - case M_VIEW_STATUS: - Command_OnView (wCmd); - break; - - case M_ACTIONS: - Command_OnShowActions(); - break; - - case M_COLUMNS: - ShowColumnsDialog (g.hMain); - break; - - case M_OPTIONS: - ShowOptionsDialog (g.hMain); - break; - - case M_USER_CREATE: - Command_OnCreateUser(); - break; - - case M_GROUP_CREATE: - Command_OnCreateGroup(); - break; - - case M_MACHINE_CREATE: - Command_OnCreateMachine(); - break; - - case M_RENAME: - Command_OnRename(); - break; - - case M_DELETE: - Command_OnDelete(); - break; - - case M_CPW: - Command_OnChangePassword(); - break; - - case M_SELECTALL: - Display_SelectAll(); - break; - - case M_REFRESH: - Command_OnRefresh(); - break; - - case M_MEMBERSHIP: - Command_OnMembership(); - break; - - case M_UNLOCK: - Command_OnUnlock(); - break; - - case M_PROPERTIES: - Command_OnProperties(); - break; - - case M_CELL_PROPERTIES: - Cell_ShowProperties(); - break; - - case M_REFRESHALL: - StartTask (taskREFRESH, NULL, (PVOID)g.idCell); - break; - - case M_CONTENTS: - WinHelp (g.hMain, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case M_FIND: - Help_FindCommand(); - break; - - case M_LOOKUP: - Help_FindError(); - break; - - case M_ABOUT: - Help_About(); - break; - - // Keyboard handlers (we use accelerator table entries to catch - // tab/return/esc/etc, and mimic a normal dialog box's behavior) - // - case M_KEY_RETURN: - Command_OnKey_Return(); - break; - - case M_KEY_CTRLTAB: - Command_OnKey_CtrlTab (TRUE); - break; - - case M_KEY_CTRLBACKTAB: - Command_OnKey_CtrlTab (FALSE); - break; - - case M_KEY_TAB: - Command_OnKey_Tab (TRUE); - break; - - case M_KEY_BACKTAB: - Command_OnKey_Tab (FALSE); - break; - - case M_KEY_MENU: - Command_OnKey_Menu(); - break; - - case M_KEY_ESC: - Command_OnKey_Esc(); - break; - - case M_KEY_PROPERTIES: - Command_OnKey_Properties(); - break; - } -} - - -/* - * COMMAND HANDLERS _______________________________________________________________________________ - * - */ - -void Command_OnView (WORD wCmd) -{ - // Which tab is currently being displayed? - // - HWND hTab = GetDlgItem (g.hMain, IDC_TAB); - int iTab = TabCtrl_GetCurSel (hTab); - - // Find the appropriate current view settings for this tab - // - LPVIEWINFO pvi = (iTab == 0) ? &gr.viewUsr : (iTab == 1) ? &gr.viewGrp : &gr.viewMch; - ICONVIEW iv = (iTab == 0) ? gr.ivUsr : (iTab == 1) ? gr.ivGrp : gr.ivMch; - - // ...and prepare modified versions of them - // - VIEWINFO viNew = *pvi; - ICONVIEW ivNew = iv; - - switch (wCmd) - { - case M_VIEW_LARGE: - viNew.lvsView = (viNew.lvsView & (~FLS_VIEW_MASK)) | FLS_VIEW_LARGE; - break; - case M_VIEW_SMALL: - viNew.lvsView = (viNew.lvsView & (~FLS_VIEW_MASK)) | FLS_VIEW_SMALL; - break; - case M_VIEW_DETAILS: - viNew.lvsView = (viNew.lvsView & (~FLS_VIEW_MASK)) | FLS_VIEW_LIST; - break; - case M_VIEW_TWO: - ivNew = ivTWOICONS; - break; - case M_VIEW_ONE: - ivNew = ivONEICON; - break; - case M_VIEW_STATUS: - ivNew = ivSTATUS; - break; - } - - if ((viNew.lvsView & FLS_VIEW_MASK) != FLS_VIEW_LIST) - { - viNew.iSort = 0; // sort alphabetically by name - } - - // Apply the changes, and update the main window's menu items - // - Display_RefreshView (&viNew, ivNew); - Main_SetMenus (); -} - - -void Command_OnShowActions (void) -{ - if ((gr.fShowActions = !gr.fShowActions) == TRUE) - Actions_OpenWindow(); - else - Actions_CloseWindow(); - Main_SetMenus(); -} - - -void Command_OnRefresh (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - StartTask (taskREFRESHMULT, NULL, pAsidList); - } -} - - -void Command_OnUnlock (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - StartTask (taskUSER_UNLOCK, NULL, pAsidList); - } -} - - -void Command_OnProperties (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - // See what kind of objects are selected - // - BOOL fAnyUsers = FALSE; - BOOL fAnyGroups = FALSE; - - for (size_t ii = 0; ii < pAsidList->cEntries; ++ii) - { - ASOBJTYPE Type; - if (!asc_ObjectTypeGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, &Type)) - continue; - switch (Type) - { - case TYPE_USER: - fAnyUsers = TRUE; - break; - case TYPE_GROUP: - fAnyGroups = TRUE; - break; - } - } - - // If they're homogenous, display the appropriate properties dialog - // - if (fAnyUsers && !fAnyGroups) - User_ShowProperties (pAsidList); - else if (fAnyGroups && !fAnyUsers) - Group_ShowProperties (pAsidList); - else - asc_AsidListFree (&pAsidList); - } -} - - -void Command_OnMembership (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - // See what kind of objects are selected - // - BOOL fAnyUsers = FALSE; - BOOL fAnyGroups = FALSE; - - for (size_t ii = 0; ii < pAsidList->cEntries; ++ii) - { - ASOBJTYPE Type; - if (!asc_ObjectTypeGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, &Type)) - continue; - switch (Type) - { - case TYPE_USER: - fAnyUsers = TRUE; - break; - case TYPE_GROUP: - fAnyGroups = TRUE; - break; - } - } - - // If they're homogenous, display the appropriate membership dialog - // - if (fAnyUsers && !fAnyGroups) - User_ShowProperties (pAsidList, uptMEMBERSHIP); - else if (fAnyGroups && !fAnyUsers) - Group_ShowProperties (pAsidList, gptMEMBERS); - else - asc_AsidListFree (&pAsidList); - } -} - - -void Command_OnChangePassword (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - if (pAsidList->cEntries == 1) - { - ASOBJTYPE Type; - if (asc_ObjectTypeGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[0].idObject, &Type)) - { - if (Type == TYPE_USER) - User_ShowChangePassword (g.hMain, pAsidList->aEntries[0].idObject); - } - } - } -} - - -void Command_OnRename (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - if (pAsidList->cEntries == 1) - { - ASOBJTYPE Type; - if (asc_ObjectTypeGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[0].idObject, &Type)) - { - if (Type == TYPE_GROUP) - Group_ShowRename (g.hMain, pAsidList->aEntries[0].idObject); - } - } - } -} - - -void Command_OnCreateUser (void) -{ - User_ShowCreate (g.hMain); -} - - -void Command_OnCreateGroup (void) -{ - Group_ShowCreate (g.hMain); -} - - -void Command_OnCreateMachine (void) -{ - Machine_ShowCreate (g.hMain); -} - - -void Command_OnDelete (void) -{ - LPASIDLIST pAsidList; - if ((pAsidList = Display_GetSelectedList()) != NULL) - { - // See what kind of objects are selected - // - BOOL fAnyUsers = FALSE; - BOOL fAnyGroups = FALSE; - BOOL fAnyMachines = FALSE; - - for (size_t ii = 0; ii < pAsidList->cEntries; ++ii) - { - ASOBJTYPE Type; - if (!asc_ObjectTypeGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, &Type)) - continue; - switch (Type) - { - case TYPE_USER: - if (fIsMachineAccount (pAsidList->aEntries[ ii ].idObject)) - fAnyMachines = TRUE; - else - fAnyUsers = TRUE; - break; - case TYPE_GROUP: - fAnyGroups = TRUE; - break; - } - } - - // If they're homogenous, display a matching delete confirmation dialog - // - if (fAnyUsers && !fAnyGroups && !fAnyMachines) - User_ShowDelete (pAsidList); - else if (fAnyGroups && !fAnyUsers && !fAnyMachines) - Group_ShowDelete (pAsidList); - else if (fAnyMachines && !fAnyUsers && !fAnyGroups) - Machine_ShowDelete (pAsidList); - else - asc_AsidListFree (&pAsidList); - } -} - - -/* - * KEYBOARD HANDLERS ______________________________________________________________________________ - * - */ - -void Command_OnKey_Tab (BOOL fForward) -{ - // The tab-cycle should go: - // TabControl <-> TabChildControls - // - HWND hFocus = GetFocus(); - HWND hTabChild = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - - if (fForward) - { - if (hFocus == GetDlgItem (g.hMain, IDC_TAB)) - { - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, NULL, FALSE), TRUE); - } - else - { - if (GetNextDlgTabItem (hTabChild, hFocus, FALSE) == GetNextDlgTabItem (hTabChild, NULL, FALSE)) - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g.hMain, IDC_TAB), TRUE); - else - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, hFocus, FALSE), TRUE); - } - } - else // (!fForward) - { - if (hFocus == GetDlgItem (g.hMain, IDC_TAB)) - { - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetLastDlgTabItem (hTabChild), TRUE); - } - else - { - if (hFocus == GetNextDlgTabItem (hTabChild, NULL, FALSE)) - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g.hMain, IDC_TAB), TRUE); - else - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)GetNextDlgTabItem (hTabChild, hFocus, TRUE), TRUE); - } - } -} - - -void Command_OnKey_CtrlTab (BOOL fForward) -{ - HWND hTabs = GetDlgItem (g.hMain, IDC_TAB); - size_t iTab = TabCtrl_GetCurSel (hTabs); - size_t cTabs = TabCtrl_GetItemCount (hTabs); - - if (fForward) - iTab = (iTab == cTabs-1) ? (0) : (iTab+1); - else - iTab = (iTab == 0) ? (cTabs-1) : (iTab-1); - - Main_PrepareTabChild (iTab); - - PostMessage (g.hMain, WM_NEXTDLGCTL, (WPARAM)hTabs, TRUE); -} - - -void Command_OnKey_Return (void) -{ - static NMHDR hdr; - hdr.hwndFrom = GetFocus(); - hdr.idFrom = GetWindowLong (GetFocus(), GWL_ID); - hdr.code = FLN_LDBLCLICK; - PostMessage (GetParent (GetFocus()), WM_NOTIFY, 0, (LPARAM)&hdr); -} - - -void Command_OnKey_Menu (void) -{ - HWND hFocus = GetFocus(); - if (fIsFastList (hFocus)) - { - // Is the user or group tab showing? - // - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - POPUPMENU pm = pmGROUP; - if (!IsWindow (hList)) - { - hList = GetDlgItem (hDlg, IDC_USERS_LIST); - pm = pmUSER; - } - if (!IsWindow (hList)) - { - hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - pm = pmMACHINE; - } - - if (IsWindow (hList)) - { - // Pretend the user right-clicked - // - OnRightClick (pm, hList); - } - } -} - - -void Command_OnKey_Esc (void) -{ - HWND hFocus = GetFocus(); - if (fIsFastList (hFocus)) - { - FastList_SelectNone (hFocus); - } -} - - -void Command_OnKey_Properties (void) -{ - OnContextCommand (M_PROPERTIES); -} - diff --git a/src/WINNT/afsusrmgr/command.h b/src/WINNT/afsusrmgr/command.h deleted file mode 100644 index 4934f591c..000000000 --- a/src/WINNT/afsusrmgr/command.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef COMMAND_H -#define COMMAND_H - - -/* - * POPUP MENUS ________________________________________________________________ - * - */ - -typedef enum - { - pmUSER, - pmGROUP, - pmMACHINE - } POPUPMENU; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void OnRightClick (POPUPMENU pm, HWND hList, POINT *pptScreen = NULL); - -void OnContextCommand (WORD wCmd); - - -#endif - diff --git a/src/WINNT/afsusrmgr/creds.cpp b/src/WINNT/afsusrmgr/creds.cpp deleted file mode 100644 index b1f0e5ead..000000000 --- a/src/WINNT/afsusrmgr/creds.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "creds.h" - - -/* - * OPENCELL DIALOG ____________________________________________________________ - * - */ - -void OpenCell_Hook_Enable (HWND hDlg, BOOL fEnable) -{ - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); - EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable); -} - - -void OpenCell_Hook_OnEndTask_OpenCell (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc) - { - EndDialog (hDlg, IDOK); - } - else - { - OpenCell_Hook_Enable (hDlg, TRUE); - - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - ErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), szCell); - } -} - - -void OpenCell_Hook_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp) -{ - BOOL rc = FALSE; - OpenCell_Hook_Enable (hDlg, FALSE); - StartHourGlass (); - - // Remember what cell the user chose to edit - // - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME); - - // Try to obtain the credentials specified by the user. - // - TCHAR szCell[ cchNAME ]; - GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME); - - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME); - - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME); - - ULONG status; - if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL) - { - ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS); - } - else - { - // See if those credentials are sufficient - // - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); - pp.bcdp.hParent = hDlg; - pp.hCreds = lpp->hCreds; - pp.fShowWarning = TRUE; - - if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE) - { - SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin")); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE); - } - } - - if (rc) - { - g.hCreds = lpp->hCreds; - - // Instead of closing the dialog, start an taskOPENCELL task; - // we'll wait for that to complete successfully before we'll - // close the dialog. - // - LPOPENCELL_PARAMS lpocp = New (OPENCELL_PARAMS); - memset (lpocp, 0x00, sizeof(OPENCELL_PARAMS)); - lstrcpy (lpocp->szCell, lpp->szCell); - lpocp->fCloseAppOnFail = FALSE; - lpocp->hCreds = lpp->hCreds; - StartTask (taskOPENCELL, hDlg, lpocp); - } - - if (!rc) - OpenCell_Hook_Enable (hDlg, TRUE); - StopHourGlass (); -} - - -BOOL CALLBACK OpenCell_Hook (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskOPENCELL) - OpenCell_Hook_OnEndTask_OpenCell (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - OpenCell_Hook_OnOK (hDlg, (LPOPENCELLDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)); - return TRUE; - } - break; - } - - return FALSE; -} - - -/* - * CREDENTIALS ________________________________________________________________ - * - */ - -void GetBadCredsDlgParams (LPBADCREDSDLG_PARAMS lpp) -{ - memset (lpp, 0x00, sizeof(BADCREDSDLG_PARAMS)); - lpp->pfShowWarningEver = &gr.fWarnBadCreds; - lpp->idsDesc = IDS_BADCREDS_DESC; -} - - -void GetCredentialsDlgParams (LPCREDENTIALSDLG_PARAMS lpp) -{ - memset (lpp, 0x00, sizeof(CREDENTIALSDLG_PARAMS)); - lpp->hParent = g.hMain; - lpp->hCreds = g.hCreds; - if (g.idCell) - asc_CellNameGet_Fast (g.idClient, g.idCell, lpp->szCell); - else - AfsAppLib_GetLocalCell (lpp->szCell); - GetBadCredsDlgParams (&lpp->bcdp); -} - - -/* - * OPERATIONS _________________________________________________________________ - * - */ - -BOOL OpenCellDialog (void) -{ - OPENCELLDLG_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.hookproc = (DLGPROC)OpenCell_Hook; - pp.hParent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL; - pp.idsDesc = 0; - pp.hCreds = g.hCreds; - pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS); - GetBadCredsDlgParams (&pp.bcdp); - - BOOL rc = AfsAppLib_ShowOpenCellDialog (&pp); - - AfsAppLib_FreeCellList (pp.lpcl); - return rc; -} - - -BOOL NewCredsDialog (void) -{ - CREDENTIALSDLG_PARAMS pp; - GetCredentialsDlgParams (&pp); - return AfsAppLib_ShowCredentialsDialog (&pp); -} - - -void CheckForExpiredCredentials (void) -{ - CREDENTIALSDLG_PARAMS pp; - GetCredentialsDlgParams (&pp); - AfsAppLib_CheckForExpiredCredentials (&pp); -} - - -BOOL CheckCredentials (BOOL fComplain) -{ - CHECKCREDS_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.fShowWarning = fComplain; - pp.hCreds = g.hCreds; - GetBadCredsDlgParams (&pp.bcdp); - - return AfsAppLib_CheckCredentials (&pp); -} - - -void ShowCurrentCredentials (void) -{ - int idsCreds = IDS_CRED_NONE; - TCHAR szCell[ cchNAME ]; - TCHAR szUser[ cchNAME ]; - SYSTEMTIME stExpire; - - if (g.hCreds) - { - if (AfsAppLib_CrackCredentials (g.hCreds, szCell, szUser, &stExpire)) - { - if (AfsAppLib_IsTimeInFuture (&stExpire)) - idsCreds = IDS_CRED_OK; - else - idsCreds = IDS_CRED_EXP; - } - } - - LPTSTR pszCreds = FormatString (idsCreds, TEXT("%s%t"), szUser, &stExpire); - SetDlgItemText (g.hMain, IDC_CREDS, pszCreds); - FreeString (pszCreds); -} - diff --git a/src/WINNT/afsusrmgr/creds.h b/src/WINNT/afsusrmgr/creds.h deleted file mode 100644 index a5f4d147e..000000000 --- a/src/WINNT/afsusrmgr/creds.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CREDS_H -#define CREDS_H - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -int OpenCellDialog (void); -BOOL NewCredsDialog (void); -void CheckForExpiredCredentials (void); -BOOL CheckCredentials (BOOL fComplain); -void ShowCurrentCredentials (void); - -#endif - diff --git a/src/WINNT/afsusrmgr/display.cpp b/src/WINNT/afsusrmgr/display.cpp deleted file mode 100644 index 3c21a2e46..000000000 --- a/src/WINNT/afsusrmgr/display.cpp +++ /dev/null @@ -1,629 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_col.h" -#include "grp_col.h" -#include "mch_col.h" - - -/* - * ANIMATED ICON ______________________________________________________________ - * - */ - -static DWORD l_cReqAnimation = 0; - -void Display_StartWorking (void) -{ - if ((++l_cReqAnimation) == 1) - { - AfsAppLib_StartAnimation (GetDlgItem (g.hMain, IDC_ANIM)); - } -} - - -void Display_StopWorking (void) -{ - if (!l_cReqAnimation || !(--l_cReqAnimation)) - { - AfsAppLib_StopAnimation (GetDlgItem (g.hMain, IDC_ANIM)); - } -} - - -/* - * USER/GROUP LISTS ___________________________________________________________ - * - */ - -void Display_PopulateList (void) -{ - switch (Display_GetActiveTab()) - { - case ttUSERS: - Display_PopulateUserList(); - break; - - case ttGROUPS: - Display_PopulateGroupList(); - break; - - case ttMACHINES: - Display_PopulateMachineList(); - break; - } -} - - -void Display_PopulateUserList (void) -{ - if (g.idCell) - { - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST); - if (IsWindow (hList)) - { - TCHAR szQuerying[ cchRESOURCE ]; - GetString (szQuerying, IDS_QUERYING_LONG); - SetDlgItemText (hDlg, IDC_USERS_TITLE, szQuerying); - - Display_StartWorking(); - GetDlgItemText (hDlg, IDC_USERS_PATTERN, g.szPatternUsers, cchNAME); - StartTask (taskUPD_USERS, g.hMain); - } - } -} - - -void Display_PopulateGroupList (void) -{ - if (g.idCell) - { - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - if (IsWindow (hList)) - { - TCHAR szQuerying[ cchRESOURCE ]; - GetString (szQuerying, IDS_QUERYING_LONG); - SetDlgItemText (hDlg, IDC_GROUPS_TITLE, szQuerying); - - Display_StartWorking(); - GetDlgItemText (hDlg, IDC_GROUPS_PATTERN, g.szPatternGroups, cchNAME); - StartTask (taskUPD_GROUPS, g.hMain); - } - } -} - - -void Display_PopulateMachineList (void) -{ - if (g.idCell) - { - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - if (IsWindow (hList)) - { - TCHAR szQuerying[ cchRESOURCE ]; - GetString (szQuerying, IDS_QUERYING_LONG); - SetDlgItemText (hDlg, IDC_MACHINES_TITLE, szQuerying); - - Display_StartWorking(); - GetDlgItemText (hDlg, IDC_MACHINES_PATTERN, g.szPatternMachines, cchNAME); - StartTask (taskUPD_MACHINES, g.hMain); - } - } -} - - -void Display_OnEndTask_UpdUsers (LPTASKPACKET ptp) -{ - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST); - if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternUsers)) - { - FastList_Begin (hList); - - // Update the title above the list to indicate what we're showing - // - TCHAR szCell[ cchRESOURCE ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szCell); - - LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0] || (gr.SearchUsers.SearchType != SEARCH_NO_LIMITATIONS)) ? IDS_USERS_PATTERN : IDS_USERS_ALL, TEXT("%s"), szCell); - SetDlgItemText (hDlg, IDC_USERS_TITLE, pszTitle); - FreeString (pszTitle); - - // For faster access, we'll want to use a hashlist to deal with - // the items in our ASIDLIST (right now it's just a flat array). - // This lets us remove duplicates--which is no big deal because - // there shouldn't be any anyway--but more importantly it lets - // us instantly determine if a particular ASID is in the list - // (the asc_AsidListTest function is O(n), and we need O(1)). - // - LPHASHLIST pAsidList = New (HASHLIST); - if (TASKDATA(ptp)->pAsidList) - { - for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid) - pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject)); - } - - // Delete any items which are currently in the FastList but - // which aren't in our AsidList. - // - HLISTITEM hItemNext; - for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext) - { - hItemNext = FastList_FindNext (hList, hItem); - ASID idObject = (ASID)FastList_GetItemParam (hList, hItem); - if (!pAsidList->fIsInList ((PVOID)idObject)) - FastList_RemoveItem (hList, hItem); - } - - // Add items for any entries which are in our AsidList but aren't - // currently in the FastList. - // - DWORD dwStyle = GetWindowLong (hList, GWL_STYLE); - - for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - ASID idObject = (ASID)( pEnum->GetObject() ); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL) - { - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(ai)); - Display_GetImageIcons (dwStyle, gr.ivUsr, idObject, imageUSER, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage); - ai.lParam = (LPARAM)idObject; - hItem = FastList_AddItem (hList, &ai); - } - } - - Delete (pAsidList); - FastList_End (hList); - } - - Display_StopWorking(); -} - - -void Display_OnEndTask_UpdGroups (LPTASKPACKET ptp) -{ - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternGroups)) - { - FastList_Begin (hList); - - // Update the title above the list to indicate what we're showing - // - TCHAR szCell[ cchRESOURCE ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szCell); - - LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0]) ? IDS_GROUPS_PATTERN : IDS_GROUPS_ALL, TEXT("%s"), szCell); - SetDlgItemText (hDlg, IDC_GROUPS_TITLE, pszTitle); - FreeString (pszTitle); - - // For faster access, we'll want to use a hashlist to deal with - // the items in our ASIDLIST (right now it's just a flat array). - // This lets us remove duplicates--which is no big deal because - // there shouldn't be any anyway--but more importantly it lets - // us instantly determine if a particular ASID is in the list - // (the asc_AsidListTest function is O(n), and we need O(1)). - // - LPHASHLIST pAsidList = New (HASHLIST); - if (TASKDATA(ptp)->pAsidList) - { - for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid) - pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject)); - } - - // Delete any items which are currently in the FastList but - // which aren't in our AsidList. - // - HLISTITEM hItemNext; - for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext) - { - hItemNext = FastList_FindNext (hList, hItem); - ASID idObject = (ASID)FastList_GetItemParam (hList, hItem); - if (!pAsidList->fIsInList ((PVOID)idObject)) - FastList_RemoveItem (hList, hItem); - } - - // Add items for any entries which are in our AsidList but aren't - // currently in the FastList. - // - DWORD dwStyle = GetWindowLong (hList, GWL_STYLE); - - for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - ASID idObject = (ASID)( pEnum->GetObject() ); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL) - { - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(ai)); - Display_GetImageIcons (dwStyle, gr.ivGrp, idObject, imageGROUP, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage); - ai.lParam = (LPARAM)idObject; - hItem = FastList_AddItem (hList, &ai); - } - } - - Delete (pAsidList); - FastList_End (hList); - } - - Display_StopWorking(); -} - - -void Display_OnEndTask_UpdMachines (LPTASKPACKET ptp) -{ - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternMachines)) - { - FastList_Begin (hList); - - // Update the title above the list to indicate what we're showing - // - TCHAR szCell[ cchRESOURCE ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szCell); - - LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0]) ? IDS_MACHINES_PATTERN : IDS_MACHINES_ALL, TEXT("%s"), szCell); - SetDlgItemText (hDlg, IDC_MACHINES_TITLE, pszTitle); - FreeString (pszTitle); - - // For faster access, we'll want to use a hashlist to deal with - // the items in our ASIDLIST (right now it's just a flat array). - // This lets us remove duplicates--which is no big deal because - // there shouldn't be any anyway--but more importantly it lets - // us instantly determine if a particular ASID is in the list - // (the asc_AsidListTest function is O(n), and we need O(1)). - // - LPHASHLIST pAsidList = New (HASHLIST); - if (TASKDATA(ptp)->pAsidList) - { - for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid) - pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject)); - } - - // Delete any items which are currently in the FastList but - // which aren't in our AsidList. - // - HLISTITEM hItemNext; - for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext) - { - hItemNext = FastList_FindNext (hList, hItem); - ASID idObject = (ASID)FastList_GetItemParam (hList, hItem); - if (!pAsidList->fIsInList ((PVOID)idObject)) - FastList_RemoveItem (hList, hItem); - } - - // Add items for any entries which are in our AsidList but aren't - // currently in the FastList. - // - DWORD dwStyle = GetWindowLong (hList, GWL_STYLE); - - for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - ASID idObject = (ASID)( pEnum->GetObject() ); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL) - { - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(ai)); - Display_GetImageIcons (dwStyle, gr.ivMch, idObject, imageSERVER, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage); - ai.lParam = (LPARAM)idObject; - hItem = FastList_AddItem (hList, &ai); - } - } - - Delete (pAsidList); - FastList_End (hList); - } - - Display_StopWorking(); -} - - -void Display_RefreshView (LPVIEWINFO pviNew, ICONVIEW ivNew) -{ - // Find the current VIEWINFO and ICONVIEW settings - // - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - - HWND hList; - LPVIEWINFO pviOld; - ICONVIEW *pivOld; - switch (Display_GetActiveTab()) - { - case ttUSERS: - pivOld = &gr.ivUsr; - pviOld = &gr.viewUsr; - hList = GetDlgItem (hDlg, IDC_USERS_LIST); - break; - - case ttGROUPS: - pivOld = &gr.ivGrp; - pviOld = &gr.viewGrp; - hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - break; - - case ttMACHINES: - pivOld = &gr.ivMch; - pviOld = &gr.viewMch; - hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - break; - } - - if (IsWindow(hList)) - { - FastList_Begin (hList); - - // If the VIEWINFO state has changed, fix it. This will change between - // large icons, small icons and details, as well as correct the currently- - // displayed columns to match what's in the new VIEWINFO structure. - // - BOOL fChangedLayouts = FALSE; - - if (memcmp (pviOld, pviNew, sizeof(VIEWINFO))) - { - FL_RestoreView (hList, pviNew); - fChangedLayouts = ((pviOld->lvsView & FLS_VIEW_MASK) != (pviNew->lvsView & FLS_VIEW_MASK)) ? TRUE : FALSE; - memcpy (pviOld, pviNew, sizeof(VIEWINFO)); - } - - // If the ICONVIEW state has changed, fix all items to show just - // the appropriate icons. We'll also have to do this if we just changed - // from details/small/large icons to another layout (that's what - // fChangedLayouts indicates) - // - if ((*pivOld != ivNew) || (fChangedLayouts)) - { - DWORD dwStyle = GetWindowLong (hList, GWL_STYLE); - - HLISTITEM hItem = NULL; - while ((hItem = FastList_FindNext (hList, hItem)) != NULL) - { - ASID idObject = (ASID)FastList_GetItemParam (hList, hItem); - - int iFirstImage; - int iSecondImage; - if (pviOld == &gr.viewUsr) - Display_GetImageIcons (dwStyle, ivNew, idObject, imageUSER, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage); - else if (pviOld == &gr.viewGrp) - Display_GetImageIcons (dwStyle, ivNew, idObject, imageGROUP, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage); - else - Display_GetImageIcons (dwStyle, ivNew, idObject, imageSERVER, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage); - - FastList_SetItemFirstImage (hList, hItem, iFirstImage); - FastList_SetItemSecondImage (hList, hItem, iSecondImage); - } - - *pivOld = ivNew; - } - - FastList_End (hList); - } -} - - -void Display_RefreshView_Fast (void) -{ - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_USERS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - if (IsWindow (hList)) - { - RECT rWindow; - GetClientRect (hList, &rWindow); - InvalidateRect (hList, &rWindow, FALSE); - UpdateWindow (hList); - } -} - - -void Display_SelectAll (void) -{ - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_USERS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - if (IsWindow (hList)) - { - // Select all items in the list - // - FastList_SelectAll (hList); - - // Simulate a FLN_ITEMSELECT notification (since we changed - // the selection programmatically, no notification will have been - // sent). - // - FLN_ITEMSELECT_PARAMS fln; - fln.hdr.hwndFrom = hList; - fln.hdr.idFrom = GetWindowLong (hList, GWL_ID); - fln.hdr.code = FLN_ITEMSELECT; - fln.hItem = FastList_FindFirstSelected (hList); - SendMessage (GetParent (hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln); - } -} - - -LPASIDLIST Display_GetSelectedList (void) -{ - LPASIDLIST pAsidList = NULL; - - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_USERS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - if (IsWindow (hList)) - { - if (asc_AsidListCreate (&pAsidList)) - { - for (HLISTITEM hItem = FastList_FindFirstSelected (hList); - hItem != NULL; - hItem = FastList_FindNextSelected (hList, hItem)) - { - ASID idObject = (ASID)FastList_GetItemParam (hList, hItem); - if (idObject) - asc_AsidListAddEntry (&pAsidList, idObject, 0); - } - } - } - - return pAsidList; -} - - -size_t Display_GetSelectedCount (void) -{ - size_t cSelected = 0; - - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_USERS_LIST); - if (!IsWindow (hList)) - hList = GetDlgItem (hDlg, IDC_MACHINES_LIST); - if (IsWindow (hList)) - { - for (HLISTITEM hItem = FastList_FindFirstSelected (hList); - hItem != NULL; - hItem = FastList_FindNextSelected (hList, hItem)) - { - ++cSelected; - } - } - - return cSelected; -} - - -TABTYPE Display_GetActiveTab (void) -{ - HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB)); - if (IsWindow (GetDlgItem (hDlg, IDC_GROUPS_LIST))) - return ttGROUPS; - if (IsWindow (GetDlgItem (hDlg, IDC_MACHINES_LIST))) - return ttMACHINES; - return ttUSERS; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL Display_HandleColumnNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp, LPVIEWINFO pvi) -{ - if (msg == WM_NOTIFY) - { - HWND hList = GetDlgItem (hDlg, ((LPNMHDR)lp)->idFrom); - if (fIsFastList (hList)) - { - switch (((LPNMHDR)lp)->code) - { - case FLN_COLUMNRESIZE: - FL_StoreView (hList, pvi); - return TRUE; - - case FLN_COLUMNCLICK: - LPFLN_COLUMNCLICK_PARAMS pp = (LPFLN_COLUMNCLICK_PARAMS)lp; - - int iCol; - BOOL fRev; - FastList_GetSortStyle (hList, &iCol, &fRev); - - if (iCol == pp->icol) - FastList_SetSortStyle (hList, iCol, !fRev); - else - FastList_SetSortStyle (hList, pp->icol, FALSE); - - FL_StoreView (hList, pvi); - return TRUE; - } - } - } - - return FALSE; -} - - -BOOL CALLBACK Display_GetItemText (HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie) -{ - LPVIEWINFO lpvi = (LPVIEWINFO)dwCookie; - ASID idObject = (ASID)(pfln->item.lParam); - - pfln->item.pszText[0] = TEXT('\0'); - - if ((idObject) && (pfln->item.icol < (int)lpvi->nColsShown)) - { - size_t iCol = lpvi->aColumns[ pfln->item.icol ]; - - if (lpvi == &gr.viewUsr) - { - User_GetColumn (idObject, (USERCOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL); - } - else if (lpvi == &gr.viewGrp) - { - Group_GetColumn (idObject, (GROUPCOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL); - } - else if (lpvi == &gr.viewMch) - { - Machine_GetColumn (idObject, (MACHINECOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL); - } - } - - return TRUE; -} - - -void Display_GetImageIcons (DWORD dwStyle, ICONVIEW iv, ASID idObject, int iImageNormal, int iImageAlert, int *piFirstImage, int *piSecondImage) -{ - BOOL fAlert = FALSE; - - if ((dwStyle & FLS_VIEW_MASK) != FLS_VIEW_LIST) - iv = ivONEICON; - - switch (iv) - { - case ivTWOICONS: - *piFirstImage = iImageNormal; - *piSecondImage = (fAlert) ? iImageAlert : IMAGE_BLANKIMAGE; - break; - - case ivONEICON: - *piFirstImage = (fAlert) ? iImageAlert : iImageNormal; - *piSecondImage = IMAGE_NOIMAGE; - break; - - case ivSTATUS: - *piFirstImage = (fAlert) ? iImageAlert : IMAGE_BLANKIMAGE; - *piSecondImage = IMAGE_NOIMAGE; - break; - } -} - diff --git a/src/WINNT/afsusrmgr/display.h b/src/WINNT/afsusrmgr/display.h deleted file mode 100644 index 2f7c11c8d..000000000 --- a/src/WINNT/afsusrmgr/display.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef DISPLAY_H -#define DISPLAY_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - ttUSERS, - ttGROUPS, - ttMACHINES - } TABTYPE; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Display_StartWorking (void); -void Display_StopWorking (void); - -void Display_PopulateList (void); -void Display_PopulateUserList (void); -void Display_PopulateGroupList (void); -void Display_PopulateMachineList (void); - -void Display_OnEndTask_UpdUsers (LPTASKPACKET ptp); -void Display_OnEndTask_UpdGroups (LPTASKPACKET ptp); -void Display_OnEndTask_UpdMachines (LPTASKPACKET ptp); - -void Display_RefreshView (LPVIEWINFO lpviNew, ICONVIEW ivNew); -void Display_RefreshView_Fast (void); - -void Display_SelectAll (void); -LPASIDLIST Display_GetSelectedList (void); -size_t Display_GetSelectedCount (void); -TABTYPE Display_GetActiveTab (void); - -BOOL Display_HandleColumnNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp, LPVIEWINFO pvi); -BOOL CALLBACK Display_GetItemText (HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie); -void Display_GetImageIcons (DWORD dwStyle, ICONVIEW iv, ASID idObject, int iImageNormal, int iImageAlert, int *piFirstImage, int *piSecondImage); - - -#endif - diff --git a/src/WINNT/afsusrmgr/errdata.cpp b/src/WINNT/afsusrmgr/errdata.cpp deleted file mode 100644 index 77d69cf6d..000000000 --- a/src/WINNT/afsusrmgr/errdata.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPERRORDATA ED_Create (int idsSingle, int idsMultiple) -{ - LPERRORDATA ped = New (ERRORDATA); - memset (ped, 0x00, sizeof(ERRORDATA)); - ped->idsSingle = idsSingle; - ped->idsMultiple = idsMultiple; - return ped; -} - - -void ED_Free (LPERRORDATA ped) -{ - if (ped) - { - if (ped->pAsidList) - asc_AsidListFree (&ped->pAsidList); - Delete (ped); - } -} - - -void ED_RegisterStatus (LPERRORDATA ped, ASID idObject, BOOL fSuccess, ULONG status) -{ - if (!fSuccess) - { - if (!ped->pAsidList) - asc_AsidListCreate (&ped->pAsidList); - if (!asc_AsidListTest (&ped->pAsidList, idObject)) - asc_AsidListAddEntry (&ped->pAsidList, idObject, status); - if (!ped->status) - ped->status = status; - ped->cFailures ++; - } -} - - -ULONG ED_GetFinalStatus (LPERRORDATA ped) -{ - return (ped->cFailures) ? ped->status : 0; -} - - -void ED_ShowErrorDialog (LPERRORDATA ped) -{ - if (ped->pAsidList) - { - LPTSTR pszNames = CreateNameList (ped->pAsidList); - - if (ped->pAsidList->cEntries == 1) - { - if (!pszNames) - ErrorDialog (ped->status, ped->idsSingle, TEXT("%m"), IDS_UNKNOWN_NAME); - else - ErrorDialog (ped->status, ped->idsSingle, TEXT("%s"), pszNames); - } - else if (ped->pAsidList->cEntries > 1) - { - if (!pszNames) - ErrorDialog (ped->status, ped->idsMultiple, TEXT("%m"), IDS_UNKNOWN_NAME); - else - ErrorDialog (ped->status, ped->idsMultiple, TEXT("%s"), pszNames); - } - - FreeString (pszNames); - } -} - diff --git a/src/WINNT/afsusrmgr/errdata.h b/src/WINNT/afsusrmgr/errdata.h deleted file mode 100644 index 692209a5f..000000000 --- a/src/WINNT/afsusrmgr/errdata.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef ERRDATA_H -#define ERRDATA_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -typedef struct - { - size_t cFailures; - LPASIDLIST pAsidList; - ULONG status; - int idsSingle; - int idsMultiple; - } ERRORDATA, *LPERRORDATA; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -LPERRORDATA ED_Create (int idsSingle, int idsMultiple); -void ED_Free (LPERRORDATA ped); -void ED_RegisterStatus (LPERRORDATA ped, ASID idObject, BOOL fSuccess, ULONG status); -ULONG ED_GetFinalStatus (LPERRORDATA ped); -void ED_ShowErrorDialog (LPERRORDATA ped); - - -#endif - diff --git a/src/WINNT/afsusrmgr/general.cpp b/src/WINNT/afsusrmgr/general.cpp deleted file mode 100644 index 4032b2180..000000000 --- a/src/WINNT/afsusrmgr/general.cpp +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_col.h" -#include "grp_col.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL fIsValidDate (LPSYSTEMTIME pst) -{ - return (pst->wYear >= 1971) ? TRUE : FALSE; -} - - -void FormatElapsedSeconds (LPTSTR pszText, LONG csec) -{ - LPTSTR pszTarget = pszText; - - if (csec >= csec1WEEK) - { - if (pszTarget != pszText) - *pszTarget++ = TEXT(' '); - LPTSTR psz = FormatString (IDS_COUNT_WEEKS, TEXT("%lu"), csec / csec1WEEK); - csec %= csec1WEEK; - lstrcpy (pszTarget, psz); - pszTarget += lstrlen(pszTarget); - FreeString (psz); - } - - if (csec >= csec1DAY) - { - if (pszTarget != pszText) - *pszTarget++ = TEXT(' '); - LPTSTR psz = FormatString (IDS_COUNT_DAYS, TEXT("%lu"), csec / csec1DAY); - csec %= csec1DAY; - lstrcpy (pszTarget, psz); - pszTarget += lstrlen(pszTarget); - FreeString (psz); - } - - if (csec >= csec1HOUR) - { - if (pszTarget != pszText) - *pszTarget++ = TEXT(' '); - LPTSTR psz = FormatString (IDS_COUNT_HOURS, TEXT("%lu"), csec / csec1HOUR); - csec %= csec1HOUR; - lstrcpy (pszTarget, psz); - pszTarget += lstrlen(pszTarget); - FreeString (psz); - } - - if (csec >= csec1MINUTE) - { - if (pszTarget != pszText) - *pszTarget++ = TEXT(' '); - LPTSTR psz = FormatString (IDS_COUNT_MINUTES, TEXT("%lu"), csec / csec1MINUTE); - csec %= csec1MINUTE; - lstrcpy (pszTarget, psz); - pszTarget += lstrlen(pszTarget); - FreeString (psz); - } - - if (csec || (pszTarget == pszText)) - { - if (pszTarget != pszText) - *pszTarget++ = TEXT(' '); - LPTSTR psz = FormatString (IDS_COUNT_SECONDS, TEXT("%lu"), csec); - lstrcpy (pszTarget, psz); - pszTarget += lstrlen(pszTarget); - FreeString (psz); - } - - *pszTarget = TEXT('\0'); -} - - -LPTSTR CreateNameList (LPASIDLIST pAsidList, int idsHeader) -{ - LPTSTR pszOut; - if (idsHeader) - pszOut = FormatString (TEXT("%1"), TEXT("%m"), idsHeader); - else - pszOut = NULL; - - for (size_t ii = 0; ii < pAsidList->cEntries; ++ii) - { - ULONG status; - TCHAR szName[ cchRESOURCE ]; - if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, szName, &status)) - continue; - - static TCHAR szSeparator[ cchRESOURCE ] = TEXT(""); - if (szSeparator[0] == TEXT('\0')) - { - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SLIST, szSeparator, cchRESOURCE)) - lstrcpy (szSeparator, TEXT(",")); - lstrcat (szSeparator, TEXT(" ")); - } - - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pAsidList->aEntries[ ii ].idObject, &Properties, &status)) - { - if (Properties.Type == TYPE_USER) - AppendUID (szName, Properties.u.UserProperties.PTSINFO.uidName); - else if (Properties.Type == TYPE_GROUP) - AppendUID (szName, Properties.u.GroupProperties.uidName); - } - - LPTSTR pszNext; - if (!pszOut) - pszNext = FormatString (TEXT("%1"), TEXT("%s"), szName); - else if (ii == 0) - pszNext = FormatString (TEXT("%1%2"), TEXT("%s%s"), pszOut, szName); - else // (pszOut && ii) - pszNext = FormatString (TEXT("%1%2%3"), TEXT("%s%s%s"), pszOut, szSeparator, szName); - - if (pszOut) - FreeString (pszOut); - pszOut = pszNext; - } - - return pszOut; -} - - -void GetLocalSystemTime (LPSYSTEMTIME pst) -{ - SYSTEMTIME st_gmt; - GetSystemTime (&st_gmt); - - FILETIME ft_gmt; - SystemTimeToFileTime (&st_gmt, &ft_gmt); - - FILETIME ft_local; - FileTimeToLocalFileTime (&ft_gmt, &ft_local); - - FileTimeToSystemTime (&ft_local, pst); -} - - -void FormatServerKey (LPTSTR psz, PBYTE pKey) -{ - for (size_t ii = 0; ii < ENCRYPTIONKEYLENGTH; ++ii) - { - if (pKey[ii]) - break; - } - if (ii == ENCRYPTIONKEYLENGTH) - { - GetString (psz, IDS_USER_KEY_HIDDEN); - return; - } - - for (ii = 0; ii < ENCRYPTIONKEYLENGTH; ++ii) - { - WORD ch1 = (WORD)(pKey[ii]) / 64; - WORD ch2 = ((WORD)(pKey[ii]) - (ch1 * 64)) / 8; - WORD ch3 = ((WORD)(pKey[ii]) - (ch1 * 64) - (ch2 * 8)); - wsprintf (psz, TEXT("\\%0d%0d%0d"), ch1, ch2, ch3); - psz += 4; - } - - *psz = TEXT('\0'); -} - - -BOOL ScanServerKey (PBYTE pKey, LPTSTR psz) -{ - for (size_t ich = 0; psz && *psz; ) - { - if (ich == ENCRYPTIONKEYLENGTH) - return FALSE; - - if (*psz != '\\') - { - pKey[ ich++ ] = (BYTE)*psz++; - continue; - } - - if ((lstrlen(psz) < 4) || (!isdigit(*(1+psz)))) - return FALSE; - - ++psz; // skip the backslash - WORD ch1 = (WORD)((*psz++) - TEXT('0')); - WORD ch2 = (WORD)((*psz++) - TEXT('0')); - WORD ch3 = (WORD)((*psz++) - TEXT('0')); - pKey[ ich++ ] = (BYTE)( ch1 * 64 + ch2 * 8 + ch3 ); - } - - return (ich == ENCRYPTIONKEYLENGTH) ? TRUE : FALSE; -} - - -int CALLBACK General_ListSortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - // Find out what kind of sort we're performing. To speed things up, - // we'll only gather this information when we start a sort - // - static TABTYPE tt; - static int iCol; - static BOOL fReverse; - static COLUMNTYPE ct; - static GetColumnFunction fnGetColumn = NULL; - if (!hItem1 || !hItem2) - { - switch (GetWindowLong (hList, GWL_ID)) - { - case IDC_USERS_LIST: - tt = ttUSERS; - break; - case IDC_GROUPS_LIST: - tt = ttGROUPS; - break; - default: - return 0; - } - - size_t iColumn; - FastList_GetSortStyle (hList, &iColumn, &fReverse); - - switch (tt) - { - case ttUSERS: - iCol = gr.viewUsr.aColumns[ iColumn ]; - fnGetColumn = (GetColumnFunction)User_GetColumn; - break; - case ttGROUPS: - iCol = gr.viewGrp.aColumns[ iColumn ]; - fnGetColumn = (GetColumnFunction)Group_GetColumn; - break; - } - - if (fnGetColumn) - (*fnGetColumn)(g.idCell, iCol, NULL, NULL, NULL, &ct); - return 0; - } - - if (!fnGetColumn) - return 0; - - // Perform the sort - // - TCHAR szTextA[ 1024 ]; - TCHAR szTextB[ 1024 ]; - FILETIME ftTextA = { 0, 0 }; - FILETIME ftTextB = { 0, 0 }; - - ASID idItem1 = (ASID)( (fReverse) ? lpItem2 : lpItem1 ); - ASID idItem2 = (ASID)( (fReverse) ? lpItem1 : lpItem2 ); - - switch (ct) - { - case ctALPHABETIC: - (*fnGetColumn)(idItem1, iCol, szTextA, NULL, NULL, NULL); - (*fnGetColumn)(idItem2, iCol, szTextB, NULL, NULL, NULL); - return lstrcmpi (szTextA, szTextB); - - case ctNUMERIC: - (*fnGetColumn)(idItem1, iCol, szTextA, NULL, NULL, NULL); - (*fnGetColumn)(idItem2, iCol, szTextB, NULL, NULL, NULL); - return atol(szTextA) - atol(szTextB); - - case ctDATE: - SYSTEMTIME stTextA; - SYSTEMTIME stTextB; - (*fnGetColumn)(idItem1, iCol, NULL, &stTextA, NULL, NULL); - (*fnGetColumn)(idItem2, iCol, NULL, &stTextB, NULL, NULL); - SystemTimeToFileTime (&stTextA, &ftTextA); - SystemTimeToFileTime (&stTextB, &ftTextB); - return CompareFileTime (&ftTextA, &ftTextB); - - case ctELAPSED: - LONG csecTextA; - LONG csecTextB; - (*fnGetColumn)(idItem1, iCol, NULL, NULL, &csecTextA, NULL); - (*fnGetColumn)(idItem2, iCol, NULL, NULL, &csecTextB, NULL); - return csecTextA - csecTextB; - } - - return 0; -} - - -void AppendUID (LPTSTR psz, int uid) -{ - if (uid != 0) - wsprintf (&psz[ lstrlen(psz) ], TEXT(" (%ld)"), uid); -} - - -LPTSTR GetEditText (HWND hEdit) -{ - size_t cch = 1 + SendMessage (hEdit, EM_LINELENGTH, 0, 0); - LPTSTR psz = AllocateString (cch); - cch = GetWindowText (hEdit, psz, cch); - psz[cch] = TEXT('\0'); - return psz; -} - - -BOOL fIsMachineAccount (ASID idAccount) -{ - TCHAR szName[ cchNAME ]; - if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, idAccount, szName)) - return FALSE; - return fIsMachineAccount (szName); -} - - -BOOL fIsMachineAccount (LPTSTR pszName) -{ - for ( ; pszName && *pszName; ++pszName) - { - if (!( (*pszName == TEXT('.')) || ((*pszName >= TEXT('0')) && (*pszName <= TEXT('9'))) )) - return FALSE; - } - - return TRUE; -} - diff --git a/src/WINNT/afsusrmgr/general.h b/src/WINNT/afsusrmgr/general.h deleted file mode 100644 index 45bd9f6a9..000000000 --- a/src/WINNT/afsusrmgr/general.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GENERAL_H -#define GENERAL_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - ctALPHABETIC, - ctNUMERIC, - ctDATE, - ctELAPSED - } COLUMNTYPE; - -typedef BOOL (*GetColumnFunction)(ASID idObject, LONG iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType); - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL fIsValidDate (LPSYSTEMTIME pst); - -void FormatElapsedSeconds (LPTSTR pszText, LONG csec); - -LPTSTR CreateNameList (LPASIDLIST pAsidList, int idsHeader = 0); - -void GetLocalSystemTime (LPSYSTEMTIME pst); - -void FormatServerKey (LPTSTR psz, PBYTE pKey); -BOOL ScanServerKey (PBYTE pKey, LPTSTR psz); - -int CALLBACK General_ListSortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2); - -void AppendUID (LPTSTR psz, int uid); - -LPTSTR GetEditText (HWND hEdit); - -BOOL fIsMachineAccount (ASID idAccount); -BOOL fIsMachineAccount (LPTSTR pszName); - - -#endif - diff --git a/src/WINNT/afsusrmgr/grp_col.cpp b/src/WINNT/afsusrmgr/grp_col.cpp deleted file mode 100644 index b16ca662e..000000000 --- a/src/WINNT/afsusrmgr/grp_col.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "grp_col.h" - - -/* - * GROUP-VIEW COLUMNS _________________________________________________________ - * - */ - -void Group_SetDefaultView (LPVIEWINFO lpvi, ICONVIEW *piv) -{ - lpvi->lvsView = FLS_VIEW_SMALL; - lpvi->nColsAvail = nGROUPCOLUMNS; - - for (size_t iCol = 0; iCol < nGROUPCOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = GROUPCOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = GROUPCOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = grpcolNAME; - - lpvi->nColsShown = 3; - lpvi->aColumns[0] = (int)grpcolNAME; - lpvi->aColumns[1] = (int)grpcolUID; - lpvi->aColumns[2] = (int)grpcolCMEMBERS; - - *piv = ivSTATUS; -} - - -void Group_GetColumn (ASID idObject, GROUPCOLUMN iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType) -{ - if (pszText) - *pszText = TEXT('\0'); - if (pstDate) - memset (pstDate, 0x00, sizeof(SYSTEMTIME)); - if (pcsec) - *pcsec = 0; - if (pcType) - *pcType = ctALPHABETIC; - - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idObject, &Properties)) - { - switch (iCol) - { - case grpcolNAME: - if (pcType) - *pcType = ctALPHABETIC; - if (pszText) - lstrcpy (pszText, Properties.szName); - break; - - case grpcolCMEMBERS: - if (pcType) - *pcType = ctNUMERIC; - if (pszText) - wsprintf (pszText, TEXT("%lu"), Properties.u.GroupProperties.nMembers); - break; - - case grpcolUID: - if (pcType) - *pcType = ctNUMERIC; - if (pszText) - wsprintf (pszText, TEXT("%ld"), Properties.u.GroupProperties.uidName); - break; - - case grpcolOWNER: - if (pcType) - *pcType = ctALPHABETIC; - if (pszText) - { - if (Properties.u.GroupProperties.szOwner[0]) - wsprintf (pszText, TEXT("%s (%ld)"), Properties.u.GroupProperties.szOwner, Properties.u.GroupProperties.uidOwner); - else - wsprintf (pszText, TEXT("%ld"), Properties.u.GroupProperties.uidOwner); - } - break; - - case grpcolCREATOR: - if (pcType) - *pcType = ctALPHABETIC; - if (pszText) - { - if (Properties.u.GroupProperties.szCreator[0]) - wsprintf (pszText, TEXT("%s (%ld)"), Properties.u.GroupProperties.szCreator, Properties.u.GroupProperties.uidCreator); - else - wsprintf (pszText, TEXT("%ld"), Properties.u.GroupProperties.uidCreator); - } - break; - } - } -} - diff --git a/src/WINNT/afsusrmgr/grp_col.h b/src/WINNT/afsusrmgr/grp_col.h deleted file mode 100644 index ed10c7f72..000000000 --- a/src/WINNT/afsusrmgr/grp_col.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GRP_COL_H -#define GRP_COL_H - -#include "display.h" - - -/* - * GROUPLIST COLUMNS __________________________________________________________ - * - */ - -typedef enum - { - grpcolNAME, - grpcolCMEMBERS, - grpcolUID, - grpcolOWNER, - grpcolCREATOR, - } GROUPCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -GROUPCOLUMNS[] = - { - { IDS_GRPCOL_NAME, 100 }, // grpcolNAME - { IDS_GRPCOL_CMEMBERS, 50 | COLUMN_RIGHTJUST }, // grpcolCMEMBERS - { IDS_GRPCOL_UID, 50 | COLUMN_RIGHTJUST }, // grpcolUID - { IDS_GRPCOL_OWNER, 100 }, // grpcolOWNER - { IDS_GRPCOL_CREATOR, 100 }, // grpcolCREATOR - }; - -#define nGROUPCOLUMNS (sizeof(GROUPCOLUMNS)/sizeof(GROUPCOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Group_SetDefaultView (LPVIEWINFO lpvi, ICONVIEW *piv); - -void Group_GetColumn (ASID idObject, GROUPCOLUMN iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType); - - -#endif - diff --git a/src/WINNT/afsusrmgr/grp_create.cpp b/src/WINNT/afsusrmgr/grp_create.cpp deleted file mode 100644 index 033654d5a..000000000 --- a/src/WINNT/afsusrmgr/grp_create.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "grp_prop.h" -#include "grp_create.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - GROUPPROPINFO Advanced; - } CREATEGROUPDLG, *LPCREATEGROUPDLG; - -#define UID_AUTOSELECT ((int)0) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Group_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Group_Create_OnInitDialog (HWND hDlg); -void Group_Create_OnNames (HWND hDlg); -void Group_Create_OnID (HWND hDlg); -void Group_Create_OnAdvanced (HWND hDlg); -BOOL Group_Create_OnOK (HWND hDlg); -void Group_Create_OnEndTask_ObjectGet (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Group_SetDefaultCreateParams (LPGROUPPROPINFO lpp) -{ - memset (lpp, 0x00, sizeof(GROUPPROPINFO)); - lpp->aaStatus = aaANYONE; - lpp->fStatus_Mixed = FALSE; - lpp->aaGroups = aaANYONE; - lpp->fGroups_Mixed = FALSE; - lpp->aaMembers = aaANYONE; - lpp->fMembers_Mixed = FALSE; - lpp->aaAdd = aaGROUP_ONLY; - lpp->fAdd_Mixed = FALSE; - lpp->aaRemove = aaGROUP_ONLY; - lpp->fRemove_Mixed = FALSE; - lstrcpy (lpp->szOwner, TEXT("")); - lpp->fOwner_Mixed = FALSE; - lstrcpy (lpp->szCreator, TEXT("")); - lpp->fCreator_Mixed = FALSE; -} - - -void Group_ShowCreate (HWND hParent) -{ - LPCREATEGROUPDLG lpp = New (CREATEGROUPDLG); - memset (lpp, 0x00, sizeof(CREATEGROUPDLG)); - memcpy (&lpp->Advanced, &gr.CreateGroup, sizeof(GROUPPROPINFO)); - lpp->Advanced.pMembers = NULL; - lpp->Advanced.pGroupsOwner = NULL; - - (void)ModalDialogParam (IDD_NEWGROUP, hParent, (DLGPROC)Group_Create_DlgProc, (LPARAM)lpp); - - if (lpp->Advanced.pMembers) - asc_AsidListFree (&lpp->Advanced.pMembers); - if (lpp->Advanced.pGroupsOwner) - asc_AsidListFree (&lpp->Advanced.pGroupsOwner); - Delete (lpp); -} - - -BOOL CALLBACK Group_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_NEWGROUP, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Group_Create_OnInitDialog (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskOBJECT_GET) - Group_Create_OnEndTask_ObjectGet (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (Group_Create_OnOK (hDlg)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_ADVANCED: - Group_Create_OnAdvanced (hDlg); - break; - - case IDC_NEWGROUP_NAME: - Group_Create_OnNames (hDlg); - break; - - case IDC_NEWGROUP_ID_AUTO: - case IDC_NEWGROUP_ID_MANUAL: - Group_Create_OnID (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Group_Create_OnInitDialog (HWND hDlg) -{ - LPCREATEGROUPDLG lpp = (LPCREATEGROUPDLG)GetWindowLong (hDlg, DWL_USER); - - // Fix the title of the dialog - // - ULONG status; - TCHAR szName[ cchNAME ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szName, &status); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWGROUP_TITLE, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_NEWGROUP_TITLE, pszText); - FreeString (pszText); - - // Attach a spinner to the ID control - // - CheckDlgButton (hDlg, IDC_NEWGROUP_ID_AUTO, TRUE); - CreateSpinner (GetDlgItem (hDlg, IDC_NEWGROUP_ID), 10, TRUE, -0x7FFFFFFF, -1, -1); - Group_Create_OnID (hDlg); - - StartTask (taskOBJECT_GET, hDlg, (PVOID)(g.idCell)); -} - - -void Group_Create_OnNames (HWND hDlg) -{ - TCHAR szSeparators[ cchRESOURCE ]; - GetString (szSeparators, IDS_SEPARATORS); - lstrcat (szSeparators, TEXT(" \t")); - - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_NEWGROUP_NAME)); - EnableWindow (GetDlgItem (hDlg, IDOK), (pszNames && *pszNames)); - - BOOL fMultiple = FALSE; - for (LPTSTR psz = pszNames; !fMultiple && psz && *psz; ++psz) - { - if (lstrchr (szSeparators, *psz)) - fMultiple = TRUE; - } - FreeString (pszNames); - - EnableWindow (GetDlgItem (hDlg, IDC_NEWGROUP_ID_AUTO), !fMultiple); - EnableWindow (GetDlgItem (hDlg, IDC_NEWGROUP_ID_MANUAL), !fMultiple); - if (fMultiple) - { - CheckDlgButton (hDlg, IDC_NEWGROUP_ID_AUTO, TRUE); - CheckDlgButton (hDlg, IDC_NEWGROUP_ID_MANUAL, FALSE); - Group_Create_OnID (hDlg); - } -} - - -void Group_Create_OnID (HWND hDlg) -{ - BOOL fEnable = IsDlgButtonChecked (hDlg, IDC_NEWGROUP_ID_MANUAL); - EnableWindow (GetDlgItem (hDlg, IDC_NEWGROUP_ID), fEnable); -} - - -void Group_Create_OnAdvanced (HWND hDlg) -{ - LPCREATEGROUPDLG lpp = (LPCREATEGROUPDLG)GetWindowLong (hDlg, DWL_USER); - lpp->Advanced.pGroupList = NULL; - lpp->Advanced.fDeleteMeOnClose = FALSE; - lpp->Advanced.fShowModal = TRUE; - lpp->Advanced.hParent = hDlg; - lpp->Advanced.fApplyGeneral = FALSE; - Group_ShowProperties (&lpp->Advanced, gptMEMBERS); -} - - -BOOL Group_Create_OnOK (HWND hDlg) -{ - LPCREATEGROUPDLG lpp = (LPCREATEGROUPDLG)GetWindowLong (hDlg, DWL_USER); - - // Start a background task to do all the work. - // - LPGROUP_CREATE_PARAMS pTask = New (GROUP_CREATE_PARAMS); - memset (pTask, 0x00, sizeof(GROUP_CREATE_PARAMS)); - - if (IsDlgButtonChecked (hDlg, IDC_NEWGROUP_ID_AUTO)) - pTask->idGroup = UID_AUTOSELECT; - else // (IsDlgButtonChecked (hDlg, IDC_NEWGROUP_ID_MANUAL)) - pTask->idGroup = SP_GetPos (GetDlgItem (hDlg, IDC_NEWGROUP_ID)); - - lstrcpy (pTask->Properties.szOwner, lpp->Advanced.szOwner); - - pTask->Properties.aaListStatus = lpp->Advanced.aaStatus; - pTask->Properties.aaListGroupsOwned = lpp->Advanced.aaGroups; - pTask->Properties.aaListMembers = lpp->Advanced.aaMembers; - pTask->Properties.aaAddMember = lpp->Advanced.aaAdd; - pTask->Properties.aaDeleteMember = lpp->Advanced.aaRemove; - - if (lpp->Advanced.pMembers) - asc_AsidListCopy (&pTask->pMembers, &lpp->Advanced.pMembers); - else - pTask->pMembers = NULL; - - if (lpp->Advanced.pGroupsOwner) - asc_AsidListCopy (&pTask->pGroupsOwner, &lpp->Advanced.pGroupsOwner); - else - pTask->pGroupsOwner = NULL; - - // Crack the specified list of user names into a multi-string - // - TCHAR szSeparators[ cchRESOURCE ]; - GetString (szSeparators, IDS_SEPARATORS); - lstrcat (szSeparators, TEXT(" \t")); - - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_NEWGROUP_NAME)); - LPCTSTR pszStart = pszNames; - while (lstrchr (szSeparators, *pszStart)) - ++pszStart; - - while (*pszStart) - { - // Find the first non-name character - // - LPCTSTR pszEnd = pszStart; - while (*pszEnd && !lstrchr(szSeparators, *pszEnd)) - ++pszEnd; - - // Copy off this particular name - // - TCHAR szName[ cchNAME ]; - lstrcpy (szName, pszStart); - szName[ pszEnd - pszStart ] = TEXT('\0'); - - if (szName[0]) - FormatMultiString (&pTask->mszNames, FALSE, TEXT("%1"), TEXT("%s"), szName); - - // Find the next valid-name character - // - pszStart = pszEnd; - while (lstrchr(szSeparators, *pszStart)) - ++pszStart; - } - FreeString (pszNames); - - // Do the real work of creating the user(s) - // - StartTask (taskGROUP_CREATE, NULL, pTask); - - // Store these creation parameters as the new defaults - // - memcpy (&gr.CreateGroup, &lpp->Advanced, sizeof(GROUPPROPINFO)); - return TRUE; -} - - -void Group_Create_OnEndTask_ObjectGet (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWGROUP_ID_AUTO, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (TEXT("%1 (%2)"), TEXT("%s%ld"), szText, TASKDATA(ptp)->Properties.u.CellProperties.idGroupMax-1); - SetDlgItemText (hDlg, IDC_NEWGROUP_ID_AUTO, pszText); - FreeString (pszText); - - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_NEWGROUP_ID))) - SP_SetPos (GetDlgItem (hDlg, IDC_NEWGROUP_ID), TASKDATA(ptp)->Properties.u.CellProperties.idGroupMax-1); - } -} - diff --git a/src/WINNT/afsusrmgr/grp_create.h b/src/WINNT/afsusrmgr/grp_create.h deleted file mode 100644 index 6bbb3111c..000000000 --- a/src/WINNT/afsusrmgr/grp_create.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GRP_CREATE_H -#define GRP_CREATE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Group_SetDefaultCreateParams (LPGROUPPROPINFO lpp); - -void Group_ShowCreate (HWND hParent); - - -#endif - diff --git a/src/WINNT/afsusrmgr/grp_delete.cpp b/src/WINNT/afsusrmgr/grp_delete.cpp deleted file mode 100644 index 066e87270..000000000 --- a/src/WINNT/afsusrmgr/grp_delete.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "grp_delete.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Group_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Group_Delete_OnInitDialog (HWND hDlg); -void Group_Delete_OnDestroy (HWND hDlg); -void Group_Delete_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Group_ShowDelete (LPASIDLIST pGroupList) -{ - ModalDialogParam (IDD_GROUP_DELETE, g.hMain, (DLGPROC)Group_Delete_DlgProc, (LPARAM)pGroupList); -} - - -BOOL CALLBACK Group_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_GROUP_DELETE, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Group_Delete_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - Group_Delete_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Group_Delete_OnOK (hDlg); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - } - break; - } - - return FALSE; -} - - -void Group_Delete_OnInitDialog (HWND hDlg) -{ - LPASIDLIST pGroupList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - - // Fix the title of the dialog - // - if (pGroupList->cEntries == 1) - { - ULONG status; - TCHAR szName[ cchNAME ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, pGroupList->aEntries[0].idObject, szName, &status); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_DELETE_TITLE, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_DELETE_TITLE, pszText); - FreeString (pszText); - } - else - { - LPTSTR pszNames = CreateNameList (pGroupList); - - LPTSTR pszText = FormatString (IDS_GROUP_DELETE_MULTIPLE, TEXT("%s"), pszNames); - SetDlgItemText (hDlg, IDC_DELETE_TITLE, pszText); - FreeString (pszText); - - FreeString (pszNames); - } -} - - -void Group_Delete_OnDestroy (HWND hDlg) -{ - LPASIDLIST pGroupList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - asc_AsidListFree (&pGroupList); -} - - -void Group_Delete_OnOK (HWND hDlg) -{ - LPASIDLIST pGroupList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - - // Start a background task to do all the work. - // - LPASIDLIST pTask; - asc_AsidListCopy (&pTask, &pGroupList); - StartTask (taskGROUP_DELETE, NULL, pTask); -} - diff --git a/src/WINNT/afsusrmgr/grp_delete.h b/src/WINNT/afsusrmgr/grp_delete.h deleted file mode 100644 index e5227f027..000000000 --- a/src/WINNT/afsusrmgr/grp_delete.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GRP_DELETE_H -#define GRP_DELETE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Group_ShowDelete (LPASIDLIST pGroupList); - - -#endif - diff --git a/src/WINNT/afsusrmgr/grp_prop.cpp b/src/WINNT/afsusrmgr/grp_prop.cpp deleted file mode 100644 index dabcb69b7..000000000 --- a/src/WINNT/afsusrmgr/grp_prop.cpp +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "grp_prop.h" -#include "usr_col.h" -#include "winlist.h" -#include "browse.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define GWD_ASIDLIST_MEMBER TEXT("AsidList - Members") -#define GWD_ASIDLIST_OWNER TEXT("AsidList - Owned") - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK GroupProp_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void GroupProp_General_OnInitDialog (HWND hDlg); -void GroupProp_General_OnDestroy (HWND hDlg); -void GroupProp_General_OnApply (HWND hDlg); -void GroupProp_General_OnBrowse (HWND hDlg); -void GroupProp_General_UpdateDialog (HWND hDlg); -void GroupProp_General_UpdateDialog_Perm (HWND hDlg, int idc, ACCOUNTACCESS aa, BOOL fMixed); - -BOOL CALLBACK GroupProp_Member_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void GroupProp_Member_OnInitDialog (HWND hDlg); -void GroupProp_Member_OnDestroy (HWND hDlg); -void GroupProp_Member_OnShowType (HWND hDlg); -void GroupProp_Member_OnSelect (HWND hDlg); -void GroupProp_Member_OnApply (HWND hDlg); -void GroupProp_Member_OnAdd (HWND hDlg); -void GroupProp_Member_OnRemove (HWND hDlg); -void GroupProp_Member_OnEndTask_GetMembers (HWND hDlg, LPTASKPACKET ptp); -void GroupProp_Member_OnEndTask_GetOwned (HWND hDlg, LPTASKPACKET ptp); -void GroupProp_Member_PopulateList (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Group_FreeProperties (LPGROUPPROPINFO lpp) -{ - if (lpp) - { - if (lpp->fApplyGeneral && lpp->pGroupList) - { - for (size_t ii = 0; ii < lpp->pGroupList->cEntries; ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pGroupList->aEntries[ ii ].idObject, &Properties, &status)) - continue; - - LPGROUP_CHANGE_PARAMS pTask = New (GROUP_CHANGE_PARAMS); - memset (pTask, 0x00, sizeof(GROUP_CHANGE_PARAMS)); - pTask->idGroup = lpp->pGroupList->aEntries[ ii ].idObject; - - // From General tab: - - if (!lpp->fApplyGeneral || lpp->fStatus_Mixed) - pTask->NewProperties.aaListStatus = Properties.u.GroupProperties.aaListStatus; - else - pTask->NewProperties.aaListStatus = lpp->aaStatus; - - if (!lpp->fApplyGeneral || lpp->fGroups_Mixed) - pTask->NewProperties.aaListGroupsOwned = Properties.u.GroupProperties.aaListGroupsOwned; - else - pTask->NewProperties.aaListGroupsOwned = lpp->aaGroups; - - if (!lpp->fApplyGeneral || lpp->fMembers_Mixed) - pTask->NewProperties.aaListMembers = Properties.u.GroupProperties.aaListMembers; - else - pTask->NewProperties.aaListMembers = lpp->aaMembers; - - if (!lpp->fApplyGeneral || lpp->fAdd_Mixed) - pTask->NewProperties.aaAddMember = Properties.u.GroupProperties.aaAddMember; - else - pTask->NewProperties.aaAddMember = lpp->aaAdd; - - if (!lpp->fApplyGeneral || lpp->fRemove_Mixed) - pTask->NewProperties.aaDeleteMember = Properties.u.GroupProperties.aaDeleteMember; - else - pTask->NewProperties.aaDeleteMember = lpp->aaRemove; - - if (!lpp->fApplyGeneral || lpp->fOwner_Mixed) - lstrcpy (pTask->NewProperties.szOwner, Properties.u.GroupProperties.szOwner); - else - lstrcpy (pTask->NewProperties.szOwner, lpp->szOwner); - - StartTask (taskGROUP_CHANGE, NULL, pTask); - } - } - - if (lpp->pMembers) - asc_AsidListFree (&lpp->pMembers); - if (lpp->pGroupsOwner) - asc_AsidListFree (&lpp->pGroupsOwner); - if (lpp->pGroupList) - asc_AsidListFree (&lpp->pGroupList); - memset (lpp, 0x00, sizeof(GROUPPROPINFO)); - Delete (lpp); - } -} - - -void Group_ShowProperties (LPASIDLIST pGroupList, GROUPPROPTAB gptTarget) -{ - LPGROUPPROPINFO lpp = New (GROUPPROPINFO); - memset (lpp, 0x00, sizeof(GROUPPROPINFO)); - lpp->pGroupList = pGroupList; - lpp->fDeleteMeOnClose = TRUE; - lpp->fShowModal = FALSE; - Group_ShowProperties (lpp, gptTarget); -} - - -void Group_ShowProperties (LPGROUPPROPINFO lpp, GROUPPROPTAB gptTarget) -{ - HWND hSheet = NULL; - - // If we've been asked to view properties for only one group, and there is - // already a window open for that group, switch to it. - // - if (lpp->pGroupList) - { - if (lpp->pGroupList->cEntries == 1) - { - ASID idGroup = lpp->pGroupList->aEntries[0].idObject; - - if ((hSheet = WindowList_Search (wltGROUP_PROPERTIES, idGroup)) != NULL) - { - SetForegroundWindow (hSheet); - if (gptTarget != gptANY) - { - HWND hTab = GetDlgItem (hSheet, IDC_PROPSHEET_TABCTRL); - int nTabs = TabCtrl_GetItemCount (hTab); - if (nTabs < nGROUPPROPTAB_MAX) - gptTarget = (GROUPPROPTAB)( ((int)gptTarget-1) ); - TabCtrl_SwitchToTab (hTab, gptTarget); - } - return; - } - } - - // Otherwise, make sure there are no Properties windows open for any - // of the selected groups - // - for (size_t iGroup = 0; iGroup < lpp->pGroupList->cEntries; ++iGroup) - { - ASID idGroup = lpp->pGroupList->aEntries[ iGroup ].idObject; - - // See if there's a Properties window open that is dedicated to - // this group - // - if ((hSheet = WindowList_Search (wltGROUP_PROPERTIES, idGroup)) != NULL) - { - ErrorDialog (0, IDS_ERROR_GROUP_MULTIPROP); - return; - } - - // See if there is a multiple-group properties window open; if so, - // test it to see if it covers this group - // - if ((hSheet = WindowList_Search (wltGROUP_PROPERTIES, 0)) != NULL) - { - LPGROUPPROPINFO pInfo = (LPGROUPPROPINFO)PropSheet_FindTabParam (hSheet); - if (pInfo && pInfo->pGroupList && asc_AsidListTest (&pInfo->pGroupList, idGroup)) - { - ErrorDialog (0, IDS_ERROR_GROUP_MULTIPROP); - return; - } - } - } - } - - // Okay, we're clear to create the new properties window. - // - LPTSTR pszTitle; - if (!lpp->pGroupList) - { - pszTitle = FormatString (IDS_NEWGROUP_PROPERTIES_TITLE); - } - else if (lpp->pGroupList->cEntries > 1) - { - pszTitle = FormatString (IDS_GROUP_PROPERTIES_TITLE_MULTIPLE); - } - else - { - TCHAR szGroup[ cchRESOURCE ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, lpp->pGroupList->aEntries[0].idObject, szGroup); - pszTitle = FormatString (IDS_GROUP_PROPERTIES_TITLE, TEXT("%s"), szGroup); - } - - LPPROPSHEET psh = PropSheet_Create (pszTitle, TRUE, NULL, (LPARAM)lpp); - PropSheet_AddTab (psh, 0, (lpp->pGroupList) ? IDD_GROUP_GENERAL : IDD_NEWGROUP_GENERAL, (DLGPROC)GroupProp_General_DlgProc, (LPARAM)lpp, TRUE, (gptTarget == gptGENERAL) ? TRUE : FALSE); - PropSheet_AddTab (psh, 0, (lpp->pGroupList) ? IDD_GROUP_MEMBER : IDD_NEWGROUP_MEMBER, (DLGPROC)GroupProp_Member_DlgProc, (LPARAM)lpp, TRUE, (gptTarget == gptMEMBERS) ? TRUE : FALSE); - - if (lpp->fShowModal) - PropSheet_ShowModal (psh, PumpMessage); - else - PropSheet_ShowModeless (psh, SW_SHOW); -} - - -BOOL CALLBACK GroupProp_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_GROUP_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - switch (msg) - { - case WM_INITDIALOG_SHEET: - if (lpp && lpp->pGroupList && !lpp->fShowModal) - { - if (lpp->pGroupList->cEntries == 1) - WindowList_Add (hDlg, wltGROUP_PROPERTIES, lpp->pGroupList->aEntries[0].idObject); - else // (lpp->pGroupList->cEntries > 1) - WindowList_Add (hDlg, wltGROUP_PROPERTIES, 0); - } - break; - - case WM_DESTROY_SHEET: - WindowList_Remove (hDlg); - if (lpp && lpp->fDeleteMeOnClose) - Group_FreeProperties (lpp); - break; - - case WM_INITDIALOG: - GroupProp_General_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - GroupProp_General_OnDestroy (hDlg); - break; - - case WM_ASC_NOTIFY_OBJECT: - GroupProp_General_UpdateDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - GroupProp_General_OnApply (hDlg); - break; - - case IDC_GROUP_CHANGEOWNER: - GroupProp_General_OnBrowse (hDlg); - break; - - case IDC_GROUP_PERM_STATUS: - case IDC_GROUP_PERM_GROUPS: - case IDC_GROUP_PERM_MEMBERS: - case IDC_GROUP_PERM_ADD: - case IDC_GROUP_PERM_REMOVE: - if (HIWORD(wp) == CBN_SELCHANGE) - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void GroupProp_General_OnInitDialog (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // Indicate we want to know if anything changes with these groups - // - if (lpp->pGroupList) - { - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - asc_AsidListCopy (&pTask->pAsidList, &lpp->pGroupList); - StartTask (taskOBJECT_LISTEN, NULL, pTask); - } - - // Fill in the information about the selected groups - // - GroupProp_General_UpdateDialog (hDlg); -} - - -void GroupProp_General_OnDestroy (HWND hDlg) -{ - // Indicate we no longer care if anything changes with these groups - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - StartTask (taskOBJECT_LISTEN, NULL, pTask); -} - - -void GroupProp_General_UpdateDialog (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // Fix the name shown on the dialog - // - if (!lpp->pGroupList || (lpp->pGroupList->cEntries == 1)) - { - ULONG status; - TCHAR szName[ cchRESOURCE ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, (lpp->pGroupList) ? (lpp->pGroupList->aEntries[ 0 ].idObject) : g.idCell, szName, &status); - - if (lpp->pGroupList) - { - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pGroupList->aEntries[ 0 ].idObject, &Properties, &status)) - AppendUID (szName, Properties.u.GroupProperties.uidName); - } - - LPTSTR pszText = FormatString (IDS_GROUP_TITLE, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_GROUP_NAME, pszText); - FreeString (pszText); - } - else // More than one name? - { - LPTSTR pszText = CreateNameList (lpp->pGroupList, IDS_GROUP_NAME_MULTIPLE); - SetDlgItemText (hDlg, IDC_GROUP_NAME, pszText); - FreeString (pszText); - } - - // Fill in the rest of the dialog - // - BOOL fGotAnyData = FALSE; - - for (size_t ii = 0; lpp->pGroupList && (ii < lpp->pGroupList->cEntries); ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pGroupList->aEntries[ ii ].idObject, &Properties, &status)) - continue; - - if (!fGotAnyData) - { - lpp->aaStatus = Properties.u.GroupProperties.aaListStatus; - lpp->aaGroups = Properties.u.GroupProperties.aaListGroupsOwned; - lpp->aaMembers = Properties.u.GroupProperties.aaListMembers; - lpp->aaAdd = Properties.u.GroupProperties.aaAddMember; - lpp->aaRemove = Properties.u.GroupProperties.aaDeleteMember; - lstrcpy (lpp->szOwner, Properties.u.GroupProperties.szOwner); - AppendUID (lpp->szOwner, Properties.u.GroupProperties.uidOwner); - lstrcpy (lpp->szCreator, Properties.u.GroupProperties.szCreator); - AppendUID (lpp->szCreator, Properties.u.GroupProperties.uidCreator); - fGotAnyData = TRUE; - } - else // (fGotAnyData) - { - if (lpp->aaStatus != Properties.u.GroupProperties.aaListStatus) - lpp->fStatus_Mixed = TRUE; - if (lpp->aaGroups != Properties.u.GroupProperties.aaListGroupsOwned) - lpp->fGroups_Mixed = TRUE; - if (lpp->aaMembers != Properties.u.GroupProperties.aaListMembers) - lpp->fMembers_Mixed = TRUE; - if (lpp->aaAdd != Properties.u.GroupProperties.aaAddMember) - lpp->fAdd_Mixed = TRUE; - if (lpp->aaRemove != Properties.u.GroupProperties.aaDeleteMember) - lpp->fRemove_Mixed = TRUE; - - TCHAR szThisOwner[ cchNAME ]; - lstrcpy (szThisOwner, Properties.u.GroupProperties.szOwner); - AppendUID (szThisOwner, Properties.u.GroupProperties.uidOwner); - if (lstrcmpi (lpp->szOwner, szThisOwner)) - lpp->fOwner_Mixed = TRUE; - - TCHAR szThisCreator[ cchNAME ]; - lstrcpy (szThisCreator, Properties.u.GroupProperties.szCreator); - AppendUID (szThisCreator, Properties.u.GroupProperties.uidCreator); - if (lstrcmpi (lpp->szCreator, szThisCreator)) - lpp->fCreator_Mixed = TRUE; - } - } - - // Fill in the dialog's controls - // - GroupProp_General_UpdateDialog_Perm (hDlg, IDC_GROUP_PERM_STATUS, lpp->aaStatus, lpp->fStatus_Mixed); - GroupProp_General_UpdateDialog_Perm (hDlg, IDC_GROUP_PERM_GROUPS, lpp->aaGroups, lpp->fGroups_Mixed); - GroupProp_General_UpdateDialog_Perm (hDlg, IDC_GROUP_PERM_MEMBERS, lpp->aaMembers, lpp->fMembers_Mixed); - GroupProp_General_UpdateDialog_Perm (hDlg, IDC_GROUP_PERM_ADD, lpp->aaAdd, lpp->fAdd_Mixed); - GroupProp_General_UpdateDialog_Perm (hDlg, IDC_GROUP_PERM_REMOVE, lpp->aaRemove, lpp->fRemove_Mixed); - - if (lpp->fOwner_Mixed) - GetString (lpp->szOwner, IDS_OWNER_MIXED); - if (lpp->fCreator_Mixed) - GetString (lpp->szCreator, IDS_CREATOR_MIXED); - SetDlgItemText (hDlg, IDC_GROUP_OWNER, lpp->szOwner); - SetDlgItemText (hDlg, IDC_GROUP_CREATOR, lpp->szCreator); -} - - -void GroupProp_General_UpdateDialog_Perm (HWND hDlg, int idc, ACCOUNTACCESS aa, BOOL fMixed) -{ - CB_StartChange (GetDlgItem (hDlg, idc), TRUE); - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_OWNGROUP, aaOWNER_ONLY); - if (idc != IDC_GROUP_PERM_GROUPS) - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_GROUP, aaGROUP_ONLY); - if (idc != IDC_GROUP_PERM_REMOVE) - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_ANYONE, aaANYONE); - if (fMixed) - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_MIXED, (LPARAM)-1); - CB_EndChange (GetDlgItem (hDlg, idc), TRUE); - - LPARAM lpSelect = (fMixed) ? ((LPARAM)-1) : (LPARAM)aa; - CB_SetSelectedByData (GetDlgItem (hDlg, idc), lpSelect); -} - - -void GroupProp_General_OnApply (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - lpp->fApplyGeneral = TRUE; - - GetDlgItemText (hDlg, IDC_GROUP_OWNER, lpp->szOwner, cchNAME); - - TCHAR szOwnerMixed[ cchNAME ]; - GetString (szOwnerMixed, IDS_OWNER_MIXED); - if (!lstrcmpi (lpp->szOwner, szOwnerMixed)) - { - lpp->szOwner[0] = TEXT('\0'); - lpp->fOwner_Mixed = TRUE; - } - else - { - LPTSTR pch; - if ((pch = (LPTSTR)lstrchr (lpp->szOwner, TEXT(' '))) != NULL) - *pch = TEXT('\0'); // strip off any displayed UID - lpp->fOwner_Mixed = FALSE; - } - - lpp->aaStatus = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_GROUP_PERM_STATUS)); - lpp->fStatus_Mixed = (lpp->aaStatus == (ACCOUNTACCESS)-1); - lpp->aaGroups = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_GROUP_PERM_GROUPS)); - lpp->fGroups_Mixed = (lpp->aaGroups == (ACCOUNTACCESS)-1); - lpp->aaMembers = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_GROUP_PERM_MEMBERS)); - lpp->fMembers_Mixed = (lpp->aaMembers == (ACCOUNTACCESS)-1); - lpp->aaAdd = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_GROUP_PERM_ADD)); - lpp->fAdd_Mixed = (lpp->aaAdd == (ACCOUNTACCESS)-1); - lpp->aaRemove = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_GROUP_PERM_REMOVE)); - lpp->fRemove_Mixed = (lpp->aaRemove == (ACCOUNTACCESS)-1); -} - - -void GroupProp_General_OnBrowse (HWND hDlg) -{ - BROWSE_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.hParent = hDlg; - pp.iddForHelp = IDD_BROWSE_OWNER; - pp.idsTitle = IDS_GROUP_CHANGEOWNER_TITLE; - pp.idsPrompt = IDS_GROUP_CHANGEOWNER_PROMPT; - pp.idsCheck = 0; - pp.TypeToShow = (ASOBJTYPE)( (ULONG)TYPE_USER | (ULONG)TYPE_GROUP ); - pp.fAllowMultiple = FALSE; - GetDlgItemText (hDlg, IDC_GROUP_OWNER, pp.szName, cchNAME); - - TCHAR szOwnerMixed[ cchNAME ]; - GetString (szOwnerMixed, IDS_OWNER_MIXED); - LPTSTR pch; - if (!lstrcmpi (pp.szName, szOwnerMixed)) - pp.szName[0] = TEXT('\0'); - else if ((pch = (LPTSTR)lstrchr (pp.szName, TEXT(' '))) != NULL) - *pch = TEXT('\0'); - - if (ShowBrowseDialog (&pp)) - { - TCHAR szName[ cchNAME ]; - lstrcpy (szName, pp.szName); - - if (pp.pObjectsSelected && (pp.pObjectsSelected->cEntries == 1)) - { - ULONG status; - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pp.pObjectsSelected->aEntries[0].idObject, &Properties, &status)) - { - if (Properties.Type == TYPE_USER) - AppendUID (szName, Properties.u.UserProperties.PTSINFO.uidName); - else if (Properties.Type == TYPE_GROUP) - AppendUID (szName, Properties.u.GroupProperties.uidName); - } - } - - SetDlgItemText (hDlg, IDC_GROUP_OWNER, szName); - } - - if (pp.pObjectsSelected) - asc_AsidListFree (&pp.pObjectsSelected); -} - - -BOOL CALLBACK GroupProp_Member_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_GROUP_MEMBER, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - GroupProp_Member_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - GroupProp_Member_OnDestroy (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskGROUP_MEMBERS_GET) - GroupProp_Member_OnEndTask_GetMembers (hDlg, ptp); - else if (ptp->idTask == taskGROUP_OWNED_GET) - GroupProp_Member_OnEndTask_GetOwned (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - GroupProp_Member_OnApply (hDlg); - break; - - case IDC_GROUP_SHOW_MEMBER: - case IDC_GROUP_SHOW_OWNER: - GroupProp_Member_OnShowType (hDlg); - break; - - case IDC_MEMBER_ADD: - GroupProp_Member_OnAdd (hDlg); - break; - - case IDC_MEMBER_REMOVE: - GroupProp_Member_OnRemove (hDlg); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - GroupProp_Member_OnSelect (hDlg); - break; - } - break; - } - return FALSE; -} - - -void GroupProp_Member_OnInitDialog (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // If we've come in here with a valid set of groups to display, - // copy those. We'll need the copies if the user cancels the dialog. - // - SetWindowData (hDlg, GWD_ASIDLIST_MEMBER, (LPARAM)(lpp->pMembers)); - SetWindowData (hDlg, GWD_ASIDLIST_OWNER, (LPARAM)(lpp->pGroupsOwner)); - - LPASIDLIST pList; - if ((pList = lpp->pMembers) != NULL) - asc_AsidListCopy (&lpp->pMembers, &pList); - if ((pList = lpp->pGroupsOwner) != NULL) - asc_AsidListCopy (&lpp->pGroupsOwner, &pList); - - // If this prop sheet reflects more than one group, disable the - // Ownership button (we do this primarily because the Add/Remove - // buttons have no straight-forward semantic for that case). - // Actually, instead of disabling the thing, we'll hide the buttons - // entirely and resize the list/move the title. - // - if (lpp->pGroupList && (lpp->pGroupList->cEntries > 1)) - { - ShowWindow (GetDlgItem (hDlg, IDC_GROUP_SHOW_MEMBER), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_GROUP_SHOW_OWNER), SW_HIDE); - - RECT rButton; - GetRectInParent (GetDlgItem (hDlg, IDC_GROUP_SHOW_MEMBER), &rButton); - - RECT rTitle; - GetRectInParent (GetDlgItem (hDlg, IDC_USERS_TITLE), &rTitle); - - RECT rList; - GetRectInParent (GetDlgItem (hDlg, IDC_USERS_LIST), &rList); - - LONG cyDelta = rTitle.top - rButton.top; - - SetWindowPos (GetDlgItem (hDlg, IDC_USERS_TITLE), NULL, - rTitle.left, rTitle.top-cyDelta, - rTitle.right-rTitle.left, rTitle.bottom-rTitle.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); - - SetWindowPos (GetDlgItem (hDlg, IDC_USERS_LIST), NULL, - rList.left, rList.top-cyDelta, - rList.right-rList.left, rList.bottom-rList.top+cyDelta, - SWP_NOZORDER | SWP_NOACTIVATE); - } - - // Apply an imagelist to the dialog's fastlist - // - FastList_SetImageLists (GetDlgItem (hDlg, IDC_USERS_LIST), AfsAppLib_CreateImageList (FALSE), NULL); - - // Select a checkbox and pretend that the user clicked it; that will - // make the dialog automatically re-populate the list of groups - // - CheckDlgButton (hDlg, IDC_GROUP_SHOW_MEMBER, TRUE); - GroupProp_Member_OnShowType (hDlg); -} - - -void GroupProp_Member_OnDestroy (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - LPASIDLIST pList; - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_MEMBER)) != NULL) - lpp->pMembers = pList; - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_OWNER)) != NULL) - lpp->pGroupsOwner = pList; -} - - -void GroupProp_Member_OnShowType (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // If we've already obtained the list of users we should be displaying, - // just go show it. - // - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - { - if (lpp->pMembers) - { - GroupProp_Member_PopulateList (hDlg); - return; - } - } - else // (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - { - if (lpp->pGroupsOwner) - { - GroupProp_Member_PopulateList (hDlg); - return; - } - } - - // Otherwise, we'll have to start a background task to do the querying. - // Change the text above the list to "Querying...", disable the buttons, - // and remove any items in the list - // - if (!lpp->pGroupList) - { - // Generate a few empty ASID list; this is a new group account we're - // displaying, and the caller hasn't yet added any members to it. - // - if (!lpp->pMembers) - { - if (!asc_AsidListCreate (&lpp->pMembers)) - return; - } - if (!lpp->pGroupsOwner) - { - if (!asc_AsidListCreate (&lpp->pGroupsOwner)) - return; - } - GroupProp_Member_OnShowType (hDlg); - } - else // (lpp->pUserList) - { - TCHAR szTitle[ cchRESOURCE ]; - GetString (szTitle, IDS_QUERYING_LONG); - SetDlgItemText (hDlg, IDC_USERS_TITLE, szTitle); - - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_ADD), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_REMOVE), FALSE); - - FastList_RemoveAll (GetDlgItem (hDlg, IDC_USERS_LIST)); - - // Then start a background task to grab an ASIDLIST of users which - // match the specified search criteria. - // - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - { - LPASIDLIST pGroups; - asc_AsidListCopy (&pGroups, &lpp->pGroupList); - StartTask (taskGROUP_MEMBERS_GET, hDlg, pGroups); - } - else // (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - { - StartTask (taskGROUP_OWNED_GET, hDlg, (PVOID)(lpp->pGroupList->aEntries[0].idObject)); - } - } -} - - -void GroupProp_Member_OnEndTask_GetMembers (HWND hDlg, LPTASKPACKET ptp) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // The search is complete. If we've just obtained an ASIDLIST successfully, - // associate it with the dialog and repopulate the display. - // - if (ptp->rc && TASKDATA(ptp)->pAsidList) - { - if (!lpp->pMembers) - { - asc_AsidListCopy (&lpp->pMembers, &TASKDATA(ptp)->pAsidList); - GroupProp_Member_PopulateList (hDlg); - } - } -} - - -void GroupProp_Member_OnEndTask_GetOwned (HWND hDlg, LPTASKPACKET ptp) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // The search is complete. If we've just obtained an ASIDLIST successfully, - // associate it with the dialog and repopulate the display. - // - if (ptp->rc && TASKDATA(ptp)->pAsidList) - { - if (!lpp->pGroupsOwner) - { - asc_AsidListCopy (&lpp->pGroupsOwner, &TASKDATA(ptp)->pAsidList); - GroupProp_Member_PopulateList (hDlg); - } - } -} - - -void GroupProp_Member_PopulateList (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // Clear the list of members/owned groups - // - HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST); - FastList_Begin (hList); - FastList_RemoveAll (hList); - - // We should have an ASIDLIST associated with the dialog to reflect - // which objects to display. Find it, and repopulate the list on - // the display. - // - LPASIDLIST pDisplay; - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - pDisplay = lpp->pMembers; - else // (!IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - pDisplay = lpp->pGroupsOwner; - - if (pDisplay) - { - TCHAR szMixed[ cchRESOURCE ]; - GetString (szMixed, IDS_MEMBER_MIXED); - - for (size_t ii = 0; ii < pDisplay->cEntries; ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, pDisplay->aEntries[ ii ].idObject, &Properties, &status)) - continue; - - TCHAR szName[ cchNAME ]; - if (Properties.Type == TYPE_USER) - User_GetDisplayName (szName, &Properties); - else - lstrcpy (szName, Properties.szName); - - if (!pDisplay->aEntries[ ii ].lParam) - lstrcat (szName, szMixed); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.iFirstImage = (Properties.Type == TYPE_USER) ? imageUSER : imageGROUP; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = szName; - flai.lParam = (LPARAM)(pDisplay->aEntries[ ii ].idObject); - FastList_AddItem (hList, &flai); - } - } - - FastList_End (hList); - - // Fix the buttons, and the text at the top of the list - // - TCHAR szTitle[ cchRESOURCE ]; - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - GetString (szTitle, (!lpp->pGroupList) ? IDS_NEWGROUP_SHOW_MEMBER_TITLE : (lpp->pGroupList->cEntries == 1) ? IDS_GROUP_SHOW_MEMBER_TITLE : IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE); - else - GetString (szTitle, (!lpp->pGroupList) ? IDS_NEWGROUP_SHOW_OWNED_TITLE : IDS_GROUP_SHOW_OWNED_TITLE); - - SetDlgItemText (hDlg, IDC_USERS_TITLE, szTitle); - - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_ADD), TRUE); - GroupProp_Member_OnSelect (hDlg); -} - - -void GroupProp_Member_OnSelect (HWND hDlg) -{ - BOOL fEnable = IsWindowEnabled (GetDlgItem (hDlg, IDC_MEMBER_ADD)); - if (fEnable && !FastList_FindFirstSelected (GetDlgItem (hDlg, IDC_USERS_LIST))) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_REMOVE), fEnable); -} - - -void GroupProp_Member_OnAdd (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - LPBROWSE_PARAMS pParams = New (BROWSE_PARAMS); - memset (pParams, 0x00, sizeof(BROWSE_PARAMS)); - pParams->hParent = GetParent(hDlg); - pParams->iddForHelp = IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER) ? IDD_BROWSE_MEMBER : IDD_BROWSE_OWNED; - pParams->idsTitle = IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER) ? IDS_BROWSE_TITLE_MEMBER : IDS_BROWSE_TITLE_OWNED; - pParams->idsPrompt = IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER) ? IDS_BROWSE_PROMPT_MEMBER : IDS_BROWSE_PROMPT_OWNED; - pParams->idsCheck = IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER) ? IDS_BROWSE_CHECK_MEMBER : IDS_BROWSE_CHECK_OWNED; - pParams->fAllowMultiple = TRUE; - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - pParams->TypeToShow = (ASOBJTYPE)( (ULONG)TYPE_USER | (ULONG)TYPE_GROUP ); - else // (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - pParams->TypeToShow = TYPE_GROUP; - - // First prepare an ASIDLIST which reflects only the groups which - // all selected users own/are members in. - // - LPASIDLIST pDisplay; - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - pDisplay = lpp->pMembers; - else // (!IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - pDisplay = lpp->pGroupsOwner; - - if (pDisplay) - { - asc_AsidListCreate (&pParams->pObjectsToSkip); - for (size_t ii = 0; ii < pDisplay->cEntries; ++ii) - { - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER) || pDisplay->aEntries[ ii ].lParam) // all groups have this member? - asc_AsidListAddEntry (&pParams->pObjectsToSkip, pDisplay->aEntries[ ii ].idObject, 0); - } - } - - if (ShowBrowseDialog (pParams)) - { - // The user added some entries; modify pDisplay (and the dialog, - // at the same time). - // - HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST); - FastList_Begin (hList); - - for (size_t ii = 0; ii < pParams->pObjectsSelected->cEntries; ++ii) - { - ASID idMember = pParams->pObjectsSelected->aEntries[ ii ].idObject; - - // The user has chosen to add member {idMember}. If it's not in our - // list at all, add it (and a new entry for the display). If it - // *is* in our list, make sure its lParam is 1--indicating all users - // get it--and modify the display's entry to remove the "(some)" - // marker. - // - LPARAM lParam; - if (!asc_AsidListTest (&pDisplay, idMember, &lParam)) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idMember, &Properties, &status)) - continue; - - asc_AsidListAddEntry (&pDisplay, idMember, TRUE); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.iFirstImage = (Properties.Type == TYPE_USER) ? imageUSER : imageGROUP; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = Properties.szName; - flai.lParam = (LPARAM)idMember; - FastList_AddItem (hList, &flai); - PropSheetChanged (hDlg); - } - else if (!lParam) - { - TCHAR szName[ cchNAME ]; - if (!User_GetDisplayName (szName, idMember)) - continue; - - asc_AsidListSetEntryParam (&pDisplay, idMember, TRUE); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)idMember)) != NULL) - FastList_SetItemText (hList, hItem, 0, szName); - PropSheetChanged (hDlg); - } - } - - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - lpp->pMembers = pDisplay; - else // (!IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - lpp->pGroupsOwner = pDisplay; - - FastList_End (hList); - } - - if (pParams->pObjectsToSkip) - asc_AsidListFree (&pParams->pObjectsToSkip); - if (pParams->pObjectsSelected) - asc_AsidListFree (&pParams->pObjectsSelected); - Delete (pParams); -} - - -void GroupProp_Member_OnRemove (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // Find which list-of-members is currently being displayed. - // - LPASIDLIST pDisplay; - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - pDisplay = lpp->pMembers; - else // (!IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - pDisplay = lpp->pGroupsOwner; - - // The user wants to remove some members/owned groups; modify pDisplay - // (and the dialog, at the same time). - // - HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST); - FastList_Begin (hList); - - HLISTITEM hItem; - while ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - ASID idMember = (ASID)FastList_GetItemParam (hList, hItem); - FastList_RemoveItem (hList, hItem); - asc_AsidListRemoveEntry (&pDisplay, idMember); - PropSheetChanged (hDlg); - } - - if (IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_MEMBER)) - lpp->pMembers = pDisplay; - else // (!IsDlgButtonChecked (hDlg, IDC_GROUP_SHOW_OWNER)) - lpp->pGroupsOwner = pDisplay; - - FastList_End (hList); -} - - -void GroupProp_Member_OnApply (HWND hDlg) -{ - LPGROUPPROPINFO lpp = (LPGROUPPROPINFO)PropSheet_FindTabParam (hDlg); - - // Free the old backup ASIDLIST copies we attached to the dialog during - // WM_INITDIALOG processing. - // - LPASIDLIST pList; - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_MEMBER)) != NULL) - asc_AsidListFree (&pList); - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_OWNER)) != NULL) - asc_AsidListFree (&pList); - SetWindowData (hDlg, GWD_ASIDLIST_MEMBER, 0); - SetWindowData (hDlg, GWD_ASIDLIST_OWNER, 0); - - if (lpp->pGroupList) - { - // Start a background task to update the member-list etc - // - if (lpp->pMembers) - { - LPGROUP_MEMBERS_SET_PARAMS pTask = New (GROUP_MEMBERS_SET_PARAMS); - memset (pTask, 0x00, sizeof(GROUP_MEMBERS_SET_PARAMS)); - asc_AsidListCopy (&pTask->pGroups, &lpp->pGroupList); - asc_AsidListCopy (&pTask->pMembers, &lpp->pMembers); - StartTask (taskGROUP_MEMBERS_SET, NULL, pTask); - } - if (lpp->pGroupsOwner) - { - LPGROUP_OWNED_SET_PARAMS pTask = New (GROUP_OWNED_SET_PARAMS); - memset (pTask, 0x00, sizeof(GROUP_OWNED_SET_PARAMS)); - pTask->idGroup = lpp->pGroupList->aEntries[0].idObject; - asc_AsidListCopy (&pTask->pOwnedGroups, &lpp->pGroupsOwner); - StartTask (taskGROUP_OWNED_SET, NULL, pTask); - } - } -} - diff --git a/src/WINNT/afsusrmgr/grp_prop.h b/src/WINNT/afsusrmgr/grp_prop.h deleted file mode 100644 index 3b212103c..000000000 --- a/src/WINNT/afsusrmgr/grp_prop.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GRP_PROP_H -#define GRP_PROP_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - gptANY = -1, - gptPROBLEMS, - gptGENERAL, - gptMEMBERS - } GROUPPROPTAB; - -#define nGROUPPROPTAB_MAX 3 - - -typedef struct - { - LPASIDLIST pGroupList; // NULL if creating new group - BOOL fDeleteMeOnClose; // TRUE to delete structure when done - BOOL fShowModal; // TRUE to block while showing - HWND hParent; - - BOOL fApplyGeneral; // TRUE to apply these fields: - ACCOUNTACCESS aaStatus; - BOOL fStatus_Mixed; - ACCOUNTACCESS aaGroups; - BOOL fGroups_Mixed; - ACCOUNTACCESS aaMembers; - BOOL fMembers_Mixed; - ACCOUNTACCESS aaAdd; - BOOL fAdd_Mixed; - ACCOUNTACCESS aaRemove; - BOOL fRemove_Mixed; - TCHAR szOwner[ cchNAME ]; - BOOL fOwner_Mixed; - TCHAR szCreator[ cchNAME ]; - BOOL fCreator_Mixed; - - LPASIDLIST pMembers; - LPASIDLIST pGroupsOwner; - } GROUPPROPINFO, *LPGROUPPROPINFO; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Group_ShowProperties (LPASIDLIST pAsidList, GROUPPROPTAB gptTarget = gptANY); -void Group_ShowProperties (LPGROUPPROPINFO lpp, GROUPPROPTAB gptTarget = gptANY); -void Group_FreeProperties (LPGROUPPROPINFO lpp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/grp_rename.cpp b/src/WINNT/afsusrmgr/grp_rename.cpp deleted file mode 100644 index f7cb7712e..000000000 --- a/src/WINNT/afsusrmgr/grp_rename.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "grp_rename.h" -#include "browse.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Group_Rename_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Group_Rename_OnInitDialog (HWND hDlg); -void Group_Rename_OnDestroy (HWND hDlg); -void Group_Rename_OnNewName (HWND hDlg); -void Group_Rename_OnChangeOwner (HWND hDlg); -void Group_Rename_OnOK (HWND hDlg); -void Group_Rename_UpdateDialog (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Group_ShowRename (HWND hParent, ASID idGroup) -{ - ModalDialogParam (IDD_GROUP_RENAME, hParent, (DLGPROC)Group_Rename_DlgProc, (LPARAM)idGroup); -} - - -BOOL CALLBACK Group_Rename_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_GROUP_RENAME, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Group_Rename_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - Group_Rename_OnDestroy (hDlg); - break; - - case WM_ASC_NOTIFY_OBJECT: - Group_Rename_UpdateDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Group_Rename_OnOK (hDlg); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_RENAME_NEWNAME: - Group_Rename_OnNewName (hDlg); - break; - - case IDC_RENAME_CHOWN: - Group_Rename_OnChangeOwner (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Group_Rename_OnInitDialog (HWND hDlg) -{ - ASID idGroup = (ASID)GetWindowLong (hDlg, DWL_USER); - - // Indicate we want to know if anything changes with this group - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - asc_AsidListCreate (&pTask->pAsidList); - asc_AsidListAddEntry (&pTask->pAsidList, idGroup, 0); - StartTask (taskOBJECT_LISTEN, NULL, pTask); - - // Update the dialog's information - // - SetDlgItemText (hDlg, IDC_RENAME_NEWNAME, TEXT("")); - Group_Rename_UpdateDialog (hDlg); -} - - -void Group_Rename_OnDestroy (HWND hDlg) -{ - // Indicate we no longer care if anything changes with this group - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - StartTask (taskOBJECT_LISTEN, NULL, pTask); -} - - -void Group_Rename_OnNewName (HWND hDlg) -{ - TCHAR szOldName[ cchNAME ]; - GetDlgItemText (hDlg, IDC_RENAME_OLDNAME, szOldName, cchNAME); - - TCHAR szNewName[ cchNAME ]; - GetDlgItemText (hDlg, IDC_RENAME_NEWNAME, szNewName, cchNAME); - - BOOL fEnable = TRUE; - if (!szNewName[0]) - fEnable = FALSE; - if (!lstrcmp (szOldName, szNewName)) - fEnable = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void Group_Rename_OnChangeOwner (HWND hDlg) -{ - ASID idGroup = (ASID)GetWindowLong (hDlg, DWL_USER); - - BROWSE_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.hParent = hDlg; - pp.iddForHelp = IDD_BROWSE_OWNER; - pp.idsTitle = IDS_GROUP_CHANGEOWNER_TITLE; - pp.idsPrompt = IDS_GROUP_CHANGEOWNER_PROMPT; - pp.idsCheck = 0; - pp.TypeToShow = (ASOBJTYPE)( (ULONG)TYPE_USER | (ULONG)TYPE_GROUP ); - pp.fAllowMultiple = FALSE; - - ULONG status; - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idGroup, &Properties, &status)) - { - lstrcpy (pp.szName, Properties.u.GroupProperties.szOwner); - - if (ShowBrowseDialog (&pp)) - { - LPGROUP_CHANGE_PARAMS pTask = New (GROUP_CHANGE_PARAMS); - pTask->idGroup = idGroup; - pTask->NewProperties.aaListStatus = Properties.u.GroupProperties.aaListStatus; - pTask->NewProperties.aaListGroupsOwned = Properties.u.GroupProperties.aaListGroupsOwned; - pTask->NewProperties.aaListMembers = Properties.u.GroupProperties.aaListMembers; - pTask->NewProperties.aaAddMember = Properties.u.GroupProperties.aaAddMember; - pTask->NewProperties.aaDeleteMember = Properties.u.GroupProperties.aaDeleteMember; - lstrcpy (pTask->NewProperties.szOwner, pp.szName); - StartTask (taskGROUP_CHANGE, NULL, pTask); - } - } - - if (pp.pObjectsSelected) - asc_AsidListFree (&pp.pObjectsSelected); -} - - -void Group_Rename_OnOK (HWND hDlg) -{ - ASID idGroup = (ASID)GetWindowLong (hDlg, DWL_USER); - - LPGROUP_RENAME_PARAMS lpp = New (GROUP_RENAME_PARAMS); - memset (lpp, 0x00, sizeof(GROUP_RENAME_PARAMS)); - lpp->idGroup = idGroup; - GetDlgItemText (hDlg, IDC_RENAME_NEWNAME, lpp->szNewName, cchNAME); - - StartTask (taskGROUP_RENAME, NULL, lpp); -} - - -void Group_Rename_UpdateDialog (HWND hDlg) -{ - ASID idGroup = (ASID)GetWindowLong (hDlg, DWL_USER); - - // Get the current properties for this group - // - ULONG status; - TCHAR szName[ cchNAME ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, idGroup, szName, &status); - - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idGroup, &Properties, &status)) - GetString (Properties.u.GroupProperties.szOwner, IDS_UNKNOWN_NAME); - SetDlgItemText (hDlg, IDC_RENAME_OWNER, Properties.u.GroupProperties.szOwner); - - // Fill in the text at the top of the dialog - // - LPTSTR pszText = FormatString (IDS_RENAME_TITLE, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_RENAME_TITLE, pszText); - FreeString (pszText); - - // Prepare the New Name control and disable the OK button - // - SetDlgItemText (hDlg, IDC_RENAME_OLDNAME, szName); - Group_Rename_OnNewName (hDlg); -} - diff --git a/src/WINNT/afsusrmgr/grp_rename.h b/src/WINNT/afsusrmgr/grp_rename.h deleted file mode 100644 index 08fbd40eb..000000000 --- a/src/WINNT/afsusrmgr/grp_rename.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GRP_RENAME_H -#define GRP_RENAME_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Group_ShowRename (HWND hParent, ASID idGroup); - - -#endif - diff --git a/src/WINNT/afsusrmgr/grp_tab.cpp b/src/WINNT/afsusrmgr/grp_tab.cpp deleted file mode 100644 index 024f234ce..000000000 --- a/src/WINNT/afsusrmgr/grp_tab.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "grp_tab.h" -#include "grp_col.h" -#include "command.h" -#include "window.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdGroupsTab[] = { - { IDC_GROUPS_TITLE, raRepaint | raSizeX, 0, 0 }, - { IDC_ADVANCED, raMoveX, 0, 0 }, - { IDC_GROUPS_PATTERN, raMoveX, 0, 0 }, - { IDC_GROUPS_PATTERN_PROMPT, raRepaint | raMoveX, 0, 0 }, - { IDC_GROUPS_LIST, raSizeX | raSizeY, 0, 0 }, - { M_GROUP_CREATE, raMoveX | raMoveY, 0, 0 }, - { M_MEMBERSHIP, raMoveX | raMoveY, 0, 0 }, - { M_PROPERTIES, raMoveX | raMoveY, 0, 0 }, - { IDC_STATIC, raRepaint, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_SEARCH_TIMER 0 - -#define msecSEARCH_TIMER 650 - -static struct - { - DWORD dwTickLastType; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Groups_EnableButtons (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Groups_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (Display_HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewGrp)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - { - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - ResizeWindow (hDlg, awdGroupsTab, rwaMoveToHere, &rTab); - - HIMAGELIST hSmall = AfsAppLib_CreateImageList (FALSE); - HIMAGELIST hLarge = AfsAppLib_CreateImageList (TRUE); - FastList_SetImageLists (GetDlgItem (hDlg, IDC_GROUPS_LIST), hSmall, hLarge); - - FastList_SetSortFunction (GetDlgItem (hDlg, IDC_GROUPS_LIST), General_ListSortFunction); - - FL_RestoreView (GetDlgItem (hDlg, IDC_GROUPS_LIST), &gr.viewGrp); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_GROUPS_LIST), Display_GetItemText, (DWORD)&gr.viewGrp); - SetDlgItemText (hDlg, IDC_GROUPS_PATTERN, g.szPatternGroups); - Groups_EnableButtons(hDlg); - Display_PopulateGroupList(); - - l.dwTickLastType = 0; - } - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_GROUPS_LIST), &gr.viewGrp); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdGroupsTab, rwaFixupGuts); - break; - - case WM_TIMER: - switch (wp) - { - case ID_SEARCH_TIMER: - if ( (l.dwTickLastType) && (GetTickCount() > l.dwTickLastType + msecSEARCH_TIMER) ) - { - KillTimer (hDlg, ID_SEARCH_TIMER); - Display_PopulateGroupList(); - } - break; - } - break; - - case WM_CONTEXTMENU: - POINT ptScreen; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - OnRightClick (pmGROUP, GetDlgItem (hDlg, IDC_GROUPS_LIST), &ptScreen); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_GROUPS_PATTERN: - if (HIWORD(wp) == EN_UPDATE) - { - l.dwTickLastType = GetTickCount(); - KillTimer (hDlg, ID_SEARCH_TIMER); - SetTimer (hDlg, ID_SEARCH_TIMER, msecSEARCH_TIMER +15, NULL); - } - break; - - default: - OnContextCommand (LOWORD(wp)); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Main_SetMenus(); - Groups_EnableButtons(hDlg); - break; - - case FLN_LDBLCLICK: - PostMessage (hDlg, WM_COMMAND, MAKELONG(M_PROPERTIES,BN_CLICKED), (LPARAM)GetDlgItem (hDlg, M_PROPERTIES)); - break; - } - break; - } - - return FALSE; -} - - -void Groups_EnableButtons (HWND hDlg) -{ - BOOL fEnable = (Display_GetSelectedCount() != 0) ? TRUE : FALSE; - EnableWindow (GetDlgItem (hDlg, M_PROPERTIES), fEnable); - EnableWindow (GetDlgItem (hDlg, M_MEMBERSHIP), fEnable); -} - diff --git a/src/WINNT/afsusrmgr/grp_tab.h b/src/WINNT/afsusrmgr/grp_tab.h deleted file mode 100644 index 0525ce083..000000000 --- a/src/WINNT/afsusrmgr/grp_tab.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef GRP_TAB_H -#define GRP_TAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Groups_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/help.hid b/src/WINNT/afsusrmgr/help.hid deleted file mode 100644 index e851eb15a..000000000 --- a/src/WINNT/afsusrmgr/help.hid +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - *** Overview Topics - * - */ - -#define IDH_USRMGR_OPENCELL_OVERVIEW 1000 -#define IDH_USRMGR_COLUMNS_OVERVIEW 1001 -#define IDH_USRMGR_PROP_USER_GENERAL_OVERVIEW 1002 -#define IDH_USRMGR_PROP_USER_ADVANCED_OVERVIEW 1003 -#define IDH_USRMGR_PROP_USER_MEMBER_OVERVIEW 1004 -#define IDH_USRMGR_PROP_GROUP_GENERAL_OVERVIEW 1005 -#define IDH_USRMGR_PROP_GROUP_MEMBER_OVERVIEW 1006 -#define IDH_USRMGR_PROP_MACHINE_ADVANCED_OVERVIEW 1007 -#define IDH_USRMGR_PROP_MACHINE_MEMBER_OVERVIEW 1008 -#define IDH_USRMGR_CREDENTIALS_OVERVIEW 1009 -#define IDH_USRMGR_BADCREDS_OVERVIEW 1010 -#define IDH_USRMGR_BROWSE_JOIN_OVERVIEW 1011 -#define IDH_USRMGR_BROWSE_OWN_OVERVIEW 1012 -#define IDH_USRMGR_BROWSE_MEMBER_OVERVIEW 1013 -#define IDH_USRMGR_USER_PASSWORD_OVERVIEW 1014 -#define IDH_USRMGR_GROUP_RENAME_OVERVIEW 1015 -#define IDH_USRMGR_BROWSE_OWNER_OVERVIEW 1016 -#define IDH_USRMGR_BROWSE_OWNED_OVERVIEW 1017 -#define IDH_USRMGR_CREATE_USER_OVERVIEW 1018 -#define IDH_USRMGR_CREATE_GROUP_OVERVIEW 1019 -#define IDH_USRMGR_CREATE_MACHINE_OVERVIEW 1020 -#define IDH_USRMGR_DELETE_USER_OVERVIEW 1021 -#define IDH_USRMGR_DELETE_GROUP_OVERVIEW 1022 -#define IDH_USRMGR_DELETE_MACHINE_OVERVIEW 1023 -#define IDH_USRMGR_PROP_CELL_GENERAL_OVERVIEW 1024 -#define IDH_USRMGR_OPTIONS_OVERVIEW 1025 -#define IDH_USRMGR_SEARCH_USERS_OVERVIEW 1026 - - -/* - *** KAS/PTS Command Topics - * - */ - -#define IDH_USRMGR_COMMAND_PTS_ADDUSER 2000 -#define IDH_USRMGR_COMMAND_PTS_CHOWN 2001 -#define IDH_USRMGR_COMMAND_PTS_CREATEGROUP 2002 -#define IDH_USRMGR_COMMAND_PTS_CREATEUSER 2003 -#define IDH_USRMGR_COMMAND_PTS_DELETE 2004 -#define IDH_USRMGR_COMMAND_PTS_EXAMINE 2005 -#define IDH_USRMGR_COMMAND_PTS_LISTMAX 2006 -#define IDH_USRMGR_COMMAND_PTS_LISTOWNED 2007 -#define IDH_USRMGR_COMMAND_PTS_MEMBERSHIP 2008 -#define IDH_USRMGR_COMMAND_PTS_REMOVEUSER 2009 -#define IDH_USRMGR_COMMAND_PTS_RENAME 2010 -#define IDH_USRMGR_COMMAND_PTS_SETFIELDS 2011 -#define IDH_USRMGR_COMMAND_PTS_SETMAX 2012 -#define IDH_USRMGR_COMMAND_KAS_CREATE 2013 -#define IDH_USRMGR_COMMAND_KAS_DELETE 2014 -#define IDH_USRMGR_COMMAND_KAS_EXAMINE 2015 -#define IDH_USRMGR_COMMAND_KAS_GETRANDOMKEY 2016 -#define IDH_USRMGR_COMMAND_KAS_LIST 2017 -#define IDH_USRMGR_COMMAND_KAS_SETFIELDS 2018 -#define IDH_USRMGR_COMMAND_KAS_SETKEY 2019 -#define IDH_USRMGR_COMMAND_KAS_SETPASSWORD 2020 -#define IDH_USRMGR_COMMAND_KAS_STRINGTOKEY 2021 -#define IDH_USRMGR_COMMAND_KAS_UNLOCK 2022 - - -/* - *** CONTEXT HELP TOPICS - * - */ - -// Context help for IDD_OPENCELL: -// -#define IDH_USRMGR_OPENCELL_CELL 3000 -#define IDH_USRMGR_OPENCELL_ID_OLD 3001 -#define IDH_USRMGR_OPENCELL_ID_NEW 3002 -#define IDH_USRMGR_OPENCELL_PASSWORD 3003 - -// Context help for IDD_COLUMNS: -// -#define IDH_USRMGR_COLUMNS_WHICH 3100 -#define IDH_USRMGR_COLUMNS_AVAIL 3101 -#define IDH_USRMGR_COLUMNS_SHOWN 3102 -#define IDH_USRMGR_COLUMNS_INSERT 3103 -#define IDH_USRMGR_COLUMNS_DELETE 3104 -#define IDH_USRMGR_COLUMNS_MOVEUP 3105 -#define IDH_USRMGR_COLUMNS_MOVEDOWN 3106 - -// Context help for IDD_USER_GENERAL: -// -#define IDH_USRMGR_USER_GENERAL_CPW_NOW 3201 -#define IDH_USRMGR_USER_GENERAL_CPW 3202 -#define IDH_USRMGR_USER_GENERAL_RPW 3203 -#define IDH_USRMGR_USER_GENERAL_PWEXPIRES 3204 -#define IDH_USRMGR_USER_GENERAL_PWEXPIRATION 3205 -#define IDH_USRMGR_USER_GENERAL_FAILLOCK 3206 -#define IDH_USRMGR_USER_GENERAL_FAILLOCK_COUNT 3207 -#define IDH_USRMGR_USER_GENERAL_FAILLOCK_INFINITE 3208 -#define IDH_USRMGR_USER_GENERAL_FAILLOCK_FINITE 3209 -#define IDH_USRMGR_USER_GENERAL_FAILLOCK_DURATION 3210 -#define IDH_USRMGR_USER_GENERAL_UNLOCK 3211 -#define IDH_USRMGR_USER_GENERAL_EXPIRES 3212 -#define IDH_USRMGR_USER_GENERAL_EXPIRE_DATE 3213 -#define IDH_USRMGR_USER_GENERAL_EXPIRE_TIME 3214 - -// Context help for IDD_USER_ADVANCED: -// -#define IDH_USRMGR_USER_ADVANCED_NAME 3300 -#define IDH_USRMGR_USER_ADVANCED_NOSEAL 3301 -#define IDH_USRMGR_USER_ADVANCED_ADMIN 3302 -#define IDH_USRMGR_USER_ADVANCED_TGS 3303 -#define IDH_USRMGR_USER_ADVANCED_LIFETIME 3304 -#define IDH_USRMGR_USER_ADVANCED_GROUP_HASQUOTA 3305 -#define IDH_USRMGR_USER_ADVANCED_GROUP_QUOTA 3306 -#define IDH_USRMGR_USER_ADVANCED_PERM_STATUS 3307 -#define IDH_USRMGR_USER_ADVANCED_PERM_OWNED 3308 -#define IDH_USRMGR_USER_ADVANCED_PERM_MEMBER 3309 -#define IDH_USRMGR_USER_ADVANCED_CREATE_KAS 3310 -#define IDH_USRMGR_USER_ADVANCED_CREATE_PTS 3311 -#define IDH_USRMGR_USER_ADVANCED_KEY 3312 - -// Context help for IDD_USER_MEMBER: -// -#define IDH_USRMGR_USER_MEMBER_LIST 3400 -#define IDH_USRMGR_USER_MEMBER_REMOVE 3401 -#define IDH_USRMGR_USER_MEMBER_ADD 3402 -#define IDH_USRMGR_USER_MEMBER_SHOWMEMBER 3403 -#define IDH_USRMGR_USER_MEMBER_SHOWOWNER 3404 - -// Context help for IDD_GROUP_GENERAL: -// -#define IDH_USRMGR_GROUP_GENERAL_NAME 3500 -#define IDH_USRMGR_GROUP_GENERAL_PERM_STATUS 3501 -#define IDH_USRMGR_GROUP_GENERAL_PERM_GROUPS 3502 -#define IDH_USRMGR_GROUP_GENERAL_PERM_MEMBERS 3503 -#define IDH_USRMGR_GROUP_GENERAL_PERM_ADD 3504 -#define IDH_USRMGR_GROUP_GENERAL_PERM_REMOVE 3505 -#define IDH_USRMGR_GROUP_GENERAL_OWNER 3506 -#define IDH_USRMGR_GROUP_GENERAL_CREATOR 3507 -#define IDH_USRMGR_GROUP_GENERAL_CHANGEOWNER 3508 - -// Context help for IDD_GROUP_MEMBER: -// -#define IDH_USRMGR_GROUP_MEMBER_LIST 3600 -#define IDH_USRMGR_GROUP_MEMBER_REMOVE 3601 -#define IDH_USRMGR_GROUP_MEMBER_ADD 3602 -#define IDH_USRMGR_GROUP_MEMBER_SHOWMEMBER 3603 -#define IDH_USRMGR_GROUP_MEMBER_SHOWOWNER 3604 - -// Context help for IDD_MACHINE_ADVANCED: -// -#define IDH_USRMGR_MACHINE_ADVANCED_NAME 3700 -#define IDH_USRMGR_MACHINE_ADVANCED_GROUP_HASQUOTA 3701 -#define IDH_USRMGR_MACHINE_ADVANCED_GROUP_QUOTA 3702 -#define IDH_USRMGR_MACHINE_ADVANCED_PERM_STATUS 3703 -#define IDH_USRMGR_MACHINE_ADVANCED_PERM_OWNED 3704 -#define IDH_USRMGR_MACHINE_ADVANCED_PERM_MEMBER 3705 - -// Context help for IDD_MACHINE_MEMBER: -// -#define IDH_USRMGR_MACHINE_MEMBER_LIST 3800 -#define IDH_USRMGR_MACHINE_MEMBER_REMOVE 3801 -#define IDH_USRMGR_MACHINE_MEMBER_ADD 3802 -#define IDH_USRMGR_MACHINE_MEMBER_SHOWMEMBER 3803 -#define IDH_USRMGR_MACHINE_MEMBER_SHOWOWNER 3804 - -// Context help for IDD_APPLIB_CREDENTIALS: -// -#define IDH_USRMGR_CREDS_CELL 3900 -#define IDH_USRMGR_CREDS_CURRENTID 3901 -#define IDH_USRMGR_CREDS_EXPDATE 3902 -#define IDH_USRMGR_CREDS_LOGIN 3903 -#define IDH_USRMGR_CREDS_AFS_ID 3904 -#define IDH_USRMGR_CREDS_AFS_PASSWORD 3905 - -// Context help for IDD_APPLIB_BADCREDS: -// -#define IDH_USRMGR_BADCREDS_SHUTUP 4000 -#define IDH_USRMGR_BADCREDS_YES 4001 -#define IDH_USRMGR_BADCREDS_NO 4002 - -// Context help for IDD_BROWSE_JOIN: -// -#define IDH_USRMGR_BROWSE_JOIN_NAMES 4100 -#define IDH_USRMGR_BROWSE_JOIN_LIMIT 4101 -#define IDH_USRMGR_BROWSE_JOIN_CELL 4102 -#define IDH_USRMGR_BROWSE_JOIN_LIST 4103 -#define IDH_USRMGR_BROWSE_JOIN_OK 4104 -#define IDH_USRMGR_BROWSE_JOIN_CANCEL 4105 - -// Context help for IDD_BROWSE_OWN: -// -#define IDH_USRMGR_BROWSE_OWN_NAMES 4200 -#define IDH_USRMGR_BROWSE_OWN_LIMIT 4201 -#define IDH_USRMGR_BROWSE_OWN_CELL 4202 -#define IDH_USRMGR_BROWSE_OWN_LIST 4203 -#define IDH_USRMGR_BROWSE_OWN_OK 4204 -#define IDH_USRMGR_BROWSE_OWN_CANCEL 4205 - -// Context help for IDD_BROWSE_MEMBER: -// -#define IDH_USRMGR_BROWSE_MEMBER_NAMES 4300 -#define IDH_USRMGR_BROWSE_MEMBER_LIMIT 4301 -#define IDH_USRMGR_BROWSE_MEMBER_CELL 4302 -#define IDH_USRMGR_BROWSE_MEMBER_LIST 4303 -#define IDH_USRMGR_BROWSE_MEMBER_OK 4304 -#define IDH_USRMGR_BROWSE_MEMBER_CANCEL 4305 -#define IDH_USRMGR_BROWSE_MEMBER_COMBO 4306 - -// Context help for IDD_USER_PASSWORD: -// -#define IDH_USRMGR_USER_PASSWORD_VERSION_AUTO 4400 -#define IDH_USRMGR_USER_PASSWORD_VERSION_MANUAL 4401 -#define IDH_USRMGR_USER_PASSWORD_VERSION 4402 -#define IDH_USRMGR_USER_PASSWORD_BYSTRING 4403 -#define IDH_USRMGR_USER_PASSWORD_STRING 4404 -#define IDH_USRMGR_USER_PASSWORD_BYDATA 4405 -#define IDH_USRMGR_USER_PASSWORD_DATA 4406 -#define IDH_USRMGR_USER_PASSWORD_RANDOM 4407 - -// Context help for IDD_GROUP_RENAME: -// -#define IDH_USRMGR_GROUP_RENAME_OLDNAME 4500 -#define IDH_USRMGR_GROUP_RENAME_NEWNAME 4501 -#define IDH_USRMGR_GROUP_RENAME_OWNER 4502 -#define IDH_USRMGR_GROUP_RENAME_CHOWN 4503 - -// Context help for IDD_BROWSE_OWNER: -// -#define IDH_USRMGR_BROWSE_OWNER_NAMES 4600 -#define IDH_USRMGR_BROWSE_OWNER_CELL 4601 -#define IDH_USRMGR_BROWSE_OWNER_LIST 4602 -#define IDH_USRMGR_BROWSE_OWNER_OK 4603 -#define IDH_USRMGR_BROWSE_OWNER_CANCEL 4604 -#define IDH_USRMGR_BROWSE_OWNER_COMBO 4605 - -// Context help for IDD_BROWSE_OWNED: -// -#define IDH_USRMGR_BROWSE_OWNED_NAMES 4700 -#define IDH_USRMGR_BROWSE_OWNED_LIMIT 4701 -#define IDH_USRMGR_BROWSE_OWNED_CELL 4702 -#define IDH_USRMGR_BROWSE_OWNED_LIST 4703 -#define IDH_USRMGR_BROWSE_OWNED_OK 4704 -#define IDH_USRMGR_BROWSE_OWNED_CANCEL 4705 - -// Context help for IDD_NEWUSER: -// -#define IDH_USRMGR_NEWUSER_NAME 4800 -#define IDH_USRMGR_NEWUSER_PW1 4801 -#define IDH_USRMGR_NEWUSER_PW2 4802 -#define IDH_USRMGR_NEWUSER_ID_AUTO 4803 -#define IDH_USRMGR_NEWUSER_ID_MANUAL 4804 -#define IDH_USRMGR_NEWUSER_ID 4805 -#define IDH_USRMGR_NEWUSER_ADVANCED 4806 - -// Context help for IDD_NEWGROUP: -// -#define IDH_USRMGR_NEWGROUP_NAME 4900 -#define IDH_USRMGR_NEWGROUP_ID_AUTO 4901 -#define IDH_USRMGR_NEWGROUP_ID_MANUAL 4902 -#define IDH_USRMGR_NEWGROUP_ID 4903 -#define IDH_USRMGR_NEWGROUP_ADVANCED 4904 - -// Context help for IDD_NEWMACHINE: -// -#define IDH_USRMGR_NEWMACHINE_NAME 5000 -#define IDH_USRMGR_NEWMACHINE_ID_AUTO 5001 -#define IDH_USRMGR_NEWMACHINE_ID_MANUAL 5002 -#define IDH_USRMGR_NEWMACHINE_ID 5003 -#define IDH_USRMGR_NEWMACHINE_ADVANCED 5004 - -// Context help for IDD_USER_DELETE: -// -#define IDH_USRMGR_USER_DELETE_OK 5100 -#define IDH_USRMGR_USER_DELETE_CANCEL 5101 -#define IDH_USRMGR_USER_DELETE_KAS 5102 -#define IDH_USRMGR_USER_DELETE_PTS 5103 - -// Context help for IDD_GROUP_DELETE: -// -#define IDH_USRMGR_GROUP_DELETE_OK 5200 -#define IDH_USRMGR_GROUP_DELETE_CANCEL 5201 - -// Context help for IDD_MACHINE_DELETE: -// -#define IDH_USRMGR_MACHINE_DELETE_OK 5300 -#define IDH_USRMGR_MACHINE_DELETE_CANCEL 5301 - -// Context help for IDD_CELL_GENERAL: -// -#define IDH_USRMGR_CELL_GENERAL_USERMAX 5400 -#define IDH_USRMGR_CELL_GENERAL_GROUPMAX 5401 - -// Context help for IDD_OPTIONS: -// -#define IDH_USRMGR_OPTIONS_REGEXP_UNIX 5500 -#define IDH_USRMGR_OPTIONS_REGEXP_WINDOWS 5501 -#define IDH_USRMGR_OPTIONS_REFRESH 5502 -#define IDH_USRMGR_OPTIONS_REFRESH_RATE 5503 - -// Context help for IDD_SEARCH_USERS: -// -#define IDH_USRMGR_SEARCH_USERS_SHOWALL 5600 -#define IDH_USRMGR_SEARCH_USERS_SHOWEXPIRE 5601 -#define IDH_USRMGR_SEARCH_USERS_EXPIREDATE 5602 -#define IDH_USRMGR_SEARCH_USERS_SHOWPWEXPIRE 5603 -#define IDH_USRMGR_SEARCH_USERS_PWEXPIREDATE 5604 - diff --git a/src/WINNT/afsusrmgr/helpfunc.cpp b/src/WINNT/afsusrmgr/helpfunc.cpp deleted file mode 100644 index b58ec29ae..000000000 --- a/src/WINNT/afsusrmgr/helpfunc.cpp +++ /dev/null @@ -1,807 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "helpfunc.h" - -#ifndef iswhite -#define iswhite(_ch) ( ((_ch) == TEXT(' ')) || ((_ch) == TEXT('\t')) ) -#endif - - -/* - * VARIABLES ________________________________________________________________ - * - */ - -typedef enum { - uuUNSPECIFIED, - uuPTS, // PTS commands - uuKAS // KAS commands -} UNIXUTIL; - -// One entry per help context -static struct { - UNIXUTIL uu; - int ids; - int hid; -} aCOMMANDS[] = { - { uuPTS, IDS_COMMAND_PTS_ADDUSER, IDH_USRMGR_COMMAND_PTS_ADDUSER }, - { uuPTS, IDS_COMMAND_PTS_CHOWN, IDH_USRMGR_COMMAND_PTS_CHOWN }, - { uuPTS, IDS_COMMAND_PTS_CREATEGROUP, IDH_USRMGR_COMMAND_PTS_CREATEGROUP }, - { uuPTS, IDS_COMMAND_PTS_CREATEUSER, IDH_USRMGR_COMMAND_PTS_CREATEUSER }, - { uuPTS, IDS_COMMAND_PTS_DELETE, IDH_USRMGR_COMMAND_PTS_DELETE }, - { uuPTS, IDS_COMMAND_PTS_EXAMINE, IDH_USRMGR_COMMAND_PTS_EXAMINE }, - { uuPTS, IDS_COMMAND_PTS_LISTMAX, IDH_USRMGR_COMMAND_PTS_LISTMAX }, - { uuPTS, IDS_COMMAND_PTS_LISTOWNED, IDH_USRMGR_COMMAND_PTS_LISTOWNED }, - { uuPTS, IDS_COMMAND_PTS_MEMBERSHIP, IDH_USRMGR_COMMAND_PTS_MEMBERSHIP }, - { uuPTS, IDS_COMMAND_PTS_REMOVEUSER, IDH_USRMGR_COMMAND_PTS_REMOVEUSER }, - { uuPTS, IDS_COMMAND_PTS_RENAME, IDH_USRMGR_COMMAND_PTS_RENAME }, - { uuPTS, IDS_COMMAND_PTS_SETFIELDS, IDH_USRMGR_COMMAND_PTS_SETFIELDS }, - { uuPTS, IDS_COMMAND_PTS_SETMAX, IDH_USRMGR_COMMAND_PTS_SETMAX }, - { uuKAS, IDS_COMMAND_KAS_CREATE, IDH_USRMGR_COMMAND_KAS_CREATE }, - { uuKAS, IDS_COMMAND_KAS_DELETE, IDH_USRMGR_COMMAND_KAS_DELETE }, - { uuKAS, IDS_COMMAND_KAS_EXAMINE, IDH_USRMGR_COMMAND_KAS_EXAMINE }, - { uuKAS, IDS_COMMAND_KAS_GETRANDOMKEY, IDH_USRMGR_COMMAND_KAS_GETRANDOMKEY }, - { uuKAS, IDS_COMMAND_KAS_LIST, IDH_USRMGR_COMMAND_KAS_LIST }, - { uuKAS, IDS_COMMAND_KAS_SETFIELDS, IDH_USRMGR_COMMAND_KAS_SETFIELDS }, - { uuKAS, IDS_COMMAND_KAS_SETKEY, IDH_USRMGR_COMMAND_KAS_SETKEY }, - { uuKAS, IDS_COMMAND_KAS_SETPASSWORD, IDH_USRMGR_COMMAND_KAS_SETPASSWORD }, - { uuKAS, IDS_COMMAND_KAS_STRINGTOKEY, IDH_USRMGR_COMMAND_KAS_STRINGTOKEY }, - { uuKAS, IDS_COMMAND_KAS_UNLOCK, IDH_USRMGR_COMMAND_KAS_UNLOCK }, -}; - -// Precalculated hashing values for faster searching through help topics -static DWORD aSEARCHVALUES[] = { - 0x16765627, 0x02D416E6, 0xF657E647, 0x02143636, - 0x02146435, 0x37162736, 0x452716E6, 0x45865602, - 0xE6B30000, 0xE6967616, 0x02A45627, 0x86162746, - 0x02259636, 0xE6022697, 0x96474756, 0xE2007527, - 0xF6772797, 0xF62602D4, 0x26970224, 0x96563702, - 0x26271627, 0x5602C696, 0x16479667, 0x96374727, - 0x46D696E6, 0x00000014, 0xE64796C6, 0x96470257, - 0x02027516, 0x561647F3, 0x723702E6, 0x02F6E656, - 0x47869637, 0x96E6B602, 0x12004586, 0x56163756, - 0x022756C6, 0xE6568747, 0x47865602, 0x56E60000, - 0x22027786, 0xE616D656, 0x8696E656, 0xA3D61636, - 0xD6F64756, 0x22F22756, 0x45279702, 0xE647A302, - 0x12008496, 0x762716D6, 0x020727F6, 0x47869637, - 0x96E67602, 0x47162747, 0x00000037, 0xD2D2D200, - 0x00000000, -}; - -#define nCOMMANDS (sizeof(aCOMMANDS)/sizeof(aCOMMANDS[0])) -#define nSEARCHVALUES (sizeof(aSEARCHVALUES)/sizeof(aSEARCHVALUES[0])) - - -/* - * ROUTINES _________________________________________________________________ - * - */ - -LPCTSTR lstrstr (LPCTSTR pszBuffer, LPCTSTR pszFind) -{ - if (!pszBuffer || !pszFind || !*pszFind) - return pszBuffer; - - for ( ; *pszBuffer; ++pszBuffer) - { - if (*pszBuffer == *pszFind) - { - if (!lstrncmpi (pszBuffer, pszFind, lstrlen(pszFind))) - return pszBuffer; - } - } - - return NULL; -} - - -/* - * FIND COMMAND _____________________________________________________________ - * - */ - -BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Help_FindCommand_OnInitDialog (HWND hDlg); -BOOL Help_FindCommand_OnOK (HWND hDlg); - - -void Help_FindCommand (void) -{ - ModalDialog (IDD_HELP_FIND, g.hMain, (DLGPROC)Help_FindCommand_DlgProc); -} - - -BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Help_FindCommand_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (Help_FindCommand_OnOK (hDlg)) - EndDialog (hDlg, LOWORD(wp)); - break; - - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - } - - return FALSE; -} - - -void Help_FindCommand_OnInitDialog (HWND hDlg) -{ - HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND); - CB_StartChange (hCombo, TRUE); - - for (size_t ii = 0; ii < nCOMMANDS; ++ii) - { - CB_AddItem (hCombo, aCOMMANDS[ii].ids, 0); - } - - CB_EndChange (hCombo, -1); -} - - -LPTSTR Help_FindCommand_Search (UNIXUTIL *puu, LPTSTR pszKeyword) -{ - // search for a usable keyword--skip "vos" or "bos" (etc). - // - while (*pszKeyword) - { - // strip any initial whitespace - while (iswhite(*pszKeyword)) - ++pszKeyword; - - // find the end of this word - for (LPTSTR pszNext = pszKeyword; *pszNext && !iswhite(*pszNext); ) - ++pszNext; - if (!*pszNext) // last word? Gotta use it. - break; - *pszNext = TEXT('\0'); - - BOOL fSkip = FALSE; - if (!lstrcmpi (pszKeyword, TEXT("pts"))) - { - fSkip = TRUE; - *puu = uuPTS; - } - if (!lstrcmpi (pszKeyword, TEXT("kas"))) - { - fSkip = TRUE; - *puu = uuKAS; - } - - if (fSkip) - pszKeyword = 1+pszNext; - else - break; - } - - return pszKeyword; -} - - -DWORD NextSearch (int &ii) -{ - ii = ((ii>>2) == nSEARCHVALUES) ? 1 : ii+1; - return ( (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))>>4)&15) | - (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))<<4)&240) ); -} - - -BOOL Help_FindCommand_OnOK (HWND hDlg) -{ - HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND); - int iiDisplay = -1; - - UNIXUTIL uu = uuUNSPECIFIED; - TCHAR szText[ cchRESOURCE ]; - GetWindowText (hCombo, szText, cchRESOURCE); - - if (!szText[0]) - { - Message (MB_ICONASTERISK | MB_OK, IDS_FIND_NOTHING_TITLE, IDS_FIND_NOTHING_DESC); - return FALSE; - } - - LPTSTR pszKeyword = Help_FindCommand_Search (&uu, szText); - - for (size_t ii = 0; (iiDisplay == -1) && ii < nCOMMANDS; ++ii) - { - TCHAR szCommand[ cchRESOURCE ]; - GetString (szCommand, aCOMMANDS[ ii ].ids); - - if (lstrstr (szCommand, pszKeyword) != NULL) - { - if ((uu == uuUNSPECIFIED) || (uu == aCOMMANDS[ ii ].uu)) - iiDisplay = ii; - } - } - - if (iiDisplay == -1) - { - Message (MB_ICONASTERISK | MB_OK, IDS_FIND_UNKNOWN_TITLE, IDS_FIND_UNKNOWN_DESC, TEXT("%s"), pszKeyword); - return FALSE; - } - - WinHelp (g.hMain, cszHELPFILENAME, HELP_CONTEXT, aCOMMANDS[ iiDisplay ].hid); - return TRUE; -} - - -/* - * FIND ERROR _______________________________________________________________ - * - */ - -BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Help_FindError_OnInitDialog (HWND hDlg); -void Help_FindError_OnTranslate (HWND hDlg); -void Help_FindError_Shrink (HWND hDlg, BOOL fShrink); - -void Help_FindError (void) -{ - ModalDialog (IDD_HELP_ERROR, g.hMain, (DLGPROC)Help_FindError_DlgProc); -} - - -BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Help_FindError_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_ERROR_TRANSLATE: - Help_FindError_OnTranslate (hDlg); - break; - - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - } - - return FALSE; -} - - -void Help_FindError_OnInitDialog (HWND hDlg) -{ - Help_FindError_Shrink (hDlg, TRUE); - - SetDlgItemText (hDlg, IDC_ERROR_NUMBER, TEXT("")); -} - - -void Help_FindError_OnTranslate (HWND hDlg) -{ - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_ERROR_NUMBER, szText, cchRESOURCE); - - LPSTR pszTextA = StringToAnsi (szText); - DWORD dwError = strtoul (pszTextA, NULL, 0); - FreeString (pszTextA, szText); - - TCHAR szDesc[ cchRESOURCE ]; - AfsAppLib_TranslateError (szDesc, dwError); - - // The output string either looks like this (if successful): - // successful completion (0x00000000) - // Or like this: - // 0x00000000 - // Since we list the error code elsewhere, remove it from the - // former case. In the latter case, empty the string entirely - // so we'll know there was no translation. - // - LPTSTR pszTruncate; - if ((pszTruncate = (LPTSTR)lstrrchr (szDesc, TEXT('('))) == NULL) - pszTruncate = szDesc; - else if ((pszTruncate > szDesc) && (*(pszTruncate-1) == TEXT(' '))) - --pszTruncate; - *pszTruncate = TEXT('\0'); - - LPTSTR pszText; - if (szDesc[0] == TEXT('\0')) - pszText = FormatString (IDS_ERROR_NOTTRANSLATED, TEXT("%08lX%lu"), dwError, dwError); - else - pszText = FormatString (IDS_ERROR_TRANSLATED, TEXT("%08lX%lu%s"), dwError, dwError, szDesc); - SetDlgItemText (hDlg, IDC_ERROR_DESC, pszText); - FreeString (pszText); - - Help_FindError_Shrink (hDlg, FALSE); -} - - -void Help_FindError_Shrink (HWND hDlg, BOOL fShrink) -{ - static BOOL fShrunk = FALSE; - static LONG cyShrunk = 0; - - if (fShrink) - { - fShrunk = TRUE; - - // shrink the window--move the IDCANCEL button up so that its - // top edge is where the IDC_ADVANCED_BOX line's top edge is, and - // hide IDC_ADVANCED_BOX and IDC_ERROR_DESC. - // - RECT rAdvanced; - GetRectInParent (GetDlgItem (hDlg, IDC_ADVANCED_BOX), &rAdvanced); - - RECT rClose; - GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose); - - cyShrunk = rClose.top - rAdvanced.top - 9; - - ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_HIDE); - - SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL, - rClose.left, rClose.top -cyShrunk, 0, 0, - SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - RECT rDialog; - GetWindowRect (hDlg, &rDialog); - SetWindowPos (hDlg, NULL, - 0, 0, cxRECT(rDialog), cyRECT(rDialog) -cyShrunk, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - } - else if (fShrunk) - { - fShrunk = FALSE; - - // expand the window--move the IDCANCEL button down, and - // show IDC_ADVANCED_BOX and IDC_ERROR_DESC. - // - RECT rClose; - GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose); - - RECT rDialog; - GetWindowRect (hDlg, &rDialog); - SetWindowPos (hDlg, NULL, - 0, 0, cxRECT(rDialog), cyRECT(rDialog) +cyShrunk, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - - SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL, - rClose.left, rClose.top +cyShrunk, 0, 0, - SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_SHOW); - } -} - - -/* - * HELP ABOUT _______________________________________________________________ - * - */ - - -BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Help_About_OnInitDialog (HWND hDlg); -void Help_About_OnSysCommand (HWND hDlg, int &cmd); -LONG procAbout; - -void Help_About (void) -{ - ModalDialog (IDD_HELP_ABOUT, g.hMain, (DLGPROC)Help_About_DlgProc); -} - - -BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static int cmd; - switch (msg) - { - case WM_INITDIALOG: - cmd = 0; - Help_About_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - EndDialog (hDlg, LOWORD(wp)); - break; - } - break; - - case WM_SYSCOMMAND+1: - Help_About_OnSysCommand (hDlg, cmd); - break; - } - - return FALSE; -} - - -BOOL CALLBACK Help_About_Proc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_DESTROY) - { - KillTimer (GetParent(hDlg), 1000); - } - else if (msg == WM_DESTROY+0x200) - { - RECT rr; - GetWindowRect(GetDlgItem(GetParent(hDlg),0x07E5),&rr); - DWORD dw = GetMessagePos(); - POINT pt = { LOWORD(dw), HIWORD(dw) }; - if (PtInRect (&rr, pt)) - { - SetDlgItemText (GetParent(hDlg), 0x07E6, TEXT("\n\n\n\n\n\n\n")); - SetTimer (GetParent(hDlg), 1000, 1000/8, NULL); - } - } - return CallWindowProc ((WNDPROC)procAbout, hDlg, msg, wp, lp); -} - - -void Help_About_OnInitDialog (HWND hDlg) -{ - HWND hAbout = GetDlgItem (hDlg, IDOK); - procAbout = (LONG)GetWindowLong (hAbout, GWL_WNDPROC); - SetWindowLong (hAbout, GWL_WNDPROC, (LONG)Help_About_Proc); - - LPTSTR pszText = FormatString (IDS_HELPABOUT_DESC1); - SetDlgItemText (hDlg, IDC_HELPABOUT_DESC, pszText); - FreeString (pszText); -} - - -void Help_About_OnSysCommand (HWND hDlg, int &cmd) -{ - DWORD dw; - TCHAR szSys[cchRESOURCE]; - TCHAR szSys2[cchRESOURCE]; - GetDlgItemText (hDlg, 0x07E6, szSys, cchRESOURCE); - if ((dw = NextSearch (cmd)) != 0) - { - for (LPTSTR psz = &szSys[ lstrlen(szSys)-1 ]; *(psz-1) != TEXT('\n'); --psz); - lstrcpy (szSys2, psz); - wsprintf (psz, TEXT("%c%s"), (TCHAR)dw, szSys2); - SetDlgItemText (hDlg, 0x07E6, szSys); - } - else // (dw == 0) - { - for (LPTSTR psz = szSys; *psz && (*psz != TEXT('\n')); ++psz); - wsprintf (szSys2, TEXT("%s\n"), 1+psz); - SetDlgItemText (hDlg, 0x07E6, szSys2); - } -} - - - -/* - * CONTEXT HELP _____________________________________________________________ - * - */ - -static DWORD IDD_OPENCELL_HELP[] = { - IDC_OPENCELL_CELL, IDH_USRMGR_OPENCELL_CELL, - IDC_OPENCELL_OLDCREDS, IDH_USRMGR_OPENCELL_ID_OLD, - IDC_OPENCELL_ID, IDH_USRMGR_OPENCELL_ID_NEW, - IDC_OPENCELL_PASSWORD, IDH_USRMGR_OPENCELL_PASSWORD, - 0, 0 -}; - -static DWORD IDD_COLUMNS_HELP[] = { - IDC_COLUMNS, IDH_USRMGR_COLUMNS_WHICH, - IDC_COL_AVAIL, IDH_USRMGR_COLUMNS_AVAIL, - IDC_COL_SHOWN, IDH_USRMGR_COLUMNS_SHOWN, - IDC_COL_INSERT, IDH_USRMGR_COLUMNS_INSERT, - IDC_COL_DELETE, IDH_USRMGR_COLUMNS_DELETE, - IDC_COL_UP, IDH_USRMGR_COLUMNS_MOVEUP, - IDC_COL_DOWN, IDH_USRMGR_COLUMNS_MOVEDOWN, - 0, 0 -}; - -static DWORD IDD_USER_GENERAL_HELP[] = { - IDC_USER_CPW_NOW, IDH_USRMGR_USER_GENERAL_CPW_NOW, - IDC_USER_CPW, IDH_USRMGR_USER_GENERAL_CPW, - IDC_USER_RPW, IDH_USRMGR_USER_GENERAL_RPW, - IDC_USER_PWEXPIRES, IDH_USRMGR_USER_GENERAL_PWEXPIRES, - IDC_USER_PWEXPIRATION, IDH_USRMGR_USER_GENERAL_PWEXPIRATION, - IDC_USER_FAILLOCK, IDH_USRMGR_USER_GENERAL_FAILLOCK, - IDC_USER_FAILLOCK_COUNT, IDH_USRMGR_USER_GENERAL_FAILLOCK_COUNT, - IDC_USER_FAILLOCK_INFINITE, IDH_USRMGR_USER_GENERAL_FAILLOCK_INFINITE, - IDC_USER_FAILLOCK_FINITE, IDH_USRMGR_USER_GENERAL_FAILLOCK_FINITE, - IDC_USER_FAILLOCK_DURATION, IDH_USRMGR_USER_GENERAL_FAILLOCK_DURATION, - IDC_USER_UNLOCK, IDH_USRMGR_USER_GENERAL_UNLOCK, - IDC_USER_EXPIRES, IDH_USRMGR_USER_GENERAL_EXPIRES, - IDC_USER_EXPIRE_DATE, IDH_USRMGR_USER_GENERAL_EXPIRE_DATE, - IDC_USER_EXPIRE_TIME, IDH_USRMGR_USER_GENERAL_EXPIRE_TIME, - 0, 0 -}; - -static DWORD IDD_USER_ADVANCED_HELP[] = { - IDC_USER_NAME, IDH_USRMGR_USER_ADVANCED_NAME, - IDC_USER_NOSEAL, IDH_USRMGR_USER_ADVANCED_NOSEAL, - IDC_USER_ADMIN, IDH_USRMGR_USER_ADVANCED_ADMIN, - IDC_USER_TGS, IDH_USRMGR_USER_ADVANCED_TGS, - IDC_USER_LIFETIME, IDH_USRMGR_USER_ADVANCED_LIFETIME, - IDC_USER_GROUP_HASQUOTA, IDH_USRMGR_USER_ADVANCED_GROUP_HASQUOTA, - IDC_USER_GROUP_QUOTA, IDH_USRMGR_USER_ADVANCED_GROUP_QUOTA, - IDC_USER_PERM_STATUS, IDH_USRMGR_USER_ADVANCED_PERM_STATUS, - IDC_USER_PERM_OWNED, IDH_USRMGR_USER_ADVANCED_PERM_OWNED, - IDC_USER_PERM_MEMBER, IDH_USRMGR_USER_ADVANCED_PERM_MEMBER, - IDC_USER_CREATE_KAS, IDH_USRMGR_USER_ADVANCED_CREATE_KAS, - IDC_USER_CREATE_PTS, IDH_USRMGR_USER_ADVANCED_CREATE_PTS, - IDC_USER_KEY, IDH_USRMGR_USER_ADVANCED_KEY, - 0, 0 -}; - -static DWORD IDD_USER_MEMBER_HELP[] = { - IDC_GROUPS_LIST, IDH_USRMGR_USER_MEMBER_LIST, - IDC_MEMBER_REMOVE, IDH_USRMGR_USER_MEMBER_REMOVE, - IDC_MEMBER_ADD, IDH_USRMGR_USER_MEMBER_ADD, - IDC_USER_SHOW_MEMBER, IDH_USRMGR_USER_MEMBER_SHOWMEMBER, - IDC_USER_SHOW_OWNER, IDH_USRMGR_USER_MEMBER_SHOWOWNER, - 0, 0 -}; - -static DWORD IDD_GROUP_GENERAL_HELP[] = { - IDC_GROUP_NAME, IDH_USRMGR_GROUP_GENERAL_NAME, - IDC_GROUP_PERM_STATUS, IDH_USRMGR_GROUP_GENERAL_PERM_STATUS, - IDC_GROUP_PERM_GROUPS, IDH_USRMGR_GROUP_GENERAL_PERM_GROUPS, - IDC_GROUP_PERM_MEMBERS, IDH_USRMGR_GROUP_GENERAL_PERM_MEMBERS, - IDC_GROUP_PERM_ADD, IDH_USRMGR_GROUP_GENERAL_PERM_ADD, - IDC_GROUP_PERM_REMOVE, IDH_USRMGR_GROUP_GENERAL_PERM_REMOVE, - IDC_GROUP_OWNER, IDH_USRMGR_GROUP_GENERAL_OWNER, - IDC_GROUP_CREATOR, IDH_USRMGR_GROUP_GENERAL_CREATOR, - IDC_GROUP_CHANGEOWNER, IDH_USRMGR_GROUP_GENERAL_CHANGEOWNER, - 0, 0 -}; - -static DWORD IDD_GROUP_MEMBER_HELP[] = { - IDC_USERS_LIST, IDH_USRMGR_GROUP_MEMBER_LIST, - IDC_MEMBER_REMOVE, IDH_USRMGR_GROUP_MEMBER_REMOVE, - IDC_MEMBER_ADD, IDH_USRMGR_GROUP_MEMBER_ADD, - IDC_GROUP_SHOW_MEMBER, IDH_USRMGR_GROUP_MEMBER_SHOWMEMBER, - IDC_GROUP_SHOW_OWNER, IDH_USRMGR_GROUP_MEMBER_SHOWOWNER, - 0, 0 -}; - -static DWORD IDD_MACHINE_ADVANCED_HELP[] = { - IDC_USER_NAME, IDH_USRMGR_MACHINE_ADVANCED_NAME, - IDC_USER_GROUP_HASQUOTA, IDH_USRMGR_MACHINE_ADVANCED_GROUP_HASQUOTA, - IDC_USER_GROUP_QUOTA, IDH_USRMGR_MACHINE_ADVANCED_GROUP_QUOTA, - IDC_USER_PERM_STATUS, IDH_USRMGR_MACHINE_ADVANCED_PERM_STATUS, - IDC_USER_PERM_OWNED, IDH_USRMGR_MACHINE_ADVANCED_PERM_OWNED, - IDC_USER_PERM_MEMBER, IDH_USRMGR_MACHINE_ADVANCED_PERM_MEMBER, - 0, 0 -}; - -static DWORD IDD_MACHINE_MEMBER_HELP[] = { - IDC_GROUPS_LIST, IDH_USRMGR_MACHINE_MEMBER_LIST, - IDC_MEMBER_REMOVE, IDH_USRMGR_MACHINE_MEMBER_REMOVE, - IDC_MEMBER_ADD, IDH_USRMGR_MACHINE_MEMBER_ADD, - IDC_USER_SHOW_MEMBER, IDH_USRMGR_MACHINE_MEMBER_SHOWMEMBER, - IDC_USER_SHOW_OWNER, IDH_USRMGR_MACHINE_MEMBER_SHOWOWNER, - 0, 0 -}; - -static DWORD IDD_CREDENTIALS_HELP[] = { - IDC_CREDS_CELL, IDH_USRMGR_CREDS_CELL, - IDC_CREDS_CURRENTID, IDH_USRMGR_CREDS_CURRENTID, - IDC_CREDS_EXPDATE, IDH_USRMGR_CREDS_EXPDATE, - IDC_CREDS_LOGIN, IDH_USRMGR_CREDS_LOGIN, - IDC_CREDS_ID, IDH_USRMGR_CREDS_AFS_ID, - IDC_CREDS_PASSWORD, IDH_USRMGR_CREDS_AFS_PASSWORD, - 0, 0 -}; - -static DWORD IDD_BADCREDS_HELP[] = { - IDC_BADCREDS_SHUTUP, IDH_USRMGR_BADCREDS_SHUTUP, - IDOK, IDH_USRMGR_BADCREDS_YES, - IDCANCEL, IDH_USRMGR_BADCREDS_NO, - 0, 0 -}; - -static DWORD IDD_BROWSE_JOIN_HELP[] = { - IDC_BROWSE_NAMED, IDH_USRMGR_BROWSE_JOIN_NAMES, - IDC_BROWSE_CHECK, IDH_USRMGR_BROWSE_JOIN_LIMIT, - IDC_BROWSE_CELL, IDH_USRMGR_BROWSE_JOIN_CELL, - IDC_BROWSE_LIST, IDH_USRMGR_BROWSE_JOIN_LIST, - IDC_BROWSE_SELECT, IDH_USRMGR_BROWSE_JOIN_OK, - IDCANCEL, IDH_USRMGR_BROWSE_JOIN_CANCEL, - 0, 0 -}; - -static DWORD IDD_BROWSE_OWN_HELP[] = { - IDC_BROWSE_NAMED, IDH_USRMGR_BROWSE_OWN_NAMES, - IDC_BROWSE_CHECK, IDH_USRMGR_BROWSE_OWN_LIMIT, - IDC_BROWSE_CELL, IDH_USRMGR_BROWSE_OWN_CELL, - IDC_BROWSE_LIST, IDH_USRMGR_BROWSE_OWN_LIST, - IDC_BROWSE_SELECT, IDH_USRMGR_BROWSE_OWN_OK, - IDCANCEL, IDH_USRMGR_BROWSE_OWN_CANCEL, - 0, 0 -}; - -static DWORD IDD_BROWSE_MEMBER_HELP[] = { - IDC_BROWSE_NAMED, IDH_USRMGR_BROWSE_MEMBER_NAMES, - IDC_BROWSE_CHECK, IDH_USRMGR_BROWSE_MEMBER_LIMIT, - IDC_BROWSE_CELL, IDH_USRMGR_BROWSE_MEMBER_CELL, - IDC_BROWSE_LIST, IDH_USRMGR_BROWSE_MEMBER_LIST, - IDC_BROWSE_SELECT, IDH_USRMGR_BROWSE_MEMBER_OK, - IDC_BROWSE_COMBO, IDH_USRMGR_BROWSE_MEMBER_COMBO, - IDCANCEL, IDH_USRMGR_BROWSE_MEMBER_CANCEL, - 0, 0 -}; - -static DWORD IDD_USER_PASSWORD_HELP[] = { - IDC_CPW_VERSION_AUTO, IDH_USRMGR_USER_PASSWORD_VERSION_AUTO, - IDC_CPW_VERSION_MANUAL, IDH_USRMGR_USER_PASSWORD_VERSION_MANUAL, - IDC_CPW_VERSION, IDH_USRMGR_USER_PASSWORD_VERSION, - IDC_CPW_BYSTRING, IDH_USRMGR_USER_PASSWORD_BYSTRING, - IDC_CPW_STRING, IDH_USRMGR_USER_PASSWORD_STRING, - IDC_CPW_BYDATA, IDH_USRMGR_USER_PASSWORD_BYDATA, - IDC_CPW_DATA, IDH_USRMGR_USER_PASSWORD_DATA, - IDC_CPW_RANDOM, IDH_USRMGR_USER_PASSWORD_RANDOM, - 0, 0 -}; - -static DWORD IDD_GROUP_RENAME_HELP[] = { - IDC_RENAME_OLDNAME, IDH_USRMGR_GROUP_RENAME_OLDNAME, - IDC_RENAME_NEWNAME, IDH_USRMGR_GROUP_RENAME_NEWNAME, - IDC_RENAME_OWNER, IDH_USRMGR_GROUP_RENAME_OWNER, - IDC_RENAME_CHOWN, IDH_USRMGR_GROUP_RENAME_CHOWN, - 0, 0 -}; - -static DWORD IDD_BROWSE_OWNER_HELP[] = { - IDC_BROWSE_NAMED, IDH_USRMGR_BROWSE_OWNER_NAMES, - IDC_BROWSE_CELL, IDH_USRMGR_BROWSE_OWNER_CELL, - IDC_BROWSE_LIST, IDH_USRMGR_BROWSE_OWNER_LIST, - IDC_BROWSE_SELECT, IDH_USRMGR_BROWSE_OWNER_OK, - IDC_BROWSE_COMBO, IDH_USRMGR_BROWSE_OWNER_COMBO, - IDCANCEL, IDH_USRMGR_BROWSE_OWNER_CANCEL, - 0, 0 -}; - -static DWORD IDD_BROWSE_OWNED_HELP[] = { - IDC_BROWSE_NAMED, IDH_USRMGR_BROWSE_OWNED_NAMES, - IDC_BROWSE_CHECK, IDH_USRMGR_BROWSE_OWNED_LIMIT, - IDC_BROWSE_CELL, IDH_USRMGR_BROWSE_OWNED_CELL, - IDC_BROWSE_LIST, IDH_USRMGR_BROWSE_OWNED_LIST, - IDC_BROWSE_SELECT, IDH_USRMGR_BROWSE_OWNED_OK, - IDCANCEL, IDH_USRMGR_BROWSE_OWNED_CANCEL, - 0, 0 -}; - -static DWORD IDD_NEWUSER_HELP[] = { - IDC_NEWUSER_NAME, IDH_USRMGR_NEWUSER_NAME, - IDC_NEWUSER_PW1, IDH_USRMGR_NEWUSER_PW1, - IDC_NEWUSER_PW2, IDH_USRMGR_NEWUSER_PW2, - IDC_NEWUSER_ID_AUTO, IDH_USRMGR_NEWUSER_ID_AUTO, - IDC_NEWUSER_ID_MANUAL, IDH_USRMGR_NEWUSER_ID_MANUAL, - IDC_NEWUSER_ID, IDH_USRMGR_NEWUSER_ID, - IDC_ADVANCED, IDH_USRMGR_NEWUSER_ADVANCED, - 0, 0 -}; - -static DWORD IDD_NEWGROUP_HELP[] = { - IDC_NEWGROUP_NAME, IDH_USRMGR_NEWGROUP_NAME, - IDC_NEWGROUP_ID_AUTO, IDH_USRMGR_NEWGROUP_ID_AUTO, - IDC_NEWGROUP_ID_MANUAL, IDH_USRMGR_NEWGROUP_ID_MANUAL, - IDC_NEWGROUP_ID, IDH_USRMGR_NEWGROUP_ID, - IDC_ADVANCED, IDH_USRMGR_NEWGROUP_ADVANCED, - 0, 0 -}; - -static DWORD IDD_NEWMACHINE_HELP[] = { - IDC_NEWUSER_NAME, IDH_USRMGR_NEWMACHINE_NAME, - IDC_NEWUSER_ID_AUTO, IDH_USRMGR_NEWMACHINE_ID_AUTO, - IDC_NEWUSER_ID_MANUAL, IDH_USRMGR_NEWMACHINE_ID_MANUAL, - IDC_NEWUSER_ID, IDH_USRMGR_NEWMACHINE_ID, - IDC_ADVANCED, IDH_USRMGR_NEWMACHINE_ADVANCED, - 0, 0 -}; - -static DWORD IDD_USER_DELETE_HELP[] = { - IDOK, IDH_USRMGR_USER_DELETE_OK, - IDCANCEL, IDH_USRMGR_USER_DELETE_CANCEL, - IDC_DELETE_KAS, IDH_USRMGR_USER_DELETE_KAS, - IDC_DELETE_PTS, IDH_USRMGR_USER_DELETE_PTS, - 0, 0 -}; - -static DWORD IDD_GROUP_DELETE_HELP[] = { - IDOK, IDH_USRMGR_GROUP_DELETE_OK, - IDCANCEL, IDH_USRMGR_GROUP_DELETE_CANCEL, - 0, 0 -}; - -static DWORD IDD_MACHINE_DELETE_HELP[] = { - IDOK, IDH_USRMGR_MACHINE_DELETE_OK, - IDCANCEL, IDH_USRMGR_MACHINE_DELETE_CANCEL, - 0, 0 -}; - -static DWORD IDD_CELL_GENERAL_HELP[] = { - IDC_CELL_USERMAX, IDH_USRMGR_CELL_GENERAL_USERMAX, - IDC_CELL_GROUPMAX, IDH_USRMGR_CELL_GENERAL_GROUPMAX, - 0, 0 -}; - -static DWORD IDD_OPTIONS_HELP[] = { - IDC_REGEXP_UNIX, IDH_USRMGR_OPTIONS_REGEXP_UNIX, - IDC_REGEXP_WINDOWS, IDH_USRMGR_OPTIONS_REGEXP_WINDOWS, - IDC_REFRESH, IDH_USRMGR_OPTIONS_REFRESH, - IDC_REFRESH_RATE, IDH_USRMGR_OPTIONS_REFRESH_RATE, - 0, 0 -}; - -static DWORD IDD_SEARCH_USERS_HELP[] = { - IDC_SEARCH_ALL, IDH_USRMGR_SEARCH_USERS_SHOWALL, - IDC_SEARCH_EXPIRE, IDH_USRMGR_SEARCH_USERS_SHOWEXPIRE, - IDC_SEARCH_EXPIRE_DATE, IDH_USRMGR_SEARCH_USERS_EXPIREDATE, - IDC_SEARCH_PWEXPIRE, IDH_USRMGR_SEARCH_USERS_SHOWPWEXPIRE, - IDC_SEARCH_PWEXPIRE_DATE, IDH_USRMGR_SEARCH_USERS_PWEXPIREDATE, - 0, 0 -}; - - -void Main_ConfigureHelp (void) -{ - AfsAppLib_RegisterHelpFile (cszHELPFILENAME); - - AfsAppLib_RegisterHelp (IDD_APPLIB_OPENCELL, IDD_OPENCELL_HELP, IDH_USRMGR_OPENCELL_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_COLUMNS, IDD_COLUMNS_HELP, IDH_USRMGR_COLUMNS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_USER_GENERAL, IDD_USER_GENERAL_HELP, IDH_USRMGR_PROP_USER_GENERAL_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_USER_ADVANCED, IDD_USER_ADVANCED_HELP, IDH_USRMGR_PROP_USER_ADVANCED_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_USER_MEMBER, IDD_USER_MEMBER_HELP, IDH_USRMGR_PROP_USER_MEMBER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_GROUP_GENERAL, IDD_GROUP_GENERAL_HELP, IDH_USRMGR_PROP_GROUP_GENERAL_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_GROUP_MEMBER, IDD_GROUP_MEMBER_HELP, IDH_USRMGR_PROP_GROUP_MEMBER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_MACHINE_ADVANCED, IDD_MACHINE_ADVANCED_HELP, IDH_USRMGR_PROP_MACHINE_ADVANCED_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_MACHINE_MEMBER, IDD_MACHINE_MEMBER_HELP, IDH_USRMGR_PROP_MACHINE_MEMBER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_APPLIB_BADCREDS, IDD_BADCREDS_HELP, IDH_USRMGR_BADCREDS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_APPLIB_CREDENTIALS, IDD_CREDENTIALS_HELP, IDH_USRMGR_CREDENTIALS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_BROWSE_JOIN, IDD_BROWSE_JOIN_HELP, IDH_USRMGR_BROWSE_JOIN_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_BROWSE_OWN, IDD_BROWSE_OWN_HELP, IDH_USRMGR_BROWSE_OWN_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_BROWSE_MEMBER, IDD_BROWSE_MEMBER_HELP, IDH_USRMGR_BROWSE_MEMBER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_USER_PASSWORD, IDD_USER_PASSWORD_HELP, IDH_USRMGR_USER_PASSWORD_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_GROUP_RENAME, IDD_GROUP_RENAME_HELP, IDH_USRMGR_GROUP_RENAME_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_BROWSE_OWNER, IDD_BROWSE_OWNER_HELP, IDH_USRMGR_BROWSE_OWNER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_NEWUSER, IDD_NEWUSER_HELP, IDH_USRMGR_CREATE_USER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_NEWGROUP, IDD_NEWGROUP_HELP, IDH_USRMGR_CREATE_GROUP_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_NEWMACHINE, IDD_NEWMACHINE_HELP, IDH_USRMGR_CREATE_MACHINE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_USER_DELETE, IDD_USER_DELETE_HELP, IDH_USRMGR_DELETE_USER_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_GROUP_DELETE, IDD_GROUP_DELETE_HELP, IDH_USRMGR_DELETE_GROUP_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_MACHINE_DELETE, IDD_MACHINE_DELETE_HELP, IDH_USRMGR_DELETE_MACHINE_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_CELL_GENERAL, IDD_CELL_GENERAL_HELP, IDH_USRMGR_PROP_CELL_GENERAL_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_OPTIONS, IDD_OPTIONS_HELP, IDH_USRMGR_OPTIONS_OVERVIEW); - AfsAppLib_RegisterHelp (IDD_SEARCH_USERS, IDD_SEARCH_USERS_HELP, IDH_USRMGR_SEARCH_USERS_OVERVIEW); -} - diff --git a/src/WINNT/afsusrmgr/helpfunc.h b/src/WINNT/afsusrmgr/helpfunc.h deleted file mode 100644 index 1a87cd2fa..000000000 --- a/src/WINNT/afsusrmgr/helpfunc.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef HELPFUNC_H -#define HELPFUNC_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Help_FindCommand (void); -void Help_FindError (void); -void Help_About (void); - -void Main_ConfigureHelp (void); - - -#endif - diff --git a/src/WINNT/afsusrmgr/lang/.cvsignore b/src/WINNT/afsusrmgr/lang/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/afsusrmgr/lang/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/afsusrmgr/lang/NTMakefile b/src/WINNT/afsusrmgr/lang/NTMakefile deleted file mode 100644 index b82b55a94..000000000 --- a/src/WINNT/afsusrmgr/lang/NTMakefile +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\afsusrmgr\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.server\usr\afs\bin\TaAfsAccountManager_$(LANGID).dll - -RCFILE = $(LANGNAME)\AfsUsrMgr.rc - -RESFILE = $(OUT)\AfsUsrMgr_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist $(OUT)\*.res del $(OUT)\*.res - @if exist AFS_component_version_number.h del AFS_component_version_number.h - @if exist RC*. del RC*. - @if exist RD*. del RD*. - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/afsusrmgr/lang/de_DE/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/de_DE/AfsUsrMgr.rc deleted file mode 100644 index 316094957..000000000 --- a/src/WINNT/afsusrmgr/lang/de_DE/AfsUsrMgr.rc +++ /dev/null @@ -1,1798 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Account Manager" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS Account Manager" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,302,184 - LTEXT "Ausgewählte Zelle:",IDC_STATIC,4,7,61,8 - LTEXT "(keine ausgewählt)",IDC_CELL,71,7,206,8 - LTEXT "AFS-Token:",IDC_STATIC,4,18,55,8 - LTEXT "(keine Token)",IDC_CREDS,71,18,212,8 - ICON IDI_MAIN,IDC_ANIM,285,7,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,41,13,ES_AUTOHSCROLL - RTEXT "Muster:",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "Abfrage läuft; bitte warten...",IDC_USERS_TITLE,4,6,142, - 8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Erstellen...",M_USER_CREATE,65,126,55,14 - PUSHBUTTON "&Zugehörigkeit...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "Me&rkmale...",M_PROPERTIES,183,126,55,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Muster:",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "Abfrage läuft; bitte warten...",IDC_GROUPS_TITLE,4,6, - 142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Erstellen...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "&Mitglieder...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "Me&rkmale...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Laufende Operationen - AFS Account Manager" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Abfrage läuft; bitte warten...",IDC_ACTION_DESC,2,2,232, - 8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Informationen zu AFS Account Manager" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,21,20 - LTEXT "AFS Account Manager, Version 3.5",IDC_STATIC,33,8,189,8 - LTEXT "Copyright © IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "&Schließen",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Fehlercode suchen" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "F&ehlernummer:",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Überse&tzen",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "&Schließen",IDCANCEL,85,123,48,14 - LTEXT "(Text wird zur Laufzeit festgelegt)",IDC_ERROR_DESC,4, - 71,210,42 - LTEXT "Um die Bedeutung eines Fehlercodes festzustellen, geben Sie den Code unten ein und klicken dann auf ""Übersetzen"".", - IDC_STATIC,4,4,210,27 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Suchbefehl" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "&Hilfe anzeigen",IDOK,160,39,67,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,160,55,67,14 - LTEXT "Um festzustellen, wie Sie mit dem AFS Account Manager eine Aufgabe durchführen, wählen Sie unten eine Befehlszeile aus und klicken auf Hilfe anzeigen.", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Spalten" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Anzuzeigende Spalten au&swählen bei der Auflistung von:", - IDC_STATIC,5,5,126,16 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Verfügbare &Spalten:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Anzuzeigende Spalten:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Hinzufügen >>",IDC_COL_INSERT,117,68,51,14 - PUSHBUTTON "<< Entfe&rnen",IDC_COL_DELETE,117,88,51,14 - PUSHBUTTON "Nach &oben",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "Nach &unten",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "Spalten auflisten",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Erweitert" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Aktueller Schlüssel:",IDC_STATIC,5,5,40,8 - LTEXT "Abfrage läuft; bitte warten...",IDC_USER_KEY,52,5,173, - 20,0,WS_EX_STATICEDGE - CONTROL "Dies ist ein &Systemkonto (keine Verschlüsselung)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 35,180,10 - CONTROL "Benutzer besitzt Verw&altungsberechtigung", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 52,157,10 - CONTROL "Zu&griffsberechtigung erteilen; Lebenszeit:", - IDC_USER_TGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,69, - 144,10 - CONTROL "",IDC_USER_LIFETIME,"elapsed",WS_BORDER | WS_TABSTOP, - 153,68,66,12 - CONTROL "Gruppenerstellungs"e:",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,86,98,10 - EDITTEXT IDC_USER_GROUP_QUOTA,117,85,27,13,ES_AUTOHSCROLL - LTEXT "Konto&status anzeigen:",IDC_STATIC,12,135,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,133,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen anzeigen, deren &Eigner der Benutzer ist:", - IDC_STATIC,12,145,72,23 - COMBOBOX IDC_USER_PERM_OWNED,91,150,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen&zugehörigkeit anzeigen:",IDC_STATIC,12,171,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,168,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Andere Kontoberechtigungen",IDC_STATIC,5,103,220,89 - LTEXT "Diese Einstellungen geben an, welche Benutzer dieses Konto anzeigen können.", - IDC_STATIC,11,114,204,16 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION " Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Benutzer kann Kennwort ä&ndern",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,121,10 - PUSHBUTTON "&Kennwort ändern",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "Benutzer kann alte Kennwörter &wiederverwenden", - IDC_USER_RPW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,62, - 171,10 - CONTROL "K&ennwort läuft ab nach",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,87,10 - LTEXT "Tagen",IDC_STATIC,164,79,23,8 - EDITTEXT IDC_USER_PWEXPIRATION,119,77,37,13,ES_AUTOHSCROLL - CONTROL "Konto &läuft ab am:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,93, - 96,53,12 - LTEXT "u&m",IDC_USER_EXPIRE_AT,153,98,12,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,96,53,12 - CONTROL "Konto spe&rren nach",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,134,76,10 - LTEXT "aufeinanderfolgenden fehlerhaften Anmeldungen", - IDC_STATIC,129,132,86,16 - EDITTEXT IDC_USER_FAILLOCK_COUNT,90,134,32,13,ES_AUTOHSCROLL - CONTROL "Konto auf unbestimmte &Zeit sperren (bis Sperre vom Administrator aufgehoben wird)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,16,150,200,18 - CONTROL "Konto sperren &für",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,16,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"elapsed",WS_BORDER | - WS_TABSTOP,92,171,56,12 - PUSHBUTTON "Sperre a&ufheben",IDC_USER_UNLOCK,158,169,57,14 - GROUPBOX "Fehlerhafte Anmeldeversuche",IDC_STATIC,5,119,220,73 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Benutzer %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "Konto",IDC_STATIC,5,32,220,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION " Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "Gruppe %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "Konto&status anzeigen:",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,101,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Gruppen anzeigen, deren Eigner der Benutzer ist:", - IDC_STATIC,12,121,83,16 - COMBOBOX IDC_GROUP_PERM_GROUPS,101,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen&mitglied anzeigen:",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,101,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Mitglieder &hinzufügen:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,101,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Mitglieder entfe&rnen:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,101,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Andere Kontoberechtigungen",IDC_STATIC,5,77,220,114 - LTEXT "Diese Einstellungen geben an, welche Benutzer diese Gruppe anzeigen können.", - IDC_STATIC,11,87,204,16 - LTEXT "Eigner:",IDC_STATIC,5,31,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,31,113,8 - PUSHBUTTON "&Eigner ändern...",IDC_GROUP_CHANGEOWNER,159,29,66,12 - LTEXT "Ersteller:",IDC_STATIC,5,46,27,8 - LTEXT "%1",IDC_GROUP_CREATOR,37,46,113,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Gruppen" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Gruppen",IDC_STATIC,5,31,220,160 - LTEXT "Diese Einstellungen ermöglichen die Änderung der Liste der Gruppen, zu denen dieser Benutzer gehört, sowie der Liste der Gruppen, deren Eigner dieser Benutzer ist.", - IDC_STATIC,5,5,220,24 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Entfernen",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Hinzufügen...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Gruppen &anzeigen, zu denen dieser Benutzer gehört", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "Gruppen anzeigen, deren &Eigner dieser Benutzer ist", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Abfrage läuft; bitte warten...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Zugehörigkeit" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Gruppenzugehörigkeit",IDC_STATIC,5,31,220,160 - LTEXT "Diese Einstellungen ermöglichen die Auswahl der Mitglieder dieser Gruppe sowie die Auswahl der Gruppen, deren Eigner diese Gruppe sein soll.", - IDC_STATIC,5,3,220,23 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Entfernen",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Hinzufügen...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Mitglieder dieser Gruppe &anzeigen", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "Gruppen anzeigen, deren &Eigner diese Gruppe ist", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Abfrage läuft; bitte warten...)",IDC_USERS_TITLE,12,74, - 205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Dieser Titel wird zur Laufzeit festgelegt)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(Laufzeit)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Aus&wählen",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,224,129,50,14 - CONTROL "(Text wird zur Laufzeit festgelegt)",IDC_BROWSE_CHECK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,59,133,157,10 - RTEXT "In &Zelle suchen:",IDC_STATIC,4,8,54,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,64,6,132,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Muster:",IDC_GROUPS_PATTERN_PROMPT,198,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 281, 145 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Kontokennwort ändern" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Automatisch eine Versionsnummer für das neue Kennwort auswählen", - IDC_CPW_VERSION_AUTO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,42,36,230,10 - CONTROL "&Schlüsselversion verwenden:",IDC_CPW_VERSION_MANUAL, - "Button",BS_AUTORADIOBUTTON,42,52,106,10 - EDITTEXT IDC_CPW_VERSION,150,51,43,14,ES_AUTOHSCROLL - CONTROL "Diese Zeichenfolge verschlüsseln:",IDC_CPW_BYSTRING, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,29,78,122,10 - CONTROL "Diesen Schlüssel verwenden:",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,30,95,106,10 - EDITTEXT IDC_CPW_STRING,152,76,122,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,152,94,70,14,ES_AUTOHSCROLL - PUSHBUTTON "Wahlf&rei",IDC_CPW_RANDOM,226,94,48,14 - DEFPUSHBUTTON "OK",IDOK,116,124,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,170,124,50,14 - PUSHBUTTON "Hilfe",9,224,124,50,14 - LTEXT "Neues Kennwort für Benutzer %1",IDC_CPW_TITLE,43,14,228, - 8 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "Version:",-1,7,37,26,8 - LTEXT "Wert:",-1,7,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Gruppe umbenennen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Neuer Gruppen&name:",IDC_STATIC,30,103,71,8 - EDITTEXT IDC_RENAME_NEWNAME,109,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,109,129,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,163,129,50,14 - PUSHBUTTON "Hilfe",9,217,129,50,14 - LTEXT "Aktueller Eigner:",IDC_STATIC,30,65,55,8 - PUSHBUTTON "Eigner ä&ndern...",IDC_RENAME_CHOWN,198,63,69,14 - LTEXT "Aktueller Gruppenname:",IDC_STATIC,30,83,80,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "Gruppe %1 umbenennen",IDC_RENAME_TITLE,35,14,222,8 - LTEXT "Hinweis: Verfügt der Gruppenname über keinen Präfix, muß der Name den aktuellen Eigner der Gruppe präzise darstellen (z.B., ""Eigner:Gruppenname"").", - IDC_STATIC,33,30,217,26 - LTEXT "(Abfrage läuft)",IDC_RENAME_OWNER,109,65,82,8 - LTEXT "(Abfrage läuft)",IDC_RENAME_OLDNAME,109,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 281, 154 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Dieser Titel wird zur Laufzeit festgelegt)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(Laufzeit)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Aus&wählen",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,224,133,50,14 - RTEXT "Anzeigen:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "In &Zelle suchen:",IDC_STATIC,3,8,53,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,64,6,131,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Muster:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 281, 169 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Dieser Titel wird zur Laufzeit festgelegt)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(Laufzeit)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Aus&wählen",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,224,132,50,14 - RTEXT "Anzeigen:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(Text wird zur Laufzeit festgelegt)",IDC_BROWSE_CHECK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,59,151,181,10 - RTEXT "In &Zelle suchen:",IDC_STATIC,4,8,54,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,64,6,134,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Muster:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Gruppen" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Gruppen",IDC_STATIC,5,31,220,160 - LTEXT "Diese Einstellungen ermöglichen die Änderung der ersten Liste der Gruppen, zu denen dieser Benutzer gehören wird, sowie der Gruppen, deren Eigner dieser Benutzer wird.", - IDC_STATIC,5,4,220,24 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Entfernen",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Hinzufügen...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Gruppen &anzeigen, zu denen dieser Benutzer gehören wird", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 202,10 - CONTROL "Gruppen anzeigen, deren &Eigner dieser Benutzer wird", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Abfrage läuft; bitte warten...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 253, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Benutzer erstellen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Name:",IDC_STATIC,7,37,22,8 - EDITTEXT IDC_NEWUSER_NAME,54,35,127,14,ES_AUTOHSCROLL - LTEXT "&Kennwort:",IDC_STATIC,7,57,34,8 - EDITTEXT IDC_NEWUSER_PW1,54,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "(e&rneut eingeben:)",IDC_STATIC,7,73,47,17 - EDITTEXT IDC_NEWUSER_PW2,54,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "A&utomatisch nächste verfügbare Benutzer-ID verwenden", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON | BS_TOP | - BS_MULTILINE,50,97,192,16 - CONTROL "Be&stimmte Benutzer-ID verwenden:", - IDC_NEWUSER_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,50,117, - 124,10 - EDITTEXT IDC_NEWUSER_ID,178,116,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Gruppen...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "OK",IDOK,94,149,43,14 - PUSHBUTTON "Abbrechen",IDCANCEL,141,149,43,14 - PUSHBUTTON "Hilfe",9,203,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "Neuer Benutzer in Zelle %1",IDC_NEWUSER_TITLE,61,14,185, - 8 - LTEXT "Benutzer-ID:",IDC_STATIC,7,97,41,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION " Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "Neue Gruppe in Zelle %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "Konto&status anzeigen:",IDC_STATIC,12,102,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,100,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Gruppen anzeigen, deren Eigner der Benutzer ist:", - IDC_STATIC,12,114,67,23 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,119,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen&mitglieder anzeigen:",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Mitglieder &hinzufügen:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Mitglieder entfe&rnen:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Andere Kontoberechtigungen",IDC_STATIC,5,68,220,123 - LTEXT "Diese Einstellungen geben an, welche Benutzer Informationen über diese Gruppe anzeigen können.", - IDC_STATIC,11,80,204,17 - LTEXT "Eigner:",IDC_STATIC,5,35,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,35,113,8 - PUSHBUTTON "&Eigner ändern...",IDC_GROUP_CHANGEOWNER,159,33,66,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Zugehörigkeit" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Gruppenzugehörigkeit",IDC_STATIC,5,31,220,160 - LTEXT "Diese Einstellungen ermöglichen die Auswahl der ersten Mitglieder dieser Gruppe sowie die Auswahl der Gruppen, deren Eigner diese Gruppe sein soll.", - IDC_STATIC,5,3,220,24 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Entfernen",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Hinzufügen...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Erste Mitglider dieser Gruppe &anzeigen", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "Gruppen anzeigen, deren &Eigner diese Gruppe ist", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Abfrage läuft; bitte warten...)",IDC_USERS_TITLE,12,74, - 205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 238, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Gruppe erstellen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Name:",-1,7,37,22,8 - EDITTEXT IDC_NEWGROUP_NAME,46,35,127,14,ES_AUTOHSCROLL - CONTROL "A&utomatisch nächste verfügbare Gruppen-ID verwenden", - IDC_NEWGROUP_ID_AUTO,"Button",BS_AUTORADIOBUTTON | - BS_TOP | BS_MULTILINE,24,62,195,17 - CONTROL "Be&stimmte Gruppen-ID verwenden:", - IDC_NEWGROUP_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,24,81, - 126,10 - EDITTEXT IDC_NEWGROUP_ID,155,79,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Mitglieder...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "OK",IDOK,94,114,43,14 - PUSHBUTTON "Abbrechen",IDCANCEL,141,114,43,14 - PUSHBUTTON "Hilfe",9,188,114,43,14 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "Neue Gruppe in Zelle %1",IDC_NEWGROUP_TITLE,46,14,179, - 10 - LTEXT " Gruppen-ID:",-1,8,51,32,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Benutzer löschen" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,116,93,50,14 - DEFPUSHBUTTON "Abbrechen",IDCANCEL,170,93,50,14 - PUSHBUTTON "Hilfe",9,224,93,50,14 - LTEXT "Achtung!\n\nDiese Operation löscht das Konto für den Benutzer %1 auf Dauer.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,20,20 - CONTROL "&KAS-Datenbankeintrag für dieses Konto löschen", - IDC_DELETE_KAS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 53,208,10 - CONTROL "&PTS-Datenbankeintrag für dieses Konto löschen", - IDC_DELETE_PTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Gruppe löschen" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,116,61,50,14 - DEFPUSHBUTTON "Abbrechen",IDCANCEL,170,61,50,14 - PUSHBUTTON "Hilfe",9,224,61,50,14 - LTEXT "Achtung!\n\nDiese Operation löscht die Gruppe %1 auf Dauer.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,20,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION " Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Maximale &Benutzer-ID:",IDC_STATIC,11,87,76,8 - EDITTEXT IDC_CELL_USERMAX,102,85,40,14,ES_AUTOHSCROLL - LTEXT "Maximale &Gruppen-ID:",IDC_STATIC,11,105,80,8 - EDITTEXT IDC_CELL_GROUPMAX,102,103,40,14,ES_AUTOHSCROLL - GROUPBOX "Benutzer- und Gruppen-IDs",IDC_STATIC,5,31,220,97 - LTEXT "Diese Einstellungen zeigen die bisher höchsten verwendeten Benutzer- und Gruppen-IDs an. Sie können problemlos erhöht werden - allerdings nur dann verringert, wenn Sie sicher sind, daß die neuen Werte nicht zu Konflikten mit vorhandenen Konten führen.", - IDC_STATIC,11,43,204,40 - ICON 20035,IDC_STATIC,5,5,20,20 - LTEXT "Zelle %1",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION " Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Benutzer kann Kennwort ä&ndern",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,118,10 - PUSHBUTTON "&Kennwort ändern",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "Benutzer kann alte Kennwörter &wiederverwenden", - IDC_USER_RPW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,62, - 175,10 - CONTROL "K&ennwort läuft ab nach",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,87,10 - LTEXT "Tagen",IDC_STATIC,173,79,25,8 - EDITTEXT IDC_USER_PWEXPIRATION,115,77,37,13,ES_AUTOHSCROLL - CONTROL "Konto &läuft ab am:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,58,12 - LTEXT "u&m",IDC_USER_EXPIRE_AT,154,98,12,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 168,96,53,12 - CONTROL "Konto spe&rren nach",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,132,76,10 - LTEXT "aufeinanderfolgenden fehlerhaften Anmeldungen", - IDC_STATIC,137,130,83,18 - EDITTEXT IDC_USER_FAILLOCK_COUNT,90,131,32,13,ES_AUTOHSCROLL - CONTROL "Konto auf unbestimmte &Zeit sperren (bis Sperre vom Administrator aufgehoben wird)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,15,149,203,17 - CONTROL "Konto sperren &für",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,15,170,68,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"elapsed",WS_BORDER | - WS_TABSTOP,91,170,51,12 - PUSHBUTTON "Sperre a&ufheben",IDC_USER_UNLOCK,155,168,62,14 - GROUPBOX "Fehlerhafte Anmeldeversuche",IDC_STATIC,5,120,220,73 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Neuer Benutzer in Zelle %1",IDC_USER_NAME,37,13,181,8 - GROUPBOX "Konto",IDC_STATIC,5,32,220,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Erweitert" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&KAS-Datenbankeintrag für dieses Konto erstellen (empfohlen)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,210,11 - CONTROL "&PTS-Datenbankeintrag für dieses Konto erstellen (empfohlen)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,210,10 - CONTROL "Dieses Konto wird ein &Systemkonto (keine Verschlüsselung)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 40,207,10 - CONTROL "Benutzer verfügt über Verw&altungsberechtigung", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 57,180,10 - CONTROL "Zu&griffsberechtigung erteilen; Lebenszeit:", - IDC_USER_TGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,74, - 142,10 - CONTROL "",IDC_USER_LIFETIME,"elapsed",WS_BORDER | WS_TABSTOP, - 151,73,66,12 - CONTROL "Gruppenerstellungs"e:",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,91,94,10 - EDITTEXT IDC_USER_GROUP_QUOTA,111,90,27,13,ES_AUTOHSCROLL - LTEXT "Konto&status anzeigen:",-1,12,136,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,134,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen anzeigen, deren &Eigner der Benutzer ist:",-1, - 12,148,60,24 - COMBOBOX IDC_USER_PERM_OWNED,91,151,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen&zugehörigkeit anzeigen:",-1,12,174,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,172,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Andere Kontoberechtigungen",-1,5,105,220,87 - LTEXT "Diese Einstellungen geben an, welche Benutzer dieses Konto anzeigen können.", - -1,11,117,204,16 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Muster:",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "Abfrage läuft; bitte warten...",IDC_MACHINES_TITLE,4,6, - 142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Erstellen...",M_MACHINE_CREATE,65,126,55,14 - PUSHBUTTON "&Zugehörigkeit...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "Me&rkmale...",M_PROPERTIES,183,126,55,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Gruppen" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Gruppen",IDC_STATIC,5,33,220,158 - LTEXT "Diese Einstellungen ermöglichen die Änderung der ersten Liste der Gruppen, zu denen dieses Konto gehören wird, sowie der Gruppen, deren Eigner dieses Konto wird.", - IDC_STATIC,5,5,220,24,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Entfernen",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Hinzufügen...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Gruppen &anzeigen, zu denen dieses Konto gehören wird", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "Gruppen anzeigen, deren &Eigner dieses Konto wird", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Abfrage läuft; bitte warten...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Erweitert" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Konto&status anzeigen:",IDC_STATIC,12,90,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,84,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen anzeigen, deren &Eigner der Benutzer ist:", - IDC_STATIC,12,100,60,24 - COMBOBOX IDC_USER_PERM_OWNED,91,105,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen&zugehörigkeit anzeigen:",IDC_STATIC,12,128,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,126,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Andere Kontoberechtigungen",IDC_STATIC,5,48,220,100 - LTEXT "Diese Einstellungen geben an, welche Benutzer dieses Konto anzeigen können.", - IDC_STATIC,11,64,204,16 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "Neues IP-Adreßkonto in Zelle %1",IDC_USER_NAME,37,13, - 188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 247, 126 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "IP-Adreßkonto erstellen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "IP-&Adresse:",-1,7,37,37,8 - EDITTEXT IDC_NEWUSER_NAME,50,35,127,14,ES_AUTOHSCROLL - CONTROL "A&utomatisch nächste verfügbare Konten-ID verwenden", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON | BS_TOP | - BS_MULTILINE,49,60,191,16 - CONTROL "Be&stimmte Konten-ID verwenden:",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,49,79,117,10 - EDITTEXT IDC_NEWUSER_ID,171,77,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Gruppen...",IDC_ADVANCED,7,105,54,14 - DEFPUSHBUTTON "OK",IDOK,103,105,43,14 - PUSHBUTTON "Abbrechen",IDCANCEL,151,105,43,14 - PUSHBUTTON "Hilfe",9,197,105,43,14 - ICON IDI_SERVER,-1,7,6,20,20 - LTEXT "Neues IP-Adreßkonto in Zelle %1",IDC_NEWUSER_TITLE,50, - 14,190,8 - LTEXT "Konten-ID:",-1,7,60,39,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "IP-Adreßkonto löschen" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,153,63,50,14 - DEFPUSHBUTTON "Abbrechen",IDCANCEL,207,63,50,14 - PUSHBUTTON "Hilfe",9,261,63,50,14 - LTEXT "Achtung!\n\nDiese Operation löscht das IP-Adreßkonto %1 auf Dauer.", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Erweitert" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Konto&status anzeigen:",IDC_STATIC,12,81,67,8 - COMBOBOX IDC_USER_PERM_STATUS,101,78,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen anzeigen, deren &Eigner der Benutzer ist:", - IDC_STATIC,12,94,69,23 - COMBOBOX IDC_USER_PERM_OWNED,101,97,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Gruppen&zugehörigkeit anzeigen:",IDC_STATIC,12,123,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,101,120,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Andere Kontoberechtigungen",IDC_STATIC,5,41,220,109 - LTEXT "Diese Einstellungen geben an, welche Benutzer dieses Konto anzeigen können.", - IDC_STATIC,11,58,204,16 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "IP-Adreßkonto %1",IDC_USER_NAME,37,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Gruppen" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Gruppen",IDC_STATIC,5,31,220,160 - LTEXT "Diese Einstellungen ermöglichen die Änderung der Liste der Gruppen, zu denen dieses Konto gehört, sowie der Liste der Gruppen, deren Eigner dieses Konto ist.", - IDC_STATIC,5,5,220,25,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Entfernen",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Hinzufügen...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Gruppen &anzeigen, zu denen dieses Konto gehört", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "Gruppen anzeigen, deren &Eigner dieses Konto ist", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 200,10 - LTEXT "(Abfrage läuft; bitte warten...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 258, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Optionen" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Reguläre Ausdrücke im &Unix-Format verwenden (""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,11,51,229,17 - CONTROL "Reguläre Ausdrücke im &Windows-Format verwenden (""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,11,70,226,16 - CONTROL "Warnung anzeigen, wenn ohne Verwaltungstoken gearbeitet wird", - IDC_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,11,112,220,15 - CONTROL "Informationen &automatisch aktualisieren alle", - IDC_REFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,134, - 150,10 - LTEXT "Minuten",IDC_STATIC,211,135,25,8 - EDITTEXT IDC_REFRESH_RATE,163,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,21,20 - LTEXT "AFS Account Manager-Optionen",IDC_STATIC,37,12,96,8 - GROUPBOX "Reguläre Ausdrücke",IDC_STATIC,5,37,248,57 - GROUPBOX " Allgemein",IDC_STATIC,5,100,248,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 284, 129 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Anzuzeigende Benutzer auswählen" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Einträge für &alle Benutzerkonten anzeigen", - IDC_SEARCH_ALL,"Button",BS_AUTORADIOBUTTON,20,40,150,10 - CONTROL "Nur Benutzerkonten anzeigen, die ablauf&en vor", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON,20,55,165, - 10 - CONTROL "Nur Konten anzeigen, deren Kennwörter ablauf&en vor", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON,20,70, - 182,10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Datum",WS_BORDER | WS_TABSTOP, - 192,54,61,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Datum",WS_BORDER | - WS_TABSTOP,212,69,61,12 - DEFPUSHBUTTON "OK",IDOK,119,108,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,173,108,50,14 - PUSHBUTTON "Hilfe",9,227,108,50,14 - LTEXT "Diese Steuerelemente ermöglichen die Angabe, welche Benutzer auf dem Register Benutzer angezeigt werden. Diese Benutzerliste läßt sich weiter einschränken, indem Sie im Steuerelement Muster einen unvollständigen Kontennamen eingeben.", - IDC_STATIC,7,6,270,27 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 138 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 147 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 162 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - TOPMARGIN, 6 - BOTTOMMARGIN, 119 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 253 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 277 - TOPMARGIN, 6 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Account Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Zelle" - BEGIN - MENUITEM "Au&swählen...", M_OPENCELL - MENUITEM "&Authentifizierung...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "Zellenme&rkmale...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "E&xit", M_EXIT - END - POPUP "&Editieren" - BEGIN - MENUITEM "&Benutzer erstellen...", M_USER_CREATE - MENUITEM "&Gruppe erstellen...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Umbe&nennen...", M_RENAME - MENUITEM "&Löschen...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "&Alle auswählen\tStrg+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "A&ktualisieren\tF5", M_REFRESH - MENUITEM "&Zugehörigkeit...\tStrg+M", M_MEMBERSHIP - MENUITEM "Me&rkmale\tAlt+Eingabetaste", M_PROPERTIES - END - POPUP "&Anzeige" - BEGIN - POPUP "&Symbole" - BEGIN - MENUITEM "&Große Symbole", M_VIEW_LARGE, CHECKED - MENUITEM "&Kleine Symbole", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWO, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "Laufende O&perationen", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Spalten...", M_COLUMNS - MENUITEM "&Optionen...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Alle a&ktualisieren", M_REFRESHALL - END - POPUP "&Hilfe" - BEGIN - MENUITEM "&Inhalt", M_CONTENTS - MENUITEM "Befehl &suchen...", M_FIND - MENUITEM "&Fehlercode suchen...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "Informationen zu &AFS Account Manager...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "&Große Symbole", M_VIEW_LARGE, CHECKED - MENUITEM "&Kleine Symbole", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWO, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Benutzer erstellen...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "Alle a&ktualisieren", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "&Große Symbole", M_VIEW_LARGE, CHECKED - MENUITEM "&Kleine Symbole", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWO, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Gruppe erstellen...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Alle a&ktualisieren", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "&Gruppen...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Kennwort ändern...", M_CPW - MENUITEM "Sperre a&ufheben", M_UNLOCK - MENUITEM "&Löschen...", M_DELETE - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "Me&rkmale...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "Gruppen&mitglieder...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "Umbe&nennen...", M_RENAME - MENUITEM "&Löschen...", M_DELETE - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "Me&rkmale...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Spalten...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "&Anzeige" - BEGIN - MENUITEM "&Große Symbole", M_VIEW_LARGE, CHECKED - MENUITEM "&Kleine Symbole", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Alle Symbole", M_VIEW_TWO, CHECKED - MENUITEM "Nur &Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Konto erstellen...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "Alle a&ktualisieren", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "&Gruppen...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Löschen...", M_DELETE - MENUITEM "A&ktualisieren", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "Me&rkmale...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "Z", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS Account Manager" - IDS_USRCOL_NAME "Benutzername" - IDS_GRPCOL_NAME "Gruppenname" - IDS_BADCREDS_DESC "Wenn Sie nicht als Administrator angemeldet sind, besitzen Sie eventuell keine ausreichenden Berechtigungen, die Zelle %1 zu verwalten." - IDS_TAB_USERS "Benutzer" - IDS_TAB_GROUPS "Gruppen" - IDS_CELL_NONE "(keine Zelle ausgewählt)" - IDS_CRED_NONE "(keine Token in dieser Zelle)" - IDS_CRED_EXP "%1 (Token abgelaufen %2)" - IDS_CRED_OK "%1 (Token laufen ab %2)" - IDS_USERS_ALL "Alle Benutzer in Zelle %1:" - IDS_USERS_PATTERN "Ausgewählte Benutzer in Zelle %1:" - IDS_GROUPS_ALL "Alle Gruppen in Zelle %1:" - IDS_GROUPS_PATTERN "Ausgewählte Gruppen in Zelle %1:" - IDS_QUERYING_LONG "Abfrage läuft; bitte warten..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "Momentan laufen keine Operationen." - IDS_ACTION_DESC_ONE "Momentan läuft die folgende Operation:" - IDS_ACTION_DESC_MULT "Momentan laufen die folgenden Operationen:" - IDS_ACTCOL_OPERATION "Operation" - IDS_ACTCOL_ELAPSED "Abgelaufene Zeit" - IDS_ACTION_REFRESH_CELL "Informationen für Zelle %1 werden aktualisiert" - IDS_ACTION_REFRESH_SERVER - "Informationen für Server %1 werden aktualisiert" - IDS_ACTION_SCOUT_CELL "Zelle %1 wird auf Probleme untersucht" - IDS_ACTION_SCOUT_SERVER "Server %1 wird auf Probleme untersucht" - IDS_FIND_NOTHING_TITLE "Kein Befehl ausgewählt" - IDS_FIND_NOTHING_DESC "Um festzustellen, wie eine Operation durchgeführt wird, wählen Sie zunächst eine Befehlszeile aus der Liste aus, oder geben Sie ein Schlüsselwort ein." - IDS_FIND_UNKNOWN_TITLE "Unbekannter Befehl" - IDS_FIND_UNKNOWN_DESC "Der AFS Account Manager konnte für den Befehl ""%1"" keine Hilfethemen finden." - IDS_HELPABOUT_DESC1 "Achtung: Dieses Computerprogramm ist durch Copyright und internationale Verträge geschützt. +" - IDS_HELPABOUT_DESC2 "Die unbefugte Kopie oder Verteilung dieser Software kann zu schwerwiegenden zivil- und strafrechtlichen Maßnahmen führen, und wird mit aller Härte des Gesetzes verfolgt.\n\n+" - IDS_HELPABOUT_DESC3 "AFS ist eine Marke von Transarc Corporation, einer Firma von IBM." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "Spalten - AFS Account Manager" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "Mehrfache Benutzer - Merkmale" - IDS_USER_PROPERTIES_TITLE "Benutzer %1 - Merkmale" - IDS_USER_NAME_MULTIPLE "Benutzer " - IDS_ACCOUNTACCESS_OWNER "Nur Kontoeigner" - IDS_ACCOUNTACCESS_GROUP "Nur Gruppenmitglieder" - IDS_ACCOUNTACCESS_ANYONE "Jeder" - IDS_ACCOUNTACCESS_MIXED "(Mehrfache Einstellungen)" - IDS_USER_KEY "%1\nVersion %2, Kontrollsumme %3" - IDS_USER_KEY_HIDDEN "(aktueller Schlüsselwert verdeckt)" - IDS_USER_KEY_UNKNOWN "(unbekannt)" - IDS_USER_KEY_MULTIPLE "(Mehrfache Schlüssel)" - IDS_ACTION_USER_CHANGE "Merkmale für Benutzer %1 werden geändert" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "Mehrfache Gruppen - Merkmale" - IDS_GROUP_PROPERTIES_TITLE "Gruppe %1 - Merkmale" - IDS_GROUP_NAME_MULTIPLE "Gruppen " - IDS_ACCOUNTACCESS_OWNGROUP "Nur Gruppeneigner" - IDS_OWNER_MIXED "Mehrfache Eigner" - IDS_CREATOR_MIXED "Mehrfache Ersteller" - IDS_GROUP_CHANGEOWNER_TITLE "Gruppeneigner ändern" - IDS_GROUP_CHANGEOWNER_PROMPT "Eigner:" - IDS_MEMBER_MIXED "(Einige)" - IDS_USER_SHOW_MEMBER_TITLE "Gruppen, zu denen dieser Benutzer gehört" - IDS_USER_SHOW_OWNER_TITLE "Alle Gruppen, deren Eigner dieser Benutzer ist" - IDS_GROUP_SHOW_MEMBER_TITLE "Alle Mitglieder dieser Gruppe:" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE - "Alle Gruppen, zu denen diese Benutzer gehören:" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "Alle Mitglieder dieser Gruppen" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "Gruppe %1 wird in %2 umbenannt" - IDS_RENAME_TITLE "Gruppe %1 umbenennen" - IDS_GROUP_TITLE "Gruppe %1" - IDS_SHOW_USERS "Alle Benutzer in dieser Zelle" - IDS_SHOW_GROUPS "Alle Gruppen in dieser Zelle" - IDS_GROUP_SHOW_OWNED_TITLE "Alle Gruppen, deren Eigner diese Gruppe ist" - IDS_BROWSE_TITLE_OWNED "Gruppen auswählen, deren Eigner diese Gruppe werden soll" - IDS_BROWSE_PROMPT_OWNED "Gruppen:" - IDS_BROWSE_CHECK_OWNED "Nur Gruppen anzeigen, deren Eigner diese Gruppe aktuell nicht ist" - IDS_NEWUSER_PROPERTIES_TITLE "Benutzer erstellen - Erweitert" - IDS_NEWUSER_SHOW_MEMBER_TITLE - "Alle Gruppen, zu denen dieser Benutzer gehören wird" - IDS_NEWUSER_SHOW_OWNER_TITLE - "Alle Gruppen, deren Eigner dieser Benutzer wird" - IDS_ACTION_CELL_CHANGE "Merkmale für Zelle %1 werden geändert" - IDS_ACTION_USER_CREATE "Konto für Benutzer %1 wird erstellt" - IDS_NEWGROUP_PROPERTIES_TITLE "Gruppe erstellen - Erweitert" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "Erste Mitglieder dieser neuen Gruppe:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "Markierungen" - IDS_USRCOL_ADMIN "Admin?" - IDS_USRCOL_TICKET "Zugriffsberechtigungen?" - IDS_USRCOL_SYSTEM "System?" - IDS_USRCOL_CHANGEPW "Kennwörter ändern?" - IDS_USRCOL_REUSEPW "Kennwörter wiederverwenden?" - IDS_USRCOL_EXPIRES "Ablauf des Kontos" - IDS_USRCOL_LASTPW "Letzte Kennwortänderung" - IDS_USRCOL_LASTMOD "Letzte Änderung" - IDS_USRCOL_LASTMODBY "Letzte Änderung durch" - IDS_USRCOL_LIFETIME "Lebensdauer der Zugriffsberechtigung" - IDS_USRCOL_CDAYPW "Ablauf des Kennworts" - IDS_USRCOL_CFAILLOGIN "Anmeldefehler" - IDS_USRCOL_CSECLOCK "Sperrzeit für Anmeldefehler" - IDS_USRCOL_CGROUPMAX "Gruppenerstellungsquote" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "Eigner" - IDS_USRCOL_CREATOR "Ersteller" - IDS_USRCOL_STATUS "Status" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "Ja" - IDS_NO "Nein" - IDS_GRPCOL_CMEMBERS "Anzahl Zugehörigkeiten" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "Eigner" - IDS_GRPCOL_CREATOR "Ersteller" - IDS_COL_USERS "Benutzer in einer Zelle" - IDS_COL_GROUPS "Gruppen in einer Zelle" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE - "Gruppen, deren Eigner diese neue Gruppe wird:" - IDS_USER_DELETE_MULTIPLE - "Achtung!\n\nDiese Operation löscht die Konten der folgenden Benutzer auf Dauer: %1" - IDS_GROUP_DELETE_MULTIPLE - "Achtung!\n\nDiese Operation löscht die folgenden Gruppen auf Dauer: %1" - IDS_ACTION_GROUP_CREATE "Gruppe %1 wird erstellt" - IDS_ACTION_USER_DELETE "Konto für Benutzer %1 wird gelöscht" - IDS_ACTION_GROUP_DELETE "Gruppe %1 wird gelöscht" - IDS_CELL_PROPERTIES_TITLE "Zelle %1 - Merkmale" - IDS_MACHINES_ALL "Alle IP-Adreßkonten in Zelle %1:" - IDS_MACHINES_PATTERN "Ausgewählte IP-Adreßkonten in Zelle %1:" - IDS_TAB_MACHINES "Adressen" - IDS_MACHINE_DELETE_MULTIPLE - "Achtung!\n\nDiese Operation löscht die folgenden IP-Adreßkonten auf Dauer: %1" - IDS_NEWMACHINE_PROPERTIES_TITLE "IP-Adreßkonto erstellen - Erweitert" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE - "Mehrfache IP-Adreßkonten - Merkmale" - IDS_MACHINE_PROPERTIES_TITLE "IP-Adreßkonto %1 - Merkmale" - IDS_COL_MACHINES "IP-Adreßkonten in einer Zelle" - IDS_MCHCOL_NAME "IP-Adresse" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "Gruppen für Zugehörigkeit auswählen" - IDS_BROWSE_PROMPT_JOIN "Gruppen:" - IDS_BROWSE_CHECK_JOIN "Nur Gruppen ohne Zugehörigkeit anzeigen" - IDS_BROWSE_TITLE_OWN "Gruppen auswählen, deren Eigner diese Gruppe werden soll" - IDS_BROWSE_PROMPT_OWN "Gruppen:" - IDS_BROWSE_CHECK_OWN "Nur Gruppen anzeigen, deren Eigner diese Gruppe aktuell nicht ist" - IDS_BROWSE_TITLE_MEMBER "Benutzer für Zugehörigkeit auswählen" - IDS_BROWSE_PROMPT_MEMBER "Benutzer:" - IDS_BROWSE_CHECK_MEMBER "Nur Benutzer anzeigen, die nicht Mitglied sind" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "Merkmale für Gruppe %1 werden geändert" - IDS_ACTION_GROUP_MEMBER_ADD "Benutzer %2 wird zu Gruppe %1 hinzugefügt" - IDS_ACTION_GROUP_MEMBER_REMOVE "Benutzer %2 wird aus Gruppe %1 entfernt" - IDS_ACTION_USER_PW_CHANGE "Kennwort für Benutzer %1 wird festgelegt" - IDS_UNKNOWN_NAME "(unbekannt)" - IDS_ACTION_USER_UNLOCK "Konto für Benutzer %1 wird entsperrt" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "Gruppenerstellungsquote" - IDS_MCHCOL_UID "Konten-ID" - IDS_MCHCOL_OWNER "Eigner" - IDS_MCHCOL_CREATOR "Ersteller" - IDS_OPTIONS_TITLE "AFS Account Manager-Optionen" - IDS_WARNING_TITLE "Achtung" - IDS_WARNING_SYSTEM_ACCOUNT - "Das Konto %1 muß mit Vorsicht geändert werden, da ungeeignete Änderungen dieses Kontos die einwandfreie Funktionsweise einiger Funktionen von AFS verhindern können.\n\nSind Sie sicher, daß Sie den Vorgang fortsetzen möchten?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE - "Alle Gruppen, zu denen dieses Konto gehört:" - IDS_MACHINE_SHOW_OWNER_TITLE - "Alle Gruppen, deren Eigner dieses Konto ist:" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE - "Alle Gruppen, zu denen diese Konten gehören:" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE - "Alle Gruppen, zu denen dieses Konto gehören wird" - IDS_NEWMACHINE_SHOW_OWNER_TITLE - "Alle Gruppen, deren Eigner dieses Konto wird" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "Der AFS Account Manager konnte keinen Verwaltungsprozeß erreichen, der auf dem Computer %1 ausgeführt wird.\n\nSie können Fernverwaltungsaufgaben durchführen, indem Sie das Programm TaAfsAdmSvr.exe auf dem anderen Computer ausführen." - IDS_ERROR_BAD_LOCAL_SERVER - "Der AFS Account Manager konnte das Programm TaAfsAdmSvr.exe nicht finden oder Ihren Computer nicht für eine AFS-Verwaltung vorbereiten." - IDS_ERROR_CANT_OPEN_CELL - "Der AFS Account Manager konnte keine Server in der Zelle %1 erreichen.\n\nBitte überprüfen Sie, ob der Name der Zelle richtig eingegeben wurde." - IDS_ERROR_BADCREDENTIALS - "Die eingegebene AFS-ID wurde nicht erkannt, oder das angegebene Kennwort ist falsch." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "Fehlernummer 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Fehlernummer 0x%1 (%2) wurde nicht erkannt." - IDS_ERROR_USER_MULTIPROP - "Der AFS Account Manager kann das angeforderte Fenster nicht anzeigen, da für mindestens einen der ausgewählten Benutzer bereits ein Merkmalfenster geöffnet ist." - IDS_ERROR_CANT_CHANGE_USER - "Der AFS Account Manager konnte die Merkmale für Benutzer %1 nicht ändern." - IDS_ERROR_GROUP_MULTIPROP - "Der AFS Account Manager kann das angeforderte Fenster nicht anzeigen, da für mindestens eine der ausgewählten Gruppen bereits ein Merkmalfenster geöffnet ist." - IDS_ERROR_CANT_CHANGE_GROUP - "Der AFS Account Manager konnte die Merkmale für Gruppe %1 nicht ändern." - IDS_ERROR_CANT_TRANSLATE_USER - "Der AFS Account Manager konnte keinen Benutzer mit dem angegebenen Namen finden.\n\nÜberprüfen Sie bitte, ob der Name richtig eingegeben wurde." - IDS_ERROR_CANT_TRANSLATE_GROUP - "Der AFS Account Manager konnte keinen Benutzer mit dem angegebenen Namen finden.\n\nÜberprüfen Sie bitte, ob der Name richtig eingegeben wurde." - IDS_ERROR_CANT_GET_USERPROP - "Der AFS Account Manager konnte die Merkmale für Benutzer %1 nicht finden." - IDS_ERROR_CANT_CHANGE_PASSWORD - "Der AFS Account Manager konnte das Kennwort für Benutzer %1 nicht ändern." - IDS_ERROR_CANT_GET_RANDOM_KEY - "Der AFS Account Manager konnte keinen wahlfreien Chiffrierschlüssel generieren." - IDS_ERROR_CANT_SET_GROUPS - "Der AFS Account Manager konnte die angegebene Gruppenliste für Benutzer %1 nicht ändern." - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "Der AFS Account Manager konnte die angegebene Gruppenliste für die folgenden Benutzer nicht ändern: %1." - IDS_ERROR_CANT_UNLOCK "Der AFS Account Manager konnte das Konto des Benutzers %1 nicht entsperren." - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "Der AFS Account Manager konnte die Konten der folgenden Benutzer nicht entsperren: %1." - IDS_ERROR_CANT_SET_MEMBERS - "Der AFS Account Manager konnte die Liste der Mitglieder für Gruppe %1 nicht ändern." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "Der AFS Account Manager konnte die Liste der Mitglieder für die folgenden Gruppen nicht ändern: %1." - IDS_ERROR_CANT_RENAME_GROUP - "Der AFS Account Manager konnte die Gruppe %1 nicht in ""%2"" umbenennen." - IDS_ERROR_CANT_CHANGE_OWNER - "Der AFS Account Manager konnte den Eigner der Gruppe %1 nicht ändern." - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "Der AFS Account Manager konnte den Eigner der folgenden Gruppen nicht ändern: %1." - IDS_ERROR_CANT_CHANGE_CELL - "Der AFS Account Manager konnte die Merkmale der Zelle %1 nicht ändern." - IDS_ERROR_NO_PASSWORD_GIVEN - "Sie müssen für das Benutzerkonto, das erstellt wird, ein Kennwort angeben." - IDS_ERROR_MISMATCH_PASSWORD_GIVEN - "Die für das neue Benutzerkonto eingegebenen Kennwörter stimmen nicht überein." - IDS_ERROR_CANT_CREATE_USER - "Der AFS Account Manager konnte kein Konto für Benutzer %1 erstellen." - IDS_ERROR_CANT_CREATE_GROUP - "Der AFS Account Manager konnte die Gruppe %1 nicht erstellen." - IDS_ERROR_CANT_DELETE_USER - "Der AFS Account Manager konnte das Konto für Benutzer %1 nicht löschen." - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "Der AFS Account Manager konnte die Konten der folgenden Benutzer nicht löschen: %1." - IDS_ERROR_CANT_DELETE_GROUP - "Der AFS Account Manager konnte die Gruppe %1 nicht löschen." - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "Der AFS Account Manager konnte die folgenden Gruppen nicht löschen: %1." - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "Der AFS Account Manager konnte nicht gestartet werden, da das AFS Control Center nicht ordnungsgemäß installiert wurde.\n\nSie müssen das AFS Control Center erneut installieren." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "Fehler - AFS Account Manager" - IDS_CMDLINE_SYNTAX "Die für den AFS Account Manager angegebene Befehlszeile ist ungültig." - IDS_CMDLINE_UNRECOGNIZED - "Die für den AFS Account Manager angegebene Befehlszeile ist ungültig.\n\nDer Parameter ""%1"" wurde nicht erkannt." - IDS_CMDLINE_DUPLICATE "Die für den AFS Account Manager angegebene Befehlszeile ist ungültig.\n\nDer Parameter ""%1"" wurde mehrmals angegeben." - IDS_CMDLINE_UNEXPECTVALUE - "Die für den AFS Account Manager angegebene Befehlszeile ist ungültig.\n\nDem Parameter ""%1"" darf kein Wert zugewiesen werden." - IDS_CMDLINE_MISSINGVAL "Die für den AFS Account Manager angegebene Befehlszeile ist ungültig.\n\nDem Parameter ""%1"" muß ein Wert folgen." - IDS_CMDLINE_USERPASSWORD - "Die für den AFS Account Manager angegebene Befehlszeile ist ungültig.\n\nUm neue AFS-Token zu erhalten, müssen die Parameter ""/USER"" und ""/PASSWORD"" angegeben werden." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/en_US/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/en_US/AfsUsrMgr.rc deleted file mode 100644 index 8eccbb3e9..000000000 --- a/src/WINNT/afsusrmgr/lang/en_US/AfsUsrMgr.rc +++ /dev/null @@ -1,1766 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Account Manager" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS Account Manager" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,302,184 - LTEXT "Selected Cell:",IDC_STATIC,4,7,55,8 - LTEXT "(none selected)",IDC_CELL,63,7,212,8 - LTEXT "AFS Tokens:",IDC_STATIC,4,18,55,8 - LTEXT "(no tokens)",IDC_CREDS,63,18,212,8 - ICON IDI_MAIN,IDC_ANIM,285,7,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,41,13,ES_AUTOHSCROLL - RTEXT "Pattern:",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "Querying; please wait...",IDC_USERS_TITLE,4,6,142,8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Create...",M_USER_CREATE,65,126,55,14 - PUSHBUTTON "&Membership...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&roperties...",M_PROPERTIES,183,126,55,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Pattern:",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "Querying; please wait...",IDC_GROUPS_TITLE,4,6,142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Create...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "&Members...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&roperties...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Operations In Progress - AFS Account Manager" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Querying; please wait...",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "About AFS Account Manager" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,21,20 - LTEXT "AFS Account Manager version 3.5",IDC_STATIC,33,8,189, - 8 - LTEXT "Copyright © IBM Corporation 1989, 1999", - IDC_STATIC,33,20,189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "&Close",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Look Up Error Code" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Error number:",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Translate",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "&Close",IDCANCEL,85,123,48,14 - LTEXT "(text set at runtime)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "To find out what an error code means, type in the code below and click the ""Translate"" button.", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Find Command" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Display &Help",IDOK,160,39,67,14 - PUSHBUTTON "&Cancel",IDCANCEL,160,55,67,14 - LTEXT "To find out how to use the AFS Account Manager to perform a task, select a command-line below and click the Display Help button.", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Columns" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Select columns to display when listing:",IDC_STATIC,5, - 7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Available &Columns:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Columns to D&isplay:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Add >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< &Remove",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "Move &Up",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "Move &Down",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "List Columns",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Advanced" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Current Key:",IDC_STATIC,5,5,40,8 - LTEXT "Querying; please wait...",IDC_USER_KEY,52,5,173,20,0, - WS_EX_STATICEDGE - CONTROL "This is a &system account (no encryption)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 35,160,10 - CONTROL "User has &administrative privileges",IDC_USER_ADMIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,52,120,10 - CONTROL "&Grant tickets; lifetime:",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,69,84,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP,92, - 68,66,12 - CONTROL "Group creation "a:",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,86,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,92,85,27,13,ES_AUTOHSCROLL - LTEXT "View account &status:",IDC_STATIC,12,140,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List groups o&wned:",IDC_STATIC,12,156,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List group &membership:",IDC_STATIC,12,172,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Other-Account Permissions",IDC_STATIC,5,109,220,82 - LTEXT "These settings specify which users can view this account.", - IDC_STATIC,11,124,204,8 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "User can &change password",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "Change &Password",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "User can &reuse old passwords",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "Password &expires after",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,87,10 - LTEXT "days",IDC_STATIC,168,79,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,115,77,37,13,ES_AUTOHSCROLL - CONTROL "Account &expires on:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,61,12 - LTEXT "a&t",IDC_USER_EXPIRE_AT,155,98,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,96,53,12 - CONTROL "&Lock account after",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,140,76,10 - LTEXT "consecutive failed logins",IDC_STATIC,133,141,78,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,90,139,32,13,ES_AUTOHSCROLL - CONTROL "&Lock account indefinitely (until unlocked by administrator)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "Lock account &for",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,98,171,56,12 - PUSHBUTTON "&Unlock",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "Failed Login Attempts",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "User %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "Account",IDC_STATIC,5,32,220,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,18,20 - LTEXT "Group %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "View account &status:",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "View &groups owned:",IDC_STATIC,12,124,67,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List group &members:",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Add members:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Remove members:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Other-Account Permissions",IDC_STATIC,5,77,220,114 - LTEXT "These settings specify which users can view this group.", - IDC_STATIC,11,92,204,8 - LTEXT "Owner:",IDC_STATIC,5,31,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,31,113,8 - PUSHBUTTON "Change &Owner...",IDC_GROUP_CHANGEOWNER,159,29,66,12 - LTEXT "Creator:",IDC_STATIC,5,46,27,8 - LTEXT "%1",IDC_GROUP_CREATOR,37,46,113,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Groups" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Groups",IDC_STATIC,5,31,220,160 - LTEXT "These settings allow you to change the list of groups to which this user belongs, as well as the list of groups which this user owns.", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remove",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Add...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Show the groups to which this user belongs", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "S&how the groups which this user owns", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Querying; please wait...)",IDC_GROUPS_TITLE,12,74,205, - 8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Membership" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Group Membership",IDC_STATIC,5,31,220,160 - LTEXT "These settings allow you to choose the members of this group, as well as to choose the groups which this group should own.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remove",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Add...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Show the members of this group",IDC_GROUP_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "S&how the groups which this group owns", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Querying; please wait...)",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(This title selected at runtime)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Select",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Cancel",IDCANCEL,224,129,50,14 - CONTROL "(text specified at runtime)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,59,133,146,10 - RTEXT "Look in &cell:",IDC_STATIC,7,8,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Pattern:",IDC_GROUPS_PATTERN_PROMPT,198,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 281, 145 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Change Account Password" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Automatically select a version number for the new password", - IDC_CPW_VERSION_AUTO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,42,36,203,10 - CONTROL "&Use key version:",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,42,52,69,10 - EDITTEXT IDC_CPW_VERSION,120,51,43,14,ES_AUTOHSCROLL - CONTROL "Encrypt this string:",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,42,78,73,10 - CONTROL "Use this key:",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,42,95,57,10 - EDITTEXT IDC_CPW_STRING,119,76,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,119,94,103,14,ES_AUTOHSCROLL - PUSHBUTTON "&Random",IDC_CPW_RANDOM,226,94,48,14 - DEFPUSHBUTTON "OK",IDOK,116,124,50,14 - PUSHBUTTON "Cancel",IDCANCEL,170,124,50,14 - PUSHBUTTON "Help",9,224,124,50,14 - LTEXT "New password for user %1",IDC_CPW_TITLE,43,14,231,8 - ICON IDI_USER,-1,7,6,21,20 - LTEXT "Version:",-1,7,37,26,8 - LTEXT "Value:",-1,7,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Rename Group" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "New group &name:",IDC_STATIC,35,103,57,8 - EDITTEXT IDC_RENAME_NEWNAME,109,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,109,129,50,14 - PUSHBUTTON "Cancel",IDCANCEL,163,129,50,14 - PUSHBUTTON "Help",9,217,129,50,14 - LTEXT "Current owner:",IDC_STATIC,35,65,47,8 - PUSHBUTTON "&Change Owner...",IDC_RENAME_CHOWN,198,63,69,14 - LTEXT "Current group name:",IDC_STATIC,35,83,65,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "Rename group %1",IDC_RENAME_TITLE,35,14,222,8 - LTEXT "Note: Unless a group's name is prefix-less, the name should accurately reflect the group's current owner (e.g., ""owner:groupname"").", - IDC_STATIC,35,34,231,16 - LTEXT "(querying)",IDC_RENAME_OWNER,109,65,82,8 - LTEXT "(querying)",IDC_RENAME_OLDNAME,109,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 281, 153 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(This title selected at runtime)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Select",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "Cancel",IDCANCEL,224,132,50,14 - RTEXT "Show:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Look in &cell:",IDC_STATIC,7,8,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Pattern:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 281, 169 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(This title selected at runtime)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Select",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "Cancel",IDCANCEL,224,132,50,14 - RTEXT "Show:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(text specified at runtime)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,60,151,140,10 - RTEXT "Look in &cell:",IDC_STATIC,7,8,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Pattern:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Groups" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Groups",IDC_STATIC,5,31,220,160 - LTEXT "These settings allow you to change the initial list of groups to which this user will belong, as well as the groups which this user will own.", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remove",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Add...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Show the groups to which this user will belong", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "S&how the groups which this user will own", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Querying; please wait...)",IDC_GROUPS_TITLE,12,74,205, - 8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 238, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Create User" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Name:",IDC_STATIC,7,37,22,8 - EDITTEXT IDC_NEWUSER_NAME,46,35,127,14,ES_AUTOHSCROLL - LTEXT "&Password:",IDC_STATIC,7,57,34,8 - EDITTEXT IDC_NEWUSER_PW1,46,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "(&re-enter:)",IDC_STATIC,7,77,31,8 - EDITTEXT IDC_NEWUSER_PW2,46,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "A&utomatically use the next available user ID", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,45,97, - 186,10 - CONTROL "U&se a specific user ID:",IDC_NEWUSER_ID_MANUAL,"Button", - BS_AUTORADIOBUTTON,45,113,87,10 - EDITTEXT IDC_NEWUSER_ID,134,112,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Groups...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "OK",IDOK,94,149,43,14 - PUSHBUTTON "Cancel",IDCANCEL,141,149,43,14 - PUSHBUTTON "Help",9,188,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "New user in cell %1",IDC_NEWUSER_TITLE,46,14,185,8 - LTEXT "User ID:",IDC_STATIC,7,97,27,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "New group in cell %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "View account &status:",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "View &groups owned:",IDC_STATIC,12,124,67,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List group &members:",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Add members:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Remove members:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Other-Account Permissions",IDC_STATIC,5,68,220,123 - LTEXT "These settings specify which users can view information about this group.", - IDC_STATIC,11,83,204,17 - LTEXT "Owner:",IDC_STATIC,5,35,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,35,113,8 - PUSHBUTTON "Change &Owner...",IDC_GROUP_CHANGEOWNER,159,33,66,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Membership" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Group Membership",IDC_STATIC,5,31,220,160 - LTEXT "These settings allow you to choose the initial members of this group, as well as to choose the groups which this group should own.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remove",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Add...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Show the initial members of this group", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "S&how the groups which this group owns", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Querying; please wait...)",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 238, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Create Group" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Name:",-1,7,37,22,8 - EDITTEXT IDC_NEWGROUP_NAME,46,35,127,14,ES_AUTOHSCROLL - CONTROL "A&utomatically use the next available group ID", - IDC_NEWGROUP_ID_AUTO,"Button",BS_AUTORADIOBUTTON,45,60, - 186,10 - CONTROL "U&se a specific group ID:",IDC_NEWGROUP_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,45,75,87,10 - EDITTEXT IDC_NEWGROUP_ID,134,74,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Members...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "OK",IDOK,94,114,43,14 - PUSHBUTTON "Cancel",IDCANCEL,141,114,43,14 - PUSHBUTTON "Help",9,188,114,43,14 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "New group in cell %1",IDC_NEWGROUP_TITLE,46,14,185,8 - LTEXT "Group ID:",-1,7,60,32,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Delete User" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,116,93,50,14 - DEFPUSHBUTTON "Cancel",IDCANCEL,170,93,50,14 - PUSHBUTTON "Help",9,224,93,50,14 - LTEXT "Caution!\n\nThis operation will permanently delete the account for user %1.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 - CONTROL "Delete &KAS database entry for this account", - IDC_DELETE_KAS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 53,203,10 - CONTROL "Delete &PTS database entry for this account", - IDC_DELETE_PTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Delete Group" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,116,61,50,14 - DEFPUSHBUTTON "Cancel",IDCANCEL,170,61,50,14 - PUSHBUTTON "Help",9,224,61,50,14 - LTEXT "Caution!\n\nThis operation will permanently delete the group %1.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Maximum &user identifier:",IDC_STATIC,11,87,76,8 - EDITTEXT IDC_CELL_USERMAX,102,85,40,14,ES_AUTOHSCROLL - LTEXT "Maximum &group identifier:",IDC_STATIC,11,105,80,8 - EDITTEXT IDC_CELL_GROUPMAX,102,103,40,14,ES_AUTOHSCROLL - GROUPBOX "User and Group Identifiers",IDC_STATIC,5,31,220,97 - LTEXT "These settings reflect the highest user and group identifiers ever used. It is safe to increase these values; however, they should not be decreased unless you are confident the new values do not conflict with existing accounts.", - IDC_STATIC,11,43,204,32 - ICON IDI_CELL,IDC_STATIC,5,5,21,20 - LTEXT "Cell %1",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "User can &change password",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "Change &Password",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "User can &reuse old passwords",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "Password &expires after",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,87,10 - LTEXT "days",IDC_STATIC,168,79,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,115,77,37,13,ES_AUTOHSCROLL - CONTROL "Account &expires on:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,61,12 - LTEXT "a&t",IDC_USER_EXPIRE_AT,155,98,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,96,53,12 - CONTROL "&Lock account after",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,140,76,10 - LTEXT "consecutive failed logins",IDC_STATIC,133,141,78,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,90,139,32,13,ES_AUTOHSCROLL - CONTROL "&Lock account indefinitely (until unlocked by administrator)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "Lock account &for",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,98,171,56,12 - PUSHBUTTON "&Unlock",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "Failed Login Attempts",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "New user in cell %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "Account",IDC_STATIC,5,32,220,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Advanced" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Create a &KAS database entry for this account (recommended)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,210,11 - CONTROL "Create a &PTS database entry for this account (recommended)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,210,10 - CONTROL "This will be a &system account (no encryption)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 40,160,10 - CONTROL "User will have &administrative privileges", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 57,136,10 - CONTROL "&Grant tickets; lifetime:",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,74,84,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP,92, - 73,66,12 - CONTROL "Group creation "a:",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,91,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,92,90,27,13,ES_AUTOHSCROLL - LTEXT "View account &status:",-1,12,140,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List groups o&wned:",-1,12,156,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List group &membership:",-1,12,172,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Other-Account Permissions",-1,5,109,220,82 - LTEXT "These settings specify which users can view this account.", - -1,11,124,204,8 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Pattern:",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "Querying; please wait...",IDC_MACHINES_TITLE,4,6,142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Create...",M_MACHINE_CREATE,65,126,55,14 - PUSHBUTTON "&Membership...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&roperties...",M_PROPERTIES,183,126,55,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Groups" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Groups",IDC_STATIC,5,31,220,160 - LTEXT "These settings allow you to select the initial list of groups to which this account will belong, as well as the groups which it will own.", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remove",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Add...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Show the groups to which this account will belong", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "S&how the groups which this account will own", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Querying; please wait...)",IDC_GROUPS_TITLE,12,74,205, - 8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Advanced" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "View account &status:",IDC_STATIC,12,88,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List groups o&wned:",IDC_STATIC,12,104,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List group &membership:",IDC_STATIC,12,120,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Other-Account Permissions",IDC_STATIC,5,57,220,82 - LTEXT "These settings specify which users can view this account.", - IDC_STATIC,11,72,204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "New IP address account in cell %1",IDC_USER_NAME,37,13, - 188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 247, 126 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Create IP Address Account" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "IP &Address:",-1,7,37,37,8 - EDITTEXT IDC_NEWUSER_NAME,50,35,127,14,ES_AUTOHSCROLL - CONTROL "A&utomatically use the next available account ID", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,49,60, - 191,10 - CONTROL "U&se a specific account ID:",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,49,76,98,10 - EDITTEXT IDC_NEWUSER_ID,151,75,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Groups...",IDC_ADVANCED,7,105,54,14 - DEFPUSHBUTTON "OK",IDOK,103,105,43,14 - PUSHBUTTON "Cancel",IDCANCEL,151,105,43,14 - PUSHBUTTON "Help",9,197,105,43,14 - ICON IDI_SERVER,-1,7,6,21,20 - LTEXT "New IP address account in cell %1",IDC_NEWUSER_TITLE,50, - 14,190,8 - LTEXT "Account ID:",-1,7,60,39,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Delete IP Address Account" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,153,63,50,14 - DEFPUSHBUTTON "Cancel",IDCANCEL,207,63,50,14 - PUSHBUTTON "Help",9,261,63,50,14 - LTEXT "Caution!\n\nThis operation will permanently delete the IP address account %1.", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Advanced" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "View account &status:",IDC_STATIC,12,89,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List groups o&wned:",IDC_STATIC,12,105,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "List group &membership:",IDC_STATIC,12,121,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Other-Account Permissions",IDC_STATIC,5,57,220,82 - LTEXT "These settings specify which users can view this account.", - IDC_STATIC,11,73,204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "IP address account %1",IDC_USER_NAME,37,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Groups" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Groups",IDC_STATIC,5,31,220,160 - LTEXT "These settings allow you to change the list of groups to which this account belongs, as well as the groups which this account owns.", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remove",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Add...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Show the groups to which this account belongs", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "S&how the groups which this account owns", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Querying; please wait...)",IDC_GROUPS_TITLE,12,74,205, - 8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 235, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Options" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Use &Unix-style regular expressions (""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,191,10 - CONTROL "Use &Windows-style regular expressions (""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,182, - 10 - CONTROL "Display a warning if working without administrative tokens", - IDC_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,116,209,10 - CONTROL "&Automatically refresh information every",IDC_REFRESH, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,134,136,10 - LTEXT "minutes",IDC_STATIC,190,135,25,8 - EDITTEXT IDC_REFRESH_RATE,149,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,21,20 - LTEXT "Afs Account Manager Options",IDC_STATIC,37,12,96,8 - GROUPBOX "Regular Expressions",IDC_STATIC,5,37,225,57 - GROUPBOX "General",IDC_STATIC,5,100,225,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 284, 129 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Select Users To Display" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Show entries for &all user accounts",IDC_SEARCH_ALL, - "Button",BS_AUTORADIOBUTTON,29,40,119,10 - CONTROL "Only show user accounts which &expire before", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON,29,55,156, - 10 - CONTROL "Only show accounts whose passwords &expire before", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON,29,70, - 179,10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 192,54,61,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,212,69,61,12 - DEFPUSHBUTTON "OK",IDOK,119,108,50,14 - PUSHBUTTON "Cancel",IDCANCEL,173,108,50,14 - PUSHBUTTON "Help",9,227,108,50,14 - LTEXT "These controls allow you to specify which users should be shown on the Users tab. You can further restrict the list of users shown by typing a partial account-name in the Pattern control on the Users tab.", - IDC_STATIC,7,6,270,25 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 138 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 146 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 162 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - TOPMARGIN, 6 - BOTTOMMARGIN, 119 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 230 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 277 - TOPMARGIN, 6 - BOTTOMMARGIN, 130 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Account Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Cell" - BEGIN - MENUITEM "&Select...", M_OPENCELL - MENUITEM "&Authentication...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "Cell P&roperties...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "E&xit", M_EXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "&Create User...", M_USER_CREATE - MENUITEM "&Create Group...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&name...", M_RENAME - MENUITEM "&Delete...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "Select &All\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "Re&fresh\tF5", M_REFRESH - MENUITEM "&Membership...\tCtrl+M", M_MEMBERSHIP - MENUITEM "P&roperties\tAlt+Enter", M_PROPERTIES - END - POPUP "&View" - BEGIN - POPUP "&Icons" - BEGIN - MENUITEM "Lar&ge Icons", M_VIEW_LARGE, CHECKED - MENUITEM "S&mall Icons", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&All Icons", M_VIEW_TWO, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "O&perations in Progress", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Columns...", M_COLUMNS - MENUITEM "&Options...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL - END - POPUP "&Help" - BEGIN - MENUITEM "&Contents", M_CONTENTS - MENUITEM "&Find Command...", M_FIND - MENUITEM "&Look Up Error Code...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "&About AFS Account Manager...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "Lar&ge Icons", M_VIEW_LARGE, CHECKED - MENUITEM "S&mall Icons", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&All Icons", M_VIEW_TWO, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Create User...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "Lar&ge Icons", M_VIEW_LARGE, CHECKED - MENUITEM "S&mall Icons", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&All Icons", M_VIEW_TWO, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Create Group...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "&Groups...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "Change &Password...", M_CPW - MENUITEM "&Unlock", M_UNLOCK - MENUITEM "&Delete...", M_DELETE - MENUITEM "Re&fresh", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&roperties...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "Group &Members...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Rename...", M_RENAME - MENUITEM "&Delete...", M_DELETE - MENUITEM "Re&fresh", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&roperties...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Columns...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "&View" - BEGIN - MENUITEM "Lar&ge Icons", M_VIEW_LARGE, CHECKED - MENUITEM "S&mall Icons", M_VIEW_SMALL, CHECKED - MENUITEM "&Details", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&All Icons", M_VIEW_TWO, CHECKED - MENUITEM "&Status Only", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Create Account...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&fresh All", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "&Groups...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Delete...", M_DELETE - MENUITEM "Re&fresh", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&roperties...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS Account Manager" - IDS_USRCOL_NAME "User Name" - IDS_GRPCOL_NAME "Group Name" - IDS_BADCREDS_DESC "Unless you are logged in as an administrator, you may have insufficient privileges to successfully administer the %1 cell." - IDS_TAB_USERS "Users" - IDS_TAB_GROUPS "Groups" - IDS_CELL_NONE "(no cell selected)" - IDS_CRED_NONE "(no tokens in this cell)" - IDS_CRED_EXP "%1 (tokens expired %2)" - IDS_CRED_OK "%1 (tokens will expire %2)" - IDS_USERS_ALL "All users in cell %1:" - IDS_USERS_PATTERN "Selected users in cell %1:" - IDS_GROUPS_ALL "All groups in cell %1:" - IDS_GROUPS_PATTERN "Selected groups in cell %1:" - IDS_QUERYING_LONG "Querying; please wait..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "There are no operations in progress." - IDS_ACTION_DESC_ONE "The following operation is currently in progress:" - IDS_ACTION_DESC_MULT "The following operations are currently in progress:" - IDS_ACTCOL_OPERATION "Operation" - IDS_ACTCOL_ELAPSED "Elapsed Time" - IDS_ACTION_REFRESH_CELL "Refreshing information for cell %1" - IDS_ACTION_REFRESH_SERVER "Refreshing information for server %1" - IDS_ACTION_SCOUT_CELL "Testing cell %1 for problems" - IDS_ACTION_SCOUT_SERVER "Testing server %1 for problems" - IDS_FIND_NOTHING_TITLE "No Command Selected" - IDS_FIND_NOTHING_DESC "To find out how to perform an operation, first select a command-line from the list or type in a keyword." - IDS_FIND_UNKNOWN_TITLE "Unknown Command" - IDS_FIND_UNKNOWN_DESC "The AFS Account Manager could not find any help topics for the ""%1"" command." - IDS_HELPABOUT_DESC1 "Warning: this computer program is protected by copyright and international treaties. +" - IDS_HELPABOUT_DESC2 "Unauthorized reproduction or distribution of this software may result in severe civil and criminal penalties, and will be prosecuted to the maximum extent possible under the law.\n\n+" - IDS_HELPABOUT_DESC3 "AFS is a trademark of Transarc Corporation, an IBM company." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "Columns - AFS Account Manager" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "Multiple Users - Properties" - IDS_USER_PROPERTIES_TITLE "User %1 - Properties" - IDS_USER_NAME_MULTIPLE "Users " - IDS_ACCOUNTACCESS_OWNER "Account owner only" - IDS_ACCOUNTACCESS_GROUP "Group members only" - IDS_ACCOUNTACCESS_ANYONE "Anyone" - IDS_ACCOUNTACCESS_MIXED "(multiple settings)" - IDS_USER_KEY "%1\nVersion %2, Checksum %3" - IDS_USER_KEY_HIDDEN "(actual key value hidden)" - IDS_USER_KEY_UNKNOWN "(unknown)" - IDS_USER_KEY_MULTIPLE "(multiple keys)" - IDS_ACTION_USER_CHANGE "Changing properties for user %1" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "Multiple Groups - Properties" - IDS_GROUP_PROPERTIES_TITLE "Group %1 - Properties" - IDS_GROUP_NAME_MULTIPLE "Groups " - IDS_ACCOUNTACCESS_OWNGROUP "Group owner only" - IDS_OWNER_MIXED "Multiple Owners" - IDS_CREATOR_MIXED "Multiple Creators" - IDS_GROUP_CHANGEOWNER_TITLE "Change Group Owner" - IDS_GROUP_CHANGEOWNER_PROMPT "Owner:" - IDS_MEMBER_MIXED " (Some)" - IDS_USER_SHOW_MEMBER_TITLE "All groups to which this user belongs:" - IDS_USER_SHOW_OWNER_TITLE "All groups which this user owns:" - IDS_GROUP_SHOW_MEMBER_TITLE "All members of this group:" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE - "All groups to which these users belong:" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "All members of these groups:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "Renaming group %1 to %2" - IDS_RENAME_TITLE "Rename group %1" - IDS_GROUP_TITLE "Group %1" - IDS_SHOW_USERS "All users in this cell" - IDS_SHOW_GROUPS "All groups in this cell" - IDS_GROUP_SHOW_OWNED_TITLE "All groups which this group owns:" - IDS_BROWSE_TITLE_OWNED "Select Groups To Own" - IDS_BROWSE_PROMPT_OWNED "Groups:" - IDS_BROWSE_CHECK_OWNED "Show only groups not currently owned" - IDS_NEWUSER_PROPERTIES_TITLE "Create User - Advanced" - IDS_NEWUSER_SHOW_MEMBER_TITLE "All groups to which this user will belong:" - IDS_NEWUSER_SHOW_OWNER_TITLE "All groups which this user will own:" - IDS_ACTION_CELL_CHANGE "Changing properties for cell %1" - IDS_ACTION_USER_CREATE "Creating account for user %1" - IDS_NEWGROUP_PROPERTIES_TITLE "Create Group - Advanced" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "Initial members of this new group:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "Flags" - IDS_USRCOL_ADMIN "Admin?" - IDS_USRCOL_TICKET "Tickets?" - IDS_USRCOL_SYSTEM "System?" - IDS_USRCOL_CHANGEPW "Change Passwords?" - IDS_USRCOL_REUSEPW "Reuse Passwords?" - IDS_USRCOL_EXPIRES "Account Expiration" - IDS_USRCOL_LASTPW "Last Password Change" - IDS_USRCOL_LASTMOD "Last Modified" - IDS_USRCOL_LASTMODBY "Last Modified By" - IDS_USRCOL_LIFETIME "Ticket Lifetime" - IDS_USRCOL_CDAYPW "Password Expiration" - IDS_USRCOL_CFAILLOGIN "Login Failures" - IDS_USRCOL_CSECLOCK "Login Failure Lock Time" - IDS_USRCOL_CGROUPMAX "Group Creation Quota" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "Owner" - IDS_USRCOL_CREATOR "Creator" - IDS_USRCOL_STATUS "Status" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "Yes" - IDS_NO "No" - IDS_GRPCOL_CMEMBERS "Membership Count" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "Owner" - IDS_GRPCOL_CREATOR "Creator" - IDS_COL_USERS "Users in a Cell" - IDS_COL_GROUPS "Groups in a Cell" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE "Groups which this new group will own:" - IDS_USER_DELETE_MULTIPLE - "Caution!\n\nThis operation will permanently delete the accounts for the following users: %1" - IDS_GROUP_DELETE_MULTIPLE - "Caution!\n\nThis operation will permanently delete the following groups: %1." - IDS_ACTION_GROUP_CREATE "Creating group %1" - IDS_ACTION_USER_DELETE "Deleting account for user %1" - IDS_ACTION_GROUP_DELETE "Deleting group %1" - IDS_CELL_PROPERTIES_TITLE "Cell %1 - Properties" - IDS_MACHINES_ALL "All IP address accounts in cell %1:" - IDS_MACHINES_PATTERN "Selected IP address accounts in cell %1:" - IDS_TAB_MACHINES "Addresses" - IDS_MACHINE_DELETE_MULTIPLE - "Caution!\n\nThis operation will permanently delete the following IP address accounts: %1" - IDS_NEWMACHINE_PROPERTIES_TITLE "Create IP Address Account - Advanced" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE - "Multiple IP Address Accounts - Properties" - IDS_MACHINE_PROPERTIES_TITLE "IP Address Account %1 - Properties" - IDS_COL_MACHINES "IP Address Accounts in a Cell" - IDS_MCHCOL_NAME "IP Address" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "Select Groups To Join" - IDS_BROWSE_PROMPT_JOIN "Groups:" - IDS_BROWSE_CHECK_JOIN "Show only groups not currently joined" - IDS_BROWSE_TITLE_OWN "Select Groups To Own" - IDS_BROWSE_PROMPT_OWN "Groups:" - IDS_BROWSE_CHECK_OWN "Show only groups not currently owned" - IDS_BROWSE_TITLE_MEMBER "Select Users To Join" - IDS_BROWSE_PROMPT_MEMBER "Users:" - IDS_BROWSE_CHECK_MEMBER "Show only users who are not members" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "Changing properties for group %1" - IDS_ACTION_GROUP_MEMBER_ADD "Adding user %2 to group %1" - IDS_ACTION_GROUP_MEMBER_REMOVE "Removing user %2 from group %1" - IDS_ACTION_USER_PW_CHANGE "Setting password for user %1" - IDS_UNKNOWN_NAME "(unknown)" - IDS_ACTION_USER_UNLOCK "Unlocking account for user %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "Group Creation Quota" - IDS_MCHCOL_UID "Account ID" - IDS_MCHCOL_OWNER "Owner" - IDS_MCHCOL_CREATOR "Creator" - IDS_OPTIONS_TITLE "AFS Account Manager Options" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE "All groups to which this account belongs:" - IDS_MACHINE_SHOW_OWNER_TITLE "All groups which this account owns:" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE - "All groups to which these accounts belong:" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE - "All groups to which this account will belong:" - IDS_NEWMACHINE_SHOW_OWNER_TITLE "All groups which this account will own:" - IDS_WARNING_TITLE "Caution" - IDS_WARNING_SYSTEM_ACCOUNT "Changes should be made to the %1 account with caution, as inappropriate changes to this account can prevent some features of AFS from functioning properly.\n\nAre you sure you want to proceed?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "The AFS Account Manager was unable to contact an administration process running on the %1 computer.\n\nYou can perform administrative tasks remotely by running the TaAfsAdmSvr.exe program on the other computer." - IDS_ERROR_BAD_LOCAL_SERVER - "The AFS Account Manager was unable to find the TaAfsAdmSvr.exe program, or was unable to prepare your computer to perform AFS administration." - IDS_ERROR_CANT_OPEN_CELL - "The AFS Account Manager was unable to contact any servers in the %1 cell.\n\nPlease recheck to ensure you have typed the name of the cell correctly." - IDS_ERROR_BADCREDENTIALS - "The AFS identity you have entered is unrecognized, or the password you have specified is incorrect." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "Error number 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Error number 0x%1 (%2) is unrecognized." - IDS_ERROR_USER_MULTIPROP - "The AFS Account Manager cannot display the window requested because a properties window is already open for one or more of the selected users." - IDS_ERROR_CANT_CHANGE_USER - "The AFS Account Manager was unable to change the properties for user %1." - IDS_ERROR_GROUP_MULTIPROP - "The AFS Account Manager cannot display the window requested because a properties window is already open for one or more of the selected group." - IDS_ERROR_CANT_CHANGE_GROUP - "The AFS Account Manager was unable to change the properties for group %1." - IDS_ERROR_CANT_TRANSLATE_USER - "The AFS Account Manager was unable to find a user by the name you specified.\n\nPlease check to make sure you typed the name correctly." - IDS_ERROR_CANT_TRANSLATE_GROUP - "The AFS Account Manager was unable to find a user by the name you specified.\n\nPlease check to make sure you typed the name correctly." - IDS_ERROR_CANT_GET_USERPROP - "The AFS Account Manager was unable to find properties for user %1." - IDS_ERROR_CANT_CHANGE_PASSWORD - "The AFS Account Manager was unable to change the password for user %1." - IDS_ERROR_CANT_GET_RANDOM_KEY - "The AFS Account Manager was unable to generate a random encryption key." - IDS_ERROR_CANT_SET_GROUPS - "The AFS Account Manager was unable to change the specified group list for user %1." - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "The AFS Account Manager was unable to change the specified group list for the following users: %1." - IDS_ERROR_CANT_UNLOCK "The AFS Account Manager was unable to unlock user %1's account." - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "The AFS Account Manager was unable to unlock the accounts for the following users: %1." - IDS_ERROR_CANT_SET_MEMBERS - "The AFS Account Manager was unable to change the list of members for group %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "The AFS Account Manager was unable to change the lists of members for the following groups: %1." - IDS_ERROR_CANT_RENAME_GROUP - "The AFS Account Manager was unable to rename the %1 group to ""%2""." - IDS_ERROR_CANT_CHANGE_OWNER - "The AFS Account Manager was unable to change the owner of the %1 group." - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "The AFS Account Manager was unable to change the owners of the following groups: %1." - IDS_ERROR_CANT_CHANGE_CELL - "The AFS Account Manager was unable to change the properties of the %1 cell." - IDS_ERROR_NO_PASSWORD_GIVEN - "You must specify a password for the user account you are creating." - IDS_ERROR_MISMATCH_PASSWORD_GIVEN - "The passwords you entered for the new user account do not match." - IDS_ERROR_CANT_CREATE_USER - "The AFS Account Manager was unable to create an account for user %1." - IDS_ERROR_CANT_CREATE_GROUP - "The AFS Account Manager was unable to create group %1." - IDS_ERROR_CANT_DELETE_USER - "The AFS Account Manager was unable to delete the account for user %1." - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "The AFS Account Manager was unable to delete the accounts for the following users: %1." - IDS_ERROR_CANT_DELETE_GROUP - "The AFS Account Manager was unable to delete group %1." - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "The AFS Account Manager was unable to delete the following groups: %1." - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "The AFS Account Manager was unable to start because the AFS Control Center was not properly installed.\n\nYou may need to reinstall the AFS Control Center." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "Error - AFS Account Manager" - IDS_CMDLINE_SYNTAX "The command-line you have specified for the AFS Account Manager is invalid." - IDS_CMDLINE_UNRECOGNIZED - "The command-line you have specified for the AFS Account Manager is invalid.\n\nThe ""%1"" parameter is not recognized." - IDS_CMDLINE_DUPLICATE "The command-line you have specified for the AFS Account Manager is invalid.\n\nThe ""%1"" parameter is specified more than once." - IDS_CMDLINE_UNEXPECTVALUE - "The command-line you have specified for the AFS Account Manager is invalid.\n\nThe ""%1"" parameter should not be given a value." - IDS_CMDLINE_MISSINGVAL "The command-line you have specified for the AFS Account Manager is invalid.\n\nThe ""%1"" parameter must be followed by a value." - IDS_CMDLINE_USERPASSWORD - "The command-line you have specified for the AFS Account Manager is invalid.\n\nTo obtain new AFS tokens, the ""/USER"" and ""/PASSWORD"" parameters must both be specified." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/es_ES/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/es_ES/AfsUsrMgr.rc deleted file mode 100644 index 10fba796d..000000000 --- a/src/WINNT/afsusrmgr/lang/es_ES/AfsUsrMgr.rc +++ /dev/null @@ -1,1798 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Account Manager" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 327, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS Account Manager" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,319,184 - LTEXT "Célula seleccionada:",IDC_STATIC,4,7,68,8 - LTEXT "(ninguna seleccionada)",IDC_CELL,79,7,212,8 - LTEXT "Señales de AFS:",IDC_STATIC,4,18,55,8 - LTEXT "(no hay señales)",IDC_CREDS,79,17,212,8 - ICON IDI_MAIN,IDC_ANIM,302,7,21,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,41,13,ES_AUTOHSCROLL - RTEXT "Patrón:",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "Consultando; espere por favor...",IDC_USERS_TITLE,4,6, - 142,8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Crear...",M_USER_CREATE,65,126,55,14 - PUSHBUTTON "&Pertenencia...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&ropiedades...",M_PROPERTIES,183,126,55,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Patrón:",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "Consultando; espere por favor...",IDC_GROUPS_TITLE,4,6, - 142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Crear...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "&Miembros...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&ropiedades...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Operaciones en curso - AFS Account Manager" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Consultando; espere por favor...",IDC_ACTION_DESC,2,2, - 232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Acerca de AFS Account Manager" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,21,20 - LTEXT "AFS Account Manager versión 3.5",IDC_STATIC,33,8,189,8 - LTEXT "Copyright © IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "&Cerrar",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 223, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Buscar código de error" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Número de &error:",IDC_STATIC,4,41,55,8 - EDITTEXT IDC_ERROR_NUMBER,61,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Convertir",IDC_ERROR_TRANSLATE,152,39,67,14 - PUSHBUTTON "Ce&rrar",IDCANCEL,85,123,48,14 - LTEXT "(texto definido durante la ejecución)",IDC_ERROR_DESC,4, - 71,215,42 - LTEXT "Para averiguar qué es lo que significa un código de error, escriba el código a continuación y pulse en el botón ""Convertir"".", - IDC_STATIC,4,4,215,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,5,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Buscar mandato" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Mostrar a&yuda",IDOK,160,39,67,14 - PUSHBUTTON "&Cancelar",IDCANCEL,160,55,67,14 - LTEXT "Para averiguar el modo de utilizar AFS Account Manager para efectuar una tarea, seleccione a continuación una línea de mandatos y pulse en el botón Mostrar ayuda.", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Columnas" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Seleccione las columnas para visualizar al efectuar el listado:", - IDC_STATIC,5,5,126,17 - COMBOBOX IDC_COLUMNS,134,8,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Columnas disponibles:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Columnas para &visualizar:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "A&ñadir >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< &Eliminar",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "Mover hacia &arriba",IDC_COL_UP,141,122,64,14 - PUSHBUTTON "Mover hacia a&bajo",IDC_COL_DOWN,207,122,65,14 - GROUPBOX "Listar columnas",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 201 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avanzado" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Clave actual:",IDC_STATIC,5,5,44,13 - LTEXT "Consultando; espere por favor...",IDC_USER_KEY,52,5,173, - 20,0,WS_EX_STATICEDGE - CONTROL "&No es una cuenta del sistema (no hay cifrado)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 35,160,10 - CONTROL "El usuario tiene privilegios &administrativos", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 52,160,10 - CONTROL "O&torgar billetes; duración:",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,69,99,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 110,68,66,12 - CONTROL "C&uota de creación de grupo:",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,86,102,10 - EDITTEXT IDC_USER_GROUP_QUOTA,111,85,27,13,ES_AUTOHSCROLL - LTEXT "Ver e&stado de cuenta:",IDC_STATIC,12,140,91,8 - COMBOBOX IDC_USER_PERM_STATUS,108,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar grupos de pro&piedad:",IDC_STATIC,12,156,88,8 - COMBOBOX IDC_USER_PERM_OWNED,108,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar pertenencia a &grupos:",IDC_STATIC,12,172,91,8 - COMBOBOX IDC_USER_PERM_MEMBER,108,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Otros permisos de cuenta",IDC_STATIC,5,103,220,93 - LTEXT "Estos valores especifican los usuarios que pueden ver esta cuenta.", - IDC_STATIC,11,116,204,19 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 303, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "El &usuario puede cambiar la contraseña",IDC_USER_CPW, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,47,146,10 - PUSHBUTTON "Cambiar con&traseña",IDC_USER_CPW_NOW,215,45,73,14 - CONTROL "El usuario puede &volver a utilizar contraseñas antiguas", - IDC_USER_RPW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,62, - 193,10 - CONTROL "La c&ontraseña caduca después de",IDC_USER_PWEXPIRES, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,78,126,10 - LTEXT "días",IDC_STATIC,206,79,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,152,77,37,13,ES_AUTOHSCROLL - CONTROL "La cuenta &caduca el:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,61,12 - LTEXT "&a las",IDC_USER_EXPIRE_AT,157,98,15,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 176,96,53,12 - CONTROL "B&loquear la cuenta después de",IDC_USER_FAILLOCK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,140,111,10 - LTEXT "inicios de sesión consecutivos anómalos",IDC_STATIC,164, - 142,129,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,124,139,32,13,ES_AUTOHSCROLL - CONTROL "&Bloquear la cuenta indefinidamente (hasta que la desbloquee el administrador)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 26,156,260,10 - CONTROL "Bloquear cuenta d&urante",IDC_USER_FAILLOCK_FINITE, - "Button",BS_AUTORADIOBUTTON,25,172,94,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,125,171,56,12 - PUSHBUTTON "&Desbloquear",IDC_USER_UNLOCK,236,170,50,14 - GROUPBOX "Intentos de inicio de sesión anómalos",IDC_STATIC,5,125, - 293,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Usuario %1",IDC_USER_NAME,110,13,188,8 - GROUPBOX "Cuenta",IDC_STATIC,5,32,293,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 248, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,21,20 - LTEXT "Grupo %1",IDC_GROUP_NAME,55,13,188,8 - LTEXT "Ver e&stado de cuenta:",IDC_STATIC,12,108,85,8 - COMBOBOX IDC_GROUP_PERM_STATUS,114,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Ver &grupos de propietario:",IDC_STATIC,12,124,86,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,114,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &miembros de grupo:",IDC_STATIC,12,140,89,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,114,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Añadir miembros:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,114,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Eliminar miembros:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,114,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Otros permisos de cuenta",IDC_STATIC,5,78,238,114 - LTEXT "Estos valores especifican los usuarios que pueden ver este grupo.", - IDC_STATIC,11,92,220,8 - LTEXT "Propietario:",IDC_STATIC,5,31,40,8 - LTEXT "%1",IDC_GROUP_OWNER,51,31,112,8 - PUSHBUTTON "Cambiar &propietario...",IDC_GROUP_CHANGEOWNER,166,29, - 77,12 - LTEXT "Creador:",IDC_STATIC,5,46,27,8 - LTEXT "%1",IDC_GROUP_CREATOR,51,46,113,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estos valores le permiten cambiar la lista de grupos a los que pertenece este usuario, así como la lista de grupos que posee este usuario.", - IDC_STATIC,5,5,220,25 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Eliminar",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Añadir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar los grupos a los que pertenece este usuario", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar los grupos que posee este usuario", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando; espere por favor...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Pertenencia" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Pertenencia a grupo",IDC_STATIC,5,31,220,160 - LTEXT "Estos valores le permiten elegir los miembros de este grupo, así como elegir los grupos que debe poseer este grupo.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Eliminar",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Añadir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar los miembros de este grupo", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar los grupos que posee este grupo", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando; espere por favor...)",IDC_USERS_TITLE,12, - 74,205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 316, 151 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Título seleccionado en el momento de la ejecución)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(en ejecución)",IDC_BROWSE_TYPE,7,115,78,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,87,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Seleccionar",IDC_BROWSE_SELECT,259,112,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,259,130,50,14 - CONTROL "(texto especificado durante la ejecución)", - IDC_BROWSE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 86,134,146,10 - RTEXT "Buscar en &célula:",IDC_STATIC,7,8,69,10,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,87,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Patrón:",IDC_GROUPS_PATTERN_PROMPT,231,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,268,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,302,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 316, 146 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Cambiar contraseña de cuenta" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Seleccionar &automáticamente un número de versión para la nueva contraseña", - IDC_CPW_VERSION_AUTO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,42,36,261,10 - CONTROL "&Utilizar versión clave:",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,42,52,85,10 - EDITTEXT IDC_CPW_VERSION,138,51,43,14,ES_AUTOHSCROLL - CONTROL "Cifrar esta serie:",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,42,78,73,10 - CONTROL "Utilizar esta clave:",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,42,95,85,10 - EDITTEXT IDC_CPW_STRING,154,76,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,137,94,103,14,ES_AUTOHSCROLL - PUSHBUTTON "A&leatorio",IDC_CPW_RANDOM,261,94,48,14 - DEFPUSHBUTTON "Aceptar",IDOK,116,125,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,170,125,50,14 - PUSHBUTTON "Ayuda",9,259,125,50,14 - LTEXT "Nueva contraseña para el usuario %1",IDC_CPW_TITLE,78, - 14,231,8 - ICON IDI_USER,-1,7,6,21,20 - LTEXT "Versión:",-1,7,37,26,8 - LTEXT "Valor:",-1,7,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 282, 151 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Cambiar nombre de grupo" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Nombre de grupo nuevo:",IDC_STATIC,35,103,80,8 - EDITTEXT IDC_RENAME_NEWNAME,117,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,109,130,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,163,130,50,14 - PUSHBUTTON "Ayuda",9,225,130,50,14 - LTEXT "Propietario actual:",IDC_STATIC,35,65,69,8 - PUSHBUTTON "&Cambiar propietario...",IDC_RENAME_CHOWN,204,63,71,14 - LTEXT "Nombre de grupo actual:",IDC_STATIC,35,83,80,8 - ICON IDI_GROUP,IDC_STATIC,7,6,21,20 - LTEXT "Cambiar nombre de grupo %1",IDC_RENAME_TITLE,35,14,222, - 8 - LTEXT "Nota: A menos que un nombre de grupo carezca de prefijo, el nombre debería reflejar de modo adecuado el propietario actual del grupo (por ejemplo, ""owner:groupname"").", - IDC_STATIC,35,34,231,28 - LTEXT "(consultando)",IDC_RENAME_OWNER,117,65,82,8 - LTEXT "(consultando)",IDC_RENAME_OLDNAME,117,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 314, 154 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Título seleccionado en el momento de la ejecución)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(en ejecución)",IDC_BROWSE_TYPE,7,115,83,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,94,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Seleccionar",IDC_BROWSE_SELECT,257,113,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,257,133,50,14 - RTEXT "Mostrar:",IDC_STATIC,40,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,94,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Buscar en &célula:",IDC_STATIC,7,8,78,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,90,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Patrón:",IDC_GROUPS_PATTERN_PROMPT,233,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,266,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,300,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 308, 170 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Título seleccionado en el momento de la ejecución)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(en ejecución)",IDC_BROWSE_TYPE,7,115,77,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,88,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Seleccionar",IDC_BROWSE_SELECT,251,113,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,251,132,50,14 - RTEXT "Mostrar:",IDC_STATIC,32,134,52,8 - COMBOBOX IDC_BROWSE_COMBO,88,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(texto especificado durante la ejecución)", - IDC_BROWSE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 88,151,159,10 - RTEXT "Buscar en &célula:",IDC_STATIC,7,8,68,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,84,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Patrón:",IDC_GROUPS_PATTERN_PROMPT,227,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,260,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,294,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estos valores le permiten cambiar la lista inicial de grupos a los que pertenecerá este usuario, así como los grupos que poseerá este usuario.", - IDC_STATIC,5,5,220,26 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Eliminar",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Añadir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar los grupos a los que pertenecerá este usuario", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar los grupos que poseerá este usuario", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando; espere por favor...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 277, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Crear usuario" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Nombre:",IDC_STATIC,7,37,49,8 - EDITTEXT IDC_NEWUSER_NAME,64,35,127,14,ES_AUTOHSCROLL - LTEXT "C&ontraseña:",IDC_STATIC,7,57,49,8 - EDITTEXT IDC_NEWUSER_PW1,64,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "(&volver a entrar:)",IDC_STATIC,7,77,53,8 - EDITTEXT IDC_NEWUSER_PW2,64,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "Utilizar a&utomáticamente el siguiente ID de usuario disponible", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,64,97, - 204,10 - CONTROL "U&tilizar un ID de usuario específico:", - IDC_NEWUSER_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,64,113, - 124,10 - EDITTEXT IDC_NEWUSER_ID,196,111,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Grupos...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "Aceptar",IDOK,133,149,43,14 - PUSHBUTTON "Cancelar",IDCANCEL,180,149,43,14 - PUSHBUTTON "Ayuda",9,227,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,21,20 - LTEXT "Usuario nuevo en célula %1",IDC_NEWUSER_TITLE,85,14,185, - 8 - LTEXT "ID de usuario:",IDC_STATIC,7,97,49,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 252, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,21,20 - LTEXT "Grupo nuevo en célula %1",IDC_GROUP_NAME,59,13,188,8 - LTEXT "Ver e&stado de cuenta:",IDC_STATIC,12,108,106,8 - COMBOBOX IDC_GROUP_PERM_STATUS,125,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Ver &grupos de propietario:",IDC_STATIC,12,124,107,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,125,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &miembros de grupo:",IDC_STATIC,12,140,106,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,125,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Añadir miembros:",IDC_STATIC,12,156,110,8 - COMBOBOX IDC_GROUP_PERM_ADD,125,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Eliminar miembros:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,125,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Otros permisos de cuenta",IDC_STATIC,5,69,242,123 - LTEXT "Estos valores especifican los usuarios que pueden ver información sobre este grupo.", - IDC_STATIC,11,83,223,17 - LTEXT "Propietario:",IDC_STATIC,5,35,46,8 - LTEXT "%1",IDC_GROUP_OWNER,56,35,113,8 - PUSHBUTTON "Cambiar &propietario...",IDC_GROUP_CHANGEOWNER,173,33, - 70,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Pertenencia" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Pertenencia a grupo",IDC_STATIC,5,31,220,160 - LTEXT "Estos valores le permiten elegir los miembros iniciales de este grupo, así como elegir los grupos que debe poseer este grupo.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Eliminar",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Añadir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar los miembros iniciales de este grupo", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar los grupos que posee este grupo", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando; espere por favor...)",IDC_USERS_TITLE,12, - 74,205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 255, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Crear grupo" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Nombre:",-1,7,37,30,8 - EDITTEXT IDC_NEWGROUP_NAME,45,35,127,14,ES_AUTOHSCROLL - CONTROL "Utilizar a&utomáticamente el siguiente ID de grupo disponible", - IDC_NEWGROUP_ID_AUTO,"Button",BS_AUTORADIOBUTTON,49,60, - 200,10 - CONTROL "U&tilizar un ID de grupo específico:", - IDC_NEWGROUP_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,49,75, - 122,10 - EDITTEXT IDC_NEWGROUP_ID,173,74,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Miembros...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "Aceptar",IDOK,111,114,43,14 - PUSHBUTTON "Cancelar",IDCANCEL,158,114,43,14 - PUSHBUTTON "Ayuda",9,205,114,43,14 - ICON IDI_USER,-1,7,6,21,20 - LTEXT "Grupo nuevo en célula %1",IDC_NEWGROUP_TITLE,63,14,185, - 8 - LTEXT "ID de grupo:",-1,7,60,41,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Suprimir usuario" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Aceptar",IDOK,116,93,50,14 - DEFPUSHBUTTON "Cancelar",IDCANCEL,170,93,50,14 - PUSHBUTTON "Ayuda",9,224,93,50,14 - LTEXT "¡Precaución!\n\nEsta operación suprimirá permanentemente la cuenta para el usuario %1.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,20,20 - CONTROL "Suprimir entrada de base de datos de &KAS para esta cuenta", - IDC_DELETE_KAS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 53,210,10 - CONTROL "Suprimir entrada de base de datos de &PTS para esta cuenta", - IDC_DELETE_PTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Suprimir grupo" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Aceptar",IDOK,116,61,50,14 - DEFPUSHBUTTON "Cancelar",IDCANCEL,170,61,50,14 - PUSHBUTTON "Ayuda",9,224,61,50,14 - LTEXT "¡Precaución!\n\nEsta operación suprimirá permanentemente el grupo %1.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Identificador de &usuario máximo:",IDC_STATIC,11,87,101, - 8 - EDITTEXT IDC_CELL_USERMAX,116,85,40,14,ES_AUTOHSCROLL - LTEXT "Identificador de &grupo máximo:",IDC_STATIC,14,105,98,8 - EDITTEXT IDC_CELL_GROUPMAX,116,103,40,14,ES_AUTOHSCROLL - GROUPBOX "Identificadores de usuario y grupo",IDC_STATIC,5,31,220, - 97 - LTEXT "Estos valores reflejan los identificadores de grupo y de usuario más altos que se hayan utilizado nunca; sin embargo, no deben disminuirse a menos que se esté seguro de que los valores nuevos no entrarán en conflicto con las cuentas existentes. ", - IDC_STATIC,11,43,204,32 - ICON IDI_CELL,IDC_STATIC,5,5,20,20 - LTEXT "Célula %1",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 303, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "El &usuario puede cambiar la contraseña",IDC_USER_CPW, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,47,141,10 - PUSHBUTTON "Cambiar con&traseña",IDC_USER_CPW_NOW,211,45,73,14 - CONTROL "El usuario puede &volver a utilizar contraseñas antiguas", - IDC_USER_RPW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,62, - 187,10 - CONTROL "La contraseña &caduca después de",IDC_USER_PWEXPIRES, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,78,129,10 - LTEXT "días",IDC_STATIC,199,79,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,157,77,37,13,ES_AUTOHSCROLL - CONTROL "La cue&nta caduca el:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,61,12 - LTEXT "&a las",IDC_USER_EXPIRE_AT,155,98,16,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 174,96,53,12 - CONTROL "&Bloquear la cuenta después de",IDC_USER_FAILLOCK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,140,114,10 - LTEXT "inicios de sesión consecutivos anómalos",IDC_STATIC,165, - 141,130,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,126,139,32,13,ES_AUTOHSCROLL - CONTROL "B&loquear la cuenta indefinidamente (hasta que la desbloquee el administrador)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,258,10 - CONTROL "Bloquear cuenta d&urante",IDC_USER_FAILLOCK_FINITE, - "Button",BS_AUTORADIOBUTTON,25,172,97,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,126,171,56,12 - PUSHBUTTON "&Desbloquear",IDC_USER_UNLOCK,231,170,50,14 - GROUPBOX "Intentos de inicio de sesión anómalos",IDC_STATIC,5,125, - 293,67 - ICON IDI_USER,IDC_STATIC,5,5,21,20 - LTEXT "Usuario nuevo en célula %1",IDC_USER_NAME,110,13,188,8 - GROUPBOX "Cuenta",IDC_STATIC,5,32,293,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 284, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avanzado" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Crear una entrada de base de datos de &KAS para esta cuenta (recomendado)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,260,11 - CONTROL "Crear una entrada de base de datos de &PTS para esta cuenta (recomendado)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,260,10 - CONTROL "&Esta es una cuenta de sistema (no hay cifrado)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 40,245,10 - CONTROL "El usuario tiene privilegios &administrativos", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 57,234,10 - CONTROL "O&torgar billetes; duración:",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,73,114,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 122,73,66,12 - CONTROL "C&uota de creación de grupos:",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,91,113,10 - EDITTEXT IDC_USER_GROUP_QUOTA,122,90,27,13,ES_AUTOHSCROLL - LTEXT "Ver e&stado de cuenta:",-1,12,140,99,8 - COMBOBOX IDC_USER_PERM_STATUS,120,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Listar grupos de propiedad:",-1,12,156,102,8 - COMBOBOX IDC_USER_PERM_OWNED,120,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar pertenencia a &grupo:",-1,12,172,100,8 - COMBOBOX IDC_USER_PERM_MEMBER,120,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Otros permisos de cuenta",-1,5,110,274,82 - LTEXT "Estos valores especifican los usuarios que pueden ver esta cuenta.", - -1,11,124,259,8 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Patrón:",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "Consultando; espere por favor...",IDC_MACHINES_TITLE,4, - 6,142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Crear...",M_MACHINE_CREATE,65,126,55,14 - PUSHBUTTON "&Pertenencia...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&ropiedades...",M_PROPERTIES,183,126,55,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estos valores le permiten seleccionar la lista inicial de grupos a los que pertenecerá esta cuenta, así como los grupos que poseerá.", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Eliminar",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Añadir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar los grupos a los que pertenecerá esta cuenta", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar los grupos que poseerá esta cuenta", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando; espere por favor...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avanzado" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Ver e&stado de cuenta:",IDC_STATIC,12,96,86,8 - COMBOBOX IDC_USER_PERM_STATUS,107,94,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar grupos de pro&piedad:",IDC_STATIC,12,112,90,8 - COMBOBOX IDC_USER_PERM_OWNED,107,110,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar pertenencia a &grupos:",IDC_STATIC,12,128,89,8 - COMBOBOX IDC_USER_PERM_MEMBER,107,126,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Otros permisos de cuenta",IDC_STATIC,5,57,220,88 - LTEXT "Estos valores especifican los usuarios que pueden ver esta cuenta.", - IDC_STATIC,11,72,204,16 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "Cuenta de dirección IP nueva en la célula %1", - IDC_USER_NAME,37,13,188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 277, 127 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Crear cuenta de dirección IP" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Dirección IP:",-1,7,37,48,8 - EDITTEXT IDC_NEWUSER_NAME,59,35,127,14,ES_AUTOHSCROLL - CONTROL "Utilizar a&utomáticamente el siguiente ID de cuenta disponible", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,59,60, - 205,10 - CONTROL "U&tilizar un ID de cuenta específico:", - IDC_NEWUSER_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,59,76, - 127,10 - EDITTEXT IDC_NEWUSER_ID,189,75,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Grupos...",IDC_ADVANCED,7,106,54,14 - DEFPUSHBUTTON "Aceptar",IDOK,132,106,43,14 - PUSHBUTTON "Cancelar",IDCANCEL,180,106,43,14 - PUSHBUTTON "Ayuda",9,227,106,43,14 - ICON IDI_SERVER,-1,7,6,21,20 - LTEXT "Cuenta de dirección IP nueva en la célula %1", - IDC_NEWUSER_TITLE,80,14,190,8 - LTEXT "ID de cuenta:",-1,7,60,44,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Suprimir cuenta de dirección IP" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Aceptar",IDOK,153,63,50,14 - DEFPUSHBUTTON "Cancelar",IDCANCEL,207,63,50,14 - PUSHBUTTON "Ayuda",9,261,63,50,14 - LTEXT "¡Precaución!\n\nEsta operación suprimirá permanentemente la cuenta de dirección IP %1.", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 202 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avanzado" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Ver e&stado de cuenta:",IDC_STATIC,12,101,88,8 - COMBOBOX IDC_USER_PERM_STATUS,107,98,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar grupos de pro&piedad:",IDC_STATIC,12,117,91,8 - COMBOBOX IDC_USER_PERM_OWNED,107,114,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar pertenencia a &grupos:",IDC_STATIC,12,133,91,8 - COMBOBOX IDC_USER_PERM_MEMBER,107,130,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Otros permisos de cuenta",IDC_STATIC,5,57,220,94 - LTEXT "Estos valores especifican los usuarios que pueden ver esta cuenta.", - IDC_STATIC,11,73,204,18 - ICON IDI_SERVER,IDC_STATIC,5,5,21,20 - LTEXT "Cuenta de dirección IP %1",IDC_USER_NAME,37,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estos valores le permiten cambiar la lista de grupos a los que pertenece esta cuenta, así como los grupos que posee esta cuenta.", - IDC_STATIC,5,5,220,25,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Eliminar",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Añadir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar los grupos a los que pertenece esta cuenta", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 206,10 - CONTROL "M&ostrar los grupos que posee esta cuenta", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 206,10 - LTEXT "(Consultando; espere por favor...)",IDC_GROUPS_TITLE,12, - 74,205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 248, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Opciones" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Utilizar expresiones normales de tipo &Unix (""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,213,10 - CONTROL "Utilizar expresiones normales de tipo &Windows (""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,212, - 10 - CONTROL "Visualizar un aviso si se trabaja sin señales administrativas", - IDC_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,116,209,10 - CONTROL "&Actualizar automáticamente la información cada", - IDC_REFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,134, - 162,10 - LTEXT "min.",IDC_STATIC,223,135,14,8 - EDITTEXT IDC_REFRESH_RATE,178,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,20,20 - LTEXT "Opciones de Afs Account Manager",IDC_STATIC,37,12,96,8 - GROUPBOX "Expresiones normales",IDC_STATIC,5,37,238,57 - GROUPBOX "General",IDC_STATIC,5,100,238,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 311, 130 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Seleccionar los usuarios a visualizar" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Mostrar entradas para &todas las cuentas de usuario", - IDC_SEARCH_ALL,"Button",BS_AUTORADIOBUTTON,29,40,236,10 - CONTROL "&Mostrar sólo las cuentas de usuario que caducan antes de", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON,29,55,202, - 10 - CONTROL "Mostrar sólo las cuentas cuyas contraseñas &caducan antes de", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON,29,70, - 213,10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 232,54,61,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,244,69,61,12 - DEFPUSHBUTTON "Aceptar",IDOK,146,108,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,200,108,50,14 - PUSHBUTTON "Ayuda",9,254,108,50,14 - LTEXT "Estos controles le permiten especificar los usuarios que deben mostrarse en el tabulador Usuarios. Puede restringir aún más la lista de usuarios que se muestra escribiendo un nombre de cuenta parcial en el control Patrón en el tabulador Usuarios. ", - IDC_STATIC,7,6,297,32 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 323 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 219 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 196 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 298 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 243 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 309 - TOPMARGIN, 6 - BOTTOMMARGIN, 144 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 309 - TOPMARGIN, 6 - BOTTOMMARGIN, 139 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 275 - TOPMARGIN, 6 - BOTTOMMARGIN, 144 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 307 - TOPMARGIN, 6 - BOTTOMMARGIN, 147 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 301 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 270 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 247 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 248 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 298 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 279 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 270 - TOPMARGIN, 6 - BOTTOMMARGIN, 120 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 197 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 243 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 304 - TOPMARGIN, 6 - BOTTOMMARGIN, 129 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Account Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Célula" - BEGIN - MENUITEM "S&eleccionar...", M_OPENCELL - MENUITEM "&Autentificación...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "P&ropiedades de célula...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "&Salir", M_EXIT - END - POPUP "&Editar" - BEGIN - MENUITEM "Crear &usuario...", M_USER_CREATE - MENUITEM "Crear &grupo...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Cambiar &nombre...", M_RENAME - MENUITEM "&Suprimir...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "Seleccionar &todo\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "A&ctualizar\tF5", M_REFRESH - MENUITEM "&Pertenencia...\tCtrl+M", M_MEMBERSHIP - MENUITEM "P&ropiedades\tAlt+Intro", M_PROPERTIES - END - POPUP "&Ver" - BEGIN - POPUP "&Iconos" - BEGIN - MENUITEM "Iconos &grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Iconos &pequeños", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalles", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWO, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "O&peraciones en curso", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Columnas...", M_COLUMNS - MENUITEM "&Opciones...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL - END - POPUP "A&yuda" - BEGIN - MENUITEM "&Contenido", M_CONTENTS - MENUITEM "Buscar &mandato...", M_FIND - MENUITEM "Buscar código de &error...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "&Acerca de AFS Account Manager...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "Iconos &grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Iconos &pequeños", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalles", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWO, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Crear usuario...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "Iconos &grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Iconos &pequeños", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalles", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWO, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Crear grupo...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "&Grupos...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Cambiar contraseña...", M_CPW - MENUITEM "&Desbloquear", M_UNLOCK - MENUITEM "&Suprimir...", M_DELETE - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&ropiedades...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "&Miembros de grupo...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "Cambia&r nombre...", M_RENAME - MENUITEM "&Suprimir...", M_DELETE - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&ropiedades...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Columnas...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "&Ver" - BEGIN - MENUITEM "Iconos &grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Iconos &pequeños", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalles", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos los iconos", M_VIEW_TWO, CHECKED - MENUITEM "Sólo &estado", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Crear cuenta...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "Ac&tualizar todo", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "&Grupos...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Suprimir...", M_DELETE - MENUITEM "Ac&tualizar", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&ropiedades...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS Account Manager" - IDS_USRCOL_NAME "Nombre de usuario" - IDS_GRPCOL_NAME "Nombre de grupo" - IDS_BADCREDS_DESC "A menos que inicie la sesión como administrador, es posible que no disponga de privilegios suficientes para administrar satisfactoriamente la célula %1." - IDS_TAB_USERS "Usuarios" - IDS_TAB_GROUPS "Grupos" - IDS_CELL_NONE "(no se ha seleccionado ninguna célula)" - IDS_CRED_NONE "(no hay señales en esta célula)" - IDS_CRED_EXP "%1 (han caducado las señales %2)" - IDS_CRED_OK "%1 (caducarán las señales %2)" - IDS_USERS_ALL "Todos los usuarios de la célula %1:" - IDS_USERS_PATTERN "Usuarios seleccionados de la célula %1:" - IDS_GROUPS_ALL "Todos los grupos de la célula %1:" - IDS_GROUPS_PATTERN "Grupos seleccionados de la célula %1:" - IDS_QUERYING_LONG "Consultando; espere por favor..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "No hay operaciones en curso." - IDS_ACTION_DESC_ONE "La operación siguiente está actualmente en curso:" - IDS_ACTION_DESC_MULT "Las operaciones siguientes están actualmente en curso:" - IDS_ACTCOL_OPERATION "Operación" - IDS_ACTCOL_ELAPSED "Tiempo transcurrido" - IDS_ACTION_REFRESH_CELL "Actualización de información para la célula %1" - IDS_ACTION_REFRESH_SERVER "Actualización de información para servidor %1" - IDS_ACTION_SCOUT_CELL "Comprobando si hay problemas en la célula %1" - IDS_ACTION_SCOUT_SERVER "Comprobando si hay problemas en el servidor %1" - IDS_FIND_NOTHING_TITLE "No hay ningún mandato seleccionado" - IDS_FIND_NOTHING_DESC "Para averiguar el modo de efectuar una operación, seleccione en primer lugar una línea de mandatos de la lista o escriba una palabra clave." - IDS_FIND_UNKNOWN_TITLE "Mandato desconocido" - IDS_FIND_UNKNOWN_DESC "AFS Account Manager no ha podido encontrar ningún tema de ayuda para el mandato ""%1""." - IDS_HELPABOUT_DESC1 "Aviso: este programa de sistema está protegido por el copyright y tratados internacionales. +" - IDS_HELPABOUT_DESC2 "La reproducción o distribución no autorizada de este software puede dar como resultado la aplicación de graves sanciones civiles y criminales y se perseguirá por todos los medios legales posibles.\n\n+" - IDS_HELPABOUT_DESC3 "AFS es una marca registrada de Transarc Corporation, una compañía de IBM." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "Columnas - AFS Account Manager" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "Múltiples usuarios - Propiedades" - IDS_USER_PROPERTIES_TITLE "Usuario %1 - Propiedades" - IDS_USER_NAME_MULTIPLE "Usuarios " - IDS_ACCOUNTACCESS_OWNER "Sólo propietario de cuenta" - IDS_ACCOUNTACCESS_GROUP "Sólo miembros de grupo" - IDS_ACCOUNTACCESS_ANYONE "Cualquiera" - IDS_ACCOUNTACCESS_MIXED "(múltiples configuraciones)" - IDS_USER_KEY "%1\nVersión %2, Suma de comprobación %3" - IDS_USER_KEY_HIDDEN "(valor de clave real oculto)" - IDS_USER_KEY_UNKNOWN "(desconocido)" - IDS_USER_KEY_MULTIPLE "(múltiples claves)" - IDS_ACTION_USER_CHANGE "Cambio de propiedades para el usuario %1" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "Múltiples grupos - Propiedades" - IDS_GROUP_PROPERTIES_TITLE "Grupo %1 - Propiedades" - IDS_GROUP_NAME_MULTIPLE "Grupos " - IDS_ACCOUNTACCESS_OWNGROUP "Sólo propietario de grupo" - IDS_OWNER_MIXED "Múltiples propietarios" - IDS_CREATOR_MIXED "Múltiples creadores" - IDS_GROUP_CHANGEOWNER_TITLE "Cambiar propietario de grupo" - IDS_GROUP_CHANGEOWNER_PROMPT "Propietario:" - IDS_MEMBER_MIXED "(Algunos)" - IDS_USER_SHOW_MEMBER_TITLE - "Todos los grupos a los que pertenece este usuario:" - IDS_USER_SHOW_OWNER_TITLE "Todos los grupos que posee este usuario:" - IDS_GROUP_SHOW_MEMBER_TITLE "Todos los miembros de este grupo:" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE - "Todos los grupos a los que pertenecen estos usuarios:" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "Todos los miembros de estos grupos:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "Cambiando el nombre del grupo %1 por %2" - IDS_RENAME_TITLE "Cambiar nombre de grupo %1" - IDS_GROUP_TITLE "Grupo %1" - IDS_SHOW_USERS "Todos los usuarios de esta célula" - IDS_SHOW_GROUPS "Todos los grupos de esta célula" - IDS_GROUP_SHOW_OWNED_TITLE "Todos los grupos que posee este grupo:" - IDS_BROWSE_TITLE_OWNED "Seleccionar los grupos a poseer" - IDS_BROWSE_PROMPT_OWNED "Grupos:" - IDS_BROWSE_CHECK_OWNED "Mostrar sólo los grupos que no se poseen en la actualidad" - IDS_NEWUSER_PROPERTIES_TITLE "Crear usuario - Avanzado" - IDS_NEWUSER_SHOW_MEMBER_TITLE - "Todos los grupos a los que pertenecerá este usuario:" - IDS_NEWUSER_SHOW_OWNER_TITLE "Todos los grupos que poseerá este usuario:" - IDS_ACTION_CELL_CHANGE "Cambiando propiedades para célula %1" - IDS_ACTION_USER_CREATE "Creando cuenta para usuario %1" - IDS_NEWGROUP_PROPERTIES_TITLE "Crear grupo - Avanzado" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "Miembros iniciales de este grupo nuevo:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "Indicadores" - IDS_USRCOL_ADMIN "¿Admin?" - IDS_USRCOL_TICKET "¿Billetes?" - IDS_USRCOL_SYSTEM "¿Sistema?" - IDS_USRCOL_CHANGEPW "¿Cambiar contraseñas?" - IDS_USRCOL_REUSEPW "¿Volver a utilizar contraseñas?" - IDS_USRCOL_EXPIRES "Caducidad de cuenta" - IDS_USRCOL_LASTPW "Último cambio de contraseña" - IDS_USRCOL_LASTMOD "Última vez que se ha modificado" - IDS_USRCOL_LASTMODBY "Modificado la última vez por" - IDS_USRCOL_LIFETIME "Duración de billete" - IDS_USRCOL_CDAYPW "Caducidad de contraseña" - IDS_USRCOL_CFAILLOGIN "Anomalías de inicio de sesión" - IDS_USRCOL_CSECLOCK "Hora de bloqueo de anomalía de inicio de sesión" - IDS_USRCOL_CGROUPMAX "Cuota de creación de grupo" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "Propietario" - IDS_USRCOL_CREATOR "Creador" - IDS_USRCOL_STATUS "Estado" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "Sí" - IDS_NO "No" - IDS_GRPCOL_CMEMBERS "Cuenta de pertenencia" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "Propietario" - IDS_GRPCOL_CREATOR "Creador" - IDS_COL_USERS "Usuarios de una célula" - IDS_COL_GROUPS "Grupos de una célula" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE "Grupos que poseerá este grupo nuevo:" - IDS_USER_DELETE_MULTIPLE - "¡Precaución!\n\nEsta operación suprimirá permanentemente las cuentas para los usuarios siguientes: %1" - IDS_GROUP_DELETE_MULTIPLE - "¡Precaución!\n\nEsta operación suprimirá permanentemente los grupos siguientes: %1." - IDS_ACTION_GROUP_CREATE "Creando grupo %1" - IDS_ACTION_USER_DELETE "Suprimiendo cuenta para usuario %1" - IDS_ACTION_GROUP_DELETE "Suprimiendo grupo %1" - IDS_CELL_PROPERTIES_TITLE "Célula %1 - Propiedades" - IDS_MACHINES_ALL "Todas las cuentas de dirección IP de la célula %1:" - IDS_MACHINES_PATTERN "Cuentas de dirección IP seleccionadas en la célula %1:" - IDS_TAB_MACHINES "Direcciones" - IDS_MACHINE_DELETE_MULTIPLE - "¡Precaución!\n\nEsta operación suprimirá permanentemente las cuentas de dirección IP siguientes: %1" - IDS_NEWMACHINE_PROPERTIES_TITLE "Crear Cuenta de dirección IP - Avanzado" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE - "Múltiples cuentas de dirección IP - Propiedades" - IDS_MACHINE_PROPERTIES_TITLE "Cuenta de dirección IP %1 - Propiedades" - IDS_COL_MACHINES "Cuentas de dirección IP de una célula" - IDS_MCHCOL_NAME "Dirección IP" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "Seleccionar los grupos a unir" - IDS_BROWSE_PROMPT_JOIN "Grupos:" - IDS_BROWSE_CHECK_JOIN "Mostrar sólo los grupos no unidos en la actualidad" - IDS_BROWSE_TITLE_OWN "Seleccionar los grupos a poseer" - IDS_BROWSE_PROMPT_OWN "Grupos:" - IDS_BROWSE_CHECK_OWN "Mostrar sólo los grupos que no se poseen en la actualidad" - IDS_BROWSE_TITLE_MEMBER "Seleccionar los usuarios a unir" - IDS_BROWSE_PROMPT_MEMBER "Usuarios:" - IDS_BROWSE_CHECK_MEMBER "Mostrar sólo los usuarios que no son miembros" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "Cambiando las propiedades para el grupo %1" - IDS_ACTION_GROUP_MEMBER_ADD "Añadiendo usuario %2 a grupo %1" - IDS_ACTION_GROUP_MEMBER_REMOVE "Eliminando usuario %2 del grupo %1" - IDS_ACTION_USER_PW_CHANGE "Definiendo contraseña para usuario %1" - IDS_UNKNOWN_NAME "(desconocido)" - IDS_ACTION_USER_UNLOCK "Desbloqueando cuenta para usuario %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "Cuota de creación de grupo" - IDS_MCHCOL_UID "ID de cuenta" - IDS_MCHCOL_OWNER "Propietario" - IDS_MCHCOL_CREATOR "Creador" - IDS_OPTIONS_TITLE "Opciones de AFS Account Manager" - IDS_WARNING_TITLE "Precaución" - IDS_WARNING_SYSTEM_ACCOUNT - "En la cuenta %1 los cambios deberían efectuarse con precaución, ya que efectuar cambios inapropiados en esta cuenta puede impedir que algunas características de AFS funcionen debidamente.\n\n¿Está seguro de que desea continuar?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE - "Todos los grupos a los que pertenece esta cuenta:" - IDS_MACHINE_SHOW_OWNER_TITLE "Todos los grupos que posee esta cuenta:" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE - "Todos los grupos a los que pertenecen estas cuentas:" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE - "Todos los grupos a los que pertenecerá esta cuenta:" - IDS_NEWMACHINE_SHOW_OWNER_TITLE - "Todos los grupos que poseerá esta cuenta:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "AFS Account Manager no ha podido ponerse en contacto con un proceso administrativo que está ejecutándose en el sistema %1.\n\nPuede efectuar tareas administrativas de modo remoto ejecutando el programa TaAfsAdmSvr.exe en el otro sistema." - IDS_ERROR_BAD_LOCAL_SERVER - "AFS Account Manager no ha podido encontrar el programa TaAfsAdmSvr.exe, o no ha podido preparar el sistema para efectuar la administración de AFS. " - IDS_ERROR_CANT_OPEN_CELL - "AFS Account Manager no ha podido ponerse en contacto con ningún servidor de la célula %1.\n\nPor favor, vuelva a efectuar la comprobación para asegurarse de que ha escrito correctamente el nombre de la célula." - IDS_ERROR_BADCREDENTIALS - "La identidad de AFS que ha entrado no está reconocida, o bien la contraseña que ha especificado es incorrecta." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "Número de error 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Número de error 0x%1 (%2) no está reconocido." - IDS_ERROR_USER_MULTIPROP - "AFS Account Manager no puede visualizar la ventana solicitada debido a que ya hay una ventana de propiedades abierta para uno o más de los usuarios seleccionados." - IDS_ERROR_CANT_CHANGE_USER - "AFS Account Manager no ha podido cambiar las propiedades para usuario %1." - IDS_ERROR_GROUP_MULTIPROP - "AFS Account Manager no puede visualizar la ventana solicitada debido a que ya hay una ventana de propiedades abierta para uno o más de los grupos seleccionados." - IDS_ERROR_CANT_CHANGE_GROUP - "AFS Account Manager no ha podido cambiar las propiedades para grupo %1." - IDS_ERROR_CANT_TRANSLATE_USER - "AFS Account Manager no ha podido encontrar un usuario por medio del nombre especificado.\n\nPor favor, asegúrese de que ha escrito el nombre correctamente. " - IDS_ERROR_CANT_TRANSLATE_GROUP - "AFS Account Manager no ha podido encontrar un usuario por medio del nombre especificado.\n\nPor favor, asegúrese de que ha escrito el nombre correctamente. " - IDS_ERROR_CANT_GET_USERPROP - "AFS Account Manager no ha podido encontrar propiedades para usuario %1." - IDS_ERROR_CANT_CHANGE_PASSWORD - "AFS Account Manager no ha podido cambiar la contraseña para usuario %1." - IDS_ERROR_CANT_GET_RANDOM_KEY - "AFS Account Manager no ha podido generar una clave de cifrado aleatoria. " - IDS_ERROR_CANT_SET_GROUPS - "AFS Account Manager no ha podido cambiar la lista de grupo especificada para el usuario %1." - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "AFS Account Manager no ha podido cambiar la lista de grupo especificada para los usuarios siguientes: %1." - IDS_ERROR_CANT_UNLOCK "AFS Account Manager no ha podido desbloquear la cuenta de usuario %1." - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "AFS Account Manager no ha podido desbloquear las cuentas para los usuarios siguientes: %1." - IDS_ERROR_CANT_SET_MEMBERS - "AFS Account Manager no ha podido cambiar la lista de miembros para grupo %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "AFS Account Manager no ha podido cambiar las listas de miembros para los grupos siguientes: %1." - IDS_ERROR_CANT_RENAME_GROUP - "AFS Account Manager no ha podido cambiar el nombre del grupo %1 por ""%2""." - IDS_ERROR_CANT_CHANGE_OWNER - "AFS Account Manager no ha podido cambiar el propietario del grupo %1." - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "AFS Account Manager no ha podido cambiar los propietarios de los grupos siguientes: %1." - IDS_ERROR_CANT_CHANGE_CELL - "AFS Account Manager no ha podido cambiar las propiedades de la célula %1." - IDS_ERROR_NO_PASSWORD_GIVEN - "Debe especificar una contraseña para la cuenta de usuario que está creando." - IDS_ERROR_MISMATCH_PASSWORD_GIVEN - "Las contraseñas que se han entrado para la nueva cuenta de usuario no coinciden. " - IDS_ERROR_CANT_CREATE_USER - "AFS Account Manager no ha podido crear una cuenta para el usuario %1." - IDS_ERROR_CANT_CREATE_GROUP - "AFS Account Manager no ha podido crear el grupo %1." - IDS_ERROR_CANT_DELETE_USER - "AFS Account Manager no ha podido suprimir la cuenta para el usuario %1." - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "AFS Account Manager no ha podido suprimir las cuentas para los usuarios siguientes: %1." - IDS_ERROR_CANT_DELETE_GROUP - "AFS Account Manager no ha podido suprimir el grupo %1." - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "AFS Account Manager no ha podido suprimir los grupos siguientes: %1." - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "AFS Account Manager no ha podido iniciarse debido a que el AFS Control Center no se ha instalado debidamente.\n\nEs posible que tenga que volver a instalar el AFS Control Center." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "Error - AFS Account Manager" - IDS_CMDLINE_SYNTAX "La línea de mandatos que ha especificado para AFS Account Manager no es válida." - IDS_CMDLINE_UNRECOGNIZED - "La línea de mandatos que ha especificado para AFS Account Manager no es válida.\n\nNo se reconoce el parámetro ""%1""." - IDS_CMDLINE_DUPLICATE "La línea de mandatos que ha especificado para AFS Account Manager no es válida.\n\nEl parámetro ""%1"" se ha especificado más de una vez." - IDS_CMDLINE_UNEXPECTVALUE - "La línea de mandatos que ha especificado para AFS Account Manager no es válida.\n\nNo debe darse un valor al parámetro ""%1""." - IDS_CMDLINE_MISSINGVAL "La línea de mandatos que ha especificado para AFS Account Manager no es válida.\n\nEl parámetro ""%1"" debe ir seguido por un valor." - IDS_CMDLINE_USERPASSWORD - "La línea de mandatos que ha especificado para AFS Account Manager no es válida.\n\nPara obtener nuevas señales de AFS, deben especificarse tanto el parámetro ""/USER"" como el parámetro ""/PASSWORD"". " -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/ja_JP/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/ja_JP/AfsUsrMgr.rc deleted file mode 100644 index c8440ad67..000000000 --- a/src/WINNT/afsusrmgr/lang/ja_JP/AfsUsrMgr.rc +++ /dev/null @@ -1,1774 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,33,305,184 - LTEXT "‘I‘ð‚µ‚½ƒZƒ‹:",IDC_STATIC,6,3,45,8 - LTEXT "(‘I‘ð‚È‚µ)",IDC_CELL,59,3,220,8 - LTEXT "AFS ƒg[ƒNƒ“:",IDC_STATIC,6,18,45,8 - LTEXT "(ƒg[ƒNƒ“‚È‚µ)",IDC_CREDS,59,18,220,8 - ICON IDI_MAIN,IDC_ANIM,287,3,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,4,1,307,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_USERS_PATTERN,180,4,41,13,ES_AUTOHSCROLL - RTEXT "ƒpƒ^[ƒ“:",IDC_USERS_PATTERN_PROMPT,138,6,34,8 - LTEXT "Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_USERS_TITLE,4,6,100, - 8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,99 - PUSHBUTTON "ì¬(&C)...",M_USER_CREATE,17,126,55,14 - PUSHBUTTON "ƒƒ“ƒo[ƒVƒbƒv(&M)...",M_MEMBERSHIP,76,126,83,14 - PUSHBUTTON "ƒvƒƒpƒeƒB[(&R)...",M_PROPERTIES,163,126,74,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "ƒpƒ^[ƒ“:",IDC_GROUPS_PATTERN_PROMPT,155,6,34,8 - LTEXT "Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_GROUPS_TITLE,4,6,142, - 8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,96 - PUSHBUTTON "ì¬(&C)...",M_GROUP_CREATE,41,125,55,14 - PUSHBUTTON "ƒƒ“ƒo[(&M)...",M_MEMBERSHIP,100,125,59,14 - PUSHBUTTON "ƒvƒƒpƒeƒB[(&R)...",M_PROPERTIES,163,125,74,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "is’†‚Ì‘€ì - AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - LTEXT "Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_ACTION_DESC,2,2,232, - 8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ɂ‚¢‚Ä" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[ ƒo[ƒWƒ‡ƒ“ 3.5",IDC_STATIC, - 33,8,189,8 - LTEXT "Copyright (C) IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "ƒNƒ[ƒY(&C)",IDOK,87,121,53,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ƒGƒ‰[EƒR[ƒh‚ÌŒŸõ" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒGƒ‰[”ԍ†(&E):",IDC_STATIC,4,41,44,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "•ÏŠ·(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "ƒNƒ[ƒY(&C)",IDCANCEL,85,121,53,14 - LTEXT "(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ɐݒè)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "ƒGƒ‰[EƒR[ƒh‚̈Ӗ¡‚𒲂ׂé‚ɂ́AƒR[ƒh‚ð‰º‚É“ü—Í‚µ‚āu•ÏŠ·vƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ƒRƒ}ƒ“ƒhŒŸõ" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,146,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "ƒwƒ‹ƒv‚Ì•\ަ(&H)",IDOK,161,37,65,14 - PUSHBUTTON "ŽæÁ‚µ(&C)",IDCANCEL,161,53,65,14 - LTEXT "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ðŽg—p‚µ‚ă^ƒXƒN‚ðŽÀs‚·‚é•û–@‚ðŒ©‚é‚ɂ́A‰º‚̃Rƒ}ƒ“ƒhs‚ð‘I‘ð‚µ‚Äuƒwƒ‹ƒv‚Ì•\ަvƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "—ñ" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒŠƒXƒgŽž‚É•\ަ‚·‚é—ñ‚Ì‘I‘ð(&S):",IDC_STATIC,5,7,111,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Žg—p‰Â”\‚È—ñ(&C):",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "•\ަ‚·‚é—ñ(&I):",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "’ljÁ(&A) >>",IDC_COL_INSERT,119,68,47,14 - PUSHBUTTON "<< íœ(&R)",IDC_COL_DELETE,119,88,47,14 - PUSHBUTTON "ã‚Ɉړ®(&U)",IDC_COL_UP,170,123,53,14 - PUSHBUTTON "‰º‚Ɉړ®(&D)",IDC_COL_DOWN,224,123,53,14 - GROUPBOX "—ñ‚ÌƒŠƒXƒg",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Šg’£" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "Œ»sŒ®:",IDC_STATIC,5,5,40,8 - LTEXT "Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_USER_KEY,52,5,173,20, - 0,WS_EX_STATICEDGE - CONTROL "‚±‚ê‚̓VƒXƒeƒ€EƒAƒJƒEƒ“ƒg‚Å‚· (ˆÃ†‰»‚È‚µ) (&S)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 35,195,10 - CONTROL "ƒ†[ƒU[‚ªŠÇ—Œ ŒÀ‚ðŽ‚Á‚Ä‚¢‚Ü‚· (&A)",IDC_USER_ADMIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,52,155,10 - CONTROL "ƒ`ƒPƒbƒg‚Ì‹–‰ÂA‘¶‘±ŽžŠÔ(&G):",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,69,111,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 134,68,66,12 - CONTROL "ƒOƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê(&Q):",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,86,116,10 - EDITTEXT IDC_USER_GROUP_QUOTA,137,85,27,13,ES_AUTOHSCROLL - LTEXT "ƒAƒJƒEƒ“ƒgó‹µ‚Ì•\ަ(&V):",IDC_STATIC,12,136,91,8 - COMBOBOX IDC_USER_PERM_STATUS,110,134,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Š—LƒOƒ‹[ƒv‚ÌƒŠƒXƒg(&W):",IDC_STATIC,12,149,91,8 - COMBOBOX IDC_USER_PERM_OWNED,110,148,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒOƒ‹[ƒvEƒƒ“ƒo[ƒVƒbƒv‚ÌƒŠƒXƒg(&M):",IDC_STATIC,12, - 164,116,8 - COMBOBOX IDC_USER_PERM_MEMBER,110,174,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒg‹–‰Â",IDC_STATIC,5,109,220,82 - LTEXT "‚±‚̃AƒJƒEƒ“ƒg‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚郆[ƒU[‚ðŽw’肵‚Ü‚·B", - IDC_STATIC,7,124,215,8 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "ƒ†[ƒU[‚ªƒpƒXƒ[ƒh‚ð•ύX‰Â”\(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,46,124,11 - PUSHBUTTON "ƒpƒXƒ[ƒh‚̕ύX(&P)",IDC_USER_CPW_NOW,143,44,78,14 - CONTROL "ƒ†[ƒU[‚ª‹ŒƒpƒXƒ[ƒh‚ðÄŽg—p‰Â”\(&R)",IDC_USER_RPW, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,65,162,10 - CONTROL "ƒpƒXƒ[ƒh‚Ì—LŒøŠúŠÔ(&V)",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,97,10 - LTEXT "“ú”",IDC_STATIC,196,81,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,135,79,37,13,ES_AUTOHSCROLL - CONTROL "ƒAƒJƒEƒ“ƒg‚Ì—LŒøŠúŒÀ(&E):",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,91,89,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,84, - 103,61,12 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 159,103,53,12 - CONTROL "ƒAƒJƒEƒ“ƒg‚ðƒƒbƒN(&L)",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,137,76,10 - LTEXT "‰ñ‚̘A‘±ƒƒOƒCƒ“ޏ”sŒã",IDC_STATIC,146,138,75,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,102,136,27,13,ES_AUTOHSCROLL - CONTROL "–³ŠúŒÀ‚É (ŠÇ—ŽÒ‚ªƒƒbƒN‰ðœ‚·‚é‚Ü‚Å) ƒƒbƒN(&K)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,153,194,10 - CONTROL "ƒAƒJƒEƒ“ƒg‚̃ƒbƒNŠúŠÔ(&F)",IDC_USER_FAILLOCK_FINITE, - "Button",BS_AUTORADIOBUTTON,25,165,91,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,84,177,56,12 - PUSHBUTTON "ƒƒbƒN‰ðœ(&U)",IDC_USER_UNLOCK,157,176,61,14 - GROUPBOX "ޏ”s‚µ‚½ƒƒOƒCƒ“ŽŽs",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "ƒ†[ƒU[ %1",IDC_USER_NAME,35,7,188,16 - GROUPBOX "ƒAƒJƒEƒ“ƒg",IDC_STATIC,5,32,220,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "ƒOƒ‹[ƒv %1",IDC_GROUP_NAME,34,7,190,16 - LTEXT "ƒAƒJƒEƒ“ƒgó‹µ‚Ì•\ަ(&S):",IDC_STATIC,12,105,90,8 - COMBOBOX IDC_GROUP_PERM_STATUS,111,104,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Š—LƒOƒ‹[ƒv‚Ì•\ަ(&G):",IDC_STATIC,12,117,90,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,111,117,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒOƒ‹[ƒvEƒƒ“ƒo[‚ÌƒŠƒXƒg(&M):",IDC_STATIC,12,129,90,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,111,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒƒ“ƒo[‚̒ljÁ(&A):",IDC_STATIC,12,156,90,8 - COMBOBOX IDC_GROUP_PERM_ADD,111,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒƒ“ƒo[‚̍폜(&R):",IDC_STATIC,12,172,90,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,111,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒg‚̃AƒNƒZƒXŒ ",IDC_STATIC,5,77,220,114 - LTEXT "‚±‚̃Oƒ‹[ƒv‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚郆[ƒU[‚ðŽw’肵‚Ü‚·B", - IDC_STATIC,11,92,209,8 - LTEXT "Š—LŽÒ:",IDC_STATIC,5,33,26,8 - LTEXT "%1",IDC_GROUP_OWNER,39,33,104,16 - PUSHBUTTON "Š—LŽÒ‚̕ύX(&O)...",IDC_GROUP_CHANGEOWNER,149,33,74,12 - LTEXT "ì¬ŽÒ:",IDC_STATIC,5,55,26,8 - LTEXT "%1",IDC_GROUP_CREATOR,39,55,182,14 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒOƒ‹[ƒv" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒOƒ‹[ƒv",IDC_STATIC,5,31,220,160 - LTEXT "ˆÈ‰º‚̐ݒè‚ðŽg—p‚µ‚āA‚±‚̃†[ƒU[‚ª‘®‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ƁA‚±‚̃†[ƒU[‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ð•ύX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,3,220,22 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "íœ(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "’ljÁ(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "‚±‚̃†[ƒU[‚ª‘®‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•\ަ(&S)", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "‚±‚̃†[ƒU[‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•\ަ(&H)", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...)",IDC_GROUPS_TITLE,12,74, - 205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒƒ“ƒo[ƒVƒbƒv" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒOƒ‹[ƒvEƒƒ“ƒo[ƒVƒbƒv",IDC_STATIC,5,31,220,160 - LTEXT "ˆÈ‰º‚̐ݒè‚ðŽg—p‚µ‚āA‚±‚̃Oƒ‹[ƒv‚̃ƒ“ƒo[‚ƁA‚±‚̃Oƒ‹[ƒv‚ªŠ—L‚·‚éƒOƒ‹[ƒv‚ð‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,85,205,82 - PUSHBUTTON "íœ(&R)",IDC_MEMBER_REMOVE,167,172,50,14 - PUSHBUTTON "’ljÁ(&A)...",IDC_MEMBER_ADD,113,172,50,14 - CONTROL "‚±‚̃Oƒ‹[ƒv‚̃ƒ“ƒo[‚ð•\ަ(&S)",IDC_GROUP_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "‚±‚̃Oƒ‹[ƒv‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•\ަ(&H)", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...)",IDC_USERS_TITLE,12,74, - 205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(‚±‚̃^ƒCƒgƒ‹‚ÍŽÀsŽž‚É‘I‘ð‚³‚ê‚Ü‚·)" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - RTEXT "(ŽÀsŽž)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "‘I‘ð(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,224,129,50,14 - CONTROL "(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ÉŽw’è)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,59,133,146,10 - RTEXT "ƒZƒ‹‚ðŒ©‚é(&C):",IDC_STATIC,2,8,53,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ƒpƒ^[ƒ“:",IDC_GROUPS_PATTERN_PROMPT,198,8,34,8 - EDITTEXT IDC_BROWSE_PATTERN,235,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 281, 145 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒAƒJƒEƒ“ƒgEƒpƒXƒ[ƒh‚̕ύX" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "V‹KƒpƒXƒ[ƒh‚̃o[ƒWƒ‡ƒ“”ԍ†‚ðŽ©“®“I‚É‘I‘ð(&A)", - IDC_CPW_VERSION_AUTO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,52,36,203,10 - CONTROL "Œ®ƒo[ƒWƒ‡ƒ“‚ðŽg—p(&U):",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,52,52,100,10 - EDITTEXT IDC_CPW_VERSION,168,51,43,14,ES_AUTOHSCROLL - CONTROL "‚±‚̃XƒgƒŠƒ“ƒO‚ðˆÃ†‰»:",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,52,71,101,10 - CONTROL "‚±‚ÌŒ®‚ðŽg—p:",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,52,105,55,10 - EDITTEXT IDC_CPW_STRING,115,85,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,115,104,96,14,ES_AUTOHSCROLL - PUSHBUTTON "ƒ‰ƒ“ƒ_ƒ€(&R)",IDC_CPW_RANDOM,219,104,53,14 - DEFPUSHBUTTON "—¹‰ð",IDOK,113,124,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,167,124,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,221,124,50,14 - LTEXT "ƒ†[ƒU[ %1 ‚̐V‹KƒpƒXƒ[ƒh",IDC_CPW_TITLE,43,9,231,16 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "ƒo[ƒWƒ‡ƒ“:",-1,9,37,35,8 - LTEXT "’l:",-1,9,72,35,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒOƒ‹[ƒv‚Ì–¼‘O•ύX" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "V‹KƒOƒ‹[ƒv–¼(&N):",IDC_STATIC,17,108,62,8 - EDITTEXT IDC_RENAME_NEWNAME,86,106,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,107,126,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,161,126,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,215,126,50,14 - LTEXT "Œ»sŠ—LŽÒ:",IDC_STATIC,17,65,62,8 - PUSHBUTTON "Š—LŽÒ‚̕ύX(&C)...",IDC_RENAME_CHOWN,200,63,67,14 - LTEXT "Œ»sƒOƒ‹[ƒv–¼:",IDC_STATIC,17,87,62,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "ƒOƒ‹[ƒv %1 ‚Ì–¼‘O•ύX",IDC_RENAME_TITLE,35,10,232,15 - LTEXT "’: ƒOƒ‹[ƒv‚Ì–¼‘O‚ɃvƒŒƒtƒBƒbƒNƒX‚ª‚ ‚ê‚΁A–¼‘O‚͐³Šm‚ɃOƒ‹[ƒv‚ÌŒ»Ý‚ÌŠ—LŽÒ‚𔽉f‚µ‚Ü‚· (—á: ""owner:groupname"")B", - IDC_STATIC,35,35,231,16 - LTEXT "(Æ‰ï’†)",IDC_RENAME_OWNER,86,65,105,15 - LTEXT "(Æ‰ï’†)",IDC_RENAME_OLDNAME,86,87,181,12 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 281, 153 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(‚±‚̃^ƒCƒgƒ‹‚ÍŽÀsŽž‚É‘I‘ð‚³‚ê‚Ü‚·)" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - RTEXT "(ŽÀsŽž)",IDC_BROWSE_TYPE,7,115,65,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,80,113,130,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "‘I‘ð(&S)",IDC_BROWSE_SELECT,221,113,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,221,132,50,14 - RTEXT "•\ަ:",IDC_STATIC,7,134,65,8 - COMBOBOX IDC_BROWSE_COMBO,80,132,130,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "ƒZƒ‹‚ðŒ©‚é(&C):",IDC_STATIC,7,8,47,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,61,6,130,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ƒpƒ^[ƒ“:",IDC_GROUPS_PATTERN_PROMPT,198,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,39,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 281, 169 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(‚±‚̃^ƒCƒgƒ‹‚ÍŽÀsŽž‚É‘I‘ð‚³‚ê‚Ü‚·)" -CLASS "AFSAccountManagerClass" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - RTEXT "(ŽÀsŽž)",IDC_BROWSE_TYPE,7,115,47,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,64,113,129,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "‘I‘ð(&S)",IDC_BROWSE_SELECT,220,113,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,220,132,50,14 - RTEXT "•\ަ:",IDC_STATIC,7,133,47,8 - COMBOBOX IDC_BROWSE_COMBO,64,132,129,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(ƒeƒLƒXƒg‚ÍŽÀsŽž‚ÉŽw’è)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,64,151,140,10 - RTEXT "ƒZƒ‹‚ðŒ©‚é(&C):",IDC_STATIC,7,9,47,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,62,6,129,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ƒpƒ^[ƒ“:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,235,6,33,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒOƒ‹[ƒv" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒOƒ‹[ƒv",IDC_STATIC,5,31,220,160 - LTEXT "ˆÈ‰º‚̐ݒè‚ðŽg—p‚µ‚āA‚±‚̃†[ƒU[‚ª‘®‚·‚鏉ŠúƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ƁA‚±‚̃†[ƒU[‚ªŠ—L‚·‚éƒOƒ‹[ƒv‚ð•ύX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,3,220,22 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "íœ(&R)",IDC_MEMBER_REMOVE,167,171,50,14 - PUSHBUTTON "’ljÁ(&A)...",IDC_MEMBER_ADD,113,171,50,14 - CONTROL "‚±‚̃†[ƒU[‚ª‘®‚·‚éƒOƒ‹[ƒv‚ð•\ަ(&S)", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "‚±‚̃†[ƒU[‚ªŠ—L‚·‚éƒOƒ‹[ƒv‚ð•\ަ(&H)", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...)",IDC_GROUPS_TITLE,12,74, - 205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 238, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒ†[ƒU[‚̍쐬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "–¼‘O(&N):",IDC_STATIC,10,37,47,8 - EDITTEXT IDC_NEWUSER_NAME,68,35,127,14,ES_AUTOHSCROLL - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_STATIC,10,57,47,8 - EDITTEXT IDC_NEWUSER_PW1,68,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "(Ä“ü—Í(&R):)",IDC_STATIC,10,77,47,8 - EDITTEXT IDC_NEWUSER_PW2,68,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "ŽŸ‚ÉŽg—p‰Â”\‚ȃ†[ƒU[ ID ‚ðŽ©“®“I‚ÉŽg—p(&U)", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,44,109, - 183,11 - CONTROL "“Á’胆[ƒU[ ID ‚ðŽg—p(&S):",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,44,130,113,10 - EDITTEXT IDC_NEWUSER_ID,167,129,39,12,ES_AUTOHSCROLL - PUSHBUTTON "ƒOƒ‹[ƒv(&G)...",IDC_ADVANCED,7,147,58,14 - DEFPUSHBUTTON "—¹‰ð",IDOK,94,147,43,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,141,147,43,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,188,147,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "ƒZƒ‹ %1 “à‚̐V‹Kƒ†[ƒU[",IDC_NEWUSER_TITLE,37,9,192,16 - LTEXT "ƒ†[ƒU[ ID:",IDC_STATIC,10,94,42,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "ƒZƒ‹ %1 “à‚̐V‹KƒOƒ‹[ƒv",IDC_GROUP_NAME,35,8,188,16 - LTEXT "ƒAƒJƒEƒ“ƒgó‹µ‚Ì•\ަ(&S):",IDC_STATIC,12,106,91,8 - COMBOBOX IDC_GROUP_PERM_STATUS,111,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Š—LƒOƒ‹[ƒv‚Ì•\ަ(&G):",IDC_STATIC,12,118,90,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,111,118,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒOƒ‹[ƒvEƒƒ“ƒo[‚ÌƒŠƒXƒg(&M):",IDC_STATIC,12,130,94,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,111,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒƒ“ƒo[‚̒ljÁ(&A):",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,111,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒƒ“ƒo[‚̍폜(&R):",IDC_STATIC,12,172,74,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,111,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒg‚̃AƒNƒZƒXŒ ",IDC_STATIC,5,68,220,123 - LTEXT "ˆÈ‰º‚̐ݒè‚Í‚±‚̃Oƒ‹[ƒv‚ÉŠÖ‚·‚éî•ñ‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚郆[ƒU[‚ðŽw’肵‚Ü‚·B", - IDC_STATIC,11,83,204,17 - LTEXT "Š—LŽÒ:",IDC_STATIC,5,35,26,8 - LTEXT "%1",IDC_GROUP_OWNER,39,35,101,17 - PUSHBUTTON "Š—LŽÒ‚̕ύX(&O)...",IDC_GROUP_CHANGEOWNER,149,33,74,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒƒ“ƒo[ƒVƒbƒv" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒOƒ‹[ƒvEƒƒ“ƒo[ƒVƒbƒv",IDC_STATIC,5,31,220,160 - LTEXT "ˆÈ‰º‚̐ݒè‚ðŽg—p‚µ‚āA‚±‚̃Oƒ‹[ƒv‚̏‰Šúƒƒ“ƒo[‚ƁA‚±‚̃Oƒ‹[ƒv‚ªŠ—L‚·‚éƒOƒ‹[ƒv‚ð‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "íœ(&R)",IDC_MEMBER_REMOVE,167,170,50,14 - PUSHBUTTON "’ljÁ(&A)...",IDC_MEMBER_ADD,113,170,50,14 - CONTROL "‚±‚̃Oƒ‹[ƒv‚̏‰Šúƒƒ“ƒo[‚ð•\ަ(&S)", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "‚±‚̃Oƒ‹[ƒv‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•\ަ(&H)", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...)",IDC_USERS_TITLE,12,74, - 205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 238, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒOƒ‹[ƒv‚̍쐬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "–¼‘O(&N):",-1,7,37,32,8 - EDITTEXT IDC_NEWGROUP_NAME,54,35,127,14,ES_AUTOHSCROLL - CONTROL "ŽŸ‚ÉŽg—p‰Â”\‚ȃOƒ‹[ƒv ID ‚ðŽ©“®“I‚ÉŽg—p(&U)", - IDC_NEWGROUP_ID_AUTO,"Button",BS_AUTORADIOBUTTON,31,72, - 200,12 - CONTROL "“Á’èƒOƒ‹[ƒv ID ‚ðŽg—p(&S):",IDC_NEWGROUP_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,31,93,111,10 - EDITTEXT IDC_NEWGROUP_ID,158,90,55,14,ES_AUTOHSCROLL - PUSHBUTTON "ƒƒ“ƒo[(&M)...",IDC_ADVANCED,7,112,59,14 - DEFPUSHBUTTON "—¹‰ð",IDOK,94,112,43,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,141,112,43,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,188,112,43,14 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "ƒZƒ‹ %1 “à‚̐V‹KƒOƒ‹[ƒv",IDC_NEWGROUP_TITLE,34,9,193, - 18 - LTEXT "ƒOƒ‹[ƒv ID:",-1,7,55,39,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒ†[ƒU[‚̍폜" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "—¹‰ð",IDOK,114,91,50,14 - DEFPUSHBUTTON "ŽæÁ‚µ",IDCANCEL,168,91,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,222,91,50,14 - LTEXT "’ˆÓ!\n\n‚±‚Ì‘€ì‚̓†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ð‰i‹v‚ɍ폜‚µ‚Ü‚·B", - IDC_DELETE_TITLE,36,10,232,32 - ICON 32515,-1,7,6,20,20 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚Ì KAS ƒf[ƒ^ƒx[ƒX€–Ú‚ðíœ(&K)", - IDC_DELETE_KAS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,21, - 53,250,10 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚Ì PTS ƒf[ƒ^ƒx[ƒX€–Ú‚ðíœ(&P)", - IDC_DELETE_PTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,21, - 72,250,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒOƒ‹[ƒv‚̍폜" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "—¹‰ð",IDOK,113,61,50,14 - DEFPUSHBUTTON "ŽæÁ‚µ",IDCANCEL,167,61,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,221,61,50,14 - LTEXT "’ˆÓ!\n\n‚±‚Ì‘€ì‚̓Oƒ‹[ƒv %1 ‚ð‰i‹v‚ɍ폜‚µ‚Ü‚·B", - IDC_DELETE_TITLE,36,12,238,38 - ICON 32515,-1,7,6,20,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "Å‘僆[ƒU[ ID(&U):",IDC_STATIC,11,91,76,8 - EDITTEXT IDC_CELL_USERMAX,102,89,40,14,ES_AUTOHSCROLL - LTEXT "Å‘åƒOƒ‹[ƒv ID(&G):",IDC_STATIC,11,109,76,8 - EDITTEXT IDC_CELL_GROUPMAX,102,107,40,14,ES_AUTOHSCROLL - GROUPBOX "ƒ†[ƒU[ ID ‚ƃOƒ‹[ƒv ID",IDC_STATIC,5,31,220,97 - LTEXT "ˆÈ‰º‚̐ݒè‚́A‚±‚ê‚܂łɎg—p‚³‚ꂽÅ‘å‚̃†[ƒU[‚¨‚æ‚уOƒ‹[ƒv ID ‚̐”’l‚𔽉f‚µ‚Ü‚·B’l‚𑝉Á‚·‚é‚̂͂©‚Ü‚¢‚Ü‚¹‚ñ‚ªAV‚µ‚¢’l‚ªŠù‘¶‚̃AƒJƒEƒ“ƒg‚Æ–µ‚‚µ‚È‚¢‚Æ‚¢‚¤ŠmM‚ª‚ ‚éê‡‚ðœ‚«A’l‚ðŒ¸­‚·‚ׂ«‚ł͂ ‚è‚Ü‚¹‚ñB", - IDC_STATIC,11,43,208,39 - ICON IDI_CELL,IDC_STATIC,5,5,20,20 - LTEXT "ƒZƒ‹ %1",IDC_CELL_NAME,32,7,193,16 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "ƒ†[ƒU[‚ªƒpƒXƒ[ƒh‚ð•ύX‰Â”\(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,120,10 - PUSHBUTTON "ƒpƒXƒ[ƒh‚̕ύX(&P)",IDC_USER_CPW_NOW,138,44,85,14 - CONTROL "ƒ†[ƒU[‚ª‹ŒƒpƒXƒ[ƒh‚ðÄŽg—p‰Â”\(&R)",IDC_USER_RPW, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,65,149,10 - CONTROL "ƒpƒXƒ[ƒh‚Ì—LŒøŠúŠÔ(&V)",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,94,10 - LTEXT "“ú”",IDC_STATIC,197,81,17,8 - EDITTEXT IDC_USER_PWEXPIRATION,133,79,37,13,ES_AUTOHSCROLL - CONTROL "ƒAƒJƒEƒ“ƒg‚Ì—LŒøŠúŒÀ(&E):",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,91,87,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,79, - 103,61,12 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 158,102,53,12 - CONTROL "ƒAƒJƒEƒ“ƒg‚ðƒƒbƒN(&L)",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,78,10 - LTEXT "‰ñ‚̘A‘±ƒƒOƒCƒ“ޏ”sŒã",IDC_STATIC,148,139,73,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,101,137,27,13,ES_AUTOHSCROLL - CONTROL "–³ŠúŒÀ‚É (ŠÇ—ŽÒ‚ªƒƒbƒN‰ðœ‚·‚é‚Ü‚Å) ƒƒbƒN(&K)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,153,180,10 - CONTROL "ƒAƒJƒEƒ“ƒg‚̃ƒbƒNŠúŠÔ(&F)",IDC_USER_FAILLOCK_FINITE, - "Button",BS_AUTORADIOBUTTON,25,165,113,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,79,176,56,12 - PUSHBUTTON "ƒƒbƒN‰ðœ(&U)",IDC_USER_UNLOCK,161,175,61,14 - GROUPBOX "ޏ”s‚µ‚½ƒƒOƒCƒ“ŽŽs",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "ƒZƒ‹ %1 “à‚̐V‹Kƒ†[ƒU[",IDC_USER_NAME,35,7,188,16 - GROUPBOX "ƒAƒJƒEƒ“ƒg",IDC_STATIC,5,32,220,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 232, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Šg’£" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚Ì KAS ƒf[ƒ^ƒx[ƒX€–Ú‚ðì¬ („§)(&K)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,219,11 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚Ì PTS ƒf[ƒ^ƒx[ƒX€–Ú‚ðì¬ („§)(&P)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,220,10 - CONTROL "‚±‚ê‚ðƒVƒXƒeƒ€EƒAƒJƒEƒ“ƒg‚É‚µ‚Ü‚· (ˆÃ†‰»‚È‚µ) (&S)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 40,211,10 - CONTROL "ƒ†[ƒU[‚ªŠÇ—Œ ŒÀ‚ðŽ‚¿‚Ü‚·(&A)",IDC_USER_ADMIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,57,138,10 - CONTROL "ƒ`ƒPƒbƒg‚Ì‹–‰ÂA‘¶‘±ŽžŠÔ(&G):",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,74,112,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 132,73,66,12 - CONTROL "ƒOƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê(&Q):",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,91,116,10 - EDITTEXT IDC_USER_GROUP_QUOTA,132,90,27,13,ES_AUTOHSCROLL - LTEXT "ƒAƒJƒEƒ“ƒgó‹µ‚Ì•\ަ(&V):",-1,11,137,91,8 - COMBOBOX IDC_USER_PERM_STATUS,111,135,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Š—LƒOƒ‹[ƒv‚ÌƒŠƒXƒg(&W):",-1,11,150,91,8 - COMBOBOX IDC_USER_PERM_OWNED,111,148,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒOƒ‹[ƒvEƒƒ“ƒo[ƒVƒbƒv‚ÌƒŠƒXƒg(&M):",-1,11,163,112,8 - COMBOBOX IDC_USER_PERM_MEMBER,111,173,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒg‚̃AƒNƒZƒXŒ ",-1,5,109,220,82 - LTEXT "‚±‚̃AƒJƒEƒ“ƒg‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚郆[ƒU[‚ðŽw’肵‚Ü‚·B", - -1,7,124,215,8 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "ƒpƒ^[ƒ“:",IDC_MACHINES_PATTERN_PROMPT,155,6,34,8 - LTEXT "Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...",IDC_MACHINES_TITLE,4,6, - 142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,98 - PUSHBUTTON "ì¬(&C)...",M_MACHINE_CREATE,15,126,55,14 - PUSHBUTTON "ƒƒ“ƒo[ƒVƒbƒv(&M)...",M_MEMBERSHIP,74,126,83,14 - PUSHBUTTON "ƒvƒƒpƒeƒB[(&R)...",M_PROPERTIES,163,126,74,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒOƒ‹[ƒv" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒOƒ‹[ƒv",IDC_STATIC,5,31,220,160 - LTEXT "ˆÈ‰º‚̐ݒè‚ðŽg—p‚µ‚āA‚±‚̃AƒJƒEƒ“ƒg‚ª‘®‚·‚鏉ŠúƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ƁA‚±‚̃AƒJƒEƒ“ƒg‚ªŠ—L‚·‚éƒOƒ‹[ƒv‚ð‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,3,220,25,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "íœ(&R)",IDC_MEMBER_REMOVE,167,170,50,14 - PUSHBUTTON "’ljÁ(&A)...",IDC_MEMBER_ADD,113,170,50,14 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚ª‘®‚·‚éƒOƒ‹[ƒv‚ð•\ަ(&S)", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚ªŠ—L‚·‚éƒOƒ‹[ƒv‚ð•\ަ(&H)", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...)",IDC_GROUPS_TITLE,12,74, - 205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Šg’£" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒAƒJƒEƒ“ƒgó‹µ‚Ì•\ަ(&S):",IDC_STATIC,11,85,85,8 - COMBOBOX IDC_USER_PERM_STATUS,111,84,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Š—LƒOƒ‹[ƒv‚ÌƒŠƒXƒg(&W):",IDC_STATIC,11,98,85,8 - COMBOBOX IDC_USER_PERM_OWNED,111,98,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒOƒ‹[ƒvEƒƒ“ƒo[ƒVƒbƒv‚ÌƒŠƒXƒg(&M):",IDC_STATIC,11, - 113,112,8 - COMBOBOX IDC_USER_PERM_MEMBER,111,123,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒg‚̃AƒNƒZƒXŒ ",IDC_STATIC,5,57,220,82 - LTEXT "‚±‚̃AƒJƒEƒ“ƒg‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚郆[ƒU[‚ðŽw’肵‚Ü‚·B", - IDC_STATIC,7,72,215,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "ƒZƒ‹ %1 ‚̐V‹K IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg",IDC_USER_NAME, - 35,8,190,23 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 247, 126 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚̍쐬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "IP ƒAƒhƒŒƒX(&A):",-1,10,35,50,8 - EDITTEXT IDC_NEWUSER_NAME,70,35,127,14,ES_AUTOHSCROLL - CONTROL "ŽŸ‚ÉŽg—p‰Â”\‚ȃAƒJƒEƒ“ƒg ID ‚ðŽ©“®“I‚ÉŽg—p(&U)", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,32,66, - 208,12 - CONTROL "“Á’èƒAƒJƒEƒ“ƒg ID ‚ðŽg—p(&S):",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,32,85,106,10 - EDITTEXT IDC_NEWUSER_ID,176,83,39,14,ES_AUTOHSCROLL - PUSHBUTTON "ƒOƒ‹[ƒv(&G)...",IDC_ADVANCED,7,103,58,14 - DEFPUSHBUTTON "—¹‰ð",IDOK,103,103,43,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,151,103,43,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,197,103,43,14 - ICON IDI_SERVER,-1,7,6,20,20 - LTEXT "ƒZƒ‹ %1 ‚̐V‹K IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg", - IDC_NEWUSER_TITLE,37,10,200,19 - LTEXT "ƒAƒJƒEƒ“ƒg ID:",-1,10,51,41,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚̍폜" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - PUSHBUTTON "—¹‰ð",IDOK,151,61,50,14 - DEFPUSHBUTTON "ŽæÁ‚µ",IDCANCEL,205,61,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,259,61,50,14 - LTEXT "’ˆÓ!\n\n‚±‚Ì‘€ì‚Í IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg %1 ‚ð‰i‹v‚ɍ폜‚µ‚Ü‚·B", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,20,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Šg’£" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒAƒJƒEƒ“ƒgó‹µ‚Ì•\ަ(&S):",IDC_STATIC,10,84,94,8 - COMBOBOX IDC_USER_PERM_STATUS,111,82,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Š—LƒOƒ‹[ƒv‚ÌƒŠƒXƒg(&W):",IDC_STATIC,10,96,95,8 - COMBOBOX IDC_USER_PERM_OWNED,111,96,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒOƒ‹[ƒvEƒƒ“ƒo[ƒVƒbƒv‚ÌƒŠƒXƒg(&M):",IDC_STATIC,10, - 111,113,8 - COMBOBOX IDC_USER_PERM_MEMBER,111,121,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒg‚̃AƒNƒZƒXŒ ",IDC_STATIC,5,57,220,82 - LTEXT "‚±‚̃AƒJƒEƒ“ƒg‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚郆[ƒU[‚ðŽw’肵‚Ü‚·B", - IDC_STATIC,7,69,215,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg %1",IDC_USER_NAME,37,10,188,22 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒOƒ‹[ƒv" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒOƒ‹[ƒv",IDC_STATIC,5,31,220,160 - LTEXT "ˆÈ‰º‚̐ݒè‚ðŽg—p‚µ‚āA‚±‚̃AƒJƒEƒ“ƒg‚ª‘®‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ƁA‚±‚̃AƒJƒEƒ“ƒg‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•ύX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,5,4,220,21,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "íœ(&R)",IDC_MEMBER_REMOVE,167,171,50,14 - PUSHBUTTON "’ljÁ(&A)...",IDC_MEMBER_ADD,113,171,50,14 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚ª‘®‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•\ަ(&S)", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "‚±‚̃AƒJƒEƒ“ƒg‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ð•\ަ(&H)", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢...)",IDC_GROUPS_TITLE,12,74, - 205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 235, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ƒIƒvƒVƒ‡ƒ“" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "UNIX Œ`Ž®‚̐³‹K•\Œ»‚ðŽg—p(&U) (""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,199,10 - CONTROL "Windows Œ`Ž®‚̐³‹K•\Œ»‚ðŽg—p(&W) (""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,189, - 10 - CONTROL "ŠÇ—ƒg[ƒNƒ“‚È‚µ‚Å‹@”\‚·‚éê‡‚ÉŒx‚ð•\ަ", - IDC_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,116,209,10 - CONTROL "î•ñ‚ð",IDC_REFRESH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,134,36,10 - LTEXT "•ª‚²‚ƂɍŐV•\ަ",IDC_STATIC,114,135,65,8 - EDITTEXT IDC_REFRESH_RATE,56,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,20,20 - LTEXT "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[EƒIƒvƒVƒ‡ƒ“",IDC_STATIC,37, - 12,161,8 - GROUPBOX "³‹K•\Œ»",IDC_STATIC,5,37,225,57 - GROUPBOX "ˆê”Ê",IDC_STATIC,5,100,225,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 284, 129 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "•\ަ‚·‚郆[ƒU[‚Ì‘I‘ð" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "‚·‚ׂẴ†[ƒU[EƒAƒJƒEƒ“ƒg‚̍€–Ú‚ð•\ަ(&A)", - IDC_SEARCH_ALL,"Button",BS_AUTORADIOBUTTON,7,38,248,10 - CONTROL "‚±‚Ì“ú•t‚æ‚è‘O‚ÉŠúŒÀ‚ªØ‚ê‚郆[ƒU[EƒAƒJƒEƒ“ƒg‚݂̂ð•\ަ(&E)", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON,7,52,248, - 10 - CONTROL "‚±‚Ì“ú•t‚æ‚è‘O‚ÉŠúŒÀ‚ªØ‚ê‚éƒpƒXƒ[ƒh‚ðŽ‚ÂƒAƒJƒEƒ“ƒg‚݂̂ð•\ަ(&F)", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON,7,79,248, - 10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 211,63,61,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,211,92,61,12 - DEFPUSHBUTTON "—¹‰ð",IDOK,116,110,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,170,110,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,224,110,50,14 - LTEXT "ˆÈ‰º‚̐§Œä‚ðŽg—p‚µ‚āAuƒ†[ƒU[vƒ^ƒu‚É•\ަ‚·‚郆[ƒU[‚ðŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚³‚ç‚ɁAuƒ†[ƒU[vƒ^ƒu‚́uƒpƒ^[ƒ“v§Œä‚É•”•ª“I‚ȃAƒJƒEƒ“ƒg–¼‚ð“ü—Í‚µ‚āAƒ†[ƒU[‚ÌƒŠƒXƒg‚ðŒÀ’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,7,6,272,25 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 309 - TOPMARGIN, 3 - BOTTOMMARGIN, 217 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 138 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 146 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 162 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - TOPMARGIN, 6 - BOTTOMMARGIN, 119 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 230 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 277 - TOPMARGIN, 6 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "ƒZƒ‹(&C)" - BEGIN - MENUITEM "‘I‘ð(&S)...", M_OPENCELL - MENUITEM "”FØ(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "ƒZƒ‹EƒvƒƒpƒeƒB[(&R)...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "I—¹(&X)", M_EXIT - END - POPUP "•ҏW(&E)" - BEGIN - MENUITEM "ƒ†[ƒU[‚̍쐬(&C)...", M_USER_CREATE - MENUITEM "ƒOƒ‹[ƒv‚̍쐬(&C)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "–¼‘O•ύX(&N)...", M_RENAME - MENUITEM "íœ(&D)...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂđI‘ð(&A)\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "ÅV•\ަ(&F)\tF5", M_REFRESH - MENUITEM "ƒƒ“ƒo[ƒVƒbƒv(&M)...\tCtrl+M", M_MEMBERSHIP - MENUITEM "ƒvƒƒpƒeƒB[(&R)\tAlt+Enter", M_PROPERTIES - END - POPUP "•\ަ(&V)" - BEGIN - POPUP "ƒAƒCƒRƒ“(&I)" - BEGIN - MENUITEM "‘åƒAƒCƒRƒ“(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¬ƒAƒCƒRƒ“(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ú×(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_VIEW_ONE, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWO, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "is’†‚Ì‘€ì(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "—ñ(&C)...", M_COLUMNS - MENUITEM "ƒIƒvƒVƒ‡ƒ“(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL - END - POPUP "ƒwƒ‹ƒv(&H)" - BEGIN - MENUITEM "–ÚŽŸ(&C)", M_CONTENTS - MENUITEM "ƒRƒ}ƒ“ƒhŒŸõ(&F)...", M_FIND - MENUITEM "ƒGƒ‰[EƒR[ƒh‚ÌŒŸõ(&L)...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ɂ‚¢‚Ä(&A)...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "‘åƒAƒCƒRƒ“(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¬ƒAƒCƒRƒ“(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ú×(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_VIEW_ONE, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWO, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒ†[ƒU[‚̍쐬(&C)...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "‘åƒAƒCƒRƒ“(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¬ƒAƒCƒRƒ“(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ú×(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_VIEW_ONE, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWO, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒOƒ‹[ƒv‚̍쐬(&C)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "ƒOƒ‹[ƒv(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "ƒpƒXƒ[ƒh‚̕ύX(&P)...", M_CPW - MENUITEM "ƒƒbƒN‰ðœ(&U)", M_UNLOCK - MENUITEM "íœ(&D)...", M_DELETE - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "ƒvƒƒpƒeƒB[(&R)...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "ƒOƒ‹[ƒvEƒƒ“ƒo[(&M)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "–¼‘O•ύX(&R)...", M_RENAME - MENUITEM "íœ(&D)...", M_DELETE - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "ƒvƒƒpƒeƒB[(&R)...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "—ñ(&C)...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "•\ަ(&V)" - BEGIN - MENUITEM "‘åƒAƒCƒRƒ“(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¬ƒAƒCƒRƒ“(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ú×(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "•W€(&N)", M_VIEW_ONE, CHECKED - MENUITEM "‚·‚ׂẴAƒCƒRƒ“(&A)", M_VIEW_TWO, CHECKED - MENUITEM "ó‹µ‚Ì‚Ý(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ƒAƒJƒEƒ“ƒg‚̍쐬(&C)...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "‚·‚ׂčŐV•\ަ(&F)", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "ƒOƒ‹[ƒv(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "íœ(&D)...", M_DELETE - MENUITEM "ÅV•\ަ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "ƒvƒƒpƒeƒB[(&R)...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[" - IDS_USRCOL_NAME "ƒ†[ƒU[–¼" - IDS_GRPCOL_NAME "ƒOƒ‹[ƒv–¼" - IDS_BADCREDS_DESC "ŠÇ—ŽÒ‚Æ‚µ‚ăƒOƒCƒ“‚µ‚È‚¢‚ƁA%1 ƒZƒ‹‚ÌŠÇ—‚ɏ\•ª‚ÈŒ ŒÀ‚ª—^‚¦‚ç‚ê‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B" - IDS_TAB_USERS "ƒ†[ƒU[" - IDS_TAB_GROUPS "ƒOƒ‹[ƒv" - IDS_CELL_NONE "(ƒZƒ‹‚ª‘I‘ð‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ)" - IDS_CRED_NONE "(‚±‚̃Zƒ‹‚Ƀg[ƒNƒ“‚ª‚ ‚è‚Ü‚¹‚ñ)" - IDS_CRED_EXP "%1 (ƒg[ƒNƒ“‚ÌŠúŒÀ‚ª %2 ‚ɐ؂ê‚Ü‚µ‚½)" - IDS_CRED_OK "%1 (ƒg[ƒNƒ“‚ÌŠúŒÀ‚ª %2 ‚ɐ؂ê‚Ü‚·)" - IDS_USERS_ALL "ƒZƒ‹ %1 “à‚Ì‚·‚ׂẴ†[ƒU[:" - IDS_USERS_PATTERN "ƒZƒ‹ %1 “à‚Å‘I‘ð‚³‚ê‚½ƒ†[ƒU[:" - IDS_GROUPS_ALL "ƒZƒ‹ %1 “à‚Ì‚·‚ׂẴOƒ‹[ƒv:" - IDS_GROUPS_PATTERN "ƒZƒ‹ %1 “à‚Å‘I‘ð‚³‚ê‚½ƒOƒ‹[ƒv:" - IDS_QUERYING_LONG "Æ‰ï’†‚Å‚·B‚¨‘Ò‚¿‚­‚¾‚³‚¢..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "is’†‚Ì‘€ì‚Í‚ ‚è‚Ü‚¹‚ñB" - IDS_ACTION_DESC_ONE "ŽŸ‚Ì‘€ì‚ªŒ»Ýis’†‚Å‚·:" - IDS_ACTION_DESC_MULT "ŽŸ‚Ì‘€ì‚ªŒ»Ýis’†‚Å‚·:" - IDS_ACTCOL_OPERATION "‘€ì" - IDS_ACTCOL_ELAPSED "Œo‰ßŽžŠÔ" - IDS_ACTION_REFRESH_CELL "ƒZƒ‹ %1 ‚̏î•ñ‚ðÅV•\ަ’†" - IDS_ACTION_REFRESH_SERVER "ƒT[ƒo[ %1 ‚̏î•ñ‚ðÅV•\ަ’†" - IDS_ACTION_SCOUT_CELL "ƒZƒ‹ %1 ‚Ì–â‘è‚ðƒeƒXƒg’†" - IDS_ACTION_SCOUT_SERVER "ƒT[ƒo[ %1 ‚Ì–â‘è‚ðƒeƒXƒg’†" - IDS_FIND_NOTHING_TITLE "ƒRƒ}ƒ“ƒh‚ª‘I‘ð‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_FIND_NOTHING_DESC "‘€ì‚ÌŽÀs•û–@‚ɂ‚¢‚ẮAƒŠƒXƒg‚©‚çƒRƒ}ƒ“ƒhs‚ð‘I‘ð‚·‚é‚©AƒL[ƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_FIND_UNKNOWN_TITLE "•s–¾‚ȃRƒ}ƒ“ƒh" - IDS_FIND_UNKNOWN_DESC "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚Í ""%1"" ƒRƒ}ƒ“ƒh‚̃wƒ‹ƒvEƒgƒsƒbƒN‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_HELPABOUT_DESC1 "Œx: ‚±‚̃Rƒ“ƒsƒ…[ƒ^[EƒvƒƒOƒ‰ƒ€‚́A’˜ìŒ ‚¨‚æ‚э‘Û‹K–ñ‚É‚æ‚è•ی삳‚ê‚Ä‚¢‚Ü‚·B+" - IDS_HELPABOUT_DESC2 "‹–‰Â‚È‚­‚±‚̃\ƒtƒgƒEƒFƒA‚ð•¡ŽÊ‚ ‚é‚¢‚Í”z•z‚·‚邯A–¯Ž–‚Ü‚½‚ÍŒYŽ–ã‚̔ƍ߂ƂȂèA–@—¥‚Ì‚à‚Æ‘i‚³‚ê‚éê‡‚ª‚ ‚è‚Ü‚·B\n\n+" - IDS_HELPABOUT_DESC3 "AFS ‚Í Transarc Corporation (IBM company) ‚̏¤•W‚Å‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "—ñ - AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "•¡”ƒ†[ƒU[ - ƒvƒƒpƒeƒB[" - IDS_USER_PROPERTIES_TITLE "ƒ†[ƒU[ %1 - ƒvƒƒpƒeƒB[" - IDS_USER_NAME_MULTIPLE "ƒ†[ƒU[ " - IDS_ACCOUNTACCESS_OWNER "ƒAƒJƒEƒ“ƒgŠ—LŽÒ‚Ì‚Ý" - IDS_ACCOUNTACCESS_GROUP "ƒOƒ‹[ƒvEƒƒ“ƒo[‚Ì‚Ý" - IDS_ACCOUNTACCESS_ANYONE "‚·‚ׂĂ̐l" - IDS_ACCOUNTACCESS_MIXED "(•¡”Ý’è)" - IDS_USER_KEY "%1\nƒo[ƒWƒ‡ƒ“ %2, ƒ`ƒFƒbƒNƒTƒ€ %3" - IDS_USER_KEY_HIDDEN "(ŽÀŒ®’l‚ª‰B‚³‚ê‚Ä‚¢‚é)" - IDS_USER_KEY_UNKNOWN "(•s–¾)" - IDS_USER_KEY_MULTIPLE "(•¡”Œ®)" - IDS_ACTION_USER_CHANGE "ƒ†[ƒU[ %1@‚̃vƒƒpƒeƒB[‚ð•ύX" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "•¡”ƒOƒ‹[ƒv - ƒvƒƒpƒeƒB[" - IDS_GROUP_PROPERTIES_TITLE "ƒOƒ‹[ƒv %1 - ƒvƒƒpƒeƒB[" - IDS_GROUP_NAME_MULTIPLE "ƒOƒ‹[ƒv " - IDS_ACCOUNTACCESS_OWNGROUP "ƒOƒ‹[ƒvŠ—LŽÒ‚Ì‚Ý" - IDS_OWNER_MIXED "•¡”Š—LŽÒ" - IDS_CREATOR_MIXED "•¡”ì¬ŽÒ" - IDS_GROUP_CHANGEOWNER_TITLE "ƒOƒ‹[ƒvŠ—LŽÒ‚̕ύX" - IDS_GROUP_CHANGEOWNER_PROMPT "Š—LŽÒ:" - IDS_MEMBER_MIXED "(ˆê•”)" - IDS_USER_SHOW_MEMBER_TITLE "‚±‚̃†[ƒU[‚ª‘®‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_USER_SHOW_OWNER_TITLE "‚±‚̃†[ƒU[‚ªŠ—L‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_GROUP_SHOW_MEMBER_TITLE "‚±‚̃Oƒ‹[ƒv‚Ì‚·‚ׂẴƒ“ƒo[:" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE - "‚±‚ê‚ç‚̃†[ƒU[‚ª‘®‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "‚±‚ê‚ç‚̃Oƒ‹[ƒv‚Ì‚·‚ׂẴƒ“ƒo[:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "ƒOƒ‹[ƒv %1 ‚ð %2 ‚É–¼‘O•ύX" - IDS_RENAME_TITLE "ƒOƒ‹[ƒv %1 ‚Ì–¼‘O•ύX" - IDS_GROUP_TITLE "ƒOƒ‹[ƒv %1" - IDS_SHOW_USERS "‚±‚̃Zƒ‹“à‚Ì‚·‚ׂẴ†[ƒU[" - IDS_SHOW_GROUPS "‚±‚̃Zƒ‹“à‚Ì‚·‚ׂẴOƒ‹[ƒv" - IDS_GROUP_SHOW_OWNED_TITLE "‚±‚̃Oƒ‹[ƒv‚ªŠ—L‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_BROWSE_TITLE_OWNED "Š—L‚·‚éƒOƒ‹[ƒv‚Ì‘I‘ð" - IDS_BROWSE_PROMPT_OWNED "ƒOƒ‹[ƒv:" - IDS_BROWSE_CHECK_OWNED "Œ»ÝŠ—L‚³‚ê‚Ä‚¢‚È‚¢ƒOƒ‹[ƒv‚̂ݕ\ަ" - IDS_NEWUSER_PROPERTIES_TITLE "ƒ†[ƒU[‚̍쐬 - Šg’£" - IDS_NEWUSER_SHOW_MEMBER_TITLE "‚±‚̃†[ƒU[‚ª‘®‚·‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_NEWUSER_SHOW_OWNER_TITLE "‚±‚̃†[ƒU[‚ªŠ—L‚·‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_ACTION_CELL_CHANGE "ƒZƒ‹ %1 ‚̃vƒƒpƒeƒB[‚ð•ύX" - IDS_ACTION_USER_CREATE "ƒ†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ðì¬" - IDS_NEWGROUP_PROPERTIES_TITLE "ƒOƒ‹[ƒv‚̍쐬 - Šg’£" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "‚±‚̐V‹KƒOƒ‹[ƒv‚̏‰Šúƒƒ“ƒo[:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "ƒtƒ‰ƒO" - IDS_USRCOL_ADMIN "ŠÇ—?" - IDS_USRCOL_TICKET "ƒ`ƒPƒbƒg?" - IDS_USRCOL_SYSTEM "ƒVƒXƒeƒ€?" - IDS_USRCOL_CHANGEPW "ƒpƒXƒ[ƒh‚̕ύX?" - IDS_USRCOL_REUSEPW "ƒpƒXƒ[ƒh‚̍Ďg—p?" - IDS_USRCOL_EXPIRES "ƒAƒJƒEƒ“ƒg—LŒøŠúŒÀ" - IDS_USRCOL_LASTPW "ÅIƒpƒXƒ[ƒh•ύX" - IDS_USRCOL_LASTMOD "ÅI•ύX" - IDS_USRCOL_LASTMODBY "ÅI•ύXŽÒ" - IDS_USRCOL_LIFETIME "ƒ`ƒPƒbƒg‘¶‘±ŽžŠÔ" - IDS_USRCOL_CDAYPW "ƒpƒXƒ[ƒh—LŒøŠúŒÀ" - IDS_USRCOL_CFAILLOGIN "ƒƒOƒCƒ“ޏ”s" - IDS_USRCOL_CSECLOCK "ƒƒOƒCƒ“ޏ”sƒƒbƒNŽžŠÔ" - IDS_USRCOL_CGROUPMAX "ƒOƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "Š—LŽÒ" - IDS_USRCOL_CREATOR "ì¬ŽÒ" - IDS_USRCOL_STATUS "ó‹µ" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "‚Í‚¢" - IDS_NO "‚¢‚¢‚¦" - IDS_GRPCOL_CMEMBERS "ƒƒ“ƒo[ƒVƒbƒvEƒJƒEƒ“ƒg" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "Š—LŽÒ" - IDS_GRPCOL_CREATOR "ì¬ŽÒ" - IDS_COL_USERS "ƒZƒ‹“à‚̃†[ƒU[" - IDS_COL_GROUPS "ƒZƒ‹“à‚̃Oƒ‹[ƒv" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE "‚±‚̐V‹KƒOƒ‹[ƒv‚ªŠ—L‚·‚éƒOƒ‹[ƒv:" - IDS_USER_DELETE_MULTIPLE - "’ˆÓ!\n\n‚±‚Ì‘€ì‚ÍŽŸ‚̃†[ƒU[‚̃AƒJƒEƒ“ƒg‚ð‰i‹v‚ɍ폜‚µ‚Ü‚·: %1" - IDS_GROUP_DELETE_MULTIPLE - "’ˆÓ!\n\n‚±‚Ì‘€ì‚ÍŽŸ‚̃Oƒ‹[ƒv‚ð‰i‹v‚ɍ폜‚µ‚Ü‚·: %1" - IDS_ACTION_GROUP_CREATE "ƒOƒ‹[ƒv %1 ‚̍쐬" - IDS_ACTION_USER_DELETE "ƒ†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ðíœ" - IDS_ACTION_GROUP_DELETE "ƒOƒ‹[ƒv %1 ‚̍폜" - IDS_CELL_PROPERTIES_TITLE "ƒZƒ‹ %1 - ƒvƒƒpƒeƒB[" - IDS_MACHINES_ALL "ƒZƒ‹ %1 “à‚Ì‚·‚×‚Ä‚Ì IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg:" - IDS_MACHINES_PATTERN "ƒZƒ‹ %1 “à‚Å‘I‘ð‚³‚ê‚½ IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg:" - IDS_TAB_MACHINES "ƒAƒhƒŒƒX" - IDS_MACHINE_DELETE_MULTIPLE - "’ˆÓ!\n\n‚±‚Ì‘€ì‚ÍŽŸ‚Ì IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚ð‰i‹v‚ɍ폜‚µ‚Ü‚·: %1" - IDS_NEWMACHINE_PROPERTIES_TITLE "IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚̍쐬 - Šg’£" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE - "•¡” IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg - ƒvƒƒpƒeƒB[" - IDS_MACHINE_PROPERTIES_TITLE "IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg %1 - ƒvƒƒpƒeƒB[" - IDS_COL_MACHINES "ƒZƒ‹“à‚Ì IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg" - IDS_MCHCOL_NAME "IP ƒAƒhƒŒƒX" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "‘g‚ݍž‚ÞƒOƒ‹[ƒv‚Ì‘I‘ð" - IDS_BROWSE_PROMPT_JOIN "ƒOƒ‹[ƒv:" - IDS_BROWSE_CHECK_JOIN "Œ»Ý‘g‚ݍž‚Ü‚ê‚Ä‚¢‚È‚¢ƒOƒ‹[ƒv‚̂ݕ\ަ" - IDS_BROWSE_TITLE_OWN "Š—L‚·‚éƒOƒ‹[ƒv‚Ì‘I‘ð" - IDS_BROWSE_PROMPT_OWN "ƒOƒ‹[ƒv:" - IDS_BROWSE_CHECK_OWN "Œ»ÝŠ—L‚³‚ê‚Ä‚¢‚È‚¢ƒOƒ‹[ƒv‚̂ݕ\ަ" - IDS_BROWSE_TITLE_MEMBER "‘g‚ݍž‚Þƒ†[ƒU[‚Ì‘I‘ð" - IDS_BROWSE_PROMPT_MEMBER "ƒ†[ƒU[:" - IDS_BROWSE_CHECK_MEMBER "ƒƒ“ƒo[‚łȂ¢ƒ†[ƒU[‚̂ݕ\ަ" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "ƒOƒ‹[ƒv %1 ‚̃vƒƒpƒeƒB[‚ð•ύX" - IDS_ACTION_GROUP_MEMBER_ADD "ƒ†[ƒU[ %2 ‚ðƒOƒ‹[ƒv %1 ‚ɒljÁ" - IDS_ACTION_GROUP_MEMBER_REMOVE "ƒ†[ƒU[ %2 ‚ðƒOƒ‹[ƒv %1 ‚©‚çíœ" - IDS_ACTION_USER_PW_CHANGE "ƒ†[ƒU[ %1 ‚̃pƒXƒ[ƒh‚ðÝ’è" - IDS_UNKNOWN_NAME "(•s–¾)" - IDS_ACTION_USER_UNLOCK "ƒ†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ðƒƒbƒN‰ðœ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "ƒOƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê" - IDS_MCHCOL_UID "ƒAƒJƒEƒ“ƒg ID" - IDS_MCHCOL_OWNER "Š—LŽÒ" - IDS_MCHCOL_CREATOR "ì¬ŽÒ" - IDS_OPTIONS_TITLE "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[EƒIƒvƒVƒ‡ƒ“" - IDS_WARNING_TITLE "’ˆÓ" - IDS_WARNING_SYSTEM_ACCOUNT - "%1 ƒAƒJƒEƒ“ƒg‚É•s“KØ‚ȕύX‚ðs‚¤‚Æ AFS ‚̈ꕔ‚ª³‚µ‚­‹@”\‚µ‚È‚­‚Ȃ邽‚߁A‚±‚̃AƒJƒEƒ“ƒg‚̕ύX‚ɂ͒ˆÓ‚ª•K—v‚Å‚·B\n\n‘±‚¯‚Ä‚à‚¢‚¢‚Å‚·‚©?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE - "‚±‚̃AƒJƒEƒ“ƒg‚ª‘®‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_MACHINE_SHOW_OWNER_TITLE - "‚±‚̃AƒJƒEƒ“ƒg‚ªŠ—L‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE - "‚±‚ê‚ç‚̃AƒJƒEƒ“ƒg‚ª‘®‚µ‚Ä‚¢‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE "‚±‚̃AƒJƒEƒ“ƒg‚ª‘®‚·‚é‚·‚ׂẴOƒ‹[ƒv:" - IDS_NEWMACHINE_SHOW_OWNER_TITLE - "‚±‚̃AƒJƒEƒ“ƒg‚ªŠ—L‚·‚é‚·‚ׂẴOƒ‹[ƒv:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ª %1 ƒRƒ“ƒsƒ…[ƒ^[‚ÅŽÀs’†‚ÌŠÇ—ƒvƒƒZƒX‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n‘¼‚̃Rƒ“ƒsƒ…[ƒ^[‚Å TaAfsAdmSvr.exe ƒvƒƒOƒ‰ƒ€‚ðŽÀs‚·‚邱‚Ƃɂæ‚èAŠÇ—ƒ^ƒXƒN‚ðƒŠƒ‚[ƒg‚ÅŽÀs‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B" - IDS_ERROR_BAD_LOCAL_SERVER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ª TaAfsAdmSvr.exe ƒvƒƒOƒ‰ƒ€‚ðŒ©‚Â‚¯‚ç‚ê‚È‚©‚Á‚½‚©AAFS ŠÇ—‚ðŽÀs‚·‚邽‚߂ɃRƒ“ƒsƒ…[ƒ^[‚ð€”õ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_OPEN_CELL - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒZƒ‹ %1 “à‚̃T[ƒo[‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒZƒ‹‚Ì–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ð‚à‚¤ˆê“xŠm”F‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_ERROR_BADCREDENTIALS - "“ü—Í‚µ‚½ AFS ID ‚ª”Fޝ‚³‚ê‚È‚¢‚©A‚Ü‚½‚ÍŽw’肵‚½ƒpƒXƒ[ƒh‚ª³‚µ‚­‚ ‚è‚Ü‚¹‚ñB" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "ƒGƒ‰[”ԍ† 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "ƒGƒ‰[”ԍ† 0x%1 (%2) ‚ª”Fޝ‚Å‚«‚Ü‚¹‚ñB" - IDS_ERROR_USER_MULTIPROP - "ƒvƒƒpƒeƒB[EƒEƒBƒ“ƒhƒE‚ª‚·‚łɑI‘ð‚³‚ê‚½ƒ†[ƒU[‚ɂ‚¢‚ÄŠJ‚©‚ê‚Ä‚¢‚邽‚߁AAFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ª—v‹‚³‚ꂽƒEƒBƒ“ƒhƒE‚ð•\ަ‚Å‚«‚Ü‚¹‚ñB" - IDS_ERROR_CANT_CHANGE_USER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚̃vƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_GROUP_MULTIPROP - "ƒvƒƒpƒeƒB[EƒEƒBƒ“ƒhƒE‚ª‚·‚łɑI‘ð‚³‚ê‚½ƒOƒ‹[ƒv‚ɂ‚¢‚ÄŠJ‚©‚ê‚Ä‚¢‚邽‚߁AAFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ª—v‹‚³‚ꂽƒEƒBƒ“ƒhƒE‚ð•\ަ‚Å‚«‚Ü‚¹‚ñB" - IDS_ERROR_CANT_CHANGE_GROUP - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒOƒ‹[ƒv %1 ‚̃vƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_TRANSLATE_USER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽw’肳‚ꂽ–¼‘O‚̃†[ƒU[‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_ERROR_CANT_TRANSLATE_GROUP - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽw’肳‚ꂽ–¼‘O‚̃†[ƒU[‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_ERROR_CANT_GET_USERPROP - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚̃vƒƒpƒeƒB[‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CHANGE_PASSWORD - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚̃pƒXƒ[ƒh‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_GET_RANDOM_KEY - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ‰ƒ“ƒ_ƒ€ˆÃ†‰»Œ®‚𐶐¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SET_GROUPS - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚ÌŽw’肳‚ꂽƒOƒ‹[ƒvEƒŠƒXƒg‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽŸ‚̃†[ƒU[‚ÌŽw’肳‚ꂽƒOƒ‹[ƒvEƒŠƒXƒg‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½: %1" - IDS_ERROR_CANT_UNLOCK "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ðƒƒbƒN‰ðœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽŸ‚̃†[ƒU[‚̃AƒJƒEƒ“ƒg‚ðƒƒbƒN‰ðœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½: %1" - IDS_ERROR_CANT_SET_MEMBERS - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒOƒ‹[ƒv %1 ‚̃ƒ“ƒo[‚ÌƒŠƒXƒg‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽŸ‚̃Oƒ‹[ƒv‚̃ƒ“ƒo[‚ÌƒŠƒXƒg‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½: %1" - IDS_ERROR_CANT_RENAME_GROUP - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒOƒ‹[ƒv %1 ‚ð ""%2"" ‚É–¼‘O•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CHANGE_OWNER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒOƒ‹[ƒv %1 ‚ÌŠ—LŽÒ‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽŸ‚̃Oƒ‹[ƒv‚ÌŠ—LŽÒ‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½: %1" - IDS_ERROR_CANT_CHANGE_CELL - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒZƒ‹ %1 ‚̃vƒƒpƒeƒB[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_NO_PASSWORD_GIVEN - "ì¬‚µ‚Ä‚¢‚郆[ƒU[EƒAƒJƒEƒ“ƒg‚̃pƒXƒ[ƒh‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B" - IDS_ERROR_MISMATCH_PASSWORD_GIVEN - "V‹Kƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ɂ‚¢‚Ä“ü—Í‚µ‚½ƒpƒXƒ[ƒh‚ªˆê’v‚µ‚Ü‚¹‚ñB" - IDS_ERROR_CANT_CREATE_USER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_CREATE_GROUP - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒOƒ‹[ƒv %1 ‚ðì¬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_USER - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒ†[ƒU[ %1 ‚̃AƒJƒEƒ“ƒg‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽŸ‚̃†[ƒU[‚̃AƒJƒEƒ“ƒg‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½: %1" - IDS_ERROR_CANT_DELETE_GROUP - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªƒOƒ‹[ƒv %1 ‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŽŸ‚̃Oƒ‹[ƒv‚ðíœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½: %1" - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚ª³‚µ‚­ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ªŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nAFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚̍ăCƒ“ƒXƒg[ƒ‹‚ª•K—v‚Å‚ ‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "ƒGƒ‰[ - AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[" - IDS_CMDLINE_SYNTAX "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B" - IDS_CMDLINE_UNRECOGNIZED - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1""ƒpƒ‰ƒ[ƒ^[‚ª”Fޝ‚Å‚«‚Ü‚¹‚ñB" - IDS_CMDLINE_DUPLICATE "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1""ƒpƒ‰ƒ[ƒ^[‚ª•¡”‰ñŽw’肳‚ê‚Ä‚¢‚Ü‚·B" - IDS_CMDLINE_UNEXPECTVALUE - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1""ƒpƒ‰ƒ[ƒ^[‚É’l‚ª‚ ‚è‚Ü‚¹‚ñB" - IDS_CMDLINE_MISSINGVAL "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\n""%1""ƒpƒ‰ƒ[ƒ^[‚ÌŒã‚É’l‚ª‘±‚¢‚Ä‚¢‚Ü‚¹‚ñB" - IDS_CMDLINE_USERPASSWORD - "AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[‚ÉŽw’肵‚½ƒRƒ}ƒ“ƒhs‚ª–³Œø‚Å‚·B\n\nV‚µ‚¢ AFSƒg[ƒNƒ“‚ðŽæ“¾‚·‚é‚ɂ́A ""/USER"" ‚¨‚æ‚Ñ ""/PASSWORD"" ƒpƒ‰ƒ[ƒ^[‚ðŽw’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/ko_KR/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/ko_KR/AfsUsrMgr.rc deleted file mode 100644 index 5e40a5d63..000000000 --- a/src/WINNT/afsusrmgr/lang/ko_KR/AfsUsrMgr.rc +++ /dev/null @@ -1,1746 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,302,184 - LTEXT "¼±ÅÃµÈ ¼¿:",IDC_STATIC,4,7,55,8 - LTEXT "(¾Æ¹« °Íµµ ¼±ÅõÇÁö ¾ÊÀ½)",IDC_CELL,63,7,212,8 - LTEXT "AFS ÅäÅ«:",IDC_STATIC,4,18,55,8 - LTEXT "(ÅäÅ« ¾øÀ½)",IDC_CREDS,63,18,212,8 - ICON IDI_MAIN,IDC_ANIM,285,7,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,39,14,ES_AUTOHSCROLL - RTEXT "ÆÐÅÏ:",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...",IDC_USERS_TITLE,4, - 6,142,8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "ÀÛ¼º(&C)...",M_USER_CREATE,65,126,55,14 - PUSHBUTTON "¸â¹ö½±(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "Ư¼º(&P)...",M_PROPERTIES,183,126,55,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "ÆÐÅÏ:",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...",IDC_GROUPS_TITLE,4, - 6,142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "ÀÛ¼º(&C)...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "±¸¼º¿ø(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "Ư¼º(&P)...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "ÁøÇà ÁßÀÎ Á¶ÀÛ - AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - LTEXT "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...",IDC_ACTION_DESC,2, - 2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇÑ Á¤º¸" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,21,20 - LTEXT "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ ¹öÀü 3.5",IDC_STATIC,33,8,189,8 - LTEXT "Copyright IBM Corporation 1989, 1999",IDC_STATIC,33,20, - 189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "´Ý±â(&C)",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¿À·ù ÄÚµå ã±â" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¿À·ù ¹øÈ£(&E):",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "º¯È¯(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "´Ý±â(&C)",IDCANCEL,85,123,48,14 - LTEXT "(½ÇÇà Áß ¼³Á¤µÈ ÅØ½ºÆ®)",IDC_ERROR_DESC,4,71,130,15 - LTEXT "¿À·ù ÄÚµåÀÇ Àǹ̸¦ ¾Ë¾Æº¸·Á¸é, ¾Æ·¡¿¡ Äڵ带 ÀÔ·ÂÇϰí ""º¯È¯"" ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "ã±â ¸í·É" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "µµ¿ò¸» Ç¥½Ã(&H)",IDOK,160,39,67,14 - PUSHBUTTON "Ãë¼Ò(&C)",IDCANCEL,160,55,67,14 - LTEXT "ÀÛ¾÷ ¼öÇà½Ã AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥À» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸·Á¸é, ¾Æ·¡ÀÇ ¸í·ÉÇàÀ» ¼±ÅÃÇÏ°í µµ¿ò¸» Ç¥½Ã ´ÜÃ߸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Ä÷³" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¸ñ·Ï ³ª¿­½Ã Ç¥½ÃÇÒ Ä÷³ ¼±ÅÃ(&S)",IDC_STATIC,5,7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "»ç¿ë°¡´ÉÇÑ Ä÷³(&C):",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Ç¥½ÃÇÒ Ä÷³(&I):",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Ãß°¡(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< Á¦°Å(&R)",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "À§·Î À̵¿(&U)",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "¾Æ·¡·Î À̵¿(&D)",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "Ä÷³ ³ª¿­",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "°í±Þ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÇöÀç Ű:",IDC_STATIC,5,5,40,8 - LTEXT "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...",IDC_USER_KEY,52,5, - 173,20,0,WS_EX_STATICEDGE - CONTROL "½Ã½ºÅÛ °èÁ¤À¸·Î »ç¿ë(¾Ïȣȭ ¾øÀ½)",IDC_USER_NOSEAL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,35,144,10 - CONTROL "»ç¿ëÀÚ¿¡°Ô °ü¸® Ư±Ç ºÎ¿©(&A)",IDC_USER_ADMIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,52,120,10 - CONTROL "ƼÄÏ ºÎ¿©(&G), ¼ö¸í:",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,69,84,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP,92, - 68,66,12 - CONTROL "±×·ì ÀÛ¼º ÇÒ´ç·®(&Q):",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,86,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,92,85,27,13,ES_AUTOHSCROLL - LTEXT "°èÁ¤ »óÅ º¸±â:",IDC_STATIC,12,140,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼ÒÀ¯ÇÑ ±×·ì ³ª¿­(&W):",IDC_STATIC,12,156,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±×·ì ¸â¹ö½± ³ª¿­(&M):",IDC_STATIC,12,172,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "±âŸ °èÁ¤ Çã¿ë",IDC_STATIC,5,109,220,82 - LTEXT "´ÙÀ½ ¼³Á¤Àº ÀÌ °èÁ¤À» º¼ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.", - IDC_STATIC,11,124,204,8 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - CONTROL "¾ÏÈ£ º¯°æ °¡´É(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "¾ÏÈ£ º¯°æ(&P)",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "ÀÌÀü ¾ÏÈ£ ´Ù½Ã »ç¿ë °¡´É(&R)",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "¾ÏÈ£°¡ ´ÙÀ½ ÀÌÈÄ¿¡ ¸¸±âµÊ",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,104,10 - LTEXT "ÀÏ",IDC_STATIC,182,79,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,142,76,29,13,ES_AUTOHSCROLL - CONTROL "°èÁ¤ À¯È¿±â°£",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,65,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,61,12 - LTEXT "½Ã°£(&T)",IDC_USER_EXPIRE_AT,155,98,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,96,53,12 - CONTROL "´ÙÀ½ ÀÌÈÄ¿¡ °èÁ¤ÀÌ Àá±è",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,140,92,10 - CONTROL "¹«ÇÑÁ¤ °èÁ¤À» Àá±Ý(°ü¸®ÀÚ°¡ Àá±ÝÇØÁ¦ÇÒ ¶§±îÁö)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,173,10 - CONTROL "°èÁ¤ Àá±Ý ½Ã°£(&F)",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,98,171,56,12 - PUSHBUTTON "Àá±ÝÇØÁ¦(&U)",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "½ÇÆÐÇÑ ·Î±×ÀÎ ½Ãµµ",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "%1 »ç¿ëÀÚ",IDC_USER_NAME,37,13,188,8 - GROUPBOX "°èÁ¤",IDC_STATIC,5,32,220,85 - LTEXT "¹ø ¿¬¼Ó ½ÇÆÐÇÑ ·Î±×ÀÎ",IDC_STATIC,149,141,69,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,110,139,22,13,ES_AUTOHSCROLL -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,18,20 - LTEXT "%1 ±×·ì",IDC_GROUP_NAME,37,13,188,8 - LTEXT "°èÁ¤ »óÅ º¸±â(&S):",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼ÒÀ¯µÈ ±×·ì º¸±â(&G):",IDC_STATIC,12,124,67,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±×·ì ±¸¼º¿ø ³ª¿­(&M):",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±¸¼º¿ø Ãß°¡(&A):",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±¸¼º¿ø Á¦°Å(&R):",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "±âŸ °èÁ¤ Çã¿ë",IDC_STATIC,5,77,220,114 - LTEXT "ÀÌ ¼³Á¤Àº ÀÌ ±×·ìÀ» º¼ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.", - IDC_STATIC,11,92,204,8 - LTEXT "¼ÒÀ¯ÀÚ:",IDC_STATIC,5,31,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,31,113,8 - PUSHBUTTON "¼ÒÀ¯ÀÚ º¯°æ(&O)...",IDC_GROUP_CHANGEOWNER,159,29,66,12 - LTEXT "ÀÛ¼ºÀÚ:",IDC_STATIC,5,46,27,8 - LTEXT "%1",IDC_GROUP_CREATOR,37,46,113,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "±×·ì" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±×·ì",IDC_STATIC,5,31,220,160 - LTEXT "ÀÌ ¼³Á¤À» »ç¿ëÇϸé ÀÌ »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÑ ±×·ì ¸ñ·Ï »Ó¸¸ ¾Æ´Ï¶ó ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÑ ±×·ì ¸ñ·Ïµµ º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "Á¦°Å(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ãß°¡(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÑ ±×·ì Ç¥½Ã(&S)",IDC_USER_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÀÌ »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÑ ±×·ì Ç¥½Ã(&H)",IDC_USER_SHOW_OWNER, - "Button",BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...)",IDC_GROUPS_TITLE, - 12,74,205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸â¹ö½±" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±×·ì ¸â¹ö½±",IDC_STATIC,5,31,220,160 - LTEXT "ÀÌ ¼³Á¤À» »ç¿ëÇϸé ÀÌ ±×·ìÀÌ ¼ÒÀ¯ÇØ¾ß ÇÏ´Â ±×·ìÀ» ¼±ÅÃÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ÀÌ ±×·ìÀÇ ±¸¼º¿øÀ» ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "Á¦°Å(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ãß°¡(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÀÌ ±×·ìÀÇ ±¸¼º¿ø Ç¥½Ã(&S)",IDC_GROUP_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÀÌ ±×·ìÀÌ ¼ÒÀ¯ÇÑ ±×·ì Ç¥½Ã(&H)",IDC_GROUP_SHOW_OWNER, - "Button",BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...)",IDC_USERS_TITLE, - 12,74,205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(½ÇÇà Áß ¼±ÅÃµÈ Á¦¸ñ)" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - RTEXT "(½ÇÇà Áß)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¼±ÅÃ(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,224,129,50,14 - CONTROL "(½ÇÇà Áß ÁöÁ¤µÈ ÅØ½ºÆ®)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,59,133,146,10 - RTEXT "¼¿ Á¶È¸(&C):",IDC_STATIC,7,8,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ÆÐÅÏ:",IDC_GROUPS_PATTERN_PROMPT,198,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 281, 145 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "°èÁ¤ ¾ÏÈ£ º¯°æ" -FONT 9, "±¼¸²" -BEGIN - CONTROL "»õ ¾ÏÈ£ÀÇ ¹öÀü ¹øÈ£¸¦ ÀÚµ¿À¸·Î ¼±ÅÃ(&A)", - IDC_CPW_VERSION_AUTO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,42,36,203,10 - CONTROL "Ű ¹öÀü »ç¿ë(&U):",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,42,52,69,10 - EDITTEXT IDC_CPW_VERSION,120,51,43,14,ES_AUTOHSCROLL - CONTROL "ÇØ´ç ¹®ÀÚ¿­ ¾Ïȣȭ:",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,42,78,73,10 - CONTROL "ÇØ´ç Ű »ç¿ë:",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,42,95,57,10 - EDITTEXT IDC_CPW_STRING,119,76,148,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,119,94,103,14,ES_AUTOHSCROLL - PUSHBUTTON "ÀÓÀǼ±ÅÃ(&R)",IDC_CPW_RANDOM,226,94,48,14 - DEFPUSHBUTTON "È®ÀÎ",IDOK,116,124,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,170,124,50,14 - PUSHBUTTON "µµ¿ò¸»",9,224,124,50,14 - LTEXT "%1 »ç¿ëÀÚÀÇ »õ ¾ÏÈ£",IDC_CPW_TITLE,43,14,231,8 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "¹öÀü:",-1,13,37,23,9 - LTEXT "°ª:",-1,13,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "±×·ì À̸§ º¯°æ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "»õ ±×·ì À̸§(&N):",IDC_STATIC,35,103,57,8 - EDITTEXT IDC_RENAME_NEWNAME,109,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,109,129,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,163,129,50,14 - PUSHBUTTON "µµ¿ò¸»",9,217,129,50,14 - LTEXT "ÇöÀç ¼ÒÀ¯ÀÚ:",IDC_STATIC,35,65,47,8 - PUSHBUTTON "¼ÒÀ¯ÀÚ º¯°æ(&C)...",IDC_RENAME_CHOWN,198,63,69,14 - LTEXT "ÇöÀç ±×·ì À̸§:",IDC_STATIC,35,83,65,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "%1 ±×·ì À̸§ º¯°æ",IDC_RENAME_TITLE,35,14,222,8 - LTEXT "ÁÖ: ±×·ì À̸§¿¡ Á¢µÎ»ç°¡ ¾øÀ¸¸é À̸§Àº ±×·ìÀÇ ÇöÀç ¼ÒÀ¯ÀÚ¸¦ Á¤È®ÇÏ°Ô ¹Ý¿µÇØ¾ß ÇÕ´Ï´Ù(¿¹: ""¼ÒÀ¯ÀÚ:±×·ì À̸§"").", - IDC_STATIC,35,34,231,16 - LTEXT "(Á¶È¸ Áß)",IDC_RENAME_OWNER,109,65,82,8 - LTEXT "(Á¶È¸ Áß)",IDC_RENAME_OLDNAME,109,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 281, 153 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(½ÇÇà Áß ¼±ÅÃµÈ Á¦¸ñ)" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - RTEXT "(½ÇÇà Áß)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¼±ÅÃ(&S)",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,224,132,50,14 - RTEXT "Ç¥½Ã:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "¼¿ Á¶È¸(&C):",IDC_STATIC,7,8,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ÆÐÅÏ:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 281, 169 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(½ÇÇà Áß ¼±ÅÃµÈ Á¦¸ñ)" -CLASS "AFSAccountManagerClass" -FONT 9, "±¼¸²" -BEGIN - RTEXT "(½ÇÇà Áß)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¼±ÅÃ(&S)",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,224,132,50,14 - RTEXT "Ç¥½Ã:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(½ÇÇà Áß ÁöÁ¤µÈ ÅØ½ºÆ®)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,60,151,140,10 - RTEXT "¼¿ Á¶È¸(&C):",IDC_STATIC,7,8,41,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,56,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ÆÐÅÏ:",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "±×·ì" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±×·ì",IDC_STATIC,5,31,220,160 - LTEXT "ÀÌ ¼³Á¤À» »ç¿ëÇϸé ÀÌ »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÒ ±×·ì»Ó¸¸ ¾Æ´Ï¶ó ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÒ ÃÊ±â ±×·ì ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "Á¦°Å(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ãß°¡(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÒ ±×·ì Ç¥½Ã(&S)",IDC_USER_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÀÌ »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÒ ±×·ì Ç¥½Ã(&H)",IDC_USER_SHOW_OWNER, - "Button",BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...)",IDC_GROUPS_TITLE, - 12,74,205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 238, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "»ç¿ëÀÚ ÀÛ¼º" -FONT 9, "±¼¸²" -BEGIN - LTEXT "À̸§(&N):",IDC_STATIC,7,37,22,8 - EDITTEXT IDC_NEWUSER_NAME,46,35,127,14,ES_AUTOHSCROLL - LTEXT "¾ÏÈ£(&P):",IDC_STATIC,7,57,34,8 - EDITTEXT IDC_NEWUSER_PW1,46,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "¾ÏÈ£ È®ÀÎ(&R):",IDC_STATIC,7,77,31,8 - EDITTEXT IDC_NEWUSER_PW2,46,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "´ÙÀ½À¸·Î »ç¿ë°¡´ÉÇÑ »ç¿ëÀÚ ID¸¦ ÀÚµ¿À¸·Î »ç¿ë(&U)", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,40,96, - 191,10 - CONTROL "°íÀ¯ÀÇ »ç¿ëÀÚ ID »ç¿ë(&S):",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,40,112,96,9 - EDITTEXT IDC_NEWUSER_ID,141,111,60,14,ES_AUTOHSCROLL - PUSHBUTTON "±×·ì(&G)...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "È®ÀÎ",IDOK,94,149,43,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,141,149,43,14 - PUSHBUTTON "µµ¿ò¸»",9,188,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "%1 ¼¿ÀÇ »õ »ç¿ëÀÚ",IDC_NEWUSER_TITLE,46,14,185,8 - LTEXT "»ç¿ëÀÚ ID:",IDC_STATIC,7,97,27,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "%1 ¼¿ÀÇ »õ ±×·ì",IDC_GROUP_NAME,37,13,188,8 - LTEXT "°èÁ¤ »óÅ º¸±â(&S):",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼ÒÀ¯µÈ ±×·ì º¸±â(&G):",IDC_STATIC,12,124,67,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±×·ì ±¸¼º¿ø ³ª¿­(&M):",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±¸¼º¿ø Ãß°¡(&A):",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±¸¼º¿ø Á¦°Å(&R):",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "±âŸ °èÁ¤ Çã¿ë",IDC_STATIC,5,68,220,123 - LTEXT "ÀÌ ¼³Á¤Àº ÀÌ ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ º¼ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.", - IDC_STATIC,11,83,205,14 - LTEXT "¼ÒÀ¯ÀÚ:",IDC_STATIC,5,35,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,35,113,8 - PUSHBUTTON "¼ÒÀ¯ÀÚ º¯°æ(&O)...",IDC_GROUP_CHANGEOWNER,159,33,66,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸â¹ö½±" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±×·ì ¸â¹ö½±",IDC_STATIC,5,31,220,160 - LTEXT "ÀÌ ¼³Á¤À» »ç¿ëÇϸé ÀÌ ±×·ìÀÌ ¼ÒÀ¯ÇØ¾ß ÇÏ´Â ±×·ìÀ» ¼±ÅÃÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ÀÌ ±×·ìÀÇ Ãʱ⠱¸¼º¿øÀ» ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "Á¦°Å(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ãß°¡(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÀÌ ±×·ìÀÇ Ãʱ⠱¸¼º¿ø Ç¥½Ã(&S)",IDC_GROUP_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÀÌ ±×·ìÀÌ ¼ÒÀ¯ÇÑ ±×·ì Ç¥½Ã(&H)",IDC_GROUP_SHOW_OWNER, - "Button",BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...)",IDC_USERS_TITLE, - 12,74,205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 238, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "±×·ì ÀÛ¼º" -FONT 9, "±¼¸²" -BEGIN - LTEXT "À̸§(&N):",-1,7,37,22,8 - EDITTEXT IDC_NEWGROUP_NAME,46,35,127,14,ES_AUTOHSCROLL - CONTROL "´ÙÀ½À¸·Î »ç¿ë °¡´ÉÇÑ ±×·ì ID¸¦ ÀÚµ¿À¸·Î »ç¿ë(&U)", - IDC_NEWGROUP_ID_AUTO,"Button",BS_AUTORADIOBUTTON,45,60, - 186,10 - CONTROL "°íÀ¯ÀÇ ±×·ì ID »ç¿ë(&S):",IDC_NEWGROUP_ID_MANUAL,"Button", - BS_AUTORADIOBUTTON,45,75,87,10 - EDITTEXT IDC_NEWGROUP_ID,136,73,39,14,ES_AUTOHSCROLL - PUSHBUTTON "±¸¼º¿ø(&M)...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "È®ÀÎ",IDOK,94,114,43,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,141,114,43,14 - PUSHBUTTON "µµ¿ò¸»",9,188,114,43,14 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "%1 ¼¿ÀÇ »õ ±×·ì",IDC_NEWGROUP_TITLE,46,14,185,8 - LTEXT "±×·ì ID:",-1,7,60,32,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "»ç¿ëÀÚ »èÁ¦" -FONT 9, "±¼¸²" -BEGIN - PUSHBUTTON "È®ÀÎ",IDOK,116,93,50,14 - DEFPUSHBUTTON "Ãë¼Ò",IDCANCEL,170,93,50,14 - PUSHBUTTON "µµ¿ò¸»",9,224,93,50,14 - LTEXT "ÁÖÀÇ!\n\n%1 °èÁ¤À» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 - CONTROL "ÀÌ °èÁ¤¿¡ ´ëÇÑ KAS µ¥ÀÌÅͺ£À̽º ¸ñ·Ï »èÁ¦(&K)", - IDC_DELETE_KAS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 53,203,10 - CONTROL "ÀÌ °èÁ¤¿¡ ´ëÇÑ PTS µ¥ÀÌÅͺ£À̽º ¸ñ·Ï »èÁ¦(&P)", - IDC_DELETE_PTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "±×·ì »èÁ¦" -FONT 9, "±¼¸²" -BEGIN - PUSHBUTTON "È®ÀÎ",IDOK,116,61,50,14 - DEFPUSHBUTTON "Ãë¼Ò",IDCANCEL,170,61,50,14 - PUSHBUTTON "µµ¿ò¸»",9,224,61,50,14 - LTEXT "ÁÖÀÇ!\n\n%1 ±×·ìÀ» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "»ç¿ëÀÚ ID ¹øÈ£ÀÇ ÃÖ´ë°ª(&U):",IDC_STATIC,11,87,80,8 - EDITTEXT IDC_CELL_USERMAX,102,85,40,14,ES_AUTOHSCROLL - LTEXT "±×·ì ID ¹øÈ£ÀÇ ÃÖ´ë°ª(&G):",IDC_STATIC,11,105,80,8 - EDITTEXT IDC_CELL_GROUPMAX,102,103,40,14,ES_AUTOHSCROLL - GROUPBOX "»ç¿ëÀÚ ¹× ±×·ì ID ¹øÈ£",IDC_STATIC,5,31,220,97 - LTEXT "´ÙÀ½ ¼³Á¤Àº Áö±Ý±îÁö »ç¿ëµÈ »ç¿ëÀÚ ¹× ±×·ì ID ¹øÈ£ Áß ÃÖ´ë°ªÀ» ¹Ý¿µÇÕ´Ï´Ù. ÀûÀº °ªÀ¸·Î ¼³Á¤ÇÏ¸é ±âÁ¸ÀÇ ID ¹øÈ£¿Í Ãæµ¹ÇÒ ¿ì·Á°¡ ÀÖÀ¸¹Ç·Î ÇØ´ç °ªÀ» Áõ°¡½ÃŰ´Â °ÍÀÌ ¾ÈÀüÇÕ´Ï´Ù. ", - IDC_STATIC,11,43,204,32 - ICON IDI_CELL,IDC_STATIC,5,5,20,20 - LTEXT "%1 ¼¿",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - CONTROL "¾ÏÈ£ º¯°æ °¡´É(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "¾ÏÈ£ º¯°æ(&P)",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "ÀÌÀü ¾ÏÈ£ ´Ù½Ã »ç¿ë °¡´É(&R)",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "¾ÏÈ£°¡ ´ÙÀ½ ÀÌÈÄ¿¡ ¸¸±âµÊ",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,98,10 - LTEXT "ÀÏ",IDC_STATIC,168,79,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,112,137,20,13,ES_AUTOHSCROLL - CONTROL "°èÁ¤ À¯È¿±â°£",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,66,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 95,61,12 - LTEXT "½Ã°£(&T)",IDC_USER_EXPIRE_AT,155,98,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,96,53,12 - CONTROL "´ÙÀ½ ÀÌÈÄ¿¡ °èÁ¤ÀÌ Àá±è",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,140,94,10 - LTEXT "¹ø ¿¬¼Ó ½ÇÆÐÇÑ ·Î±×ÀÎ",IDC_STATIC,146,141,73,8 - CONTROL "¹«ÇÑÁ¤ °èÁ¤À» Àá±Ý(°ü¸®ÀÚ°¡ Àá±ÝÇØÁ¦ÇÒ ¶§±îÁö)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "°èÁ¤ Àá±Ý ½Ã°£(&F)",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,98,171,56,12 - PUSHBUTTON "Àá±ÝÇØÁ¦(&U)",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "½ÇÆÐÇÑ ·Î±×ÀÎ ½Ãµµ",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "%1 ¼¿ÀÇ »õ »ç¿ëÀÚ",IDC_USER_NAME,37,13,188,8 - GROUPBOX "°èÁ¤",IDC_STATIC,5,32,220,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "°í±Þ" -FONT 9, "±¼¸²" -BEGIN - CONTROL "ÀÌ °èÁ¤¿¡ ´ëÇÑ KAS µ¥ÀÌÅͺ£À̽º ¸ñ·Ï ÀÛ¼º(±ÇÀå)(&K)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,210,11 - CONTROL "ÀÌ °èÁ¤¿¡ ´ëÇÑ PTS µ¥ÀÌÅͺ£À̽º ¸ñ·Ï ÀÛ¼º(±ÇÀå)(&P)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,210,10 - CONTROL "½Ã½ºÅÛ °èÁ¤ ºÎ¿©(¾Ïȣȭ ¾øÀ½)(&s)",IDC_USER_NOSEAL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,40,160,10 - CONTROL "»ç¿ëÀÚ¿¡°Ô °ü¸® Ư±ÇÀÌ ºÎ¿©µÊ(&A)",IDC_USER_ADMIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,57,136,10 - CONTROL "ƼÄÏ ºÎ¿©(&G), ¼ö¸í:",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,74,84,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP,92, - 73,71,12 - CONTROL "±×·ì ÀÛ¼º ÇÒ´ç·®(&Q):",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,91,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,92,90,27,13,ES_AUTOHSCROLL - LTEXT "°èÁ¤ »óÅ º¸±â(&S):",-1,12,140,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼ÒÀ¯ÇÑ ±×·ì ³ª¿­(&W):",-1,12,156,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±×·ì ¸â¹ö½± ³ª¿­(&M):",-1,12,172,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "±âŸ °èÁ¤ Çã¿ë",-1,5,109,220,82 - LTEXT "´ÙÀ½ ¼³Á¤Àº ÀÌ °èÁ¤À» º¼ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.", - -1,11,124,204,8 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "ÆÐÅÏ:",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...",IDC_MACHINES_TITLE, - 4,6,142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "ÀÛ¼º(&C)...",M_MACHINE_CREATE,65,126,55,14 - PUSHBUTTON "¸â¹ö½±(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "Ư¼º(&P)...",M_PROPERTIES,183,126,55,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "±×·ì" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±×·ì",IDC_STATIC,5,31,220,160 - LTEXT "ÀÌ ¼³Á¤À» »ç¿ëÇϸé ÇØ´ç °èÁ¤ÀÌ ¼ÒÀ¯ÇÒ ±×·ì»Ó¸¸ ¾Æ´Ï¶ó ¼ÓÇÒ ÃÊ±â ±×·ì ¸ñ·Ïµµ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "Á¦°Å(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ãß°¡(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÇØ´ç °èÁ¤ÀÌ ¼ÓÇÒ ±×·ì Ç¥½Ã(&S)",IDC_USER_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÇØ´ç °èÁ¤ÀÌ ¼ÒÀ¯ÇÒ ±×·ì Ç¥½Ã(&H)",IDC_USER_SHOW_OWNER, - "Button",BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...)",IDC_GROUPS_TITLE, - 12,74,205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "°í±Þ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "°èÁ¤ »óÅ º¸±â(&S):",IDC_STATIC,12,88,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼ÒÀ¯ÇÑ ±×·ì ³ª¿­(&W):",IDC_STATIC,12,104,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±×·ì ¸â¹ö½± ³ª¿­(&M):",IDC_STATIC,12,120,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "±âŸ °èÁ¤ Çã¿ë",IDC_STATIC,5,57,220,82 - LTEXT "´ÙÀ½ ¼³Á¤Àº ÀÌ °èÁ¤À» º¼ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.", - IDC_STATIC,11,72,204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "%1 ¼¿ÀÇ »õ·Î¿î IP ÁÖ¼Ò °èÁ¤",IDC_USER_NAME,37,13,188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 247, 126 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "IP ÁÖ¼Ò °èÁ¤ ÀÛ¼º" -FONT 9, "±¼¸²" -BEGIN - LTEXT "IP ÁÖ¼Ò(&A):",-1,7,37,37,8 - EDITTEXT IDC_NEWUSER_NAME,50,35,127,14,ES_AUTOHSCROLL - CONTROL "´ÙÀ½À¸·Î »ç¿ë °¡´ÉÇÑ °èÁ¤ ID¸¦ ÀÚµ¿À¸·Î »ç¿ë(&U)", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,49,60, - 191,10 - CONTROL "°íÀ¯ÇÑ °èÁ¤ ID »ç¿ë(&S):",IDC_NEWUSER_ID_MANUAL,"Button", - BS_AUTORADIOBUTTON,49,76,98,10 - EDITTEXT IDC_NEWUSER_ID,151,75,39,14,ES_AUTOHSCROLL - PUSHBUTTON "±×·ì(&G)...",IDC_ADVANCED,7,105,54,14 - DEFPUSHBUTTON "È®ÀÎ",IDOK,103,105,43,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,151,105,43,14 - PUSHBUTTON "µµ¿ò¸»",9,197,105,43,14 - ICON IDI_SERVER,-1,7,6,21,20 - LTEXT "%1 ¼¿ÀÇ »õ·Î¿î IP ÁÖ¼Ò °èÁ¤",IDC_NEWUSER_TITLE,50,14, - 190,8 - LTEXT "°èÁ¤ ID:",-1,7,60,39,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "IP ÁÖ¼Ò °èÁ¤ »èÁ¦" -FONT 9, "±¼¸²" -BEGIN - PUSHBUTTON "È®ÀÎ",IDOK,153,63,50,14 - DEFPUSHBUTTON "Ãë¼Ò",IDCANCEL,207,63,50,14 - PUSHBUTTON "µµ¿ò¸»",9,261,63,50,14 - LTEXT "ÁÖÀÇ!\n\n%1 IP ÁÖ¼Ò °èÁ¤À» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù.", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "°í±Þ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "°èÁ¤ »óÅ º¸±â(&S):",IDC_STATIC,12,89,67,8 - COMBOBOX IDC_USER_PERM_STATUS,91,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¼ÒÀ¯ÇÑ ±×·ì ³ª¿­(&W):",IDC_STATIC,12,105,60,8 - COMBOBOX IDC_USER_PERM_OWNED,91,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "±×·ì ¸â¹ö½± ³ª¿­(&M):",IDC_STATIC,12,121,73,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "±âŸ °èÁ¤ Çã¿ë",IDC_STATIC,5,57,220,82 - LTEXT "´ÙÀ½ ¼³Á¤Àº ÀÌ °èÁ¤À» º¼ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù.", - IDC_STATIC,11,73,204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "IP ÁÖ¼Ò °èÁ¤ %1",IDC_USER_NAME,37,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "±×·ì" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±×·ì",IDC_STATIC,5,31,220,160 - LTEXT "ÀÌ ¼³Á¤À» »ç¿ëÇϸé ÇØ´ç °èÁ¤ÀÌ ¼ÒÀ¯ÇÏ´Â ±×·ì»Ó¸¸ ¾Æ´Ï¶ó ¼ÓÇÑ ±×·ì ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "Á¦°Å(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ãß°¡(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÇØ´ç °èÁ¤ÀÌ ¼ÓÇÑ ±×·ì Ç¥½Ã(&S)",IDC_USER_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÇØ´ç °èÁ¤ÀÌ ¼ÒÀ¯ÇÑ ±×·ì Ç¥½Ã(&H)",IDC_USER_SHOW_OWNER, - "Button",BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À...)",IDC_GROUPS_TITLE, - 12,74,205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 235, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¿É¼Ç" -FONT 9, "±¼¸²" -BEGIN - CONTROL "Unix À¯ÇüÀÇ Á¤±Ô½Ä »ç¿ë(&U)(""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,191,10 - CONTROL "Windows À¯ÇüÀÇ Á¤±Ô½Ä »ç¿ë(&W)(""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,182, - 10 - CONTROL "°ü¸® ÅäÅ« ¾øÀÌ ÀÛ¾÷ÇÏ´Â °æ¿ì, °æ°í¸¦ Ç¥½ÃÇϽʽÿÀ", - IDC_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 12,113,202,10 - CONTROL "Á¤º¸¸¦ ¸ÅºÐ¸¶´Ù",IDC_REFRESH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,21,135,66,9 - LTEXT "ÀÚµ¿À¸·Î »õ·Î °íħ(&A)",IDC_STATIC,128,136,83,8 - EDITTEXT IDC_REFRESH_RATE,92,132,21,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,20,20 - LTEXT "Afs °èÁ¤ °ü¸® ÇÁ·Î±×·¥ ¿É¼Ç",IDC_STATIC,37,12,96,8 - GROUPBOX "Á¤±Ô½Ä",IDC_STATIC,5,37,225,57 - GROUPBOX "ÀϹÝ",IDC_STATIC,5,100,225,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 284, 129 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Ç¥½ÃÇÒ »ç¿ëÀÚ ¼±ÅÃ" -FONT 9, "±¼¸²" -BEGIN - CONTROL "¸ðµç »ç¿ëÀÚ °èÁ¤¿¡ ´ëÇÑ ¸ñ·Ï Ç¥½Ã(&A)",IDC_SEARCH_ALL, - "Button",BS_AUTORADIOBUTTON,29,40,133,10 - CONTROL "ÀÌÀü¿¡ ¸¸±âµÇ´Â »ç¿ëÀÚ °èÁ¤¸¸ Ç¥½Ã",IDC_SEARCH_EXPIRE, - "Button",BS_AUTORADIOBUTTON,29,55,135,9 - CONTROL "ÀÌÀü¿¡ ¾ÏÈ£°¡ ¸¸±âµÇ´Â °èÁ¤¸¸ Ç¥½Ã",IDC_SEARCH_PWEXPIRE, - "Button",BS_AUTORADIOBUTTON,29,70,135,10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 188,54,65,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,188,69,65,12 - DEFPUSHBUTTON "È®ÀÎ",IDOK,119,108,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,173,108,50,14 - PUSHBUTTON "µµ¿ò¸»",9,227,108,50,14 - LTEXT "ÀÌ Á¦¾î¸¦ »ç¿ëÇÏ¸é »ç¿ëÀÚ ÅÇ¿¡ Ç¥½ÃµÉ »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̿ܿ¡µµ »ç¿ëÀÚ ÅÇÀÇ ÆÐÅÏ Á¦¾î¿¡ °èÁ¤ À̸§ÀÇ ÀϺκи¸ ÀÔ·ÂÇÏ¿© Ç¥½ÃµÇ´Â »ç¿ëÀÚ ¸ñ·ÏÀ» Á¦ÇÑÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,6,270,25 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 138 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 146 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 162 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - TOPMARGIN, 6 - BOTTOMMARGIN, 119 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 230 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 277 - TOPMARGIN, 6 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "¼¿(&C)" - BEGIN - MENUITEM "¼±ÅÃ(&S)...", M_OPENCELL - MENUITEM "ÀÎÁõ(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "¼¿ Ư¼º(&R)...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "Á¾·á(&X)", M_EXIT - END - POPUP "ÆíÁý(&E)" - BEGIN - MENUITEM "»ç¿ëÀÚ ÀÛ¼º(&C)...", M_USER_CREATE - MENUITEM "±×·ì ÀÛ¼º(&G)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "À̸§ º¯°æ(&N)...", M_RENAME - MENUITEM "»èÁ¦(&D)...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ ¼±ÅÃ(&A)\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "»õ·Î °íħ(&F)\tF5", M_REFRESH - MENUITEM "¸â¹ö½±...(&M)\tCtrl+M", M_MEMBERSHIP - MENUITEM "Ư¼º(&R)\tAlt+Enter", M_PROPERTIES - END - POPUP "º¸±â(&V)" - BEGIN - POPUP "¾ÆÀÌÄÜ(&I)" - BEGIN - MENUITEM "Å« ¾ÆÀÌÄÜ(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "ÀÛÀº ¾ÆÀÌÄÜ(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "ÀÚ¼¼È÷(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONE, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWO, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ÁøÇà ÁßÀÎ Á¶ÀÛ(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ä÷³(&C)...", M_COLUMNS - MENUITEM "¿É¼Ç(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL - END - POPUP "µµ¿ò¸»(&H)" - BEGIN - MENUITEM "¸ñÂ÷(&C)", M_CONTENTS - MENUITEM "¸í·É ã±â(&F)...", M_FIND - MENUITEM "¿À·ù ÄÚµå ã±â(&L)...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇÑ Á¤º¸(&A)...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "Å« ¾ÆÀÌÄÜ(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "ÀÛÀº ¾ÆÀÌÄÜ(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "ÀÚ¼¼È÷(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONE, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWO, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "»ç¿ëÀÚ ÀÛ¼º(&C)...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "Å« ¾ÆÀÌÄÜ(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "ÀÛÀº ¾ÆÀÌÄÜ(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "ÀÚ¼¼È÷(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONE, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWO, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "±×·ì ÀÛ¼º(&G)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "±×·ì(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "¾ÏÈ£ º¯°æ(&P)...", M_CPW - MENUITEM "Àá±ÝÇØÁ¦(&U)", M_UNLOCK - MENUITEM "»èÁ¦(&D)...", M_DELETE - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "Ư¼º(&P)...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "±×·ì ±¸¼º¿ø(&M)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "À̸§ º¯°æ(&R)...", M_RENAME - MENUITEM "»èÁ¦(&D)...", M_DELETE - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "Ư¼º(&P)...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "Ä÷³(&C)...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "º¸±â(&V)" - BEGIN - MENUITEM "Å« ¾ÆÀÌÄÜ(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "ÀÛÀº ¾ÆÀÌÄÜ(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "ÀÚ¼¼È÷(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Ç¥ÁØ(&N)", M_VIEW_ONE, CHECKED - MENUITEM "¸ðµç ¾ÆÀÌÄÜ(&A)", M_VIEW_TWO, CHECKED - MENUITEM "»óŸ¸(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "°èÁ¤ ÀÛ¼º(&C)...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "¸ðµÎ »õ·Î °íħ(&F)", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "±×·ì(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "»èÁ¦(&D)...", M_DELETE - MENUITEM "»õ·Î °íħ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "Ư¼º(&P)...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥" - IDS_USRCOL_NAME "»ç¿ëÀÚ À̸§" - IDS_GRPCOL_NAME "±×·ì À̸§" - IDS_BADCREDS_DESC "°ü¸®ÀÚ·Î ·Î±×ÀÎÇÏÁö ¾Ê¾ÒÀ¸¸é %1 ¼¿À» °ü¸®ÇÏ´Â µ¥ ÇÊ¿äÇÑ Æ¯±ÇÀÌ ºÎÁ·ÇÒ ¼ö ÀÖ½À´Ï´Ù." - IDS_TAB_USERS "»ç¿ëÀÚ" - IDS_TAB_GROUPS "±×·ì" - IDS_CELL_NONE "(¼±ÅÃµÈ ¼¿ ¾øÀ½)" - IDS_CRED_NONE "(ÀÌ ¼¿¿¡ ÅäÅ« ¾øÀ½)" - IDS_CRED_EXP "%1(%2¿¡ ¸¸±âµÈ ÅäÅ«)" - IDS_CRED_OK "%1(%2¿¡ ¸¸±âµÉ ÅäÅ«)" - IDS_USERS_ALL "%1 ¼¿ÀÇ ¸ðµç »ç¿ëÀÚ:" - IDS_USERS_PATTERN "%1 ¼¿¿¡¼­ ¼±ÅÃµÈ »ç¿ëÀÚ:" - IDS_GROUPS_ALL "%1 ¼¿ÀÇ ¸ðµç ±×·ì:" - IDS_GROUPS_PATTERN "%1 ¼¿¿¡¼­ ¼±ÅÃµÈ ±×·ì:" - IDS_QUERYING_LONG "Á¶È¸ ÁßÀÔ´Ï´Ù. Àá½Ã ±â´Ù¸®½Ê½Ã¿À..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "ÁøÇà ÁßÀÎ Á¶ÀÛÀÌ ¾ø½À´Ï´Ù." - IDS_ACTION_DESC_ONE "´ÙÀ½ Á¶ÀÛÀÌ ÇöÀç ÁøÇà ÁßÀÔ´Ï´Ù." - IDS_ACTION_DESC_MULT "´ÙÀ½ Á¶ÀÛÀÌ ÇöÀç ÁøÇà ÁßÀÔ´Ï´Ù." - IDS_ACTCOL_OPERATION "Á¶ÀÛ" - IDS_ACTCOL_ELAPSED "°æ°úµÈ ½Ã°£" - IDS_ACTION_REFRESH_CELL "%1 ¼¿¿¡ ´ëÇÑ »õ·Î °íħ Á¤º¸" - IDS_ACTION_REFRESH_SERVER "%1 ¼­¹ö¿¡ ´ëÇÑ »õ·Î °íħ Á¤º¸" - IDS_ACTION_SCOUT_CELL "¹®Á¦Á¡¿¡ ´ëÇÑ %1 ¼¿ °Ë»ç" - IDS_ACTION_SCOUT_SERVER "¹®Á¦Á¡¿¡ ´ëÇÑ %1 ¼­¹ö °Ë»ç" - IDS_FIND_NOTHING_TITLE "¼±ÅÃµÈ ¸í·É ¾øÀ½" - IDS_FIND_NOTHING_DESC "Á¶ÀÛ ¼öÇà ¹æ¹ýÀ» ¾Ë¾Æº¸·Á¸é, ¸ÕÀú ¸ñ·Ï¿¡¼­ ¸í·ÉÇàÀ» ¼±ÅÃÇϰųª Ű¿öµå¸¦ ÀÔ·ÂÇϽʽÿÀ." - IDS_FIND_UNKNOWN_TITLE "¾Ë ¼ö ¾ø´Â ¸í·É" - IDS_FIND_UNKNOWN_DESC "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥Àº ""%1"" ¸í·É¿¡ ´ëÇÑ µµ¿ò¸» ÁÖÁ¦¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_HELPABOUT_DESC1 "°æ°í: ÀÌ ÄÄÇ»ÅÍ ÇÁ·Î±×·¥ÀÌ ÀúÀÛ±Ç ¹× ±¹Á¦ Çù¾à¿¡ ÀÇÇØ º¸È£µË´Ï´Ù." - IDS_HELPABOUT_DESC2 "Çã°¡ ¾øÀÌ ÀÌ ¼ÒÇÁÆ®¿þ¾î¸¦ Àç»ý»êÇϰųª ºÐ¹èÇÏ¸é ½É°¢ÇÑ ¹Î»ç ¹× Çü»ç »ç°ÇÀ» ÀÏÀ¸Å³ ¼ö ÀÖÀ¸¸ç ¹ýÀÌ Çã¿ëÇÏ´Â ¹üÀ§³»¿¡¼­ ÃÖ´ëÀÇ Ã³¹úÀ» ¹Þ°Ô µË´Ï´Ù.\n\n+" - IDS_HELPABOUT_DESC3 "AFS´Â IBM»ç Transarc CorporationÀÇ µî·Ï»óÇ¥ÀÔ´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "Ä÷³ - AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "º¹¼ö »ç¿ëÀÚ - Ư¼º" - IDS_USER_PROPERTIES_TITLE "%1 »ç¿ëÀÚ - Ư¼º" - IDS_USER_NAME_MULTIPLE "»ç¿ëÀÚ" - IDS_ACCOUNTACCESS_OWNER "°èÁ¤ »ç¿ëÀÚ Àü¿ë" - IDS_ACCOUNTACCESS_GROUP "±×·ì ±¸¼º¿ø Àü¿ë" - IDS_ACCOUNTACCESS_ANYONE "¸ðµç »ç¿ëÀÚ" - IDS_ACCOUNTACCESS_MIXED "(º¹¼ö ¼³Á¤)" - IDS_USER_KEY "%1\n%2 ¹öÀü, %3 üũ¼¶" - IDS_USER_KEY_HIDDEN "(¼û°ÜÁø ½ÇÁ¦ Ű °ª)" - IDS_USER_KEY_UNKNOWN "(¾Ë ¼ö ¾øÀ½)" - IDS_USER_KEY_MULTIPLE "(º¹¼ö Ű)" - IDS_ACTION_USER_CHANGE "%1 »ç¿ëÀÚÀÇ Æ¯¼º º¯°æ" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "º¹¼ö ±×·ì - Ư¼º" - IDS_GROUP_PROPERTIES_TITLE "%1 ±×·ì - Ư¼º" - IDS_GROUP_NAME_MULTIPLE "±×·ì " - IDS_ACCOUNTACCESS_OWNGROUP "±×·ì ¼ÒÀ¯ÀÚ Àü¿ë" - IDS_OWNER_MIXED "º¹¼ö ¼ÒÀ¯ÀÚ" - IDS_CREATOR_MIXED "º¹¼ö ÀÛ¼ºÀÚ" - IDS_GROUP_CHANGEOWNER_TITLE "±×·ì ¼ÒÀ¯ÀÚ º¯°æ" - IDS_GROUP_CHANGEOWNER_PROMPT "¼ÒÀ¯ÀÚ:" - IDS_MEMBER_MIXED "(ÀϺÎ)" - IDS_USER_SHOW_MEMBER_TITLE "ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÑ ¸ðµç ±×·ì:" - IDS_USER_SHOW_OWNER_TITLE "ÀÌ »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÑ ¸ðµç ±×·ì:" - IDS_GROUP_SHOW_MEMBER_TITLE "ÀÌ ±×·ìÀÇ ¸ðµç ±¸¼º¿ø:" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE "ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÑ ¸ðµç ±×·ì:" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "ÀÌ ±×·ì ³»ÀÇ ¸ðµç ±¸¼º¿ø:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "%1 ±×·ìÀ» %2·Î À̸§ º¯°æ" - IDS_RENAME_TITLE "%1 ±×·ì À̸§ º¯°æ" - IDS_GROUP_TITLE "%1 ±×·ì" - IDS_SHOW_USERS "ÀÌ ¼¿ÀÇ ¸ðµç »ç¿ëÀÚ" - IDS_SHOW_GROUPS "ÀÌ ¼¿ÀÇ ¸ðµç ±×·ì" - IDS_GROUP_SHOW_OWNED_TITLE "ÀÌ ±×·ìÀÌ ¼ÒÀ¯ÇÑ ¸ðµç ±×·ì:" - IDS_BROWSE_TITLE_OWNED "¼ÒÀ¯ÇÒ ±×·ì ¼±ÅÃ" - IDS_BROWSE_PROMPT_OWNED "±×·ì:" - IDS_BROWSE_CHECK_OWNED "ÇöÀç ¼ÒÀ¯ÇÏÁö ¾ÊÀº ±×·ì¸¸ Ç¥½Ã" - IDS_NEWUSER_PROPERTIES_TITLE "»ç¿ëÀÚ ÀÛ¼º - °í±Þ" - IDS_NEWUSER_SHOW_MEMBER_TITLE "ÀÌ »ç¿ëÀÚ°¡ ¼ÓÇÒ ¸ðµç ±×·ì:" - IDS_NEWUSER_SHOW_OWNER_TITLE "ÀÌ »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÒ ¸ðµç ±×·ì:" - IDS_ACTION_CELL_CHANGE "%1 ¼¿ÀÇ Æ¯¼º º¯°æ" - IDS_ACTION_USER_CREATE "%1 »ç¿ëÀÚÀÇ °èÁ¤ ÀÛ¼º" - IDS_NEWGROUP_PROPERTIES_TITLE "±×·ì ÀÛ¼º - °í±Þ" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "ÀÌ »õ ±×·ìÀÇ Ãʱ⠱¸¼º¿ø:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "Ç÷¡±×" - IDS_USRCOL_ADMIN "°ü¸®ÀÚ?" - IDS_USRCOL_TICKET "ƼÄÏ?" - IDS_USRCOL_SYSTEM "½Ã½ºÅÛ?" - IDS_USRCOL_CHANGEPW "¾ÏÈ£ º¯°æ?" - IDS_USRCOL_REUSEPW "¾ÏÈ£ Àç»ç¿ë?" - IDS_USRCOL_EXPIRES "°èÁ¤ ¸¸±â" - IDS_USRCOL_LASTPW "ÃÖÁ¾ ¾ÏÈ£ º¯°æ" - IDS_USRCOL_LASTMOD "ÃÖÁ¾ ¼öÁ¤" - IDS_USRCOL_LASTMODBY "ÃÖÁ¾ ¼öÁ¤" - IDS_USRCOL_LIFETIME "ƼÄÏ ¼ö¸í" - IDS_USRCOL_CDAYPW "¾ÏÈ£ ¸¸±â" - IDS_USRCOL_CFAILLOGIN "·Î±×ÀÎ Àå¾Ö" - IDS_USRCOL_CSECLOCK "·Î±×ÀÎ Àå¾Ö Àá±Ý ½Ã°£" - IDS_USRCOL_CGROUPMAX "±×·ì ÀÛ¼º ÇÒ´ç·®" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "¼ÒÀ¯ÀÚ" - IDS_USRCOL_CREATOR "ÀÛ¼ºÀÚ" - IDS_USRCOL_STATUS "»óÅÂ" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "¿¹" - IDS_NO "¾Æ´Ï¿À" - IDS_GRPCOL_CMEMBERS "¸â¹ö½± °è¼ö" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "¼ÒÀ¯ÀÚ" - IDS_GRPCOL_CREATOR "ÀÛ¼ºÀÚ" - IDS_COL_USERS "¼¿ÀÇ »ç¿ëÀÚ" - IDS_COL_GROUPS "¼¿ÀÇ ±×·ì" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE "ÀÌ »õ ±×·ìÀÌ ¼ÒÀ¯ÇÒ ±×·ì:" - IDS_USER_DELETE_MULTIPLE - "ÁÖÀÇ!\n\n%1 »ç¿ëÀÚ¿¡ ´ëÇÑ °èÁ¤À» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù." - IDS_GROUP_DELETE_MULTIPLE "ÁÖÀÇ!\n\n%1 ±×·ìÀ» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù." - IDS_ACTION_GROUP_CREATE "%1 ±×·ì ÀÛ¼º" - IDS_ACTION_USER_DELETE "%1 »ç¿ëÀÚ¿¡ ´ëÇÑ °èÁ¤ »èÁ¦" - IDS_ACTION_GROUP_DELETE "%1 ±×·ì »èÁ¦" - IDS_CELL_PROPERTIES_TITLE "%1 ¼¿ - Ư¼º" - IDS_MACHINES_ALL "%1 ¼¿ÀÇ ¸ðµç IP ÁÖ¼Ò °èÁ¤:" - IDS_MACHINES_PATTERN "%1 ¼¿¿¡¼­ ¼±ÅÃµÈ IP ÁÖ¼Ò °èÁ¤:" - IDS_TAB_MACHINES "ÁÖ¼Ò" - IDS_MACHINE_DELETE_MULTIPLE - "ÁÖÀÇ!\n\n%1 IP ÁÖ¼Ò °èÁ¤À» ¿µ±¸ÀûÀ¸·Î »èÁ¦ÇÕ´Ï´Ù." - IDS_NEWMACHINE_PROPERTIES_TITLE "IP ÁÖ¼Ò °èÁ¤ ÀÛ¼º - °í±Þ" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE "º¹¼öÀÇ IP ÁÖ¼Ò °èÁ¤ - Ư¼º" - IDS_MACHINE_PROPERTIES_TITLE "IP ÁÖ¼Ò °èÁ¤ %1 - Ư¼º" - IDS_COL_MACHINES "¼¿ÀÇ IP ÁÖ¼Ò °èÁ¤" - IDS_MCHCOL_NAME "IP ÁÖ¼Ò" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "Á¶ÀÎÇÒ ±×·ì ¼±ÅÃ" - IDS_BROWSE_PROMPT_JOIN "±×·ì:" - IDS_BROWSE_CHECK_JOIN "ÇöÀç Á¶ÀεÇÁö ¾ÊÀº ±×·ì¸¸ Ç¥½Ã" - IDS_BROWSE_TITLE_OWN "¼ÒÀ¯ÇÒ ±×·ì ¼±ÅÃ" - IDS_BROWSE_PROMPT_OWN "±×·ì:" - IDS_BROWSE_CHECK_OWN "ÇöÀç ¼ÒÀ¯ÇÏÁö ¾ÊÀº ±×·ì¸¸ Ç¥½Ã" - IDS_BROWSE_TITLE_MEMBER "Á¶ÀÎÇÒ »ç¿ëÀÚ ¼±ÅÃ" - IDS_BROWSE_PROMPT_MEMBER "»ç¿ëÀÚ:" - IDS_BROWSE_CHECK_MEMBER "±¸¼º¿øÀÌ ¾Æ´Ñ »ç¿ëÀÚ¸¸ Ç¥½Ã" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "%1 ±×·ì¿¡ ´ëÇÑ Æ¯¼º º¯°æ" - IDS_ACTION_GROUP_MEMBER_ADD "%1 ±×·ì¿¡ %2 »ç¿ëÀÚ Ãß°¡" - IDS_ACTION_GROUP_MEMBER_REMOVE "%1 ±×·ì¿¡¼­ %2 »ç¿ëÀÚ Á¦°Å" - IDS_ACTION_USER_PW_CHANGE "%1 »ç¿ëÀÚ¿¡ ´ëÇÑ ¾ÏÈ£ ¼³Á´" - IDS_UNKNOWN_NAME "(¾Ë ¼ö ¾øÀ½)" - IDS_ACTION_USER_UNLOCK "%1 »ç¿ëÀÚ¿¡ ´ëÇÑ °èÁ¤ Àá±Ý ÇØÁ¦" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "±×·ì ÀÛ¼º ÇÒ´ç·®" - IDS_MCHCOL_UID "°èÁ¤ ID" - IDS_MCHCOL_OWNER "¼ÒÀ¯ÀÚ" - IDS_MCHCOL_CREATOR "ÀÛ¼ºÀÚ" - IDS_OPTIONS_TITLE "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ ¿É¼Ç" - IDS_WARNING_TITLE "ÁÖÀÇ" - IDS_WARNING_SYSTEM_ACCOUNT - "%1 °èÁ¤À» ½ÅÁßÇÏ°Ô º¯°æÇØ¾ß ÇÕ´Ï´Ù. ÀÌ °èÁ¤À» ÀûÀýÈ÷ º¯°æÇÏÁö ¸øÇϸé AFSÀÇ ÀϺΠ±â´ÉÀÌ Á¦´ë·Î ÀÛµ¿ÇÏÁö ¸øÇÒ ¼ö ÀÖ½À´Ï´Ù.\n\n°è¼ÓÇϽðڽÀ´Ï±î?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE "ÀÌ °èÁ¤ÀÌ ¼ÓÇÑ ¸ðµç ±×·ì:" - IDS_MACHINE_SHOW_OWNER_TITLE "ÀÌ °èÁ¤ÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ¸ðµç ±×·ì:" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE "ÀÌ °èÁ¤ÀÌ ¼ÓÇØ ÀÖ´Â ¸ðµç ±×·ì:" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE "ÀÌ °èÁ¤ÀÌ ¼ÓÇÒ ¸ðµç ±×·ì:" - IDS_NEWMACHINE_SHOW_OWNER_TITLE "ÀÌ °èÁ¤ÀÌ ¼ÒÀ¯ÇÒ ¸ðµç ±×·ì:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ÄÄÇ»ÅÍ¿¡¼­ ½ÇÇà Áß¿¡ °ü¸® ÇÁ·Î¼¼½º¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼­ TaAfsAdmSvr.exe ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿© °ü¸® Ÿ½ºÅ©¸¦ ¿ø°ÝÀ¸·Î ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù." - IDS_ERROR_BAD_LOCAL_SERVER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ TaAfsAdmSvr.exe ÇÁ·Î±×·¥À» ãÀ» ¼ö ¾ø°Å³ª ÄÄÇ»ÅÍ¿¡¼­ AFS °ü¸®¸¦ ¼öÇàÇϵµ·Ï ÁغñÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_OPEN_CELL - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼¿¿¡ ÀÖ´Â ¾î¶°ÇÑ ¼­¹ö¿Íµµ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¼¿ÀÇ À̸§À» Á¦´ë·Î ÀÔ·ÂÇß´ÂÁö ´Ù½Ã È®ÀÎÇϽʽÿÀ." - IDS_ERROR_BADCREDENTIALS - "ÀÔ·ÂÇÑ AFS ½Äº°À» ÀνÄÇÒ ¼ö ¾ø°Å³ª ÁöÁ¤ÇÑ ¾ÏÈ£°¡ Ʋ·È½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "¿À·ù ¹øÈ£ 0x%1(%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "¿À·ù ¹øÈ£ 0x%1(%2)Àº(´Â) ÀνĵÇÁö ¾Ê½À´Ï´Ù." - IDS_ERROR_USER_MULTIPROP - "Ư¼º âÀÌ Çϳª ÀÌ»óÀÇ ¼±ÅÃµÈ »ç¿ëÀÚ¿¡ ´ëÇØ ÀÌ¹Ì ¿­·Á ÀÖÀ¸¹Ç·Î AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥Àº ¿äûµÈ âÀ» Ç¥½ÃÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CHANGE_USER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥Àº %1 »ç¿ëÀÚ¿¡ ´ëÇÑ Æ¯¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_GROUP_MULTIPROP - "Ư¼º âÀÌ Çϳª ÀÌ»óÀÇ ¼±ÅÃµÈ ±×·ì¿¡ ´ëÇØ ÀÌ¹Ì ¿­·Á ÀÖÀ¸¹Ç·Î AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥Àº ¿äûµÈ âÀ» Ç¥½ÃÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CHANGE_GROUP - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ì¿¡ ´ëÇÑ Æ¯¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_TRANSLATE_USER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ÁöÁ¤µÈ À̸§À¸·Î »ç¿ëÀÚ¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\nÀ̸§À» Á¦´ë·Î ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ." - IDS_ERROR_CANT_TRANSLATE_GROUP - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ÁöÁ¤µÈ À̸§À¸·Î »ç¿ëÀÚ¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\nÀ̸§À» Á¦´ë·Î ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ." - IDS_ERROR_CANT_GET_USERPROP - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚ¿¡ ´ëÇÑ Æ¯¼ºÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CHANGE_PASSWORD - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥Àº %1 »ç¿ëÀÚ¿¡ ´ëÇÑ ¾ÏÈ£¸¦ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_GET_RANDOM_KEY - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ÀÓÀÇÀÇ ¾Ïȣȭ ۸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SET_GROUPS - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚ¿¡ ÁöÁ¤µÈ ±×·ì ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚ¿¡ ´ëÇØ ÁöÁ¤µÈ ±×·ì ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_UNLOCK "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚÀÇ °èÁ¤À» Àá±ÝÇØÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚ¿¡ ´ëÇÑ °èÁ¤À» Àá±ÝÇØÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_SET_MEMBERS - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ì¿¡ ´ëÇÑ ±¸¼º¿ø ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ì¿¡ ´ëÇÑ ±¸¼º¿ø ¸ñ·ÏÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_RENAME_GROUP - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ìÀÇ À̸§À» ""%2""(À¸)·Î º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CHANGE_OWNER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ìÀÇ ¼ÒÀ¯ÀÚ¸¦ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ´ÙÀ½ %1 ±×·ìÀÇ ¼ÒÀ¯ÀÚ¸¦ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CHANGE_CELL - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ¼¿ÀÇ Æ¯¼ºÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_NO_PASSWORD_GIVEN - "ÀÛ¼º ÁßÀÎ »ç¿ëÀÚ °èÁ¤¿¡ ´ëÇÑ ¾ÏÈ£¸¦ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù." - IDS_ERROR_MISMATCH_PASSWORD_GIVEN - "»õ »ç¿ëÀÚ °èÁ¤¿¡ ´ëÇØ ÀÔ·ÂÇÑ ¾ÏÈ£°¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_USER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚ¿¡ ´ëÇÑ °èÁ¤À» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_CREATE_GROUP - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ìÀ» ÀÛ¼ºÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_USER - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 »ç¿ëÀÚÀÇ °èÁ¤À» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ´ÙÀ½ %1 »ç¿ëÀÚ¿¡ ´ëÇÑ °èÁ¤À» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_GROUP - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ %1 ±×·ìÀ» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ´ÙÀ½ %1 ±×·ìÀ» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "AFS Á¦¾î ¼¾ÅͰ¡ Á¦´ë·Î ¼³Ä¡µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¼ö ¾ø½À´Ï´Ù.\n\nAFS Á¦¾î ¼¾Å͸¦ ´Ù½Ã ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "¿À·ù - AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥" - IDS_CMDLINE_SYNTAX "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù." - IDS_CMDLINE_UNRECOGNIZED - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö¸¦ ÀνÄÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_CMDLINE_DUPLICATE "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö°¡ ÇÑ ¹ø ÀÌ»ó ÁöÁ¤µÇ¾ú½À´Ï´Ù." - IDS_CMDLINE_UNEXPECTVALUE - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö¿¡ °ªÀ» Á¦°øÇÏÁö ¸»¾Æ¾ß ÇÕ´Ï´Ù." - IDS_CMDLINE_MISSINGVAL "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n""%1"" ¸Å°³º¯¼ö ´ÙÀ½¿¡ °ªÀÌ ¿Í¾ß ÇÕ´Ï´Ù." - IDS_CMDLINE_USERPASSWORD - "AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥¿¡ ´ëÇØ ÁöÁ¤ÇÑ ¸í·ÉÇàÀÌ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.\n\n»õ AFS ÅäÅ«À» È®º¸ÇÏ·Á¸é, ""/USER"" ¹× ""/PASSWORD"" ¸Å°³º¯¼ö°¡ µÑ ´Ù ÁöÁ¤µÇ¾î¾ß ÇÕ´Ï´Ù." -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/pt_BR/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/pt_BR/AfsUsrMgr.rc deleted file mode 100644 index 03cc67bb9..000000000 --- a/src/WINNT/afsusrmgr/lang/pt_BR/AfsUsrMgr.rc +++ /dev/null @@ -1,1782 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "Gerenciador de Contas do AFS" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "Gerenciador de Contas do AFS" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,302,184 - LTEXT "Célula Selecionada:",IDC_STATIC,4,7,68,8 - LTEXT "(nenhuma selecionada)",IDC_CELL,74,7,206,8 - LTEXT "Tokens do AFS:",IDC_STATIC,4,18,55,8 - LTEXT "(nenhum token)",IDC_CREDS,74,18,205,8 - ICON IDI_MAIN,IDC_ANIM,285,7,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,41,13,ES_AUTOHSCROLL - RTEXT "Padrão:",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "Consultando: aguarde...",IDC_USERS_TITLE,4,6,142,8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Criar...",M_USER_CREATE,65,126,55,14 - PUSHBUTTON "&Membros...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&ropriedades...",M_PROPERTIES,183,126,55,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Padrão:",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "Consultando: aguarde...",IDC_GROUPS_TITLE,4,6,142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Criar...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "&Membros...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&ropriedades...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Operações em Andamento - Gerenciador de Contas do AFS" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Consultando: aguarde...",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Sobre o Gerenciador de Contas do AFS" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,21,20 - LTEXT "Gerenciador de Contas do AFS versão 3.5",IDC_STATIC,33, - 8,189,8 - LTEXT "Copyright © IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "&Fechar",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Pesquisar Código de Erro" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Número do &Erro:",IDC_STATIC,4,41,51,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "&Converter",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "&Fechar",IDCANCEL,85,123,48,14 - LTEXT "(texto definido no runtime)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "Para descobrir o que significa um código de erro, digite o código abaixo e clique no botão ""Converter"".", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Procurar Comando" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Exibir &Ajuda",IDOK,160,39,67,14 - PUSHBUTTON "&Cancelar",IDCANCEL,160,55,67,14 - LTEXT "Para descobrir como usar o Gerenciador de Contas do AFS para realizar uma tarefa, selecione uma linha de comando abaixo e clique no botão Exibir Ajuda.", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "Colunas" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Selecionar colunas a exibir ao listar:",IDC_STATIC,5,7, - 126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "Colunas &Disponíveis:",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Colunas a E&xibir:",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Incluir >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< &Remover",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "Mover para &Cima",IDC_COL_UP,151,122,58,14 - PUSHBUTTON "Mover para &Baixo",IDC_COL_DOWN,213,122,60,14 - GROUPBOX "Listar Colunas",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avançado" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Chave Atual:",IDC_STATIC,5,5,43,8 - LTEXT "Consultando: aguarde...",IDC_USER_KEY,52,5,173,20,0, - WS_EX_STATICEDGE - CONTROL "Esta é uma conta de &sistema (sem criptografia)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 35,160,10 - CONTROL "Usuário tem privilégios &administrativos", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 52,148,10 - CONTROL "&Conceder tickets; tempo de duração:",IDC_USER_TGS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,69,131,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 139,68,66,12 - CONTROL "&Quota de criação de grupos:",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,86,102,10 - EDITTEXT IDC_USER_GROUP_QUOTA,116,85,27,13,ES_AUTOHSCROLL - LTEXT "E&xibir status da conta:",IDC_STATIC,12,143,75,8 - COMBOBOX IDC_USER_PERM_STATUS,96,141,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar grupos &possuídos:",IDC_STATIC,12,159,79,8 - COMBOBOX IDC_USER_PERM_OWNED,96,157,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &membros do grupo:",IDC_STATIC,12,175,80,8 - COMBOBOX IDC_USER_PERM_MEMBER,96,173,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Permissões de Outras Contas",IDC_STATIC,5,109,220,82 - LTEXT "Estas definições especificam quais usuários podem exibir esta conta.", - IDC_STATIC,11,119,204,16 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Usuário pode &alterar a senha",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,43,103,10 - PUSHBUTTON "Al&terar a Senha",IDC_USER_CPW_NOW,144,41,73,14 - CONTROL "Usuário pode &reutilizar senhas antigas",IDC_USER_RPW, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,58,153,10 - CONTROL "Senha &vence após",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,74,79,10 - LTEXT "dias",IDC_STATIC,160,75,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,104,73,37,13,ES_AUTOHSCROLL - CONTROL "Conta &vence em:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,93,71,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,83, - 92,61,12 - LTEXT "à&s",IDC_USER_EXPIRE_AT,148,94,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 160,92,53,12 - CONTROL "&Bloquear conta após",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,8,137,78,10 - LTEXT "falhas consecutivas de logon",IDC_STATIC,131,138,92,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,89,136,27,13,ES_AUTOHSCROLL - CONTROL "Blo&quear conta indefinidamente (até ser desbloqueada pelo administrador)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,14,153,195,14 - CONTROL "Bloquear conta &por",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,14,172,80,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,96,171,56,12 - PUSHBUTTON "&Desbloquear",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "Falhas em Tentativas de Logon",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Usuário %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "Conta",IDC_STATIC,5,28,220,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 234, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "Grupo %1",IDC_GROUP_NAME,41,13,188,8 - LTEXT "Exibir &status da conta:",IDC_STATIC,12,108,82,8 - COMBOBOX IDC_GROUP_PERM_STATUS,103,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Exibir &grupos possuídos:",IDC_STATIC,12,124,85,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,103,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &membros do grupo:",IDC_STATIC,12,140,83,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,103,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Incluir membros:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,103,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Remover membros:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,103,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Permissões de Outras Contas",IDC_STATIC,5,78,224,114 - LTEXT "Estas definições especificam quais usuários podem exibir este grupo.", - IDC_STATIC,8,90,221,10 - LTEXT "Proprietário:",IDC_STATIC,5,31,39,8 - LTEXT "%1",IDC_GROUP_OWNER,45,31,104,8 - PUSHBUTTON "Alterar &Proprietário...",IDC_GROUP_CHANGEOWNER,155,29, - 74,14 - LTEXT "Criador:",IDC_STATIC,5,46,27,8 - LTEXT "%1",IDC_GROUP_CREATOR,45,46,113,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estas definições permitem alterar a lista dos grupos aos quais este usuário pertence, bem como a lista de grupos dos quais o usuário é proprietário.", - IDC_STATIC,5,5,220,26 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remover",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Incluir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar os grupos aos quais este usuário pertence", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar os grupos dos quais este usuário é proprietário", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando: aguarde...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Membros" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Membros do Grupo",IDC_STATIC,5,31,220,160 - LTEXT "Estas definições permitem escolher os membros deste grupo, bem como escolher os grupos dos quais este grupo deve ser proprietário.", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remover",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Incluir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar os membros deste grupo",IDC_GROUP_SHOW_MEMBER, - "Button",BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "M&ostrar os grupos dos quais este grupo é proprietário", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando: aguarde...)",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 297, 151 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Este título selecionado no runtime)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Selecionar",IDC_BROWSE_SELECT,240,112,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,240,130,50,14 - CONTROL "(texto especificado no runtime)",IDC_BROWSE_CHECK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,48,134,186,10 - RTEXT "Examinar na &célula:",IDC_STATIC,7,8,63,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,74,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Padrão:",IDC_GROUPS_PATTERN_PROMPT,215,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,249,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,283,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 295, 146 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Alterar Senha da Conta" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "&Selecionar automaticamente um número de versão para a nova senha", - IDC_CPW_VERSION_AUTO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,42,36,237,10 - CONTROL "&Usar versão da chave:",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,42,52,84,10 - EDITTEXT IDC_CPW_VERSION,132,51,43,14,ES_AUTOHSCROLL - CONTROL "Criptografar esta cadeia:",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,42,78,88,10 - CONTROL "Usar esta chave:",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,42,95,68,10 - EDITTEXT IDC_CPW_STRING,133,76,155,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,119,94,103,14,ES_AUTOHSCROLL - PUSHBUTTON "&Aleatória",IDC_CPW_RANDOM,240,94,48,14 - DEFPUSHBUTTON "OK",IDOK,116,125,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,170,125,50,14 - PUSHBUTTON "Ajuda",9,238,125,50,14 - LTEXT "Nova senha para o usuário %1",IDC_CPW_TITLE,57,14,231,8 - ICON IDI_USER,-1,7,6,21,20 - LTEXT "Versão:",-1,7,37,26,8 - LTEXT "Valor:",-1,7,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Renomear Grupo" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Novo &nome do grupo:",IDC_STATIC,35,103,69,8 - EDITTEXT IDC_RENAME_NEWNAME,109,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,109,129,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,163,129,50,14 - PUSHBUTTON "Ajuda",9,217,129,50,14 - LTEXT "Proprietário Atual:",IDC_STATIC,35,65,59,8 - PUSHBUTTON "&Alterar Proprietário...",IDC_RENAME_CHOWN,197,63,70,14 - LTEXT "Nome atual do grupo:",IDC_STATIC,35,83,70,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "Renomear grupo %1",IDC_RENAME_TITLE,35,14,222,8 - LTEXT "Nota: A menos que o nome do grupo esteja sem prefixo, o nome deve refletir com precisão o proprietário atual do grupo (ou seja, ""proprietário:nome_do_grupo"").", - IDC_STATIC,35,29,231,24 - LTEXT "(consultando)",IDC_RENAME_OWNER,109,65,82,8 - LTEXT "(consultando)",IDC_RENAME_OLDNAME,109,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 294, 154 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Este título selecionado no runtime)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Selecionar",IDC_BROWSE_SELECT,237,113,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,237,133,50,14 - RTEXT "Mostrar:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Examinar na &célula:",IDC_STATIC,7,8,65,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,75,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Padrão:",IDC_GROUPS_PATTERN_PROMPT,215,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,246,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,280,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 299, 170 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(Este título selecionado no runtime)" -CLASS "AFSAccountManagerClass" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "(runtime)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "&Selecionar",IDC_BROWSE_SELECT,242,113,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,242,132,50,14 - RTEXT "Mostrar:",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(texto especificado no runtime)",IDC_BROWSE_CHECK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,49,151,184,10 - RTEXT "Examinar na &célula:",IDC_STATIC,7,8,63,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,74,6,140,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "Padrão:",IDC_GROUPS_PATTERN_PROMPT,218,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,251,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,285,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estas definições permitem alterar a lista inicial dos grupos aos quais este usuário irá pertencer, bem como os grupos dos quais o usuário será proprietário.", - IDC_STATIC,5,5,220,24 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remover",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Incluir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar os grupos aos quais este usuário pertencerá", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,11,45, - 195,10 - CONTROL "M&ostrar os grupos dos quais este usuário será proprietário", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,11,58, - 207,10 - LTEXT "(Consultando: aguarde...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 259, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Criar Usuário" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Nome:",IDC_STATIC,7,37,22,8 - EDITTEXT IDC_NEWUSER_NAME,57,35,127,14,ES_AUTOHSCROLL - LTEXT "&Senha:",IDC_STATIC,7,57,34,8 - EDITTEXT IDC_NEWUSER_PW1,57,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "(confirmação:)",IDC_STATIC,7,77,48,8 - EDITTEXT IDC_NEWUSER_PW2,57,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "Usar automaticamente a &próxima ID de usuário disponível", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,56,97, - 196,10 - CONTROL "&Usar uma ID de usuário específica:", - IDC_NEWUSER_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,56,113, - 126,10 - EDITTEXT IDC_NEWUSER_ID,188,112,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Grupos...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "OK",IDOK,94,149,43,14 - PUSHBUTTON "Cancelar",IDCANCEL,141,149,43,14 - PUSHBUTTON "Ajuda",9,209,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "Novo usuário na célula %1",IDC_NEWUSER_TITLE,67,14,185, - 8 - LTEXT "ID de Usuário:",IDC_STATIC,7,97,46,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "Novo grupo na célula %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "Exibir &status da conta:",IDC_STATIC,12,108,76,8 - COMBOBOX IDC_GROUP_PERM_STATUS,97,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Exibir &grupos possuídos:",IDC_STATIC,12,124,79,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,97,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &membros do grupo:",IDC_STATIC,12,140,80,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,97,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Incluir membros:",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,97,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Remover membros:",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,97,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Permissões de Outras Contas",IDC_STATIC,5,68,220,123 - LTEXT "Estas definições especificam quais usuários podem exibir informações sobre este grupo.", - IDC_STATIC,11,83,204,17 - LTEXT "Proprietário:",IDC_STATIC,5,35,38,8 - LTEXT "%1",IDC_GROUP_OWNER,48,35,103,8 - PUSHBUTTON "Alterar &Proprietário...",IDC_GROUP_CHANGEOWNER,157,33, - 68,14 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Membros" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Membros do Grupo",IDC_STATIC,5,31,220,160 - LTEXT "Estas definições permitem escolher os membros iniciais deste grupo, bem como escolher os grupos dos quais este grupo deve ser proprietário.", - IDC_STATIC,5,5,220,25 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remover",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Incluir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar os membros iniciais deste grupo", - IDC_GROUP_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar os grupos dos quais este grupo é proprietário", - IDC_GROUP_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando: aguarde...)",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 252, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Criar Grupo" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Nome:",-1,7,37,22,8 - EDITTEXT IDC_NEWGROUP_NAME,50,35,127,14,ES_AUTOHSCROLL - CONTROL "Usar a&utomaticamente a próxima ID de grupo disponível", - IDC_NEWGROUP_ID_AUTO,"Button",BS_AUTORADIOBUTTON,51,60, - 191,10 - CONTROL "U&sar uma ID de grupo específica:", - IDC_NEWGROUP_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,51,75, - 123,10 - EDITTEXT IDC_NEWGROUP_ID,176,74,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Membros...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "OK",IDOK,105,114,43,14 - PUSHBUTTON "Cancelar",IDCANCEL,153,114,43,14 - PUSHBUTTON "Ajuda",9,201,114,43,14 - ICON IDI_USER,-1,7,6,21,20 - LTEXT "Novo grupo na célula %1",IDC_NEWGROUP_TITLE,60,14,185,8 - LTEXT "ID do Grupo:",-1,7,60,43,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Excluir Usuário" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,116,93,50,14 - DEFPUSHBUTTON "Cancelar",IDCANCEL,170,93,50,14 - PUSHBUTTON "Ajuda",9,224,93,50,14 - LTEXT "Atenção!\n\nEsta operação excluirá permanentemente a conta para o usuário %1.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,20,20 - CONTROL "Excluir a entrada no banco de dados &KAS para esta conta", - IDC_DELETE_KAS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 53,203,10 - CONTROL "Excluir a entrada no banco de dados &PTS para esta conta", - IDC_DELETE_PTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57, - 69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Excluir Grupo" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,116,61,50,14 - DEFPUSHBUTTON "Cancelar",IDCANCEL,170,61,50,14 - PUSHBUTTON "Ajuda",9,224,61,50,14 - LTEXT "Atenção!\n\nEsta operação excluirá permanentemente o grupo %1.", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Identificador máximo de &usuário:",IDC_STATIC,11,87,102, - 8 - EDITTEXT IDC_CELL_USERMAX,117,85,40,14,ES_AUTOHSCROLL - LTEXT "Identificador máximo de &grupo:",IDC_STATIC,11,105,100, - 8 - EDITTEXT IDC_CELL_GROUPMAX,117,103,40,14,ES_AUTOHSCROLL - GROUPBOX "Identificadores de Usuário e de Grupo",IDC_STATIC,5,31, - 220,97 - LTEXT "Estas definições refletem os maiores identificadores de usuário e de grupo já usados. É seguro aumentar esses valores: contudo, eles não devem ser diminuídos a menos que se esteja certo de que os novos valores não causarão conflitos com contas existentes.", - IDC_STATIC,9,42,210,39 - ICON IDI_CELL,IDC_STATIC,5,5,20,20 - LTEXT "Célula %1",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Usuário pode &alterar a senha",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,41,103,10 - PUSHBUTTON "Al&terar a Senha",IDC_USER_CPW_NOW,144,39,73,14 - CONTROL "Usuário pode &reutilizar senhas antigas",IDC_USER_RPW, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,56,141,10 - CONTROL "Senha &vence após",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,72,87,10 - LTEXT "dias",IDC_STATIC,168,73,16,8 - EDITTEXT IDC_USER_PWEXPIRATION,115,71,37,13,ES_AUTOHSCROLL - CONTROL "Conta vence &em:",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,91,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 90,61,12 - LTEXT "à&s",IDC_USER_EXPIRE_AT,155,92,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,90,53,12 - CONTROL "&Bloquear conta após",IDC_USER_FAILLOCK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,9,128,80,10 - LTEXT "falhas consecutivas de logon",IDC_STATIC,129,129,93,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,90,127,23,13,ES_AUTOHSCROLL - CONTROL "Blo&quear conta indefinidamente (até ser desbloqueada pelo administrador)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,10,145,195,17 - CONTROL "Bloquear conta &por",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,10,166,82,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,97,165,56,12 - PUSHBUTTON "&Desbloquear",IDC_USER_UNLOCK,170,163,50,14 - GROUPBOX "Tentativas Falhas de Logon",IDC_STATIC,5,114,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Novo usuário na célula %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "Conta",IDC_STATIC,5,29,220,79 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avançado" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Criar uma entrada no banco de dados &KAS para esta conta (recomendado)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,5,6,210,17 - CONTROL "Criar uma entrada no banco de dados &PTS para esta conta (recomendado)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - BS_MULTILINE | WS_TABSTOP,5,24,210,16 - CONTROL "Esta será uma conta de &sistema (sem criptografia)", - IDC_USER_NOSEAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 45,176,10 - CONTROL "O usuário terá privilégios &administrativos", - IDC_USER_ADMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, - 62,144,10 - CONTROL "&Conceder tickets; tempo de duração:",IDC_USER_TGS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,79,132,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 139,78,66,12 - CONTROL "&Quota de criação de grupos:",IDC_USER_GROUP_HASQUOTA, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,96,102,10 - EDITTEXT IDC_USER_GROUP_QUOTA,109,95,27,13,ES_AUTOHSCROLL - LTEXT "E&xibir status da conta:",-1,12,141,74,8 - COMBOBOX IDC_USER_PERM_STATUS,97,139,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &grupos possuídos:",-1,12,157,80,8 - COMBOBOX IDC_USER_PERM_OWNED,97,155,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &membros do grupo:",-1,12,173,81,8 - COMBOBOX IDC_USER_PERM_MEMBER,97,171,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Permissões de Outras Contas",-1,5,111,220,80 - LTEXT "Estas definições especificam quais usuários podem exibir esta conta.", - -1,11,120,204,16 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "Padrão:",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "Consultando: aguarde...",IDC_MACHINES_TITLE,4,6,142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "&Criar...",M_MACHINE_CREATE,65,126,55,14 - PUSHBUTTON "&Membros...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "P&ropriedades...",M_PROPERTIES,183,126,55,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estas definições permitem alterar a lista inicial dos grupos aos quais esta conta irá pertencer, bem como os grupos dos quais a conta será proprietária.", - IDC_STATIC,5,5,220,25,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remover",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Incluir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar os grupos aos quais esta conta pertencerá", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar os grupos dos quais esta conta será proprietária", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 206,10 - LTEXT "(Consultando: aguarde...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 234, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avançado" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Exibir &status da conta:",IDC_STATIC,12,88,73,8 - COMBOBOX IDC_USER_PERM_STATUS,98,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar grupos &possuídos:",IDC_STATIC,12,104,79,8 - COMBOBOX IDC_USER_PERM_OWNED,98,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &membros do grupo:",IDC_STATIC,12,120,81,8 - COMBOBOX IDC_USER_PERM_MEMBER,98,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Permissões de Outras Contas",IDC_STATIC,5,57,224,82 - LTEXT "Estas definições especificam quais usuários podem exibir esta conta.", - IDC_STATIC,9,72,220,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "Nova conta de endereço IP na célula %1",IDC_USER_NAME, - 41,13,188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 254, 127 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Criar Conta de Endereço IP" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "&Endereço IP:",-1,7,37,43,8 - EDITTEXT IDC_NEWUSER_NAME,56,35,127,14,ES_AUTOHSCROLL - CONTROL "Usar a&utomaticamente a próxima ID de conta disponível", - IDC_NEWUSER_ID_AUTO,"Button",BS_AUTORADIOBUTTON,56,60, - 191,10 - CONTROL "U&sar uma ID de conta específica:", - IDC_NEWUSER_ID_MANUAL,"Button",BS_AUTORADIOBUTTON,56,76, - 120,10 - EDITTEXT IDC_NEWUSER_ID,180,75,39,14,ES_AUTOHSCROLL - PUSHBUTTON "&Grupos...",IDC_ADVANCED,7,106,54,14 - DEFPUSHBUTTON "OK",IDOK,107,106,43,14 - PUSHBUTTON "Cancelar",IDCANCEL,155,106,43,14 - PUSHBUTTON "Ajuda",9,203,106,43,14 - ICON IDI_SERVER,-1,7,6,20,20 - LTEXT "Nova conta de endereço IP na célula %1", - IDC_NEWUSER_TITLE,57,14,190,8 - LTEXT "ID da Conta:",-1,7,60,44,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Excluir Conta de Endereço IP" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "OK",IDOK,153,63,50,14 - DEFPUSHBUTTON "Cancelar",IDCANCEL,207,63,50,14 - PUSHBUTTON "Ajuda",9,261,63,50,14 - LTEXT "Atenção!\n\nEsta operação excluirá permanentemente a conta de endereço IP %1.", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 237, 197 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Avançado" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Exibir &status da conta:",IDC_STATIC,12,89,73,8 - COMBOBOX IDC_USER_PERM_STATUS,103,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar grupos &possuídos:",IDC_STATIC,12,105,83,8 - COMBOBOX IDC_USER_PERM_OWNED,103,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Listar &membros do grupo:",IDC_STATIC,12,121,85,8 - COMBOBOX IDC_USER_PERM_MEMBER,103,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Permissões de Outras Contas",IDC_STATIC,5,57,227,82 - LTEXT "Estas definições especificam quais usuários podem exibir esta conta.", - IDC_STATIC,11,70,221,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "Conta de endereço IP %1",IDC_USER_NAME,44,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Grupos" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Grupos",IDC_STATIC,5,31,220,160 - LTEXT "Estas definições permitem alterar a lista dos grupos aos quais esta conta pertence, bem como a lista de grupos dos quais a conta é proprietária.", - IDC_STATIC,5,5,220,24,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "&Remover",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "&Incluir...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "&Mostrar os grupos aos quais esta conta pertence", - IDC_USER_SHOW_MEMBER,"Button",BS_AUTORADIOBUTTON,12,45, - 195,10 - CONTROL "M&ostrar os grupos dos quais esta conta é proprietária", - IDC_USER_SHOW_OWNER,"Button",BS_AUTORADIOBUTTON,12,58, - 195,10 - LTEXT "(Consultando: aguarde...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 235, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Opções" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Usar expressões regulares ao estilo &Unix (""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,213,10 - CONTROL "Usar expressões regulares ao estilo &Windows (""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,209, - 10 - CONTROL "Exibir um aviso ao trabalhar sem tokens administrativos", - IDC_WARN_BADCREDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,116,209,10 - CONTROL "&Atualizar automaticamente as informações a cada", - IDC_REFRESH,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | - WS_TABSTOP,11,134,113,17 - LTEXT "minutos",IDC_STATIC,184,135,25,8 - EDITTEXT IDC_REFRESH_RATE,129,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,20,20 - LTEXT "Opções do Gerenciador de Contas do AFS",IDC_STATIC,37, - 12,139,8 - GROUPBOX "Expressões Regulares",IDC_STATIC,5,37,225,57 - GROUPBOX "Geral",IDC_STATIC,5,100,225,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 276, 130 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Selecione Usuários a Exibir" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "Mostrar entradas para &todas as contas de usuários", - IDC_SEARCH_ALL,"Button",BS_AUTORADIOBUTTON,11,40,175,10 - CONTROL "Mostrar somente as contas de usuários que &vencem antes de", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,11,55,177,16 - CONTROL "Mostrar somente as contas de usuários cujas &senhas vencem antes de", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON | - BS_MULTILINE,11,74,177,16 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 197,57,61,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,197,76,61,12 - DEFPUSHBUTTON "OK",IDOK,109,108,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,164,108,50,14 - PUSHBUTTON "Ajuda",9,219,108,50,14 - LTEXT "Estes controles permitem especificar quais usuários devem ser mostrados na guia Usuários. Pode-se restringir ainda mais a lista digitando um nome parcial de conta no controle Padrão na guia Usuários.", - IDC_STATIC,7,6,262,25 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 229 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 6 - BOTTOMMARGIN, 144 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 288 - TOPMARGIN, 6 - BOTTOMMARGIN, 139 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 287 - TOPMARGIN, 6 - BOTTOMMARGIN, 147 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 252 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 245 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 229 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 247 - TOPMARGIN, 6 - BOTTOMMARGIN, 120 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 232 - TOPMARGIN, 5 - BOTTOMMARGIN, 192 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 230 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 269 - TOPMARGIN, 6 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""Gerenciador de Contas do AFS""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "&Célula" - BEGIN - MENUITEM "&Selecionar...", M_OPENCELL - MENUITEM "&Autenticação...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "&Propriedades da Célula...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "Sai&r", M_EXIT - END - POPUP "&Editar" - BEGIN - MENUITEM "Criar &Usuário...", M_USER_CREATE - MENUITEM "Criar &Grupo...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Re&nomear...", M_RENAME - MENUITEM "E&xcluir...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "Selecionar &Tudo\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "Atuali&zar\tF5", M_REFRESH - MENUITEM "&Membros...\tCtrl+M", M_MEMBERSHIP - MENUITEM "&Propriedades\tAlt+Enter", M_PROPERTIES - END - POPUP "E&xibir" - BEGIN - POPUP "Íco&nes" - BEGIN - MENUITEM "Ícones &Grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Ícones &Pequenos", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalhes", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWO, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "O&perações em Andamento", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Colunas...", M_COLUMNS - MENUITEM "&Opções...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL - END - POPUP "&Ajuda" - BEGIN - MENUITEM "&Conteúdo", M_CONTENTS - MENUITEM "&Procurar Comando...", M_FIND - MENUITEM "Pes&quisar Código de Erro...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "&Sobre o Gerenciador de Contas do AFS...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "Ícones &Grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Ícones &Pequenos", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalhes", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWO, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Criar Usuário...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "Ícones &Grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Ícones &Pequenos", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalhes", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWO, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Criar Grupo...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "&Grupos...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "Alterar &Senha...", M_CPW - MENUITEM "&Desbloquear", M_UNLOCK - MENUITEM "E&xcluir...", M_DELETE - MENUITEM "A&tualizar", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "&Propriedades...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "&Membros do Grupo...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "&Renomear...", M_RENAME - MENUITEM "E&xcluir...", M_DELETE - MENUITEM "A&tualizar", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "&Propriedades...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "&Colunas...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "E&xibir" - BEGIN - MENUITEM "Ícones &Grandes", M_VIEW_LARGE, CHECKED - MENUITEM "Ícones &Pequenos", M_VIEW_SMALL, CHECKED - MENUITEM "&Detalhes", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Normal", M_VIEW_ONE, CHECKED - MENUITEM "&Todos os Ícones", M_VIEW_TWO, CHECKED - MENUITEM "&Somente Status", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "&Criar Conta...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "A&tualizar Tudo", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "&Grupos...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "E&xcluir...", M_DELETE - MENUITEM "A&tualizar", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "P&ropriedades...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "Gerenciador de Contas do AFS" - IDS_USRCOL_NAME "Nome do Usuário" - IDS_GRPCOL_NAME "Nome do Grupo" - IDS_BADCREDS_DESC "A menos que tenha efetuado logon como administrador, você pode ter privilégios insuficientes para administrar com êxito a célula %1." - IDS_TAB_USERS "Usuários" - IDS_TAB_GROUPS "Grupos" - IDS_CELL_NONE "(nenhuma célula selecionada)" - IDS_CRED_NONE "(nenhum token nesta célula)" - IDS_CRED_EXP "%1 (tokens vencidos em %2)" - IDS_CRED_OK "%1 (tokens irão vencer em %2)" - IDS_USERS_ALL "Todos os usuários na célula %1:" - IDS_USERS_PATTERN "Usuários selecionados na célula %1:" - IDS_GROUPS_ALL "Todos os grupos na célula %1:" - IDS_GROUPS_PATTERN "Grupos selecionados na célula %1:" - IDS_QUERYING_LONG "Consultando: aguarde..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "Não há operações em andamento." - IDS_ACTION_DESC_ONE "A seguinte operação está em andamento:" - IDS_ACTION_DESC_MULT "As seguintes operações estão em andamento:" - IDS_ACTCOL_OPERATION "Operação" - IDS_ACTCOL_ELAPSED "Tempo Decorrido" - IDS_ACTION_REFRESH_CELL "Atualizando informações para a célula %1" - IDS_ACTION_REFRESH_SERVER "Atualizando informações para o servidor %1" - IDS_ACTION_SCOUT_CELL "Testando a célula %1 para problemas" - IDS_ACTION_SCOUT_SERVER "Testando o servidor %1 para problemas" - IDS_FIND_NOTHING_TITLE "Nenhum Comando Selecionado" - IDS_FIND_NOTHING_DESC "Para descobrir como realizar uma operação, selecione primeiro uma linha de comando na lista ou digite uma palavra-chave." - IDS_FIND_UNKNOWN_TITLE "Comando Desconhecido" - IDS_FIND_UNKNOWN_DESC "O Gerenciador de Contas do AFS não encontrou nenhum tópico de ajuda para o comando ""%1""." - IDS_HELPABOUT_DESC1 "Aviso: este programa de computador é protegido por direitos autorais e por tratados internacionais. +" - IDS_HELPABOUT_DESC2 "A reprodução ou distribuição não autorizadas neste software pode resultar em pesadas penalidades civis e criminais, e será processada até o máximo possível permitido por lei.\n\n+" - IDS_HELPABOUT_DESC3 "AFS é uma marca da Transarc Corporation, uma empresa IBM." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "Colunas - Gerenciador de Contas do AFS" - IDS_USER_PROPERTIES_TITLE_MULTIPLE " Múltiplos Usuários - Propriedades" - IDS_USER_PROPERTIES_TITLE "Usuário %1 - Propriedades" - IDS_USER_NAME_MULTIPLE "Usuários " - IDS_ACCOUNTACCESS_OWNER "Somente proprietário da conta" - IDS_ACCOUNTACCESS_GROUP "Somente membros do grupo" - IDS_ACCOUNTACCESS_ANYONE "Qualquer um" - IDS_ACCOUNTACCESS_MIXED "(definições múltiplas" - IDS_USER_KEY "%1\nVersão %2, Soma de Verificação %3" - IDS_USER_KEY_HIDDEN "(valor real da chave oculto)" - IDS_USER_KEY_UNKNOWN "(desconhecida)" - IDS_USER_KEY_MULTIPLE "(múltiplas chaves)" - IDS_ACTION_USER_CHANGE "Alterando propriedades para o usuário %1" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE " Múltiplos Grupos - Propriedades" - IDS_GROUP_PROPERTIES_TITLE "Grupo %1 - Propriedades" - IDS_GROUP_NAME_MULTIPLE "Grupos" - IDS_ACCOUNTACCESS_OWNGROUP "Somente proprietário do grupo" - IDS_OWNER_MIXED "Múltiplos Proprietários" - IDS_CREATOR_MIXED "Múltiplos Criadores" - IDS_GROUP_CHANGEOWNER_TITLE "Alterar Proprietário do Grupo" - IDS_GROUP_CHANGEOWNER_PROMPT " Proprietário:" - IDS_MEMBER_MIXED " (Alguns)" - IDS_USER_SHOW_MEMBER_TITLE - "Todos os grupos aos quais este usuário pertence:" - IDS_USER_SHOW_OWNER_TITLE - "Todos os grupos dos quais este usuário é proprietário:" - IDS_GROUP_SHOW_MEMBER_TITLE "Todos os membros deste grupo:" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE - "Todos os grupos aos quais estes usuários pertencem:" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE " Todos os membros destes grupos:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "Renomeando o grupo %1 para %2" - IDS_RENAME_TITLE "Renomear grupo %1" - IDS_GROUP_TITLE "Grupo %1" - IDS_SHOW_USERS "Todos os usuários nesta célula" - IDS_SHOW_GROUPS "Todos os grupos nesta célula" - IDS_GROUP_SHOW_OWNED_TITLE - "Todos os grupos dos quais este grupo é proprietário:" - IDS_BROWSE_TITLE_OWNED "Selecionar Grupos Para Possuir" - IDS_BROWSE_PROMPT_OWNED "Grupos:" - IDS_BROWSE_CHECK_OWNED "Mostrar somente grupos não possuídos atualmente" - IDS_NEWUSER_PROPERTIES_TITLE "Criar Usuário - Avançado" - IDS_NEWUSER_SHOW_MEMBER_TITLE - "Todos os grupos aos quais este usuário pertencerá:" - IDS_NEWUSER_SHOW_OWNER_TITLE - "Todos os grupos dos quais este usuário será proprietário:" - IDS_ACTION_CELL_CHANGE "Alterando propriedades para a célula %1" - IDS_ACTION_USER_CREATE "Criando conta para o usuário %1" - IDS_NEWGROUP_PROPERTIES_TITLE "Criar Grupo - Avançado" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "Membros iniciais deste novo grupo:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "Sinalizadores" - IDS_USRCOL_ADMIN "Admin?" - IDS_USRCOL_TICKET "Tickets?" - IDS_USRCOL_SYSTEM "Sistema?" - IDS_USRCOL_CHANGEPW "Alterar Senha?" - IDS_USRCOL_REUSEPW "Reutilizar Senhas?" - IDS_USRCOL_EXPIRES "Vencimento da Conta" - IDS_USRCOL_LASTPW "Última Alteração de Senha" - IDS_USRCOL_LASTMOD "Modificado por Último" - IDS_USRCOL_LASTMODBY "Última Modificação Por" - IDS_USRCOL_LIFETIME "Tempo de Operação do Ticket" - IDS_USRCOL_CDAYPW "Vencimento da Senha" - IDS_USRCOL_CFAILLOGIN "Falhas de Logon" - IDS_USRCOL_CSECLOCK "Tempo de Bloqueio por Falha de Logon" - IDS_USRCOL_CGROUPMAX "Quota de Criação de Grupos" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "Proprietário" - IDS_USRCOL_CREATOR "Criador" - IDS_USRCOL_STATUS "Status" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "Sim" - IDS_NO "Não" - IDS_GRPCOL_CMEMBERS "Contagem de Membros" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "Proprietário" - IDS_GRPCOL_CREATOR "Criador" - IDS_COL_USERS "Usuários em uma Célula" - IDS_COL_GROUPS "Grupos em uma Célula" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE - "Grupos dos quais este novo grupo será proprietário:" - IDS_USER_DELETE_MULTIPLE - "Atenção!\n\nEsta operação excluirá permanentemente as contas para os seguintes usuários: %1" - IDS_GROUP_DELETE_MULTIPLE - "Atenção!\n\nEsta operação excluirá permanentemente os seguintes grupos: %1." - IDS_ACTION_GROUP_CREATE "Criando grupo %1" - IDS_ACTION_USER_DELETE "Excluindo conta para o usuário %1" - IDS_ACTION_GROUP_DELETE "Excluindo grupo %1" - IDS_CELL_PROPERTIES_TITLE "Célula %1 - Propriedades" - IDS_MACHINES_ALL "Todas as contas de endereço IP na célula %1:" - IDS_MACHINES_PATTERN "Contas de endereço IP selecionadas na célula %1:" - IDS_TAB_MACHINES "Endereços" - IDS_MACHINE_DELETE_MULTIPLE - "Atenção!\n\nEsta operação excluirá permanentemente as seguintes contas de endereço IP: %1" - IDS_NEWMACHINE_PROPERTIES_TITLE "Criar Conta de Endereço IP - Avançado" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE - "Múltiplas Contas de Endereço IP - Propriedades" - IDS_MACHINE_PROPERTIES_TITLE "Conta de endereço IP %1 - Propriedades" - IDS_COL_MACHINES "Contas de Endereço IP em uma Célula" - IDS_MCHCOL_NAME "Endereço IP" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "Selecionar Grupos a Integrar" - IDS_BROWSE_PROMPT_JOIN "Grupos:" - IDS_BROWSE_CHECK_JOIN "Mostrar somente grupos não integrados atualmente" - IDS_BROWSE_TITLE_OWN "Selecionar Grupos a Possuir" - IDS_BROWSE_PROMPT_OWN "Grupos:" - IDS_BROWSE_CHECK_OWN "Mostrar somente grupos não possuídos atualmente" - IDS_BROWSE_TITLE_MEMBER "Selecione Usuários a Integrar" - IDS_BROWSE_PROMPT_MEMBER "Usuários:" - IDS_BROWSE_CHECK_MEMBER "Mostrar somente usuários que não são membros" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "alternado propriedades para o grupo %1" - IDS_ACTION_GROUP_MEMBER_ADD "Incluindo o usuário %2 no grupo %1" - IDS_ACTION_GROUP_MEMBER_REMOVE "Removendo o usuário %2 do grupo %1" - IDS_ACTION_USER_PW_CHANGE "Definindo senha para o usuário %1" - IDS_UNKNOWN_NAME "(desconhecido)" - IDS_ACTION_USER_UNLOCK "Desbloqueando conta para o usuário %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "Quota de Criação de Grupos" - IDS_MCHCOL_UID "ID da Conta" - IDS_MCHCOL_OWNER "Proprietário" - IDS_MCHCOL_CREATOR "Criador" - IDS_OPTIONS_TITLE "Opções do Gerenciador de Contas do AFS" - IDS_WARNING_TITLE "Atenção" - IDS_WARNING_SYSTEM_ACCOUNT - "Deve-se tomar cuidado ao fazer alterações à conta %1, pois alterações inadequadas podem fazer com que certos recursos do AFS deixem de funcionar corretamente.\n\nTem certeza de que deseja prosseguir?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE - "Todos os grupos aos quais esta conta pertence:" - IDS_MACHINE_SHOW_OWNER_TITLE - "Todos os grupos dos quais esta conta é proprietária:" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE - "Todos os grupos aos quais estas contas pertencem:" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE - "Todos os grupos aos quais esta conta pertencerá:" - IDS_NEWMACHINE_SHOW_OWNER_TITLE - "Todos os grupos dos quais esta conta será proprietária:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "O Gerenciador de Contas do AFS não conseguiu contactar um processo de administração em execução no computador %1.\n\nPode-se realizar tarefas administrativas remotamente executando o programa TaAfsAdmSvr.exe no outro computador." - IDS_ERROR_BAD_LOCAL_SERVER - "O Gerenciador de Contas do AFS não conseguiu encontrar o programa TaAfsAdmSvr.exe, ou não pôde preparar seu computador para realizar a administração do AFS." - IDS_ERROR_CANT_OPEN_CELL - "O Gerenciador de Contas do AFS não conseguiu contactar nenhum servidor na célula %1.\n\nCertifique-se de ter digitado corretamente o nome da célula." - IDS_ERROR_BADCREDENTIALS - "A identificação do AFS informada não é reconhecida, ou a senha especificada está incorreta." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "Erro número 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "Erro número 0x%1 (%2) não é reconhecido." - IDS_ERROR_USER_MULTIPROP - "O Gerenciador de Contas do AFS não pode exibir a janela pedida porque já há uma janela de propriedades aberta para um ou mais dos usuários selecionados." - IDS_ERROR_CANT_CHANGE_USER - "O Gerenciador de Contas do AFS não conseguiu alterar as propriedades para o usuário %1." - IDS_ERROR_GROUP_MULTIPROP - "O Gerenciador de Contas do AFS não pode exibir a janela pedida porque já há uma janela de propriedades aberta para um ou mais dos grupos selecionados." - IDS_ERROR_CANT_CHANGE_GROUP - "O Gerenciador de Contas do AFS não conseguiu alterar as propriedades para o grupo %1." - IDS_ERROR_CANT_TRANSLATE_USER - "O Gerenciador de Contas do AFS não conseguiu encontrar um usuário pelo nome especificado.\n\nCertifique-se de que digitou o nome corretamente." - IDS_ERROR_CANT_TRANSLATE_GROUP - "O Gerenciador de Contas do AFS não conseguiu encontrar um usuário pelo nome especificado.\n\nCertifique-se de que digitou o nome corretamente." - IDS_ERROR_CANT_GET_USERPROP - "O Gerenciador de Contas do AFS não conseguiu encontrar propriedades para o usuário %1." - IDS_ERROR_CANT_CHANGE_PASSWORD - "O Gerenciador de Contas do AFS não conseguiu alterar a senha para o usuário %1." - IDS_ERROR_CANT_GET_RANDOM_KEY - "O Gerenciador de Contas do AFS não conseguiu gerar uma chave de criptografia aleatória." - IDS_ERROR_CANT_SET_GROUPS - "O Gerenciador de Contas do AFS não conseguiu alterar a lista de grupos especificada para o usuário %1." - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "O Gerenciador de Contas do AFS não conseguiu alterar a lista de grupos especificada para os seguintes usuários: %1." - IDS_ERROR_CANT_UNLOCK "O Gerenciador de Contas do AFS não conseguiu desbloquear a conta do usuário %1." - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "O Gerenciador de Contas do AFS não conseguiu desbloquear as contas para os seguintes usuários: %1." - IDS_ERROR_CANT_SET_MEMBERS - "O Gerenciador de Contas do AFS não conseguiu alterar a lista de membros para o grupo %1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "O Gerenciador de Contas do AFS não conseguiu alterar as listas de membros para os seguintes grupos: %1." - IDS_ERROR_CANT_RENAME_GROUP - "O Gerenciador de Contas do AFS não conseguiu renomear o grupo %1 para ""%2""." - IDS_ERROR_CANT_CHANGE_OWNER - "O Gerenciador de Contas do AFS não conseguiu alterar o proprietário do grupo %1." - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "O Gerenciador de Contas do AFS não conseguiu alterar os proprietários dos seguintes grupos: %1." - IDS_ERROR_CANT_CHANGE_CELL - "O Gerenciador de Contas do AFS não conseguiu alterar as propriedades da célula %1." - IDS_ERROR_NO_PASSWORD_GIVEN - "É preciso especificar uma senha para a conta de usuário que está sendo criada." - IDS_ERROR_MISMATCH_PASSWORD_GIVEN - "As senhas digitadas para a nova conta de usuário não correspondem." - IDS_ERROR_CANT_CREATE_USER - "O Gerenciador de Contas do AFS não conseguiu criar uma conta para o usuário %1." - IDS_ERROR_CANT_CREATE_GROUP - "O Gerenciador de Contas do AFS não conseguiu criar o grupo %1." - IDS_ERROR_CANT_DELETE_USER - "O Gerenciador de Contas do AFS não conseguiu excluir a conta para o usuário %1." - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "O Gerenciador de Contas do AFS não conseguiu excluir as contas para os seguintes usuários: %1." - IDS_ERROR_CANT_DELETE_GROUP - "O Gerenciador de Contas do AFS não conseguiu excluir o grupo %1." - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "O Gerenciador de Contas do AFS não conseguiu excluir os seguintes grupos: %1." - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "O Gerenciador de Contas do AFS não conseguiu iniciar porque o Centro de Controle AFS não estava instalado corretamente.\n\nPode ser necessário reinstalar o Centro de Controle AFS." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "Erro - Gerenciador de Contas do AFS" - IDS_CMDLINE_SYNTAX "A linha de comando especificada para o Gerenciador de Contas do AFS é inválida." - IDS_CMDLINE_UNRECOGNIZED - "A linha de comando especificada para o Gerenciador de Contas do AFS é inválida.\n\nO parâmetro ""%1"" não é reconhecido." - IDS_CMDLINE_DUPLICATE "A linha de comando especificada para o Gerenciador de Contas do AFS é inválida.\n\nO parâmetro ""%1"" está especificado mais de uma vez." - IDS_CMDLINE_UNEXPECTVALUE - "A linha de comando especificada para o Gerenciador de Contas do AFS é inválida.\n\nO parâmetro ""%1"" não deveria ter um valor." - IDS_CMDLINE_MISSINGVAL "A linha de comando especificada para o Gerenciador de Contas do AFS é inválida.\n\nO parâmetro ""%1"" deve ser seguido por um valor." - IDS_CMDLINE_USERPASSWORD - "A linha de comando especificada para o Gerenciador de Contas AFS é inválida.\n\nPara obter novos tokens AFS, os parâmetros ""USER"" e ""PASSWORD"" devem ser especificados." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/zh_CN/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/zh_CN/AfsUsrMgr.rc deleted file mode 100644 index bdee5ecc5..000000000 --- a/src/WINNT/afsusrmgr/lang/zh_CN/AfsUsrMgr.rc +++ /dev/null @@ -1,1711 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ÕÊ»§¹ÜÀíÆ÷" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ÕÊ»§¹ÜÀíÆ÷" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,302,184 - LTEXT "ËùÑ¡µ¥Ôª£º",IDC_STATIC,4,7,55,8 - LTEXT "(ûÓÐÑ¡ÖÐÏî)",IDC_CELL,63,7,212,8 - LTEXT "AFS ÁîÅÆ£º",IDC_STATIC,4,18,55,8 - LTEXT "(ûÓÐÁîÅÆ)",IDC_CREDS,63,18,212,8 - ICON IDI_MAIN,IDC_ANIM,285,7,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,41,13,ES_AUTOHSCROLL - RTEXT "ģʽ£º",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "ÕýÔÚ²éѯ£»ÇëÉÔºò...",IDC_USERS_TITLE,4,6,142,8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "´´½¨(&C)...",M_USER_CREATE,41,126,64,14 - PUSHBUTTON "³ÉÔ±×ʸñ(&M)...",M_MEMBERSHIP,107,126,64,14 - PUSHBUTTON "ÌØÐÔ(&R)...",M_PROPERTIES,173,126,64,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "ģʽ£º",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "ÕýÔÚ²éѯ£»ÇëÉÔºò...",IDC_GROUPS_TITLE,4,6,142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "´´½¨(&C)...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "³ÉÔ±(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "ÌØÐÔ(&R)...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "ÕýÔÚ½øÐеIJÙ×÷ - AFS ÕÊ»§¹ÜÀíÆ÷" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "ÕýÔÚ²éѯ£»ÇëÉÔºò...",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¹ØÓÚ AFS ÕÊ»§¹ÜÀíÆ÷" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ÕÊ»§¹ÜÀíÆ÷°æ±¾ 3.5",IDC_STATIC,33,8,189,8 - LTEXT "°æÈ¨ËùÓÐ(C) IBM ¹«Ë¾ 1989£¬1999",IDC_STATIC,33,20,189, - 8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "¹Ø±Õ(&C)",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "²éÕÒ´íÎó´úÂë" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "´íÎóºÅ(&E)£º",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "ת»»(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "¹Ø±Õ(&C)",IDCANCEL,85,123,48,14 - LTEXT "(ÔËÐÐʱÉèÖõÄÎı¾)",IDC_ERROR_DESC,4,71,210,42 - LTEXT "Òª²éÕÒ´íÎó´úÂëµÄº¬Ò壬ÔÚÏÂÃæÊäÈë´úÂëÈ»ºóµ¥»÷""ת»»""°´Å¥¡£", - IDC_STATIC,4,4,210,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "²éÕÒÃüÁî" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "ÏÔʾ°ïÖú(&H)",IDOK,160,39,67,14 - PUSHBUTTON "È¡Ïû(&C)",IDCANCEL,160,55,67,14 - LTEXT "Òª²éÕÒÈçºÎʹÓà AFS ÕÊ»§¹ÜÀíÆ÷À´Ö´ÐÐÈÎÎñ£¬Ñ¡ÔñÏÂÃæµÄÒ»¸öÃüÁîÐÐÈ»ºóµ¥»÷¡°ÏÔʾ°ïÖú¡±°´Å¥¡£", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "ÁÐ" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Ñ¡ÔñÁÐʾʱÏÔʾµÄÁÐ(&S)£º",IDC_STATIC,5,7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¿ÉÓõÄÁÐ(&C)£º",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÒªÏÔʾµÄÁÐ(&I)£º",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Ìí¼Ó(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< ³ýÈ¥(&R)",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "ÏòÉÏÒÆ¶¯(&U)",IDC_COL_UP,173,122,48,14 - PUSHBUTTON "ÏòÏÂÒÆ¶¯(&D)",IDC_COL_DOWN,224,122,48,14 - GROUPBOX "ÁгöÁÐ",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸ß¼¶" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - LTEXT "µ±Ç°ÃÜÔ¿£º",IDC_STATIC,5,5,40,8 - LTEXT "ÕýÔÚ²éѯ£»ÇëÉÔºò...",IDC_USER_KEY,52,5,173,20,0, - WS_EX_STATICEDGE - CONTROL "ÕâÊÇÒ»¸öϵͳÕÊ»§(δ¼ÓÃÜ)(&U)",IDC_USER_NOSEAL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,35,160,10 - CONTROL "Óû§ÓµÓйÜÀíÌØÈ¨(&A)",IDC_USER_ADMIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,52,120,10 - CONTROL "ÊÚÓè´æÈ¡È¨ÏÞ(&G)£»ÉúÃüÆÚ£º",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,69,114,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 137,68,66,12 - CONTROL "×é´´½¨ÏÞ¶î(&Q)£º",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,86,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,137,85,27,13,ES_AUTOHSCROLL - LTEXT "²é¿´ÕÊ»§×´Ì¬(&S)£º",IDC_STATIC,12,140,76,8 - COMBOBOX IDC_USER_PERM_STATUS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÁгöÓµÓеÄ×é(&W)£º",IDC_STATIC,12,156,76,8 - COMBOBOX IDC_USER_PERM_OWNED,91,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Áгö×é³ÉÔ±×ʸñ(&M)£º",IDC_STATIC,12,172,76,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ÆäËüÕÊ»§Ðí¿ÉȨ",IDC_STATIC,5,109,220,82 - LTEXT "ÕâЩÉèÖÃÖ¸¶¨ÄÄЩÓû§¿ÉÒԲ鿴Õâ¸öÕÊ»§¡£",IDC_STATIC,11, - 124,204,8 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "Óû§¿ÉÒÔ¸ü¸Ä¿ÚÁî(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "¸ü¸Ä¿ÚÁî(&P)",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "Óû§¿ÉÒÔÖØÓþɿÚÁî(&R)",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "¿ÚÁîÓÐЧÆÚÖÕÖ¹ÓÚ",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,80,10 - LTEXT "Ììºó(&E)",IDC_STATIC,165,79,37,8 - EDITTEXT IDC_USER_PWEXPIRATION,112,77,37,13,ES_AUTOHSCROLL - CONTROL "ÕÊ»§ÖÕÖ¹ÓÚ(&T)£º",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,70,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,83, - 96,61,12 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 148,96,71,12 - CONTROL "ÔÚÁ¬Ðø",IDC_USER_FAILLOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,140,40,10 - LTEXT "´ÎµÇ¼ʧ°ÜºóËø¶¨ÕÊ»§(&L)",IDC_STATIC,101,141,106,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,53,139,32,13,ES_AUTOHSCROLL - CONTROL "ÎÞÏÞÆÚËø¶¨ÕÊ»§(Ö±µ½¹ÜÀíÔ±½âËø)(&K)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "Ëø¶¨ÕÊ»§Ê±¼ä(&F)",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,98,171,56,12 - PUSHBUTTON "½âËø(&U)",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "ʧ°ÜµÄµÇ¼³¢ÊÔ",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Óû§ %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "ÕÊ»§",IDC_STATIC,5,32,220,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "×é %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "²é¿´ÕÊ»§×´Ì¬(&S)£º",IDC_STATIC,12,108,73,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "²é¿´ÓµÓеÄ×é(&G)£º",IDC_STATIC,12,124,73,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Áгö×é³ÉÔ±(&M)£º",IDC_STATIC,12,140,73,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Ìí¼Ó³ÉÔ±(&A)£º",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "³ýÈ¥³ÉÔ±(&R)£º",IDC_STATIC,12,172,73,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ÆäËüÕÊ»§Ðí¿ÉȨ",IDC_STATIC,5,77,220,114 - LTEXT "ÕâЩÉèÖÃÖ¸¶¨ÄÄЩÓû§¿ÉÒԲ鿴Õâ¸ö×é¡£",IDC_STATIC,11,92, - 204,8 - LTEXT "ËùÓÐÕߣº",IDC_STATIC,5,31,38,8 - LTEXT "%1",IDC_GROUP_OWNER,48,31,105,8 - PUSHBUTTON "¸ü¸ÄËùÓÐÕß(&O)...",IDC_GROUP_CHANGEOWNER,159,29,66,12 - LTEXT "´´½¨Õߣº",IDC_STATIC,5,46,38,8 - LTEXT "%1",IDC_GROUP_CREATOR,48,46,105,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "×é" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "×é",IDC_STATIC,5,31,220,160 - LTEXT "ÕâЩÉèÖÃÔÊÐíÄú¸ü¸Ä¸ÃÓû§ËùÊô×éµÄÁÐ±í¼°¸ÃÓû§ËùÓµÓеÄ×éµÄÁÐ±í¡£", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "³ýÈ¥(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÏÔʾ¸ÃÓû§ËùÊôµÄ×é(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÏÔʾ¸ÃÓû§ÓµÓеÄ×é(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(ÕýÔÚ²éѯ£»ÇëÉÔºò...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "³ÉÔ±×ʸñ" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "×é³ÉÔ±×ʸñ",IDC_STATIC,5,31,220,160 - LTEXT "ÕâЩÉèÖÃÔÊÐíÄúÑ¡Ôñ¸Ã×éµÄ³ÉÔ±¼°¸Ã×éÓµÓеÄ×é¡£", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "³ýÈ¥(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÏÔʾ¸Ã×é³ÉÔ±(&S)",IDC_GROUP_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÏÔʾ¸Ã×éÓµÓеÄ×é(&H)",IDC_GROUP_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(ÕýÔÚ²éѯ£»ÇëÉÔºò...)",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(ÔËÐÐʱѡÖиñêÌâ)" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - RTEXT "(ÔËÐÐʱ)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Ñ¡Ôñ(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,224,129,50,14 - CONTROL "(ÔËÐÐʱָ¶¨µÄÎı¾)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,59,133,146,10 - RTEXT "²é¿´µ¥Ôª(&C)£º",IDC_STATIC,7,8,56,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,66,6,135,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ģʽ£º",IDC_GROUPS_PATTERN_PROMPT,198,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 281, 145 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "¸ü¸ÄÕÊ»§¿ÚÁî" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ΪпÚÁî×Ô¶¯Ñ¡ÔñÒ»¸ö°æ±¾ºÅ(&A)",IDC_CPW_VERSION_AUTO, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,42,36,203,10 - CONTROL "ʹÓÃÃÜÔ¿°æ±¾(&U)£º",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,42,52,77,10 - EDITTEXT IDC_CPW_VERSION,124,51,43,14,ES_AUTOHSCROLL - CONTROL "¼ÓÃܸÃ×Ö·û´®£º",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,42,78,73,10 - CONTROL "ʹÓøÃÃÜÔ¿£º",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,42,95,57,10 - EDITTEXT IDC_CPW_STRING,124,76,150,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,124,94,99,14,ES_AUTOHSCROLL - PUSHBUTTON "Ëæ»ú(&R)",IDC_CPW_RANDOM,226,94,48,14 - DEFPUSHBUTTON "È·¶¨",IDOK,116,124,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,170,124,50,14 - PUSHBUTTON "°ïÖú",9,224,124,50,14 - LTEXT "Óû§ %1 µÄпÚÁî",IDC_CPW_TITLE,43,14,231,8 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "°æ±¾£º",-1,7,37,26,8 - LTEXT "Öµ£º",-1,7,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ÖØÃüÃû×é" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÐÂ×éÃû(&N)£º",IDC_STATIC,35,103,57,8 - EDITTEXT IDC_RENAME_NEWNAME,109,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,109,129,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,163,129,50,14 - PUSHBUTTON "°ïÖú",9,217,129,50,14 - LTEXT "µ±Ç°ËùÓÐÕߣº",IDC_STATIC,35,65,60,8 - PUSHBUTTON "¸ü¸ÄËùÓÐÕß(&C)...",IDC_RENAME_CHOWN,198,63,69,14 - LTEXT "µ±Ç°×éÃû£º",IDC_STATIC,35,83,65,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "ÖØÃüÃû×é %1",IDC_RENAME_TITLE,35,14,222,8 - LTEXT "×¢Ò⣺³ý·Ç×éÃûûÓÐǰ׺£¬·ñÔò×éÃûӦ׼ȷ·´Ó³×éµÄµ±Ç°ËùÓÐÕß(ÀýÈ磬""ËùÓÐÕߣº×éÃû"")¡£", - IDC_STATIC,35,34,231,16 - LTEXT "(ÕýÔÚ²éѯ)",IDC_RENAME_OWNER,109,65,82,8 - LTEXT "(ÕýÔÚ²éѯ)",IDC_RENAME_OLDNAME,109,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 281, 153 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(ÔËÐÐʱѡÖиñêÌâ)" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - RTEXT "(ÔËÐÐʱ)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Ñ¡Ôñ(&S)",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,224,132,50,14 - RTEXT "ÏÔʾ£º",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "²é¿´µ¥Ôª(&C)£º",IDC_STATIC,7,8,52,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,62,6,138,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ģʽ£º",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 281, 169 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "(ÔËÐÐʱѡÖиñêÌâ)" -CLASS "AFSAccountManagerClass" -FONT 9, "ËÎÌå" -BEGIN - RTEXT "(ÔËÐÐʱ)",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "Ñ¡Ôñ(&S)",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,224,132,50,14 - RTEXT "ÏÔʾ£º",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "(ÔËÐÐʱָ¶¨µÄÎı¾)",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,60,151,140,10 - RTEXT "²é¿´µ¥Ôª(&C)£º",IDC_STATIC,7,8,53,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,65,6,136,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "ģʽ£º",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "×é" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "×é",IDC_STATIC,5,31,220,160 - LTEXT "ÕâЩÉèÖÃÔÊÐíÄú¸ü¸Ä¸ÃÓû§½«ÊôÓÚ×éµÄ³õʼÁÐ±í¼°¸ÃÓû§½«ÓµÓеÄ×éµÄÁÐ±í¡£", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "³ýÈ¥(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÏÔʾ¸ÃÓû§½«ÊôÓÚµÄ×é(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÏÔʾ¸ÃÓû§½«ÓµÓеÄ×é(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(ÕýÔÚ²éѯ£»ÇëÉÔºò...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 238, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "´´½¨Óû§" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Ãû³Æ(&N)£º",IDC_STATIC,7,37,48,8 - EDITTEXT IDC_NEWUSER_NAME,69,35,127,14,ES_AUTOHSCROLL - LTEXT "¿ÚÁî(&P)£º",IDC_STATIC,7,57,48,8 - EDITTEXT IDC_NEWUSER_PW1,69,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "(ÖØÐÂÊäÈë(&R)£º)",IDC_STATIC,7,77,62,8 - EDITTEXT IDC_NEWUSER_PW2,69,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "×Ô¶¯Ê¹ÓÃÏÂÒ»¸ö¿ÉÓõÄÓû§±êʶ·û(&U)",IDC_NEWUSER_ID_AUTO, - "Button",BS_AUTORADIOBUTTON,69,97,150,10 - CONTROL "ʹÓÃÒ»¸öÌØ¶¨Óû§±êʶ·û(&S)£º",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,69,113,118,10 - EDITTEXT IDC_NEWUSER_ID,187,112,33,14,ES_AUTOHSCROLL - PUSHBUTTON "×é(&G)...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "È·¶¨",IDOK,94,149,43,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,141,149,43,14 - PUSHBUTTON "°ïÖú",9,187,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "ÔÚµ¥Ôª %1 ÖÐн¨Óû§",IDC_NEWUSER_TITLE,45,14,185,8 - LTEXT "Óû§±êʶ·û£º",IDC_STATIC,7,97,48,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "ÔÚµ¥Ôª %1 ÖÐн¨×é",IDC_GROUP_NAME,37,13,188,8 - LTEXT "²é¿´ÕÊ»§×´Ì¬(&S)£º",IDC_STATIC,12,108,73,8 - COMBOBOX IDC_GROUP_PERM_STATUS,91,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "²é¿´ÓµÓеÄ×é(&G)£º",IDC_STATIC,12,124,73,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,91,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Áгö×é³ÉÔ±(&M)£º",IDC_STATIC,12,140,73,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Ìí¼Ó³ÉÔ±(&A)£º",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,91,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "³ýÈ¥³ÉÔ±(&R)£º",IDC_STATIC,12,172,73,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,91,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ÆäËüÕÊ»§Ðí¿ÉȨ",IDC_STATIC,5,68,220,123 - LTEXT "ÕâЩÉèÖÃÖ¸¶¨ÄÄЩÓû§¿ÉÒԲ鿴Õâ¸ö×éµÄÐÅÏ¢¡£",IDC_STATIC, - 11,83,204,17 - LTEXT "ËùÓÐÕߣº",IDC_STATIC,5,35,32,8 - LTEXT "%1",IDC_GROUP_OWNER,42,35,113,8 - PUSHBUTTON "¸ü¸ÄËùÓÐÕß(&O)...",IDC_GROUP_CHANGEOWNER,159,33,66,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "³ÉÔ±×ʸñ" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "×é³ÉÔ±×ʸñ",IDC_STATIC,5,31,220,160 - LTEXT "ÕâЩÉèÖÃÔÊÐíÄúÑ¡Ôñ¸Ã×éµÄ³õʼ³ÉÔ±¼°¸Ã×éÓ¦¸ÃÓµÓеÄ×é¡£", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "³ýÈ¥(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÏÔʾ¸Ã×éµÄ³õʼ³ÉÔ±(&S)",IDC_GROUP_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÏÔʾ¸Ã×éÓµÓеÄ×é(&H)",IDC_GROUP_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(ÕýÔÚ²éѯ£»ÇëÉÔºò...)",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 238, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "´´½¨×é" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Ãû³Æ(&N)£º",-1,7,37,42,8 - EDITTEXT IDC_NEWGROUP_NAME,52,35,127,14,ES_AUTOHSCROLL - CONTROL "×Ô¶¯Ê¹ÓÃÏÂÒ»¸ö¿ÉÓõÄ×é±êʶ·û(&U)",IDC_NEWGROUP_ID_AUTO, - "Button",BS_AUTORADIOBUTTON,52,60,178,10 - CONTROL "ʹÓÃÌØ¶¨µÄ×é±êʶ·û(&S)£º",IDC_NEWGROUP_ID_MANUAL,"Button", - BS_AUTORADIOBUTTON,52,75,104,10 - EDITTEXT IDC_NEWGROUP_ID,160,74,39,14,ES_AUTOHSCROLL - PUSHBUTTON "³ÉÔ±(&M)...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "È·¶¨",IDOK,94,114,43,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,141,114,43,14 - PUSHBUTTON "°ïÖú",9,188,114,43,14 - ICON IDI_USER,-1,7,6,21,21 - LTEXT "ÔÚµ¥Ôª %1 ÖÐн¨×é",IDC_NEWGROUP_TITLE,46,14,185,8 - LTEXT "×é±êʶ·û£º",-1,7,60,42,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ɾ³ýÓû§" -FONT 9, "ËÎÌå" -BEGIN - PUSHBUTTON "È·¶¨",IDOK,116,93,50,14 - DEFPUSHBUTTON "È¡Ïû",IDCANCEL,170,93,50,14 - PUSHBUTTON "°ïÖú",9,224,93,50,14 - LTEXT "×¢Òâ!\n\n¸Ã²Ù×÷½«ÓÀ¾Ãɾ³ýÓû§ %1 µÄÕÊ»§¡£", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 - CONTROL "ɾ³ý´ËÕÊ»§µÄ KAS Êý¾Ý¿âÌõÄ¿(&K)",IDC_DELETE_KAS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,57,53,203,10 - CONTROL "ɾ³ý´ËÕÊ»§µÄ PTS Êý¾Ý¿âÌõÄ¿(&P)",IDC_DELETE_PTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,57,69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ɾ³ý×é" -FONT 9, "ËÎÌå" -BEGIN - PUSHBUTTON "È·¶¨",IDOK,116,61,50,14 - DEFPUSHBUTTON "È¡Ïû",IDCANCEL,170,61,50,14 - PUSHBUTTON "°ïÖú",9,224,61,50,14 - LTEXT "×¢Òâ!\n\n¸Ã²Ù×÷½«ÓÀ¾Ãɾ³ý×é %1¡£",IDC_DELETE_TITLE,36, - 14,238,32 - ICON 32515,-1,7,6,21,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Óû§±êʶ·û×î´óÖµ(&U)£º",IDC_STATIC,11,87,87,8 - EDITTEXT IDC_CELL_USERMAX,102,85,40,14,ES_AUTOHSCROLL - LTEXT "×é±êʶ·û×î´óÖµ(&G)£º",IDC_STATIC,11,105,87,8 - EDITTEXT IDC_CELL_GROUPMAX,102,103,40,14,ES_AUTOHSCROLL - GROUPBOX "Óû§ºÍ×é±êʶ·û",IDC_STATIC,5,31,220,97 - LTEXT "ÕâЩÉèÖ÷´Ó³ÔøÊ¹ÓùýµÄ×î¸ßÓû§ºÍ×éʶ±ð·û¡£Ôö¼ÓÕâЩֵÊǰ²È«µÄ£»µ«ÊÇ£¬³ý·ÇÄúÈ·¶¨ÐµÄÖµ²»»áÓëÏÖ´æÕÊ»§³åÍ»£¬·ñÔòÇë²»Òª¼õС¸ÃÖµ¡£", - IDC_STATIC,11,43,204,32 - ICON IDI_CELL,IDC_STATIC,5,5,20,20 - LTEXT "µ¥Ôª %1",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "Óû§¿ÉÒÔ¸ü¸Ä¿ÚÁî(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "¸ü¸Ä¿ÚÁî(&P)",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "Óû§¿ÉÒÔÖØÓþɿÚÁî(&R)",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "¿ÚÁîÓÐЧÆÚÖÕÖ¹ÓÚ",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,87,10 - LTEXT "Ììºó(&E)",IDC_STATIC,168,79,35,8 - EDITTEXT IDC_USER_PWEXPIRATION,115,77,37,13,ES_AUTOHSCROLL - CONTROL "ÕÊ»§ÖÕÖ¹ÓÚ(&E)£º",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,71,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,86, - 96,61,12 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 151,96,68,12 - CONTROL "ÔÚÁ¬Ðø",IDC_USER_FAILLOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,140,41,10 - LTEXT "´ÎµÇ¼ʧ°ÜºóËø¶¨ÕÊ»§(&L)",IDC_STATIC,110,141,105,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,59,139,32,13,ES_AUTOHSCROLL - CONTROL "ÎÞÏÞÆÚËø¶¨ÕÊ»§(Ö±µ½¹ÜÀíÔ±½âËø)(&L)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "Ëø¶¨ÕÊ»§Ê±¼ä(&F)",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,72,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,101,171,56,12 - PUSHBUTTON "½âËø(&U)",IDC_USER_UNLOCK,171,170,50,14 - GROUPBOX "ʧ°ÜµÄµÇ¼³¢ÊÔ",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "ÔÚµ¥Ôª %1 ÖÐн¨Óû§",IDC_USER_NAME,37,13,188,8 - GROUPBOX "ÕÊ»§",IDC_STATIC,5,32,220,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸ß¼¶" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "(½¨Òé)Ϊ´ËÕÊ»§´´½¨Ò»¸ö KAS Êý¾Ý¿âÌõÄ¿(&K)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,210,11 - CONTROL "(½¨Òé)Ϊ´ËÕÊ»§´´½¨Ò»¸ö PTS Êý¾ÝÌõÄ¿(&P)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,210,10 - CONTROL "Õ⽫ÊÇÒ»¸öϵͳÕÊ»§(δ¼ÓÃÜ)(&U)",IDC_USER_NOSEAL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,40,160,10 - CONTROL "Óû§½«ÓµÓйÜÀíÔ±ÌØÈ¨(&A)",IDC_USER_ADMIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,57,136,10 - CONTROL "ÊÚÓè´æÈ¡È¨ÏÞ(&G)£»ÉúÃüÆÚ£º",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,74,109,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 137,73,66,12 - CONTROL "×é´´½¨ÏÞ¶î(&Q)£º",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,91,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,137,90,27,13,ES_AUTOHSCROLL - LTEXT "²é¿´ÕÊ»§×´Ì¬(&S)£º",-1,12,140,76,8 - COMBOBOX IDC_USER_PERM_STATUS,91,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÁгöÓµÓеÄ×é(&W)£º",-1,12,156,76,8 - COMBOBOX IDC_USER_PERM_OWNED,91,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Áгö×é³ÉÔ±×ʸñ(&M)£º",-1,12,172,76,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ÆäËüÕÊ»§Ðí¿ÉȨ",-1,5,109,220,82 - LTEXT "ÕâЩÉèÖÃÖ¸¶¨ÄÄЩÓû§¿ÉÒԲ鿴Õâ¸öÕÊ»§¡£",-1,11,124,204,8 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "ģʽ£º",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "ÕýÔÚ²éѯ£»ÇëÉÔºò...",IDC_MACHINES_TITLE,4,6,142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "´´½¨(&C)...",M_MACHINE_CREATE,42,126,64,14 - PUSHBUTTON "³ÉÔ±×ʸñ(&M)...",M_MEMBERSHIP,108,126,64,14 - PUSHBUTTON "ÌØÐÔ(&R)...",M_PROPERTIES,174,126,64,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "×é" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "×é",IDC_STATIC,5,31,220,160 - LTEXT "ÕâЩÉèÖÃÔÊÐíÄúÑ¡Ôñ¸ÃÓû§½«ÊôÓÚµÄ×é¼°Æä½«ÓµÓеÄ×éµÄ³õʼÁÐ±í¡£", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "³ýÈ¥(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÏÔʾ¸ÃÕÊ»§½«ÊôÓÚµÄ×é(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÏÔʾ¸ÃÕÊ»§½«ÓµÓеÄ×é(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(ÕýÔÚ²éѯ£»ÇëÉÔºò...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸ß¼¶" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "²é¿´ÕÊ»§×´Ì¬(&S)£º",IDC_STATIC,12,88,78,8 - COMBOBOX IDC_USER_PERM_STATUS,91,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÁгöÓµÓеÄ×é(&W)£º",IDC_STATIC,12,104,78,8 - COMBOBOX IDC_USER_PERM_OWNED,91,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Áгö×é³ÉÔ±×ʸñ(&M)£º",IDC_STATIC,12,120,78,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ÆäËüÕÊ»§Ðí¿ÉȨ",IDC_STATIC,5,57,220,82 - LTEXT "ÕâЩÉèÖÃÖ¸¶¨ÄÄЩÓû§¿ÉÒԲ鿴Õâ¸öÕÊ»§¡£",IDC_STATIC,11, - 72,204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "ÔÚµ¥Ôª %1 ÖÐн¨ IP µØÖ·ÕÊ»§",IDC_USER_NAME,37,13,188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 247, 126 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "´´½¨ IP µØÖ·ÕÊ»§" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "IP µØÖ·(&A)£º",-1,7,37,50,8 - EDITTEXT IDC_NEWUSER_NAME,60,35,127,14,ES_AUTOHSCROLL - CONTROL "×Ô¶¯Ê¹ÓÃÏÂÒ»¸ö¿ÉÓõÄÕÊ»§±êʶ·û(&U)",IDC_NEWUSER_ID_AUTO, - "Button",BS_AUTORADIOBUTTON,60,60,176,10 - CONTROL "ʹÓÃÒ»¸öÌØ¶¨ÕÊ»§±êʶ·û(&S)£º",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,60,76,118,10 - EDITTEXT IDC_NEWUSER_ID,182,75,39,14,ES_AUTOHSCROLL - PUSHBUTTON "×é(&G)...",IDC_ADVANCED,7,105,54,14 - DEFPUSHBUTTON "È·¶¨",IDOK,103,105,43,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,151,105,43,14 - PUSHBUTTON "°ïÖú",9,197,105,43,14 - ICON IDI_SERVER,-1,7,6,20,20 - LTEXT "ÔÚµ¥Ôª %1 ÖÐн¨ IP µØÖ·ÕÊ»§",IDC_NEWUSER_TITLE,50,14, - 190,8 - LTEXT "ÕÊ»§±êʶ·û£º",-1,7,60,50,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ɾ³ý IP µØÖ·ÕÊ»§" -FONT 9, "ËÎÌå" -BEGIN - PUSHBUTTON "È·¶¨",IDOK,153,63,50,14 - DEFPUSHBUTTON "È¡Ïû",IDCANCEL,207,63,50,14 - PUSHBUTTON "°ïÖú",9,261,63,50,14 - LTEXT "×¢Òâ!\n\n¸Ã²Ù×÷½«ÓÀ¾Ãɾ³ý IP µØÖ·ÕÊ»§ %1¡£", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸ß¼¶" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "²é¿´ÕÊ»§×´Ì¬(&S)£º",IDC_STATIC,12,89,77,8 - COMBOBOX IDC_USER_PERM_STATUS,91,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÁгöÓµÓеÄ×é(&W)£º",IDC_STATIC,12,105,77,8 - COMBOBOX IDC_USER_PERM_OWNED,91,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Áгö×é³ÉÔ±×ʸñ(&M)£º",IDC_STATIC,12,121,77,8 - COMBOBOX IDC_USER_PERM_MEMBER,91,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ÆäËüÕÊ»§Ðí¿ÉȨ",IDC_STATIC,5,57,220,82 - LTEXT "ÕâЩÉèÖÃÖ¸¶¨ÄÄЩÓû§¿ÉÒԲ鿴Õâ¸öÕÊ»§¡£",IDC_STATIC,11, - 73,204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "IP µØÖ·ÕÊ»§ %1",IDC_USER_NAME,37,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "×é" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "×é",IDC_STATIC,5,31,220,160 - LTEXT "ÕâЩÉèÖÃÔÊÐíÄú¸ü¸Ä¸ÃÕÊ»§ËùÊôµÄ×é¼°ÆäÓµÓеÄ×éµÄÁÐ±í¡£", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "³ýÈ¥(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "ÏÔʾ¸ÃÕÊ»§ËùÊôµÄ×é(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "ÏÔʾ¸ÃÕÊ»§ÓµÓеÄ×é(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "(ÕýÔÚ²éѯ£»ÇëÉÔºò...)",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 235, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Ñ¡Ïî" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ʹÓà Unix ·½Ê½ÕýÔò±í´ïʽ(&U) (""^mar[ky]son\\..*$"")", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,191,10 - CONTROL "ʹÓà Windows ·½Ê½ÕýÔò±í´ïʽ(&W) (""mar?son.*"")", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,182, - 10 - CONTROL "Èç¹û²»ÓùÜÀíÁîÅÆ¹¤×÷£¬ÏÔʾ¾¯¸æ",IDC_WARN_BADCREDS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,116,209,10 - CONTROL "ÿ¸ô",IDC_REFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 11,134,34,10 - LTEXT "·ÖÖÓ×Ô¶¯Ë¢ÐÂÐÅÏ¢(&A)",IDC_STATIC,90,135,92,8 - EDITTEXT IDC_REFRESH_RATE,45,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,20,20 - LTEXT "Afs ÕÊ»§¹ÜÀíÆ÷Ñ¡Ïî",IDC_STATIC,37,12,96,8 - GROUPBOX "ÕýÔò±í´ïʽ",IDC_STATIC,5,37,225,57 - GROUPBOX "Ò»°ã",IDC_STATIC,5,100,225,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 284, 129 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Ñ¡ÔñÒªÏÔʾµÄÓû§" -FONT 9, "ËÎÌå" -BEGIN - CONTROL "ÏÔʾËùÓÐÓû§ÕÊ»§ÌõÄ¿(&A)",IDC_SEARCH_ALL,"Button", - BS_AUTORADIOBUTTON,29,40,119,10 - CONTROL "½öÏÔʾÔÚÓÒÃæÈÕÆÚ֮ǰʧЧµÄÓû§ÕÊ»§(&E)", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON,29,55,161, - 10 - CONTROL "½öÏÔʾ¿ÚÁîÔÚÓÒÃæÈÕÆÚ֮ǰʧЧµÄÕÊ»§(&P)", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON,29,70, - 161,10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 212,54,61,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,212,69,61,12 - DEFPUSHBUTTON "È·¶¨",IDOK,119,108,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,173,108,50,14 - PUSHBUTTON "°ïÖú",9,227,108,50,14 - LTEXT "ÕâЩ¿ØÖÆÔÊÐíÄúÖ¸¶¨ÄÄЩÓû§Ó¦ÏÔʾÔÚÓû§±íÖС£Äú¿ÉÒÔͨ¹ýÔÚÓû§±íµÄģʽ¿ØÖÆÖÐÊäÈëÕÊ»§ÃûµÄÒ»²¿·ÖÀ´½øÒ»²½ÏÞÖÆÁгöµÄÓû§¡£", - IDC_STATIC,7,6,270,25 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 138 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 146 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 162 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 230 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - TOPMARGIN, 6 - BOTTOMMARGIN, 119 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 230 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 277 - TOPMARGIN, 6 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ÕÊ»§¹ÜÀíÆ÷""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "µ¥Ôª(&C)" - BEGIN - MENUITEM "Ñ¡Ôñ(&S)...", M_OPENCELL - MENUITEM "ÈÏÖ¤(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "µ¥ÔªÌØÐÔ(&R)...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "Í˳ö(&X)", M_EXIT - END - POPUP "±à¼­(&E)" - BEGIN - MENUITEM "´´½¨Óû§(&C)...", M_USER_CREATE - MENUITEM "´´½¨×é(&C)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "ÖØÃüÃû(&N)...", M_RENAME - MENUITEM "ɾ³ý(&D)...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "ȫѡ(&A)\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂ(&F)\tF5", M_REFRESH - MENUITEM "³ÉÔ±×ʸñ(&M)...\tCtrl+M", M_MEMBERSHIP - MENUITEM "ÌØÐÔ(&R)\tAlt+Enter", M_PROPERTIES - END - POPUP "ÊÓͼ(&V)" - BEGIN - POPUP "ͼ±ê(&I)" - BEGIN - MENUITEM "´óͼ±ê(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "Сͼ±ê(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ïêϸ×ÊÁÏ(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_VIEW_ONE, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWO, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "ÕýÔÚ½øÐеIJÙ×÷(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "ÁÐ(&C)...", M_COLUMNS - MENUITEM "Ñ¡Ïî(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL - END - POPUP "°ïÖú(&H)" - BEGIN - MENUITEM "Ŀ¼(&C)", M_CONTENTS - MENUITEM "²éÕÒÃüÁî(&F)...", M_FIND - MENUITEM "²éÕÒ´íÎó´úÂë(&L)...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "¹ØÓÚ AFS ÕÊ»§¹ÜÀíÆ÷(&A)...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "´óͼ±ê(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "Сͼ±ê(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ïêϸ×ÊÁÏ(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_VIEW_ONE, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWO, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "´´½¨Óû§(&C)...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "´óͼ±ê(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "Сͼ±ê(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ïêϸ×ÊÁÏ(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_VIEW_ONE, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWO, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "´´½¨×é(&C)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "×é(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "¸ü¸Ä¿ÚÁî(&P)...", M_CPW - MENUITEM "½âËø(&U)", M_UNLOCK - MENUITEM "ɾ³ý(&D)...", M_DELETE - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "ÌØÐÔ(&R)...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "×é³ÉÔ±(&M)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "ÖØÃüÃû(&R)...", M_RENAME - MENUITEM "ɾ³ý(&D)...", M_DELETE - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "ÌØÐÔ(&R)...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "ÁÐ(&C)...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "ÊÓͼ(&V)" - BEGIN - MENUITEM "´óͼ±ê(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "Сͼ±ê(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "Ïêϸ×ÊÁÏ(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "Õý³£(&N)", M_VIEW_ONE, CHECKED - MENUITEM "ËùÓÐͼ±ê(&A)", M_VIEW_TWO, CHECKED - MENUITEM "½öÏÔʾ״̬(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "´´½¨ÕÊ»§(&C)...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "Ë¢ÐÂËùÓÐ(&F)", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "×é(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "ɾ³ý(&D)...", M_DELETE - MENUITEM "Ë¢ÐÂ(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "ÌØÐÔ(&R)...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS ÕÊ»§¹ÜÀíÆ÷" - IDS_USRCOL_NAME "Óû§Ãû" - IDS_GRPCOL_NAME "×éÃû" - IDS_BADCREDS_DESC "³ý·ÇÄú×÷Ϊ¹ÜÀíÔ±µÇ¼£¬·ñÔòÄú¿ÉÄÜ»áûÓгä×ãµÄÌØÈ¨¹ÜÀí %1 µ¥Ôª¡£" - IDS_TAB_USERS "Óû§" - IDS_TAB_GROUPS "×é" - IDS_CELL_NONE "(δѡÖе¥Ôª)" - IDS_CRED_NONE "(¸Ãµ¥ÔªÖÐÎÞÁîÅÆ)" - IDS_CRED_EXP "%1(ÁîÅÆÒÑÔÚ %2 µ½ÆÚ)" - IDS_CRED_OK "%1(ÁîÅÆ½«ÔÚ %2 µ½ÆÚ)" - IDS_USERS_ALL "µ¥Ôª %1 ÖÐËùÓÐÓû§£º" - IDS_USERS_PATTERN "µ¥Ôª %1 ÖÐËùÑ¡Óû§£º" - IDS_GROUPS_ALL "µ¥Ôª %1 ÖÐËùÓÐ×飺" - IDS_GROUPS_PATTERN "µ¥Ôª %1 ÖÐËùÑ¡×飺" - IDS_QUERYING_LONG "ÕýÔÚ²éѯ£»ÇëÉÔºò..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "ûÓÐÕýÔÚ½øÐеIJÙ×÷¡£" - IDS_ACTION_DESC_ONE "ÏÂÁвÙ×÷ÕýÔÚ½øÐУº" - IDS_ACTION_DESC_MULT "ÏÂÁвÙ×÷ÕýÔÚ½øÐУº" - IDS_ACTCOL_OPERATION "²Ù×÷" - IDS_ACTCOL_ELAPSED "Òѹýʱ¼ä" - IDS_ACTION_REFRESH_CELL "Ϊµ¥Ôª %1 Ë¢ÐÂÐÅÏ¢" - IDS_ACTION_REFRESH_SERVER "Ϊ·þÎñÆ÷ %1 Ë¢ÐÂÐÅÏ¢" - IDS_ACTION_SCOUT_CELL "²âÊÔµ¥Ôª %1 ÊÇ·ñ´æÔÚÎÊÌâ" - IDS_ACTION_SCOUT_SERVER "²âÊÔ·þÎñÆ÷ %1 ÊÇ·ñ´æÔÚÎÊÌâ" - IDS_FIND_NOTHING_TITLE "δѡÔñÃüÁî" - IDS_FIND_NOTHING_DESC "Òª²éÕÒÈçºÎÖ´ÐÐÒ»¸ö²Ù×÷£¬Ê×ÏÈ´ÓÁбíÑ¡ÔñÒ»¸öÃüÁîÐлòÊäÈëÒ»¸ö¹Ø¼ü×Ö¡£" - IDS_FIND_UNKNOWN_TITLE "δ֪ÃüÁî" - IDS_FIND_UNKNOWN_DESC "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÃüÁî""%1"" ÕÒµ½ÈκΰïÖúÖ÷Ìâ¡£" - IDS_HELPABOUT_DESC1 "¾¯¸æ£º¸Ã¼ÆËã»ú³ÌÐòÊܵ½°æÈ¨¼°¹ú¼ÊÌõÔ¼µÄ±£»¤¡£+" - IDS_HELPABOUT_DESC2 "δ¾­ÊÚȨ¸´ÖÆ»ò·Ö·¢¸ÃÈí¼þ»áÊܵ½ÑÏÀ÷µÄÃñÊ»òÐÌÊ´¦·££¬²¢½«Êܵ½·¨ÂÉÑϳ͡£\n\n+" - IDS_HELPABOUT_DESC3 "AFS ÊÇ Transarc ¹«Ë¾(IBM ¹«Ë¾)µÄÉ̱ꡣ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "ÁÐ - AFS ÕÊ»§¹ÜÀíÆ÷" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "¶àÓû§ - ÌØÐÔ" - IDS_USER_PROPERTIES_TITLE "Óû§ %1 - ÌØÐÔ" - IDS_USER_NAME_MULTIPLE "Óû§" - IDS_ACCOUNTACCESS_OWNER "½ö¶ÔÕÊ»§ËùÓÐÕß" - IDS_ACCOUNTACCESS_GROUP "½ö¶Ô×é³ÉÔ±" - IDS_ACCOUNTACCESS_ANYONE "ÈκÎÈË" - IDS_ACCOUNTACCESS_MIXED "(¶à¸öÉèÖÃ)" - IDS_USER_KEY "%1\n °æ±¾ %2£¬Ð£ÑéºÍ %3" - IDS_USER_KEY_HIDDEN "(Òþ²ØµÄʵ¼Ê¹Ø¼ü×ÖÖµ)" - IDS_USER_KEY_UNKNOWN "(δ֪)" - IDS_USER_KEY_MULTIPLE "(¶à¸ö¹Ø¼ü×Ö)" - IDS_ACTION_USER_CHANGE "ΪÓû§ %1 ¸ü¸ÄÌØÐÔ" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "¶à¸ö×é - ÌØÐÔ" - IDS_GROUP_PROPERTIES_TITLE "×é %1 - ÌØÐÔ" - IDS_GROUP_NAME_MULTIPLE "×é" - IDS_ACCOUNTACCESS_OWNGROUP "½ö¶Ô×éËùÓÐÕß" - IDS_OWNER_MIXED "¶à¸öËùÓÐÕß" - IDS_CREATOR_MIXED "¶à¸ö´´½¨Õß" - IDS_GROUP_CHANGEOWNER_TITLE "¸ü¸Ä×éËùÓÐÕß" - IDS_GROUP_CHANGEOWNER_PROMPT "ËùÓÐÕߣº" - IDS_MEMBER_MIXED "(һЩ)" - IDS_USER_SHOW_MEMBER_TITLE "¸ÃÓû§ËùÊôµÄËùÓÐ×飺" - IDS_USER_SHOW_OWNER_TITLE "¸ÃÓû§ÓµÓеÄËùÓÐ×飺" - IDS_GROUP_SHOW_MEMBER_TITLE "¸Ã×éËùÓгÉÔ±£º" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE "ÕâЩÓû§ËùÊôµÄËùÓÐ×飺" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "ÕâЩ×éµÄËùÓгÉÔ±£º" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "ÖØÃüÃû×é %1 Ϊ %2" - IDS_RENAME_TITLE "ÖØÃüÃû×é %1" - IDS_GROUP_TITLE "×é %1" - IDS_SHOW_USERS "¸Ãµ¥ÔªÖеÄËùÓÐÓû§" - IDS_SHOW_GROUPS "¸Ãµ¥ÔªÖеÄËùÓÐ×é" - IDS_GROUP_SHOW_OWNED_TITLE "¸Ã×éÓµÓеÄËùÓÐ×飺" - IDS_BROWSE_TITLE_OWNED "Ñ¡ÔñÒªÓµÓеÄ×é" - IDS_BROWSE_PROMPT_OWNED "×飺" - IDS_BROWSE_CHECK_OWNED "Ö»ÏÔʾµ±Ç°ÎÞËùÓÐÕßµÄ×é" - IDS_NEWUSER_PROPERTIES_TITLE "´´½¨Óû§ - ¸ß¼¶" - IDS_NEWUSER_SHOW_MEMBER_TITLE "¸ÃÓû§½«ÊôÓÚµÄËùÓÐ×飺" - IDS_NEWUSER_SHOW_OWNER_TITLE "¸ÃÓû§½«ÓµÓеÄËùÓÐ×飺" - IDS_ACTION_CELL_CHANGE "Ϊµ¥Ôª %1 ¸ü¸ÄÌØÐÔ" - IDS_ACTION_USER_CREATE "ΪÓû§ %1 ´´½¨ÕÊ»§" - IDS_NEWGROUP_PROPERTIES_TITLE "´´½¨×é - ¸ß¼¶" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "¸ÃÐÂ×éµÄ³õʼ³ÉÔ±£º" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "±êÖ¾" - IDS_USRCOL_ADMIN "¹ÜÀíÔ±?" - IDS_USRCOL_TICKET "Ʊȯ?" - IDS_USRCOL_SYSTEM "ϵͳ?" - IDS_USRCOL_CHANGEPW "¸ü¸Ä¿ÚÁî?" - IDS_USRCOL_REUSEPW "ÖØÓÿÚÁî?" - IDS_USRCOL_EXPIRES "ÕÊ»§Ê§Ð§" - IDS_USRCOL_LASTPW "×îºóÒ»´Î¿ÚÁî¸ü¸Ä" - IDS_USRCOL_LASTMOD "×î½üÒ»´ÎÐÞ¸Ä" - IDS_USRCOL_LASTMODBY "×î½üÒ»´ÎÐÞ¸ÄÕß" - IDS_USRCOL_LIFETIME "ƱȯÉúÃüÆÚ" - IDS_USRCOL_CDAYPW "¿ÚÁîʧЧ" - IDS_USRCOL_CFAILLOGIN "µÇ¼ʧ°Ü" - IDS_USRCOL_CSECLOCK "µÇ¼ʧ°ÜËø¶¨Ê±¼ä" - IDS_USRCOL_CGROUPMAX "×é´´½¨ÏÞ¶î" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "ËùÓÐÕß" - IDS_USRCOL_CREATOR "´´½¨Õß" - IDS_USRCOL_STATUS "״̬" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "ÊÇ" - IDS_NO "·ñ" - IDS_GRPCOL_CMEMBERS "³ÉÔ±×ʸñ¼ÆÊý" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "ËùÓÐÕß" - IDS_GRPCOL_CREATOR "´´½¨Õß" - IDS_COL_USERS "µ¥ÔªÖеÄÓû§" - IDS_COL_GROUPS "µ¥ÔªÖеÄ×é" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE "¸ÃÐÂ×齫ӵÓеÄ×飺" - IDS_USER_DELETE_MULTIPLE "×¢Òâ!\n\n¸Ã²Ù×÷½«ÓÀ¾Ãɾ³ýÒÔÏÂÓû§µÄÕÊ»§£º%1" - IDS_GROUP_DELETE_MULTIPLE "×¢Òâ!\n\n¸Ã²Ù×÷½«ÓÀ¾Ãɾ³ýÒÔÏÂ×飺%1¡£" - IDS_ACTION_GROUP_CREATE "´´½¨×é %1" - IDS_ACTION_USER_DELETE "ΪÓû§ %1 ɾ³ýÕÊ»§" - IDS_ACTION_GROUP_DELETE "ɾ³ý×é %1" - IDS_CELL_PROPERTIES_TITLE "µ¥Ôª %1 - ÌØÐÔ" - IDS_MACHINES_ALL "µ¥Ôª %1 ÖÐËùÓÐ IP µØÖ·ÕÊ»§£º" - IDS_MACHINES_PATTERN "µ¥Ôª %1 ÖÐËùÑ¡ IP µØÖ·ÕÊ»§£º" - IDS_TAB_MACHINES "µØÖ·" - IDS_MACHINE_DELETE_MULTIPLE - "×¢Òâ!\n\n¸Ã²Ù×÷½«ÓÀ¾Ãɾ³ýÒÔÏ IP µØÖ·ÕÊ»§£º%1¡£" - IDS_NEWMACHINE_PROPERTIES_TITLE "´´½¨ IP µØÖ·ÕÊ»§ - ¸ß¼¶" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE "¶à¸ö IP µØÖ·ÕÊ»§ - ÌØÐÔ" - IDS_MACHINE_PROPERTIES_TITLE "IP µØÖ·ÕÊ»§ %1 - ÌØÐÔ" - IDS_COL_MACHINES "µ¥ÔªÖÐµÄ IP µØÖ·ÕÊ»§" - IDS_MCHCOL_NAME "IP µØÖ·" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "Ñ¡ÔñÒª¼ÓÈëµÄ×é" - IDS_BROWSE_PROMPT_JOIN "×飺" - IDS_BROWSE_CHECK_JOIN "Ö»ÏÔʾµ±Ç°Î´Á¬½ÓµÄ×é" - IDS_BROWSE_TITLE_OWN "Ñ¡ÔñÒªÓµÓеÄ×é" - IDS_BROWSE_PROMPT_OWN "×飺" - IDS_BROWSE_CHECK_OWN "Ö»ÏÔʾµ±Ç°ÎÞËùÓÐÕßµÄ×é" - IDS_BROWSE_TITLE_MEMBER "Ñ¡ÔñÒª¼ÓÈëµÄÓû§" - IDS_BROWSE_PROMPT_MEMBER "Óû§£º" - IDS_BROWSE_CHECK_MEMBER "Ö»ÏÔʾ·Ç³ÉÔ±Óû§" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "Ϊ×é %1 ¸ü¸ÄÌØÐÔ" - IDS_ACTION_GROUP_MEMBER_ADD "Ìí¼ÓÓû§ %2 µ½×é %1" - IDS_ACTION_GROUP_MEMBER_REMOVE "´Ó×é %1 ³ýÈ¥Óû§ %2" - IDS_ACTION_USER_PW_CHANGE "ΪÓû§ %1 ÉèÖÿÚÁî" - IDS_UNKNOWN_NAME "(δ֪)" - IDS_ACTION_USER_UNLOCK "ΪÓû§ %1 µÄÕÊ»§½âËø" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "×é´´½¨ÏÞ¶î" - IDS_MCHCOL_UID "ÕÊ»§±êʶ·û" - IDS_MCHCOL_OWNER "ËùÓÐÕß" - IDS_MCHCOL_CREATOR "´´½¨Õß" - IDS_OPTIONS_TITLE "AFS ÕÊ»§¹ÜÀíÆ÷Ñ¡Ïî" - IDS_WARNING_TITLE "×¢Òâ" - IDS_WARNING_SYSTEM_ACCOUNT - "¶Ô %1 ÕÊ»§µÄ¸ü¸Ä½«×÷ÌáÐÑ£¬ÒòΪ¶ÔÕÊ»§µÄ²»Êʵ±µÄ¸ü¸Ä»á×èÖ¹ AFS µÄijЩ¹¦ÄܵÄÕý³£ÔË×÷¡£\n\nÄúÈ·ÈÏÒª¼ÌÐøÂð?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE "´ËÕÊ»§ËùÊôµÄËùÓÐ×飺" - IDS_MACHINE_SHOW_OWNER_TITLE "´ËÕÊ»§ÓµÓеÄËùÓÐ×飺" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE "ÕâЩÕÊ»§ËùÊôµÄËùÓÐ×飺" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE "¸ÃÕÊ»§½«ËùÊôµÄËùÓÐ×飺" - IDS_NEWMACHINE_SHOW_OWNER_TITLE "¸ÃÕÊ»§½«ÓµÓеÄËùÓÐ×飺" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÁªÏµÕýÔÚ¼ÆËã»ú %1 ÉÏÔËÐеĹÜÀí½ø³Ì¡£\n\nÄú¿ÉÒÔͨ¹ýÔÚÆäËü¼ÆËã»úÉÏÔËÐÐ TaAfsAdmSvr.exe ³ÌÐòÀ´Ô¶³ÌÖ´ÐйÜÀíÈÎÎñ¡£" - IDS_ERROR_BAD_LOCAL_SERVER - "AFS ÕÊ»§¹ÜÀíÆ÷ÕÒ²»µ½³ÌÐò TaAfsAdmSvr.exe£¬»òδÄÜ×¼±¸ÈÃÄúµÄ¼ÆËã»ú½øÐÐ AFS ¹ÜÀí¡£" - IDS_ERROR_CANT_OPEN_CELL - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÁªÏµµ¥Ôª %1 ÖеÄÈκηþÎñÆ÷¡£\n\nÇëÔÙ´ÎÈ·ÈÏÄúÒÑÕýÈ·ÊäÈëµ¥ÔªÃû¡£" - IDS_ERROR_BADCREDENTIALS - "ÎÞ·¨Ê¶±ðÄúÊäÈëµÄ AFS Éí·Ý£¬»òÄúÖ¸¶¨µÄ¿ÚÁî²»ÕýÈ·¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "´íÎóºÅ 0x%1 (%2):\n\n%3" - IDS_ERROR_NOTTRANSLATED "ÎÞ·¨±æÈÏ´íÎóºÅ 0x%1 (%2)¡£" - IDS_ERROR_USER_MULTIPROP - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÏÔʾÇëÇóµÄ´°¿Ú£¬ÒòΪÒѾ­ÎªÒ»¸ö»ò¶à¸öÑ¡ÔñµÄÓû§´ò¿ªÁËÌØÐÔ´°¿Ú¡£" - IDS_ERROR_CANT_CHANGE_USER "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 ¸ü¸ÄÌØÐÔ¡£" - IDS_ERROR_GROUP_MULTIPROP - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÏÔʾÇëÇóµÄ´°¿Ú£¬ÒòΪÒѾ­ÎªÒ»¸ö»ò¶à¸öÑ¡ÔñµÄ×é´ò¿ªÁËÌØÐÔ´°¿Ú¡£" - IDS_ERROR_CANT_CHANGE_GROUP "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨Îª×é %1 ¸ü¸ÄÌØÐÔ¡£" - IDS_ERROR_CANT_TRANSLATE_USER - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨°´ÄúÖ¸¶¨µÄÃû×ÖÕÒµ½Óû§¡£\n\n ÇëÈ·ÈÏÄúÒÑÊäÈëÕýÈ·µÄÃû×Ö¡£" - IDS_ERROR_CANT_TRANSLATE_GROUP - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨°´ÄúÖ¸¶¨µÄÃû×ÖÕÒµ½Óû§¡£\n\n ÇëÈ·ÈÏÄúÒÑÊäÈëÕýÈ·µÄÃû×Ö¡£" - IDS_ERROR_CANT_GET_USERPROP "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 ÕÒµ½ÌØÐÔ¡£" - IDS_ERROR_CANT_CHANGE_PASSWORD "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 ¸ü¸Ä¿ÚÁî¡£" - IDS_ERROR_CANT_GET_RANDOM_KEY "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨Éú³ÉÒ»¸öËæ»ú¼ÓÃÜÃÜÔ¿¡£" - IDS_ERROR_CANT_SET_GROUPS "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 ¸ü¸ÄÖ¸¶¨µÄ×éÁÐ±í¡£" - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÏÂÁÐÓû§¸ü¸ÄÖ¸¶¨µÄ×éÁÐ±í£º%1¡£" - IDS_ERROR_CANT_UNLOCK "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 µÄÕÊ»§½âËø¡£" - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÏÂÁÐÓû§µÄÕÊ»§½âËø£º%1¡£" - IDS_ERROR_CANT_SET_MEMBERS "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨Îª×é %1 ¸ü¸Ä³ÉÔ±ÁÐ±í¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÏÂÁÐ×é¸ü¸Ä³ÉÔ±ÁÐ±í£º%1¡£" - IDS_ERROR_CANT_RENAME_GROUP "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÖØÃüÃû×é %1 Ϊ""%2""¡£" - IDS_ERROR_CANT_CHANGE_OWNER "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨¸ü¸Ä×é %1 µÄÓµÓÐÕß¡£" - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨¸ü¸ÄÏÂÁÐ×éµÄÓµÓÐÕߣº%1¡£" - IDS_ERROR_CANT_CHANGE_CELL "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨¸ü¸Äµ¥Ôª %1 µÄÌØÐÔ¡£" - IDS_ERROR_NO_PASSWORD_GIVEN "Äú±ØÐëΪÄúÕýÔÚ´´½¨µÄÓû§ÕÊ»§Ö¸¶¨Ò»¸ö¿ÚÁî¡£" - IDS_ERROR_MISMATCH_PASSWORD_GIVEN "ÄúΪÐÂÓû§ÕÊ»§ÊäÈëµÄ¿ÚÁƥÅä¡£" - IDS_ERROR_CANT_CREATE_USER "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 ´´½¨Ò»¸öÕÊ»§¡£" - IDS_ERROR_CANT_CREATE_GROUP "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨´´½¨×é %1¡£" - IDS_ERROR_CANT_DELETE_USER "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÓû§ %1 ɾ³ýÕÊ»§¡£" - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨ÎªÏÂÁÐÓû§É¾³ýÕÊ»§£º%1¡£" - IDS_ERROR_CANT_DELETE_GROUP "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨É¾³ý×é %1¡£" - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨É¾³ýÏÂÁÐ×飺%1¡£" - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "AFS ÕÊ»§¹ÜÀíÆ÷ÎÞ·¨Æô¶¯£¬ÒòΪδÕýÈ·°²×° AFS ¿ØÖÆÖÐÐÄ¡£\n\nÄú¿ÉÄÜÐèÒªÖØÐ°²×° AFS ¿ØÖÆÖÐÐÄ¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "³ö´í - AFS ÕÊ»§¹ÜÀíÆ÷" - IDS_CMDLINE_SYNTAX "ÄúΪ AFS ÕÊ»§¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£" - IDS_CMDLINE_UNRECOGNIZED - "ÄúΪ AFS ÕÊ»§¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ÎÞ·¨Ê¶±ð²ÎÊý ""%1""¡£" - IDS_CMDLINE_DUPLICATE "ÄúΪ AFS ÕÊ»§¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ²ÎÊý ""%1"" Ö¸¶¨¶à´Î¡£" - IDS_CMDLINE_UNEXPECTVALUE - "ÄúΪ AFS ÕÊ»§¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ²ÎÊý ""%1"" ²»Ó¦¸³ÓèÖµ¡£" - IDS_CMDLINE_MISSINGVAL "ÄúΪ AFS ÕÊ»§¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\n ²ÎÊý ""%1"" ±ØÐë´øÓÐÖµ¡£" - IDS_CMDLINE_USERPASSWORD - "ÄúΪ AFS ÕÊ»§¹ÜÀíÆ÷Ö¸¶¨µÄÃüÁîÐÐÎÞЧ¡£\n\nÒª»ñµÃÐ嵀 AFS ÁîÅÆ£¬±ØÐëͬʱָ¶¨²ÎÊý""/USER"" ¼° ""/PASSWORD""¡£" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/lang/zh_TW/AfsUsrMgr.rc b/src/WINNT/afsusrmgr/lang/zh_TW/AfsUsrMgr.rc deleted file mode 100644 index 29d0b6f8b..000000000 --- a/src/WINNT/afsusrmgr/lang/zh_TW/AfsUsrMgr.rc +++ /dev/null @@ -1,1724 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Account Manager" -#define AFS_VERINFO_NAME "AfsUsrMgr" -#define AFS_VERINFO_FILENAME "AfsUsrMgr.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Taiwan) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 220 -STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -CAPTION "AFS ±b¤áºÞ²zµ{¦¡" -MENU MENU_MAIN -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,32,302,184 - LTEXT "¤w¿ï¨úªº Cell¡G",IDC_STATIC,4,7,55,8 - LTEXT "¡]¥¼¿ï¨ú¡^",IDC_CELL,63,7,212,8 - LTEXT "AFS °O¸¹¡G",IDC_STATIC,4,18,55,8 - LTEXT "¡]¨S¦³°O¸¹¡^",IDC_CREDS,63,18,212,8 - ICON IDI_MAIN,IDC_ANIM,285,7,20,20,SS_SUNKEN - CONTROL "",IDC_BAR,"Static",SS_ETCHEDHORZ,1,0,308,1 -END - -IDD_TAB_USERS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_USERS_PATTERN,185,4,40,13,ES_AUTOHSCROLL - RTEXT "«¬¼Ë¡G",IDC_USERS_PATTERN_PROMPT,152,6,28,8 - LTEXT "¬d¸ß¤¤¡F½Ðµy­Ô...",IDC_USERS_TITLE,4,6,142,8 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "«Ø¥ß(&C)...",M_USER_CREATE,65,126,55,14 - PUSHBUTTON "¦¨­û¸ê®æ(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "¤º®e(&R)...",M_PROPERTIES,183,126,55,14 - PUSHBUTTON "...",IDC_ADVANCED,229,4,9,13 -END - -IDD_TAB_GROUPS DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_GROUPS_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "«¬¼Ë¡G",IDC_GROUPS_PATTERN_PROMPT,163,6,28,8 - LTEXT "¬d¸ß¤¤¡F½Ðµy­Ô...",IDC_GROUPS_TITLE,4,6,142,8 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "«Ø¥ß(&C)...",M_GROUP_CREATE,65,126,55,14 - PUSHBUTTON "¦¨­û(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "¤º®e(&R)...",M_PROPERTIES,183,126,55,14 -END - -IDD_ACTIONS DIALOGEX 0, 0, 236, 58 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "¶i¦æ¤¤ªº§@·~ - AFS ±b¤áºÞ²zµ{¦¡" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¬d¸ß¤¤¡F½Ðµy­Ô...",IDC_ACTION_DESC,2,2,232,8 - CONTROL "",IDC_ACTION_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x3,2,14,232,43 -END - -IDD_HELP_ABOUT DIALOG DISCARDABLE 0, 0, 226, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "Ãö©ó AFS ±b¤áºÞ²zµ{¦¡" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - ICON IDI_MAIN,IDC_HELPABOUT_ICON,4,8,20,20 - LTEXT "AFS ±b¤áºÞ²zµ{¦¡ 3.5 ª©",IDC_STATIC,33,8,189,8 - LTEXT "Copyright (C) IBM Corporation 1989, 1999",IDC_STATIC,33, - 20,189,8 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,37,218,1 - CTEXT "",IDC_HELPABOUT_DESC,4,48,218,56 - PUSHBUTTON "Ãö³¬(&C)",IDOK,87,123,50,14 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,4,114,218,1 -END - -IDD_HELP_ERROR DIALOG DISCARDABLE 0, 0, 218, 141 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¬d¾\¿ù»~½X" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¿ù»~½X(&E)¡G",IDC_STATIC,4,41,45,8 - EDITTEXT IDC_ERROR_NUMBER,59,39,78,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "ÂàĶ(&T)",IDC_ERROR_TRANSLATE,147,39,67,14 - PUSHBUTTON "Ãö³¬(&C)",IDCANCEL,85,123,48,14 - LTEXT "¡]°õ¦æ´Á¶¡³]©w¤å¦r¡^",IDC_ERROR_DESC,4,71,210,42 - LTEXT "¦p­n§ä¥X¿ù»~½Xªº²[·N¡A½ÐÁä¤J¥H¤Uªº¥N½X¡A¨Ã«ö¤@¤U ¡uÂàĶ¡v«ö¶s¡C", - IDC_STATIC,6,4,198,25 - CONTROL "",IDC_ADVANCED_BOX,"Static",SS_ETCHEDHORZ,4,60,211,1 -END - -IDD_HELP_FIND DIALOG DISCARDABLE 0, 0, 231, 74 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "·j´M«ü¥O" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - COMBOBOX IDC_FIND_COMMAND,4,38,150,170,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Åã¥Ü»¡©ú(&H)",IDOK,160,39,67,14 - PUSHBUTTON "¨ú®ø(&C)",IDCANCEL,160,55,67,14 - LTEXT "¦p­n§ä¥X¨Ï¥Î¡uAFS ±b¤áºÞ²zµ{¦¡¡v¥H°õ¦æ§@·~ªº¤èªk¡A½Ð¿ï¨ú¥H¤Uªº«ü¥O¦æ¡A¨Ã«ö¤@¤U¡uÅã¥Ü»¡©ú¡v«ö¶s¡C", - IDC_STATIC,4,4,223,25 -END - -IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 286, 148 -STYLE WS_POPUP | WS_CAPTION -CAPTION "ª½Äæ" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¿ï¨ú¦C¥Ü®É©Ò­nÅã¥Üªºª½Äæ(&S)¡G",IDC_STATIC,5,7,126,8 - COMBOBOX IDC_COLUMNS,134,5,147,104,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "¥i¥Îªºª½Äæ(&C)¡G",IDC_STATIC,12,40,100,8 - LISTBOX IDC_COL_AVAIL,12,49,100,71,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Åã¥Üªºª½Äæ(&I)¡G",IDC_STATIC,173,41,100,8 - LISTBOX IDC_COL_SHOWN,173,50,100,71,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "·s¼W(&A) >>",IDC_COL_INSERT,119,68,46,14 - PUSHBUTTON "<< ²¾°£(&R)",IDC_COL_DELETE,119,88,46,14 - PUSHBUTTON "¦V¤W²¾°Ê(&U)",IDC_COL_UP,173,125,48,14 - PUSHBUTTON "¦V¤U²¾°Ê(&D)",IDC_COL_DOWN,224,125,48,14 - GROUPBOX "¦C¥Xª½Äæ",IDC_STATIC,5,25,276,118 -END - -IDD_USER_ADVANCED DIALOGEX 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¶i¶¥" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - LTEXT "¥Ø«eªºª÷Æ_¡G",IDC_STATIC,5,5,56,8 - LTEXT "¬d¸ß¤¤¡F½Ðµy­Ô...",IDC_USER_KEY,63,5,136,20,0, - WS_EX_STATICEDGE - CONTROL "³o¬O¨t²Î±b¤á¡]¨S¦³¥[±K¡^(&S)",IDC_USER_NOSEAL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,35,160,10 - CONTROL "¨Ï¥ÎªÌ¨ã¦³ºÞ²zÅv­­(&A)",IDC_USER_ADMIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,52,120,10 - CONTROL "±Â»P³q¦æÃÒ¡F¥Í©R¶g´Á¡G(&G) ",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,69,99,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 107,68,66,12 - CONTROL "¸s²Õ«Ø¥ß°tÃB(&Q)¡G",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,86,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,92,85,27,13,ES_AUTOHSCROLL - LTEXT "À˵ø±b¤áª¬ºA(&V)¡G",IDC_STATIC,12,140,67,8 - COMBOBOX IDC_USER_PERM_STATUS,103,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¾Ö¦³ªº¸s²Õ(&W)¡G",IDC_STATIC,12,156,90,8 - COMBOBOX IDC_USER_PERM_OWNED,103,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¸s²Õ¦¨­û¸ê®æ(&M)¡G",IDC_STATIC,12,172,90,8 - COMBOBOX IDC_USER_PERM_MEMBER,103,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¨ä¥L±b¤áªº³\¥iÅv",IDC_STATIC,5,109,220,82 - LTEXT "³o¨Ç³]©w«ü©w¥i¥HÀ˵ø¦¹±b¤áªº¨Ï¥ÎªÌ¡C",IDC_STATIC,11,124, - 204,8 -END - -IDD_USER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¨Ï¥ÎªÌ¥iÅܧó±K½X(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "Åܧó±K½X(&P)",IDC_USER_CPW_NOW,144,45,73,14 - CONTROL "¨Ï¥ÎªÌ¥i­«ÂШϥαK½X(&R)",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "±K½X±N¦b(&V)",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,59,10 - LTEXT "¤Ñ«á¹L´Á",IDC_STATIC,136,79,48,8 - EDITTEXT IDC_USER_PWEXPIRATION,86,77,37,13,ES_AUTOHSCROLL - CONTROL "±b¤á¹L´Á¤é(&E)¡G",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,71,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,86, - 96,61,12 - LTEXT "®É¶¡(&T)",IDC_USER_EXPIRE_AT,155,98,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 166,96,53,12 - CONTROL "¦b¸g¹L(&L)",IDC_USER_FAILLOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,140,51,10 - LTEXT "¦¸³sÄòµn¤J¥¢±Ñ¤§«á§YÂê©w±b¤á",IDC_STATIC,104,141,115,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,63,139,30,13,ES_AUTOHSCROLL - CONTROL "µL­­´ÁÂê©w±b¤á¡]ª½¨ìºÞ²zªÌ¸Ñ°£Âê©w¬°¤î¡^(&K) ", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "Âê©w±b¤á®É¶¡(&F)",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,98,171,56,12 - PUSHBUTTON "¸Ñ°£Âê©w(&U)",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "µn¤J¥¢±Ñ",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "¨Ï¥ÎªÌ %1",IDC_USER_NAME,37,13,188,8 - GROUPBOX "±b¤á",IDC_STATIC,5,32,220,85 -END - -IDD_GROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "¸s²Õ %1",IDC_GROUP_NAME,37,13,188,8 - LTEXT "À˵ø±b¤áª¬ºA(&S)¡G",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,99,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "À˵ø¾Ö¦³ªº¸s²Õ(&G)¡G",IDC_STATIC,12,124,76,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,99,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¸s²Õ¦¨­û(&M)¡G",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,99,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "·s¼W¦¨­û(&A)¡G",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,99,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "²¾°£¦¨­û(&R)¡G",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,99,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¨ä¥L±b¤áªº³\¥iÅv",IDC_STATIC,5,77,220,114 - LTEXT "³o¨Ç³]©w«ü©w¥iÀ˵ø¦¹¸s²Õªº¨Ï¥ÎªÌ¡C",IDC_STATIC,11,92, - 204,8 - LTEXT "©Ò¦³¤H¡G",IDC_STATIC,5,31,36,8 - LTEXT "%1",IDC_GROUP_OWNER,49,31,92,8 - PUSHBUTTON "Åܧó©Ò¦³¤H (&O)...",IDC_GROUP_CHANGEOWNER,161,29,64,12 - LTEXT "«Ø¥ßªÌ¡G",IDC_STATIC,5,46,37,8 - LTEXT "%1",IDC_GROUP_CREATOR,49,46,91,8 -END - -IDD_USER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸s²Õ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¸s²Õ",IDC_STATIC,5,31,220,160 - LTEXT "³o¨Ç³]©wÅý±zÅܧó³o¦ì¨Ï¥ÎªÌ©ÒÄݪº¸s²Õ²M³æ¡A¥H¤Î³o¦ì¨Ï¥ÎªÌ¾Ö¦³ªº¸s²Õ²M³æ¡C", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "²¾°£(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "·s¼W(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Åã¥Ü¦¹¨Ï¥ÎªÌ©ÒÄݪº¸s²Õ(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "Åã¥Ü¦¹¨Ï¥ÎªÌ¾Ö¦³ªº¸s²Õ(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "¡]¬d¸ß¤¤¡F½Ðµy­Ô...¡^",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_GROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¦¨­û¸ê®æ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¸s²Õ¦¨­û¸ê®æ",IDC_STATIC,5,31,220,160 - LTEXT "³o¨Ç³]©wÅý±z¿ï¾Ü¦¹¸s²Õªº¦¨­û¡A¥H¤Î¸s²ÕÀ³¾Ö¦³ªº¸s²Õ¡C", - IDC_STATIC,5,5,220,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "²¾°£(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "·s¼W(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Åã¥Ü¦¹¸s²Õªº¦¨­û(&S)",IDC_GROUP_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "Åã¥Ü¦¹¸s²Õ¾Ö¦³ªº¸s²Õ(&H)",IDC_GROUP_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "¡]¬d¸ß¤¤¡F½Ðµy­Ô...¡^",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_BROWSE DIALOG DISCARDABLE 0, 0, 281, 150 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¡]³o­Ó¼ÐÃD¬O¦b°õ¦æ´Á¶¡¿ï¨ú¡^" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - RTEXT "¡]°õ¦æ´Á¶¡¡^",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¿ï¨ú(&S)",IDC_BROWSE_SELECT,224,112,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,224,129,50,14 - CONTROL "¡]©ó°õ¦æ´Á¶¡©Ò«ü©wªº¤å¦r¡^",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,59,133,146,10 - RTEXT "¼fµø Cell (&C)¡G",IDC_STATIC,7,8,51,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,65,6,131,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "«¬¼Ë¡G",IDC_GROUPS_PATTERN_PROMPT,198,8,29,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_USER_PASSWORD DIALOG DISCARDABLE 0, 0, 281, 145 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Åܧó±b¤á±K½X" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¦Û°Ê¿ï¨ú·s±K½Xªºª©¥»¸¹½X(&A)",IDC_CPW_VERSION_AUTO, - "Button",BS_AUTORADIOBUTTON | WS_GROUP,42,36,203,10 - CONTROL "¨Ï¥Îª÷Æ_ª©¥»(&U)¡G",IDC_CPW_VERSION_MANUAL,"Button", - BS_AUTORADIOBUTTON,42,52,77,10 - EDITTEXT IDC_CPW_VERSION,125,51,43,14,ES_AUTOHSCROLL - CONTROL "¬°³o­Ó¦r¦ê¥[±K¡G",IDC_CPW_BYSTRING,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,42,78,73,10 - CONTROL "¨Ï¥Î¦¹ª÷Æ_¡G",IDC_CPW_BYDATA,"Button", - BS_AUTORADIOBUTTON,42,95,57,10 - EDITTEXT IDC_CPW_STRING,126,76,148,14,ES_PASSWORD | - ES_AUTOHSCROLL - EDITTEXT IDC_CPW_DATA,113,94,98,14,ES_AUTOHSCROLL - PUSHBUTTON "ÀH¾÷(&R)",IDC_CPW_RANDOM,226,94,48,14 - DEFPUSHBUTTON "½T©w",IDOK,116,124,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,170,124,50,14 - PUSHBUTTON "»¡©ú",9,224,124,50,14 - LTEXT "¨Ï¥ÎªÌ %1 ªº·s±K½X",IDC_CPW_TITLE,43,14,231,8 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "ª©¥»¡G",-1,7,37,26,8 - LTEXT "­È¡G",-1,7,78,21,8 -END - -IDD_GROUP_RENAME DIALOG DISCARDABLE 0, 0, 274, 150 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Åܧó¸s²Õ¦WºÙ" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "·sªº¸s²Õ¦WºÙ(&N)¡G",IDC_STATIC,35,103,73,8 - EDITTEXT IDC_RENAME_NEWNAME,109,101,104,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,109,129,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,163,129,50,14 - PUSHBUTTON "»¡©ú",9,217,129,50,14 - LTEXT "¥Ø«eªº©Ò¦³¤H¡G",IDC_STATIC,35,65,71,8 - PUSHBUTTON "Åܧó©Ò¦³¤H(&C)...",IDC_RENAME_CHOWN,198,63,69,14 - LTEXT "¥Ø«eªº¸s²Õ¦WºÙ¡G",IDC_STATIC,35,83,65,8 - ICON IDI_GROUP,IDC_STATIC,7,6,20,20 - LTEXT "Åܧó¸s²Õ %1 ªº¦WºÙ ",IDC_RENAME_TITLE,35,14,222,8 - LTEXT "ªþµù¡G°£«D¸s²Õ¦WºÙ¨S¦³¦r­º¡A§_«h´NÀ³½T¹ê¤ÏÀ³¸s²Õ¥Ø«eªº©Ò¦³¤H¡]¨Ò¦p ""©Ò¦³¤H:¸s²Õ¦WºÙ""¡^¡C", - IDC_STATIC,35,34,231,16 - LTEXT "¡]¬d¸ß¡^",IDC_RENAME_OWNER,109,65,82,8 - LTEXT "¡]¬d¸ß¡^",IDC_RENAME_OLDNAME,109,83,104,8 -END - -IDD_BROWSE_COMBO DIALOG DISCARDABLE 0, 0, 281, 153 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¡]³o­Ó¼ÐÃD¬O¦b°õ¦æ´Á¶¡¿ï¨ú¡^" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - RTEXT "¡]°õ¦æ´Á¶¡¡^",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¿ï¨ú(&S)",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,224,132,50,14 - RTEXT "Åã¥Ü¡G",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "¼fµø Cell (&C)¡G",IDC_STATIC,0,8,60,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,61,6,135,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "«¬¼Ë¡G",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_BROWSE_BOTH DIALOG DISCARDABLE 0, 0, 281, 169 -STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU -CAPTION "¡]³o­Ó¼ÐÃD¬O¦b°õ¦æ´Á¶¡¿ï¨ú¡^" -CLASS "AFSAccountManagerClass" -FONT 9, "·s²Ó©úÅé" -BEGIN - RTEXT "¡}°õ¦æ´Á¶¡¡~",IDC_BROWSE_TYPE,7,115,49,8,SS_NOTIFY - EDITTEXT IDC_BROWSE_NAMED,60,113,140,14,ES_MULTILINE | - ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - PUSHBUTTON "¿ï¨ú(&S)",IDC_BROWSE_SELECT,224,113,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,224,132,50,14 - RTEXT "Åã¥Ü¡G",IDC_STATIC,7,134,49,8 - COMBOBOX IDC_BROWSE_COMBO,60,132,140,68,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "¡]©ó°õ¦æ´Á¶¡©Ò«ü©wªº¤å¦r¡^",IDC_BROWSE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,60,151,140,10 - RTEXT "¼fµø Cell (&C)¡G",IDC_STATIC,3,8,52,8,SS_NOTIFY - COMBOBOX IDC_BROWSE_CELL,55,6,141,91,CBS_DROPDOWN | - CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | - WS_TABSTOP - RTEXT "«¬¼Ë¡G",IDC_GROUPS_PATTERN_PROMPT,199,8,28,8 - EDITTEXT IDC_BROWSE_PATTERN,233,6,41,13,ES_AUTOHSCROLL - CONTROL "",IDC_BROWSE_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x12,7,23,267,84 -END - -IDD_NEWUSER_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸s²Õ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¸s²Õ",IDC_STATIC,5,31,220,160 - LTEXT "³o¨Ç³]©wÅý±zÅܧ󦹨ϥΪ̩ÒÄݪº°_©l¸s²Õ²M³æ¡A¥H¤Î¦¹¨Ï¥ÎªÌ¾Ö¦³ªº¸s²Õ¡C", - IDC_STATIC,5,5,220,17 - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "²¾°£(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "·s¼W(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Åã¥Ü¦¹¨Ï¥ÎªÌ©ÒÄݪº¸s²Õ(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "Åã¥Ü¦¹¨Ï¥ÎªÌ¾Ö¦³ªº¸s²Õ(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "¡]¬d¸ß¤¤¡F½Ðµy­Ô...¡^",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_NEWUSER DIALOG DISCARDABLE 0, 0, 238, 170 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "«Ø¥ß¨Ï¥ÎªÌ" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦WºÙ(&N)¡G",IDC_STATIC,7,37,38,8 - EDITTEXT IDC_NEWUSER_NAME,70,35,127,14,ES_AUTOHSCROLL - LTEXT "±K½X(&P)¡G",IDC_STATIC,7,57,34,8 - EDITTEXT IDC_NEWUSER_PW1,70,55,90,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "¡]­«·s¿é¤J(&R)¡G¡^",IDC_STATIC,3,77,67,8 - EDITTEXT IDC_NEWUSER_PW2,70,75,90,14,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "¦Û°Ê¨Ï¥Î¤U­Ó¥i¥Îªº¨Ï¥ÎªÌ ID (&U)",IDC_NEWUSER_ID_AUTO, - "Button",BS_AUTORADIOBUTTON,51,97,155,10 - CONTROL "¨Ï¥Î¯S©wªº¨Ï¥ÎªÌ ID (&S)¡G",IDC_NEWUSER_ID_MANUAL, - "Button",BS_AUTORADIOBUTTON,51,113,106,10 - EDITTEXT IDC_NEWUSER_ID,158,112,39,14,ES_AUTOHSCROLL - PUSHBUTTON "¸s²Õ(&G)...",IDC_ADVANCED,7,149,54,14 - DEFPUSHBUTTON "½T©w",IDOK,94,149,43,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,141,149,43,14 - PUSHBUTTON "»¡©ú",9,188,149,43,14 - ICON IDI_USER,IDC_STATIC,7,6,20,20 - LTEXT "Cell %1 ¤¤ªº·s¨Ï¥ÎªÌ",IDC_NEWUSER_TITLE,46,14,185,8 - LTEXT "¨Ï¥ÎªÌ ID¡G",IDC_STATIC,7,97,51,8 -END - -IDD_NEWGROUP_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - ICON IDI_GROUP,IDC_STATIC,5,5,20,20 - LTEXT "Cell %1 ¤¤ªº·s¸s²Õ",IDC_GROUP_NAME,37,13,188,8 - LTEXT "À˵ø±b¤áª¬ºA(&S)¡G",IDC_STATIC,12,108,67,8 - COMBOBOX IDC_GROUP_PERM_STATUS,94,106,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "À˵ø¾Ö¦³ªº¸s²Õ(&G):",IDC_STATIC,12,124,82,8 - COMBOBOX IDC_GROUP_PERM_GROUPS,94,122,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¸s²Õ¦¨­û(&M)¡G",IDC_STATIC,12,140,69,8 - COMBOBOX IDC_GROUP_PERM_MEMBERS,94,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "·s¼W¦¨­û(&A)¡G",IDC_STATIC,12,156,73,8 - COMBOBOX IDC_GROUP_PERM_ADD,94,154,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "²¾°£¦¨­û(&R)¡G",IDC_STATIC,12,172,67,8 - COMBOBOX IDC_GROUP_PERM_REMOVE,94,170,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¨ä¥L±b¤áªº³\¥iÅv",IDC_STATIC,5,68,220,123 - LTEXT "³o¨Ç³]©w«ü©w¥i¥HÀ˵ø¦¹¸s²Õ¸ê°Tªº¨Ï¥ÎªÌ¡C",IDC_STATIC,11, - 83,204,17 - LTEXT "©Ò¦³¤H¡G",IDC_STATIC,5,35,24,8 - LTEXT "%1",IDC_GROUP_OWNER,37,35,113,8 - PUSHBUTTON "Åܧó©Ò¦³¤H(&O)...",IDC_GROUP_CHANGEOWNER,159,33,66,12 -END - -IDD_NEWGROUP_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¦¨­û¸ê®æ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¸s²Õ¦¨­û¸ê®æ",IDC_STATIC,5,31,220,160 - LTEXT "³o¨Ç³]©wÅý±z¿ï¾Ü¦¹¸s²Õªº°_©l¦¨­û¡A¥H¤Î¦¹¸s²ÕÀ³¾Ö¦³ªº¸s²Õ¡C", - IDC_STATIC,5,5,210,18 - CONTROL "",IDC_USERS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "²¾°£(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "·s¼W(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Åã¥Ü¦¹¸s²Õªº°_©l¦¨­û(&S)",IDC_GROUP_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "Åã¥Ü¦¹¸s²Õ¾Ö¦³ªº¸s²Õ(&H)",IDC_GROUP_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "¡]¬d¸ß¤¤¡F½Ðµy­Ô...¡^",IDC_USERS_TITLE,12,74,205,8 -END - -IDD_NEWGROUP DIALOG DISCARDABLE 0, 0, 238, 135 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "«Ø¥ß¸s²Õ" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦WºÙ(&N)¡G",-1,7,37,37,8 - EDITTEXT IDC_NEWGROUP_NAME,46,35,127,14,ES_AUTOHSCROLL - CONTROL "¦Û°Ê¨Ï¥Î¤U­Ó¥i¥Îªº¸s²Õ ID (&U)",IDC_NEWGROUP_ID_AUTO, - "Button",BS_AUTORADIOBUTTON,45,60,186,10 - CONTROL "¨Ï¥Î¯S©wªº¸s²Õ ID (&S)¡G",IDC_NEWGROUP_ID_MANUAL,"Button", - BS_AUTORADIOBUTTON,45,75,93,10 - EDITTEXT IDC_NEWGROUP_ID,143,74,39,14,ES_AUTOHSCROLL - PUSHBUTTON "¦¨­û(&M)...",IDC_ADVANCED,7,114,54,14 - DEFPUSHBUTTON "½T©w",IDOK,94,114,43,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,141,114,43,14 - PUSHBUTTON "»¡©ú",9,188,114,43,14 - ICON IDI_USER,-1,7,6,20,20 - LTEXT "Cell %1 ¤¤ªº·s¸s²Õ",IDC_NEWGROUP_TITLE,46,14,185,8 - LTEXT "¸s²Õ ID¡G",-1,7,60,40,8 -END - -IDD_USER_DELETE DIALOG DISCARDABLE 0, 0, 281, 114 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "§R°£¨Ï¥ÎªÌ" -FONT 9, "·s²Ó©úÅé" -BEGIN - PUSHBUTTON "½T©w",IDOK,116,93,50,14 - DEFPUSHBUTTON "¨ú®ø",IDCANCEL,170,93,50,14 - PUSHBUTTON "»¡©ú",9,224,93,50,14 - LTEXT "ĵ§i¡I\n\n³o¶µ§@·~·|¥Ã¤[§R°£¨Ï¥ÎªÌ %1 ªº±b¤á¡C", - IDC_DELETE_TITLE,36,14,238,32 - ICON 32515,-1,7,6,21,20 - CONTROL "§R°£¦¹±b¤áªº KAS ¸ê®Æ®w¶µ¥Ø(&K)",IDC_DELETE_KAS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,57,53,203,10 - CONTROL "§R°£¦¹±b¤áªº PTS ¸ê®Æ®w¶µ¥Ø(&P)",IDC_DELETE_PTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,57,69,203,10 -END - -IDD_GROUP_DELETE DIALOG DISCARDABLE 0, 0, 281, 82 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "§R°£¸s²Õ" -FONT 9, "·s²Ó©úÅé" -BEGIN - PUSHBUTTON "½T©w",IDOK,116,61,50,14 - DEFPUSHBUTTON "¨ú®ø",IDCANCEL,170,61,50,14 - PUSHBUTTON "»¡©ú",9,224,61,50,14 - LTEXT "ĵ§i¡I\n\n³o¶µ§@·~·|¥Ã¤[§R°£¸s²Õ %1¡C",IDC_DELETE_TITLE, - 36,14,238,32 - ICON 32515,-1,7,6,21,20 -END - -IDD_CELL_GENERAL DIALOG DISCARDABLE 0, 0, 230, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¨Ï¥ÎªÌÃѧO½X³Ì¤j­È(&U)¡G",IDC_STATIC,11,87,93,8 - EDITTEXT IDC_CELL_USERMAX,107,85,40,14,ES_AUTOHSCROLL - LTEXT "¸s²ÕÃѧO½X³Ì¤j­È(&G)¡G",IDC_STATIC,11,105,90,8 - EDITTEXT IDC_CELL_GROUPMAX,107,103,40,14,ES_AUTOHSCROLL - GROUPBOX "¨Ï¥ÎªÌ©M¸s²ÕÃѧO½X",IDC_STATIC,5,31,220,97 - LTEXT "³o¨Ç³]©w·|¤ÏÀ³¥X´¿¸g¥Î¹Lªº³Ì°ª¨Ï¥ÎªÌ»P¸s²ÕÃѧO½X¡C¼W¥[³o¨Ç­È¨Ã¤£·|¦³°ÝÃD¡F°£«D±z½T©w·sªº­È¤£·|©M²{¦³ªº±b¤á½Ä¬ð¡A§_«h³Ì¦n¤£­n´î¤Ö³o¨Ç­È¡C", - IDC_STATIC,11,43,204,32 - ICON IDI_CELL,IDC_STATIC,5,5,20,20 - LTEXT "Cell %1",IDC_CELL_NAME,37,13,188,8 -END - -IDD_NEWUSER_GENERAL DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¨Ï¥ÎªÌ¥iÅܧó±K½X(&C)",IDC_USER_CPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,47,103,10 - PUSHBUTTON "Åܧó±K½X(&P)",IDC_USER_CPW_NOW,139,45,62,14 - CONTROL "¨Ï¥ÎªÌ¥i­«ÂШϥαK½X(&R)",IDC_USER_RPW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,62,111,10 - CONTROL "±K½X±N¦b(&V)",IDC_USER_PWEXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,78,61,10 - LTEXT "¤Ñ«á¹L´Á",IDC_STATIC,141,79,52,8 - EDITTEXT IDC_USER_PWEXPIRATION,91,77,37,13,ES_AUTOHSCROLL - CONTROL "±b¤á¹L´Á¤é(&E)¡G",IDC_USER_EXPIRES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,97,77,10 - CONTROL "",IDC_USER_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP,91, - 96,43,12 - LTEXT "®É¶¡(&T)",IDC_USER_EXPIRE_AT,141,98,8,8 - CONTROL "",IDC_USER_EXPIRE_TIME,"Time",WS_BORDER | WS_TABSTOP, - 154,96,43,12 - CONTROL "¦b¸g¹L(&L)",IDC_USER_FAILLOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,139,54,10 - LTEXT "¦¸³sÄòµn¤J¥¢±Ñ«á§YÂê©w±K½X",IDC_STATIC,108,141,106,8 - EDITTEXT IDC_USER_FAILLOCK_COUNT,60,139,32,13,ES_AUTOHSCROLL - CONTROL "µL­­´ÁÂê©w±b¤á¡]ª½¨ìºÞ²zªÌ¸Ñ°£Âê©w¬°¤î¡^(&K)", - IDC_USER_FAILLOCK_INFINITE,"Button",BS_AUTORADIOBUTTON, - 25,156,195,10 - CONTROL "Âê©w±b¤á®É¶¡(&F)",IDC_USER_FAILLOCK_FINITE,"Button", - BS_AUTORADIOBUTTON,25,172,70,10 - CONTROL "",IDC_USER_FAILLOCK_DURATION,"Elapsed",WS_BORDER | - WS_TABSTOP,100,171,56,12 - PUSHBUTTON "¸Ñ°£Âê©w(&U)",IDC_USER_UNLOCK,167,170,50,14 - GROUPBOX "µn¤J¥¢±Ñ",IDC_STATIC,5,124,220,67 - ICON IDI_USER,IDC_STATIC,5,5,20,20 - LTEXT "Cell %1 ¤¤ªº·s¨Ï¥ÎªÌ",IDC_USER_NAME,37,13,188,8 - GROUPBOX "±b¤á",IDC_STATIC,5,32,220,85 -END - -IDD_NEWUSER_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¶i¶¥" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "«Ø¥ß¦¹±b¤áªº KAS ¸ê®Æ®w¶µ¥Ø¡]«ØÄ³¡^(&K)", - IDC_USER_CREATE_KAS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,6,210,11 - CONTROL "«Ø¥ß¦¹±b¤áªº PTS ¸ê®Æ®w¶µ¥Ø¡]«ØÄ³¡^(&P)", - IDC_USER_CREATE_PTS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,5,23,210,10 - CONTROL "³o¬O¨t²Î±b¤á¡]¨S¦³¥[±K¡^(&S)",IDC_USER_NOSEAL,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,40,160,10 - CONTROL "¨Ï¥ÎªÌ¨ã¦³ºÞ²zÅv­­(&A)",IDC_USER_ADMIN,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,57,136,10 - CONTROL "±Â»P³q¦æÃÒ¡F¥Í©R¶g´Á(&G)¡G",IDC_USER_TGS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,74,109,10 - CONTROL "",IDC_USER_LIFETIME,"Elapsed",WS_BORDER | WS_TABSTOP, - 119,73,66,12 - CONTROL "¸s²Õ«Ø¥ß°tÃB(&Q)¡G",IDC_USER_GROUP_HASQUOTA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,5,91,85,10 - EDITTEXT IDC_USER_GROUP_QUOTA,92,90,27,13,ES_AUTOHSCROLL - LTEXT "À˵ø±b¤áª¬ºA(&V)¡G",-1,12,140,67,8 - COMBOBOX IDC_USER_PERM_STATUS,101,138,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¾Ö¦³ªº¸s²Õ(&W)¡G",-1,12,156,87,8 - COMBOBOX IDC_USER_PERM_OWNED,101,154,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¸s²Õ¦¨­û¸ê®æ(&M)¡G",-1,12,172,87,8 - COMBOBOX IDC_USER_PERM_MEMBER,101,170,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¨ä¥L±b¤áªº³\¥iÅv",-1,5,109,220,82 - LTEXT "³o¨Ç³]©w«ü©w¥i¥HÀ˵ø¦¹±b¤áªº¨Ï¥ÎªÌ¡C",-1,11,124,204,8 -END - -IDD_TAB_MACHINES DIALOG DISCARDABLE 0, 0, 242, 144 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_MACHINES_PATTERN,197,4,41,13,ES_AUTOHSCROLL - RTEXT "«¬¼Ë¡G",IDC_MACHINES_PATTERN_PROMPT,163,6,28,8 - LTEXT "¬d¸ß¤¤¡F½Ðµy­Ô...",IDC_MACHINES_TITLE,4,6,142,8 - CONTROL "",IDC_MACHINES_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x313,4,21,234,103 - PUSHBUTTON "«Ø¥ß(&C)...",M_MACHINE_CREATE,65,126,55,14 - PUSHBUTTON "¦¨­û¸ê®æ(&M)...",M_MEMBERSHIP,124,126,55,14 - PUSHBUTTON "¤º®e(&R)...",M_PROPERTIES,183,126,55,14 -END - -IDD_NEWMACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸s²Õ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¸s²Õ",IDC_STATIC,5,31,220,160 - LTEXT "³o¨Ç³]©wÅý±z¿ï¨ú¦¹±b¤á©ÒÄݪº°_©l¸s²Õ²M³æ¡A¥H¤Î¸Ó±b¤á¾Ö¦³ªº¸s²Õ¡C", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "²¾°£(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "·s¼W(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Åã¥Ü¦¹±b¤á©ÒÄݪº¸s²Õ(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "Åã¥Ü¦¹±b¤á¾Ö¦³ªº¸s²Õ(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "¡]¬d¸ß¤¤¡F½Ðµy­Ô...¡^",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_NEWMACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¶i¶¥" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "À˵ø±b¤áª¬ºA(&S)¡G",IDC_STATIC,12,88,67,8 - COMBOBOX IDC_USER_PERM_STATUS,101,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¾Ö¦³ªº¸s²Õ(&W)¡G",IDC_STATIC,12,104,85,8 - COMBOBOX IDC_USER_PERM_OWNED,101,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¸s²Õ¦¨­û¸ê®æ(&M)¡G",IDC_STATIC,12,120,85,8 - COMBOBOX IDC_USER_PERM_MEMBER,101,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¨ä¥L±b¤áªº³\¥iÅv",IDC_STATIC,5,57,220,82 - LTEXT "³o¨Ç³]©w«ü©w¥i¥HÀ˵ø¦¹±b¤áªº¨Ï¥ÎªÌ¡C",IDC_STATIC,11,72, - 204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "Cell %1 ¤¤·sªº IP ¦ì§}±b¤á",IDC_USER_NAME,37,13,188,8 -END - -IDD_NEWMACHINE DIALOG DISCARDABLE 0, 0, 247, 126 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "«Ø¥ß IP ¦ì§}±b¤á" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "IP ¦ì§}(&A)¡G",-1,7,37,45,8 - EDITTEXT IDC_NEWUSER_NAME,58,35,119,14,ES_AUTOHSCROLL - CONTROL "¦Û°Ê¨Ï¥Î¤U­Ó¥i¥Îªº±b¤á ID (&U)",IDC_NEWUSER_ID_AUTO, - "Button",BS_AUTORADIOBUTTON,49,60,191,10 - CONTROL "¨Ï¥Î¯S©wªº±b¤á ID (&S)¡G",IDC_NEWUSER_ID_MANUAL,"Button", - BS_AUTORADIOBUTTON,49,76,98,10 - EDITTEXT IDC_NEWUSER_ID,151,75,39,14,ES_AUTOHSCROLL - PUSHBUTTON "¸s²Õ(&G)...",IDC_ADVANCED,7,105,54,14 - DEFPUSHBUTTON "½T©w",IDOK,103,105,43,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,151,105,43,14 - PUSHBUTTON "»¡©ú",9,197,105,43,14 - ICON IDI_SERVER,-1,7,6,20,20 - LTEXT "Cell %1 ¤¤·sªº IP ¦ì§}±b¤á",IDC_NEWUSER_TITLE,50,14,190, - 8 - LTEXT "±b¤á ID¡G",-1,7,60,39,8 -END - -IDD_MACHINE_DELETE DIALOG DISCARDABLE 0, 0, 318, 84 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "§R°£ IP ¦ì§}±b¤á" -FONT 9, "·s²Ó©úÅé" -BEGIN - PUSHBUTTON "½T©w",IDOK,153,63,50,14 - DEFPUSHBUTTON "¨ú®ø",IDCANCEL,207,63,50,14 - PUSHBUTTON "»¡©ú",9,261,63,50,14 - LTEXT "ĵ§i¡I\n\n³o¶µ§@·~·|¥Ã¤[§R°£ IP ¦ì§}±b¤á %1¡C", - IDC_DELETE_TITLE,36,14,275,37 - ICON 32515,-1,7,6,21,20 -END - -IDD_MACHINE_ADVANCED DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¶i¶¥" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "À˵ø±b¤áª¬ºA(&S)¡G",IDC_STATIC,12,89,67,8 - COMBOBOX IDC_USER_PERM_STATUS,101,86,112,76,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¾Ö¦³ªº¸s²Õ(&W)¡G",IDC_STATIC,12,105,86,8 - COMBOBOX IDC_USER_PERM_OWNED,101,102,112,67,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "¦C¥X¸s²Õ¦¨­û¸ê®æ(&M)¡G",IDC_STATIC,12,121,86,8 - COMBOBOX IDC_USER_PERM_MEMBER,101,118,112,82,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¨ä¥L±b¤áªº³\¥iÅv",IDC_STATIC,5,57,220,82 - LTEXT "³o¨Ç³]©w«ü©w¥iÀ˵ø¦¹±b¤áªº¨Ï¥ÎªÌ¡C",IDC_STATIC,11,73, - 204,8 - ICON IDI_SERVER,IDC_STATIC,5,5,20,20 - LTEXT "IP ¦ì§}±b¤á %1",IDC_USER_NAME,37,13,188,8 -END - -IDD_MACHINE_MEMBER DIALOG DISCARDABLE 0, 0, 230, 196 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¸s²Õ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¸s²Õ",IDC_STATIC,5,31,220,160 - LTEXT "³o¨Ç³]©wÅý±zÅܧ󦹱b¤á©ÒÄݪº¸s²Õ²M³æ¡A¥H¤Î¦¹±b¤á¾Ö¦³ªº¸s²Õ¡C", - IDC_STATIC,5,5,220,17,NOT WS_GROUP - CONTROL "",IDC_GROUPS_LIST,"FastList",WS_BORDER | WS_TABSTOP | - 0x312,12,84,205,82 - PUSHBUTTON "²¾°£(&R)",IDC_MEMBER_REMOVE,167,169,50,14 - PUSHBUTTON "·s¼W(&A)...",IDC_MEMBER_ADD,113,169,50,14 - CONTROL "Åã¥Ü¦¹±b¤á©ÒÄݪº¸s²Õ(&S)",IDC_USER_SHOW_MEMBER,"Button", - BS_AUTORADIOBUTTON,12,45,195,10 - CONTROL "Åã¥Ü¦¹±b¤á¾Ö¦³ªº¸s²Õ(&H)",IDC_USER_SHOW_OWNER,"Button", - BS_AUTORADIOBUTTON,12,58,195,10 - LTEXT "¡]¬d¸ß¤¤¡F½Ðµy­Ô...¡^",IDC_GROUPS_TITLE,12,74,205,8 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 235, 162 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "¿ï¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¨Ï¥Î Unix ®æ¦¡ªº¥¿³Wªí¥Ü¦¡(""^mar[ky]son\\..*$"") (&U)", - IDC_REGEXP_UNIX,"Button",BS_AUTORADIOBUTTON,11,53,191,10 - CONTROL "¨Ï¥Î Windows ®æ¦¡ªº¥¿³Wªí¥Ü¦¡(""mar?son.*"") (&W)", - IDC_REGEXP_WINDOWS,"Button",BS_AUTORADIOBUTTON,11,69,199, - 10 - CONTROL "§@·~®É¦pªG¨S¦³ºÞ²z°O¸¹¡A«hÅã¥Üĵ§i",IDC_WARN_BADCREDS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,116,209,10 - CONTROL "¨C¹j(&A)",IDC_REFRESH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,11,134,43,10 - LTEXT "¤ÀÄÁ¦Û°Ê­«·s¾ã²z¸ê°T",IDC_STATIC,106,135,119,8 - EDITTEXT IDC_REFRESH_RATE,56,133,30,14,ES_AUTOHSCROLL - ICON IDI_MAIN,IDC_STATIC,5,5,20,20 - LTEXT "Afs ±b¤áºÞ²zµ{¦¡¿ï¶µ",IDC_STATIC,37,12,96,8 - GROUPBOX "¥¿³Wªí¥Ü¦¡",IDC_STATIC,5,37,225,57 - GROUPBOX "¤@¯ë¨Æ¶µ",IDC_STATIC,5,100,225,57 -END - -IDD_SEARCH_USERS DIALOG DISCARDABLE 0, 0, 284, 129 -STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "¿ï¨ú­nÅã¥Üªº¨Ï¥ÎªÌ" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "Åã¥Ü©Ò¦³¨Ï¥ÎªÌ±b¤áªº¶µ¥Ø(&A)",IDC_SEARCH_ALL,"Button", - BS_AUTORADIOBUTTON,29,40,119,10 - CONTROL "¥uÅã¥Ü©ó¯S©w®É¶¡¤§«e¹L´Áªº¨Ï¥ÎªÌ±b¤á(&V)", - IDC_SEARCH_EXPIRE,"Button",BS_AUTORADIOBUTTON,29,55,174, - 10 - CONTROL "¥uÅã¥Ü±K½X©ó¯S©w®É¶¡¤§«e¹L´Áªº±b¤á(&E)", - IDC_SEARCH_PWEXPIRE,"Button",BS_AUTORADIOBUTTON,29,70, - 168,10 - CONTROL "",IDC_SEARCH_EXPIRE_DATE,"Date",WS_BORDER | WS_TABSTOP, - 203,53,74,12 - CONTROL "",IDC_SEARCH_PWEXPIRE_DATE,"Date",WS_BORDER | - WS_TABSTOP,203,68,74,12 - DEFPUSHBUTTON "½T©w",IDOK,119,108,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,173,108,50,14 - PUSHBUTTON "»¡©ú",9,227,108,50,14 - LTEXT "³o¨Ç±±¨îÅý±z«ü©w­nÅã¥Ü¦b¡u¨Ï¥ÎªÌ¡v¼ÐÅÒ¤Wªº¨Ï¥ÎªÌ¡C±z¥i¥H¶i¤@¨B­­¨î¨Ï¥ÎªÌ¦W³æªºÅã¥Ü¡A¤èªk¬O¦b¡u¨Ï¥ÎªÌ¡v¼ÐÅÒ¤Wªº¡u«¬¼Ë¡v±±¨î¤¤¡AÁä¤J³¡¤Àªº±b¤á¦WºÙ¡C", - IDC_STATIC,7,6,270,25 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 306 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_TAB_USERS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_TAB_GROUPS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_ACTIONS, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 234 - TOPMARGIN, 2 - BOTTOMMARGIN, 56 - END - - IDD_HELP_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 222 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_ERROR, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 214 - TOPMARGIN, 4 - BOTTOMMARGIN, 137 - END - - IDD_HELP_FIND, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 227 - TOPMARGIN, 4 - BOTTOMMARGIN, 70 - END - - IDD_COLUMNS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 281 - TOPMARGIN, 5 - BOTTOMMARGIN, 143 - END - - IDD_USER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_USER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_GROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_BROWSE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_USER_PASSWORD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 138 - END - - IDD_GROUP_RENAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 6 - BOTTOMMARGIN, 143 - END - - IDD_BROWSE_COMBO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 146 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_BROWSE_BOTH, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 162 - HORZGUIDE, 23 - HORZGUIDE, 107 - END - - IDD_NEWUSER_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 163 - END - - IDD_NEWGROUP_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWGROUP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 231 - TOPMARGIN, 6 - BOTTOMMARGIN, 128 - END - - IDD_USER_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 107 - END - - IDD_GROUP_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 274 - TOPMARGIN, 6 - BOTTOMMARGIN, 75 - END - - IDD_CELL_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 129 - END - - IDD_NEWUSER_GENERAL, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWUSER_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_TAB_MACHINES, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 238 - TOPMARGIN, 4 - BOTTOMMARGIN, 140 - END - - IDD_NEWMACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_NEWMACHINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 240 - TOPMARGIN, 6 - BOTTOMMARGIN, 119 - END - - IDD_MACHINE_DELETE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 311 - TOPMARGIN, 6 - BOTTOMMARGIN, 77 - END - - IDD_MACHINE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_MACHINE_MEMBER, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 225 - TOPMARGIN, 5 - BOTTOMMARGIN, 191 - END - - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 230 - TOPMARGIN, 5 - BOTTOMMARGIN, 157 - END - - IDD_SEARCH_USERS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 277 - TOPMARGIN, 6 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Account Manager""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -32513 ICON DISCARDABLE "..\\afsapplib\\resource\\error.ico" -IDI_MAIN ICON DISCARDABLE "resource\\afsusrmgr.ico" -32515 ICON DISCARDABLE "..\\afsapplib\\resource\\warning.ico" -IDI_USER ICON DISCARDABLE "..\\afsapplib\\resource\\user.ico" -IDI_GROUP ICON DISCARDABLE "..\\afsapplib\\resource\\group.ico" -IDI_CELL ICON DISCARDABLE "..\\afsapplib\\resource\\cell.ico" -IDI_SERVER ICON DISCARDABLE "..\\afsapplib\\resource\\server.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_MAIN MENU DISCARDABLE -BEGIN - POPUP "Cell (&C)" - BEGIN - MENUITEM "¿ï¨ú(&S)...", M_OPENCELL - MENUITEM "Ų§O(&A)...", M_CREDENTIALS - MENUITEM SEPARATOR - MENUITEM "Cell ¤º®e(&R)...", M_CELL_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "µ²§ô(&X)", M_EXIT - END - POPUP "½s¿è(&E)" - BEGIN - MENUITEM "«Ø¥ß¨Ï¥ÎªÌ(&C)...", M_USER_CREATE - MENUITEM "«Ø¥ß¸s²Õ(&C)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "­«·s©R¦W(&N)...", M_RENAME - MENUITEM "§R°£(&D)...", M_DELETE - MENUITEM SEPARATOR - MENUITEM "¥þ¿ï(&A)\tCtrl+A", M_SELECTALL - MENUITEM SEPARATOR - MENUITEM "­«·s¾ã²z(&F)\tF5", M_REFRESH - MENUITEM "¦¨­û¸ê®æ(&M)...\tCtrl+M", M_MEMBERSHIP - MENUITEM "¤º®e(&R)\tAlt+Enter", M_PROPERTIES - END - POPUP "À˵ø(&V)" - BEGIN - POPUP "¹Ï¥Ü(&I)" - BEGIN - MENUITEM "¤j¹Ï¥Ü(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¤p¹Ï¥Ü(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "©ú²Ó(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_VIEW_ONE, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWO, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "§@·~¶i¦æ¤¤(&P)", M_ACTIONS, CHECKED - MENUITEM SEPARATOR - MENUITEM "ª½Äæ(&C)...", M_COLUMNS - MENUITEM "¿ï¶µ(&O)...", M_OPTIONS - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL - END - POPUP "»¡©ú(&H)" - BEGIN - MENUITEM "¤º®e(&C)", M_CONTENTS - MENUITEM "·j´M«ü¥O(&F)...", M_FIND - MENUITEM "¬d¾\¿ù»~½X(&L)...", M_LOOKUP - MENUITEM SEPARATOR - MENUITEM "Ãö©ó AFS ±b¤áºÞ²zµ{¦¡(&A)...", M_ABOUT - END -END - -MENU_USER_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¤j¹Ï¥Ü(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¤p¹Ï¥Ü(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "©ú²Ó(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_VIEW_ONE, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWO, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "«Ø¥ß¨Ï¥ÎªÌ(&C)...", M_USER_CREATE - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_GROUP_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¤j¹Ï¥Ü(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¤p¹Ï¥Ü(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "©ú²Ó(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_VIEW_ONE, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWO, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "«Ø¥ß¸s²Õ(&C)...", M_GROUP_CREATE - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_USER MENU DISCARDABLE -BEGIN - MENUITEM "¸s²Õ(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "Åܧó±K½X(&P)...", M_CPW - MENUITEM "¸Ñ°£Âê©w(&U)", M_UNLOCK - MENUITEM "§R°£(&D)...", M_DELETE - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "¤º®e(&R)...", M_PROPERTIES -END - -MENU_GROUP MENU DISCARDABLE -BEGIN - MENUITEM "¸s²Õ¦¨­û(&M)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "§ó¦W(&R)...", M_RENAME - MENUITEM "§R°£(&D)...", M_DELETE - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "¤º®e(&R)...", M_PROPERTIES -END - -MENU_COLUMNS MENU DISCARDABLE -BEGIN - MENUITEM "ª½Äæ(&C)...", M_COLUMNS -END - -MENU_MACHINE_NONE MENU DISCARDABLE -BEGIN - POPUP "À˵ø(&V)" - BEGIN - MENUITEM "¤j¹Ï¥Ü(&G)", M_VIEW_LARGE, CHECKED - MENUITEM "¤p¹Ï¥Ü(&M)", M_VIEW_SMALL, CHECKED - MENUITEM "©ú²Ó(&D)", M_VIEW_DETAILS, CHECKED - MENUITEM SEPARATOR - MENUITEM "¤@¯ë(&N)", M_VIEW_ONE, CHECKED - MENUITEM "©Ò¦³¹Ï¥Ü(&A)", M_VIEW_TWO, CHECKED - MENUITEM "¥u¦³ª¬ºA(&S)", M_VIEW_STATUS, CHECKED - END - MENUITEM SEPARATOR - MENUITEM "«Ø¥ß±b¤á(&C)...", M_MACHINE_CREATE - MENUITEM SEPARATOR - MENUITEM "¥þ³¡­«·s¾ã²z(&F)", M_REFRESHALL -END - -MENU_MACHINE MENU DISCARDABLE -BEGIN - MENUITEM "¸s²Õ(&G)...", M_MEMBERSHIP - MENUITEM SEPARATOR - MENUITEM "§R°£(&D)...", M_DELETE - MENUITEM "­«·s¾ã²z(&F)", M_REFRESH - MENUITEM SEPARATOR - MENUITEM "¤º®e(&R)...", M_PROPERTIES -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -ACCEL_MAIN ACCELERATORS DISCARDABLE -BEGIN - "A", M_SELECTALL, VIRTKEY, CONTROL, NOINVERT - "M", M_MEMBERSHIP, VIRTKEY, CONTROL, NOINVERT - VK_APPS, M_KEY_MENU, VIRTKEY, NOINVERT - VK_ESCAPE, M_KEY_ESC, VIRTKEY, NOINVERT - VK_F10, M_KEY_MENU, VIRTKEY, SHIFT, NOINVERT - VK_F5, M_REFRESH, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_RETURN, VIRTKEY, NOINVERT - VK_RETURN, M_KEY_PROPERTIES, VIRTKEY, ALT, NOINVERT - VK_TAB, M_KEY_TAB, VIRTKEY, NOINVERT - VK_TAB, M_KEY_CTRLTAB, VIRTKEY, CONTROL, NOINVERT - VK_TAB, M_KEY_BACKTAB, VIRTKEY, SHIFT, NOINVERT - VK_TAB, M_KEY_CTRLBACKTAB, VIRTKEY, SHIFT, CONTROL, - NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "AFS ±b¤áºÞ²zµ{¦¡" - IDS_USRCOL_NAME "¨Ï¥ÎªÌ¦WºÙ" - IDS_GRPCOL_NAME "¸s²Õ¦WºÙ" - IDS_BADCREDS_DESC "°£«D±z¥HºÞ²zªÌªº¨­¥÷µn¤J¡A§_«h±zªºÅv­­±N¤£¨¬¥H¶¶§QºÞ²z %1 Cell¡C" - IDS_TAB_USERS "¨Ï¥ÎªÌ" - IDS_TAB_GROUPS "¸s²Õ" - IDS_CELL_NONE "¡]¥¼¿ï¨ú Cell¡^" - IDS_CRED_NONE "¡]¦¹ Cell ¤¤¨S¦³°O¸¹¡^" - IDS_CRED_EXP "%1 ¡]°O¸¹¹L´Á %2¡^" - IDS_CRED_OK "%1¡]°O¸¹±N¨ì´Á %2¡^" - IDS_USERS_ALL "Cell %1 ¤¤©Ò¦³ªº¨Ï¥ÎªÌ¡G" - IDS_USERS_PATTERN "¿ï¨ú Cell %1 ªº¨Ï¥ÎªÌ¡G" - IDS_GROUPS_ALL "Cell %1 ¤¤©Ò¦³ªº¸s²Õ¡G" - IDS_GROUPS_PATTERN "¿ï¨ú Cell %1 ªº¸s²Õ¡G" - IDS_QUERYING_LONG "¬d¸ß¤¤¡F½Ðµy­Ô..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_DESC_NONE "¨S¦³¥¿¦b¶i¦æªº§@·~¡C" - IDS_ACTION_DESC_ONE "¥Ø«e¥¿¦b¶i¦æ¤U¦Cªº§@·~¡G" - IDS_ACTION_DESC_MULT "¥Ø«e¥¿¦b¶i¦æ¤U¦Cªº§@·~¡G" - IDS_ACTCOL_OPERATION "§@·~" - IDS_ACTCOL_ELAPSED "¸g¾ú®É¶¡" - IDS_ACTION_REFRESH_CELL "­«·s¾ã²z Cell %1 ªº¸ê°T" - IDS_ACTION_REFRESH_SERVER "­«·s¾ã²z¦øªA¾¹ %1 ªº¸ê°T" - IDS_ACTION_SCOUT_CELL "´ú¸Õ Cell %1 ªº°ÝÃD" - IDS_ACTION_SCOUT_SERVER "´ú¸Õ¦øªA¾¹ %1 ªº°ÝÃD" - IDS_FIND_NOTHING_TITLE "¥¼¿ï¨ú«ü¥O" - IDS_FIND_NOTHING_DESC "¦p­n§ä¥X°õ¦æ§@·~ªº¤èªk¡A­º¥ý½Ð±q²M³æ¤¤¿ï¨ú¤@­Ó«ü¥O¦æ¡A©Î¬OÁä¤JÃöÁä¦r¡C" - IDS_FIND_UNKNOWN_TITLE "¤£©úªº«ü¥O" - IDS_FIND_UNKNOWN_DESC "¡uAFS ±b¤áºÞ²zµ{¦¡¡v§ä¤£¨ì ""%1"" «ü¥O¥ô¦óªº»¡©ú¥DÃD¡C" - IDS_HELPABOUT_DESC1 "ĵ§i¡G¦¹¹q¸£µ{¦¡¨üµÛ§@Åv»P°ê»Úªk³Wªº«OÅ@¡C +" - IDS_HELPABOUT_DESC2 "¥¼¸g±ÂÅv¦Ó½Æ»s©Î¤À°e¦¹³nÅé±N¾É­PÄY­«ªº¥Á¨Æ»P¦D¨Æ³B¤À¡A¨Ã±N¨Ìªk§@³ÌÄY¼Fªº³B¤À¡C\n\n+" - IDS_HELPABOUT_DESC3 "AFS ¬O¤@®a IBM ¤½¥q Transarc Corporation ªº°Ó¼Ð¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COLUMNS_TITLE "ª½Äæ - AFS ±b¤áºÞ²zµ{¦¡" - IDS_USER_PROPERTIES_TITLE_MULTIPLE "¦h­«¨Ï¥ÎªÌ - ¤º®e" - IDS_USER_PROPERTIES_TITLE "¨Ï¥ÎªÌ %1 - ¤º®e" - IDS_USER_NAME_MULTIPLE "¨Ï¥ÎªÌ " - IDS_ACCOUNTACCESS_OWNER "°ß¦³±b¤á©Ò¦³¤H" - IDS_ACCOUNTACCESS_GROUP "°ß¦³¸s²Õ¦¨­û" - IDS_ACCOUNTACCESS_ANYONE "¥ô¦ó¤H" - IDS_ACCOUNTACCESS_MIXED "¡]¦h­«³]©w¡^" - IDS_USER_KEY "%1\nª©¥» %2, Àˬd¶q %3" - IDS_USER_KEY_HIDDEN "¡]ÁôÂùê»Úªº¯Á¤ÞÁä­È¡^" - IDS_USER_KEY_UNKNOWN "¡]¤£©ú¡^" - IDS_USER_KEY_MULTIPLE "¡]¦h­«¯Á¤ÞÁä¡^" - IDS_ACTION_USER_CHANGE "Åܧó¨Ï¥ÎªÌ %1 ªº¤º®e" - IDS_COUNT_WEEKS "%1w" - IDS_COUNT_DAYS "%1d" - IDS_COUNT_HOURS "%1h" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COUNT_MINUTES "%1m" - IDS_COUNT_SECONDS "%1s" - IDS_GROUP_PROPERTIES_TITLE_MULTIPLE "¦h­«¸s²Õ - ¤º®e" - IDS_GROUP_PROPERTIES_TITLE "¸s²Õ %1 - ¤º®e" - IDS_GROUP_NAME_MULTIPLE "¸s²Õ " - IDS_ACCOUNTACCESS_OWNGROUP "°ß¦³¸s²Õ©Ò¦³¤H" - IDS_OWNER_MIXED "¦h­«©Ò¦³¤H" - IDS_CREATOR_MIXED "¦h­««Ø¥ßªÌ" - IDS_GROUP_CHANGEOWNER_TITLE "Åܧó¸s²Õ©Ò¦³¤H" - IDS_GROUP_CHANGEOWNER_PROMPT "©Ò¦³¤H¡G" - IDS_MEMBER_MIXED " ¡]³¡¥÷¡^" - IDS_USER_SHOW_MEMBER_TITLE "¦¹¨Ï¥ÎªÌ©ÒÄݪº©Ò¦³¸s²Õ¡G" - IDS_USER_SHOW_OWNER_TITLE "¦¹¨Ï¥ÎªÌ¾Ö¦³ªº©Ò¦³¸s²Õ¡G" - IDS_GROUP_SHOW_MEMBER_TITLE "¦¹¸s²Õªº©Ò¦³¦¨­û¡G" - IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE "³o¨Ç¨Ï¥ÎªÌ©ÒÄݪº©Ò¦³¸s²Õ¡G" - IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE "³o¨Ç¸s²Õªº©Ò¦³¦¨­û¡G" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACTION_GROUP_RENAME "Åܧó¸s²Õ %1 ªº¦WºÙ¬° %2" - IDS_RENAME_TITLE "Åܧó¸s²Õ %1 ªº¦WºÙ" - IDS_GROUP_TITLE "¸s²Õ %1" - IDS_SHOW_USERS "¦¹ Cell ªº©Ò¦³¨Ï¥ÎªÌ" - IDS_SHOW_GROUPS "¦¹ Cell ªº©Ò¦³¸s²Õ" - IDS_GROUP_SHOW_OWNED_TITLE "¦¹¸s²Õ¾Ö¦³ªº©Ò¦³¸s²Õ¡G" - IDS_BROWSE_TITLE_OWNED "¿ï¨ú©Ò­n¾Ö¦³ªº¸s²Õ" - IDS_BROWSE_PROMPT_OWNED "¸s²Õ¡G" - IDS_BROWSE_CHECK_OWNED "¥uÅã¥Ü¥Ø«e¥¼³Q¾Ö¦³ªº¸s²Õ" - IDS_NEWUSER_PROPERTIES_TITLE "«Ø¥ß¨Ï¥ÎªÌ - ¶i¶¥" - IDS_NEWUSER_SHOW_MEMBER_TITLE "¦¹¨Ï¥ÎªÌ©ÒÄݪº©Ò¦³¸s²Õ¡G" - IDS_NEWUSER_SHOW_OWNER_TITLE "¦¹¨Ï¥ÎªÌ¾Ö¦³ªº©Ò¦³¸s²Õ¡G" - IDS_ACTION_CELL_CHANGE "Åܧó Cell %1 ªº¤º®e" - IDS_ACTION_USER_CREATE "«Ø¥ß¨Ï¥ÎªÌ %1 ªº±b¤á" - IDS_NEWGROUP_PROPERTIES_TITLE "«Ø¥ß¸s²Õ - ¶i¶¥" - IDS_NEWGROUP_SHOW_MEMBER_TITLE "¦¹·s¸s²Õªº°_©l¦¨­û¡G" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_FLAGS "ºX¸¹" - IDS_USRCOL_ADMIN "ºÞ²zªÌ¡H" - IDS_USRCOL_TICKET "³q¦æÃÒ¡H" - IDS_USRCOL_SYSTEM "¨t²Î¡H" - IDS_USRCOL_CHANGEPW "Åܧó±K½X¡H" - IDS_USRCOL_REUSEPW "­«ÂШϥαK½X¡H" - IDS_USRCOL_EXPIRES "±b¤á¹L´Á" - IDS_USRCOL_LASTPW "¤W¦¸Åܧó±K½X" - IDS_USRCOL_LASTMOD "¤W¦¸­×§ï" - IDS_USRCOL_LASTMODBY "¤W¦¸­×§ïªÌ" - IDS_USRCOL_LIFETIME "³q¦æÃҥͩR¶g´Á" - IDS_USRCOL_CDAYPW "±K½X¹L´Á" - IDS_USRCOL_CFAILLOGIN "µn¤J¥¢±Ñ" - IDS_USRCOL_CSECLOCK "µn¤J¥¢±ÑÂê©w®É¶¡" - IDS_USRCOL_CGROUPMAX "¸s²Õ«Ø¥ß°tÃB" - IDS_USRCOL_UID "UID" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_USRCOL_OWNER "©Ò¦³¤H" - IDS_USRCOL_CREATOR "«Ø¥ßªÌ" - IDS_USRCOL_STATUS "ª¬ºA" - IDS_USRFLAG_ADMIN "A " - IDS_USRFLAG_TICKET "T " - IDS_USRFLAG_ENCRYPT "E " - IDS_USRFLAG_CHANGEPW "C " - IDS_USRFLAG_REUSEPW "R " - IDS_YES "¬O" - IDS_NO "§_" - IDS_GRPCOL_CMEMBERS "¦¨­û­p¼Æ" - IDS_GRPCOL_UID "UID" - IDS_GRPCOL_OWNER "©Ò¦³¤H" - IDS_GRPCOL_CREATOR "«Ø¥ßªÌ" - IDS_COL_USERS "Cell ¤Wªº¨Ï¥ÎªÌ" - IDS_COL_GROUPS "Cell ¤Wªº¸s²Õ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NEWGROUP_SHOW_OWNED_TITLE "¦¹·s¸s²Õ¾Ö¦³ªº¸s²Õ¡G" - IDS_USER_DELETE_MULTIPLE - "ĵ§i¡I\n\n¦¹¶µ§@·~±N¥Ã¤[§R°£¥H¤U¨Ï¥ÎªÌªº±b¤á¡G %1" - IDS_GROUP_DELETE_MULTIPLE "ĵ§i¡I\n\n¦¹¶µ§@·~±N¥Ã¤[§R°£¥H¤U¸s²Õ¡G %1¡C" - IDS_ACTION_GROUP_CREATE "¥¿¦b«Ø¥ß¸s²Õ %1" - IDS_ACTION_USER_DELETE "§R°£¨Ï¥ÎªÌ %1 ªº±b¤á" - IDS_ACTION_GROUP_DELETE "¥¿¦b§R°£¸s²Õ %1" - IDS_CELL_PROPERTIES_TITLE "Cell %1 - ¤º®e" - IDS_MACHINES_ALL "Cell %1 ¤¤©Ò¦³ªº IP ¦ì§}±b¤á¡G" - IDS_MACHINES_PATTERN "Cell %1 ¤¤©Ò¿ï©wªº IP ¦ì§}±b¤á¡G" - IDS_TAB_MACHINES "¦ì§}" - IDS_MACHINE_DELETE_MULTIPLE - "ĵ§i¡I\n\n¦¹¶µ§@·~±N¥Ã¤[§R°£¥H¤Uªº IP ¦ì§}±b¤á¡G %1" - IDS_NEWMACHINE_PROPERTIES_TITLE "«Ø¥ß IP ¦ì§}±b¤á - ¶i¶¥" - IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE "¦h­« IP ¦ì§}±b¤á - ¤º®e" - IDS_MACHINE_PROPERTIES_TITLE "IP ¦ì§}±b¤á %1 - ¤º®e" - IDS_COL_MACHINES "Cell ¤¤ªº IP ¦ì§}±b¤á" - IDS_MCHCOL_NAME "IP ¦ì§}" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BROWSE_TITLE_JOIN "¿ï¨ú©Ò­n¥[¤Jªº¸s²Õ" - IDS_BROWSE_PROMPT_JOIN "¸s²Õ¡G" - IDS_BROWSE_CHECK_JOIN "¥uÅã¥Ü¥Ø«e¥¼¥[¤Jªº¸s²Õ" - IDS_BROWSE_TITLE_OWN "¿ï¨ú©Ò­n¾Ö¦³ªº¸s²Õ" - IDS_BROWSE_PROMPT_OWN "¸s²Õ¡G" - IDS_BROWSE_CHECK_OWN "¥uÅã¥Ü¥Ø«e¥¼³Q¾Ö¦³ªº¸s²Õ" - IDS_BROWSE_TITLE_MEMBER "¿ï¨ú­n¥[¤Jªº¨Ï¥ÎªÌ" - IDS_BROWSE_PROMPT_MEMBER "¨Ï¥ÎªÌ¡G" - IDS_BROWSE_CHECK_MEMBER "¥uÅã¥Ü«D¦¨­ûªº¨Ï¥ÎªÌ" - IDS_SEPARATORS ",;" - IDS_ACTION_GROUP_CHANGE "Åܧó¸s²Õ %1 ªº¤º®e" - IDS_ACTION_GROUP_MEMBER_ADD "·s¼W¨Ï¥ÎªÌ %2 ¨ì¸s²Õ %1" - IDS_ACTION_GROUP_MEMBER_REMOVE "±N¨Ï¥ÎªÌ %2 ±q¸s²Õ %1 ²¾°£" - IDS_ACTION_USER_PW_CHANGE "³]©w¨Ï¥ÎªÌ %1 ªº±K½X" - IDS_UNKNOWN_NAME "¡]¤£©ú¡^" - IDS_ACTION_USER_UNLOCK "¸Ñ°£Âê©w¨Ï¥ÎªÌ %1 ªº±b¤á" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MCHCOL_CGROUPMAX "¸s²Õ«Ø¥ß°tÃB" - IDS_MCHCOL_UID "±b¤á ID" - IDS_MCHCOL_OWNER "©Ò¦³¤H" - IDS_MCHCOL_CREATOR "«Ø¥ßªÌ" - IDS_OPTIONS_TITLE "AFS ±b¤áºÞ²zµ{¦¡¿ï¶µ" - IDS_WARNING_TITLE "ĵ§i" - IDS_WARNING_SYSTEM_ACCOUNT - "¹ï %1 ±b¤á¶i¦æÅܧó®É¥²¶·¤p¤ß¡A¦]¬°¤£·íªºÅܧó±N¾É­P AFS ³¡¥÷¥\¯àµLªk¥¿±`¹B§@¡C\n\n±z½T©w­nÄ~Äò¡H" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_ADDUSER "pts adduser" - IDS_COMMAND_PTS_CHOWN "pts chown" - IDS_COMMAND_PTS_CREATEGROUP "pts creategroup" - IDS_COMMAND_PTS_CREATEUSER "pts createuser" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_PTS_DELETE "pts delete" - IDS_COMMAND_PTS_EXAMINE "pts examine" - IDS_COMMAND_PTS_LISTMAX "pts listmax" - IDS_COMMAND_PTS_LISTOWNED "pts listowned" - IDS_COMMAND_PTS_MEMBERSHIP "pts membership" - IDS_COMMAND_PTS_REMOVEUSER "pts removeuser" - IDS_COMMAND_PTS_RENAME "pts rename" - IDS_COMMAND_PTS_SETFIELDS "pts setfields" - IDS_COMMAND_PTS_SETMAX "pts setmax" - IDS_COMMAND_KAS_CREATE "kas create" - IDS_COMMAND_KAS_DELETE "kas delete" - IDS_COMMAND_KAS_EXAMINE "kas examine" - IDS_COMMAND_KAS_GETRANDOMKEY "kas getrandomkey" - IDS_COMMAND_KAS_LIST "kas list" - IDS_COMMAND_KAS_SETFIELDS "kas setfields" - IDS_COMMAND_KAS_SETKEY "kas setkey" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_COMMAND_KAS_SETPASSWORD "kas setpassword" - IDS_COMMAND_KAS_STRINGTOKEY "kas stringtokey" - IDS_COMMAND_KAS_UNLOCK "kas unlock" - IDS_MACHINE_SHOW_MEMBER_TITLE "¦¹±b¤á©ÒÄݪº©Ò¦³¸s²Õ¡G" - IDS_MACHINE_SHOW_OWNER_TITLE "¦¹±b¤á¾Ö¦³ªº©Ò¦³¸s²Õ¡G" - IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE "³o¨Ç±b¤á©ÒÄݪº©Ò¦³¸s²Õ¡G" - IDS_NEWMACHINE_SHOW_MEMBER_TITLE "¦¹±b¤á©ÒÄݪº©Ò¦³¸s²Õ¡G" - IDS_NEWMACHINE_SHOW_OWNER_TITLE "¦¹±b¤á¾Ö¦³ªº©Ò¦³¸s²Õ¡G" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_BAD_REMOTE_SERVER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk©M°õ¦æ©ó %1 ¹q¸£¤WªººÞ²zµ{§Ç¨ú±oÁpô¡C \n\n±z¥i¥H±q¨ä¥L¹q¸£°õ¦æ TaAfsAdmSvr.exe µ{¦¡¡A¥H»·ºÝ¤è¦¡°õ¦æºÞ²z§@·~¡C" - IDS_ERROR_BAD_LOCAL_SERVER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡v§ä¤£¨ì TaAfsAdmSvr.exe µ{¦¡¡A©ÎªÌµLªkÅý¹q¸£°õ¦æ AFS ºÞ²z¡C" - IDS_ERROR_CANT_OPEN_CELL - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk©M %1 Cell ªº¦øªA¾¹¨ú±oÁpô¡C\n\n½Ð­«·sÀˬd±z©ÒÁä¤Jªº Cell ¦WºÙ¬O§_¥¿½T¡C" - IDS_ERROR_BADCREDENTIALS - "µLªkÃѧO±z©Ò¿é¤Jªº AFS ¨­¥÷¡A©Î¬O±z©Ò«ü©wªº±K½X¦³»~¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_TRANSLATED "¿ù»~½X 0x%1 (%2)¡G\n\n%3" - IDS_ERROR_NOTTRANSLATED "¿ù»~½X 0x%1 (%2) µLªkÃѧO¡C" - IDS_ERROR_USER_MULTIPROP - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅã¥Ü©Ò­n¨Dªºµøµ¡¡A¦]¬°¤º®eµøµ¡¤w¸g¬°¤@©Î¦h¦W©Ò¿ï¨úªº¨Ï¥ÎªÌ©Ò¶}±Ò¡C" - IDS_ERROR_CANT_CHANGE_USER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¨Ï¥ÎªÌ %1 ªº¤º®e¡C" - IDS_ERROR_GROUP_MULTIPROP - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅã¥Ü©Ò­n¨Dªºµøµ¡¡A¦]¬°¤º®eµøµ¡¤w¸g¬°¤@©Î¦h¶µ©Ò¿ï¨úªº¸s²Õ©Ò¶}±Ò¡C" - IDS_ERROR_CANT_CHANGE_GROUP "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¸s²Õ %1 ªº¤º®e¡C" - IDS_ERROR_CANT_TRANSLATE_USER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡v§ä¤£¨ì±z©Ò«ü©wªº¨Ï¥ÎªÌ¡C\n\n½Ð½T©w±z©ÒÁä¤Jªº¦WºÙµL»~¡C" - IDS_ERROR_CANT_TRANSLATE_GROUP - "¡uAFS ±b¤áºÞ²zµ{¦¡¡v§ä¤£¨ì±z©Ò«ü©wªº¨Ï¥ÎªÌ¡C\n\n½Ð½T©w±z©ÒÁä¤Jªº¦WºÙµL»~¡C" - IDS_ERROR_CANT_GET_USERPROP "¡uAFS ±b¤áºÞ²zµ{¦¡¡v§ä¤£¨ì¨Ï¥ÎªÌ %1 ªº¤º®e¡C" - IDS_ERROR_CANT_CHANGE_PASSWORD - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¨Ï¥ÎªÌ %1 ªº±K½X¡C" - IDS_ERROR_CANT_GET_RANDOM_KEY - "¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡vµLªk²£¥ÍÀH¾÷¥[±Kª÷Æ_¡C" - IDS_ERROR_CANT_SET_GROUPS - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¨Ï¥ÎªÌ %1 ªº«ü©w¸s²Õ²M³æ¡C" - IDS_ERROR_CANT_SET_GROUPS_MULTIPLE - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¥H¤U¨Ï¥ÎªÌ %1 ªº«ü©w¸s²Õ²M³æ¡G" - IDS_ERROR_CANT_UNLOCK "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk¸Ñ°£Âê©w¨Ï¥ÎªÌ %1 ªº±b¤á¡C" - IDS_ERROR_CANT_UNLOCK_MULTIPLE - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk¸Ñ°£Âê©w¥H¤U¨Ï¥ÎªÌ %1 ªº±b¤á¡G" - IDS_ERROR_CANT_SET_MEMBERS - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¸s²Õ %1 ªº¦¨­û²M³æ¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¥H¤U¸s²Õªº¦¨­û²M³æ¡G%1¡C" - IDS_ERROR_CANT_RENAME_GROUP - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk±N %1 ¸s²Õ§ó¦W¬° ""%2""¡C" - IDS_ERROR_CANT_CHANGE_OWNER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó %1 ¸s²Õªº©Ò¦³¤H¡C" - IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó¥H¤U¸s²Õªº©Ò¦³¤H¡G%1¡C" - IDS_ERROR_CANT_CHANGE_CELL "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªkÅܧó %1 Cell ªº¤º®e¡C" - IDS_ERROR_NO_PASSWORD_GIVEN "±z¥²¶·¬°±z©Ò«Ø¥ßªº¨Ï¥ÎªÌ±b¤á«ü©w¤@­Ó±K½X¡C" - IDS_ERROR_MISMATCH_PASSWORD_GIVEN "±z¬°·s¨Ï¥ÎªÌ±b¤á©Ò¿é¤Jªº±K½X¨Ã¤£¬Û²Å¡C" - IDS_ERROR_CANT_CREATE_USER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk¬°¨Ï¥ÎªÌ %1 «Ø¥ß±b¤á¡C" - IDS_ERROR_CANT_CREATE_GROUP "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk«Ø¥ß¸s²Õ %1¡C" - IDS_ERROR_CANT_DELETE_USER - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk§R°£¨Ï¥ÎªÌ %1 ªº±b¤á¡C" - IDS_ERROR_CANT_DELETE_USER_MULTIPLE - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk§R°£¥H¤U¨Ï¥ÎªÌªº±b¤á¡G%1¡C" - IDS_ERROR_CANT_DELETE_GROUP "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk§R°£¸s²Õ %1¡C" - IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE - "¡uAFS ±b¤áºÞ²zµ{¦¡¡vµLªk§R°£¥H¤U¸s²Õ¡G%1¡C" - IDS_ERROR_BAD_REMOTE_SERVER_INSTALL - "¥Ñ©ó¨Ã¥¼¥¿½T¦w¸Ë¡uAFS ±±¨î¤¤¤ß¡v¡A¦]¦¹µLªk±Ò°Ê¡uAFS ±b¤áºÞ²zµ{¦¡¡v¡C\n\n±z¥²¶·­«·s¦w¸Ë¡uAFS ±±¨î¤¤¤ß¡v¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CMDLINE_TITLE "¿ù»~ - AFS ±b¤áºÞ²zµ{¦¡" - IDS_CMDLINE_SYNTAX "±z¬°¡uAFS ±b¤áºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C" - IDS_CMDLINE_UNRECOGNIZED - "±z¬°¡uAFS ±b¤áºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1"" °Ñ¼Æ¬OµLªk¿ëÃѪº¡C" - IDS_CMDLINE_DUPLICATE "±z¬°¡uAFS ±b¤áºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1"" °Ñ¼Æªº«ü©w¦¸¼Æ¶W¹L¤@¦¸¡C" - IDS_CMDLINE_UNEXPECTVALUE - "±z¬°¡uAFS ±b¤áºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1"" °Ñ¼Æ¤£±o³Q½á¤©¤@­Ó­È¡C" - IDS_CMDLINE_MISSINGVAL "±z¬°¡uAFS ±b¤áºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n ""%1"" °Ñ¼Æ¤§«á¥²¶·¬O¤@­Ó­È¡C" - IDS_CMDLINE_USERPASSWORD - "±z¬°¡uAFS ±b¤áºÞ²zµ{¦¡¡v©Ò«ü©wªº«ü¥O¦æµL®Ä¡C\n\n¦p­n¨ú±o·sªº AFS °O¸¹¡A""/USER"" »P ""/PASSWORD"" °Ñ¼Æ¥²¶·¦P®É«ü©w¡C" -END - -#endif // Chinese (Taiwan) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/afsusrmgr/main.cpp b/src/WINNT/afsusrmgr/main.cpp deleted file mode 100644 index 50952302c..000000000 --- a/src/WINNT/afsusrmgr/main.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "messages.h" -#include "window.h" -#include "cmdline.h" -#include "usr_col.h" -#include "usr_create.h" -#include "usr_search.h" -#include "grp_col.h" -#include "grp_create.h" -#include "mch_col.h" -#include "mch_create.h" -#include "creds.h" -#include "action.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -GLOBALS g; -GLOBALS_RESTORED gr; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow); -void ExitApplication (void); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmdLineA, int nCmdShow) -{ - LPTSTR pszCmdLine = AnsiToString (pszCmdLineA); - - if (InitApplication (hInst, pszCmdLine, nCmdShow)) - { - AfsAppLib_MainPump(); - } - ExitApplication(); - - FreeString (pszCmdLine, pszCmdLineA); - return g.rc; -} - - -BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow) -{ - TaLocale_LoadCorrespondingModule (hInst); - - memset (&g, 0x00, sizeof(g)); - g.hInst = hInst; - g.hAccel = TaLocale_LoadAccelerators (ACCEL_MAIN); - - HWND hPrevious; - TCHAR szTitle[ cchRESOURCE ]; - GetString (szTitle, IDS_APP_TITLE); - if ((hPrevious = FindWindow (TEXT("AFSAccountManagerClass"), szTitle)) != NULL) - { - SetFocus (hPrevious); - SendMessage (hPrevious, WM_SHOW_YOURSELF, 0, 0); - return FALSE; - } - - AfsAppLib_SetAppName(szTitle); - AfsAppLib_SetPumpRoutine(PumpMessage); - - TASKQUEUE_PARAMS tqp; - memset (&tqp, 0x00, sizeof(tqp)); - tqp.nThreadsMax = 10; - tqp.fnCreateTaskPacket = CreateTaskPacket; - tqp.fnPerformTask = PerformTask; - tqp.fnFreeTaskPacket = FreeTaskPacket; - AfsAppLib_InitTaskQueue (&tqp); - - Main_ConfigureHelp(); - - // Determine how the app is supposed to look--that is, remember what it - // looked like last time, and if there was no "last time", pick some - // decent defaults. - // - if (!RestoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED)) - { - memset (&gr, 0x00, sizeof(gr)); - SetRectEmpty (&gr.rMain); - gr.cminRefreshRate = 60; // 1 hour default refresh rate - - User_SetDefaultCreateParams (&gr.CreateUser); - Group_SetDefaultCreateParams (&gr.CreateGroup); - Machine_SetDefaultCreateParams (&gr.CreateMachine); - Actions_SetDefaultView (&gr.viewAct); - User_SetDefaultView (&gr.viewUsr, &gr.ivUsr); - Group_SetDefaultView (&gr.viewGrp, &gr.ivGrp); - Machine_SetDefaultView (&gr.viewMch, &gr.ivMch); - Users_SetDefaultSearchParams (&gr.SearchUsers); - } - - // Create a variation on WC_DIALOG, so we get appropriate icons on - // our windows. - // - WNDCLASS wc; - GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc); - wc.hInstance = THIS_HINST; - wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); - wc.lpszClassName = TEXT("AFSAccountManagerClass"); - wc.style |= CS_GLOBALCLASS; - RegisterClass (&wc); - - // Okay, the big step: create the main window. Note that it doesn't - // get shown yet! - // - CMDLINEOP op = ParseCommandLine (pszCmdLine); - if (op == opCLOSEAPP) - return FALSE; - - // Okay, the big step: create the main window. - // Note that it doesn't get shown yet! - // - g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DialogProc); - if (g.hMain == NULL) - return FALSE; - - if (op != opNOCELLDIALOG) - { - if (OpenCellDialog() != IDOK) - return FALSE; - } - - return TRUE; -} - - -void ExitApplication (void) -{ - if (g.idClient) - { - ULONG status; - if (g.idCell) - asc_CellClose (g.idClient, g.idCell, &status); - AfsAppLib_CloseAdminServer(); - } -} - - -void Quit (int rc) -{ - if (g.hMain && IsWindow(g.hMain)) - { - WINDOWPLACEMENT wpl; - wpl.length = sizeof(wpl); - if (GetWindowPlacement (g.hMain, &wpl)) - gr.rMain = wpl.rcNormalPosition; - } - - StoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED); - PostQuitMessage (0); -} - - -void PumpMessage (MSG *lpm) -{ - if (g.hMain && IsWindow (g.hMain)) - { - if (GetActiveWindow()) - { - if (TranslateAccelerator (GetActiveWindow(), g.hAccel, lpm)) - return; - } - } - - if (!IsMemoryManagerMessage (lpm)) - { - TranslateMessage (lpm); - DispatchMessage (lpm); - } -} - - -BOOL cdecl StartThread (DWORD (WINAPI *lpfnStart)(PVOID lp), ...) -{ - va_list arg; - va_start (arg, lpfnStart); - PVOID lp = va_arg (arg, PVOID); - - DWORD dwThreadID; - HANDLE hThread; - - if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)lpfnStart, lp, 0, &dwThreadID)) == NULL) - return FALSE; - - SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL); - return TRUE; -} - diff --git a/src/WINNT/afsusrmgr/mch_col.cpp b/src/WINNT/afsusrmgr/mch_col.cpp deleted file mode 100644 index 8f413c5ec..000000000 --- a/src/WINNT/afsusrmgr/mch_col.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "mch_col.h" - - -/* - * USER-VIEW COLUMNS __________________________________________________________ - * - */ - -void Machine_SetDefaultView (LPVIEWINFO lpvi, ICONVIEW *piv) -{ - lpvi->lvsView = FLS_VIEW_SMALL; - lpvi->nColsAvail = nMACHINECOLUMNS; - - for (size_t iCol = 0; iCol < nMACHINECOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = MACHINECOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = MACHINECOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = mchcolNAME; - - lpvi->nColsShown = 2; - lpvi->aColumns[0] = (int)mchcolNAME; - lpvi->aColumns[1] = (int)mchcolUID; - - *piv = ivSTATUS; -} - - -void Machine_GetColumn (ASID idObject, MACHINECOLUMN iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType) -{ - if (pszText) - *pszText = TEXT('\0'); - if (pstDate) - memset (pstDate, 0x00, sizeof(SYSTEMTIME)); - if (pcsec) - *pcsec = 0; - if (pcType) - *pcType = ctALPHABETIC; - - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idObject, &Properties)) - { - switch (iCol) - { - case mchcolNAME: - if (pcType) - *pcType = ctALPHABETIC; - if (pszText) - lstrcpy (pszText, Properties.szName); - break; - - case mchcolCGROUPMAX: - if (pcType) - *pcType = ctNUMERIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.cgroupCreationQuota); - } - break; - - case mchcolUID: - if (pcType) - *pcType = ctNUMERIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.uidName); - } - break; - - case mchcolOWNER: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - { - if (Properties.u.UserProperties.PTSINFO.szOwner[0]) - wsprintf (pszText, TEXT("%s (%ld)"), Properties.u.UserProperties.PTSINFO.szOwner, Properties.u.UserProperties.PTSINFO.uidOwner); - else - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.uidOwner); - } - } - break; - - case mchcolCREATOR: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - { - if (Properties.u.UserProperties.PTSINFO.szCreator[0]) - wsprintf (pszText, TEXT("%s (%ld)"), Properties.u.UserProperties.PTSINFO.szCreator, Properties.u.UserProperties.PTSINFO.uidCreator); - else - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.uidCreator); - } - } - break; - } - } -} - diff --git a/src/WINNT/afsusrmgr/mch_col.h b/src/WINNT/afsusrmgr/mch_col.h deleted file mode 100644 index 839c865e9..000000000 --- a/src/WINNT/afsusrmgr/mch_col.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MCH_COL_H -#define MCH_COL_H - -#include "display.h" - - -/* - * MACHINELIST COLUMNS ________________________________________________________ - * - */ - -typedef enum - { - mchcolNAME, - mchcolCGROUPMAX, - mchcolUID, - mchcolOWNER, - mchcolCREATOR - } MACHINECOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -MACHINECOLUMNS[] = - { - { IDS_MCHCOL_NAME, 100 }, // mchcolNAME - { IDS_MCHCOL_CGROUPMAX, 50 | COLUMN_RIGHTJUST }, // mchcolCGROUPMAX - { IDS_MCHCOL_UID, 50 | COLUMN_RIGHTJUST }, // mchcolUID - { IDS_MCHCOL_OWNER, 100 }, // mchcolOWNER - { IDS_MCHCOL_CREATOR, 100 }, // mchcolCREATOR - }; - -#define nMACHINECOLUMNS (sizeof(MACHINECOLUMNS)/sizeof(MACHINECOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Machine_SetDefaultView (LPVIEWINFO lpvi, ICONVIEW *piv); - -void Machine_GetColumn (ASID idObject, MACHINECOLUMN iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType); - - -#endif - diff --git a/src/WINNT/afsusrmgr/mch_create.cpp b/src/WINNT/afsusrmgr/mch_create.cpp deleted file mode 100644 index 6dc82158a..000000000 --- a/src/WINNT/afsusrmgr/mch_create.cpp +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_prop.h" -#include "mch_create.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - int uid; - USERPROPINFO Advanced; - } CREATEMACHINEDLG, *LPCREATEMACHINEDLG; - -#define UID_AUTOSELECT ((int)0) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Machine_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Machine_Create_OnInitDialog (HWND hDlg); -void Machine_Create_OnNames (HWND hDlg); -void Machine_Create_OnID (HWND hDlg); -void Machine_Create_OnAdvanced (HWND hDlg); -BOOL Machine_Create_OnOK (HWND hDlg); -void Machine_Create_OnEndTask_ObjectGet (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Machine_SetDefaultCreateParams (LPUSERPROPINFO lpp) -{ - memset (lpp, 0x00, sizeof(USERPROPINFO)); - lpp->fSeal = FALSE; - lpp->fAdmin = FALSE; - lpp->fGrantTickets = TRUE; - lpp->fMachine = TRUE; - lpp->cGroupQuota = cGROUPQUOTA_DEFAULT; - lpp->aaStatus = aaANYONE; - lpp->aaOwned = aaANYONE; - lpp->aaMember = aaANYONE; - lpp->fCreateKAS = FALSE; - lpp->fCreatePTS = TRUE; - - // All the KAS stuff is zero - // - lpp->csecLifetime = 0; - lpp->fExpires = FALSE; - lpp->fCanChangePw = 0; - lpp->fCanReusePw = FALSE; - lpp->cdayPwExpires = 0; - lpp->cFailLock = 0; - lpp->csecFailLock = 0; -} - - -void Machine_ShowCreate (HWND hParent) -{ - LPCREATEMACHINEDLG lpp = New (CREATEMACHINEDLG); - memset (lpp, 0x00, sizeof(CREATEMACHINEDLG)); - memcpy (&lpp->Advanced, &gr.CreateMachine, sizeof(USERPROPINFO)); - lpp->uid = UID_AUTOSELECT; - lpp->Advanced.pGroupsMember = NULL; - lpp->Advanced.pGroupsOwner = NULL; - - (void)ModalDialogParam (IDD_NEWMACHINE, hParent, (DLGPROC)Machine_Create_DlgProc, (LPARAM)lpp); - - if (lpp->Advanced.pGroupsMember) - asc_AsidListFree (&lpp->Advanced.pGroupsMember); - if (lpp->Advanced.pGroupsOwner) - asc_AsidListFree (&lpp->Advanced.pGroupsOwner); - Delete (lpp); -} - - -BOOL CALLBACK Machine_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_NEWMACHINE, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Machine_Create_OnInitDialog (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskOBJECT_GET) - Machine_Create_OnEndTask_ObjectGet (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (Machine_Create_OnOK (hDlg)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_ADVANCED: - Machine_Create_OnAdvanced (hDlg); - break; - - case IDC_NEWUSER_NAME: - Machine_Create_OnNames (hDlg); - break; - - case IDC_NEWUSER_ID_AUTO: - case IDC_NEWUSER_ID_MANUAL: - Machine_Create_OnID (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Machine_Create_OnInitDialog (HWND hDlg) -{ - LPCREATEMACHINEDLG lpp = (LPCREATEMACHINEDLG)GetWindowLong (hDlg, DWL_USER); - - // Fix the title of the dialog - // - ULONG status; - TCHAR szName[ cchNAME ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szName, &status); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWUSER_TITLE, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_NEWUSER_TITLE, pszText); - FreeString (pszText); - - // Attach a spinner to the ID control - // - CheckDlgButton (hDlg, IDC_NEWUSER_ID_AUTO, TRUE); - CreateSpinner (GetDlgItem (hDlg, IDC_NEWUSER_ID), 10, FALSE, 1, 1, (int)-1); - Machine_Create_OnID (hDlg); - - StartTask (taskOBJECT_GET, hDlg, (PVOID)(g.idCell)); -} - - -void Machine_Create_OnNames (HWND hDlg) -{ - TCHAR szSeparators[ cchRESOURCE ]; - GetString (szSeparators, IDS_SEPARATORS); - lstrcat (szSeparators, TEXT(" \t")); - - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_NEWUSER_NAME)); - EnableWindow (GetDlgItem (hDlg, IDOK), (pszNames && *pszNames)); - - BOOL fMultiple = FALSE; - for (LPTSTR psz = pszNames; !fMultiple && psz && *psz; ++psz) - { - if (lstrchr (szSeparators, *psz)) - fMultiple = TRUE; - } - FreeString (pszNames); - - EnableWindow (GetDlgItem (hDlg, IDC_NEWUSER_ID_AUTO), !fMultiple); - EnableWindow (GetDlgItem (hDlg, IDC_NEWUSER_ID_MANUAL), !fMultiple); - if (fMultiple) - { - CheckDlgButton (hDlg, IDC_NEWUSER_ID_AUTO, TRUE); - CheckDlgButton (hDlg, IDC_NEWUSER_ID_MANUAL, FALSE); - Machine_Create_OnID (hDlg); - } -} - - -void Machine_Create_OnID (HWND hDlg) -{ - BOOL fEnable = IsDlgButtonChecked (hDlg, IDC_NEWUSER_ID_MANUAL); - EnableWindow (GetDlgItem (hDlg, IDC_NEWUSER_ID), fEnable); -} - - -void Machine_Create_OnAdvanced (HWND hDlg) -{ - LPCREATEMACHINEDLG lpp = (LPCREATEMACHINEDLG)GetWindowLong (hDlg, DWL_USER); - lpp->Advanced.pUserList = NULL; - lpp->Advanced.fDeleteMeOnClose = FALSE; - lpp->Advanced.fShowModal = TRUE; - lpp->Advanced.hParent = hDlg; - lpp->Advanced.fMachine = TRUE; - lpp->Advanced.fApplyGeneral = FALSE; - lpp->Advanced.fApplyAdvanced = FALSE; - User_ShowProperties (&lpp->Advanced, uptMEMBERSHIP); -} - - -BOOL Machine_Create_OnOK (HWND hDlg) -{ - LPCREATEMACHINEDLG lpp = (LPCREATEMACHINEDLG)GetWindowLong (hDlg, DWL_USER); - - // Start a background task to do all this work. - // - LPUSER_CREATE_PARAMS pTask = New (USER_CREATE_PARAMS); - memset (pTask, 0x00, sizeof(USER_CREATE_PARAMS)); - - lstrcpy (pTask->szPassword, TEXT("")); - - if (IsDlgButtonChecked (hDlg, IDC_NEWUSER_ID_AUTO)) - pTask->idUser = UID_AUTOSELECT; - else // (IsDlgButtonChecked (hDlg, IDC_NEWUSER_ID_MANUAL)) - pTask->idUser = SP_GetPos (GetDlgItem (hDlg, IDC_NEWUSER_ID)); - - pTask->Properties.cgroupCreationQuota = lpp->Advanced.cGroupQuota; - pTask->Properties.aaListStatus = lpp->Advanced.aaStatus; - pTask->Properties.aaGroupsOwned = lpp->Advanced.aaOwned; - pTask->Properties.aaMembership = lpp->Advanced.aaMember; - - // All the KAS stuff is zero - // - pTask->Properties.fIsAdmin = FALSE; - pTask->Properties.fCanGetTickets = FALSE; - pTask->Properties.fEncrypt = FALSE; - pTask->Properties.fCanChangePassword = FALSE; - pTask->Properties.fCanReusePasswords = FALSE; - pTask->Properties.cdayPwExpire = 0; - pTask->Properties.csecTicketLifetime = 0; - pTask->Properties.cFailLogin = 0; - pTask->Properties.csecFailLoginLock = 0; - memset (&pTask->Properties.timeExpires, 0x00, sizeof(SYSTEMTIME)); - - // Copy over any lists-of-groups - // - if (lpp->Advanced.pGroupsMember) - asc_AsidListCopy (&pTask->pGroupsMember, &lpp->Advanced.pGroupsMember); - else - pTask->pGroupsMember = NULL; - - if (lpp->Advanced.pGroupsOwner) - asc_AsidListCopy (&pTask->pGroupsOwner, &lpp->Advanced.pGroupsOwner); - else - pTask->pGroupsOwner = NULL; - - // Crack the specified list of user names into a multi-string - // - TCHAR szSeparators[ cchRESOURCE ]; - GetString (szSeparators, IDS_SEPARATORS); - lstrcat (szSeparators, TEXT(" \t")); - - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_NEWUSER_NAME)); - LPCTSTR pszStart = pszNames; - while (lstrchr (szSeparators, *pszStart)) - ++pszStart; - - while (*pszStart) - { - // Find the first non-name character - // - LPCTSTR pszEnd = pszStart; - while (*pszEnd && !lstrchr(szSeparators, *pszEnd)) - ++pszEnd; - - // Copy off this particular name - // - TCHAR szName[ cchNAME ]; - lstrcpy (szName, pszStart); - szName[ pszEnd - pszStart ] = TEXT('\0'); - - if (szName[0]) - FormatMultiString (&pTask->mszNames, FALSE, TEXT("%1"), TEXT("%s"), szName); - - // Find the next valid-name character - // - pszStart = pszEnd; - while (lstrchr(szSeparators, *pszStart)) - ++pszStart; - } - FreeString (pszNames); - - // Do the real work of creating the user(s) - // - pTask->fCreateKAS = FALSE; - pTask->fCreatePTS = TRUE; - StartTask (taskUSER_CREATE, NULL, pTask); - - // Store these creation parameters as the new defaults - // - memcpy (&gr.CreateMachine, &lpp->Advanced, sizeof(USERPROPINFO)); - return TRUE; -} - - -void Machine_Create_OnEndTask_ObjectGet (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWUSER_ID_AUTO, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (TEXT("%1 (%2)"), TEXT("%s%ld"), szText, TASKDATA(ptp)->Properties.u.CellProperties.idUserMax+1); - SetDlgItemText (hDlg, IDC_NEWUSER_ID_AUTO, pszText); - FreeString (pszText); - - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_NEWUSER_ID))) - SP_SetPos (GetDlgItem (hDlg, IDC_NEWUSER_ID), TASKDATA(ptp)->Properties.u.CellProperties.idUserMax+1); - } -} - diff --git a/src/WINNT/afsusrmgr/mch_create.h b/src/WINNT/afsusrmgr/mch_create.h deleted file mode 100644 index ff57e6d2a..000000000 --- a/src/WINNT/afsusrmgr/mch_create.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MCH_CREATE_H -#define MCH_CREATE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Machine_SetDefaultCreateParams (LPUSERPROPINFO lpp); - -void Machine_ShowCreate (HWND hParent); - - -#endif - diff --git a/src/WINNT/afsusrmgr/mch_delete.cpp b/src/WINNT/afsusrmgr/mch_delete.cpp deleted file mode 100644 index dfdb722c4..000000000 --- a/src/WINNT/afsusrmgr/mch_delete.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "mch_delete.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Machine_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Machine_Delete_OnInitDialog (HWND hDlg); -void Machine_Delete_OnDestroy (HWND hDlg); -void Machine_Delete_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Machine_ShowDelete (LPASIDLIST pMachineList) -{ - ModalDialogParam (IDD_MACHINE_DELETE, g.hMain, Machine_Delete_DlgProc, (LPARAM)pMachineList); -} - - -BOOL CALLBACK Machine_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_MACHINE_DELETE, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Machine_Delete_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - Machine_Delete_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Machine_Delete_OnOK (hDlg); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - } - break; - } - - return FALSE; -} - - -void Machine_Delete_OnInitDialog (HWND hDlg) -{ - LPASIDLIST pMachineList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - - // Fix the title of the dialog - // - if (pMachineList->cEntries == 1) - { - ULONG status; - TCHAR szName[ cchNAME ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, pMachineList->aEntries[0].idObject, szName, &status); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_DELETE_TITLE, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_DELETE_TITLE, pszText); - FreeString (pszText); - } - else - { - LPTSTR pszNames = CreateNameList (pMachineList); - - LPTSTR pszText = FormatString (IDS_MACHINE_DELETE_MULTIPLE, TEXT("%s"), pszNames); - SetDlgItemText (hDlg, IDC_DELETE_TITLE, pszText); - FreeString (pszText); - - FreeString (pszNames); - } -} - - -void Machine_Delete_OnDestroy (HWND hDlg) -{ - LPASIDLIST pMachineList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - asc_AsidListFree (&pMachineList); -} - - -void Machine_Delete_OnOK (HWND hDlg) -{ - LPASIDLIST pMachineList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - - // Start a background task to do all the work. - // - LPUSER_DELETE_PARAMS pTask = New (USER_DELETE_PARAMS); - memset (pTask, 0x00, sizeof(USER_DELETE_PARAMS)); - pTask->fDeleteKAS = FALSE; - pTask->fDeletePTS = TRUE; - asc_AsidListCopy (&pTask->pUserList, &pMachineList); - StartTask (taskUSER_DELETE, NULL, pTask); -} - diff --git a/src/WINNT/afsusrmgr/mch_delete.h b/src/WINNT/afsusrmgr/mch_delete.h deleted file mode 100644 index 11386dcb8..000000000 --- a/src/WINNT/afsusrmgr/mch_delete.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MCH_DELETE_H -#define MCH_DELETE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Machine_ShowDelete (LPASIDLIST pMachineList); - - -#endif - diff --git a/src/WINNT/afsusrmgr/mch_tab.cpp b/src/WINNT/afsusrmgr/mch_tab.cpp deleted file mode 100644 index 116117a03..000000000 --- a/src/WINNT/afsusrmgr/mch_tab.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "mch_tab.h" -#include "mch_col.h" -#include "command.h" -#include "window.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdMachinesTab[] = { - { IDC_MACHINES_TITLE, raRepaint | raSizeX, 0, 0 }, - { IDC_ADVANCED, raMoveX, 0, 0 }, - { IDC_MACHINES_PATTERN, raMoveX, 0, 0 }, - { IDC_MACHINES_PATTERN_PROMPT, raRepaint | raMoveX, 0, 0 }, - { IDC_MACHINES_LIST, raSizeX | raSizeY, 0, 0 }, - { M_MACHINE_CREATE, raMoveX | raMoveY, 0, 0 }, - { M_MEMBERSHIP, raMoveX | raMoveY, 0, 0 }, - { M_PROPERTIES, raMoveX | raMoveY, 0, 0 }, - { IDC_STATIC, raRepaint, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_SEARCH_TIMER 0 - -#define msecSEARCH_TIMER 650 - -static struct - { - DWORD dwTickLastType; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Machines_EnableButtons (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Machines_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (Display_HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewMch)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - { - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - ResizeWindow (hDlg, awdMachinesTab, rwaMoveToHere, &rTab); - - HIMAGELIST hSmall = AfsAppLib_CreateImageList (FALSE); - HIMAGELIST hLarge = AfsAppLib_CreateImageList (TRUE); - FastList_SetImageLists (GetDlgItem (hDlg, IDC_MACHINES_LIST), hSmall, hLarge); - - FastList_SetSortFunction (GetDlgItem (hDlg, IDC_MACHINES_LIST), General_ListSortFunction); - - FL_RestoreView (GetDlgItem (hDlg, IDC_MACHINES_LIST), &gr.viewMch); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_MACHINES_LIST), Display_GetItemText, (DWORD)&gr.viewMch); - SetDlgItemText (hDlg, IDC_MACHINES_PATTERN, g.szPatternMachines); - Machines_EnableButtons(hDlg); - Display_PopulateMachineList(); - - l.dwTickLastType = 0; - } - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_MACHINES_LIST), &gr.viewMch); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdMachinesTab, rwaFixupGuts); - break; - - case WM_TIMER: - switch (wp) - { - case ID_SEARCH_TIMER: - if ( (l.dwTickLastType) && (GetTickCount() > l.dwTickLastType + msecSEARCH_TIMER) ) - { - KillTimer (hDlg, ID_SEARCH_TIMER); - Display_PopulateMachineList(); - } - break; - } - break; - - case WM_CONTEXTMENU: - POINT ptScreen; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - OnRightClick (pmMACHINE, GetDlgItem (hDlg, IDC_MACHINES_LIST), &ptScreen); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_MACHINES_PATTERN: - if (HIWORD(wp) == EN_UPDATE) - { - l.dwTickLastType = GetTickCount(); - KillTimer (hDlg, ID_SEARCH_TIMER); - SetTimer (hDlg, ID_SEARCH_TIMER, msecSEARCH_TIMER +15, NULL); - } - break; - - default: - OnContextCommand (LOWORD(wp)); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Main_SetMenus(); - Machines_EnableButtons(hDlg); - break; - - case FLN_LDBLCLICK: - PostMessage (hDlg, WM_COMMAND, MAKELONG(M_PROPERTIES,BN_CLICKED), (LPARAM)GetDlgItem (hDlg, M_PROPERTIES)); - break; - } - break; - } - - return FALSE; -} - - -void Machines_EnableButtons (HWND hDlg) -{ - BOOL fEnable = (Display_GetSelectedCount() != 0) ? TRUE : FALSE; - EnableWindow (GetDlgItem (hDlg, M_PROPERTIES), fEnable); - EnableWindow (GetDlgItem (hDlg, M_MEMBERSHIP), fEnable); -} - diff --git a/src/WINNT/afsusrmgr/mch_tab.h b/src/WINNT/afsusrmgr/mch_tab.h deleted file mode 100644 index c0027209a..000000000 --- a/src/WINNT/afsusrmgr/mch_tab.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MCH_TAB_H -#define MCH_TAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Machines_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/messages.h b/src/WINNT/afsusrmgr/messages.h deleted file mode 100644 index 5c667baeb..000000000 --- a/src/WINNT/afsusrmgr/messages.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MESSAGES_H -#define MESSAGES_H - -// WM_SHOW_YOURSELF is posted to g.hMain to cause the main window to be -// displayed once a cell has been selected and successfully opened. -// -// BOOL fForce = (BOOL)lp; // if !fForce, only show if g.idCell set -// -#define WM_SHOW_YOURSELF (WM_USER + 0x100) - -// WM_SHOW_ACTIONS is posted to g.hMain to cause the main window to open -// its Operations In Progress window. -// -#define WM_SHOW_ACTIONS (WM_USER + 0x101) - - -#endif - diff --git a/src/WINNT/afsusrmgr/options.cpp b/src/WINNT/afsusrmgr/options.cpp deleted file mode 100644 index adf9e03d5..000000000 --- a/src/WINNT/afsusrmgr/options.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "options.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cminREFRESH_MIN 1 // 15 minutes -#define cminREFRESH_DEFAULT 60 // 1 hour -#define cminREFRESH_MAX 10080 // 1 week - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Options_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Options_OnInitDialog (HWND hDlg); -void Options_OnApply (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void ShowOptionsDialog (HWND hParent) -{ - LPPROPSHEET psh = PropSheet_Create (IDS_OPTIONS_TITLE, TRUE, hParent, (LPARAM)0); - PropSheet_AddTab (psh, 0, IDD_OPTIONS, (DLGPROC)Options_DlgProc, (LPARAM)0, TRUE, TRUE); - PropSheet_ShowModal (psh); -} - - -BOOL CALLBACK Options_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_OPTIONS, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - Options_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Options_OnApply (hDlg); - break; - - case IDC_REFRESH: - EnableWindow (GetDlgItem (hDlg, IDC_REFRESH_RATE), IsDlgButtonChecked (hDlg, IDC_REFRESH)); - break; - } - break; - } - - return FALSE; -} - - -void Options_OnInitDialog (HWND hDlg) -{ - CheckDlgButton (hDlg, IDC_REGEXP_UNIX, !gr.fWindowsRegexp); - CheckDlgButton (hDlg, IDC_REGEXP_WINDOWS, gr.fWindowsRegexp); - - CheckDlgButton (hDlg, IDC_WARN_BADCREDS, gr.fWarnBadCreds); - - CheckDlgButton (hDlg, IDC_REFRESH, (gr.cminRefreshRate != 0)); - - LONG cminShow = (gr.cminRefreshRate != 0) ? gr.cminRefreshRate : cminREFRESH_DEFAULT; - CreateSpinner (GetDlgItem (hDlg, IDC_REFRESH_RATE), 10, FALSE, cminREFRESH_MIN, cminShow, cminREFRESH_MAX); - - EnableWindow (GetDlgItem (hDlg, IDC_REFRESH_RATE), IsDlgButtonChecked (hDlg, IDC_REFRESH)); -} - - -void Options_OnApply (HWND hDlg) -{ - gr.fWindowsRegexp = IsDlgButtonChecked (hDlg, IDC_REGEXP_WINDOWS); - - gr.fWarnBadCreds = IsDlgButtonChecked (hDlg, IDC_WARN_BADCREDS); - - LONG cminRateOld = gr.cminRefreshRate; - - if (!IsDlgButtonChecked (hDlg, IDC_REFRESH)) - gr.cminRefreshRate = 0; - else - gr.cminRefreshRate = SP_GetPos (GetDlgItem (hDlg, IDC_REFRESH_RATE)); - - if ((cminRateOld != gr.cminRefreshRate) && (g.idCell)) - { - StartTask (taskSET_REFRESH); - } -} - diff --git a/src/WINNT/afsusrmgr/options.h b/src/WINNT/afsusrmgr/options.h deleted file mode 100644 index 80d3084c5..000000000 --- a/src/WINNT/afsusrmgr/options.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef OPTIONS_H -#define OPTIONS_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowOptionsDialog (HWND hParent); - - -#endif - diff --git a/src/WINNT/afsusrmgr/resource.h b/src/WINNT/afsusrmgr/resource.h deleted file mode 100644 index 40049b1fd..000000000 --- a/src/WINNT/afsusrmgr/resource.h +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_APP_TITLE 0 -#define IDS_USRCOL_NAME 1 -#define IDS_GRPCOL_NAME 2 -#define IDS_BADCREDS_DESC 3 -#define IDS_TAB_USERS 4 -#define IDS_TAB_GROUPS 5 -#define IDS_CELL_NONE 6 -#define IDS_CRED_NONE 7 -#define IDS_CRED_EXP 8 -#define IDS_CRED_OK 9 -#define IDS_USERS_ALL 10 -#define IDS_USERS_PATTERN 11 -#define IDS_GROUPS_ALL 12 -#define IDS_GROUPS_PATTERN 13 -#define IDS_QUERYING_LONG 14 - -#define IDS_ACTION_DESC_NONE 16 -#define IDS_ACTION_DESC_ONE 17 -#define IDS_ACTION_DESC_MULT 18 -#define IDS_ACTCOL_OPERATION 19 -#define IDS_ACTCOL_ELAPSED 20 -#define IDS_ACTION_REFRESH_CELL 21 -#define IDS_ACTION_REFRESH_SERVER 22 -#define IDS_ACTION_SCOUT_CELL 23 -#define IDS_ACTION_SCOUT_SERVER 24 -#define IDS_FIND_NOTHING_TITLE 25 -#define IDS_FIND_NOTHING_DESC 26 -#define IDS_FIND_UNKNOWN_TITLE 27 -#define IDS_FIND_UNKNOWN_DESC 28 -#define IDS_HELPABOUT_DESC1 29 -#define IDS_HELPABOUT_DESC2 30 -#define IDS_HELPABOUT_DESC3 31 - -#define IDS_COLUMNS_TITLE 32 -#define IDS_USER_PROPERTIES_TITLE_MULTIPLE 33 -#define IDS_USER_PROPERTIES_TITLE 34 -#define IDS_USER_NAME_MULTIPLE 35 -#define IDS_ACCOUNTACCESS_OWNER 36 -#define IDS_ACCOUNTACCESS_GROUP 37 -#define IDS_ACCOUNTACCESS_ANYONE 38 -#define IDS_ACCOUNTACCESS_MIXED 39 -#define IDS_USER_KEY 40 -#define IDS_USER_KEY_HIDDEN 41 -#define IDS_USER_KEY_UNKNOWN 42 -#define IDS_USER_KEY_MULTIPLE 43 -#define IDS_ACTION_USER_CHANGE 44 -#define IDS_COUNT_WEEKS 45 -#define IDS_COUNT_DAYS 46 -#define IDS_COUNT_HOURS 47 - -#define IDS_COUNT_MINUTES 48 -#define IDS_COUNT_SECONDS 49 -#define IDS_GROUP_PROPERTIES_TITLE_MULTIPLE 50 -#define IDS_GROUP_PROPERTIES_TITLE 51 -#define IDS_GROUP_NAME_MULTIPLE 52 -#define IDS_ACCOUNTACCESS_OWNGROUP 53 -#define IDS_OWNER_MIXED 54 -#define IDS_CREATOR_MIXED 55 -#define IDS_GROUP_CHANGEOWNER_TITLE 56 -#define IDS_GROUP_CHANGEOWNER_PROMPT 57 -#define IDS_MEMBER_MIXED 58 -#define IDS_USER_SHOW_MEMBER_TITLE 59 -#define IDS_USER_SHOW_OWNER_TITLE 60 -#define IDS_GROUP_SHOW_MEMBER_TITLE 61 -#define IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE 62 -#define IDS_GROUP_SHOW_MEMBER_TITLE_MULTIPLE 63 - -#define IDS_ACTION_GROUP_RENAME 64 -#define IDS_RENAME_TITLE 65 -#define IDS_GROUP_TITLE 66 -#define IDS_SHOW_USERS 67 -#define IDS_SHOW_GROUPS 68 -#define IDS_GROUP_SHOW_OWNED_TITLE 69 -#define IDS_BROWSE_TITLE_OWNED 70 -#define IDS_BROWSE_PROMPT_OWNED 71 -#define IDS_BROWSE_CHECK_OWNED 72 -#define IDS_NEWUSER_PROPERTIES_TITLE 73 -#define IDS_NEWUSER_SHOW_MEMBER_TITLE 74 -#define IDS_NEWUSER_SHOW_OWNER_TITLE 75 -#define IDS_ACTION_CELL_CHANGE 76 -#define IDS_ACTION_USER_CREATE 77 -#define IDS_NEWGROUP_PROPERTIES_TITLE 78 -#define IDS_NEWGROUP_SHOW_MEMBER_TITLE 79 - -#define IDS_USRCOL_FLAGS 80 -#define IDS_USRCOL_ADMIN 81 -#define IDS_USRCOL_TICKET 82 -#define IDS_USRCOL_SYSTEM 83 -#define IDS_USRCOL_CHANGEPW 84 -#define IDS_USRCOL_REUSEPW 85 -#define IDS_USRCOL_EXPIRES 86 -#define IDS_USRCOL_LASTPW 87 -#define IDS_USRCOL_LASTMOD 88 -#define IDS_USRCOL_LASTMODBY 89 -#define IDS_USRCOL_LIFETIME 90 -#define IDS_USRCOL_CDAYPW 91 -#define IDS_USRCOL_CFAILLOGIN 92 -#define IDS_USRCOL_CSECLOCK 93 -#define IDS_USRCOL_CGROUPMAX 94 -#define IDS_USRCOL_UID 95 - -#define IDS_USRCOL_OWNER 96 -#define IDS_USRCOL_CREATOR 97 -#define IDS_USRCOL_STATUS 98 -#define IDS_USRFLAG_ADMIN 99 -#define IDS_USRFLAG_TICKET 100 -#define IDS_USRFLAG_ENCRYPT 101 -#define IDS_USRFLAG_CHANGEPW 102 -#define IDS_USRFLAG_REUSEPW 103 -#define IDS_YES 104 -#define IDS_NO 105 -#define IDS_GRPCOL_CMEMBERS 106 -#define IDS_GRPCOL_UID 107 -#define IDS_GRPCOL_OWNER 108 -#define IDS_GRPCOL_CREATOR 109 -#define IDS_COL_USERS 110 -#define IDS_COL_GROUPS 111 - -#define IDS_NEWGROUP_SHOW_OWNED_TITLE 112 -#define IDS_USER_DELETE_MULTIPLE 113 -#define IDS_GROUP_DELETE_MULTIPLE 114 -#define IDS_ACTION_GROUP_CREATE 115 -#define IDS_ACTION_USER_DELETE 116 -#define IDS_ACTION_GROUP_DELETE 117 -#define IDS_CELL_PROPERTIES_TITLE 118 -#define IDS_MACHINES_ALL 119 -#define IDS_MACHINES_PATTERN 120 -#define IDS_TAB_MACHINES 121 -#define IDS_MACHINE_DELETE_MULTIPLE 122 -#define IDS_NEWMACHINE_PROPERTIES_TITLE 123 -#define IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE 124 -#define IDS_MACHINE_PROPERTIES_TITLE 125 -#define IDS_COL_MACHINES 126 -#define IDS_MCHCOL_NAME 127 - -#define IDS_BROWSE_TITLE_JOIN 128 -#define IDS_BROWSE_PROMPT_JOIN 129 -#define IDS_BROWSE_CHECK_JOIN 130 -#define IDS_BROWSE_TITLE_OWN 131 -#define IDS_BROWSE_PROMPT_OWN 132 -#define IDS_BROWSE_CHECK_OWN 133 -#define IDS_BROWSE_TITLE_MEMBER 134 -#define IDS_BROWSE_PROMPT_MEMBER 135 -#define IDS_BROWSE_CHECK_MEMBER 136 -#define IDS_SEPARATORS 137 -#define IDS_ACTION_GROUP_CHANGE 138 -#define IDS_ACTION_GROUP_MEMBER_ADD 139 -#define IDS_ACTION_GROUP_MEMBER_REMOVE 140 -#define IDS_ACTION_USER_PW_CHANGE 141 -#define IDS_UNKNOWN_NAME 142 -#define IDS_ACTION_USER_UNLOCK 143 - -#define IDS_MCHCOL_CGROUPMAX 144 -#define IDS_MCHCOL_UID 145 -#define IDS_MCHCOL_OWNER 146 -#define IDS_MCHCOL_CREATOR 147 -#define IDS_OPTIONS_TITLE 148 - -#define IDS_COMMAND_PTS_ADDUSER 160 -#define IDS_COMMAND_PTS_CHOWN 161 -#define IDS_COMMAND_PTS_CREATEGROUP 162 -#define IDS_COMMAND_PTS_CREATEUSER 163 - -#define IDS_COMMAND_PTS_DELETE 176 -#define IDS_COMMAND_PTS_EXAMINE 177 -#define IDS_COMMAND_PTS_LISTMAX 178 -#define IDS_COMMAND_PTS_LISTOWNED 179 -#define IDS_COMMAND_PTS_MEMBERSHIP 180 -#define IDS_COMMAND_PTS_REMOVEUSER 181 -#define IDS_COMMAND_PTS_RENAME 182 -#define IDS_COMMAND_PTS_SETFIELDS 183 -#define IDS_COMMAND_PTS_SETMAX 184 -#define IDS_COMMAND_KAS_CREATE 185 -#define IDS_COMMAND_KAS_DELETE 186 -#define IDS_COMMAND_KAS_EXAMINE 187 -#define IDS_COMMAND_KAS_GETRANDOMKEY 188 -#define IDS_COMMAND_KAS_LIST 189 -#define IDS_COMMAND_KAS_SETFIELDS 190 -#define IDS_COMMAND_KAS_SETKEY 191 - -#define IDS_COMMAND_KAS_SETPASSWORD 192 -#define IDS_COMMAND_KAS_STRINGTOKEY 193 -#define IDS_COMMAND_KAS_UNLOCK 194 -#define IDS_MACHINE_SHOW_MEMBER_TITLE 195 -#define IDS_MACHINE_SHOW_OWNER_TITLE 196 -#define IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE 197 -#define IDS_NEWMACHINE_SHOW_MEMBER_TITLE 198 -#define IDS_NEWMACHINE_SHOW_OWNER_TITLE 199 -#define IDS_WARNING_TITLE 200 -#define IDS_WARNING_SYSTEM_ACCOUNT 201 - -#define IDS_ERROR_BAD_REMOTE_SERVER 208 -#define IDS_ERROR_BAD_LOCAL_SERVER 209 -#define IDS_ERROR_CANT_OPEN_CELL 210 -#define IDS_ERROR_BADCREDENTIALS 211 - -#define IDS_ERROR_TRANSLATED 224 -#define IDS_ERROR_NOTTRANSLATED 225 -#define IDS_ERROR_USER_MULTIPROP 226 -#define IDS_ERROR_CANT_CHANGE_USER 227 -#define IDS_ERROR_GROUP_MULTIPROP 228 -#define IDS_ERROR_CANT_CHANGE_GROUP 229 -#define IDS_ERROR_CANT_TRANSLATE_USER 230 -#define IDS_ERROR_CANT_TRANSLATE_GROUP 231 -#define IDS_ERROR_CANT_GET_USERPROP 232 -#define IDS_ERROR_CANT_CHANGE_PASSWORD 233 -#define IDS_ERROR_CANT_GET_RANDOM_KEY 234 -#define IDS_ERROR_CANT_SET_GROUPS 235 -#define IDS_ERROR_CANT_SET_GROUPS_MULTIPLE 236 -#define IDS_ERROR_CANT_UNLOCK 237 -#define IDS_ERROR_CANT_UNLOCK_MULTIPLE 238 -#define IDS_ERROR_CANT_SET_MEMBERS 239 - -#define IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE 240 -#define IDS_ERROR_CANT_RENAME_GROUP 241 -#define IDS_ERROR_CANT_CHANGE_OWNER 242 -#define IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE 243 -#define IDS_ERROR_CANT_CHANGE_CELL 244 -#define IDS_ERROR_NO_PASSWORD_GIVEN 245 -#define IDS_ERROR_MISMATCH_PASSWORD_GIVEN 246 -#define IDS_ERROR_CANT_CREATE_USER 247 -#define IDS_ERROR_CANT_CREATE_GROUP 248 -#define IDS_ERROR_CANT_DELETE_USER 249 -#define IDS_ERROR_CANT_DELETE_USER_MULTIPLE 250 -#define IDS_ERROR_CANT_DELETE_GROUP 251 -#define IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE 252 -#define IDS_ERROR_BAD_REMOTE_SERVER_INSTALL 253 - -#define IDS_CMDLINE_TITLE 256 -#define IDS_CMDLINE_SYNTAX 257 -#define IDS_CMDLINE_UNRECOGNIZED 258 -#define IDS_CMDLINE_DUPLICATE 259 -#define IDS_CMDLINE_UNEXPECTVALUE 260 -#define IDS_CMDLINE_MISSINGVAL 261 -#define IDS_CMDLINE_USERPASSWORD 262 - - - -#define IDD_MAIN 1001 -#define ACCEL_MAIN 1002 -#define MENU_MAIN 1003 -#define IDI_MAIN 1004 -#define IDD_TAB_USERS 1005 -#define IDD_TAB_GROUPS 1006 -#define IDD_ACTIONS 1007 -#define IDD_HELP_FIND 1008 -#define IDD_HELP_ERROR 1009 -#define IDD_HELP_ABOUT 1010 -#define MENU_USER_NONE 1011 -#define MENU_GROUP_NONE 1012 -#define MENU_USER 1013 -#define MENU_GROUP 1014 -#define MENU_COLUMNS 1015 -#define IDD_COLUMNS 1016 -#define MENU_MACHINE_NONE 1016 -#define IDD_USER_ADVANCED 1017 -#define MENU_MACHINE 1017 -#define IDD_USER_GENERAL 1018 -#define IDD_GROUP_GENERAL 1019 -#define IDD_USER_MEMBER 1020 -#define IDD_GROUP_MEMBER 1021 -#define IDD_BROWSE 1023 -#define IDD_BROWSE_JOIN 1024 -#define IDD_BROWSE_OWN 1025 -#define IDD_BROWSE_MEMBER 1026 -#define IDD_USER_PASSWORD 1027 -#define IDD_GROUP_RENAME 1028 -#define IDD_BROWSE_COMBO 1029 -#define IDD_BROWSE_OWNER 1030 -#define IDD_BROWSE_OWNED 1031 -#define IDD_BROWSE_BOTH 1032 -#define IDD_NEWUSER_ACCOUNT 1034 -#define IDD_NEWUSER_MEMBER 1035 -#define IDD_NEWUSER 1036 -#define IDD_NEWGROUP_GENERAL 1037 -#define IDD_NEWGROUP_MEMBER 1038 -#define IDD_NEWGROUP 1039 -#define IDD_USER_DELETE 1040 -#define IDD_GROUP_DELETE 1041 -#define IDD_CELL_GENERAL 1042 -#define IDD_NEWUSER_GENERAL 1043 -#define IDD_NEWUSER_ADVANCED 1044 -#define IDD_TAB_MACHINES 1045 -#define IDD_NEWMACHINE_MEMBER 1046 -#define IDD_NEWMACHINE_ADVANCED 1048 -#define IDD_NEWMACHINE 1049 -#define IDD_MACHINE_DELETE 1050 -#define IDD_MACHINE_ADVANCED 1051 -#define IDD_MACHINE_MEMBER 1052 -#define IDD_OPTIONS 1053 -#define IDD_SEARCH_USERS 1054 -#define IDC_DELETE_KAS 1165 -#define IDC_DELETE_PTS 1166 -#define IDC_TAB 2000 -#define IDC_BAR 2001 -#define IDC_CELL 2002 -#define IDC_CREDS 2003 -#define IDC_ANIM 2004 -#define IDC_USERS_PATTERN 2005 -#define IDC_USERS_TITLE 2006 -#define IDC_USERS_LIST 2007 -#define IDC_GROUPS_TITLE 2009 -#define IDC_GROUPS_PATTERN 2010 -#define IDC_GROUPS_LIST 2011 -#define IDC_USERS_PATTERN_PROMPT 2013 -#define IDC_GROUPS_PATTERN_PROMPT 2014 -#define IDC_ACTION_DESC 2015 -#define IDC_ACTION_LIST 2016 -#define IDC_FIND_COMMAND 2017 -#define IDC_ERROR_NUMBER 2018 -#define IDC_ERROR_TRANSLATE 2019 -#define IDC_ADVANCED_BOX 2020 -#define IDC_HELPABOUT_ICON 2021 -#define IDC_HELPABOUT_DESC 2022 -#define IDC_COLUMNS 2023 -#define IDC_COL_AVAIL 2024 -#define IDC_COL_INSERT 2025 -#define IDC_COL_DELETE 2026 -#define IDC_COL_SHOWN 2027 -#define IDC_COL_UP 2028 -#define IDC_COL_DOWN 2029 -#define IDC_USER_ADMIN 2030 -#define IDC_BROWSE_CHECK 2030 -#define IDC_USER_FAILLOCK 2031 -#define IDC_USER_TGS 2032 -#define IDC_USER_CPW 2033 -#define IDC_USER_RPW 2034 -#define IDC_USER_FAILLOCK_DURATION 2035 -#define IDC_USER_EXPIRE_TIME 2036 -#define IDC_USER_EXPIRES 2037 -#define IDC_USER_NOSEAL 2038 -#define IDC_USER_FAILLOCK_COUNT 2040 -#define IDC_USER_PERM_STATUS 2042 -#define IDC_USER_CPW_NOW 2045 -#define IDC_USER_FAILLOCK_INFINITE 2047 -#define IDC_USER_LIFETIME 2048 -#define IDC_USER_PWEXPIRES 2050 -#define IDC_USER_PWEXPIRATION 2051 -#define IDC_USER_PERM_OWNED 2052 -#define IDC_USER_PERM_MEMBER 2053 -#define IDC_USER_NAME 2055 -#define IDC_USER_EXPIRE_DATE 2056 -#define IDC_USER_GROUP_QUOTA 2057 -#define IDC_USER_KEY 2058 -#define IDC_USER_EXPIRE_AT 2059 -#define IDC_GROUP_NAME 2060 -#define IDC_GROUP_PERM_STATUS 2061 -#define IDC_GROUP_PERM_GROUPS 2062 -#define IDC_GROUP_PERM_MEMBERS 2063 -#define IDC_GROUP_PERM_ADD 2064 -#define IDC_GROUP_PERM_REMOVE 2065 -#define IDC_GROUP_OWNER 2066 -#define IDC_GROUP_CHANGEOWNER 2067 -#define IDC_GROUP_CREATOR 2068 -#define IDC_USER_SHOW_MEMBER 2068 -#define IDC_USER_SHOW_OWNER 2069 -#define IDC_MEMBER_REMOVE 2070 -#define IDC_MEMBER_ADD 2071 -#define IDC_CPW_VERSION_AUTO 2074 -#define IDC_CPW_VERSION_MANUAL 2075 -#define IDC_CPW_TITLE 2076 -#define IDC_CPW_VERSION 2077 -#define IDC_CPW_STRING 2078 -#define IDC_CPW_BYSTRING 2079 -#define IDC_CPW_DATA 2080 -#define IDC_CPW_BYDATA 2081 -#define IDC_CPW_RANDOM 2082 -#define IDC_RENAME_OLDNAME 2083 -#define IDC_RENAME_NEWNAME 2084 -#define IDC_RENAME_OWNER 2085 -#define IDC_RENAME_CHOWN 2086 -#define IDC_RENAME_TITLE 2087 -#define IDC_BROWSE_COMBO 2088 -#define IDC_GROUP_SHOW_MEMBER 2089 -#define IDC_GROUP_SHOW_OWNER 2090 -#define IDC_NEWUSER_TITLE 2092 -#define IDC_NEWUSER_NAME 2093 -#define IDC_NEWUSER_ID_AUTO 2094 -#define IDC_NEWUSER_ID_MANUAL 2095 -#define IDC_NEWUSER_ID 2096 -#define IDC_NEWUSER_PW1 2097 -#define IDC_NEWUSER_PW2 2098 -#define IDC_ADVANCED 2099 -#define IDC_USER_CREATE_KAS 2100 -#define IDC_USER_CREATE_PTS 2101 -#define IDC_NEWGROUP_NAME 2101 -#define IDC_NEWGROUP_TITLE 2102 -#define IDC_NEWGROUP_ID_AUTO 2103 -#define IDC_NEWGROUP_ID_MANUAL 2104 -#define IDC_NEWGROUP_ID 2105 -#define IDC_DELETE_TITLE 2106 -#define IDC_BROWSE_PATTERN 2107 -#define IDC_CELL_NAME 2108 -#define IDC_CELL_USERMAX 2109 -#define IDC_CELL_GROUPMAX 2110 -#define IDC_MACHINES_LIST 2113 -#define IDC_MACHINES_TITLE 2114 -#define IDC_MACHINES_PATTERN 2115 -#define IDC_MACHINES_PATTERN_PROMPT 2116 -#define IDC_USER_GROUP_HASQUOTA 2117 -#define IDC_USER_GROUP_NOQUOTA 2118 -#define IDC_USER_FAILLOCK_FINITE 2119 -#define IDC_USER_GROUP_HASQUOTA2 2119 -#define IDC_USER_UNLOCK 2120 -#define IDC_REGEXP_UNIX 2123 -#define IDC_REGEXP_WINDOWS 2124 -#define IDC_WARN_BADCREDS 2125 -#define IDC_REFRESH 2126 -#define IDC_REFRESH_RATE 2127 -#define IDC_SEARCH_ALL 2130 -#define IDC_SEARCH_EXPIRE 2131 -#define IDC_SEARCH_PWEXPIRE 2132 -#define IDC_SEARCH_EXPIRE_DATE 2133 -#define IDC_SEARCH_PWEXPIRE_DATE 2134 -#define M_OPENCELL 3001 -#define M_CREDENTIALS 3002 -#define M_EXIT 3003 -#define M_KEY_RETURN 3004 -#define M_KEY_TAB 3005 -#define M_KEY_BACKTAB 3006 -#define M_KEY_MENU 3007 -#define M_KEY_ESC 3008 -#define M_KEY_CTRLTAB 3009 -#define M_KEY_CTRLBACKTAB 3010 -#define M_KEY_PROPERTIES 3011 -#define M_CONTENTS 3012 -#define M_FIND 3013 -#define M_LOOKUP 3014 -#define M_ABOUT 3015 -#define M_VIEW_LARGE 3016 -#define M_VIEW_SMALL 3017 -#define M_VIEW_DETAILS 3018 -#define M_VIEW_ONE 3019 -#define M_VIEW_TWO 3020 -#define M_VIEW_STATUS 3021 -#define M_ACTIONS 3022 -#define M_OPTIONS 3023 -#define M_REFRESHALL 3024 -#define M_CELL_PROPERTIES 3025 -#define M_USER_CREATE 3026 -#define M_GROUP_CREATE 3027 -#define M_UNLOCK 3029 -#define M_MEMBERSHIP 3030 -#define M_REFRESH 3031 -#define M_PROPERTIES 3032 -#define M_SELECTALL 3033 -#define M_RENAME 3034 -#define M_DELETE 3035 -#define M_COLUMNS 3036 -#define M_CPW 3037 -#define M_MACHINE_CREATE 3038 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 1032 -#define _APS_NEXT_COMMAND_VALUE 3036 -#define _APS_NEXT_CONTROL_VALUE 2136 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/afsusrmgr/resource/afsusrmgr.ico b/src/WINNT/afsusrmgr/resource/afsusrmgr.ico deleted file mode 100644 index 321a135ddd1bc5cb2dc5685ec84be4e1ad854b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmbu8J#NB45QQHQ$*GKQfUAgGK*511ENv6T?o#GT?$U6GEmK66J5wNSzFB*NK~%}u zZ)e}U*&mp(w9ryzS;*{bDZSu}V&vO}l&_>Mu@daTLQjksxsR=pc-1tcV`QqfZSf|A z_$maO0Uit4@F(lA++MH2Id_Em7`k%gsB=i@qbztlG=$uwAvZo**RAVg?qTc~cg%)9 z^4AmAqPt_vts)l(&-h8Tn|4ZiUDq)o@d2}x>f82{(Bq24-AqR|JtkC#!yan#(A$LD znKOO70SwEg^&_+On#TbiN04)7e!>3$QfU@c diff --git a/src/WINNT/afsusrmgr/task.cpp b/src/WINNT/afsusrmgr/task.cpp deleted file mode 100644 index 4923ca5ef..000000000 --- a/src/WINNT/afsusrmgr/task.cpp +++ /dev/null @@ -1,1853 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "messages.h" -#include "creds.h" -#include "action.h" -#include "usr_col.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef iswhite -#define iswhite(_ch) ( ((_ch) == TEXT(' ')) || ((_ch) == TEXT('\t')) ) -#endif - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Task_OpenCell (LPTASKPACKET ptp); -void Task_UpdCreds (LPTASKPACKET ptp); -void Task_UpdUsers (LPTASKPACKET ptp); -void Task_UpdGroups (LPTASKPACKET ptp); -void Task_UpdMachines (LPTASKPACKET ptp); -void Task_Refresh (LPTASKPACKET ptp); -void Task_RefreshMult (LPTASKPACKET ptp); -void Task_Get_Actions (LPTASKPACKET ptp); -void Task_Get_Random_Key (LPTASKPACKET ptp); -void Task_User_Change (LPTASKPACKET ptp); -void Task_User_Find (LPTASKPACKET ptp); -void Task_User_Enum (LPTASKPACKET ptp); -void Task_User_GroupList_Set (LPTASKPACKET ptp); -BOOL Task_User_GroupList_Set_Do (LPUSER_GROUPLIST_SET_PARAMS lpp, ULONG *pStatus); -void Task_User_CPW (LPTASKPACKET ptp); -void Task_User_Unlock (LPTASKPACKET ptp); -void Task_User_Create (LPTASKPACKET ptp); -void Task_User_Delete (LPTASKPACKET ptp); -void Task_Group_Change (LPTASKPACKET ptp); -void Task_Group_Search (LPTASKPACKET ptp); -void Task_Group_Members_Get (LPTASKPACKET ptp); -void Task_Group_Members_Set (LPTASKPACKET ptp); -BOOL Task_Group_Members_Set_Do (LPGROUP_MEMBERS_SET_PARAMS lpp, ULONG *pStatus); -void Task_Group_Enum (LPTASKPACKET ptp); -void Task_Group_Rename (LPTASKPACKET ptp); -void Task_Group_Owned_Get (LPTASKPACKET ptp); -void Task_Group_Owned_Set (LPTASKPACKET ptp); -BOOL Task_Group_Owned_Set_Do (LPGROUP_OWNED_SET_PARAMS lpp, ULONG *pStatus); -void Task_Group_Create (LPTASKPACKET ptp); -void Task_Group_Delete (LPTASKPACKET ptp); -void Task_Cell_Change (LPTASKPACKET ptp); -void Task_List_Translate (LPTASKPACKET ptp); -void Task_Object_Listen (LPTASKPACKET ptp); -void Task_Object_Get (LPTASKPACKET ptp); -void Task_Set_Refresh (LPTASKPACKET ptp); -void Task_Expired_Creds (LPTASKPACKET ptp); - -void WeedAsidList (LPASIDLIST *ppList, BOOL fWantMachines); -void TranslateRegExp (LPTSTR pszTarget, LPCTSTR pszSource); -BOOL PerformRefresh (LPTASKPACKET ptp, ASID idScope, ULONG *pStatus); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -LPTASKPACKET CreateTaskPacket (int idTask, HWND hReply, PVOID lpUser) -{ - LPTASKPACKET ptp; - - if ((ptp = New (TASKPACKET)) != NULL) - { - memset (ptp, 0x00, sizeof(TASKPACKET)); - - ptp->idTask = idTask; - ptp->hReply = hReply; - ptp->lpUser = lpUser; - ptp->rc = TRUE; - ptp->status = 0; - - if ((ptp->pReturn = New (TASKPACKETDATA)) != NULL) - { - memset (ptp->pReturn, 0x00, sizeof(TASKPACKETDATA)); - } - } - - return ptp; -} - - -void FreeTaskPacket (LPTASKPACKET ptp) -{ - if (ptp) - { - if (ptp->pReturn) - { - if (TASKDATA(ptp)->pAsidList) - asc_AsidListFree (&TASKDATA(ptp)->pAsidList); - if (TASKDATA(ptp)->pActionList) - asc_ActionListFree (&TASKDATA(ptp)->pActionList); - Delete (ptp->pReturn); - } - Delete (ptp); - } -} - - -void PerformTask (LPTASKPACKET ptp) -{ - switch (ptp->idTask) - { - case taskOPENCELL: - Task_OpenCell (ptp); - break; - - case taskUPD_CREDS: - Task_UpdCreds (ptp); - break; - - case taskUPD_USERS: - Task_UpdUsers (ptp); - break; - - case taskUPD_GROUPS: - Task_UpdGroups (ptp); - break; - - case taskUPD_MACHINES: - Task_UpdMachines (ptp); - break; - - case taskREFRESH: - Task_Refresh (ptp); - break; - - case taskREFRESHMULT: - Task_RefreshMult (ptp); - break; - - case taskGET_ACTIONS: - Task_Get_Actions (ptp); - break; - - case taskGET_RANDOM_KEY: - Task_Get_Random_Key (ptp); - break; - - case taskUSER_CHANGE: - Task_User_Change (ptp); - break; - - case taskUSER_FIND: - Task_User_Find (ptp); - break; - - case taskUSER_ENUM: - Task_User_Enum (ptp); - break; - - case taskUSER_GROUPLIST_SET: - Task_User_GroupList_Set (ptp); - break; - - case taskUSER_CPW: - Task_User_CPW (ptp); - break; - - case taskUSER_UNLOCK: - Task_User_Unlock (ptp); - break; - - case taskUSER_CREATE: - Task_User_Create (ptp); - break; - - case taskUSER_DELETE: - Task_User_Delete (ptp); - break; - - case taskGROUP_CHANGE: - Task_Group_Change (ptp); - break; - - case taskGROUP_SEARCH: - Task_Group_Search (ptp); - break; - - case taskGROUP_MEMBERS_GET: - Task_Group_Members_Get (ptp); - break; - - case taskGROUP_MEMBERS_SET: - Task_Group_Members_Set (ptp); - break; - - case taskGROUP_ENUM: - Task_Group_Enum (ptp); - break; - - case taskGROUP_RENAME: - Task_Group_Rename (ptp); - break; - - case taskGROUP_OWNED_GET: - Task_Group_Owned_Get (ptp); - break; - - case taskGROUP_OWNED_SET: - Task_Group_Owned_Set (ptp); - break; - - case taskGROUP_CREATE: - Task_Group_Create (ptp); - break; - - case taskGROUP_DELETE: - Task_Group_Delete (ptp); - break; - - case taskCELL_CHANGE: - Task_Cell_Change (ptp); - break; - - case taskLIST_TRANSLATE: - Task_List_Translate (ptp); - break; - - case taskOBJECT_LISTEN: - Task_Object_Listen (ptp); - break; - - case taskOBJECT_GET: - Task_Object_Get (ptp); - break; - - case taskSET_REFRESH: - Task_Set_Refresh (ptp); - break; - - case taskEXPIRED_CREDS: - Task_Expired_Creds (ptp); - break; - - default: - ptp->rc = FALSE; - ptp->status = ERROR_INVALID_FUNCTION; - break; - } -} - - -/* - * KEYS _______________________________________________________________________ - * - */ - -HASHVALUE CALLBACK Key_Asid_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return *(ASID*)pData; -} - -HASHVALUE CALLBACK Key_Asid_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return Key_Asid_HashData (pKey, (ASID*)pObject); -} - -BOOL CALLBACK Key_Asid_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return ((*(ASID*)pObject) == (*(ASID*)pData)); -} - - -/* - * TASKS ______________________________________________________________________ - * - */ - -void Task_OpenCell (LPTASKPACKET ptp) -{ - LPOPENCELL_PARAMS lpp = (LPOPENCELL_PARAMS)( ptp->lpUser ); - - Display_StartWorking(); - - // Try to open the cell for administration - // - ptp->rc = asc_CellOpen (g.idClient, lpp->hCreds, lpp->szCell, AFSADMSVR_SCOPE_USERS, &TASKDATA(ptp)->idCell, &ptp->status); - - if (ptp->rc) - { - PostMessage (g.hMain, WM_SHOW_YOURSELF, 0, 1); - } - else if ((!ptp->rc) && (!IsWindow(ptp->hReply))) - { - if (lpp->fCloseAppOnFail) - FatalErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), lpp->szCell); - else - ErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), lpp->szCell); - } - - // If we previously had another cell open, close it. - // - if (ptp->rc) - { - asc_Enter(); - - if (g.idCell) - { - ULONG status; - (void)asc_CellClose (g.idClient, g.idCell, &status); - } - g.idCell = TASKDATA(ptp)->idCell; - - asc_Leave(); - } - - // Update the "Selected Cell:" text on the main window - // - TCHAR szCell[ cchNAME ]; - if (!g.idCell) - GetString (szCell, IDS_CELL_NONE); - else if (!asc_CellNameGet_Fast (g.idClient, g.idCell, szCell)) - GetString (szCell, IDS_CELL_NONE); - SetDlgItemText (g.hMain, IDC_CELL, szCell); - ShowCurrentCredentials(); - - // Oh--also, set the refresh rate for the newly-opened cell - // - ULONG dummy; - asc_CellRefreshRateSet (g.idClient, g.idCell, gr.cminRefreshRate, &dummy); - - // Start re-populating the Users or Groups tab (whichever is showing) - // - Display_PopulateList(); - - Display_StopWorking(); - - // When we've opened a new cell, it's time to open the Actions window. - // - if (gr.fShowActions) - PostMessage (g.hMain, WM_SHOW_ACTIONS, 0, 0); - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_UpdCreds (LPTASKPACKET ptp) -{ - // Update the display to report our new credentials - // - ShowCurrentCredentials(); - - // Tell the admin server to use our new credentials, and refresh everything - // - if (!asc_CredentialsPush (g.idClient, g.hCreds, g.idCell, &ptp->status)) - ptp->rc = FALSE; - else - ptp->rc = PerformRefresh (ptp, g.idCell, &ptp->status); -} - - -void Task_UpdUsers (LPTASKPACKET ptp) -{ - // First we'll query the admin server to find a list of all users which - // match our search pattern. - // - lstrcpy (TASKDATA(ptp)->szPattern, g.szPatternUsers); - - TCHAR szRegExp[ cchNAME ]; - TranslateRegExp (szRegExp, TASKDATA(ptp)->szPattern); - if (!asc_ObjectFindMultiple (g.idClient, g.idCell, TYPE_USER, szRegExp, &gr.SearchUsers, &TASKDATA(ptp)->pAsidList, &ptp->status)) - ptp->rc = FALSE; - - // If we got a result back, weed out any entries that look like machines. - // - if (ptp->rc) - { - WeedAsidList (&TASKDATA(ptp)->pAsidList, FALSE); - } - - // Wow, that was easy. Okay, next step: ensure that we have properties - // for all these guys in the local cache--to do that, we'll query their - // properties, then free the result. - // - if (ptp->rc) - { - LPASOBJPROPLIST pPropList = NULL; - if (!asc_ObjectPropertiesGetMultiple (g.idClient, GET_ALL_DATA, g.idCell, TASKDATA(ptp)->pAsidList, &pPropList, &ptp->status)) - ptp->rc = FALSE; - if (pPropList) - asc_ObjPropListFree (&pPropList); - } -} - - -void Task_UpdGroups (LPTASKPACKET ptp) -{ - // First we'll query the admin server to find a list of all groups which - // match our search pattern. - // - lstrcpy (TASKDATA(ptp)->szPattern, g.szPatternGroups); - - TCHAR szRegExp[ cchNAME ]; - TranslateRegExp (szRegExp, TASKDATA(ptp)->szPattern); - if (!asc_ObjectFindMultiple (g.idClient, g.idCell, TYPE_GROUP, szRegExp, NULL, &TASKDATA(ptp)->pAsidList, &ptp->status)) - ptp->rc = FALSE; - - // Wow, that was easy. Okay, next step: ensure that we have properties - // for all these guys in the local cache--to do that, we'll query their - // properties, then free the result. - // - if (ptp->rc) - { - LPASOBJPROPLIST pPropList = NULL; - if (!asc_ObjectPropertiesGetMultiple (g.idClient, GET_ALL_DATA, g.idCell, TASKDATA(ptp)->pAsidList, &pPropList, &ptp->status)) - ptp->rc = FALSE; - if (pPropList) - asc_ObjPropListFree (&pPropList); - } -} - - -void Task_UpdMachines (LPTASKPACKET ptp) -{ - // First we'll query the admin server to find a list of all users which - // match our search pattern. - // - TCHAR szRegExp[ cchNAME ]; - if (g.szPatternMachines[0]) - TranslateRegExp (szRegExp, g.szPatternMachines); - else - lstrcpy (szRegExp, TEXT("^[0-9.]*$")); - - if (!asc_ObjectFindMultiple (g.idClient, g.idCell, TYPE_USER, szRegExp, NULL, &TASKDATA(ptp)->pAsidList, &ptp->status)) - ptp->rc = FALSE; - - lstrcpy (TASKDATA(ptp)->szPattern, g.szPatternMachines); - - // If we got a result back, weed out any entries that don't look - // like machines. - // - if (ptp->rc) - { - WeedAsidList (&TASKDATA(ptp)->pAsidList, TRUE); - } - - // Wow, that was easy. Okay, next step: ensure that we have properties - // for all these guys in the local cache--to do that, we'll query their - // properties, then free the result. - // - if (ptp->rc) - { - LPASOBJPROPLIST pPropList = NULL; - if (!asc_ObjectPropertiesGetMultiple (g.idClient, GET_ALL_DATA, g.idCell, TASKDATA(ptp)->pAsidList, &pPropList, &ptp->status)) - ptp->rc = FALSE; - if (pPropList) - asc_ObjPropListFree (&pPropList); - } -} - - - -void Task_Refresh (LPTASKPACKET ptp) -{ - ASID idScope = (ASID)( ptp->lpUser ); - - ptp->rc = PerformRefresh (ptp, idScope, &ptp->status); -} - - -void Task_RefreshMult (LPTASKPACKET ptp) -{ - LPASIDLIST pAsidList = (LPASIDLIST)( ptp->lpUser ); - - // Invalidate the admin server's cached information about the specified - // object. Remember that this is recursive hierarchically: if you pass - // in a cell's ID, for instance, information about all users, groups, - // servers, services, partitions and volumes anywhere in that cell will - // be discarded. - // - ptp->rc = asc_ObjectRefreshMultiple (g.idClient, g.idCell, pAsidList, &ptp->status); - - // The Refresh call above just made us invalidate the status for one or - // more objects; to get the display to reflect the changes, we'll have to - // query the server for the latest properties for those objects. Once that's - // done, we'll just redraw the main window and it will pick up the changes. - // - if (ptp->rc) - { - ULONG status; - LPASOBJPROPLIST pPropList = NULL; - if (asc_ObjectPropertiesGetMultiple (g.idClient, GET_ALL_DATA, g.idCell, pAsidList, &pPropList, &status)) - { - // That call returned properties for the objects; we don't need - // the properties here--we just wanted to get them in the cache. - // Now that they're in the cache, redrawing the main window will - // cause the latest data to be displayed. - // - if (pPropList) - asc_ObjPropListFree (&pPropList); - Display_RefreshView_Fast(); - } - } - - asc_AsidListFree (&pAsidList); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Get_Actions (LPTASKPACKET ptp) -{ - // Query the admin server to get a current list of operations-in-progress. - // We'll limit our search to operations being performed on this cell. - // - ptp->rc = asc_ActionGetMultiple (g.idClient, 0, g.idCell, &TASKDATA(ptp)->pActionList, &ptp->status); -} - - -void Task_Get_Random_Key (LPTASKPACKET ptp) -{ - ptp->rc = asc_RandomKeyGet (g.idClient, g.idCell, TASKDATA(ptp)->key, &ptp->status); - - if (!ptp->rc && !IsWindow(ptp->hReply)) - { - ErrorDialog (ptp->status, IDS_ERROR_CANT_GET_RANDOM_KEY); - } -} - - -void Task_User_Change (LPTASKPACKET ptp) -{ - LPUSER_CHANGE_PARAMS lpp = (LPUSER_CHANGE_PARAMS)( ptp->lpUser ); - - if ((ptp->rc = asc_UserChange (g.idClient, g.idCell, lpp->idUser, &lpp->NewProperties, &ptp->status)) == TRUE) - { - Display_RefreshView_Fast(); - } - - if (!ptp->rc && !IsWindow (ptp->hReply)) - { - TCHAR szUser[ cchNAME ]; - User_GetDisplayName (szUser, lpp->idUser); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGE_USER, TEXT("%s"), szUser); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_User_Find (LPTASKPACKET ptp) -{ - LPTSTR pszName = (LPTSTR)( ptp->lpUser ); - - if ((ptp->rc = asc_ObjectFind (g.idClient, g.idCell, TYPE_USER, pszName, &TASKDATA(ptp)->idObject, &ptp->status)) == TRUE) - { - ptp->rc = asc_ObjectPropertiesGet (g.idClient, GET_ALL_DATA, g.idCell, TASKDATA(ptp)->idObject, &TASKDATA(ptp)->Properties, &ptp->status); - } - - FreeString (pszName); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_User_Enum (LPTASKPACKET ptp) -{ - LPCTSTR pszPattern = (LPCTSTR)( ptp->lpUser ); - - TCHAR szRegExp[ cchNAME ]; - TranslateRegExp (szRegExp, pszPattern); - if ((ptp->rc = asc_ObjectFindMultiple (g.idClient, g.idCell, TYPE_USER, szRegExp, NULL, &TASKDATA(ptp)->pAsidList, &ptp->status)) == TRUE) - { - LPASOBJPROPLIST pPropList = NULL; - - ptp->rc = asc_ObjectPropertiesGetMultiple (g.idClient, GET_RUDIMENTARY_DATA, g.idCell, TASKDATA(ptp)->pAsidList, &pPropList, &ptp->status); - - if (pPropList) - asc_ObjPropListFree (&pPropList); - } - - FreeString (pszPattern); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_User_GroupList_Set (LPTASKPACKET ptp) -{ - LPUSER_GROUPLIST_SET_PARAMS lpp = (LPUSER_GROUPLIST_SET_PARAMS)( ptp->lpUser ); - - ptp->rc = Task_User_GroupList_Set_Do (lpp, &ptp->status); - - asc_AsidListFree (&lpp->pUsers); - asc_AsidListFree (&lpp->pGroups); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -BOOL Task_User_GroupList_Set_Do (LPUSER_GROUPLIST_SET_PARAMS lpp, ULONG *pStatus) -{ - BOOL rc = TRUE; - - // Maintain a structure describing any errors we encounter, so we can give - // a reasonable error dialog if need be. - // - LPERRORDATA ped = ED_Create (IDS_ERROR_CANT_SET_GROUPS, IDS_ERROR_CANT_SET_GROUPS_MULTIPLE); - - // We'll need the supplied group-list in a hashlist, so we can quickly - // test it for inclusion of a particular group. - // - LPHASHLIST pGroupsAllow = New (HASHLIST); - for (size_t iGroup = 0; iGroup < lpp->pGroups->cEntries; ++iGroup) - pGroupsAllow->AddUnique ((PVOID)(lpp->pGroups->aEntries[ iGroup ].idObject)); - - // We'll have to do this next bit for each user in the supplied user-list - // - for (size_t iUser = 0; iUser < lpp->pUsers->cEntries; ++iUser) - { - ULONG status; - - // Obtain the appropriate current list of groups for this user - // - LPASIDLIST pGroupsOld = NULL; - if (lpp->fMembership) - { - if (!asc_GroupMembershipGet (g.idClient, g.idCell, lpp->pUsers->aEntries[ iUser ].idObject, &pGroupsOld, &status)) - { - ED_RegisterStatus (ped, lpp->pUsers->aEntries[ iUser ].idObject, FALSE, status); - continue; - } - } - else // (!lpp->fMembership) - { - if (!asc_GroupOwnershipGet (g.idClient, g.idCell, lpp->pUsers->aEntries[ iUser ].idObject, &pGroupsOld, &status)) - { - ED_RegisterStatus (ped, lpp->pUsers->aEntries[ iUser ].idObject, FALSE, status); - continue; - } - } - if (!pGroupsOld) - continue; - - // Test each group in that current list to see if it's also on our - // pGroupsAllow list. If not, remove it. - // - for (iGroup = 0; iGroup < pGroupsOld->cEntries; ++iGroup) - { - if (pGroupsAllow->fIsInList ((PVOID)(pGroupsOld->aEntries[iGroup].idObject))) - continue; - - if (lpp->fMembership) - { - if (!asc_GroupMemberRemove (g.idClient, g.idCell, pGroupsOld->aEntries[iGroup].idObject, lpp->pUsers->aEntries[iUser].idObject, &status)) - ED_RegisterStatus (ped, lpp->pUsers->aEntries[ iUser ].idObject, FALSE, status); - } - else // (!lpp->fMembership) - { - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet (g.idClient, GET_ALL_DATA, g.idCell, pGroupsOld->aEntries[iGroup].idObject, &Properties, &status)) - { - AFSADMSVR_CHANGEGROUP_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - lstrcpy (pp.szOwner, Properties.szName); // make group self-owned - pp.aaListStatus = Properties.u.GroupProperties.aaListStatus; - pp.aaListGroupsOwned = Properties.u.GroupProperties.aaListGroupsOwned; - pp.aaListMembers = Properties.u.GroupProperties.aaListMembers; - pp.aaAddMember = Properties.u.GroupProperties.aaAddMember; - pp.aaDeleteMember = Properties.u.GroupProperties.aaDeleteMember; - if (!asc_GroupChange (g.idClient, g.idCell, pGroupsOld->aEntries[iGroup].idObject, &pp, &status)) - ED_RegisterStatus (ped, lpp->pUsers->aEntries[ iUser ].idObject, FALSE, status); - } - } - } - - // Now the more complex part: see if there are any groups in the - // supplied group-list which are marked as mandatory, but which - // aren't in our pGroupsOld list. We'll need to put the latter in a - // hashlist for this... - // - LPHASHLIST pGroupsOldList = New (HASHLIST); - for (iGroup = 0; iGroup < pGroupsOld->cEntries; ++iGroup) - pGroupsOldList->AddUnique ((PVOID)(pGroupsOld->aEntries[ iGroup ].idObject)); - - for (iGroup = 0; iGroup < lpp->pGroups->cEntries; ++iGroup) - { - if (!lpp->pGroups->aEntries[ iGroup ].lParam) - continue; // group not mandatory - if (pGroupsOldList->fIsInList ((PVOID)(lpp->pGroups->aEntries[ iGroup ].idObject))) - continue; // already a member - - if (lpp->fMembership) - { - if (!asc_GroupMemberAdd (g.idClient, g.idCell, lpp->pGroups->aEntries[iGroup].idObject, lpp->pUsers->aEntries[iUser].idObject, &status)) - ED_RegisterStatus (ped, lpp->pUsers->aEntries[ iUser ].idObject, FALSE, status); - } - else // (!lpp->fMembership) - { - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet (g.idClient, GET_ALL_DATA, g.idCell, lpp->pGroups->aEntries[iGroup].idObject, &Properties, &status)) - { - AFSADMSVR_CHANGEGROUP_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.aaListStatus = Properties.u.GroupProperties.aaListStatus; - pp.aaListGroupsOwned = Properties.u.GroupProperties.aaListGroupsOwned; - pp.aaListMembers = Properties.u.GroupProperties.aaListMembers; - pp.aaAddMember = Properties.u.GroupProperties.aaAddMember; - pp.aaDeleteMember = Properties.u.GroupProperties.aaDeleteMember; - - if (asc_ObjectNameGet_Fast (g.idClient, g.idCell, lpp->pUsers->aEntries[iUser].idObject, pp.szOwner, &status)) - { - if (!asc_GroupChange (g.idClient, g.idCell, lpp->pGroups->aEntries[iGroup].idObject, &pp, &status)) - ED_RegisterStatus (ped, lpp->pUsers->aEntries[ iUser ].idObject, FALSE, status); - } - } - } - } - - Delete (pGroupsOldList); - asc_AsidListFree (&pGroupsOld); - } - - // If there were any errors, report them. - // - if ((*pStatus = ED_GetFinalStatus(ped)) != 0) - { - rc = FALSE; - ED_ShowErrorDialog(ped); - } - ED_Free(ped); - - // Done; clean up - // - Delete (pGroupsAllow); - return rc; -} - - -void Task_User_CPW (LPTASKPACKET ptp) -{ - LPUSER_CPW_PARAMS lpp = (LPUSER_CPW_PARAMS)( ptp->lpUser ); - - ptp->rc = asc_UserPasswordSet (g.idClient, g.idCell, lpp->idUser, lpp->keyVersion, lpp->keyString, lpp->keyData, &ptp->status); - - if ((!ptp->rc) && (!IsWindow(ptp->hReply))) - { - TCHAR szName[ cchNAME ]; - User_GetDisplayName (szName, lpp->idUser); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGE_PASSWORD, TEXT("%s"), szName); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_User_Unlock (LPTASKPACKET ptp) -{ - LPASIDLIST pUserList = (LPASIDLIST)( ptp->lpUser ); - - // Maintain a structure describing any errors we encounter, so we can give - // a reasonable error dialog if need be. - // - LPERRORDATA ped = ED_Create (IDS_ERROR_CANT_UNLOCK, IDS_ERROR_CANT_UNLOCK_MULTIPLE); - - // Try to unlock the users' accounts... - // - for (size_t iUser = 0; iUser < pUserList->cEntries; ++iUser) - { - if (!asc_UserUnlock (g.idClient, g.idCell, pUserList->aEntries[ iUser ].idObject, &ptp->status)) - ED_RegisterStatus (ped, pUserList->aEntries[ iUser ].idObject, FALSE, ptp->status); - } - - // If there were any errors, report them. - // - if (ED_GetFinalStatus(ped) && !IsWindow(ptp->hReply)) - ED_ShowErrorDialog(ped); - ED_Free(ped); - - asc_AsidListFree (&pUserList); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_User_Create (LPTASKPACKET ptp) -{ - LPUSER_CREATE_PARAMS lpp = (LPUSER_CREATE_PARAMS)(ptp->lpUser); - - // We may actually have been asked to create more than one user here; - // the {lpp->mszNames} parameter is a multi-string. So everything we - // do, we'll do for each new user-name... - // - for (LPTSTR pszName = lpp->mszNames; pszName && *pszName; pszName += 1+lstrlen(pszName)) - { - // First create this new user account - // - ASID idUser; - - AFSADMSVR_CREATEUSER_PARAMS pp; - memset (&pp, 0x00, sizeof(AFSADMSVR_CREATEUSER_PARAMS)); - User_SplitDisplayName (pszName, pp.szName, pp.szInstance); - lstrcpy (pp.szPassword, lpp->szPassword); - pp.idUser = lpp->idUser; - pp.fCreateKAS = lpp->fCreateKAS; - pp.fCreatePTS = lpp->fCreatePTS; - if ((ptp->rc = asc_UserCreate (g.idClient, g.idCell, &pp, &idUser, &ptp->status)) == FALSE) - { - if (!IsWindow (ptp->hReply)) - ErrorDialog (ptp->status, IDS_ERROR_CANT_CREATE_USER, TEXT("%s"), pszName); - continue; - } - - // Then change its properties to be what we want - // - if ((ptp->rc = asc_UserChange (g.idClient, g.idCell, idUser, &lpp->Properties, &ptp->status)) == FALSE) - { - if (!IsWindow (ptp->hReply)) - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGE_USER, TEXT("%s"), pszName); - } - if (!ptp->rc) - continue; - - // Finally update its lists of groups - // - if (lpp->pGroupsMember) - { - USER_GROUPLIST_SET_PARAMS pp; - memset (&pp, 0x00, sizeof(USER_GROUPLIST_SET_PARAMS)); - asc_AsidListCreate (&pp.pUsers); - asc_AsidListAddEntry (&pp.pUsers, idUser, 0); - asc_AsidListCopy (&pp.pGroups, &lpp->pGroupsMember); - pp.fMembership = TRUE; - ptp->rc = Task_User_GroupList_Set_Do (&pp, &ptp->status); - asc_AsidListFree (&pp.pUsers); - asc_AsidListFree (&pp.pGroups); - } - if (lpp->pGroupsOwner) - { - USER_GROUPLIST_SET_PARAMS pp; - memset (&pp, 0x00, sizeof(USER_GROUPLIST_SET_PARAMS)); - asc_AsidListCreate (&pp.pUsers); - asc_AsidListAddEntry (&pp.pUsers, idUser, 0); - asc_AsidListCopy (&pp.pGroups, &lpp->pGroupsOwner); - pp.fMembership = FALSE; - ptp->rc = Task_User_GroupList_Set_Do (&pp, &ptp->status); - asc_AsidListFree (&pp.pUsers); - asc_AsidListFree (&pp.pGroups); - } - } - - // And we're done! - // - Display_PopulateList(); - - if (lpp->pGroupsOwner) - asc_AsidListFree (&lpp->pGroupsOwner); - if (lpp->pGroupsMember) - asc_AsidListFree (&lpp->pGroupsMember); - if (lpp->mszNames) - FreeString (lpp->mszNames); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_User_Delete (LPTASKPACKET ptp) -{ - LPUSER_DELETE_PARAMS lpp = (LPUSER_DELETE_PARAMS)(ptp->lpUser); - - // Maintain a structure describing any errors we encounter, so we can give - // a reasonable error dialog if need be. - // - LPERRORDATA ped = ED_Create (IDS_ERROR_CANT_DELETE_USER, IDS_ERROR_CANT_DELETE_USER_MULTIPLE); - - // Go through and delete these users - // - for (size_t iUser = 0; iUser < lpp->pUserList->cEntries; ++iUser) - { - AFSADMSVR_DELETEUSER_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.fDeleteKAS = lpp->fDeleteKAS; - pp.fDeletePTS = lpp->fDeletePTS; - - ULONG status; - if (!asc_UserDelete (g.idClient, g.idCell, lpp->pUserList->aEntries[iUser].idObject, &pp, &status)) - ED_RegisterStatus (ped, lpp->pUserList->aEntries[iUser].idObject, FALSE, status); - } - - // If there were any errors, report them. - // - if (ED_GetFinalStatus(ped) && !IsWindow(ptp->hReply)) - ED_ShowErrorDialog(ped); - ED_Free(ped); - - // And we're done! - // - Display_PopulateList(); - - if (lpp->pUserList) - asc_AsidListFree (&lpp->pUserList); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Change (LPTASKPACKET ptp) -{ - LPGROUP_CHANGE_PARAMS lpp = (LPGROUP_CHANGE_PARAMS)( ptp->lpUser ); - - if ((ptp->rc = asc_GroupChange (g.idClient, g.idCell, lpp->idGroup, &lpp->NewProperties, &ptp->status)) == TRUE) - { - Display_RefreshView_Fast(); - } - - if (!ptp->rc && !IsWindow (ptp->hReply)) - { - TCHAR szGroup[ cchNAME ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, lpp->idGroup, szGroup); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGE_GROUP, TEXT("%s"), szGroup); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Search (LPTASKPACKET ptp) -{ - LPGROUP_SEARCH_PARAMS lpp = (LPGROUP_SEARCH_PARAMS)( ptp->lpUser ); - - // Prepare an intermediate place for us to put the results of our search. - // We'll be doing lots of work in this intermediate list, so it'll be - // implemented as a hashlist with a key over the objects' ASIDs. - // - typedef struct - { - ASID idGroup; - size_t cUsers; - } GROUP_SEARCH_FOUND, *LPGROUP_SEARCH_FOUND; - - LPHASHLIST pListGroups = New (HASHLIST); - LPHASHLISTKEY pListKeyAsid = pListGroups->CreateKey ("ASID", Key_Asid_Compare, Key_Asid_HashObject, Key_Asid_HashData); - - // Search through the appropriate groups for each user in the list - // - for (size_t iUser = 0; iUser < lpp->pUserList->cEntries; ++iUser) - { - LPASIDLIST pGroups = NULL; - ULONG status; - - if (lpp->fMembership) - { - if (!asc_GroupMembershipGet (g.idClient, g.idCell, lpp->pUserList->aEntries[ iUser ].idObject, &pGroups, &status)) - continue; - } - else // (!lpp->fMembership) - { - if (!asc_GroupOwnershipGet (g.idClient, g.idCell, lpp->pUserList->aEntries[ iUser ].idObject, &pGroups, &status)) - continue; - } - - if (pGroups) - { - // For each group we found, make sure the group is in the big - // list we'll be returning. Use the {lParam} field of the - // list's entry as a counter, to remember how many users have - // this group - // - for (size_t iGroup = 0; iGroup < pGroups->cEntries; ++iGroup) - { - // Is it in the list already? If not, add it. - // - LPGROUP_SEARCH_FOUND pFind; - if ((pFind = (LPGROUP_SEARCH_FOUND)pListKeyAsid->GetFirstObject (&pGroups->aEntries[ iGroup ].idObject)) != NULL) - { - pFind->cUsers ++; - } - else - { - pFind = New (GROUP_SEARCH_FOUND); - pFind->idGroup = pGroups->aEntries[ iGroup ].idObject; - pFind->cUsers = 1; - pListGroups->Add (pFind); - } - } - - asc_AsidListFree (&pGroups); - } - } - - // Now that we have a list of groups that match our search criteria, - // stick it in an ASID list. The lParam field for each ASID will be set - // to 1 if all users have that group, or 0 if only some have it. - // - if (!asc_AsidListCreate (&TASKDATA(ptp)->pAsidList)) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - - if (ptp->rc) - { - for (LPENUM pEnum = pListGroups->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPGROUP_SEARCH_FOUND pFind = (LPGROUP_SEARCH_FOUND)( pEnum->GetObject() ); - - asc_AsidListAddEntry (&TASKDATA(ptp)->pAsidList, pFind->idGroup, (LPARAM)( (pFind->cUsers == lpp->pUserList->cEntries) ? 1 : 0 )); - - pListGroups->Remove (pFind); - Delete (pFind); - } - - TASKDATA(ptp)->fMembership = lpp->fMembership; - } - - // Now that we have an ASID list full of groups to return, make sure we - // have rudimentary properties for all those groups. - // - if (ptp->rc) - { - LPASIDLIST pList; - asc_AsidListCopy (&pList, &TASKDATA(ptp)->pAsidList); - - LPASOBJPROPLIST pPropList = NULL; - if (!asc_ObjectPropertiesGetMultiple (g.idClient, GET_RUDIMENTARY_DATA, g.idCell, pList, &pPropList, &ptp->status)) - ptp->rc = FALSE; - if (pPropList) - asc_ObjPropListFree (&pPropList); - - asc_AsidListFree (&pList); - } - - if (pListGroups) - Delete (pListGroups); - asc_AsidListFree (&lpp->pUserList); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Members_Get (LPTASKPACKET ptp) -{ - LPASIDLIST pGroups = (LPASIDLIST)( ptp->lpUser ); - - // Prepare an intermediate place for us to put the results of our search. - // We'll be doing lots of work in this intermediate list, so it'll be - // implemented as a hashlist with a key over the objects' ASIDs. - // - typedef struct - { - ASID idUser; - size_t cGroups; - } GROUP_MEMBER_FOUND, *LPGROUP_MEMBER_FOUND; - - LPHASHLIST pListUsers = New (HASHLIST); - LPHASHLISTKEY pListKeyAsid = pListUsers->CreateKey ("ASID", Key_Asid_Compare, Key_Asid_HashObject, Key_Asid_HashData); - - // For each group in the list, find all of that group's members - // - for (size_t iGroup = 0; iGroup < pGroups->cEntries; ++iGroup) - { - LPASIDLIST pMembers = NULL; - ULONG status; - - if (!asc_GroupMembersGet (g.idClient, g.idCell, pGroups->aEntries[ iGroup ].idObject, &pMembers, &status)) - continue; - - if (pMembers) - { - // For each member we found, make sure the member is in the big - // list we'll be returning. Use the {lParam} field of the - // list's entry as a counter, to remember how many groups have - // this member. - // - for (size_t iMember = 0; iMember < pMembers->cEntries; ++iMember) - { - // Is it in the list already? If not, add it. - // - LPGROUP_MEMBER_FOUND pFind; - if ((pFind = (LPGROUP_MEMBER_FOUND)pListKeyAsid->GetFirstObject (&pMembers->aEntries[ iMember ].idObject)) != NULL) - { - pFind->cGroups ++; - } - else - { - pFind = New (GROUP_MEMBER_FOUND); - pFind->idUser = pMembers->aEntries[ iMember ].idObject; - pFind->cGroups = 1; - pListUsers->Add (pFind); - } - } - - asc_AsidListFree (&pMembers); - } - } - - // Now that we have a list of users that match our search criteria, - // stick it in an ASID list. The lParam field for each ASID will be set - // to 1 if all groups have that member, or 0 if only some have it. - // - if (!asc_AsidListCreate (&TASKDATA(ptp)->pAsidList)) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - - if (ptp->rc) - { - for (LPENUM pEnum = pListUsers->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - LPGROUP_MEMBER_FOUND pFind = (LPGROUP_MEMBER_FOUND)( pEnum->GetObject() ); - - asc_AsidListAddEntry (&TASKDATA(ptp)->pAsidList, pFind->idUser, (LPARAM)( (pFind->cGroups == pGroups->cEntries) ? 1 : 0 )); - - pListUsers->Remove (pFind); - Delete (pFind); - } - } - - // Now that we have an ASID list full of users to return, make sure we - // have rudimentary properties for all those users. - // - if (ptp->rc) - { - LPASIDLIST pList; - asc_AsidListCopy (&pList, &TASKDATA(ptp)->pAsidList); - - LPASOBJPROPLIST pPropList = NULL; - if (!asc_ObjectPropertiesGetMultiple (g.idClient, GET_RUDIMENTARY_DATA, g.idCell, pList, &pPropList, &ptp->status)) - ptp->rc = FALSE; - if (pPropList) - asc_ObjPropListFree (&pPropList); - - asc_AsidListFree (&pList); - } - - if (pListUsers) - Delete (pListUsers); - asc_AsidListFree (&pGroups); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Members_Set (LPTASKPACKET ptp) -{ - LPGROUP_MEMBERS_SET_PARAMS lpp = (LPGROUP_MEMBERS_SET_PARAMS)( ptp->lpUser ); - - ptp->rc = Task_Group_Members_Set_Do (lpp, &ptp->status); - - asc_AsidListFree (&lpp->pGroups); - asc_AsidListFree (&lpp->pMembers); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -BOOL Task_Group_Members_Set_Do (LPGROUP_MEMBERS_SET_PARAMS lpp, ULONG *pStatus) -{ - BOOL rc = TRUE; - - // Maintain a structure describing any errors we encounter, so we can give - // a reasonable error dialog if need be. - // - LPERRORDATA ped = ED_Create (IDS_ERROR_CANT_SET_MEMBERS, IDS_ERROR_CANT_SET_MEMBERS_MULTIPLE); - - // We'll need the supplied member-list in a hashlist, so we can quickly - // test it to see if a particular member should remain in a group. - // - LPHASHLIST pMembersAllow = New (HASHLIST); - for (size_t iMember = 0; iMember < lpp->pMembers->cEntries; ++iMember) - pMembersAllow->AddUnique ((PVOID)(lpp->pMembers->aEntries[ iMember ].idObject)); - - // We'll have to do this next bit for each group in the supplied group-list - // - for (size_t iGroup = 0; iGroup < lpp->pGroups->cEntries; ++iGroup) - { - ULONG status; - - // Obtain the current list of members for this group - // - LPASIDLIST pMembersOld = NULL; - if (!asc_GroupMembersGet (g.idClient, g.idCell, lpp->pGroups->aEntries[ iGroup ].idObject, &pMembersOld, &status)) - { - ED_RegisterStatus (ped, lpp->pGroups->aEntries[ iGroup ].idObject, FALSE, status); - continue; - } - if (!pMembersOld) - continue; - - // Test each member in that current list to see if it's also on our - // pMembersAllow list. If not, remove it. - // - for (iMember = 0; iMember < pMembersOld->cEntries; ++iMember) - { - if (pMembersAllow->fIsInList ((PVOID)(pMembersOld->aEntries[iMember].idObject))) - continue; - - if (!asc_GroupMemberRemove (g.idClient, g.idCell, lpp->pGroups->aEntries[iGroup].idObject, pMembersOld->aEntries[iMember].idObject, &status)) - ED_RegisterStatus (ped, lpp->pGroups->aEntries[ iGroup ].idObject, FALSE, status); - } - - // Now the more complex part: see if there are any members in the - // supplied member-list which are marked as mandatory, but which - // aren't in our pMembersOld list. We'll need to put the latter in a - // hashlist for this... - // - LPHASHLIST pMembersOldList = New (HASHLIST); - for (iMember = 0; iMember < pMembersOld->cEntries; ++iMember) - pMembersOldList->AddUnique ((PVOID)(pMembersOld->aEntries[ iMember ].idObject)); - - for (iMember = 0; iMember < lpp->pMembers->cEntries; ++iMember) - { - if (!lpp->pMembers->aEntries[ iMember ].lParam) - continue; // member not mandatory - if (pMembersOldList->fIsInList ((PVOID)(lpp->pMembers->aEntries[ iMember ].idObject))) - continue; // already a member - - if (!asc_GroupMemberAdd (g.idClient, g.idCell, lpp->pGroups->aEntries[iGroup].idObject, lpp->pMembers->aEntries[iMember].idObject, &status)) - ED_RegisterStatus (ped, lpp->pGroups->aEntries[ iGroup ].idObject, FALSE, status); - } - - Delete (pMembersOldList); - - asc_AsidListFree (&pMembersOld); - } - - // If there were any errors, report them. - // - if ((*pStatus = ED_GetFinalStatus(ped)) != 0) - { - rc = FALSE; - ED_ShowErrorDialog(ped); - } - ED_Free(ped); - - // Done; clean up - // - Delete (pMembersAllow); - return rc; -} - - -void Task_Group_Enum (LPTASKPACKET ptp) -{ - LPCTSTR pszPattern = (LPCTSTR)( ptp->lpUser ); - - TCHAR szRegExp[ cchNAME ]; - TranslateRegExp (szRegExp, pszPattern); - if ((ptp->rc = asc_ObjectFindMultiple (g.idClient, g.idCell, TYPE_GROUP, szRegExp, NULL, &TASKDATA(ptp)->pAsidList, &ptp->status)) == TRUE) - { - LPASOBJPROPLIST pPropList = NULL; - - ptp->rc = asc_ObjectPropertiesGetMultiple (g.idClient, GET_RUDIMENTARY_DATA, g.idCell, TASKDATA(ptp)->pAsidList, &pPropList, &ptp->status); - - if (pPropList) - asc_ObjPropListFree (&pPropList); - } - - FreeString (pszPattern); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Rename (LPTASKPACKET ptp) -{ - LPGROUP_RENAME_PARAMS lpp = (LPGROUP_RENAME_PARAMS)( ptp->lpUser ); - - if ((ptp->rc = asc_GroupRename (g.idClient, g.idCell, lpp->idGroup, lpp->szNewName, &ptp->status)) != FALSE) - { - Display_RefreshView_Fast(); - } - - if (!ptp->rc && !IsWindow (ptp->hReply)) - { - TCHAR szOldName[ cchNAME ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, lpp->idGroup, szOldName); - ErrorDialog (ptp->status, IDS_ERROR_CANT_RENAME_GROUP, TEXT("%s%s"), szOldName, lpp->szNewName); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Owned_Get (LPTASKPACKET ptp) -{ - ASID idGroup = (ASID)( ptp->lpUser ); - - ptp->rc = asc_GroupOwnershipGet (g.idClient, g.idCell, idGroup, &TASKDATA(ptp)->pAsidList, &ptp->status); - - // Modify the ASID list to have lParams of 1. (This indicates that all - // our supplied groups own this thing; silly but consistent with the - // other such interfaces.) - // - if (TASKDATA(ptp)->pAsidList) - { - for (size_t ii = 0; ii < TASKDATA(ptp)->pAsidList->cEntries; ++ii) - TASKDATA(ptp)->pAsidList->aEntries[ ii ].lParam = 1; - } - - // Now that we have an ASID list full of groups to return, make sure we - // have rudimentary properties for all those groups. - // - if (ptp->rc) - { - LPASIDLIST pList; - asc_AsidListCopy (&pList, &TASKDATA(ptp)->pAsidList); - - LPASOBJPROPLIST pPropList = NULL; - if (!asc_ObjectPropertiesGetMultiple (g.idClient, GET_RUDIMENTARY_DATA, g.idCell, pList, &pPropList, &ptp->status)) - ptp->rc = FALSE; - if (pPropList) - asc_ObjPropListFree (&pPropList); - - asc_AsidListFree (&pList); - } -} - - -void Task_Group_Owned_Set (LPTASKPACKET ptp) -{ - LPGROUP_OWNED_SET_PARAMS lpp = (LPGROUP_OWNED_SET_PARAMS)( ptp->lpUser ); - - ptp->rc = Task_Group_Owned_Set_Do (lpp, &ptp->status); - - asc_AsidListFree (&lpp->pOwnedGroups); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -BOOL Task_Group_Owned_Set_Do (LPGROUP_OWNED_SET_PARAMS lpp, ULONG *pStatus) -{ - BOOL rc = TRUE; - - // Maintain a structure describing any errors we encounter, so we can give - // a reasonable error dialog if need be. - // - LPERRORDATA ped = ED_Create (IDS_ERROR_CANT_CHANGE_OWNER, IDS_ERROR_CANT_CHANGE_OWNER_MULTIPLE); - - // We'll need the supplied groups-to-own list in a hashlist, so we can - // quickly test it for inclusion of a particular group. - // - LPHASHLIST pGroupsAllow = New (HASHLIST); - for (size_t iGroup = 0; iGroup < lpp->pOwnedGroups->cEntries; ++iGroup) - pGroupsAllow->AddUnique ((PVOID)(lpp->pOwnedGroups->aEntries[ iGroup ].idObject)); - - // Obtain the current list-of-groups-owned for this group - // - LPASIDLIST pGroupsOld = NULL; - if ((rc = asc_GroupOwnershipGet (g.idClient, g.idCell, lpp->idGroup, &pGroupsOld, pStatus)) == FALSE) - pGroupsOld = NULL; - - if (!pGroupsOld) - { - for (size_t ii = 0; ii < lpp->pOwnedGroups->cEntries; ++ii) - ED_RegisterStatus (ped, lpp->pOwnedGroups->aEntries[ii].idObject, FALSE, *pStatus); - } - else - { - // Test each group in that current list to see if it's also on our - // pGroupsAllow list. If not, remove it. - // - for (iGroup = 0; iGroup < pGroupsOld->cEntries; ++iGroup) - { - if (pGroupsAllow->fIsInList ((PVOID)(pGroupsOld->aEntries[iGroup].idObject))) - continue; - - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet (g.idClient, GET_ALL_DATA, g.idCell, pGroupsOld->aEntries[iGroup].idObject, &Properties, &status)) - ED_RegisterStatus (ped, pGroupsOld->aEntries[iGroup].idObject, FALSE, status); - else - { - AFSADMSVR_CHANGEGROUP_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - lstrcpy (pp.szOwner, Properties.szName); // make group self-owned - pp.aaListStatus = Properties.u.GroupProperties.aaListStatus; - pp.aaListGroupsOwned = Properties.u.GroupProperties.aaListGroupsOwned; - pp.aaListMembers = Properties.u.GroupProperties.aaListMembers; - pp.aaAddMember = Properties.u.GroupProperties.aaAddMember; - pp.aaDeleteMember = Properties.u.GroupProperties.aaDeleteMember; - - if (!asc_GroupChange (g.idClient, g.idCell, pGroupsOld->aEntries[iGroup].idObject, &pp, &status)) - ED_RegisterStatus (ped, pGroupsOld->aEntries[iGroup].idObject, FALSE, status); - } - } - - // Now the more complex part: see if there are any groups in the - // supplied group-list which are marked as mandatory, but which - // aren't in our pGroupsOld list. We'll need to put the latter in a - // hashlist for this... - // - LPHASHLIST pGroupsOldList = New (HASHLIST); - for (iGroup = 0; iGroup < pGroupsOld->cEntries; ++iGroup) - pGroupsOldList->AddUnique ((PVOID)(pGroupsOld->aEntries[ iGroup ].idObject)); - - for (iGroup = 0; iGroup < lpp->pOwnedGroups->cEntries; ++iGroup) - { - if (!lpp->pOwnedGroups->aEntries[ iGroup ].lParam) - continue; // group not mandatory - if (pGroupsOldList->fIsInList ((PVOID)(lpp->pOwnedGroups->aEntries[ iGroup ].idObject))) - continue; // already a member - - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet (g.idClient, GET_ALL_DATA, g.idCell, lpp->pOwnedGroups->aEntries[iGroup].idObject, &Properties, &status)) - ED_RegisterStatus (ped, lpp->pOwnedGroups->aEntries[iGroup].idObject, FALSE, status); - else - { - AFSADMSVR_CHANGEGROUP_PARAMS pp; - memset (&pp, 0x00, sizeof(pp)); - pp.aaListStatus = Properties.u.GroupProperties.aaListStatus; - pp.aaListGroupsOwned = Properties.u.GroupProperties.aaListGroupsOwned; - pp.aaListMembers = Properties.u.GroupProperties.aaListMembers; - pp.aaAddMember = Properties.u.GroupProperties.aaAddMember; - pp.aaDeleteMember = Properties.u.GroupProperties.aaDeleteMember; - - if (asc_ObjectNameGet_Fast (g.idClient, g.idCell, lpp->idGroup, pp.szOwner, &status)) - { - if (!asc_GroupChange (g.idClient, g.idCell, lpp->pOwnedGroups->aEntries[iGroup].idObject, &pp, &status)) - ED_RegisterStatus (ped, lpp->pOwnedGroups->aEntries[iGroup].idObject, FALSE, status); - } - } - } - - Delete (pGroupsOldList); - asc_AsidListFree (&pGroupsOld); - } - - // If there were any errors, report them. - // - if ((*pStatus = ED_GetFinalStatus(ped)) != 0) - { - rc = FALSE; - ED_ShowErrorDialog(ped); - } - ED_Free(ped); - - // Done; clean up - // - Delete (pGroupsAllow); - return rc; -} - - -void Task_Group_Create (LPTASKPACKET ptp) -{ - LPGROUP_CREATE_PARAMS lpp = (LPGROUP_CREATE_PARAMS)(ptp->lpUser); - - // If no owner was specified, use our current credentials' ID. If - // we can't get that, we'll make each group self-owned. - // - if (!lpp->szOwner[0]) - { - TCHAR szCell[ cchNAME ]; - if (!AfsAppLib_CrackCredentials (g.hCreds, szCell, lpp->szOwner)) - lpp->szOwner[0] = TEXT('\0'); - } - - // We may actually have been asked to create more than one group here; - // the {lpp->mszNames} parameter is a multi-string. So everything we - // do, we'll do for each new group-name... - // - for (LPTSTR pszName = lpp->mszNames; pszName && *pszName; pszName += 1+lstrlen(pszName)) - { - // First create this new group account - // - ASID idGroup; - - AFSADMSVR_CREATEGROUP_PARAMS pp; - memset (&pp, 0x00, sizeof(AFSADMSVR_CREATEGROUP_PARAMS)); - pp.idGroup = lpp->idGroup; - lstrcpy (pp.szName, pszName); - lstrcpy (pp.szOwner, lpp->szOwner); - if (!pp.szOwner[0]) - lstrcpy (pp.szOwner, pszName); - - if ((ptp->rc = asc_GroupCreate (g.idClient, g.idCell, &pp, &idGroup, &ptp->status)) == FALSE) - { - if (!IsWindow (ptp->hReply)) - ErrorDialog (ptp->status, IDS_ERROR_CANT_CREATE_GROUP, TEXT("%s"), pszName); - continue; - } - - // Then change its properties to be what we want - // - if ((ptp->rc = asc_GroupChange (g.idClient, g.idCell, idGroup, &lpp->Properties, &ptp->status)) == FALSE) - { - if (!IsWindow (ptp->hReply)) - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGE_GROUP, TEXT("%s"), pszName); - } - if (!ptp->rc) - continue; - - // Finally update its lists of groups - // - if (lpp->pMembers) - { - GROUP_MEMBERS_SET_PARAMS pp; - memset (&pp, 0x00, sizeof(GROUP_MEMBERS_SET_PARAMS)); - asc_AsidListCreate (&pp.pGroups); - asc_AsidListAddEntry (&pp.pGroups, idGroup, 0); - asc_AsidListCopy (&pp.pMembers, &lpp->pMembers); - ptp->rc = Task_Group_Members_Set_Do (&pp, &ptp->status); - asc_AsidListFree (&pp.pGroups); - asc_AsidListFree (&pp.pMembers); - } - if (lpp->pGroupsOwner) - { - GROUP_OWNED_SET_PARAMS pp; - memset (&pp, 0x00, sizeof(GROUP_OWNED_SET_PARAMS)); - pp.idGroup = idGroup; - asc_AsidListCopy (&pp.pOwnedGroups, &lpp->pGroupsOwner); - ptp->rc = Task_Group_Owned_Set_Do (&pp, &ptp->status); - asc_AsidListFree (&pp.pOwnedGroups); - } - } - - // And we're done! - // - Display_PopulateList(); - - if (lpp->pGroupsOwner) - asc_AsidListFree (&lpp->pGroupsOwner); - if (lpp->pMembers) - asc_AsidListFree (&lpp->pMembers); - if (lpp->mszNames) - FreeString (lpp->mszNames); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Group_Delete (LPTASKPACKET ptp) -{ - LPASIDLIST pGroupList = (LPASIDLIST)(ptp->lpUser); - - // Maintain a structure describing any errors we encounter, so we can give - // a reasonable error dialog if need be. - // - LPERRORDATA ped = ED_Create (IDS_ERROR_CANT_DELETE_GROUP, IDS_ERROR_CANT_DELETE_GROUP_MULTIPLE); - - // Go through and delete these users - // - for (size_t iGroup = 0; iGroup < pGroupList->cEntries; ++iGroup) - { - ULONG status; - if (!asc_GroupDelete (g.idClient, g.idCell, pGroupList->aEntries[iGroup].idObject, &status)) - ED_RegisterStatus (ped, pGroupList->aEntries[iGroup].idObject, FALSE, status); - } - - // If there were any errors, report them. - // - if (ED_GetFinalStatus(ped) && !IsWindow(ptp->hReply)) - ED_ShowErrorDialog(ped); - ED_Free(ped); - - // And we're done! - // - Display_PopulateList(); - - if (pGroupList) - asc_AsidListFree (&pGroupList); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Cell_Change (LPTASKPACKET ptp) -{ - LPCELL_CHANGE_PARAMS lpp = (LPCELL_CHANGE_PARAMS)(ptp->lpUser); - - AFSADMSVR_CHANGECELL_PARAMS Change; - memset (&Change, 0x00, sizeof(Change)); - Change.idUserMax = (DWORD)(lpp->idUserMax); - Change.idGroupMax = (DWORD)(lpp->idGroupMax); - ptp->rc = asc_CellChange (g.idClient, lpp->idCell, &Change, &ptp->status); - - if (!ptp->rc && !IsWindow (ptp->hReply)) - { - TCHAR szCell[ cchNAME ]; - asc_CellNameGet_Fast (g.idClient, lpp->idCell, szCell); - ErrorDialog (ptp->status, IDS_ERROR_CANT_CHANGE_CELL, TEXT("%s"), szCell); - } - - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_List_Translate (LPTASKPACKET ptp) -{ - LPLIST_TRANSLATE_PARAMS lpp = (LPLIST_TRANSLATE_PARAMS)( ptp->lpUser ); - TASKDATA(ptp)->Type = lpp->Type; - - // We'll need a hashlist into which to dump our results as we build - // them (we use a hashlist so we can quickly detect and ignore duplicates). - // - LPHASHLIST pList = New (HASHLIST); - - // Now split the input string up into a series of names. To do that, - // we'll valid separator characters are; since names can't have whitespace, - // we'll include that. - // - TCHAR szSeparators[ cchRESOURCE ]; - if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SLIST, szSeparators, cchRESOURCE)) - szSeparators[0] = TEXT(','); - GetString (&szSeparators[1], IDS_SEPARATORS); - - if (lpp->pszNames) - { - LPCTSTR pszStart = lpp->pszNames; - while (iswhite(*pszStart) || lstrchr (szSeparators, *pszStart)) - ++pszStart; - - while (*pszStart) - { - // Find the first non-name character - // - LPCTSTR pszEnd = pszStart; - while (*pszEnd && !iswhite(*pszEnd) && !lstrchr(szSeparators, *pszEnd)) - ++pszEnd; - - // Copy off this particular name - // - TCHAR szName[ cchNAME ]; - lstrcpy (szName, pszStart); - szName[ pszEnd - pszStart ] = TEXT('\0'); - - // Find the next valid-name character - // - pszStart = pszEnd; - while (iswhite(*pszStart) || lstrchr(szSeparators, *pszStart)) - ++pszStart; - - // Translate this particular name. We'll also handle wildcards - // here: if we don't get any wildcard characters, treat it as - // a direct lookup; if we do, treat it as a regexp match. - // - if (lstrchr (szName, TEXT('*')) || lstrchr (szName, TEXT('?')) || - lstrchr (szName, TEXT('^')) || lstrchr (szName, TEXT('!'))) - { - TCHAR szRegExp[ cchNAME ]; - TranslateRegExp (szRegExp, szName); - - LPASIDLIST pAsidList; - if (asc_ObjectFindMultiple (g.idClient, g.idCell, lpp->Type, szRegExp, NULL, &pAsidList, &ptp->status)) - { - if (pAsidList) - { - for (size_t ii = 0; ii < pAsidList->cEntries; ++ii) - pList->AddUnique ((PVOID)(pAsidList->aEntries[ii].idObject)); - asc_AsidListFree (&pAsidList); - } - } - } - else // No wildcards; just look up the name directly - { - ASID idObject; - if (asc_ObjectFind (g.idClient, g.idCell, lpp->Type, szName, &idObject, &ptp->status)) - pList->AddUnique ((PVOID)idObject); - } - } - } - - // Finally, build an ASIDLIST from our hashlist's contents. - // - if (!asc_AsidListCreate (&TASKDATA(ptp)->pAsidList)) - { - ptp->rc = FALSE; - ptp->status = ERROR_NOT_ENOUGH_MEMORY; - } - else - { - for (LPENUM pEnum = pList->FindFirst(); pEnum; pEnum = pEnum->FindNext()) - { - ASID idObject = (ASID)(pEnum->GetObject()); - asc_AsidListAddEntry (&TASKDATA(ptp)->pAsidList, idObject, 0); - } - } - - // Done! Clean up. - // - Delete (pList); - FreeString (lpp->pszNames); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Object_Listen (LPTASKPACKET ptp) -{ - LPOBJECT_LISTEN_PARAMS lpp = (LPOBJECT_LISTEN_PARAMS)( ptp->lpUser ); - - if (IsWindow(lpp->hNotify) && (lpp->pAsidList)) - ptp->rc = asc_ObjectListenMultiple (g.idClient, g.idCell, lpp->pAsidList, lpp->hNotify, &ptp->status); - else - ptp->rc = asc_ObjectListenClear (g.idClient, lpp->hNotify, &ptp->status); - - if (lpp->pAsidList) - asc_AsidListFree (&lpp->pAsidList); - Delete (lpp); - ptp->lpUser = 0; // we freed this; don't let the caller use it again -} - - -void Task_Object_Get (LPTASKPACKET ptp) -{ - ASID idObject = (ASID)(ptp->lpUser); - ptp->rc = asc_ObjectPropertiesGet (g.idClient, GET_ALL_DATA, g.idCell, idObject, &TASKDATA(ptp)->Properties, &ptp->status); -} - - -void Task_Set_Refresh (LPTASKPACKET ptp) -{ - if (g.idCell) - { - ptp->rc = asc_CellRefreshRateSet (g.idClient, g.idCell, gr.cminRefreshRate, &ptp->status); - } -} - - -void Task_Expired_Creds (LPTASKPACKET ptp) -{ - if (g.idCell) - { - CheckForExpiredCredentials(); - } -} - - -void WeedAsidList (LPASIDLIST *ppList, BOOL fWantMachines) -{ - ULONG status; - - // First off, we can't do anything unless we have these guys' names. - // - if (ppList && (*ppList) && (*ppList)->cEntries) - { - LPASOBJPROPLIST pPropList = NULL; - asc_ObjectPropertiesGetMultiple (g.idClient, GET_RUDIMENTARY_DATA, g.idCell, *ppList, &pPropList, &status); - if (pPropList) - asc_ObjPropListFree (&pPropList); - } - - for (size_t ii = 0; ppList && (*ppList) && (ii < (*ppList)->cEntries); ) - { - TCHAR szName[ cchRESOURCE ]; - if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, (*ppList)->aEntries[ ii ].idObject, szName, &status)) - { - ++ii; - continue; - } - - if (fIsMachineAccount(szName) == fWantMachines) - ++ii; - else - asc_AsidListRemoveEntryByIndex (ppList, ii); - } -} - - -void TranslateRegExp (LPTSTR pszTarget, LPCTSTR pszSource) -{ - if (pszSource) - { - if (!gr.fWindowsRegexp) - { - lstrcpy (pszTarget, pszSource); - } - else - { - for ( ; *pszSource; pszSource++) - { - switch (*pszSource) - { - case TEXT('['): - case TEXT(']'): - case TEXT('.'): - *pszTarget++ = TEXT('\\'); - *pszTarget++ = *pszSource; - break; - - case TEXT('?'): - *pszTarget++ = TEXT('.'); - break; - - case TEXT('*'): - *pszTarget++ = TEXT('.'); - *pszTarget++ = TEXT('*'); - break; - - default: - *pszTarget++ = *pszSource; - break; - } - } - } - } - - *pszTarget++ = TEXT('\0'); -} - - -BOOL PerformRefresh (LPTASKPACKET ptp, ASID idScope, ULONG *pStatus) -{ - // Invalidate the admin server's cached information about the specified - // object. Remember that this is recursive hierarchically: if you pass - // in a cell's ID, for instance, information about all users, groups, - // servers, services, partitions and volumes anywhere in that cell will - // be discarded. - // - if (!idScope) - idScope = g.idCell; - - if (!asc_ObjectRefresh (g.idClient, g.idCell, idScope, pStatus)) - return FALSE; - - // The Refresh call above is a misnomer; it's really an Invalidate request, - // in that it only causes the admin server to dump its cached information - // over the specified scope. At this point we need to do something to - // trigger the server to re-query that information, so that it will send - // an ACTION_REFRESH notification (indicating it's doing that requery), - // which we'll pick up on and use as a trigger to refresh our display. - // A convenient way to get the server to do that re-query is to ask it - // to perform some simple search among the users in the cell--we'll ask - // it to find, oh, say, "JoeBobUser", and in order to do that, it will - // have to re-fill its cache. - // - LPASIDLIST pListDummy; - ULONG statusDummy; - (void)asc_ObjectFindMultiple (g.idClient, g.idCell, TYPE_USER, TEXT("JoeBobUser"), NULL, &pListDummy, &statusDummy); - if (pListDummy != NULL) - asc_AsidListFree (&pListDummy); - - return TRUE; -} - diff --git a/src/WINNT/afsusrmgr/task.h b/src/WINNT/afsusrmgr/task.h deleted file mode 100644 index 561faeda5..000000000 --- a/src/WINNT/afsusrmgr/task.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TASK_H -#define TASK_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -typedef struct - { - TCHAR szCell[ cchNAME ]; - BOOL fCloseAppOnFail; - PVOID hCreds; - } OPENCELL_PARAMS, *LPOPENCELL_PARAMS; - -typedef struct - { - ASID idUser; - AFSADMSVR_CHANGEUSER_PARAMS NewProperties; - } USER_CHANGE_PARAMS, *LPUSER_CHANGE_PARAMS; - -typedef struct - { - LPASIDLIST pUsers; - LPASIDLIST pGroups; - BOOL fMembership; - } USER_GROUPLIST_SET_PARAMS, *LPUSER_GROUPLIST_SET_PARAMS; - -typedef struct - { - ASID idUser; - int keyVersion; - TCHAR keyString[ cchRESOURCE ]; - BYTE keyData[ ENCRYPTIONKEYLENGTH ]; - } USER_CPW_PARAMS, *LPUSER_CPW_PARAMS; - -typedef struct - { - LPTSTR mszNames; - TCHAR szPassword[ cchRESOURCE ]; - int idUser; - AFSADMSVR_CHANGEUSER_PARAMS Properties; - LPASIDLIST pGroupsMember; - LPASIDLIST pGroupsOwner; - BOOL fCreateKAS; - BOOL fCreatePTS; - } USER_CREATE_PARAMS, *LPUSER_CREATE_PARAMS; - -typedef struct - { - LPASIDLIST pUserList; - BOOL fDeleteKAS; - BOOL fDeletePTS; - } USER_DELETE_PARAMS, *LPUSER_DELETE_PARAMS; - -typedef struct - { - ASID idGroup; - AFSADMSVR_CHANGEGROUP_PARAMS NewProperties; - } GROUP_CHANGE_PARAMS, *LPGROUP_CHANGE_PARAMS; - -typedef struct - { - LPASIDLIST pUserList; - BOOL fMembership; - } GROUP_SEARCH_PARAMS, *LPGROUP_SEARCH_PARAMS; - -typedef struct - { - LPASIDLIST pGroups; - LPASIDLIST pMembers; - } GROUP_MEMBERS_SET_PARAMS, *LPGROUP_MEMBERS_SET_PARAMS; - -typedef struct - { - ASID idGroup; - TCHAR szNewName[ cchNAME ]; - } GROUP_RENAME_PARAMS, *LPGROUP_RENAME_PARAMS; - -typedef struct - { - ASID idGroup; - LPASIDLIST pOwnedGroups; - } GROUP_OWNED_SET_PARAMS, *LPGROUP_OWNED_SET_PARAMS; - -typedef struct - { - LPTSTR mszNames; - TCHAR szOwner[ cchNAME ]; - int idGroup; - AFSADMSVR_CHANGEGROUP_PARAMS Properties; - LPASIDLIST pMembers; - LPASIDLIST pGroupsOwner; - } GROUP_CREATE_PARAMS, *LPGROUP_CREATE_PARAMS; - -typedef struct - { - LPCTSTR pszNames; - ASOBJTYPE Type; - } LIST_TRANSLATE_PARAMS, *LPLIST_TRANSLATE_PARAMS; - -typedef struct - { - HWND hNotify; - LPASIDLIST pAsidList; - } OBJECT_LISTEN_PARAMS, *LPOBJECT_LISTEN_PARAMS; - -typedef struct - { - ASID idCell; - int idUserMax; - int idGroupMax; - } CELL_CHANGE_PARAMS, *LPCELL_CHANGE_PARAMS; - -typedef enum - { - taskOPENCELL, // lp = new OPENCELL_PARAMS - taskUPD_CREDS, // lp = unused - taskUPD_USERS, // lp = unused - taskUPD_GROUPS, // lp = unused - taskUPD_MACHINES, // lp = unused - taskREFRESH, // lp = (ASID)idRefreshScope - taskREFRESHMULT, // lp = scope (from asc_AsidListCreate) - taskGET_ACTIONS, // lp = unused - taskGET_RANDOM_KEY, // lp = unused - taskUSER_CHANGE, // lp = new USER_CHANGE_PARAMS - taskUSER_FIND, // lp = CloneString(szUserName) - taskUSER_ENUM, // lp = CloneString(szPattern) or NULL - taskUSER_GROUPLIST_SET, // lp = new USER_GROUPLIST_SET_PARAMS - taskUSER_CPW, // lp = new USER_CPW_PARAMS - taskUSER_UNLOCK, // lp = users (from asc_AsidListCreate) - taskUSER_CREATE, // lp = new USER_CREATE_PARAMS - taskUSER_DELETE, // lp = new USER_DELETE_PARAMS - taskGROUP_CHANGE, // lp = new GROUP_CHANGE_PARAMS - taskGROUP_SEARCH, // lp = new GROUP_SEARCH_PARAMS - taskGROUP_MEMBERS_GET, // lp = groups (from asc_AsidListCreate) - taskGROUP_MEMBERS_SET, // lp = new GROUP_MEMBERS_SET_PARAMS - taskGROUP_ENUM, // lp = CloneString(szPattern) or NULL - taskGROUP_RENAME, // lp = new GROUP_RENAME_PARAMS - taskGROUP_OWNED_GET, // lp = (ASID)idGroup - taskGROUP_OWNED_SET, // lp = new GROUP_OWNED_SET_PARAMS - taskGROUP_CREATE, // lp = new GROUP_CREATE_PARAMS - taskGROUP_DELETE, // lp = groups (from asc_AsidListCreate) - taskCELL_CHANGE, // lp = new CELL_CHANGE_PARAMS - taskLIST_TRANSLATE, // lp = new LIST_TRANSLATE_PARAMS - taskOBJECT_LISTEN, // lp = new OBJECT_LISTEN_PARAMS - taskOBJECT_GET, // lp = (ASID)idObject - taskSET_REFRESH, // lp = unused - taskEXPIRED_CREDS // lp = unused - } TASK; - -typedef struct - { - ASID idCell; // what was found out? - LPASIDLIST pAsidList; - LPASACTIONLIST pActionList; - TCHAR szPattern[ cchNAME ]; - ASID idObject; - ASOBJTYPE Type; - ASOBJPROP Properties; - BOOL fMembership; - BYTE key[ ENCRYPTIONKEYLENGTH ]; - } TASKPACKETDATA, *LPTASKPACKETDATA; - -#define TASKDATA(_ptp) ((LPTASKPACKETDATA)(ptp->pReturn)) - - -LPTASKPACKET CreateTaskPacket (int idTask, HWND hReply, PVOID lpUser); -void FreeTaskPacket (LPTASKPACKET ptp); -void PerformTask (LPTASKPACKET ptp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_col.cpp b/src/WINNT/afsusrmgr/usr_col.cpp deleted file mode 100644 index baa0ab219..000000000 --- a/src/WINNT/afsusrmgr/usr_col.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_col.h" - - -/* - * USER-VIEW COLUMNS __________________________________________________________ - * - */ - -void User_SetDefaultView (LPVIEWINFO lpvi, ICONVIEW *piv) -{ - lpvi->lvsView = FLS_VIEW_SMALL; - lpvi->nColsAvail = nUSERCOLUMNS; - - for (size_t iCol = 0; iCol < nUSERCOLUMNS; ++iCol) - { - lpvi->cxColumns[ iCol ] = USERCOLUMNS[ iCol ].cxWidth; - lpvi->idsColumns[ iCol ] = USERCOLUMNS[ iCol ].idsColumn; - } - - lpvi->iSort = usrcolNAME; - - lpvi->nColsShown = 5; - lpvi->aColumns[0] = (int)usrcolNAME; - lpvi->aColumns[1] = (int)usrcolUID; - lpvi->aColumns[2] = (int)usrcolCHANGEPW; - lpvi->aColumns[3] = (int)usrcolREUSEPW; - lpvi->aColumns[4] = (int)usrcolEXPIRES; - - *piv = ivSTATUS; -} - - -void User_GetColumn (ASID idObject, USERCOLUMN iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType) -{ - if (pszText) - *pszText = TEXT('\0'); - if (pstDate) - memset (pstDate, 0x00, sizeof(SYSTEMTIME)); - if (pcsec) - *pcsec = 0; - if (pcType) - *pcType = ctALPHABETIC; - - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idObject, &Properties)) - { - switch (iCol) - { - case usrcolNAME: - if (pcType) - *pcType = ctALPHABETIC; - if (pszText) - User_GetDisplayName (pszText, &Properties); - break; - - case usrcolFLAGS: - if (pcType) - *pcType = ctALPHABETIC; - if (pszText) - { - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (Properties.u.UserProperties.KASINFO.fIsAdmin) - { - GetString (pszText, IDS_USRFLAG_ADMIN); - pszText = &pszText[ lstrlen(pszText) -1 ]; - } - if (Properties.u.UserProperties.KASINFO.fCanGetTickets) - { - GetString (pszText, IDS_USRFLAG_TICKET); - pszText = &pszText[ lstrlen(pszText) -1 ]; - } - if (Properties.u.UserProperties.KASINFO.fEncrypt) - { - GetString (pszText, IDS_USRFLAG_ENCRYPT); - pszText = &pszText[ lstrlen(pszText) -1 ]; - } - if (Properties.u.UserProperties.KASINFO.fCanChangePassword) - { - GetString (pszText, IDS_USRFLAG_CHANGEPW); - pszText = &pszText[ lstrlen(pszText) -1 ]; - } - if (Properties.u.UserProperties.KASINFO.fCanReusePasswords) - { - GetString (pszText, IDS_USRFLAG_REUSEPW); - pszText = &pszText[ lstrlen(pszText) -1 ]; - } - } - } - break; - - case usrcolADMIN: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - GetString (pszText, (Properties.u.UserProperties.KASINFO.fIsAdmin) ? IDS_YES : IDS_NO); - } - break; - - case usrcolTICKET: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - GetString (pszText, (Properties.u.UserProperties.KASINFO.fCanGetTickets) ? IDS_YES : IDS_NO); - } - break; - - case usrcolSYSTEM: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - GetString (pszText, (Properties.u.UserProperties.KASINFO.fEncrypt) ? IDS_NO : IDS_YES); - } - break; - - case usrcolCHANGEPW: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - GetString (pszText, (Properties.u.UserProperties.KASINFO.fCanChangePassword) ? IDS_YES : IDS_NO); - } - break; - - case usrcolREUSEPW: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - GetString (pszText, (Properties.u.UserProperties.KASINFO.fCanReusePasswords) ? IDS_YES : IDS_NO); - } - break; - - case usrcolEXPIRES: - if (pcType) - *pcType = ctDATE; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - FormatTime (pszText, TEXT("%t"), &Properties.u.UserProperties.KASINFO.timeExpires); - if (pstDate) - memcpy (pstDate, &Properties.u.UserProperties.KASINFO.timeExpires, sizeof(SYSTEMTIME)); - } - break; - - case usrcolLASTPW: - if (pcType) - *pcType = ctDATE; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - FormatTime (pszText, TEXT("%t"), &Properties.u.UserProperties.KASINFO.timeLastPwChange); - if (pstDate) - memcpy (pstDate, &Properties.u.UserProperties.KASINFO.timeLastPwChange, sizeof(SYSTEMTIME)); - } - break; - - case usrcolLASTMOD: - if (pcType) - *pcType = ctDATE; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - FormatTime (pszText, TEXT("%t"), &Properties.u.UserProperties.KASINFO.timeLastMod); - if (pstDate) - memcpy (pstDate, &Properties.u.UserProperties.KASINFO.timeLastMod, sizeof(SYSTEMTIME)); - } - break; - - case usrcolLASTMODBY: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - lstrcpy (pszText, Properties.u.UserProperties.KASINFO.szUserLastMod); - } - break; - - case usrcolLIFETIME: - if (pcType) - *pcType = ctELAPSED; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - FormatElapsedSeconds (pszText, Properties.u.UserProperties.KASINFO.csecTicketLifetime); - if (pcsec) - *pcsec = Properties.u.UserProperties.KASINFO.csecTicketLifetime; - } - break; - - case usrcolCDAYPW: - if (pcType) - *pcType = ctELAPSED; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - FormatElapsedSeconds (pszText, Properties.u.UserProperties.KASINFO.cdayPwExpire * csec1DAY); - if (pcsec) - *pcsec = Properties.u.UserProperties.KASINFO.cdayPwExpire * csec1DAY; - } - break; - - case usrcolCFAILLOGIN: - if (pcType) - *pcType = ctNUMERIC; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - wsprintf (pszText, TEXT("%lu"), Properties.u.UserProperties.KASINFO.cFailLogin); - } - break; - - case usrcolCSECLOCK: - if (pcType) - *pcType = ctELAPSED; - if (Properties.u.UserProperties.fHaveKasInfo) - { - if (pszText) - FormatElapsedSeconds (pszText, Properties.u.UserProperties.KASINFO.csecFailLoginLock); - if (pcsec) - *pcsec = Properties.u.UserProperties.KASINFO.csecFailLoginLock; - } - break; - - case usrcolCGROUPMAX: - if (pcType) - *pcType = ctNUMERIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - wsprintf (pszText, TEXT("%lu"), Properties.u.UserProperties.PTSINFO.cgroupCreationQuota); - } - break; - - case usrcolUID: - if (pcType) - *pcType = ctNUMERIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.uidName); - } - break; - - case usrcolOWNER: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - { - if (Properties.u.UserProperties.PTSINFO.szOwner[0]) - wsprintf (pszText, TEXT("%s (%ld)"), Properties.u.UserProperties.PTSINFO.szOwner, Properties.u.UserProperties.PTSINFO.uidOwner); - else - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.uidOwner); - } - } - break; - - case usrcolCREATOR: - if (pcType) - *pcType = ctALPHABETIC; - if (Properties.u.UserProperties.fHavePtsInfo) - { - if (pszText) - { - if (Properties.u.UserProperties.PTSINFO.szCreator[0]) - wsprintf (pszText, TEXT("%s (%ld)"), Properties.u.UserProperties.PTSINFO.szCreator, Properties.u.UserProperties.PTSINFO.uidCreator); - else - wsprintf (pszText, TEXT("%ld"), Properties.u.UserProperties.PTSINFO.uidCreator); - } - } - break; - } - } -} - - -BOOL User_GetDisplayName (LPTSTR pszText, LPASOBJPROP pProperties) -{ - lstrcpy (pszText, pProperties->szName); - - if (pProperties->u.UserProperties.szInstance[0]) - { - // Don't show the Instance value for certain entries - if ( (lstrcmpi (pProperties->szName, TEXT("admin"))) && - (lstrcmpi (pProperties->szName, TEXT("krbtgt"))) ) - { - wsprintf (&pszText[ lstrlen(pszText) ], TEXT(".%s"), pProperties->u.UserProperties.szInstance); - } - } - - return !!*pszText; -} - - -BOOL User_GetDisplayName (LPTSTR pszText, ASID idUser) -{ - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idUser, &Properties)) - { - return User_GetDisplayName (pszText, &Properties); - } - else - { - return asc_ObjectNameGet_Fast (g.idClient, g.idCell, idUser, pszText); - } -} - - -void User_SplitDisplayName (LPTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance) -{ - if (pszName) - lstrcpy (pszName, pszFull); - if (pszInstance) - lstrcpy (pszInstance, TEXT("")); - - if (!fIsMachineAccount (pszFull)) - { - if (pszName && pszInstance) - { - LPTSTR pchDot; - if ((pchDot = (LPTSTR)lstrchr (pszName, TEXT('.'))) != NULL) - { - *pchDot = TEXT('\0'); - lstrcpy (pszInstance, &pchDot[1]); - } - } - } -} - diff --git a/src/WINNT/afsusrmgr/usr_col.h b/src/WINNT/afsusrmgr/usr_col.h deleted file mode 100644 index e75e76b01..000000000 --- a/src/WINNT/afsusrmgr/usr_col.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_COL_H -#define USR_COL_H - -#include "display.h" - - -/* - * USERLIST COLUMNS ___________________________________________________________ - * - */ - -typedef enum - { - usrcolNAME, - usrcolFLAGS, - usrcolADMIN, - usrcolTICKET, - usrcolSYSTEM, - usrcolCHANGEPW, - usrcolREUSEPW, - usrcolEXPIRES, - usrcolLASTPW, - usrcolLASTMOD, - usrcolLASTMODBY, - usrcolLIFETIME, - usrcolCDAYPW, - usrcolCFAILLOGIN, - usrcolCSECLOCK, - usrcolCGROUPMAX, - usrcolUID, - usrcolOWNER, - usrcolCREATOR, - } USERCOLUMN; - -static struct - { - int idsColumn; - int cxWidth; - } -USERCOLUMNS[] = - { - { IDS_USRCOL_NAME, 100 }, // usrcolNAME - { IDS_USRCOL_FLAGS, 75 }, // usrcolFLAGS - { IDS_USRCOL_ADMIN, 40 | COLUMN_CENTERJUST }, // usrcolADMIN - { IDS_USRCOL_TICKET, 40 | COLUMN_CENTERJUST }, // usrcolTICKET - { IDS_USRCOL_SYSTEM, 40 | COLUMN_CENTERJUST }, // usrcolSYSTEM - { IDS_USRCOL_CHANGEPW, 40 | COLUMN_CENTERJUST }, // usrcolCHANGEPW - { IDS_USRCOL_REUSEPW, 40 | COLUMN_CENTERJUST }, // usrcolREUSEPW - { IDS_USRCOL_EXPIRES, 75 }, // usrcolEXPIRES - { IDS_USRCOL_LASTPW, 75 }, // usrcolLASTPW - { IDS_USRCOL_LASTMOD, 75 }, // usrcolLASTMOD - { IDS_USRCOL_LASTMODBY, 100 }, // usrcolLASTMODBY - { IDS_USRCOL_LIFETIME, 50 | COLUMN_RIGHTJUST }, // usrcolLIFETIME - { IDS_USRCOL_CDAYPW, 50 | COLUMN_RIGHTJUST }, // usrcolCDAYPW - { IDS_USRCOL_CFAILLOGIN, 50 | COLUMN_RIGHTJUST }, // usrcolCFAILLOGIN - { IDS_USRCOL_CSECLOCK, 50 | COLUMN_RIGHTJUST }, // usrcolCSECLOCK - { IDS_USRCOL_CGROUPMAX, 50 | COLUMN_RIGHTJUST }, // usrcolCGROUPMAX - { IDS_USRCOL_UID, 50 | COLUMN_RIGHTJUST }, // usrcolUID - { IDS_USRCOL_OWNER, 100 }, // usrcolOWNER - { IDS_USRCOL_CREATOR, 100 }, // usrcolCREATOR - }; - -#define nUSERCOLUMNS (sizeof(USERCOLUMNS)/sizeof(USERCOLUMNS[0])) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void User_SetDefaultView (LPVIEWINFO lpvi, ICONVIEW *piv); - -void User_GetColumn (ASID idObject, USERCOLUMN iCol, LPTSTR pszText, LPSYSTEMTIME pstDate, LONG *pcsec, COLUMNTYPE *pcType); - -BOOL User_GetDisplayName (LPTSTR pszText, LPASOBJPROP pProperties); -BOOL User_GetDisplayName (LPTSTR pszText, ASID idUser); - -void User_SplitDisplayName (LPTSTR pszFull, LPTSTR pszName, LPTSTR pszInstance); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_cpw.cpp b/src/WINNT/afsusrmgr/usr_cpw.cpp deleted file mode 100644 index 40e2e25a1..000000000 --- a/src/WINNT/afsusrmgr/usr_cpw.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_cpw.h" -#include "usr_col.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK User_Password_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void User_Password_OnInitDialog (HWND hDlg); -BOOL User_Password_OnOK (HWND hDlg); -void User_Password_OnSelectVer (HWND hDlg); -void User_Password_OnSelectType (HWND hDlg); -void User_Password_OnType (HWND hDlg); -void User_Password_OnRandom (HWND hDlg); -void User_Password_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void User_ShowChangePassword (HWND hParent, ASID idUser) -{ - ModalDialogParam (IDD_USER_PASSWORD, hParent, (DLGPROC)User_Password_DlgProc, (LPARAM)idUser); -} - - -BOOL CALLBACK User_Password_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_USER_PASSWORD, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - User_Password_OnInitDialog (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskGET_RANDOM_KEY) - User_Password_OnEndTask_Random (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (User_Password_OnOK (hDlg)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_CPW_VERSION_AUTO: - case IDC_CPW_VERSION_MANUAL: - User_Password_OnSelectVer (hDlg); - break; - - case IDC_CPW_BYSTRING: - case IDC_CPW_BYDATA: - User_Password_OnSelectType (hDlg); - break; - - case IDC_CPW_STRING: - case IDC_CPW_DATA: - User_Password_OnType (hDlg); - break; - - case IDC_CPW_RANDOM: - User_Password_OnRandom (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void User_Password_OnInitDialog (HWND hDlg) -{ - ASID idUser = (ASID)GetWindowLong (hDlg, DWL_USER); - - // Get the current properties for this user - // - ULONG status; - TCHAR szName[ cchNAME ]; - User_GetDisplayName (szName, idUser); - - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, idUser, &Properties, &status)) - { - ErrorDialog (status, IDS_ERROR_CANT_GET_USERPROP, TEXT("%s"), szName); - EndDialog (hDlg, IDCANCEL); - return; - } - - // Fill in the text at the top of the dialog - // - TCHAR szOld[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CPW_TITLE, szOld, cchRESOURCE); - - LPTSTR pszText = FormatString (szOld, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_CPW_TITLE, pszText); - FreeString (pszText); - - // Check the appropriate radio buttons, etc - // - CheckDlgButton (hDlg, IDC_CPW_VERSION_AUTO, TRUE); - CheckDlgButton (hDlg, IDC_CPW_BYSTRING, TRUE); - CreateSpinner (GetDlgItem (hDlg, IDC_CPW_VERSION), 10, FALSE, 1, 1+Properties.u.UserProperties.KASINFO.keyVersion, 255); - User_Password_OnSelectType (hDlg); - User_Password_OnSelectVer (hDlg); -} - - -void User_Password_OnSelectVer (HWND hDlg) -{ - EnableWindow (GetDlgItem (hDlg, IDC_CPW_VERSION), IsDlgButtonChecked (hDlg, IDC_CPW_VERSION_MANUAL)); -} - - -void User_Password_OnSelectType (HWND hDlg) -{ - EnableWindow (GetDlgItem (hDlg, IDC_CPW_STRING), IsDlgButtonChecked (hDlg, IDC_CPW_BYSTRING)); - EnableWindow (GetDlgItem (hDlg, IDC_CPW_DATA), IsDlgButtonChecked (hDlg, IDC_CPW_BYDATA)); - EnableWindow (GetDlgItem (hDlg, IDC_CPW_RANDOM), IsDlgButtonChecked (hDlg, IDC_CPW_BYDATA)); - User_Password_OnType (hDlg); -} - - -void User_Password_OnType (HWND hDlg) -{ - BOOL fEnable = FALSE; - - if (IsDlgButtonChecked (hDlg, IDC_CPW_BYSTRING)) - { - TCHAR szKey[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CPW_STRING, szKey, cchRESOURCE); - if (szKey[0] != TEXT('\0')) - fEnable = TRUE; - } - else // (IsDlgButtonChecked (hDlg, IDC_CPW_BYDATA)) - { - TCHAR szKey[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CPW_DATA, szKey, cchRESOURCE); - - BYTE key[ ENCRYPTIONKEYLENGTH ]; - if (ScanServerKey (key, szKey)) - fEnable = TRUE; - } - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void User_Password_OnRandom (HWND hDlg) -{ - StartTask (taskGET_RANDOM_KEY, hDlg, 0); -} - - -BOOL User_Password_OnOK (HWND hDlg) -{ - ASID idUser = (ASID)GetWindowLong (hDlg, DWL_USER); - - LPUSER_CPW_PARAMS lpp = New (USER_CPW_PARAMS); - memset (lpp, 0x00, sizeof(USER_CPW_PARAMS)); - lpp->idUser = idUser; - - if (IsDlgButtonChecked (hDlg, IDC_CPW_VERSION_MANUAL)) - lpp->keyVersion = SP_GetPos (GetDlgItem (hDlg, IDC_CPW_VERSION)); - else // (IsDlgButtonChecked (hDlg, IDC_CPW_VERSION_AUTO)) - lpp->keyVersion = 0; - - if (IsDlgButtonChecked (hDlg, IDC_CPW_BYSTRING)) - { - GetDlgItemText (hDlg, IDC_CPW_STRING, lpp->keyString, cchRESOURCE); - } - else // (IsDlgButtonChecked (hDlg, IDC_CPW_BYDATA)) - { - TCHAR szKey[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CPW_DATA, szKey, cchRESOURCE); - - if (!ScanServerKey (lpp->keyData, szKey)) - { - Delete (lpp); - return FALSE; - } - } - - StartTask (taskUSER_CPW, NULL, lpp); - return TRUE; -} - - -void User_Password_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp) -{ - if (!ptp->rc) - { - ErrorDialog (ptp->status, IDS_ERROR_CANT_GET_RANDOM_KEY); - EnableWindow (GetDlgItem (hDlg, IDC_CPW_RANDOM), FALSE); - } - else - { - TCHAR szKey[ cchRESOURCE ]; - FormatServerKey (szKey, TASKDATA(ptp)->key); - SetDlgItemText (hDlg, IDC_CPW_DATA, szKey); - } -} - diff --git a/src/WINNT/afsusrmgr/usr_cpw.h b/src/WINNT/afsusrmgr/usr_cpw.h deleted file mode 100644 index f09b0ef78..000000000 --- a/src/WINNT/afsusrmgr/usr_cpw.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_CPW_H -#define USR_CPW_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void User_ShowChangePassword (HWND hParent, ASID idUser); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_create.cpp b/src/WINNT/afsusrmgr/usr_create.cpp deleted file mode 100644 index 0efd600b0..000000000 --- a/src/WINNT/afsusrmgr/usr_create.cpp +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_prop.h" -#include "usr_create.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - TCHAR szPassword[ cchRESOURCE ]; - int uid; - USERPROPINFO Advanced; - } CREATEUSERDLG, *LPCREATEUSERDLG; - -#define UID_AUTOSELECT ((int)0) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK User_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void User_Create_OnInitDialog (HWND hDlg); -void User_Create_OnNames (HWND hDlg); -void User_Create_OnID (HWND hDlg); -void User_Create_OnAdvanced (HWND hDlg); -BOOL User_Create_OnOK (HWND hDlg); -void User_Create_OnEndTask_ObjectGet (HWND hDlg, LPTASKPACKET ptp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void User_SetDefaultCreateParams (LPUSERPROPINFO lpp) -{ - memset (lpp, 0x00, sizeof(USERPROPINFO)); - lpp->fSeal = FALSE; - lpp->fAdmin = FALSE; - lpp->fGrantTickets = TRUE; - lpp->csecLifetime = csecTICKETLIFETIME_DEFAULT; - lpp->cGroupQuota = cGROUPQUOTA_DEFAULT; - lpp->fExpires = FALSE; - lpp->aaStatus = aaANYONE; - lpp->aaOwned = aaANYONE; - lpp->aaMember = aaANYONE; - lpp->fCreateKAS = TRUE; - lpp->fCreatePTS = TRUE; - lpp->fCanChangePw = TRUE; - lpp->fCanReusePw = FALSE; - lpp->cdayPwExpires = 0; - lpp->cFailLock = 0; - lpp->csecFailLock = 0; -} - - -void User_ShowCreate (HWND hParent) -{ - LPCREATEUSERDLG lpp = New (CREATEUSERDLG); - memset (lpp, 0x00, sizeof(CREATEUSERDLG)); - memcpy (&lpp->Advanced, &gr.CreateUser, sizeof(USERPROPINFO)); - lpp->uid = UID_AUTOSELECT; - lpp->Advanced.pGroupsMember = NULL; - lpp->Advanced.pGroupsOwner = NULL; - - (void)ModalDialogParam (IDD_NEWUSER, hParent, (DLGPROC)User_Create_DlgProc, (LPARAM)lpp); - - if (lpp->Advanced.pGroupsMember) - asc_AsidListFree (&lpp->Advanced.pGroupsMember); - if (lpp->Advanced.pGroupsOwner) - asc_AsidListFree (&lpp->Advanced.pGroupsOwner); - Delete (lpp); -} - - -BOOL CALLBACK User_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_NEWUSER, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - User_Create_OnInitDialog (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskOBJECT_GET) - User_Create_OnEndTask_ObjectGet (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (User_Create_OnOK (hDlg)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_ADVANCED: - User_Create_OnAdvanced (hDlg); - break; - - case IDC_NEWUSER_NAME: - User_Create_OnNames (hDlg); - break; - - case IDC_NEWUSER_ID_AUTO: - case IDC_NEWUSER_ID_MANUAL: - User_Create_OnID (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void User_Create_OnInitDialog (HWND hDlg) -{ - LPCREATEUSERDLG lpp = (LPCREATEUSERDLG)GetWindowLong (hDlg, DWL_USER); - - // Fix the title of the dialog - // - ULONG status; - TCHAR szName[ cchNAME ]; - asc_CellNameGet_Fast (g.idClient, g.idCell, szName, &status); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWUSER_TITLE, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_NEWUSER_TITLE, pszText); - FreeString (pszText); - - // Attach a spinner to the ID control - // - CheckDlgButton (hDlg, IDC_NEWUSER_ID_AUTO, TRUE); - CreateSpinner (GetDlgItem (hDlg, IDC_NEWUSER_ID), 10, FALSE, 1, 1, (int)-1); - User_Create_OnID (hDlg); - - StartTask (taskOBJECT_GET, hDlg, (PVOID)(g.idCell)); -} - - -void User_Create_OnNames (HWND hDlg) -{ - TCHAR szSeparators[ cchRESOURCE ]; - GetString (szSeparators, IDS_SEPARATORS); - lstrcat (szSeparators, TEXT(" \t")); - - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_NEWUSER_NAME)); - EnableWindow (GetDlgItem (hDlg, IDOK), (pszNames && *pszNames)); - - BOOL fMultiple = FALSE; - for (LPTSTR psz = pszNames; !fMultiple && psz && *psz; ++psz) - { - if (lstrchr (szSeparators, *psz)) - fMultiple = TRUE; - } - FreeString (pszNames); - - EnableWindow (GetDlgItem (hDlg, IDC_NEWUSER_ID_AUTO), !fMultiple); - EnableWindow (GetDlgItem (hDlg, IDC_NEWUSER_ID_MANUAL), !fMultiple); - if (fMultiple) - { - CheckDlgButton (hDlg, IDC_NEWUSER_ID_AUTO, TRUE); - CheckDlgButton (hDlg, IDC_NEWUSER_ID_MANUAL, FALSE); - User_Create_OnID (hDlg); - } -} - - -void User_Create_OnID (HWND hDlg) -{ - BOOL fEnable = IsDlgButtonChecked (hDlg, IDC_NEWUSER_ID_MANUAL); - EnableWindow (GetDlgItem (hDlg, IDC_NEWUSER_ID), fEnable); -} - - -void User_Create_OnAdvanced (HWND hDlg) -{ - LPCREATEUSERDLG lpp = (LPCREATEUSERDLG)GetWindowLong (hDlg, DWL_USER); - lpp->Advanced.pUserList = NULL; - lpp->Advanced.fDeleteMeOnClose = FALSE; - lpp->Advanced.fShowModal = TRUE; - lpp->Advanced.hParent = hDlg; - lpp->Advanced.fMachine = FALSE; - lpp->Advanced.fApplyGeneral = FALSE; - lpp->Advanced.fApplyAdvanced = FALSE; - User_ShowProperties (&lpp->Advanced, uptMEMBERSHIP); -} - - -BOOL User_Create_OnOK (HWND hDlg) -{ - LPCREATEUSERDLG lpp = (LPCREATEUSERDLG)GetWindowLong (hDlg, DWL_USER); - - // First do a little validation of the dialog's entries - // - TCHAR szPw1[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWUSER_PW1, szPw1, cchRESOURCE); - TCHAR szPw2[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWUSER_PW2, szPw2, cchRESOURCE); - - if (!szPw1[0]) - { - ErrorDialog (ERROR_INVALID_PASSWORDNAME, IDS_ERROR_NO_PASSWORD_GIVEN); - return FALSE; - } - if (lstrcmp (szPw1, szPw2)) - { - ErrorDialog (ERROR_INVALID_PASSWORDNAME, IDS_ERROR_MISMATCH_PASSWORD_GIVEN); - return FALSE; - } - - // Then start a background task to do all this work. - // - LPUSER_CREATE_PARAMS pTask = New (USER_CREATE_PARAMS); - memset (pTask, 0x00, sizeof(USER_CREATE_PARAMS)); - - lstrcpy (pTask->szPassword, szPw1); - - if (IsDlgButtonChecked (hDlg, IDC_NEWUSER_ID_AUTO)) - pTask->idUser = UID_AUTOSELECT; - else // (IsDlgButtonChecked (hDlg, IDC_NEWUSER_ID_MANUAL)) - pTask->idUser = SP_GetPos (GetDlgItem (hDlg, IDC_NEWUSER_ID)); - - pTask->Properties.fIsAdmin = lpp->Advanced.fAdmin; - pTask->Properties.fCanGetTickets = lpp->Advanced.fGrantTickets; - pTask->Properties.fEncrypt = lpp->Advanced.fSeal; - pTask->Properties.fCanChangePassword = lpp->Advanced.fCanChangePw; - pTask->Properties.fCanReusePasswords = lpp->Advanced.fCanReusePw; - memcpy (&pTask->Properties.timeExpires, &lpp->Advanced.stExpires, sizeof(SYSTEMTIME)); - pTask->Properties.cdayPwExpire = lpp->Advanced.cdayPwExpires; - pTask->Properties.csecTicketLifetime = lpp->Advanced.csecLifetime; - pTask->Properties.cFailLogin = lpp->Advanced.cFailLock; - pTask->Properties.csecFailLoginLock = lpp->Advanced.csecFailLock; - pTask->Properties.cgroupCreationQuota = lpp->Advanced.cGroupQuota; - pTask->Properties.aaListStatus = lpp->Advanced.aaStatus; - pTask->Properties.aaGroupsOwned = lpp->Advanced.aaOwned; - pTask->Properties.aaMembership = lpp->Advanced.aaMember; - pTask->fCreateKAS = lpp->Advanced.fCreateKAS; - pTask->fCreatePTS = lpp->Advanced.fCreatePTS; - - if (lpp->Advanced.pGroupsMember) - asc_AsidListCopy (&pTask->pGroupsMember, &lpp->Advanced.pGroupsMember); - else - pTask->pGroupsMember = NULL; - - if (lpp->Advanced.pGroupsOwner) - asc_AsidListCopy (&pTask->pGroupsOwner, &lpp->Advanced.pGroupsOwner); - else - pTask->pGroupsOwner = NULL; - - // Crack the specified list of user names into a multi-string - // - TCHAR szSeparators[ cchRESOURCE ]; - GetString (szSeparators, IDS_SEPARATORS); - lstrcat (szSeparators, TEXT(" \t")); - - LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_NEWUSER_NAME)); - LPCTSTR pszStart = pszNames; - while (lstrchr (szSeparators, *pszStart)) - ++pszStart; - - while (*pszStart) - { - // Find the first non-name character - // - LPCTSTR pszEnd = pszStart; - while (*pszEnd && !lstrchr(szSeparators, *pszEnd)) - ++pszEnd; - - // Copy off this particular name - // - TCHAR szName[ cchNAME ]; - lstrcpy (szName, pszStart); - szName[ pszEnd - pszStart ] = TEXT('\0'); - - if (szName[0]) - FormatMultiString (&pTask->mszNames, FALSE, TEXT("%1"), TEXT("%s"), szName); - - // Find the next valid-name character - // - pszStart = pszEnd; - while (lstrchr(szSeparators, *pszStart)) - ++pszStart; - } - FreeString (pszNames); - - // Do the real work of creating the user(s) - // - StartTask (taskUSER_CREATE, NULL, pTask); - - // Store these creation parameters as the new defaults - // - memcpy (&gr.CreateUser, &lpp->Advanced, sizeof(USERPROPINFO)); - return TRUE; -} - - -void User_Create_OnEndTask_ObjectGet (HWND hDlg, LPTASKPACKET ptp) -{ - if (ptp->rc) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWUSER_ID_AUTO, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (TEXT("%1 (%2)"), TEXT("%s%ld"), szText, TASKDATA(ptp)->Properties.u.CellProperties.idUserMax+1); - SetDlgItemText (hDlg, IDC_NEWUSER_ID_AUTO, pszText); - FreeString (pszText); - - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_NEWUSER_ID))) - SP_SetPos (GetDlgItem (hDlg, IDC_NEWUSER_ID), TASKDATA(ptp)->Properties.u.CellProperties.idUserMax+1); - } -} - diff --git a/src/WINNT/afsusrmgr/usr_create.h b/src/WINNT/afsusrmgr/usr_create.h deleted file mode 100644 index 2c47c5d06..000000000 --- a/src/WINNT/afsusrmgr/usr_create.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_CREATE_H -#define USR_CREATE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void User_SetDefaultCreateParams (LPUSERPROPINFO lpp); - -void User_ShowCreate (HWND hParent); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_delete.cpp b/src/WINNT/afsusrmgr/usr_delete.cpp deleted file mode 100644 index 22c6a8510..000000000 --- a/src/WINNT/afsusrmgr/usr_delete.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_delete.h" -#include "usr_col.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK User_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void User_Delete_OnInitDialog (HWND hDlg); -void User_Delete_OnDestroy (HWND hDlg); -void User_Delete_OnCheck (HWND hDlg); -void User_Delete_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void User_ShowDelete (LPASIDLIST pUserList) -{ - ModalDialogParam (IDD_USER_DELETE, g.hMain, User_Delete_DlgProc, (LPARAM)pUserList); -} - - -BOOL CALLBACK User_Delete_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_USER_DELETE, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - User_Delete_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - User_Delete_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - User_Delete_OnOK (hDlg); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_DELETE_KAS: - case IDC_DELETE_PTS: - User_Delete_OnCheck (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void User_Delete_OnInitDialog (HWND hDlg) -{ - LPASIDLIST pUserList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - - // Fix the title of the dialog - // - if (pUserList->cEntries == 1) - { - TCHAR szName[ cchNAME ]; - User_GetDisplayName (szName, pUserList->aEntries[0].idObject); - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_DELETE_TITLE, szText, cchRESOURCE); - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_DELETE_TITLE, pszText); - FreeString (pszText); - } - else - { - LPTSTR pszNames = CreateNameList (pUserList); - - LPTSTR pszText = FormatString (IDS_USER_DELETE_MULTIPLE, TEXT("%s"), pszNames); - SetDlgItemText (hDlg, IDC_DELETE_TITLE, pszText); - FreeString (pszText); - - FreeString (pszNames); - } - - // Check the checkboxes - // - CheckDlgButton (hDlg, IDC_DELETE_KAS, BST_CHECKED); - CheckDlgButton (hDlg, IDC_DELETE_PTS, BST_CHECKED); -} - - -void User_Delete_OnDestroy (HWND hDlg) -{ - LPASIDLIST pUserList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - asc_AsidListFree (&pUserList); -} - - -void User_Delete_OnCheck (HWND hDlg) -{ - BOOL fEnable = FALSE; - if (IsDlgButtonChecked (hDlg, IDC_DELETE_KAS)) - fEnable = TRUE; - if (IsDlgButtonChecked (hDlg, IDC_DELETE_PTS)) - fEnable = TRUE; - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -void User_Delete_OnOK (HWND hDlg) -{ - LPASIDLIST pUserList = (LPASIDLIST)GetWindowLong (hDlg, DWL_USER); - - // Start a background task to do all the work. - // - LPUSER_DELETE_PARAMS pTask = New (USER_DELETE_PARAMS); - memset (pTask, 0x00, sizeof(USER_DELETE_PARAMS)); - pTask->fDeleteKAS = IsDlgButtonChecked (hDlg, IDC_DELETE_KAS); - pTask->fDeletePTS = IsDlgButtonChecked (hDlg, IDC_DELETE_PTS); - asc_AsidListCopy (&pTask->pUserList, &pUserList); - StartTask (taskUSER_DELETE, NULL, pTask); -} - diff --git a/src/WINNT/afsusrmgr/usr_delete.h b/src/WINNT/afsusrmgr/usr_delete.h deleted file mode 100644 index e848e91b2..000000000 --- a/src/WINNT/afsusrmgr/usr_delete.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_DELETE_H -#define USR_DELETE_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void User_ShowDelete (LPASIDLIST pUserList); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_prop.cpp b/src/WINNT/afsusrmgr/usr_prop.cpp deleted file mode 100644 index c4ebfde36..000000000 --- a/src/WINNT/afsusrmgr/usr_prop.cpp +++ /dev/null @@ -1,1608 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_prop.h" -#include "usr_cpw.h" -#include "usr_col.h" -#include "winlist.h" -#include "browse.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cdayPWEXPIRATION_MAX 254 - -#define cFAILLOCKCOUNT_MAX 254 - -#define csecFAILLOCK_MAX (csec1HOUR * 36L) - -#define GWD_ASIDLIST_MEMBER TEXT("AsidList - Members") -#define GWD_ASIDLIST_OWNER TEXT("AsidList - Owned") - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK UserProp_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void UserProp_General_OnInitDialog (HWND hDlg); -void UserProp_General_OnDestroy (HWND hDlg); -void UserProp_General_OnUnlock (HWND hDlg); -void UserProp_General_OnChangePwNow (HWND hDlg); -void UserProp_General_OnChangePw (HWND hDlg); -void UserProp_General_OnPwExpires (HWND hDlg); -void UserProp_General_OnFailLock (HWND hDlg); -void UserProp_General_OnFailLockTime (HWND hDlg); -void UserProp_General_OnApply (HWND hDlg); -void UserProp_General_UpdateDialog (HWND hDlg); -void UserProp_General_OnExpiration (HWND hDlg); - -BOOL CALLBACK UserProp_Advanced_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void UserProp_Advanced_OnInitDialog (HWND hDlg); -void UserProp_Advanced_OnDestroy (HWND hDlg); -void UserProp_Advanced_OnGrantTickets (HWND hDlg); -void UserProp_Advanced_OnHasGroupQuota (HWND hDlg); -void UserProp_Advanced_OnAdmin (HWND hDlg); -void UserProp_Advanced_OnApply (HWND hDlg); -void UserProp_Advanced_UpdateDialog (HWND hDlg); -void UserProp_Advanced_UpdateDialog_Perm (HWND hDlg, int idc, ACCOUNTACCESS aa, BOOL fMixed); - -BOOL CALLBACK UserProp_Member_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void UserProp_Member_OnInitDialog (HWND hDlg); -void UserProp_Member_OnDestroy (HWND hDlg); -void UserProp_Member_OnShowType (HWND hDlg); -void UserProp_Member_OnSelect (HWND hDlg); -void UserProp_Member_OnApply (HWND hDlg); -void UserProp_Member_OnAdd (HWND hDlg); -void UserProp_Member_OnRemove (HWND hDlg); -void UserProp_Member_OnEndTask_GroupSearch (HWND hDlg, LPTASKPACKET ptp); -void UserProp_Member_PopulateList (HWND hDlg); - -void UserProp_UpdateName (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void User_FreeProperties (LPUSERPROPINFO lpp) -{ - if (lpp) - { - if ((lpp->fApplyAdvanced || lpp->fApplyGeneral) && lpp->pUserList) - { - - // See if we have anything to scare the user about. If the - // "afs", "authserver" or "krbtgt" accounts have any modified - // properties, there may be reason for concern. - // - BOOL fMakeChanges = TRUE; - - if (lpp->fApplyGeneral || lpp->fApplyAdvanced) - { - for (size_t ii = 0; ii < lpp->pUserList->cEntries; ++ii) - { - TCHAR szUser[ cchRESOURCE ]; - asc_ObjectNameGet_Fast (g.idClient, g.idCell, lpp->pUserList->aEntries[ ii ].idObject, szUser); - - if ( (!lstrcmpi (szUser, TEXT("afs"))) || - (!lstrcmpi (szUser, TEXT("AuthServer"))) || - (!lstrcmpi (szUser, TEXT("krbtgt"))) ) - { - if (Message (MB_ICONASTERISK | MB_YESNO | MB_DEFBUTTON2, IDS_WARNING_TITLE, IDS_WARNING_SYSTEM_ACCOUNT, TEXT("%s"), szUser) != IDYES) - { - fMakeChanges = FALSE; - break; - } - } - } - } - - if (fMakeChanges) - { - for (size_t ii = 0; ii < lpp->pUserList->cEntries; ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pUserList->aEntries[ ii ].idObject, &Properties, &status)) - continue; - - LPUSER_CHANGE_PARAMS pTask = New (USER_CHANGE_PARAMS); - memset (pTask, 0x00, sizeof(USER_CHANGE_PARAMS)); - pTask->idUser = lpp->pUserList->aEntries[ ii ].idObject; - - // From Advanced tab: - - if (!lpp->fApplyAdvanced || lpp->fSeal_Mixed) - pTask->NewProperties.fEncrypt = Properties.u.UserProperties.KASINFO.fEncrypt; - else - pTask->NewProperties.fEncrypt = lpp->fSeal; - - if (!lpp->fApplyAdvanced || lpp->fAdmin_Mixed) - pTask->NewProperties.fIsAdmin = Properties.u.UserProperties.KASINFO.fIsAdmin; - else - pTask->NewProperties.fIsAdmin = lpp->fAdmin; - - if (!lpp->fApplyAdvanced || lpp->fGrantTickets_Mixed) - pTask->NewProperties.fCanGetTickets = Properties.u.UserProperties.KASINFO.fCanGetTickets; - else - pTask->NewProperties.fCanGetTickets = lpp->fGrantTickets; - - if (!lpp->fApplyAdvanced || lpp->fGrantTickets_Mixed) - pTask->NewProperties.csecTicketLifetime = Properties.u.UserProperties.KASINFO.csecTicketLifetime; - else if (!lpp->fGrantTickets) - pTask->NewProperties.csecTicketLifetime = 0; - else - pTask->NewProperties.csecTicketLifetime = lpp->csecLifetime; - - if (!lpp->fApplyAdvanced || lpp->fGroupQuota_Mixed) - pTask->NewProperties.cgroupCreationQuota = Properties.u.UserProperties.PTSINFO.cgroupCreationQuota; - else - pTask->NewProperties.cgroupCreationQuota = lpp->cGroupQuota; - - if (!lpp->fApplyAdvanced || lpp->fStatus_Mixed) - pTask->NewProperties.aaListStatus = Properties.u.UserProperties.PTSINFO.aaListStatus; - else - pTask->NewProperties.aaListStatus = lpp->aaStatus; - - if (!lpp->fApplyAdvanced || lpp->fOwned_Mixed) - pTask->NewProperties.aaGroupsOwned = Properties.u.UserProperties.PTSINFO.aaGroupsOwned; - else - pTask->NewProperties.aaGroupsOwned = lpp->aaOwned; - - if (!lpp->fApplyAdvanced || lpp->fMember_Mixed) - pTask->NewProperties.aaMembership = Properties.u.UserProperties.PTSINFO.aaMembership; - else - pTask->NewProperties.aaMembership = lpp->aaMember; - - // From General tab: - - if (!lpp->fApplyGeneral || lpp->fCanChangePw_Mixed) - pTask->NewProperties.fCanChangePassword = Properties.u.UserProperties.KASINFO.fCanChangePassword; - else - pTask->NewProperties.fCanChangePassword = lpp->fCanChangePw; - - if (!lpp->fApplyGeneral || lpp->fCanReusePw_Mixed) - pTask->NewProperties.fCanReusePasswords = Properties.u.UserProperties.KASINFO.fCanReusePasswords; - else - pTask->NewProperties.fCanReusePasswords = lpp->fCanReusePw; - - if (!lpp->fApplyGeneral || lpp->fPwExpires_Mixed) - pTask->NewProperties.cdayPwExpire = Properties.u.UserProperties.KASINFO.cdayPwExpire; - else - pTask->NewProperties.cdayPwExpire = lpp->cdayPwExpires; - - if (!lpp->fApplyGeneral || lpp->fExpires_Mixed) - memcpy (&pTask->NewProperties.timeExpires, &Properties.u.UserProperties.KASINFO.timeExpires, sizeof(SYSTEMTIME)); - else if (!lpp->fExpires) - memset (&pTask->NewProperties.timeExpires, 0x00, sizeof(SYSTEMTIME)); - else // (lpp->fExpires) - memcpy (&pTask->NewProperties.timeExpires, &lpp->stExpires, sizeof(SYSTEMTIME)); - - if (!lpp->fApplyGeneral || lpp->fFailLock_Mixed) - pTask->NewProperties.cFailLogin = Properties.u.UserProperties.KASINFO.cFailLogin; - else - pTask->NewProperties.cFailLogin = lpp->cFailLock; - - if (!lpp->fApplyGeneral || lpp->fFailLock_Mixed) - pTask->NewProperties.csecFailLoginLock = Properties.u.UserProperties.KASINFO.csecFailLoginLock; - else - pTask->NewProperties.csecFailLoginLock = lpp->csecFailLock; - - StartTask (taskUSER_CHANGE, NULL, pTask); - } - } - } - - if (lpp->pGroupsMember) - asc_AsidListFree (&lpp->pGroupsMember); - if (lpp->pGroupsOwner) - asc_AsidListFree (&lpp->pGroupsOwner); - if (lpp->pUserList) - asc_AsidListFree (&lpp->pUserList); - memset (lpp, 0x00, sizeof(USERPROPINFO)); - Delete (lpp); - } -} - - -void User_ShowProperties (LPASIDLIST pUserList, USERPROPTAB uptTarget) -{ - LPUSERPROPINFO lpp = New (USERPROPINFO); - memset (lpp, 0x00, sizeof(USERPROPINFO)); - lpp->pUserList = pUserList; - lpp->fDeleteMeOnClose = TRUE; - lpp->fShowModal = FALSE; - - if (pUserList && pUserList->cEntries) - lpp->fMachine = fIsMachineAccount (pUserList->aEntries[0].idObject); - - User_ShowProperties (lpp, uptTarget); -} - - -void User_ShowProperties (LPUSERPROPINFO lpp, USERPROPTAB uptTarget) -{ - HWND hSheet = NULL; - - // If we've been asked to view properties for only one user, and there is - // already a window open for that user, switch to it. - // - if (lpp->pUserList) - { - if (lpp->pUserList->cEntries == 1) - { - ASID idUser = lpp->pUserList->aEntries[0].idObject; - - if ((hSheet = WindowList_Search (wltUSER_PROPERTIES, idUser)) != NULL) - { - SetForegroundWindow (hSheet); - if (uptTarget != uptANY) - { - HWND hTab = GetDlgItem (hSheet, IDC_PROPSHEET_TABCTRL); - int nTabs = TabCtrl_GetItemCount (hTab); - if (nTabs < nUSERPROPTAB_MAX) - uptTarget = (USERPROPTAB)( ((int)uptTarget-1) ); - TabCtrl_SwitchToTab (hTab, uptTarget); - } - return; - } - } - - // Otherwise, make sure there are no Properties windows open for any - // of the selected users - // - for (size_t iUser = 0; iUser < lpp->pUserList->cEntries; ++iUser) - { - ASID idUser = lpp->pUserList->aEntries[ iUser ].idObject; - - // See if there's a Properties window open that is dedicated to - // this user - // - if ((hSheet = WindowList_Search (wltUSER_PROPERTIES, idUser)) != NULL) - { - ErrorDialog (0, IDS_ERROR_USER_MULTIPROP); - return; - } - - // See if there is a multiple-user properties window open; if so, - // test it to see if it covers this user - // - if ((hSheet = WindowList_Search (wltUSER_PROPERTIES, 0)) != NULL) - { - LPUSERPROPINFO pInfo = (LPUSERPROPINFO)PropSheet_FindTabParam (hSheet); - if (pInfo && pInfo->pUserList && asc_AsidListTest (&pInfo->pUserList, idUser)) - { - ErrorDialog (0, IDS_ERROR_USER_MULTIPROP); - return; - } - } - } - } - - // Okay, we're clear to create the new properties window. - // - LPTSTR pszTitle; - if (!lpp->pUserList) - { - if (lpp->fMachine) - pszTitle = FormatString (IDS_NEWMACHINE_PROPERTIES_TITLE); - else - pszTitle = FormatString (IDS_NEWUSER_PROPERTIES_TITLE); - } - else if (lpp->pUserList->cEntries > 1) - { - if (lpp->fMachine) - pszTitle = FormatString (IDS_MACHINE_PROPERTIES_TITLE_MULTIPLE); - else - pszTitle = FormatString (IDS_USER_PROPERTIES_TITLE_MULTIPLE); - } - else - { - TCHAR szUser[ cchRESOURCE ]; - User_GetDisplayName (szUser, lpp->pUserList->aEntries[0].idObject); - if (lpp->fMachine) - pszTitle = FormatString (IDS_MACHINE_PROPERTIES_TITLE, TEXT("%s"), szUser); - else - pszTitle = FormatString (IDS_USER_PROPERTIES_TITLE, TEXT("%s"), szUser); - } - - if (lpp->fMachine && (uptTarget == uptGENERAL)) - uptTarget = uptADVANCED; - - LPPROPSHEET psh = PropSheet_Create (pszTitle, TRUE, lpp->hParent, (LPARAM)lpp); - if (!lpp->fMachine) - PropSheet_AddTab (psh, 0, (lpp->pUserList) ? IDD_USER_GENERAL : IDD_NEWUSER_GENERAL, (DLGPROC)UserProp_General_DlgProc, (LPARAM)lpp, TRUE, (uptTarget == uptGENERAL) ? TRUE : FALSE); - PropSheet_AddTab (psh, 0, (lpp->pUserList) ? (lpp->fMachine ? IDD_MACHINE_ADVANCED : IDD_USER_ADVANCED) : (lpp->fMachine ? IDD_NEWMACHINE_ADVANCED : IDD_NEWUSER_ADVANCED), (DLGPROC)UserProp_Advanced_DlgProc, (LPARAM)lpp, TRUE, (uptTarget == uptADVANCED) ? TRUE : FALSE); - PropSheet_AddTab (psh, 0, (lpp->pUserList) ? (lpp->fMachine ? IDD_MACHINE_MEMBER : IDD_USER_MEMBER) : (lpp->fMachine ? IDD_NEWMACHINE_MEMBER : IDD_NEWUSER_MEMBER), (DLGPROC)UserProp_Member_DlgProc, (LPARAM)lpp, TRUE, (uptTarget == uptMEMBERSHIP) ? TRUE : FALSE); - - if (lpp->fShowModal) - PropSheet_ShowModal (psh, PumpMessage); - else - PropSheet_ShowModeless (psh, SW_SHOW); -} - - -BOOL CALLBACK UserProp_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_USER_GENERAL, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - UserProp_General_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - UserProp_General_OnDestroy (hDlg); - break; - - case WM_ASC_NOTIFY_OBJECT: - UserProp_General_UpdateDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - UserProp_General_OnApply (hDlg); - break; - - case IDC_USER_UNLOCK: - UserProp_General_OnUnlock (hDlg); - break; - - case IDC_USER_CPW_NOW: - UserProp_General_OnChangePwNow (hDlg); - break; - - case IDC_USER_CPW: - UserProp_General_OnChangePw (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_PWEXPIRES: - UserProp_General_OnPwExpires (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_EXPIRES: - UserProp_General_OnExpiration (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_FAILLOCK: - UserProp_General_OnFailLock (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_FAILLOCK_INFINITE: - case IDC_USER_FAILLOCK_FINITE: - UserProp_General_OnFailLockTime (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_RPW: - case IDC_USER_PWEXPIRATION: - case IDC_USER_EXPIRE_DATE: - case IDC_USER_EXPIRE_TIME: - case IDC_USER_FAILLOCK_COUNT: - case IDC_USER_FAILLOCK_DURATION: - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void UserProp_General_OnInitDialog (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Indicate we want to know if anything changes with these users - // - if (lpp->pUserList) - { - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - asc_AsidListCopy (&pTask->pAsidList, &lpp->pUserList); - StartTask (taskOBJECT_LISTEN, NULL, pTask); - } - - // Fix the name shown on the dialog - // - UserProp_UpdateName (hDlg); - - // Update the dialog's display - // - if (lpp->pUserList && (lpp->pUserList->cEntries > 1)) - EnableWindow (GetDlgItem (hDlg, IDC_USER_CPW_NOW), FALSE); - - UserProp_General_UpdateDialog (hDlg); -} - - -void UserProp_General_OnDestroy (HWND hDlg) -{ - // Indicate we no longer care if anything changes with these users - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - StartTask (taskOBJECT_LISTEN, NULL, pTask); -} - - -void UserProp_General_UpdateDialog (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Most of the controls on the dialog can be gathered by looping - // through our pUserList. - // - BOOL fGotAnyData = FALSE; - - for (size_t ii = 0; lpp->pUserList && (ii < lpp->pUserList->cEntries); ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pUserList->aEntries[ ii ].idObject, &Properties, &status)) - continue; - - if (!fGotAnyData) - { - lpp->fCanChangePw = Properties.u.UserProperties.KASINFO.fCanChangePassword; - lpp->fCanReusePw = Properties.u.UserProperties.KASINFO.fCanReusePasswords; - lpp->cdayPwExpires = Properties.u.UserProperties.KASINFO.cdayPwExpire; - lpp->cFailLock = Properties.u.UserProperties.KASINFO.cFailLogin; - lpp->csecFailLock = Properties.u.UserProperties.KASINFO.csecFailLoginLock; - lpp->fExpires = fIsValidDate (&Properties.u.UserProperties.KASINFO.timeExpires); - if (lpp->fExpires) - lpp->stExpires = Properties.u.UserProperties.KASINFO.timeExpires; - else - GetLocalSystemTime (&lpp->stExpires); - fGotAnyData = TRUE; - } - else - { - if (lpp->fCanChangePw != Properties.u.UserProperties.KASINFO.fCanChangePassword) - lpp->fCanChangePw_Mixed = TRUE; - if (lpp->fCanReusePw != Properties.u.UserProperties.KASINFO.fCanReusePasswords) - lpp->fCanReusePw_Mixed = TRUE; - if (lpp->cdayPwExpires != Properties.u.UserProperties.KASINFO.cdayPwExpire) - lpp->fPwExpires_Mixed = TRUE; - if (lpp->cFailLock != Properties.u.UserProperties.KASINFO.cFailLogin) - lpp->fFailLock_Mixed = TRUE; - if (lpp->csecFailLock != Properties.u.UserProperties.KASINFO.csecFailLoginLock) - lpp->fFailLock_Mixed = TRUE; - if (lpp->fExpires != fIsValidDate (&Properties.u.UserProperties.KASINFO.timeExpires)) - lpp->fExpires_Mixed = TRUE; - if (memcmp (&lpp->stExpires, &Properties.u.UserProperties.KASINFO.timeExpires, sizeof(SYSTEMTIME))) - lpp->fExpires_Mixed = TRUE; - } - } - - // Set up the dialog controls to reflect what we just learned - // - if (lpp->fCanChangePw_Mixed) - Set3State (hDlg, IDC_USER_CPW); - else - Set2State (hDlg, IDC_USER_CPW); - CheckDlgButton (hDlg, IDC_USER_CPW, (lpp->fCanChangePw_Mixed) ? BST_INDETERMINATE : lpp->fCanChangePw); - - if (lpp->fCanReusePw_Mixed) - Set3State (hDlg, IDC_USER_RPW); - else - Set2State (hDlg, IDC_USER_RPW); - CheckDlgButton (hDlg, IDC_USER_RPW, (lpp->fCanReusePw_Mixed) ? BST_INDETERMINATE : lpp->fCanReusePw); - - if (lpp->fPwExpires_Mixed) - Set3State (hDlg, IDC_USER_PWEXPIRES); - else - Set2State (hDlg, IDC_USER_PWEXPIRES); - CheckDlgButton (hDlg, IDC_USER_PWEXPIRES, (lpp->fPwExpires_Mixed) ? BST_INDETERMINATE : (lpp->cdayPwExpires == 0) ? BST_UNCHECKED : BST_CHECKED); - - if (fHasSpinner (GetDlgItem (hDlg, IDC_USER_PWEXPIRATION))) - SP_SetPos (GetDlgItem (hDlg, IDC_USER_PWEXPIRATION), lpp->cdayPwExpires); - else - CreateSpinner (GetDlgItem (hDlg, IDC_USER_PWEXPIRATION), 10, FALSE, 1, lpp->cdayPwExpires, cdayPWEXPIRATION_MAX); - - if (lpp->fExpires_Mixed) - Set3State (hDlg, IDC_USER_EXPIRES); - else - Set2State (hDlg, IDC_USER_EXPIRES); - CheckDlgButton (hDlg, IDC_USER_EXPIRES, (lpp->fExpires_Mixed) ? BST_INDETERMINATE : lpp->fExpires); - - SYSTEMTIME stExpires; - if (fIsValidDate (&lpp->stExpires)) - memcpy (&stExpires, &lpp->stExpires, sizeof(SYSTEMTIME)); - else - { - GetSystemTime (&stExpires); - stExpires.wYear ++; - } - - // Our controls use local time, not GMT--so translate the account expiration - // date before we display it - // - FILETIME ftGMT; - SystemTimeToFileTime (&stExpires, &ftGMT); - FILETIME ftLocal; - FileTimeToLocalFileTime (&ftGMT, &ftLocal); - SYSTEMTIME stLocal; - FileTimeToSystemTime (&ftLocal, &stLocal); - - DA_SetDate (GetDlgItem (hDlg, IDC_USER_EXPIRE_DATE), &stLocal); - TI_SetTime (GetDlgItem (hDlg, IDC_USER_EXPIRE_TIME), &stLocal); - - if (lpp->fFailLock_Mixed) - Set3State (hDlg, IDC_USER_FAILLOCK); - else - Set2State (hDlg, IDC_USER_FAILLOCK); - CheckDlgButton (hDlg, IDC_USER_FAILLOCK, (lpp->fFailLock_Mixed) ? BST_INDETERMINATE : (lpp->cFailLock == 0) ? BST_UNCHECKED : BST_CHECKED); - - if (fHasSpinner (GetDlgItem (hDlg, IDC_USER_FAILLOCK_COUNT))) - SP_SetPos (GetDlgItem (hDlg, IDC_USER_FAILLOCK_COUNT), lpp->cFailLock); - else - CreateSpinner (GetDlgItem (hDlg, IDC_USER_FAILLOCK_COUNT), 10, FALSE, 1, lpp->cFailLock, cFAILLOCKCOUNT_MAX); - - CheckDlgButton (hDlg, IDC_USER_FAILLOCK_INFINITE, (lpp->csecFailLock == 0) ? TRUE : FALSE); - CheckDlgButton (hDlg, IDC_USER_FAILLOCK_FINITE, (lpp->csecFailLock != 0) ? TRUE : FALSE); - - SYSTEMTIME stMin; - SYSTEMTIME stNow; - SYSTEMTIME stMax; - ULONG csecMin = 1; - ULONG csecNow = lpp->csecFailLock; - ULONG csecMax = csecFAILLOCK_MAX; - SET_ELAPSED_TIME_FROM_SECONDS (&stMin, csecMin); - SET_ELAPSED_TIME_FROM_SECONDS (&stNow, csecNow); - SET_ELAPSED_TIME_FROM_SECONDS (&stMax, csecMax); - EL_SetRange (GetDlgItem (hDlg, IDC_USER_FAILLOCK_DURATION), &stMin, &stMax); - EL_SetTime (GetDlgItem (hDlg, IDC_USER_FAILLOCK_DURATION), &stNow); - - UserProp_General_OnChangePw (hDlg); - UserProp_General_OnPwExpires (hDlg); - UserProp_General_OnFailLock (hDlg); - UserProp_General_OnFailLockTime (hDlg); - UserProp_General_OnExpiration (hDlg); -} - - -void UserProp_General_OnChangePw (HWND hDlg) -{ - BOOL fEnable = (IsDlgButtonChecked (hDlg, IDC_USER_CPW) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_RPW), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_USER_PWEXPIRES), fEnable); - UserProp_General_OnPwExpires (hDlg); -} - - -void UserProp_General_OnPwExpires (HWND hDlg) -{ - BOOL fEnable = IsWindowEnabled (GetDlgItem (hDlg, IDC_USER_PWEXPIRES)) && (IsDlgButtonChecked (hDlg, IDC_USER_PWEXPIRES) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_PWEXPIRATION), fEnable); -} - - -void UserProp_General_OnExpiration (HWND hDlg) -{ - BOOL fEnable = (IsDlgButtonChecked (hDlg, IDC_USER_EXPIRES) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_EXPIRE_DATE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_USER_EXPIRE_AT), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_USER_EXPIRE_TIME), fEnable); -} - - -void UserProp_General_OnFailLock (HWND hDlg) -{ - BOOL fEnable = (IsDlgButtonChecked (hDlg, IDC_USER_FAILLOCK) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_FAILLOCK_COUNT), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_USER_FAILLOCK_INFINITE), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_USER_FAILLOCK_FINITE), fEnable); - UserProp_General_OnFailLockTime (hDlg); -} - - -void UserProp_General_OnFailLockTime (HWND hDlg) -{ - BOOL fEnable = IsWindowEnabled (GetDlgItem (hDlg, IDC_USER_FAILLOCK_FINITE)) && (IsDlgButtonChecked (hDlg, IDC_USER_FAILLOCK_FINITE) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_FAILLOCK_DURATION), fEnable); -} - - -void UserProp_General_OnApply (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - lpp->fApplyGeneral = TRUE; - - lpp->fCanChangePw = IsDlgButtonChecked (hDlg, IDC_USER_CPW); - lpp->fCanChangePw_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_CPW) == BST_INDETERMINATE); - lpp->fCanReusePw = IsDlgButtonChecked (hDlg, IDC_USER_RPW); - lpp->fCanReusePw_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_RPW) == BST_INDETERMINATE); - - lpp->fExpires = IsDlgButtonChecked (hDlg, IDC_USER_EXPIRES); - lpp->fExpires_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_EXPIRES) == BST_INDETERMINATE); - - // Our controls use local time, not GMT--so translate the account expiration - // date after we read it from the controls - // - SYSTEMTIME stLocal; - memset (&stLocal, 0x00, sizeof(SYSTEMTIME)); - DA_GetDate (GetDlgItem (hDlg, IDC_USER_EXPIRE_DATE), &stLocal); - TI_GetTime (GetDlgItem (hDlg, IDC_USER_EXPIRE_TIME), &stLocal); - - FILETIME ftLocal; - SystemTimeToFileTime (&stLocal, &ftLocal); - FILETIME ftGMT; - LocalFileTimeToFileTime (&ftLocal, &ftGMT); - FileTimeToSystemTime (&ftGMT, &lpp->stExpires); - - if (!IsDlgButtonChecked (hDlg, IDC_USER_PWEXPIRES)) - lpp->cdayPwExpires = 0; - else - lpp->cdayPwExpires = SP_GetPos (GetDlgItem (hDlg, IDC_USER_PWEXPIRATION)); - lpp->fPwExpires_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_PWEXPIRES) == BST_INDETERMINATE); - - if (!IsDlgButtonChecked (hDlg, IDC_USER_FAILLOCK)) - lpp->cFailLock = 0; - else - lpp->cFailLock = SP_GetPos (GetDlgItem (hDlg, IDC_USER_FAILLOCK_COUNT)); - lpp->fFailLock_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_FAILLOCK) == BST_INDETERMINATE); - - if (!IsDlgButtonChecked (hDlg, IDC_USER_FAILLOCK_FINITE)) - lpp->csecFailLock = 0; - else - { - SYSTEMTIME stFailLock; - EL_GetTime (GetDlgItem (hDlg, IDC_USER_FAILLOCK_DURATION), &stFailLock); - lpp->csecFailLock = GET_SECONDS_FROM_ELAPSED_TIME (&stFailLock); - } -} - - -void UserProp_General_OnUnlock (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - if (lpp->pUserList) - { - LPASIDLIST pCopy; - asc_AsidListCopy (&pCopy, &lpp->pUserList); - StartTask (taskUSER_UNLOCK, NULL, pCopy); - } -} - - -void UserProp_General_OnChangePwNow (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - if (lpp->pUserList && (lpp->pUserList->cEntries == 1)) - { - User_ShowChangePassword (hDlg, lpp->pUserList->aEntries[0].idObject); - } -} - - -BOOL CALLBACK UserProp_Advanced_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - if (AfsAppLib_HandleHelp ((lpp && lpp->fMachine) ? IDD_MACHINE_ADVANCED : IDD_USER_ADVANCED, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG_SHEET: - if (lpp && lpp->pUserList && !lpp->fShowModal) - { - if (lpp->pUserList->cEntries == 1) - WindowList_Add (hDlg, wltUSER_PROPERTIES, lpp->pUserList->aEntries[0].idObject); - else // (lpp->pUserList->cEntries > 1) - WindowList_Add (hDlg, wltUSER_PROPERTIES, 0); - } - break; - - case WM_DESTROY_SHEET: - WindowList_Remove (hDlg); - if (lpp && lpp->fDeleteMeOnClose) - User_FreeProperties (lpp); - break; - - case WM_INITDIALOG: - UserProp_Advanced_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - UserProp_Advanced_OnDestroy (hDlg); - break; - - case WM_ASC_NOTIFY_OBJECT: - UserProp_Advanced_UpdateDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - UserProp_Advanced_OnApply (hDlg); - break; - - case IDC_USER_TGS: - UserProp_Advanced_OnGrantTickets (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_GROUP_HASQUOTA: - UserProp_Advanced_OnHasGroupQuota (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_ADMIN: - UserProp_Advanced_OnAdmin (hDlg); - PropSheetChanged (hDlg); - break; - - case IDC_USER_NOSEAL: - case IDC_USER_LIFETIME: - case IDC_USER_GROUP_QUOTA: - case IDC_USER_PERM_STATUS: - case IDC_USER_PERM_OWNED: - case IDC_USER_PERM_MEMBER: - PropSheetChanged (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void UserProp_Advanced_OnInitDialog (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Indicate we want to know if anything changes with these users - // - if (lpp->pUserList) - { - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - asc_AsidListCopy (&pTask->pAsidList, &lpp->pUserList); - StartTask (taskOBJECT_LISTEN, NULL, pTask); - } - - // Fix the name shown on the dialog - // - UserProp_UpdateName (hDlg); - - // Fill in the information about the selected users - // - UserProp_Advanced_UpdateDialog (hDlg); -} - - -void UserProp_Advanced_OnDestroy (HWND hDlg) -{ - // Indicate we no longer care if anything changes with these users - // - LPOBJECT_LISTEN_PARAMS pTask = New (OBJECT_LISTEN_PARAMS); - memset (pTask, 0x00, sizeof(OBJECT_LISTEN_PARAMS)); - pTask->hNotify = hDlg; - StartTask (taskOBJECT_LISTEN, NULL, pTask); -} - - -void UserProp_Advanced_OnGrantTickets (HWND hDlg) -{ - BOOL fEnable = (IsDlgButtonChecked (hDlg, IDC_USER_TGS) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_LIFETIME), fEnable); -} - - -void UserProp_Advanced_OnHasGroupQuota (HWND hDlg) -{ - BOOL fEnable = (IsDlgButtonChecked (hDlg, IDC_USER_GROUP_HASQUOTA) == BST_CHECKED); - if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_USER_GROUP_HASQUOTA))) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_USER_GROUP_QUOTA), fEnable); -} - - -void UserProp_Advanced_OnAdmin (HWND hDlg) -{ - BOOL fAdmin = (IsDlgButtonChecked (hDlg, IDC_USER_ADMIN) == BST_CHECKED); - EnableWindow (GetDlgItem (hDlg, IDC_USER_GROUP_HASQUOTA), !fAdmin); - - if (fAdmin) - { - CheckDlgButton (hDlg, IDC_USER_GROUP_HASQUOTA, TRUE); - SP_SetPos (GetDlgItem (hDlg, IDC_USER_GROUP_QUOTA), 9999); - } - - UserProp_Advanced_OnHasGroupQuota (hDlg); -} - - -void UserProp_Advanced_UpdateDialog (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Fill in the user's key. If this dialog represents more than one - // user, put in some stock text instead. - // - if ((lpp->pUserList) && (lpp->pUserList->cEntries > 1)) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_USER_KEY_MULTIPLE); - SetDlgItemText (hDlg, IDC_USER_KEY, szText); - } - else if (lpp->pUserList && (lpp->pUserList->cEntries == 1)) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pUserList->aEntries[ 0 ].idObject, &Properties, &status)) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_USER_KEY_UNKNOWN); - SetDlgItemText (hDlg, IDC_USER_KEY, szText); - } - else if (!Properties.u.UserProperties.fHaveKasInfo) - { - TCHAR szText[ cchRESOURCE ]; - GetString (szText, IDS_USER_KEY_UNKNOWN); - SetDlgItemText (hDlg, IDC_USER_KEY, szText); - } - else - { - TCHAR szReadableKey[ cchRESOURCE ]; - FormatServerKey (szReadableKey, Properties.u.UserProperties.KASINFO.keyData); - - LPTSTR pszText = FormatString (IDS_USER_KEY, TEXT("%s%lu%lu"), szReadableKey, Properties.u.UserProperties.KASINFO.keyVersion, Properties.u.UserProperties.KASINFO.dwKeyChecksum); - SetDlgItemText (hDlg, IDC_USER_KEY, pszText); - FreeString (pszText); - } - } - - // Fill in the other fields - // - BOOL fGotAnyData = FALSE; - - for (size_t ii = 0; lpp->pUserList && (ii < lpp->pUserList->cEntries); ++ii) - { - ULONG status; - ASOBJPROP Properties; - if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pUserList->aEntries[ ii ].idObject, &Properties, &status)) - continue; - - if (!fGotAnyData) - { - lpp->fSeal = Properties.u.UserProperties.KASINFO.fEncrypt; - lpp->fAdmin = Properties.u.UserProperties.KASINFO.fIsAdmin; - lpp->fGrantTickets = Properties.u.UserProperties.KASINFO.fCanGetTickets; - lpp->csecLifetime = Properties.u.UserProperties.KASINFO.csecTicketLifetime; - lpp->cGroupQuota = Properties.u.UserProperties.PTSINFO.cgroupCreationQuota; - lpp->aaStatus = Properties.u.UserProperties.PTSINFO.aaListStatus; - lpp->aaOwned = Properties.u.UserProperties.PTSINFO.aaGroupsOwned; - lpp->aaMember = Properties.u.UserProperties.PTSINFO.aaMembership; - fGotAnyData = TRUE; - } - else // (fGotAnyData) - { - if (lpp->fSeal != Properties.u.UserProperties.KASINFO.fEncrypt) - lpp->fSeal_Mixed = TRUE; - if (lpp->fAdmin != Properties.u.UserProperties.KASINFO.fIsAdmin) - lpp->fAdmin_Mixed = TRUE; - if (lpp->fGrantTickets != Properties.u.UserProperties.KASINFO.fCanGetTickets) - lpp->fGrantTickets_Mixed = TRUE; - if (lpp->csecLifetime != (ULONG)Properties.u.UserProperties.KASINFO.csecTicketLifetime) - lpp->fGrantTickets_Mixed = TRUE; - if (lpp->cGroupQuota != Properties.u.UserProperties.PTSINFO.cgroupCreationQuota) - lpp->fGroupQuota_Mixed = TRUE; - if (lpp->aaStatus != Properties.u.UserProperties.PTSINFO.aaListStatus) - lpp->fStatus_Mixed = TRUE; - if (lpp->aaOwned != Properties.u.UserProperties.PTSINFO.aaGroupsOwned) - lpp->fOwned_Mixed = TRUE; - if (lpp->aaMember != Properties.u.UserProperties.PTSINFO.aaMembership) - lpp->fMember_Mixed = TRUE; - } - } - - // Fill in the dialog's state - // - CheckDlgButton (hDlg, IDC_USER_CREATE_KAS, lpp->fCreateKAS); - CheckDlgButton (hDlg, IDC_USER_CREATE_PTS, lpp->fCreatePTS); - - if (lpp->fSeal_Mixed) - Set3State (hDlg, IDC_USER_NOSEAL); - else - Set2State (hDlg, IDC_USER_NOSEAL); - CheckDlgButton (hDlg, IDC_USER_NOSEAL, (lpp->fSeal_Mixed) ? BST_INDETERMINATE : (!lpp->fSeal)); - - if (lpp->fAdmin_Mixed) - Set3State (hDlg, IDC_USER_ADMIN); - else - Set2State (hDlg, IDC_USER_ADMIN); - CheckDlgButton (hDlg, IDC_USER_ADMIN, (lpp->fAdmin_Mixed) ? BST_INDETERMINATE : lpp->fAdmin); - - if (lpp->fGrantTickets_Mixed) - Set3State (hDlg, IDC_USER_TGS); - else - Set2State (hDlg, IDC_USER_TGS); - CheckDlgButton (hDlg, IDC_USER_TGS, (lpp->fGrantTickets_Mixed) ? BST_INDETERMINATE : lpp->fGrantTickets); - - SYSTEMTIME stMin; - SYSTEMTIME stNow; - SYSTEMTIME stMax; - ULONG csecMin = 0; - ULONG csecNow = lpp->csecLifetime; - ULONG csecMax = csecTICKETLIFETIME_MAX; - SET_ELAPSED_TIME_FROM_SECONDS (&stMin, csecMin); - SET_ELAPSED_TIME_FROM_SECONDS (&stNow, csecNow); - SET_ELAPSED_TIME_FROM_SECONDS (&stMax, csecMax); - EL_SetRange (GetDlgItem (hDlg, IDC_USER_LIFETIME), &stMin, &stMax); - EL_SetTime (GetDlgItem (hDlg, IDC_USER_LIFETIME), &stNow); - - if (lpp->fGroupQuota_Mixed) - Set3State (hDlg, IDC_USER_GROUP_HASQUOTA); - else - Set2State (hDlg, IDC_USER_GROUP_HASQUOTA); - CheckDlgButton (hDlg, IDC_USER_GROUP_HASQUOTA, (lpp->fGroupQuota_Mixed) ? BST_INDETERMINATE : (lpp->cGroupQuota == cGROUPQUOTA_INFINITE) ? BST_UNCHECKED : BST_CHECKED); - - if (fHasSpinner (GetDlgItem (hDlg, IDC_USER_GROUP_QUOTA))) - SP_SetPos (GetDlgItem (hDlg, IDC_USER_GROUP_QUOTA), lpp->cGroupQuota); - else - CreateSpinner (GetDlgItem (hDlg, IDC_USER_GROUP_QUOTA), 10, FALSE, cGROUPQUOTA_MIN, lpp->cGroupQuota, cGROUPQUOTA_MAX); - - UserProp_Advanced_UpdateDialog_Perm (hDlg, IDC_USER_PERM_STATUS, lpp->aaStatus, lpp->fStatus_Mixed); - UserProp_Advanced_UpdateDialog_Perm (hDlg, IDC_USER_PERM_OWNED, lpp->aaOwned, lpp->fOwned_Mixed); - UserProp_Advanced_UpdateDialog_Perm (hDlg, IDC_USER_PERM_MEMBER, lpp->aaMember, lpp->fMember_Mixed); - - UserProp_Advanced_OnGrantTickets (hDlg); - UserProp_Advanced_OnHasGroupQuota (hDlg); - UserProp_Advanced_OnAdmin (hDlg); -} - - -void UserProp_Advanced_UpdateDialog_Perm (HWND hDlg, int idc, ACCOUNTACCESS aa, BOOL fMixed) -{ - CB_StartChange (GetDlgItem (hDlg, idc), TRUE); - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_OWNER, aaOWNER_ONLY); - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_ANYONE, aaANYONE); - if (fMixed) - CB_AddItem (GetDlgItem (hDlg, idc), IDS_ACCOUNTACCESS_MIXED, (LPARAM)-1); - CB_EndChange (GetDlgItem (hDlg, idc), TRUE); - - LPARAM lpSelect = (fMixed) ? ((LPARAM)-1) : (LPARAM)aa; - CB_SetSelectedByData (GetDlgItem (hDlg, idc), lpSelect); -} - - -void UserProp_Advanced_OnApply (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - lpp->fApplyAdvanced = TRUE; - lpp->fCreateKAS = IsDlgButtonChecked (hDlg, IDC_USER_CREATE_KAS); - lpp->fCreatePTS = IsDlgButtonChecked (hDlg, IDC_USER_CREATE_PTS); - - if (IsWindow (GetDlgItem (hDlg, IDC_USER_NOSEAL))) - { - lpp->fSeal = !IsDlgButtonChecked (hDlg, IDC_USER_NOSEAL); - lpp->fSeal_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_NOSEAL) == BST_INDETERMINATE); - } - - if (IsWindow (GetDlgItem (hDlg, IDC_USER_ADMIN))) - { - lpp->fAdmin = IsDlgButtonChecked (hDlg, IDC_USER_ADMIN); - lpp->fAdmin_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_ADMIN) == BST_INDETERMINATE); - } - - if (IsWindow (GetDlgItem (hDlg, IDC_USER_TGS))) - { - lpp->fGrantTickets = IsDlgButtonChecked (hDlg, IDC_USER_TGS); - lpp->fGrantTickets_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_TGS) == BST_INDETERMINATE); - } - - if (IsWindow (GetDlgItem (hDlg, IDC_USER_LIFETIME))) - { - SYSTEMTIME stLifetime; - EL_GetTime (GetDlgItem (hDlg, IDC_USER_LIFETIME), &stLifetime); - lpp->csecLifetime = GET_SECONDS_FROM_ELAPSED_TIME (&stLifetime); - } - - if (IsWindow (GetDlgItem (hDlg, IDC_USER_GROUP_HASQUOTA))) - { - if (!IsDlgButtonChecked (hDlg, IDC_USER_GROUP_HASQUOTA)) - lpp->cGroupQuota = cGROUPQUOTA_INFINITE; - else // (IsDlgButtonChecked (hDlg, IDC_USER_GROUP_HASQUOTA)) - lpp->cGroupQuota = SP_GetPos (GetDlgItem (hDlg, IDC_USER_GROUP_QUOTA)); - lpp->fGroupQuota_Mixed = (IsDlgButtonChecked (hDlg, IDC_USER_GROUP_HASQUOTA) == BST_INDETERMINATE); - } - - lpp->aaStatus = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_USER_PERM_STATUS)); - lpp->fStatus_Mixed = (lpp->aaStatus == (ACCOUNTACCESS)-1) ? TRUE : FALSE; - - lpp->aaOwned = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_USER_PERM_OWNED)); - lpp->fOwned_Mixed = (lpp->aaOwned == (ACCOUNTACCESS)-1) ? TRUE : FALSE; - - lpp->aaMember = (ACCOUNTACCESS)CB_GetSelectedData (GetDlgItem (hDlg, IDC_USER_PERM_MEMBER)); - lpp->fMember_Mixed = (lpp->aaMember == (ACCOUNTACCESS)-1) ? TRUE : FALSE; -} - - -BOOL CALLBACK UserProp_Member_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - if (AfsAppLib_HandleHelp ((lpp && lpp->fMachine) ? IDD_MACHINE_MEMBER : IDD_USER_MEMBER, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - UserProp_Member_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - UserProp_Member_OnDestroy (hDlg); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskGROUP_SEARCH) - UserProp_Member_OnEndTask_GroupSearch (hDlg, ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - UserProp_Member_OnApply (hDlg); - break; - - case IDC_USER_SHOW_MEMBER: - case IDC_USER_SHOW_OWNER: - UserProp_Member_OnShowType (hDlg); - break; - - case IDC_MEMBER_ADD: - UserProp_Member_OnAdd (hDlg); - break; - - case IDC_MEMBER_REMOVE: - UserProp_Member_OnRemove (hDlg); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - UserProp_Member_OnSelect (hDlg); - break; - } - break; - } - return FALSE; -} - - -void UserProp_Member_OnInitDialog (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // If we've come in here with a valid set of groups to display, - // copy those. We'll need the copies if the user cancels the dialog. - // - SetWindowData (hDlg, GWD_ASIDLIST_MEMBER, (LPARAM)(lpp->pGroupsMember)); - SetWindowData (hDlg, GWD_ASIDLIST_OWNER, (LPARAM)(lpp->pGroupsOwner)); - - LPASIDLIST pList; - if ((pList = lpp->pGroupsMember) != NULL) - asc_AsidListCopy (&lpp->pGroupsMember, &pList); - if ((pList = lpp->pGroupsOwner) != NULL) - asc_AsidListCopy (&lpp->pGroupsOwner, &pList); - - // If this prop sheet reflects more than one user, disable the - // Ownership button (we do this primarily because the Add/Remove - // buttons have no straight-forward semantic for that case). - // Actually, instead of disabling the thing, we'll hide the buttons - // entirely and resize the list/move the title. - // - if (lpp->pUserList && (lpp->pUserList->cEntries > 1)) - { - ShowWindow (GetDlgItem (hDlg, IDC_USER_SHOW_MEMBER), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_USER_SHOW_OWNER), SW_HIDE); - - RECT rButton; - GetRectInParent (GetDlgItem (hDlg, IDC_USER_SHOW_MEMBER), &rButton); - - RECT rTitle; - GetRectInParent (GetDlgItem (hDlg, IDC_GROUPS_TITLE), &rTitle); - - RECT rList; - GetRectInParent (GetDlgItem (hDlg, IDC_GROUPS_LIST), &rList); - - LONG cyDelta = rTitle.top - rButton.top; - - SetWindowPos (GetDlgItem (hDlg, IDC_GROUPS_TITLE), NULL, - rTitle.left, rTitle.top-cyDelta, - rTitle.right-rTitle.left, rTitle.bottom-rTitle.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); - - SetWindowPos (GetDlgItem (hDlg, IDC_GROUPS_LIST), NULL, - rList.left, rList.top-cyDelta, - rList.right-rList.left, rList.bottom-rList.top+cyDelta, - SWP_NOZORDER | SWP_NOACTIVATE); - } - - // Apply an imagelist to the dialog's fastlist - // - FastList_SetImageLists (GetDlgItem (hDlg, IDC_GROUPS_LIST), AfsAppLib_CreateImageList (FALSE), NULL); - - // Select a checkbox and pretend that the user clicked it; that will - // make the dialog automatically re-populate the list of groups - // - CheckDlgButton (hDlg, IDC_USER_SHOW_MEMBER, TRUE); - UserProp_Member_OnShowType (hDlg); -} - - -void UserProp_Member_OnDestroy (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - LPASIDLIST pList; - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_MEMBER)) != NULL) - lpp->pGroupsMember = pList; - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_OWNER)) != NULL) - lpp->pGroupsOwner = pList; -} - - -void UserProp_Member_OnShowType (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // If we've already obtained the list of groups we should be displaying, - // just go show it. - // - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - { - if (lpp->pGroupsMember) - { - UserProp_Member_PopulateList (hDlg); - return; - } - } - else // (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_OWNER)) - { - if (lpp->pGroupsOwner) - { - UserProp_Member_PopulateList (hDlg); - return; - } - } - - // Otherwise, we'll have to start a background task to do the querying. - // Change the text above the list to "Querying...", disable the buttons, - // and remove any items in the list. - // - if (!lpp->pUserList) - { - // Generate a few empty ASID list; this is a new user account we're - // displaying, and the caller hasn't yet added any groups. - // - if (!lpp->pGroupsMember) - { - if (!asc_AsidListCreate (&lpp->pGroupsMember)) - return; - } - if (!lpp->pGroupsOwner) - { - if (!asc_AsidListCreate (&lpp->pGroupsOwner)) - return; - } - UserProp_Member_OnShowType (hDlg); - } - else // (lpp->pUserList) - { - TCHAR szTitle[ cchRESOURCE ]; - GetString (szTitle, IDS_QUERYING_LONG); - SetDlgItemText (hDlg, IDC_GROUPS_TITLE, szTitle); - - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_ADD), FALSE); - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_REMOVE), FALSE); - - FastList_RemoveAll (GetDlgItem (hDlg, IDC_GROUPS_LIST)); - - // Then start a background task to grab an ASIDLIST of groups which - // match the specified search criteria. - // - LPGROUP_SEARCH_PARAMS pTask = New (GROUP_SEARCH_PARAMS); - asc_AsidListCopy (&pTask->pUserList, &lpp->pUserList); - pTask->fMembership = IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER); - StartTask (taskGROUP_SEARCH, hDlg, pTask); - } -} - - -void UserProp_Member_OnEndTask_GroupSearch (HWND hDlg, LPTASKPACKET ptp) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // The search is complete. If we've just obtained an ASIDLIST successfully, - // associate it with the dialog and repopulate the display. - // - if (ptp->rc && TASKDATA(ptp)->pAsidList) - { - if (TASKDATA(ptp)->fMembership) - { - if (!lpp->pGroupsMember) - { - asc_AsidListCopy (&lpp->pGroupsMember, &TASKDATA(ptp)->pAsidList); - UserProp_Member_PopulateList (hDlg); - } - } - else // (!TASKDATA(ptp)->fMembership) - { - if (!lpp->pGroupsOwner) - { - asc_AsidListCopy (&lpp->pGroupsOwner, &TASKDATA(ptp)->pAsidList); - UserProp_Member_PopulateList (hDlg); - } - } - } -} - - -void UserProp_Member_PopulateList (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Clear the list of groups - // - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - FastList_Begin (hList); - FastList_RemoveAll (hList); - - // We should have an ASIDLIST associated with the dialog to reflect - // which groups to display. Find it, and repopulate the list on the display. - // - LPASIDLIST pGroupList; - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - pGroupList = lpp->pGroupsMember; - else // (!IsDlgButtonChecked (hDlg, IDC_USER_SHOW_OWNER)) - pGroupList = lpp->pGroupsOwner; - - if (pGroupList) - { - TCHAR szMixed[ cchRESOURCE ]; - GetString (szMixed, IDS_MEMBER_MIXED); - - for (size_t ii = 0; ii < pGroupList->cEntries; ++ii) - { - ULONG status; - TCHAR szName[ cchNAME ]; - if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, pGroupList->aEntries[ ii ].idObject, szName, &status)) - continue; - if (!pGroupList->aEntries[ ii ].lParam) - lstrcat (szName, szMixed); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.iFirstImage = imageGROUP; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = szName; - flai.lParam = (LPARAM)(pGroupList->aEntries[ ii ].idObject); - FastList_AddItem (hList, &flai); - } - } - - FastList_End (hList); - - // Fix the buttons, and the text at the top of the list - // - TCHAR szTitle[ cchRESOURCE ]; - if (lpp->fMachine) - { - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - { - if (!lpp->pUserList) - GetString (szTitle, IDS_NEWMACHINE_SHOW_MEMBER_TITLE); - else if (lpp->pUserList->cEntries == 1) - GetString (szTitle, IDS_MACHINE_SHOW_MEMBER_TITLE); - else - GetString (szTitle, IDS_MACHINE_SHOW_MEMBER_TITLE_MULTIPLE); - } - else - { - if (!lpp->pUserList) - GetString (szTitle, IDS_NEWMACHINE_SHOW_OWNER_TITLE); - else - GetString (szTitle, IDS_MACHINE_SHOW_OWNER_TITLE); - } - } - else - { - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - { - if (!lpp->pUserList) - GetString (szTitle, IDS_NEWUSER_SHOW_MEMBER_TITLE); - else if (lpp->pUserList->cEntries == 1) - GetString (szTitle, IDS_USER_SHOW_MEMBER_TITLE); - else - GetString (szTitle, IDS_USER_SHOW_MEMBER_TITLE_MULTIPLE); - } - else - { - if (!lpp->pUserList) - GetString (szTitle, IDS_NEWUSER_SHOW_OWNER_TITLE); - else - GetString (szTitle, IDS_USER_SHOW_OWNER_TITLE); - } - } - - SetDlgItemText (hDlg, IDC_GROUPS_TITLE, szTitle); - - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_ADD), TRUE); - UserProp_Member_OnSelect (hDlg); -} - - -void UserProp_Member_OnSelect (HWND hDlg) -{ - BOOL fEnable = IsWindowEnabled (GetDlgItem (hDlg, IDC_MEMBER_ADD)); - if (fEnable && !FastList_FindFirstSelected (GetDlgItem (hDlg, IDC_GROUPS_LIST))) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_MEMBER_REMOVE), fEnable); -} - - -void UserProp_Member_OnAdd (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - LPBROWSE_PARAMS pParams = New (BROWSE_PARAMS); - memset (pParams, 0x00, sizeof(BROWSE_PARAMS)); - pParams->hParent = GetParent(hDlg); - pParams->iddForHelp = IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER) ? IDD_BROWSE_JOIN : IDD_BROWSE_OWN; - pParams->idsTitle = IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER) ? IDS_BROWSE_TITLE_JOIN : IDS_BROWSE_TITLE_OWN; - pParams->idsPrompt = IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER) ? IDS_BROWSE_PROMPT_JOIN : IDS_BROWSE_PROMPT_OWN; - pParams->idsCheck = IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER) ? IDS_BROWSE_CHECK_JOIN : IDS_BROWSE_CHECK_OWN; - pParams->TypeToShow = TYPE_GROUP; - pParams->fAllowMultiple = TRUE; - - // First prepare an ASIDLIST which reflects only the groups which - // all selected users own/are members in. - // - LPASIDLIST pGroupList; - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - pGroupList = lpp->pGroupsMember; - else // (!IsDlgButtonChecked (hDlg, IDC_USER_SHOW_OWNER)) - pGroupList = lpp->pGroupsOwner; - - if (pGroupList) - { - asc_AsidListCreate (&pParams->pObjectsToSkip); - for (size_t ii = 0; ii < pGroupList->cEntries; ++ii) - { - if (pGroupList->aEntries[ ii ].lParam) // all users have this group? - asc_AsidListAddEntry (&pParams->pObjectsToSkip, pGroupList->aEntries[ ii ].idObject, 0); - } - } - - if (ShowBrowseDialog (pParams)) - { - // The user added some groups; modify pGroupList (and the dialog, - // at the same time). - // - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - FastList_Begin (hList); - - for (size_t ii = 0; ii < pParams->pObjectsSelected->cEntries; ++ii) - { - ASID idGroup = pParams->pObjectsSelected->aEntries[ ii ].idObject; - - // The user has chosen to add group {idGroup}. If it's not in our - // list at all, add it (and a new entry for the display). If it - // *is* in our list, make sure its lParam is 1--indicating all users - // get it--and modify the display's entry to remove the "(some)" - // marker. - // - LPARAM lParam; - if (!asc_AsidListTest (&pGroupList, idGroup, &lParam)) - { - ULONG status; - TCHAR szName[ cchNAME ]; - if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, idGroup, szName, &status)) - continue; - - asc_AsidListAddEntry (&pGroupList, idGroup, TRUE); - - FASTLISTADDITEM flai; - memset (&flai, 0x00, sizeof(flai)); - flai.iFirstImage = imageGROUP; - flai.iSecondImage = IMAGE_NOIMAGE; - flai.pszText = szName; - flai.lParam = (LPARAM)idGroup; - FastList_AddItem (hList, &flai); - PropSheetChanged (hDlg); - } - else if (!lParam) - { - ULONG status; - TCHAR szName[ cchNAME ]; - if (!asc_ObjectNameGet_Fast (g.idClient, g.idCell, idGroup, szName, &status)) - continue; - - asc_AsidListSetEntryParam (&pGroupList, idGroup, TRUE); - - HLISTITEM hItem; - if ((hItem = FastList_FindItem (hList, (LPARAM)idGroup)) != NULL) - FastList_SetItemText (hList, hItem, 0, szName); - PropSheetChanged (hDlg); - } - } - - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - lpp->pGroupsMember = pGroupList; - else // (!IsDlgButtonChecked (hDlg, IDC_USER_SHOW_OWNER)) - lpp->pGroupsOwner = pGroupList; - - FastList_End (hList); - } - - if (pParams->pObjectsToSkip) - asc_AsidListFree (&pParams->pObjectsToSkip); - if (pParams->pObjectsSelected) - asc_AsidListFree (&pParams->pObjectsSelected); - Delete (pParams); -} - - -void UserProp_Member_OnRemove (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Find which list-of-groups is currently being displayed. - // - LPASIDLIST pGroupList; - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - pGroupList = lpp->pGroupsMember; - else // (!IsDlgButtonChecked (hDlg, IDC_USER_SHOW_OWNER)) - pGroupList = lpp->pGroupsOwner; - - // The user wants to remove some groups; modify pGroupList - // (and the dialog, at the same time). - // - HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST); - FastList_Begin (hList); - - HLISTITEM hItem; - while ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - ASID idGroup = (ASID)FastList_GetItemParam (hList, hItem); - FastList_RemoveItem (hList, hItem); - asc_AsidListRemoveEntry (&pGroupList, idGroup); - PropSheetChanged (hDlg); - } - - if (IsDlgButtonChecked (hDlg, IDC_USER_SHOW_MEMBER)) - lpp->pGroupsMember = pGroupList; - else // (!IsDlgButtonChecked (hDlg, IDC_USER_SHOW_OWNER)) - lpp->pGroupsOwner = pGroupList; - - FastList_End (hList); -} - - -void UserProp_Member_OnApply (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - // Free the old backup ASIDLIST copies we attached to the dialog during - // WM_INITDIALOG processing. - // - LPASIDLIST pList; - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_MEMBER)) != NULL) - asc_AsidListFree (&pList); - if ((pList = (LPASIDLIST)GetWindowData (hDlg, GWD_ASIDLIST_OWNER)) != NULL) - asc_AsidListFree (&pList); - SetWindowData (hDlg, GWD_ASIDLIST_MEMBER, 0); - SetWindowData (hDlg, GWD_ASIDLIST_OWNER, 0); - - if (lpp->pUserList) - { - // Start a background task to update the membership and ownership lists - // - if (lpp->pGroupsMember) - { - LPUSER_GROUPLIST_SET_PARAMS pTask = New (USER_GROUPLIST_SET_PARAMS); - memset (pTask, 0x00, sizeof(USER_GROUPLIST_SET_PARAMS)); - asc_AsidListCopy (&pTask->pUsers, &lpp->pUserList); - asc_AsidListCopy (&pTask->pGroups, &lpp->pGroupsMember); - pTask->fMembership = TRUE; - StartTask (taskUSER_GROUPLIST_SET, NULL, pTask); - } - if (lpp->pGroupsOwner) - { - LPUSER_GROUPLIST_SET_PARAMS pTask = New (USER_GROUPLIST_SET_PARAMS); - memset (pTask, 0x00, sizeof(USER_GROUPLIST_SET_PARAMS)); - asc_AsidListCopy (&pTask->pUsers, &lpp->pUserList); - asc_AsidListCopy (&pTask->pGroups, &lpp->pGroupsOwner); - pTask->fMembership = FALSE; - StartTask (taskUSER_GROUPLIST_SET, NULL, pTask); - } - } -} - - -void UserProp_UpdateName (HWND hDlg) -{ - LPUSERPROPINFO lpp = (LPUSERPROPINFO)PropSheet_FindTabParam (hDlg); - - if (IsWindow (GetDlgItem (hDlg, IDC_USER_NAME))) - { - if (!lpp->pUserList || (lpp->pUserList->cEntries == 1)) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_USER_NAME, szText, cchRESOURCE); - - ULONG status; - TCHAR szName[ cchRESOURCE ]; - if (lpp->pUserList) - User_GetDisplayName (szName, lpp->pUserList->aEntries[ 0 ].idObject); - else - asc_ObjectNameGet_Fast (g.idClient, g.idCell, g.idCell, szName, &status); - - if (lpp->pUserList) - { - ASOBJPROP Properties; - if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pUserList->aEntries[ 0 ].idObject, &Properties, &status)) - AppendUID (szName, Properties.u.UserProperties.PTSINFO.uidName); - } - - LPTSTR pszText = FormatString (szText, TEXT("%s"), szName); - SetDlgItemText (hDlg, IDC_USER_NAME, pszText); - FreeString (pszText); - } - else if (lpp->pUserList && (lpp->pUserList->cEntries > 1)) - { - LPTSTR pszText = CreateNameList (lpp->pUserList, IDS_USER_NAME_MULTIPLE); - SetDlgItemText (hDlg, IDC_USER_NAME, pszText); - FreeString (pszText); - } - } -} - diff --git a/src/WINNT/afsusrmgr/usr_prop.h b/src/WINNT/afsusrmgr/usr_prop.h deleted file mode 100644 index 1b4a15ac4..000000000 --- a/src/WINNT/afsusrmgr/usr_prop.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_PROP_H -#define USR_PROP_H - - -/* - * CONFIGURATION ______________________________________________________________ - * - */ - -#define csecTICKETLIFETIME_DEFAULT (csec1HOUR * 25L) -#define csecTICKETLIFETIME_MAX (csec1HOUR * 720L) - -#define cGROUPQUOTA_MIN 1 -#define cGROUPQUOTA_DEFAULT 10 -#define cGROUPQUOTA_MAX 9999 -#define cGROUPQUOTA_INFINITE 0 - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - uptANY = -1, - uptGENERAL, - uptMEMBERSHIP, - uptADVANCED - } USERPROPTAB; - -#define nUSERPROPTAB_MAX 4 - -typedef struct - { - LPASIDLIST pUserList; // NULL if creating new user - BOOL fDeleteMeOnClose; // TRUE to delete structure when done - BOOL fShowModal; // TRUE to block while showing - HWND hParent; - BOOL fMachine; // TRUE to show machine pages instead - - BOOL fApplyGeneral; // TRUE to apply these fields: - BOOL fCanChangePw; - BOOL fCanChangePw_Mixed; - BOOL fCanReusePw; - BOOL fCanReusePw_Mixed; - BOOL fExpires; - BOOL fExpires_Mixed; - SYSTEMTIME stExpires; - LONG cdayPwExpires; - BOOL fPwExpires_Mixed; - LONG cFailLock; - BOOL fFailLock_Mixed; - LONG csecFailLock; - - BOOL fApplyAdvanced; // TRUE to apply these fields: - BOOL fCreateKAS; - BOOL fCreatePTS; - BOOL fSeal; - BOOL fSeal_Mixed; - BOOL fAdmin; - BOOL fAdmin_Mixed; - BOOL fGrantTickets; - BOOL fGrantTickets_Mixed; - ULONG csecLifetime; - LONG cGroupQuota; - BOOL fGroupQuota_Mixed; - ACCOUNTACCESS aaStatus; - BOOL fStatus_Mixed; - ACCOUNTACCESS aaOwned; - BOOL fOwned_Mixed; - ACCOUNTACCESS aaMember; - BOOL fMember_Mixed; - - LPASIDLIST pGroupsMember; - LPASIDLIST pGroupsOwner; - } USERPROPINFO, *LPUSERPROPINFO; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void User_ShowProperties (LPASIDLIST pAsidList, USERPROPTAB uptTarget = uptANY); -void User_ShowProperties (LPUSERPROPINFO lpp, USERPROPTAB uptTarget = uptANY); -void User_FreeProperties (LPUSERPROPINFO lpp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_search.cpp b/src/WINNT/afsusrmgr/usr_search.cpp deleted file mode 100644 index 4d221fef4..000000000 --- a/src/WINNT/afsusrmgr/usr_search.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_search.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Users_Search_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Users_Search_OnInitDialog (HWND hDlg); -void Users_Search_OnCheck (HWND hDlg); -void Users_Search_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Users_SetDefaultSearchParams (LPAFSADMSVR_SEARCH_PARAMS pSearchParams) -{ - memset (pSearchParams, 0x00, sizeof(AFSADMSVR_SEARCH_PARAMS)); - pSearchParams->SearchType = SEARCH_NO_LIMITATIONS; -} - - -void Users_ShowAdvancedSearch (HWND hParent) -{ - ModalDialog (IDD_SEARCH_USERS, hParent, (DLGPROC)Users_Search_DlgProc); -} - - -BOOL CALLBACK Users_Search_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (AfsAppLib_HandleHelp (IDD_SEARCH_USERS, hDlg, msg, wp, lp)) - return TRUE; - - switch (msg) - { - case WM_INITDIALOG: - Users_Search_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Users_Search_OnOK (hDlg); - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_SEARCH_ALL: - case IDC_SEARCH_EXPIRE: - case IDC_SEARCH_PWEXPIRE: - Users_Search_OnCheck (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Users_Search_OnInitDialog (HWND hDlg) -{ - CheckDlgButton (hDlg, IDC_SEARCH_ALL, (gr.SearchUsers.SearchType == SEARCH_NO_LIMITATIONS)); - CheckDlgButton (hDlg, IDC_SEARCH_EXPIRE, (gr.SearchUsers.SearchType == SEARCH_EXPIRES_BEFORE)); - CheckDlgButton (hDlg, IDC_SEARCH_PWEXPIRE, (gr.SearchUsers.SearchType == SEARCH_PASSWORD_EXPIRES_BEFORE)); - - SYSTEMTIME stNow; - GetSystemTime (&stNow); - - SYSTEMTIME stShow; - memcpy (&stShow, ((gr.SearchUsers.SearchType == SEARCH_EXPIRES_BEFORE) ? &gr.SearchUsers.SearchTime : &stNow), sizeof(SYSTEMTIME)); - DA_SetDate (GetDlgItem (hDlg, IDC_SEARCH_EXPIRE_DATE), &stShow); - - memcpy (&stShow, ((gr.SearchUsers.SearchType == SEARCH_PASSWORD_EXPIRES_BEFORE) ? &gr.SearchUsers.SearchTime : &stNow), sizeof(SYSTEMTIME)); - DA_SetDate (GetDlgItem (hDlg, IDC_SEARCH_PWEXPIRE_DATE), &stShow); - - Users_Search_OnCheck (hDlg); -} - - -void Users_Search_OnOK (HWND hDlg) -{ - AFSADMSVR_SEARCH_PARAMS OldSearchType; - memcpy (&OldSearchType, &gr.SearchUsers, sizeof(AFSADMSVR_SEARCH_PARAMS)); - - if (IsDlgButtonChecked (hDlg, IDC_SEARCH_EXPIRE)) - { - gr.SearchUsers.SearchType = SEARCH_EXPIRES_BEFORE; - DA_GetDate (GetDlgItem (hDlg, IDC_SEARCH_EXPIRE_DATE), &gr.SearchUsers.SearchTime); - } - else if (IsDlgButtonChecked (hDlg, IDC_SEARCH_PWEXPIRE)) - { - gr.SearchUsers.SearchType = SEARCH_PASSWORD_EXPIRES_BEFORE; - DA_GetDate (GetDlgItem (hDlg, IDC_SEARCH_PWEXPIRE_DATE), &gr.SearchUsers.SearchTime); - } - else // (IsDlgButtonChecked (hDlg, IDC_SEARCH_ALL)) - { - gr.SearchUsers.SearchType = SEARCH_NO_LIMITATIONS; - } - - // If the user changed any search parameters, refresh the display - // - if (memcmp (&OldSearchType, &gr.SearchUsers, sizeof(AFSADMSVR_SEARCH_PARAMS))) - { - Display_PopulateList(); - } -} - - -void Users_Search_OnCheck (HWND hDlg) -{ - EnableWindow (GetDlgItem (hDlg, IDC_SEARCH_EXPIRE_DATE), IsDlgButtonChecked (hDlg, IDC_SEARCH_EXPIRE)); - EnableWindow (GetDlgItem (hDlg, IDC_SEARCH_PWEXPIRE_DATE), IsDlgButtonChecked (hDlg, IDC_SEARCH_PWEXPIRE)); -} - diff --git a/src/WINNT/afsusrmgr/usr_search.h b/src/WINNT/afsusrmgr/usr_search.h deleted file mode 100644 index c6d7825a6..000000000 --- a/src/WINNT/afsusrmgr/usr_search.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_SEARCH_H -#define USR_SEARCH_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Users_ShowAdvancedSearch (HWND hParent); - -void Users_SetDefaultSearchParams (LPAFSADMSVR_SEARCH_PARAMS pSearchParams); - - -#endif - diff --git a/src/WINNT/afsusrmgr/usr_tab.cpp b/src/WINNT/afsusrmgr/usr_tab.cpp deleted file mode 100644 index d8541bd3d..000000000 --- a/src/WINNT/afsusrmgr/usr_tab.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "usr_tab.h" -#include "usr_col.h" -#include "usr_search.h" -#include "command.h" -#include "window.h" - - -/* - * RESIZING WINDOWS ___________________________________________________________ - * - */ - -rwWindowData awdUsersTab[] = { - { IDC_USERS_TITLE, raRepaint | raSizeX, 0, 0 }, - { IDC_ADVANCED, raMoveX, 0, 0 }, - { IDC_USERS_PATTERN, raMoveX, 0, 0 }, - { IDC_USERS_PATTERN_PROMPT, raRepaint | raMoveX, 0, 0 }, - { IDC_USERS_LIST, raSizeX | raSizeY, 0, 0 }, - { M_USER_CREATE, raMoveX | raMoveY, 0, 0 }, - { M_MEMBERSHIP, raMoveX | raMoveY, 0, 0 }, - { M_PROPERTIES, raMoveX | raMoveY, 0, 0 }, - { IDC_STATIC, raRepaint, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_SEARCH_TIMER 0 - -#define msecSEARCH_TIMER 650 - -static struct - { - DWORD dwTickLastType; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Users_EnableButtons (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Users_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (Display_HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewUsr)) - return FALSE; - - switch (msg) - { - case WM_INITDIALOG: - { - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - ResizeWindow (hDlg, awdUsersTab, rwaMoveToHere, &rTab); - - HIMAGELIST hSmall = AfsAppLib_CreateImageList (FALSE); - HIMAGELIST hLarge = AfsAppLib_CreateImageList (TRUE); - FastList_SetImageLists (GetDlgItem (hDlg, IDC_USERS_LIST), hSmall, hLarge); - - FastList_SetSortFunction (GetDlgItem (hDlg, IDC_USERS_LIST), General_ListSortFunction); - - FL_RestoreView (GetDlgItem (hDlg, IDC_USERS_LIST), &gr.viewUsr); - FastList_SetTextCallback (GetDlgItem (hDlg, IDC_USERS_LIST), Display_GetItemText, (DWORD)&gr.viewUsr); - SetDlgItemText (hDlg, IDC_USERS_PATTERN, g.szPatternUsers); - Users_EnableButtons(hDlg); - Display_PopulateUserList(); - - l.dwTickLastType = 0; - } - break; - - case WM_HELP: - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - break; - - case WM_DESTROY: - FL_StoreView (GetDlgItem (hDlg, IDC_USERS_LIST), &gr.viewUsr); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdUsersTab, rwaFixupGuts); - break; - - case WM_TIMER: - switch (wp) - { - case ID_SEARCH_TIMER: - if ( (l.dwTickLastType) && (GetTickCount() > l.dwTickLastType + msecSEARCH_TIMER) ) - { - KillTimer (hDlg, ID_SEARCH_TIMER); - Display_PopulateUserList(); - } - break; - } - break; - - case WM_CONTEXTMENU: - POINT ptScreen; - ptScreen.x = LOWORD(lp); - ptScreen.y = HIWORD(lp); - OnRightClick (pmUSER, GetDlgItem (hDlg, IDC_USERS_LIST), &ptScreen); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_USERS_PATTERN: - if (HIWORD(wp) == EN_UPDATE) - { - l.dwTickLastType = GetTickCount(); - KillTimer (hDlg, ID_SEARCH_TIMER); - SetTimer (hDlg, ID_SEARCH_TIMER, msecSEARCH_TIMER +15, NULL); - } - break; - - case IDC_ADVANCED: - Users_ShowAdvancedSearch (g.hMain); - break; - - default: - OnContextCommand (LOWORD(wp)); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Main_SetMenus(); - Users_EnableButtons(hDlg); - break; - - case FLN_LDBLCLICK: - PostMessage (hDlg, WM_COMMAND, MAKELONG(M_PROPERTIES,BN_CLICKED), (LPARAM)GetDlgItem (hDlg, M_PROPERTIES)); - break; - } - break; - } - - return FALSE; -} - - -void Users_EnableButtons (HWND hDlg) -{ - BOOL fEnable = (Display_GetSelectedCount() != 0) ? TRUE : FALSE; - EnableWindow (GetDlgItem (hDlg, M_PROPERTIES), fEnable); - EnableWindow (GetDlgItem (hDlg, M_MEMBERSHIP), fEnable); -} - diff --git a/src/WINNT/afsusrmgr/usr_tab.h b/src/WINNT/afsusrmgr/usr_tab.h deleted file mode 100644 index a3b4307da..000000000 --- a/src/WINNT/afsusrmgr/usr_tab.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef USR_TAB_H -#define USR_TAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Users_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/afsusrmgr/window.cpp b/src/WINNT/afsusrmgr/window.cpp deleted file mode 100644 index f6e6f8d8e..000000000 --- a/src/WINNT/afsusrmgr/window.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "messages.h" -#include "window.h" -#include "usr_tab.h" -#include "grp_tab.h" -#include "mch_tab.h" -#include "command.h" -#include "action.h" -#include "creds.h" - - -/* - * TABS _______________________________________________________________________ - * - */ - -static struct { - TABTYPE tt; - int idiImage; - int idsText; - int iddChild; - DLGPROC procChild; -} aTABS[] = { - { ttUSERS, imageUSER, IDS_TAB_USERS, IDD_TAB_USERS, (DLGPROC)Users_DlgProc }, - { ttGROUPS, imageGROUP, IDS_TAB_GROUPS, IDD_TAB_GROUPS, (DLGPROC)Groups_DlgProc }, - { ttMACHINES, imageSERVER, IDS_TAB_MACHINES, IDD_TAB_MACHINES, (DLGPROC)Machines_DlgProc }, -}; - -static size_t cTABS = sizeof(aTABS) / sizeof(aTABS[0]); - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cxMIN_TABS 150 -#define cyMIN_TABS 100 - -rwWindowData awdMain[] = { - { IDC_TAB, raSizeX | raSizeY, MAKELONG(cxMIN_TABS,cyMIN_TABS), 0 }, - { IDC_CELL, raSizeX | raRepaint, 0, 0 }, - { IDC_CREDS, raSizeX | raRepaint, 0, 0 }, - { IDC_ANIM, raMoveX, 0, 0 }, - { IDC_BAR, raSizeX, 0, 0 }, - { IDC_STATIC, raRepaint, 0, 0 }, - { idENDLIST, 0, 0, 0 } -}; - -rwWindowData awdTabChild[] = { - { 0, raSizeX | raSizeY, 0, 0 }, - { idENDLIST, 0, 0, 0 } - }; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Main_OnInitDialog (HWND hDlg); -LRESULT CALLBACK Main_TabHookProc (HWND hTab, UINT msg, WPARAM wp, LPARAM lp); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Main_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_INITDIALOG) - { - g.hMain = hDlg; - AfsAppLib_SetMainWindow (g.hMain); - } - - switch (msg) - { - case WM_INITDIALOG: - Main_OnInitDialog (hDlg); - break; - - case WM_SHOW_YOURSELF: - if (lp || g.idCell) - { - ShowWindow (g.hMain, SW_SHOW); - SetForegroundWindow (g.hMain); - Actions_WindowToTop (TRUE); - } - break; - - case WM_SHOW_ACTIONS: - if (gr.fShowActions) - Actions_OpenWindow(); - break; - - case WM_ACTIVATEAPP: - Actions_WindowToTop ((wp) ? TRUE : FALSE); - if (wp) - StartTask (taskEXPIRED_CREDS); - break; - - case WM_EXPIRED_CREDENTIALS: - case WM_REFRESHED_CREDENTIALS: - g.hCreds = (PVOID)lp; - StartTask (taskUPD_CREDS); - break; - - case WM_SIZE: - // if (lp==0), we're minimizing--don't call ResizeWindow(). - // - if (lp != 0) - ResizeWindow (hDlg, awdMain, rwaFixupGuts); - break; - - case WM_ENDTASK: - LPTASKPACKET ptp; - if ((ptp = (LPTASKPACKET)lp) != NULL) - { - if (ptp->idTask == taskUPD_USERS) - Display_OnEndTask_UpdUsers (ptp); - else if (ptp->idTask == taskUPD_GROUPS) - Display_OnEndTask_UpdGroups (ptp); - else if (ptp->idTask == taskUPD_MACHINES) - Display_OnEndTask_UpdMachines (ptp); - FreeTaskPacket (ptp); - } - break; - - case WM_ASC_NOTIFY_ACTION: - Actions_OnNotify (wp, lp); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - Quit (0); - break; - - default: - OnContextCommand (LOWORD(wp)); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case TCN_SELCHANGE: - Main_PrepareTabChild(); - break; - } - break; - - case WM_HELP: - if ((lp == 0) || (IsAncestor (g.hMain, (HWND)(((LPHELPINFO)lp)->hItemHandle)))) - { - WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0); - } - break; - } - - return FALSE; -} - - -void Main_OnInitDialog (HWND hDlg) -{ - // Resize and reposition the main window - // - RECT rWindow = gr.rMain; - if (!rWindow.right) - GetWindowRect (hDlg, &rWindow); - ResizeWindow (hDlg, awdMain, rwaMoveToHere, &rWindow); - - // Add tabs to the main window's tab control - // - HWND hTab = GetDlgItem (hDlg, IDC_TAB); - TabCtrl_SetImageList (hTab, AfsAppLib_CreateImageList (FALSE)); - - TCHAR szText[ cchRESOURCE ]; - TC_ITEM tci; - tci.mask = TCIF_TEXT | TCIF_PARAM | TCIF_IMAGE; - tci.pszText = szText; - - for (size_t iTab = 0; iTab < cTABS; ++iTab) - { - tci.iImage = aTABS[ iTab ].idiImage; - tci.lParam = (LPARAM)aTABS[ iTab ].tt; - GetString (tci.pszText, aTABS[ iTab ].idsText); - TabCtrl_InsertItem (hTab, iTab, &tci); - } - - // Subclass the tab control, so that we can make it forward any WM_SIZE - // messages to its child window. - // - Subclass_AddHook (hTab, Main_TabHookProc); - - // Since we just subclassed this control, our new wndproc wasn't around - // when the window was created. Any WM_CREATE processing we'd ordinarily - // in that wndproc must therefore be done here. - - // WM_CREATE: - RECT rTab; - GetRectInParent (hTab, &rTab); - ResizeWindow (hTab, awdTabChild, rwaMoveToHere, &rTab); - - // Select an appropriate tab and display it. - // - Main_PrepareTabChild (gr.iTabLast); - - // Tell the admin client that we're interested in any actions that occur - // - ULONG status; - asc_ActionListen (g.idClient, g.hMain, &status); -} - - -LRESULT CALLBACK Main_TabHookProc (HWND hTab, UINT msg, WPARAM wp, LPARAM lp) -{ - LRESULT rc = CallWindowProc ((WNDPROC)Subclass_FindNextHook (hTab, Main_TabHookProc), hTab, msg, wp, lp); - - switch (msg) - { - // Since this is a subclass proc, it's not around when the window - // is created. Any WM_CREATE processing we'd ordinarily do here - // must therefore be done at the point where the tab control is - // subclassed. - // - // case WM_CREATE: - - case WM_SIZE: - if (lp != 0) - ResizeWindow (hTab, awdTabChild, rwaFixupGuts); - break; - - case WM_DESTROY: - Subclass_RemoveHook (hTab, Main_TabHookProc); - break; - } - - return rc; -} - - -void Main_PrepareTabChild (int iTabNew) -{ - HWND hTab = GetDlgItem (g.hMain, IDC_TAB); - int iTabOld = TabCtrl_GetCurSel (hTab); - if (iTabNew == -1) - iTabNew = iTabOld; - - HWND hDlg; - if ((hDlg = GetTabChild (hTab)) != NULL) - DestroyWindow (hDlg); - if ((hDlg = ModelessDialog (aTABS[ iTabNew ].iddChild, hTab, aTABS[ iTabNew ].procChild)) != NULL) - { - if (iTabNew != iTabOld) - TabCtrl_SetCurSel (hTab, iTabNew); - ShowWindow (hDlg, SW_SHOW); - } - - // Remember this tab as the last one the user saw, so that if the app gets - // closed we can re-open it to the same tab. - // - gr.iTabLast = iTabNew; - - // Check/uncheck/enable/disable our dialog's menu items as appropriate. - // We do this whenever the current tab changes, because some of the - // menu items will change state depending on which tab is visible. - // - Main_SetMenus(); -} - - -void Main_SetMenus (void) -{ - HMENU hm = GetMenu (g.hMain); - LPASIDLIST pSel = Display_GetSelectedList(); - - Main_SetViewMenus (hm); - - // Fix the Operations In Progress entry - // - CheckMenu (hm, M_ACTIONS, gr.fShowActions); - - // Fix the CellProperties and Edit.* menu items. Many get disabled if there - // is no selection - // - BOOL fEnable = (pSel && pSel->cEntries) ? TRUE : FALSE; - EnableMenu (hm, M_DELETE, fEnable); - EnableMenu (hm, M_REFRESH, fEnable); - EnableMenu (hm, M_MEMBERSHIP, fEnable); - EnableMenu (hm, M_PROPERTIES, fEnable); - - if ((fEnable = (pSel && (pSel->cEntries == 1))) == TRUE) - { - // Make sure it's a group - ASOBJTYPE Type; - if (!asc_ObjectTypeGet_Fast (g.idClient, g.idCell, pSel->aEntries[0].idObject, &Type)) - fEnable = FALSE; - else if (Type != TYPE_GROUP) - fEnable = FALSE; - } - - EnableMenu (hm, M_RENAME, fEnable); - - if (pSel) - asc_AsidListFree (&pSel); -} - - -void Main_SetViewMenus (HMENU hm) -{ - // Which tab is currently being displayed? - // - HWND hTab = GetDlgItem (g.hMain, IDC_TAB); - int iTab = TabCtrl_GetCurSel (hTab); - TABTYPE tt = aTABS[ iTab ].tt; - - // Fix the Icons.Large/Small/Details entries - // - LPVIEWINFO pvi = (tt == ttUSERS) ? &gr.viewUsr : (tt == ttMACHINES) ? &gr.viewMch : &gr.viewGrp; - ICONVIEW iv = (tt == ttUSERS) ? gr.ivUsr : (tt == ttMACHINES) ? gr.ivMch : gr.ivGrp; - - int idm = ((pvi->lvsView & FLS_VIEW_MASK) == FLS_VIEW_LARGE) ? M_VIEW_LARGE : ((pvi->lvsView & FLS_VIEW_MASK) == FLS_VIEW_SMALL) ? M_VIEW_SMALL : M_VIEW_DETAILS; - CheckMenuRadioItem (hm, M_VIEW_LARGE, M_VIEW_DETAILS, idm, MF_BYCOMMAND); - - // Fix the Icons.One/Two/Status entries - // - BOOL fEnable = ((pvi->lvsView & FLS_VIEW_MASK) == FLS_VIEW_LIST) ? TRUE : FALSE; - EnableMenu (hm, M_VIEW_ONE, fEnable); - EnableMenu (hm, M_VIEW_TWO, fEnable); - EnableMenu (hm, M_VIEW_STATUS, fEnable); - - idm = (iv == ivTWOICONS) ? M_VIEW_TWO : (iv == ivONEICON) ? M_VIEW_ONE : M_VIEW_STATUS; - CheckMenuRadioItem (hm, M_VIEW_ONE, M_VIEW_STATUS, idm, MF_BYCOMMAND); -} - diff --git a/src/WINNT/afsusrmgr/window.h b/src/WINNT/afsusrmgr/window.h deleted file mode 100644 index 7de6eba8c..000000000 --- a/src/WINNT/afsusrmgr/window.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef WINDOW_H -#define WINDOW_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Main_DialogProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void Main_PrepareTabChild (int iTabNew = -1); - -void Main_SetMenus (void); -void Main_SetViewMenus (HMENU hm); - - -#endif - diff --git a/src/WINNT/afsusrmgr/winlist.cpp b/src/WINNT/afsusrmgr/winlist.cpp deleted file mode 100644 index 071bff6e1..000000000 --- a/src/WINNT/afsusrmgr/winlist.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "TaAfsUsrMgr.h" -#include "winlist.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef struct - { - HWND hWnd; - WINDOWLISTTYPE wlt; - ASID idObject; - } WINDOWLISTENTRY, *LPWINDOWLISTENTRY; - -static WINDOWLISTENTRY *aWindowList = NULL; -static size_t cWindowList = 0; - -#define cREALLOC_WINDOWLIST 4 - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void WindowList_Add (HWND hWnd, WINDOWLISTTYPE wlt, ASID idObject) -{ - // See if this window is already in the list - // - for (size_t ii = 0; ii < cWindowList; ++ii) - { - if (aWindowList[ ii ].hWnd == hWnd) - return; - } - - // Add this window to the list - // - for (ii = 0; ii < cWindowList; ++ii) - { - if (!aWindowList[ ii ].hWnd) - break; - } - if (REALLOC (aWindowList, cWindowList, 1+ii, cREALLOC_WINDOWLIST)) - { - aWindowList[ ii ].hWnd = hWnd; - aWindowList[ ii ].wlt = wlt; - aWindowList[ ii ].idObject = idObject; - AfsAppLib_RegisterModelessDialog (hWnd); - } -} - - -HWND WindowList_Search (WINDOWLISTTYPE wlt, ASID idObject) -{ - for (size_t ii = 0; ii < cWindowList; ++ii) - { - if (!aWindowList[ ii ].hWnd) - continue; - if (aWindowList[ ii ].wlt != wlt) - continue; - if ((idObject != ASID_ANY) && (aWindowList[ ii ].idObject != idObject)) - continue; - return aWindowList[ ii ].hWnd; - } - return NULL; -} - - -void WindowList_Remove (HWND hWnd) -{ - for (size_t ii = 0; ii < cWindowList; ++ii) - { - if (aWindowList[ ii ].hWnd == hWnd) - aWindowList[ ii ].hWnd = NULL; - } -} - diff --git a/src/WINNT/afsusrmgr/winlist.h b/src/WINNT/afsusrmgr/winlist.h deleted file mode 100644 index 3f38659c6..000000000 --- a/src/WINNT/afsusrmgr/winlist.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef WINDOWLIST_H -#define WINDOWLIST_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef enum - { - wltUSER_PROPERTIES, - wltGROUP_PROPERTIES, - wltCELL_PROPERTIES - } WINDOWLISTTYPE; - -#define ASID_ANY ((ASID)-1) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void WindowList_Add (HWND hWnd, WINDOWLISTTYPE wlt, ASID idObject = 0); -HWND WindowList_Search (WINDOWLISTTYPE wlt, ASID idObject = ASID_ANY); -void WindowList_Remove (HWND hWnd); - - -#endif - diff --git a/src/WINNT/aklog/.cvsignore b/src/WINNT/aklog/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/aklog/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/aklog/NTMakefile b/src/WINNT/aklog/NTMakefile deleted file mode 100644 index 20d12cfb9..000000000 --- a/src/WINNT/aklog/NTMakefile +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2004, OpenAFS.ORG and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# include the primary makefile -RELDIR=WINNT\aklog -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# -# BUILD TARGETS -# - -EXEFILE = $(DESTDIR)\root.client\usr\vice\etc\aklog.exe - -EXEOBJS = \ - $(OUT)\aklog.obj \ - $(OUT)\linked_list.obj - -EXELIBS = \ - $(DESTDIR)\lib\afs\afspioctl.lib \ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\afs\afskauth.lib - -OTHERLIBS = \ - ..\kfw\lib\i386\krbv4w32.lib \ - ..\kfw\lib\i386\krb5_32.lib \ - dnsapi.lib mpr.lib - -afscflags = -I..\kfw\inc\krb5 -I..\kfw\inc\krb4 $(afscflags) - -$(EXEOBJS): $$(@B).c - $(C2OBJ) $** - -############################################################################ - -$(EXEFILE) : $(EXEOBJS) $(EXELIBS) $(OUT)\aklog.res - $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) - $(EXEPREP) - -install : $(COPYHEADERS) $(EXEFILE) - -############################################################################ -# -# Dependencies -# - -$(OUT)\aklog.res : aklog.rc AFS_component_version_number.h - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/aklog/aklog.c b/src/WINNT/aklog/aklog.c deleted file mode 100644 index 8af991deb..000000000 --- a/src/WINNT/aklog/aklog.c +++ /dev/null @@ -1,1272 +0,0 @@ -/* - * Copyright (C) 1989,2004 by the Massachusetts Institute of Technology - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -#include - -#include -#include -#include -#include -#include - -#define stat _stat -#define lstat stat -#define __S_ISTYPE(mode, mask) (((mode) & _S_IFMT) == (mask)) -#define S_ISDIR(mode) __S_ISTYPE((mode), _S_IFDIR) - -#define DONT_HAVE_GET_AD_TKT -#define MAXSYMLINKS 255 - -/* Win32 uses get_krb_err_txt_entry(status) instead of krb_err_txt[status], -* so we use a bit of indirection like the GNU CVS sources. -*/ -#define krb_err_text(status) get_krb_err_txt_entry(status) - -#define DRIVECOLON ':' /* Drive letter separator */ -#define BDIR '\\' /* Other character that divides directories */ - -static int -readlink(char *path, char *buf, int buffers) -{ - return -1; -} - -char * getcwd(char*, size_t); - -static long -get_cellconfig_callback(void *cellconfig, struct sockaddr_in *addrp, char *namep) -{ - struct afsconf_cell *cc = (struct afsconf_cell *) cellconfig; - - cc->hostAddr[cc->numServers] = *addrp; - strcpy(cc->hostName[cc->numServers], namep); - cc->numServers++; - return 0; -} - -#else /* WIN32 */ -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#define krb_err_text(status) krb_err_txt[status] - -/* Cheesy test for determining AFS 3.5. */ -#ifndef AFSCONF_CLIENTNAME -#define AFS35 -#endif - -#ifdef AFS35 -#include -#else -#define AFSDIR_CLIENT_ETC_DIRPATH AFSCONF_CLIENTNAME -#endif - -#endif /* WIN32 */ - -#include "linked_list.h" - -#define AFSKEY "afs" -#define AFSINST "" - -#define AKLOG_SUCCESS 0 -#define AKLOG_USAGE 1 -#define AKLOG_SOMETHINGSWRONG 2 -#define AKLOG_AFS 3 -#define AKLOG_KERBEROS 4 -#define AKLOG_TOKEN 5 -#define AKLOG_BADPATH 6 -#define AKLOG_MISC 7 - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef MAXSYMLINKS -#define MAXSYMLINKS 15 -#endif - -#define DIR '/' /* Character that divides directories */ -#define DIRSTRING "/" /* String form of above */ -#define VOLMARKER ':' /* Character separating cellname from mntpt */ -#define VOLMARKERSTRING ":" /* String form of above */ - -typedef struct { - char cell[BUFSIZ]; - char realm[REALM_SZ]; -} cellinfo_t; - - -struct afsconf_cell ak_cellconfig; /* General information about the cell */ - -static char *progname = NULL; /* Name of this program */ -static int dflag = FALSE; /* Give debugging information */ -static int noprdb = FALSE; /* Skip resolving name to id? */ -static int force = FALSE; /* Bash identical tokens? */ -static linked_list authedcells; /* List of cells already logged to */ - -static int usev5 = TRUE; /* use kerberos 5? */ -static int use524 = FALSE; /* use krb524? */ -static krb5_ccache _krb425_ccache; - -long GetLocalCell(struct afsconf_dir **pconfigdir, char *local_cell) -{ - if (!(*pconfigdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH))) - { - fprintf(stderr, "%s: can't get afs configuration (afsconf_Open(%s))\n", - progname, AFSDIR_CLIENT_ETC_DIRPATH); - exit(AKLOG_AFS); - } - - return afsconf_GetLocalCell(*pconfigdir, local_cell, MAXCELLCHARS); -} - -long GetCellInfo(struct afsconf_dir **pconfigdir, char* cell, -struct afsconf_cell **pcellconfig) -{ - return afsconf_GetCellInfo(*pconfigdir, cell, NULL, *pcellconfig); -} - -void CloseConf(struct afsconf_dir **pconfigdir) -{ - (void) afsconf_Close(*pconfigdir); -} - -#define ALLOW_REGISTER 1 -void ViceIDToUsername(char *username, char *realm_of_user, char *realm_of_cell, - char * cell_to_use, CREDENTIALS *c, - int *status, - struct ktc_principal *aclient, struct ktc_principal *aserver, struct ktc_token *atoken) -{ - static char lastcell[MAXCELLCHARS+1] = { 0 }; - static char confname[512] = { 0 }; - long viceId; /* AFS uid of user */ -#ifdef ALLOW_REGISTER - afs_int32 id; -#endif /* ALLOW_REGISTER */ - - if (confname[0] == '\0') { - strncpy(confname, AFSDIR_CLIENT_ETC_DIRPATH, sizeof(confname)); - confname[sizeof(confname) - 2] = '\0'; - } - - if (dflag) - printf("About to resolve name %s to id\n", username); - - /* - * Talk about DUMB! It turns out that there is a bug in - * pr_Initialize -- even if you give a different cell name - * to it, it still uses a connection to a previous AFS server - * if one exists. The way to fix this is to change the - * _filename_ argument to pr_Initialize - that forces it to - * re-initialize the connection. We do this by adding and - * removing a "/" on the end of the configuration directory name. - */ - - if (lastcell[0] != '\0' && (strcmp(lastcell, aserver->cell) != 0)) { - int i = strlen(confname); - if (confname[i - 1] == '/') { - confname[i - 1] = '\0'; - } else { - confname[i] = '/'; - confname[i + 1] = '\0'; - } - } - - strcpy(lastcell, aserver->cell); - - if (!pr_Initialize (0, confname, aserver->cell)) - *status = pr_SNameToId (username, &viceId); - - if (dflag) - { - if (*status) - printf("Error %d\n", *status); - else - printf("Id %d\n", viceId); - } - - /* - * This is a crock, but it is Transarc's crock, so - * we have to play along in order to get the - * functionality. The way the afs id is stored is - * as a string in the username field of the token. - * Contrary to what you may think by looking at - * the code for tokens, this hack (AFS ID %d) will - * not work if you change %d to something else. - */ - - /* - * This code is taken from cklog -- it lets people - * automatically register with the ptserver in foreign cells - */ - -#ifdef ALLOW_REGISTER - if (*status == 0) { - if (viceId != ANONYMOUSID) { -#else /* ALLOW_REGISTER */ - if ((*status == 0) && (viceId != ANONYMOUSID)) -#endif /* ALLOW_REGISTER */ - { -#ifdef AFS_ID_TO_NAME - strncpy(username_copy, username, BUFSIZ); - snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId); -#endif /* AFS_ID_TO_NAME */ - } -#ifdef ALLOW_REGISTER - } else if (strcmp(realm_of_user, realm_of_cell) != 0) { - if (dflag) { - printf("doing first-time registration of %s " - "at %s\n", username, cell_to_use); - } - id = 0; - strncpy(aclient->name, username, MAXKTCNAMELEN - 1); - strcpy(aclient->instance, ""); - strncpy(aclient->cell, c->realm, MAXKTCREALMLEN - 1); - if ((*status = ktc_SetToken(aserver, atoken, aclient, 0))) { - printf("%s: unable to obtain tokens for cell %s " - "(status: %d).\n", progname, cell_to_use, status); - *status = AKLOG_TOKEN; - return ; - } - - /* - * In case you're wondering, we don't need to change the - * filename here because we're still connecting to the - * same cell -- we're just using a different authentication - * level - */ - - if ((*status = pr_Initialize(1L, confname, aserver->cell))) { - printf("Error %d\n", status); - return; - } - - if ((*status = pr_CreateUser(username, &id))) { - printf("%s: unable to create remote PTS " - "user %s in cell %s (status: %d).\n", progname, - username, cell_to_use, *status); - } else { - printf("created cross-cell entry for %s at %s\n", - username, cell_to_use); -#ifdef AFS_ID_TO_NAME - strncpy(username_copy, username, BUFSIZ); - snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId); -#endif /* AFS_ID_TO_NAME */ - } - } - } -#endif /* ALLOW_REGISTER */ -} - -char *LastComponent(char *str) -{ - char *ret = strrchr(str, DIR); - -#ifdef WIN32 - if (!ret) - ret = strrchr(str, BDIR); -#endif - return ret; -} - -int FirstComponent(char *str) -{ - return (int)( -#ifdef WIN32 - strchr(str, BDIR) || -#endif - strchr(str, DIR)); -} - -void CopyPathColon(char *origpath, char *path, char *pathtocheck) -{ -#ifdef WIN32 - if (origpath[1] == DRIVECOLON) - { - strncpy(pathtocheck, origpath, 2); - strcpy(path, origpath+2); - } - else -#endif - strcpy(path, origpath); -} - -int BeginsWithDir(char *str, int colon) -{ - return (str[0] == DIR) || -#ifdef WIN32 - ((str[0] == BDIR) || (colon && str[1] == DRIVECOLON)); -#else - FALSE; -#endif -} - - -/* This is a pretty gross hack. Linking against the Transarc -* libraries pulls in some rxkad functions which use des. (I don't -* think they ever get called.) With Transarc-supplied libraries this -* creates a reliance on the symbol des_pcbc_init() which is only in -* Transarc's DES libraries (it's an exportability symbol-hiding -* thing), which we don't want to use because they don't work with -* MIT's krb4 routines. So export a des_pcbc_init() symbol here so we -* don't have to link against Transarc's des library. -*/ -int des_pcbc_init() -{ - abort(); -} - -static int get_cred(char *name, char *inst, char *realm, CREDENTIALS *c) -{ - int status; - - status = krb_get_cred(name, inst, realm, c); - if (status != KSUCCESS) - { -#ifdef DONT_HAVE_GET_AD_TKT - KTEXT_ST ticket; - status = krb_mk_req(&ticket, name, inst, realm, 0); -#else - status = get_ad_tkt(name, inst, realm, 255); -#endif - if (status == KSUCCESS) - status = krb_get_cred(name, inst, realm, c); - } - - return (status); -} - -static int get_v5cred(krb5_context context, - char *name, char *inst, char *realm, CREDENTIALS *c, - krb5_creds **creds) -{ - krb5_creds increds; - krb5_error_code r; - static krb5_principal client_principal = 0; - - memset((char *)&increds, 0, sizeof(increds)); - - if ((r = krb5_build_principal(context, &increds.server, - strlen(realm), realm, - name, - (inst && strlen(inst)) ? inst : 0, - 0))) { - return((int)r); - } - - if (!_krb425_ccache) - krb5_cc_default(context, &_krb425_ccache); - if (!client_principal) - krb5_cc_get_principal(context, _krb425_ccache, &client_principal); - - increds.client = client_principal; - increds.times.endtime = 0; - /* Ask for DES since that is what V4 understands */ - increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC; - - r = krb5_get_credentials(context, 0, _krb425_ccache, &increds, creds); - if (r) - return((int)r); - - /* This requires krb524d to be running with the KDC */ - if (c != NULL) - r = krb5_524_convert_creds(context, *creds, c); - return((int)r); -} - -/* There is no header for this function. It is supposed to be private */ -int krb_get_admhst(char *h,char *r, int n); - -static char *afs_realm_of_cell(struct afsconf_cell *cellconfig) -{ - char krbhst[MAX_HSTNM]; - static char krbrlm[REALM_SZ+1]; - - if (!cellconfig) - return 0; - - strcpy(krbrlm, (char *) krb_realmofhost(cellconfig->hostName[0])); - - if (krb_get_admhst(krbhst, krbrlm, 1) != KSUCCESS) - { - char *s = krbrlm; - char *t = cellconfig->name; - int c; - - while (c = *t++) - { - if (islower(c)) - c = toupper(c); - *s++ = c; - } - *s++ = 0; - } - return krbrlm; -} - -static char *afs_realm_of_cell5(krb5_context context, struct afsconf_cell *cellconfig) -{ - char ** krbrlms = 0; - static char krbrlm[REALM_SZ+1]; - krb5_error_code status; - - if (!cellconfig) - return 0; - - status = krb5_get_host_realm( context, cellconfig->hostName[0], &krbrlms ); - - if (status == 0 && krbrlms && krbrlms[0]) { - strcpy(krbrlm, krbrlms[0]); - } else { - strcpy(krbrlm, cellconfig->name); - strupr(krbrlm); - } - - if (krbrlms) - krb5_free_host_realm( context, krbrlms ); - - return krbrlm; -} - -static char *copy_cellinfo(cellinfo_t *cellinfo) -{ - cellinfo_t *new_cellinfo; - - if (new_cellinfo = (cellinfo_t *)malloc(sizeof(cellinfo_t))) - memcpy(new_cellinfo, cellinfo, sizeof(cellinfo_t)); - - return ((char *)new_cellinfo); -} - - -static char *copy_string(char *string) -{ - char *new_string; - - if (new_string = (char *)calloc(strlen(string) + 1, sizeof(char))) - (void) strcpy(new_string, string); - - return (new_string); -} - - -static int get_cellconfig(char *cell, struct afsconf_cell *cellconfig, - char *local_cell) -{ - int status = AKLOG_SUCCESS; - struct afsconf_dir *configdir = 0; - - memset(local_cell, 0, sizeof(local_cell)); - memset(cellconfig, 0, sizeof(*cellconfig)); - - if (GetLocalCell(&configdir, local_cell)) - { - fprintf(stderr, "%s: can't determine local cell.\n", progname); - exit(AKLOG_AFS); - } - - if ((cell == NULL) || (cell[0] == 0)) - cell = local_cell; - - if (GetCellInfo(&configdir, cell, &cellconfig)) - { - fprintf(stderr, "%s: Can't get information about cell %s.\n", - progname, cell); - status = AKLOG_AFS; - } - - - CloseConf(&configdir); - - return(status); -} - -static int get_v5_user_realm(krb5_context context,char *realm) -{ - static krb5_principal client_principal = 0; - int i; - - if (!_krb425_ccache) - krb5_cc_default(context, &_krb425_ccache); - if (!client_principal) - krb5_cc_get_principal(context, _krb425_ccache, &client_principal); - - i = krb5_princ_realm(context, client_principal)->length; - if (i < REALM_SZ-1) i = REALM_SZ-1; - strncpy(realm,krb5_princ_realm(context, client_principal)->data,i); - realm[i] = 0; - return(KSUCCESS); -} - -/* -* Log to a cell. If the cell has already been logged to, return without -* doing anything. Otherwise, log to it and mark that it has been logged -* to. */ -static int auth_to_cell(krb5_context context, char *cell, char *realm) -{ - int status = AKLOG_SUCCESS; - char username[BUFSIZ]; /* To hold client username structure */ - - char name[ANAME_SZ]; /* Name of afs key */ - char instance[INST_SZ]; /* Instance of afs key */ - char realm_of_user[REALM_SZ]; /* Kerberos realm of user */ - char realm_of_cell[REALM_SZ]; /* Kerberos realm of cell */ - char local_cell[MAXCELLCHARS+1]; - char cell_to_use[MAXCELLCHARS+1]; /* Cell to authenticate to */ - - krb5_creds *v5cred = NULL; - CREDENTIALS c; - struct ktc_principal aserver; - struct ktc_principal aclient; - struct ktc_token atoken, btoken; - - - /* try to avoid an expensive call to get_cellconfig */ - if (cell && ll_string_check(&authedcells, cell)) - { - if (dflag) - printf("Already authenticated to %s (or tried to)\n", cell); - return(AKLOG_SUCCESS); - } - - memset(name, 0, sizeof(name)); - memset(instance, 0, sizeof(instance)); - memset(realm_of_user, 0, sizeof(realm_of_user)); - memset(realm_of_cell, 0, sizeof(realm_of_cell)); - - /* NULL or empty cell returns information on local cell */ - if (status = get_cellconfig(cell, &ak_cellconfig, local_cell)) - return(status); - - strncpy(cell_to_use, ak_cellconfig.name, MAXCELLCHARS); - cell_to_use[MAXCELLCHARS] = 0; - - if (ll_string_check(&authedcells, cell_to_use)) - { - if (dflag) - printf("Already authenticated to %s (or tried to)\n", cell_to_use); - return(AKLOG_SUCCESS); - } - - /* - * Record that we have attempted to log to this cell. We do this - * before we try rather than after so that we will not try - * and fail repeatedly for one cell. - */ - (void)ll_add_string(&authedcells, cell_to_use); - - if (dflag) - printf("Authenticating to cell %s.\n", cell_to_use); - - if (realm && realm[0]) - strcpy(realm_of_cell, realm); - else - strcpy(realm_of_cell, - (usev5)? - afs_realm_of_cell5(context, &ak_cellconfig) : - afs_realm_of_cell(&ak_cellconfig)); - - /* We use the afs. convention here... */ - strcpy(name, AFSKEY); - strncpy(instance, cell_to_use, sizeof(instance)); - instance[sizeof(instance)-1] = '\0'; - - /* - * Extract the session key from the ticket file and hand-frob an - * afs style authenticator. - */ - - if (usev5) - { /* using krb5 */ - int retry = 1; - - if ( strchr(name,'.') != NULL ) { - fprintf(stderr, "%s: Can't support principal names including a dot.\n", - progname); - return(AKLOG_MISC); - } - - try_v5: - if (dflag) - printf("Getting v5 tickets: %s/%s@%s\n", name, instance, realm_of_cell); - status = get_v5cred(context, name, instance, realm_of_cell, - use524 ? &c : NULL, &v5cred); - if (status == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN) { - if (dflag) - printf("Getting v5 tickets: %s@%s\n", name, realm_of_cell); - status = get_v5cred(context, name, "", realm_of_cell, - use524 ? &c : NULL, &v5cred); - } - if ( status == KRB5KRB_AP_ERR_MSG_TYPE && retry ) { - retry = 0; - goto try_v5; - } - } - else - { - /* - * Try to obtain AFS tickets. Because there are two valid service - * names, we will try both, but trying the more specific first. - * - * afs.@ - * afs@ - */ - if (dflag) - printf("Getting tickets: %s.%s@%s\n", name, instance, realm_of_cell); - status = get_cred(name, instance, realm_of_cell, &c); - if (status == KDC_PR_UNKNOWN) - { - if (dflag) - printf("Getting tickets: %s@%s\n", name, realm_of_cell); - status = get_cred(name, "", realm_of_cell, &c); - } - } - - /* TODO: get k5 error text */ - if (status != KSUCCESS) - { - if (dflag) - printf("Kerberos error code returned by get_cred: %d\n", status); - fprintf(stderr, "%s: Couldn't get %s AFS tickets: %s\n", - progname, cell_to_use, - (usev5)?"": - krb_err_text(status)); - return(AKLOG_KERBEROS); - } - - strncpy(aserver.name, AFSKEY, MAXKTCNAMELEN - 1); - strncpy(aserver.instance, AFSINST, MAXKTCNAMELEN - 1); - strncpy(aserver.cell, cell_to_use, MAXKTCREALMLEN - 1); - - if (usev5 && !use524) { - /* This code inserts the entire K5 ticket into the token - * No need to perform a krb524 translation which is - * commented out in the code below - */ - char * p; - int len; - - len = min(v5cred->client->data[0].length,MAXKTCNAMELEN - 1); - strncpy(username, v5cred->client->data[0].data, len); - username[len] = '\0'; - - if ( v5cred->client->length > 1 ) { - strcat(username, "."); - p = username + strlen(username); - len = min(v5cred->client->data[1].length,MAXKTCNAMELEN - strlen(username) - 1); - strncpy(p, v5cred->client->data[1].data, len); - p[len] = '\0'; - } - - memset(&atoken, '\0', sizeof(atoken)); - atoken.kvno = RXKAD_TKT_TYPE_KERBEROS_V5; - atoken.startTime = v5cred->times.starttime; - atoken.endTime = v5cred->times.endtime; - memcpy(&atoken.sessionKey, v5cred->keyblock.contents, v5cred->keyblock.length); - atoken.ticketLen = v5cred->ticket.length; - memcpy(atoken.ticket, v5cred->ticket.data, atoken.ticketLen); - } else { - strcpy (username, c.pname); - if (c.pinst[0]) - { - strcat(username, "."); - strcat(username, c.pinst); - } - - atoken.kvno = c.kvno; - atoken.startTime = c.issue_date; - /* ticket lifetime is in five-minutes blocks. */ - atoken.endTime = c.issue_date + ((unsigned char)c.lifetime * 5 * 60); - - memcpy(&atoken.sessionKey, c.session, 8); - atoken.ticketLen = c.ticket_st.length; - memcpy(atoken.ticket, c.ticket_st.dat, atoken.ticketLen); - } - - if (!force && - !ktc_GetToken(&aserver, &btoken, sizeof(btoken), &aclient) && - atoken.kvno == btoken.kvno && - atoken.ticketLen == btoken.ticketLen && - !memcmp(&atoken.sessionKey, &btoken.sessionKey, sizeof(atoken.sessionKey)) && - !memcmp(atoken.ticket, btoken.ticket, atoken.ticketLen)) - { - if (dflag) - printf("Identical tokens already exist; skipping.\n"); - return 0; - } - - if (noprdb) - { - if (dflag) - printf("Not resolving name %s to id (-noprdb set)\n", username); - } - else - { - if (usev5) { - if((status = get_v5_user_realm(context, realm_of_user)) != KSUCCESS) { - fprintf(stderr, "%s: Couldn't determine realm of user: %d\n", - progname, status); - return(AKLOG_KERBEROS); - } - } else { - if ((status = krb_get_tf_realm(TKT_FILE, realm_of_user)) != KSUCCESS) - { - fprintf(stderr, "%s: Couldn't determine realm of user: %s)", - progname, krb_err_text(status)); - return(AKLOG_KERBEROS); - } - } - - if (strcmp(realm_of_user, realm_of_cell)) - { - strcat(username, "@"); - strcat(username, realm_of_user); - } - - ViceIDToUsername(username, realm_of_user, realm_of_cell, cell_to_use, &c, &status, &aclient, &aserver, &atoken); - } - - if (dflag) - printf("Set username to %s\n", username); - - /* Reset the "aclient" structure before we call ktc_SetToken. - * This structure was first set by the ktc_GetToken call when - * we were comparing whether identical tokens already existed. - */ - strncpy(aclient.name, username, MAXKTCNAMELEN - 1); - strcpy(aclient.instance, ""); - - if (usev5 && !use524) { - int len = min(v5cred->client->realm.length,MAXKTCNAMELEN - 1); - strncpy(aclient.cell, v5cred->client->realm.data, len); - aclient.cell[len] = '\0'; - } else - strncpy(aclient.cell, c.realm, MAXKTCREALMLEN - 1); - - if (dflag) - printf("Getting tokens.\n"); - if (status = ktc_SetToken(&aserver, &atoken, &aclient, 0)) - { - fprintf(stderr, - "%s: unable to obtain tokens for cell %s (status: %d).\n", - progname, cell_to_use, status); - status = AKLOG_TOKEN; - } - - return(status); -} - -static int get_afs_mountpoint(char *file, char *mountpoint, int size) -{ - char our_file[MAXPATHLEN + 1]; - char *parent_dir; - char *last_component; - struct ViceIoctl vio; - char cellname[BUFSIZ]; - - memset(our_file, 0, sizeof(our_file)); - strcpy(our_file, file); - - if (last_component = LastComponent(our_file)) - { - *last_component++ = 0; - parent_dir = our_file; - } - else - { - last_component = our_file; - parent_dir = "."; - } - - memset(cellname, 0, sizeof(cellname)); - - vio.in = last_component; - vio.in_size = strlen(last_component)+1; - vio.out_size = size; - vio.out = mountpoint; - - if (!pioctl(parent_dir, VIOC_AFS_STAT_MT_PT, &vio, 0)) - { - if (strchr(mountpoint, VOLMARKER) == NULL) - { - vio.in = file; - vio.in_size = strlen(file) + 1; - vio.out_size = sizeof(cellname); - vio.out = cellname; - - if (!pioctl(file, VIOC_FILE_CELL_NAME, &vio, 1)) - { - strcat(cellname, VOLMARKERSTRING); - strcat(cellname, mountpoint + 1); - memset(mountpoint + 1, 0, size - 1); - strcpy(mountpoint + 1, cellname); - } - } - return(TRUE); - } - else { - return(FALSE); - } -} - -/* -* This routine each time it is called returns the next directory -* down a pathname. It resolves all symbolic links. The first time -* it is called, it should be called with the name of the path -* to be descended. After that, it should be called with the arguemnt -* NULL. -*/ -static char *next_path(char *origpath) -{ - static char path[MAXPATHLEN + 1]; - static char pathtocheck[MAXPATHLEN + 1]; - - int link = FALSE; /* Is this a symbolic link? */ - char linkbuf[MAXPATHLEN + 1]; - char tmpbuf[MAXPATHLEN + 1]; - - static char *last_comp; /* last component of directory name */ - static char *elast_comp; /* End of last component */ - char *t; - int len; - - static int symlinkcount = 0; /* We can't exceed MAXSYMLINKS */ - - /* If we are given something for origpath, we are initializing only. */ - if (origpath) - { - memset(path, 0, sizeof(path)); - memset(pathtocheck, 0, sizeof(pathtocheck)); - CopyPathColon(origpath, path, pathtocheck); - last_comp = path; - symlinkcount = 0; - return(NULL); - } - - /* We were not given origpath; find then next path to check */ - - /* If we've gotten all the way through already, return NULL */ - if (last_comp == NULL) - return(NULL); - - do - { - while (BeginsWithDir(last_comp, FALSE)) - strncat(pathtocheck, last_comp++, 1); - len = (elast_comp = LastComponent(last_comp)) - ? elast_comp - last_comp : strlen(last_comp); - strncat(pathtocheck, last_comp, len); - memset(linkbuf, 0, sizeof(linkbuf)); - if (link = (readlink(pathtocheck, linkbuf, sizeof(linkbuf)) > 0)) - { - if (++symlinkcount > MAXSYMLINKS) - { - fprintf(stderr, "%s: %s\n", progname, strerror(ELOOP)); - exit(AKLOG_BADPATH); - } - memset(tmpbuf, 0, sizeof(tmpbuf)); - if (elast_comp) - strcpy(tmpbuf, elast_comp); - if (BeginsWithDir(linkbuf, FALSE)) - { - /* - * If this is a symbolic link to an absolute path, - * replace what we have by the absolute path. - */ - memset(path, 0, strlen(path)); - memcpy(path, linkbuf, sizeof(linkbuf)); - strcat(path, tmpbuf); - last_comp = path; - elast_comp = NULL; - memset(pathtocheck, 0, sizeof(pathtocheck)); - } - else - { - /* - * If this is a symbolic link to a relative path, - * replace only the last component with the link name. - */ - strncpy(last_comp, linkbuf, strlen(linkbuf) + 1); - strcat(path, tmpbuf); - elast_comp = NULL; - if (t = LastComponent(pathtocheck)) - { - t++; - memset(t, 0, strlen(t)); - } - else - memset(pathtocheck, 0, sizeof(pathtocheck)); - } - } - else - last_comp = elast_comp; - } - while(link); - - return(pathtocheck); -} - -/* -* This routine descends through a path to a directory, logging to -* every cell it encounters along the way. -*/ -static int auth_to_path(krb5_context context, char *path) -{ - int status = AKLOG_SUCCESS; - int auth_to_cell_status = AKLOG_SUCCESS; - - char *nextpath; - char pathtocheck[MAXPATHLEN + 1]; - char mountpoint[MAXPATHLEN + 1]; - - char *cell; - char *endofcell; - - /* Initialize */ - if (BeginsWithDir(path, TRUE)) - strcpy(pathtocheck, path); - else - { - if (getcwd(pathtocheck, sizeof(pathtocheck)) == NULL) - { - fprintf(stderr, "Unable to find current working directory:\n"); - fprintf(stderr, "%s\n", pathtocheck); - fprintf(stderr, "Try an absolute pathname.\n"); - exit(AKLOG_BADPATH); - } - else - { - /* in WIN32, if getcwd returns a root dir (eg: c:\), the returned string - * will already have a trailing slash ('\'). Otherwise, the string will - * end in the last directory name */ -#ifdef WIN32 - if(pathtocheck[strlen(pathtocheck) - 1] != BDIR) -#endif - strcat(pathtocheck, DIRSTRING); - strcat(pathtocheck, path); - } - } - next_path(pathtocheck); - - /* Go on to the next level down the path */ - while (nextpath = next_path(NULL)) - { - strcpy(pathtocheck, nextpath); - if (dflag) - printf("Checking directory [%s]\n", pathtocheck); - /* - * If this is an afs mountpoint, determine what cell from - * the mountpoint name which is of the form - * #cellname:volumename or %cellname:volumename. - */ - if (get_afs_mountpoint(pathtocheck, mountpoint, sizeof(mountpoint))) - { - if(dflag) - printf("Found mount point [%s]\n", mountpoint); - /* skip over the '#' or '%' */ - cell = mountpoint + 1; - if (endofcell = strchr(mountpoint, VOLMARKER)) - { - *endofcell = '\0'; - if (auth_to_cell_status = auth_to_cell(context, cell, NULL)) - { - if (status == AKLOG_SUCCESS) - status = auth_to_cell_status; - else if (status != auth_to_cell_status) - status = AKLOG_SOMETHINGSWRONG; - } - } - } - else - { - struct stat st; - - if (lstat(pathtocheck, &st) < 0) - { - /* - * If we've logged and still can't stat, there's - * a problem... - */ - fprintf(stderr, "%s: stat(%s): %s\n", progname, - pathtocheck, strerror(errno)); - return(AKLOG_BADPATH); - } - else if (!S_ISDIR(st.st_mode)) - { - /* Allow only directories */ - fprintf(stderr, "%s: %s: %s\n", progname, pathtocheck, - strerror(ENOTDIR)); - return(AKLOG_BADPATH); - } - } - } - - return(status); -} - -/* Print usage message and exit */ -static void usage(void) -{ - fprintf(stderr, "\nUsage: %s %s%s%s%s\n", progname, - "[-d] [[-cell | -c] cell [-k krb_realm]] ", - "[[-p | -path] pathname]\n", - " [-noprdb] [-force]\n", - " [-5 [-m]| -4]\n" - ); - fprintf(stderr, " -d gives debugging information.\n"); - fprintf(stderr, " krb_realm is the kerberos realm of a cell.\n"); - fprintf(stderr, " pathname is the name of a directory to which "); - fprintf(stderr, "you wish to authenticate.\n"); - fprintf(stderr, " -noprdb means don't try to determine AFS ID.\n"); - fprintf(stderr, " -5 or -4 selects whether to use Kerberos V or Kerberos IV.\n" - " (default is Kerberos V)\n"); - fprintf(stderr, " -m means use krb524d to convert Kerberos V tickets.\n"); - fprintf(stderr, " No commandline arguments means "); - fprintf(stderr, "authenticate to the local cell.\n"); - fprintf(stderr, "\n"); - exit(AKLOG_USAGE); -} - -int main(int argc, char *argv[]) -{ - int status = AKLOG_SUCCESS; - int i; - int somethingswrong = FALSE; - - cellinfo_t cellinfo; - - extern char *progname; /* Name of this program */ - - extern int dflag; /* Debug mode */ - - int cmode = FALSE; /* Cellname mode */ - int pmode = FALSE; /* Path name mode */ - - char realm[REALM_SZ]; /* Kerberos realm of afs server */ - char cell[BUFSIZ]; /* Cell to which we are authenticating */ - char path[MAXPATHLEN + 1]; /* Path length for path mode */ - - linked_list cells; /* List of cells to log to */ - linked_list paths; /* List of paths to log to */ - ll_node *cur_node; - - krb5_context context = 0; - - memset(&cellinfo, 0, sizeof(cellinfo)); - - memset(realm, 0, sizeof(realm)); - memset(cell, 0, sizeof(cell)); - memset(path, 0, sizeof(path)); - - ll_init(&cells); - ll_init(&paths); - - /* Store the program name here for error messages */ - if (progname = LastComponent(argv[0])) - progname++; - else - progname = argv[0]; - - /* Initialize list of cells to which we have authenticated */ - (void)ll_init(&authedcells); - - /* Parse commandline arguments and make list of what to do. */ - for (i = 1; i < argc; i++) - { - if (strcmp(argv[i], "-d") == 0) - dflag++; - else if (strcmp(argv[i], "-5") == 0) - usev5++; - else if (strcmp(argv[i], "-m") == 0) - use524++; - else if (strcmp(argv[i], "-4") == 0) - usev5 = 0; - else if (strcmp(argv[i], "-noprdb") == 0) - noprdb++; - else if (strcmp(argv[i], "-force") == 0) - force++; - else if (((strcmp(argv[i], "-cell") == 0) || - (strcmp(argv[i], "-c") == 0)) && !pmode) - { - if (++i < argc) - { - cmode++; - strcpy(cell, argv[i]); - } - else - usage(); - } - else if (((strcmp(argv[i], "-path") == 0) || - (strcmp(argv[i], "-p") == 0)) && !cmode) - { - if (++i < argc) - { - pmode++; - strcpy(path, argv[i]); - } - else - usage(); - } - else if (argv[i][0] == '-') - usage(); - else if (!pmode && !cmode) - { - if (FirstComponent(argv[i]) || (strcmp(argv[i], ".") == 0) || - (strcmp(argv[i], "..") == 0)) - { - pmode++; - strcpy(path, argv[i]); - } - else - { - cmode++; - strcpy(cell, argv[i]); - } - } - else - usage(); - - if (cmode) - { - if (((i + 1) < argc) && (strcmp(argv[i + 1], "-k") == 0)) - { - i += 2; - if (i < argc) - strcpy(realm, argv[i]); - else - usage(); - } - /* Add this cell to list of cells */ - strcpy(cellinfo.cell, cell); - strcpy(cellinfo.realm, realm); - if (cur_node = ll_add_node(&cells, ll_tail)) - { - char *new_cellinfo; - if (new_cellinfo = copy_cellinfo(&cellinfo)) - ll_add_data(cur_node, new_cellinfo); - else - { - fprintf(stderr, "%s: failure copying cellinfo.\n", progname); - exit(AKLOG_MISC); - } - } - else - { - fprintf(stderr, "%s: failure adding cell to cells list.\n", - progname); - exit(AKLOG_MISC); - } - memset(&cellinfo, 0, sizeof(cellinfo)); - cmode = FALSE; - memset(cell, 0, sizeof(cell)); - memset(realm, 0, sizeof(realm)); - } - else if (pmode) - { - /* Add this path to list of paths */ - if (cur_node = ll_add_node(&paths, ll_tail)) - { - char *new_path; - if (new_path = copy_string(path)) - ll_add_data(cur_node, new_path); - else - { - fprintf(stderr, "%s: failure copying path name.\n", - progname); - exit(AKLOG_MISC); - } - } - else - { - fprintf(stderr, "%s: failure adding path to paths list.\n", - progname); - exit(AKLOG_MISC); - } - pmode = FALSE; - memset(path, 0, sizeof(path)); - } - } - - if(usev5) - krb5_init_context(&context); - - /* If nothing was given, log to the local cell. */ - if ((cells.nelements + paths.nelements) == 0) - status = auth_to_cell(context, NULL, NULL); - else - { - /* Log to all cells in the cells list first */ - for (cur_node = cells.first; cur_node; cur_node = cur_node->next) - { - memcpy(&cellinfo, cur_node->data, sizeof(cellinfo)); - if (status = auth_to_cell(context, - cellinfo.cell, cellinfo.realm)) - somethingswrong++; - } - - /* Then, log to all paths in the paths list */ - for (cur_node = paths.first; cur_node; cur_node = cur_node->next) - { - if (status = auth_to_path(context, - cur_node->data)) - somethingswrong++; - } - - /* - * If only one thing was logged to, we'll return the status - * of the single call. Otherwise, we'll return a generic - * something failed status. - */ - if (somethingswrong && ((cells.nelements + paths.nelements) > 1)) - status = AKLOG_SOMETHINGSWRONG; - } - - if(usev5) - krb5_free_context(context); - - exit(status); -} diff --git a/src/WINNT/aklog/aklog.h b/src/WINNT/aklog/aklog.h deleted file mode 100644 index 349991291..000000000 --- a/src/WINNT/aklog/aklog.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 1989,2004 by the Massachusetts Institute of Technology - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -#ifndef __AKLOG_H__ -#define __AKLOG_H__ - -#if !defined(lint) && !defined(SABER) -static char *rcsid_aklog_h = "$Id: aklog.h,v 1.1 2004/04/13 03:05:31 jaltman Exp $"; -#endif /* lint || SABER */ - -#ifndef WIN32 -#include -#endif - -#if !defined(vax) -#ifndef WIN32 -#include -#endif -#include -#include -#endif - -#ifndef WIN32 -#include -#endif -#include -#include "linked_list.h" - -#ifdef __STDC__ -#define ARGS(x) x -#else -#define ARGS(x) () -#endif /* __STDC__ */ - -#include - -typedef struct { - int (*readlink)ARGS((char *, char *, int)); - int (*isdir)ARGS((char *, unsigned char *)); - char *(*getcwd)ARGS((char *, size_t)); - int (*get_cred)ARGS((char *, char *, char *, CREDENTIALS *)); - int (*get_user_realm)ARGS((char *)); - void (*pstderr)ARGS((char *)); - void (*pstdout)ARGS((char *)); - void (*exitprog)ARGS((char)); -} aklog_params; - -void aklog ARGS((int, char *[], aklog_params *)); -void aklog_init_params ARGS((aklog_params *)); - -#endif /* __AKLOG_H__ */ diff --git a/src/WINNT/aklog/aklog.rc b/src/WINNT/aklog/aklog.rc deleted file mode 100644 index 720ed3b31..000000000 --- a/src/WINNT/aklog/aklog.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS File Server Command" -#define AFS_VERINFO_NAME "aklog" -#define AFS_VERINFO_FILENAME "aklog.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/aklog/linked_list.c b/src/WINNT/aklog/linked_list.c deleted file mode 100644 index 401834fe9..000000000 --- a/src/WINNT/aklog/linked_list.c +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright 1999, 1991, 1999 by the Massachusetts Institute of Technology. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -/* This file contains general linked list routines. */ - -static const char rcsid[] = "$Id: linked_list.c,v 1.1 2004/04/13 03:05:31 jaltman Exp $"; - -#include -#include -#include - -#include "linked_list.h" - -/* - * Requires: - * List must point to a linked list structure. It is not acceptable - * to pass a null pointer to this routine. - * Modifies: - * list - * Effects: - * Initializes the list to be one with no elements. If list is - * NULL, prints an error message and causes the program to crash. - */ -void ll_init(linked_list *list) -{ - if (list == NULL) - { - fprintf(stderr, "Error: calling ll_init with null pointer.\n"); - abort(); - } - - list->first = list->last = NULL; - list->nelements = 0; -} - -/* - * Modifies: - * list - * Effects: - * Adds a node to one end of the list (as specified by which_end) - * and returns a pointer to the node added. which_end is of type - * ll_end and should be either ll_head or ll_tail as specified in - * list.h. If there is not enough memory to allocate a node, - * the program returns NULL. - */ -ll_node *ll_add_node(linked_list *list, ll_end which_end) -{ - ll_node *node = NULL; - - node = malloc(sizeof(ll_node)); - if (node) - { - node->data = NULL; - if (list->nelements == 0) - { - list->first = node; - list->last = node; - list->nelements = 1; - node->prev = node->next = NULL; - } - else - { - switch (which_end) - { - case ll_head: - list->first->prev = node; - node->next = list->first; - list->first = node; - node->prev = NULL; - break; - case ll_tail: - list->last->next = node; - node->prev = list->last; - list->last = node; - node->next = NULL; - break; - default: - fprintf(stderr, "ll_add_node got a which_end parameter that " - "it can't handle.\n"); - abort(); - } - list->nelements++; - } - } - - return node; -} - - -/* - * Modifies: - * list - * Effects: - * If node is in list, deletes node and returns LL_SUCCESS. - * Otherwise, returns LL_FAILURE. If node contains other data, - * it is the responsibility of the caller to free it. Also, since - * this routine frees node, after the routine is called, "node" - * won't point to valid data. - */ -int ll_delete_node(linked_list *list, ll_node *node) -{ - ll_node *cur_node; - - for (cur_node = list->first; cur_node; cur_node = cur_node->next) - { - if (cur_node == node) - { - if (cur_node->prev) - cur_node->prev->next = cur_node->next; - else - list->first = cur_node->next; - - if (cur_node->next) - cur_node->next->prev = cur_node->prev; - else - list->last = cur_node->prev; - - free(cur_node); - list->nelements--; - return LL_SUCCESS; - } - } - - return LL_FAILURE; -} - -int ll_string_check(linked_list *list, char *string) -{ - ll_node *cur_node; - - /* Scan the list until we find the string in question */ - for (cur_node = list->first; cur_node; cur_node = cur_node->next) - { - if (strcmp(string, cur_node->data) == 0) - return 1; - } - return 0; -} - -/* This routine maintains a list of strings preventing duplication. */ -int ll_add_string(linked_list *list, char *string) -{ - ll_node *node; - char *new_string; - - if (!ll_string_check(list, string)) - { - node = ll_add_node(list, ll_tail); - if (node) - { - new_string = strdup(string); - if (new_string) - ll_add_data(node, new_string); - else - return LL_FAILURE; - } - else - return LL_FAILURE; - } - return LL_SUCCESS; -} diff --git a/src/WINNT/aklog/linked_list.h b/src/WINNT/aklog/linked_list.h deleted file mode 100644 index 15baa7b26..000000000 --- a/src/WINNT/aklog/linked_list.h +++ /dev/null @@ -1,49 +0,0 @@ -/* $Id: linked_list.h,v 1.1 2004/04/13 03:05:31 jaltman Exp $ */ - -/* Copyright 1990, 1991, 1999 by the Massachusetts Institute of - * Technology. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#ifndef AKLOG__LINKED_LIST_H -#define AKLOG__LINKED_LIST_H - -#define LL_SUCCESS 0 -#define LL_FAILURE -1 - -typedef struct _ll_node { - struct _ll_node *prev; - struct _ll_node *next; - void *data; -} ll_node; - -typedef struct { - ll_node *first; - ll_node *last; - int nelements; -} linked_list; - -typedef enum {ll_head, ll_tail} ll_end; - - -/* ll_add_data just assigns the data field of node to be d. */ -#define ll_add_data(n,d) (((n)->data)=(d)) - -void ll_init(linked_list *list); -ll_node *ll_add_node(linked_list *list, ll_end which_end); -int ll_delete_node(linked_list *list, ll_node *node); -int ll_string_check(linked_list *, char *); -int ll_add_string(linked_list *, char *); - -#endif /* AKLOG__LINKED_LIST_H */ diff --git a/src/WINNT/bosctlsvc/.cvsignore b/src/WINNT/bosctlsvc/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/bosctlsvc/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/bosctlsvc/NTMakefile b/src/WINNT/bosctlsvc/NTMakefile deleted file mode 100644 index 1d0197fa6..000000000 --- a/src/WINNT/bosctlsvc/NTMakefile +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -RELDIR=WINNT\bosctlsvc -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# Definitions for building a bosctlsvc.exe - -EXEFILE = $(DESTDIR)\root.server\usr\afs\bin\bosctlsvc.exe - -EXEOBJS =\ - $(OUT)\bosctlsvc.obj \ - $(OUT)\bosctlsvc.res - -EXELIBS =\ - $(DESTDIR)\lib\afs\afsutil.lib \ - $(DESTDIR)\lib\afs\afseventlog.lib \ - $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afsprocmgmt.lib \ - $(DESTDIR)\lib\afsicf.obj - -EXESDKLIBS=\ - ole32.lib \ - oleaut32.lib - -$(EXEFILE): $(EXEOBJS) $(EXELIBS) - $(EXECONLINK) $(EXESDKLIBS) - $(EXEPREP) - -############################################################################ -# Definitions for generating versioninfo resource via RC - -$(OUT)\bosctlsvc.res: AFS_component_version_number.h - - -############################################################################ -# Install target; primary makefile target - -install: $(LIBFILE) $(DLLFILE) $(EXEFILE) $(INCFILES) - - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - -mkdir: diff --git a/src/WINNT/bosctlsvc/bosctlsvc.c b/src/WINNT/bosctlsvc/bosctlsvc.c deleted file mode 100644 index 583dd5964..000000000 --- a/src/WINNT/bosctlsvc/bosctlsvc.c +++ /dev/null @@ -1,587 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* This file implements the AFS BOS control service. Basically, it provides - * a mechanism to start and stop the AFS bosserver via the NT SCM; it also - * supports bosserver restart. - */ - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -/* Define globals */ - -#define BOSSERVER_STARTMSG_EXE "afslegal.exe" - -#define BOSSERVER_RESTART_ARG_MAX 2 /* "-noauth", "-log" */ -#define BOSSERVER_WAIT_TIME_HINT 60 /* seconds */ -#define BOSSERVER_STOP_TIME_MAX (FSSDTIME + 60) /* seconds */ - -#define BOS_CONTROLS_ACCEPTED SERVICE_ACCEPT_STOP - -static CRITICAL_SECTION bosCtlStatusLock; /* protects bosCtlStatus */ -static SERVICE_STATUS bosCtlStatus; -static SERVICE_STATUS_HANDLE bosCtlStatusHandle; - -/* note: events arranged in priority order in case multiple signaled */ -#define BOS_STOP_EVENT 0 -#define BOS_EXIT_EVENT 1 -#define BOS_EVENT_COUNT 2 -static HANDLE bosCtlEvent[BOS_EVENT_COUNT]; - - -/* Declare local functions */ - -static void AsyncSignalCatcher(int signo); - -static void BosCtlStatusInit(DWORD initState); - -static DWORD BosCtlStatusUpdate(DWORD newState, - DWORD exitCode, - BOOL isWin32Code); - -static DWORD BosCtlStatusReport(void); - -static void WINAPI BosCtlHandler(DWORD controlCode); - -static void WINAPI BosCtlMain(DWORD argc, - LPTSTR *argv); - -static void BosserverDoStopEvent(pid_t cpid, - DWORD *stopStatus, - BOOL *isWin32Code); - -static void BosserverDoExitEvent(pid_t cpid, - BOOL *doWait, - BOOL *doRestart, - char **restartArgv, - DWORD *stopStatus, - BOOL *isWin32Code); - -static void BosserverRun(DWORD argc, - LPTSTR *argv, - DWORD *stopStatus, - BOOL *isWin32Code); - -static void BosserverStartupMsgDisplay(void); - - - - -/* - * AsyncSignalCatcher() -- Handle asynchronous signals sent to process - */ -static void -AsyncSignalCatcher(int signo) -{ - if (signo == SIGCHLD) { - (void) SetEvent(bosCtlEvent[BOS_EXIT_EVENT]); - } -} - - -/* - * BosCtlStatusInit() -- initialize BOS control service status structure - */ -static void -BosCtlStatusInit(DWORD initState) -{ - bosCtlStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - bosCtlStatus.dwCurrentState = initState; - - if (initState == SERVICE_RUNNING) { - bosCtlStatus.dwControlsAccepted = BOS_CONTROLS_ACCEPTED; - } else { - bosCtlStatus.dwControlsAccepted = 0; - } - - bosCtlStatus.dwWin32ExitCode = 0; - bosCtlStatus.dwServiceSpecificExitCode = 0; - bosCtlStatus.dwCheckPoint = 0; - bosCtlStatus.dwWaitHint = BOSSERVER_WAIT_TIME_HINT * 1000; /* millisecs */ - - InitializeCriticalSection(&bosCtlStatusLock); -} - - -/* - * BosCtlStatusUpdate() -- update BOS control service status and report to SCM - */ -static DWORD -BosCtlStatusUpdate(DWORD newState, DWORD exitCode, BOOL isWin32Code) -{ - DWORD rc = 0; - - EnterCriticalSection(&bosCtlStatusLock); - - /* SERVICE_STOPPED is a terminal state; never transition out of it */ - if (bosCtlStatus.dwCurrentState != SERVICE_STOPPED) { - - if ((bosCtlStatus.dwCurrentState == newState) && - (newState == SERVICE_START_PENDING || - newState == SERVICE_STOP_PENDING)) { - /* continuing a pending state; increment checkpoint value */ - bosCtlStatus.dwCheckPoint++; - } else { - /* not continuing a pending state; reset checkpoint value */ - bosCtlStatus.dwCheckPoint = 0; - } - - bosCtlStatus.dwCurrentState = newState; - - if (newState == SERVICE_RUNNING) { - bosCtlStatus.dwControlsAccepted = BOS_CONTROLS_ACCEPTED; - } else { - bosCtlStatus.dwControlsAccepted = 0; - } - - if (isWin32Code) { - bosCtlStatus.dwWin32ExitCode = exitCode; - bosCtlStatus.dwServiceSpecificExitCode = 0; - } else { - bosCtlStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - bosCtlStatus.dwServiceSpecificExitCode = exitCode; - } - } - - if (!SetServiceStatus(bosCtlStatusHandle, &bosCtlStatus)) { - rc = GetLastError(); - } - - LeaveCriticalSection(&bosCtlStatusLock); - - return rc; -} - - -/* - * BosCtlStatusReport() -- report current BOS control service status to SCM - */ -static DWORD -BosCtlStatusReport(void) -{ - DWORD rc = 0; - - EnterCriticalSection(&bosCtlStatusLock); - - if (!SetServiceStatus(bosCtlStatusHandle, &bosCtlStatus)) { - rc = GetLastError(); - } - - LeaveCriticalSection(&bosCtlStatusLock); - - return rc; -} - - -/* - * BosCtlHandler() -- control handler for BOS control service - */ -static void WINAPI -BosCtlHandler(DWORD controlCode) -{ - switch (controlCode) { - case SERVICE_CONTROL_STOP: - (void) SetEvent(bosCtlEvent[BOS_STOP_EVENT]); - (void) BosCtlStatusUpdate(SERVICE_STOP_PENDING, 0, TRUE); - break; - - default: - (void) BosCtlStatusReport(); - break; - } -} - - -/* - * BosCtlMain() -- main function for BOS control service - */ -static void WINAPI -BosCtlMain(DWORD argc, LPTSTR *argv) -{ - DWORD status; - BOOL isWin32Code; - struct sigaction childAction; - - /* Initialize status structure */ - BosCtlStatusInit(SERVICE_START_PENDING); - - /* Create events used by service control handler and signal handler */ - if ((bosCtlEvent[BOS_STOP_EVENT] = CreateEvent(NULL, - FALSE /* manual reset */, - FALSE /* initial state */, - TEXT("BosCtlSvc Stop Event"))) == NULL) { - status = GetLastError(); - } - - if ((bosCtlEvent[BOS_EXIT_EVENT] = CreateEvent(NULL, - FALSE /* manual reset */, - FALSE /* initial state */, - TEXT("BosCtlSvc Exit Event"))) == NULL) { - status = GetLastError(); - } - - /* Register service control handler */ - bosCtlStatusHandle = RegisterServiceCtrlHandler(AFSREG_SVR_SVC_NAME, - BosCtlHandler); - if (bosCtlStatusHandle == 0) { - /* failed to register control handler for service; can not continue */ - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_HANDLER_REG_FAILED, - (int)GetLastError(), NULL); - /* can not report status to SCM w/o a valid bosCtlStatusHandle */ - return; - } - - /* Stop immediately if required system resources could not be obtained */ - if (bosCtlEvent[BOS_STOP_EVENT] == NULL || - bosCtlEvent[BOS_EXIT_EVENT] == NULL) { - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_INSUFFICIENT_RESOURCES, - (int)status, NULL); - (void) BosCtlStatusUpdate(SERVICE_STOPPED, status, TRUE); - return; - } - - /* Report pending start status */ - if (status = BosCtlStatusUpdate(SERVICE_START_PENDING, 0, TRUE)) { - /* can't inform SCM of pending start; give up before really start */ - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_SCM_COMM_FAILED, - (int)status, NULL); - (void) BosCtlStatusUpdate(SERVICE_STOPPED, status, TRUE); - return; - } - - /* For XP SP2 and above, open required ports */ - icf_CheckAndAddAFSPorts(AFS_PORTSET_SERVER); - - /* Initialize the dirpath package so can access local bosserver binary */ - if (!(initAFSDirPath() & AFSDIR_SERVER_PATHS_OK)) { - /* sw install directory probably not in registry; can not continue */ - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_NO_INSTALL_DIR, 0, NULL); - (void) BosCtlStatusUpdate(SERVICE_STOPPED, 0, TRUE); - return; - } - - /* Install SIGCHLD handler to catch bosserver restarts and failures */ - childAction.sa_handler = AsyncSignalCatcher; - sigfillset(&childAction.sa_mask); - childAction.sa_flags = 0; - - if (sigaction(SIGCHLD, &childAction, NULL)) { - /* handler install should never fail, but can't continue if it does */ - status = errno; - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_INTERNAL_ERROR, - (int)status, NULL); - (void) BosCtlStatusUpdate(SERVICE_STOPPED, status, FALSE); - return; - } - - /* Run the AFS bosserver, handling stop and exit events */ - BosserverRun(argc, argv, &status, &isWin32Code); - - (void) BosCtlStatusUpdate(SERVICE_STOPPED, status, isWin32Code); -} - - -/* - * BosserverDoStopEvent() -- Handle a stop event for the AFS bosserver. - */ -static void -BosserverDoStopEvent(pid_t cpid, DWORD *stopStatus, BOOL *isWin32Code) -{ - (void) BosCtlStatusUpdate(SERVICE_STOP_PENDING, 0, TRUE); - - if (kill(cpid, SIGQUIT) == 0) { - /* bosserver has been told to stop; wait for this to happen */ - BOOL gotWaitStatus = FALSE; - time_t timeStart = time(NULL); - - do { - int waitStatus; - DWORD status; - - if (waitpid(cpid, &waitStatus, WNOHANG) == cpid) { - /* bosserver status available */ - if (WIFEXITED(waitStatus) && WEXITSTATUS(waitStatus) == 0) { - /* bosserver exited w/o any error */ - *stopStatus = 0; - *isWin32Code = TRUE; - } else { - *stopStatus = waitStatus; - *isWin32Code = FALSE; - } - gotWaitStatus = TRUE; - break; - } - - /* wait for bosserver status to become available; - * update BOS control service status periodically. - */ - status = WaitForSingleObject(bosCtlEvent[BOS_EXIT_EVENT], - BOSSERVER_WAIT_TIME_HINT * 1000 / 2); - if (status == WAIT_FAILED) { - /* failed to wait on event; should never happen */ - Sleep(2000); /* sleep to avoid tight loop if event problem */ - } - (void) BosCtlStatusUpdate(SERVICE_STOP_PENDING, 0, TRUE); - } while (difftime(time(NULL), timeStart) < BOSSERVER_STOP_TIME_MAX); - - if (!gotWaitStatus) { - /* timed out waiting to get bosserver status */ - *stopStatus = EBUSY; - *isWin32Code = FALSE; - - (void) ReportWarningEventAlt(AFSEVT_SVR_BCS_BOSSERVER_STOP_TIMEOUT, - (int)*stopStatus, NULL); - } - - } else { - /* can't tell bosserver to stop; should never happen */ - *stopStatus = errno; - *isWin32Code = FALSE; - - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_BOSSERVER_STOP_FAILED, - (int)*stopStatus, NULL); - } -} - - -/* - * BosserverDoExitEvent() -- Handle an exit event for the AFS bosserver. - * - * The output arguments for this function are set as follows: - * Case 1: bosserver did not exit (spurious SIGCHLD); - * *doWait is set to TRUE. - * Case 2: bosserver exited with restart code; - * *doRestart is set to TRUE, restartArgv[] is defined. - * Case 3: bosserver exited with non-restart code; - * *stopStatus and *isWin32Code are defined. - */ -static void -BosserverDoExitEvent(pid_t cpid, - BOOL *doWait, - BOOL *doRestart, - char **restartArgv, - DWORD *stopStatus, - BOOL *isWin32Code) -{ - int waitStatus; - - *doWait = FALSE; - *doRestart = FALSE; - - if (waitpid(cpid, &waitStatus, WNOHANG) == cpid) { - /* bosserver status available */ - - if (WIFEXITED(waitStatus)) { - /* bosserver exited normally; check for restart code */ - int exitCode = WEXITSTATUS(waitStatus); - - if (BOSEXIT_DORESTART(exitCode)) { - /* bosserver requests restart */ - int i; - *doRestart = TRUE; - - /* set up bosserver argument list */ - restartArgv[0] = (char *)AFSDIR_SERVER_BOSVR_FILEPATH; - i = 1; - - if (exitCode & BOSEXIT_NOAUTH_FLAG) { - /* pass "-noauth" to new bosserver */ - restartArgv[i] = "-noauth"; - i++; - } - if (exitCode & BOSEXIT_LOGGING_FLAG) { - /* pass "-log" to new bosserver */ - restartArgv[i] = "-log"; - i++; - } - restartArgv[i] = NULL; - } - } - - if (!(*doRestart)) { - /* bosserver exited with non-restart code; set status */ - *stopStatus = waitStatus; - *isWin32Code = FALSE; - - (void) ReportWarningEventAlt(AFSEVT_SVR_BCS_BOSSERVER_EXIT, - (int)*stopStatus, NULL); - } - - } else { - /* bosserver status NOT available; assume spurious SIGCHLD */ - *doWait = TRUE; - } -} - - -/* - * BosserverRun() -- Run the AFS bosserver, handling stop and exit events. - * - * Input args are those passed to the service's main function (BosCtlMain). - * Output args are the stop status and status type of the bosserver. - */ -static void -BosserverRun(DWORD argc, - LPTSTR *argv, - DWORD *stopStatus, - BOOL *isWin32Code) -{ - DWORD status, i; - BOOL doRestart, doWait; - char **spawn_argv; - - /* Display bosserver startup (legal) message; first start only */ - /* BosserverStartupMsgDisplay(); */ - - /* Set env variable forcing process mgmt lib to spawn processes detached */ - (void)putenv(PMGT_SPAWN_DETACHED_ENV_NAME "=1"); - - /* Alloc block with room for at least BOSSERVER_RESTART_ARG_MAX args */ - i = max((argc + 1), (BOSSERVER_RESTART_ARG_MAX + 2)); - spawn_argv = (char **)malloc(i * sizeof(char *)); - - if (spawn_argv == NULL) { - /* failed to malloc required space; can not continue */ - *stopStatus = ENOMEM; - *isWin32Code = FALSE; - - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_INSUFFICIENT_RESOURCES, - (int)*stopStatus, NULL); - return; - } - - /* Set initial bosserver args to those supplied via StartService() */ - spawn_argv[0] = (char *)AFSDIR_SERVER_BOSVR_FILEPATH; - - for (i = 1; i < argc; i++) { - spawn_argv[i] = argv[i]; - } - spawn_argv[i] = NULL; - - /* Start/restart bosserver and wait for either a stop or exit event */ - doRestart = FALSE; - - do { - pid_t cpid; - - if (doRestart) { - /* restarting bosserver; log informational message */ - (void) ReportInformationEventAlt(AFSEVT_SVR_BCS_BOSSERVER_RESTART, - NULL); - doRestart = FALSE; - } - - cpid = spawnprocve(spawn_argv[0], spawn_argv, NULL, 0); - - if (cpid == (pid_t)-1) { - /* failed to start/restart the bosserver process */ - *stopStatus = errno; - *isWin32Code = FALSE; - - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_BOSSERVER_START_FAILED, - (int)*stopStatus, NULL); - break; - } - - if (status = BosCtlStatusUpdate(SERVICE_RUNNING, 0, TRUE)) { - /* can't tell SCM we're running so quit; should never occur */ - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_SCM_COMM_FAILED, - (int)status, NULL); - (void) SetEvent(bosCtlEvent[BOS_STOP_EVENT]); - } - - /* bosserver is running; wait for an event of interest */ - - Sleep(5000); /* bosserver needs time to register signal handler */ - - do { - doWait = FALSE; - - status = WaitForMultipleObjects(BOS_EVENT_COUNT, - bosCtlEvent, FALSE, INFINITE); - - if ((status - WAIT_OBJECT_0) == BOS_STOP_EVENT) { - /* stop event signaled */ - BosserverDoStopEvent(cpid, stopStatus, isWin32Code); - - } else if ((status - WAIT_OBJECT_0) == BOS_EXIT_EVENT) { - /* exit event signaled; see function comment for outcomes */ - BosserverDoExitEvent(cpid, - &doWait, - &doRestart, spawn_argv, - stopStatus, isWin32Code); - - } else { - /* failed to wait on events; should never happen */ - Sleep(2000); /* sleep to avoid tight loop if event problem */ - doWait = TRUE; - } - } while (doWait); - } while(doRestart); - - return; -} - - -/* - * BosserverStartupMsgDisplay() -- display Windows version of AFS bosserver - * startup (legal) message. - */ -static void -BosserverStartupMsgDisplay(void) -{ - char *msgPath; - - if (!ConstructLocalBinPath(BOSSERVER_STARTMSG_EXE, &msgPath)) { - /* Use C runtime spawn; don't need all the machinery in the - * process management library. - */ - (void)_spawnl(_P_DETACH, msgPath, BOSSERVER_STARTMSG_EXE, NULL); - free(msgPath); - } -} - - -/* - * main() -- start dispatcher thread for BOS control service - */ -int main(void) -{ - SERVICE_TABLE_ENTRY dispatchTable[] = {{AFSREG_SVR_SVC_NAME, BosCtlMain}, - {NULL, NULL}}; - - (void) ReportInformationEventAlt(AFSEVT_SVR_BCS_STARTED, NULL); - - if (!StartServiceCtrlDispatcher(dispatchTable)) { - /* unable to connect to SCM */ - (void) ReportErrorEventAlt(AFSEVT_SVR_BCS_SCM_COMM_FAILED, - (int)GetLastError(), NULL); - } - - (void) ReportInformationEventAlt(AFSEVT_SVR_BCS_STOPPED, NULL); - return 0; -} diff --git a/src/WINNT/bosctlsvc/bosctlsvc.rc b/src/WINNT/bosctlsvc/bosctlsvc.rc deleted file mode 100644 index 907f11bce..000000000 --- a/src/WINNT/bosctlsvc/bosctlsvc.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS BOS Control Service" -#define AFS_VERINFO_NAME "bosctlsvc" -#define AFS_VERINFO_FILENAME "bosctlsvc.exe" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/client_config/.cvsignore b/src/WINNT/client_config/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/client_config/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/client_config/NTMakefile b/src/WINNT/client_config/NTMakefile deleted file mode 100644 index 1fce523fc..000000000 --- a/src/WINNT/client_config/NTMakefile +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# include the AFSD source tree on our inclusion path - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) /D"_AFXDLL" -I..\afsd - -# include the primary makefile -RELDIR=WINNT\client_config -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!include ..\..\config\NTMakefile.version - -############################################################################ -# -# BUILD TARGETS -# - -EXEFILE = $(DESTDIR)\root.client\usr\vice\etc\afs_config.exe - -EXEOBJS = \ - $(OUT)\config.obj \ - $(OUT)\drivemap.obj \ - $(OUT)\main.obj \ - $(OUT)\misc.obj \ - $(OUT)\pagesize.obj \ - $(OUT)\tab_advanced.obj \ - $(OUT)\tab_drives.obj \ - $(OUT)\tab_hosts.obj \ - $(OUT)\tab_general.obj \ - $(OUT)\tab_prefs.obj \ - $(OUT)\dlg_logon.obj \ - $(OUT)\dlg_diag.obj \ - $(OUT)\dlg_misc.obj \ - $(OUT)\isadmin.obj \ - $(OUT)\dlg_automap.obj \ - $(OUT)\dlg_binding.obj \ - $(OUT)\RegistrySupport.obj - -EXEOBJSc = \ - $(OUT)\cellservdb.obj - -EXERES = \ - $(OUT)\afs_config_stub.res - -AFSDOBJS = \ - $(OUT)\fs_utils.obj - -AFSD= ..\afsd - -VCLIBS =\ - comctl32.lib \ - shell32.lib \ - mpr.lib \ - netapi32.lib - -EXELIBS = \ - $(DESTDIR)\lib\afs\TaLocale.lib \ - $(DESTDIR)\lib\afsrpc.lib \ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\libafsconf.lib \ - $(DESTDIR)\lib\lanahelper.lib \ - $(DESTDIR)\lib\afs\afsreg.lib - -############################################################################ -# -# EXTERNAL SOURCE FILES -# -# The following source files are required by this application, but live -# elsewhere in the tree. To prevent checking in more than one copy of the -# source files, they are copied to this directory at build-time. -# - -COPYHEADERS = \ - $(DESTDIR)\include\WINNT\al_resource.h \ - $(DESTDIR)\include\WINNT\checklist.h \ - $(DESTDIR)\include\WINNT\ctl_sockaddr.h \ - $(DESTDIR)\include\WINNT\ctl_spinner.h \ - $(DESTDIR)\include\WINNT\dialog.h \ - $(DESTDIR)\include\WINNT\fastlist.h \ - $(DESTDIR)\include\WINNT\hashlist.h \ - $(DESTDIR)\include\WINNT\resize.h \ - $(DESTDIR)\include\WINNT\subclass.h - -AFSAPPLIBOBJS= \ - $(OUT)\hashlist.obj \ - $(OUT)\resize.obj \ - $(OUT)\subclass.obj \ - $(OUT)\fastlist.obj \ - $(OUT)\dialog.obj \ - $(OUT)\ctl_sockaddr.obj \ - $(OUT)\ctl_spinner.obj \ - $(OUT)\checklist.obj - -AFSAPPLIB=..\afsapplib - -$(AFSAPPLIBOBJS): $(AFSAPPLIB)\$$(@B).cpp - $(C2OBJ) -I$(AFSAPPLIB) $** - -$(AFSDOBJS): $(AFSD)\$$(@B).c - $(C2OBJ) -I$(AFSD) $** - -$(EXEOBJS): $$(@B).cpp - $(C2OBJ) -I$(AFSAPPLIB) $** - -$(EXEOBJSc): $$(@B).c - $(CPP2OBJ) -I$(AFSAPPLIB) $** - -############################################################################ - -{..\afsapplib}.h{$(DESTDIR)\include\WINNT}.h: - $(COPY) ..\afsapplib\$(*B).h $(DESTDIR)\include\WINNT - - -############################################################################ - -$(EXEFILE) : $(EXEOBJS) $(EXEOBJSc) $(EXERES) $(AFSAPPLIBOBJS) $(AFSDOBJS) $(EXELIBS) - $(EXEGUILINK) $(VCLIBS) - $(EXEPREP) - -install : $(COPYHEADERS) $(EXEFILE) lang - -install9x: install - -lang:: en_US ja_JP ko_KR zh_TW zh_CN pt_BR es_ES de_DE - - -############################################################################ -# -# Dependencies -# - -en_US: - $(CD) lang - $(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -ja_JP: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -ko_KR: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -zh_CN: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -zh_TW: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -pt_BR: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -es_ES: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -de_DE: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /e /f NTMakefile install - $(CD) .. - -$(OUT)\afs_config_stub.res : afs_config_stub.rc AFS_component_version_number.h - -clean:: - $(DEL) $(COPYHEADERS) - $(CD) lang - if exist $(NTLANG) $(NTLANG) en_US $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) ja_JP $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) ko_KR $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) zh_CN $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) zh_TW $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) pt_BR $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) es_ES $(MAKECMD) /nologo /e /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) de_DE $(MAKECMD) /nologo /e /f NTMakefile clean - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /e /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. diff --git a/src/WINNT/client_config/RegistrySupport.cpp b/src/WINNT/client_config/RegistrySupport.cpp deleted file mode 100644 index a0c6f30f8..000000000 --- a/src/WINNT/client_config/RegistrySupport.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/*det - * Configuration Read/Modify Functions ________________________________________ - * - * Temporarily these just modify the local Registry. - * In the near future, they will modify the Registry on the - * gateway, if a gateway is being used. - * - */ - -#include -#include -//#include -#include -#include -#include - -BOOL Config_ReadString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax); - -/* - * REGISTRY ___________________________________________________________________ - * - */ - -void Config_GetGlobalDriveList (DRIVEMAPLIST *pDriveList) -{ - // Read the GlobalAutoMapper registry key - TCHAR szDriveToMapTo[5]; - DWORD dwResult; - TCHAR szKeyName[256]; - HKEY hKey; - DWORD dwIndex = 0; - DWORD dwDriveSize; - DWORD dwSubMountSize; - TCHAR szSubMount[256]; - DWORD dwType; - - if (!pDriveList) - return; - - memset(pDriveList, 0, sizeof(DRIVEMAPLIST)); - - lstrcpy(szKeyName, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY)); - lstrcat(szKeyName, TEXT("\\GlobalAutoMapper")); - - dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey); - if (dwResult != ERROR_SUCCESS) - return; - - // Get the drive map list so we can lookup the paths that go with our submounts - DRIVEMAPLIST DriveMapList; - memset(&DriveMapList, 0, sizeof(DRIVEMAPLIST)); - QueryDriveMapList (&DriveMapList); - - while (1) { - dwDriveSize = sizeof(szDriveToMapTo); - dwSubMountSize = sizeof(szSubMount); - - dwResult = RegEnumValue(hKey, dwIndex++, szDriveToMapTo, &dwDriveSize, 0, &dwType, (BYTE*)szSubMount, &dwSubMountSize); - if (dwResult != ERROR_SUCCESS) - break; - - szDriveToMapTo[0] = _totupper(szDriveToMapTo[0]); - - int nCurDrive = szDriveToMapTo[0] - TEXT('A'); - - pDriveList->aDriveMap[nCurDrive].chDrive = szDriveToMapTo[0]; - lstrcpy(pDriveList->aDriveMap[nCurDrive].szSubmount, szSubMount); - - // Find the path that goes with this submount - SubmountToPath (&DriveMapList, pDriveList->aDriveMap[nCurDrive].szMapping, szSubMount, FALSE); - } - - FreeDriveMapList(&DriveMapList); - - RegCloseKey(hKey); -} - -BOOL Config_ReadGlobalNum (LPCTSTR pszLHS, DWORD *pdwRHS) -{ - HKEY hk; - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS) - return FALSE; - - DWORD dwSize = sizeof(*pdwRHS); - if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pdwRHS, &dwSize) != ERROR_SUCCESS) - { - RegCloseKey (hk); - return FALSE; - } - - RegCloseKey (hk); - return TRUE; -} - - -BOOL Config_ReadGlobalString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax) -{ - HKEY hk; - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS) - return FALSE; - - DWORD dwSize = sizeof(TCHAR) * cchMax; - if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pszRHS, &dwSize) != ERROR_SUCCESS) - { - RegCloseKey (hk); - return FALSE; - } - - RegCloseKey (hk); - return TRUE; -} - - -void Config_WriteGlobalNum (LPCTSTR pszLHS, DWORD dwRHS) -{ - HKEY hk; - DWORD dwDisp; - if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) - { - RegSetValueEx (hk, pszLHS, NULL, REG_DWORD, (PBYTE)&dwRHS, sizeof(dwRHS)); - RegCloseKey (hk); - } -} - - -void Config_WriteGlobalString (LPCTSTR pszLHS, LPCTSTR pszRHS) -{ - HKEY hk; - DWORD dwDisp; - if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) - { - RegSetValueEx (hk, pszLHS, NULL, REG_SZ, (PBYTE)pszRHS, sizeof(TCHAR) * (1+lstrlen(pszRHS))); - RegCloseKey (hk); - } -} - - -BOOL Config_ReadUserNum (LPCTSTR pszLHS, DWORD *pdwRHS) -{ - HKEY hk; - if (RegOpenKeyEx (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS) - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_OPENAFS_SUBKEY), 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS) - return FALSE; - - DWORD dwSize = sizeof(*pdwRHS); - if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pdwRHS, &dwSize) != ERROR_SUCCESS) - { - RegCloseKey (hk); - return FALSE; - } - - RegCloseKey (hk); - return TRUE; -} - - -BOOL Config_ReadUserString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax) -{ - HKEY hk; - if (RegOpenKeyEx (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS) - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_OPENAFS_SUBKEY), 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS) - return FALSE; - - DWORD dwSize = sizeof(TCHAR) * cchMax; - if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pszRHS, &dwSize) != ERROR_SUCCESS) - { - RegCloseKey (hk); - return FALSE; - } - - RegCloseKey (hk); - return TRUE; -} - - -void Config_WriteUserNum (LPCTSTR pszLHS, DWORD dwRHS) -{ - HKEY hk; - DWORD dwDisp; - if (RegCreateKeyEx (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) - { - RegSetValueEx (hk, pszLHS, NULL, REG_DWORD, (PBYTE)&dwRHS, sizeof(dwRHS)); - RegCloseKey (hk); - } -} - - -void Config_WriteUserString (LPCTSTR pszLHS, LPCTSTR pszRHS) -{ - HKEY hk; - DWORD dwDisp; - if (RegCreateKeyEx (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) - { - RegSetValueEx (hk, pszLHS, NULL, REG_SZ, (PBYTE)pszRHS, sizeof(TCHAR) * (1+lstrlen(pszRHS))); - RegCloseKey (hk); - } -} - - diff --git a/src/WINNT/client_config/afs_config.h b/src/WINNT/client_config/afs_config.h deleted file mode 100644 index 7b15899e7..000000000 --- a/src/WINNT/client_config/afs_config.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFS_CONFIG_H -#define AFS_CONFIG_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cellservdb.h" -#include "drivemap.h" -#include "resource.h" -#include "config.h" -#include "help.hid" -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - HWND hMain; - BOOL fIsWinNT; - BOOL fIsAdmin; - BOOL fIsCCenter; - LPPROPSHEET psh; - - struct - { - TCHAR szGateway[ MAX_PATH ]; - TCHAR szCell[ MAX_PATH ]; - TCHAR szSysName[ MAX_PATH ]; - TCHAR szRootVolume[ MAX_PATH ]; - TCHAR szMountDir[ MAX_PATH ]; - TCHAR szCachePath[ MAX_PATH ]; - BOOL fBeGateway; - BOOL fShowTrayIcon; - BOOL fLogonAuthent; - BOOL fTrapOnPanic; - BOOL fFailLoginsSilently; - BOOL fReportSessionStartups; - DWORD ckCache; - DWORD ckChunk; - DWORD cStatEntries; - DWORD csecProbe; - DWORD nThreads; - DWORD nDaemons; - DWORD nLanAdapter; - DWORD nTraceBufSize; - DWORD nLoginRetryInterval; - PSERVERPREFS pFServers; - PSERVERPREFS pVLServers; - CELLSERVDB CellServDB; - DRIVEMAPLIST NetDrives; - DRIVEMAPLIST GlobalDrives; - BOOL fChangedPrefs; - } Configuration; - - BOOL fNeedRestart; - TCHAR szHelpFile[ MAX_PATH ]; - } GLOBALS; - -extern GLOBALS g; - -/* - * MACROS _____________________________________________________________________ - * - */ - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) AfsConfigReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -#endif - -#ifndef iswhite -#define iswhite(_ch) (((_ch)==TEXT(' ')) || ((_ch)==TEXT('\t'))) -#endif -#ifndef iseol -#define iseol(_ch) (((_ch)==TEXT('\r')) || ((_ch)==TEXT('\n'))) -#endif -#ifndef iswhiteeol -#define iswhiteeol(_ch) (iswhite(_ch) || iseol(_ch)) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Quit (void); - -BOOL AfsConfigReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc); - -void Main_OnInitDialog (HWND hMain); - -void Main_RefreshAllTabs (void); - -LPCTSTR GetCautionTitle (void); -LPCTSTR GetErrorTitle (void); - - -#endif - diff --git a/src/WINNT/client_config/afs_config.ico b/src/WINNT/client_config/afs_config.ico deleted file mode 100644 index 3982dccc1cadf552d5c3d755ebe78d9e39024b53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaF>1pw7=@o}gF^|VQ`ZK^LrJ$>Ai;R_VZ7Nx22%>w5a=Cpjt-`12-Jtj*s(() z8A|>>S&^O6{PvUly|gU!%hxZzN@YVT`1%>w(!VOXR9|3U>2@Dtg0o)oU>r22l)#K}Eyu zFsSOVXMx)6dg7{b)9#AUEeF=E;UIO6~*&;(?DhbHKo3+jq->K+Crt5SU#5vrkKr=C!A?2UtarU~q)o{`NLMFrp`3y55Aw&3UDxSQTU#o_ -#include -#include -#include -} -#include -#include -#include - -/* - * - */ - -void usage(char * program) -{ - fprintf(stderr, "Usage: %s [ ] [ /persistent ]\n", program); - fprintf(stderr, " %s [ /persistent ]\n", program); - fprintf(stderr, " %s /delete\n", program); - fprintf(stderr, " %s /list\n", program); - fprintf(stderr, " %s /help\n", program); - exit(1); -} - -int main(int argc, char * argv) -{ - int retval = 0; - char drive = 0; - char mountRoot[16]; - DWORD mountRootLen = 0; - char buf[200]; - HKEY parmKey; - DWORD dummyLen; - DWORD code; - char netbiosName[17]; - DWORD netbiosNameLen; - BOOL persistent; - char submount[32] = ""; - - if ( argc < 2 || argc > 5 ) - usage(program); - - if ( stricmp("/list", argv[1]) ) { - /* print list of afs drive mappings */ - - return 0; - } - - if ( stricmp("/help", argv[1]) ) { - usage(program); - } - - if ( strlen(argv[1]) == 2 && argv[1][1] == ':' ) { - drive = toupper(argv[1][0]); - if ( drive < 'A' || drive > 'Z' ) - usage(program); - } - - if ( stricmp("/delete", argv[2]) ) { - if ( !DriveIsGlobalAfsDrive(drive) ) { - fprintf(stderr, "%s: Drive %c is not mapped to AFS\n", argv[0], drive); - return 6; - } - - /* remove drive map */ - WriteActiveMap( drive, FALSE ); - code = DisMountDOSDrive( drive, TRUE ); - if ( code ) { - fprintf(stderr, "%s: Unable to delete drive %c:, error = %lX\n", argv[0], code); - return 2; - } - return 0; - } - - /* need to determine if argv[3] contains a /mountroot or \\netbiosname path. - * do not use hard code constants; instead use the registry strings - */ - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSConfigKeyName, - 0, KEY_QUERY_VALUE, &parmKey); - dummyLen = sizeof(cm_mountRoot); - code = RegQueryValueEx(parmKey, "MountRoot", NULL, NULL, - mountRoot, &mountRootLen); - if (code == ERROR_SUCCESS) { - cm_mountRootLen = strlen(cm_mountRoot); - } else { - strcpy(mountRoot, sizeof(cm_mountRoot), "/afs"); - cm_mountRootLen = 4; - } - - code = lana_GetNetbiosName(netbiosName, LANA_NETBIOS_NAME_FULL); - if ( code ) { - fprintf(stderr, "%s: Unable to determine AFS SMB server name\n",argv[0]); - return 3; - } - netbiosNameLen = strlen(netbiosName); - - if ( argv[3][0] == '\\' && argv[3][1] == '\\' && - _strnicmp(netbiosName, &argv[3][2], netbiosNameLen) == 0 && - argv[3][netbiosNameLen+3] == '\\') { - /* we have a UNC style path */ - - if ( argc == 4 ) { - persistent = FALSE; - } else if (argc > 5) { - usage(argv[0]); - } else { - if ( stricmp("/persistent", argv[4]) ) - usage(argv[0]); - persistent = TRUE; - } - - code = MountDOSDrive(drive, &argv[3][netbiosNameLen+4], persistent, NULL); - if ( code ) { - fprintf(stderr, "%s: Unable to map %c: to %s, error = %lX\n", argv[0], drive, argv[3], code); - return 4; - } - WriteActiveMap( drive, persistent ); - return 0; - } - - if ( argv[3][0] == '/' && - _strnicmp(mountRoot, &argv[1], mountRootLen) && - argv[3][mountRootLen+2] == '/') { - /* we have an afs path */ - /* check to see if we have a submount, if not generate a random one */ - /* check to see if we are persistent or not */ - - if ( argc == 4 ) { - /* we have neither persistence nor a submount name */ - persistent = FALSE; - } else if ( argc > 6 ) { - usage(argv[0]); - } else if ( argc == 5 ) { - /* we have either persistence or a submount */ - if ( _stricmp("/persistent", argv[4]) == 0 ) { - persistent = TRUE; - } else { - /* we have a submount name */ - if ( !IsValidSubmountName(argv[4]) ) { - fprintf(stderr, "%s: invalid submount name: %s\n", argv[4]); - return 5; - } - strcpy(submount, argv[4]); - persistent = FALSE; - } - } else { - /* we have both persistent and a submount */ - if ( _stricmp("/persistent", argv[5]) == 0 ) { - persistent = TRUE; - } else { - usage(argv[0]); - } - - if ( !IsValidSubmountName(argv[4]) ) { - fprintf(stderr, "%s: invalid submount name: %s\n", argv[4]); - return 5; - } - strcpy(submount, argv[4]); - } - - WriteActiveMap( drive, persistent ); - } - return 0; -} diff --git a/src/WINNT/client_config/cellservdb.c b/src/WINNT/client_config/cellservdb.c deleted file mode 100644 index ddecb3074..000000000 --- a/src/WINNT/client_config/cellservdb.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include -#include - -#include -#include -#include -#include -#include "cellservdb.h" - -#ifdef AFS_NT40_ENV -#include -#include -#else -#include -#endif -#include - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -#define new(_t) (_t*)malloc(sizeof(_t)) -#define delete(_p) free((void*)(_p)) - -#ifndef iswhite -#define iswhite(_ch) (((_ch)==' ') || ((_ch)=='\t')) -#endif -#ifndef iseol -#define iseol(_ch) (((_ch)=='\r') || ((_ch)=='\n')) -#endif -#ifndef iswhiteeol -#define iswhiteeol(_ch) (iswhite(_ch) || iseol(_ch)) -#endif -#ifndef min -#define min(_a,_b) ((_a) < (_b) ? (_a) : (_b)) -#endif - - -/* - * STATICS ____________________________________________________________________ - * - */ - -static void strzcpy (char *pszTarget, const char *pszSource, size_t cch) -{ - cch = min(cch, (size_t)(1+strlen(pszSource))); - strncpy (pszTarget, pszSource, cch-1); - pszTarget[ cch-1 ] = '\0'; -} - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void CSDB_GetFileName (char *pszFilename) -{ -#ifdef AFS_NT40_ENV - /* Find the appropriate CellServDB */ - char * clientdir = 0; - DWORD code, dummyLen; - HKEY parmKey; - int tlen; - - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &parmKey); - if (code != ERROR_SUCCESS) - goto dirpath; - - dummyLen = MAX_CSDB_PATH; - code = RegQueryValueEx(parmKey, "CellServDBDir", NULL, NULL, - pszFilename, &dummyLen); - RegCloseKey (parmKey); - - dirpath: - if (code != ERROR_SUCCESS || pszFilename[0] == 0) { - afssw_GetClientInstallDir(&clientdir); - if (clientdir) { - strncpy(pszFilename, clientdir, MAX_CSDB_PATH); - pszFilename[MAX_CSDB_PATH - 1] = '\0'; - } - } - if (pszFilename[ strlen(pszFilename)-1 ] != '\\') - strcat (pszFilename, "\\"); - - strcat (pszFilename, "CellServDB"); -#else - strcpy (pszFilename, "/usr/vice/etc/CellServDB"); -#endif -} - - -BOOL CSDB_ReadFile (PCELLSERVDB pCellServDB, const char *pszFilename) -{ - BOOL rc = FALSE; - FILE *pFile; - size_t cbLength; - size_t cbRead; - char *pszBuffer; - char *pszStart; - char *pszEnd; - PCELLDBLINE pLine; - - memset (pCellServDB, 0x00, sizeof(CELLSERVDB)); - - /* Open AFSDCELL.INI and read it into memory. */ - - if (pszFilename) - strcpy (pCellServDB->szFilename, pszFilename); - else - CSDB_GetFileName (pCellServDB->szFilename); - - if ((pFile = fopen (pCellServDB->szFilename, "r")) != NULL) - { - fseek (pFile, 0, 2); - cbLength = ftell (pFile); - fseek (pFile, 0, 0); - - pszBuffer = (char*)malloc (sizeof(char) * (cbLength +2)); - - if ((cbRead = fread (pszBuffer, 1, cbLength, pFile)) != 0) - { - pszBuffer[ cbRead ] = '\0'; - pszBuffer[ cbRead+1 ] = '\0'; - - /* Scan the file line-by-line... */ - - for (pszStart = pszBuffer; pszStart && *pszStart; ) - { - while (iswhiteeol(*pszStart)) - ++pszStart; - if (!*pszStart) - break; - - for (pszEnd = pszStart; *pszEnd && !iseol(*pszEnd); ++pszEnd) - ; - *pszEnd++ = '\0'; - - /* Add this line to our chain */ - - pLine = new(CELLDBLINE); - memset (pLine, 0x00, sizeof(CELLDBLINE)); - strzcpy (pLine->szLine, pszStart, cchCELLDBLINE-1); - pLine->szLine[ cchCELLDBLINE-1 ] = '\0'; - if ((pLine->pPrev = pCellServDB->pLast) != NULL) - pLine->pPrev->pNext = pLine; - if ((pCellServDB->pLast = pLine)->pPrev == NULL) - pCellServDB->pFirst = pLine; - - /* Process the next line in the file */ - - pszStart = pszEnd; - } - - rc = TRUE; - } - - free (pszBuffer); - fclose (pFile); - } - - return rc; -} - - -BOOL CSDB_WriteFile (PCELLSERVDB pCellServDB) -{ - BOOL rc = TRUE; - FILE *pFile; - char szLine[ cchCELLDBLINE ]; - PCELLDBLINE pLine; - - if (pCellServDB->fChanged) - { - if ((pFile = fopen (pCellServDB->szFilename, "w")) == NULL) - { - rc = FALSE; - } - else - { - for (pLine = pCellServDB->pFirst; pLine; pLine = pLine->pNext) - { -#ifdef AFS_NT40_ENV - sprintf (szLine, "%s\r\n", pLine->szLine); -#else - sprintf (szLine, "%s\n", pLine->szLine); -#endif - fwrite (szLine, 1, strlen(szLine), pFile); - } - - fclose (pFile); - } - - pCellServDB->fChanged = FALSE; - } - - return rc; -} - - -void CSDB_FreeFile (PCELLSERVDB pCellServDB) -{ - PCELLDBLINE pNext; - PCELLDBLINE pLine; - for (pLine = pCellServDB->pFirst; pLine; pLine = pNext) - { - pNext = pLine->pNext; - delete(pLine); - } - memset (pCellServDB, 0x00, sizeof(CELLSERVDB)); -} - - -BOOL CSDB_CrackLine (PCELLDBLINEINFO pInfo, const char *pszLine) -{ - char *pszOut; - BOOL fIsCell = TRUE; - BOOL fSawHash = FALSE; - - memset (pInfo, 0x00, sizeof(CELLDBLINEINFO)); - - if (!pszLine || !*pszLine) - return FALSE; - - while (iswhite(*pszLine)) - ++pszLine; - - if (*pszLine == '>') - ++pszLine; - else if (!isdigit (*pszLine)) - return FALSE; - else /* (isdigit (*pszLine)) */ - fIsCell = FALSE; - - for (pszOut = pInfo->szCell; *pszLine && (!iswhite(*pszLine)) && (*pszLine != '#'); ) - *pszOut++ = *pszLine++; - *pszOut = '\0'; - - while (iswhite(*pszLine) || (*pszLine == '#')) - { - fSawHash = fSawHash || (*pszLine == '#'); - ++pszLine; - } - - if (fIsCell && *pszLine && !fSawHash) - { - for (pszOut = pInfo->szLinkedCell; *pszLine && (!iswhite(*pszLine)) && (*pszLine != '#'); ) - *pszOut++ = *pszLine++; - *pszOut = '\0'; - - while (iswhite(*pszLine) || (*pszLine == '#')) - ++pszLine; - } - - for (pszOut = pInfo->szComment; *pszLine; ) - *pszOut++ = *pszLine++; - *pszOut = '\0'; - - if (!pInfo->szCell[0]) - return FALSE; - - if (!fIsCell) - { - if ((pInfo->ipServer = inet_addr (pInfo->szCell)) == 0xffffffff) - return FALSE; - pInfo->szCell[0] = '\0'; - } - - return TRUE; -} - - -BOOL CSDB_FormatLine (char *pszLine, const char *pszCell, const char *pszLinkedCell, const char *pszComment, BOOL fIsCell) -{ - if (fIsCell) - sprintf (pszLine, ">%s", pszCell); - else - strcpy (pszLine, pszCell); - - if (fIsCell && pszLinkedCell && *pszLinkedCell) - sprintf (&pszLine[ strlen(pszLine) ], " %s", pszLinkedCell); - - if (pszComment) - { - size_t cchSpacing = (fIsCell) ? 28 : 33; - strcat (pszLine, " "); - if ((size_t)strlen(pszLine) < cchSpacing) - { - strcat (pszLine, " "); - pszLine[cchSpacing] = '\0'; - } - - sprintf (&pszLine[ strlen(pszLine) ], ((fIsCell) ? "# %s" : "#%s"), pszComment); - } - - return TRUE; -} - - -PCELLDBLINE CSDB_FindCell (PCELLSERVDB pCellServDB, const char *pszCell) -{ - PCELLDBLINE pLine; - for (pLine = pCellServDB->pFirst; pLine; pLine = pLine->pNext) - { - CELLDBLINEINFO Info; - if (!CSDB_CrackLine (&Info, pLine->szLine)) - continue; - if (!strcmpi (Info.szCell, pszCell)) - return pLine; - } - return NULL; -} - - -BOOL CSDB_OnRemove (PCELLSERVDB pCellServDB, PCELLDBLINE pCellLine, BOOL fRemoveCellLineToo) -{ - CELLDBLINEINFO Info; - PCELLDBLINE pNext; - PCELLDBLINE pLine; - - /* Quick validation: make sure the caller specified a Cell line */ - - if (!pCellLine) - return FALSE; - if (!CSDB_CrackLine (&Info, pCellLine->szLine)) - return FALSE; - if (!Info.szCell[0]) - return FALSE; - - /* Remove everything about this cell (except maybe the cell line) */ - - pLine = (fRemoveCellLineToo) ? pCellLine : pCellLine->pNext; - for ( ; pLine; pLine = pNext) - { - if ((pNext = CSDB_RemoveLine (pCellServDB, pLine)) != NULL) - { - if (!CSDB_CrackLine (&Info, pNext->szLine)) - break; - if (Info.szCell[0]) /* Hit the next cell? We're done! */ - break; - } - } - - pCellServDB->fChanged = TRUE; - return TRUE; -} - -BOOL CSDB_RemoveCell (PCELLSERVDB pCellServDB, PCELLDBLINE pCellLine) -{ - return CSDB_OnRemove (pCellServDB, pCellLine, TRUE); -} - -BOOL CSDB_RemoveCellServers (PCELLSERVDB pCellServDB, PCELLDBLINE pCellLine) -{ - return CSDB_OnRemove (pCellServDB, pCellLine, FALSE); -} - - -PCELLDBLINE CSDB_AddCell (PCELLSERVDB pCellServDB, const char *pszCell, const char *pszLinkedCell, const char *pszComment) -{ - PCELLDBLINE pCellLine; - - /* Find out if there's already an entry in CellServDB for this cell; */ - /* add one if necessary. */ - - if ((pCellLine = CSDB_FindCell (pCellServDB, pszCell)) == NULL) - { - pCellLine = new(CELLDBLINE); - memset (pCellLine, 0x00, sizeof(CELLDBLINE)); - if ((pCellLine->pPrev = pCellServDB->pLast) != NULL) - pCellLine->pPrev->pNext = pCellLine; - if ((pCellServDB->pLast = pCellLine)->pPrev == NULL) - pCellServDB->pFirst = pCellLine; - } - - CSDB_FormatLine (pCellLine->szLine, pszCell, pszLinkedCell, pszComment, TRUE); - pCellServDB->fChanged = TRUE; - return pCellLine; -} - - -PCELLDBLINE CSDB_AddCellServer (PCELLSERVDB pCellServDB, PCELLDBLINE pAddAfter, const char *pszAddress, const char *pszComment) -{ - char szLine[ cchCELLDBLINE ]; - CSDB_FormatLine (szLine, pszAddress, NULL, pszComment, FALSE); - return CSDB_AddLine (pCellServDB, pAddAfter, szLine); -} - - -PCELLDBLINE CSDB_AddLine (PCELLSERVDB pCellServDB, PCELLDBLINE pAddAfter, const char *pszLine) -{ - PCELLDBLINE pNew = new(CELLDBLINE); - memset (pNew, 0x00, sizeof(CELLDBLINE)); - strcpy (pNew->szLine, pszLine); - - if (pAddAfter == NULL) - { - if ((pNew->pNext = pCellServDB->pFirst) != NULL) - pNew->pNext->pPrev = pNew; - pNew->pPrev = NULL; - pCellServDB->pFirst = pNew; - if (pCellServDB->pLast == NULL) - pCellServDB->pLast = pNew; - } - else /* (pAddAfter != NULL) */ - { - if ((pNew->pNext = pAddAfter->pNext) != NULL) - pNew->pNext->pPrev = pNew->pPrev; - pNew->pPrev = pAddAfter; - pAddAfter->pNext = pNew; - if (pCellServDB->pLast == pAddAfter) - pCellServDB->pLast = pNew; - } - - pCellServDB->fChanged = TRUE; - return pNew; -} - - -PCELLDBLINE CSDB_RemoveLine (PCELLSERVDB pCellServDB, PCELLDBLINE pRemove) -{ - PCELLDBLINE pNext; - - if (!pRemove) - return NULL; - - pNext = pRemove->pNext; - - if (pRemove->pPrev) - pRemove->pPrev->pNext = pRemove->pNext; - if (pRemove->pNext) - pRemove->pNext->pPrev = pRemove->pPrev; - if (pCellServDB->pFirst == pRemove) - pCellServDB->pFirst = pRemove->pNext; - if (pCellServDB->pLast == pRemove) - pCellServDB->pLast = pRemove->pPrev; - - delete(pRemove); - - pCellServDB->fChanged = TRUE; - return pNext; -} - diff --git a/src/WINNT/client_config/cellservdb.h b/src/WINNT/client_config/cellservdb.h deleted file mode 100644 index dc4bfc283..000000000 --- a/src/WINNT/client_config/cellservdb.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CELLSERVDB_H -#define CELLSERVDB_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -typedef int BOOL; -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef MAX_CSDB_PATH -#define MAX_CSDB_PATH 2048 -#endif - - -#define cchCELLDBLINE 512 - -typedef struct CELLDBLINE CELLDBLINE, *PCELLDBLINE; -struct CELLDBLINE - { - char szLine[ cchCELLDBLINE ]; - PCELLDBLINE pPrev; - PCELLDBLINE pNext; - }; - -typedef struct - { - char szFilename[ MAX_CSDB_PATH ]; - BOOL fChanged; - PCELLDBLINE pFirst; - PCELLDBLINE pLast; - } CELLSERVDB, *PCELLSERVDB; - -typedef struct - { - char szCell[ cchCELLDBLINE ]; - char szLinkedCell[ cchCELLDBLINE ]; - int ipServer; - char szComment[ cchCELLDBLINE ]; - } CELLDBLINEINFO, *PCELLDBLINEINFO; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void CSDB_GetFileName (char *pszFilename); - -BOOL CSDB_ReadFile (PCELLSERVDB pCellServDB, const char *pszFilename); -BOOL CSDB_WriteFile (PCELLSERVDB pCellServDB); -void CSDB_FreeFile (PCELLSERVDB pCellServDB); - -BOOL CSDB_CrackLine (PCELLDBLINEINFO pInfo, const char *pszLine); -BOOL CSDB_FormatLine (char *pszLine, const char *pszCell, const char *pszLinkedCell, const char *pszComment, BOOL fIsCell); - -PCELLDBLINE CSDB_FindCell (PCELLSERVDB pCellServDB, const char *pszCell); - -BOOL CSDB_RemoveCell (PCELLSERVDB pCellServDB, PCELLDBLINE pCellLine); -BOOL CSDB_RemoveCellServers (PCELLSERVDB pCellServDB, PCELLDBLINE pCellLine); - -PCELLDBLINE CSDB_AddCell (PCELLSERVDB pCellServDB, const char *pszCell, const char *pszLinkedCell, const char *pszComment); -PCELLDBLINE CSDB_AddCellServer (PCELLSERVDB pCellServDB, PCELLDBLINE pAddAfter, const char *pszAddress, const char *pszComment); - -PCELLDBLINE CSDB_AddLine (PCELLSERVDB pCellServDB, PCELLDBLINE pAddAfter, const char *pszLine); -PCELLDBLINE CSDB_RemoveLine (PCELLSERVDB pCellServDB, PCELLDBLINE pRemove); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif - diff --git a/src/WINNT/client_config/config.cpp b/src/WINNT/client_config/config.cpp deleted file mode 100644 index 15b1b5631..000000000 --- a/src/WINNT/client_config/config.cpp +++ /dev/null @@ -1,870 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afs_config.h" -#include - -extern "C" { - -#include "../afsd/fs_utils.h" - -#define __CM_CONFIG_INTERFACES_ONLY__ -#include "../afsd/cm_config.h" - -#define __CM_IOCTL_INTERFACES_ONLY__ -#include "../afsd/cm_ioctl.h" - -} // extern "C" - - -#define cREALLOC_PREFS 32 - -#define cSERVERPREFS_CHUNK 256 - -#define PIOCTL_MAXSIZE 2048 - - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -static DWORD log2 (DWORD dwValue) -{ - for (DWORD dwLog = 0; (DWORD)(1<fVLServers = fVLServers; - - if (Config_GetServiceState() == SERVICE_RUNNING) - { - // We retrieve server prefs in batches--start that loop now. - // - size_t iOut = 0; - for (int iOffset = 0; ; ) - { - cm_SPrefRequest_t InData; - memset (&InData, 0x00, sizeof(InData)); - InData.offset = iOffset; - InData.flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0; - InData.num_servers = cSERVERPREFS_CHUNK; - - BYTE OutDataStorage[ sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t) ]; - memset (OutDataStorage, 0x00, sizeof(OutDataStorage)); - cm_SPrefInfo_t *pOutData = (cm_SPrefInfo_t *)OutDataStorage; - - struct ViceIoctl IOInfo; - IOInfo.in_size = sizeof(InData); - IOInfo.in = (char *)&InData; - IOInfo.out = (char *)pOutData; - IOInfo.out_size = sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t); - - if (pioctl (0, VIOC_GETSPREFS, &IOInfo, 1) != 0) - break; - - if (!REALLOC (pPrefs->aPrefs, pPrefs->cPrefs, iOut + pOutData->num_servers, cREALLOC_PREFS)) - break; - - for (size_t ii = 0; ii < pOutData->num_servers; ++ii) - { - pPrefs->aPrefs[ iOut ].ipServer = pOutData->servers[ ii ].host.s_addr; - pPrefs->aPrefs[ iOut ].iRank = pOutData->servers[ ii ].rank; - iOut ++; - } - - if ((iOffset = pOutData->next_offset) == 0) - break; - } - } - - return pPrefs; -} - - -BOOL Config_SetServerPrefs (PSERVERPREFS pPrefs, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (pPrefs) - { - size_t cChanged = 0; - for (size_t ii = 0; ii < pPrefs->cPrefs; ++ii) - { - if (pPrefs->aPrefs[ ii ].fChanged) - ++cChanged; - } - - if (cChanged) - { - if (Config_GetServiceState() != SERVICE_RUNNING) - { - rc = FALSE; - status = ERROR_SERVICE_NOT_ACTIVE; - } - else - { - size_t cbInDataStorage = sizeof(cm_SSetPref_t) + cChanged * sizeof(cm_SPref_t); - - PBYTE pInDataStorage; - if ((pInDataStorage = (PBYTE)Allocate (cbInDataStorage)) == NULL) - { - rc = FALSE; - status = ERROR_NOT_ENOUGH_MEMORY; - } - else - { - memset (pInDataStorage, 0x00, sizeof(cbInDataStorage)); - - cm_SSetPref_t *pInData = (cm_SSetPref_t*)pInDataStorage; - pInData->flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0; - pInData->num_servers = cChanged; - - size_t iOut = 0; - for (ii = 0; ii < pPrefs->cPrefs; ++ii) - { - if (pPrefs->aPrefs[ ii ].fChanged) - { - pInData->servers[ iOut ].host.s_addr = pPrefs->aPrefs[ ii ].ipServer; - pInData->servers[ iOut ].rank = (unsigned short)pPrefs->aPrefs[ ii ].iRank; - iOut++; - } - } - - BYTE OutDataStorage[ PIOCTL_MAXSIZE ]; - - struct ViceIoctl IOInfo; - IOInfo.in_size = cbInDataStorage; - IOInfo.in = (char *)pInData; - IOInfo.out = (char *)OutDataStorage; - IOInfo.out_size = PIOCTL_MAXSIZE; - - if ((status = pioctl (0, VIOC_SETSPREFS, &IOInfo, 1)) != 0) - { - rc = FALSE; - } - - Free (pInDataStorage); - } - } - } - } - - if (pStatus && !rc) - *pStatus = status; - if (!rc) - Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PREFS, TEXT("%ld"), status); - return rc; -} - - -void Config_FreeServerPrefs (PSERVERPREFS pPrefs) -{ - if (pPrefs->aPrefs) - Free (pPrefs->aPrefs); - memset (pPrefs, 0xFD, sizeof(SERVERPREFS)); - Delete (pPrefs); -} - - -void Config_GetCacheSize (ULONG *pckCache) -{ - if (!Config_ReadGlobalNum (TEXT("CacheSize"), (DWORD*)pckCache)) - *pckCache = CM_CONFIGDEFAULT_CACHESIZE; -} - - -BOOL Config_SetCacheSize (ULONG ckCache, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("CacheSize"), ckCache); - g.fNeedRestart = TRUE; - return TRUE; -} - - - -void Config_GetChunkSize (ULONG *pckChunk) -{ - if (!Config_ReadGlobalNum (TEXT("ChunkSize"), (DWORD*)pckChunk)) - *pckChunk = CM_CONFIGDEFAULT_CHUNKSIZE; - *pckChunk = max (*pckChunk, 10); - *pckChunk = (1 << ((*pckChunk)-10)); -} - - -BOOL Config_SetChunkSize (ULONG ckChunk, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("ChunkSize"), log2(ckChunk * 1024)); - g.fNeedRestart = TRUE; - return TRUE; -} - - - -void Config_GetStatEntries (ULONG *pcEntries) -{ - if (!Config_ReadGlobalNum (TEXT("Stats"), (DWORD*)pcEntries)) - *pcEntries = CM_CONFIGDEFAULT_STATS; -} - - -BOOL Config_SetStatEntries (ULONG cEntries, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("Stats"), cEntries); - g.fNeedRestart = TRUE; - return TRUE; -} - - - -void Config_GetProbeInt (ULONG *pcsecProbe) -{ - *pcsecProbe = 30; - // TODO: NEED REGISTRY SETTING -} - - -BOOL Config_SetProbeInt (ULONG csecProbe, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - // TODO: NEED REGISTRY SETTING - if (Config_GetServiceState() == SERVICE_RUNNING) - { - struct chservinfo checkserv; - memset (&checkserv, 0x00, sizeof(checkserv)); - checkserv.magic = 0x12345678; - checkserv.tinterval = csecProbe; - - BYTE OutData[ PIOCTL_MAXSIZE ]; - memset (OutData, 0x00, sizeof(OutData)); - - struct ViceIoctl IOInfo; - IOInfo.in_size = sizeof(checkserv); - IOInfo.in = (char *)&checkserv; - IOInfo.out = (char *)OutData; - IOInfo.out_size = PIOCTL_MAXSIZE; - - if ((status = pioctl (0, VIOCCKSERV, &IOInfo, 1)) != 0) - { - rc = FALSE; - } - } - - if (pStatus && !rc) - *pStatus = status; - if (!rc) - Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PROBE, TEXT("%ld"), status); - return rc; -} - - - -void Config_GetNumThreads (ULONG *pcThreads) -{ - if (!Config_ReadGlobalNum (TEXT("ServerThreads"), (DWORD*)pcThreads)) - *pcThreads = CM_CONFIGDEFAULT_SVTHREADS; -} - - -BOOL Config_SetNumThreads (ULONG cThreads, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("ServerThreads"), cThreads); - g.fNeedRestart = TRUE; - return TRUE; -} - - - -void Config_GetNumDaemons (ULONG *pcDaemons) -{ - if (!Config_ReadGlobalNum (TEXT("Daemons"), (DWORD*)pcDaemons)) - *pcDaemons = CM_CONFIGDEFAULT_DAEMONS; -} - - -BOOL Config_SetNumDaemons (ULONG cDaemons, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("Daemons"), cDaemons); - g.fNeedRestart = TRUE; - return TRUE; -} - - - -void Config_GetSysName (LPTSTR pszName) -{ - if (!Config_ReadGlobalString (TEXT("SysName"), pszName, MAX_PATH)) - lstrcpy (pszName, TEXT("i386_nt40")); -} - - -BOOL Config_SetSysName (LPCTSTR pszName, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - if (Config_GetServiceState() == SERVICE_RUNNING) - { - struct { - ULONG cbData; - TCHAR szData[ PIOCTL_MAXSIZE ]; - } InData; - memset (&InData, 0x00, sizeof(InData)); - USHORT i=0, j=0, len=lstrlen(pszName); - - if ( len == 0 ) { - Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("A sysname must be specified")); - return(-1); - } - - while ( pszName[i] ) { - if ( !isspace(pszName[i]) ) { - InData.szData[j++] = pszName[i]; - } else if (InData.szData[j-1] != '\0') { - InData.szData[j++] = '\0'; - InData.cbData++; - } - i++; - } - InData.szData[j++] = '\0'; - InData.cbData++; /* one word */ - - BYTE OutData[ PIOCTL_MAXSIZE ]; - memset (OutData, 0x00, sizeof(OutData)); - - struct ViceIoctl IOInfo; - IOInfo.in_size = sizeof(ULONG) + j; - IOInfo.in = (char *)&InData; - IOInfo.out = (char *)OutData; - IOInfo.out_size = PIOCTL_MAXSIZE; - - if ((status = pioctl (0, VIOC_AFS_SYSNAME, &IOInfo, 1)) != 0) - { - rc = FALSE; - } - } - - if (rc) - { - Config_WriteGlobalString (TEXT("SysName"), pszName); - } - - if (pStatus && !rc) - *pStatus = status; - if (!rc) - Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("%ld"), status); - return rc; -} - - - -void Config_GetRootVolume (LPTSTR pszName) -{ - if (!Config_ReadGlobalString (TEXT("RootVolume"), pszName, MAX_PATH)) - lstrcpy (pszName, TEXT("root.afs")); -} - - -BOOL Config_SetRootVolume (LPCTSTR pszName, ULONG *pStatus) -{ - Config_WriteGlobalString (TEXT("RootVolume"), pszName); - g.fNeedRestart = TRUE; - return TRUE; -} - - - -void Config_GetMountRoot (LPTSTR pszPath) -{ - if (!Config_ReadGlobalString (TEXT("MountRoot"), pszPath, MAX_PATH)) - lstrcpy (pszPath, TEXT("/afs")); -} - - -BOOL Config_SetMountRoot (LPCTSTR pszPath, ULONG *pStatus) -{ - Config_WriteGlobalString (TEXT("MountRoot"), pszPath); - g.fNeedRestart = TRUE; - return TRUE; -} - - -BOOL Config_GetCacheInUse (ULONG *pckCacheInUse, ULONG *pStatus) -{ - BOOL rc = TRUE; - ULONG status = 0; - - *pckCacheInUse = 0; - - if (Config_GetServiceState() != SERVICE_RUNNING) - { - rc = FALSE; - status = ERROR_SERVICE_NOT_ACTIVE; - } - else - { - BYTE OutData[ PIOCTL_MAXSIZE ]; - memset (OutData, 0x00, sizeof(OutData)); - - struct ViceIoctl IOInfo; - IOInfo.in_size = 0; - IOInfo.in = (char *)0; - IOInfo.out = (char *)OutData; - IOInfo.out_size = PIOCTL_MAXSIZE; - - if ((status = pioctl (0, VIOCGETCACHEPARMS, &IOInfo, 1)) != 0) - { - rc = FALSE; - } - else - { - *pckCacheInUse = ((LONG*)OutData)[1]; - } - } - - if (pStatus && !rc) - *pStatus = status; - return rc; -} - -void Config_GetCachePath (LPTSTR pszCachePath) -{ - if (!Config_ReadGlobalString (TEXT("CachePath"), pszCachePath, MAX_PATH)) { - TCHAR szPath[MAX_PATH]; - GetWindowsDirectory(szPath, sizeof(szPath)); - szPath[2] = 0; /* get drive letter only */ - strcat(szPath, "\\AFSCache"); - - lstrcpy (pszCachePath, szPath); - } -} - -BOOL Config_SetCachePath(LPCTSTR pszPath, ULONG *pStatus) -{ - Config_WriteGlobalString (TEXT("CachePath"), pszPath); - g.fNeedRestart = TRUE; - return TRUE; -} - -void Config_GetLanAdapter (ULONG *pnLanAdapter) -{ - if (!Config_ReadGlobalNum (TEXT("LANadapter"), (DWORD*)pnLanAdapter)) - *pnLanAdapter = -1; -} - -BOOL Config_SetLanAdapter (ULONG nLanAdapter, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("LANadapter"), nLanAdapter); - g.fNeedRestart = TRUE; - return TRUE; -} - -void Config_GetTrapOnPanic (BOOL *pfFlag) -{ - if (!Config_ReadGlobalNum (TEXT("TrapOnPanic"), (DWORD*)pfFlag)) - *pfFlag = TRUE; -} - -BOOL Config_SetTrapOnPanic (BOOL fFlag, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("TrapOnPanic"), fFlag); - g.fNeedRestart = TRUE; - return TRUE; -} - -void Config_GetTraceBufferSize (ULONG *pnBufSize) -{ - if (!Config_ReadGlobalNum (TEXT("TraceBufferSize"), (DWORD*)pnBufSize)) - *pnBufSize = 5000; -} - -BOOL Config_SetTraceBufferSize (ULONG nBufSize, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("TraceBufferSize"), nBufSize); - g.fNeedRestart = TRUE; - return TRUE; -} - -void Config_GetLoginRetryInterval (ULONG *pnInterval) -{ - if (!Config_ReadGlobalNum (TEXT("LoginRetryInterval"), (DWORD*)pnInterval)) - *pnInterval = 30; -} - -BOOL Config_SetLoginRetryInterval (ULONG nInterval, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("LoginRetryInterval"), nInterval); - return TRUE; -} - -void Config_GetFailLoginsSilently (BOOL *pfFlag) -{ - if (!Config_ReadGlobalNum (TEXT("FailLoginsSilently"), (DWORD*)pfFlag)) - *pfFlag = FALSE; -} - -BOOL Config_SetFailLoginsSilently (BOOL fFlag, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("FailLoginsSilently"), fFlag); - return TRUE; -} - -void Config_GetReportSessionStartups (BOOL *pfFlag) -{ - if (!Config_ReadGlobalNum (TEXT("ReportSessionStartups"), (DWORD*)pfFlag)) - *pfFlag = FALSE; -} - -BOOL Config_SetReportSessionStartups (BOOL fFlag, ULONG *pStatus) -{ - Config_WriteGlobalNum (TEXT("ReportSessionStartups"), fFlag); - return TRUE; -} - diff --git a/src/WINNT/client_config/config.h b/src/WINNT/client_config/config.h deleted file mode 100644 index a838f23da..000000000 --- a/src/WINNT/client_config/config.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CONFIG_H -#define CONFIG_H - -#include -#include "drivemap.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define iRankREMOVED 0 - -typedef struct - { - int ipServer; - TCHAR szServer[ cchRESOURCE ]; - int iRank; - BOOL fChanged; - HLISTITEM hItem; - } SERVERPREF, *PSERVERPREF; - -typedef struct - { - BOOL fVLServers; - SERVERPREF *aPrefs; - size_t cPrefs; - } SERVERPREFS, *PSERVERPREFS; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -DWORD Config_GetServiceState (void); - -void Config_GetCellName (LPTSTR pszName); -BOOL Config_SetCellName (LPCTSTR pszName, ULONG *pStatus = NULL); - -void Config_GetGatewayFlag (BOOL *pfFlag); -BOOL Config_SetGatewayFlag (BOOL fFlag, ULONG *pStatus = NULL); - -void Config_GetGatewayName (LPTSTR pszName); -BOOL Config_SetGatewayName (LPCTSTR pszName, ULONG *pStatus = NULL); - -BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell); -void Config_FixGatewayDrives (void); - -void Config_GetTrayIconFlag (BOOL *pfFlag); -BOOL Config_SetTrayIconFlag (BOOL fFlag, ULONG *pStatus = NULL); - -PSERVERPREFS Config_GetServerPrefs (BOOL fVLServers); -BOOL Config_SetServerPrefs (PSERVERPREFS pPrefs, ULONG *pStatus = NULL); -void Config_FreeServerPrefs (PSERVERPREFS pPrefs); - -void Config_GetCacheSize (ULONG *pckCache); -BOOL Config_SetCacheSize (ULONG ckCache, ULONG *pStatus = NULL); -BOOL Config_GetCacheInUse (ULONG *pckCacheInUse, ULONG *pStatus = NULL); - -void Config_GetChunkSize (ULONG *pckChunk); -BOOL Config_SetChunkSize (ULONG ckChunk, ULONG *pStatus = NULL); - -void Config_GetStatEntries (ULONG *pcEntries); -BOOL Config_SetStatEntries (ULONG cEntries, ULONG *pStatus = NULL); - -void Config_GetProbeInt (ULONG *pcsecProbe); -BOOL Config_SetProbeInt (ULONG csecProbe, ULONG *pStatus = NULL); - -void Config_GetNumThreads (ULONG *pcThreads); -BOOL Config_SetNumThreads (ULONG cThreads, ULONG *pStatus = NULL); - -void Config_GetNumDaemons (ULONG *pcDaemons); -BOOL Config_SetNumDaemons (ULONG cDaemons, ULONG *pStatus = NULL); - -void Config_GetSysName (LPTSTR pszName); -BOOL Config_SetSysName (LPCTSTR pszName, ULONG *pStatus = NULL); - -void Config_GetRootVolume (LPTSTR pszName); -BOOL Config_SetRootVolume (LPCTSTR pszName, ULONG *pStatus = NULL); - -void Config_GetMountRoot (LPTSTR pszPath); -BOOL Config_SetMountRoot (LPCTSTR pszPath, ULONG *pStatus = NULL); - -void Config_GetCachePath (LPTSTR pszPath); -BOOL Config_SetCachePath (LPCTSTR pszPath, ULONG *pStatus = NULL); - -void Config_GetLanAdapter (ULONG *pnLanAdapter); -BOOL Config_SetLanAdapter (ULONG nLanAdapter, ULONG *pStatus = NULL); - -void Config_GetTrapOnPanic (BOOL *pfFlag); -BOOL Config_SetTrapOnPanic (BOOL fFlag, ULONG *pStatus = NULL); - -void Config_GetTraceBufferSize (ULONG *pnBufSize); -BOOL Config_SetTraceBufferSize (ULONG nBufSize, ULONG *pStatus = NULL); - -void Config_GetLoginRetryInterval (ULONG *pnBufSize); -BOOL Config_SetLoginRetryInterval (ULONG nInterval, ULONG *pStatus = NULL); - -void Config_GetFailLoginsSilently (BOOL *pfFlag); -BOOL Config_SetFailLoginsSilently (BOOL fFlag, ULONG *pStatus = NULL); - -void Config_GetReportSessionStartups (BOOL *pfFlag); -BOOL Config_SetReportSessionStartups (BOOL fFlag, ULONG *pStatus = NULL); - -void Config_GetGlobalDriveList (DRIVEMAPLIST *pDriveList); - -BOOL Config_ReadGlobalNum (LPCTSTR pszLHS, DWORD *pdwRHS); -BOOL Config_ReadGlobalString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax); -void Config_WriteGlobalNum (LPCTSTR pszLHS, DWORD dwRHS); -void Config_WriteGlobalString (LPCTSTR pszLHS, LPCTSTR pszRHS); - -BOOL Config_ReadUserNum (LPCTSTR pszLHS, DWORD *pdwRHS); -BOOL Config_ReadUserString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax); -void Config_WriteUserNum (LPCTSTR pszLHS, DWORD dwRHS); -void Config_WriteUserString (LPCTSTR pszLHS, LPCTSTR pszRHS); - - -#endif - diff --git a/src/WINNT/client_config/dlg_automap.cpp b/src/WINNT/client_config/dlg_automap.cpp deleted file mode 100644 index 842e98364..000000000 --- a/src/WINNT/client_config/dlg_automap.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} - -#include "afs_config.h" -#include -#include -#include - -/* - * DEFINITIONS ________________________________________________________________ - * - */ -static DRIVEMAPLIST GlobalDrives; -static TCHAR szHostName[128]; - -// DefineDosDrive actions -enum DDDACTION { DDD_ADD, DDD_REMOVE }; - -#define DRIVE_LETTER_INDEX 2 - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ -void AutoMap_OnInitDialog (HWND hDlg); -void AutoMap_OnAdd (HWND hDlg); -void AutoMap_OnSelect (HWND hDlg); -void AutoMap_OnEdit (HWND hDlg); -void AutoMap_OnRemove (HWND hDlg); - -void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives); -void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap); -void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap); -DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem = 0); -BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction = DDD_ADD); - -BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void AutoMapEdit_OnInitDialog (HWND hDlg); -void AutoMapEdit_OnOK (HWND hDlg); -void AutoMapEdit_Enable (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK AutoMap_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - AutoMap_OnInitDialog (hDlg); - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE)) - { - if (IsWindowEnabled ((HWND)lp)) - { - static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT)); - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)hbrStatic; - } - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - AutoMap_DlgProc (hDlg, WM_HELP, 0, 0); - break; - - case IDOK: - EndDialog(hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - break; - - case IDC_ADD: - AutoMap_OnAdd(hDlg); - break; - - case IDC_CHANGE: - AutoMap_OnEdit(hDlg); - break; - - case IDC_REMOVE: - AutoMap_OnRemove(hDlg); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - AutoMap_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT))) - AutoMap_OnEdit (hDlg); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP); - break; - } - - return FALSE; -} - - -void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap) -{ - int nCurDrive = DriveMap.chDrive - TEXT('A'); - - memcpy(&DriveMapList.aDriveMap[nCurDrive], &DriveMap, sizeof(DRIVEMAP)); -} - - -void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap) -{ - int nCurDrive = DriveMap.chDrive - TEXT('A'); - - memset(&DriveMapList.aDriveMap[nCurDrive], 0, sizeof(DRIVEMAP)); -} - - -void AutoMap_OnInitDialog (HWND hDlg) -{ - // Prepare the columns - HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST); - - FASTLISTCOLUMN Column; - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 65; - GetString (Column.szText, IDS_DRIVE); - FastList_SetColumn (hList, 0, &Column); - - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 266; - GetString (Column.szText, IDS_SUBCOL_PATH); - FastList_SetColumn (hList, 1, &Column); - - gethostname(szHostName, sizeof(szHostName)); - - Config_GetGlobalDriveList(&GlobalDrives); - - ShowDriveList(hDlg, GlobalDrives); -} - - -void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives) -{ - // Prepare the columns - HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST); - - // Fill in the list of drives - FastList_Begin (hList); - - FastList_RemoveAll(hList); - - for (size_t ii = 0; ii < 26; ++ii) { - if (!GlobalDrives.aDriveMap[ ii ].chDrive) - continue; - - HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST); - - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(FASTLISTADDITEM)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - // There must be DRIVE_LETTER_INDEX number of spaces before the ? character - ai.pszText = _tcsdup(TEXT(" ?:")); - ai.pszText[DRIVE_LETTER_INDEX] = GlobalDrives.aDriveMap[ ii ].chDrive; - ai.lParam = 0; - - HLISTITEM hItem = FastList_AddItem (hList, &ai); - - TCHAR szAfsPath[ MAX_PATH ]; - AdjustAfsPath (szAfsPath, GlobalDrives.aDriveMap[ ii ].szMapping, TRUE, FALSE); - - FastList_SetItemText (hList, hItem, 1, szAfsPath); - } - - FastList_End (hList); -} - - -BOOL UpdateRegistry(DRIVEMAP *pDrive, BOOL bRemove) -{ - TCHAR szKeyName[128]; - TCHAR szValueName[128]; - HKEY hKey; - LONG result; - DWORD dwDispo; - - if (!pDrive) - return FALSE; - - _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY)); - - if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDispo) != ERROR_SUCCESS) - return FALSE; - - _stprintf(szValueName, TEXT("%c:"), pDrive->chDrive); - - if (bRemove) - result = RegDeleteValue(hKey, szValueName); - else - result = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE *)pDrive->szSubmount, lstrlen(pDrive->szSubmount) + 1); - - RegCloseKey(hKey); - - return (result == ERROR_SUCCESS); -} - - -BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction) -{ - // TCHAR szAfsPath[MAX_PATH]; - // TCHAR szDrive[3] = TEXT("?:"); - BOOL fResult = FALSE; - - if (!pDrive) - return FALSE; - - if (dddAction == DDD_REMOVE) { - if (!(fResult=(DisMountDOSDrive(pDrive->chDrive)==NO_ERROR))) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError()); - } else if (dddAction == DDD_ADD) { - if (!(fResult=(MountDOSDrive(pDrive->chDrive, pDrive->szSubmount,FALSE)==NO_ERROR))) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError()); - } - /* - Replace this code with Drive mapping routine that doesn't require different formats for each OS - szDrive[0] = pDrive->chDrive; - _stprintf(szAfsPath, TEXT("\\Device\\LanmanRedirector\\%s\\%s-AFS\\%s"), szDrive, szHostName, pDrive->szSubmount); - - if (dddAction == DDD_REMOVE) { - fResult = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, szDrive, szAfsPath); - if (!fResult) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError()); - } else if (dddAction == DDD_ADD) { - fResult = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szAfsPath); - if (!fResult) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError()); - } - - */ - if (fResult) - UpdateRegistry(pDrive, dddAction == DDD_REMOVE); - - return fResult; -} - - -void AutoMap_OnAdd(HWND hDlg) -{ - DRIVEMAP DriveMap; - memset(&DriveMap, 0, sizeof(DRIVEMAP)); - - if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&DriveMap) != IDOK) - return; - - if (DriveMap.chDrive) { - if (DefineDosDrive(&DriveMap)) { - AddToDriveList(GlobalDrives, DriveMap); - ShowDriveList(hDlg, GlobalDrives); - } - } - - AutoMap_OnSelect(hDlg); -} - - -void AutoMap_OnSelect (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST); - - BOOL bEnable = FastList_FindFirstSelected (hList) != NULL; - - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), bEnable); - EnableWindow (GetDlgItem (hDlg, IDC_CHANGE), bEnable); -} - - -DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem) -{ - static DRIVEMAP DriveMap; - HLISTITEM hItem; - - HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST); - - if (!pItem) - pItem = &hItem; - - if ((*pItem = FastList_FindFirstSelected (hList)) == NULL) - return 0; - - LPCTSTR pszDrive = FastList_GetItemText (hList, *pItem, 0); - int nCurDrive = pszDrive[DRIVE_LETTER_INDEX] - TEXT('A'); - - memcpy(&DriveMap, &GlobalDrives.aDriveMap[nCurDrive], sizeof(DRIVEMAP)); - - return &DriveMap; -} - - -void AutoMap_OnEdit (HWND hDlg) -{ - DRIVEMAP *pOldDrive = GetSelectedDrive(hDlg); - if (!pOldDrive) - return; - - DRIVEMAP NewDrive; - memcpy(&NewDrive, pOldDrive, sizeof(DRIVEMAP)); - - if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&NewDrive) != IDOK) - return; - - if (DefineDosDrive(pOldDrive, DDD_REMOVE)) { - RemoveFromDriveList(GlobalDrives, *pOldDrive); - - if (DefineDosDrive(&NewDrive)) - AddToDriveList(GlobalDrives, NewDrive); - - ShowDriveList(hDlg, GlobalDrives); - } - - AutoMap_OnSelect(hDlg); -} - - -void AutoMap_OnRemove (HWND hDlg) -{ - HLISTITEM hItem; - - HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST); - - DRIVEMAP *pDrive = GetSelectedDrive(hDlg, &hItem); - if (pDrive == 0) - return; - - if (DefineDosDrive(pDrive, DDD_REMOVE)) { - RemoveFromDriveList(GlobalDrives, *pDrive); - FastList_RemoveItem (hList, hItem); - } - - AutoMap_OnSelect(hDlg); -} - - -BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - AutoMapEdit_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - AutoMapEdit_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_PATH: - AutoMapEdit_Enable (hDlg); - break; - - case IDHELP: - AutoMapEdit_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP_ADDEDIT); - break; - } - return FALSE; -} - - -void AutoMapEdit_OnInitDialog (HWND hDlg) -{ - PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER); - - DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used - - // Fill in the combo box - // - - if (pMap->chDrive != 0) - dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) ); - - int iItemSel = -1; - HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE); - SendMessage (hCombo, WM_SETREDRAW, FALSE, 0); - - for (int ii = 0; ii < 26; ++ii) - { - if (!(dwDrives & (1<chDrive && (ii == pMap->chDrive - chDRIVE_A)) - iItemSel = iItem; - else if ((!pMap->chDrive) && (iItemSel == -1)) - iItemSel = iItem; - } - } - - SendMessage (hCombo, WM_SETREDRAW, TRUE, 0); - SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0); - - TCHAR szMapping[ MAX_PATH ]; - AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE); - SetDlgItemText (hDlg, IDC_PATH, szMapping); - SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount); - - CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent)); - - AutoMapEdit_Enable (hDlg); -} - - -void AutoMapEdit_OnOK (HWND hDlg) -{ - PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER); - - int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0); - int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0); - - pMap->chDrive = chDRIVE_A + iDrive; - GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH); - GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH); - pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT); - - if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount)) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC); - return; - } - - if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) && - (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) ) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC); - return; - } - - // First get a proper submount - if (pMap->szSubmount[0]) { - TCHAR szNewSubmount[MAX_PATH]; - PathToSubmount (szNewSubmount, pMap->szMapping, pMap->szSubmount, 0); - if (lstrcmp(szNewSubmount, pMap->szSubmount) != 0) { - Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC); - return; - } - } else { // If no submount was specified, then get a new one - if (!PathToSubmount (pMap->szSubmount, pMap->szMapping, 0, 0)) { - return; - } - } - - EndDialog (hDlg, IDOK); -} - - -void AutoMapEdit_Enable (HWND hDlg) -{ - TCHAR szPath[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH); - EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0'))); -} - diff --git a/src/WINNT/client_config/dlg_binding.cpp b/src/WINNT/client_config/dlg_binding.cpp deleted file mode 100644 index 5ccfcdbaa..000000000 --- a/src/WINNT/client_config/dlg_binding.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} -#include -#include "afs_config.h" -#include - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -// Our dialog data -static BOOL fFirstTime = TRUE; -int nLanAdapter; -LANAINFO* lanainfo = NULL; - -int GetAdapterNumber(TCHAR*); - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Binding_OnInitDialog (HWND hDlg); -void Binding_OnOK(HWND hDlg); -void Binding_OnCancel(HWND hDlg); -BOOL Binding_OnApply(); - -BOOL isGateway = FALSE; -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Binding_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Binding_OnInitDialog (hDlg); - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE)) - { - if (IsWindowEnabled ((HWND)lp)) - { - static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT)); - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)hbrStatic; - } - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - Binding_DlgProc (hDlg, WM_HELP, 0, 0); - break; - - case IDOK: - Binding_OnOK(hDlg); - break; - - case IDCANCEL: - Binding_OnCancel(hDlg); - break; - case IDC_DEFAULTNIC: - if (HIWORD(wp) == BN_CLICKED) - { - TCHAR name[MAX_PATH]; - memset(name, 0, sizeof(name)); - if (IsDlgButtonChecked(hDlg,IDC_DEFAULTNIC)) - nLanAdapter=-1; - else - { - HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION); - if (SendMessage(hwndCombo, CB_GETCURSEL, 0, 0) == CB_ERR) - SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - - TCHAR selected[MAX_PATH]; - memset(selected, 0, sizeof(selected)); - SendDlgItemMessage(hDlg, IDC_NICSELECTION, - WM_GETTEXT, sizeof(selected), - (LPARAM) selected); - - if (_tcslen(selected) <= 0) - - nLanAdapter = -1; - else - nLanAdapter = GetAdapterNumber(selected); - } - - lana_GetAfsNameString(nLanAdapter, isGateway, name); - SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name); - EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1)); - break; - } - case IDC_NICSELECTION: - if (HIWORD(wp) == CBN_SELCHANGE) - { - TCHAR name[MAX_PATH]; - TCHAR selected[MAX_PATH]; - memset(name, 0, sizeof(name)); - memset(selected, 0, sizeof(selected)); - HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION); - int i = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0); - if (i != CB_ERR) - SendMessage(hwndCombo, CB_GETLBTEXT, (WPARAM)i, - (LPARAM) selected); - - if (_tcslen(selected) <= 0) - nLanAdapter = -1; - else - nLanAdapter = GetAdapterNumber(selected); - - - lana_GetAfsNameString(nLanAdapter, isGateway, name); - SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name); - break; - } - - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_MISC); - break; - } - - return FALSE; -} - - -void Binding_OnInitDialog (HWND hDlg) -{ - TCHAR name[MAX_PATH]; - memset(name, 0, sizeof(name)); - - if (fFirstTime) { - Config_GetLanAdapter(&g.Configuration.nLanAdapter); - nLanAdapter = g.Configuration.nLanAdapter; - isGateway = g.Configuration.fBeGateway; - fFirstTime = FALSE; - } - - lanainfo = lana_FindLanaByName(NULL); - - // TODO: Show more useful error message. - if (!lanainfo) { - MessageBox(hDlg, "Unable to obtain LANA list", "LANA ERROR", MB_ICONERROR); - } - else - { - HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION); - int index = 0; - TCHAR tmp[MAX_PATH]; - while (_tcslen(lanainfo[index].lana_name) > 0) - { - _stprintf(tmp, "%s (lana number = %d)", lanainfo[index].lana_name, - lanainfo[index].lana_number); - SendMessage(hwndCombo, CB_ADDSTRING, - 0, (LPARAM) tmp); - if (nLanAdapter == lanainfo[index].lana_number) - SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM)-1, - (LPARAM)tmp); - index++; - } - } - - lana_GetAfsNameString(nLanAdapter, isGateway, name); - SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name); - - CheckDlgButton (hDlg, IDC_DEFAULTNIC, (nLanAdapter==-1)); - - EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1)); -} - -void Binding_OnOK (HWND hDlg) -{ - if (IsDlgButtonChecked(hDlg,IDC_DEFAULTNIC)) - nLanAdapter = -1; - else - { - TCHAR selected[MAX_PATH]; - memset(selected, 0, sizeof(selected)); - SendDlgItemMessage(hDlg, IDC_NICSELECTION, - WM_GETTEXT, sizeof(selected), - (LPARAM) selected); - - if (_tcslen(selected) <= 0) - { - MessageBox(hDlg, "Please select the NIC to bind to", "Error", MB_ICONERROR); - return; - } - - nLanAdapter = GetAdapterNumber(selected); - - } - - EndDialog(hDlg, IDOK); -} - - -BOOL Binding_OnApply() -{ - if (fFirstTime) - return TRUE; - - if (nLanAdapter != g.Configuration.nLanAdapter) { - if (!Config_SetLanAdapter (nLanAdapter)) - return FALSE; - g.Configuration.nLanAdapter = nLanAdapter; - } - - return TRUE; - - -} - -void Binding_OnCancel(HWND hDlg) -{ - fFirstTime = TRUE; - - if (lanainfo) - { - delete lanainfo; - lanainfo = NULL; - } - - EndDialog(hDlg, IDCANCEL); -} - - -int GetAdapterNumber(TCHAR* n) -{ - int index = 0; - while (_tcslen(lanainfo[index].lana_name) > 0) - { - if (_tcsncmp(lanainfo[index].lana_name, n, _tcslen(lanainfo[index].lana_name)) == 0) - { - return lanainfo[index].lana_number; - } - index++; - } - - return -1; - -} diff --git a/src/WINNT/client_config/dlg_diag.cpp b/src/WINNT/client_config/dlg_diag.cpp deleted file mode 100644 index ac69f058c..000000000 --- a/src/WINNT/client_config/dlg_diag.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afs_config.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define nBUFSIZE_MIN 3000 -#define nBUFSIZE_MAX 32000 - -// Our dialog data -static BOOL fFirstTime = TRUE; -static DWORD nTraceBufSize; -static BOOL fTrapOnPanic; -static BOOL fReportSessionStartups; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Diag_OnInitDialog (HWND hDlg); -void Diag_OnOK(HWND hDlg); -void Diag_OnCancel(HWND hDlg); -BOOL Diag_OnApply(); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Diag_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Diag_OnInitDialog (hDlg); - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE)) - { - if (IsWindowEnabled ((HWND)lp)) - { - static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT)); - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)hbrStatic; - } - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - Diag_DlgProc (hDlg, WM_HELP, 0, 0); - break; - - case IDOK: - Diag_OnOK(hDlg); - break; - - case IDCANCEL: - Diag_OnCancel(hDlg); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_DIAG); - break; - } - - return FALSE; -} - -static void SetUpYesNoCombo(HWND hDlg, UINT nCtrlID, BOOL fInitialSetting) -{ - static TCHAR szYes[10] = TEXT(""); - static TCHAR szNo[10] = TEXT(""); - - if (!*szYes) { - GetString (szYes, IDS_YES); - GetString (szNo, IDS_NO); - } - - HWND hCombo = GetDlgItem(hDlg, nCtrlID); - - // Always add szNo first so it has index 0 and szYes has index 1 - CB_AddItem (hCombo, szNo, 0); - CB_AddItem (hCombo, szYes, 0); - - CB_SetSelected (hCombo, fInitialSetting); -} - -void Diag_OnInitDialog (HWND hDlg) -{ - if (fFirstTime) { - Config_GetTraceBufferSize(&g.Configuration.nTraceBufSize); - Config_GetTrapOnPanic(&g.Configuration.fTrapOnPanic); - Config_GetReportSessionStartups(&g.Configuration.fReportSessionStartups); - - nTraceBufSize = g.Configuration.nTraceBufSize; - fTrapOnPanic = g.Configuration.fTrapOnPanic; - fReportSessionStartups = g.Configuration.fReportSessionStartups; - - fFirstTime = FALSE; - } - - CreateSpinner (GetDlgItem (hDlg, IDC_TRACE_LOG_BUF_SIZE), 10, FALSE, nBUFSIZE_MIN, nTraceBufSize, nBUFSIZE_MAX); - - SetUpYesNoCombo(hDlg, IDC_TRAP_ON_PANIC, fTrapOnPanic); - SetUpYesNoCombo(hDlg, IDC_REPORT_SESSION_STARTUPS, fReportSessionStartups); -} - - -void Diag_OnOK (HWND hDlg) -{ - nTraceBufSize = SP_GetPos (GetDlgItem (hDlg, IDC_TRACE_LOG_BUF_SIZE)); - fTrapOnPanic = CB_GetSelected (GetDlgItem (hDlg, IDC_TRAP_ON_PANIC)); - fReportSessionStartups = CB_GetSelected (GetDlgItem (hDlg, IDC_REPORT_SESSION_STARTUPS)); - - EndDialog(hDlg, IDOK); -} - - -BOOL Diag_OnApply() -{ - if (fFirstTime) - return TRUE; - - if (nTraceBufSize != g.Configuration.nTraceBufSize) { - if (!Config_SetTraceBufferSize (nTraceBufSize)) - return FALSE; - g.Configuration.nTraceBufSize = nTraceBufSize; - } - - if (fTrapOnPanic != g.Configuration.fTrapOnPanic) { - if (!Config_SetTrapOnPanic (fTrapOnPanic)) - return FALSE; - g.Configuration.fTrapOnPanic = fTrapOnPanic; - } - - if (fReportSessionStartups != g.Configuration.fReportSessionStartups) { - if (!Config_SetReportSessionStartups (fReportSessionStartups)) - return FALSE; - g.Configuration.fReportSessionStartups = fReportSessionStartups; - } - - return TRUE; -} - - -void Diag_OnCancel(HWND hDlg) -{ - fFirstTime = TRUE; - - EndDialog(hDlg, IDCANCEL); -} diff --git a/src/WINNT/client_config/dlg_logon.cpp b/src/WINNT/client_config/dlg_logon.cpp deleted file mode 100644 index e61c0a0d6..000000000 --- a/src/WINNT/client_config/dlg_logon.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afs_config.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define nRETRY_MIN 5 -#define nRETRY_MAX 180 - -static TCHAR szYes[10] = TEXT("Yes"); -static TCHAR szNo[10] = TEXT("No"); - -// Our dialog data -static BOOL fFirstTime = TRUE; -static DWORD nLoginRetryInterval; -static BOOL fFailLoginsSilently; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Logon_OnInitDialog (HWND hDlg); -void Logon_OnOK (HWND hDlg); -void Logon_OnCancel(HWND hDlg); -BOOL Logon_OnApply(); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Logon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Logon_OnInitDialog (hDlg); - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE)) - { - if (IsWindowEnabled ((HWND)lp)) - { - static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT)); - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)hbrStatic; - } - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - Logon_DlgProc (hDlg, WM_HELP, 0, 0); - break; - - case IDOK: - Logon_OnOK(hDlg); - break; - - case IDCANCEL: - Logon_OnCancel(hDlg); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_LOGON); - break; - } - - return FALSE; -} - - -void Logon_OnInitDialog (HWND hDlg) -{ - if (fFirstTime) { - Config_GetLoginRetryInterval(&g.Configuration.nLoginRetryInterval); - Config_GetFailLoginsSilently(&g.Configuration.fFailLoginsSilently); - - nLoginRetryInterval = g.Configuration.nLoginRetryInterval; - fFailLoginsSilently = g.Configuration.fFailLoginsSilently; - - fFirstTime = FALSE; - } - - CreateSpinner (GetDlgItem (hDlg, IDC_LOGIN_RETRY_INTERVAL), 10, FALSE, nRETRY_MIN, nLoginRetryInterval, nRETRY_MAX); - - GetString (szYes, IDS_YES); - GetString (szNo, IDS_NO); - - HWND hCombo = GetDlgItem(hDlg, IDC_FAIL_SILENTLY); - - // Always add szNo first so it has index 0 and szYes has index 1 - CB_AddItem (hCombo, szNo, 0); - CB_AddItem (hCombo, szYes, 0); - - CB_SetSelected (hCombo, fFailLoginsSilently); -} - - -void Logon_OnOK (HWND hDlg) -{ - nLoginRetryInterval = SP_GetPos (GetDlgItem (hDlg, IDC_LOGIN_RETRY_INTERVAL)); - fFailLoginsSilently = CB_GetSelected (GetDlgItem (hDlg, IDC_FAIL_SILENTLY)); - - EndDialog(hDlg, IDOK); -} - - -BOOL Logon_OnApply() -{ - if (fFirstTime) - return TRUE; - - if (nLoginRetryInterval != g.Configuration.nLoginRetryInterval) { - if (!Config_SetLoginRetryInterval (nLoginRetryInterval)) - return FALSE; - g.Configuration.nLoginRetryInterval = nLoginRetryInterval; - } - - if (fFailLoginsSilently != g.Configuration.fFailLoginsSilently) { - if (!Config_SetFailLoginsSilently (fFailLoginsSilently)) - return FALSE; - g.Configuration.fFailLoginsSilently = fFailLoginsSilently; - } - - return TRUE; -} - - -void Logon_OnCancel(HWND hDlg) -{ - fFirstTime = TRUE; - - EndDialog(hDlg, IDCANCEL); -} diff --git a/src/WINNT/client_config/dlg_misc.cpp b/src/WINNT/client_config/dlg_misc.cpp deleted file mode 100644 index 9fafc0f82..000000000 --- a/src/WINNT/client_config/dlg_misc.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} -#include -#include "afs_config.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define nLANA_MIN 0 -#define nLANA_MAX 10 - -#define csecPROBE_MIN 1 -#define csecPROBE_MAX 600 - -#define cTHREADS_MIN 1 -#define cTHREADS_MAX 128 - -#define cDAEMONS_MIN 1 -#define cDAEMONS_MAX 128 - - -// Our dialog data -BOOL fFirstTime = TRUE; -#if undef -DWORD nLanAdapter; -#endif -DWORD csecProbe; -DWORD nThreads; -DWORD nDaemons; -TCHAR szSysName[ MAX_PATH ]; -TCHAR szRootVolume[ MAX_PATH ]; -TCHAR szMountDir[ MAX_PATH ]; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Misc_OnInitDialog (HWND hDlg); -void Misc_OnOK(HWND hDlg); -void Misc_OnCancel(HWND hDlg); -BOOL Misc_OnApply(); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Misc_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Misc_OnInitDialog (hDlg); - break; - - case WM_CTLCOLORSTATIC: - if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE)) - { - if (IsWindowEnabled ((HWND)lp)) - { - static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); - SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT)); - SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW)); - return (BOOL)hbrStatic; - } - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDHELP: - Misc_DlgProc (hDlg, WM_HELP, 0, 0); - break; - - case IDOK: - Misc_OnOK(hDlg); - break; - - case IDCANCEL: - Misc_OnCancel(hDlg); - break; -#if undef - case IDC_AUTOLANA: - if (IsDlgButtonChecked(hDlg,IDC_AUTOLANA)) - nLanAdapter=-1; - else - nLanAdapter=0; - SP_SetPos (GetDlgItem (hDlg, IDC_LAN_ADAPTER),nLanAdapter); - EnableWindow(GetDlgItem(hDlg,IDC_LAN_ADAPTER),(nLanAdapter!=-1)); -#endif - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_MISC); - break; - } - - return FALSE; -} - - -void Misc_OnInitDialog (HWND hDlg) -{ - if (fFirstTime) { -#if undef - Config_GetLanAdapter(&g.Configuration.nLanAdapter); -#endif - Config_GetProbeInt (&g.Configuration.csecProbe); - Config_GetNumThreads (&g.Configuration.nThreads); - Config_GetNumDaemons (&g.Configuration.nDaemons); - Config_GetSysName (g.Configuration.szSysName); - Config_GetRootVolume (g.Configuration.szRootVolume); - Config_GetMountRoot (g.Configuration.szMountDir); - -#if undef - nLanAdapter = g.Configuration.nLanAdapter; -#endif - csecProbe = g.Configuration.csecProbe; - nThreads = g.Configuration.nThreads; - nDaemons = g.Configuration.nDaemons; - lstrcpy(szSysName, g.Configuration.szSysName); - lstrcpy(szRootVolume, g.Configuration.szRootVolume); - lstrcpy(szMountDir, g.Configuration.szMountDir); - - fFirstTime = FALSE; - } - -#if undef - CreateSpinner (GetDlgItem (hDlg, IDC_LAN_ADAPTER), 99, FALSE, nLANA_MIN, nLanAdapter, nLANA_MAX); -#endif - CreateSpinner (GetDlgItem (hDlg, IDC_PROBE), 10, FALSE, csecPROBE_MIN, csecProbe, csecPROBE_MAX); - CreateSpinner (GetDlgItem (hDlg, IDC_THREADS), 10, FALSE, cTHREADS_MIN, nThreads, cTHREADS_MAX); - CreateSpinner (GetDlgItem (hDlg, IDC_DAEMONS), 10, FALSE, cDAEMONS_MIN, nDaemons, cDAEMONS_MAX); - - SetDlgItemText (hDlg, IDC_SYSNAME, szSysName); - SetDlgItemText (hDlg, IDC_ROOTVOLUME, szRootVolume); - SetDlgItemText (hDlg, IDC_MOUNTDIR, szMountDir); -#if undef - CheckDlgButton (hDlg, IDC_AUTOLANA, (nLanAdapter==-1)); - EnableWindow(GetDlgItem(hDlg,IDC_LAN_ADAPTER),(nLanAdapter!=-1)); -#endif -} - -void Misc_OnOK (HWND hDlg) -{ -#if undef - nLanAdapter = (IsDlgButtonChecked(hDlg,IDC_AUTOLANA))?-1 - :SP_GetPos (GetDlgItem (hDlg, IDC_LAN_ADAPTER)); -#endif - csecProbe = SP_GetPos (GetDlgItem (hDlg, IDC_PROBE)); - - nThreads = SP_GetPos (GetDlgItem (hDlg, IDC_THREADS)); - - nDaemons = SP_GetPos (GetDlgItem (hDlg, IDC_DAEMONS)); - - GetDlgItemText (hDlg, IDC_SYSNAME, szSysName, sizeof(szSysName)); - GetDlgItemText (hDlg, IDC_ROOTVOLUME, szRootVolume, sizeof(szRootVolume)); - GetDlgItemText (hDlg, IDC_MOUNTDIR, szMountDir, sizeof(szMountDir)); - - EndDialog(hDlg, IDOK); -} - - -BOOL Misc_OnApply() -{ - if (fFirstTime) - return TRUE; - -#if undef - if (nLanAdapter != g.Configuration.nLanAdapter) { - if (!Config_SetLanAdapter (nLanAdapter)) - return FALSE; - g.Configuration.nLanAdapter = nLanAdapter; - } -#endif - - if (csecProbe != g.Configuration.csecProbe) { - if (!Config_SetProbeInt (csecProbe)) - return FALSE; - g.Configuration.csecProbe = csecProbe; - } - - if (nThreads != g.Configuration.nThreads) { - if (!Config_SetNumThreads (nThreads)) - return FALSE; - g.Configuration.nThreads = nThreads; - } - - if (nDaemons != g.Configuration.nDaemons) { - if (!Config_SetNumDaemons (nDaemons)) - return FALSE; - g.Configuration.nDaemons = nDaemons; - } - - if (lstrcmp(szSysName, g.Configuration.szSysName) != 0) { - if (!Config_SetSysName (szSysName)) - return FALSE; - lstrcpy(g.Configuration.szSysName, szSysName); - } - - if (lstrcmp(szRootVolume, g.Configuration.szRootVolume) != 0) { - if (!Config_SetRootVolume (szRootVolume)) - return FALSE; - lstrcpy(g.Configuration.szRootVolume, szRootVolume); - } - - if (lstrcmp(szMountDir, g.Configuration.szMountDir) != 0) { - if (!Config_SetMountRoot (szMountDir)) - return FALSE; - lstrcpy(g.Configuration.szMountDir, szMountDir); - } - - return TRUE; -} - -void Misc_OnCancel(HWND hDlg) -{ - fFirstTime = TRUE; - - EndDialog(hDlg, IDCANCEL); -} - diff --git a/src/WINNT/client_config/down.ico b/src/WINNT/client_config/down.ico deleted file mode 100644 index 85d9620db76f579cfc700737263775580fcb21df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmdT?yAHxI40I`bm{^;U5h))4e@6a^(Mvvsk+CCE5XZS)>Z%fDgLBTWbF2&zX=pL- z#Bkq;>=_SaB+q0cTY8a9Z5f#&m7K>w&s0h&j3!_>0$4`UtYz*$(axS-kFF8)>guXG u9SEv!piMO;e_=XKWw!t88ogWpI|cv1db~LLya10A(09NsjI`bo@fmOHc%VoC diff --git a/src/WINNT/client_config/drivemap.cpp b/src/WINNT/client_config/drivemap.cpp deleted file mode 100644 index 75e1bf949..000000000 --- a/src/WINNT/client_config/drivemap.cpp +++ /dev/null @@ -1,1403 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -#include -} -#include -#include -#include -#include -#include -#undef REALLOC -#include "drivemap.h" -#include -#include -#ifdef DEBUG -#define DEBUG_VERBOSE -#endif -#include -#include -#include - -extern void Config_GetLanAdapter (ULONG *pnLanAdapter); - -/* - * REGISTRY ___________________________________________________________________ - * - */ - - -/* - * PROFILE SECTIONS ___________________________________________________________ - * - */ - -#define cREALLOC_SUBMOUNTS 4 - -static TCHAR cszSECTION_SUBMOUNTS[] = TEXT(AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts"); -static TCHAR cszSECTION_MAPPINGS[] = TEXT(AFSREG_CLT_OPENAFS_SUBKEY "\\Mappings"); -static TCHAR cszSECTION_ACTIVE[] = TEXT(AFSREG_CLT_OPENAFS_SUBKEY "\\Active Maps"); - -static TCHAR cszAUTOSUBMOUNT[] = TEXT("Auto"); -static TCHAR cszLANMANDEVICE[] = TEXT("\\Device\\LanmanRedirector\\"); - - -static BOOL -WriteRegistryString(HKEY key, TCHAR * subkey, LPTSTR lhs, LPTSTR rhs) -{ - HKEY hkSub = NULL; - RegCreateKeyEx( key, - subkey, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hkSub, - NULL); - - DWORD status = RegSetValueEx( hkSub, lhs, 0, REG_SZ, (const BYTE *)rhs, strlen(rhs)+1 ); - - if ( hkSub ) - RegCloseKey( hkSub ); - - return (status == ERROR_SUCCESS); -} - -static BOOL -WriteExpandedRegistryString(HKEY key, TCHAR * subkey, LPTSTR lhs, LPTSTR rhs) -{ - HKEY hkSub = NULL; - RegCreateKeyEx( key, - subkey, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hkSub, - NULL); - - DWORD status = RegSetValueEx( hkSub, lhs, 0, REG_EXPAND_SZ, (const BYTE *)rhs, strlen(rhs)+1 ); - - if ( hkSub ) - RegCloseKey( hkSub ); - - return (status == ERROR_SUCCESS); -} - -static BOOL -ReadRegistryString(HKEY key, TCHAR * subkey, LPTSTR lhs, LPTSTR rhs, DWORD * size) -{ - HKEY hkSub = NULL; - RegCreateKeyEx( key, - subkey, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ, - NULL, - &hkSub, - NULL); - - DWORD dwType = 0; - DWORD localSize = *size; - - DWORD status = RegQueryValueEx( hkSub, lhs, 0, &dwType, (LPBYTE)rhs, &localSize); - if (status == 0 && dwType == REG_EXPAND_SZ) { - TCHAR * buf = (TCHAR *)malloc((*size) * sizeof(TCHAR)); - memcpy(buf, rhs, (*size) * sizeof(TCHAR)); - localSize = ExpandEnvironmentStrings(buf, rhs, *size); - free(buf); - if ( localSize > *size ) - status = !ERROR_SUCCESS; - } - *size = localSize; - - if ( hkSub ) - RegCloseKey( hkSub ); - - return (status == ERROR_SUCCESS); -} - -static BOOL -DeleteRegistryString(HKEY key, TCHAR * subkey, LPTSTR lhs) -{ - HKEY hkSub = NULL; - RegCreateKeyEx( key, - subkey, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hkSub, - NULL); - - DWORD status = RegDeleteValue( hkSub, lhs ); - - if ( hkSub ) - RegCloseKey( hkSub ); - - return (status == ERROR_SUCCESS); -} - -/* - * STRINGS ____________________________________________________________________ - * - */ - -static LPTSTR AllocateStringMemory (size_t cch) -{ - LPTSTR psz = (LPTSTR)Allocate (sizeof(TCHAR) * (cch+1)); - memset (psz, 0x00, sizeof(TCHAR) * (cch+1)); - return psz; -} - -static void FreeStringMemory (LPTSTR pszString) -{ - Free (pszString); -} - -static int lstrncmpi (LPCTSTR pszA, LPCTSTR pszB, size_t cch) -{ - if (!pszA || !pszB) - { - return (!pszB) - (!pszA); // A,!B:1, !A,B:-1, !A,!B:0 - } - - for ( ; cch > 0; cch--, pszA = CharNext(pszA), pszB = CharNext(pszB)) - { - TCHAR chA = toupper( *pszA ); - TCHAR chB = toupper( *pszB ); - - if (!chA || !chB) - return (!chB) - (!chA); // A,!B:1, !A,B:-1, !A,!B:0 - - if (chA != chB) - return (int)(chA) - (int)(chB); // -1:AB - } - - return 0; // no differences before told to stop comparing, so A==B -} - - -/* - * REALLOC ____________________________________________________________________ - * - */ - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) DriveMapReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -BOOL DriveMapReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} -#endif - - -/* - * WINDOWS NT STUFF ___________________________________________________________ - * - */ - -static BOOL IsWindowsNT (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsWinNT = FALSE; - - if (!fChecked) - { - fChecked = TRUE; - - OSVERSIONINFO Version; - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - - if (GetVersionEx (&Version)) - { - if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) - fIsWinNT = TRUE; - } - } - - return fIsWinNT; -} - -/* Check if the OS is Windows 2000 or higher. -*/ -BOOL IsWindows2000 (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsWin2K = FALSE; - - if (!fChecked) - { - fChecked = TRUE; - - OSVERSIONINFO Version; - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - - if (GetVersionEx (&Version)) - { - if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT && - Version.dwMajorVersion >= 5) - fIsWin2K = TRUE; - } - } - - return fIsWin2K; -} - -/* - * GENERAL ____________________________________________________________________ - * - */ - -void GetClientNetbiosName (LPTSTR pszName) -{ - static TCHAR szNetbiosName[32] = ""; - - if ( szNetbiosName[0] == 0 ) { - lana_GetNetbiosName(szNetbiosName, LANA_NETBIOS_NAME_FULL); - } - _tcscpy(pszName, szNetbiosName); -} - - -BOOL SubmountToPath (PDRIVEMAPLIST pList, LPTSTR pszPath, LPTSTR pszSubmount, BOOL fMarkInUse) -{ - // We can't do this translation unless we're under Windows NT. - // - if (!IsWindowsNT()) - return FALSE; - - // \\computer-afs\all always maps to "/afs" - // - if (!lstrcmpi (pszSubmount, TEXT("all"))) - { - lstrcpy (pszPath, cm_slash_mount_root); - return TRUE; - } - - // Otherwise, look up our list of submounts. - // - for (size_t ii = 0; ii < pList->cSubmounts; ++ii) - { - if (!lstrcmpi (pList->aSubmounts[ii].szSubmount, pszSubmount)) - { - if (fMarkInUse) - pList->aSubmounts[ii].fInUse = TRUE; - AdjustAfsPath (pszPath, pList->aSubmounts[ii].szMapping, TRUE, TRUE); - return TRUE; - } - } - - return FALSE; -} - - -BOOL IsValidSubmountName (LPTSTR pszSubmount) -{ - if (!*pszSubmount) - return FALSE; - if (lstrlen (pszSubmount) > 12) - return FALSE; - - for ( ; *pszSubmount; ++pszSubmount) - { - if (!isprint(*pszSubmount)) - return FALSE; - if (*pszSubmount == TEXT(' ')) - return FALSE; - if (*pszSubmount == TEXT('/')) - return FALSE; - if (*pszSubmount == TEXT('\\')) - return FALSE; - if (*pszSubmount == TEXT('\t')) - return FALSE; - } - - return TRUE; -} - - -/* - * PIOCTL SUPPORT _____________________________________________________________ - * - */ - -extern "C" { - -#include "../afsd/fs_utils.h" - -#define __CM_CONFIG_INTERFACES_ONLY__ -#include "../afsd/cm_config.h" - -#define __CM_IOCTL_INTERFACES_ONLY__ -#include "../afsd/cm_ioctl.h" - -} // extern "C" - -#define PIOCTL_MAXSIZE 2048 - - -BOOL fCanIssuePIOCTL (void) -{ - if (!IsWindowsNT()) - { - TCHAR szGateway[ 256 ] = TEXT(""); - GetClientNetbiosName (szGateway); - return (szGateway[0]) ? TRUE : FALSE; - } - - SERVICE_STATUS Status; - memset (&Status, 0x00, sizeof(Status)); - Status.dwCurrentState = SERVICE_STOPPED; - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) - { - QueryServiceStatus (hService, &Status); - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - - return (Status.dwCurrentState == SERVICE_RUNNING) ? TRUE : FALSE; -} - - -/* - * QUERYDRIVEMAPLIST __________________________________________________________ - * - */ - -void QueryDriveMapList_ReadSubmounts (PDRIVEMAPLIST pList) -{ - if (IsWindowsNT()) - { - HKEY hkSubmounts; - - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - cszSECTION_SUBMOUNTS, - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_QUERY_VALUE, - NULL, - &hkSubmounts, - NULL ); - - DWORD dwSubmounts; - RegQueryInfoKey( hkSubmounts, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwSubmounts, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( DWORD dwIndex = 0; dwIndex < dwSubmounts; dwIndex ++ ) { - TCHAR submountPath[MAX_PATH] = ""; - DWORD submountPathLen = MAX_PATH; - TCHAR submountName[MAX_PATH]; - DWORD submountNameLen = MAX_PATH; - DWORD dwType = 0; - - RegEnumValue( hkSubmounts, dwIndex, submountName, &submountNameLen, NULL, - &dwType, (LPBYTE)submountPath, &submountPathLen); - - if (dwType == REG_EXPAND_SZ) { - char buf[MAX_PATH]; - StringCbCopyA(buf, MAX_PATH, submountPath); - submountPathLen = ExpandEnvironmentStrings(buf, submountPath, MAX_PATH); - if (submountPathLen > MAX_PATH) - continue; - } - - SUBMOUNT Submount; - memset (&Submount, 0x00, sizeof(SUBMOUNT)); - lstrcpy (Submount.szSubmount, submountName); - - if ( submountPath[0] != TEXT('\0') ) { - AdjustAfsPath (Submount.szMapping, submountPath, FALSE, TRUE); - - for (size_t ii = 0; ii < pList->cSubmounts; ++ii) - { - if (!pList->aSubmounts[ii].szSubmount[0]) - break; - } - if (REALLOC (pList->aSubmounts, pList->cSubmounts, 1+ii, cREALLOC_SUBMOUNTS)) - { - memcpy (&pList->aSubmounts[ii], &Submount, sizeof(SUBMOUNT)); - } - } - - } - RegCloseKey(hkSubmounts); - } -} - - -void QueryDriveMapList_ReadMappings (PDRIVEMAPLIST pList) -{ - HKEY hkMappings; - RegCreateKeyEx( HKEY_CURRENT_USER, - cszSECTION_MAPPINGS, - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_QUERY_VALUE, - NULL, - &hkMappings, - NULL ); - - DWORD dwMappings; - RegQueryInfoKey( hkMappings, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwMappings, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - for ( DWORD dwIndex = 0; dwIndex < dwMappings; dwIndex ++ ) { - TCHAR mapping[MAX_PATH] = ""; - DWORD mappingLen = MAX_PATH; - TCHAR drive[MAX_PATH]; - DWORD driveLen = MAX_PATH; - DWORD dwType; - - RegEnumValue( hkMappings, dwIndex, drive, &driveLen, NULL, - &dwType, (LPBYTE)mapping, &mappingLen); - if ( dwType == REG_EXPAND_SZ ) { - TCHAR buf[MAX_PATH]; - DWORD dummyLen = ExpandEnvironmentStrings(mapping, buf, MAX_PATH); - if (dummyLen > MAX_PATH) - continue; - _tcsncpy(mapping, buf, MAX_PATH); - } - - DRIVEMAP DriveMap; - memset (&DriveMap, 0x00, sizeof(DRIVEMAP)); - DriveMap.chDrive = toupper(*drive); - DriveMap.fPersistent = TRUE; - if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z)) - continue; - - if (mapping[0] != TEXT('\0')) - { - AdjustAfsPath (DriveMap.szMapping, mapping, TRUE, TRUE); - if (DriveMap.szMapping[ lstrlen(DriveMap.szMapping)-1 ] == TEXT('*')) - { - DriveMap.fPersistent = FALSE; - DriveMap.szMapping[ lstrlen(DriveMap.szMapping)-1 ] = TEXT('\0'); - } - size_t iDrive = DriveMap.chDrive - chDRIVE_A; - memcpy (&pList->aDriveMap[ iDrive ], &DriveMap, sizeof(DRIVEMAP)); - } - } - - RegCloseKey(hkMappings); -} - -BOOL ForceMapActive (TCHAR chDrive) -{ - TCHAR szDrive[2]; - TCHAR szActive[32]; - - szDrive[0] = chDrive; - szDrive[1] = 0; - - DWORD len = sizeof(szActive); - ReadRegistryString( HKEY_CURRENT_USER, cszSECTION_ACTIVE, szDrive, szActive, &len); - - if ( !lstrcmp(szActive,"1") || !lstrcmpi(szActive,"true") || !lstrcmpi(szActive,"on") || !lstrcmpi(szActive,"yes") ) - return TRUE; - return FALSE; -} - - -void WriteActiveMap (TCHAR chDrive, BOOL on) -{ - TCHAR szDrive[2]; - - szDrive[0] = chDrive; - szDrive[1] = 0; - - WriteRegistryString(HKEY_CURRENT_USER, cszSECTION_ACTIVE, szDrive, on ? "1" : "0"); -} - -void QueryDriveMapList_WriteMappings (PDRIVEMAPLIST pList) -{ - WriteDriveMappings (pList); -} - - -void WriteDriveMappings (PDRIVEMAPLIST pList) -{ - HKEY hkMappings; - RegCreateKeyEx( HKEY_CURRENT_USER, - cszSECTION_MAPPINGS, - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_QUERY_VALUE|KEY_WRITE, - NULL, - &hkMappings, - NULL ); - - DWORD dwMappings; - RegQueryInfoKey( hkMappings, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwMappings, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - if ( dwMappings > 0 ) { - for ( long dwIndex = dwMappings - 1; dwIndex >= 0; dwIndex-- ) { - TCHAR drive[MAX_PATH]; - DWORD driveLen = MAX_PATH; - - RegEnumValue( hkMappings, dwIndex, drive, &driveLen, NULL, NULL, NULL, NULL); - RegDeleteValue( hkMappings, drive ); - } - } - - for (size_t iDrive = 0; iDrive < 26; ++iDrive) - { - if (pList->aDriveMap[iDrive].szMapping[0] != TEXT('\0')) - { - TCHAR szLHS[] = TEXT("*"); - szLHS[0] = pList->aDriveMap[iDrive].chDrive; - - TCHAR szRHS[MAX_PATH]; - AdjustAfsPath (szRHS, pList->aDriveMap[iDrive].szMapping, TRUE, TRUE); - if (!pList->aDriveMap[iDrive].fPersistent) - lstrcat (szRHS, TEXT("*")); - - RegSetValueEx( hkMappings, szLHS, 0, REG_EXPAND_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1); - } - } - RegCloseKey( hkMappings ); -} - -BOOL DriveIsGlobalAfsDrive(TCHAR chDrive) -{ - TCHAR szKeyName[128]; - TCHAR szValueName[128]; - TCHAR szValue[128]; - HKEY hKey; - - _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), AFSREG_CLT_SVC_PARAM_SUBKEY); - - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) - return FALSE; - - _stprintf(szValueName, TEXT("%c:"), chDrive); - - DWORD dwSize = sizeof(szValue); - BOOL bIsGlobal = (RegQueryValueEx (hKey, szValueName, NULL, NULL, (PBYTE)szValue, &dwSize) == ERROR_SUCCESS); - - RegCloseKey (hKey); - - return bIsGlobal; -} - - -void QueryDriveMapList_FindNetworkDrives (PDRIVEMAPLIST pList, BOOL *pfFoundNew) -{ - for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive) - { - TCHAR szSubmount[ MAX_PATH ]; - if (!GetDriveSubmount (chDrive, szSubmount)) - continue; - - // We've got a mapping! Drive {chDrive} is mapped to submount - // {szSubmount}. See if that submount makes sense. - // - if (!IsWindowsNT()) - { - size_t iDrive = chDrive - chDRIVE_A; - if (pList->aDriveMap[ iDrive ].szMapping[0] != TEXT('\0')) - { - pList->aDriveMap[ iDrive ].fActive = TRUE; - lstrcpy (pList->aDriveMap[ iDrive ].szSubmount, szSubmount); - } - continue; - } - else // (IsWindowsNT()) - { - TCHAR szAfsPath[ MAX_PATH ]; - if (!SubmountToPath (pList, szAfsPath, szSubmount, TRUE)) - continue; - - // Okay, we know that drive {chDrive} is mapped to afs path {szAfsPath}. - // If this drive is a global afs drive, then reject it. Otherwise, look - // at pList->aDriveMap, to see if this drive mapping is already in our - // list. If not, add it and set pfFoundNew. - // - if (DriveIsGlobalAfsDrive(chDrive)) - continue; - - size_t iDrive = chDrive - chDRIVE_A; - if (lstrcmpi (pList->aDriveMap[ iDrive ].szMapping, szAfsPath)) - { - *pfFoundNew = TRUE; - pList->aDriveMap[ iDrive ].fPersistent = TRUE; - } - pList->aDriveMap[ iDrive ].fActive = TRUE; - pList->aDriveMap[ iDrive ].chDrive = chDrive; - lstrcpy (pList->aDriveMap[ iDrive ].szSubmount, szSubmount); - AdjustAfsPath (pList->aDriveMap[ iDrive ].szMapping, szAfsPath, TRUE, TRUE); - } - } -} - - -void QueryDriveMapList (PDRIVEMAPLIST pList) -{ - // Initialize the data structure - // - memset (pList, 0x00, sizeof(DRIVEMAPLIST)); - for (size_t ii = 0; ii < 26; ++ii) - pList->aDriveMap[ii].chDrive = chDRIVE_A + ii; - - // Read the current lists of submounts and drive letter mappings - // - QueryDriveMapList_ReadSubmounts (pList); - QueryDriveMapList_ReadMappings (pList); - - // Look through the current list of network drives, and see if - // any are currently mapped to AFS. If we find any which are mapped - // into AFS unexpectedly, we'll have to rewrite the mappings list. - // - BOOL fFoundNew = FALSE; - QueryDriveMapList_FindNetworkDrives (pList, &fFoundNew); - - if (fFoundNew) - { - QueryDriveMapList_WriteMappings (pList); - } -} - - -void FreeDriveMapList (PDRIVEMAPLIST pList) -{ - if (pList->aSubmounts) - Free (pList->aSubmounts); - memset (pList, 0x00, sizeof(DRIVEMAPLIST)); -} - - -BOOL PathToSubmount (LPTSTR pszSubmount, LPTSTR pszMapping, LPTSTR pszSubmountReq, ULONG *pStatus) -{ - if (pszSubmountReq && !IsValidSubmountName (pszSubmountReq)) - pszSubmountReq = NULL; - - TCHAR szAfsPath[ MAX_PATH ]; - AdjustAfsPath (szAfsPath, pszMapping, TRUE, TRUE); - - // Try to ask AFSD for a new submount name. - // - if (!fCanIssuePIOCTL()) - return FALSE; - - BYTE InData[ PIOCTL_MAXSIZE ]; - memset (InData, 0x00, sizeof(InData)); - - LPTSTR pszInData = (LPTSTR)InData; - lstrcpy (pszInData, pszMapping); - pszInData += 1+lstrlen(pszInData); - if (pszSubmountReq) - lstrcpy (pszInData, pszSubmountReq); - - BYTE OutData[ PIOCTL_MAXSIZE ]; - memset (OutData, 0x00, sizeof(OutData)); - - struct ViceIoctl IOInfo; - IOInfo.in = (char *)InData; - IOInfo.in_size = PIOCTL_MAXSIZE; - IOInfo.out = (char *)OutData; - IOInfo.out_size = PIOCTL_MAXSIZE; - - ULONG status = pioctl (0, VIOC_MAKESUBMOUNT, &IOInfo, 1); - if (pStatus) - *pStatus = status; - - if (status) - return FALSE; - - lstrcpy (pszSubmount, (LPCTSTR)OutData); - return (pszSubmount[0] != TEXT('\0')) ? TRUE : FALSE; -} - - -BOOL ActivateDriveMap (TCHAR chDrive, LPTSTR pszMapping, LPTSTR pszSubmountReq, BOOL fPersistent, DWORD *pdwStatus) -{ - // We can only map drives to places in AFS using this function. - // - if ( (lstrncmpi (pszMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) && - (lstrncmpi (pszMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) ) - { - if (pdwStatus) - *pdwStatus = ERROR_BAD_NETPATH; - return FALSE; - } - - // First we have to translate {pszMapping} into a submount, and if there is - // no current submount associated with this path, we'll have to make one. - // - ULONG status; - TCHAR szSubmount[ MAX_PATH ]; - if (!PathToSubmount (szSubmount, pszMapping, pszSubmountReq, &status)) - { - if (pdwStatus) - *pdwStatus = status; - return FALSE; - } - - // We now have a submount name and drive letter--map the network drive. - DWORD rc=MountDOSDrive(chDrive,szSubmount,fPersistent,NULL); - if (rc == NO_ERROR) - return TRUE; - - if (pdwStatus) - *pdwStatus = rc; - return FALSE; -} - - -BOOL InactivateDriveMap (TCHAR chDrive, DWORD *pdwStatus) -{ - DWORD rc = DisMountDOSDrive(chDrive, FALSE); - if (rc == NO_ERROR) - return TRUE; - - if (pdwStatus) - *pdwStatus = rc; - return FALSE; -} - - -void AddSubMount (LPTSTR pszSubmount, LPTSTR pszMapping) -{ - TCHAR szRHS[ MAX_PATH ]; - AdjustAfsPath (szRHS, pszMapping, FALSE, TRUE); - if (!szRHS[0]) - lstrcpy (szRHS, TEXT("/")); - - WriteExpandedRegistryString(HKEY_LOCAL_MACHINE, cszSECTION_SUBMOUNTS, pszSubmount, szRHS); -} - - -void RemoveSubMount (LPTSTR pszSubmount) -{ - DeleteRegistryString(HKEY_LOCAL_MACHINE, cszSECTION_SUBMOUNTS, pszSubmount); -} - - -void AdjustAfsPath (LPTSTR pszTarget, LPCTSTR pszSource, BOOL fWantAFS, BOOL fWantForwardSlashes) -{ - if (!*pszSource) - lstrcpy (pszTarget, (fWantAFS) ? cm_slash_mount_root : TEXT("")); - else if ((*pszSource != TEXT('/')) && (*pszSource != TEXT('\\'))) - wsprintf (pszTarget, TEXT("%s/%s"),cm_slash_mount_root, pszSource); - // We don't want to strip afs off the start if it is part of something for example afscell.company.com - else if (fWantAFS && (lstrncmpi (&pszSource[1], cm_mount_root, strlen(cm_mount_root))) || !((pszSource[strlen(cm_slash_mount_root)] == TEXT('/')) || - (pszSource[strlen(cm_slash_mount_root)] == TEXT('\\')) || - (lstrlen(pszSource) == strlen(cm_slash_mount_root)))) - wsprintf (pszTarget, TEXT("%s%s"),cm_slash_mount_root, pszSource); - else if (!fWantAFS && (!lstrncmpi (&pszSource[1], cm_mount_root, strlen(cm_mount_root)) && ((pszSource[strlen(cm_slash_mount_root)] == TEXT('/')) || - (pszSource[strlen(cm_slash_mount_root)] == TEXT('\\')) || - (lstrlen(pszSource) == strlen(cm_slash_mount_root))))) - lstrcpy (pszTarget, &pszSource[strlen(cm_slash_mount_root)]); - else - lstrcpy (pszTarget, pszSource); - - for (LPTSTR pch = pszTarget; *pch; ++pch) - { - if (fWantForwardSlashes) - { - *pch = (*pch == TEXT('\\')) ? TEXT('/') : (*pch); - } - else // (!fWantForwardSlashes) - { - *pch = (*pch == TEXT('/')) ? TEXT('\\') : (*pch); - } - } - - if (lstrlen(pszTarget) && - ((pszTarget[lstrlen(pszTarget)-1] == TEXT('/')) || - (pszTarget[lstrlen(pszTarget)-1] == TEXT('\\')))) - { - pszTarget[lstrlen(pszTarget)-1] = TEXT('\0'); - } -} - -BOOL GetDriveSubmount (TCHAR chDrive, LPTSTR pszSubmountNow) -{ - BOOL isWinNT = IsWindowsNT(); - - TCHAR szDrive[] = TEXT("*:"); - szDrive[0] = chDrive; - - TCHAR szMapping[ _MAX_PATH ] = TEXT(""); - - if (isWinNT && !QueryDosDevice (szDrive, szMapping, MAX_PATH)) - return FALSE; - - LPTSTR pszSubmount = szMapping; - - TCHAR szNetBiosName[32]; - memset(szNetBiosName, '\0', sizeof(szNetBiosName)); - GetClientNetbiosName(szNetBiosName); - _tcscat(szNetBiosName, TEXT("\\")); - - if (isWinNT) - { - // Now if this is an AFS network drive mapping, {szMapping} will be: - // - // \Device\LanmanRedirector\:\\submount - // - // on Windows NT. On Windows 2000, it will be: - // - // \Device\LanmanRedirector\;:0\\submount - // - // (This is presumably to support multiple drive mappings with - // Terminal Server). - // - // on Windows XP and 2003, it will be : - // \Device\LanmanRedirector\;:\\submount - // - // where : : DOS drive letter - // : Authentication ID, 16 char hex. - // : Netbios name of server - // - if (_tcsnicmp(szMapping, cszLANMANDEVICE, _tcslen(cszLANMANDEVICE))) - return FALSE; - pszSubmount = &szMapping[ _tcslen(cszLANMANDEVICE) ]; - - if (IsWindows2000()) - { - if (*(pszSubmount) != TEXT(';')) - return FALSE; - } else - --pszSubmount; - - if (toupper(*(++pszSubmount)) != chDrive) - return FALSE; - - if (*(++pszSubmount) != TEXT(':')) - return FALSE; - -#ifdef COMMENT - // No longer a safe assumption on XP - if (IsWindows2000()) - if (*(++pszSubmount) != TEXT('0')) - return FALSE; -#endif - - // scan for next "\" - while (*(++pszSubmount) != TEXT('\\')) - { - if (*pszSubmount==0) - return FALSE; - } - - // note that szNetBiosName has a '\\' tagged in the end earlier - for (++pszSubmount; *pszSubmount && (*pszSubmount != TEXT('\\')); ++pszSubmount) - if (!_tcsncicmp(pszSubmount, szNetBiosName, _tcslen(szNetBiosName))) - break; - if ((!*pszSubmount) || (*pszSubmount == TEXT('\\'))) - return FALSE; - - pszSubmount += _tcslen(szNetBiosName); - } - else // (!IsWindowsNT()) - { - DWORD dwSize = MAX_PATH; - if (WNetGetConnection (szDrive, szMapping, &dwSize) != NO_ERROR) - return FALSE; - if (*(pszSubmount++) != TEXT('\\')) - return FALSE; - if (*(pszSubmount++) != TEXT('\\')) - return FALSE; - for ( ; *pszSubmount && (*pszSubmount != TEXT('\\')); ++pszSubmount) - if (!lstrncmpi (pszSubmount, szNetBiosName, lstrlen(szNetBiosName))) - break; - if ((!*pszSubmount) || (*pszSubmount == TEXT('\\'))) - return FALSE; - pszSubmount += lstrlen(szNetBiosName); - } - - if (!pszSubmount || !*pszSubmount) - return FALSE; - - lstrcpy (pszSubmountNow, pszSubmount); - return TRUE; -} - -/* Generate Random User name random acording to time*/ -DWORD dwOldState=0; -TCHAR pUserName[MAXRANDOMNAMELEN]=TEXT(""); -BOOL fUserName=FALSE; -#define AFSLogonOptionName TEXT(AFSREG_CLT_SVC_PROVIDER_SUBKEY) - -void SetBitLogonOption(BOOL set,DWORD value) -{ - - RWLogonOption(FALSE,((set)?value | RWLogonOption(TRUE,0):RWLogonOption(TRUE,0) & ~value) ); -} - -DWORD RWLogonOption(BOOL read,DWORD value) -{ - // if read is true then if value==0 return registry value - // if read and value!=0 then use value to test registry, return TRUE if value bits match value read - HKEY hk; - DWORD dwDisp; - DWORD LSPtype, LSPsize; - DWORD rval; - - if (read) - { - rval=0; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSLogonOptionName, 0, KEY_QUERY_VALUE, &hk)==ERROR_SUCCESS) - { - LSPsize=sizeof(rval); - RegQueryValueEx(hk, "LogonOptions", NULL, - &LSPtype, (LPBYTE)&rval, &LSPsize); - RegCloseKey (hk); - } - return (value==0)?rval:((rval & value)==value); - } else { //write - if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSLogonOptionName, 0, NULL, 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) - { - RegSetValueEx(hk,TEXT("LogonOptions"),NULL,REG_DWORD,(LPBYTE)&value,sizeof(value)); - RegCloseKey (hk); - } - return TRUE; - } -} - -void MapShareName(char *pszCmdLineA) -{ - fUserName = TRUE; - TCHAR *p=pUserName; - pszCmdLineA++; - while (*pszCmdLineA && (*pszCmdLineA != ' ')) - { - *p++=*pszCmdLineA++; - } -} - -void GenRandomName(TCHAR *pname,int len) -{ - if (fUserName) - { //user name was passed through command line, use once - fUserName=FALSE; - return; - } - srand( (unsigned)time( NULL ) ); - for (int i=0;i0)) - { - if (drivemap) { - DisMountDOSDrive(*lpnrLocal[i].lpLocalName); - DEBUG_EVENT1("AFS DriveUnMap","UnMap-Local=%x",res); - } - } else { - DisMountDOSDriveFull(lpnrLocal[i].lpRemoteName); - DEBUG_EVENT1("AFS DriveUnMap","UnMap-Remote=%x",res); - } - } - } - } - } while (res!=ERROR_NO_MORE_ITEMS); - GlobalFree((HGLOBAL)lpnrLocal); - WNetCloseEnum(hEnum); -} - -BOOL DoMapShareChange() -{ - DRIVEMAPLIST List; - TCHAR szMachine[ MAX_PATH],szPath[MAX_PATH]; - DWORD rc=28; - HANDLE hEnum; - LPNETRESOURCE lpnrLocal,lpnr=NULL; - DWORD res; - DWORD cEntries=-1; - DWORD cbBuffer=16384; - - memset(szMachine, '\0', sizeof(szMachine)); - GetClientNetbiosName(szMachine); - - // Initialize the data structure - if (!IsServiceActive()) - return TRUE; - memset (&List, 0x00, sizeof(DRIVEMAPLIST)); - for (size_t ii = 0; ii < 26; ++ii) - List.aDriveMap[ii].chDrive = chDRIVE_A + ii; - QueryDriveMapList_ReadSubmounts (&List); - if ((res=WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,RESOURCEUSAGE_CONNECTABLE,lpnr,&hEnum))!=NO_ERROR) - return FALSE; - lpnrLocal=(LPNETRESOURCE) GlobalAlloc(GPTR,cbBuffer); - sprintf(szPath,"\\\\%s\\",szMachine); - _strlwr(szPath); - do { - memset(lpnrLocal,0,cbBuffer); - if ((res = WNetEnumResource(hEnum,&cEntries,lpnrLocal,&cbBuffer))==NO_ERROR) - { - for (DWORD i=0;i -#include -} - -#include -#include - - -/* - * ISWINNT ____________________________________________________________________ - * - */ - -BOOL IsWindowsNT (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsWinNT = FALSE; - - if (!fChecked) - { - fChecked = TRUE; - - OSVERSIONINFO Version; - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - - if (GetVersionEx (&Version)) - { - if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) - fIsWinNT = TRUE; - } - } - - return fIsWinNT; -} - - -/* - * ISADMIN ____________________________________________________________________ - * - */ - -#define AFSCLIENT_ADMIN_GROUPNAME "AFS Client Admins" - -BOOL IsAdmin (void) -{ - static BOOL fAdmin = FALSE; - static BOOL fTested = FALSE; - - if (!fTested) - { - /* Obtain the SID for the AFS client admin group. If the group does - * not exist, then assume we have AFS client admin privileges. - */ - PSID psidAdmin = NULL; - DWORD dwSize, dwSize2; - char pszAdminGroup[ MAX_COMPUTERNAME_LENGTH + sizeof(AFSCLIENT_ADMIN_GROUPNAME) + 2 ]; - char *pszRefDomain = NULL; - SID_NAME_USE snu = SidTypeGroup; - - dwSize = sizeof(pszAdminGroup); - - if (!GetComputerName(pszAdminGroup, &dwSize)) { - /* Can't get computer name. We return false in this case. - Retain fAdmin and fTested. This shouldn't happen.*/ - return FALSE; - } - - dwSize = 0; - dwSize2 = 0; - - strcat(pszAdminGroup,"\\"); - strcat(pszAdminGroup, AFSCLIENT_ADMIN_GROUPNAME); - - LookupAccountName(NULL, pszAdminGroup, NULL, &dwSize, NULL, &dwSize2, &snu); - /* that should always fail. */ - - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - /* if we can't find the group, then we allow the operation */ - fAdmin = TRUE; - return TRUE; - } - - if (dwSize == 0 || dwSize2 == 0) { - /* Paranoia */ - fAdmin = TRUE; - return TRUE; - } - - psidAdmin = (PSID)malloc(dwSize); memset(psidAdmin,0,dwSize); - pszRefDomain = (char *)malloc(dwSize2); - - if (!LookupAccountName(NULL, pszAdminGroup, psidAdmin, &dwSize, pszRefDomain, &dwSize2, &snu)) { - /* We can't lookup the group now even though we looked it up earlier. - Could this happen? */ - fAdmin = TRUE; - } else { - /* Then open our current ProcessToken */ - HANDLE hToken; - - if (OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken)) - { - - if (!CheckTokenMembership(hToken, psidAdmin, &fAdmin)) { - /* We'll have to allocate a chunk of memory to store the list of - * groups to which this user belongs; find out how much memory - * we'll need. - */ - DWORD dwSize = 0; - PTOKEN_GROUPS pGroups; - - GetTokenInformation (hToken, TokenGroups, NULL, dwSize, &dwSize); - - pGroups = (PTOKEN_GROUPS)malloc(dwSize); - - /* Allocate that buffer, and read in the list of groups. */ - if (GetTokenInformation (hToken, TokenGroups, pGroups, dwSize, &dwSize)) - { - /* Look through the list of group SIDs and see if any of them - * matches the AFS Client Admin group SID. - */ - size_t iGroup = 0; - for (; (!fAdmin) && (iGroup < pGroups->GroupCount); ++iGroup) - { - if (EqualSid (psidAdmin, pGroups->Groups[ iGroup ].Sid)) { - fAdmin = TRUE; - } - } - } - - if (pGroups) - free(pGroups); - } - - /* if do not have permission because we were not explicitly listed - * in the Admin Client Group let's see if we are the SYSTEM account - */ - if (!fAdmin) { - PTOKEN_USER pTokenUser; - SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY; - PSID pSidLocalSystem = 0; - DWORD gle; - - GetTokenInformation(hToken, TokenUser, NULL, 0, &dwSize); - - pTokenUser = (PTOKEN_USER)malloc(dwSize); - - if (!GetTokenInformation(hToken, TokenUser, pTokenUser, dwSize, &dwSize)) - gle = GetLastError(); - - if (AllocateAndInitializeSid( &SIDAuth, 1, - SECURITY_LOCAL_SYSTEM_RID, - 0, 0, 0, 0, 0, 0, 0, - &pSidLocalSystem)) - { - if (EqualSid(pTokenUser->User.Sid, pSidLocalSystem)) { - fAdmin = TRUE; - } - - FreeSid(pSidLocalSystem); - } - - if ( pTokenUser ) - free(pTokenUser); - } - } - } - - free(psidAdmin); - free(pszRefDomain); - - fTested = TRUE; - } - - return fAdmin; -} - diff --git a/src/WINNT/client_config/isadmin.h b/src/WINNT/client_config/isadmin.h deleted file mode 100644 index 31adb7259..000000000 --- a/src/WINNT/client_config/isadmin.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef ISADMIN_H -#define ISADMIN_H - -/* - * ISADMIN ____________________________________________________________________ - * - */ - -BOOL IsWindowsNT (void); -BOOL IsAdmin (void); - - -#endif - diff --git a/src/WINNT/client_config/lang/.cvsignore b/src/WINNT/client_config/lang/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/client_config/lang/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/client_config/lang/NTMakefile b/src/WINNT/client_config/lang/NTMakefile deleted file mode 100644 index 3cba5cb20..000000000 --- a/src/WINNT/client_config/lang/NTMakefile +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\client_config\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afs_config_$(LANGID).dll - -RCFILE = $(LANGNAME)\afs_config.rc - -RESFILE = $(OUT)\afs_config_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - $(DEL) $(OUT)\*.res RC* RD* $(DLLFILE) - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: diff --git a/src/WINNT/client_config/lang/de_DE/afs_config.rc b/src/WINNT/client_config/lang/de_DE/afs_config.rc deleted file mode 100644 index 816c5c3f4..000000000 --- a/src/WINNT/client_config/lang/de_DE/afs_config.rc +++ /dev/null @@ -1,787 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "Konfiguration des AFS Clients" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Client-Konfiguration",IDC_STATIC,7,7,206,142 - LTEXT "&Zellenname:",IDC_STATIC,13,23,41,8 - EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "&AFS-Token beim Anmelden bei Windows erhalten", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, - 193,10 - CONTROL "&Ein AFS Light Gateway bereitstellen",IDC_GATEWAY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "Das Symbol für den AFS Client in der Menüleiste &anzeigen", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, - 194,10 - LTEXT "Hinweis: Diese Steuerelemente sind gesperrt, weil der AFS Client-Service nicht aktiv ist.", - IDC_WARN,13,124,193,17 - GROUPBOX "Client-Status",IDC_STATIC,7,157,206,61 - LTEXT "(Abfragen des aktuellen Status)",IDC_STATUS,13,172,193, - 17 - PUSHBUTTON "Service &starten",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "Service s&toppen",IDC_SERVICE_STOP,149,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Client-Konfiguration",IDC_STATIC,7,7,231,131 - LTEXT "&Gateway:",IDC_STATIC,13,28,31,8 - EDITTEXT IDC_GATEWAY,57,27,110,13,ES_AUTOHSCROLL - PUSHBUTTON "&Jetzt verbinden",IDC_GATEWAY_CONN,172,27,57,14 - LTEXT "&Zellenname:",IDC_STATIC,13,51,39,8 - EDITTEXT IDC_CELL,57,49,110,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "&AFS-Token beim Anmelden bei Windows erhalten", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73, - 193,10 - CONTROL "Das Symbol für den AFS Light in der Menüleiste &anzeigen", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,93, - 193,10 - LTEXT "Hinweis: Diese Steuerelemente sind gesperrt, weil der AFS Light mit keinem AFS-Gateway verbunden ist.", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Vorgaben" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Server-Vorgaben",-1,7,7,206,211 - CONTROL "Vorgaben für &File Server anzeigen",IDC_SHOW_FS,"Button", - BS_AUTORADIOBUTTON,13,21,193,10 - CONTROL "Vorgaben für &Volume Location Server anzeigen", - IDC_SHOW_VLS,"Button",BS_AUTORADIOBUTTON,13,34,193,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 49,173,120 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,84,172,50,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,137,172,50,14 - PUSHBUTTON "^",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "&Importieren...",IDC_IMPORT,13,172,50,14 - LTEXT "Hinweis: Diese Steuerelemente sind gesperrt, weil der AFS Client-Service nicht aktiv ist.", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS-Zellen" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "AFS-Zellen",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,51,195,50,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Laufwerkbuchstaben" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Laufwerkbuchstaben",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,193,135 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,70,171,47,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,120,171,42,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,165,171,42,14 - LTEXT "Den Pfaden in AFS zugeordnete Laufwerkbuchstaben:", - IDC_STATIC,13,21,193,8 - PUSHBUTTON "Er&weitert...",IDC_ADVANCED,13,171,53,14 - LTEXT "Hinweis: Diese Steuerelemente sind gesperrt, weil der AFS Client-Service nicht aktiv ist.", - IDC_WARN,13,190,194,25 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erweitert" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_CACHE_SIZE,88,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,88,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,88,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,88,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "&Anmelden...",IDC_LOGON_PARMS,13,127,72,14 - PUSHBUTTON "&Globale Laufwerke...",IDC_AUTOMAP_PARMS,13,172,72,14 - PUSHBUTTON "&Verschiedenes...",IDC_MISC_PARMS,13,194,72,14 - GROUPBOX "Cache-Konfiguration",IDC_STATIC,7,7,206,100 - LTEXT "&Cache-Größe:",IDC_STATIC,13,23,71,8 - LTEXT "KB",IDC_INUSE,136,23,68,8 - LTEXT "C&hunk-Größe:",IDC_STATIC,13,64,71,8 - LTEXT "KB",IDC_STATIC,136,64,68,8 - LTEXT "&Status Cache:",IDC_STATIC,13,85,71,8 - LTEXT "Einträge",IDC_STATIC,136,85,68,8 - LTEXT "Cache-&Pfad:",IDC_STATIC,13,44,71,8 - GROUPBOX "Zusätzliche erweiterte Parameter",IDC_STATIC,7,114,206, - 104 - LTEXT "Globale AFS- Laufwerkszuordnungen erstellen.", - IDC_STATIC,94,172,108,17 - LTEXT "Einstellungen zur integrierten Anmeldung anpassen.", - IDC_STATIC,94,127,108,18 - LTEXT "Verschiedene andere erweiterte Parameter festlegen.", - IDC_STATIC,94,193,108,16 - PUSHBUTTON "&Diagnostisch...",IDC_DIAG_PARMS,13,149,72,14 - LTEXT "Einstellungen für Fehler-Debug aktivieren.",IDC_STATIC, - 94,148,108,17 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Server-Priorität angeben" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Sie können für einen Server in dieser AFS-Zelle eine Prioritätenfolge angeben. Server mit niedrigerer Rangordnung werden beim Suchen von Daten in AFS zuerst abgefragt.", - IDC_STATIC,7,7,237,24 - LTEXT "&Server:",IDC_STATIC,34,42,24,8 - LTEXT "&Rang:",IDC_STATIC,34,58,20,8 - EDITTEXT IDC_SERVER,63,40,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,63,56,36,13,ES_AUTOHSCROLL - LTEXT "Tip: Sie können mit einem Mal für mehrere Server Ränge vergeben, indem Sie mit Hilfe der Schaltfläche Importieren eine Textdatei einlesen, die Server und ihre Rangordnung angibt.", - IDC_STATIC,7,73,237,25 - PUSHBUTTON "Abbrechen",IDCANCEL,140,102,50,14 - PUSHBUTTON "OK",IDOK,86,102,50,14 - PUSHBUTTON "Hilfe",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Zellenmerkmale" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Die Informationen auf dieser Seite teilen AFS mit, wie die angegebene Zelle anzusprechen ist.", - IDC_STATIC,4,4,226,16 - LTEXT "&AFS-Zelle:",IDC_STATIC,4,27,36,8 - EDITTEXT IDC_CELL,51,25,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "&Beschreibung:",IDC_STATIC,4,44,43,8 - EDITTEXT IDC_COMMENT,51,42,181,13,ES_AUTOHSCROLL - GROUPBOX "Server",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,75,198,50,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 251, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Server hinzufügen/bearbeiten" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Geben Sie den Namen eines Volume Location Servers in der angegebenen Zelle ein.", - IDC_STATIC,7,7,237,16 - LTEXT "Server-&Name:",IDC_STATIC,7,31,44,8 - EDITTEXT IDC_COMMENT,63,29,175,13,ES_AUTOHSCROLL - LTEXT "Server-&Adresse:",IDC_STATIC,7,52,51,8 - CONTROL "Spezielle Adresse &verwenden:",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,60,52,105,10 - CONTROL "Adresse automatisch &suchen",IDC_ADDR_LOOKUP,"Button", - BS_AUTORADIOBUTTON,60,66,111,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,173,51, - 65,13 - PUSHBUTTON "Abbrechen",IDCANCEL,140,91,50,14 - PUSHBUTTON "OK",IDOK,86,91,50,14 - PUSHBUTTON "Hilfe",9,194,91,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Laufwerkbuchstabe zuordnen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Sie können Pfaden in AFS Laufwerkbuchstaben ihres Computers zuordnen.", - IDC_STATIC,7,7,283,8 - LTEXT "Wenn Sie, zum Beispiel, Laufwerk Q den Pfad /afs/acme.com/usr/bob zuordnen, erscheinen die in AFS unter /afs/acme.com/usr/bob/* erreichbaren Dateien im Verzeichnis Q:\\ Ihres Computers.", - IDC_STATIC,7,26,283,25 - LTEXT "&Laufwerkbuchstabe:",IDC_STATIC,16,60,64,8 - COMBOBOX IDC_DRIVE,91,58,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS-&Pfad:",IDC_STATIC,16,78,33,8 - EDITTEXT IDC_PATH,91,76,168,13,ES_AUTOHSCROLL - LTEXT "B&eschreibung:",IDC_STATIC,15,97,52,8 - EDITTEXT IDC_DESC,91,95,72,13,ES_AUTOHSCROLL - CONTROL "Diese Zuordnung bei jeder Anmeldung &wiederherstellen", - IDC_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,91, - 114,188,10 - PUSHBUTTON "Abbrechen",IDCANCEL,186,135,50,14 - PUSHBUTTON "OK",IDOK,132,135,50,14 - PUSHBUTTON "Hilfe",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Submounts" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Ihr Computer kann Submounts - Netzwerkabtrennungen - in AFS realisieren.", - IDC_STATIC,4,4,196,16 - GROUPBOX "Submounts",IDC_STATIC,4,26,236,168 - LTEXT "Die folgenden Submounts sind von diesem Computer abgetrennt:", - IDC_STATIC,10,42,221,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 54,223,115 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,78,173,50,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,131,173,50,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,184,173,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 270, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Submount angeben" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Über Submounts können Sie eine AFS-Unterverzeichnisstruktur mittels Windows Networking abtrennen.", - IDC_STATIC,7,7,256,18 - LTEXT "&Submount:",IDC_STATIC,21,31,35,8 - LTEXT "AFS-&Pfad:",IDC_STATIC,21,47,33,8 - EDITTEXT IDC_SUBMOUNT,63,29,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,63,45,181,13,ES_AUTOHSCROLL - LTEXT "Geben Sie an der Eingabeaufforderung für das Submount einen Kurznamen und einen vollständigen AFS-Pfad ein. Der AFS-Pfad kann mit ""\\afs"" beginnen (wenn nicht, wird ""\\afs"" automatisch hinzugefügt).", - IDC_STATIC,7,60,256,27 - PUSHBUTTON "Abbrechen",IDCANCEL,159,91,50,14 - PUSHBUTTON "OK",IDOK,105,91,50,14 - PUSHBUTTON "Hilfe",9,213,91,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Laufwerkbuchstaben" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Laufwerkbuchstaben",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,219,60 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,90,95,52,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,145,95,42,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,190,95,42,14 - LTEXT "Den Pfaden in AFS zugeordnete Laufwerkbuchstaben:", - IDC_STATIC,13,21,193,8 - LTEXT "Hinweis: Diese Steuerzeichen sind gesperrt, weil der AFS Light mit keinem AFS-Gateway verbunden ist.", - IDC_WARN,13,116,219,17 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS-Zellen" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "AFS-Zellen",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,75,116,50,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 239, 49 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS Client-Service" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_STATIC,4,1,231,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "Bitte warten; der AFS Client-Service wird gestartet...", - IDC_STARTING,46,20,180,8 - LTEXT "Bitte warten; der AFS Client-Service wird gestoppt...", - IDC_STOPPING,46,20,174,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Allgemein" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Standardzelle",IDC_STATIC,7,7,206,54 - LTEXT "Geben Sie den Namen der zu verwaltenden AFS-Standardzelle ein:", - IDC_STATIC,14,19,186,16 - LTEXT "Standardzelle:",IDC_STATIC,14,40,51,8 - EDITTEXT IDC_CELL,67,38,139,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "AFS-Zellen",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,51,227,50,14 - PUSHBUTTON "Ä&ndern...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Verschiedenes konfigurieren" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,90,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,90,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,55,172,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,109,172,50,14 - PUSHBUTTON "Hilfe",9,163,172,50,14 - GROUPBOX "Parameter",IDC_STATIC,7,7,206,156 - LTEXT "&Testintervall:",IDC_STATIC,15,42,71,8 - LTEXT "Sekunden",IDC_STATIC,138,42,68,8 - LTEXT "&Hintergrund-Threads:",IDC_STATIC,15,62,71,8 - LTEXT "Threads",IDC_STATIC,138,62,68,8 - LTEXT "S&ervice-Threads:",IDC_STATIC,15,82,71,8 - LTEXT "Threads",IDC_STATIC,138,82,68,8 - LTEXT "S&ystemname:",IDC_STATIC,15,102,71,8 - LTEXT "&Mount-Verzeichnis:",IDC_STATIC,15,122,71,8 - LTEXT "&LAN-Adapternummer:",IDC_STATIC,15,22,71,8 - LTEXT "&Root-Volume:",IDC_STATIC,15,141,71,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Diagnostische Konfiguration" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,113,20,32,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,52,114,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,106,114,50,14 - PUSHBUTTON "Hilfe",9,160,114,50,14 - GROUPBOX "Parameter des Trace-Protokolls",IDC_STATIC,7,7,203,54 - LTEXT "&Puffergröße:",IDC_STATIC,13,22,73,8 - LTEXT "KB",IDC_STATIC,164,22,9,8 - GROUPBOX "Parameter des Ereignisprotokolls",IDC_STATIC,7,69,203, - 35 - COMBOBOX IDC_TRAP_ON_PANIC,113,40,32,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Notfall-Unterbrechungspunkt:",IDC_STATIC,13,42,95,11 - LTEXT "Start von Berichtsprogrammen:",IDC_STATIC,13,86,98,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,113,85,32,64, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Konfiguration der Anmeldung" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,117,19,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,117,40,32,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,21,71,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,75,71,50,14 - PUSHBUTTON "Hilfe",9,129,71,50,14 - LTEXT "Wiederholungsintervall für die &Anmeldung:",IDC_STATIC, - 13,19,94,16 - GROUPBOX "Parameter",IDC_STATIC,7,7,172,54 - LTEXT "Lautlos &fehlgeschlagene Anmeldungen:",IDC_STATIC,13,41, - 61,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Globale Laufwerke" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Schließen",IDOK,141,148,50,14 - PUSHBUTTON "Hilfe",9,196,148,50,14 - PUSHBUTTON "&Hinzufügen",IDC_ADD,108,117,42,14 - GROUPBOX "Global zugeordnete AFS-Laufwerke",IDC_STATIC,7,7,239, - 133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "Ä&ndern",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Globales Laufwerk zuordnen" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_DRIVE,90,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,90,42,138,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,90,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,82,96,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,136,96,50,14 - PUSHBUTTON "Hilfe",9,190,96,50,14 - LTEXT "&Laufwerkbuchstabe:",IDC_STATIC,16,25,71,8 - LTEXT "AFS-&Pfad:",IDC_STATIC,16,44,33,8 - LTEXT "B&eschreibung:",IDC_STATIC,15,64,52,8 - GROUPBOX "Globales AFS-Laufwerk",IDC_STATIC,7,7,232,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 263 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 235 - TOPMARGIN, 4 - BOTTOMMARGIN, 45 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""Konfiguration des AFS Clients""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "Konfiguration des AFS Clients" - IDS_TITLE_95 "Konfiguration des AFS Light" - IDS_STATE_STOPPED "Der AFS Client-Service ist zur Zeit gestoppt." - IDS_STATE_RUNNING "Der AFS Client-Service läuft normal." - IDS_STATE_STARTING "Bitte warten; der AFS Client-Service wird gestartet..." - IDS_STATE_STOPPING "Bitte warten; der AFS Client-Service wird gestoppt..." - IDS_STATE_UNKNOWN "Der AFS Client-Service ist nicht richtig konfiguriert." - IDS_SERVICE_FAIL_START "Der AFS Client-Service konnte nicht erfolgreich gestartet werden. Vielleicht besitzen Sie nicht die Berechtigung für diese Operation.\n\nFehler 0x%1." - IDS_SERVICE_FAIL_STOP "Der AFS Client-Service konnte nicht erfolgreich gestoppt werden. Vielleicht besitzen Sie nicht die Berechtigung für diese Operation.\n\nFehler 0x%1." - IDS_WARN_STOPPED "Hinweis: Die gesperrten Steuerelemente können nicht verändert werden, weil der AFS Client-Service nicht aktiv ist." - IDS_WARN_ADMIN "Hinweis: Die gesperrten Steuerelemente können nicht verändert werden, weil Sie bei Windows nicht als Administrator angemeldet sind." - IDS_CELL_UNKNOWN "(unbekannt)" - IDS_GATEWAY_UNKNOWN "(unbekannt)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows konnte eine Netzadresse für %1 nicht finden. Überprüfen Sie, ob Sie den Namen der Maschine korrekt eingegeben haben." - IDS_NEWSUB_DESC "AFS konnte die Beschreibung nicht verwenden, die Sie beim Verbinden des Netzlaufwerkes angegeben haben.\n\nDie angegebene Beschreibung wird bereits für einen anderen AFS-Pfad verwendet." - IDS_BADSUB_DESC "Die durch Sie eingegebene Beschreibung zum Laufwerkbuchstaben kann nicht verwendet werden.\n\nDie Beschreibung zu einem Laufwerkbuchstaben darf nicht mehr als 12 Zeichen lang sein und keine Leerzeichen oder Tabulatoren enthalten." - IDS_BADGATEWAY_DESC "AFS konnte die von Ihnen angegebene Gateway-Machine nicht ansprechen.\n\nÜberprüfen Sie, ob Sie den Namen der Gateway-Machine korrekt eingegeben haben." - IDS_BADGWCELL_DESC "Für die durch die angegebene Gateway-Machine verwendete AFS-Zelle \nkonnten keine Konfigurationsdaten gefunden werden.\n\nWenn Sie den AFS Client für eine neue Zelle konfigurieren möchten, müssen Sie das Register AFS-Zellen verwenden, um für diese Zelle Konfigurationsdaten hinzuzufügen.\n\nZelle: %1" - IDS_TITLE_CAUTION_NT "Warnung - Konfiguration des AFS Clients" - IDS_TITLE_CAUTION_95 "Warnung - Konfiguration des AFS Light" - IDS_TITLE_ERROR_NT "Fehler - Konfiguration des AFS Clients" - IDS_TITLE_ERROR_95 "Fehler - Konfiguration des AFS Light" - IDS_SHRINKCACHE "Die Cache-Größe des AFS Client kann nicht reduziert werden, \nwährend der AFS Client-Service aktiv ist.\n\nUm die Größe des Cache zu reduzieren, verwenden \nSie zuerst die Schaltfläche Service stoppen auf dem Register Allgemein, um den AFS Client-Service zu \nstoppen." - IDS_BADCELL_DESC_CC "Für die von Ihnen eingegebene AFS-Zelle konnten keine Konfigurationsdaten gefunden werden.\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "In AFS gespeicherte Dateien werden für diesen Computer nicht mehr \nerreichbar sein, wenn Sie den AFS Client-Service stoppen.\n\nSind Sie sicher, daß Sie den Service stoppen möchten?" - IDS_PREFCOL_SERVER "Server" - IDS_PREFCOL_RANK "Rang" - IDS_TIP_PREFS "Tip: Server mit niedrigerer Rangordnung erhalten beim Lesen von Dateien über AFS Priorität." - IDS_PREFERROR_RESOLVE "AFS konnte den Server mit der Bezeichnung %1 nicht finden. Bitte überprüfen Sie, ob Sie den Server korrekt eingegeben haben." - IDS_FILTER_TXT "Textdateien (*.TXT);*.TXT;" - IDS_HOSTREM_MANY "Sie haben gewählt, alle Informationen zum Ansprechen der ausgewählten AFS-Zellen zu entfernen.\n\nSind Sie sicher, daß Sie diese Einträge entfernen möchten?" - IDS_HOSTREM_ONE "Sie haben gewählt, alle Informationen zum Ansprechen der AFS-Zelle \n%1 zu entfernen.\n\nSind Sie sicher, daß Sie diesen Eintrag entfernen möchten?" - IDS_CELLEDIT_TITLE "%1 - Merkmale" - IDS_CELLADD_TITLE "Neue Zelle" - IDS_SVRCOL_SERVER "Adresse" - IDS_SVRCOL_COMMENT "Server-Name" - IDS_TIP_DRIVES "Tip: Sie können eine Netzlaufwerkszuordnung verbinden, indem Sie das Fenster neben dem Laufwerkbuchstaben der Zuordnung überprüfen." - IDS_MAP_LETTER "Laufwerk *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Laufwerk %1: \t%2" - IDS_ERROR_MAP "Netzlaufwerk zur Fehlerzuordnung" - IDS_ERROR_MAP_DESC "AFS konnte das Netzlaufwerk dem angegebenen Pfad in AFS nicht \nzuordnen. Stellen Sie sicher, daß der Laufwerkbuchstabe zur Zeit nicht in Gebrauch \nist.\n\nFehler: 0x%1." - IDS_ERROR_UNMAP "Netzlaufwerk zur Fehlerzuordnung" - IDS_ERROR_UNMAP_DESC "AFS konnte die Zuordnung des angegebenen Netzlaufwerks nicht \naufheben. Stellen Sie sicher, daß der Laufwerkbuchstabe zur Zeit nicht in Gebrauch \nist.\n\nFehler: 0x%1." - IDS_ADDSERVER_TITLE "Server hinzufügen" - IDS_EDITSERVER_TITLE "Server editieren" - IDS_SUBCOL_SHARE "Submount" - IDS_SUBCOL_PATH "AFS-Pfad" - IDS_SUBMOUNTS_TITLE "Submounts" - IDS_BADCELL_DESC "Für die von Ihnen eingegebene AFS-Zelle konnten keine Konfigurationsdaten gefunden werden.\n\n+" - IDS_BADCELL_DESC2 "Überprüfen Sie, ob Sie den Namen der Zelle korrekt eingegeben \nhaben. Wenn Sie den AFS Client für eine neue Zelle konfigurieren möchten, müssen Sie das Register \nAFS-Zellen verwenden, um für diese Zelle Konfigurationsdaten hinzuzufügen." - IDS_KB_IN_USE "KB (%1 KB in Gebrauch)" - IDS_NOGATEWAY_TITLE "Ungültiges AFS-Gateway" - IDS_NOGATEWAY_DESC "AFS Light kann nicht konfiguriert werden, weil Sie kein AFS-Gateway angegeben haben.\n\nBitte geben Sie in das entsprechende Feld den Namen oder die IP-Adresse eines AFS-Gateways ein." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "AFS Client kann nicht konfiguriert werden, weil Sie keine \nAFS-Zelle angegeben haben.\n\nBitte geben Sie in das entsprechende Feld den Namen oder die \nIP-Adresse einer AFS-Zelle ein." - IDS_STOPPED_NOCELL "Sie müssen eine AFS-Zelle angeben, bevor der AFS Client-Service gestartet werden kann." - IDS_OKSTOP_DESC "Der AFS Client-Service ist nicht aktiv. In AFS gespeicherte \nDateien werden für diesen Computer nicht erreichbar sein, bis Sie den AFS Client-Service \nstarten.\n\nMöchten Sie den Service jetzt starten?" - IDS_BADMAP_DESC "AFS kann dem angegebenen Pfad keinen Laufwerkbuchstaben zuordnen, \nweil der Pfad nicht mit ""\\afs"" beginnt.\n\nStellen Sie sicher, daß der eingegebene Pfad mit \n""\\afs"" beginnt, und versuchen Sie es erneut." - IDS_RESTART_TITLE "Konfiguration des AFS Clients" - IDS_RESTART_DESC "Einige der durch Sie vorgenommenen Änderungen werden unwirksam \nsein, bis der AFS Client-Service gestoppt und neu gestartet worden ist.\n\nMöchten Sie den \nService jetzt stoppen und neu starten?" - IDS_KB_ONLY "KB" - IDS_FAILCONFIG_AUTHENT "Beim Aktivieren oder Sperren der Authentifizierung bei der Anmeldung ist ein Fehler aufgetreten.\n\nFehler %1" - IDS_FAILCONFIG_PREFS "Einige der durch Sie zugewiesenen Server-Prioritäten konnten nicht verwendet werden.\n\nFehler %1" - IDS_FAILCONFIG_CACHE "Die von Ihnen eingegebene Cache-Größe für den AFS Client konnte nicht verwendet werden.\n\nFehler %1" - IDS_FAILCONFIG_PROBE "Das von Ihnen eingegebene Testintervall für den AFS Client konnte \nnicht verwendet werden.\n\nFehler %1" - IDS_FAILCONFIG_SYSNAME "Der von Ihnen eingegebene Syname für den AFS Client konnte \nnicht verwendet werden.\n\nFehler %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "Überprüfen Sie, ob Sie den Namen der Zelle korrekt eingegeben \nhaben. Wenn der korrekte Zellenname in der Liste AFS-Zellen nicht auftritt, verwenden Sie die \nSchaltfläche Hinzufügen, um für die Zelle einen Eintrag zu erstellen." - IDS_NOCELL_DESC_CC "AFS Control Center kann nicht konfiguriert werden, weil Sie keine \nAFS-Standardzelle angegeben haben.\n\nBitte geben Sie in das entsprechende Feld den Namen einer \nAFS-Zelle ein." - IDS_TITLE_CAUTION_CCENTER "Warnung - Merkmale für AFS Control Center" - IDS_TITLE_ERROR_CCENTER "Fehler - Merkmale für AFS Control Center" - IDS_TITLE_CCENTER "Merkmale für AFS Control Center" - IDS_YES "Ja" - IDS_NO "Nein" - IDS_DRIVE "Laufwerk" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/en_US/afs_config.rc b/src/WINNT/client_config/lang/en_US/afs_config.rc deleted file mode 100644 index 5907a2e54..000000000 --- a/src/WINNT/client_config/lang/en_US/afs_config.rc +++ /dev/null @@ -1,804 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client Configuration" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Client Configuration",IDC_STATIC,7,7,206,142 - LTEXT "&Cell Name:",IDC_STATIC,13,23,35,8 - EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "&Obtain AFS tokens when logging into Windows",IDC_LOGON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 - CONTROL "&Provide an AFS Light Gateway",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "S&how the AFS Client icon in the taskbar",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95,193,10 - LTEXT "Note: these controls are disabled because the AFS Client service is not running.", - IDC_WARN,13,124,193,17 - GROUPBOX "Client Status",IDC_STATIC,7,157,206,61 - LTEXT "(querying current status)",IDC_STATUS,13,172,193,17 - PUSHBUTTON "&Start Service",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "S&top Service",IDC_SERVICE_STOP,149,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Client Configuration",IDC_STATIC,7,7,231,131 - LTEXT "&Gateway:",IDC_STATIC,13,28,31,8 - EDITTEXT IDC_GATEWAY,57,27,110,13,ES_AUTOHSCROLL - PUSHBUTTON "Connect &Now",IDC_GATEWAY_CONN,172,27,57,14 - LTEXT "&Cell Name:",IDC_STATIC,13,51,35,8 - EDITTEXT IDC_CELL,57,49,110,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "&Obtain AFS tokens when logging into Windows",IDC_LOGON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,193,10 - CONTROL "S&how the AFS Light icon in the taskbar",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,93,193,10 - LTEXT "Note: these controls are disabled because AFS Light is not connected to an AFS gateway.", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Preferences" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Server Preferences",-1,7,7,206,211 - CONTROL "Show &File Server preferences",IDC_SHOW_FS,"Button", - BS_AUTORADIOBUTTON,13,21,193,10 - CONTROL "Show &Volume Location Server preferences",IDC_SHOW_VLS, - "Button",BS_AUTORADIOBUTTON,13,34,193,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 49,173,120 - PUSHBUTTON "&Add...",IDC_ADD,84,172,50,14 - PUSHBUTTON "&Change...",IDC_EDIT,137,172,50,14 - PUSHBUTTON "^",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "&Import...",IDC_IMPORT,13,172,50,14 - LTEXT "Note: these controls are disabled because the AFS Client service is not running.", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Cells" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "AFS Cells",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "&Add...",IDC_ADD,51,195,50,14 - PUSHBUTTON "&Change...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Drive Letters" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Drive Letters",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,193,135 - PUSHBUTTON "&Add...",IDC_ADD,75,171,42,14 - PUSHBUTTON "&Change...",IDC_EDIT,120,171,42,14 - PUSHBUTTON "&Remove",IDC_REMOVE,165,171,42,14 - LTEXT "Drive letters mapped to paths in AFS:",IDC_STATIC,13,21, - 193,8 - PUSHBUTTON "Ad&vanced...",IDC_ADVANCED,13,171,53,14 - LTEXT "Note: these controls are disabled because the AFS Client service is not running.", - IDC_WARN,13,193,193,17 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 247 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Advanced" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_CACHE_SIZE,88,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,88,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,88,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,88,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "&Logon...",IDC_LOGON_PARMS,13,128,56,14 - PUSHBUTTON "&Global Drives...",IDC_AUTOMAP_PARMS,13,172,56,14 - PUSHBUTTON "&Miscellaneous...",IDC_MISC_PARMS,13,216,56,14 - GROUPBOX "Cache Configuration",IDC_STATIC,7,7,206,100 - LTEXT "&Cache Size:",IDC_STATIC,13,23,71,8 - LTEXT "kb",IDC_INUSE,136,23,68,8 - LTEXT "C&hunk Size:",IDC_STATIC,13,64,71,8 - LTEXT "kb",IDC_STATIC,136,64,68,8 - LTEXT "&Status Cache:",IDC_STATIC,13,85,71,8 - LTEXT "entries",IDC_STATIC,136,85,68,8 - LTEXT "Cache &Path:",IDC_STATIC,13,44,71,8 - GROUPBOX "Additional Advanced Parameters",IDC_STATIC,7,118,206, - 122 - LTEXT "Create global AFS drive mappings.",IDC_STATIC,74,174, - 132,10 - LTEXT "Adjust integrated logon settings.",IDC_STATIC,74,130, - 133,10 - LTEXT "Set various other advanced parameters.",IDC_STATIC,74, - 218,132,10 - PUSHBUTTON "&Diagnostic...",IDC_DIAG_PARMS,13,150,56,14 - LTEXT "Enable settings for problem debugging.",IDC_STATIC,74, - 152,132,10 - PUSHBUTTON "&Binding...",IDC_BINDING_PARMS,13,194,56,14 - LTEXT "Adjust network adapter binding settings.",IDC_STATIC,74, - 196,133,10 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Specify Server Priority" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "You can specify a priority rank for a server in this AFS cell. Servers with lower-numbered rankings are queried first when looking for data in AFS.", - IDC_STATIC,7,7,237,17 - LTEXT "&Server:",IDC_STATIC,34,38,24,8 - LTEXT "&Rank:",IDC_STATIC,34,54,20,8 - EDITTEXT IDC_SERVER,63,36,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,63,52,36,13,ES_AUTOHSCROLL - LTEXT "Tip: you can specify ranks for several servers at once by using the Import button to read a text file specifying servers and their ranks.", - IDC_STATIC,7,76,237,18 - PUSHBUTTON "Cancel",IDCANCEL,140,102,50,14 - PUSHBUTTON "OK",IDOK,86,102,50,14 - PUSHBUTTON "Help",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Cell Properties" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "The information on this page tells AFS how to contact the specified cell.", - IDC_STATIC,4,4,226,8 - LTEXT "&AFS Cell:",IDC_STATIC,4,24,30,8 - EDITTEXT IDC_CELL,50,22,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "&Submount:",IDC_STATIC,4,41,38,8 - EDITTEXT IDC_COMMENT,50,39,181,13,ES_AUTOHSCROLL - GROUPBOX "Servers",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "&Add...",IDC_ADD,75,198,50,14 - PUSHBUTTON "&Change...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 251, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add/Edit Server" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Enter the name of a Volume Location Server in the specified cell.", - IDC_STATIC,7,7,237,8 - LTEXT "Server &Name:",IDC_STATIC,7,31,44,8 - EDITTEXT IDC_COMMENT,63,29,170,13,ES_AUTOHSCROLL - LTEXT "Server &Address:",IDC_STATIC,7,52,51,8 - CONTROL "&Use specific address:",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,63,52,83,10 - CONTROL "&Look up address automatically",IDC_ADDR_LOOKUP,"Button", - BS_AUTORADIOBUTTON,63,66,111,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,151,51, - 65,13 - PUSHBUTTON "Cancel",IDCANCEL,140,91,50,14 - PUSHBUTTON "OK",IDOK,86,91,50,14 - PUSHBUTTON "Help",9,194,91,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Map Drive Letter" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "You can map drive letters on your computer to paths in AFS.", - IDC_STATIC,7,7,283,8 - LTEXT "For instance, if you map drive Q as /afs/acme.com/usr/bob, then the files available in AFS as /afs/acme.com/usr/bob/* will be visible in your computer's Q:\\ directory.", - IDC_STATIC,7,26,283,16 - LTEXT "&Drive Letter:",IDC_STATIC,30,59,40,8 - COMBOBOX IDC_DRIVE,77,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS &Path:",IDC_STATIC,30,77,33,8 - EDITTEXT IDC_PATH,77,75,168,13,ES_AUTOHSCROLL - LTEXT "&Submount:",IDC_STATIC,29,96,38,8 - EDITTEXT IDC_DESC,77,94,72,13,ES_AUTOHSCROLL - CONTROL "&Restore this mapping whenever I logon",IDC_PERSISTENT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,77,112,188,10 - PUSHBUTTON "Cancel",IDCANCEL,186,135,50,14 - PUSHBUTTON "OK",IDOK,132,135,50,14 - PUSHBUTTON "Help",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Submounts" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Your computer can supply submounts--network shares in AFS.", - IDC_STATIC,4,4,196,8 - GROUPBOX "Submounts",IDC_STATIC,4,26,236,168 - LTEXT "The following submounts are shared from this computer:", - IDC_STATIC,10,42,176,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 54,223,115 - PUSHBUTTON "&Add...",IDC_ADD,78,173,50,14 - PUSHBUTTON "&Change...",IDC_EDIT,131,173,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE,184,173,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 270, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Specify Submount" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Submounts let you share an AFS subdirectory tree using Windows Networking.", - IDC_STATIC,7,7,256,8 - LTEXT "&Submount:",IDC_STATIC,22,27,35,8 - LTEXT "AFS &Path:",IDC_STATIC,22,43,33,8 - EDITTEXT IDC_SUBMOUNT,63,25,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,63,41,181,13,ES_AUTOHSCROLL - LTEXT "Enter a short name for the submount, and a full AFS path where prompted. The AFS path may begin with ""\\afs"" (if not, ""\\afs"" will be added automatically).", - IDC_STATIC,7,64,256,18 - PUSHBUTTON "Cancel",IDCANCEL,159,91,50,14 - PUSHBUTTON "OK",IDOK,105,91,50,14 - PUSHBUTTON "Help",9,213,91,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Drive Letters" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Drive Letters",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,219,60 - PUSHBUTTON "&Add...",IDC_ADD,100,95,42,14 - PUSHBUTTON "&Change...",IDC_EDIT,145,95,42,14 - PUSHBUTTON "&Remove",IDC_REMOVE,190,95,42,14 - LTEXT "Drive letters mapped to paths in AFS:",IDC_STATIC,13,21, - 193,8 - LTEXT "Note: these controls are disabled because AFS Light is not connected to an AFS gateway.", - IDC_WARN,13,116,219,17 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Cells" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "AFS Cells",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "&Add...",IDC_ADD,75,116,50,14 - PUSHBUTTON "&Change...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 219, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS Client Service" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "",IDC_STATIC,4,0,211,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "Please wait; the AFS Client service is starting...", - IDC_STARTING,46,20,157,8 - LTEXT "Please wait; the AFS Client service is stopping...", - IDC_STOPPING,46,20,157,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Default Cell",IDC_STATIC,7,7,206,54 - LTEXT "Enter the name of the default AFS cell to administer:", - IDC_STATIC,14,19,164,8 - LTEXT "Default Cell:",IDC_STATIC,14,37,39,8 - EDITTEXT IDC_CELL,59,35,147,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "AFS Cells",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "&Add...",IDC_ADD,51,227,50,14 - PUSHBUTTON "&Change...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 170 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Miscellaneous Configuration" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_PROBE,90,16,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,90,36,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,90,56,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,90,76,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,90,96,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,90,116,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,55,143,50,14 - PUSHBUTTON "Cancel",IDCANCEL,109,143,50,14 - PUSHBUTTON "Help",9,163,143,50,14 - GROUPBOX "Parameters",IDC_STATIC,7,7,206,130 - LTEXT "&Probe Interval:",IDC_STATIC,15,18,71,8 - LTEXT "seconds",IDC_STATIC,138,18,68,8 - LTEXT "&Background Threads:",IDC_STATIC,15,38,71,8 - LTEXT "threads",IDC_STATIC,138,38,68,8 - LTEXT "S&ervice Threads:",IDC_STATIC,15,58,71,8 - LTEXT "threads",IDC_STATIC,138,58,68,8 - LTEXT "S&ystem Name:",IDC_STATIC,15,78,71,8 - LTEXT "&Mount Directory:",IDC_STATIC,15,98,71,8 - LTEXT "&Root Volume:",IDC_STATIC,15,117,71,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Diagnostic Configuration" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,99,20,32,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,52,114,50,14 - PUSHBUTTON "Cancel",IDCANCEL,106,114,50,14 - PUSHBUTTON "Help",9,160,114,50,14 - GROUPBOX "Trace Log Parameters",IDC_STATIC,7,7,203,54 - LTEXT "&Buffer Size:",IDC_STATIC,13,22,73,8 - LTEXT "kb",IDC_STATIC,149,24,9,8 - GROUPBOX "Event Log Parameters",IDC_STATIC,7,69,203,35 - COMBOBOX IDC_TRAP_ON_PANIC,99,40,32,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Trap On Panic:",IDC_STATIC,13,42,50,8 - LTEXT "Report Session Startups:",IDC_STATIC,13,86,79,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,99,84,32,64,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Login Configuration" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,89,18,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,89,39,32,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,21,71,50,14 - PUSHBUTTON "Cancel",IDCANCEL,75,71,50,14 - PUSHBUTTON "Help",9,129,71,50,14 - LTEXT "&Login Retry Interval:",IDC_STATIC,13,20,66,8 - GROUPBOX "Parameters",IDC_STATIC,7,7,172,54 - LTEXT "&Fail Logins Silently:",IDC_STATIC,13,41,61,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Global Drives" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Close",IDOK,141,148,50,14 - PUSHBUTTON "Help",9,196,148,50,14 - PUSHBUTTON "&Add",IDC_ADD,108,117,42,14 - GROUPBOX "Globally Mapped AFS Drives",IDC_STATIC,7,7,239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "&Change",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "&Remove",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Map Global Drive" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_DRIVE,63,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,63,42,168,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,63,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,82,96,50,14 - PUSHBUTTON "Cancel",IDCANCEL,136,96,50,14 - PUSHBUTTON "Help",9,190,96,50,14 - LTEXT "&Drive Letter:",IDC_STATIC,16,25,40,8 - LTEXT "AFS &Path:",IDC_STATIC,16,44,33,8 - LTEXT "&Submount:",IDC_STATIC,15,64,38,8 - GROUPBOX "Global AFS Drive",IDC_STATIC,7,7,232,80 -END - -IDD_BINDING_CONFIG_PARAMS DIALOG DISCARDABLE 0, 0, 220, 149 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Binding" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Use Default NIC",IDC_DEFAULTNIC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,14,82,10 - COMBOBOX IDC_NICSELECTION,15,41,159,66,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,55,128,50,14 - PUSHBUTTON "Cancel",IDCANCEL,109,128,50,14 - PUSHBUTTON "Help",9,163,128,50,14 - GROUPBOX "Network Adapter Selection (NIC):",IDC_STATIC,7,5,206,57 - LTEXT "Select the NIC to Bind to:",IDC_STATICLANA,15,29,78,8 - LTEXT "",IDC_BINDING_MESSAGE,7,68,206,41 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 240 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 263 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 163 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END - - IDD_BINDING_CONFIG_PARAMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 142 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Client Configuration""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "AFS Client Configuration" - IDS_TITLE_95 "AFS Light Configuration" - IDS_STATE_STOPPED "The AFS Client service is currently stopped." - IDS_STATE_RUNNING "The AFS Client service is running normally." - IDS_STATE_STARTING "Please wait; the AFS Client service is starting..." - IDS_STATE_STOPPING "Please wait; the AFS Client service is stopping..." - IDS_STATE_UNKNOWN "The AFS Client service is not configured properly." - IDS_SERVICE_FAIL_START "The AFS Client Service could not be started successfully. You might not have authorization to perform this operation.\n\nError 0x%1." - IDS_SERVICE_FAIL_STOP "The AFS Client Service could not be stopped successfully. You might not have authorization to perform this operation.\n\nError 0x%1." - IDS_WARN_STOPPED "The disabled controls cannot be changed because the AFS Client service is not running." - IDS_WARN_ADMIN "The disabled controls cannot be changed because you are not logged in to Windows as an administrator." - IDS_CELL_UNKNOWN "(unknown)" - IDS_GATEWAY_UNKNOWN "(unknown)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows could not find a network address for %1. Check to make sure you typed the name of the machine correctly." - IDS_NEWSUB_DESC "AFS was unable to use the submount name you specified when connecting the network drive.\n\nThe specified submount is already used for a different AFS path." - IDS_BADSUB_DESC "The drive letter submount you entered cannot be used.\n\nA submount may have no more than 12 characters, and may not contain spaces or tabs." - IDS_BADGATEWAY_DESC "AFS was unable to contact the gateway machine that you specified.\n\nCheck to make sure that you typed the name of the gateway machine correctly." - IDS_BADGWCELL_DESC "No configuration information could be found for the AFS cell used by the specified gateway machine.\n\nIf you want to configure the AFS Client into a new cell, you must use the AFS Cells tab to add configuration information for that cell.\n\nCell: %1" - IDS_TITLE_CAUTION_NT "Caution - AFS Client Configuration" - IDS_TITLE_CAUTION_95 "Caution - AFS Light Configuration" - IDS_TITLE_ERROR_NT "Error - AFS Client Configuration" - IDS_TITLE_ERROR_95 "Error - AFS Light Configuration" - IDS_SHRINKCACHE "The size of the AFS Client cache cannot be reduced while the AFS Client service is running.\n\nTo reduce the size of the cache, first use the Stop Service button on the General tab to stop the AFS Client service." - IDS_BADCELL_DESC_CC "No configuration information could be found for the AFS cell you have entered.\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "Files stored in AFS will not be accessible from this computer if you stop the AFS Client service.\n\nAre you sure you want to stop the service?" - IDS_PREFCOL_SERVER "Server" - IDS_PREFCOL_RANK "Rank" - IDS_TIP_PREFS "Tip: Servers with lower ranking numbers will be given priority when reading files over AFS." - IDS_PREFERROR_RESOLVE "AFS could not find the server named %1. Please check to make sure you entered the server correctly." - IDS_FILTER_TXT "Text Files (*.TXT);*.TXT;" - IDS_HOSTREM_MANY "You have chosen to remove all contact information for the selected AFS cells.\n\nAre you sure you want to remove these entries?" - IDS_HOSTREM_ONE "You have chosen to remove all contact information for AFS cell %1.\n\nAre you sure you want to remove this entry?" - IDS_CELLEDIT_TITLE "%1 - Properties" - IDS_CELLADD_TITLE "New Cell" - IDS_SVRCOL_SERVER "Address" - IDS_SVRCOL_COMMENT "Server Name" - IDS_TIP_DRIVES "Tip: You can connect a network drive mapping by checking the box next to the mapping's drive letter." - IDS_MAP_LETTER "Drive *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Drive %1: \t%2" - IDS_ERROR_MAP "Error Mapping Network Drive" - IDS_ERROR_MAP_DESC "AFS was unable to map the network drive to the specified path in AFS. Check to make sure the drive letter is not currently in use.\n\nError: 0x%1." - IDS_ERROR_UNMAP "Error Mapping Network Drive" - IDS_ERROR_UNMAP_DESC "AFS was unable to unmap the specified network drive. Check to make sure the drive letter is not currently in use.\n\nError: 0x%1." - IDS_ADDSERVER_TITLE "Add Server" - IDS_EDITSERVER_TITLE "Edit Server" - IDS_SUBCOL_SHARE "Submount" - IDS_SUBCOL_PATH "AFS Path" - IDS_SUBMOUNTS_TITLE "Submounts" - IDS_BADCELL_DESC "No configuration information could be found for the AFS cell you have entered.\n\n+" - IDS_BADCELL_DESC2 "Check the name of the cell to make sure you have entered it correctly. If you want to configure the AFS Client into a new cell, you must use the AFS Cells tab to add configuration information for that cell." - IDS_KB_IN_USE "kb (%1 kb in use)" - IDS_NOGATEWAY_TITLE "Invalid AFS Gateway" - IDS_NOGATEWAY_DESC "AFS Light cannot be configured because you have not specified an AFS Gateway.\n\nPlease enter the name or IP address of an AFS Gateway in the area provided." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "The AFS Client cannot be configured because you have not specified an AFS cell.\n\nPlease enter the name of an AFS cell in the area provided." - IDS_STOPPED_NOCELL "You must specify an AFS cell before the AFS Client service can be started." - IDS_OKSTOP_DESC "The AFS Client service is not running. Files stored in AFS will not be accessible from this computer until you start the AFS Client service.\n\nDo you want to start the service now?" - IDS_BADMAP_DESC "AFS cannot map a drive letter to the path specified because the path does not begin with ""\\afs"".\n\nMake sure that the path you enter begins with ""\\afs"", and try again." - IDS_RESTART_TITLE "AFS Client Configuration" - IDS_RESTART_DESC "Some of the changes you have made will not take effect until the AFS Client service has been stopped and restarted.\n\nDo you want to stop and restart the service now?" - IDS_KB_ONLY "kb" - IDS_FAILCONFIG_AUTHENT "An error occurred while trying to enable or disable authentication at logon.\n\nError %1" - IDS_FAILCONFIG_PREFS "Some of the server ranking priorities you assigned could not be used.\n\nError %1" - IDS_FAILCONFIG_CACHE "The AFS Client cache size you entered could not be used.\n\nError %1" - IDS_FAILCONFIG_PROBE "The AFS Client probe interval you entered could not be used.\n\nError %1" - IDS_FAILCONFIG_SYSNAME "The AFS Client sysname you entered could not be used.\n\nError %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "Check the name of the cell to make sure you have entered it correctly. If the correct cell name does not appear in the AFS Cells list, use the Add button to create an entry for the cell." - IDS_NOCELL_DESC_CC "The AFS Control Center cannot be configured because you have not specified a default AFS cell.\n\nPlease enter the name of an AFS cell in the area provided." - IDS_TITLE_CAUTION_CCENTER "Caution - AFS Control Center Properties" - IDS_TITLE_ERROR_CCENTER "Error - AFS Control Center Properties" - IDS_TITLE_CCENTER "AFS Control Center Properties" - IDS_YES "Yes" - IDS_NO "No" - IDS_DRIVE "Drive" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/es_ES/afs_config.rc b/src/WINNT/client_config/lang/es_ES/afs_config.rc deleted file mode 100644 index 756f0df1f..000000000 --- a/src/WINNT/client_config/lang/es_ES/afs_config.rc +++ /dev/null @@ -1,795 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client Configuration" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Configuración de cliente",IDC_STATIC,7,7,206,142 - LTEXT "Nombre de &célula:",IDC_STATIC,13,23,61,8 - EDITTEXT IDC_CELL,76,21,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "&Obtener señales de AFS al iniciar la sesión en Windows", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, - 193,10 - CONTROL "&Proporcionar una Pasarela de AFS Light",IDC_GATEWAY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "&Mostrar el icono AFS Client en la barra de tareas", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, - 193,10 - LTEXT "Nota: estos controles están inhabilitados porque el servicio de AFS Client no se está ejecutando. ", - IDC_WARN,13,124,193,17 - GROUPBOX "Estado de cliente",IDC_STATIC,7,157,206,61 - LTEXT "(consultando estado actual)",IDC_STATUS,13,172,193,17 - PUSHBUTTON "&Iniciar servicio",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "De&tener servicio",IDC_SERVICE_STOP,151,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 154 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Configuración de cliente",IDC_STATIC,7,7,231,140 - LTEXT "&Pasarela:",IDC_STATIC,13,28,31,8 - EDITTEXT IDC_GATEWAY,57,27,110,13,ES_AUTOHSCROLL - PUSHBUTTON "Conectar a&hora",IDC_GATEWAY_CONN,172,27,57,14 - LTEXT "Nombre de &célula:",IDC_STATIC,13,51,62,8 - EDITTEXT IDC_CELL,76,49,110,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "&Obtener señales de AFS al iniciar la sesión en Windows", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73, - 219,10 - CONTROL "&Mostrar el icono AFS Light en la barra de tareas", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,93, - 214,10 - LTEXT "Nota: estos controles están inhabilitados porque el AFS Light no está conectado a una pasarela de AFS.", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 239 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Preferencias" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Preferencias de servidor",-1,7,7,206,225 - CONTROL "Mostrar &preferencias de servidor de archivos", - IDC_SHOW_FS,"Button",BS_AUTORADIOBUTTON,13,21,193,10 - CONTROL "Mostrar preferencias de servidor de ubicación de &volumen", - IDC_SHOW_VLS,"Button",BS_AUTORADIOBUTTON,13,34,194,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 49,173,120 - PUSHBUTTON "&Añadir...",IDC_ADD,84,172,50,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,137,172,50,14 - PUSHBUTTON "^",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "&Importar...",IDC_IMPORT,13,172,50,14 - LTEXT "Nota: estos controles están inhabilitados porque el servicio de AFS Client no se está ejecutando. ", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Células de AFS" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Células de AFS",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "&Añadir...",IDC_ADD,51,195,50,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 247 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Letras de unidad" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Letras de unidad",IDC_STATIC,7,7,206,233 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,40,193,135 - PUSHBUTTON "&Añadir...",IDC_ADD,75,182,42,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,120,182,42,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,165,182,42,14 - LTEXT "Letras de unidad correlacionadas con las vías de acceso de AFS:", - IDC_STATIC,13,21,193,17 - PUSHBUTTON "A&vanzado...",IDC_ADVANCED,13,182,53,14 - LTEXT "Nota: estos controles están inhabilitados porque el servicio de AFS Client no se está ejecutando. ", - IDC_WARN,13,202,193,32 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Avanzado" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_CACHE_SIZE,97,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,97,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,97,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,97,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "&Inicio de sesión...",IDC_LOGON_PARMS,13,129,68,14 - PUSHBUTTON "&Unidades globales...",IDC_AUTOMAP_PARMS,13,173,68,14 - PUSHBUTTON "&Varios...",IDC_MISC_PARMS,13,195,67,14 - GROUPBOX "Configuración de antememoria",IDC_STATIC,7,7,206,100 - LTEXT "&Tamaño de antememoria:",IDC_STATIC,13,23,82,8 - LTEXT "Kb",IDC_INUSE,150,23,32,8 - LTEXT "Tamaño de &fragmento:",IDC_STATIC,13,64,79,8 - LTEXT "Kb",IDC_STATIC,151,64,40,8 - LTEXT "Antememoria de e&stado:",IDC_STATIC,13,85,81,8 - LTEXT "entradas",IDC_STATIC,150,85,43,8 - LTEXT "&Vía acceso antememoria:",IDC_STATIC,13,44,81,8 - GROUPBOX "Parámetros avanzados adicionales",IDC_STATIC,7,114,206, - 104 - LTEXT "Crear correlaciones de unidad de AFS global.", - IDC_STATIC,85,171,120,18 - LTEXT "Ajustar configuración de inicio de sesión integrada.", - IDC_STATIC,86,128,124,17 - LTEXT "Definir otros parámetros avanzados diferentes.", - IDC_STATIC,83,193,121,17 - PUSHBUTTON "&Diagnóstico...",IDC_DIAG_PARMS,13,150,68,14 - LTEXT "Habilitar configuración para la depuración de problemas.", - IDC_STATIC,85,149,121,19 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Especificar prioridad de servidor" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Puede especificar un rango de prioridad para un servidor en esta célula de AFS. Los servidores con rangos con numeraciones inferiores se consultan en primer lugar al buscar datos en AFS. ", - IDC_STATIC,7,7,237,25 - LTEXT "&Servidor:",IDC_STATIC,34,38,30,8 - LTEXT "&Rango:",IDC_STATIC,34,54,33,8 - EDITTEXT IDC_SERVER,69,36,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,69,52,36,13,ES_AUTOHSCROLL - LTEXT "Sugerencia: puede especificar rangos para diversos servidores a la vez utilizando el botón Importar para leer un archivo de texto especificando servidores y sus rangos. ", - IDC_STATIC,7,70,237,28 - PUSHBUTTON "Cancelar",IDCANCEL,140,102,50,14 - PUSHBUTTON "Aceptar",IDOK,86,102,50,14 - PUSHBUTTON "Ayuda",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Propiedades de célula" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "La información de esta página indica a AFS el modo de contactar con la célula especificada.", - IDC_STATIC,4,4,226,17 - LTEXT "Célula de &AFS:",IDC_STATIC,4,24,51,8 - EDITTEXT IDC_CELL,56,22,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "&Descripción:",IDC_STATIC,4,41,44,8 - EDITTEXT IDC_COMMENT,55,39,181,13,ES_AUTOHSCROLL - GROUPBOX "Servidores",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "A&ñadir...",IDC_ADD,75,198,50,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 261, 111 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Añadir/editar servidor" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Entre el nombre de un Servidor de ubicación de volumen en la célula especificada.", - IDC_STATIC,7,7,247,18 - LTEXT "&Nombre de servidor:",IDC_STATIC,7,31,67,8 - EDITTEXT IDC_COMMENT,84,29,170,13,ES_AUTOHSCROLL - LTEXT "&Dirección de servidor:",IDC_STATIC,7,52,70,8 - CONTROL "&Utilizar dirección específica:",IDC_ADDR_SPECIFIC, - "Button",BS_AUTORADIOBUTTON,83,52,103,10 - CONTROL "&Buscar dirección automáticamente",IDC_ADDR_LOOKUP, - "Button",BS_AUTORADIOBUTTON,83,66,154,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,188,51, - 65,13 - PUSHBUTTON "Cancelar",IDCANCEL,140,90,50,14 - PUSHBUTTON "Aceptar",IDOK,86,90,50,14 - PUSHBUTTON "Ayuda",9,204,90,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Correlacionar letra de unidad" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Puede correlacionar letras de unidad en el sistema con vías de acceso de AFS.", - IDC_STATIC,7,7,283,8 - LTEXT "Por ejemplo, si correlaciona la unidad Q como /afs/acme.com/usr/bob, los archivos disponibles en AFS como /afs/acme.com/usr/bob/* resultarán visibles en el directorio Q:\\ del sistema.", - IDC_STATIC,7,26,283,26 - LTEXT "Letra de &unidad:",IDC_STATIC,30,59,71,8 - COMBOBOX IDC_DRIVE,108,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Vía de acceso de AFS:",IDC_STATIC,30,77,77,8 - EDITTEXT IDC_PATH,108,75,168,13,ES_AUTOHSCROLL - LTEXT "D&escripción:",IDC_STATIC,29,96,49,8 - EDITTEXT IDC_DESC,107,94,72,13,ES_AUTOHSCROLL - CONTROL "&Restaurar esta correlación cada vez que se inicie la sesión", - IDC_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,28, - 112,256,10 - PUSHBUTTON "Cancelar",IDCANCEL,186,135,50,14 - PUSHBUTTON "Aceptar",IDOK,132,135,50,14 - PUSHBUTTON "Ayuda",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Submontajes" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "El sistema puede proporcionar submontajes--compartimientos de red en AFS.", - IDC_STATIC,4,4,196,18 - GROUPBOX "Submontajes",IDC_STATIC,4,26,236,168 - LTEXT "Los siguientes submontajes se comparten desde este sistema:", - IDC_STATIC,10,42,219,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 54,223,115 - PUSHBUTTON "&Añadir...",IDC_ADD,78,173,50,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,131,173,50,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,184,173,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 290, 111 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Especificar submontaje" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Los submontajes le permiten compartir un árbol de subdirectorio de AFS utilizando Trabajo en red de Windows. ", - IDC_STATIC,7,7,276,16 - LTEXT "&Submontaje:",IDC_STATIC,22,27,74,8 - LTEXT "&Vía de acceso de AFS:",IDC_STATIC,22,43,74,8 - EDITTEXT IDC_SUBMOUNT,99,25,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,99,41,181,13,ES_AUTOHSCROLL - LTEXT "Entre un nombre corto para el submontaje y una vía de acceso de AFS completa en el lugar en el que se le indique. La vía de acceso de AFS puede comenzar por ""\\afs"" (si no es así, ""\\afs"" se añadirá de modo automático).", - IDC_STATIC,7,60,276,25 - PUSHBUTTON "Cancelar",IDCANCEL,159,90,50,14 - PUSHBUTTON "Aceptar",IDOK,105,90,50,14 - PUSHBUTTON "Ayuda",9,233,90,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Letras de unidad" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Letras de unidad",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,28,219,60 - PUSHBUTTON "&Añadir...",IDC_ADD,100,91,42,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,145,91,42,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,190,91,42,14 - LTEXT "Letras de unidad correlacionadas con las vías de acceso de AFS:", - IDC_STATIC,13,17,218,8 - LTEXT "Nota: estos controles se inhabilitan porque AFS Light no está conectado a una pasarela de AFS.", - IDC_WARN,13,109,219,25 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Células de AFS" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Células de AFS",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "&Añadir...",IDC_ADD,75,116,50,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 219, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Servicio de AFS Client" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "",IDC_STATIC,4,0,211,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "Espere por favor; el servicio de AFS Client se está iniciando...", - IDC_STARTING,43,14,165,24 - LTEXT "Espere por favor; el servicio de AFS Client se está deteniendo...", - IDC_STOPPING,45,16,157,19 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Célula por omisión",IDC_STATIC,7,7,206,54 - LTEXT "Entre el nombre de la célula de AFS por omisión a administrar:", - IDC_STATIC,14,19,193,8 - LTEXT "Célula por omisión:",IDC_STATIC,14,33,39,16 - EDITTEXT IDC_CELL,59,35,147,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "Células de AFS",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "&Añadir...",IDC_ADD,51,227,50,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuración de varios" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,113,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,113,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,113,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,113,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,112,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,112,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,112,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,55,172,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,109,172,50,14 - PUSHBUTTON "Ayuda",9,163,172,50,14 - GROUPBOX "Parámetros",IDC_STATIC,7,7,206,156 - LTEXT "Intervalo de &investigación:",IDC_STATIC,15,42,85,8 - LTEXT "segundos",IDC_STATIC,151,41,41,8 - LTEXT "Subprocesos de &fondo:",IDC_STATIC,15,62,79,8 - LTEXT "subprocesos",IDC_STATIC,151,62,43,8 - LTEXT "S&ubprocesos de servicio:",IDC_STATIC,15,82,83,8 - LTEXT "subprocesos",IDC_STATIC,151,82,45,8 - LTEXT "Nombre de &sistema:",IDC_STATIC,15,102,71,8 - LTEXT "Directorio de &montaje:",IDC_STATIC,15,122,71,8 - LTEXT "Número de adaptador de &LAN:",IDC_STATIC,15,22,97,8 - LTEXT "Volumen de &raíz:",IDC_STATIC,15,141,71,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuración de diagnóstico" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,142,20,32,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,52,114,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,106,114,50,14 - PUSHBUTTON "Ayuda",9,160,114,50,14 - GROUPBOX "Parámetros de registro de seguimiento",IDC_STATIC,7,7, - 203,54 - LTEXT "Tamaño de &almacenamiento intermedio:",IDC_STATIC,13,22, - 126,8 - LTEXT "Kb",IDC_STATIC,181,24,10,8 - GROUPBOX "Parámetros de registro de evento",IDC_STATIC,7,69,203, - 35 - COMBOBOX IDC_TRAP_ON_PANIC,141,40,32,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Capturar en emergencia:",IDC_STATIC,13,42,89,8 - LTEXT "Comunicar procesos de inicio de sesión:",IDC_STATIC,13, - 86,126,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,141,84,32,64, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 218, 93 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuración de inicio de sesión" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,164,18,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,164,39,32,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Aceptar",IDOK,21,72,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,75,72,50,14 - PUSHBUTTON "Ayuda",9,161,72,50,14 - LTEXT "Intervalo de &reintento de inicio de sesión:", - IDC_STATIC,13,20,132,8 - GROUPBOX "Parámetros",IDC_STATIC,7,7,204,54 - LTEXT "Inicios de sesión a&nómalos de modo silencioso:", - IDC_STATIC,13,41,149,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Unidades globales" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Cerrar",IDOK,141,148,50,14 - PUSHBUTTON "Ayuda",9,196,148,50,14 - PUSHBUTTON "&Añadir",IDC_ADD,108,117,42,14 - GROUPBOX "Unidades de AFS correlacionadas globalmente",IDC_STATIC, - 7,7,239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "&Cambiar",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 275, 119 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Correlacionar unidad global" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_DRIVE,94,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,94,42,168,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,93,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,111,96,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,165,96,50,14 - PUSHBUTTON "Ayuda",9,219,96,50,14 - LTEXT "Letra de &unidad:",IDC_STATIC,16,25,73,8 - LTEXT "&Vía de acceso de AFS:",IDC_STATIC,16,44,78,8 - LTEXT "D&escripción:",IDC_STATIC,15,64,38,8 - GROUPBOX "Unidad de AFS global",IDC_STATIC,7,7,262,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 147 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 232 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 240 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 104 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 283 - TOPMARGIN, 7 - BOTTOMMARGIN, 104 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 211 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END - - IDD_GLOBAL_DRIVES_ADDEDIT, DIALOG - BEGIN - RIGHTMARGIN, 247 - BOTTOMMARGIN, 118 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Client Configuration""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "Configuración de AFS Client" - IDS_TITLE_95 "Configuración de AFS Light" - IDS_STATE_STOPPED "El servicio de AFS Client está detenido en la actualidad." - IDS_STATE_RUNNING "El servicio de AFS Client se está ejecutando normalmente." - IDS_STATE_STARTING "Espere por favor; el servicio de AFS Client se está iniciando..." - IDS_STATE_STOPPING "Espere por favor; el servicio de AFS Client se está deteniendo..." - IDS_STATE_UNKNOWN "El servicio de AFS Client no está debidamente configurado." - IDS_SERVICE_FAIL_START "No ha podido iniciarse satisfactoriamente el Servicio de AFS Client. Es posible que no disponga de autorización para efectuar esta operación.\n\nError 0x%1." - IDS_SERVICE_FAIL_STOP "No ha podido detenerse satisfactoriamente el Servicio de AFS Client. Es posible que no disponga de autorización para efectuar esta operación.\n\nError 0x%1." - IDS_WARN_STOPPED "Los controles inhabilitados no pueden cambiarse porque el servicio de AFS Client no se está ejecutando." - IDS_WARN_ADMIN "Los controles inhabilitados no pueden cambiarse porque no ha iniciado la sesión en Windows como administrador." - IDS_CELL_UNKNOWN "(desconocido)" - IDS_GATEWAY_UNKNOWN "(desconocido)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows no ha podido encontrar una dirección de red para %1. Asegúrese de que ha escrito correctamente el nombre de la máquina." - IDS_NEWSUB_DESC "AFS no ha podido utilizar la descripción especificada al conectar la unidad de red.\n\nLa descripción especificada ya se ha utilizado para otra vía de acceso de AFS diferente. " - IDS_BADSUB_DESC "No puede utilizarse la descripción de la letra de unidad entrada.\n\nUna descripción de letra de unidad no puede tener más de 12 caracteres y no puede contener ni espacios ni tabuladores. " - IDS_BADGATEWAY_DESC "AFS no ha podido encontrar la máquina de pasarela especificada.\n\nAsegúrese de que ha escrito correctamente el nombre de la máquina de pasarela." - IDS_BADGWCELL_DESC "No se ha podido encontrar información de configuración para la célula de AFS utilizada por la máquina de pasarela especificada.\n\nSi desea configurar el AFS Client en una nueva célula, debe utilizar el tabulador de Células de AFS para añadir información de configuración para dicha célula.\n\nCélula: %1" - IDS_TITLE_CAUTION_NT "Precaución - Configuración de AFS Client" - IDS_TITLE_CAUTION_95 "Precaución - Configuración de AFS Light" - IDS_TITLE_ERROR_NT "Error - Configuración de AFS Client" - IDS_TITLE_ERROR_95 "Error - Configuración de AFS Light" - IDS_SHRINKCACHE "No puede reducirse el tamaño de antememoria de AFS Client mientras se esté ejecutando el servicio de AFS Client.\n\nPara reducir el tamaño de la antememoria, utilice en primer lugar el botón de Detener servicio del tabulador General para detener el servicio de AFS Client." - IDS_BADCELL_DESC_CC "No ha podido encontrarse información de configuración para la célula de AFS entrada.\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "Los archivos almacenados en AFS no resultarán accesibles desde este sistema si se detiene el servicio de AFS Client.\n\n¿Está seguro de que desea detener el servicio?" - IDS_PREFCOL_SERVER "Servidor" - IDS_PREFCOL_RANK "Clasificación" - IDS_TIP_PREFS "Sugerencia: A los servidores con números de clasificación inferiores se les concederá prioridad al leer archivos a través de AFS." - IDS_PREFERROR_RESOLVE "AFS no ha podido encontrar el servidor denominado %1. Por favor, asegúrese de que ha entrado correctamente el servidor." - IDS_FILTER_TXT "Archivos de texto (*.TXT);*.TXT;" - IDS_HOSTREM_MANY "Ha optado por eliminar toda información de contacto para las células de AFS seleccionadas.\n\n¿Está seguro de que desea eliminar dichas entradas?" - IDS_HOSTREM_ONE "Ha optado por eliminar toda información de contacto para la célula de AFS %1.\n\n¿Está seguro de que desea eliminar esta entrada?" - IDS_CELLEDIT_TITLE "%1 - Propiedades" - IDS_CELLADD_TITLE "Célula nueva" - IDS_SVRCOL_SERVER "Dirección" - IDS_SVRCOL_COMMENT "Nombre de servidor" - IDS_TIP_DRIVES "Sugerencia: Puede conectar una correlación de unidad de red seleccionando el recuadro que hay junto a la letra de unidad de la correlación." - IDS_MAP_LETTER "Unidad *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Unidad %1: \t%2" - IDS_ERROR_MAP "Error al correlacionar unidad de red" - IDS_ERROR_MAP_DESC "AFS no ha podido correlacionar unidad de red con la vía de acceso especificada en AFS. Asegúrese de que la letra de unidad no se está utilizando en la actualidad.\n\nError: 0x%1." - IDS_ERROR_UNMAP "Error al correlacionar unidad de red" - IDS_ERROR_UNMAP_DESC "AFS no ha podido descorrelacionar unidad de red especificada. Asegúrese de que la letra de unidad no se está utilizando en la actualidad.\n\nError: 0x%1." - IDS_ADDSERVER_TITLE "Añadir servidor" - IDS_EDITSERVER_TITLE "Editar servidor" - IDS_SUBCOL_SHARE "Submontaje" - IDS_SUBCOL_PATH "Vía de acceso de AFS" - IDS_SUBMOUNTS_TITLE "Submontajes" - IDS_BADCELL_DESC "No ha podido encontrarse información de configuración para la célula de AFS entrada.\n\n+" - IDS_BADCELL_DESC2 "Compruebe el nombre de la célula para asegurarse de que lo ha entrado correctamente. Si desea configurar el AFS Client en una nueva célula, debe utilizar el tabulador de Células de AFS para añadir información de configuración para dicha célula." - IDS_KB_IN_USE "kb (%1 kb en uso)" - IDS_NOGATEWAY_TITLE "Pasarela de AFS no válida" - IDS_NOGATEWAY_DESC "AFS Light no puede configurarse debido a que no ha especificado una pasarela de AFS.\n\nPor favor, entre el nombre o dirección IP de una pasarela de AFS en el área facilitada." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "El AFS Client no puede configurarse debido a que no ha especificado una célula de AFS.\n\nPor favor, entre el nombre de una célula de AFS en el área facilitada." - IDS_STOPPED_NOCELL "Debe especificar una célula de AFS antes de que pueda iniciarse el servicio de AFS Client." - IDS_OKSTOP_DESC "El servicio de AFS Client no está ejecutándose. Los archivos almacenados en AFS no resultarán accesibles desde este sistema hasta que se inicie el servicio de AFS Client.\n\n¿Desea iniciar el servicio en este momento?" - IDS_BADMAP_DESC "AFS no ha podido correlacionar una letra de unidad con la vía de acceso especificada debido a que la vía de acceso no comienza por ""\\afs"".\n\nAsegúrese de que la vía de acceso entrada comienza por ""\\afs"" y vuélvalo a intentar." - IDS_RESTART_TITLE "Configuración de AFS Client" - IDS_RESTART_DESC "Algunos de los cambios efectuados no surtirán efecto hasta que el servicio de AFS Client no se haya detenido y reiniciado.\n\n¿Desea detener y reiniciar el servicio en este momento?" - IDS_KB_ONLY "kb" - IDS_FAILCONFIG_AUTHENT "Se ha producido un error al intentar habilitar o inhabilitar la autentificación en el inicio de sesión.\n\nError %1" - IDS_FAILCONFIG_PREFS "No han podido utilizarse algunas de las prioridades de clasificación del servidor correlacionadas.\n\nError %1" - IDS_FAILCONFIG_CACHE "El tamaño de antememoria de AFS Client entrado no ha podido utilizarse.\n\nError %1" - IDS_FAILCONFIG_PROBE "El intervalo de investigación de AFS Client entrado no ha podido utilizarse.\n\nError %1" - IDS_FAILCONFIG_SYSNAME "El nombre de sistema de AFS Client entrado no ha podido utilizarse.\n\nError %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "Compruebe el nombre de la célula para asegurarse de que lo ha entrado correctamente. Si en la lista de Células de AFS no aparece el nombre de célula correcto, utilice el botón Añadir para crear una entrada para la célula." - IDS_NOCELL_DESC_CC "El AFS Control Center no puede configurarse debido a que no ha especificado una célula de AFS por omisión.\n\nPor favor, entre el nombre de una célula de AFS en el área facilitada." - IDS_TITLE_CAUTION_CCENTER "Precaución - Propiedades de AFS Control Center" - IDS_TITLE_ERROR_CCENTER "Error - Propiedades de AFS Control Center" - IDS_TITLE_CCENTER "Propiedades de AFS Control Center" - IDS_YES "Sí" - IDS_NO "No" - IDS_DRIVE "Unidad" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/ja_JP/afs_config.rc b/src/WINNT/client_config/lang/ja_JP/afs_config.rc deleted file mode 100644 index 1e13df60b..000000000 --- a/src/WINNT/client_config/lang/ja_JP/afs_config.rc +++ /dev/null @@ -1,781 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒNƒ‰ƒCƒAƒ“ƒg\¬",IDC_STATIC,7,7,206,142 - LTEXT "ƒZƒ‹–¼(&C):",IDC_STATIC,13,24,39,8 - EDITTEXT IDC_CELL,59,23,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "Windows ‚ւ̃ƒOƒCƒ“Žž‚É AFS ƒg[ƒNƒ“‚ðŽæ“¾(&O)", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,50, - 198,10 - CONTROL "AFS Light ƒQ[ƒgƒEƒFƒC‚ð’ñ‹Ÿ(&P)",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,72,193,10 - CONTROL "ƒ^ƒXƒNƒo[‚ÉAFSƒNƒ‰ƒCƒAƒ“ƒgEƒAƒCƒRƒ“‚ð•\ަ(&H)", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,95, - 201,10 - LTEXT "’: AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁A‚±‚ê‚ç‚̐§Œä‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB", - IDC_WARN,13,124,193,17 - GROUPBOX "ƒNƒ‰ƒCƒAƒ“ƒgó‹µ",IDC_STATIC,7,157,206,61 - LTEXT "(Œ»Ý‚Ìó‹µ‚ðÆ‰ï’†)",IDC_STATUS,13,172,193,17 - PUSHBUTTON "ƒT[ƒrƒX‚ÌŠJŽn(&S)",IDC_SERVICE_START,48,195,77,14 - PUSHBUTTON "ƒT[ƒrƒX‚Ì’âŽ~(&T)",IDC_SERVICE_STOP,129,195,77,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒNƒ‰ƒCƒAƒ“ƒg\¬",IDC_STATIC,7,7,231,131 - LTEXT "ƒQ[ƒgƒEƒFƒC(&G):",IDC_STATIC,13,19,51,8 - EDITTEXT IDC_GATEWAY,57,33,110,13,ES_AUTOHSCROLL - PUSHBUTTON "‘¦ŽžÚ‘±(&N)",IDC_GATEWAY_CONN,177,33,57,14 - LTEXT "ƒZƒ‹–¼(&C):",IDC_STATIC,13,57,37,8 - EDITTEXT IDC_CELL,57,55,110,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "Windows ‚ւ̃ƒOƒCƒ“Žž‚É AFS ƒg[ƒNƒ“‚ðŽæ“¾(&O)", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,77, - 217,10 - CONTROL "ƒ^ƒXƒNƒo[‚É AFS Light ƒAƒCƒRƒ“‚ð•\ަ(&H)",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95,215,10 - LTEXT "’: AFS Light ‚ª AFS ƒQ[ƒgƒEƒFƒC‚ɐڑ±‚µ‚Ä‚¢‚È‚¢‚½‚߁A‚±‚ê‚ç‚̐§Œä‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ý’è" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒT[ƒo[Ý’è",-1,7,7,206,211 - CONTROL "ƒtƒ@ƒCƒ‹EƒT[ƒo[Ý’è‚Ì•\ަ(&F)",IDC_SHOW_FS,"Button", - BS_AUTORADIOBUTTON,10,21,193,10 - CONTROL "ƒ{ƒŠƒ…[ƒ€EƒƒP[ƒVƒ‡ƒ“EƒT[ƒo[Ý’è‚Ì•\ަ(&V)", - IDC_SHOW_VLS,"Button",BS_AUTORADIOBUTTON,10,36,193,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 54,173,115 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,81,173,50,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,137,173,50,14 - PUSHBUTTON "ª",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "«",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "ƒCƒ“ƒ|[ƒg(&I)...",IDC_IMPORT,13,173,62,14 - LTEXT "’: AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁A‚±‚ê‚ç‚̐§Œä‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB", - IDC_WARN,13,196,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ƒZƒ‹" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "AFS ƒZƒ‹",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,51,195,50,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒhƒ‰ƒCƒu–¼" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒhƒ‰ƒCƒu–¼",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,193,135 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,75,171,42,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,120,171,42,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,165,171,42,14 - LTEXT "AFS “à‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO‚³‚ꂽƒhƒ‰ƒCƒu–¼:",IDC_STATIC, - 13,21,193,8 - PUSHBUTTON "Šg’£(&V)...",IDC_ADVANCED,13,171,53,14 - LTEXT "’: AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁A‚±‚ê‚ç‚̐§Œä‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB", - IDC_WARN,13,193,193,17 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Šg’£" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_CACHE_SIZE,108,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,108,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,108,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,108,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "ƒƒOƒIƒ“(&L)...",IDC_LOGON_PARMS,13,128,57,14 - PUSHBUTTON "ƒOƒ[ƒoƒ‹Eƒhƒ‰ƒCƒu(&G)...",IDC_AUTOMAP_PARMS,13,173, - 106,14 - PUSHBUTTON "ŠeŽí(&M)...",IDC_MISC_PARMS,13,195,56,14 - GROUPBOX "ƒLƒƒƒbƒVƒ…\¬",IDC_STATIC,7,7,206,100 - LTEXT "ƒLƒƒƒbƒVƒ…EƒTƒCƒY(&C):",IDC_STATIC,13,23,73,8 - LTEXT "kb",IDC_INUSE,155,23,17,8 - LTEXT "ƒ`ƒƒƒ“ƒNEƒTƒCƒY(&H):",IDC_STATIC,13,64,73,8 - LTEXT "kb",IDC_STATIC,155,65,17,8 - LTEXT "ó‹µƒLƒƒƒbƒVƒ…(&S):",IDC_STATIC,13,85,73,8 - LTEXT "€–Ú",IDC_STATIC,155,85,17,8 - LTEXT "ƒLƒƒƒbƒVƒ…EƒpƒX(&P):",IDC_STATIC,13,44,73,8 - GROUPBOX "’ljÁ‚ÌŠg’£ƒpƒ‰ƒ[ƒ^[",IDC_STATIC,7,114,206,104 - LTEXT "ƒOƒ[ƒoƒ‹ AFS ƒhƒ‰ƒCƒuEƒ}ƒbƒsƒ“ƒO‚̍쐬B",IDC_STATIC, - 124,167,79,28 - LTEXT "“‡ƒƒOƒIƒ“‚̐ݒè‚Ì’²®B",IDC_STATIC,74,132,133,10 - LTEXT "‚»‚Ì‘¼ŠeŽí‚̃pƒ‰ƒ[ƒ^[‚̐ݒèB",IDC_STATIC,74,199,132, - 10 - PUSHBUTTON "f’f(&D)...",IDC_DIAG_PARMS,13,150,56,14 - LTEXT "–â‘èƒfƒoƒbƒO—p‚̐ݒè‚ð‰Â”\‚É‚·‚éB",IDC_STATIC,74,151, - 137,11 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒT[ƒo[—Dæ‡ˆÊ‚ÌŽw’è" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‚±‚Ì AFS ƒZƒ‹“à‚̃T[ƒo[‚Ì—Dæ‡ˆÊƒ‰ƒ“ƒN‚ðŽw’è‚Å‚«‚Ü‚·BAFS “à‚̃f[ƒ^‚ðŒŸõ‚·‚邯‚«A”ԍ†‚̏¬‚³‚¢ƒ‰ƒ“ƒN‚ðŽ‚ÂƒT[ƒo[‚ªÅ‰‚ɏƉ‚ê‚Ü‚·B", - IDC_STATIC,7,5,237,23 - LTEXT "ƒT[ƒo[(&S):",IDC_STATIC,34,37,49,8 - LTEXT "ƒ‰ƒ“ƒN(&R):",IDC_STATIC,34,55,42,8 - EDITTEXT IDC_SERVER,93,35,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,93,53,80,13,ES_AUTOHSCROLL - LTEXT "ƒqƒ“ƒg: uƒCƒ“ƒ|[ƒgvƒ{ƒ^ƒ“‚ðŽg—p‚µ‚āAƒT[ƒo[‚Æ‚»‚̃‰ƒ“ƒN‚ðŽw’è‚·‚éƒeƒLƒXƒgEƒtƒ@ƒCƒ‹‚ð“ǂݎæ‚èA•¡”‚̃T[ƒo[‚̃‰ƒ“ƒN‚ðˆê“x‚ÉŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,7,75,237,20 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,140,102,50,14 - PUSHBUTTON "—¹‰ð",IDOK,86,102,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒZƒ‹EƒvƒƒpƒeƒB[" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‚±‚̃y[ƒW‚̏î•ñ‚Í AFS ‚ÉŽw’è‚̃Zƒ‹‚Ƃ̐ڑ±•û–@‚ð“`‚¦‚Ü‚·B", - IDC_STATIC,4,4,235,8 - LTEXT "AFS ƒZƒ‹(&F):",IDC_STATIC,4,24,50,8 - EDITTEXT IDC_CELL,64,24,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "‹Lq(&D):",IDC_STATIC,4,41,38,8 - EDITTEXT IDC_COMMENT,64,39,176,13,ES_AUTOHSCROLL - GROUPBOX "ƒT[ƒo[",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,75,198,50,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 251, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒT[ƒo[‚̒ljÁ / •ҏW" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒ{ƒŠƒ…[ƒ€EƒƒP[ƒVƒ‡ƒ“EƒT[ƒo[‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,7,7,239,8 - LTEXT "ƒT[ƒo[–¼(&N):",IDC_STATIC,7,27,58,8 - EDITTEXT IDC_COMMENT,73,25,170,13,ES_AUTOHSCROLL - LTEXT "ƒT[ƒo[EƒAƒhƒŒƒX(&A):",IDC_STATIC,7,46,89,8 - CONTROL "“Á’èƒAƒhƒŒƒX‚ÌŽg—p(&U):",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,63,60,100,10 - CONTROL "ƒAƒhƒŒƒX‚ðŽ©“®“I‚ÉŒŸõ(&L)",IDC_ADDR_LOOKUP,"Button", - BS_AUTORADIOBUTTON,63,76,100,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,171,59, - 65,13 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,140,91,50,14 - PUSHBUTTON "—¹‰ð",IDOK,86,91,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,194,91,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒhƒ‰ƒCƒu–¼‚̃}ƒbƒsƒ“ƒO" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒRƒ“ƒsƒ…[ƒ^[‚̃hƒ‰ƒCƒu–¼‚ð AFS “à‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,7,7,283,8 - LTEXT "‚½‚Æ‚¦‚΁Aƒhƒ‰ƒCƒu Q ‚ð /afs/acme.com/usr/bob ‚Æ‚µ‚ă}ƒbƒsƒ“ƒO‚·‚邯A/afs/acme.com/usr/bob/* ‚Æ‚µ‚Ä AFS “à‚ÅŽg—p‰Â”\‚ȃtƒ@ƒCƒ‹‚̓Rƒ“ƒsƒ…[ƒ^[‚Ì Q:\\ ƒfƒBƒŒƒNƒgƒŠ[‚ÅŒ©‚邱‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,7,23,283,26 - LTEXT "ƒhƒ‰ƒCƒu–¼(&D):",IDC_STATIC,30,59,58,8 - COMBOBOX IDC_DRIVE,97,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ƒpƒX(&P):",IDC_STATIC,30,77,58,8 - EDITTEXT IDC_PATH,97,75,168,13,ES_AUTOHSCROLL - LTEXT "‹Lq(&E):",IDC_STATIC,30,96,58,8 - EDITTEXT IDC_DESC,97,94,72,13,ES_AUTOHSCROLL - CONTROL "ƒƒOƒIƒ“Žž‚É‚±‚̃}ƒbƒsƒ“ƒO‚𕜌³(&R)",IDC_PERSISTENT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,97,112,188,10 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,186,135,50,14 - PUSHBUTTON "—¹‰ð",IDOK,132,135,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒTƒuƒ}ƒEƒ“ƒg" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ‚ŃTƒuƒ}ƒEƒ“ƒg--ƒlƒbƒgƒ[ƒN‹¤—p‚ð’ñ‹Ÿ‚Å‚«‚Ü‚·B", - IDC_STATIC,7,4,229,8 - GROUPBOX "ƒTƒuƒ}ƒEƒ“ƒg",IDC_STATIC,4,26,236,168 - LTEXT "ˆÈ‰º‚̃Tƒuƒ}ƒEƒ“ƒg‚ª‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚©‚狤—p‚³‚ê‚Ü‚·:", - IDC_STATIC,10,42,223,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 55,223,115 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,78,175,50,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,131,175,50,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,184,175,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 271, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒTƒuƒ}ƒEƒ“ƒg‚ÌŽw’è" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒTƒuƒ}ƒEƒ“ƒg‚́AWindows ƒlƒbƒgƒ[ƒLƒ“ƒO‚ðŽg—p‚µ‚½ AFS ƒTƒuƒfƒBƒŒƒNƒgƒŠ[EƒcƒŠ[‚Ì‹¤—p‚ð‰Â”\‚É‚µ‚Ü‚·B", - IDC_STATIC,10,7,251,18 - LTEXT "ƒTƒuƒ}ƒEƒ“ƒg(&S):",IDC_STATIC,21,34,47,11 - LTEXT "AFS ƒpƒX(&P):",IDC_STATIC,29,54,39,12 - EDITTEXT IDC_SUBMOUNT,78,33,93,14,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,78,53,177,14,ES_AUTOHSCROLL - LTEXT "ƒvƒƒ“ƒvƒg‚ɃTƒuƒ}ƒEƒ“ƒg‚Ì’Z‚¢–¼‘O‚ƃtƒ‹ AFS ƒpƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢BAFS ƒpƒX‚Í ""\\afs"" ‚ÅŽn‚Ü‚è‚Ü‚· (Žn‚Ü‚Á‚Ä‚¢‚È‚¢ê‡‚́A""\\afs"" ‚ªŽ©“®“I‚ɒljÁ‚³‚ê‚Ü‚·)B", - IDC_STATIC,10,76,251,18 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,159,102,50,14 - PUSHBUTTON "—¹‰ð",IDOK,105,102,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,213,102,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒhƒ‰ƒCƒu–¼" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒhƒ‰ƒCƒu–¼",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,219,60 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,100,95,42,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,145,95,42,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,190,95,42,14 - LTEXT "AFS “à‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO‚³‚ꂽƒhƒ‰ƒCƒu–¼:",IDC_STATIC, - 13,21,193,8 - LTEXT "’: AFS Light ƒT[ƒrƒX‚ª AFS ƒQ[ƒgƒEƒFƒC‚ɐڑ±‚µ‚Ä‚¢‚È‚¢‚½‚߁A‚±‚ê‚ç‚̃Rƒ“ƒgƒ[ƒ‹‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB", - IDC_WARN,13,116,219,17 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ƒZƒ‹" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "AFS ƒZƒ‹",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,218,94 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,75,119,50,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,128,119,50,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,181,119,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 289, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - GROUPBOX "",IDC_STATIC,4,0,280,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn’†‚Å‚·...", - IDC_STARTING,46,20,228,8 - LTEXT "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~’†‚Å‚·...", - IDC_STOPPING,46,20,234,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ˆê”Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - GROUPBOX "ƒfƒtƒHƒ‹ƒgEƒZƒ‹",IDC_STATIC,1,7,214,54 - LTEXT "ŠÇ—‚·‚éƒfƒtƒHƒ‹ƒgAFSƒZƒ‹‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢:", - IDC_STATIC,8,21,201,8 - LTEXT "ƒfƒtƒHƒ‹ƒgEƒZƒ‹:",IDC_STATIC,8,37,50,8 - EDITTEXT IDC_CELL,68,45,143,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "AFS ƒZƒ‹",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,51,227,50,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ŠeŽí‚̍\¬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,128,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,128,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,128,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,128,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,128,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,128,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,128,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,55,172,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,109,172,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,163,172,50,14 - GROUPBOX "ƒpƒ‰ƒ[ƒ^[",IDC_STATIC,7,7,208,156 - LTEXT "ƒvƒ[ƒuŠÔŠu(&P):",IDC_STATIC,14,42,90,8 - LTEXT "•b",IDC_STATIC,180,43,28,8 - LTEXT "ƒoƒbƒNƒOƒ‰ƒEƒ“ƒhEƒXƒŒƒbƒh(&B):",IDC_STATIC,14,62,90,8 - LTEXT "ƒXƒŒƒbƒh",IDC_STATIC,180,62,28,8 - LTEXT "ƒT[ƒrƒXEƒXƒŒƒbƒh(&E):",IDC_STATIC,14,82,90,8 - LTEXT "ƒXƒŒƒbƒh",IDC_STATIC,180,82,28,8 - LTEXT "ƒVƒXƒeƒ€–¼(&Y):",IDC_STATIC,14,102,90,8 - LTEXT "ƒ}ƒEƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ[(&M):",IDC_STATIC,14,122,90,8 - LTEXT "LAN ƒAƒ_ƒvƒ^[”ԍ†(&L):",IDC_STATIC,14,22,90,8 - LTEXT "ƒ‹[ƒgEƒ{ƒŠƒ…[ƒ€(&R):",IDC_STATIC,14,141,90,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "f’f‚̍\¬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,113,21,42,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,52,114,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,106,114,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,160,114,50,14 - GROUPBOX "ƒgƒŒ[ƒXEƒƒOEƒpƒ‰ƒ[ƒ^[",IDC_STATIC,7,7,203,54 - LTEXT "ƒoƒbƒtƒ@[EƒTƒCƒY(&B):",IDC_STATIC,13,22,89,8 - LTEXT "kb",IDC_STATIC,171,24,9,8 - GROUPBOX "ƒCƒxƒ“ƒgEƒƒOEƒpƒ‰ƒ[ƒ^[",IDC_STATIC,7,69,203,35 - COMBOBOX IDC_TRAP_ON_PANIC,113,41,42,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒpƒjƒbƒNŽž‚̃gƒ‰ƒbƒv(&T):",IDC_STATIC,13,42,89,8 - LTEXT "ƒZƒbƒVƒ‡ƒ“Žn“®‚̃Œƒ|[ƒg:",IDC_STATIC,13,86,89,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,113,85,42,64, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒƒOƒCƒ“‚̍\¬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,125,17,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,125,39,42,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "—¹‰ð",IDOK,21,71,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,75,71,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,129,71,50,14 - LTEXT "ƒƒOƒCƒ“‚ÌÄŽŽsŠÔŠu(&L):",IDC_STATIC,13,20,96,8 - GROUPBOX "ƒpƒ‰ƒ[ƒ^[",IDC_STATIC,7,7,172,54 - LTEXT "ƒƒOƒCƒ“ޏ”sŽž‚É’Ê’m‚µ‚È‚¢(&F):",IDC_STATIC,13,41,96,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒOƒ[ƒoƒ‹Eƒhƒ‰ƒCƒu" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ƒNƒ[ƒY",IDOK,141,148,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,196,148,50,14 - PUSHBUTTON "’ljÁ(&A)",IDC_ADD,108,119,42,14 - GROUPBOX "ƒOƒ[ƒoƒ‹‚Ƀ}ƒbƒsƒ“ƒO‚³‚ê‚é AFS ƒhƒ‰ƒCƒu",IDC_STATIC,7, - 7,239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,22,226,89 - PUSHBUTTON "•ύX(&C)",IDC_CHANGE,153,119,42,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,198,119,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒOƒ[ƒoƒ‹Eƒhƒ‰ƒCƒu‚̃}ƒbƒsƒ“ƒO" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - COMBOBOX IDC_DRIVE,66,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,66,42,168,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,66,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,82,96,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,136,96,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,190,96,50,14 - LTEXT "ƒhƒ‰ƒCƒu–¼(&D):",IDC_STATIC,14,25,44,8 - LTEXT "AFS ƒpƒX(&P):",IDC_STATIC,14,44,44,8 - LTEXT "‹Lq(&E):",IDC_STATIC,13,64,44,8 - GROUPBOX "ƒOƒ[ƒoƒ‹ AFS ƒhƒ‰ƒCƒu",IDC_STATIC,7,7,232,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 264 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" - IDS_TITLE_95 "AFS Light \¬" - IDS_STATE_STOPPED "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ÍŒ»Ý’âŽ~‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_STATE_RUNNING "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚͐³í‚ÉŽÀs‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_STATE_STARTING "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn’†‚Å‚·..." - IDS_STATE_STOPPING "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~’†‚Å‚·..." - IDS_STATE_UNKNOWN "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ª³‚µ‚­\¬‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB" - IDS_SERVICE_FAIL_START "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚𐳏í‚ÉŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B‚±‚Ì‘€ì‚ðŽÀs‚·‚錠ŒÀ‚ðŽ‚Á‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B\n\nƒGƒ‰[ 0x%1" - IDS_SERVICE_FAIL_STOP "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚𐳏í‚É’âŽ~‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B‚±‚Ì‘€ì‚ðŽÀs‚·‚錠ŒÀ‚ðŽ‚Á‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B\n\nƒGƒ‰[ 0x%1 " - IDS_WARN_STOPPED "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚È‚¢‚½‚߁AŽg—p•s‰Â‚̐§Œä‚ð•ύX‚Å‚«‚Ü‚¹‚ñB" - IDS_WARN_ADMIN "Windows ‚ÉŠÇ—ŽÒ‚Æ‚µ‚ăƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢‚½‚߁AŽg—p•s‰Â‚̐§Œä‚ð•ύX‚Å‚«‚Ü‚¹‚ñB" - IDS_CELL_UNKNOWN "(•s–¾)" - IDS_GATEWAY_UNKNOWN "(•s–¾)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows ‚ª %1 ‚̃lƒbƒgƒ[ƒNEƒAƒhƒŒƒX‚ðŒŸõ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½Bƒ}ƒVƒ“‚Ì–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_NEWSUB_DESC "AFS ‚̓lƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̐ڑ±Žž‚ÉŽw’肳‚ꂽ‹Lq‚ðŽg—p‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nŽw’肳‚ꂽ‹Lq‚Í‚·‚łɑ¼‚Ì AFS ƒpƒX‚ÉŽg—p‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_BADSUB_DESC "“ü—Í‚µ‚½ƒhƒ‰ƒCƒu–¼‹Lq‚ðŽg—p‚Å‚«‚Ü‚¹‚ñB\n\nƒhƒ‰ƒCƒu–¼‚Ì‹Lq‚Í 12 •¶Žš‚ð’´‚¦‚Ă͂Ȃ炸AƒXƒy[ƒX‚Ü‚½‚̓^ƒu‚ðŠÜ‚ñ‚Å‚¢‚Ă͂¢‚¯‚Ü‚¹‚ñB" - IDS_BADGATEWAY_DESC "AFS ‚ªŽw’肳‚ꂽƒQ[ƒgƒEƒFƒCEƒ}ƒVƒ“‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒQ[ƒgƒEƒFƒCEƒ}ƒVƒ“‚Ì–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_BADGWCELL_DESC "Žw’肳‚ꂽƒQ[ƒgƒEƒFƒCEƒ}ƒVƒ“‚ªŽg—p‚·‚é AFS ƒZƒ‹‚̍\¬î•ñ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ðV‹KƒZƒ‹‚֍\¬‚µ‚½‚¢ê‡‚́AuAFS ƒZƒ‹vƒ^ƒu‚ðŽg—p‚µ‚āA‚»‚̃Zƒ‹‚̍\¬î•ñ‚ð’ljÁ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B\n\nƒZƒ‹: %1" - IDS_TITLE_CAUTION_NT "’ˆÓ - AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" - IDS_TITLE_CAUTION_95 "’ˆÓ - AFS Light \¬" - IDS_TITLE_ERROR_NT "ƒGƒ‰[ - AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" - IDS_TITLE_ERROR_95 "ƒGƒ‰[ - AFS Light \¬" - IDS_SHRINKCACHE "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ÌŽÀs’†‚́AAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒLƒƒƒbƒVƒ…‚̃TƒCƒY‚ð¬‚³‚­‚·‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB\n\nƒLƒƒƒbƒVƒ…‚̃TƒCƒY‚ð¬‚³‚­‚·‚é‚ɂ́A‚Ü‚¸uˆê”ʁvƒ^ƒu‚́uƒT[ƒrƒX‚Ì’âŽ~vƒ{ƒ^ƒ“‚ðŽg—p‚µ‚Ä AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_BADCELL_DESC_CC "“ü—Í‚µ‚½ AFS ƒZƒ‹‚̍\¬î•ñ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~‚·‚邯AAFS ‚ɕۊǂ³‚ꂽƒtƒ@ƒCƒ‹‚Í‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚©‚çƒAƒNƒZƒX‚Å‚«‚È‚­‚È‚è‚Ü‚·B\n\nƒT[ƒrƒX‚ð’âŽ~‚µ‚Ä‚à‚¢‚¢‚Å‚·‚©?" - IDS_PREFCOL_SERVER "ƒT[ƒo[" - IDS_PREFCOL_RANK "ƒ‰ƒ“ƒN" - IDS_TIP_PREFS "ƒqƒ“ƒg: ‚æ‚菬‚³‚¢”ԍ†‚̃‰ƒ“ƒN‚ðŽ‚ÂƒT[ƒo[‚́AAFS ‚ð’Ê‚¶‚ēǂݎæ‚ç‚ê‚邯‚«‚ɁA‚æ‚荂‚¢—Dæ‡ˆÊ‚ª—^‚¦‚ç‚ê‚Ü‚·B" - IDS_PREFERROR_RESOLVE "AFS ‚ªƒT[ƒo[ %1 ‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½BƒT[ƒo[–¼‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B" - IDS_FILTER_TXT "ƒeƒLƒXƒgEƒtƒ@ƒCƒ‹ (*.TXT);*.TXT;" - IDS_HOSTREM_MANY "‘I‘ð‚µ‚½ AFS ƒZƒ‹‚Ì‚·‚ׂĂ̐ڑ±î•ñ‚̍폜‚ð‘I‘ð‚µ‚Ü‚µ‚½B\n\n‚±‚ê‚ç‚̍€–Ú‚ðíœ‚µ‚Ä‚à‚¢‚¢‚Å‚·‚©?" - IDS_HOSTREM_ONE "AFS ƒZƒ‹ %1 ‚Ì‚·‚ׂĂ̐ڑ±î•ñ‚̍폜‚ð‘I‘ð‚µ‚Ü‚µ‚½B\n\n‚±‚ê‚ç‚̍€–Ú‚ðíœ‚µ‚Ä‚à‚¢‚¢‚Å‚·‚©?" - IDS_CELLEDIT_TITLE "%1 - ƒvƒƒpƒeƒB[" - IDS_CELLADD_TITLE "V‹KƒZƒ‹" - IDS_SVRCOL_SERVER "ƒAƒhƒŒƒX" - IDS_SVRCOL_COMMENT "ƒT[ƒo[–¼" - IDS_TIP_DRIVES "ƒqƒ“ƒg: ƒ}ƒbƒsƒ“ƒO‚̃hƒ‰ƒCƒu–¼‚̉¡‚É‚ ‚éƒ{ƒbƒNƒX‚ðƒ`ƒFƒbƒN‚·‚邯Aƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒuEƒ}ƒbƒsƒ“ƒO‚ɐڑ±‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B" - IDS_MAP_LETTER "ƒhƒ‰ƒCƒu *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "ƒhƒ‰ƒCƒu %1: \t%2" - IDS_ERROR_MAP "ƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̃}ƒbƒsƒ“ƒOEƒGƒ‰[" - IDS_ERROR_MAP_DESC "AFS ‚Í AFS “à‚ÌŽw’肳‚ꂽƒpƒX‚Ƀlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚ðƒ}ƒbƒsƒ“ƒO‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½Bƒhƒ‰ƒCƒu–¼‚ªŒ»ÝŽg—p’†‚łȂ¢‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B\n\nƒGƒ‰[: 0x%1 " - IDS_ERROR_UNMAP "ƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̃}ƒbƒsƒ“ƒOEƒGƒ‰[" - IDS_ERROR_UNMAP_DESC "AFS ‚ÍŽw’肳‚ꂽƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚ðƒ}ƒbƒsƒ“ƒO‰ðœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½Bƒhƒ‰ƒCƒu–¼‚ªŒ»ÝŽg—p’†‚łȂ¢‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B\n\nƒGƒ‰[: 0x%1" - IDS_ADDSERVER_TITLE "ƒT[ƒo[‚̒ljÁ" - IDS_EDITSERVER_TITLE "ƒT[ƒo[‚̕ҏW" - IDS_SUBCOL_SHARE "ƒTƒuƒ}ƒEƒ“ƒg" - IDS_SUBCOL_PATH "AFS ƒpƒX" - IDS_SUBMOUNTS_TITLE "ƒTƒuƒ}ƒEƒ“ƒg" - IDS_BADCELL_DESC "“ü—Í‚µ‚½ AFS ƒZƒ‹‚̍\¬î•ñ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB\n\n+" - IDS_BADCELL_DESC2 "ƒZƒ‹‚Ì–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ðV‹KƒZƒ‹‚֍\¬‚µ‚½‚¢ê‡‚́AuAFS ƒNƒ‰ƒCƒAƒ“ƒgvƒ^ƒu‚ðŽg—p‚µ‚āA‚»‚̃Zƒ‹‚̍\¬î•ñ‚ð’ljÁ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B" - IDS_KB_IN_USE "kb (%1 kb Žg—p’†)" - IDS_NOGATEWAY_TITLE "–³Œø‚È AFS ƒQ[ƒgƒEƒFƒC" - IDS_NOGATEWAY_DESC "AFS ƒQ[ƒgƒEƒFƒC‚ªŽw’肳‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS Light ‚ð\¬‚Å‚«‚Ü‚¹‚ñB\n\n’ñ‹Ÿ‚³‚ꂽƒGƒŠƒA‚É AFS ƒQ[ƒgƒEƒFƒC‚Ì–¼‘O‚Ü‚½‚Í IP ƒAƒhƒŒƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "AFS ƒZƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ð\¬‚Å‚«‚Ü‚¹‚ñB\n\n’ñ‹Ÿ‚³‚ꂽƒGƒŠƒA‚É AFS ƒZƒ‹‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_STOPPED_NOCELL "AFS ƒZƒ‹‚ðŽw’肵‚Ä‚©‚炳Ȃ¯‚ê‚΁AAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn‚·‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB" - IDS_OKSTOP_DESC "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBAFS ‚ɕۊǂ³‚ꂽƒtƒ@ƒCƒ‹‚Í AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn‚·‚é‚܂ł±‚̃Rƒ“ƒsƒ…[ƒ^[‚©‚çƒAƒNƒZƒX‚Å‚«‚È‚­‚È‚è‚Ü‚·B\n\nƒT[ƒrƒX‚ð‚¢‚Ü‚·‚®ŠJŽn‚µ‚Ü‚·‚©?" - IDS_BADMAP_DESC "ƒpƒX‚ª ""\\afs"" ‚ÅŽn‚Ü‚Á‚Ä‚¢‚È‚¢‚½‚߁AAFS ‚̓hƒ‰ƒCƒu–¼‚ðŽw’肳‚ꂽƒpƒX‚Ƀ}ƒbƒsƒ“ƒO‚Å‚«‚Ü‚¹‚ñB\n\n“ü—Í‚µ‚½ƒpƒX‚ª ""\\afs"" ‚ÅŽn‚Ü‚Á‚Ä‚¢‚é‚©‚ðŠm‚©‚߂Ă©‚çA‚â‚è’¼‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_RESTART_TITLE "AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" - IDS_RESTART_DESC "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~‚µ‚čĎn“®‚·‚é‚܂ŁA•ύX‚Ì‚¢‚­‚‚©‚Í—LŒø‚ɂȂè‚Ü‚¹‚ñB\n\nƒT[ƒrƒX‚ð‚¢‚Ü‚·‚®’âŽ~‚µ‚āAÄŽn“®‚µ‚Ü‚·‚©?" - IDS_KB_ONLY "kb" - IDS_FAILCONFIG_AUTHENT "ƒƒOƒIƒ“Žž‚É”FØ‚ðŽg—p‰Â”\‚Ü‚½‚ÍŽg—p•s‰Â‚É‚µ‚悤‚Æ‚µ‚½‚Æ‚«‚ɃGƒ‰[‚ª‹N‚«‚Ü‚µ‚½B\n\nƒGƒ‰[ %1" - IDS_FAILCONFIG_PREFS "Š„‚è“–‚Ä‚½ƒT[ƒo[Eƒ‰ƒ“ƒLƒ“ƒO—Dæ‡ˆÊ‚Ì‚¢‚­‚‚©‚ªŽg—p‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[ %1" - IDS_FAILCONFIG_CACHE "“ü—Í‚µ‚½ AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒLƒƒƒbƒVƒ…EƒTƒCƒY‚ªŽg—p‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[ %1" - IDS_FAILCONFIG_PROBE "“ü—Í‚µ‚½ AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒvƒ[ƒuŠÔŠu‚ªŽg—p‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[ %1" - IDS_FAILCONFIG_SYSNAME "“ü—Í‚µ‚½ AFS ƒNƒ‰ƒCƒAƒ“ƒg sysname ‚ªŽg—p‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[ %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "ƒZƒ‹‚Ì–¼‘O‚𐳂µ‚­“ü—Í‚µ‚½‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B³‚µ‚¢ƒZƒ‹–¼‚ªuAFS ƒZƒ‹vƒŠƒXƒg‚ÉŽ¦‚³‚ê‚Ä‚¢‚È‚¢ê‡‚́Au’ljÁvƒ{ƒ^ƒ“‚ðŽg—p‚µ‚ăZƒ‹‚̍€–Ú‚ðì¬‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_NOCELL_DESC_CC "ƒfƒtƒHƒ‹ƒg AFS ƒZƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚È‚¢‚½‚߁AAFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚ð\¬‚Å‚«‚Ü‚¹‚ñB\n\n’ñ‹Ÿ‚³‚ꂽƒGƒŠƒA‚É AFS ƒZƒ‹‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_TITLE_CAUTION_CCENTER - "’ˆÓ - AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[EƒvƒƒpƒeƒB[" - IDS_TITLE_ERROR_CCENTER "ƒGƒ‰[ - AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[EƒvƒƒpƒeƒB[" - IDS_TITLE_CCENTER "AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[EƒvƒƒpƒeƒB[" - IDS_YES "‚Í‚¢" - IDS_NO "‚¢‚¢‚¦" - IDS_DRIVE "ƒhƒ‰ƒCƒu" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/ko_KR/afs_config.rc b/src/WINNT/client_config/lang/ko_KR/afs_config.rc deleted file mode 100644 index 0c6aceb2f..000000000 --- a/src/WINNT/client_config/lang/ko_KR/afs_config.rc +++ /dev/null @@ -1,775 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "Ŭ¶óÀÌ¾ðÆ® ±¸¼º",IDC_STATIC,7,7,206,142 - LTEXT "¼¿ À̸§(&C):",IDC_STATIC,13,23,35,8 - EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "Windows·Î ·Î±×ÀÎÇÒ ¶§ AFS ÅäÅ« È®º¸(&O)",IDC_LOGON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 - CONTROL "AFS ¶óÀÌÆ® °ÔÀÌÆ®¿þÀÌ Á¦°ø(&P)",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "ÀÛ¾÷ Ç¥½ÃÁÙ¿¡ AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜ Ç¥½Ã(&H)", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, - 193,10 - LTEXT "ÁÖ: ÀÌ Á¦¾î´Â AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇà ÁßÀÌÁö ¾ÊÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_WARN,13,124,193,17 - GROUPBOX "Ŭ¶óÀÌ¾ðÆ® »óÅÂ",IDC_STATIC,7,157,206,61 - LTEXT "(ÇöÀç »óÅ Á¶È¸ Áß)",IDC_STATUS,13,172,193,17 - PUSHBUTTON "¼­ºñ½º ½ÃÀÛ(&S)",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "¼­ºñ½º Á¤Áö(&T)",IDC_SERVICE_STOP,149,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "Ŭ¶óÀÌ¾ðÆ® ±¸¼º",IDC_STATIC,7,7,231,131 - LTEXT "°ÔÀÌÆ®¿þÀÌ(&G):",IDC_STATIC,13,28,37,8 - EDITTEXT IDC_GATEWAY,57,27,110,13,ES_AUTOHSCROLL - PUSHBUTTON "Áö±Ý ¿¬°á(&N)",IDC_GATEWAY_CONN,172,27,57,14 - LTEXT "¼¿ À̸§(&C):",IDC_STATIC,13,51,35,8 - EDITTEXT IDC_CELL,57,49,110,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "Windows·Î ·Î±×ÀÎÇÒ ¶§ AFS ÅäÅ« È®º¸(&O)",IDC_LOGON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,193,10 - CONTROL "ÀÛ¾÷ Ç¥½ÃÁÙ¿¡ AFS ¶óÀÌÆ® ¾ÆÀÌÄÜ Ç¥½Ã(&H)",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,93,193,10 - LTEXT "ÁÖ: ÀÌ Á¦¾î´Â AFS ¶óÀÌÆ®°¡ AFS °ÔÀÌÆ®¿þÀÌ¿¡ Á¢¼ÓµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ȯ°æ ¼³Á¤" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "¼­¹ö ȯ°æ ¼³Á¤",-1,7,7,206,211 - CONTROL "ÆÄÀÏ ¼­¹ö ȯ°æ ¼³Á¤ Ç¥½Ã(&F)",IDC_SHOW_FS,"Button", - BS_AUTORADIOBUTTON,13,21,193,10 - CONTROL "º¼·ý À§Ä¡ ¼­¹ö ȯ°æ ¼³Á¤ Ç¥½Ã(&V)",IDC_SHOW_VLS,"Button", - BS_AUTORADIOBUTTON,13,34,193,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 49,173,120 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,84,172,50,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,137,172,50,14 - PUSHBUTTON "^",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "¹ÝÀÔ(&I)...",IDC_IMPORT,13,172,50,14 - LTEXT "ÁÖ: ÀÌ Á¦¾î´Â AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇà ÁßÀÌÁö ¾ÊÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¼¿" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "AFS ¼¿",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,51,195,50,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µå¶óÀ̺ê À̸§" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "µå¶óÀ̺ê À̸§",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,193,135 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,75,171,42,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,120,171,42,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,165,171,42,14 - LTEXT "AFS °æ·Î¿¡ ¸ÊÇÎµÈ µå¶óÀ̺ê À̸§:",IDC_STATIC,13,21,193, - 8 - PUSHBUTTON "°í±Þ(&V)...",IDC_ADVANCED,13,171,53,14 - LTEXT "ÁÖ: ÀÌ Á¦¾î´Â AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇà ÁßÀÌÁö ¾ÊÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_WARN,13,193,193,17 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "°í±Þ" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_CACHE_SIZE,88,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,88,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,88,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,88,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "·Î±×¿Â(&L)...",IDC_LOGON_PARMS,13,129,59,14 - PUSHBUTTON "Àü¿ª µå¶óÀ̺ê(&G)",IDC_AUTOMAP_PARMS,13,175,58,14 - PUSHBUTTON "±âŸ(&M)...",IDC_MISC_PARMS,13,197,58,14 - GROUPBOX "ij½¬ ±¸¼º",IDC_STATIC,7,7,206,100 - LTEXT "ij½¬ Å©±â(&C):",IDC_STATIC,13,23,71,8 - LTEXT "KB",IDC_INUSE,135,23,35,8 - LTEXT "ûũ Å©±â(&H):",IDC_STATIC,13,64,71,8 - LTEXT "KB",IDC_STATIC,134,64,33,8 - LTEXT "ij½¬ »óÅÂ(&S):",IDC_STATIC,13,85,71,8 - LTEXT "ÀÔ·Â Ç׸ñ",IDC_STATIC,136,85,68,8 - LTEXT "ij½¬ °æ·Î(&P):",IDC_STATIC,13,44,71,8 - GROUPBOX "Ãß°¡ °í±Þ ¸Å°³º¯¼ö",IDC_STATIC,7,114,206,104 - LTEXT "Àü¿ª AFS µå¶óÀÌºê ¸ÊÇÎ ÀÛ¼º",IDC_STATIC,80,175,132,10 - LTEXT "ÅëÇÕ ·Î±×¿Â ¼³Á¤°ª Á¶Á¤",IDC_STATIC,80,131,133,10 - LTEXT "±âŸ ¿©·¯ °¡Áö °í±Þ ¸Å°³º¯¼ö ¼³Á¤",IDC_STATIC,80,199, - 132,10 - PUSHBUTTON "Áø´Ü(&D)...",IDC_DIAG_PARMS,13,151,58,14 - LTEXT "µð¹ö±ëÀ» À§ÇÑ ¼³Á¤°ª »ç¿ë °¡´É",IDC_STATIC,80,153,132, - 10 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 259, 135 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­¹ö ¿ì¼± ¼øÀ§ ÁöÁ¤" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÀÌ AFS ¼¿¿¡ ÀÖ´Â ¼­¹ö¿¡ ´ëÇØ ¿ì¼± ¼øÀ§¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. AFS¿¡¼­ µ¥ÀÌÅ͸¦ ãÀ» ¶§ ¼øÀ§°¡ ³·Àº ¼­¹ö¸¦ ¸ÕÀú Á¶È¸ÇÕ´Ï´Ù.", - IDC_STATIC,7,7,245,17 - LTEXT "¼­¹ö(&S):",IDC_STATIC,34,38,24,8 - LTEXT "¼øÀ§(&R):",IDC_STATIC,34,54,20,8 - EDITTEXT IDC_SERVER,67,35,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,67,51,36,13,ES_AUTOHSCROLL - LTEXT "ÆÁ: ¹ÝÀÔ ´ÜÃ߸¦ »ç¿ëÇÏ¿© ¼­¹ö ¹× ±× ¼øÀ§¸¦ ÁöÁ¤ÇÏ´Â ÅØ½ºÆ® ÆÄÀÏÀ» ÀÐ¾î ¿©·¯ ¼­¹öÀÇ ¼øÀ§¸¦ ÇÑ ¹ø¿¡ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,15,76,230,18 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,140,114,50,14 - PUSHBUTTON "È®ÀÎ",IDOK,86,114,50,14 - PUSHBUTTON "µµ¿ò¸»",9,202,114,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼¿ Ư¼º" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÀÌ ÆäÀÌÁöÀÇ Á¤º¸´Â AFS¿¡ ÁöÁ¤µÈ ¼¿¿¡ Á¢¼ÓÇÏ´Â ¹æ¹ýÀ» ¾Ë·ÁÁÝ´Ï´Ù.", - IDC_STATIC,4,4,226,8 - LTEXT "AFS ¼¿(&A):",IDC_STATIC,4,24,30,8 - EDITTEXT IDC_CELL,50,22,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "¼³¸í(&D):",IDC_STATIC,4,41,38,8 - EDITTEXT IDC_COMMENT,50,39,181,13,ES_AUTOHSCROLL - GROUPBOX "¼­¹ö",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,75,198,50,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 251, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­¹ö Ãß°¡/ÆíÁý" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÁöÁ¤µÈ ¼¿¿¡ º¼·ý À§Ä¡ ¼­¹öÀÇ À̸§À» ÀÔ·ÂÇϽʽÿÀ.", - IDC_STATIC,7,7,237,8 - LTEXT "¼­¹ö À̸§(&N):",IDC_STATIC,7,31,44,8 - EDITTEXT IDC_COMMENT,63,29,170,13,ES_AUTOHSCROLL - LTEXT "¼­¹ö ÁÖ¼Ò(&A):",IDC_STATIC,7,52,51,8 - CONTROL "ƯÁ¤ ÁÖ¼Ò »ç¿ë(&U):",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,63,52,83,10 - CONTROL "ÀÚµ¿À¸·Î ÁÖ¼Ò Á¶È¸(&L)",IDC_ADDR_LOOKUP,"Button", - BS_AUTORADIOBUTTON,63,66,111,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,151,51, - 65,13 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,140,91,50,14 - PUSHBUTTON "È®ÀÎ",IDOK,86,91,50,14 - PUSHBUTTON "µµ¿ò¸»",9,194,91,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 323, 185 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µå¶óÀ̺ê À̸§ ¸ÊÇÎ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÄÄÇ»ÅÍÀÇ µå¶óÀ̺ê À̸§À» AFS¿¡ ÀÖ´Â °æ·Î·Î ¸ÊÇÎÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,7,309,8 - LTEXT "¿¹¸¦ µé¾î, µå¶óÀ̺ê Q¸¦ /afs/acme.com/usr/bobÀ¸·Î ¸ÊÇÎÇϸé, AFS¿¡¼­ /afs/acme.com/usr/bob/*À¸·Î »ç¿ë°¡´ÉÇÑ ÆÄÀÏÀ» ÄÄÇ»ÅÍÀÇ Q:\\ µð·ºÅ丮¿¡¼­ º¼ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,26,309,16 - LTEXT "µå¶óÀ̺ê À̸§(&D):",IDC_STATIC,30,59,53,8 - COMBOBOX IDC_DRIVE,87,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS °æ·Î(&P):",IDC_STATIC,30,77,33,8 - EDITTEXT IDC_PATH,87,75,168,13,ES_AUTOHSCROLL - LTEXT "¼³¸í(&E):",IDC_STATIC,29,96,38,8 - EDITTEXT IDC_DESC,87,94,72,13,ES_AUTOHSCROLL - CONTROL "·Î±×¿ÂÇÒ ¶§¸¶´Ù ÀÌ ¸ÊÇÎ º¹¿ø(&R)",IDC_PERSISTENT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,77,112,188,10 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,186,164,50,14 - PUSHBUTTON "È®ÀÎ",IDOK,132,164,50,14 - PUSHBUTTON "µµ¿ò¸»",9,266,164,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­ºê¸¶¿îÆ®" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÄÄÇ»ÅÍ´Â AFS¿¡¼­ ¼­ºê¸¶¿îÆ®-³×Æ®¿öÅ© °øÀ¯¸¦ Á¦°øÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,4,4,215,8 - GROUPBOX "¼­ºê¸¶¿îÆ®",IDC_STATIC,4,26,236,168 - LTEXT "ÀÌ ÄÄÇ»ÅÍ¿¡¼­´Â ´ÙÀ½°ú °°Àº ¼­ºê¸¶¿îÆ®°¡ °øÀ¯µË´Ï´Ù.", - IDC_STATIC,10,42,176,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 54,223,115 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,78,173,50,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,131,173,50,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,184,173,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 302, 113 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­ºê¸¶¿îÆ® ÁöÁ¤" -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼­ºê¸¶¿îÆ®¸¦ ÅëÇØ Windows ³×Æ®¿öÅ©À» »ç¿ëÇÏ¿© AFS ÇÏÀ§ µð·ºÅ丮¸¦ °øÀ¯ÇÒ ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,7,288,8 - LTEXT "¼­ºê¸¶¿îÆ®(&S):",IDC_STATIC,22,27,37,8 - LTEXT "AFS °æ·Î(&P):",IDC_STATIC,22,43,33,8 - EDITTEXT IDC_SUBMOUNT,66,25,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,66,41,181,13,ES_AUTOHSCROLL - LTEXT "ÇÁ·ÒÇÁÆ®°¡ Ç¥½ÃµÇ´Â À§Ä¡¿¡ ¼­ºê¸¶¿îÆ®ÀÇ Ãà¾àÇü À̸§°ú Àüü AFS °æ·Î¸¦ ÀÔ·ÂÇϽʽÿÀ. AFS °æ·Î´Â \\afs""·Î ½ÃÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù(±×·¸Áö ¾ÊÀ¸¸é, \\afs""´Â ÀÚµ¿À¸·Î Ãß°¡µË´Ï´Ù).", - IDC_STATIC,13,59,275,27 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,159,92,50,14 - PUSHBUTTON "È®ÀÎ",IDOK,105,92,50,14 - PUSHBUTTON "µµ¿ò¸»",9,245,92,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µå¶óÀ̺ê À̸§" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "µå¶óÀ̺ê À̸§",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,219,60 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,100,95,42,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,145,95,42,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,190,95,42,14 - LTEXT "AFS °æ·Î¿¡ ¸ÊÇÎµÈ µå¶óÀ̺ê À̸§:",IDC_STATIC,13,21,193, - 8 - LTEXT "ÁÖ: ÀÌ Á¦¾î´Â AFS ¶óÀÌÆ®°¡ AFS °ÔÀÌÆ®¿þÀÌ¿¡ Á¢¼ÓµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_WARN,13,116,219,17 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¼¿" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "AFS ¼¿",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,75,116,50,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 219, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - GROUPBOX "",IDC_STATIC,4,0,211,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º ½ÃÀÛ Áß...",IDC_STARTING,46,20, - 157,8 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º Á¤Áö Áß...",IDC_STOPPING,46,20, - 157,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÀϹÝ" -FONT 9, "±¼¸²" -BEGIN - GROUPBOX "±âº» ¼¿",IDC_STATIC,7,7,206,54 - LTEXT "°ü¸®ÇÒ ±âº» AFS ¼¿ÀÇ À̸§À» ÀÔ·ÂÇϽʽÿÀ.",IDC_STATIC, - 14,19,164,8 - LTEXT "±âº» ¼¿:",IDC_STATIC,14,37,39,8 - EDITTEXT IDC_CELL,59,35,147,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "AFS ¼¿",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,51,227,50,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "±âŸ ±¸¼º" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,90,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,90,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,55,172,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,109,172,50,14 - PUSHBUTTON "µµ¿ò¸»",9,163,172,50,14 - GROUPBOX "¸Å°³º¯¼ö",IDC_STATIC,7,7,206,156 - LTEXT "Žħ °£°Ý(&P):",IDC_STATIC,15,42,65,8 - LTEXT "ÃÊ",IDC_STATIC,136,42,50,8 - LTEXT "¹é±×¶ó¿îµå ½º·¹µå(&B):",IDC_STATIC,15,62,71,8 - LTEXT "½º·¹µå",IDC_STATIC,136,62,49,8 - LTEXT "¼­ºñ½º ½º·¹µå(&E):",IDC_STATIC,15,82,65,8 - LTEXT "½º·¹µå",IDC_STATIC,136,82,41,8 - LTEXT "½Ã½ºÅÛ À̸§(&Y):",IDC_STATIC,15,102,61,8 - LTEXT "µð·ºÅ丮 ¸¶¿îÆ®(&M):",IDC_STATIC,15,122,69,8 - LTEXT "LAN ¾î´ðÅÍ ¹øÈ£(&L):",IDC_STATIC,15,22,70,8 - LTEXT "·çÆ® º¼·ý(&R):",IDC_STATIC,15,141,52,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Áø´Ü ±¸¼º" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,99,20,34,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,52,114,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,106,114,50,14 - PUSHBUTTON "µµ¿ò¸»",9,160,114,50,14 - GROUPBOX "ÃßÀû ·Î±× ¸Å°³º¯¼ö",IDC_STATIC,7,7,203,54 - LTEXT "¹öÆÛ Å©±â(&B):",IDC_STATIC,13,22,73,8 - LTEXT "KB",IDC_STATIC,145,22,9,8 - GROUPBOX "À̺¥Æ® ·Î±× ¸Å°³º¯¼ö",IDC_STATIC,7,69,203,35 - COMBOBOX IDC_TRAP_ON_PANIC,99,39,41,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Àå¾Ö½Ã Æ®·¦(&T):",IDC_STATIC,13,42,50,8 - LTEXT "º¸°í¼­ ¼¼¼Ç ½Ãµ¿:",IDC_STATIC,13,86,73,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,99,84,42,64,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "·Î±×ÀÎ ±¸¼º" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,89,18,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,89,39,39,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "È®ÀÎ",IDOK,21,71,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,75,71,50,14 - PUSHBUTTON "µµ¿ò¸»",9,129,71,50,14 - LTEXT "·Î±×ÀÎ Àç½Ãµµ °£°Ý(&L):",IDC_STATIC,13,20,66,8 - GROUPBOX "¸Å°³º¯¼ö",IDC_STATIC,7,7,172,54 - LTEXT "ÀÚµ¿ ·Î±×ÀÎ ½ÇÆÐ(&F):",IDC_STATIC,13,41,61,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Àü¿ª µå¶óÀ̺ê" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "´Ý±â",IDOK,141,148,50,14 - PUSHBUTTON "µµ¿ò¸»",9,196,148,50,14 - PUSHBUTTON "Ãß°¡(&A)",IDC_ADD,108,117,42,14 - GROUPBOX "Àü¿ªÀ¸·Î ´ëÀÀµÇ´Â AFS µå¶óÀ̺ê",IDC_STATIC,7,7,239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "º¯°æ(&C)",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Àü¿ª µå¶óÀÌºê ¸Ê" -FONT 9, "±¼¸²" -BEGIN - COMBOBOX IDC_DRIVE,78,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,78,41,156,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,78,61,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,82,96,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,136,96,50,14 - PUSHBUTTON "µµ¿ò¸»",9,190,96,50,14 - LTEXT "µå¶óÀ̺ê À̸§(&D):",IDC_STATIC,16,25,49,8 - LTEXT "AFS °æ·Î(&P):",IDC_STATIC,16,44,33,8 - LTEXT "¼³¸í(&E):",IDC_STATIC,17,64,38,8 - GROUPBOX "Àü¿ª AFS µå¶óÀ̺ê",IDC_STATIC,7,7,232,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 252 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 316 - TOPMARGIN, 7 - BOTTOMMARGIN, 178 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 295 - TOPMARGIN, 7 - BOTTOMMARGIN, 106 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" - IDS_TITLE_95 "AFS ¶óÀÌÆ® ±¸¼º" - IDS_STATE_STOPPED "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º´Â ÇöÀç Á¤ÁöµÇ¾ú½À´Ï´Ù." - IDS_STATE_RUNNING "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º´Â Á¤»óÀûÀ¸·Î ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_STATE_STARTING "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º ½ÃÀÛ Áß..." - IDS_STATE_STOPPING "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º Á¤Áö Áß..." - IDS_STATE_UNKNOWN "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ Á¦´ë·Î ±¸¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù." - IDS_SERVICE_FAIL_START "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù.\n\n¿À·ù 0x%1." - IDS_SERVICE_FAIL_STOP "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º´Â Á¤ÁöÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù.\n\n¿À·ù 0x%1." - IDS_WARN_STOPPED "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇà ÁßÀÌÁö ¾ÊÀ¸¹Ç·Î »ç¿ë ºÒ°¡´ÉÇÑ Á¦¾î´Â º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_WARN_ADMIN "»ç¿ëÀÚ°¡ Windows¿¡ °ü¸®ÀÚ·Î ·Î±×ÀÎÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î »ç¿ë ºÒ°¡´ÉÇÑ Á¦¾î´Â º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_CELL_UNKNOWN "(¾Ë ¼ö ¾øÀ½)" - IDS_GATEWAY_UNKNOWN "(¾Ë ¼ö ¾øÀ½)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows°¡ %1¿¡ ´ëÇÑ ³×Æ®¿öÅ© ÁÖ¼Ò¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù. È£½ºÆ® À̸§À»Á¦´ë·Î ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ." - IDS_NEWSUB_DESC "AFS´Â ³×Æ®¿öÅ© µå¶óÀ̺꿡 Á¢¼ÓÇÒ ¶§ ÁöÁ¤µÈ ¼³¸íÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nÁöÁ¤µÈ ¼³¸íÀº ÀÌ¹Ì ´Ù¸¥ AFS °æ·Î¿¡¼­ »ç¿ëµÇ¾ú½À´Ï´Ù." - IDS_BADSUB_DESC "ÀÔ·ÂÇÑ µå¶óÀ̺ê À̸§ ¼³¸íÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nµå¶óÀ̺ê À̸§ ¼³¸í¿¡´Â 12 ¹®ÀÚ ÀÌ»óÀ» »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç °ø¹é ¶Ç´Â ÅÇÀ» Æ÷ÇÔÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_BADGATEWAY_DESC "AFS´Â ÁöÁ¤µÈ °ÔÀÌÆ®¿þÀÌ¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n°ÔÀÌÆ®¿þÀÌÀÇ À̸§À» Á¦´ë·Î ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ." - IDS_BADGWCELL_DESC "ÁöÁ¤µÈ °ÔÀÌÆ®¿þÀÌ¿¡¼­ »ç¿ëµÈ AFS ¼¿¿¡ ´ëÇÑ ±¸¼º Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\n»õ ¼¿¿¡ AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸¼ºÇÏ·Á¸é, AFS ¼¿ ÅÇÀ» »ç¿ëÇÏ¿© ±× ¼¿¿¡ ´ëÇÑ ±¸¼º Á¤º¸¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.\n\n¼¿: %1" - IDS_TITLE_CAUTION_NT "ÁÖÀÇ - AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" - IDS_TITLE_CAUTION_95 "ÁÖÀÇ - AFS ¶óÀÌÆ® ±¸¼º" - IDS_TITLE_ERROR_NT "¿À·ù - AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" - IDS_TITLE_ERROR_95 "¿À·ù - AFS ¶óÀÌÆ® ±¸¼º" - IDS_SHRINKCACHE "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇàµÇ´Â µ¿¾È¿¡´Â AFS Ŭ¶óÀÌ¾ðÆ® Ä³½¬ Å©±â¸¦ ÁÙÀϼö ¾ø½À´Ï´Ù.\n\nij½¬ Å©±â¸¦ ÁÙÀÌ·Á¸é ¿ì¼± ÀÏ¹Ý ÅÇÀÇ Á¤Áö ¼­ºñ½º¸¦ »ç¿ëÇÏ¿© AFS Ŭ¶óÀÌ¾ðÆ®¼­ºñ½º¸¦ Á¤Áö½ÃŰ½Ê½Ã¿À." - IDS_BADCELL_DESC_CC "ÀÔ·ÂÇÑ AFS ¼¿¿¡ ´ëÇÑ ±¸¼º Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ Á¤Áö½Ã۸é ÀÌ ÄÄÇ»ÅÍ¿¡¼­ AFS¿¡ ÀúÀåµÈ ÆÄÀÏ¿¡ ¾×¼¼½ºÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¼­ºñ½º¸¦ Á¤Áö½ÃŰ½Ã°Ú½À´Ï±î?" - IDS_PREFCOL_SERVER "¼­¹ö" - IDS_PREFCOL_RANK "¼øÀ§" - IDS_TIP_PREFS "ÆÁ: AFS¸¦ ÅëÇØ ÆÄÀÏÀ» ÀÐÀ» °æ¿ì, ¼øÀ§°¡ ³·Àº ¼­¹ö¿¡ ¿ì¼±¼øÀ§°¡ ÁÖ¾îÁý´Ï´Ù." - IDS_PREFERROR_RESOLVE "AFS´Â %1(ÀÌ)¶ó°í ÇÏ´Â ¼­¹ö¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù. ¼­¹ö¸¦ Á¦´ë·Î ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ." - IDS_FILTER_TXT "ÅØ½ºÆ® ÆÄÀÏ(*.TXT);*.TXT;" - IDS_HOSTREM_MANY "¼±ÅÃµÈ AFS ¼¿¿¡¼­ ¸ðµç Á¢¼Ó Á¤º¸¸¦ Á¦°ÅÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù.\n\nÀÌ ÀÔ·Â Ç׸ñÀ» Á¦°ÅÇϽðڽÀ´Ï±î?" - IDS_HOSTREM_ONE "%1 AFS ¼¿¿¡ ´ëÇÑ ¸ðµç Á¢¼Ó Á¤º¸¸¦ Á¦°ÅÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù.\n\nÀÌ ÀÔ·Â Ç׸ñÀ» Á¦°ÅÇϽðڽÀ´Ï±î?" - IDS_CELLEDIT_TITLE "%1 - Ư¼º" - IDS_CELLADD_TITLE "»õ·Î¿î ¼¿" - IDS_SVRCOL_SERVER "ÁÖ¼Ò" - IDS_SVRCOL_COMMENT "¼­¹ö À̸§" - IDS_TIP_DRIVES "ÆÁ: ¸ÊÇÎ µå¶óÀ̺ê À̸§ ¿·ÀÇ »óÀÚ¸¦ üũÇÏ¿© ³×Æ®¿öÅ© µå¶óÀÌºê ¸ÊÇÎÀ» ¿¬°áÇÒ ¼ö ÀÖ½À´Ï´Ù." - IDS_MAP_LETTER "µå¶óÀ̺ê *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "%1: µå¶óÀ̺ê \t%2" - IDS_ERROR_MAP "³×Æ®¿öÅ© µå¶óÀÌºê ¸ÊÇÎ ¿À·ù" - IDS_ERROR_MAP_DESC "AFS´Â ³×Æ®¿öÅ© µå¶óÀ̺긦 AFS¿¡ ÁöÁ¤µÈ °æ·Î·Î ¸ÊÇÎÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç µå¶óÀ̺ê À̸§ÀÌ »ç¿ë ÁßÀÌ ¾Æ´ÑÁö È®ÀÎÇϽʽÿÀ.\n\n¿À·ù: 0x%1." - IDS_ERROR_UNMAP "³×Æ®¿öÅ© µå¶óÀÌºê ¸ÊÇÎ ¿À·ù" - IDS_ERROR_UNMAP_DESC "AFS´Â ÁöÁ¤µÈ ³×Æ®¿öÅ© µå¶óÀ̺긦 ¾ð¸ÊÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç µå¶óÀ̺êÀ̸§ÀÌ »ç¿ë ÁßÀ̾´Â ¾ÈµË´Ï´Ù.\n\n¿À·ù: 0x%1." - IDS_ADDSERVER_TITLE "¼­¹ö Ãß°¡" - IDS_EDITSERVER_TITLE "¼­¹ö ÆíÁý" - IDS_SUBCOL_SHARE "¼­ºê¸¶¿îÆ®" - IDS_SUBCOL_PATH "AFS °æ·Î" - IDS_SUBMOUNTS_TITLE "¼­ºê¸¶¿îÆ®" - IDS_BADCELL_DESC "ÀÔ·ÂÇÑ AFS ¼¿¿¡ ´ëÇÑ ±¸¼º Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.\n\n+" - IDS_BADCELL_DESC2 "¼¿ À̸§À» ¿Ã¹Ù¸£°Ô ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ. »õ ¼¿¿¡¼­ AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸¼ºÇÏ·Á¸é, AFS ¼¿ ÅÇÀ» »ç¿ëÇÏ¿© ±× ¼¿¿¡ ´ëÇÑ ±¸¼º Á¤º¸¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù." - IDS_KB_IN_USE "KB(%1 KB »ç¿ëÁß)" - IDS_NOGATEWAY_TITLE "À¯È¿ÇÏÁö ¾ÊÀº AFS °ÔÀÌÆ®¿þÀÌ" - IDS_NOGATEWAY_DESC "AFS ¶óÀÌÆ®´Â AFS °ÔÀÌÆ®¿þÀ̰¡ ÁöÁ¤µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ±¸¼ºµÉ ¼ö ¾ø½À´Ï´Ù.\n\nÁ¦°øµÈ ¿µ¿ª¿¡ AFS °ÔÀÌÆ®¿þÀÌÀÇ À̸§ ¶Ç´Â IP ÁÖ¼Ò¸¦ ÀÔ·ÂÇϽʽÿÀ." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "AFS Ŭ¶óÀÌ¾ðÆ®´Â AFS ¼¿ÀÌ ÁöÁ¤µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ±¸¼ºµÉ ¼ö ¾ø½À´Ï´Ù.\n\nÁ¦°øµÈ ¿µ¿ª¿¡ AFS ¼¿ÀÇ À̸§À» ÀÔ·ÂÇϽʽÿÀ." - IDS_STOPPED_NOCELL "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÃÀÛµÇÁö Àü¿¡ AFS ¼¿À» ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù." - IDS_OKSTOP_DESC "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇà ÁßÀÌÁö ¾Ê½À´Ï´Ù. AFS¿¡ ÀúÀåµÈ ÆÄÀÏÀº AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÃÀÛÇϱâ Àü¿¡´Â ÀÌ ÄÄÇ»ÅÍ¿¡¼­ ¾×¼¼½ºµÉ ¼ö ¾ø½À´Ï´Ù.\n\nÁö±Ý ¼­ºñ½º¸¦ ½ÃÀÛÇϽðڽÀ´Ï±î?" - IDS_BADMAP_DESC "AFS´Â °æ·Î°¡ \\afs""·Î ½ÃÀÛÇÏÁö ¾ÊÀ¸¹Ç·Î µå¶óÀ̺ê À̸§À» ÁöÁ¤µÈ °æ·Î¿¡ ¸ÊÇÎÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nÀÔ·ÂÇÑ °æ·Î°¡ \\afs""·Î ½ÃÀÛÇÏ´ÂÁö È®ÀÎÇÏ°í ´Ù½Ã ½ÃµµÇϽʽÿÀ." - IDS_RESTART_TITLE "AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" - IDS_RESTART_DESC "ÀϺΠº¯°æ »çÇ×Àº AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ Á¤ÁöµÈ ÈÄ ´Ù½Ã ½ÃÀÛµÉ ¶§±îÁö´Â Àû¿ëµÇÁö ¾Ê½À´Ï´Ù.\n\nÁö±Ý ¼­ºñ½º¸¦ Á¤Áö½ÃŲ ÈÄ ´Ù½Ã ½ÃÀÛÇϽðڽÀ´Ï±î?" - IDS_KB_ONLY "KB" - IDS_FAILCONFIG_AUTHENT "·Î±×¿ÂÇÒ ¶§ ÀÎÁõ »ç¿ë ¿©ºÎ¸¦ °áÁ¤ÇÏ´Â Áß¿¡ ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù.\n\n¿À·ù %1" - IDS_FAILCONFIG_PREFS "»ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ÀϺΠ¼­¹ö ¿ì¼±¼øÀ§¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù %1" - IDS_FAILCONFIG_CACHE "ÀÔ·ÂÇÑ AFS Ŭ¶óÀÌ¾ðÆ® Ä³½¬ Å©±â¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù %1" - IDS_FAILCONFIG_PROBE "ÀÔ·ÂÇÑ AFS Ŭ¶óÀÌ¾ðÆ® Å½½É °£°ÝÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù %1" - IDS_FAILCONFIG_SYSNAME "ÀÔ·ÂÇÑ AFS Ŭ¶óÀÌ¾ðÆ® ½Ã½ºÅÛ À̸§À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "¼¿ À̸§À» ¿Ã¹Ù¸£°Ô ÀÔ·ÂÇß´ÂÁö È®ÀÎÇϽʽÿÀ. AFS ¼¿ ¸ñ·Ï¿¡ ¸Â´Â ¼¿ À̸§ÀÌ ¾øÀ¸¸é Ãß°¡ ´ÜÃ߸¦ »ç¿ëÇÏ¿© ¼¿ ÀÔ·Â Ç׸ñÀ» ¸¸µå½Ê½Ã¿À." - IDS_NOCELL_DESC_CC "±âº» AFS ¼¿À» ÁöÁ¤ÇÏÁö ¾Ê¾Æ AFS Á¦¾î ¼¾Å͸¦ ±¸¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nÁ¦°øµÈ ¿µ¿ª¿¡ AFS ¼¿ À̸§À» ÀÔ·ÂÇϽʽÿÀ." - IDS_TITLE_CAUTION_CCENTER "ÁÖÀÇ - AFS Á¦¾î ¼¾ÅÍ Æ¯¼º" - IDS_TITLE_ERROR_CCENTER "¿À·ù - AFS Á¦¾î ¼¾ÅÍ Æ¯¼º" - IDS_TITLE_CCENTER "AFS Á¦¾î ¼¾ÅÍ Æ¯¼º" - IDS_YES "¿¹" - IDS_NO "¾Æ´Ï¿À" - IDS_DRIVE "µå¶óÀ̺ê" -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/pt_BR/afs_config.rc b/src/WINNT/client_config/lang/pt_BR/afs_config.rc deleted file mode 100644 index e24817f7b..000000000 --- a/src/WINNT/client_config/lang/pt_BR/afs_config.rc +++ /dev/null @@ -1,786 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "Configuração do AFS Client" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Configuração do Cliente",IDC_STATIC,7,7,206,142 - LTEXT "Nome da &Célula:",IDC_STATIC,13,23,52,8 - EDITTEXT IDC_CELL,69,21,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "&Obter tokens do AFS ao efetuar logon no Windows", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, - 193,10 - CONTROL "&Fornecer um Gateway do AFS Básico",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "&Mostrar o ícone do AFS Client na barra de tarefas", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, - 193,10 - LTEXT "Nota: estes controles estão desativados porque o serviço AFS Client não está sendo executado.", - IDC_WARN,13,124,193,17 - GROUPBOX "Status do Cliente",IDC_STATIC,7,157,206,61 - LTEXT "(consultando o status atual)",IDC_STATUS,13,172,193,17 - PUSHBUTTON "&Iniciar Serviço",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "&Parar Serviço",IDC_SERVICE_STOP,149,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Configuração do Cliente",IDC_STATIC,7,7,231,131 - LTEXT "&Gateway:",IDC_STATIC,11,28,31,8 - EDITTEXT IDC_GATEWAY,66,27,108,13,ES_AUTOHSCROLL - PUSHBUTTON "Conectar &Agora",IDC_GATEWAY_CONN,177,27,57,14 - LTEXT "Nome da &Célula:",IDC_STATIC,11,51,52,8 - EDITTEXT IDC_CELL,66,49,108,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "&Obter tokens do AFS ao efetuar logon no Windows", - IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73, - 193,10 - CONTROL "&Mostrar o ícone do AFS Básico na barra de tarefas", - IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,93, - 193,10 - LTEXT "Nota: estes controles estão desativados porque o serviço AFS Básico não está conectado a um gateway AFS.", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Preferências" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Preferências de Servidor",-1,7,7,207,211 - CONTROL "Mostrar Preferências de Servidor de &Arquivos", - IDC_SHOW_FS,"Button",BS_AUTORADIOBUTTON,9,18,193,10 - CONTROL "Mostrar Preferências de Servidor de Localização de &Volumes", - IDC_SHOW_VLS,"Button",BS_AUTORADIOBUTTON,9,31,204,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 52,173,120 - PUSHBUTTON "&Incluir...",IDC_ADD,84,175,50,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,137,175,50,14 - PUSHBUTTON "^",IDC_UP,191,100,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,120,15,14,BS_ICON - PUSHBUTTON "&Importar...",IDC_IMPORT,13,175,50,14 - LTEXT "Nota: estes controles estão desativados porque o serviço AFS Client não está sendo executado.", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Células do AFS" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Células do AFS",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "&Incluir...",IDC_ADD,51,195,50,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "&Remover",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Letras de Unidades" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Letras de Unidades",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,28,193,135 - PUSHBUTTON "&Incluir...",IDC_ADD,75,166,42,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,120,166,42,14 - PUSHBUTTON "&Remover",IDC_REMOVE,165,166,42,14 - LTEXT "Letras de unidades mapeadas para caminhos no AFS:", - IDC_STATIC,13,17,193,8 - PUSHBUTTON "A&vançado...",IDC_ADVANCED,13,166,53,14 - LTEXT "Nota: estes controles estão desativados porque o serviço AFS Client não está sendo executado.", - IDC_WARN,11,185,196,27 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Avançado" -FONT 9, "MS Shell Dlg" -BEGIN - EDITTEXT IDC_CACHE_SIZE,88,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,88,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,88,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,88,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "&Logon...",IDC_LOGON_PARMS,13,128,66,14 - PUSHBUTTON "Unidades &Globais...",IDC_AUTOMAP_PARMS,13,173,66,14 - PUSHBUTTON "Di&versos...",IDC_MISC_PARMS,13,195,66,14 - GROUPBOX "Configuração de Cache",IDC_STATIC,7,7,206,100 - LTEXT "Tamanho do &Cache:",IDC_STATIC,13,23,71,8 - LTEXT "kb",IDC_INUSE,136,23,68,8 - LTEXT "Tamanho do &Pedaço:",IDC_STATIC,13,64,71,8 - LTEXT "kb",IDC_STATIC,136,64,68,8 - LTEXT "Cache de &Status:",IDC_STATIC,13,85,71,8 - LTEXT "entradas",IDC_STATIC,136,85,68,8 - LTEXT "Ca&minho do Cache:",IDC_STATIC,13,44,71,8 - GROUPBOX "Parâmetros Avançados Adicionais",IDC_STATIC,7,114,206, - 104 - LTEXT "Criar mapeamentos globais de unidades do AFS.", - IDC_STATIC,85,172,121,17 - LTEXT "Ajustar definições integradas de logon.",IDC_STATIC,85, - 131,122,8 - LTEXT "Definir vários outros parâmetros avançados.",IDC_STATIC, - 85,194,121,17 - PUSHBUTTON "&Diagnóstico...",IDC_DIAG_PARMS,13,150,66,14 - LTEXT "Ativar definições para depuração de problemas.", - IDC_STATIC,85,149,122,17 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Especificar Prioridade do Servidor" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Pode-se especificar uma escala de prioridades para um servidor nesta célula do AFS. Servidores com uma posição menor na escala são consultados primeiro ao procurar dados no AFS.", - IDC_STATIC,7,7,237,26 - LTEXT "&Servidor:",IDC_STATIC,34,38,34,8 - LTEXT "&Posição:",IDC_STATIC,34,54,32,8 - EDITTEXT IDC_SERVER,73,36,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,73,52,36,13,ES_AUTOHSCROLL - LTEXT "Dica: você pode especificar posições para vários servidores ao mesmo tempo usando o botão Importar para ler um arquivo de texto especificando os servidores e suas posições.", - IDC_STATIC,7,74,237,26 - PUSHBUTTON "Cancelar",IDCANCEL,140,102,50,14 - PUSHBUTTON "OK",IDOK,86,102,50,14 - PUSHBUTTON "Ajuda",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Propriedades da Célula" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "As informações nesta página dizem ao AFS como contactar a célula especificada.", - IDC_STATIC,5,4,226,16 - LTEXT "Célula do &AFS:",IDC_STATIC,4,27,50,8 - EDITTEXT IDC_CELL,55,25,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "&Descrição:",IDC_STATIC,4,44,38,8 - EDITTEXT IDC_COMMENT,55,42,176,13,ES_AUTOHSCROLL - GROUPBOX "Servidores",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "&Incluir...",IDC_ADD,75,198,50,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "&Remover",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 260, 111 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Incluir/Editar Servidor" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Digite o nome de um Servidor de Localização de Volumes na célula especificada.", - IDC_STATIC,6,7,247,19 - LTEXT "&Nome do Servidor:",IDC_STATIC,6,31,60,8 - EDITTEXT IDC_COMMENT,77,29,169,13,ES_AUTOHSCROLL - LTEXT "&Endereço do Servidor:",IDC_STATIC,6,52,72,8 - CONTROL "&Usar endereço específico:",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,81,52,99,10 - CONTROL "&Procurar endereço automaticamente",IDC_ADDR_LOOKUP, - "Button",BS_AUTORADIOBUTTON,81,66,134,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,181,51, - 65,13 - PUSHBUTTON "Cancelar",IDCANCEL,140,90,50,14 - PUSHBUTTON "OK",IDOK,86,90,50,14 - PUSHBUTTON "Ajuda",9,203,90,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Mapear Letra de Unidade" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Você pode mapear letras de unidades em seu computador para caminhos no AFS.", - IDC_STATIC,7,7,269,8 - LTEXT "Por exemplo, se mapear a unidade Q como /afs/acme.com/usr/bob, os arquivos disponíveis no AFS como /afs/acme.com/usr/bob/* ficarão visíveis no diretório Q:\\ de seu computador.", - IDC_STATIC,7,24,283,29 - LTEXT "&Letra da Unidade:",IDC_STATIC,26,59,59,8 - COMBOBOX IDC_DRIVE,87,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Caminho do AFS:",IDC_STATIC,26,77,55,8 - EDITTEXT IDC_PATH,87,75,168,13,ES_AUTOHSCROLL - LTEXT "D&escrição:",IDC_STATIC,25,96,38,8 - EDITTEXT IDC_DESC,87,94,72,13,ES_AUTOHSCROLL - CONTROL "&Restaurar este mapeamento sempre que eu efetuar logon", - IDC_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,77, - 112,204,10 - PUSHBUTTON "Cancelar",IDCANCEL,186,135,50,14 - PUSHBUTTON "OK",IDOK,132,135,50,14 - PUSHBUTTON "Ajuda",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 194 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Submontagens" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Seu computador pode fornecer submontagens--compartilhamentos de rede no AFS.", - IDC_STATIC,4,4,222,17 - GROUPBOX "Submontagens",IDC_STATIC,4,22,236,168 - LTEXT "As seguintes submontagens são compartilhadas a partir deste computador:", - IDC_STATIC,10,30,224,17 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 49,223,115 - PUSHBUTTON "&Incluir...",IDC_ADD,78,168,50,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,131,168,50,14 - PUSHBUTTON "&Remover",IDC_REMOVE,184,168,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 270, 122 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Especificar Submontagem" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "As submontagens permitem compartilhar uma árvore de subdiretórios do AFS usando Windows Networking.", - IDC_STATIC,7,7,256,18 - LTEXT "&Submontagem:",IDC_STATIC,16,34,49,8 - LTEXT "&Caminho do AFS:",IDC_STATIC,16,50,57,8 - EDITTEXT IDC_SUBMOUNT,78,32,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,78,48,181,13,ES_AUTOHSCROLL - LTEXT "Digite um nome curto para a submontagem, e um caminho completo do AFS onde solicitado. O caminho do AFS pode começar com ""\\afs"" (caso contrário, ""\\afs"" será incluído automaticamente).", - IDC_STATIC,7,68,256,24 - PUSHBUTTON "Cancelar",IDCANCEL,159,101,50,14 - PUSHBUTTON "OK",IDOK,105,101,50,14 - PUSHBUTTON "Ajuda",9,213,101,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Letras de Unidades" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Letras de Unidades",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,29,219,60 - PUSHBUTTON "&Incluir...",IDC_ADD,100,91,42,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,145,91,42,14 - PUSHBUTTON "&Remover",IDC_REMOVE,190,91,42,14 - LTEXT "Letras de unidades mapeadas para caminhos no AFS:", - IDC_STATIC,13,18,193,8 - LTEXT "Nota: estes controles estão desativados porque o serviço AFS Básico não está conectado a um gateway AFS.", - IDC_WARN,13,107,219,25 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Células do AFS" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Células do AFS",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "&Incluir...",IDC_ADD,75,116,50,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "&Remover",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 219, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Serviço AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "",IDC_STATIC,4,0,211,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "Aguarde; o Serviço AFS Client está iniciando...", - IDC_STARTING,46,20,157,8 - LTEXT "Aguarde; o Serviço AFS Client está parando...", - IDC_STOPPING,46,20,157,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Geral" -FONT 9, "MS Shell Dlg" -BEGIN - GROUPBOX "Célula Padrão",IDC_STATIC,7,7,206,54 - LTEXT "Digite o nome da célula padrão do AFS a administrar:", - IDC_STATIC,12,19,182,8 - LTEXT "Célula Padrão:",IDC_STATIC,12,37,48,8 - EDITTEXT IDC_CELL,62,35,144,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "Células do AFS",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "&Incluir...",IDC_ADD,51,227,50,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "&Remover",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuração de Diversos" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,101,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,101,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,101,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,101,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,101,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,101,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,101,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,55,172,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,109,172,50,14 - PUSHBUTTON "Ajuda",9,163,172,50,14 - GROUPBOX "Parâmetros",IDC_STATIC,7,7,206,156 - LTEXT "Intervalo de &Sondagem:",IDC_STATIC,12,42,79,8 - LTEXT "segundos",IDC_STATIC,149,42,57,8 - LTEXT "Threads em &Background:",IDC_STATIC,12,62,83,8 - LTEXT "threads",IDC_STATIC,149,62,46,8 - LTEXT "Threads de S&erviço:",IDC_STATIC,12,82,71,8 - LTEXT "threads",IDC_STATIC,149,82,46,8 - LTEXT "Nome do S&istema:",IDC_STATIC,12,102,71,8 - LTEXT "Diretório de &Montagem:",IDC_STATIC,12,122,78,8 - LTEXT "Número da Placa de &LAN:",IDC_STATIC,12,22,85,8 - LTEXT "Volume da &Raiz:",IDC_STATIC,12,141,71,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuração de Diagnóstico" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,124,20,32,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,52,114,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,106,114,50,14 - PUSHBUTTON "Ajuda",9,160,114,50,14 - GROUPBOX "Parâmetros do Log de Rastreio",IDC_STATIC,7,7,203,54 - LTEXT "Tamanho do &Buffer:",IDC_STATIC,13,22,73,8 - LTEXT "kb",IDC_STATIC,172,24,9,8 - GROUPBOX "Parâmetros do Log de Eventos",IDC_STATIC,7,69,203,35 - COMBOBOX IDC_TRAP_ON_PANIC,124,40,32,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Interrupção de Alerta:",IDC_STATIC,13,42,81,8 - LTEXT "Relatar Inicializações de Sessão:",IDC_STATIC,13,86,105, - 8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,124,84,32,64, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configuração de Logon" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,129,18,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,129,39,32,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,21,71,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,75,71,50,14 - PUSHBUTTON "Ajuda",9,129,71,50,14 - LTEXT "Intervalo de Repetição de &Logon:",IDC_STATIC,13,20,106, - 8 - GROUPBOX "Parâmetros",IDC_STATIC,7,7,172,54 - LTEXT "&Falhar Logons Silenciosamente:",IDC_STATIC,13,41,102,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Unidades Globais" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Fechar",IDOK,141,148,50,14 - PUSHBUTTON "Ajuda",9,196,148,50,14 - PUSHBUTTON "&Incluir",IDC_ADD,108,117,42,14 - GROUPBOX "Unidades do AFS Mapeadas Globalmente",IDC_STATIC,7,7, - 239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "Al&terar",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "&Remover",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Mapear Unidade Global" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_DRIVE,71,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,71,42,160,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,71,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,82,96,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,136,96,50,14 - PUSHBUTTON "Ajuda",9,190,96,50,14 - LTEXT "&Letra da Unidade:",IDC_STATIC,13,25,58,8 - LTEXT "&Caminho do AFS:",IDC_STATIC,13,44,55,8 - LTEXT "D&escrição:",IDC_STATIC,12,64,38,8 - GROUPBOX "Unidade Global do AFS",IDC_STATIC,7,7,232,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 253 - TOPMARGIN, 7 - BOTTOMMARGIN, 104 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 190 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 263 - TOPMARGIN, 7 - BOTTOMMARGIN, 115 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""Configuração do AFS Client""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "Configuração do AFS Client" - IDS_TITLE_95 "Configuração do AFS Básico" - IDS_STATE_STOPPED "O serviço AFS Client está parado." - IDS_STATE_RUNNING "O serviço AFS Client está sendo executado normalmente." - IDS_STATE_STARTING "Aguarde; o serviço AFS Client está iniciando..." - IDS_STATE_STOPPING "Aguarde; o serviço AFS Client está parando..." - IDS_STATE_UNKNOWN "O serviço AFS Client não está configurado corretamente." - IDS_SERVICE_FAIL_START "O Serviço AFS Client não pôde ser iniciado com êxito. Você pode não ter autorização para realizar esta operação.\n\nErro 0x%1." - IDS_SERVICE_FAIL_STOP "O Serviço AFS Client não pôde ser parado com êxito. Você pode não ter autorização para realizar esta operação.\n\nErro 0x%1." - IDS_WARN_STOPPED "Os controles desativados não podem ser alterados porque o serviço AFS Client não está em execução." - IDS_WARN_ADMIN "Os controles desativados não podem ser alterados porque você não está com logon no Windows como administrador." - IDS_CELL_UNKNOWN "(desconhecido)" - IDS_GATEWAY_UNKNOWN "(desconhecido)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "O Windows não pôde encontrar um endereço de rede para %1. Certifique-se de que digitou corretamente o nome da máquina." - IDS_NEWSUB_DESC "O AFS não pôde usar a descrição especificada ao conectar-se à unidade de rede.\n\nA descrição especificada já é usada por um outro caminho do AFS." - IDS_BADSUB_DESC "A descrição da letra de unidade informada não pode ser usada.\n\nUma descrição de letra de unidade não pode ter mais de 12 caracteres, e não pode conter espaços ou tabulações." - IDS_BADGATEWAY_DESC "O AFS não conseguiu contactar a máquina de gateway especificada.\n\nCertifique-se de que digitou corretamente o nome da máquina de gateway." - IDS_BADGWCELL_DESC "Não foram encontradas informações de configuração para a célula do AFS usada pela máquina de gateway especificada.\n\nSe desejar configurar o AFS Client em uma nova célula, é preciso usar a guia Células do AFS para incluir informações de configuração para essa célula.\n\nCélula: %1" - IDS_TITLE_CAUTION_NT "Atenção - Configuração do AFS Client" - IDS_TITLE_CAUTION_95 "Atenção - Configuração do AFS Básico" - IDS_TITLE_ERROR_NT "Erro - Configuração do AFS Client" - IDS_TITLE_ERROR_95 "Erro - Configuração do AFS Básico" - IDS_SHRINKCACHE "O tamanho da cache do AFS Client não pode ser reduzido enquanto o AFS Client está executando.\n\nPara reduzir o tamanho da cache, use antes o botão Parar Serviço na guia Geral para parar o serviço AFS Client." - IDS_BADCELL_DESC_CC "Não foram encontradas informações de configuração para a célula do AFS digitada.\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "Arquivos armazenados no AFS não estarão disponíveis deste computador se o serviço AFS Client for parado.\n\nDeseja realmente parar o serviço?" - IDS_PREFCOL_SERVER "Servidor" - IDS_PREFCOL_RANK "Posição" - IDS_TIP_PREFS "Dica: Servidores com números de posição mais baixos terão prioridade ao ler arquivos pelo AFS." - IDS_PREFERROR_RESOLVE "O AFS não pôde encontrar o servidor denominado %1. Certifique-se de que digitou corretamente o servidor." - IDS_FILTER_TXT "Arquivos de Texto (*.TXT);*.TXT;" - IDS_HOSTREM_MANY "Você selecionou remover todas as informações de contato para as células selecionadas do AFS.\n\nDeseja realmente remover estas entradas?" - IDS_HOSTREM_ONE "Você selecionou remover todas as informações de contato para a célula %1 do AFS.\n\nDeseja realmente remover esta entrada?" - IDS_CELLEDIT_TITLE "%1 - Propriedades" - IDS_CELLADD_TITLE "Nova Célula" - IDS_SVRCOL_SERVER "Endereço" - IDS_SVRCOL_COMMENT "Nome do Servidor" - IDS_TIP_DRIVES "Dica: Pode-se conectar um mapeamento de unidade de rede marcando a caixa próxima à letra da unidade do mapeamento." - IDS_MAP_LETTER "Unidade *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Unidade %1: \t%2" - IDS_ERROR_MAP "Erro Mapeando Unidade de Rede" - IDS_ERROR_MAP_DESC "O AFS foi incapaz de mapear a unidade de rede para o caminho especificado no AFS. Certifique-se de que a letra da unidade não esteja sendo utilizada.\n\nErro: 0x%1." - IDS_ERROR_UNMAP "Erro Mapeando Unidade de Rede" - IDS_ERROR_UNMAP_DESC "O AFS foi incapaz de remover o mapeamento da unidade de rede especificada. Certifique-se de que a letra da unidade não esteja sendo utilizada.\n\nErro: 0x%1." - IDS_ADDSERVER_TITLE "Incluir Servidor" - IDS_EDITSERVER_TITLE "Editar Servidor" - IDS_SUBCOL_SHARE "Submontagem" - IDS_SUBCOL_PATH "Caminho do AFS" - IDS_SUBMOUNTS_TITLE "Submontagens" - IDS_BADCELL_DESC "Não foram encontradas informações de configuração para a célula do AFS digitada.\n\n+" - IDS_BADCELL_DESC2 "Verifique o nome da célula para assegurar-se de que foi digitado corretamente. Se desejar configurar o AFS Client em uma nova célula, é preciso usar a guia Células do AFS para incluir informações de configuração para essa célula." - IDS_KB_IN_USE "kb (%1 kb em uso)" - IDS_NOGATEWAY_TITLE "Gateway do AFS Inválido" - IDS_NOGATEWAY_DESC "O AFS Básico não pode ser configurado porque não foi especificado um Gateway do AFS.\n\nDigite o nome ou endereço IP de um Gateway do AFS na área fornecida." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "O AFS Client não pode ser configurado porque não foi especificada uma célula do AFS.\n\nDigite o nome de uma célula do AFS na área fornecida." - IDS_STOPPED_NOCELL "É preciso especificar uma célula do AFS antes que o serviço AFS Client possa ser iniciado." - IDS_OKSTOP_DESC "O serviço AFS Client não está executando. Arquivos armazenados no AFS não estarão acessíveis neste computador até que o serviço AFS Client seja iniciado.\n\nDeseja iniciar o serviço agora?" - IDS_BADMAP_DESC "O AFS não pode mapear uma letra de unidade para o caminho especificado porque o caminho não começa com ""\\afs"".\n\nDigite um caminho que comece com ""\\afs"", e tente novamente." - IDS_RESTART_TITLE "Configuração do AFS Client" - IDS_RESTART_DESC "Algumas alterações feitas não terão efeito até que o serviço AFS Client seja parado e reiniciado.\n\nDeseja parar e reiniciar o serviço agora?" - IDS_KB_ONLY "kb" - IDS_FAILCONFIG_AUTHENT "Um erro ocorreu ao tentar ativar ou desativar a autenticação no logon.\n\nErro %1" - IDS_FAILCONFIG_PREFS "Algumas das prioridades de posição de servidor atribuídas não puderam ser usadas. \n\nErro %1" - IDS_FAILCONFIG_CACHE "O tamanho de cache do AFS Client digitado não pôde ser usado.\n\nErro %1" - IDS_FAILCONFIG_PROBE "O intervalo de sondagem do AFS Client digitado não pôde ser usado.\n\nErro %1" - IDS_FAILCONFIG_SYSNAME "O sysname do AFS Client digitado não pôde ser usado.\n\nErro %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "Verifique o nome da célula para assegurar-se de que foi digitado corretamente. Se o nome correto da célula não aparecer na lista Células do AFS, use o botão Incluir para criar uma entrada para a célula." - IDS_NOCELL_DESC_CC "O Centro de Controle do AFS não pôde ser configurado porque não foi especificada uma célula padrão do AFS.\n\ndigite o nome de uma célula do AFS na área fornecida." - IDS_TITLE_CAUTION_CCENTER - "Atenção - Propriedades do Centro de Controle do AFS" - IDS_TITLE_ERROR_CCENTER "Erro - Propriedades do Centro de Controle do AFS" - IDS_TITLE_CCENTER "Propriedades do Centro de Controle do AFS" - IDS_YES "Sim" - IDS_NO "Não" - IDS_DRIVE "Unidade" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/zh_CN/afs_config.rc b/src/WINNT/client_config/lang/zh_CN/afs_config.rc deleted file mode 100644 index 3641987d3..000000000 --- a/src/WINNT/client_config/lang/zh_CN/afs_config.rc +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS ¿Í»§»úÅäÖÃ" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "¿Í»§»úÅäÖÃ",IDC_STATIC,7,7,206,142 - LTEXT "µ¥ÔªÃû(&C)£º",IDC_STATIC,13,23,44,8 - EDITTEXT IDC_CELL,62,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "µÇ¼µ½ Windows ʱ»ñµÃ AFS ÁîÅÆ",IDC_LOGON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 - CONTROL "Ìṩ AFS Light Íø¹Ø(&P)",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "ÔÚÈÎÎñÀ¸ÖÐÏÔʾ AFS ¿Í»§»úͼ±ê(&I)",IDC_TRAYICON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,95,193,10 - LTEXT "×¢Ò⣺ÓÉÓÚûÓÐÔËÐÐ AFS ¿Í»§»ú·þÎñ£¬½«½ûÓÃÕâЩ¿ØÖÆ¡£", - IDC_WARN,13,124,193,17 - GROUPBOX "¿Í»§»ú״̬",IDC_STATIC,7,157,206,61 - LTEXT "(²éѯµ±Ç°×´Ì¬)",IDC_STATUS,13,172,193,17 - PUSHBUTTON "Æô¶¯·þÎñ(&S)",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "Í£Ö¹·þÎñ(&T)",IDC_SERVICE_STOP,149,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "¿Í»§»úÅäÖÃ",IDC_STATIC,7,7,231,131 - LTEXT "Íø¹Ø(&G)£º",IDC_STATIC,13,28,45,8 - EDITTEXT IDC_GATEWAY,63,27,104,13,ES_AUTOHSCROLL - PUSHBUTTON "ÏÖÔÚÁ¬½Ó(&N)",IDC_GATEWAY_CONN,172,27,57,14 - LTEXT "µ¥ÔªÃû(&C)£º",IDC_STATIC,13,51,45,8 - EDITTEXT IDC_CELL,63,49,104,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "µÇ¼µ½ Windows ʱ»ñµÃ AFS ÁîÅÆ",IDC_LOGON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,73,193,10 - CONTROL "ÔÚÈÎÎñÀ¸ÖÐÏÔʾ AFS Light ͼ±ê(&H)",IDC_TRAYICON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,93,193,10 - LTEXT "×¢Ò⣺ÓÉÓÚ AFS ¿Í»§»úûÓÐÁ¬½ÓÖÁ AFS Íø¹Ø£¬½«½ûÓÃÕâЩ¿ØÖÆ¡£", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ê×Ñ¡Ïî" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "·þÎñÆ÷Ê×Ñ¡Ïî",-1,7,7,206,211 - CONTROL "ÏÔʾÎļþ·þÎñÆ÷Ê×Ñ¡Ïî(&F)",IDC_SHOW_FS,"Button", - BS_AUTORADIOBUTTON,13,21,193,10 - CONTROL "ÏÔʾ¾íλÖ÷þÎñÆ÷Ê×Ñ¡Ïî(&V)",IDC_SHOW_VLS,"Button", - BS_AUTORADIOBUTTON,13,34,193,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 49,173,120 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,84,172,50,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,137,172,50,14 - PUSHBUTTON "^",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "µ¼Èë(&I)...",IDC_IMPORT,13,172,50,14 - LTEXT "×¢Ò⣺ÓÉÓÚûÓÐÔËÐÐ AFS ¿Í»§»ú·þÎñ£¬½«½ûÓÃÕâЩ¿ØÖÆ¡£", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS µ¥Ôª" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "AFS µ¥Ôª",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,51,195,50,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÅÌ·û" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ÅÌ·û",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,193,135 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,69,171,48,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,120,171,42,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,165,171,42,14 - LTEXT "½«ÅÌ·ûÓ³ÉäÖÁ AFS ÖеÄ·¾¶£º",IDC_STATIC,13,21,193,8 - PUSHBUTTON "¸ß¼¶(&V)...",IDC_ADVANCED,13,171,53,14 - LTEXT "×¢Ò⣺ÓÉÓÚûÓÐÔËÐÐ AFS ¿Í»§»ú·þÎñ£¬½«½ûÓÃÕâЩ¿ØÖÆ¡£", - IDC_WARN,13,193,193,17 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¸ß¼¶" -FONT 9, "ËÎÌå" -BEGIN - EDITTEXT IDC_CACHE_SIZE,88,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,88,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,88,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,88,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "µÇ¼(&L)...",IDC_LOGON_PARMS,13,128,68,14 - PUSHBUTTON "È«¾ÖÇý¶¯Æ÷(&G)...",IDC_AUTOMAP_PARMS,13,173,68,14 - PUSHBUTTON "ÔÓÏî(&M)...",IDC_MISC_PARMS,13,195,68,14 - GROUPBOX "¸ßËÙ»º´æÅäÖÃ",IDC_STATIC,7,7,206,100 - LTEXT "¸ßËÙ»º´æ´óС(&C)£º",IDC_STATIC,13,23,71,8 - LTEXT "KB",IDC_INUSE,136,23,68,8 - LTEXT "¿é´óС(&H)£º",IDC_STATIC,13,64,71,8 - LTEXT "KB",IDC_STATIC,136,64,68,8 - LTEXT "״̬¸ßËÙ»º´æ(&S)£º",IDC_STATIC,13,85,71,8 - LTEXT "ÌõÄ¿",IDC_STATIC,136,85,68,8 - LTEXT "¸ßËÙ»º´æÂ·¾¶(&P)£º",IDC_STATIC,13,44,71,8 - GROUPBOX "¸½¼Ó¸ß¼¶²ÎÊý",IDC_STATIC,7,114,206,104 - LTEXT "´´½¨È«¾Ö AFS Çý¶¯Æ÷Ó³Éä¡£",IDC_STATIC,86,176,120,10 - LTEXT "µ÷Õû¼¯³ÉµÇ¼ÉèÖá£",IDC_STATIC,86,132,120,10 - LTEXT "ÉèÖÃÆäËü¸ß¼¶²ÎÊý¡£",IDC_STATIC,86,199,120,10 - PUSHBUTTON "Õï¶Ï(&D)...",IDC_DIAG_PARMS,13,150,68,14 - LTEXT "ÆôÓÃÎÊÌâµ÷ÊÔÉèÖá£",IDC_STATIC,86,153,120,10 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ö¸¶¨·þÎñÆ÷µÄÓÅÏȼ¶" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "¿ÉΪ´Ë AFS µ¥ÔªÖеķþÎñÆ÷Ö¸¶¨ÓÅÏȼ¶ÅÅÐò¡£µ±²éÕÒ AFS ÖеÄÊý¾Ýʱ£¬½«Ê×ÏȲéѯÓÅÏȼ¶½Ï¸ßµÄ·þÎñÆ÷¡£", - IDC_STATIC,7,7,237,17 - LTEXT "·þÎñÆ÷(&S)£º",IDC_STATIC,7,38,51,8 - LTEXT "ÅÅÐò(&R)£º",IDC_STATIC,7,54,51,8 - EDITTEXT IDC_SERVER,63,36,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,63,52,36,13,ES_AUTOHSCROLL - LTEXT "ÇÏÃÅ£ºÔÚʹÓá°µ¼È롱°´Å¥ÒÔ¶ÁÈ¡Îı¾ÎļþÖ¸¶¨µÄ·þÎñÆ÷ºÍËüÃǵÄÅÅÐòʱ£¬¿Éͬʱָ¶¨¼¸¸ö·þÎñÆ÷µÄÅÅÐò¡£", - IDC_STATIC,7,76,237,18 - PUSHBUTTON "È¡Ïû",IDCANCEL,140,102,50,14 - PUSHBUTTON "È·¶¨",IDOK,86,102,50,14 - PUSHBUTTON "°ïÖú",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µ¥ÔªÌØÐÔ" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "´ËÒ³ÃæÉϵÄÐÅÏ¢½«¸æËß AFS ÈçºÎÁªÏµÖ¸¶¨µÄµ¥Ôª¡£", - IDC_STATIC,4,4,226,8 - LTEXT "AFS µ¥Ôª(&A)£º",IDC_STATIC,4,24,58,8 - EDITTEXT IDC_CELL,62,22,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "ÃèÊö(&D)£º",IDC_STATIC,4,41,38,8 - EDITTEXT IDC_COMMENT,62,39,171,13,ES_AUTOHSCROLL - GROUPBOX "·þÎñÆ÷",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,75,198,50,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 251, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ìí¼Ó£¯±à¼­·þÎñÆ÷" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÔÚÖ¸¶¨µ¥ÔªÖÐÊäÈë¾íλÖ÷þÎñÆ÷µÄÃû³Æ¡£",IDC_STATIC,7,7, - 237,8 - LTEXT "·þÎñÆ÷Ãû(&N)£º",IDC_STATIC,7,31,53,8 - EDITTEXT IDC_COMMENT,75,29,156,13,ES_AUTOHSCROLL - LTEXT "·þÎñÆ÷µØÖ·(&A)£º",IDC_STATIC,7,52,64,8 - CONTROL "ʹÓÃÌØ¶¨µØÖ·(&U)£º",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,75,52,83,10 - CONTROL "×Ô¶¯²éÕÒµØÖ·(&L)",IDC_ADDR_LOOKUP,"Button", - BS_AUTORADIOBUTTON,75,66,111,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,163,51, - 65,13 - PUSHBUTTON "È¡Ïû",IDCANCEL,140,91,50,14 - PUSHBUTTON "È·¶¨",IDOK,86,91,50,14 - PUSHBUTTON "°ïÖú",9,194,91,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ó³ÉäÅÌ·û" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "¿ÉÓ³É伯Ëã»úÉϵÄÅÌ·ûÖÁ AFS ÖеÄ·¾¶¡£",IDC_STATIC,7,7, - 283,8 - LTEXT "ÀýÈ磬Èç¹ûÓ³ÉäÇý¶¯Æ÷ Q ÖÁ /afs/acme.com/usr/bob£¬Ôò AFS µÄ /afs/acme.com/usr/bob/* ÖеĿÉÓÃÎļþ½«ÔÚÄú¼ÆËã»úµÄ Q:\\ Ŀ¼Ï¿ɼû¡£", - IDC_STATIC,7,26,283,16 - LTEXT "ÅÌ·û(&D)£º",IDC_STATIC,14,59,58,8 - COMBOBOX IDC_DRIVE,77,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ·¾¶(&P)£º",IDC_STATIC,14,77,58,8 - EDITTEXT IDC_PATH,77,75,168,13,ES_AUTOHSCROLL - LTEXT "ÃèÊö(&E)£º",IDC_STATIC,14,96,58,8 - EDITTEXT IDC_DESC,77,94,72,13,ES_AUTOHSCROLL - CONTROL "µÇ¼ʱ»Ö¸´Ó³Éä(&R)",IDC_PERSISTENT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,77,112,188,10 - PUSHBUTTON "È¡Ïû",IDCANCEL,186,135,50,14 - PUSHBUTTON "È·¶¨",IDOK,132,135,50,14 - PUSHBUTTON "°ïÖú",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "×Ó°²×°" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÄúµÄ¼ÆËã»ú¿ÉÌṩ AFS ÖеÄ×Ó°²×°--ÍøÂç¹²Ïí¡£",IDC_STATIC, - 4,4,196,8 - GROUPBOX "×Ó°²×°",IDC_STATIC,4,26,236,168 - LTEXT "ÏÂÁÐ×Ó°²×°´Ó´Ë¼ÆËã»úÉϹ²Ïí£º",IDC_STATIC,10,42,176,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 54,223,115 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,78,173,50,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,131,173,50,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,184,173,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 270, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ö¸¶¨×Ó°²×°" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ʹÓà Windows ÍøÂ磬×Ó°²×°ÈÃÄú¹²ÏíÒ»¸ö×ÓĿ¼Ê÷¡£", - IDC_STATIC,7,7,256,8 - LTEXT "×Ó°²×°(&S)£º",IDC_STATIC,7,27,53,8 - LTEXT "AFS ·¾¶(&P)£º",IDC_STATIC,7,43,53,8 - EDITTEXT IDC_SUBMOUNT,63,25,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,63,41,181,13,ES_AUTOHSCROLL - LTEXT "Ϊ×Ó°²×°ÊäÈë¶ÌÃû£¬²¢ÇÒµ±³öÏÖÌáʾʱÊäÈëÒ»¸öÈ« AFS ·¾¶¡£AFS ·¾¶¿ÉÒÔ""\\afs""¿ªÊ¼(Èç¹û²»ÊÇ£¬""\\afs""½«×Ô¶¯Ìí¼Ó)¡£", - IDC_STATIC,7,64,256,18 - PUSHBUTTON "È¡Ïû",IDCANCEL,159,91,50,14 - PUSHBUTTON "È·¶¨",IDOK,105,91,50,14 - PUSHBUTTON "°ïÖú",9,213,91,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÅÌ·û" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ÅÌ·û",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,219,60 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,83,95,48,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,134,95,48,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,184,95,48,14 - LTEXT "½«ÅÌ·ûÓ³ÉäÖÁ AFS ÖеÄ·¾¶£º",IDC_STATIC,13,21,193,8 - LTEXT "×¢Ò⣺ÓÉÓÚ AFS ¿Í»§»úûÓÐÁ¬½ÓÖÁ AFS Íø¹Ø£¬½«½ûÓÃÕâЩ¿ØÖÆ¡£", - IDC_WARN,13,116,219,17 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS µ¥Ôª" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "AFS µ¥Ôª",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,75,116,50,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 219, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS ¿Í»§»ú·þÎñ" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - GROUPBOX "",IDC_STATIC,4,0,211,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "ÇëµÈ´ý£»AFS ¿Í»§»ú·þÎñÕýÔÚÆô¶¯...",IDC_STARTING,46,20, - 157,8 - LTEXT "ÇëµÈ´ý£»AFS ¿Í»§»ú·þÎñÕýÔÚÍ£Ö¹...",IDC_STOPPING,46,20, - 157,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ò»°ã" -FONT 9, "ËÎÌå" -BEGIN - GROUPBOX "ȱʡµ¥Ôª",IDC_STATIC,7,7,206,54 - LTEXT "ÊäÈëÒª¹ÜÀíµÄȱʡ AFS µ¥ÔªÃû£º",IDC_STATIC,14,19,164,8 - LTEXT "ȱʡµ¥Ôª£º",IDC_STATIC,14,37,44,8 - EDITTEXT IDC_CELL,65,35,141,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "AFS µ¥Ôª",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,51,227,50,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÔÓÏîÅäÖÃ" -FONT 8, "System" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,90,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,90,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,55,172,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,109,172,50,14 - PUSHBUTTON "°ïÖú",9,163,172,50,14 - GROUPBOX "²ÎÊý",IDC_STATIC,7,7,206,156 - LTEXT "¼ì²â¼ä¸ô(&P)£º",IDC_STATIC,15,42,71,8 - LTEXT "Ãë",IDC_STATIC,138,42,68,8 - LTEXT "ºǫ́Ïß³Ì(&B)£º",IDC_STATIC,15,62,71,8 - LTEXT "Ïß³Ì",IDC_STATIC,138,62,68,8 - LTEXT "·þÎñÏß³Ì(&E)£º",IDC_STATIC,15,82,71,8 - LTEXT "Ïß³Ì",IDC_STATIC,138,82,68,8 - LTEXT "ϵͳÃû³Æ(&Y)£º",IDC_STATIC,15,102,71,8 - LTEXT "°²×°Ä¿Â¼(&M)£º",IDC_STATIC,15,122,71,8 - LTEXT "LAN ÊÊÅäÆ÷ºÅ(&L)£º",IDC_STATIC,15,22,71,8 - LTEXT "¸ù¾í(&R)£º",IDC_STATIC,15,141,71,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Õï¶ÏÅäÖÃ" -FONT 8, "System" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,112,20,32,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,52,114,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,106,114,50,14 - PUSHBUTTON "°ïÖú",9,160,114,50,14 - GROUPBOX "¸ú×ÙÈÕÖ¾²ÎÊý",IDC_STATIC,7,7,203,54 - LTEXT "»º³åÇø´óС(&B)£º",IDC_STATIC,13,22,73,8 - LTEXT "KB",IDC_STATIC,155,24,9,8 - GROUPBOX "ʼþÈÕÖ¾²ÎÊý",IDC_STATIC,7,69,203,35 - COMBOBOX IDC_TRAP_ON_PANIC,112,40,32,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "½ô¼±Çé¿öϵ÷ÓÃÏÝÚå(&T)£º",IDC_STATIC,13,42,93,8 - LTEXT "±¨¸æ»á»°Æô¶¯£º",IDC_STATIC,13,86,79,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,112,84,32,64, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µÇ¼ÅäÖÃ" -FONT 8, "System" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,117,18,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,117,39,32,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "È·¶¨",IDOK,21,71,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,75,71,50,14 - PUSHBUTTON "°ïÖú",9,129,71,50,14 - LTEXT "µÇÂ¼ÖØÊÔ¼ä¸ô(&L)£º",IDC_STATIC,13,20,98,8 - GROUPBOX "²ÎÊý",IDC_STATIC,7,7,172,54 - LTEXT "µÇ¼ʧ°Ü£¬ÎÞÈκÎÌáʾ(&F)£º",IDC_STATIC,13,41,98,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "È«¾ÖÇý¶¯Æ÷" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "¹Ø±Õ",IDOK,141,148,50,14 - PUSHBUTTON "°ïÖú",9,196,148,50,14 - PUSHBUTTON "Ìí¼Ó(&A)",IDC_ADD,108,117,42,14 - GROUPBOX "È«¾ÖÓ³Éä AFS Çý¶¯Æ÷",IDC_STATIC,7,7,239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "¸ü¸Ä(&C)",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ó³ÉäÈ«¾ÖÇý¶¯Æ÷" -FONT 8, "System" -BEGIN - COMBOBOX IDC_DRIVE,63,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,63,42,168,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,63,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,82,96,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,136,96,50,14 - PUSHBUTTON "°ïÖú",9,190,96,50,14 - LTEXT "ÅÌ·û(&D)£º",IDC_STATIC,12,25,48,8 - LTEXT "AFS ·¾¶(&P)£º",IDC_STATIC,12,44,48,8 - LTEXT "ÃèÊö(&E)£º",IDC_STATIC,12,64,48,8 - GROUPBOX "È«¾Ö AFS Çý¶¯Æ÷",IDC_STATIC,7,7,232,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 263 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS ¿Í»§»úÅäÖÃ""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "AFS ¿Í»§»úÅäÖÃ" - IDS_TITLE_95 "AFS Light ÅäÖÃ" - IDS_STATE_STOPPED "AFS ¿Í»§»ú·þÎñµ±Ç°ÎªÍ£Ö¹×´Ì¬¡£" - IDS_STATE_RUNNING "AFS ¿Í»§»ú·þÎñÕýÔÚÕý³£ÔËÐС£" - IDS_STATE_STARTING "ÇëµÈ´ý£»AFS ¿Í»§»ú·þÎñÕýÔÚÆô¶¯..." - IDS_STATE_STOPPING "ÇëµÈ´ý£»AFS ¿Í»§»ú·þÎñÕýÔÚÍ£Ö¹..." - IDS_STATE_UNKNOWN "AFS ¿Í»§»ú·þÎñûÓÐÊʵ±ÅäÖá£" - IDS_SERVICE_FAIL_START "AFS ¿Í»§»ú·þÎñ²»Äܳɹ¦Æô¶¯¡£Äú¿ÉÄÜûÓÐȨÏÞÀ´Ö´Ðд˲Ù×÷¡£\n\n´íÎó 0x%1¡£" - IDS_SERVICE_FAIL_STOP "AFS ¿Í»§»ú·þÎñ²»Äܳɹ¦Í£Ö¹¡£Äú¿ÉÄÜûÓÐȨÏÞÀ´Ö´Ðд˲Ù×÷¡£\n\n´íÎó 0x%1¡£" - IDS_WARN_STOPPED "ÓÉÓÚ AFS ¿Í»§»ú·þÎñûÓÐÔËÐУ¬²»Äܸü¸Ä½ûÓõĿØÖÆ¡£" - IDS_WARN_ADMIN "ÓÉÓÚÄúûÓÐÒÔ¹ÜÀíÔ±Éí·ÝµÇ¼ÖÁ Windows£¬²»Äܸü¸Ä½ûÓõĿØÖÆ¡£" - IDS_CELL_UNKNOWN "(δ֪)" - IDS_GATEWAY_UNKNOWN "(δ֪)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows ÕÒ²»µ½ %1 µÄÍøÂçµØÖ·¡£¼ì²éÒÔÈ·±£ÊäÈëÁËÕýÈ·µÄ»úÆ÷Ãû¡£" - IDS_NEWSUB_DESC "µ±Á¬½ÓÍøÂçÇý¶¯Æ÷ʱ£¬AFS ÎÞ·¨Ê¹ÓÃÖ¸¶¨µÄÃèÊö¡£\n\nÖ¸¶¨µÄÃèÊöÒÑʹÓÃÔÚ²»Í¬µÄ AFS ·¾¶ÖС£" - IDS_BADSUB_DESC "²»ÄÜʹÓÃÄúÊäÈëµÄÅÌ·ûÃèÊö¡£\n\nÅÌ·ûÃèÊö²»Äܳ¬¹ý 12 ¸ö×Ö·û£¬²¢ÇÒ²»Äܰüº¬¿Õ¸ñ»òÖÆ±í·û¡£" - IDS_BADGATEWAY_DESC "AFS ÎÞ·¨Á¬½ÓÖÁÄúÖ¸¶¨µÄÍø¹Ø»úÆ÷¡£\n\n¼ì²éÒÔÈ·±£ÊäÈëÁíÍâÕýÈ·µÄÍø¹ØÉ豸Ãû³Æ¡£" - IDS_BADGWCELL_DESC "ÕÒ²»µ½Ö¸¶¨µÄÍø¹Ø»úÆ÷ʹÓÃµÄ AFS µ¥ÔªµÄÅäÖÃÐÅÏ¢¡£\n\nÈç¹ûÄúÒªÔÚеĵ¥ÔªÖÐÅäÖà AFS ¿Í»§»ú£¬±ØÐëʹÓá°AFS µ¥Ôª¡±±êÇ©ÒÔÌí¼Ó¸Ãе¥ÔªµÄÅäÖÃÐÅÏ¢¡£\n\nµ¥Ôª£º%1" - IDS_TITLE_CAUTION_NT "×¢Òâ - AFS ¿Í»§»úÅäÖÃ" - IDS_TITLE_CAUTION_95 "×¢Òâ - AFS Light" - IDS_TITLE_ERROR_NT "³ö´í - AFS ¿Í»§»úÅäÖÃ" - IDS_TITLE_ERROR_95 "³ö´í - AFS Light ÅäÖÃ" - IDS_SHRINKCACHE "µ± AFS ¿Í»§»ú·þÎñÕýÔÚÔËÐÐʱ²»ÄܼõÉÙ AFS ¿Í»§»ú¸ßËÙ»º´æµÄ´óС¡£\n\nÒª¼õÉÙ¸ßËÙ»º´æµÄ´óС£¬Ê×ÏÈÔÚ¡°Ò»°ã¡±±êÇ©ÉÏʹÓá°Í£Ö¹·þÎñ¡±°´Å¥Í£Ö¹ AFS ¿Í»§»ú·þÎñ¡£" - IDS_BADCELL_DESC_CC "ÔÚÄúÊäÈëµÄ AFS µ¥ÔªÖÐÕÒ²»µ½ÅäÖÃÐÅÏ¢¡£\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "Èç¹ûÍ£Ö¹ AFS ¿Í»§»ú·þÎñ£¬´æ´¢ÔÚ AFS ÖеÄÎļþ½«²»¿É´Ó´Ë¼ÆËã»úÖдæÈ¡¡£\n\nÈ·ÈÏҪֹͣ·þÎñÂð?" - IDS_PREFCOL_SERVER "·þÎñÆ÷" - IDS_PREFCOL_RANK "ÅÅÐò" - IDS_TIP_PREFS "ÇÏÃÅ£ºµ±´Ó AFS ¶ÁÈ¡Îļþʱ£¬µÍÅÅÐòÊýµÄ·þÎñÆ÷½«»ñµÃ¸ßÓÅÏȼ¶¡£" - IDS_PREFERROR_RESOLVE "AFS ÕÒ²»µ½ÃûΪ %1 µÄ·þÎñÆ÷¡£Çë¼ì²éÒÔÈ·±£ÊäÈëÕýÈ·µÄ·þÎñÆ÷¡£" - IDS_FILTER_TXT "Îı¾Îļþ(*.TXT)£»*.TXT£»" - IDS_HOSTREM_MANY "ÄúÒÑÑ¡Ôñ³ýÈ¥ÓйØÑ¡¶¨µÄ AFS µ¥ÔªµÄËùÓÐÁ¬½ÓÐÅÏ¢¡£\n\nÈ·ÈÏÒª³ýÈ¥ÕâЩÌõÄ¿Âð?" - IDS_HOSTREM_ONE "ÄúÒÑÑ¡Ôñ³ýÈ¥ÓÐ¹Ø AFS µ¥Ôª %1 µÄËùÓÐÁ¬½ÓÐÅÏ¢¡£\n\nÈ·ÈÏÒª³ýÈ¥ÕâЩÌõÄ¿Âð?" - IDS_CELLEDIT_TITLE "%1 - ÌØÐÔ" - IDS_CELLADD_TITLE "н¨µ¥Ôª" - IDS_SVRCOL_SERVER "µØÖ·" - IDS_SVRCOL_COMMENT "·þÎñÆ÷Ãû" - IDS_TIP_DRIVES "ÇÏÃÅ£ºÑ¡ÖÐÓ³ÉäÅÌ·ûÅԵĸ´Ñ¡¿ò£¬Á¬½ÓÍøÂçÇý¶¯Æ÷Ó³Éä¡£" - IDS_MAP_LETTER "Çý¶¯Æ÷ *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Çý¶¯Æ÷ %1: \t%2" - IDS_ERROR_MAP "Ó³ÉäÍøÂçÇý¶¯Æ÷³ö´í" - IDS_ERROR_MAP_DESC "AFS ÎÞ·¨Ó³ÉäÍøÂçÇý¶¯Æ÷ÖÁ AFS ÖеÄ·¾¶¡£¼ì²éÒÔÈ·±£ÅÌ·ûµ±Ç°Ã»ÓÐʹÓá£\n\n´íÎó£º0x%1¡£" - IDS_ERROR_UNMAP "Ó³ÉäÍøÂçÇý¶¯Æ÷³ö´í" - IDS_ERROR_UNMAP_DESC "AFS ÎÞ·¨¶Ï¿ªÓëÖ¸¶¨ÍøÂçÇý¶¯Æ÷µÄÓ³Éä¡£¼ì²éÒÔÈ·±£ÅÌ·ûµ±Ç°Ã»ÓÐʹÓá£\n\n´íÎó£º0x%1¡£" - IDS_ADDSERVER_TITLE "Ìí¼Ó·þÎñÆ÷" - IDS_EDITSERVER_TITLE "±à¼­·þÎñÆ÷" - IDS_SUBCOL_SHARE "×Ó°²×°" - IDS_SUBCOL_PATH "AFS ·¾¶" - IDS_SUBMOUNTS_TITLE "×Ó°²×°" - IDS_BADCELL_DESC "ÔÚÄúÊäÈëµÄ AFS µ¥ÔªÖÐÕÒ²»µ½ÅäÖÃÐÅÏ¢¡£\n\n+" - IDS_BADCELL_DESC2 "¼ì²éÒÔÈ·±£ÄúÕýÈ·ÊäÈëÁ˵¥ÔªµÄÃû³Æ¡£Èç¹ûÄúÒªÔÚеĵ¥ÔªÖÐÅäÖà AFS ¿Í»§»ú£¬Äú±ØÐëʹÓá°AFS µ¥Ôª¡±±êÇ©ÒÔÌí¼Ó¸Ãе¥ÔªµÄÅäÖÃÐÅÏ¢¡£" - IDS_KB_IN_USE "KB (%1 KB ÕýÔÚʹÓÃ)" - IDS_NOGATEWAY_TITLE "ÎÞЧ AFS Íø¹Ø" - IDS_NOGATEWAY_DESC "ÓÉÓÚÄúûÓÐÖ¸¶¨ AFS Íø¹Ø£¬²»ÄÜÅäÖà AFS Light¡£\n\nÇëÔÚÌṩµÄÇøÓòÖÐÊäÈë AFS Íø¹ØµÄÃû³Æ»ò IP µØÖ·¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "ÓÉÓÚÄúûÓÐÖ¸¶¨ AFS µ¥Ôª£¬²»ÄÜÅäÖà AFS ¿Í»§»ú¡£\n\nÇëÔÚÌṩµÄÇøÓòÖÐÊäÈë AFS µ¥ÔªµÄÃû³Æ¡£" - IDS_STOPPED_NOCELL "ÔÚÆô¶¯ AFS ¿Í»§»ú·þÎñ֮ǰ£¬±ØÐëÖ¸¶¨ AFS µ¥Ôª¡£" - IDS_OKSTOP_DESC "ûÓÐÔËÐÐ AFS ¿Í»§»ú·þÎñ¡£ÔÚûÓÐÆô¶¯ AFS ¿Í»§»ú·þÎñ֮ǰ£¬´æ´¢ÔÚ AFS ÖеÄÎļþ½«²»¿É´æÈ¡¡£\n\nÏÖÔÚÆô¶¯·þÎñÂð? " - IDS_BADMAP_DESC "ÓÉÓÚ·¾¶Ã»ÓÐÒÔ""\\afs""¿ªÊ¼£¬AFS ²»ÄÜÓ³ÉäÅÌ·ûÖÁÖ¸¶¨µÄ·¾¶¡£\n\nÈ·±£ÄúËùÊäÈëµÄ·¾¶ÊÇÒÔ""\\afs""¿ªÊ¼µÄ£¬²¢ÖØÊÔÒ»´Î¡£" - IDS_RESTART_TITLE "AFS ¿Í»§»úÅäÖÃ" - IDS_RESTART_DESC "ÔÚ AFS ¿Í»§»ú·þÎñÍ£Ö¹²¢ÖØÐÂÆô¶¯Ö®Ç°£¬ÄúËù×öµÄһЩ¸ü¸Ä½«²»»áÉúЧ¡£\n\nÏÖÔÚÍ£Ö¹²¢ÖØÐÂÆô¶¯·þÎñÂð? " - IDS_KB_ONLY "KB" - IDS_FAILCONFIG_AUTHENT "µ±ÔڵǼʱ³¢ÊÔÆôÓûò½ûÓÃÈÏ֤ʱ³ö´í¡£\n\n´íÎó %1" - IDS_FAILCONFIG_PREFS "ÄúÖ¸¶¨µÄһЩ·þÎñÆ÷ÅÅÐòÓÅÏȼ¶²»ÄÜʹÓá£\n\n´íÎó %1" - IDS_FAILCONFIG_CACHE "²»ÄÜʹÓÃÄúÊäÈëµÄ AFS ¿Í»§»ú¸ßËÙ»º´æ´óС¡£\n\n´íÎó %1" - IDS_FAILCONFIG_PROBE "²»ÄÜʹÓÃÄúÊäÈëµÄ AFS ¿Í»§»ú¼ì²â¼ä¸ô¡£\n\n´íÎó %1" - IDS_FAILCONFIG_SYSNAME "²»ÄÜʹÓÃÄúÊäÈëµÄ AFS ¿Í»§»úϵͳÃû¡£\n\n´íÎó %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "Çë¼ì²éµ¥ÔªÃûÈ·±£ÄúÒÑÊäÈëÕýÈ·¡£Èç¹ûÔÚ AFS µ¥ÔªÁбíÖÐûÓгöÏÖÕýÈ·µÄµ¥ÔªÃû£¬ÇëʹÓá°Ìí¼Ó¡±°´Å¥Îª¸Ãµ¥Ôª´´½¨Ò»¸öÌõÄ¿¡£" - IDS_NOCELL_DESC_CC "²»ÄÜÅäÖà AFS ¿ØÖÆÖÐÐÄ£¬ÒòΪÄú»¹Ã»ÓÐÖ¸¶¨È±Ê¡µÄ AFS µ¥Ôª¡£\n\nÇëÔÚÌṩµÄÇøÓòÖÐÊäÈë AFS µ¥ÔªÃû¡£" - IDS_TITLE_CAUTION_CCENTER "×¢Òâ - AFS ¿ØÖÆÖÐÐÄÌØÐÔ" - IDS_TITLE_ERROR_CCENTER "³ö´í - AFS ¿ØÖÆÖÐÐÄÌØÐÔ" - IDS_TITLE_CCENTER "AFS ¿ØÖÆÖÐÐÄÌØÐÔ" - IDS_YES "ÊÇ" - IDS_NO "·ñ" - IDS_DRIVE "Çý¶¯Æ÷" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/lang/zh_TW/afs_config.rc b/src/WINNT/client_config/lang/zh_TW/afs_config.rc deleted file mode 100644 index efc7df935..000000000 --- a/src/WINNT/client_config/lang/zh_TW/afs_config.rc +++ /dev/null @@ -1,770 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include -#ifndef APSTUDIO_INVOKED -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client Configuration" -#define AFS_VERINFO_NAME "afs_config" -#define AFS_VERINFO_FILENAME "afs_config.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Taiwan) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GENERAL_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¥Î¤áºÝ¬[ºc",IDC_STATIC,7,7,206,142 - LTEXT "Cell ¦WºÙ(&C)¡G",IDC_STATIC,13,23,52,8 - EDITTEXT IDC_CELL,68,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL - CONTROL "µn¤J Windows ®É¨ú±o AFS °O¸¹(&O)",IDC_LOGON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 - CONTROL "´£¨Ñ AFS Light ¹h¹D(&P) ",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "¦b¤u§@¦CÅã¥Ü¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü(&H) ",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95,193,10 - LTEXT "ªþµù¡G¥Ñ©ó¨Ã¥¼°õ¦æ¡uAFS ¥Î¤áºÝ¡vªA°È¡A¦]¦¹±±¨î³£¤w°±¥Î¡C", - IDC_WARN,13,124,193,17 - GROUPBOX "¥Î¤áºÝª¬ºA",IDC_STATIC,7,157,206,61 - LTEXT "¡]¬d¸ß¥Ø«eªºª¬ºA¡^",IDC_STATUS,13,172,193,17 - PUSHBUTTON "±Ò°ÊªA°È(&S)",IDC_SERVICE_START,88,195,57,14 - PUSHBUTTON "°±¤îªA°È(&T)",IDC_SERVICE_STOP,149,195,57,14 -END - -IDD_GENERAL_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¥Î¤áºÝ¬[ºc",IDC_STATIC,7,7,231,131 - LTEXT "¹h¹D(&G)¡G",IDC_STATIC,13,28,38,8 - EDITTEXT IDC_GATEWAY,63,27,110,13,ES_AUTOHSCROLL - PUSHBUTTON "¥ß§Y³s±µ(&N)",IDC_GATEWAY_CONN,177,27,57,14 - LTEXT "Cell ¦WºÙ(&C)¡G",IDC_STATIC,13,51,49,8 - EDITTEXT IDC_CELL,63,49,104,13,ES_LOWERCASE | ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - CONTROL "µn¤J Windows ®É¨ú±o AFS °O¸¹(&O)",IDC_LOGON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,73,193,10 - CONTROL "¦b¤u§@¦CÅã¥Ü¡uAFS Light ¡v¹Ï¥Ü(&H)",IDC_TRAYICON,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,93,193,10 - LTEXT "ªþµù¡G¥Ñ©ó¡uAFS Light ¡v¨Ã¥¼³s±µ¦Ü AFS ¹h¹D¡A¦]¦¹°±¥Î³o¨Ç±±¨î¡C", - IDC_WARN,13,114,219,17 -END - -IDD_PREFS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "³ß¦n³]©w" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¦øªA¾¹³ß¦n³]©w",-1,7,7,206,211 - CONTROL "Åã¥ÜÀɮצøªA¾¹³ß¦n³]©w(&F)",IDC_SHOW_FS,"Button", - BS_AUTORADIOBUTTON,13,21,193,10 - CONTROL "Åã¥Ü®eÅé¦ì¸m¦øªA¾¹³ß¦n³]©w(&V)",IDC_SHOW_VLS,"Button", - BS_AUTORADIOBUTTON,13,34,193,10 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0xb,13, - 49,173,120 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,74,173,50,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,136,173,50,14 - PUSHBUTTON "^",IDC_UP,191,97,15,14,BS_ICON - PUSHBUTTON "v",IDC_DOWN,191,117,15,14,BS_ICON - PUSHBUTTON "¶×¤J(&I)...",IDC_IMPORT,12,173,50,14 - LTEXT "ªþµù¡G¥Ñ©ó¨Ã¥¼°õ¦æ¡uAFS ¥Î¤áºÝ¡vªA°È¡A¦]¦¹°±¥Î³o¨Ç±±¨î¡C", - IDC_WARN,13,193,193,17 -END - -IDD_HOSTS_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Cell" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "AFS Cell",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 21,193,168 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,51,195,50,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,104,195,50,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,157,195,50,14 -END - -IDD_DRIVES_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ºÏºÐ¾÷¥N¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "ºÏºÐ¾÷¥N¸¹",IDC_STATIC,7,7,206,211 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,193,135 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,71,171,42,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,118,171,42,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,165,171,42,14 - LTEXT "¹ïÀ³¦Ü AFS ¤W¤§¸ô®|ªººÏºÐ¾÷¥N¸¹¡G",IDC_STATIC,13,21,193, - 8 - PUSHBUTTON "¶i¶¥(&V)...",IDC_ADVANCED,13,171,53,14 - LTEXT "ªþµù¡G¥Ñ©ó¨Ã¥¼°õ¦æ¡uAFS ¥Î¤áºÝ¡vªA°È¡A¦]¦¹°±¥Î³o¨Ç±±¨î¡C", - IDC_WARN,13,193,193,17 -END - -IDD_ADVANCED_NT DIALOG DISCARDABLE 0, 0, 220, 225 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¶i¶¥" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_CACHE_SIZE,88,21,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_CACHE_PATH,88,41,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_CHUNK_SIZE,88,62,32,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_STAT_ENTRIES,88,83,32,13,ES_AUTOHSCROLL - PUSHBUTTON "µn¤J(&L)...",IDC_LOGON_PARMS,13,127,64,14 - PUSHBUTTON "¼s°ìºÏºÐ¾÷(&G)...",IDC_AUTOMAP_PARMS,13,171,64,14 - PUSHBUTTON "Âø¶µ(&M)...",IDC_MISC_PARMS,13,195,64,14 - GROUPBOX "§Ö¨ú¬[ºc",IDC_STATIC,7,7,206,100 - LTEXT "§Ö¨ú¤j¤p(&C) ¡G",IDC_STATIC,13,23,71,8 - LTEXT "kb",IDC_INUSE,136,23,68,8 - LTEXT "¤ù¬q¤j¤p(&H)¡G",IDC_STATIC,13,64,71,8 - LTEXT "kb",IDC_STATIC,136,64,68,8 - LTEXT "ª¬ºA§Ö¨ú(&S) ¡G",IDC_STATIC,13,85,71,8 - LTEXT "¶µ¥Ø",IDC_STATIC,136,85,68,8 - LTEXT "§Ö¨ú¸ô®|(&P)¡G",IDC_STATIC,13,44,71,8 - GROUPBOX "¨ä¥¦¶i¶¥°Ñ¼Æ",IDC_STATIC,7,114,206,104 - LTEXT "«Ø¥ß¼s°ìªº AFS ºÏºÐ¾÷¹ïÀ³¡C",IDC_STATIC,84,175,132,10 - LTEXT "½Õ¾ã¾ã¦Xµn¤J³]©w¡C",IDC_STATIC,84,131,133,10 - LTEXT "³]©w¦h­Ó¨ä¥¦ªº¶i¶¥°Ñ¼Æ¡C",IDC_STATIC,84,198,132,10 - PUSHBUTTON "¶EÂ_(&D)...",IDC_DIAG_PARMS,13,149,64,14 - LTEXT "±Ò¥Î°ÝÃD°£¿ù³]©w¡C",IDC_STATIC,84,152,132,10 -END - -IDD_PREFS_EDIT DIALOG DISCARDABLE 0, 0, 251, 123 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "«ü©w¦øªA¾¹Àu¥ý¶¶§Ç" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±z¥i¥H¦b³o­Ó AFS Cell ¤¤¡A«ü©w¦øªA¾¹ªºÀu¥ý¶¶§Çµ¥¯Å¡C¦b AFS ¦¬´M¸ê®Æ®É¡A·|±qµ¥¯Å¸û§Cªº¦øªA¾¹¶}©l¬d¸ß¡C", - IDC_STATIC,7,7,237,17 - LTEXT "¦øªA¾¹(&S)¡G",IDC_STATIC,29,38,45,8 - LTEXT "µ¥¯Å(&R)¡G",IDC_STATIC,29,54,41,8 - EDITTEXT IDC_SERVER,77,36,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_RANK,76,52,36,13,ES_AUTOHSCROLL - LTEXT "­n³Z¡G±z¥i¥H¦P®É«ü©w¼Æ­Ó¦øªA¾¹ªºµ¥¯Å¡A¤èªk¬O§Q¥Î¡u¶×¤J¡v«ö¶s¡AŪ¨ú«ü©w¦øªA¾¹»P¨äµ¥¯Åªº¤å¦rÀÉ¡C", - IDC_STATIC,7,76,237,18 - PUSHBUTTON "¨ú®ø",IDCANCEL,140,102,50,14 - PUSHBUTTON "½T©w",IDOK,86,102,50,14 - PUSHBUTTON "»¡©ú",9,194,102,50,14 -END - -IDD_CELL_EDIT DIALOG DISCARDABLE 0, 0, 244, 223 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Cell ¤º®e" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¥»­¶ªº¸ê°T§i¶D AFS ¦p¦ó»P¯S©wªº Cell Ápô¡C",IDC_STATIC, - 4,4,226,8 - LTEXT "AFS Cell (&F)¡G",IDC_STATIC,4,24,49,8 - EDITTEXT IDC_CELL,55,22,105,13,ES_LOWERCASE | ES_AUTOHSCROLL - LTEXT "»¡©ú(&D)¡G",IDC_STATIC,4,41,38,8 - EDITTEXT IDC_COMMENT,55,39,176,13,ES_AUTOHSCROLL - GROUPBOX "¦øªA¾¹",IDC_STATIC,4,61,236,158 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x1b,13, - 76,217,117 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,75,198,50,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,128,198,50,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,181,198,50,14 -END - -IDD_SERVER_EDIT DIALOG DISCARDABLE 0, 0, 251, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "·s¼W/½s¿è¦øªA¾¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦b«ü©wªº Cell ¿é¤J¡u®eÅé¦ì¸m¦øªA¾¹¡v¦WºÙ¡C",IDC_STATIC, - 7,7,237,8 - LTEXT "¦øªA¾¹¦WºÙ(&N)¡G",IDC_STATIC,7,31,59,8 - EDITTEXT IDC_COMMENT,69,29,159,13,ES_AUTOHSCROLL - LTEXT "¦øªA¾¹¦ì§}(&A)¡G",IDC_STATIC,7,52,59,8 - CONTROL "¨Ï¥Î¯S©wªº¦ì§}(&U)¡G",IDC_ADDR_SPECIFIC,"Button", - BS_AUTORADIOBUTTON,67,52,83,10 - CONTROL "¦Û°Ê¬d¾\¦a§}(&L)",IDC_ADDR_LOOKUP,"Button", - BS_AUTORADIOBUTTON,67,66,111,10 - CONTROL "",IDC_SERVER,"SockAddr",WS_BORDER | WS_TABSTOP,155,51, - 65,13 - PUSHBUTTON "¨ú®ø",IDCANCEL,140,91,50,14 - PUSHBUTTON "½T©w",IDOK,86,91,50,14 - PUSHBUTTON "»¡©ú",9,194,91,50,14 -END - -IDD_DRIVE_EDIT DIALOG DISCARDABLE 0, 0, 297, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¹ïÀ³ºÏºÐ¾÷¥N¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±z¥i¥H±N¹q¸£¤WªººÏºÐ¾÷¥N¸¹¹ïÀ³¦Ü AFS ¤Wªº¸ô®|¡C", - IDC_STATIC,7,7,283,8 - LTEXT "¨Ò¦p¡A¦pªG±z±NºÏºÐ¾÷ Q ¹ïÀ³¬° /afs/acme.com/usr/bob¡AAFS ¥i¥ÎªºÀÉ®× /afs/acme.com/usr/bob/* ´N·|Åã¥Ü¦b¹q¸£ªº Q:\\ ¥Ø¿ý¤W¡C", - IDC_STATIC,7,26,283,21 - LTEXT "ºÏºÐ¾÷¥N¸¹(&D)¡G",IDC_STATIC,19,59,62,8 - COMBOBOX IDC_DRIVE,84,57,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ¸ô®|(&P)¡G",IDC_STATIC,19,77,51,8 - EDITTEXT IDC_PATH,84,75,168,13,ES_AUTOHSCROLL - LTEXT "µu¦WºÙ(&E)¡G",IDC_STATIC,19,96,38,8 - EDITTEXT IDC_DESC,84,94,72,13,ES_AUTOHSCROLL - CONTROL "¨C·í§Úµn¤J®É§Y«ì´_¦¹¤@¹ïÀ³(&R)",IDC_PERSISTENT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,84,112,188,10 - PUSHBUTTON "¨ú®ø",IDCANCEL,186,135,50,14 - PUSHBUTTON "½T©w",IDOK,132,135,50,14 - PUSHBUTTON "»¡©ú",9,240,135,50,14 -END - -IDD_SUBMOUNTS DIALOG DISCARDABLE 0, 0, 244, 198 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¤l¸Ë¸ü" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±zªº¹q¸£¥i¨Ñ¤l¸Ë¸ü -- AFS ¤¤ªººô¸ô¦@¨É¡C",IDC_STATIC,4, - 4,196,8 - GROUPBOX "¤l¸Ë¸ü",IDC_STATIC,4,26,236,168 - LTEXT "¥H¤Uªº¤l¸Ë¸ü¬O±q¥»¹q¸£¦@¨É¡G",IDC_STATIC,10,42,176,8 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x413,10, - 54,223,115 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,78,173,50,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,131,173,50,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,184,173,50,14 -END - -IDD_SUBMOUNT_EDIT DIALOG DISCARDABLE 0, 0, 270, 112 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "«ü©w¤l¸Ë¸ü" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¤l¸Ë¸üÅý±z§Q¥Î Windows ºô¸ô¦@¨É AFS ¤l¥Ø¿ý¡C", - IDC_STATIC,7,7,256,8 - LTEXT "¤l¸Ë¸ü(&S)¡G",IDC_STATIC,22,27,46,8 - LTEXT "AFS ¸ô®|(&P)¡G",IDC_STATIC,22,43,52,8 - EDITTEXT IDC_SUBMOUNT,73,25,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_MAPPING,73,41,181,13,ES_AUTOHSCROLL - LTEXT "½Ð¬°¤l¸Ë¸ü¿é¤J¤@­Óµu¦WºÙ¡A¨Ã¦b´£¥Ü³B¿é¤J§¹¾ãªº AFS ¸ô®|¡CAFS ¸ô®|ªº¶}ÀY¬O ""\\afs"" ¡]¦pªG¤£¬O¡A""\\afs"" ·|¦Û°Ê·s¼W¤W¥h¡^¡C", - IDC_STATIC,7,64,256,18 - PUSHBUTTON "¨ú®ø",IDCANCEL,159,91,50,14 - PUSHBUTTON "½T©w",IDOK,105,91,50,14 - PUSHBUTTON "»¡©ú",9,213,91,50,14 -END - -IDD_DRIVES_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ºÏºÐ¾÷¥N¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "ºÏºÐ¾÷¥N¸¹",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_TABSTOP | 0x153, - 13,32,219,60 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,100,95,42,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,145,95,42,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,190,95,42,14 - LTEXT "¹ïÀ³¦Ü AFS ¤W¤§¸ô®|ªººÏºÐ¾÷¥N¸¹",IDC_STATIC,13,21,193,8 - LTEXT "ªþµù¡G¥Ñ©ó¡uAFS Light ¡v¨Ã¥¼³s±µ¦Ü AFS ¹h¹D ¡A¦]¦¹¤w°±¥Î³o¨Ç±±¨î¡C", - IDC_WARN,13,116,219,17 -END - -IDD_HOSTS_95 DIALOG DISCARDABLE 0, 0, 245, 145 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Cell" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "AFS Cell",IDC_STATIC,7,7,231,131 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 19,218,94 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,75,116,50,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,128,116,50,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,181,116,50,14 -END - -IDD_STARTSTOP DIALOGEX 0, 0, 219, 48 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "AFS ¥Î¤áºÝªA°È" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - GROUPBOX "",IDC_STATIC,4,0,211,44 - ICON IDI_MAIN,IDC_STATIC,14,15,20,20 - LTEXT "½Ðµy­Ô¡F¥¿¦b±Ò°Ê¡uAFS ¥Î¤áºÝ¡vªA°È...",IDC_STARTING,46, - 20,157,8 - LTEXT "½Ðµy­Ô¡F¡uAFS ¥Î¤áºÝ¡vªA°È¥¿¦b°±¤î...",IDC_STOPPING,46, - 20,157,8 -END - -IDD_HOSTS_CCENTER DIALOG DISCARDABLE 0, 0, 220, 256 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¤@¯ë¨Æ¶µ" -FONT 9, "·s²Ó©úÅé" -BEGIN - GROUPBOX "¹w³] Cell",IDC_STATIC,7,7,206,54 - LTEXT "¿é¤J¹w³] AFS Cell ¦WºÙ¥H«KºÞ²z¡G",IDC_STATIC,14,19,164, - 8 - LTEXT "¹w³] Cell¡G",IDC_STATIC,14,37,39,8 - EDITTEXT IDC_CELL,59,35,147,14,ES_LOWERCASE | ES_AUTOHSCROLL - GROUPBOX "AFS Cell",IDC_STATIC,7,69,206,180 - CONTROL "",IDC_LIST,"FastList",WS_BORDER | WS_TABSTOP | 0x11b,13, - 84,193,137 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,51,227,50,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,104,227,50,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,157,227,50,14 -END - -IDD_MISC_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 220, 193 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Âø¶µ¬[ºc" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_LAN_ADAPTER,96,20,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_PROBE,96,40,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_THREADS,96,60,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_DAEMONS,96,80,32,13,ES_AUTOHSCROLL - EDITTEXT IDC_SYSNAME,96,100,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_MOUNTDIR,96,120,83,13,ES_AUTOHSCROLL - EDITTEXT IDC_ROOTVOLUME,96,140,83,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,55,172,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,109,172,50,14 - PUSHBUTTON "»¡©ú",9,163,172,50,14 - GROUPBOX "°Ñ¼Æ",IDC_STATIC,7,7,206,156 - LTEXT "±´°w¶¡¹j(&P)¡G",IDC_STATIC,15,42,71,8 - LTEXT "¬íÄÁ",IDC_STATIC,142,42,58,8 - LTEXT "­I´ººü(&B)¡G",IDC_STATIC,15,62,71,8 - LTEXT "ºü",IDC_STATIC,142,62,68,8 - LTEXT "ªA°Èºü(&E)¡G",IDC_STATIC,15,82,71,8 - LTEXT "ºü",IDC_STATIC,142,82,68,8 - LTEXT "¨t²Î¦WºÙ(&Y)¡G",IDC_STATIC,15,102,71,8 - LTEXT "¸Ë¸ü¥Ø¿ý(&M)¡G",IDC_STATIC,15,122,71,8 - LTEXT "LAN °t±µ¥d¸¹½X(&L)¡G",IDC_STATIC,15,22,77,8 - LTEXT "®Ú®eÅé(&R)¡G",IDC_STATIC,15,141,71,8 -END - -IDD_DIAG_PARMS DIALOG DISCARDABLE 0, 0, 217, 135 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¶EÂ_¬[ºc" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_TRACE_LOG_BUF_SIZE,109,19,32,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,52,114,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,106,114,50,14 - PUSHBUTTON "»¡©ú",9,160,114,50,14 - GROUPBOX "°lÂܤé»x°Ñ¼Æ",IDC_STATIC,7,7,203,54 - LTEXT "½w½Ä°Ï¤j¤p(&B)¡G",IDC_STATIC,13,22,73,8 - LTEXT "kb",IDC_STATIC,164,23,9,8 - GROUPBOX "¨Æ¥ó¤é»x°Ñ¼Æ",IDC_STATIC,7,69,203,35 - COMBOBOX IDC_TRAP_ON_PANIC,109,40,32,61,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "®£·W³]³´(&T)¡G",IDC_STATIC,13,42,50,8 - LTEXT "³ø§i¶¥¬q§@·~±Ò°Ê³]©w¡G",IDC_STATIC,13,86,94,8 - COMBOBOX IDC_REPORT_SESSION_STARTUPS,109,84,32,64, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - -IDD_LOGIN_CONFIG_PARMS DIALOG DISCARDABLE 0, 0, 186, 92 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µn¤J¬[ºc" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_LOGIN_RETRY_INTERVAL,89,18,32,13,ES_AUTOHSCROLL - COMBOBOX IDC_FAIL_SILENTLY,89,39,32,40,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "½T©w",IDOK,21,71,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,75,71,50,14 - PUSHBUTTON "»¡©ú",9,129,71,50,14 - LTEXT "µn¤J­«¸Õ¶¡¹j(&L)¡G",IDC_STATIC,13,20,66,8 - GROUPBOX "°Ñ¼Æ",IDC_STATIC,7,7,172,54 - LTEXT "µLªk¨HÀqµn¤J(&F)¡G",IDC_STATIC,13,41,69,8 -END - -IDD_GLOBAL_DRIVES DIALOG DISCARDABLE 0, 0, 253, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼s°ìºÏºÐ¾÷" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "Ãö³¬",IDOK,141,148,50,14 - PUSHBUTTON "»¡©ú",9,196,148,50,14 - PUSHBUTTON "·s¼W(&A)",IDC_ADD,108,117,42,14 - GROUPBOX "¼s°ì¹ïÀ³ AFS ºÏºÐ¾÷",IDC_STATIC,7,7,239,133 - CONTROL "",IDC_GLOBAL_DRIVE_LIST,"FastList",WS_BORDER | - WS_TABSTOP | 0x1b,14,20,226,89 - PUSHBUTTON "Åܧó(&C)",IDC_CHANGE,153,117,42,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,198,117,42,14 -END - -IDD_GLOBAL_DRIVES_ADDEDIT DIALOG DISCARDABLE 0, 0, 247, 118 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¹ïÀ³¼s°ìºÏºÐ¾÷" -FONT 9, "·s²Ó©úÅé" -BEGIN - COMBOBOX IDC_DRIVE,78,23,63,206,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PATH,78,42,153,13,ES_AUTOHSCROLL - EDITTEXT IDC_DESC,78,62,72,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,82,96,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,136,96,50,14 - PUSHBUTTON "»¡©ú",9,190,96,50,14 - LTEXT "ºÏºÐ¾÷¥N¸¹(&D)¡G",IDC_STATIC,16,25,61,8 - LTEXT "AFS ¸ô®|(&P)¡G",IDC_STATIC,16,44,49,8 - LTEXT "µu¦WºÙ(&E)¡G",IDC_STATIC,15,64,47,8 - GROUPBOX "¼s°ì AFS ºÏºÐ¾÷",IDC_STATIC,7,7,232,80 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_GENERAL_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_GENERAL_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_PREFS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_HOSTS_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_DRIVES_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_ADVANCED_NT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 218 - END - - IDD_PREFS_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 116 - END - - IDD_CELL_EDIT, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 219 - END - - IDD_SERVER_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 244 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVE_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 290 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_SUBMOUNTS, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 240 - TOPMARGIN, 4 - BOTTOMMARGIN, 194 - END - - IDD_SUBMOUNT_EDIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 263 - TOPMARGIN, 7 - BOTTOMMARGIN, 105 - END - - IDD_DRIVES_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_HOSTS_95, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 238 - TOPMARGIN, 7 - BOTTOMMARGIN, 138 - END - - IDD_STARTSTOP, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 215 - TOPMARGIN, 4 - BOTTOMMARGIN, 44 - END - - IDD_HOSTS_CCENTER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 249 - END - - IDD_MISC_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 213 - TOPMARGIN, 7 - BOTTOMMARGIN, 186 - END - - IDD_DIAG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 210 - TOPMARGIN, 7 - BOTTOMMARGIN, 128 - END - - IDD_LOGIN_CONFIG_PARMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 85 - END - - IDD_GLOBAL_DRIVES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 162 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "#ifndef APSTUDIO_INVOKED\r\n" - "#define AFS_VERINFO_FILE_DESCRIPTION ""AFS Client Configuration""\r\n" - "#include ""AFS_component_version_number.h""\r\n" - "#include ""..\\..\\config\\NTVersioninfo.rc""\r\n" - "#endif // APSTUDIO_INVOKED\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afs_config.ico" -IDI_UP ICON DISCARDABLE "up.ico" -IDI_DOWN ICON DISCARDABLE "down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE_NT "AFS ¥Î¤áºÝ¬[ºc" - IDS_TITLE_95 "AFS Light ¬[ºc" - IDS_STATE_STOPPED "¥Ø«e¤w°±¤î¡uAFS ¥Î¤áºÝ¡vªA°È¡C" - IDS_STATE_RUNNING "¡uAFS ¥Î¤áºÝ¡vªA°È¥Ø«e°õ¦æ¥¿±`¡C" - IDS_STATE_STARTING "½Ðµy­Ô¡F¥¿¦b±Ò°Ê¡uAFS ¥Î¤áºÝ¡vªA°È..." - IDS_STATE_STOPPING "½Ðµy­Ô¡F¥¿¦b°±¤î¡uAFS ¥Î¤áºÝ¡vªA°È..." - IDS_STATE_UNKNOWN "¥¼¾A·í¦a¬[ºc¡uAFS ¥Î¤áºÝ¡vªA°È¡C" - IDS_SERVICE_FAIL_START "µLªk¶¶§Q±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v¡C±z¥i¯à¥¼Àò±o°õ¦æ¦¹¤@§@·~ªºÅv­­¡C\n\n¿ù»~ 0x%1¡C" - IDS_SERVICE_FAIL_STOP "µLªk¶¶§Q°±¤î¡uAFS ¥Î¤áºÝªA°È¡v¡C±z¥i¯à¥¼Àò±o°õ¦æ¦¹¤@§@·~ªºÅv­­¡C\n\n¿ù»~ 0x%1¡C" - IDS_WARN_STOPPED "¥Ñ©ó¨Ã¥¼°õ¦æ¡uAFS ¥Î¤áºÝ¡vªA°È¡A¦]¦¹¤w°±¥Îªº±±¨îµLªkÅܧó¡C" - IDS_WARN_ADMIN "¥Ñ©ó±z¥¼¥HºÞ²zªÌªº¨­¥÷µn¤J Windows¡A¦]¦¹¤w°±¥Îªº±±¨îµLªkÅܧó¡C" - IDS_CELL_UNKNOWN "¡]¤£©ú¡^" - IDS_GATEWAY_UNKNOWN "¡]¤£©ú¡^" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADLOOKUP_DESC "Windows §ä¤£¨ì %1 ªººô¸ô¦ì§}¡C½ÐÀˬd±z©ÒÁä¤Jªº¾÷¾¹¦WºÙ¬O§_¥¿½T¡C" - IDS_NEWSUB_DESC "¦b³s±µºô¸ôºÏºÐ¾÷®É¡AAFS µLªk¨Ï¥Î±z©Ò«ü©wªº»¡©ú¡C\n\n©Ò«ü©wªº»¡©ú¤w¥Î©ó¤£¦Pªº AFS¸ô®|¡C" - IDS_BADSUB_DESC "µLªk¨Ï¥Î±z©Ò¿é¤JªººÏºÐ¾÷¥N¸¹»¡©ú¡C\n\nºÏºÐ¾÷¥N¸¹»¡©ú³Ì¦h¤£¯à¶W¹L 12 ­Ó¦r¤¸¡A¦Ó¥B¤£¥i¥]§tªÅ®æ©Î¼ÐÄæ¡C" - IDS_BADGATEWAY_DESC "AFS µLªk©M±z©Ò«ü©wªº¹h¹D¾÷¾¹Ápµ¸¡C\n\n½ÐÀˬd±z©ÒÁä¤Jªº¹h¹D¾÷¾¹¦WºÙ¬O§_¥¿½T¡C" - IDS_BADGWCELL_DESC "§ä¤£¨ì«ü©wªº¹h¹D¾÷¾¹©Ò¨Ï¥Î¤§ AFS Cell ªº¬[ºc¸ê°T¡C\n\n¦pªG±z­n±N¡uAFS ¥Î¤áºÝ¡v¬[ºc¬°·sªº Cell¡A±z¥²¶·¨Ï¥Î¡uAFS Cell¡v¼ÐÅÒ¡A·s¼W¸Ó Cell ªº¬[ºc¸ê°T¡C \n\nCell¡G%1" - IDS_TITLE_CAUTION_NT "ĵ§i - AFS ¥Î¤áºÝ¬[ºc" - IDS_TITLE_CAUTION_95 "ĵ§i - AFS Light ¬[ºc" - IDS_TITLE_ERROR_NT "¿ù»~ - AFS ¥Î¤áºÝ¬[ºc" - IDS_TITLE_ERROR_95 "¿ù»~ - AFS Light ¬[ºc" - IDS_SHRINKCACHE "¡uAFS ¥Î¤áºÝ¡v§Ö¨úªº¤j¤pµLªk¦b¡uAFS ¥Î¤áºÝ¡vªA°È°õ¦æ®É´î¤Ö¡C \n\n¦p­n´î¤Ö§Ö¨úªº¤j¤p¡A­º¥ý¥²¶·¨Ï¥Î¡u¤@¯ë¨Æ¶µ¡v¼ÐÅÒ¤Wªº¡u°±¤îªA°È¡v«ö¶s¡A¨Ó°±¤î¡uAFS ¥Î¤áºÝ¡vªA°È¡C" - IDS_BADCELL_DESC_CC "§ä¤£¨ì±z©Ò¿é¤J¤§¡uAFS Cell¡vªº¬[ºc¸ê°T¡C\n\n+" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STOP_DESC "¦pªG±z°±¤î¡uAFS ¥Î¤áºÝ¡vªA°È¡A´NµLªk±q³o¥x¹q¸£¦s¨úÀx¦s©ó AFS ªºÀɮסC\n\n±z½T©w­n°±¤îªA°È¡H" - IDS_PREFCOL_SERVER "¦øªA¾¹" - IDS_PREFCOL_RANK "µ¥¯Å" - IDS_TIP_PREFS "­n³Z¡G³z¹L AFS Ū¨úÀɮ׮ɡA·|±qµ¥¯Å¼Æ­È¸û§Cªº¦øªA¾¹Àu¥ýŪ°_¡C" - IDS_PREFERROR_RESOLVE "AFS §ä¤£¨ì¦W¬° %1 ªº¦øªA¾¹¡C½Ð½T©w±z©Ò¿é¤Jªº¦øªA¾¹¬O¥¿½Tªº¡C" - IDS_FILTER_TXT "¤å¦rÀÉ (*.TXT);*.TXT;" - IDS_HOSTREM_MANY "±z¤w¿ï¾Ü²¾°£¿ï©w¤§ AFS Cell ªº©Ò¦³Ápµ¸¤H¸ê°T¡C\n\n±z½T©w­n²¾°£³o¨Ç¶µ¥Ø¶Ü¡H" - IDS_HOSTREM_ONE "±z¤w¿ï¾Ü²¾°£ AFS Cell %1 ªº©Ò¦³Ápµ¸¤H¸ê°T¡C\n\n±z½T©w­n²¾°£³o¨Ç¶µ¥Ø¶Ü¡H" - IDS_CELLEDIT_TITLE "%1 - ¤º®e" - IDS_CELLADD_TITLE "·s Cell" - IDS_SVRCOL_SERVER "¦a§}" - IDS_SVRCOL_COMMENT "¦øªA¾¹¦WºÙ" - IDS_TIP_DRIVES "­n³Z¡G±z¥i¥H¤Ä¿ï¹ïÀ³ºÏºÐ¾÷¥N¸¹®Çªº¤è®Ø¡A¥H³s±µºô¸ôºÏºÐ¾÷¡C" - IDS_MAP_LETTER "ºÏºÐ¾÷ *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "ºÏºÐ¾÷ %1: \t%2" - IDS_ERROR_MAP "¹ïÀ³ºô¸ôºÏºÐ¾÷®Éµo¥Í¿ù»~" - IDS_ERROR_MAP_DESC "AFS µLªk¹ïÀ³ºô¸ôºÏºÐ¾÷¨ì AFS ¤Wªº«ü©w¸ô®|¡C½Ð½T©w¥Ø«e¨Ã¥¼¨Ï¥Î¸ÓºÏºÐ¾÷¥N¸¹¡C\n\n¿ù»~¡G 0x%1¡C" - IDS_ERROR_UNMAP "¹ïÀ³ºô¸ôºÏºÐ¾÷®Éµo¥Í¿ù»~" - IDS_ERROR_UNMAP_DESC "AFS µLªk¨ú®ø¹ïÀ³«ü©w«ü©wªººô¸ôºÏºÐ¾÷¡C½Ð½T©w¥Ø«e¨Ã¥¼¨Ï¥Î¸ÓºÏºÐ¾÷¥N¸¹¡C\n\n¿ù»~¡G 0x%1¡C" - IDS_ADDSERVER_TITLE "·s¼W¦øªA¾¹" - IDS_EDITSERVER_TITLE "½s¿è¦øªA¾¹" - IDS_SUBCOL_SHARE "¤l¸Ë¸ü" - IDS_SUBCOL_PATH "AFS ¸ô®|" - IDS_SUBMOUNTS_TITLE "¤l¸Ë¸ü" - IDS_BADCELL_DESC "§ä¤£¨ì±z©Ò¿é¤Jªº¡uAFS Cell¡v¬[ºc¸ê°T¡C\n\n+" - IDS_BADCELL_DESC2 "½ÐÀˬd±z©Ò¿é¤Jªº Cell ¦WºÙ¬O§_¥¿½T¡C¦pªG±z­n±N¡uAFS ¥Î¤áºÝ¡v¬[ºc¬°·sªº Cell¡A±z¥²¶·¨Ï¥Î¡uAFS Cell¡v¼ÐÅÒ¡A¬°¸Ó Cell ·s¼W¬[ºc¸ê°T¡C" - IDS_KB_IN_USE "kb¡]%1 kb ¦b¨Ï¥Î¤¤¡^ " - IDS_NOGATEWAY_TITLE "µL®Äªº AFS ¹h¹D" - IDS_NOGATEWAY_DESC "¥Ñ©ó©|¥¼«ü©w¡uAFS ¹h¹D¡v¡A¦]¦¹±zµLªk¬[ºc¡uAFS Light¡v¡C\n\n½Ð¦b©Ò´£¨Ñªº°Ï°ì¤¤¿é¤J¡uAFS ¹h¹D¡v¦WºÙ©Î IP ¦ì§}¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NOCELL_DESC "¥Ñ©ó©|¥¼«ü©w AFS Cell¡A¦]¦¹±zµLªk¬[ºc¡uAFS ¥Î¤áºÝ¡v¡C \n\n½Ð¦b©Ò´£¨Ñªº°Ï°ì¤¤¿é¤J AFS Cell ¦WºÙ¡C" - IDS_STOPPED_NOCELL "±z¥²¶·¥ý«ü©w AFS Cell¡A¤~¯à±Ò°Ê¡uAFS ¥Î¤áºÝ¡vªA°È¡C" - IDS_OKSTOP_DESC "¥Ø«e¨Ã¥¼°õ¦æ¡uAFS ¥Î¤áºÝ¡vªA°È¡C±z­n±Ò°Ê¡uAFS ¥Î¤áºÝ¡vªA°È¡A¤~¯à±q³o¥x¹q¸£¦s¨úÀx¦s©ó AFS ªºÀɮסC\n\n±z²{¦b­n±Ò°ÊªA°È¶Ü¡H" - IDS_BADMAP_DESC "¥Ñ©ó¸ô®|¦WºÙ¨Ã«D¥H ""\\afs""¬°¶}ÀY¡A¦]¦¹ AFS µLªk±NºÏºÐ¾÷¥N¸¹¹ïÀ³¨ì«ü©w¸ô®|¡C\n\n½Ð½T©w±z©Ò¿é¤Jªº¸ô®|¦WºÙ¶}ÀY¬° ""\\afs""¡AµM«á¦A¸Õ¤@¦¸¡C" - IDS_RESTART_TITLE "AFS ¥Î¤áºÝ¬[ºc" - IDS_RESTART_DESC "±z©Ò°µªº³¡¥÷Åܧ󥲶·¦b°±¤î¡BµM«á­«·s±Ò°Ê¡uAFS ¥Î¤áºÝ¡vªA°È¤§«á¤~·|µo¥Í®Ä¥Î¡C\n\n±z²{¦b­n°±¤î¨Ã­«·s±Ò°ÊªA°È¶Ü¡H" - IDS_KB_ONLY "kb" - IDS_FAILCONFIG_AUTHENT "¦bµn¤J®É¡A©ó¸Õ¹Ï±Ò°Ê©Î°±¥ÎŲ§O®Éµo¥Í¿ù»~¡C\n\n¿ù»~ %1" - IDS_FAILCONFIG_PREFS "µLªk¨Ï¥Î±z©Ò«ü©wªº³¡¥÷¦øªA¾¹µ¥¯ÅÀu¥ý¶¶§Ç¡C\n\n¿ù»~ %1" - IDS_FAILCONFIG_CACHE "µLªk¨Ï¥Î±z©Ò¿é¤Jªº¡uAFS ¥Î¤áºÝ¡v§Ö¨ú¤j¤p¡C\n\n¿ù»~ %1" - IDS_FAILCONFIG_PROBE "µLªk¨Ï¥Î±z©Ò¿é¤Jªº¡uAFS ¥Î¤áºÝ¡v±´°w¶¡¹j¡C\n\n¿ù»~ %1" - IDS_FAILCONFIG_SYSNAME "µLªk¨Ï¥Î±z©Ò¿é¤Jªº¡uAFS ¥Î¤áºÝ¡v¨t²Î¦WºÙ¡C\n\n¿ù»~ %1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADCELL_DESC_CC2 "½ÐÀˬd±z©Ò¿é¤Jªº Cell ¦WºÙ¬O§_¥¿½T¡C¦pªG¥¿½Tªº Cell ¦WºÙ¨Ã¥¼¥X²{¦b¡uAFS Cell¡v²M³æ¤W¡A«h¨Ï¥Î¡u·s¼W¡v«ö¶s¬° Cell «Ø¥ß¤@­Ó¶µ¥Ø¡C" - IDS_NOCELL_DESC_CC "¥Ñ©ó±z©|¥¼«ü©w¹w³]ªº AFS Cell¡A¦]¦¹±zµLªk¬[ºc¡uAFS ±±¨î¤¤¤ß¡v¡C \n\n½Ð¦b©Ò´£¨Ñªº°Ï°ì¤¤¿é¤J AFS Cell ªº¦WºÙ¡C" - IDS_TITLE_CAUTION_CCENTER "ĵ§i - AFS ±±¨î¤¤¤ß¤º®e" - IDS_TITLE_ERROR_CCENTER "¿ù»~ - AFS ±±¨î¤¤¤ß¤º®e" - IDS_TITLE_CCENTER "AFS ±±¨î¤¤¤ß¤º®e" - IDS_YES "¬O" - IDS_NO "§_" - IDS_DRIVE "ºÏºÐ¾÷" -END - -#endif // Chinese (Taiwan) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_config/main.cpp b/src/WINNT/client_config/main.cpp deleted file mode 100644 index ad4255f43..000000000 --- a/src/WINNT/client_config/main.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} - -#include "afs_config.h" -#include "isadmin.h" -#include "tab_general.h" -#include "tab_prefs.h" -#include "tab_hosts.h" -#include "tab_drives.h" -#include "tab_advanced.h" - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -GLOBALS g; - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pCmdLine, int nCmdShow) -{ - TaLocale_LoadCorrespondingModule (hInst); - - // Initialize winsock etc - // - WSADATA Data; - WSAStartup (0x0101, &Data); - - InitCommonControls(); - RegisterCheckListClass(); - RegisterFastListClass(); - RegisterSockAddrClass(); - RegisterSpinnerClass(); - fs_utils_InitMountRoot(); - - // Initialize our global variables and window classes - // - memset (&g, 0x00, sizeof(g)); - g.fIsWinNT = IsWindowsNT(); - g.fIsAdmin = IsAdmin(); - - // Check our command-line options - // - while (pCmdLine && (*pCmdLine=='/' || *pCmdLine=='-')) - { - switch (*(++pCmdLine)) - { - case 'c': - case 'C': - g.fIsCCenter = TRUE; - break; - } - - while (*pCmdLine == ' ') - ++pCmdLine; - } - - // Select an appropriate help file - // - if (g.fIsCCenter) - lstrcpy (g.szHelpFile, TEXT("afs-cc.hlp>dialog")); - else if (g.fIsWinNT) - lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp>dialog")); - else - lstrcpy (g.szHelpFile, TEXT("afs-light.hlp>dialog")); - - // Our main window is actually a tabbed dialog. - // - if ((g.psh = PropSheet_Create (((g.fIsCCenter) ? IDS_TITLE_CCENTER : (g.fIsWinNT) ? IDS_TITLE_NT : IDS_TITLE_95), FALSE, NULL)) == NULL) - return FALSE; - - g.psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button - g.psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead - - if (g.fIsCCenter) - { - PropSheet_AddTab (g.psh, 0, IDD_HOSTS_CCENTER, (DLGPROC)HostsTab_DlgProc, 0, TRUE); - } - else - { - PropSheet_AddTab (g.psh, 0, ((g.fIsWinNT) ? IDD_GENERAL_NT : IDD_GENERAL_95), (DLGPROC)GeneralTab_DlgProc, 0, TRUE); - - PropSheet_AddTab (g.psh, 0, ((g.fIsWinNT) ? IDD_DRIVES_NT : IDD_DRIVES_95), (DLGPROC)DrivesTab_DlgProc, 0, TRUE); - - if (g.fIsWinNT) - PropSheet_AddTab (g.psh, 0, IDD_PREFS_NT, (DLGPROC)PrefsTab_DlgProc, 0, TRUE); - - PropSheet_AddTab (g.psh, 0, ((g.fIsWinNT) ? IDD_HOSTS_NT : IDD_HOSTS_95), (DLGPROC)HostsTab_DlgProc, 0, TRUE); - - if (g.fIsWinNT) - PropSheet_AddTab (g.psh, 0, IDD_ADVANCED_NT, (DLGPROC)AdvancedTab_DlgProc, 0, TRUE); - } - - PropSheet_ShowModal (g.psh); - - return 0; -} - - -void Main_OnInitDialog (HWND hMain) -{ - g.hMain = hMain; - - // Center the window in the display - // - RECT rWindow; - GetWindowRect (g.hMain, &rWindow); - - RECT rDesktop; - SystemParametersInfo (SPI_GETWORKAREA, 0, &rDesktop, 0); - - SetWindowPos (g.hMain, NULL, - rDesktop.left + ((rDesktop.right - rDesktop.left) - (rWindow.right - rWindow.left)) / 2, - rDesktop.top + ((rDesktop.bottom - rDesktop.top) - (rWindow.bottom - rWindow.top)) / 2, - 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - // Remove the Context Help [?] thing from the title bar - // - DWORD dwStyle = GetWindowLong (g.hMain, GWL_STYLE); - dwStyle &= ~DS_CONTEXTHELP; - SetWindowLong (g.hMain, GWL_STYLE, dwStyle); - - dwStyle = GetWindowLong (hMain, GWL_EXSTYLE); - dwStyle &= ~WS_EX_CONTEXTHELP; - SetWindowLong (g.hMain, GWL_EXSTYLE, dwStyle); -} - - -void Main_RefreshAllTabs (void) -{ - for (size_t ii = 0; ii < g.psh->cTabs; ++ii) - { - if (!g.psh->aTabs[ii].dlgproc) - continue; - if (!IsWindow (g.psh->aTabs[ii].hDlg)) - continue; - - CallWindowProc ((WNDPROC)(g.psh->aTabs[ii].dlgproc), g.psh->aTabs[ii].hDlg, WM_COMMAND, IDC_REFRESH, 0); - } -} - - -void Quit (void) -{ - if (IsWindow (g.hMain)) - { - DestroyWindow (g.hMain); - } - PostQuitMessage (0); -} - - -LPCTSTR GetCautionTitle (void) -{ - static TCHAR szTitle[ cchRESOURCE ] = TEXT(""); - if (!szTitle[0]) - GetString (szTitle, (g.fIsCCenter) ? IDS_TITLE_CAUTION_CCENTER : (g.fIsWinNT) ? IDS_TITLE_CAUTION_NT : IDS_TITLE_CAUTION_95); - return szTitle; -} - - -LPCTSTR GetErrorTitle (void) -{ - static TCHAR szTitle[ cchRESOURCE ] = TEXT(""); - if (!szTitle[0]) - GetString (szTitle, (g.fIsCCenter) ? IDS_TITLE_ERROR_CCENTER : (g.fIsWinNT) ? IDS_TITLE_ERROR_NT : IDS_TITLE_ERROR_95); - return szTitle; -} - diff --git a/src/WINNT/client_config/misc.cpp b/src/WINNT/client_config/misc.cpp deleted file mode 100644 index a33e74a52..000000000 --- a/src/WINNT/client_config/misc.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afs_config.h" - - -/* - * REALLOC ____________________________________________________________________ - * - */ - -BOOL AfsConfigReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} - diff --git a/src/WINNT/client_config/pagesize.cpp b/src/WINNT/client_config/pagesize.cpp deleted file mode 100644 index a58fcb7d3..000000000 --- a/src/WINNT/client_config/pagesize.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include "pagesize.h" - - -ULONG ExtractPageSize (LPCTSTR psz) -{ - LPCTSTR pch = &psz[ lstrlen(psz) ]; - while ((pch > psz) && (isdigit(pch[-1]))) - pch--; - return atol(pch); -} - - -ULONG GetPagingSpace (void) -{ - ULONG ckPageSpace = 0; - - HKEY hk; - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS) - { - TCHAR mszData[1024] = TEXT(""); - DWORD dwSize = sizeof(mszData); - DWORD dwType = REG_MULTI_SZ; - - if (RegQueryValueEx (hk, TEXT("PagingFiles"), 0, &dwType, (PBYTE)mszData, &dwSize) == ERROR_SUCCESS) - { - for (LPTSTR psz = mszData; *psz; psz += 1+lstrlen(psz)) - { - ckPageSpace += ExtractPageSize (psz); - } - } - - RegCloseKey (hk); - } - - return ckPageSpace * 1024; -} - diff --git a/src/WINNT/client_config/pagesize.h b/src/WINNT/client_config/pagesize.h deleted file mode 100644 index e4581a047..000000000 --- a/src/WINNT/client_config/pagesize.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef PAGESIZE_H -#define PAGESIZE_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -ULONG GetPagingSpace (void); - - -#endif - diff --git a/src/WINNT/client_config/resource.h b/src/WINNT/client_config/resource.h deleted file mode 100644 index 0b32420d0..000000000 --- a/src/WINNT/client_config/resource.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_TITLE_NT 0 -#define IDS_TITLE_95 1 -#define IDS_STATE_STOPPED 2 -#define IDS_STATE_RUNNING 3 -#define IDS_STATE_STARTING 4 -#define IDS_STATE_STOPPING 5 -#define IDS_STATE_UNKNOWN 6 -#define IDS_SERVICE_FAIL_START 7 -#define IDS_SERVICE_FAIL_STOP 8 -#define IDS_WARN_STOPPED 9 -#define IDS_WARN_ADMIN 10 -#define IDS_CELL_UNKNOWN 11 -#define IDS_GATEWAY_UNKNOWN 12 - -#define IDS_BADLOOKUP_DESC 16 -#define IDS_NEWSUB_DESC 17 -#define IDS_BADSUB_DESC 18 -#define IDS_BADGATEWAY_DESC 19 -#define IDS_BADGWCELL_DESC 20 -#define IDS_TITLE_CAUTION_NT 21 -#define IDS_TITLE_CAUTION_95 22 -#define IDS_TITLE_ERROR_NT 23 -#define IDS_TITLE_ERROR_95 24 -#define IDS_SHRINKCACHE 25 -#define IDS_BADCELL_DESC_CC 26 - -#define IDS_STOP_DESC 32 -#define IDS_PREFCOL_SERVER 33 -#define IDS_PREFCOL_RANK 34 -#define IDS_TIP_PREFS 35 -#define IDS_PREFERROR_RESOLVE 36 -#define IDS_FILTER_TXT 37 -#define IDS_HOSTREM_MANY 38 -#define IDS_HOSTREM_ONE 39 -#define IDS_CELLEDIT_TITLE 40 -#define IDS_CELLADD_TITLE 41 -#define IDS_SVRCOL_SERVER 42 -#define IDS_SVRCOL_COMMENT 43 -#define IDS_TIP_DRIVES 44 -#define IDS_MAP_LETTER 45 - -#define IDS_DRIVE_MAP 48 -#define IDS_ERROR_MAP 49 -#define IDS_ERROR_MAP_DESC 50 -#define IDS_ERROR_UNMAP 51 -#define IDS_ERROR_UNMAP_DESC 52 -#define IDS_ADDSERVER_TITLE 53 -#define IDS_EDITSERVER_TITLE 54 -#define IDS_SUBCOL_SHARE 55 -#define IDS_SUBCOL_PATH 56 -#define IDS_SUBMOUNTS_TITLE 57 -#define IDS_BADCELL_DESC 58 -#define IDS_BADCELL_DESC2 59 -#define IDS_KB_IN_USE 60 -#define IDS_NOGATEWAY_TITLE 61 -#define IDS_NOGATEWAY_DESC 62 - -#define IDS_NOCELL_DESC 64 -#define IDS_STOPPED_NOCELL 65 -#define IDS_OKSTOP_DESC 66 -#define IDS_BADMAP_DESC 67 -#define IDS_RESTART_TITLE 68 -#define IDS_RESTART_DESC 69 -#define IDS_KB_ONLY 70 -#define IDS_FAILCONFIG_AUTHENT 71 -#define IDS_FAILCONFIG_PREFS 72 -#define IDS_FAILCONFIG_CACHE 73 -#define IDS_FAILCONFIG_PROBE 74 -#define IDS_FAILCONFIG_SYSNAME 75 - -#define IDS_BADCELL_DESC_CC2 80 -#define IDS_NOCELL_DESC_CC 81 -#define IDS_TITLE_CAUTION_CCENTER 82 -#define IDS_TITLE_ERROR_CCENTER 83 -#define IDS_TITLE_CCENTER 84 -#define IDS_YES 85 -#define IDS_NO 86 -#define IDS_DRIVE 87 - -#define IDD_GENERAL_NT 101 -#define IDI_MAIN 101 -#define IDD_GENERAL_95 102 -#define IDI_UP 102 -#define IDD_PREFS_NT 103 -#define IDI_DOWN 103 -#define IDD_HOSTS_NT 104 -#define IDD_DRIVES 105 -#define IDD_DRIVES_NT 105 -#define IDD_ADVANCED_NT 106 -#define IDD_PREFS_EDIT 107 -#define IDD_CELL_EDIT 108 -#define IDD_SERVER_EDIT 109 -#define IDD_DRIVE_EDIT 110 -#define IDD_SUBMOUNTS 111 -#define IDD_SUBMOUNT_EDIT 112 -#define IDD_DRIVES_95 113 -#define IDD_HOSTS_95 114 -#define IDD_STARTSTOP 115 -#define IDD_HOSTS_CCENTER 116 -#define IDD_MISC_CONFIG_PARMS 117 -#define IDD_DIAG_PARMS 118 -#define IDD_LOGIN_CONFIG_PARMS 119 -#define IDD_GLOBAL_DRIVES 120 -#define IDD_GLOBAL_DRIVES_ADDEDIT 121 -#define IDD_BINDING_CONFIG_PARAMS 122 -#define IDC_STATUS 1000 -#define IDC_SERVICE_STOP 1001 -#define IDC_SERVICE_START 1002 -#define IDC_CELL 1003 -#define IDC_LOGON 1004 -#define IDC_TRAYICON 1005 -#define IDC_GATEWAY_CONN 1006 -#define IDC_GATEWAY 1007 -#define IDC_SHOW_VLS 1008 -#define IDC_UP 1009 -#define IDC_DOWN 1010 -#define IDC_REMOVE 1011 -#define IDC_EDIT 1012 -#define IDC_ADD 1013 -#define IDC_LIST 1014 -#define IDC_ADVANCED 1015 -#define IDC_IMPORT 1015 -#define IDC_WARN 1016 -#define IDC_CACHE_SIZE 1017 -#define IDC_INUSE 1018 -#define IDC_CHUNK_SIZE 1019 -#define IDC_SHOW_FS 1020 -#define IDC_STAT_ENTRIES 1021 -#define IDC_PROBE 1022 -#define IDC_PROBE2 1023 -#define IDC_LAN_ADAPTER 1023 -#define IDC_THREADS 1024 -#define IDC_DAEMONS 1025 -#define IDC_SYSNAME 1026 -#define IDC_VOLUME 1027 -#define IDC_MOUNTDIR 1028 -#define IDC_REFRESH 1029 -#define IDC_SERVER 1031 -#define IDC_RANK 1032 -#define IDC_COMMENT 1035 -#define IDC_DRIVE 1041 -#define IDC_PATH 1042 -#define IDC_PERSISTENT 1043 -#define IDC_SUBMOUNT 1044 -#define IDC_DESC 1044 -#define IDC_MAPPING 1045 -#define IDC_STARTING 1046 -#define IDC_STOPPING 1047 -#define IDC_CACHE_PATH 1047 -#define IDC_ADDR_SPECIFIC 1048 -#define IDC_MISC_PARMS 1048 -#define IDC_ADDR_LOOKUP 1049 -#define IDC_LOGON_PARMS 1049 -#define IDC_TRACE_LOG_BUF_SIZE 1050 -#define IDC_AUTOMAP_PARMS 1051 -#define IDC_LOGIN_RETRY_INTERVAL 1052 -#define IDC_BINDING_PARMS 1053 -#define IDC_TRAP_ON_PANIC 1054 -#define IDC_REPORT_SESSION_STARTUPS 1055 -#define IDC_FAIL_SILENTLY 1056 -#define IDC_GLOBAL_DRIVE_LIST 1058 -#define IDC_CHANGE 1059 -#define IDC_DIAG_PARMS 1060 -#define IDC_ROOTVOLUME 1061 -#define IDC_AUTOLANA 1062 -#define IDC_DEFAULTNIC 1062 -#define IDC_STATICLANA 1063 -#define IDC_STATICSUBMOUNT 1064 -#define IDC_NICSELECTION 1065 -#define IDC_BINDING_MESSAGE 1066 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 123 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1067 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/client_config/tab_advanced.cpp b/src/WINNT/client_config/tab_advanced.cpp deleted file mode 100644 index 4bd024529..000000000 --- a/src/WINNT/client_config/tab_advanced.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - - #include - -#include "afs_config.h" -#include "tab_advanced.h" -#include "pagesize.h" - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ckCACHE_MIN 1024L // 1MB Cache Minimum -#define ckCACHE_MAX 2097152L // 2GB Cache Maximum (limited by space) - -#define ckCHUNK_MIN 4L -#define ckCHUNK_MAX 1048576L - -#define cSTATS_MIN 256L -#define cSTATS_MAX 10000L - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void AdvancedTab_OnInitDialog (HWND hDlg); -BOOL AdvancedTab_OnApply (HWND hDlg); -void AdvancedTab_OnRefresh (HWND hDlg); - -// From dlg_automap.cpp -extern BOOL CALLBACK AutoMap_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -// From dlg_misc.cpp -extern BOOL Misc_OnApply(); -extern BOOL CALLBACK Misc_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -// From dlg_logon.cpp -extern BOOL CALLBACK Logon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -extern BOOL Logon_OnApply(); - -// From dlg_diag.cpp -extern BOOL CALLBACK Diag_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -extern BOOL Diag_OnApply(); - -// From binding_misc.cpp -extern BOOL Binding_OnApply(); -extern BOOL CALLBACK Binding_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -static DWORD log2 (DWORD dwValue) -{ - for (DWORD dwLog = 0; (DWORD)(1<>= 1; - break; - case SPN_CHANGE: - (*(LPDWORD)lp) = 1 << (log2 (*(LPDWORD)lp)); - break; - } - break; - - case IDHELP: - AdvancedTab_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_NT); - break; - } - - return FALSE; -} - - -void AdvancedTab_OnInitDialog (HWND hDlg) -{ - Config_GetCacheSize (&g.Configuration.ckCache); - Config_GetCachePath (g.Configuration.szCachePath); - Config_GetChunkSize (&g.Configuration.ckChunk); - Config_GetStatEntries (&g.Configuration.cStatEntries); - - ULONG ckCacheMin = ckCACHE_MIN; - ULONG ckCacheMax = ckCACHE_MAX; - - CreateSpinner (GetDlgItem (hDlg, IDC_CACHE_SIZE), 10, FALSE, ckCacheMin, g.Configuration.ckCache, ckCacheMax); - CreateSpinner (GetDlgItem (hDlg, IDC_CHUNK_SIZE), 10, FALSE, ckCHUNK_MIN, g.Configuration.ckChunk, ckCHUNK_MAX); - CreateSpinner (GetDlgItem (hDlg, IDC_STAT_ENTRIES), 10, FALSE, cSTATS_MIN, g.Configuration.cStatEntries, cSTATS_MAX); - - SetDlgItemText (hDlg, IDC_CACHE_PATH, g.Configuration.szCachePath); - SetDlgItemText (hDlg, IDC_SYSNAME, g.Configuration.szSysName); - - AdvancedTab_OnRefresh (hDlg); -} - - -BOOL AdvancedTab_CommitChanges (BOOL fForce) -{ - HWND hDlg; - if ((hDlg = PropSheet_FindTabWindow (g.psh, (DLGPROC)AdvancedTab_DlgProc)) == NULL) - return TRUE; - if (fForce) - SetWindowLong (hDlg, DWL_MSGRESULT, FALSE); // Make sure we try to apply - if (AdvancedTab_OnApply (hDlg)) - return TRUE; - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - return FALSE; -} - - -BOOL AdvancedTab_OnApply (HWND hDlg) -{ - // Don't try to do anything if we've already failed the apply - if (GetWindowLong (hDlg, DWL_MSGRESULT)) - return FALSE; - - ULONG Value = SP_GetPos (GetDlgItem (hDlg, IDC_CACHE_SIZE)); - if (Value != g.Configuration.ckCache) - { - if (!Config_SetCacheSize (Value)) - return FALSE; - g.Configuration.ckCache = Value; - } - - Value = SP_GetPos (GetDlgItem (hDlg, IDC_CHUNK_SIZE)); - if (Value != g.Configuration.ckChunk) - { - if (!Config_SetChunkSize (Value)) - return FALSE; - g.Configuration.ckChunk = Value; - } - - Value = SP_GetPos (GetDlgItem (hDlg, IDC_STAT_ENTRIES)); - if (Value != g.Configuration.cStatEntries) - { - if (!Config_SetStatEntries (Value)) - return FALSE; - g.Configuration.cStatEntries = Value; - } - - TCHAR szText[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_CACHE_PATH, szText, MAX_PATH); - if (lstrcmp (szText, g.Configuration.szCachePath)) - { - if (!Config_SetCachePath (szText)) - return FALSE; - lstrcpy (g.Configuration.szCachePath, szText); - } - - // Save the data from the advanced tab dialogs - if (!Misc_OnApply()) - return FALSE; - - if (!Binding_OnApply()) - return FALSE; - - if (!Logon_OnApply()) - return FALSE; - - if (!Diag_OnApply()) - return FALSE; - - return TRUE; -} - - -void AdvancedTab_OnRefresh (HWND hDlg) -{ - ULONG ckCacheInUse; - if (!Config_GetCacheInUse (&ckCacheInUse)) - ckCacheInUse = 0; - - LPTSTR pszInUse; - if (ckCacheInUse) - pszInUse = FormatString (IDS_KB_IN_USE, TEXT("%ld"), ckCacheInUse); - else - pszInUse = FormatString (IDS_KB_ONLY); - SetDlgItemText (hDlg, IDC_INUSE, pszInUse); - FreeString (pszInUse); -} - diff --git a/src/WINNT/client_config/tab_advanced.h b/src/WINNT/client_config/tab_advanced.h deleted file mode 100644 index ff27126ae..000000000 --- a/src/WINNT/client_config/tab_advanced.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAB_ADVANCED_H -#define TAB_ADVANCED_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK AdvancedTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -BOOL AdvancedTab_CommitChanges (BOOL fForce); - - -#endif - diff --git a/src/WINNT/client_config/tab_drives.cpp b/src/WINNT/client_config/tab_drives.cpp deleted file mode 100644 index 39c56d431..000000000 --- a/src/WINNT/client_config/tab_drives.cpp +++ /dev/null @@ -1,860 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} - -#include "afs_config.h" -#include "tab_drives.h" -#include - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void DrivesTab_OnInitDialog (HWND hDlg); -void DrivesTab_OnSelect (HWND hDlg); -void DrivesTab_OnCheck (HWND hDlg); -void DrivesTab_OnAdd (HWND hDlg); -void DrivesTab_OnEdit (HWND hDlg); -void DrivesTab_OnRemove (HWND hDlg); -void DrivesTab_OnAdvanced (HWND hDlg); - -void DrivesTab_Enable (HWND hDlg); -int DrivesTab_DriveFromItem (HWND hDlg, int iItem); -void DrivesTab_FillList (HWND hDlg); -void DrivesTab_EditMapping (HWND hDlg, int iDrive); - -BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void DriveEdit_OnInitDialog (HWND hDlg); -void DriveEdit_OnOK (HWND hDlg); -void DriveEdit_Enable (HWND hDlg); - -BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Submounts_OnInitDialog (HWND hDlg); -void Submounts_OnApply (HWND hDlg); -void Submounts_OnSelect (HWND hDlg); -void Submounts_OnAdd (HWND hDlg); -void Submounts_OnEdit (HWND hDlg); -void Submounts_OnRemove (HWND hDlg); -void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount); - -BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void SubEdit_OnInitDialog (HWND hDlg); -void SubEdit_OnOK (HWND hDlg); -void SubEdit_Enable (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK DrivesTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - DrivesTab_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_REFRESH: - DrivesTab_Enable (hDlg); - break; - - case IDC_LIST: - if (HIWORD(wp) == LBN_CLICKED) - DrivesTab_OnCheck (hDlg); - else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL)) - DrivesTab_OnSelect (hDlg); - break; - - case IDC_ADD: - DrivesTab_OnAdd (hDlg); - break; - - case IDC_EDIT: - DrivesTab_OnEdit (hDlg); - break; - - case IDC_REMOVE: - DrivesTab_OnRemove (hDlg); - break; - - case IDC_ADVANCED: - DrivesTab_OnAdvanced (hDlg); - break; - - case IDHELP: - DrivesTab_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES); - break; - } - - return FALSE; -} - - -void DrivesTab_OnInitDialog (HWND hDlg) -{ - ShowWindow (GetDlgItem (hDlg, IDC_ADVANCED), g.fIsWinNT); - - DrivesTab_FillList (hDlg); -} - - -void DrivesTab_OnSelect (HWND hDlg) -{ - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_LIST))) - { - UINT iSel = SendDlgItemMessage (hDlg, IDC_LIST, LB_GETCURSEL, 0, 0); - - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (iSel != -1)); - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (iSel != -1)); - } -} - - -void DrivesTab_OnCheck (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel); - BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0); - - if (iDriveSel != -1) - { - DWORD dwStatus; - if (fChecked && g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0] && !g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive) - { - if (!ActivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping, g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szSubmount, g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fPersistent, &dwStatus)) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus); - DrivesTab_FillList (hDlg); - } - else if (!fChecked && g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive) - { - if (!InactivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, &dwStatus)) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus); - DrivesTab_FillList (hDlg); - } - WriteActiveMap(g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, fChecked && - g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fPersistent ); - - } -} - - -void DrivesTab_OnAdd (HWND hDlg) -{ - DrivesTab_EditMapping (hDlg, -1); -} - - -void DrivesTab_OnEdit (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel); - - DrivesTab_EditMapping (hDlg, iDriveSel); -} - - -void DrivesTab_OnRemove (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel); - - if (iDriveSel != -1) - { - if (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0]) - { - if (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive) - { - DWORD dwStatus; - if (!InactivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, &dwStatus)) - { - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus); - return; - } - } - g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0'); - WriteDriveMappings (&g.Configuration.NetDrives); - - DrivesTab_FillList (hDlg); - } - WriteActiveMap(g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, FALSE ); - } -} - - -void DrivesTab_OnAdvanced (HWND hDlg) -{ - TCHAR szTitle[ cchRESOURCE ]; - GetString (szTitle, IDS_SUBMOUNTS_TITLE); - - LPPROPSHEET psh = PropSheet_Create (szTitle, FALSE, GetParent(hDlg), 0); - psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button - psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead - PropSheet_AddTab (psh, szTitle, IDD_SUBMOUNTS, (DLGPROC)Submounts_DlgProc, 0, TRUE); - PropSheet_ShowModal (psh); -} - - -void DrivesTab_Enable (HWND hDlg) -{ - BOOL fRunning = (Config_GetServiceState() == SERVICE_RUNNING); - - EnableWindow (GetDlgItem (hDlg, IDC_LIST), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_ADD), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fRunning); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, (fRunning) ? IDS_TIP_DRIVES : IDS_WARN_STOPPED); - SetDlgItemText (hDlg, IDC_WARN, szText); -} - - -int DrivesTab_DriveFromItem (HWND hDlg, int iItem) -{ - TCHAR szItem[ 1024 ] = TEXT(""); - SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem); - - LPTSTR pch; - if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL) - { - if (pch > szItem) - { - pch--; - if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z'))) - return (*pch) - TEXT('A'); - } - } - - return -1; -} - - -void DrivesTab_FillList (HWND hDlg) -{ - FreeDriveMapList (&g.Configuration.NetDrives); - QueryDriveMapList (&g.Configuration.NetDrives); - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel); - SendMessage (hList, WM_SETREDRAW, FALSE, 0); - SendMessage (hList, LB_RESETCONTENT, 0, 0); - - iItemSel = -1; - - for (int iDrive = 0; iDrive < 26; ++iDrive) - { - if (!g.Configuration.NetDrives.aDriveMap[ iDrive ].szMapping[0]) - continue; - - TCHAR szAfsPath[ MAX_PATH ]; - AdjustAfsPath (szAfsPath, g.Configuration.NetDrives.aDriveMap[ iDrive ].szMapping, TRUE, FALSE); - - LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), g.Configuration.NetDrives.aDriveMap[ iDrive ].chDrive, szAfsPath); - int iItem = SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz); - SendMessage (hList, LB_SETITEMDATA, iItem, g.Configuration.NetDrives.aDriveMap[ iDrive ].fActive); - - if (iDrive == iDriveSel) - iItemSel = iItem; - } - - SendMessage (hList, WM_SETREDRAW, TRUE, 0); - if (iItemSel != -1) - SendMessage (hList, LB_SETCURSEL, iItemSel, 0); - - DrivesTab_Enable (hDlg); - DrivesTab_OnSelect (hDlg); -} - - -void DrivesTab_EditMapping (HWND hDlg, int iDrive) -{ - DRIVEMAP DriveMapOrig; - memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP)); - - if (iDrive != -1) - { - memcpy (&DriveMapOrig, &g.Configuration.NetDrives.aDriveMap[ iDrive ], sizeof(DRIVEMAP)); - } - - DRIVEMAP DriveMap; - memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP)); - - if (ModalDialogParam (IDD_DRIVE_EDIT, GetParent(hDlg), (DLGPROC)DriveEdit_DlgProc, (LPARAM)&DriveMap) == IDOK) - { - TCHAR szAfsPathOrig[ MAX_PATH ] = TEXT(""); - if (iDrive != -1) - AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE); - - TCHAR szAfsPathNew[ MAX_PATH ]; - AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE); - - if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) || - (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) || - (DriveMapOrig.chDrive != DriveMap.chDrive) || - (DriveMapOrig.fPersistent != DriveMap.fPersistent) ) - { - DWORD dwStatus; - - if ((iDrive != -1) && (DriveMapOrig.fActive)) - { - if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus)) - { - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus); - DrivesTab_FillList (hDlg); - return; - } - } - - if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus)) - { - Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus); - DrivesTab_FillList (hDlg); - return; - } - - if (DriveMap.szSubmount[0]) - { - TCHAR szSubmountNow[ MAX_PATH ]; - if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow)) - { - if (lstrcmpi (DriveMap.szSubmount, szSubmountNow)) - Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC); - } - } - - if (iDrive != -1) - memset (&g.Configuration.NetDrives.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP)); - memcpy (&g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP)); - lstrcpy (g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew); - WriteDriveMappings (&g.Configuration.NetDrives); - - if (iDrive == -1) { - WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent); - } else if ( (chDRIVE_A + iDrive) != DriveMap.chDrive ) { - WriteActiveMap(chDRIVE_A+iDrive, FALSE); - WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent); - } - - DrivesTab_FillList (hDlg); - } - } -} - - -BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - DriveEdit_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - DriveEdit_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_PATH: - DriveEdit_Enable (hDlg); - break; - - case IDHELP: - DriveEdit_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES_ADDEDIT); - break; - } - return FALSE; -} - -void DriveEdit_OnInitDialog (HWND hDlg) -{ - PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER); - - // Fill in the combo box - // - DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used - - if (pMap->chDrive != 0) - dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) ); - - int iItemSel = -1; - HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE); - SendMessage (hCombo, WM_SETREDRAW, FALSE, 0); - - for (int ii = 0; ii < 26; ++ii) - { - if (!(dwDrives & (1<chDrive && (ii == pMap->chDrive - chDRIVE_A)) - iItemSel = iItem; - else if ((!pMap->chDrive) && (iItemSel == -1)) - iItemSel = iItem; - } - } - - SendMessage (hCombo, WM_SETREDRAW, TRUE, 0); - SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0); - - TCHAR szMapping[ MAX_PATH ]; - AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE); - - CHAR msg[256], msgf[256]; - if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0) - { - wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root); - SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf); - } - SetDlgItemText (hDlg, IDC_PATH, szMapping); - SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount); - - CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent)); - - DriveEdit_Enable (hDlg); -} - - -void DriveEdit_OnOK (HWND hDlg) -{ - PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER); - - int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0); - int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0); - - pMap->chDrive = chDRIVE_A + iDrive; - GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH); - GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH); - pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT); - - if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount)) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC); - return; - } - - if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) && - (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) ) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC); - return; - } - - EndDialog (hDlg, IDOK); -} - - -void DriveEdit_Enable (HWND hDlg) -{ - TCHAR szPath[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH); - EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0'))); -} - - -BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Submounts_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - Submounts_OnApply (hDlg); - break; - - case IDC_ADD: - Submounts_OnAdd (hDlg); - break; - - case IDC_EDIT: - Submounts_OnEdit (hDlg); - break; - - case IDC_REMOVE: - Submounts_OnRemove (hDlg); - break; - - case IDHELP: - Submounts_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - Submounts_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT))) - Submounts_OnEdit (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Submounts_OnInitDialog (HWND hDlg) -{ - // Prepare the columns on the server list - // - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - FASTLISTCOLUMN Column; - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 100; - GetString (Column.szText, IDS_SUBCOL_SHARE); - FastList_SetColumn (hList, 0, &Column); - - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 200; - GetString (Column.szText, IDS_SUBCOL_PATH); - FastList_SetColumn (hList, 1, &Column); - - // Remove the Context Help [?] thing from the title bar - // - DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE); - dwStyle &= ~DS_CONTEXTHELP; - SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle); - - dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE); - dwStyle &= ~WS_EX_CONTEXTHELP; - SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle); - - // Fill in the list of submounts - // - FastList_Begin (hList); - - for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii) - { - if (!g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount[0]) - continue; - - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(FASTLISTADDITEM)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - ai.pszText = g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount; - ai.lParam = 0; - HLISTITEM hItem = FastList_AddItem (hList, &ai); - - TCHAR szMapping[ MAX_PATH ]; - AdjustAfsPath (szMapping, g.Configuration.NetDrives.aSubmounts[ ii ].szMapping, TRUE, FALSE); - FastList_SetItemText (hList, hItem, 1, szMapping); - } - - FastList_End (hList); - Submounts_OnSelect (hDlg); -} - - -void Submounts_OnApply (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - // Remove our current list of submounts - // - for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii) - { - RemoveSubMount (g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount); - } - - // Add back all our new submounts - // - HLISTITEM hItem; - for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) - { - LPCTSTR pszSubmount; - if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL) - continue; - LPCTSTR pszMapping; - if ((pszMapping = FastList_GetItemText (hList, hItem, 1)) == NULL) - continue; - - AddSubMount ((LPTSTR)pszSubmount, (LPTSTR)pszMapping); - } - - FreeDriveMapList (&g.Configuration.NetDrives); - QueryDriveMapList (&g.Configuration.NetDrives); - if (g.Configuration.fLogonAuthent) - DoMapShareChange(); -} - - -void Submounts_OnSelect (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - size_t cSelected = 0; - size_t cSelectedInUse = 0; - - HLISTITEM hItem; - for (hItem = FastList_FindFirstSelected (hList); hItem; hItem = FastList_FindNextSelected (hList, hItem)) - { - cSelected++; - - LPCTSTR pszSubmount; - if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) != NULL) - { - for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii) - { - if (!lstrcmpi (pszSubmount, g.Configuration.NetDrives.aSubmounts[ii].szSubmount)) - { - if (g.Configuration.NetDrives.aSubmounts[ii].fInUse) - cSelectedInUse++; - } - } - } - } - - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (cSelected != 0) && (!cSelectedInUse)); - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (cSelected == 1) && (!cSelectedInUse)); -} - - -void Submounts_OnAdd (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - SUBMOUNT Submount; - memset (&Submount, 0x00, sizeof(Submount)); - - Submounts_EditSubmount (hDlg, &Submount); -} - - -void Submounts_OnEdit (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - HLISTITEM hItem; - if ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - LPCTSTR pszSubmount = FastList_GetItemText (hList, hItem, 0); - LPCTSTR pszMapping = FastList_GetItemText (hList, hItem, 1); - - SUBMOUNT Submount; - memset (&Submount, 0x00, sizeof(Submount)); - lstrcpy (Submount.szSubmount, pszSubmount); - lstrcpy (Submount.szMapping, pszMapping); - - Submounts_EditSubmount (hDlg, &Submount); - } -} - -// Action - On Remove submount item - -void Submounts_OnRemove (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - FastList_Begin (hList); - - HLISTITEM hItem; - while ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - FastList_RemoveItem (hList, hItem); - } - - FastList_End (hList); -} - - -// Action - On Add or On Edit a submount item -void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount) -{ - TCHAR szOrigSubmount[MAX_PATH]; - _tcscpy(szOrigSubmount, pSubmount->szSubmount); - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - if (ModalDialogParam (IDD_SUBMOUNT_EDIT, GetParent(hDlg), (DLGPROC)SubEdit_DlgProc, (LPARAM)pSubmount) == IDOK) - { - TCHAR szMapping[ MAX_PATH ]; - BOOL bNameChange = (szOrigSubmount[0] && _tcsicmp(szOrigSubmount, pSubmount->szSubmount)); - - AdjustAfsPath (szMapping, pSubmount->szMapping, TRUE, FALSE); - - HLISTITEM hItem; - - if ( bNameChange ) { - for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) - { - LPCTSTR pszSubmount; - if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL) - continue; - - if (!_tcsicmp(szOrigSubmount, pszSubmount) ) { - FastList_RemoveItem (hList, hItem); - break; - } - } - } - - for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) - { - LPCTSTR pszSubmount; - if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL) - continue; - - if (!_tcsicmp(pszSubmount, pSubmount->szSubmount)) - break; - } - - if (!hItem) - { - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(FASTLISTADDITEM)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - ai.pszText = pSubmount->szSubmount; - ai.lParam = 0; - hItem = FastList_AddItem (hList, &ai); - } - - FastList_SetItemText (hList, hItem, 1, szMapping); - } -} - - -BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - SubEdit_OnInitDialog (hDlg); - SubEdit_Enable (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - SubEdit_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_SUBMOUNT: - case IDC_MAPPING: - SubEdit_Enable (hDlg); - break; - - case IDHELP: - SubEdit_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT_ADDEDIT); - break; - } - - return 0; -} - - -void SubEdit_OnInitDialog (HWND hDlg) -{ - CHAR msg[256], msgf[256]; - PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLong (hDlg, DWL_USER); - if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0) - { - wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root); - SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf); - } - - SetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount); - - SetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping); -} - - -void SubEdit_OnOK (HWND hDlg) -{ - PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLong (hDlg, DWL_USER); - GetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount, MAX_PATH); - GetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping, MAX_PATH); - EndDialog (hDlg, IDOK); -} - - -void SubEdit_Enable (HWND hDlg) -{ - BOOL fEnable = TRUE; - - TCHAR szText[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_SUBMOUNT, szText, MAX_PATH); - if (!szText[0]) - fEnable = FALSE; - - GetDlgItemText (hDlg, IDC_MAPPING, szText, MAX_PATH); - if (!szText[0]) - fEnable = FALSE; - - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - diff --git a/src/WINNT/client_config/tab_drives.h b/src/WINNT/client_config/tab_drives.h deleted file mode 100644 index fbaf62fdf..000000000 --- a/src/WINNT/client_config/tab_drives.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAB_DRIVES_H -#define TAB_DRIVES_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK DrivesTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/client_config/tab_general.cpp b/src/WINNT/client_config/tab_general.cpp deleted file mode 100644 index 450ad7d70..000000000 --- a/src/WINNT/client_config/tab_general.cpp +++ /dev/null @@ -1,784 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -#include -} - -#include "afs_config.h" -#include "tab_general.h" -#include "tab_hosts.h" -#include "tab_advanced.h" - -#include "drivemap.h" -#include - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct l - { - BOOL fWarnIfStopped; - BOOL fWarnIfNotStopped; - BOOL fRestartIfStopped; - BOOL fServiceIsRunning; - BOOL fStarting; - HWND hStatus; - } l; - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_TIMER 0 - -#define cmsecIDLE_REFRESH 10000 -#define cmsecFAST_REFRESH 1000 - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void GeneralTab_OnInitDialog (HWND hDlg); -void GeneralTab_OnTimer (HWND hDlg); -BOOL GeneralTab_OnApply (HWND hDlg, BOOL fForce, BOOL fComplainIfInvalid); -void GeneralTab_OnRefresh (HWND hDlg, BOOL fRequery); -void GeneralTab_OnStartStop (HWND hDlg, BOOL fStart); -void GeneralTab_OnConnect (HWND hDlg); -void GeneralTab_OnGateway (HWND hDlg); -void GeneralTab_OnCell (HWND hDlg); - -void GeneralTab_DoStartStop (HWND hDlg, BOOL fStart, BOOL fRestart); -void GeneralTab_FixRefreshTimer (HWND hDlg, UINT cmsec = 0); -DWORD GeneralTab_GetDisplayState (HWND hDlg); -void GeneralTab_ShowCurrentState (HWND hDlg); -BOOL GeneralTab_AskIfStopped (HWND hDlg); - -BOOL fIsCellInCellServDB (LPCTSTR pszCell); - -BOOL CALLBACK Status_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Status_OnRefresh (HWND hDlg); - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK GeneralTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Main_OnInitDialog (GetParent(hDlg)); - GeneralTab_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - GeneralTab_FixRefreshTimer (hDlg, 0); - break; - - case WM_TIMER: - GeneralTab_OnTimer (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - if (!GeneralTab_OnApply (hDlg, FALSE, TRUE)) - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - else if (g.fIsWinNT && !GeneralTab_AskIfStopped (hDlg)) - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - break; - - case IDC_REFRESH: - GeneralTab_OnRefresh (hDlg, FALSE); - break; - - case IDC_SERVICE_START: - GeneralTab_OnStartStop (hDlg, TRUE); - break; - - case IDC_SERVICE_STOP: - GeneralTab_OnStartStop (hDlg, FALSE); - break; - - case IDC_GATEWAY_CONN: - GeneralTab_OnConnect (hDlg); - break; - - case IDC_GATEWAY: - GeneralTab_OnGateway (hDlg); - break; - - case IDC_CELL: - GeneralTab_OnCell (hDlg); - break; - - case IDHELP: - GeneralTab_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - if (g.fIsWinNT) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_NT); - else - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_95); - break; - } - - return FALSE; -} - - -void GeneralTab_OnInitDialog (HWND hDlg) -{ - DWORD CurrentState = Config_GetServiceState(); - BOOL fNeedFastRefresh = ((CurrentState == SERVICE_STOPPED) || (CurrentState == SERVICE_RUNNING)) ? FALSE : TRUE; - GeneralTab_FixRefreshTimer (hDlg, ((fNeedFastRefresh) ? cmsecFAST_REFRESH : cmsecIDLE_REFRESH)); - GeneralTab_OnTimer (hDlg); - GeneralTab_OnRefresh (hDlg, TRUE); -} - - -BOOL GeneralTab_VerifyCell (HWND hDlg, BOOL fComplainIfInvalid, LPCTSTR pszCell) -{ - TCHAR szNoCell[ cchRESOURCE ]; - GetString (szNoCell, IDS_CELL_UNKNOWN); - - TCHAR szCell[ cchRESOURCE ]; - if (pszCell) - lstrcpy (szCell, pszCell); - else - GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE); - if ((!szCell[0]) || (!lstrcmpi (szNoCell, szCell))) - { - if (fComplainIfInvalid) - { - if (g.fIsWinNT) - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_NOCELL_DESC); - else - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADGATEWAY_DESC); - } - return FALSE; - } - - if (!fIsCellInCellServDB (szCell)) - { - if (fComplainIfInvalid) - { - if (g.fIsWinNT) - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADCELL_DESC); - else - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADGWCELL_DESC, TEXT("%s"), szCell); - } - return FALSE; - } - - return TRUE; -} - - -BOOL GeneralTab_VerifyOK (HWND hDlg, BOOL fComplainIfInvalid) -{ - // If it's Windows 95, make sure there's a valid Gateway entry - // - if (!g.fIsWinNT) - { - TCHAR szGateway[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_GATEWAY, szGateway, cchRESOURCE); - if (!szGateway[0]) - { - if (fComplainIfInvalid) - Message (MB_ICONASTERISK | MB_OK, IDS_NOGATEWAY_TITLE, IDS_NOGATEWAY_DESC); - return FALSE; - } - } - - // Make sure the cell is in our CellServDB. - // - if (g.fIsWinNT) - { - if (!GeneralTab_VerifyCell (hDlg, fComplainIfInvalid, NULL)) - return FALSE; - } - - return TRUE; -} - -BOOL GeneralTab_OnApply (HWND hDlg, BOOL fForce, BOOL fComplainIfInvalid) -{ - if (!fForce) - { - // Don't try to do anything if we've already failed the apply - if (GetWindowLong (hDlg, DWL_MSGRESULT)) - return FALSE; - } - - // If the user has changed CellServDB, configuration parameters for - // the driver or anything else, we want to commit those changes first. - // We *won't* commit server prefs changes yet, because we haven't yet - // checked to see if the service is running. - // - if (!HostsTab_CommitChanges (fForce)) - return FALSE; - - if (!AdvancedTab_CommitChanges (fForce)) - return FALSE; - - if (!GeneralTab_VerifyOK (hDlg, fComplainIfInvalid)) - return FALSE; - - TCHAR szText[ MAX_PATH ]; - - if (g.fIsWinNT) - { - GetDlgItemText (hDlg, IDC_CELL, szText, MAX_PATH); - if (lstrcmpi (szText, g.Configuration.szCell)) - { - if (!Config_SetCellName (szText)) - return FALSE; - lstrcpy (g.Configuration.szCell, szText); - } - } - - BOOL fLogonAuthent = IsDlgButtonChecked (hDlg, IDC_LOGON); - if (fLogonAuthent != g.Configuration.fLogonAuthent) - { - SetBitLogonOption(fLogonAuthent,LOGON_OPTION_INTEGRATED); - g.Configuration.fLogonAuthent = fLogonAuthent; - } - - Config_SetTrayIconFlag (IsDlgButtonChecked (hDlg, IDC_TRAYICON)); - - if (g.fIsWinNT) - { - BOOL fBeGateway = IsDlgButtonChecked (hDlg, IDC_GATEWAY); - if (fBeGateway != g.Configuration.fBeGateway) - { - if (!Config_SetGatewayFlag (fBeGateway)) - return FALSE; - g.fNeedRestart = TRUE; - g.Configuration.fBeGateway = fBeGateway; - } - } - else // (!g.fIsWinNT) - { - GetDlgItemText (hDlg, IDC_GATEWAY, szText, MAX_PATH); - if (lstrcmpi (szText, g.Configuration.szGateway)) - { - TCHAR szNewCell[ MAX_PATH ]; - if (!Config_ContactGateway (szText, szNewCell)) - { - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADGATEWAY_DESC); - return FALSE; - } - - if (!GeneralTab_VerifyCell (hDlg, fComplainIfInvalid, szNewCell)) - return FALSE; - - if (!Config_SetGatewayName (szText)) - return FALSE; - - if (!Config_SetCellName (szNewCell)) - return FALSE; - - Config_FixGatewayDrives(); - - SetDlgItemText (hDlg, IDC_CELL, szNewCell); - lstrcpy (g.Configuration.szGateway, szText); - lstrcpy (g.Configuration.szCell, szNewCell); - - GeneralTab_OnGateway (hDlg); - } - } - - return TRUE; -} - - -void GeneralTab_OnRefresh (HWND hDlg, BOOL fRequery) -{ - // If necessary, update any fields in g.Configuration that we care about - // - if (fRequery) - { - if (g.fIsWinNT) - Config_GetGatewayFlag (&g.Configuration.fBeGateway); - else - Config_GetGatewayName (g.Configuration.szGateway); - - Config_GetCellName (g.Configuration.szCell); - g.Configuration.fLogonAuthent=RWLogonOption(TRUE,LOGON_OPTION_INTEGRATED); - Config_GetTrayIconFlag (&g.Configuration.fShowTrayIcon); - - if (!g.fIsWinNT) - SetDlgItemText (hDlg, IDC_GATEWAY, g.Configuration.szGateway); - else - CheckDlgButton (hDlg, IDC_GATEWAY, g.Configuration.fBeGateway); - - SetDlgItemText (hDlg, IDC_CELL, g.Configuration.szCell); - CheckDlgButton (hDlg, IDC_LOGON, g.Configuration.fLogonAuthent); - CheckDlgButton (hDlg, IDC_TRAYICON, g.Configuration.fShowTrayIcon); - } - - // Update our display of the service's status - // - DWORD CurrentState = Config_GetServiceState(); - BOOL fIfServiceStopped = !(g.fIsWinNT && !g.fIsAdmin); - BOOL fIfServiceRunning = fIfServiceStopped && (CurrentState == SERVICE_RUNNING); - - GeneralTab_ShowCurrentState (hDlg); - - EnableWindow (GetDlgItem (hDlg, IDC_CELL), fIfServiceStopped && g.fIsWinNT); - - EnableWindow (GetDlgItem (hDlg, IDC_LOGON), fIfServiceStopped); - EnableWindow (GetDlgItem (hDlg, IDC_GATEWAY), fIfServiceStopped); - - // Update our warning. Note that under WinNT, this tab doesn't have any - // controls (other than Start Service) which disable just because the - // service isn't running...so don't show that warning in that case. - // - TCHAR szText[ cchRESOURCE ]; - if ((!g.fIsWinNT) && (CurrentState != SERVICE_RUNNING)) - { - GetString (szText, IDS_WARN_STOPPED); - SetDlgItemText (hDlg, IDC_WARN, szText); - ShowWindow (GetDlgItem (hDlg, IDC_WARN), SW_SHOW); - } - else if (g.fIsWinNT && !g.fIsAdmin) - { - GetString (szText, IDS_WARN_ADMIN); - SetDlgItemText (hDlg, IDC_WARN, szText); - ShowWindow (GetDlgItem (hDlg, IDC_WARN), SW_SHOW); - } - else // ((CurrentState == SERVICE_RUNNING) && (g.fIsAdmin)) - { - ShowWindow (GetDlgItem (hDlg, IDC_WARN), SW_HIDE); - } - - GeneralTab_OnGateway (hDlg); - - // If the service isn't running/stopped, we may need to complain - // - if ((CurrentState == SERVICE_RUNNING) && (l.fWarnIfNotStopped)) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_SERVICE_FAIL_STOP, TEXT("%08lX"), ERROR_SERVICE_SPECIFIC_ERROR); - } - else if ((CurrentState == SERVICE_STOPPED) && (l.fWarnIfStopped)) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_SERVICE_FAIL_START, TEXT("%08lX"), ERROR_SERVICE_SPECIFIC_ERROR); - } - - if ((CurrentState == SERVICE_RUNNING) || (CurrentState == SERVICE_STOPPED)) - { - BOOL fRestart = ((CurrentState == SERVICE_STOPPED) && (l.fRestartIfStopped)); - l.fWarnIfStopped = FALSE; - l.fWarnIfNotStopped = FALSE; - l.fRestartIfStopped = FALSE; - l.fServiceIsRunning = (CurrentState == SERVICE_RUNNING); - - if (fRestart) - { - GeneralTab_DoStartStop (hDlg, TRUE, FALSE); - } - } -} - - -void GeneralTab_OnTimer (HWND hDlg) -{ - DWORD CurrentState = Config_GetServiceState(); - DWORD DisplayState = GeneralTab_GetDisplayState(hDlg); - TestAndDoMapShare(CurrentState); //Re map mounted drives if necessary - - BOOL fInEndState = ((CurrentState == SERVICE_RUNNING) || (CurrentState == SERVICE_STOPPED)); - if (fInEndState && l.hStatus) - { - if (IsWindow (l.hStatus)) - DestroyWindow (l.hStatus); - l.hStatus = NULL; - } - else if (!fInEndState && !l.hStatus) - { - l.hStatus = ModelessDialog (IDD_STARTSTOP, GetParent (hDlg), (DLGPROC)Status_DlgProc); - } - - if (CurrentState != DisplayState) - { - GeneralTab_OnRefresh (hDlg, FALSE); - Main_RefreshAllTabs(); - - if (l.hStatus && IsWindow (l.hStatus)) - PostMessage (l.hStatus, WM_COMMAND, IDINIT, 0); - } - - BOOL fNeedFastRefresh = ((CurrentState == SERVICE_STOPPED) || (CurrentState == SERVICE_RUNNING)) ? FALSE : TRUE; - BOOL fHaveFastRefresh = ((DisplayState == SERVICE_STOPPED) || (DisplayState == SERVICE_RUNNING)) ? FALSE : TRUE; - - if (fNeedFastRefresh != fHaveFastRefresh) - { - GeneralTab_FixRefreshTimer (hDlg, ((fNeedFastRefresh) ? cmsecFAST_REFRESH : cmsecIDLE_REFRESH)); - } -} - - -void GeneralTab_OnStartStop (HWND hDlg, BOOL fStart) -{ - BOOL fSuccess = FALSE; - ULONG error = 0; - - // Don't let the user stop the service on a whim; warn him first - // - if (!fStart) - { - if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_STOP_DESC) != IDOK) - return; - } - - // To start the service, we'll need to successfully commit our new - // configuration. To stop the service, we'll *try*, but it's not - // fatal if something goes wrong. - // - if (!GeneralTab_OnApply (hDlg, TRUE, ((fStart) ? TRUE : FALSE))) - { - if (fStart) - return; - } - - // Okay, start the service - // - GeneralTab_DoStartStop (hDlg, fStart, FALSE); -} - - -void GeneralTab_OnConnect (HWND hDlg) -{ - if (!GeneralTab_OnApply (hDlg, TRUE, TRUE)) - return; - GeneralTab_OnGateway (hDlg); - GeneralTab_OnApply (hDlg, TRUE, TRUE); -} - - -void GeneralTab_OnGateway (HWND hDlg) -{ - if (!g.fIsWinNT) - { - TCHAR szGateway[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_GATEWAY, szGateway, cchRESOURCE); - - BOOL fEnable = TRUE; - if (!szGateway[0]) - fEnable = FALSE; - if (!lstrcmpi (szGateway, g.Configuration.szGateway)) - fEnable = FALSE; - EnableWindow (GetDlgItem (hDlg, IDC_GATEWAY_CONN), fEnable); - } -} - - -void GeneralTab_OnCell (HWND hDlg) -{ - if (g.fIsWinNT) - { - GeneralTab_ShowCurrentState (hDlg); - } -} - - -void GeneralTab_FixRefreshTimer (HWND hDlg, UINT cmsec) -{ - static BOOL fTimerActive = FALSE; - if (fTimerActive) - { - KillTimer (hDlg, ID_TIMER); - fTimerActive = FALSE; - } - - if (g.fIsWinNT && (cmsec != 0)) - { - SetTimer (hDlg, ID_TIMER, cmsec, NULL); - } -} - - -DWORD GeneralTab_GetDisplayState (HWND hDlg) -{ - TCHAR szText[ cchRESOURCE ]; - TCHAR szTextNow[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_STATUS, szTextNow, cchRESOURCE); - - GetString (szText, IDS_STATE_STOPPED); - if (!lstrcmpi (szTextNow, szText)) - return SERVICE_STOPPED; - - GetString (szText, IDS_STATE_RUNNING); - if (!lstrcmpi (szTextNow, szText)) - return SERVICE_RUNNING; - - GetString (szText, IDS_STATE_STARTING); - if (!lstrcmpi (szTextNow, szText)) - return SERVICE_START_PENDING; - - GetString (szText, IDS_STATE_STOPPING); - if (!lstrcmpi (szTextNow, szText)) - return SERVICE_STOP_PENDING; - - return 0; -} - - -void GeneralTab_ShowCurrentState (HWND hDlg) -{ - TCHAR szNoCell[ cchRESOURCE ]; - GetString (szNoCell, IDS_CELL_UNKNOWN); - - TCHAR szCell[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE); - - BOOL fValidCell = TRUE; - if (!szCell[0]) - fValidCell = FALSE; - if (!lstrcmpi (szCell, szNoCell)) - fValidCell = FALSE; - - DWORD CurrentState = Config_GetServiceState(); - - TCHAR szText[ cchRESOURCE ]; - switch (CurrentState) - { - case SERVICE_STOPPED: - GetString (szText, (fValidCell) ? IDS_STATE_STOPPED : IDS_STOPPED_NOCELL); - break; - case SERVICE_RUNNING: - GetString (szText, IDS_STATE_RUNNING); - break; - case SERVICE_START_PENDING: - GetString (szText, IDS_STATE_STARTING); - break; - case SERVICE_STOP_PENDING: - GetString (szText, IDS_STATE_STOPPING); - break; - default: - GetString (szText, IDS_STATE_UNKNOWN); - break; - } - SetDlgItemText (hDlg, IDC_STATUS, szText); - - // Enable or disable controls as necessary - // - BOOL fIfServiceStopped = !(g.fIsWinNT && !g.fIsAdmin); - BOOL fIfServiceRunning = fIfServiceStopped && (CurrentState == SERVICE_RUNNING); - - EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_START), ((CurrentState == SERVICE_STOPPED) && (g.fIsAdmin) && (fValidCell))); - EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_STOP), ((CurrentState == SERVICE_RUNNING) && (g.fIsAdmin))); -} - - -BOOL GeneralTab_AskIfStopped (HWND hDlg) -{ - BOOL fStopService = FALSE; - BOOL fStartService = FALSE; - - // If we changed things, ask if we should restart the service. - // Otherwise, if it's stopped, ask the user if we should start the service. - // - DWORD CurrentState = Config_GetServiceState(); - if (g.fIsAdmin) - { - if ((CurrentState == SERVICE_RUNNING) && (g.fNeedRestart)) - { - if (Message (MB_YESNO | MB_ICONQUESTION, IDS_RESTART_TITLE, IDS_RESTART_DESC) == IDYES) - { - fStopService = TRUE; - fStartService = TRUE; - } - } - if (CurrentState == SERVICE_STOPPED) - { - if (Message (MB_YESNO | MB_ICONQUESTION, GetCautionTitle(), IDS_OKSTOP_DESC) == IDYES) - { - fStartService = TRUE; - } - } - } - - // If we need to, start or stop-n-restart the service - // - if (fStartService && fStopService) - { - GeneralTab_DoStartStop (hDlg, FALSE, TRUE); // Stop and restart the thing - } - else if (fStartService && !fStopService) - { - GeneralTab_DoStartStop (hDlg, TRUE, FALSE); // Just start it - } - - if (fStartService) - { - while ( (l.fRestartIfStopped) || - (l.fWarnIfNotStopped) || - (l.fWarnIfStopped) ) - { - MSG msg; - if (!GetMessage (&msg, NULL, 0, 0)) - break; - if (IsMemoryManagerMessage (&msg)) - continue; - TranslateMessage (&msg); - DispatchMessage (&msg); - } - } - - if (fStartService && !l.fServiceIsRunning) - return FALSE; - - return TRUE; -} - - -BOOL fIsCellInCellServDB (LPCTSTR pszCell) -{ - BOOL fFound = FALSE; - CELLSERVDB CellServDB; - - if (CSDB_ReadFile (&CellServDB, NULL)) - { - if (CSDB_FindCell (&CellServDB, pszCell)) - fFound = TRUE; - CSDB_FreeFile (&CellServDB); - } -#ifdef AFS_AFSDB_ENV - if ( fFound == FALSE ) { - int ttl; - char cellname[128], i; - - /* we pray for all ascii cellnames */ - for ( i=0 ; pszCell[i] && i < (sizeof(cellname)-1) ; i++ ) - cellname[i] = pszCell[i]; - cellname[i] = '\0'; - - fFound = !cm_SearchCellByDNS(cellname, NULL, &ttl, NULL, NULL); - } -#endif - return fFound; -} - - -void GeneralTab_DoStartStop (HWND hDlg, BOOL fStart, BOOL fRestart) -{ - BOOL fSuccess = FALSE; - ULONG error = 0; - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_ALL_ACCESS)) != NULL) - { - if (fStart) - { - g.fNeedRestart = FALSE; - if (StartService (hService, 0, 0)) - TestAndDoMapShare(SERVICE_START_PENDING); - fSuccess = TRUE; - } - else // (!fStart) - { - SERVICE_STATUS Status; - if (ControlService (hService, SERVICE_CONTROL_STOP, &Status)) - fSuccess = TRUE; - if (g.Configuration.fLogonAuthent) - DoUnMapShare(FALSE); - } - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - - if (fSuccess) - { - l.fWarnIfStopped = fStart; - l.fWarnIfNotStopped = !fStart; - l.fRestartIfStopped = fRestart && !fStart; - l.fStarting = fStart; - GeneralTab_OnTimer (hDlg); - } - else - { - l.fWarnIfStopped = FALSE; - l.fWarnIfNotStopped = FALSE; - l.fRestartIfStopped = FALSE; - GeneralTab_OnTimer (hDlg); - - if (!error) - error = GetLastError(); - Message (MB_OK | MB_ICONHAND, GetErrorTitle(), ((fStart) ? IDS_SERVICE_FAIL_START : IDS_SERVICE_FAIL_STOP), TEXT("%08lX"), error); - } -} - - -BOOL CALLBACK Status_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - l.hStatus = hDlg; - ShowWindow (l.hStatus, SW_SHOW); - Status_OnRefresh (hDlg); - break; - - case WM_DESTROY: - l.hStatus = NULL; - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - DestroyWindow (hDlg); - break; - - case IDINIT: - Status_OnRefresh (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void Status_OnRefresh (HWND hDlg) -{ - DWORD CurrentState = Config_GetServiceState(); - if (CurrentState == SERVICE_START_PENDING) - l.fStarting = TRUE; - else if (CurrentState == SERVICE_STOP_PENDING) - l.fStarting = FALSE; - - ShowWindow (GetDlgItem (l.hStatus, IDC_STARTING), l.fStarting); - ShowWindow (GetDlgItem (l.hStatus, IDC_STOPPING), !l.fStarting); -} - diff --git a/src/WINNT/client_config/tab_general.h b/src/WINNT/client_config/tab_general.h deleted file mode 100644 index 60d90a568..000000000 --- a/src/WINNT/client_config/tab_general.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAB_GENERAL_H -#define TAB_GENERAL_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK GeneralTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/client_config/tab_hosts.cpp b/src/WINNT/client_config/tab_hosts.cpp deleted file mode 100644 index 4f270535d..000000000 --- a/src/WINNT/client_config/tab_hosts.cpp +++ /dev/null @@ -1,795 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} - -#include "afs_config.h" -#include "tab_hosts.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void HostsTab_OnInitDialog (HWND hDlg); -BOOL HostsTab_OnApply (HWND hDlg); -void HostsTab_OnSelect (HWND hDlg); -void HostsTab_OnAdd (HWND hDlg); -void HostsTab_OnEdit (HWND hDlg); -void HostsTab_OnRemove (HWND hDlg); - -void HostsTab_FillList (HWND hDlg); - -BOOL CALLBACK CellEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void CellEdit_OnInitDialog (HWND hDlg); -void CellEdit_OnDestroy (HWND hDlg); -void CellEdit_OnApply (HWND hDlg); -void CellEdit_OnSelect (HWND hDlg); -void CellEdit_OnAdd (HWND hDlg); -void CellEdit_OnEdit (HWND hDlg); -void CellEdit_OnRemove (HWND hDlg); -void CellEdit_Enable (HWND hDlg); -void CellEdit_AddServerEntry (HWND hDlg, PCELLDBLINE pLine, int iOrder); -int CALLBACK CellEdit_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2); - -BOOL CALLBACK ServerEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void ServerEdit_OnInitDialog (HWND hDlg); -BOOL ServerEdit_OnOK (HWND hDlg); - -BOOL TextToAddr (SOCKADDR_IN *pAddr, LPTSTR pszServer); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK HostsTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - if (g.fIsCCenter) - Main_OnInitDialog (GetParent(hDlg)); - HostsTab_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - if (!HostsTab_OnApply (hDlg)) - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - break; - - case IDC_ADD: - HostsTab_OnAdd (hDlg); - break; - - case IDC_EDIT: - HostsTab_OnEdit (hDlg); - break; - - case IDC_REMOVE: - HostsTab_OnRemove (hDlg); - break; - - case IDHELP: - HostsTab_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - if (g.fIsCCenter) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_CCENTER); - else - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLS); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - HostsTab_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT))) - HostsTab_OnEdit (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void HostsTab_OnInitDialog (HWND hDlg) -{ - if (!g.Configuration.CellServDB.pFirst) - { - CSDB_ReadFile (&g.Configuration.CellServDB, NULL); - - // Fill in our list with cell names. - // - HostsTab_FillList (hDlg); - HostsTab_OnSelect (hDlg); - - // If this is the Control Center applet, shove the default cell - // name onto the tab too. - // - if (g.fIsCCenter) - { - Config_GetCellName (g.Configuration.szCell); - SetDlgItemText (hDlg, IDC_CELL, g.Configuration.szCell); - } - } -} - - -BOOL HostsTab_CommitChanges (BOOL fForce) -{ - HWND hDlg; - if ((hDlg = PropSheet_FindTabWindow (g.psh, (DLGPROC)HostsTab_DlgProc)) == NULL) - return TRUE; - if (fForce) - SetWindowLong (hDlg, DWL_MSGRESULT, FALSE); // Make sure we try to apply - if (HostsTab_OnApply (hDlg)) - return TRUE; - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - return FALSE; -} - - -BOOL HostsTab_OnApply (HWND hDlg) -{ - // Don't try to do anything if we've already failed the apply - if (GetWindowLong (hDlg, DWL_MSGRESULT)) - return FALSE; - - if (!CSDB_WriteFile (&g.Configuration.CellServDB)) - return FALSE; - - // If this is the Control Center applet, we'll have to validate - // the cell name too. - // - if (g.fIsCCenter) - { - TCHAR szNoCell[ cchRESOURCE ]; - GetString (szNoCell, IDS_CELL_UNKNOWN); - - TCHAR szCell[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE); - - if ((!szCell[0]) || (!lstrcmpi (szNoCell, szCell))) - { - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_NOCELL_DESC_CC); - return FALSE; - } - - if (!CSDB_FindCell (&g.Configuration.CellServDB, szCell)) - { -#ifdef AFS_AFSDB_ENV - int ttl; - char cellname[128], i; - - /* we pray for all ascii cellnames */ - for ( i=0 ; szCell[i] && i < (sizeof(cellname)-1) ; i++ ) - cellname[i] = szCell[i]; - cellname[i] = '\0'; - - if (cm_SearchCellByDNS(cellname, NULL, &ttl, NULL, NULL)) -#endif - { - Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADCELL_DESC_CC); - return FALSE; - } - } - - if (!Config_SetCellName (szCell)) - return FALSE; - lstrcpy (g.Configuration.szCell, szCell); - } - - return TRUE; -} - - -void HostsTab_OnSelect (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - HLISTITEM hItem = FastList_FindFirstSelected (hList); - HLISTITEM hNext = FastList_FindNextSelected (hList, hItem); - - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem && !hNext); - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), !!hItem); -} - - -void HostsTab_OnAdd (HWND hDlg) -{ - TCHAR szTitle[ cchRESOURCE ]; - GetString (szTitle, IDS_CELLADD_TITLE); - - LPPROPSHEET psh = PropSheet_Create (szTitle, FALSE, GetParent(hDlg), 0); - psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button - psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead - PropSheet_AddTab (psh, szTitle, IDD_CELL_EDIT, (DLGPROC)CellEdit_DlgProc, 0, TRUE); - PropSheet_ShowModal (psh); - - HostsTab_FillList (hDlg); - HostsTab_OnSelect (hDlg); -} - - -void HostsTab_OnEdit (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - HLISTITEM hItem = FastList_FindFirstSelected (hList); - if (hItem) - { - PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - CELLDBLINEINFO Info; - CSDB_CrackLine (&Info, pLine->szLine); - - LPTSTR pszTitle = FormatString (IDS_CELLEDIT_TITLE, TEXT("%s"), ((Info.szComment[0]) ? Info.szComment : Info.szCell)); - - LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE, GetParent(hDlg), (LPARAM)pLine); - psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button - psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead - PropSheet_AddTab (psh, ((Info.szComment[0]) ? Info.szComment : Info.szCell), IDD_CELL_EDIT, (DLGPROC)CellEdit_DlgProc, (LPARAM)pLine, TRUE); - PropSheet_ShowModal (psh); - - FreeString (pszTitle); - } - - HostsTab_FillList (hDlg); - HostsTab_OnSelect (hDlg); -} - - -void HostsTab_OnRemove (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - HLISTITEM hItem = FastList_FindFirstSelected (hList); - HLISTITEM hNext = FastList_FindNextSelected (hList, hItem); - - if (!hItem) - { - return; - } - else if (hNext) - { - if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_HOSTREM_MANY) != IDOK) - return; - } - else // (!hNext) - { - PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - CELLDBLINEINFO Info; - CSDB_CrackLine (&Info, pLine->szLine); - - if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_HOSTREM_ONE, TEXT("%s"), Info.szCell) != IDOK) - return; - } - - for ( ; hItem; hItem = FastList_FindNextSelected (hList, hItem)) - { - PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - CSDB_RemoveCell (&g.Configuration.CellServDB, pLine); - } - - HostsTab_FillList (hDlg); - HostsTab_OnSelect (hDlg); -} - - -void HostsTab_FillList (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - FastList_Begin (hList); - FastList_RemoveAll (hList); - - for (PCELLDBLINE pLine = g.Configuration.CellServDB.pFirst; pLine; pLine = pLine->pNext) - { - CELLDBLINEINFO Info; - if (!CSDB_CrackLine (&Info, pLine->szLine)) - continue; - if (!Info.szCell[0]) - continue; - - TCHAR szText[ MAX_PATH ]; - lstrcpy (szText, Info.szCell); - -#if 0 // Add this if you like a more verbose Cell Hosts tab - if (Info.szComment) - wsprintf (&szText[ lstrlen(szText) ], TEXT(" (%s)"), Info.szComment); -#endif - - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(ai)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - ai.pszText = szText; - ai.lParam = (LPARAM)pLine; - FastList_AddItem (hList, &ai); - } - - FastList_End (hList); -} - - -BOOL CALLBACK CellEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - CellEdit_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - CellEdit_OnDestroy (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - CellEdit_OnApply (hDlg); - break; - - case IDC_CELL: - CellEdit_Enable (hDlg); - break; - - case IDC_COMMENT: - CellEdit_Enable (hDlg); - break; - - case IDC_ADD: - CellEdit_OnAdd (hDlg); - CellEdit_Enable (hDlg); - break; - - case IDC_EDIT: - CellEdit_OnEdit (hDlg); - CellEdit_Enable (hDlg); - break; - - case IDC_REMOVE: - CellEdit_OnRemove (hDlg); - CellEdit_Enable (hDlg); - break; - - case IDHELP: - CellEdit_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - if (PropSheet_FindTabParam (hDlg)) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_EDIT); - else - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_ADD); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - CellEdit_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT))) - CellEdit_OnEdit (hDlg); - CellEdit_Enable (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void CellEdit_OnInitDialog (HWND hDlg) -{ - PCELLDBLINE pLine = (PCELLDBLINE)PropSheet_FindTabParam (hDlg); - if (pLine) - { - CELLDBLINEINFO Info; - CSDB_CrackLine (&Info, pLine->szLine); - SetDlgItemText (hDlg, IDC_CELL, Info.szCell); - SetDlgItemText (hDlg, IDC_COMMENT, Info.szComment); - - int iOrder = 0; - for (pLine = pLine->pNext; pLine; pLine = pLine->pNext) - { - CELLDBLINEINFO Info; - if (!CSDB_CrackLine (&Info, pLine->szLine)) - break; - if (Info.szCell[0]) - break; - - CellEdit_AddServerEntry (hDlg, pLine, iOrder++); - } - } - - // Prepare the columns on the server list - // - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - FASTLISTCOLUMN Column; - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 200; - GetString (Column.szText, IDS_SVRCOL_COMMENT); - FastList_SetColumn (hList, 0, &Column); - - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 100; - GetString (Column.szText, IDS_SVRCOL_SERVER); - FastList_SetColumn (hList, 1, &Column); - - FastList_SetSortFunction (hList, CellEdit_SortFunction); - - // Remove the Context Help [?] thing from the title bar - // - DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE); - dwStyle &= ~DS_CONTEXTHELP; - SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle); - - dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE); - dwStyle &= ~WS_EX_CONTEXTHELP; - SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle); - - // A little cleanup and we're done! - // - CellEdit_Enable (hDlg); - CellEdit_OnSelect (hDlg); -} - - -void CellEdit_OnDestroy (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) - { - PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - Delete (pInfo); - } -} - - -void CellEdit_OnApply (HWND hDlg) -{ - TCHAR szCell[ cchCELLDBLINE ]; - GetDlgItemText (hDlg, IDC_CELL, szCell, cchCELLDBLINE); - - TCHAR szComment[ cchCELLDBLINE ]; - GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE); - - TCHAR szLinkedCell[ cchCELLDBLINE ] = TEXT(""); - - // Find out if there's already an entry in CellServDB for this cell - // - PCELLDBLINE pCellLine; - if ((pCellLine = CSDB_FindCell (&g.Configuration.CellServDB, szCell)) != NULL) - { - CELLDBLINEINFO Info; - if (CSDB_CrackLine (&Info, pCellLine->szLine)) - lstrcpy (szLinkedCell, Info.szLinkedCell); - } - - // Replace our cell's entry in CellServDB, or add one if necessary. - // - if ((pCellLine = CSDB_AddCell (&g.Configuration.CellServDB, szCell, szLinkedCell, szComment)) != NULL) - { - // Remove the old servers from this cell - // - CSDB_RemoveCellServers (&g.Configuration.CellServDB, pCellLine); - - // Add the servers from our list to the CellServDB - // - PCELLDBLINE pAppendTo = pCellLine; - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) - { - PCELLDBLINE pFromList = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - - pAppendTo = CSDB_AddLine (&g.Configuration.CellServDB, pAppendTo, pFromList->szLine); - } - } -} - - -void CellEdit_OnSelect (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - HLISTITEM hItem = FastList_FindFirstSelected (hList); - HLISTITEM hNext = FastList_FindNextSelected (hList, hItem); - - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem && !hNext); - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), !!hItem); -} - - -void CellEdit_OnAdd (HWND hDlg) -{ - CELLDBLINE Line; - memset (&Line, 0x00, sizeof(CELLDBLINE)); - - int iOrder = 0; - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) - { - PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - iOrder = max (iOrder, 1+ (int)(pInfo->pNext)); - } - - if (ModalDialogParam (IDD_SERVER_EDIT, hDlg, (DLGPROC)ServerEdit_DlgProc, (LPARAM)&Line) == IDOK) - { - CellEdit_AddServerEntry (hDlg, &Line, iOrder); - } -} - - -void CellEdit_OnEdit (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - HLISTITEM hItem = FastList_FindFirstSelected (hList); - PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - - CELLDBLINE Line; - memcpy (&Line, pInfo, sizeof(CELLDBLINE)); - - if (ModalDialogParam (IDD_SERVER_EDIT, hDlg, (DLGPROC)ServerEdit_DlgProc, (LPARAM)&Line) == IDOK) - { - CELLDBLINEINFO Info; - CSDB_CrackLine (&Info, Line.szLine); - - TCHAR szServer[ cchRESOURCE ]; - lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Info.ipServer)); - - FastList_SetItemText (hList, hItem, 0, Info.szComment); - FastList_SetItemText (hList, hItem, 1, szServer); - - lstrcpy (pInfo->szLine, Line.szLine); - } -} - - -void CellEdit_OnRemove (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - FastList_Begin (hList); - - HLISTITEM hItem; - while ((hItem = FastList_FindFirstSelected (hList)) != NULL) - { - PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); - Delete (pInfo); - FastList_RemoveItem (hList, hItem); - } - - FastList_End (hList); -} - - -void CellEdit_Enable (HWND hDlg) -{ - BOOL fEnable = TRUE; - - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_CELL, szText, cchRESOURCE); - if (!szText[0]) - fEnable = FALSE; - - if (!FastList_FindFirst (GetDlgItem (hDlg, IDC_LIST))) - fEnable = FALSE; - - EnableWindow (GetDlgItem (GetParent (hDlg), IDOK), fEnable); -} - - -void CellEdit_AddServerEntry (HWND hDlg, PCELLDBLINE pLine, int iOrder) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - - PCELLDBLINE pCopy = New (CELLDBLINE); - memcpy (pCopy, pLine, sizeof(CELLDBLINE)); - pCopy->pPrev = NULL; - pCopy->pNext = (PCELLDBLINE)iOrder; - - CELLDBLINEINFO Info; - CSDB_CrackLine (&Info, pCopy->szLine); - - TCHAR szServer[ cchRESOURCE ]; - lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Info.ipServer)); - - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(ai)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - ai.pszText = Info.szComment; - ai.lParam = (LPARAM)pCopy; - HLISTITEM hItem = FastList_AddItem (hList, &ai); - - FastList_SetItemText (hList, hItem, 1, szServer); -} - - -int CALLBACK CellEdit_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - if (!hItem1 || !hItem2) - return 0; - - PCELLDBLINE pLine1 = (PCELLDBLINE)lpItem1; - PCELLDBLINE pLine2 = (PCELLDBLINE)lpItem2; - - int iOrder1 = (int)(pLine1->pNext); - int iOrder2 = (int)(pLine2->pNext); - return iOrder1 - iOrder2; -} - - -BOOL CALLBACK ServerEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - ServerEdit_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (ServerEdit_OnOK (hDlg)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDHELP: - ServerEdit_DlgProc (hDlg, WM_HELP, 0, 0); - break; - - case IDC_ADDR_SPECIFIC: - case IDC_ADDR_LOOKUP: - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC)); - break; - } - break; - - case WM_HELP: - PCELLDBLINE pLine; - pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER); - - CELLDBLINEINFO Info; - if (!CSDB_CrackLine (&Info, pLine->szLine)) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_SERVER_ADD); - else - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_SERVER_EDIT); - break; - } - - return FALSE; -} - - -void ServerEdit_OnInitDialog (HWND hDlg) -{ - PCELLDBLINE pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER); - - TCHAR szTitle[ cchRESOURCE ]; - CELLDBLINEINFO Info; - if (!CSDB_CrackLine (&Info, pLine->szLine)) - GetString (szTitle, IDS_ADDSERVER_TITLE); - else - GetString (szTitle, IDS_EDITSERVER_TITLE); - SetWindowText (hDlg, szTitle); - - SOCKADDR_IN Addr; - memset (&Addr, 0x00, sizeof(SOCKADDR_IN)); - Addr.sin_family = AF_INET; - Addr.sin_addr.s_addr = Info.ipServer; - SA_SetAddr (GetDlgItem (hDlg, IDC_SERVER), &Addr); - - CheckDlgButton (hDlg, IDC_ADDR_SPECIFIC, !!Info.ipServer); - CheckDlgButton (hDlg, IDC_ADDR_LOOKUP, !Info.ipServer); - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC)); - - SetDlgItemText (hDlg, IDC_COMMENT, Info.szComment); -} - - -BOOL ServerEdit_OnOK (HWND hDlg) -{ - PCELLDBLINE pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER); - - TCHAR szComment[ cchCELLDBLINE ]; - GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE); - - SOCKADDR_IN Addr; - if (IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC)) - { - SA_GetAddr (GetDlgItem (hDlg, IDC_SERVER), &Addr); - lstrcpy (szComment, inet_ntoa (*(struct in_addr *)&Addr.sin_addr.s_addr)); - } - if (!TextToAddr (&Addr, szComment)) - { - Message (MB_ICONHAND, GetErrorTitle(), IDS_BADLOOKUP_DESC, TEXT("%s"), szComment); - return FALSE; - } - - TCHAR szServer[ cchCELLDBLINE ]; - lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Addr.sin_addr.s_addr)); - - CSDB_FormatLine (pLine->szLine, szServer, NULL, szComment, FALSE); - return TRUE; -} - - -BOOL TextToAddr (SOCKADDR_IN *pAddr, LPTSTR pszServer) -{ - if (!pszServer || !*pszServer) - return FALSE; - - try { - memset (pAddr, 0x00, sizeof(SOCKADDR_IN)); - pAddr->sin_family = AF_INET; - - if ((*pszServer >= TEXT('0')) && (*pszServer <= TEXT('9'))) - { - if ((pAddr->sin_addr.s_addr = inet_addr (pszServer)) == 0) - return FALSE; - - HOSTENT *pEntry; - if ((pEntry = gethostbyaddr ((char*)&pAddr->sin_addr.s_addr, sizeof(int), AF_INET)) == NULL) - return FALSE; - - if (pEntry->h_name[0]) - lstrcpy (pszServer, pEntry->h_name); // return the server's fqdn - } - else // Need to lookup the server by its name - { - HOSTENT *pEntry; - if ((pEntry = gethostbyname (pszServer)) == NULL) - return FALSE; - - memcpy (&pAddr->sin_addr, (struct in_addr *)pEntry->h_addr, sizeof(struct in_addr)); - if (!pAddr->sin_addr.s_addr) - return FALSE; - - if (pEntry->h_name[0]) - lstrcpy (pszServer, pEntry->h_name); // return the server's fqdn - } - - return TRUE; - } - catch(...) - { - return FALSE; - } -} - diff --git a/src/WINNT/client_config/tab_hosts.h b/src/WINNT/client_config/tab_hosts.h deleted file mode 100644 index 97cd76c99..000000000 --- a/src/WINNT/client_config/tab_hosts.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAB_HOSTS_H -#define TAB_HOSTS_H - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK HostsTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -BOOL HostsTab_CommitChanges (BOOL fForce); - - -#endif - diff --git a/src/WINNT/client_config/tab_prefs.cpp b/src/WINNT/client_config/tab_prefs.cpp deleted file mode 100644 index d02e1d59c..000000000 --- a/src/WINNT/client_config/tab_prefs.cpp +++ /dev/null @@ -1,941 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afs_config.h" -#include "tab_prefs.h" -#include -#include - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct l - { - CRITICAL_SECTION cs; - BOOL fThreadActive; - HWND hList; - } l; - -#define cREALLOC_PREFS 32 - -#ifndef iswhite -#define iswhite(_ch) (((_ch)==TEXT(' ')) || ((_ch)==TEXT('\t'))) -#endif -#ifndef iseol -#define iseol(_ch) (((_ch)==TEXT('\r')) || ((_ch)==TEXT('\n'))) -#endif -#ifndef iswhiteeol -#define iswhiteeol(_ch) (iswhite(_ch) || iseol(_ch)) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void PrefsTab_OnInitDialog (HWND hDlg); -BOOL PrefsTab_OnApply (HWND hDlg); -void PrefsTab_OnRefresh (HWND hDlg); -void PrefsTab_OnFillList (HWND hDlg); -void PrefsTab_OnSelect (HWND hDlg); -void PrefsTab_OnUpDown (HWND hDlg, BOOL fDown); -void PrefsTab_OnAdd (HWND hDlg); -void PrefsTab_OnEdit (HWND hDlg); -void PrefsTab_OnImport (HWND hDlg); - -void PrefsTab_MergeServerPrefs (PSERVERPREFS pGlobal, PSERVERPREFS pAdd); -void PrefsTab_AddItem (HWND hDlg, PSERVERPREF pPref, BOOL fSelect); -void PrefsTab_AddItem (HWND hDlg, LPCTSTR pszServer, int iRank); - -DWORD WINAPI PrefsTab_RefreshThread (PVOID lp); -DWORD WINAPI PrefsTab_ThreadProc (PVOID lp); -void PrefsTab_ThreadProcFunc (PSERVERPREFS pPrefs, BOOL *pfStopFlag); - -int CALLBACK PrefsTab_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2); - -BOOL CALLBACK IPKey_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData); -HASHVALUE CALLBACK IPKey_HashObject (LPHASHLISTKEY pKey, PVOID pObject); -HASHVALUE CALLBACK IPKey_HashData (LPHASHLISTKEY pKey, PVOID pData); - -BOOL CALLBACK PrefsEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void PrefsEdit_OnInitDialog (HWND hDlg); -void PrefsEdit_OnOK (HWND hDlg); -void PrefsEdit_Enable (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK PrefsTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - InitializeCriticalSection (&l.cs); - PrefsTab_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDAPPLY: - if (!PrefsTab_OnApply (hDlg)) - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - break; - - case IDC_REFRESH: - PrefsTab_OnRefresh (hDlg); - break; - - case IDC_SHOW_FS: - case IDC_SHOW_VLS: - PrefsTab_OnFillList (hDlg); - break; - - case IDC_ADD: - PrefsTab_OnAdd (hDlg); - break; - - case IDC_EDIT: - PrefsTab_OnEdit (hDlg); - break; - - case IDC_UP: - PrefsTab_OnUpDown (hDlg, FALSE); - break; - - case IDC_DOWN: - PrefsTab_OnUpDown (hDlg, TRUE); - break; - - case IDC_IMPORT: - PrefsTab_OnImport (hDlg); - break; - - case IDHELP: - PrefsTab_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_PREFS_NT); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lp)->code) - { - case FLN_ITEMSELECT: - PrefsTab_OnSelect (hDlg); - break; - - case FLN_LDBLCLICK: - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT))) - PrefsTab_OnEdit (hDlg); - break; - } - break; - } - - return FALSE; -} - - -void PrefsTab_OnInitDialog (HWND hDlg) -{ - HICON hiUp = TaLocale_LoadIcon (IDI_UP); - HICON hiDown = TaLocale_LoadIcon (IDI_DOWN); - - SendDlgItemMessage (hDlg, IDC_UP, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hiUp); - SendDlgItemMessage (hDlg, IDC_DOWN, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hiDown); - - CheckDlgButton (hDlg, IDC_SHOW_FS, TRUE); - CheckDlgButton (hDlg, IDC_SHOW_VLS, FALSE); - - l.hList = GetDlgItem (hDlg, IDC_LIST); - - FASTLISTCOLUMN Column; - Column.dwFlags = FLCF_JUSTIFY_LEFT; - Column.cxWidth = 200; - GetString (Column.szText, IDS_PREFCOL_SERVER); - FastList_SetColumn (l.hList, 0, &Column); - - Column.dwFlags = FLCF_JUSTIFY_RIGHT; - Column.cxWidth = 40; - GetString (Column.szText, IDS_PREFCOL_RANK); - FastList_SetColumn (l.hList, 1, &Column); - - FastList_SetSortFunction (l.hList, PrefsTab_SortFunction); - - PrefsTab_OnFillList (hDlg); - PrefsTab_OnRefresh (hDlg); -} - - -BOOL PrefsTab_CommitChanges (BOOL fForce) -{ - HWND hDlg; - if ((hDlg = PropSheet_FindTabWindow (g.psh, (DLGPROC)PrefsTab_DlgProc)) == NULL) - return TRUE; - if (fForce) - SetWindowLong (hDlg, DWL_MSGRESULT, FALSE); // Make sure we try to apply - if (PrefsTab_OnApply (hDlg)) - return TRUE; - SetWindowLong (hDlg, DWL_MSGRESULT, TRUE); - return FALSE; -} - - -BOOL PrefsTab_OnApply (HWND hDlg) -{ - // Don't try to do anything if we've already failed the apply - if (GetWindowLong (hDlg, DWL_MSGRESULT)) - return FALSE; - - if (g.Configuration.pFServers && g.Configuration.fChangedPrefs) - { - if (!Config_SetServerPrefs (g.Configuration.pFServers)) - return FALSE; - } - if (g.Configuration.pVLServers && g.Configuration.fChangedPrefs) - { - if (!Config_SetServerPrefs (g.Configuration.pVLServers)) - return FALSE; - } - g.Configuration.fChangedPrefs = FALSE; - return TRUE; -} - - -void PrefsTab_OnRefresh (HWND hDlg) -{ - DWORD idThread; - CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)PrefsTab_RefreshThread, (PVOID)hDlg, 0, &idThread); -} - - -void PrefsTab_OnFillList (HWND hDlg) -{ - EnterCriticalSection (&l.cs); - BOOL fVLServers = IsDlgButtonChecked (hDlg, IDC_SHOW_VLS); - - // Empty the fastlist, and clear from the lists any mention of HLISTITEMs. - // - FastList_Begin (l.hList); - FastList_RemoveAll (l.hList); - - if (g.Configuration.pVLServers) - { - for (size_t ii = 0; ii < g.Configuration.pVLServers->cPrefs; ++ii) - g.Configuration.pVLServers->aPrefs[ ii ].hItem = NULL; - } - if (g.Configuration.pFServers) - { - for (size_t ii = 0; ii < g.Configuration.pFServers->cPrefs; ++ii) - g.Configuration.pFServers->aPrefs[ ii ].hItem = NULL; - } - - // Fill in the fastlist by adding entries from the appropriate prefslist. - // - PSERVERPREFS pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - if (pPrefs) - { - for (size_t ii = 0; ii < pPrefs->cPrefs; ++ii) - { - if (!pPrefs->aPrefs[ ii ].ipServer) - continue; - - TCHAR szItem[ cchRESOURCE ]; - if (!pPrefs->aPrefs[ ii ].szServer[0]) - { - lstrcpy (szItem, inet_ntoa (*(struct in_addr *)&pPrefs->aPrefs[ ii ].ipServer)); - } - else - { - wsprintf (szItem, TEXT("%s (%s)"), - pPrefs->aPrefs[ ii ].szServer, - inet_ntoa (*(struct in_addr *)&pPrefs->aPrefs[ ii ].ipServer)); - } - - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(FASTLISTADDITEM)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - ai.pszText = szItem; - ai.lParam = ii; - pPrefs->aPrefs[ ii ].hItem = FastList_AddItem (l.hList, &ai); - - wsprintf (szItem, TEXT("%ld"), pPrefs->aPrefs[ ii ].iRank); - FastList_SetItemText (l.hList, pPrefs->aPrefs[ ii ].hItem, 1, szItem); - } - } - - // Okay, we're done! - // - FastList_End (l.hList); - LeaveCriticalSection (&l.cs); - PrefsTab_OnSelect (hDlg); -} - - -void PrefsTab_OnSelect (HWND hDlg) -{ - if (IsWindowEnabled (l.hList)) - { - HLISTITEM hItem = FastList_FindFirstSelected (l.hList); - HLISTITEM hItemFirst = FastList_FindFirst (l.hList); - HLISTITEM hItemNext = FastList_FindNext (l.hList, hItem); - - EnableWindow (GetDlgItem (hDlg, IDC_UP), (hItem && (hItem != hItemFirst))); - EnableWindow (GetDlgItem (hDlg, IDC_DOWN), (hItem && hItemNext)); - EnableWindow (GetDlgItem (hDlg, IDC_ADD), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_IMPORT), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem); - } -} - - -void PrefsTab_OnUpDown (HWND hDlg, BOOL fDown) -{ - BOOL fVLServers = IsDlgButtonChecked (hDlg, IDC_SHOW_VLS); - PSERVERPREFS pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - - HLISTITEM hItem; - if ((hItem = FastList_FindFirstSelected (l.hList)) == NULL) - return; - - HLISTITEM hOther; - hOther = (fDown) ? FastList_FindNext(l.hList,hItem) : FastList_FindPrevious(l.hList,hItem); - if (hOther == NULL) - return; - - size_t iItem = (size_t)FastList_GetItemParam (l.hList, hItem); - size_t iOther = (size_t)FastList_GetItemParam (l.hList, hOther); - - if (!pPrefs || (pPrefs->cPrefs <= iItem) || (pPrefs->cPrefs <= iOther)) - return; - - FastList_Begin (l.hList); - - PSERVERPREF pPref1 = &pPrefs->aPrefs[ iItem ]; - PSERVERPREF pPref2 = &pPrefs->aPrefs[ iOther ]; - - if (pPref1->iRank == pPref2->iRank) - { - if (fDown && (pPref1->iRank < 65534)) - pPref1->iRank ++; - else if ((!fDown) && (pPref1->iRank > 1)) - pPref1->iRank --; - pPref1->fChanged = TRUE; - } - else // (pPref1->iRating != pPref2->iRating) - { - pPref1->iRank ^= pPref2->iRank; - pPref2->iRank ^= pPref1->iRank; - pPref1->iRank ^= pPref2->iRank; - pPref1->fChanged = TRUE; - pPref2->fChanged = TRUE; - } - - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%ld"), pPref1->iRank); - FastList_SetItemText (l.hList, pPref1->hItem, 1, szText); - - wsprintf (szText, TEXT("%ld"), pPref2->iRank); - FastList_SetItemText (l.hList, pPref2->hItem, 1, szText); - - FastList_EnsureVisible (l.hList, hItem); - FastList_End (l.hList); - PrefsTab_OnSelect (hDlg); - - g.Configuration.fChangedPrefs = TRUE; -} - - -void PrefsTab_OnAdd (HWND hDlg) -{ - BOOL fVLServers = IsDlgButtonChecked (hDlg, IDC_SHOW_VLS); - PSERVERPREFS pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - - SERVERPREF Pref; - memset (&Pref, 0x00, sizeof(SERVERPREF)); - Pref.iRank = 30000; - - if (ModalDialogParam (IDD_PREFS_EDIT, GetParent(hDlg), (DLGPROC)PrefsEdit_DlgProc, (LPARAM)&Pref) == IDOK) - { - PrefsTab_AddItem (hDlg, &Pref, TRUE); - PrefsTab_OnSelect (hDlg); - g.Configuration.fChangedPrefs = TRUE; - } -} - - -void PrefsTab_OnEdit (HWND hDlg) -{ - BOOL fVLServers = IsDlgButtonChecked (hDlg, IDC_SHOW_VLS); - PSERVERPREFS pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - - HLISTITEM hItem; - if ((hItem = FastList_FindFirstSelected (l.hList)) == NULL) - return; - - PSERVERPREF pPref = &pPrefs->aPrefs[ FastList_GetItemParam (l.hList, hItem) ]; - - if (ModalDialogParam (IDD_PREFS_EDIT, GetParent(hDlg), (DLGPROC)PrefsEdit_DlgProc, (LPARAM)pPref) == IDOK) - { - FastList_Begin (l.hList); - - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%ld"), pPref->iRank); - FastList_SetItemText (l.hList, pPref->hItem, 1, szText); - pPref->fChanged = TRUE; - - FastList_EnsureVisible (l.hList, hItem); - FastList_End (l.hList); - PrefsTab_OnSelect (hDlg); - g.Configuration.fChangedPrefs = TRUE; - } -} - - -void PrefsTab_OnImport (HWND hDlg) -{ - BOOL fVLServers = IsDlgButtonChecked (hDlg, IDC_SHOW_VLS); - PSERVERPREFS pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - - TCHAR szFilename[ MAX_PATH ] = TEXT(""); - if (Browse_Open (hDlg, szFilename, NULL, IDS_FILTER_TXT, 0, NULL, 0)) - { - FastList_Begin (l.hList); - - // Open the file and read it into memory. - // - HANDLE fh; - if ((fh = CreateFile (szFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) - { - DWORD cbLength = GetFileSize (fh, NULL); - LPTSTR pszBuffer = (LPTSTR)Allocate (sizeof(TCHAR) * (cbLength +2)); - - DWORD cbRead; - if (ReadFile (fh, pszBuffer, cbLength, &cbRead, NULL)) - { - pszBuffer[ cbRead ] = TEXT('\0'); - pszBuffer[ cbRead+1 ] = TEXT('\0'); - - // Scan the file line-by-line... - // - LPTSTR pszStart = pszBuffer; - while (pszStart && *pszStart) - { - while (iswhiteeol(*pszStart)) - ++pszStart; - - LPTSTR pszEnd = pszStart; - while (*pszEnd && !iseol(*pszEnd)) - ++pszEnd; - *pszEnd++ = TEXT('\0'); - - // Okay, {pszStart} points to a 0-terminated line in this file. - // If the line starts with '#', ';' or '//', skip it. - // - if ( (pszStart[0] != TEXT('#')) && - (pszStart[0] != TEXT(';')) && - ((pszStart[0] != TEXT('/')) || (pszStart[1] != TEXT('/'))) ) - { - // Break the line up into two sections: the machine name, - // and the ranking. - // - TCHAR szServer[ MAX_PATH ]; - for (LPTSTR pszOut = szServer; *pszStart && !iswhite(*pszStart); ) - *pszOut++ = *pszStart++; - *pszOut = TEXT('\0'); - - while (iswhite(*pszStart)) - ++pszStart; - - TCHAR szRank[ MAX_PATH ]; - for (pszOut = szRank; *pszStart && !iswhite(*pszStart); ) - *pszOut++ = *pszStart++; - *pszOut = TEXT('\0'); - - PrefsTab_AddItem (hDlg, szServer, atoi(szRank)); - } - - // Process the next line in the file. - // - pszStart = pszEnd; - } - } - - Free (pszBuffer); - CloseHandle (fh); - } - - // Restart the background thread, to resolve unknown IP address - // - PrefsTab_OnRefresh (hDlg); - FastList_End (l.hList); - g.Configuration.fChangedPrefs = TRUE; - } -} - - -void PrefsTab_MergeServerPrefs (PSERVERPREFS pGlobal, PSERVERPREFS pAdd) -{ - LPHASHLIST pList = New (HASHLIST); - LPHASHLISTKEY pKey = pList->CreateKey (TEXT("IP Address"), IPKey_Compare, IPKey_HashObject, IPKey_HashData); - - for (size_t ii = 0; ii < pGlobal->cPrefs; ++ii) - { - if (!pGlobal->aPrefs[ ii ].ipServer) - continue; - pList->Add (&pGlobal->aPrefs[ ii ]); - } - - size_t iOut = 0; - for (ii = 0; ii < pAdd->cPrefs; ++ii) - { - if (!pAdd->aPrefs[ ii ].ipServer) - continue; - - // The whole point of using a hashlist here is to allow this next call-- - // on a hashlist, lookup and add are both constant-time, turning this - // merge into O(N) instead of (O(N^2)) - // - if (pKey->GetFirstObject (&pAdd->aPrefs[ ii ].ipServer)) - continue; - - for ( ; iOut < pGlobal->cPrefs; ++iOut) - { - if (!pGlobal->aPrefs[ iOut ].ipServer) - break; - } - - if (REALLOC (pGlobal->aPrefs, pGlobal->cPrefs, 1+iOut, cREALLOC_PREFS)) - { - memcpy (&pGlobal->aPrefs[ iOut ], &pAdd->aPrefs[ ii ], sizeof(SERVERPREFS)); - iOut++; - } - } - - Delete (pList); -} - - -void PrefsTab_AddItem (HWND hDlg, PSERVERPREF pPref, BOOL fSelect) -{ - BOOL fVLServers = IsDlgButtonChecked (hDlg, IDC_SHOW_VLS); - PSERVERPREFS pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - - for (size_t ii = 0; ii < pPrefs->cPrefs; ++ii) - { - if (pPrefs->aPrefs[ ii ].ipServer == pPref->ipServer) - break; - } - if (ii == pPrefs->cPrefs) - { - for (ii = 0; ii < pPrefs->cPrefs; ++ii) - { - if (!pPrefs->aPrefs[ ii ].ipServer) - break; - } - if (!REALLOC (pPrefs->aPrefs, pPrefs->cPrefs, 1+ii, cREALLOC_PREFS)) - return; - memcpy (&pPrefs->aPrefs[ ii ], pPref, sizeof(SERVERPREF)); - } - - FastList_Begin (l.hList); - - if (!pPrefs->aPrefs[ ii ].hItem) - { - TCHAR szItem[ cchRESOURCE ]; - if (!pPrefs->aPrefs[ ii ].szServer[0]) - { - lstrcpy (szItem, inet_ntoa (*(struct in_addr *)&pPrefs->aPrefs[ ii ].ipServer)); - } - else - { - wsprintf (szItem, TEXT("%s (%s)"), - pPrefs->aPrefs[ ii ].szServer, - inet_ntoa (*(struct in_addr *)&pPrefs->aPrefs[ ii ].ipServer)); - } - - FASTLISTADDITEM ai; - memset (&ai, 0x00, sizeof(FASTLISTADDITEM)); - ai.iFirstImage = IMAGE_NOIMAGE; - ai.iSecondImage = IMAGE_NOIMAGE; - ai.pszText = szItem; - ai.lParam = ii; - pPrefs->aPrefs[ ii ].hItem = FastList_AddItem (l.hList, &ai); - } - - TCHAR szText[ cchRESOURCE ]; - wsprintf (szText, TEXT("%ld"), pPrefs->aPrefs[ ii ].iRank); - FastList_SetItemText (l.hList, pPrefs->aPrefs[ ii ].hItem, 1, szText); - pPrefs->aPrefs[ ii ].fChanged = TRUE; - - FastList_End (l.hList); - - if (fSelect) - { - FastList_SelectItem (l.hList, pPrefs->aPrefs[ ii ].hItem, TRUE); - FastList_SetFocus (l.hList, pPrefs->aPrefs[ ii ].hItem); - FastList_EnsureVisible (l.hList, pPrefs->aPrefs[ ii ].hItem); - PrefsTab_OnSelect (hDlg); - } -} - - -void PrefsTab_AddItem (HWND hDlg, LPCTSTR pszServer, int iRank) -{ - if ((iRank < 1) || (iRank > 65534)) - return; - - SERVERPREF Pref; - memset (&Pref, 0x00, sizeof(SERVERPREF)); - Pref.iRank = iRank; - - // If the server's name is an IP address, we'll translate it later - // when we do them en masse. - // - if (isdigit (pszServer[0])) - { - if ((Pref.ipServer = inet_addr (pszServer)) == INADDR_NONE) - return; - } - else // (!isdigit (pszServer[0])) - { - HOSTENT *pEntry; - if ((pEntry = gethostbyname (pszServer)) != NULL) - { - lstrcpy (Pref.szServer, pEntry->h_name); - Pref.ipServer = *(int *)pEntry->h_addr; - } - } - - PrefsTab_AddItem (hDlg, &Pref, FALSE); -} - - -DWORD WINAPI PrefsTab_RefreshThread (PVOID lp) -{ - HWND hDlg = (HWND)lp; - static BOOL *pfStopFlag = NULL; - - // We may have a background thread or two working on resolving IP addresses. - // Flag them to stop. - // - EnterCriticalSection (&l.cs); - if (l.fThreadActive) - { - if (pfStopFlag) - *pfStopFlag = FALSE; - } - pfStopFlag = NULL; // Thread will free this when it terminates - - // Retrieve PSERVERPREFS structures, and merge them into our globals - // - PSERVERPREFS pVLServers = Config_GetServerPrefs (TRUE); - PSERVERPREFS pFServers = Config_GetServerPrefs (FALSE); - - if (!g.Configuration.pVLServers) - g.Configuration.pVLServers = pVLServers; - else if (g.Configuration.pVLServers && pVLServers) - PrefsTab_MergeServerPrefs (g.Configuration.pVLServers, pVLServers); - - if (!g.Configuration.pFServers) - g.Configuration.pFServers = pFServers; - else if (g.Configuration.pFServers && pFServers) - PrefsTab_MergeServerPrefs (g.Configuration.pFServers, pFServers); - - // Add entries to the fastlist - // - PrefsTab_OnFillList (hDlg); - - // Fire up a background thread to resolve IP addresses into server names - // - pfStopFlag = New (BOOL); - *pfStopFlag = FALSE; - - DWORD idThread; - CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)PrefsTab_ThreadProc, (PVOID)pfStopFlag, 0, &idThread); - l.fThreadActive = TRUE; - - // Enable or disable controls based on whether the service is running - // - BOOL fRunning = (Config_GetServiceState() == SERVICE_RUNNING) ? TRUE : FALSE; - - EnableWindow (GetDlgItem (hDlg, IDC_SHOW_FS), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_SHOW_VLS), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_LIST), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_UP), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_DOWN), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_IMPORT), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_ADD), fRunning); - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fRunning); - PrefsTab_OnSelect (hDlg); - - TCHAR szText[ cchRESOURCE ]; - GetString (szText, (fRunning) ? IDS_TIP_PREFS : IDS_WARN_STOPPED); - SetDlgItemText (hDlg, IDC_WARN, szText); - - // We're done! - // - LeaveCriticalSection (&l.cs); - return 0; -} - - -DWORD WINAPI PrefsTab_ThreadProc (PVOID lp) -{ - BOOL *pfStopFlag = (BOOL*)lp; - if (pfStopFlag) - { - PrefsTab_ThreadProcFunc (g.Configuration.pFServers, pfStopFlag); - PrefsTab_ThreadProcFunc (g.Configuration.pVLServers, pfStopFlag); - - l.fThreadActive = FALSE; - Delete (pfStopFlag); - } - return 0; -} - - -void PrefsTab_ThreadProcFunc (PSERVERPREFS pPrefs, BOOL *pfStopFlag) -{ - for (size_t ii = 0; ; ++ii) - { - // Find the next IP address to translate - // - EnterCriticalSection (&l.cs); - - if ( (*pfStopFlag) || (ii >= pPrefs->cPrefs) ) - { - LeaveCriticalSection (&l.cs); - break; - } - - int ipServer; - if ( ((ipServer = pPrefs->aPrefs[ ii ].ipServer) == 0) || - (pPrefs->aPrefs[ ii ].szServer[0] != TEXT('\0')) ) - { - LeaveCriticalSection (&l.cs); - continue; - } - - LeaveCriticalSection (&l.cs); - - // Translate this IP address into a name - // - HOSTENT *pEntry; - if ((pEntry = gethostbyaddr ((char*)&ipServer, sizeof(ipServer), AF_INET)) == NULL) - continue; - - // Update the SERVERPREFS list, and if necessary, update the display - // to show the server's name - // - EnterCriticalSection (&l.cs); - - if (!*pfStopFlag) - { - if ((ii < pPrefs->cPrefs) && (ipServer == pPrefs->aPrefs[ ii ].ipServer)) - { - lstrcpy (pPrefs->aPrefs[ ii ].szServer, pEntry->h_name); - if (pPrefs->aPrefs[ ii ].szServer[0]) - { - if (pPrefs->aPrefs[ ii ].hItem) - { - TCHAR szItem[ cchRESOURCE ]; - wsprintf (szItem, TEXT("%s (%s)"), - pPrefs->aPrefs[ ii ].szServer, - inet_ntoa (*(struct in_addr *)&pPrefs->aPrefs[ ii ].ipServer)); - - FastList_SetItemText (l.hList, pPrefs->aPrefs[ ii ].hItem, 0, szItem); - } - } - } - } - - LeaveCriticalSection (&l.cs); - } -} - - -int CALLBACK PrefsTab_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2) -{ - static PSERVERPREFS pPrefs = NULL; - if (!hItem1 || !hItem2) - { - BOOL fVLServers = IsDlgButtonChecked (GetParent(hList), IDC_SHOW_VLS); - pPrefs = (fVLServers) ? g.Configuration.pVLServers : g.Configuration.pFServers; - return 0; - } - - if (!pPrefs || (pPrefs->cPrefs <= (size_t)lpItem1) || (pPrefs->cPrefs <= (size_t)lpItem2)) - return 0; - - PSERVERPREF pPref1 = &pPrefs->aPrefs[ lpItem1 ]; - PSERVERPREF pPref2 = &pPrefs->aPrefs[ lpItem2 ]; - - if (pPref1->iRank != pPref2->iRank) - return pPref1->iRank - pPref2->iRank; - - ULONG ip1 = (ULONG)htonl (pPref1->ipServer); - ULONG ip2 = (ULONG)htonl (pPref2->ipServer); - return (ip1 < ip2) ? -1 : 1; -} - - -BOOL CALLBACK IPKey_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData) -{ - return (((PSERVERPREF)pObject)->ipServer == *(int*)pData); -} - -HASHVALUE CALLBACK IPKey_HashObject (LPHASHLISTKEY pKey, PVOID pObject) -{ - return IPKey_HashData (pKey, &((PSERVERPREF)pObject)->ipServer); -} - -HASHVALUE CALLBACK IPKey_HashData (LPHASHLISTKEY pKey, PVOID pData) -{ - return *(int*)pData; -} - - -BOOL CALLBACK PrefsEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - PrefsEdit_OnInitDialog (hDlg); - PrefsEdit_Enable (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_SERVER: - PrefsEdit_Enable (hDlg); - break; - - case IDOK: - PrefsEdit_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDHELP: - PrefsEdit_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_PREFS_NT_ADDEDIT); - break; - } - - return FALSE; -} - - -void PrefsEdit_OnInitDialog (HWND hDlg) -{ - PSERVERPREF pPref = (PSERVERPREF)GetWindowLong (hDlg, DWL_USER); - - if (pPref->ipServer) - EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE); - - if (pPref->szServer[0]) - { - SetDlgItemText (hDlg, IDC_SERVER, pPref->szServer); - } - else if (pPref->ipServer) - { - SetDlgItemText (hDlg, IDC_SERVER, inet_ntoa (*(struct in_addr *)&pPref->ipServer)); - } - - CreateSpinner (GetDlgItem (hDlg, IDC_RANK), 10, FALSE, 1, pPref->iRank, 65534); -} - - -void PrefsEdit_OnOK (HWND hDlg) -{ - PSERVERPREF pPref = (PSERVERPREF)GetWindowLong (hDlg, DWL_USER); - pPref->iRank = SP_GetPos (GetDlgItem (hDlg, IDC_RANK)); - - if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SERVER))) - { - BOOL rc = TRUE; - ULONG status = 0; - - TCHAR szServer[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SERVER, szServer, cchRESOURCE); - if (isdigit (szServer[0])) - { - if ((pPref->ipServer = inet_addr (szServer)) == INADDR_NONE) - { - rc = FALSE; - status = WSAGetLastError(); - } - else - { - HOSTENT *pEntry; - if ((pEntry = gethostbyaddr ((char*)&pPref->ipServer, sizeof(pPref->ipServer), AF_INET)) != NULL) - lstrcpy (pPref->szServer, pEntry->h_name); - } - } - else // (!isdigit(pData->szServer[0])) - { - HOSTENT *pEntry; - if ((pEntry = gethostbyname (szServer)) == NULL) - { - rc = FALSE; - status = WSAGetLastError(); - } - else - { - lstrcpy (pPref->szServer, pEntry->h_name); - pPref->ipServer = *(int *)pEntry->h_addr; - } - } - - if (!rc) - { - Message (MB_ICONHAND | MB_OK, GetErrorTitle(), IDS_PREFERROR_RESOLVE, TEXT("%s%08lX"), szServer, status); - return; - } - } - - EndDialog (hDlg, IDOK); -} - - -void PrefsEdit_Enable (HWND hDlg) -{ - TCHAR szServer[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_SERVER, szServer, cchRESOURCE); - - EnableWindow (GetDlgItem (hDlg, IDOK), !!szServer[0]); -} - diff --git a/src/WINNT/client_config/tab_prefs.h b/src/WINNT/client_config/tab_prefs.h deleted file mode 100644 index 1ae414cf4..000000000 --- a/src/WINNT/client_config/tab_prefs.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TAB_PREFS_H -#define TAB_PREFS_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK PrefsTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -BOOL PrefsTab_CommitChanges (BOOL fForce); - - -#endif - diff --git a/src/WINNT/client_config/up.ico b/src/WINNT/client_config/up.ico deleted file mode 100644 index 53497ca128c2efe28f17e7c0ae6b0e78747a6a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmdT?D-uF65X%F6QCKRG%=7?oGkPcFnjQs-L^4x`kmZ?{dEyBKWSjjoZFfb1K^Eg0 zj_U&0DDK249>oDGc_2%hMwTcg=P}4DMJYwm1-=(Z&qSGTx%*F~eLr{oYQ0P~rKUkJ pvvX6Unsp6BF9VuFyadvD+miRgc;-3p*%y`Kp2z?I diff --git a/src/WINNT/client_cpa/.cvsignore b/src/WINNT/client_cpa/.cvsignore deleted file mode 100644 index 2a4923cb0..000000000 --- a/src/WINNT/client_cpa/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -AFS_component_version_number.c -AFS_component_version_number.h diff --git a/src/WINNT/client_cpa/NTMakefile b/src/WINNT/client_cpa/NTMakefile deleted file mode 100644 index d4c18936e..000000000 --- a/src/WINNT/client_cpa/NTMakefile +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -RELDIR=WINNT\client_cpa -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!include ..\..\config\NTMakefile.version - -############################################################################ -# Definitions for building afs_cpa.cpl - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afs_cpa.cpl - -DLLOBJS =\ - $(OUT)\cpl_interface.obj \ - $(OUT)\AFS_component_version_number.obj \ - $(OUT)\afs_cpa_stub.res - -DLLLIBS =\ - $(DESTDIR)\lib\afs\TaLocale.lib \ - $(DESTDIR)\lib\libosi.lib \ - comctl32.lib - -DEFFILE = afs_cpa.def - -$(DLLFILE): $(DLLOBJS) - $(DLLGUILINK) $(DLLLIBS) /DEF:$(DEFFILE) - $(DLLPREP) - - -############################################################################ -# Install target; primary makefile target - -install: $(DLLFILE) lang - -install9x: install - - -############################################################################ -# Language target - -lang:: en_US ja_JP ko_KR zh_TW zh_CN pt_BR es_ES de_DE - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - $(CD) lang - if exist $(NTLANG) $(NTLANG) en_US $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) ja_JP $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) ko_KR $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) zh_CN $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) zh_TW $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) pt_BR $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) es_ES $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) de_DE $(MAKECMD) /nologo /f NTMakefile clean - $(CD) .. - -############################################################################ -# Dependencies - -$(OUT)\afs_cpa_stub.res : AFS_component_version_number.h - -en_US: - $(CD) lang - $(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -ja_JP: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -ko_KR: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -zh_CN: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -zh_TW: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -pt_BR: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -es_ES: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -de_DE: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. diff --git a/src/WINNT/client_cpa/afs_ccenter.ico b/src/WINNT/client_cpa/afs_ccenter.ico deleted file mode 100644 index 9159a20375cefbde3f7c684fd4f860fd8a8d097c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcma))zfQz3490x~sgZ676Dv0|_6_bHDI3}FmTZ}M1t#90_XfPe-Nx84QW55}dw+@q z5^kLO=g)TAs6;DVo6Q~eTl%;mx+kJX_y)d%Yu*gn@5V$}#5~`yBZM>U_j?Fpi$pYn z;vwd*I>kEZ*=G`s~}%D%j~IL+oFuoR*}CEXPBdYZf_vf5L zV`c5e&I?z|>9SnM??2GE&d(%hXnk@8CYn5WU*ZEMT)nWszzXD~hP+e6Vyl92$ zC$tJM9;m8X$;zlW8_w-VV#Z6w8Bd8TT4ITdSmY@3d3=|)%fi%s;T#%%xdUqWTDL-| bueJD(s-D187JCOsvt8L{Q)tBBi diff --git a/src/WINNT/client_cpa/afs_conf.ico b/src/WINNT/client_cpa/afs_conf.ico deleted file mode 100644 index 3982dccc1cadf552d5c3d755ebe78d9e39024b53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZvaF>1pw7=@o}gF^|VQ`ZK^LrJ$>Ai;R_VZ7Nx22%>w5a=Cpjt-`12-Jtj*s(() z8A|>>S&^O6{PvUly|gU!%hxZzN@YVT`1%>w(!VOXR9|3U>2@Dtg0o)oU>r22l)#K}Eyu zFsSOVXMx)6dg7{b)9#AUEeF=E;UIO6~*&;(?DhbHKo3+jq->K+Crt5SU#5vrkKr=C!A?2UtarU~q)o{`NLMFrp`3y55Aw&3UDxSQTU#o_ -#include -#include -#include -#include "cpl_interface.h" -#include "resource.h" - - -static HINSTANCE hinst = 0; -static HINSTANCE hinstResources = 0; - - -static BOOL IsWindowsNT (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsWinNT = FALSE; - - if (!fChecked) - { - OSVERSIONINFO Version; - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - - if (GetVersionEx (&Version)) - { - if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) - fIsWinNT = TRUE; - } - - fChecked = TRUE; - } - - return fIsWinNT; -} - - -static BOOL IsClientInstalled (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsInstalled = FALSE; - - if (!fChecked) - { - HKEY hk; - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SW_VERSION_SUBKEY), &hk) == 0) - { - TCHAR szPath[ MAX_PATH ]; - DWORD dwSize = sizeof(szPath); - DWORD dwType = REG_SZ; - if (RegQueryValueEx (hk, TEXT(AFSREG_CLT_SW_VERSION_DIR_VALUE), - NULL, &dwType, (PBYTE)szPath, &dwSize) == 0) - fIsInstalled = TRUE; - RegCloseKey (hk); - } - fChecked = TRUE; - } - - return fIsInstalled; -} - - -extern "C" LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2) -{ - LPNEWCPLINFO lpNewCPlInfo; - LPCPLINFO lpCPlInfo; - - switch (uMsg) { - case CPL_INIT: /* first message, sent once */ - hinst = GetModuleHandle("afs_cpa.cpl"); - hinstResources = TaLocale_LoadCorrespondingModule (hinst); - return (hinst != 0); - - case CPL_GETCOUNT: /* second message, sent once */ - return 1; - break; - - case CPL_INQUIRE: /* in case we receive this we should indicate that we like NEWINQUIRE better. */ - lpCPlInfo = (CPLINFO *) lParam2; - lpCPlInfo->idIcon = ((IsClientInstalled() || !IsWindowsNT())? IDI_AFSD : IDI_CCENTER); - lpCPlInfo->idName = CPL_DYNAMIC_RES; - lpCPlInfo->idInfo = CPL_DYNAMIC_RES; - lpCPlInfo->lData = 0; - break; - - case CPL_NEWINQUIRE: /* third message, sent once per app */ - lpNewCPlInfo = (LPNEWCPLINFO) lParam2; - - lpNewCPlInfo->dwSize = (DWORD) sizeof(NEWCPLINFO); - lpNewCPlInfo->dwFlags = 0; - lpNewCPlInfo->dwHelpContext = 0; - lpNewCPlInfo->lData = 0; - if (IsClientInstalled() || !IsWindowsNT()) - lpNewCPlInfo->hIcon = TaLocale_LoadIcon(IDI_AFSD); - else - lpNewCPlInfo->hIcon = TaLocale_LoadIcon(IDI_CCENTER); - lpNewCPlInfo->szHelpFile[0] = '\0'; - - GetString (lpNewCPlInfo->szName, (!IsWindowsNT()) ? IDS_CPL_NAME_95 : (!IsClientInstalled()) ? IDS_CPL_NAME_CCENTER : IDS_CPL_NAME_NT); - GetString (lpNewCPlInfo->szInfo, (!IsWindowsNT()) ? IDS_CPL_DESC_95 : (!IsClientInstalled()) ? IDS_CPL_DESC_CCENTER : IDS_CPL_DESC_NT); - break; - - case CPL_DBLCLK: /* applet icon double-clicked */ - if (IsClientInstalled() || !IsWindowsNT()) - WinExec("afs_config.exe", SW_SHOW); - else - WinExec("afs_config.exe /c", SW_SHOW); - break; - - case CPL_EXIT: - if (hinstResources) - FreeLibrary (hinstResources); - break; - } - - return 0; -} - - diff --git a/src/WINNT/client_cpa/cpl_interface.h b/src/WINNT/client_cpa/cpl_interface.h deleted file mode 100644 index 6613c58d1..000000000 --- a/src/WINNT/client_cpa/cpl_interface.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* -* Exported functions. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2); - -#ifdef __cplusplus -} -#endif - - diff --git a/src/WINNT/client_cpa/lang/.cvsignore b/src/WINNT/client_cpa/lang/.cvsignore deleted file mode 100644 index 9e6d7b89d..000000000 --- a/src/WINNT/client_cpa/lang/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -AFS_component_version_number.h diff --git a/src/WINNT/client_cpa/lang/NTMakefile b/src/WINNT/client_cpa/lang/NTMakefile deleted file mode 100644 index ff6e80e41..000000000 --- a/src/WINNT/client_cpa/lang/NTMakefile +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\client_cpa\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!include ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afs_cpa_$(LANGID).dll - -RCFILE = $(LANGNAME)\afs_cpa.rc - -RESFILE = $(OUT)\afs_cpa_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - $(DEL) *.res RC* RD* $(DLLFILE) - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/client_cpa/lang/de_DE/afs_cpa.rc b/src/WINNT/client_cpa/lang/de_DE/afs_cpa.rc deleted file mode 100644 index f450901ad..000000000 --- a/src/WINNT/client_cpa/lang/de_DE/afs_cpa.rc +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "AFS Client Configuration" - IDS_CPL_DESC_NT "AFS Client Configuration" - IDS_CPL_NAME_95 "AFS Light Configuration" - IDS_CPL_DESC_95 "AFS Light Configuration" - IDS_CPL_NAME_CCENTER "AFS Control Center" - IDS_CPL_DESC_CCENTER "Merkmale für AFS Control Center" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/src/WINNT/client_cpa/lang/en_US/afs_cpa.rc b/src/WINNT/client_cpa/lang/en_US/afs_cpa.rc deleted file mode 100644 index e6ecbba0f..000000000 --- a/src/WINNT/client_cpa/lang/en_US/afs_cpa.rc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "AFS Client Configuration" - IDS_CPL_DESC_NT "AFS Client Configuration" - IDS_CPL_NAME_95 "AFS Light Configuration" - IDS_CPL_DESC_95 "AFS Light Configuration" - IDS_CPL_NAME_CCENTER "AFS Control Center" - IDS_CPL_DESC_CCENTER "AFS Control Center Properties" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_cpa/lang/es_ES/afs_cpa.rc b/src/WINNT/client_cpa/lang/es_ES/afs_cpa.rc deleted file mode 100644 index 863b9b6d2..000000000 --- a/src/WINNT/client_cpa/lang/es_ES/afs_cpa.rc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "Configuración de AFS Client" - IDS_CPL_DESC_NT "Configuración de AFS Client" - IDS_CPL_NAME_95 "Configuración de AFS Light" - IDS_CPL_DESC_95 "Configuración de AFS Light" - IDS_CPL_NAME_CCENTER "AFS Control Center" - IDS_CPL_DESC_CCENTER "Propiedades de AFS Control Center" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - - diff --git a/src/WINNT/client_cpa/lang/ja_JP/afs_cpa.rc b/src/WINNT/client_cpa/lang/ja_JP/afs_cpa.rc deleted file mode 100644 index 602e557ad..000000000 --- a/src/WINNT/client_cpa/lang/ja_JP/afs_cpa.rc +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" - IDS_CPL_DESC_NT "AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬" - IDS_CPL_NAME_95 "AFS Light \¬" - IDS_CPL_DESC_95 "AFS Light \¬" - IDS_CPL_NAME_CCENTER "AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[" - IDS_CPL_DESC_CCENTER "AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[EƒvƒƒpƒeƒB[" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_cpa/lang/ko_KR/afs_cpa.rc b/src/WINNT/client_cpa/lang/ko_KR/afs_cpa.rc deleted file mode 100644 index 427cc2a28..000000000 --- a/src/WINNT/client_cpa/lang/ko_KR/afs_cpa.rc +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" - IDS_CPL_DESC_NT "AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º" - IDS_CPL_NAME_95 "AFS ¶óÀÌÆ® ±¸¼º" - IDS_CPL_DESC_95 "AFS ¶óÀÌÆ® ±¸¼º" - IDS_CPL_NAME_CCENTER "AFS Á¦¾î ¼¾ÅÍ" - IDS_CPL_DESC_CCENTER "AFS Á¦¾î ¼¾ÅÍ Æ¯¼º" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/src/WINNT/client_cpa/lang/pt_BR/afs_cpa.rc b/src/WINNT/client_cpa/lang/pt_BR/afs_cpa.rc deleted file mode 100644 index 5eb94ebf5..000000000 --- a/src/WINNT/client_cpa/lang/pt_BR/afs_cpa.rc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "Configuração do AFS Client" - IDS_CPL_DESC_NT "Configuração do AFS Client" - IDS_CPL_NAME_95 "Configuração do AFS Básico" - IDS_CPL_DESC_95 "Configuração do AFS Básico" - IDS_CPL_NAME_CCENTER "Centro de Controle do AFS" - IDS_CPL_DESC_CCENTER "Propriedades do Centro de Controle do AFS" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - - diff --git a/src/WINNT/client_cpa/lang/zh_CN/afs_cpa.rc b/src/WINNT/client_cpa/lang/zh_CN/afs_cpa.rc deleted file mode 100644 index b3b122049..000000000 --- a/src/WINNT/client_cpa/lang/zh_CN/afs_cpa.rc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED - -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "AFS ¿Í»§»úÅäÖÃ" - IDS_CPL_DESC_NT "AFS ¿Í»§»úÅäÖÃ" - IDS_CPL_NAME_95 "AFS Light ÅäÖÃ" - IDS_CPL_DESC_95 "AFS Light ÅäÖÃ" - IDS_CPL_NAME_CCENTER "AFS ¿ØÖÆÖÐÐÄ" - IDS_CPL_DESC_CCENTER "AFS ¿ØÖÆÖÐÐÄÌØÐÔ" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/src/WINNT/client_cpa/lang/zh_TW/afs_cpa.rc b/src/WINNT/client_cpa/lang/zh_TW/afs_cpa.rc deleted file mode 100644 index b545f7bfd..000000000 --- a/src/WINNT/client_cpa/lang/zh_TW/afs_cpa.rc +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Control Panel Applet" -#define AFS_VERINFO_NAME "afs_cpa" -#define AFS_VERINFO_FILENAME "afs_cpa.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_AFSD ICON DISCARDABLE "afs_conf.ico" -IDI_CCENTER ICON DISCARDABLE "afs_ccenter.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CPL_NAME_NT "AFS ¥Î¤áºÝ¬[ºc" - IDS_CPL_DESC_NT "AFS ¥Î¤áºÝ¬[ºc" - IDS_CPL_NAME_95 "AFS Light ¬[ºc" - IDS_CPL_DESC_95 "AFS Light ¬[ºc" - IDS_CPL_NAME_CCENTER "AFS ±±¨î¤¤¤ß" - IDS_CPL_DESC_CCENTER "AFS ±±¨î¤¤¤ß¤º®e" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/src/WINNT/client_cpa/resource.h b/src/WINNT/client_cpa/resource.h deleted file mode 100644 index f8af408cf..000000000 --- a/src/WINNT/client_cpa/resource.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_CPL_NAME_NT 0 -#define IDS_CPL_DESC_NT 1 -#define IDS_CPL_NAME_95 2 -#define IDS_CPL_DESC_95 3 -#define IDS_CPL_NAME_CCENTER 4 -#define IDS_CPL_DESC_CCENTER 5 - -#define IDI_AFSD 103 -#define IDI_CCENTER 104 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 105 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/client_creds/Makefile b/src/WINNT/client_creds/Makefile deleted file mode 100644 index 36cfec813..000000000 --- a/src/WINNT/client_creds/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -AFSCLIENTROOT = q:\afs\client - -OBJS = \ - afscreds.res \ - advtab.obj \ - afswiz.obj \ - checklist.obj \ - creds.obj \ - credstab.obj \ - drivemap.obj \ - main.obj \ - misc.obj \ - mounttab.obj \ - msprintf.obj \ - settings.obj \ - shortcut.obj \ - subclass.obj \ - trayicon.obj \ - window.obj \ - wizard.obj - -LIBRARIES = \ - user32.lib \ - shell32.lib \ - comctl32.lib \ - kernel32.lib \ - advapi32.lib \ - uuid.lib \ - ole32.lib \ - gdi32.lib \ - wsock32.lib \ - mpr.lib \ - $(AFSCLIENTROOT)\obj\afsd\libafstokens.lib \ - $(AFSCLIENTROOT)\obj\afsd\libafsconf.lib - -TARGET = .\afscreds.exe - -APPVER = 4.0 -TARGETOS = BOTH -!include $(MSTOOLS)\include\win32.mak - -cflags = $(cflags) -I$(AFSCLIENTROOT)\src -cflags = $(cflags) -I$(AFSCLIENTROOT)\src\rxkad -cflags = $(cflags) -I$(AFSCLIENTROOT)\src\afsd -cflags = $(cflags) -GX -cflags = $(cflags) -DSTRICT - -guilflags = $(guilflags) -MACHINE:$(CPU) - -cflags = $(cflags) -Zi -Od -DDEBUG -D_DEBUG -DDBG -lflags = $(lflags) -debug:full - -.rc.res : - $(rc) $(rcflags) $(rcvars) $*.rc - -.cpp.obj : - $(cc) $(cflags) $(cvars) $*.cpp - - -all : $(TARGET) - -clean : - @if exist *.obj del *.obj - @if exist *.exe del *.exe - @if exist *.aps del *.aps - @if exist *.res del *.res - @if exist *.lib del *.lib - @if exist *.pdb del *.pdb - -$(TARGET) : $(OBJS) - $(link) $(guilflags) $(libcmt) $(OBJS) $(LIBRARIES) - diff --git a/src/WINNT/client_creds/NTMakefile b/src/WINNT/client_creds/NTMakefile deleted file mode 100644 index 40033383b..000000000 --- a/src/WINNT/client_creds/NTMakefile +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# include the AFSD source tree on our inclusion path - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) /D"_AFXDLL" -I..\afsd -I..\client_config -I..\kfw\inc\krb5 - -# include the primary makefile -RELDIR=WINNT\client_creds -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# -# BUILD TARGETS -# - -EXEFILE = $(DESTDIR)\root.client\usr\vice\etc\afscreds.exe - -EXEOBJS = \ - $(OUT)\advtab.obj \ - $(OUT)\afswiz.obj \ - $(OUT)\creds.obj \ - $(OUT)\main.obj \ - $(OUT)\misc.obj \ - $(OUT)\credstab.obj \ - $(OUT)\mounttab.obj \ - $(OUT)\settings.obj \ - $(OUT)\shortcut.obj \ - $(OUT)\trayicon.obj \ - $(OUT)\window.obj - -EXECOBJS = \ - $(OUT)\ipaddrchg.obj - -EXERES = \ - $(OUT)\afscreds_stub.res - -AFSDOBJS = \ - $(OUT)\fs_utils.obj - -AFSAPPLIBOBJS= \ - $(OUT)\checklist.obj \ - $(OUT)\al_wizard.obj \ - $(OUT)\subclass.obj - -CLIENTOBJS = \ - $(OUT)\drivemap.obj \ - $(OUT)\RegistrySupport.obj - -VCLIBS =\ - iphlpapi.lib \ - comctl32.lib \ - shell32.lib \ - uuid.lib \ - ole32.lib \ - mpr.lib \ - netapi32.lib - -EXELIBS = \ - $(DESTDIR)\lib\afs\afspioctl.lib \ - $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\afs\TaLocale.lib \ - $(DESTDIR)\lib\lanahelper.lib \ - $(DESTDIR)\lib\afsrxkad.lib \ - $(DESTDIR)\lib\afsdes.lib \ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\libafsconf.lib \ - $(DESTDIR)\lib\afskfw.lib - -############################################################################ -# -# EXTERNAL SOURCE FILES -# -# The following source files are required by this application, but live -# elsewhere in the tree. To prevent checking in more than one copy of the -# source files, they are copied to this directory at build-time. -# - -COPYHEADERS = \ - $(DESTDIR)\include\WINNT\al_wizard.h \ - $(DESTDIR)\include\WINNT\checklist.h \ - $(DESTDIR)\include\WINNT\subclass.h - -############################################################################ - -AFSD = ..\afsd -AFSAPPLIB=..\afsapplib -CLIENT= ..\client_config - -$(CLIENTOBJS): $(CLIENT)\$$(@B).cpp - $(C2OBJ) -I$(*D) $** - -$(AFSAPPLIBOBJS): $(AFSAPPLIB)\$$(@B).cpp - $(C2OBJ) -I$(*D) $** - -$(AFSDOBJS): $(AFSD)\$$(@B).c - $(C2OBJ) -I$(*D) $** - -$(EXEOBJS): $$(@B).cpp - $(C2OBJ) -I$(*D) -I$(AFSAPPLIB) $** - -$(EXECOBJS): $$(@B).c - $(C2OBJ) -I$(*D) -I$(AFSAPPLIB) $** - -############################################################################ - -$(EXEFILE) : $(EXEOBJS) $(EXECOBJS) $(EXERES) $(AFSAPPLIBOBJS) $(AFSDOBJS) $(CLIENTOBJS) $(EXELIBS) - $(EXEGUILINK) $(VCLIBS) - $(EXEPREP) - -install : $(COPYHEADERS) $(EXEFILE) lang - -lang :: - $(CD) lang - for /f %l in ('dir /B ??_??') do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -############################################################################ -# -# Dependencies -# - -$(OUT)\afscreds_stub.res : afscreds_stub.rc AFS_component_version_number.h - -clean:: - $(CD) lang - @if exist AFS_component_version_number.h del AFS_component_version_number.h - for /f %l in ('dir /B ??_??') do ( if exist @$(NTLANG) do @$(NTLANG) %l $(MAKECMD) /nologo /f NTMakefile clean ) - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. - diff --git a/src/WINNT/client_creds/advtab.cpp b/src/WINNT/client_creds/advtab.cpp deleted file mode 100644 index b31639531..000000000 --- a/src/WINNT/client_creds/advtab.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} -#include - -#include "afscreds.h" -#ifdef USE_KFW -#include "afskrb5.h" -#endif - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Advanced_OnInitDialog (HWND hDlg); -void Advanced_StartTimer (HWND hDlg); -void Advanced_OnServiceTimer (HWND hDlg); -void Advanced_OnOpenCPL (HWND hDlg); -void Advanced_OnChangeService (HWND hDlg, WORD wCmd); -void Advanced_OnStartup (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Advanced_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - Advanced_OnInitDialog (hDlg); - break; - - case WM_TIMER: - Advanced_OnServiceTimer (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_SERVICE_STOP: - case IDC_SERVICE_START: - case IDC_SERVICE_AUTO: - Advanced_OnChangeService (hDlg, LOWORD(wp)); - break; - - case IDC_OPEN_CPL: - Advanced_OnOpenCPL (hDlg); - break; - - case IDC_STARTUP: - Advanced_OnStartup (hDlg); - break; - - case IDHELP: - Advanced_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_ADVANCED); - break; - } - return FALSE; -} - - -void Advanced_OnInitDialog (HWND hDlg) -{ - CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup); - Advanced_OnServiceTimer (hDlg); - Advanced_StartTimer (hDlg); -} - - -void Advanced_StartTimer (HWND hDlg) -{ - KillTimer (hDlg, ID_SERVICE_TIMER); - SetTimer (hDlg, ID_SERVICE_TIMER, (ULONG)cmsecSERVICE, NULL); -} - - -void Advanced_OnServiceTimer (HWND hDlg) -{ - BOOL fFinal = TRUE; - BOOL fFound = FALSE; - - struct { - QUERY_SERVICE_CONFIG Config; - BYTE buf[1024]; - } Config; - memset (&Config, 0x00, sizeof(Config)); - Config.Config.dwStartType = SERVICE_DEMAND_START; - - SERVICE_STATUS Status; - memset (&Status, 0x00, sizeof(Status)); - Status.dwCurrentState = SERVICE_STOPPED; - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) - { - fFound = TRUE; - DWORD dwSize = sizeof(Config); - QueryServiceConfig (hService, (QUERY_SERVICE_CONFIG*)&Config, sizeof(Config), &dwSize); - QueryServiceStatus (hService, &Status); - TestAndDoMapShare(Status.dwCurrentState); - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - - if (fFound) - { - if ((Status.dwCurrentState == SERVICE_STOP_PENDING) || - (Status.dwCurrentState == SERVICE_START_PENDING)) - { - fFinal = FALSE; - } - } - - EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_START), fFound && (Status.dwCurrentState == SERVICE_STOPPED)); - EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_STOP), fFound && (Status.dwCurrentState == SERVICE_RUNNING)); - EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_AUTO), fFound); - CheckDlgButton (hDlg, IDC_SERVICE_AUTO, fFound && (Config.Config.dwStartType == SERVICE_AUTO_START)); - - TCHAR szStatus[cchRESOURCE]; - if (!fFound) - GetString (szStatus, IDS_SERVICE_BROKEN); - else if (Status.dwCurrentState == SERVICE_RUNNING) - GetString (szStatus, IDS_SERVICE_RUNNING); - else if (Status.dwCurrentState == SERVICE_STOPPED) - GetString (szStatus, IDS_SERVICE_STOPPED); - else if (Status.dwCurrentState == SERVICE_STOP_PENDING) - GetString (szStatus, IDS_SERVICE_STOPPING); - else if (Status.dwCurrentState == SERVICE_START_PENDING) - GetString (szStatus, IDS_SERVICE_STARTING); - else - GetString (szStatus, IDS_SERVICE_UNKNOWN); - TestAndDoMapShare(Status.dwCurrentState); - SetDlgItemText (hDlg, IDC_SERVICE_STATUS, szStatus); - - if (fFinal && GetWindowLong (hDlg, DWL_USER)) - { - SetWindowLong (hDlg, DWL_USER, 0); - Main_RepopulateTabs (FALSE); - } - - if (fFinal) - { - KillTimer (hDlg, ID_SERVICE_TIMER); - } -} - - -void Advanced_OnChangeService (HWND hDlg, WORD wCmd) -{ - BOOL fSuccess = FALSE; - ULONG error = 0; - SC_HANDLE hManager, hService; - - switch (wCmd) - { - case IDC_SERVICE_AUTO: - DWORD StartType; - if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS)) != NULL) - { - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), - SERVICE_CHANGE_CONFIG | SERVICE_QUERY_CONFIG | - SERVICE_QUERY_STATUS)) != NULL) - { - StartType = (IsDlgButtonChecked (hDlg, wCmd)) ? SERVICE_AUTO_START : SERVICE_DEMAND_START; - if (ChangeServiceConfig (hService, SERVICE_NO_CHANGE, StartType, - SERVICE_NO_CHANGE, 0, 0, 0, 0, 0, 0, 0)) - fSuccess = TRUE; - CloseServiceHandle (hService); - } - CloseServiceHandle (hManager); - } - break; - - case IDC_SERVICE_START: - if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS )) != NULL) - { - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), - SERVICE_QUERY_STATUS | SERVICE_START)) != NULL) - { - if (StartService (hService, 0, 0)) - { - TestAndDoMapShare(SERVICE_START_PENDING); - if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) { -#ifdef USE_MS2MIT - KFW_import_windows_lsa(); -#endif /* USE_MS2MIT */ - KFW_AFS_renew_tokens_for_all_cells(); - } - fSuccess = TRUE; - } - CloseServiceHandle (hService); - } - CloseServiceHandle (hManager); - } - break; - - case IDC_SERVICE_STOP: - if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS )) != NULL) - { - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), - SERVICE_QUERY_STATUS | SERVICE_STOP)) != NULL) - { - SERVICE_STATUS Status; - TestAndDoUnMapShare(); - ControlService (hService, SERVICE_CONTROL_STOP, &Status); - fSuccess = TRUE; - } - CloseServiceHandle (hService); - } - CloseServiceHandle (hManager); - break; - } - - if (fSuccess) - { - if (wCmd == IDC_SERVICE_STOP) - SetWindowLong (hDlg, DWL_USER, TRUE); - Advanced_OnServiceTimer (hDlg); - Advanced_StartTimer (hDlg); -#ifdef USE_KFW - if ( wCmd == IDC_SERVICE_START && KRB5_is_available() && KRB5_wait_for_service_start() ) - KRB5_AFS_renew_tokens_for_all_cells(); -#endif /* USE_KFW */ - } - else - { - if (!error) - error = GetLastError(); - - int ids; - switch (wCmd) - { - case IDC_SERVICE_START: - ids = IDS_SERVICE_FAIL_START; - break; - case IDC_SERVICE_STOP: - ids = IDS_SERVICE_FAIL_STOP; - break; - default: - ids = IDS_SERVICE_FAIL_CONFIG; - break; - } - - Message (MB_OK | MB_ICONHAND, IDS_SERVICE_ERROR, ids, TEXT("%08lX"), error); - } -} - - -void Advanced_OnOpenCPL (HWND hDlg) -{ - WinExec ("afs_config.exe", SW_SHOW); -} - - -void Advanced_OnStartup (HWND hDlg) -{ - g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP); - - HKEY hk; - if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize); - RegCloseKey (hk); - } - - Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); -} - diff --git a/src/WINNT/client_creds/advtab.h b/src/WINNT/client_creds/advtab.h deleted file mode 100644 index 8b296bd8e..000000000 --- a/src/WINNT/client_creds/advtab.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef ADVTAB_H -#define ADVTAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Advanced_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/client_creds/afscreds.h b/src/WINNT/client_creds/afscreds.h deleted file mode 100644 index 8cfd1af29..000000000 --- a/src/WINNT/client_creds/afscreds.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSCREDS_H -#define AFSCREDS_H - - -/* - * INCLUSIONS _________________________________________________________________ - * - */ - -#include -#undef REALLOC /* RT ticket 2120; So we can redefine it later */ -#include -#include -#include -#include -#include -#include -#include -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#include -#ifdef __cplusplus -} -#endif -#include "resource.h" -#include "checklist.h" -#include "window.h" -#include "shortcut.h" -#include "trayicon.h" -#include "creds.h" -#include "credstab.h" -#include "advtab.h" -#include "mounttab.h" -#include "afswiz.h" -#include "drivemap.h" -#include "help.hid" - - -/* - * REG PATHS __________________________________________________________________ - * - */ - -#define REGVAL_AFS_TITLE TEXT("Title") -#define REGVAL_AFS_VERSION TEXT("VersionString") -#define REGVAL_AFS_PATCH TEXT("PatchLevel") -#define REGVAL_AFS_PATH TEXT("PathName") - -#define cszSHORTCUT_NAME TEXT("AFS Credentials.lnk") - -#define AFSCREDS_SHORTCUT_OPTIONS TEXT("-A -M -N -Q") - -/* - * VARIABLES __________________________________________________________________ - * - */ - -typedef struct - { - TCHAR szCell[ MAX_PATH ]; - TCHAR szUser[ MAX_PATH ]; - SYSTEMTIME stExpires; - BOOL fRemind; - } CREDS, *LPCREDS; - -typedef struct - { - HWND hMain; - CREDS *aCreds; - size_t cCreds; - DWORD tickLastRetest; - LONG fShowingMessage; - LPWIZARD pWizard; - BOOL fStartup; - BOOL fIsWinNT; - TCHAR szHelpFile[ MAX_PATH ]; - osi_mutex_t expirationCheckLock; - osi_mutex_t credsLock; - TCHAR SmbName[ MAXRANDOMNAMELEN ]; - } GLOBALS; - -extern GLOBALS g; - - -/* - * TIMING _____________________________________________________________________ - * - */ - -#define cminREMIND_TEST 1 // test every minute for expired creds -#define cminREMIND_WARN 15 // warn if creds expire in 15 minutes -#define cminRENEW 20 // renew creds when there are 20 minutes remaining -#define cminMINLIFE 30 // minimum life of Kerberos creds - -#define cmsecMOUSEOVER 1000 // retest freq when mouse is over tray icon -#define cmsecSERVICE 2000 // retest freq when starting/stopping service - -#define c100ns1SECOND (LONGLONG)10000000 -#define cmsec1SECOND 1000 -#define cmsec1MINUTE 60000 -#define csec1MINUTE 60 - - -#define ID_REMIND_TIMER 1000 -#define ID_SERVICE_TIMER 1001 -#define ID_WIZARD_TIMER 1002 - - -/* - * MACROS _____________________________________________________________________ - * - */ - -#ifndef FileExists -#define FileExists(_psz) ((GetFileAttributes (_psz) == 0xFFFFFFFF) ? FALSE : TRUE) -#endif - -#ifndef THIS_HINST -#define THIS_HINST (HINSTANCE)GetModuleHandle(NULL) -#endif - -#ifndef iswhite -#define iswhite(_ch) ( ((_ch)==TEXT(' ')) || ((_ch)==TEXT('\t')) || ((_ch)==TEXT('\r')) || ((_ch)==TEXT('\n')) ) -#endif - -#ifndef cxRECT -#define cxRECT(_r) ((_r).right - (_r).left) -#endif - -#ifndef cyRECT -#define cyRECT(_r) ((_r).bottom - (_r).top) -#endif - -#ifndef REALLOC -#define REALLOC(_a,_c,_r,_i) AfsCredsReallocFunction ((LPVOID*)&_a,sizeof(*_a),&_c,_r,_i) -#endif - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Quit (void); - -BOOL AfsCredsReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc); - -void LoadRemind (size_t iCreds); -void SaveRemind (size_t iCreds); - -void TimeToSystemTime (SYSTEMTIME *pst, time_t TimeT); - -LPARAM GetTabParam (HWND hTab, int iTab); -HWND GetTabChild (HWND hTab); - - -#endif - diff --git a/src/WINNT/client_creds/afscreds.ico b/src/WINNT/client_creds/afscreds.ico deleted file mode 100644 index 1abfe161ef55895836ebcc29e8788d9ba42e2cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZvWF%E)25JexsWbL4`)zZ?0g3>FIY=H^Q-oWEfSg=R&2$UomasJY1U}paRGk>NS z$SljUL~+jGAT`K288UXp5EF0F09FjcBF5GdVtEI1oG|wZw=Hk(HCeXOBski;&yEd)=NiR$Vj1Hdp8uF+65A61RgwIv~!xz|? BJGB4+ diff --git a/src/WINNT/client_creds/afscreds_stub.rc b/src/WINNT/client_creds/afscreds_stub.rc deleted file mode 100644 index 727e9a099..000000000 --- a/src/WINNT/client_creds/afscreds_stub.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -IDI_MAIN ICON DISCARDABLE "afscreds.ico" diff --git a/src/WINNT/client_creds/afswiz.cpp b/src/WINNT/client_creds/afswiz.cpp deleted file mode 100644 index 876302aa0..000000000 --- a/src/WINNT/client_creds/afswiz.cpp +++ /dev/null @@ -1,689 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} - -#include "afscreds.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - -void WizStarting_OnInitDialog (HWND hDlg); -void WizStarting_OnTimer (HWND hDlg); - -void WizCreds_OnInitDialog (HWND hDlg); -void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE); - -void WizMount_OnInitDialog (HWND hDlg); -void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE); -BOOL WizMount_IsSubmountValid (HWND hDlg); - -void WizMounting_OnInitDialog (HWND hDlg); -void WizMounting_OnFinish (HWND hDlg); -DWORD CALLBACK WizMounting_Thread (LPVOID lp); - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct l - { - DRIVEMAPLIST List; - BOOL fQueried; - HWND hDlg; - int idh; - TCHAR szSubmountReq[ MAX_PATH ]; - } l; - - -/* - * WIZARD STATES ______________________________________________________________ - * - */ - -typedef enum - { - STEP_START, - STEP_STARTING, - STEP_CREDS, - STEP_MOUNT, - STEP_MOUNTING, - STEP_FINISH, - } WIZSTEP; - -static WIZARD_STATE aStates[] = { - { STEP_START, IDD_WIZ_START, WizStart_DlgProc, 0 }, - { STEP_STARTING, IDD_WIZ_STARTING, WizStarting_DlgProc, 0 }, - { STEP_CREDS, IDD_WIZ_CREDS, WizCreds_DlgProc, 0 }, - { STEP_MOUNT, IDD_WIZ_MOUNT, WizMount_DlgProc, 0 }, - { STEP_MOUNTING, IDD_WIZ_MOUNTING, WizMounting_DlgProc, 0 }, - { STEP_FINISH, IDD_WIZ_FINISH, WizFinish_DlgProc, 0 } -}; - -static const int cStates = sizeof(aStates) / sizeof(aStates[0]); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void ShowStartupWizard (void) -{ - if (g.pWizard != NULL) // Already showing the wizard? Stop here. - return; - - memset (&l, 0x00, sizeof(l)); - - g.pWizard = New(WIZARD); - - g.pWizard->SetDialogTemplate (IDD_WIZARD, IDC_LHS, IDC_RHS, IDBACK, IDNEXT); - g.pWizard->SetGraphic (IDB_WIZ16, IDB_WIZ256); - g.pWizard->SetStates (aStates, cStates); - g.pWizard->SetState (STEP_START); - - g.pWizard->Show(); - - Delete(g.pWizard); - g.pWizard = NULL; - - Main_RepopulateTabs (TRUE); - - FreeDriveMapList (&l.List); -} - - -BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDCANCEL: - g.pWizard->Show(FALSE); - return TRUE; - - case IDHELP: - WizCommon_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - if (l.idh) - WinHelp (GetParent(hDlg), g.szHelpFile, HELP_CONTEXT, l.idh); - break; - } - return FALSE; -} - - -BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (!WizCommon_DlgProc (hDlg, msg, wp, lp)) - { - switch (msg) - { - case WM_INITDIALOG: - g.pWizard->EnableButtons (NEXT_BUTTON); - g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT); - g.pWizard->SetDefaultControl (IDNEXT); - l.idh = IDH_AFSCREDS_WIZ_START; - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDNEXT: - g.pWizard->SetState (STEP_STARTING); - break; - - case IDC_WIZARD: - switch (HIWORD(wp)) - { - case wcIS_STATE_DISABLED: - return IsServiceRunning(); - } - break; - } - break; - } - } - - return FALSE; -} - - -BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (!WizCommon_DlgProc (hDlg, msg, wp, lp)) - { - switch (msg) - { - case WM_INITDIALOG: - g.pWizard->EnableButtons (0); - g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT); - WizStarting_OnInitDialog (hDlg); - l.idh = IDH_AFSCREDS_WIZ_START_FAIL; - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE); - break; - - case WM_TIMER: - WizStarting_OnTimer (hDlg); - break; - - case WM_DESTROY: - KillTimer (hDlg, ID_WIZARD_TIMER); - break; - - case IDC_WIZARD: - switch (HIWORD(wp)) - { - case wcIS_STATE_DISABLED: - return IsServiceRunning(); - } - break; - } - } - - return FALSE; -} - - -void WizStarting_OnInitDialog (HWND hDlg) -{ - ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW); - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, - SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), - SERVICE_QUERY_STATUS | SERVICE_START)) != NULL) - { - if (StartService (hService, 0, 0)) - TestAndDoMapShare(SERVICE_START_PENDING); - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - - SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL); - - WizStarting_OnTimer (hDlg); -} - - -void WizStarting_OnTimer (HWND hDlg) -{ - SERVICE_STATUS Status; - memset (&Status, 0x00, sizeof(Status)); - Status.dwCurrentState = SERVICE_STOPPED; - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) - { - QueryServiceStatus (hService, &Status); - CloseServiceHandle (hService); - TestAndDoMapShare(Status.dwCurrentState); - } - - CloseServiceHandle (hManager); - } - - if (Status.dwCurrentState == SERVICE_RUNNING) - { - g.pWizard->SetState (STEP_CREDS); - } - else if (Status.dwCurrentState != SERVICE_START_PENDING) - { - KillTimer (hDlg, ID_WIZARD_TIMER); - - ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW); - ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE); - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE); - } -} - - -BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (!WizCommon_DlgProc (hDlg, msg, wp, lp)) - { - switch (msg) - { - case WM_INITDIALOG: - g.pWizard->EnableButtons (NEXT_BUTTON); - g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT); - l.idh = IDH_AFSCREDS_WIZ_CREDS; - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE); - WizCreds_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDNEXT: - if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS)) - { - g.pWizard->SetState (STEP_MOUNT); - } - else - { - TCHAR szCell[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE); - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE); - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE); - - WizCreds_OnEnable (hDlg, FALSE); - - if (ObtainNewCredentials (szCell, szUser, szPassword, FALSE) == 0) - { - g.pWizard->SetState (STEP_MOUNT); - } - else - { - WizCreds_OnEnable (hDlg); - } - } - break; - - case IDC_NOCREDS: - case IDC_YESCREDS: - case IDC_NEWCREDS_CELL: - case IDC_NEWCREDS_USER: - case IDC_NEWCREDS_PASSWORD: - WizCreds_OnEnable (hDlg); - break; - } - break; - } - } - - return FALSE; -} - - -void WizCreds_OnInitDialog (HWND hDlg) -{ - HKEY hk; - - TCHAR szCell[ cchRESOURCE ] = TEXT(""); - SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell); - - TCHAR szUser[ cchRESOURCE ] = TEXT(""); - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0) - { - DWORD dwSize = sizeof(szUser); - DWORD dwType = REG_SZ; - RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize); - RegCloseKey (hk); - } - SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser); - g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD); - - CheckDlgButton (hDlg, IDC_NOCREDS, FALSE); - CheckDlgButton (hDlg, IDC_YESCREDS, TRUE); - WizCreds_OnEnable (hDlg); -} - - -void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable) -{ - BOOL fEnable = fAllowEnable; - - if (IsDlgButtonChecked (hDlg, IDC_YESCREDS)) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE); - if (!szText[0]) - fEnable = FALSE; - - GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE); - if (!szText[0]) - fEnable = FALSE; - - GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE); - if (!szText[0]) - fEnable = FALSE; - } - - g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0); - - EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable); - EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable); - - fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS); - EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable); -} - - -BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (!WizCommon_DlgProc (hDlg, msg, wp, lp)) - { - switch (msg) - { - case WM_INITDIALOG: - g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON); - g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT); - g.pWizard->SetDefaultControl (IDNEXT); - l.idh = IDH_AFSCREDS_WIZ_MOUNT; - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE); - - WizMount_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDBACK: - g.pWizard->SetState (STEP_CREDS); - break; - - case IDNEXT: - if (IsDlgButtonChecked (hDlg, IDC_YESMAP)) - { - if (!WizMount_IsSubmountValid (hDlg)) - { - Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC); - break; - } - int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0); - int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0); - l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive; - l.List.aDriveMap[ iDrive ].fActive = FALSE; - l.List.aDriveMap[ iDrive ].fPersistent = TRUE; - GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH); - GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH); - WriteDriveMappings (&l.List); - } - g.pWizard->SetState (STEP_MOUNTING); - break; - - case IDC_NOMAP: - case IDC_YESMAP: - case IDC_MAP_PATH: - WizMount_OnEnable (hDlg); - break; - } - break; - } - } - - return FALSE; -} - - -void WizMount_OnInitDialog (HWND hDlg) -{ - QueryDriveMapList (&l.List); - - size_t cMap = 0; - for (size_t iDrive = 0; iDrive < 26; ++iDrive) - { - if (l.List.aDriveMap[iDrive].szMapping[0]) - ++cMap; - } - - if (cMap) - { - g.pWizard->SetState (STEP_MOUNTING); - return; - } - - // Fill in the combo box - // - DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used - - int iItemSel = -1; - HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER); - SendMessage (hCombo, WM_SETREDRAW, FALSE, 0); - - for (int ii = 0; ii < 26; ++ii) - { - if (!(dwDrives & (1<EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON)); - - fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP)); - - EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable); - EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable); -} - - -BOOL WizMount_IsSubmountValid (HWND hDlg) -{ - TCHAR szSubmount[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH); - - if (!szSubmount[0]) - return TRUE; - - return IsValidSubmountName (szSubmount); -} - - -BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (!WizCommon_DlgProc (hDlg, msg, wp, lp)) - { - switch (msg) - { - case WM_INITDIALOG: - g.pWizard->EnableButtons (0); - g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT); - g.pWizard->SetDefaultControl (IDNEXT); - l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL; - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE); - WizMounting_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDNEXT: - g.pWizard->SetState (STEP_FINISH); - break; - - case IDC_MAP_FINISH: - WizMounting_OnFinish (hDlg); - break; - - case IDC_NOMAP: - case IDC_YESMAP: - case IDC_MAP_PATH: - WizMount_OnEnable (hDlg); - break; - - case IDC_WIZARD: - switch (HIWORD(wp)) - { - case wcIS_STATE_DISABLED: - size_t ii; - for (ii = 0; ii < 26; ++ii) - { - if (!l.List.aDriveMap[ ii ].szMapping[0]) - continue; - if (l.List.aDriveMap[ ii ].fActive) - continue; - return FALSE; - } - return TRUE; - } - break; - } - break; - } - } - - return FALSE; -} - - -void WizMounting_OnInitDialog (HWND hDlg) -{ - l.hDlg = hDlg; - ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW); - ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE); - - DWORD idThread; - CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread); -} - - -void WizMounting_OnFinish (HWND hDlg) -{ - FreeDriveMapList (&l.List); - QueryDriveMapList (&l.List); - - size_t cInactive = 0; - for (size_t iDrive = 0; iDrive < 26; ++iDrive) - { - if (!l.List.aDriveMap[iDrive].szMapping[0]) - continue; - if (l.List.aDriveMap[iDrive].fActive) - continue; - ++cInactive; - } - - if (!cInactive) - { - g.pWizard->SetState (STEP_FINISH); - } - else - { - ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE); - ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW); - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE); - } -} - - -DWORD CALLBACK WizMounting_Thread (LPVOID lp) -{ - size_t cInactive = 0; - for (size_t iDrive = 0; iDrive < 26; ++iDrive) - { - if (!l.List.aDriveMap[iDrive].szMapping[0]) - continue; - if (l.List.aDriveMap[iDrive].fActive) - continue; - - DWORD status; - (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status); - l.szSubmountReq[0] = TEXT('\0'); - } - - PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0); - return 0; -} - - -BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - if (!WizCommon_DlgProc (hDlg, msg, wp, lp)) - { - switch (msg) - { - case WM_INITDIALOG: - g.pWizard->EnableButtons (NEXT_BUTTON); - g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH); - g.pWizard->SetDefaultControl (IDNEXT); - EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE); - EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDNEXT: - g.pWizard->Show (FALSE); - break; - } - break; - } - } - - return FALSE; -} - diff --git a/src/WINNT/client_creds/afswiz.h b/src/WINNT/client_creds/afswiz.h deleted file mode 100644 index 9d60b3635..000000000 --- a/src/WINNT/client_creds/afswiz.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef AFSWIZ_H -#define AFSWIZ_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowStartupWizard (void); - - -#endif - diff --git a/src/WINNT/client_creds/creds.cpp b/src/WINNT/client_creds/creds.cpp deleted file mode 100644 index 4c76ee8ba..000000000 --- a/src/WINNT/client_creds/creds.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -#include -#include -#include -#include -#include "ipaddrchg.h" -} - -#include "afscreds.h" -#include - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define cREALLOC_CREDS 4 - -#define cszLIBTOKENS TEXT("afsauthent.dll") -#define cszLIBCONF TEXT("libafsconf.dll") - - -/* - * DYNAMIC LINKING ____________________________________________________________ - * - */ - -extern "C" { - typedef unsigned int (*initAFSDirPath_t)(void); - typedef int (*ka_Init_t)(int flags); - typedef int (*rx_Init_t)(int port); - typedef int (*ktc_GetToken_t)(struct ktc_principal *server, struct ktc_token *token, int tokenLen, struct ktc_principal *client); - typedef int (*ktc_ListTokens_t)(int cellNum, int *cellNumP, struct ktc_principal *serverName); - typedef int (*ktc_ForgetToken_t)(struct ktc_principal *server); - typedef int (*ka_UserAuthenticateGeneral_t)(int flags, char *name, char *instance, char *realm, char *password, int lifetime, int *password_expiresP, int spare, char **reasonP); - typedef long (*cm_GetRootCellName_t)(char *namep); - typedef int (*ka_ParseLoginName_t)(char *login, char *name, char *inst, char *cell); -} - -static struct l - { - HINSTANCE hInstLibTokens; - HINSTANCE hInstLibConf; - - initAFSDirPath_t initAFSDirPathP; - ka_Init_t ka_InitP; - rx_Init_t rx_InitP; - ktc_GetToken_t ktc_GetTokenP; - ktc_ListTokens_t ktc_ListTokensP; - ktc_ForgetToken_t ktc_ForgetTokenP; - ka_UserAuthenticateGeneral_t ka_UserAuthenticateGeneralP; - ka_ParseLoginName_t ka_ParseLoginNameP; - cm_GetRootCellName_t cm_GetRootCellNameP; - } l; - -#define initAFSDirPath (*l.initAFSDirPathP) -#define ka_Init (*l.ka_InitP) -#define rx_Init (*l.rx_InitP) -#define ktc_GetToken (*l.ktc_GetTokenP) -#define ktc_ListTokens (*l.ktc_ListTokensP) -#define ktc_ForgetToken (*l.ktc_ForgetTokenP) -#define ka_UserAuthenticateGeneral (*l.ka_UserAuthenticateGeneralP) -#define cm_GetRootCellName (*l.cm_GetRootCellNameP) - - -BOOL Creds_OpenLibraries (void) -{ - if (!l.hInstLibTokens) - { - if ((l.hInstLibTokens = LoadLibrary (cszLIBTOKENS)) != NULL) - { - l.initAFSDirPathP = (initAFSDirPath_t)GetProcAddress (l.hInstLibTokens, "initAFSDirPath"); - l.ka_InitP = (ka_Init_t)GetProcAddress (l.hInstLibTokens, "ka_Init"); - l.rx_InitP = (rx_Init_t)GetProcAddress (l.hInstLibTokens, "rx_Init"); - l.ktc_GetTokenP = (ktc_GetToken_t)GetProcAddress (l.hInstLibTokens, "ktc_GetToken"); - l.ktc_ListTokensP = (ktc_ListTokens_t)GetProcAddress (l.hInstLibTokens, "ktc_ListTokens"); - l.ktc_ForgetTokenP = (ktc_ForgetToken_t)GetProcAddress (l.hInstLibTokens, "ktc_ForgetToken"); - l.ka_ParseLoginNameP = (ka_ParseLoginName_t)GetProcAddress (l.hInstLibTokens, "ka_ParseLoginName"); - l.ka_UserAuthenticateGeneralP = (ka_UserAuthenticateGeneral_t)GetProcAddress (l.hInstLibTokens, "ka_UserAuthenticateGeneral"); - - if (!l.initAFSDirPathP || - !l.ka_InitP || - !l.rx_InitP || - !l.ktc_GetTokenP || - !l.ktc_ListTokensP || - !l.ktc_ForgetTokenP || - !l.ka_ParseLoginNameP || - !l.ka_UserAuthenticateGeneralP) - { - FreeLibrary (l.hInstLibTokens); - l.hInstLibTokens = NULL; - } - else - { - rx_Init(0); - initAFSDirPath(); - ka_Init(0); - } - } - } - - if (!l.hInstLibConf) - { - if ((l.hInstLibConf = LoadLibrary (cszLIBCONF)) != NULL) - { - l.cm_GetRootCellNameP = (cm_GetRootCellName_t)GetProcAddress (l.hInstLibConf, "cm_GetRootCellName"); - - if (!l.cm_GetRootCellNameP) - { - FreeLibrary (l.hInstLibConf); - l.hInstLibConf = NULL; - } - } - } - - return l.hInstLibTokens && l.hInstLibConf; -} - - -void Creds_CloseLibraries (void) -{ - if (l.hInstLibTokens) - { - FreeLibrary (l.hInstLibTokens); - l.hInstLibTokens = NULL; - } - - if (l.hInstLibConf) - { - FreeLibrary (l.hInstLibConf); - l.hInstLibConf = NULL; - } -} - - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void GetGatewayName (LPTSTR pszGateway) -{ - *pszGateway = TEXT('\0'); - HKEY hk; - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), &hk) == 0) - { - DWORD dwSize = MAX_PATH; - DWORD dwType = REG_SZ; - - if (RegQueryValueEx (hk, TEXT("Gateway"), NULL, &dwType, (PBYTE)pszGateway, &dwSize) != 0) - *pszGateway = TEXT('\0'); - - RegCloseKey (hk); - } -} - - -BOOL IsServiceRunning (void) -{ - if (g.fIsWinNT) - { - SERVICE_STATUS Status; - memset (&Status, 0x00, sizeof(Status)); - Status.dwCurrentState = SERVICE_STOPPED; - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) - { - QueryServiceStatus (hService, &Status); - CloseServiceHandle (hService); - } else if ( IsDebuggerPresent() ) - OutputDebugString("Unable to open Transarc AFS Daemon Service\n"); - - CloseServiceHandle (hManager); - } else if ( IsDebuggerPresent() ) - OutputDebugString("Unable to open SC Manager\n"); - - return (Status.dwCurrentState == SERVICE_RUNNING); - } - - TCHAR szGateway[ MAX_PATH ]; - GetGatewayName (szGateway); - return (szGateway[0]) ? TRUE : FALSE; -} - - -BOOL IsServicePersistent (void) -{ - struct { - QUERY_SERVICE_CONFIG Config; - BYTE buf[1024]; - } Config; - memset (&Config, 0x00, sizeof(Config)); - Config.Config.dwStartType = SERVICE_AUTO_START; - - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT(AFSREG_CLT_SVC_NAME), GENERIC_READ)) != NULL) - { - DWORD dwSize = sizeof(Config); - QueryServiceConfig (hService, (QUERY_SERVICE_CONFIG*)&Config, sizeof(Config), &dwSize); - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - - return (Config.Config.dwStartType == SERVICE_AUTO_START) ? TRUE : FALSE; -} - - -BOOL IsServiceConfigured (void) -{ - BOOL rc = FALSE; - HKEY hk; - - if (!g.fIsWinNT) - { - rc = TRUE; - } - else if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), &hk) == 0) - { - TCHAR szCell[ MAX_PATH ]; - DWORD dwSize = sizeof(szCell); - DWORD dwType = REG_SZ; - - if (RegQueryValueEx (hk, TEXT("Cell"), NULL, &dwType, (PBYTE)szCell, &dwSize) == 0) - { - if (szCell[0] != TEXT('\0')) - rc = TRUE; - } - - RegCloseKey (hk); - } - - return rc; -} - - -int GetCurrentCredentials (void) -{ - int rc = KTC_NOCM; - - lock_ObtainMutex(&g.credsLock); - - // Free any knowledge we currently have about the user's credentials - // - if (g.aCreds) - Free (g.aCreds); - g.aCreds = NULL; - g.cCreds = 0; - g.tickLastRetest = GetTickCount(); - - // Start enumerating tokens. - // - if (!Creds_OpenLibraries()) - { - rc = ERROR_DLL_INIT_FAILED; - } - else if (IsServiceRunning()) - { - for (int iCell = 0; ; ) - { - struct ktc_principal Principal; - if ((rc = ktc_ListTokens (iCell, &iCell, &Principal)) != 0) - break; - - struct ktc_token Token; - struct ktc_principal ClientName; - if ((rc = ktc_GetToken (&Principal, &Token, sizeof(Token), &ClientName)) != 0) - break; - - // Translate what we found about the user's creds in this particular - // cell into something readable. - // - TCHAR szCell[ 256 ]; - CopyAnsiToString (szCell, Principal.cell); - if (!szCell[0]) - continue; - - TCHAR szUser[ 256 ]; - CopyAnsiToString (szUser, ClientName.name); - if (ClientName.instance[0]) - { - lstrcat (szUser, TEXT(".")); - CopyAnsiToString (&szUser[ lstrlen(szUser) ], ClientName.instance); - } - - SYSTEMTIME stExpires; - TimeToSystemTime (&stExpires, Token.endTime); - - // We've found out that the user has--or perhaps recently had-- - // credentials within a certain cell under the certain name. - // Stick that knowledge in our g.aCreds array. - // - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (!lstrcmpi (g.aCreds[ iCreds ].szCell, szCell)) - break; - } - if (iCreds == g.cCreds) - { - for (iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (!g.aCreds[ iCreds ].szCell[0]) - break; - } - if (!REALLOC (g.aCreds, g.cCreds, 1+iCreds, cREALLOC_CREDS)) - break; - } - - lstrcpy (g.aCreds[ iCreds ].szCell, szCell); - lstrcpy (g.aCreds[ iCreds ].szUser, szUser); - memcpy (&g.aCreds[ iCreds ].stExpires, &stExpires, sizeof(SYSTEMTIME)); - LoadRemind (iCreds); - } - } - - lock_ReleaseMutex(&g.credsLock); - - // We've finished updating g.aCreds. Update the tray icon to reflect - // whether the user currently has any credentials at all, and - // re-enable the Remind timer. - // - ChangeTrayIcon (NIM_MODIFY); - return rc; -} - - -int DestroyCurrentCredentials (LPCTSTR pszCell) -{ - int rc = KTC_NOCM; - - if (!Creds_OpenLibraries()) - { - rc = ERROR_DLL_INIT_FAILED; - } - else if (IsServiceRunning()) - { - struct ktc_principal Principal; - memset (&Principal, 0x00, sizeof(Principal)); - CopyStringToAnsi (Principal.cell, pszCell); - CopyStringToAnsi (Principal.name, TEXT("afs")); - rc = ktc_ForgetToken (&Principal); - if ( KFW_is_available() ) - KFW_AFS_destroy_tickets_for_cell(Principal.cell); - } - - if (rc != 0) - { - int idsTitle = (g.fIsWinNT) ? IDS_ERROR_TITLE : IDS_ERROR_TITLE_95; - int idsDesc = (!g.fIsWinNT) ? IDS_ERROR_DESTROY_95 : (rc == KTC_NOCM) ? IDS_ERROR_DESTROY_NOCM : IDS_ERROR_DESTROY_UNKNOWN; - Message (MB_ICONHAND | MB_OK, idsTitle, idsDesc, TEXT("%s%ld"), pszCell, rc); - } - - return rc; -} - - -int ObtainNewCredentials (LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, BOOL Silent) -{ - int rc = KTC_NOCM; - char *Result = NULL; - - if (!Creds_OpenLibraries()) - { - rc = ERROR_DLL_INIT_FAILED; - } - else if (IsServiceRunning()) - { - char szCellA[ 256 ]; - CopyStringToAnsi (szCellA, pszCell); - - char szNameA[ 256 ]; - CopyStringToAnsi (szNameA, pszUser); - - char szPasswordA[ 256 ]; - CopyStringToAnsi (szPasswordA, pszPassword); - - char szSmbNameA[ MAXRANDOMNAMELEN ]; - CopyStringToAnsi (szSmbNameA, g.SmbName); - - int Expiration = 0; - - if ( KFW_is_available() ) { - // KFW_AFS_get_cred() parses the szNameA field as complete princial including potentially - // a different realm then the specified cell name. - rc = KFW_AFS_get_cred(szNameA, szCellA, szPasswordA, 0, szSmbNameA[0] ? szSmbNameA : NULL, &Result); - } else { - char name[sizeof(szNameA)]; - char instance[sizeof(szNameA)]; - char cell[sizeof(szNameA)]; - - name[0] = '\0'; - instance[0] = '\0'; - cell[0] = '\0'; - ka_ParseLoginName(szNameA, name, instance, cell); - - if ( szSmbNameA[0] ) { - rc = ka_UserAuthenticateGeneral2(KA_USERAUTH_VERSION+KA_USERAUTH_AUTHENT_LOGON, - name, instance, szCellA, szPasswordA, szSmbNameA, 0, &Expiration, 0, &Result); - } else { - rc = ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION, name, instance, szCellA, szPasswordA, 0, &Expiration, 0, &Result); - } - } - } - - if (!Silent && rc != 0) - { - int idsTitle = (g.fIsWinNT) ? IDS_ERROR_TITLE : IDS_ERROR_TITLE_95; - int idsDesc = (g.fIsWinNT) ? IDS_ERROR_OBTAIN : IDS_ERROR_OBTAIN_95; - Message (MB_ICONHAND | MB_OK, idsTitle, idsDesc, TEXT("%s%s%s%ld"), pszCell, pszUser, (Result) ? Result : TEXT(""), rc); - } - - return rc; -} - - -int GetDefaultCell (LPTSTR pszCell) -{ - int rc = KTC_NOCM; - *pszCell = TEXT('\0'); - - if (!Creds_OpenLibraries()) - { - rc = ERROR_DLL_INIT_FAILED; - } - else if (IsServiceRunning()) - { - char szCellA[ cchRESOURCE ] = ""; - int rc; - HKEY hk; - - if (RegOpenKey (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), &hk) == 0) - { - DWORD dwSize = sizeof(szCellA); - DWORD dwType = REG_SZ; - RegQueryValueEx (hk, TEXT("Authentication Cell"), NULL, &dwType, (PBYTE)szCellA, &dwSize); - RegCloseKey (hk); - } - - if (szCellA[0] == '\0') { - rc = cm_GetRootCellName (szCellA); - } else { - rc = 0; - } - if (rc == 0) - CopyAnsiToString(pszCell, szCellA); - } - return rc; -} - diff --git a/src/WINNT/client_creds/creds.h b/src/WINNT/client_creds/creds.h deleted file mode 100644 index f1ea6aeb3..000000000 --- a/src/WINNT/client_creds/creds.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CREDS_H -#define CREDS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL IsServiceRunning (void); -BOOL IsServicePersistent (void); -BOOL IsServiceConfigured (void); - -int GetCurrentCredentials (void); - -int DestroyCurrentCredentials (LPCTSTR pszCell); - -int ObtainNewCredentials (LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, BOOL Silent); - -int GetDefaultCell (LPTSTR pszCell); - -void GetGatewayName (LPTSTR pszGateway); - -BOOL Creds_OpenLibraries (void); -void Creds_CloseLibraries (void); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/WINNT/client_creds/creds_1.ico b/src/WINNT/client_creds/creds_1.ico deleted file mode 100644 index 1abfe161ef55895836ebcc29e8788d9ba42e2cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZvWF%E)25JexsWbL4`)zZ?0g3>FIY=H^Q-oWEfSg=R&2$UomasJY1U}paRGk>NS z$SljUL~+jGAT`K288UXp5EF0F09FjcBF5GdVtEI1oG|wZw=Hk(HCeXOBski;&yEd)=NiR$Vj1Hdp8uF+65A61RgwIv~!xz|? BJGB4+ diff --git a/src/WINNT/client_creds/creds_2.ico b/src/WINNT/client_creds/creds_2.ico deleted file mode 100644 index ad062bc56553c69fcedb0ea9f2db0feb3d26f978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZusu?oU45PhXW+?vT*aB(bj=x+rwMCoAg2OOne(!rq_1V2aDA{gIY7m?oGdoTAc zfeTPDt+kNY7r;i85NAsiSdoFGyhJ0w!Z^-C<`F3+#27iqTF6;W1XC;_Lqp=|RI2`} zI`zHxzCoTsXiZaNa>18gbO@#ueLHBMUl?kfTy^U@ed|nI)WdrAP0+E@lPf%kbIF!} Tmq>rO)Bo&#z`L1y=L_%!^wC8m diff --git a/src/WINNT/client_creds/creds_3.ico b/src/WINNT/client_creds/creds_3.ico deleted file mode 100644 index 3feff617fd0116045e728a4f1db88dc368415e1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZusF%E+;3_L`ou)$OqD|P7@iGgoXWuOvEMz)Fx_%YgDb3bEQd*Ufnu&s?qtBPc4kbg0SGB<;b(|DZEnIUA<+Suevyn f^yU)=c~lBm{@t^+gv3C+h!6em`48L;ins$m<(oo& diff --git a/src/WINNT/client_creds/credstab.cpp b/src/WINNT/client_creds/credstab.cpp deleted file mode 100644 index d9ac53ea4..000000000 --- a/src/WINNT/client_creds/credstab.cpp +++ /dev/null @@ -1,418 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afscreds.h" - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Creds_OnUpdate (HWND hDlg); -void Creds_OnCheckRemind (HWND hDlg); -void Creds_OnClickObtain (HWND hDlg); -void Creds_OnClickDestroy (HWND hDlg); - -BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void NewCreds_OnInitDialog (HWND hDlg); -void NewCreds_OnEnable (HWND hDlg); -BOOL NewCreds_OnOK (HWND hDlg); -void NewCreds_OnCancel (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Creds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - SetWindowLong (hDlg, DWL_USER, lp); - Creds_OnUpdate (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_CREDS_REMIND: - Creds_OnCheckRemind (hDlg); - break; - - case IDC_CREDS_OBTAIN: - Creds_OnClickObtain (hDlg); - break; - - case IDC_CREDS_DESTROY: - Creds_OnClickDestroy (hDlg); - break; - - case IDHELP: - Creds_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - if (IsWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND))) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_TOKENS); - else if (IsServiceRunning()) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_NOTOKENS_RUNNING); - else // (!IsServiceRunning()) - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_NOTOKENS_STOPPED); - break; - } - - return FALSE; -} - - -void Creds_OnCheckRemind (HWND hDlg) -{ - LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER); - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell)) - break; - } - - if (iCreds != g.cCreds) - { - g.aCreds[ iCreds ].fRemind = IsDlgButtonChecked (hDlg, IDC_CREDS_REMIND); - SaveRemind (iCreds); - } - lock_ReleaseMutex(&g.credsLock); -} - - -void Creds_OnUpdate (HWND hDlg) -{ - LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER); - if (!pszCell || !*pszCell) - { - BOOL fRunning = IsServiceRunning(); - ShowWindow (GetDlgItem (hDlg, IDC_RUNNING), fRunning); - ShowWindow (GetDlgItem (hDlg, IDC_STOPPED), !fRunning); - ShowWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), fRunning); - return; - } - - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell)) - break; - } - - TCHAR szGateway[cchRESOURCE] = TEXT(""); - if (!g.fIsWinNT) - GetGatewayName (szGateway); - - if (!szGateway[0]) - { - SetDlgItemText (hDlg, IDC_CREDS_CELL, pszCell); - } - else - { - TCHAR szCell[ cchRESOURCE ]; - TCHAR szFormat[ cchRESOURCE ]; - GetString (szFormat, IDS_CELL_GATEWAY); - wsprintf (szCell, szFormat, pszCell, szGateway); - SetDlgItemText (hDlg, IDC_CREDS_CELL, szCell); - } - - if (iCreds == g.cCreds) - { - TCHAR szText[cchRESOURCE]; - GetString (szText, IDS_NO_CREDS); - SetDlgItemText (hDlg, IDC_CREDS_INFO, szText); - } - else - { - // FormatString(%t) expects a date in GMT, not the local time zone... - // - FILETIME ftLocal; - SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftLocal); - - FILETIME ftGMT; - LocalFileTimeToFileTime (&ftLocal, &ftGMT); - - SYSTEMTIME stGMT; - FileTimeToSystemTime (&ftGMT, &stGMT); - - LPTSTR pszCreds = FormatString (IDS_CREDS, TEXT("%s%t"), g.aCreds[ iCreds ].szUser, &stGMT); - SetDlgItemText (hDlg, IDC_CREDS_INFO, pszCreds); - FreeString (pszCreds); - } - - lock_ReleaseMutex(&g.credsLock); - CheckDlgButton (hDlg, IDC_CREDS_REMIND, (iCreds == g.cCreds) ? FALSE : g.aCreds[iCreds].fRemind); - - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), IsServiceRunning()); - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND), (iCreds != g.cCreds)); - EnableWindow (GetDlgItem (hDlg, IDC_CREDS_DESTROY), (iCreds != g.cCreds)); -} - - -void Creds_OnClickObtain (HWND hDlg) -{ - LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER); - - InterlockedIncrement (&g.fShowingMessage); - ShowObtainCreds (FALSE, pszCell); -} - - -void Creds_OnClickDestroy (HWND hDlg) -{ - LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER); - if (pszCell && *pszCell) - { - DestroyCurrentCredentials (pszCell); - Main_RepopulateTabs (FALSE); - Creds_OnUpdate (hDlg); - } -} - - -struct _obtaincreds { - DWORD type; - HWND parent; - char * cell; -}; - -void ObtainCredsThread(void * data) -{ - struct _obtaincreds * oc = (struct _obtaincreds *)data; - - ModalDialogParam (oc->type, oc->parent, (DLGPROC)NewCreds_DlgProc, (LPARAM)oc->cell); - free(oc->cell); - free(oc); -} - -void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell) -{ - struct _obtaincreds * oc = (struct _obtaincreds *)malloc(sizeof(struct _obtaincreds)); - if ( !oc ) - return; - oc->parent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL; - oc->type = fExpiring ? IDD_NEWCREDS_EXPIRE : IDD_NEWCREDS; - oc->cell = _strdup(pszCell); - - HANDLE thread = 0; - ULONG threadID = 123; - - thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)ObtainCredsThread, - oc, 0, &threadID); - if (thread != NULL) - CloseHandle(thread); - else { - free(oc->cell); - free(oc); - } -} - - -BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - NewCreds_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - InterlockedDecrement (&g.fShowingMessage); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - if (NewCreds_OnOK (hDlg)) - EndDialog (hDlg, IDOK); - break; - - case IDCANCEL: - NewCreds_OnCancel (hDlg); - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_NEWCREDS_USER: - case IDC_NEWCREDS_PASSWORD: - NewCreds_OnEnable (hDlg); - break; - - case IDHELP: - NewCreds_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_NEWTOKENS); - break; - } - return FALSE; -} - - -void NewCreds_OnInitDialog (HWND hDlg) -{ - LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER); - if (!pszCell) - pszCell = TEXT(""); - - if (GetDlgItem (hDlg, IDC_NEWCREDS_TITLE)) - { - TCHAR szText[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, szText, cchRESOURCE); - LPTSTR pszText = FormatString (szText, TEXT("%s"), pszCell); - SetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, pszText); - FreeString (pszText); - } - - if (pszCell && *pszCell) - { - SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, pszCell); - } - else - { - TCHAR szCell[ cchRESOURCE ] = TEXT(""); - (void)GetDefaultCell (szCell); - SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell); - } - - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (*pszCell && !lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell)) - break; - } - if ((iCreds == g.cCreds) || (!g.aCreds[ iCreds ].szUser[0])) - { - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE); - } - else // (we have a valid username already) - { - SetDlgItemText (hDlg, IDC_NEWCREDS_USER, g.aCreds[ iCreds ].szUser); - PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE); - } - lock_ReleaseMutex(&g.credsLock); - - NewCreds_OnEnable (hDlg); - SetForegroundWindow(hDlg); - KillTimer (g.hMain, ID_SERVICE_TIMER); -} - - -void NewCreds_OnEnable (HWND hDlg) -{ - BOOL fEnable = TRUE; - - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE); - if (!szUser[0]) - fEnable = FALSE; - - if ( !strchr(szUser, '@') ) { - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE); - if (!szPassword[0]) - fEnable = FALSE; - } - EnableWindow (GetDlgItem (hDlg, IDOK), fEnable); -} - - -BOOL NewCreds_OnOK (HWND hDlg) -{ - TCHAR szCell[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE); - - TCHAR szUser[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE); - - TCHAR szPassword[ cchRESOURCE ]; - GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE); - - int rc; - if ((rc = ObtainNewCredentials (szCell, szUser, szPassword, FALSE)) != 0) - { - EnableWindow (GetDlgItem (hDlg, IDOK), TRUE); - EnableWindow (GetDlgItem (hDlg, IDCANCEL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE); - EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE); - return FALSE; - } - - Main_RepopulateTabs (FALSE); - return TRUE; -} - - -void NewCreds_OnCancel (HWND hDlg) -{ - TCHAR szText[ cchRESOURCE ] = ""; - LPTSTR pszCell = NULL; - - if (GetDlgItem (hDlg, IDC_NEWCREDS_CELL)) - { - GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE); - if ( szText[0] ) - pszCell = szText; - } - - if ( !pszCell ) - pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER); - if (pszCell) - { - HWND hTab = GetDlgItem (g.hMain, IDC_TABS); - LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab)); - HWND hChildDlg = NULL; - - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell)) - { - g.aCreds[ iCreds ].fRemind = FALSE; - SaveRemind (iCreds); - - // Check the active tab, and fix its checkbox if necessary - // - if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell))) - { - hChildDlg = GetTabChild (hTab); - } - } - } - lock_ReleaseMutex(&g.credsLock); - - if (hChildDlg) - CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE); - } -} - diff --git a/src/WINNT/client_creds/credstab.h b/src/WINNT/client_creds/credstab.h deleted file mode 100644 index c09adade7..000000000 --- a/src/WINNT/client_creds/credstab.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef CREDSTAB_H -#define CREDSTAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell); - -BOOL CALLBACK Creds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/client_creds/help.hid b/src/WINNT/client_creds/help.hid deleted file mode 100644 index c05e0da8a..000000000 --- a/src/WINNT/client_creds/help.hid +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* - *** Overview Topics - * - */ - - // The following topics pertain to the Tokens tab - // -#define IDH_AFSCREDS_TAB_TOKENS 2000 -#define IDH_AFSCREDS_TAB_NOTOKENS_RUNNING 2001 -#define IDH_AFSCREDS_TAB_NOTOKENS_STOPPED 2002 - - // The following topic pertains to the Drive Letters tab - // -#define IDH_AFSCREDS_TAB_DRIVES 2100 - - // The following topic pertains to the Advanced tab - // -#define IDH_AFSCREDS_TAB_ADVANCED 2200 - - // The following topic pertains to the Map Drive Letter dialog - // -#define IDH_AFSCREDS_MAPDRIVE 2300 - - // The following topic pertains to the Obtain New Tokens dialog - // -#define IDH_AFSCREDS_NEWTOKENS 2400 - - // The following topics pertain to the startup wizard - // -#define IDH_AFSCREDS_WIZ_START 2500 -#define IDH_AFSCREDS_WIZ_START_FAIL 2501 -#define IDH_AFSCREDS_WIZ_CREDS 2502 -#define IDH_AFSCREDS_WIZ_MOUNT 2503 -#define IDH_AFSCREDS_WIZ_MOUNT_FAIL 2504 - diff --git a/src/WINNT/client_creds/ipaddrchg.c b/src/WINNT/client_creds/ipaddrchg.c deleted file mode 100644 index 03feba3d7..000000000 --- a/src/WINNT/client_creds/ipaddrchg.c +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (c) 2003 SkyRope, LLC - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of Skyrope, LLC nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission from Skyrope, LLC. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Portions of this code are derived from portions of the MIT - * Leash Ticket Manager and LoadFuncs utilities. For these portions the - * following copyright applies. - * - * Copyright (c) 2003,2004 by the Massachusetts Institute of Technology. - * All rights reserved. - * - * Export of this software from the United States of America may - * require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. Furthermore if you modify this software you must label - * your software as modified software and not distribute it in such a - * fashion that it might be confused with the original M.I.T. software. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - * - */ - -// IP Change Monitoring Functions - -#include -#include -#include -#include -#include - -#define USE_MS2MIT -#define USE_KRB4 -#include -#include -#include -#include -#include "ipaddrchg.h" -#include "creds.h" -#include -#include - -#define MAXCELLCHARS 64 - -#ifdef USE_FSPROBE -// Cell Accessibility Functions -// based on work originally submitted to the CMU Computer Club -// by Jeffrey Hutzelman -// -// These would work great if the fsProbe interface had been -// ported to Windows - -static -void probeComplete() -{ - fsprobe_Cleanup(1); - rx_Finalize(); -} - -struct ping_params { - unsigned short port; // in - int retry_delay; // in seconds - int verbose; // in - struct { - int wait; // in seconds - int retry; // in attempts - } host; - int max_hosts; // in - int hosts_attempted; // out -} - -// the fsHandler is where we receive the answer to the probe -static -int fsHandler(void) -{ - ping_count = fsprobe_Results.probeNum; - if (!*fsprobe_Results.probeOK) - { - ok_count++; - if (waiting) complete(); - } - if (ping_count == retry) - complete(); - return 0; -} - -// ping_fs is a callback routine meant to be called from within -// cm_SearchCellFile() or cm_SearchCellDNS() -static long -pingFS(void *ping_params, struct sockaddr_in *addrp, char *namep) -{ - int rc; - struct ping_params * pp = (struct ping_params *) ping_params; - - if ( pp->max_hosts && pp->hosts_attempted >= pp->max_hosts ) - return 0; - - pp->hosts_attempted++; - - if (pp->port && addrp->sin_port != htons(pp->port)) - addrp->sin_port = htons(pp->port); - - rc = fsprobe_Init(1, addrp, pp->retry_delay, fsHandler, pp->verbose); - if (rc) - { - fprintf(stderr, "fsprobe_Init failed (%d)\n", rc); - fsprobe_Cleanup(1); - return 0; - } - - for (;;) - { - tv.tv_sec = pp->host.wait; - tv.tv_usec = 0; - if (IOMGR_Select(0, 0, 0, 0, &tv)) - break; - } - probeComplete(); - return(0); -} - - -static BOOL -pingCell(char *cell) -{ - int rc; - char rootcell[MAXCELLCHARS+1]; - char newcell[MAXCELLCHARS+1]; - struct ping_params pp; - - memset(&pp, 0, sizeof(struct ping_params)); - - if (!cell || strlen(cell) == 0) { - /* WIN32 NOTE: no way to get max chars */ - if (rc = pcm_GetRootCellName(rootcell)) - return(FALSE); - cell = rootcell; - } - - pp.port = 7000; // AFS FileServer - pp.retry_delay = 10; - pp.max_hosts = 3; - pp.host.wait = 30; - pp.host.retry = 0; - pp.verbose = 1; - - /* WIN32: cm_SearchCellFile(cell, pcallback, pdata) */ - rc = pcm_SearchCellFile(cell, newcell, pingFS, (void *)&pp); -} -#endif /* USE_FSPROBE */ - -// These two items are imported from afscreds.h -// but it cannot be included without causing conflicts -#define c100ns1SECOND (LONGLONG)10000000 -static void -TimeToSystemTime (SYSTEMTIME *pst, time_t TimeT) -{ - struct tm *pTime; - memset (pst, 0x00, sizeof(SYSTEMTIME)); - - if ((pTime = localtime (&TimeT)) != NULL) - { - pst->wYear = pTime->tm_year + 1900; - pst->wMonth = pTime->tm_mon + 1; - pst->wDayOfWeek = pTime->tm_wday; - pst->wDay = pTime->tm_mday; - pst->wHour = pTime->tm_hour; - pst->wMinute = pTime->tm_min; - pst->wSecond = pTime->tm_sec; - pst->wMilliseconds = 0; - } -} - -static DWORD -GetServiceStatus( - LPSTR lpszMachineName, - LPSTR lpszServiceName, - DWORD *lpdwCurrentState) -{ - DWORD hr = NOERROR; - SC_HANDLE schSCManager = NULL; - SC_HANDLE schService = NULL; - DWORD fdwDesiredAccess = 0; - SERVICE_STATUS ssServiceStatus = {0}; - BOOL fRet = FALSE; - - *lpdwCurrentState = 0; - - fdwDesiredAccess = GENERIC_READ; - - schSCManager = OpenSCManager(lpszMachineName, - NULL, - fdwDesiredAccess); - - if(schSCManager == NULL) - { - hr = GetLastError(); - goto cleanup; - } - - schService = OpenService(schSCManager, - lpszServiceName, - fdwDesiredAccess); - - if(schService == NULL) - { - hr = GetLastError(); - goto cleanup; - } - - fRet = QueryServiceStatus(schService, - &ssServiceStatus); - - if(fRet == FALSE) - { - hr = GetLastError(); - goto cleanup; - } - - *lpdwCurrentState = ssServiceStatus.dwCurrentState; - -cleanup: - - CloseServiceHandle(schService); - CloseServiceHandle(schSCManager); - - return(hr); -} - -void -ObtainTokensFromUserIfNeeded(HWND hWnd) -{ - char * rootcell = NULL; - char cell[MAXCELLCHARS+1] = ""; - char password[PROBE_PASSWORD_LEN+1]; - struct afsconf_cell cellconfig; - struct ktc_principal aserver; - struct ktc_principal aclient; - struct ktc_token atoken; - krb5_timestamp now = 0; - BOOL serverReachable = 0; - int rc; - DWORD CurrentState, code; - char HostName[64]; - int use_kfw = KFW_is_available(); - - SYSTEMTIME stNow; - FILETIME ftNow; - LONGLONG llNow; - FILETIME ftExpires; - LONGLONG llExpires; - SYSTEMTIME stExpires; - - CurrentState = 0; - memset(HostName, '\0', sizeof(HostName)); - gethostname(HostName, sizeof(HostName)); - if (GetServiceStatus(HostName, TRANSARCAFSDAEMON, &CurrentState) != NOERROR) - return; - if (CurrentState != SERVICE_RUNNING) { - SendMessage(hWnd, WM_START_SERVICE, FALSE, 0L); - return; - } - - rootcell = (char *)GlobalAlloc(GPTR,MAXCELLCHARS+1); - if ( !rootcell ) goto cleanup; - - code = KFW_AFS_get_cellconfig(cell, (void*)&cellconfig, rootcell); - if ( code ) goto cleanup; - - memset(&aserver, '\0', sizeof(aserver)); - strcpy(aserver.name, "afs"); - strcpy(aserver.cell, rootcell); - - GetLocalTime (&stNow); - SystemTimeToFileTime (&stNow, &ftNow); - llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime); - llNow /= c100ns1SECOND; - - rc = ktc_GetToken(&aserver, &atoken, sizeof(atoken), &aclient); - if ( rc == 0 ) { - TimeToSystemTime (&stExpires, atoken.endTime); - SystemTimeToFileTime (&stExpires, &ftExpires); - llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime); - llExpires /= c100ns1SECOND; - - if (llNow < llExpires) - goto cleanup; - - if ( IsDebuggerPresent() ) { - char message[256]; - sprintf(message,"ObtainTokensFromUserIfNeeded: %d now = %ul endTime = %ul\n", - rc, llNow, llExpires); - OutputDebugString(message); - } - } - -#ifdef USE_FSPROBE - serverReachable = cellPing(NULL); -#else - if ( use_kfw ) { - // If we can't use the FSProbe interface we can attempt to forge - // a kinit and if we can back an invalid user error we know the - // kdc is at least reachable - serverReachable = KFW_probe_kdc(&cellconfig); - } else { - int i; - - for ( i=0 ; idwNumEntries; index++ ) { - if (pIpAddrTable->table[index].dwAddr != 0) - validAddrs++; - } - } - free(pIpAddrTable); - } - return validAddrs; -} - -void -IpAddrChangeMonitor(void * hWnd) -{ -#ifdef USE_OVERLAPPED - HANDLE Handle = INVALID_HANDLE_VALUE; /* Do Not Close This Handle */ - OVERLAPPED Ovlap; -#endif /* USE_OVERLAPPED */ - DWORD Result; - DWORD prevNumOfAddrs = GetNumOfIpAddrs(); - DWORD NumOfAddrs; - char message[256]; - - if ( !hWnd ) - return; - - while ( TRUE ) { -#ifdef USE_OVERLAPPED - ZeroMemory(&Ovlap, sizeof(OVERLAPPED)); - - Result = NotifyAddrChange(&Handle,&Ovlap); - if (Result != ERROR_IO_PENDING) - { - if ( IsDebuggerPresent() ) { - sprintf(message, "NotifyAddrChange() failed with error %d \n", Result); - OutputDebugString(message); - } - break; - } - - if ((Result = WaitForSingleObject(Handle,INFINITE)) != WAIT_OBJECT_0) - { - if ( IsDebuggerPresent() ) { - sprintf(message, "WaitForSingleObject() failed with error %d\n", - GetLastError()); - OutputDebugString(message); - } - continue; - } - - if (GetOverlappedResult(Handle, &Ovlap, - &DataTransfered, TRUE) == 0) - { - if ( IsDebuggerPresent() ) { - sprintf(message, "GetOverlapped result failed %d \n", - GetLastError()); - OutputDebugString(message); - } - break; - } -#else - Result = NotifyAddrChange(NULL,NULL); - if (Result != NO_ERROR) - { - if ( IsDebuggerPresent() ) { - sprintf(message, "NotifyAddrChange() failed with error %d \n", Result); - OutputDebugString(message); - } - break; - } -#endif - - NumOfAddrs = GetNumOfIpAddrs(); - - if ( IsDebuggerPresent() ) { - sprintf(message,"IPAddrChangeMonitor() NumOfAddrs: now %d was %d\n", - NumOfAddrs, prevNumOfAddrs); - OutputDebugString(message); - } - - if ( NumOfAddrs != prevNumOfAddrs ) { - // Give AFS Client Service a chance to notice and die - // Or for network services to startup - Sleep(2000); - // this call should probably be mutex protected - ObtainTokensFromUserIfNeeded(hWnd); - } - prevNumOfAddrs = NumOfAddrs; - } -} - - -DWORD -IpAddrChangeMonitorInit(HWND hWnd) -{ - DWORD status = ERROR_SUCCESS; - HANDLE thread; - ULONG threadID = 0; - - thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)IpAddrChangeMonitor, - hWnd, 0, &threadID); - - if (thread == NULL) { - status = GetLastError(); - } - CloseHandle(thread); - return status; -} - diff --git a/src/WINNT/client_creds/ipaddrchg.h b/src/WINNT/client_creds/ipaddrchg.h deleted file mode 100644 index 09e506b54..000000000 --- a/src/WINNT/client_creds/ipaddrchg.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2003 SkyRope, LLC - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of Skyrope, LLC nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission from Skyrope, LLC. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef IPADDRCHG_H -#define IPADDRCHG_H -#ifdef __cplusplus -extern "C" { -#endif -#define WM_OBTAIN_TOKENS (WM_USER+77) -#define WM_START_SERVICE (WM_USER+78) -void ObtainTokensFromUserIfNeeded(HWND hWnd); -DWORD IpAddrChangeMonitorInit(HWND hWnd); - -#ifdef __cplusplus -} -#endif -#endif /* IPADDRCHG_H */ diff --git a/src/WINNT/client_creds/lang/NTMakefile b/src/WINNT/client_creds/lang/NTMakefile deleted file mode 100644 index 7f7259185..000000000 --- a/src/WINNT/client_creds/lang/NTMakefile +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\client_creds\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afscreds_$(LANGID).dll - -RCFILE = $(LANGNAME)\afscreds.rc - -RESFILE = $(OUT)\afscreds_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - @if exist AFS_component_version_number.h del AFS_component_version_number.h - $(DEL) $(OUT)\*.res RC* RD* $(DLLFILE) - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - diff --git a/src/WINNT/client_creds/lang/de_DE/afscreds.rc b/src/WINNT/client_creds/lang/de_DE/afscreds.rc deleted file mode 100644 index 973ad06f5..000000000 --- a/src/WINNT/client_creds/lang/de_DE/afscreds.rc +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 307, 131 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Client" -CLASS "AfsCreds" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "AFS, Version %s (Programmkorrektur %lu)", - IDC_TITLE_VERSION,210,8,90,8 - LTEXT "Aktuelle Anmeldung beim Windows-Netzwerk als ""%s""", - IDC_TITLE_NT,7,8,203,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,27,293,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Zelle: ",IDC_STATIC,7,9,24,8 - LTEXT "(kein)",IDC_CREDS_CELL,51,9,193,8 - LTEXT "Token: ",IDC_STATIC,7,26,27,8 - LTEXT "(kein)",IDC_CREDS_INFO,51,26,193,8 - CONTROL "Vor Ablauf die&ser Token eine Warnung anzeigen", - IDC_CREDS_REMIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 51,43,193,10 - PUSHBUTTON "Neue Token &erhalten...",IDC_CREDS_OBTAIN,51,63,88,14 - PUSHBUTTON "&Diese Token löschen",IDC_CREDS_DESTROY,142,63,92,14 - PUSHBUTTON "Hilfe",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "In keiner AFS-Zelle sind Token vorhanden.",IDC_RUNNING, - 7,9,275,8 - LTEXT "Der AFS Client ist nicht einwandfrei konfiguriert, oder der AFS Client-Service ist nicht aktiv.\n\nStarten die den AFS Client-Service mit Hilfe des Registers Erweitert.", - IDC_STOPPED,7,9,275,25 - PUSHBUTTON "Hilfe",9,237,63,45,14 - PUSHBUTTON "Neue Token &erhalten...",IDC_CREDS_OBTAIN,51,63,88,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "(Abfrage läuft...)",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "Service &starten",IDC_SERVICE_START,51,28,63,14 - PUSHBUTTON "Service &beenden",IDC_SERVICE_STOP,118,28,63,14 - PUSHBUTTON "AFS Client &konfigurieren",IDC_OPEN_CPL,185,28,97,14 - CONTROL "AFS Client-Service bei jedem Neustart dieses Computers st&arten", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,215,10 - CONTROL "AFS Client-Symbol immer in der Task-Leiste an&zeigen", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65, - 204,10 - PUSHBUTTON "Hilfe",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Neue AFS-Token erhalten" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Um neue AFS-Token zu erhalten, geben Sie Ihren AFS-Benutzernamen und das Kennwort für Ihr AFS-Konto ein. Sie können gleichzeitig Token in mehreren AFS-Zellen besitzen.", - IDC_STATIC,7,7,218,24 - LTEXT "AFS-&Zelle:",IDC_STATIC,16,42,33,8 - EDITTEXT IDC_NEWCREDS_CELL,67,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "Benutzer&name:",IDC_STATIC,16,60,48,8 - EDITTEXT IDC_NEWCREDS_USER,67,58,97,14,ES_AUTOHSCROLL - LTEXT "&Kennwort:",IDC_STATIC,15,78,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,69,106,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,122,106,50,14 - PUSHBUTTON "Hilfe",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Neue AFS-Token erhalten" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Um neue AFS-Token zu erhalten, geben Sie Ihren AFS-Benutzernamen und das Kennwort für Ihr AFS-Konto ein. Sie können gleichzeitig Token in mehreren AFS-Zellen besitzen.", - IDC_STATIC,7,29,218,24 - LTEXT "AFS-&Zelle:",IDC_STATIC,18,70,33,8 - EDITTEXT IDC_NEWCREDS_CELL,73,68,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "Benutzer&name:",IDC_STATIC,18,88,48,8 - EDITTEXT IDC_NEWCREDS_USER,73,86,97,14,ES_AUTOHSCROLL - LTEXT "&Kennwort:",IDC_STATIC,17,106,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,73,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "Ihre Token in der Zelle %1 laufen in Kürze ab.", - IDC_NEWCREDS_TITLE,7,7,218,16 - DEFPUSHBUTTON "OK",IDOK,69,134,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,122,134,50,14 - PUSHBUTTON "Hilfe",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Sie haben gewählt, die folgenden Laufwerkbuchstaben Pfaden in AFS zuzuordnen:", - IDC_TITLE,7,8,275,8 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,51,63,45,14 - PUSHBUTTON "Ä&ndern ...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "Hilfe",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 272, 152 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client-Assistent" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON " &Weiter >",IDNEXT,162,131,50,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,215,131,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,174,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,258,1 - PUSHBUTTON "&Hilfe",9,59,131,50,14 - PUSHBUTTON " < &Zurück",IDBACK,112,131,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Der AFS Client-Service wurde noch nicht gestartet.", - IDC_STATIC,0,0,173,8 - LTEXT "Um den AFS Client-Service zu starten, klicken Sie auf Weiter.", - IDC_STATIC,0,73,173,16 - LTEXT "Solange der AFS Client-Service nicht aktiv ist, können Sie keine in AFS gespeicherten Dateien verwenden.", - IDC_STATIC,0,17,173,17 - LTEXT "Wenn der AFS Client-Service weiterhin nicht ausgeführt werden soll, klicken Sie auf Abbrechen.", - IDC_STATIC,0,91,173,17 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Der AFS Client-Service wird jetzt ausgeführt, Sie haben jedoch noch keine Token erhalten, um AFS zu verwenden.", - IDC_STATIC,0,0,173,24 - CONTROL "Für alle Zellen keine Token erhalten",IDC_NOCREDS, - "Button",BS_AUTORADIOBUTTON,10,28,141,10 - CONTROL "In der folgenden Zelle Token erhalten:",IDC_YESCREDS, - "Button",BS_AUTORADIOBUTTON,10,44,141,10 - LTEXT "AFS-&Zelle:",IDC_STATIC,25,64,34,8 - EDITTEXT IDC_NEWCREDS_CELL,77,62,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "Benutzer&name:",IDC_STATIC,25,82,48,8 - EDITTEXT IDC_NEWCREDS_USER,77,80,96,14,ES_AUTOHSCROLL - LTEXT "&Kennwort:",IDC_STATIC,25,100,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Bitte warten; der AFS Client-Service wird gestartet...", - IDC_START_TRY,0,33,173,8 - LTEXT "Der AFS Client-Service konnte nicht gestartet werden.\n\nÜberprüfen Sie Ihre Netzwerkeinstellungen, und überprüfen Sie in der Systemsteuerung über das Symbol AFS die Konfiguration des AFS Clients auf diesem Computer.", - IDC_START_FAIL,0,25,173,49 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Um auf in AFS gespeicherte Dateien zuzugreifen, müssen Sie den Pfaden in AFS Laufwerkbuchstaben zuordnen.", - IDC_STATIC,0,0,173,23 - CONTROL "Pfaden in AFS &keine Laufwerkbuchstaben zuordnen", - IDC_NOMAP,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE,4, - 27,165,15 - CONTROL "&Mindestens einen Laufwerkbuchstaben einem Pfad in AFS zuordnen:", - IDC_YESMAP,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE,4, - 45,156,14 - LTEXT "&Laufwerkbuchstabe:",IDC_STATIC,5,65,65,8 - COMBOBOX IDC_MAP_LETTER,77,62,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS-&Pfad:",IDC_STATIC,5,83,33,8 - EDITTEXT IDC_MAP_PATH,77,79,96,14,ES_AUTOHSCROLL - LTEXT "B&eschreibung:",IDC_STATIC,5,99,48,8 - EDITTEXT IDC_MAP_DESC,77,96,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 291, 141 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Symbol entfe&rnen",IDOK,167,120,63,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,234,120,50,14 - LTEXT "Sie haben gewählt, das AFS Client-Symbol aus der Task-Leiste Ihres Computers zu entfernen. Nur wenn das AFS Client-Symbol auf der Task-Leiste Ihres Computers angezeigt wird, kann AFS keine Warnung vornehmen, wenn Ihre AFS-Token in Kürze ablaufen.", - IDC_STATIC,7,7,277,32 - LTEXT "Der AFS Client-Service ist momentan aktiv. Wenn Sie möchten, können Sie ihn jetzt beenden.", - IDC_STATIC,7,41,277,16 - CONTROL "AFS Client-Service &nicht beenden",IDC_LEAVE,"Button", - BS_AUTORADIOBUTTON,25,66,228,10 - CONTROL "AFS Client-Service &beenden",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,25,80,228,10 - CONTROL "Symbol beim Neustart des Computers an&zeigen", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,104, - 160,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 291, 82 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Symbol entfe&rnen",IDOK,167,61,63,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,234,61,50,14 - LTEXT "Sie haben gewählt, das AFS Client-Symbol aus der Task-Leiste Ihres Computers zu entfernen. Nur wenn das AFS Client-Symbol auf der Task-Leiste Ihres Computers angezeigt wird, kann AFS Sie warnen, wenn Ihre AFS-Token in Kürze ablaufen.", - -1,7,7,277,25 - CONTROL "Symbol beim Neustart des Computers an&zeigen", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,42, - 161,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 291, 89 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Light" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "Symbol entfe&rnen",IDOK,171,69,63,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,238,68,50,14 - LTEXT "Sie haben gewählt, das AFS Client-Symbol aus der Task-Leiste Ihres Computers zu entfernen. Nur wenn das AFS Light-Symbol auf der Task-Leiste Ihres Computers angezeigt wird, kann AFS Sie warnen, wenn Ihre AFS-Token in Kürze ablaufen.", - -1,7,7,277,25 - CONTROL "Symbol beim Neustart des Computers an&zeigen", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,46, - 161,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Mindestens einer der ausgewählten Laufwerkbuchstaben konnten nicht den entsprechenden Pfaden in AFS zugeordnet werden.\n\nSie müssen möglicherweise alle Anwendungen schließen, die bereits versuchen, Pfade in AFS zu verwenden.", - IDC_MAP_FAIL,1,26,173,57 - LTEXT "Bitte warten; Laufwerkbuchstaben werden Pfaden in AFS zugeordnet...", - IDC_MAP_TRY,0,33,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Der AFS Client ist einsatzbereit.",IDC_STATIC,0,0,173,8 - LTEXT "Um diesen Assistenten zu beenden, klicken Sie auf Fertigstellen.", - IDC_STATIC,0,73,173,20 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Laufwerkbuchstabe zuordnen" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Sie können Laufwerkbuchstaben auf Ihrem Computer Pfaden in AFS zuordnen.\n\nWenn Sie beispielsweise Q: zu \\afs\\acme.com\\usr\\bob zuordnen, sind die in AFS unter \\afs\\acme.com\\usr\\bob\\* verfügbaren Dateien im Laufwerk Q:\\ sichtbar.", - IDC_STATIC,7,7,260,32 - LTEXT "&Laufwerkbuchstabe:",IDC_STATIC,18,53,65,8 - COMBOBOX IDC_MAP_LETTER,88,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS-&Pfad:",IDC_STATIC,18,71,33,8 - EDITTEXT IDC_MAP_PATH,88,69,174,13,ES_AUTOHSCROLL - LTEXT "B&eschreibung:",IDC_STATIC,18,88,46,8 - EDITTEXT IDC_MAP_DESC,88,86,60,13,ES_AUTOHSCROLL - CONTROL "Diese Zuordnung bei jeder Anmeldung &wiederherstellen", - IDC_MAP_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 73,105,185,10 - DEFPUSHBUTTON "OK",IDOK,112,131,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,165,131,50,14 - PUSHBUTTON "Hilfe",9,217,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 300 - TOPMARGIN, 8 - BOTTOMMARGIN, 124 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 134 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "Token an&zeigen...", M_ACTIVATE - MENUITEM "Vor Ablauf &warnen", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "Symbol entfe&rnen...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS Client" - IDS_TOOLTIP_95 "AFS Light" - IDS_CREDENTIALS "Token" - IDS_UNKNOWN "(unbekannt)" - IDS_ADVANCED "Erweitert" - IDS_CREDS "%1 (Token laufen ab %2)" - IDS_NO_CREDS "(Sie besitzen keine Token in dieser Zelle)" - IDS_SERVICE_BROKEN "Der AFS Client-Service wurde nicht ordnungsgemäß installiert, oder Sie sind nicht berechtigt, dessen Status abzufragen." - IDS_SERVICE_RUNNING "Der AFS Client-Service wird normal ausgeführt." - IDS_SERVICE_STOPPED "Der AFS Client-Service wird momentan nicht ausgeführt." - IDS_SERVICE_STOPPING "Bitte warten; der AFS Client-Service wird beendet..." - IDS_SERVICE_STARTING "Bitte warten; der AFS Client-Service wird gestartet..." - IDS_SERVICE_UNKNOWN "Der Status des AFS Client-Service konnte nicht bestimmt werden." - IDS_SERVICE_FAIL_STOP "Der AFS Client-Service konnte nicht ordnungsgemäß beendet werden. Sie besitzen möglicherweise nicht das Recht, diese Operation durchzuführen.\n\nFehler 0x%1." - IDS_SERVICE_FAIL_START "Der AFS Client-Service konnte nicht ordnungsgemäß gestartet werden. Sie besitzen möglicherweise nicht das Recht, diese Operation durchzuführen.\n\nFehler 0x%1." - IDS_SERVICE_FAIL_CONFIG "Die Startparameter des AFS Client-Service konnten nicht geändert werden. Sie besitzen möglicherweise nicht das Recht, diese Operation durchzuführen.\n\nFehler 0x%1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "Fehler beim Konfigurieren des Service" - IDS_ERROR_TITLE "Fehler - AFS Client" - IDS_ERROR_TITLE_95 "Fehler - AFS Light" - IDS_ERROR_DESTROY_95 "Ihre Token in der Zelle %1 konnten nicht gelöscht werden.\n\nFehler: %2" - IDS_ERROR_DESTROY_NOCM "Ihre Token in der Zelle %1 konnten nicht gelöscht werden, da der AFS Client-Service nicht reagiert.\n\nÜberprüfen Sie das Register Erweitert, ob der AFS Client ordnungsgemäß ausgeführt wird.\n\nFehler: %2" - IDS_ERROR_DESTROY_UNKNOWN - "Ihre Token in der Zelle %1 konnten nicht gelöscht werden.\n\nÜberprüfen Sie das Register Erweitert, ob der AFS Client ordnungsgemäß ausgeführt wird.\n\nFehler: %2" - IDS_ERROR_OBTAIN "Der AFS Client konnte in der Zelle %1 keine Token als %2 erhalten.\n\nFehler: %4 (%3)" - IDS_ERROR_OBTAIN_95 "AFS Light konnte in der Zelle %1 keine Token als %2 erhalten.\n\nFehler: %4 (%3)" - IDS_TITLE_VERSION "AFS-Version %s" - IDS_TITLE_VERSION_NOPATCH "AFS-Version %s" - IDS_MOUNT_SOME "Sie haben gewählt, die folgenden Laufwerkbuchstaben Pfaden in AFS zuzuordnen:" - IDS_MOUNT_NONE "Sie haben noch keine Laufwerkbuchstaben den Pfaden in AFS zugeordnet." - IDS_MOUNT "Laufwerkbuchstaben" - IDS_WIZ_NEXT " &Weiter >" - IDS_WIZ_FINISH "&Fertigstellen" - IDS_MAP_LETTER "Laufwerk *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Laufwerk %1: \t%2" - IDS_ERROR_MAP "Fehler beim Zuordnen des Netzlaufwerks" - IDS_ERROR_MAP_DESC "AFS konnte das Netzlaufwerk nicht dem angegebenen Pfad in AFS zuordnen. Überprüfen Sie, ob der Laufwerkbuchstabe momentan nicht verwendet wird.\n\nFehler: 0x%1." - IDS_ERROR_UNMAP "Fehler beim Zuordnen des Netzlaufwerks" - IDS_ERROR_UNMAP_DESC "AFS konnte die Zuordnung des angegebenen Netzlaufwerk nicht aufheben. Überprüfen Sie, ob der Laufwerkbuchstabe momentan nicht verwendet wird.\n\nFehler: 0x%1." - IDS_CELL_GATEWAY "%s (über Gateway %s)" - IDS_BADMAP_TITLE "Fehler beim Zuordnen des Netzlaufwerks" - IDS_BADMAP_DESC "AFS kann dem angegebenen Pfad keinen Laufwerkbuchstabe zuordnen, da der Pfad nicht mit ""\\afs"" beginnt.\n\nStellen Sie sicher, daß der eingegebene Pfad mit ""\\afs"" beginnt, und versuchen Sie es erneut." - IDS_UNCONFIG_TITLE_95 "Fehler - AFS Light" - IDS_UNCONFIG_DESC_95 "AFS Light kann nicht verwendet werden, da es noch nicht konfiguriert wurde.\n\nUm AFS Light zu konfigurieren, öffnen Sie die Systemsteuerung und doppelklicken auf das Symbol für die Konfiguration von AFS Light." - IDS_UNCONFIG_TITLE "Fehler - AFS Client" - IDS_UNCONFIG_DESC "Der AFS Client kann nicht verwendet werden, da er noch konfiguriert wurde.\n\nUm den AFS Client zu konfigurieren, öffnen Sie die Systemsteuerung und doppelklicken Sie auf das Symbol AFS Client." - IDS_NEWSUB_TITLE "Achtung - AFS Client" - IDS_NEWSUB_TITLE_95 "Achtung - AFS Light" - IDS_NEWSUB_DESC "AFS konnte die beim Verbinden des Netzlaufwerks angegebene Beschreibung nicht verwenden.\n\nDie angegebene Beschreibung wird bereits für einen anderen AFS-Pfad verwendet." - IDS_BADSUB_TITLE "Fehler - AFS Client" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "Fehler - AFS Light" - IDS_BADSUB_DESC "Die eingegebene Beschreibung für den Laufwerkbuchstaben kann nicht verwendet werden.\n\nDie Beschreibung für den Laufwerkbuchstaben darf nicht mehr als 12 Zeichen umfassen und keine Leerzeichen oder Tabulatoren enthalten." - IDS_TITLE_95 "AFS Light" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/en_US/afscreds.rc b/src/WINNT/client_creds/lang/en_US/afscreds.rc deleted file mode 100644 index 5c62516c7..000000000 --- a/src/WINNT/client_creds/lang/en_US/afscreds.rc +++ /dev/null @@ -1,576 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 307, 131 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Client" -CLASS "AfsCreds" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "AFS Version %s (patch %lu)",IDC_TITLE_VERSION,210,8,90, - 8 - LTEXT "Currently logged on to Windows Networking as ""%s""", - IDC_TITLE_NT,7,8,203,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,27,293,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Cell: ",IDC_STATIC,7,9,24,8 - LTEXT "(none)",IDC_CREDS_CELL,51,9,193,8 - LTEXT "Tokens:",IDC_STATIC,7,26,27,8 - LTEXT "(none)",IDC_CREDS_INFO,51,26,193,8 - CONTROL "&Show a warning before these tokens expire", - IDC_CREDS_REMIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 51,43,193,10 - PUSHBUTTON "&Obtain New Tokens...",IDC_CREDS_OBTAIN,51,63,88,14 - PUSHBUTTON "&Discard These Tokens",IDC_CREDS_DESTROY,142,63,92,14 - PUSHBUTTON "Help",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "You do not have tokens within any AFS cell.", - IDC_RUNNING,7,9,275,8 - LTEXT "The AFS Client is not configured properly, or the AFS Client service is not running.\n\nUse the Advanced tab to start the AFS Client service.", - IDC_STOPPED,7,9,275,25 - PUSHBUTTON "Help",9,237,63,45,14 - PUSHBUTTON "&Obtain New Tokens...",IDC_CREDS_OBTAIN,51,63,88,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "(querying...)",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "&Start Service",IDC_SERVICE_START,51,28,63,14 - PUSHBUTTON "S&top Service",IDC_SERVICE_STOP,118,28,63,14 - PUSHBUTTON "&Configure AFS Client",IDC_OPEN_CPL,185,28,97,14 - CONTROL "St&art the AFS Client Service whenever this computer restarts", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,204,10 - CONTROL "&Always show the AFS Client icon in the taskbar", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65, - 204,10 - PUSHBUTTON "Help",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obtain New AFS Tokens" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "To obtain new AFS tokens, enter your AFS user name and the password for your AFS account. You can have tokens in multiple AFS cells simultaneously.", - IDC_STATIC,7,7,218,24 - LTEXT "AFS &Cell:",IDC_STATIC,24,42,30,8 - EDITTEXT IDC_NEWCREDS_CELL,67,40,132,14,ES_AUTOHSCROLL | ES_LOWERCASE - LTEXT "User &Name:",IDC_STATIC,24,60,38,8 - EDITTEXT IDC_NEWCREDS_USER,67,58,97,14,ES_AUTOHSCROLL - LTEXT "&Password:",IDC_STATIC,23,78,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,69,106,50,14 - PUSHBUTTON "Cancel",IDCANCEL,122,106,50,14 - PUSHBUTTON "Help",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obtain New AFS Tokens" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "To obtain new AFS tokens, enter your AFS user name and the password for your AFS account. You can have tokens in multiple AFS cells simultaneously.", - IDC_STATIC,7,29,218,24 - LTEXT "AFS &Cell:",IDC_STATIC,24,70,30,8 - EDITTEXT IDC_NEWCREDS_CELL,67,68,132,14,ES_AUTOHSCROLL | ES_LOWERCASE - LTEXT "User &Name:",IDC_STATIC,24,88,38,8 - EDITTEXT IDC_NEWCREDS_USER,67,86,97,14,ES_AUTOHSCROLL - LTEXT "&Password:",IDC_STATIC,23,106,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "Your tokens within the %1 cell are about to expire.", - IDC_NEWCREDS_TITLE,7,7,218,16 - DEFPUSHBUTTON "OK",IDOK,69,134,50,14 - PUSHBUTTON "Cancel",IDCANCEL,122,134,50,14 - PUSHBUTTON "Help",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "You have chosen to map the following drive letters to paths in AFS:", - IDC_TITLE,7,8,275,8 - PUSHBUTTON "&Add...",IDC_ADD,51,63,45,14 - PUSHBUTTON "&Change...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "&Remove",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "Help",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 272, 152 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client Wizard" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "&Next >",IDNEXT,162,131,50,14 - PUSHBUTTON "Cance&l",IDCANCEL,215,131,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,174,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,258,1 - PUSHBUTTON "&Help",9,59,131,50,14 - PUSHBUTTON "< &Back",IDBACK,112,131,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "The AFS Client Service has not yet started.",IDC_STATIC, - 0,0,173,8 - LTEXT "To start the AFS Client Service, click Next.", - IDC_STATIC,0,73,173,8 - LTEXT "Until the AFS Client Service is running, you will be unable to use files stored in AFS.", - IDC_STATIC,0,17,173,17 - LTEXT "To leave the AFS Client Service stopped, click Cancel.", - IDC_STATIC,0,88,173,8 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "The AFS Client Service is now running, but you have not yet obtained any tokens for using AFS.", - IDC_STATIC,0,0,173,16 - CONTROL "Do not obtain tokens for any cell",IDC_NOCREDS,"Button", - BS_AUTORADIOBUTTON,10,28,141,10 - CONTROL "Obtain tokens in the following cell:",IDC_YESCREDS, - "Button",BS_AUTORADIOBUTTON,10,44,141,10 - LTEXT "AFS &Cell:",IDC_STATIC,34,64,30,8 - EDITTEXT IDC_NEWCREDS_CELL,77,62,96,14,ES_AUTOHSCROLL | ES_LOWERCASE - LTEXT "User &Name:",IDC_STATIC,34,82,38,8 - EDITTEXT IDC_NEWCREDS_USER,77,80,96,14,ES_AUTOHSCROLL - LTEXT "&Password:",IDC_STATIC,33,100,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Please wait; the AFS Client Service is starting...", - IDC_START_TRY,0,33,173,8 - LTEXT "The AFS Client Service could not be started.\n\nCheck your network settings, and use the AFS icon in the Control Panel to check the configuration of the AFS Client on this computer.", - IDC_START_FAIL,0,25,173,41 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "To access files stored in AFS, you must map drive letters to paths in AFS.", - IDC_STATIC,0,0,173,16 - CONTROL "&Do not map any drive letters to paths in AFS", - IDC_NOMAP,"Button",BS_AUTORADIOBUTTON,10,23,152,10 - CONTROL "&Map at least one drive letter to a path in AFS:", - IDC_YESMAP,"Button",BS_AUTORADIOBUTTON,10,40,156,10 - LTEXT "Drive &Letter:",IDC_STATIC,34,58,40,8 - COMBOBOX IDC_MAP_LETTER,77,56,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS &Path:",IDC_STATIC,34,76,33,8 - EDITTEXT IDC_MAP_PATH,77,74,96,14,ES_AUTOHSCROLL - LTEXT "&Submount:",IDC_STATIC,34,94,38,8 - EDITTEXT IDC_MAP_DESC,77,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 291, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Remove Icon",IDOK,167,96,63,14 - PUSHBUTTON "Cance&l",IDCANCEL,234,96,50,14 - LTEXT "You have chosen to remove the AFS Client icon from your computer's taskbar. Unless the AFS Client icon is in your computer's taskbar, AFS cannot warn you when your AFS tokens are about to expire.", - IDC_STATIC,7,7,277,25 - LTEXT "The AFS Client Service is currently running. If you want, you can stop it at this time.", - IDC_STATIC,7,41,277,8 - CONTROL "&Leave the AFS Client Service running",IDC_LEAVE,"Button", - BS_AUTORADIOBUTTON,26,55,228,10 - CONTROL "&Stop the AFS Client Service",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,26,69,228,10 - CONTROL "S&how the icon when my computer restarts",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98,148,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Remove Icon",IDOK,167,47,63,14 - PUSHBUTTON "Cance&l",IDCANCEL,234,47,50,14 - LTEXT "You have chosen to remove the AFS Client icon from your computer's taskbar. Unless the AFS Client icon is in your computer's taskbar, AFS cannot warn you when your AFS tokens are about to expire.", - -1,7,7,277,25 - CONTROL "S&how the icon when my computer restarts",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Light" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Remove Icon",IDOK,167,47,63,14 - PUSHBUTTON "Cance&l",IDCANCEL,234,47,50,14 - LTEXT "You have chosen to remove the AFS Light icon from your computer's taskbar. Unless the AFS Light icon is in your computer's taskbar, AFS cannot warn you when your AFS tokens are about to expire.", - -1,7,7,277,25 - CONTROL "S&how the icon when my computer restarts",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "One or more of the drive letters you have chosen could not be mapped to the appropriate paths in AFS.\n\nYou may need to close any applications which are already trying to use paths in AFS.", - IDC_MAP_FAIL,1,26,173,41 - LTEXT "Please wait; mapping drive letters to paths in AFS...", - IDC_MAP_TRY,0,33,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "The AFS Client is ready for use.",IDC_STATIC,0,0,173,8 - LTEXT "To close this wizard, click Finish.",IDC_STATIC,0,73, - 173,8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Map Drive Letter" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "You can map drive letters on your computer to paths in AFS.\n\nFor instance, if you map Q: as \\afs\\acme.com\\usr\\bob, then the files available in AFS as \\afs\\acme.com\\usr\\bob\\* will be visible in Q:\\", - IDC_STATIC,7,7,261,32 - LTEXT "Drive &Letter:",IDC_STATIC,23,53,40,8 - COMBOBOX IDC_MAP_LETTER,73,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS &Path:",IDC_STATIC,23,70,33,8 - EDITTEXT IDC_MAP_PATH,73,68,178,13,ES_AUTOHSCROLL - LTEXT "&Submount:",IDC_STATIC,23,88,38,8 - EDITTEXT IDC_MAP_DESC,73,86,60,13,ES_AUTOHSCROLL - CONTROL "&Restore this mapping whenever I logon", - IDC_MAP_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 73,105,185,10 - DEFPUSHBUTTON "OK",IDOK,112,131,50,14 - PUSHBUTTON "Cancel",IDCANCEL,165,131,50,14 - PUSHBUTTON "Help",9,218,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 300 - TOPMARGIN, 8 - BOTTOMMARGIN, 124 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 61 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 268 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "&Show Tokens...", M_ACTIVATE - MENUITEM "&Warn Before Expiration", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Remove Icon...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS Client" - IDS_TOOLTIP_95 "AFS Light" - IDS_CREDENTIALS "Tokens" - IDS_UNKNOWN "(unknown)" - IDS_ADVANCED "Advanced" - IDS_CREDS "%1 (tokens expire %2)" - IDS_NO_CREDS "(you have no tokens in this cell)" - IDS_SERVICE_BROKEN "The AFS Client Service is not properly installed, or you do not have authorization to query its status." - IDS_SERVICE_RUNNING "The AFS Client Service is running normally." - IDS_SERVICE_STOPPED "The AFS Client Service is currently stopped." - IDS_SERVICE_STOPPING "Please wait; the AFS Client Service is stopping..." - IDS_SERVICE_STARTING "Please wait; the AFS Client Service is starting..." - IDS_SERVICE_UNKNOWN "The status of the AFS Client Service could not be determined." - IDS_SERVICE_FAIL_STOP "The AFS Client Service could not be stopped successfully. You might not have authorization to perform this operation.\n\nError 0x%1." - IDS_SERVICE_FAIL_START "The AFS Client Service could not be started successfully. You might not have authorization to perform this operation.\n\nError 0x%1." - IDS_SERVICE_FAIL_CONFIG "The AFS Client Service's startup parameters could not be changed. You might not have authorization to perform this operation.\n\nError 0x%1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "Error Configuring Service" - IDS_ERROR_TITLE "Error - AFS Client" - IDS_ERROR_TITLE_95 "Error - AFS Light" - IDS_ERROR_DESTROY_95 "Your tokens in the %1 cell could not be destroyed.\n\nError: %2" - IDS_ERROR_DESTROY_NOCM "Your tokens in the %1 cell could not be destroyed because the AFS Client Service is not responding.\n\nCheck the Advanced tab to see if the AFS Client is running properly.\n\nError: %2" - IDS_ERROR_DESTROY_UNKNOWN - "Your tokens in the %1 cell could not be destroyed.\n\nCheck the Advanced tab to see if the AFS Client is running properly.\n\nError: %2" - IDS_ERROR_OBTAIN "The AFS Client was unable to obtain tokens as %2 in cell %1.\n\nError: %4 (%3)" - IDS_ERROR_OBTAIN_95 "AFS Light was unable to obtain tokens as %2 in cell %1.\n\nError: %4 (%3)" - IDS_TITLE_VERSION "AFS Version %s" - IDS_TITLE_VERSION_NOPATCH "AFS Version %s" - IDS_MOUNT_SOME "You have chosen to map the following drive letters to paths in AFS:" - IDS_MOUNT_NONE "You have not yet chosen to map any drive letters to paths in AFS." - IDS_MOUNT "Drive Letters" - IDS_WIZ_NEXT "&Next >" - IDS_WIZ_FINISH "&Finish" - IDS_MAP_LETTER "Drive *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Drive %1: \t%2" - IDS_ERROR_MAP "Error Mapping Network Drive" - IDS_ERROR_MAP_DESC "AFS was unable to map the network drive to the specified path in AFS. Check to make sure the drive letter is not currently in use.\n\nError: 0x%1." - IDS_ERROR_UNMAP "Error Mapping Network Drive" - IDS_ERROR_UNMAP_DESC "AFS was unable to unmap the specified network drive. Check to make sure the drive letter is not currently in use.\n\nError: 0x%1." - IDS_CELL_GATEWAY "%s (via gateway %s)" - IDS_BADMAP_TITLE "Error Mapping Network Drive" - IDS_BADMAP_DESC "AFS cannot map a drive letter to the path specified because the path does not begin with ""\\afs"".\n\nMake sure that the path you enter begins with ""\\afs"", and try again." - IDS_UNCONFIG_TITLE_95 "Error - AFS Light" - IDS_UNCONFIG_DESC_95 "AFS Light cannot be used because it is not yet configured.\n\nTo configure AFS Light, open the Control Panel and double-click on the AFS Light Configuration icon." - IDS_UNCONFIG_TITLE "Error - AFS Client" - IDS_UNCONFIG_DESC "The AFS Client cannot be used because it is not yet configured.\n\nTo configure the AFS Client, open the Control Panel and double-click on the AFS Client icon." - IDS_NEWSUB_TITLE "Caution - AFS Client" - IDS_NEWSUB_TITLE_95 "Caution - AFS Light" - IDS_NEWSUB_DESC "AFS was unable to use the submount you specified when connecting the network drive.\n\nThe specified submount is already used for a different AFS path." - IDS_BADSUB_TITLE "Error - AFS Client" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "Error - AFS Light" - IDS_BADSUB_DESC "The drive letter description you entered cannot be used.\n\nA drive letter description may have no more than 12 characters, and may not contain spaces or tabs." - IDS_TITLE_95 "AFS Light" -END -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/es_ES/afscreds.rc b/src/WINNT/client_creds/lang/es_ES/afscreds.rc deleted file mode 100644 index 8aa918147..000000000 --- a/src/WINNT/client_creds/lang/es_ES/afscreds.rc +++ /dev/null @@ -1,605 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 310, 130 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Client" -CLASS "AfsCreds" -FONT 9, "MS Shell Dlg" -BEGIN - RTEXT "AFS Versión %s (parche %lu)",IDC_TITLE_VERSION,213,8,90, - 8 - LTEXT "Registrado actualmente en Redes de Windows como ""%s""", - IDC_TITLE_NT,7,8,203,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,26,296,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Célula: ",IDC_STATIC,7,9,24,8 - LTEXT "(ninguna)",IDC_CREDS_CELL,51,9,193,8 - LTEXT "Señales:",IDC_STATIC,7,26,27,8 - LTEXT "(ninguna)",IDC_CREDS_INFO,51,26,193,8 - CONTROL "&Mostrar un aviso antes de que caduquen estas señales", - IDC_CREDS_REMIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 51,43,193,10 - PUSHBUTTON "&Obtener señales nuevas...",IDC_CREDS_OBTAIN,51,63,88, - 14 - PUSHBUTTON "&Descartar estas señales",IDC_CREDS_DESTROY,142,63,92, - 14 - PUSHBUTTON "Ayuda",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "No dispone de señales dentro de ninguna célula de AFS.", - IDC_RUNNING,7,9,275,8 - LTEXT "El AFS Client no se ha configurado debidamente o el servicio de AFS Client no se está ejecutando.\n\nUtilice el tabulador Avanzado para iniciar el servicio de AFS Client.", - IDC_STOPPED,7,9,275,25 - PUSHBUTTON "Ayuda",9,237,63,45,14 - PUSHBUTTON "&Obtener señales nuevas...",IDC_CREDS_OBTAIN,51,63,88, - 14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "(consultando...)",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "&Iniciar servicio",IDC_SERVICE_START,51,28,63,14 - PUSHBUTTON "De&tener servicio",IDC_SERVICE_STOP,118,28,63,14 - PUSHBUTTON "&Configurar AFS Client",IDC_OPEN_CPL,185,28,97,14 - CONTROL "Inici&ar el Servicio de AFS Client cada vez que se reinicia este sistema", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,275,10 - CONTROL "&Mostrar siempre el icono AFS Client en la barra de tareas", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65, - 214,10 - PUSHBUTTON "Ayuda",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 261, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obtener señales nuevas de AFS" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Para obtener señales nuevas de AFS, entre el nombre de usuario de AFS y la contraseña de la cuenta de AFS. Puede disponer de señales en múltiples células de AFS al mismo tiempo.", - IDC_STATIC,7,7,247,24 - LTEXT "&Célula de AFS:",IDC_STATIC,24,42,68,8 - EDITTEXT IDC_NEWCREDS_CELL,93,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "&Nombre de usuario:",IDC_STATIC,24,60,68,8 - EDITTEXT IDC_NEWCREDS_USER,93,58,97,14,ES_AUTOHSCROLL - LTEXT "C&ontraseña:",IDC_STATIC,23,78,56,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,93,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,76,106,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,140,106,50,14 - PUSHBUTTON "Ayuda",9,204,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obtener señales nuevas de AFS" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Para obtener señales nuevas de AFS, entre el nombre de usuario de AFS y la contraseña de la cuenta de AFS. Puede disponer de señales en múltiples células de AFS al mismo tiempo.", - IDC_STATIC,7,29,218,24 - LTEXT "&Célula de AFS:",IDC_STATIC,24,70,52,8 - EDITTEXT IDC_NEWCREDS_CELL,89,68,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "&Nombre de usuario:",IDC_STATIC,24,88,64,8 - EDITTEXT IDC_NEWCREDS_USER,89,86,97,14,ES_AUTOHSCROLL - LTEXT "C&ontraseña:",IDC_STATIC,23,106,58,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,89,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "Las señales de la célula %1 están a punto de caducar.", - IDC_NEWCREDS_TITLE,7,7,218,16 - DEFPUSHBUTTON "Aceptar",IDOK,69,134,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,122,134,50,14 - PUSHBUTTON "Ayuda",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 305, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Ha optado por correlacionar las siguientes letras de unidad con vías de acceso de AFS:", - IDC_TITLE,7,8,278,8 - PUSHBUTTON "&Añadir...",IDC_ADD,51,63,45,14 - PUSHBUTTON "&Cambiar...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,59,21,231,37 - PUSHBUTTON "Ayuda",9,246,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 272, 152 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "Asistente de AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "&Siguiente >",IDNEXT,162,131,50,14 - PUSHBUTTON "Cance&lar",IDCANCEL,215,131,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,174,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,258,1 - PUSHBUTTON "A&yuda",9,59,131,50,14 - PUSHBUTTON "< &Anterior",IDBACK,112,131,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 174, 125 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "El Servicio de AFS Client no se ha iniciado todavía.", - IDC_STATIC,0,0,173,8 - LTEXT "Para iniciar el Servicio de AFS Client, pulse en Siguiente.", - IDC_STATIC,0,65,173,17 - LTEXT "Hasta que se esté ejecutando el Servicio de AFS Client, no podrá utilizar archivos almacenados en AFS. ", - IDC_STATIC,0,17,173,17 - LTEXT "Para dejar detenido el Servicio de AFS Client, pulse en Cancelar.", - IDC_STATIC,0,88,173,19 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 215, 117 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "El Servicio de AFS Client está ejecutándose en este momento, pero todavía no ha obtenido ninguna señal para utilizar AFS. ", - IDC_STATIC,0,0,203,18 - CONTROL "No obtener señales para ninguna célula",IDC_NOCREDS, - "Button",BS_AUTORADIOBUTTON,10,28,146,10 - CONTROL "Obtener señales en la siguiente célula:",IDC_YESCREDS, - "Button",BS_AUTORADIOBUTTON,10,44,147,10 - LTEXT "&Célula de AFS:",IDC_STATIC,34,65,58,8 - EDITTEXT IDC_NEWCREDS_CELL,99,63,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "&Nombre de usuario:",IDC_STATIC,34,82,62,8 - EDITTEXT IDC_NEWCREDS_USER,99,80,96,14,ES_AUTOHSCROLL - LTEXT "C&ontraseña:",IDC_STATIC,33,100,61,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,99,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Espere por favor; el Servicio de AFS Client se está iniciando...", - IDC_START_TRY,0,33,173,8 - LTEXT "No ha podido iniciarse el Servicio de AFS Client.\n\nCompruebe la configuración de red y utilice el icono de AFS del Panel de control para comprobar la configuración del AFS Client en este sistema.", - IDC_START_FAIL,0,25,173,45 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 270, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Para acceder a los archivos almacenados en AFS, debe correlacionar letras de unidad con las vías de acceso de AFS.", - IDC_STATIC,0,0,255,16 - CONTROL "&No correlacionar ninguna letra de unidad con las vías de acceso de AFS", - IDC_NOMAP,"Button",BS_AUTORADIOBUTTON,10,23,245,10 - CONTROL "C&orrelacionar al menos una letra de unidad con una vía de acceso de AFS:", - IDC_YESMAP,"Button",BS_AUTORADIOBUTTON,10,40,253,10 - LTEXT "&Letra de unidad:",IDC_STATIC,34,58,72,8 - COMBOBOX IDC_MAP_LETTER,112,56,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Vía de acceso de AFS:",IDC_STATIC,34,76,78,8 - EDITTEXT IDC_MAP_PATH,112,74,96,14,ES_AUTOHSCROLL - LTEXT "D&escripción:",IDC_STATIC,34,94,71,8 - EDITTEXT IDC_MAP_DESC,112,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 305, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "&Eliminar icono",IDOK,180,96,63,14 - PUSHBUTTON "Cance&lar",IDCANCEL,248,96,50,14 - LTEXT "Ha optado por eliminar el icono AFS Client de la barra de tareas del sistema. A menos que el icono AFS Client esté en la barra de tareas del sistema, AFS no podrá advertirle del momento en que las señales de AFS estén a punto de caducar.", - IDC_STATIC,7,7,291,25 - LTEXT "El Servicio de AFS Client se está ejecutando en la actualidad. Si lo desea, puede detenerlo en este momento.", - IDC_STATIC,7,41,291,8 - CONTROL "&Dejar el Servicio de AFS Client en ejecución", - IDC_LEAVE,"Button",BS_AUTORADIOBUTTON,26,55,228,10 - CONTROL "De&tener el Servicio de AFS Client",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,26,69,228,10 - CONTROL "M&ostrar el icono cuando se reinicie el sistema", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98, - 156,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 299, 69 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "&Eliminar icono",IDOK,175,48,63,14 - PUSHBUTTON "Cance&lar",IDCANCEL,242,48,50,14 - LTEXT "Ha optado por eliminar el icono AFS Client de la barra de tareas del sistema. A menos que el icono AFS Client esté en la barra de tareas del sistema, AFS no podrá advertirle del momento en que las señales de AFS estén a punto de caducar.", - -1,7,7,285,25 - CONTROL "M&ostrar el icono cuando se reinicie el sistema", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49, - 158,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 301, 69 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Light" -FONT 9, "MS Shell Dlg" -BEGIN - PUSHBUTTON "&Eliminar icono",IDOK,176,47,63,14 - PUSHBUTTON "Cance&lar",IDCANCEL,243,47,50,14 - LTEXT "Ha optado por eliminar el icono AFS Light de la barra de tareas del sistema. A menos que el icono AFS Light esté en la barra de tareas del sistema, AFS no podrá advertirle del momento en que las señales de AFS estén a punto de caducar.", - -1,7,7,277,25 - CONTROL "M&ostrar el icono cuando se reinicie el sistema", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49, - 161,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Una o más de las letras de unidad elegidas no ha podido correlacionarse con las vías de acceso apropiadas de AFS.\n\nEs posible que necesite cerrar algunas aplicaciones que ya están intentando utilizar vías de acceso de AFS.", - IDC_MAP_FAIL,1,26,173,58 - LTEXT "Espere por favor; correlacionando letras de unidad con las vías de acceso de AFS...", - IDC_MAP_TRY,0,33,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "El AFS Client ya está preparado para su utilización.", - IDC_STATIC,0,0,173,8 - LTEXT "Para cerrar este asistente, pulse en Finalizar.", - IDC_STATIC,0,73,173,8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 292, 151 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Correlacionar letra de unidad" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Puede correlacionar letras de unidad en el sistema con vías de acceso de AFS.\n\nPor ejemplo, si correlaciona Q: como \\afs\\acme.com\\usr\\bob, los archivos disponibles en AFS como \\afs\\acme.com\\usr\\bob\\* resultarán visibles en Q:\\", - IDC_STATIC,7,7,278,38 - LTEXT "&Letra de unidad:",IDC_STATIC,23,53,77,8 - COMBOBOX IDC_MAP_LETTER,102,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Vía de acceso de AFS:",IDC_STATIC,23,71,74,8 - EDITTEXT IDC_MAP_PATH,102,68,178,13,ES_AUTOHSCROLL - LTEXT "D&escripción:",IDC_STATIC,23,88,76,8 - EDITTEXT IDC_MAP_DESC,102,86,60,13,ES_AUTOHSCROLL - CONTROL "&Restaurar esta correlación cada vez que se inicie la sesión", - IDC_MAP_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 73,105,205,10 - DEFPUSHBUTTON "Aceptar",IDOK,118,130,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,177,130,50,14 - PUSHBUTTON "Ayuda",9,235,130,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 303 - TOPMARGIN, 8 - BOTTOMMARGIN, 123 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 254 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 298 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_WIZ_START, DIALOG - BEGIN - BOTTOMMARGIN, 112 - END - - IDD_WIZ_CREDS, DIALOG - BEGIN - RIGHTMARGIN, 174 - BOTTOMMARGIN, 112 - END - - IDD_WIZ_MOUNT, DIALOG - BEGIN - RIGHTMARGIN, 174 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 298 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 62 - END - - IDD_TERMINATE_SMALL_95, DIALOG - BEGIN - RIGHTMARGIN, 291 - BOTTOMMARGIN, 68 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 285 - TOPMARGIN, 7 - BOTTOMMARGIN, 144 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "&Mostrar señales...", M_ACTIVATE - MENUITEM "A&visar antes de la caducidad", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Eliminar icono...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS Client" - IDS_TOOLTIP_95 "AFS Light" - IDS_CREDENTIALS "Señales" - IDS_UNKNOWN "(desconocido)" - IDS_ADVANCED "Avanzado" - IDS_CREDS "%1 (caducan las señales %2)" - IDS_NO_CREDS "(no tiene señales en esta célula)" - IDS_SERVICE_BROKEN "El Servicio de AFS Client no está debidamente instalado, o no se tiene autorización para consultar su estado." - IDS_SERVICE_RUNNING "El Servicio de AFS Client se está ejecutando normalmente." - IDS_SERVICE_STOPPED "El Servicio de AFS Client está detenido en la actualidad." - IDS_SERVICE_STOPPING "Espere por favor; el Servicio de AFS Client se está deteniendo..." - IDS_SERVICE_STARTING "Espere por favor; el Servicio de AFS Client se está iniciando..." - IDS_SERVICE_UNKNOWN "No ha podido determinarse el estado del Servicio de AFS Client." - IDS_SERVICE_FAIL_STOP "No ha podido detenerse satisfactoriamente el Servicio de AFS Client. Es posible que no disponga de autorización para efectuar esta operación.\n\nError 0x%1." - IDS_SERVICE_FAIL_START "No ha podido iniciarse satisfactoriamente el Servicio de AFS Client. Es posible que no disponga de autorización para efectuar esta operación.\n\nError 0x%1." - IDS_SERVICE_FAIL_CONFIG "No han podido cambiarse los parámetros de arranque del Servicio de AFS Client. Es posible que no disponga de autorización para efectuar esta operación.\n\nError 0x%1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "Error al configurar el servicio" - IDS_ERROR_TITLE "Error - AFS Client" - IDS_ERROR_TITLE_95 "Error - AFS Light" - IDS_ERROR_DESTROY_95 "Las señales de la célula %1 no han podido destruirse.\n\nError: %2" - IDS_ERROR_DESTROY_NOCM "Las señales de la célula %1 no han podido destruirse debido a que el Servicio de AFS Client no está respondiendo.\n\nCompruebe el tabulador Avanzado para ver si el AFS Client se está ejecutando debidamente.\n\nError: %2" - IDS_ERROR_DESTROY_UNKNOWN - "Las señales de la célula %1 no han podido destruirse.\n\nCompruebe el tabulador Avanzado para ver si el AFS Client se está ejecutando debidamente.\n\nError: %2" - IDS_ERROR_OBTAIN "El AFS Client no ha podido obtener señales como %2 en la célula %1.\n\nError: %4 (%3)" - IDS_ERROR_OBTAIN_95 "AFS Light no ha podido obtener señales como %2 en la célula %1.\n\nError: %4 (%3)" - IDS_TITLE_VERSION "AFS Versión %s" - IDS_TITLE_VERSION_NOPATCH "AFS Versión %s" - IDS_MOUNT_SOME "Ha optado por correlacionar las siguientes letras de unidad con las vías de acceso de AFS:" - IDS_MOUNT_NONE "Sigue sin optar por correlacionar ninguna letra de unidad con las vías de acceso de AFS." - IDS_MOUNT "Letras de unidad" - IDS_WIZ_NEXT "&Siguiente >" - IDS_WIZ_FINISH "&Finalizar" - IDS_MAP_LETTER "Unidad *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Unidad %1: \t%2" - IDS_ERROR_MAP "Error al correlacionar unidad de red" - IDS_ERROR_MAP_DESC "AFS no ha podido correlacionar unidad de red con la vía de acceso especificada en AFS. Asegúrese de que la letra de unidad no se está utilizando en la actualidad.\n\nError: 0x%1." - IDS_ERROR_UNMAP "Error al correlacionar unidad de red" - IDS_ERROR_UNMAP_DESC "AFS no ha podido descorrelacionar unidad de red especificada. Asegúrese de que la letra de unidad no se está utilizando en la actualidad.\n\nError: 0x%1." - IDS_CELL_GATEWAY "%s (por medio de pasarela %s)" - IDS_BADMAP_TITLE "Error al correlacionar unidad de red" - IDS_BADMAP_DESC "AFS no ha podido correlacionar una letra de unidad con la vía de acceso especificada debido a que la vía de acceso no comienza por ""\\afs"".\n\nAsegúrese de que la vía de acceso entrada comienza por ""\\afs"" y vuélvalo a intentar." - IDS_UNCONFIG_TITLE_95 "Error - AFS Light" - IDS_UNCONFIG_DESC_95 "AFS Light no puede utilizarse porque todavía no se ha configurado.\n\nPara configurar AFS Light, abra el Panel de control y efectúe una doble pulsación en el icono Configuración de AFS Light." - IDS_UNCONFIG_TITLE "Error - AFS Client" - IDS_UNCONFIG_DESC "El AFS Client no puede utilizarse porque todavía no se ha configurado.\n\nPara configurar el AFS Client, abra el Panel de control y efectúe una doble pulsación en el icono AFS Client." - IDS_NEWSUB_TITLE "Precaución - AFS Client" - IDS_NEWSUB_TITLE_95 "Precaución - AFS Light" - IDS_NEWSUB_DESC "AFS no ha podido utilizar la descripción especificada al conectar la unidad de red.\n\nLa descripción especificada ya se ha utilizado para otra vía de acceso de AFS diferente. " - IDS_BADSUB_TITLE "Error - AFS Client" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "Error - AFS Light" - IDS_BADSUB_DESC "No puede utilizarse la descripción de la letra de unidad entrada.\n\nUna descripción de letra de unidad no puede tener más de 12 caracteres y no puede contener ni espacios ni tabuladores. " - IDS_TITLE_95 "AFS Light" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/ja_JP/afscreds.rc b/src/WINNT/client_creds/lang/ja_JP/afscreds.rc deleted file mode 100644 index b5142bb04..000000000 --- a/src/WINNT/client_creds/lang/ja_JP/afscreds.rc +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 932 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 307, 131 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ƒNƒ‰ƒCƒAƒ“ƒg" -CLASS "AfsCreds" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - RTEXT "AFS ƒo[ƒWƒ‡ƒ“ %s (ƒpƒbƒ` %lu)",IDC_TITLE_VERSION,152, - 19,146,8 - LTEXT "Œ»ÝAŽŸ‚Ì–¼‘O‚Å Windows Networking ‚É ƒƒOƒIƒ“‚µ‚Ä‚¢‚Ü‚·B""%s""", - IDC_TITLE_NT,7,5,293,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,29,293,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒZƒ‹: ",IDC_STATIC,7,9,24,8 - LTEXT "(‚È‚µ)",IDC_CREDS_CELL,51,9,231,8 - LTEXT "ƒg[ƒNƒ“:",IDC_STATIC,7,26,34,8 - LTEXT "(‚È‚µ)",IDC_CREDS_INFO,51,26,231,8 - CONTROL "‚±‚ê‚ç‚̃g[ƒNƒ“‚ÌŠúŒÀØ‚ê‘O‚ÉŒx‚ð•\ަ(&S)", - IDC_CREDS_REMIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 51,43,193,10 - PUSHBUTTON "V‹Kƒg[ƒNƒ“‚̎擾(&O)...",IDC_CREDS_OBTAIN,21,63,98,14 - PUSHBUTTON "‚±‚ê‚ç‚̃g[ƒNƒ“‚ð”jŠü(&D)",IDC_CREDS_DESTROY,122,63, - 109,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‚Ç‚Ì AFS ƒZƒ‹“à‚É‚àƒg[ƒNƒ“‚ª‚ ‚è‚Ü‚¹‚ñB",IDC_RUNNING, - 7,9,155,8 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ª³‚µ‚­\¬‚³‚ê‚Ä‚¢‚È‚¢‚©A‚Ü‚½‚Í AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB\n\nuŠg’£vƒ^ƒu‚ðŽg—p‚µ‚Ä AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STOPPED,7,23,275,34 - PUSHBUTTON "ƒwƒ‹ƒv",9,237,63,45,14 - PUSHBUTTON "V‹Kƒg[ƒNƒ“‚̎擾(&O)...",IDC_CREDS_OBTAIN,51,63,98,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "(Æ‰ï’†...)",IDC_SERVICE_STATUS,7,7,275,14 - PUSHBUTTON "ƒT[ƒrƒX‚ÌŠJŽn(&S)",IDC_SERVICE_START,13,28,77,14 - PUSHBUTTON "ƒT[ƒrƒX‚Ì’âŽ~(&T)",IDC_SERVICE_STOP,91,28,77,14 - PUSHBUTTON "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚̍\¬(&C)",IDC_OPEN_CPL,169,28,109,14 - CONTROL "‚±‚̃Rƒ“ƒsƒ…[ƒ^[‚̍Ďn“®Žž‚É AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn(&R)", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,268,10 - CONTROL "í‚Ƀ^ƒXƒNƒo[‚É AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒAƒCƒRƒ“‚ð•\ަ(&A)", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65, - 220,10 - PUSHBUTTON "ƒwƒ‹ƒv",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "V‹K AFS ƒg[ƒNƒ“‚̎擾" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "V‹K AFS ƒg[ƒNƒ“‚ðŽæ“¾‚·‚é‚ɂ́AAFS ƒAƒJƒEƒ“ƒg‚Ì AFS ƒ†[ƒU[–¼‚ƃpƒXƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B•¡” AFS ƒZƒ‹‚Ƀg[ƒNƒ“‚𓯎ž‚ÉŽ‚‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,7,7,218,24 - LTEXT "AFS ƒZƒ‹(&C):",IDC_STATIC,23,42,53,8 - EDITTEXT IDC_NEWCREDS_CELL,87,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "ƒ†[ƒU[–¼(&N):",IDC_STATIC,23,60,53,8 - EDITTEXT IDC_NEWCREDS_USER,87,58,97,14,ES_AUTOHSCROLL - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_STATIC,23,78,53,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,87,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,69,106,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,122,106,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "V‹K AFS ƒg[ƒNƒ“‚̎擾" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "V‹K AFS ƒg[ƒNƒ“‚ðŽæ“¾‚·‚é‚ɂ́AAFS ƒAƒJƒEƒ“ƒg‚Ì AFS ƒ†[ƒU[–¼‚ƃpƒXƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B•¡” AFS ƒZƒ‹‚Ƀg[ƒNƒ“‚𓯎ž‚ÉŽ‚‚±‚Æ‚ª‚Å‚«‚Ü‚·B", - IDC_STATIC,7,32,218,24 - LTEXT "AFS ƒZƒ‹(&C):",IDC_STATIC,23,70,57,8 - EDITTEXT IDC_NEWCREDS_CELL,87,68,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "ƒ†[ƒU[–¼(&N):",IDC_STATIC,23,88,57,8 - EDITTEXT IDC_NEWCREDS_USER,87,86,97,14,ES_AUTOHSCROLL - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_STATIC,23,106,57,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,87,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "%1 ƒZƒ‹“à‚̃g[ƒNƒ“‚Ì—LŒøŠúŒÀ‚ª‚Ü‚à‚È‚­Ø‚ê‚Ü‚·B", - IDC_NEWCREDS_TITLE,7,7,218,18 - DEFPUSHBUTTON "—¹‰ð",IDOK,69,134,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,122,134,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ˆÈ‰º‚̃hƒ‰ƒCƒu–¼‚Ì AFS “à‚̃pƒX‚ւ̃}ƒbƒsƒ“ƒO‚ð‘I‘ð‚µ‚Ü‚µ‚½:", - IDC_TITLE,7,8,275,8 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,51,63,45,14 - PUSHBUTTON "•ύX(&C)...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "ƒwƒ‹ƒv",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 346, 153 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒEƒBƒU[ƒh" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "ŽŸ‚Ö(&N) >",IDNEXT,229,132,50,14 - PUSHBUTTON "ŽæÁ‚µ(&L)",IDCANCEL,281,132,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,240,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,324,1 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,125,132,50,14 - PUSHBUTTON "< –ß‚é(&B)",IDBACK,177,132,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 240, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ª‚Ü‚¾ŠJŽn‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB", - IDC_STATIC,0,5,209,8 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn‚·‚é‚ɂ́AuŽŸ‚ցv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_STATIC,0,73,233,8 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ªŽÀs‚³‚ê‚é‚܂ŁAAFS ‚ɕۊǂ³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB", - IDC_STATIC,0,17,233,17 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~‚µ‚½‚܂܂ɂ·‚é‚ɂ́AuŽæÁ‚µv‚ðƒNƒŠƒbƒNB", - IDC_STATIC,0,86,233,10 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 240, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ÍŽÀs‚³‚ê‚Ä‚¢‚Ü‚·‚ªAAFS ‚ðŽg—p‚·‚邽‚߂̃g[ƒNƒ“‚ð‚Ü‚¾Žæ“¾‚µ‚Ä‚¢‚Ü‚¹‚ñB", - IDC_STATIC,0,3,173,20 - CONTROL "‚¢‚¸‚ê‚̃Zƒ‹‚É‚àƒg[ƒNƒ“‚ðŽæ“¾‚µ‚È‚¢",IDC_NOCREDS, - "Button",BS_AUTORADIOBUTTON,10,27,155,10 - CONTROL "ŽŸ‚̃Zƒ‹‚̃g[ƒNƒ“‚ðŽæ“¾:",IDC_YESCREDS,"Button", - BS_AUTORADIOBUTTON,10,41,141,10 - LTEXT "AFS ƒZƒ‹(&C):",IDC_STATIC,14,60,57,8 - EDITTEXT IDC_NEWCREDS_CELL,77,58,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "ƒ†[ƒU[–¼(&N):",IDC_STATIC,14,78,57,8 - EDITTEXT IDC_NEWCREDS_USER,77,76,96,14,ES_AUTOHSCROLL - LTEXT "ƒpƒXƒ[ƒh(&P):",IDC_STATIC,13,96,57,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,93,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 240, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn’†‚Å‚·...", - IDC_START_TRY,0,25,240,8 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒlƒbƒgƒ[ƒNÝ’è‚ðŠm”F‚µA‚Ü‚½ƒRƒ“ƒgƒ[ƒ‹Eƒpƒlƒ‹‚Ì AFS ƒAƒCƒRƒ“‚ðŽg—p‚µ‚āA‚±‚̃Rƒ“ƒsƒ…[ƒ^[ã‚Ì AFS ƒNƒ‰ƒCƒAƒ“ƒg‚̍\¬‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B", - IDC_START_FAIL,0,25,240,51 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 240, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ‚ɕۊǂ³‚ꂽƒtƒ@ƒCƒ‹‚ɃAƒNƒZƒX‚·‚é‚ɂ́AAFS “à‚̃pƒX‚Ƀhƒ‰ƒCƒu–¼‚ðƒ}ƒbƒsƒ“ƒO‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B", - IDC_STATIC,3,4,223,16 - CONTROL "ƒhƒ‰ƒCƒu–¼‚ð AFS ‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO‚µ‚È‚¢(&D)", - IDC_NOMAP,"Button",BS_AUTORADIOBUTTON,10,25,189,10 - CONTROL "­‚È‚­‚Æ‚à 1 ‚‚̃hƒ‰ƒCƒu–¼‚ð AFS ‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO(&M):", - IDC_YESMAP,"Button",BS_AUTORADIOBUTTON,9,40,230,10 - LTEXT "ƒhƒ‰ƒCƒu–¼(&L):",IDC_STATIC,34,58,56,8 - COMBOBOX IDC_MAP_LETTER,97,56,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ƒpƒX(&P):",IDC_STATIC,34,76,50,8 - EDITTEXT IDC_MAP_PATH,97,74,96,14,ES_AUTOHSCROLL - LTEXT "‹Lq(&E):",IDC_STATIC,34,94,33,8 - EDITTEXT IDC_MAP_DESC,97,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 291, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ƒNƒ‰ƒCƒAƒ“ƒg" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - PUSHBUTTON "ƒAƒCƒRƒ“‚̍폜(&R)",IDOK,147,95,77,14 - PUSHBUTTON "ŽæÁ‚µ(&L)",IDCANCEL,234,95,50,14 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒAƒCƒRƒ“‚ðƒRƒ“ƒsƒ…[ƒ^[‚̃^ƒXƒNƒo[‚©‚çíœ‚·‚邿‚¤‘I‘ð‚µ‚Ü‚µ‚½BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒAƒCƒRƒ“‚ªƒRƒ“ƒsƒ…[ƒ^[‚̃^ƒXƒNƒo[‚ɂȂ¢ê‡AAFS ‚Í AFS ƒg[ƒNƒ“‚ÌŠúŒÀØ‚ꂪ‹ß‚¢‚Ä‚àŒx‚ðo‚¹‚Ü‚¹‚ñB", - IDC_STATIC,7,4,277,26 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ÍŒ»ÝŽÀs’†‚Å‚·B•K—v‚Ȃ炢‚Ü’âŽ~‚Å‚«‚Ü‚·B", - IDC_STATIC,7,38,279,12 - CONTROL "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŽÀs‚³‚¹‚Ä‚¨‚­(&L)", - IDC_LEAVE,"Button",BS_AUTORADIOBUTTON,26,53,193,10 - CONTROL "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~‚·‚é(&S)",IDC_STOP, - "Button",BS_AUTORADIOBUTTON,26,67,170,10 - CONTROL "ƒRƒ“ƒsƒ…[ƒ^[‚̍Ďn“®Žž‚ɃAƒCƒRƒ“‚ð•\ަ(&H)", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,83, - 186,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ƒNƒ‰ƒCƒAƒ“ƒg" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - PUSHBUTTON "ƒAƒCƒRƒ“‚̍폜(&R)",IDOK,153,46,77,14 - PUSHBUTTON "ŽæÁ‚µ(&L)",IDCANCEL,234,46,50,14 - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒAƒCƒRƒ“‚ðƒRƒ“ƒsƒ…[ƒ^[‚̃^ƒXƒNƒo[‚©‚çíœ‚·‚邿‚¤‘I‘ð‚µ‚Ü‚µ‚½BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒAƒCƒRƒ“‚ªƒRƒ“ƒsƒ…[ƒ^[‚̃^ƒXƒNƒo[‚ɂȂ¢ê‡AAFS ‚Í AFS ƒg[ƒNƒ“‚ÌŠúŒÀØ‚ꂪ‹ß‚¢‚Ä‚àŒx‚ðo‚¹‚Ü‚¹‚ñB", - -1,7,5,277,26 - CONTROL "ƒRƒ“ƒsƒ…[ƒ^[‚̍Ďn“®Žž‚ɃAƒCƒRƒ“‚ð•\ަ(&H)", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35, - 160,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Light" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x1 -BEGIN - PUSHBUTTON "ƒAƒCƒRƒ“‚̍폜(&R)",IDOK,154,53,77,14 - PUSHBUTTON "ŽæÁ‚µ(&L)",IDCANCEL,234,53,50,14 - LTEXT "AFS Light ƒAƒCƒRƒ“‚ðƒRƒ“ƒsƒ…[ƒ^[‚̃^ƒXƒNƒo[‚©‚çíœ‚·‚邱‚Æ‚ð‘I‘ð‚µ‚Ü‚µ‚½BAFS Light ƒAƒCƒRƒ“‚ªƒRƒ“ƒsƒ…[ƒ^[‚̃^ƒXƒNƒo[‚ɂȂ¢ê‡AAFS ‚Í AFS ƒg[ƒNƒ“‚ÌŠúŒÀØ‚ꂪ‹ß‚¢‚Ä‚àŒx‚ðo‚¹‚Ü‚¹‚ñB", - -1,7,7,277,25 - CONTROL "ƒRƒ“ƒsƒ…[ƒ^[‚̍Ďn“®Žž‚ɃAƒCƒRƒ“‚ð•\ަ(&H)", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,41, - 186,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 240, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "‘I‘ð‚µ‚½ 1 ‚‚܂½‚Í•¡”‚̃hƒ‰ƒCƒu–¼‚ð AFS “à‚Ì“KØ‚ȃpƒX‚Ƀ}ƒbƒsƒ“ƒO‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\n‚·‚Å‚É AFS “à‚̃pƒX‚ÌŽg—p‚µ‚悤‚Æ‚µ‚Ä‚¢‚éƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðƒNƒ[ƒY‚·‚é•K—v‚ª‚ ‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B", - IDC_MAP_FAIL,0,26,240,41 - LTEXT "‚¨‘Ò‚¿‚­‚¾‚³‚¢Bƒhƒ‰ƒCƒu–¼‚ð AFS “à‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO’†‚Å‚·...", - IDC_MAP_TRY,0,33,240,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 240, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ÍŽg—p‚̏€”õ‚ª‚Å‚«‚Ü‚µ‚½B",IDC_STATIC, - 0,0,173,8 - LTEXT "‚±‚̃EƒBƒU[ƒh‚̃Nƒ[ƒY‚ɂ́AuI—¹v‚ðƒNƒŠƒbƒNB", - IDC_STATIC,0,73,200,8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒhƒ‰ƒCƒu–¼‚̃}ƒbƒsƒ“ƒO" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "ƒRƒ“ƒsƒ…[ƒ^[‚̃hƒ‰ƒCƒu–¼‚ð AFS “à‚̃pƒX‚Ƀ}ƒbƒsƒ“ƒO‚Å‚«‚Ü‚·B\n\n‚½‚Æ‚¦‚΁AQ: ‚ð \\afs\\acme.com\\usr\\bob ‚Æ‚µ‚ă}ƒbƒsƒ“ƒO‚·‚邯AAFS ‚Å \\afs\\acme.com\\usr\\bob\\* ‚Æ‚µ‚ÄŽg—p‰Â”\‚ȃtƒ@ƒCƒ‹‚Í Q:\\ ‚ʼnŽ‹‚ɂȂè‚Ü‚·B", - IDC_STATIC,7,7,261,36 - LTEXT "ƒhƒ‰ƒCƒu–¼(&L):",IDC_STATIC,23,53,49,8 - COMBOBOX IDC_MAP_LETTER,83,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ƒpƒX(&P):",IDC_STATIC,23,70,49,8 - EDITTEXT IDC_MAP_PATH,83,68,178,13,ES_AUTOHSCROLL - LTEXT "‹Lq(&E):",IDC_STATIC,23,88,49,8 - EDITTEXT IDC_MAP_DESC,83,86,60,13,ES_AUTOHSCROLL - CONTROL "ƒƒOƒIƒ“Žž‚É‚±‚̃}ƒbƒsƒ“ƒO‚𕜌³(&R)", - IDC_MAP_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 73,109,154,10 - DEFPUSHBUTTON "—¹‰ð",IDOK,112,131,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,165,131,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,218,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 300 - TOPMARGIN, 5 - BOTTOMMARGIN, 126 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 7 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 331 - TOPMARGIN, 7 - BOTTOMMARGIN, 146 - END - - IDD_WIZ_START, DIALOG - BEGIN - RIGHTMARGIN, 233 - END - - IDD_WIZ_MOUNT, DIALOG - BEGIN - RIGHTMARGIN, 239 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 61 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 268 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "ƒg[ƒNƒ“‚Ì•\ަ(&S)...", M_ACTIVATE - MENUITEM "ŠúŒÀØ‚ê‘O‚ÉŒx(&W)", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "ƒAƒCƒRƒ“‚̍폜(&R)...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS ƒNƒ‰ƒCƒAƒ“ƒg" - IDS_TOOLTIP_95 "AFS Light" - IDS_CREDENTIALS "ƒg[ƒNƒ“" - IDS_UNKNOWN "(•s–¾)" - IDS_ADVANCED "Šg’£" - IDS_CREDS "%1 (ƒg[ƒNƒ“‚ÌŠúŒÀØ‚ê %2)" - IDS_NO_CREDS "(‚±‚̃Zƒ‹‚Ƀg[ƒNƒ“‚ª‚ ‚è‚Ü‚¹‚ñ)" - IDS_SERVICE_BROKEN "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ª³‚µ‚­ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚È‚¢‚©A‚Ü‚½‚Í‚»‚Ìó‹µ‚ðÆ‰ï‚·‚錠ŒÀ‚ðŽ‚Á‚Ä‚¢‚Ü‚¹‚ñB" - IDS_SERVICE_RUNNING "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚͐³í‚ÉŽÀs‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_SERVICE_STOPPED "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ÍŒ»Ý’âŽ~‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_SERVICE_STOPPING "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ð’âŽ~’†‚Å‚·..." - IDS_SERVICE_STARTING "‚¨‘Ò‚¿‚­‚¾‚³‚¢BAFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ðŠJŽn’†‚Å‚·..." - IDS_SERVICE_UNKNOWN "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚̏󋵂𔻕ʂł«‚Ü‚¹‚ñ‚Å‚µ‚½B" - IDS_SERVICE_FAIL_STOP "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚𐳏í‚É’âŽ~‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B‚±‚Ì‘€ì‚ðŽÀs‚·‚錠ŒÀ‚ðŽ‚Á‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B\n\nƒGƒ‰[ 0x%1 " - IDS_SERVICE_FAIL_START "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚𐳏í‚ÉŠJŽn‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B‚±‚Ì‘€ì‚ðŽÀs‚·‚錠ŒÀ‚ðŽ‚Á‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B\n\nƒGƒ‰[ 0x%1" - IDS_SERVICE_FAIL_CONFIG "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ÌŽn“®ƒpƒ‰ƒ[ƒ^[‚ð•ύX‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B‚±‚Ì‘€ì‚ðŽÀs‚·‚錠ŒÀ‚ðŽ‚Á‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B\n\nƒGƒ‰[ 0x%1" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "ƒT[ƒrƒX‚̍\¬ƒGƒ‰[" - IDS_ERROR_TITLE "ƒGƒ‰[ - AFS ƒNƒ‰ƒCƒAƒ“ƒg" - IDS_ERROR_TITLE_95 "ƒGƒ‰[ - AFS Light " - IDS_ERROR_DESTROY_95 "%1 ƒZƒ‹‚̃g[ƒNƒ“‚ð”jŠü‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[: %2" - IDS_ERROR_DESTROY_NOCM "AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒT[ƒrƒX‚ª‰ž“š‚µ‚Ä‚¢‚È‚¢‚½‚߁A%1 ƒZƒ‹‚̃g[ƒNƒ“‚ð”jŠü‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ª³í‚ÉŽÀs‚³‚ê‚Ä‚¢‚é‚©‚ðuŠg’£vƒ^ƒu‚Å’²‚ׂĂ­‚¾‚³‚¢B\n\nƒGƒ‰[: %2" - IDS_ERROR_DESTROY_UNKNOWN - "%1 ƒZƒ‹‚̃g[ƒNƒ“‚ð”jŠü‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ª³í‚ÉŽÀs‚³‚ê‚Ä‚¢‚é‚©‚ðuŠg’£vƒ^ƒu‚Å’²‚ׂĂ­‚¾‚³‚¢B\n\nƒGƒ‰[: %2" - IDS_ERROR_OBTAIN "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ªƒZƒ‹ %1 ‚Å %2 ‚Æ‚µ‚ăg[ƒNƒ“‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[: %4 (%3)" - IDS_ERROR_OBTAIN_95 "AFS Light ‚ªƒZƒ‹ %1 ‚Å %2 ‚Æ‚µ‚ăg[ƒNƒ“‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nƒGƒ‰[: %4 (%3)" - IDS_TITLE_VERSION "AFS ƒo[ƒWƒ‡ƒ“ %s" - IDS_TITLE_VERSION_NOPATCH "AFS ƒo[ƒWƒ‡ƒ“ %s" - IDS_MOUNT_SOME "ˆÈ‰º‚̃hƒ‰ƒCƒu–¼‚Ì AFS “à‚̃pƒX‚ւ̃}ƒbƒsƒ“ƒO‚ð‘I‘ð‚µ‚Ü‚µ‚½:" - IDS_MOUNT_NONE "ƒhƒ‰ƒCƒu–¼‚Ì AFS “à‚̃pƒX‚ւ̃}ƒbƒsƒ“ƒO‚ð‘I‘ð‚µ‚Ä‚¢‚Ü‚¹‚ñB" - IDS_MOUNT "ƒhƒ‰ƒCƒu–¼" - IDS_WIZ_NEXT "ŽŸ‚Ö(&N) >" - IDS_WIZ_FINISH "I—¹(&F)" - IDS_MAP_LETTER "ƒhƒ‰ƒCƒu *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "ƒhƒ‰ƒCƒu %1: \t%2" - IDS_ERROR_MAP "ƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̃}ƒbƒsƒ“ƒOEƒGƒ‰[" - IDS_ERROR_MAP_DESC "AFS ‚Í AFS “à‚ÌŽw’肳‚ꂽƒpƒX‚Ƀlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚ðƒ}ƒbƒsƒ“ƒO‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½Bƒhƒ‰ƒCƒu–¼‚ªŒ»ÝŽg—p’†‚łȂ¢‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B\n\nƒGƒ‰[: 0x%1 " - IDS_ERROR_UNMAP "ƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̃}ƒbƒsƒ“ƒOEƒGƒ‰[" - IDS_ERROR_UNMAP_DESC "AFS ‚ÍŽw’肳‚ꂽƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚ðƒ}ƒbƒsƒ“ƒO‰ðœ‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½Bƒhƒ‰ƒCƒu–¼‚ªŒ»ÝŽg—p’†‚łȂ¢‚©‚ðŠm‚©‚߂Ă­‚¾‚³‚¢B\n\nƒGƒ‰[: 0x%1" - IDS_CELL_GATEWAY "%s (ƒQ[ƒgƒEƒFƒC %s Œo—R)" - IDS_BADMAP_TITLE "ƒlƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̃}ƒbƒsƒ“ƒOEƒGƒ‰[" - IDS_BADMAP_DESC "ƒpƒX‚ª ""\\afs"" ‚ÅŽn‚Ü‚Á‚Ä‚¢‚È‚¢‚½‚߁AAFS ‚̓hƒ‰ƒCƒu–¼‚ðŽw’肳‚ꂽƒpƒX‚Ƀ}ƒbƒsƒ“ƒO‚Å‚«‚Ü‚¹‚ñB\n\n“ü—Í‚µ‚½ƒpƒX‚ª ""\\afs"" ‚ÅŽn‚Ü‚Á‚Ä‚¢‚é‚©‚ðŠm‚©‚߂Ă©‚çA‚â‚è’¼‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_UNCONFIG_TITLE_95 "ƒGƒ‰[ - AFS Light " - IDS_UNCONFIG_DESC_95 "AFS Light ‚ª\¬‚³‚ê‚Ä‚¢‚È‚¢‚½‚ߎg—p‚Å‚«‚Ü‚¹‚ñB\n\nAFS Light ‚ð\¬‚·‚é‚ɂ́AƒRƒ“ƒgƒ[ƒ‹Eƒpƒlƒ‹‚ðŠJ‚¢‚āuAFS Light \¬vƒAƒCƒRƒ“‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_UNCONFIG_TITLE "ƒGƒ‰[ - AFS ƒNƒ‰ƒCƒAƒ“ƒg" - IDS_UNCONFIG_DESC "AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ª\¬‚³‚ê‚Ä‚¢‚È‚¢‚½‚ߎg—p‚Å‚«‚Ü‚¹‚ñB\n\nAFS ƒNƒ‰ƒCƒAƒ“ƒg‚ð\¬‚·‚é‚ɂ́AƒRƒ“ƒgƒ[ƒ‹Eƒpƒlƒ‹‚ðŠJ‚¢‚āuAFS ƒNƒ‰ƒCƒAƒ“ƒgvƒAƒCƒRƒ“‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_NEWSUB_TITLE "’ˆÓ - AFS ƒNƒ‰ƒCƒAƒ“ƒg" - IDS_NEWSUB_TITLE_95 "’ˆÓ - AFS Light " - IDS_NEWSUB_DESC "AFS ‚̓lƒbƒgƒ[ƒNEƒhƒ‰ƒCƒu‚̐ڑ±Žž‚ÉŽw’肳‚ꂽ‹Lq‚ðŽg—p‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B\n\nŽw’肳‚ꂽ‹Lq‚Í‚·‚łɑ¼‚Ì AFS ƒpƒX‚ÉŽg—p‚³‚ê‚Ä‚¢‚Ü‚·B" - IDS_BADSUB_TITLE "ƒGƒ‰[ - AFS ƒNƒ‰ƒCƒAƒ“ƒg" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "ƒGƒ‰[ - AFS Light " - IDS_BADSUB_DESC "“ü—Í‚µ‚½ƒhƒ‰ƒCƒu–¼‹Lq‚ðŽg—p‚Å‚«‚Ü‚¹‚ñB\n\nƒhƒ‰ƒCƒu–¼‚Ì‹Lq‚Í 12 •¶Žš‚ð’´‚¦‚Ă͂Ȃ炸AƒXƒy[ƒX‚Ü‚½‚̓^ƒu‚ðŠÜ‚ñ‚Å‚¢‚Ă͂¢‚¯‚Ü‚¹‚ñB" - IDS_TITLE_95 "AFS Light" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/ko_KR/afscreds.rc b/src/WINNT/client_creds/lang/ko_KR/afscreds.rc deleted file mode 100644 index 519d795d2..000000000 --- a/src/WINNT/client_creds/lang/ko_KR/afscreds.rc +++ /dev/null @@ -1,573 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 322, 129 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Ŭ¶óÀ̾ðÆ®" -CLASS "AfsCreds" -FONT 9, "±¼¸²" -BEGIN - RTEXT "AFS %s ¹öÀü(ÆÐÄ¡ %lu)",IDC_TITLE_VERSION,224,8,90,8 - LTEXT "ÇöÀç Windows ³×Æ®¿öÅ©¿¡ ""%s""(À¸)·Î ·Î±×¿ÂµÇ¾ú½À´Ï´Ù.", - IDC_TITLE_NT,14,8,218,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,25,307,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼¿: ",IDC_STATIC,7,9,24,8 - LTEXT "(¾øÀ½)",IDC_CREDS_CELL,51,9,193,8 - LTEXT "ÅäÅ«:",IDC_STATIC,7,26,27,8 - LTEXT "(¾øÀ½)",IDC_CREDS_INFO,51,26,193,8 - CONTROL "ÀÌ ÅäÅ«ÀÌ ¸¸±âµÇ±â Àü¿¡ °æ°í Ç¥½Ã(&S)",IDC_CREDS_REMIND, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,51,43,193,10 - PUSHBUTTON "»õ ÅäÅ« È®º¸(&O)...",IDC_CREDS_OBTAIN,51,63,88,14 - PUSHBUTTON "ÀÌ ÅäÅ«À» ¹ö¸²(&D)",IDC_CREDS_DESTROY,142,63,92,14 - PUSHBUTTON "µµ¿ò¸»",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "¸ðµç AFS ¼¿¿¡ ÅäÅ«ÀÌ ¾ø½À´Ï´Ù.",IDC_RUNNING,7,9,275,8 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ®°¡ Á¦´ë·Î ±¸¼ºµÇÁö ¾Ê¾Ò°Å³ª AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇà ÁßÀÌ ¾Æ´Õ´Ï´Ù.\n\n°í±Þ ÅÇÀ» »ç¿ëÇÏ¿© AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÃÀÛÇϽʽÿÀ.", - IDC_STOPPED,7,23,275,36 - PUSHBUTTON "µµ¿ò¸»",9,237,63,45,14 - PUSHBUTTON "»õ ÅäÅ« È®º¸(&O)...",IDC_CREDS_OBTAIN,51,63,88,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "(Á¶È¸ Áß...)",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "¼­ºñ½º ½ÃÀÛ(&S)",IDC_SERVICE_START,51,28,63,14 - PUSHBUTTON "¼­ºñ½º Á¤Áö(&T)",IDC_SERVICE_STOP,118,28,63,14 - PUSHBUTTON "AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º(&C)",IDC_OPEN_CPL,185,28,97,14 - CONTROL "ÀÌ ÄÄÇ»ÅͰ¡ Àç½ÃÀÛµÉ ¶§¸¶´Ù AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º ½ÃÀÛ(&a)", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,204,10 - CONTROL "ÀÛ¾÷ Ç¥½ÃÁÙ¿¡ AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜÀ» Ç×»ó Ç¥½Ã(&A)", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65, - 204,10 - PUSHBUTTON "µµ¿ò¸»",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "»õ AFS ÅäÅ« È®º¸" -FONT 9, "±¼¸²" -BEGIN - LTEXT "»õ AFS ÅäÅ«À» È®º¸ÇÏ·Á¸é, AFS °èÁ¤¿¡ ´ëÇÑ AFS »ç¿ëÀÚ À̸§ ¹× ¾ÏÈ£¸¦ ÀÔ·ÂÇϽʽÿÀ. ÅäÅ«Àº µ¿½Ã¿¡ ¿©·¯ AFS ¼¿¿¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,7,218,24 - LTEXT "AFS ¼¿(&C):",IDC_STATIC,24,42,30,8 - EDITTEXT IDC_NEWCREDS_CELL,67,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "»ç¿ëÀÚ À̸§(&N):",IDC_STATIC,24,60,38,8 - EDITTEXT IDC_NEWCREDS_USER,67,58,97,14,ES_AUTOHSCROLL - LTEXT "¾ÏÈ£(&P):",IDC_STATIC,23,78,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,69,106,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,122,106,50,14 - PUSHBUTTON "µµ¿ò¸»",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "»õ AFS ÅäÅ« È®º¸" -FONT 9, "±¼¸²" -BEGIN - LTEXT "»õ AFS ÅäÅ«À» È®º¸ÇÏ·Á¸é, AFS °èÁ¤¿¡ ´ëÇÑ AFS »ç¿ëÀÚ À̸§ ¹× ¾ÏÈ£¸¦ ÀÔ·ÂÇϽʽÿÀ. ÅäÅ«Àº µ¿½Ã¿¡ ¿©·¯ AFS ¼¿¿¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,29,218,24 - LTEXT "AFS ¼¿(&C):",IDC_STATIC,24,70,30,8 - EDITTEXT IDC_NEWCREDS_CELL,67,68,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "»ç¿ëÀÚ À̸§(&N):",IDC_STATIC,24,88,38,8 - EDITTEXT IDC_NEWCREDS_USER,67,86,97,14,ES_AUTOHSCROLL - LTEXT "¾ÏÈ£(&P):",IDC_STATIC,23,106,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "%1 ¼¿¿¡ ÀÖ´Â ÅäÅ«ÀÌ °ð ¸¸±âµË´Ï´Ù.",IDC_NEWCREDS_TITLE, - 7,7,218,16 - DEFPUSHBUTTON "È®ÀÎ",IDOK,69,134,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,122,134,50,14 - PUSHBUTTON "µµ¿ò¸»",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "´ÙÀ½ µå¶óÀ̺ê À̸§À» AFSÀÇ °æ·Î¿¡ ¸ÊÇÎÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù.", - IDC_TITLE,7,8,275,8 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,51,63,45,14 - PUSHBUTTON "º¯°æ(&C)...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "µµ¿ò¸»",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 272, 152 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Ŭ¶óÀÌ¾ðÆ® ¸¶¹ý»ç" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "´ÙÀ½(&N) >",IDNEXT,162,131,50,14 - PUSHBUTTON "Ãë¼Ò(&L)",IDCANCEL,215,131,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,174,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,258,1 - PUSHBUTTON "µµ¿ò¸»(&H)",9,59,131,50,14 - PUSHBUTTON "< µÚ·Î(&B)",IDBACK,112,131,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ¾ÆÁ÷ ½ÃÀÛµÇÁö ¾Ê¾Ò½À´Ï´Ù.", - IDC_STATIC,0,0,173,8 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÃÀÛÇÏ·Á¸é, ´ÙÀ½À» ´©¸£½Ê½Ã¿À.", - IDC_STATIC,0,59,173,22 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÇÇàµÉ ¶§±îÁö AFS¿¡ ÀúÀåµÈ ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_STATIC,0,17,173,17 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ Á¤ÁöµÈ »óÅ·ΠµÎ·Á¸é, Ãë¼Ò¸¦ ´©¸£½Ê½Ã¿À.", - IDC_STATIC,0,88,174,21 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º´Â ½ÇÇà ÁßÀÌÁö¸¸, AFS »ç¿ë¿¡ ÇÊ¿äÇÑ ÅäÅ«À» ¾ÆÁ÷ È®º¸ÇÏÁö ¸øÇß½À´Ï´Ù.", - IDC_STATIC,0,0,173,16 - CONTROL "ÀÓÀÇÀÇ ¼¿¿¡ ´ëÇÑ ÅäÅ«À» È®º¸ÇÏÁö ¾ÊÀ½",IDC_NOCREDS, - "Button",BS_AUTORADIOBUTTON,10,28,141,10 - CONTROL "´ÙÀ½ ¼¿¿¡¼­ ÅäÅ« È®º¸",IDC_YESCREDS,"Button", - BS_AUTORADIOBUTTON,10,44,141,10 - LTEXT "AFS ¼¿(&C):",IDC_STATIC,34,64,30,8 - EDITTEXT IDC_NEWCREDS_CELL,77,62,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "»ç¿ëÀÚ À̸§(&N):",IDC_STATIC,34,82,38,8 - EDITTEXT IDC_NEWCREDS_USER,77,80,96,14,ES_AUTOHSCROLL - LTEXT "¾ÏÈ£(&P):",IDC_STATIC,33,100,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "±â´Ù¸®½Ê½Ã¿À. AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÃÀÛ ÁßÀÔ´Ï´Ù...", - IDC_START_TRY,0,33,173,8 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n³×Æ®¿öÅ© ¼³Á¤À» Á¡°ËÇϰí Á¦¾îÆÇÀÇ AFS ¾ÆÀÌÄÜÀ» »ç¿ëÇÏ¿© ÀÌ ÄÄÇ»ÅÍ¿¡¼­ÀÇ AFS Ŭ¶óÀ̾ðÆ®ÀÇ ±¸¼ºÀ» È®ÀÎÇϽʽÿÀ.", - IDC_START_FAIL,0,25,173,41 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "AFS¿¡ ÀúÀåµÈ ÆÄÀÏ¿¡ ¾×¼¼½ºÇÏ·Á¸é, µå¶óÀ̺ê À̸§À» AFSÀÇ °æ·Î¿¡ ¸ÊÇνÃÄÑ¾ß ÇÕ´Ï´Ù.", - IDC_STATIC,0,0,173,16 - CONTROL "AFS¿¡¼­ °æ·Î¿¡ µå¶óÀ̺ê À̸§À» ¸ÊÇÎ ¾ÈÇÔ(&D)",IDC_NOMAP, - "Button",BS_AUTORADIOBUTTON,10,23,157,10 - CONTROL "AFS¿¡¼­ °æ·Î¿¡ µå¶óÀ̺ê À̸§À» ¸ÊÇÎÇÔ(&M)",IDC_YESMAP, - "Button",BS_AUTORADIOBUTTON,10,40,156,10 - LTEXT "µå¶óÀ̺ê À̸§(&L):",IDC_STATIC,30,58,44,8 - COMBOBOX IDC_MAP_LETTER,77,56,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS °æ·Î(&P):",IDC_STATIC,34,76,33,8 - EDITTEXT IDC_MAP_PATH,77,74,96,14,ES_AUTOHSCROLL - LTEXT "¼³¸í(&E):",IDC_STATIC,34,94,38,8 - EDITTEXT IDC_MAP_DESC,77,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 291, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Ŭ¶óÀ̾ðÆ®" -FONT 9, "±¼¸²" -BEGIN - PUSHBUTTON "¾ÆÀÌÄÜ Á¦°Å(&R)",IDOK,167,96,63,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,234,96,50,14 - LTEXT "ÄÄÇ»ÅÍÀÇ ÀÛ¾÷ Ç¥½ÃÁÙ¿¡¼­ AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜÀ» Á¦°ÅÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù. AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜÀÌ ÄÄÇ»ÅÍÀÇ ÀÛ¾÷ Ç¥½ÃÁÙ¿¡ ¾øÀ¸¸é, AFS´Â AFS ÅäÅ«ÀÌ ¸¸±âµÉ ¶§ À̸¦ °æ°íÇÒ ¼ö ¾ø½À´Ï´Ù.", - IDC_STATIC,7,7,277,25 - LTEXT "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ÇöÀç ½ÇÇà ÁßÀÔ´Ï´Ù. ÇÊ¿äÇÑ °æ¿ì, Áö±Ý Á¤Áö½Ãų ¼ö ÀÖ½À´Ï´Ù.", - IDC_STATIC,7,41,277,8 - CONTROL "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÇÇà »óÅ·ΠµÒ(&L)",IDC_LEAVE, - "Button",BS_AUTORADIOBUTTON,26,55,228,10 - CONTROL "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º Á¤Áö(&S)",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,26,69,228,10 - CONTROL "ÄÄÇ»ÅͰ¡ ´Ù½Ã ½ÃÀÛÇÒ ¶§ ¾ÆÀÌÄÜ Ç¥½Ã(&H)",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98,148,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Ŭ¶óÀ̾ðÆ®" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - PUSHBUTTON "¾ÆÀÌÄÜ Á¦°Å(&R)",IDOK,167,47,63,14 - PUSHBUTTON "Ãë¼Ò(&L)",IDCANCEL,234,47,50,14 - LTEXT "ÄÄÇ»ÅÍÀÇ ÀÛ¾÷ Ç¥½ÃÁÙ¿¡¼­ AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜÀ» Á¦°ÅÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù. AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜÀÌ ÄÄÇ»ÅÍÀÇ ÀÛ¾÷ Ç¥½ÃÁÙ¿¡ ¾øÀ¸¸é, AFS´Â AFS ÅäÅ«ÀÌ ¸¸±âµÉ ¶§ À̸¦ °æ°íÇÒ ¼ö ¾ø½À´Ï´Ù.", - -1,7,7,277,25 - CONTROL "ÄÄÇ»ÅͰ¡ ´Ù½Ã ½ÃÀÛÇÒ ¶§ ¾ÆÀÌÄÜ Ç¥½Ã(&H)",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¶óÀÌÆ®" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - PUSHBUTTON "¾ÆÀÌÄÜ Á¦°Å(&R)",IDOK,167,47,63,14 - PUSHBUTTON "Ãë¼Ò(&L)",IDCANCEL,234,47,50,14 - LTEXT "ÄÄÇ»ÅÍÀÇ ÀÛ¾÷ Ç¥½ÃÁÙ¿¡¼­ AFS ¶óÀÌÆ® ¾ÆÀÌÄÜÀ» Á¦°ÅÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù. AFS ¶óÀÌÆ® ¾ÆÀÌÄÜÀÌ ÄÄÇ»ÅÍÀÇ ÀÛ¾÷ Ç¥½ÃÁÙ¿¡ ¾øÀ¸¸é, AFS´Â AFS ÅäÅ«ÀÌ ¸¸±âµÉ ¶§ À̸¦ °æ°íÇÒ ¼ö ¾ø½À´Ï´Ù.", - -1,7,7,277,25 - CONTROL "ÄÄÇ»ÅͰ¡ ´Ù½Ã ½ÃÀÛÇÒ ¶§ ¾ÆÀÌÄÜ Ç¥½Ã(&H)",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "¼±ÅÃÇÑ Çϳª ÀÌ»óÀÇ µå¶óÀ̺ê À̸§À» AFSÀÇ ÇØ´ç °æ·Î¿¡ ¸ÊÇνÃų ¼ö ¾ø½À´Ï´Ù.\n\nAFSÀÇ °æ·Î¸¦ »ç¿ëÇÏ·Á°í ½Ãµµ ÁßÀÎ ¸ðµç ÀÀ¿ëÇÁ·Î±×·¥À» ´Ý¾Æ¾ß ÇÕ´Ï´Ù.", - IDC_MAP_FAIL,1,26,173,41 - LTEXT "±â´Ù¸®½Ê½Ã¿À. AFSÀÇ °æ·Î¿¡ µå¶óÀ̺ê À̸§À» ¸ÊÇÎÇÏ´Â ÁßÀÔ´Ï´Ù...", - IDC_MAP_TRY,0,33,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÀÌÁ¦ AFS Ŭ¶óÀÌ¾ðÆ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.",IDC_STATIC,0, - 0,173,8 - LTEXT "¸¶¹ý»ç¸¦ ³¡³»½Ã·Á¸é Á¾·á¸¦ ´©¸£½Ê½Ã¿À.",IDC_STATIC,0,73, - 173,8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µå¶óÀ̺ê À̸§ ¸ÊÇÎ" -FONT 9, "±¼¸²" -BEGIN - LTEXT "ÄÄÇ»ÅÍÀÇ µå¶óÀ̺ê À̸§À» AFSÀÇ °æ·Î¿¡ ¸ÊÇÎÇÒ ¼ö ÀÖ½À´Ï´Ù.\n\n¿¹¸¦ µé¾î, Q:¸¦ \\afs\\acme.com\\usr\\bob·Î ¸ÊÇÎÇϸé, AFS¿¡¼­ \\afs\\acme.com\\usr\\bob\\*·Î¼­ »ç¿ë°¡´ÉÇÑ ÆÄÀÏÀ» Q:¿¡¼­ º¼ ¼ö ÀÖ°Ô µË´Ï´Ù.\\", - IDC_STATIC,7,7,261,32 - LTEXT "µå¶óÀ̺ê À̸§(&L):",IDC_STATIC,23,53,45,8 - COMBOBOX IDC_MAP_LETTER,73,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS °æ·Î(&P):",IDC_STATIC,23,70,33,8 - EDITTEXT IDC_MAP_PATH,73,68,178,13,ES_AUTOHSCROLL - LTEXT "¼³¸í(&E):",IDC_STATIC,23,88,38,8 - EDITTEXT IDC_MAP_DESC,73,86,60,13,ES_AUTOHSCROLL - CONTROL "·Î±×¿ÂÇÒ ¶§¸¶´Ù ÀÌ ¸ÊÇÎ º¹¿ø(&R)",IDC_MAP_PERSISTENT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,105,185,10 - DEFPUSHBUTTON "È®ÀÎ",IDOK,112,131,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,165,131,50,14 - PUSHBUTTON "µµ¿ò¸»",9,218,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 314 - TOPMARGIN, 8 - BOTTOMMARGIN, 122 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 61 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 268 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "ÅäÅ« Ç¥½Ã(&S)...", M_ACTIVATE - MENUITEM "¸¸±â Àü °æ°í(&W)", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "¾ÆÀÌÄÜ Á¦°Å(&R)...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS Ŭ¶óÀ̾ðÆ®" - IDS_TOOLTIP_95 "AFS ¶óÀÌÆ®" - IDS_CREDENTIALS "ÅäÅ«" - IDS_UNKNOWN "(¾Ë ¼ö ¾øÀ½)" - IDS_ADVANCED "°í±Þ" - IDS_CREDS "%1(ÅäÅ«Àº %2¿¡ ¸¸±â)" - IDS_NO_CREDS "(ÀÌ ¼¿¿¡ ÅäÅ«ÀÌ ¾ø½À´Ï´Ù)" - IDS_SERVICE_BROKEN "AFS Ŭ¶óÀÌ¾ðÆ®°¡ Á¦´ë·Î ¼³Ä¡µÇÁö ¾Ê¾Ò°Å³ª ±× »óŸ¦ Á¶È¸ÇÒ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù." - IDS_SERVICE_RUNNING "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ Á¤»óÀûÀ¸·Î ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_SERVICE_STOPPED "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ÇöÀç Á¤ÁöµÇ¾ú½À´Ï´Ù." - IDS_SERVICE_STOPPING "±â´Ù¸®½Ê½Ã¿À. AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ Á¤Áö ÁßÀÔ´Ï´Ù..." - IDS_SERVICE_STARTING "±â´Ù¸®½Ê½Ã¿À. AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ½ÃÀÛ ÁßÀÔ´Ï´Ù..." - IDS_SERVICE_UNKNOWN "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½ºÀÇ »óŸ¦ ÆÇº°ÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_SERVICE_FAIL_STOP "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ Á¤ÁöÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù.\n\n¿À·ù 0x%1." - IDS_SERVICE_FAIL_START "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º¸¦ ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù.\n\n¿À·ù 0x%1." - IDS_SERVICE_FAIL_CONFIG "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½ºÀÇ ½Ãµ¿ ¸Å°³º¯¼ö¸¦ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ Á¶ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù.\n\n¿À·ù 0x%1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "¼­ºñ½º ±¸¼º ¿À·ù" - IDS_ERROR_TITLE "¿À·ù - AFS Ŭ¶óÀ̾ðÆ®" - IDS_ERROR_TITLE_95 "¿À·ù - AFS ¶óÀÌÆ®" - IDS_ERROR_DESTROY_95 "%1 ¼¿¿¡ ÀÖ´Â ÅäÅ«À» ÆÄ±«ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù: %2" - IDS_ERROR_DESTROY_NOCM "AFS Ŭ¶óÀÌ¾ðÆ® ¼­ºñ½º°¡ ÀÀ´äÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î %1 ¼¿¿¡ ÀÖ´Â ÅäÅ«À» ÆÄ±«ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n°í±Þ ÅÇÀ» È®ÀÎÇÏ¿© AFS Ŭ¶óÀÌ¾ðÆ®°¡ Á¦´ë·Î ½ÇÇà ÁßÀÎÁö º¸½Ê½Ã¿À.\n\n¿À·ù: %2" - IDS_ERROR_DESTROY_UNKNOWN - "%1 ¼¿¿¡ ÀÖ´Â ÅäÅ«À» ÆÄ±«ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nÈ®Àå ÅÇÀ» È®ÀÎÇÏ¿© AFS Ŭ¶óÀÌ¾ðÆ®°¡ Á¦´ë·Î ½ÇÇà ÁßÀÎÁö º¸½Ê½Ã¿À.\n\n¿À·ù: %2" - IDS_ERROR_OBTAIN "AFS Ŭ¶óÀÌ¾ðÆ®´Â ÅäÅ«À» %1 ¼¿ÀÇ %2(À¸)·Î È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù: %4(%3)" - IDS_ERROR_OBTAIN_95 "AFS ¶óÀÌÆ®´Â ÅäÅ«À» %1 ¼¿ÀÇ %2(À¸)·Î¼­ È®º¸ÇÒ ¼ö ¾ø½À´Ï´Ù.\n\n¿À·ù: %4(%3)" - IDS_TITLE_VERSION "%s AFS ¹öÀü" - IDS_TITLE_VERSION_NOPATCH "%s AFS ¹öÀü" - IDS_MOUNT_SOME "´ÙÀ½ µå¶óÀ̺ê À̸§À» AFSÀÇ °æ·Î¿¡ ¸ÊÇÎÇϵµ·Ï ¼±ÅÃÇß½À´Ï´Ù." - IDS_MOUNT_NONE "¾ÆÁ÷ AFS °æ·Î¿¡ µå¶óÀ̺ê À̸§À» ¸ÊÇÎÇϵµ·Ï ¼±ÅÃÇÏÁö ¾Ê¾Ò½À´Ï´Ù." - IDS_MOUNT "µå¶óÀ̺ê À̸§" - IDS_WIZ_NEXT "´ÙÀ½(&N) >" - IDS_WIZ_FINISH "Á¾·á(&F)" - IDS_MAP_LETTER "µå¶óÀ̺ê *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "%1: µå¶óÀ̺ê \t%2" - IDS_ERROR_MAP "³×Æ®¿öÅ© µå¶óÀÌºê ¸ÊÇÎ ¿À·ù" - IDS_ERROR_MAP_DESC "AFS´Â ³×Æ®¿öÅ© µå¶óÀ̺긦 AFS¿¡¼­ ÁöÁ¤µÈ °æ·Î¿¡ ¸ÊÇÎÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç µå¶óÀ̺ê À̸§ÀÌ »ç¿ë ÁßÀ̾´Â ¾ÈµË´Ï´Ù.\n\n¿À·ù: 0x%1." - IDS_ERROR_UNMAP "³×Æ®¿öÅ© µå¶óÀÌºê ¸ÊÇÎ ¿À·ù" - IDS_ERROR_UNMAP_DESC "AFS´Â ÁöÁ¤µÈ ³×Æ®¿öÅ© µå¶óÀ̺긦 ¾ð¸ÊÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç µå¶óÀ̺ê À̸§ÀÌ »ç¿ë ÁßÀ̾´Â ¾ÈµË´Ï´Ù.\n\n¿À·ù: 0x%1." - IDS_CELL_GATEWAY "%s(%s °ÔÀÌÆ®¿þÀ̸¦ ÅëÇØ)" - IDS_BADMAP_TITLE "³×Æ®¿öÅ© µå¶óÀÌºê ¸ÊÇÎ ¿À·ù" - IDS_BADMAP_DESC "AFS´Â °æ·Î°¡ \\afs""·Î ½ÃÀÛÇÏÁö ¾ÊÀ¸¹Ç·Î µå¶óÀ̺ê À̸§À» ÁöÁ¤µÈ °æ·Î¿¡ ¸ÊÇÎÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nÀÔ·ÂÇÑ °æ·Î°¡ \\afs""·Î ½ÃÀÛÇÏ´ÂÁö È®ÀÎÇÏ°í ´Ù½Ã ½ÃµµÇϽʽÿÀ." - IDS_UNCONFIG_TITLE_95 "¿À·ù - AFS ¶óÀÌÆ®" - IDS_UNCONFIG_DESC_95 "AFS ¶óÀÌÆ®°¡ ¾ÆÁ÷ ±¸¼ºµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nAFS ¶óÀÌÆ®¸¦ ±¸¼ºÇÏ·Á¸é, Á¦¾îÆÇÀ» ¿­°í AFS ¶óÀÌÆ® ±¸¼º ¾ÆÀÌÄÜÀ» µÎ ¹ø ´©¸£½Ê½Ã¿À." - IDS_UNCONFIG_TITLE "¿À·ù - AFS Ŭ¶óÀ̾ðÆ®" - IDS_UNCONFIG_DESC "AFS Ŭ¶óÀÌ¾ðÆ®°¡ ¾ÆÁ÷ ±¸¼ºµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nAFS Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸¼ºÇÏ·Á¸é, Á¦¾îÆÇÀ» ¿­°í AFS Ŭ¶óÀÌ¾ðÆ® ¾ÆÀÌÄÜÀ» µÎ ¹ø ´©¸£½Ê½Ã¿À." - IDS_NEWSUB_TITLE "ÁÖÀÇ - AFS Ŭ¶óÀ̾ðÆ®" - IDS_NEWSUB_TITLE_95 "ÁÖÀÇ - AFS ¶óÀÌÆ®" - IDS_NEWSUB_DESC "AFS´Â ³×Æ®¿öÅ© µå¶óÀ̺꿡 ¿¬°áÇÒ ¶§ ÁöÁ¤µÈ ¼³¸íÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nÁöÁ¤µÈ ¼³¸íÀº ÀÌ¹Ì ´Ù¸¥ AFS °æ·Î¿¡¼­ »ç¿ëµÇ¾ú½À´Ï´Ù." - IDS_BADSUB_TITLE "¿À·ù - AFS Ŭ¶óÀ̾ðÆ®" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "¿À·ù - AFS ¶óÀÌÆ®" - IDS_BADSUB_DESC "ÀÔ·ÂÇÑ µå¶óÀ̺ê À̸§ ¼³¸íÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.\n\nµå¶óÀ̺ê À̸§ ¼³¸í¿¡´Â 12 ¹®ÀÚ ÀÌ»óÀ» »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç °ø¹é ¶Ç´Â ÅÇÀ» Æ÷ÇÔÇÒ ¼ö ¾ø½À´Ï´Ù." - IDS_TITLE_95 "AFS ¶óÀÌÆ®" -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/pt_BR/afscreds.rc b/src/WINNT/client_creds/lang/pt_BR/afscreds.rc deleted file mode 100644 index 2e5e07576..000000000 --- a/src/WINNT/client_creds/lang/pt_BR/afscreds.rc +++ /dev/null @@ -1,580 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 361, 130 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS Client" -CLASS "AfsCreds" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "AFS Versão %s (correção %lu)",IDC_TITLE_VERSION,244,8, - 111,8 - LTEXT "Atualmente com logon no Windows Networking como ""%s""", - IDC_TITLE_NT,7,8,231,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,26,347,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Célula: ",IDC_STATIC,7,9,24,8 - LTEXT "(nenhuma)",IDC_CREDS_CELL,51,9,193,8 - LTEXT "Tokens:",IDC_STATIC,7,26,27,8 - LTEXT "(nenhum)",IDC_CREDS_INFO,51,26,193,8 - CONTROL "&Mostrar um aviso antes que estes tokens vençam", - IDC_CREDS_REMIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 51,43,193,10 - PUSHBUTTON "&Obter Novos Tokens...",IDC_CREDS_OBTAIN,51,63,88,14 - PUSHBUTTON "&Descartar Estes Tokens",IDC_CREDS_DESTROY,142,63,92,14 - PUSHBUTTON "Ajuda",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Você não possui tokens em nenhuma célula do AFS.", - IDC_RUNNING,7,9,275,8 - LTEXT "O AFS Client não está configurado corretamente, ou o serviço do AFS Client não está em execução.\n\nUse a guia Avançado para iniciar o serviço do AFS Client.", - IDC_STOPPED,7,9,275,40 - PUSHBUTTON "Ajuda",9,237,63,45,14 - PUSHBUTTON "&Obter Novos Tokens...",IDC_CREDS_OBTAIN,51,63,88,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "(consultando...)",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "&Iniciar Serviço",IDC_SERVICE_START,51,28,65,14 - PUSHBUTTON "&Parar Serviço",IDC_SERVICE_STOP,128,28,65,14 - PUSHBUTTON "&Configurar AFS Client",IDC_OPEN_CPL,205,28,78,14 - CONTROL "I&niciar o Serviço do AFS Client sempre que este computador for reiniciado", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,262,10 - CONTROL "&Sempre mostrar o ícone do AFS Client na barra de tarefas", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65, - 204,10 - PUSHBUTTON "Ajuda",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obter Novos Tokens do AFS" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Para obter novos tokens do AFS, digite seu nome de usuário do AFS e a senha para sua conta do AFS. Você pode ter tokens em várias células do AFS simultaneamente.", - IDC_STATIC,7,7,218,24 - LTEXT "&Célula do AFS:",IDC_STATIC,16,42,49,8 - EDITTEXT IDC_NEWCREDS_CELL,78,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "&Nome do Usuário:",IDC_STATIC,16,60,60,8 - EDITTEXT IDC_NEWCREDS_USER,78,58,97,14,ES_AUTOHSCROLL - LTEXT "&Senha:",IDC_STATIC,15,78,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,78,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,69,106,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,122,106,50,14 - PUSHBUTTON "Ajuda",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obter Novos Tokens do AFS" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Para obter novos tokens do AFS, digite seu nome de usuário do AFS e a senha para sua conta do AFS. Você pode ter tokens em várias células do AFS simultaneamente.", - IDC_STATIC,7,29,218,24 - LTEXT "&Célula do AFS:",IDC_STATIC,17,70,51,8 - EDITTEXT IDC_NEWCREDS_CELL,78,68,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "&Nome do Usuário:",IDC_STATIC,17,88,59,8 - EDITTEXT IDC_NEWCREDS_USER,78,86,97,14,ES_AUTOHSCROLL - LTEXT "&Senha:",IDC_STATIC,16,106,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,78,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "Seus tokens na célula %1 estão prestes a vencer.", - IDC_NEWCREDS_TITLE,7,7,218,16 - DEFPUSHBUTTON "OK",IDOK,69,134,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,122,134,50,14 - PUSHBUTTON "Ajuda",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Você escolheu mapear as seguintes letras de unidades para caminhos no AFS:", - IDC_TITLE,7,8,275,8 - PUSHBUTTON "&Incluir...",IDC_ADD,51,63,45,14 - PUSHBUTTON "Al&terar...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "&Remover",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "Ajuda",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 272, 152 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "Assistente do AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "A&vançar >",IDNEXT,162,131,50,14 - PUSHBUTTON "Cance&lar",IDCANCEL,215,131,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,174,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,258,1 - PUSHBUTTON "&Ajuda",9,59,131,50,14 - PUSHBUTTON "< Vol&tar",IDBACK,112,131,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "O Serviço do AFS Client ainda não iniciou.",IDC_STATIC, - 0,0,173,8 - LTEXT "Para iniciar o Serviço do AFS Client, clique em Avançar.", - IDC_STATIC,0,72,173,18 - LTEXT "Enquanto o Serviço do AFS Client não estiver em execução, não será possível usar arquivos armazenados no AFS.", - IDC_STATIC,0,17,173,28 - LTEXT "Para deixar o Serviço do AFS Client parado, clique em Cancelar.", - IDC_STATIC,0,90,173,19 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "O Serviço do AFS Client está agora em execução, mas você ainda não obteve nenhum token para usar o AFS.", - IDC_STATIC,0,0,173,26 - CONTROL "Não obter tokens para nenhuma célula",IDC_NOCREDS, - "Button",BS_AUTORADIOBUTTON,10,28,141,10 - CONTROL "Obter tokens na seguinte célula:",IDC_YESCREDS,"Button", - BS_AUTORADIOBUTTON,10,44,141,10 - LTEXT "&Célula do AFS:",IDC_STATIC,13,64,53,8 - EDITTEXT IDC_NEWCREDS_CELL,77,62,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "&Nome do Usuário:",IDC_STATIC,13,82,61,8 - EDITTEXT IDC_NEWCREDS_USER,77,80,96,14,ES_AUTOHSCROLL - LTEXT "&Senha:",IDC_STATIC,12,100,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Aguarde; o Serviço do AFS Client está iniciando...", - IDC_START_TRY,0,33,173,8 - LTEXT "O Serviço do AFS Client não pôde ser iniciado.\n\nVerifique as definições da rede, e use o ícone do AFS no Painel de Controle para verificar a configuração do AFS Client neste computador.", - IDC_START_FAIL,0,25,173,41 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Para acessar arquivos armazenados no AFS, é preciso mapear letras de unidades para caminhos no AFS.", - IDC_STATIC,0,0,173,16 - CONTROL "&Não mapear nenhuma letra de unidade ",IDC_NOMAP,"Button", - BS_AUTORADIOBUTTON,9,20,151,13 - CONTROL "&Mapear ao menos uma letra de unidade:",IDC_YESMAP, - "Button",BS_AUTORADIOBUTTON,9,35,156,12 - LTEXT "&Letra da Unidade:",IDC_STATIC,10,58,62,8 - COMBOBOX IDC_MAP_LETTER,77,56,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Caminho do AFS:",IDC_STATIC,10,76,58,8 - EDITTEXT IDC_MAP_PATH,77,74,96,14,ES_AUTOHSCROLL - LTEXT "D&escrição:",IDC_STATIC,10,94,38,8 - EDITTEXT IDC_MAP_DESC,77,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 305, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Remover Ícone",IDOK,176,96,63,14 - PUSHBUTTON "Cance&lar",IDCANCEL,248,96,50,14 - LTEXT "Você escolheu remover o ícone do AFS Client da barra de tarefas de seu computador. A menos que o ícone do AFS Client esteja na barra de tarefas, o AFS não poderá avisá-lo quando seus tokens do AFS estiverem vencendo.", - IDC_STATIC,7,7,291,25 - LTEXT "O Serviço do AFS Client está em execução. Se desejar, pode pará-lo agora.", - IDC_STATIC,7,41,291,8 - CONTROL "&Deixar o Serviço do AFS Client executando",IDC_LEAVE, - "Button",BS_AUTORADIOBUTTON,26,55,228,10 - CONTROL "&Parar o Serviço do AFS Client",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,26,69,228,10 - CONTROL "&Mostrar o ícone quando o computador reiniciar", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98, - 165,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 306, 69 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Client" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Remover Ícone",IDOK,178,48,63,14 - PUSHBUTTON "Cance&lar",IDCANCEL,249,48,50,14 - LTEXT "Você escolheu remover o ícone do AFS Client da barra de tarefas de seu computador. A menos que o ícone do AFS Client esteja na barra de tarefas, o AFS não poderá avisá-lo quando seus tokens do AFS estiverem vencendo.", - -1,7,7,292,25 - CONTROL "&Mostrar o ícone quando o computador reiniciar", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49, - 166,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 299, 69 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Básico" -FONT 9, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Remover Ícone",IDOK,175,47,63,14 - PUSHBUTTON "Cance&lar",IDCANCEL,242,47,50,14 - LTEXT "Você escolheu remover o ícone do AFS Básico da barra de tarefas de seu computador. A menos que o ícone do AFS Básico esteja na barra de tarefas, o AFS não poderá avisar quando seus tokens do AFS estiverem vencendo.", - -1,7,7,277,25 - CONTROL "&Mostrar o ícone quando o computador reiniciar", - IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49, - 162,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Uma ou mais letras de unidades que você escolheu não puderam ser mapeadas para os caminhos apropriados no AFS.\n\nPode ser preciso fechar aplicações que já estejam tentando usar caminhos no AFS.", - IDC_MAP_FAIL,1,26,173,53 - LTEXT "Aguarde; mapeando letras de unidades para caminhos no AFS...", - IDC_MAP_TRY,0,33,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "O AFS Client está pronto para uso.",IDC_STATIC,0,0,173, - 8 - LTEXT "Para fechar este assistente, clique em Finalizar.", - IDC_STATIC,0,73,173,8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Mapear Letra de Unidade" -FONT 9, "MS Shell Dlg" -BEGIN - LTEXT "Você pode mapear letras de unidades em seu computador para caminhos no AFS.\n\nPor exemplo, se você mapear Q: como \\afs\\acme.com\\usr\\bob, os arquivos disponíveis no AFS como \\afs\\acme.com\\usr\\bob\\* estarão visíveis em Q:\\", - IDC_STATIC,7,7,261,34 - LTEXT "&Letra da Unidade:",IDC_STATIC,15,53,61,8 - COMBOBOX IDC_MAP_LETTER,82,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "&Caminho do AFS:",IDC_STATIC,15,70,64,8 - EDITTEXT IDC_MAP_PATH,82,68,178,13,ES_AUTOHSCROLL - LTEXT "D&escrição:",IDC_STATIC,15,88,38,8 - EDITTEXT IDC_MAP_DESC,82,86,60,13,ES_AUTOHSCROLL - CONTROL "&Restaurar este mapeamento sempre que eu efetuar logon", - IDC_MAP_PERSISTENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 66,105,199,10 - DEFPUSHBUTTON "OK",IDOK,112,131,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,165,131,50,14 - PUSHBUTTON "Ajuda",9,218,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 354 - TOPMARGIN, 8 - BOTTOMMARGIN, 123 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 298 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 299 - TOPMARGIN, 7 - BOTTOMMARGIN, 62 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 268 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "&Mostrar Tokens...", M_ACTIVATE - MENUITEM "&Avisar Antes do Vencimento", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Remover Ícone...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS Client" - IDS_TOOLTIP_95 "AFS Básico" - IDS_CREDENTIALS "Tokens" - IDS_UNKNOWN "(desconhecido)" - IDS_ADVANCED "Avançado" - IDS_CREDS "%1 (tokens vencem em %2)" - IDS_NO_CREDS "(você não possui tokens nesta célula)" - IDS_SERVICE_BROKEN "O Serviço do AFS Client não está corretamente instalado, ou você não possui autorização para consultar seu status." - IDS_SERVICE_RUNNING "O Serviço do AFS Client está sendo executado normalmente." - IDS_SERVICE_STOPPED "O Serviço do AFS Client está parado." - IDS_SERVICE_STOPPING "Aguarde; o Serviço do AFS Client está parando..." - IDS_SERVICE_STARTING "Aguarde; o Serviço do AFS Client está iniciando..." - IDS_SERVICE_UNKNOWN "O status do Serviço do AFS Client não pôde ser determinado." - IDS_SERVICE_FAIL_STOP "O Serviço do AFS Client não pôde ser parado com êxito. Você pode não ter autorização para realizar esta operação.\n\nErro 0x%1." - IDS_SERVICE_FAIL_START "O Serviço do AFS Client não pôde ser iniciado com êxito. Você pode não ter autorização para realizar esta operação.\n\nErro 0x%1." - IDS_SERVICE_FAIL_CONFIG "Os parâmetros de inicialização do Serviço do AFS Client não puderam ser alterados. Você pode não ter autorização para realizar esta operação.\n\nErro 0x%1." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "Erro ao Configurar Serviço" - IDS_ERROR_TITLE "Erro - AFS Client" - IDS_ERROR_TITLE_95 "Erro - AFS Básico" - IDS_ERROR_DESTROY_95 "Seus tokens na célula %1 não puderam ser eliminados.\n\nErro: %2" - IDS_ERROR_DESTROY_NOCM "Seus tokens na célula %1 não puderam ser eliminados porque o Serviço do AFS Client não está respondendo.\n\nVerifique a guia Avançado para ver se o AFS Client está executando corretamente.\n\nErro: %2" - IDS_ERROR_DESTROY_UNKNOWN - "Seus tokens na célula %1 não puderam ser eliminados.\n\nVerifique a guia Avançado para ver se o AFS Client está sendo executado corretamente.\n\nErro: %2" - IDS_ERROR_OBTAIN "O AFS Client não conseguiu obter tokens como %2 na célula %1.\n\nErro: %4 (%3)" - IDS_ERROR_OBTAIN_95 "O AFS Básico não conseguiu obter tokens como %2 na célula %1.\n\nErro: %4 (%3)" - IDS_TITLE_VERSION "AFS Versão %s" - IDS_TITLE_VERSION_NOPATCH "AFS Versão %s" - IDS_MOUNT_SOME "Você escolheu mapear as seguintes letras de unidades para caminhos no AFS:" - IDS_MOUNT_NONE "Você ainda não escolheu mapear nenhuma letra de unidade para caminhos no AFS." - IDS_MOUNT "Letras de Unidades" - IDS_WIZ_NEXT "A&vançar >" - IDS_WIZ_FINISH "&Finalizar" - IDS_MAP_LETTER "Unidade *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Unidade %1: \t%2" - IDS_ERROR_MAP "Erro Mapeando Unidade de Rede" - IDS_ERROR_MAP_DESC "O AFS foi incapaz de mapear a unidade de rede para o caminho especificado no AFS. Certifique-se de que a letra da unidade não esteja sendo utilizada.\n\nErro: 0x%1." - IDS_ERROR_UNMAP "Erro Mapeando Unidade de Rede" - IDS_ERROR_UNMAP_DESC "O AFS foi incapaz de remover o mapeamento da unidade de rede especificada. Certifique-se de que a letra da unidade não esteja sendo utilizada.\n\nErro: 0x%1." - IDS_CELL_GATEWAY "%s (via gateway %s)" - IDS_BADMAP_TITLE "Erro Mapeando Unidade de Rede" - IDS_BADMAP_DESC "O AFS não pode mapear uma letra de unidade para o caminho especificado porque o caminho não começa com ""\\afs"".\n\nDigite um caminho que comece com ""\\afs"", e tente novamente." - IDS_UNCONFIG_TITLE_95 "Erro - AFS Básico" - IDS_UNCONFIG_DESC_95 "O AFS Básico não pode ser usado porque ainda não está configurado.\n\nPara configurar o AFS Básico, abra o Painel de Controle e dê um clique duplo no ícone de Configuração do AFS Básico." - IDS_UNCONFIG_TITLE "Erro - AFS Client" - IDS_UNCONFIG_DESC "O AFS Client não pode ser usado porque ainda não está configurado.\n\nPara configurar o AFS Client, abra o Painel de Controle e dê um clique duplo no ícone de Configuração de AFS Client." - IDS_NEWSUB_TITLE "Atenção - AFS Client" - IDS_NEWSUB_TITLE_95 "Atenção - AFS Básico" - IDS_NEWSUB_DESC "O AFS não pôde usar a descrição especificada ao conectar-se à unidade de rede.\n\nA descrição especificada já é usada por um outro caminho do AFS." - IDS_BADSUB_TITLE "Erro - AFS Client" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "Erro - AFS Básico" - IDS_BADSUB_DESC "A descrição da letra de unidade informada não pode ser usada.\n\nUma descrição de letra de unidade não pode ter mais de 12 caracteres, e não pode conter espaços ou tabulações." - IDS_TITLE_95 "AFS Básico" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/zh_CN/afscreds.rc b/src/WINNT/client_creds/lang/zh_CN/afscreds.rc deleted file mode 100644 index 64115963d..000000000 --- a/src/WINNT/client_creds/lang/zh_CN/afscreds.rc +++ /dev/null @@ -1,570 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 307, 131 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¿Í»§»ú" -CLASS "AfsCreds" -FONT 9, "ËÎÌå" -BEGIN - RTEXT "AFS °æ±¾ %s(²¹¶¡³ÌÐò %lu)",IDC_TITLE_VERSION,198,8,102, - 8 - LTEXT "µ±Ç°×÷Ϊ ""%s"" ×¢²áµ½ Windows ÍøÂç",IDC_TITLE_NT,7,8, - 185,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,27,293,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "µ¥Ôª£º",IDC_STATIC,7,9,24,8 - LTEXT "(ÎÞ)",IDC_CREDS_CELL,51,9,193,8 - LTEXT "ÁîÅÆ£º",IDC_STATIC,7,26,27,8 - LTEXT "(ÎÞ)",IDC_CREDS_INFO,51,26,193,8 - CONTROL "ÁîÅÆµ½ÆÚǰÏÔʾ¾¯¸æ(&S)",IDC_CREDS_REMIND,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,51,43,193,10 - PUSHBUTTON "»ñµÃÐÂÁîÅÆ(&O)...",IDC_CREDS_OBTAIN,51,63,88,14 - PUSHBUTTON "¶ªÆúÕâЩÁîÅÆ(&D)",IDC_CREDS_DESTROY,142,63,92,14 - PUSHBUTTON "°ïÖú",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÄúÔÚËùÓÐ AFS µ¥ÔªÄÚ¾ùÎÞÁîÅÆ¡£",IDC_RUNNING,7,9,275,8 - LTEXT "ûÓÐÕýÈ·µØÅäÖà AFS ¿Í»§»ú£¬»òûÓÐÔËÐÐ AFS ¿Í»§»ú·þÎñ¡£\n\nÇëʹÓ᰸߼¶¡±±êÇ©ÒÔÆô¶¯ AFS ¿Í»§»ú·þÎñ¡£", - IDC_STOPPED,7,9,275,25 - PUSHBUTTON "°ïÖú",9,237,63,45,14 - PUSHBUTTON "»ñµÃÐÂÁîÅÆ(&O)...",IDC_CREDS_OBTAIN,51,63,88,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "(ÕýÔÚ²éѯ...)",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "Æô¶¯·þÎñ(&S)",IDC_SERVICE_START,51,28,63,14 - PUSHBUTTON "Í£Ö¹·þÎñ(&T)",IDC_SERVICE_STOP,118,28,63,14 - PUSHBUTTON "ÅäÖà AFS ¿Í»§»ú(&C)",IDC_OPEN_CPL,185,28,97,14 - CONTROL "ÿµ±¼ÆËã»úÖØÐÂÆô¶¯Ê±Æô¶¯ AFS ¿Í»§»ú·þÎñ(&A)", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,204,10 - CONTROL "×ÜÊÇÔÚÈÎÎñÀ¸ÖÐÏÔʾ AFS ¿Í»§»úͼ±ê(&I)",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65,204,10 - PUSHBUTTON "°ïÖú",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "»ñµÃÐ嵀 AFS ÁîÅÆ" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Òª»ñµÃÐ嵀 AFS ÁîÅÆ£¬ÇëÊäÈëÄúµÄ AFS ÕÊ»§µÄÓû§ÃûºÍ¿ÚÁî¡£Äú¿ÉͬʱÔÚ¶à¸ö AFS µ¥ÔªÖÐÓµÓÐÁîÅÆ¡£", - IDC_STATIC,7,7,218,24 - LTEXT "AFS µ¥Ôª(&C)£º",IDC_STATIC,7,42,53,8 - EDITTEXT IDC_NEWCREDS_CELL,67,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "Óû§Ãû(&N)£º",IDC_STATIC,7,60,53,8 - EDITTEXT IDC_NEWCREDS_USER,67,58,97,14,ES_AUTOHSCROLL - LTEXT "¿ÚÁî(&P)£º",IDC_STATIC,7,78,53,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,69,106,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,122,106,50,14 - PUSHBUTTON "°ïÖú",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "»ñµÃÐ嵀 AFS ÁîÅÆ" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Òª»ñµÃÐ嵀 AFS ÁîÅÆ£¬ÇëÊäÈëÄúµÄ AFS ÕÊ»§µÄÓû§ÃûºÍ¿ÚÁî¡£Äú¿ÉͬʱÔÚ¶à¸ö AFS µ¥ÔªÖÐÓµÓÐÁîÅÆ¡£", - IDC_STATIC,7,29,218,24 - LTEXT "AFS µ¥Ôª(&C)£º",IDC_STATIC,7,70,55,8 - EDITTEXT IDC_NEWCREDS_CELL,67,68,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "Óû§Ãû(&N)£º",IDC_STATIC,7,88,55,8 - EDITTEXT IDC_NEWCREDS_USER,67,86,97,14,ES_AUTOHSCROLL - LTEXT "¿ÚÁî(&P)£º",IDC_STATIC,7,106,55,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,67,104,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "ÄúÔÚ %1 µ¥ÔªÄÚµÄÁîÅÆ½«Òªµ½ÆÚ¡£",IDC_NEWCREDS_TITLE,7,7, - 218,16 - DEFPUSHBUTTON "È·¶¨",IDOK,69,134,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,122,134,50,14 - PUSHBUTTON "°ïÖú",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÄúÒÑÑ¡Ôñ½«ÏÂÁÐÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶£º",IDC_TITLE,7,8, - 275,8 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,51,63,45,14 - PUSHBUTTON "¸ü¸Ä(&C)...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "°ïÖú",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 272, 152 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¿Í»§»úÏòµ¼" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "ÏÂÒ»²½(&N) >",IDNEXT,162,131,50,14 - PUSHBUTTON "È¡Ïû(&L)",IDCANCEL,215,131,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,112 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,91,7,174,112 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,125,258,1 - PUSHBUTTON "°ïÖú(&H)",9,59,131,50,14 - PUSHBUTTON "< ÉÏÒ»²½(&B)",IDBACK,112,131,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "»¹Ã»ÓÐÆô¶¯ AFS ¿Í»§»ú·þÎñ¡£",IDC_STATIC,0,0,173,8 - LTEXT "ÒªÆô¶¯ AFS ¿Í»§»ú·þÎñ£¬Çëµ¥»÷¡°ÏÂÒ»²½¡±¡£",IDC_STATIC,0, - 73,173,8 - LTEXT "Äú½«ÎÞ·¨Ê¹Óô洢ÔÚ AFS ÖеÄÎļþ£¬Ö±ÖÁÔËÐÐ AFS ¿Í»§»ú·þÎñ¡£", - IDC_STATIC,0,17,173,17 - LTEXT "Ҫʹ AFS ¿Í»§»ú·þÎñ±£³Öֹͣ״̬£¬Çëµ¥»÷¡°È¡Ïû¡±¡£", - IDC_STATIC,0,88,173,19 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "AFS ¿Í»§»ú·þÎñÏÖÔÚÕýÔÚÔËÐУ¬µ«ÊÇÄúÉÐδ»ñµÃÈκοÉʹÓà AFS µÄÁîÅÆ¡£", - IDC_STATIC,0,0,173,16 - CONTROL "²»»ñµÃÈκε¥ÔªµÄÁîÅÆ",IDC_NOCREDS,"Button", - BS_AUTORADIOBUTTON,10,28,141,10 - CONTROL "»ñµÃÏÂÁе¥ÔªÖеÄÁîÅÆ£º",IDC_YESCREDS,"Button", - BS_AUTORADIOBUTTON,10,44,141,10 - LTEXT "AFS µ¥Ôª(&C)£º",IDC_STATIC,11,64,53,8 - EDITTEXT IDC_NEWCREDS_CELL,77,62,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "Óû§Ãû(&N)£º",IDC_STATIC,11,82,53,8 - EDITTEXT IDC_NEWCREDS_USER,77,80,96,14,ES_AUTOHSCROLL - LTEXT "¿ÚÁî(&P)£º",IDC_STATIC,11,100,53,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÇëÉÔºò£»ÕýÔÚÆô¶¯ AFS ¿Í»§»ú·þÎñ...",IDC_START_TRY,0,33, - 173,8 - LTEXT "ÎÞ·¨Æô¶¯ AFS ¿Í»§»ú·þÎñ¡£\n\nÇë¼ì²éÄúµÄÍøÂçÉèÖ㬲¢Ê¹ÓÿØÖÆÃæ°åÖÐµÄ AFS ͼ±ê¼ì²é¸Ã¼ÆËã»úÉ쵀 AFS ¿Í»§»úµÄÅäÖá£", - IDC_START_FAIL,0,25,173,41 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Òª´æÈ¡´æ´¢ÔÚ AFS ÖеÄÎļþ£¬Äú±ØÐ뽫ÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶¡£", - IDC_STATIC,0,0,173,16 - CONTROL "²»Òª½«ÈκÎÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶(&D)",IDC_NOMAP,"Button", - BS_AUTORADIOBUTTON,2,23,168,10 - CONTROL "ÖÁÉÙ½«Ò»¸öÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶(&M)£º",IDC_YESMAP, - "Button",BS_AUTORADIOBUTTON,2,40,168,10 - LTEXT "ÅÌ·û(&L)£º",IDC_STATIC,9,58,58,8 - COMBOBOX IDC_MAP_LETTER,77,56,60,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ·¾¶(&P)£º",IDC_STATIC,9,76,58,8 - EDITTEXT IDC_MAP_PATH,77,74,96,14,ES_AUTOHSCROLL - LTEXT "ÃèÊö(&E)£º",IDC_STATIC,9,94,58,8 - EDITTEXT IDC_MAP_DESC,77,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 291, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¿Í»§»ú" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - PUSHBUTTON "³ýȥͼ±ê(&R)",IDOK,167,96,63,14 - PUSHBUTTON "È¡Ïû(&L)",IDCANCEL,234,96,50,14 - LTEXT "ÄúÒÑÑ¡Ôñ´Ó¼ÆËã»úµÄÈÎÎñÀ¸ÖгýÈ¥¡°AFS ¿Í»§»ú¡±Í¼±ê¡£³ý·Ç¡°AFS ¿Í»§»ú¡±Í¼±êÔÚ¼ÆËã»úµÄÈÎÎñÀ¸ÖУ¬·ñÔòµ±ÄúµÄ AFS ÁîÅÆ½«Òªµ½ÆÚʱ£¬AFS ½«ÎÞ·¨·¢³ö¾¯¸æ¡£", - IDC_STATIC,7,7,277,25 - LTEXT "µ±Ç°ÕýÔÚÔËÐÐ AFS ¿Í»§»ú·þÎñ¡£Èç¹ûÐèÒª£¬Äú¿ÉÔÚ´ËʱֹͣÔËÐС£", - IDC_STATIC,7,41,277,8 - CONTROL "±£³Ö AFS ¿Í»§»ú·þÎñΪÔËÐÐ״̬(&U)",IDC_LEAVE,"Button", - BS_AUTORADIOBUTTON,26,55,228,10 - CONTROL "Í£Ö¹ AFS ¿Í»§»ú·þÎñ(&S)",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,26,69,228,10 - CONTROL "µ±¼ÆËã»úÖØÐÂÆô¶¯Ê±ÏÔʾͼ±ê(&H)",IDC_STARTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,98,148,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¿Í»§»ú" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - PUSHBUTTON "³ýȥͼ±ê(&R)",IDOK,167,47,63,14 - PUSHBUTTON "È¡Ïû(&L)",IDCANCEL,234,47,50,14 - LTEXT "ÄúÒÑÑ¡Ôñ´Ó¼ÆËã»úµÄÈÎÎñÀ¸ÖгýÈ¥¡°AFS ¿Í»§»ú¡±Í¼±ê¡£³ý·Ç¡°AFS ¿Í»§»ú¡±Í¼±êÔÚ¼ÆËã»úµÄÈÎÎñÀ¸ÖУ¬·ñÔòµ±ÄúµÄ AFS ÁîÅÆ½«Òªµ½ÆÚʱ£¬AFS ½«ÎÞ·¨·¢³ö¾¯¸æ¡£", - -1,7,7,277,25 - CONTROL "µ±¼ÆËã»úÖØÐÂÆô¶¯Ê±ÏÔʾͼ±ê(&H)",IDC_STARTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Light" -FONT 9, "ËÎÌå", 0, 0, 0x1 -BEGIN - PUSHBUTTON "³ýȥͼ±ê(&R)",IDOK,167,47,63,14 - PUSHBUTTON "È¡Ïû(&L)",IDCANCEL,234,47,50,14 - LTEXT "ÄúÒÑÑ¡Ôñ´Ó¼ÆËã»úµÄÈÎÎñÀ¸ÖгýÈ¥¡°AFS Light¡±Í¼±ê¡£³ý·Ç¡°AFS Light¡±Í¼±êÔÚ¼ÆËã»úµÄÈÎÎñÀ¸ÖУ¬·ñÔòµ±ÄúµÄ AFS ÁîÅÆ½«Òªµ½ÆÚʱ£¬AFS ½«ÎÞ·¨·¢³ö¾¯¸æ¡£", - -1,7,7,277,25 - CONTROL "µ±¼ÆËã»úÖØÐÂÆô¶¯Ê±ÏÔʾͼ±ê(&H)",IDC_STARTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "ÄúËùÑ¡µÄÒ»¸ö»ò¶à¸öÅÌ·ûÎÞ·¨Ó³Éäµ½ÕýÈ·µÄ AFS ÖеÄ·¾¶¡£\n\nÄú¿ÉÄÜÒª¹Ø±ÕËùÓÐÊÔͼʹÓøÃ·¾¶µÄÓ¦ÓóÌÐò¡£", - IDC_MAP_FAIL,1,26,173,41 - LTEXT "ÇëÉÔºò£»ÕýÔÚ½«ÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶...",IDC_MAP_TRY,0, - 33,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 174, 112 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "ËÎÌå" -BEGIN - LTEXT "AFS ¿Í»§»ú¾ÍÐ÷¡£",IDC_STATIC,0,0,173,8 - LTEXT "Òª¹Ø±Õ¸ÃÏòµ¼£¬Çëµ¥»÷¡°Íê³É¡±¡£",IDC_STATIC,0,73,173,8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ó³ÉäÅÌ·û" -FONT 9, "ËÎÌå" -BEGIN - LTEXT "Äú¿É½«¼ÆËã»úÉϵÄÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶¡£\n\nÀýÈ磬Èç¹ûÄú½« Q: Ó³Éäµ½ \\afs\\acme.com\\usr\\bob£¬ÔòÔÚ Q:\\ Öн«¿É¿´¼ûÔÚ AFS ÖпÉÓõÄÎļþ \\afs\\acme.com\\usr\\bob\\* ¡£", - IDC_STATIC,7,7,261,32 - LTEXT "ÅÌ·û(&L)£º",IDC_STATIC,13,53,55,8 - COMBOBOX IDC_MAP_LETTER,73,51,60,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ·¾¶(&P)£º",IDC_STATIC,13,70,55,8 - EDITTEXT IDC_MAP_PATH,73,68,178,13,ES_AUTOHSCROLL - LTEXT "ÃèÊö(&E)£º",IDC_STATIC,13,88,55,8 - EDITTEXT IDC_MAP_DESC,73,86,60,13,ES_AUTOHSCROLL - CONTROL "µÇ¼ʱ»Ö¸´Ó³Éä(&R)",IDC_MAP_PERSISTENT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,73,105,185,10 - DEFPUSHBUTTON "È·¶¨",IDOK,112,131,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,165,131,50,14 - PUSHBUTTON "°ïÖú",9,218,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 300 - TOPMARGIN, 8 - BOTTOMMARGIN, 124 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 61 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 268 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "ÏÔʾÁîÅÆ(&S)...", M_ACTIVATE - MENUITEM "µ½ÆÚǰ¾¯¸æ(&W)", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "³ýȥͼ±ê(&R)...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS ¿Í»§»ú" - IDS_TOOLTIP_95 "AFS Light" - IDS_CREDENTIALS "ÁîÅÆ" - IDS_UNKNOWN "(δ֪)" - IDS_ADVANCED "¸ß¼¶" - IDS_CREDS "%1 (ÁîÅÆµ½ÆÚ %2)" - IDS_NO_CREDS "(Ôڸõ¥ÔªÖÐÄúûÓÐÁîÅÆ)" - IDS_SERVICE_BROKEN "ûÓÐÕýÈ·µØ°²×° AFS ¿Í»§»ú·þÎñ£¬»òÕßÄúûÓвéѯ״̬µÄȨÏÞ¡£" - IDS_SERVICE_RUNNING "AFS ¿Í»§»ú·þÎñÕýÔÚÕý³£ÔËÐС£" - IDS_SERVICE_STOPPED "AFS ¿Í»§»ú·þÎñµ±Ç°ÎªÍ£Ö¹×´Ì¬¡£" - IDS_SERVICE_STOPPING "ÇëÉÔºò£»AFS ¿Í»§»ú·þÎñÕýÔÚÍ£Ö¹..." - IDS_SERVICE_STARTING "ÇëÉÔºò£»AFS ¿Í»§»ú·þÎñÕýÔÚÆô¶¯..." - IDS_SERVICE_UNKNOWN "ÎÞ·¨È·¶¨ AFS ¿Í»§»ú·þÎñµÄ״̬¡£" - IDS_SERVICE_FAIL_STOP "AFS ¿Í»§»ú·þÎñ²»Äܳɹ¦Í£Ö¹¡£Äú¿ÉÄÜûÓÐȨÏÞÀ´Ö´Ðд˲Ù×÷¡£\n\n´íÎó 0x%1¡£" - IDS_SERVICE_FAIL_START "AFS ¿Í»§»ú·þÎñ²»Äܳɹ¦Æô¶¯¡£Äú¿ÉÄÜûÓÐȨÏÞÀ´Ö´Ðд˲Ù×÷¡£\n\n´íÎó 0x%1¡£" - IDS_SERVICE_FAIL_CONFIG "ÎÞ·¨¸ü¸Ä AFS ¿Í»§»ú·þÎñµÄÆô¶¯²ÎÊý¡£Äú¿ÉÄÜûÓÐȨÏÞÀ´Ö´Ðд˲Ù×÷¡£\n\n´íÎó 0x%1¡£" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "ÅäÖ÷þÎñ³ö´í" - IDS_ERROR_TITLE "³ö´í - AFS ¿Í»§»ú" - IDS_ERROR_TITLE_95 "³ö´í - AFS Light" - IDS_ERROR_DESTROY_95 "ÎÞ·¨ÆÆ»µÄúÔÚ %1 µ¥ÔªÖеÄÁîÅÆ¡£\n\n´íÎó£º%2" - IDS_ERROR_DESTROY_NOCM "ÎÞ·¨ÆÆ»µÄúÔÚ %1 µ¥ÔªÖеÄÁîÅÆ£¬ÒòΪ AFS ¿Í»§»ú·þÎñûÓÐÏìÓ¦¡£\n\nÇë¼ì²é¡°¸ß¼¶¡±±êÇ©ÒԲ鿴 AFS ¿Í»§»úÊÇ·ñÕýÈ·ÔËÐС£\n\n´íÎó£º%2" - IDS_ERROR_DESTROY_UNKNOWN - "ÎÞ·¨ÆÆ»µÄúÔÚ %1 µ¥ÔªÖеÄÁîÅÆ¡£\n\nÇë¼ì²é¡°¸ß¼¶¡±±êÇ©ÒԲ鿴 AFS ¿Í»§»úÊÇ·ñÕýÈ·ÔËÐС£\n\n´íÎó£º%2" - IDS_ERROR_OBTAIN "AFS ¿Í»§»úÎÞ·¨ÔÚ µ¥Ôª %1 ÖлñµÃÁîÅÆ %2 ¡£\n\n´íÎó£º%4 (%3)" - IDS_ERROR_OBTAIN_95 "AFS Light ÎÞ·¨ÔÚ µ¥Ôª %1 ÖлñµÃÁîÅÆ %2 ¡£\n\n´íÎó£º%4 (%3)" - IDS_TITLE_VERSION "AFS °æ±¾ %s" - IDS_TITLE_VERSION_NOPATCH "AFS °æ±¾ %s" - IDS_MOUNT_SOME "ÄúÒÑÑ¡Ôñ½«ÏÂÁÐÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶£º" - IDS_MOUNT_NONE "ÄúÉÐδѡÔñ½«ÈκÎÅÌ·ûÓ³Éäµ½ AFS ÖеÄ·¾¶¡£" - IDS_MOUNT "ÅÌ·û" - IDS_WIZ_NEXT "ÏÂÒ»²½(&N) >" - IDS_WIZ_FINISH "Íê³É(&F)" - IDS_MAP_LETTER "Çý¶¯Æ÷ *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "Çý¶¯Æ÷ %1: \t%2" - IDS_ERROR_MAP "Ó³ÉäÍøÂçÇý¶¯Æ÷³ö´í" - IDS_ERROR_MAP_DESC "AFS ÎÞ·¨Ó³ÉäÍøÂçÇý¶¯Æ÷ÖÁ AFS ÖеÄ·¾¶¡£¼ì²éÒÔÈ·±£ÅÌ·ûµ±Ç°Ã»ÓÐʹÓá£\n\n´íÎó£º0x%1¡£" - IDS_ERROR_UNMAP "Ó³ÉäÍøÂçÇý¶¯Æ÷³ö´í" - IDS_ERROR_UNMAP_DESC "AFS ÎÞ·¨¶Ï¿ªÓëÖ¸¶¨ÍøÂçÇý¶¯Æ÷µÄÓ³Éä¡£¼ì²éÒÔÈ·±£ÅÌ·ûµ±Ç°Ã»ÓÐʹÓá£\n\n´íÎó£º0x%1¡£" - IDS_CELL_GATEWAY "%s (ͨ¹ýÍø¹Ø %s)" - IDS_BADMAP_TITLE "Ó³ÉäÍøÂçÇý¶¯Æ÷³ö´í" - IDS_BADMAP_DESC "ÓÉÓÚ·¾¶Ã»ÓÐÒÔ""\\afs""¿ªÊ¼£¬AFS ²»ÄÜÓ³ÉäÅÌ·ûÖÁÖ¸¶¨µÄ·¾¶¡£\n\nÈ·±£ÄúËùÊäÈëµÄ·¾¶ÊÇÒÔ""\\afs""¿ªÊ¼µÄ£¬²¢ÖØÊÔÒ»´Î¡£" - IDS_UNCONFIG_TITLE_95 "³ö´í - AFS Light" - IDS_UNCONFIG_DESC_95 "ÒòΪÉÐδÅäÖà AFS Light£¬ËùÒÔÎÞ·¨Ê¹ÓÃËü¡£\n\nÒªÅäÖà AFS Light£¬Çë´ò¿ª¿ØÖÆÃæ°å²¢Ë«»÷¡°AFS Light¡±Í¼±ê¡£" - IDS_UNCONFIG_TITLE "³ö´í - AFS ¿Í»§»ú" - IDS_UNCONFIG_DESC "ÒòΪÉÐδÅäÖà AFS ¿Í»§»ú£¬ËùÒÔÎÞ·¨Ê¹ÓÃËü¡£\n\nÒªÅäÖà AFS ¿Í»§»ú£¬Çë´ò¿ª¿ØÖÆÃæ°å²¢Ë«»÷¡°AFS ¿Í»§»ú¡±Í¼±ê¡£" - IDS_NEWSUB_TITLE "×¢Òâ - AFS ¿Í»§»ú" - IDS_NEWSUB_TITLE_95 "×¢Òâ - AFS Light" - IDS_NEWSUB_DESC "µ±Á¬½ÓÍøÂçÇý¶¯Æ÷ʱ£¬AFS ÎÞ·¨Ê¹ÓÃÖ¸¶¨µÄÃèÊö¡£\n\nÖ¸¶¨µÄÃèÊöÒÑʹÓÃÔÚ²»Í¬µÄ AFS ·¾¶ÖС£" - IDS_BADSUB_TITLE "³ö´í - AFS ¿Í»§»ú" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "³ö´í - AFS Light" - IDS_BADSUB_DESC "²»ÄÜʹÓÃÄúÊäÈëµÄÅÌ·ûÃèÊö¡£\n\nÅÌ·ûÃèÊö²»Äܳ¬¹ý 12 ¸ö×Ö·û£¬²¢ÇÒ²»Äܰüº¬¿Õ¸ñ»òÖÆ±í·û¡£" - IDS_TITLE_95 "AFS Light" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/lang/zh_TW/afscreds.rc b/src/WINNT/client_creds/lang/zh_TW/afscreds.rc deleted file mode 100644 index 972b0c71b..000000000 --- a/src/WINNT/client_creds/lang/zh_TW/afscreds.rc +++ /dev/null @@ -1,584 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Taiwan) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Client" - -#define AFS_VERINFO_NAME "afscreds" -#define AFS_VERINFO_FILENAME "afscreds.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "afscreds.ico" -IDI_CREDS_NO ICON DISCARDABLE "creds_3.ico" -IDI_CREDS_SOME ICON DISCARDABLE "creds_2.ico" -IDI_CREDS_YES ICON DISCARDABLE "creds_1.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include \r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 306, 131 -STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ¥Î¤áºÝ" -CLASS "AfsCreds" -FONT 9, "·s²Ó©úÅé" -BEGIN - RTEXT "AFS %s ª©¡]­×¥¿ÀÉ %lu¡^",IDC_TITLE_VERSION,197,10, - 101,8 - LTEXT "¥Ø«e¥H ""%s"" µn¤J¦Ü Windows ºô¸ô ",IDC_TITLE_NT,7,8, - 171,8 - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,27,292,97 -END - -IDD_TAB_CREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "Cell¡G ",IDC_STATIC,7,9,24,8 - LTEXT "¡]µL¡^",IDC_CREDS_CELL,51,9,193,8 - LTEXT "°O¸¹¡G",IDC_STATIC,7,26,27,8 - LTEXT "¡]µL¡^",IDC_CREDS_INFO,51,26,193,8 - CONTROL "¦b³o¨Ç°O¸¹¨ì´Á¤§«eÅã¥Üĵ§i(&S)",IDC_CREDS_REMIND,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,51,43,193,10 - PUSHBUTTON "¨ú±o·sªº°O¸¹(&O)...",IDC_CREDS_OBTAIN,51,63,88,14 - PUSHBUTTON "±Ë±ó³o¨Ç°O¸¹(&D)",IDC_CREDS_DESTROY,142,63,92,14 - PUSHBUTTON "»¡©ú",9,237,63,45,14 -END - -IDD_TAB_NOCREDS DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±z©|¥¼¦b©Ò¦³ªº AFS Cell ¤¤¨ú±o°O¸¹¡C",IDC_RUNNING,7,9, - 275,8 - LTEXT "¨Ã¥¼¥¿½T¬[ºc AFS ¥Î¤áºÝ¡A©ÎªÌ¥Ø«e¨Ã¥¼°õ¦æ AFS ¥Î¤áºÝªA°È¡C\n\n½Ð¨Ï¥Î¡u¶i¶¥¡v¼ÐÅÒ¨Ó±Ò°Ê¡uAFS ¥Î¤áºÝ¡vªA°È¡C", - IDC_STOPPED,7,9,275,25 - PUSHBUTTON "»¡©ú",9,237,63,45,14 - PUSHBUTTON "¨ú±o·sªº°O¸¹(&O)...",IDC_CREDS_OBTAIN,51,63,88,14 -END - -IDD_TAB_ADVANCED DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¡]¬d¸ß...¡^",IDC_SERVICE_STATUS,7,9,275,8 - PUSHBUTTON "±Ò°ÊªA°È(&S)",IDC_SERVICE_START,53,34,73,14 - PUSHBUTTON "°±¤îªA°È(&T)",IDC_SERVICE_STOP,131,34,73,14 - PUSHBUTTON "¬[ºc AFS ¥Î¤áºÝ(&C)",IDC_OPEN_CPL,209,34,73,14 - CONTROL "·í¹q¸£­«·s±Ò°Ê®É¡A§Y±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v(&R)", - IDC_SERVICE_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, - 51,204,10 - CONTROL "Á`¬O¦b¤u§@¦CÅã¥Ü¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü(&A) ",IDC_STARTUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65,204,10 - PUSHBUTTON "»¡©ú",9,237,63,45,14 -END - -IDD_NEWCREDS DIALOG DISCARDABLE 0, 0, 232, 127 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¨ú±o·sªº AFS °O¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦p­n¨ú±o·sªº AFS °O¸¹¡A½Ð¿é¤J±z AFS ±b¤áªº¨Ï¥ÎªÌ¦WºÙ»P±K½X¡C±z¥i¥H¦P®É¦b¦h­« AFS Cell ¤º¨ã¦³°O¸¹¡C", - IDC_STATIC,7,7,218,24 - LTEXT "AFS Cell (&C)¡G",IDC_STATIC,24,42,49,8 - EDITTEXT IDC_NEWCREDS_CELL,83,40,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "¨Ï¥ÎªÌ¦WºÙ(&N)¡G",IDC_STATIC,24,60,59,8 - EDITTEXT IDC_NEWCREDS_USER,83,58,97,14,ES_AUTOHSCROLL - LTEXT "±K½X(&P)¡G",IDC_STATIC,23,78,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,83,76,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,69,106,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,122,106,50,14 - PUSHBUTTON "»¡©ú",9,175,106,50,14 -END - -IDD_NEWCREDS_EXPIRE DIALOG DISCARDABLE 0, 0, 232, 155 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¨ú±o·sªº AFS °O¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦p­n¨ú±o·sªº AFS °O¸¹¡A½Ð¿é¤J±z AFS ±b¤áªº¨Ï¥ÎªÌ¦WºÙ»P±K½X¡C±z¥i¥H¦P®É¦b¦h­« AFS Cell ¤º¨ã¦³°O¸¹¡C", - IDC_STATIC,7,29,218,24 - LTEXT "AFS Cell (&C)¡G",IDC_STATIC,10,64,56,8 - EDITTEXT IDC_NEWCREDS_CELL,74,62,132,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "¨Ï¥ÎªÌ¦WºÙ(&N)¡G",IDC_STATIC,10,82,59,8 - EDITTEXT IDC_NEWCREDS_USER,74,80,97,14,ES_AUTOHSCROLL - LTEXT "±K½X(&P)¡G",IDC_STATIC,10,100,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,74,98,97,14,ES_PASSWORD | - ES_AUTOHSCROLL - LTEXT "±z¦b %1 Cell ªº°O¸¹§Y±N¹L´Á¡C",IDC_NEWCREDS_TITLE,7,7, - 218,16 - DEFPUSHBUTTON "½T©w",IDOK,69,134,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,122,134,50,14 - PUSHBUTTON "»¡©ú",9,175,134,50,14 -END - -IDD_TAB_MOUNT DIALOG DISCARDABLE 0, 0, 289, 81 -STYLE WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±z¤w¿ï¾Ü±N¥H¤UªººÏºÐ¾÷¥N¸¹¹ïÀ³¦Ü AFS ¸ô®|¡G",IDC_TITLE, - 7,8,275,8 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,51,63,45,14 - PUSHBUTTON "Åܧó(&C)...",IDC_EDIT,99,63,45,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,147,63,45,14 - CONTROL "",IDC_LIST,"CheckList",WS_BORDER | WS_VSCROLL | - WS_TABSTOP | 0x1d3,51,21,231,37 - PUSHBUTTON "»¡©ú",9,237,63,45,14 -END - -IDD_WIZARD DIALOGEX 0, 0, 299, 177 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¥Î¤áºÝºëÆF" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "¤U¤@¨B(&N) >",IDNEXT,187,150,50,14 - PUSHBUTTON "¨ú®ø(&L)",IDCANCEL,242,150,50,14 - CONTROL "",IDC_LHS,"Static",SS_BLACKFRAME,7,7,76,119 - CONTROL "",IDC_RHS,"Static",SS_BLACKFRAME,97,7,195,119 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,138,285,1 - PUSHBUTTON "»¡©ú(&H)",9,79,150,50,14 - PUSHBUTTON "< ¤W¤@¨B(&B)",IDBACK,133,150,50,14 -END - -IDD_WIZ_START DIALOG DISCARDABLE 0, 0, 195, 119 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "©|¥¼±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v¡C",IDC_STATIC,4,6,173,8 - LTEXT "¦p­n±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v¡A½Ð«ö¡u¤U¤@¨B¡v¡C", - IDC_STATIC,4,79,185,8 - LTEXT "¦b°õ¦æ¡uAFS ¥Î¤áºÝªA°È¡v¤§«e¡A±z±NµLªk¨Ï¥ÎÀx¦s©ó AFS ¤ºªºÀɮסC", - IDC_STATIC,4,23,173,17 - LTEXT "¦p­n°±¤î°õ¦æ¡uAFS ¥Î¤áºÝªA°È¡v¡A½Ð«ö¡u¨ú®ø¡v¡C", - IDC_STATIC,4,94,186,17 -END - -IDD_WIZ_CREDS DIALOG DISCARDABLE 0, 0, 195, 119 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¥Ø«e¥¿¦b°õ¦æ¡uAFS ¥Î¤áºÝªA°È¡v¡A¦ý¬O±z©|¥¼¨ú±o¥ô¦ó¨Ï¥Î AFS ªº°O¸¹¡C", - IDC_STATIC,8,5,173,16 - CONTROL "¤£­n¨ú±o¥ô¦ó Cell ªº°O¸¹",IDC_NOCREDS,"Button", - BS_AUTORADIOBUTTON,8,28,141,10 - CONTROL "¨ú±o¥H¤U Cell ªº°O¸¹¡G",IDC_YESCREDS,"Button", - BS_AUTORADIOBUTTON,8,44,141,10 - LTEXT "AFS Cell (&C)¡G",IDC_STATIC,11,64,54,8 - EDITTEXT IDC_NEWCREDS_CELL,77,62,96,14,ES_LOWERCASE | - ES_AUTOHSCROLL - LTEXT "¨Ï¥ÎªÌ¦WºÙ(&N)¡G",IDC_STATIC,11,82,61,8 - EDITTEXT IDC_NEWCREDS_USER,77,80,96,14,ES_AUTOHSCROLL - LTEXT "±K½X(&P)¡G",IDC_STATIC,11,100,34,8 - EDITTEXT IDC_NEWCREDS_PASSWORD,77,97,96,14,ES_PASSWORD | - ES_AUTOHSCROLL -END - -IDD_WIZ_STARTING DIALOG DISCARDABLE 0, 0, 195, 119 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "½Ðµy­Ô¡F¥¿¦b±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v...",IDC_START_TRY,10, - 33,173,8 - LTEXT "µLªk±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v¡C\n\n\n½ÐÀˬd±zªººô¸ô³]©w¡A¨Ã¨Ï¥Î¡u±±¨î¥x¡vªº AFS ¹Ï¥Ü¨ÓÀˬd¦¹¹q¸£¡uAFS ¥Î¤áºÝ¡vªº¬[ºc¡C", - IDC_START_FAIL,9,21,164,55 -END - -IDD_WIZ_MOUNT DIALOG DISCARDABLE 0, 0, 195, 119 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¦p­n¦s¨úÀx¦s©ó AFS ¤ºªºÀɮסA±z¥²¶·±NºÏºÐ¾÷¥N¸¹¹ïÀ³¦Ü AFS ªº¸ô®|¤W¡C", - IDC_STATIC,6,4,173,16 - CONTROL "¤£­n±N¥ô¦óºÏºÐ¾÷¥N¸¹¹ïÀ³¨ì AFS ªº¸ô®|¤W(&D)",IDC_NOMAP, - "Button",BS_AUTORADIOBUTTON,5,23,179,10 - CONTROL "¦Ü¤Ö±N¤@­ÓºÏºÐ¾÷¥N¸¹¹ïÀ³¨ì AFS ªº¸ô®|¤W(&M)¡G", - IDC_YESMAP,"Button",BS_AUTORADIOBUTTON,6,40,178,10 - LTEXT "ºÏºÐ¾÷¥N¸¹(&L)¡G",IDC_STATIC,24,58,61,8 - COMBOBOX IDC_MAP_LETTER,85,56,48,125,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ¸ô®|(&P)¡G",IDC_STATIC,24,76,58,8 - EDITTEXT IDC_MAP_PATH,85,74,96,14,ES_AUTOHSCROLL - LTEXT "µu¦WºÙ(&E)¡G",IDC_STATIC,24,94,38,8 - EDITTEXT IDC_MAP_DESC,85,92,60,14,ES_AUTOHSCROLL -END - -IDD_TERMINATE DIALOGEX 0, 0, 291, 117 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¥Î¤áºÝ" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - PUSHBUTTON "²¾°£¹Ï¥Ü(&R)",IDOK,167,96,63,14 - PUSHBUTTON "¨ú®ø(&L)",IDCANCEL,234,96,50,14 - LTEXT "±z¿ï¾Ü²¾°£¹q¸£¤u§@¦C¤Wªº¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü¡C°£«D¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü¥X²{¦b¹q¸£ªº¤u§@¦C¤W¡A§_«h·í AFS °O¸¹§Y±N¹L´Áªº®É­Ô¡AAFS µLªkĵ§i±z¡C", - IDC_STATIC,7,7,277,25 - LTEXT "¥Ø«e¥¿¦b°õ¦æ¡uAFS ¥Î¤áºÝªA°È¡v¡A±z¥i¥HÀH®É°±¤î³o­Óµ{¦¡¡C", - IDC_STATIC,7,41,277,8 - CONTROL "Ä~Äò°õ¦æ¡uAFS ¥Î¤áºÝªA°È¡v(&L)",IDC_LEAVE,"Button", - BS_AUTORADIOBUTTON,12,55,228,10 - CONTROL "°±¤î¡uAFS ¥Î¤áºÝªA°È¡v(&S)",IDC_STOP,"Button", - BS_AUTORADIOBUTTON,12,69,228,10 - CONTROL "¹q¸£­«·s±Ò°Ê®ÉÅã¥Ü¹Ï¥Ü(&H)",IDC_STARTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,98,148,10 -END - -IDD_TERMINATE_SMALL DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS ¥Î¤áºÝ" -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - PUSHBUTTON "²¾°£¹Ï¥Ü(&R)",IDOK,167,47,63,14 - PUSHBUTTON "¨ú®ø(&L)",IDCANCEL,234,47,50,14 - LTEXT "±z¿ï¾Ü²¾°£¹q¸£¤u§@¦C¤Wªº¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü¡C°£«D¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü¥X²{¦b¹q¸£ªº¤u§@¦C¤W¡A§_«h·í AFS °O¸¹§Y±N¹L´Áªº®É­Ô¡AAFS ´NµLªkĵ§i±z¡C", - -1,7,7,277,25 - CONTROL "¹q¸£­«·s±Ò°Ê®ÉÅã¥Ü¹Ï¥Ü(&H)",IDC_STARTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_TERMINATE_SMALL_95 DIALOGEX 0, 0, 291, 68 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "AFS Light " -FONT 9, "·s²Ó©úÅé", 0, 0, 0x1 -BEGIN - PUSHBUTTON "²¾°£¹Ï¥Ü(&R)",IDOK,167,47,63,14 - PUSHBUTTON "¨ú®ø(&L)",IDCANCEL,234,47,50,14 - LTEXT "±z¿ï¾Ü²¾°£¹q¸£¤u§@¦C¤Wªº¡uAFS Light ¡v¹Ï¥Ü¡C°£«D¡uAFS Light ¡v¹Ï¥Ü¥X²{¦b¹q¸£ªº¤u§@¦C¤W¡A§_«h·í AFS °O¸¹§Y±N¹L´Áªº®É­Ô¡AAFS ´NµLªkĵ§i±z¡C", - -1,7,7,277,25 - CONTROL "¹q¸£­«·s±Ò°Ê®ÉÅã¥Ü¹Ï¥Ü(&H)",IDC_STARTUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,49,148,10 -END - -IDD_WIZ_MOUNTING DIALOG DISCARDABLE 0, 0, 195, 119 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±z©Ò¿ï¾Üªº¤@©Î¦h­ÓºÏºÐ¾÷¥N¸¹µLªk¹ïÀ³¦Ü AFS ¾A·íªº¸ô®|¤W¡C\n\n\n±z¥²¶·Ãö³¬¥Ø«e¥¿¸Õ¹Ï¨Ï¥Î AFS ¸ô®|ªºÀ³¥Îµ{¦¡¡C", - IDC_MAP_FAIL,10,23,177,50 - LTEXT "½Ðµy­Ô¡F¥¿¦b±NºÏºÐ¾÷¥N¸¹¹ïÀ³¨ì AFS ªº¸ô®|¤W...", - IDC_MAP_TRY,9,43,173,8 -END - -IDD_WIZ_FINISH DIALOG DISCARDABLE 0, 0, 195, 119 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "¡uAFS ¥Î¤áºÝ¡v¤w·Ç³Æ´Nºü¡C",IDC_STATIC,7,6,173,8 - LTEXT "¦p­nÃö³¬¦¹ºëÆF¡A½Ð«ö¤@¤U¡u§¹¦¨¡v¡C",IDC_STATIC,7,76,173, - 8 -END - -IDD_MAPPING DIALOG DISCARDABLE 0, 0, 275, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¹ïÀ³ºÏºÐ¾÷¥N¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "±z¥i¥H±N¹q¸£¤WªººÏºÐ¾÷¥N¸¹¹ïÀ³¦Ü AFS ªº¸ô®|¤W¡C\n\n¨Ò¦p¡A¦pªG±z§â Q: ¹ïÀ³¬° \\afs\\acme.com\\usr\\bob¡A«h AFS \\afs\\acme.com\\usr\\bob\\* ¤WªºÀÉ®×´N·|¥X²{¦b Q¡G\\ ¤W ", - IDC_STATIC,7,7,261,32 - LTEXT "ºÏºÐ¾÷¥N¸¹(&L)¡G",IDC_STATIC,11,53,58,8 - COMBOBOX IDC_MAP_LETTER,69,51,56,162,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "AFS ¸ô®|(&P)¡G",IDC_STATIC,11,70,50,8 - EDITTEXT IDC_MAP_PATH,69,68,166,13,ES_AUTOHSCROLL - LTEXT "µu¦WºÙ(&E)¡G",IDC_STATIC,11,88,49,8 - EDITTEXT IDC_MAP_DESC,69,86,60,13,ES_AUTOHSCROLL - CONTROL "¨C¦¸µn¤J®É§Y«ì´_¦¹¤@¹ïÀ³(&R)",IDC_MAP_PERSISTENT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,69,105,185,10 - DEFPUSHBUTTON "½T©w",IDOK,112,131,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,165,131,50,14 - PUSHBUTTON "»¡©ú",9,218,131,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 299 - TOPMARGIN, 8 - BOTTOMMARGIN, 124 - END - - IDD_TAB_CREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_NOCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_TAB_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_NEWCREDS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 120 - END - - IDD_NEWCREDS_EXPIRE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 225 - TOPMARGIN, 7 - BOTTOMMARGIN, 148 - END - - IDD_TAB_MOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 282 - TOPMARGIN, 9 - BOTTOMMARGIN, 77 - END - - IDD_WIZARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 7 - BOTTOMMARGIN, 170 - END - - IDD_WIZ_CREDS, DIALOG - BEGIN - RIGHTMARGIN, 174 - BOTTOMMARGIN, 111 - END - - IDD_WIZ_MOUNT, DIALOG - BEGIN - RIGHTMARGIN, 191 - BOTTOMMARGIN, 111 - END - - IDD_TERMINATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 110 - END - - IDD_TERMINATE_SMALL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 61 - END - - IDD_MAPPING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 268 - TOPMARGIN, 7 - BOTTOMMARGIN, 145 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MENU_TRAYICON MENU DISCARDABLE -BEGIN - MENUITEM "Åã¥Ü°O¸¹(&S)...", M_ACTIVATE - MENUITEM "¹L´Á«e¥ýĵ§i(&W)", M_REMIND, CHECKED - MENUITEM SEPARATOR - MENUITEM "²¾°£¹Ï¥Ü(&R)...", M_TERMINATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_WIZ16 BITMAP DISCARDABLE "wiz16.bmp" -IDB_WIZ256 BITMAP DISCARDABLE "wiz256.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TOOLTIP "AFS ¥Î¤áºÝ" - IDS_TOOLTIP_95 "AFS Light " - IDS_CREDENTIALS "°O¸¹" - IDS_UNKNOWN "¡]¤£©ú¡^" - IDS_ADVANCED "¶i¶¥" - IDS_CREDS "%1 ¡]°O¸¹¹L´Á %2¡^" - IDS_NO_CREDS "¡]±z¦b¦¹ Cell ¤¤¨S¦³°O¸¹¡^" - IDS_SERVICE_BROKEN "¡uAFS ¥Î¤áºÝªA°È¡v¦w¸Ë¤£·í¡A©ÎªÌ±z¨S¦³¬d¸ß¨äª¬ºAªºÅv­­¡C" - IDS_SERVICE_RUNNING "¡uAFS ¥Î¤áºÝªA°È¡v¥Ø«e°õ¦æ¥¿±`¡C" - IDS_SERVICE_STOPPED "¥Ø«e¤w°±¤î¡uAFS ¥Î¤áºÝªA°È¡v¡C" - IDS_SERVICE_STOPPING "½Ðµy­Ô¡F¥¿¦b°±¤î¡uAFS ¥Î¤áºÝªA°È¡v..." - IDS_SERVICE_STARTING "½Ðµy­Ô¡F¥¿¦b±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v..." - IDS_SERVICE_UNKNOWN "µLªk§PÂ_¡uAFS ¥Î¤áºÝªA°È¡vªºª¬ºA¡C" - IDS_SERVICE_FAIL_STOP "µLªk¶¶§Q°±¤î¡uAFS ¥Î¤áºÝªA°È¡v¡C±z¥i¯à¥¼Àò±o°õ¦æ¦¹¤@§@·~ªºÅv­­¡C\n\n¿ù»~ 0x%1¡C" - IDS_SERVICE_FAIL_START "µLªk¶¶§Q±Ò°Ê¡uAFS ¥Î¤áºÝªA°È¡v¡C±z¥i¯à¥¼Àò±o°õ¦æ¦¹¤@§@·~ªºÅv­­¡C\n\n¿ù»~ 0x%1¡C" - IDS_SERVICE_FAIL_CONFIG "µLªkÅܧó¡uAFS ¥Î¤áºÝªA°È¡vªº±Ò°Ê°Ñ¼Æ¡C±zªºÅv­­¤£¨¬¥H°õ¦æ¦¹¶µ§@·~¡C\n\n¿ù»~ 0x%1¡C" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SERVICE_ERROR "¬[ºcªA°È®Éµo¥Í¿ù»~" - IDS_ERROR_TITLE "¿ù»~ - AFS ¥Î¤áºÝ" - IDS_ERROR_TITLE_95 "¿ù»~ - AFS Light " - IDS_ERROR_DESTROY_95 "µLªk¾P·´±z¦b %1 Cell ¤¤ªº°O¸¹¡C\n\n¿ù»~¡G %2 " - IDS_ERROR_DESTROY_NOCM "±z¦b %1 Cell ¤¤ªº°O¸¹µLªk¾P·´¡A¦]¬°¡uAFS ¥Î¤áºÝªA°È¡v¨S¦³¦^À³¡C\n\n½ÐÀˬd¡u¶i¶¥¡v¼ÐÅÒ¡A¬d¬Ý¡uAFS ¥Î¤áºÝ¡v¬O§_¥¿±`°õ¦æ¡C\n\n¿ù»~¡G %2" - IDS_ERROR_DESTROY_UNKNOWN - "±z¦b %1 Cell ¤¤ªº°O¸¹µLªk¾P·´¡C\n\n½ÐÀˬd¡u¶i¶¥¡v¼ÐÅÒ¡A¬d¬Ý¡u AFS ¥Î¤áºÝ¡v¬O§_¥¿±`°õ¦æ¡C\n\n¿ù»~¡G %2" - IDS_ERROR_OBTAIN "¡uAFS ¥Î¤áºÝ¡vµLªk¦b Cell %1 ¤¤¨ú±o %2 ªº°O¸¹¡C\n\n¿ù»~¡G %4 (%3)" - IDS_ERROR_OBTAIN_95 "¡uAFS Light ¡vµLªk¦b Cell %1 ¤¤¨ú±o %2 ªº°O¸¹¡C\n\n¿ù»~¡G %4 (%3)" - IDS_TITLE_VERSION "AFS ª©¥» %s" - IDS_TITLE_VERSION_NOPATCH "AFS ª©¥» %s" - IDS_MOUNT_SOME "±z¤w¿ï¾Ü±N¥H¤UªººÏºÐ¾÷¥N¸¹¹ïÀ³¦Ü AFS ¸ô®|¡G" - IDS_MOUNT_NONE "±z©|¥¼¿ï¾Ü¹ïÀ³ºÏºÐ¾÷¥N¸¹¦Ü AFS ªº¸ô®|¤W¡C" - IDS_MOUNT "ºÏºÐ¾÷¥N¸¹" - IDS_WIZ_NEXT "¤U¤@¨B(&N) >" - IDS_WIZ_FINISH "§¹¦¨(&F)" - IDS_MAP_LETTER "ºÏºÐ¾÷ *:" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_MAP "ºÏºÐ¾÷ %1: \t%2" - IDS_ERROR_MAP "¹ïÀ³ºô¸ôºÏºÐ¾÷®Éµo¥Í¿ù»~" - IDS_ERROR_MAP_DESC "AFS µLªk¹ïÀ³ºô¸ôºÏºÐ¾÷¨ì AFS ¤Wªº«ü©w¸ô®|¡C½Ð½T©w¥Ø«e¨Ã¥¼¨Ï¥Î¸ÓºÏºÐ¾÷¥N¸¹¡C\n\n¿ù»~¡G 0x%1¡C" - IDS_ERROR_UNMAP "¹ïÀ³ºô¸ôºÏºÐ¾÷®Éµo¥Í¿ù»~" - IDS_ERROR_UNMAP_DESC "AFS µLªk¨ú®ø¹ïÀ³«ü©wªººô¸ôºÏºÐ¾÷¡C½Ð½T©w¥Ø«e¨Ã¥¼¨Ï¥Î¸ÓºÏºÐ¾÷¥N¸¹¡C\n\n¿ù»~¡G 0x%1¡C" - IDS_CELL_GATEWAY "%s ¡]³z¹L¹h¹D %s¡^" - IDS_BADMAP_TITLE "¹ïÀ³ºô¸ôºÏºÐ¾÷®Éµo¥Í¿ù»~" - IDS_BADMAP_DESC "AFS µLªk¹ïÀ³ºÏºÐ¾÷¥N¸¹¨ì«ü©w¸ô®|¡A¦]¬°¸ô®|¨Ã«D¥H ""\\afs"" ¬°¶}ÀY¡C\n\n½Ð½T©w±z©Ò¿é¤Jªº¸ô®|¶}ÀY¬° ""\\afs""¡AµM«á¦A¸Õ¤@¦¸¡C" - IDS_UNCONFIG_TITLE_95 "¿ù»~ - AFS Light " - IDS_UNCONFIG_DESC_95 "©|¥¼¬[ºc¡uAFS Light ¡v¡A¦]¦¹µLªk¨Ï¥Î¡C\n\n¦p­n¬[ºc¡uAFS Light ¡v¡A½Ð¶}±Ò¡u±±¨î¥x¡v¡A¨Ã¦b¡uAFS Light ¬[ºc¡v¹Ï¥Ü¤W«ö¨â¤U¡C" - IDS_UNCONFIG_TITLE "¿ù»~ - AFS ¥Î¤áºÝ" - IDS_UNCONFIG_DESC "©|¥¼¬[ºc¡uAFS ¥Î¤áºÝ¡v¡A¦]¦¹µLªk¨Ï¥Î¡C\n\n¦p­n¬[ºc¡uAFS ¥Î¤áºÝ¡v¡A½Ð¶}±Ò¡u¥D±±¥x¡v¨Ã¦b¡uAFS ¥Î¤áºÝ¡v¹Ï¥Ü¤W«ö¨â¤U¡C" - IDS_NEWSUB_TITLE "ĵ§i - AFS ¥Î¤áºÝ" - IDS_NEWSUB_TITLE_95 "ĵ§i - AFS Light " - IDS_NEWSUB_DESC "AFS ¦b³s±µºô¸ôºÏºÐ¾÷®É¡AµLªk¨Ï¥Î±z©Ò«ü©wªº»¡©ú¡C \n\n\n©Ò«ü©wªº»¡©ú¤w¥Î©ó¤£¦Pªº AFS ¸ô®|¡C" - IDS_BADSUB_TITLE "¿ù»~ - AFS ¥Î¤áºÝ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BADSUB_TITLE_95 "¿ù»~ - AFS Light " - IDS_BADSUB_DESC "±z©Ò¿é¤JªººÏºÐ¾÷¥N¸¹»¡©úµLªk¨Ï¥Î¡C\n\nºÏºÐ¾÷¥N¸¹»¡©ú³Ì¦h¤£¯à¶W¹L 12 ­Ó¦r¤¸¡A¦Ó¥B¤£¥i¥]§tªÅ®æ©Î¼ÐÄæ¡C" - IDS_TITLE_95 "AFS Light " -END - -#endif // Chinese (Taiwan) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_creds/main.cpp b/src/WINNT/client_creds/main.cpp deleted file mode 100644 index 11bf7d742..000000000 --- a/src/WINNT/client_creds/main.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -#include -#include -#include -#include "ipaddrchg.h" -} - -#include "afscreds.h" -#include // So we can see if the server's installed -#include "drivemap.h" -#include -#include - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -const TCHAR cszCLASSNAME[] = TEXT("AfsCreds"); - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -GLOBALS g; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL InitApp (LPSTR pszCmdLineA); -void ExitApp (void); -void Quit (void); -void PumpMessage (MSG *pmsg); -BOOL IsServerInstalled (void); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pCmdLine, int nCmdShow) -{ - Shortcut_Init(); - TaLocale_LoadCorrespondingModule (hInst); - - osi_InitTraceOption(); - osi_LogEvent0("AFSCreds Main command line",pCmdLine); - fs_utils_InitMountRoot(); - - if (InitApp (pCmdLine)) - { - MSG msg; - while (GetMessage (&msg, NULL, 0, 0) > 0) - { - PumpMessage (&msg); - } - - ExitApp(); - } - - Shortcut_Exit(); - return 0; -} - -#define ISHIGHSECURITY(v) ( ((v) & LOGON_OPTION_HIGHSECURITY)==LOGON_OPTION_HIGHSECURITY) -#define REG_CLIENT_PROVIDER_KEY "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\NetworkProvider" - -BOOL InitApp (LPSTR pszCmdLineA) -{ - BOOL fShow = FALSE; - BOOL fQuiet = FALSE; - BOOL fExit = FALSE; - BOOL fInstall = FALSE; - BOOL fUninstall = FALSE; - BOOL fAutoInit = FALSE; - BOOL fNetDetect = FALSE; - BOOL fRenewMaps = FALSE; - - // Initialize our global variables and window classes - // - memset (&g, 0x00, sizeof(g)); - g.fStartup = TRUE; - - // Parse the command-line - // - while (pszCmdLineA && *pszCmdLineA) - { - if ((*pszCmdLineA != '-') && (*pszCmdLineA != '/')) - break; - - switch (*(++pszCmdLineA)) - { - case 'a': - case 'A': - fAutoInit = TRUE; - break; - - case 'm': - case 'M': - fRenewMaps = TRUE; - break; - - case 'n': - case 'N': - fNetDetect = TRUE; - break; - - case 's': - case 'S': - fShow = TRUE; - break; - - case 'q': - case 'Q': - fQuiet = TRUE; - break; - - case 'e': - case 'E': - fExit = TRUE; - break; - - case 'i': - case 'I': - fInstall = TRUE; - break; - - case 'u': - case 'U': - fUninstall = TRUE; - break; - - case ':': - CopyAnsiToString(g.SmbName,pszCmdLineA); - MapShareName(pszCmdLineA); - break; - - case 'z': - case 'Z': - DoUnMapShare(TRUE); - return(0); - - case 'x': - case 'X': - TestAndDoMapShare(SERVICE_START_PENDING); - TestAndDoMapShare(SERVICE_RUNNING); - return 0; - } - - while (*pszCmdLineA && (*pszCmdLineA != ' ')) - ++pszCmdLineA; - if (*pszCmdLineA==' ') ++pszCmdLineA; - } - - if (fInstall) - Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = TRUE); - else if (fUninstall) - Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = FALSE); - - if (fInstall) - { - HKEY hk; - if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize); - RegCloseKey (hk); - } - } - - // Only show up if there's not another version of this app around already. - // - for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD); - hSearch && IsWindow(hSearch); - hSearch = GetWindow (hSearch, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - if (GetClassName (hSearch, szClassName, cchRESOURCE)) - { - if (!lstrcmpi (szClassName, cszCLASSNAME)) - { - if (fShow) - PostMessage (hSearch, WM_COMMAND, M_ACTIVATE, 0); - else if (fExit) - PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); - else if (fUninstall) - PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); - return FALSE; - } - } - } - - if (fExit || fUninstall || fInstall) - return FALSE; - - HKEY hk; - if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); - RegCloseKey (hk); - } - else if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); - RegCloseKey (hk); - } - - Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); - - // Is this Windows NT? - // - OSVERSIONINFO Version; - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - if (GetVersionEx (&Version)) - g.fIsWinNT = (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE; - - if (!g.fIsWinNT) - lstrcpy (g.szHelpFile, TEXT("afs-light.hlp")); - else - lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp")); - - // Initialize winsock etc - // - WSADATA Data; - WSAStartup (0x0101, &Data); - - InitCommonControls(); - RegisterCheckListClass(); - osi_Init(); - lock_InitializeMutex(&g.expirationCheckLock, "expiration check lock"); - lock_InitializeMutex(&g.credsLock, "global creds lock"); - - KFW_AFS_wait_for_service_start(); - - if ( IsDebuggerPresent() ) { - if ( !g.fIsWinNT ) - OutputDebugString("No Service Present on non-NT systems\n"); - else { - if ( IsServiceRunning() ) - OutputDebugString("AFSD Service started\n"); - else { - OutputDebugString("AFSD Service stopped\n"); - if ( !IsServiceConfigured() ) - OutputDebugString("AFSD Service not configured\n"); - else if ( fAutoInit ) - OutputDebugString("AFSD Service will be started\n"); - } - } - } - - // If the service isn't started yet, and autoInit start the service - if ( g.fIsWinNT && !IsServiceRunning() && IsServiceConfigured() && fAutoInit ) { - SC_HANDLE hManager; - - if ((hManager = OpenSCManager( NULL, NULL, - SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS)) != NULL ) - { - SC_HANDLE hService; - if ((hService = OpenService( hManager, TEXT("TransarcAFSDaemon"), - SERVICE_QUERY_STATUS | SERVICE_START) ) != NULL) - { - if (StartService(hService, 0, 0)) { - if ( IsDebuggerPresent() ) - OutputDebugString("AFSD Service start successful\n"); - fRenewMaps = TRUE; - } else if ( IsDebuggerPresent() ) - OutputDebugString("AFSD Service start failed\n"); - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - KFW_AFS_wait_for_service_start(); - } - - KFW_initialize(); - - // Create a main window. All further initialization will be done during - // processing of WM_INITDIALOG. - // - WNDCLASS wc; - if (!GetClassInfo (NULL, WC_DIALOG, &wc)) // Get dialog class info - return FALSE; - wc.hInstance = THIS_HINST; - wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); - wc.lpszClassName = cszCLASSNAME; - wc.style |= CS_GLOBALCLASS; - RegisterClass(&wc); - - g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DlgProc); - if (g.hMain == NULL) - return FALSE; - - // If the service isn't started yet, show our startup wizard. - // - if (!IsServiceRunning() && !fQuiet) - { - if (!g.fIsWinNT) - Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); - else if (IsServiceConfigured()) - ShowStartupWizard(); - else if (!IsServerInstalled()) - Message (MB_ICONHAND, IDS_UNCONFIG_TITLE, IDS_UNCONFIG_DESC); - } - if (IsServiceRunning()) { - if ( fRenewMaps ) - { - if ( IsDebuggerPresent() ) - OutputDebugString("Renewing Drive Maps\n"); - DoMapShare(); - } - if (fShow) - { - if ( IsDebuggerPresent() ) - OutputDebugString("Displaying Main window\n"); - Main_Show (TRUE); - } - // If the root cell is reachable and we have no tokens - // display the Obtain Tokens dialog to the user - if ( fAutoInit ) { - if ( IsDebuggerPresent() ) - OutputDebugString("Obtaining Tokens (if needed)\n"); - ObtainTokensFromUserIfNeeded(g.hMain); - } - } else if ( IsDebuggerPresent() ) - OutputDebugString("AFSD Service Stopped\n"); - - if ( fNetDetect ) { - // Start IP Address Change Monitor - if ( IsDebuggerPresent() ) - OutputDebugString("Activating Network Change Monitor\n"); - IpAddrChangeMonitorInit(g.hMain); - } - Main_EnableRemindTimer(TRUE); - return TRUE; -} - - -void ExitApp (void) -{ - KFW_cleanup(); - g.hMain = NULL; -} - - -void PumpMessage (MSG *pmsg) -{ - if (!IsMemoryManagerMessage (pmsg)) - { - if (!IsDialogMessage (g.hMain, pmsg)) - { - TranslateMessage (pmsg); - DispatchMessage (pmsg); - } - } -} - - -void Quit (void) -{ - if (IsWindow (g.hMain)) - { - ChangeTrayIcon (NIM_DELETE); - DestroyWindow (g.hMain); - } - PostQuitMessage (0); -} - - -BOOL IsServerInstalled (void) -{ - BOOL fInstalled = FALSE; - HKEY hk; - - if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_SVR_SVC_SUBKEY, &hk) == 0) - { - fInstalled = TRUE; - RegCloseKey (hk); - } - - return fInstalled; -} - diff --git a/src/WINNT/client_creds/misc.cpp b/src/WINNT/client_creds/misc.cpp deleted file mode 100644 index b1cc410a5..000000000 --- a/src/WINNT/client_creds/misc.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afscreds.h" - - -/* - * REALLOC ____________________________________________________________________ - * - */ - -BOOL AfsCredsReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc) -{ - LPVOID pNew; - size_t cNew; - - if (cReq <= *pcTarget) - return TRUE; - - if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0) - return FALSE; - - if ((pNew = Allocate (cbElement * cNew)) == NULL) - return FALSE; - memset (pNew, 0x00, cbElement * cNew); - - if (*pcTarget != 0) - { - memcpy (pNew, *ppTarget, cbElement * (*pcTarget)); - Free (*ppTarget); - } - - *ppTarget = pNew; - *pcTarget = cNew; - return TRUE; -} - - -/* - * REGISTRY SETTINGS __________________________________________________________ - * - */ - -void LoadRemind (size_t iCreds) -{ - g.aCreds[ iCreds ].fRemind = TRUE; - - HKEY hk; - if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY "\\Reminders", &hk) == 0) - { - DWORD dwValue = 1; - DWORD dwSize = sizeof(dwValue); - DWORD dwType = REG_DWORD; - if (RegQueryValueEx (hk, g.aCreds[ iCreds ].szCell, NULL, &dwType, (PBYTE)&dwValue, &dwSize) == 0) - g.aCreds[ iCreds ].fRemind = dwValue; - RegCloseKey (hk); - } -} - - -void SaveRemind (size_t iCreds) -{ - HKEY hk; - if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY "\\Reminders", &hk) == 0) - { - DWORD dwValue = g.aCreds[ iCreds ].fRemind; - RegSetValueEx (hk, g.aCreds[ iCreds ].szCell, NULL, REG_DWORD, (PBYTE)&dwValue, sizeof(DWORD)); - RegCloseKey (hk); - } -} - - -void TimeToSystemTime (SYSTEMTIME *pst, time_t TimeT) -{ - memset (pst, 0x00, sizeof(SYSTEMTIME)); - - struct tm *pTime; - if ((pTime = localtime (&TimeT)) != NULL) - { - pst->wYear = pTime->tm_year + 1900; - pst->wMonth = pTime->tm_mon + 1; - pst->wDayOfWeek = pTime->tm_wday; - pst->wDay = pTime->tm_mday; - pst->wHour = pTime->tm_hour; - pst->wMinute = pTime->tm_min; - pst->wSecond = pTime->tm_sec; - pst->wMilliseconds = 0; - } -} - - -LPARAM GetTabParam (HWND hTab, int iTab) -{ - TC_ITEM Item; - memset (&Item, 0x00, sizeof(Item)); - Item.mask = TCIF_PARAM; - if (!TabCtrl_GetItem (hTab, iTab, &Item)) - return NULL; - return Item.lParam; -} - - -HWND GetTabChild (HWND hTab) -{ - for (HWND hChild = GetWindow (hTab, GW_CHILD); - hChild != NULL; - hChild = GetWindow (hChild, GW_HWNDNEXT)) - { - TCHAR szClassName[ cchRESOURCE ]; - - if (GetClassName (hChild, szClassName, cchRESOURCE)) - { - if (!lstrcmp (szClassName, TEXT("#32770"))) // WC_DIALOG - return hChild; - } - } - - return NULL; -} - diff --git a/src/WINNT/client_creds/mounttab.cpp b/src/WINNT/client_creds/mounttab.cpp deleted file mode 100644 index d82a81b7b..000000000 --- a/src/WINNT/client_creds/mounttab.cpp +++ /dev/null @@ -1,478 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -} - -#include "afscreds.h" - - -/* - * VARIABLES __________________________________________________________________ - * - */ - -static struct l - { - int iDriveSelectLast; - } l; - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Mount_OnInitDialog (HWND hDlg); -void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog = FALSE); -void Mount_OnSelect (HWND hDlg); -void Mount_OnCheck (HWND hDlg); -void Mount_OnRemove (HWND hDlg); -void Mount_OnAdd (HWND hDlg); -void Mount_OnEdit (HWND hDlg); - -void Mount_AdjustMapping (HWND hDlg, int iDrive); -int Mount_DriveFromItem (HWND hDlg, int iItem); - -BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Mapping_OnInitDialog (HWND hDlg); -void Mapping_OnOK (HWND hDlg); -void Mapping_OnEnable (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Mount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - RECT rTab; - GetClientRect (GetParent(hDlg), &rTab); - TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); - SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); - - Mount_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDC_ADD: - Mount_OnAdd (hDlg); - break; - - case IDC_EDIT: - Mount_OnEdit (hDlg); - break; - - case IDC_REMOVE: - Mount_OnRemove (hDlg); - break; - - case IDC_LIST: - if (HIWORD(wp) == LBN_CLICKED) - Mount_OnCheck (hDlg); - else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL)) - Mount_OnSelect (hDlg); - break; - - case IDHELP: - Mount_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_DRIVES); - break; - } - return FALSE; -} - - -void Mount_OnInitDialog (HWND hDlg) -{ - int xTabStop = 250; - SendDlgItemMessage (hDlg, IDC_LIST, LB_SETTABSTOPS, 1, (LPARAM)&xTabStop); - - Mount_OnUpdate (hDlg, TRUE); -} - - -void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog) -{ - DRIVEMAPLIST List; - memset(&List, 0, sizeof(DRIVEMAPLIST)); - QueryDriveMapList (&List); - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDataSel = Mount_DriveFromItem (hDlg, iItemSel); - iItemSel = -1; - - if (fOnInitDialog && (iDataSel == -1)) - iDataSel = l.iDriveSelectLast; - - SendMessage (hList, WM_SETREDRAW, FALSE, 0); - SendMessage (hList, LB_RESETCONTENT, 0, 0); - - for (int iDrive = 0; iDrive < 26; ++iDrive) - { - if (!List.aDriveMap[ iDrive ].szMapping[0]) - continue; - - TCHAR szAfsPath[ MAX_PATH ]; - AdjustAfsPath (szAfsPath, List.aDriveMap[ iDrive ].szMapping, TRUE, FALSE); - - LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), List.aDriveMap[ iDrive ].chDrive, szAfsPath); - int iItem = SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz); - SendMessage (hList, LB_SETITEMDATA, iItem, List.aDriveMap[ iDrive ].fActive); - FreeString (psz); - - if (iDrive == iDataSel) - iItemSel = iItem; - } - - SendMessage (hList, WM_SETREDRAW, TRUE, 0); - SendMessage (hList, LB_SETCURSEL, iItemSel, 0); - - Mount_OnSelect (hDlg); - FreeDriveMapList (&List); -} - - -void Mount_OnSelect (HWND hDlg) -{ - BOOL fServiceRunning = IsServiceRunning(); - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDataSel = Mount_DriveFromItem (hDlg, iItemSel); - - l.iDriveSelectLast = iDataSel; - - EnableWindow (GetDlgItem (hDlg, IDC_ADD), fServiceRunning); - EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fServiceRunning && (iDataSel != -1)); - EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fServiceRunning && (iDataSel != -1)); -} - - -void Mount_OnCheck (HWND hDlg) -{ - DRIVEMAPLIST List; - QueryDriveMapList (&List); - - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel); - BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0); - - if (iDriveSel != -1) - { - DWORD dwStatus; - if (fChecked && List.aDriveMap[ iDriveSel ].szMapping[0] && !List.aDriveMap[ iDriveSel ].fActive) - { - if (!ActivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, List.aDriveMap[ iDriveSel ].szMapping, List.aDriveMap[ iDriveSel ].szSubmount, List.aDriveMap[ iDriveSel ].fPersistent, &dwStatus)) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus); - Mount_OnUpdate (hDlg); - } - else if (!fChecked && List.aDriveMap[ iDriveSel ].fActive) - { - if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus)) - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus); - Mount_OnUpdate (hDlg); - } - WriteActiveMap(List.aDriveMap[ iDriveSel ].chDrive, fChecked && List.aDriveMap[ iDriveSel ].fPersistent ); - } - - FreeDriveMapList (&List); -} - - -void Mount_OnRemove (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel); - - if (iDriveSel != -1) - { - DRIVEMAPLIST List; - QueryDriveMapList (&List); - - if (List.aDriveMap[ iDriveSel ].szMapping[0]) - { - if (List.aDriveMap[ iDriveSel ].fActive) - { - DWORD dwStatus; - if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus)) - { - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus); - return; - } - } - List.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0'); - WriteDriveMappings (&List); - - Mount_OnUpdate (hDlg); - } - WriteActiveMap(List.aDriveMap[ iDriveSel ].chDrive, FALSE ); - FreeDriveMapList (&List); - } -} - - -void Mount_OnAdd (HWND hDlg) -{ - Mount_AdjustMapping (hDlg, -1); -} - - -void Mount_OnEdit (HWND hDlg) -{ - HWND hList = GetDlgItem (hDlg, IDC_LIST); - int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0); - int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel); - - Mount_AdjustMapping (hDlg, iDriveSel); -} - - -void Mount_AdjustMapping (HWND hDlg, int iDrive) -{ - DRIVEMAPLIST List; - QueryDriveMapList (&List); - - DRIVEMAP DriveMapOrig; - memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP)); - - if (iDrive != -1) - { - memcpy (&DriveMapOrig, &List.aDriveMap[ iDrive ], sizeof(DRIVEMAP)); - } - - DRIVEMAP DriveMap; - memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP)); - - if (ModalDialogParam (IDD_MAPPING, hDlg, (DLGPROC)Mapping_DlgProc, (LPARAM)&DriveMap) == IDOK) - { - TCHAR szAfsPathOrig[ MAX_PATH ]; - if (iDrive != -1) - AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE); - - TCHAR szAfsPathNew[ MAX_PATH ]; - AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE); - - if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) || - (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) || - (DriveMapOrig.chDrive != DriveMap.chDrive) || - (DriveMapOrig.fPersistent != DriveMap.fPersistent) ) - { - DWORD dwStatus; - - if ((iDrive != -1) && (DriveMapOrig.fActive)) - { - if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus)) - { - Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus); - Mount_OnUpdate (hDlg); - return; - } - } - - if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus)) - { - Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus); - Mount_OnUpdate (hDlg); - return; - } - - if (DriveMap.szSubmount[0]) - { - TCHAR szSubmountNow[ MAX_PATH ]; - if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow)) - { - if (lstrcmpi (DriveMap.szSubmount, szSubmountNow)) - { - int idsTitle = (g.fIsWinNT) ? IDS_NEWSUB_TITLE : IDS_NEWSUB_TITLE_95; - Message (MB_OK | MB_ICONASTERISK, idsTitle, IDS_NEWSUB_DESC); - } - } - } - - if (iDrive != -1) - memset (&List.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP)); - memcpy (&List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP)); - lstrcpy (List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew); - WriteDriveMappings (&List); - - Mount_OnUpdate (hDlg); - } - } -} - - -int Mount_DriveFromItem (HWND hDlg, int iItem) -{ - TCHAR szItem[ 1024 ] = TEXT(""); - SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem); - - LPTSTR pch; - if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL) - { - if (pch > szItem) - { - pch--; - if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z'))) - return (*pch) - TEXT('A'); - } - } - - return -1; -} - - -BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - SetWindowLong (hDlg, DWL_USER, lp); - Mapping_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Mapping_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - - case IDC_MAP_PATH: - Mapping_OnEnable (hDlg); - break; - - case IDHELP: - Mapping_DlgProc (hDlg, WM_HELP, 0, 0); - break; - } - break; - - case WM_HELP: - WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_MAPDRIVE); - break; - } - return FALSE; -} - - -void Mapping_OnInitDialog (HWND hDlg) -{ - PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER); - - // Fill in the combo box - // - DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used - - if (pMap->chDrive != 0) - dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) ); - - int iItemSel = -1; - HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER); - SendMessage (hCombo, WM_SETREDRAW, FALSE, 0); - - for (int ii = 0; ii < 26; ++ii) - { - if (!(dwDrives & (1<chDrive && (ii == pMap->chDrive - chDRIVE_A)) - iItemSel = iItem; - else if ((!pMap->chDrive) && (iItemSel == -1)) - iItemSel = iItem; - } - } - - SendMessage (hCombo, WM_SETREDRAW, TRUE, 0); - SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0); - - TCHAR szMapping[ MAX_PATH ]; - AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE); - CHAR msg[256], msgf[256]; - if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0) - { - wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root); - SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf); - } - SetDlgItemText (hDlg, IDC_MAP_PATH, szMapping); - SetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount); - - CheckDlgButton (hDlg, IDC_MAP_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent)); - - Mapping_OnEnable (hDlg); -} - - -void Mapping_OnOK (HWND hDlg) -{ - PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER); - - int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0); - int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0); - - pMap->chDrive = chDRIVE_A + iDrive; - GetDlgItemText (hDlg, IDC_MAP_PATH, pMap->szMapping, MAX_PATH); - GetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount, MAX_PATH); - pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_MAP_PERSISTENT); - - if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount)) - { - int idsTitle = (g.fIsWinNT) ? IDS_BADSUB_TITLE : IDS_BADSUB_TITLE_95; - Message (MB_ICONHAND, idsTitle, IDS_BADSUB_DESC); - return; - } - - if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) && /*TEXT("/afs")*/ - (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) ) /*TEXT("\\afs")*/ - { - Message (MB_ICONHAND, IDS_BADMAP_TITLE, IDS_BADMAP_DESC); - return; - } - - WriteActiveMap(pMap->chDrive, pMap->fPersistent); - EndDialog (hDlg, IDOK); -} - - -void Mapping_OnEnable (HWND hDlg) -{ - TCHAR szPath[ MAX_PATH ]; - GetDlgItemText (hDlg, IDC_MAP_PATH, szPath, MAX_PATH); - EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0'))); -} - diff --git a/src/WINNT/client_creds/mounttab.h b/src/WINNT/client_creds/mounttab.h deleted file mode 100644 index 77bf50d6b..000000000 --- a/src/WINNT/client_creds/mounttab.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef MOUNTTAB_H -#define MOUNTTAB_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Mount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); - - -#endif - diff --git a/src/WINNT/client_creds/resource.h b/src/WINNT/client_creds/resource.h deleted file mode 100644 index 3a1aeef63..000000000 --- a/src/WINNT/client_creds/resource.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define IDS_TOOLTIP 0 -#define IDS_TOOLTIP_95 1 -#define IDS_CREDENTIALS 2 -#define IDS_UNKNOWN 3 -#define IDS_ADVANCED 4 -#define IDS_CREDS 5 -#define IDS_NO_CREDS 6 -#define IDS_SERVICE_BROKEN 7 -#define IDS_SERVICE_RUNNING 8 -#define IDS_SERVICE_STOPPED 9 -#define IDS_SERVICE_STOPPING 10 -#define IDS_SERVICE_STARTING 11 -#define IDS_SERVICE_UNKNOWN 12 -#define IDS_SERVICE_FAIL_STOP 13 -#define IDS_SERVICE_FAIL_START 14 -#define IDS_SERVICE_FAIL_CONFIG 15 -#define IDS_SERVICE_ERROR 16 -#define IDS_ERROR_TITLE 17 -#define IDS_ERROR_TITLE_95 18 -#define IDS_ERROR_DESTROY_95 19 -#define IDS_ERROR_DESTROY_NOCM 20 -#define IDS_ERROR_DESTROY_UNKNOWN 21 -#define IDS_ERROR_OBTAIN 22 -#define IDS_ERROR_OBTAIN_95 23 -#define IDS_TITLE_VERSION 24 -#define IDS_TITLE_VERSION_NOPATCH 25 -#define IDS_MOUNT_SOME 26 -#define IDS_MOUNT_NONE 27 -#define IDS_MOUNT 28 -#define IDS_WIZ_NEXT 29 -#define IDS_WIZ_FINISH 30 -#define IDS_MAP_LETTER 31 -#define IDS_DRIVE_MAP 32 -#define IDS_ERROR_MAP 33 -#define IDS_ERROR_MAP_DESC 34 -#define IDS_ERROR_UNMAP 35 -#define IDS_ERROR_UNMAP_DESC 36 -#define IDS_CELL_GATEWAY 37 -#define IDS_BADMAP_TITLE 38 -#define IDS_BADMAP_DESC 39 -#define IDS_UNCONFIG_TITLE_95 40 -#define IDS_UNCONFIG_DESC_95 41 -#define IDS_UNCONFIG_TITLE 42 -#define IDS_UNCONFIG_DESC 43 -#define IDS_NEWSUB_TITLE 44 -#define IDS_NEWSUB_TITLE_95 45 -#define IDS_NEWSUB_DESC 46 -#define IDS_BADSUB_TITLE 47 -#define IDS_BADSUB_TITLE_95 48 -#define IDS_BADSUB_DESC 49 -#define IDS_TITLE_95 50 - -#define IDI_MAIN 100 -#define IDD_MAIN 101 -#define IDD_TAB_CREDS 102 -#define IDD_TAB_NOCREDS 103 -#define MENU_TRAYICON 104 -#define IDD_TAB_ADVANCED 104 -#define IDI_CREDS_NO 105 -#define IDI_CREDS_SOME 106 -#define IDI_CREDS_YES 107 -#define IDD_NEWCREDS 108 -#define IDD_NEWCREDS_EXPIRE 109 -#define IDD_TAB_MOUNT 110 -#define IDD_WIZARD 111 -#define IDD_WIZ_START 112 -#define IDB_WIZ16 112 -#define IDD_WIZ_CREDS 113 -#define IDB_WIZ256 113 -#define IDD_WIZ_STARTING 114 -#define IDD_WIZ_MOUNT 115 -#define IDD_TERMINATE 116 -#define IDD_TERMINATE_SMALL 117 -#define IDD_WIZ_MOUNTING 118 -#define IDD_WIZ_FINISH 119 -#define IDD_MAPPING 120 -#define IDD_TERMINATE_SMALL_95 121 -#define IDD_AUTH 122 -#define M_TERMINATE 3000 -#define M_ACTIVATE 3001 -#define M_REMIND 3002 -#define M_TERMINATE_NOW 3003 -#define IDC_TITLE_AFS 5000 -#define IDC_TITLE_VERSION 5001 -#define IDC_TITLE_NT 5002 -#define IDC_TABS 5003 -#define IDC_CREDS_CELL 5004 -#define IDC_CREDS_INFO 5005 -#define IDC_CREDS_REMIND 5006 -#define IDC_CREDS_DESTROY 5007 -#define IDC_CREDS_OBTAIN 5008 -#define IDC_SERVICE_STATUS 5009 -#define IDC_SERVICE_AUTO 5011 -#define IDC_SERVICE_LOGIN 5012 -#define IDC_SERVICE_START 5013 -#define IDC_SERVICE_STOP 5014 -#define IDC_NEWCREDS_CELL 5014 -#define IDC_OPEN_CPL 5015 -#define IDC_NEWCREDS_USER 5015 -#define IDC_NEWCREDS_PASSWORD 5016 -#define IDC_NEWCREDS_TITLE 5017 -#define IDC_LIST 5019 -#define IDC_TITLE 5020 -#define IDC_REMOVE 5021 -#define IDC_EDIT 5022 -#define IDC_STARTUP 5022 -#define IDC_ADD 5023 -#define IDC_LHS 5024 -#define IDC_RHS 5025 -#define IDC_NOCREDS 5026 -#define IDC_YESCREDS 5027 -#define IDC_START_FAIL 5029 -#define IDC_START_TRY 5030 -#define IDC_NOMAP 5031 -#define IDNEXT 5032 -#define IDBACK 5034 -#define IDC_YESMAP 5035 -#define IDC_MAP_LETTER 5036 -#define IDC_MAP_PATH 5037 -#define IDC_LEAVE 5038 -#define IDC_MAP_DESC 5038 -#define IDC_STOP 5039 -#define IDC_MAP_FAIL 5045 -#define IDC_MAP_TRY 5046 -#define IDC_MAP_FINISH 5047 -#define IDC_MAP_PERSISTENT 5049 -#define IDC_RUNNING 5050 -#define IDC_STOPPED 5051 -#define IDC_STATICSUBMOUNT 5052 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 122 -#define _APS_NEXT_COMMAND_VALUE 3004 -#define _APS_NEXT_CONTROL_VALUE 5053 -#define _APS_NEXT_SYMED_VALUE 7000 -#endif -#endif - diff --git a/src/WINNT/client_creds/settings.cpp b/src/WINNT/client_creds/settings.cpp deleted file mode 100644 index dab6f1307..000000000 --- a/src/WINNT/client_creds/settings.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include "settings.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL RestoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVerExpected) -{ - BOOL rc = FALSE; - - size_t cbStored; - if ((cbStored = GetRegValueSize (hkParent, pszBase, pszValue)) != 0) - { - if (cbStored >= sizeof(WORD)+cbStructure) - { - PVOID pStructureFinal; - if ((pStructureFinal = Allocate (cbStored)) != NULL) - { - if (GetBinaryRegValue (hkParent, pszBase, pszValue, pStructureFinal, cbStored)) - { - WORD wVerStored = *(LPWORD)pStructureFinal; - - if ( (HIBYTE(wVerStored) == HIBYTE(wVerExpected)) && - (LOBYTE(wVerStored) >= LOBYTE(wVerExpected)) ) - { - memcpy (pStructure, &((LPBYTE)pStructureFinal)[ sizeof(WORD) ], cbStructure); - rc = TRUE; - } - } - - Free (pStructureFinal); - } - } - } - - return rc; -} - - -BOOL StoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVersion) -{ - BOOL rc = FALSE; - - PVOID pStructureFinal; - if ((pStructureFinal = Allocate (sizeof(WORD) + cbStructure)) != NULL) - { - *(LPWORD)pStructureFinal = wVersion; - memcpy (&((LPBYTE)pStructureFinal)[ sizeof(WORD) ], pStructure, cbStructure); - - rc = SetBinaryRegValue (hkParent, pszBase, pszValue, pStructureFinal, sizeof(WORD) + cbStructure); - - Free (pStructureFinal); - } - - return rc; -} - - -void EraseSettings (HKEY hkParent, LPCTSTR pszBase, LPCTSTR pszValue) -{ - HKEY hk; - if (RegOpenKey (hkParent, pszBase, &hk) == 0) - { - RegDeleteValue (hk, pszValue); - RegCloseKey (hk); - } -} - - -BOOL GetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData) -{ - BOOL rc = FALSE; - - HKEY hkFinal; - if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwType; - DWORD dwSize = (DWORD)cbData; - - if (RegQueryValueEx (hkFinal, pszValue, NULL, &dwType, (LPBYTE)pData, &dwSize) == ERROR_SUCCESS) - rc = TRUE; - - RegCloseKey (hk); - } - - return rc; -} - - -size_t GetRegValueSize (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue) -{ - size_t cb = 0; - - HKEY hkFinal; - if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwType; - DWORD dwSize = 0; - - if (RegQueryValueEx (hkFinal, pszValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS) - { - cb = (size_t)dwSize; - } - - RegCloseKey (hk); - } - - return cb; -} - - -BOOL SetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData) -{ - BOOL rc = FALSE; - - HKEY hkFinal; - if (RegCreateKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS) - { - DWORD dwSize = (DWORD)cbData; - - if (RegSetValueEx (hkFinal, pszValue, NULL, REG_BINARY, (LPBYTE)pData, dwSize) == ERROR_SUCCESS) - rc = TRUE; - - RegCloseKey (hk); - } - - return rc; -} - - -// Under Windows NT, RegDeleteKey() is not recursive--under Windows 95, -// it is. Sigh. This routine works recursively on either OS. -// -BOOL RegDeltreeKey (HKEY hk, LPTSTR pszKey) -{ - HKEY hkSub; - if (RegOpenKey (hk, pszKey, &hkSub) == 0) - { - TCHAR szFound[ MAX_PATH ]; - while (RegEnumKey (hkSub, 0, szFound, MAX_PATH) == 0) - { - if (!RegDeltreeKey (hkSub, szFound)) - { - RegCloseKey (hkSub); - return FALSE; - } - } - - RegCloseKey (hkSub); - } - - if (RegDeleteKey (hk, pszKey) != 0) - return FALSE; - - return TRUE; -} - diff --git a/src/WINNT/client_creds/settings.h b/src/WINNT/client_creds/settings.h deleted file mode 100644 index 68545cced..000000000 --- a/src/WINNT/client_creds/settings.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SETTINGS_H -#define SETTINGS_H - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#ifndef EXPORTED -#define EXPORTED -#endif - -#ifndef HKCR -#define HKCR HKEY_CLASSES_ROOT -#endif - -#ifndef HKCU -#define HKCU HKEY_CURRENT_USER -#endif - -#ifndef HKLM -#define HKLM HKEY_LOCAL_MACHINE -#endif - -#ifndef HIBYTE -#define HIBYTE(_w) (BYTE)(((_w) >> 8) & 0x00FF) -#endif - -#ifndef LOBYTE -#define LOBYTE(_w) (BYTE)((_w) & 0x00FF) -#endif - -#ifndef MAKEVERSION -#define MAKEVERSION(_h,_l) ( ((((WORD)(_h)) << 8) & 0xFF00) | (((WORD)(_l)) & 0xFF) ) -#endif - - - -/* - * PROTOTYPES _________________________________________________________________ - * - * Summary: - * - * Store/RestoreSettings() are pretty simple--they're just convenience - * wrappers for providing version-controlled storage of a structure in - * the registry. You provide the structure and supply a version number; - * when your program loads, call RestoreSettings() to see if you've saved - * anything previously. When your program exits, call StoreSettings() - * so you don't lose anything--effectively, you'll have global variables - * that won't change from one run of your program to the next. Again, - * this is really pretty elementary stuff, but I find I write it a lot - * so I stuck it in a common source file. - * - * - * About version numbers: - * - * Don't just pick them at random--there's actually an algorithm here. - * A typical version number is composed of two parts--a major and a - * minor component. Start with a version of 1.0, just for grins. - * Whenever you *add* something to the structure, increment the minor - * version--and make sure you add to the end of the structure. If you - * have to do anything else to the structure--get rid of an element, - * reorder things, change the size of an element--increment the major - * version number. - * - * Why? Because it provides backward compatibility. StoreSettings() - * always writes out the version number that you provide it... but - * RestoreSettings() is picky about what versions it will load: - * - * (1) Restore fails if the stored major version != the expected version - * (2) Restore fails if the stored minor version < the expected version - * - * Another way of looking at that is, - * - * (1) Restore succeeds only if the major versions are identical - * (2) Restore succeeds only if the stored version is higher or equal - * - * So if you run a 1.4 program and it tries to read a 1.7 level stored - * structure, it will succeed!! Why? Because a 1.4 structure is just - * like a 1.7 structure--only missing some stuff at the end, which - * RestoreSettings will just ignore (the 1.4 program didn't know about - * it anyway, and obviously did just fine without it). - * - * - * Examples: - * - * struct { - * RECT rWindow; - * TCHAR szLastDirectory[ MAX_PATH ]; - * TCHAR szUserName[ MAX_PATH ]; - * } globals_restored; - * - * #define wVerGLOBALS MAKEVERSION(1,0) // major version 1, minor version 0 - * - * #define cszPathGLOBALS TEXT("Software\\MyCompany\\MyProgram") - * #define cszValueGLOBALS TEXT("Settings") - * - * ... - * - * if (!RestoreSettings (HKLM, cszPathGLOBALS, cszValueGLOBALS, - * &globals_restored, sizeof(globals_restored), - * wVerGLOBALS)) - * { - * memset (&globals_restored, 0x00, sizeof(globals_restored)); - * lstrcpy (globals_restored.szUserName, TEXT("unknown")); - * // set any other default, first-time-run values here - * } - * - * ... - * - * StoreSettings (HKLM, cszPathGLOBALS, cszValueGLOBALS, - * &globals_restored, sizeof(globals_restored), - * wVerGLOBALS); - * - */ - -EXPORTED void EraseSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue); - -EXPORTED BOOL RestoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVerExpected); - -EXPORTED BOOL StoreSettings (HKEY hkParent, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pStructure, - size_t cbStructure, - WORD wVersion); - -EXPORTED size_t GetRegValueSize (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue); - -EXPORTED BOOL GetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData); - -EXPORTED BOOL SetBinaryRegValue (HKEY hk, - LPCTSTR pszBase, - LPCTSTR pszValue, - PVOID pData, - size_t cbData); - -EXPORTED BOOL RegDeltreeKey (HKEY hk, LPTSTR pszKey); - - -#endif - diff --git a/src/WINNT/client_creds/shortcut.cpp b/src/WINNT/client_creds/shortcut.cpp deleted file mode 100644 index 298f94933..000000000 --- a/src/WINNT/client_creds/shortcut.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#undef INITGUID -#include -#include -#include -#include -#include "afscreds.h" -#include "shortcut.h" - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void Shortcut_Init (void) -{ - CoInitialize(0); -} - - -void Shortcut_Exit (void) -{ - CoUninitialize(); -} - -BOOL Shortcut_Create (LPTSTR pszTarget, LPCTSTR pszSource, LPTSTR pszDesc, LPTSTR pszArgs) -{ - IShellLink *psl; - HRESULT rc = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl); - if (SUCCEEDED (rc)) - { - IPersistFile *ppf; - rc = psl->QueryInterface (IID_IPersistFile, (void **)&ppf); - if (SUCCEEDED (rc)) - { - rc = psl->SetPath (pszSource); - if (SUCCEEDED (rc)) - { - rc = psl->SetDescription (pszDesc ? pszDesc : pszSource); - if (SUCCEEDED (rc)) - { - if ( pszArgs ) - rc = psl->SetArguments (pszArgs); - if (SUCCEEDED (rc)) - { -#ifdef UNICODE - rc = ppf->Save (pszTarget, TRUE); -#else - WORD wsz[ MAX_PATH ]; - MultiByteToWideChar (CP_ACP, 0, pszTarget, -1, wsz, MAX_PATH); - rc = ppf->Save (wsz, TRUE); -#endif - } - } - } - ppf->Release (); - } - psl->Release (); - } - return SUCCEEDED(rc) ? TRUE : FALSE; -} - - -void Shortcut_FixStartup (LPCTSTR pszLinkName, BOOL fAutoStart) -{ - TCHAR szShortcut[ MAX_PATH + 10 ] = TEXT(""); - - HKEY hk; - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), &hk) == 0) - { - DWORD dwSize = sizeof(szShortcut); - DWORD dwType = REG_SZ; - RegQueryValueEx (hk, TEXT("Common Startup"), NULL, &dwType, (LPBYTE)szShortcut, &dwSize); - if (szShortcut[0] == TEXT('\0')) - { - dwSize = sizeof(szShortcut); - dwType = REG_SZ; - RegQueryValueEx (hk, TEXT("Startup"), NULL, &dwType, (LPBYTE)szShortcut, &dwSize); - } - RegCloseKey (hk); - } - if (szShortcut[0] == TEXT('\0')) - { - GetWindowsDirectory (szShortcut, MAX_PATH); - lstrcat (szShortcut, TEXT("\\Start Menu\\Programs\\Startup")); - } - lstrcat (szShortcut, TEXT("\\")); - lstrcat (szShortcut, pszLinkName); - - TCHAR szSource[ MAX_PATH ]; - GetModuleFileName (GetModuleHandle(NULL), szSource, MAX_PATH); - - if (fAutoStart) - { - DWORD code, len, type; - TCHAR szParams[ 64 ] = TEXT(AFSCREDS_SHORTCUT_OPTIONS); - - code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &hk); - if (code == ERROR_SUCCESS) { - len = sizeof(szParams); - type = REG_SZ; - code = RegQueryValueEx(hk, "AfscredsShortcutParams", NULL, &type, - (BYTE *) &szParams, &len); - RegCloseKey (hk); - } - if (code != ERROR_SUCCESS) { - code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, - 0, KEY_QUERY_VALUE, &hk); - if (code == ERROR_SUCCESS) { - len = sizeof(szParams); - type = REG_SZ; - code = RegQueryValueEx(hk, "AfscredsShortcutParams", NULL, &type, - (BYTE *) &szParams, &len); - RegCloseKey (hk); - } - } - Shortcut_Create (szShortcut, szSource, "Autostart Authentication Agent", szParams); - } - else // (!g.fAutoStart) - { - DeleteFile (szShortcut); - } -} - diff --git a/src/WINNT/client_creds/shortcut.h b/src/WINNT/client_creds/shortcut.h deleted file mode 100644 index ae82d5de9..000000000 --- a/src/WINNT/client_creds/shortcut.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef SHORTCUT_H -#define SHORTCUT_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Shortcut_Init (void); -void Shortcut_Exit (void); -BOOL Shortcut_Create (LPTSTR pszTarget, LPCTSTR pszSource, LPTSTR pszDesc = NULL, LPTSTR pszArgs = NULL); -void Shortcut_FixStartup (LPCTSTR pszLinkName, BOOL fAutoStart); - - -#endif - diff --git a/src/WINNT/client_creds/trayicon.cpp b/src/WINNT/client_creds/trayicon.cpp deleted file mode 100644 index c07a846c6..000000000 --- a/src/WINNT/client_creds/trayicon.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "afscreds.h" - - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -void ChangeTrayIcon (int nim) -{ - static BOOL fAdded = FALSE; - static BOOL fDeleted = FALSE; - if ((nim == NIM_MODIFY) && (!fAdded)) - nim = NIM_ADD; - if ((nim == NIM_MODIFY) && (fDeleted)) - return; - - if ((nim != NIM_DELETE) || (IsWindow (g.hMain))) - { - static HICON ICON_CREDS_YES = TaLocale_LoadIcon (IDI_CREDS_YES); - static HICON ICON_CREDS_NO = TaLocale_LoadIcon (IDI_CREDS_NO); - - size_t iExpired = Main_FindExpiredCreds(); - - NOTIFYICONDATA nid; - memset (&nid, 0x00, sizeof(NOTIFYICONDATA)); - nid.cbSize = sizeof(NOTIFYICONDATA); - nid.hWnd = g.hMain; - nid.uID = 0; - nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; - nid.uCallbackMessage = WM_TRAYICON; - lock_ObtainMutex(&g.credsLock); - nid.hIcon = ((g.cCreds != 0) && (iExpired == (size_t)-1)) ? ICON_CREDS_YES : ICON_CREDS_NO; - lock_ReleaseMutex(&g.credsLock); - GetString (nid.szTip, (g.fIsWinNT) ? IDS_TOOLTIP : IDS_TOOLTIP_95); - Shell_NotifyIcon (nim, &nid); - } - - if (nim == NIM_ADD) - fAdded = TRUE; - if (nim == NIM_DELETE) - fDeleted = TRUE; -} - diff --git a/src/WINNT/client_creds/trayicon.h b/src/WINNT/client_creds/trayicon.h deleted file mode 100644 index 7b426e4dd..000000000 --- a/src/WINNT/client_creds/trayicon.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef TRAYICON_H -#define TRAYICON_H - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void ChangeTrayIcon (int nim); // NIM_ADD, NIM_MODIFY, NIM_DELETE - - -#endif - diff --git a/src/WINNT/client_creds/window.cpp b/src/WINNT/client_creds/window.cpp deleted file mode 100644 index 9675fcdc5..000000000 --- a/src/WINNT/client_creds/window.cpp +++ /dev/null @@ -1,756 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -#include -#include "ipaddrchg.h" -} - -#include "afscreds.h" - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define ID_REMIND_TIMER 1000 -#define ID_SERVICE_TIMER 1001 - -#define cREALLOC_TABS 4 - -#define dwTABPARAM_MOUNT (LPTSTR)0 -#define dwTABPARAM_ADVANCED (LPTSTR)1 -#define ISCELLTAB(_psz) ((HIWORD((LONG)(_psz))) != 0) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -void Main_OnInitDialog (HWND hDlg); -void Main_OnCheckMenuRemind (void); -void Main_OnRemindTimer (void); -void Main_OnMouseOver (void); -void Main_OnSelectTab (void); -void Main_OnCheckTerminate (void); -HWND Main_CreateTabDialog (HWND hTab, size_t iTab); - -BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp); -void Terminate_OnInitDialog (HWND hDlg); -void Terminate_OnOK (HWND hDlg); - - -/* - * ROUTINES ___________________________________________________________________ - * - */ - -BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - static UINT msgCheckTerminate = 0; - if (msgCheckTerminate == 0) - msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate")); - - if (msg == msgCheckTerminate) - { - Main_OnCheckTerminate(); - } - else switch (msg) - { - case WM_INITDIALOG: - g.hMain = hDlg; - Main_OnInitDialog (hDlg); - break; - - case WM_DESTROY: - Creds_CloseLibraries(); - ChangeTrayIcon (NIM_DELETE); - break; - - case WM_ACTIVATEAPP: - if (wp) - { - Main_RepopulateTabs (FALSE); - } - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - case IDCANCEL: - Main_Show (FALSE); - break; - - case M_ACTIVATE: - if (g.fIsWinNT || IsServiceRunning()) - { - if (!lp) // Got here from "/show" parameter? switch tabs. - { - HWND hTab = GetDlgItem (g.hMain, IDC_TABS); - TabCtrl_SetCurSel (hTab, 0); - Main_OnSelectTab(); - } - Main_Show (TRUE); - } - else - { - Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); - } - break; - - case M_TERMINATE: - if (g.fIsWinNT && IsServiceRunning()) - ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc); - else if (g.fIsWinNT) - ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc); - else // (!g.fIsWinNT) - ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc); - break; - - case M_TERMINATE_NOW: - Quit(); - break; - - case M_REMIND: - Main_OnCheckMenuRemind(); - break; - } - break; - - case WM_TIMER: - Main_OnRemindTimer(); - break; - - case WM_NOTIFY: - switch (((NMHDR*)lp)->code) - { - case TCN_SELCHANGE: - Main_OnSelectTab(); - break; - } - break; - - case WM_TRAYICON: - switch (lp) - { - case WM_LBUTTONDOWN: - if (IsServiceRunning() || !IsServiceConfigured()) - Main_Show (TRUE); - else if (!g.fIsWinNT) - Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); - else - ShowStartupWizard(); - break; - - case WM_RBUTTONDOWN: - HMENU hm; - if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0) - { - POINT pt; - GetCursorPos(&pt); - - HMENU hmDummy = CreateMenu(); - InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL); - - BOOL fRemind = FALSE; - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (g.aCreds[ iCreds ].fRemind) - fRemind = TRUE; - } - lock_ReleaseMutex(&g.credsLock); - CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED)); - - TrackPopupMenu (GetSubMenu (hmDummy, 0), - TPM_RIGHTALIGN | TPM_RIGHTBUTTON, - pt.x, pt.y, NULL, hDlg, NULL); - - DestroyMenu (hmDummy); - } - break; - - case WM_MOUSEMOVE: - Main_OnMouseOver(); - break; - } - break; - case WM_OBTAIN_TOKENS: - if ( InterlockedIncrement (&g.fShowingMessage) != 1 ) - InterlockedDecrement (&g.fShowingMessage); - else - ShowObtainCreds (wp, (char *)lp); - GlobalFree((void *)lp); - break; - - case WM_START_SERVICE: - { - SC_HANDLE hManager; - if ((hManager = OpenSCManager ( NULL, NULL, - SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService ( hManager, TEXT("TransarcAFSDaemon"), - SERVICE_QUERY_STATUS | SERVICE_START)) != NULL) - { - if (StartService (hService, 0, 0)) - TestAndDoMapShare(SERVICE_START_PENDING); - if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) { -#ifdef USE_MS2MIT - KFW_import_windows_lsa(); -#endif /* USE_MS2MIT */ - KFW_AFS_renew_tokens_for_all_cells(); - } - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - KFW_AFS_wait_for_service_start(); - ObtainTokensFromUserIfNeeded(g.hMain); - } - break; - } - - return FALSE; -} - - -void Main_Show (BOOL fShow) -{ - if (fShow) - { - ShowWindow (g.hMain, SW_SHOW); - SetWindowPos (g.hMain, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - SetForegroundWindow (g.hMain); - } - else - { - SetWindowPos (g.hMain, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); - } -} - - -void Main_OnInitDialog (HWND hDlg) -{ - if (!g.fIsWinNT) - { - TCHAR szTitle[256]; - GetString (szTitle, IDS_TITLE_95); - SetWindowText (hDlg, szTitle); - } - - TCHAR szVersion[256]; - DWORD dwPatch = 0; - TCHAR szUser[256]; - GetString (szVersion, IDS_UNKNOWN); - GetString (szUser, IDS_UNKNOWN); - - HKEY hk; - if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_SW_VERSION_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(szVersion); - DWORD dwType = REG_SZ; - RegQueryValueEx (hk, REGVAL_AFS_VERSION, NULL, &dwType, (PBYTE)szVersion, &dwSize); - - dwSize = sizeof(dwPatch); - dwType = REG_DWORD; - RegQueryValueEx (hk, REGVAL_AFS_PATCH, NULL, &dwType, (PBYTE)&dwPatch, &dwSize); - RegCloseKey (hk); - } - - /* We should probably be using GetUserNameEx() for this */ - BOOL fFoundUserName = FALSE; - if (RegOpenKey (HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hk) == 0) - { - DWORD dwSize = sizeof(szUser); - DWORD dwType = REG_SZ; - if (RegQueryValueEx (hk, TEXT("Logon User Name"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0) - fFoundUserName = TRUE; - RegCloseKey (hk); - } - if (!fFoundUserName ) - { - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Explorer"), &hk) == 0) - { - DWORD dwSize = sizeof(szUser); - DWORD dwType = REG_SZ; - if (RegQueryValueEx (hk, TEXT("Logon User Name"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0) - fFoundUserName = TRUE; - RegCloseKey (hk); - } - } - if (!fFoundUserName ) - { - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0) - { - DWORD dwSize = sizeof(szUser); - DWORD dwType = REG_SZ; - if (RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0) - fFoundUserName = TRUE; - RegCloseKey (hk); - } - } - if (!fFoundUserName) - { - if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Network\\Logon"), &hk) == 0) - { - DWORD dwSize = sizeof(szUser); - DWORD dwType = REG_SZ; - if (RegQueryValueEx (hk, TEXT("UserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0) - fFoundUserName = TRUE; - RegCloseKey (hk); - } - } - - TCHAR szSource[ cchRESOURCE ]; - TCHAR szTarget[ cchRESOURCE ]; - - GetString (szSource, (dwPatch) ? IDS_TITLE_VERSION : IDS_TITLE_VERSION_NOPATCH); - wsprintf (szTarget, szSource, szVersion, dwPatch); - SetDlgItemText (hDlg, IDC_TITLE_VERSION, szTarget); - - GetDlgItemText (hDlg, IDC_TITLE_NT, szSource, cchRESOURCE); - wsprintf (szTarget, szSource, szUser); - SetDlgItemText (hDlg, IDC_TITLE_NT, szTarget); -} - - -void Main_OnCheckMenuRemind (void) -{ - BOOL fRemind = FALSE; - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (g.aCreds[ iCreds ].fRemind) - fRemind = TRUE; - } - - fRemind = !fRemind; - for (iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (g.aCreds[ iCreds ].fRemind != fRemind) - { - g.aCreds[ iCreds ].fRemind = fRemind; - SaveRemind (iCreds); - } - } - lock_ReleaseMutex(&g.credsLock); - - // Check the active tab, and fix its checkbox if necessary - // - HWND hTab = GetDlgItem (g.hMain, IDC_TABS); - LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab)); - if (ISCELLTAB(pszTab) && (*pszTab)) - { - HWND hDlg = GetTabChild (hTab); - if (hDlg) - CheckDlgButton (hDlg, IDC_CREDS_REMIND, fRemind); - } - - // Make sure the reminder timer is going - // - Main_EnableRemindTimer (fRemind); -} - - -void Main_OnRemindTimer (void) -{ - Main_RepopulateTabs (TRUE); - - // See if anything is close to expiring; if so, display a warning - // dialog. Make sure we never display a warning more than once. - // - size_t iExpired; - if ((iExpired = Main_FindExpiredCreds()) != -1) - { - if (InterlockedIncrement (&g.fShowingMessage) != 1) - InterlockedDecrement (&g.fShowingMessage); - else - ShowObtainCreds (TRUE, g.aCreds[ iExpired ].szCell); - } -} - - -void Main_OnMouseOver (void) -{ - if ((GetTickCount() - g.tickLastRetest) > cmsecMOUSEOVER) - { - Main_RepopulateTabs (TRUE); - } -} - - -void Main_OnSelectTab (void) -{ - HWND hTab = GetDlgItem (g.hMain, IDC_TABS); - size_t iTab = TabCtrl_GetCurSel (hTab); - - HWND hDlgOld = GetTabChild (hTab); - - HWND hDlgNew; - if ((hDlgNew = Main_CreateTabDialog (hTab, iTab)) != NULL) - ShowWindow (hDlgNew, SW_SHOW); - - if (hDlgOld) - DestroyWindow (hDlgOld); -} - - -void Main_OnCheckTerminate (void) -{ - HKEY hk; - - if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); - RegCloseKey (hk); - } - else if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); - RegCloseKey (hk); - } - - Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); - - if (!g.fStartup) - Quit(); -} - - -HWND Main_CreateTabDialog (HWND hTab, size_t iTab) -{ - HWND hDlg = NULL; - LPTSTR psz = NULL; - - TC_ITEM Item; - memset (&Item, 0x00, sizeof(Item)); - Item.mask = TCIF_PARAM; - if (TabCtrl_GetItem (hTab, iTab, &Item)) - { - psz = (LPTSTR)(Item.lParam); - } - - if (psz == dwTABPARAM_ADVANCED) // Advanced tab - { - hDlg = ModelessDialog (IDD_TAB_ADVANCED, hTab, (DLGPROC)Advanced_DlgProc); - } - else if (psz == dwTABPARAM_MOUNT) // Mount Points tab - { - hDlg = ModelessDialog (IDD_TAB_MOUNT, hTab, (DLGPROC)Mount_DlgProc); - } - else if (ISCELLTAB(psz) && !*psz) // No Creds tab - { - hDlg = ModelessDialogParam (IDD_TAB_NOCREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz); - } - else if (ISCELLTAB(psz) && *psz) // Creds tab for a particular cell - { - hDlg = ModelessDialogParam (IDD_TAB_CREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz); - } - - return hDlg; -} - - -void Main_RepopulateTabs (BOOL fDestroyInvalid) -{ - static BOOL fInHere = FALSE; - if (!fInHere) - { - fInHere = TRUE; - - if (IsWindowVisible (g.hMain)) - fDestroyInvalid = FALSE; - - // First we'll have to look around and see what credentials we currently - // have. This call just updates g.aCreds[]; it doesn't do anything else. - // - (void)GetCurrentCredentials(); - - // We want one tab on the main dialog for each g.aCredentials entry, - // and one tab for Advanced. - // - HWND hTab = GetDlgItem (g.hMain, IDC_TABS); - - // Generate a list of the lParams we'll be giving tabs... - // - LPTSTR *aTabs = NULL; - size_t cTabs = 0; - size_t iTabOut = 0; - - size_t nCreds = 0; - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (g.aCreds[ iCreds ].szCell[0]) - ++nCreds; - } - if (!nCreds) - { - fDestroyInvalid = TRUE; - } - - if (!fDestroyInvalid) - { - int nTabs = TabCtrl_GetItemCount(hTab); - for (int iTab = 0; iTab < nTabs; ++iTab) - { - LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab); - if (ISCELLTAB(pszTab) && (*pszTab)) - { - if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS)) - aTabs[ iTabOut++ ] = CloneString(pszTab); - } - } - } - - if (nCreds == 0) - { - if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS)) - aTabs[ iTabOut++ ] = CloneString (TEXT("")); - } - else for (iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (g.aCreds[ iCreds ].szCell[0]) - { - for (size_t ii = 0; ii < iTabOut; ++ii) - { - if (!ISCELLTAB (aTabs[ii])) - continue; - if (!lstrcmpi (g.aCreds[ iCreds ].szCell, aTabs[ ii ])) - break; - } - if (ii == iTabOut) - { - if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS)) - aTabs[ iTabOut++ ] = CloneString (g.aCreds[ iCreds ].szCell); - } - } - } - lock_ReleaseMutex(&g.credsLock); - - if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS)) - aTabs[ iTabOut++ ] = dwTABPARAM_MOUNT; - - if (g.fIsWinNT) - { - if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS)) - aTabs[ iTabOut++ ] = dwTABPARAM_ADVANCED; - } - - // Now erase the current tabs, and re-add new ones. Remember which tab is - // currently selected, so we can try to go back to it later. - // - int iTabSel = 0; - if (TabCtrl_GetItemCount(hTab)) - { - LPTSTR pszTabSel = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab)); - for (size_t iSel = 0; iSel < iTabOut; ++iSel) - { - if ((!ISCELLTAB(pszTabSel)) && (!ISCELLTAB(aTabs[iSel])) && (pszTabSel == aTabs[iSel])) - iTabSel = iSel; - else if (ISCELLTAB(pszTabSel) && ISCELLTAB(aTabs[iSel]) && !lstrcmpi (pszTabSel, aTabs[iSel])) - iTabSel = iSel; - } - } - - int nTabs = TabCtrl_GetItemCount(hTab); - for (int iTab = 0; iTab < nTabs; ++iTab) - { - LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab); - if (ISCELLTAB(pszTab)) - FreeString (pszTab); - } - TabCtrl_DeleteAllItems (hTab); - - for (size_t ii = 0; ii < iTabOut; ++ii) - { - TCHAR szTitle[cchRESOURCE]; - if (aTabs[ii] == dwTABPARAM_ADVANCED) - GetString (szTitle, IDS_ADVANCED); - else if (aTabs[ii] == dwTABPARAM_MOUNT) - GetString (szTitle, IDS_MOUNT); - else if ((nCreds <= 1) || (aTabs[ii][0] == TEXT('\0'))) - GetString (szTitle, IDS_CREDENTIALS); - else - lstrcpy (szTitle, aTabs[ii]); - - TC_ITEM Item; - memset (&Item, 0x00, sizeof(Item)); - Item.mask = TCIF_PARAM | TCIF_TEXT; - Item.pszText = szTitle; - Item.cchTextMax = cchRESOURCE; - Item.lParam = (LPARAM)(aTabs[ii]); - - TabCtrl_InsertItem (hTab, ii, &Item); - } - - if (aTabs != NULL) - Free (aTabs); - - TabCtrl_SetCurSel (hTab, iTabSel); - Main_OnSelectTab (); - - fInHere = FALSE; - } -} - - -void Main_EnableRemindTimer (BOOL fEnable) -{ - static BOOL bEnabled = FALSE; - - if ( fEnable == FALSE && bEnabled == TRUE ) { - KillTimer (g.hMain, ID_REMIND_TIMER); - bEnabled = FALSE; - } else if ( fEnable == TRUE && bEnabled == FALSE ) { - SetTimer (g.hMain, ID_REMIND_TIMER, (ULONG)cmsec1MINUTE * cminREMIND_TEST, NULL); - bEnabled = TRUE; - } -} - - -size_t Main_FindExpiredCreds (void) -{ - size_t retval = (size_t) -1; - lock_ObtainMutex(&g.expirationCheckLock); - if ( KFW_is_available() ) - KFW_AFS_renew_expiring_tokens(); - lock_ObtainMutex(&g.credsLock); - for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) - { - if (!g.aCreds[ iCreds ].szCell[0]) - continue; - if (!g.aCreds[ iCreds ].fRemind) - continue; - - SYSTEMTIME stNow; - GetLocalTime (&stNow); - - FILETIME ftNow; - SystemTimeToFileTime (&stNow, &ftNow); - - FILETIME ftExpires; - SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftExpires); - - LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime); - LONGLONG llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime); - - llNow /= c100ns1SECOND; - llExpires /= c100ns1SECOND; - - if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE)) - { - if ( KFW_is_available() && - KFW_AFS_renew_token_for_cell(g.aCreds[ iCreds ].szCell) ) - continue; - retval = (size_t) iCreds; - break; - } - } - - lock_ReleaseMutex(&g.credsLock); - lock_ReleaseMutex(&g.expirationCheckLock); - - return retval; -} - - -BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_INITDIALOG: - Terminate_OnInitDialog (hDlg); - break; - - case WM_COMMAND: - switch (LOWORD(wp)) - { - case IDOK: - Terminate_OnOK (hDlg); - break; - - case IDCANCEL: - EndDialog (hDlg, IDCANCEL); - break; - } - break; - } - - return FALSE; -} - - -void Terminate_OnInitDialog (HWND hDlg) -{ - BOOL fPersistent = IsServicePersistent(); - - CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup); - CheckDlgButton (hDlg, IDC_LEAVE, fPersistent); - CheckDlgButton (hDlg, IDC_STOP, !fPersistent); -} - - -void Terminate_OnOK (HWND hDlg) -{ - if (IsServiceRunning()) - { - if (IsDlgButtonChecked (hDlg, IDC_STOP)) - { - SC_HANDLE hManager; - if ((hManager = OpenSCManager (NULL, NULL, - SC_MANAGER_CONNECT | - SC_MANAGER_ENUMERATE_SERVICE | - SC_MANAGER_QUERY_LOCK_STATUS)) != NULL) - { - SC_HANDLE hService; - if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), - SERVICE_QUERY_STATUS | SERVICE_START)) != NULL) - { - SERVICE_STATUS Status; - ControlService (hService, SERVICE_CONTROL_STOP, &Status); - - CloseServiceHandle (hService); - } - - CloseServiceHandle (hManager); - } - } - } - - g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP); - - HKEY hk; - if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0) - { - DWORD dwSize = sizeof(g.fStartup); - DWORD dwType = REG_DWORD; - RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize); - RegCloseKey (hk); - } - - Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); - - Quit(); - EndDialog (hDlg, IDOK); -} - diff --git a/src/WINNT/client_creds/window.h b/src/WINNT/client_creds/window.h deleted file mode 100644 index cf8420e15..000000000 --- a/src/WINNT/client_creds/window.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef WINDOW_H -#define WINDOW_H - - -/* - * DEFINITIONS ________________________________________________________________ - * - */ - -#define WM_TRAYICON (WM_USER+100) - - -/* - * PROTOTYPES _________________________________________________________________ - * - */ - -BOOL CALLBACK Main_DlgProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); - -void Main_RepopulateTabs (BOOL fDestroyInvalid); -void Main_EnableRemindTimer (BOOL fEnable); -void Main_Show (BOOL fShow); -size_t Main_FindExpiredCreds (void); - - -#endif - diff --git a/src/WINNT/client_creds/wiz16.bmp b/src/WINNT/client_creds/wiz16.bmp deleted file mode 100644 index e5cdaa021964778d06a1a67e9600f7a799485bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22798 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 biC1N`c3uA|?rVU#ul@W#gT4m;|FQl*8|^o@ diff --git a/src/WINNT/client_creds/wiz256.bmp b/src/WINNT/client_creds/wiz256.bmp deleted file mode 100644 index 2529353a420373b428258bc2f8cc348088f8f1cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46438 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 AhX4Qo diff --git a/src/WINNT/client_exp/NTMakefile b/src/WINNT/client_exp/NTMakefile deleted file mode 100644 index ebfc7b689..000000000 --- a/src/WINNT/client_exp/NTMakefile +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -I..\afsd /D"_WINDOWS" /D"_WINDLL" /D"_AFXDLL" /D"_USRDLL" - -NO_CRTDBG=1 #define this to disable any CRT_DBG flag -RELDIR=WINNT\client_exp -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!include ..\..\config\NTMakefile.version - -############################################################################ -# afs_shl_ext.dll - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afs_shl_ext.dll - -DLLOBJS =\ - $(OUT)\add_acl_entry_dlg.obj \ - $(OUT)\add_submount_dlg.obj \ - $(OUT)\afs_shl_ext.obj \ - $(OUT)\afs_shl_ext_stub.res \ - $(OUT)\auth_dlg.obj \ - $(OUT)\clear_acl_dlg.obj \ - $(OUT)\copy_acl_dlg.obj \ - $(OUT)\down_servers_dlg.obj \ - $(OUT)\fs_utils.obj \ - $(OUT)\gui2fs.obj \ - $(OUT)\help.obj \ - $(OUT)\klog_dlg.obj \ - $(OUT)\make_mount_point_dlg.obj \ - $(OUT)\mount_points_dlg.obj \ - $(OUT)\msgs.obj \ - $(OUT)\partition_info_dlg.obj \ - $(OUT)\results_dlg.obj \ - $(OUT)\server_status_dlg.obj \ - $(OUT)\set_afs_acl.obj \ - $(OUT)\shell_ext.obj \ - $(OUT)\stdafx.obj \ - $(OUT)\submount_info.obj \ - $(OUT)\submounts_dlg.obj \ - $(OUT)\unlog_dlg.obj \ - $(OUT)\volumeinfo.obj \ - $(OUT)\make_symbolic_link_dlg.obj \ - $(OUT)\AFS_component_version_number.obj - -AFSD = ..\afsd - -$(OUT)\fs_utils.obj: $(AFSD)\fs_utils.c - $(C2OBJ) $** - -DLLSDKLIBS =\ - mpr.lib - -DLLLIBS =\ - $(DESTDIR)\lib\afsrpc.lib \ - $(DESTDIR)\lib\afsauthent.lib \ - $(DESTDIR)\lib\libafsconf.lib \ - $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\afs\TaLocale.lib \ - $(DESTDIR)\lib\afs\afsutil.lib - -$(DLLFILE): $(DLLOBJS) $(DLLLIBS) - $(DLLCONLINK) /DEF:afs_shl_ext.def $(DLLSDKLIBS) - $(DLLPREP) - -############################################################################ -# Definitions for generating versioninfo resources - -$(OUT)\afs_shl_ext_stub.res: AFS_component_version_number.h - -############################################################################ -# Install target; primary makefile target - -install: $(DLLFILE) lang -install9x: install - - -############################################################################ -# Language target - -lang:: en_US ja_JP ko_KR zh_TW zh_CN pt_BR es_ES de_DE - -en_US: - $(CD) lang - $(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -ja_JP: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -ko_KR: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -zh_CN: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -zh_TW: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -pt_BR: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -es_ES: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - -de_DE: - $(CD) lang - @$(NTLANG) $@ $(MAKECMD) /nologo /f NTMakefile install - $(CD) .. - - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - $(CD) lang - if exist $(NTLANG) $(NTLANG) en_US $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) ja_JP $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) ko_KR $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) zh_CN $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) zh_TW $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) pt_BR $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) es_ES $(MAKECMD) /nologo /f NTMakefile clean - if exist $(NTLANG) $(NTLANG) de_DE $(MAKECMD) /nologo /f NTMakefile clean - $(CD) .. - -mkdir: - -mkdir $(OUT)\lang - cd lang - nmake /nologo /f ntmakefile SRC=$(SRC) OBJ=$(OBJ) mkdir - cd .. diff --git a/src/WINNT/client_exp/add_acl_entry_dlg.cpp b/src/WINNT/client_exp/add_acl_entry_dlg.cpp deleted file mode 100644 index 37ff78a1a..000000000 --- a/src/WINNT/client_exp/add_acl_entry_dlg.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "add_acl_entry_dlg.h" -#include "set_afs_acl.h" -#include "msgs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAddAclEntryDlg dialog - - -CAddAclEntryDlg::CAddAclEntryDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CAddAclEntryDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CAddAclEntryDlg) - //}}AFX_DATA_INIT - - m_pAclSetDlg = 0; -} - - -void CAddAclEntryDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAddAclEntryDlg) - DDX_Control(pDX, IDOK, m_Ok); - DDX_Control(pDX, IDC_NAME, m_Name); - DDX_Control(pDX, IDC_ADD_NORMAL_ENTRY, m_NormalEntry); - DDX_Control(pDX, IDC_LOOKUP2, m_LookupPerm); - DDX_Control(pDX, IDC_LOCK2, m_LockPerm); - DDX_Control(pDX, IDC_WRITE, m_WritePerm); - DDX_Control(pDX, IDC_ADMINISTER, m_AdminPerm); - DDX_Control(pDX, IDC_READ, m_ReadPerm); - DDX_Control(pDX, IDC_INSERT, m_InsertPerm); - DDX_Control(pDX, IDC_DELETE, m_DeletePerm); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CAddAclEntryDlg, CDialog) - //{{AFX_MSG_MAP(CAddAclEntryDlg) - ON_BN_CLICKED(IDC_ADD_NEGATIVE_ENTRY, OnAddNegativeEntry) - ON_BN_CLICKED(IDC_ADD_NORMAL_ENTRY, OnAddNormalEntry) - ON_EN_CHANGE(IDC_NAME, OnChangeName) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CAddAclEntryDlg message handlers - -void CAddAclEntryDlg::OnAddNegativeEntry() -{ - m_bNormal = FALSE; -} - -void CAddAclEntryDlg::OnAddNormalEntry() -{ - m_bNormal = TRUE; -} - -BOOL CAddAclEntryDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - ASSERT_VALID(m_pAclSetDlg); - - m_NormalEntry.SetCheck(CHECKED); - m_Ok.EnableWindow(FALSE); - - m_Name.SetFocus(); - - m_bNormal = TRUE; - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -CString CAddAclEntryDlg::MakePermString() -{ - CString str; - - if (m_ReadPerm.GetCheck() == CHECKED) - str += "r"; - if (m_LookupPerm.GetCheck() == CHECKED) - str += "l"; - if (m_InsertPerm.GetCheck() == CHECKED) - str += "i"; - if (m_DeletePerm.GetCheck() == CHECKED) - str += "d"; - if (m_WritePerm.GetCheck() == CHECKED) - str += "w"; - if (m_LockPerm.GetCheck() == CHECKED) - str += "k"; - if (m_AdminPerm.GetCheck() == CHECKED) - str += "a"; - - return str; -} - -void CAddAclEntryDlg::OnOK() -{ - m_Rights = MakePermString(); - m_Name.GetWindowText(m_strName); - - if (m_pAclSetDlg->IsNameInUse(m_bNormal, m_strName)) { - ShowMessageBox(IDS_ACL_ENTRY_NAME_IN_USE, MB_ICONEXCLAMATION, IDS_ACL_ENTRY_NAME_IN_USE); - return; - } - - CDialog::OnOK(); -} - -void CAddAclEntryDlg::OnChangeName() -{ - m_Name.GetWindowText(m_strName); - - if (m_strName.GetLength() > 0) - m_Ok.EnableWindow(TRUE); -} - -void CAddAclEntryDlg::OnHelp() -{ - ShowHelp(m_hWnd, ADD_ACL_ENTRY_HELP_ID); -} - diff --git a/src/WINNT/client_exp/add_acl_entry_dlg.h b/src/WINNT/client_exp/add_acl_entry_dlg.h deleted file mode 100644 index ac440ef8a..000000000 --- a/src/WINNT/client_exp/add_acl_entry_dlg.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CSetAfsAcl; - -///////////////////////////////////////////////////////////////////////////// -// CAddAclEntryDlg dialog - -class CAddAclEntryDlg : public CDialog -{ - BOOL m_bNormal; - CString m_Rights; - CString m_strName; - CSetAfsAcl *m_pAclSetDlg; - - CString MakePermString(); - -// Construction -public: - CAddAclEntryDlg(CWnd* pParent = NULL); // standard constructor - - void SetAclDlg(CSetAfsAcl *pAclSetDlg) { m_pAclSetDlg = pAclSetDlg; } - - CString GetName() { return m_strName; } - CString GetRights() { return m_Rights; } - BOOL IsNormal() { return m_bNormal; } - -// Dialog Data - //{{AFX_DATA(CAddAclEntryDlg) - enum { IDD = IDD_ADD_ACL }; - CButton m_Ok; - CEdit m_Name; - CButton m_NormalEntry; - CButton m_LookupPerm; - CButton m_LockPerm; - CButton m_WritePerm; - CButton m_AdminPerm; - CButton m_ReadPerm; - CButton m_InsertPerm; - CButton m_DeletePerm; - //}}AFX_DATA - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAddAclEntryDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CAddAclEntryDlg) - afx_msg void OnAddNegativeEntry(); - afx_msg void OnAddNormalEntry(); - virtual BOOL OnInitDialog(); - virtual void OnOK(); - afx_msg void OnChangeName(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/add_submount_dlg.cpp b/src/WINNT/client_exp/add_submount_dlg.cpp deleted file mode 100644 index 7485495a1..000000000 --- a/src/WINNT/client_exp/add_submount_dlg.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "add_submount_dlg.h" -#include "submount_info.h" -#include "help.h" -#include "msgs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAddSubmtDlg dialog - - -CAddSubmtDlg::CAddSubmtDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CAddSubmtDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CAddSubmtDlg) - m_strShareName = _T(""); - m_strPathName = _T(""); - //}}AFX_DATA_INIT - - m_bAdd = TRUE; - m_bSave = FALSE; -} - - -void CAddSubmtDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAddSubmtDlg) - DDX_Control(pDX, IDOK, m_Ok); - DDX_Text(pDX, IDC_SHARE_NAME, m_strShareName); - DDX_Text(pDX, IDC_PATH_NAME, m_strPathName); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CAddSubmtDlg, CDialog) - //{{AFX_MSG_MAP(CAddSubmtDlg) - ON_EN_CHANGE(IDC_SHARE_NAME, OnChangeShareName) - ON_EN_CHANGE(IDC_PATH_NAME, OnChangePathName) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CAddSubmtDlg message handlers - -BOOL CAddSubmtDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - if (!m_bAdd) { - SetWindowText(GetMessageString(IDS_EDIT_PATH_NAME)); - ((CEdit *)GetDlgItem(IDC_SHARE_NAME))->EnableWindow(FALSE); - } - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CAddSubmtDlg::CheckEnableOk() -{ - UpdateData(TRUE); - - m_Ok.EnableWindow(!m_strShareName.IsEmpty() && !m_strPathName.IsEmpty()); -} - -void CAddSubmtDlg::OnChangeShareName() -{ - CheckEnableOk(); -} - -void CAddSubmtDlg::OnChangePathName() -{ - CheckEnableOk(); -} - -void CAddSubmtDlg::OnOK() -{ - UpdateData(TRUE); - - m_bSave = TRUE; - - CDialog::OnOK(); -} - -void CAddSubmtDlg::SetSubmtInfo(CSubmountInfo *pInfo) -{ - ASSERT_VALID(pInfo); - - m_strShareName = pInfo->GetShareName(); - m_strPathName = pInfo->GetPathName(); -} - -CSubmountInfo *CAddSubmtDlg::GetSubmtInfo() -{ - if (!m_bSave) - return 0; - - SUBMT_INFO_STATUS status; - - if (m_bAdd) - status = SIS_ADDED; - else - status = SIS_CHANGED; - - return new CSubmountInfo(m_strShareName, m_strPathName, status); -} - -void CAddSubmtDlg::OnHelp() -{ - ShowHelp(m_hWnd, (m_bAdd ? ADD_SUBMT_HELP_ID : EDIT_PATH_NAME_HELP_ID)); -} - diff --git a/src/WINNT/client_exp/add_submount_dlg.h b/src/WINNT/client_exp/add_submount_dlg.h deleted file mode 100644 index a99f46432..000000000 --- a/src/WINNT/client_exp/add_submount_dlg.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -class CSubmountInfo; - -///////////////////////////////////////////////////////////////////////////// -// CAddSubmtDlg dialog - -class CAddSubmtDlg : public CDialog -{ - BOOL m_bAdd; - BOOL m_bSave; - - void CheckEnableOk(); - -// Construction -public: - CAddSubmtDlg(CWnd* pParent = NULL); // standard constructor - - void SetAddMode(BOOL bAddMode) { m_bAdd = bAddMode; } - - void SetSubmtInfo(CSubmountInfo *pInfo); - CSubmountInfo *GetSubmtInfo(); - -// Dialog Data - //{{AFX_DATA(CAddSubmtDlg) - enum { IDD = IDD_ADD_SUBMOUNT }; - CButton m_Ok; - CString m_strShareName; - CString m_strPathName; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAddSubmtDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CAddSubmtDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnChangeShareName(); - afx_msg void OnChangePathName(); - virtual void OnOK(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/afs_shl_ext.cpp b/src/WINNT/client_exp/afs_shl_ext.cpp deleted file mode 100644 index 6c4d9c811..000000000 --- a/src/WINNT/client_exp/afs_shl_ext.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include -#include "help.h" -#include "shell_ext.h" -#include "winreg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -static const IID IID_IShellExt = -{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2 } }; - -///////////////////////////////////////////////////////////////////////////// -// CAfsShlExt - -BEGIN_MESSAGE_MAP(CAfsShlExt, CWinApp) - //{{AFX_MSG_MAP(CAfsShlExt) - // NOTE - the ClassWizard will add and remove mapping macros here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CAfsShlExt construction - -CAfsShlExt::CAfsShlExt() -{ - /* Start up sockets */ - WSADATA WSAjunk; - WSAStartup(0x0101, &WSAjunk); -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CAfsShlExt object - -CAfsShlExt theApp; - -///////////////////////////////////////////////////////////////////////////// -// CAfsShlExt initialization -HINSTANCE g_hInstance; - -BOOL CAfsShlExt::InitInstance() -{ - // Load our translated resources - TaLocale_LoadCorrespondingModule (m_hInstance); - - // Register all OLE server (factories) as running. This enables the - // OLE libraries to create objects from other applications. - COleObjectFactory::RegisterAll(); - - SetHelpPath(m_pszHelpFilePath); - - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////// -// Special entry points required for inproc servers - -STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) -{ - AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return AfxDllGetClassObject(rclsid, riid, ppv); -} - -STDAPI DllCanUnloadNow(void) -{ - AFX_MANAGE_STATE(AfxGetStaticModuleState()); - - if (!nCMRefCount && !nSERefCount && !nICRefCount && !nTPRefCount && !nXPRefCount) - return S_OK; - - return S_FALSE; -} - -int WideCharToLocal(LPTSTR pLocal, LPCWSTR pWide, DWORD dwChars) -{ - *pLocal = 0; - WideCharToMultiByte( CP_ACP, 0, pWide, -1, pLocal, dwChars, NULL, NULL); - return lstrlen(pLocal); -} - -LRESULT DoRegCLSID(HKEY hKey,PTCHAR szSubKey,PTCHAR szData,PTCHAR szValue=NULL) -{ - DWORD dwDisp; - LRESULT lResult; - HKEY thKey; - lResult = RegCreateKeyEx(hKey, szSubKey, 0, NULL, - REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, - &thKey, &dwDisp); - if(NOERROR == lResult) - { - lResult = RegSetValueEx(thKey, szValue, 0, REG_SZ, - (LPBYTE)szData, (lstrlen(szData) + 1) - * sizeof(TCHAR)); - RegCloseKey(thKey); - } - RegCloseKey(hKey); - return lResult; -} - -// by exporting DllRegisterServer, you can use regsvr.exe -STDAPI DllRegisterServer(void) -{ - HKEY hKey; - LRESULT lResult; - DWORD dwDisp; - TCHAR szSubKey[MAX_PATH]; - TCHAR szCLSID[MAX_PATH]; - TCHAR szModule[MAX_PATH]; - LPWSTR pwsz; - AFX_MANAGE_STATE(AfxGetStaticModuleState()); - COleObjectFactory::UpdateRegistryAll(); - - StringFromIID(IID_IShellExt, &pwsz); - if(pwsz) - { - WideCharToMultiByte( CP_ACP, 0,pwsz, -1, szCLSID, sizeof(szCLSID), NULL, NULL); - LPMALLOC pMalloc; - CoGetMalloc(1, &pMalloc); - if(pMalloc) - { - (pMalloc->Free)(pwsz); - (pMalloc->Release)(); - } - } else { - return E_FAIL; - } - - /* - [HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}\InprocServer32] - @="Y:\\DEST\\root.client\\usr\\vice\\etc\\afs_shl_ext.dll" - "ThreadingModel"="Apartment" - */ - HMODULE hModule=GetModuleHandle("afs_shl_ext.dll"); - DWORD z=GetModuleFileName(hModule,szModule,sizeof(szModule)); - wsprintf(szSubKey, TEXT("CLSID\\%s\\InprocServer32"),szCLSID); - if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szModule))!=NOERROR) - return lResult; - - wsprintf(szSubKey, TEXT("CLSID\\%s\\InprocServer32"),szCLSID); - if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,"Apartment","ThreadingModel"))!=NOERROR) - return lResult; - - /* - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\AFS Client Shell Extension] - @="{EA3775F2-28BE-11D3-9C8D-00105A24ED29}" - */ - - wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE); - if ((lResult=DoRegCLSID(HKEY_LOCAL_MACHINE,szSubKey,szCLSID))!=NOERROR) - return lResult; - - //If running on NT, register the extension as approved. - /* - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved] - "{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}"="AFS Client Shell Extension" - - [HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\AFS Client Shell Extension] - @="{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}" - */ - - OSVERSIONINFO osvi; - osvi.dwOSVersionInfoSize = sizeof(osvi); - GetVersionEx(&osvi); - if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) - { - wsprintf(szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved")); - if ((lResult=DoRegCLSID(HKEY_LOCAL_MACHINE,szSubKey,STR_EXT_TITLE,szCLSID))!=NOERROR) - return lResult; - } - wsprintf(szSubKey, TEXT("*\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE); - if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szCLSID))!=NOERROR) - return lResult; - wsprintf(szSubKey, TEXT("Folder\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE); - if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szCLSID))!=NOERROR) - return lResult; - - /* - Register InfoTip - - [HKEY_CLASSES_ROOT\Folder\shellex\{00021500-0000-0000-C000-000000000046}] - @="{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}" - */ - - wsprintf(szSubKey, TEXT("Folder\\shellex\\{00021500-0000-0000-C000-000000000046}")); - if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szCLSID))!=NOERROR) - return lResult; - - - /* Below needs to be merged with above */ - - wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE); - lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, - szSubKey, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hKey, - &dwDisp); - - if(NOERROR == lResult) - { - //Create the value string. - lResult = RegSetValueEx( hKey, - NULL, - 0, - REG_SZ, - (LPBYTE)szCLSID, - (lstrlen(szCLSID) + 1) * sizeof(TCHAR)); - RegCloseKey(hKey); - } - else - return SELFREG_E_CLASS; - - //If running on NT, register the extension as approved. - osvi.dwOSVersionInfoSize = sizeof(osvi); - GetVersionEx(&osvi); - if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) - { - lstrcpy( szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved")); - - lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, - szSubKey, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hKey, - &dwDisp); - - if(NOERROR == lResult) - { - TCHAR szData[MAX_PATH]; - - //Create the value string. - lstrcpy(szData, STR_EXT_TITLE); - - lResult = RegSetValueEx( hKey, - szCLSID, - 0, - REG_SZ, - (LPBYTE)szData, - (lstrlen(szData) + 1) * sizeof(TCHAR)); - - RegCloseKey(hKey); - } else - return SELFREG_E_CLASS; - } - return S_OK; -} - -//returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey); - -LRESULT DoValueDelete(HKEY hKey,PTCHAR pszSubKey,PTCHAR szValue=NULL) -{ - LRESULT lResult; - HKEY thKey; - if (szValue==NULL) { - lResult=RegDeleteKey(hKey, pszSubKey); - return lResult; - } - lResult = RegOpenKeyEx( hKey, - pszSubKey, - 0, - KEY_ALL_ACCESS, - &thKey); - if(NOERROR == lResult) - { - lResult=RegDeleteValue(hKey, szValue); - RegCloseKey(thKey); - } - return lResult; -} - -STDAPI DllUnregisterServer(void) -{ - TCHAR szSubKey[MAX_PATH]; - TCHAR szCLSID[MAX_PATH]; - LPWSTR pwsz; - AFX_MANAGE_STATE(AfxGetStaticModuleState()); - COleObjectFactory::UpdateRegistryAll(FALSE); - StringFromIID(IID_IShellExt, &pwsz); - if(pwsz) - { - WideCharToMultiByte( CP_ACP, 0,pwsz, -1, szCLSID, sizeof(szCLSID), NULL, NULL); - LPMALLOC pMalloc; - CoGetMalloc(1, &pMalloc); - if(pMalloc) - { - (pMalloc->Free)(pwsz); - (pMalloc->Release)(); - } - } else { - return E_FAIL; - } - wsprintf(szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved")); - DoValueDelete(HKEY_LOCAL_MACHINE,szSubKey,szCLSID); - wsprintf(szSubKey, TEXT("*\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE); - DoValueDelete(HKEY_CLASSES_ROOT, szSubKey); - wsprintf(szSubKey, TEXT("Folder\\shellex\\{00021500-0000-0000-C000-000000000046}")); - DoValueDelete(HKEY_CLASSES_ROOT, szSubKey); - wsprintf(szSubKey, TEXT("Folder\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE); - DoValueDelete(HKEY_CLASSES_ROOT, szSubKey); - wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE); - DoValueDelete(HKEY_LOCAL_MACHINE, szSubKey); - return S_OK; -} - diff --git a/src/WINNT/client_exp/afs_shl_ext.def b/src/WINNT/client_exp/afs_shl_ext.def deleted file mode 100644 index 8375b659d..000000000 --- a/src/WINNT/client_exp/afs_shl_ext.def +++ /dev/null @@ -1,18 +0,0 @@ -; Copyright 2000, International Business Machines Corporation and others. -; All Rights Reserved. -; -; This software has been released under the terms of the IBM Public -; License. For details, see the LICENSE file in the top-level source -; directory or online at http://www.openafs.org/dl/license10.html -; - -; AfsShlExt.def : Declares the module parameters for the DLL. - -LIBRARY "afs_shl_ext" -DESCRIPTION 'AfsShlExt Windows Dynamic Link Library' - -EXPORTS - ; Explicit exports can go here - DllCanUnloadNow PRIVATE - DllGetClassObject PRIVATE - DllRegisterServer PRIVATE diff --git a/src/WINNT/client_exp/afs_shl_ext.h b/src/WINNT/client_exp/afs_shl_ext.h deleted file mode 100644 index 51a022569..000000000 --- a/src/WINNT/client_exp/afs_shl_ext.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#if !defined(AFX_AFSSHELL_H__DC515C1F_6CAC_11D1_BAE7_00C04FD140D2__INCLUDED_) -#define AFX_AFSSHELL_H__DC515C1F_6CAC_11D1_BAE7_00C04FD140D2__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CAfsShlExt -// See afs_shl_ext.cpp for the implementation of this class -// - -class CAfsShlExt : public CWinApp -{ -public: - CAfsShlExt(); - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAfsShlExt) - public: - virtual BOOL InitInstance(); - //}}AFX_VIRTUAL - - //{{AFX_MSG(CAfsShlExt) - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -extern CAfsShlExt theApp; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Developer Studio will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_AFSSHELL_H__DC515C1F_6CAC_11D1_BAE7_00C04FD140D2__INCLUDED_) diff --git a/src/WINNT/client_exp/afs_shl_ext.odl b/src/WINNT/client_exp/afs_shl_ext.odl deleted file mode 100644 index dc126398b..000000000 --- a/src/WINNT/client_exp/afs_shl_ext.odl +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -[ uuid(DC515C1A-6CAC-11D1-BAE7-00C04FD140D2), version(1.0) ] -library afs_shl_ext -{ - importlib("stdole32.tlb"); - - // Primary dispatch interface for CShellExt - - [ uuid(DC515C27-6CAC-11D1-BAE7-00C04FD140D2) ] - dispinterface IShellExt - { - properties: - // NOTE - ClassWizard will maintain property information here. - // Use extreme caution when editing this section. - //{{AFX_ODL_PROP(CShellExt) - //}}AFX_ODL_PROP - - methods: - // NOTE - ClassWizard will maintain method information here. - // Use extreme caution when editing this section. - //{{AFX_ODL_METHOD(CShellExt) - //}}AFX_ODL_METHOD - - }; - - // Class information for CShellExt - - [ uuid(DC515C29-6CAC-11D1-BAE7-00C04FD140D2) ] - coclass ShellExt - { - [default] dispinterface IShellExt; - }; - - //{{AFX_APPEND_ODL}} - //}}AFX_APPEND_ODL}} -}; diff --git a/src/WINNT/client_exp/afs_shl_ext.reg b/src/WINNT/client_exp/afs_shl_ext.reg deleted file mode 100644 index f395f2641..000000000 --- a/src/WINNT/client_exp/afs_shl_ext.reg +++ /dev/null @@ -1,21 +0,0 @@ -REGEDIT4 - -[HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}] - @="AFS Client Shell Extension" - -[HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}\InprocServer32] - @="c:\\winnt\\system32\\afs_shl_ext.dll" -"ThreadingModel"="Apartment" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved] - "{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}"="AFS Client Shell Extension" - -[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers] - @="afs_shl_ext" -[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\AFS Client Shell Extension] - @="{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}" - -[HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers] - @="afs_shl_ext" -[HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\AFS Client Shell Extension] - @="{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}" diff --git a/src/WINNT/client_exp/afs_shl_ext_stub.rc b/src/WINNT/client_exp/afs_shl_ext_stub.rc deleted file mode 100644 index ab9ea5937..000000000 --- a/src/WINNT/client_exp/afs_shl_ext_stub.rc +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.dll" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/client_exp/auth_dlg.cpp b/src/WINNT/client_exp/auth_dlg.cpp deleted file mode 100644 index 2d48f35fb..000000000 --- a/src/WINNT/client_exp/auth_dlg.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "auth_dlg.h" -#include "klog_dlg.h" -#include "unlog_dlg.h" -#include "gui2fs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAuthDlg dialog - - -CAuthDlg::CAuthDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CAuthDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CAuthDlg) - //}}AFX_DATA_INIT -} - - -void CAuthDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAuthDlg) - DDX_Control(pDX, IDC_TOKEN_LIST, m_TokenList); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CAuthDlg, CDialog) - //{{AFX_MSG_MAP(CAuthDlg) - ON_BN_CLICKED(ID_GET_TOKENS, OnGetTokens) - ON_BN_CLICKED(ID_DISCARD_TOKENS, OnDiscardTokens) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CAuthDlg message handlers - -BOOL CAuthDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - // The final tab is for an extra CellName entry that is - // there so we can easily parse it out when someone wants - // to get or discard tokens. It is placed so the user can't - // see it. It's kind of a hack, but not too bad. - int tabs[] = { 93, 211, 700 }; - - m_TokenList.SetTabStops(sizeof(tabs) / sizeof(int), tabs); - - FillTokenList(); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CAuthDlg::OnGetTokens() -{ - CKlogDlg dlg; - - dlg.SetCellName(GetSelectedCellName()); - - if (dlg.DoModal() == IDOK) - FillTokenList(); -} - -void CAuthDlg::OnDiscardTokens() -{ - CUnlogDlg dlg; - - dlg.SetCellName(GetSelectedCellName()); - - if (dlg.DoModal() == IDOK) - FillTokenList(); -} - -void CAuthDlg::FillTokenList() -{ - m_TokenList.ResetContent(); - - CStringArray tokenInfo; - if (!GetTokenInfo(tokenInfo)) - return; - - for (int i = 0; i < tokenInfo.GetSize(); i++) - m_TokenList.AddString(tokenInfo[i]); -} - -CString CAuthDlg::GetSelectedCellName() -{ - int nIndex = m_TokenList.GetCurSel(); - if (nIndex < 0) - return ""; - - CString strTokenInfo; - m_TokenList.GetText(nIndex, strTokenInfo); - - int nPos = strTokenInfo.ReverseFind('\t'); - - return strTokenInfo.Mid(nPos + 1); -} - -void CAuthDlg::OnHelp() -{ - ShowHelp(m_hWnd, AUTHENTICATION_HELP_ID); -} - diff --git a/src/WINNT/client_exp/auth_dlg.h b/src/WINNT/client_exp/auth_dlg.h deleted file mode 100644 index e5bcce897..000000000 --- a/src/WINNT/client_exp/auth_dlg.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CAuthDlg : public CDialog -{ - void FillTokenList(); - CString GetSelectedCellName(); - -// Construction -public: - CAuthDlg(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - //{{AFX_DATA(CAuthDlg) - enum { IDD = IDD_AUTHENTICATION }; - CListBox m_TokenList; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAuthDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CAuthDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnGetTokens(); - afx_msg void OnDiscardTokens(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/clear_acl_dlg.cpp b/src/WINNT/client_exp/clear_acl_dlg.cpp deleted file mode 100644 index 74cec3a0a..000000000 --- a/src/WINNT/client_exp/clear_acl_dlg.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "clear_acl_dlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CClearAclDlg dialog - - -CClearAclDlg::CClearAclDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CClearAclDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CClearAclDlg) - m_bNegative = FALSE; - m_bNormal = FALSE; - //}}AFX_DATA_INIT -} - - -void CClearAclDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CClearAclDlg) - DDX_Check(pDX, IDC_NEGATIVE, m_bNegative); - DDX_Check(pDX, IDC_NORMAL, m_bNormal); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CClearAclDlg, CDialog) - //{{AFX_MSG_MAP(CClearAclDlg) - // NOTE: the ClassWizard will add message map macros here - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CClearAclDlg message handlers - -void CClearAclDlg::GetSettings(BOOL& bNormal, BOOL& bNegative) -{ - bNormal = m_bNormal; - bNegative = m_bNegative; -} - diff --git a/src/WINNT/client_exp/clear_acl_dlg.h b/src/WINNT/client_exp/clear_acl_dlg.h deleted file mode 100644 index 0b758d170..000000000 --- a/src/WINNT/client_exp/clear_acl_dlg.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CClearAclDlg : public CDialog -{ -// Construction -public: - CClearAclDlg(CWnd* pParent = NULL); // standard constructor - - void GetSettings(BOOL& bNormal, BOOL& bNegative); - -// Dialog Data - //{{AFX_DATA(CClearAclDlg) - enum { IDD = IDD_CLEAR_ACL }; - BOOL m_bNegative; - BOOL m_bNormal; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CClearAclDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CClearAclDlg) - // NOTE: the ClassWizard will add member functions here - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/copy_acl_dlg.cpp b/src/WINNT/client_exp/copy_acl_dlg.cpp deleted file mode 100644 index 95ce4f549..000000000 --- a/src/WINNT/client_exp/copy_acl_dlg.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "copy_acl_dlg.h" -#include "io.h" -#include "msgs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CCopyAclDlg dialog - - -CCopyAclDlg::CCopyAclDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CCopyAclDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CCopyAclDlg) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT - - m_bClear = FALSE; -} - - -void CCopyAclDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CCopyAclDlg) - DDX_Control(pDX, IDOK, m_Ok); - DDX_Control(pDX, IDC_FROM_DIR, m_FromDir); - DDX_Control(pDX, IDC_TO_DIR, m_ToDir); - DDX_Control(pDX, IDC_CLEAR, m_Clear); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CCopyAclDlg, CDialog) - //{{AFX_MSG_MAP(CCopyAclDlg) - ON_EN_CHANGE(IDC_TO_DIR, OnChangeToDir) - ON_BN_CLICKED(IDC_BROWSE, OnBrowse) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CCopyAclDlg message handlers - -void CCopyAclDlg::OnOK() -{ - m_bClear = m_Clear.GetCheck() == 1; - m_ToDir.GetWindowText(m_strToDir); - - if (access(m_strToDir, 0) == -1) { - ShowMessageBox(IDS_DIR_DOES_NOT_EXIST_ERROR, MB_ICONEXCLAMATION, IDS_DIR_DOES_NOT_EXIST_ERROR, m_strToDir); - return; - } - - CDialog::OnOK(); -} - -BOOL CCopyAclDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - m_FromDir.SetWindowText(m_strFromDir); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CCopyAclDlg::OnChangeToDir() -{ - m_ToDir.GetWindowText(m_strToDir); - - BOOL bEnable = m_strToDir.GetLength() > 0; - m_Ok.EnableWindow(bEnable); -} - -void CCopyAclDlg::OnBrowse() -{ - CFileDialog dlg(TRUE, 0, "*.*", OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR | OFN_HIDEREADONLY, 0, 0); - - if (dlg.DoModal() == IDCANCEL) - return; - - CString strPath = dlg.GetPathName(); - - // Remove file name (last component of path) - int nFirstSlash = strPath.Find('\\'); - int nLastSlash = strPath.ReverseFind('\\'); - if (nFirstSlash != nLastSlash) - strPath = strPath.Left(nLastSlash); - else - strPath = strPath.Left(nFirstSlash + 1); - - m_ToDir.SetWindowText(strPath); -} - -void CCopyAclDlg::OnHelp() -{ - ShowHelp(m_hWnd, COPY_ACL_HELP_ID); -} - diff --git a/src/WINNT/client_exp/copy_acl_dlg.h b/src/WINNT/client_exp/copy_acl_dlg.h deleted file mode 100644 index b407687b9..000000000 --- a/src/WINNT/client_exp/copy_acl_dlg.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CCopyAclDlg : public CDialog -{ - CString m_strToDir; - BOOL m_bClear; - CString m_strFromDir; - -// Construction -public: - CCopyAclDlg(CWnd* pParent = NULL); // standard constructor - - const CString& GetToDir() { return m_strToDir; } - BOOL GetClear() { return m_bClear; } - - void SetFromDir(const CString& strFromDir) { m_strFromDir = strFromDir; } - -// Dialog Data - //{{AFX_DATA(CCopyAclDlg) - enum { IDD = IDD_COPY_ACL }; - CButton m_Ok; - CEdit m_FromDir; - CEdit m_ToDir; - CButton m_Clear; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CCopyAclDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CCopyAclDlg) - virtual void OnOK(); - virtual BOOL OnInitDialog(); - afx_msg void OnChangeToDir(); - afx_msg void OnBrowse(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/down_servers_dlg.cpp b/src/WINNT/client_exp/down_servers_dlg.cpp deleted file mode 100644 index 745e74c2b..000000000 --- a/src/WINNT/client_exp/down_servers_dlg.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "down_servers_dlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CDownServersDlg dialog - - -CDownServersDlg::CDownServersDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CDownServersDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CDownServersDlg) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT -} - -void CDownServersDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CDownServersDlg) - DDX_Control(pDX, IDC_LIST, m_ServerList); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CDownServersDlg, CDialog) - //{{AFX_MSG_MAP(CDownServersDlg) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDownServersDlg message handlers - -BOOL CDownServersDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - for (int i = 0; i < m_ServerNames.GetSize(); i++) - m_ServerList.AddString(m_ServerNames[i]); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CDownServersDlg::SetServerNames(const CStringArray& serverNames) -{ - m_ServerNames.RemoveAll(); - - m_ServerNames.Copy(serverNames); -} - diff --git a/src/WINNT/client_exp/down_servers_dlg.h b/src/WINNT/client_exp/down_servers_dlg.h deleted file mode 100644 index dd9ae97ef..000000000 --- a/src/WINNT/client_exp/down_servers_dlg.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -// CDownServersDlg dialog - -class CDownServersDlg : public CDialog -{ - CStringArray m_ServerNames; - -// Construction -public: - CDownServersDlg(CWnd* pParent = NULL); // standard constructor - - void SetServerNames(const CStringArray& serverNames); - -// Dialog Data - //{{AFX_DATA(CDownServersDlg) - enum { IDD = IDD_DOWN_SERVERS }; - CListBox m_ServerList; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CDownServersDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CDownServersDlg) - virtual BOOL OnInitDialog(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/fs.h b/src/WINNT/client_exp/fs.h deleted file mode 100644 index cd2efdcb2..000000000 --- a/src/WINNT/client_exp/fs.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef __FS_H_ENV__ -#define __FS_H_ENV__ 1 - -/* some forward references */ -extern void ZapList(struct AclEntry *); - -extern void ZapAcl(struct Acl *); - -extern int PruneList (struct AclEntry **, int); - -extern void ChangeList(struct Acl *, long, char *, long); - -extern int CleanAcl(struct Acl *); - -extern void Die(int, char *); - -static SetVolCmd(struct cmd_syndesc *); - -#endif /* FS_H_ENV */ diff --git a/src/WINNT/client_exp/gui2fs.cpp b/src/WINNT/client_exp/gui2fs.cpp deleted file mode 100644 index f45a6b424..000000000 --- a/src/WINNT/client_exp/gui2fs.cpp +++ /dev/null @@ -1,1658 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include -#include - -#include "gui2fs.h" -#include "msgs.h" -#include "results_dlg.h" -#include "volume_inf.h" -#include "mount_points_dlg.h" -#include "hourglass.h" -#include "down_servers_dlg.h" - -extern "C" { -#include -#include -#include "fs.h" -#include "fs_utils.h" -#include -#include -} - - -#define PCCHAR(str) ((char *)(const char *)(str)) - - -#define MAXHOSTS 13 -#define OMAXHOSTS 8 -#define MAXNAME 100 -#define MAXSIZE 2048 -#define MAXINSIZE 1300 /* pioctl complains if data is larger than this */ -#define VMSGSIZE 128 /* size of msg buf in volume hdr */ - -#define MAXCELLCHARS 64 -#define MAXHOSTCHARS 64 -#define MAXHOSTSPERCELL 8 - -struct afsconf_cell { - char name[MAXCELLCHARS]; - short numServers; - short flags; - struct sockaddr_in hostAddr[MAXHOSTSPERCELL]; - char hostName[MAXHOSTSPERCELL][MAXHOSTCHARS]; - char *linkedCell; -}; - -static char space[MAXSIZE]; -static char tspace[1024]; - -// #define LOGGING_ON // Enable this to log certain pioctl calls - -#ifdef LOGGING_ON -static char *szLogFileName = "afsguilog.txt"; -#endif - - -FILE *OpenFile(char *file, char *rwp) -{ - char wdir[256]; - long code; - long tlen; - FILE *fp; - - code = GetWindowsDirectory(wdir, sizeof(wdir)); - if (code == 0 || code > sizeof(wdir)) - return FALSE; - - /* add trailing backslash, if required */ - tlen = strlen(wdir); - if (wdir[tlen - 1] != '\\') - strcat(wdir, "\\"); - - strcat(wdir, file); - - fp = fopen(wdir, rwp); - - return fp; -} - -CString StripPath(CString& strPath) -{ - int nIndex = strPath.ReverseFind('\\'); - - CString strFile = strPath.Mid(nIndex + 1); - if (strFile.IsEmpty()) - return strPath; - - return strFile; -} - -CStringArray& StripPath(CStringArray& files) -{ - for (int i = 0; i < files.GetSize(); i++) - files[i] = StripPath(files[i]); - - return files; -} - -void Flush(const CStringArray& files) -{ - register LONG code; - struct ViceIoctl blob; - int error = 0; - - HOURGLASS hourglass; - - for (int i = 0; i < files.GetSize(); i++) { - blob.in_size = blob.out_size = 0; - - code = pioctl(PCCHAR(files[i]), VIOCFLUSH, &blob, 0); - if (code) { - error = 1; - if (errno == EMFILE) - ShowMessageBox(IDS_FLUSH_FAILED, MB_ICONEXCLAMATION, IDS_FLUSH_FAILED, files[i]); - else - ShowMessageBox(IDS_FLUSH_ERROR, MB_ICONEXCLAMATION, IDS_FLUSH_ERROR, files[i], strerror(errno)); - } - } - - if (!error) - ShowMessageBox(IDS_FLUSH_OK, MB_ICONEXCLAMATION, IDS_FLUSH_OK); -} - -void FlushVolume(const CStringArray& files) -{ - register LONG code; - struct ViceIoctl blob; - int error = 0; - - HOURGLASS hourglass; - - for (int i = 0; i < files.GetSize(); i++) { - blob.in_size = blob.out_size = 0; - - code = pioctl(PCCHAR(files[i]), VIOC_FLUSHVOLUME, &blob, 0); - if (code) { - error = 1; - ShowMessageBox(IDS_FLUSH_VOLUME_ERROR, MB_ICONEXCLAMATION, IDS_FLUSH_VOLUME_ERROR, files[i], strerror(errno)); - } - } - - if (!code) - ShowMessageBox(IDS_FLUSH_VOLUME_OK, MB_ICONEXCLAMATION, IDS_FLUSH_VOLUME_OK); -} - -void WhichCell(CStringArray& files) -{ - register LONG code; - struct ViceIoctl blob; - int error; - CString str; - CString str2; - - CStringArray results; - - error = 0; - - HOURGLASS hourglass; - - for (int i = 0; i < files.GetSize(); i++) { - blob.in_size = 0; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl(PCCHAR(files[i]), VIOC_FILE_CELL_NAME, &blob, 1); - if (code) { - if (code == ENOENT) { - LoadString (str, IDS_CANT_GET_CELL); - results.Add(str); - } else - results.Add(GetAfsError(errno)); - } else - results.Add(space); - } - - LoadString (str, IDS_SHOW_CELL); - LoadString (str2, IDS_SHOW_CELL_COLUMN); - CResultsDlg dlg(SHOW_CELL_HELP_ID); - dlg.SetContents(str, str2, StripPath(files), results); - dlg.DoModal(); -} - -void WSCellCmd() -{ - register LONG code; - struct ViceIoctl blob; - - HOURGLASS hourglass; - - blob.in_size = 0; - blob.in = (char *) 0; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl((char *) 0, VIOC_GET_WS_CELL, &blob, 1); - - if (code) { - //Die(errno, (char *) 0); - } - //else - //printf("This workstation belongs to cell '%s'\n", space); -} - -BOOL CheckVolumes() -{ - register LONG code; - struct ViceIoctl blob; - - blob.in_size = 0; - blob.out_size = 0; - code = pioctl(0, VIOCCKBACK, &blob, 1); - if (code) { - ShowMessageBox(IDS_CHECK_VOLUMES_ERROR, MB_ICONEXCLAMATION, IDS_CHECK_VOLUMES_ERROR, GetAfsError(errno, CString())); - return FALSE; - } - - ShowMessageBox(IDS_CHECK_VOLUMES_OK, MB_OK, IDS_CHECK_VOLUMES_OK); - - return TRUE; -} - -void SetCacheSizeCmd(LONG nNewCacheSize) -{ - register LONG code; - struct ViceIoctl blob; - - HOURGLASS hourglass; - - blob.in = (char *) &nNewCacheSize; - blob.in_size = sizeof(LONG); - blob.out_size = 0; - - code = pioctl(0, VIOCSETCACHESIZE, &blob, 1); - //if (code) - // Die(errno, (char *) 0); - //else - // printf("New cache size set.\n"); -} - -void WhereIs(CStringArray& files) -{ - register LONG code; - struct ViceIoctl blob; - CStringArray servers; - CStringArray resultFiles; - CString str; - CString str2; - - HOURGLASS hourglass; - - for (int i = 0; i < files.GetSize(); i++) { - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - memset(space, 0, sizeof(space)); - - code = pioctl(PCCHAR(files[i]), VIOCWHEREIS, &blob, 1); - if (code) { - resultFiles.Add(StripPath(files[i])); - servers.Add(GetAfsError(errno)); - continue; - } - - LONG *hosts = (LONG *)space; - BOOL bFirst = TRUE; - str = ""; - - for (int j = 0; j < MAXHOSTS; j++) { - if (hosts[j] == 0) - break; - char *hostName = hostutil_GetNameByINet(hosts[j]); - if (bFirst) { - resultFiles.Add(StripPath(files[i])); - bFirst = FALSE; - } else - resultFiles.Add(" "); - servers.Add(hostName); - } - } - - LoadString (str, IDS_SHOW_FS); - LoadString (str2, IDS_SHOW_FS_COLUMN); - CResultsDlg dlg(SHOW_FILE_SERVERS_HELP_ID); - dlg.SetContents(str, str2, resultFiles, servers); - dlg.DoModal(); -} - -CString GetAfsError(int code, const char *filename) -{ - CString strMsg; - - if (code == EINVAL) { - if (filename) - strMsg.Format("Invalid argument; it is possible that the file is not in AFS"); - else - strMsg.Format("Invalid argument"); - } else if (code == ENOENT) { - if (filename) - strMsg.Format("The file does not exist"); - else - strMsg.Format("No such file returned"); - } else if (code == EROFS) { - strMsg.Format("You can not change a backup or readonly volume"); - } else if (code == EACCES || code == EPERM) { - strMsg.Format("You do not have the required rights to do this operation"); - } else if (code == ENODEV) { - strMsg.Format("AFS service may not have started"); - } else if (code == ESRCH) { - strMsg.Format("Cell name not recognized"); - } else if (code == ETIMEDOUT) { - strMsg.Format("Connection timed out"); - } else if (code == EPIPE) { - strMsg.Format("Volume name or ID not recognized"); - } else { - strMsg.Format("Error 0x%x occurred", code); - } - - return strMsg; -} - - -/************************************************************************ -************************** ACL Code ************************************* -************************************************************************/ - -typedef char sec_rgy_name_t[1025]; /* A DCE definition */ - -struct AclEntry { - struct AclEntry *next; - char name[MAXNAME]; - LONG rights; -}; - -struct Acl { - int dfs; // Originally true if a dfs acl; now also the type - // of the acl (1, 2, or 3, corresponding to object, - // initial dir, or initial object). - sec_rgy_name_t cell; // DFS cell name - int nplus; - int nminus; - struct AclEntry *pluslist; - struct AclEntry *minuslist; -}; - -int foldcmp (register char *a, register char *b) -{ - register char t, u; - while (1) { - t = *a++; - u = *b++; - if (t >= 'A' && t <= 'Z') t += 0x20; - if (u >= 'A' && u <= 'Z') u += 0x20; - if (t != u) return 1; - if (t == 0) return 0; - } -} - -extern "C" void ZapList(struct AclEntry *alist) -{ - register struct AclEntry *tp, *np; - - for (tp = alist; tp; tp = np) { - np = tp->next; - free(tp); - } -} - -extern "C" void ZapAcl (struct Acl *acl) -{ - ZapList(acl->pluslist); - ZapList(acl->minuslist); - free(acl); -} - -extern "C" int PruneList (struct AclEntry **ae, int dfs) -{ - struct AclEntry **lp = ae; - struct AclEntry *te, *ne; - LONG ctr = 0; - - for (te = *ae; te; te = ne) { - if ((!dfs && te->rights == 0) || te->rights == -1) { - *lp = te->next; - ne = te->next; - free(te); - ctr++; - } - else { - ne = te->next; - lp = &te->next; - } - } - - return ctr; -} - -char *SkipLine (register char *astr) -{ - while (*astr != '\n') - astr++; - - astr++; - - return astr; -} - -/* tell if a name is 23 or -45 (digits or minus digits), which are bad names we must prune */ -static BadName(register char *aname) -{ - register int tc; - - /* all must be '-' or digit to be bad */ - while (tc = *aname++) { - if ((tc != '-') && (tc < '0' || tc > '9')) - return 0; - } - - return 1; -} - -CString GetRightsString(register LONG arights, int dfs) -{ - CString str; - - if (!dfs) { - if (arights & PRSFS_READ) str += "r"; - if (arights & PRSFS_LOOKUP) str += "l"; - if (arights & PRSFS_INSERT) str += "i"; - if (arights & PRSFS_DELETE) str += "d"; - if (arights & PRSFS_WRITE) str += "w"; - if (arights & PRSFS_LOCK) str += "k"; - if (arights & PRSFS_ADMINISTER) str += "a"; - } else { - ASSERT(FALSE); -/* - if (arights & DFS_READ) str += "r"; else str += "-"; - if (arights & DFS_WRITE) str += "w"; else printf("-"); - if (arights & DFS_EXECUTE) str += "x"; else printf("-"); - if (arights & DFS_CONTROL) str += "c"; else printf("-"); - if (arights & DFS_INSERT) str += "i"; else printf("-"); - if (arights & DFS_DELETE) str += "d"; else printf("-"); - if (arights & (DFS_USRALL)) str += "+"; -*/ - } - - return str; -} - -char *AclToString(struct Acl *acl) -{ - static char mydata[MAXSIZE]; - char tstring[MAXSIZE]; - char dfsstring[30]; - struct AclEntry *tp; - - if (acl->dfs) - sprintf(dfsstring, " dfs:%d %s", acl->dfs, acl->cell); - else - dfsstring[0] = '\0'; - sprintf(mydata, "%d%s\n%d\n", acl->nplus, dfsstring, acl->nminus); - - for(tp = acl->pluslist; tp; tp = tp->next) { - sprintf(tstring, "%s %d\n", tp->name, tp->rights); - strcat(mydata, tstring); - } - - for(tp = acl->minuslist; tp; tp = tp->next) { - sprintf(tstring, "%s %d\n", tp->name, tp->rights); - strcat(mydata, tstring); - } - - return mydata; -} - -struct Acl *EmptyAcl(const CString& strCellName) -{ - register struct Acl *tp; - - tp = (struct Acl *)malloc(sizeof (struct Acl)); - tp->nplus = tp->nminus = 0; - tp->pluslist = tp->minuslist = 0; - tp->dfs = 0; - strcpy(tp->cell, strCellName); - - return tp; -} - -struct Acl *ParseAcl(char *astr) -{ - int nplus, nminus, i, trights; - char tname[MAXNAME]; - struct AclEntry *first, *last, *tl; - struct Acl *ta; - - ta = (struct Acl *) malloc (sizeof (struct Acl)); - ta->dfs = 0; - sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell); - astr = SkipLine(astr); - sscanf(astr, "%d", &ta->nminus); - astr = SkipLine(astr); - - nplus = ta->nplus; - nminus = ta->nminus; - - last = 0; - first = 0; - for(i = 0; i < nplus; i++) { - sscanf(astr, "%100s %d", tname, &trights); - astr = SkipLine(astr); - tl = (struct AclEntry *) malloc(sizeof (struct AclEntry)); - if (!first) - first = tl; - strcpy(tl->name, tname); - tl->rights = trights; - tl->next = 0; - if (last) - last->next = tl; - last = tl; - } - ta->pluslist = first; - - last = 0; - first = 0; - for(i=0; i < nminus; i++) { - sscanf(astr, "%100s %d", tname, &trights); - astr = SkipLine(astr); - tl = (struct AclEntry *) malloc(sizeof (struct AclEntry)); - if (!first) - first = tl; - strcpy(tl->name, tname); - tl->rights = trights; - tl->next = 0; - if (last) - last->next = tl; - last = tl; - } - ta->minuslist = first; - - return ta; -} - -/* clean up an access control list of its bad entries; return 1 if we made - any changes to the list, and 0 otherwise */ -extern "C" int CleanAcl(struct Acl *aa) -{ - register struct AclEntry *te, **le, *ne; - int changes; - - HOURGLASS hourglass; - - /* Don't correct DFS ACL's for now */ - if (aa->dfs) - return 0; - - /* prune out bad entries */ - changes = 0; /* count deleted entries */ - le = &aa->pluslist; - for(te = aa->pluslist; te; te = ne) { - ne = te->next; - if (BadName(te->name)) { - /* zap this dude */ - *le = te->next; - aa->nplus--; - free(te); - changes++; - } - else - le = &te->next; - } - - le = &aa->minuslist; - - for(te = aa->minuslist; te; te = ne) { - ne = te->next; - if (BadName(te->name)) { - /* zap this dude */ - *le = te->next; - aa->nminus--; - free(te); - changes++; - } - else - le = &te->next; - } - - return changes; -} - -void CleanACL(CStringArray& names) -{ - register LONG code; - register struct Acl *ta; - struct ViceIoctl blob; - int changes; - - ShowMessageBox(IDS_CLEANACL_MSG, MB_OK, IDS_CLEANACL_MSG); - - HOURGLASS hourglass; - - for (int i = 0; i < names.GetSize(); i++) { - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - - code = pioctl(PCCHAR(names[i]), VIOCGETAL, &blob, 1); - if (code) { - ShowMessageBox(IDS_CLEANACL_ERROR, MB_ICONEXCLAMATION, 0, names[i], GetAfsError(errno)); - continue; - } - - ta = ParseAcl(space); - if (ta->dfs) { - ShowMessageBox(IDS_CLEANACL_NOT_SUPPORTED, MB_ICONEXCLAMATION, IDS_CLEANACL_NOT_SUPPORTED, names[i]); - continue; - } - - changes = CleanAcl(ta); - if (!changes) - continue; - - /* now set the acl */ - blob.in = AclToString(ta); - blob.in_size = strlen((char *)blob.in) + 1; - blob.out_size = 0; - - code = pioctl(PCCHAR(names[i]), VIOCSETAL, &blob, 1); - if (code) { - if (errno == EINVAL) { - ShowMessageBox(IDS_CLEANACL_INVALID_ARG, MB_ICONEXCLAMATION, IDS_CLEANACL_INVALID_ARG, names[i]); - continue; - } - else { - ShowMessageBox(IDS_CLEANACL_ERROR, MB_ICONEXCLAMATION, 0, names[i], GetAfsError(errno)); - continue; - } - } - } -} - -// Derived from fs.c's ListAclCmd -BOOL GetRights(const CString& strDir, CStringArray& strNormal, CStringArray& strNegative) -{ - register LONG code; - register struct Acl *ta; - struct ViceIoctl blob; - struct AclEntry *te; - int idf = 0; //getidf(as, parm_listacl_id); - - HOURGLASS hourglass; - - blob.out_size = MAXSIZE; - blob.in_size = idf; - blob.in = blob.out = space; - - code = pioctl(PCCHAR(strDir), VIOCGETAL, &blob, 1); - if (code) { - ShowMessageBox(IDS_GETRIGHTS_ERROR, MB_ICONEXCLAMATION, IDS_GETRIGHTS_ERROR, strDir, GetAfsError(errno)); - return FALSE; - } - - ta = ParseAcl(space); - if (ta->dfs) { - ShowMessageBox(IDS_DFSACL_ERROR, MB_ICONEXCLAMATION, IDS_DFSACL_ERROR); - return FALSE; - } - -// if (ta->dfs) -// printf(" Default cell = %s\n", ta->cell); - - CString strRight; - - if (ta->nplus > 0) { - for (te = ta->pluslist; te; te = te->next) { - strNormal.Add(te->name); - strNormal.Add(GetRightsString(te->rights, ta->dfs)); - } - } - - if (ta->nminus > 0) { - for (te = ta->minuslist; te; te = te->next) { - strNegative.Add(te->name); - strNegative.Add(GetRightsString(te->rights, ta->dfs)); - } - } - - return TRUE; -} - -struct AclEntry *FindList(register struct AclEntry *pCurEntry, const char *entryName) -{ - while (pCurEntry) { - if (!foldcmp(pCurEntry->name, PCCHAR(entryName))) - return pCurEntry; - pCurEntry = pCurEntry->next; - } - - return 0; -} - -void ChangeList (struct Acl *pAcl, BYTE bNormalRights, const char *entryName, LONG nEntryRights) -{ - ASSERT(pAcl); - ASSERT(entryName); - - struct AclEntry *pEntry; - - HOURGLASS hourglass; - - pEntry = (bNormalRights ? pAcl->pluslist : pAcl->minuslist); - pEntry = FindList(pEntry, entryName); - - /* Found the item already in the list. */ - if (pEntry) { - pEntry->rights = nEntryRights; - if (bNormalRights) - pAcl->nplus -= PruneList(&pAcl->pluslist, pAcl->dfs); - else - pAcl->nminus -= PruneList(&pAcl->minuslist, pAcl->dfs); - return; - } - - /* Otherwise we make a new item and plug in the new data. */ - pEntry = (struct AclEntry *) malloc(sizeof (struct AclEntry)); - ASSERT(pEntry); - - strcpy(pEntry->name, entryName); - pEntry->rights = nEntryRights; - - if (bNormalRights) { - pEntry->next = pAcl->pluslist; - pAcl->pluslist = pEntry; - pAcl->nplus++; - if (nEntryRights == 0 || nEntryRights == -1) - pAcl->nplus -= PruneList(&pAcl->pluslist, pAcl->dfs); - } - else { - pEntry->next = pAcl->minuslist; - pAcl->minuslist = pEntry; - pAcl->nminus++; - if (nEntryRights == 0) - pAcl->nminus -= PruneList(&pAcl->minuslist, pAcl->dfs); - } -} - -enum rtype {add, destroy, deny}; - -LONG Convert(const register char *arights, int dfs, enum rtype *rtypep) -{ - register int i, len; - LONG mode; - register char tc; - - *rtypep = add; /* add rights, by default */ - - if (!strcmp(arights,"read")) - return PRSFS_READ | PRSFS_LOOKUP; - if (!strcmp(arights, "write")) - return PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE | PRSFS_WRITE | PRSFS_LOCK; - if (!strcmp(arights, "mail")) - return PRSFS_INSERT | PRSFS_LOCK | PRSFS_LOOKUP; - if (!strcmp(arights, "all")) - return PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE | PRSFS_WRITE | PRSFS_LOCK | PRSFS_ADMINISTER; - - if (!strcmp(arights, "none")) { - *rtypep = destroy; /* Remove entire entry */ - return 0; - } - - len = strlen(arights); - mode = 0; - - for (i = 0; i < len; i++) { - tc = *arights++; - if (tc == 'r') mode |= PRSFS_READ; - else if (tc == 'l') mode |= PRSFS_LOOKUP; - else if (tc == 'i') mode |= PRSFS_INSERT; - else if (tc == 'd') mode |= PRSFS_DELETE; - else if (tc == 'w') mode |= PRSFS_WRITE; - else if (tc == 'k') mode |= PRSFS_LOCK; - else if (tc == 'a') mode |= PRSFS_ADMINISTER; - else { - fprintf(stderr, "illegal rights character '%c'.\n", tc); - exit(1); - } - } - return mode; -} - -BOOL SaveACL(const CString& strCellName, const CString& strDir, const CStringArray& normal, const CStringArray& negative) -{ - register LONG code; - struct ViceIoctl blob; - struct Acl *pAcl; - LONG rights; - enum rtype rtype; - - HOURGLASS hourglass; - - // Create a new ACL - pAcl = EmptyAcl(strCellName); - - // Set its normal rights - for (int i = 0; i < normal.GetSize(); i += 2) { - rights = Convert(normal[i + 1], 0, &rtype); - ChangeList(pAcl, TRUE, normal[i], rights); - } - - // Set its negative rights - for (i = 0; i < negative.GetSize(); i += 2) { - rights = Convert(negative[i + 1], 0, &rtype); - ChangeList(pAcl, FALSE, negative[i], rights); - } - - // Write the ACL - blob.in = AclToString(pAcl); - blob.out_size = 0; - blob.in_size = 1 + strlen((const char *)blob.in); - - code = pioctl(PCCHAR(strDir), VIOCSETAL, &blob, 1); - if (code) { - if (errno == EINVAL) - ShowMessageBox(IDS_SAVE_ACL_EINVAL_ERROR, MB_ICONEXCLAMATION, IDS_SAVE_ACL_EINVAL_ERROR, strDir); - else - ShowMessageBox(IDS_SAVE_ACL_ERROR, MB_ICONEXCLAMATION, IDS_SAVE_ACL_ERROR, strDir, GetAfsError(errno, strDir)); - } - - ZapAcl(pAcl); - - return (code == 0); -} - -BOOL CopyACL(const CString& strToDir, const CStringArray& normal, const CStringArray& negative, BOOL bClear) -{ - register LONG code; - struct ViceIoctl blob; - struct Acl *pToAcl; - int idf = 0; // getidf(as, parm_copyacl_id); - - HOURGLASS hourglass; - - // Get ACL to copy to - blob.out_size = MAXSIZE; - blob.in_size = idf; - blob.in = blob.out = space; - - code = pioctl(PCCHAR(strToDir), VIOCGETAL, &blob, 1); - if (code) { - ShowMessageBox(IDS_ACL_READ_ERROR, MB_ICONEXCLAMATION, IDS_ACL_READ_ERROR, strToDir, GetAfsError(errno, strToDir)); - return FALSE; - } - - if (bClear) - pToAcl = EmptyAcl(space); - else - pToAcl = ParseAcl(space); - - CleanAcl(pToAcl); - - if (pToAcl->dfs) { - ShowMessageBox(IDS_NO_DFS_COPY_ACL, MB_ICONEXCLAMATION, IDS_NO_DFS_COPY_ACL, strToDir); - ZapAcl(pToAcl); - return FALSE; - } - - enum rtype rtype; - - // Set normal rights - for (int i = 0; i < normal.GetSize(); i += 2) { - LONG rights = Convert(normal[i + 1], 0, &rtype); - ChangeList(pToAcl, TRUE, normal[i], rights); - } - - // Set negative rights - for (i = 0; i < negative.GetSize(); i += 2) { - LONG rights = Convert(negative[i + 1], 0, &rtype); - ChangeList(pToAcl, FALSE, normal[i], rights); - } - - // Save modified ACL - blob.in = AclToString(pToAcl); - blob.out_size = 0; - blob.in_size = 1 + strlen((char *)blob.in); - - code = pioctl(PCCHAR(strToDir), VIOCSETAL, &blob, 1); - if (code) { - ZapAcl(pToAcl); - if (errno == EINVAL) - ShowMessageBox(IDS_COPY_ACL_EINVAL_ERROR, MB_ICONEXCLAMATION, IDS_COPY_ACL_EINVAL_ERROR, strToDir); - else - ShowMessageBox(IDS_COPY_ACL_ERROR, MB_ICONEXCLAMATION, IDS_COPY_ACL_ERROR, strToDir, GetAfsError(errno, strToDir)); - return FALSE; - } - - ZapAcl(pToAcl); - - ShowMessageBox(IDS_COPY_ACL_OK, MB_OK, IDS_COPY_ACL_OK); - - return TRUE; -} - -CString ParseMountPoint(const CString strFile, CString strMountPoint) -{ - CString strType; - CString strVolume; - CString strCell; - CString strMountPointInfo; - - if (strMountPoint[0] == '#') - strType = "Regular"; - else if (strMountPoint[0] == '%') - strType = "Read/Write"; - - int nColon = strMountPoint.Find(':'); - if (nColon >= 0) { - strCell = strMountPoint.Mid(1, nColon - 1); - strVolume = strMountPoint.Mid(nColon + 1); - } else - strVolume = strMountPoint.Mid(1); - - strMountPointInfo = strFile + "\t" + strVolume + "\t" + strCell + "\t" + strType; - - return strMountPointInfo; -} - -BOOL ListMount(CStringArray& files) -{ - register LONG code; - struct ViceIoctl blob; - int error; - char orig_name[1024]; /* Original name, may be modified */ - char true_name[1024]; /* ``True'' dirname (e.g., symlink target) */ - char parent_dir[1024]; /* Parent directory of true name */ - register char *last_component; /* Last component of true name */ - CStringArray mountPoints; - - HOURGLASS hourglass; - - error = 0; - - for (int i = 0; i < files.GetSize(); i++) { - strcpy(orig_name, files[i]); - strcpy(true_name, orig_name); - - /* - * Find rightmost slash, if any. - */ - last_component = (char *)strrchr(true_name, '\\'); - if (last_component) { - /* - * Found it. Designate everything before it as the parent directory, - * everything after it as the final component. - */ - strncpy(parent_dir, true_name, last_component - true_name + 1); - parent_dir[last_component - true_name + 1] = 0; - last_component++; /* Skip the slash */ - } - else { - /* - * No slash appears in the given file name. Set parent_dir to the current - * directory, and the last component as the given name. - */ - fs_ExtractDriveLetter(true_name, parent_dir); - strcat(parent_dir, "."); - last_component = true_name; - fs_StripDriveLetter(true_name, true_name, sizeof(true_name)); - } - - blob.in = last_component; - blob.in_size = strlen(last_component) + 1; - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, MAXSIZE); - - code = pioctl(parent_dir, VIOC_AFS_STAT_MT_PT, &blob, 1); - if (code == 0) { - int nPos = strlen(space) - 1; - if (space[nPos] == '.') - space[nPos] = 0; - mountPoints.Add(ParseMountPoint(StripPath(files[i]), space)); - } else { - error = 1; - if (errno == EINVAL) - mountPoints.Add(GetMessageString(IDS_NOT_MOUNT_POINT_ERROR, StripPath(files[i]))); - else - mountPoints.Add(GetMessageString(IDS_LIST_MOUNT_POINT_ERROR, GetAfsError(errno, StripPath(files[i])))); - } - } - - CMountPointsDlg dlg; - dlg.SetMountPoints(mountPoints); - dlg.DoModal(); - - return !error; -} - -BOOL IsPathInAfs(const CHAR *strPath) -{ - struct ViceIoctl blob; - int code; - - HOURGLASS hourglass; - - blob.in_size = 0; - blob.out_size = MAXSIZE; - blob.out = space; - - code = pioctl((LPTSTR)((LPCTSTR)strPath), VIOC_FILE_CELL_NAME, &blob, 1); - if (code) - return FALSE; - return TRUE; -} - -/* return a static pointer to a buffer */ -static char *Parent(char *apath) -{ - register char *tp; - - strcpy(tspace, apath); - tp = strrchr(tspace, '\\'); - if (tp) { - *(tp+1) = 0; /* lv trailing slash so Parent("k:\foo") is "k:\" not "k:" */ - } - else { - fs_ExtractDriveLetter(apath, tspace); - strcat(tspace, "."); - } - - return tspace; -} - -BOOL MakeMount(const CString& strDir, const CString& strVolName, const CString& strCellName, BOOL bRW) -{ - register LONG code; - register char *cellName; - char localCellName[1000]; - struct ViceIoctl blob; - - HOURGLASS hourglass; - - ASSERT(strVolName.GetLength() < 64); - - /* - - defect #3069 - - if (as->parms[5].items && !as->parms[2].items) { - fprintf(stderr,"fs: must provide cell when creating cellular mount point.\n"); - return FALSE; - } - */ - - if (strCellName.GetLength() > 0) /* cell name specified */ - cellName = PCCHAR(strCellName); - else - cellName = (char *) 0; - - if (!IsPathInAfs(Parent(PCCHAR(strDir)))) { - ShowMessageBox(IDS_MAKE_MP_NOT_AFS_ERROR, MB_ICONEXCLAMATION, IDS_MAKE_MP_NOT_AFS_ERROR); - return FALSE; - } - - if (cellName) { - blob.in_size = 0; - blob.out_size = MAXSIZE; - blob.out = space; - code = pioctl(Parent(PCCHAR(strDir)), VIOC_FILE_CELL_NAME, &blob, 1); - } - - strcpy(localCellName, (cellName? cellName : space)); - - if (bRW) /* if -rw specified */ - strcpy(space, "%"); - else - strcpy(space, "#"); - - /* If cellular mount point, prepend cell prefix */ - if (cellName) { - strcat(space, localCellName); - strcat(space, ":"); - } - - strcat(space, strVolName); /* append volume name */ - strcat(space, "."); /* stupid convention; these end with a period */ - - /* create symlink with a special pioctl for Windows NT, since it doesn't - * have a symlink system call. - */ - blob.out_size = 0; - blob.in_size = 1 + strlen(space); - blob.in = space; - blob.out = NULL; - code = pioctl(PCCHAR(strDir), VIOC_AFS_CREATE_MT_PT, &blob, 0); - - if (code) { - ShowMessageBox(IDS_MOUNT_POINT_ERROR, MB_ICONEXCLAMATION, IDS_MOUNT_POINT_ERROR, GetAfsError(errno, strDir)); - return FALSE; - } - - return TRUE; -} - -/* -*/ -long fs_ExtractDriveLetter(const char *inPathp, char *outPathp) -{ - if (inPathp[0] != 0 && inPathp[1] == ':') { - /* there is a drive letter */ - *outPathp++ = *inPathp++; - *outPathp++ = *inPathp++; - *outPathp++ = 0; - } - else *outPathp = 0; - - return 0; -} - -/* strip the drive letter from a component */ -long fs_StripDriveLetter(const char *inPathp, char *outPathp, long outSize) -{ - char tempBuffer[1000]; - strcpy(tempBuffer, inPathp); - if (tempBuffer[0] != 0 && tempBuffer[1] == ':') { - /* drive letter present */ - strcpy(outPathp, tempBuffer+2); - } - else { - /* no drive letter present */ - strcpy(outPathp, tempBuffer); - } - return 0; -} - - -BOOL RemoveSymlink(const char * linkName) -{ - BOOL error = FALSE; - INT code=0; - struct ViceIoctl blob; - char tbuffer[1024]; - char lsbuffer[1024]; - char tpbuffer[1024]; - char *tp; - - HOURGLASS hourglass; - - tp = (char *) strrchr(linkName, '\\'); - if (!tp) - tp = (char *) strrchr(linkName, '/'); - if (tp) { - strncpy(tbuffer, linkName, code=tp-linkName+1); /* the dir name */ - tbuffer[code] = 0; - tp++; /* skip the slash */ - } - else { - fs_ExtractDriveLetter(linkName, tbuffer); - strcat(tbuffer, "."); - fs_StripDriveLetter(tp, tpbuffer, 0); - tp=tpbuffer; - } - blob.in = tp; - blob.in_size = strlen(tp)+1; - blob.out = lsbuffer; - blob.out_size = sizeof(lsbuffer); - code = pioctl(tbuffer, VIOC_LISTSYMLINK, &blob, 0); - if (code) - return FALSE; - blob.out_size = 0; - blob.in = tp; - blob.in_size = strlen(tp)+1; - return (pioctl(tbuffer, VIOC_DELSYMLINK, &blob, 0)==0); -} - -BOOL IsSymlink(const char * true_name) -{ - char parent_dir[MAXSIZE]; /*Parent directory of true name*/ - char strip_name[MAXSIZE]; - struct ViceIoctl blob; - char *last_component; - int code; - - HOURGLASS hourglass; - - last_component = (char *) strrchr(true_name, '\\'); - if (!last_component) - last_component = (char *) strrchr(true_name, '/'); - if (last_component) { - /* - * Found it. Designate everything before it as the parent directory, - * everything after it as the final component. - */ - strncpy(parent_dir, true_name, last_component - true_name + 1); - parent_dir[last_component - true_name + 1] = 0; - last_component++; /*Skip the slash*/ - } - else { - /* - * No slash appears in the given file name. Set parent_dir to the current - * directory, and the last component as the given name. - */ - fs_ExtractDriveLetter(true_name, parent_dir); - strcat(parent_dir, "."); - last_component = strip_name; - fs_StripDriveLetter(true_name, strip_name, sizeof(strip_name)); - } - - blob.in = last_component; - blob.in_size = strlen(last_component)+1; - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, MAXSIZE); - code = pioctl(parent_dir, VIOC_LISTSYMLINK, &blob, 1); - return (code==0); -} - - -BOOL IsMountPoint(const char * name) -{ - register LONG code = 0; - struct ViceIoctl blob; - char tbuffer[1024]; - char lsbuffer[1024]; - register char *tp; - char szCurItem[1024]; - strcpy(szCurItem, name); - - tp = (char *)strrchr(szCurItem, '\\'); - if (tp) { - strncpy(tbuffer, szCurItem, code = tp - szCurItem + 1); /* the dir name */ - tbuffer[code] = 0; - tp++; /* skip the slash */ - } else { - fs_ExtractDriveLetter(szCurItem, tbuffer); - strcat(tbuffer, "."); - tp = szCurItem; - fs_StripDriveLetter(tp, tp, 0); - } - - blob.in = tp; - blob.in_size = strlen(tp)+1; - blob.out = lsbuffer; - blob.out_size = sizeof(lsbuffer); - - code = pioctl(tbuffer, VIOC_AFS_STAT_MT_PT, &blob, 0); - - return (code==0); -} - - -/* - * Delete AFS mount points. Variables are used as follows: - * tbuffer: Set to point to the null-terminated directory name of the mount point - * (or ``.'' if none is provided) - * tp: Set to point to the actual name of the mount point to nuke. - */ -BOOL RemoveMount(CStringArray& files) -{ - register LONG code = 0; - struct ViceIoctl blob; - char tbuffer[1024]; - char lsbuffer[1024]; - register char *tp; - BOOL error = FALSE; - CStringArray results; - CString str; - CString str2; - - HOURGLASS hourglass; - - for (int i = 0; i < files.GetSize(); i++) { - if (!IsMountPoint(files[i])) { - error = TRUE; - if (errno == EINVAL) - results.Add(GetMessageString(IDS_NOT_MOUNT_POINT_ERROR, StripPath(files[i]))); - else - results.Add(GetMessageString(IDS_ERROR, GetAfsError(errno, StripPath(files[i])))); - continue; // don't bother trying - } - - blob.out_size = 0; - blob.in = tp; - blob.in_size = strlen(tp)+1; - - code = pioctl(tbuffer, VIOC_AFS_DELETE_MT_PT, &blob, 0); - if (code) { - error = TRUE; - results.Add(GetMessageString(IDS_ERROR, GetAfsError(errno, StripPath(files[i])))); - } else - results.Add(GetMessageString(IDS_DELETED)); - } - - LoadString (str, IDS_REMOVE_MP); - LoadString (str2, IDS_REMOVE_MP_COLUMN); - CResultsDlg dlg(REMOVE_MOUNT_POINTS_HELP_ID); - dlg.SetContents(str, str2, StripPath(files), results); - dlg.DoModal(); - - return !error; -} - -BOOL GetVolumeInfo(CString strFile, CVolInfo& volInfo) -{ - register LONG code; - struct ViceIoctl blob; - struct VolumeStatus *status; - char *name; - - HOURGLASS hourglass; - - volInfo.m_strFilePath = strFile; - volInfo.m_strFileName = StripPath(strFile); - - /* - volInfo.m_strName = "VolumeName"; - volInfo.m_nID = 10; - volInfo.m_nQuota = 20 * 1024 * 1024; - volInfo.m_nNewQuota = volInfo.m_nQuota; - volInfo.m_nUsed = volInfo.m_nQuota / 2; - volInfo.m_nPartSize = 50 * 1024 * 1024; - volInfo.m_nPartFree = 30 * 1024 * 1024; - volInfo.m_nDup = -1; - return TRUE; - */ - - blob.out_size = MAXSIZE; - blob.in_size = 0; - blob.out = space; - - code = pioctl(PCCHAR(strFile), VIOCGETVOLSTAT, &blob, 1); - if (code) { - volInfo.m_strErrorMsg = GetAfsError(errno, strFile); - return FALSE; - } - - status = (VolumeStatus *)space; - name = (char *)status + sizeof(*status); - - volInfo.m_strName = name; - volInfo.m_nID = status->Vid; - volInfo.m_nQuota = status->MaxQuota; - volInfo.m_nNewQuota = status->MaxQuota; - volInfo.m_nUsed = status->BlocksInUse; - volInfo.m_nPartSize = status->PartMaxBlocks; - volInfo.m_nPartFree = status->PartBlocksAvail; - volInfo.m_nDup = -1; - - return TRUE; -} - -BOOL SetVolInfo(CVolInfo& volInfo) -{ - register LONG code; - struct ViceIoctl blob; - struct VolumeStatus *status; - char *input; - - HOURGLASS hourglass; - - blob.out_size = MAXSIZE; - blob.in_size = sizeof(*status) + 3; /* for the three terminating nulls */ - blob.out = space; - blob.in = space; - - status = (VolumeStatus *)space; - status->MinQuota = -1; - status->MaxQuota = volInfo.m_nNewQuota; - - input = (char *)status + sizeof(*status); - *(input++) = '\0'; /* never set name: this call doesn't change vldb */ - *(input++) = '\0'; // No offmsg - *(input++) = '\0'; // No motd - -#ifdef LOGGING_ON - FILE *fp = OpenFile(szLogFileName, "a"); - if (fp) { - fprintf(fp, "\nSetVolInfo() pioctl parms:\n"); - fprintf(fp, "\tpathp = %s\n\topcode = VIOCSETVOLSTAT (%d)\n\tblobp = %ld\n", PCCHAR(volInfo.m_strFilePath), VIOCSETVOLSTAT, &blob); - fprintf(fp, "\t\tblobp.in = %ld (VolumeStatus *status)\n\t\tblobp.in_size = %ld\n\t\tblobp.out = %ld ((VolumeStatus *status))\n\t\tblobp.out_size = %ld\n", blob.in, blob.in_size, blob.out, blob.out_size); - fprintf(fp, "\t\t\tstatus->MinQuota = %ld\n", status->MinQuota); - fprintf(fp, "\t\t\tstatus->MaxQuota = %ld\n", status->MaxQuota); - fprintf(fp, "\t\t\tOther status fields aren't set\n"); - fprintf(fp, "\t\t\t3 nulls follow the VolumeStatus structure.\n"); - fprintf(fp, "\tfollow = 1\n"); - fclose(fp); - } -#endif - - code = pioctl(PCCHAR(volInfo.m_strFilePath), VIOCSETVOLSTAT, &blob, 1); - if (code) { - ShowMessageBox(IDS_SET_QUOTA_ERROR, MB_ICONEXCLAMATION, IDS_SET_QUOTA_ERROR, GetAfsError(errno, volInfo.m_strName)); - return FALSE; - } - - return TRUE; -} - -int GetCellName(char *cellNamep, struct afsconf_cell *infop) -{ - strcpy(infop->name, cellNamep); - return 0; -} - -BOOL CheckServers(const CString& strCellName, WHICH_CELLS nCellsToCheck, BOOL bFast) -{ - register LONG code; - struct ViceIoctl blob; - register LONG j; - LONG temp = 0; - struct afsconf_cell info; - struct chservinfo checkserv; - - HOURGLASS hourglass; - - memset(&checkserv, 0, sizeof(struct chservinfo)); - blob.in_size = sizeof(struct chservinfo); - blob.in = (caddr_t)&checkserv; - - blob.out_size = MAXSIZE; - blob.out = space; - memset(space, 0, sizeof(LONG)); /* so we assure zero when nothing is copied back */ - - /* prepare flags for checkservers command */ - if (nCellsToCheck == LOCAL_CELL) - temp = 2; /* default to checking local cell only */ - else if (nCellsToCheck == ALL_CELLS) - temp &= ~2; /* turn off local cell check */ - - if (bFast) - temp |= 1; /* set fast flag */ - - checkserv.magic = 0x12345678; /* XXX */ - checkserv.tflags = temp; - - /* now copy in optional cell name, if specified */ - if (nCellsToCheck == SPECIFIC_CELL) { - GetCellName(PCCHAR(strCellName), &info); - strcpy(checkserv.tbuffer,info.name); - checkserv.tsize = strlen(info.name) + 1; - } else { - strcpy(checkserv.tbuffer, "\0"); - checkserv.tsize = 0; - } - - checkserv.tinterval = -1; /* don't change current interval */ - - code = pioctl(0, VIOCCKSERV, &blob, 1); - if (code) { - ShowMessageBox(IDS_CHECK_SERVERS_ERROR, MB_ICONEXCLAMATION, IDS_CHECK_SERVERS_ERROR, GetAfsError(errno, CString())); - return FALSE; - } - - memcpy(&temp, space, sizeof(LONG)); - - if (temp == 0) { - ShowMessageBox(IDS_ALL_SERVERS_RUNNING, MB_OK, IDS_ALL_SERVERS_RUNNING); - return TRUE; - } - - CStringArray servers; - for (j = 0; j < MAXHOSTS; j++) { - memcpy(&temp, space + j * sizeof(LONG), sizeof(LONG)); - if (temp == 0) - break; - - char *name = hostutil_GetNameByINet(temp); - servers.Add(name); - } - - CDownServersDlg dlg; - dlg.SetServerNames(servers); - dlg.DoModal(); - - return TRUE; -} - -BOOL GetTokenInfo(CStringArray& tokenInfo) -{ - int cellNum; - int rc; - time_t current_time; - time_t tokenExpireTime; - char *expireString; - char userName[100]; -// char s[100]; - struct ktc_principal serviceName, clientName; - struct ktc_token token; - - CString strTokenInfo; - CString strUserName; - CString strCellName; - CString strExpir; - -// tokenInfo.Add(""); -// return TRUE; - - - HOURGLASS hourglass; - -// printf("\nTokens held by the Cache Manager:\n\n"); - cellNum = 0; - current_time = time(0); - - while (1) { - rc = ktc_ListTokens(cellNum, &cellNum, &serviceName); - if (rc == KTC_NOENT) { - /* end of list */ -// printf(" --End of list --\n"); - break; - } - else if (rc == KTC_NOCM) { - ShowMessageBox(IDS_GET_TOKENS_NO_AFS_SERVICE); -// printf("AFS service may not have started\n"); - break; - } - else if (rc) { - ShowMessageBox(IDS_GET_TOKENS_UNEXPECTED_ERROR, MB_ICONEXCLAMATION, IDS_GET_TOKENS_UNEXPECTED_ERROR, rc); - return FALSE; -// printf("Unexpected error, code %d\n", rc); -// exit(1); - } - else { - rc = ktc_GetToken(&serviceName, &token, sizeof(token), &clientName); - if (rc) { - ShowMessageBox(IDS_GET_TOKENS_UNEXPECTED_ERROR2, MB_ICONEXCLAMATION, IDS_GET_TOKENS_UNEXPECTED_ERROR2, - serviceName.name, serviceName.instance, serviceName.cell, rc); - continue; - } - - tokenExpireTime = token.endTime; - - strcpy(userName, clientName.name); - if (clientName.instance[0] != 0) { - strcat(userName, "."); - strcat(userName, clientName.instance); - } - - BOOL bShowName = FALSE; - - if (userName[0] == '\0') - ; //printf("Tokens"); -// AFS ID is not returned at this time. -// else if (strncmp(userName, "AFS ID", 6) == 0) -// printf("User's (%s) tokens", userName); -// sscanf(userName, "(AFS ID %s)", szAfsID); - else if (strncmp(userName, "Unix UID", 8) == 0) - ; //printf("Tokens"); - else - strUserName = userName; -// printf("User %s's tokens", userName); - -// printf(" for %s%s%s@%s ", serviceName.name, serviceName.instance[0] ? "." : "", serviceName.instance, serviceName.cell); - strCellName = serviceName.cell; - - if (tokenExpireTime <= current_time) - strExpir = "[>> Expired <<]"; -// printf("[>> Expired <<]\n"); - else { - expireString = ctime(&tokenExpireTime); - expireString += 4; /* Skip day of week */ - expireString[12] = '\0'; /* Omit secs & year */ -// printf("[Expires %s]\n", expireString); - strExpir.Format("%s", expireString); - } - - strTokenInfo = strUserName + "\t" + strCellName + "\t" + strExpir + "\t" + strCellName; - tokenInfo.Add(strTokenInfo); - } - } - -// printf("Press or when finished: "); -// gets(s); - return TRUE; -} - -UINT MakeSymbolicLink(const char *strName ,const char *strDir) -{ - struct ViceIoctl blob; - char space[MAXSIZE]; - UINT code; - - HOURGLASS hourglass; - - /*lets confirm its a good symlink*/ - if (!IsPathInAfs(strDir)) - return 1; - LPTSTR lpsz = new TCHAR[strlen(strDir)+1]; - _tcscpy(lpsz, strName); - strcpy(space, strDir); - blob.out_size = 0; - blob.in_size = 1 + strlen(space); - blob.in = space; - blob.out = NULL; - if ((code=pioctl(lpsz, VIOC_SYMLINK, &blob, 0))!=0) - return code; - return 0; -} - -void ListSymbolicLinkPath(const char *strName,char *strPath,UINT nlenPath) -{ - ASSERT(nlenPath -#include -} - -#include "stdafx.h" -#include "help.h" - - -static CString strHelpPath; - - -static BOOL IsWindowsNT (void) -{ - static BOOL fChecked = FALSE; - static BOOL fIsWinNT = FALSE; - - if (!fChecked) { - fChecked = TRUE; - - OSVERSIONINFO Version; - memset (&Version, 0x00, sizeof(Version)); - Version.dwOSVersionInfoSize = sizeof(Version); - - if (GetVersionEx (&Version)) { - if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) - fIsWinNT = TRUE; - } - } - - return fIsWinNT; -} - - - -void SetHelpPath(const char *pszDefaultHelpFilePath) -{ - CString str = pszDefaultHelpFilePath; - int nIndex = str.ReverseFind('\\'); - ASSERT(nIndex >= 0); - - if (IsWindowsNT()) - strHelpPath = str.Left(nIndex + 1) + HELPFILE_NATIVE; - else - strHelpPath = str.Left(nIndex + 1) + HELPFILE_LIGHT; -} - -void ShowHelp(HWND hWnd, DWORD nHelpID) -{ - ::WinHelp(hWnd, strHelpPath, HELPTYPE, nHelpID); -} - diff --git a/src/WINNT/client_exp/help.h b/src/WINNT/client_exp/help.h deleted file mode 100644 index 507d03d42..000000000 --- a/src/WINNT/client_exp/help.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#define HELPFILE_NATIVE "afs-nt.hlp" -#define HELPFILE_LIGHT "afs-light.hlp" - -#define HELPTYPE HELP_CONTEXT - -#define AUTHENTICATION_HELP_ID 16 -#define GET_TOKENS_HELP_ID 17 -#define DISCARD_TOKENS_HELP_ID 18 -#define SET_AFS_ACL_HELP_ID 19 -#define ADD_ACL_ENTRY_HELP_ID 20 -#define COPY_ACL_HELP_ID 21 -#define VOLUME_INFO_HELP_ID 27 -#define PARTITION_INFO_HELP_ID 28 -#define MOUNT_POINTS_HELP_ID 33 -#define REMOVE_MOUNT_POINTS_HELP_ID 34 -#define MAKE_MOUNT_POINT_HELP_ID 35 -#define SHOW_FILE_SERVERS_HELP_ID 38 -#define SHOW_CELL_HELP_ID 39 -#define SERVER_STATUS_HELP_ID 40 - -#define DOWN_SERVERS_HELP_ID 38 // What should this really be? - -#define SUBMOUNTS_HELP_ID 44 -#define ADD_SUBMT_HELP_ID 45 -#define EDIT_PATH_NAME_HELP_ID 46 - -void SetHelpPath(const char *pszDefaultHelpFilePath); -void ShowHelp(HWND hWnd, DWORD nHelpID); - diff --git a/src/WINNT/client_exp/hourglass.h b/src/WINNT/client_exp/hourglass.h deleted file mode 100755 index d78d2fa89..000000000 --- a/src/WINNT/client_exp/hourglass.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include - -typedef class HOURGLASS -{ - protected: - HCURSOR m_OldCursor; - - public: - HOURGLASS (LPCSTR idCursor = IDC_WAIT) - { - m_OldCursor = GetCursor(); - SetCursor (LoadCursor (NULL, idCursor)); - } - - virtual ~HOURGLASS (void) - { - SetCursor (m_OldCursor); - } - -} HOURGLASS, *PHOURGLASS; - diff --git a/src/WINNT/client_exp/klog_dlg.cpp b/src/WINNT/client_exp/klog_dlg.cpp deleted file mode 100644 index 1945b3976..000000000 --- a/src/WINNT/client_exp/klog_dlg.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "klog_dlg.h" -#include "hourglass.h" - -extern "C" { -#include -#include -#include "cm_config.h" -} - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -#define PCCHAR(str) ((char *)(const char *)str) - - -///////////////////////////////////////////////////////////////////////////// -// CKlogDlg dialog - -int kl_Authenticate(const CString& strCellName, const CString& strName, const CString& strPassword, char **reason) -{ - afs_int32 pw_exp; - - return ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION, PCCHAR(strName), "", PCCHAR(strCellName), PCCHAR(strPassword), 0, &pw_exp, 0, reason); -} - -CKlogDlg::CKlogDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CKlogDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CKlogDlg) - m_strName = _T(""); - m_strPassword = _T(""); - m_strCellName = _T(""); - //}}AFX_DATA_INIT - // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 -} - -void CKlogDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CKlogDlg) - DDX_Control(pDX, IDOK, m_OK); - DDX_Text(pDX, IDC_NAME, m_strName); - DDX_Text(pDX, IDC_PASSWORD, m_strPassword); - DDX_Text(pDX, IDC_CELL_NAME, m_strCellName); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CKlogDlg, CDialog) - //{{AFX_MSG_MAP(CKlogDlg) - ON_EN_CHANGE(IDC_NAME, OnChangeName) - ON_EN_CHANGE(IDC_CELL_NAME, OnChangeCellName) - ON_EN_CHANGE(IDC_PASSWORD, OnChangePassword) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CKlogDlg message handlers - -BOOL CKlogDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - if (m_strCellName.IsEmpty()) { - char defaultCell[256]; - long code = cm_GetRootCellName(defaultCell); - if (code < 0) - AfxMessageBox("Error determining root cell name."); - else - m_strCellName = defaultCell; - } - - UpdateData(FALSE); - - return TRUE; // return TRUE unless you set the focus to a control -} - -void CKlogDlg::OnOK() -{ - char *reason; - - UpdateData(); - - HOURGLASS hg; - - if (kl_Authenticate(m_strCellName, m_strName, m_strPassword, &reason)) { - AfxMessageBox(reason); - return; - } - - CDialog::OnOK(); -} - -void CKlogDlg::OnChangeName() -{ - CheckEnableOk(); -} - -void CKlogDlg::OnChangeCellName() -{ - CheckEnableOk(); -} - -void CKlogDlg:: CheckEnableOk() -{ - UpdateData(); - - m_OK.EnableWindow(!m_strCellName.IsEmpty() && !m_strName.IsEmpty() && !m_strPassword.IsEmpty()); -} - -void CKlogDlg::OnChangePassword() -{ - CheckEnableOk(); -} - -void CKlogDlg::OnHelp() -{ - ShowHelp(m_hWnd, GET_TOKENS_HELP_ID); -} - diff --git a/src/WINNT/client_exp/klog_dlg.h b/src/WINNT/client_exp/klog_dlg.h deleted file mode 100644 index fdd64d160..000000000 --- a/src/WINNT/client_exp/klog_dlg.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -// CKlogDlg dialog - -class CKlogDlg : public CDialog -{ - void CheckEnableOk(); - -// Construction -public: - CKlogDlg(CWnd* pParent = NULL); // standard constructor - - void SetCellName(const CString& strCellName) { m_strCellName = strCellName; } - -// Dialog Data - //{{AFX_DATA(CKlogDlg) - enum { IDD = IDD_KLOG_DIALOG }; - CButton m_OK; - CString m_strName; - CString m_strPassword; - CString m_strCellName; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CKlogDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - //{{AFX_MSG(CKlogDlg) - virtual BOOL OnInitDialog(); - virtual void OnOK(); - afx_msg void OnChangeName(); - afx_msg void OnChangeCellName(); - afx_msg void OnChangePassword(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/lang/NTMakefile b/src/WINNT/client_exp/lang/NTMakefile deleted file mode 100644 index 5e50b3493..000000000 --- a/src/WINNT/client_exp/lang/NTMakefile +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html - -# allow the resource compiler to search the dest\include tree - -AFSDEV_AUXRCFLAGS = $(AFSDEV_AUXRCFLAGS) -I$(DESTDIR)\include -I.. - -# include the primary makefile -RELDIR=WINNT\client_exp\lang -!INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\..\config\NTMakefile.version - -############################################################################ -# -# LANGUAGE -# -# To select which language to build, run the ntlang.bat batch file -# before performing a build. -# - -!IF ("$(LANGID)" == "") || ("$(LANGNAME)" == "") || ("$(LANGCP)" == "") -!ERROR Must select language before building (run NTLANG.BAT) -!ENDIF - -############################################################################ -# -# BUILD TARGETS -# - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\afs_shl_ext_$(LANGID).dll - -RCFILE = $(LANGNAME)\afs_shl_ext.rc - -RESFILE = $(OUT)\afs_shl_ext_$(LANGID).res - -DLLOBJS = $(RESFILE) - -############################################################################ - -$(DLLFILE) : $(DLLOBJS) - $(DLLRESLINK) - $(DLLPREP) - -install : $(DLLFILE) - -clean :: - $(DEL) $(OUT)\*.res RC* RD* $(DLLFILE) - -############################################################################ -# -# Dependencies -# - -$(RESFILE) : $(RCFILE) AFS_component_version_number.h - $(RC) /fo$(RESFILE) /c$(LANGCP) $(RCFILE) - - -mkdir: - - diff --git a/src/WINNT/client_exp/lang/afs_shl_ext.rc2 b/src/WINNT/client_exp/lang/afs_shl_ext.rc2 deleted file mode 100644 index f95064e0a..000000000 --- a/src/WINNT/client_exp/lang/afs_shl_ext.rc2 +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifdef APSTUDIO_INVOKED - #error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/src/WINNT/client_exp/lang/de_DE/afs_shl_ext.rc b/src/WINNT/client_exp/lang/de_DE/afs_shl_ext.rc deleted file mode 100644 index 3801a6dcf..000000000 --- a/src/WINNT/client_exp/lang/de_DE/afs_shl_ext.rc +++ /dev/null @@ -1,659 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // nicht mit Microsoft Visual C++ bearbeitete Ressourcen\r\n" - "#include ""afxres.rc"" // Standardkomponenten\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x407 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "Authentifizierung...", IDM_AUTHENTICATION - MENUITEM "Zugriffssteuerungslisten...", IDM_ACL_SET - POPUP "&Volume/Partition" - BEGIN - MENUITEM "&Merkmale...", IDM_VOLUME_PROPERTIES - MENUITEM "&Name/ID-Zuordnung aktualisieren", - IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "&Mount-Punkt" - BEGIN - MENUITEM "&Anzeigen...", IDM_MOUNTPOINT_SHOW - MENUITEM "&Entfernen...", IDM_MOUNTPOINT_REMOVE - MENUITEM "&Erstellen...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "Datei/Verz &Flush", IDM_FLUSH - MENUITEM "Vol&ume leeren", IDM_FLUSH_VOLUME - MENUITEM "&Datei-Server anzeigen...", IDM_SHOW_SERVER - MENUITEM "&Zellen anzeigen...", IDM_SHOWCELL - MENUITEM "Server-Status anzeigen...", IDM_SERVER_STATUS -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Volume-Informationen" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "Hilfe",9,240,150,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Datei/Verzeichnis",IDC_STATIC,10,10,63,10 - LTEXT "Name",IDC_STATIC,90,10,20,8 - LTEXT "Quote",IDC_STATIC,225,10,19,8 - LTEXT "Benutzt",IDC_STATIC,270,10,27,8 - LTEXT "%Benutzt",IDC_STATIC,305,10,31,8 - LTEXT "ID",IDC_STATIC,175,10,10,8 - LTEXT "Neue Quote:",IDC_STATIC,10,127,41,10 - EDITTEXT IDC_NEW_QUOTA,55,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "Informationen zur Partition anzeigen", - IDC_PARTITION_INFO,190,125,117,14,WS_DISABLED - LTEXT "KBytes",IDC_STATIC,118,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,106,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "fAFS-ACL festlegen" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",IDC_DIR_NAME,62,12,249,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Read",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,52,55,10 - CONTROL "w - Write",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - Lookup",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - Delete",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - Insert",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Lock",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - Administer",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,141,55,10 - PUSHBUTTON "&Hinzufügen...",IDC_ADD,270,45,45,14 - PUSHBUTTON "&Entfernen",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "&Bereinigen",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "&OK",IDOK,270,150,45,14 - PUSHBUTTON "&Abbrechen",IDCANCEL,270,175,45,14 - PUSHBUTTON "&Hilfe",9,270,201,45,14 - LTEXT "Verzeichnis:",IDC_STATIC,15,12,45,10 - GROUPBOX "Berechtigungen",IDC_STATIC,195,41,65,115 - LTEXT "Normale",IDC_STATIC,10,30,28,8 - LTEXT "Name",IDC_COLUMN_3,69,38,20,8 - LTEXT "Berechtigungen",IDC_STATIC,10,38,52,8 - LTEXT "Negative Zahlen",IDC_STATIC,10,125,30,8 - LTEXT "Berechtigungen",IDC_STATIC,10,133,52,8 - LTEXT "Name",IDC_COLUMN_4,69,133,31,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "Ko&pieren...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 219, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Mount-Punkt erstellen" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_DIR,51,10,159,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,51,25,159,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,51,40,159,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,20,81,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,85,81,50,14 - PUSHBUTTON "Hilfe",9,150,81,50,14 - LTEXT "Verzeichnis:",IDC_STATIC,7,12,37,10 - LTEXT "Volume:",IDC_STATIC,7,28,25,10 - LTEXT "Zelle:",IDC_STATIC,7,42,22,10 - GROUPBOX "",IDC_STATIC,45,52,117,20 - LTEXT "Optionen:",IDC_STATIC,9,59,32,10 - CONTROL "Regulär",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,48,59,38,10 - CONTROL "Lesen/Schreiben",IDC_RW,"Button",BS_AUTORADIOBUTTON,90, - 59,71,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 264, 114 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ACL-Eintrag hinzufügen" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,35,70,224,12,ES_AUTOHSCROLL - CONTROL "r - Read",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,45,10 - CONTROL "l - Lookup",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - Insert",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - Delete",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - Write",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Lock",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - Administer",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,35,60,10 - CONTROL "Normaler Eintrag",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,161,16,79,10 - CONTROL "Eingabe negativer Zahlen",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,161,26,96,10 - PUSHBUTTON "OK",IDOK,101,90,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,155,90,50,14 - PUSHBUTTON "Hilfe",9,209,90,50,14 - LTEXT "Name:",IDC_STATIC,10,72,20,8 - GROUPBOX "Berechtigungen",IDC_STATIC,10,5,135,55 - GROUPBOX "Eintragungsart",IDC_STATIC,155,6,105,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 139, 82 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Informationen zur Partition" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,63,10,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,63,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,63,40,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "Schließen",IDOK,18,62,40,14 - PUSHBUTTON "Hilfe",9,75,62,40,14 - LTEXT "% benutzt:",IDC_STATIC,6,42,41,8 - LTEXT "Blöcke frei:",IDC_STATIC,5,27,40,8 - LTEXT "Größe insgesamt:",IDC_STATIC,5,12,55,8 - LTEXT "KBytes",IDC_STATIC,105,12,25,8 - LTEXT "KBytes",IDC_STATIC,105,27,25,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ACL kopieren" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,181,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Durchsuchen",IDC_BROWSE,188,25,49,14 - CONTROL "Aktuelle Einträge löschen:",IDC_CLEAR,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,5,46,102,10 - DEFPUSHBUTTON "OK",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "Abbrechen",IDCANCEL,95,65,50,14 - PUSHBUTTON "Hilfe",9,170,65,50,14 - LTEXT "Kopieren von:",IDC_STATIC,5,12,47,8 - LTEXT "Kopieren nach:",IDC_STATIC,5,29,49,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Wo befindet sich" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Schließen",IDOK,65,145,50,14 - PUSHBUTTON "Hilfe",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Datei/Verzeichnis",IDC_STATIC,10,10,66,8 - LTEXT "Datei-Server",IDC_STATIC,128,10,56,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ergebnisse" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Schließen",IDOK,65,145,50,14 - PUSHBUTTON "Hilfe",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Datei/Verzeichnis",-1,10,10,69,8 - LTEXT "Ergebnis",IDC_RESULTS_LABEL,128,10,44,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Mount-Punkte" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Schließen",IDOK,65,145,50,14 - PUSHBUTTON "Hilfe",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Datei",IDC_STATIC,10,11,26,8 - LTEXT "Volume",IDC_STATIC,75,11,29,8 - LTEXT "Zelle",IDC_STATIC,155,11,20,8 - LTEXT "Typ",IDC_STATIC,230,11,20,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Inaktive Server" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "Diese Servers sind noch inaktiv:",IDC_STATIC,10,10,114, - 8 - DEFPUSHBUTTON "OK",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Server-Status" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Lokale Zelle",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,92,8 - CONTROL "Angegebene Zelle:",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,89,10 - CONTROL "Alle Zellen",IDC_ALL_CELLS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,20,65,45,10 - CONTROL "Server nicht testen",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,89,10 - PUSHBUTTON "Status anzeigen",IDC_SHOWSTATUS,5,120,58,14 - GROUPBOX "Zelle",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,88,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,47,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Schließen",IDCANCEL,67,120,50,14 - PUSHBUTTON "Hilfe",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Authentifizierung" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "Token erhalten",ID_GET_TOKENS,15,137,55,14 - PUSHBUTTON "Token löschen",ID_DISCARD_TOKENS,80,137,55,14 - PUSHBUTTON "Schließen",IDCANCEL,145,137,55,14 - PUSHBUTTON "Hilfe",9,215,137,55,14 - LTEXT "Benutzername",IDC_STATIC,10,9,57,8 - LTEXT "Zellenname",IDC_STATIC,104,9,47,8 - LTEXT "Verfall",IDC_STATIC,222,9,50,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 169, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Token erhalten" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,40,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,40,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,40,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "Abbrechen",IDCANCEL,67,70,43,14 - PUSHBUTTON "Hilfe",9,120,70,35,14 - LTEXT "Name:",IDC_STATIC,17,12,22,8 - LTEXT "Kennwort:",IDC_STATIC,5,32,34,8 - LTEXT "Zelle:",IDC_STATIC,17,52,19,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 185, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Token löschen" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,25,40,35,14 - PUSHBUTTON "Abbrechen",IDCANCEL,72,40,44,14 - PUSHBUTTON "Hilfe",9,125,40,35,14 - LTEXT "Zelle:",IDC_STATIC,10,17,21,8 - EDITTEXT IDC_CELL_NAME,40,15,136,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Submounts" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Hinzufügen ",IDC_ADD,202,20,45,14 - PUSHBUTTON "Löschen",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "Ändern",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "Submounts:",IDC_STATIC,10,10,50,8 - PUSHBUTTON "OK",IDOK,202,145,45,14 - PUSHBUTTON "Abbrechen",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 229, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Submount hinzufügen" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_SHARE_NAME,77,8,141,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,77,23,141,12,ES_AUTOHSCROLL - PUSHBUTTON "OK",IDOK,22,53,45,14 - PUSHBUTTON "Abbrechen",IDCANCEL,92,53,45,14 - PUSHBUTTON "Hilfe",9,167,53,45,14 - LTEXT "Gemeinsam benutzter Name:",IDC_STATIC,18,7,60,15 - LTEXT "Pfadname:",IDC_STATIC,18,25,41,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 178 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 222 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "Bei oder von AFS anmelden oder abmelden" - ID_SERVER_STATUS "Server überprüfen" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "Leeren der aktiven Datei %o nicht möglich" - IDS_FLUSH_ERROR "Fehler beim Leeren von Datei %o: %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "Ausgewählte Datei(en) erfolgreich geleert" - IDS_CANT_GET_CELL "Fehler beim Bestimmen der Zelle: " - IDS_FLUSH_VOLUME_ERROR "Fehler beim Leeren des Volume für %o: %s" - IDS_FLUSH_VOLUME_OK "Volume erfolgreich geleert" - IDS_WHERE_IS "Datei %o befindet sich auf Host %s" - IDS_CLEANACL_NOT_SUPPORTED - "ACL für Datei %o kann nicht bereinigt werden: Clean Acl wird für DFS-Zugriffslisten nicht unterstützt" - IDS_ACL_IS_FINE "Zugriffsliste für %o ist sauber" - IDS_CLEANACL_INVALID_ARG - "ACL für Datei %o kann nicht bereinigt werden: Ungültiges Argument; mögliche Gründe: Datei nicht stellvertretend oder zu viele Benutzer in der Zugriffssteuerungsliste" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "Veraltete ACL-Einträge sind gelöscht worden." - ID_SUBMOUNTS "AFS-Submount erstellen oder löschen" - IDS_GETRIGHTS_ERROR "Zugriffsliste für Verzeichnis %o konnte nicht gelesen werden: %o" - IDS_DFSACL_ERROR "Mit diesem Befehl können DFS-ACLs nicht editiert werden" - IDS_SAVE_ACL_ERROR "ACL für %o kann nicht gespeichert werden: %o" - IDS_SAVE_ACL_EINVAL_ERROR - "ACL für %o kann nicht gespeichert werden: Ungültiges Argument; mögliche Gründe: Datei nicht in AFS; zu viele Benutzer in der Zugriffssteuerungsliste; es wurde versucht, einen nicht vorhandenen Benutzer zur Zugriffssteuerungsliste hinzuzufügen" - IDS_ACL_READ_ERROR "ACL für %o kann nicht gelesen werden: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "ACL kann nicht in Verzeichnis %o kopiert werden: Copy ACL wird für DFS-Zugriffslisten nicht unterstützt" - IDS_COPY_ACL_EINVAL_ERROR - "ACL kann nicht in Verzeichnis %o kopiert werden: Ungültiges Argument; mögliche Gründe: Datei nicht in AFS." - IDS_COPY_ACL_ERROR "ACL kann nicht nach %o kopiert werden: %o" - IDS_NOT_MOUNT_POINT_ERROR "%o ist kein Mount-Punkt." - IDS_LIST_MOUNT_POINT_ERROR "Fehler: %o" - IDS_MAKE_MP_NOT_AFS_ERROR - "Mount-Punkte müssen innerhalb des AFS-Dateisystems erstellt werden" - IDS_MOUNT_POINT_ERROR "Fehler beim Erstellen des Mount-Punktes: %o" - IDS_ERROR "Fehler: %o" - IDS_DELETED "Erfolgreich gelöscht" - IDS_SET_QUOTA_ERROR "Quote für Fehlereinstellungen: %o" - ID_SUBMOUNTS_CREATE "Ein AFS-Submount erstellen" - ID_SUBMOUNTS_EDIT "AFS-Submounts hinzufügen, ändern oder löschen" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "Fehler beim Überprüfen des Status von Datei-Server-Maschinen: %o" - IDS_ALL_SERVERS_RUNNING "Alle Server sind aktiv." - IDS_CHECK_VOLUMES_OK "Alle VolumeID/Name-Zuordnungen überprüft." - IDS_CHECK_VOLUMES_ERROR "Fehler beim Überprüfen von VolumeID/Name-Zuordnungen: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE - "Der von Ihnen ausgewählte Name ist bereits in Gebrauch. Bitte geben Sie einen anderen Namen ein." - IDS_REALLY_DEL_MOUNT_POINTS - "Sind Sie sicher, daß Sie den (die) ausgewählten Mount-Punkt(e) entfernen möchten?" - IDS_DIR_DOES_NOT_EXIST_ERROR "Das Verzeichnis '%o' ist nicht vorhanden." - IDS_CLEANACL_MSG "Veraltete ACLs werden gelöscht!" - IDS_COPY_ACL_OK "ACL erfolgreich kopiert." - IDS_GET_TOKENS_NO_AFS_SERVICE - "Token-Informationen können nicht gelesen werden: AFS-Service wurde vieleicht noch nicht gestartet." - IDS_GET_TOKENS_UNEXPECTED_ERROR - "Token-Informationen können nicht gelesen werden: Unerwarteter Fehler, Code %d." - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "Token-Informationen können nicht gelesen werden: Unerwarteter Fehler, Service %s.%s.%s, Code %d." - IDS_ENTER_QUOTA "Bitte geben Sie eine gültige Quote ein." - IDS_AUTHENTICATION_ITEM "&Authentifizierung..." - IDS_ACLS_ITEM "&Zugriffssteuerungslisten..." - IDS_VOL_PART_ITEM "&Volume/Partition" - IDS_VOL_PART_PROPS_ITEM "&Merkmale" - IDS_VOL_PART_REFRESH_ITEM "&Name/ID-Zuordnung aktualisieren" - IDS_MOUNT_POINT_ITEM "&Mount-Punkt" - IDS_MP_SHOW_ITEM "&Anzeigen..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "&Entfernen..." - IDS_MP_MAKE_ITEM "&Erstellen..." - IDS_FLUSH_FILE_DIR_ITEM "Datei/Verz leeren" - IDS_FLUSH_VOLUME_ITEM "Vol&ume leeren" - IDS_SHOW_FILE_SERVERS_ITEM "&Datei-Server anzeigen..." - IDS_SHOW_CELL_ITEM "&Zellen anzeigen..." - IDS_SHOW_SERVER_STATUS_ITEM "Server-Status anzeigen..." - IDS_AFS_ITEM "&AFS" - IDS_SUBMOUNTS_ITEM "Su&bmounts" - IDS_GET_SUBMT_INFO_ERROR - "Submount-Informationen für gemeinsam benutzten Namen %o können nicht gelesen werden." - IDS_REALLY_DELETE_SUBMT "Gemeinsam benutzten Namen %o löschen?" - IDS_SUBMT_SAVE_FAILED "Ihre Änderungen der Submount-Datenbank sind fehlgeschlagen." - IDS_SUBMOUNTS_CREATE_ITEM "&Hinzufügen" - IDS_SUBMOUNTS_EDIT_ITEM "&Editieren..." - IDS_EDIT_PATH_NAME "Pfadname editieren" - IDS_SHOW_CELL "Zelle anzeigen" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "Zelle" - IDS_SHOW_FS "Datei-Server anzeigen" - IDS_SHOW_FS_COLUMN "Datei-Server" - IDS_REMOVE_MP "Mount-Punkte entfernen" - IDS_REMOVE_MP_COLUMN "Ergebnis" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS Client" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#endif -#include "afs_shl_ext.rc2" // nicht mit Microsoft Visual C++ bearbeitete Ressourcen -#include "afxres.rc" // Standardkomponenten -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc b/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc deleted file mode 100644 index 75edee5af..000000000 --- a/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc +++ /dev/null @@ -1,692 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x409 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "Authentication...", IDM_AUTHENTICATION - MENUITEM "Access Control Lists...", IDM_ACL_SET - POPUP "&Volume/Partition" - BEGIN - MENUITEM "&Properties...", IDM_VOLUME_PROPERTIES - MENUITEM "&Refresh name/ID map", IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "&Mount Point" - BEGIN - MENUITEM "&Show...", IDM_MOUNTPOINT_SHOW - MENUITEM "&Remove...", IDM_MOUNTPOINT_REMOVE - MENUITEM "&Make...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "&Flush File/Dir", IDM_FLUSH - MENUITEM "Flush Vol&ume", IDM_FLUSH_VOLUME - MENUITEM "Show &File Servers...", IDM_SHOW_SERVER - MENUITEM "Show &Cell...", IDM_SHOWCELL - MENUITEM "Show Server Status...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Volume Information" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "Help",9,240,150,50,14 - PUSHBUTTON "Cancel",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "File/Directory",IDC_STATIC,10,10,44,10 - LTEXT "Name",IDC_STATIC,90,10,20,8 - LTEXT "Quota",IDC_STATIC,225,10,19,8 - LTEXT "Used",IDC_STATIC,270,10,20,8 - LTEXT "%Used",IDC_STATIC,305,10,25,8 - LTEXT "ID",IDC_STATIC,175,10,10,8 - LTEXT "New Quota:",IDC_STATIC,10,127,40,10 - EDITTEXT IDC_NEW_QUOTA,55,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "Show Partition Info",IDC_PARTITION_INFO,205,125,69,14, - WS_DISABLED - LTEXT "KBytes",IDC_STATIC,118,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,106,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Set AFS ACL" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",IDC_DIR_NAME,51,12,259,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Read",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,52,55,10 - CONTROL "w - Write",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - Lookup",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - Delete",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - Insert",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Lock",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - Administer",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,141,55,10 - PUSHBUTTON "&Add...",IDC_ADD,270,45,45,14 - PUSHBUTTON "&Remove",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "&Clean",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "&OK",IDOK,270,150,45,14 - PUSHBUTTON "Ca&ncel",IDCANCEL,270,175,45,14 - PUSHBUTTON "&Help",9,270,201,45,14 - LTEXT "Directory:",IDC_STATIC,15,12,30,10 - GROUPBOX "Permissions",IDC_STATIC,195,41,65,115 - LTEXT "Normal",IDC_STATIC,10,30,23,8 - LTEXT "Name",IDC_COLUMN_3,69,38,20,8 - LTEXT "Permissions",IDC_STATIC,10,38,37,8 - LTEXT "Negative",IDC_STATIC,10,125,30,8 - LTEXT "Permissions",IDC_STATIC,10,133,38,8 - LTEXT "Name",IDC_COLUMN_4,69,133,20,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "Co&py...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 219, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Make Mount Point" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_DIR,40,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,40,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,40,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,20,81,50,14 - PUSHBUTTON "Cancel",IDCANCEL,85,81,50,14 - PUSHBUTTON "Help",9,150,81,50,14 - LTEXT "Directory:",IDC_STATIC,5,12,30,10 - LTEXT "Volume:",IDC_STATIC,10,28,25,10 - LTEXT "Cell:",IDC_STATIC,21,42,15,10 - GROUPBOX "",IDC_STATIC,40,52,115,20 - LTEXT "Options:",IDC_STATIC,9,59,25,10 - CONTROL "Regular",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,45,59,41,10 - CONTROL "Read/Write",IDC_RW,"Button",BS_AUTORADIOBUTTON,100,59, - 50,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 235, 113 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add ACL Entry" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,35,70,190,12,ES_AUTOHSCROLL - CONTROL "r - Read",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,45,10 - CONTROL "l - Lookup",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - Insert",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - Delete",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - Write",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Lock",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - Administer",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,35,60,10 - CONTROL "Normal Entry",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,161,16,54,10 - CONTROL "Negative Entry",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,161,26,59,10 - PUSHBUTTON "OK",IDOK,22,90,50,14 - PUSHBUTTON "Cancel",IDCANCEL,92,90,50,14 - PUSHBUTTON "Help",9,162,90,50,14 - LTEXT "Name:",IDC_STATIC,10,72,20,8 - GROUPBOX "Permissions",IDC_STATIC,10,5,135,55 - GROUPBOX "Entry Type",IDC_STATIC,155,6,70,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 123, 83 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Partition Info" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,50,10,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,50,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,50,40,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "Close",IDOK,14,62,40,14 - PUSHBUTTON "Help",9,69,62,40,14 - LTEXT "% Used:",IDC_STATIC,20,42,27,8 - LTEXT "Blocks Free:",IDC_STATIC,5,27,40,8 - LTEXT "Total Size:",IDC_STATIC,10,12,34,8 - LTEXT "K Bytes",IDC_STATIC,92,12,25,8 - LTEXT "K Bytes",IDC_STATIC,92,27,25,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Copy ACL" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Browse",IDC_BROWSE,195,25,35,15 - CONTROL "Clear Current Entries:",IDC_CLEAR,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,10,46,82,10 - DEFPUSHBUTTON "OK",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "Cancel",IDCANCEL,95,65,50,14 - PUSHBUTTON "Help",9,170,65,50,14 - LTEXT "Copy From:",IDC_STATIC,15,12,35,8 - LTEXT "Copy To:",IDC_STATIC,20,29,30,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Where Is" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Close",IDOK,65,145,50,14 - PUSHBUTTON "Help",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "File/Directory",IDC_STATIC,10,10,47,8 - LTEXT "File Server(s)",IDC_STATIC,128,10,44,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Results" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Close",IDOK,65,145,50,14 - PUSHBUTTON "Help",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "File/Directory",-1,10,10,45,8 - LTEXT "Result",IDC_RESULTS_LABEL,128,10,44,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Mount Points" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Close",IDOK,65,145,50,14 - PUSHBUTTON "Help",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "File",IDC_STATIC,10,11,13,8 - LTEXT "Volume",IDC_STATIC,75,11,27,8 - LTEXT "Cell",IDC_STATIC,155,11,15,8 - LTEXT "Type",IDC_STATIC,230,11,20,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Down Servers" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "These servers are still down:",IDC_STATIC,10,10,95,8 - DEFPUSHBUTTON "OK",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Server Status" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Local Cell",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,50,8 - CONTROL "Specified Cell:",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,60,10 - CONTROL "All Cells",IDC_ALL_CELLS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,20,65,45,10 - CONTROL "Do not probe servers",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,80,10 - PUSHBUTTON "Show Status",IDC_SHOWSTATUS,10,120,50,14 - GROUPBOX "Cell",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,90,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,47,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Close",IDCANCEL,65,120,50,14 - PUSHBUTTON "Help",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Authentication" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "Get Tokens",ID_GET_TOKENS,15,137,55,14 - PUSHBUTTON "Discard Tokens",ID_DISCARD_TOKENS,80,137,55,14 - PUSHBUTTON "Close",IDCANCEL,145,137,55,14 - PUSHBUTTON "Help",9,215,137,55,14 - LTEXT "User Name",IDC_STATIC,10,9,38,8 - LTEXT "Cell Name",IDC_STATIC,104,9,33,8 - LTEXT "Expiration",IDC_STATIC,222,9,32,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 169, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Get Tokens" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - EDITTEXT IDC_NAME,40,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,40,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,40,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "Cancel",IDCANCEL,70,70,35,14 - PUSHBUTTON "Help",9,120,70,35,14 - LTEXT "Name:",IDC_STATIC,17,12,22,8 - LTEXT "Password:",IDC_STATIC,5,32,34,8 - LTEXT "Cell:",IDC_STATIC,24,52,15,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 185, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Discard Tokens" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,25,40,35,14 - PUSHBUTTON "Cancel",IDCANCEL,75,40,35,14 - PUSHBUTTON "Help",9,125,40,35,14 - LTEXT "Cell:",IDC_STATIC,10,17,14,8 - EDITTEXT IDC_CELL_NAME,29,15,145,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Submounts" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Add ",IDC_ADD,202,20,45,14 - PUSHBUTTON "Delete",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "Change",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "Submounts:",IDC_STATIC,10,10,50,8 - PUSHBUTTON "OK",IDOK,202,145,45,14 - PUSHBUTTON "Cancel",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 235, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add Submount" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_SHARE_NAME,62,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,62,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "OK",IDOK,22,53,45,14 - PUSHBUTTON "Cancel",IDCANCEL,92,53,45,14 - PUSHBUTTON "Help",9,167,53,45,14 - LTEXT "Submount Name:",IDC_STATIC,18,10,29,8 - LTEXT "Path Name:",IDC_STATIC,19,25,28,8 -END - -IDD_SYMBOLICLINK_ADD DIALOG DISCARDABLE 0, 0, 235, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add Symbolic Link" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,62,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_DIR,62,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "OK",IDOK,22,53,45,14 - PUSHBUTTON "Cancel",IDCANCEL,92,53,45,14 - PUSHBUTTON "Help",9,167,53,45,14 - LTEXT "Link Name:",IDC_STATIC,18,10,29,8 - LTEXT "Path Name:",IDC_STATIC,19,25,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 178 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "Log into or out of AFS" - ID_SERVER_STATUS "Check Servers" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "Can't flush active file %o" - IDS_FLUSH_ERROR "Error flushing file %o: %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "Selected file(s) flushed successfully" - IDS_CANT_GET_CELL "Error determining cell: " - IDS_FLUSH_VOLUME_ERROR "Error flushing volume for %o: %s" - IDS_FLUSH_VOLUME_OK "Volume flushed successfully" - IDS_WHERE_IS "File %o is on host %s" - IDS_CLEANACL_NOT_SUPPORTED - "Cannot clean ACL for file %o: clean Acl is not supported for DFS access lists" - IDS_ACL_IS_FINE "Access list for %o is fine" - IDS_CLEANACL_INVALID_ARG - "Cannot clean ACL for file %o: Invalid argument, possible reasons include: file not in vice or too many users on access control list" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "Obsolete ACL entries have been deleted." - ID_SUBMOUNTS "Create or delete an AFS submount" - IDS_GETRIGHTS_ERROR "Unable to read access list for directory %o: %o" - IDS_DFSACL_ERROR "Cannot edit DFS ACLs with this command" - IDS_SAVE_ACL_ERROR "Cannot save ACL for %o: %o" - IDS_SAVE_ACL_EINVAL_ERROR - "Cannot save ACL for %o: Invalid argument, possible reasons include: file not in AFS, too many users on access control list, tried to add non-existent user to access control list" - IDS_ACL_READ_ERROR "Cannot read ACL for %o: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "Cannot copy ACL to dir %o: copy ACL is not supported for DFS access lists" - IDS_COPY_ACL_EINVAL_ERROR - "Cannot copy ACL to dir %o: Invalid argument, possible reasons include: File not in AFS." - IDS_COPY_ACL_ERROR "Cannot copy ACL to %o: %o" - IDS_NOT_MOUNT_POINT_ERROR "%o is not a mount point." - IDS_LIST_MOUNT_POINT_ERROR "Error: %o" - IDS_MAKE_MP_NOT_AFS_ERROR - "Mount points must be created within the AFS file system" - IDS_MOUNT_POINT_ERROR "Error creating mount point: %o" - IDS_ERROR "Error: %o" - IDS_DELETED "Deleted successfully" - IDS_SET_QUOTA_ERROR "Error setting quota: %o" - ID_SUBMOUNTS_CREATE "Create an AFS submount" - ID_SUBMOUNTS_EDIT "Add, change or delete AFS submounts" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "Error checking status of file server machines: %o" - IDS_ALL_SERVERS_RUNNING "All servers are running." - IDS_CHECK_VOLUMES_OK "All volumeID/name mappings checked." - IDS_CHECK_VOLUMES_ERROR "Error checking volumeID/name mappings: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE - "The name you have chosen is already in use. Please enter a different name." - IDS_REALLY_DEL_MOUNT_POINTS - "Are you sure you want to remove the selected mount point(s)?" - IDS_DIR_DOES_NOT_EXIST_ERROR "The directory '%o' does not exist." - IDS_CLEANACL_MSG "Obsolete ACLs will be deleted!" - IDS_COPY_ACL_OK "ACL copied successfully." - IDS_GET_TOKENS_NO_AFS_SERVICE - "Cannot read token information: AFS service may not have started." - IDS_GET_TOKENS_UNEXPECTED_ERROR - "Cannot read token information: Unexpected Error, code %d." - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "Cannot read token information: Unexpected error, service %s.%s.%s, code %d." - IDS_ENTER_QUOTA "Please enter a valid quota." - IDS_AUTHENTICATION_ITEM "&Authentication..." - IDS_ACLS_ITEM "Access &Control Lists..." - IDS_VOL_PART_ITEM "&Volume/Partition" - IDS_VOL_PART_PROPS_ITEM "&Properties" - IDS_VOL_PART_REFRESH_ITEM "&Refresh name/ID map" - IDS_MOUNT_POINT_ITEM "&Mount Point" - IDS_MP_SHOW_ITEM "&Show..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "&Remove..." - IDS_MP_MAKE_ITEM "&Make..." - IDS_FLUSH_FILE_DIR_ITEM "&Flush File/Dir" - IDS_FLUSH_VOLUME_ITEM "Flush Vol&ume" - IDS_SHOW_FILE_SERVERS_ITEM "Show &File Servers..." - IDS_SHOW_CELL_ITEM "Show &Cell..." - IDS_SHOW_SERVER_STATUS_ITEM "Show Server Status..." - IDS_AFS_ITEM "&AFS" - IDS_SUBMOUNTS_ITEM "Su&bmounts" - IDS_GET_SUBMT_INFO_ERROR - "Unable to read submount information for sharename %o." - IDS_REALLY_DELETE_SUBMT "Delete sharename %o?" - IDS_SUBMT_SAVE_FAILED "Your changes to the submount database have failed." - IDS_SUBMOUNTS_CREATE_ITEM "&Add" - IDS_SUBMOUNTS_EDIT_ITEM "&Edit..." - IDS_EDIT_PATH_NAME "Edit Path Name" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL "Show Cell" - IDS_SHOW_CELL_COLUMN "Cell" - IDS_SHOW_FS "Show File Servers" - IDS_SHOW_FS_COLUMN "File Server(s)" - IDS_REMOVE_MP "Remove Mount Points" - IDS_REMOVE_MP_COLUMN "Result" - IDS_REMOVE_SYMLINK_ITEM "&Remove Symbolic Link" - IDS_REALLY_REMOVE_SYMLINK "Are you sure you want to remove the selected Symbolic Link?" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SYMBOLICLINK_ADD "&Add" - IDS_SYMBOLICLINK_EDIT "&Edit..." - IDS_SYMBOLICLINK_REMOVE "&Remove" - IDS_SYMBOLIC_LINK_ITEM "Symbolic &Link" - IDS_UNABLE_TO_CREATE_SYMBOLIC_LINK "Unable to create symbolic link: %o." - IDS_UNABLE_TO_SET_CURRENT_DIRECTORY "Unable to set current directory." - IDS_CURRENT_DIRECTORY_PATH_TOO_LONG "Current directory pathname is too long." - IDS_CLEANACL_ERROR "Error Cleaning ACL(s)" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS Client" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/es_ES/afs_shl_ext.rc b/src/WINNT/client_exp/lang/es_ES/afs_shl_ext.rc deleted file mode 100644 index 871a9ae11..000000000 --- a/src/WINNT/client_exp/lang/es_ES/afs_shl_ext.rc +++ /dev/null @@ -1,677 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x40a -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "Autentificación...", IDM_AUTHENTICATION - MENUITEM "Listas de control de acceso...", IDM_ACL_SET - POPUP "Vo&lumen/Partición" - BEGIN - MENUITEM "&Propiedades...", IDM_VOLUME_PROPERTIES - MENUITEM "&Actualizar nombre/mapa de ID", - IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "Punto de monta&je" - BEGIN - MENUITEM "&Mostrar...", IDM_MOUNTPOINT_SHOW - MENUITEM "&Eliminar...", IDM_MOUNTPOINT_REMOVE - MENUITEM "&Crear...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "&Descargar archivo/dir", IDM_FLUSH - MENUITEM "Descargar vol&umen", IDM_FLUSH_VOLUME - MENUITEM "Mostrar ser&vidores de archivo...", IDM_SHOW_SERVER - MENUITEM "Mostrar &célula...", IDM_SHOWCELL - MENUITEM "Mostrar estado de servidor...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Información de volumen" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "Ayuda",9,240,150,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Archivo/directorio",IDC_STATIC,10,10,74,10 - LTEXT "Nombre",IDC_STATIC,90,10,71,8 - LTEXT "Cuota",IDC_STATIC,225,10,38,8 - LTEXT "Utilizado",IDC_STATIC,270,10,32,8 - LTEXT "%Utilizado",IDC_STATIC,305,10,34,8 - LTEXT "ID",IDC_STATIC,175,10,42,8 - LTEXT "Cuota nueva:",IDC_STATIC,10,127,46,10 - EDITTEXT IDC_NEW_QUOTA,58,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "Mostrar información de partición",IDC_PARTITION_INFO, - 205,125,112,14,WS_DISABLED - LTEXT "KBytes",IDC_STATIC,128,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,115,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Establecer ACL de AFS" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",IDC_DIR_NAME,51,12,259,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Leer",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,52,55,10 - CONTROL "w - Grabar",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - Buscar",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - Suprimir",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - Insertar",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Bloquear",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - Administrar",IDC_ADMINISTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,200,141,61,10 - PUSHBUTTON "Aña&dir...",IDC_ADD,270,45,45,14 - PUSHBUTTON "&Eliminar",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "&Borrar",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "&Aceptar",IDOK,270,150,45,14 - PUSHBUTTON "Ca&ncelar",IDCANCEL,270,175,45,14 - PUSHBUTTON "A&yuda",9,270,201,45,14 - LTEXT "Directorio:",IDC_STATIC,15,12,34,10 - GROUPBOX "Permisos",IDC_STATIC,195,41,71,115 - LTEXT "normales",IDC_STATIC,10,36,30,8 - LTEXT "Nombre",IDC_COLUMN_3,69,38,36,8 - LTEXT "Permisos",IDC_STATIC,10,28,37,8 - LTEXT "negativos",IDC_STATIC,9,132,38,8 - LTEXT "Permisos",IDC_STATIC,9,124,38,8 - LTEXT "Nombre",IDC_COLUMN_4,69,133,42,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "Co&piar...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 223, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Crear punto de montaje" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_DIR,45,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,45,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,45,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,20,81,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,85,81,50,14 - PUSHBUTTON "Ayuda",9,150,81,50,14 - LTEXT "Directorio:",IDC_STATIC,8,12,33,10 - LTEXT "Volumen:",IDC_STATIC,10,28,33,10 - LTEXT "Célula:",IDC_STATIC,18,42,25,10 - GROUPBOX "",IDC_STATIC,47,52,115,20 - LTEXT "Opciones:",IDC_STATIC,10,59,35,10 - CONTROL "Normales",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,51,59,41,10 - CONTROL "Leer/Grabar",IDC_RW,"Button",BS_AUTORADIOBUTTON,103,59, - 57,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 250, 114 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Añadir entrada de ACL" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,48,70,190,12,ES_AUTOHSCROLL - CONTROL "r - Leer",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,45,10 - CONTROL "l - Buscar",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - Insertar",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - Suprimir",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - Grabar",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Bloquear",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - Administrar",IDC_ADMINISTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,80,35,60,10 - CONTROL "Entrada normal",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,161,16,69,10 - CONTROL "Entrada negativa",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,161,26,72,10 - PUSHBUTTON "Aceptar",IDOK,22,90,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,92,90,50,14 - PUSHBUTTON "Ayuda",9,162,90,50,14 - LTEXT "Nombre:",IDC_STATIC,10,72,32,8 - GROUPBOX "Permisos",IDC_STATIC,10,5,135,55 - GROUPBOX "Tipo de entrada",IDC_STATIC,155,6,84,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 152, 82 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Información de partición" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,61,10,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,61,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,61,40,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "Cerrar",IDOK,14,62,40,14 - PUSHBUTTON "Ayuda",9,69,62,40,14 - LTEXT "% Utilizado:",IDC_STATIC,19,42,38,8 - LTEXT "Bloques libres:",IDC_STATIC,10,27,47,8 - LTEXT "Tamaño total:",IDC_STATIC,12,12,46,8 - LTEXT "Kilobytes",IDC_STATIC,106,12,33,8 - LTEXT "Kilobytes",IDC_STATIC,105,27,37,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Copiar ACL" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Examinar",IDC_BROWSE,191,25,39,15 - CONTROL "Borrar entradas actuales:",IDC_CLEAR,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,10,46,97,10 - DEFPUSHBUTTON "Aceptar",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "Cancelar",IDCANCEL,95,65,50,14 - PUSHBUTTON "Ayuda",9,170,65,50,14 - LTEXT "Copiar desde:",IDC_STATIC,8,12,44,8 - LTEXT "Copiar a:",IDC_STATIC,22,29,30,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Dónde está" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Cerrar",IDOK,65,145,50,14 - PUSHBUTTON "Ayuda",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Archivo/directorio",IDC_STATIC,10,10,111,8 - LTEXT "Servidor(es) de archivos",IDC_STATIC,128,10,130,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Resultados" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Cerrar",IDOK,65,145,50,14 - PUSHBUTTON "Ayuda",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Archivo/directorio",-1,10,10,105,8 - LTEXT "Resultado",IDC_RESULTS_LABEL,128,10,148,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Puntos de montaje" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Cerrar",IDOK,65,145,50,14 - PUSHBUTTON "Ayuda",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Archivo",IDC_STATIC,10,11,53,8 - LTEXT "Volumen",IDC_STATIC,75,11,66,8 - LTEXT "Célula",IDC_STATIC,155,11,63,8 - LTEXT "Tipo",IDC_STATIC,230,11,55,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Servidores no activos" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "Estos servidores siguen sin estar activos:",IDC_STATIC, - 10,10,182,8 - DEFPUSHBUTTON "Aceptar",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Estado de servidor" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Célula local",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,136,8 - CONTROL "Célula especificada:",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,136,10 - CONTROL "Todas las células",IDC_ALL_CELLS,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,65,135,10 - CONTROL "No investigar servidores",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,93,10 - PUSHBUTTON "Mostrar estado",IDC_SHOWSTATUS,10,120,54,14 - GROUPBOX "Célula",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,100,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,47,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Cerrar",IDCANCEL,67,120,48,14 - PUSHBUTTON "Ayuda",9,119,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Autentificación" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "Obtener señales",ID_GET_TOKENS,12,137,57,14 - PUSHBUTTON "Descartar señales",ID_DISCARD_TOKENS,79,137,62,14 - PUSHBUTTON "Cerrar",IDCANCEL,151,137,55,14 - PUSHBUTTON "Ayuda",9,217,137,55,14 - LTEXT "Nombre de usuario",IDC_STATIC,10,9,88,8 - LTEXT "Nombre de célula",IDC_STATIC,104,9,113,8 - LTEXT "Caducidad",IDC_STATIC,222,9,49,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 179, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Obtener señales" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,54,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,53,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,53,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "Aceptar",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "Cancelar",IDCANCEL,70,70,35,14 - PUSHBUTTON "Ayuda",9,120,70,35,14 - LTEXT "Nombre:",IDC_STATIC,21,12,29,8 - LTEXT "Contraseña:",IDC_STATIC,9,32,41,8 - LTEXT "Célula:",IDC_STATIC,25,52,24,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 192, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Descartar señales" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Aceptar",IDOK,27,40,35,14 - PUSHBUTTON "Cancelar",IDCANCEL,77,40,37,14 - PUSHBUTTON "Ayuda",9,129,40,35,14 - LTEXT "Célula:",IDC_STATIC,10,17,23,8 - EDITTEXT IDC_CELL_NAME,37,15,145,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Submontajes" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Añadir ",IDC_ADD,202,20,45,14 - PUSHBUTTON "Suprimir",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "Cambiar",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "Submontajes:",IDC_STATIC,10,10,50,8 - PUSHBUTTON "Aceptar",IDOK,202,145,45,14 - PUSHBUTTON "Cancelar",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 282, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Añadir submontaje" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_SHARE_NAME,107,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,107,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "Aceptar",IDOK,22,53,45,14 - PUSHBUTTON "Cancelar",IDCANCEL,92,53,45,14 - PUSHBUTTON "Ayuda",9,167,53,45,14 - LTEXT "Nombre de compartición:",IDC_STATIC,18,10,87,8 - LTEXT "Nombre de vía de acceso:",IDC_STATIC,19,25,86,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAKE_MOUNT_POINT, DIALOG - BEGIN - RIGHTMARGIN, 222 - END - - IDD_ADD_ACL, DIALOG - BEGIN - RIGHTMARGIN, 235 - BOTTOMMARGIN, 113 - END - - IDD_PARTITION_INFO, DIALOG - BEGIN - RIGHTMARGIN, 123 - END - - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 172 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 185 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 275 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "Iniciar o finalizar la sesión de AFS" - ID_SERVER_STATUS "Comprobar servidores" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "No puede descargarse archivo activo %o" - IDS_FLUSH_ERROR "Error al descargar archivo %o: %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "Archivo(s) seleccionado(s) descargado(s) satisfactoriamente" - IDS_CANT_GET_CELL "Error al determinar célula:" - IDS_FLUSH_VOLUME_ERROR "Error al descargar volumen para %o: %s" - IDS_FLUSH_VOLUME_OK "Volumen descargado satisfactoriamente" - IDS_WHERE_IS "Archivo %o está en sistema principal %s" - IDS_CLEANACL_NOT_SUPPORTED - "No puede limpiarse ACL para archivo %o: borrado de Acl no soportado para listas de acceso de DFS" - IDS_ACL_IS_FINE "Lista de acceso para %o correcta" - IDS_CLEANACL_INVALID_ARG - "No puede limpiarse ACL para archivo %o: Argumento no válido, los posibles motivos incluyen: archivo no en servicio o demasiados usuarios de la lista de control de acceso. " - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "Se han eliminado entradas de ACL obsoletas." - ID_SUBMOUNTS "Crear o eliminar un submontaje de AFS" - IDS_GETRIGHTS_ERROR "No se ha podido leer lista de acceso para directorio %o: %o" - IDS_DFSACL_ERROR "No se han podido editar las ACL de DFS con este mandato" - IDS_SAVE_ACL_ERROR "No se puede guardar ACL para %o: %o" - IDS_SAVE_ACL_EINVAL_ERROR - "No se puede guardar ACL para %o: Argumento no válido, los posibles motivos incluyen: archivo no en AFS, demasiados usuarios en la lista de control de acceso, se ha intentado añadir un usuario no existente a la lista de control de acceso" - IDS_ACL_READ_ERROR "No se puede leer ACL para %o: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "No puede copiarse ACL en dir %o: copiar ACL no soportado para listas de acceso de DFS" - IDS_COPY_ACL_EINVAL_ERROR - "No se puede copiar ACL en dir %o: Argumento no válido, los posibles motivos incluyen: Archivo no en AFS." - IDS_COPY_ACL_ERROR "No se puede copiar ACL en %o: %o" - IDS_NOT_MOUNT_POINT_ERROR "%o no es un punto de montaje." - IDS_LIST_MOUNT_POINT_ERROR "Error: %o" - IDS_MAKE_MP_NOT_AFS_ERROR - "Deben crearse puntos de montaje en el sistema de archivos de AFS" - IDS_MOUNT_POINT_ERROR "Error al crear punto de montaje: %o" - IDS_ERROR "Error: %o" - IDS_DELETED "Suprimido satisfactoriamente" - IDS_SET_QUOTA_ERROR "Error al definir cuota: %o" - ID_SUBMOUNTS_CREATE "Crear un submontaje de AFS" - ID_SUBMOUNTS_EDIT "Añadir, cambiar o suprimir submontajes de AFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "Error al comprobar el estado de máquinas de servidor de archivo: %o" - IDS_ALL_SERVERS_RUNNING "Se están ejecutando todos los servidores." - IDS_CHECK_VOLUMES_OK "Se están comprobando todas las correlaciones de ID de volumen/nombre." - IDS_CHECK_VOLUMES_ERROR "Error al comprobar las correlaciones de ID de volumen/nombre: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE - "El nombre elegido ya se está utilizando. Por favor, entre un nombre diferente." - IDS_REALLY_DEL_MOUNT_POINTS - "¿Está seguro de que desea eliminar el (los) punto(s) de montaje seleccionado(s)?" - IDS_DIR_DOES_NOT_EXIST_ERROR "El directorio '%o' no existe." - IDS_CLEANACL_MSG "¡Las ACL obsoletas se eliminarán!" - IDS_COPY_ACL_OK "ACL copiada satisfactoriamente." - IDS_GET_TOKENS_NO_AFS_SERVICE - "No puede leerse la información de señal: Es posible que no se haya iniciado el servicio de AFS." - IDS_GET_TOKENS_UNEXPECTED_ERROR - "No puede leerse la información de señal: Error inesperado, código %d." - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "No puede leerse la información de señal: Error inesperado, servicio %s.%s.%s, código %d." - IDS_ENTER_QUOTA "Por favor, entre una cuota válida." - IDS_AUTHENTICATION_ITEM "&Autentificación..." - IDS_ACLS_ITEM "Listas de &control de acceso..." - IDS_VOL_PART_ITEM "&Volumen/Partición" - IDS_VOL_PART_PROPS_ITEM "&Propiedades" - IDS_VOL_PART_REFRESH_ITEM "&Actualizar nombre/mapa de ID" - IDS_MOUNT_POINT_ITEM "Punto de &montaje" - IDS_MP_SHOW_ITEM "&Mostrar..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "&Eliminar..." - IDS_MP_MAKE_ITEM "&Crear..." - IDS_FLUSH_FILE_DIR_ITEM "&Descargar archivo/dir" - IDS_FLUSH_VOLUME_ITEM "Descargar vol&umen" - IDS_SHOW_FILE_SERVERS_ITEM "Mostrar ser&vidores de archivo..." - IDS_SHOW_CELL_ITEM "Mostrar &célula..." - IDS_SHOW_SERVER_STATUS_ITEM "Mostrar estado de servidor..." - IDS_AFS_ITEM "&AFS" - IDS_SUBMOUNTS_ITEM "Su&bmontajes" - IDS_GET_SUBMT_INFO_ERROR - "No se ha podido leer información de submontaje para el nombre de recurso compartido %o." - IDS_REALLY_DELETE_SUBMT "Suprimir nombre de recurso compartido %o?" - IDS_SUBMT_SAVE_FAILED "Han fallado los cambios en la base de datos de submontaje." - IDS_SUBMOUNTS_CREATE_ITEM "&Añadir" - IDS_SUBMOUNTS_EDIT_ITEM "&Editar..." - IDS_EDIT_PATH_NAME "Editar nombre de vía de acceso" - IDS_SHOW_CELL "Mostrar célula" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "Célula" - IDS_SHOW_FS "Mostrar servidores de archivo" - IDS_SHOW_FS_COLUMN "Servidor(es) de archivo" - IDS_REMOVE_MP "Eliminar puntos de montaje" - IDS_REMOVE_MP_COLUMN "Resultado" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS Client" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/ja_JP/afs_shl_ext.rc b/src/WINNT/client_exp/lang/ja_JP/afs_shl_ext.rc deleted file mode 100644 index 693eb018a..000000000 --- a/src/WINNT/client_exp/lang/ja_JP/afs_shl_ext.rc +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Japanese resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 17, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x411 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "”FØ...", IDM_AUTHENTICATION - MENUITEM "ƒAƒNƒZƒX§ŒäƒŠƒXƒg...", IDM_ACL_SET - POPUP "ƒ{ƒŠƒ…[ƒ€ / ƒp[ƒeƒBƒVƒ‡ƒ“(&V)" - BEGIN - MENUITEM "ƒvƒƒpƒeƒB[(&P)...", IDM_VOLUME_PROPERTIES - MENUITEM "–¼‘O /ID ƒ}ƒbƒsƒ“ƒO‚̍ŐV•\ަ(&R)", - IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg(&M)" - BEGIN - MENUITEM "•\ަ(&S)...", IDM_MOUNTPOINT_SHOW - MENUITEM "íœ(&R)...", IDM_MOUNTPOINT_REMOVE - MENUITEM "ì¬(&M)...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "ƒtƒ@ƒCƒ‹ / ƒfƒBƒŒƒNƒgƒŠ[‚̃tƒ‰ƒbƒVƒ…(&F)", IDM_FLUSH - MENUITEM "ƒ{ƒŠƒ…[ƒ€‚̃tƒ‰ƒbƒVƒ…(&U)", IDM_FLUSH_VOLUME - MENUITEM "ƒtƒ@ƒCƒ‹EƒT[ƒo[‚Ì•\ަ(&F)...", IDM_SHOW_SERVER - MENUITEM "ƒZƒ‹‚Ì•\ަ(&C)...", IDM_SHOWCELL - MENUITEM "ƒT[ƒo[ó‹µ‚Ì•\ަ...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒ{ƒŠƒ…[ƒ€î•ñ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "ƒwƒ‹ƒv",9,240,150,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "ƒtƒ@ƒCƒ‹ / ƒfƒBƒŒƒNƒgƒŠ[",IDC_STATIC,10,3,55,17 - LTEXT "–¼‘O",IDC_STATIC,90,10,20,8 - LTEXT "Š„‚è“–‚Ä—Ê",IDC_STATIC,225,10,41,8 - LTEXT "Žg—p—Ê",IDC_STATIC,270,10,25,8 - LTEXT "Žg—p—¦ (%)",IDC_STATIC,305,10,39,8 - LTEXT "ID",IDC_STATIC,175,10,10,8 - LTEXT "V‹KŠ„‚è“–‚Ä—Ê:",IDC_STATIC,10,127,56,10 - EDITTEXT IDC_NEW_QUOTA,75,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "ƒp[ƒeƒBƒVƒ‡ƒ“î•ñ‚Ì•\ަ",IDC_PARTITION_INFO,205,125, - 102,14,WS_DISABLED - LTEXT "KB",IDC_STATIC,145,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,128,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ACL ‚̐ݒè" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LTEXT "",IDC_DIR_NAME,76,12,239,10 - LISTBOX IDC_NORMAL_RIGHTS,8,46,145,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,8,143,145,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Read (“ǂݎæ‚è)",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,160,52,81,10 - CONTROL "w - Write (‘‚«ž‚Ý)",IDC_WRITE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,160,111,81,10 - CONTROL "l - Lookup (ŒŸõ)",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,160,66,81,10 - CONTROL "d - Delete (íœ)",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,160,96,81,10 - CONTROL "i - Insert (‘}“ü)",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,160,81,81,10 - CONTROL "k - Lock (ƒƒbƒN)",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,160,126,81,10 - CONTROL "a - Administer (ŠÇ—)",IDC_ADMINISTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,160,141,81,10 - PUSHBUTTON "’ljÁ(&A)...",IDC_ADD,246,45,69,14 - PUSHBUTTON "íœ(&R)",IDC_REMOVE,246,70,69,14,WS_DISABLED - PUSHBUTTON "ƒNƒŠ[ƒjƒ“ƒO(&C)",IDC_CLEAN,246,95,69,14 - DEFPUSHBUTTON "—¹‰ð(&O)",IDOK,246,150,69,14 - PUSHBUTTON "ŽæÁ‚µ(&N)",IDCANCEL,246,175,69,14 - PUSHBUTTON "ƒwƒ‹ƒv(&H)",9,246,201,69,14 - LTEXT "ƒfƒBƒŒƒNƒgƒŠ[:",IDC_STATIC,15,12,60,10 - GROUPBOX "ƒAƒNƒZƒXŒ ",IDC_STATIC,155,41,89,115 - LTEXT "•W€",IDC_STATIC,10,30,23,8 - LTEXT "–¼‘O",IDC_COLUMN_3,69,38,20,8 - LTEXT "ƒAƒNƒZƒXŒ ",IDC_STATIC,10,38,41,8 - LTEXT "‹ÖŽ~",IDC_STATIC,10,127,17,8 - LTEXT "ƒAƒNƒZƒXŒ ",IDC_STATIC,10,135,41,8 - LTEXT "–¼‘O",IDC_COLUMN_4,69,135,20,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "ƒRƒs[(&P)...",IDC_COPY,246,120,69,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 249, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚̍쐬" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_DIR,70,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,70,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,70,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,20,81,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,85,81,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,150,81,50,14 - LTEXT "ƒfƒBƒŒƒNƒgƒŠ[:",IDC_STATIC,9,12,45,10 - LTEXT "ƒ{ƒŠƒ…[ƒ€:",IDC_STATIC,9,28,45,10 - LTEXT "ƒZƒ‹:",IDC_STATIC,9,42,45,10 - GROUPBOX "",IDC_STATIC,70,52,145,20 - LTEXT "ƒIƒvƒVƒ‡ƒ“:",IDC_STATIC,9,59,45,10 - CONTROL "’ʏí",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,75,59,41,10 - CONTROL "“ǂݎæ‚è/‘‚«ž‚Ý",IDC_RW,"Button",BS_AUTORADIOBUTTON, - 120,59,77,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 245, 113 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ACL €–ڂ̒ljÁ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_NAME,37,70,190,12,ES_AUTOHSCROLL - CONTROL "r - Read (“ǂݎæ‚è)",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,73,10 - CONTROL "l - Lookup (ŒŸõ)",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,67,10 - CONTROL "i - Insert (‘}“ü)",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,60,10 - CONTROL "d - Delete (íœ)",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,67,10 - CONTROL "w - Write (‘‚«ž‚Ý)",IDC_WRITE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,100,15,79,10 - CONTROL "k - Lock (ƒƒbƒN)",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,100,25,69,10 - CONTROL "a - Administer (ŠÇ—)",IDC_ADMINISTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,100,35,81,10 - CONTROL "•W€€–Ú",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,191,16,43,10 - CONTROL "‹ÖŽ~€–Ú",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,191,26,43,10 - PUSHBUTTON "—¹‰ð",IDOK,22,90,50,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,92,90,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,162,90,50,14 - LTEXT "–¼‘O:",IDC_STATIC,10,72,18,8 - GROUPBOX "ƒAƒNƒZƒXŒ ",IDC_STATIC,10,5,175,55 - GROUPBOX "€–Úƒ^ƒCƒv",IDC_STATIC,186,6,53,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 123, 83 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒp[ƒeƒBƒVƒ‡ƒ“î•ñ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,60,10,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,60,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,60,40,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "ƒNƒ[ƒY",IDOK,14,62,40,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,69,62,40,14 - LTEXT "Žg—p—¦(%):",IDC_STATIC,10,42,42,8 - LTEXT "‹ó‚«ƒuƒƒbƒN:",IDC_STATIC,10,27,42,8 - LTEXT "‡ŒvƒTƒCƒY:",IDC_STATIC,10,12,42,8 - LTEXT "KB",IDC_STATIC,107,12,10,8 - LTEXT "KB",IDC_STATIC,107,27,10,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ACL ‚̃Rƒs[" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_FROM_DIR,56,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,56,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "ŽQÆ",IDC_BROWSE,195,25,35,15 - CONTROL "Œ»Ý‚̍€–Ú‚ðÁ‹Ž:",IDC_CLEAR,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,10,46,82,10 - DEFPUSHBUTTON "—¹‰ð",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,95,65,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,170,65,50,14 - LTEXT "ƒRƒs[Œ³:",IDC_STATIC,14,12,34,8 - LTEXT "ƒRƒs[æ:",IDC_STATIC,14,29,34,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ŒŸõ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ƒNƒ[ƒY",IDOK,65,145,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,180,145,50,14 - LISTBOX IDC_LIST,10,21,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ[",IDC_STATIC,10,10,91,8 - LTEXT "ƒtƒ@ƒCƒ‹EƒT[ƒo[",IDC_STATIC,128,10,73,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Œ‹‰Ê" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ƒNƒ[ƒY",IDOK,65,145,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,180,145,50,14 - LISTBOX IDC_LIST,10,22,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ[",-1,10,10,91,8 - LTEXT "Œ‹‰Ê",IDC_RESULTS_LABEL,128,10,17,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "ƒNƒ[ƒY",IDOK,65,145,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,180,145,50,14 - LISTBOX IDC_LIST,10,23,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ƒtƒ@ƒCƒ‹",IDC_STATIC,10,11,33,8 - LTEXT "ƒ{ƒŠƒ…[ƒ€",IDC_STATIC,75,11,41,8 - LTEXT "ƒZƒ‹",IDC_STATIC,155,11,17,8 - LTEXT "ƒ^ƒCƒv",IDC_STATIC,230,11,25,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ƒT[ƒo[‚ªƒ_ƒEƒ“" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LISTBOX 1029,10,22,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "ˆÈ‰º‚̃T[ƒo[‚͂܂¾ƒ_ƒEƒ“‚µ‚Ä‚¢‚Ü‚·:",IDC_STATIC,10,10, - 146,8 - DEFPUSHBUTTON "—¹‰ð",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "ƒT[ƒo[ó‹µ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - CONTROL "ƒ[ƒJƒ‹EƒZƒ‹",IDC_LOCALCELL,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,20,20,59,8 - CONTROL "Žw’èƒZƒ‹:",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,59,10 - CONTROL "‚·‚ׂẴZƒ‹",IDC_ALL_CELLS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,20,65,59,10 - CONTROL "ƒT[ƒo[‚ðƒvƒ[ƒu‚µ‚È‚¢",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,107,10 - PUSHBUTTON "ó‹µ‚Ì•\ަ",IDC_SHOWSTATUS,10,120,50,14 - GROUPBOX "ƒZƒ‹",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,120,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,48,130,12,ES_AUTOHSCROLL - PUSHBUTTON "ƒNƒ[ƒY",IDCANCEL,65,120,50,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "”FØ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,19,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "ƒg[ƒNƒ“‚̎擾",ID_GET_TOKENS,15,137,62,14 - PUSHBUTTON "ƒg[ƒNƒ“‚Ì”jŠü",ID_DISCARD_TOKENS,80,137,62,14 - PUSHBUTTON "ƒNƒ[ƒY",IDCANCEL,145,137,55,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,215,137,55,14 - LTEXT "ƒ†[ƒU[–¼",IDC_STATIC,10,9,41,8 - LTEXT "ƒZƒ‹–¼",IDC_STATIC,104,9,25,8 - LTEXT "—LŒøŠúŒÀ",IDC_STATIC,222,9,33,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 179, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "ƒg[ƒNƒ“‚̎擾" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_NAME,52,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,52,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,52,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "—¹‰ð",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,70,70,35,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,120,70,35,14 - LTEXT "–¼‘O:",IDC_STATIC,25,13,20,8 - LTEXT "ƒpƒXƒ[ƒh:",IDC_STATIC,10,32,35,8 - LTEXT "ƒZƒ‹:",IDC_STATIC,26,51,19,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 185, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "ƒg[ƒNƒ“‚Ì”jŠü" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - DEFPUSHBUTTON "—¹‰ð",IDOK,25,40,35,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,75,40,35,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,125,40,35,14 - LTEXT "ƒZƒ‹:",IDC_STATIC,10,17,18,8 - EDITTEXT IDC_CELL_NAME,37,15,136,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ƒTƒuƒ}ƒEƒ“ƒg" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "’ljÁ ",IDC_ADD,202,20,45,14 - PUSHBUTTON "íœ",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "•ύX",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "ƒTƒuƒ}ƒEƒ“ƒg:",IDC_STATIC,10,10,50,8 - PUSHBUTTON "—¹‰ð",IDOK,202,145,45,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 235, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ƒTƒuƒ}ƒEƒ“ƒg‚̒ljÁ" -FONT 9, "‚l‚r ‚oƒSƒVƒbƒN" -BEGIN - EDITTEXT IDC_SHARE_NAME,62,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,62,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "—¹‰ð",IDOK,22,53,45,14 - PUSHBUTTON "ŽæÁ‚µ",IDCANCEL,92,53,45,14 - PUSHBUTTON "ƒwƒ‹ƒv",9,167,53,45,14 - LTEXT "‹¤—p–¼:",IDC_STATIC,19,10,29,8 - LTEXT "ƒpƒX–¼:",IDC_STATIC,19,25,28,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 165 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 178 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "AFS ‚̃ƒOƒCƒ“‚Ü‚½‚̓ƒOƒAƒEƒg" - ID_SERVER_STATUS "ƒT[ƒo[‚ÌŒŸ¸" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "Šˆ“®ó‘Ԃ̃tƒ@ƒCƒ‹ %o ‚ðƒtƒ‰ƒbƒVƒ…‚Å‚«‚Ü‚¹‚ñ" - IDS_FLUSH_ERROR "ƒtƒ@ƒCƒ‹ %o ‚̃tƒ‰ƒbƒVƒ…EƒGƒ‰[: %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "‘I‘ð‚³‚ê‚½ƒtƒ@ƒCƒ‹‚ª³í‚Ƀtƒ‰ƒbƒVƒ…‚³‚ê‚Ü‚µ‚½" - IDS_CANT_GET_CELL "ƒZƒ‹‚Ì”»•ʃGƒ‰[: " - IDS_FLUSH_VOLUME_ERROR "%o ‚̃{ƒŠƒ…[ƒ€‚̃tƒ‰ƒbƒVƒ…EƒGƒ‰[: %s" - IDS_FLUSH_VOLUME_OK "ƒ{ƒŠƒ…[ƒ€‚ª³í‚Ƀtƒ‰ƒbƒVƒ…‚³‚ê‚Ü‚µ‚½" - IDS_WHERE_IS "ƒtƒ@ƒCƒ‹ %o ‚̓zƒXƒg %s ‚É‚ ‚è‚Ü‚·" - IDS_CLEANACL_NOT_SUPPORTED - "ƒtƒ@ƒCƒ‹ %o ‚Ì ACL ‚ðƒNƒŠ[ƒjƒ“ƒO‚Å‚«‚Ü‚¹‚ñ: ACL ‚̃NƒŠ[ƒjƒ“ƒO‚Í DFS ƒAƒNƒZƒXEƒŠƒXƒg‚ł̓Tƒ|[ƒg‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_ACL_IS_FINE "%o ‚̃AƒNƒZƒXEƒŠƒXƒg‚͐³í‚Å‚·" - IDS_CLEANACL_INVALID_ARG - "ƒtƒ@ƒCƒ‹ %o ‚Ì ACL ‚ðƒNƒŠ[ƒjƒ“ƒO‚Å‚«‚Ü‚¹‚ñ: –³Œø‚Ȉø‚«”Al‚¦‚ç‚ê‚闝—R: ƒtƒ@ƒCƒ‹‚ª vice ‚ɂȂ¢A‚Ü‚½‚̓AƒNƒZƒX§ŒäƒŠƒXƒg‚Ƀ†[ƒU[‚ª‘½‚·‚¬‚é" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "ŒÃ‚¢ ACL €–Ú‚ªíœ‚³‚ê‚Ü‚µ‚½B" - ID_SUBMOUNTS "AFS ƒTƒuƒ}ƒEƒ“ƒg‚̍쐬‚Ü‚½‚͍폜" - IDS_GETRIGHTS_ERROR "ƒfƒBƒŒƒNƒgƒŠ[ %o ‚̃AƒNƒZƒXEƒŠƒXƒg‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ: %o" - IDS_DFSACL_ERROR "DFS ACL ‚Í‚±‚̃Rƒ}ƒ“ƒh‚ŕҏW‚Å‚«‚Ü‚¹‚ñ" - IDS_SAVE_ACL_ERROR "%o ‚Ì ACL ‚ð•ۊǂł«‚Ü‚¹‚ñ: %o" - IDS_SAVE_ACL_EINVAL_ERROR - "%o ‚Ì ACL ‚ð•ۊǂł«‚Ü‚¹‚ñ: –³Œø‚Ȉø‚«”Al‚¦‚ç‚ê‚闝—R: ƒtƒ@ƒCƒ‹‚ª AFS ‚ɂȂ¢AƒAƒNƒZƒX§ŒäƒŠƒXƒg‚Ƀ†[ƒU[‚ª‘½‚·‚¬‚éA‘¶Ý‚µ‚È‚¢ƒ†[ƒU[‚ðƒAƒNƒZƒX§ŒäƒŠƒXƒg‚ɒljÁ‚µ‚悤‚Æ‚µ‚½" - IDS_ACL_READ_ERROR "%o ‚Ì ACL ‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "ƒfƒBƒŒƒNƒgƒŠ[ %o ‚É ACL ‚ðƒRƒs[‚Å‚«‚Ü‚¹‚ñ: ACL ‚̃Rƒs[‚Í DFSƒAƒNƒZƒXEƒŠƒXƒg‚ł̓Tƒ|[ƒg‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ" - IDS_COPY_ACL_EINVAL_ERROR - "ƒfƒBƒŒƒNƒgƒŠ[ %o ‚É ACL ‚ðƒRƒs[‚Å‚«‚Ü‚¹‚ñ: –³Œø‚Ȉø‚«”Al‚¦‚ç‚ê‚闝—R: ƒtƒ@ƒCƒ‹‚ª AFS ‚ɂȂ¢B" - IDS_COPY_ACL_ERROR "ACL ‚ð %o ‚ɃRƒs[‚Å‚«‚Ü‚¹‚ñ: %o" - IDS_NOT_MOUNT_POINT_ERROR "%o ‚̓}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ł͂ ‚è‚Ü‚¹‚ñB" - IDS_LIST_MOUNT_POINT_ERROR "ƒGƒ‰[: %o" - IDS_MAKE_MP_NOT_AFS_ERROR - "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ð AFS ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€“à‚ɍ쐬‚·‚é•K—v‚ª‚ ‚è‚Ü‚·" - IDS_MOUNT_POINT_ERROR "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚̍쐬ƒGƒ‰[: %o" - IDS_ERROR "ƒGƒ‰[: %o" - IDS_DELETED "³í‚ɍ폜‚³‚ê‚Ü‚µ‚½" - IDS_SET_QUOTA_ERROR "Š„‚è“–‚ėʂ̐ݒèƒGƒ‰[: %o" - ID_SUBMOUNTS_CREATE "AFS ƒTƒuƒ}ƒEƒ“ƒg‚̍쐬" - ID_SUBMOUNTS_EDIT "AFS ƒTƒuƒ}ƒEƒ“ƒg‚̒ljÁA•ύXA‚Ü‚½‚͍폜" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "ƒtƒ@ƒCƒ‹EƒT[ƒo[Eƒ}ƒVƒ“‚̏󋵂̌Ÿ¸ƒGƒ‰[: %o" - IDS_ALL_SERVERS_RUNNING "‚·‚ׂẴT[ƒo[‚ªŽÀs’†‚Å‚·B" - IDS_CHECK_VOLUMES_OK "‚·‚ׂẴ{ƒŠƒ…[ƒ€ ID/–¼‘O‚̃}ƒbƒsƒ“ƒO‚ªŒŸ¸‚³‚ê‚Ü‚µ‚½B" - IDS_CHECK_VOLUMES_ERROR "ƒ{ƒŠƒ…[ƒ€ ID/–¼‘Oƒ}ƒbƒsƒ“ƒO‚ÌŒŸ¸ƒGƒ‰[: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE - "‘I‘ð‚µ‚½–¼‘O‚Í‚·‚łɎg—p‚³‚ê‚Ä‚¢‚Ü‚·B•ʂ̖¼‘O‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_REALLY_DEL_MOUNT_POINTS - "‘I‘ð‚µ‚½ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðíœ‚µ‚Ä‚à‚¢‚¢‚Å‚·‚©?" - IDS_DIR_DOES_NOT_EXIST_ERROR "ƒfƒBƒŒƒNƒgƒŠ[ '%o' ‚ª‘¶Ý‚µ‚Ü‚¹‚ñB" - IDS_CLEANACL_MSG "ŒÃ‚¢ ACL ‚͍폜‚³‚ê‚Ü‚·!" - IDS_COPY_ACL_OK "ACL ‚ª³í‚ɃRƒs[‚³‚ê‚Ü‚µ‚½B" - IDS_GET_TOKENS_NO_AFS_SERVICE - "ƒg[ƒNƒ“î•ñ‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ: AFS ƒT[ƒrƒX‚ªŠJŽn‚³‚ê‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·B" - IDS_GET_TOKENS_UNEXPECTED_ERROR - "ƒg[ƒNƒ“î•ñ‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ: —\Šú‚µ‚È‚¢ƒGƒ‰[AƒR[ƒh %d " - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "ƒg[ƒNƒ“î•ñ‚ð“ǂݎæ‚ê‚Ü‚¹‚ñ: —\Šú‚µ‚È‚¢ƒGƒ‰[AƒT[ƒrƒX %s.%s.%s, ƒR[ƒh %d " - IDS_ENTER_QUOTA "—LŒø‚ÈŠ„‚è“–‚Ä—Ê‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" - IDS_AUTHENTICATION_ITEM "”FØ(&A)..." - IDS_ACLS_ITEM "ƒAƒNƒZƒX§ŒäƒŠƒXƒg(&C)..." - IDS_VOL_PART_ITEM "ƒ{ƒŠƒ…[ƒ€/ƒp[ƒeƒBƒVƒ‡ƒ“(&V)" - IDS_VOL_PART_PROPS_ITEM "ƒvƒƒpƒeƒB[(&P)" - IDS_VOL_PART_REFRESH_ITEM "–¼‘O /ID ƒ}ƒbƒsƒ“ƒO‚̍ŐV•\ަ(&R)" - IDS_MOUNT_POINT_ITEM "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg(&M)" - IDS_MP_SHOW_ITEM "•\ަ(&S)..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "íœ(&R)..." - IDS_MP_MAKE_ITEM "ì¬(&M)..." - IDS_FLUSH_FILE_DIR_ITEM "ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ[‚̃tƒ‰ƒbƒVƒ…(&F)" - IDS_FLUSH_VOLUME_ITEM "ƒ{ƒŠƒ…[ƒ€‚̃tƒ‰ƒbƒVƒ…(&U)" - IDS_SHOW_FILE_SERVERS_ITEM "ƒtƒ@ƒCƒ‹EƒT[ƒo[‚Ì•\ަ(&F)..." - IDS_SHOW_CELL_ITEM "ƒZƒ‹‚Ì•\ަ(&C)..." - IDS_SHOW_SERVER_STATUS_ITEM "ƒT[ƒo[ó‹µ‚Ì•\ަ..." - IDS_AFS_ITEM "AFS(&A)" - IDS_SUBMOUNTS_ITEM "ƒTƒuƒ}ƒEƒ“ƒg(&B)" - IDS_GET_SUBMT_INFO_ERROR "‹¤—p–¼ %o ‚̃Tƒuƒ}ƒEƒ“ƒgî•ñ‚ð“ǂݎæ‚ê‚Ü‚¹‚ñB" - IDS_REALLY_DELETE_SUBMT "‹¤—p–¼ %o ‚ðíœ‚µ‚Ü‚·‚©?" - IDS_SUBMT_SAVE_FAILED "ƒTƒuƒ}ƒEƒ“ƒgEƒf[ƒ^ƒx[ƒX‚ɑ΂·‚é•ύX‚ªŽ¸”s‚µ‚Ü‚µ‚½B" - IDS_SUBMOUNTS_CREATE_ITEM "’ljÁ(&A)" - IDS_SUBMOUNTS_EDIT_ITEM "•ҏW(&E)..." - IDS_EDIT_PATH_NAME "ƒpƒX–¼‚̕ҏW" - IDS_SHOW_CELL "ƒZƒ‹‚ð•\ަ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "ƒZƒ‹" - IDS_SHOW_FS "ƒtƒ@ƒCƒ‹EƒT[ƒo[‚ð•\ަ" - IDS_SHOW_FS_COLUMN "ƒtƒ@ƒCƒ‹EƒT[ƒo[" - IDS_REMOVE_MP "ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðíœ" - IDS_REMOVE_MP_COLUMN "Œ‹‰Ê" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS ƒNƒ‰ƒCƒAƒ“ƒg" -END - -#endif // Japanese resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE 17, 1 -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/ko_KR/afs_shl_ext.rc b/src/WINNT/client_exp/lang/ko_KR/afs_shl_ext.rc deleted file mode 100644 index 83b1d8c4f..000000000 --- a/src/WINNT/client_exp/lang/ko_KR/afs_shl_ext.rc +++ /dev/null @@ -1,659 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Korean resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 18, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x412 -#define AFS_VERINFO_CHARSET 949 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "ÀÎÁõ...", IDM_AUTHENTICATION - MENUITEM "¾×¼¼½º Á¦¾î ¸ñ·Ï...", IDM_ACL_SET - POPUP "º¼·ý/ÆÄƼ¼Ç(&V)" - BEGIN - MENUITEM "Ư¼º(&P)...", IDM_VOLUME_PROPERTIES - MENUITEM "À̸§/ID ¸ÊÇÎ »õ·Î °íħ(&R)", IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "¸¶¿îÆ® Æ÷ÀÎÆ®(&M)" - BEGIN - MENUITEM "Ç¥½Ã(&S)...", IDM_MOUNTPOINT_SHOW - MENUITEM "Á¦°Å(&R)...", IDM_MOUNTPOINT_REMOVE - MENUITEM "ÀÛ¼º(&M)...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "ÆÄÀÏ/µð·ºÅ丮 Ç÷¯½¬(&F)", IDM_FLUSH - MENUITEM "º¼·ý Ç÷¯½¬(&U)", IDM_FLUSH_VOLUME - MENUITEM "ÆÄÀÏ ¼­¹ö Ç¥½Ã(&F)...", IDM_SHOW_SERVER - MENUITEM "¼¿ Ç¥½Ã(&C)...", IDM_SHOWCELL - MENUITEM "¼­¹ö »óÅ ǥ½Ã ...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "º¼·ý Á¤º¸" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "µµ¿ò¸»",9,240,150,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÆÄÀÏ/µð·ºÅ丮",IDC_STATIC,10,9,56,8 - LTEXT "À̸§",IDC_STATIC,90,10,20,8 - LTEXT "ÇÒ´ç·®",IDC_STATIC,225,10,29,8 - LTEXT "»ç¿ë",IDC_STATIC,270,10,24,8 - LTEXT "»ç¿ë ¹éºÐÀ²",IDC_STATIC,298,10,38,8 - LTEXT "ID",IDC_STATIC,171,10,14,8 - LTEXT "»õ ÇÒ´ç·®:",IDC_STATIC,10,127,40,10 - EDITTEXT IDC_NEW_QUOTA,55,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "ÆÄƼ¼Ç Á¤º¸ Ç¥½Ã",IDC_PARTITION_INFO,205,125,69,14, - WS_DISABLED - LTEXT "KB",IDC_STATIC,118,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,106,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "AFS ACL ¼³Á¤" -FONT 9, "±¼¸²" -BEGIN - LTEXT "",IDC_DIR_NAME,51,12,259,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Àбâ",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,52,55,10 - CONTROL "w - ¾²±â",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - Á¶È¸",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - »èÁ¦",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - »ðÀÔ",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Àá±Ý",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - °ü¸®ÀÚ",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,141,55,10 - PUSHBUTTON "Ãß°¡(&A)...",IDC_ADD,270,45,45,14 - PUSHBUTTON "Á¦°Å(&R)",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "Á¤¸®(&C)",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "È®ÀÎ(&O)",IDOK,270,150,45,14 - PUSHBUTTON "Ãë¼Ò(&N)",IDCANCEL,270,175,45,14 - PUSHBUTTON "µµ¿ò¸»(&H)",9,270,201,45,14 - LTEXT "µð·ºÅ丮:",IDC_STATIC,15,12,41,10 - GROUPBOX "±ÇÇÑ",IDC_STATIC,195,41,65,115 - LTEXT "±àÁ¤",IDC_STATIC,10,30,23,8 - LTEXT "À̸§",IDC_COLUMN_3,69,38,20,8 - LTEXT "±ÇÇÑ",IDC_STATIC,10,38,37,8 - LTEXT "ºÎÁ¤",IDC_STATIC,10,125,30,8 - LTEXT "±ÇÇÑ",IDC_STATIC,10,133,38,8 - LTEXT "À̸§",IDC_COLUMN_4,69,133,20,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "º¹»ç(&P)...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 219, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¸¶¿îÆ® Æ÷ÀÎÆ® ÀÛ¼º" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_DIR,40,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,40,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,40,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,20,81,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,85,81,50,14 - PUSHBUTTON "µµ¿ò¸»",9,150,81,50,14 - LTEXT "µð·ºÅ丮:",IDC_STATIC,5,12,30,10 - LTEXT "º¼·ý:",IDC_STATIC,12,26,25,10 - LTEXT "¼¿:",IDC_STATIC,19,41,15,10 - GROUPBOX "",IDC_STATIC,40,52,115,20 - LTEXT "¿É¼Ç:",IDC_STATIC,12,57,24,10 - CONTROL "ÀϹÝ",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,45,59,41,10 - CONTROL "Àбâ/¾²±â",IDC_RW,"Button",BS_AUTORADIOBUTTON,100,59,50, - 10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 235, 113 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ACL Ç׸ñ Ãß°¡" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_NAME,35,70,190,12,ES_AUTOHSCROLL - CONTROL "r - Àбâ",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,45,10 - CONTROL "l - Á¶È¸",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - »ðÀÔ",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - »èÁ¦",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - ¾²±â",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Àá±Ý",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - °ü¸®ÀÚ",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,35,60,10 - CONTROL "±àÁ¤ Ç׸ñ",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,161,16,54,10 - CONTROL "ºÎÁ¤ Ç׸ñ",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,161,26,59,10 - PUSHBUTTON "È®ÀÎ",IDOK,22,90,50,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,92,90,50,14 - PUSHBUTTON "µµ¿ò¸»",9,162,90,50,14 - LTEXT "À̸§:",IDC_STATIC,10,72,20,8 - GROUPBOX "±ÇÇÑ",IDC_STATIC,10,5,135,55 - GROUPBOX "Ç׸ñ À¯Çü",IDC_STATIC,155,6,70,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 123, 83 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÆÄƼ¼Ç Á¤º¸" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,67,9,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,67,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,67,39,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "´Ý±â",IDOK,14,62,40,14 - PUSHBUTTON "µµ¿ò¸»",9,69,62,40,14 - LTEXT "»ç¿ë %:",IDC_STATIC,5,42,52,8 - LTEXT "»ç¿ë°¡´ÉÇÑ ºí·°:",IDC_STATIC,5,27,54,8 - LTEXT "ÃÑ Å©±â:",IDC_STATIC,7,12,36,8 - LTEXT "KB",IDC_STATIC,109,11,11,8 - LTEXT "K",IDC_STATIC,109,27,8,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ACL º¹»ç" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "ã¾Æº¸±â",IDC_BROWSE,195,25,35,15 - CONTROL "ÇöÀç ÀÔ·Â Ç׸ñ Áö¿ì±â:",IDC_CLEAR,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,10,46,82,10 - DEFPUSHBUTTON "È®ÀÎ",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "Ãë¼Ò",IDCANCEL,95,65,50,14 - PUSHBUTTON "µµ¿ò¸»",9,170,65,50,14 - LTEXT "º¹»ç ¿øº»:",IDC_STATIC,13,13,35,8 - LTEXT "º¹»ç ´ë»ó:",IDC_STATIC,13,29,37,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "À§Ä¡" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "´Ý±â",IDOK,65,145,50,14 - PUSHBUTTON "µµ¿ò¸»",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ÆÄÀÏ/µð·ºÅ丮",IDC_STATIC,10,10,59,8 - LTEXT "ÆÄÀÏ ¼­¹ö",IDC_STATIC,128,10,44,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "°á°ú" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "´Ý±â",IDOK,65,145,50,14 - PUSHBUTTON "µµ¿ò¸»",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ÆÄÀÏ/µð·ºÅ丮",-1,10,10,45,8 - LTEXT "°á°ú",IDC_RESULTS_LABEL,128,10,44,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¸¶¿îÆ® Æ÷ÀÎÆ®" -FONT 9, "±¼¸²" -BEGIN - DEFPUSHBUTTON "´Ý±â",IDOK,65,145,50,14 - PUSHBUTTON "µµ¿ò¸»",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ÆÄÀÏ",IDC_STATIC,10,11,13,8 - LTEXT "º¼·ý",IDC_STATIC,75,11,27,8 - LTEXT "¼¿",IDC_STATIC,155,11,15,8 - LTEXT "À¯Çü",IDC_STATIC,230,11,20,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "¼­¹ö Áß´Ü" -FONT 9, "±¼¸²" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "ÀÌ ¼­¹ö´Â ¾ÆÁ÷ ½ÃÀÛµÇÁö ¾ÊÀº »óÅÂÀÔ´Ï´Ù",IDC_STATIC,10, - 10,186,8 - DEFPUSHBUTTON "È®ÀÎ",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "¼­¹ö »óÅÂ" -FONT 9, "±¼¸²" -BEGIN - CONTROL "Áö¿ª ¼¿",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,50,8 - CONTROL "ÁöÁ¤µÈ ¼¿:",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,60,10 - CONTROL "¸ðµç ¼¿",IDC_ALL_CELLS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,21,69,45,10 - CONTROL "¼­¹ö »óŸ¦ Á¶»çÇÏÁö ¾ÊÀ½",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,112,10 - PUSHBUTTON "»óÅ ǥ½Ã",IDC_SHOWSTATUS,10,120,50,14 - GROUPBOX "¼¿",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,137,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,31,51,130,12,ES_AUTOHSCROLL - PUSHBUTTON "´Ý±â",IDCANCEL,65,120,50,14 - PUSHBUTTON "µµ¿ò¸»",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÀÎÁõ" -FONT 9, "±¼¸²" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "ÅäÅ« È®º¸",ID_GET_TOKENS,15,137,55,14 - PUSHBUTTON "ÅäÅ« ¹ö¸®±â",ID_DISCARD_TOKENS,80,137,55,14 - PUSHBUTTON "´Ý±â",IDCANCEL,145,137,55,14 - PUSHBUTTON "µµ¿ò¸»",9,215,137,55,14 - LTEXT "»ç¿ëÀÚ À̸§",IDC_STATIC,10,9,38,8 - LTEXT "¼¿ À̸§",IDC_STATIC,104,9,33,8 - LTEXT "¸¸±â",IDC_STATIC,222,9,32,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 169, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "ÅäÅ« È®º¸" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_NAME,40,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,40,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,40,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "È®ÀÎ",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "Ãë¼Ò",IDCANCEL,70,70,35,14 - PUSHBUTTON "µµ¿ò¸»",9,120,70,35,14 - LTEXT "À̸§:",IDC_STATIC,17,12,22,8 - LTEXT "¾ÏÈ£:",IDC_STATIC,17,32,20,8 - LTEXT "¼¿:",IDC_STATIC,24,52,15,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 185, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "ÅäÅ« ¹ö¸®±â" -FONT 9, "±¼¸²", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "È®ÀÎ",IDOK,25,40,35,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,75,40,35,14 - PUSHBUTTON "µµ¿ò¸»",9,125,40,35,14 - LTEXT "¼¿:",IDC_STATIC,10,17,14,8 - EDITTEXT IDC_CELL_NAME,29,15,145,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "¼­ºê¸¶¿îÆ®" -FONT 9, "±¼¸²" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Ãß°¡ ",IDC_ADD,202,20,45,14 - PUSHBUTTON "»èÁ¦",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "º¯°æ",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "¼­ºê¸¶¿îÆ®:",IDC_STATIC,10,10,50,8 - PUSHBUTTON "È®ÀÎ",IDOK,202,145,45,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 235, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¼­ºê¸¶¿îÆ® Ãß°¡" -FONT 9, "±¼¸²" -BEGIN - EDITTEXT IDC_SHARE_NAME,62,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,62,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "È®ÀÎ",IDOK,22,53,45,14 - PUSHBUTTON "Ãë¼Ò",IDCANCEL,92,53,45,14 - PUSHBUTTON "µµ¿ò¸»",9,167,53,45,14 - LTEXT "°øÀ¯ À̸§:",IDC_STATIC,18,10,37,8 - LTEXT "°æ·Î À̸§:",IDC_STATIC,19,25,39,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 178 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "AFS·Î ·Î±×ÀÎ ¶Ç´Â AFS¿¡¼­ ·Î±× ¾Æ¿ô" - ID_SERVER_STATUS "¼­¹ö È®ÀÎ" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "Ȱ¼ºÈ­µÈ %o ÆÄÀÏÀ» Ç÷¯½¬ÇÒ ¼ö ¾ø½À´Ï´Ù" - IDS_FLUSH_ERROR "%o ÆÄÀÏ Ç÷¯½¬ ¿À·ù: %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "¼±ÅÃµÈ ÆÄÀÏÀ» Ç÷¯½¬Çß½À´Ï´Ù" - IDS_CANT_GET_CELL "¼¿ ÆÇº° ¿À·ù:" - IDS_FLUSH_VOLUME_ERROR "%o¿¡ ´ëÇÑ º¼·ý Ç÷¯½¬ ¿À·ù: %s" - IDS_FLUSH_VOLUME_OK "º¼·ýÀÌ Ç÷¯½¬µÇ¾ú½À´Ï´Ù" - IDS_WHERE_IS "%o ÆÄÀÏÀÌ %s È£½ºÆ®¿¡ ÀÖ½À´Ï´Ù" - IDS_CLEANACL_NOT_SUPPORTED - "%o ÆÄÀÏ¿¡ ´ëÇÑ ACLÀ» Á¤¸®ÇÒ ¼ö ¾ø½À´Ï´Ù. ACL Á¤¸®´Â DFS ¾×¼¼½º ¸ñ·Ï¿¡¼­ Áö¿øµÇÁö ¾Ê½À´Ï´Ù" - IDS_ACL_IS_FINE "%o¿¡ ´ëÇÑ ¾×¼¼½º ¸ñ·ÏÀÌ Á¦´ë·Î ÀÛ¼ºµÇ¾ú½À´Ï´Ù" - IDS_CLEANACL_INVALID_ARG - "%o ÆÄÀÏ¿¡ ´ëÇÑ ACLÀ» Á¤¸®ÇÒ ¼ö ¾ø½À´Ï´Ù. À¯È¿ÇÏÁö ¾ÊÀº Àμö, °¡´ÉÇÑ ¿øÀÎÀº ´ÙÀ½°ú °°½À´Ï´Ù. ÆÄÀÏÀÌ ¾ø°Å³ª ¾×¼¼½º Á¦¾î ¸ñ·Ï¿¡ »ç¿ëÀÚ°¡ ³Ê¹« ¸¹½À´Ï´Ù" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "¸ðÈ£ÇÑ ACL ÀÔ·Â Ç׸ñÀº »èÁ¦µÇ¾ú½À´Ï´Ù." - ID_SUBMOUNTS "AFS ¼­ºê¸¶¿îÆ®¸¦ ÀÛ¼ºÇϰųª »èÁ¦ÇϽʽÿÀ" - IDS_GETRIGHTS_ERROR "%o µð·ºÅ丮¿¡ ´ëÇÑ ¾×¼¼½º ¸ñ·ÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù: %o" - IDS_DFSACL_ERROR "ÀÌ ¸í·ÉÀ¸·Î DFS ACLÀ» ÆíÁýÇÒ ¼ö ¾ø½À´Ï´Ù" - IDS_SAVE_ACL_ERROR "%o¿¡ ´ëÇÑ ACLÀ» ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù: %o" - IDS_SAVE_ACL_EINVAL_ERROR - "%o¿¡ ´ëÇÑ ACLÀ» ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù. À¯È¿ÇÏÁö ¾ÊÀº Àμö ¹× °¡´ÉÇÑ ¿øÀÎÀº ´ÙÀ½°ú °°½À´Ï´Ù. ÆÄÀÏÀÌ AFS¿¡ ¾ø°Å³ª ¾×¼¼½º Á¦¾î ¸ñ·Ï¿¡ »ç¿ëÀÚ°¡ ³Ê¹« ¸¹°Å³ª ¶Ç´Â ¾ø´Â »ç¿ëÀÚ¸¦ ¾×¼¼½º Á¦¾î ¸ñ·Ï¿¡ Ãß°¡ÇÏ·Á°í Çß½À´Ï´Ù." - IDS_ACL_READ_ERROR "%o¿¡ ´ëÇÑ ACLÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "ACLÀ» %o µð·ºÅ丮·Î º¹»çÇÒ ¼ö ¾ø½À´Ï´Ù. DFS ¾×¼¼½º ¸ñ·Ï¿¡¼­´Â ACL º¹»ç¸¦ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù" - IDS_COPY_ACL_EINVAL_ERROR - "ACLÀ» %o µð·ºÅ丮·Î º¹»çÇÒ ¼ö ¾ø½À´Ï´Ù. À¯È¿ÇÏÁö ¾ÊÀº Àμö ¹× °¡´ÉÇÑ ¿øÀÎÀº ´ÙÀ½°ú °°½À´Ï´Ù. ÆÄÀÏÀÌ AFS¿¡ ¾ø½À´Ï´Ù." - IDS_COPY_ACL_ERROR "ACLÀ» %o¿¡ º¹»çÇÒ ¼ö ¾ø½À´Ï´Ù: %o" - IDS_NOT_MOUNT_POINT_ERROR "%oÀº(´Â) ¸¶¿îÆ® Æ÷ÀÎÆ®°¡ ¾Æ´Õ´Ï´Ù." - IDS_LIST_MOUNT_POINT_ERROR "¿À·ù: %o" - IDS_MAKE_MP_NOT_AFS_ERROR - "¸¶¿îÆ® Æ÷ÀÎÆ®´Â AFS ÆÄÀÏ ½Ã½ºÅÛ ³»¿¡ ÀÛ¼ºµÇ¾î¾ß ÇÕ´Ï´Ù" - IDS_MOUNT_POINT_ERROR "¸¶¿îÆ® Æ÷ÀÎÆ® ÀÛ¼º ¿À·ù: %o" - IDS_ERROR "¿À·ù: %o" - IDS_DELETED "»èÁ¦µÇ¾ú½À´Ï´Ù" - IDS_SET_QUOTA_ERROR "ÇÒ´ç·® ¼³Á¤ ¿À·ù: %o" - ID_SUBMOUNTS_CREATE "AFS ¼­ºê¸¶¿îÆ® ÀÛ¼º" - ID_SUBMOUNTS_EDIT "AFS ¼­ºê¸¶¿îÆ® Ãß°¡, º¯°æ ¶Ç´Â »èÁ¦" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "%o ÆÄÀÏ ¼­¹ö ±â°èÀÇ »óÅ ȮÀÎ ¿À·ù" - IDS_ALL_SERVERS_RUNNING "¸ðµç ¼­¹ö°¡ ½ÇÇà ÁßÀÔ´Ï´Ù." - IDS_CHECK_VOLUMES_OK "¸ðµç º¼·ý ID/À̸§ ¸ÊÇÎÀÌ È®ÀεǾú½À´Ï´Ù." - IDS_CHECK_VOLUMES_ERROR "º¼·ý ID/À̸§ ¸ÊÇÎ È®ÀÎ ¿À·ù: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE - "¼±ÅÃÇÑ À̸§ÀÌ ÀÌ¹Ì »ç¿ë ÁßÀÔ´Ï´Ù. ´Ù¸¥ À̸§À» ÀÔ·ÂÇϽʽÿÀ." - IDS_REALLY_DEL_MOUNT_POINTS "¼±ÅÃµÈ ¸¶¿îÆ® Æ÷ÀÎÆ®¸¦ Á¦°ÅÇϽðڽÀ´Ï±î?" - IDS_DIR_DOES_NOT_EXIST_ERROR "'%o' µð·ºÅ丮°¡ ¾ø½À´Ï´Ù." - IDS_CLEANACL_MSG "¸ðÈ£ÇÑ ACLÀº »èÁ¦µË´Ï´Ù." - IDS_COPY_ACL_OK "ACLÀÌ º¹»çµÇ¾ú½À´Ï´Ù." - IDS_GET_TOKENS_NO_AFS_SERVICE - "ÅäÅ« Á¤º¸¸¦ ÀÐÀ» ¼ö ¾ø½À´Ï´Ù. AFS ¼­ºñ½º°¡ ½ÃÀÛµÇÁö ¾Ê¾ÒÀ» ¼ö ÀÖ½À´Ï´Ù." - IDS_GET_TOKENS_UNEXPECTED_ERROR - "ÅäÅ« Á¤º¸¸¦ ÀÐÀ» ¼ö ¾ø½À´Ï´Ù. ¿¹±âÄ¡ ¸øÇÑ ¿À·ù ¹ß»ý, ÄÚµå %d." - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "ÅäÅ« Á¤º¸¸¦ ÀÐÀ» ¼ö ¾ø½À´Ï´Ù. ¿¹±âÄ¡ ¸øÇÑ ¿À·ù ¹ß»ý, ¼­ºñ½º %s.%s.%s, ÄÚµå %d." - IDS_ENTER_QUOTA "À¯È¿ÇÑ ÇÒ´ç·®À» ÀÔ·ÂÇϽʽÿÀ." - IDS_AUTHENTICATION_ITEM "ÀÎÁõ(&A)..." - IDS_ACLS_ITEM "¾×¼¼½º Á¦¾î ¸ñ·Ï(&O)..." - IDS_VOL_PART_ITEM "º¼·ý/ÆÄƼ¼Ç(&V)" - IDS_VOL_PART_PROPS_ITEM "Ư¼º(&P)" - IDS_VOL_PART_REFRESH_ITEM "À̸§/ID ¸ÊÇÎ »õ·Î °íħ(&R)" - IDS_MOUNT_POINT_ITEM "¸¶¿îÆ® Æ÷ÀÎÆ®(&M)" - IDS_MP_SHOW_ITEM "Ç¥½Ã(&S)..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "Á¦°Å(&R)..." - IDS_MP_MAKE_ITEM "ÀÛ¼º(&M)..." - IDS_FLUSH_FILE_DIR_ITEM "ÆÄÀÏ/µð·ºÅ丮 Ç÷¯½¬(&F)" - IDS_FLUSH_VOLUME_ITEM "º¼·ý Ç÷¯½¬(&U)" - IDS_SHOW_FILE_SERVERS_ITEM "ÆÄÀÏ ¼­¹ö Ç¥½Ã(&F)..." - IDS_SHOW_CELL_ITEM "¼¿ Ç¥½Ã(&C)..." - IDS_SHOW_SERVER_STATUS_ITEM "¼­¹ö »óÅ ǥ½Ã ..." - IDS_AFS_ITEM "AFS(&A)" - IDS_SUBMOUNTS_ITEM "¼­ºê¸¶¿îÆ®(&B)" - IDS_GET_SUBMT_INFO_ERROR - "%o °øÀ¯ À̸§¿¡ ´ëÇÑ ¼­ºê¸¶¿îÆ® Á¤º¸¸¦ ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." - IDS_REALLY_DELETE_SUBMT "%o °øÀ¯ À̸§À» »èÁ¦ÇϽðڽÀ´Ï±î?" - IDS_SUBMT_SAVE_FAILED "¼­ºê¸¶¿îÆ® µ¥ÀÌÅͺ£À̽º¸¦ º¯°æÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù." - IDS_SUBMOUNTS_CREATE_ITEM "Ãß°¡(&A)" - IDS_SUBMOUNTS_EDIT_ITEM "ÆíÁý(&E)..." - IDS_EDIT_PATH_NAME "°æ·Î À̸§ ÆíÁý" - IDS_SHOW_CELL "¼¿ Ç¥½Ã" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "¼¿" - IDS_SHOW_FS "ÆÄÀÏ ¼­¹ö Ç¥½Ã" - IDS_SHOW_FS_COLUMN "ÆÄÀÏ ¼­¹ö" - IDS_REMOVE_MP "¸¶¿îÆ® Æ÷ÀÎÆ® Á¦°Å" - IDS_REMOVE_MP_COLUMN "°á°ú" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS Ŭ¶óÀ̾ðÆ®" -END - -#endif // Korean resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) -#ifdef _WIN32 -LANGUAGE 18, 1 -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/pt_BR/afs_shl_ext.rc b/src/WINNT/client_exp/lang/pt_BR/afs_shl_ext.rc deleted file mode 100644 index 93dcee68f..000000000 --- a/src/WINNT/client_exp/lang/pt_BR/afs_shl_ext.rc +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x416 -#define AFS_VERINFO_CHARSET 1252 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "Autenticação...", IDM_AUTHENTICATION - MENUITEM "Listas de Controle de Acesso...", IDM_ACL_SET - POPUP "&Volume/Partição" - BEGIN - MENUITEM "&Propriedades...", IDM_VOLUME_PROPERTIES - MENUITEM "&Atualizar mapa de nome/ID", IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "Ponto de &Montagem" - BEGIN - MENUITEM "E&xibir...", IDM_MOUNTPOINT_SHOW - MENUITEM "&Remover...", IDM_MOUNTPOINT_REMOVE - MENUITEM "&Fazer...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "&Esvaziar Arquivo/Dir", IDM_FLUSH - MENUITEM "Esvaziar Vol&ume", IDM_FLUSH_VOLUME - MENUITEM "Mostrar Servidores de Ar&quivos...", IDM_SHOW_SERVER - MENUITEM "Mostrar &Célula...", IDM_SHOWCELL - MENUITEM "Mostrar &Status do Servidor...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Informações do Volume" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "Ajuda",9,240,150,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Arquivo/Diretório",IDC_STATIC,10,10,55,10 - LTEXT "Nome",IDC_STATIC,90,10,25,8 - LTEXT "Quota",IDC_STATIC,225,10,19,8 - LTEXT "Usado",IDC_STATIC,270,10,24,8 - LTEXT "%Usada",IDC_STATIC,305,10,29,8 - LTEXT "ID",IDC_STATIC,175,10,10,8 - LTEXT "Nova Quota:",IDC_STATIC,10,127,44,10 - EDITTEXT IDC_NEW_QUOTA,55,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "Mostrar Informações da Partição",IDC_PARTITION_INFO,205, - 125,107,14,WS_DISABLED - LTEXT "KBytes",IDC_STATIC,118,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,106,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Definir ACL do AFS" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",IDC_DIR_NAME,51,12,259,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Ler",IDC_READ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 200,52,55,10 - CONTROL "w - Gravar",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - Procurar",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - Excluir",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - Inserir",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Bloquear",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - Administrar",IDC_ADMINISTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,200,141,59,10 - PUSHBUTTON "&Incluir...",IDC_ADD,270,45,45,14 - PUSHBUTTON "&Remover",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "&Limpar",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "&OK",IDOK,270,150,45,14 - PUSHBUTTON "Ca&ncelar",IDCANCEL,270,175,45,14 - PUSHBUTTON "&Ajuda",9,270,201,45,14 - LTEXT "Diretório:",IDC_STATIC,15,12,30,10 - GROUPBOX "Permissões",IDC_STATIC,195,41,68,115 - LTEXT "Permissões",IDC_STATIC,10,30,41,8 - LTEXT "Nome",IDC_COLUMN_3,69,38,20,8 - LTEXT "Normais",IDC_STATIC,10,38,37,8 - LTEXT "Permissões",IDC_STATIC,10,125,42,8 - LTEXT "Negativas",IDC_STATIC,10,133,38,8 - LTEXT "Nome",IDC_COLUMN_4,69,133,20,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "Co&piar...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 219, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Fazer Ponto de Montagem" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_DIR,40,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,40,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,40,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,20,81,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,85,81,50,14 - PUSHBUTTON "Ajuda",9,150,81,50,14 - LTEXT "Diretório:",IDC_STATIC,5,12,30,10 - LTEXT "Volume:",IDC_STATIC,5,28,25,10 - LTEXT "Célula:",IDC_STATIC,5,42,26,10 - GROUPBOX "",IDC_STATIC,41,52,137,20 - LTEXT "Opções:",IDC_STATIC,9,59,25,10 - CONTROL "Regular",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,47,59,41,10 - CONTROL "Leitura/Gravação",IDC_RW,"Button",BS_AUTORADIOBUTTON, - 102,59,74,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 235, 113 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Incluir Entrada na ACL" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_NAME,35,70,190,12,ES_AUTOHSCROLL - CONTROL "r - Ler",IDC_READ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 20,15,45,10 - CONTROL "l - Procurar",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - Inserir",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - Excluir",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - Gravar",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Bloquear",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - Administrar",IDC_ADMINISTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,80,35,60,10 - CONTROL "Entrada Normal",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,155,14,64,10 - CONTROL "Entrada negativa",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,155,24,69,10 - PUSHBUTTON "OK",IDOK,22,90,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,92,90,50,14 - PUSHBUTTON "Ajuda",9,162,90,50,14 - LTEXT "Nome:",IDC_STATIC,10,72,20,8 - GROUPBOX "Permissões",IDC_STATIC,10,5,135,55 - GROUPBOX "Tipo de Entrada",IDC_STATIC,150,5,77,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 133, 82 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Informações da Partição" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,61,10,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,61,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,61,40,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "Fechar",IDOK,14,62,40,14 - PUSHBUTTON "Ajuda",9,69,62,40,14 - LTEXT "% Usada:",IDC_STATIC,5,42,37,8 - LTEXT "Blocos Livres:",IDC_STATIC,5,27,50,8 - LTEXT "Tamanho Total:",IDC_STATIC,5,12,52,8 - LTEXT "K Bytes",IDC_STATIC,103,12,25,8 - LTEXT "K Bytes",IDC_STATIC,103,27,25,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Copiar da ACL" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Procurar",IDC_BROWSE,195,25,35,15 - CONTROL "Limpar Entradas Atuais:",IDC_CLEAR,"Button", - BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,10,46,95,10 - DEFPUSHBUTTON "OK",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "Cancelar",IDCANCEL,95,65,50,14 - PUSHBUTTON "Ajuda",9,170,65,50,14 - LTEXT "Copiar De:",IDC_STATIC,13,12,35,8 - LTEXT "Copiar Para:",IDC_STATIC,13,29,43,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Onde Está" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Fechar",IDOK,65,145,50,14 - PUSHBUTTON "Ajuda",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Arquivo/Diretório",IDC_STATIC,10,10,62,8 - LTEXT "Servidor(es) de Arquivos",IDC_STATIC,128,10,44,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Resultados" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Fechar",IDOK,65,145,50,14 - PUSHBUTTON "Ajuda",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Arquivo/Diretório",-1,10,10,60,8 - LTEXT "Resultado",IDC_RESULTS_LABEL,128,10,44,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Pontos de Montagem" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Fechar",IDOK,65,145,50,14 - PUSHBUTTON "Ajuda",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Arquivo",IDC_STATIC,10,11,30,8 - LTEXT "Volume",IDC_STATIC,75,11,27,8 - LTEXT "Célula",IDC_STATIC,155,11,27,8 - LTEXT "Tipo",IDC_STATIC,230,11,20,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Servidores Inoperantes" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "Estes servidores ainda estão inoperantes:",IDC_STATIC, - 10,10,136,8 - DEFPUSHBUTTON "OK",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Status do Servidor" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Célula Local",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,61,8 - CONTROL "Célula Especificada:",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,82,10 - CONTROL "Todas as Células",IDC_ALL_CELLS,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,65,71,10 - CONTROL "Não sondar servidores",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,86,10 - PUSHBUTTON "Mostrar Status",IDC_SHOWSTATUS,10,120,50,14 - GROUPBOX "Célula",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,95,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,47,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Fechar",IDCANCEL,65,120,50,14 - PUSHBUTTON "Ajuda",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Autenticação" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "Obter Tokens",ID_GET_TOKENS,15,137,55,14 - PUSHBUTTON "Descartar Tokens",ID_DISCARD_TOKENS,79,137,62,14 - PUSHBUTTON "Fechar",IDCANCEL,150,137,55,14 - PUSHBUTTON "Ajuda",9,214,137,55,14 - LTEXT "Nome do Usuário",IDC_STATIC,10,9,61,8 - LTEXT "Nome da Célula",IDC_STATIC,104,9,57,8 - LTEXT "Vencimento",IDC_STATIC,222,9,38,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 169, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Obter Tokens" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - EDITTEXT IDC_NAME,40,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,40,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,40,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,20,70,33,14,WS_DISABLED - PUSHBUTTON "Cancelar",IDCANCEL,70,70,33,14 - PUSHBUTTON "Ajuda",9,120,70,33,14 - LTEXT "Nome:",IDC_STATIC,13,12,22,8 - LTEXT "Senha:",IDC_STATIC,13,32,34,8 - LTEXT "Célula:",IDC_STATIC,13,52,24,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 189, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Descartar Tokens" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,29,40,35,14 - PUSHBUTTON "Cancelar",IDCANCEL,79,40,35,14 - PUSHBUTTON "Ajuda",9,129,40,35,14 - LTEXT "Célula:",IDC_STATIC,10,17,24,8 - EDITTEXT IDC_CELL_NAME,34,15,145,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Submontagens" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Incluir ",IDC_ADD,202,20,45,14 - PUSHBUTTON "Excluir",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "Alterar",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "Submontagens:",IDC_STATIC,10,10,50,8 - PUSHBUTTON "OK",IDOK,202,145,45,14 - PUSHBUTTON "Cancelar",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 267, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Incluir Submontagem" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_SHARE_NAME,97,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,97,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "OK",IDOK,24,53,45,14 - PUSHBUTTON "Cancelar",IDCANCEL,111,53,45,14 - PUSHBUTTON "Ajuda",9,198,53,45,14 - LTEXT "Nome do Compartilhamento:",IDC_STATIC,4,10,90,8 - LTEXT "Nome do Caminho:",IDC_STATIC,4,25,61,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 182 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 260 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "Entrar ou sair do AFS" - ID_SERVER_STATUS "Verificar Servidores" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "Não é possível esvaziar o arquivo ativo %o" - IDS_FLUSH_ERROR "Erro ao esvaziar o arquivo %o: %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "Arquivo(s) selecionado(s) esvaziado(s) com êxito" - IDS_CANT_GET_CELL "Erro ao determinar a célula:" - IDS_FLUSH_VOLUME_ERROR "Erro ao esvaziar volume para %o: %s" - IDS_FLUSH_VOLUME_OK "Volume esvaziado com êxito" - IDS_WHERE_IS "O arquivo %o está no host %s" - IDS_CLEANACL_NOT_SUPPORTED - "Não é possível limpar a ACL para o arquivo %o: clean Acl não é suportado para listas de acesso DFS" - IDS_ACL_IS_FINE "Lista de acesso para %o está boa" - IDS_CLEANACL_INVALID_ARG - "Não é possível limpar a ACL para o arquivo %o: Argumento inválido, motivos possíveis incluem: o arquivo não está com erro ou existem muitos usuários na lista de controle de acesso" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "Entradas obsoletas na ACL foram excluídas." - ID_SUBMOUNTS "Criar ou excluir uma submontagem AFS" - IDS_GETRIGHTS_ERROR "Incapaz de ler a lista de acesso para o diretório %o: %o" - IDS_DFSACL_ERROR "Não é possível editar ACLs do DFS com este comando" - IDS_SAVE_ACL_ERROR "Não é possível salvar a ACL para %o: %o" - IDS_SAVE_ACL_EINVAL_ERROR - "Não é possível salvar a ACL para %o: Argumento inválido, motivos possíveis incluem: o arquivo não está na AFS, muitos usuários na lista de controle do acesso, tentativa de incluir usuário não existente na lista de controle de acesso" - IDS_ACL_READ_ERROR "Não é possível ler a ACL para %o: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "Não é possível copiar a ACL para o diretório %o: a função copiar a ACL não é suportada para listas de acesso DFS" - IDS_COPY_ACL_EINVAL_ERROR - "Não é possível copiar a ACL para o diretório %o: Argumento inválido, motivos possíveis incluem: Arquivo não está na AFS." - IDS_COPY_ACL_ERROR "Não é possível copiar a ACL para %o: %o" - IDS_NOT_MOUNT_POINT_ERROR "%o não é um ponto de montagem." - IDS_LIST_MOUNT_POINT_ERROR "Erro: %o" - IDS_MAKE_MP_NOT_AFS_ERROR - "Pontos de montagem devem ser criados no sistema de arquivos do AFS" - IDS_MOUNT_POINT_ERROR "Erro ao criar ponto de montagem: %o" - IDS_ERROR "Erro: %o" - IDS_DELETED "Excluído com êxito" - IDS_SET_QUOTA_ERROR "Erro ao definir quota: %o" - ID_SUBMOUNTS_CREATE "Criar uma Submontagem AFS" - ID_SUBMOUNTS_EDIT "Incluir, alterar ou excluir submontagens do AFS" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "Erro ao verificar status de máquinas de servidor de arquivos: %o" - IDS_ALL_SERVERS_RUNNING "Todos os servidores estão em execução." - IDS_CHECK_VOLUMES_OK "Todos os mapeamentos de ID/nome de volume verificados." - IDS_CHECK_VOLUMES_ERROR "Erro ao verificar mapeamentos de ID/nome de volume: %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE - "O nome escolhido já está em uso. Digite um nome diferente." - IDS_REALLY_DEL_MOUNT_POINTS - "Tem certeza de que deseja remover o(s) ponto(s) de montagem selecionado(s)?" - IDS_DIR_DOES_NOT_EXIST_ERROR "O diretório '%o' não existe." - IDS_CLEANACL_MSG "As ACLs obsoletas serão excluídas!" - IDS_COPY_ACL_OK "ACL copiada com êxito." - IDS_GET_TOKENS_NO_AFS_SERVICE - "Não é possível ler as informações de token: o serviço do AFS pode não ter iniciado." - IDS_GET_TOKENS_UNEXPECTED_ERROR - "Não é possível ler as informações de token: Erro inesperado, código %d." - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "Não é possível ler as informações de token: Erro inesperado, serviço %s.%s.%s, código %d." - IDS_ENTER_QUOTA "Digite uma quota válida." - IDS_AUTHENTICATION_ITEM "&Autenticação..." - IDS_ACLS_ITEM "&Listas de Controle de Acesso..." - IDS_VOL_PART_ITEM "&Volume/Partição" - IDS_VOL_PART_PROPS_ITEM "&Propriedades" - IDS_VOL_PART_REFRESH_ITEM "&Atualizar mapa de nome/ID" - IDS_MOUNT_POINT_ITEM "Ponto de &Montagem" - IDS_MP_SHOW_ITEM "E&xibir..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "&Remover..." - IDS_MP_MAKE_ITEM "&Fazer..." - IDS_FLUSH_FILE_DIR_ITEM "&Esvaziar Arquivo/Dir" - IDS_FLUSH_VOLUME_ITEM "Esvaziar Vol&ume" - IDS_SHOW_FILE_SERVERS_ITEM "Mostrar Servidores de Ar&quivos..." - IDS_SHOW_CELL_ITEM "Mostrar &Célula..." - IDS_SHOW_SERVER_STATUS_ITEM "Mostrar &Status do Servidor..." - IDS_AFS_ITEM "&AFS" - IDS_SUBMOUNTS_ITEM "Su&bmontagens" - IDS_GET_SUBMT_INFO_ERROR - "Incapaz de ler as informações de submontagem para o sharename %o." - IDS_REALLY_DELETE_SUBMT "Excluir sharename %o?" - IDS_SUBMT_SAVE_FAILED "Falha nas alterações ao banco de dados de submontagem." - IDS_SUBMOUNTS_CREATE_ITEM "&Incluir" - IDS_SUBMOUNTS_EDIT_ITEM "&Editar..." - IDS_EDIT_PATH_NAME "Editar Nome do Caminho" - IDS_SHOW_CELL "Mostrar Célula" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "Célula" - IDS_SHOW_FS "Mostrar Servidores de Arquivos" - IDS_SHOW_FS_COLUMN "Servidor(es) de Arquivos" - IDS_REMOVE_MP "Remover Pontos de Montagem" - IDS_REMOVE_MP_COLUMN "Resultado" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS Client" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/zh_CN/afs_shl_ext.rc b/src/WINNT/client_exp/lang/zh_CN/afs_shl_ext.rc deleted file mode 100644 index 920444e6a..000000000 --- a/src/WINNT/client_exp/lang/zh_CN/afs_shl_ext.rc +++ /dev/null @@ -1,654 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (P.R.C.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x804 -#define AFS_VERINFO_CHARSET 936 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "ÈÏÖ¤...", IDM_AUTHENTICATION - MENUITEM "´æÈ¡¿ØÖƱí...", IDM_ACL_SET - POPUP "¾í£¯·ÖÇø(&V)" - BEGIN - MENUITEM "ÌØÐÔ(&P)...", IDM_VOLUME_PROPERTIES - MENUITEM "Ë¢ÐÂÃû³Æ£¯±êʶ·ûÓ³Éä(&R)", IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "°²×°µã(&M)" - BEGIN - MENUITEM "ÏÔʾ(&S)...", IDM_MOUNTPOINT_SHOW - MENUITEM "³ýÈ¥(&R)...", IDM_MOUNTPOINT_REMOVE - MENUITEM "¶¨ÖÆ(&M)...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "Çå²ÖÎļþ£¯Ä¿Â¼(&F)", IDM_FLUSH - MENUITEM "Çå²Ö¾í(&U)", IDM_FLUSH_VOLUME - MENUITEM "ÏÔʾÎļþ·þÎñÆ÷(&F)...", IDM_SHOW_SERVER - MENUITEM "ÏÔʾµ¥Ôª(&C)...", IDM_SHOWCELL - MENUITEM "ÏÔʾ·þÎñÆ÷״̬...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "¾íÐÅÏ¢" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,60,150,50,14,WS_DISABLED - PUSHBUTTON "°ïÖú",9,240,150,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,150,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Îļþ/Ŀ¼",IDC_STATIC,10,10,44,10 - LTEXT "Ãû³Æ",IDC_STATIC,90,10,20,8 - LTEXT "ÏÞ¶î",IDC_STATIC,225,10,19,8 - LTEXT "ÒÑʹÓÃ",IDC_STATIC,270,10,24,8 - LTEXT "ÒÑʹÓà %",IDC_STATIC,305,10,34,8 - LTEXT "±êʶ·û",IDC_STATIC,175,10,29,8 - LTEXT "ÐÂÏ޶",IDC_STATIC,10,127,40,10 - EDITTEXT IDC_NEW_QUOTA,55,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "ÏÔʾ·ÖÇøÐÅÏ¢",IDC_PARTITION_INFO,205,125,69,14, - WS_DISABLED - LTEXT "ǧ×Ö½Ú",IDC_STATIC,118,127,25,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,106,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÉèÖà AFS ACL" -FONT 8, "System" -BEGIN - LTEXT "",IDC_DIR_NAME,51,12,259,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - ¶ÁÈ¡",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,52,55,10 - CONTROL "w - дÈë",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - ²é±í",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - ɾ³ý",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - ²åÈë",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Ëø¶¨",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - ¹ÜÀí",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,141,55,10 - PUSHBUTTON "Ìí¼Ó(&A)...",IDC_ADD,270,45,45,14 - PUSHBUTTON "³ýÈ¥(&R)",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "Çå³ý(&C)",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "È·¶¨(&O)",IDOK,270,150,45,14 - PUSHBUTTON "È¡Ïû(&N)",IDCANCEL,270,175,45,14 - PUSHBUTTON "°ïÖú(&H)",9,270,201,45,14 - LTEXT "Ŀ¼£º",IDC_STATIC,15,12,30,10 - GROUPBOX "Ðí¿ÉȨ",IDC_STATIC,195,41,65,115 - LTEXT "Õý³£",IDC_STATIC,10,30,23,8 - LTEXT "Ãû³Æ",IDC_COLUMN_3,69,38,20,8 - LTEXT "Ðí¿ÉȨ",IDC_STATIC,10,38,37,8 - LTEXT "ä¯ÀÀ",IDC_STATIC,10,125,30,8 - LTEXT "Ðí¿ÉȨ",IDC_STATIC,10,133,38,8 - LTEXT "Ãû³Æ",IDC_COLUMN_4,69,133,20,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "¸´ÖÆ(&P)...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 219, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¶¨Öư²×°µã" -FONT 8, "System" -BEGIN - EDITTEXT IDC_DIR,40,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,40,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,40,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,20,81,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,85,81,50,14 - PUSHBUTTON "°ïÖú",9,150,81,50,14 - LTEXT "Ŀ¼£º",IDC_STATIC,5,12,30,10 - LTEXT "¾í£º",IDC_STATIC,5,27,30,10 - LTEXT "µ¥Ôª£º",IDC_STATIC,5,42,30,10 - GROUPBOX "",IDC_STATIC,40,52,115,20 - LTEXT "Ñ¡Ï",IDC_STATIC,5,57,30,10 - CONTROL "¹æÔò",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,45,59,41,10 - CONTROL "¶ÁÈ¡£¯Ð´Èë",IDC_RW,"Button",BS_AUTORADIOBUTTON,100,59, - 50,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 235, 113 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ìí¼Ó ACL ÌõÄ¿" -FONT 8, "System" -BEGIN - EDITTEXT IDC_NAME,41,70,184,12,ES_AUTOHSCROLL - CONTROL "r - ¶ÁÈ¡",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,45,10 - CONTROL "l - ²é±í",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - ²åÈë",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - ɾ³ý",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - дÈë",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Ëø¶¨",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - ¹ÜÀí",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,35,60,10 - CONTROL "Ò»°ãÌõÄ¿",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,161,16,54,10 - CONTROL "ä¯ÀÀÌõÄ¿",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,161,26,59,10 - PUSHBUTTON "È·¶¨",IDOK,22,90,50,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,92,90,50,14 - PUSHBUTTON "°ïÖú",9,162,90,50,14 - LTEXT "Ãû³Æ£º",IDC_STATIC,10,72,26,8 - GROUPBOX "Ðí¿ÉȨ",IDC_STATIC,10,5,135,55 - GROUPBOX "ÌõÄ¿ÀàÐÍ",IDC_STATIC,155,6,70,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 123, 83 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "·ÖÇøÐÅÏ¢" -FONT 8, "System" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,50,10,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,50,25,40,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,50,40,40,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "¹Ø±Õ",IDOK,14,62,40,14 - PUSHBUTTON "°ïÖú",9,69,62,40,14 - LTEXT "ÒÑʹÓà %£º",IDC_STATIC,5,42,40,8 - LTEXT "¿ÕÏп飺",IDC_STATIC,5,27,40,8 - LTEXT "×ܼƴóС£º",IDC_STATIC,5,12,40,8 - LTEXT "ǧ×Ö½Ú",IDC_STATIC,92,12,25,8 - LTEXT "ǧ×Ö½Ú",IDC_STATIC,92,27,25,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¸´ÖÆ ACL" -FONT 8, "System" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "ä¯ÀÀ",IDC_BROWSE,195,25,35,15 - CONTROL "Çå³ýµ±Ç°ÌõÄ¿£º",IDC_CLEAR,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,10,46,82,10 - DEFPUSHBUTTON "È·¶¨",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "È¡Ïû",IDCANCEL,95,65,50,14 - PUSHBUTTON "°ïÖú",9,170,65,50,14 - LTEXT "¸´ÖÆ×Ô£º",IDC_STATIC,15,12,35,8 - LTEXT "¸´ÖƵ½£º",IDC_STATIC,15,29,35,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "λÖÃ" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "¹Ø±Õ",IDOK,65,145,50,14 - PUSHBUTTON "°ïÖú",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Îļþ/Ŀ¼",IDC_STATIC,10,10,47,8 - LTEXT "Îļþ·þÎñÆ÷",IDC_STATIC,128,10,44,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "½á¹û" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "¹Ø±Õ",IDOK,65,145,50,14 - PUSHBUTTON "°ïÖú",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Îļþ/Ŀ¼",-1,10,10,45,8 - LTEXT "½á¹û",IDC_RESULTS_LABEL,128,10,44,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "°²×°µã" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "¹Ø±Õ",IDOK,65,145,50,14 - PUSHBUTTON "°ïÖú",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "Îļþ",IDC_STATIC,10,11,27,8 - LTEXT "¾í",IDC_STATIC,75,11,27,8 - LTEXT "µ¥Ôª",IDC_STATIC,155,11,27,8 - LTEXT "ÀàÐÍ",IDC_STATIC,230,11,27,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "¹Ø±ÕµÄ·þÎñÆ÷" -FONT 8, "System" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "ÕâЩ·þÎñÆ÷ÈÔÈ»¹Ø±Õ×Å£º",IDC_STATIC,10,10,95,8 - DEFPUSHBUTTON "È·¶¨",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "·þÎñÆ÷״̬" -FONT 8, "System" -BEGIN - CONTROL "±¾µØµ¥Ôª",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,50,8 - CONTROL "Ö¸¶¨µÄµ¥Ôª£º",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,60,10 - CONTROL "ËùÓе¥Ôª",IDC_ALL_CELLS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,20,65,45,10 - CONTROL "²»¼ì²â·þÎñÆ÷",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,80,10 - PUSHBUTTON "ÏÔʾ״̬",IDC_SHOWSTATUS,10,120,50,14 - GROUPBOX "µ¥Ôª",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,90,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,47,130,12,ES_AUTOHSCROLL - PUSHBUTTON "¹Ø±Õ",IDCANCEL,65,120,50,14 - PUSHBUTTON "°ïÖú",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÈÏÖ¤" -FONT 8, "System" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "»ñµÃÁîÅÆ",ID_GET_TOKENS,15,137,55,14 - PUSHBUTTON "¶ªÆúÁîÅÆ",ID_DISCARD_TOKENS,80,137,55,14 - PUSHBUTTON "¹Ø±Õ",IDCANCEL,145,137,55,14 - PUSHBUTTON "°ïÖú",9,215,137,55,14 - LTEXT "Óû§Ãû",IDC_STATIC,10,9,38,8 - LTEXT "µ¥ÔªÃû",IDC_STATIC,104,9,33,8 - LTEXT "µ½ÆÚ",IDC_STATIC,222,9,32,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 169, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "»ñµÃÁîÅÆ" -FONT 8, "System" -BEGIN - EDITTEXT IDC_NAME,40,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,40,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,40,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "È·¶¨",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "È¡Ïû",IDCANCEL,70,70,35,14 - PUSHBUTTON "°ïÖú",9,120,70,35,14 - LTEXT "Ãû³Æ£º",IDC_STATIC,10,12,27,8 - LTEXT "¿ÚÁ",IDC_STATIC,10,32,27,8 - LTEXT "µ¥Ôª£º",IDC_STATIC,10,52,27,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 185, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "¶ªÆúÁîÅÆ" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,25,40,35,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,75,40,35,14 - PUSHBUTTON "°ïÖú",9,125,40,35,14 - LTEXT "µ¥Ôª£º",IDC_STATIC,10,17,24,8 - EDITTEXT IDC_CELL_NAME,37,15,137,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "×Ó°²×°" -FONT 8, "System" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Ìí¼Ó ",IDC_ADD,202,20,45,14 - PUSHBUTTON "ɾ³ý",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "¸ü¸Ä",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "×Ó°²×°£º",IDC_STATIC,10,10,50,8 - PUSHBUTTON "È·¶¨",IDOK,202,145,45,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 235, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ìí¼Ó×Ó°²×°" -FONT 8, "System" -BEGIN - EDITTEXT IDC_SHARE_NAME,62,8,163,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,62,23,163,12,ES_AUTOHSCROLL - PUSHBUTTON "È·¶¨",IDOK,22,53,45,14 - PUSHBUTTON "È¡Ïû",IDCANCEL,92,53,45,14 - PUSHBUTTON "°ïÖú",9,167,53,45,14 - LTEXT "¹²ÏíÃû£º",IDC_STATIC,18,10,41,8 - LTEXT "·¾¶Ãû£º",IDC_STATIC,18,25,41,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 178 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "µÇ¼½øÈë»òÍ˳ö AFS" - ID_SERVER_STATUS "¼ì²é·þÎñÆ÷" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "²»ÄÜÇå²Ö»î¶¯µÄÎļþ %o" - IDS_FLUSH_ERROR "Çå²ÖÎļþ %o ³ö´í£º %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "³É¹¦Çå²ÖÑ¡¶¨µÄÎļþ" - IDS_CANT_GET_CELL "È·¶¨µ¥Ôª³ö´í£º" - IDS_FLUSH_VOLUME_ERROR "Çå²Ö %o µÄ¾í³ö´í£º%s" - IDS_FLUSH_VOLUME_OK "Çå²Ö¾í³É¹¦" - IDS_WHERE_IS "Îļþ %o ÔÚÖ÷»ú %s ÉÏ" - IDS_CLEANACL_NOT_SUPPORTED - "²»ÄÜÇå³ýÎļþ %o µÄ ACL£ºDFS ´æÈ¡ÁÐ±í²»Ö§³ÖÇå³ý Acl" - IDS_ACL_IS_FINE "%o ´æÈ¡Áбí¿ÉÓÃ" - IDS_CLEANACL_INVALID_ARG - "²»ÄÜÇå³ýÎļþ %o µÄ ACL£ºÎÞЧ±äÁ¿,¿ÉÄܵÄÔ­Òò°üÀ¨£ºÎļþ²»ÔÚ vice Öлò´æÈ¡¿ØÖƱíÖÐÓû§Ì«¶à" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "ÒÑɾ³ý¹ýʱµÄ ACL ÌõÄ¿¡£" - ID_SUBMOUNTS "´´½¨»òɾ³ýÒ»¸ö AFS ×Ó°²×°" - IDS_GETRIGHTS_ERROR "ÎÞ·¨¶ÁȡĿ¼ %o µÄ´æÈ¡ÁÐ±í£º%o" - IDS_DFSACL_ERROR "²»ÄÜÓôËÃüÁî±à¼­ DFS ACL" - IDS_SAVE_ACL_ERROR "²»Äܱ£´æ %o µÄ ACL£º%o" - IDS_SAVE_ACL_EINVAL_ERROR - "²»Äܱ£´æ %o µÄ ACL£ºÎÞЧ±äÁ¿£¬¿ÉÄܵÄÔ­Òò°üÀ¨£ºÎļþ²»ÔÚ AFS ÖУ¬»ò´æÈ¡¿ØÖƱíÖÐÓû§Ì«¶à£¬Çë³¢ÊÔÌí¼Ó·ÇÏÖÓÐÓû§ÖÁ´æÈ¡¿ØÖƱíÖÐ" - IDS_ACL_READ_ERROR "²»ÄܶÁÈ¡ %o µÄ ACL£º%o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "²»ÄÜΪĿ¼ %o ¸´ÖÆ ACL£ºDFS ´æÈ¡ÁÐ±í²»Ö§³Ö¸´ÖÆ ACL" - IDS_COPY_ACL_EINVAL_ERROR - "²»Äܸ´ÖÆ ACL ÖÁĿ¼ %o£ºÎÞЧ±äÁ¿£¬¿ÉÄܵÄÔ­Òò°üÀ¨£ºÎļþ²»ÔÚ AFS ÖС£" - IDS_COPY_ACL_ERROR "²»Äܸ´ÖÆ ACL ÖÁ %o£º%o" - IDS_NOT_MOUNT_POINT_ERROR "%o ²»ÊÇÒ»¸ö°²×°µã¡£" - IDS_LIST_MOUNT_POINT_ERROR "³ö´í£º%o" - IDS_MAKE_MP_NOT_AFS_ERROR "°²×°µã±ØÐë´´½¨ÔÚ AFS ÎļþϵͳÖÐ" - IDS_MOUNT_POINT_ERROR "´´½¨°²×°µã³ö´í£º%o" - IDS_ERROR "³ö´í£º%o" - IDS_DELETED "³É¹¦É¾³ý" - IDS_SET_QUOTA_ERROR "ÉèÖÃÏÞ¶î³ö´í£º%o" - ID_SUBMOUNTS_CREATE "´´½¨Ò»¸ö AFS ×Ó°²×°" - ID_SUBMOUNTS_EDIT "Ìí¼Ó¡¢¸ü¸Ä»òɾ³ý AFS ×Ó°²×°" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "¼ì²éÎļþ·þÎñÆ÷µÄ״̬³ö´í£º %o" - IDS_ALL_SERVERS_RUNNING "ËùÓзþÎñÆ÷ÕýÔÚÔËÐС£" - IDS_CHECK_VOLUMES_OK "ÒѼì²éËùÓоí±êʶ·û£¯Ãû³ÆÓ³Éä¡£" - IDS_CHECK_VOLUMES_ERROR "¼ì²é¾í±êʶ·û£¯Ãû³ÆÓ³Éä³ö´í£º %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE "ÄúËùÑ¡ÔñµÄÃû³ÆÔÚʹÓÃÖС£ÇëÊäÈëÒ»¸ö²»Í¬µÄÃû³Æ¡£" - IDS_REALLY_DEL_MOUNT_POINTS "È·ÈÏÄúÒª³ýȥѡ¶¨µÄ°²×°µãÂð?" - IDS_DIR_DOES_NOT_EXIST_ERROR "Ŀ¼¡®%o¡¯²»´æÔÚ¡£" - IDS_CLEANACL_MSG "½«É¾³ý¹ýʱµÄ ACL!" - IDS_COPY_ACL_OK "ACL ¸´ÖƳɹ¦¡£" - IDS_GET_TOKENS_NO_AFS_SERVICE "²»ÄܶÁÈ¡ÁîÅÆÐÅÏ¢£ºAFS ·þÎñ¿ÉÄÜûÓÐÆô¶¯¡£" - IDS_GET_TOKENS_UNEXPECTED_ERROR - "²»ÄܶÁÈ¡ÁîÅÆÐÅÏ¢£º²»¿ÉÔ¤¼ÆµÄ´íÎ󣬴úÂë %d¡£" - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "²»ÄܶÁÈ¡ÁîÅÆÐÅÏ¢£º²»¿ÉÔ¤¼ÆµÄ´íÎ󣬷þÎñ %s.%s.%s£¬´úÂë %d¡£" - IDS_ENTER_QUOTA "ÇëÊäÈëÒ»¸öÓÐЧµÄÏÞ¶î¡£" - IDS_AUTHENTICATION_ITEM "ÈÏÖ¤(&A)..." - IDS_ACLS_ITEM "´æÈ¡¿ØÖƱí(&C)..." - IDS_VOL_PART_ITEM "¾í£¯·ÖÇø(&V)" - IDS_VOL_PART_PROPS_ITEM "ÌØÐÔ(&P)" - IDS_VOL_PART_REFRESH_ITEM "Ë¢ÐÂÃû³Æ£¯±êʶ·ûÓ³Éä(&R)" - IDS_MOUNT_POINT_ITEM "°²×°µã(&M)" - IDS_MP_SHOW_ITEM "ÏÔʾ(&S)..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "³ýÈ¥(&R)..." - IDS_MP_MAKE_ITEM "¶¨ÖÆ(&M)..." - IDS_FLUSH_FILE_DIR_ITEM "Çå²ÖÎļþ£¯Ä¿Â¼(&F)" - IDS_FLUSH_VOLUME_ITEM "Çå²Ö¾í(&U)" - IDS_SHOW_FILE_SERVERS_ITEM "ÏÔʾÎļþ·þÎñÆ÷(&F)..." - IDS_SHOW_CELL_ITEM "ÏÔʾµ¥Ôª(&C)..." - IDS_SHOW_SERVER_STATUS_ITEM "ÏÔʾ·þÎñÆ÷״̬..." - IDS_AFS_ITEM "AFS(&A)" - IDS_SUBMOUNTS_ITEM "×Ó°²×°(&B)" - IDS_GET_SUBMT_INFO_ERROR "ÎÞ·¨¶ÁÈ¡Óйع²ÏíÃû %o µÄ×Ó°²×°ÐÅÏ¢¡£" - IDS_REALLY_DELETE_SUBMT "ɾ³ý¹²ÏíÃû %o Âð?" - IDS_SUBMT_SAVE_FAILED "¶ÔÓÚ×Ó°²×°Êý¾Ý¿âµÄ¸ü¸Äʧ°Ü¡£" - IDS_SUBMOUNTS_CREATE_ITEM "Ìí¼Ó(&A)" - IDS_SUBMOUNTS_EDIT_ITEM "±à¼­(&E)..." - IDS_EDIT_PATH_NAME "±à¼­Â·¾¶Ãû" - IDS_SHOW_CELL "ÏÔʾµ¥Ôª" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "µ¥Ôª" - IDS_SHOW_FS "ÏÔʾÎļþ·þÎñÆ÷" - IDS_SHOW_FS_COLUMN "Îļþ·þÎñÆ÷" - IDS_REMOVE_MP "³ýÈ¥°²×°µã" - IDS_REMOVE_MP_COLUMN "½á¹û" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS ¿Í»§»ú" -END - -#endif // Chinese (P.R.C.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/lang/zh_TW/afs_shl_ext.rc b/src/WINNT/client_exp/lang/zh_TW/afs_shl_ext.rc deleted file mode 100644 index a16ed9c4b..000000000 --- a/src/WINNT/client_exp/lang/zh_TW/afs_shl_ext.rc +++ /dev/null @@ -1,654 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Taiwan) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 4, 1\r\n" - "#endif\r\n" - "#include ""afs_shl_ext.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS Explorer Extension DLL" - -#define AFS_VERINFO_NAME "afs_shl_ext" -#define AFS_VERINFO_FILENAME "afs_shl_ext.exe" -#define AFS_VERINFO_LANG_CODE 0x404 -#define AFS_VERINFO_CHARSET 950 -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" - -#endif // !_MAC -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU_FILE MENU DISCARDABLE -BEGIN - MENUITEM "Ų§O...", IDM_AUTHENTICATION - MENUITEM "¦s¨ú±±¨î²M³æ...", IDM_ACL_SET - POPUP "®eÅé/¤À³Î°Ï(&V)" - BEGIN - MENUITEM "¤º®e(&P)...", IDM_VOLUME_PROPERTIES - MENUITEM "­«·s¾ã²z¦WºÙ/ID ¹ïÀ³(&R)", IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE - - END - POPUP "¸Ë¸üÂI(&M)" - BEGIN - MENUITEM "Åã¥Ü(&S)...", IDM_MOUNTPOINT_SHOW - MENUITEM "²¾°£(&R)...", IDM_MOUNTPOINT_REMOVE - MENUITEM "»s§@(&M)...", IDM_MOUNTPOINT_MAKE - END - MENUITEM "¨R¼gÀÉ®×/¥Ø¿ý(&F)", IDM_FLUSH - MENUITEM "¨R¼g®eÅé(&U)", IDM_FLUSH_VOLUME - MENUITEM "Åã¥ÜÀɮצøªA¾¹(&F)...", IDM_SHOW_SERVER - MENUITEM "Åã¥Ü Cell (&C)...", IDM_SHOWCELL - MENUITEM "Åã¥Ü¦øªA¾¹ª¬ºA...", IDM_SERVER_STATUS - MENUITEM "Remove SymLink", IDM_REMOVE_SYMLINK -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_VOLUME_INFO DIALOG DISCARDABLE 0, 0, 349, 173 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "®eÅé¸ê°T" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,55,150,50,14,WS_DISABLED - PUSHBUTTON "»¡©ú",9,235,150,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,145,150,50,14 - LISTBOX IDC_LIST,10,20,330,100,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "ÀÉ®× / ¥Ø¿ý",IDC_STATIC,10,10,44,10 - LTEXT "¦WºÙ",IDC_STATIC,90,10,20,8 - LTEXT "°tÃB",IDC_STATIC,225,10,19,8 - LTEXT "¤w¨Ï¥Îªº",IDC_STATIC,270,10,20,8 - LTEXT "¤w¨Ï¥Îªº % (U)",IDC_STATIC,305,10,25,8 - LTEXT "ID",IDC_STATIC,175,10,10,8 - LTEXT "·s°tÃB¡G",IDC_STATIC,10,127,40,10 - EDITTEXT IDC_NEW_QUOTA,55,126,50,12,ES_AUTOHSCROLL | WS_DISABLED - PUSHBUTTON "Åã¥Ü¤À³Î°Ï¸ê°T",IDC_PARTITION_INFO,216,125,69,14, - WS_DISABLED - LTEXT "¤d¦ì¤¸²Õ",IDC_STATIC,122,128,51,10 - CONTROL "Spin1",IDC_QUOTA_SPIN,"msctls_updown32",UDS_WRAP | - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - WS_DISABLED,106,125,10,14 -END - -IDD_SET_AFS_ACL DIALOG DISCARDABLE 0, 0, 325, 228 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "³]©w AFS ACL" -FONT 9, "·s²Ó©úÅé" -BEGIN - LTEXT "",IDC_DIR_NAME,51,12,259,10 - LISTBOX IDC_NORMAL_RIGHTS,10,46,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_NEGATIVE_ENTRIES,10,141,175,75,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | - WS_HSCROLL | WS_TABSTOP - CONTROL "r - Ū¨ú",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,52,55,10 - CONTROL "w - ¼g¤J",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,111,55,10 - CONTROL "l - ¬d¾\",IDC_LOOKUP,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,66,55,10 - CONTROL "d - §R°£",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,96,55,10 - CONTROL "i - ´¡¤J",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,81,55,10 - CONTROL "k - Âê©w",IDC_LOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,126,55,10 - CONTROL "a - ºÞ²zªÌ",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,200,141,55,10 - PUSHBUTTON "·s¼W(&A)...",IDC_ADD,270,45,45,14 - PUSHBUTTON "²¾°£(&R)",IDC_REMOVE,270,70,45,14,WS_DISABLED - PUSHBUTTON "²M°£(&C)",IDC_CLEAN,270,95,45,14 - DEFPUSHBUTTON "½T©w(&O)",IDOK,270,150,45,14 - PUSHBUTTON "¨ú®ø(&N)",IDCANCEL,270,175,45,14 - PUSHBUTTON "»¡©ú(&H)",9,270,201,45,14 - LTEXT "¥Ø¿ý¡G",IDC_STATIC,15,12,30,10 - GROUPBOX "³\¥iÅv",IDC_STATIC,195,41,65,115 - LTEXT "¤@¯ë",IDC_STATIC,10,30,23,8 - LTEXT "¦WºÙ",IDC_COLUMN_3,69,38,20,8 - LTEXT "³\¥iÅv",IDC_STATIC,10,38,37,8 - LTEXT "­t­±ªº",IDC_STATIC,10,125,30,8 - LTEXT "³\¥iÅv",IDC_STATIC,10,133,38,8 - LTEXT "¦WºÙ",IDC_COLUMN_4,69,133,20,8 - GROUPBOX "",IDC_STATIC,10,5,305,20 - PUSHBUTTON "½Æ»s(&P)...",IDC_COPY,270,120,45,14 -END - -IDD_MAKE_MOUNT_POINT DIALOG DISCARDABLE 0, 0, 219, 103 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "»s§@¸Ë¸üÂI" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_DIR,40,10,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_VOLUME,40,25,170,12,ES_AUTOHSCROLL - EDITTEXT IDC_CELL,40,40,170,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,20,81,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,85,81,50,14 - PUSHBUTTON "»¡©ú",9,150,81,50,14 - LTEXT "¥Ø¿ý¡G",IDC_STATIC,9,12,30,10 - LTEXT "®eÅé¡G",IDC_STATIC,9,28,25,10 - LTEXT "Cell¡G",IDC_STATIC,9,42,26,10 - GROUPBOX "",IDC_STATIC,40,52,115,20 - LTEXT "¿ï¶µ¡G",IDC_STATIC,9,59,25,10 - CONTROL "¼Ð·Ç",IDC_REGULAR,"Button",BS_AUTORADIOBUTTON | - WS_GROUP,45,59,41,10 - CONTROL "Ū¨ú / ¼g¤J",IDC_RW,"Button",BS_AUTORADIOBUTTON,100,59, - 54,10 -END - -IDD_ADD_ACL DIALOG DISCARDABLE 0, 0, 235, 113 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "·s¼W ACL ¶µ¥Ø" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_NAME,41,70,184,12,ES_AUTOHSCROLL - CONTROL "r - Ū¨ú",IDC_READ,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,15,45,10 - CONTROL "l - ¬d¾\",IDC_LOOKUP2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,25,50,10 - CONTROL "i - ´¡¤J",IDC_INSERT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,35,50,10 - CONTROL "d - §R°£",IDC_DELETE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,45,50,10 - CONTROL "w - ¼g¤J",IDC_WRITE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,15,50,10 - CONTROL "k - Âê©w",IDC_LOCK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,25,55,10 - CONTROL "a - ºÞ²zªÌ",IDC_ADMINISTER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,80,35,60,10 - CONTROL "¤@¯ë¶µ¥Ø",IDC_ADD_NORMAL_ENTRY,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,161,16,54,10 - CONTROL "­t­±ªº¶µ¥Ø",IDC_ADD_NEGATIVE_ENTRY,"Button", - BS_AUTORADIOBUTTON,161,26,59,10 - PUSHBUTTON "½T©w",IDOK,36,90,50,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,106,90,50,14 - PUSHBUTTON "»¡©ú",9,173,90,50,14 - LTEXT "¦WºÙ¡G",IDC_STATIC,10,72,27,8 - GROUPBOX "³\¥iÅv",IDC_STATIC,10,5,135,55 - GROUPBOX "¶µ¥ØÃþ«¬",IDC_STATIC,155,6,70,34 -END - -IDD_PARTITION_INFO DIALOG DISCARDABLE 0, 0, 123, 83 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¤À³Î°Ï¸ê°T" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_TOTAL_SIZE,51,10,34,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_BLOCKS_FREE,51,25,34,12,ES_AUTOHSCROLL | WS_DISABLED | - NOT WS_TABSTOP - EDITTEXT IDC_PERCENT_USED,51,40,34,12,ES_AUTOHSCROLL | - WS_DISABLED | NOT WS_TABSTOP - DEFPUSHBUTTON "Ãö³¬",IDOK,14,62,40,14 - PUSHBUTTON "»¡©ú",9,69,62,40,14 - LTEXT "¤w¨Ï¥Îªº %¡G",IDC_STATIC,4,42,51,8 - LTEXT "¥i¥Î°Ï¶ô¡G",IDC_STATIC,4,27,40,8 - LTEXT "Á`­p¤j¤p¡G",IDC_STATIC,4,12,46,8 - LTEXT "K ¦ì¤¸²Õ",IDC_STATIC,89,12,32,8 - LTEXT "K ¦ì¤¸²Õ",IDC_STATIC,88,27,31,8 -END - -IDD_COPY_ACL DIALOG DISCARDABLE 0, 0, 239, 88 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "½Æ»s ACL" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_FROM_DIR,55,10,175,12,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_TO_DIR,55,26,130,12,ES_AUTOHSCROLL - PUSHBUTTON "ÂsÄý",IDC_BROWSE,195,25,35,15 - CONTROL "²M°£¥Ø«eªº¶µ¥Ø¡G",IDC_CLEAR,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,10,46,82,10 - DEFPUSHBUTTON "½T©w",IDOK,20,65,50,14,WS_DISABLED - PUSHBUTTON "¨ú®ø",IDCANCEL,95,65,50,14 - PUSHBUTTON "»¡©ú",9,170,65,50,14 - LTEXT "½Æ»s¦Û¡G",IDC_STATIC,10,12,35,8 - LTEXT "½Æ»s¨ì¡G",IDC_STATIC,10,29,38,8 -END - -IDD_WHERE_IS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¦ó³B" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "Ãö³¬",IDOK,65,145,50,14 - PUSHBUTTON "»¡©ú",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ÀÉ®× / ¥Ø¿ý",IDC_STATIC,10,10,47,8 - LTEXT "ÀɮצøªA¾¹",IDC_STATIC,128,10,44,8 -END - -IDD_RESULTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "µ²ªG" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "Ãö³¬",IDOK,65,145,50,14 - PUSHBUTTON "»¡©ú",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ÀÉ®× / ¥Ø¿ý",-1,10,10,45,8 - LTEXT "µ²ªG",IDC_RESULTS_LABEL,128,10,44,8 -END - -IDD_MOUNT_POINTS DIALOG DISCARDABLE 0, 0, 299, 168 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¸Ë¸üÂI" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "Ãö³¬",IDOK,65,145,50,14 - PUSHBUTTON "»¡©ú",9,180,145,50,14 - LISTBOX IDC_LIST,10,20,280,115,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - LTEXT "ÀÉ®×",IDC_STATIC,12,11,32,8 - LTEXT "®eÅé",IDC_STATIC,75,11,27,8 - LTEXT "Cell",IDC_STATIC,155,11,15,8 - LTEXT "Ãþ«¬",IDC_STATIC,230,11,20,8 -END - -IDD_DOWN_SERVERS DIALOG DISCARDABLE 0, 0, 209, 163 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "¦øªA¾¹°±¤î¹B§@" -FONT 9, "·s²Ó©úÅé" -BEGIN - LISTBOX 1029,10,20,190,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL - LTEXT "³o¨Ç¦øªA¾¹¨ÌµM°±¤î¹B§@¡G",IDC_STATIC,10,7,147,8 - DEFPUSHBUTTON "½T©w",IDOK,82,140,45,15 -END - -IDD_SERVERSTATUS DIALOG DISCARDABLE 0, 0, 179, 143 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "¦øªA¾¹ª¬ºA" -FONT 9, "·s²Ó©úÅé" -BEGIN - CONTROL "¥»ºÝ Cell",IDC_LOCALCELL,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,20,20,50,8 - CONTROL "«ü©wªº Cell¡G",IDC_SPECIFIEDCELL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,20,36,60,10 - CONTROL "©Ò¦³ªº Cell",IDC_ALL_CELLS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,20,65,74,10 - CONTROL "¤£­n±´¬d¦øªA¾¹",IDC_DONTPROBESERVERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,24,87,80,10 - PUSHBUTTON "Åã¥Üª¬ºA",IDC_SHOWSTATUS,10,120,50,14 - GROUPBOX "Cell",IDC_STATIC,10,5,160,105,WS_GROUP - GROUPBOX "",IDC_STATIC,20,80,90,20,WS_GROUP - EDITTEXT IDC_CELL_NAME,30,47,130,12,ES_AUTOHSCROLL - PUSHBUTTON "Ãö³¬",IDCANCEL,65,120,50,14 - PUSHBUTTON "»¡©ú",9,120,120,50,14 -END - -IDD_AUTHENTICATION DIALOG DISCARDABLE 0, 0, 285, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ų§O" -FONT 9, "·s²Ó©úÅé" -BEGIN - LISTBOX IDC_TOKEN_LIST,10,18,265,110,LBS_SORT | LBS_USETABSTOPS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | - WS_TABSTOP - PUSHBUTTON "¨ú±o°O¸¹",ID_GET_TOKENS,15,137,55,14 - PUSHBUTTON "±Ë±ó°O¸¹",ID_DISCARD_TOKENS,80,137,55,14 - PUSHBUTTON "Ãö³¬",IDCANCEL,145,137,55,14 - PUSHBUTTON "»¡©ú",9,215,137,55,14 - LTEXT "¨Ï¥ÎªÌ¦WºÙ",IDC_STATIC,10,9,51,8 - LTEXT "Cell ¦WºÙ",IDC_STATIC,104,9,33,8 - LTEXT "¹L´Á",IDC_STATIC,222,9,43,8 -END - -IDD_KLOG_DIALOG DIALOGEX 0, 0, 169, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "¨ú±o°O¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_NAME,40,10,115,12,ES_AUTOHSCROLL - EDITTEXT IDC_PASSWORD,40,30,115,12,ES_PASSWORD | ES_AUTOHSCROLL - EDITTEXT IDC_CELL_NAME,40,50,115,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "½T©w",IDOK,20,70,35,14,WS_DISABLED - PUSHBUTTON "¨ú®ø",IDCANCEL,70,70,35,14 - PUSHBUTTON "»¡©ú",9,120,70,35,14 - LTEXT "¦WºÙ¡G",IDC_STATIC,7,12,32,8 - LTEXT "±K½X¡G",IDC_STATIC,7,32,34,8 - LTEXT "Cell¡G",IDC_STATIC,7,52,25,8 -END - -IDD_UNLOG_DIALOG DIALOGEX 0, 0, 185, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "±Ë±ó°O¸¹" -FONT 9, "·s²Ó©úÅé" -BEGIN - DEFPUSHBUTTON "½T©w",IDOK,29,40,35,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,79,40,35,14 - PUSHBUTTON "»¡©ú",9,129,40,35,14 - LTEXT "Cell¡G",IDC_STATIC,7,17,22,8 - EDITTEXT IDC_CELL_NAME,31,15,143,12,ES_AUTOHSCROLL -END - -IDD_SUBMTINFO DIALOG DISCARDABLE 0, 0, 257, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "¤l¸Ë¸ü" -FONT 9, "·s²Ó©úÅé" -BEGIN - LISTBOX IDC_LIST,10,20,183,157,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "·s¼W",IDC_ADD,202,20,45,14 - PUSHBUTTON "§R°£",IDC_DELETE,202,39,45,14,WS_DISABLED - PUSHBUTTON "Åܧó",IDC_CHANGE,202,58,45,14,WS_DISABLED - LTEXT "¤l¸Ë¸ü¡G",IDC_STATIC,10,10,50,8 - PUSHBUTTON "½T©w",IDOK,202,145,45,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,202,163,45,14 -END - -IDD_ADD_SUBMOUNT DIALOG DISCARDABLE 0, 0, 235, 79 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "·s¼W¤l¸Ë¸ü" -FONT 9, "·s²Ó©úÅé" -BEGIN - EDITTEXT IDC_SHARE_NAME,66,8,147,12,ES_AUTOHSCROLL - EDITTEXT IDC_PATH_NAME,66,23,147,12,ES_AUTOHSCROLL - PUSHBUTTON "½T©w",IDOK,22,53,45,14 - PUSHBUTTON "¨ú®ø",IDCANCEL,92,53,45,14 - PUSHBUTTON "»¡©ú",9,167,53,45,14 - LTEXT "¦@¥Î¦WºÙ¡G",IDC_STATIC,18,10,49,8 - LTEXT "¸ô®|¦WºÙ¡G",IDC_STATIC,19,25,43,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SERVERSTATUS, DIALOG - BEGIN - RIGHTMARGIN, 171 - END - - IDD_AUTHENTICATION, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 278 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_KLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 86 - END - - IDD_UNLOG_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 178 - TOPMARGIN, 7 - BOTTOMMARGIN, 56 - END - - IDD_SUBMTINFO, DIALOG - BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 247 - BOTTOMMARGIN, 177 - END - - IDD_ADD_SUBMOUNT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 25 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_ACL_CLEAN "fs cleanacl" - ID_ACL_COPY "fs copyacl" - ID_ACL_LIST "fs listacl" - ID_ACL_SET "fs setacl" - ID_VOLUME_CHECK "fs checkvolumes" - ID_VOLUME_DISKFREE "fs diskfree" - ID_VOLUME_EXAMINE "fs examine" - ID_VOLUME_FLUSH "fs flushvolume" - ID_VOLUME_QUOTA_BRIEF "fs quota" - ID_VOLUME_QUOTA_FULL "fs listquota" - ID_VOLUME_QUOTA_SET "fs setvol" - ID_VOLUME_SET "fs setvol" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FLUSH "fs flush" - ID_WHEREIS "fs whereis" - ID_SHOWCELL "fs whichcell" - ID_MOUNTPOINT_SHOW "fs lsmount" - ID_MOUNTPOINT_REMOVE "fs rmmount" - ID_SHOW_SERVER "fs whereis" - ID_AUTHENTICATE "µn¤J©Îµn¥X AFS" - ID_SERVER_STATUS "Àˬd¦øªA¾¹" - ID_VOLUME_PROPERTIES "fs listquota, diskfree, examine, quota, setquota, setvol" - ID_VOLUMEPARTITION_UPDATENAMEIDTABLE "fs checkvolumes" - ID_MOUNTPOINT_MAKE "fs mkmount" - IDS_FLUSH_FAILED "µLªk¨R¼g§@¥Î¤¤ªºÀÉ®× %o" - IDS_FLUSH_ERROR "¨R¼gÀÉ®× %o ®Éµo¥Í¿ù»~¡G %s" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_FLUSH_OK "¶¶§Q¨R¼g©Ò¿ï¨úªºÀÉ®×" - IDS_CANT_GET_CELL "§PÂ_ Cell ®Éµo¥Í¿ù»~¡G" - IDS_FLUSH_VOLUME_ERROR "¨R¼g %o ®eÅé®Éµo¥Í¿ù»~¡G %s" - IDS_FLUSH_VOLUME_OK "¶¶§Q¨R¼g®eÅé" - IDS_WHERE_IS "ÀÉ®× %o ¦b¥D¹q¸£ %s ¤W" - IDS_CLEANACL_NOT_SUPPORTED - "µLªk²M°£ÀÉ®× %o ªº ACL¡GDFS ¦s¨ú²M³æ¤£¤ä´©²M°£ Acl " - IDS_ACL_IS_FINE "%o ªº¦s¨ú²M³æ¨S¦³°ÝÃD" - IDS_CLEANACL_INVALID_ARG - "µLªk²M°£ÀÉ®× %o ªº ACL¡G ¤Þ¼ÆµL®Ä¡A¥i¯àªº­ì¦]¥]¬A¡GÀÉ®×¥¼ºÞ¨î¡A©Î¬O¦s¨ú±±¨î²M³æ¤Wªº¨Ï¥ÎªÌ¤H¼Æ¹L¦h" - IDS_ANY_STRING "%o" - IDS_CLEANACL_DONE "¤w§R°£§@¼oªº ACL ¶µ¥Ø¡C" - ID_SUBMOUNTS "«Ø¥ß©Î§R°£ AFS ¤l¸Ë¸ü" - IDS_GETRIGHTS_ERROR "µLªkŪ¨ú¥Ø¿ý %o ªº¦s¨ú²M³æ¡G %o" - IDS_DFSACL_ERROR "µLªk¥H¦¹«ü¥O½s¿è DFS ACL" - IDS_SAVE_ACL_ERROR "µLªkÀx¦s %o ªº ACL¡G %o" - IDS_SAVE_ACL_EINVAL_ERROR - "µLªkÀx¦s %o ªº ACL¡G¤Þ¼ÆµL®Ä¡A¥i¯àªº­ì¦]¥]¬A¡GÀɮפ£¦b AFS¡B¦s¨ú±±¨î²M³æ¤Wªº¨Ï¥ÎªÌ¤H¼Æ¹L¦h¡A©Î¬O¸Õ¹Ï±N¤£¦s¦bªº¨Ï¥ÎªÌ·s¼W¨ì¦s¨ú±±¨î²M³æ" - IDS_ACL_READ_ERROR "µLªkŪ¨ú %o ªº ACL¡G %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NO_DFS_COPY_ACL "µLªk±N ACL ½Æ»s¨ì¥Ø¿ý %o¡GDFS ¦s¨ú²M³æ¤£¤ä´©½Æ»s ACL " - IDS_COPY_ACL_EINVAL_ERROR - "µLªk±N ACL ½Æ»s¨ì¥Ø¿ý %o¡G¤Þ¼ÆµL®Ä¡A¥i¯àªº­ì¦]¥]¬A¡GÀɮפ£¦b AFS¡C" - IDS_COPY_ACL_ERROR "µLªk±N ACL ½Æ»s¨ì %o¡G %o" - IDS_NOT_MOUNT_POINT_ERROR "%o ¨Ã«D¸Ë¸üÂI¡C" - IDS_LIST_MOUNT_POINT_ERROR "¿ù»~¡G %o" - IDS_MAKE_MP_NOT_AFS_ERROR "¸Ë¸üÂI¥²¶·¦b AFS Àɮרt²Î¤º«Ø¥ß" - IDS_MOUNT_POINT_ERROR "«Ø¥ß¸Ë¸üÂI®Éµo¥Í¿ù»~¡G %o" - IDS_ERROR "¿ù»~¡G%o" - IDS_DELETED "¤w¶¶§Q§R°£" - IDS_SET_QUOTA_ERROR "³]©w°tÃB®Éµo¥Í¿ù»~¡G %o" - ID_SUBMOUNTS_CREATE "«Ø¥ß AFS ¤l¸Ë¸ü" - ID_SUBMOUNTS_EDIT "·s¼W¡BÅܧó©Î¬O§R°£ AFS ¤l¸Ë¸ü" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CHECK_SERVERS_ERROR "ÀˬdÀɮצøªA¾¹¾÷¾¹®Éµo¥Í¿ù»~¡G¡uAFS ¦øªA¾¹ºÞ²zµ{¦¡¡v¡G %o" - IDS_ALL_SERVERS_RUNNING "©Ò¦³¦øªA¾¹³£¦b°õ¦æ¤¤¡C" - IDS_CHECK_VOLUMES_OK "¤wÀˬd©Ò¦³®eÅéID/¦WºÙ¹ïÀ³¡C" - IDS_CHECK_VOLUMES_ERROR "Àˬd®eÅéID/¦WºÙ¹ïÀ³®Éµo¥Í¿ù»~¡G %o" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACL_ENTRY_NAME_IN_USE "±z©Ò¿ï¾Üªº¦WºÙ¤w¸g¦s¦b¡C½Ð¿é¤J¤£¦Pªº¦WºÙ¡C" - IDS_REALLY_DEL_MOUNT_POINTS "±z½T©w­n²¾°£©Ò¿ï¨úªº¸Ë¸üÂI¶Ü¡H" - IDS_DIR_DOES_NOT_EXIST_ERROR "¥Ø¿ý '%o' ¨Ã¤£¦s¦b¡C" - IDS_CLEANACL_MSG "±N§R°£¤w§@¼oªº ACL ¡I" - IDS_COPY_ACL_OK "¤w¶¶§Q³Æ¥÷ ACL¡C" - IDS_GET_TOKENS_NO_AFS_SERVICE - "µLªkŪ¨ú°O¸¹¸ê°T¡GAFS ªA°Èµ{¦¡¥i¯à©|¥¼±Ò°Ê¡C" - IDS_GET_TOKENS_UNEXPECTED_ERROR - "µLªkŪ¨ú°O¸¹¸ê°T¡G«D¹w´Áªº¿ù»~¡Aµ{¦¡½X %d¡C" - IDS_GET_TOKENS_UNEXPECTED_ERROR2 - "µLªkŪ¨ú°O¸¹¸ê°T¡G«D¹w´Áªº¿ù»~¡AªA°Èµ{¦¡ %s.%s.%s¡Aµ{¦¡½X %d¡C" - IDS_ENTER_QUOTA "½Ð¿é¤J¦³®Äªº°tÃB¡C" - IDS_AUTHENTICATION_ITEM "Ų§O(&A)..." - IDS_ACLS_ITEM "¦s¨ú±±¨î²M³æ(&C)..." - IDS_VOL_PART_ITEM "®eÅé / ¤À³Î°Ï(&V)" - IDS_VOL_PART_PROPS_ITEM "¤º®e(&P)" - IDS_VOL_PART_REFRESH_ITEM "­«·s¾ã²z¦WºÙ/ID ¹ïÀ³(&R)" - IDS_MOUNT_POINT_ITEM "¸Ë¸üÂI(&M)" - IDS_MP_SHOW_ITEM "Åã¥Ü(&S)..." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_MP_REMOVE_ITEM "²¾°£(&R)..." - IDS_MP_MAKE_ITEM "»s§@(&M)..." - IDS_FLUSH_FILE_DIR_ITEM "¨R¼gÀÉ®× / ¥Ø¿ý(&F)" - IDS_FLUSH_VOLUME_ITEM "¨R¼g®eÅé(&U)" - IDS_SHOW_FILE_SERVERS_ITEM "Åã¥ÜÀɮצøªA¾¹(&F)..." - IDS_SHOW_CELL_ITEM "Åã¥Ü Cell (&C)..." - IDS_SHOW_SERVER_STATUS_ITEM "Åã¥Ü¦øªA¾¹ª¬ºA..." - IDS_AFS_ITEM "AFS(&A)" - IDS_SUBMOUNTS_ITEM "¤l¸Ë¸ü(&B)" - IDS_GET_SUBMT_INFO_ERROR "µLªkŪ¨ú¦@¨É¦WºÙ %o ªº¤l¸Ë¸ü¸ê°T¡C" - IDS_REALLY_DELETE_SUBMT "§R°£¦@¨É¦WºÙ %o ¶Ü¡H" - IDS_SUBMT_SAVE_FAILED "±z¹ï¤l¸Ë¸ü¸ê®Æ®w©Ò§@ªºÅܧóµL®Ä¡C" - IDS_SUBMOUNTS_CREATE_ITEM "·s¼W(&A)" - IDS_SUBMOUNTS_EDIT_ITEM "½s¿è(&E)..." - IDS_EDIT_PATH_NAME "½s¿è¸ô®|¦WºÙ" - IDS_SHOW_CELL "Åã¥Ü Cell" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHOW_CELL_COLUMN "Cell" - IDS_SHOW_FS "Åã¥ÜÀɮצøªA¾¹" - IDS_SHOW_FS_COLUMN "ÀɮצøªA¾¹" - IDS_REMOVE_MP "²¾°£¸Ë¸üÂI" - IDS_REMOVE_MP_COLUMN "µ²ªG" -END - -STRINGTABLE DISCARDABLE -BEGIN - AFX_IDS_APP_TITLE "AFS ¥Î¤áºÝ" -END - -#endif // Chinese (Taiwan) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT) -#ifdef _WIN32 -LANGUAGE 4, 1 -#endif -#include "afs_shl_ext.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/WINNT/client_exp/make_mount_point_dlg.cpp b/src/WINNT/client_exp/make_mount_point_dlg.cpp deleted file mode 100644 index 4167d566f..000000000 --- a/src/WINNT/client_exp/make_mount_point_dlg.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "make_mount_point_dlg.h" -#include "gui2fs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMakeMountPointDlg dialog - - -CMakeMountPointDlg::CMakeMountPointDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CMakeMountPointDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CMakeMountPointDlg) - m_nType = -1; - //}}AFX_DATA_INIT - - m_bMade = FALSE; -} - - -void CMakeMountPointDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CMakeMountPointDlg) - DDX_Control(pDX, IDOK, m_Ok); - DDX_Control(pDX, IDC_VOLUME, m_Vol); - DDX_Control(pDX, IDC_RW, m_RW); - DDX_Control(pDX, IDC_DIR, m_Dir); - DDX_Control(pDX, IDC_CELL, m_Cell); - DDX_Radio(pDX, IDC_REGULAR, m_nType); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CMakeMountPointDlg, CDialog) - //{{AFX_MSG_MAP(CMakeMountPointDlg) - ON_EN_CHANGE(IDC_VOLUME, OnChangeVolume) - ON_EN_CHANGE(IDC_DIR, OnChangeDir) - ON_EN_CHANGE(IDC_CELL, OnChangeCell) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CMakeMountPointDlg message handlers - -void CMakeMountPointDlg::OnOK() -{ - UpdateData(TRUE); - - BOOL bRW = m_nType == 1; - - m_bMade = MakeMount(m_strDir, m_strVol, m_strCell, bRW); - - CDialog::OnOK(); -} - -void CMakeMountPointDlg::OnChangeVolume() -{ - CString strVol; - m_Vol.GetWindowText(strVol); - if (strVol.GetLength() > 63) { - MessageBeep((UINT)-1); - m_Vol.SetWindowText(m_strVol); - } else - m_strVol = strVol; - - CheckEnableOk(); -} - -void CMakeMountPointDlg::OnChangeDir() -{ - m_Dir.GetWindowText(m_strDir); - - CheckEnableOk(); -} - -void CMakeMountPointDlg::OnChangeCell() -{ - m_Cell.GetWindowText(m_strCell); - - CheckEnableOk(); -} - -void CMakeMountPointDlg::CheckEnableOk() -{ - BOOL bEnable = FALSE; - - if ((m_strVol.GetLength() > 0) && (m_strDir.GetLength() > 0)) - bEnable = TRUE; - - m_Ok.EnableWindow(bEnable); -} - -BOOL CMakeMountPointDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - m_Dir.SetWindowText(m_strDir); - - m_nType = 0; - - UpdateData(FALSE); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CMakeMountPointDlg::OnHelp() -{ - ShowHelp(m_hWnd, MAKE_MOUNT_POINT_HELP_ID); -} - diff --git a/src/WINNT/client_exp/make_mount_point_dlg.h b/src/WINNT/client_exp/make_mount_point_dlg.h deleted file mode 100644 index 94463e67c..000000000 --- a/src/WINNT/client_exp/make_mount_point_dlg.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CMakeMountPointDlg : public CDialog -{ - CString m_strDir; - CString m_strVol; - CString m_strCell; - BOOL m_bMade; - - void CheckEnableOk(); - -// Construction -public: - CMakeMountPointDlg(CWnd* pParent = NULL); // standard constructor - - void SetDir(const CString& strDir) { m_strDir = strDir; } - BOOL MountWasMade() { return m_bMade; } - -// Dialog Data - //{{AFX_DATA(CMakeMountPointDlg) - enum { IDD = IDD_MAKE_MOUNT_POINT }; - CButton m_Ok; - CEdit m_Vol; - CButton m_RW; - CEdit m_Dir; - CEdit m_Cell; - int m_nType; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMakeMountPointDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CMakeMountPointDlg) - virtual void OnOK(); - afx_msg void OnChangeVolume(); - afx_msg void OnChangeDir(); - afx_msg void OnChangeCell(); - virtual BOOL OnInitDialog(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/make_symbolic_link_dlg.cpp b/src/WINNT/client_exp/make_symbolic_link_dlg.cpp deleted file mode 100644 index ff3a29de5..000000000 --- a/src/WINNT/client_exp/make_symbolic_link_dlg.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "make_symbolic_link_dlg.h" -#include "gui2fs.h" -#include "msgs.h" -#define MAXSIZE 2048 /* most I'll get back from PIOCTL */ - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMakeMountPointDlg dialog - - -CMakeSymbolicLinkDlg::CMakeSymbolicLinkDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CMakeSymbolicLinkDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CMakeSymbolicLinkDlg) - m_strName = _T(""); - m_strDir = _T(""); - //}}AFX_DATA_INIT -} - - -void CMakeSymbolicLinkDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CMakeSymbolicLinkDlg) - DDX_Control(pDX, IDOK, m_OK); - DDX_Control(pDX, IDC_NAME, m_Name); - DDX_Control(pDX, IDC_DIR, m_Dir); - DDX_Text(pDX, IDC_NAME, m_strName); - DDV_MaxChars(pDX, m_strName, 63); - DDX_Text(pDX, IDC_DIR, m_strDir); - DDV_MaxChars(pDX, m_strDir, 255); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CMakeSymbolicLinkDlg, CDialog) - //{{AFX_MSG_MAP(CMakeSymbolicLinkDlg) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CMakeSymbolicLinkDlg message handlers - -void CMakeSymbolicLinkDlg::OnOK() -{ - char space[64]; - UINT code; - int i; - UpdateData(TRUE); - CString strName; - CString strDir; - m_Name.GetWindowText(strName); - m_Dir.GetWindowText(strDir); - if (!IsPathInAfs(m_sBase)) { - MessageBeep((UINT)-1); - strDir+=" - Path is not in AFS directory"; - AfxMessageBox(strDir,MB_OK); - return; - } - if (m_sBase.GetLength()>MAX_PATH-2) - { - MessageBeep((UINT)-1); - ShowMessageBox(IDS_CURRENT_DIRECTORY_PATH_TOO_LONG,MB_OK,IDS_CURRENT_DIRECTORY_PATH_TOO_LONG); - } - if (!SetCurrentDirectory(m_sBase)) - { - MessageBeep((UINT)-1); - ShowMessageBox(IDS_UNABLE_TO_SET_CURRENT_DIRECTORY,MB_OK,IDS_UNABLE_TO_SET_CURRENT_DIRECTORY); - return; - } - if ((code=MakeSymbolicLink(strName,strDir))!=0){ - MessageBeep((UINT)-1); - ShowMessageBox(IDS_UNABLE_TO_CREATE_SYMBOLIC_LINK,MB_OK,IDS_UNABLE_TO_CREATE_SYMBOLIC_LINK,code); - return; - } - CDialog::OnOK(); -} -/* -void CMakeSymbolicLinkDlg::OnChangeName() -{ - CString strName; - m_Name.GetWindowText(strName); - if (strName.GetLength() > 63) { - MessageBeep((UINT)-1); - m_Name.SetWindowText(m_strName); - } else - m_strName = strName; - CheckEnableOk(); -} - -void CMakeSymbolicLinkDlg::OnChangeDir() -{ - m_Dir.GetWindowText(m_strDir); - if (!IsPathInAfs(m_strDir)) { - MessageBeep((UINT)-1); - m_Dir.SetWindowText(m_strDir); - } - CheckEnableOk(); -} -*/ -void CMakeSymbolicLinkDlg::CheckEnableOk() -{ - BOOL bEnable = FALSE; - - if ((m_strName.GetLength() > 0) && (m_strDir.GetLength() > 0)) - bEnable = TRUE; - - m_OK.EnableWindow(bEnable); -} - -BOOL CMakeSymbolicLinkDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - -// m_Dir.SetWindowText(m_strDir); -// m_Name.SetWindowText(m_strName); - UpdateData(FALSE); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} diff --git a/src/WINNT/client_exp/make_symbolic_link_dlg.h b/src/WINNT/client_exp/make_symbolic_link_dlg.h deleted file mode 100644 index db3c86dde..000000000 --- a/src/WINNT/client_exp/make_symbolic_link_dlg.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CMakeSymbolicLinkDlg : public CDialog -{ - void CheckEnableOk(); - -// Construction -public: - CMakeSymbolicLinkDlg(CWnd* pParent = NULL); // standard constructor - void Setbase(const char *msg){m_sBase=msg;} -// Dialog Data - //{{AFX_DATA(CMakeSymbolicLinkDlg) - enum { IDD = IDD_SYMBOLICLINK_ADD }; - CButton m_OK; - CEdit m_Name; - CEdit m_Dir; - CString m_strName; - CString m_strDir; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMakeSymbolicLinkDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - CString m_sBase; //Base directory - // Generated message map functions - //{{AFX_MSG(CMakeSymbolicLinkDlg) - afx_msg void OnChangeDir(); - afx_msg void OnChangeName(); - virtual void OnOK(); - virtual BOOL OnInitDialog(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/mount_points_dlg.cpp b/src/WINNT/client_exp/mount_points_dlg.cpp deleted file mode 100644 index 8fb9abc5f..000000000 --- a/src/WINNT/client_exp/mount_points_dlg.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "mount_points_dlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMountPointsDlg dialog - - -CMountPointsDlg::CMountPointsDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CMountPointsDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CMountPointsDlg) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT -} - - -void CMountPointsDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CMountPointsDlg) - DDX_Control(pDX, IDC_LIST, m_List); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CMountPointsDlg, CDialog) - //{{AFX_MSG_MAP(CMountPointsDlg) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CMountPointsDlg message handlers - -BOOL CMountPointsDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - int tabs[] = { 64, 145, 220 }; - - m_List.SetTabStops(sizeof(tabs) / sizeof(int), tabs); - - for (int i = 0; i < m_MountPoints.GetSize(); i++) - m_List.AddString(m_MountPoints[i]); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CMountPointsDlg::SetMountPoints(const CStringArray& mountPoints) -{ - m_MountPoints.RemoveAll(); - - m_MountPoints.Copy(mountPoints); -} - -void CMountPointsDlg::OnHelp() -{ - ShowHelp(m_hWnd, MOUNT_POINTS_HELP_ID); -} - diff --git a/src/WINNT/client_exp/mount_points_dlg.h b/src/WINNT/client_exp/mount_points_dlg.h deleted file mode 100644 index d90b43f1b..000000000 --- a/src/WINNT/client_exp/mount_points_dlg.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CMountPointsDlg : public CDialog -{ - CStringArray m_MountPoints; - -// Construction -public: - CMountPointsDlg(CWnd* pParent = NULL); // standard constructor - - void SetMountPoints(const CStringArray& mountPoints); - -// Dialog Data - //{{AFX_DATA(CMountPointsDlg) - enum { IDD = IDD_MOUNT_POINTS }; - CListBox m_List; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMountPointsDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CMountPointsDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/msgs.cpp b/src/WINNT/client_exp/msgs.cpp deleted file mode 100644 index b951fb692..000000000 --- a/src/WINNT/client_exp/msgs.cpp +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include - -#include "stdafx.h" -#include "msgs.h" - - - -/* - ShowMessageBox: - - This function takes three main arguements, the stringtable ID, the button types - to be displayed (default = MB_OK) and the help table reference (default = 0, no - help) and then a variable amount of arguements. The variable list does not need - a special ending flag/character/number. The list is read only as needed, which - is defined by the string table and the presence of any "%X" characters, where X - is one of the printf format types. The order of the variable list MUST - correspond to the order of types in the string table entry. If the string table - calls for INT INT UINT CHAR* DOUBLE, then the arguement list had better be INT - INT UINT CHAR* DOUBLE or else there will be serious problems (stack will be - misread, general protection faults, garbage output, and other errors). - - This function takes the arguements passed in the list and inserts them by - parsing and pszcut/pszpaste the string table entry to add all the arguements passed - in. This allows for any generic message to be created. - - %i,d = Integer - %u = unsigned int - %x,X = Hex (takes an integer arguement, pszconverts it) - %g,f,e = Double - %s = String (char*) - %l - d = Long int - x = long hex - %c = character (one) - %a = String Table Ref. (UINT) - %o = CString object (prints the string of the object) - default = prints out string so far, with error message attached at place of error. - - Return type is the button pressed in the message box. - -*/ - -UINT ShowMessageBox (UINT Id, UINT Button, UINT Help, ...) { - - CString - temp; - char *pszstring, - *pszpaste, - *pszcut, - *pszdone, - *pszconvert; - char - chread; - va_list - params; - int - x; - - pszconvert = new char[255]; - va_start(params, Help); - LoadString (temp, Id); - pszstring = temp.GetBuffer(512); - strcpy(pszstring,pszstring); - temp.ReleaseBuffer(); - // Look and see - is there a need to insert chars (95% of the time, there won't) - if (!strstr(pszstring, "%")) { - delete pszconvert; - return AfxMessageBox(pszstring, Button, Help); - } - - x = strcspn(pszstring, "%"); - pszdone = new char[512]; - pszcut = new char[512]; - pszpaste = new char[512]; - strcpy(pszcut, &pszstring[x+2]); - strncpy(pszpaste, pszstring, x); - pszpaste[x] = '\0'; - chread = pszstring[x+1]; - - for ( ; ; ) { - - switch (chread) { - case 'i' : - case 'd' : - { - int anint = va_arg(params, int); - _itoa( anint, pszconvert, 10); - break; - } - case 'u' : - { - UINT anuint = va_arg(params, UINT); - _itoa( anuint, pszconvert, 10); - break; - } - - case 'x' : - case 'X' : - { - int ahex = va_arg(params, int); - _itoa( ahex, pszconvert, 16); - break; - } - case 'g' : - case 'f' : - case 'e' : - { - double adbl = va_arg(params, double); - _gcvt( adbl, 10, pszconvert); - break; - } - case 's' : - { - char *pStr = va_arg(params, char*); - ASSERT(strlen(pStr) <= 255); - strcpy(pszconvert, pStr); - break; - } - case 'l' : - { - chread = pszdone[x+2]; - switch(chread) { - case 'x' : - { - long int alhex = va_arg(params, long int); - _ltoa(alhex, pszconvert, 16); - strcpy(pszcut, &pszcut[1]); - break; - } - case 'd' : - default : - { - long int along = va_arg(params, long int); - _ltoa( along, pszconvert, 10); - // For the L, there will be one character after it, - // so move ahead another letter - strcpy(pszcut, &pszcut[1]); - break; - } - } - break; - } - - case 'c' : - { - int letter = va_arg(params, int); - pszconvert[0] = (char)letter; - pszconvert[1] = '\0'; - break; - } - case 'a' : - { - CString zeta; - char* lsc; - UINT ls = va_arg(params, UINT); - LoadString (zeta, ls); - lsc = zeta.GetBuffer(255); - strcpy(pszconvert, lsc); - zeta.ReleaseBuffer(); - break; - } - case 'o' : - { - CString get = va_arg(params, CString); - char* ex = get.GetBuffer(255); - strcpy(pszconvert,ex); - get.ReleaseBuffer(); - break; - } - default : - { - strcpy(pszconvert, " Could not load message. Invalid %type in string table entry. "); - delete pszdone; - pszdone = new char[strlen(pszpaste)+strlen(pszcut)+strlen(pszconvert)+5]; - strcpy(pszdone, pszpaste); - strcat(pszdone, pszconvert); - strcat(pszdone, pszcut); - AfxMessageBox(pszdone, Button, Help); - delete pszcut; - delete pszpaste; - delete pszconvert; - delete pszdone; - ASSERT(FALSE); - return 0; - } - } // case - - delete pszdone; - pszdone = new char[strlen(pszpaste)+strlen(pszcut)+strlen(pszconvert)+5]; - strcpy(pszdone, pszpaste); - strcat(pszdone, pszconvert); - strcat(pszdone, pszcut); - // Now pszdone holds the entire message. - // Check to see if there are more insertions to be made or not - - if (!strstr(pszdone, "%")) { - UINT rt_type = AfxMessageBox(pszdone, Button, Help); - delete pszcut; - delete pszpaste; - delete pszconvert; - delete pszdone; - return rt_type; - } // if - - // there are more insertions to make, prepare the strings to use. - x = strcspn(pszdone, "%"); - strcpy(pszcut, &pszdone[x+2]); - strncpy(pszpaste, pszdone, x); - pszpaste[x] = '\0'; - chread = pszdone[x+1]; - - } // for - ASSERT(FALSE); - return 0; - -} // ShowMessageBox - -CString GetMessageString(UINT Id, ...) -{ - CString - temp; - char *pszstring, - *pszpaste, - *pszcut, - *pszdone, - *pszconvert; - char - chread; - va_list - params; - int - x; - CString strMsg; - - pszconvert = new char[255]; - va_start(params, Id); - LoadString (temp, Id); - pszstring = temp.GetBuffer(512); - strcpy(pszconvert,pszstring); - temp.ReleaseBuffer(); - - // Look and see - is there a need to insert chars (95% of the time, there won't) - if (!strstr(pszstring, "%")) { - strMsg = pszconvert; - delete pszconvert; - return strMsg; - } - - x = strcspn(pszstring, "%"); - pszdone = new char[512]; - pszcut = new char[512]; - pszpaste = new char[512]; - strcpy(pszcut, &pszstring[x+2]); - strncpy(pszpaste, pszstring, x); - pszpaste[x] = '\0'; - chread = pszstring[x+1]; - - for ( ; ; ) { - - switch (chread) { - case 'i' : - case 'd' : - { - int anint = va_arg(params, int); - _itoa( anint, pszconvert, 10); - break; - } - case 'u' : - { - UINT anuint = va_arg(params, UINT); - _itoa( anuint, pszconvert, 10); - break; - } - - case 'x' : - case 'X' : - { - int ahex = va_arg(params, int); - _itoa( ahex, pszconvert, 16); - break; - } - case 'g' : - case 'f' : - case 'e' : - { - double adbl = va_arg(params, double); - _gcvt( adbl, 10, pszconvert); - break; - } - case 's' : - { - char *pStr = va_arg(params, char*); - ASSERT(strlen(pStr) <= 255); - strcpy(pszconvert, pStr); - break; - } - case 'l' : - { - chread = pszdone[x+2]; - switch(chread) { - case 'x' : - { - long int alhex = va_arg(params, long int); - _ltoa(alhex, pszconvert, 16); - strcpy(pszcut, &pszcut[1]); - break; - } - case 'd' : - default : - { - long int along = va_arg(params, long int); - _ltoa( along, pszconvert, 10); - // For the L, there will be one character after it, - // so move ahead another letter - strcpy(pszcut, &pszcut[1]); - break; - } - } - break; - } - - case 'c' : - { - int letter = va_arg(params, int); - pszconvert[0] = (char)letter; - pszconvert[1] = '\0'; - break; - } - case 'a' : - { - CString zeta; - char* lsc; - UINT ls = va_arg(params, UINT); - LoadString (zeta, ls); - lsc = zeta.GetBuffer(255); - strcpy(pszconvert, lsc); - zeta.ReleaseBuffer(); - break; - } - case 'o' : - { - CString get = va_arg(params, CString); - char* ex = get.GetBuffer(255); - strcpy(pszconvert,ex); - get.ReleaseBuffer(); - break; - } - default : - { - strcpy(pszconvert, " Could not load message. Invalid %type in string table entry. "); - delete pszdone; - pszdone = new char[strlen(pszpaste)+strlen(pszcut)+strlen(pszconvert)+5]; - strcpy(pszdone, pszpaste); - strcat(pszdone, pszconvert); - strcat(pszdone, pszcut); - strMsg = pszdone; - delete pszcut; - delete pszpaste; - delete pszconvert; - delete pszdone; - ASSERT(FALSE); - return strMsg; - } - } // case - - delete pszdone; - pszdone = new char[strlen(pszpaste)+strlen(pszcut)+strlen(pszconvert)+5]; - strcpy(pszdone, pszpaste); - strcat(pszdone, pszconvert); - strcat(pszdone, pszcut); - // Now pszdone holds the entire message. - // Check to see if there are more insertions to be made or not - - if (!strstr(pszdone, "%")) { - strMsg = pszdone; - delete pszcut; - delete pszpaste; - delete pszconvert; - delete pszdone; - return strMsg; - } // if - - // there are more insertions to make, prepare the strings to use. - x = strcspn(pszdone, "%"); - strcpy(pszcut, &pszdone[x+2]); - strncpy(pszpaste, pszdone, x); - pszpaste[x] = '\0'; - chread = pszdone[x+1]; - - } // for - ASSERT(FALSE); - return strMsg; -} - -void LoadString (CString &Str, UINT id) -{ - TCHAR szString[ 256 ]; - GetString (szString, id); - Str = szString; -} - diff --git a/src/WINNT/client_exp/msgs.h b/src/WINNT/client_exp/msgs.h deleted file mode 100644 index 535a59972..000000000 --- a/src/WINNT/client_exp/msgs.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _MSGS_H_ -#define _MSGS_H_ - -#include "resource.h" - -UINT ShowMessageBox (UINT Id, UINT Button = MB_OK, UINT Help = 0, ...); -CString GetMessageString(UINT Id,...); -void LoadString (CString &Str, UINT id); - -#endif //_MSGS_H_ - diff --git a/src/WINNT/client_exp/partition_info_dlg.cpp b/src/WINNT/client_exp/partition_info_dlg.cpp deleted file mode 100644 index 839b3bd13..000000000 --- a/src/WINNT/client_exp/partition_info_dlg.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "partition_info_dlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CPartitionInfoDlg dialog - - -CPartitionInfoDlg::CPartitionInfoDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CPartitionInfoDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CPartitionInfoDlg) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT - m_nSize = 0; - m_nFree = 0; -} - -void CPartitionInfoDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CPartitionInfoDlg) - DDX_Control(pDX, IDC_TOTAL_SIZE, m_Size); - DDX_Control(pDX, IDC_PERCENT_USED, m_PercentUsed); - DDX_Control(pDX, IDC_BLOCKS_FREE, m_Free); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CPartitionInfoDlg, CDialog) - //{{AFX_MSG_MAP(CPartitionInfoDlg) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CPartitionInfoDlg message handlers - -BOOL CPartitionInfoDlg::OnInitDialog() -{ - double percentUsed; // because partition sizes are big - - CDialog::OnInitDialog(); - - ASSERT(m_nSize != 0); - - CString strSize; - strSize.Format("%ld", m_nSize); - - CString strFree; - strFree.Format("%ld", m_nFree); - - CString strPerUsed; - strPerUsed.Format("%d", ((m_nSize - m_nFree) * 100) / m_nSize); - - m_Size.SetWindowText(strSize); - m_Free.SetWindowText(strFree); - percentUsed = ( double(m_nSize - m_nFree) * 100.0l ) / double(m_nSize); - strPerUsed.Format("%2.2lf", percentUsed ); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CPartitionInfoDlg::OnHelp() -{ - ShowHelp(m_hWnd, PARTITION_INFO_HELP_ID); -} - diff --git a/src/WINNT/client_exp/partition_info_dlg.h b/src/WINNT/client_exp/partition_info_dlg.h deleted file mode 100644 index 560692aa8..000000000 --- a/src/WINNT/client_exp/partition_info_dlg.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CPartitionInfoDlg : public CDialog -{ - LONG m_nSize; - LONG m_nFree; - -// Construction -public: - CPartitionInfoDlg(CWnd* pParent = NULL); // standard constructor - - void SetValues(LONG nSize, LONG nFree) { m_nSize = nSize; m_nFree = nFree; } - -// Dialog Data - //{{AFX_DATA(CPartitionInfoDlg) - enum { IDD = IDD_PARTITION_INFO }; - CEdit m_Size; - CEdit m_PercentUsed; - CEdit m_Free; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CPartitionInfoDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CPartitionInfoDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/resource.h b/src/WINNT/client_exp/resource.h deleted file mode 100644 index 702eab935..000000000 --- a/src/WINNT/client_exp/resource.h +++ /dev/null @@ -1,273 +0,0 @@ -//{{NO_DEPENDENCIES}} -// -// Copyright 2000, International Business Machines Corporation and others. -// All Rights Reserved. -// -// This software has been released under the terms of the IBM Public -// License. For details, see the LICENSE file in the top-level source -// directory or online at http://www.openafs.org/dl/license10.html -// -// Used by afs_shl_ext.rc -// - -#define ID_ACL_CLEAN 0 -#define ID_ACL_COPY 1 -#define ID_ACL_LIST 2 -#define ID_ACL_SET 3 -#define ID_VOLUME_CHECK 4 -#define ID_VOLUME_DISKFREE 5 -#define ID_VOLUME_EXAMINE 6 -#define ID_VOLUME_FLUSH 7 -#define ID_VOLUME_QUOTA_BRIEF 8 -#define ID_VOLUME_QUOTA_FULL 9 -#define ID_VOLUME_QUOTA_SET 10 -#define ID_VOLUME_SET 11 - -#define ID_FLUSH 16 -#define ID_WHEREIS 17 -#define ID_SHOWCELL 18 -#define ID_MOUNTPOINT_SHOW 19 -#define ID_MOUNTPOINT_REMOVE 20 -#define ID_SHOW_SERVER 21 -#define ID_AUTHENTICATE 22 -#define ID_SERVER_STATUS 23 -#define ID_VOLUME_PROPERTIES 24 -#define ID_VOLUME_REFRESH 25 -#define ID_VOLUMEPARTITION_UPDATENAMEIDTABLE 26 -#define ID_ACL_COPY_FROM 27 -#define ID_ACL_COPY_TO 28 -#define ID_MOUNTPOINT_MAKE 29 -#define IDS_FLUSH_FAILED 30 -#define IDS_FLUSH_ERROR 31 - -#define IDS_FLUSH_OK 32 -#define IDS_CANT_GET_CELL 33 -#define IDS_FLUSH_VOLUME_ERROR 34 -#define IDS_FLUSH_VOLUME_OK 35 -#define IDS_WHERE_IS 36 -#define IDS_CLEANACL_NOT_SUPPORTED 37 -#define IDS_ACL_IS_FINE 38 -#define IDS_CLEANACL_INVALID_ARG 39 -#define IDS_ANY_STRING 40 -#define IDS_CLEANACL_DONE 41 -#define ID_SUBMOUNTS 42 -#define IDS_GETRIGHTS_ERROR 43 -#define IDS_DFSACL_ERROR 44 -#define IDS_SAVE_ACL_ERROR 45 -#define IDS_SAVE_ACL_EINVAL_ERROR 46 -#define IDS_ACL_READ_ERROR 47 - -#define IDS_NO_DFS_COPY_ACL 48 -#define IDS_COPY_ACL_EINVAL_ERROR 49 -#define IDS_COPY_ACL_ERROR 50 -#define IDS_NOT_MOUNT_POINT_ERROR 51 -#define IDS_LIST_MOUNT_POINT_ERROR 52 -#define IDS_MAKE_MP_NOT_AFS_ERROR 53 -#define IDS_MOUNT_POINT_ERROR 54 -#define IDS_ERROR 55 -#define IDS_DELETED 56 -#define IDS_SET_QUOTA_ERROR 57 -#define ID_SUBMOUNTS_CREATE 58 -#define ID_SUBMOUNTS_EDIT 59 - -#define IDS_CHECK_SERVERS_ERROR 64 -#define IDS_ALL_SERVERS_RUNNING 65 -#define IDS_CHECK_VOLUMES_OK 66 -#define IDS_CHECK_VOLUMES_ERROR 67 - -#define IDS_ACL_ENTRY_NAME_IN_USE 80 -#define IDS_REALLY_DEL_MOUNT_POINTS 81 -#define IDS_DIR_DOES_NOT_EXIST_ERROR 82 -#define IDS_CLEANACL_MSG 83 -#define IDS_COPY_ACL_OK 84 -#define IDS_GET_TOKENS_NO_AFS_SERVICE 85 -#define IDS_GET_TOKENS_UNEXPECTED_ERROR 86 -#define IDS_GET_TOKENS_UNEXPECTED_ERROR2 87 -#define IDS_ENTER_QUOTA 88 -#define IDS_AUTHENTICATION_ITEM 89 -#define IDS_ACLS_ITEM 90 -#define IDS_VOL_PART_ITEM 91 -#define IDS_VOL_PART_PROPS_ITEM 92 -#define IDS_VOL_PART_REFRESH_ITEM 93 -#define IDS_MOUNT_POINT_ITEM 94 -#define IDS_MP_SHOW_ITEM 95 - -#define IDS_MP_REMOVE_ITEM 96 -#define IDS_MP_MAKE_ITEM 97 -#define IDS_FLUSH_FILE_DIR_ITEM 98 -#define IDS_FLUSH_VOLUME_ITEM 99 -#define IDS_SHOW_FILE_SERVERS_ITEM 100 -#define IDS_SHOW_CELL_ITEM 101 -#define IDS_SHOW_SERVER_STATUS_ITEM 102 -#define IDS_AFS_ITEM 103 -#define IDS_SUBMOUNTS_ITEM 104 -#define IDS_GET_SUBMT_INFO_ERROR 105 -#define IDS_REALLY_DELETE_SUBMT 106 -#define IDS_SUBMT_SAVE_FAILED 107 -#define IDS_SUBMOUNTS_CREATE_ITEM 108 -#define IDS_SUBMOUNTS_EDIT_ITEM 109 -#define IDS_EDIT_PATH_NAME 110 -#define IDS_SHOW_CELL 111 - -#define IDS_SHOW_CELL_COLUMN 112 -#define IDS_SHOW_FS 113 -#define IDS_SHOW_FS_COLUMN 114 -#define IDS_REMOVE_MP 115 -#define IDS_REMOVE_MP_COLUMN 116 -#define IDS_REMOVE_SYMLINK_ITEM 117 -#define IDS_REALLY_REMOVE_SYMLINK 118 - -#define IDS_SYMBOLICLINK_ADD 128 -#define IDS_SYMBOLICLINK_EDIT 129 -#define IDS_SYMBOLICLINK_REMOVE 130 -#define IDS_SYMBOLIC_LINK_ITEM 131 -#define IDS_UNABLE_TO_CREATE_SYMBOLIC_LINK 132 -#define IDS_UNABLE_TO_SET_CURRENT_DIRECTORY 133 -#define IDS_CURRENT_DIRECTORY_PATH_TOO_LONG 134 -#define IDS_CLEANACL_ERROR 135 - -#define IDM_AUTHENTICATION 0 -#define IDM_ACL_SET 1 -#define IDM_VOLUME_PROPERTIES 2 -#define IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE 3 -#define IDM_MOUNTPOINT_SHOW 4 -#define IDM_MOUNTPOINT_REMOVE 5 -#define IDM_MOUNTPOINT_MAKE 6 -#define IDM_FLUSH 7 -#define IDM_FLUSH_VOLUME 8 -#define IDM_SHOW_SERVER 9 -#define IDM_SHOWCELL 10 -#define IDM_SERVER_STATUS 11 -#define IDM_SYMBOLICLINK_REMOVE 12 -#define IDM_SYMBOLICLINK_ADD 13 -#define IDM_SUBMOUNTS 14 -#define IDM_ACL_CLEAN 15 -#define IDM_SUBMOUNTS_EDIT 16 -#define IDM_REMOVE_SYMLINK 17 - -#define ID_GET_TOKENS 917 -#define ID_DISCARD_TOKENS 918 -#define IDD_KLOG_DIALOG 920 -#define IDR_MENU_FILE 930 -#define IDD_VOLUME_INFO 931 -#define IDD_SET_AFS_ACL 932 -#define IDD_DIALOG_TEST 933 -#define IDD_MAKE_MOUNT_POINT 934 -#define IDD_CLEAR_ACL 935 -#define IDD_SUBMTINFO 936 -#define IDD_ADD_ACL 937 -#define IDD_PARTITION_INFO 938 -#define IDD_COPY_ACL 940 -#define IDD_MENU_TEST_DLG 941 -#define IDD_WHICH_CELL 942 -#define IDD_WHERE_IS 943 -#define IDD_RESULTS 945 -#define IDD_MOUNT_POINTS 946 -#define IDD_DOWN_SERVERS 947 -#define IDD_SHOWSERVERS 948 -#define IDD_SERVERSTATUS 949 -#define IDD_AUTHENTICATION 950 -#define IDD_UNLOG_DIALOG 954 -#define IDD_ADD_SUBMOUNT 955 -#define IDD_SYMBOLICLINK_ADD 956 -#define ID_REMOVE_SYMLINK 957 -#define ID_SYMBOLICLINK_ADD 958 -#define ID_SYMBOLICLINK_REMOVE 959 -#define IDC_LIST 1001 -#define IDC_PASSWORD 1002 -#define IDC_OFFLINE_MSG 1003 -#define IDC_MOTD 1004 -#define IDC_NEW_QUOTA 1005 -#define IDC_QUOTA_SPIN 1006 -#define IDC_DIR_NAME 1007 -#define IDC_CELL_NAME 1008 -#define ID_VOLUME_INFO 1009 -#define IDC_NEGATIVE_ENTRIES 1010 -#define ID_SET_ACL 1011 -#define IDC_NORMAL_RIGHTS 1012 -#define ID_MAKE_MOUNT_POINT 1013 -#define IDC_LOCALCELL 1014 -#define IDC_DIALOG 1015 -#define IDC_READ 1016 -#define IDC_SPECIFIEDCELL 1017 -#define IDC_WRITE 1018 -#define IDC_VOLUME 1019 -#define IDC_ALL_CELLS 1020 -#define IDC_CB_A 1021 -#define IDC_CELL 1022 -#define IDC_ADD 1023 -#define IDC_RW 1024 -#define IDC_DONTPROBESERVERS 1025 -#define IDC_REMOVE 1026 -#define IDC_FAST 1027 -#define IDC_NORMAL 1028 -#define IDC_LOOKUP 1029 -#define IDC_NEGATIVE 1030 -#define IDC_NAME 1031 -#define IDC_DIR 1032 -#define IDC_LOCK 1033 -#define IDC_LOOKUP2 1034 -#define IDC_INSERT 1035 -#define IDC_CHANGE 1036 -#define IDC_CLEAR 1037 -#define IDC_LOCK2 1038 -#define IDC_DELETE 1039 -#define IDC_ADMINISTER 1040 -#define IDC_CB_B 1041 -#define IDC_NEGATIVE_ENTRY 1042 -#define IDC_COPY 1043 -#define IDC_ADD_NEGATIVE_ENTRY 1044 -#define IDC_CB_C 1045 -#define IDC_PARTITION_INFO 1046 -#define IDC_CB_F 1047 -#define IDC_CB_E 1048 -#define IDC_TOTAL_SIZE 1049 -#define IDC_CB_D 1050 -#define IDC_BLOCKS_FREE 1051 -#define IDC_FROM_DIR 1052 -#define IDC_CB_G 1053 -#define IDC_PERCENT_USED 1054 -#define IDC_TO_DIR 1055 -#define IDC_CB_H 1056 -#define IDC_BUTTON1 1057 -#define IDC_BROWSE 1058 -#define IDC_ACL_CLEAR 1059 -#define IDC_ACL_LIST_SET_COPY 1060 -#define IDC_SHOWSTATUS 1061 -#define IDC_VOL_PART_PROPERTIES 1062 -#define IDC_COLUMN_3 1063 -#define IDC_VOL_PART_UPDATE 1064 -#define IDC_COLUMN_4 1065 -#define IDC_MOUNT_POINT_SHOW 1066 -#define IDC_MOUNT_POINT_REMOVE 1067 -#define IDC_MOUNT_POINT_MAKE 1068 -#define IDC_FLUSH_FILEDIR 1069 -#define IDC_FLUSH_VOLUME 1070 -#define IDC_SHOW_FILESERVER 1071 -#define IDC_SHOW_CELL 1072 -#define IDC_ADD_NORMAL_ENTRY 1073 -#define IDC_RESULTS_LABEL 1074 -#define IDC_CLEAN 1075 -#define IDC_TOKEN_LIST 1076 -#define IDC_REGULAR 1077 -#define IDC_STATIC_READ 1078 -#define IDC_STATIC_WRITE 1079 -#define IDC_STATIC_EXECUTE 1080 -#define IDC_STATIC_CONTROL 1081 -#define IDC_STATIC_INSERT 1082 -#define IDC_STATIC_DELETE 1083 -#define IDC_STATIC_CONTROL2 1084 -#define IDC_SHARE_NAME 1085 -#define IDC_PATH_NAME 1086 - - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 163 -#define _APS_NEXT_COMMAND_VALUE 32829 -#define _APS_NEXT_CONTROL_VALUE 1087 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/WINNT/client_exp/results_dlg.cpp b/src/WINNT/client_exp/results_dlg.cpp deleted file mode 100644 index 396bf0c97..000000000 --- a/src/WINNT/client_exp/results_dlg.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "results_dlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CResultsDlg dialog - - -CResultsDlg::CResultsDlg(DWORD nHelpID, CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CResultsDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CResultsDlg) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT - - m_nHelpID = nHelpID; -} - - -void CResultsDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CResultsDlg) - DDX_Control(pDX, IDC_RESULTS_LABEL, m_ResultsLabel); - DDX_Control(pDX, IDC_LIST, m_List); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CResultsDlg, CDialog) - //{{AFX_MSG_MAP(CResultsDlg) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CResultsDlg message handlers - -BOOL CResultsDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - SetWindowText(m_strDlgTitle); - m_ResultsLabel.SetWindowText(m_strResultsTitle); - - ASSERT(m_Files.GetSize() == m_Results.GetSize()); - - m_List.SetTabStops(118); - - for (int i = 0; i < m_Files.GetSize(); i++) { - CString strItem = m_Files[i] + "\t" + m_Results[i]; - m_List.AddString(strItem); - } - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CResultsDlg::SetContents(const CString& strDlgTitle, const CString& strResultsTitle, const CStringArray& files, const CStringArray& results) -{ - m_strDlgTitle = strDlgTitle; - m_strResultsTitle = strResultsTitle; - - m_Files.RemoveAll(); - m_Files.Copy(files); - - m_Results.RemoveAll(); - m_Results.Copy(results); -} - -void CResultsDlg::OnHelp() -{ - ShowHelp(m_hWnd, m_nHelpID); -} - diff --git a/src/WINNT/client_exp/results_dlg.h b/src/WINNT/client_exp/results_dlg.h deleted file mode 100644 index 207535b36..000000000 --- a/src/WINNT/client_exp/results_dlg.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CResultsDlg : public CDialog -{ - CStringArray m_Files; - CStringArray m_Results; - CString m_strDlgTitle; - CString m_strResultsTitle; - DWORD m_nHelpID; - -// Construction -public: - CResultsDlg(DWORD nHelpID, CWnd* pParent = NULL); // standard constructor - - void SetContents(const CString& strDlgTitle, const CString& strResultsTitle, const CStringArray& files, const CStringArray& results); - -// Dialog Data - //{{AFX_DATA(CResultsDlg) - enum { IDD = IDD_RESULTS }; - CStatic m_ResultsLabel; - CListBox m_List; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CResultsDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CResultsDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/server_status_dlg.H b/src/WINNT/client_exp/server_status_dlg.H deleted file mode 100644 index d329f1db1..000000000 --- a/src/WINNT/client_exp/server_status_dlg.H +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -// CServerStatusDlg dialog - -class CServerStatusDlg : public CDialog -{ - DECLARE_DYNCREATE(CServerStatusDlg) - - CString GetCellNameText(); - void CheckEnableShowStatus(); - -// Construction -public: - CServerStatusDlg(); - ~CServerStatusDlg(); - - BOOL Save(); - -// Dialog Data - //{{AFX_DATA(CServerStatusDlg) - enum { IDD = IDD_SERVERSTATUS }; - CButton m_ShowStatus; - CEdit m_CellName; - BOOL m_bFast; - int m_nCell; - //}}AFX_DATA - - -// Overrides - // ClassWizard generate virtual function overrides - //{{AFX_VIRTUAL(CServerStatusDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - // Generated message map functions - //{{AFX_MSG(CServerStatusDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnShowStatus(); - afx_msg void OnSpecifiedCell(); - afx_msg void OnLocalCell(); - afx_msg void OnAllCells(); - afx_msg void OnChangeCellName(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() - -}; diff --git a/src/WINNT/client_exp/server_status_dlg.cpp b/src/WINNT/client_exp/server_status_dlg.cpp deleted file mode 100644 index 40b7069d2..000000000 --- a/src/WINNT/client_exp/server_status_dlg.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "server_status_dlg.h" -#include "gui2fs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - - -///////////////////////////////////////////////////////////////////////////// -// CServerStatusDlg property Dlg - -IMPLEMENT_DYNCREATE(CServerStatusDlg, CDialog) - -CServerStatusDlg::CServerStatusDlg() : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CServerStatusDlg::IDD)); - - //{{AFX_DATA_INIT(CServerStatusDlg) - m_bFast = FALSE; - m_nCell = -1; - //}}AFX_DATA_INIT -} - -CServerStatusDlg::~CServerStatusDlg() -{ -} - -void CServerStatusDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CServerStatusDlg) - DDX_Control(pDX, IDC_SHOWSTATUS, m_ShowStatus); - DDX_Control(pDX, IDC_CELL_NAME, m_CellName); - DDX_Check(pDX, IDC_DONTPROBESERVERS, m_bFast); - DDX_Radio(pDX, IDC_LOCALCELL, m_nCell); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CServerStatusDlg, CDialog) - //{{AFX_MSG_MAP(CServerStatusDlg) - ON_BN_CLICKED(IDC_SHOWSTATUS, OnShowStatus) - ON_BN_CLICKED(IDC_SPECIFIEDCELL, OnSpecifiedCell) - ON_BN_CLICKED(IDC_LOCALCELL, OnLocalCell) - ON_BN_CLICKED(IDC_ALL_CELLS, OnAllCells) - ON_EN_CHANGE(IDC_CELL_NAME, OnChangeCellName) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CServerStatusDlg message handlers -BOOL CServerStatusDlg::Save() -{ - return FALSE; -} - -BOOL CServerStatusDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - m_CellName.EnableWindow(FALSE); - m_nCell = 0; - - UpdateData(FALSE); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CServerStatusDlg::OnShowStatus() -{ - UpdateData(TRUE); - - CheckServers(GetCellNameText(), (WHICH_CELLS)m_nCell, m_bFast); -} - -void CServerStatusDlg::OnSpecifiedCell() -{ - m_CellName.EnableWindow(TRUE); - - CheckEnableShowStatus(); -} - -void CServerStatusDlg::OnLocalCell() -{ - m_CellName.EnableWindow(FALSE); - m_ShowStatus.EnableWindow(TRUE); -} - -void CServerStatusDlg::OnAllCells() -{ - m_CellName.EnableWindow(FALSE); - m_ShowStatus.EnableWindow(TRUE); -} - -void CServerStatusDlg::CheckEnableShowStatus() -{ - m_ShowStatus.EnableWindow(GetCellNameText().GetLength() > 0); -} - -void CServerStatusDlg::OnChangeCellName() -{ - CheckEnableShowStatus(); -} - -CString CServerStatusDlg::GetCellNameText() -{ - CString strCellName; - - m_CellName.GetWindowText(strCellName); - - return strCellName; -} - -void CServerStatusDlg::OnHelp() -{ - ShowHelp(m_hWnd, SERVER_STATUS_HELP_ID); -} - diff --git a/src/WINNT/client_exp/set_afs_acl.cpp b/src/WINNT/client_exp/set_afs_acl.cpp deleted file mode 100644 index d44674390..000000000 --- a/src/WINNT/client_exp/set_afs_acl.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "set_afs_acl.h" -#include "clear_acl_dlg.h" -#include "add_acl_entry_dlg.h" -#include "copy_acl_dlg.h" -#include "gui2fs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CSetAfsAcl dialog - - -CSetAfsAcl::CSetAfsAcl(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CSetAfsAcl::IDD), pParent); - - //{{AFX_DATA_INIT(CSetAfsAcl) - //}}AFX_DATA_INIT - - m_bChanges = FALSE; - m_nCurSel = -1; -} - -void CSetAfsAcl::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CSetAfsAcl) - DDX_Control(pDX, IDC_REMOVE, m_Remove); - DDX_Control(pDX, IDC_ADMINISTER, m_AdminPerm); - DDX_Control(pDX, IDC_LOCK, m_LockPerm); - DDX_Control(pDX, IDC_INSERT, m_InsertPerm); - DDX_Control(pDX, IDC_DELETE, m_DeletePerm); - DDX_Control(pDX, IDC_LOOKUP, m_LookupPerm); - DDX_Control(pDX, IDC_WRITE, m_WritePerm); - DDX_Control(pDX, IDC_READ, m_ReadPerm); - DDX_Control(pDX, IDC_DIR_NAME, m_DirName); - DDX_Control(pDX, IDC_NEGATIVE_ENTRIES, m_NegativeRights); - DDX_Control(pDX, IDC_NORMAL_RIGHTS, m_NormalRights); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CSetAfsAcl, CDialog) - //{{AFX_MSG_MAP(CSetAfsAcl) - ON_BN_CLICKED(IDC_CLEAR, OnClear) - ON_BN_CLICKED(IDC_ADD, OnAdd) - ON_BN_CLICKED(IDC_COPY, OnCopy) - ON_LBN_SELCHANGE(IDC_NORMAL_RIGHTS, OnSelChangeNormalRights) - ON_LBN_SELCHANGE(IDC_NEGATIVE_ENTRIES, OnSelChangeNegativeEntries) - ON_BN_CLICKED(IDC_ADMINISTER, OnPermChange) - ON_BN_CLICKED(IDC_REMOVE, OnRemove) - ON_BN_CLICKED(IDC_CLEAN, OnClean) - ON_BN_CLICKED(IDC_DELETE, OnPermChange) - ON_BN_CLICKED(IDC_INSERT, OnPermChange) - ON_BN_CLICKED(IDC_LOCK, OnPermChange) - ON_BN_CLICKED(IDC_LOOKUP, OnPermChange) - ON_BN_CLICKED(IDC_READ, OnPermChange) - ON_BN_CLICKED(IDC_WRITE, OnPermChange) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CSetAfsAcl message handlers - -BOOL CSetAfsAcl::OnInitDialog() -{ - CDialog::OnInitDialog(); - - if (!GetRights(m_strDir, m_Normal, m_Negative)) { - EndDialog(0); - return TRUE; - } - - m_DirName.SetWindowText(m_strDir); - - EnablePermChanges(FALSE); - - m_NormalRights.SetTabStops(58); - m_NegativeRights.SetTabStops(58); - - for (int i = 0; i < m_Normal.GetSize(); i += 2) - m_NormalRights.AddString(m_Normal[i + 1] + "\t" + m_Normal[i]); - - for (i = 0; i < m_Negative.GetSize(); i += 2) - m_NegativeRights.AddString(m_Negative[i + 1] + "\t" + m_Negative[i]); - - CenterWindow(); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CSetAfsAcl::OnClear() -{ - CClearAclDlg dlg; - - if (dlg.DoModal() == IDCANCEL) - return; - - BOOL bNormal, bNegative, bClearRights = FALSE; - - dlg.GetSettings(bNormal, bNegative); - - if (bNormal) { - m_Normal.RemoveAll(); - m_NormalRights.ResetContent(); - if (m_bShowingNormal) - bClearRights = TRUE; - } - - if (bNegative) { - m_Negative.RemoveAll(); - m_NegativeRights.ResetContent(); - if (!m_bShowingNormal) - bClearRights = TRUE; - } - - if (bClearRights) - OnNothingSelected(); -} - -void CSetAfsAcl::OnAdd() -{ - CAddAclEntryDlg dlg; - - dlg.SetAclDlg(this); - - if (dlg.DoModal() == IDCANCEL) - return; - - OnNothingSelected(); - - CString name = dlg.GetName(); - CString rights = dlg.GetRights(); - BOOL bNormal = dlg.IsNormal(); - - if (bNormal) { - m_Normal.Add(name); - m_Normal.Add(rights); - m_nCurSel = m_NormalRights.AddString(rights + "\t" + name); - m_NormalRights.SetSel(m_nCurSel); - m_bShowingNormal = TRUE; - } else { - m_Negative.Add(name); - m_Negative.Add(rights); - m_nCurSel = m_NegativeRights.AddString(rights + "\t" + name); - m_NegativeRights.SetSel(m_nCurSel); - m_bShowingNormal = FALSE; - } - - ShowRights(rights); - EnablePermChanges(TRUE); - - m_bChanges = TRUE; -} - -void CSetAfsAcl::OnCopy() -{ - CCopyAclDlg dlg; - - dlg.SetFromDir(m_strDir); - - if (dlg.DoModal() == IDCANCEL) - return; - - CString strToDir = dlg.GetToDir(); - BOOL bClear = dlg.GetClear(); - - CopyACL(strToDir, m_Normal, m_Negative, bClear); -} - -void CSetAfsAcl::ShowRights(const CString& strRights) -{ - m_ReadPerm.SetCheck((strRights.Find("r") == -1) ? UNCHECKED : CHECKED); - m_WritePerm.SetCheck((strRights.Find("w") == -1) ? UNCHECKED : CHECKED); - m_LookupPerm.SetCheck((strRights.Find("l") == -1) ? UNCHECKED : CHECKED); - m_DeletePerm.SetCheck((strRights.Find("d") == -1) ? UNCHECKED : CHECKED); - m_InsertPerm.SetCheck((strRights.Find("i") == -1) ? UNCHECKED : CHECKED); - m_LockPerm.SetCheck((strRights.Find("k") == -1) ? UNCHECKED : CHECKED); - m_AdminPerm.SetCheck((strRights.Find("a") == -1) ? UNCHECKED : CHECKED); -} - -void CSetAfsAcl::OnSelChangeNormalRights() -{ - m_NegativeRights.SetSel(-1, FALSE); - - m_bShowingNormal = TRUE; - - int nNum = m_NormalRights.GetSelCount(); - if (nNum != 1) { - ShowRights(""); - EnablePermChanges(FALSE); - return; - } - - ASSERT(nNum == 1); // I'm paranoid - - VERIFY(m_NormalRights.GetSelItems(1, &m_nCurSel) == 1); - - CString strRights = m_Normal[(m_nCurSel * 2) + 1]; - ShowRights(strRights); - - OnSelection(); -} - -void CSetAfsAcl::OnSelChangeNegativeEntries() -{ - m_NormalRights.SetSel(-1, FALSE); - - m_bShowingNormal = FALSE; - - int nNum = m_NegativeRights.GetSelCount(); - if (nNum != 1) { - ShowRights(""); - EnablePermChanges(FALSE); - return; - } - - ASSERT(nNum == 1); // I'm paranoid - - VERIFY(m_NegativeRights.GetSelItems(1, &m_nCurSel) == 1); - - CString strRights = m_Negative[(m_nCurSel * 2) + 1]; - ShowRights(strRights); - - OnSelection(); -} - -CString CSetAfsAcl::MakeRightsString() -{ - CString str; - - if (m_ReadPerm.GetCheck() == CHECKED) - str += "r"; - if (m_LookupPerm.GetCheck() == CHECKED) - str += "l"; - if (m_InsertPerm.GetCheck() == CHECKED) - str += "i"; - if (m_DeletePerm.GetCheck() == CHECKED) - str += "d"; - if (m_WritePerm.GetCheck() == CHECKED) - str += "w"; - if (m_LockPerm.GetCheck() == CHECKED) - str += "k"; - if (m_AdminPerm.GetCheck() == CHECKED) - str += "a"; - - return str; -} - -void CSetAfsAcl::OnPermChange() -{ - CListBox *pRightsList; - CStringArray *pRights; - - if (m_bShowingNormal) { - pRightsList = &m_NormalRights; - pRights = &m_Normal; - } else { - pRightsList = &m_NegativeRights; - pRights = &m_Negative; - } - - ASSERT(m_nCurSel >= 0); - - CString str = MakeRightsString(); - (*pRights)[(2 * m_nCurSel) + 1] = str; - str += "\t" + (*pRights)[(2 * m_nCurSel)]; - - pRightsList->DeleteString(m_nCurSel); - pRightsList->InsertString(m_nCurSel, str); - pRightsList->SetSel(m_nCurSel); - - m_bChanges = TRUE; -} - -void CSetAfsAcl::OnRemove() -{ - CListBox *pRightsList; - CStringArray *pRights; - - if (m_bShowingNormal) { - pRightsList = &m_NormalRights; - pRights = &m_Normal; - } else { - pRightsList = &m_NegativeRights; - pRights = &m_Negative; - } - - int nNum = pRightsList->GetSelCount(); - if (nNum < 0) { - ASSERT(FALSE); - return; - } - - if (nNum == 0) { - ASSERT(FALSE); // How can this ever be 0? - ASSERT(m_nCurSel >= 0); - pRightsList->DeleteString(m_nCurSel); - pRights->RemoveAt(m_nCurSel * 2, 2); - } else { - int *pIndexes = new int[nNum]; - VERIFY(pRightsList->GetSelItems(nNum, pIndexes) != LB_ERR); - - for (int i = nNum - 1; i >= 0; i--) { - pRightsList->DeleteString(pIndexes[i]); - pRights->RemoveAt(pIndexes[i] * 2, 2); - } - - delete [] pIndexes; - } - - OnNothingSelected(); - - m_bChanges = TRUE; -} - -void CSetAfsAcl::EnablePermChanges(BOOL bEnable) -{ - m_ReadPerm.EnableWindow(bEnable); - m_WritePerm.EnableWindow(bEnable); - m_LookupPerm.EnableWindow(bEnable); - m_DeletePerm.EnableWindow(bEnable); - m_InsertPerm.EnableWindow(bEnable); - m_LockPerm.EnableWindow(bEnable); - m_AdminPerm.EnableWindow(bEnable); -} - -void CSetAfsAcl::OnNothingSelected() -{ - m_NormalRights.SetSel(-1, FALSE); // Unselect any selected normal rights - m_NegativeRights.SetSel(-1, FALSE); // Unselect any selected negative rights - ShowRights(""); // Show no rights - EnablePermChanges(FALSE); // Allow no rights changes - m_Remove.EnableWindow(FALSE); // Disable remove button -} - -void CSetAfsAcl::OnSelection() -{ - EnablePermChanges(TRUE); - m_Remove.EnableWindow(TRUE); -} - -void CSetAfsAcl::OnOK() -{ - if (m_bChanges && !SaveACL(m_strCellName, m_strDir, m_Normal, m_Negative)) - return; - - CDialog::OnOK(); -} - -void CSetAfsAcl::OnClean() -{ - CStringArray dirs; - - dirs.Add(m_strDir); - - CleanACL(dirs); -} - -BOOL CSetAfsAcl::IsNameInUse(BOOL bNormal, const CString& strName) -{ - if (bNormal) { - for (int i = 0; i < m_Normal.GetSize(); i += 2) - if (m_Normal[i] == strName) - return TRUE; - - return FALSE; - } - - for (int i = 0; i < m_Negative.GetSize(); i += 2) - if (m_Negative[i] == strName) - return TRUE; - - return FALSE; -} - -void CSetAfsAcl::OnHelp() -{ - ShowHelp(m_hWnd, SET_AFS_ACL_HELP_ID); -} - diff --git a/src/WINNT/client_exp/set_afs_acl.h b/src/WINNT/client_exp/set_afs_acl.h deleted file mode 100644 index 1b4f3c181..000000000 --- a/src/WINNT/client_exp/set_afs_acl.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CSetAfsAcl : public CDialog -{ - CString m_strDir; - CString m_strCellName; - BOOL m_bShowingNormal; - CStringArray m_Normal, m_Negative; - BOOL m_bChanges; - int m_nCurSel; - - void ShowRights(const CString& strRights); - CString MakeRightsString(); - void EnablePermChanges(BOOL bEnable); - - void OnNothingSelected(); - void OnSelection(); - - // Construction -public: - CSetAfsAcl(CWnd* pParent = NULL); // standard constructor - - void SetDir(const CString strDir) { m_strDir = strDir; } - - BOOL IsNameInUse(BOOL bNormal, const CString& strName); - -// Dialog Data - //{{AFX_DATA(CSetAfsAcl) - enum { IDD = IDD_SET_AFS_ACL }; - CButton m_Remove; - CButton m_AdminPerm; - CButton m_LockPerm; - CButton m_InsertPerm; - CButton m_DeletePerm; - CButton m_LookupPerm; - CButton m_WritePerm; - CButton m_ReadPerm; - CStatic m_DirName; - CListBox m_NegativeRights; - CListBox m_NormalRights; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CSetAfsAcl) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CSetAfsAcl) - afx_msg void OnClear(); - afx_msg void OnAdd(); - afx_msg void OnCopy(); - virtual BOOL OnInitDialog(); - afx_msg void OnSelChangeNormalRights(); - afx_msg void OnSelChangeNegativeEntries(); - afx_msg void OnPermChange(); - afx_msg void OnRemove(); - virtual void OnOK(); - afx_msg void OnClean(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/shell_ext.cpp b/src/WINNT/client_exp/shell_ext.cpp deleted file mode 100644 index 7324561ef..000000000 --- a/src/WINNT/client_exp/shell_ext.cpp +++ /dev/null @@ -1,739 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include -#include "stdafx.h" -#include -#include -#include -#include "afs_shl_ext.h" -#include "shell_ext.h" -#include "volume_info.h" -#include "set_afs_acl.h" -#include "gui2fs.h" -#include "make_mount_point_dlg.h" -#include "msgs.h" -#include "server_status_dlg.h" -#include "auth_dlg.h" -#include "submounts_dlg.h" -#include "make_symbolic_link_dlg.h" -#include - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - - -ULONG nCMRefCount = 0; // IContextMenu ref count -ULONG nSERefCount = 0; // IShellExtInit ref count -ULONG nICRefCount=0; -ULONG nTPRefCount=0; -ULONG nXPRefCount=0; - -#define MAXSIZE 2048 /* most I'll get back from PIOCTL */ -#define PCCHAR(str) ((char *)(const char *)str) -static char space[MAXSIZE]; - -static BOOL IsADir(const CString& strName) -{ - struct _stat statbuf; - - if (_stat(strName, &statbuf) < 0) - return FALSE; - - return statbuf.st_mode & _S_IFDIR; -} - -///////////////////////////////////////////////////////////////////////////// -// CShellExt - -IMPLEMENT_DYNCREATE(CShellExt, CCmdTarget) -#define REG_CLIENT_PARMS_KEY "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters" -#define OVERLAYENABLED 1 - -CShellExt::CShellExt() -{ - HKEY NPKey; - EnableAutomation(); - nCMRefCount++; - HRESULT hr; - UINT code; - DWORD ShellOption,LSPsize,LSPtype; - hr = SHGetMalloc(&m_pAlloc); - m_bIsOverlayEnabled=FALSE; - if (FAILED(hr)) - m_pAlloc = NULL; - RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,0, KEY_QUERY_VALUE, &NPKey); - LSPsize=sizeof(ShellOption); - code=RegQueryValueEx(NPKey, "ShellOption", NULL, - &LSPtype, (LPBYTE)&ShellOption, &LSPsize); - RegCloseKey (NPKey); - m_bIsOverlayEnabled=((code==0) && (LSPtype==REG_DWORD) && ((ShellOption & OVERLAYENABLED)!=0)); - TRACE("Create CShellExt, Ref count %d/n",nCMRefCount); -} - -CShellExt::~CShellExt() -{ - if(m_pAlloc) m_pAlloc->Release(); - nCMRefCount--; - TRACE("Destroy CShellExt, Ref count %d/n",nCMRefCount); -} - - -void CShellExt::OnFinalRelease() -{ - // When the last reference for an automation object is released - // OnFinalRelease is called. The base class will automatically - // deletes the object. Add additional cleanup required for your - // object before calling the base class. - - CCmdTarget::OnFinalRelease(); -} - - -BEGIN_MESSAGE_MAP(CShellExt, CCmdTarget) - //{{AFX_MSG_MAP(CShellExt) - // NOTE - the ClassWizard will add and remove mapping macros here. - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -BEGIN_DISPATCH_MAP(CShellExt, CCmdTarget) - //{{AFX_DISPATCH_MAP(CShellExt) - // NOTE - the ClassWizard will add and remove mapping macros here. - //}}AFX_DISPATCH_MAP -END_DISPATCH_MAP() - -// Note: we add support for IID_IShellExt to support typesafe binding -// from VBA. This IID must match the GUID that is attached to the -// dispinterface in the .ODL file. - -// {DC515C27-6CAC-11D1-BAE7-00C04FD140D2} -static const IID IID_IShellExt = -{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2 } }; - -BEGIN_INTERFACE_MAP(CShellExt, CCmdTarget) - INTERFACE_PART(CShellExt, IID_IShellExt, Dispatch) - INTERFACE_PART(CShellExt, IID_IContextMenu, MenuExt) - INTERFACE_PART(CShellExt, IID_IShellExtInit, ShellInit) - INTERFACE_PART(CShellExt, IID_IShellIconOverlayIdentifier, IconExt) - INTERFACE_PART(CShellExt, IID_IQueryInfo , ToolTipExt) - INTERFACE_PART(CShellExt, IID_IPersistFile , PersistFileExt) -END_INTERFACE_MAP() - -IMPLEMENT_OLECREATE(CShellExt, STR_EXT_TITLE, 0xdc515c27, 0x6cac, 0x11d1, 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2) - - -///////////////////////////////////////////////////////////////////////////// -// CShellExt message handlers -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// IUnknown for IContextMenu -///////////////////////////////////////////////////////////////////////////// -STDMETHODIMP CShellExt::XMenuExt::QueryInterface(REFIID riid, void** ppv) -{ - METHOD_PROLOGUE(CShellExt, MenuExt); - - return pThis->ExternalQueryInterface(&riid, ppv); -} - -STDMETHODIMP_(ULONG) CShellExt::XMenuExt::AddRef(void) -{ - return ++nCMRefCount; -} - -STDMETHODIMP_(ULONG) CShellExt::XMenuExt::Release(void) -{ - if (nCMRefCount > 0) - nCMRefCount--; - - return nCMRefCount; -} - -///////////////////////////////////////////////////////////////////////////// -// IConextMenu Functions -///////////////////////////////////////////////////////////////////////////// -STDMETHODIMP CShellExt::XMenuExt::QueryContextMenu(HMENU hMenu,UINT indexMenu, - UINT idCmdFirst, UINT idCmdLast,UINT uFlags) -{ - METHOD_PROLOGUE(CShellExt, MenuExt); - - // Don't add any menu items if we're being asked to deal with this file as a shortcut. - if (uFlags & CMF_VERBSONLY) - return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, (USHORT)0); - - // Check to see if there's already an AFS menu here; if so, remove it - int nItemsNow = GetMenuItemCount (hMenu); - CString strAfsItemText = GetMessageString(IDS_AFS_ITEM); - LPCTSTR pszAfsItemText = (LPCTSTR)strAfsItemText; - for (int iItem = 0; iItem < nItemsNow; iItem++) { - TCHAR szItemText[256]; - if (!GetMenuString (hMenu, iItem, szItemText, 256, MF_BYPOSITION)) - continue; - if (!lstrcmp (szItemText, pszAfsItemText)) { - DeleteMenu (hMenu, iItem, MF_BYPOSITION); - continue; - } - if ((!lstrcmp(szItemText,"&Delete"))&&(pThis->m_bIsSymlink)) { /*this is a symlink - don't present a delete menu!*/ - DeleteMenu (hMenu, iItem, MF_BYPOSITION); - continue; - } - if ((!lstrcmp(szItemText,"Cu&t"))&&(pThis->m_bIsSymlink)) { /*same for cut*/ - DeleteMenu (hMenu, iItem, MF_BYPOSITION); - continue; - } - } - int indexShellMenu = 0; - - // Create the AFS submenu using the allowed ID's. - HMENU hAfsMenu = CreatePopupMenu(); - int indexAfsMenu = 0; - - // The Authentication item has been removed from the AFS menu because - // there is now a tray icon to handle authentication. - // - //::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_AUTHENTICATION, GetMessageString(IDS_AUTHENTICATION_ITEM)); - - // Only enable the ACL menu item if a single directory is selected - int nSingleDirOnly = MF_GRAYED; - if (pThis->m_bDirSelected && (pThis->m_astrFileNames.GetSize() == 1)) - nSingleDirOnly = MF_ENABLED; - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION | nSingleDirOnly, idCmdFirst + IDM_ACL_SET, GetMessageString(IDS_ACLS_ITEM)); - - // Volume/Partition submenu of the AFS submenu - HMENU hVolPartMenu = CreatePopupMenu(); - int indexVolPartMenu = 0; - ::InsertMenu(hVolPartMenu, indexVolPartMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_VOLUME_PROPERTIES, GetMessageString(IDS_VOL_PART_PROPS_ITEM)); - ::InsertMenu(hVolPartMenu, indexVolPartMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE, GetMessageString(IDS_VOL_PART_REFRESH_ITEM)); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)hVolPartMenu, GetMessageString(IDS_VOL_PART_ITEM)); - - // Mount Point submenu of the AFS submenu - HMENU hMountPointMenu = CreatePopupMenu(); - int indexMountPointMenu = 0; - int nMountPointSelected = MF_GRAYED; - for (int n = pThis->m_astrFileNames.GetSize() - 1 ; n >= 0; n--) { - if ( IsMountPoint(pThis->m_astrFileNames[n]) ) { - nMountPointSelected = MF_ENABLED; - break; - } - } - ::InsertMenu(hMountPointMenu, indexMountPointMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_MOUNTPOINT_SHOW, GetMessageString(IDS_MP_SHOW_ITEM)); - ::InsertMenu(hMountPointMenu, indexMountPointMenu++, MF_STRING | MF_BYPOSITION | nMountPointSelected, idCmdFirst + IDM_MOUNTPOINT_REMOVE, GetMessageString(IDS_MP_REMOVE_ITEM)); - ::InsertMenu(hMountPointMenu, indexMountPointMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_MOUNTPOINT_MAKE, GetMessageString(IDS_MP_MAKE_ITEM)); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)hMountPointMenu, GetMessageString(IDS_MOUNT_POINT_ITEM)); - - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_FLUSH, GetMessageString(IDS_FLUSH_FILE_DIR_ITEM)); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_FLUSH_VOLUME, GetMessageString(IDS_FLUSH_VOLUME_ITEM)); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SHOW_SERVER, GetMessageString(IDS_SHOW_FILE_SERVERS_ITEM)); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SHOWCELL, GetMessageString(IDS_SHOW_CELL_ITEM)); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SERVER_STATUS, GetMessageString(IDS_SHOW_SERVER_STATUS_ITEM)); - - HMENU hSymbolicMenu = CreatePopupMenu(); - int indexSymbolicMenu = 0; - ::InsertMenu(hSymbolicMenu, indexSymbolicMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SYMBOLICLINK_ADD, GetMessageString(IDS_SYMBOLICLINK_ADD)); - // ::InsertMenu(hSymbolicMenu, indexSymbolicMenu, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SYMBOLICLINK_EDIT, GetMessageString(IDS_SYMBOLICLINK_EDIT)); - // ::EnableMenuItem(hSymbolicMenu,indexSymbolicMenu++,((pThis->m_bIsSymlink)?MF_ENABLED:MF_GRAYED)|MF_BYPOSITION); - ::InsertMenu(hSymbolicMenu, indexSymbolicMenu, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SYMBOLICLINK_REMOVE, GetMessageString(IDS_SYMBOLICLINK_REMOVE)); - ::EnableMenuItem(hSymbolicMenu,indexSymbolicMenu++,((pThis->m_bIsSymlink)?MF_ENABLED:MF_GRAYED)|MF_BYPOSITION); - ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)hSymbolicMenu, GetMessageString(IDS_SYMBOLIC_LINK_ITEM)); - - // The Submounts menu has been removed because the AFS tray icon - // and control panel now support mapping drives directly to an AFS - // path. - // - // HMENU hSubmountMenu = CreatePopupMenu(); - // int indexSubmountMenu = 0; - // ::InsertMenu(hSubmountMenu, indexSubmountMenu++, MF_STRING | MF_BYPOSITION | nSingleDirOnly, idCmdFirst + IDM_SUBMOUNTS_CREATE, GetMessageString(IDS_SUBMOUNTS_CREATE_ITEM)); - // ::InsertMenu(hSubmountMenu, indexSubmountMenu++, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_SUBMOUNTS_EDIT, GetMessageString(IDS_SUBMOUNTS_EDIT_ITEM)); - // ::InsertMenu(hAfsMenu, indexAfsMenu++, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)hSubmountMenu, GetMessageString(IDS_SUBMOUNTS_ITEM)); - - // Add a separator - ::InsertMenu (hMenu, indexMenu + indexShellMenu++, MF_STRING | MF_BYPOSITION | MF_SEPARATOR, 0, TEXT("")); - - // Add the AFS submenu to the shell's menu - ::InsertMenu(hMenu, indexMenu + indexShellMenu++, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)hAfsMenu, GetMessageString(IDS_AFS_ITEM)); - - // Add a separator after us - ::InsertMenu (hMenu, indexMenu + indexShellMenu++, MF_STRING | MF_BYPOSITION | MF_SEPARATOR, 0, TEXT("")); - - return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, - (USHORT)indexAfsMenu + indexVolPartMenu + indexMountPointMenu + indexShellMenu + indexSymbolicMenu); -} - -STDMETHODIMP CShellExt::XMenuExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) -{ - METHOD_PROLOGUE(CShellExt, MenuExt); - - if (HIWORD(lpici->lpVerb )) - return E_FAIL; - - AddRef(); - - CStringArray &files = pThis->m_astrFileNames; - - switch (LOWORD(lpici->lpVerb)) - { - case IDM_AUTHENTICATION: { - CAuthDlg dlg; - dlg.DoModal(); - break; - } - - case IDM_ACL_SET: { - CSetAfsAcl dlg; - ASSERT(files.GetSize() == 1); - dlg.SetDir(files[0]); - dlg.DoModal(); - } - break; - - case IDM_VOLUME_PROPERTIES: { - CVolumeInfo dlg; - dlg.SetFiles(files); - dlg.DoModal(); - } - break; - - case IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE: CheckVolumes(); - break; - - case IDM_MOUNTPOINT_SHOW: ListMount(files); - break; - - case IDM_MOUNTPOINT_REMOVE: { - int nChoice = ShowMessageBox(IDS_REALLY_DEL_MOUNT_POINTS, MB_ICONQUESTION | MB_YESNO, IDS_REALLY_DEL_MOUNT_POINTS); - if (nChoice == IDYES) - RemoveMount(files); - } - break; - - case IDM_MOUNTPOINT_MAKE: { - CMakeMountPointDlg dlg; - ASSERT(files.GetSize() == 1); - dlg.SetDir(files[0]); - dlg.DoModal(); - } - break; - - - case IDM_FLUSH: Flush(files); - break; - - case IDM_FLUSH_VOLUME: FlushVolume(files); - break; - - case IDM_SHOW_SERVER: WhereIs(files); - break; - - case IDM_SHOWCELL: WhichCell(files); - break; - - case IDM_SERVER_STATUS: { - CServerStatusDlg dlg; - dlg.DoModal(); - } - break; - - /* - case IDM_SUBMOUNTS_EDIT: { - CSubmountsDlg dlg; - dlg.DoModal(); - } - break; - - case IDM_SUBMOUNTS_CREATE: { - ASSERT(files.GetSize() == 1); - CSubmountsDlg dlg; - dlg.SetAddOnlyMode(files[0]); - dlg.DoModal(); - } - break; - */ - case IDM_SYMBOLICLINK_REMOVE: { - if (files.GetSize()>1) - break; - CString msg=files.GetAt(0); - int i; - if ((i=msg.ReverseFind('\\'))>0) - msg=msg.Left(i+1); - else if ((i=msg.ReverseFind(':'))>0) - msg=msg.Left(i+1)+"\\"; - if (!SetCurrentDirectory(msg)) - { - MessageBeep((UINT)-1); - ShowMessageBox(IDS_UNABLE_TO_SET_CURRENT_DIRECTORY,MB_OK,IDS_UNABLE_TO_SET_CURRENT_DIRECTORY); - break; - } - msg=files.GetAt(0); - if ((i=msg.ReverseFind('\\'))>0||((i=msg.ReverseFind(':'))>0)) - msg=msg.Right(msg.GetLength()-i-1); - int nChoice = ShowMessageBox(IDS_REALLY_REMOVE_SYMLINK, MB_ICONQUESTION | MB_YESNO, IDS_REALLY_REMOVE_SYMLINK,msg); - if (nChoice == IDYES) - RemoveSymlink(files.GetAt(0)); - } - break; - - case IDM_SYMBOLICLINK_ADD: { - CString msg=files.GetAt(0); - int i; - if ((i=msg.ReverseFind('\\'))>0) - msg=msg.Left(i+1); - else if ((i=msg.ReverseFind(':'))>0) - msg=msg.Left(i+1)+"\\"; - CMakeSymbolicLinkDlg dlg; - dlg.Setbase(msg); - dlg.DoModal(); - } - break; - - case IDM_REMOVE_SYMLINK: { - if (files.GetSize()>1) - break; - int nChoice = ShowMessageBox(IDS_REALLY_REMOVE_SYMLINK, MB_ICONQUESTION | MB_YESNO, IDS_REALLY_REMOVE_SYMLINK); - if (nChoice == IDYES) - RemoveSymlink(files.GetAt(0)); - } - break; - default: - ASSERT(FALSE); - Release(); - return E_INVALIDARG; - } - - Release(); - - return NOERROR; -} - -STDMETHODIMP CShellExt::XMenuExt::GetCommandString(UINT idCmd, UINT uType, - UINT* pwReserved, LPSTR pszName, UINT cchMax) -{ - if (uType != GCS_HELPTEXT) - return NOERROR; // ????????????????????????????????????????????????? - - UINT nCmdStrID; - - AfxSetResourceHandle(theApp.m_hInstance); - - switch (idCmd) - { - case IDM_AUTHENTICATION: nCmdStrID = ID_AUTHENTICATE; - break; - - case IDM_ACL_SET: nCmdStrID = ID_ACL_SET; - break; - - case IDM_VOLUME_PROPERTIES: nCmdStrID = ID_VOLUME_PROPERTIES; - break; - - case IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE: nCmdStrID = ID_VOLUMEPARTITION_UPDATENAMEIDTABLE; - break; - - case IDM_MOUNTPOINT_SHOW: nCmdStrID = ID_MOUNTPOINT_SHOW; - break; - - case IDM_MOUNTPOINT_REMOVE: nCmdStrID = ID_MOUNTPOINT_REMOVE; - break; - - case IDM_MOUNTPOINT_MAKE: nCmdStrID = ID_MOUNTPOINT_MAKE; - break; - - case IDM_FLUSH: nCmdStrID = ID_FLUSH; - break; - - case IDM_FLUSH_VOLUME: nCmdStrID = ID_VOLUME_FLUSH; - break; - - case IDM_SHOW_SERVER: nCmdStrID = ID_WHEREIS; - break; - - case IDM_SHOWCELL: nCmdStrID = ID_SHOWCELL; - break; - - case IDM_SERVER_STATUS: nCmdStrID = ID_SERVER_STATUS; - break; - - case IDM_SYMBOLICLINK_ADD: nCmdStrID = ID_SYMBOLICLINK_ADD; - break; - - case IDM_SYMBOLICLINK_REMOVE: nCmdStrID = ID_SYMBOLICLINK_REMOVE; - break; - - case IDM_REMOVE_SYMLINK: nCmdStrID= ID_REMOVE_SYMLINK; - break; - - default: - ASSERT(FALSE); - Release(); - return E_INVALIDARG; - } - - CString strMsg; - LoadString (strMsg, nCmdStrID); - - strncpy(pszName, strMsg, cchMax); - - return NOERROR; -} - -///////////////////////////////////////////////////////////////////////////// -// IUnknown for IShellExtInit -///////////////////////////////////////////////////////////////////////////// -STDMETHODIMP CShellExt::XShellInit::QueryInterface(REFIID riid, void** ppv) -{ - METHOD_PROLOGUE(CShellExt, ShellInit); - - return pThis->ExternalQueryInterface(&riid, ppv); -} - -STDMETHODIMP_(ULONG) CShellExt::XShellInit::AddRef(void) -{ - return ++nSERefCount; -} - -STDMETHODIMP_(ULONG) CShellExt::XShellInit::Release(void) -{ - if (nSERefCount > 0) - nSERefCount--; - - return nSERefCount; -} - -///////////////////////////////////////////////////////////////////////////// -// IShellInit Functions -///////////////////////////////////////////////////////////////////////////// -STDMETHODIMP CShellExt::XShellInit::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdobj, HKEY hkeyProgID) -{ - METHOD_PROLOGUE(CShellExt, ShellInit); - - HRESULT hres = E_FAIL; - FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; - STGMEDIUM medium; - - // We must have a data object - if (pdobj == NULL) - return E_FAIL; - - // Use the given IDataObject to get a list of filenames (CF_HDROP) - hres = pdobj->GetData(&fmte, &medium); - if (FAILED(hres)) { - return E_FAIL; - } - - int nNumFiles = DragQueryFile((HDROP)medium.hGlobal, 0xFFFFFFFF, NULL, 0); - if (nNumFiles == 0) - hres = E_FAIL; - else { - pThis->m_bDirSelected = FALSE; - - for (int ii = 0; ii < nNumFiles; ii++) { - CString strFileName; - - // Get the size of the file name string - int nNameLen = DragQueryFile((HDROP)medium.hGlobal, ii, 0, 0); - - // Make room for it in our string object - LPTSTR pszFileNameBuf = strFileName.GetBuffer(nNameLen + 1); // +1 for the terminating NULL - ASSERT(pszFileNameBuf); - - // Get the file name - DragQueryFile((HDROP)medium.hGlobal, ii, pszFileNameBuf, nNameLen + 1); - - strFileName.ReleaseBuffer(); - - if (!IsPathInAfs(strFileName)) { - pThis->m_astrFileNames.RemoveAll(); - break; - } else { - pThis->m_bIsSymlink=IsSymlink(strFileName); - } - - if (IsADir(strFileName)) - pThis->m_bDirSelected = TRUE; - - pThis->m_astrFileNames.Add(strFileName); - } - - if (pThis->m_astrFileNames.GetSize() > 0) - hres = NOERROR; - else - hres = E_FAIL; - } - - // Release the data - ReleaseStgMedium(&medium); - - return hres; -} - -STDMETHODIMP CShellExt::XIconExt::QueryInterface(REFIID riid, void** ppv) -{ - METHOD_PROLOGUE(CShellExt, IconExt); - return pThis->ExternalQueryInterface(&riid, ppv); -} - -STDMETHODIMP_(ULONG) CShellExt::XIconExt::AddRef(void) -{ - return ++nICRefCount; -} - -STDMETHODIMP_(ULONG) CShellExt::XIconExt::Release(void) -{ - if (nICRefCount > 0) - nICRefCount--; - - return nICRefCount; -} - - -///////////////////////////////////////////////////////////////////////////// -// IIconHandler Functions -///////////////////////////////////////////////////////////////////////////// - -STDMETHODIMP CShellExt::XIconExt::GetOverlayInfo(LPWSTR pwszIconFile - ,int cchMax,int* pIndex,DWORD* pdwFlags) -{ - if(IsBadWritePtr(pIndex, sizeof(int))) - return E_INVALIDARG; - if(IsBadWritePtr(pdwFlags, sizeof(DWORD))) - return E_INVALIDARG; - - HMODULE hModule=GetModuleHandle("shell32.dll"); - TCHAR szModule[MAX_PATH]; - DWORD z=GetModuleFileName(hModule,szModule,sizeof(szModule)); - MultiByteToWideChar( CP_ACP,0,szModule,-1,pwszIconFile,cchMax); - *pIndex = 30; - *pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX; - return S_OK; -} - -STDMETHODIMP CShellExt::XIconExt::GetPriority(int* pPriority) -{ - if(IsBadWritePtr(pPriority, sizeof(int))) - return E_INVALIDARG; - *pPriority = 0; - return S_OK; -} - -STDMETHODIMP CShellExt::XIconExt::IsMemberOf(LPCWSTR pwszPath,DWORD dwAttrib) -{ - TCHAR szPath[MAX_PATH]; - WideCharToMultiByte( CP_ACP,0,pwszPath,-1,szPath,MAX_PATH,NULL,NULL); - if (IsSymlink(szPath)) - return S_OK; - return S_FALSE; -} - -/* TOOL TIP INFO IMPLIMENTION */ - -STDMETHODIMP CShellExt::XToolTipExt::QueryInterface(REFIID riid, void** ppv) -{ - METHOD_PROLOGUE(CShellExt, ToolTipExt); - return pThis->ExternalQueryInterface(&riid, ppv); -} - -STDMETHODIMP_(ULONG) CShellExt::XToolTipExt::AddRef(void) -{ - return ++nTPRefCount; -} - -STDMETHODIMP_(ULONG) CShellExt::XToolTipExt::Release(void) -{ - if (nTPRefCount> 0) - nTPRefCount--; - - return nTPRefCount; -} - -STDMETHODIMP CShellExt::XToolTipExt::GetInfoTip(DWORD dwFlags, LPWSTR *ppwszTip) -{ - METHOD_PROLOGUE(CShellExt, ToolTipExt); - - if (!IsSymlink(pThis->m_szFile)) - { - ppwszTip=NULL; - return S_OK; - } - USES_CONVERSION; - // dwFlags is currently unused. - *ppwszTip = (WCHAR*) (pThis->m_pAlloc)->Alloc((1+lstrlen(pThis->m_szFile))*sizeof(WCHAR)); - if (*ppwszTip) - { - wcscpy(*ppwszTip, (WCHAR*)T2OLE(pThis->m_szFile)); - } - - return S_OK; -} -STDMETHODIMP CShellExt::XToolTipExt::GetInfoFlags(LPDWORD pdwFlags) -{ - return S_OK; -} - -////////// IPersistFile -/////// PersistFileExt - -STDMETHODIMP CShellExt::XPersistFileExt::QueryInterface(REFIID riid, void** ppv) -{ - METHOD_PROLOGUE(CShellExt, PersistFileExt); - return pThis->ExternalQueryInterface(&riid, ppv); -} - -STDMETHODIMP_(ULONG) CShellExt::XPersistFileExt::AddRef(void) -{ - return ++nXPRefCount; -} - -STDMETHODIMP_(ULONG) CShellExt::XPersistFileExt::Release(void) -{ - if (nXPRefCount> 0) - nXPRefCount--; - - return nXPRefCount; -} - -STDMETHODIMP CShellExt::XPersistFileExt::Load(LPCOLESTR wszFile, DWORD dwMode) -{ - METHOD_PROLOGUE(CShellExt, PersistFileExt); - USES_CONVERSION; - _tcscpy(pThis->m_szFile, OLE2T((WCHAR*)wszFile)); - return S_OK; -} - -STDMETHODIMP CShellExt::XPersistFileExt::GetClassID(LPCLSID) -{ - return E_NOTIMPL; -} - -STDMETHODIMP CShellExt::XPersistFileExt::IsDirty(VOID) -{ - return E_NOTIMPL; -} - -STDMETHODIMP CShellExt::XPersistFileExt::Save(LPCOLESTR, BOOL) -{ - return E_NOTIMPL; -} - -STDMETHODIMP CShellExt::XPersistFileExt::SaveCompleted(LPCOLESTR) -{ - return E_NOTIMPL; -} - -STDMETHODIMP CShellExt::XPersistFileExt::GetCurFile(LPOLESTR FAR*) -{ - return E_NOTIMPL; -} diff --git a/src/WINNT/client_exp/shell_ext.h b/src/WINNT/client_exp/shell_ext.h deleted file mode 100644 index 9265644a7..000000000 --- a/src/WINNT/client_exp/shell_ext.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#if !defined(AFX_SHELLEXT_H__DC515C28_6CAC_11D1_BAE7_00C04FD140D2__INCLUDED_) -#define AFX_SHELLEXT_H__DC515C28_6CAC_11D1_BAE7_00C04FD140D2__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 -// shell_ext.h : header file -// - -#include - -extern ULONG nCMRefCount; // IContextMenu ref count -extern ULONG nSERefCount; // IShellExtInit ref count -extern ULONG nICRefCount; // IContextMenu ref count -extern ULONG nTPRefCount; // IQueryInfo ref count -extern ULONG nXPRefCount; // IPersistFile ref count - -#define STR_EXT_TITLE TEXT("AfsClientContextMenu") -#define STR_REG_PATH TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIconOverlayIdentifiers") - -///////////////////////////////////////////////////////////////////////////// -// CShellExt command target - -class CShellExt : public CCmdTarget -{ - DECLARE_DYNCREATE(CShellExt) - - BOOL m_bDirSelected; - BOOL m_bIsSymlink; // is symbolic link! - TCHAR m_szFile[MAX_PATH]; - BOOL m_bIsOverlayEnabled; - BOOL IsOverlayEnabled(){return m_bIsOverlayEnabled;} - - CStringArray m_astrFileNames; - - CShellExt(); // protected constructor used by dynamic creation - LPMALLOC m_pAlloc; - -// Attributes -public: - -// Operations -public: - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CShellExt) - public: - virtual void OnFinalRelease(); - //}}AFX_VIRTUAL - -// Implementation -protected: - virtual ~CShellExt(); - - // Generated message map functions - //{{AFX_MSG(CShellExt) - // NOTE - the ClassWizard will add and remove member functions here. - //}}AFX_MSG - - DECLARE_MESSAGE_MAP() - // Generated OLE dispatch map functions - //{{AFX_DISPATCH(CShellExt) - // NOTE - the ClassWizard will add and remove member functions here. - //}}AFX_DISPATCH - DECLARE_DISPATCH_MAP() - - DECLARE_OLECREATE(CShellExt) - - // IFileViewer interface - BEGIN_INTERFACE_PART(MenuExt, IContextMenu) - STDMETHOD(QueryContextMenu)( HMENU hmenu,UINT indexMenu,UINT idCmdFirst, - UINT idCmdLast,UINT uFlags); - STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO lpici); - STDMETHOD(GetCommandString)(UINT idCmd,UINT uType,UINT* pwReserved,LPSTR pszName, - UINT cchMax); - END_INTERFACE_PART(MenuExt) - - // IShellExtInit interface - BEGIN_INTERFACE_PART(ShellInit, IShellExtInit) - STDMETHOD(Initialize)(LPCITEMIDLIST pidlFolder,IDataObject *lpdobj, HKEY hkeyProgID); - END_INTERFACE_PART(ShellInit) - - BEGIN_INTERFACE_PART(IconExt, IShellIconOverlayIdentifier) - STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile,int cchMax,int* pIndex,DWORD* pdwFlags); - STDMETHOD(GetPriority)(int* pPriority); - STDMETHOD(IsMemberOf)(LPCWSTR pwszPath,DWORD dwAttrib); - END_INTERFACE_PART(IconExt) - - BEGIN_INTERFACE_PART(ToolTipExt, IQueryInfo) - STDMETHOD(GetInfoTip)(DWORD dwFlags, LPWSTR *ppwszTip); - STDMETHOD(GetInfoFlags)(LPDWORD pdwFlags); - END_INTERFACE_PART(ToolTipExt) - - BEGIN_INTERFACE_PART(PersistFileExt, IPersistFile) - STDMETHOD(Load)(LPCOLESTR wszFile, DWORD dwMode); - STDMETHOD(GetClassID)(LPCLSID); - STDMETHOD(IsDirty)(VOID); - STDMETHOD(Save)(LPCOLESTR, BOOL); - STDMETHOD(SaveCompleted)(LPCOLESTR); - STDMETHOD(GetCurFile)(LPOLESTR FAR*); - END_INTERFACE_PART(PersistFileExt) - - DECLARE_INTERFACE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Developer Studio will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_SHELLEXT_H__DC515C28_6CAC_11D1_BAE7_00C04FD140D2__INCLUDED_) diff --git a/src/WINNT/client_exp/stdafx.cpp b/src/WINNT/client_exp/stdafx.cpp deleted file mode 100644 index dbb1fb962..000000000 --- a/src/WINNT/client_exp/stdafx.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" - diff --git a/src/WINNT/client_exp/stdafx.h b/src/WINNT/client_exp/stdafx.h deleted file mode 100644 index b9921cd7c..000000000 --- a/src/WINNT/client_exp/stdafx.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#if !defined(AFX_STDAFX_H__601A9D0D_6CD3_11D1_BAE7_00C04FD140D2__INCLUDED_) -#define AFX_STDAFX_H__601A9D0D_6CD3_11D1_BAE7_00C04FD140D2__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -// Don't include stuff we don't need. -#define _AFX_NO_DB_SUPPORT -#define _AFX_NO_DAO_SUPPORT - -#include // MFC core and standard components -#include // MFC extensions - -#ifndef _AFX_NO_OLE_SUPPORT -#include // MFC OLE classes -#include // MFC OLE dialog classes -#include // MFC OLE automation classes -#endif // _AFX_NO_OLE_SUPPORT - - -#ifndef _AFX_NO_DB_SUPPORT -#include // MFC ODBC database classes -#endif // _AFX_NO_DB_SUPPORT - -#ifndef _AFX_NO_DAO_SUPPORT -#include // MFC DAO database classes -#endif // _AFX_NO_DAO_SUPPORT - -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -//{{AFX_INSERT_LOCATION}} -// Microsoft Developer Studio will insert additional declarations immediately before the previous line. - -#define UNCHECKED 0 -#define CHECKED 1 - -#include "help.h" - -#include - -#if defined (_DEBUG) && defined (AFS_CRTDBG_MAP_ALLOC) -#define new DEBUG_NEW -#endif - -#endif // !defined(AFX_STDAFX_H__601A9D0D_6CD3_11D1_BAE7_00C04FD140D2__INCLUDED_) diff --git a/src/WINNT/client_exp/submount_info.cpp b/src/WINNT/client_exp/submount_info.cpp deleted file mode 100644 index f1cf7c2c5..000000000 --- a/src/WINNT/client_exp/submount_info.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "submount_info.h" - - -CSubmountInfo::CSubmountInfo() -{ - m_Status = SIS_NULL; -} - -CSubmountInfo::CSubmountInfo(const CString& strShareName, const CString& strPathName, SUBMT_INFO_STATUS status) -{ - m_Status = status; - - SetShareName(strShareName); - SetPathName(strPathName); -} - -CSubmountInfo::CSubmountInfo(const CSubmountInfo& info) -{ - SetStatus(info.GetStatus()); - SetShareName(info.GetShareName()); - SetPathName(info.GetPathName()); -} - -CSubmountInfo::~CSubmountInfo() -{ -} - diff --git a/src/WINNT/client_exp/submount_info.h b/src/WINNT/client_exp/submount_info.h deleted file mode 100644 index 61ac9b102..000000000 --- a/src/WINNT/client_exp/submount_info.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _SUBMOUNTINFO_H_ -#define _SUBMOUNTINFO_H_ - -#include - -enum SUBMT_INFO_STATUS { SIS_NULL, SIS_ADDED, SIS_CHANGED, SIS_DELETED }; - - -class CSubmountInfo : public CObject -{ - SUBMT_INFO_STATUS m_Status; - - CString m_strShareName; - CString m_strPathName; - -public: - CSubmountInfo(); - CSubmountInfo(const CString& strShareName, const CString& strPathName, SUBMT_INFO_STATUS status = SIS_NULL); - CSubmountInfo(const CSubmountInfo& info); - ~CSubmountInfo(); - - CString GetShareName() const { return m_strShareName; } - CString GetPathName() const { return m_strPathName; } - SUBMT_INFO_STATUS GetStatus() const { return m_Status; } - - void SetShareName(const CString& strShareName) { m_strShareName = strShareName; } - void SetPathName(const CString& strPathName) { m_strPathName = strPathName; } - void SetStatus(SUBMT_INFO_STATUS status) { m_Status = status; } -}; - -typedef CArray SUBMT_INFO_ARRAY; - -#endif - diff --git a/src/WINNT/client_exp/submounts_dlg.cpp b/src/WINNT/client_exp/submounts_dlg.cpp deleted file mode 100644 index 055cbf3bc..000000000 --- a/src/WINNT/client_exp/submounts_dlg.cpp +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "submounts_dlg.h" -#include "add_submount_dlg.h" -#include "msgs.h" -#include "submount_info.h" -#include "hourglass.h" -#include - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -#define PCCHAR(str) ((char *)(const char *)(str)) - - -///////////////////////////////////////////////////////////////////////////// -// CSubmountsDlg property page - -IMPLEMENT_DYNCREATE(CSubmountsDlg, CDialog) - -static CSubmountInfo *ReadSubmtInfo(const CString& strShareName) -{ - HOURGLASS hourglass; - - CSubmountInfo *pInfo = 0; - - DWORD len; - - char pathName[1024]; - - HKEY hkSubmounts; - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ, - NULL, - &hkSubmounts, - NULL ); - - DWORD dwType; - DWORD status; - len = sizeof(pathName); - status = RegQueryValueEx( hkSubmounts, (LPCSTR)PCCHAR(strShareName), 0, - &dwType, (LPBYTE)pathName, &len); - RegCloseKey( hkSubmounts ); - - if (status || len == 0) - return pInfo; - - pInfo = new CSubmountInfo(); - pInfo->SetShareName(strShareName); - pInfo->SetPathName(pathName); - - return pInfo; -} - -CSubmountsDlg::CSubmountsDlg() : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CSubmountsDlg::IDD)); - - //{{AFX_DATA_INIT(CSubmountsDlg) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT - - m_bAddOnlyMode = FALSE; -} - -CSubmountsDlg::~CSubmountsDlg() -{ - for (int i = 0; i < m_ToDo.GetSize(); i++) - delete m_ToDo[i]; - - m_ToDo.RemoveAll(); -} - -void CSubmountsDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CSubmountsDlg) - DDX_Control(pDX, IDC_DELETE, m_Delete); - DDX_Control(pDX, IDC_CHANGE, m_Change); - DDX_Control(pDX, IDC_LIST, m_SubmtList); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CSubmountsDlg, CDialog) - //{{AFX_MSG_MAP(CSubmountsDlg) - ON_BN_CLICKED(IDC_ADD, OnAdd) - ON_BN_CLICKED(IDC_CHANGE, OnChange) - ON_BN_CLICKED(IDC_DELETE, OnDelete) - ON_LBN_SELCHANGE(IDC_LIST, OnSelChangeList) - ON_BN_CLICKED(IDOK, OnOk) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CSubmountsDlg message handlers - -BOOL CSubmountsDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - if (m_bAddOnlyMode) { - TCHAR szRemoteName[MAX_PATH]; - ULONG nBufSize = sizeof(szRemoteName); - - if (WNetGetConnection(m_strAddOnlyPath.Left(2), szRemoteName, &nBufSize) == ERROR_SUCCESS) { - CString strAfsShare(szRemoteName); - int nSlashPos = strAfsShare.ReverseFind('\\'); - if (nSlashPos > -1) { - strAfsShare = strAfsShare.Mid(nSlashPos + 1); - - // Get the submount info for this share name - CSubmountInfo *pInfo = ReadSubmtInfo(strAfsShare); - CString strSharePath; - if (pInfo != 0) { - ASSERT_VALID(pInfo); - strSharePath = pInfo->GetPathName(); - } - - m_strAddOnlyPath = strSharePath + m_strAddOnlyPath.Mid(2); - } - } - - OnAdd(); - OnOk(); - - return TRUE; - } - - if (!FillSubmtList()) { -// ShowMessageBox(IDS_GET_CELL_LIST_ERROR); -// EndDialog(0); -// return TRUE; - } - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -BOOL CSubmountsDlg::FillSubmtList() -{ - HOURGLASS hourglass; - - HKEY hkSubmounts; - DWORD dwType; - DWORD dwIndex; - DWORD dwSubmounts; - - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_READ|KEY_WRITE|KEY_QUERY_VALUE, - NULL, - &hkSubmounts, - NULL ); - - RegQueryInfoKey( hkSubmounts, - NULL, /* lpClass */ - NULL, /* lpcClass */ - NULL, /* lpReserved */ - NULL, /* lpcSubKeys */ - NULL, /* lpcMaxSubKeyLen */ - NULL, /* lpcMaxClassLen */ - &dwSubmounts, /* lpcValues */ - NULL, /* lpcMaxValueNameLen */ - NULL, /* lpcMaxValueLen */ - NULL, /* lpcbSecurityDescriptor */ - NULL /* lpftLastWriteTime */ - ); - - - for ( dwIndex = 0; dwIndex < dwSubmounts; dwIndex ++ ) { - char submountName[256]; - DWORD submountNameLen = sizeof(submountName); - - RegEnumValue( hkSubmounts, dwIndex, submountName, &submountNameLen, NULL, - &dwType, NULL, NULL); - - m_SubmtList.AddString(submountName); - } - - RegCloseKey( hkSubmounts ); - - return TRUE; -} - -void CSubmountsDlg::OnDelete() -{ - HOURGLASS hourglass; - - int nIndex = m_SubmtList.GetCurSel(); - ASSERT(nIndex >= 0); - - CString strSubmt; - CString strShareName; - m_SubmtList.GetText(nIndex, strSubmt); - - ASSERT(!strSubmt.IsEmpty()); - - strShareName = strSubmt.SpanExcluding("="); - - if (ShowMessageBox(IDS_REALLY_DELETE_SUBMT, MB_YESNO | MB_ICONQUESTION, IDS_REALLY_DELETE_SUBMT, strShareName) != IDYES) - return; - - m_SubmtList.DeleteString(nIndex); - - if (m_SubmtList.GetCount() == 0) { - m_Delete.EnableWindow(FALSE); - m_Change.EnableWindow(FALSE); - } - - CSubmountInfo *pInfo = new CSubmountInfo(); - pInfo->SetShareName(strShareName); - pInfo->SetStatus(SIS_DELETED); - AddWork(pInfo); -} - -void CSubmountsDlg::OnSelChangeList() -{ - m_Delete.EnableWindow(TRUE); - m_Change.EnableWindow(TRUE); -} - -static BOOL AddSubmt(CSubmountInfo *pInfo) -{ - HOURGLASS hourglass; - - HKEY hkSubmounts; - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hkSubmounts, - NULL ); - - DWORD status = RegSetValueEx( hkSubmounts, PCCHAR(pInfo->GetShareName()), 0, REG_SZ, - (const BYTE *)PCCHAR(pInfo->GetPathName()), strlen(PCCHAR(pInfo->GetPathName())) + 1); - - RegCloseKey(hkSubmounts); - return (status == ERROR_SUCCESS); -} - -static BOOL DeleteSubmt(CSubmountInfo *pInfo) -{ - HOURGLASS hourglass; - - HKEY hkSubmounts; - RegCreateKeyEx( HKEY_LOCAL_MACHINE, - AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts", - 0, - "AFS", - REG_OPTION_NON_VOLATILE, - KEY_WRITE, - NULL, - &hkSubmounts, - NULL ); - - DWORD status = RegDeleteValue( hkSubmounts, PCCHAR(pInfo->GetShareName())); - - RegCloseKey(hkSubmounts); - return (status == ERROR_SUCCESS); -} - -void CSubmountsDlg::OnAdd() -{ - CAddSubmtDlg dlg; - - if (m_bAddOnlyMode) { - CSubmountInfo info("", m_strAddOnlyPath, SIS_ADDED); - dlg.SetSubmtInfo(&info); - } - - dlg.DoModal(); - - CSubmountInfo *pInfo = dlg.GetSubmtInfo(); - if (!pInfo) - return; - - m_SubmtList.AddString(pInfo->GetShareName() + "=" + pInfo->GetPathName()); - AddWork(pInfo); -} - -void CSubmountsDlg::OnChange() -{ - CAddSubmtDlg dlg; - - HOURGLASS hourglass; - - dlg.SetAddMode(FALSE); - - int nIndex = m_SubmtList.GetCurSel(); - ASSERT(nIndex >= 0); - - CString strSubmt; - CString strShareName; - m_SubmtList.GetText(nIndex, strSubmt); - - ASSERT(!strSubmt.IsEmpty()); - - strShareName = strSubmt.SpanExcluding("="); - - CSubmountInfo *pInfo = FindWork(strShareName); - if (pInfo != 0) - // Make a copy we can free below - pInfo = new CSubmountInfo(*pInfo); - else - pInfo = ReadSubmtInfo(strShareName); - - if (!pInfo) { - ShowMessageBox(IDS_GET_SUBMT_INFO_ERROR, MB_ICONEXCLAMATION, IDS_GET_SUBMT_INFO_ERROR, strShareName); - return; - } - - dlg.SetSubmtInfo(pInfo); - - delete pInfo; - - if (dlg.DoModal() != IDOK) - return; - - pInfo = dlg.GetSubmtInfo(); - - m_SubmtList.DeleteString(nIndex); - m_SubmtList.InsertString(nIndex, - pInfo->GetShareName() + "=" + pInfo->GetPathName()); - - AddWork(pInfo); -} - -void CSubmountsDlg::AddWork(CSubmountInfo *pInfo) -{ - ASSERT_VALID(pInfo); - - HOURGLASS hourglass; - - BOOL bAdd = TRUE; - - for (int i = 0; i < m_ToDo.GetSize(); i++) { - if (m_ToDo[i]->GetShareName() == pInfo->GetShareName()) { - if ((pInfo->GetStatus() == SIS_DELETED) && (m_ToDo[i]->GetStatus() == SIS_ADDED)) - bAdd = FALSE; - delete m_ToDo[i]; - m_ToDo.RemoveAt(i); - break; - } - } - - if (bAdd) - m_ToDo.Add(pInfo); -} - -BOOL CSubmountsDlg::FixSubmts() -{ - for (int i = 0; i < m_ToDo.GetSize(); i++) { - SUBMT_INFO_STATUS status = m_ToDo[i]->GetStatus(); - if ((status == SIS_ADDED) || (status == SIS_CHANGED)) - if (!AddSubmt(m_ToDo[i])) - return FALSE; - if (status == SIS_DELETED) - if (!DeleteSubmt(m_ToDo[i])) - return FALSE; - } - - return TRUE; -} - -CSubmountInfo *CSubmountsDlg::FindWork(const CString& strShareName) -{ - for (int i = 0; i < m_ToDo.GetSize(); i++) - if (m_ToDo[i]->GetShareName() == strShareName) - return m_ToDo[i]; - - return 0; -} - -void CSubmountsDlg::WinHelp(DWORD dwData, UINT nCmd) -{ - CDialog::WinHelp(dwData, nCmd); -} - -void CSubmountsDlg::OnOk() -{ - if (!FixSubmts()) - ShowMessageBox(IDS_SUBMT_SAVE_FAILED); - - CDialog::OnOK(); -} - -void CSubmountsDlg::SetAddOnlyMode(const CString& strAddOnlyPath) -{ - m_bAddOnlyMode = TRUE; - m_strAddOnlyPath = strAddOnlyPath; -} - diff --git a/src/WINNT/client_exp/submounts_dlg.h b/src/WINNT/client_exp/submounts_dlg.h deleted file mode 100644 index f690a9463..000000000 --- a/src/WINNT/client_exp/submounts_dlg.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _SUBMOUNTSDLG_H_ -#define _SUBMOUNTSDLG_H_ - -#include "resource.h" - -#include "submount_info.h" - -///////////////////////////////////////////////////////////////////////////// -// CSubmountsDlg dialog - -class CSubmountsDlg : public CDialog -{ - DECLARE_DYNCREATE(CSubmountsDlg) - - BOOL m_bAddOnlyMode; - CString m_strAddOnlyPath; - - SUBMT_INFO_ARRAY m_ToDo; - - BOOL FillSubmtList(); - BOOL FixSubmts(); - void AddWork(CSubmountInfo *pInfo); - CSubmountInfo *FindWork(const CString& strShareName); - -// Construction -public: - CSubmountsDlg(); - ~CSubmountsDlg(); - - void SetAddOnlyMode(const CString& strAddOnlyPath); - -// Dialog Data - //{{AFX_DATA(CSubmountsDlg) - enum { IDD = IDD_SUBMTINFO }; - CButton m_Delete; - CButton m_Change; - CListBox m_SubmtList; - //}}AFX_DATA - - -// Overrides - // ClassWizard generate virtual function overrides - //{{AFX_VIRTUAL(CSubmountsDlg) - public: - virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT); - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - // Generated message map functions - //{{AFX_MSG(CSubmountsDlg) - afx_msg void OnAdd(); - afx_msg void OnChange(); - virtual BOOL OnInitDialog(); - afx_msg void OnDelete(); - afx_msg void OnSelChangeList(); - afx_msg void OnOk(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() - -}; - -#endif // _SUBMOUNTSDLG_H_ - diff --git a/src/WINNT/client_exp/unlog_dlg.cpp b/src/WINNT/client_exp/unlog_dlg.cpp deleted file mode 100644 index 042eeffb5..000000000 --- a/src/WINNT/client_exp/unlog_dlg.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "unlog_dlg.h" - -extern "C" { -#include -#include -} - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CUnlogDlg dialog - -CUnlogDlg::CUnlogDlg(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CUnlogDlg::IDD), pParent); - - //{{AFX_DATA_INIT(CUnlogDlg) - m_strCellName = _T(""); - //}}AFX_DATA_INIT -} - -void CUnlogDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CUnlogDlg) - DDX_Control(pDX, IDOK, m_OK); - DDX_Text(pDX, IDC_CELL_NAME, m_strCellName); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CUnlogDlg, CDialog) - //{{AFX_MSG_MAP(CUnlogDlg) - ON_EN_CHANGE(IDC_CELL_NAME, OnChangeCellName) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CUnlogDlg message handlers - -BOOL CUnlogDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - if (m_strCellName.IsEmpty()) { - char defaultCell[256]; - long code = cm_GetRootCellName(defaultCell); - if (code < 0) - AfxMessageBox("Error determining root cell name."); - else - m_strCellName = defaultCell; - } - - UpdateData(FALSE); - - return TRUE; // return TRUE unless you set the focus to a control -} - -int kl_Unlog(const CString& strCellName) -{ - struct ktc_principal server; - int code; - static char xreason[100]; - - if (strCellName.IsEmpty()) - code = ktc_ForgetAllTokens(); - else { - strcpy(server.cell, strCellName); - server.instance[0] = '\0'; - strcpy(server.name, "afs"); - code = ktc_ForgetToken(&server); - } - - if (code == KTC_NOCM) - AfxMessageBox("AFS service may not have started"); - else if (code) { - sprintf(xreason, "Unexpected error, code %d", code); - AfxMessageBox(xreason); - } - - return code; -} - -void CUnlogDlg::OnChangeCellName() -{ - UpdateData(); - - m_OK.EnableWindow(!m_strCellName.IsEmpty()); -} - -void CUnlogDlg::OnOK() -{ - if (kl_Unlog(m_strCellName)) - return; - - CDialog::OnOK(); -} - -void CUnlogDlg::OnHelp() -{ - ShowHelp(m_hWnd, DISCARD_TOKENS_HELP_ID); -} - diff --git a/src/WINNT/client_exp/unlog_dlg.h b/src/WINNT/client_exp/unlog_dlg.h deleted file mode 100644 index 246572215..000000000 --- a/src/WINNT/client_exp/unlog_dlg.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -// CUnlogDlg dialog - -class CUnlogDlg : public CDialog -{ -// Construction -public: - CUnlogDlg(CWnd* pParent = NULL); // standard constructor - - void SetCellName(const CString& strCellName) { m_strCellName = strCellName; } - -// Dialog Data - //{{AFX_DATA(CUnlogDlg) - enum { IDD = IDD_UNLOG_DIALOG }; - CButton m_OK; - CString m_strCellName; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CUnlogDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - // Generated message map functions - //{{AFX_MSG(CUnlogDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnChangeCellName(); - virtual void OnOK(); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/volume_inf.h b/src/WINNT/client_exp/volume_inf.h deleted file mode 100644 index 301fe9717..000000000 --- a/src/WINNT/client_exp/volume_inf.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -#ifndef _VOLUME_INF_H_ -#define _VOLUME_INF_H_ - -class CVolInfo -{ -public: - CString m_strFilePath; - CString m_strFileName; - CString m_strName; - LONG m_nID; - LONG m_nQuota; - LONG m_nNewQuota; - LONG m_nUsed; - LONG m_nPartSize; - LONG m_nPartFree; - int m_nDup; - CString m_strErrorMsg; -}; - - -#endif // _VOLUME_INF_H_ - diff --git a/src/WINNT/client_exp/volume_info.h b/src/WINNT/client_exp/volume_info.h deleted file mode 100644 index 27f8258a1..000000000 --- a/src/WINNT/client_exp/volume_info.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -class CVolInfo; - - -class CVolumeInfo : public CDialog -{ - CStringArray m_Files; - CVolInfo *m_pVolInfo; - - int GetCurVolInfoIndex(); - - void ShowInfo(); - - int m_nCurIndex; - -// Construction -public: - CVolumeInfo(CWnd* pParent = NULL); // standard constructor - ~CVolumeInfo(); - - void SetFiles(const CStringArray& files); - -// Dialog Data - //{{AFX_DATA(CVolumeInfo) - enum { IDD = IDD_VOLUME_INFO }; - CSpinButtonCtrl m_QuotaSpin; - CButton m_Ok; - CButton m_ShowPartInfo; - CListBox m_List; - long m_nNewQuota; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CVolumeInfo) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(CVolumeInfo) - virtual BOOL OnInitDialog(); - afx_msg void OnSelChangeList(); - afx_msg void OnPartitionInfo(); - afx_msg void OnChangeNewQuota(); - virtual void OnOK(); - afx_msg void OnDeltaPosQuotaSpin(NMHDR* pNMHDR, LRESULT* pResult); - afx_msg void OnHelp(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; diff --git a/src/WINNT/client_exp/volumeinfo.cpp b/src/WINNT/client_exp/volumeinfo.cpp deleted file mode 100644 index b2b7e4f58..000000000 --- a/src/WINNT/client_exp/volumeinfo.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -extern "C" { -#include -#include -} - -#include "stdafx.h" -#include "afs_shl_ext.h" -#include "volume_info.h" -#include "partition_info_dlg.h" -#include "volume_inf.h" -#include "gui2fs.h" -#include -#include "msgs.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CVolumeInfo dialog - - -CVolumeInfo::CVolumeInfo(CWnd* pParent /*=NULL*/) - : CDialog() -{ - InitModalIndirect (TaLocale_GetDialogResource (CVolumeInfo::IDD), pParent); - - //{{AFX_DATA_INIT(CVolumeInfo) - m_nNewQuota = 0; - //}}AFX_DATA_INIT - - m_pVolInfo = 0; - m_nCurIndex = -1; -} - -CVolumeInfo::~CVolumeInfo() -{ - if (m_pVolInfo != 0) - delete [] m_pVolInfo; -} - -void CVolumeInfo::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CVolumeInfo) - DDX_Control(pDX, IDC_QUOTA_SPIN, m_QuotaSpin); - DDX_Control(pDX, IDOK, m_Ok); - DDX_Control(pDX, IDC_PARTITION_INFO, m_ShowPartInfo); - DDX_Control(pDX, IDC_LIST, m_List); - DDX_Text(pDX, IDC_NEW_QUOTA, m_nNewQuota); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CVolumeInfo, CDialog) - //{{AFX_MSG_MAP(CVolumeInfo) - ON_LBN_SELCHANGE(IDC_LIST, OnSelChangeList) - ON_BN_CLICKED(IDC_PARTITION_INFO, OnPartitionInfo) - ON_EN_CHANGE(IDC_NEW_QUOTA, OnChangeNewQuota) - ON_NOTIFY(UDN_DELTAPOS, IDC_QUOTA_SPIN, OnDeltaPosQuotaSpin) - ON_BN_CLICKED(IDHELP, OnHelp) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CVolumeInfo message handlers - -BOOL CVolumeInfo::OnInitDialog() -{ - ASSERT(m_Files.GetSize() > 0); - - CDialog::OnInitDialog(); - - int tabs[] = { 79, 164, 214, 260, 301 }; - - m_List.SetTabStops(sizeof(tabs) / sizeof(int), tabs); - - m_pVolInfo = new CVolInfo[m_Files.GetSize()]; - - for (int i = 0; i < m_Files.GetSize(); i++) { - GetVolumeInfo(m_Files[i], m_pVolInfo[i]); - // Check if this is a duplicate entry (same volume as earlier entry) - for (int j = 0; j < i; j++) { - if (m_pVolInfo[j].m_nID == m_pVolInfo[i].m_nID) - m_pVolInfo[i].m_nDup = j; - break; - } - } - - ShowInfo(); - - m_QuotaSpin.SetRange(UD_MINVAL, UD_MAXVAL); - m_QuotaSpin.SetPos(0); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -int CVolumeInfo::GetCurVolInfoIndex() -{ - int nListIndex = m_List.GetCurSel(); - ASSERT(nListIndex >= 0); - - int nIndex = m_List.GetItemData(nListIndex); - ASSERT(nIndex >= 0); - - if (m_pVolInfo[nIndex].m_nDup != -1) - return m_pVolInfo[nIndex].m_nDup; - - return nIndex; -} - -void CVolumeInfo::OnSelChangeList() -{ - m_nCurIndex = GetCurVolInfoIndex(); - if (m_nCurIndex < 0) - return; - - m_nNewQuota = m_pVolInfo[m_nCurIndex].m_nNewQuota; - - m_ShowPartInfo.EnableWindow(TRUE); - CWnd *pNewQuota = GetDlgItem(IDC_NEW_QUOTA); - pNewQuota->EnableWindow(TRUE); - - m_QuotaSpin.EnableWindow(TRUE); - m_QuotaSpin.SetPos(0); - - UpdateData(FALSE); -} - -void CVolumeInfo::OnPartitionInfo() -{ - CPartitionInfoDlg dlg; - - ASSERT(m_nCurIndex >= 0); - - dlg.SetValues(m_pVolInfo[m_nCurIndex].m_nPartSize, m_pVolInfo[m_nCurIndex].m_nPartFree); - - dlg.DoModal(); -} - -void CVolumeInfo::SetFiles(const CStringArray& files) -{ - m_Files.RemoveAll(); - - m_Files.Copy(files); -} - -void CVolumeInfo::OnChangeNewQuota() -{ - if (m_List.m_hWnd == 0) - return; - - CString strQuota; - GetDlgItem(IDC_NEW_QUOTA)->GetWindowText(strQuota); - - if (strQuota.IsEmpty()) - return; - - if (!UpdateData(TRUE)) - return; - - ASSERT(m_nCurIndex >= 0); - - m_pVolInfo[m_nCurIndex].m_nNewQuota = m_nNewQuota; - - if (m_pVolInfo[m_nCurIndex].m_nNewQuota != m_pVolInfo[m_nCurIndex].m_nQuota) - m_Ok.EnableWindow(TRUE); - - ShowInfo(); -} - -void CVolumeInfo::OnOK() -{ - for (int i = 0; i < m_Files.GetSize(); i++) { - if ((m_pVolInfo[i].m_nDup == -1) && (m_pVolInfo[i].m_nQuota != m_pVolInfo[i].m_nNewQuota)) { -// CString strQuota; -// strQuota.Format("= %ld", m_pVolInfo[i].m_nNewQuota); -// AfxMessageBox("Setting quota for volume: " + m_pVolInfo[i].m_strName + strQuota); - SetVolInfo(m_pVolInfo[i]); - } - } - - CDialog::OnOK(); -} - -void CVolumeInfo::OnDeltaPosQuotaSpin(NMHDR* pNMHDR, LRESULT* pResult) -{ - NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; - - LONG nNewQuota = m_nNewQuota + pNMUpDown->iDelta * 1024; - if (nNewQuota < 0) - return; - - m_nNewQuota = nNewQuota; - - UpdateData(FALSE); - - OnChangeNewQuota(); - - *pResult = 0; -} - -void CVolumeInfo::ShowInfo() -{ - m_List.ResetContent(); - - for (int i = 0; i < m_Files.GetSize(); i++) { - - CString strEntry; - if (m_pVolInfo[i].m_strErrorMsg.GetLength() > 0) - strEntry = m_pVolInfo[i].m_strFileName + "\t(Error: " + m_pVolInfo[i].m_strErrorMsg + ")"; - else { - - LONG nQuota; - if (m_pVolInfo[i].m_nDup == -1) - nQuota = m_pVolInfo[i].m_nNewQuota; - else - nQuota = m_pVolInfo[m_pVolInfo[i].m_nDup].m_nNewQuota; - - if (nQuota != 0) { - LONG nPercentUsed = (m_pVolInfo[i].m_nUsed * 100) / nQuota; - strEntry.Format("%s\t%s\t%ld\t%ldK\t%ldK\t%ld%%", m_pVolInfo[i].m_strFileName, m_pVolInfo[i].m_strName, - m_pVolInfo[i].m_nID, nQuota, m_pVolInfo[i].m_nUsed, nPercentUsed); - } else { - strEntry.Format("%s\t%s\t%ld\tUnlimited\t%ldK", m_pVolInfo[i].m_strFileName, m_pVolInfo[i].m_strName, - m_pVolInfo[i].m_nID, m_pVolInfo[i].m_nUsed); - } - } - - int nListIndex = m_List.AddString(strEntry); - ASSERT(nListIndex >= 0); - VERIFY(m_List.SetItemData(nListIndex, i) != LB_ERR); - } -} - -void CVolumeInfo::OnHelp() -{ - ShowHelp(m_hWnd, VOLUME_INFO_HELP_ID); -} - diff --git a/src/WINNT/client_osi/Makefile.djgpp b/src/WINNT/client_osi/Makefile.djgpp deleted file mode 100644 index 863ec504d..000000000 --- a/src/WINNT/client_osi/Makefile.djgpp +++ /dev/null @@ -1,32 +0,0 @@ -# -# Makefile.djgpp -# make information for this directory -# requires gmake -# - -SOURCES = osifd.c osilog.c osiqueue.c osithrd95.c -include ../../config/Makefile.djgpp.common - -# apply changes from common for this directory -# -# no changes for this directory - -# what this directory builds -# -TARGETS = libosi.a -all : $(TARGETS) -install : $(DESTLIB)/libosi.a includes - -INCFILES = \ - $(DESTINC)/osi.h \ - $(DESTINC)/osifd.h \ - $(DESTINC)/osilog.h \ - $(DESTINC)/osiqueue.h \ - $(DESTINC)/osisleep.h \ - $(DESTINC)/osiutils.h \ - $(DESTINC)/osithrd95.h - -# hard-wired dependency information -# -libosi.a : $(ALL_OBJS) -includes: $(INCFILES) diff --git a/src/WINNT/client_osi/NTMakefile b/src/WINNT/client_osi/NTMakefile deleted file mode 100644 index 47199b97b..000000000 --- a/src/WINNT/client_osi/NTMakefile +++ /dev/null @@ -1,143 +0,0 @@ -# Copyright 2000, International Business Machines Corporation and others. -# All Rights Reserved. -# -# This software has been released under the terms of the IBM Public -# License. For details, see the LICENSE file in the top-level source -# directory or online at http://www.openafs.org/dl/license10.html -# -RELDIR=WINNT\client_osi -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - -############################################################################ -# Definitions for installing header files - -INCFILEDIR = $(DESTDIR)\include # header file install directory - -INCFILES =\ - $(INCFILEDIR)\dbrpc.h \ - $(INCFILEDIR)\basic.h \ - $(INCFILEDIR)\osidebug.h \ - $(INCFILEDIR)\osiltype.h \ - $(INCFILEDIR)\osistatl.h \ - $(INCFILEDIR)\trylock.h \ - $(INCFILEDIR)\main.h \ - $(INCFILEDIR)\osibasel.h \ - $(INCFILEDIR)\osifd.h \ - $(INCFILEDIR)\osiqueue.h \ - $(INCFILEDIR)\osiutils.h \ - $(INCFILEDIR)\osi.h \ - $(INCFILEDIR)\osidb.h \ - $(INCFILEDIR)\osilog.h \ - $(INCFILEDIR)\osisleep.h \ - $(INCFILEDIR)\perf.h \ -!IFDEF OSIEVENT - $(INCFILEDIR)\osievent.h \ -!ENDIF - $(INCFILEDIR)\osithrdnt.h \ - $(INCFILEDIR)\largeint.h - -$(INCFILEDIR)\dbrpc.h: dbrpc.h - -EXEFILE = $(DESTDIR)\bin\osidebug.exe - -EXEOBJS = \ - osidebug.obj - -EXELIBS = \ - rpcndr.lib rpcrt4.lib rpcns4.lib \ - Ws2_32.lib \ - $(DESTDIR)\lib\libosi.lib - -############################################################################ -# Definitions for building a DLL. - -DLLFILE = $(DESTDIR)\root.client\usr\vice\etc\libosi.dll - -ILIBDIR = $(DESTDIR)\lib - -DLLOBJS =\ - $(OUT)\dbrpc_s.obj \ - $(OUT)\osistatl.obj \ - $(OUT)\osibasel.obj \ - $(OUT)\osisleep.obj \ - $(OUT)\osiqueue.obj \ - $(OUT)\osiltype.obj \ - $(OUT)\osidb.obj \ - $(OUT)\osifd.obj \ - $(OUT)\osilog.obj \ - $(OUT)\osiutils.obj \ - $(OUT)\libosi.res - -DLLLIBS =\ - rpcndr.lib \ - rpcrt4.lib \ - rpcns4.lib -# largeint.lib - -$(DLLFILE): $(DLLOBJS) - $(DLLGUILINK) $(DLLLIBS) -def:libosi.def - $(DLLPREP) - $(COPY) $*.lib $(ILIBDIR) - $(DEL) $*.lib $*.exp - - -############################################################################ -# build osievent.dll -OSIEVENTDLL = $(DESTDIR)\root.client\usr\vice\etc\osievent.dll - -osievent.rc: osievent.mc - mc $*.mc - -$(OUT)\osievent.res: osievent.rc - -$(OUT)\osievent.dll: $(OUT)\osievent.res - link -dll -noentry -out:$*.dll $*.res - -$(OSIEVENTDLL): $(OUT)\osievent.dll - $(COPY) osievent.dll $(DESTDIR)\root.client\usr\vice\etc\. - -############################################################################ -# build osidebug too - -$(OUT)\osidebug.res: osidebug.rc - -$(EXEOBJS) : osidebug.c - -$(EXEFILE) : $(EXEOBJS) - $(EXEGUILINK) $(EXELIBS) - -############################################################################ -# midl on dbrpc.idl - -dbrpc.h dbrpc_c.c dbrpc_s.c: dbrpc.idl - $(MIDL) $(AFSDEV_AUXMIDLFLAGS) -Zp4 -cpp_cmd $(cc) -cpp_opt "-E" /no_robust $** -############################################################################ -# generate versioninfo resources - -$(OUT)\libosi.res: libosi.rc AFS_component_version_number.h - -############################################################################ -# Install target; primary makefile target - -install_headers: $(INCFILES) - -!IFDEF OSIEVENT -install: $(OSIEVENTDLL) install_headers $(DLLFILE) -!ELSE -install: install_headers $(DLLFILE) -!ENDIF - -install_debug: $(OUT)\osidebug.res $(EXEFILE) - -install9x: install - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - $(DEL) dbrpc_s.c dbrpc_c.c dbrpc.h $(DLLFILE) $(INCFILES) $(OSIEVENTDLL) - $(DEL) $(EXEOBJS) $(EXEFILE) $(OUT)\*.res $(OUT)\*.DLL - - -mkdir: diff --git a/src/WINNT/client_osi/NTMakefile-TestOSI b/src/WINNT/client_osi/NTMakefile-TestOSI deleted file mode 100644 index 00025e132..000000000 --- a/src/WINNT/client_osi/NTMakefile-TestOSI +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 1998 Transarc Corporation. All rights reserved. -# - -!INCLUDE ..\..\config\NTMakefile.$(SYS_NAME) -!INCLUDE ..\..\config\NTMakefile.version - - -EXEFILE = $(DESTDIR)\root.client\usr\vice\etc\osidebug.exe - -EXEOBJS = \ - osidebug.obj - -EXELIBS = \ - $(DESTDIR)\lib\libosi.lib - -VCLIBS =\ - $(DESTDIR)\lib\libosi.lib - - -$(EXEFILE) : $(EXEOBJS) - $(EXEGUILINK) $(VCLIBS) - -############################################################################ -# generate versioninfo resources - -osidebug.res: osidebug.rc - -############################################################################ -# Install target; primary makefile target - -install: $(EXEFILE) - -############################################################################ -# Local clean target; augments predefined clean target - -clean:: - $(DEL) osidebug.obj osidebug.exe osidebug.res - - diff --git a/src/WINNT/client_osi/basic.c b/src/WINNT/client_osi/basic.c deleted file mode 100644 index fa3736f18..000000000 --- a/src/WINNT/client_osi/basic.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - - -#include -#include - -#include "windows.h" -#include -#include "main.h" -#include "basic.h" -#include "osi.h" - -#define OSI_MOD1LOOPS 15000 -#define OSI_MOD2LOOPS 10000 - -/* global variables for the test */ -osi_mutex_t main_aMutex; /* mutex controlling access to a */ -long a; /* variable a */ - -osi_rwlock_t main_bRWLock; /* rwlock controlling access to b */ -long b; /* variable b itself */ - -osi_rwlock_t main_doneRWLock; /* lock for done */ -int done; /* count of done dudes */ - -osi_log_t *main_logp; /* global log */ - -/* unlocked stat counters */ -long m1Loops; -long m2Loops; -long s1Loops; -long s2Loops; -long s2Events; - -unsigned long main_Mod1(void *parm) -{ - long i; - for(i=0; i= 2) break; - lock_ReleaseRead(&main_doneRWLock); - - /* check state for consistency */ - lock_ObtainMutex(&main_aMutex); - lock_AssertMutex(&main_aMutex); - Sleep(0); - lock_ObtainRead(&main_bRWLock); - Sleep(0); - osi_assert(a+b == 100); - lock_ReleaseRead(&main_bRWLock); - Sleep(0); - lock_ReleaseMutex(&main_aMutex); - - /* get a read lock here to test people getting stuck on RW lock alone */ - lock_ObtainRead(&main_bRWLock); - Sleep(0); - lock_ReleaseRead(&main_bRWLock); - - s1Loops++; - - osi_Log2(main_logp, "scan1 done %d %d", s1Loops, 2); - } - lock_ReleaseRead(&main_doneRWLock); - lock_ObtainWrite(&main_doneRWLock); - lock_AssertWrite(&main_doneRWLock); - done++; - lock_ReleaseWrite(&main_doneRWLock); - return 0; -} - -unsigned long main_Scan2(unsigned long parm) -{ - while (1) { - osi_Log0(main_logp, "scan2"); - /* check to see if we're done */ - lock_ObtainRead(&main_doneRWLock); - lock_AssertAny(&main_doneRWLock); - if (done >= 2) break; - lock_ReleaseRead(&main_doneRWLock); - - /* check state for consistency without locks */ - if (a+b != 100) s2Events++; - - /* and record that we went around again */ - s2Loops++; - - /* give others a chance */ - Sleep(0); - osi_Log3(main_logp, "scan2 done %d %d %d", s2Loops, 2, 3); - } - lock_ReleaseRead(&main_doneRWLock); - lock_ObtainWrite(&main_doneRWLock); - lock_AssertAny(&main_doneRWLock); - done++; - lock_ReleaseWrite(&main_doneRWLock); - return 0; -} - -main_BasicTest(HANDLE hWnd) -{ - long mod1ID; - long mod2ID; - long scan1ID; - long scan2ID; - HANDLE mod1Handle; - HANDLE mod2Handle; - HANDLE scan1Handle; - HANDLE scan2Handle; - long localDone; - - osi_Init(); - - if (main_logp == NULL) { - main_logp = osi_LogCreate("basic", 0); - osi_LogEnable(main_logp); - osi_SetStatLog(main_logp); - } - - /* create three processes, two modifiers and one scanner. The scanner - * checks that the basic invariants are being maintained, while the - * modifiers modify the global variables, maintaining certain invariants - * by using locks. - * - * The invariant is that global variables a and b total 100. - */ - a = 100; - b = 0; - done = 0; - - lock_InitializeRWLock(&main_doneRWLock, "done lock"); - lock_InitializeRWLock(&main_bRWLock, "b lock"); - lock_InitializeMutex(&main_aMutex, "a mutex"); - - mod1Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Mod1, 0, 0, &mod1ID); - if (mod1Handle == NULL) return -1; - - mod2Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Mod2, 0, 0, &mod2ID); - if (mod2Handle == NULL) return -2; - - scan1Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Scan1, 0, 0, &scan1ID); - if (scan1Handle== NULL) return -2; - - scan2Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Scan2, 0, 0, &scan2ID); - if (scan2Handle== NULL) return -2; - - /* start running check daemon */ - while (1) { - Sleep(1000); - wsprintf(main_screenText[1], "Mod1 iteration %d", m1Loops); - wsprintf(main_screenText[2], "Mod2 iteration %d", m2Loops); - wsprintf(main_screenText[3], "Scan1 iteration %d", s1Loops); - wsprintf(main_screenText[4], "Scan2 iteration %d, %d opportunites seen", - s2Loops, s2Events); - main_ForceDisplay(hWnd); - - /* copy out count of # of dudes finished */ - lock_ObtainRead(&main_doneRWLock); - localDone = done; - lock_ReleaseRead(&main_doneRWLock); - - /* right now, we're waiting for 4 threads */ - if (localDone == 4) break; - } - - wsprintf(main_screenText[0], "Test done."); - main_ForceDisplay(hWnd); - - /* done, release and finalize all locks */ - lock_FinalizeRWLock(&main_doneRWLock); - lock_FinalizeRWLock(&main_bRWLock); - lock_FinalizeMutex(&main_aMutex); - - /* finally clean up thread handles */ - CloseHandle(mod1Handle); - CloseHandle(mod2Handle); - CloseHandle(scan1Handle); - CloseHandle(scan2Handle); - - return 0; -} diff --git a/src/WINNT/client_osi/basic.h b/src/WINNT/client_osi/basic.h deleted file mode 100644 index 6626c4cf7..000000000 --- a/src/WINNT/client_osi/basic.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved - * - * (C) COPYRIGHT IBM CORPORATION 1987, 1988 - * LICENSED MATERIALS - PROPERTY OF IBM - * - * - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef __BASIC_H_ENV_ -#define __BASIC_H_ENV_ 1 - -extern int main_BasicTest(HANDLE); - -#endif /* __BASIC_H_ENV_ */ - diff --git a/src/WINNT/client_osi/dbrpc.idl b/src/WINNT/client_osi/dbrpc.idl deleted file mode 100644 index 7c5295375..000000000 --- a/src/WINNT/client_osi/dbrpc.idl +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -[ -uuid(7E8952D8-1B50-101B-8952-204C4F4F5020), -version(1.0) -] -interface dbrpc -{ - -/* return codes */ -const long OSI_DBRPC_NOENTRY = 1; -const long OSI_DBRPC_EOF = 2; -const long OSI_DBRPC_NOFD = 3; - -/* parameter for string descr */ -const long OSI_DBRPC_STRLEN = 256; /* max bytes string */ - -/* info passed around */ -const long OSI_DBRPC_NUMINTS = 32; /* # of integers */ -const long OSI_DBRPC_NUMSTRS = 8; /* # of strings */ - -/* lock types */ -const long OSI_DBRPC_MUTEXTYPE = 1; /* a mutex */ -const long OSI_DBRPC_RWLOCKTYPE = 2; /* a rwlock */ - -/* getformat region values */ -const long OSI_DBRPC_REGIONSTRING = 0; /* string index */ -const long OSI_DBRPC_REGIONINT = 1; /* index in the integer region */ - -/* error codes */ -const long OSI_DBRPC_OK = 0; -const long OSI_DBRPC_DONE = 1; -const long OSI_DBRPC_BADFD = 2; - -/* format bits */ -const long OSI_DBRPC_SUPRESSIFZERO = 1; /* don't print zeroes */ -const long OSI_DBRPC_HEX = 2; /* print #s in hex */ -const long OSI_DBRPC_SIGNED = 4; /* print as signed # */ - -/* describe the format of a statistics entry */ -typedef struct osi_remFormat { - char label[32]; - long format; -} osi_remFormat_t; - -typedef struct osi_remHyper { - unsigned long LowPart; - unsigned long HighPart; -} osi_remHyper_t; - -typedef char osi_remString_t[OSI_DBRPC_STRLEN]; - -typedef struct osi_remGetInfoParms { - long icount; - long scount; -/* [length_is (icount)] long idata[OSI_DBRPC_NUMINTS]; */ - long idata[OSI_DBRPC_NUMINTS]; - [length_is (scount)] osi_remString_t sdata[OSI_DBRPC_NUMSTRS]; -} osi_remGetInfoParms_t; - -void dbrpc_Ping( - [in] handle_t handle -); - -void dbrpc_Open( - [in] handle_t handle, - [in, string] char *namep, - [out, ref] osi_remHyper_t *fd, - [out, ref] long *code -); - -void dbrpc_GetInfo( - [in] handle_t handle, - [in, ref] osi_remHyper_t *fd, - [out, ref] osi_remGetInfoParms_t *status, - [out, ref] long *code -); - -void dbrpc_Close( - [in] handle_t handle, - [in, ref] osi_remHyper_t *fd, - [out, ref] long *code -); - -void dbrpc_GetFormat( - [in] handle_t handle, - [in, string] char *namep, - [in] long region, /* 0 for string, 1 for integer */ - [in] long index, - [out, ref] osi_remFormat_t *formatp, - [out, ref] long *code -); - -} diff --git a/src/WINNT/client_osi/largeint.h b/src/WINNT/client_osi/largeint.h deleted file mode 100644 index 393b69bcd..000000000 --- a/src/WINNT/client_osi/largeint.h +++ /dev/null @@ -1,257 +0,0 @@ -/*-- - -Module Name: - - largeint.h - -Abstract: - - Include file for sample Large Integer Arithmetic routines. - This file includes all of the prototypes for the routines found in - largeint.lib. For complete descriptions of these functions, see the - largeint.s source file for MIPS, or the divlarge.c and largeint.asm - source files for x86. - -Revision History: - ---*/ - -#ifdef __cplusplus -extern "C" { -#endif - -// -//Large integer arithmetic routines. -// - -// -// Large integer add - 64-bits + 64-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -LargeIntegerAdd ( - LARGE_INTEGER Addend1, - LARGE_INTEGER Addend2 - ); - -// -// Enlarged integer multiply - 32-bits * 32-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -EnlargedIntegerMultiply ( - LONG Multiplicand, - LONG Multiplier - ); - -// -// Unsigned enlarged integer multiply - 32-bits * 32-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -EnlargedUnsignedMultiply ( - ULONG Multiplicand, - ULONG Multiplier - ); - -// -// Enlarged integer divide - 64-bits / 32-bits > 32-bits -// - -ULONG -WINAPI -EnlargedUnsignedDivide ( - IN ULARGE_INTEGER Dividend, - IN ULONG Divisor, - IN PULONG Remainder - ); - -// -// Extended large integer magic divide - 64-bits / 32-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -ExtendedMagicDivide ( - LARGE_INTEGER Dividend, - LARGE_INTEGER MagicDivisor, - CCHAR ShiftCount - ); - -// -// Large Integer divide - 64-bits / 32-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -ExtendedLargeIntegerDivide ( - LARGE_INTEGER Dividend, - ULONG Divisor, - PULONG Remainder - ); - -// -// Large Integer divide - 64-bits / 32-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -LargeIntegerDivide ( - LARGE_INTEGER Dividend, - LARGE_INTEGER Divisor, - PLARGE_INTEGER Remainder - ); - -// -// Extended integer multiply - 32-bits * 64-bits -> 64-bits -// - -LARGE_INTEGER -WINAPI -ExtendedIntegerMultiply ( - LARGE_INTEGER Multiplicand, - LONG Multiplier - ); - -// -// Large integer negation - -(64-bits) -// - -LARGE_INTEGER -WINAPI -LargeIntegerNegate ( - LARGE_INTEGER Subtrahend - ); - -// -// Large integer subtract - 64-bits - 64-bits -> 64-bits. -// - -LARGE_INTEGER -WINAPI -LargeIntegerSubtract ( - LARGE_INTEGER Minuend, - LARGE_INTEGER Subtrahend - ); - -// -// Large integer and - 64-bite & 64-bits -> 64-bits. -// - -#define LargeIntegerAnd(Result, Source, Mask) \ - { \ - Result.HighPart = Source.HighPart & Mask.HighPart; \ - Result.LowPart = Source.LowPart & Mask.LowPart; \ - } - - -// -// Large integer conversion routines. -// - -// -// Convert signed integer to large integer. -// - -LARGE_INTEGER -WINAPI -ConvertLongToLargeInteger ( - LONG SignedInteger - ); - -// -// Convert unsigned integer to large integer. -// - -LARGE_INTEGER -WINAPI -ConvertUlongToLargeInteger ( - ULONG UnsignedInteger - ); - - -// -// Large integer shift routines. -// - -LARGE_INTEGER -WINAPI -LargeIntegerShiftLeft ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ); - -LARGE_INTEGER -WINAPI -LargeIntegerShiftRight ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ); - -LARGE_INTEGER -WINAPI -LargeIntegerArithmeticShift ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ); - -#define LargeIntegerGreaterThan(X,Y) ( \ - (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \ - ((X).HighPart > (Y).HighPart) \ -) - -#define LargeIntegerGreaterThanOrEqualTo(X,Y) ( \ - (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \ - ((X).HighPart > (Y).HighPart) \ -) - -#define LargeIntegerEqualTo(X,Y) ( \ - !(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \ -) - -#define LargeIntegerNotEqualTo(X,Y) ( \ - (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \ -) - -#define LargeIntegerLessThan(X,Y) ( \ - (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \ - ((X).HighPart < (Y).HighPart) \ -) - -#define LargeIntegerLessThanOrEqualTo(X,Y) ( \ - (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \ - ((X).HighPart < (Y).HighPart) \ -) - -#define LargeIntegerGreaterThanZero(X) ( \ - (((X).HighPart == 0) && ((X).LowPart > 0)) || \ - ((X).HighPart > 0 ) \ -) - -#define LargeIntegerGreaterOrEqualToZero(X) ( \ - (X).HighPart >= 0 \ -) - -#define LargeIntegerEqualToZero(X) ( \ - !((X).LowPart | (X).HighPart) \ -) - -#define LargeIntegerNotEqualToZero(X) ( \ - ((X).LowPart | (X).HighPart) \ -) - -#define LargeIntegerLessThanZero(X) ( \ - ((X).HighPart < 0) \ -) - -#define LargeIntegerLessOrEqualToZero(X) ( \ - ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) \ -) - -#ifdef __cplusplus -} -#endif - diff --git a/src/WINNT/client_osi/libosi.def b/src/WINNT/client_osi/libosi.def deleted file mode 100644 index d68cace82..000000000 --- a/src/WINNT/client_osi/libosi.def +++ /dev/null @@ -1,71 +0,0 @@ -LIBRARY libosi - - -CODE EXECUTE SHARED -DATA READ WRITE - -EXPORTS - osi_Init @1 - lock_ObtainRead @2 - lock_ObtainWrite @3 - lock_ReleaseRead @4 - lock_ReleaseWrite @5 - lock_ObtainMutex @6 - lock_ReleaseMutex @7 - lock_TryRead @8 - lock_TryWrite @9 - lock_TryMutex @10 - osi_SleepR @11 - osi_SleepW @12 - osi_SleepM @13 - osi_Sleep @14 - osi_Wakeup @15 - lock_InitializeMutex @16 - lock_InitializeRWLock @17 - lock_FinalizeMutex @18 - lock_FinalizeRWLock @19 - osi_InitDebug @20 - osi_LockTypeSetDefault @21 - osi_Once @22 - osi_TestOnce @23 - osi_EndOnce @24 - osi_QAdd @25 - osi_QRemove @26 - osi_QDAlloc @27 - osi_QDFree @28 - osi_IsPrime @29 - osi_PrimeLessThan @30 - osi_GetBootTime @31 - osi_panic @32 - osi_LogCreate @33 - osi_LogFree @34 - osi_LogAdd @35 - osi_LogEnable @36 - osi_LogDisable @37 - osi_logSizep = osi_logSize @38 DATA - lock_ConvertWToR @39 - osi_RegisterFDType @40 - osi_UnregisterFDType @41 - osi_Time @42 - osi_maxCallsp = osi_maxCalls @43 DATA - lock_GetRWLockState @44 - lock_GetMutexState @45 - osi_UIDCmp @46 - osi_LongToUID @47 - osi_SetStatLog @48 - osi_TWait @49 - osi_TSignal @50 - osi_TBroadcast @51 - osi_TSignalForMLs @52 - osi_SetWatchProc @53 - osi_GetTime @54 - osi_QAddT @55 - osi_QAddH @56 - osi_LogReset @57 - osi_LogPrint @58 - osi_LogSaveString @59 - osi_InitPanic @60 - osi_InitTraceOption @61 - osi_LogEvent0 @62 - osi_LogEvent @63 - osi_HexifyString @64 diff --git a/src/WINNT/client_osi/libosi.hpj b/src/WINNT/client_osi/libosi.hpj deleted file mode 100644 index bed2a42fc..000000000 --- a/src/WINNT/client_osi/libosi.hpj +++ /dev/null @@ -1,6 +0,0 @@ -[OPTIONS] -COMPRESS=TRUE -TITLE=LibOSI Help - -[FILES] -libosi.rtf diff --git a/src/WINNT/client_osi/libosi.rc b/src/WINNT/client_osi/libosi.rc deleted file mode 100644 index e2f0154d1..000000000 --- a/src/WINNT/client_osi/libosi.rc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Define VERSIONINFO resource */ - -#define AFS_VERINFO_FILE_DESCRIPTION "AFS OSI DLL" -#define AFS_VERINFO_DLL -#define AFS_VERINFO_NAME "libosi" -#define AFS_VERINFO_FILENAME "libosi.dll" - -#include "AFS_component_version_number.h" -#include "..\..\config\NTVersioninfo.rc" diff --git a/src/WINNT/client_osi/libosi.rtf b/src/WINNT/client_osi/libosi.rtf deleted file mode 100644 index d95875f02..000000000 --- a/src/WINNT/client_osi/libosi.rtf +++ /dev/null @@ -1,1059 +0,0 @@ -{\rtf1\ansi - -{\fonttbl -\f0\froman Times New Roman; -\f1\fdecor Courier New;} - -{\colortbl -\red0\green0\blue0; -\red255\green0\blue0; -\red0\green0\blue255; -\red255\green255\blue0;} - -\deff0 - -\sb200 - -#{\footnote contents} -${\footnote Contents} -\fs40 -{\uldb Introduction}{\v intro} -\par -{\uldb Initialization}{\v init} -\par -{\uldb Mutexes}{\v mutexes} -\par -{\uldb ReadWrite Locks}{\v rwlocks} -\par -{\uldb Condition Variables}{\v conds} -\par -{\uldb Locking Hierarchies}{\v hierarchies} -\par -{\uldb Debugging}{\v debug} -\par -\fs25 -\page - -#{\footnote intro} -${\footnote Introduction} -+{\footnote intro:01} - -The OSI package provides very efficient locking and synchronization -primitives for the Win32 environment. -\par - -These primitives include both {\uldb mutexes}{\v mutexes}, representing -resources that must always be allocated exclusively to one entity -(thread) at a time, as well as {\uldb read/write locks}{\v rwlocks}, -representing resources that may have N readers or one writer at any -given time. -\par - -In addition to the basic primitives sketched above, the OSI package -provides a {\uldb condition variable}{\v conds} mechanism that allows a -thread holding a mutex or a read/write lock to wait for an interesting -event to occur. These condition variable operations allow a thread -holding a resource to atomically suspend itself (sleep) and -simultaneously release the lock or mutex it holds on the resource. The -atomicity of these operations is critical to avoiding race conditions. -A function is also provided to wakeup a thread waiting at a condition -variable. -\par - -Some support is also provided for aiding programs in initializing -themselves safely in a multi-threaded environment. -\par - -Finally, an optional remote debugging and statistics gathering interface -is provided. If desired, the locks and mutexes provided by the OSI -package can keep track of statistics on lock contention, and these -statistics are available to remote users to examine, using the osidebug -program. -\par - -\page - -#{\footnote init} -${\footnote Initialization} -+{\footnote init:01} - -There are two sets of routines describe herein, one used for -initializing the -OSI package itself, and one for initializing your application. -\par -The function {\uldb osi_Init}{\vosiInit} must be called before any other -functions in the OSI library, except for the other initialization -functions described in this section (osi_Init, osi_InitDebug, osi_Once -and osi_TestOnce). -\par - -The function {\uldb osi_InitDebug} must be called before remote -debugging information and statistic can be retrieved via RPC by the -osidebug program. This function need not be ever called, however, if -you do not need to be able to retrieve locking information from a -separate process. -\par - -The function {\uldb osi_Once}{\v osiOnce} can be used by the application -programmer to ensure that the application program executes its -initialization code exactly once. This function takes one parameter, -intended to be allocated as a static variable, which will be initialized -by the system at load time to zero. The {\uldb osi_Once}{\v osiOnce} -function is called with a pointer to this variable, and returns TRUE if -the program should execute its initialization code now, or FALSE if -osi_Once has already been executed once in this application already. -\par - -The function {\uldb osi_EndOnce}{\v osiEndOnce} must be called before -other calls to {\uldb osi_Once}{\v osiOnce} will complete; the section -of code bounded by osi_Once and osi_EndOnce is executed atomically with -respect to other calls to osi_Once. -\par - -The function {\uldb osi_TestOnce}{\v osiTestOnce} may be used as a hint -to see if {\uldb osi_Once}{\v osiOnce} might need to be called. It -returns the same values as osi_Once, but doesn't change the state of the -state variable to indicate that {\uldb osi_Once}{\v osiOnce} has been -called. Of course, its result can only be used as a hint, but if {\uldb -osi_TestOnce}{\v osiTestOnce} returns false, the caller knows that the -initialization work for this code has already run. If it returns true, -the programmer may still need to call osi_Once, or it may be called by -some other thread first. -\par - -\page - -#{\footnote osiInit} -${\footnote osi_Init} -K{\footnote osi_Init} -+{\footnote init:02} - -\fs40 -void \cf2 osi_Init\cf0 (void) -\fs25 -\par - -This function initializes the OSI library. It must be called before any -other functions in the OSI library except the other initialization -calls: osi_InitDebug, osi_Once, osi_EndOnce and osi_TestOnce. -\par - -Failure to call this function will result in traps in your application -program. -\par - -\page - -#{\footnote osiInitDebug} -${\footnote osi_InitDebug} -K{\footnote osi_InitDebug} -+{\footnote init:03} - -\fs40 -long \cf2 osi_InitDebug \cf0 (char *rpcName) -\fs25 -\par - -This function initializes the RDC debugging interface in your -application. The parameter rpcName is an RPC NSI name into which your -RPC binding information will be exported. It must start with the string -"/.:/" For example, a database server for your payroll database might -export its binding information into "/.:/payroll" -\par - -The function returns 0 if it succeeds, otherwise it returns an RPC error -code. -\par - -\page - -#{\footnote osiOnce} -${\footnote osi_Once} -K{\footnote osi_Once} -+{\footnote init:04} - -\fs40 -int \cf2 osi_Once \cf0 (osi_once_t *parm) -\fs25 -\par - -This function can be used by application programs in a multi-threaded -environment to ensure that they execute their initialization code -exactly once, no matter how many threads try to execute the code. -\par -\f1 -int foo_Init(void) \line -\{ \line - static osi_once_t once; \line - if (osi_Once(&once)) \{ \line - YourInitializationHere = 1; \line - osi_EndOnce(&once); \line - \} \line - return SUCCESS; \line -\} \line -\f0 -\par - -In the above function, the assignment into YourInitializationHere will -occur exactly once, no matter how many times foo_Init is called, in any -number of threads, all calling foo_Init concurrently. - -\page - -#{\footnote osiEndOnce} -${\footnote osi_EndOnce} -K{\footnote osi_EndOnce} -+{\footnote init:05} - -\fs40 -void \cf2 osi_EndOnce \cf0 (osi_once_t *parm) -\fs25 -\par - -This function ends the initialization block started by osi_Once. This -function must be called exactly once for each call to osi_Once that -returns true. -\par -An example of the use of this function can be found in the description -of {\uldb osi_Once}{\v osiOnce}. - -\page - -#{\footnote osiTestOnce} -${\footnote osi_TestOnce} -K{\footnote osi_TestOnce} -+{\footnote init:06} - -\fs40 -int \cf2 osi_TestOnce \cf0 (osi_once_t *parm) -\fs25 -\par - -This function returns true if osi_Once would have returned true, and -false otherwise. -\par - -Unlike osi_Once, this function does not mark the initialization block -described by *parm as initialized; this is only an advisory function. -For this reason, the function {\uldb osi_EndOnce}{\v osiEndOnce} should -not be called if osi_TestOnce returns true. - -\page - -#{\footnote mutexes} -${\footnote Mutual Exclusion Objects} -+{\footnote mutexes:01} - -Mutual exclusion objects are used to prevent two threads from accesing -the same object at the same time. Typically, some collection of data -is associated with an object of osi_mutex_t, and any thread, before -accessing the object, first obtains the mutex by calling {\uldb -lock_ObtainMutex}{\v lockObtainMutex}. When it is done processing the -object, the thread calls {\uldb lock_ReleaseMutex}{\v lockReleaseMutex}. -\par - -Typically, a thread will release a mutex once for each time that it -obtains the mutex, using {\uldb osi_SleepM}{\v osiSleepM} or -{\uldb lock_ReleaseMutex}{\v lockReleaseMutex}. -\par - -These mutex objects are not recursive mutexes: a thread may not -re-obtain the mutex while still holding it. -\par - -Before using a mutex, the mutex \cf1 must \cf0 be initialized by calling -{\uldb lock_InitializeMutex}{\v lockInitializeMutex}. -\par - -If the mutex is allocated from dynamically allocated memory (rather than -being statically allocated), then the mutex must be finalized before -the memory is freed. The function -{\uldb lock_FinalizeMutex}{\v lockFinalizeMutex} should be used for this -purpose. -\par - -An object of type osi_mutex_t uses about 8 bytes of storage. -\par - -\page - -#{\footnote lockInitializeMutex} -${\footnote lock_InitializeMutex} -K{\footnote lock_InitializeMutex} -+{\footnote mutexes:02} - -\fs40 -void \cf2 lock_InitializeMutex \cf0 (osi_mutex_t *mutex) -\fs25 -\par - -This function is called with a pointer to a mutex, to initialize the storage -so that the mutex can be obtained and released by this or other threads. -This function should only be called at an initialization point where the -programmer knows that no other threads are accessing the mutex variable. -\par - -\page - -#{\footnote lockObtainMutex} -${\footnote lock_ObtainMutex} -K{\footnote lock_ObtainMutex} -+{\footnote mutexes:03} - -\fs40 -void \cf2 lock_ObtainMutex \cf0 (osi_mutex_t *mutex) -\fs25 -\par - -This function is called with a pointer to a mutex, -and waits until no other thread is using the mutex. It then -obtains the mutex for the calling thread and returns. -\par - -Mutexes are not recursively obtainable by a thread: if a thread tries -to obtain a mutex a second time, it will deadlock (wait forever). -\par - -The mutex can be released {\uldb lock_ReleaseMutex}{\v lockReleaseMutex} -or by {\uldb osi_SleepM}{\v osiSleepM}. -\par - -\page - -#{\footnote lockReleaseMutex} -${\footnote lock_ReleaseMutex} -K{\footnote lock_ReleaseMutex} -+{\footnote mutexes:04} - -\fs40 -void \cf2 lock_ReleaseMutex \cf0 (osi_mutex_t *mutex) -\fs25 -\par - -This function relinquishes the caller's use of the resource; if any other threads -are waiting for the mutex, they are woken at this point, and one of the other -threads is given the mutex. -\par - -It is an error to release a mutex twice. However, a mutex can be released by a different -thread than that which obtained it, as long as this is the programmer's intention. -\par - -\page - -#{\footnote lockFinalizeMutex} -${\footnote lock_FinalizeMutex} -K{\footnote lock_FinalizeMutex} -+{\footnote mutexes:05} - -\fs40 -void \cf2 lock_FinalizeMutex \cf0 (osi_mutex_t *mutex) -\fs25 -\par - -This function is used to free up any auxiliary storage and control structures -associated with a mutex. In the current implementation, this function does nothing -except when running with the statistics gathering implementation of mutexes, but -this is not guaranteed to stay true in later releases of the OSI library. Furthermore, -anyone can enable statistics gathering. -\par - -Locks and mutexes need not be finalized if the process is about to terminate, since any -resources allocated are allocated on behalf of the process, and will be freed when -the process exits. - -\page - -#{\footnote lockTryMutex} -${\footnote lock_TryMutex} -K{\footnote lock_TryMutex} -+{\footnote mutexes:06} - -\fs40 -int \cf2 lock_TryMutex \cf0 (osi_mutex_t *mutexp) -\fs25 -\par - -This function is a non-blocking version of {\uldb lock_ObtainMutex}{\v lockObtainMutex}. -It tries to obtain the specified mutex, and if it succeeds, it returns 1. Otherwise, -instead of blocking and waiting until the mutex is available, it returns 0 and leaves -the mutex unchanged. -\par - -This function is typically used when the programmer needs to obtain locks in an order -incompatible with their locking hierarchy. See the section on {\uldb locking hierarchies} -{\v hierarchies} for an example of its use for this purpose. -\par - -The caller must be careful to release the mutex if and only if the function returns 1. -\par - -\page - -#{\footnote rwlocks} -${\footnote Read/Write Locks} -+{\footnote rwlocks:01} - -Read/write locks are similar in use to mutexes. They are used to mediate access to -data structures that are accessed by multiple threads. -\par - -Unlike {\uldb mutexes}{\v mutexes}, however, read/write locks mediate two forms of access -to the structures: read accesses, of which several can be executing concurrently, and write -accesses, only one of which can be executing at any given time. -\par - -Like mutexes, read/write locks \cf1 must \cf0 be initialized before they can be used, and need -to be finalized when their storage is going to be freed. The procedures -{\uldb lock_InitializeRWLock}{\v lockInitializeRWLock} and -{\uldb lock_FinalizeRWLock}{\v lockFinalizeRWLock} perform these functions. - -\page - -#{\footnote lockInitializeRWLock} -${\footnote lock_InitializeRWLock} -K{\footnote lock_InitializeRWLock} -+{\footnote rwlocks:02} - -\fs40 -void \cf2 lock_InitializeRWLock \cf0 (osi_rwlock_t *lockp) -\fs25 -\par - -This function initializes the storage used by a read/write lock. The structure -\cf1 must \cf0 be initialized before it is obtained or released by the functions -described in this section. -\par - -\page - -#{\footnote lockObtainRead} -${\footnote lock_ObtainRead} -K{\footnote lock_ObtainRead} -+{\footnote rwlocks:03} - -\fs40 -void \cf2 lock_ObtainRead \cf0 (osi_rwlock_t *lockp) -\fs25 -\par - -This function obtains a read/write lock for reading. The lock must have been -previously initialized with {\uldb lock_InitializeRWLock}{\v lockInitializeRWLock}. -\par - -When done with the lock, the programmer must ensure that the function -{\uldb lock_ReleaseRead}{\v lockReleaseRead} or -{\uldb osi_SleepR}{\v osiSleepR} is called to release the lock. - -\page - -#{\footnote lockObtainWrite} -${\footnote lock_ObtainWrite} -K{\footnote lock_ObtainWrite} -+{\footnote rwlocks:04} - -\fs40 -void \cf2 lock_ObtainWrite \cf0 (osi_rwlock_t *lockp) -\fs25 -\par - -This function obtains a read/write lock for writing. The lock must have been -previously initialized with {\uldb lock_InitializeRWLock}{\v lockInitializeRWLock}. -\par - -At most one thread can have a read/write lock held for writing at any time, and -no thread can simultaneously have a read/write lock held for reading at that time. -\par - -When done with the lock, the programmer must ensure that the function -{\uldb lock_ReleaseWrite}{\v lockReleaseWrite} or -{\uldb osi_SleepW}{\v osiSleepW} is called to release the lock. - -\page - -#{\footnote lockReleaseRead} -${\footnote lock_ReleaseRead} -K{\footnote lock_ReleaseRead} -+{\footnote rwlocks:05} - -\fs40 -void \cf2 lock_ReadRead\cf0 (osi_rwlock_t *lockp) -\fs25 -\par - -This function releases a lock held in read mode. If the number of readers -drops to zero, a writer may obtain the lock, otherwise only readers may -obtain the lock. If any writers are waiting for this lock, they are woken -up and may proceed at this time. -\par - -The application program must have obtained this lock in read mode before calling -this function; it is an error to release a read lock more often than it was -obtained. -\par - -\page - -#{\footnote lockReleaseWrite} -${\footnote lock_ReleaseWrite} -K{\footnote lock_ReleaseWrite} -+{\footnote rwlocks:06} - -\fs40 -void \cf2 lock_ReleaseWrite\cf0 (osi_rwlock_t *lockp) -\fs25 -\par - -This function releases a lock held in write mode. After this call, -anyone waiting for a read lock or a write lock is woken up and may -proceed. -\par - -The application program must have obtained this lock in read mode before calling -this function; it is an error to release a read lock more often than it was -obtained. -\par - -\page - -#{\footnote lockFinalizeRWLock} -${\footnote lock_FinalizeRWLock} -K{\footnote lock_FinalizeRWLock} -+{\footnote rwlocks:07} - -\fs40 -void \cf2 lock_FinalizeRWLock \cf0 (osi_rwlock_t *lockp) -\fs25 -\par - -This function is called to free up any auxiliary data structures associated with -the read/write lock. This function \cf1 must \cf0 be called before freeing any -storage containing a read/write lock. This function must be called at a time when -there are no threads holding or waiting for the lock concerned. -\par - -Locks allocated from static storage need never be finalized. -\par - -\page - -#{\footnote lockTryRead} -${\footnote lock_TryRead} -K{\footnote lock_TryRead} -+{\footnote rwlocks:08} - -\fs40 -int \cf2 lock_TryRead\cf0 (osi_rwlock_t *rwlockp) -\fs25 -\par - -This function is a non-blocking version of {\uldb lock_ObtainRead}{\v -lockObtainRead}. It tries to obtain the specified read/write lock in -read mode, and if it succeeds, it returns 1. Otherwise, instead of -blocking and waiting until the lock is available, it returns 0 and -leaves the lock unchanged. -\par - -This function is typically used when the programmer needs to obtain locks in an order -incompatible with their locking hierarchy. See the section on {\uldb locking hierarchies} -{\v hierarchies} for an example of its use for this purpose. -\par - -The caller must be careful to release the read lock if and only if the function returns 1. -\par - -\page - -#{\footnote lockTryWrite} -${\footnote lock_TryWrite} -K{\footnote lock_TryWrite} -+{\footnote rwlocks:09} - -\fs40 -int \cf2 lock_TryWrite\cf0 (osi_rwlock_t *rwlockp) -\fs25 -\par - -This function is a non-blocking version of {\uldb lock_ObtainWrite}{\v -lockObtainWrite}. It tries to obtain the specified read/write lock in -write mode, and if it succeeds, it returns 1. Otherwise, instead of -blocking and waiting until the lock is available, it returns 0 and -leaves the lock unchanged. -\par - -This function is typically used when the programmer needs to obtain locks in an order -incompatible with their locking hierarchy. See the section on {\uldb locking hierarchies} -{\v hierarchies} for an example of its use for this purpose. -\par - -The caller must be careful to release the write lock if and only if the function returns 1. -\par - -\page - -#{\footnote conds} -${\footnote Condition Variables} -+{\footnote conds:01} - -Condition variables are used to allow a threaded program to wait for an interesting -event. -\par - -Condition variables are represented as long integers. By convention, these long -integers are cast from addresses of mnemonic structures (so that, when waiting for a -particular structure, foo, to change state, you might sleep on "(long)&foo"), but -the sleep functions do not change any storage at the address named by the condition variable, -and indeed, condition variable integers can really be any numbers you desire. -\par - -The basic idea is that a thread that wants to wait for a particular event -waits for a condition variable by calling \f1 osi_Sleep \f0 with the condition variable -as a parameter, which blocks the calling thread. When the interesting event occurs, -the thread that notices the event calls \f1 osi_Wakeup \f0, waking up \cf1 all\cf0 -threads sleeping on that condition variable. -\par - -Unfortunately, condition variables as described so far are unusable in most cases, due to -a race condition that occurs in their typical uses. Here's an example: assume that there -is a structure that represents a buffer of data. Some threads read from the buffer, waiting -until there is data available, and others add data to the buffer, waiting until there is -space available. The structure, read and write calls might be coded like this: - -\par - -\f1 -#define BSIZE 100 /* buffer size */\line -\line -typedef struct buffer \{\line - char data[BSIZE]; /* buffer */\line - int nbytes; /* bytes used in the buffer */\line - osi_mutex_t mutex; /* mutex for synchronizing access */\line - BOOL readWaiting; /* true if someone is waiting for data */\line - BOOL writeWaiting; /* true if someone is waiting for space */\line -\} buffer_t;\line -\par - -int Read(buffer_t *bp, char *data)\line -\{\line - long bytesRead; \line - \line - while(1) \{ \line - lock_ObtainMutex(&bp->mutex);\line - if (nbytes == 0) \{ /* no data available */\line - readWaiting = 1;\line - /* wait for something interesting */\line - lock_ReleaseMutex(&bp->mutex); /*BUG*/\line - osi_Sleep((long) &bp->readWaiting); /*BUG*/\line - continue; \line - \} \line - \line - memcpy(bp->data, data, bp->nbytes);\line - nbytes = bp->nbytes; /* remember for later */ \line - bp->nbytes = 0; \line - \line - /* now wakeup anyone waiting for space */ \line - if (bp->writeWaiting) \{ \line - bp->writeWaiting = 0; \line - osi_Wakeup((long) &bp->writeWaiting); \line - \} \line - \line - /* and we're done, so return # of bytes read */ \line - lock_ReleaseMutex(&bp->mutex);\line - return nbytes;\line - \}\line -\}\line -\par - -void Write(buffer_t *bp, char *data, int len) \line -\{ \line - while(1) \{ \line - lock_ObtainMutex(&bp->mutex); \line - if (len > BSIZE-bp->nbytes) \{ \line - /* no space available */\line - writeWaiting = 1;\line - /* wait for something interesting */\line - lock_ReleaseMutex(&bp->mutex); /*BUG*/ \line - osi_Sleep((long) &bp->writeWaiting); /*BUG*/ \line - continue; \line - \} \line - \line - memcpy(data, bp->data+bp->nbytes, len);\line - bp->nbytes += len; \line - \line - /* now wakeup anyone waiting for data */ \line - if (bp->readWaiting) \{ \line - bp->readWaiting = 0; \line - osi_Wakeup((long) &bp->readWaiting); \line - \} \line - \line - /* and we're done, so return # of bytes read */ \line - lock_ReleaseMutex(&bp->mutex);\line - return ;\line - \}\line -\} \line -\par -\f0 - -There are a number of things to note in the above example. First, note our use of -memory addresses as condition variables. The calls to {\uldb osi_Sleep}{\v osiSleep} and -{\uldb osi_Wakeup}{\v osiWakeup} do not change the data at bp->readWaiting or bp->writeWaiting, -but the call \f1 osi_Wakeup((long) &bp->readWaiting)\f0 only wakes up the thread sleeping -in the call \f1 osi_Sleep((long) &bp->readWaiting)\f0, not -\f1 osi_Sleep((long) &bp->writeWaiting) \f0. -\par - -Please also note that accesses by multiple threads to this buffer structure are mediated -by a mutex structure stored in the buffer itself. Whenever either \f1 Read\f0 or \f1 Write\f0 -block waiting for the other to supply/remove data, they of course must release the mutex -so that the other thread can access the structure to supply/remove the data. -\par - -Unfortunately, there is also a bug in the above code: consider the case -where the \f1 Read\f0 call is interrupted due to a clock interrupt -between the time that a thread releases the mutex and the time that -the thread then calls \f1 osi_Sleep\f0. Assume that the OS does a context switch -to a new thread, that calls \f1 Write\f0, and runs through completely, doing the call -to \f1 osi_Wakeup\f0. The OS then switches back to the thread doing the read, -and the thread proceeds and calls \f1 osi_Sleep\f0, even though there is data now waiting. -Unfortunately, no one is going to wake us up to notice that there is data available now. -\par - -This problem would be solved if it were impossible for a wakeup call to execute between -the time that the mutex was released and the time that the thread blocked in \f1 osi_Sleep\f0. -This combination of releasing a lock or a mutex and sleeping on a condition variable is provided -by three functions, {\uldb osi_SleepM}{\v osiSleepM}, {\uldb osi_SleepR}{\v osiSleepR} and -{\uldb osi_SleepW}{\v osiSleepW}, which atomically sleep and release a mutex, read lock and -write lock, respectively. -\par - -Thus, the two pairs of lines in the example source above that are labelled with -\f1 /*BUG*/\f0 should -be replaced by \f1 osi_SleepM((long) &bp->readWaiting, &bp->mutex) \f0 and -\f1 osi_SleepM((long) &bp->writeWaiting, &bp->mutex)\f0 , respectively. - -Indeed, almost every use of \f1 osi_Sleep\f0 instead of one of the combination routines described -above is incorrect, and has a race condition between the last release of a lock or mutex, and -the call to \f1 osi_Sleep\f0. So, please be careful when using \f1 osi_Sleep\f0 to be sure -to check for this condition. -\par - -\page - -#{\footnote osiSleepM} -${\footnote osi_SleepM} -K{\footnote osi_SleepM} -+{\footnote conds:02} - -\f1 -\fs40 -void \cf2 osi_SleepM\cf0 (long sleepValue, osi_mutex_t *mutex) -\fs25 -\f0 -\par - -This function atomically sleeps at \f1 sleepValue\f0 and releases the mutex at -\f1 mutex\f0. Atomically in this case means that no \f1 osi_Wakeup\f0 calls will -be executed from -before the lock is released until after the thread is asleep. -\par - -The programmer must \cf1 always\cf0 be prepared for rare, spontaneous wakeups from -any of the \f1 osi_Sleep\f0 family of functions. Thus, any use of \f1 osi_SleepM\f0 -should be contained within a \f1 while \f0 loop that rechecks the appropriate condition -that the thread is waiting for, and tries sleeping again if the wakeup was a spurious one. -\par - -\page - -#{\footnote osiSleepR} -${\footnote osi_SleepR} -K{\footnote osi_SleepR} -+{\footnote conds:03} - -\f1 -\fs40 -void \cf2 osi_SleepR\cf0 (long sleepValue, osi_rwlock_t *lockp) -\fs25 -\f0 -\par - -This function atomically sleeps at \f1 sleepValue\f0 and releases the read lock at -\f1 lockp\f0. Atomically in this case means that no \f1 osi_Wakeup\f0 calls will -be executed from -before the lock is released until after the thread is asleep. -\par - -The programmer must \cf1 always\cf0 be prepared for rare, spontaneous wakeups from -any of the \f1 osi_Sleep\f0 family of functions. Thus, any use of \f1 osi_SleepR\f0 -should be contained within a \f1 while \f0 loop that rechecks the appropriate condition -that the thread is waiting for, and tries sleeping again if the wakeup was a spurious one. -\par - -\page - -#{\footnote osiSleepW} -${\footnote osi_SleepW} -K{\footnote osi_SleepW} -+{\footnote conds:04} - -\f1 -\fs40 -void \cf2 osi_SleepW\cf0 (long sleepValue, osi_rwlock_t *lockp) -\fs25 -\f0 -\par - -This function atomically sleeps at \f1 sleepValue\f0 and releases the write lock at -\f1 lockp\f0. Atomically in this case means that no \f1 osi_Wakeup\f0 calls will -be executed from -before the lock is released until after the thread is asleep. -\par - -The programmer must \cf1 always\cf0 be prepared for rare, spontaneous wakeups from -any of the \f1 osi_Sleep\f0 family of functions. Thus, any use of \f1 osi_SleepW\f0 -should be contained within a \f1 while \f0 loop that rechecks the appropriate condition -that the thread is waiting for, and tries sleeping again if the wakeup was a spurious one. -\par - -\page - -#{\footnote osiSleep} -${\footnote osi_Sleep} -K{\footnote osi_Sleep} -+{\footnote conds:05} - -\f1 -\fs40 -void \cf2 osi_Sleep\cf0 (long sleepValue) -\fs25 -\f0 -\par - -This function sleeps at \f1 sleepValue\f0. The thread will not resume execution until -after another thread later executes a call to \f1 osi_Wakeup\f0 with the same value -for \f1 sleepValue\f0. -\par - -The programmer must \cf1 always\cf0 be prepared for rare, spontaneous wakeups from -any of the \f1 osi_Sleep\f0 family of functions. Thus, any use of \f1 osi_Sleep\f0 -should be contained within a \f1 while \f0 loop that rechecks the appropriate condition -that the thread is waiting for, and tries sleeping again if the wakeup was a spurious one. -\par - -Also remember that almost every use of this function when waiting for a change in data protected -by a mutex or read/write lock is incorrect, and you probably should be using one of -{\uldb osi_SleepM}{\v osiSleepM}, -{\uldb osi_SleepR}{\v osiSleepR}, -or {\uldb osi_SleepW}{\v osiSleepW} to simultaneously release the data protection lock and -sleep atomically. - -\page - -#{\footnote osiWakeup} -${\footnote osi_Wakeup} -K{\footnote osi_Wakeup} -+{\footnote conds:06} - -\f1 -\fs40 -void \cf2 osi_Wakeup\cf0 (long sleepValue) -\f0 -\fs25 -\par - -This function wakes up all threads already sleeping at \f1 sleepValue\f0. Threads sleep -by calling {\uldb osi_Sleep}{\v osiSleep}, -{\uldb osi_SleepM}{\v osiSleepM}, -{\uldb osi_SleepR}{\v osiSleepR}, -or {\uldb osi_SleepW}{\v osiSleepW}. -\par - -This call will synchronize appropriately with -{\uldb osi_SleepM}{\v osiSleepM}, -{\uldb osi_SleepR}{\v osiSleepR}, -and {\uldb osi_SleepW}{\v osiSleepW}, so that if it is called while the corresponding lock -or mutex is held, the \f1 osi_Wakeup\f0 function won't execute until after the thread sleeping -on the condition variable is blocked. This avoid race conditions of the form described in -the section on {\uldb condition variables}{\v conds}. -\par - -\page - -#{\footnote hierarchies} -${\footnote Locking Hierarchies} -+{\footnote hier:01} - -Whenever a thread obtains more than one lock at a time, there is a -possibility of deadlock if the locks are obtained in the wrong order. -For example, imagine a situation where there are two threads, numbered -1 and 2, and two locks, named A and B. If thread 1 tries to obtain -lock A first and then lock B, while thread 2 tries to lock B and then -lock A, these two threads will, on occasion, deadlock. -\par - -Specifically, what can happen is that thread 1 can obtain lock A, and -then lose the processor to thread 2, which then goes on to obtain lock -B. Thread 2, after obtaining lock B, tries to obtain lock A, and -blocks, since thread 1 already holds this lock. Eventually, thread 1 -runs again, and tries to obtain lock B, but this lock is held (by -thread 2), and so thread 1 blocks, still holding lock A. This is a -classical case of a deadlock, or deadly embrace. -\par - -The heart of the problem is that two locks are obtained at the same -time, but in different orders by different threads. And so, this -problem can be solved in several different ways, some of which will be -discussed here. - -The easiest way to solve this problem is to have a global locking order, -and have all threads lock their locks in this ordering. It is of course -imperative to come up with a reasonable locking hierarchy (ordering) to -make this as easy as possible. This solution is particularly good to -use when dealing with several locks in the same module or package, since -all of the locks can be understood by one programmer. Among locks held -by separate modules, as long as there is a standard ordering in which modules -call one another, so that for example module foo always calls module bar, while -module bar never calls module foo, the locking hierarchy within the individual -modules will naturally extend to the set of all modules. -\par - -Sometimes getting a simple locking hierarchy is difficult to do, -however. When establishing a good locking hierarchy is difficult or -impossible, another possibility is releasing one lock when obtaining -another lock. In the example above, thread 1 might grab lock A, do some -work, drop lock A and obtain lock B, do more work, and then drop lock B -and grab lock A. Since it never holds two locks at once, it avoids the -deadlock. However, when it grabs lock A for a second time, it must be -prepared to see changes made to the structures protected by lock A, -since for a time lock A was not held. Furthermore, if lock A was a -write lock or a mutex, we also must examine all other threads that might -have seen the data structure protected by lock A in the state after we -released the lock A the first time. We must ensure that they view the -state they might see as a consistent state, and are prepared to deal -with the structures in that state. -\par - -Finally, another choice we have is to use the \f1 lock_TryRead\f0 and similar functions. -Since the trylock functions don't block, we can use them safely to -obtain the second through Nth locks in a series. For example, the sequence: -\par - -\f1 - lock_ObtainWrite(&lockB); \line - lock_ObtainWrite(&lockA); \line -\f0 -\par - -can be replaced by this: -\par - -\f1 - while (1) \{ \line - lock_ObtainWrite(&lockB); \line - if (lock_TryWrite(&lockA)) break; \line - \line - /* otherwise we failed to get lock A, so camp on it \line - * safely. \line - */ \line - lock_ReleaseWrite(&lockB); \line - lock_ObtainWrite(&lockA); \line - \line - /* once we get here, we've gotten lock A. Hopefully \line - * lock B is now available, too. Let's quickly drop \line - * this guy and try again. \line - */ \line - lock_ReleaseWrite(&lockA); \line - \} \line - \line - /* when we get here, we have locked B and then A without having \line - * released B while obtaining A (in the last iteration). \line - */\line -\f0 -\par - -Clearly the second piece of code is considerably more complex, but it does give -the programmer the ability to lock locks out of order, and do computations based on -the information seen under those locks. All modifications, of course, must be delayed -until all of the locks have been obtained at the exit of the big while loop, but that is -usually not a significant restriction. -\par - -\page - -#{\footnote debug} -${\footnote Debugging and Profiling} -+{\footnote debug:01} - -The state of any instance of the OSI package can be examined remotely by the -osidebug program, if the programmer so chooses. In order to export the basic information, -which consists of information on the thread IDs and sleep values for threads blocked in -one of the \f1 osi_Sleep\f0 functions, or blocked waiting for a lock. The sleep value -of a thread waiting for a lock is the address of the lock. -\par - -Furthermore, if lock statistics gathering has been enabled by calling -{\uldb osi_LockTypeSetDefault}{\v osiLockTypeSetDefault} before initializing some locks, -then statistics are gathered on those locks, and the osidebug program will report those -statistics, too. -\par - -To access any information remotely, the function -{\uldb osi_InitDebug}{\v osiInitDebug} must be called. If this is not done, then -the osidebug program will simply fail to bind to the application program. -\par - -If the system deadlocks, enough information may be available from osidebug's output to -enable the programmer to figure out what is wrong with the application program without -resorting to a debugger on the target machine; this is especially convenient when debugging -problems from a remote machine. -\par - -More detailed information on osidebug can be obtained from that program's help menu. -\par - -\page - -#{\footnote osilocktypesetdefault} -${\footnote osi_LockTypeSetDefault} -K{\footnote osi_LockTypeSetDefault} -+{\footnote debug:02} - -\f1 -\fs40 -int \cf2 osi_LockTypeSetDefault\cf0 (char *name) -\fs25 -\f0 -\par - -This function takes a name of a lock type and sets a global state variable controlling -the type of lock initialized by \f1 lock_InitializeMutex\f0 and \f1 lock_InitializeRWLock\f0 . -Normally, when a lock initialization function is called, it creates a lock of a specific -type, currently, a regular lock or mutex, or a statistics-gathering lock or mutex. Which -type is created is determined by this global variable. -\par - -If the name is "stat", then statistics gathering locks and mutexes will be created. If the -type name is passed in as a NULL pointer, regular, non-statistics gathering lock and mutexes -will be created. -\par - -Since this is a global variable, it controls the type of lock and mutex created by all threads -henceforth in this process. -\par - -Note that it does not matter what the state of default lock type is when you are gathering -statistics. -\cf1 All that matter is the type of default lock at the time the locks are initialized. \cf0 -\par - -The system initializes itself creating regular locks and mutexes; this function must be -used to enable statistics gathering, and it must be called \cf1 before\cf0 the -calls to \f1 lock_InitializeMutex\f0 and \f1 lock_InitializeRWLock\f0 are done that -initialize the locks whose statistics are to be gathered. After the locks have been -initialized, this variable may even be reset, and the initialized locks will continue -to gather statistics. -\par - -\page - -} diff --git a/src/WINNT/client_osi/libosicl.def b/src/WINNT/client_osi/libosicl.def deleted file mode 100644 index d3d0c4817..000000000 --- a/src/WINNT/client_osi/libosicl.def +++ /dev/null @@ -1,13 +0,0 @@ -LIBRARY libosicl - - -CODE EXECUTE SHARED -DATA READ WRITE - -EXPORTS - dbrpc_Open @1 - dbrpc_GetInfo @2 - dbrpc_Ping @3 - dbrpc_Close @4 - dbrpc_v1_0_c_ifspecp = dbrpc_v1_0_c_ifspec @5 CONSTANT - dbrpc_GetFormat @6 diff --git a/src/WINNT/client_osi/main.c b/src/WINNT/client_osi/main.c deleted file mode 100644 index 4719958a3..000000000 --- a/src/WINNT/client_osi/main.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -/**************************************************************************** - - PROGRAM: Main.c - - PURPOSE: system test code for osi package. - -****************************************************************************/ - - -#include -#include - -#include "windows.h" -#include -#include "main.h" -#include "basic.h" -#include "trylock.h" -#include "perf.h" -#include "osi.h" -#include - -/* global state for test program */ -HANDLE hInst; - -HWND globalWnd; - -/* screen image */ -char main_screenText[HW_NLINES][80]; - -/* screen display image size */ -RECT screenRect; - -/* height of a text line */ -int lineHeight; - -/**************************************************************************** - - FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int) - - PURPOSE: calls initialization function, processes message loop - -****************************************************************************/ - -int APIENTRY WinMain( - HANDLE hInstance, - HANDLE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow - ) -{ - MSG msg; - - - if (!InitApplication(hInstance)) - return (FALSE); - - if (!InitInstance(hInstance, nCmdShow)) - return (FALSE); - - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return (msg.wParam); -} - - -/**************************************************************************** - - FUNCTION: InitApplication(HANDLE) - - PURPOSE: Initializes window data and registers window class - -****************************************************************************/ - -BOOL InitApplication(HANDLE hInstance) -{ - WNDCLASS wc; - - /* create window class */ - wc.style = CS_DBLCLKS; /* double-click messages */ - wc.lpfnWndProc = (WNDPROC) MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = "InputMenu"; - wc.lpszClassName = "InputWClass"; - - return (RegisterClass(&wc)); -} - - -/**************************************************************************** - - FUNCTION: InitInstance(HANDLE, int) - - PURPOSE: Saves instance handle and creates main window - -****************************************************************************/ - -BOOL InitInstance( - HANDLE hInstance, - INT nCmdShow) -{ - HWND hWnd; - HDC hDC; - TEXTMETRIC textmetric; - RECT rect; - UUID debugID; - long code; - - hInst = hInstance; - - /* create window itself */ - hWnd = CreateWindow( - "InputWClass", - "OSI Lock Test Application", - WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, /* horz & vert scroll bars */ - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - NULL, - NULL, - hInstance, - NULL - ); - - if (!hWnd) - return (FALSE); - - globalWnd = hWnd; - - hDC = GetDC(hWnd); - GetTextMetrics(hDC, &textmetric); - lineHeight = textmetric.tmExternalLeading + textmetric.tmHeight; - - rect.left = GetDeviceCaps(hDC, LOGPIXELSX) / 4; /* 1/4 inch */ - rect.right = GetDeviceCaps(hDC, HORZRES); - rect.top = GetDeviceCaps(hDC, LOGPIXELSY) / 4; /* 1/4 inch */ - ReleaseDC(hWnd, hDC); - rect.bottom = rect.top + HW_NLINES * lineHeight; - screenRect = rect; - - /* init RPC system */ - osi_LongToUID(1, &debugID); - code = osi_InitDebug(&debugID); - - if (code == 0) wsprintf(main_screenText[0], "Initialized successfully."); - else wsprintf(main_screenText[0], "Failed to init debug system, code %ld", code); - - ShowWindow(hWnd, nCmdShow); - UpdateWindow(hWnd); - return (TRUE); - -} - -/**************************************************************************** - - FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG) - - PURPOSE: Processes messages - -****************************************************************************/ - -LONG APIENTRY MainWndProc( - HWND hWnd, - UINT message, - UINT wParam, - LONG lParam) -{ - FARPROC lpProcAbout; - - HDC hDC; /* display-context variable */ - HMENU hMenu; /* menu */ - PAINTSTRUCT ps; /* paint structure */ - RECT rect; - long i; - long code; - - switch (message) { - case WM_COMMAND: - if (LOWORD(wParam) == IDM_ABOUT) { - lpProcAbout = (FARPROC) About; - - DialogBox(hInst, - "AboutBox", - hWnd, - lpProcAbout); - - break; - } - if (LOWORD(wParam) == IDM_DEBUGON) { - osi_LockTypeSetDefault("stat"); - hMenu = GetMenu(globalWnd); - CheckMenuItem(hMenu, IDM_DEBUGON, MF_CHECKED); - CheckMenuItem(hMenu, IDM_DEBUGOFF, MF_UNCHECKED); - } - if (LOWORD(wParam) == IDM_DEBUGOFF) { - osi_LockTypeSetDefault((char *) 0); - hMenu = GetMenu(globalWnd); - CheckMenuItem(hMenu, IDM_DEBUGON, MF_UNCHECKED); - CheckMenuItem(hMenu, IDM_DEBUGOFF, MF_CHECKED); - } - if (LOWORD(wParam) == IDM_BASICTEST) { - main_ClearDisplay(); - wsprintf(main_screenText[0], "Starting basic test run..."); - code = main_BasicTest(hWnd); - wsprintf(main_screenText[0], "Basic test returned code %d", code); - InvalidateRect(hWnd, &screenRect, TRUE); - } - else if (LOWORD(wParam) == IDM_PERFTEST) { - main_ClearDisplay(); - wsprintf(main_screenText[0], "Starting performance test run..."); - code = main_PerfTest(hWnd); - wsprintf(main_screenText[0], "Performance test returned code %d", code); - InvalidateRect(hWnd, &screenRect, TRUE); - } - else if (LOWORD(wParam) == IDM_TRYLOCKTEST) { - main_ClearDisplay(); - wsprintf(main_screenText[0], "Starting TryLock test run..."); - code = main_TryLockTest(hWnd); - wsprintf(main_screenText[0], "TryLock test returned code %d", code); - InvalidateRect(hWnd, &screenRect, TRUE); - } - else - return (DefWindowProc(hWnd, message, wParam, lParam)); - break; - - case WM_CHAR: - wsprintf(main_screenText[0], "WM_CHAR: %c, %x, %x", - wParam, LOWORD(lParam), HIWORD(lParam)); - InvalidateRect(hWnd, &screenRect, TRUE); - break; - - case WM_PAINT: - hDC = BeginPaint (hWnd, &ps); - - if (IntersectRect(&rect, &screenRect, &ps.rcPaint)) { - for(i=0; i - -/* misc definitions */ - -/* large int */ -#ifndef DJGPP -#include -#if !defined(_MSC_VER) || (_MSC_VER < 1300) -#include "largeint.h" -#endif -#include "osithrdnt.h" -#else /* DJGPP */ -#include "largeint95.h" -#endif /* !DJGPP */ - -typedef LARGE_INTEGER osi_hyper_t; -#if _MSC_VER >= 1300 -LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b); -LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b); -LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder); -LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder); -LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a); -#define LargeIntegerGreaterThan(a, b) \ - ((a).HighPart > (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart > (b).LowPart)) - -#define LargeIntegerGreaterThanOrEqualTo(a, b) \ - ((a).HighPart > (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart >= (b).LowPart)) - -#define LargeIntegerLessThan(a, b) \ - ((a).HighPart < (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart < (b).LowPart)) - -#define LargeIntegerLessThanOrEqualTo(a, b) \ - ((a).HighPart < (b).HighPart || \ - ((a).HighPart == (b).HighPart && (a).LowPart <= (b).LowPart)) - -#define LargeIntegerEqualTo(a, b) \ - ((a).HighPart == (b).HighPart && (a).LowPart == (b).LowPart) - -#define LargeIntegerGreaterOrEqualToZero(a) ((a).HighPart >= 0) - -#define LargeIntegerLessThanZero(a) ((a).HighPart < 0) - -#define LargeIntegerNotEqualToZero(a) ((a).HighPart || (a).LowPart) -#endif -#ifndef DJGPP -typedef GUID osi_uid_t; -#else /* DJGPP */ -typedef int osi_uid_t; -#endif /* !DJGPP */ - -typedef int int32; - -#ifndef DJGPP -/* basic util functions */ -#include "osiutils.h" - -/* FD operations */ -#include "osifd.h" - -/* lock type definitions */ -#include "osiltype.h" -#endif /* !DJGPP */ - -/* basic sleep operations */ -#include "osisleep.h" - -#ifndef DJGPP -/* base lock definitions */ -#include "osibasel.h" - -/* statistics gathering lock definitions */ -#include "osistatl.h" - -/* RPC debug stuff */ -#include "osidb.h" -#else /* DJGPP */ -#include "osithrd95.h" -#endif /* !DJGPP */ - -/* log stuff */ -#include "osilog.h" - -#endif /*_OSI_H_ENV_ */ diff --git a/src/WINNT/client_osi/osibasel.c b/src/WINNT/client_osi/osibasel.c deleted file mode 100644 index 4b4dadd5c..000000000 --- a/src/WINNT/client_osi/osibasel.c +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - - -#include -#include - -#include -#include "osi.h" -#include - -/* atomicity-providing critical sections */ -CRITICAL_SECTION osi_baseAtomicCS[OSI_MUTEXHASHSIZE]; - -void osi_BaseInit(void) -{ - int i; - - for(i=0; itype) != 0) { - (osi_lockOps[i]->ObtainWriteProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL) - || (lockp->readers > 0)) { - lockp->waiters++; - osi_TWait(&lockp->d.turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, csp); - lockp->waiters--; - osi_assert(lockp->readers == 0 && (lockp->flags & OSI_LOCKFLAG_EXCL)); - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - } - - LeaveCriticalSection(csp); -} - -void lock_ObtainRead(osi_rwlock_t *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i=lockp->type) != 0) { - (osi_lockOps[i]->ObtainReadProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - lockp->waiters++; - osi_TWait(&lockp->d.turn, OSI_SLEEPINFO_W4READ, &lockp->readers, csp); - lockp->waiters--; - osi_assert(!(lockp->flags & OSI_LOCKFLAG_EXCL) && lockp->readers > 0); - } - else { - /* if we're here, all clear to set the lock */ - lockp->readers++; - } - LeaveCriticalSection(csp); -} - -void lock_ReleaseRead(osi_rwlock_t *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->ReleaseReadProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->readers > 0, "read lock not held"); - - /* releasing a read lock can allow readers or writers */ - if (--lockp->readers == 0 && !osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, 0, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -void lock_ReleaseWrite(osi_rwlock_t *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->ReleaseWriteProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->flags & OSI_LOCKFLAG_EXCL, "write lock not held"); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, 0, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -void lock_ConvertWToR(osi_rwlock_t *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->ConvertWToRProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->flags & OSI_LOCKFLAG_EXCL, "write lock not held"); - - /* convert write lock to read lock */ - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - lockp->readers++; - - if (!osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, /* still have readers */ 1, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -void lock_ObtainMutex(struct osi_mutex *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i=lockp->type) != 0) { - (osi_lockOps[i]->ObtainMutexProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - lockp->waiters++; - osi_TWait(&lockp->d.turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, csp); - lockp->waiters--; - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - } - LeaveCriticalSection(csp); -} - -void lock_ReleaseMutex(struct osi_mutex *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->ReleaseMutexProc)(lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->flags & OSI_LOCKFLAG_EXCL, "mutex not held"); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, 0, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -int lock_TryRead(struct osi_rwlock *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i=lockp->type) != 0) - return (osi_lockOps[i]->TryReadProc)(lockp); - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - i = 0; - } - else { - /* if we're here, all clear to set the lock */ - lockp->readers++; - i = 1; - } - - LeaveCriticalSection(csp); - - return i; -} - - -int lock_TryWrite(struct osi_rwlock *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i=lockp->type) != 0) - return (osi_lockOps[i]->TryWriteProc)(lockp); - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL) - || (lockp->readers > 0)) { - i = 0; - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - i = 1; - } - - LeaveCriticalSection(csp); - - return i; -} - - -int lock_TryMutex(struct osi_mutex *lockp) { - long i; - CRITICAL_SECTION *csp; - - if ((i=lockp->type) != 0) - return (osi_lockOps[i]->TryMutexProc)(lockp); - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - i = 0; - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - i = 1; - } - - LeaveCriticalSection(csp); - - return i; -} - -void osi_SleepR(long sleepVal, struct osi_rwlock *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->SleepRProc)(sleepVal, lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->readers > 0, "osi_SleepR: not held"); - - /* XXX better to get the list of things to wakeup from TSignalForMLs, and - * then do the wakeup after SleepSpin releases the low-level mutex. - */ - if (--lockp->readers == 0 && !osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, 0, NULL); - } - - /* now call into scheduler to sleep atomically with releasing spin lock */ - osi_SleepSpin(sleepVal, csp); -} - -void osi_SleepW(long sleepVal, struct osi_rwlock *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->SleepWProc)(sleepVal, lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->flags & OSI_LOCKFLAG_EXCL, "osi_SleepW: not held"); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, 0, NULL); - } - - /* and finally release the big lock */ - osi_SleepSpin(sleepVal, csp); -} - -void osi_SleepM(long sleepVal, struct osi_mutex *lockp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i = lockp->type) != 0) { - (osi_lockOps[i]->SleepMProc)(sleepVal, lockp); - return; - } - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assertx(lockp->flags & OSI_LOCKFLAG_EXCL, "osi_SleepM not held"); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&lockp->d.turn)) { - osi_TSignalForMLs(&lockp->d.turn, 0, NULL); - } - - /* and finally release the big lock */ - osi_SleepSpin(sleepVal, csp); -} - -void lock_FinalizeRWLock(osi_rwlock_t *lockp) -{ - long i; - - if ((i=lockp->type) != 0) - (osi_lockOps[i]->FinalizeRWLockProc)(lockp); -} - -void lock_FinalizeMutex(osi_mutex_t *lockp) -{ - long i; - - if ((i=lockp->type) != 0) - (osi_lockOps[i]->FinalizeMutexProc)(lockp); -} - -void lock_InitializeMutex(osi_mutex_t *mp, char *namep) -{ - int i; - - if ((i = osi_lockTypeDefault) > 0) { - (osi_lockOps[i]->InitializeMutexProc)(mp, namep); - return; - } - - /* otherwise we have the base case, which requires no special - * initialization. - */ - mp->type = 0; - mp->flags = 0; - mp->atomicIndex = osi_MUTEXHASH(mp); - osi_TInit(&mp->d.turn); - return; -} - -void lock_InitializeRWLock(osi_rwlock_t *mp, char *namep) -{ - int i; - - if ((i = osi_lockTypeDefault) > 0) { - (osi_lockOps[i]->InitializeRWLockProc)(mp, namep); - return; - } - - /* otherwise we have the base case, which requires no special - * initialization. - */ - mp->type = 0; - mp->flags = 0; - mp->atomicIndex = osi_MUTEXHASH(mp); - mp->readers = 0; - osi_TInit(&mp->d.turn); - return; -} - -int lock_GetRWLockState(osi_rwlock_t *lp) -{ - long i; - CRITICAL_SECTION *csp; - - if ((i=lp->type) != 0) - return (osi_lockOps[i]->GetRWLockState)(lp); - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[lp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lp->flags & OSI_LOCKFLAG_EXCL) i = OSI_RWLOCK_WRITEHELD; - else i = 0; - if (lp->readers > 0) i |= OSI_RWLOCK_READHELD; - - LeaveCriticalSection(csp); - - return i; -} - -int lock_GetMutexState(struct osi_mutex *mp) { - long i; - CRITICAL_SECTION *csp; - - if ((i=mp->type) != 0) - return (osi_lockOps[i]->GetMutexState)(mp); - - /* otherwise we're the fast base type */ - csp = &osi_baseAtomicCS[mp->atomicIndex]; - EnterCriticalSection(csp); - - if (mp->flags & OSI_LOCKFLAG_EXCL) - i = OSI_MUTEX_HELD; - else - i = 0; - - LeaveCriticalSection(csp); - - return i; -} diff --git a/src/WINNT/client_osi/osibasel.h b/src/WINNT/client_osi/osibasel.h deleted file mode 100644 index fc80df4c8..000000000 --- a/src/WINNT/client_osi/osibasel.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _OSIBASEL_H_ENV_ -#define _OSIBASEL_H_ENV_ 1 - -/* flags for osi_mutex_t and osi_rwlock_t flags fields. Some bits - * are used only in one structure or another. - */ -#define OSI_LOCKFLAG_EXCL 1 /* exclusive locked (rwlock only) */ - -/* a mutex (pure exclusive lock). This structure has two forms. In the - * base type (type == 0), the d field is interpreted as an atomic counter, - * and all the other fields are used. In the other types, type specifies - * which operations to use (via the global osi_lockOps), and d.privateDatap - * points to the real data used by the mutex. - * - * For the base type, flags tells us if the lock is held, and if anyone else - * is waiting for the lock. The field d.atomicCount is used to implement a spin - * lock using an atomic increment operation. - */ -typedef struct osi_mutex { - char type; /* for all types; type 0 uses atomic count */ - char flags; /* flags for base type */ - unsigned short atomicIndex; /* index of lock for low-level sync */ - unsigned short waiters; /* waiters */ - unsigned short pad; - union { - void *privateDatap; /* data pointer for non-zero types */ - osi_turnstile_t turn; /* turnstile */ - } d; -} osi_mutex_t; - -/* a read/write lock. This structure has two forms. In the - * base type (type == 0), the d field is interpreted as an atomic counter, - * and all the other fields are used. In the other types, type specifies - * which operations to use (via the global osi_lockOps), and d.privateDatap - * points to the real data used by the mutex. - * - * For the base type, flags tells us if the lock is held, and if anyone else - * is waiting for the lock. The field d.atomicCount is used to implement a spin - * lock using an atomic increment operation. - * - * This type of lock has N readers or one writer. - */ -typedef struct osi_rwlock { - char type; /* for all types; type 0 uses atomic count */ - char flags; /* flags for base type */ - unsigned short atomicIndex; /* index into hash table for low-level sync */ - unsigned short waiters; /* waiters */ - unsigned short readers; /* readers */ - union { - void *privateDatap; /* data pointer for non-zero types */ - osi_turnstile_t turn; /* turnstile */ - } d; -} osi_rwlock_t; - -extern void lock_ObtainRead (struct osi_rwlock *); - -extern void lock_ObtainWrite (struct osi_rwlock *); - -extern void lock_ReleaseRead (struct osi_rwlock *); - -extern void lock_ReleaseWrite (struct osi_rwlock *); - -extern void lock_ObtainMutex (struct osi_mutex *); - -extern void lock_ReleaseMutex (struct osi_mutex *); - -extern int lock_TryRead (struct osi_rwlock *); - -extern int lock_TryWrite (struct osi_rwlock *); - -extern int lock_TryMutex (struct osi_mutex *); - -extern void osi_SleepR (long, struct osi_rwlock *); - -extern void osi_SleepW (long, struct osi_rwlock *); - -extern void osi_SleepM (long, struct osi_mutex *); - -extern void osi_Sleep (long); - -extern void osi_Wakeup (long); - -extern void lock_FinalizeRWLock(struct osi_rwlock *); - -extern void lock_FinalizeMutex(struct osi_mutex *); - -extern CRITICAL_SECTION osi_baseAtomicCS[]; - -/* and define the functions that create basic locks and mutexes */ - -extern void lock_InitializeRWLock(struct osi_rwlock *, char *); - -extern void lock_InitializeMutex(struct osi_mutex *, char *); - -extern void osi_Init (void); - -extern void lock_ConvertWToR(struct osi_rwlock *); - -/* and stat functions */ - -extern int lock_GetRWLockState(struct osi_rwlock *); - -extern int lock_GetMutexState(struct osi_mutex *); - -/* and init stuff */ - -extern void osi_BaseInit(void); - -/* and friendly macros */ - -#define lock_AssertRead(x) osi_assert(lock_GetRWLockState(x) & OSI_RWLOCK_READHELD) - -#define lock_AssertWrite(x) osi_assert(lock_GetRWLockState(x) & OSI_RWLOCK_WRITEHELD) - -#define lock_AssertAny(x) osi_assert(lock_GetRWLockState(x) != 0) - -#define lock_AssertMutex(x) osi_assert(lock_GetMutexState(x) & OSI_MUTEX_HELD) - -#endif /*_OSIBASEL_H_ENV_ */ diff --git a/src/WINNT/client_osi/osidb.c b/src/WINNT/client_osi/osidb.c deleted file mode 100644 index 54e4b8c38..000000000 --- a/src/WINNT/client_osi/osidb.c +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - - -#include -#include - -#include -#include -#include -#include "osi.h" -#include "dbrpc.h" -#include - -long osi_maxCalls = OSI_MAXRPCCALLS; - -static UUID debugType = { /* 95EEEAE0-1BD3-101B-8953-204C4F4F5020 */ - 0x95EEEAE0, - 0x1BD3, - 0x101B, - {0x89, 0x53, 0x20, 0x4C, 0x4F, 0x4F, 0x50, 0x20} -}; - -void dbrpc_Ping(handle_t handle) -{ - return; -} - -void dbrpc_GetFormat(handle_t handle, unsigned char *namep, long region, long index, - osi_remFormat_t *formatp, long *codep) -{ - osi_fdType_t *typep; - osi_fdTypeFormat_t *fp; - - typep = osi_FindFDType(namep); - if (typep == NULL) { - *codep = OSI_DBRPC_NOENTRY; /* no such type */ - return; - } - - for(fp = typep->formatListp; fp; fp=fp->nextp) { - if (region == fp->region && index == fp->index) { - /* found the one to return */ - strncpy(formatp->label, fp->labelp, sizeof(formatp->label)); - formatp->format = fp->format; - *codep = 0; - return; - } - } - - /* if we get here, we didn't find the type, so return no such entry */ - *codep = OSI_DBRPC_EOF; - return; -} - -void dbrpc_Open(handle_t handle, unsigned char *namep, osi_remHyper_t *fnp, long *codep) -{ - osi_fd_t *fdp; - - fdp = osi_AllocFD(namep); - if (!fdp) { - *codep = OSI_DBRPC_NOFD; - } - else { - /* wire supports 64 bits but we only use 32 */ - fnp->LowPart = fdp->fd; - fnp->HighPart = 0; - *codep = 0; - } -} - -void dbrpc_GetInfo(handle_t handle, osi_remHyper_t *fnp, osi_remGetInfoParms_t *parmsp, - long *codep) -{ - osi_fd_t *fdp; - - /* always init return values */ - parmsp->icount = 0; - parmsp->scount = 0; - - fdp = osi_FindFD(fnp->LowPart); - if (fdp) { - *codep = (fdp->opsp->GetInfo)(fdp, parmsp); - } - else *codep = OSI_DBRPC_NOFD; - - return; -} - -void dbrpc_Close(handle_t handle, osi_remHyper_t *fnp, long *codep) -{ - osi_fd_t *fdp; - - fdp = osi_FindFD(fnp->LowPart); - if (fdp) { - *codep = osi_CloseFD(fdp); - } - else - *codep = OSI_DBRPC_NOFD; -} - -#ifdef notdef -long osi_CleanupRPCEntry(char *exportName) -{ - UUID_VECTOR uuidvp; - RPC_NS_HANDLE thandle; - UUID tuuid; - long code; - - code = RpcNsEntryObjectInqBegin(RPC_C_NS_SYNTAX_DCE, exportName, &thandle); - if (code != RPC_S_OK && code != RPC_S_ENTRY_NOT_FOUND) return code; - while(1) { - code = RpcNsEntryObjectInqNext(thandle, &tuuid); - if (code == RPC_S_NO_MORE_MEMBERS) { - code = 0; - break; - } - else if (code != RPC_S_OK) { - break; - } - uuidvp.Count = 1; - uuidvp.Uuid[0] = &tuuid; - code = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DCE, exportName, dbrpc_v1_0_s_ifspec, - &uuidvp); - if (code != RPC_S_OK && code != RPC_S_INTERFACE_NOT_FOUND) break; - } - RpcNsEntryObjectInqDone(&thandle); - return code; -} -#endif /* notdef */ - -long osi_InitDebug(osi_uid_t *exportIDp) -{ - RPC_STATUS rpcStatus; - RPC_BINDING_VECTOR *bindingVector; - UUID_VECTOR uuidVector; - static osi_once_t once; - - if (!osi_Once(&once)) return 0; - - osi_Init(); - - osi_InitFD(); - - /* create local socket */ - rpcStatus = RpcServerUseAllProtseqs(osi_maxCalls, (void *) 0); - if (rpcStatus != RPC_S_OK) goto done; - - /* register sockets with runtime */ - rpcStatus = RpcServerRegisterIf(dbrpc_v1_0_s_ifspec, &debugType, NULL); - if (rpcStatus != RPC_S_OK) goto done; - - rpcStatus = RpcObjectSetType(exportIDp, &debugType); - if (rpcStatus != RPC_S_OK) goto done; - - rpcStatus = RpcServerInqBindings(&bindingVector); - if (rpcStatus != RPC_S_OK) goto done; - - /* the UUID_VECTOR structure contains an array of pointers to UUIDs, - * amazingly enough. Aren't those folks C programmers? Anyway, this - * represents the set of objects this server supports, and we register - * our unique UUID so that someone who finds our name can track down our - * unique instance, since the endpoint mapper doesn't see the name, but - * only sees the interface (duplicated of course) and the object UUID. - */ - uuidVector.Count = 1; - uuidVector.Uuid[0] = exportIDp; - -#ifdef notdef - /* don't use CDS any longer; too big and slow */ - rpcStatus = osi_CleanupRPCEntry(exportName); - if (rpcStatus) goto done; -#endif /* notdef */ - - rpcStatus = RpcEpRegister(dbrpc_v1_0_s_ifspec, bindingVector, - &uuidVector, (unsigned char *) 0); - if (rpcStatus != RPC_S_OK) goto done; - -#ifdef notdef - /* don't use CDS */ - rpcStatus = RpcNsBindingExport(RPC_C_NS_SYNTAX_DCE, exportName, - dbrpc_v1_0_s_ifspec, bindingVector, &uuidVector); -#endif /* notdef */ - - rpcStatus = RpcBindingVectorFree(&bindingVector); - if (rpcStatus != RPC_S_OK) goto done; - -#ifdef OSISTARTRPCSERVER /* Now done later */ - - /* now start server listening with appropriate # of threads */ - rpcStatus = RpcServerListen(osi_maxCalls, osi_maxCalls, /* dontwait */1); - if (rpcStatus != RPC_S_OK) goto done; - -#endif /* OSISTARTRPCSERVER */ - - rpcStatus = 0; - -done: - osi_EndOnce(&once); - return rpcStatus; -} diff --git a/src/WINNT/client_osi/osidb.h b/src/WINNT/client_osi/osidb.h deleted file mode 100644 index c68dc46d9..000000000 --- a/src/WINNT/client_osi/osidb.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef __OSIDB_H_ENV_ -#define __OSIDB_H_ENV_ 1 - -/* mapped over remote debugging integer array for rwlock and mutexes - * mutexes only have writers - */ -typedef struct osi_remLockInfo { - /* the type: rwlock or mutex */ - long type; - - /* the addr */ - long lockAddr; - - /* raw state */ - long readers; - long writers; /* should be 0 or 1 */ - long waiters; /* non-zero means someone waiting */ - long owner; /* one tid, not complete if >1 readers, 0 if unknown */ - - /* raw statistics, times in ms. For mutexes, we only - * fill in the write times. - */ - long writeLockedCount; - long writeLockedTime; - long writeBlockedCount; - long writeBlockedTime; - long readLockedCount; - long readLockedTime; - long readBlockedCount; - long readBlockedTime; -} osi_remLockInfo_t; - -/* mapped over remote debugging integer array */ -typedef struct osi_remSleepInfo { - long tid; /* thread id of the blocked thread */ - long sleepValue; /* the value we're sleeping at */ -} osi_remSleepInfo_t; - -#define OSI_MAXRPCCALLS 2 /* one for osidb, one for AFS RPC */ - -extern long osi_InitDebug(osi_uid_t *); - -/* only available within the OSI package */ -extern long osi_maxCalls; - -/* use this from outside of the OSI package */ -extern long *osi_maxCallsp; - -#endif /* __OSIDB_H_ENV_ */ - diff --git a/src/WINNT/client_osi/osidebug.c b/src/WINNT/client_osi/osidebug.c deleted file mode 100644 index 4da2fe94a..000000000 --- a/src/WINNT/client_osi/osidebug.c +++ /dev/null @@ -1,770 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - - -#include -#include - -#include -#include -#include -#include "osidebug.h" -#include "dbrpc.h" -#include -#include -#include -#include "osiutils.h" - -/* global instance for test program */ -HANDLE hInst; - -/* global window for debugging */ -HANDLE hGlobalWnd; - -/* binding handle we're connected to */ -RPC_BINDING_HANDLE main_remoteHandle; - -/* cache of formatting info */ -main_formatCache_t *main_allFormatsp; - -/* file name from dialog box */ -char main_fileName[256]; - -/* screen display image size */ -RECT screenRect; /* whole screen */ -HWND screenWnd; -RECT cb1Rect; /* button for first command */ -HWND cb1Wnd; -RECT cb2Rect; /* button for 2nd command */ -HWND cb2Wnd; -RECT cb3Rect; /* guess */ -HWND cb3Wnd; -RECT cb4Rect; /* guess */ -HWND cb4Wnd; -RECT nameRect; /* the edit name rectangle */ -HWND nameWnd; -RECT typesRect; /* types rectangle */ -HWND typesWnd; -RECT resultsRect; /* results rectangle */ -HWND resultsWnd; -RECT statusRect; /* status line */ -HWND statusWnd; - -/* height of a text line */ -int lineHeight; - -/* function to divide up the screen space among the rectangles */ -void main_Layout(HWND hWnd) -{ - long buttonWidth; - long stripeHeight; - - /* make the screen have 4 buttons on the top, then then name under - * that, and the results below that. - * NB ALL RECTS store width and height instead of right and bottom - */ - GetClientRect(hWnd, &screenRect); - buttonWidth = screenRect.right / 4; - stripeHeight = screenRect.bottom / 10; - - cb1Rect.top = 0; - cb1Rect.bottom = stripeHeight; - cb1Rect.left = 0; - cb1Rect.right = buttonWidth; - - cb2Rect.top = 0; - cb2Rect.bottom = stripeHeight; - cb2Rect.left = buttonWidth; - cb2Rect.right = buttonWidth; - - cb3Rect.top = 0; - cb3Rect.bottom = stripeHeight; - cb3Rect.left = 2*buttonWidth; - cb3Rect.right = buttonWidth; - - cb4Rect.top = 0; - cb4Rect.bottom = stripeHeight; - cb4Rect.left = 3*buttonWidth; - cb4Rect.right = buttonWidth; - - nameRect.top = stripeHeight; - nameRect.bottom = (3*lineHeight)/2; - nameRect.left = 0; - nameRect.right = (80*screenRect.right)/100; - - statusRect.top = screenRect.bottom - (3*lineHeight)/2; - statusRect.bottom = (3*lineHeight)/2; - statusRect.left = 0; - statusRect.right = screenRect.right; - - /* what's left goes to the results and type frames */ - resultsRect.top = nameRect.bottom + stripeHeight; - resultsRect.bottom = screenRect.bottom-resultsRect.top-statusRect.bottom; - resultsRect.left = screenRect.right/3; - resultsRect.right = (2*screenRect.right)/3; - - typesRect.top = nameRect.bottom + stripeHeight; - typesRect.bottom = screenRect.bottom-typesRect.top-statusRect.bottom; - typesRect.left = 0; - typesRect.right = screenRect.right/3; -} - -/**************************************************************************** - - FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int) - - PURPOSE: calls initialization function, processes message loop - -****************************************************************************/ - -int APIENTRY WinMain( - HANDLE hInstance, - HANDLE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow - ) -{ - MSG msg; - - - if (!InitApplication(hInstance)) - return (FALSE); - - if (!InitInstance(hInstance, nCmdShow)) - return (FALSE); - - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return (msg.wParam); -} - - -/**************************************************************************** - - FUNCTION: InitApplication(HANDLE) - - PURPOSE: Initializes window data and registers window class - -****************************************************************************/ - -BOOL InitApplication(HANDLE hInstance) -{ - WNDCLASS wc; - - /* create window class */ - wc.style = CS_DBLCLKS; /* double-click messages */ - wc.lpfnWndProc = (WNDPROC) MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = "InputMenu"; - wc.lpszClassName = "InputWClass"; - - return (RegisterClass(&wc)); -} - - -/**************************************************************************** - - FUNCTION: InitInstance(HANDLE, int) - - PURPOSE: Saves instance handle and creates main window - -****************************************************************************/ - -BOOL InitInstance( - HANDLE hInstance, - INT nCmdShow) -{ - HWND hWnd; - HDC hDC; - TEXTMETRIC textmetric; - - hInst = hInstance; - - /* create window itself */ - hWnd = CreateWindow( - "InputWClass", - "OSI Remote Debugging Application", - WS_OVERLAPPEDWINDOW, /* horz & vert scroll bars */ - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - NULL, - NULL, - hInstance, - NULL - ); - - if (!hWnd) - return (FALSE); - - hDC = GetDC(hWnd); - GetTextMetrics(hDC, &textmetric); - lineHeight = textmetric.tmExternalLeading + textmetric.tmHeight; - ReleaseDC(hWnd, hDC); - - main_allFormatsp = NULL; - - main_Layout(hWnd); - - /* now create children */ - cb1Wnd = CreateWindow("button", "Debug Server", - WS_CHILD|WS_VISIBLE, - cb1Rect.left, cb1Rect.top, cb1Rect.right, cb1Rect.bottom, - hWnd, (void *) IDM_CMD1, hInst, 0); - - cb2Wnd = CreateWindow("button", "Quit", - WS_CHILD|WS_VISIBLE, - cb2Rect.left, cb2Rect.top, cb2Rect.right, cb2Rect.bottom, - hWnd, (void *) IDM_CMD2, hInst, 0); - - cb3Wnd = CreateWindow("button", "Save to file", - WS_CHILD|WS_VISIBLE, - cb3Rect.left, cb3Rect.top, cb3Rect.right, cb3Rect.bottom, - hWnd, (void *) IDM_CMD3, hInst, 0); - - cb4Wnd = CreateWindow("button", "[Future 1]", - WS_CHILD|WS_VISIBLE, - cb4Rect.left, cb4Rect.top, cb4Rect.right, cb4Rect.bottom, - hWnd, (void *) IDM_CMD4, hInst, 0); - - nameWnd = CreateWindow("edit", "milkyway:1", - WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT, - nameRect.left, nameRect.top, nameRect.right, nameRect.bottom, - hWnd, (void *) IDM_NAME, hInst, 0); - - typesWnd = CreateWindow("listbox", "Collections", - WS_CHILD|WS_VISIBLE | WS_CAPTION | LBS_STANDARD, - typesRect.left, typesRect.top, typesRect.right, typesRect.bottom, - hWnd, (void *) IDM_TYPES, hInst, 0); - - resultsWnd = CreateWindow("listbox", "Results", - WS_CHILD|WS_VISIBLE | WS_CAPTION | LBS_NOTIFY|WS_VSCROLL|WS_BORDER, - resultsRect.left, resultsRect.top, resultsRect.right, resultsRect.bottom, - hWnd, (void *) IDM_RESULTS, hInst, 0); - - statusWnd = CreateWindow("edit", "", - WS_CHILD|WS_VISIBLE|WS_BORDER, - statusRect.left, statusRect.top, statusRect.right, statusRect.bottom, - hWnd, (void *) IDM_STATUS, hInst, 0); - - ShowWindow(hWnd, nCmdShow); - UpdateWindow(hWnd); - return (TRUE); - -} - -main_formatCache_t *main_GetFormatCache(RPC_BINDING_HANDLE handle, char *typep, - long region, long index) -{ - main_formatCache_t *fcp; - long code; - osi_remFormat_t format; - - for(fcp = main_allFormatsp; fcp; fcp = fcp->nextp) { - if (strcmp(typep, fcp->typep) == 0 && fcp->region == region - && fcp->index == index) { - /* found info, so return yes or not based - * upon whether there's a label. - */ - if (fcp->labelp) return fcp; - else return NULL; - } - } - - /* if we get here, we don't have a definitive answer; try to get one */ - RpcTryExcept { - dbrpc_GetFormat(handle, typep, region, index, &format, &code); - } - RpcExcept(1) { - code = RpcExceptionCode(); - } - RpcEndExcept; - - /* now, if code is 0 we win, and 1 means we know the entry doesn't exist. - * otherwise, we've failed and return such. - */ - if (code == 0 || code == 1) { - fcp = (main_formatCache_t *) malloc(sizeof(*fcp)); - fcp->typep = (char *) malloc(strlen(typep)+1); - strcpy(fcp->typep, typep); - fcp->region = region; - fcp->index = index; - if (code == 0) { - fcp->labelp = (char *) malloc(strlen(format.label)+1); - strcpy(fcp->labelp, format.label); - } - else fcp->labelp = NULL; /* no such entry */ - fcp->format = format.format; - - /* now thread it on */ - fcp->nextp = main_allFormatsp; - main_allFormatsp = fcp; - if (fcp->labelp) return fcp; - else return NULL; - } - else return NULL; -} - -#ifdef notdef -/* take a name and return a working binding to the server. Server must be - * exporting a dbrpc interface. - */ -main_GetBinding(char *name, RPC_BINDING_HANDLE *handlep) -{ - RPC_NS_HANDLE tempContext; /* context used for iteration */ - RPC_BINDING_HANDLE thp; /* temp handle we're using now */ - long code; - int count=0; - int valid; - - code = RpcNsBindingImportBegin(RPC_C_NS_SYNTAX_DCE, name, *dbrpc_v1_0_c_ifspecp, - (UUID *) 0, &tempContext); - if (code != RPC_S_OK) return code; - - /* this next line is useful when trying to debug things */ - // RpcNsMgmtHandleSetExpAge(tempContext, 0); - - valid = 0; /* is thp valid? */ - while (1) { - code = RpcNsBindingImportNext(tempContext, &thp); - if (code == RPC_S_NO_MORE_BINDINGS) break; /* we're done */ - - if (code != RPC_S_OK) { - RpcNsBindingImportDone(&tempContext); - return code; - } - - /* otherwise we have a putatively good binding; try it out - * with the probe interface and see if it really works - */ - code = RpcMgmtSetComTimeout(thp, 2); - - code = 0; - RpcTryExcept { - dbrpc_Ping(thp); - } - RpcExcept(1) { - code = RpcExceptionCode(); - } - RpcEndExcept; - - /* now, if call worked, we're done */ - if (code == 0) break; - - /* else cleanup the binding and try again */ - RpcBindingFree(&thp); - } - - /* cleanup and return */ - RpcNsBindingImportDone(&tempContext); - *handlep = thp; - return code; -} -#endif /* notdef */ - -main_GetBinding(char *hostNamep, UUID *exportIDp, RPC_BINDING_HANDLE *handlep) -{ - char *stringBindingp; - unsigned long code; - RPC_BINDING_HANDLE handle; - - code = RpcStringBindingCompose(NULL, "ncacn_ip_tcp", hostNamep, NULL, NULL, - &stringBindingp); - if (code) return code; - - code = RpcBindingFromStringBinding(stringBindingp, &handle); - if (code) goto done; - - code = RpcMgmtSetComTimeout(handle, /* short, but not too short, timeout */ 3); - if (code) { - RpcBindingFree(&handle); - goto done; - } - - code = RpcBindingSetObject(handle, exportIDp); - if (code) { - RpcBindingFree(&handle); - goto done; - } - - *handlep = handle; - code = 0; - -done: - RpcStringFree(&stringBindingp); - return code; -} - -main_RetrieveType(char *typep, RPC_BINDING_HANDLE remoteHandle, HWND hlistBox, int drawSeparator) -{ - long code; - long closeCode; - osi_remHyper_t fd; - osi_remGetInfoParms_t status; - char tstring[100]; - main_formatCache_t *fcp; - char separator[100]; - int addedAny; - int i; - - /* setup separator */ - wsprintf(separator, "===="); - - /* now lookup available stats collections by opening "type" well-known - * info. - */ - RpcTryExcept { - dbrpc_Open(remoteHandle, typep, &fd, &code); - } - RpcExcept(1) { - code = RpcExceptionCode(); - } - RpcEndExcept; - - if (code != 0) { - return code; - } - - /* now iterate over all info */ - addedAny = 0; - while (1) { - RpcTryExcept { - dbrpc_GetInfo(remoteHandle, &fd, &status, &code); - } - RpcExcept(1) { - code = RpcExceptionCode(); - } - RpcEndExcept; - - if (code != 0) break; - - /* draw separator, if we should. DrawSeparator tells us if - * we generally should do it, and addedAny, as a hack, tell us - * also if we're in the first pass or not, due to the fact - * that we don't set it until below. - */ - if (drawSeparator && addedAny) - SendMessage(hlistBox, LB_ADDSTRING, 0, (long) separator); - - /* we know there's something there */ - addedAny = 1; - - /* put out all the strings */ - for(i=0; ilabelp, status.sdata[i]); - else - wsprintf(tstring, "%s", status.sdata[i]); - SendMessage(hlistBox, LB_ADDSTRING, 0, (long) tstring); - } - - /* put out all the integers */ - for(i=0; iformat & OSI_DBRPC_HEX) - wsprintf(tstring, "%s: 0x%x", fcp->labelp, status.idata[i]); - else if (fcp->format & OSI_DBRPC_SIGNED) - wsprintf(tstring, "%s: %d", fcp->labelp, status.idata[i]); - else - wsprintf(tstring, "%s: %u", fcp->labelp, status.idata[i]); - } else - wsprintf(tstring, "%u", status.idata[i]); - SendMessage(hlistBox, LB_ADDSTRING, 0, (long) tstring); - } - } - - if (!addedAny) - SendMessage(hlistBox, LB_ADDSTRING, 0, (long) "[No entries]"); - - /* finally close the FD */ - RpcTryExcept { - dbrpc_Close(remoteHandle, &fd, &closeCode); - } - RpcExcept(1) { - closeCode = RpcExceptionCode(); - } - RpcEndExcept; - - /* now, we succeed if code is 0 or EOF */ - if (code == 0 || code == OSI_DBRPC_EOF) return 0; - else return code; -} - -/**************************************************************************** - - FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG) - - PURPOSE: Processes messages - -****************************************************************************/ - -LONG APIENTRY MainWndProc( - HWND hWnd, - UINT message, - UINT wParam, - LONG lParam) -{ - FARPROC lpProcAbout; - - HDC hDC; /* display-context variable */ - PAINTSTRUCT ps; /* paint structure */ - char tbuffer[1000]; - long code; - long index; - long junk; - HANDLE fileHandle; - - switch (message) { - case WM_COMMAND: - if (LOWORD(wParam) == IDM_ABOUT) { - lpProcAbout = (FARPROC) About; - - DialogBox(hInst, - "AboutBox", - hWnd, - lpProcAbout); - - break; - } - if (LOWORD(wParam) == IDM_HELP) { - WinHelp(hWnd, "osidebug.hlp", HELP_CONTENTS, 0L); - return 0; - } - if (LOWORD(wParam) == IDM_CMD1) { - char hostName[256]; - UUID exportID; - char *tp; - long longID; - - hGlobalWnd = hWnd; - SendMessage(typesWnd, LB_RESETCONTENT, 0, 0); - SendMessage(resultsWnd, LB_RESETCONTENT, 0, 0); - GetWindowText(nameWnd, tbuffer, sizeof(tbuffer)); - if (main_remoteHandle != NULL) { - RpcBindingFree(&main_remoteHandle); - main_remoteHandle = NULL; - } - - /* parse milkyway:3 into host milkyway, UUID 3 */ - strcpy(hostName, tbuffer); - tp = strrchr(hostName, ':'); - if (tp) { - /* parse UID */ - *tp = 0; - longID = atoi(tp+1); - osi_LongToUID(longID, &exportID); - } - else - osi_LongToUID(0, &exportID); - - code = main_GetBinding(hostName, &exportID, &main_remoteHandle); - if (code == 0) { - code = main_RetrieveType("type", main_remoteHandle, typesWnd, 0); - if (code) { - wsprintf(tbuffer, "Can't obtain collection names, code %d", - code); - main_SetStatus(tbuffer); - } - else main_SetStatus("Done."); - } - else { - wsprintf(tbuffer, "Bind failed, code %d", code); - main_SetStatus(tbuffer); - } - InvalidateRect(hWnd, &screenRect, TRUE); - } - else if (LOWORD(wParam) == IDM_CMD2) { - PostQuitMessage(0); - break; - } - else if (LOWORD(wParam) == IDM_CMD3) { - if (DialogBox(hInst, - "FileBox", - hWnd, - (FARPROC) FileProc) == FALSE) break; - - /* otherwise we have a file name, so go on */ - fileHandle = CreateFile(main_fileName, - GENERIC_READ | GENERIC_WRITE, - /* share mode */ 0, - /* security */ NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - /* template */ NULL); - if (fileHandle == INVALID_HANDLE_VALUE) break; - for(index=0;;index++) { - code = SendMessage(resultsWnd, LB_GETTEXT, index, (long) tbuffer); - if (code == LB_ERR) break; - strcat(tbuffer, "\n"); - WriteFile(fileHandle, tbuffer, strlen(tbuffer), &junk, NULL); - } /* for loop writing out data */ - CloseHandle(fileHandle); - break; - } - else if (LOWORD(wParam) == IDM_CMD4) { - MessageBeep(0); - main_SetStatus("Future 1 not implemented"); - } - else if (LOWORD(wParam) == IDM_TYPES) { - if (HIWORD(wParam) == LBN_SELCHANGE) { - /* if we get here, someone selected a collection to retrieve */ - SendMessage(resultsWnd, LB_RESETCONTENT, 0, 0); - index = SendMessage(typesWnd, LB_GETCURSEL, 0, 0); - if (index != LB_ERR || main_remoteHandle == NULL) { - SendMessage(typesWnd, LB_GETTEXT, index, (long) tbuffer); - code=main_RetrieveType(tbuffer, main_remoteHandle, resultsWnd, 1); - if (code != 0) { - wsprintf(tbuffer, "Can't fetch collection, code %d", code); - main_SetStatus(tbuffer); - } - else main_SetStatus("Done."); - } - else main_SetStatus("Internal inconsistency finding selection!"); - } - } - else - return (DefWindowProc(hWnd, message, wParam, lParam)); - break; - - case WM_PAINT: - /* make kids draw, too */ - InvalidateRect(hWnd, &screenRect, TRUE); - - hDC = BeginPaint (hWnd, &ps); - /* nothing to draw, right? */ - EndPaint(hWnd, &ps); - break; - - case WM_SIZE: - main_Layout(hWnd); - MoveWindow(cb1Wnd, cb1Rect.left, cb1Rect.top, cb1Rect.right, cb1Rect.bottom, 1); - MoveWindow(cb2Wnd, cb2Rect.left, cb2Rect.top, cb2Rect.right, cb2Rect.bottom, 1); - MoveWindow(cb3Wnd, cb3Rect.left, cb3Rect.top, cb3Rect.right, cb3Rect.bottom, 1); - MoveWindow(cb4Wnd, cb4Rect.left, cb4Rect.top, cb4Rect.right, cb4Rect.bottom, 1); - MoveWindow(nameWnd, nameRect.left, nameRect.top, nameRect.right, nameRect.bottom, 1); - MoveWindow(statusWnd, statusRect.left, statusRect.top, statusRect.right, - statusRect.bottom, 1); - MoveWindow(typesWnd, typesRect.left, typesRect.top, typesRect.right, - typesRect.bottom, 1); - MoveWindow(resultsWnd, resultsRect.left, resultsRect.top, resultsRect.right, - resultsRect.bottom, 1); - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - default: - return (DefWindowProc(hWnd, message, wParam, lParam)); - } - return (0); -} - - -/**************************************************************************** - - FUNCTION: About(HWND, unsigned, WORD, LONG) - - PURPOSE: Processes messages for "About" dialog box - - MESSAGES: - - WM_INITDIALOG - initialize dialog box - WM_COMMAND - Input received - -****************************************************************************/ - -BOOL APIENTRY FileProc( - HWND hDlg, - UINT message, - UINT wParam, - LONG lParam) -{ - long code; - char tname[256]; - - switch (message) { - case WM_INITDIALOG: - DlgDirList(hDlg, "*.*", IDM_FILEBOX, IDM_FILENAME, DDL_DIRECTORY|DDL_DRIVES); - return (TRUE); - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) { - GetDlgItemText(hDlg, IDM_FILENAME, main_fileName, sizeof(main_fileName)); - EndDialog(hDlg, TRUE); - return (TRUE); - } - else if (LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, FALSE); - return TRUE; - } - else if (LOWORD(wParam) == IDM_FILEBOX) { - switch (HIWORD(wParam)) { - case LBN_DBLCLK: - code = DlgDirSelectEx(hDlg, tname, sizeof(tname), IDM_FILEBOX); - if (code == 0) { - /* have a selection */ - strcpy(main_fileName, tname); - EndDialog(hDlg, TRUE); - } - else { - /* have a dir */ - DlgDirList(hDlg, tname, IDM_FILEBOX, IDM_FILENAME, DDL_DIRECTORY|DDL_DRIVES); - } - break; - }; /* switch */ - return TRUE; - } - break; - } - return (FALSE); - UNREFERENCED_PARAMETER(lParam); -} - -BOOL APIENTRY About( - HWND hDlg, - UINT message, - UINT wParam, - LONG lParam) -{ - switch (message) { - case WM_INITDIALOG: - return (TRUE); - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) { - EndDialog(hDlg, TRUE); - return (TRUE); - } - break; - } - return (FALSE); - UNREFERENCED_PARAMETER(lParam); -} - -void main_SetStatus(char *status) -{ - SetWindowText(statusWnd, status); - InvalidateRect(statusWnd, (RECT *) 0, 1); - UpdateWindow(statusWnd); -} diff --git a/src/WINNT/client_osi/osidebug.def b/src/WINNT/client_osi/osidebug.def deleted file mode 100644 index 50a2c41c1..000000000 --- a/src/WINNT/client_osi/osidebug.def +++ /dev/null @@ -1,17 +0,0 @@ -NAME osidebug - -DESCRIPTION 'OSI Remote Debugging Program' - -EXETYPE WINDOWS - -STUB 'WINSTUB.EXE' - -CODE PRELOAD MOVEABLE -DATA PRELOAD MOVEABLE MULTIPLE - -HEAPSIZE 1024 -STACKSIZE 8192 - -EXPORTS - MainWndProc @1 - About @2 diff --git a/src/WINNT/client_osi/osidebug.h b/src/WINNT/client_osi/osidebug.h deleted file mode 100644 index ba628375e..000000000 --- a/src/WINNT/client_osi/osidebug.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#define IDM_CMD1 101 -#define IDM_CMD2 102 -#define IDM_CMD3 103 -#define IDM_CMD4 104 -#define IDM_NLABEL 105 /* never sent */ -#define IDM_NAME 106 /* name */ -#define IDM_TYPES 107 /* result list */ -#define IDM_RESULTS 108 /* result list */ -#define IDM_STATUS 109 - -#define IDM_ABOUT 1000 /* about box */ -#define IDM_HELP 1001 /* get help */ - -#define IDM_FILEBOX 2000 /* for getting file name */ -#define IDM_FILENAME 2001 /* for getting file name */ - -/* this define is generated by manually to correspond to dbrpc_ClientIfHandle. - * It turns out that the MS linker adds an extra level of indirection to exported - * globals. Rather than use confusing names, we rename the thing to have an extra - * p suffix, but since no one's defining the type of this symbol, we do it manually - * here. - */ -extern RPC_IF_HANDLE *dbrpc_v1_0_c_ifspecp; - -BOOL InitApplication(HANDLE); -BOOL InitInstance(HANDLE, INT); -LONG APIENTRY MainWndProc(HWND, UINT, UINT, LONG); -BOOL APIENTRY About(HWND, UINT, UINT, LONG); -BOOL APIENTRY FileProc(HWND, UINT, UINT, LONG); - -typedef struct main_formatCache { - struct main_formatCache *nextp; - char *typep; - long region; - long index; - char *labelp; /* null means we know this doesn't exist */ - long format; -} main_formatCache_t; - -extern void main_SetStatus(char *); - -/* max of 10 lines on the screen */ -#define HW_NLINES 10 - -/* screen image to write to from tests - * This shouldn't be global, but it doesn't matter that much. - */ -extern char main_screenText[HW_NLINES][80]; - -#ifdef WIN32 -#define GET_WM_HSCROLL_CODE(wp, lp) LOWORD(wp) -#define GET_WM_HSCROLL_POS(wp, lp) HIWORD(wp) -#define GET_WM_HSCROLL_HWND(wp, lp) (HWND)(lp) -#else -#define GET_WM_HSCROLL_CODE(wp, lp) (wp) -#define GET_WM_HSCROLL_POS(wp, lp) LOWORD(lp) -#define GET_WM_HSCROLL_HWND(wp, lp) (HWND)HIWORD(lp) -#endif diff --git a/src/WINNT/client_osi/osidebug.hpj b/src/WINNT/client_osi/osidebug.hpj deleted file mode 100644 index df3e91523..000000000 --- a/src/WINNT/client_osi/osidebug.hpj +++ /dev/null @@ -1,6 +0,0 @@ -[OPTIONS] -COMPRESS=TRUE -TITLE=OSIDebug Help - -[FILES] -osidebug.rtf diff --git a/src/WINNT/client_osi/osidebug.rc b/src/WINNT/client_osi/osidebug.rc deleted file mode 100644 index 27ebddfe9..000000000 --- a/src/WINNT/client_osi/osidebug.rc +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include "windows.h" -#include "osidebug.h" - -InputMenu MENU -BEGIN - POPUP "&Help" - BEGIN - MENUITEM "&About osidebug...", IDM_ABOUT - MENUITEM "&Contents", IDM_HELP - END -END - -AboutBox DIALOG 22, 17, 144, 75 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -BEGIN - CTEXT "Marmara Systems" -1, 0, 5, 144, 8 - CTEXT "Remote Debugging Application" -1, 0, 14, 144, 8 - DEFPUSHBUTTON "OK" IDOK, 53, 59, 32, 14, WS_GROUP -END - -FileBox DIALOG 20, 20, 100, 85 -STYLE WS_POPUP | WS_DLGFRAME -BEGIN - LISTBOX IDM_FILEBOX, 0, 0, 100, 60, WS_VSCROLL | LBS_SORT | LBS_NOTIFY - EDITTEXT IDM_FILENAME, 0, 60, 100, 15, ES_AUTOHSCROLL - DEFPUSHBUTTON "OK" IDOK, 0, 75, 50, 10, WS_GROUP - PUSHBUTTON "CANCEL" IDCANCEL, 50, 75, 50, 10, WS_GROUP -END diff --git a/src/WINNT/client_osi/osidebug.rtf b/src/WINNT/client_osi/osidebug.rtf deleted file mode 100644 index e573b7883..000000000 --- a/src/WINNT/client_osi/osidebug.rtf +++ /dev/null @@ -1,228 +0,0 @@ -{\rtf1\ansi - -{\fonttbl -\f0\froman Times New Roman; -\f1\fdecor Courier New;} - -{\colortbl -\red0\green0\blue0; -\red255\green0\blue0; -\red0\green0\blue255; -\red255\green255\blue0;} - -\sb200 - -\f0 -\fs25 - -#{\footnote contents} -${\footnote Contents} - -\fs40 -{\uldb Introduction}{\v intro} -\par - -{\uldb Starting and Connecting OSIDebug}{\v startup} -\par - -{\uldb Sleep Info}{\v sleep} -\par - -{\uldb Lock Info}{\v lock} -\par - -\fs25 -\page - -#{\footnote intro} -${\footnote Introduction} -+{\footnote x:010} - -\fs40\cf2 Introduction\cf0\fs25 -\par - -The osidebug program retrieves information from running programs using -the OSI package (libosi.lib). The information you can retrieve depends -partly upon the information that the programmer is gathering, but can include -information on blocked processes and held locks. -\par - -\page - -#{\footnote startup} -${\footnote Starting OSIDebug} -+{\footnote x:020} - -\fs40\cf2 Starting OSIDebug\cf0\fs25 -\par - -The osidebug program is started by running it through the program manager -or the command line: -\par - -\f1 - osidebug\line -\f0 -\par - -It starts by bringing up a window. -\par - -To debug any program, you must know the RPC NSI name space entry that the -program has exported its debugging interface to; this is the name parameter that -was passed to \f1 osi_InitDebug()\f0 in the application program. -\par - -You specify this name to \f1osidebug\f0 by clicking on the RPC NSI name entry window -(it will have a default name beginning with "/.:/" in it already) and typing -the RPC NSI name, including the "/.:", that your server is using. -\par - -Your next step is to connect the \f1osidebug\f0 to the program by clicking on the -\f1Debug Server\f0 button. At this time, \f1osidebug\f0 will bind to the server, or -display an error number in the status line at the bottom of the window if it fails. -\par - -If the program succeeds at binding to your application, it will display "Done." at the -bottom of the display, and will display a set of collection names in the "Collections" -window. -\par - -You can click on any of the collection names and \f1osidebug\f0 will retrieve that collection -and place it in the "Results" window. There are three collections exported generically, the -"types" collection, which lists the collection names, the "sleep" collection, which provides -information on sleeping threads, and the "lock" collection, which provides information on -locking statistics, assuming that the application is gathering that information. -\par - -There isn't much more to say about the "types" collection. The remaining collections are -described in more detail in the next sections. -\par - -You can quit the program by clicking on the \f1Quit\f0 button. -\par - -You can rebind to the server at any time by clicking on the \f1Debug Server\f0 button again. -The \f1osidebug\f0 program will reload the set of collection names at this time, and -re-establish the RPC bindings. You will also need to use this button if the application being -debugged is restarted, since the old RPC binding will go bad at this time, and attempts to -view collections of information will fail. -\par - -It is also possible for users to define their own named collections of data to be viewed by -the \f1osidebug\f0 program. See the documentation from your application program for the -detailed information on those information collections. -\par - -\page - -#{\footnote sleep} -${\footnote Sleep Information} -+{\footnote x:030} - -\fs40\cf2 Getting Sleep Information\cf0\fs25 -\par - -You can click on the "sleep" collection name and \f1osidebug\f0 will retrieve -information on sleeping threads, if any. -\par - -For each blocked thread, \f1osidebug\f0 will display several lines. The first line is -labelled "Sleep address", and gives the hex value of the sleep value passed to the -OSI sleep function; if the thread is sleeping waiting for a lock or mutex to become -available, this will be the address of the lock. -\par - -The second line gives the thread ID of the blocked thread. -\par - -The third line, labelled "States", gives the state of the sleeping thread's sleep control -block. This is an OR-ed bit mask of the following bits: -\par - -\f1 -#define OSI_SLEEPINFO_SIGNALLED 1 /* thread has been signalled */ \line -#define OSI_SLEEPINFO_INHASH 2 /* sleep info is in hash table */ \line -#define OSI_SLEEPINFO_DELETED 4 /* sleep info will be deleted when refcount is 0 */ \line -\f0 -\par - -Typically, you'll just see the INHASH state set, indicating that the block is in the hash -table (where it is while the thread is blocked); this will be reported as a States value of -2. Infrequently, you may see the other state bits set, which typically indicates that -the \f1osidebug\f0 program caught the system between the time that the thread was woken by -a call to \f1osiwakeup\f0 and the time that the newly woken thread started executing. These -other states should be transient; if a block stays in one of these states for an appreciable -amount of time, it probably indicates a bug in the OSI package. -\par - -\page - -#{\footnote lock} -${\footnote Lock Information} -+{\footnote x:040} - -\fs40\cf2 Getting Lock Information\cf0\fs25 -\par - -You can click on the "lock" collection name and \f1osidebug\f0 will retrieve -information on locks initialized in statistics gathering mode (created after the -application programmer calls osi_LockTypeSetDefault("stat")). -\par - -When you do so, \f1osidebug\f0 will retrieve information about the currently known -locks and display this information in the "Results" window. The information consists of -several lines: -\par - -The "Lock name" gives the name passed in as the second parameter to the lock's initialization -call, when the programmer called \f1lock_InitializeMutex\f0 or \f1lock_InitializeRWLock\f0. -The programmer should choose a usefully mnemonic name. -\par - -The "Lock address" field gives the address of the lock structure in hex. If some thread -is waiting for this lock, it will be sleeping with the same address as its sleep value. -\par - -The "Writer count" is the count of the number of threads holding this lock for writing. -Since write locks can be held by at most one thread at a time, this count will be either 0, -if the lock is not held, or 1 if it is held. If the lock is a mutex object, rather than a -read/write lock, this field will be used to indicate whether someone is holding the mutex. -\par - -The "Reader count" is the count of the number of threads holding the lock for reading. -Since multiple readers can lock a read/write lock concurrently, this count may be anything from -0, indicating that the lock isn't read locked at all, to any number. This field should never -be non-zero at the same time that the "Writer count" field is also non-zero. For mutex locks, -this counter is always zero. -\par - -The "Are waiters" field is zero if there are no threads waiting to obtain this lock in a -mode incompatible with the way that it is currently held, or 1 if there are threads waiting for -the lock. -\par - -The "Write-locked time" field gives the number of milliseconds that this lock has been write -locked (or locked at all, if this is a mutex) by any thread. -\par - -The "Write-locked count" field gives the number of calls that obtained this lock for writing -(or that obtained the mutex at all, if this is a mutex). -\par - -The "Write-blocked time" field gives the number of milliseconds that threads trying to -obtain a write lock (or any mutex) have been waiting for this lock or mutex. -\par - -The "Write-blocked count" gives the number of calls to write-lock a read/write lock, or -the number of calls to obtain a mutex, that blocked due to a lock conflict. -\par - -The "Read-locked time", "Read-locked count", "Read-blocked time" and "Read-blocked count" fields -give the corresponding information for readers obtaining read/write locks. These fields are -not displayed for mutexes, since their information is inapplicable to those types of locks. -\par - -\page - -} diff --git a/src/WINNT/client_osi/osievent.mc b/src/WINNT/client_osi/osievent.mc deleted file mode 100644 index cba0d23d5..000000000 --- a/src/WINNT/client_osi/osievent.mc +++ /dev/null @@ -1,393 +0,0 @@ -;// * -;// * Copyright 2000, International Business Machines Corporation andothers. -;// * All Rights Reserved. -;// * -;// * This software has been released under the terms of the IBM Public -;// * License. For details, see the LICENSE file in the top-level source -;// * directory or online at http://www.openafs.org/dl/license10.html -;// * -;// To change the maximum size of the Windows NT or Windows 2000 Security event log file (in kilobytes) you can use the Event Viewer to indirectly modify the registry or to apply the registry hack directly: -;// -;// Hive: HKEY_LOCAL_MACHINE -;// Key: SYSTEM\CurrentControlSet\Services\EventLog\Security -;// Name: MaxSize -;// Type: REG_DWORD -;// Value: 512 default=512K - -;#ifndef _AFSDEVENT_H_ -;#define _AFSDEVENT_H_ -; -SeverityNames=(Success=0x0 - Informational=0x1 - Warning=0x2 - Error=0x3 - ) -FacilityNames=(Interface=0x04) - -MessageId=1 -SymbolicName=MSGID_WARNING_CAT -Language=English -Warning -. -MessageId= -SymbolicName=MSGID_INFO_CAT -Language=English -Info -. -MessageId= -SymbolicName=MSGID_ERROR_CAT -Language=English -Error -. -MessageId= -SymbolicName=SENDNOTDONE -Language=English -SENDNOTDONE -. -MessageId= -SymbolicName=SMBILLEGAL -Language=English -SMBILLEGAL -. -MessageId= -SymbolicName=SMB_COM_CREATE_DIRECTORY -Language=English -SMB_COM_CREATE_DIRECTORY -. -MessageId= -SymbolicName=SMB_COM_DELETE_DIRECTORY -Language=English -SMB_COM_DELETE_DIRECTORY -. -MessageId= -SymbolicName=SMB_COM_OPEN -Language=English -SMB_COM_OPEN -. -MessageId= -SymbolicName=SMB_COM_CREATE -Language=English -SMB_COM_CREATE -. -MessageId= -SymbolicName=SMB_COM_CLOSE -Language=English -SMB_COM_CLOSE -. -MessageId= -SymbolicName=SMB_COM_FLUSH -Language=English -SMB_COM_FLUSH -. -MessageId= -SymbolicName=SMB_COM_DELETE -Language=English -SMB_COM_DELETE -. -MessageId= -SymbolicName=SMB_COM_RENAME -Language=English -SMB_COM_RENAME -. -MessageId= -SymbolicName=SMB_COM_QUERY_INFORMATION -Language=English -SMB_COM_QUERY_INFORMATION -. -MessageId= -SymbolicName=SMB_COM_SET_INFORMATION -Language=English -SMB_COM_SET_INFORMATION -. -MessageId= -SymbolicName=SMB_COM_READ -Language=English -SMB_COM_READ -. -MessageId= -SymbolicName=SMB_COM_WRITE -Language=English -SMB_COM_WRITE -. -MessageId= -SymbolicName=SMB_COM_LOCK_BYTE_RANGE -Language=English -SMB_COM_LOCK_BYTE_RANGE -. -MessageId= -SymbolicName=SMB_COM_UNLOCK_BYTE_RANGE -Language=English -SMB_COM_UNLOCK_BYTE_RANGE -. -MessageId= -SymbolicName=SMB_COM_CREATE_TEMPORARY -Language=English -SMB_COM_CREATE_TEMPORARY -. -MessageId= -SymbolicName=SMB_COM_CREATE_NEW -Language=English -SMB_COM_CREATE_NEW -. -MessageId= -SymbolicName=SMB_COM_CHECK_DIRECTORY -Language=English -SMB_COM_CHECK_DIRECTORY -. -MessageId= -SymbolicName=SMB_COM_PROCESS_EXIT -Language=English -SMB_COM_PROCESS_EXIT -. -MessageId= -SymbolicName=SMB_COM_SEEK -Language=English -SMB_COM_SEEK -. -MessageId= -SymbolicName=SMB_COM_LOCK_AND_READ -Language=English -SMB_COM_LOCK_AND_READ -. -MessageId= -SymbolicName=SMB_COM_WRITE_AND_UNLOCK -Language=English -SMB_COM_WRITE_AND_UNLOCK -. -MessageId= -SymbolicName=MSGID_V3Tran2A -Language=English -V3Tran2A -. -MessageId= -SymbolicName=SMB_COM_READ_RAW -Language=English -SMB_COM_READ_RAW -. -MessageId= -SymbolicName=SMB_COM_WRITE_RAW -Language=English -SMB_COM_WRITE_RAW -. -MessageId= -SymbolicName=SMB_COM_SET_INFORMATION2 -Language=English -SMB_COM_SET_INFORMATION2 -. -MessageId= -SymbolicName=SMB_COM_QUERY_INFORMATION2 -Language=English -SMB_COM_QUERY_INFORMATION2 -. -MessageId= -SymbolicName=SMB_COM_LOCKING_ANDX -Language=English -SMB_COM_LOCKING_ANDX -. -MessageId= -SymbolicName=SMB_COM_COPY -Language=English -SMB_COM_COPY -. -MessageId= -SymbolicName=SMB_COM_ECHO -Language=English -SMB_COM_ECHO -. -MessageId= -SymbolicName=SMB_COM_OPEN_ANDX -Language=English -SMB_COM_OPEN_ANDX -. -MessageId= -SymbolicName=SMB_COM_READ_ANDX -Language=English -SMB_COM_READ_ANDX -. -MessageId= -SymbolicName=SMB_COM_TRANSACTION2 -Language=English -SMB_COM_TRANSACTION2 -. -MessageId= -SymbolicName=SMB_COM_TRANSACTION2_SECONDARY -Language=English -SMB_COM_TRANSACTION2_SECONDARY -. -MessageId= -SymbolicName=SMB_COM_FIND_CLOSE2 -Language=English -SMB_COM_FIND_CLOSE2 -. -MessageId= -SymbolicName=SMB_COM_FIND_NOTIFY_CLOSE -Language=English -SMB_COM_FIND_NOTIFY_CLOSE -. -MessageId= -SymbolicName=SMB_COM_TREE_CONNECT -Language=English -SMB_COM_TREE_CONNECT -. -MessageId= -SymbolicName=SMB_COM_TREE_DISCONNECT -Language=English -SMB_COM_TREE_DISCONNECT -. -MessageId= -SymbolicName=SMB_COM_NEGOTIATE -Language=English -SMB_COM_NEGOTIATE -. -MessageId= -SymbolicName=SMB_COM_SESSION_SETUP_ANDX -Language=English -SMB_COM_SESSION_SETUP_ANDX -. -MessageId= -SymbolicName=SMB_COM_LOGOFF_ANDX -Language=English -SMB_COM_LOGOFF_ANDX -. -MessageId= -SymbolicName=SMB_COM_TREE_CONNECT_ANDX -Language=English -SMB_COM_TREE_CONNECT_ANDX -. -MessageId= -SymbolicName=SMB_COM_QUERY_INFORMATION_DISK -Language=English -SMB_COM_QUERY_INFORMATION_DISK -. -MessageId= -SymbolicName=SMB_COM_SEARCH -Language=English -SMB_COM_SEARCH -. -MessageId= -SymbolicName=SMB_COM_NT_TRANSACT -Language=English -SMB_COM_NT_TRANSACT -. -MessageId= -SymbolicName=SMB_COM_NT_CREATE_ANDX -Language=English -SMB_COM_NT_CREATE_ANDX -. -MessageId= -SymbolicName=SMB_COM_NT_CANCEL -Language=English -SMB_COM_NT_CANCEL -. -MessageId= -SymbolicName=TRANS2_OPEN2 -Language=English -TRANS2_OPEN2 -. -MessageId= -SymbolicName=TRANS2_FIND_FIRST2 -Language=English -TRANS2_FIND_FIRST2 -. -MessageId= -SymbolicName=TRANS2_FIND_NEXT2 -Language=English -TRANS2_FIND_NEXT2 -. -MessageId= -SymbolicName=TRANS2_QUERY_FS_INFORMATION -Language=English -TRANS2_QUERY_FS_INFORMATION -. -MessageId= -SymbolicName=TRANS2_QUERY_PATH_INFORMATION -Language=English -TRANS2_QUERY_PATH_INFORMATION -. -MessageId= -SymbolicName=TRANS2_SET_PATH_INFORMATION -Language=English -TRANS2_SET_PATH_INFORMATION -. -MessageId= -SymbolicName=TRANS2_QUERY_FILE_INFORMATION -Language=English -TRANS2_QUERY_FILE_INFORMATION -. -MessageId= -SymbolicName=TRANS2_SET_FILE_INFORMATION -Language=English -TRANS2_SET_FILE_INFORMATION -. -MessageId= -SymbolicName=TRANS2_FSCTL -Language=English -TRANS2_FSCTL -. -MessageId= -SymbolicName=TRANS2_IOCTL2 -Language=English -TRANS2_IOCTL2 -. -MessageId= -SymbolicName=TRANS2_FIND_NOTIFY_FIRST -Language=English -TRANS2_FIND_NOTIFY_FIRST -. -MessageId= -SymbolicName=MSGID_Tran2SetFileInfo -Language=English -Tran2SetFileInfo -. -MessageId= -SymbolicName=TRANS2_FIND_NOTIFY_NEXT -Language=English -TRANS2_FIND_NOTIFY_NEXT -. -MessageId= -SymbolicName=TRANS2_CREATE_DIRECTORY -Language=English -TRANS2_CREATE_DIRECTORY -. -MessageId= -SymbolicName=TRANS2_SESSION_SETUP -Language=English -TRANS2_SESSION_SETUP -. -MessageId= -SymbolicName=TRANS2_GET_DFS_REFERRAL -Language=English -TRANS2_GET_DFS_REFERRAL -. -MessageId= -SymbolicName=TRANS2_REPORT_DFS_INCONSISTENCY -Language=English -TRANS2_REPORT_DFS_INCONSISTENCY -. -MessageId=126 -Severity=Error -SymbolicName=MSGID_ERROR -Language=English -Error: %1 -. -MessageId=127 -Severity=Warning -SymbolicName=MSGID_WARNING -Language=English -Warning: %1 -. -MessageId=128 -Severity=Informational -SymbolicName=MSGID_GENERAL -Language=English -%1 -. -MessageId=256 -Severity=Informational -SymbolicName=MSGID_SMB -Language=English -%1 -. -; -;#endif // _AFSDEVENT_H_ -; diff --git a/src/WINNT/client_osi/osifd.c b/src/WINNT/client_osi/osifd.c deleted file mode 100644 index e5ab641ed..000000000 --- a/src/WINNT/client_osi/osifd.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - - -#include -#include - -#ifndef DJGPP -#include -#include -#include "dbrpc.h" -#endif /* !DJGPP */ -#include -#include "osi.h" -#include - -static Crit_Sec osi_fdCS; -osi_fd_t *osi_allFDs; -osi_fdType_t *osi_allFDTypes; -long osi_nextFD = 0; - -osi_fdOps_t osi_TypeFDOps = { - osi_FDTypeCreate, -#ifndef DJGPP - osi_FDTypeGetInfo, -#endif - osi_FDTypeClose -}; - -/* called while holding osi_fdCS, returns named type or null pointer */ -osi_fdType_t *osi_FindFDType(char *namep) -{ - osi_fdType_t *ftp; - - for(ftp = osi_allFDTypes; ftp; ftp = (osi_fdType_t *) osi_QNext(&ftp->q)) { - if (strcmp(ftp->namep, namep) == 0) break; - } - - return ftp; -} - -long osi_UnregisterFDType(char *namep) -{ - osi_fdType_t *ftp; - osi_fdTypeFormat_t *ffp; - osi_fdTypeFormat_t *nffp; - - /* check for dup name */ - thrd_EnterCrit(&osi_fdCS); - ftp = osi_FindFDType(namep); - if (!ftp) return -1; - - /* free subsidiary storage, and remove from list */ - free(ftp->namep); - osi_QRemove((osi_queue_t **) &osi_allFDTypes, &ftp->q); - - /* free format structs */ - for(ffp = ftp->formatListp; ffp; ffp=nffp) { - nffp = ffp->nextp; - free(ffp->labelp); - free(ffp); - } - - /* free main storage */ - free(ftp); - - /* cleanup and go */ - thrd_LeaveCrit(&osi_fdCS); - return 0; -} - -osi_fdType_t *osi_RegisterFDType(char *namep, osi_fdOps_t *opsp, void *datap) -{ - osi_fdType_t *ftp; - - /* check for dup name */ - thrd_EnterCrit(&osi_fdCS); - osi_assertx(osi_FindFDType(namep) == NULL, "registering duplicate iteration type"); - - ftp = (osi_fdType_t *) malloc(sizeof(*ftp)); - - ftp->namep = (char *) malloc(strlen(namep)+1); - strcpy(ftp->namep, namep); - - ftp->rockp = datap; - - ftp->opsp = opsp; - - ftp->formatListp = NULL; - - osi_QAdd((osi_queue_t **) &osi_allFDTypes, &ftp->q); - thrd_LeaveCrit(&osi_fdCS); - - return ftp; -} - -osi_AddFDFormatInfo(osi_fdType_t *typep, long region, long index, - char *labelp, long format) -{ - osi_fdTypeFormat_t *formatp; - - formatp = (osi_fdTypeFormat_t *) malloc(sizeof(*formatp)); - - formatp->labelp = (char *) malloc(strlen(labelp) + 1); - strcpy(formatp->labelp, labelp); - - formatp->format = format; - - /* now copy index info */ - formatp->region = region; - formatp->index = index; - - /* thread on the list when done */ - thrd_EnterCrit(&osi_fdCS); - formatp->nextp = typep->formatListp; - typep->formatListp = formatp; - thrd_LeaveCrit(&osi_fdCS); - - /* all done */ - return 0; -} - -osi_InitFD(void) { - static osi_once_t once; - - if (!osi_Once(&once)) return 0; - - osi_allFDs = NULL; - osi_allFDTypes = NULL; - thrd_InitCrit(&osi_fdCS); - - /* now, initialize the types system by adding a type - * iteration operator - */ - osi_RegisterFDType("type", &osi_TypeFDOps, NULL); - - osi_EndOnce(&once); - - return 0; -} - -osi_fd_t *osi_AllocFD(char *namep) -{ - osi_fd_t *fdp; - osi_fdType_t *fdTypep; - long code; - - /* initialize for failure */ - fdp = NULL; - - thrd_EnterCrit(&osi_fdCS); - fdTypep = osi_FindFDType(namep); - if (fdTypep) { - code = (fdTypep->opsp->Create)(fdTypep, &fdp); - if (code == 0) { - fdp->fd = ++osi_nextFD; - fdp->opsp = fdTypep->opsp; - osi_QAdd((osi_queue_t **) &osi_allFDs, &fdp->q); - } - else fdp = NULL; - } - thrd_LeaveCrit(&osi_fdCS); - - return fdp; -} - -osi_fd_t *osi_FindFD(long fd) -{ - osi_fd_t *fdp; - - thrd_EnterCrit(&osi_fdCS); - for(fdp = osi_allFDs; fdp; fdp = (osi_fd_t *) osi_QNext(&fdp->q)) { - if (fdp->fd == fd) break; - } - thrd_LeaveCrit(&osi_fdCS); - - return fdp; -} - -osi_CloseFD(osi_fd_t *fdp) -{ - long code; - - thrd_EnterCrit(&osi_fdCS); - osi_QRemove((osi_queue_t **) &osi_allFDs, &fdp->q); - thrd_LeaveCrit(&osi_fdCS); - - /* this call frees the FD's storage, so make sure everything is unthreaded - * before here. - */ - code = (fdp->opsp->Close)(fdp); - - return code; -} - - -/* now we have the fd type operations */ -long osi_FDTypeCreate(osi_fdType_t *fdTypep, osi_fd_t **outpp) -{ - osi_typeFD_t *fdp; - - fdp = (osi_typeFD_t *) malloc(sizeof(*fdp)); - - fdp->curp = osi_allFDTypes; - - *outpp = &fdp->fd; - return 0; -} - - -#ifndef DJGPP -long osi_FDTypeGetInfo(osi_fd_t *ifdp, osi_remGetInfoParms_t *outp) -{ - osi_typeFD_t *fdp; - osi_fdType_t *typep; - - fdp = (osi_typeFD_t *) ifdp; - - if (typep = fdp->curp) { - /* still more stuff left, copy out name move to the next */ - outp->icount = 0; - outp->scount = 1; - strcpy(outp->sdata[0], typep->namep); - thrd_EnterCrit(&osi_fdCS); - fdp->curp = (osi_fdType_t *) osi_QNext(&typep->q); - thrd_LeaveCrit(&osi_fdCS); - return 0; - } - else { - /* otherwise we've hit EOF */ - return OSI_DBRPC_EOF; - } -} -#endif /* !DJGPP */ - -long osi_FDTypeClose(osi_fd_t *ifdp) -{ - osi_typeFD_t *fdp; - - fdp = (osi_typeFD_t *) ifdp; - - free((void *)fdp); - - return 0; -} - diff --git a/src/WINNT/client_osi/osifd.h b/src/WINNT/client_osi/osifd.h deleted file mode 100644 index f2e84ca06..000000000 --- a/src/WINNT/client_osi/osifd.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _OSIFD_H_ENV_ -#define _OSIFD_H_ENV_ 1 - -#ifndef DJGPP -#include "dbrpc.h" -#endif /* !DJGPP */ -#include "osiqueue.h" - -struct osi_fd; -struct osi_fdType; - -/* operations on a file descriptor */ -typedef struct osi_fdOps { - /* create an object, passed in the type info and returns - * the newly created fd. This is the only function not passed - * in the object, since it creates it. - */ - long (*Create)(struct osi_fdType *, struct osi_fd **); - -#ifndef DJGPP - /* gets info about the object; fields are type specific, and eventually - * self-labelling - */ - long (*GetInfo)(struct osi_fd *, osi_remGetInfoParms_t *); -#endif - - /* close an object; frees the storage associated with it */ - long (*Close)(struct osi_fd *); -} osi_fdOps_t; - -/* header structure that must be at the start of all FDs so that we can find - * them generically from the network layer by fd number. - */ -typedef struct osi_fd { - osi_queue_t q; - osi_fdOps_t *opsp; - long fd; -} osi_fd_t; - -/* represents a specific file descriptor for iterating over all file - * descriptor types. - */ -typedef struct osi_typeFD { - osi_fd_t fd; /* header */ - struct osi_fdType *curp; /* type scan is about to return next */ -} osi_typeFD_t; - -typedef struct osi_fdTypeFormat { - struct osi_fdTypeFormat *nextp; - char *labelp; - long region; - long index; - long format; -} osi_fdTypeFormat_t; - -/* describes type of file descriptor; anyone can register a new one */ -typedef struct osi_fdType { - osi_queue_t q; /* for threading together so we can find by name */ - char *namep; /* name */ - void *rockp; /* opaque for type owner */ - osi_fdOps_t *opsp; /* operations */ - osi_fdTypeFormat_t *formatListp; /* list of formatting info */ -} osi_fdType_t; - -extern osi_fdType_t *osi_FindFDType(char *); - -extern osi_fdType_t *osi_RegisterFDType(char *, osi_fdOps_t *, void *); - -extern long osi_UnregisterFDType(char *); - -extern osi_AddFDFormatInfo(osi_fdType_t *typep, long region, long index, - char *labelp, long format); - -extern osi_InitFD(void); - -extern osi_fd_t *osi_AllocFD(char *); - -extern osi_fd_t *osi_FindFD(long); - -extern osi_CloseFD(osi_fd_t *); - -extern long osi_FDTypeCreate(osi_fdType_t *, osi_fd_t **); - -#ifndef DJGPP -extern long osi_FDTypeGetInfo(osi_fd_t *, osi_remGetInfoParms_t *); -#endif - -extern long osi_FDTypeClose(osi_fd_t *); - -#endif /* _OSIFD_H_ENV_ */ - diff --git a/src/WINNT/client_osi/osilog.c b/src/WINNT/client_osi/osilog.c deleted file mode 100644 index 85672db6f..000000000 --- a/src/WINNT/client_osi/osilog.c +++ /dev/null @@ -1,412 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#ifndef DJGPP -#include -#include -#endif /* !DJGPP */ -#include -#include "osi.h" -#ifndef DJGPP -#include "dbrpc.h" -#endif /* !DJGPP */ -#include -#include -#include - -#define AFS_DAEMON_EVENT_NAME "TransarcAFSDaemon" - -/* the size; overrideable */ -long osi_logSize = OSI_LOG_DEFAULTSIZE; - -static osi_once_t osi_logOnce; - -osi_log_t *osi_allLogsp; /* all logs known; for use during panic */ - -unsigned long osi_logFreq; /* 0, or frequency of high perf counter */ -unsigned long osi_logTixToMicros; /* mult. correction factor */ - -osi_fdOps_t osi_logFDOps = { - osi_LogFDCreate, -#ifndef DJGPP - osi_LogFDGetInfo, -#endif - osi_LogFDClose -}; - -/* create a new log, taking a name and a size in entries (not words) */ -osi_log_t *osi_LogCreate(char *namep, long size) -{ - osi_log_t *logp; - osi_fdType_t *typep; - char tbuffer[256]; - LARGE_INTEGER bigFreq; - LARGE_INTEGER bigTemp; - LARGE_INTEGER bigJunk; - -#ifndef DJGPP - if (osi_Once(&osi_logOnce)) { - QueryPerformanceFrequency(&bigFreq); - if (bigFreq.LowPart == 0 && bigFreq.HighPart == 0) - osi_logFreq = 0; - else { - /* turn frequency into ticks per 10 micros */ - bigTemp.LowPart = 100000; - bigTemp.HighPart = 0; - osi_logTixToMicros = 10; - bigFreq = LargeIntegerDivide(bigFreq, bigTemp, &bigJunk); - - /* check if resolution is too fine or to gross for this to work */ - if (bigFreq.HighPart > 0 || bigFreq.LowPart < 8) - osi_logFreq = 0; /* too big to represent as long */ - else - osi_logFreq = bigFreq.LowPart; - } - - /* done with init */ - osi_EndOnce(&osi_logOnce); - } -#endif /* !DJGPP */ - - logp = malloc(sizeof(osi_log_t)); - memset(logp, 0, sizeof(osi_log_t)); - logp->namep = malloc(strlen(namep)+1); - strcpy(logp->namep, namep); - - osi_QAdd((osi_queue_t **) &osi_allLogsp, &logp->q); - - /* compute size we'll use */ - if (size == 0) size = osi_logSize; - - /* handle init for this size */ - logp->alloc = size; - logp->datap = malloc(size * sizeof(osi_logEntry_t)); - - /* init strings array */ - logp->maxstringindex = size/5; - logp->stringindex = 0; - logp->stringsp = malloc((size/5) * OSI_LOG_STRINGSIZE); - - /* and sync */ - thrd_InitCrit(&logp->cs); - - strcpy(tbuffer, "log:"); - strcat(tbuffer, namep); - typep = osi_RegisterFDType(tbuffer, &osi_logFDOps, logp); -#ifndef DJGPP - if (typep) { - /* add formatting info */ - osi_AddFDFormatInfo(typep, OSI_DBRPC_REGIONINT, 0, - "Thread ID", OSI_DBRPC_HEX); - osi_AddFDFormatInfo(typep, OSI_DBRPC_REGIONSTRING, 1, - "Time (mics)", 0); - } -#endif - - return logp; -} - -/* we just panic'd. Turn off all logging adding special log record - * to all enabled logs. Be careful not to wait for a lock. - */ -void osi_LogPanic(char *filep, long lineNumber) -{ - osi_log_t *tlp; - - for(tlp = osi_allLogsp; tlp; tlp = (osi_log_t *) osi_QNext(&tlp->q)) { - if (!tlp->enabled) continue; - - /* otherwise, proceed */ - if (filep) - osi_LogAdd(tlp, "**PANIC** (file %s:%d)", (long) filep, lineNumber, 0, 0); - else - osi_LogAdd(tlp, "**PANIC**", 0, 0, 0, 0); - - /* should grab lock for this, but we're in panic, and better safe than - * sorry. - */ - tlp->enabled = 0; - } -} - -/* reset the contents of a log */ -void osi_LogReset(osi_log_t *logp) -{ - if (logp) { - thrd_EnterCrit(&logp->cs); - logp->nused = 0; - thrd_LeaveCrit(&logp->cs); - } -} - -/* free a log */ -void osi_LogFree(osi_log_t *logp) -{ - if (!logp) return; - - osi_QRemove((osi_queue_t **) &osi_allLogsp, &logp->q); - - free(logp->namep); - free(logp->datap); - thrd_DeleteCrit(&logp->cs); - free(logp); -} - -/* add an element to a log */ -void osi_LogAdd(osi_log_t *logp, char *formatp, long p0, long p1, long p2, long p3) -{ - osi_logEntry_t *lep; - long ix; - LARGE_INTEGER bigTime; - - /* handle init races */ - if (!logp) return; - - /* do this w/o locking for speed; it is obviously harmless if we're off - * by a bit. - */ - if (!logp->enabled) return; - - thrd_EnterCrit(&logp->cs); - if (logp->nused < logp->alloc) logp->nused++; - else { - logp->first++; - if (logp->first >= logp->alloc) logp->first -= logp->alloc; - } - ix = logp->first + logp->nused - 1; - if (ix >= logp->alloc) ix -= logp->alloc; - - lep = logp->datap + ix; /* ptr arith */ - lep->tid = thrd_Current(); - - /* get the time, using the high res timer if available */ -#ifndef DJGPP - if (osi_logFreq) { - QueryPerformanceCounter(&bigTime); - lep->micros = (bigTime.LowPart / osi_logFreq) * osi_logTixToMicros; - } - else lep->micros = GetCurrentTime() * 1000; -#else - lep->micros = gettime_us(); -#endif /* !DJGPP */ - - lep->formatp = formatp; - lep->parms[0] = p0; - lep->parms[1] = p1; - lep->parms[2] = p2; - lep->parms[3] = p3; - -#ifdef NOTSERVICE - printf( "%9ld:", lep->micros ); - printf( formatp, p0, p1, p2, p3); - printf( "\n" ); -#endif - - thrd_LeaveCrit(&logp->cs); -} - -void osi_LogPrint(osi_log_t *logp, FILE_HANDLE handle) -{ - char wholemsg[1000], msg[1000]; - int i, ix, ioCount; - osi_logEntry_t *lep; - - if (!logp->enabled) return; - - thrd_EnterCrit(&logp->cs); - - for (ix = logp->first, i = 0; - i < logp->nused; - i++, ix++, (ix >= logp->alloc ? ix -= logp->alloc : 0)) { - lep = logp->datap + ix; /* pointer arithmetic */ - sprintf(msg, lep->formatp, - lep->parms[0], lep->parms[1], - lep->parms[2], lep->parms[3]); - sprintf(wholemsg, "time %d.%06d, pid %d %s\n", - lep->micros / 1000000, - lep->micros % 1000000, - lep->tid, msg); -#ifndef DJGPP - if (!WriteFile(handle, wholemsg, strlen(wholemsg), - &ioCount, NULL)) -#else /* DJGPP */ - if ((ioCount = fwrite(wholemsg, 1, strlen(wholemsg), handle)) == 0) -#endif /* !DJGPP */ - break; - } - - thrd_LeaveCrit(&logp->cs); -} - -char *osi_LogSaveString(osi_log_t *logp, char *s) -{ - char *saveplace = logp->stringsp[logp->stringindex]; - - if (s == NULL) return NULL; - - if (strlen(s) >= OSI_LOG_STRINGSIZE) - sprintf(saveplace, "...%s", - s + strlen(s) - (OSI_LOG_STRINGSIZE - 4)); - else - strcpy(saveplace, s); - logp->stringindex++; - if (logp->stringindex >= logp->maxstringindex) - logp->stringindex = 0; - - return saveplace; -} - -long osi_LogFDCreate(osi_fdType_t *typep, osi_fd_t **outpp) -{ - osi_logFD_t *lfdp; - osi_log_t *logp; - - lfdp = malloc(sizeof(*lfdp)); - logp = lfdp->logp = typep->rockp; /* the log we were created for */ - thrd_EnterCrit(&logp->cs); - lfdp->nused = logp->nused; - lfdp->first = logp->first; - lfdp->current = 0; - thrd_LeaveCrit(&logp->cs); - - *outpp = &lfdp->fd; - return 0; -} - -#ifndef DJGPP -long osi_LogFDGetInfo(osi_fd_t *ifd, osi_remGetInfoParms_t *outp) -{ - osi_logFD_t *lfdp; - osi_log_t *logp; - osi_logEntry_t *lep; - char tbuffer[256]; - long ix; - - lfdp = (osi_logFD_t *) ifd; - logp = lfdp->logp; - - /* see if we're done */ - if (lfdp->current >= lfdp->nused) return OSI_DBRPC_EOF; - - /* grab lock */ - thrd_EnterCrit(&logp->cs); - - /* compute which one we want */ - ix = lfdp->first + lfdp->current; - if (ix >= logp->alloc) ix -= logp->alloc; - lfdp->current++; - lep = logp->datap + ix; /* ptr arith to current index */ - - sprintf(tbuffer, lep->formatp, lep->parms[0], lep->parms[1], - lep->parms[2], lep->parms[3]); - - /* now copy out info */ - strcpy(outp->sdata[0], tbuffer); - sprintf(tbuffer, "%5.6f", ((double)lep->micros)/1000000.0); - strcpy(outp->sdata[1], tbuffer); - outp->idata[0] = lep->tid; - outp->scount = 2; - outp->icount = 1; - - thrd_LeaveCrit(&logp->cs); - return 0; -} -#endif /* !DJGPP */ - -long osi_LogFDClose(osi_fd_t *ifdp) -{ - free(ifdp); - return 0; -} - -void osi_LogEnable(osi_log_t *logp) -{ - if (logp) - logp->enabled = 1; -} - -void osi_LogDisable(osi_log_t *logp) -{ - if (logp) - logp->enabled = 0; -} - -#define TRACE_OPTION_EVENT 2 -#define ISCLIENTTRACE(v) ( ((v) & TRACE_OPTION_EVENT)==TRACE_OPTION_EVENT) - -DWORD osi_TraceOption=0; - -void osi_InitTraceOption() -{ - DWORD LSPtype, LSPsize; - HKEY NPKey; - (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &NPKey); - LSPsize=sizeof(osi_TraceOption); - RegQueryValueEx(NPKey, "TraceOption", NULL, - &LSPtype, (LPBYTE)&osi_TraceOption, &LSPsize); -} - - -#define MAXBUF_ 131 -void osi_LogEvent0(char *a,char *b) -{ - HANDLE h; - char *ptbuf[1]; - if (!ISCLIENTTRACE(osi_TraceOption)) - return; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - ptbuf[0] = b; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL); - DeregisterEventSource(h); -} - - -void osi_LogEvent(char *a,char *b,char *c,...) -{ - HANDLE h; char *ptbuf[1],buf[MAXBUF_+1]; - va_list marker; - if (!ISCLIENTTRACE(osi_TraceOption)) - return; - h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); - va_start(marker,c); - _vsnprintf(buf,MAXBUF_,c,marker); - ptbuf[0] = buf; - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL);\ - DeregisterEventSource(h); - va_end(marker); -} - -char *osi_HexifyString(char *s) { - int len,c; - char *hex = "0123456789abcdef"; - char *buf, *counter, *bufp; - - len = strlen(s); - - bufp = buf = malloc( len * 3 ); /* [xx.xx.xx.xx\0] */ - - if(!buf) return NULL; - - for(counter = s; *counter; counter ++) { - if(counter != s) *bufp++ = '.'; - c = *counter; - *bufp++ = hex[(c>>4) & 0xf]; - *bufp++ = hex[c & 0xf]; - } - *bufp = 0; - - return buf; -} - diff --git a/src/WINNT/client_osi/osilog.h b/src/WINNT/client_osi/osilog.h deleted file mode 100644 index 6eefb0f8e..000000000 --- a/src/WINNT/client_osi/osilog.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved - * - * (C) COPYRIGHT IBM CORPORATION 1987, 1988 - * LICENSED MATERIALS - PROPERTY OF IBM - * - */ - -#ifndef _OSI_LOG_H__ -#define _OSI_LOG_H__ 1 - -#include "osi.h" -#ifndef DJGPP -#include "osisleep.h" -#include "osibasel.h" -#include "osistatl.h" -#endif /* !DJGPP */ -#include "osifd.h" -#include "osiqueue.h" - -#define OSI_LOG_DEFAULTSIZE 1000 -#define OSI_LOG_STRINGSIZE 128 -#define OSI_LOG_MAXPARMS 4 /* max # of int parms */ - -typedef struct osi_logEntry { - long tid; /* thread ID */ - unsigned long micros; /* microsecond-based time stamp */ - char *formatp; /* format string */ - long parms[OSI_LOG_MAXPARMS]; /* parms */ -} osi_logEntry_t; - -typedef struct osi_log { - osi_queue_t q; /* queue of all logs */ - char *namep; /* name */ - long alloc; /* allocated size */ - long nused; /* number currently in use */ - long first; /* index of first entry */ - Crit_Sec cs; /* use this, rather than a higher-level - * lock, so we can log stuff from - * osi lock pkg */ - osi_logEntry_t *datap; /* data for the log */ - int stringindex; /* where to put new strings */ - int maxstringindex; /* size of string array */ - char (*stringsp)[OSI_LOG_STRINGSIZE]; /* string array */ - int enabled; /* true if enabled */ -} osi_log_t; - -typedef struct osi_logFD { - osi_fd_t fd; /* FD header */ - osi_log_t *logp; /* logp */ - long first; /* first index at time we started */ - long nused; /* nused at tiem we started */ - long current; /* counter we're at */ -} osi_logFD_t; - -extern long osi_logSize; - -extern osi_log_t *osi_LogCreate(char *, long); - -extern void osi_LogFree(osi_log_t *); - -extern void osi_LogAdd(osi_log_t *, char *, long, long, long, long); - -extern void osi_LogReset(osi_log_t *); - -extern long osi_LogFDCreate(osi_fdType_t *, osi_fd_t **); - -#ifndef DJGPP -extern long osi_LogFDGetInfo(osi_fd_t *, osi_remGetInfoParms_t *); -#endif - -extern long osi_LogFDClose(osi_fd_t *); - -extern void osi_LogEnable(osi_log_t *); - -extern void osi_LogDisable(osi_log_t *); - -extern void osi_LogPanic(char *filep, long line); - -extern void osi_LogPrint(osi_log_t *logp, FILE_HANDLE handle); - -extern char *osi_LogSaveString(osi_log_t *logp, char *s); -extern void osi_InitTraceOption(); -extern void osi_LogEvent0(char *a,char *b); -extern void osi_LogEvent(char *a,char *b,char *c,...); -extern char *osi_HexifyString(char *s); - -/* define macros */ -#define osi_Log0(l,f) osi_LogAdd((l), (f), 0, 0, 0, 0) -#define osi_Log1(l,f,a) osi_LogAdd((l), (f), (long) (a), 0, 0, 0) -#define osi_Log2(l,f,a,b) osi_LogAdd((l), (f), (long) (a), (long) (b), 0, 0) -#define osi_Log3(l,f,a,b,c) osi_LogAdd((l), (f), (long) (a), (long) (b), (long) (c), 0) -#define osi_Log4(l,f,a,b,c,d) osi_LogAdd((l), (f), (long) (a), (long) (b), (long) (c), (long) (d)) - -#ifdef DEBUG_VERBOSE -#define DEBUG_EVENT1(a,b,c) {HANDLE h; char *ptbuf[1],buf[132];\ - h = RegisterEventSource(NULL, a);\ - sprintf(buf, b,c);\ - ptbuf[0] = buf;\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL);\ - DeregisterEventSource(h);} -#define DEBUG_EVENT0(a) {HANDLE h; char *ptbuf[1];\ - h = RegisterEventSource(NULL, a);\ - ptbuf[0] = "";\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0,(const char **) ptbuf, NULL);\ - DeregisterEventSource(h);} -#define DEBUG_EVENT2(a,b,c,d) {HANDLE h; char *ptbuf[1],buf[132];\ - h = RegisterEventSource(NULL, a);\ - sprintf(buf, b,c,d);\ - ptbuf[0] = buf;\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0,(const char **) ptbuf, NULL);\ - DeregisterEventSource(h);} -#define DEBUG_EVENT3(a,b,c,d,e) {HANDLE h; char *ptbuf[1],buf[132];\ - h = RegisterEventSource(NULL, a);\ - sprintf(buf, b,c,d,e);\ - ptbuf[0] = buf;\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0,(const char **)ptbuf, NULL);\ - DeregisterEventSource(h);} -#define DEBUG_EVENT4(a,b,c,d,e,f) {HANDLE h; char *ptbuf[1],buf[132];\ - h = RegisterEventSource(NULL, a);\ - sprintf(buf, b,c,d,e,f);\ - ptbuf[0] = buf;\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0,(const char **) ptbuf, NULL);\ - DeregisterEventSource(h);} -#define DEBUG_EVENT5(a,b,c,d,e,f,g) {HANDLE h; char *ptbuf[1],buf[132];\ - h = RegisterEventSource(NULL, a);\ - sprintf(buf, b,c,d,e,f,g);\ - ptbuf[0] = buf;\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0,(const char **) ptbuf, NULL);\ - DeregisterEventSource(h);} -#define DEBUG_EVENT6(a,b,c,d,e,f,g,h) {HANDLE h; char *ptbuf[1],buf[132];\ - h = RegisterEventSource(NULL, a);\ - sprintf(buf,b,c,d,e,f,g,h);\ - ptbuf[0] = buf;\ - ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0,(const char **) ptbuf, NULL);\ - DeregisterEventSource(h);} -#else -#define DEBUG_EVENT0(a) -#define DEBUG_EVENT1(a,b,c) -#define DEBUG_EVENT2(a,b,c,d) -#define DEBUG_EVENT3(a,b,c,d,e) -#define DEBUG_EVENT4(a,b,c,d,e,f) -#define DEBUG_EVENT5(a,b,c,d,e,f,g) -#define DEBUG_EVENT6(a,b,c,d,e,f,g,h) -#endif - -#endif /* _OSI_LOG_H__ */ diff --git a/src/WINNT/client_osi/osiltype.c b/src/WINNT/client_osi/osiltype.c deleted file mode 100644 index a37eecd1c..000000000 --- a/src/WINNT/client_osi/osiltype.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - - -#include -#include - -#include -#include "osi.h" -#include - -/* table of dynamic lock types. First entry isn't used, since those are - * wired in for performance reasons. - */ -osi_lockOps_t *osi_lockOps[OSI_NLOCKTYPES]; -char *osi_lockOpNames[OSI_NLOCKTYPES]; - -/* first free slot in lock operations; slot 0 is not used */ -int osi_lockTypeIndex = 1; - -/* type to create generically */ -int osi_lockTypeDefault = 0; - -int osi_LockTypeFind(char *namep) -{ - int i; - - for(i=1; i= OSI_NLOCKTYPES) return; - osi_lockOps[i] = statOps; - osi_lockOpNames[i] = namep; - *indexp = i; - osi_lockTypeIndex = i+1; -} - -osi_LockTypeSetDefault(char *namep) -{ - int index; - - if (namep == (char *) 0) - osi_lockTypeDefault = 0; - else { - index = osi_LockTypeFind(namep); - if (index > 0) osi_lockTypeDefault = index; - } - return 0; -} - diff --git a/src/WINNT/client_osi/osiltype.h b/src/WINNT/client_osi/osiltype.h deleted file mode 100644 index a7a1c31de..000000000 --- a/src/WINNT/client_osi/osiltype.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved - * - * (C) COPYRIGHT IBM CORPORATION 1987, 1988 - * LICENSED MATERIALS - PROPERTY OF IBM - * - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _OSILTYPE_H_ENV_ -#define _OSILTYPE_H_ENV_ 1 - -/* number of dynamic lock types we permit */ -#define OSI_NLOCKTYPES 32 /* should be enough */ - -/* the set of procedures that we subclass to make a new lock - * implementation. - */ -typedef struct osi_lockOps { - void (*ObtainReadProc)(struct osi_rwlock *); - void (*ObtainWriteProc)(struct osi_rwlock *); - void (*ReleaseReadProc)(struct osi_rwlock *); - void (*ReleaseWriteProc)(struct osi_rwlock *); - void (*ObtainMutexProc)(struct osi_mutex *); - void (*ReleaseMutexProc)(struct osi_mutex *); - int (*TryReadProc)(struct osi_rwlock *); - int (*TryWriteProc)(struct osi_rwlock *); - int (*TryMutexProc)(struct osi_mutex *); - void (*SleepRProc)(long, struct osi_rwlock *); - void (*SleepWProc)(long, struct osi_rwlock *); - void (*SleepMProc)(long, struct osi_mutex *); - void (*InitializeMutexProc)(struct osi_mutex *, char *); - void (*InitializeRWLockProc)(struct osi_rwlock *, char *); - void (*FinalizeMutexProc)(struct osi_mutex *); - void (*FinalizeRWLockProc)(struct osi_rwlock *); - void (*ConvertWToRProc)(struct osi_rwlock *); - int (*GetRWLockState)(struct osi_rwlock *); - int (*GetMutexState)(struct osi_mutex *); -} osi_lockOps_t; - -/* operation vectors for lock ops */ -extern osi_lockOps_t *osi_lockOps[OSI_NLOCKTYPES]; - -extern int osi_lockTypeDefault; - -/* external procedures */ -void osi_LockTypeAdd(osi_lockOps_t *, char *, int *); - -int osi_LockTypeSetDefault(char *); - -/* bits for GetRWLockInfo and GetMutexInfo return values */ -#define OSI_MUTEX_HELD 1 /* mutex is held */ -#define OSI_RWLOCK_READHELD 1 /* locked for read */ -#define OSI_RWLOCK_WRITEHELD 2 /* locked for write */ - -#endif /* _OSILTYPE_H_ENV_ */ diff --git a/src/WINNT/client_osi/osiqueue.c b/src/WINNT/client_osi/osiqueue.c deleted file mode 100644 index 8963d2e9c..000000000 --- a/src/WINNT/client_osi/osiqueue.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#ifndef DJGPP -#include -#endif /* !DJGPP */ -#include "osi.h" -#include - -/* critical section protecting allocation of osi_queueData_t elements */ -Crit_Sec osi_qdcrit; - -/* free list of queue elements */ -osi_queueData_t *osi_QDFreeListp = NULL; - -void osi_QAdd(osi_queue_t **headpp, osi_queue_t *eltp) -{ - osi_queue_t *tp; - - /* and both paths do the following; do this early to keep - * machine busy while processing delay on conditional check - */ - eltp->prevp = NULL; - - if (tp = *headpp) { - /* there is one element here */ - eltp->nextp = tp; - tp->prevp = eltp; - } - else { - /* we're the first */ - eltp->nextp = NULL; - } - - /* and both paths do the following */ - *headpp = eltp; -} - -void osi_QAddH(osi_queue_t **headpp, osi_queue_t **tailpp, osi_queue_t *eltp) -{ - osi_queue_t *tp; - - /* and both paths do the following; do this early to keep - * machine busy while processing delay on conditional check - */ - eltp->prevp = NULL; - - if (tp = *headpp) { - /* there is one element here */ - eltp->nextp = tp; - tp->prevp = eltp; - } - else { - /* we're the first */ - eltp->nextp = NULL; - *tailpp = eltp; - } - - /* and both paths do the following */ - *headpp = eltp; -} - -void osi_QAddT(osi_queue_t **headpp, osi_queue_t **tailpp, osi_queue_t *eltp) -{ - osi_queue_t *tp; - - eltp->nextp = NULL; - - if (tp = *tailpp) { - /* there's at least one element in the list; append ourselves */ - eltp->prevp = tp; - tp->nextp = eltp; - *tailpp = eltp; - } - else { - /* we're the only element in the list */ - *headpp = eltp; - *tailpp = eltp; - eltp->prevp = NULL; - } -} - -void osi_QRemove(osi_queue_t **headpp, osi_queue_t *eltp) -{ - osi_queue_t *np; /* next dude */ - - np = eltp->nextp; /* useful for both paths */ - - if (eltp == *headpp) { - /* we're the first element in the list */ - *headpp = np; - if (np) np->prevp = NULL; - } - else { - eltp->prevp->nextp = np; - if (np) np->prevp = eltp->prevp; - } -} - -void osi_InitQueue(void) -{ - static int initd = 0; - - if (initd) return; - - initd = 1; - thrd_InitCrit(&osi_qdcrit); -} - -osi_queueData_t *osi_QDAlloc(void) -{ - osi_queueData_t *tp; - int i; - - thrd_EnterCrit(&osi_qdcrit); - if (tp = osi_QDFreeListp) { - osi_QDFreeListp = (osi_queueData_t *) tp->q.nextp; - } - else { - /* need to allocate a block more */ - tp = (osi_queueData_t *) malloc(OSI_NQDALLOC * sizeof(osi_queueData_t)); - - /* leave last guy off of the free list; this is the one we'll - * return. - */ - for(i=0; iq.nextp = (osi_queue_t *) osi_QDFreeListp; - tp->datap = NULL; - osi_QDFreeListp = tp; - } - - /* when we get here, tp is pointing to the last dude allocated. - * This guy wasn't put on the free list, so we can return him now. - */ - tp->datap = NULL; - } - thrd_LeaveCrit(&osi_qdcrit); - - osi_assertx(tp->datap == NULL, "queue freelist screwup"); - - return tp; -} - -void osi_QDFree(osi_queueData_t *qp) -{ - thrd_EnterCrit(&osi_qdcrit); - qp->q.nextp = (osi_queue_t *) osi_QDFreeListp; - qp->datap = NULL; - osi_QDFreeListp = qp; - thrd_LeaveCrit(&osi_qdcrit); -} diff --git a/src/WINNT/client_osi/osiqueue.h b/src/WINNT/client_osi/osiqueue.h deleted file mode 100644 index a6c3ea984..000000000 --- a/src/WINNT/client_osi/osiqueue.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _OSI_QUEUE_H_ENV_ -#define _OSI_QUEUE_H_ENV_ 1 - -/* this package implements a doubly linked queue of elements. - * Each element starts with an osi_queue_t element. - * - * Utility functions are passed a pointer to a pointer to the first - * element in the list; this word is NULL if the list is empty (the - * pointer to it, of course, is not NULL). - * The list is *not* circularly linked; rather prevp of the first - * element and nextp of the last element are both NULL; this makes - * checking for the end of the list easier, and still provides us a - * quick deletion. - * - * Some of these things are macros for performance reasons. - */ - -typedef struct osi_queue { - struct osi_queue *nextp; - struct osi_queue *prevp; -} osi_queue_t; - -typedef struct osi_queueData { - osi_queue_t q; - void *datap; -} osi_queueData_t; - -/* # of elements to allocate at once */ -#define OSI_NQDALLOC 64 - -/* add an element to the head of a queue, first parm is - * address of head pointer, and second parm is addr of - * element to add. - */ -extern void osi_QAdd(osi_queue_t **headpp, osi_queue_t *eltp); - -/* add an element to the tail of a queue, first parm is - * address of head pointer, second is addr of ptr to tail elt, - * and third parm is addr of element to add. - */ -extern void osi_QAddT(osi_queue_t **headpp, osi_queue_t **tailpp, osi_queue_t *eltp); - -/* add to the head (like osi_QAdd) only be prepared to set tailpp if necessary */ -extern void osi_QAddH(osi_queue_t **headpp, osi_queue_t **tailpp, osi_queue_t *eltp); - -/* remove an element from a queue; takes address of head list, and - * element to remove as parameters. - */ -extern void osi_QRemove(osi_queue_t **headpp, osi_queue_t *eltp); - -/* initialize the queue package */ -extern void osi_InitQueue(void); - -/* allocate a queue element with one data ptr */ -extern osi_queueData_t *osi_QDAlloc(void); - -/* free a single element queue pointer */ -extern void osi_QDFree(osi_queueData_t *); - -/* retrieve the queue data from a one-element block */ -#define osi_GetQData(x) ((x)->datap) - -/* set the queue data in a one-element block */ -#define osi_SetQData(x,y) ((x)->datap = (y)) - -/* get the next ptr from a queue element */ -#define osi_QNext(x) ((x)->nextp) - -/* get the prev ptr from a queue element */ -#define osi_QPrev(x) ((x)->prevp) - -/* find out if a queue is empty */ -#define osi_QIsEmpty(x) ((*x) == ((osi_queue_t *) 0)) - -#endif /* _OSI_QUEUE_H_ENV_ */ diff --git a/src/WINNT/client_osi/osisleep.c b/src/WINNT/client_osi/osisleep.c deleted file mode 100644 index 1d9524491..000000000 --- a/src/WINNT/client_osi/osisleep.c +++ /dev/null @@ -1,727 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#include -#include -#include -#include -#include "osi.h" - -/* Locking hierarchy for these critical sections: - * - * 1. lock osi_sleepFDCS - * 2. lock osi_critSec[i] - * 3. lock osi_sleepInfoAllocCS - */ - -/* file descriptor for iterating over sleeping threads */ -osi_fdOps_t osi_sleepFDOps = { - osi_SleepFDCreate, - osi_SleepFDGetInfo, - osi_SleepFDClose -}; - -/* - * Thread-local storage for sleep Info structures - */ -DWORD osi_SleepSlot; - -/* critical section serializing contents of all sleep FDs, so that - * concurrent GetInfo calls don't damage each other if applied - * to the same FD. - */ -CRITICAL_SECTION osi_sleepFDCS; - -/* critical regions used for SleepSched to guarantee atomicity. - * protects all sleep info structures while they're in the - * sleep hash table. - */ -static CRITICAL_SECTION osi_critSec[OSI_SLEEPHASHSIZE]; - -/* the sleep info structure hash table. - * all active entries are in here. In addition, deleted entries - * may be present, referenced by file descriptors from remote - * debuggers; these will have OSI_SLEEPINFO_DELETED set and - * should be ignored. - */ -static osi_sleepInfo_t *osi_sleepers[OSI_SLEEPHASHSIZE]; - -/* allocate space for lock operations */ -osi_lockOps_t *osi_lockOps[OSI_NLOCKTYPES]; - -/* some global statistics */ -long osi_totalSleeps = 0; - -/* critical section protecting sleepInfoFreeListp and all sleep entries in - * the free list. - */ -CRITICAL_SECTION osi_sleepInfoAllocCS; - -/* sleep entry free list */ -osi_sleepInfo_t *osi_sleepInfoFreeListp; - -/* boot time */ -unsigned long osi_bootTime; - -/* count of free entries in free list, protected by osi_sleepInfoAllocCS */ -long osi_sleepInfoCount=0; - -/* count of # of allocates of sleep info structures */ -long osi_sleepInfoAllocs = 0; - -/* the sleep bucket lock must be held. - * Releases the reference count and frees the structure if the item has - * been deleted. - */ -void osi_ReleaseSleepInfo(osi_sleepInfo_t *ap) -{ - if (--ap->refCount == 0 && (ap->states & OSI_SLEEPINFO_DELETED)) - osi_FreeSleepInfo(ap); -} - -/* must be called with sleep bucket locked. - * Frees the structure if it has a 0 reference count (and removes it - * from the hash bucket). Otherwise, we simply mark the item - * for deleting when the ref count hits zero. - */ -void osi_FreeSleepInfo(osi_sleepInfo_t *ap) -{ - long idx; - - if (ap->refCount > 0) { - TlsSetValue(osi_SleepSlot, NULL); /* don't reuse me */ - ap->states |= OSI_SLEEPINFO_DELETED; - return; - } - - /* remove from hash if still there */ - if (ap->states & OSI_SLEEPINFO_INHASH) { - ap->states &= ~OSI_SLEEPINFO_INHASH; - idx = osi_SLEEPHASH(ap->value); - osi_QRemove((osi_queue_t **) &osi_sleepers[idx], &ap->q); - } - - if (ap->states & OSI_SLEEPINFO_DELETED) { - EnterCriticalSection(&osi_sleepInfoAllocCS); - ap->q.nextp = (osi_queue_t *) osi_sleepInfoFreeListp; - osi_sleepInfoFreeListp = ap; - osi_sleepInfoCount++; - LeaveCriticalSection(&osi_sleepInfoAllocCS); - } -} - -/* allocate a new sleep structure from the free list */ -osi_sleepInfo_t *osi_AllocSleepInfo() -{ - osi_sleepInfo_t *ap; - - EnterCriticalSection(&osi_sleepInfoAllocCS); - if (!(ap = osi_sleepInfoFreeListp)) { - ap = (osi_sleepInfo_t *) malloc(sizeof(osi_sleepInfo_t)); - ap->sema = CreateSemaphore(NULL, 0, 65536, (char *) 0); - osi_sleepInfoAllocs++; - } - else { - osi_sleepInfoFreeListp = (osi_sleepInfo_t *) ap->q.nextp; - osi_sleepInfoCount--; - } - ap->tid = GetCurrentThreadId(); - ap->states = 0; /* not signalled yet */ - LeaveCriticalSection(&osi_sleepInfoAllocCS); - - return ap; -} - -int osi_Once(osi_once_t *argp) -{ - long i; - - while ((i=InterlockedExchange(&argp->atomic, 1)) != 0) { - Sleep(0); - } - - if (argp->done == 0) { - argp->done = 1; - return 1; - } - - /* otherwise we've already been initialized, so clear lock and return */ - InterlockedExchange(&argp->atomic, 0); - return 0; -} - -void osi_EndOnce(osi_once_t *argp) -{ - InterlockedExchange(&argp->atomic, 0); -} - -int osi_TestOnce(osi_once_t *argp) -{ - long localDone; - long i; - - while ((i=InterlockedExchange(&argp->atomic, 1)) != 0) { - Sleep(0); - } - - localDone = argp->done; - - /* drop interlock */ - InterlockedExchange(&argp->atomic, 0); - - return (localDone? 0 : 1); -} - -/* Initialize the package, should be called while single-threaded. - * Can be safely called multiple times. - * Must be called before any osi package calls. - */ -void osi_Init(void) -{ - int i; - static osi_once_t once; - unsigned long remainder; /* for division output */ - osi_fdType_t *typep; - SYSTEMTIME sysTime; - FILETIME fileTime; - osi_hyper_t bootTime; - - /* check to see if already initialized; if so, claim success */ - if (!osi_Once(&once)) return; - - /* setup boot time values */ - GetSystemTime(&sysTime); - SystemTimeToFileTime(&sysTime, &fileTime); - - /* change the base of the time so it won't be negative for a long time */ - fileTime.dwHighDateTime -= 28000000; - - bootTime.HighPart = fileTime.dwHighDateTime; - bootTime.LowPart = fileTime.dwLowDateTime; - /* now, bootTime is in 100 nanosecond units, and we'd really rather - * have it in 1 second units, units 10,000,000 times bigger. - * So, we divide. - */ - bootTime = ExtendedLargeIntegerDivide(bootTime, 10000000, &remainder); - osi_bootTime = bootTime.LowPart; - - /* initialize thread-local storage for sleep Info structures */ - osi_SleepSlot = TlsAlloc(); - - /* init FD system */ - osi_InitFD(); - - /* initialize critical regions and semaphores */ - for(i=0;istates = 0; - sp->refCount = 0; - sp->waitFor = waitFor; - sp->value = (long) patchp; - osi_QAdd((osi_queue_t **) &turnp->firstp, &sp->q); - if (!turnp->lastp) turnp->lastp = sp; - LeaveCriticalSection(releasep); - - /* now wait for the signal */ - while(1) { - /* wait */ - code = WaitForSingleObject(sp->sema, - /* timeout */ INFINITE); - - /* if the reason for the wakeup was that we were signalled, - * break out, otherwise try again, since the semaphore count is - * decreased only when we get WAIT_OBJECT_0 back. - */ - if (code == WAIT_OBJECT_0) break; - } /* while we're waiting */ - - /* we're the only one who should be looking at or changing this - * structure after it gets signalled. Sema sp->sema isn't signalled - * any longer after we're back from WaitForSingleObject, so we can - * free this element directly. - */ - osi_assert(sp->states & OSI_SLEEPINFO_SIGNALLED); - - osi_FreeSleepInfo(sp); - - /* reobtain, since caller commonly needs it */ - EnterCriticalSection(releasep); -} - -/* must be called with a critical section held that guards the turnstile - * structure. We remove the sleepInfo structure from the queue so we don't - * wake the guy again, but we don't free it because we're still using the - * semaphore until the guy waiting wakes up. - */ -void osi_TSignal(osi_turnstile_t *turnp) -{ - osi_sleepInfo_t *sp; - - if (!turnp->lastp) return; - - sp = turnp->lastp; - turnp->lastp = (osi_sleepInfo_t *) osi_QPrev(&sp->q); - osi_QRemove((osi_queue_t **) &turnp->firstp, &sp->q); - sp->states |= OSI_SLEEPINFO_SIGNALLED; - ReleaseSemaphore(sp->sema, 1, (long *) 0); -} - -/* like TSignal, only wake *everyone* */ -void osi_TBroadcast(osi_turnstile_t *turnp) -{ - osi_sleepInfo_t *sp; - - while(sp = turnp->lastp) { - turnp->lastp = (osi_sleepInfo_t *) osi_QPrev(&sp->q); - osi_QRemove((osi_queue_t **) &turnp->firstp, &sp->q); - sp->states |= OSI_SLEEPINFO_SIGNALLED; - ReleaseSemaphore(sp->sema, 1, (long *) 0); - } /* while someone's still asleep */ -} - -/* special turnstile signal for mutexes and locks. Wakes up only those who - * will really be able to lock the lock. The assumption is that everyone who - * already can use the lock has already been woken (and is thus not in the - * turnstile any longer). - * - * The stillHaveReaders parm is set to 1 if this is a convert from write to read, - * indicating that there is still at least one reader, and we should only wake - * up other readers. We use it in a tricky manner: we just pretent we already woke - * a reader, and that is sufficient to prevent us from waking a writer. - * - * The crit sec. csp is released before the threads are woken, but after they - * are removed from the turnstile. It helps ensure that we won't have a spurious - * context swap back to us if the release performs a context swap for some reason. - */ -void osi_TSignalForMLs(osi_turnstile_t *turnp, int stillHaveReaders, CRITICAL_SECTION *csp) -{ - osi_sleepInfo_t *tsp; /* a temp */ - osi_sleepInfo_t *nsp; /* a temp */ - osi_queue_t *wakeupListp; /* list of dudes to wakeup after dropping lock */ - int wokeReader; - unsigned short *sp; - unsigned char *cp; - - wokeReader = stillHaveReaders; - wakeupListp = NULL; - while(tsp = turnp->lastp) { - /* look at each sleepInfo until we find someone we're not supposed to - * wakeup. - */ - if (tsp->waitFor & OSI_SLEEPINFO_W4WRITE) { - if (wokeReader) break; - } - else wokeReader = 1; - - /* otherwise, we will wake this guy. For now, remove from this list - * and move to private one, so we can do the wakeup after releasing - * the crit sec. - */ - turnp->lastp = (osi_sleepInfo_t *) osi_QPrev(&tsp->q); - osi_QRemove((osi_queue_t **) &turnp->firstp, &tsp->q); - - /* do the patching required for lock obtaining */ - if (tsp->waitFor & OSI_SLEEPINFO_W4WRITE) { - cp = (void *) tsp->value; - (*cp) |= OSI_LOCKFLAG_EXCL; - } - else if (tsp->waitFor & OSI_SLEEPINFO_W4READ) { - sp = (void *) tsp->value; - (*sp)++; - } - - /* and add to our own list */ - tsp->q.nextp = wakeupListp; - wakeupListp = &tsp->q; - - /* now if we woke a writer, we're done, since it is pointless - * to wake more than one writer. - */ - if (!wokeReader) break; - } - - /* hit end, or found someone we're not supposed to wakeup */ - if (csp) LeaveCriticalSection(csp); - - /* finally, wakeup everyone we found. Don't free things since the sleeper - * will free the sleepInfo structure. - */ - for(tsp = (osi_sleepInfo_t *) wakeupListp; tsp; tsp = nsp) { - /* pull this out first, since *tsp *could* get freed immediately - * after the ReleaseSemaphore, if a context swap occurs. - */ - nsp = (osi_sleepInfo_t *) tsp->q.nextp; - tsp->states |= OSI_SLEEPINFO_SIGNALLED; - ReleaseSemaphore(tsp->sema, 1, (long *) 0); - } -} - -/* utility function to atomically (with respect to WakeSched) - * release an atomic counter spin lock and sleep on an - * address (value). - * Called with no locks held. - */ -void osi_SleepSpin(long sleepValue, CRITICAL_SECTION *releasep) -{ - register int idx; - int code; - osi_sleepInfo_t *sp; - CRITICAL_SECTION *csp; - - sp = TlsGetValue(osi_SleepSlot); - if (sp == NULL) { - sp = osi_AllocSleepInfo(); - TlsSetValue(osi_SleepSlot, sp); - } - else - sp->states = 0; - sp->refCount = 0; - sp->value = sleepValue; - idx = osi_SLEEPHASH(sleepValue); - csp = &osi_critSec[idx]; - EnterCriticalSection(csp); - osi_QAdd((osi_queue_t **) &osi_sleepers[idx], &sp->q); - sp->states |= OSI_SLEEPINFO_INHASH; - LeaveCriticalSection(releasep); - LeaveCriticalSection(csp); - osi_totalSleeps++; /* stats */ - while(1) { - /* wait */ - code = WaitForSingleObject(sp->sema, - /* timeout */ INFINITE); - - /* if the reason for the wakeup was that we were signalled, - * break out, otherwise try again, since the semaphore count is - * decreased only when we get WAIT_OBJECT_0 back. - */ - if (code == WAIT_OBJECT_0) break; - } - - /* now clean up */ - EnterCriticalSection(csp); - - /* must be signalled */ - osi_assert(sp->states & OSI_SLEEPINFO_SIGNALLED); - - /* free the sleep structure, must be done under bucket lock - * so that we can check reference count and serialize with - * those who change it. - */ - osi_FreeSleepInfo(sp); - - LeaveCriticalSection(csp); -} - -/* utility function to wakeup someone sleeping in SleepSched */ -void osi_WakeupSpin(long sleepValue) -{ - register int idx; - register CRITICAL_SECTION *csp; - register osi_sleepInfo_t *tsp; - - idx = osi_SLEEPHASH(sleepValue); - csp = &osi_critSec[idx]; - EnterCriticalSection(csp); - for(tsp=osi_sleepers[idx]; tsp; tsp=(osi_sleepInfo_t *) osi_QNext(&tsp->q)) { - if ((!(tsp->states & (OSI_SLEEPINFO_DELETED|OSI_SLEEPINFO_SIGNALLED))) - && tsp->value == sleepValue) { - ReleaseSemaphore(tsp->sema, 1, (long *) 0); - tsp->states |= OSI_SLEEPINFO_SIGNALLED; - } - } - LeaveCriticalSection(csp); -} - -void osi_Sleep(long sleepVal) -{ - CRITICAL_SECTION *csp; - - /* may as well save some code by using SleepSched again */ - csp = &osi_baseAtomicCS[0]; - EnterCriticalSection(csp); - osi_SleepSpin(sleepVal, csp); -} - -void osi_Wakeup(long sleepVal) -{ - /* how do we do osi_Wakeup on a per-lock package type? */ - - osi_WakeupSpin(sleepVal); -} - -long osi_SleepFDCreate(osi_fdType_t *fdTypep, osi_fd_t **outpp) -{ - osi_sleepFD_t *cp; - - cp = (osi_sleepFD_t *)malloc(sizeof(*cp)); - memset((void *) cp, 0, sizeof(*cp)); - cp->idx = 0; - cp->sip = NULL; - - /* done */ - *outpp = &cp->fd; - return 0; -} - -long osi_SleepFDClose(osi_fd_t *cp) -{ - free((void *) cp); - return 0; -} - -/* called with osi_sleepFDCS locked; returns with same, so that - * we know that the sleep info pointed to by the cookie won't change - * until the caller releases the lock. - */ -void osi_AdvanceSleepFD(osi_sleepFD_t *cp) -{ - int idx; /* index we're dealing with */ - int oidx; /* index we locked */ - osi_sleepInfo_t *sip; - osi_sleepInfo_t *nsip; - - idx = 0; /* so we go around once safely */ - sip = NULL; - while(idx < OSI_SLEEPHASHSIZE) { - /* cp->sip should be held */ - idx = cp->idx; - EnterCriticalSection(&osi_critSec[idx]); - oidx = idx; /* remember original index; that's the one we locked */ - - /* if there's a sleep info structure in the FD, it should be held; it - * is the one we just processed, so we want to move on to the next. - * If not, then we want to process the chain in the bucket idx points - * to. - */ - if ((sip = cp->sip) == NULL) { - sip = osi_sleepers[idx]; - if (!sip) idx++; - else sip->refCount++; - } - else { - /* it is safe to release the current sleep info guy now - * since we hold the bucket lock. Pull next guy out first, - * since if sip is deleted, Release will move him into - * free list. - */ - nsip = (osi_sleepInfo_t *) sip->q.nextp; - osi_ReleaseSleepInfo(sip); - sip = nsip; - - if (sip) sip->refCount++; - else idx++; - } - cp->idx = idx; - cp->sip = sip; - LeaveCriticalSection(&osi_critSec[oidx]); - - /* now, if we advanced to a new sleep info structure, we're - * done, otherwise we continue and look at the next hash bucket - * until we're out of them. - */ - if (sip) break; - } -} - - -long osi_SleepFDGetInfo(osi_fd_t *ifdp, osi_remGetInfoParms_t *parmsp) -{ - osi_sleepFD_t *fdp = (osi_sleepFD_t *) ifdp; - osi_sleepInfo_t *sip; - long code; - - /* now, grab a mutex serializing all iterations over FDs, so that - * if the RPC screws up and sends us two calls on the same FD, we don't - * crash and burn advancing the same FD concurrently. Probably paranoia, - * but you generally shouldn't trust stuff coming over the network. - */ - EnterCriticalSection(&osi_sleepFDCS); - - /* this next call advances the FD to the next guy, and simultaneously validates - * that the info from the network is valid. If it isn't, we do our best to - * resynchronize our position, but we might return some info multiple times. - */ - osi_AdvanceSleepFD(fdp); - - /* now copy out info */ - if (sip = fdp->sip) { /* one '=' */ - parmsp->idata[0] = sip->value; - parmsp->idata[1] = sip->tid; - parmsp->idata[2] = sip->states; - parmsp->icount = 3; - parmsp->scount = 0; - code = 0; - } - else code = OSI_DBRPC_EOF; - - LeaveCriticalSection(&osi_sleepFDCS); - - return code; -} - -/* finally, DLL-specific code for NT */ -BOOL APIENTRY DLLMain(HANDLE inst, DWORD why, char *reserved) -{ - return 1; -} - -/* some misc functions for setting hash table sizes */ - -/* return true iff x is prime */ -int osi_IsPrime(unsigned long x) -{ - unsigned long c; - - /* even numbers aren't prime */ - if ((x & 1) == 0 && x != 2) return 0; - - for(c = 3; c x) return 1; - } - - /* probably never get here */ - return 1; -} - -/* return first prime number less than or equal to x */ -unsigned long osi_PrimeLessThan(unsigned long x) { - unsigned long c; - - for(c = x; c > 1; c--) { - if (osi_IsPrime(c)) return c; - } - - /* ever reached? */ - return 1; -} - -/* return the # of seconds since some fixed date */ -unsigned long osi_GetBootTime(void) -{ - return osi_bootTime; -} - -static int (*notifFunc)(char *, char *, long) = NULL; - -void osi_InitPanic(void *anotifFunc) -{ - notifFunc = anotifFunc; -} - -void osi_panic(char *msgp, char *filep, long line) -{ - osi_LogPanic(filep, line); - - if (notifFunc) - (*notifFunc)(msgp, filep, line); -} - -/* get time in seconds since some relatively recent time */ -unsigned long osi_Time(void) -{ - FILETIME fileTime; - SYSTEMTIME sysTime; - unsigned long remainder; - LARGE_INTEGER bootTime; - - /* setup boot time values */ - GetSystemTime(&sysTime); - SystemTimeToFileTime(&sysTime, &fileTime); - - /* change the base of the time so it won't be negative for a long time */ - fileTime.dwHighDateTime -= 28000000; - - bootTime.HighPart = fileTime.dwHighDateTime; - bootTime.LowPart = fileTime.dwLowDateTime; - /* now, bootTime is in 100 nanosecond units, and we'd really rather - * have it in 1 second units, units 10,000,000 times bigger. - * So, we divide. - */ - bootTime = ExtendedLargeIntegerDivide(bootTime, 10000000, &remainder); - return bootTime.LowPart; -} - -/* get time in seconds since some relatively recent time */ -void osi_GetTime(long *timesp) -{ - FILETIME fileTime; - SYSTEMTIME sysTime; - unsigned long remainder; - LARGE_INTEGER bootTime; - - /* setup boot time values */ - GetSystemTime(&sysTime); - SystemTimeToFileTime(&sysTime, &fileTime); - - /* change the base of the time so it won't be negative for a long time */ - fileTime.dwHighDateTime -= 28000000; - - bootTime.HighPart = fileTime.dwHighDateTime; - bootTime.LowPart = fileTime.dwLowDateTime; - /* now, bootTime is in 100 nanosecond units, and we'd really rather - * have it in 1 microsecond units, units 10 times bigger. - * So, we divide. - */ - bootTime = ExtendedLargeIntegerDivide(bootTime, 10, &remainder); - bootTime = ExtendedLargeIntegerDivide(bootTime, 1000000, &remainder); - timesp[0] = bootTime.LowPart; /* seconds */ - timesp[1] = remainder; /* microseconds */ -} diff --git a/src/WINNT/client_osi/osisleep.h b/src/WINNT/client_osi/osisleep.h deleted file mode 100644 index 4bf61751d..000000000 --- a/src/WINNT/client_osi/osisleep.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _OSISLEEP_H_ENV_ -#define _OSISLEEP_H_ENV_ 1 - -/*#include "osi.h"*/ -#include "osifd.h" -#include "osiqueue.h" -#ifdef DJGPP -#include "osithrd95.h" -#endif /* DJGPP */ - -/* states bits */ -#define OSI_SLEEPINFO_SIGNALLED 1 /* this sleep structure has been signalled */ -#define OSI_SLEEPINFO_INHASH 2 /* this guy is in the hash table */ -#define OSI_SLEEPINFO_DELETED 4 /* remove this guy when refcount hits 0 */ - -/* waitinfo bits */ -#define OSI_SLEEPINFO_W4READ 1 /* waiting for a read lock */ -#define OSI_SLEEPINFO_W4WRITE 2 /* waiting for a write lock */ -typedef struct osi_sleepInfo { - osi_queue_t q; - long value; /* sleep value when in a sleep queue, patch addr for turnstiles */ - unsigned long tid; /* thread ID of sleeper */ - EVENT_HANDLE sema; /* semaphore for this entry */ - unsigned short states; /* states bits */ - unsigned short idx; /* sleep hash table we're in, if in hash */ - unsigned short waitFor; /* what are we waiting for; used for bulk wakeups */ - unsigned long refCount;/* reference count from FDs */ -} osi_sleepInfo_t; - -/* first guy is the most recently added process */ -typedef struct osi_turnstile { - osi_sleepInfo_t *firstp; - osi_sleepInfo_t *lastp; -} osi_turnstile_t; - -typedef struct osi_sleepFD{ - osi_fd_t fd; /* FD header */ - osi_sleepInfo_t *sip; /* ptr to the dude */ - int idx; /* hash index */ -} osi_sleepFD_t; - -/* struct for single-shot initialization support */ -typedef struct osi_once { -#ifndef DJGPP - long atomic; /* used for atomicity */ -#else - osi_mutex_t atomic; /* used for atomicity */ -#endif /* !DJGPP */ - int done; /* tells if initialization is done */ -} osi_once_t; - -/* size of mutex hash table; should be a prime number; used for mutex and lock hashing */ -#define OSI_MUTEXHASHSIZE 251 /* prime number */ - -#define osi_MUTEXHASH(x) ((unsigned short) (((unsigned long) x) % (unsigned) OSI_MUTEXHASHSIZE)) - -/* size of sleep value hash table. Must be power of 2 */ -#define OSI_SLEEPHASHSIZE 128 - -/* hash function */ -#define osi_SLEEPHASH(x) (((x)>>2)&(OSI_SLEEPHASHSIZE-1)) - -/* export this so that RPC function can call osi_NextSleepCookie while - * holding this lock, so that locks don't get released while we're copying - * out this info. - */ -extern Crit_Sec osi_sleepCookieCS; - -/* spin lock version of atomic sleep, used internally only */ -extern void osi_SleepSpin(long value, Crit_Sec *counterp); - -/* spin lock version of wakeup, used internally only */ -extern void osi_WakeupSpin(long value); - -#ifndef DJGPP -/* exported function to sleep on a value */ -extern void osi_Sleep (long); -#endif - -extern void osi_FreeSleepInfo(osi_sleepInfo_t *); - -/* function to atomically initialize and return a "once only" - * structure. Returns true if you're the first caller, otherwise - * returns 0. - */ -extern int osi_Once(osi_once_t *); - -/* function like the above, but doesn't set the once-only flag. - * Can be used as optimization to tell if osi_Once has been - * called. If it returns true, by the time you really call - * osi_Once, someone else may have called it, but if it - * return false, you're guaranteed it will stay false, and that - * osi_Once would return false, too. - */ -extern int osi_TestOnce(osi_once_t *); - -/* called once for each call to osi_Once that returns true; permits other - * calls to osi_Once to proceed (and return false). - */ -extern void osi_EndOnce(osi_once_t *); - - -#ifndef DJGPP -/* exported function to wakeup those sleeping on a value */ -extern void osi_Wakeup (long); - -extern void osi_Init (void); -#endif /* !DJGPP */ - -/* create a ptr to a cookie */ -osi_sleepFD_t *osi_CreateSleepCookie(void); - -/* release a ptr to a sleep cookie */ -void osi_FreeSleepCookie(osi_sleepFD_t *); - -/* advance a sleep cookie to the next ptr */ -int osi_NextSleepCookie(osi_sleepFD_t *); - -/* functions for the sleep FD implementation */ -extern long osi_SleepFDCreate(osi_fdType_t *, osi_fd_t **); -#ifndef DJGPP -extern long osi_SleepFDGetInfo(osi_fd_t *, osi_remGetInfoParms_t *); -#endif -extern long osi_SleepFDClose(osi_fd_t *); - -/* functions for getting hash sizes */ -extern int osi_IsPrime(unsigned long); -extern unsigned long osi_PrimeLessThan(unsigned long); - -/* time functions */ -unsigned long osi_GetBootTime(void); - -#define osi_assert(x) \ - do { \ - if (!(x)) osi_panic(NULL, __FILE__, __LINE__); \ - } while(0) - -#define osi_assertx(x,s) \ - do { \ - if (!(x)) osi_panic((s), __FILE__, __LINE__); \ - } while(0) - -/* panic */ -void osi_InitPanic(void *anotifFunc); -void osi_panic(char *, char *, long); - -unsigned long osi_Time(void); - -extern void osi_TWait(osi_turnstile_t *turnp, int waitFor, void *patchp, - Crit_Sec *releasep); - -extern void osi_TSignal(osi_turnstile_t *turnp); - -extern void osi_TBroadcast(osi_turnstile_t *turnp); - -extern void osi_TSignalForMLs(osi_turnstile_t *turnp, int stillHaveReaders, Crit_Sec *csp); - -#define osi_TInit(t) ((t)->firstp = (t)->lastp = 0) - -#define osi_TEmpty(t) ((t)->firstp == NULL) - -#endif /*_OSISLEEP_H_ENV_ */ diff --git a/src/WINNT/client_osi/osistatl.c b/src/WINNT/client_osi/osistatl.c deleted file mode 100644 index 405acc315..000000000 --- a/src/WINNT/client_osi/osistatl.c +++ /dev/null @@ -1,938 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#include -#include "osi.h" -#include -#include - -/* locking hierarchy: - * 1. osi_statFDCS - * 2. osi_activeInfoAllocCS. - * 3. individual log critical sections (since we call log pkg). - * - * There are no cases today where both 1 and 2 are locked simultaneously. - */ - -/* el cheapo watch system */ -osi_watchProc_t *osi_statWatchProcp; /* proc to call on too-long held locks */ -void *osi_statWatchRockp; /* with this rock */ -unsigned long osi_statWatchMS; /* after a lock is held this many MS */ - -/* type index of the statistics gathering lock package */ -int osi_statType; - -/* log to which to log lock events */ -osi_log_t *osi_statLogp; - -/* queue of all rwlock auxiliary structures */ -osi_queue_t *osi_allRWLocks; - -/* queue of all mutex auxiliary structures */ -osi_queue_t *osi_allMutexes; - -/* free list and mutex for active info structures */ -osi_activeInfo_t *osi_activeInfoFreeListp; -CRITICAL_SECTION osi_activeInfoAllocCS; - -/* atomicity-providing critical sections */ -CRITICAL_SECTION osi_statAtomicCS[OSI_MUTEXHASHSIZE]; - -/* lock protecting ref count on locks, osi_allMutexes and osi_RWLocks, and - * file descriptor contents - */ -CRITICAL_SECTION osi_statFDCS; - -void osi_SetStatLog(osi_log_t *logp) -{ - /* nicer if ref counted */ - osi_statLogp = logp; -} - -static void lock_ObtainWriteStat(osi_rwlock_t *lockp) -{ - osi_rwlockStat_t *realp; - osi_activeInfo_t *ap; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *)lockp->d.privateDatap; - ap = NULL; - - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if ((lockp->waiters > 0) || (lockp->flags & OSI_LOCKFLAG_EXCL) - || (lockp->readers > 0)) { - lockp->waiters++; - if (!ap) ap = osi_QueueActiveInfo(&realp->qi, - OSI_ACTIVEFLAGS_WRITER | OSI_ACTIVEFLAGS_WAITER); - osi_TWait(&realp->turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, csp); - lockp->waiters--; - osi_assert((lockp->flags & OSI_LOCKFLAG_EXCL) && lockp->readers == 0); - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - } - - /* if we have ap set, we have some timer info about the last sleep operation - * that we should merge in under the spin lock. - */ - if (ap) { - /* remove from queue and turn time to incremental time */ - osi_RemoveActiveInfo(&realp->qi, ap); - - /* add in increment to statistics */ - realp->writeBlockedCount++; - realp->writeBlockedTime = LargeIntegerAdd(realp->writeBlockedTime, - ap->startTime); - osi_FreeActiveInfo(ap); - } - - osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_WRITER); - LeaveCriticalSection(csp); -} - -static void lock_ObtainReadStat(osi_rwlock_t *lockp) -{ - osi_activeInfo_t *ap; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - ap = NULL; - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - lockp->waiters++; - if (!ap) ap = osi_QueueActiveInfo(&realp->qi, - OSI_ACTIVEFLAGS_WAITER | OSI_ACTIVEFLAGS_READER); - osi_TWait(&realp->turn, OSI_SLEEPINFO_W4READ, &lockp->readers, csp); - lockp->waiters--; - osi_assert(!(lockp->flags & OSI_LOCKFLAG_EXCL) && lockp->readers > 0); - } - else { - /* if we're here, all clear to set the lock */ - lockp->readers++; - } - - if (ap) { - /* have statistics to merge in */ - osi_RemoveActiveInfo(&realp->qi, ap); - realp->readBlockedCount++; - realp->readBlockedTime = LargeIntegerAdd(realp->readBlockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - } - - osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_READER); - LeaveCriticalSection(csp); -} - -static void lock_ReleaseReadStat(osi_rwlock_t *lockp) -{ - osi_activeInfo_t *ap; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *)lockp->d.privateDatap; - - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->readers > 0); - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap != NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->readLockedCount++; - realp->readLockedTime = LargeIntegerAdd(realp->readLockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - if (--lockp->readers == 0 && !osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 0, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -static void lock_ConvertWToRStat(osi_rwlock_t *lockp) -{ - osi_activeInfo_t *ap; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *)lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap !=NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->writeLockedCount++; - realp->writeLockedTime = LargeIntegerAdd(realp->writeLockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - /* and obtain the read lock */ - lockp->readers++; - osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_READER); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 1, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -static void lock_ReleaseWriteStat(osi_rwlock_t *lockp) -{ - osi_activeInfo_t *ap; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *)lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap !=NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->writeLockedCount++; - realp->writeLockedTime = LargeIntegerAdd(realp->writeLockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 0, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -static void lock_ObtainMutexStat(struct osi_mutex *lockp) -{ - osi_activeInfo_t *ap; - osi_mutexStat_t *realp; - CRITICAL_SECTION *csp; - - ap = NULL; - realp = (osi_mutexStat_t *) lockp->d.privateDatap; - - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - lockp->waiters++; - ap = osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_WAITER); - osi_TWait(&realp->turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, csp); - lockp->waiters--; - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - } - - /* release the blocking ap */ - if (ap) { - osi_RemoveActiveInfo(&realp->qi, ap); - realp->blockedCount++; - realp->blockedTime = LargeIntegerAdd(realp->blockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - } - - /* start tracking this call */ - osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_WRITER); - - LeaveCriticalSection(csp); -} - -static void lock_ReleaseMutexStat(struct osi_mutex *lockp) -{ - osi_activeInfo_t *ap; - osi_mutexStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_mutexStat_t *)lockp->d.privateDatap; - - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap != NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->lockedCount++; - realp->lockedTime = LargeIntegerAdd(realp->lockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 0, csp); - } - else { - /* and finally release the big lock */ - LeaveCriticalSection(csp); - } -} - -static int lock_TryReadStat(struct osi_rwlock *lockp) -{ - long i; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if (lockp->waiters > 0 || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - i = 0; - } - else { - /* if we're here, all clear to set the lock */ - lockp->readers++; - i = 1; - } - - /* start tracking lock holding stats */ - if (i) osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_READER); - - LeaveCriticalSection(csp); - - return i; -} - - -static int lock_TryWriteStat(struct osi_rwlock *lockp) -{ - long i; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if ((lockp->waiters > 0) || (lockp->flags & OSI_LOCKFLAG_EXCL) - || (lockp->readers > 0)) { - i = 0; - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - i = 1; - } - - /* start tracking lock holding stats */ - if (i) osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_WRITER); - - LeaveCriticalSection(csp); - - return i; -} - - -static int lock_GetRWLockStateStat(struct osi_rwlock *lockp) -{ - long i; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - i = 0; - if (lockp->flags & OSI_LOCKFLAG_EXCL) { - i |= OSI_RWLOCK_WRITEHELD; - } - if (lockp->readers) { - i |= OSI_RWLOCK_READHELD; - } - - LeaveCriticalSection(csp); - - return i; -} - - -static int lock_GetMutexStateStat(struct osi_mutex *lockp) { - long i; - osi_mutexStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_mutexStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - i = 0; - if (lockp->flags & OSI_LOCKFLAG_EXCL) { - i |= OSI_MUTEX_HELD; - } - - LeaveCriticalSection(csp); - - return i; -} - -static int lock_TryMutexStat(struct osi_mutex *lockp) { - long i; - osi_mutexStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_mutexStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - /* here we have the fast lock, so see if we can obtain the real lock */ - if ((lockp->waiters > 0) || (lockp->flags & OSI_LOCKFLAG_EXCL)) { - i = 0; - } - else { - /* if we're here, all clear to set the lock */ - lockp->flags |= OSI_LOCKFLAG_EXCL; - i = 1; - } - - if (i) osi_QueueActiveInfo(&realp->qi, 0); - - LeaveCriticalSection(csp); - - return i; -} - -static void osi_SleepRStat(long sleepVal, struct osi_rwlock *lockp) -{ - osi_rwlockStat_t *realp; - osi_activeInfo_t *ap; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->readers > 0); - - if (--lockp->readers == 0 && !osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 0, NULL); - } - - /* now merge in lock hold stats */ - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap != NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->writeLockedCount++; - realp->writeLockedTime = LargeIntegerAdd(realp->writeLockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - /* now call into scheduler to sleep atomically with releasing spin lock */ - osi_SleepSpin(sleepVal, csp); -} - -static void osi_SleepWStat(long sleepVal, struct osi_rwlock *lockp) -{ - osi_activeInfo_t *ap; - osi_rwlockStat_t *realp; - CRITICAL_SECTION *csp; - - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 0, NULL); - } - - /* now merge in lock hold stats */ - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap != NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->readLockedCount++; - realp->readLockedTime = LargeIntegerAdd(realp->readLockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - /* and finally release the big lock */ - osi_SleepSpin(sleepVal, csp); -} - -static void osi_SleepMStat(long sleepVal, struct osi_mutex *lockp) -{ - osi_mutexStat_t *realp; - osi_activeInfo_t *ap; - CRITICAL_SECTION *csp; - - realp = (osi_mutexStat_t *) lockp->d.privateDatap; - - /* otherwise we're the fast base type */ - csp = &osi_statAtomicCS[lockp->atomicIndex]; - EnterCriticalSection(csp); - - osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL); - - lockp->flags &= ~OSI_LOCKFLAG_EXCL; - if (!osi_TEmpty(&realp->turn)) { - osi_TSignalForMLs(&realp->turn, 0, NULL); - } - - /* now merge in lock hold stats */ - ap = osi_FindActiveInfo(&realp->qi); - osi_assert(ap != NULL); - osi_RemoveActiveInfo(&realp->qi, ap); - realp->lockedCount++; - realp->lockedTime = LargeIntegerAdd(realp->lockedTime, ap->startTime); - osi_FreeActiveInfo(ap); - - /* and finally release the big lock */ - osi_SleepSpin(sleepVal, csp); -} - -/* this is a function that release a ref count, but we give it a different - * name than release to avoid confusion with all of the releases here. - * Must be called holding the osi_statFDCS lock. - */ -static void lock_DecrMutexStat(osi_mutexStat_t *mp) -{ - if (--mp->refCount <= 0 && (mp->states & OSI_STATL_DELETED)) { - osi_QRemove(&osi_allMutexes, &mp->q); - free((void *)mp); - } -} - -/* Must be called holding the osi_statFDCS lock. */ -static void lock_DecrRWLockStat(osi_rwlockStat_t *rwp) -{ - if (--rwp->refCount <= 0 && (rwp->states & OSI_STATL_DELETED)) { - osi_QRemove(&osi_allRWLocks, &rwp->q); - free((void *)rwp); - } -} - -static void lock_FinalizeMutexStat(osi_mutex_t *lockp) -{ - osi_mutexStat_t *realp; - - /* pull out the real pointer */ - realp = (osi_mutexStat_t *) lockp->d.privateDatap; - - /* remove from the queues, and free */ - EnterCriticalSection(&osi_statFDCS); - if (realp->refCount <= 0) { - osi_QRemove(&osi_allMutexes, &realp->q); - free((void *) realp); - } - else realp->states |= OSI_STATL_DELETED; - LeaveCriticalSection(&osi_statFDCS); -} - -static void lock_FinalizeRWLockStat(osi_rwlock_t *lockp) -{ - osi_rwlockStat_t *realp; - - /* pull out the real pointer */ - realp = (osi_rwlockStat_t *) lockp->d.privateDatap; - - /* remove from the queues, and free */ - EnterCriticalSection(&osi_statFDCS); - if (realp->refCount <= 0) { - osi_QRemove(&osi_allRWLocks, &realp->q); - free((void *) realp); - } - else realp->states |= OSI_STATL_DELETED; - LeaveCriticalSection(&osi_statFDCS); -} - -void lock_InitializeRWLockStat(osi_rwlock_t *lockp, char *namep) -{ - osi_rwlockStat_t *realp; - - realp = (osi_rwlockStat_t *) malloc(sizeof(*realp)); - lockp->d.privateDatap = (void *) realp; - lockp->type = osi_statType; - lockp->flags = 0; - lockp->readers = 0; - lockp->atomicIndex = osi_MUTEXHASH(lockp); - memset(realp, 0, sizeof(*realp)); - osi_TInit(&realp->turn); - realp->qi.namep = namep; - realp->qi.backp = lockp; - EnterCriticalSection(&osi_statFDCS); - osi_QAdd(&osi_allRWLocks, &realp->q); - LeaveCriticalSection(&osi_statFDCS); -} - -void lock_InitializeMutexStat(osi_mutex_t *lockp, char *namep) -{ - osi_mutexStat_t *realp; - - realp = (osi_mutexStat_t *) malloc(sizeof(*realp)); - lockp->d.privateDatap = (void *) realp; - lockp->type = osi_statType; - lockp->flags = 0; - lockp->atomicIndex = osi_MUTEXHASH(lockp); - memset(realp, 0, sizeof(*realp)); - osi_TInit(&realp->turn); - realp->qi.namep = namep; - realp->qi.backp = lockp; - EnterCriticalSection(&osi_statFDCS); - osi_QAdd(&osi_allMutexes, &realp->q); - LeaveCriticalSection(&osi_statFDCS); -} - -static void osi_FreeActiveInfo(osi_activeInfo_t *ap) -{ - EnterCriticalSection(&osi_activeInfoAllocCS); - ap->q.nextp = (osi_queue_t *) osi_activeInfoFreeListp; - osi_activeInfoFreeListp = ap; - LeaveCriticalSection(&osi_activeInfoAllocCS); -} - -static osi_activeInfo_t *osi_AllocActiveInfo() -{ - osi_activeInfo_t *ap; - - EnterCriticalSection(&osi_activeInfoAllocCS); - if (!(ap = osi_activeInfoFreeListp)) { - ap = (osi_activeInfo_t *) malloc(sizeof(osi_activeInfo_t)); - } - else { - osi_activeInfoFreeListp = (osi_activeInfo_t *) ap->q.nextp; - } - LeaveCriticalSection(&osi_activeInfoAllocCS); - - return ap; -} - -static osi_activeInfo_t *osi_QueueActiveInfo(osi_qiStat_t *qp, int flags) -{ - osi_activeInfo_t *ap; - osi_queue_t **qpp = (osi_queue_t **) &qp->activeListp; - char *whatp; - - ap = osi_AllocActiveInfo(); - ap->flags = flags; - ap->startTime.LowPart = GetCurrentTime(); - ap->startTime.HighPart = 0; - ap->tid = GetCurrentThreadId(); - osi_QAdd(qpp, &ap->q); - if (osi_statLogp && (flags & OSI_ACTIVEFLAGS_WAITER)) { - if (flags & OSI_ACTIVEFLAGS_READER) - whatp = "read lock"; - else if (flags & OSI_ACTIVEFLAGS_WRITER) - whatp = "write lock"; - else whatp = "mutex"; - osi_Log2(osi_statLogp, "Blocking on %s on %s", whatp, qp->namep); - } - return ap; -} - -static void osi_RemoveActiveInfo(osi_qiStat_t *qp, osi_activeInfo_t *ap) -{ - unsigned long now; - osi_queue_t **qpp = (osi_queue_t **) &qp->activeListp; - long flags; - char *whatp; - - now = GetCurrentTime(); - osi_QRemove(qpp, &ap->q); - flags = ap->flags; - ap->startTime.LowPart = now - ap->startTime.LowPart; - - if (osi_statLogp && (flags & OSI_ACTIVEFLAGS_WAITER)) { - if (flags & OSI_ACTIVEFLAGS_READER) - whatp = "read lock"; - else if (flags & OSI_ACTIVEFLAGS_WRITER) - whatp = "write lock"; - else whatp = "mutex"; - osi_Log2(osi_statLogp, "Finally obtained %s on %s", whatp, qp->namep); - } - else { - /* releasing a lock or mutex */ - if (osi_statWatchProcp && ap->startTime.LowPart > osi_statWatchMS) { - (*osi_statWatchProcp)(osi_statWatchRockp, ap->startTime.LowPart, - qp->backp); - } - } -} - -static osi_activeInfo_t *osi_FindActiveInfo(osi_qiStat_t *qp) -{ - unsigned long tid; - osi_activeInfo_t *ap; - osi_queue_t *tqp; - osi_queue_t **qpp = (osi_queue_t **) &qp->activeListp; - - ap = NULL; - tid = GetCurrentThreadId(); - if (*qpp != NULL) { - for(tqp = *qpp; tqp; tqp = tqp->nextp) { - ap = (osi_activeInfo_t *) tqp; - if (ap->tid == tid) break; - } - } - return ap; -} - -static osi_lockOps_t osi_statOps = { - lock_ObtainReadStat, - lock_ObtainWriteStat, - lock_ReleaseReadStat, - lock_ReleaseWriteStat, - lock_ObtainMutexStat, - lock_ReleaseMutexStat, - lock_TryReadStat, - lock_TryWriteStat, - lock_TryMutexStat, - osi_SleepRStat, - osi_SleepWStat, - osi_SleepMStat, - lock_InitializeMutexStat, - lock_InitializeRWLockStat, - lock_FinalizeMutexStat, - lock_FinalizeRWLockStat, - lock_ConvertWToRStat, - lock_GetRWLockStateStat, - lock_GetMutexStateStat -}; - -long osi_StatFDCreate(osi_fdType_t *typep, osi_fd_t **fdpp) -{ - osi_statFD_t *fdp; - osi_mutexStat_t *mp; - osi_rwlockStat_t *rwp; - - fdp = (osi_statFD_t *) malloc(sizeof(*fdp)); - EnterCriticalSection(&osi_statFDCS); - if (osi_allMutexes) { - fdp->curp = osi_allMutexes; - mp = (osi_mutexStat_t *) fdp->curp; - mp->refCount++; - fdp->which = 0; - } - else if (osi_allRWLocks) { - fdp->curp = osi_allRWLocks; - rwp = (osi_rwlockStat_t *) fdp->curp; - rwp->refCount++; - fdp->which = 1; - } - else fdp->curp = NULL; - LeaveCriticalSection(&osi_statFDCS); - - *fdpp = &fdp->fd; - - return 0; -} - -long osi_StatFDGetInfo(osi_fd_t *ifdp, osi_remGetInfoParms_t *parmsp) -{ - osi_mutexStat_t *mp; - osi_statFD_t *fdp; - osi_rwlockStat_t *rwp; - osi_queue_t *qp; - osi_mutex_t *backMutexp; - osi_rwlock_t *backRWLockp; - - /* initialize out structure */ - parmsp->icount = 0; - parmsp->scount = 0; - - fdp = (osi_statFD_t *) ifdp; - qp = fdp->curp; - - /* we're done if curp is null */ - if (qp == NULL) return OSI_DBRPC_EOF; - - /* copy out statistics */ - if (fdp->which == 0) { - /* this is a mutex */ - mp = (osi_mutexStat_t *) qp; - - memset((void *) parmsp, 0, sizeof(*parmsp)); - backMutexp = mp->qi.backp; - parmsp->idata[0] = (long) backMutexp; - parmsp->idata[1] = (backMutexp->flags & OSI_LOCKFLAG_EXCL)? 1 : 0; - /* reader count [2] is 0 */ - parmsp->idata[3] = (backMutexp->waiters > 0)? 1 : 0; - parmsp->idata[4] = mp->lockedTime.LowPart; - parmsp->idata[5] = mp->lockedCount; - parmsp->idata[6] = mp->blockedTime.LowPart; - parmsp->idata[7] = mp->blockedCount; - strcpy(parmsp->sdata[0], mp->qi.namep); - parmsp->icount = 8; - parmsp->scount = 1; - } - else if (fdp->which == 1) { - /* rwlock */ - rwp = (osi_rwlockStat_t *) qp; - - memset((void *) parmsp, 0, sizeof(*parmsp)); - backRWLockp = rwp->qi.backp; - parmsp->idata[0] = (long) backRWLockp; - parmsp->idata[1] = (backRWLockp->flags & OSI_LOCKFLAG_EXCL)? 1 : 0; - parmsp->idata[2] = backRWLockp->readers; - parmsp->idata[3] = (backRWLockp->waiters > 0)? 1 : 0; - parmsp->idata[4] = rwp->writeLockedTime.LowPart; - parmsp->idata[5] = rwp->writeLockedCount; - parmsp->idata[6] = rwp->writeBlockedTime.LowPart; - parmsp->idata[7] = rwp->writeBlockedCount; - parmsp->idata[8] = rwp->readLockedTime.LowPart; - parmsp->idata[9] = rwp->readLockedCount; - parmsp->idata[10] = rwp->readBlockedTime.LowPart; - parmsp->idata[11] = rwp->readBlockedCount; - strcpy(parmsp->sdata[0], rwp->qi.namep); - parmsp->scount = 1; - parmsp->icount = 12; - } - - /* advance to next position */ - EnterCriticalSection(&osi_statFDCS); - if (qp != NULL) { - if (fdp->which == 0) { - mp = (osi_mutexStat_t *) qp; - lock_DecrMutexStat(mp); - } - else if (fdp->which == 1) { - rwp = (osi_rwlockStat_t *) qp; - lock_DecrRWLockStat(rwp); - } - qp = osi_QNext(qp); - } - if (qp == NULL && fdp->which == 0) { - fdp->which = 1; - if (osi_allRWLocks) qp = osi_allRWLocks; - else qp = NULL; - } - fdp->curp = qp; - if (qp != NULL) { - if (fdp->which == 0) { - mp = (osi_mutexStat_t *) qp; - mp->refCount++; - } - else if (fdp->which == 1) { - rwp = (osi_rwlockStat_t *) qp; - rwp->refCount++; - } - } - LeaveCriticalSection(&osi_statFDCS); - - return 0; -} - -long osi_StatFDClose(osi_fd_t *ifdp) -{ - free((void *)ifdp); - return 0; -} - -osi_fdOps_t osi_statFDOps = { - osi_StatFDCreate, - osi_StatFDGetInfo, - osi_StatFDClose -}; - -void osi_StatInit() -{ - osi_fdType_t *typep; - int i; - - /* initialize the stat package */ - InitializeCriticalSection(&osi_activeInfoAllocCS); - InitializeCriticalSection(&osi_statFDCS); - - for(i=0; i - -#include - -/* -thread95.c - -This code implements a partial OSI-over-LWP(and IOMGR) layer for threading -and synchronization, for the AFS NT code port to Windows 9x. -*/ - -// It so happens that all code seen so far throws away *thread_id; -// unfortunately, callers do not send thread_id==NULL instead of getting -// a value and tossing it. :( -thread_t thrd_Create(int attributes, int stacksize, ThreadFunc func, - void *parm, int flags, int *thread_id, char *name) -{ - PROCESS lwp_pid; - - // Reserve priority 0 for IOMGR; we use pri 1 by default - if (name) - LWP_CreateProcess(func, stacksize, 1, parm, name, &lwp_pid); - else - LWP_CreateProcess(func, stacksize, 1, parm, "thread", &lwp_pid); - - // In principle, the "right" way to do thread_id is to create a mapping - // between thread_id integers and LWP PROCESS names, but we're not using - // the IDs for anything anyway, so... - // actually, it turns out PROCESS is a pointer, so we fudge with that for now - // just to return a nonzero value - *thread_id = (int) lwp_pid; - - return lwp_pid; -} - -thread_t thrd_Current() -{ - PROCESS pid; - LWP_CurrentProcess(&pid); - return pid; -} - -int thrd_Close(thread_t thrd) -{ - int rc = LWP_DestroyProcess(thrd); - if (rc == LWP_SUCCESS) - return 0; - else - return -1; -} - -/* The following thread-local-storage and critical-section functions are - not used. */ -/* -DWORD thrd_Alloc(void) -{ - char **NewRock = NULL; - static int NextTag = 0; // Because LWP is not preemptive, we need no mutex - - NewRock = (char **) malloc (sizeof(LPVOID *)); - if (NewRock == NULL) - return 0xFFFFFFFF; - *NewRock = (LPVOID *) malloc(sizeof(LPVOID)); - if (*NewRock == NULL) { - free(NewRock); - return 0xFFFFFFFF; - } - - if (LWP_NewRock(++NextTag,NewRock)) - return 0xFFFFFFFF; - else - return NextTag; -} - -LPVOID thrd_GetValue(DWORD Index) -{ - char *ptr; - if (LWP_GetRock((int) Index, &ptr)) { - // SetLastError - return 0; - } else { - return * ((LPVOID *) ptr); - } -} - -BOOL thrd_SetValue(DWORD Index, LPVOID Value) { - char *ptr; - if (LWP_GetRock((int) Index, &ptr)) { - // SetLastError - return 0; - } else { - * ((LPVOID *) ptr) = Value; - return TRUE; - } -} - -#define LPCRITICAL_SECTION (struct Lock*) - -#define thrd_InitCrit (Lock_Init) -#define thrd_EnterCrit (ObtainWriteLock) -#define thrd_LeaveCrit (ReleaseWriteLock) - -// LWP has no formal destructor for locks. -#define thrd_DeleteCrit(x) ; - -*/ - - -/* Since LWP is nonpreemptive, arithmetic needs no special handling. */ - -LONG thrd_Increment(LPLONG number) -{ - ++*number; - return *number; -} - -LONG thrd_Decrement(LPLONG number) -{ - --*number; - return *number; -} - -LONG thrd_Exchange(LPLONG number, LONG value) -{ - LONG oldval = *number; - *number = value; - return oldval; -} - -// CreateEvent is always called with (NULL,(T/F),(T/F),NULL) -// This code will assume it and fail otherwise. -// SetLastError() is not implemented, i.e., if thrd_CreateEvent fails, -// there is no corresponding GetLastError() to pull out error codes -// at this time. -EVENT *thrd_CreateEvent(void *f, BOOL manual, BOOL startsignaled, void *g) -{ - // LWP code checks eventnames against NULL as an error condition, - // so we start counting from 1 instead of zero. - // It turns out that LWP uses event names as unique integer values, - // even though these values are cast as char pointers. We will use - // integers, since they are never dereferenced by LWP. - static unsigned long NextEventName = 1L; - EVENT *event; - - // Startup stuff - if ((f != NULL) || (g != NULL)) { - // Panic! This scenario is not implemented. - assert(0); - return NULL; - } - - // Create an event - if ((event=(EVENT*)malloc(sizeof(EVENT))) == NULL) - { - // SetLastError out of memory - return NULL; - } - if (manual) - event->state = startsignaled ? manualsignal : manualunsig; - else - event->state = startsignaled ? autosignal : autounsig; - event->name = (char *) NextEventName; - - // Increment NextEventName - ++NextEventName; - - return event; -} - -BOOL thrd_SetEvent(EVENT *event) -{ - if (event==NULL) - return FALSE; - if (AUTOMATIC(event)) - event->state = autosignal; - else - event->state = manualsignal; - LWP_SignalProcess(event->name); - return TRUE; -} - -BOOL thrd_ResetEvent(EVENT *event) -{ - if (event==NULL) - return FALSE; - if (AUTOMATIC(event)) - event->state = autounsig; - else - event->state = manualunsig; - return TRUE; -} - -// It appears there is a slight difference in the two wait schemes. -// Win32's WaitForSingleObject returns only when the wait is finished; -// LWP's WaitProcess may return randomly, and so requires while() wrapping -// (a little busywaiting). -DWORD thrd_WaitForSingleObject_Event(EVENT *event, DWORD timeoutms) -{ - if (timeoutms != INFINITE) { - // Panic! - assert(0); - return WAIT_FAILED; - } - if (event == NULL) { - return WAIT_FAILED; - } - while (!SIGNALED(event)) - LWP_WaitProcess(event->name); - if (AUTOMATIC(event)) - event->state = autounsig; - return WAIT_OBJECT_0; -} - -DWORD thrd_WaitForMultipleObjects_Event(DWORD count, EVENT* events[], - BOOL waitforall, DWORD timeoutms) -{ - if ((timeoutms != INFINITE) || waitforall) { - // Panic! This functionality not implemented. - assert(0); - return WAIT_FAILED; - } - if (events == NULL) { - return WAIT_FAILED; - } - - // Do the actual wait - { - // Construct the list of LWP events to wait on - char *names[count+1]; - int i; - for (i=0;istate = autounsig; - return (WAIT_OBJECT_0 + i); - } - names[i] = events[i]->name; - } - names[count] = NULL; - - // Do the wait for something to signal - while (1) { - LWP_MwaitProcess(1,names); - // Find who got signalled: MwaitProcess doesn't tell us. - for (i=0; istate = autounsig; - return WAIT_OBJECT_0 + i; - } - } - } - // not reached - assert(0); - } - // not reached - assert(0); -} - -int osi_Once(osi_once_t *argp) -{ - long i; - - lock_ObtainMutex(&argp->atomic); - - if (argp->done == 0) { - argp->done = 1; - return 1; - } - - /* otherwise we've already been initialized, so clear lock and return */ - lock_ReleaseMutex(&argp->atomic); - return 0; -} - -void osi_EndOnce(osi_once_t *argp) -{ - lock_ReleaseMutex(&argp->atomic); -} - -int osi_TestOnce(osi_once_t *argp) -{ - long localDone; - long i; - - lock_ObtainMutex(&argp->atomic); - - localDone = argp->done; - - /* drop interlock */ - lock_ReleaseMutex(&argp->atomic); - - return (localDone? 0 : 1); -} - -void osi_panic(char *s, char *f, long l) -{ - fprintf(stderr, "Fatal error: %s at %s:%d\n", s, f, l); - exit(1); -} - -/* return true iff x is prime */ -int osi_IsPrime(unsigned long x) -{ - unsigned long c; - - /* even numbers aren't prime */ - if ((x & 1) == 0 && x != 2) return 0; - - for(c = 3; c x) return 1; - } - - /* probably never get here */ - return 1; -} - -/* return first prime number less than or equal to x */ -unsigned long osi_PrimeLessThan(unsigned long x) { - unsigned long c; - - for(c = x; c > 1; c--) { - if (osi_IsPrime(c)) return c; - } - - /* ever reached? */ - return 1; -} diff --git a/src/WINNT/client_osi/osithrd95.h b/src/WINNT/client_osi/osithrd95.h deleted file mode 100644 index 8b23b2864..000000000 --- a/src/WINNT/client_osi/osithrd95.h +++ /dev/null @@ -1,130 +0,0 @@ -#ifndef THRD95_H -#define THRD95_H - -#include -#include -#include -#include - -/* Since we don't have windows.h to define booleans, we do it ourselves */ -#ifndef TRUE - #define TRUE (1) -#endif -#ifndef FALSE - #define FALSE (0) -#endif - -#define osi_rwlock_t struct Lock -#define osi_mutex_t struct Lock - -#define osi_Init() { PROCESS pid; LWP_InitializeProcessSupport(1,&pid); IOMGR_Initialize(); } - -/* -#define lock_InitializeMutex(a, b) Lock_Init(a) -#define lock_InitializeRWLock(a, b) Lock_Init(a) -*/ - -#define lock_InitializeRWLock(a, b) Lock_Init(a) -#define lock_InitializeMutex(a, b) lock_InitializeRWLock(a,b) - -#define lock_ObtainWrite(a) ObtainWriteLock(a) -#define lock_ObtainRead(a) ObtainReadLock(a) -#define lock_ObtainMutex(a) lock_ObtainWrite(a) -#define lock_ReleaseRead(a) ReleaseReadLock(a) -#define lock_ReleaseWrite(a) ReleaseWriteLock(a) -#define lock_ReleaseMutex(a) lock_ReleaseWrite(a) - -#define lock_FinalizeRWLock(a) /* */ -#define lock_FinalizeMutex(a) lock_FinalizeRWLock(a) - -/* -#define lock_TryWrite(a) if (!WriteLocked(a)) ObtainWriteLock(a) -#define lock_TryRead(a) if (!WriteLocked(a)) ObtainReadLock(a) -#define lock_TryMutex(a) if (!WriteLocked(a)) ObtainWriteLock(a) -*/ -#define lock_TryWrite(a) ( ((CheckLock(a)) == 0) ? (({ObtainWriteLock(a);}), 1) : 0 ) -#define lock_TryRead(a) ( ((CheckLock(a)) > -1) ? (({ObtainReadLock(a);}), 1) : 0 ) -#define lock_TryMutex(a) lock_TryWrite(a) -#define lock_GetMutexState(a) CheckLock(a) -#define lock_AssertMutex(a) assert(lock_GetMutexState(a) == -1) -#define lock_AssertWrite(a) assert(lock_GetMutexState(a) == -1) - -#define Crit_Sec osi_mutex_t -#define thrd_InitCrit(a) lock_InitializeMutex(a, "cs") -#define thrd_EnterCrit lock_ObtainMutex -#define thrd_LeaveCrit lock_ReleaseMutex -#define thrd_DeleteCrit(a) - -// Does LWP take a char* and read it as ASCIIZ, or as a pointer? -// ASCIIZ, perhaps? -/* -#define osi_Sleep(a) { char buf[sizeof(long)+1]; memcpy(buf,&a,sizeof(long)); buf[sizeof(long)]='\0'; LWP_WaitProcess(buf); } -*/ -// Actually, pointer (from reading LWP source) -#define osi_Sleep(a) LWP_WaitProcess(a); - -#define __do_LWP_sleep(v,l,f) { f(l); osi_Sleep(v); } -#define osi_SleepM(a,b) __do_LWP_sleep(a,b,lock_ReleaseMutex) -#define osi_SleepR(a,b) __do_LWP_sleep(a,b,lock_ReleaseRead) -#define osi_SleepW(a,b) __do_LWP_sleep(a,b,lock_ReleaseWrite) - -/* -#define osi_Wakeup(a) { char buf[sizeof(long)+1]; memcpy(buf,&a,sizeof(long)); buf[sizeof(long)]='\0'; LWP_SignalProcess(buf); } -*/ -#define osi_Wakeup(a) LWP_SignalProcess(a) - -/* -#define thrd_Sleep(a) IOMGR_Select(0, 0, 0, 0, a) -*/ -#define thrd_Sleep(a) IOMGR_Sleep((a)/1000) - -#define thrd_Yield LWP_DispatchProcess - -/* For thread95.c */ -#define __EVENT_NAME_LENGTH 10 -typedef struct __event { - enum { manualunsig = 0, autounsig = 2, - autosignal = 3, manualsignal = 1 } state; - char *name; // "Name" of corresponding LWP events - // char name[__EVENT_NAME_LENGTH+1]; // Name of corresponding LWP events -} EVENT; -#define SIGNALED(event) (event->state & 0x01) -#define AUTOMATIC(event) (event->state & 0x02) - -typedef PROCESS thread_t; -typedef int (*ThreadFunc)(void *); -typedef int SecurityAttrib; - -thread_t thrd_Create(int attributes, int stacksize, ThreadFunc func, - void *parm, int flags, int *thread_id, char *name); -#define thrd_Exit(rc) return(rc) -thread_t thrd_Current(void); -int thrd_Close(thread_t thrd); -#define thrd_CloseHandle(h) - -typedef long int LONG; -typedef LONG *LPLONG; -LONG thrd_Increment(LPLONG number); -LONG thrd_Decrement(LPLONG number); -LONG thrd_Exchange(LPLONG number, LONG value); - -typedef enum { False=0, True=1 } BOOL; -typedef EVENT *EVENT_HANDLE; /* Absorbs Win32 type HANDLE when used for synch */ -EVENT *thrd_CreateEvent(void *f, BOOL manual, BOOL startsignaled, void *g); -BOOL thrd_SetEvent(EVENT *event); -BOOL thrd_ResetEvent(EVENT *event); - -typedef unsigned long DWORD; -#define INFINITE (0xFFFFFFFF) // infinite timeout for waits -#define WAIT_FAILED (0xFFFFFFFF) -#define WAIT_OBJECT_0 (0L) -#define CONST const -DWORD thrd_WaitForSingleObject_Event(EVENT *event, DWORD timeoutms); -DWORD thrd_WaitForMultipleObjects_Event(DWORD count, EVENT* events[], - BOOL waitforall, DWORD timeoutms); - -#define osi_Time gettime_ms - -typedef FILE *FILE_HANDLE; - -#endif /* #ifndef THRD95_H */ diff --git a/src/WINNT/client_osi/osithrdnt.h b/src/WINNT/client_osi/osithrdnt.h deleted file mode 100644 index bac94fb8d..000000000 --- a/src/WINNT/client_osi/osithrdnt.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Defines for abstraction layer for NT */ - -#ifndef THREAD_NT_H -#define THREAD_NT_H - -#define thread_t HANDLE -#define ThreadFunc LPTHREAD_START_ROUTINE -#define SecurityAttrib PSECURITY_ATTRIBUTES - -#define thrd_Create(security, stacksize, function, arg1, arg2, pid, name) \ - CreateThread(security, stacksize, function, arg1, arg2, pid) - -#define thrd_CloseHandle(phandle) CloseHandle(phandle) - -#define thrd_CreateEvent CreateEvent -#define thrd_SetEvent SetEvent -#define thrd_ResetEvent ResetEvent -#define thrd_Increment InterlockedIncrement -#define thrd_Decrement InterlockedDecrement -#define thrd_WaitForSingleObject_Event WaitForSingleObject -#define thrd_WaitForMultipleObjects_Event WaitForMultipleObjects - -#define thrd_Sleep Sleep - -#define Crit_Sec CRITICAL_SECTION -#define thrd_InitCrit InitializeCriticalSection -#define thrd_EnterCrit EnterCriticalSection -#define thrd_LeaveCrit LeaveCriticalSection -#define thrd_DeleteCrit DeleteCriticalSection - -#define thrd_Current GetCurrentThreadId - -#define EVENT_HANDLE HANDLE -#define FILE_HANDLE HANDLE - -#endif /* THREAD_NT_H */ diff --git a/src/WINNT/client_osi/osiutils.c b/src/WINNT/client_osi/osiutils.c deleted file mode 100644 index 8bc89c0a0..000000000 --- a/src/WINNT/client_osi/osiutils.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include "osiutils.h" - -void osi_LongToUID(long inval, UUID *outuidp) -{ - /* generic UUID whose seconds field we'll never use again */ - UUID genericCazamarUUID = { /* 7C45E3F8-5F73-101B-89A3-204C4F4F5020 */ - 0x7C45E3F8, - 0x5F73, - 0x101B, - {0x89, 0xa3, 0x20, 0x4C, 0x4F, 0x4F, 0x50, 0x20} - }; - - genericCazamarUUID.Data1 = inval; - memcpy(outuidp, &genericCazamarUUID, sizeof(UUID)); -} - -/* compare two UIDs in the dictionary ordering */ -int osi_UIDCmp(UUID *uid1p, UUID *uid2p) -{ - register int i; - unsigned int v1; - unsigned int v2; - unsigned char *t1p; - unsigned char *t2p; - - if (uid1p->Data1 < uid2p->Data1) return -1; - else if (uid1p->Data1 > uid2p->Data1) return 1; - - if (uid1p->Data2 < uid2p->Data2) return -1; - else if (uid1p->Data2 > uid2p->Data2) return 1; - - if (uid1p->Data3 < uid2p->Data3) return -1; - else if (uid1p->Data3 > uid2p->Data3) return 1; - - t1p = uid1p->Data4; - t2p = uid2p->Data4; - - for(i=0; i<8; i++) { - v1 = *t1p++; - v2 = *t2p++; - if (v1 < v2) return -1; - else if (v1 > v2) return 1; - } - return 0; -} - -void * __RPC_API MIDL_user_allocate(size_t size) -{ - return (void *) malloc(size); -} - -void __RPC_API MIDL_user_free(void *p) -{ - free(p); -} - -#if (_MSC_VER >= 1300) -LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER result; - int carry; - result.LowPart=a.LowPart+b.LowPart; - carry=(result.LowPart < b.LowPart) ? 1 : 0; - result.HighPart=a.HighPart+b.HighPart+ carry; - return result; -} -LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b) -{ - LARGE_INTEGER result; - int borrow; - result.LowPart=a.LowPart-b.LowPart; - borrow=(result.LowPart > a.LowPart) ? 1 : 0; - result.HighPart=a.HighPart-b.HighPart- borrow; - return result; -} -LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder) -{ - LARGE_INTEGER result; - ULONGLONG a1,q1,r1; - - result.HighPart=0; - result.LowPart=0; - if (b == 0) { return result; } - if (b == 1) { *remainder = 0; return a; } - - a1 = a.HighPart; - a1 <<= 32; - a1 |= a.LowPart; - q1=a1/b; - r1=a1-(q1*b); - if (r1 > ULONG_MAX) /*XXX */; - result.HighPart=q1 >> 32; - result.LowPart=q1 & 0xffffffff; - *remainder=r1 & 0xffffffff; - return result; -} -LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder) -{ - LARGE_INTEGER result; - ULONGLONG a1,b1,q1,r1; - - result.HighPart=0; - result.LowPart=0; - if (b.HighPart == 0 && b.LowPart == 0) { return result; } - if (b.HighPart == 0 && b.LowPart == 1) { - remainder->HighPart = 0; - remainder->LowPart = 0; - return a; - } - - a1 = a.HighPart; - a1 <<= 32; - a1 |= a.LowPart; - b1 = b.HighPart; - b1 <<= 32; - b1 |= b.LowPart; - q1=a1/b1; - r1=a1-(q1*b1); - result.HighPart=q1 >> 32; - result.LowPart=q1 & 0xffffffff; - remainder->HighPart=r1 >> 32; - remainder->LowPart=r1 & 0xffffffff; - return result; -} - -LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) -{ - LARGE_INTEGER result; - result.HighPart=0; - result.LowPart=a; - return result; -} -#endif diff --git a/src/WINNT/client_osi/osiutils.h b/src/WINNT/client_osi/osiutils.h deleted file mode 100644 index a3c69267c..000000000 --- a/src/WINNT/client_osi/osiutils.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef _OSIUTILS_H_ENV_ -#define _OSIUTILS_H_ENV_ 1 - -extern int osi_UIDCmp(UUID *uid1, UUID *uid2); - -extern void osi_LongToUID(long inval, UUID *outuidp); - -#endif /*_OSIUTILS_H_ENV_ */ diff --git a/src/WINNT/client_osi/perf.c b/src/WINNT/client_osi/perf.c deleted file mode 100644 index b01e74369..000000000 --- a/src/WINNT/client_osi/perf.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#include "windows.h" -#include -#include "main.h" -#include "perf.h" -#include "osi.h" -#include - -static osi_mutex_t main_perfMutex; -static done; - -#define STARTA 1 -#define STARTB 2 -static long flags; -static long count; - -#define main_NITERS 20000 /* bops between the two */ - -long main_Perf1(long parm) -{ - while (1) { - lock_ObtainMutex(&main_perfMutex); - if (!(flags & STARTA)) { - /* we're not supposed to be running */ - osi_SleepM((long) &flags, &main_perfMutex); - continue; - } - - /* hand off to the other guy */ - flags &= ~STARTA; - flags |= STARTB; - osi_Wakeup((long) &flags); - - /* we're running, bump the counter. - * do this after hand-off, so the other guy gets to run. - */ - count++; - if (count > main_NITERS) { - break; - } - - osi_SleepM((long) &flags, &main_perfMutex); - } - done++; - lock_ReleaseMutex(&main_perfMutex); - osi_Wakeup((long) &done); /* wakeup anyone waiting for completion */ - return 0; -} - -long main_Perf2(long parm) -{ - while (1) { - lock_ObtainMutex(&main_perfMutex); - if (!(flags & STARTB)) { - /* we're not supposed to be running */ - osi_SleepM((long) &flags, &main_perfMutex); - continue; - } - - /* hand off to the other guy */ - flags &= ~STARTB; - flags |= STARTA; - osi_Wakeup((long) &flags); - - /* we're running, bump the counter. Do after hand-off so other - * guy also gets to notice that we're done. - */ - count++; - if (count > main_NITERS) { - break; - } - - osi_SleepM((long)&flags, &main_perfMutex); - } - done++; - lock_ReleaseMutex(&main_perfMutex); - osi_Wakeup((long) &done); /* wakeup anyone waiting for completion */ - return 0; -} - -main_PerfTest(HANDLE hWnd) -{ - long mod1ID; - long mod2ID; - HANDLE mod1Handle; - HANDLE mod2Handle; - - osi_Init(); - - main_ForceDisplay(hWnd); - - /* create three processes, two modifiers and one scanner. The scanner - * checks that the basic invariants are being maintained, while the - * modifiers modify the global variables, maintaining certain invariants - * by using locks. - * - * The invariant is that global variables a and b total 100. - */ - done = 0; - count = 0; - flags = STARTA; - - lock_InitializeMutex(&main_perfMutex, "perf test mutex"); - - mod1Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Perf1, 0, 0, &mod1ID); - if (mod1Handle == NULL) return -1; - - mod2Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Perf2, 0, 0, &mod2ID); - if (mod2Handle == NULL) return -2; - - /* start running check daemon */ - while (1) { - /* copy out count of # of dudes finished */ - lock_ObtainMutex(&main_perfMutex); - if (done == 2) { - lock_ReleaseMutex(&main_perfMutex); - break; - } - osi_SleepM((long) &done, &main_perfMutex); - } - - /* done, release and finalize all locks */ - lock_FinalizeMutex(&main_perfMutex); - - /* finally clean up thread handles */ - CloseHandle(mod1Handle); - CloseHandle(mod2Handle); - - return 0; -} diff --git a/src/WINNT/client_osi/perf.h b/src/WINNT/client_osi/perf.h deleted file mode 100644 index 11294af46..000000000 --- a/src/WINNT/client_osi/perf.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef __PERF_H_ENV_ -#define __PERF_H_ENV_ 1 - -extern int main_PerfTest(HANDLE); - -#endif /* __PERF_H_ENV_ */ diff --git a/src/WINNT/client_osi/trylock.c b/src/WINNT/client_osi/trylock.c deleted file mode 100644 index dcf043c3d..000000000 --- a/src/WINNT/client_osi/trylock.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#include -#include - -#include "windows.h" -#include -#include "main.h" -#include "trylock.h" -#include "osi.h" -#include - -#define main_NITERS 10000 /* bops between the two */ - -osi_rwlock_t trylock_first; -osi_mutex_t trylock_second; -osi_rwlock_t trylock_third; - -/* counters are not shared */ -static long neonCount; -static long salmonCount; -static long interestingEvents; - -/* set under trylock_first rwlock */ -static int done; - -/* neon tetras swim normally, i.e. downstream down the locking hierarchy */ -long main_Neon(long parm) -{ - while (1) { - Sleep(0); - lock_ObtainRead(&trylock_first); - Sleep(0); - lock_ObtainMutex(&trylock_second); - Sleep(0); - lock_ObtainWrite(&trylock_third); - Sleep(0); - lock_ReleaseWrite(&trylock_third); - lock_ReleaseMutex(&trylock_second); - lock_ReleaseRead(&trylock_first); - - if (neonCount++ >= main_NITERS) break; - } - - /* bump done counter under lock */ - lock_ObtainMutex(&trylock_second); - done++; - lock_ReleaseMutex(&trylock_second); - - return 0; -} - -/* go upstream against the locking hierarchy */ -long main_Salmon(long parm) -{ - long code; - while (1) { - code = lock_TryRead(&trylock_third); - if (code == 0) { - /* failed, release others, wait for this, and continue */ - lock_ObtainRead(&trylock_third); - lock_ReleaseRead(&trylock_third); - interestingEvents++; - continue; - } - code = lock_TryMutex(&trylock_second); - if (!code) { - /* failed */ - lock_ReleaseRead(&trylock_third); - lock_ObtainMutex(&trylock_second); - lock_ReleaseMutex(&trylock_second); - interestingEvents++; - continue; - } - code = lock_TryWrite(&trylock_first); - if (!code) { - lock_ReleaseRead(&trylock_third); - lock_ReleaseMutex(&trylock_second); - lock_ObtainWrite(&trylock_first); - lock_ReleaseWrite(&trylock_first); - interestingEvents++; - continue; - } - /* done */ - lock_ReleaseRead(&trylock_third); - lock_ReleaseMutex(&trylock_second); - lock_ReleaseWrite(&trylock_first); - - /* check for done */ - if (salmonCount++ >= main_NITERS) break; - - Sleep(0); - } - - lock_ObtainMutex(&trylock_second); - done++; - lock_ReleaseMutex(&trylock_second); - return 0; -} - -main_TryLockTest(HANDLE hWnd) -{ - long mod1ID; - long mod2ID; - HANDLE mod1Handle; - HANDLE mod2Handle; - long localDone; - - osi_Init(); - - salmonCount = 0; - neonCount = 0; - interestingEvents = 0; - - /* create three processes, two modifiers and one scanner. The scanner - * checks that the basic invariants are being maintained, while the - * modifiers modify the global variables, maintaining certain invariants - * by using locks. - */ - done = 0; - - main_ForceDisplay(hWnd); - - lock_InitializeRWLock(&trylock_first, "first lock"); - lock_InitializeRWLock(&trylock_third, "third lock"); - lock_InitializeMutex(&trylock_second, "second mutex"); - - mod1Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Neon, 0, 0, &mod1ID); - if (mod1Handle == NULL) return -1; - - mod2Handle = CreateThread((SECURITY_ATTRIBUTES *) 0, 0, - (LPTHREAD_START_ROUTINE) main_Salmon, 0, 0, &mod2ID); - if (mod2Handle == NULL) return -2; - - /* start running check daemon */ - while (1) { - Sleep(1000); - wsprintf(main_screenText[1], "Neon tetra iteration %d", neonCount); - wsprintf(main_screenText[2], "Salmon iteration %d", salmonCount); - wsprintf(main_screenText[3], "Interesting events: %d", interestingEvents); - main_ForceDisplay(hWnd); - - /* copy out count of # of dudes finished */ - lock_ObtainMutex(&trylock_second); - localDone = done; - lock_ReleaseMutex(&trylock_second); - - /* right now, we're waiting for 2 threads */ - if (localDone == 2) break; - } - - /* done, release and finalize all locks */ - lock_FinalizeRWLock(&trylock_first); - lock_FinalizeRWLock(&trylock_third); - lock_FinalizeMutex(&trylock_second); - - /* finally clean up thread handles */ - CloseHandle(mod1Handle); - CloseHandle(mod2Handle); - return 0; -} diff --git a/src/WINNT/client_osi/trylock.h b/src/WINNT/client_osi/trylock.h deleted file mode 100644 index c69131db7..000000000 --- a/src/WINNT/client_osi/trylock.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2000, International Business Machines Corporation and others. - * All Rights Reserved. - * - * This software has been released under the terms of the IBM Public - * License. For details, see the LICENSE file in the top-level source - * directory or online at http://www.openafs.org/dl/license10.html - */ - -/* Copyright (C) 1994 Cazamar Systems, Inc. */ - -#ifndef __TRYLOCK_H_ENV_ -#define __TRYLOCK_H_ENV_ 1 - -extern int main_TryLockTest(HANDLE); - -#endif /* __TRYLOCK_H_ENV_ */ diff --git a/src/WINNT/doc/help/de_DE/AFS-CC.HLP b/src/WINNT/doc/help/de_DE/AFS-CC.HLP deleted file mode 100755 index d735228549b7006baee986bbe435f6c305ad6917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38446 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 diff --git a/src/WINNT/doc/help/de_DE/AFS-NT.HLP b/src/WINNT/doc/help/de_DE/AFS-NT.HLP deleted file mode 100755 index 83dfae2a4e6ab6e5d0a34ccd128a5c657ea09997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269096 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 OK;sDfpBaH3)_((Dh27}@ diff --git a/src/WINNT/doc/help/de_DE/Afs-light.hlp b/src/WINNT/doc/help/de_DE/Afs-light.hlp deleted file mode 100755 index 4ea37705f74a2ed162c33515059453ed4bd59d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200570 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∓8)62t<_oM_ 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 We~QZQ*)7NFvQEelNz(t^i~j?{smWLX diff --git a/src/WINNT/doc/help/de_DE/TAAFSCFG.HLP b/src/WINNT/doc/help/de_DE/TAAFSCFG.HLP deleted file mode 100755 index 51feb891f3d56393a570ca72286ad2dffa84dad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149173 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 KKOh8Vng0(ka$e8? diff --git a/src/WINNT/doc/help/de_DE/Taafssvrmgr.hlp b/src/WINNT/doc/help/de_DE/Taafssvrmgr.hlp deleted file mode 100755 index 6e198eb2deb40a31da7c6173094fcc70621a8565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259482 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

2QdkOUvG7Zb z@GOQ~cI5tYjPxa8-oMK(0|4H;DUtn>Y+U42=Q5hhbYvrSlWB(>r%5(aH&-+oA~@JdFWeUbi%J6PNmP;*nE}pZjJUEAlpE4Pn}#l4 zui|8j#q^9JJTo}F$H>X71bzxDMlBV5(*x_98S8dunVNU7;s;*YCbWgE)X~S3Nu{>fbOk3p zaV3470)4fUVUn4p4+`K(h7W(}6}ic9FC;_AQj%dAfrSDBH^A*qNFYo10Z$T~es@_A ze*goq2zYRHe!r;q&}ab)sZfCXElZ>5#s>GlxZ6Yc?Jt7|D>6-mJiGeh2!CK`?om1n z<%%#JPo1SqCp<;9xLDD^e!>S81)GF@lV9JFO|FVs2MFx-_6vMG7T9eQ=icGHC!(?_ znScnx>Jsp)#u2QRxw)oMZJWE#&76C_8rlN9Vz-5Mc ziYDLqqrjlb2{aC;XJs_%FC0TB>+cxlIGy$*&Qs0k&b* z>N~$GZR`Fb}BPBL%PK_fHHN&F53?y5{7s-AlV&zY5Q>@$0Atw!%SM2ZCff zvPhTNV~cvBYgzD__dRD-`is`FSmIw9zk;r;h&P_MR=h>+Wopd&Ha@M7NiYDLc9Hu! zRoOH6bio0pM^PsXr}{hydKfmueX3}Re3M5W4bvS0kL?772#UZVasZ7L4dtcSKFt2> zgXURzn$8{c=k)a8m2G*!MLs>{)syMn$fCChERU#M4~q@_K}3Q>2nm%PATsn^Gue$P z?lHRRMf8-!VAe!e=x=MI8tRW3Pw?2jqKBn*9<{&ayb=`UJ&Y)OEEvEX_DR+t?^of% z{QlJ`-vs|Odh4o5*6@cf4dy2AQR5#81~%!AYAN2?ks%I$%35YsNWMv!DR@Jkx62H65{M#Wh!zIKN!^h{3{*TN*MBERv@an0(to*tF}8tSP?pWR5JtG=jQE<>qHp2J2iP67pZAbhVf}R8I{!ZID=DL4 z%C>=@`dyW{dVLlh8!9j(oJAb6R`z(rioQuSvp*;;xNth?9SFh?Wmg!&S*aJ_FCa6l zY%-s6=vSC(c-4YcS-^>zBFO%gZ@P}Qh!n&lPzhxgt!lXC?$)er}qzk zDz*Vv5X zAV$ERj9LL~1D&6LFfsh^4Sv-hhFA2l3=T0r$zak3#3Uze6IN!hienPH-ek28>c6_X zrj9p7Xm1-OwG+{nWY87-aAWsIAS_)(dxRf&77AZY@Xl~4nXp$-@+A|w-uaO>s7?~5 z7>2%)cJo--{b3pkM!9&0lewDM`Bw0hKnxMNi3{f^cN?;tENCO9BuG zvYeqE46Pg~BQ%4Zq?3XLE495?^Qr7-{--b1t%1b-PErnlj{(ylmC!gOaJ}-OuvU4_d%HhThm%A;H$|GTD&3z%~ z)#JI&NFjA~W(q{YAaIqy$a^_3X6dl2CT(uVXPcAvnwRmYrM;(BD9K3bSOcN=vz%*FZA5ayVkru~fZH|ET3OeBx!7%_ z2Q#6nh}}@JUDSfwpLOv$kpy=EA+0E&Z`|D*zwb0PU6}hV-M**(lkYAOZuXn23VsG| zc2~qeP4&xe;F$IKHfV>JC;_?d6lt?h>8SaFcqq+5l{AyF8kKT)Fy9A%t{@jEjyJ3z z!=DC0{WJXXrz{szW4(eAfjGe=QVhKhp;iNtk7ezu5gETl9vss(Vzql*AlFecQ=|rT z7apWZL<@w#{6X_wP}xEyC|m!N<_1tlE7~9(O(yV;BMGE#w>2=Mq_rmD7-J*b8WB4XTNY-+lbY(hE8oB{N99}F6v%Z|XjHv-JlhkWPzL*G~Dz0c)$KYlmAuHWl1O)iIj=y6#3 zx}J$(gptCZBldft6VNOf59t@W2u)uiJ)I{Cn`)?+nWyrdhXi$DV;)T_PRm#+jBoUr zrI7%q&{QbM(eDy1i2xqxxJ8DGreFH5tu2ieKOX$c;8%}2eUI2Z9LbpO!P_rGfRRy25EdVv;wsBjiG0BQ62KAiwz}y znoGu(jPWY;>DalSN1{0*!>@0}q2kLA?W$xHo_!&22y(wYFZstTl=b?W{=<>Hd~g9( zgnS33W(*vMe)+xY`%?7vyf&FqzGPkXh+_G??SaAafmZe^sBr~OJRH@8qGk-wD43~v zN6WjsL32{{Y|R^6k#X3{A5?FnBh$Jrl*(5qg6|$gy9TUYC7*FN^bcj_DDgW3CF1v} zG)WmTC#$GvcG%!^HeurTedQVZe6{R!wmeFHU{tL9P@?>Biu_25)|7rs296Nywh{7U zSBvDw$H-4il(+iGMR;R1J424kwc=C7%DeS)VoG_-ZN7H3Y}7frYQE;oHu4}-Z?#~W9sd#r@S6fyGLJNl{(y&&y)N*&85m0c?cKuuz$?qC( z!X8JS5RM^erVwh1AQ+q?i=KaJcsf((?>vwUaW4pnv@?H$wwGpEE{NGar)&}abV}$# zm&P!T&ra&$>S%+Ua?;XFp{qQ0@eQ9riM#rA zX82?<=Z=2Wp2wstTEBWpM&gsN*7VcLSKKnzj!q=qAZ?MwiN1||yxK{l#oERW@#`gS z0yGaT9=K+)6NJXN!HcIcVI@WM*d-iwQoPPePHvc%vjCtqsy-6 z$p^`uuR!F9K{^HGbubS+!`P(qP`-yI+z%7`!wQkZTq^-A(VKU}$HV$*A_vN&)8rX3 zQCd??d3AEBSz0qK5A=8A1MU*2Ip{N*hy3wN^8@XwOm&T z+Ierwlirahi`SPn=-0`6Hyg4UlChz&Ft{lApAcP~FdQa|6NXFBeGL(Wleyz^a3Cj} z7VKDzMj<XtvTHq2Qkro=l&fE=h!A4-zY(?|qnfQ4Ws)r0yAs|vk<*9#8 zdNsPD)@&4Pd`TUQ=PV$|N7>i~lm%OOtb>n;=7v#Q4h9j9N^fkI6C)Z=P!hlh+-`Ep z1|qP^&~SKGIXE7Wi68XVM`edLR4SW+Bu zrfXE!z)LasE~;mxmI|IiNs+H{p)4bOaL!(9ZQ*Dv@%Bt{dNVQS8HmK4Jv29?I?^2i zjP=k-9huP~bjuKTUOv6?1)4rm_^dAzjbI>7NHGwayY&nlDG))pd9E8p#ietic2GJf z-{o{6qW1DbOewS2DM+PSFB z0^JC(+-RzEgc-W#&Xvp0-KcPiw>B5>x0ZVF6rucYMOqXts7;LE(M29QzL%#*X{AT0 zC0>UFCDbTh0d#~MpIrB4XW=CS0xogVW5;rW<>q#cp-#OUoKx*%)>3bBl4$NCM8+|e z6i6cl3Y?Psof+3hplj`$QuDW89p8PmmYH^mHw_XIX+(w~??nhxN+E_Ul#xt_6QU)LPQYN%U6eNnJ;4b-}8ioKn9B z>qcTau8cMA<8y~TSzDw9ln({^63qh~-kn8v^BM)$>gb2_k|2rO4M~Mg1P`)XG`q zzma_0(kr3iZKj(XJ(I%V$^Ocv`F;jm>dzs@Xt|{q46j_}B!TSTo>Ba)sK?s(1^Ey` zIS{yVY;Upzjo~kgdJMAVA$;sB2MRmREJi>BLZE5K?c6a zM0UsDAw&_0=04ItU$ZsnV(QI@Pd!vVp(V?oK2#`&wObY}Q9SCa z{I%BjW#32oY~|n~H$KjO)N12Rz4LDQg3rrmo-Dsv&Zm8lh>V&{0oUr5bJ||SDm;)& zWqw3J&mA$O#Y^W<3kUi_I=Zk7uFtknJ+i_gAyw~9@)5ol+5-7_pZ}AuiB3v%Zv16) zakytwFmqy)h?^U(EvSnFCwDn)qQ8$YXnS%&{pZpm;gw6hmH`ALJOm)GfxsaO9V3O` zp3M`Zj!ka8I6>0T8}MlV240xsWNx^;WUk)$T-!T0dxd5Ey-$xPaF?g`2$nS|H_`cJ z?@s-LFiXw6e-D(k--)nN+rXg+XKuFHwoYi9D>xNl!y6JrHe3}hWP#V*?|s@9jc}>3 z!y6Bm*3@42`dmodU!RK`V~qy)`WY>^thM0SIUAfhcbWFpM-nf_krgo_gGt7|E*~m- z$GZk}()JP7hX-~+^<#$m&uShP5~D5EGi7?4Z>h*0yP$ug5KL0ECL1oam|`XBpubB$ zLwQ{v%0Cq1Ed79WB5d@D2P^8YtDnSL=%_K&et9QfWVQ3xqOwOK1AM^HcHw?*wN`OX z&RQcxGyPBsAhtI_ZUU~g7hpakA@YQYibo8vF;h-z-g`2v5_Udlati&C68K@ z5$1kb)VOrKZwwenHB>Ct#VqAXD|?nGyC_h1Iqn3Wp%Lte;<0mlJ(xeSu>(-5B{CuH z!8dJ_YJZ?&@LOeU2UTrfs<4Hm^Vd^2g$7lsGJUC)Nb=8MN4z-&7^zsYlV&nlEUU4( zHwK$&tI=X;Ya0nRNP63D`rF`{BlL&myXXk_ZGuAy1>g{@ikN)er2ci_Z@rVCv)YM0o`oeUxB;4u*}XdwE! zm&U{zALkHZ+_bO!R|<5~uw>kK#SIfZEMIgx6W}xNx=VON+guL1Br$fq{T+&Z zU_0n8*|S>_`>4}zj_b7QP!EmV(Z_XslFz)67RL>*a{qYc_)wKpD>>oc_$X{@1aosYxjZl{}Ep8=P1Prqe-T)N@k*Y#`qTy%}7)32F7Ngg)R zh~YaftZ{=*Z~a9kv9k|&Wq0Ivn9IyPjQ}_00dwn1G}d#M{LcqrLjw7}(%6Q()Lx!$ zbW4K+K0j80DmV1Gz1H*alS|fUrdV0AS};P}MLr%m!ug@s5zS^k)u)`-tje?-zf)mQ@r=#Y-p+YE#tnt49z1Jc@^l`8^#QqGiKO_&|RA0^e zCU*Jk!j+qz#(V^hUsm^z*9-+yFjsfAAu{KE<7LKDSQ@08;%2M}d>*xcUwKwG$lbgD z4p}MX1j{h65@wG)9F*4oE6O;O>h`GC7U(}UXF5e-h+)3S5A}ghix3|TS>cw24*pHm zj0i+oP>&aP>EO1$fq*WHphx?nphw-ZA%oEnDfQdY@erE>f$J@|n+<>n&T!H%e~SY3 z$&MG}cxbsYvknQS|JPXE@9lI=E3JPX;8p7f~PDhqaMPOh@%&Ka;xAVX( z6AO!}Rf$JS-u$pi%mV`W2VRVnsoxyAl;01V)(TF0wuq~y%#2WKH&yKt#0)emhvAvk z`WN2vVQbC?Nfch`4Q0t9i<1eC_LkHn8=YX~Mm+xR<9GZuAVdkuWqM!P7~A+4zc9lD z!X@Kpmn{}&CC9qHjB(Zc7PVY^Ex1;Pkonja*>9-e*QJ`GDw~BDbXU9LeM5eLRSP zcT<_y4TTe7$KGT@8fLBP{KWshwo`|C zKi^|!Mb=n6&(%htJsute&?pxsNCW?C;3oayQeI|kXP~sP;`OBSBN(_spUKkyPz>(W zv*|B}yFFT(;n^M-ri3rZls}y**(;tdGPsU^Y?%_eKOT*!0mDzV&Jkz{lgNEL{X^4Y zaU>Jq+$<4-{2|ly@M_;PU&KbGb}#5Z*;$j{U0RF9k5>m>4u9Wec0k(!I9EXNBFgu} zz9*l%SNI3XY0;PHSfgcAM38&br_H-0w#46FkQ#Y#bK?m72G^DuH-*nAC2s?y*ON@7wbvp2UrrtUNS(=%6(`Z_ z!dXtD!RsaJ$K>)B5B6wmf95kTeYDq|*A(rpH@Cc>=G(O{UMr`+7iw}5kNFNfHOIQL z!4`Kd;_=?)G)XydkoM7ec=RQ7WYK}#%#X;Ooa-Rhw#)Y%D18u4c%&%`&izf$iYTJt zyWVF|L>7JLw7*1zl6f54f`}r{le;JZZITmWIK^pC-KWVms79n>eFmwFq;asO$r|G1 zfZWWHG|=*;{<+Mx!NgreK;EKF?#P$qBxyE6=rarilt5;VOdMCE4Swe?+Cbv=3avpK zfo>N3qdvf65_zlCqL@Z#;NVtK`Lrx?MP=lYz4mFpr@&IGZ-3 z$*5&gZ86Zo9Tbe@pXEo|s-$7e6W|xTz?n*U_L9Pb#v_fbmlW>1lJce(zk!-Ir?>aJ zGh98BP{Qf@40o99!r?&KQtwbDGy&Q&2#7Seo~Bx044~AGd|#Hj=RVSl^5@b2*-N+< zKZ9mrFTuoZfkx-Z6KtKjQRG-D|D;Nqg z=%0kh-4N@dwOtRgiWo$uXgmb2&eNnEDFMgjA=j?ef_d&wRwJo~m7@H-goVL2u!R{5 zwlECS(TMjm|Jgz+NZnl!B3ek{z@BteV56R^KyMB0g)NGX&5$pQesD#jc2_ELass-^iXyWuu$394SKvlZt)PJUi^bYj}kigUk zQ2B%MMluhu*AT^OSRYPEBHMmBoe^1nAjAE~Ps>*e>BbUIvZK3_Y^3mJKI(-${R{bt zh%`CPGJg^w(an$vm>&T777jWJNFWn|K7&UDm<*tAso)Y%qAVd17LRJ#PLXAbU{p{y zWCO(x6b_M%IKa6WedFmA&B-Q=BDnT9u!}&ws9cFFjAMCP;50QjVtxz7oafb=YQCKn zfdXF)B2Zxe7{M95La)tM`#&?Q)> zs9F$|7nb^Dxv0pPD##aP%&=ntg0J*~rIT6TVh7LrmVN^J2`tB;@Gv0^E($(i(v%>7 z6Pg1sqj?XhIoW^0ivqfh zNGB>p@J1L$_?UA+)cVoRu!1#z4flDdpXE95LEgoLho;OoH->h8UHEXbLvUo%D5v1S zKrGmUCNihx&hPhOi^EzFLaWX$Qd(aLK!NKeHHg-NTMbaKNTaZ*-eFzm1ui`7i|~Z; zd^8D9NTz`2JE@4{TySTc1A2khK{o&e5p&`3h50G)LUt3ba~DK_TN;R9jnr9E=yRc8 zN7tq)l8(>U?L6i~P_x$_kqm=^c_8Q|$I;HQ{hizVx@3DOua{w)y|{ej0&;=mBlAV_ z%}+!FtDVevWlo}wC%hOUCUYMOfvc$sK{hh?G-?nLQJqIG0&w@3DoEP`0o?^i3U+e! zlj929D)c5q0`-D|#k$~M1aF^E@`PV35ff|kI!H#Oun@UWoca?^NpN<25*ZbhDxy&- zcQ^eerw@PSGcfv65BR(+_3(EIl84@srkm6ZvH3g&H&k9FJ40;6pynG~{mcUk-t)U` zV3!6Ii)mII492TS+%*RH7A8FU)OOD%`RTW_M`eJklBzY#TAq&$SCgQ=XK$q!&HJ0%YOq_7b+ z=8kjXu@d+i_!IfnUE|AJu(`)(yDy2H=~|w8({m3kP^E?aAhGRn@hrhL+v9Du2>2wmpfF_X?CajW*;5~A zijZ%-bFXw$MSV?~?F0TcrM}uvbzZQqmTkn}lv-^-)aJ%F#7-I)lNxzL`O$*`r(%|N z>!JfPgi_p7mM`evD0)viBD^7$Kg7#oYkIC59Z<&B>#L&6sa?`gfS-T>QV1BZ#|=(S zf;eqr*IA7V1F~)uI|ok#P00JwRLept&^2E*LwcC9*WUs54U6BEiu=UHd`F*dcyQG- zwvWj8IDg{4ZE0Q2OBTCNju7$mX1$`&Ucbh5e)>*VYn9rSeeq?VoH@e&YiBf{?m7+M zfqYe;w9jjk*S?&c$?Lcysmv4)BaXuh1O>(YniU9 zE|n}RD9#eMl@QY*VJ z&LaKKVF;4}dTY>8vJ(ksoY)gLgQIz3Ad1KU98P$UodbAU6}D$&)hClQQf7}r+ncsa zWYQ-(v%d6vuxsqoXtI}aoN5QzbIER@`5Auk5Dzvuca5Dfk$T4mu4=&VCi(V2avHgT zbK4H_Z}#7_G!W9cvoy_}LLJBhj-0y4EaM%{-tjOm*QJYlHZbkefmlC+si})3Tw*- zcTmD3s*#cw1*p6l*jkK5Pk#uL2{vmppI1?|wMnXWdsBNopxJMRiXV%gNb`7EEeArU zIcv-~qp(;#E>LPL4~>ZkuBo=`x0)QSQ8VA=4egWPd6Ze|8}&wud9MhRF(31&_XQdp zS>Q04eu`?<9il7sHzKM7LVT%>0sbI(Fi?@t0wwS4f|#2 zJKVT?N$J1kc0n?yezV%Ob=3#-@ zTcaioIq&nWFPktzze||-uEzw|%AU>2ZQP7-BwUsf=K2bhk3dq;0(vodgpt%rF0`ap zGz5Ax3L;Y65S=(_(zmN$l+6wQqp^MM^X*fIyvQ3ei~nuk5p+?$>wi%A3W9PLDAv~p z%3bTZwv0nSGNq(4ZhWu`{m?aO0qbYV_dH~GKYVQ&U2>>b8_69qlH%w(JbIxu17iQt zM#7NJ;pBBs=z5ShKH5J|2fDkc)SO5SnVvm9KK(9^=i zRyENOMJzZGM$*BE8X89~Ru<9*X&$=OyQxaVH-8F0JyL1X(SI@Dr|LeE^7Ph+Vqy`V ze#27f9Do9j#;LEx#Y*DW2toVaM{M?v#a;X>Y}v7t{=PW_rnv_g*y--8M6tcdM1abT zpa@3Z3!dA&{|!7UNaw&)IcDI0yt< z1(J?y;Vlg!U=_UOb!K|EwVSWXG4A0_ES_;h_(J+wR%DYR>LuPVK-9-i+SVr;8yzsvf(w;&9yb# zWOIG*B;Ih*OUtT8@Xtyx=^N<)nN~!Mh{z2Y0htXHb__}B#Yb}R_0VljXU zoq&Ck5IzqA=|OQuGlYYSjDiRVNFo(y<5=6ao8H1m8Xf7K6(`=jm3Lx{5fhyn{A*X-DKN`;WqP|stgx9Rs5%@z7pKN8Q|+=WN$f3vDQtL9E>Mo zniRka5m>}1km5u+f-+CwxB$1qj+Mo=zo@LqbVHBf1Dc+$8LYWR*(H=dl)h#Ci8_lr zM@CZY9r+-jZQ(YhR62|&11M?Yb1FDwEVDop`w7h*gZ*LhI6V9mX0rDvJV}1y$V##k zk)4^NFiD01S(F^nA(2+bUQ=BQH>ZmJ9+lKc2AoJ(xSdu-%95q{kYEPcnQ%&=GecCY zVA_M}U@Do(f!}JODfCZ$|6vK0+@+H}P+W+_=S>D&DPYkGBx;_AFwKakQYAAPjy*<5 zKJ*Z(Hf8= zSn9ZZ$kb}(H<@=xrY#V-8nUuE?hab4hMQF^VTL~!?;;%^OdJrq)^$YP(B3JW=9c4jZs4!sO$kSggS;Pv(RFg3Wv*u; ztf6{57ES%EKx$4fJ?JJ`Z^-5(&|r@bEn+639L@t9A6m@mn3GaRQKWL9JXjuRn}&yW z$!04V=nVk;slqxEJ;FkXF)l|+zt9FqlH(P-Y*kvl2MLW2tONyvrrlm?BpRet7u z<=|6pe}(XhO?sq-6irfyBbAaQ&KqjG_)JvLz@dh3Qu5{TK52mAIqd}uOUUe#=^ec8 zA94&NAZq&wnZWipfK(+C9U5JikTI!-)mEB50KjU3qOAV5^`d!Byd3!S0P$a$x>EgM zqDtD@!>}4ZS`#x)lBt!=BcTz4!d5H{Dv&?V;Ar@$tK@5#+M=m%UZfeW3AOI}_HgYa3G{!(`eSU@I!{dg#=71osDy=X3q~x55>B(tn@&ZY2NG~kp_^i-BRWlC~RnpDWr3rf-p zICmKHIS5}3Sfuu2&#FA0Jw1EibizbZrJOh>NKeZmgw5dx)x#uZm*77m*e~U+DAV$U z4YfXO5D!w^KP5qNep zvy(VQtXgddss53?%WQKxNwM!E49SKNfC25{0AtwKKIi&E+lu*j7Pjio(~khiau3d2EVIS5Y1xTO(m3T4l`$MeHnHeOwyz5I}FRnPB2@aZ(zk^L`L%nR`AGLd4 z

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%0A66Kvc|i_Y)f$=XK+-nYISzmFE3UrO7uj~1P+ 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

X6- z%bt^;HrXTo5&WPo)9D9g`lROg4g5;#+3rPvu54*!i0t05>)ZCRL*U_66TV-w^1s!2DnDPgcW-Ukl$OpA zVLh81%OmP*cE;4SoO%h^=|N6CZ)CXYkKBt_xIJ(j3yR^}9_rMU_BVCOkTpc$E@7sn z2Db>)SG#xpFZ#*)p|>rpSciYOidBv+DqMT(yqc`LF#%CBe$mhWuJ-`z$}8k^?%Fq& z|L8Y$*2rHeS4v}il7o9r$Wz_B_H&a$5A(A>2PakF7NW({u9j_|1fMOl49e2rLOgGB zRz?Jyyk1w4YH{dtZ(2utWZ3g?Q!z1!9p#DECQUpiO_|(KC#^AdcCl)=!=&{K-S?jT zODBC*;bS#;%w@hjY-p_8VAhq$7+h_Dr6hb+Y#=YxFSw`MC#%;HJq*0aLBB``QDU?27QGR(Hicgm)^mDpfVb9;{vS zaIUFyv<`Y@@5b>17AA{{ze@_E4|Q}n_kvk)~7W2JW&@|)WiL2xxHcOi`=`L z)B_F54PKqox|HjbG+p@|nQA4P=LuJ7QfHy&76#G?Z*8?$d*F8IVq9Tz=!cLRR(aHo!gqmFs_F8X|! zq0@o*?XKqG>~oE@ey)e9W^08fBed=lbY@1EZ`s~}#tWP~X%TZJuB zy6V;8;GbT}HTGu)7u@LGJH{3$E`gJJ=gtfo?d{(sm;`eAz#dE$(LYAo@FHKiiZ)nbg$E8hh$;k6IU=eiS4U;Ej7iNYAu72sg zdQ-;PTAufkm$=Bk%{Gad6f;k-bHn}|Ni+XqTj9TguDc!pZ32>n-O;Z4U7N&lgg8^E-Z4}-kSH^=q!-rwLGehKF`+Qr4SG*z+BQ+8f)wPj;AuZ-Nk+v}^% zV?Jo0T$5Y_h$*E_UQ`HH!6_kr+x6RsMtySEU;Sleqgjg@eed#0QXWV-Q5|dMg+2(* zLr0}Y26mWiIO1xjNZ}HUEk1$P3%PXAhwcl^U!k75c)W4Zh#zhP#h zS-cM?W z-~Tc!xZ%Ft4w3c5wRZTDERMa##7_T?J;@-o-)@(AC;MU-o~W1l+SkB^veed29^0WM z4Z<)kUJB;c<_10_$sU#tgHM(T>j{_=4rDx`UmBTMIkK`d;P8xe`FKDGCR?mjn#r4S zKtX2T1r9wHkNTHE^4zIKW=o_`Y52d6%V9Njd+W6wLCcOa?6*!8Q3u5$iE2 zNIzjfMr&yi&SLz0#I^Yjm*tWnPg0xQg%W^7yS2^Wr|&8;t(3?^F#kHy>?%Mfo}RuQ`3 zTT8HYxvz(84l+ax2pgx~3kv_n{qxSAb;0?oS|3mcLC zIZMBo(4CnM=y9&-J!wi#epde0ZF*QmJ~0}`UH8xyb9pd=VqEiRnwqblh67F&W(TYA z2K;J5ezF4~*bjOk=6^+Z&7`BXctaPg*KL%}S3OThWR5XBtWRxzVNQJJYJJD# zyeXU5WMlqe-RFiPXp9dk8J}g=P02~i4wDl*u)Ut`dGIsCPT5x&HglWInCcq)h}U+=RgAlDWm9&FfA*;Pku%-`?)5{?iO}AeQ_Ik3HM)P=)+-^u9i*QDo zlD8)(Yw~1Y`EO6|;pSq^TI0B@27>~R$Z2f%`9=PQMStiK@b6yuXQIqL0njR%5Z?HG zm$<#PblO0&?1i+r2%aDH08Cp_a#JnbdOGC$tzSs9)DRv#_PYLCBhEU9;U zP374->1;Q*yHNv&-;R-|U2c6_F8$NXAw4#B=5jm4@>F>Zf@3D}8L+Ku#-*Ra^nLiR z^W)O5c;)EwztS(@=KK-fOBcI|xTJz~(3seH^c>^TG4HcPR}#pnm%!VYEoK%uvc!h zmR;=aaT9W=f3?id_rQq9^d!c{6UR7RmnRcxnrm$cz2%D;U9zKDfa14hvU2ft<

S4l`7t-$P;?(aawNVZo_TpfW`A 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�@J<(+RR_M< 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 -2 Zellendatenbank -3 Übersicht=Cell_Database_Overview>main -3 Hinzufügen von Zellen zur Ihrer Zellendatenbank=Adding_Cells_to_Your_Cell_Database>main -3 Ändern von Zelleninformationen=Changing_Cell_Information>main -3 Entfernen von Zellen aus Ihrer Zellendatenbank=Removing_Cells_From_Your_Cell_Database>main diff --git a/src/WINNT/doc/help/de_DE/afs-light.CNT b/src/WINNT/doc/help/de_DE/afs-light.CNT deleted file mode 100755 index a15034024..000000000 --- a/src/WINNT/doc/help/de_DE/afs-light.CNT +++ /dev/null @@ -1,63 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title IBM AFS Light -1 Übersicht -2 Informationen zu AFS=Working_in_AFS>main -2 AFS-Speicherkonzepte=AFSFileStorageConcepts>main -2 AFS-Sicherheitskonzepte=AFS_security_concepts>main -2 Informationen zu AFS Light=AFS_Client>main -2 Informationen zur Hilfe=Audience_and_Purpose>main -1 Erste Schritte -2 Übersicht=Running_AFS>main -2 Ein AFS Light Gateway identifizieren=Adding_your_Client_to_a_Cell>main -2 Änhängen des AFS-Dateibereichs=Mapping_Drives_Overview>main -2 Authentifizierung bei AFS=Authentication>main -2 Prüfen der Authenfifizierung=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 Authentifizierung bei AFS beenden=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 Verwalten von AFS -2 Übersicht=AccessingAFS@AFS-LIGHT.HLP>main -2 AFS-Menü=FileManagerAFSMenu>main -2 Dienstprogramm AFS Light Configuration=AFS_Client_Configuration_Utility>main -2 AFS Light Programmgruppe=The_AFS_Client_Program_Group>main -2 AFS Light-Merkmalfenster=AFS_Credentials_utility.>main -2 Befehle an der Eingabeaufforderung=CommandPromptCommands@AFS-LIGHT.HLP>main -1 Verwenden von AFS -2 Zugriffssteuerungslisten -3 Übersicht -4 Zugriffssteuerungslisten=ProtectingFilesandDirectories>main -4 Zugriffssteuerung auf Verzeichnisebene=Directory.LevelAccessControl>main -4 AFS-Zugriffsberechtigungen=AFSAccessPermissions>main -4 Zusätzliche Zugriffsberechtigungen=OtherVariablePermissions>main -4 Normale und negative Einträge=NormalandNegativeEntries>main -3 Verwenden von Zugriffssteuerungslisten -4 Festlegen von ACLs=AccessControlLists>main -4 Hinzufügen von ACL-Einträgen=AddACLEntry>main -4 ALC-Einträge entfernen=Removing_ACL_Entries>main -4 Kopieren von ACLs=CopyACL>main -2 Volumes und Partitionen -3 Übersicht=Volumes_and_Partitions>main -3 Anzeigen von Volume- und Partitionsinformationen=Displaying_Volume_and_Partition_information>main -3 Name/ID-Zuordnung aktualisieren=Refreshname.IDmap>main -2 Mount-Punkte -3 Übersicht=Mount_Point_first_page>main -3 Anzeigen von Mount-Punkten=Displaying_Mount_Points>main -3 Entfernen von Mount-Punkten=Removing_Mount_Points>main -3 Erstellen von Mount-Punkten=Making_Mount_Points>main -2 Zwischengespeicherte Dateien -3 Übersicht=Cached_Files>main -3 Dateien und Verzeichnisse leeren=Flushing_files_or_directories>main -3 Leeren von Volumes=Flushing_Volumes>main -2 Server-Informationen -3 Übersicht=ListingFileServerInformation>main -3 Anzeigen von Datei-Servern=Showing_File_Servers>main -3 Anzeigen des Datei-Server-Status=Showing_the_Status_of_File_Servers>main -2 Zellen -3 Auflisten von Zelleninformationen -4 Zellen anzeigen=Showing_Cell>main -3 Zellendatenbank -4 Übersicht=Cells>main -4 Hinzufügen von Zellen=Adding_Cells_to_your_Cell_Database>main -4 Ändern von Zelleninformationen=Changing_Cell_Information>main -4 Entfernen von Zellen=Deleting_Cell_Information>main -1 Referenz -2 Glossar=Glossary>main -2 Vorgehensweise...=How_To...>main diff --git a/src/WINNT/doc/help/de_DE/afs-nt.CNT b/src/WINNT/doc/help/de_DE/afs-nt.CNT deleted file mode 100755 index a00a41850..000000000 --- a/src/WINNT/doc/help/de_DE/afs-nt.CNT +++ /dev/null @@ -1,77 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS Client -1 Übersicht -2 Informationen zu AFS=Working_in_AFS>main -2 AFS-Speicherkonzepte=AFSFileStorageConcepts>main -2 AFS-Sicherheitskonzepte=AFS_security_concepts>main -2 Informationen zum AFS Client=AFS_Client>main -2 Informationen zur Hilfe=Audience_and_Purpose>main -1 Erste Schritte -2 Übersicht=Running_AFS>main -2 AFS Client als Mitglied einer Zelle konfigurieren=Adding_your_Client_to_a_Cell>main -2 AFS Client-Assistent=IDH_AFSCREDS_WIZ_START>main -2 Starten und Stoppen des AFS Clients=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 Ändern des Starttyps des AFS Clients=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 Anhängen des AFS-Dateibereichs=Mapping_Drives_Overview>main -2 Authentifizierung bei AFS=Authentication>main -2 Prüfen der Authentifizierung=VerifyingAuthentication@afs-nt.hlp>main -2 Authentifizierung bei AFS beenden=UnauthenticatingfromAFS@afs-nt.hlp>main -1 Verwalten von AFS -2 Übersicht=AccessingAFS@afs-nt.hlp>main -2 AFS-Menü=FileManagerAFSMenu>main -2 AFS Client Configuration-Dienstprogramm=AFS_Client_Configuration_Utility>main -2 AFS Client-Programmgruppe=The_AFS_Client_Program_Group>main -2 AFS Client-Merkmalfenster=AFS_Credentials_utility.>main -2 Befehle an der Eingabeaufforderung=CommandPromptCommands@afs-nt.hlp>main -1 Verwenden von AFS -2 Zugriffsteuerungslisten -3 Übersicht -4 Zugriffssteuerungslisten=ProtectingFilesandDirectories>main -4 Zugriffssteuerung auf Verzeichnisebene=Directory.LevelAccessControl>main -4 AFS-Zugriffsberechtigungen=AFSAccessPermissions>main -4 Zusätzliche Zugriffsberechtigungen=OtherVariablePermissions>main -4 Normale und negative Einträge=NormalandNegativeEntries>main -3 Verwenden von Zugriffssteuerungslisten -4 Festlegen von ACLs=AccessControlLists>main -4 Hinzufügen von ACL-Einträgen=AddACLEntry>main -4 ALC-Einträge entfernen=Removing_ACL_Entries>main -4 Kopieren von ACLs=CopyACL>main -2 Volumes und Partitionen -3 Übersicht=Volumes_and_Partitions>main -3 Anzeigen von Volume- und Partitionsinformationen=Displaying_Volume_and_Partition_information>main -3 Aktualisieren der Name/Volume-ID-Zuordnungen=Refreshname.IDmap>main -2 Mount-Punkte -3 Übersicht=Mount_Point_first_page>main -3 Anzeigen von Mount-Punkt-Informationen=Displaying_Mount_Points>main -3 Entfernen von Mount-Punkten=Removing_Mount_Points>main -3 Mount-Punkte erstellen=Making_Mount_Points>main -2 Zwischengespeicherte Dateien -3 Übersicht=Cached_Files>main -3 Dateien und Verzeichnisse leeren=Flushing_files_or_directories>main -3 Volumes leeren=Flushing_Volumes>main -2 Server -3 Auflisten von Zelleninformationen -4 Übersicht=ListingFileServerInformation>main -4 Anzeigen von Datei-Servern=Showing_File_Servers>main -4 Anzeigen des Datei-Server-Status=Showing_the_Status_of_File_Servers>main -3 Server-Vorgaben -4 Übersicht=Server_Prefs_Overview>main -4 Anzeigen von Server-Vorgaben=Viewing_Server_Preferences>main -4 Hinzufügen von Server-Vorgaben=Adding_Server_Preferences>main -4 Ändern von Server-Vorgaben=Modifying_Server_Preferences>main -2 Zellen -3 Auflisten von Zelleninformationen -4 Zellen anzeigen=Showing_Cell>main -3 Zellendatenbank -4 Übersicht=Cells>main -4 Hinzufügen von Zellen=Adding_Cells_to_your_Cell_Database>main -4 Ändern von Zelleninformationen=Changing_Cell_Information>main -4 Entfernen von Zellen=Deleting_Cell_Information>main -2 Submounts -3 Übersicht=Submounts_Overview>main -3 Erstellen von Submounts=Creating_Submounts>main -3 Ändern von Submounts=Change_or_Edit_Submounts>main -3 Entfernen von Submounts=Delete_Submounts>main -1 Referenz -2 Glossar=Glossary>main -2 Vorgehensweise...=How_To...>main diff --git a/src/WINNT/doc/help/de_DE/taafscfg.cnt b/src/WINNT/doc/help/de_DE/taafscfg.cnt deleted file mode 100755 index 8545c51d4..000000000 --- a/src/WINNT/doc/help/de_DE/taafscfg.cnt +++ /dev/null @@ -1,32 +0,0 @@ -:Base TAAFSCFG.HLP -:Title IBM AFS Server Configuration -1 Hilfe zu IBM AFS Server Configuration -2 Informationen zu AFS, zum AFS Server und zum AFS Control Center=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 Konfigurieren des AFS Servers -3 Übersicht=Configuring_the_AFS_Server -3 Der AFS Server Configuration-Assistent=The_AFS_Server_Configuration_Wizard -3 Führen Sie folgende Schritte aus, um den AFS Server in eine vorhandene Zelle zu konfigurieren=Configuring_the_AFS_Server_into_an_Existing_Cell -3 Führen Sie die folgenden Schritte aus, um den AFS Server als ersten AFS Server in eine vorhandene Zelle zu konfigurieren.=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 Zugreifen auf AFS-Daten=Accessing_AFS_Data -2 Das Dialogfenster AFS Server Configuration -3 Übersicht=The_AFS_Server_Configuration_Dialog_Box -3 Führen Sie folgende Schritte aus, um auf das Dialogfenster AFS Server Configuration zuzugreifen=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 Register Partitionen -4 Übersicht=IDH_PARTITIONS_PAGE -4 Einrichten von AFS-Partitionen -5 Übersicht=Setting_Up_AFS_Partitions -5 Führen Sie folgende Schritte aus, um eine AFS-Partition zu erstellen=To_Create_an_AFS_Partion -4 Verwalten von AFS-Partitionen -5 Übersicht=Administering_AFS_Partitions -5 Wiederherstellen einer AFS-Partition -6 Übersicht=Salvaging_an_AFS_Partition -6 Führen sie folgende Schritte aus, um eine AFS-Partition wiederherzustellen=To_Salvage_an_AFS_Partition -5 Entfernen von AFS-Partitionen -6 Übersicht=Removing_AFS_Partitions -6 Führen Sie folgende Schritte aus, um eine AFS-Partition zu entfernen=To_Remove_an_AFS_Partition -3 Register Services -4 Übersicht=IDH_SERVICES_PAGE -4 Aufgabenbereiche der AFS Server=AFS_Server_Roles -4 AFS-Services=AFS_Services -4 Führen Sie folgende Schritte aus, um einen AFS-Service zu konfigurieren und zu starten=To_Configure_and_Start_an_AFS_Service -4 Führen Sie folgende Schritte aus, um einen AFS-Service zu stoppen und zu dekonfigurieren=To_Stop_and_Unconfigure_an_AFS_Service diff --git a/src/WINNT/doc/help/de_DE/taafssvrmgr.cnt b/src/WINNT/doc/help/de_DE/taafssvrmgr.cnt deleted file mode 100755 index 8870f0949..000000000 --- a/src/WINNT/doc/help/de_DE/taafssvrmgr.cnt +++ /dev/null @@ -1,89 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title IBM AFS Server Manager -1 AFS Server Manager -2 Übersicht über AFS -3 AFS: Übersicht=AFS__Overview -3 AFS-Zellen=DCE_Cells -2 AFS Server Manager -3 AFS Server Manager: Übersicht=DFS_Server_Manager -2 Bei AFS authentifizieren -3 Bei AFS authentifizieren=To_Obtain_DCE_Credentials -3 Zu überwachende AFS-Zelle auswählen=To_Choose_a_DCE_Cell_to_Administer -2 AFS Server -3 Server: Übersicht=Servers__An_Overview -3 Verwalten von AFS Servern=Setting_Up_and_Maintaining_DFS_Servers -3 Überwachen von Server-Untergruppen=Monitoring_Server_Subsets -3 Server-Merkmale=Server_Properties -3 Server-Warnungen=Server_Warnings -3 Administratoren für einen Server -4 Administratoren für einen Server: Übersicht=Administrators_for_a_Server -4 Benutzer zu der Administratorenliste für einen Server hinzufügen oder daraus entfernen=To_Edit_an_Administrative_List -3 Server-Chiffrierschlüssel -4 Server-Chiffrierschlüssel: Übersicht=Server_Encryption_Keys -4 Neuen Server-Chiffrierschlüssel hinzufügen=To_Add_a_New_Server_Key -4 Server-Chiffrierschlüssel entfernen=To_Remove_a_Server_Encryption_Key -3 Server-Dateien -4 Neue Datei auf einem Server installieren=To_Install_New_Files_on_a_Server -4 Frühere Versionen der Binärdateien auf einem Server installieren=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 Dateien von einem Server löschen=To_Prune_Files_from_a_Server -4 Dateidatumsangaben abrufen=To_Get_File_Dates -3 Synchronisieren der VLDB auf einem Server -4 VLDB synchronisieren=Synchronizing_the_FLDB -4 VLDB auf einem Server synchronisieren=To_Synchronize_the_FLDB -2 AFS-Partitionen -3 Partitionen: Übersicht=Partitions__An_Overview -3 Partitionenmerkmale=Partition_Properties -3 Partitionenwarnungen=Partition_Warnings -2 AFS-Volumes -3 Volumes: Übersicht=Filesets__An_Overview -3 Die unterschiedlichen Arten von Volumes =Read__Write_and_Read_Only_Filesets -3 Die Volume Location-Datenbank (VLDB)=FLDB__Fileset_Location_Database_ -3 Volume-Merkmale=Fileset_Properties -3 Volume erstellen =To_Create_a_Fileset -3 Volume umbenennen =To_Rename_a_Fileset -3 Volume löschen =To_Delete_a_Fileset -3 Verschieben von Volumes -4 Verschieben von Volumes: Übersicht=Moving_Filesets -4 Volume verschieben =To_Move_a_Fileset -3 Erstellen von Sicherungsversionen von Volumes -4 Sicherungsversion eines Volumes erstellen=IDH_SVRMGR_CLONE_OVERVIEW -4 Sicherungsversionen mehrerer Volumes erstellen=To_Clone_Multiple_Filesets -3 Sperren und Freigeben von Volumes -4 Sperren und Freigeben von VLDB-Einträgen=Locking_and_Unlocking_Filesets -4 Sperrung eines Volumes feststellen=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 Volume sperren=To_Lock_a_Fileset -4 Volume freigeben=To_Unlock_a_Fileset -3 Speicherauszug für Volumes erstellen und Volumes wiederherstellen -4 Speicherauszug für Volumes erstellen=Dumping_and_Restoring_Filesets -4 Speicherauszug für ein Volume erstellen =To_Dump_a_Fileset -4 Volumes wiederherstellen=Restoring_Filesets -4 Wiederherstellen schrittweise steigender Speicherauszüge von Volumes=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 Speicherauszugsdatei wiederherstellen=To_Restore_a_Dump_File_to_a_New_Fileset -3 Volume-Warnungen=Fileset_Warnings -2 Volume-Nachbildung -3 Nachbilden von Volumes=Replicating_Filesets -3 Neuen Volume-Nachbildungsstandort erstellen=To_Create_a_New_Fileset_Replication_Site -3 Volume nachbilden =To_Replicate_a_Fileset -3 Volume-Replikate aktualisieren=Updating_Replicas -2 AFS-Services -3 Services: Übersicht=Services__An_Overview -3 Einrichten und Verwalten von AFS-Services=Setting_Up_and_Maintaining_DFS_Services -3 Service-Merkmale=Service_Properties -3 Service erstellen=To_Create_a_Service -3 Service löschen=To_Delete_a_Service -3 Service starten=To_Start_a_Service -3 Service stoppen=To_Stop_a_Service -3 Service erneut starten=To_Restart_a_Service -3 Datum und Zeit für Neustart des BOS-Service festlegen=To_Set_BOS_Service_Restart_Dates_and_Times -3 Service-Status und -Einzelangaben anzeigen=To_View_Service_Status_and_Details -3 Serviceprotokolldateien -4 Protokolldateien=Log_Files -4 Serviceprotokolldatei anzeigen=To_View_Service_Log -2 Wiederherstellen von Volumes -3 Wiederherstellen von Volumes: Übersicht=Salvaging_Volumes -3 Alle Volumes auf einem File Server wiederherstellen=To_Salvage_all_Volumes_on_a_File_Server -3 Alle Volumes auf einer Partition wiederherstellen=To_Salvage_all_Volumes_on_a_Partition -3 Volume wiederherstellen=To_Salvage_a_Volume -2 AFS-Befehlsreferenz -3 Befehlsreferenz für AFS-Benutzer unter UNIX=UNIX_Command_Reference -3 Befehle der AFS-Eingabeaufforderung=AFS_Command_Prompt_Commands diff --git a/src/WINNT/doc/help/de_DE/taafsusrmgr.cnt b/src/WINNT/doc/help/de_DE/taafsusrmgr.cnt deleted file mode 100755 index 5076523f8..000000000 --- a/src/WINNT/doc/help/de_DE/taafsusrmgr.cnt +++ /dev/null @@ -1,59 +0,0 @@ -:Base TAAFSUSRMGR.HLP -:Title IBM AFS Account Manager -1 AFS Account Manager -2 AFS-Benutzerkonton -3 AFS-Konten erstellen -4 AFS-Benutzerkonten erstellen=Creating_User_Entries -4 Ein neues AFS-Benutzerkonto erstellen=To_create_a_single_user_account -3 Kennwortauthentifizierung und Sicherheit -4 Kennwort-/Authentifizierungssicherheit verbessern=Improving_Password_Authentication_Security -4 Anzahl aufeinanderfolgender fehlerhafter Anmeldeversuche eines Benutzers begrenzen=To_limit_the_number_of_consecutive_failed_login_attempts -4 Sperre eines gesperrten Benutzerkontos aufheben=To_unlock_a_locked_user_account -4 Lebensdauer des Kennworts für ein AFS-Benutzerkonto festlegen=To_set_password_lifetime -4 Wiederverwendung von Kennwörtern durch den Benutzer einschränken=To_restrict_reuse_of_passwords -3 Kennwörter ändern 4 Kennwörter ändern=Changing_Passwords -4 AFS-Kennwort eines Benutzers ändern=To_change_a_password_in_the_Authentication_Database -3 Benutzerkonten entfernen 4 Benutzerkonten entfernen=Removing_User_Accounts -4 Ein AFS-Benutzerkonto löschen=To_remove_a_user_account -2 AFS-Gruppen -3 Informationen zur Protection-Datenbank=AFS_Protection_Database -3 Einträge in der Protection-Datenbank=Protection_Database_Entries -3 Gruppen verwenden -4 Gruppen effektiv verwenden=Using_Groups_Effectively -4 AFS-Gruppen ohne Präfix verwenden=Using_Prefix_Less_Groups -4 IP-Adressen in Gruppen stellen=Placing_Machines_in_Groups -4 Standardgruppen der Systemverwaltung=The_Standard_System_Groups -4 Auflisten von Informationen über Gruppen -5 Auflisten von Informationen über Gruppen=Listing_Information_about_Groups -5 Eine Liste der Mitglieder einer AFS-Gruppe anzeigen=To_list_the_members_of_a_group -5 Informationen zu einer AFS-Gruppe anzeigen=To_examine_a_Protection_Database_group_entry -5 Eine Liste der Gruppen anzeigen, deren Eigner eine AFS-Gruppe ist=To_list_the_groups_that_a_group_owns -4 Gruppenbezogene Informationen über Benutzer und Maschinen-Einträge auflisten -5 Gruppenbezogene Informationen über Benutzer und Maschinen-Einträge auflisten=Listing_Group_Related_Information_about_Users_and_Machine_Entries -5 Eine Liste der Gruppen anzeigen, zu denen ein AFS-Benutzer gehört=To_examine_a_Protection_Database_entry_for_a_user_or_machine -5 Eine Liste der Gruppen anzeigen, deren Eigner ein AFS-Benutzer ist=To_view_a_list_of_the_groups_that_an_AFS_user_owns -5 Eine Liste der Gruppen anzeigen, deren Eigner ein IP-Adreßkonto ist=To_view_a_list_of_the_groups_that_an_IP_address_account_owns -5 Eine Liste der Gruppen anzeigen, zu denen ein IP-Adreßkonto gehört=To_view_a_list_of_the_groups_to_which_an_IP_address_account_belongs -4 Benutzereinträge erstellen -5 AFS-Benutzerkonten erstellen=Creating_User_Entries -5 Ein neues AFS-Benutzerkonto erstellen=To_create_a_single_user_account -4 Maschineneinträge erstellen 5 IP-Adreßeinträge erstellen=Creating_Machine_Entries -5 Ein neues IP-Adreßkonto in der AFS Protection-Datenbank erstellen=To_create_a_single_machine_entry_in_the_Protection_Database -4 Reguläre Gruppen und Gruppen ohne Präfix erstellen 5 Reguläre Gruppen und Gruppen ohne Präfix erstellen=Creating_Regular_and_Prefix_Less_Groups -5 Eine neue reguläre AFS-Gruppe erstellen=To_create_a_single_regular_group_entry -5 Eine neue AFS-Gruppe ohne Präfix erstellen=To_create_a_single_prefix_less_group_entry -4 Mitglieder zu Gruppen hinzufügen und aus ihnen entfernen 5 Mitglieder zu Gruppen hinzufügen und aus ihnen entfernen=Adding_Members_to_Groups_and_Removing_Them_from_Groups -5 Einen Benutzer oder ein IP-Adreßkonto einer Gruppe hinzufügen=To_add_users_and_machines_to_groups -5 Einen Benutzer, ein IP-Adreßkonto oder eine Gruppe aus einer AFS-Gruppe entfernen=To_remove_users_and_machines_from_groups -3 Einträge in der Protection-Datenbank löschen 4 Einträge in der Protection-Datenbank löschen=Deleting_Entries_from_the_Protection_Database -4 Eine AFS-Gruppe löschen=To_delete_user_and_group_entries -3 Eigner einer AFS-Gruppe ändern -4 Eigner einer AFS-Gruppe ändern=Changing_the_Owner_of_an_Entry -4 Implikationen für Namensänderungen bei Änderungen des Eigentumsrechts=The_Name_Changing_Implications_of_Changing_Ownership -4 Eigner einer AFS-Gruppe ändern=To_change_the_owner_of_a_group_entry -3 Namen eines Eintrags ändern -4 Namen einer AFS-Gruppe ändern=Changing_the_Name_of_an_Entry -4 Namen einer AFS-Gruppe ändern=To_change_the_name_of_a_group_entry -3 Gruppenerstellungsquote ändern 4 Gruppenerstellungsquote ändern=Changing_Group_Creation_Quota -4 Gruppenerstellungsquote eines AFS-Benutzers anzeigen=To_examine_group_creation_quota -4 Gruppenerstellungsquote eines AFS-Benutzers ändern=To_change_group_creation_quota diff --git a/src/WINNT/doc/help/en_US/AFS-CC.HLP b/src/WINNT/doc/help/en_US/AFS-CC.HLP deleted file mode 100755 index 49cf85811ed95aad1cf1d6d3b2c69e24c1f8ba7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35175 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%0DXT$Q<=;IN;OSb@)eDvp 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 MmInS&8t88OU%3q`ng9R* diff --git a/src/WINNT/doc/help/es_ES/AFS-CC.CNT b/src/WINNT/doc/help/es_ES/AFS-CC.CNT deleted file mode 100755 index f146aa208..000000000 --- a/src/WINNT/doc/help/es_ES/AFS-CC.CNT +++ /dev/null @@ -1,11 +0,0 @@ -:Base AFS-CC.HLP -:Title IBM AFS Control Center -1 Configuración de AFS Control Center -2 Célula por omisión -3 Cómo establecer una célula de AFS por omisión a administrar=Cell_Membership>main -2 Base de datos de células -3 Visión general=Cell_Database_Overview>main -3 Cómo añadir células a la base de datos de células=Adding_Cells_to_Your_Cell_Database>main -3 Cómo cambiar la información de célula=Changing_Cell_Information>main -3 Cómo eliminar células de la base de datos de células=Removing_Cells_From_Your_Cell_Database>main - \ No newline at end of file diff --git a/src/WINNT/doc/help/es_ES/AFS-CC.HLP b/src/WINNT/doc/help/es_ES/AFS-CC.HLP deleted file mode 100755 index 31b3be20e2e467988d39075d9caaaf25e5420402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39522 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 O2kI diff --git a/src/WINNT/doc/help/es_ES/AFS-LIGHT.HLP b/src/WINNT/doc/help/es_ES/AFS-LIGHT.HLP deleted file mode 100755 index ea4e2dd811f7e8240bcedaae708a78c7e7c8b9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208407 zcmeEvd3;nww*S4IzFmEjbh;rxAZ$(87n88BLT6zQ5Fnr;nsky*Xh^zacfvNP%_0Ii zh&wK$xQycNsN<;PxQ#lByW_ZTFpdl3&W!pPh2QsEb$iKz`sU5={q^`z>Dzs8Rh@I{ z)Yy55r-!lE~?Q2P0jvDQAwFr zG-I*9!QarR`D+3pe`7G9g_^@fP5wwgs|iH*`y(|goWa#$hcD`HY1aE_!Mb3Lzb0ru z6v~Q4q5=O`UVm*cQe=3m{jq4E#@|>S^l7$+MV>%SI8+ku9BTH2qfV_ZSiiGnyH=`o z)uJs8UTXh!e?z!F77jE78iMt9J+C%h z3$FCLw8r3Br)$%NFA$m@>ZiXL@z?r+Pla}^$2UFN?5}PZ+bN)%vF82L*EThT^#Uy% zsgJZYg>6Bn9-bYl3rEgr(o6JUdeiJs@SxUjhwhJ-1*)}ZnJ-wsqPZb>qSoLIM;ra2 zKYJSk&d}k;;ktiiV4gi3-L6F%_n+31cAbVE8}~;;VXd(`5||%u_74bG|3(i)UeNvJ z8EM*UdULIIC{*sZMGxo={-!{r(G!e@qr%%9XwrZ0`O4oE3D-wn^f&s;g)izUcX|q& zf`QsOBj?$gTACZ88F}SS&81DTou;(}76ocr{I$Iz;ZmFMJyBE}j$Toq*XlJ{XdtpWSfDQ!zM#825babRnC^+$qIU+q@;7wzIK0utwp&)^Ih&$W^uWVfI7{#M znJwUtR%Cfvs?U0~xJB3eEur9xT477H#oyTmAdz!!0jKT>XmnV3nCZsvNX|};yr;$B<&ZdX^q-9slN$Xp+ z*!M?U^Umyd26hgQweRm=(`@(j0k1?*MDQTH|hVF_Kr8fYP#DzbfhvJ-DvrUEA5&m4?F?%JQuV8EcG~Q8PokDf_!lO-CcTOEWx?fo|_p zX=i5#I-T$Ig`-6qvI9kTj{O0Hvel^X>hSfli^6hSM)$&dyGHlhqmALBqrx{L?M#p1 z{Qy-@vx!1?UthOQL%b{XNU*x)v%eVrH?#*lMFYMWJ>yTd$(g(6UlLhXH`QL}2seJe zzd7I-GAgTls^?zg6x$znIL=B77p-eaPqTYmtGoF(cH26x)?Zy+<&Q-C#b-OtaqJ)b zyy4W|auhdQ-NheSR4p)9+=bDs!syG@O%8vt-4jXo8k(p1Pzcx6Ez#F5KwG(v;!IDZ zv)AyLU)hTf8=hK!P09Ekj!(2SPs>1Icx%IJGRAirzsymRJF{O-&%*F0r)Z5$-91es zv`>uDp8Ay{XnfwOrg>>Mv;4E2(Vm@Lcm7I?hD-itJNksU%Hb#v_J3Loa=aieKFwFN zA`*<2Tt2ww*6@nE9oG(SJepShxufsq@j=I%_RjWf=X!t1(Oi3|hs`Esb z!hcPjkmqR#8^Slr`&(f+Czom`JF2V7GrWFJQ)ER;pt^tenj4KeE%e?VajxCrtFhb`@ovu%h3`6CrnB(7A=ite{}{5V zo3rq(Zv8!GVRqB;J^tCNM~T*@#$K3iztfrNJvu-)Jl(y6%v;6uq4WER!ZSOMTDHCJ zvW8BsUBPvK7+iA4`Ilu@-Pz+NGx~vE`|0d|X6=doMfaz9oN1fI&7SQ$M5M&-sfo1I zc0T(gk>+{I8Hkj$JmQ=7C1`-b;}*U%iURPdLQo&-lz?XHcu)Nf%=bfoQ08vBKU;|!m~u{ zl(C{X-QgLj9d&rC(sOb~h}WGNp1!~Dbmt2TwXt0mc|>8P)LGu6@XRkTBt3jrXN>kZ zO3Wtz9TPm+CElj=UC}RdYjzv|O4o&_X{Rr}e4Um(xv%HYrr^+wVExLBOEsZQ@*K(^ z{z7^%G(g{)-e3yt=;+*MOlQ>wy-QV@p4sDu$-mDikLbZEo$OjPqb@XNzq2Y@8jM^x z{H@6@?P#Ce(H>{hebv3a56*RD+P#Nf%J@ZIWWTd;nRZU+2laPyyunK{%%%~AQRk>t z-CO?PSocLnFq-c0?bO2WjrMG|-PHY=kq#p?GV_4#wC-B8wq^HV(|e+5ZU_YSXTGd8 z56uiZ=h~fX0c0njl%x*>0P~t{nH`Y0+E#k8O=~`>w9?$BZs0SOSGqnAypZv6=B-@=f682Ad~cq7va>up z@?hpCnW2+ifghe5G5zH!4&R@|3B5k*)kphs^=JO+_w-zlm##UyU!0Oxa@>(JNAJLW z&Yc;;^Fv;r>1I`S(>PZ~Y>cnxgrga|y2n0qm6um{IoVsC8S=jS+43sWQ&ebrqrdEZ zcJFU5ZoH`R#(C?n_V|0;*4rpNdZ_nvU7zm#7gxRg&#nocDW208dH28A`;08RR&W2v z^+~VkYe%_r`iQEUhL&%l$7eXp!@C`uGy8RRmOmfu?A?;pBkQx8QMRn%y#j0hDkh{0 zE#m*GOSsPOZkTVY^Ec>r7zE)N!G^%T87FHiCgsD_$y%GawXVAN$YFKSx|aRotigGK zbkBN!UCW&G_a?hvndT~gGpoBVFiLAk_Z$k`HA zZp`Y_duGJ{hw%&gW<5E+llQGG|LXOHGe`fe&%yj?{X*Ay#;g?${uOgG(mWBTw!C1) z_5S)UT4+VRvF7{qEi3%TyJz{=t+091{kyu?UOzkjG66%g+a zyR!;^<92w@9P8=h>88DC|ElLJ12-tr&lmi4f!kB($?-Jw?Nc~k``n%HnJ0pw z#;Du)iyjOecK+JsaLyk7ZdOLO;EL`Imuby`<1cd8=0G>@)I?LHZi;`s@cu3BaZi4F zq@`D5($guJsrAGJQXIyZa)uH8iBrDyp!|Gc7>x2E!T^N&;DlD0u7&q0{(_WkJT6U z^4F}GH?8NW%zrrwUA}0RwzkJLlQKQg9!L9YJ5ODlcAslx&%btZy3X(9{-<%H!|dtP z0->m1-(>_sEw$l!FpCe*3)V!!(QVE*Te_~&);MS7RRj2h&5>k{|TfsM~OY_53~xjh|&PtF~s{VRW7_yN5! ztgQ}2<}E(1biv1q8(VI7Mh(xuv;&z}zi&9Su5P>bg>!9izjp2?&C4*P(ZQl9b6q~n16i6{J~|Jr4H1c z|JyDNq05X|AnGc7v0o@W@{AMbSA_O@?A~a)Cw#Zvo31s&++436c6zqXH@q2z(eQ%m z9%5Zn{(|a&;j9{|xyLWKBF#Ltdsz6~m=G?{nTF>=cc1cfZx8K4=XdttL*ZxKF2nHD ziyO7@W9E%U;Y}i|FcLmLW5LB4Tcb{oN7P0FO?Rj5g85edh@+wD4Ew_$bpB}Cn|-ziqx}U5{w^NV%i1 zpV(&BJ6_ga^^DA^+>^UsJF{257pmhQ+GoFg(OI6G^OYB}Dmu)5ZlLM?T)P(8U*6OB zu=&B>OESvC*_zFBa-XAS+Pvu%(=Y9RqWQ$Q#_sp`94yLTamJjhgMS~_6nQ?lPhX`i zHfn-Hb!VS%4>&t{nq9Rs=VyA~&>V$tjmTQ$ZqD*FIvSU0@ANu4)ZJHe7T%Gb?HQ~e z)^5;#cYn8mp7bw68M`j`gpXvMys4k*sh?>)+qe8BcVMCE353dXx;FLd8r`1mjV?q} zheD5K-f{VW*YtxUM0wQX`J|8bhc_~72ikAQsqHMP_V0Im)GIe&W_AnI@5nvFWj48s zwJyFc&OU{aMS=P=|DL(o1zq4NoAJmm_qYPD4b3`i-eOyHzkT&p9*6I6(}n4a4DUnE za+pwCGv1BfIQNNpV;s*P|JiX`v3Ybz-!Ghh&Dzq#;kn4;_KxzLo#P#%<@bz6{ne{& z-}oQsGSMD=$~ic9pDi6 zET5X25$hfcXU4vdEKYCwq^#DnJ*{q7AMKt<5U$a9BP3Rzn{%Gab5V}Fe3=I4!|wI@ z7q1AfSzMVBUGR5fVb8&?yOss(mt`#e;x=LPJeB_kXJn{h*UDYfW~4hEi;SyncJC?1 zVgL7`#nT*mkD1*>;XTgrgAYd2%R|}akzT$5<+~h?a4)S(&lQ2i&3>)9B^rg-Qhjy7 z@mKcDyfatZJ+Y;F(xBXxFX`1W{{(G+r24yXLv-&bhxY4iN8x(&$YN(o**Qbk>*5E?rU;S`zZNT$cVo-epn9>bX?(A>>(;OH-|l#LU*0{s|8PTdP;2xb4k0qp2(jH9 z;H4Hm42QJ9u4#i%?30Ju?3#W37{)`|{yTb9*K{olKQBtllJS!bB{N29=N^})Z75kV zzhe4{71}8S`K98-1@nr^wcp=h(>Bb&9c})vaW(gZ;)+Gnr)w|XD!-H#RTODkZuis|#Te%*0hv7mf*iS~96URIQ;c8|V| z2A0lVP*$YncLf;LjfL8S0Pg?({T~JXj{^Tm3cO>}v{z6d4m7PR;elHEHVNY%9K zHfeJ-?bfmZWAFUv=9SNOxpw@{kvH9SjVJHY$2-4x%9dZv{mrJ`7o-o(yMN@}7v^4J ztf_PN^ZN#TJLtA9-!8gnVwV|Dc(4ET)Z!t}YFb{N*X}JI;LY=TZMM9;Vy(8{O~ay1 zElZcwEOigu^2(gAD{AHk^9qKXIw$>_8@rwVM#*W%_1baQ-IpG?{fXn7zU;MX)%^oX zOKW`@A3lHX&D%b{`C!!zw{N_-(;IW2t9yIQwT?NT*9~0q?aReYS)ZTvPR+0<-noBl zpy1Kt?e1R>n9;ms`gyl~n7jD%8_wO^t)lBf*Ds4QpUC{}eKl39>%w!t@l4tB@}eDA zb*_%qee>d?;oGh$Prs(?E03JIXwI|Ud)!pG>y`&5jn1hzw>|shtf< zr7u^XGxXPsE;z|K{o+n9WxC#ZyTp0cEq7nnIgW#N+ZPno`}q+dlv%{L!E zy*cl$WmRh`Ua2Ua_2jerw%v^Xw?6t#NtM6L!lnOw#ol%7-cc7l^6BlD7ni^G$kuJ= z-oD!=#+PP&8XDTAZhUF&wT~UQc21w-+STsui&y@3!nM~9(;g76Q}{d2Si2o{_9J3e!TbKRmETWZtr}{r5`@~Xz!t0uC3m> zz2dS?T{|sY_?)NHInkl>p3A=b!d=-Tqs~Xq`9<*Bk8ggeY@oevlLH2m;w%J={8msj`Ieh;R;i;Ufn)(;H+>assfAfxAKh~Cxuy|n@F z?BaP|EC_hZ7}nO(U~jLBnVL=OuH7W>m4qWr;fTLE7!Hl_j+{7gqUO}HxrA`s==^cV z6_w38u5k3ov4w@G=+TNJ;Wg1faZ7V^I20X1B2EYg>2qisXc+R>x?Ws$9CBpYFebFq^!+xiA>O*Fr6-y;?ddQ$ zlBkxzmdMZybw3kiHMOD$ddEXHZG;v%$EF2Qq;ZmIwK58yBn5eADn3V|*wQe-ac08z z#7#GT_Y~jYqO^~O9}Oao=N?7&A%*ESt>dwSlETi2otKs`3j`h)Q4&5g~r z@p+rJJ7&{1;bGws#yat#cw5X6xhOE|9}vck_$6KbqTi(n^BQ3uhi@MW*M(w*`uToa zj$4?0Q0FnBR|s7<=IS<4C5$QJ0z9!nnES*mv}#@??h<;waEPtKoG9i9SFt!lT#%iw zX_EmFOeKlT96%^Z&?Gc%^hSsF&<;1)Thn-BGs@1WRJ zMT_0LL5NtIMGoOk)+_iG9{d7@&3Z8;90u>G*n4x8! zCfq{5T$twz*HrPb(1)O14AkTre`J46b0DG-faOA8h5@-m=zjpvXNWh&$+dyHAZ%^O zgFv(=#zPy6f^|npn7^QZi>i5&s;~kqiyWL&zPgJAue-rflT$m3ESBN}uDxp<$B8Qc0;yYoC2B(pV z)&ni`fuq?&j1D$71#2-j90Ro5Q@0D(WYpA;;(@IK{VuncDr!{V<^mxHc=1(lB-Zir73nz8;@)6)Yz*;wB10Z;%*I> z%LW`i6rX~fOouSKq2+i#8QKW^YUBu4DF8OI#r27?aiJHI_%!rrjZH3lbhI0rM=>^L zdcj;&C_^EL526gkwKp%eo0Sqn(|S-$6R=3qZOlC zc97#CIUEb|ID4IoI#$ou{z%W}@f{BbyO-$!Xy(jh_udY>Hz36H9R-U~XB7&&emU8_ zWZGkJgW(sqW8%0_{~RE%pNUD3;0w$Hg3$$qAUGhotpOO)As7w{jM)WYJbxJqL1;l8 zOJIy{%@nDV1_D?Lj6qTWTuF|wQ7V5fT+=vjuEhMD&H3rd1+N%?=U5HKa3y#IzPSYN z<|K%P1hJd#!Cn7=fHLBu>412o=OjGrL+OV?_zt2-H8CbutSar^hDuZug}XjGi-K+Y zrlWm@d8Skot`%<4my-_mnZ^#sL32^EdMCx2+SK22_gPQM`Z3OdzQVOy825wDX9%-1 zKE|M=Pn&_dl+J`>1KP4+S>C2Csj}j*v{N#D*$QhC8tPIDqS`jCta$vqPN@(Tiw0q4 zCtxW?3j!kt&J5zk(W!UlhfG6dJ&KC$VFTcjCdJ>0+OD?idpJ{D6UG&YC<=(QBZ zhq6KJvI)Z_jIEeWm*9t~P=jEhlchSZVLnYl7fls&k(z+C1V0ilz~U9?km7>C5+jTJ zQd}&u?S5(!_{S!VhEuV?1=Gz^RQQyNV)CUCVbQFt@N*~Y~Y(+IoJ5VYaV=>nQ6gsyMjewSTiEkiv%mP{&ur{v1r~asLrHL}(8knFC zw7UL+FwPa`8cn$H0bAo&!n_)iNqk5Job? zJD48DcANHs(n(Lk^s7WbIlJWtIYAe)yYHJC%s#-u+?ux?3 zA48FI%NrY}>OQq21|h7Jv*Dmj%_>+AdY_It&Yq@VuqfkT_xwv*c;q5n2+EHGcP@DK z;Py=i?!M``b#h9WV4kVag6lw7qa2Xy)A7gc$tr7YR{7ObN#-I({uEHq5`FIZE@&Yjg0B#Wa4S0qgN*5TA&*GEDxA7dN zpfLyE^ee=t8~|5^f?+CslUH%$WB5H9Mi@3RvgexpjR-`CX>Fj+_acIi&qWQ=x}xEb zzah9Dq5&X{KsEDXbY$$)q}Ty+Fu&*FX$22I_W=M`jxZ_9Hwbeas36Q-Vhtc%F8u1r zN!CMyjc^8h;$-C1AyW_C!K0wF^d=}>1?qF0y15f_@X-XfC(P?=;TnfdJz_F4;rt;$ z3(}ZFKr`jK#l1P7MtV%eO?&_nkm655Zv>ylpPV83hcOsYz{Al;qmu(Gk(@?p=>hpA zKIT3-I_7@mN2)%C*GK#ak)y^9Xifh;(9A^ztDPglSPe76oG2A^DKMijB0nvQW9E&W z+MWv+mt$-!hXsSUk$63Xrq3-n9z6M+T~X$`BIR0oOJi4{l1udgsCSqwJ{(QE z%D`#v`-ra9t-MxLcNO7x<1}HMLDGIKKET⪼0m$F4*K!G=!O8fw@%}wX86ShEz3f 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ⅅW6|sDc8;RePa) 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 MAo`Q}pX-PJ10Bw|qyPW_ diff --git a/src/WINNT/doc/help/es_ES/AFS-NT.CNT b/src/WINNT/doc/help/es_ES/AFS-NT.CNT deleted file mode 100755 index 93d453918..000000000 --- a/src/WINNT/doc/help/es_ES/AFS-NT.CNT +++ /dev/null @@ -1,78 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS Client -1 Visión general -2 Acerca de AFS=Working_in_AFS>main -2 Conceptos de almacenamiento de AFS=AFSFileStorageConcepts>main -2 Conceptos de seguridad de AFS=AFS_security_concepts>main -2 Acerca de AFS Client=AFS_Client>main -2 Acerca de la Ayuda=Audience_and_Purpose>main -1 Iniciación -2 Visión general=Running_AFS>main -2 Cómo registrar AFS Client como miembro de una célula=Adding_your_Client_to_a_Cell>main -2 Asistente de AFS Client=IDH_AFSCREDS_WIZ_START>main -2 Cómo iniciar y detener AFS Client=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 Cómo cambiar el tipo de inicio de AFS Client=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 Cómo montar el espacio de archivos de AFS=Mapping_Drives_Overview>main -2 Cómo autentificarse para AFS=Authentication>main -2 Cómo verificar la autentificación=VerifyingAuthentication@afs-nt.hlp>main -2 Cómo desautentificarse de AFS=UnauthenticatingfromAFS@afs-nt.hlp>main -1 Cómo gestionar AFS -2 Visión general=AccessingAFS@afs-nt.hlp>main -2 Menú de AFS=FileManagerAFSMenu>main -2 Programa de utilidad Configuración de AFS Client=AFS_Client_Configuration_Utility>main -2 Grupo de programas AFS Client=The_AFS_Client_Program_Group>main -2 Recuadro de propiedades de AFS Client=AFS_Credentials_utility.>main -2 Mandatos del indicador de mandatos=CommandPromptCommands@afs-nt.hlp>main -1 Utilización de AFS -2 Listas de control de acceso -3 Visión general -4 Listas de control de acceso=ProtectingFilesandDirectories>main -4 Control de acceso a nivel de directorio=Directory.LevelAccessControl>main -4 Permisos de acceso de AFS=AFSAccessPermissions>main -4 Permisos de acceso adicionales=OtherVariablePermissions>main -4 Entradas normales y negativas=NormalandNegativeEntries>main -3 Cómo utilizar las Listas de control de acceso -4 Cómo establecer las ACL=AccessControlLists>main -4 Cómo añadir entradas de ACL=AddACLEntry>main -4 Cómo eliminar entradas de ACL=Removing_ACL_Entries>main -4 Cómo copiar ACL=CopyACL>main -2 Volúmenes y particiones -3 Visión general=Volumes_and_Partitions>main -3 Cómo visualizar la información de volumen y de partición=Displaying_Volume_and_Partition_information>main -3 Cómo renovar correlaciones de nombre/ID de volumen=Refreshname.IDmap>main -2 Puntos de montaje -3 Visión general=Mount_Point_first_page>main -3 Cómo visualizar la información de punto de montaje=Displaying_Mount_Points>main -3 Cómo eliminar puntos de montaje=Removing_Mount_Points>main -3 Creación de puntos de montaje=Making_Mount_Points>main -2 Archivos en antememoria -3 Visión general=Cached_Files>main -3 Descarga de archivos y directorios=Flushing_files_or_directories>main -3 Cómo descargar volúmenes=Flushing_Volumes>main -2 Servidores -3 Cómo listar la información -4 Visión general=ListingFileServerInformation>main -4 Cómo mostrar servidores de archivos=Showing_File_Servers>main -4 Cómo mostrar el estado de los servidores de archivos=Showing_the_Status_of_File_Servers>main -3 Preferencias de servidor -4 Visión general=Server_Prefs_Overview>main -4 Cómo ver preferencias del servidor=Viewing_Server_Preferences>main -4 Cómo añadir preferencias del servidor=Adding_Server_Preferences>main -4 Cómo modificar preferencias de servidor=Modifying_Server_Preferences>main -2 Células -3 Cómo listar la información -4 Cómo mostrar células=Showing_Cell>main -3 Base de datos de células -4 Visión general=Cells>main -4 Cómo añadir células=Adding_Cells_to_your_Cell_Database>main -4 Cómo cambiar información de célula=Changing_Cell_Information>main -4 Cómo eliminar células=Deleting_Cell_Information>main -2 Submontajes -3 Visión general=Submounts_Overview>main -3 Cómo crear submontajes=Creating_Submounts>main -3 Cómo modificar submontajes=Change_or_Edit_Submounts>main -3 Cómo eliminar submontajes=Delete_Submounts>main -1 Consulta -2 Glosario=Glossary>main -2 Cómo...=How_To...>main - \ No newline at end of file diff --git a/src/WINNT/doc/help/es_ES/AFS-NT.HLP b/src/WINNT/doc/help/es_ES/AFS-NT.HLP deleted file mode 100755 index 10678d20ce7ff11682cd3167d582fdc4dd325c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287085 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�gysdUw3>2Lx}huZ6xiPlpQP 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 z zt%*(X^2AIW<(%8⁣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 diff --git a/src/WINNT/doc/help/es_ES/TAAFSSVRMGR.HLP b/src/WINNT/doc/help/es_ES/TAAFSSVRMGR.HLP deleted file mode 100755 index 1a29f8e45da753699325cda00cb02bfd65bd0694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227420 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�hm51jg=_V*xP)qi7E`;(9%xAIU!k%e^xV&5m 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≻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 diff --git a/src/WINNT/doc/help/es_ES/TAAFSUSRMGR.HLP b/src/WINNT/doc/help/es_ES/TAAFSUSRMGR.HLP deleted file mode 100755 index 6584e19dc709517061e7e4050df76e285aad4fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145116 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 -2 Conceptos de almacenamiento de AFS=AFSFileStorageConcepts>main -2 Conceptos de seguridad de AFS=AFS_security_concepts>main -2 Acerca de AFS Light=AFS_Client>main -2 Acerca de la Ayuda=Audience_and_Purpose>main -1 Iniciación -2 Visión general=Running_AFS>main -2 Cómo identificar una Pasarela de AFS Light=Adding_your_Client_to_a_Cell>main -2 Cómo montar el espacio de archivos de AFS=Mapping_Drives_Overview>main -2 Cómo autentificarse para AFS=Authentication>main -2 Verificación de la autentificación=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 Cómo desautentificarse de AFS=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 Cómo gestionar AFS -2 Visión general=AccessingAFS@AFS-LIGHT.HLP>main -2 Menú de AFS=FileManagerAFSMenu>main -2 Programa de utilidad de configuración de AFS Light=AFS_Client_Configuration_Utility>main -2 Grupo de programas de AFS Light=The_AFS_Client_Program_Group>main -2 Recuadro de propiedades de AFS Light=AFS_Credentials_utility.>main -2 Mandatos del indicador de mandatos=CommandPromptCommands@AFS-LIGHT.HLP>main -1 Cómo utilizar AFS -2 Listas de control de acceso -3 Visión general -4 Listas de control de acceso=ProtectingFilesandDirectories>main -4 Control de acceso a nivel de directorio=Directory.LevelAccessControl>main -4 Permisos de acceso de AFS=AFSAccessPermissions>main -4 Permisos de acceso adicionales=OtherVariablePermissions>main -4 Entradas normales y negativas=NormalandNegativeEntries>main -3 Cómo utilizar las Listas de control de acceso -4 Cómo establecer las ACL=AccessControlLists>main -4 Cómo añadir entradas de ACL=AddACLEntry>main -4 Cómo eliminar entradas de ACL=Removing_ACL_Entries>main -4 Cómo copiar ACL=CopyACL>main -2 Volúmenes y particiones -3 Visión general=Volumes_and_Partitions>main -3 Cómo visualizar la información de volumen y de partición=Displaying_Volume_and_Partition_information>main -3 Cómo renovar la correlación de nombre/ID=Refreshname.IDmap>main -2 Puntos de montaje -3 Visión general=Mount_Point_first_page>main -3 Cómo visualizar puntos de montaje=Displaying_Mount_Points>main -3 Cómo eliminar puntos de montaje=Removing_Mount_Points>main -3 Creación de puntos de montaje=Making_Mount_Points>main -2 Archivos en antememoria -3 Visión general=Cached_Files>main -3 Descarga de archivos y directorios=Flushing_files_or_directories>main -3 Cómo descargar volúmenes=Flushing_Volumes>main -2 Información de servidor -3 Visión general=ListingFileServerInformation>main -3 Cómo mostrar servidores de archivos=Showing_File_Servers>main -3 Cómo mostrar el estado de los servidores de archivos=Showing_the_Status_of_File_Servers>main -2 Células -3 Cómo listar la información -4 Cómo mostrar células=Showing_Cell>main -3 Base de datos de células -4 Visión general=Cells>main -4 Cómo añadir células=Adding_Cells_to_your_Cell_Database>main -4 Cómo cambiar la información de célula=Changing_Cell_Information>main -4 Cómo eliminar células=Deleting_Cell_Information>main -1 Consulta -2 Glosario=Glossary>main -2 Cómo...=How_To...>main - \ No newline at end of file diff --git a/src/WINNT/doc/help/es_ES/taafssvrmgr.CNT b/src/WINNT/doc/help/es_ES/taafssvrmgr.CNT deleted file mode 100755 index af2280a7d..000000000 --- a/src/WINNT/doc/help/es_ES/taafssvrmgr.CNT +++ /dev/null @@ -1,90 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title IBM AFS Server Manager -1 AFS Server Manager -2 Visión general de AFS -3 AFS: Visión general=AFS__Overview -3 Células de AFS=DCE_Cells -2 AFS Server Manager -3 AFS Server Manager: Visión general=DFS_Server_Manager -2 Autentificación de AFS -3 Para autentificarse en AFS=To_Obtain_DCE_Credentials -3 Para seleccionar una célula AFS para administrar=To_Choose_a_DCE_Cell_to_Administer -2 AFS Server -3 Servidores: Visión general=Servers__An_Overview -3 Mantenimiento de AFS Server=Setting_Up_and_Maintaining_DFS_Servers -3 Supervisión de subconjuntos de servidores=Monitoring_Server_Subsets -3 Propiedades del servidor=Server_Properties -3 Avisos del servidor=Server_Warnings -3 Administradores para un servidor -4 Administradores para un servidor: Visión general=Administrators_for_a_Server -4 Para añadir o eliminar un usuario de la lista de administradores de un servidor=To_Edit_an_Administrative_List -3 Claves de cifrado de servidor -4 Claves de cifrado de servidor: Visión general=Server_Encryption_Keys -4 Para añadir una nueva clave de cifrado de servidor=To_Add_a_New_Server_Key -4 Para eliminar una clave de cifrado de servidor=To_Remove_a_Server_Encryption_Key -3 Archivos del servidor -4 Para instalar un nuevo archivo en el servidor=To_Install_New_Files_on_a_Server -4 Para instalar las versiones anteriores de archivos binarios en un servidor=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 Para podar archivos de un servidor=To_Prune_Files_from_a_Server -4 Para obtener fechas de archivos=To_Get_File_Dates -3 Sincronización de VLDB en un servidor -4 Sincronización de VLDB=Synchronizing_the_FLDB -4 Para sincronizar VLDB en un servidor=To_Synchronize_the_FLDB -2 Particiones de AFS -3 Particiones: Visión general=Partitions__An_Overview -3 Propiedades de las particiones=Partition_Properties -3 Avisos de las particiones=Partition_Warnings -2 Volúmenes de AFS -3 Volúmenes: Visión general=Filesets__An_Overview -3 Los tipos diferentes de volúmenes =Read__Write_and_Read_Only_Filesets -3 La Base de datos de ubicación de volumen (VLDB)=FLDB__Fileset_Location_Database_ -3 Propiedades del volumen=Fileset_Properties -3 Para crear un volumen =To_Create_a_Fileset -3 Para cambiar el nombre de un volumen =To_Rename_a_Fileset -3 Para suprimir un volumen =To_Delete_a_Fileset -3 Movimiento de volúmenes -4 Movimiento de volúmenes: Visión general=Moving_Filesets -4 Para mover un volumen =To_Move_a_Fileset -3 Creación de versiones de copia de seguridad de los volúmenes -4 Para crear una versión de copia de seguridad de un volumen=IDH_SVRMGR_CLONE_OVERVIEW -4 Para crear versiones de copias de seguridad de múltiples volúmenes=To_Clone_Multiple_Filesets -3 Bloqueo y desbloqueo de volúmenes -4 Bloqueo y desbloqueo de entradas de VLDB=Locking_and_Unlocking_Filesets -4 Para determinar si un volumen está bloqueado=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 Para bloquear un volumen =To_Lock_a_Fileset -4 Para desbloquear un volumen =To_Unlock_a_Fileset -3 Vuelco y restauración de volúmenes -4 Vuelco de volúmenes=Dumping_and_Restoring_Filesets -4 Para volcar un volumen =To_Dump_a_Fileset -4 Restauración de volúmenes=Restoring_Filesets -4 Restauración de vuelcos graduales de volúmenes=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 Para restaurar un archivo de vuelcos=To_Restore_a_Dump_File_to_a_New_Fileset -3 Avisos de volumen=Fileset_Warnings -2 Duplicación de volúmenes de AFS -3 Duplicación de volúmenes=Replicating_Filesets -3 Para crear un nuevo sitio de duplicación de volúmenes=To_Create_a_New_Fileset_Replication_Site -3 Para duplicar un volumen =To_Replicate_a_Fileset -3 Actualización de duplicados de volumen=Updating_Replicas -2 Servicios de AFS -3 Servicios: Visión general=Services__An_Overview -3 Configuración y mantenimiento de servicios AFS=Setting_Up_and_Maintaining_DFS_Services -3 Propiedades del servicio=Service_Properties -3 Para crear un servicio=To_Create_a_Service -3 Para suprimir un servicio=To_Delete_a_Service -3 Para iniciar un servicio=To_Start_a_Service -3 Para detener un servicio=To_Stop_a_Service -3 Para reiniciar un servicio=To_Restart_a_Service -3 Para establecer las fechas de reinicio del servicio BOS=To_Set_BOS_Service_Restart_Dates_and_Times -3 Para ver el estado del servicio y los detalles=To_View_Service_Status_and_Details -3 Archivos de registro cronológico del servicio -4 Archivos de registro cronológico=Log_Files -4 Para ver un archivo de registro cronológico=To_View_Service_Log -2 Recuperación de volúmenes -3 Recuperación de volúmenes: Visión general=Salvaging_Volumes -3 Para recuperar todos los volúmenes de un Servidor de archivos=To_Salvage_all_Volumes_on_a_File_Server -3 Para recuperar todos los volúmenes de una partición=To_Salvage_all_Volumes_on_a_Partition -3 Para recuperar un volumen=To_Salvage_a_Volume -2 Consulta de mandatos de AFS -3 Consulta de mandatos para usuarios UNIX de AFS=UNIX_Command_Reference -3 Mandatos del indicador de mandatos de AFS=AFS_Command_Prompt_Commands - \ No newline at end of file diff --git a/src/WINNT/doc/help/es_ES/taafsusrmgr.CNT b/src/WINNT/doc/help/es_ES/taafsusrmgr.CNT deleted file mode 100755 index e69de29bb..000000000 diff --git a/src/WINNT/doc/help/ja_JP/AFS-CC.HLP b/src/WINNT/doc/help/ja_JP/AFS-CC.HLP deleted file mode 100755 index f62f24c530bcb5d00c6328534d01d06f3f368dfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36540 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 b1g8u)qx9xi=D=!`+WRbC-$)dGS4#OmNITmQ diff --git a/src/WINNT/doc/help/ja_JP/AFS-LIGHT.HLP b/src/WINNT/doc/help/ja_JP/AFS-LIGHT.HLP deleted file mode 100755 index 171ed615143b3cf7a3b5658509b5a9581a6e4a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226068 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[DM*5M>b_{< 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

;X*2y0d=K{mt}UbVgQYMpjY|ymEugLxv9@&U{%Q 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 Z0A-Y6ItbRg24gxp(gA`0M+nra{{=j}B-sD} diff --git a/src/WINNT/doc/help/ja_JP/TAAFSSVRMGR.HLP b/src/WINNT/doc/help/ja_JP/TAAFSSVRMGR.HLP deleted file mode 100755 index 64f8964fff2463a2860afc969b8eb00d350ebcb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244950 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%0A9A&*}R#_x=f#T3CN55m_&X zoZ-7@$z0Ej`x$;QK@oQ)3BEl{ulY?26MigaN+P7bzIPV04JNO$D2N-BV%N3;{ebHC zTSm)YzTix37M$DF3r289P&F5+RZ(LaYC==x{Ul78xF>q>t>$*GRv~-3VA$oS625G< zqjRhDK+|;D-Kns(sP)|!-@CG#AyN<9EUq?P{7v((I=By?$seY5Zt8rw9V;7f8%8h= zSy|`ciat$DZ7tgJ?(v$6-R&E??;0<3gJmGzo(_9<9~{-|0hg3>+4)ctBFhljkro6V zAC2;O;4zC2w&7rV8O2)7^_?+Ae6hQd_=7dFI;E2@JMz!SK)z6?E(I-4>SidV5-!9viXfQi@xmm^FH4%-<~M$TFZnL7Fcbyg?T=Yu%-0xVn^nM@k8EX*QiBj?*wy98E4OsG@TKq?D-G4?o#7egEob&wi&DrIwhwEw z!Jt5X<$x&1<;Au_4jAmH^etNcrR$VqsQvMwR?I9l5k|xD3tJpjFm%Drc?aWN-}yKo z7|dt)Hnk69o8B+(V99(*$IyR&kan6L>8#E!VLibmlzr%_zMzNu>t;Cs z7(#>y&nX2D8a1Dx2LwJYJ{=gBAc*_f_(*@KPePl7XO)(zDCS7mN5se zM#6nheICE*@OdokGmXQm4S}5kz)S#elU`W#x)MKMU%CA02<5`164#CQ9&a4$e=Q(L z$;B~XLc!2q25ZKS4C1R`zBVG%2NXPLZFH$lJ2>dl5?UMa(jl~3AE!D&y)LB=zdzTy zZ*sBQ^y7qy`q-F_Kc#mCXj24s0H8e>%1A9pGq#QmOCuWr&|440XXN_{tgA=S9JvYG zvXn2nD4L3Q5|N^o)z;f-cviY5ATlGIx;;z4gVHj^SKtZ*ZrdPb&fLOICehs}Pa5IV zo|z2LGj)8~!+(*@8r=P%zufVSElekzKW2t5ns9RvY_QgaB)uJZh(+d^y@i|JUxeJ& z4==3DkG5U+Wo-+3g!+W}E8=K>3(W8^JU7}PxuO?}0eR7*EM%E&n{AljHMT_jN%*a~ z!3gE(ZvuwEC=4cpn~dRZ%0V*tn?y`f2C0_2IfX^0RNjC87i$?&D~ z^CtMr`b%ObYNevP8NTt(#oPksw7=jU0)G}An{U#$U=POGOry*6!X1^YdrLB#u)h`8Yk`rSsaAx8*v@0vIYV4o;L&6MmWuYPwrsd>& z%V)3r((x0=RgbG)HqOU0K5Eqw$DJ!d z&SKAFtNMIA$>WfXt`u?gOOi}KSVH2pt9JO9cII>tG(JZk`}F^xXVLAv|J+O>4PuZIJN4@kqm49b~S3+xm}b+(8r)wL_M2NpBaKs`S=U{@mb z7(qLl*d`&ZSc%k^FxZ-qGr8^zJ7eBd;A{Z)P*CsWTWPto>2;mlu^HnM2_cAuA4Jid zL*SJ;Ee?gncb3p1-z+c%TM8H^C`P6jm>^k>L)cnkx{@j!u%v-o-mCyS%S?} z^G=3*lgSnwMb#ERlPa08@IAX!DkZTE<0FNm(FR{MX?LchSs3@QH;X?kxo6^CX%MbNyQr*_n5*Gd% zVj-zgN!?8l)G4(ubN96eK*6ODwv`Y9U4+JKfqk4$-aFdIvaxKyHH}Z;0yLdPvIAl? zacVE9yEOBaT72)!aGJaz2tL-qw_#t&xp*NFHAbw2Xr{G?MZhxdp<#)(X@!^8uY2hw zpEu1R@XYXkrC^VVwOoX|31}oyD21)eiTpGzI5ESw!8_$ktkH6~W`Nen0OKh(PBZTu zD_r1v!*05L{xfn;*?7HIDjqw3vn6Yv|ysZDDel$PPMsMwEN$%L>;L<68zZaza#Q;hAFrvSQjhz zD$`l_>-OCX=0XEnjBuoP6=0@?#O`XtIPLE0-PPvssT4`Oy$@)j&g&_V;r=ydQJbxPY}K&(ze}(y0gKgJ5a1UBv_2@)_)+ zKKX)wha+vP+l~n5wrjBjM~Nx>T%TZ)CO=uZJ#9_fR>_tY$zR^rJ%F2o@C1PQ6D*;c z-V4o&_r8DW6HUE*GHyjL^g12LB3KHDr^;GW=K#y16$x4*wB$>B}`z?T?4b%1V2L{yaQ`qFj&YvuxFT) zMUi*l?#PnW7yf|-YkQ`;2v%*XNX{^wf!FEvtTN4S#6Hh8Wt>)_^uhrGdZW07zYTp7 zdc~!&o=I_uiJ68d%ri+@S$q)=WlR2cc$yq zA!JgI^awgst@$yt&z!ze}bJv0gqD;gQ+2 zaZ}CAEy>NBaAm4Sl!6eo>H{Wut1{q+${aBns=lx~0=P*)>cxqf7C1J}{Z#0co~6sq z)miwc!ljr*mSq5vm+y;`->2u`Z)OD%T8_}F56YJib>!t6swji4(TsMoQ{5F8b|w9 zFMG&12hkKI=i#giTUaCZuw&cxB(hcnVu-a%eO?L2@Ts8^sL%5pBi_cg0Z3n!o6h>M zckz88MH0W;Ql08rX1r(PIphERe2i-riKki!Ndb+=es8QOe)fIfpoo8!+TJ(5cYmMX zm(m3yv`a;XYa1y4gHQF9UsuN)CAEWE1pq~T1y;I8p6HvDl{+_z54zASfH@vvXpP7= zBw>IeZTJuD{j+Qlh9`Dl1|FC-p|(j-grYUu2YXQM!-CIiu6ey#^WB>xL%kf8k@|j( zrJ#|ALcU6Xrp^yin-08zlHOBmhE#tbs15WQK0R*$b-Z4QLk^&%VN|Jg*Rs@1d{GwlAbQ4qS#BHr**5LV?*H)R(2W>m9?#SBVLH1x(-Buejq-NwayS&WmP2<+mrgH z4@mm2^prG^f6BSjF@V&uMSm^Ptg95ZOhbAqIZj}Tl1>~F#PQ0i%mrUxp3P%q1mQk5Q@G!oHJ8*5noJ+sosYKExocFM~=? z`lCemLwz^b=7?^?dO$yFn|ZoOBepJ57yo@gf{)VnJ`3aiYWH89XAaNluhyTJHU+5)Z->A z_1JaCG~qWHvfN}QzfB5?r4B<|jSw0xg_HDy(Z~s+uv7v^#5U7>jK_1X>qx%G`A58s z9R*NrRc;!?&9dCD7Ry64Wrjzg<1o_r4I_3z7) zQ&N+%lCrZ@T|+Y^A|8{o>WeW{Y`XT6_@rgvg+_UZdyxP*4%h+nlH4Tezy7%D!{Ax6 zr*-u3RgLYHrhb<#uW0(~92aGqTrORZe0DC7<**<6acdzK01U~*rW+X40=tS&Y9)hR z{)zZ@6N$oXfxTN}$?cyN_ejsn(gVO-5yM&_3I(QNrykaMn}P$k3Xk-o5J~$2jvQ%= zIFE07Tv4h!O$&)}i(MQo{}f-1RLGg8L;mSd0gmWR#`X)Rt}^20%PV;eBMxC_Wq7D8 z(!5n)mUZwyqrTN4zKD4#0?WCdd&S1$<1$$?#dSv@&UqYFYR6mpw_Yi4m%VXIUhOU$ zZDhMl2qMV;{)iT#;_0Yq@j02k_QzMXN9gfGtyHSkDD{Qa5r9tt;_ByQMsso;`aa7< z-yay4nWkFLL=!clv6e6rU)Y4g1VW)woJ)Ige0S9`Z`C{B0VZEIxvfrI##a4_j4KCf zkH8t_RwSbllg&ivuP~K#8$yCrk|ZQSAPUp)M7kmXKGLs{3qA*X2xWw_NMV?eZNCcz zs}&IJ!Y_clD_WYzilr{mbD_x3fb)RliW1?WBugv`{&2;MVq?K-anPB3KO)=$ zVJ#7cThsdLp$&6G3*y`0Iqt zEQ=?X{_HJqeTK$A*z~;*vf!YNkwONwmv%zc`Lc>UT5VX*xz9NTZ-Pz8yVH$x5} z{wr#+jMGY!NiZ3yv=KTPLRz(r*053_FcUo$JATpZVGC87y`zbq_?9NWD!*UX5pCif zOG~?3Cw9wBeCutyMe1#mn+p~D%&B5s&+4A>g0|ys*!b(A-UIoQbIY_C7@zD8u7v*v zEaR*(``A6~)>}Ky?6P`TQfF!cf3R=~H#NMolP@|L^b-{Qk~5SDkroliI2%DX=s9EF`62KqKJ? z=Zp^poz)jsM*zmzh@fPrIDGUUxOy;4R%|(goG!C7UU!D(^~| zcvJY&bZLZEsWlZ=e`3}CJ(*8hMM%xb6Lu~z{aY9J_x-=`M&NXF+Uco|2WE2qi{4Xc%G6K(=QU^rr_c^w-K_WP;GCxs*Dpmk=U`g zZAN>Bi!!-aE(?xC9(RMRwP^SRDcEnj>h~5ALkotX}=IS^o?&$K;MHh-0=(0Z1smoYI@KX0`tM$JsdKgsL)$ z)lXl@a9A06A_;(DyKP!5{4IZ$VJ%TYT%W;e8oCHO_^@!R=z{m%C zZ!X$9aa-vg)-!I=#z?YUFY=Ep_&!^P;d-R;$ZodH&9%>GcpIt=uYX(hZCt}DgpjkV zKu$%*G=Jm4iwloBE`y{Wh_|uAc>A2Wo26$}Vs zicJCthFTAH*)ws+?_}chUO?g)pKepIOdLIt{RTK%^)f<5n7FeYTeR}g8=HUMc5+g6 z$>5~P)h|ve{?mH?$0n~Hv3Fr!#&L}qH-zwvoCH0Esf7!n1;XN?e34c-$gta6%=BKb zKV)$S+@Bucx7)qVctINBjBu6-1MJ~cD16EwzIHD{`SO8<6w&@`cRc{a3wk#g8a8OL zz`no##_PH7#EoG)5p@xP^EwPMs$yS^vZrpz%5GIhTZvT-|3ukKQx#4n%8Qhcu}_gi zt<6R%MU|?PfT%VRpT{OI5!i_bm#~QEVjgU~@Ml99witZ=3KVUKY=5)!%Ke|e3tvLf zM-e_{h@!-8?%=Jrd0y{lm+rSaI-&A@<^2tx|J$f>u~*sThSv2fL7xJ&$`2oXhz0s% zaX`R-5J0n~0`vT(*8la~W^rS%MNnOs5+NRi>V3>6d++X6akQz;?-TbY*T^iJFYr13 z(MYZqvnPJ28K&_&UVUM81Q5DR(6hP!^peuCBf_Kue-jAJ$g-&zfeYS~rTm+xJsUh( z#j<)&R+-k=#A|O`V-})8;cq4arwN?Y_Hg-U@KOqryBeB zOL(E*wwuC7^O-hXJK z_WV1&%rNX@LSVPtSW4AU2arTCB6=x{>&(Jy+z=KUm5 zS`r`bHYIl*>f!5iWBXBy)7tBcW2H-)2e!TH-B7Am8R&iv)>Qs2;J?01(N22Szi@zQ zFmyBYxNioxR`cPw~ z+b%d6R*gtvrrAdCrnlspg(2DD(+FTH!jY9=1}VYJea8BVfBIGTeSm-cV~*5DOccuu zH*z{P^!jQ7-Unc{V6ZLwZ^Gs4E8=RO0)X=+0*k9o8K@W6Gw#GfutF^$8(;OBA$i}*3LG~dC9QvJ;v7ey4I9d4u-{q(tP_b2At4s|!J}=la*rQo zXf$(Ote0XW+jK?I;A{l@K98kZtJ_wj(2hTxUoU{&_*jJuYk|mYab6_lg1}t#pB%|z zza0*v87H=ua1R&cyuqSp@Xa{w#W~w8*WzrG zi7Y8K2`3!5WFsvp7o8<@082?4sBUikfQM&>l7`~NVzViszte?<{!86#ug&{?JMtdkD-dKn!(hdz8BMh2K$6z*`gB_?%frSL4ExW43zDnlD z+d;s=nKiN_&vR6WPin)&lXoX0;^Gi2EAY5>Ei);@lA4kbcOzfD)~h)Z>^qEdCYVr~ zv~RMmH{FGDSW}JTSFD&+84)8iD~>qT>@^kMy4f`1*L+X5?3axAjGx`Y&$fPm<-a388h$YI;EDeTVDWc;0{ixQ)_yr5DVHV0r6nY#^2HTDm03ZVYV;i%s)9ri z|M+bSwqV#d%!$B_?Up5nU0;mT49a-}k-SCSBKXCCZ_VMGDz~oqh<^#juOhgCg@tY; zh>D^cAoIuv1*}!kmtNGW#p)1w#L z)H~cn_YNod4HaHIZQE-Rp%nijd$L1dpGoU|AFe{fet)LHH#E2{E-yJFt-k{w9vTOl z4D!~LGWZzf+3gtWhYD5m-;6*dOG`uE4!Ru^*mWZwfwOuhWhZ*XMn4<08ukSRMk10T)792fVzjDVb80A(HQjO_f{D z?8*>FI$IAbFbNv)!9AD!)`@~@b5agi;YD?aoh zB!qy{b9cvmbW8i}`@^z8B~4gOCxD)p^xuSu z*x@~`AAi9+0qi>AC9tzqSDoppiT|T~iDVq2-Nf42slWUmXoh?9RY9$YU z+i8j@A;-AljkS&?P5zU(QGxjX05rTwyh7!~TLiTU+WYawK>$&uf)BfVKP&fzfFx88 zf%8F($oEA2Qfd=@YU{i=d%&3vwF$o2p``nM5EQP7Wb4|s^T%@aLw8-3fZm%x^0wtRUIF)Vjf3Z!YHD{Xu zVoyU*n7aUq3fZ}FEHRO>^ew^j2BVAt`TDu6%w+or(nu|3aV+uxBPZVKpoVnHMC0y~7A9Ni=VAQ(_2_q!58tuQ$ zW7D?BuIk-xzh#?ra?!n|`^~D-jXz=!pGJ;{1C*Fj1>h=2;A{YWA{K`$00=${5yd%U zW>Vicle&JR!X+wfH6AEiGrLoD=k>0AX?@5xBM@Gmjtc&5#j_{ktL|Lyvg}4s{8Gr` z^uIM1pZ->5anwfYKb_x`l35W59eV}jRG!x1Q++Yj)eR&d;^~#MD2i_Ybgw*Hmy#W8 zq#{hESYq@W1rMS+(<^!P%$&?rPxjvO>RZxp*`?iA6v6rH{}kNMlId$(9mTnuYqEv5{0bFqQ7AAq%?ZU*Cp zm%~K`0E5m!*yS{mJV65sBSxR?<0glHu5**~VK zpFWaG#~jZ$y9ev?4Vz~*umLovPCV4=IEA!SHdHQkTtG}e5N~6_<*=oy%FSZw{c)6| zDtl7XA9Ri~0t{_Pxnk?XHQvHuUBKpEe6Q#P07p-$`7~EzRwkd?XE7|j{`2U?yr!t4 zID%IhfQSzby9cg_GJgyu0D5~B@s_vGHWT?O}#; zF1GEwcVBE_f3$1(>M?;|zhZQqvrgWdp$Itk!)4Z=_IiA0lqqL@kol4MIoLf6M%5BOhffU^&&OKI>0t!` zX%%Seg~mQfgL}21*^-YmlzsLH4{C>nM;~uT&BNj+Wgs^UaS|9Ir?mMrLfER0)Ex1x zJiOGzFVD)bSXccw{t})QfK*Gpf)W#T{INQknfMO^2>ua*zOoX(HsScnCk!HRM8Sjj zI8i5@@V;$&DlG}m!z-h~Wd&2ysp@OYuw(CcMNyRz9|)Dw`UB3<-S+Eka8eVgALcm} zYO{HT$s`JP7G@XPty}AYdlDKNFOCqJSAKk6T-UI^c+O)TU$1a(3E(=W2Hqv)R;5Z-rh)zVM^owEI*asWO{)&x5|3C6-%V+bu^rjQs zMj#nR%Nknn+w4kp+_$L<$s5Q5ZJ}^t3O7sZ14JB%D3autTL3V+Q^fkVgi)Am6idXv zS$TK(L8`#c6&mkYY3Gq^fL*ZN!oi}cu9oZXYpyh5Wy$gas9N7MIVvO_H>08pGKLg&KjR~(OPaqM6=m|XG9zrfwp)rY5wpeh z_ET)8X$`h7a)j0=?BNDS9WOaG!3#%i5r#g+E-7fpX!guCe@W8X(4RMsEq~Dm|ZzZ_C zZIvaQTRkkrM>tVK=^*e0trX+)8mpoJyB|Bp}|h5s$$0X>olqh|_M3FPW$~Hi}NQdYWo?Wi`zb zGo>Ym{03=)M2~H!eA^Y<==SV_lY*mGx+FL9jn}(BW;);hu~sDPFaUYp2fR?!&({HU zBc8MHI}zEb*RXHTKUdMDMF~GP*(jnD*$~Iw#9b{^H$O=F!LKhR4Mec%LEtgcs}tu9 zd}^3DM-mVf(qjbxOAOE|n5m>C4TShC^^A@UAVFGv7o|CPCnGd~;wMz+buG^y^@Jx@ zG1v62IJTYf#lRKkb$l;O4-=d^T5H7O%q&y2JbuCU-KpRW?iFB3RqODX=r1eV;@ampgx>a|~Usk5K z88ik`;Qhj|wyZknL8r5=VsC41zO8M_`q)qatVDgCZ$Qj~E_p@nVY%KA5DL`&4(RKiM7J3#ZDWX_({B zffFUwy6jE|<&zIuYubzJ^_M2bLJ29r*j0D04c%`+HcloFqmc64BAAjXbyT+0&{Hr^Uyo%&v*eUa8>?TjxwDsFIf0xr`d8f+1GP#Ikbgy2kN zbqtXpMiHOKegx36`#0q0hu?f%;sitwPvn(i`KJ42NlB^f6y4MssrTBLpENlY5PTO; zM1q*t^Li`bqfb4lR{+E*1tEU-02rFKdGNk1{i>c@netjA0(pqFP_0d`hDNESqeDKp zvZ|KSW&j(dWt27w{#}?YTG^=4&gc;{C+S$>@*dH?rHfZ~@KpBQ^IVW8P2Ey(Jrbgy za}M*lMQq?p3k9uf@Vg@XGey|*Yj;^=26$ZPS~M$GxfnTSzfbXNZM~R{PEfb|ZWVO; zv5`{7%F4(wHt(E+V(grzjeG)^%9 zyWTL0ZZV-kzCtRsPRohXbHaQnLUsC;0)Xz`8uraUEH@)AD{EkSCQIZ=X!zt*@0v^0 zUh>U9Zw4~yWn9|Who8alEPlo6F|@t|_#K|>7Jhx_!JR3w4tY}mGz`SZeqize9wyM>n+js2X;J&O~oQM`;Wy*THF`v$w>34Qhht-=kx#_gBS zXY@l9KUE@RJs8%OR16xfE>+JIxWOmRWDmsKkKplH)n^e&gIGo)DH?U8XezmT7Ni`H zXg+K2txEJ*C7R$t1yOu?Ovx!V-@AvI=kKc8waiBQfXioDwL@_ibF(cxVPs~X=auS%=BgGKo)ZX&7)AUwRso>G>cYqbi8IBg4}wZactMH#&_fzF1&DYf=}Ub~g_iMZpno6leHP5|3|n`+qmHSb4_ zAH~}$bp_&u4MZeZ)wA|b#?K^iDd_^>G+*(lV4yGZ z^8hd$p(c~csh)b>>jXr6JRl@b;6-ZOeU_D*n%*-7ohKQQtq5W}BD)~6j0)?v(7W&B zz7E;#y+L^RbVkUEZ-irfmvNgwi4gFpy(G%(bX4g%zcA={ca|RdG}m^uW?9lwhwk6h zNPkz-1eerw$8|W>pR~Fo^p3a7)j_yDLvu9M8@sxRqTTy&=S$uTJ)d~DKUbJP7w1UZ zUxItqPYoK+zjW&L%|`g*SrU^@beka%i>#0Jc}}hWvqelKAj&D?ZOqGwzC0^ELzDed zi(DKoXC>+Sr)~AbNg@8?5vVBGN}!?~H|wgMdHC{$7Q+H?9@z`$k?+7x_|tKs?z7rI z&EZ_ez5`%HnPa9jrx%+B52+fmOvtM>)_MxV6tS)h2Lz;SJtR^%Ev@M#TsqK55#+bS zE(V_W%2jxFNndYZ-u{d7AT>gRg1_Ekc%`*Db4?q`t5^0@x7;pnCm( zh4lZ^GqOD_EH^Pe6`DR7EGaE9i+c>C`!hKqwhPH9FLVrC#1#DCUdHfCwZ|V4$tWkn zCDVK+rAE6BK<@wwc*$5GIJmw0p)J#Jk=qf~Cg2%iS`7wsSUo!`?xsqFHYn4ArI4{7 zYyudrAj0D2KrP!#x(%g~2~g!r!=05Q3N>l3T*C!rzQ50Ba56X*O6Bl~aKO4^gOnpW zsdyuUWeg3fo;kndz+qhz?fTjR2T;o;m-UkIcByDBL>0Ay9eb7}JL(S=^Egj*MU|Mks-ipR!^N z_tlGv+!lDOnE+%*1zcLGT1rPHvX$H?d? z7Y0#@+?+t2Yr+7>v-BicqfQ`$^*MuYGh79StNR8Yu$8Btk-jTxHQS`|?mM6_XwVrg zC!5j>O@&q*He90ce&5-%t7peoPQh+<6A2|CP-jlu%|@!`Fmau&nQG~R^%z@{^Zs_% z8ArK|CZUST&DP>*)3zXe@^a@)jWA1iPR~y{|Je)+MfTyC9LzOM#8rh zwjMxRpr{XH|IBopfYBzMo5b8>V1Z(}py8@<->S3%aO|6jd~MOI>I8B*l!Jd&BZ5PCd3Y( zv+2igDNYS*)f>I2DvRZ2Ck@KxBOD)t)~BFNQCu4mCCry%`yKY)nCGi=9qJKr3!*ie zC;24&8v~Uo0959Z-!iXCC z9uM@w-YmdlV!)~PY?gSz!xbPIc8arc$tb+Ws6u@GmFYSYD-uoyw#C465M+KJhMtpo z?jPyMs`+zGxQ%sa@$h2_VQW8!|3WEvcjHQ%!51@e|JIm8pL>7N9Suwt;rvC2^6_Y9 z5$3+GO%yjV60$=)f6W4yHDe~~wbE_|@An~z&;ug17Z}&eU*^LJQOWE2@9d3Q^&=)| z@9;fCKF(2w>5FF9|0)%lBB=a1Kv-X#s$j7+JRvb(i zXoRf)VwYuLzwqXSE*%e|zz9PUK9D!B4~ypX6h?b)UG?VPe`+30Y#}!jChQLM?;SMb z@ZMVS>5K?Zwl!z^xf1^zHe+M_K$}wOEscX6+Rze%kLaIwKt~>djxcimLmuX!k>-#? zwk#Ew{&YraEsNIvQ#&wuRAi1rS`^FRJ_s&Hw`L|<-CchE`!=VEr91rsjXx z|H}V6V3y~f02ZVn|Hc~QNYbI<<<|w#VSUm3&LWymo4w z;PRy^cOBR~xag{@6qYfX^mMO)1i*w6AmPv|z(FgVT$4HDf%^g5kOCzmi}tbQVVD0{ zB6R&2AXS!50=|JI7onoJeu%e};<0vqR$MB?*gccTG#DZfZY~r>aI_265~7(1ysig& zw_JO7)Gy726s`)wmmP!&h^}$QLd+N1e^sFKFdU4qZiL&eYteHvtrLSHJ9_fym+GwMkEnqvk(cUX0RzzVrb1d z$M8;VvW62L+D-IiJSqAVZ-cr&+tjqF=@~uQG`G8#H8LTm=#aw(?57@Tu|rD8mZbiF=sf(f3qX zEizrr!0$8!LfaHg=A%9cn{B1(*NW_Z{p%Jh}!@B+tyZX2e<#ECxz6{65S zJ&tu7Yd08vuml@f3_d-;}8bk~}1 zr-(>{G@P`7C11Ibbd5pXnO_{mz%gz+f*pRylJ&0bE^V0tSK{LD(!>GK8Hepbxp+Wg z)3@NBWq08qR+x%S{8VTYa~FY_T(vK-cQfvA4HzcpI_{aKU2NyXnY!J&F+Kxe^?Ed# zJ7M{It^Jba{%t?7Icn!*I0oY~8HVE;Av;p|o`uXSz;#2U-$1KGw<9p)7<4@TvL!UK zxY(DjU9O590$kCQrrwQmZE-1|xDL9i#dAp(ov`*BJGYhanP?4?U+c%DEpFVB1O;V% z@1KQG0gH7~ieTZ?wSuWssRDkY;^yt}CDg)y?QkA{!8-x`;bPe9z>*P?(ODU{tLv%}b z{4QJo!KSn`<^+}cbOw#r3mQYUVR?V}v1N;LmTg)FMQc_`N^-bYiv1)@revsGXyVI- zV-@0Q>k=%V`%Chb|Hs$6z(rNO@xya=_v{5&*u%04g1X!kyuiAk;$pg76;wn(MAJY~ zGjEZ3%gmO=yQp}}GBZ=VnVOnXnk8P!Yluo{Wo2ecR4~Gm5epOmxQlE$u;-K~p)kOw10I985 zq>IQI7C4Lz5Gq^2mR7ScqX>I#*w$}}F+Pdw;_V-PSkW?Ks7CCWqUI4ps-rEF%Tm;V zH{mlyWeS!xU%{Zp`4SsU`d{&s7lHH_A$T1KFn~9((Za|`Gk(_y| zD6WX56^()XflygArQX}ch@TWS(WiI2$?Mx?M&K|aTVt2(n^ z6_=cL$cMZ%BL^G(Jsm3wD+2SPierqYSn<31HWCA7Qd)s?{RAvWBxT@0=_WX zf`vX*5{6_gPSjhr`G^*mF(*a(%rqFv1sa5X$`*PsC@piHWhOLvjAYm~aF3Cz-IXj# zQ>cuo#JR6Nr>jrw*h#Ji+0_MnNUz=p?PI8~MP|5^D)FLf7U|%`Z$|iItGRJ^aHC;y zp*Zmq5ni%-npk8G*bPNuH&B7pg{TB?w6;_)-e}ZV#ry_82*7I*cDs}Ayz^d4+F%$D zWwHtVsC+mQ)t{{b47FO)R8@w@F<8#!{M*wK{T(Du z*K3hNmPpK3$4W)U`3;*^>0j|9=l#huUo}lPR%zU(T;0UrpsE+?^+`uFq$S@T^lsS< z5LuSHsCfuX;V-?Z3d@NI)h2flhQQp#81eOs$1(E0!#^?f)dzhj?BGJYi$!8UV5M_g zNpOi`?O4s7AZB zh5Dpgt>2*!wR)gGz;793R}Dh__zZaE8=N)}{tqY6Dl3GbsBKJ+C2}h?sN3~l zRJ+Lghmi1`ffs^R&MkjxRX}_eq&O`<2XIk)X>}Xl61DeNE;#C|@0Y&0n++~UmY{$BqLr6cn;OgLDXv9z{*n8fPf(B4+wM`9+M$)gVz`(^OxlA{|tXq7^x zsz`Q+H-0$d4-ty*`HFAM&?F&LfbcQDDsy)jSy2tw|&zf^f;5p|-{jYgY(yGq> zt(Uu4Yt|oY(9aqjU#Z(netO?uwx>Z0Hyl?oNVjxye{He2eGRL~2>w&ZaD#ac#5xTz zWu`L=rCa9X>XwPyv;=KA39TruYHEt2`~Nz}|A6)V{4`@-rMGE)W(9Vpwl zwE}=2L*_Pm4-;^=QrE@&N5!#7ezu%QU6znjSspn)M7zXzXKiiWP6YOTt@ajmM)2c7Rc{im!D553Uxc_vDai@`LXCW`-OZY?2xiQ~th z7wx+O+5is&CuKnY4U=|9lKDUkVdXd+ zz(HS_Pj$Cn+El+Z?1rsJwC|39Z*0YXA-dUt{8ZqyCOicL64GOioQrl(S3H4;#JzM{y$f!f& zbXKsH3Ry<}X0+qxz-8C|)TEx8$2_3ZHh8n43!8sXI!wN%3n%)((gk4?X6mHg!T`-e zt3O2L&d66Zh_ofPhPgxj=&@5?nEJxYZ2Gj((_h4VMRrt|b)^|D&#Za(@NYKp$d59K zKlTF%%l(lU;uWN7t|lP*fqXMdFM)E?6KInEKO`0_R^r{dA+sYL?mpK0zI~{(aI>V0|&ak<9cWJh~84Ww<`Wg{wBS+qkcvXY><9$H`e3XUkXIG znMXAP<6Zypw$*DDP_$p&%z=RJ$E!|Ua60s(y#oN}kX}0?B%xl+kR9;Nw zK6Ct*h|faw{g>)idVUlUP#U(ow`*6Lm~ESD-4LBd7)W9>WHoqhyQZ1vH}I&1XS(67 z*46=laY(EN>fv;}Bp$9V0Ar*V^S-Dq9=)@5hDiE5ka!w(8p5HAnY+9wbgr zuJ(^Nu3?3O{bySxEXV)ogWV1_5tnHZq0?YOX4MazaxOWu^d|TZ0$8^$1bUaXSxMWW z`iegvBn078FvU6r z>fmil0KsJnPxft{uP`8#k9OYYh%D>)2JcHYHp6Xf=i1I0{l}T<*G~J!m(POc>?z zO)cqkTi)-DCqHGr-4`y=S9K{KRo{QaCmvr87{5Cq%ws=ue&yV<5)Sdy&wJIM*QzN{ zvYYLeM`UFfc3q{6A}&+x9tuuxqNu*^4W6@uKg@26fXO&eKNnLj9=L6d_drbJ3jLl5 zLOFw^9kFMLNmPM16e1$>7_`Am{7vjH{%aaa%J!si-ZEEqWPqOvczLeO|4+L#@>b`a zjsO-OK@&7-25^OQY)%uPdkZC=Tv-b^8ZF>~#OZG-WAex|w_^@p=76|}T=i?Xv;jk? za0Wz{gIVEBz+10VscT46sT5J_NF^Ys_(q799RWsJpoht@QsPd};IE7i8SW8pU>VD< z)fr5+w#$A7@g0e|_~%9V5mv6)j3Op1!|5GD_QFq>J0!BC72@C#nuOx67KT7EAsYP! zy|$z6?*JUwMXiQ3U?+}XU8xMKu5$6FT5nFh0P6uiYylL$VV0^5#)1_a5CL&SwQH?uFAxn&l4n}Dd9FE{|O>8OH@ zsS(BqLxv8{ij(0z0kDuEQ;AG2ug(_&@{f46#5#{;gybVaL_`P&|3K#nL-LMz3D0(` zBCQ1RM`juiaf@qPIooT>w8D9%E`HIJIFg@CikqJ>I$a@!X@m!2U|E4!YdSw%5ig_* zR;I=R6~Pjn6{T)B|sp;bwbs5*SuZ{#<)CxB_kuau(6kf=Z=p`)@}p|vc$(vw++zwAp0^7#{!VX;aC3_@n5!vDaNE;@cvARLIBSPn z#esVp#&~NCI!&kru`Hm=j_r02#`OineR3=casw%(CA6%4h=ao*A+y=|KWx$tj`K?Z zFC7P)X?1BzI>^A%fEVB$dm3_G&1|OEB{q7kWYEG*Qx+075>gyy904XN2kxL+ZW>gi zoUhERv*0*xg?_}dmsm{w<|;#u$xz7HwO`?JkJ)9jOU-d%u* zxrp&C$D2D4eJwe^)XbX*fPQQ_j?tt32Eq|~l85wC^Ap)Ub|**Kp29r^h1=q3#Sp!8 zF}xeNv*jkZzEE7bq{Mzl_O|&WB2O4PrH_Ya1vk~=K%Ypt9}-sLp(jYltvH_^5o!Ff z#&_i#)<^(L2`Cd!atMaF!V`ISd{VVL`9ji)ifzT_fl|977ri3BKJ5t=5q1el9wvX# za~V0%Z*IEb055)vh57jXiSYX|UQCE%|LdND({=+0KK*WNg6K2h`xQ4<9#J{>j~7ow zk0Z3tA`vAyKYv|?$kd4LNWmS0Y(Lo%>~UhCmqw8~q2{S)4?=#7 z;X<6^;{`-=8{qmL;itP}$S-*7qylb|2B`nS*Cb=`pxoqviSfv$I@70`(>I(T9Jn!u z1UN=!Ej+-EPDfZuMsX=AETzKsRYm&(i#nr*tRNr7EsxJE%O)2+`esX)uons3DQF|l*D!Y1G!9452oe@cF*bHRk zQZBuOv8Pa|7jDe)jwfGt-uwKjh+(#C0i#nCZG`#4sQW$?=hN>ziyRM_sZ@&Soj!$5 zOXBz=+AEp0ewj{Tj@2~61koNGVE7C(>6e(YmBrmtY9mQ;n#);<&{YODhN77H$?TNc zlxz0dGk7DsfARek z)sTNQwj!VZ2tT7>7kzOVT7Sq5YxSpA8`KCn$lzargKma{Kd#rpfk~;`tAyN%L}l4U zTrfn~y8UkA{#&aOhw0K{u!Eg%BhO}S{r4v9>tq=-!@dvU|AhQ{&q&_*gn@9Y*xBap zzXFe%xog};0CcB9J{yh8D0)IGTcXFGbj8i`(VESp@2V$81lUI0RgSp(j7JN4D!G~@ zG`#k&QE@`ZEB!v*(Cumf{X#s@SGGUF5UpPvxKN#fJ=&FwxVy-ndH2%uEz2D$!@|F7 z?nX25%4Dp-_W_|GD&gPRAs8-)w#SK~jzQ`07@3uF(1U9tQ}}{2KqPSLg#&o?NwA-Ty_`i%;R)Y!zDlr?vWL5+U~0=h+iSnSUEW?}MM3 zQB~MBRF^lu;&(hoBk-1J{E&dCO^~0*dY*#Qzk(KuM2sy$0h!{jDAr7{kuPG1;-Yh93f8Iu{kZm8 zx-cq;BuShcae?PoIXR9y-DPs>J&x4K|AbnvmTx{0$p;R(BRxlR9pUEGK5iyU0MpN_ zP>H%+a%3*tiNwSv?`?>IcPg4*(;csvJLiOt{VAv`;#rxY>EgdEQKSPFR*RHhfi64! zJWlNRUM9lv$Agt#yK_F3NnX}QM#$0!E+^UIEP<205IYr)MLM96ncTH8Su@26oGgn5&!Hj zTrkczu&W*+_kLN_$A8Ug4SNx}kWMg8g^;8Zi>o!&tM2aA;#B5h1h)OPTBrwqpGHBN z#Ag)6YkTq_Ww!0Pie0r4qcZ|>pKg!-VxaOq@W>p0OQ@+C>5oTn;6Dh!T#4oRKd#ad zJps~+;E4Q{i)bZq$-dKf(fsjiW8z!($VAGd2B%`Y9Pv1~NbB3xIlFtA?b@|>BcDp_ zt^jBXaLYaT4Jym2Qy1PT->^mkD6LfBt$v+0I13UJVcm1oFYHL10y5>9W}T;_dt=J= zPWm(Z+Dqd<<^GVkR{RtO9OC!QHT{N4HW6w>fNlAP1H1|#q4VK%ata@pU`{|ZoW#6V zov8pVl1nS`k}ZJY;YGT7`3}6+U2f3c$Q2oK2m?0*yQG_)S<}^{*bH|_(hCn->)QK` z>nWvwC?*Ga${{J+qKt*goJNvgLIoZ@W$n|Z8xAm_3alM>!HZMEfT8KaaWl=(27)J& zcfN0Ggjz3i$OSf&`^>OYE+HRKRVH`nx7`*7Dv!C2v3!c#H>Ln;<#8gM2Ay+3=rI`3 z#1kQ78$eEeFUJ3wS#~3zPca1W44bcHYin|$!CIpc)&^RUsU-}=?Aa;|N9rF14;z_f z`QIfw3fw0Ot0{XA(uOLuKeHb5c#@ZH>u(0Qekxm_|pjpSTBK`|OD6rg-EjFp%}p^db2fq;ccMcCG({;Us0 zFx!HNf+>yMEqbB^20RLR_mSf4Aa=k(p%_UCCC1r$QLGay=33S!i=36JyaRj}~=L?n9 zaMqg*4bql~7cDoe>MC!SE=Y0pO8mjfQsaR2ih@ht!H|G`?1Z38iH7YmD+)t zi8m&EWc=<_{E$J4txU8F-Meug8Scy;s6mj@9VM(Ocz3z2T4goQldww>CkjKM(Q%U_w@|!otoVIH7+gd81-fo2%JueHRl7uG;$v%rW+M(TK7ghg-hgJ5Fv;F(H;_Hm2{n`#KdzCFjFazAs z+{qNFm=`#gG##+dn{GJ35S@}qry5AA7RrG=kxTVpMYy27QxUizAf>v#psQJA8eoBWSBW}fLDs2-*d~04O1Au)d?de^o&jlZ@5YGz^lV>V@qTD>y z8>7#g-Js!lgLcxx*jz7o{7KC@NZ`o3-7 zca#MUePujb-M+iH-p3SYo>}pZ+9s7VoBKC!bl$(x$)H+>6VGkpNu_vtZflz>LokO{ zsI6jlS)6r6QkV(*>z2V6a2-N{<&5wKd?cCm~hbOBO>e&7?HaI?PHpF zg@rT$5$nh|vkK_dL_f$K$}*v$%jE(58v!P;V#bBD`dM?NBa_=G6n>5{5cdA=U=3+gj2z1l`G`q6Ir5Q8^xH9d2ne+&YQ$kVLk)P}XW31CU+zQ% zK-DZqe!)dJjOqK>FK}R6d9N5pxxq+Of98c;^e3iI)+Z-__m(@w%war45F!NOs6^1% zs>Fww$|H{h>N*l5tQQ?k<+AnHPWjfrjx*W)$IflKZI~11mveZ6zR#s9=a>JKgaZJkYV_S9^mK-_u32M}VqHxHLds35Ns z)r)=Abi)Dq7?e!8?#WO&BGLr@iH!yTqnb|x1};E*&vU|vnmx=3x7CPY|usfZiM5K%@*X-a+Ow#Ib(?u43FQ-*tIn7m(~^jqTGITnOJ8YB5r z{G-=vUmqhVDEbi(e#9vHHU&RYOuq{qY^YaSw$(g7t0|n@~jvNav6E1b~tRDQyr4(y!-~lMRT~ zQW->=_u3P>N-~%w?U_G(d)Xn1c`edcy-JFSpdMP<9~_r!*OexPOmFD&?a)UmtcV zCmva%khq0$a-+rogW&tE5o8wr9Ia7tMb8x_7>Z_E)uF!aj2~E_9DLBj>+PqO;&sIQ zmq1AsV2TU4$TJW4E~7{Izwt{40Qwk}?6FIFY=%8V8$Z5d@J2qd!)|k)FiT|UL!MmH zjs4uurngXieW6{UYk0A4tG$ zkZyZ}t)-wSv$YM6TG%>5K*ZKk2LP@iovUGST#*ENBwW5vggL{=mA_1Zo|`A%)j7T> zGwlzTbULH9GWEyO1X!^@QRx;d1D*!lBciN}Pc!A!GA&N8@hG7s%E;f$rUU5Z+PL(- zypFUD=giRK3hKefJhRe&JvP<5;q9;t)6jD*btB}gtcAikj#DPkc#NtdEA&RmiLPPmD}rVg&;ld6xXHi8g0|<}?0d1@hDB^HNzC*W2@d&oqez z4+rw7z84hg+oNkH4qu#s<4kh^skr{(DN6C0Qyw^felWq^*75VG@%qC?exg}T-nl~5 z6g7%P7vn$^F0kP)yLaD-MEL*rk2oTRcmvQ{(vQID=`cK%EAwCB4r`=4G%9N(fb#^@ zbjr`;|KXH>2&1EDik*lc$XpGK`ZlLh%m7dIqn&&RbI?Ml`IMh_^0a;sSrP@jlp-Rz z$rnk1I4_(O^?B^(X9q@OoIA8p*v)g*e(6H50vOdL9Orv@m;yXiHz@|m_AIXX#k>s+ z)G7GoTS88E?U8SpjLUJ?aXViU3_?x}WfR@WaZP-mUNJ2jA`l>s6v zs-)Nr=9cy&be}(^`Fj%;PU-|9C7PcD$S^ow$#QGra8Kh$0{M+4##tB4jKQ$cTF}K~a{l zmx~$TGvPTdW-ybZ29M038&KQ83CUdsrFRBnk@0lg%n;v^rW~DO@st0$N~j>LbAeT! z?d}41Q!N@BPvM5w3i)}gL!y%X>iX4?EZYUxDU(vL6 z&)P2E^NvsiY)g-%p*59?5Umal;NoSK@mKzGk*kTn%Br*wf&7a|h1oZRT^X`Bze+}? z5o8&m_HherFt;>6(VNbIMV>xr)79Miji-qW-AzZnB``@zp@t>I%F7r8+q%A#8-hgj zVV~gwzL&B9RsVqN|B46y4i2n?nTDxHgPpTm0LbZyc+Z5V1H<=%(DVd0u#ax0q2Am`Y@5b3qgkCA_(Tzr~}L20lYT#3}Og*i8T- z#G&{9#7ZEt8(|_N$MCqN?dXfac}M8J~`9u~<1qjzp zB>7d=&?903f2>jdu;T{-B&R4_u_?8eHz&4IQ|vh>y?Y(O6R*GYNAuCtGgRyS(^Ugp zIhv!i4HGDvcCI`7qvF5-C5|$@$uP&EA+r~2gN+Tw9%`$3QcOgEgT#8%Y~@{AdD}KB zbY_aSs>HCvjUrkLU;Tud+U=O7>jcsrNMf@Ra6A z56UJ6E~GTQ$bLFsLAbQ)gB6>WxYj8igy|*&f)c0DClz2_a8t)F53X}*?$){L%;MvP zLmRX@&&q%WE!&t2z{%EvoXpcNC;}$rHat(*h$rOdv48^HJ|^Qwr-3%5Df}Wi16?eGn?B7wuA0)oh+*%A^;Fq zLzKod5i3(j+57mIrVTM1d^dr24KvE001-A72xM+)m(k2@;|1JsZl?|a7qtM2uKzjx z|79p1z>xDU67PZKHH}_#qYV@(sNRjUNRtFn;27}MY|Ptz!zCB~mCTG*O^cb4*dpH{ zEOBh0%ncNL1erc(;$ky5amY8c8w9c551CnmRT)X2O8lUazgFII#OicFS*ZX0`EbX3 z+o|kPBuvzhucB;6nyYWRFA%EF%v1To?ZSdKHL;atdiHY$c@V0$wo|*Y#m3O=Wy%%$ zXW#L%9<*lv81C&MDEk{Mrcd?L?cx14r(TCer7ht**q7y{!M|qCH*Fs3Y-SjH_=ivT zppOdwsKZSm)-E9WpB}-hgpN>2K-429I{@$qsdG(WXNla$f2WL~Od3(`1_8qc&bA8P zckaMJVF=vEYa(e4GLoPO{Ubs_!$Pn3{NmJu{rf^CI`LLneftQpuA=NBmQysY$bz#a z)&OsNIW{Rq3#amDJMq0mI}{`mY+zb5r!B*s82p~d&=2J2u`>YD)#|*HwK#fj9meN9 z9{^Adm=l@Q^htO0VRybm;Fm3iSq3_FzpUp{8wiy+6^;cAw_)}A=?5=DDgxJ=oiE$@ zIdnI(P0E%$H^6T-KkeqrBf{)A7$m4E6|bOwG&dw`l>0758UZAxD?Qoe+RNVC6L_oB za3`MOvOwld`AYrvq6c_tCnRzayDR~iq%Mq5Om6t8_NSv6mz=v@1-t&XT|2C-7_%@t zN9dqJ)DF@B6u(HUHYRb!zji-&_8SncsvDS(P4~Ci!@6`@D}HeKgvDB25fHUC^7GjCA&{=#ncXc*c&?Kb8J?7j z3bJn~mm2!H2hVNzgPukL%Nm9(D%15NJh`FCom1$x>XpKTG2EX;!_bfy#|Qz@FOIm~ zXGQqtrTcVgLR@sG!1u?B@7P@Zowm9A2A=iO9a^5n8W812AMf%~Yf2Jdk&LI7-q$Op zFWu}Zdua>=axj1cHjt8gcF+IT;WF_C8oOT?w4H?hi;Vzd7YTV$bhO9KzrFsZi8?$(vPelRD|&(}!aLIur4xOdkp1p>Lto zUMfmlfQbCf`9?YJ;x`GiBa7RSlk@>s8-@-ye0<5LtUHt9{%GWZkpr? zATkTmn;tbiy21V^9jn^741BN#5(=8ze`Ba%A;9>F1k;bNzP{L`UK(8!9XRkpXXh4S zOsic0`!k!FQi&F^f;f8W`U1Vrx)`DR4$Q?mJ62B!-} zwL|c{J7q?q;DxNFW*+D{(OK*6tnIP-{q!NkH0PRd^RmQrV|vZX+Vqi7xjjOWH9XDVgyM^O(4vWN`4c3jz;Gw!~B+TM1yM=D*=hwkJH zwgG2{v-pA6d@09Zxejg0b}Ohb|0Cjrn=oE+;$HU3Qb^n(Cu z2 zA<=<~1vujG@MC;!WRpuj+9|T86KN~+fCDmdr)ef5x$Bp(OlRb(odQ?0%6+$W-(Y<{ zKWDBVZvv~Ckzqp`QK1Q*GuOAU`Ataw?VPld;%@@^W~Oi|p`bemp#xL0FvOq|#SbmL z35c3wc41Q|y~RRqmEoK8IW~^RiyY3PiAB#9K3gj*es3UfqDSbOPt>|c2z3P=g!>f_ z>Y3Ua22Z^A^ZW;4HENz_ljhoL7^y2zR09|Wt2GY|VSxy1H(qBZvxO=@hiR1aFtC|&diF5dYT0^uY=$hmHr&H2E%3LyT203H@$OV_GSKCO;K zjsc1DvH`h#DsQDUxB7jS%Kwm$ay0UC2!I!L0D?M|kJ4?o&u3nL1~v)LVn~xfs(^Q< zw!X?3PixyK#vQ!bq#aBLr)y+Kq7r>C@lOYOF_tdCltfB9awBiWBWhND`HcYRE(!T1 zn{c^Zmyz^?8TQAr;||n8$>=$ka=MgjU72Nd1HOoRH|TMhK{)@W9XlmiKXga%)8R?j zZXn4d%bSUCs@G(StdRgFFTjERsymr+*-f5vX{)x0m^ChF`VOp88CH=G`E{m9IhrL+ zP8>N3^CmjCT=kuK`JLrsg=u30;}xUN8sKQI>ZGN@5Gl+Fp%KJaNQChqlFZaw=xe;@ zyd{3;H@GJNagj>NzH@Q6Pb`D4pkt8Fg$t7xFf8~1)RFDOrc$&_s0$q${7MKTjj0mC zDPw5TPMItQDszsibW6Hlzixx*k3oNjLN$oy(kk8iSCWj0Iz_ivv*;*UovlkUN)Kkm zXTDsN#foNN)jX!?`8K5sRF~h*_&l@RQFCi-q54rj;H`0;-{77A zK3o(4(L-%xk2eG9gU^qYL@M|pE*N%g*c0{YC)wq1z?XY%9S3Sc;?uPx)R!!s@8(SvudgL2!FUFF7eRe_uyfKkAR>EM$qeIFk)ihmyxCn0{ z6ky!9^5(mnH53&R+B%V3f<|9U!gSjK5c<|`5N$*jKZuqLQ~ZqK@VQd@MRy|miJt$RO`-haQm}8T6_Fzz! z-9pQ8MqwqhB@Z~@=T0%*HJio3nuV5prM0JljMyUKTCTN9=%-|hh1OyaBNv%AM5=L= z!TI6&+qMU=i_o-h5zSJyda)(V?bPGH?R0})0JT~#+aH7_m zy~NJn4ZE)GAzZ&K?7%Wn-+_?|_Bor>NB4;Nhu3O%5H|E;M%Wl(qqZ{Ds9$JYLhhOrg4INQmP z&H|33H%aQh;^Ak@pS`hoO@OI9i}efg3PcD9#KfDYd)M?`f!U5IDhQ(DAv*0E{XtWR zZKBJm(!1{*<0Z7wh-&lNpt<;l^I;PRws;-SgGU+yOz}A`P4jSLV>LaZDxY6ghDsDG z+4prhg{rKSv09c-c_WZef2f2Zk3M&8=eqBE?f9UYgDx*qN{B-9xml1(OZYajHL}ky z!x(uDurjf3Xd`*f2aP|G&xyU}0KmBAN>+SFC{`tB@|6M?ToM&l+C<7dp)NsrJwZu| zj0WLiu;Uryr-b4l5|Q92Am_cx%mW=Wp7|?r_24tg!9^o1F#2&1!$$IVik4dJ(_q&< zaA^edrVbMOtaPO4)Mb{Md2FPP=HK8q)JuHcopsTq(>Z`Uiw>2lEMi%0{Mt1$RZmw! zr3@551J82Bbf{Q!cWGp|nr=A2)D;i_epUaK2v;&(Zw(|7vTw8jr17<5aHlL*U|dWsl{K8yZl#A%k%}FA0!p~*%!2aHCQT0J*&^1 z8({o%g}UsDc;Do$+hVXXUC-#nVwLEr5_+U$wT$hXKzM)wqdW)FE}dREzx+jH>FxmX z3vRAdvTqx{RS)Xig`U%-HJ}cX9`LU%7;f7~KUR-SZ_8siDEj|!Yw5;}s_Z}taExh(2|9Nk$@o!Xww*&#W zufj0zdvCThI4dPNg)A0Hio(}kRL98-wrDs5;NDi+C3gzeVC? z;N?ci&mGLZtsKki<~ciyg3Y^ft6rzgbRWA7#Vfx=r`ohLJGC-79&* z;mgw7kNnn*HS5;3X=5HJE}7C%@0H_xrl4}SRhVEnHMzY!#1f;O>ggIG7=mEOD#)Z;j*(UeOp&8$~@>4Pl=N%gy*_X6XDy*Ruz(6b*7gz;KTtF{60;c=ntLo zEp5woi!bYY+PZXie>`}A;Qt>_Xv9FzwaxFDV!+9DpsNei_TKhoU;5+GWxD9k;*RCqK#^ zoE!0*{*U+uou`j9&*>|q`mL9Ajt#JRMHrNttdlmW-)Ilro|_|H==^lpO#!KH>(F?- zYtnb1soBA6jeNrz37}IM7UQy+j-#o8|4$|UK*Rn}?6mxsf_}IyjT(OO$1)MSv%ln57>d|kW5GI@EBwH7EI`fLw z1kd!F#C}Ipf7W|gA{FJ6&5xt!ScTK>_O2oAJqs=3R-Hp;jFVd`oY1)1&C}!O6tx=L@JMqq}2%{ zw_U^ur_>7%%x1eIR?!(_ezrr)y29(VdwOs4T#^dV**JWo$*mx-F&p|M9A!mKQ5;!@ zE1vvO4RpW3I+z~?noUP^@2V0W1Q&2aRc7Xk71J3kGSMR-VX$MVvMC`eWV4Csu=3Fe zUZ#>1g~r&G>HhJ;oI`6-$R|{L8^#%Iw{)%4!bD5Vy$rHHV_5$3aGiM+Uod&9(8uD% zg!URC1QyXrb%!ws`_+r)X@#ys*hs+^TlOh&B9e#DT9QC z!YJhRBWQXT`N)#D>YW_PD;5qJ{2nw54p>a>)*npoCGBzTu~T>Cf?`6&_TnPHWO9z& zGP~U&AevM59tBs0$CNClHYP~bFDb@bJ}{+;h0{_ZkNUG{Rm`>?KI-c746N+&_9zMhgF5kg8PlXn3q2$u#eO_%ID*^2ImWJhD!aFrZc{lWr=l( zN_CcTrPwbhuWx)^hBCfxws1*!$!v07^m7|Y&7785HOKSLk<^v zOcA%-D7u;eeVTo@=^#DukqN8VrT=(a)ykg1db_-7bhDW)ZhGak9{)X-Arc#bN3Jw! zDaw2hC->wV)<^&&PGIs4Zpa-Nmx&|ejEupun+Cq}BSzSFxZnl4u>iGiz_;*nP|kL= z+hIzLTu%I!AZ`2>Z3H|3!zSpIGVs(frvz(GGDa(gZacHkYNu+45OjCG2vee0O`>_k zwjmbl@8SVtwJTGK|Md>jzkQt+NIW*H@`&dqKMk&dyfQ zk}I~99`OdI7QWAK@Ph!ZpYVX-|L*>7aRk!^iCDzrrcoEH$=QFzi>x)=KH1yN^e)aY zewP^Z6X0*8W%aQ21ofMf%>#f-Kbsr!0pTUu-5da@M>>GmTCf|$+7T`JbnQqapFe4r z>F&{V5%%1a*N&aF^9!Hdq*+0TK1L!!91#te(0noTt(rNuWs*%&EFT4bfwWd+8%EMv zQEv>3UomT~;&F~$x6aze-%@G&PFyL7m*)!&r=?1)7C-ln&T+3b9^EQ1z{yfXN3$n4Do0GA?`Y0YKT;~X1C zidZiOdj_&gfOtY+M1*k2GisRQvDcLShjZpd&C`+@1a$Da&dM~+=rXdTR5!p@s?gWE zhuW*iv&ZnC)n?P%#)i$xJ_mKM!`oZEMX8$@VR=)n87ZxH`D&!k5W8rnPdMXelJSx! zE7$3GU=ViNt;cSBIvfJT<78WR2y?9`Yc-yX60G# zYvP|8g8tZ}rW+36en!cJpa;3IY01FuIs$ooy-GFx2FXA#?m=Cn5svIW(06)jc1PG5 zmF_?z>4;`>*q4W$E+IIiJcd9O*WCIu>KRVA^9RD>u{rvu2tP_=J#7Wp5(MFYh=#m)nXOsp*CTjQI|`@|Pc_ zD+Z^_z|>eomH8qEjn#^!HVn3g2fE2!gLt_~Ri}bn<;usc!1y3zT98MDCTq-%@SbgH zp5WUs!tg1>g*OwE_dEP8;nF<$ev15p&gEFhKR#x*bma^a4`Zm{RU{r0-21L~zY_*N zWNGRC>386O3Uwf*++nrS^KJcy*ABO~G{99VJskjY17s;ssHFh}8sYfk0Iye|_p&Fs zS;Nzl7%eIJXSy>(*>{on_WsV}JLtD#Df1bm>6EEFheeD7cUV8pse3GpyKj@$+o~W{ zcK^Vp@xpe98JEE?iI?#E&;xq)M)&HDZacrx85Qm=$z5TK?Y|P1gK^%;Fj1|@QGd(?A*4`dDzF`>th~e-Z`pZ(Q?<5 zUa_LCjgWuL0&Ovf6}Qa1rK{Ep_D)@^=RI?&V~=#!np@}deHJy>nTqBi!)HVOKIlb| z;DisEGiZ$0wC5oUug%TI=VBN{MY3A0FPe)tl@ht=m2T{3H_NU&bF7AK-qZcP{Xdwh znFA0u4T-R@*8qp1?8b^U*OxtiZBy;-fGJB78WP4kec_?Xz6nu^rMCk;VWLUCtFB6m zguec|08>}v@=JMaB*ahonuQ9d@Ch8?HuYwrd>Tpa%|Fl!&t}II$Q~ z$IW+yYawv}?1aQwa=(BrI?aby+_QGpYv+hRJKKpzYd^A(*-pKiCXl>)G7`F;K99yS zT!dtqInc=>9G@xHeiW(bb9|iG`&qBFSHo@9jLdMz3djE5Wbv}-*S@#SPI1?DLaY|2 znW?gkkM-WMw*FyTy}Znc`pto5qGiKUMWv!`fXSv+Px5`Xuko8=!)(3RgJW%RxR!_0 zHDkQNuts5Z2F>!|CL^PSZo>>P8ToqPNY4(o=gNJQ8$8mY-Wyz5qv(?;g->SsLzV5? ziRy}gi2a>Y!9Kk#_5R^}nQ zJU$H=10kUNPzUbJzK(UpUHW|II2NuE0yM1> z$6Bl^<2z5aqKHM7RM|X}(7SyYdt$}${`GZnkB`%I|t7ksN{CS~%kJj{h) zcR|&d1{_>=In1+N#rHQ5RD2P#NJz%f-$yoI-v(;?ZhP$a(r@d#8sk&a5$g;86fWNy z?t8MBzzLIw1JuHBHJ>{hxBR#ZSJ8~IB?+Lgt#o0GB^#J9{kbwp6IakxX^GR zEr1vr2$&9={QSul0J=+j3PVl*t<5%$KGwJdq%Wv6S|8%q>Nud%h?1CX}yAf|#eTA`8`l`&zCn?j*o(8S>r zEL-6}4P&TQrC$5j(1$GC&7^+pYA;l25FaH{fN@v}jgcRuHu^RX7|jwm+^n>dk^TaW z4{NPW)Cc;c!@nW z5My%CW*e>_)&x4Fx3LX3eYKDYqtRw0B8X+UP+f}|nuET-WicY)fjZ!-~ zme*Z`rMTk{HF>#suohvorGO7~H}s8&zxKDy|Iea+j-t*y>cd2+5s(*uINTIQ3PY?g z99D|vf5g{qQ#joD2vDj65^j4}2mmajS27 zmHz7=6%Cp_-dBU(SHzn>)*rM8zl!x?-X_ZhQE_ms6{c?pQ0cH$mrAYlw?=Np_%SY9 zwbm3Nyc?8`3bdnI5cAKWZt~EG1-J6hpdmrC1|K8@kfQcbF`@pR5wW=7*DfiuKX+M! zvqdxoA@~Fr430KTA!aDP|272Qa8T3;R&E=ruaK0s3Y)faTlqu$b%tgFo2$Zb%y^1q50`Gk%K>QK$Z9kY*MSG3^)3aTz9utwDdDiQGiYR<0_2 zayF!8fkUJhGob#ze6ih|U)Eye8-lc;e;2kqEIlqEC2P3s#l#Kl#Zvh%k+{}i7mZJc zs#VJk>&IcMr@2%1Jk??>5+_4gxTBt6&B>sF+qfLPLO)jcT(9`y zJTtAb>N55jf3c_(qV%nR=gT|#h-o6A7p+omG-OEkr zABQNN@a&(MA)9n~14|GC#8xEEw@Djfx;zH+p{z_3i6CQeDMr+q5XoO^cdeKEN##w2 zN2V|NM9hz7^WPl#1$khY9=+msMaafh?OOXpZ!#bvLk|d6Gy_;lI&`on6ct;Fa%>HA zE#+eMHZ%FhymGih%hqM97F}ePu6dqV3aY$kP*>46&l9s80Qdqa@IIs~WStU6>|w== zdZIjKalw>RGoQ zGi)(EJM{?Op?_<__WmV_BhznnR51i*`Cn^y57EyVp3`Os;ct(`**fgr{JO?-Zkk@0 z0XMuAk#A;|nAAo;%pGQ+u%n*~$%s)fke}pmA;nan(0JJSyvFj~pNq^t)4r3`>6B&Z z_+&vaXy*AZ8{+;QQKjt?5#$Il3(jFLx{LSkwyS9uH#AXKu`p5JA+Oc0p_BUC=8b4o z(<<)O{8T6T=a%sZ|LI@ln4TKT;=4$k9ZdB?5B;e!K zh|q&Sqo<0Uc$6!QTa`;@-$`kROgVvGi63=Ns-%$tguYwmdp#UchbON0SQoph^z|Cy zMo;%p=oQQ}Zd}GzWKUNt?IAw=f!Vq3w<4g%cDmu?4wZ{L2yZF}U3s5H73HjWetp6E z>zzN?<-W(cyk=YNwhRh`$pVo$v(JN&+$ZeKJn}Bv5{R7uGQCu4rhd|AbQ)r8XTZsv zGY-Y68}hn*2tQDBJvaDU!)Qop~Fiq zVep*yp{n8VXQ~F(!j1mFc}QP$-cb?Sb&M%>RYSKyX6`WfRks^@2Vz2zgX|G)SiFSz zp>WKtm~j0f^&#p)>?3fn&8vCr&82pvcIUl_RN45CZ6JEi*Pvp_jq|K9oE5GI)1s3; zV^l@v@=|T)8_n+e5&d)D_VF5!tNAluA1N-WzR1rNXcU7CumB0)YUFsez4lP^P5i{S zyx;-C_Q;TPT$f-Evq@J{-C|ph(S4b3Gi_coxX`lP139wWFCGVI9cj>Kuc>1~(a;~?!se^;HW$dJ?V-{9?(eGZ9`^TMcRExY3O zu5jo6zjc&i|J}Mh$a1@m{R64tWxA17ce8sOwy?@3f5CRKg4Ah)JwB!qXOP~Y5`?ZRZ3Vk| zu1|dF+A7x%XYEUVy8FO4DxzJX@?7xXzo7LK;?5q0Yp#3EL0|`Ky|upe5Bz9_cRwO| z2}tCT6x`f+yaP6c24IZ@u+)T+gwjdb2{37b)74~9?S#a6XlrU}&a-Y=%GUSS_q+xp z1-*sQc7tNeYona|-8)So@X1J=A~5pBk$$xP^6W=ZKhE)oV!-;5 z)Xn+ksx6>d6)tiUKfvRrQPS8*UeEbEN4}ZOZ>3^A-WZIUKd7a(Erp%xf!wJTI{7^x?d z%k9Y<)xWuQry-wJ<3h3!mYL0i^9_ZG0JSqr1ai5yGnQtA!~==HimfQXr|nUK@2K;) znD8rv1xd(^Aqc`*O@wK$VU7uK6byT5d0?op#iUr9@)D05vsa7Yaf#AXzh#7xMa4IF z1=?h^bOpYVL?3O8ibs_S0d&-n%~Fy`CYzhU5IY7gKlot<4bSR0ygdTqi_Uh6H``@Y z4H*e%GXdUPOm9Uy4BBkBBL?+Z=yp22~MyJ@|iu6=s;%U8;i$$2TNq0Pf*EILThF3*2l_>Y~9H1CtnYoVGsg> ze*hqV%Y=Z+Lwbw15#cEB8St6$6v3+x$kZ)$c0BBfkF4@=*15`E==ku3DykweNrm1$sWy*RNiAT@E80ZyfL!7qx z)aJaj`cS?104m^zMATS#QZq>!#w}gP+)Oe&30MyRsJ<569A*V^vae3wr+;BUF#?&~ z9=Eg(J}cHSX&pSZM@Hrn8Tzt@GXM|)ohFGD@_{Of{jxVMEL)n|hMOA-sf}$d>nHeIPnVOlRQ5r6(DH$q}`E60O zA}bm(0xW&%WNXyw5o@1bE`uao*~yImt@kSVmwP!pd?U5MIQr z-&K%R+ZL?1vmjg*CQmLsSmcit1Vzy08bGb8R=0UHmtjL_Vm~N*P{E*WuoW zs2-9N9|M-69pj`F6jM*|1mt9Y;Da_`;wHnN`J09%IulKwhcBiqYw_&q zg9)SBI`T z`<#t2B9!b}-7%}@NQ7X4dK`lPbVI7)OOx$Fk)B8zl^Xklp+_I0N!KW~ka)B62p2P< z1lKO%Whsr_#m8s;bZnQE&-L=(=Iq|FR~)k=D@~NzW6GgQ>SbBUAGgh4&(@c|ZCsI3 zz$G|4O^P~7`R?OUtJ~jKr@r(}au?-SZLpqgW}6iaYxF($m+!ga+4ml8kC_!;p9Nsr zfLR?jR>xoBcKcIgGpWob*HgsUj$9K|KVHIk{t&-VuHhHQ&RT1B)cI#hUG}Bc`kT5G zvFdvG|3TzNL`>Wp7u6x#e%V{Dk7_T6J93 z!{9o|<;*Mz2(HK5#9z2s?S&Oq6U4?{?D4I+7*n9&w#Ll5ib1M8QCDko2(QA;TaCw^ ziHg6ad15^=@1WFVCO0VuCI&#syZNlmk=_`Q!hF9{fN2Xcc3#I#a4X)z z6)p^D?Bf6NhxXRa)}}8c!_vz!&KT26;SaC&cP5<+7@Lb2NS_C!Xg?3w7ro&jGS^bJ50_FPwFbW6W2yKhh0h*Lq42^fj7uguD1at`W(`+sEzvoC_Ep_g^bos=7~N)&9mSQ$`2+YBbAZ*{^!WrIq-9&vVN)g;pPM(53uK$>qcR zUkDlW7GCLz^p2%N%x0kupUh_$$6-(x>;wMkebFBK(T8Q~*l0XA*Z|PCWQ5}(^cxA1 zePObBB^w(=nLr+?B1|nBWtoR`06m zTeY{cuBlFZzb*YhqxbOcKgP7wl54LFoV~m-rEpC9xv{IagsIkciPRwVC=YFAQLl#R z77s~X|B1rCTW-Jjc6o1Z&_<5?Jy?tJs#hmi4AOmmiqcrRCVQ!eu7sUI; zx9n2jdPfqh`d~J&IVoSaOKN4#w*^cC?6Qq}Br}}Yec{xXp{*-&f~C1%C#~s)_@{DU zBdy9#BXbUBVkGj;UF0Bkub z*paXn1$w1R@Q%LDzBN&73aZ_RN3FXlOUFv1@TElGRa>%g|5|XNC2`sIE89)7Djh9t zbp*i*RPVIlM_E`Xi&&*>G#p|#+)tbMb%1}vfg{Ytfm#~1u0tz}<(Oe7U*Tc7hOGn# z<5vw0xYNm@F|e)->LmVa@Rh;6HBe(6SmRZ1mAQGahaa!0%rm=hBSu zIGoBrOx)-}I@X=l;MDh2+#?O$yRTXJp(Ew^^@|3$j$IU7M;i9zVGT>QTCUZ`(DUx? zJ1)8=OHq}ke4u?1W&GA~F8dlcLD(v!Ta)^_WeHo%Lo;T)G<#t0Q&Cczbjxe4F3B0b z(y{J&8!w91DMya((#ILitL0PPzP{o2+rZtjN64EkTYUNbiI*#=Z5RZllET4afv?(yU1*-8riT77VKp14z?{$eLSt^Iy>(t#}de=`$ zK5=KV<|I&%VpRLVW2cv2_qQaqsVvjiJTbu``51okx)ct$;d0GX zw20RGhKc{_;wP+7)3E0s&ik(S>`$ZHx0+BBayF*jgtx=WCii}l*Zv12cwc(!#;bW1+etOn`qjn3?vY8AdZZ&#gXLA-uQZMHZ)M_&+ycZutb zw2KYau?BQJq8z`-Armv$L^p22BUNowO1WrMK??RG(X4X1P6__0t1nxA?}o{5V(G_Y z0vtDX7V)w5BL$L#o_Z=dPh?rs~hXFV6y>Y8UCuOK`$N5$2zAyX zek!ptm$7T2DpU2O<|yA#qd9x@r5ad9%MunmME_q1+ubARTzGSyDN z%iP5#IAe7MFK4+BOi-{z06a{POdxzY<6?MsFUTciicoIrXYmwR06Y`i5l=RnYuSaj zOgY(Eu2|*>bYCx~sLqoTpo)~uADz087R#dM&=k(Vvw~p`qcFu?F(afbyf#ttfUGsR z^Gp?4?--hgqc3#08Ega=ey{0hb;}k7cz1Y=mDgvp3ZU71cCrFS#tRg9UXwZ7M4L{f zf@rEII56iCRCkC@3HV0xLnPXJIz@Li2{cg6V_l%_3P%!(E_l?A>|*E*$vS0Y7iGBU zO?$BX#yS60Q@`bkeL}q3UF58$>g*G{&vGlRv{(J8y2c+|ST zQBa$fa{jLRgL}F5D(GLmxq3>d#NzqdBgC1 z!#_y_oi~DqU4LbM`6tH7U%xotd1HuQj{I%0<4NLsK7f)eh$$FF>y;LpYo2HGzUM7; zdnv=a0fC?nml}aUI@O(-oY|E&GFC5D7lj4+b8ZT=K;_Pk)0e;uY319QJ zm!D_bSVsIc5oBr$i%=%3E50n|$GoBhOwqpmPD);GV{mf0S~nd@8$%wPAZAhUO|~ex zN0k|!hd=r#aPHN(rKK)syOfbpWx{f-uPVYAMV#>`f)_h2ctB!{>X}_Pnb#WaJ8X*2lrb>uvJ-!UXp^P0_Jvd-P{)b zn-4MZy431`IXjI>xfSO3#Kzid3FJuWnqj}+H?7#L&e*Ak9Pb8h={CMJKGiVB=dqRZ zT#~gU&e$fqHsKPVR-Nj%H8heNt@S>VtVfKSN3pMb?`P}%mi}~aI~=H;G7hBCfb54% z4L#jfjPu%rZ*%zt>z2*EUu0k^3wtN|iVsEArnRMU>cXDjUF9pAm!^Vsl|43Pp6Kr!*Wa|_x~_S$ zbF%4U|D)F*6*#Z89xKe(rF_yVRrQcl)Nh@b1!o%0bsNwrKb;uZHaq>e z$W)IOzd+T!q?-5E3al+Q05(YxEEb)o-1ZGm&k8nmx=8U~Y*BWM8n_GE*T{6}X{Ah) zM%(E{ji7ER)(NvkX{;F^+BJ~K+H0Oe29+bG+VOk2N+yhT&m8+Jx1g>CsYx`)RP1I6 zQt4LT>|R)LL+K0;oTcj>mBY1Db~N+X%?HJnw!XId#K7uNJ7Q`J*^I(Dh3T=mU080_ zYFo<|^F?-m4;n;HDIh!BR2WZ+fycI%O?OYZpBldTF8y(vZ$#ywxueu1b<(yPmc6{#D|;V|1bJ{OF2|2Jb*?kKVQmX7kt@@iji*EBD0gjIg`? z)6eM4N38zG-KXU~KZg$~wSCuFH3T%jz{`V;%{eA8ttR3D7T@Rd-AkBbrt?#On>loP zDL?7$AO7+XU#?F;4Bc5C=A@4^uCz8wS+FwH|EP0@n;Wh{2ggZkjh@fty`qw8Ug#vv z5SzUk6HM=DxuepymD|FO?qaUNt3;(7Nd#x3bejBh6?BxRJod_6`rഌ$lD9+8| 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

6`#B`Y9S9%bO>%_t?QL^(CN-#cc~K{@MG@Y|Ge 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 BrF{SZ diff --git a/src/WINNT/doc/help/ja_JP/TAAFSUSRMGR.HLP b/src/WINNT/doc/help/ja_JP/TAAFSUSRMGR.HLP deleted file mode 100755 index 79eee66672c8d985c82da2957cbba81ba85ca10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153989 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%0Dt^UiG!PL?d^n`_?0oGFRUGZz>&>Ce-h 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%0A*S9omxD{ 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�l@fS@7 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 -2 ƒZƒ‹Eƒf[ƒ^ƒx[ƒX -3 ŠTà=Cell_Database_Overview>main -3 ƒZƒ‹Eƒf[ƒ^ƒx[ƒX‚ɃZƒ‹‚ð’ljÁ‚·‚é=Adding_Cells_to_Your_Cell_Database>main -3 ƒZƒ‹‚̏î•ñ‚ð•ύX‚·‚é=Changing_Cell_Information>main -3 ƒZƒ‹Eƒf[ƒ^ƒx[ƒX‚©‚çƒZƒ‹‚ðíœ‚·‚é=Removing_Cells_From_Your_Cell_Database>main diff --git a/src/WINNT/doc/help/ja_JP/afs-light.CNT b/src/WINNT/doc/help/ja_JP/afs-light.CNT deleted file mode 100755 index e69e2dd84..000000000 --- a/src/WINNT/doc/help/ja_JP/afs-light.CNT +++ /dev/null @@ -1,63 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title IBM AFS Light -1 ŠTà -2 AFS ‚ɂ‚¢‚Ä=Working_in_AFS>main -2 AFS ƒtƒ@ƒCƒ‹‹L‰¯ˆæ‚ÌŠT”O=AFSFileStorageConcepts>main -2 AFS ƒZƒLƒ…ƒŠƒeƒB[‚ÌŠT”O=AFS_security_concepts>main -2 AFS Light ‚̐»•iî•ñ=AFS_Client>main -2 ƒwƒ‹ƒv‚ɂ‚¢‚Ä=Audience_and_Purpose>main -1 ŠJŽn‚·‚é -2 ŠTà=Running_AFS>main -2 AFS Light ƒQ[ƒgƒEƒFƒC‚ðŽ¯•Ê‚·‚é=Adding_your_Client_to_a_Cell>main -2 AFS ƒtƒ@ƒCƒ‹EƒXƒy[ƒX‚ðƒ}ƒEƒ“ƒg‚·‚é=Mapping_Drives_Overview>main -2 AFS ‚ɑ΂·‚é”FØ=Authentication>main -2 ”FØ‚ðŒŸØ‚·‚é=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 AFS ‚©‚ç‚Ì”ñ”FØ=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 AFS ‚ðŠÇ—‚·‚é -2 ŠTà=AccessingAFS@AFS-LIGHT.HLP>main -2 AFS ƒƒjƒ…[=FileManagerAFSMenu>main -2 AFS Light \¬ƒ†[ƒeƒBƒŠƒeƒB[=AFS_Client_Configuration_Utility>main -2 AFS Light ƒvƒƒOƒ‰ƒ€EƒOƒ‹[ƒv=The_AFS_Client_Program_Group>main -2 AFS Light ƒvƒƒpƒeƒB[Eƒ{ƒbƒNƒX=AFS_Credentials_utility.>main -2 ƒRƒ}ƒ“ƒhEƒvƒƒ“ƒvƒgEƒRƒ}ƒ“ƒh=CommandPromptCommands@AFS-LIGHT.HLP>main -1 AFS Žg—p–@ -2 ƒAƒNƒZƒX§ŒäƒŠƒXƒg (ACL) -3 ŠTà -4 ƒAƒNƒZƒX§ŒäƒŠƒXƒg (ACL)=ProtectingFilesandDirectories>main -4 ƒfƒBƒŒƒNƒgƒŠ[EƒŒƒxƒ‹‚̃AƒNƒZƒX§Œä=Directory.LevelAccessControl>main -4 AFS ƒAƒNƒZƒXŒ =AFSAccessPermissions>main -4 ƒAƒNƒZƒXŒ  (•â‘«)=OtherVariablePermissions>main -4 •W€‚¨‚æ‚ы֎~‚̍€–Ú=NormalandNegativeEntries>main -3 ƒAƒNƒZƒX§ŒäƒŠƒXƒg (ACL) ‚ÌŽg—p–@ -4 ACL ‚ðÝ’è‚·‚é=AccessControlLists>main -4 ACL €–Ú‚ð’ljÁ‚·‚é=AddACLEntry>main -4 ACL €–Ú‚ðœ‹Ž‚·‚é=Removing_ACL_Entries>main -4 ACL ‚ðƒRƒs[‚·‚é=CopyACL>main -2 ƒ{ƒŠƒ…[ƒ€‚¨‚æ‚уp[ƒeƒBƒVƒ‡ƒ“ -3 ŠTà=Volumes_and_Partitions>main -3 ƒ{ƒŠƒ…[ƒ€‚ƃp[ƒeƒBƒVƒ‡ƒ“‚̏î•ñ‚ð•\ަ‚·‚é=Displaying_Volume_and_Partition_information>main -3 –¼‘O /ID ƒ}ƒbƒsƒ“ƒO‚̍ŐV•\ަ=Refreshname.IDmap>main -2 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg -3 ŠTà=Mount_Point_first_page>main -3 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ð•\ަ‚·‚é=Displaying_Mount_Points>main -3 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðíœ‚·‚é=Removing_Mount_Points>main -3 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðì‚é=Making_Mount_Points>main -2 ƒLƒƒƒbƒVƒ…‚³‚ꂽƒtƒ@ƒCƒ‹ -3 ŠTà=Cached_Files>main -3 ƒtƒ@ƒCƒ‹‚ƃfƒBƒŒƒNƒgƒŠ[‚ðƒtƒ‰ƒbƒVƒ…‚·‚é=Flushing_files_or_directories>main -3 ƒ{ƒŠƒ…[ƒ€‚ðƒtƒ‰ƒbƒVƒ…‚·‚é=Flushing_Volumes>main -2 ƒT[ƒo[î•ñ -3 ŠTà=ListingFileServerInformation>main -3 ƒtƒ@ƒCƒ‹EƒT[ƒo[‚Ì•\ަ=Showing_File_Servers>main -3 ƒtƒ@ƒCƒ‹EƒT[ƒo[‚̏󋵂ð•\ަ‚·‚é=Showing_the_Status_of_File_Servers>main -2 ƒZƒ‹ -3 î•ñ‚ðƒŠƒXƒg‚·‚é -4 ƒZƒ‹‚ð•\ަ‚·‚é=Showing_Cell>main -3 ƒZƒ‹Eƒf[ƒ^ƒx[ƒX -4 ŠTà=Cells>main -4 ƒZƒ‹‚ð’ljÁ‚·‚é=Adding_Cells_to_your_Cell_Database>main -4 ƒZƒ‹‚̏î•ñ‚ð•ύX‚·‚é=Changing_Cell_Information>main -4 ƒZƒ‹‚ðíœ‚·‚é=Deleting_Cell_Information>main -1 ŽQÆ -2 —pŒêW=Glossary>main -2 •û–@...=How_To...>main diff --git a/src/WINNT/doc/help/ja_JP/afs-nt.CNT b/src/WINNT/doc/help/ja_JP/afs-nt.CNT deleted file mode 100755 index e90bc3c7d..000000000 --- a/src/WINNT/doc/help/ja_JP/afs-nt.CNT +++ /dev/null @@ -1,77 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS ƒNƒ‰ƒCƒAƒ“ƒg -1 ŠTà -2 AFS ‚ɂ‚¢‚Ä=Working_in_AFS>main -2 AFS ƒtƒ@ƒCƒ‹‹L‰¯ˆæ‚ÌŠT”O=AFSFileStorageConcepts>main -2 AFS ƒZƒLƒ…ƒŠƒeƒB[‚ÌŠT”O=AFS_security_concepts>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ɂ‚¢‚Ä=AFS_Client>main -2 ƒwƒ‹ƒv‚ɂ‚¢‚Ä=Audience_and_Purpose>main -1 ŠJŽn‚·‚é -2 ŠTà=Running_AFS>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ðƒZƒ‹‚̃ƒ“ƒo[‚É‚·‚é=Adding_your_Client_to_a_Cell>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒEƒBƒU[ƒh=IDH_AFSCREDS_WIZ_START>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ÌŠJŽn‚Æ’âŽ~=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒg‚ÌŽn“®ƒ^ƒCƒv‚̕ύX=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 AFS ƒtƒ@ƒCƒ‹EƒXƒy[ƒX‚ðƒ}ƒEƒ“ƒg‚·‚é=Mapping_Drives_Overview>main -2 AFS ‚ɑ΂·‚é”FØ=Authentication>main -2 ”FØ‚ðŒŸØ‚·‚é=VerifyingAuthentication@afs-nt.hlp>main -2 AFS ‚©‚ç‚Ì”ñ”FØ=UnauthenticatingfromAFS@afs-nt.hlp>main -1 AFS ‚ðŠÇ—‚·‚é -2 ŠTà=AccessingAFS@afs-nt.hlp>main -2 AFS ƒƒjƒ…[=FileManagerAFSMenu>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒg\¬ƒ†[ƒeƒBƒŠƒeƒB[=AFS_Client_Configuration_Utility>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒvƒƒOƒ‰ƒ€EƒOƒ‹[ƒv=The_AFS_Client_Program_Group>main -2 AFS ƒNƒ‰ƒCƒAƒ“ƒgEƒvƒƒpƒeƒB[Eƒ{ƒbƒNƒX=AFS_Credentials_utility.>main -2 ƒRƒ}ƒ“ƒhEƒvƒƒ“ƒvƒgEƒRƒ}ƒ“ƒh=CommandPromptCommands@afs-nt.hlp>main -1 AFS Žg—p–@ -2 ƒAƒNƒZƒX§ŒäƒŠƒXƒg (ACL) -3 ŠTà -4 ƒAƒNƒZƒX§ŒäƒŠƒXƒg (ACL)=ProtectingFilesandDirectories>main -4 ƒfƒBƒŒƒNƒgƒŠ[EƒŒƒxƒ‹‚̃AƒNƒZƒX§Œä=Directory.LevelAccessControl>main -4 AFS ƒAƒNƒZƒXŒ =AFSAccessPermissions>main -4 ƒAƒNƒZƒXŒ  (•â‘«)=OtherVariablePermissions>main -4 •W€‚¨‚æ‚ы֎~‚̍€–Ú=NormalandNegativeEntries>main -3 ƒAƒNƒZƒX§ŒäƒŠƒXƒg (ACL) ‚ÌŽg—p–@ -4 ACL ‚ðÝ’è‚·‚é=AccessControlLists>main -4 ACL €–Ú‚ð’ljÁ‚·‚é=AddACLEntry>main -4 ACL €–Ú‚ðœ‹Ž‚·‚é=Removing_ACL_Entries>main -4 ACL ‚ðƒRƒs[‚·‚é=CopyACL>main -2 ƒ{ƒŠƒ…[ƒ€‚¨‚æ‚уp[ƒeƒBƒVƒ‡ƒ“ -3 ŠTà=Volumes_and_Partitions>main -3 ƒ{ƒŠƒ…[ƒ€‚ƃp[ƒeƒBƒVƒ‡ƒ“‚̏î•ñ‚ð•\ަ‚·‚é=Displaying_Volume_and_Partition_information>main -3 –¼‘O/ƒ{ƒŠƒ…[ƒ€ ID ƒ}ƒbƒsƒ“ƒO‚ðÅV•\ަ‚·‚é=Refreshname.IDmap>main -2 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg -3 ŠTà=Mount_Point_first_page>main -3 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒgî•ñ‚ð•\ަ‚·‚é=Displaying_Mount_Points>main -3 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðíœ‚·‚é=Removing_Mount_Points>main -3 ƒ}ƒEƒ“ƒgEƒ|ƒCƒ“ƒg‚ðì¬‚·‚é=Making_Mount_Points>main -2 ƒLƒƒƒbƒVƒ…‚³‚ꂽƒtƒ@ƒCƒ‹ -3 ŠTà=Cached_Files>main -3 ƒtƒ@ƒCƒ‹‚ƃfƒBƒŒƒNƒgƒŠ[‚ðƒtƒ‰ƒbƒVƒ…‚·‚é=Flushing_files_or_directories>main -3 ƒ{ƒŠƒ…[ƒ€‚ðƒtƒ‰ƒbƒVƒ…‚·‚é=Flushing_Volumes>main -2 ƒT[ƒo[ -3 î•ñ‚ðƒŠƒXƒg‚·‚é -4 ŠTà=ListingFileServerInformation>main -4 ƒtƒ@ƒCƒ‹EƒT[ƒo[‚Ì•\ަ=Showing_File_Servers>main -4 ƒtƒ@ƒCƒ‹EƒT[ƒo[‚̏󋵂ð•\ަ‚·‚é=Showing_the_Status_of_File_Servers>main -3 ƒT[ƒo[Ý’è -4 ŠTà=Server_Prefs_Overview>main -4 ƒT[ƒo[Ý’è‚ð•\ަ‚·‚é=Viewing_Server_Preferences>main -4 ƒT[ƒo[Ý’è‚ð’ljÁ‚·‚é=Adding_Server_Preferences>main -4 ƒT[ƒo[Ý’è‚ðC³‚·‚é=Modifying_Server_Preferences>main -2 ƒZƒ‹ -3 î•ñ‚ðƒŠƒXƒg‚·‚é -4 ƒZƒ‹‚ð•\ަ‚·‚é=Showing_Cell>main -3 ƒZƒ‹Eƒf[ƒ^ƒx[ƒX -4 ŠTà=Cells>main -4 ƒZƒ‹‚ð’ljÁ‚·‚é=Adding_Cells_to_your_Cell_Database>main -4 ƒZƒ‹‚̏î•ñ‚ð•ύX‚·‚é=Changing_Cell_Information>main -4 ƒZƒ‹‚ðíœ‚·‚é=Deleting_Cell_Information>main -2 ƒTƒuƒ}ƒEƒ“ƒg -3 ŠTà=Submounts_Overview>main -3 ƒTƒuƒ}ƒEƒ“ƒg‚ðì¬‚·‚é=Creating_Submounts>main -3 ƒTƒuƒ}ƒEƒ“ƒg‚ðC³‚·‚é=Change_or_Edit_Submounts>main -3 ƒTƒuƒ}ƒEƒ“ƒg‚ðœ‹Ž‚·‚é=Delete_Submounts>main -1 ŽQÆ -2 —pŒêW=Glossary>main -2 •û–@...=How_To...>main diff --git a/src/WINNT/doc/help/ja_JP/taafscfg.cnt b/src/WINNT/doc/help/ja_JP/taafscfg.cnt deleted file mode 100755 index 8db6e5b31..000000000 --- a/src/WINNT/doc/help/ja_JP/taafscfg.cnt +++ /dev/null @@ -1,32 +0,0 @@ -:Base TAAFSCFG.HLP -:Title IBM AFS ƒT[ƒo[\¬ -1 AFS ƒT[ƒo[\¬ƒwƒ‹ƒv -2 AFSAAFS ƒT[ƒo[A‚¨‚æ‚Ñ AFS ƒRƒ“ƒgƒ[ƒ‹EƒZƒ“ƒ^[‚ɂ‚¢‚Ä=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 AFS ƒT[ƒo[‚̍\¬ -3 ŠTà=Configuring_the_AFS_Server -3 AFS ƒT[ƒo[\¬ƒEƒBƒU[ƒh=The_AFS_Server_Configuration_Wizard -3 AFS ƒT[ƒo[‚ðŠù‘¶‚̃Zƒ‹‚ɍ\¬‚·‚é=Configuring_the_AFS_Server_into_an_Existing_Cell -3 AFS ƒT[ƒo[‚ðƒZƒ‹‚̍ŏ‰‚Ì AFS ƒT[ƒo[‚Æ‚µ‚č\¬‚·‚é=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 AFS ƒf[ƒ^‚̃AƒNƒZƒX=Accessing_AFS_Data -2 AFS ƒT[ƒo[\¬ƒ_ƒCƒAƒƒOEƒ{ƒbƒNƒX -3 ŠTà=The_AFS_Server_Configuration_Dialog_Box -3 AFS ƒT[ƒo[\¬ƒ_ƒCƒAƒƒOEƒ{ƒbƒNƒX‚ɃAƒNƒZƒX‚·‚é=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 ƒp[ƒeƒBƒVƒ‡ƒ“Eƒ^ƒu -4 ŠTà=IDH_PARTITIONS_PAGE -4 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚̐ݒè -5 ŠTà=Setting_Up_AFS_Partitions -5 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ðì¬‚·‚é=To_Create_an_AFS_Partion -4 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ÌŠÇ— -5 ŠTà=Administering_AFS_Partitions -5 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚̉ñŽû -6 ŠTà=Salvaging_an_AFS_Partition -6 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ð‰ñŽû‚·‚é=To_Salvage_an_AFS_Partition -5 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚̍폜 -6 ŠTà=Removing_AFS_Partitions -6 AFS ƒp[ƒeƒBƒVƒ‡ƒ“‚ðíœ‚·‚é=To_Remove_an_AFS_Partition -3 ƒT[ƒrƒXEƒ^ƒu -4 ŠTà=IDH_SERVICES_PAGE -4 AFS ƒT[ƒo[‚Ì–ðŠ„=AFS_Server_Roles -4 AFS ƒT[ƒrƒX=AFS_Services -4 AFS ƒT[ƒrƒX‚ð\¬‚µAŠJŽn‚·‚é=To_Configure_and_Start_an_AFS_Service -4 AFS ƒT[ƒrƒX‚ð’âŽ~‚µA\¬‰ðœ‚·‚é=To_Stop_and_Unconfigure_an_AFS_Service diff --git a/src/WINNT/doc/help/ja_JP/taafssvrmgr.cnt b/src/WINNT/doc/help/ja_JP/taafssvrmgr.cnt deleted file mode 100755 index 2d872c5df..000000000 --- a/src/WINNT/doc/help/ja_JP/taafssvrmgr.cnt +++ /dev/null @@ -1,89 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title IBM AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[ -1 AFS AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[ -2 AFS ‚ÌŠT—v -3 AFS: ŠT—v=AFS__Overview -3 AFS ƒZƒ‹=DCE_Cells -2 AFS AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[ -3 AFS ƒT[ƒo[Eƒ}ƒl[ƒWƒƒ[: ŠT—v=DFS_Server_Manager -2 AFS ‚ɑ΂·‚é”FØ -3 AFS ‚Ö‚Ì”FØ‚ðs‚¤‚É‚Í=To_Obtain_DCE_Credentials -3 ŠÇ—‚·‚é AFS ƒZƒ‹‚ð‘I‘ð‚·‚é‚É‚Í=To_Choose_a_DCE_Cell_to_Administer -2 AFS ƒT[ƒo[ -3 ƒT[ƒo[: ŠT—v=Servers__An_Overview -3 AFS ƒT[ƒo[‚ð•ÛŽç‚·‚é=Setting_Up_and_Maintaining_DFS_Servers -3 ƒT[ƒo[EƒTƒuƒZƒbƒg‚ðƒ‚ƒjƒ^[‚·‚é=Monitoring_Server_Subsets -3 ƒT[ƒo[EƒvƒƒpƒeƒB[=Server_Properties -3 ƒT[ƒo[Œx=Server_Warnings -3 ƒT[ƒo[‚ÌŠÇ—ŽÒ -4 ƒT[ƒo[‚ÌŠÇ—ŽÒ: ŠT—v=Administrators_for_a_Server -4 ƒT[ƒo[‚ÌŠÇ—ŽÒƒŠƒXƒg‚ц[ƒU[‚ð’ljÁ‚Ü‚½‚͍폜‚·‚é‚É‚Í=To_Edit_an_Administrative_List -3 ƒT[ƒo[ˆÃ†‰»Œ® -4 ƒT[ƒo[ˆÃ†‰»Œ®: ŠT—v=Server_Encryption_Keys -4 V‚µ‚¢ƒT[ƒo[ˆÃ†‰»Œ®‚ð’ljÁ‚·‚é‚É‚Í=To_Add_a_New_Server_Key -4 ƒT[ƒo[ˆÃ†‰»Œ®‚ðíœ‚·‚é‚É‚Í=To_Remove_a_Server_Encryption_Key -3 ƒT[ƒo[Eƒtƒ@ƒCƒ‹ -4 V‚µ‚¢ƒtƒ@ƒCƒ‹‚ðƒT[ƒo[‚ɃCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚Í=To_Install_New_Files_on_a_Server -4 ƒoƒCƒiƒŠ[Eƒtƒ@ƒCƒ‹‚Ì‘Oƒo[ƒWƒ‡ƒ“‚ðƒT[ƒo[‚ɃCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚Í=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 ƒtƒ@ƒCƒ‹‚ðƒT[ƒo[‚©‚çíœ‚·‚é‚É‚Í=To_Prune_Files_from_a_Server -4 ƒtƒ@ƒCƒ‹“ú•t‚ðŽæ“¾‚·‚é‚É‚Í=To_Get_File_Dates -3 ƒT[ƒo[‚Ì VLDB ‚𓯊ú‰»‚·‚é -4 VLDB ‚𓯊ú‰»‚·‚é=Synchronizing_the_FLDB -4 ƒT[ƒo[‚Ì VLDB ‚𓯊ú‰»‚·‚é‚É‚Í=To_Synchronize_the_FLDB -2 AFS ƒp[ƒeƒBƒVƒ‡ƒ“ -3 ƒp[ƒeƒBƒVƒ‡ƒ“: ŠT—v=Partitions__An_Overview -3 ƒp[ƒeƒBƒVƒ‡ƒ“EƒvƒƒpƒeƒB[=Partition_Properties -3 ƒp[ƒeƒBƒVƒ‡ƒ“Œx=Partition_Warnings -2 AFS ƒ{ƒŠƒ…[ƒ€ -3 ƒ{ƒŠƒ…[ƒ€: ŠT—v=Filesets__An_Overview -3 ƒ{ƒŠƒ…[ƒ€‚Ì‚³‚Ü‚´‚܂ȃ^ƒCƒv =Read__Write_and_Read_Only_Filesets -3 ƒ{ƒŠƒ…[ƒ€EƒƒP[ƒVƒ‡ƒ“Eƒf[ƒ^ƒx[ƒX (VLDB)=FLDB__Fileset_Location_Database_ -3 ƒ{ƒŠƒ…[ƒ€EƒvƒƒpƒeƒB[=Fileset_Properties -3 ƒ{ƒŠƒ…[ƒ€‚ðì¬‚·‚é‚É‚Í =To_Create_a_Fileset -3 ƒ{ƒŠƒ…[ƒ€‚Ì–¼‘O‚ð•ύX‚·‚é‚É‚Í =To_Rename_a_Fileset -3 ƒ{ƒŠƒ…[ƒ€‚ðíœ‚·‚é‚É‚Í =To_Delete_a_Fileset -3 ƒ{ƒŠƒ…[ƒ€‚ðˆÚ“®‚·‚é -4 ƒ{ƒŠƒ…[ƒ€‚̈ړ® : ŠT—v=Moving_Filesets -4 ƒ{ƒŠƒ…[ƒ€‚ðˆÚ“®‚·‚é‚É‚Í =To_Move_a_Fileset -3 ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ðì¬‚·‚é -4 ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ðì¬‚·‚é‚É‚Í=IDH_SVRMGR_CLONE_OVERVIEW -4 •¡”ƒ{ƒŠƒ…[ƒ€‚̃oƒbƒNƒAƒbƒvEƒo[ƒWƒ‡ƒ“‚ðì¬‚·‚é‚É‚Í=To_Clone_Multiple_Filesets -3 ƒ{ƒŠƒ…[ƒ€‚ðƒƒbƒN‚¨‚æ‚уƒbƒN‰ðœ‚·‚é -4 VLDB €–Ú‚ðƒƒbƒN‚¨‚æ‚уƒbƒN‰ðœ‚·‚é=Locking_and_Unlocking_Filesets -4 ƒ{ƒŠƒ…[ƒ€‚ªƒƒbƒN‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ð”»•Ê‚·‚é‚É‚Í=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 ƒ{ƒŠƒ…[ƒ€‚ðƒƒbƒN‚·‚é‚É‚Í=To_Lock_a_Fileset -4 ƒ{ƒŠƒ…[ƒ€‚ðƒƒbƒN‰ðœ‚·‚é‚É‚Í=To_Unlock_a_Fileset -3 ƒ{ƒŠƒ…[ƒ€‚ðƒ_ƒ“ƒv‚¨‚æ‚Ñ•œŒ³‚·‚é -4 ƒ{ƒŠƒ…[ƒ€‚ðƒ_ƒ“ƒv‚·‚é=Dumping_and_Restoring_Filesets -4 ƒ{ƒŠƒ…[ƒ€‚ðƒ_ƒ“ƒv‚·‚é‚É‚Í =To_Dump_a_Fileset -4 ƒ{ƒŠƒ…[ƒ€‚𕜌³‚·‚é=Restoring_Filesets -4 ‘•ªƒ{ƒŠƒ…[ƒ€Eƒ_ƒ“ƒv‚𕜌³‚·‚é=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 ƒ_ƒ“ƒvEƒtƒ@ƒCƒ‹‚𕜌³‚·‚é‚É‚Í=To_Restore_a_Dump_File_to_a_New_Fileset -3 ƒ{ƒŠƒ…[ƒ€Œx=Fileset_Warnings -2 AFS ƒ{ƒŠƒ…[ƒ€•¡» -3 ƒ{ƒŠƒ…[ƒ€‚𕡐»‚·‚é=Replicating_Filesets -3 V‚µ‚¢ƒ{ƒŠƒ…[ƒ€•¡»ƒTƒCƒg‚ðì¬‚·‚é‚É‚Í=To_Create_a_New_Fileset_Replication_Site -3 ƒ{ƒŠƒ…[ƒ€‚𕡐»‚·‚é‚É‚Í =To_Replicate_a_Fileset -3 ƒ{ƒŠƒ…[ƒ€EƒŒƒvƒŠƒJ‚ðXV‚·‚é=Updating_Replicas -2 AFS ƒT[ƒrƒX -3 ƒT[ƒrƒX: ŠT—v=Services__An_Overview -3 AFS ƒT[ƒrƒX‚ðƒZƒbƒgƒAƒbƒv‚¨‚æ‚ѕێ炷‚é=Setting_Up_and_Maintaining_DFS_Services -3 ƒT[ƒrƒXEƒvƒƒpƒeƒB[=Service_Properties -3 ƒT[ƒrƒX‚ðì¬‚·‚é‚É‚Í=To_Create_a_Service -3 ƒT[ƒrƒX‚ðíœ‚·‚é‚É‚Í=To_Delete_a_Service -3 ƒT[ƒrƒX‚ðŠJŽn‚·‚é‚É‚Í=To_Start_a_Service -3 ƒT[ƒrƒX‚ð’âŽ~‚·‚é‚É‚Í=To_Stop_a_Service -3 ƒT[ƒrƒX‚ðÄŽn“®‚·‚é‚É‚Í=To_Restart_a_Service -3 BOS ƒT[ƒrƒXÄŽn“®“ú‚ðÝ’è‚·‚é‚É‚Í=To_Set_BOS_Service_Restart_Dates_and_Times -3 ƒT[ƒrƒXó‹µ‚¨‚æ‚яڍׂð•\ަ‚·‚é‚É‚Í=To_View_Service_Status_and_Details -3 ƒT[ƒrƒXEƒƒOEƒtƒ@ƒCƒ‹ -4 ƒƒOEƒtƒ@ƒCƒ‹=Log_Files -4 ƒT[ƒrƒXEƒƒOEƒtƒ@ƒCƒ‹‚ð•\ަ‚·‚é‚É‚Í=To_View_Service_Log -2 ƒ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚·‚é -3 ƒ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚·‚é: ŠT—v=Salvaging_Volumes -3 ƒtƒ@ƒCƒ‹EƒT[ƒo[ã‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚·‚é‚É‚Í=To_Salvage_all_Volumes_on_a_File_Server -3 ƒp[ƒeƒBƒVƒ‡ƒ“ã‚Ì‚·‚ׂẴ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚·‚é‚É‚Í=To_Salvage_all_Volumes_on_a_Partition -3 ƒ{ƒŠƒ…[ƒ€‚ðƒTƒ‹ƒx[ƒW‚·‚é‚É‚Í=To_Salvage_a_Volume -2 AFS ƒRƒ}ƒ“ƒh‰ðà -3 AFS UNIX ƒ†[ƒU[‚Ì‚½‚߂̉ðà=UNIX_Command_Reference -3 AFS ƒRƒ}ƒ“ƒhEƒvƒƒ“ƒvƒgEƒRƒ}ƒ“ƒh=AFS_Command_Prompt_Commands diff --git a/src/WINNT/doc/help/ja_JP/taafsusrmgr.cnt b/src/WINNT/doc/help/ja_JP/taafsusrmgr.cnt deleted file mode 100755 index 8bdb101d8..000000000 --- a/src/WINNT/doc/help/ja_JP/taafsusrmgr.cnt +++ /dev/null @@ -1,66 +0,0 @@ -:Base TAAFSUSRMGR.HLP -:Title IBM AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[ -1 AFS ƒAƒJƒEƒ“ƒgEƒ}ƒl[ƒWƒƒ[ -2 AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg -3 AFS ƒAƒJƒEƒ“ƒg‚ðì¬‚·‚é -4 AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðì¬‚·‚é=Creating_User_Entries -4 V‚µ‚¢ AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðì¬‚·‚é‚É‚Í=To_create_a_single_user_account -3 ƒpƒXƒ[ƒh”FØ‚ƃZƒLƒ…ƒŠƒeƒB[ -4 ƒpƒXƒ[ƒh/”FØƒZƒLƒ…ƒŠƒeƒB[‚ð‹­‰»‚·‚é=Improving_Password_Authentication_Security -4 ƒƒOƒCƒ“‚ðÄŽŽs‚Å‚«‚é‰ñ”‚𐧌À‚·‚é‚É‚Í=To_limit_the_number_of_consecutive_failed_login_attempts -4 ƒƒbƒN‚³‚ê‚Ä‚¢‚郆[ƒU[EƒAƒJƒEƒ“ƒg‚ðƒƒbƒN‰ðœ‚·‚é‚É‚Í=To_unlock_a_locked_user_account -4 AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚̃pƒXƒ[ƒh—LŒøŠúŠÔ‚ðÝ’è‚·‚é‚É‚Í=To_set_password_lifetime -4 ƒ†[ƒU[‚É‚æ‚éƒpƒXƒ[ƒh‚̍Ďg—p‚𐧌À‚·‚é‚É‚Í=To_restrict_reuse_of_passwords -3 ƒpƒXƒ[ƒh‚ð•ύX‚·‚é -4 ƒpƒXƒ[ƒh‚ð•ύX‚·‚é=Changing_Passwords -4 ƒ†[ƒU[‚Ì AFS ƒpƒXƒ[ƒh‚ð•ύX‚·‚é‚É‚Í=To_change_a_password_in_the_Authentication_Database -3 ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðíœ‚·‚é -4 ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðíœ‚·‚é=Removing_User_Accounts -4 AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðíœ‚·‚é‚É‚Í=To_remove_a_user_account -2 AFS ƒOƒ‹[ƒv -3 •ÛŒìƒf[ƒ^ƒx[ƒX‚ɂ‚¢‚Ä=AFS_Protection_Database -3 •ÛŒìƒf[ƒ^ƒx[ƒX€–Ú=Protection_Database_Entries -3 ƒOƒ‹[ƒv‚ÌŽg—p–@ -4 ƒOƒ‹[ƒv‚ðŒø‰Ê“I‚ÉŽg—p‚·‚é=Using_Groups_Effectively -4 ƒvƒŒƒtƒBƒbƒNƒX‚̂Ȃ¢ AFS ƒOƒ‹[ƒv‚ðŽg—p‚·‚é=Using_Prefix_Less_Groups -4 IP ƒAƒhƒŒƒX‚ðƒOƒ‹[ƒv“à‚É’u‚­=Placing_Machines_in_Groups -4 •W€ƒVƒXƒeƒ€EƒOƒ‹[ƒv=The_Standard_System_Groups -4 ƒOƒ‹[ƒv‚ɂ‚¢‚Ă̏î•ñ‚ðƒŠƒXƒg‚·‚é -5 ƒOƒ‹[ƒv‚ɂ‚¢‚Ă̏î•ñ‚ðƒŠƒXƒg‚·‚é=Listing_Information_about_Groups -5 AFS ƒOƒ‹[ƒv‚̃ƒ“ƒo[‚ÌƒŠƒXƒg‚ð•\ަ‚·‚é‚É‚Í=To_list_the_members_of_a_group -5 AFS ƒOƒ‹[ƒv‚ÉŠÖ‚·‚éî•ñ‚ð•\ަ‚·‚é‚É‚Í=To_examine_a_Protection_Database_group_entry -5 AFS ƒOƒ‹[ƒv‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ð•\ަ‚·‚é‚É‚Í=To_list_the_groups_that_a_group_owns -4 ƒ†[ƒU[‚¨‚æ‚у}ƒVƒ“€–ڂɂ‚¢‚ẴOƒ‹[ƒvŠÖ˜Aî•ñ‚ðƒŠƒXƒg‚·‚é -5 ƒ†[ƒU[‚¨‚æ‚у}ƒVƒ“€–ڂɂ‚¢‚ẴOƒ‹[ƒvŠÖ˜Aî•ñ‚ðƒŠƒXƒg‚·‚é=Listing_Group_Related_Information_about_Users_and_Machine_Entries -5 AFS ƒ†[ƒU[‚ª‘®‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ð•\ަ‚·‚é‚É‚Í=To_examine_a_Protection_Database_entry_for_a_user_or_machine -5 AFS ƒ†[ƒU[‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ð•\ަ‚·‚é‚É‚Í=To_view_a_list_of_the_groups_that_an_AFS_user_owns -5 IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚ªŠ—L‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ð•\ަ‚·‚é‚É‚Í=To_view_a_list_of_the_groups_that_an_IP_address_account_owns -5 IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚ª‘®‚µ‚Ä‚¢‚éƒOƒ‹[ƒv‚ÌƒŠƒXƒg‚ð•\ަ‚·‚é‚É‚Í=To_view_a_list_of_the_groups_to_which_an_IP_address_account_belongs -4 ƒ†[ƒU[€–Ú‚ðì¬‚·‚é -5 AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðì¬‚·‚é=Creating_User_Entries -5 V‚µ‚¢ AFS ƒ†[ƒU[EƒAƒJƒEƒ“ƒg‚ðì¬‚·‚é‚É‚Í=To_create_a_single_user_account -4 ƒ}ƒVƒ“€–Ú‚ðì¬‚·‚é -5 IP ƒAƒhƒŒƒX€–Ú‚ðì¬‚·‚é=Creating_Machine_Entries -5 AFS •ÛŒìƒf[ƒ^ƒx[ƒX‚É IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚ðì¬‚·‚é‚É‚Í=To_create_a_single_machine_entry_in_the_Protection_Database -4 ³‹K‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒX‚̂Ȃ¢ƒOƒ‹[ƒv‚ðì¬‚·‚é -5 ³‹K‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒX‚̂Ȃ¢ AFS ƒOƒ‹[ƒv‚ðì¬‚·‚é=Creating_Regular_and_Prefix_Less_Groups -5 V‚µ‚¢³‹K AFS ƒOƒ‹[ƒv‚ðì¬‚·‚é‚É‚Í=To_create_a_single_regular_group_entry -5 ƒvƒŒƒtƒBƒbƒNƒX‚̂Ȃ¢V‹K AFS ƒOƒ‹[ƒv‚ðì¬‚·‚é‚É‚Í=To_create_a_single_prefix_less_group_entry -4 ƒƒ“ƒo[‚ðƒOƒ‹[ƒv‚ɒljÁ‚µAƒOƒ‹[ƒv‚©‚çíœ‚·‚é -5 ƒƒ“ƒo[‚ðƒOƒ‹[ƒv‚ɒljÁ‚µAƒOƒ‹[ƒv‚©‚çíœ‚·‚é=Adding_Members_to_Groups_and_Removing_Them_from_Groups -5 ƒ†[ƒU[‚Ü‚½‚Í IP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒg‚ðƒOƒ‹[ƒv‚ɒljÁ‚·‚é‚É‚Í=To_add_users_and_machines_to_groups -5 ƒ†[ƒU[AIP ƒAƒhƒŒƒXEƒAƒJƒEƒ“ƒgA‚Ü‚½‚̓Oƒ‹[ƒv‚ð AFS ƒOƒ‹[ƒv‚©‚çíœ‚·‚é‚É‚Í=To_remove_users_and_machines_from_groups -3 •ÛŒìƒf[ƒ^ƒx[ƒX‚©‚獀–Ú‚ðíœ‚·‚é -4 •ÛŒìƒf[ƒ^ƒx[ƒX‚©‚獀–Ú‚ðíœ‚·‚é=Deleting_Entries_from_the_Protection_Database -4 AFS ƒOƒ‹[ƒv‚ðíœ‚·‚é‚É‚Í=To_delete_user_and_group_entries -3 €–Ú‚ÌŠ—LŽÒ‚ð•ύX‚·‚é -4 AFS ƒOƒ‹[ƒv‚ÌŠ—LŽÒ‚ð•ύX‚·‚é=Changing_the_Owner_of_an_Entry -4 Š—LŒ •ύX‚ł̖¼‘O•ύX‚̍l—¶“_=The_Name_Changing_Implications_of_Changing_Ownership -4 AFS ƒOƒ‹[ƒv‚ÌŠ—LŽÒ‚ð•ύX‚·‚é‚É‚Í=To_change_the_owner_of_a_group_entry -3 €–Ú‚Ì–¼‘O‚ð•ύX‚·‚é -4 AFS ƒOƒ‹[ƒv‚Ì–¼‘O‚ð•ύX‚·‚é=Changing_the_Name_of_an_Entry -4 AFS ƒOƒ‹[ƒv‚Ì–¼‘O‚ð•ύX‚·‚é‚É‚Í=To_change_the_name_of_a_group_entry -3 ƒOƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê‚ð•ύX‚·‚é -4 ƒOƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê‚ð•ύX‚·‚é=Changing_Group_Creation_Quota -4 AFS ƒ†[ƒU[‚̃Oƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê‚ð•\ަ‚·‚é‚É‚Í=To_examine_group_creation_quota -4 AFS ƒ†[ƒU[‚̃Oƒ‹[ƒvì¬Š„‚è“–‚Ä—Ê‚ð•ύX‚·‚é‚É‚Í=To_change_group_creation_quota diff --git a/src/WINNT/doc/help/ko_KR/AFS-CC.HLP b/src/WINNT/doc/help/ko_KR/AFS-CC.HLP deleted file mode 100755 index e69de29bb..000000000 diff --git a/src/WINNT/doc/help/ko_KR/AFS-LIGHT.HLP b/src/WINNT/doc/help/ko_KR/AFS-LIGHT.HLP deleted file mode 100755 index 2850f562ee6c4ead9bd04ef67976216803f7c683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238038 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 y-uvvmPjtBw4aTn31`Y4)G;0fCj|Nj8x7|{X% diff --git a/src/WINNT/doc/help/ko_KR/AFS-NT.HLP b/src/WINNT/doc/help/ko_KR/AFS-NT.HLP deleted file mode 100755 index bc122e878ac667938cb8c4a97cf6b849639e45bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330009 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�nx-cR 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 g!bV-@iIqzilOpe$o|oXf<=0qp z!SK024AUy5T-g8u#vf27Qbav5|A+aVk7zt74zF1gMl;m685FlFE6e<6bVV6jJfeeM zjpMQ~87#s++HZ`+=6=upJ=fI$v_six7ETx6G8mYI$Mb;CW-qry+l;+uqpdAPuU^cd zj9iY{yIjFEbJy-gr6CjzO7Hwp-gns4?RS+-5%%3}4u&dxE%`1%trmB`JVyNdNVS6f zvbOz*`+rwNe%o~GO#`Cb)e5tR1ud6zmZ?w;_Ptn5>?NDNa<7uSm77rn^aMcgfV((V zok6}5SRCLI9?Gnusi>Gm-L5035AGh6{R_|XS&hG$aa~Ns3%4JP3C4eROLDPh;$ivK z2iAPyoS-J$%qWH+YIZ?%zak;@jx0Q61gwsxssJkWWTSK8$8Whc9)Guw-S_6x?a0nfv5#t7ND>Ct4_v>o2eZ$eT6H1x4|OlK zS3K^%d%*&e(Q3Ou3mXHAUS$Rr2g{b;Aqt8dV#B4&ySj(3d#&f2XoinFAnsWdwfMH% zqO5%;5ZGO(jpX&0gKzP%!)2)&oqs)a#QXHy{cHS=f7~^YHqY2XDGwvyF|3NqZw<#X z;d*}9^I{!N#AplLyQnrU@(H_J)@`7S&nbe}u*M1WU!c^-NFpse+}b)c5QK?ny6921 ze@W`gU6c>#ZcDkkm3T^Pz_5}k>S1oI>S}*EL@k=LTnbK{W0N(mAJgTIHhIDac885+ z*h+C`OOz&yff!&fzBmj@YGtrN8F)X*huc#`{vT5IRK>j;qa~e^_=fw(oYrSic1}uE z$ZN9{$A!C$oEEaesJay^MDc4~A{VCs zm0-5j{;-C*IDMDy8hAE93fsGkGSxM$w|i1C<1Tf;?vS_(F``=abpDQq z9d{Ilb8}o+7_y!9D-BlC_zs^Xl^G*Q?ZE3@q^07ZT5+l;z-%r)mJnLOhdyN$aMgo^ zrMAHtu^F^(UVyNVfx!3jS2Q>batWdN;2ERD!Z8Ktp^eIUo6{yvK55*&}F-D(51x(%Cvd(dK)`={J2S{wW+;$dZ*T2{6S)hC?3>u|-v>7=LeUc9}=D)Qht7Dcz$U4`C;MtVddwChv$cvpC1vPA5ngOWO#mL`T0@d z`BCNPM~CM}m!E$kJpV-b`7z=7G3DpShUdqYpC1>VA6I_<$?*J><>$wT=f{_ye=0ox zRQdU*!}Cw`+zD;Rqp;_?{?m->PZ4v!1Pi~P-}yTm%p8fYt1jga+VM;1M_#;>B0m4< z9dTLxVSU&yyGUyf`_vgI%y5!Z>z3JkD5)~l%O#YPDC%W74S0pM!u53J4;rR+=*%e_ z4td(L7F#@Ik;O)e%lRwV|8Xa=Km6u2Ps{ezIkF?Lj8u4hg%%MGh zzb>y&@0=hjsn`n&k~?)&U7VORRAeAxQi{lr`{nt(cX>N>b`FzZ77fyU*JFXMji zp(Lo}qlx<8gkkw9`g@N4cZU8qF4Ki#aeILQ52p;G2yMewM=sdB$_3DzuT*xR2wms$ zwI{jRVFkt*W0h$jW_9%>89#)gUVmKlY|G!2X!LBURr&N4N*_gCUw@akE=M%3C{fJq z&$#~^1H(^|1KkhDh@2yv+9S`)SVz``Wk)7s z+udC^7`tY6wQ6P#k=V7EUtyRS^J%5N2QmD`dy#c#}*1EGYfpEGvv1*;Q^ zWxLB1yMVvK(!9H)C3r>&Qw}@smR4O>78jvV%TCj=B-Pzoy|M-!iZB8T_un-u@9OK3 zRoC;J`^H@rIb7f4Jaq~7Vs;IXWo{Qsu^bYo5ZyAg^QVh{x6^_?EtqoK+;%U)lk2l$ zZ!)S8lr1U3!!wM|<6`?7(?Z$>&v*Ph@XsmKk+W48Ibuy@-*Z*3#J<6S>Fn4%jcp9W zs4NB?lhC%7CUWKquJh@`!)ANQCAJ1OF3aM}u@t#f1kvLKRFi5@8LN5@X8sET$5bXL zA(X$ARQGmq{&3YbCLFaM*_0w+-c2?g5767xyZ};{dM=wM$b79Q7u-RmF_fI5kJ|Xi zPxz5F*Z>B$wPmLE&6soTzhQFeh@?1oSIS_DI{G(?2ja~Eh_quqn@hQfqAvH}XmD7_ zY*}aDIK9HvRg!OWR&@b@0TZ(^cQ1vj4Kz)*@HNg3hHA?V*Amr@!C9EES#=Hn>bQ;1 zS**vZ+I(Qq(EHcE`}~puK!euR*d_sRbFIq~FF3O`svlE4BD^!Z(7N?#OL`fM#(Ipu z>S12Lh?cH8T5Lnt=B+}#7`feHtWmQNLQU8$8CcJqb5_k+x_pH@x~oXCh#A!E%4ZaN zE;$INB~BzcREIZ@(^hX@V$i8U;VxD~j%rAnJ2sTR{|12Z@ z2ux7l6YsxW!`RyAEqQUc1zkA2s8fcO?Y`TGN9>m6@opRd2vb3T{|A7ynhFY7=kv{= z`IGz=%s=TLY3{B?DG4ndP4M^)Lfc0SiVog+B%Hd78Fe5wgc3F(CM}sG@Cf0r8yO33?U?7$B@@e~`_&w< z3F0MhG9Ua6$-3i`DJ2&(_+R|Aw!*pdve+4Q-zjY39(O$4hl4253c8QW2+G%;0Q=sQ zw^B6N2N;7Nu-!zFaysEXF1WMvn(oz0J5_^nBSj-`A2`^Z3?9}vwlez2@cv3WQ^1<= zv?%*piGH}-oqyT&1WtvgT^Ukf1qD+J z?Ua+-CQckaVbTN=olspY9phmbP?-Ee$CC`K)#P8kc;yXtqZM_IU=r;}5hC^&99h9# zZd#f|A;}Z`U?z}AZZ6h}43v!mv2}%$0DNVM+*}sA!{{7-G(Vmmo<}%@lV5NV>~9mE z;G2#|JD%r4baCIpn-MZSe`%lHw?>zkl7p;s{_U3SO}F9z((*eN&aN@jUojo68x0nt%=WshO#F`ZGLRi2(!;88dkX=-Af})WEaAx(DOdFs+48IbVdvf zwUG$uFc}5M=V-juWHfweE>Y(T6s=JN%7avTY3EjZZOUT>UM96;MR=uu1C0A%#?_tuH;@2pkJhhr})Ggux9HFEr8ky+PD9P z$%a@LVC{D)jO`KNF-_ub=nlLpSgxfsr}=>eo&~}~lva4wdLXQJG6dd(fUbrg8sb6U z&R?D4LsV@Es7ew<&o6k|v{%W8Ubyumr|F)BsiM?x6L&1PqeGfbl!9 zAyx`Zl)A$eBf&Gf=T&!WvVR$CsSltD+Z0rnptL-k>uiT{2jmK0{Wfcb+=B}Dk&rZk z4?S{g?xQqCcv=#~hpF!oZ-|p;)Vr*$zwPU0`G20 zb4I~E6F6KDWt+#b)HvMO)j0eC#&9!5%|1X4p)Jq-g(D^1Xmtt>XLEOy`MsHdlE^aJa6%FVIP2k@^EE5+R+0G-7as133?l|;Me*;Oc~)}Po6brv%_7`%Uh_dijycFX_l5Q zwM#qi#t9H_N1{T5ay&(?KS%MiroA?6{OO0DTMbWcZBgVDa%|>8j+~frf~4bFb{t)D zAG<=yR zAUZt*2WFPe#TVcOMshG7NE8bxrqpmY-Y*WR#+2nNyQpvmMceNh#w05GpRTMwNqT4Qb%zE8*CG4H@ zv078BZyy~8ad2%AjxPbw1W|O)m@&F!>5@L_o8Y8S&!cI~_g=Fxu`O|aj z;-^Vs+x|=7(#*YzBG~5ck8I;NF@ztg%-n`~f876(+nQ-%d8@Us3>6aM6*rwV^K>K` zA&~C^!kK>nLVb(FT&ywPINV+ugcw!OdzU=hYq#Clj>;Fk(tSPF;=IM^(aQ1*zyk|u z@DDSX<}7qn!9p7Gn+}LXtg%qvz4M=5C=*~B1slRz{c=&^Dv_~Yrjrr;05P6;ZvP1w z%^@aHYl=pTOi0#uk5Pia1wql?Kc zxE?QHt4(fgqbVrh83TsFXsMz2CAGfCfpK0OSL4mDmpXOp&catQVmcRV3B&?iJCJ6X zrOBj6(cHTzg5xZj^s{3xho{1cD_C}2b_)Pi?_z>FMn?hETL5)*4XC0CLB^!D13IPV zY*qx>CvaXXKx&E}2a?(Yim<>D6rULr(NkaG)Y9=K3d=e1l9jC*mmCR`RUmzx);*?b zlhu2l%pesP9zqc`{SS%|eXE8Wqm?v?O;Y%WxyBGtV7paEWdLDlcJdGAEwhhR zDIO`f4-&+M35NyksNa&8mfQqp+n?}}2}@q;zTPHa@QG<;Ujaxzy4o_LFTH$}K`DY_ zZ;A%?L@~JO%?B4G?{Aj>!vHSbSDV}*8|*^OLAfuspa`n14~>x3mbb+%2033VBg*sq z6->Jw7PMH!`Qz2pxRwCLI_G2qcKIOA7>PTxW5Tsg!5~+h>qFM05`GOF;EI zJOWmmU(?Q;Hofi4y~j;D?<~@OQ}NrB$rM5L?^N`VJz9gT9JwqkJ9`eyYCE)#%@b5+ zm!CDkG}bYtfOHUQZl-d*dxAM=ww~5=8cz@`8p~~z=7Qyz!dMmTf24Sd)QnXfX{Fu6 z;cTuDu{IBBM9x0MtecX&c2FV|8LAU0Y!>U3Zl^A&Q>>EPO0x_}I3;YqN9ShU$uS8s zw^b${{^Qb4@Dwv|G*eb2D}%sc9WQWg`R>D=dhW*=CZ*Bcq1}PJdyUrCYt2#L^Wr>W z#8=qo9UXJmhD|d&#k(5Ann#v0gll_sfs96^CK!(}CNyaM4?j7H2c#9V$GIHT9{2v* z=H~8uE?rLN_c_O1o={9pPN&J{6g#$Xy{q5rDV}0A*Sp|TfQ+a{*^#1l|3dLhdT5PF z85vlzg~hTvU6j4~Ut>5zPAfqss`C$?9|5SzM8^TaqZ(jP|L0MwB@CunU0vJSt22QQt7~}ho-&mSFr$-WK~}cfe2wBUJ*zfKfu|7xsawh7 zAMv;O`P4bgsfEkUYm&NH+-#+XATz1HX-NHI=oMA@Ck9D!wQX)5TIz zG2J$0g2`VQ9ld7sgs2qf{3!09`=*BtQdE~Qz>6(d+^svtl$tc_>2BF-m^ zg`$S>VLtT4sVx-U=^@5^4h0{DwW{c8U*QMUvDci%CPkqc!#B5-_>j|oclBtqShPg= z&+gOixwKlkvzOD|M<@d+f^jWHK9YW0Z440yyW@5j@jx%$bpa198tf0sio`O21gYNa z%pwFrPT7ni z+zKqkNj8rcb(fux+{JH#X)w ztX#Ef?-_RM^;UBhBY8NarOHYmP^2TWgcu9A+nfVj`l-`g#b4T}?v3AjmOXmVw1s73ORGw>qk|%aHvsw$GQ#+)m z`n`Vh%sVUS&DE57X#da;i_mm0qOI<2$4CKT|D9i3Ck51>tZ-U-GZgq5e}(;>FGV8o zJAbgTb(I49Z1kfUk&lEqyKN;!W$C=5zWDa|v!;})*af+&V)Q!j@?CeSBHInwZaV>v zD!#R0jzv)%nXG;w+XCf!t!=-nf$9hGc3fVS0(UITMipc{B|#_&qyFxt4C8k`)QJoxfjd$hWU^<= zNBL$7MZL9O#+Hui{G{=?7aI>X_MY*eh%js31#bQu&ZnRFhph_Pu+^IPom(*fZdX2g zLGkWCo*a39Bp!033E08^k}q7;d3{(9>j({?#0vf#iivCAhJQq~&f_fZm?yOjREs&- zhDL;qzc4zFk=@w|>D#+{@@sAz9{>54T=QgW;eR3FM4$nB{Tmqmp$jTdcG_?G1F;`>&tXcH3(*(qPfbau0JI!cU z3^>Ly^7)r3yHf=B?mdxgr=)`w*?#!ruF1tnEvvp0u$IfWqRpgbH09#lbvYsF#t0Vw zWj#wK3E)%c-2-iAOa*AaRuqd#1`5{eDYBdL;SH0432~TA4O;cOMXRJ80{L782s-R!A(Sa^2fWh0j z&Gq+t(6?VP_E`V(oacXhNOctD4zbWI;J@T5YB-;xc!cC`NbO}IjG2^DQp_NpS3mP9Qmgqs4deM#_HOmH`*$%)dYaKp zpvT9l@>Ytvexc}oN7sFo9_0-%s?DP8LQ(JMtcV2pw5wi7|NW=`jWC12OP_sl>hC=j zj=g7dW$w@v`~0O7AE*(eD-Y=QL-!}eg$aLBTyFHuDFS~EFnEk_D;O$LyVwBWd&$Ys z6v2HQtC5rWoqwxgp$1_p2`;-3TCfXydT{^qoxh6c)Pvu@`jHXE=q`HelD}2QK}OKH z_h4&n`YJv1?2~*Ih9~JH8KI$F1emFeFq{9%X!C19#+RR^yn~`aX_<8Zzw;9syLqC7 z#ZKo@_y4XmjP6e@nHL{mjU=ap7yWwCtHXy6ry&d39>ib4vR$uV<*h>3XoaVh-X*-$ zi=!xq4%#I1b@$-0R)>N}uZHrQCEHels&vIv(bxX{+^v*q?OUrjse~Dwe|RP?cj|1F zwWEvpap8ay8H5IXi`OK~;!h$x*o;3Mf^|NcepLN$TF0)ac+Pc$qbojw~ zhpoRZIvZ2%Y|JrZ_jM>#^~2gGou%Py8(MGr+H#vfRBEK2rqYVSo3I)G)jlk(ERqkK zd>YpnO+K?L8l90xFFV6TU*)fOuKSL`*)?LKx6Rz5%0x8`h%>nRmYA!tWJ#Mkq0R1_ zjTmV9TFf%4ic0_Gq_%U$>OhL{xJ|%g{hgXPvPBc@vT+aZw6W7C$CmO+OZ86*BL8!f zW>0IIPIG6pO|sE#owQbZQ#8^HHkUDE?6m3QrcOU=%Gl}WO|f(!DQwL@v1So9;sqaE z83aC$5b~*~8}n8+Zr5{q5lnr3#S7EM;aT99xT>$QS~LGZb}XE7HLyt3y#1~yZuYNo z$|+6I$h<#$!YOTIPa8MA?VNGvjXibpR1*smC!98Zx+uPLg4y+bEEYJRNhe6LNo^-j zAA8Ew31>TQd{@$H?QKD`eVR5lD{;4m5lQ+=LRC3?19GdR0U;^%iW{#;RE$2Z5zl!@?CBEKhqDB(HY zdhM{&;+)X4(+ zeF>9=mTO-Xjjs#lvnNkH>&&*;ax<9ApCs&3&iPtlk!8Kzt5-Y{&0`U~yx#PNb8d{{ zR{y0Xt39`6o>}U_&K?CDT*y1gmD4xcBwHdjIAA7cavLR6rWqfcI`OP&PyYx!<#fBWg+&~*ks|EDrh?e3Wg(DU1(eNHG2Gd98unY;*ol)*bCV!d#r4-kbIoMVnd8oA8=G*x4LqjUVpcW# zAlNsywr#q;FQ{KE@^f6#E>9lREE#n=a=o zVf^BaH_5&(ZhC%(OE{Al#s@c{)R}E(p42vV?Br9&j*CXbyA#?pc`u?jvmMA$mgu6? zb|}3mDABBul9{nOZKU+3XyoW7gK{az7*Rq}FdO9+Y{&FA8&OrlzL6Z!~*1 z>@kT?G#RfOut_#Y>@j@iBNbWGj2hF%Pj*&n%^WPfDUjA|a@nVnS7W_3D)gn3tJw!d zljEDwL2zm1gxHvV)- zw=bPrP2LBY0WB#Q(IQK9W;|dyuJ=*IE25F8(Nkaon+9%@hL+_AG@)b7C|r-p7#lmLNn@;qCY*{9TNt5!bszH(GVNP^BpNnj z-m@pLPIG+AYQF8%nr3MBK}8DqJxL=*5_uN?9d;O@RmF|yU5?qO_;x5o)Aw4aB!_K3 zEnVed(SO=b)L*^)!{AM-dvMLx+_^j}$5U@Nib($|MV;h%<3!1Zfm!7Wg(O_0)L>VP zXSTaE_NI+LQT`7lz@vU}&F*Oi4(>F0op7SfY-DmVmHsb&iEo^TO<7$%PUE$QTGrcs zEVb57TitljC}qL9Y3kkHH?L8t>S!_w9Y>vE z6j62Ln>GnP+2d^z^_!K3b5(dMHrIqc-=sx3p#{m$X;q%z{KGEnsXl`sh9SPZoT;HF zvb*$12ne>@i@BM?F0#NELhxX?$^y7bNmAy*&<9gA%nLW$Bs)z&eYf#Vo5R6PUQFLc zGQDT`$=>p>|JX({Za9}ENrOce%GW>7Poh!4IYqBX+-2YQJOsKb0JyH5GM5dgtDJn@HtMb-r{Wtxg_ZpGNO5m z)U5Vc#czSyC^>U_D33sA&q?p_0y!nCVsn2!ej7!+bUNVKe7rG{nwRrZ^HDE{jCAuc z@#xz8(~icr6pgQ);`c<@gh7eb=bsZw-mT-Vf7+Yc@1fT_`5SsVhTr+wjc>1C9xA&$ zUBULIt}IHYs;&|~4iYM=De{u8$dh=xT-RH$vV&iAB~aiO$RWJ;R!;ou-|oPA*kGm} z>x6Y&)SJh9dik_{cE`;t7kH(o4ul^ON>d;TPLT0B{}UxdF;QgV92z=14Ao%ey08XQk^edv6KEkt!qK`O=eY$e6A&wLYrt!crCNtnF=p)*KXX=iP!2>b%q#DVoEJb zr`RIE*K^M?VJz8H$nF&s>t58<6;Pqxu)Nqog6#3!ioOx+={T=vu8#~4pjpy7dQc{r zVVFwfp3%W4p15$Hcy3tY+YYcNOq#o4hl_#c%MfvEKDmdfV5}Dy`d?s`wXllVPV9Of zY?ya9R#sU>{RYHsqI`x^IAo8>r zR-n{uM`n?^zav^or12yDC@tB^&Yt_1-0MOK!M{nFa08+`0>?fLAeeHA+bs7_*8MPP zy>%^))we{~fwPo%QBN62{L1AW4bN;DPQTHT0o}y_@y+^nn((NoZ*=6s ztvg7{Qdt~!-2k1-Xb?O)n_{;KS$;gbeCH#(d}ud7SoF)zMSaOK=R;ajIp*eiufBj; zf4bejP%4SC2(!CfQX4a@ZL@IiQ^v#bZOQN__=zB3<{!L?ZQ$pR z)F(nCk(TavAqT_1osE0LrgvSRPL~atLT^lX<}#!ItEHz+yHsRg4mf6N;>dt@&H`Vj zNNp~Ut)q2|0h6j#F<_F9Q=hgQZ$j<=WA9Ah>?*4Ke+hdwTu}kxvWUP0P!z?0$`T>$ z`=)5vf}oHv2?DPFO9E&RlyMkk)Nv+2*p$$LES=8M-DK$iAz>Rfl_j9;ivxxzAph_0 z)N@KbS4On@MO-^|1xo7#6xxk|$%^}$mzG0oV# z1WBa@W5=wn>A#H`74~8<@1kf0-OJ!?&A+xzsUH1^O09WSesKb}RvLq0%8;56+YoNv zcR*b179(D_wEW9(voQbdPxERgMPat;y7WP|sVvTbnJ6O>0E9CZaGk zHKiQZ_p+j?98@C_jern%a{ne;3I=V>2O^D8bRmr_HC<>Vj<2rk)LRjktLiy)4Pga( z11augq`$(U8Dq06pB|x8(fzK)`j)dcA6d9O>kYcU2*Qqpc)CXiHL}MR?0G%tuy}#& ztb=8E@j6qGoVgwLu$2r&!zbTs5uCdd=UlJ0_~{X$LZ_pW0=$ zS{)jsctx2R4KID|=t+}Bb_O`wjiM&5r3rB=EXQ*_k9bg);{%1QFn@8X@r2k5gdaPh z`L>%o+I;dpo32D5r{OJF&Eorl^|tfYw{tN0F~ywbJilZ{VI6CII%aP?qqIrl3IW^B zj5Td_n+WE%&TV5jbmDQF2==xvpGA!$F_?san_Z~bEBk5?8DVwTsJ|*V>|S$45o;vE|H;JYb?s^<K9HpZqBW32j+MmB!)tFxC8)BmBevsTT zM&~?lvbHV)tYat|?&jymZG|=mT76^AW)kDWuC)`!IBjf3FFlLjDK$$CrqbJMBgljy z?*phx7Y?mwoOv_^O}}9M>{~#UFD^b7oN(c=LwP%EkrG+sXQzNQe_UAB{ohWyDng^S zzp$EHRFbXbJmlrJQ;+g6Db)h4wGW<B0hClMaPou*E{Bn9fkWvS_Wu06pNY zJKkygPcWZ#hsy|h*Fh*Pf;A?2`O?M8kWA6P%c#^}Ret*-z+6BkEh%BKH=py*7awbZwNi%xXH{IS#?lUhZ)QF8 zS5wd;?i+8fGMqUS;Y@2xCLOT{=Y-)!60hh46C43FbWvKo)$EGN!h+3Lq3WE4V@OW2 znSbQ5L`|}pkKVH+_(H2*iIZ6Ox}yXq((l~;(oPUBjV=>zT5w(ymRdCu>@y5=2t_mc z$sc;&b8W(VeoUo!k1B6i;QVY#I$(@OVFzLbLfH3tz)KAmOq53CDI*jDJ-A`;eMM6X zF+y{t7`cb`6d|Y%ztZKl6UO}pVDIIAt0#{efX&P()8$AijP^dYI=eOd&)K#-ZbYTo*xSsQ|-I z)Gj6rWLx^_+ZQKs9e_k1ynpUo5=_Nwcx&trwyWnG&GxLWK0Afhl4mq%;d8zWvvJe+36duESK3b=Yi!>jeiTmDlCcDZu=uPJWi3Ft}xs$RJ zpNWgS*h}N8P;qn8mjk0F%iIoYEB#3$*?v*f0^T0|>30l5F;E)NyB4pX33d55ip>JW z^`bv%h^1!Lpc$;T7G=!mZ>mQLdtYUcUIYE>^{B_emh>oL?x3FaZFd_psXuy@IR0jv z+<$xU3qdOX3v{UyIvFR*7F>y(&;Wra+nL z2ZM(Xz3hSpWwu3@(_EDjOX$Bk6>)7{Sq=TgnV^54Hg{_qO%3 z6KFTTw75UGGpjRHBwAJ(KU)1&w0Y~=-=3DxW_30H6)Fbmwb}5_wN)8jqG~Y6zV!+5 ziVRTnXmXR49mr50joWUO2U~mOkj`bLcR)#pXICMJGl|W#SEokCWSBNY?~1FviP}(k zlkf8vPhZ~tw3P2r6y;J9O>7Je>4;4Jk>X2|F=5AJViBE}awi9fvaXJ8rr*N$O$wH4 zJg(+*czz^BWFit(SNRUbrF9Wz9iUrg?GMje(7lpYG$40xtWvVdDvtfKc56cfIp(f( znY5kMd@o&TL=RAG>AZpRtmUGA;-UJh${#LUKdT>Twl$-zmk&||_-0F^R39$jYcT-H z`wh$GO#1yJ%O&*nO`6OX7SHyrwD-1LdOm%2n_DiaNYp|)>HNv>YgkB$9{g5ybrw>k%PJC#X=XAA zEM6VbdL_{dpL@*fpzS0oFHKny-AD#FEmiz)Ol{#R0PrjJtP$)0 zB}gLRnKkz8xPNp3_$!5@^E)2aA!%wKhjo%AO8Xa6j-d!+qP~x-&s~Z(ClZ=@Xpjpo zQF9gl2?SKYbZmoIk^JUEuRv9X#8!YALEqZ^(AfV%v8AH8buAD5`x%w`tIFT43BW8x z+v+Ko#OHWqV~WPI*MNbUxBcAahy3N279i1RFTUL%Bd&nx_n?G+PM|?ls)-fCZ$b5u zzAI}%lAx3keZ)@%TJNXVrj!J6M1LzeP+x}sV}js7W<=V!rg*2dJgFRzkjl@g6scI{ zIs@VQRgsgs%or7ITqN}!8f&SI*BcSxESPoUykC_rPbG&toD%vy9yszJ6xZ}kIwDGA zrQvTvK%p-6_mL7N9z}kuN`%?m?hZgxCA6e%kTcCY_R_45MNim8Lui$~oanH*?+m)wENinMT6voJ>Hr_gSW+ z5p}^$aSgQ3CY&NtW#<#q+U=~Cr%FcOFLKM>=BvbG%NTwRg63xDkB68e%{YY{2ssb{}2 z=SjwuhMw_N5y0UluyAEb(^pv{^B2#W9F~Y3x!Gy^kE@B5J>j5jUe{>-odY~o$Hf$I zaWq9UCki6e&8b`eVMnsw+JWmT*mP;+;$0YZz#JLg zkLuOEQcJT69;-NPUQ(xqwTS#>;pX*An|1z*##U_qr)1XtHu>(A?d`Q~SZ0ou;dnZD zMp)bxZVRjSjgh#dv+d75B3BBj6Wjh;W~vpo1Le(rc>dxtK3_&B4cQv9Texi2(;?`! zCKM}GUTajudKZ&q>wK>yR`lPg)H+w?MSBd)Dy|z_2e#Jt<+05un&^#&#I^pJCTqRY z0?2pCy21{|ZpgH5s7C!AwZTBU?FrY%#J;5rN^LW(#AJ=5r8&pm_dIS6|BL(U{|}7g z?ermPW`lmgIQy-h;4ZA-$m=VC=a{P??rGuwN}XwLMq2wjv{wctnxzw9>sscn9SYy! zIi=^U4B0mKn!AK77rj;b)$LiJ65ciK}H`MAO(%z zpfsUv!G!T8*1+^<7tBqM!kwJCTkb@F9ng-5nb7!CoV*Ck*QP&)#t(d_ zA5@9~sxtdr-Sq{4jq*93kN-UH$~~^B-eb?m6_0Pi6~!zn>Pa(|qcq_*giZcCWGJYP z9x>1^hs);{pY5AXR+*$@jCNH{Ef_hF?1YJBsB+>HC{^^oCdJhJmKmm8Xhn&UYNm&b z$*#C%%(i1DM6Q7@oeVCU;GMbm*xWeEetp5*z@pOdU|R8)8_HONyegNdVTg>Fc01 zIp{=dqSc-G%wd$L90Lprb6xeU0>J`ou1K1)#SKrLH+nPZyrKX zzZ>p7Fxy@&ZCCt9#NhcOpMhU{@zGc8M1a@G%w0VbMRTb(dgjLE>vX0lR1IM~oqK!d z5Z`%|Gan`=%&Czuk1D}QCq&4ZukhFW)u^WLGcY@a&-qV_Sz(jBmne#o6^L}c^7sq; zl&2Z=%k-O$d7}095duA75f)6jKlZcKh*v8ct&2;(7=U7uZqMwlc0^634K|0$V| zid$Q|P_<=RCdG+PN+4riUFKMT7tlRPeS z??G}wc1ahSmc$A*^+oC~ZM%dXAy#iNCQrW= zb^1x}gP;Ah`Q0pGoZVq=Qf2Hsh3 zpiL8Q5^z^gslTdx6eIiyUA(tuc((I!VqG0YpP^F6tN@%#>7eM>|e$*n@>xG+^_GJTc^R*qG{XhAWsULC6>mOU|po3 z%2$iJt3?s76<3R>U!J!@jSOxD3&^ro?2bop9djgio)_>CPa23 zd)>#?^f5Q?s!#=5bGp0WBw9{sjaPO_X8=pz2Fg2>OX_jHB4Oj1SW=BvPBw{*e z3nl0TA^T>u$O>U%Jt&%kG1`|Vc6mHhlaWHd435DPnN({z^El)mFL3^ ziH)}u7CK)2X)51K(O|~$w@X+V{LMBWlRk>fkEwRT=qXqj5xZUQaynbayTIBYbF zArML$&UXZogZk>d{B3foe3M1`E{X;`W#Yi>G{OBJ#fMs`H?`#`Qzb0b@K@xj-!;DS zJV(NtgK3ZA9=0$elk4YpzwN$-31BS#LPbd$PHRLEq6j7)Njos?&la>g zt^wx2oq&jB6|FH`jSZUR#XNpIMdb2Ph|w?qE|E+KbX;-br>`ET?FpZA$NMok8#VpG z_9>A=p#wT{(a{TS6q6m#C2bBn$2coQwaC4zxCgoBtSk59L;_y}7BiTYZ%3;||E2(_ z{;G1!g+7+RGE@mmCOG!u5rv&-EbSD(ej3l*N(l}5%#3fvRWuVyJeU%C`7+Is;`rZJ zpBf8CsR=Ev|HuoG{X`*B>Ir`xE&4D-Lx|GtL5()b)r=uXXwq|Had{R>M41bx$|2gS zEKy9K$EphiDoL+Oc&O$jPnGe`^6{E$BgDK~x@$w8F?e59+K6!urfAZC32hkhJj*nS zVD#^5D)m>D$9``hhxr|h;<^$W@1cmOo}_rH*`|T(;#8{#=Z&L}p_I_>$+VOIxZu)_ zqDh8jek-g-|9irSOsj!hcK`67p27{0@U6F-RyzMWBFQsl-Isex{YBW&8MXSxkStt{}RMuOOnTw@G;>J`X9eIEDyfp*DPeoOIm z-_B~LziQhxkikRQfy3mDa!%?hxunGLHV8F*RKa#!&79KUF>nq?6I!Yf-;p$uO+APs zK2sr&)a#9sW{q^Tw>>}i2GAaZtplf-J9qKaDl1Cd#!GG64?l&EfyZ)bj5&cDDR(AI z+l64+i4y{ynmm~VFj>H336Po9<%p>0o+&wKjdjh7+J!TrtS2_)tY4Q*79%mBqmP%J z$t~ZqsP$D1xmq!{61FJLGczgZ0U}dkPTfwT z`Ri?w#-#z&<^=Mdj;?mjQkaNEPvDluIK`~)^f`EcY{KwCYMq{YZ@S4?O4yYop-#KQ zB(1uWlEM~EDIkiZL|ykVeMUHQWS2Zk!f;fS>cMC;X16k^xmjo+XMGeYY>GN8Pz_+#H7k zSH*b#S7NBT(ZGO9WwF7@EHpIuXe!S9Uc4_!ms+MFk+A%-Fb0u`BM_e;&Hof4e-cHk zl9$RiB|W^u%z~sF*F-7MX8*QxMi8g#Db0A57V=-&mx zJjZ@-6OLVj#9^Sy82yH*tXND(p~i14$Fy1A(JoG{2r_djH|!9&?LQgR$|(TU^OxK_ zCy-Q@-2%K9QiNblvUzLvE{3#ZWbP&sx10kbOSl(fuqYPA?nwkJGvD?w7x|-gstZ}z z45}d@or)`UxV}~&)3j&@-c(f=5d`GHxg(6fYk{ZZjn*nv&+BQB}B#nJE4|p@uXcD6-GL}VxA`NGKLs8e*PIAucUq&-=swY|DMz@5MiClNMcdSWT)11t@VFDs$I;PQ$YtYvuWIi#xHsx1h(_ z9#|rv=w6lrO;}6Bd9G}~DbJ?=X2By;D3TkJvP^Q}n-r0f){|V-`LJT8qwlKfBjuC` z13%a0TxxU#~!W^u1UT)_8C8hf>X;FCxJ1PA_Q;W z<2l0>YnPnimsE-~sPfXKjx*%iRWpIMJGC29G{!S{!V9!v#u}=}r94y6t0f1z#DMqVwMYv|*WX7Z45x@9F28-CWp~WaEWT#ye>5=Nf%*o$zG(P` zrQX1nES4bhCR7=h@e%vR0s%V6iYJq>$7P@T?w^Ed~0oObkUfiGs{*n9nu~}31UPe_?#bAoL1Ew4dv2uzkAU& zv)7oUPwy=r-!|->Sw12S)%*Y+>+@GxWJnbQ=uk3J@O8NPFx5dYc1~uFBE|5S^YWUN zA7bz9VV-r`&-_(g^R{K;Tm-JYN)_GlvUETnyTU_F3{VT2c|T(n`8~+E%?4SR*dV{6 zQXE>9M=ZxfEO(5qSTQu>cmiH|i}&WaO(;U%W_Lthy-VcPBMY!+;_9z1_2Hpk4KtUshbXItH<3<+6pZJy?dS{q-jB-!}Z9L?^Ra^NDGHtMmlLCnMG> zTM)6@#7`6Vq6;2p8^pPw;`3>9KEk~5p=zU1xjm0rKa8ST7lrt|9am}QBNKDXs+@jt zA6B=&vIJ7C5mssGD}L#97RuaJUDu#x)SX~-EQ@InMFevx02mGbe7#c3xPeMl^ibAY zXHa^N-Y2QrfFi(E?X8bZjcl{aFE4Oa8`R0oc|3kKE95MSTK)QfK~A&Ssd#!V8+3Mg zL1h0I#w_1<(u%))?7JVDGy&G^8c-j4LH#Y8c7NwBEK2kH>AXR>c;cWV7$_^4SqW-e z3~8Fn%~JOTPJp&JZN>CkVc%W9>z+(gT}#8oaKrp{b-4}$+;6Fm!E(|ADxmAdjHkIZx=nG6?7bw1(U$RT*lIP9}M|LJ=YqgR}C2?V%md&=?2L?V*ZOU3_L&Zw3Eh-9Y6Mz zvjWOzJ-K+k7ybgubkn6XUygUGyd}7t&wT#fPM|t^V2o{xI+iJkl<39v)RE7AWX>Bk zS#OcH zOfupLgAj+vof>b(WYSY`D=ySBzz8JE(YOai({nLM78mCX*937?i-vkzFUHJi{ZkZK zr<&456nUZYt&2_6N-AiUUh!^m*-J!KHf7S01G+{F9he(voi-D$ZO{G#5KcoC+r=+uton>U%vwkiDif-A!EO}AA>9DH~jB5OVLBBJ+_V^L>7>v*qwCKo(ghzKCM0F6!whlxD;ZIhjcrfnf4o^6+o*S3~#< z-T7UakQ^Z#7MfTXMY?l-Z+>L@262KU*IiVEm#MLR)9`aU;~CbcuChVRY_ypHrFICc z+KgzozCUvTVDCo}mL?7w6z*OBvBT804VX#~ATn@HVst$uUqv2HzzyS*o#Dly;WRtT z7u;kY9%W_#1>Hh!9m+^Ip=i`vVtzrJjqVn-$*tqB-hNEFphYh>w^Dn%ez$NkcZc2l1nor2 zOHd3P;urN&q?kMg`q#!os@R`0c=th>Qxt6bcn_*RKoKCS_KVrwnwT!;&*+@bja<@Mp)L0u)E_U# z)P)-}X7nt#WFm=v$TN0;qN;2<%cp%2*Q?z)SNFo&Gkz7Bu{Os}IMjUZjANHIT&RSQ zarg#?P>0`fq+L%#?jXrDK*FU^%w)7ve)p&Z+gbUX`w}0L2eZpy{k1`0x zk2?Ic(?^dv>vZeyQ|ZY(#Avs7lF5J z`J8XzwXqB}uDNtOj>k5q2-PCZUG>`D#hyag$epL?3H_Wvy>#M z2Z7ggbBoQhi=^O}mj48xdK1+j%u|Y2(r;hjH`4(ZGwW{cy!qxdD)m{FckfYIJ^A(x zxY&)S6|br0e?svKsxe-(2@-du*R?32C*hQ9P}U!itff@JaiS$SHO!HrSYz3pcacJA z)}Pv3IFl|S$Bb8;+6H5&QkJBijBfnjCcYO|VMrrLZQz45U2l!>{wWkGP3rdk0XXnS%`Rsuwe0B7w1IK=C%vqxj8G9Q4k2r1I=#$PG>-hLq zfv@)ZnDNm<(&Df_n?Gvo>0dizv}DBQE!&RIlno!$XTy7qKK*nxyIIR-{S#%QNA%X{ z!9vEtXG*?}SG!v@Yq$1LB2YpQH50;V5q12Qx$CD$xsX>C za&g;Z26lBY9F! zgg(5jWf={;t!1|%7PiuS0vhMx)3zdf+HMpyZWE2)FVf&Jin{+PfZND^p0L^(RBB|Z zd~jr+BMU@fuGY&HOaD+;3%j6b0~69X$-=F#+C0< zTqu|t{AeMUx`l}7#+7*5z&mg~$%Qc^w=HXz34kmd+*Sa}v2-Jp2@N~#>*uCDF$HE) zsku?*KkeV=+-NDTIf&V`e` z!P32Q-hz-nCfUOmYVxkvJD<(U*DIifnbv+yBZ$ClS1naufpUHFQYBW-V;5x)5x@mk zM)%48VIHI=Xih{IK1j#nFtmMmsk>2N#V@DigZ(Os^IAocusQ#w?yE^JpJbxyz4u7B zn!#r%##0^!9?`1)&GMgBIre})=~nY&bSrXLkD@Vc#Cx8fyrY4i*s9O$5Vm-1=*Md% z#|2&jStVKt=A+(2opwBgFc1CpH^h z&`C9RJ>|#Yb<&nv*PJ&9`*yyuJ$)ae4vapx^UG1Km~{KOPy30Lr=i^afdu2$Xpntk zhqm=Y^EDGXr<)fj*HZ-Ofd}E=;WJ?zNBXF~YG_HkI!}5FtV}3-q!<)(FJADL z&uJNE|G&w-828+QNeId+2(1|^^&CQZnS4>xBn)dcy&8or2A~<4fqtN=EPPJXg(U3y ze|aKC4Rf#a9KZQnC1MmB*M(($iP>2FM2u3w|DJqNtaSSSK=Q>;F=s<5qLJO1!$uc& zi#@5`c}W6I6JJmyG4o-?R+1-vPwH{mRLrhauIe)7S+Pv*X{l4mI|)PxG~LsBT!xt5 zFHGLHu(FQg#Sc*g#AfGv$+{(>&1*DKh*Z@| z@7&%#*h6XXwJw z;ylfBrz8}OY3?j9MvVpxSMg?&co9rI8wd1N3^*Ti*Nuxi+ovv`tAjX6gf4^C0RpH> z8exzcZ!r}njlD{lLD39N{_dbmS{!*(z8X|1pV8d#H*v+)`+a!>i-+B1%k@7R;$cmZ zl18fVy-s;gfzH_g9an1SK0{Gb45E&`Cwh?KiAM>Bl<19NKDMoA#arxb5CC!%otT!aAu$&Hidc2_c;N{+DJ<`eo(4h&YG z#1s41B?zrHhX(sLr~1r+zM`Ol!ocK3Js*Mt_M6FnmY0W6gnzM4ZxU{lFnM8m$scx~ z;yh_gm^-;RZH4c5J^rfCf1{YuGiH!8>Atz<+F1vcsM%2;Mp%gFT*HmZ`k(-x#-tn#j)lEFqSzdzZOqtiQ=(JgL6ut9+xOHstzI@t|xMKIfk)#y90ak1N_LHQ)fm`>_1kpxFlOnh##Uc2 zdow`omWYl{V!+;>v;FyX24K%UP{3|YD^WW>h9lrQ#L#aBHQr7uLfM2%2ruJves=Mb z<{V5d8m;nwd554mq}MxogWZD`6lGo+#MCT?iJkQdlU{fOk1SZ zU0sFa9!C2w6yb654+mM8ZN6Xe4`GG=Q;`O3CY0vzYx;p^s*dCo%O>wR2Ki{ds11!L zZm}7+OJ0lzu~^7%M?TYW8cP*We^xWuEHyAg3FM&(9Ng7}JW8KR4e|;bZ9*P2&XqV| zNzF>cNX_^U|J$H$f-d=-UtH`_p%=bH!YEP z=YhgU<}M7duSbtQ@$fTG9X)Pzwygp%*^-_$#iRjDYQdHB7ZY|J(}#wHXO%s2Ah#u# zJXXdyT1y#0WQqTR=Vd`@H%I6=f#Lgwcue05F-~<8EQ=gZq6ncYDPDJ2tX2;jP`3eW znZw&Ec?#-h-xC!*In{|mMmF{i(ymNjzUU5!j(EM_5c{C(qkyZVQ-GNUOWu#7VP3N! zS|>elbQjL_2(-G=WWfT3# zc#+^IJBfB%r1m&jRq0KT^#$s>ZhGKoH19^8I*lN&jv-DOUe>fH+ec&C7T-zg;#b_U zj~9tusajH3GHEiJMM3*5^o;F*!i?qyDsuK>nw9|xSMRir;u5=M?h87s4x-e&8jZc6 zU5lP30^(|G*BaL?l-1O(wO8|giu#oDyfdE(eos9p;z<3A3RYv%cm&6BG-j&$gGqeI z94b|D73F|iIlNIxbZzOGV_Kt;f`lTd^t@N!cQ=NTI!}6Qg!eCGr5;UDzuWahmEPT7 zRR$JniQ1}zvqcyra8Mwfmftox(S=;7JbZ!b3IOcpY1S8eUDS97&oKAhSLI4sNMaG9 zrhe7-7~HtreJvRbZ|fyOhJ7?~jVWvppnLRC1N-kb1oZVOYPeK{%1lHNQgdB!IEG76%M- zJ)cT_R^?H5^f}j602R(9_2Hcq4fPg^pY$ynCcW}1FI+~^G7mj}n9oE{K2%P=oBPUp zNEx#iYHZ%C(CKWs%@9^Nkxq&9^j9(2golTRUhY05AhNjrC% zCER4WNJE~f>mn;=T2A)|QlxTe9Lqt4;fjo`5m#MQs^WdiIWIO~aE-VPHBsFe$+I~{ zIMwqWF{`a|eVMt^`3LoT5k6Q=WsO+M&w~Bc)UPyQTAP1U{c3*} z;YJj}_bSCW#iWE&bW^E{Pp>&R`r4StQT)rWC=fr#+u=L7b^+*18Ga zCRsstGDUsfx7J{1dhSx(+Js9u56b@v^DNkcLE-j^92R4c1ule6&~_#KDsU0!_|#8+_W!P}CP(dR7+1k|5{Yiivgqg9{sz5#f+7TJ zHH}cO#}ubaKZv%|r1QVLo}7bb^vTZ>jj6(jUFHRHrM`@u!Bnw5O7qHkdN;iZ*as=L z(C=cybZgfCfD6{Q9Hpvw|GI;-IeQNFodhy7FTrPd|9uoeuE+ceZ#!F~(;um;6v=!?oOPg&8AhCl-k=N&2GIG|yqk zW?Uxb`P+HTv@lGe6WT{ki^JJaRTm6vr96B3|6Oq>CMO{_f(@-hIsU?0tqFd#K4-0F%y2K+n)epI{D9)q3l@e{>e z&ZFuNr%Bs0_0K!}XZG~mH7xI+MSvO5lk7Vs_zR|ok2h{n`= z&;wiHY_!(wzn*2`BzO%oEtOO}C-tDHu+J&1eHGj^?sK-tcCsG`)kdWdI)mc(Ig^b_ z%XShKXoZVwV#7vUsUXX*uZ;$E|8CS@-;zZtBzaRhf4s>Crkks!2CuYJ1;h*F^ERG9 z>TOy*jFM9XBSImX5;(Jfw<|l!f~RE1{7nM(~_GkOEE5dQ-uL zxuwp4mSh5YdH?&qzt=(=n--kMEW#dyQ)B=4Sl@EIeu$zWj~o$)y`LbihrQQLxCVn_ zZ%%9}S+2(ZgS`ivSj+#bIIZs!Tl5AMiJ2&!i3`;(#hiZs; z4duPP-A+1;aG6r0?x?8mC|%4(%h5V8_D8DVDxO+6fuVNtIq-ao=kBt7HmBy+N?ju=7 zj#*W3Sk=y2kZ)DhLJ)To6P{W+h~-2-``o!_o<4Tm=yBE8fQ{>BENECGp0aP$&_dAg zf2W349clY*iyvsAohAAe{PM3>%}RAFs2rNChe1ZaRgQzeq$Ha#I1CBs6$O)QiQrv) z$-Li3QC=Tz&$8T$@z9z;_(tp2ZrfsMS8uJ^71u8Bp41`1CF$&8dkgB&2wIW5P%y2x zzgGlCt(Rr@oxhIlA}*v-75h-mojACb+MB)o?yG{kP>|>`uLCr?3#-ZE?Oj^m74i29 zB&%K~97q%VMs7}bu_XJ2D~`S9#U7T`B$v@~#YG#eap>{6Cifn4~8UCXCar``w4r}Qf-TKenkLGTNEz~oat0mef z^PpGr2$hXCy^!Dykf6x#k%I?k zr>fmw6kq6D11m#$rCT+>svtg-=vAu`)SG97pf*#j@-psp2AAxta;JYKsuMg{V)z(% z8r3WPC?X{fNAxVpzze*V7Zy1DiAb6KVaXaRsitYfZ*Ad~Pscea+pLjm`E2u+ZH|3N zK)D99>eR2sT?9)Y2<{9q!n*mq!6Bso9t6D8s6;8M5Z@balHdE6ToCau4&M0FrRp7t zAU;DYQCUF!ixUwsVP~oYzJAfAQObswnLr_fo82W9bz%tC2HN@D+-bI;Y)!Y;Y)$oJ z@rSderq2Fx)-tX!^*q6;mv-ODk{jkc*E0nuWPtT3|E2o!tc#y-eg&t&BBHo%p0(hS zAbKl`R2kcy=RoR`<*E^8drsLc>ZRQYQ6huW3LN~XX!W~5wG|Dm4~kC?Vp@(-x!5#y zUziZ}(ihy6Ry89hRm@kFoE1x_$=Ifn>L@hcv#w~(FM4*~qFGZ>+1jq1dw0+B**&mZ zcV4#2<>%frV+MB1oXPRL9PkCLMdWoEaQ0hk362sC?qNy`&7k80*W4HN3?rO4E)qQ2 z$;;4^y59!D-=d{07LGcyRZC`jxy`bT8I<6W3gKNCpAga$P3n7V?9*c{d2wC?YkM-) zc0NHf+3u7LD1xe;Vq2Um*T!LS-k|Ig13s87qEZzv>w!tqS%T-!`2Ma`OXm?Rdc;eO ztp!izV1DgAUiml5*%Y;Y>G^SM^Etg*hBm#K^yn-msS0v3nzt3DLW?+vGmbDmX$F=g zXyp)H2pVUJd38fhP}hd?3|K2(H36vIDDRi;!89%deb=JVgr24?ypND z)bqxNqqmKB>h8si9H$m*uF?POyMxWEls{3t5mkpMv-Vpq?alldZ(=gW@uHU|#+wouaNkQEk0;V3a1Yz{ zp@qFrhBuk6Q=g zBRuyoWimx@-}8MU0QsDcEcQyA^@9A?wZA0 z11~_;!qlj~6)9D|+mzSUwyCOb*i5}!<|vRbfH3& zG-?iw_wiT2{fwTBHC+p93Wpzhs8q$nl%WgitSK%Au{f#Rf>w`i!{*BCw$2< z9)BiqL{U3bm!{J`g0d|vu=Op9Hf&udy;Hn&S*SP|qxa`ot+ zdpD%beoqy?hFsab4)TbvpV@klzS1v3O|i%fr1Gy-UTh_rRlNkz_7u(ShTTz=e_r@6 z_eR_tdj%-u@?b4iW}WX!rOzU!y-^g+t1$C5+7%!z(hSe6}2 z8FfyH01NU`zNGS8Qc!&~rVrl|@wJIMb~lW*NON~6&}t(=(4NbSJM)y7K*>hO>44PnT8sREj>2RPGjtpM=(8%<>FI4iVj?z2LCw(kKhA4@ zj=aK@%#mk1cf;i`qJ%C+(q;ao;=Sf+chfY%Cy92cwv&v}46`J~DzXip7TLo8Urp6L zta+~P%D}Pdk`1GNX6f!F<#x~gb6(Dwk$&df=FzxJH2a^2Xl&g-N=2Zm+x=%%{=QeL zvh67?lR#A>!iy*^sY-9q{Bab?oX~||`=(3ywV!0B_Pfi~^(r?=-af}JYIECUaDT0u zU@Z!cZI}4*eVawB@x8j%kZdUrsp3RR2f6Ml6J$(tG83y?dYn3a=OoTRhe7l6QG8ywL8v!?MQ*ZbM&It$nA?C+6Ob+@14sH+!A5 zVR*F+7(}>p@1B^5!YjfyXVQoEBP0Psv%GEVIDE&SNH){%kPYAOA%t3Uw9e?nl$v=> zEyXu_==|GV^0)^$wYBKkwm;V`uFBAP-kverlW z@`Nv5xR@m1Y{Q~!*yAoK01O$}yo(4+sN=>ZH)6^&T#!}oyytwIFt96A^7@Jj^@0CwB$b5`1BP0V0o;11(afu(J5L%8|b)vloiuHN|saLiw2mou61 z<~A=}k9MI!+hp6S0&&ls3#SM^8mS}kP6bn-VK;`! zp8#)_88&)oG`{apG`4;2i0a|%o@X$uR&E)Hu%-nE&QSronWv@?F9r81IYp64u6yl2 z0<0RJ#&!0SIB0VBwYt%v?XHj;i z2(F`-MNeI!zRE-r=KBJ#)kG3L&4IftpuHV%Dp;h?Chi{klD9#Q3XQFsK0n6i{1e3( z8($JXUU4c_ZyTs|WZl>vOC9q;8`a2Orc|}jB^M=k4wy^DrD>73Qg9uzJUUQLO=0T; z`;6O|N-a8_M#oa*S`jFnG%ihopuuldk!@?yW7@Wy`o?pU{%HC%$|ooq$H$S|9?z$z zV-Yi`__zM%jUm~V>kKibr>3+$>B%@meF+#n z=9g__)K@TMlXq$TVAPs*DeC3oHHVl@k0G!@RBhT0zV8{<)T9ZbCq6LF`u~w3BVyn3 zInt%#(m`v{9xcj)j*-;!Sa&_teV-Rl@N550bSN*ui+GmMnCIGf6aFy zoo(;d9Un)AS`ywAQ2`)Jc;U0%gji5kkex`at{`w)-U*avJDzaL_#IC;>5S1koHX`~ z9lthy+>R%mI_|XbhAG*)noa1lIw}{;6Z**y6^~MS;1n{1lqq~2%R25X59?H6ap;kU zr3Dx}x+6Fy@BOPDrWsEog%&RCnPYhvv;5HE$CZ8>6S?8iW{~aovKacQl-((!#8)6E zPmRW?E87^Ap-41@(FUw4p2NJBZI8A68AZr0!i?^xcVN5Dryr5*T5At+2R_CX6HNq^ zZnN?L?u4cv-MJ{oDYM2+ZnRs$X%Pb=`I$MOETb6f-key;RDlG)PI>QGinIU$u%c}1pjumfoaxcfYR7r@ zpwSH|0#Izw1G#CfVLRIvfGl@Wd2s|qj8;&6nFfr}J_Vx<#_=*LRdF@ti-U(`AsDK& z^u-58D**IZOGew|U0S~fiv1Bqy?lK=SUJDxpk(54DH7J|B5EhNC|gIMT}e(v$NCbj zy_#qu&|@Yd#f|6F_U7Cq`bgVko#K$@g`P!bi{zw+k)9S~90IIKO_bIFM9mSt+LZ&m zp?1wa;&HQ0j5*ou0-8{>J1tfD9PGYX-Q9$nCO5vTMcqHZu$&q}H_@_+Ey2jdE=3%H zgEP>S)4$I58gPb+>QxASbZuAgEFC#+o2Ea@oaZ5iC5!(mP&JK-Vfy}wA}vwWFmU}L zK?A;5WH}&fgA(1uMQoPDM2peL3K)xz0diBENnZF{8Z0WX%IpDTOXy3kQqkA;1BY;@ zb(ZCKp0~FEiaA5}E^50ZV@97d>Ljif9R(ovL7O=nhs}~^wMyl9K)soRXhwS~^%Rbq zhL&19pvFeDY;64Kac7SnXV;U){iWDYSsDB+a8c2#-IvK{J5>Wh6rX`NfPX)ye2t>{ zx)l_8tL2$~%o$W}HoBhzI$@$j_rn|=#Y&4kv84Zc1gb4-WNK*jHQL0$G>GZioWGj7 zdj}24p5b$T)p>hXrf;{FsM_P?lQnZ2HsIS;2+w=Ae0i@^PZ;xM+u`~^!~3zW_a+V- zea2XqD73MOSeHzc4@+cnES6S-bv6>8WOxmwXo?2GkNdepd>F56MiKVJ#=R}^8DTKy zd->AJaRdsMn<+Jhp=s`Pe3F*bqUJ%4@uV9oS#4BOI2BuJXO^ktNQSo6 zDi?6l#UT_SP=NiM(b#Yggf7Ey@1#;)qs322#|G);l zAk(iW#gbf23C&A`$qy))&cfW*5>QU%z=9K2hyUs3SCW-s16=%k_Zt1SV`fuchjoosvy?tRU~Xzx@x4v`!c1ar2&c8iyY>my->X9Z;iT z?6#*z&119>=J#IzS(SHCnxn?ZG~MA67EkB#mZ;GiG<^c))0EKsR(#Ii@2(^F?CH(S zltt_{(=MCRK05>@=~v=$_Mt&VGzysa?Bxfz(>g?kUr64tbvMoalS)+_MLBxkA=$J? zNomef>R85K-D_$%-;<{{q6h_g(vQo`x=P?t^VfN^pd3t5U-wb8lJEllq9g)w3|;XW zq7t0K&hZo7d1N+#nIBF+H_$R^+mH49Clt}Ktn)hT1)WxDThy@(QzW$q=xamhT|4`N z{<#rDGCAJzQyZ?_Db0GfL!H?9)!-I~sE8nKwwXWDHk2Ac_m=#Uwi#NfUSHGOCG64f zkpo&*#eW~oqZ9VlL2?AokW;P{92^;!-`I?d-FrxOkg)QV;;Y8VLs(Cd*pV$i8yhM; zRc_AM@PLa$Lk=PE?^kmaM&^BK$hsilA&2Zr8Iujq%4m{2Z+ml+mB)U}lQmQA_=i3=?S=sHXc z$aO)B^Z!d;mzQQdX;3rG3!c@1AqG41n%Ps!03KUZRV)M~7{qbl-mBhy6-!6B1+(M7KK`uHXAD1K%-6q$0i<}_a$MrKz9Ghz zEIr24Ho1ExK2B?2lcoL7r$I~GRQ6%#-)8%aelGp&E}7cVUR#+kH8ja&8ygy#|6gt+ zH;@hUq5HVP%xB`;>c_iIUHHRyCc?TA zARYSURf~9%2oW?_P)wD&Z$K$(@1s%`Pf;#8K%&+rdeIY$eo3xuRJIs;wKq>nD-u|G z+DjwTiYn5mbrZb3CX23%zv}bZ{f1aXNPa|dUQ}n3wdPEr6<-*$eA`JYw1wgAPC6*z z%lzrhOh38YTr3*%jG0ux4c2NzEV{&R#!4y&%Yrca()mo!oxBD6^#aQwCyXC|&e(D0wD@3fIwZ{` z^@-OYTE!Z==iX+}@m&I9`I0O3DL4>BC}}OFcN++*_w$}#L%p~Sq#MZo2t9dQ z#N6>|_=l&qAQ~Kkp*?eX#vPZVX=!VU`kqIzf!)auVPFsV&#L^yL46EN(^Lsu6e^yl z_+d3V2>itEOD~Gz4ZUp7XTnP@iq{Ql#jy`;Kidu-1y)=#^a=$(V-1Xww5AC~P{tdqvfCNJ{1c=(o-(5D}rIdJ{x z9v%DBVd?171{ww_i(lj{5I)ZsY>+pu_?L&4}VV2O7mQqr$@7z2y{WFJ_Myy&pq}!z;oIM94D^Y7M9GypAzp{ zI_pNXTXksJM0%!lKfsOKvzNl(=W~g;offwRf%#`CKjzMzM@kKN^z2{GTM*9h>4{4C zgESzNE1VW{l}tn}hPkN$1F$?`i4r|9UiX^)NZTXiUVM6(iJ(gBW?KPskEv19?hozH zzr8Lm4r2;lV>*PQGbW%H@Hzih@v7e@4Z5m*WlAP8ubLSbwV#MnnR<5nn5R5{M~lW? ziL0t>H}QO&&0C}^V=kQ-4(N^9{M%fNRknk~s2_btyP1Y%dJsa+2?9gGrzr)cx6PFahP_Ql%sQ+&n%YH=C^#r zDRFI+r{7wNn=uSbjw4~_-4{3<<4*a8##TnK*^=u$sLBskxv3#fTOc)-LND^(Np%q# z&!jgWQFe;W#ehmgSySXOveqZYE~Q~D0SzO&aERJum(eYObq2IuZsBSdu6SHTJ9%P9HV?v~QRmxn)oQdwa^yH{In6?#dT&dWf#=eqe=U zX`nv^o(Y2I-oiq%5_pd31D-ukAA8bQ$B){3+-L)6s}=xNA4?#TAhtOtIQjWmZG!B_ z6vXPYY(SEnOc-ZyzBrBu)y_C3$J9_NR^xqjn6tMXw=Q))-g(Bv6{OnVbN(6+($ zUEcDnY$IDfb?q(SRkHOXl+cw|w~yCLsk&`lbw6S!gLKin9}fN_!RQ`r)2i zAFcz(gmv3fbML8WWU!f!?!Tuk7dROjQg!G@()?BwLAJw1e&}nU(uAQuOr<`n@*zsA zp?hXwLl#>cL=mb^;2l5Y4I74Ba+t64_+gaLjUVb&^`Z7AYLtV{#Epkh%!>iX;ZOgK zWuL1eKl1ceUE^!;jDo_LZ$wy@;XYHJ!nx6RPFXfNl_)bT#q6o9nN!p(2Z7> z?PR)~p*!+?XxESUOZ5?l-4$uav2TW@W@?T@S_{Jw1ph@bJ>woKGz9&7)PGjxw=QlN zPTUC9`qUP>hWufk^BkBv{NFPo}^f4aN&{TQlB@II&U)8;pJvt5hkCc`(q&H}DD&;~-XxE1{oOK$u! zZ&qPqbY4diRqbNIXwr0pHRVCtW*P0p0*&u=-eERP?RA|eTJ*rY4pefnde~Rjou-$d zT$N`h0u$57vLARf9hsm>f?Q}))2^)0Qn7;@BY0OX0ikyU?|Rgk zOQ2$Fw`zrVr&BJbg#JA`KhS{ACT$2Ko#xC9%-bRl{Mu;p0t>|Lkh^u_cEOD5nm^ox z^m0Hwks^B2m_PqRkJKv?qy|B#%5hx{NUiQnmc(vc*f1;V-khQtxspaaX7|*RsbIF( zrf6UR8{mTH53m29s~DH?#D_9$+2 zjW=&X$NPBuT1r7tpT7*PY+4{I`88EOlDx$YE8W+9YG-XHhcCOp4%?nG@y!dMWL^)) zxwPt?;|b1Un?dEU+@%f-jf>M#_jL|@=TVNOXr#k#iKDd(VJnG3OE}TXs*nOhiHjE9 zb8A~?&vM(*5{9&^)&BHwI{wfA4$Z8Q8IlfNI3zon-|`<96aD7hi+i*`Y#R+>Yq#I|#*_=YijZpPFX%~?2&Ed+iA{gyT+*lI7b`JY zC(IgznG%V`bdS|Mk~MIMy#B+yjy7)3gH%v-m;0?@mjJ@Tv8c4|lk2tLVvhs%^ao++ zx^d6N+1?9^EL8Zn7UW(Zbd%SVm$T`BXxy}J(_oi#V8IatnR#c&Sm@

zS|vh~x(p zQRqfJsNEux5yb~_i^*885y^y!k1L`uSX-@-(S23-N@7CXE_n-7G<_G~S05?%#@m9A zjKpgRQr)U&{%jxE`9XrF=Q5}%8a6CT3;$V~PD(8-5v3w&yksJhs4h!q$CX`6<#I)z zs6=rm&x%7i0nzXZe5!;-o*f|9hVl{}=2h^?^y_B6LL9-}+^ zMeJma+lbB=OWCG4pW@$=JP;NkPgjn=d&WG19T>m1vsA_1v-UDdvMb=6agn(8q zQjf3n_N)%LcXll=$Etu@X${(HV|Lr7(t90iAlTpYmC`r<@%E{_Vu$uD+D6Cq%yruY z#vX@UZ4-3;&h5T{$jw0PD*lSZbF?k9>^3R>;Ito4=8$$BB2=&iS1no)xpGsqS2>iM zYowNK?-)69p^6b><#b4#gQjg7Zor44dg#3lS6}E=otYmxYst;1g0;Pt_XVdbh(uTR|(_YtRrQ&V>RK%v<8 zr5BBQpTC-*aN}u`t3QXQICb9zzq=EZq>{)P!0c5^u4J}3dh)IgUrk4-sedB9& z!Jr%$jeXLizgpFAEKGZ_Z4pRv%>=RH`P94x?#^N*>^C^|4uHso5jGneyU_kbrpMW_ zVqB1qz3YdR+sQ>cP8i2yr|eA;@*SJE-~0rkDUHl!K!(!wrMh#HO2d|e&g?x4o6QYf zMz!ACpdktCH_z#Ome!mFF}dq^+{Q5NLD-W=m8H&b5JC&bLkHVXL{1}@$Niy0jfd9v zP*zylB1Z`pY}bf3W(E%CQO>8?tL9_I>)2%-PsD=j-UE*-!ticH1la(DZ?JFk(_;#S zMJnprwrANJn%#YM#~jAfKCOMKsl>PdA7t=tcSyNitWTD=zt*c?M3YfVnt)BjUVh`<@I}n({5b=8yIF_eb>+Bcc*KZmfBR;WCb<-%0J+CZ( znhXqJO0c+e=5c$9W=u(4N7F-odGQ55Yc*w>t_rK+e=IE)G9M>Dp*-ljyW=B|9n!aNHC^`Ikicg>>A0kd#DRxry<88Tw7Y#;I<=^dV% z*O7O2wNJT)+pF-ivaZvs0AzgW^$feu=w(Oe{dGIl#`zi;XM`}$OOs1SAYEIr&W-?- z)a1)7h}EWO-w`{i7o%#(RQ4O^>Hl0h=E7c(aQHQF*ti$e;@q%YL)r@x;^$Ku_kya~ z^!nTjQty%}JJTp(i^*P)HPrWB(1E-tH=v+7f`&|b-HYIJE}1vq{5_Sb_&MdX>kO@> zjM0&Vatn8)pr8mMJ@3WW?zR@v`}7)9e3Xsw{#_CKguTJ+tfA1l70wxk?2&oqmZT;jaOlL+2i~N2v4Cj7=iwo!rdkb||P@ zT7E)gsE|p-BdvatqKy;{Ybr&o1C`b`QfS@fct^>wMkR1&+{SXquB42i2%tmPia1}Bs{NY@tuM#-^RzT^U?3Sgfqc?Wv|?pGxp>NhvQdMQo4*=fc9(3zfo*dYY(+# zDEWT=5L#W(6vnY0SICBU0hqX{%obDQB(9iZEqM}njeA331WqJAfY}4uh>*EoQAaK` zMhv`aFr}$bD$k0OR7^sK6xO>iKboO6uJ;zP&SAX|H^zv&3Ey6Sn|W*5O>zH&RK9EBUABskRH@@UDi!eTj&R~cx*B;)!fTBU3vfj{eQ89;|3$dXPgJ#QU zB0n+d^^-;2_YpuCP>@^59ExdW3~ptaJ|7;8tH`B($~lvw^E(YI$VvEQku?we!V;N= z9wQ`NHE?Kl2}8=CDo*O#b1cG>7E|{ehu<~Yt^aZ3v5gm5IBbOH%5RB|6D|ft!+5JY zj$L+9Lnc%Z&@6)>ptMh=C(oqwNaf+tw#n^NeTouOq691KPP$6S7^6EbJmyP!hJ;c- zHHdaoBofoEkDQPOgoC9 zep0jQ_zXu(M$pc?DC+<8vMq~7O4_>VtIwe3c+RVV2|eLF{9e32lph5XjPzYz{um zl3{AbwxS56hf1(Us?Ew4SIb7r-KrC4N1+>nZPy_VRRj$lueKUEr(xQ35Ak~!VC3(Z zVKqCRtaDm3%Z-j~G)(OQn3@3nj}0PIo7NAe78!N_t~_qV{1^#z;?Nuox4_i$%+|Xz zmzr;!<-~i#pi)<~wnQk=MR zV?nm#CXzFw-ngfqhVs(8VNoAsYV=%<<%umC`!TB$FjC&sVkZtdX$7LR1{+x~AO#yy z-3C_^4h6L2knV|bCiZf9?Jc6%ayGdGc*>%dGyza!Auxr+h=Mm}J&)u!Qp}Ngu4p7< zpOMRUBP1B@4w+Q3uFQ}DEy7j1Vg!C&$~#I{S-JAGN08)#0^eqf^wdJn!ytoMrFkp! ze)%b~MFc`PEHGmRdb}o%;17=NV~|^PTiKIsgVT!lCLS4lMn0`aLtM8sJV>S;Uo#=J|1}t%5;)O}A3Th!^Lr63rw7qj14G9Ntju@I9$>;ps;$J)-di5X% zu~RrP)0?pQD>P^%M*vy;ymA2mdu{%}0Ry9|H;-Y^odKoVN|1of6w=Rw4y|k9_}I@y zKa9mSMn6mtv0`hbtOVG^!vlO3H=;%Ah@ge^o643=Ju>xUIHCT*!($Q(mr6SLIF&fr zACihR?S;?gGdB%d+(tZN1Tr=+8klmCR9@3>Rrz4Si?&J$wn8qfo#4qa>Gi; zMnQ>)j%LF3-0|4lSr$Aa8tDH4rbf?53s2|>1|lA$fh?eSwpLfGqaQ;0a0OW2J&^K# ziaHjX+L_NdLG1`bqMAqVid!~ri=`f1AGh%Y%yBek3icE05(sv|`q>+6uV;D1RB*)o{2EfM^j5C_V1EW8*ena~5rF@cPjdDYEMI&lIm{AFl~d!_%6#5`=n{ zMbg|M6hS1&_8S?YJ4DS^bnTYyhGpxb!%nBIT`2-_ChZAx=-X#Ix~zFBs`_?r3U@<4 ztT6NZ8R%u$2<@Ir*_$G`ci1_uV;zH?cglVpE><4 z>0|D!!SW!ILUDzDjqm&P`w2ehyA_7Bgk3axg{!Qi8gwRedN>U|M!AHd0iC`det0#0 zc0ul|KWKe6~|3(Scr{=-*3v4wm_`n=gD z_un2EBxKU{>-n!5Gw*)ToP%{6sl2hgv~OzXA#2k;-|Q)CQ)W?B(Uj#>!Cf=d9gY}( zolyyGe?DMnIE(tHFv4o+Wl0W26xt1hV@t51^ZuJzlDFaj&2Ct=@W>_skBlHQ#lM5- zr1TC~i?GDds{N=eQ#J?cC|Cgvd;()7HLl!dq`hXDKrOXNqh&Q7l>P%n1arng(Xu-F ztyxwLKsf`)c{+M@OGguXO8iGD`#H)BuS*Z}R`7t|Sp@a}k3}U4{v{}v=9TyR{BJOU zG+BS4ybUJMF#sTrBw!@Wz3Q;Hm}_FB6@$-Q%Z#+b7ERW|rgCZaa@yO2BGXY|{)Bc- zi#T|#(oOd)m8y7vvTEYcOmUXD0_>EAXk86_fFhvuj8`2R&jVLpRH{E)lJ0ziMx##l zE~0Jq6^+a%Lpb)F8&*tGCh|NA)$9QOtPkqBZ(RO+5eh`HSbH z4MZ2UT##E(gp@Bb6mNNr5aI~rNG-2A?gM_J@%5jumqRE*$xh6&c5*nvI@z2&i3CPG2)8HMv)@4%n7MKVJ zA7P_c&IqY-uf#?3Dy8;a-pgo*&Uin{SMZjJ98B`Z)8tuOnUZZ6H@XKehLGFoGWUIA=C$tuq>tfzNpCX{{rj0%M zoF7)K@0F~}9xTTHA2jd`4SYbh;+ey~v+X3ULrck@dRd)Jcfn(mA-iw`c<^T8RBccf z>~5Q&u2iC7n>=hTV|k1jLRFar;`P{;m;}=i79RR8_P9o|w0L*emT<8p{Wc>4=W(j? z*|&f6iwV#1+z6C_kqK_X-U_>E#clG&y@;@DSUO^=))Xj79Wn5vnpW9l`$Arkw&$lk z+)S0tL0>tA&D;3X z()QuIUCTR^06yRZZd{eyh;}ma5V}sMx`vk!-m-6BX(>lFMoE_R{(~7r{Ax!!E-GCR zLXc_MA9yR9OXKuoNV?{Q{m7ZuSSq9L`;;HZyT`y=;Q3llqrhdqdH(*qEC;zJ;Cjl= znuOtnImo?l3gnB6-1kz)B1q6i8-=6Sz4 z?P|O~eU~?`fH#exsDpQ0GSq_X@{5W|XxBk4b@`KA1o8@Z7vx17ta0e12^OtB$tjN_ zSjH&4UAFMG2ZQlWrlLAo$*!smLCQg9kt}}WnQbf5O~u2}Y)4h%kX^WM5|VAIx_1rP zEg&4;$Xryfj?PM8JI%TJ8)TfmB&HA!leawyS+EdtYRfFb?#XSpi*MKwDB3B<Fnr3K8Cz(fHvs~_xhBQ`X%u}$X zPLTTg$e|WJJ8#jfsSsh?waSxgsnXo}J5ZSuTKaLs)Q4@nns-qCJ}gF;K{enRV(&UxvV`?qRIa|xyoqR7-0JYqPW zMVhIbxbL@EIO<4i$qTD0Z3VS9@;AZso*#Pt_AU5Z2xNYNu2gY2<@yDlzs-4h5xY6z z4usG0h=ObcjUMy-%~JI=^0(@{ymmW95wPlIyDsnL*si>W!MK_@v>!>inCy@h%c7BR zofFL2;B9l}Ei&P2dX8zYaIg}5XwP}I!}g9@Il85jwQXoiK-TyKq{jNP68YhUu(zv5 zKEvUtNcIK(>Wy#SGBjI>ZjsNOI8!SlrcWJN)b7VQ+^(P*b@&k{ob|ObgX$(B2~*Q* zLkz86xb_jfH+R6;lgNUldvlbQb&KYWRvs#wKCbts4?lDCNvEB1+US#G^IJD>zTv^L zi^E!Vah4%t53c(W>~=rT=JnPapD7zYwfBZcj2$&*>{+AE95?pF(WA<1ewGev-baha ztvgImEPf1n`^ObCD~ZiXzjj~cJVn0VPEVBek=n!$XU=)jk`~Utt!thhzmy_1LgY7y zmG~V#W2ksFqV4iR6mV4ULp}V|vFD6B+;Allh>6ewT{$dPpGpR13qi|>u4C3)5%-?J zv#sFSqHy7P8QBR7)D+W{D`^Q&6n0P`UYqmKx)1Y%v@+=|KRM@T z^O`LG6dGZR!)I;3b)Fj9l>2iFia>jVVm`%J`5|z&7yV~dPF~oQv*p{nB<;8r#1B5k z8-pkU`y;&J8Qq3%NuPgFfvmFum(%)>JTBfJI`Ny4m+6&sGqRC|!J^E*wS4$bLPX*< z624pX0D!qEaYO<*ydC8a5-=W&(y@whl%3`5+Jb5f5${ zvC;4kc~a9Gn)ZXevp(3!!T)c2?*VRQaqa)Vr_dBBiinE3MN~)tJ0V09RIIU}VvPn- zh+sezFt&Jqn~p7-TytX*bE8H@V>?JY9NIz3LBwtli7ki`8?l98#PI)q*37(RmjfyH z`QO4k4Cmd`XU&>5Yu2n;qwb_TAsWg92%ZyoM^`7@^MuSIiKevv+2nCo&peDx^$Fgv zzygSxagjXTr{S%ZdQj|{0>#IQ1QbLrmyf4kvN#9>2o;z)CW+^x-ENxs=VK^c9yp$% z0z7z3X{l-2c3WI>iHUuc3g{;vTH&E~S0U6&qDTzNpyB0KJ1LyaU(OkhTLRt6hb; z1mV`S2fJSb9dPq13K?zPP5PcjqF6G0ri$$>PfMa@zJm{@hW}GV(orJ&KUuDWF_kg( zNVu&XG8+Y>hIj`s5LyZ zLfv#!$tsFVjp!)6sL5>ixaO$9m|awY?B%XA1sMhkcs{6cFp~AQ0vH_JXa1YWuP-k* zP%#7y7Y|b&28w}wUB2u<#o3e?Y&=vxROF|k3vhhvimrs|0B_gbh zIXs|Vy`m9VF1)w)QI$Mfeu6xu&r^CZCf76XE*ZJ$yk_+^b9cQVeW|LhRz~QvCS$a9 znEq$2adSS^gTpm%%s@@pba68vj~7JEA)91&!2w7{dQru#mRc6Wh-gVAffJ~hl+Md8 z)W|+UH&_8W30RmTxnB8Qf{63S2<&gmyB+(Q+dsbb0!~Eiw6R3<)gGir5Q^;meTjEM zYczV~G#g$s?hE#492jaO1d*Xi&7L4vD(rWON(D3Pl-(G$H)ZIrnsMd{eI<^5Lg2JZ z@)C;bDHw25Ia1_?Fo33!G+{$X;!VLUd}I2n0;VreEu=Cpp-J$LK|kpkk9TLK=5Syy zi9F-kGI+<`6vI2D3C-mhiholMxZ+&ryqm+7<8O3BVGO0e&+-GMfSaWJ&*Zz2qf6d# zlajXFW*C?E(oE1meJ#AQY9L7;^Xk2#FNAtw%rrfzE?6Lt1XZ zilJ~#Npw*bVAE2_S!i@O^q->dSJBr0D^ghXxmsoYSLEV~GX1wDNk?4S{wv37`Lg{F zxm3e@^0Vl_uf<0B(7Y~G6x>F)^t z7OpY~2EeCwgh`}?Sw-M20It20=U3%_7Pvs-a>359`KQ$mpaAs?b)CON&TLi&xQw=8 z@_|YXjbs?^k}nHfawy#u@=!=hZ(H3uDE}7iw;d=nN&QYvXaetj0H?&Uxg&qM(W9P8 z!i&Uw9mICb7w*uwu1#A<=c)4C*!=b3_}GpO-HMvGKY0;!_chK3STJFnlgEEIMstRHmch=7Q4FVMy zAHQUd597M6EEz=;88jMjrJrB z&(=?gd!^;V9!`8dXR0o`%H|STYr~_8W(p@ZX{*lL^2L)_+0=m^2mZ5gEC<g)e7^|cZO6zpL%?(T&crDj%a@FrNpjcL85p0`A_ZrKA#XIUDuBM{o_ zEBC`^MvCGCpg{4NpiP>4qV&}i#Ya~dqD15$Am!=&DT0l@DrvDF6yTr4xAp=SK8q?c`q19vu$o3I$>D6H*;G8RU0()3g|c;v)!3B ztpqoAoZ8l2-ul(TgKB+>et)URE{eERe*abim6-2ha2=&oyU7DgQhE>_N|!TdLZ!1S zCtN3hqOK>YOW(RLeYpo3)5BQf(giRpgh6(clNN%7J!iD9M*j#EN#oXU*E(89@pp~6 z)-}*e)4!Q7IG#~Q2lO2}a`45YM~u7%3HmPKjG!>a_~1Mu`Cg?8Ic3Di;REd$rd_&( zI5^3Ec**R8FBv#`=nw4ikoK7Zl87KP(}6^w73!m0uHX&N5So}RFwRNAtf=?M1OElv zx3=4dxo-Jmj8(B=lww!vIju&=B2Z%r7ZE5j9T4R-l@Sc+va3W+ZkvKR0CaV_NkL{w zZQK!21#k{Rud{J|v7z%O$#mQo=vJ0SsUtu0qt1w*wS!h`{mzXan;rF|N3D>jEvSJNRO85|riiXpTlQe0w@*;a-Sh-?k;x z*Vp7Fq%|D7MZ>a{M@hd>mSg1^Nk~zDee1HOZQ0_ZB$H){TDYSmw@0;&j3c!6X(lZ~ zKR_oVk-i53(NuUG>!Rh98_q4&Y^)by1;t=(DMiFsLK$cL?lpT5Rv zu>7PS*)BbuwP?5nTntuGyAe1TqwJ+lrHc?{CL(2ep|A%c1{}aUuG}OwX(5i-%{l(` z-4_)ooJfeNgM^V%367+|6|og{;-f5KNY*dzGHIh^i<)l|IIY9jhTn zEnIP?6Zgv_CCwe0H#LWpep5o$we*D99u}Q%DbEh_RQz^QhMm%-%7`roadm(){CdP` z?C$bZ4{<(B-_kbcn$jN;QL~32UdifAqyOlY645eYjX31MD7R>NuHGANU$k=i`_hn9M9%{c zj211I?t*5`qLp)BaG?hg7EH98F%eLV@w`bRYvsWa?-C7L|fe|0YND`3NDObcdRbE)I zHfWs)TQTmeK@v*%_tolOn)O6L!?+sV3hSt>FV-)0Hf&7>{!4OK&t%s(GyiPbIR29I`m1mYwF9>-xuL$Hpd>h#AHR1j$e+A07!=2Q?!QmWJLO$vpYnF;|!;7<_5iO&3c z%=N34J`qMcjfFMy|5X3>;=Ap6S2(xiUV(rW5SxMBR~WO^h|PKr`vIf}DWhj$QtXEz zcKe%Fc6UmST4Fs8sQJ-p%Gyz$I>A&wFYIofV?VOyZ~eSr>U*y5k z%3U=#0{c+`dMM)1lUqj}Pfg}VjF3pmc9y3(B=Qr)Z)Q>~NHHqQ(2O#kE>8{9l)1aU zb%F6-W|vo&7}ih`7}KH>60FxqS_d<>(KV_zmbS`B4N)YRThBrM>4aEl-q7yxr>F^3 z-*e32ZgP7`--(4%57U7)b>jiY4jncasUO0VJ%RwFbo>otCpPI*wy0P)xd;n7O9m>-e)7P8LH>rmbI0aS0uHgXB*94tm)QXF zw_+W&RGzYUc9J6DX=u|BRbXiLi~<6hRSM1cCbDI|1e)m_pW#m_p3>0&koO2zM)4HE z4_Fln_Ojyh5)8}RvY4ixC6P$AbFwPVp^T#~G@W*xtuz3Xu!|LD{e{Yg{#N<^68TA) z{$@tmx*irIs<~4>yBLkXF)z;CdXvejYR{5CKt5FGq43=zD7a2)mCzGaAKKYHMLA(c zK)4tVeO2O4@-(IA7~jiXs-tLXlUC8Q6ZVX%)k`9-l>g3z)(QDd)>jDPF7g0@WWGzq zH$hX&eHkD&BD|^)37SF`p@6U zQM5fSMu`HSF2Cv_L8YA0Fk|+tg$w`cIb>h4Ru!)1Iyr}KS^G!Xq8?)V^{}>HMKIwR zsUMS|G2L!%1uDDASK>aWerq5Qc7ndt5$vWcETo&i!D_iIB1QO4vCi*$3l6 z+%26^8HS{DhLtFn48G*_EfqY#l@FVfT(9E7P^#1=Eyr6yi1Y>o}3!ZY+;@ zVqcOf;9?F_scZyj{l&`cG0`>xP1E;7;%rKc90!h_+Fp?N?DF_zv2*vl9Rj9UnvD96 zh@=s$0vQ~%Gg*Fes^&a(u9H0NqjS9!CK1CiUW`;=i^yI+b2ZxuLs}sr?u5vx86I-< zmAg619AFB0uGm7XT?daenRvy@WQyK$k!{}W5o4`E2n)k?>15$FV=v)mj&5V?`mm$F zdU6Z(IGUxB1g>-t7j7@ zCivyX*BOS=>S#;2`Uc`O#w}`*OW~GkfDpqv(!49wKLfydV&q^O`$iQ}a{+*e8u?d# zqzwVJ#dFi-BY|}UJ|y$qEM^@`yM0Pc4V2hGP_#J12jAb<$fun@rx#3br~r zxm&_U1}e|G#Zglb+7xq3T9Bh;{)>kUN(^5ABzq6pi>C{_93hSpAeq*7?3qdsFEki( zvcU*4xZ=j7T>dfoHJyropKwoFAfEUI1i)IJT?2YL$SSOmb{p+Z5w`Z;M(>3gzD z4floI2&83d_{DD!cpLB5W6`K-F}U5jo4ipnwDEjWY2~>u$bK_Q2^tdm9bRpc+9h&S(tD9`rtw2>%3KikvJ4726sI!cNv+;Q?$Q!DQmxF4maWJ(^S zCW~24EpwdWhh3@$tEBKJ%T}wd!{yt_)5MnbaWl;tOy<1BZlD^f#E0?97CYKYe!BYu zL8P@jVPhBSlwYZGcjoumE8iHj1DU#7 zXLD(RNS5JAW?dHgZrxdTE<)gH5*w`y$gGWO#VU5OP%~kXW6H&`;TFaeT(!~2it~b0 zmQk1^s259R%N#62`dN(_sz?azrLty%Ep@7!FqE6q93v>9%;=VLWW~FQ;PqS9b+iJV8T1IfI+MBte z?S!jDv|FSNRzo4X(OX$}l&3AE@DsUn(L_!ti-$>jt*ZSG+uyEvr)?HjqZAbIKd?KMYCMM@td%^+9mIo#_cj(@qf7>C1$5scS=iB zA}3DiR-)m_ZvS5^NGaliS?6G-!ZMhVi_BkIbDx)sSR1oak(5wGcm#`yG#FeOF0AnQ zRD8l66R%h_D zTk43*AQs1`NN)^POOd6(1*&v0U+L#gSqY~aY_mrYJ0Ung&b@YEJM{~EJbw7$t6b_bS-{g<_lzFyHLN?;We=&>9Qjyw^=Hs1c+U`wpi?q`*O_ewP`Tbpq&0HW^Hq*mS zOvA!X%r3~G|Fmd%xxHJ7=IQ`q4)@(xFI?&5^9yHAeJwZR?b$UF>%>DAS7G9nL_Ni; z6=zX5mnir+yFWP%>=T=$ts9I{#;Rh%um8!LNT_2cd5Fmq!W&PI`a13`rA-_IQUeGz z3v)i+&0Hqz`%I(>>^tz;*7h!J?uq=nnG1_0)xe}ECTU2%FwTdiL?`3SY>QrtaH#D5 zmsV1|&i)H@cJ&fN%nJXV+ZS!BCE8bRzkgvZiwS?cmIe$G(6y0?)5MEqp*3x(n^_^8 zsm^^wVE4PMctCP<=PrFz;i*lM@Yfp%6Akeu7QKp~%;T1vLunO9y@TM){FF$UHah7A zP`*J(DsxGX;t6Mk$<$boK6wch5*bljtCx%He@|v-*a+nda5gV&^Q*ckUli+uo3IU2 z;+f${oBe%HW!1}rxj)dG0bkK~u2X)DDKcS<;CSJuTQNNwWA?m@4iM9PFQnTsy^{QF z!72`YpkDX_5qn!!4L0e!*Fi?D<>X&uAt&s4sr@n4zST@s*z?ll&*aPOd2OK);7rvc zrn!!!MkX^wc0$dtOYl=ta!Xs%eT!W)1vt~L(l~u%$;iHNwxOsST&w}C#a;oZ_J6Rd>kRGwta{<`H>4kC@JyC#du-e^^2=+YYhS-&_6k1* zlT?OAus3jFlq3pX-i&MHjkcDc5}c!?CDC?@k(lUJT-H!+u*sWP!1V;fPGxMzZS8TK zXUuO&H`FnkG*==hHP+}}N{KG#H{`k`;GV3^?o6LD^mdwq;Q1MnJLBl87!HN8#4qplo1dccO z1++`@^Yz;)dIL1E_Hr-+ zCXexqfHc0=EUXRpfXvE3FmW9h<0S~blMNf{-?3p(Te2mYnG8l7_}-%)+Gz9kiyLd% zWc1%e-qCz3Mw`B-&9MNt7v#&2wsNQiOXYtdA1dmmZ(UT9#&kXm_gH-a;?3nDU`TIz zIw@)<;1=2Y@g^z4CFtxB<-)0nC6Yw zL;u^L#GwxSJcg3sNHtk(m+8Tkv{sR35u{+!%;Zec@H0so3M*+4Bf3~kLIsvScHb`U z=MP*zm))4xm|GiD1=6g93Gv8Y-p0UM6~B)>5NIoyFVuJL^fAY}D#~ddA312yfHSVV zX!wXLFB?5-z!^gZjh>*rs&J=*)@}##zmm z%f$o5udw<6!sFG)tz3NuD(imofCY49B#M-glQ$k%ee9(Mr;ME7u7B(yHAalK3Jc2# zZK`VNC&UY$s4ywo_-`Vw+o6#Op`|2XrV*G!RXR6KX!h5X*-wxTZd6l>7a^C@o+i&$ zg~}$&`}xqHJn1DR)ek=tO3e103i?$3F?kw5>-*|EcUFEt=@r6puzI+}*joNK%#Pm? zTdJ)LH##_b(c)z0d#GQlLUjJX?~RHi)k7W^t_9UREw+vBkx`r4N6FM6PSFW=B57Ve z%0}82Lp{Yi{gobWN;`#AF@8}lTdv!D+D0rs9D!p9TPbz#e0erL!0%;s*+|@k)QEEN zn2{wiYTfvVrU1>N(NpENk_VJKw2H^nc&Ln`R+3Mt8HA_hLxmu8Znyj|(@TdIjU-PX zUPbGsB4S3tlf3xt18Ah+TbBCE+E4-EQ)!JZ&kU_AZ-pf^rJkgfsw}3zWS?6ejj6UF?(Ml-An;P+Q7ooV9IvI{Pp(i z9qptN+U)RJHJ>XFAc(w7k-j4rIf{@H&J}dT)uPd2Zh4ug;L;Gw>Yh`fx64!GH;-)N z-mX5@TWu}m1EG=Y#*R8Fu;pQP`|=x}l`f0U(;Mv4)B>3THq+Ueu|bnrBhIa=%$r(; zMuakB3btj7wG|rnF(ZmqKi(H|U?Kn@bv?R`S!>JH1#^p=?b)o71 zW2vK&xLD+v(w*?4Vw4xK+_AKwK;*^iS_LBoM5IdYE}^Q!#?9I=HsuggM4gp&?eA`^LrASP2Rw+!5RaZ%Xaab!Cc=Sme;P@j4> z`?Uo#!p>VV$mCJKt$0W*d21_*-qLVSkq2#CiVmQFqXqudk_(ifZnHsCGpKv^(8~sm zxN21Hl>TZ~e09}{53<9f_;}H9+FEvaU=|$;_(UC5>h{ZH4V#3WW_!%f|AJ8zJmQq@ zF~Jhp9Heq!@-gaSu~e?i#n+<+3sxK80*yQj*!0f39lI%!*ag33ANRS>9S|BSN3Lu3 zoJ=f}qu!_GjSlZso$&iRX_^ty{FpY;hT}7fVJt<1>EfW2HjvKKEz^j}>TV?r7kgc0 zSt9>4d8&9?S%oRw={q2`^x4CNo{tokz31Pd4;Qg*$Ep2fYI(E+N1Z0S2Yz%R#u@ud zGBeP6-HQ`L2M~%38z^JetfN}2fW zmyv-ej_TM~u$~pRT8!8V8q) zI`oY11Y@*||0eRplgoA}fuil_!`=@Nv^Xj5))w}DN2)GF2%#<-lRGfKx3RJ%4vu6j z9OXoJx??@gZ1B|Sw1hO(MBDe(WtPd@;zhHjsVsNN1~W5BdQC9Lb!&YEL*lKy4urXx z$aPG%^#OaLOkv()L~{8i(@0fmsx7h|_BPL)*1cCyN$8)KbyJsinzhRto+&VGl8d4~ z0+p%{5A1cidY^J-4oC9-s1=zX#cqt!9I)Uqfy@XFC6qI05L zHw1=Wa+WPKDhHJ@{1PyVbju zV}%GD|I_WSkBM~%Qpf+cTSVw*|~sPfn5FRi1W0S^WMh^@OJN=#O1`?UUw-(g@2HiS-h4%E6Z)52ii+RGJa8 z4o!6yGqy7NeN|Pot7a7u#Uc7xC*yUO9Tm;LAo2 zy;z2bb-sSFUS=F{*}&n(QpfyyBZ(4z{giyc$$det{v*CW*je4(E3oS2QlxlkXDdZC zEC(Faz36iJh0X%C9oj-2y=mDc+0K^YA762fVDuL{Gw@`TBp`$JyIC9W{ z1j755fpAgE6r|_;*+8t96!eg@IS2Ec4xt});)>BaiQFV`0QQF_wXr9IbMy0`mtI_i z!0ttvNjFZJU2y}_p`G(@b=9TJamm7CjF!^nEp>_ilclJEb7&huYp9OAb>(-74(_u= zSY#SWnllSwvlJm5CGTRhZvMvld0mBiPE6+~Vi#4X z%*Y}Fk)GGJgj^|or`ojF%%UxYsO6>|sZlPUHhn(lC-ja zVqzm2c+tf@E*>#lqT2|bAiDaRYvbR_m95e(Xjy29os>+}NpoDQ7EP<4r>1D-(emYr z2Y}jnh0^&MxFvf;+^4n~N}PXR+RUCgh`J$gd}sX>n}e+H4LV7Bnmt{OEp(<`lrYdb z5=qQ=G4<98=eBymL-&6Nc@T9U(QB_X=Pqm};<+LFeSAQ?$N(E?gR*g~v9mmNLhgNb zvz3)H-*v)^m%7!3HA>lI@&YkYb`~kl;b}pwye%u=OP%P$$`aA?2A#6p6fY||k7n+? z&MS3x?XQyHb!iY8{5o?^xpl@$Niirzc&oBblV>5K5f>z7{^JYL7!`J|JPmw3De&=_ zU^ewDTNV@5wuSeb=|X1?&iXw61!j2pgPqhYOm6JIugW=9r8iIB7z?f4sjA!5C8sQW zwLapMAwg)JZIl??Ql}#J5VcZr04H>@Lm9h@oXrh4C}F<}F`@4&J9~2HO$BE$x>j4e zX7+}8Q$=l<#|7n(J<63JGC`OGoFie+Rtl4j6m(k2109gg3zMAaI=W->XFw&M8IBLJ zHu=e6*TQyG0n|BO-q8BV6k6{tv?gMa{C9qoLTiYG(N*Rr{0jAx%Hy)YGIgMbg)jX^qu_2Cl~vQEP8l z@V}Tx65-XXDP&*5%%E$#2?77knL#hW+rN8e9HrK@m8Z^M$=l3Wp#Vf%xQ?0`{3UY# zTa%elWHgWJpOW`DQ^sf>`V@!BhvK|=?ox&^t&l|80fME$gvw$$WitajYtW6KtZA%Rjj zV3|09pGa)PO~pFXvdop-HdEV}O1sNb>@QWU!RcKEFwVH}Ts4us7N*BMjkX3REI5dk zTk~F2au23l5t!0Bm42}NH|0YW9!@`O3{Gr;ByK9z?fPftEiT>*aR>p~r(xHrAJ);E zQwYHu$#j^=#ZROV!iacUu@f*nB=7szrl^19P*sqUv*jtVt4j3!dbC8pvW(8`HyYk- zcs>mJve`5Ks9$biO>0JMr=h5Ho@%92G3~J@Q1nf>&mK9|`b+uY^0buxz>(&s!aboor0p6Q(9v&D&C%i&9Wj%5m}+$WzaA^81myW4_KtNOyU7SX8iSVEg9G>}f8| zdS>d&3!aEaL@QOQQ06ZO$X*G8YX|DTX=pZVnzz{7foa&_L8XT(R3)9D@pRP_dx!ki zgl3-Sv{n=fbJdrtHAJp~GGg`Dgt0tQRWLW{<<+Xj(Ek&uO+7GS zZ$taN1#%)5$&X)dYEv;$f+8_y`^eKq(s<I$)Rph~Exz%oYJvc1Xg|mH^)NNwK2O-urDD@h6uObq$S_XE z|JJW`+mbol1Tl+SZU}|w@QS);5-27*OZ8J^y3vy=}`Mg2ra|+8X%^zUAsao{od~cf`6FW86 zB#|4JFDD0a;hKO-SUNe~`s$@UJB4nkIJa*|-P1hbsFPXXqApIP!Oyb?Uv$RhLk5o= z9CbBZ&~>-_?B!N={Hbn7!B~wu>rk=})ZazYHl4S8-l7HdqL;QiP@vt7%-p;*TcFJ8 zg|FDq*=8asJkhk$Ey4S2rgw8<5d9y&ALPhE!On^GIVng6O6ylFe$~hadMJgeYjXvZ zG4f!?jAdS7xo^J8W=#r3pmYLs7!IR*(kCmD=@>$Xi{rXK!DdjC42;y&vaMrSY#LsA z{Bb87NnIUPQ%sjE%PvLJUtRQuTAxk$h!TT9AksxoI_jefe5Q>rEy7oL_Ip*{@Wih8 z`sGM8cJ@ZiMg3(1q|05kNjnQTq%HMNOIz4Pt;*H>Rg2icGW33khJ5yGb+hB^+G-@* zv#aC*a&u8aBTqfNNqte|Rf4W-E1*_Wb*ja^8fziM-an~sgwWbM`*kM~SStGiVU3is zfYB5uv^4&yVB#9KIZI#~8yfn0EbB{zOMvr8weqWKvCa|QKG>eOS(Vq(n6C;4Xm34<1@)q0{Gv|Up6 zW^dERZgWcHXe!{gxh#x`mb~BaJHITeI@4Lww0W2#?D-$bZm>VrX40^1Pk%!Avf#lw zyNGgk%~N&{XU2W$<5dZEH7h)d1>?jjC(Gzd2hh_#umr^Oq)aA$1%+roB8PyIKR~N4J|XV^L}uOxGCe8sDg#=g2d} zgPxAXmNn!~)3oc81^+H&LzRO*{N>f*0_-R}(aYNkX?rV>+lB!g*wPuDXsKOawQjgGqBQnsC-Gluk^W%l|a+90d>8B{mpf4h^MB+C`{KTem`tvd+#- z62k|y#=TP~xk7B3A-CjZDZ72BMcT}tg+6e74~Lo-|elu81mEQ^@yQ-uW4Jmdz-sG{~H_5V&)=6 zxWjFpvGxGy?Tf#7#k2q{MTm0){*T=B$#K=EaFMdRKFQMRZ}4oz^_TQ|#ojEzAJI^@ z_~~7l%mpot4amePW2k8pTOvB%omxrBJ~@lP3F4-UGov4gF^?oswor#(8nc1&h?E)g zZ#QcjBx9E|?lE1rsb*6cH8rgh9^XZay#O;kCjd|^d5bA12r*t2Y&8W%Xug{~t$I%0 zlRXpnq$sGFs9-Mw1+_NDVAeSUDx@ldQ?U;6G+;N8GGEq#^fFaeVh5wREYvDh!YT65 zby@^b^c%ZEx^6Z!Xq6{Z1q}-~0Q#z=o#biL!}7Mr`&)H#Fwj}kiHP^*Yjuv=#$N>s?V3F6V!5Ci?%_2UUWWGBDZJejM$W9<}ibIyvn9o|8M)Y z(MRe{u4deAfIWT*<9qo6y|A-J47+mp-~lIG_Pr4!hdZ^i@HW@ri${+bX|`Ox8Z?-; zCbiqAa%=wdt*Go2uih5Fj!~itpC&2zl&vWEguYztiM88G6l*DxLi?91^ppfNr(HQ> z^gzmuwedo^B@!h?Zw(;M95vV;v2P3zK8+QuNuz^S2wMDxfkG@0x)Hul0PE#)xrP^} zzccI6@C$kBjOG0LnegNr`U^g`7uKH--b^0rjW+n>;`7P@Cxtit29F#NdJ$g$3h*hN zE&sQpM$4QH4E0*Kgp+(L+rGlWD&1Yu>oweasQ{aPu&yKPIe5oN*2C&Xe3G6Fs`jCHA4SsA9-5WvX!T& zA1Ht`N8G-`B>ob4uY3urrd0#*03AF0g0pEYPt%W87QcWc=hC(Z%G(<0j=ln9zpGqO z^iUZ<(6QM?blgkS+Mn6Gs~;B|6MGJeMu|0y!jM>bVl2{}hf|?~*3+gh<=xt$0Q!g9 z&-azcds>(4Yi7Dyhrg~e+R6i;p33JJlunLnrw-yXS(Ra!{4w&O!u|D~+cSS-(q9Lq z80g}cjag_ABVl5>QV+SPmM3g+vvWnfY84#zJEksa%8#wL3gc(2P$iGdD>K|`}R>fj;QB7y;2w0)s!pbSp?|=eebDn9ah>RSYQ+)ZDU_52BIAPAl<)L zS6eGVi>q5T=c4J0YEdLi%hXl)>GFHa)Bod+_M`EZ0s_i?#g7J&tK>^hsnk%wW^X4? z^RH0`KNRhXkj}#;iUue(xk43w90rvh2M=O$>ue}MHv`=4tb*Bve$$vk`}!^(?Yl)c zzv{n<-2IqxT`XK2?O^Fhm5W>+$Xu!Hex2}gdEs4VohU3q895RgAs^~yxz!V0ulv3u zSG#!p-MduewXIk)?EY7#gatiaR!rPDY)PL})MLB)9e1zDGwwDuQ%`1TFUq1%PQ%)g zJbl0tx;R`AvN`)FH8o&KHxEK0w>!2R2pzL$6ZTML21|hV-SS_d-<|UgOPqFz1Oc|b zx?GAMDu1+msANC#bj(jQSS30o4ncGbVWP)mg`M${Y@j@-`*+f?X~@lgr##9qs;G3( zuy3n3*4>+{WKwiolW1D?u2FY&mxxL7Yff<8J;09$uRI;D%1!?>o@K4gDR61yD zI-~OZRDPg5<##+zD68*Wuly5XHkf<_yf7p49v#x<*{24Ht0VkzRHf>C9Ez_`+=>3^#+s z5_c_L+%RX!(;8G`v>Z*FE^9)5Zq%=s`6-O`ytxf_9zC_T?zx~CA$p)Fmr!G80E$8e zT~UoQ)je1HXb=dGJ>qGA_-Fqtd7e>WP_y+Slj4 zFyn2JFLyh8!Gr#7rTB1#l|NLh^fh(^2XU)Wvp8zsguYuPz zwJHCiChs@&o$H&gh{<%}ifq60#=BUzVge!)usi{&g=TA(=8%Q~w)1ofJ0MJSTkdRP zvT#pRr@Zn@d=8~%hGiR?Q*~-gvHS+Gc-ekXdDzg?&4-o#2)cS=epN!I(yKO$Q=^Nv zIvzE)X8-exFP&s z3-lcJYw$~~%TZqy!vP4jKO%4J^@j=wyNPg{gvhhTwvB2&ocg-X*(AEb`l!*0!<3v2 zKTTO9@7Lnu4S$?NiAT$yC?Cr8n~vKP^v>Jd)iTTEv(|ePsEbxgmt;zA*6cc6R5c=R zs$&eb-WFO@H>c*e%Q{Lh7 z4dX9q?he$f1;GrAnvw|55-V=(Dz)x%M_44deg*2^QsfIt^r!T{5-42Z(~Cuf$C#hBM|biZ}B?IX_YB=uTo^)uE#!!0(z)dfwjw%qQe1V3*%L;Sff%g8veD$^BB1U;{+q}-6SAYp5*kL6k^ZTC+0pd2qmbvanF{3{ z&1m+|Hv~ddZZwzPGVhOJ)8J4lz@m`>Ej6NM&nU)84QO1BjpYh|)xNy7Dif@mh&$xe zVr*8eu&7cy(<_RrUj@TbJRoJwHHKjUqMHPD8l;^&KP*vsGQ#X z7>cyE&>cPE%8^3{k1Pz1f1h#9@QX&k)Rb{Yj+9NpGI0b~>?k`gV)pbe>X3XUp%v}p z(5fV~GWnF@WXrDqE0fQPc5${gN!seNfqG-X`Dm^QptW|p(CEBUQ9#K1`ZztQ^ zcQmK>RngV@{YYg+^qT%27UiOoss)qD711)~XOx~({)?l%qYL$W*9p5tHHxnsmy51d z`t_4rM%U@@g;mX?>-G0$u@LR`x62JX7zfa&$)3?t<(rVNjvDkAOVf+>w@tIE=!Z)8 zhcT_Ao%MIWiWYX4azJ$_)ui)-X1hkutKLP`(umjZud7!`18=X|D>_u|#x&10$~V19 z`{-5uJ+Vnebh6sjcHAy@I5T0=o_1vTvoY%{GKpJxY)2f!hYK?v!|OFqgW zeMmz-%6Pa*lL%n!o!>4xuE{Rav+odHSEUwdaqb&cn7tu>hi}43M|w8Oh` zD3^LDgS6C7Td1FULV2{2w$L`pr5)BT^_{*x+@!Vjk-h=H(C^U45KbQ$7jOX2H(}sQ zvt}(LUZFRyZ{`H`;em0$3-BS}Mj9t*U#|)6qdrwFqrX(|5bZW@*XWddN9!|qP8^>8 z6AlbQx{!}>!Wetz6rS&Z5A=0`IC$y;=a?IZkJtQ?-z>pl6g7)JAKOxtu~YmFoX?%u zDxPQH32`-=zz7vKg4dJ&p-^*|gIs`muJ9P!mJm#Cc%pvFn^B>P|!oysI z#)6lF$F+`@P2Sz`6`bWhE?20aPqUl0H2i{=1iS`+|JbZWG_Xm>%wNI@J9g}z)&~Ak z-^9w6@n2{KbwC^V8~l<<+Zztl=Udrde)CPbw67b_YAgJahjsx!=0=z+fu=%t0zKtB z#0R=d-ik3TT zZ{kSLdaZM-g38KU4eKim029;Poa%ic6H3HjvlCY~bb7Q%WzFLn3f=P%F$dzEaDo z`I}ts=Vlp&DW*?I=^NHJ{{2ir%Hu-}(rD#8Dg2iC^9KFy7k;Ok-aixQ+kTD@4AOfO zXLt#*`aFNVO5?Pg7CTv}HCdq-5~?f0711E~l>-JeDAWBRKC)(0?W3B-!%{!H*~Z6? zBP+~ay6uCM&PAlIK4l(cP>mo+*~GD>G9|pNv4rtOW$q{|@$H$!ez@+)1R|{E_VWu3 z3ng{pm-5}|lg#+2_ILVum;cFyL)nb1i0;h<Ik z@B(;?s3!HZo3}-&6OH<3k~X}QNn+y0hDEa;oA+>NrUX`KW@mw6D|IA|Qdj2ut zB{R%jAX#9lCQmvqESDZs!ql4vVNh`zUte`Jq+DFU#jDFD@JNxo5TlxYxHX9-jIqXr z%R}>&F<(Ao5K)=bRY}K}Pii+g%_OKud2up7yD$M%0OI*(h(U$lRxZwnj1t^loWP#K zkz7JC8Ml*}Wvnc$D_I$;qdSXBi=(wxyW<7b`f#J^VhANusHV{j;R0-h-I6MRMd5-} zTU3;UtpzXDR77)qDx;-YjfaY;UXeO{7=*#z9z!o1Y9|=#)?$}Qh#hx{Z^CRr@~RGPJMnqtAPqSq<9@2Rq>?$={6e;+95q$5ws z&0jzLqa{z<5t|ZzrqDC488v$F@ZJM2y9NtB3f!o`ng`~*gWiFjO8P=Un+S?mX9cLl zaMGmD>f~20b?&5eEt8lc`jX*Y(703jHjSi@vCyY&M_RNeWTm%g)a3(9g&R3=g7*rs z`z3O^6n0fg3~%`qI^_9-YVXr{3M{24Rp0WdJac}0sT4LK!gE7!vC5^>_?Gl5AM0Du zUnvqGc8JbN|5jbezM{4`CcSHzTM#X_A~4YEY<)J?zoz7PK1DBXB-(7S`}Jp8W9dB9 zR%Fu{?}#>ps(CIOB~59gSeSC~wEm^S6tkXLupS#97163}RLoH->eUia*=O68=*<#| z{L;I&MAXs`7k;T+>k6ZSS$;b9WHLUKt%6xP70MiRKAc0d!+g^rCwdys0o4Cd)oj@&-`@3`WbKM=GD!bJ>zYKwEnY7Busr3j0R@?>cFrbPe=h%k*SiC<kR4wX6Qk_p5>dVl zH?=;JP-n@H&e#L zAqK`Q6I0`3w9v)tneXiMI7*9`r*E~XFk!Rr;9P}j=b-sqV*PI#ovHa!Z3vOl0d`Xi z6LZQ`Z^Z`gP|~`^nSe}-S7oC-Kwiy;+H*rBJs^c@Y1qBsS3bm>?o+IKQnCOVDPoy(+wO;azrl#2G<@0N-S zJXW*lz~WG0t=jCz=_D8LpK%aLbHDun^mo6~Ej%X`Exz z&yZBO=U9eWQ0cYeav!IK(v}d9rK1%bFM?((M>nT_7V+U;vUq1XEsWHCu}N@12I^?RBB?KfB}_^Fr3otXbQe(7q)0rMZ%{S42iyhPw?J(%rz{do;b zpHo4r2>!k9=YUlUU-6c674a$&8RgtGD!y41o6#DUaIZuH2_UPYbtNOh4)e3pu^uTm zmW=J@3HGMav7X39(zVF;hn-h9Uvjl#7tWNp(DpZ#QSbU--QoHf{jruPFz8skT z-EH=UrN0j;56#5Xzde7Yj@_0%Itu|?FU1vKM9_#FUNS1P$9~Q14@B&l%cqk+A?W*E$-$I61B0%Ch zeByXB>*W%KPc&uEyU2Ox*5=IAcUQ<2vto8ucdrjlXvPCRBssx&m=Mg5Rz@}cGdu!U z5!HqeD{gM`E4)~hdXkCP(?sObX()HTJ*y_t79#w*wk-ViBB~YscRYO0#R2JU|4W1> zwt-dSs%%KEc1g`NuPySbq6{;`fr^s98N$-oT35U5H;P+ZDlW$4bs^SvC{@u1>E8(# zta3JHV&VgM#cayNz#u3PJuz#hTbbFhdG@wC6XPM*yeKe3R$3NEd;XwJI;LBwqg^&M z-P#V>C_k?{`p|O6`8kU>;{#Pv)}wE+EH%^81LL@O&<{-orL+02_foVym4T4m6WGHE z)3XLzLfIbJR+t&YW>%W9Sntt2Xe<^2i+$yeg)_wnt*Z(`3X?t7# z^uMC19flT!B#PX3UfOF9=AsS?#uAIY4AnM)~sP$6_hh-w9ij z)Gka>bw(`ZZaHu_mngeS!^L5K*by4H68Vwbh~QpV;pGgw=vx@*PV>1g8bl^`gq4!R z$_>Qk ze41mll4Zdkx44ToJQ_Ch&pKB~XNqOqu298+7{`^f|{IuFe_S*d^(xe zJx%2EK>z+sl2|a}su?mioj;rq>sEwY{PrA|jxK0LI<@cbdE?XRt-nsxNJAc&kdE}Z zxfkH-;--EA4sWK6p-poHdqk({XJz#0q;%rcLFVYm=?H6qojG7jIVl~*^Vu6E4(3{_ z5AH6bH&V#96O6&SX_=&UO||QnfWX!U?tEJ5%<+gDvISUXH)9o6aPrH&S%oI2##~x0 zKFe}vXk0=s()D(P(ay=ZG@OW&Er`3e*>Nhqh`{~m5{g`0m(B)D5sSOvDldITYigq0 zPiLla0Ww8rW>uC7){I{CoB2yo1#n~CP*o_vfi3$-KoGBB5CM?G! zL=i={n5JA9=A_qt9h~{aWnx1hu3N^EI+v1*#2k3JUla7pP)3z=J-YzWTq5rB+H&LZ zL20?-?2kBI8t&L<)YDyXPS<^lvCNvxP2gBUuOgc@X&KFbcG+)S#+&ua$>81Z*YrC! zBj|#-s+}BPTbWo4fZUqut4qb@^c3JN85f;x@wHzEjBObd(u~?$V2uL34!qjN4SxF- zE8@ArxusqJGD8@JnU2PF69uOD>=w=~oWXur5L0xP|HY(i*7PAQm&lW1lk;{AB*X+7 zi)3N%Vpn)EV~`ypI~3tIw)HJmOjO_eLz-qzBRl2OOHp*)1XUQ+!VP!@yP|t0mP}yu zk7sM6!zYzYknElgom?_OvWdbvg&}5vhS`s!R;9un@YD(%T-0@9ZowuozJ}mSHf|!6vWr%vou2I-*sgVm(+|c0_=_nhJaQh-qu_;xB zNlM?P4C#MaU6{Ucb_2r+PK(93ZZotHUvb1zLUy4^kP>SPUgHI$9bOX#yBWSXyL^N# zfS_f2T*ZzB>r8g*7_gf3QQOL*#Mup(C!dzsZQ9GM|Jy}Q%?KCkAUUSks=7-yu53mX z)Uc_dUAbB4DjHSgGrFni0y{Km7hq|8ju=;~<#)~66?BNz+{HyQRG+1n8aYj6IKKrO zjX@xBGRjAfwG1g9DBcW*f&2ADS7w>{Y;9UOsjy8(AT4g3EPOF`W|YA~##HX?;9+Es zRlv3W{i>b8%_LxlCh3In$-YZn(Ol(bw<(_ShAucu%*KLSol(9hwZ95#sV&WK$Lwr8 zO@chfjCUbMwOqB$CaaN|X9u;d4X|1&(HfJJF=k~byZjp3B!qJGShaPgT}W|PPfYJNVSrhXG&pQ` z?%8tEm=CZFXO7!q*;om7rB})((iR%x)-9TXp`_x(X8$IO97PkMwsyw5(p$q?87a*) z2&SL1422P*1W4^BG@d{}vcmqT8D%{`Z_63xPOJUUZ&@d9vGi=~tcpKwIhXaKZuWwW zVfn?7T(+o!j$%+NyQF3`C$Vj$j;82_yOxJdA{SnmSz47Chbovlrf`fQrxcHDVHn8D zj;kpFVJ|EjoQ%zv`Lb~-+}(dnW2tO18dOhfG+iQ5dTVTB;rPcZoRm1SboVoJ8R*Bq(nP}O+Sn!BezDWgtx zAI_?A87^rg!y-LFZci8h^~Fk<$P5cMR9_TFCb)4(bx}@k7CEF?SR9$Gd`W$___G#7 zLz@(pX0s{T1DDE$0Y_#}X>P^rt}!?VSW(4~pJ0P8J4+qP#)4f8WX6myab|+8nAo{{ zLzwR?F3v127KR+SU@8*ZO4^M z=&cin4xO%qF%KGpL)}h@-}-V%90EWeCr&6+ijx$Qq6 zxn!n8YDs=jQKqEijAC(hnIuWiFvZENDTa|*hAk2Sni(tX4JI;o3&KnyC=#2|!d_TX z3mS#x+GP5r8YOFzzF*O!?r1Do|EsFLV%G&QVVG^XSu{+7;z?i@Qmvk{w^{~g8CP>*Ef}d13602H4H#0YGWxd>_@zkk$EIsx$DIp~^ za{IWKB|TiY!EA`8@+3n)Y<#AoI6^H-Xu;I-iIUaso$`s2iPd33+3Hfwvo7_Vm`Q4M z95b0FDc1c3%w_uTaC?C+&uGvo6Q|Z)&6sAKf{*!jcj1#JNycQ3b#LlIZGo2+K+;PH zB;x(JTd<>iI-8g+E1Dy37k`S6w*oBAy0P1sOg4AZI>iquS_2nLh#+=m0o24rtP{FR z+sWZ3Sn8KUOCKl6R9o;`)uG*xx z!^@@-JpK8C6}J1Ba)qT+on1Cnnx8a!W9#FqWzz$h8OvQqu(b_bGZ*DCnrgs~#qtq0 zrjwJy%J?sA(yDq@#zuq*^89=2;0;Ag~Pr+aRzF0{@#J za6mh~E+Fq-7pOkz(8A7DizV2+xe1H`w*)G`6<-%1C9h22xFUe#LI4i+e;msGI5hlm zsPN;^(#N5Hk3+>ChXOtB5xoe(m%aL+zr6CmZ+kICe|Z7IQsyi5OHcesvmEDMz==$m z+yW%rAf3IoqQ9tl<523xp{R{R?bRT(7MIht0?y60E`kX4!v0154q+p zhqfyYbygfYt2oqCapK_iZKO97ZQ)SO z!l96bL*ELAS``i@DjdpDIFzAq=se+2bHbt4WKJqfI5d-Rs2|}_F~XrvghPo4htd!Z zT_GH5LFT0JgF~qYhbj*a{T&>tIyh8xaH!(oP`v@3yvoI2)M9Yxyx>q}!J(ysLjeWH z%S$-)NpPr=kROc^9Eu>gA=1{sp|ycS6N7XpT<{mo3LKggIFu%EC`sT@jKHnattxuM z>HtlsvKYTcT8eG|ZG*rz2>h>wfYyJ_{FoouwhlOY{(o&9KqHQI1MN2)`fWJ$*Kp{k z;m|+B*-NbY%PX7YLwyW~f*1}ZFmqDA!lBHCLtzVtQWg#kEb^mjg+q%9hl&&q#U~uv zPNYM(35Vhm4t*pX>PEOP{a=)baOex+Py;f@OR{pjoQOkH$Lg0t4vv=)aj4wjc;OT0 zUYm^U1xbFRGJ``!hWx0+;Lv%&q1l2%R|Usm6b@Yz9I7NZ^hIzeh2YTqaE_NEwNI4p z1`Y)c99kGSR4u5N*C26dQQ+JQliJrxV}f{eB%ITWhjJWr;81KJz9t%~HGlKwzz=N0 zga4a&fG!ITEfsUpJ;CvEDGqfK9Is;HcvTntK{Eu0&Ib-{4#Lsfz@d?WL(>As)7iwM zK!HO?0*4v|4owFfY797g@l$_MTOc1VeOmd_M!=zeU`}cTIMfMn9mlx8OZ{J72Q^pG z$^M`PP@%8y>wq4|slGWKwc|LJ$8q$I<76FouK&xKIL=;})?W^~|0lWwv@O_=t$}-t zv{+oIN8Lpps`Nik-c7E2)Wn4kz0oBPt8mHtr;Nckz!jSYi~;0_S3EG5t;;b}MvsH! zEr0COafsw@9kO9OB=!7Zr%ym+cGiq}6Idb+yzRpYkod!@&Rf7DSPYK6&dFmXJZM zH{8NjwR+i!w?X=U*Z9tL{Y9()Olz??eRCDmwXBY}ppqJ^gD?yY}8^e$5uQ{bO_PLR7f2=DoWR(OvY) z=DXNR?smiVce5q@)7q!*0X06K{meax?Cx3q#XXSp;pfh|7loSbrmeXb(af@s``pL& z>%r}wo`NWD*!{0eK~#0*_%nXXmU!i3*FD72*8QLzA4XJk@Rbidj0kDik5@g6osEVg zeozBSuWL4FDk8ckn_NE?QvS!5w@ziL`RT2{oQg>G+Chguj_!4_t}WfCfzt?HdFEbUYFOg zgtmBNeH}~6sGDD&%iY|i;}4t17XPF3j+w{O__M2iIgcgkx_kRCKos~+hjj~jHr+mY zYUZC8u#_+Fw4$D+cjeoC79m=g_3Xw)EOm=Id~-1(s|%j^)e^S$hnzTcDWZw-(Sto-d&1Fc5=mW4fcTa@s~6paz1y;pBfMqo<5@UGM3aY@1OT1Bw*Sb8=vIr`i9xJ zEk}g5-L!?vAt8HpeEBIv%AeJ@d76vxS3WW6X}0j!?S08JunN0gvG93V!k)W7^E@PP z$h$3GWXb;Z+CD2`W$JdFvNEdZ6g_d?t1A)tUVHPfmk|l>{FAF+hGblE^$x2L0p9$( zgI7TkyFc{MDs)>e+HTP*M0@+(blEG2+HYU{#Vd%&?|%B7S6TAs4%z25L?`z=am8zh zScVR|3=aYq_I4{qb|wB5K&B;={GDa7%BQ_eVs)KN{WY z9Yj2R_WyhxEX55^UHvX1)eB$#;9W#AT~1y39-`VB{e}G1owo8lL`Xk*X#Woo9esDh z$PW;8Z}*pvP=HPgz<{JYdLYh&FI{tX%Z@*-TK=^f&`h^gxCTe3ss8^e`F(J|(P1{5WZ*uyJFs8Cu8wp{= zI_fXX^85M=6WgbGn+T?pzc3j`>#s3;E!sFHFW<(PvoFWAiE@gM#UOa8Y*Chd!;d{y=IeYrE<{>SG^#hu*!sIPIP@xhm0>xF2kO_yKxLd16Y z2g7E52soehYtru_L~^39`Nm;Lc#M0jVOxo8j~xG#^GeF-AR>))stf{5_U=UWZoXl3C`hYv?IxBTD7 z4ri-%;r-n&TzNTGoOb&D?OV@Ff)M>(( zKSY$fuJRt0vUxMi&c6vS_tD>5C$xz=>+jblw~6-EUu|-=^$om0`)-X(7@ zy3Hf${QZjm+o4KFgPKn#pRvD*IA1*THx;m6WBNZ_0gH9a=+CPVPBz(l-)fHBF6wtg zHKNaa%gd`dnz~@oJx#gQ_&|q#%{W4=-Kl>wSlJuKU(y`W=jsc7-JGrGeqXF^!B%zI zyN7MZ5!AJ_PuPxIu1n|l+m55chwjU@u2rR zile|MdOqC>^}_}K(Xlm0UVj*HTx*WNUL1a5Yed8MpLj`Yj-oanIK4G2^DeoswMBG1 zWbv(S*{Yp$XbZ`~_l#cp*-v(4tM;cI9^MgA_RlYPc}I>+Z#iM+P8?xPT5?P~j&6SU z!inwJLe~EB#`YXxj=u0u?KxUnapQnpID)!({N1~-HGX&bV;wjuJM`<1ci<>=^)+*M zjtcRzxyOgVb=^;Xl4 zWD6bW(#Yd(I-0FYpij-e)%iHK2LCELwYu5s{n=s_(yKeaJ>qP(Lgnbz51u;c0=8EF zD*840iv7QbsN&2yYre-;tsFgTeZ(n49&eh9HqE;JQbZpAD1F=Sirq&b(&)R>uST#H z+Y-IIqsQ}Ca7Qc9y^D^xeC?Ibw9qhb+@9Pl>Z5n?1zeQf8B9gYv zZG*u7Y6yJRtU~=`_2=(4w+#Z@Ag~Pr+aRzF0^1<)e*ppqtCQ^Eqoa@Na^ca#MvNLf z;DkZ@ce`-=B_2YKVVCROVf~e~MXs{4 zowmW%`np;k@j-B#H*bzM*GJK$0#Df1_ybhveiR&6Xsk+Qo9$3xtwj2x<01a@E}zfq zOP;^UAARPdJ__s8M->y!-$?)U$x8yVIjXO(j|kC^^dE(6j`9l2Ta?nO4E?Wc3fShh PL0}sM{@XyHOZ5K%P+rf1 diff --git a/src/WINNT/doc/help/ko_KR/TAAFSCFG.HLP b/src/WINNT/doc/help/ko_KR/TAAFSCFG.HLP deleted file mode 100755 index f6a5e567e73addeaaabdbbde425e617c4c895cdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112173 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 Mv_jw$gFvzRUqx`c?EnA( diff --git a/src/WINNT/doc/help/ko_KR/TAAFSSVRMGR.HLP b/src/WINNT/doc/help/ko_KR/TAAFSSVRMGR.HLP deleted file mode 100755 index 53e538a0b0e5a70954a120080a602b8857ce5c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377731 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 z 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ℑ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 brBs>v0=hmain -2 ¼¿ µ¥ÀÌÅͺ£À̽º -3 °³¿ä=Cell_Database_Overview>main -3 »ç¿ëÀÚ ¼¿ µ¥ÀÌÅͺ£À̽º¿¡ ¼¿ Ãß°¡=Adding_Cells_to_Your_Cell_Database>main -3 ¼¿ Á¤º¸ º¯°æ=Changing_Cell_Information>main -3 ¼¿ µ¥ÀÌÅͺ£À̽º¿¡¼­ ¼¿ Á¦°Å=Removing_Cells_From_Your_Cell_Database>main diff --git a/src/WINNT/doc/help/ko_KR/afs-light.CNT b/src/WINNT/doc/help/ko_KR/afs-light.CNT deleted file mode 100755 index af5b03f88..000000000 --- a/src/WINNT/doc/help/ko_KR/afs-light.CNT +++ /dev/null @@ -1,63 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title IBM AFS ¶óÀÌÆ® -1 °³¿ä -2 AFS Á¤º¸=Working_in_AFS>main -2 AFS ±â¾ïÀåÄ¡ °³³ä=AFSFileStorageConcepts>main -2 AFS º¸¾È °³³ä=AFS_security_concepts>main -2 AFS ¶óÀÌÆ® Á¤º¸=AFS_Client>main -2 µµ¿ò¸» Á¤º¸=Audience_and_Purpose>main -1 ½ÃÀÛÇϱâ -2 °³¿ä=Running_AFS>main -2 AFS ¶óÀÌÆ® °ÔÀÌÆ®¿þÀÌ ½Äº°=Adding_your_Client_to_a_Cell>main -2 AFS ÆÄÀϰø°£ ¸¶¿îÆ®=Mapping_Drives_Overview>main -2 AFS¿¡ ÀÎÁõ=Authentication>main -2 ÀÎÁõ È®ÀÎ=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 AFS¿¡¼­ ÀÎÁõÇØÁ¦=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 AFS °ü¸® -2 °³¿ä=AccessingAFS@AFS-LIGHT.HLP>main -2 AFS ¸Þ´º=FileManagerAFSMenu>main -2 AFS ¶óÀÌÆ® ±¸¼º À¯Æ¿¸®Æ¼=AFS_Client_Configuration_Utility>main -2 AFS ¶óÀÌÆ® ÇÁ·Î±×·¥ ±×·ì=The_AFS_Client_Program_Group>main -2 AFS ¶óÀÌÆ® Ư¼º »óÀÚ=AFS_Credentials_utility.>main -2 ¸í·É ÇÁ·ÒÇÁÆ® ¸í·É=CommandPromptCommands@AFS-LIGHT.HLP>main -1 AFS »ç¿ë -2 ¾×¼¼½º Á¦¾î ¸ñ·Ï -3 °³¿ä -4 ¾×¼¼½º Á¦¾î ¸ñ·Ï=ProtectingFilesandDirectories>main -4 µð·ºÅ丮 ·¹º§ ¾×¼¼½º Á¦¾î=Directory.LevelAccessControl>main -4 AFS ¾×¼¼½º ±ÇÇÑ=AFSAccessPermissions>main -4 Ãß°¡ ¾×¼¼½º ±ÇÇÑ=OtherVariablePermissions>main -4 ±àÁ¤ ±ÇÇÑ ¹× ºÎÁ¤ ±ÇÇÑ Ç׸ñ=NormalandNegativeEntries>main -3 ¾×¼¼½º Á¦¾î ¸ñ·Ï »ç¿ë -4 ACL ¼³Á¤=AccessControlLists>main -4 ACL Ç׸ñ Ãß°¡=AddACLEntry>main -4 ACL Ç׸ñ Á¦°Å=Removing_ACL_Entries>main -4 ACL º¹»ç=CopyACL>main -2 º¼·ý ¹× ÆÄƼ¼Ç -3 °³¿ä=Volumes_and_Partitions>main -3 º¼·ý ¹× ÆÄƼ¼Ç Á¤º¸ Ç¥½Ã=Displaying_Volume_and_Partition_information>main -3 À̸§/ID ¸Ê È­¸é°»½Å=Refreshname.IDmap>main -2 ¸¶¿îÆ® Æ÷ÀÎÆ® -3 °³¿ä=Mount_Point_first_page>main -3 ¸¶¿îÆ® Æ÷ÀÎÆ® Ç¥½Ã=Displaying_Mount_Points>main -3 ¸¶¿îÆ® Æ÷ÀÎÆ® Á¦°Å=Removing_Mount_Points>main -3 ¸¶¿îÆ® Æ÷ÀÎÆ® ÀÛ¼º=Making_Mount_Points>main -2 ij½¬ ÆÄÀÏ -3 °³¿ä=Cached_Files>main -3 ÆÄÀÏ ¹× µð·ºÅ丮 Ç÷¯½¬=Flushing_files_or_directories>main -3 º¼·ý Ç÷¯½¬=Flushing_Volumes>main -2 ¼­¹ö Á¤º¸ -3 °³¿ä=ListingFileServerInformation>main -3 ÆÄÀÏ ¼­¹ö Ç¥½Ã=Showing_File_Servers>main -3 ÆÄÀÏ ¼­¹ö »óÅ ǥ½Ã=Showing_the_Status_of_File_Servers>main -2 ¼¿ -3 Á¤º¸ ³ª¿­ -4 ¼¿ Ç¥½Ã=Showing_Cell>main -3 ¼¿ µ¥ÀÌÅͺ£À̽º -4 °³¿ä=Cells>main -4 ¼¿ Ãß°¡=Adding_Cells_to_your_Cell_Database>main -4 ¼¿ Á¤º¸ º¯°æ=Changing_Cell_Information>main -4 ¼¿ Á¦°Å=Deleting_Cell_Information>main -1 ÂüÁ¶ -2 ¿ë¾îÁý=Glossary>main -2 ¹æ¹ý...=How_To...>main diff --git a/src/WINNT/doc/help/ko_KR/afs-nt.CNT b/src/WINNT/doc/help/ko_KR/afs-nt.CNT deleted file mode 100755 index 3c25c3a5c..000000000 --- a/src/WINNT/doc/help/ko_KR/afs-nt.CNT +++ /dev/null @@ -1,77 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS Ŭ¶óÀÌ¾ðÆ® -1 °³¿ä -2 AFS Á¤º¸=Working_in_AFS>main -2 AFS ±â¾ïÀåÄ¡ °³³ä=AFSFileStorageConcepts>main -2 AFS º¸¾È °³³ä=AFS_security_concepts>main -2 AFS Ŭ¶óÀÌ¾ðÆ® Á¤º¸=AFS_Client>main -2 µµ¿ò¸» Á¤º¸=Audience_and_Purpose>main -1 ½ÃÀÛÇϱâ -2 °³¿ä=Running_AFS>main -2 AFS Ŭ¶óÀÌ¾ðÆ®¸¦ ¼¿ ±¸¼º¿øÀ¸·Î ¸¸µé±â=Adding_your_Client_to_a_Cell>main -2 AFS Ŭ¶óÀÌ¾ðÆ® ¸¶¹ý»ç=IDH_AFSCREDS_WIZ_START>main -2 AFS Ŭ¶óÀÌ¾ðÆ® ½ÃÀÛ ¹× Á¤Áö=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 AFS Ŭ¶óÀ̾ðÆ®ÀÇ ½Ãµ¿ À¯Çü º¯°æ=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 AFS ÆÄÀϰø°£ ¸¶¿îÆ®=Mapping_Drives_Overview>main -2 AFS¿¡ ÀÎÁõ=Authentication>main -2 ÀÎÁõ È®ÀÎ=VerifyingAuthentication@afs-nt.hlp>main -2 AFS¿¡¼­ ÀÎÁõÇØÁ¦=UnauthenticatingfromAFS@afs-nt.hlp>main -1 AFS °ü¸® -2 °³¿ä=AccessingAFS@afs-nt.hlp>main -2 AFS ¸Þ´º=FileManagerAFSMenu>main -2 AFS Ŭ¶óÀÌ¾ðÆ® ±¸¼º À¯Æ¿¸®Æ¼=AFS_Client_Configuration_Utility>main -2 AFS Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ ±×·ì=The_AFS_Client_Program_Group>main -2 AFS Ŭ¶óÀÌ¾ðÆ® Æ¯¼º »óÀÚ=AFS_Credentials_utility.>main -2 ¸í·É ÇÁ·ÒÇÁÆ® ¸í·É=CommandPromptCommands@afs-nt.hlp>main -1 AFS »ç¿ë -2 ¾×¼¼½º Á¦¾î ¸ñ·Ï -3 °³¿ä -4 ¾×¼¼½º Á¦¾î ¸ñ·Ï=ProtectingFilesandDirectories>main -4 µð·ºÅ丮 ·¹º§ ¾×¼¼½º Á¦¾î=Directory.LevelAccessControl>main -4 AFS ¾×¼¼½º ±ÇÇÑ=AFSAccessPermissions>main -4 Ãß°¡ ¾×¼¼½º ±ÇÇÑ=OtherVariablePermissions>main -4 ±àÁ¤ ±ÇÇÑ ¹× ºÎÁ¤ ±ÇÇÑ Ç׸ñ=NormalandNegativeEntries>main -3 ¾×¼¼½º Á¦¾î ¸ñ·Ï »ç¿ë -4 ACL ¼³Á¤=AccessControlLists>main -4 ACL Ç׸ñ Ãß°¡=AddACLEntry>main -4 ACL Ç׸ñ Á¦°Å=Removing_ACL_Entries>main -4 ACL º¹»ç=CopyACL>main -2 º¼·ý ¹× ÆÄƼ¼Ç -3 °³¿ä=Volumes_and_Partitions>main -3 º¼·ý ¹× ÆÄƼ¼Ç Á¤º¸ Ç¥½Ã=Displaying_Volume_and_Partition_information>main -3 À̸§/º¼·ý ID ¸ÊÇÎ °»½Å=Refreshname.IDmap>main -2 ¸¶¿îÆ® Æ÷ÀÎÆ® -3 °³¿ä=Mount_Point_first_page>main -3 ¸¶¿îÆ® Æ÷ÀÎÆ® Á¤º¸ Ç¥½Ã=Displaying_Mount_Points>main -3 ¸¶¿îÆ® Æ÷ÀÎÆ® Á¦°Å=Removing_Mount_Points>main -3 ¸¶¿îÆ® Æ÷ÀÎÆ® ÀÛ¼º=Making_Mount_Points>main -2 ij½¬ ÆÄÀÏ -3 °³¿ä=Cached_Files>main -3 ÆÄÀÏ ¹× µð·ºÅ丮 Ç÷¯½¬=Flushing_files_or_directories>main -3 º¼·ý Ç÷¯½¬=Flushing_Volumes>main -2 ¼­¹ö -3 Á¤º¸ ³ª¿­ -4 °³¿ä=ListingFileServerInformation>main -4 ÆÄÀÏ ¼­¹ö Ç¥½Ã=Showing_File_Servers>main -4 ÆÄÀÏ ¼­¹ö »óÅ ǥ½Ã=Showing_the_Status_of_File_Servers>main -3 ¼­¹ö µî·Ï Á¤º¸ -4 °³¿ä=Server_Prefs_Overview>main -4 ¼­¹ö µî·Ï Á¤º¸ º¸±â=Viewing_Server_Preferences>main -4 ¼­¹ö µî·Ï Á¤º¸ Ãß°¡=Adding_Server_Preferences>main -4 ¼­¹ö µî·Ï Á¤º¸ ¼öÁ¤=Modifying_Server_Preferences>main -2 ¼¿ -3 Á¤º¸ ³ª¿­ -4 ¼¿ Ç¥½Ã=Showing_Cell>main -3 ¼¿ µ¥ÀÌÅͺ£À̽º -4 °³¿ä=Cells>main -4 ¼¿ Ãß°¡=Adding_Cells_to_your_Cell_Database>main -4 ¼¿ Á¤º¸ º¯°æ=Changing_Cell_Information>main -4 ¼¿ Á¦°Å=Deleting_Cell_Information>main -2 ¼­ºê¸¶¿îÆ® -3 °³¿ä=Submounts_Overview>main -3 ¼­ºê¸¶¿îÆ® ÀÛ¼º=Creating_Submounts>main -3 ¼­ºê¸¶¿îÆ® ¼öÁ¤=Change_or_Edit_Submounts>main -3 ¼­ºê¸¶¿îÆ® Á¦°Å=Delete_Submounts>main -1 ÂüÁ¶ -2 ¿ë¾îÁý=Glossary>main -2 ¹æ¹ý...=How_To...>main diff --git a/src/WINNT/doc/help/ko_KR/taafscfg.cnt b/src/WINNT/doc/help/ko_KR/taafscfg.cnt deleted file mode 100755 index f6d57c273..000000000 --- a/src/WINNT/doc/help/ko_KR/taafscfg.cnt +++ /dev/null @@ -1,32 +0,0 @@ -:Base TAAFSCFG.HLP -:Title IBM AFS ¼­¹ö ±¸¼º -1 AFS ¼­¹ö ±¸¼º µµ¿ò¸» -2 AFS ¹× AFS ¼­¹ö Á¤º¸¿Í AFS Á¦¾î ¼¾ÅÍ=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 AFS ¼­¹ö ±¸¼º -3 °³¿ä=Configuring_the_AFS_Server -3 AFS ¼­¹ö ±¸¼º ¸¶¹ý»ç=The_AFS_Server_Configuration_Wizard -3 ±âÁ¸ ¼¿·Î AFS ¼­¹ö¸¦ ±¸¼ºÇÏ·Á¸é=Configuring_the_AFS_Server_into_an_Existing_Cell -3 ¼¿¿¡ Àִ ù¹øÂ° AFS ¼­¹ö·Î AFS ¼­¹ö¸¦ ±¸¼ºÇÏ·Á¸é=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 AFS µ¥ÀÌÅÍ ¾×¼¼½º=Accessing_AFS_Data -2 AFS ¼­¹ö ±¸¼º ´ëÈ­ »óÀÚ -3 °³¿ä=The_AFS_Server_Configuration_Dialog_Box -3 AFS ¼­¹ö ±¸¼º ´ëÈ­ »óÀÚ ¾×¼¼½ºÇϱâ=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 ÆÄƼ¼Ç ÅÇ -4 °³¿ä=IDH_PARTITIONS_PAGE -4 AFS ÆÄƼ¼Ç ¼³Á¤ -5 °³¿ä=Setting_Up_AFS_Partitions -5 AFS ÆÄƼ¼ÇÀ» ÀÛ¼ºÇÏ·Á¸é=To_Create_an_AFS_Partion -4 AFS ÆÄƼ¼Ç °ü¸® -5 °³¿ä=Administering_AFS_Partitions -5 AFS ÆÄƼ¼Ç º¹¿ø -6 °³¿ä=Salvaging_an_AFS_Partition -6 AFS ÆÄƼ¼ÇÀ» º¹¿øÇÏ·Á¸é=To_Salvage_an_AFS_Partition -5 AFS ÆÄƼ¼Ç Á¦°Å -6 °³¿ä=Removing_AFS_Partitions -6 AFS ÆÄƼ¼ÇÀ» Á¦°ÅÇÏ·Á¸é=To_Remove_an_AFS_Partition -3 ¼­ºñ½º ÅÇ -4 °³¿ä=IDH_SERVICES_PAGE -4 AFS ¼­¹ö ±â´É=AFS_Server_Roles -4 AFS ¼­ºñ½º=AFS_Services -4 AFS ¼­ºñ½º ±¸¼º ¹× ½ÃÀÛÇϱâ=To_Configure_and_Start_an_AFS_Service -4 AFS ¼­ºñ½º Á¤Áö ¹× ±¸¼ºÇØÁ¦Çϱâ=To_Stop_and_Unconfigure_an_AFS_Service diff --git a/src/WINNT/doc/help/ko_KR/taafssvrmgr.cnt b/src/WINNT/doc/help/ko_KR/taafssvrmgr.cnt deleted file mode 100755 index 0d9954dfd..000000000 --- a/src/WINNT/doc/help/ko_KR/taafssvrmgr.cnt +++ /dev/null @@ -1,89 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title IBM AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ -1 AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ -2 AFS °³¿ä -3 AFS: °³¿ä=AFS__Overview -3 AFS ¼¿=DCE_Cells -2 AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥ -3 AFS ¼­¹ö °ü¸® ÇÁ·Î±×·¥: °³¿ä=DFS_Server_Manager -2 AFS ÀÎÁõ -3 AFS ÀÎÁõÇϱâ=To_Obtain_DCE_Credentials -3 °ü¸®ÇÒ AFS ¼¿ ¼±ÅÃÇϱâ=To_Choose_a_DCE_Cell_to_Administer -2 AFS ¼­¹ö -3 ¼­¹ö: °³¿ä=Servers__An_Overview -3 AFS ¼­¹ö À¯Áö=Setting_Up_and_Maintaining_DFS_Servers -3 ¼­¹ö ¼­ºê¼¼Æ® ¸ð´ÏÅÍ=Monitoring_Server_Subsets -3 ¼­¹ö Ư¼º=Server_Properties -3 ¼­¹ö °æ°í=Server_Warnings -3 ¼­¹ö °ü¸®ÀÚ -4 ¼­¹ö °ü¸®ÀÚ: °³¿ä=Administrators_for_a_Server -4 ¼­¹ö °ü¸®ÀÚ ¸ñ·Ï¿¡¼­ »ç¿ëÀÚ Ãß°¡ ¶Ç´Â Á¦°ÅÇϱâ=To_Edit_an_Administrative_List -3 ¼­¹ö ¾Ïȣȭ Ű -4 ¼­¹ö ¾Ïȣȭ Ű: °³¿ä=Server_Encryption_Keys -4 »õ·Î¿î ¼­¹ö ¾Ïȣȭ Ű Ãß°¡Çϱâ=To_Add_a_New_Server_Key -4 ¼­¹ö ¾Ïȣȭ Ű Á¦°ÅÇϱâ=To_Remove_a_Server_Encryption_Key -3 ¼­¹ö ÆÄÀÏ -4 ¼­¹ö¿¡ »õ·Î¿î ÆÄÀÏ ¼³Ä¡Çϱâ=To_Install_New_Files_on_a_Server -4 ¼­¹ö¿¡ ÀÌÀü ¹öÀüÀÇ ÀÌÁø ÆÄÀÏ ¼³Ä¡Çϱâ=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 ¼­¹ö¿¡¼­ ÆÄÀÏ Á¦°ÅÇϱâ=To_Prune_Files_from_a_Server -4 ÆÄÀÏ ³¯Â¥ È®º¸Çϱâ=To_Get_File_Dates -3 ¼­¹ö¿¡¼­ VLDB µ¿±âÈ­ -4 VLDB µ¿±âÈ­=Synchronizing_the_FLDB -4 ¼­¹ö¿¡¼­ VLDB µ¿±âÈ­Çϱâ=To_Synchronize_the_FLDB -2 AFS ÆÄƼ¼Ç -3 ÆÄƼ¼Ç: °³¿ä=Partitions__An_Overview -3 ÆÄƼ¼Ç Ư¼º=Partition_Properties -3 ÆÄƼ¼Ç °æ°í=Partition_Warnings -2 AFS º¼·ý -3 º¼·ý: °³¿ä=Filesets__An_Overview -3 ´Ù¸¥ À¯ÇüÀÇ º¼·ý=Read__Write_and_Read_Only_Filesets -3 º¼·ý À§Ä¡ µ¥ÀÌÅͺ£À̽º(VLDB)=FLDB__Fileset_Location_Database_ -3 º¼·ý Ư¼º=Fileset_Properties -3 º¼·ý ÀÛ¼ºÇϱâ=To_Create_a_Fileset -3 º¼·ý À̸§ º¯°æÇϱâ=To_Rename_a_Fileset -3 º¼·ý »èÁ¦Çϱâ=To_Delete_a_Fileset -3 º¼·ý À̵¿ -4 º¼·ý À̵¿: °³¿ä=Moving_Filesets -4 º¼·ý À̵¿Çϱâ=To_Move_a_Fileset -3 º¼·ýÀÇ ¹é¾÷ ¹öÀü ÀÛ¼º -4 º¼·ý ¹é¾÷ ¹öÀü ÀÛ¼ºÇϱâ=IDH_SVRMGR_CLONE_OVERVIEW -4 º¹¼ö º¼·ýÀÇ ¹é¾÷ ¹öÀü ÀÛ¼ºÇϱâ=To_Clone_Multiple_Filesets -3 º¼·ý Àá±Ý ¹× Àá±ÝÇØÁ¦ -4 VLDB Ç׸ñ Àá±Ý ¹× Àá±ÝÇØÁ¦=Locking_and_Unlocking_Filesets -4 º¼·ýÀÌ Àá°å´Â Áö ¿©ºÎ ÆÇº°Çϱâ=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 º¼·ý Àá±×±â=To_Lock_a_Fileset -4 º¼·ý Àá±×ÇØÁ¦Çϱâ=To_Unlock_a_Fileset -3 º¼·ý ´ýÇÁ ¹× º¹¿ø -4 º¼·ý º¹¿ø=Dumping_and_Restoring_Filesets -4 º¼·ý ´ýÇÁÇϱâ=To_Dump_a_Fileset -4 º¼·ý º¹¿ø=Restoring_Filesets -4 ÁõºÐ º¼·ý ´ýÇÁ º¹¿ø=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 ´ýÇÁ ÆÄÀÏ º¹¿øÇϱâ=To_Restore_a_Dump_File_to_a_New_Fileset -3 º¼·ý °æ°í=Fileset_Warnings -2 AFS º¼·ý º¹Á¦ -3 º¼·ý º¹Á¦Çϱâ=Replicating_Filesets -3 »õ·Î¿î º¼·ý º¹Á¦ »çÀÌÆ® ÀÛ¼º=To_Create_a_New_Fileset_Replication_Site -3 º¼·ýÀ» º¹Á¦ÇÏ·Á¸é =To_Replicate_a_Fileset -3 º¼·ý º¹Á¦º» °»½Å=Updating_Replicas -2 AFS ¼­ºñ½º -3 ¼­ºñ½º: °³¿ä=Services__An_Overview -3 AFS ¼­ºñ½º ¼³Á¤ ¹× À¯Áö=Setting_Up_and_Maintaining_DFS_Services -3 ¼­ºñ½º Ư¼º=Service_Properties -3 ¼­ºñ½º ÀÛ¼º=To_Create_a_Service -3 ¼­ºñ½º »èÁ¦Çϱâ=To_Delete_a_Service -3 ¼­ºñ½º ½ÃÀÛÇϱâ=To_Start_a_Service -3 ¼­ºñ½º Á¤ÁöÇϱâ=To_Stop_a_Service -3 ¼­ºñ½º Àç½ÃÀÛÇϱâ=To_Restart_a_Service -3 BOS ¼­ºñ½º Àç½ÃÀÛ ³¯Â¥ ¼³Á¤Çϱâ=To_Set_BOS_Service_Restart_Dates_and_Times -3 ¼­ºñ½º »óÅ ¹× ¼¼ºÎ»çÇ× ¿­¶÷Çϱâ=To_View_Service_Status_and_Details -3 ¼­ºñ½º ·Î±× ÆÄÀÏ -4 ·Î±× ÆÄÀÏ=Log_Files -4 ¼­ºñ½º ·Î±× ÆÄÀÏ º¸±â=To_View_Service_Log -2 º¼·ý ±¸Á¦ -3 º¼·ý ±¸Á¦: °³¿ä=Salvaging_Volumes -3 ÆÄÀÏ ¼­¹öÀÇ ¸ðµç º¼·ý ±¸Á¦Çϱâ=To_Salvage_all_Volumes_on_a_File_Server -3 ÆÄƼ¼ÇÀÇ ¸ðµç º¼·ý ±¸Á¦Çϱâ=To_Salvage_all_Volumes_on_a_Partition -3 º¼·ý ±¸Á¦Çϱâ=To_Salvage_a_Volume -2 AFS ¸í·É¾î ÂüÁ¶¼­ -3 AFS UNIX »ç¿ëÀÚ ÂüÁ¶=UNIX_Command_Reference -3 AFS ¸í·É ÇÁ·ÒÇÁÆ® ¸í·É=AFS_Command_Prompt_Commands diff --git a/src/WINNT/doc/help/ko_KR/taafsusrmgr.cnt b/src/WINNT/doc/help/ko_KR/taafsusrmgr.cnt deleted file mode 100755 index 7e3faa390..000000000 --- a/src/WINNT/doc/help/ko_KR/taafsusrmgr.cnt +++ /dev/null @@ -1,66 +0,0 @@ -:Base TAAFSUSRMGR.HLP -:Title IBM AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ -1 AFS °èÁ¤ °ü¸® ÇÁ·Î±×·¥ -2 AFS »ç¿ëÀÚ °èÁ¤ -3 AFS °èÁ¤ ÀÛ¼º -4 AFS »ç¿ëÀÚ °èÁ¤ ÀÛ¼º=Creating_User_Entries -4 »õ·Î¿î AFS »ç¿ëÀÚ °èÁ¤ ÀÛ¼ºÇϱâ=To_create_a_single_user_account -3 ¾ÏÈ£ ÀÎÁõ ¹× º¸¾È -4 ¾ÏÈ£/ÀÎÁõ º¸¾È °³¼±=Improving_Password_Authentication_Security -4 »ç¿ëÀÚº° ¿¬¼Ó ½ÇÆÐ ·Î±×ÀΠȽ¼ö Á¦ÇÑÇϱâ=To_limit_the_number_of_consecutive_failed_login_attempts -4 Àá°ÜÁø »ç¿ëÀÚ °èÁ¤ Àá±ÝÇØÁ¦Çϱâ=To_unlock_a_locked_user_account -4 AFS »ç¿ëÀÚ °èÁ¤¿¡ ´ëÇÑ ¾ÏÈ£ Áֱ⠼³Á¤Çϱâ=To_set_password_lifetime -4 »ç¿ëÀÚº° ¾ÏÈ£ Àç»ç¿ë Á¦ÇÑÇϱâ=To_restrict_reuse_of_passwords -3 ¾ÏÈ£ º¯°æ -4 ¾ÏÈ£ º¯°æ=Changing_Passwords -4 »ç¿ëÀÚÀÇ AFS ¾ÏÈ£ º¯°æÇϱâ=To_change_a_password_in_the_Authentication_Database -3 »ç¿ëÀÚ °èÁ¤ Á¦°Å -4 »ç¿ëÀÚ °èÁ¤ Á¦°Å=Removing_User_Accounts -4 AFS »ç¿ëÀÚ °èÁ¤ »èÁ¦Çϱâ=To_remove_a_user_account -2 AFS ±×·ì -3 º¸È£ µ¥ÀÌÅͺ£À̽º Á¤º¸=AFS_Protection_Database -3 º¸È£ µ¥ÀÌÅͺ£À̽º Ç׸ñ=Protection_Database_Entries -3 ±×·ì »ç¿ë -4 ±×·ìÀÇ È¿°úÀû »ç¿ë=Using_Groups_Effectively -4 Á¢µÎ¾î ºÎÁ·(Prefix-Less) AFS ±×·ì »ç¿ë=Using_Prefix_Less_Groups -4 IP ÁÖ¼Ò ±×·ìÈ­=Placing_Machines_in_Groups -4 Ç¥ÁØ ½Ã½ºÅÛ ±×·ì=The_Standard_System_Groups -4 ±×·ì Á¤º¸ ¸ñ·Ï -5 ±×·ì Á¤º¸ ¸ñ·Ï=Listing_Information_about_Groups -5 AFS ±×·ì ±¸¼º¿ø ¸ñ·Ï ¿­¶÷Çϱâ=To_list_the_members_of_a_group -5 AFS ±×·ì Á¤º¸ ¿­¶÷Çϱâ=To_examine_a_Protection_Database_group_entry -5 AFS ±×·ìÀÌ ¼ÒÀ¯ÇÑ ±×·ì ¸ñ·Ï ¿­¶÷Çϱâ=To_list_the_groups_that_a_group_owns -4 »ç¿ëÀÚ ¹× ±â°è Ç׸ñ¿¡ ´ëÇÑ ±×·ì °ü·Ã Á¤º¸ ¸ñ·Ï -5 »ç¿ëÀÚ ¹× ±â°è Ç׸ñ¿¡ ´ëÇÑ ±×·ì °ü·Ã Á¤º¸ ¸ñ·Ï=Listing_Group_Related_Information_about_Users_and_Machine_Entries -5 AFS »ç¿ëÀÚ°¡ ¼ÓÇÑ ±×·ì ¸ñ·Ï ¿­¶÷Çϱâ=To_examine_a_Protection_Database_entry_for_a_user_or_machine -5 AFS »ç¿ëÀÚ°¡ ¼ÒÀ¯ÇÑ ±×·ì ¸ñ·Ï ¿­¶÷Çϱâ=To_view_a_list_of_the_groups_that_an_AFS_user_owns -5 IP ÁÖ¼Ò °èÁ¤ÀÌ ¼ÒÀ¯ÇÑ ±×·ì ¸ñ·Ï ¿­¶÷Çϱâ=To_view_a_list_of_the_groups_that_an_IP_address_account_owns -5 IP ÁÖ¼Ò °èÁ¤ÀÌ ¼ÓÇÑ ±×·ì ¸ñ·Ï ¿­¶÷Çϱâ=To_view_a_list_of_the_groups_to_which_an_IP_address_account_belongs -4 »ç¿ëÀÚ Ç׸ñ ÀÛ¼º -5 AFS »ç¿ëÀÚ °èÁ¤ ÀÛ¼º=Creating_User_Entries -5 »õ·Î¿î AFS »ç¿ëÀÚ °èÁ¤ ÀÛ¼ºÇϱâ=To_create_a_single_user_account -4 ±â°è Ç׸ñ ÀÛ¼º -5 IP ÁÖ¼Ò Ç׸ñ ÀÛ¼º=Creating_Machine_Entries -5 AFS º¸È£ µ¥ÀÌÅͺ£À̽º¿¡¼­ IP ÁÖ¼Ò °èÁ¤ ÀÛ¼ºÇϱâ=To_create_a_single_machine_entry_in_the_Protection_Database -4 ÀÏ¹Ý ¹× ¼ÒÀ¯ÀÚ°¡ ¾ø´Â ±×·ì ÀÛ¼º -5 ÀÏ¹Ý ¹× ¼ÒÀ¯ÀÚ°¡ ¾ø´Â AFS ±×·ì ÀÛ¼º=Creating_Regular_and_Prefix_Less_Groups -5 »õ·Î¿î ÀÏ¹Ý AFS ±×·ì ÀÛ¼ºÇϱâ=To_create_a_single_regular_group_entry -5 »õ·Î¿î ¼ÒÀ¯ÀÚ°¡ ¾ø´Â AFS ±×·ì ÀÛ¼ºÇϱâ=To_create_a_single_prefix_less_group_entry -4 ±×·ì¿¡ ±¸¼º¿ø Ãß°¡ ¹× ±×·ì¿¡¼­ ±¸¼º¿ø Á¦°Å -5 ±×·ì¿¡ ±¸¼º¿ø Ãß°¡ ¹× ±×·ì¿¡¼­ ±¸¼º¿ø Á¦°Å=Adding_Members_to_Groups_and_Removing_Them_from_Groups -5 ±×·ì¿¡ »ç¿ëÀÚ ¶Ç´Â IP ÁÖ¼Ò °èÁ¤ Ãß°¡Çϱâ=To_add_users_and_machines_to_groups -5 AFS ±×·ì¿¡¼­ »ç¿ëÀÚ, IP ÁÖ¼Ò °èÁ¤, ¶Ç´Â ±×·ì Á¦°ÅÇϱâ=To_remove_users_and_machines_from_groups -3 º¸È£ µ¥ÀÌÅͺ£À̽º¿¡¼­ Ç׸ñ »èÁ¦ -4 º¸È£ µ¥ÀÌÅͺ£À̽º¿¡¼­ Ç׸ñ »èÁ¦=Deleting_Entries_from_the_Protection_Database -4 AFS ±×·ì »èÁ¦Çϱâ=To_delete_user_and_group_entries -3 Ç׸ñ ¼ÒÀ¯ÀÚ º¯°æ -4 AFS ±×·ì ¼ÒÀ¯ÀÚ º¯°æ=Changing_the_Owner_of_an_Entry -4 º¯°æ ¼ÒÀ¯±ÇÀÇ À̸§ º¯°æ ÀǹÌ=The_Name_Changing_Implications_of_Changing_Ownership -4 AFS ±×·ì ¼ÒÀ¯ÀÚ º¯°æÇϱâ=To_change_the_owner_of_a_group_entry -3 Ç׸ñ À̸§ º¯°æ -4 AFS ±×·ì À̸§ º¯°æ=Changing_the_Name_of_an_Entry -4 AFS ±×·ì À̸§ º¯°æÇϱâ=To_change_the_name_of_a_group_entry -3 ±×·ì ÀÛ¼º ÇÒ´ç·® º¯°æ -4 ±×·ì ÀÛ¼º ÇÒ´ç·® º¯°æ=Changing_Group_Creation_Quota -4 AFS »ç¿ëÀÚÀÇ ±×·ì ÀÛ¼º ÇÒ´ç·® º¸±â=To_examine_group_creation_quota -4 AFS »ç¿ëÀÚÀÇ ±×·ì ÀÛ¼º ÇÒ´ç·® º¯°æÇϱâ=To_change_group_creation_quota diff --git a/src/WINNT/doc/help/pt_BR/AFS-CC.HLP b/src/WINNT/doc/help/pt_BR/AFS-CC.HLP deleted file mode 100755 index e4b66b986eeb3a67424218c3fa6be2a782f61fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38335 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

i4$ahD9G1hsreB{ zggWGi5$G3OxJrxxr6ett+7JJP0wI(eEC-!{0MgEU3|^Llu1x{~aSdKlK=9?{!A3yr zzzBF~Fc>eXU=wXmp%}rijF>C59MsAE8~rWSw#S)8yEhtG0{rg}GG;G>2PvKScAeKV zmyFRa@E`tjK`z^y2&zAA_QIMlc^4r0JrxklFljZKV7d4%5+e9Iy$TGB+lrXb`Knct zG45CEdAF(&nPolbq7S%&{cG_7!mro-(*RqAWk+GQN(XFJ%zoE^C{9FLZEg|{z&y~7 zz{%unpNY9aMv-)*B09tbp`Vzh$iHN>BLbxW^X@RrD~!8`e5;y>1Tie8xxi;Lkp{wO zQyJejpV8KXulneZv`8`Si16wIe$)IYGeFExH*JqX>bwP*5k_&HfKjf+OEL;y){O91 z(h0!sUL^5@QHavlQ4F69X_!xTVta=Vv)tj{iNaQ=4pA{01~Q|~UATxRu`iZL>EfAZ zH|)3U6GQIwyBKtuYr8az(eF?rj6{dNfbbt6@iP38I7N++fW15?Y(_1nrP<8S17SRl z!V$bVRK*q(me;+D8YK?Ru!a(HnblGVLGFA`o7%Xx`}so&zjqEgxG5OAAk(@Bigcfm z&R41uEyJRT?{`u>I{xnu!_=N3j` zz&{q5Btvwg<&DP2y#^B|q>_y+1%d7?VKnU-3@N!1fFPFFT9p`J{y7}~1TOLz%wm9O z&k;vd`2u-lX+y>}7vmrk5=|62v~y*8dkHa16-oI2=wfLGf=d_-(Xh{!w9sR+VPng)XKI=rMHa>= z3*H$aIH4gScm~YB`sm!aBLIi1aoEwZE5&II%5)U=QZdrEPP}BuB(iVfjB1B_gMbjh zxVIx<04)&lGl3ES%3FHOLvkCa+=MHif__*C^)u*;X0*&v-X`5wt|?U$i*K_Mlg)Nu zbCoP9#-k>U3=2%D0Pg4`8c+++C&O2BEN^&9Zm(oEcqdpIwZ4KulzmT&R{lw#_z{VK zKzaGojz_CNO6N^j zCT|PE_G>E;^9<7v1geV5*)+c84N&N#YCCnDG_anZv}6u&vKoa$9I-&fE+FpLd&3)B zbhI(5#VcQ(8fbvqYc|H~mTv#WPY*pWcaaf%`Me$uc%iLW;CKK@7<+JEfgOJ0Y=A7g z7%jQ&UeCOtu5I4yg+$8?9r-ULd0}igQ3wMI5R(iQf&SL2_~F0`Q)AJxiC7Z|WP)l4 zq-d8iS$3Rj6>e#8pQK~8lDd)*?6|b`7qrR$MVN@ift6PGj4}svyNW$ZA1M;=Xcw z$Z0qv%_qE@nN}cGh8?Bj@zN7jVz(pUnXR@X(}+vcMiRdb0?73&qz1|t3Lsca@;EQod zqJynSh}ugy1DcO5Da+r1!sPM}8MRs~g5tk}v`bo-5eTTXW=xTPVNTRG4zZ9JyH^)Y z{nj3Wb0CO;DYD5t5(#iq%mWN-z!yy8mTE)&nb_!oLQK2|WXZB|erTilL%bw5`SQRe zf=#EXO2h%MTmz=&%WIv)bmvQbbWUvuoso|PpQG?KX_-CDLkk24{_%@*#duhN$LRn! zTU`h!{>ZF2*r;4=MK*W8hocahCs1Vh?c+@{?G=#NY*_?s^sMeNH1Z4zfx2+9Z-KbX zGMqSFLx3CI&J%&9{|x4u^FQO=KMo8yaF5RELUZdhbV{e|NLmk>|8!FD(UGfpY$ytU z5Cal(XTCyuogewrqC27Nd6iGs*6 zYD@c|5TmDJ1j2c%LY#L!UXt_p@>iE@&N~`%a4+JYY{zlmiee<#q6S%xUrF>t^bMBkj(f}2@K_XRCBvWZ2MLzoYezyNzs zT+V&KukZ`e!ThJr4@AQ0{VmpNJ<&Co(OAD`T7O(bi!&_l{I(oW``dL~G!PJUum(CCL zUR_M;~fIVeeLgNYYWK$g0Ye0#` zKro}Bj8Ic$e1~8>U@)O0a#SadZ$GctXPjm+MBotKA~zBRU!e$RE(&qx4R}e;a_s&>cWd7p?VYLJ1>sU0yq`|ck7iZb~=7%7MM(*fG}rK@Iu0aghIyD&oujehb7YL z-Hjg+?a?AhOnibte2+zPCB{#>ATAbNnEtKvya2Az>{FRcHYiDL4%^F%6XN6bB+i2}r5?vij0WuXqqVfWOEj)+_ zNWypIJ>r{x^W}=Cga>gf%#F)KfNXg`yrx>pAwP;@*2o6c((t#!fPEkb5%5DgZ;JLS z(O71=_lw=HJAvZ?JLb0p!V58gCi&-_i|)_Si_9J$f_yh?O-MN^U_5mOnOKY3a@Z-D z58429SWSKZ7CqtY>oo;emC(9j_sw!e7gdUs^Qel?0(K?#g&AzIbW=jBk(s`(bm)vYO6gk=!nk=%gZQ2SObd! z!ukhUC*eRgLu*5aBAyH^Oii9Tl`|zmQaCkQ4oU+49k7 z*^pG_w;?GnkBl~+Fz>zw$cS34b!@RV_=w8VAQ^!fB{O{5VL}9GY`3PJWi-Qg)XTQc zCFm2=mvJ`%i-l-I>kClQJW$J*V%>-k(k|L%vzQ;9g?_6n(yM{rKcf)8#J^me9p=5? zkieo^H+j*m=>P{}h!N$UC;ifQEKTcp{2>s;3OvDF-X`FXQh2gwC_eNi0%+n^3+XPU zq2wm>Xcj=&X}uw%86h%Sg_k5FzC3AzC8Kwu$sFn|)HQ;tK_?FJeX+&?yC?{G zH3w-?dt;C1JqznPqU75Y$2F1dhqlD;usvLs$X_ z{tuK_*kEZHBJ%3LOH`3>JE0J>Z8w>zLHs*^YHq|!P7PmP`JA2_1t-C^Y7}RNvq8k3 zhSz3h#x=N8rQ#RHU1x>e*kTz!Pt{=k>870NxE+gV_{g5c zs10W{&jT_BmLjq@U@nA@HijnaCwR%p z;>)p{?PRrTM#ZBo3MVl3ygyTjPEgoj>?+*(l4+u6T@$Pcw#A8P1=FPD7$~f_geO7& z{!Y_Gwb8EkDm6wWpEPT-Hal6YS|?yx5Und~VpcksrVT1}IBgZOKwrjnziD*NphX6A z_N8t3`%YKK*;Tl(h#5s1>Lt7kt=(${ni~PkRK%z(0}iRbaVBoSEXg$fCbaP0gm;`q zzU;D9rqO}FU+C&xIciXg<0QXI=LnBAJkoc939k`t)GeA`K(c6%KEAo~6Yh43d|P(t0AQt!8>e|sJe zPA3GRtlwrSavI3ljXd&q*vm`kP$vhM2)E`&6LSxi;Q~G490sWeou7tJZ1zX`ZrP>U zPt0YA{lN|oq7Yx4nGt|LGsCOSm0E;&cR9EPm9q2ST>@^csy3E@Tl-`S@#?(W>72aV zVXLpgrG|!+Ze!848RLV*+xlRzaN=#>!TvxXgA-W=#0X7qZW62`Jo+O|^W_)u65dNf z$`gHon0pc~Ld59pD2AE`H6)&#{^moWV>&HZJeTnXR+RY$LRu>MjNM&~;~otaO|XB9&9)l=61J-a6kX z2gHYC$-?0{^Mw0U9pW-Mlx`wcetV>Czd$Qp~ z`@~-QL9V-}K(%yXKkbV9H>Y9VpF<&dq$v8kBkbCBxx9!jyuf`aXBOq%_77gU`GUaB zn?wOI7q$X(=LeT+>(<092M~5WU{*kOy{lAw0+n5d?#qdJz%rtk(P+C1@0)kUf)?_+ zrqiY060Y8gt0t==lzU(W*5^8jB~lrl0jUFk3OLWW8kkNIve+z?5J?S^1$3})m8ulteh&-gQ-iB*%+}t)i8`)GPgc>=(E4->Fil?O z%Zr){FQ;BcZ(IfJ3NQe5xUb;M`~dX~Pfu@%r}G*R-X4Sb#eyJUywapZd~-6Zy}Jv~ zv6sW2nD&T;R>C;u_-I&q2o|<5GfxC6_wfE9^!Kk(+g>#EZBYg99~#ZkO!MjBmOl6v zcegZ!#s7jQCz_m>2CoRx-iwYI@qS=Vq$I`xLm5;<=VNm93hlzKSvY)z00*zoJrgRC zcVklCMd74y^2+f$GtPq=3G{_Dx`;zd-U{7gOHFslud`1fjx7}>xGzF&#GLfA@y zeNip-DWI`SDt6Gft2>NSlznL3)kF-^ZqgowGyf<+l|^NY6D%sX;w1@@FJE$n5EBw_ zgyh_^AKrFG;VA!wVn}dUVG_iG6#7=EuM!_mL}Bx1IVEBQ%yjdf^f9$)&__aJ;k7^x zFSJ0$m3nszrspGxQLi&aL(d3YvnUd2O(b+{(7|^;%J>?M(8r5V-dS8C0n9S1yyNV# zS0hImJ_CrFr4KReGfw-14~%~=Fib^G{wc}8A-N0^GRf`n!N1anJ#zkR4JO*!RWHj^ z*mpfZtD&!<7(FOkQ204U|2@t?ev4*4MIjQORV6W+VKR%oH!OGLAd(2Ot}*R&&U zg)p#zCUI3M3DLL{N{2HTk`J1|rIb06gXf2x70V5>oDAlQ8<5{Ar*|W@lVaR zc3&Z*5(O}@ZN`MUY1{KG>yDjL551oUR^R`NytWx*L$nHXKq#Pob za)^>AGs?T$QcYtBCc1rX1K0dgy&$`gXM~PUZZqYUsYSA!I}y(fs6^J(2LC=(LL3%@ zWKlN4Yk)&_#VL{3{Q((eBJr|!Gb2*31Z_}^^1s{gl7I8%na#DHJ`#G3J5lBss<=iQ=4Sn|u5Umj#9ruuFLoxiG)AvDY0DMw;+##LCMjCvvnX zMB|TvYgymU2`O5)<0U79FSjPNqSe_RDRFhAVU)A0W3;3>`-;?B9JugyWkL%ANwIX#}`9}gS}&7=Fr9r1XoKm76^GJiA0-B$kY*p-tV7ZN`>H@33S-v_3Sn%gtH7U4Y8S&6pNMtiynwU%Q74r>aPTcm*O*C{brk+ zP$+_M(Wt!_BmklbF_*dkCmHQ+u<0n zH{(Z+$A0!z_+;aS*pNv79Z}fdS`-n7^w1|o^1nOrl7I8%-u<<@-&2P(;#mX@qJ-;x z6hog48blN3JE71+(Z{_gw%uuH2$4L_-1A+gPZZz*?aV}yA!)dO_+yA?^VDZ+>n?b< z-N=!IJ>4d0FuC0}bH%DdKpr9@ZI}=f^(ioOhoyym$>k7-#tEKh(*(4Qk}Npf*4BYu zKn`UHu{;EmAhQH_OMjMD<0WT_FYhd~vsB8%3rY}9+(MMyNf69Xsmx9Xw9UA2w!JB6 z1Ob^l{yS!;^pLN1HgxsxJ5Nnwl0F|(ILRwj<|Hp?Ud++M3hevMEJp-5pVQf~7UZ$#yOoYOI&N<09*POijsR9ETIg9?tLi$hhjEwYp zYAKXvR{R0$O-hLsJ%Z zh|lH&4S$>$QhV0oCHaFdPaG`#0oxROoqtRsHyN7-q7p5d9NuVDGy<$ai)MZc!XsCp ziC>_wueVS{>l@%rE2s{U@FQn$kq9j>125Mj@1bvW)n3IktI^#WPL`<``IBbZBxZQ0 z>JvSJn}`{M8>I|~<30y)W$yFV>=C~Thg#CJe|ur>jnpucAKf41Y|B(6npMuWObo1z zMbQaFY+)B1sAO>j#SmVNzd?Bc%li4eU4+w%B;xSlm$|++Ayh5ZnnZ9NSjJKUJBn=P zG>1h@twMOEz~><-oac*yUlGh-0^uY!{`XV7{rDOHGVCO)2u!uER%Dbb#2BfPDYuYs*MxV}kxi(J`+tty@CswI>azQtwCaA;E^ z{u0uA(3z0|I^u7R4A>VqwKiWln~h(h63gV)%4ZN#iT6ORnvP>|kVtL8vzAa8VWG8# zCYpGCgOOl+8T!8og##rr4QHLuAZO{IVummcXNfbY>;!Sl6c-@^`&RsQC|tRCP;M6^ zsCe&9$HmjDgY~x{7G?tynfFei1^F(3$$96?(?`g>$Dc=Iod)3rby>pyFp8P+^BY=* z^;ZB6)~UDycM)@mnVdWsg&lMq=9@$}L?>P})ad0((NN_=-)!DYMRYYvVtui%Oy@d4 zsydZ0)@=XEn!ROAppPD2^6hRJ+vPqiJoM5Zkfs-UnMbB(w?%RCKj3CD7sH29i1=54 z3vQk><(_7QfbDWs9=$qhYZS3Ip8b?FCK;VXZ z|5x(@k;EYo*Z2=%rxv2-s217ll3-sOW<`|tr}S3Bh( zn9iHZo#WFO*S#ZEsv7U`)c=~s6Z_p^Y3DP(Ox=VADYa!E|Cn+Q!bgeyfuVAFEJl{c zfs&6=h<|cbIZ-sudrjEiN0A_eQueZCYknPH%3rO#cf0z=M=hRiqkzKozHTak-RNcr zD!ox%%W>;Wk6c3&KZ+T^cqhW)g#v7Zwulev;4%92jj=j3h%^ddC&4r%iD;3b6yU*5V%D^#6z>|`#h6crqG$wFUjH0-Wwz7xU0 zLyDa!Y_~Vsr69op>&p>M894Mk4!jUeS>;&!6s=hQkKYB+BkVg*3mZ&uo{dN!vC6rH zRgeoET!{aHe`c}UBa27Vq1~$7^LQN7BD*qCj8_QO^e)XfGel}hgt(lV^33cAX+*ma zg{bCC7zg$*$?Q=&Geb|Df&RCFu$?W8wwGG1+=G?-7`K0^>s6|!O1ubSqXz$|0IF3j z%8(=qC*?I1p@@%~2Fu9L@RBc@Us@7dzqBMK(MGwCqbDr^;|sHdbR%%Zd3mYilk7{F z{Zi&rkth| z(e`0)y$&n~HzeNP#)t7bRJs^i16qcc#>3`Iyry`12oy;AVVRRyDtRnj|E{Ae^t1a~h-}&;AG|+r*Z7 zmU7mbCxEG|lJu@@xhGN%&8(bKsS-a|J?mB>EU3djqXf3h{_f9+-deCo4DJ)e|&5%m~yubt{Xr)t)8N$Jcj zi5(mUyc{PIC2A=0&CIEqHn+O&o!nVTl+d`LEf$GZ#J6%+0+RuBE)Jhh0M4J{l{UD` zK%l3S+tW#_a_Hp%TGT+ynVvFP`N#$xP)L|>VK80rJCpIsH9-e?t&_OTETMBrVt(XY z4*#!9O8z%;u9hhifIJ?D5|JlEWKgESTk$R;GcPipmfI1#Oj}G_!N|GrT09zU9e_e~ zFGkx&@*KssTNgdL{0qe7b?iafd+K>veRxnzU75g8hOrTZOM zvx)&(?my-W%bbt1+;2Q>I(Qym3uU(RbZW0i26vnqKFf~%OvfSNVbA)=5$+=@@i`&; zKr9FNJx=XYK5`6&NO9WzIbON6y2d|%>X5pK916sj0tOn%If7=F`y4XSaL7sz3$~t1 z4aWzBLw6%{z&+FTC>+Dj@IB3eh?#@4BYYX&)P)v)yzzqLAk%!o1^!8UP-Adz&CGG^ z><|;-TADR6o-vioGgwy*k;b&}#DtzB5dxOBIK1sB`Ls1CpSH>|j)PG+CQiPgtswzz z4I*txN^1;8M_~eOh32U*RV$tbveU_ELl)upj9Pa3!u?`D$4kDr3FYLgu?U+Kv6!W{ z+|DsJ06XV<1N9U=F}XP+!(V23G(Xfd{YQLCDusjI_59SV$X5=2XdfFns^h5IDOEGM zfOdo!hZ`R4;Ym?(I?8_ZEPOu&gV09RAKZbFo}u zG+JMRw@^L#ryC-`nTw&Iz{P0!XDEd96|`Q8- z5ASw>99y1`!3T^tfxDpkfPsNYY@7{V35D_3=E;plLF5VUMJOC!|Er8~Vt{A7qt@n) zG4KP$NMSq0anwqnO%D|2SkV=@dC?YuDX^9?@|8rqD8;C+L0>e6aK!(G{z~y1qxOv< z1xFo9{L8_ZQR}@n)By}!&K?Lx;eo?q3sCKeLBy-natQ}t0$R-Hk^&N#o|-(t zhD#(tMe8D80#96hC{D~mTmnzHg-}OYlhA>+mVJ4~)(V9^FF_GjSz}m*!uUSC0bW9>>1;5&K2>Ed*9etwXbmKy59R!&p4=S5$&Kht#jQ>!VKCvw9X%tXIP7bSyR7 zGU!9~b+ycF+&c{5vgZ{~p;!Dn^VTIR$t1-{ z{ffU9J5#-!#IM7cF0H~|Nvf0_dKFBfhSY4MtLp2{V~!s`Me3f^X0o68d)Cc>%Ica5 zX>(4+804dxRbM0h9c5ER74ENr&$P5c&YxcrtKDT1B?r(k%0;BGd3|{T-xh`QvIQ6- zU1Yj=y@;XKF{lub7J-~kDyv1DjC%AtB34ORVwN1>U97(Y4O7lv^oKZ3v~1Gi9$);X z4^l2OFYu?zy&Jip;0_a!*0{wW)>hn2IK zgbIRlURPzclWXhhs!4$$X0xG@6Z`mAJdF69!RK*~Djt|0LQ^k0XKrQnoO9+@ftYbP z$$$c;Cbj~})VY2|-9EM(t8E3)eTf=VS2YbOFzaLihvn!KPH%JB2svl*-VAgY^vC^u zdvXDH&BV(lU{BCXb|6am-vfBbzxi_E`Y?Kt8=#CKPQeKCxGXK=TyvG@EHpt?gJ)Ug z^N;t#q?h&Z*$pVR7x}c4r^CWfepoD9{C*gt-ZhllFc*nNeuEWD%Z)LJyIMQ*9VUXE zgDUZ@fUM)x%9`nw5GUM_Xnjs2A-*3@iihI5WGVWl(nzqMK@l`O6q1-cP34RDvrwrw z!hHeFjt%ZYQGMkh+Co#s4BZ@}{U?@7EBAsdH-C_w%t9Nw!>S_+6 zgG*S6-x@VT1RL+E^}*K!^W6<4v8DKTX8VHqn$(S88=ot2hBJlZa7i~his?ox%1u5@ zkuZKX%tou}D=(Crqj%fRLXva%)DkzjiAx7jWs%w z$QU`Bl3wzy`3c;@?dDXnqSaYdk^ZtG-3Lhym-JLGQ>!oaXJv zs6)*_;WU!ss2w1jpm=V!ju}b1|E3+214;U?GkZR4lGlrpph1CL?UmM^nv|{PR~qVd zSaIk(2<=nE5xlJ^!UE6W0lA<5J!pRO<={gy2E~k_UEwh}tFqHjc`gbY?uLdr-qJO zbFNL4m&R@YPaO*WhoQ~l-kuI{xST5fEs$lrxF?q$X|*CANeUdv>nMW9bs;=HgqOr4 zUk=^e5FQgtxOh{n64nEs_wm?(`#7#5#^dq7LA7_~3St{_$zkaBpD4Dg{&)t@-mmm= zi>wR_^ia3o(DbQ6OYJ}IzBAJzLNjue@gWSAW9Iclh<(ir2qXS?ZUF8A(rZwm8!D9G zUcEt0t7gzB5(hA7JYt1lP1%4Qmu?7ay!$>D6nzkr&>31z1a56Vg4-SVDw$%`J9iWM z;hLqpN$fx`ry~r4vTxA@+r~V_dx{MddGT~x{22E#XQBaI+b~~(LkGgH@(&&4b}nfx&~tys7w4j^in}qlml0)DRS!bpaQM=|+Fvtk?%M10 zGqNyiam7ZTKrw&O@X_u4yf zd#y}5h~ax*dk@R|?|9Xn^SK!FLS}*S_}_BXo%8&0%>8e?>dq0cM>4Q45)}3;|Lk{qnIcCh+h||c>xYW8 zda@^qOhYDO^|T*SQRIgnB|xrDNU=_N!Cv1q4HSLW1SXhDvJFYFZrTvksEv6 zabtPDprxq5#f06nk{R$skv@5cpn0EX&&Id3X|j{c@V$(^n@tje<-ciEJ(M&miQfk| z0_oWhiW-wVk-KN)5)#Kh>uf1&CkIQtjbJ{9Ld7MM@uq4}H?8zyf$_d@B!Ob+DRfXK zpf5IYW7G<9$3r_P@0s}?eORk(p-2KUOF8HF#=lh!+4B^}eh2|`=uS_`FQ`hGqkVg) zKAisn*%=T)fSolSKp^`#M$N$g#Nm}qU3(YH2L6xUjorR_$h4&Re)Q_-9^w0bnAH&b zUFP<};V~|WzymFfJv@9ql0kAu8ZlCzK~;lKN`Gh+E#)HRuV}trh^Nfs$an@^6%i;& zLFwbw*C4*ZYSct{15{>w11y)@06le1&R-QMng){0RPRg}AjE(ky)kF63UFR9aWrm4 zf(S)|C6Mw=tOVG$2&|Hb*3jr0j&p#cb(2BETncC;&Vg~rHa@THE=WvdB@bt06~?tk zlBX1dZ-+uekiA8i9Od;1NgfV))1ON3)Vokfki=UGzIZU*VzbFjL<)r+ri!%yD!RNx ztD~33n#R_#0$vP2xn(aXbyF}qEeUHHgT&p&ylzL5Dp^jIn4>3z6(tX*Ks@YYu zrc~ibzvq-n9QM@Ig6!$#R0JbANR!C=Ckj!r9V4XTn>o?@$|{T&shY%7jt}-R8vt;YxIbavQ&n55Ga-kiWvmWAPig zjlVI&&P`y1hOB}egc#mUZevO{dlgFutv9k%d`f0$CnmWn5DnUg&6}Uu_{P9foX4qJ zbT*#Nm@5uZLzEov`e@OP*hI@9F9$6Y(uU&1-uD>3eh!6r`4TOR$M4L=erAG3aN}u- zWi}*&pJ2hEsWI##W|o-f3S;C^-p%%~kC;y5<1a53cKzv<0G8%u4*k+*uD+^1#H+IO z9La*^h31v82X+njJf09O0Uzl_%-{zcCYg`A*RO4sywH4$qd?wQ2jFq4ISOVX_c5k0BK;m{MK7l$jildl0$sBrw7F#v-D zfuy(qJw_7p2nuMloQ1;SAK$`XFy7=?@)aPBO+7Fizv`&J8Ymm=HAcHsDdcA2CO{pB z#~MO%IM+kQCb~l;GQ#H#D1^2);cHx3>oS>h@Czu2XZh1QMK<`isjPu47Hdq9TP)-+ zsqYhM8L^htf`BwSUXvk6S^hfz5mK_GI8#m2?dmsO(EMadUjGLxw`+c%Kjdo zt^tj+hZd#2Vl&dWfclcdh$rW-=9K6GhCke?;+OG&Y^RN66Y`cE56S7^Q0#MH%fIKu z^Yjwj07ev9Q4z!ng-cP?efABS;ko?b(eJXs0TnHnxDgo9k?5HjQHj977@OdP10#OU z!ay%D&t?FX+)iZ7UFWmV0JXUROP@>JXeKCGBareZmv=9=X*=Rn|{u?Y(Sm z^MI8nQUtd*MQC>A?a$U6?3bB#SwvpXb6giGjEOxM}KZ)fgeo&85 zgS$*Tq{qb3RWRYrs+wG1QCY9g_}Oq<+i=0xdRf2;z640(*}aZ-#9z+biZnv}IR6U8 z_;G%%7Wv0e#P&~sT^iVTa}0GBs&Eg)$slbTX|a+M;vYlp=+djBtW}~%JoTGCGkt?X z;!wyi=MUfr@lBBvs3K$|<7(Yf4xMN>CNO3F4QoAv2bQ%SHNW}taTK4mJ~HP`demg= zeNhPEd{i?m)yePWX*HH!?JR=1eU^4xA1bc)=$QnZjokdsxyN zU$R?OW`@9I!*&SN(fFG$k17uh0aM4gZTj5InM<+4LnjWi7wVcZG<4`RH@g&-pGINB zPocN7)?Zlh3E})0K`QogqkBX$5MYM_Jd<7dxUS}VfhDB*yR_Dh=ujOa6Bx?jp697 z9}35P3Az-S{4pL_tUqpk^JV*!8p68f9#T(h6vF-xiotx3!qlU`$yVcoWhk}-F&DM- zT8Xx2To$zM0OY5}`hpX#@qZQH%G0E145h5Qg>6i}GhQnX1_60G4Ej9zSug3&&Smwa(K%ILv)qosVJ zk&uXB6*II3JTZc0Rs@S!e{KTrvV+M3{k8UlZ@tz!3koi`q3guoZkbK{Gyxoa`(@TH ztHj7tgZ_6}ZE)57Udt*e<_lo=TP&-b3{vsGcUfg?olywPaZuP|7mnn-$JC^iT9omqa#g&I-D+v@*bW%Zkev`b%)vJ>|}g&6$+a@Xt+5x zYUds3>j8Ru22Ju?Y^%lvIwmOc1T@c0Ea5uKc9GGW*y33DWU4@b;feT=g|I!2Le7RK z?~@!@*d!A+#(bCf!URl>aP5WbNv3^kfe8g!U{6^lY7e-H3iQ_~j4w)Ufh<}SuDTj%~BRt;@`9C(kFo#Px$$Bce2eFtx!{GXY zQutx!5;r!OxcYxT)-Z8&Erv^}25*mlY7UE@r+S)=gY(mZJFDHr8m3i#J9|NIs^PU?4C7!WxS;oVOY1*>Av@`r0X#i1q=qFAm=JJmxTMMn6I!ex3lt z^f|~J=JnK4*d$Q&!YT(80h4liJWLU?1y=E?*pgwfH_5IKqoVCsD&{T~H4tMylA)SD z5DfiEM9p95pLd@k2amz_SNdMKeOuE950>-p_cm-l(l_qg`I=;-579j0tNcL4A*uV7 zgGd;R0#gXi9DM-3%gpm|M2xH+`|ZIRw~{ZSGe(Mq70LJ z2Nbdt?nyk1U)c7g*2wLgI8?PylsjDx5`(qAWx=~u#Pt+_ZC2`#4^4r)RkZc6BFA|b zim@Y0V204$Dqr8AFHDYh0n^nGv`~t|Zoddx@yLmxR-U-NZBm=V(27%p6K1DYC1PUj zDOag|&{8>Cq4ATj^nxN{;1O{jYRPLc8|s7c>)G43fxSH2;F#D3A)zuuGX`wixouqX z*{|OAl_~(_A}D}{h3)jE0^13NP&|qvI@2HFcxlZGG{^D9mngry+~`bJ2jgC$8w&ep z1v43AiIIHUb}*$d{$p(q6RUfXR( zr&^6_Q;3rynI7D!TH%xCXa+QbrU{@b z$xi?uirha7tzCyg_`gIUXXAX}kmxFEb_$`TF|vO4fSemG+ca6HxH7q$nJu)?!ih|9 z0{i{T{DpJOe}3U~MuZkl7j{=bIxK(bY-r)6pgjPEDB1zQ_h6e+Ci|^LGiK7oz8P9Lp6{^bNq^zkVgpD@xD zyXL#ytQh92EN`~`qewUT*p;pgjqo?zoAU4BpSI?+jZ3%7ZT#)alJS$5F4(RgiIbt> z0J=cv>lev1ZqV;ksk<5eryW8O$+dHML7Lm{Shjf&9S`LGyN6$Yr!Y*6VCYv~zTCnf zLZ(t`5@L=cQBe>{NXS3&JL)`iY1)SG6EEOAC4M*cu@D^bD^+|9Ai>*W#;$u6HKjL| zU`)u6yQ4yo7Di)5(-(zeCqeIW5c=*t6~B+J5?|mvhi$Z_Dh3C#_|c&|CPhkCQ)dEW z9l1xSo;6kTBuC-t%7OpyW757t;=(D_^Qx!Jt*jA`FYwFIIddn?sjsd_&>2zIbbeC$ zi*PmNRQ?t7BF7*Ntfp59$lGKYrRPQw=96>T^=em46iE8%$dZ{S(lN)LT}-WbZ!FRk z5ALGtqjh2OV_@6>1oeiSOn!EbumclsQtT!#MJ`qg;kFzo^Bf1=7d1C2;OPT5?>(6Zy6m+ zJWp&SXcD-CJI}wF01L5lndN&?=nR3drD8 z!(da1spOHh3h6fyTcZX<*%3qudR(izPrf9guBT==OQ2dm1QuI0`}g1fUrixr)LjpE&h`7|M@l(&I%FqlwA59*v%l!tqXg z%GVOU&<*G0sfg_5oil`h5;!bs z7%-I}0xQ*&OVy6_O)CB=%)%VsK_~=srtLT5_1B<=&BAx7t5oX8B6kH)%qJmq~8 zya~tQ#KG9gr<2(J{t;?mYM+i&U1CEZ!)`_)(8oXP$~kgoi`Uo6F>CC!7NwBzCn5ou zd83yAolmaNn|Yg$I5QA>p0u;aOG9Kk6l|d|FHGEIw@`X_6v}@ng2!Y}lWPfLOwt2a z(X?}2%<^MB=920yE&r@cEe0MX3urqq_{9)YZ=q1ECgbz~Ot)_jEdCUQGkN+3H#Uy5 zdA>I$50lg@O9$Tn7r{mZhXyMa*IMRSh;+(VNb1z8uw-sCpb~!H?bI1FYo}DxU;Kl= zRw2Ghf0~|r%8pkGp{lKNrWO{(vZ(gK$YiUK*3FAYJSiIkwERKG`9#Jyx-l*zF~C4| zZ{dO%@~8G9x{V_w{*A?2xBFH^@{!1{272~L@^N$728H;19>vJ6W5`w^;q&U}>)!Qc zm(x$dxYnM>7zd)TFA5a%Y44m*m+bTCSN^A4{4e*%m+bIFd?~UD=|^IV<85L?TxKOa3;2Qgj zundW(fc^wa`{ zV7A)i>x%oaKUiLt;V*JAbdeR=#i;i%3gP-O>hcUMGsuK=(!dd{=bVe~2Tk*5udiE- z^&xaK5_n7Q(LyFo!j10~k^*5D>gyjGdeLEE8=YJ@`3)_TLN8DR5preb*u%PWlFQF;{Mll@`0TjaVJ7jT&nSNi!5eF&d2;p4zT+fPiwIk$aUN0Ac-8Vga+4HtXAc#9i53IEQVzCb(Z+qhNbUXFWdII_!B zgpN7{&ZP%f=h6Z%g$%rco~q&6euS35Q?=mhpt)X!A+u3i_Km`n7pkSvfsH+HcEbZR zFExF`Q}#j|nkDsg-{HXLXcSJ%X5iG!>K&Y#K-D+XgBw)LalREN8SY8?mOgZF7?3(p z{I$xSgoeneoSc>~m}98JwQZRvDuX=gE-hkS!b&oGp<1+4FwjCbJ$MC9EtF?W7@LUtlJ5dl_SqGZI?N2m*Q0fH5)W zYmxi>+JG@#&4c*V{L_~cLj1A!TTz7JpTq;p@SDtUzHIwql;MqQu7tEnpdNvE8O0#+ z00NR5*eadWA#HemZ`&kAWV(5wXc&=@HgdC;;cOUN1oO8`A?thU2$??`>xeaWI|<+k z{9G3;{Lh)+eAxmkL|E(?_~RGyD-M7Iybh(Y0YJCBFxwB6*{yB$5d6-x^QLgb5${gG zPGZAptxvxKH|p>4e}ssj6FQEUXIgwV8qZ|Bzk-;v<9!}4`I|2vix(Vk>S=z(#geTq zL^0zvi)F4mc+N19>K zAQMa`C(ewhXM;k9Kz&ZD0TvC8h7SwpAV1s;qs@GP%hTrjB%;;8BC2D~K(n_DMl=@{ znF+H@#fjQ%CX6pHMJYg_ez+M<=#i*n=F2FCx%2g9mM+m;PHmfp!TjYEF{2`(TS%n4 zxH-Wl+Q#llP6fm9c5N#mSXwMHDC~YciV$9_Vohx8nl+1U!ArjQ3g!1D&0=C>K)YJd zP&TDeI6~GiBWU2tvi>If1gP#|hKd=N-(S`?9_gv;es?TfgJvy1D09+8Q*2)Xu9qbWRnZVbmnp5UvGKlM#@3Ugf+h zV~XZG9Z?r!9*?SUaY)>X->80dQ5wFasn>~%)Ejuh>)V?FHlm>8{?ZjjtHoz2V9!r< zcv)J=yBwAm*yqo|n*Ne<&R0$=AeT78HR)a8ja%{EtN3SIA(_)LT^FKozV~*TS*7mF zVD>z-I_tc@xQ^AC;Rb$cfIu%+^+&rQja%Z`E;uVIttYiksW@x_PpIpz)83C$7 zM-2mo%^4RKDprK(ZWObkt<0aShnYH-WW5!fkYb8$fl9ihePuWbyNfF=C7_xayKrOX z+tghu&Hxpu3mKZ$pLl6?gn^B4jYO;5G-Zx47m-4KIFX$r_N;cN=!bif*0_9f@gsZ} zqjY0yojkqx6>VA;4)}zFerv6LA;@3VrGJJ4N(vk5Xsv(Fe8i(Gc+^c-3}KK@Rmtt=GO~ZSy`Eym3dF` zhGtfZW~69nUdpWes`<_T`?L0bp7Wf`jQIP1|F8d#7klQJXFq%IwbovH?X}lldu^D- zB4BxCJw96D3|p8v5!%0iaJj;z8rgdB}gBOOqBurO~uAgF`ck`lTlJ|ebc1zx!`D7j{`CW z7lGCrofo2YYkiP?IS5Y(J3GEk1)Bq*<)!*C;XNV>->B|66=0&?v6Dz+I1StQ zDwNQ?octR-^+-Zf@(ZFly2J|pz;kjghfxcjiAI=kRPGHX`@;I=qq4%{bRsB^APN0; z3TcGq4sh}8VvAEdgbMGvHD%=H&$2Qc)@t$gLIts5ZHv;1PJDj_N%Osv6=o1g5NOnT zC`M^m#-K1K&kzb(h-E|CnWTny&v-1;sM<67_YJ*yYhpqm@5Z_PbRn5mI1dUx^rQ1R7*L&0LF$k2L-G#! zYuj~XKKznYh=N~#RUM{8yaiggw2Nz%egyR_3KQSBxB>HmG`nDpZmgwt4YEH{h$eg+ zbf4IvihWJkr=pTK!&2yN?~s3Gkok?BRG)`@$Q;Gsm(IYXa#*H)_JNtWPKK6elSIqkLl&oZELnMpM=pOv0fA0F1!%?GM%O1G7DHg_y*?yx|}k@+yHsE`?2*~Zb!*j{xUT|b}K z3ajEj5nm({V=v;1+emuX#XHmKhWnd~i+d%ql&Vi|4La&{<=bW!GxYqWY)x)NUKY>~)@VH!h#&29rO!HLhDyOl)dW&kQM}r^^r>Cv{tR@}kDJ zg=VbWv8;TQ*K-xKnzc|82<25od0|I%iTufV`kCE5I=dz6-T>xa-*c)^ez)UI+tjjAgPZZi!6XgcAJQwSqxmsu{9)7~L8)f zK>vR2pOyI#sUXBcQ=E88K97>U0;P$sydX5$TWXFAYK;x+8~I-QGhxjhg*)9~SA2PA zl5@h(Q1D0p!&uX{xy^mw7KASDl2wQwB!&_|eI|R{-s6SC?4ysK^3Te=n^c0^&w?)5 zIx{3;eh^=HyegU*k-PO5@a-Q-VT~%E+c*Eq$nSvj|5_m4{`8S;ng?qGcEv(T))hRH zsN1M5} zYO8FSeDM3X{WIEjixDDq8+a+q(5*;~a#Coy?_98K2mblcof)bOtaC(h3?M>44@02u z7d#<;%8QT?Py1(Oo$)En06=dj}oZ0%Wj z#H5bqWzEvV;A6R%xLGRfJvDYONj*{Zml)8$_0P&|npy@l_p$6A_MUKho78jfu@sjN z)EZJ)r|-RNPrWyC_k+)idM~>h2%JdAY!;7BG0%wS&74s$Zr$YjMTVhqf%CkWOnX`w z3&8J!haq}DFT&pWoqty5Zikg2`bhA+hSva+$nY%5O<_hc&L z>!eqv_f4D}WKLpOXQoS4mEI_uZao+@gFI95LE%N?g#~WJblz&tgCkkKz|-3CZt5V0oxG17=kE za4S8gt$AUi?2$Oi#_;(WOSJS(ycuQ-pC*+D4aQYs?+iP$Yiq(!;(Ab7jN}$J$5bPEth@IZ5 z39`!piJeDl&vmI5r@tYoJ6}1XuT2lRx%qE-holktiT3mYm`GJ9t*^C=0 z)jVr{F1;a;$}DvO9*^8hJk`+WGEj^W*w|{b->y#TJPfx7yYT5kNPu$K>{05VHeI4g zm`ws%c0dE1*0SsC&>hp4(JDL|WIC|WekaHb;IFo@M%mPd&1r{lI*R8(yInV<<3Bo5 zrj574c0k{wmYw6MMLtbx`np0*r9MqIn8TWEu=@3~<`_XB!6H;RW@d9t42ne$UY3pP ze<>VPBM`<0(^7ot|b9%5<-7$d=B!UHkKJpYi zMZ_pKg!##}P`v&D%DzTYBYPa#*LE6n$LC>IDu{bK@h2p3W-))+ZfooU5+^6JN5OAe z{$_j=ei6LYMv=K0`4wXUgsNb~v7OEPG$K59MKi{RCi&FZ1P^xLZr?7U@(Ttw*W^mY zQuJc6VQrJwIS4Ie+w#Kx5J>bNu*q#&Zrk$FlCo^saaeO#!<_cho7*~VNm#UID9^Js z0~DyReu;hDMi|)cD)M<+zZ_Az1d3I0bYo}d8SNdmjQUi#462+Tu47D-=Q*=lKPz*^Q5E>O(n`h{o{v3Gk8(U+s_zXzo0(fbhXyp7!Unv`w<=^~r}U!ir?y5c z#F>!yB{gx+?c{zeLipmd3CA(BMHWh_3Ht)W6C}gx9*>DI+w7l}IWylqR@nv>tsx2b zethXs8d4dhYy(P}D%GbdBFtpn3mcN)!F6J40lTeV+`P{(97`CEh+Qt9mO;r$+M_9< zT2$k;B*W!ZUW7gLoPSp4j?25p#q-&Ld_I^Yw0}qP2<=rFAzvtR1PUARc*GR*tuMA; zJvxp@8_Te1%qj&`)FqPIYW5f)HB^r1g*t~M_};1=63>&Vj0;KEuVU}uE5VO~><0q* z(pGZ0fEcAotL|LEcT+#Nf?b?&m#Z zRw7u?(Y&OinM8JmmPxNbZBL@<4EW6KAf3zoL>hFQE;dPj0k={2>zrb%C6ZPH7| zcb)5K?%*2L>}y(b)+WcA^1?kkne`k6xkuCgmLR)Sm)SAnekYjRvaqe43-73S#FFM# zUH15AYTwL$CV}nbt~!A~(F-I{Z|9suS4Ycy9b}>ob_MRi9*Aa?dQ=9;TXbi7fA*r0 z$&CxqtFTW}+_vsi+lsE7IiUN%XG?0u&Y%K4X?Fyt2-GZ@8V95=ty6IQe7pd^Y+uoN34~Qr?uwIgGt4&@ZHhy)qOMR`$sH);! z>T+~ghv;f$+Y^&1VF*cpJxon`o^wy-N4uJCaTgq|PR%V=eM+ZUYP z*)X-E*#L=dUn~Kn__Gj_k%5d2&;LCye5O!9175(-rH~)|O+p|x_@kZo zvYTrV0Ebdu4XaTNN-qF>!_jTZe|zQe4RJm11EgT)TjLL>q{f?C|0Bu9{KLEm$NUTa zS(zuSEgtis-=zp}0N-Uu0wK$H9{-)JFA^mxUQJ>*irCngOqsB5ui~v%nIi8?Gh=2R zvoXbROQ`-Y5*i|eTE3BFXgtP?5DnRn^{mX@)>TGBJS8*+k%a1Il1HN( zP1V@YVzjC!!@4~hYbv3^jStJ1p_8}iM@^8vFGwCGO#sdHh9XSVcpHEkCcpR43xh5G zS(zVH#>B>Hh>5V>Ke!68Ql4EEav{mB=y3(50{>@1*4w?XRIF3?OQLDje=2 z^+Z#YrPcKveEcm^Sex_&9HkG7=ICfS2CQsFbLJkO#Qp&Q%RHU^9tcnCbCV5Ov#Flc84zFA61_0aH0v=vP$*_Kp@@L9XHt}@6v?;NYc2eYK`WkkP zdA9L{U%)+PXuQcbY>{2}1nIp|4rWljbPfS_GAJ01@9@H5_|Zo%`)6fVUuHOFHfvxM zA!$Z*@$N*DNO29xBf6r}FagoJ5K${!zlf6GA%zWjWRLtfWH*DT97oMtdOI-I9>@ri zAe;Z;gs|#(sqO7ozut_Vxon<@JP;eNS3bnPKfTXm(?j& zO?^9cT;f~mcVD#qJ}g4FI&zBG6aS03!G}S{-CcEikX;~$sdNJj{tnDLw)xEF1xvdc z7bEiqAPTRtuahI_dlgHLq@QVte*##I3HUku-QeGy5(1FR-{TM|KGU4aa1pD<&CS7w zb%1em90cVg?=%Hb!Po~@VG*FdXYOYoi~4g{=63^^_z|C#{FS$N(a*9l3Hqk!{IM%j z`Ajj#bdT`iCfpq%wumLxfZZgNx&_K7{}iNt5Y)OO#Rpnv?oU`G41uE{TNEF&>`ZaG zk>#4bwWvzmAD@<^YQzub%I{7Q`@^x=tu6e4onQ*@y$jMwDGTX3PDU1flY)%qkZm~lY11I|=wJW?!u=o6zIx*1&={58SmvLa8ctfs=Q-V}~-eB|M zGX`5Y{ymV`GqgoBK}WIUUQ@P8FL%g@*6Iw!estF(Bn^yJOW<_#Ba z7fvQdU7?mrmw+N1M3Md7#eI|6X6bBRC~FJ1j=8OsBz~i9?&jL&GrQXP{6qTeEjCbY zhttxB=%SEX!qLoi_OKvzllByU9Hd6beg2)Gb{g^oCOMl@IsX;kzzO&o?gCJlINDUo zRqQ^I$5{M}!8Jj0k&HbAYrm2*!xpu7c4_2jPx5Ax*mnIxeeFbFZjbyI%V^=Z>i!*P zeKnD)fl;>k_I=-Md+Rne+p=3F&&mjBba>rd!;ju@V{b{*%v}j^kADOn3Bctb zg)?dM?^NmaslvvhAaAyk6 zp&KPZ&K4fSZ7PUZ*X9GsYEy%V3Tc-;{sNM&LN{=n1iMg>H9~hN(^!x?&VL_Ot-ciC zNFnP-&6}efA|{0#9_mCp@TRQ;;rbBC=HI)kvD@VPn%41WGL=#NaNopN9>>=Og$(cI zUm>DZ7|_bxZZmR`P;|E}EPim1k$+tJJhOD_ejl6_ujdWtYzimElAnRfoRs3I z%y>NJGB~B&8zh&>JSv||oubOZu_pwXpH>B9j&5(l53Msu&!$u>b?N5x)aepW1l58= zlR9N&VCZ}j3u^}gSvoOvXpni=g?bHFMKMooov%%fDL|GT0OOpg(>dz_BRu|tD8+AS zcZY_l$2A(aB=y0(MTa~*q-jlIlay3-yMg?h^M6=h$@qvQNP-fE0fd7j@ z>esMWIGFqihFjM|OCh(+y7@w?d;jOk#Xy3tNHWhXF+`s?6jWKDiu zedGz2o)x1d1N2nv;B5<9*rK+M(I~hUDr7TGDDzD$DLMA)0W)$(aGN#aC0^5D9eJ`2LZ1752@~U9i;>IO}FwvlPyGeYA@N~SLY}1$- zTyt=OfC4xX$Ztm!OP`laJF2A*Gp7Rjtfi^F(*pF!1SR74M`n1L5VL(%@Nb_&0WHi# z=vfrfGyd&O>NRKkDn5MOlkH25N?4WKzO0UJY+n;-QJ|{zr${CXcSMMWtFLWjDx?3V zzKM6A42?$F-F=h=t+-T1E$b7H_I%^JvOAyMPJL9k{)?3C@C_`aw9P!j^RKA1--U8w zFR}_pW$QBaHax;(xN?BW9xP+bN;Dj849cn?kbXw;L^)R#hfG|ZD4drNa}uYX365T0 zY4Ye+)04#n)q%y49Y%cu@?Fwsp3xG_r-J%i5F<{}IB3Uy;mifCOFNkfleZc#p26p< zNdjf@6MYlfw8O2U)|Oh^1JCDlLHZ*>dS`bkQ!xpc)9-*GzmgO}`HHqhdNdJ- zi*7ag^Fkd{#St+xvmLubfZ0)!O`gfUg?UFHQ1coFo}uptXuc=N-`>o( zlLY^)JbTvp3R_S%{iyqkyc4e<#GW?iLn5@almeF`{;f?;M&@&rE5@yMK*h}mElh*I zA_?BXRW*q&!Es0aLa$zg2e4KG6&zFa)6asXHU)77pRN?RqrNn({o~`6DI8+Dry0>t zUExKY=BSkVI`eww0B$6;>9CIeoEr2;w4LbUHD>oL7#aMn#s2uX+iq5$rbm|893ua& z&?~wqZWs{@`_t%vcuX^tJ{$%!^31!*On>ml?6 zo^wa%pLYFSN@q{Qyra64xJg^pKg|sUyNBQYc+pqbgGXZBKc9~ z$F>fP7Ej&vNAU3&l3=Z6w0e1Ts^E=H+uPx*C#jSpso9x@nkJOgbnEG_^U6yl*7heu z&i+UxO>sMr1cbzfmr8q-6#vZPgHX9BF8))P`U8UG*zt0W(uAvaA12wVJ() zWhAR>I2S9SvSRM2Kpi8WO`fs%p%BYG4sg@NR{)T9y< zkEvalKNeYE31fK%s?qaEUc#Irj7tN$GxiIG1@SDBuvWXjCJAGJbTo?F$fJNtCc8FV>&` ze+&%I3P~aR{%S%X{b7(k&9r$%gwXBFIGqSabFIM4?@7R4^UgT%jc6_zxL>~i&m*~DMSRK{;ftNWQ;vmksr!YS=VO)Jmi?X{QEjg?S2tQS8>vsRVE z(>2b5xL4lR8s3@{4^R_oTloH(rd*3e(O%eIu-YoBk>;k>H&B&V*q!E9CZSA%R8rU# ztyLToSJ9>BY?p>E2`iy2RQ^QrmV}umVRbS5SMoIMWVGp5VayCk*q2DGY7F@M`qtPj zaJe({yA)Xux-lJu5>C}e>Xe_}i>w46s}q?>=~g33O>;{WuM6!}(1m0xFjD~rhcHSC zite+Ra6+|W3J8itMVaavEIK^15HuEz7J|_nhB-l|@$@bX&nz~w!KUAyK$&AmB2Yu2 zjt$W?bTBlI7L(bZ21)7M%sb081KpTRW+x@9f;;?gmVm*N_S`$LD4(ZOwLtqdNwXc1 zG@o%*m&i;_KHoWL$(;pPGTUG>DV#k+!Y6(eNVM{XHv2QwvIoPkp{NiV)eI#+WMZPC zSamY|#bMI71mHvp`C%SgOLZ414jB=i=vQkRyk6yL5{5C|D_RR0rl7Ks)wkCAk#dw@I zgV1yNgI8=u>a66?g7C5DP%M?kpWbfeD<+Lng?-@S$kOhcZX!v`m?bKR0;>RC6CBRk z#Z&;3GJ_V!CS-Y+#-n(3h$5q^%tDuwM2Ha+YK$Lp^YbIRA%?`n-lrY7s}`$z-eu=! zA1{aulgtM&yZool!aQ6ZB!5hMFPcuV2str$sB7AxDEQT;#*UeBpGGu>{qK%%egtUy zGl%HYT_@HgjuX1)=9??eA%*VAyRL(2p+s><`dP#p^or`a0Qpy0BxY2MZe=sE#SJ}m+k*5*FpuORSE@;A8rj-9ih&tT|Id#)lLYqLyaNrc>RwkEeLj-5~-Z-VzyG1(?v`uiWU>uh>65f z=I0=ZKr^Go>vuADI2Rt)&&g+j!iADT4;EJDg5?(=n&S>239}|(@+#;eVb{Bo3aa=q zhMUQ^6B#`Uw6;aOH*TSm>lJl|}mRWN2AOQn&Pio3#y|+c$5qFAEzPCVjooHOrir zm!`plI-|PgAgb_u-?PrBmCz`X+FVBRV}6EMBBu5o`!g zX$<<(#!#`+7Ca*?U5JCxZgr^q5RzK|E6H@m=4zatmJhPsvNy?8M(!~5i|HEZThxx0 zqH0sGJ*svjrqU4KQXk@}icY44AJ~ScAJ}%QsOLD_n&Ali3v}MTL4CM_Ra;*pdF615 z4V1(C%QVs?_3u&ygGOBtU2$6!`W#X+kI0=dN6}? zMnOLbw*ulL4nYzczU#KAu?f&~BuV{zKlJqr*lA*sm`d&Wi+$G@B)qvXFYRLIzDC(u z^pE=Hdq>omVu}Fxw%5+qKXNeEa_L_8=@I@z-6n*o5K8N)10*-6;wqWqmbg7Z97Ox#BnQkN=T(t#>1rNXR?`v0g*$5vz?>21lw?uTGbaG({XCKTu7PAbp03LfcaIf z)_zCUgwZ@6!txO+Al?jWA+$g4p1$NgQ5WM9_L^BKYt4~-v*cRp?jWVxlQL`RrYtUR zGWGT28INn$jLyAgm&|f$BBAJ-i?=_#`*;!9DWbG*_vD zzxyYx^h<-eT6wzOUi0Vf!zxb&Qr7G`+DV1aWga3ZcUksa2=Z7nEXCvt62n91= zsv`%Jmv;K&-fm@e7qA}amSBeT*rVG!TkH-Wt`Q{EN%mTEZuwd;xvBZo7OdeqQ2P_- z2E)=m@Cx2tLF%Upq@k>e^R4E1minVL~^R~JghEYMc^jJJOw#G%12DSA%%q!z zKC>F^>tLeI<{3tvRn^NdW^H(yJF^e>4rTA}JFek`>Z` zD-&1+78&dbU-h#Tm1T;hfOGQjDuZ2aR?0>Yh*X$F0Pn5VLl0{*b2i-J?I%Gj74GZ=Umb1MNTj%atxy{KCA7XD> zK5?HQ)CWQoT{8LU(MKP?$0@syK4rEA9Bi09r?G2kA$rBm;W5OD*|xmND}cous_vn> z8SM)=@2Mz>ie#~CAA|enmf1 z{LDTK!%QNC2V19?2hWecKs-tk2Yh)&P2zl>xd_fj&G#%aw`YK7FKR!dVYXqcj*JfO zhTP$3QT$a19)7A{jUtGM1#blijX5qoc59Ey0TCPd?HRe*GGg&%x4UK$H39K*I6(1JMp5>X@iNEC79e;|q5+$}H8+HU z<8S_1nSU!09R3`XBeq1AmM8-At0XT)M!Qj1a{jc|m9d+wS|}9OzB|us$Um(@5+BS) zPLJb+7l>RDA)-xicLHHHUjKv<@Zlf)++ovzjKY%Qg64o#9ybZX5VyDevoilkiVH=5 zwAQX<>Bo1%y@_u;T0<+NHLm_FzWq5VtkYIO!(-QpMJT0Q*p!<%MS*s4y;P#idv0F{ z|CeHH6|sW(51*A|>P?;(|9%ind` z;{rcqw3?GPDY`7+Ymc{SljXI5!s_MA}Ue;5TCE5rLblbLAm@OTj06@ zx1zfdH!VmW;*M1?6T^pB*V#-gBaY5yoaq(dOebrmLxU#o!Rlt~=Yz3_w>4@(gnqX_ z{LW!bFOq^xCz>o56z^jt+}W^MLF(JEyo*AoGq?Dea(rxP#0XMXg>&s1PrnCv5z_CU z{#lu8Nfj9(WsIP$K#_P7pLzP(R$w`cYhtnM)n-s6tl6{oRRu=qo_ZX`s%r`i1GEKO z`>NGVB;$Y(YGLs&kAX7JTN`3vj$^Sy*%`hPejk!N@ZFqs?y6tTx4$HXHQGMTg!~z{ z@8Wvi`DI!p*CY3t^f^C?z|I%ZVJ9+QxFCyRd^^O?$%^)et0;L`QfG=4YJC{jlX=%a za=%5FpF-mTQo!C1N`~`qV_g3(nZjL}M_*I{=k&8GBVjC(yhHLxcO#6`&zd*t1`4Ro z)^$t+Jm(I~vx3Zr6U^4<&$?^JwM9Oug#8SWnn?^p6SB3qoO17M>QyjxblAXxBlQTI zPld?CnSW^Gy0#8nnMV2UR6jZe9QP%TBVuxqiXJ zmQK7@`8IP1U}`YCtyuw7Ug~IJAl)2f-qCAar*kwKa}+HfpV@!cy+i-tA*+~01UPEv zigk+Ml@x_Z&isP`cdE|c5cP;--?iD7$R`XO5kj$bv~!-ODo8)eikMU6qclD79l?Lx zXENu6T`J112S@ADw?JIosDJNcrRJvrrJ+$B8;0+bDRh+C=h8AX z9tko>s7!y7usn<8(b%~%8kr;NFXQ7kNMW6txp1d@Hr8j>Ti3lZ;hBQi$(d~cw_zQ` zWTCi(AMhzB%!r&dqlyS*nHj+dMHgL6pZZS}H#GHUNg}!t`Q$>=mUpFK7VI-X(P+>o zMuQK?6b+O);Ic|II7MY7ibSIGNS+4Wh@#9X^;ht*#zt7Dr@d{37uWk{TXye~qn_ zax3y+kT-j>nS-5#H9@Ne^__sVg@qTt?w9+yf?q3<$8vX5%RHRamYgLhJ&Hu?yTh58AKp{($cMJ)Dcdh&pAg~pqoSYUJ-cjIUS9}mGcma%Aom{;@P|u?A@ijPB8_W zx8TkOPQ65VVCN`Y?RDJX)7z^fIys`SzQpfyy<{2@gi+3?K+f9!wp)Z8^oMgGR(wWNYa>VkbtV`Y z%KKCoQ2rk>m2oL)-NQvFqbN)uR~U*I`od#tCeL!SVRBDrGK@|?*hOioLoNJ{4g3SVJ{z35V5)eyZd6dzZyIFlEvA`8G4-SJ@+ z6f&Il!tEwkH`Gax+t2CazY3zykwm(Nhx}&v==^OqpBVkwE{&hGDkq~CPzaP3G0@dP zZQ=M;pbdFWKp11ODT2Y_vk)B>kl}X)`X&?dGw>UWbreJ!LW_|bM*@+$Vbey$F@NV) zt+=|VD<)MU!_mzhi(5K736W=J#^|aMQKC4nK+pXvRn+LNOUcH2)4eMctk{pHB3m~U z^<(t9Q2fA3?JnTRb({ETP`u^vZK3c16$`g7F&-RPRMx$;qS!Zo)KJ%jS#$S>y7aRR zb*Td*W1_nLBZ$2n#>9*0n-wJWjfV5FJmVjoGLDI^SFxoZ`#etCIQ`j_GbecL(GC|m z&}l{V=`q^yi$%JW9aA0^g8UIcG12p-Y8Px)=Mw)zrZTD@!8dDD zO(GQ!@;#1B$!Z~?54_}==NPTjSH7rdy;PdZVN6y25oOJydPIIiWC4jr4Jv{=BU5y? zj~$HgW|K%9-CUPCk+Z0ULuwM0<-;wy(u$bgOi8PYis&eyKLD3xv2`z#G*RI%Wi7@u zt;3O8PP=&;*~_7d6Kr9|WZ%|FT-9a_qDg-rLWNrpv~aOoqITl9NOs_(k%NZWpG&=W zK}f?|W-8gvrNE0?zoeK9VVsEE#n`6QNh@EOYT=1Us*UDn&f=M8mOCr(F~=eIqRSdc zg8R>p)!2!>-1Yf;i}aFG&r5?P?;R})&KM5H@V#v2?l`30RCKKUKRpA-2VI|* z`i)6>WIUz?WIU%oZ337Fr#|C^ziUIr3~`cr;(Xfh1JLbcRFxlEG(IxrhC%}BZqoid zvk06Zz+(Oh1^L5a!Ps#_4f-8OYVZ9*@jXh4N5>7Lvxdl^>6FuYOU+7}m@($ye79#N zjT0(ME}b9vG)W*Vrz(?N3#$uC(??_~<1W&RED;eu(RRyN@}%Yn2IYIYx#KNm0Sn?K z>u13H?~qh=pC@Z9G9R}J{MpN`^~fq8x5e$ZI^K`}bli<)DRMeU|0_s+iUDbn^R99Z z3V1MB=p1cD+#95xL9V1mGS5#Y?9PIg&PD=ZrJi;#uL;t}SLqr&g%y#4aBq-RaIVZN zFuvQqMJU~kvjW?@Re^IDz^SIuZ}j2_a;yx>tnM!M#$)c`V~^uvbbB9y8`9k&_GD8y zIh2*ybZl#&kbNHqo0raPS=?UdGlwe^$;rNn^4@AAFDzK2=+y*THZKlz(H~;V0AVqDsqyj(dLmcF>Yvh^eqEDjr?%Y9`HASPg_UQI;)w6) zvQQ|gE&g2T-WL7rPAK6V792sc2qoUVGjzf#jr&&Y->KPY2M~&U#|k3JJH+o1dT%=C zFuC!wiu)=3n8jo=I!IliZeB*OWT(@8eiNte)?jQCfu1@#nu)-561jWp1^^axA;-|! zQCDmGzb@iE+v%~crN3$BQfyY~NvNdh&syKpg{<|G*2~t1D-xIhN$S7j8D`oUB4+iT zJm|JO9y&Gii2)NrN`Av`-fd4SuILt!ta1bkdi0*Dlp@Xj%Oo3xa zgC-P+YT+_kC>MwoT*;3CWEB)hk`!JlnGd!Th~@+yZSRUnkclIXBzjl}Hv+-V#3f{R zcbXeLD9NO$RuS^E~(%9+smsvx>y7)V zThq6|N&@q3Jm(Hv?m_cjBuA7k@ysK{Txc4mwzM|O?x2-obQewKd|hiZq1&n=f1jb@ znlY*+%nDbI$#awG)YZDgW?Zyr6mbp!f$dl{9uJNZRKi#Nr0&U0&2KP{2t7~=tR!vP zxWiqC3|B$TUFwqmQ83CIgCPu>oy8!$)GVxZi2!+uWGwPiUW6=C<=I7P{`h1;k9iHGEiAB~A=v{2iLm){rtTBJJ4MPZ>5_OB2@afv{Ar z$Dx}*gyFQ|TsrFiO|?1}uc}w4`-SeOkK(u;j#aTz`cHr5gzyTd**d3Q-$gynBi4wU zOPFA^C8m|L8_lO8f88dTQ&FY9B=?mHG}~G2h*R0soL~!->4B5%inn(q<=xlGuCO8m zx31<=JhuH@^$GrTx^*qYmWyscm_rw&baOC@S-}PJ8@y9MSTAZHysN73Z9c*tJU(*w z@!36dA%va{U1-Yif~D;5H63Pu6Qr*WQre==yaXKSE|hgN>-Tuh5>vKz1B&q?mUr1N z0N&6bg{Q^6AcsnpS%{p=Hixs7-8*x8fC-(|-{m&Hxz57TS#I(3J6g2Uwo@?Mu4;LU zd+FOd(YSRGSD5Hr+TdPPNuWaEl+xCScBZqhOUqw_wr^5Y3o$Jo#WTO4>$gJ)ox6iE|&$(qKm$l8SIFs0P}L5(kxL>YCQ=bT&B zH{EcK>D!@kGtN1s&XndnIfKdt%hgnFZ1dL`+w}I&$~?4x3ETKt%*MFvY{N+c@pmN8 zLjD*;>3k5QN&ShGY9^_P{W6ix^H?ZHxoNb~V0I&W7-u)P*`8q- zA@xbL?EZlNHIg6__kR~F@OZZW%82tCEW4F)lmqj4MFBW zDcI>b!Stw}PAW=%nQhXkfUudbaHL87gQB72WNjx08gn9TX}SZxnzk!Rtse%ghRkV9$eQ!Nwg$@v$S7kK>4}Mc z-gmzLn)r1pRyZo#Lyr$~C3zQ4{H|>MP1L(T?Wpd9s8>$9xq10!m?)h1J;R!TL`uN( zi6ciBlmMrpl}!K1uhP*>^~EO%a9PqS%?{q|jMYQHs!ahNWRHdUSc-DxgaZu=heDnF5r}YwpnO}E%r$`KDk+qEZjxGK7g3N9iUJ!*~Gg{z=!E8!_vkqni_W`iGB;ApO?Gl zC^@9ealQUjK0TczQj2xG%zZ{Z9Le0ss$m;SrL(n}HBcaI^s!b5%4Ti5?1x$^*}`!Sg@!348B z?gm!czY-{anM{AE&^3Pls^k!~StD8X=4~kD89Ds1GO{@qz12V~GSn0Wcatui91Uv` z8@VpEC8)iRWnDZra*^fn06rvag^vUoaQ1B{l+vSv)M1!)%*2}>QLs6t6!^&3CUcap zs_5XjR_KcS9}|E2<8s>wPzW{QiVws;GJrg}m9sR`;>}iGrGmEiR@W97a*O zm#V!R3&j^1*H`HpFgpQO;ColRl+!iCNSzY|;@WZxj8*gT78q5MBMFvKU-0AOWF+tH znXDbo>XhB z8~YXXSUAuh$o%4W|Mu|O72-;{3DvPgNv)=XV+)5h!DOxtSZWJ0RuR^eX)&up<2y=;)=wEb&nVso?Yz>5u!-0Xn=c;`gUNy<~_E zuSbWY-MEkc{8-80*5SUdK9OYTK`?Me-DxPPsr0&Z6x$+A?^+@oeAIMggCScOaR|RTCXY z^fL=zZb`m9K3I)GG%fTwu6Ba+I4cZZoASI_#*N_2{koAJ1p>c@P^DrdVNms^egbu; zN0}LCM(8 z_EWpgU>(3LgUaJfA6$YyQ+JJ8L+J@Y`a<)>%p4UY&#b#i<`7(mTUk1A$pj}&>}Y@b z&_taKB)^n!Neh`3+&(dx17=H`ILgn()+lt@XEdYXJZP(k(BuQEICiF{2dViA8<2j( z@UbY)&{cUh(d&oz0j-A{?0{P1T>PmD@yU%UsNaY-KYV+A{gI22M$LN`U z3l+L|uUe|%a4(E4xcG$|obb9aG=seoq;1^UgCOsoC0%)MPXi&JvnlC0}B#P1H*Zj_eoi=pN(Oy3X;H&BcnFw5U{G zgu34JKmEJd8fK+CC#D&%wn&WrpNEx{GprM9=$dX2Irowhy~-_U!j0V`?aD8Je3%e_ z(HA>ob&MtxxmrPHcjYfpO>Qh{E>+8ZO@oqCZMDq9tW?&^llKn#AOjiI2RqK}XBXlT zO?y~Remapt>I8|43&c%h{v;wJOOgY9T2YqFTv8XF73Z`d_S-tQ@JU{+Z#c8^TvS#? zvoc4XA0)4^X{8XK#DtWaO#Ta~>w#Jwe+N)o%%@%R4F+}SG~;JKR#VAi{VkJnj}Q6GYB8NZU0}O$H-r4#H+%<_|wl zl}0l#kpoZLZcTg$v*wbCK>D!S)D)ySifD~-efVW5!zymHDX7EaC-AMNCpGOvoN2~aCblb7KFRU$1AYwYLmw}%)S2FVMZp|xN0pd zgA|ubHH$pK(8+uiR>d2i0Az(Pq^{sduqU6?rIzCk5k?u&u0-gkll`-NX8Ksbk?`)F z+T$a4oq2U_bv(pJt)%i?g7IXGYu z%e=}EyT(hAEX2_cuE>8VJtXT^Zp(7-72r2JJIc(zE|S8erCnXzciqt70uP+!ExZj! zb8xMrrOVu1KND?TZg&}3oLftqoYmNNI@aXo)~24@+c#`)I}3!i=x4Ndnt3v^K8stv z1VOwN#4ReztROb2bU?rJNTQ#(T#Gw`U49^@iYy_8m>`-cEX0TNyOu8>KT(YP4ra0{bMs z^&_yGvkaLh>)ZHv8A%mCPLk+gbM;N(T69#6`)S7zeubKcRuhE#MzfbL3NCHi0XaPi6Qr15-S8z&ors;fE z$0yt*&CDCRfXv6`QC49MM@L3?@uQgmfy=r1j2N>Y|7vYnh+2mAjDe!-|4ww{IlWhL zDY>i&A3jSx45ZV5Yzj#uF3l51iV$zH8~meYU; zrEE`y6V>hI>z-(0$X;FFNvUf|s(8t2uOSZ4b4Hh<1^WcFU?r29q~Kf}wRHhj7TDIv zHgHY8h1qKxJH9Aes6e;M2BEv56$&5q=$oD=_BKUK-7fpK0KGkIGMBf=#4P34(Qw}B zJj?+8h|6n17N@tu`IaXsFLgv9ueh*Z;(nfUvzB{fdv`u36PubEW-pz;xP56`S7*cQ zMXZgAd`>Foo5TaC)v0NvLbkZT(T!b;R9_S!r($*}K(icNNj@ZsMKV;>_$kev9UP7KP&U= zYl}F~OGbx?bTT<33!pEPJR6!ba`{1CS0=g_U6tQS@)FW)2c;4+bvbISSn4(1piuuu zwFPWyOK^#^a&z;&yjmUlyLoYEzw(6WCfhwbF7txV-6)sbNRP~?g`LzhIwr>kf$h}S zBu-2o&QO&rURDk;!@Am+u>9pXV%Ab$SV~2-Wyj0kkb&6vMHLp0CLtVvQA1C=$}*({Z{4;>nin1){a(ZsYKMt z@Qv@0U7cVk-9bej$a(aCNMWTidFFP?TO zWemHhU*boX_DiHUAdWIuLw}rAMMGgB66pg^f^H1AMMcfGXg+0Cc{^o2Z$20j13lRB z(DzY9Z!GYQ464!P$?itg_fbOAT;Xi)R$2rImRm`Z`MI3)x-Ye4roRPyW#n}m)@BOS zS158HNgz$SI5H|PFPY{|QMUlOudV2u6rGOr{Elt;&LEYM70Ef}ycuNr+t4~xJ@_kk zaWmqalakqAJ6Z-AMF=2Ja`BPLlcE1pB%yQtCFp@d>6ZKrMOK3DOaumHxY!MU=k0C$ zXO!cohWPap8k9JG_@vy2tjB6)C1((VJ-!&Y{J@HBCspw7o(S+-KM4^HRlkvA z>!+A^_alFw@NM&2vhl@CwI#@WFSw>|z<6yY4J4_>tt1l$N5~z;BrguUzhId*WDSI;d@rWlV3NR_bzi^4 z8lH16=J#^a-D^RolqxL+4QNVBV{7|DwW`vhPQ#@3GaEWX6-mm>9^v}1v{>1vp<=Ve z>>M&Xs^+g!v&ShkJFd$YYk1%^0~-~-TbT<@zD=eJwGSYuet$nq!r!@rR~%o2*PQP0 zYBIbU=7US4JNjCPFBsz1Q1($l&zsj>)$u}2n8~|Lf84E{M6t>jENX09sPD8)|AaLc zJkC7W6#)nd&r#UqJT1$!yGJUe$lr%iupKI;b~p!-L~#uqO;Wi7^P@!dNTqyb<5nCT z3bw5+c4ytLe5zK?A=!Yug%{FI^lt}xPrsGZUn3Bmu4uZ6PVIT6!mi`uwnbZXy&!Gk5XuN%wKw`#9$qb+1*85A z_V6n68>9lf$$3If01J`S4$~?qfWe~f?l5|efZsU-up=U@&*_)`$ z!THfgLp-F)ocLfI((LXbq{1K|uV+Y!x*#Yeh{DReu496zR1fC>Bzj+v9vz7=eXVBB zBN?1yJZyrs&Oa-&>!AXij|5x90TSl||A!(>FLpfh?3Lp;j>yd{!;@Q)*jLvi#=WXz&6?m$pH9ZSX)|s517=#Q^wfBrRlzP=uI)?`%0Gr8 zMzR@x7P};oP7DP{W&DZs!6W?&@u4G%iIB=IrdX*FcuW0HX+~yU)wX^kJTHok%1@3c zhI2Vb?($Br!ihzuP_MeD7HGofPCg4a(4|m1?|>ca926PdXvzxd4e1Z_nCvLV*|vop zSOuC1dEC{~+G5xE`5W4+P?57~$Pv+2Dv-!zsw0DvDO3BgAmj_lB1 zEAg>3Ez#ndJBu_Mh&&iVMQ-t-ZOeyFuN_4!tMUHo_)NUWn8GqTe~^aK5IcVS6*@T&ja*mP2CoE<*?cQ*97YnQ522*r7O|+7F{P|vPQXbg zHIYE)j*)W|RfA_1icWBi%D=}>Rh7g@H}iv9{S-+p-c~4ja7j_StC4Os%SC#CwR#xE z#P@1Zqr+>F7Gxy`@U}e;8WEqYGW$UJlmZgiX&alm22hP!Kk!jM3WujyFJeMy!%nax zEU1hY(%dImSat+kYilOYuGwQx&5l`;npd_ThJIyTIt*3N<^s*bs`1+-uNH+qEX8Wk zl3;6H%;2?|aw3+RI`6T5iQn*?>sW5YiUPXKDb-shF6~-`RRN=N7g0nS77($x0c){o zEs;vp!$$>`Xy(UMJ*WNjW*4SpmrxrjsW` zLK9T#U5WmXe2if;GTN1Smm1`TEz11jads7W&Rw~DiL1pc!gD_cg~OV=8oDAhqCmza zXcT=_pwG!4Q~8vZPAvOP4G|SK?cNQY%DxQgl{qKKoE~f?&Iuu}ei&>W|2o{sB@afo zZ#}{I6V~_Sr!&Ii)_yM}?U(F;7q0v6FOqBZG&ukAp12Ul1gI0EJ^XZ{Bb294$oXS~ zE^{DE$6i5(qo|K#=g7=q2UwE>he)6F!j28T%r~?rz|CSzxOg;-@_|hEUeLIh!=gcw z+Y7NZXsF=tn`J`TRI{hq*ZeD6!?L4XWu_G6>4sM9Yyg3mNp=&GR&MniOqBt~o$X34 z1U4k~lpw=de!j5_z>w0>fudMxUEagSgtfwthJ%s{rcrn}NiAPXG7V=l92+XHJMpZHmq}NkRQpaIpis+% z#cf&8!o-%Wk{MKLsesU@9(BJyt|Vt+9?h=K(RTGy=sy$@pqR75uW;~9&Ih7)^;K5$siZ^K%yt!?dGmyn+7*Qvej8j>#TGuzb~};u?Qwj&9m`3fA@)<%>R-Q{bnF)%k&T!yFToP> zpIrtzl(K5-HzZ@8MTokPd4|C}${3i;Bo6NtF%LpxYqDx0C37UTst-KNOmIC`$}(tq z1(CDW*yREWf0v{dzD@<=zuf5jQPv}7Fp4CklZTkMks>v1F9#TVofL%NUJ9Cdd`XbK zE)srY7d6gr>B6NC``T5EeiNdom5QO8yiQDlomlh}nT5e`NuNYpm_RwvOu!GSiptLS zJbOz%;@QE0-u;vITx(#O!`^VBBT;iT@WN638IMlYV;10XWDL0ZA)>I#U`vv!a6rR-=;1qTCV#&Y&m7QP58I1 zzaKZ*GnrDNidr0B?LmH#7a_=>@*peo1yTg^&jPQ8$k3tDFRdR7vW5=bJ!@qFfy+|Lb&QY3vL z+dev$Qeox3kG@~lM|cg`=s_#Mmv=TXh1%N|5m>0HU2Dn^AL}t~hV4ia6mOD@$(lSC z!iorFhMh7828L1gF~3c_Rpyp{B%!)xNK|vIee?ptIEF4_a1`}%P{aX+}I}x!N zoXx)I7WY4tGmDy&zrwU2IXFn4A;X(S#R!rxK9;79#{a{MkZW?D#>%YiQ{Wl~GC>lk z@gG`|4kiimbtKO)-ZWpvFe>!6-5c}+3We2rl#h!IiWT{RiG2TXY()MkqIT-eU=qdO@>h9#n09~1l5!+LeFV4} z@@G^NEk3=I5kSTyWn4=7UB65s8L53!d~uOPxgP0d>ahy@EKxZ$w$y2Xn|rUOj@wCU zVUKjw?YNAGm9Xz}%Tdp~?v_Qh!3mQa+gR9|s@0BGK2n{DDjU>e%|dlHHm#cx9{3fa_F}i`9qhdX2l;lLq``L;^A;}HHu5BGC8mT~1CW`> z%H=~P@+#o-BJ2AxiDl>h8dQ`b50NBFa^u`7{n*JgDR$RPZ$B;>;^iEnxz5ln8MJIE zT5uF!%iV`gk(pJ1J<&IlI9IJ~%#SfEU+faW*uC7gAQaG%G82DB_>xiibHVDapEiW+ z#Z?!x3#t`T`gLg82JHz^T$?^ui-}~CozZ~j!C4}5G89pTzu~_Kw1>+22oqRx!x*z! z!KHS2H5_TzSIb2EV?KY8lDZ33>mth3u~v*shii5eNhniq2W=ACerYqxG*&nJvG93ZABB2_sKb{(Q)fGttE z(1h0i21#@ux1aX3a=QOF;8YGErQZtDKj0<{N@Qi#_O2fY$Q=T1KbJ+#EY~BJEN$YfQ6B&q zYJEK~nB2J(uRr8x2Q4ywHJfY3ZeMEbXK%2xaz&Wdc;C;aOKfneZ&J))Wg*IdN+* zO+XEv5DCxE{NFA-|951kXezA5^B7K?tXcrUPa!GuOfvnfb)WhwCPvFT9%BNXKT@YFwg1$ zMHcmmiMC)N>DeedLW@b0)snvI)e8Z>T;NYD7x-GxYRgL4K0)#pNAqEh9W;*we!*OX zf{{5p*eZkYE=N$qIFg!`T=%t{DZY)>(v98HE237DrjSpQ1j|v>WP0$wdl6cJgQ#oM zsl*6)R~Z+Ojyf!pSmfO0HBz)pQtQg{$eZP~TnYAt>b28UgMmvGUOOcdo)D|ES=dh@ zb~L>7lubU8d6*x=I9tgsW{vC*q~{OkDq7A96e4~ora=6K9f}cmW@hThDdRJ>DM;hS z?h0jzDU-fSHF3#Ib_|DRSer%XFcr#6=g&6l116a#q#yhs_&N6Vf4c*t%r!dy6^7xk z@A>e0#KV>FmweX?xx?uJO6!ro{6cyrD02FTbi$1ef# z6v>a?<4Z=b9RUI++Y&B5>ch^1T-nu{TCHVV`by@OR8lx#q>vMZb3_v;Dgvl|4QsD> z+AeKOf^>W7u%yo@lA6AVWO8Fwb-{Qr5~ftfL!_ZIGH{139bU#LdhcM$$v;EwD%%rn zotO{%#kLilg2Voc>O@)lPDAI}{c=W&-tHEG-UrF8t^FoIZV?eq*sA7F$vE52I9 z2*+;+32_{12*HZ{BtwK_3={jVfb)sl(ZI~+Ga4e2M)y2dXd(V#p@}8i(S(KjJG!x> z3+pAkEj|~O_v?Y9D;J4~jbRALIPN$f_Edf_yg6jrTCA-7k4 zwaU2NjjcnDJ$O%t2DT-|@5?*}8MD2RqqXnWx^*!=RM}T;u_0!jKoS7^9_f*Jk{2N| zqdYRoyp0qSt|2lOGFa0=9Z3i;;5(1az7?^lb;GOvXbLPOg_V0V`jZ88@=l+K47x6M z!IKIOB{lrr@UGVphK=S)b%y|Wk7QjVt7(XhEE0NF=E9kkut}e%LVZZWc2B_blEJKHP6+cJ9%f~ZJgO4Rnd4Qc zFG)E4k>p|Cp)$;w_uZiCs1`w4Tnr?v%R!f z<>1l%3Cuk=8g9gT3?u$1nk7~bU$0=2JUNV{cS1wsA7k~UYOCb@us=!X_*Q1hI*gR8 z9+H#j^6a^~n7cN44dW6hA_frt!r_M`qv2z`2pM26PeWzyzq}F+v(+k8LlSUXNS=U0 zDiaXu&EaE>*|1Viz0hZYwHb5(<57D(prQzPFP+K1Wo>CoEO}C5kL3g$-!2$~_N++0KUoQf7e#t8S=E zuHD-Do#(zAib~j{k2=L2taUSwxi(=)^d=f|GdCy_sSN`+dL=*Ad4jPGj11*Rc@d&K z+M}$@zg9$f#Ic=t^n@KKvRp^{m=4@le-w>~*kQ#Zc`o<)cQe3$5S8=c_tZ5B&-F5o z))7YR?-)Sd)!v>)vE;Yf-hHJ<?jm-TY##&3L&L*!jj7pwgt7;HZEv5 z9goo@rz2QCc9a&DV~#qtneAeHj2L|G^o$k|S(1SKkmOg)yQ-mLXQv14`qiiTR*+q` z3LgNT(I37Y@e!75i(u<`$P|b#otfF}6$qPowf<+u#Vd1)7)MYg=j)0PZc4&iJ`DR} z>kUlRGAAtx9;DEF=owOcoU73qf1|KEXgEorKLSV|{Bh;rC$9?9@6+R%RLTwD>+^jR`@;9im_=H0Q6}NEK#9&BNdiSVp6mB_y;15*<;vKtOaVhm z)m?jG#ty&`hN9MZ-5Ilrob;W;zMDz7oiz1dkaSy+{HM0CQ#Ue_v)r8XJ6I=kqpT@) z=4hAtmi8?0ptKLJaUak<;y*rkSJDe3*!9%qqm1IT4p(*(YPnPQ!=cVECE`Z=K14$! zT2v-em-!bTpWx#@zqC(ld#5@#{dom2!xVa?qL|I&Y3$;qO_r_Px7nt-hvu+iZ41)B z*N3;bQ{lb5T;;Sl1NT4vZYFs^cKm!yoKdDPmmar;%f=c1f*95X^i| z1YwiVVa1y`;(=UdB~TRJrxTn1~eC5cNfTI)yK5qZv#=G{D6K|Gtd&U zE9j@AAjxfYwT}7ixJH`8B|izpv_tAp+krD_&WrG-A8e}xsw)%S>gb;VPEVrye89en zB(OibE&}~CG0@|pTcWQ>a;N?!h@7J<@YKF5k7twMHiXKgbby)iJJ9e=*lu00gadr#k0w3$!HVM#nKrUYoxQh1CnLZ z8Oq16`qgqo`xHW8A4J}Eh-WQI1+;*dlvEYD1M^M7yIedQmz1os?Z|^BIJI~O$yBMW zya-jPdap_;bJoSQgCo_l#Golbt(;DZ$GEVOiUSp@N$s$X_V%tS z;$zt6mCTr84#9OX2pERbJXXR|L0R=%nO9#T52^Gbq1GWk1lbCN_FW{8Rb^X2ZCCvk zzHOzlu%Ze4otv3|4n*R5@Uh4Kswrt2Fo$}?U~5+`>?8BBHyt=-xHeNAydI=mv}W3f zkYciURRU-=^9WvK>Bo^#Z{m$|C47kM6o=s&3&+LyknlL$IOwI1(ugFcq%SzvMWe4pG8^|IzgS_lQ{Xr{jBdQ$#Aul-XVCxsa{8 z%+u;1Pan~0fB&q^e)r)JoD9;Zis`a@gv1gF$B^AKu{bMxHVthgsjeTAO!^JaUlNHi zsOBaJt|HgrKX5}_^#-LTGzgD3Eb>N>Jy?fg^j=)CDo8C3NnkhJmeSxDTAfQ0n8HG9 zvfM%Wo5k;i1-fJM$9COxpJQ^kY*PioiN{zO`>KS!D4~CPXAH)3)lh!u5B-ZD>($@$ zq3Rb&iE6aVK13jx)3Ug^Gl#J?H>-VdV;ece|0Z^DIKTK+(O;9>mv*!?cND#g|Kao1 zLi}~~oE*p^IBEYAI}{!VM32cK(PN_UZLh*(vhZzH;VpjnRleS;!eg?~L{+?4vR4Sh z!054RKvY9==Lm-6$iidcgGAwRHq<>r6yDS1{TG&3CtmBtGIUjvsJ!^f_20o9O%Gbt z$4-C#wbx*r--w34wkq*-fCY8kj>ewPT{Z;AC)^N;p?p;ze8>A#CC=n;kV^cK-&-yp znwU||>~ zT0Jl^gx~*lNncxM3|Uc^*hsm$<-HOQ^ZPMk^*qS$S*xlN=kndWYEC8b`?RXSWZXq- zcCzjE^Vbea{DyWv&&<3lSpVcJgKax)WqN4h0N`GN1V4*%PY%c?Uf_2p9{2MC=CXS*0X{5xYwS5v7uBuB^_em$# zUNJaPv!*(s?YSG$)rp$keG@-ewS)bwXML;h^u69I>3fya_mg^6C-&_-IPuTEcp%hd z65qI#TZVfFiCGr~iIFRV#LRvH#O{-rzkE>QtP6T2{?sp>*s`v-b(DxB!iZSvIQ^|> zz0l^*8Z$x}CfI3qIR43}4 zIzfyjW)ownbHo5*E_JYosg6-6iUGu2>Tq?62(M01hl#1w0jgi$DPQ&JTh$ZhtBl%G zy=p`4h46%R2_C^9*aV~6SG$5i^@nwvv48t3|8mU(Qoy~cUL?5htEeQYZ51;W*@_$g8$|g(o3;Btw|0`T!V$r{}M)VSfSs({H`kbC`ESCX-MK`S_X( zvn+km#*gCXL)X?Zcz3e8MKkfQ;0XC#{H=6OrY125!>{<~mDNM6-3{0d4!EFi;;z2* z@yeYNzrsyieW5l4gVGD>w3SnNJ%{xO)*IF(4exYnpy54q?Leck@s|cs(t3oi(nYud zX^cq@)Z@~mzeQKk`VKCXc&^Wm))%6OXe`>EnC@eFqGvev#J};>lFC|NNNyzh4M{BR zJ;-E;`d&$Yhwmj<4(~O@M!<0tXhxm7#Zvwka2@08zyTbAGu52_#ZJ50*c zJ0*RiHp8(YTIgBt^sKR_KC*F0A89OT>`BgxwrcC3l|zjG)dw1r>U;IK-mA?J_bTLo zlIWm!`mW=mv?V?3+jv>=j>c8Ye`9d(9nsuW>2fQ4&o{lja%G_<=QP zOOD|1@N?k`<7{;xOHee{u}-ANSKnM%1J zH!*SYj7~_Re|j99v)Ck^ot)OnH8tlZ5}vfPoyJFoALycjj`r5(LT;|DJvS2@P;0KK zJtr@fu741LS-2L;ENM}6Q{D+LYiJ4)8{1kqp~OqAQ)4gPmxAA3et`xXn;NACFC_B9 zvc^t|Xp5#KSLbqCl&8gu`I%l>T7xue=zTiTj= zrA@(!tzA^CroEfbt48m}+~mKsa@ibTozneR?YY?mv*zSi2j7V)3bh^CxTM(~-Lc*~ zwyi}mW7Ji%nw!-4qV4(ou-5kZhP74}h05D=b6S?Pt1@?si-3sLr?-GCZ2%XKm|B1jvMeG%|c zmx_<22)5u81uI&7qM{;#D+2OxL8yQtqM||p^S<9%&UVjTLf;>+ulaqH$vyL%IdkUB z`OR;iQeQ8Bei5Ikir2&8;xG?_4}ktob6jwZFV$EaqdG&(AYY7{JC12(tOi5m+c;#- zLm8$7A4xb+SQ+qz10maNi7(*sn7!rUA#it@*aG)n>xG>mUjPx+VlZ!yChHtcV&iUb z;(9&(Mkh+5&nupFldG-!={B>Tq1#wWAs_DU_YDq~2Db8 zBR|8fsO*VQHL-qrLzjmIuRos*Yt2UcytaEZ52&vXW(wn-SoIk`Cvi9$6FJIiJ|44? zojRU~iP>j@rg4&XaKWC8)1o+!mKyVMlZ-Pl8{~w7<Ekaw0@qpck3DWT;IdZaY#3`*922K&9cdr}qMaZtcf$;Av!HUmyT|$>Q zaYsnKxY_8)T1y`=#;oL26j;9?#uh@(6Y2omqR6`@!z~zCoIRMnC~fQyTtOV#+pr(? z36J+r6da-4pSwWAfkE*U+6WYr@wmrUJIMVlR(VuL{RF4kkiEW=S+;t4`!2RkW}a1x z1*T=Eg|4gk1WL;*$P1|_3S({;$3@EU^ueOT%^%$U%Y z1*pfVEcILbmmur8P{ z&dnBDz+rG>%tt^MG_@FRD^zRhU{V!oZ#-yCl5sJyrIwes!F-##Ui9VjsHLu#dfB#C zotV46p-P-01l6h>i@!J3 zx0wzs*J8*Lm4W<9`5rWl$QGBCZl+j9^GOLfphQ{>(nj2S+wp_G9r<{*`inG`(fxpg zQTN9BbHMrVwM&Msw9f=}L(dh>9O@PZ4p|C>z9>T~Q8Cwg&qDV(c06;*<>Km%{t_Gv z2BrWim#}YmaY+E}gJGG<6D>yyoQZ<4cn)DS5fUOkV}Pj$6FM&7FF5maxKNdg4@*$# z6r(6gm4oT2h=!EF;+c>@TWdw#W5ec>lo4 zt_bfx%BQ^2vzhoT`3i7Lq_i*P0&?wJk9#&86ez2-DCSyE94A|`jyUi&53BEe1Amh$ z#J>GTqB*$uWMdPq74n+)7xi`WjTh0`+*v~Y;)z&iTigvZe12a!!&|ZDU`9xM=iVC8 z6E)geUmEjeZP!he4%nKqcXW-mWbM=!Jj9Mu(VrM52FWBd-*RQ#)^K#_NPWUN0#P6vl&y(To&h=t1ch;J(w=1rz z4bJcD=?}^Gnu{YR$NIS|XIk|xx{`&O{>X@~_#ylKND*wCST-?Di?N<)@GP;!$=;4e ziirtZYVdxJda0V#_k_NMW=tVA^C9RkXbm97NOK&BF76^1l{?CC^et_pBk{v?|Gxyj zt|@RHa4;~I_LWnkStE2aTHKIH#LbP!k~qe=D@|K$1d%Tgs5Z`ZSfD&mK`#K_P-|O@ z+*l@mn{1SzZh*fG%qBbcTLpqmKB23k{>ivygSVOhPk)K?{{ z3i$|q;7|ZD75LL4E@qHLraj1JK38rQ!{KEiJR#uugu9@tpl_HTijIKbS?5Jwg;^KV zh<#1X-3=uHtZ>|Sp$Bd*cHFWe%rVw-dI(nsnN9?JBBehw zQjI0i>MVOJ`du3p3)8AZ51_4!iq;#M`|X$;qGDPD4cn{%8>8Zz4j;JxCI^;y?Jm`7 zim^E!j^n|%$Hi8{BkulATwMEDcWP`dXtzF-yoTS@Gwkt1wV|XU>9Tsoj@~R3shCz8 z5X;DNG+wh|0e#v#9`JZPY(y_BQesjIG&>QmnUmK$Npu^BSl>9~ypj>2qEkdoY4Ln; zWwvz?i7vTxjI3=G%s66uhbYY=l!6&?5N&&glQdr*uc0u?^V8Q|;Ay%>Y2>A0%#4C7 zr^c>r%pzv6pm?nG*Rbtu*{+%>R2d`d?ZS+)3-)uNy7s|=u4<^QEP`R9Z2VKH_HslM z7`)Ze6b@gx;v$vKylU;%BOTWQzdb%*|&I%X|f8e0(ML=F0<^v9di3(M~$hxaI84LU5)Y(8<>N}P?tC^aHysi z`#U@kn zDfM#1y4W70T1<%LtFSK)s)J|JiY%^(Ph&KMX+i0wfOs$_qI3QZ$HKM50Q7n^CZ-kx zfOtF>qK(`E^@Komsi;$plOC7BziGd%=*sYVNU`izc{}|19DbMSUf6=<@%uIT25YCs zh?|Nw!Tdl0My)v47V?@f3BjRv$Z#kMTghu+6eTfG@87L8^%3pwc_nb(>f|pOA4L6) z#bw}`>ClARwMD&1FNVK6;BRwDYX2d8SK5In!%=UMZZBR9`dSCJ$2W>i&w-*>yQI+$ z8$_lPk%z@v4y;*@%IKSlUvDbeXkeP1@Z7z{Z|T4bT9#_`b6jwIUMa@NsFesh{y#bOQrxV%+II5{Cox;+>e5MQH?a0@vL@aAWp`JGg-p2-7j3epmX9|%FXzCM z^bk!kn|Zw`6z~^tKiFdZ;y2I}P6>rbh+bBJx~=v)#mR~;wp$gj`rBH(W2+FKx{s?WfZM0IvXT_d#y=ovntMb~P`i)+%vl9qPx-d(vE`3HjjWvQ8>kLNZOXx$-&pA#?m{~v2#QYri4STh1waYoq^gJsGWh@ z8K|9sbDjZLx`2Vq!Q}ueT|ifay0pcqF-#Xgpk&1Z-z=rM*xN;>09q_qKe(Q9r*cYU zaG=6Tu(0+^hAw1uN9q9~_C>*yk-Q<}$vAkDT@M-GB3+P8Df)S1a`NHIQV8RIDVe%% zB;;ZU+YWbbTMxHPiReMcd9ceEEuWbh(K1rDjMK-qX%T%0$vRH6l`|rm+2zqVt$#nO z2HF8Smqee0?mju`ddiG(ND~tu-9A{O9WrXfZ{mEd#(PzXG>Uv5#!&>$#=4tLyRj5$ zbK-gy<|HS_MZ#C%ko?;rA4mc&X2w2b1x^4D-S_gt1B$O5`Ua{KuCA9*%kHkXS5{S% zW*)PfGcDPcszDJ8ZRJ~lv|Q2R6YvZ}q=5>V4q|6m7@L$5s~b5LgF%CYZY*RPMvUJj zC)iMiw<+D2xeOviW2fWh~m)PTkn^Sn#E zypon0(Yt9`(MU^?WGJRn1~b!Zw~&~Ky`}(ByWgrT272St_A2e@=bxG|uK77?MYM7n zG+u?vSc3O6`=FPA@eAa6t7$`P^LFg|(S9@(X?l~5H)GvO>wk>BGhz%#W0}v;rwqrV z24n^kU1`jlS(7eIX9=Acr#>9%ETxg#Epri)XIZs+>xk*;$s-D_CiV@A%#S(jPE~d^ zeHk`Jn`PJ}d;+kFQfysvuugJ`vqo1cJ*{c)op~9vmUb#$m(kL|&Q;rPYF4nk= zZ60{$s#PvNfw~@jSw^kvpt5s6nM27M^yP~Pmm&2d5w)L>-!~9xWN${6Gj~_!yHy^g z1;r{?z@RCS$ZFce0njGz0_(9YN6$WFIxOK+oLAG1KgQS6tq;`byzLpj>s0pt6cwcuB2WFz^kcwXVy#^}!Z z$bqM0I~@j}(z^9kkf!=9)LtS)-d+QZr8tq^G{p1bi2l7bE0T=-wvIZ%ZV(AC$L(Rh z*^O*|R&dO|6j?qUJ(-oX{q1$vLPm^?d%F@@RULhp8vW{s8u^9Un1PN67ht-8kC5)x z(Mj}gxo=|^s@@I7)M*E@X;m&P`E?@}ARhsq-;dwJMtA9G`< z=d}_W82Ly~>FC5-kfp|E0UAY1lYBv!Q&Q zQWvNnQ4Y}Lk4DUnz;bcHc0ph7Sq1arwNk;@q3C%aCe4r6hn8-OO!$KW@TplI-IirrNjUTMMdRu5yZe?F| z-0G7wSF@lGTapf^3@49NQyoEwG(-_b>{p zVl+@8=i~;jy4Q&p^nJxqsSjL9xSYv69Y%|oL=i?ibGoyoYe?gT_gQyi*i4P4QzQAc zJ9rRl&&s0FeYP7>b`ds4%~dtx1%-WB;3}_6xu1Dmbe`8|?o)VUMOI2NDdOFjv(hZN zseIWL$Ppplwq?A*$6)uvluOb0DOI%)?*}VbzGe)<3Z(m81BHVKa)?oZ7{u6`IVT7MIZ}^k%3%~DwZEIFZN^axiRPZ!fHdaBFttwU)l*Ut|w-nj-m;+g4J|{uoMptHRV;j9iXbv@+_g1}Wi6fgFQ!gn54nCK* zrq&PVI-J9;hm?yjuaP+OBGG3whpqUlKcFqAgA%?F8U@)f6_5cOQIJcDAtN4aG{e(( zI}N94XrbC{VGO_-FA?J##7)E_t>gZx=*U`R)tnqy)?yW}%?<5_Dbbq>j-JcH-3Q&n zLn6O^&?nZ;KeYc}ie&yw7qDRJISfUO(K1|h!Kp!sPMmnLF2)rm{R%%dPd@wswX(Ty z8%Ju;v+=-;=)=&{sq+1{juwP+!hHK=I|uG7PS5&elu<1V4z^gm^C%-ePjcvmkt?$d*e1xHX4&uERWwr-a`xO-EeeD ztl2Ri-r{SFKcS7%qT);sd1?m~8rJC^X*icEqEjiXO80MRde<|#U~Wy&%@H|Y$H8;! zL~0D%;P9Qq2W*Z&YZSDOE`V-gMNuEcSzHmfap;F^%1vM0#F5PrUFPGd@_u;ppF`uG zCBb~~oCAx;hY%9*`nhzWm4Lay3TS_?OFLicIUF=nTOYK-swyUy{us8!#8Q#LA!AZK z?^}W+u^D9@;{naki`z~=j6U@vyTU{#-cuCqYX(jLOC%v)!JPBWvo%QMtX+~{oj7EJ zUyvf24jr(fY&QKr&r4*wfG2TGT*MMo#K4Qsnu%kcWHpCie)ZJ2^craN#Q{)Ot$lzt zhDPnc6*wr$!u4S3erjk(h|(EuEQ|u(aI}=wn|^;%=%QS&X5cfN5@ka(12wS&7vc~s z$1cO%2QD#1_iOCN>3I>;W+sd<*N-vRxF8Wca~b6Zc^n7+lj98=4U!V=K$3p-oNv{j znc~GTXz8gyS1OU9$vWr)pa0Fti4H`55ON^O?6W4}#&S2(>O>W|+%NT zP{1d=`j8)qJo&>-hAQiL+|;Xqw0s(4(h|g%hFRlGeEfXjcqA0*;*MS^jI_ra_N(% z;5gB!V~f&eUV|F9F`rL&>DVDxrk{I}Mu^R_bN_Q{5Z;?PbLg{04 z#Hq9Lv8<-p;}=$WUB*x)fzll4m$A__3wq_0n7v6pBV?3CLzA@HF~Gm!^h!4q;y{>! zqgaKbm-1G=4M(=xe#6*9V z+c1XAt?|5J3N6Ps3Zu4KcRHE*c5P{&)dN!Xom%x?|HLg_ka%wR*cPfPL3 z%A(gD=fBEp@EKOFO3d33z`4wYv2#)H14^l>3iTC=Q#>&Z%2aENXyje*R}LEU8{6x{ zvIBgronZdtNvR>jsJh57oX7X+NzyxobIUYeg08OJ|9PT}mNWi&_WxZXT>!oRlY|do zvhV~*5%z#op%tiOkTZhtQ>r|HuzkYe#97jIFNeQp>6ahd67%##O!GIaYM+mSa z+&5E}4S8+=;NKD0NSKRgMM4*ZBNDDe$RS}V^CkmUA{vk|9C3Suzo{~SxI99#V&t}} z@(#qq5t<;1jj&ynqYy{N@iw0-uYZh~FT(E-%_Bn%-5VJ?JERGEw@6~YWvh7p%Sco4xSgeiz5A#7CT zIK+w&4ydv-qCN<#RT)5t2jOKza}cr+ok2LN$`GP52zMgVf^Y-k5%~NK5oSQxga`t{ z3PcJJx*`UE@D&{W3Ae$CpU?#U`Ghg>y(c^hzk2r58?N(&6u7Vx2C4Ekc&rm9!8@Ih z3kP&UH9XDJKSjr&%#xf@D4m;347u9 zN+^a~E8%6hvJ(CRH&w!0@IK{yZin|L%LZ`HB;=^F8@w$Ex4`?6utb%GaCaoshaV$h zAUqe@{s5d33BBN9NLU2-KEf4nqa%EYl6VizkYy{l!4WF!HWy_FII|J*;HyTsZ-y)n zi~W(iK$4&dDWXR1Q3A2{pV}Fyoq_+qGl2acXV#khKHELhKJZ&OB6I)vEqsOv zn^l<%XJA4*xatz_QRNJH%)VT z?H9qTlkmAJFN23Ap-`2_;897u)^JuNgjD&4DsO<-AYrO1x2tk8+yn`I;p0c>44*v0 zSoqu#o`Rbk`<)Hl`6Z!mx55P%0uv%AlwVL2;z@{I|R#X;q$=q6Sy}JTEjDe@V+Xu z;e9~334R8ImhdAWyaHDN!YKFz5az<_&wf&1948D{<-4jptIDA;f)o0~DovQJ$}X@B z6K1J03)bL&M(Bdq*^aMNs0-^wstc2#@~N&)!M{0}uUX0eDb$5)KIu?JR-y3A!BeP8 z8+YdRDV*}Gq{pXHbm_CY;$D)xZBKr8FI932ihh_zk~+F%*mSDQZhGd0>D(eNU-;E@ zlK87vPnbc{K4VDhnS7P6j&3lEqSWghkIgb5!o4{C{y9`R4$1h%T&l*FG=6p-Ma0wh zcb?xAB37Hyjq|CBeC68%^SOl-H2GmZMb*@;0~V6>e~^3QBC4XE{AT1Ls^SJdw)K9h z7B322vzV%qyV{<9fTTO)^*5JL1y|gD&l0Ly&YOE=2~{wSjX{r6WZUxmj-_1M8&|%y zlp=1+C;z&Ps={6CzF0;TUEYV)%P30zZ1&{k6bZjR_~r^OjZ@FPwSp?U728g)AW1JB z_1BeL!VT7cwvwuut>0unMwQH;8thn2Rb0uc4_8xFb;Gpbf2K&h>&Z!LxV3eNgqxtc#0~zH|k7&ilqGW^aW3GtNHzcN1mcebz(u* z)7+99XRdpis>BvO`mE;?Zk_SWdVczwM{Qb9QUCW}`8RM&JpTM`&+rpHd+Svjx%H3Q z)9E>?&SuV8{Tx5VRhi|_a|^Bi$+73TrG)40-bB^hYtycNfg=9#Tl&1ft?|LT9(jRV z)TEWUFH#kFsMX;YbLZ4E-u%n=FLEp2)_VJ9ZoRwymi-D<3(vlN@)d4%ue7>u3sqLP zzWnH`6z#7XQ2ZKI6VujDe~l{HN0%LWjVjq$Nqt}Emb|N9;pr@pE3%1?L zE%ofG7v3NVSpUh%H-;cf)(_7u+(s2zgY_?MBMG_m;@xjjrF>#@(;Y*Rl&kXPnL8-L zPx^V`TVxe39QV?@WC^=n^wzs1c|}L+zt1gu>A~z>WM!VeaP=;dmX~kYw~H#@iStT! zQzdx*{S$VRWQ?28Xb)9@^FFw84@qLDHEZ_V3@?wo2CwX)YOl@QvJa_hU%ch?hg6X- z-*IRkxBN{-Z9byvWW~$lKB9`HxS;T3s`v^&dg~LaKBj#A?574;lmR&__ESY)e|3+~ zNQy_@^~7gXVOF;|_8Cce_f}~KsG9lX8-F-J61nU6^9QJU?RQE4gAI{-Wy8}W4^q`| zLDE+T$-=!h|Ao(~0=}=J@gb^svfH0JOqOEyn-h*ur8;K!(IZsJbQrSh3#w|@p(Ocx ze(0_*s6x7bP5Yx%9o_ar=qOd)4Ssz1C|SS1j@tDVRU&z7`W`EU7tEUDbBSo{nl|cNvTpZJTJ|kfMRl^8d`H$UyYExqacddSrRW4zp2t=`ae}Jx?x)tDplbT6 zMem&;i~8BqYkr{WJte#Ek0j-N7kqz`rir|IIj5*!voPd%P^}U(t1~;(}P;wL5IV)Xk9xN}$@7*Z>4dsus(~V0|J~1cVxD@5;x#@-v z<)2ah9OYP}k+HPvcb8Jd-)zBot;zEK@{Vq;sY-t0+Y_zNL-w7|J7l&YOa9YUGcTj6 zd{63z%c#0;Iih<HTlIQ583+Q_pK?(l~ndnoO#e zns#_3lPb3Iqb1#Gs=4FXg}CV^GJi_Xr3$|FmfJ_r)biNtb?b5Gr zp{Z-q!%3s5dLO%b_N_FjEdFM}tu#fs?fPQHFav4RTnFHP~qX^XF(0`ZF6wvbY(jZlqE7!ajr0M3t zqRMib%9`Iu;wMthXkf?jt}Wk*&1LY1vxb@Mey zHwF!FFI1fGkN9H}S+6O%Ym>-g^{F_OLgi$gpI??rlUrU+k5sBYtJ2F;X_~tAl@)dW zgmC`HTjiwDgt)PJZW>wH+0zQ^QT4g^)}{3*dbT^gw?0MHtw*kIKoiu&=lVCGiukqv z%4tAT;hM*M=`{WP_`;%ein3RfW;UXUYQs${8_}dS`PoYv(-in}w;hca!29mS2QF?x zlh^*+`!=Bo?ETU)O{f}PHK4EwO;OdCZ)if6`2ycH=TUWBv}M706xBv{t>28I-OdN^ zZ$?q=>qcvvQI-Aht-G78ngKDg|6iKZgf;WkJ}qdv`QW_)Ehs{6d}K~bnlLNIeBF|! zrR{TWzknvF{AtTCplEz#+mo$mD(iaf)2(O<-Fx?@3u#ijYW^R7mJN@vXKy|7GpdR^ z|GD%Mnu-#oC;i{QqYYW;MCr=;RR=nfRo`n2%AjcMrZX+)?&?I5B2jvC@U_pbq$rRm z-AOs}WF}emc=YG`_fvXM6#kDP7xkbh6OA5S+j#vA6rnX;3iX}ai=v9APxY>E+n1uj z{}!FvoAz-oMJzYHTJr1Q%@l>A(XH`sUU4f$tN$(fRWYvpSgI;U{PnZ36xE{9vnD+T z7g4l3^X%k1sPZ^h`qpmTMM0`GdN+SGNKq^vy?dzhyW^X}e5~YJ}+jpN#mC%{eVZYU?6_B)AsGWiT*E4V;4NQc=-JfMG)XqTd4Ajm*?F`h; zKT@7TVh z@f+X{V}lZy51?o<>L&A7GIVv92v^&I_$9OlybP$Wt~SP0Z-!+v#g{h5NNe6S#n*5d zuH%yU$NZy9Dohvn-|AZMB*{%17|_t*Hmtjt|0t-cs={CRpQTmc&nhDu*Rr#52VQ4s w;GgU&F`UhtHygZyANB%Qs*NgKs}fbfMIZPV&2XU>YGn13u3xb+9a^(B-CAu-R~yMdvLJct!3QS&$>QXl+&uBZMs4S= zNxN-jy)jX5R3>Zn@g?a~&OZC>CF!ZBoN~%wa!~Tfgg%y@HhAXJty@|5goN>x2 z^z`s#MWcR2v$|qxa%BW`GI$zp+Yf+`i6rg5g1Z_U}l(-nXM)%im+o zdOsq+Wmo-*bh4iRdp_SD)&DwrKdnDGF7$qIa!A&}!3z#a9+qqyV%aO#tQ}mrXaaF`+S>Xn-}ZCicuw&b|Q z{mIoUw_Ut>>sO!whbi%|7zcLcS}ES zefHLEt2csyB)NLq<}K@2CU+d5uiG}bXTSL0+;rjk%^QZ2UmV9!+s95xwm!waJSACh zCP4k&-|rysI|%%SAn>|>>`PurGa(>>pugwQmeM5MFXQtmwEk=SP5P04C%W)C+9P1u zm6h6+Ncn2Isj<4KGCREC-*dJCianA&*mZZsL|BHB3hcZwkNFw zF@5{(e6;$KnfvG0E1kTGHcHdXE@HO6v*xrQxxJN5X^RG^Z>Q@N-BfSTdu^QAjoC;`(rRQ;c{@cF1Y-Ziw^B%wa2d#nR#$yj+X#RHdah(IV z{+T8Yb$q>%b^%SZehv2;5j<_cQH6+r-|fN^_-)a`5+Z0<`MJ7Zmafm&mNx6#8&wd% z{gah+Xk@H5UTaQD;ZIjIi|5j`9u0I7-_zq;AIfmrr*CcnX(z=z7*k-xA=dh64~OS1 zNU%|uMcP7bF}Tre5szc_k=l;ha7AR*gFu#~(-|R-)OOY;c>w&5*T<@2CY}Tyl>$6c zk(YRDde0~{)*MV1t*kWbkjG^8GDo4~upR#eDpZdvM{8AxML!G3jryp4-wK$kW0fVw z3XMHEGfY;-w%;|D*8NoK>8^TnQcufT6KQLDB|W9%%!4K0H99qF><`KZ1uU_p*gz=! z3IKd4*+AnwmL^0Uf$iZ*=5*o8vq5V?Ael{qbv4Ke%D-cCE$u zuOJ5IK4d`-wT;Pe*U&DaX+5uESg%q3JR3G+`_;{f>M%V2f+-|fL3C&0t(2WjuT2|hZ*uXVfG0x6!gln|S)r_@YT=Q1uc?M0B{RwT1uj#v569tm1wf^DR9V9oiclUi; zUR(0>u60Mgvg7BL*#{aZ?ZQm%(uLKAm%}DB`SBc@95pTRSg6x8+0mL|CzD;Uew9cc zBIS`c(axi3VIpk(mQJ@`S6JM)?tH;H9n+oJ`_ywD{&$@}n;oSkT+lRCG10j9%Gy{Z zwP9<`iTe0G)78;@1{%=cY;rc9-fk{lOw*#)<1ZRtUK{ZxlGiSLnu`yA*n`BEXdfr* zS6}Iwd~sk^fk%-}bjQ!FS@~4+ehf`>{y1$3-%)y}mh)q-Ez*qOcwigtNSfv>()OBeNr5xJ`4<}( z^qyeeJAIAOo<`H8UQD0HPiHO2^&DUA!rff_)zEzSDOTMpD#MpgO=z$cG)-Rpoy2#n z-0QV~2cq6ON222s5DLHUbCZ9<^30h1)j&2{sa9)N(;7A+TFfc%hS{7^43A4=by=I8 zqYkDQl>LmSGd^i{=8DSrFjgxLWJTT$UmRf4`Z(X4gbXWqLRVGCDV z4!UdbpfhXpUIx?6C6h`gs*SN4Re$3+eF@Ki4fzD}8wExWm-W+@NC9%!V?7;sRcR% z#H`Lp$i5j3Y1-p72^g(w1uVLl@9DAL`R>1+IcJpqAh_RuMejRk0+0m41sd(D*0;n~ z!To;yO*dWGA%tf3{@MHYF7Noc6${U;wXr1`2;>^VYGM6u^^zl6G=C{Z(LM-Z9Ks6x z+Vhzi9(opS1=GF;L1e-%_VqFL?Lz;`Bzf4H`3SpGN8jmEaa~x$bqpZ$MS#;FUIM-^ zlSvPTfu98$I>%?|2JKv$05HiE7V$kzTd&HdkP*wQ#(r)G;9Iua4q9@x5FFBie@J^M z4TOJVHMi5WvO8BLq(fNUOzRBK!Y(>=!5u^W9dtOe_uX$>_|eXvGhdXRL~`2*rNP|d zR~Iip6*NP<0IrrS@>WzeSc_g-=5)JSPxI6sXoJAvShd!Of$4hb^p==_dGbguXOJ=_ zk&{ddLH0z%fVT>QN#tDk6@NIoqho2UnDaXNg+h~~XoBM9^y^7ASQ`qnWuSq+eIPUt zIuE{;b_Pw85;KkQy~9g7f9CaX?wHuj-q&vZ`t>D0-#dQ#DIGs|EQ4`0R377V|H{3j z5Q?aBL5U+RufYsW9&8)Pjh}^F)P?WS{%iew>X$#^T8^4AOrf{?v(2&I@OeGb+R(y zH5TM+8oe@FyUJ`5GXR1h4lEK`PD{KgA|GPu=&mZ(z;w+tb2Ih*VkkK^M{IPsW;&EG z^>DT6?1QXxWmg;3%BVQ%KWSf}3AkTd=P;U{*?O5R-3OmdX*<>J$R#yRi0L9lZ4(#Y z+ALB{f;hhaJxmgFB8qn^G(B2XbevUT)ig28Bo^&7!-T~E_COX|fH$GU zG8jlMrs!<~Sv8|XS_+*;2p>#YFlbJWrU~DVggU+6f0`)ksN@Z|{k(NRi2udv>HNr! zR6PBkXm6tlb|P|^AxST8tu^>PD!J+B`~Kq<_a2W8v3us97bbmA`|hDv^trE}z4fk- z_U(26O%y0~B=20r$jwOU(BPfjBI78(LB^24-|l3?!?QeS27=NrUW9h*lO-h+Gzmw6 z>T)!oar-p~v}LV%aeG6w$`U7QIbx^iPKs7ARhOReb46WMKlNr*TjnL7wlc$cV=c^aN^suUl{ zfaky9gJ`5Nc^S2l8af(R!p2Y%OGY;F*gnbpiMlJA>85Qkv^V?-rg?{npNY8PI0PRl zOo;^;lB- z_LVf5F9^!lPS8&ckj&1YloLTuA~2%y=#7a?B_dvc7l&yl9cpqurE-Y3MS}h zyAaIMEt#wcaq1CnIG(1pN?Jcd4{T^{ir0I`3t!O|t<%(Xw}f)$#`B~mkvo&^>mTHX zD`;34w)pqAy!zM}sgHxWs0)j)1?@M^Uw!zctBR~qsa@qs`bv6*er(d}*=rFC$3Kvm znb#uagEHQ)Xy2h}MaSbf8}X*CcN$x_8jxNi2uN%l`L9CTtNDz5Z)e4SC7KH3cHO|$Lr+d6_=7p z^iJ9?ngISy7C*%I^!(PH5p7`)`Ral`DhoR7OFhu2*Cz)nJDLe5qLn>($&Vy!prXio zFf5C&kbt(xQFDsOmkiHENqVv#Tr48!8hm4ny|h=+grWCe=V~L;%UUM|;cH%6*O_*o z^>B4`v}4+1O4KtUD}AYK$Ahq-ou8{f4-geK3}7zC>D+xMH>WBD?pS|i5G9vbafu65 zByE=#r>yKneWaskLc@|9GW9~KMoV%n#N@8aV_X)K<5BDqUoilUTt?MN?rC?LiJiW7 zRJDLQajKz=pp6y>v#}T`Pm~yKcMjGiJU|eoWPr=|U=<-AYeYtu$ZXF2GblW>sB^p1 z6q7N&gC|9)>3lWVq4AWOdMFKt%><+o08>nfUn@-e1rp2XmR zxhHWj7j@y3mr`MN>wHu}Fe5p*At(H8V4$tPex zt>*OI&gV=oX}u`UqU?RzCtuaKd+)b5EIn@b-izP(v+sZrxr=*$@7p*2Wo8*il>s4Fi#bCu z!cr66Cuc0Dtk2z47g4*W{w!wivLa6PErXepwxK}w(3Gl3;9NKw5zIX<=ARLQzEE#C zSO zw_b|+2u=_fr;-sUo7q@IiV`DJcw^N284P5KdplZ7iJ=%&{}Nm{ltXoVq_PxZk(V-u zr`r}`LO*jRMsO~bGg4}1#LWKM7~aODf<58)c#eg6we@V;oOv~>6QfrC))mL8a$I<9 zQ3a-3h?PCmw%4d`t8mq*c1Nv}{lITgUF2Z83ROa1DwOmYuU-?BwC91E;z~GrzQV#> z#;Dhn%>e=nJu8xz-3Xd0)Fn>eB`U|go}!YD3cT3&9LJH4@u(_5R{?~^X;gR0){-wb zQT2(u!g2%;cyfDSGvkWE6mj!8no1lbYPR2!Y5Nm`J>xTQ54pC_B~uiZH=n$>EMe;7 zG-*w7%C}g;L#s9A9>`)9u-3gi^MWk89K61NU);BFF1pb#x-^9r=dA}BuSPqOrWL-Q zaeda|La(izJNTtN!*|Xya1>C&lxZ*7WPqz_a_zJ@sZ#Iey~Gb>)xHNF^p`K_Jx=c0 z&1aEyKeiV52F5l$Pf#^00z8Bpbm6d9B+1Ut@2{Q@QcnR&QI3|W9=(RQc)^3F;lp5z z^KKfZovq*_jAxXZwhlCAo886Bd8FOUEn}20u6cDq=9h*}to~e8xuN)5^!+&W&nK}% z1eYItCQ1H)-_n~}H<%p~%3TYN4jQT8qs^GRrgiFh!B|_ju5&-zSEt12clG#mjWA&) zc#okHqFG1WQ?ekbhz@TC;x&EXi;wM!EEzNAL+ny+s+=BEWr&ce=9F3Cl-fsy_L@?X zZgh47p*Y~$n3|+qqM7ch5!BLrhWQ8LlkjGB@?M-pLWMrkCxZuD$Mx*XG3t$-m2uKD zRA~Ff_z`LolrF2%B9qU<_fFK%Eo1d*V(B<~*bSuO>01VbRHP!aQWKF|9nV7@dlnY# zip8NkgqE3{Qan;s@aByBDbabh8uQ-+SQq7v6qVYQ@m-q7F1ERHi2D4JEp`s5rH+ z@vv+;6RR8}dXm$fU<8aJD9vli-*h` z{1hWyMiZDMSufx_RVKE{CFr%a|J46)9b$iG@A|$+jd%Rq@`$Dv%+y(`OyXs0+$0JO zcGn;AQwm_Npb1dlXZof&;$Y#ST-1e)Uw~l0G9S%xelR+t(B1jO3pFGeJcE{c_1fb$ zk^TeG9^J-cD8&c=jHZPg^TkYourVi$Sz1ei<*X9B*m|D!DG?ak#Xds}X;3}|c@YJ0 z2!SBT5Vn(+zkw0)5~dnWz93(GcjoR`Oa{lMXXsEiFCsiV2xE)PZ|_Tz37SCo(Jy7r z&K`?56}B=Bg(o%SUFfUe9BMW$ydo1>d1HA#CSUV>4EKyyYZC6d9hKlf;G@1K6OsP4 z?Nha-qevA~G29h;8^yb$(?tdi+oY8TQKeN40*f))<4INst=nFkw2HxAyL+4zyD2hX zF^88`9W?>V&utzGlXT82VsN~o6mM4WMp2>5&=bfs=ledcmM+SrdBYm!l}vdBIJuN2 zI$L)~CObd%8;%3^B--CZDA0LzC>cK!$W|WwgA^6)wY>3+Ct;JI4a6cJ0v!*nHuwM| zK9?rMOIrHa;Kw9qf;RZX&$s=3so38;_U1-sF;S~SA=ug#YUmUj5)Ar_HNh;m-@xtL zXadf^FlEyK{Rij1!(m+1g~_iXNC*1nQ2-FEX916kjEsL zcQz^nS+J3bPasnjAv9pR+UB82_BvqV>1l{Pi&5p}o04iJZmRh-O=_%Nm4T1GnAzwJ zMafH(sZOLjCDlw^NM6jL0RQ;Tg;(k22MX9vt9qWxvv=`lU+ic zVF%M~lzB}w_9(oG1GI55OEBGodZV3>Evr=cum2oo6^Z&FZB;7WS8nL}1U6{mcN zb}LO3_t_QEN2M{m%w7lEKDJ`aq%lwrxn%+Zm};B z3Vkw76nfb=J+BBcx81dE-pU@egOL`f#oA;qJWPk zeaWf(mY&*rQc&3MX&rt2x;CD7<@DnC9aH0uNpewB&U=_4T#y|{%o20y9!yBHw+L!- z!P`w4Hw&|xjU=LYBU?K=nb~`Q3y9O}b|Yx%jX?@-wRZvM5O;W_IzddD|6ovL#C-@L zvvfi)AlMir&bqlolDZ-k~FkcX5K{&f3@GPLai}q2P7Vy@-zTi7H zjj0~mJSeN%lSby=glZ;3QH(d{Gx}9!UjWA($tBMi53;~<+G<;DU-Iz&zK7Vd_-jUb zAx$9N!)V^J_+?~SwEB|0fApXK_^S@%VrK7o3yy4d{LKBzh0rM^mX}3J4paCxJM-9s zB~PLSx@dbGTA~zV6@jltJCP>Por_sf8kqf~Uw-({yUbgoGwZD(2vg2=+;lT-15Hqq z{o(_&VV|f4X3u}o^m}@bLtr-3PaZ3YINjGLtZQ)eld^LP4y0*&d}M9P4>^LY7Hv9oe`#t*6nbkKtN~?Jynf zfEzpU#SaziTO7BTuk%A<{C3R_epuO6Du`Rx(~hQzQ;$0&6VYxvL_gahW=7_=Az~w) zq%>jd1$4Aj|30y`T(bUA{WsB1z9Zs(E@jh_T^O%Py^Qj(>Si^gzo#ha7k_bLX-M%yC8?;{Ydc~qn_7n^ zpntP=&f-(6J?k*9`W3!)hqT;(|KVKJcU^qu!}^l$-7U+v)~U|1?SLk&<`9}zHcDSI zvC`vOkJ9S;lbcvgYhl=Ilc;E!>))omofgJ6I$G4)XeN7-v<|dq_H z<^g_GDZs;qJ~>FY(8A~*;*aSK@$5{ro^Up47Vd!2=Lfvt^ef^pPA?*J(n=x}$u6a{ zm(aA*p9407tM>5-mil`*7xk%&pI}3JFFIafd(g5w8q0b1D4OtbI?sAg+D^_6+I1V) z@`rhDH*J^}#y+0!>El~p6e=7UI|AOCnGezwek+_Qg^;BchYuHoxZN3v6{xa8c{K19 zHBt~9Oc_B*Az)2ji#Tq%htgFTXbbxeN!DC@aPkN)>cTa&FRv(rl3=Gh^chZNU6!t$ zs)fx|1ZgykQnR{8J$YOI`C4yhCM^S1hk$DDmoBNTNWRCXrf}m>Uve_v(jP_nF8trZ1^JB3IoMfv!G?!N(s6Zrm6 z9U1do`rb$rxJ479=5%lCt-@x=9sK%#pY`4jKXqpBnTrk|>iD?@V)p*+Hi-V_g8!6=*l+HCYNV6ne!80ImU0>Z#JhM3h4E#uIA@-D^{swUR-C9mgu zy5L%pu&tbPp0N0hw{$SV%-*AZ_@7%!e!lClzRn{9XZ9ZY?ayCRa`%7TS@LtsCUtXpJY8rWtJh{-oF#nv zF2=_`d1=m#qTisW=^$1KY%^(897uWcKY!Cpd> zhR{;}kU`D(Iu+`d!KJ@Pa#5eUxMqE)EVV90NEkA~ji{&V=60BSS%+)!Kn^;k=QXq=X`1gX0K_1+6m$Je z*Y+n*9~ej;#YJ7XllHFbfm#_Ush7vm1XA7TdE-pYzSGVs?SiNOh4uxShWqrnSKN#X2x;K$JCe-Q5q_ov8-vr@QQPfV^#k?O%Q$c#y&e9l}Hd z`HCs+!9m|g+b=??5(b2ndnnK~MGr8Xm6}UE9qCp8Wbe78iCw3jV8v#(_RE`R!P$=@ z4_8u2KsDY^VJ1#7^BT6zC?}gyO=+@O8B0iO7O;9n5C}Jr=N@b;E!xCNrq0@?je3o0 zBNCE(ype7qDLW?O(K)aTK_e7YIAfJ zltN5or67aG7H!oABdt56>SJZ6ZDXqo)ftP867It+%okMI>2p^3PYw#1!4Qfk3}8Z~ zL-LYzClF+tmqLbO@hrb@x!^d>pBG?^ho`f1EL=@_s4b|C+-)1jEX^_tS_TW%0dp({ zke~`Dbyz-yIuYhySbT}K6i6MSYU2(b&VGs{050*Yowm_&OvO2iwsj8;OO}bkq;q_& zk2l6MGC(NyB55*JxVG97l}T{Y{yA>M;~WPL1+O1SlK%}=Ys?Q`*JmfMrGL?SKd18a zl%YMhQ|?`N_jkXyd+%%h;iQ-B-h1vdZk*Y@_Zx3s@s%>lFN)Wq5ex&Yw49UMdhI3+ zdS~B1iD(P^wpK}mcI=;Qzaf^?p%?-Zjc3>Kh*;vcasMPDotln$Y@bYZ7G^V;2VUr! zvXL+-71or>&J>>43dA-4j665|FM%r&DYAswTCraG7 z8naY(E6JG1iBf_@ew5`XEE(gWZZm|j(dLPQ`+8J!k#*}+9oxm%&P!1@&w0z$*A-G7 znH$s*DNL8T5M&sOzLVv&BWRlE-F~k9|8fZD5fRLO+&no=NIukO3zCQ#S@uvwL5XvtbWb8b{e zrmhP2vX#OP8EHnlikVEF)xq~rMPk9gsBaenU8OD7t0K9crwhO1V9DdyB3EUcM>j=Xz_UN4eV!&PKj-EQ)BLN|l?^-k3Ctl+ zuZ#WAKD22UZ$FU9jg;k*?C69gX}K~K)knu8q#Aa6`vDGQxBMyDnYE`lj&zG)^=j7Y z;bpp|E4*}?G0*IT8=grMjDAJr!es5yt!rlC2&bRTQ0jTSxaTmOPYP5h8$m@+wtOF29};MPG?~Qm~o~Z3$7hqIABxk78N^~w+@H59~q8> z;#X-FcZ(JE2d|5c1MQ2X&!rtl6MEL(lA*|6J=1|A9~dt2XXxSCAnPeKA?uG{o*`_w z6JhgrGd+;IkDq(27QdNGfjQD4ii5f!mDd?g>t_DvYzA3I3#;vLCU(dsfiH z9qJMYt83iDK{-}RrE}G)*U}_wwc@{LvWxki9@}zRg1MjMdI%KxNgmaDWf5*rH#=G{ zwl&*Hu33D4pR7}NimO8P{yh>*NlU<$h`0V}%6w+tm z<$r>%KqISIu~gZY`fZZmWYYIoW_88qvS9ZUEu;|Y2fS5o z^SjG(?-ffsnjPVTUD_rw>|U34vMfIKA2pm$rlZ-+z^LRkE@E!BV_~rG9IbC>0}+B1 z)FD+an_^>x{+Y3Z0&3aW1dF(Mn#f(8nkDX?hG)|Ct&t?5-2lI6K;Xr;#(XLo5l zj&8*yMVXk57GgFW{iiA@nKyKjO(l0hcGR%#y-gjIpvJ?bpXMNjXf$T;H-fOQa*PWo zA=b@E?i3xO{idUMI6G>g%`pfQMm6Ox-iU5z>U1$#qxv~IE1+#!x=BYBnT^hULILJI z(8Vz1*xOXI+OcQ2HtIkTue+_QSTt+j@F-^K1a+Buy`4%+0ukwAtj@`59O~&Y-6Prb19kbP!i`-%jl}qQ*ef?{^XD#nIGf za}N11ILgjoiY1LLEccO-LlMCjcrT^`D{>EhYyPx31M)#JB&-BeJkblpgNci01#f=} zDy~iHD3jQ+q&ks*+a7aqHXM^3ajdfU%BZ0dcov0d+tTFz9|Fz%HCj!w?xSDov)aRS zdFxLHBs;^gFAMXNI9mtV7E((zr3sVmE|vXhSfqz`Xzl6F#vYwwB?nyd3gvx^)?To_ zx!6P__i44-s}R|_CRMY@yfbqp0lKOKIcvN~i!s=sXB6N~y@>2xH%pA`5l0Op5;>sw zZ?RN~=AlkJNoD4=9X#qwyZl}^#Uo6dSQVI(m(j3dm_=O8jKGLgs_6xr)?d8XbW+>I zrSAZon=~;;37ocB2iURd4!TFI>v3WzjVbT?Wum~YE@G2NJ1z1%KgJQP(t01zw~Q~@XI z%)t{f>_C6P*^<`G9C%;f2fd8p+(Wib#X_cS0}10A%)O~a#^bFtv6>7XE58_Qxt+Vc zHyLg+)i7$h+`>nk_9H`~U?#P3xCt*O*9*eRJ(CNKTsDPWhbnmnMY({Nl93fH4_xH& zq_22;?rLb}9j!x>=U;!Yy(Ux_E~9<$tLy_anWy;MDw9ZVvg$@5= zbn`|iY&%U8_}SO{Y_~_cs`UkvOu;6{(Ba?q|AiL@#Kn!-Jm+29>yY9~a}lFnt@yKY zLi`q(vR@}uQs#p#!LknVzV3Mdb_`mr235mMXzp?W*HBDaA^e+|CAySs-;B*WI3&KWszJNOo4xfO( z9Te`r|FPVp@4EQ8KHyMDhl}pxfb%Bqmax&FpQ3rVn6T-DOV6(8WdZZ}dp^V1C-9xE z7=LAS7z65p_TyE9CYA{ql&z9ayPV+`%w6mQYyo$;2gxTpa8^qi-c_MAKwsj6RH|0@ zPzfTi15AF8|`gw#P)f5Ury7=LN{=|$a zpLL1)l4y7WO*lNCTRmo$l~Qb%K6qS)=`(0yG>?)OoA{4WQV5=NoFJ|d{)WU^*r4re zf_xyxJdr8Y8<_+L8|MGJQ&?2Ahofn)Fwo&5mI|_c#d@cJ9V%@0V8AO*-I&!onL_3S z|JpdVt9N$w9JPNg>*1fxP5|bbD{@33n6MwNO{l7_nL1;V6N&vs9YQnN(0n6s->kLe z3}VjcmA8oR6V7GrA4(IR?ggdBl<$dfE`v=t*Tsw=potU)InUhV`PiO# z<~bfYlM#-fgH=ZsI=&&cY`d4*@9Z78Nlc8w}!TX5jB$%z`szmp2 zaHaDR+V8|j=PV_+-8nnSS6yLYgk8&d-^N4#2=UI)wAMEs+Hd<&(^s_)7!V6=>%ZPk zQdmgv??BsBeX!Y#?*G}B?SAa>|IQH)Z*$(_tJjDYt3-bCuJqJ1&h%@|-AErslgHsB zDCri$5@tc^@G4)Hoq)6a@*?*rAF&w*tT3J*d%J4>*a^TJ3KUQo zsY$Qfdi@PosZ2c{AUY!=_rb~rsj!wXOy#QC#;Hx)F6jH9#J{GA62%vm22ERUbJW;B zGm<+3ci>!NVPJb;X{b~HXB6LtFpkA;v2qB!3vjYoF`~F)#N|&}HCi?QwT=GD32?LD zlV9PJI-m@tRxjJcS}-5!R|p2y6`ixw$h@K6UZQhxZm4IYp+6-1!WtOV$Ia#fqvwoF@35LuX!48OFLvmm)%B|Bg%Ue`&bS};={fCv{(%w%8T`h)3xOxOsSCI$I0cBMhIC= z6G>CN3JMFl82&Ubvh8RTVPlwfDoyaY31AyGHbesa7%mDMx>z6TjSZq|em6iRy3uc8GCJpz z#L4rYYLy|hg z-P=h3ud_Z@k=q&a0X-jgP!IHx5kxzscmips4*`8AO<)zszYC)nCtU)}#Xb5vmW%q- z#jmdD%}MJmZ`LqvYxN2chm&uY)5{Rec#&SbP@5?gY7gKA?hJ7=ZG;vk?0tzZYpB@U zk0Mn8Wl#o|kxrGQ*fYFDK6m+iKEv4(jtv5v`as{Ujt-_u2{ zzDQX(yUekaR~djny3%yE=LVxHljT0(EHP$G(@usNeRiS8(t~o$xSWO{H_@~>0m@P} zN4MUX3FD0QH^ZeCL79CP+9>6sGA756(#7}h)yIb^=O9KOow(yHW`*+m1SWRV5=M0t|jhTi=CqNGO#DW89p7xQ^M#|wfGvkH4>sSxs26xt8l zsO~`gYq3zPP701!Rv6NqC3H0;aUMu zx}OV4E3x)=T9}R}>5aWf+9Lv*%;b9)G&r&?rBdbUOFEK86*|MZ%m#1@8}oKH6kNt~ zWOfP!R{~)Z&&Nb4crq7-0$n_LU2ha@RWMn0cbN=1gN_uy6CU3~^8i0eLZTy-V?A-R zJkv{PVRSERKhiF1GwA^^u=8tX^s`C3GE8*`mUo8?@hnlX5GHIKCgiE~xBm#N=Q3%nP%Hff zkTg&~`49(Qfmr^AK6UYtGrd8bsWaQ&7;;lW&}rvpfGp2Vg-4x{%a|WPrCvLbD*S9`swQHgBAF^?+3;7RmjvfO>&?>#>XcxVVle8X$VxC6k_Td{WD%Ai zIADufk(1NMx-mVhPgVgPX!y?58v&?g~(s3y1JxHm}6IOBbB&W=EE=++)gpUFR z#c!NicB>|l^514}AmoeDmQ__S*2XDHlS5D#LZ*bPZ6|%<_f{7Q+@vNc{_L!N=_ew2l!$*R`De zMU8ebbmhR3%~j6bP8AcO;jtk|BZqj?RvD&Xms?lW$L<-gS?I-zx5ulKPV{D-**g;K zl|GmyWIJsCdb5&Vwuenkq7ve`P!g0GI-po{T$Qffh}aWdv&xzN-f|r2oQ4e<52#lx zbRW?tnFGd*UNDSoWi^cO1}htc92KF+PtUO0WtXdS_10tZ1%H_5P(y!!s$`C4Imx3I zBcaO`%CZPmSeNPgn1dC{dFnutdzmmgiFqI+&1B^l)Tu76G(ZV048~SVA5n^s|+T=Oeuc6jd9G%c6~FEC-@(RwW`; zrmKjpo4(1$4s;mAz=Z$v~C^9o*J>2XEC3|UgB}hX;8DOzE@mOn5s?mD|Q@*<0)jL-0Fw zyqJap-HT}F(nK1!LK!vovb)#`X})fLT|N6V$`SP(BY zEA;$Snke#LY2LycFSUw8*XR#}N!Ql__|CPqgILBMKEu>yLs2h6HFb+`<%KoD`Y_Bu zhG9K8kd(G$*^ar+LP9dDCx*~GL@XX&0+NSjgH`Y~1?1-S9>sCqy7+rH z&JV|1L!?=&>yBiR&Ufg3K1iN*Bb|_}>XYB6g}HkqpKRfa2Ls7@jH-NvUBdSP?Gi5~ za51aR-f(B8;s3}xa)4f45Tpq;*MfOt|5rz(A$*B6bnzWG?LTR_MD|7Wwv;9!`yS0x zgPon%=?KsAqDt4LXy7W^Hku}R{!9DAzR7nyhHX=*|ucF_cCJ_7w@JJm20^Rvr@&nswaXu{wr}6AZCTAuit&28z4)XttC;XMm@+w;vPW+({Pv0@`w# zVERvBtHZ`v!bPD|7oU5}{-QHK>EhY+C$G;)<7F8l?G)d6i{(+sYm&ZouHZ&cXintAcw zWU-BWvR!2p)f=QK@*_e7ne8;;bqH{O0u&mKPsBeHUiBxjuTNdPfnB`4%6?X|=dr=D z+oL2$B}eSFxEtxh(KNW+t#)N1E;=Z4*tic?q5Q;OZOZtTAkc zoqdOVv7I3v*^3(U9kdorlRy5}Ojo$9kjV1DkYfeeZF3I&ng>O&K=19#?vXEJfs+vY zi4HPz6A5xXlDbwri&ujila;X4?et3>A0$~NxCm1__@2J5_3uXH7xrI&iw~f51ozBo zjy>#Iyy%2?RMsa4D?6IOovHgZL1ml+q)o@n4a2)a1cX;Ij;4!}lXd%IyfGX!oeczO zb0glZn4%KSm2tX>iTg2ztD~7Slnvr{vT-jZ!ITxbTs_?+sf~hV)*f(MB*&Aqk6t%{ zD`xkdOl-x+a?Br81jl0{X}cstTUtisAQCu?jHPi3MYS2H=%P497r#b$V|GqaaAb>Z zMcF5VuIrz$sb2NDmb+Ans_$F*%`3a|8ak)!#7-ItsbR<7Yog<{bu@MR8JcIL+vdke zaj${Y%UFm5ERubUrU?r)-rV|4;AOPu&;<00KI_RSE((_d6dCE_3qRMJjPxQpoRr|~nu{Hr zcS1Aq5=(rU7ci2@Nf`Muqj^%gRW#6{ZXb+y-o2l}Zl;B$oxpb-`y=O~hGlG;%yYE} zQfD>oCa?-33qQK!Am$ckP~d77=!i?2v=uZ#=cnMpc>cV|pw&J_AxjrO|M~eNE1rY% z1(Z?JFhc!Wdh|%y-VG^44gpI5hYz!KcB|DWFDTLrla*FZk81s8#`ENMI6qcf>3lNX z6>7~F^rfSRfR)zt%rAIQjzpl;q6JD_T=c~U3d-1o9-(K2orR#c(Ypt!y#}#^&Ql0| z4ls@T7i@KEk8G(hdk@>sKeVuIo5d6pSVhw!-v|heTrY@VtolH~SQlUXr3VJ%V2u6& zeX4L=IJ=MLp}RvX?||-HfEzj%Sg)gLfG}aNraqQ|wdGPl4>HxpQ;-=Y?^0{q2h0qp zIz~%?)SniwPhI@;FV6v}?N;*nmD*LoN)}d5p%V|qaw{1q+W8{3-!;=Q6cp2up!O2l z#k4RZ54HF02h{e%ULIy-5t^3qh&w#Mj*S4OIu-#;7r#a8WhiN>&aH@zrSs_F7@EL+ z2|ajdt(b-8$_ycS6wjiC$#}+nYX+-13Pl4{(MWKXONl)cir_T$v%lgYq@(l%75$0c z^r?$Se06pRonLjYXo-CDiI&_~!C(s1buArAONGgK z>iSRyu{rak4MaYy#M$d*O$JL`D;ftn#*uH0EO8ZY3Vgcw{;&52pOxV-1uI20jQx?;&pp|L0s*G6w|lXM6b!~r^j*6%8a z%}w>@zq8_HQ~|fFLbJT!%EeI~ge}i45RcQIP80b&@f)5(w?_>AR4$4_b@7qk>`kFg z{AEU!l^j%f3*U4oB;M&q6RF=whn~x?is%($^_04LKdWAnnUiC&?+XsP1 z?KMYM6lB|fLOdrAi8$7++hF9_QGzqL^h7(d6b;`D?lRC&ta|j$FvN(h$h;64okF}na-=ggbP2>M7 zO_6OXzdxJPb}a5g*+O0(D{a}-i9`quf(1xhlO4>8pnPGL5rKmU$z_uoOVUIEGK1DT z5EQVhOc==mm%?QoidEfF<@}3wc*RD zrds4b*SdFy>~x44u5y0-wzZsA9(wQxip9I=v(oOef^eP-@loT4{E!D{QLtl#;fX`5 z03|vsk|k@ME>6M;aN+DoV)0xGw<>_GgY6W>%mJc(OJnx|OT^u>6H*IVT@180z zNmvvlpF)|%^x)#n45NB@k>AY><*DY}E>z>$gnr=U_QD^!`98FyU}c!~Qhq~DKG#H( ztJ;VK<;n^hPb59iH_(ZT*jYJhm$IDhE16|)k%IS9Vd<_4W62N8a%j<7jCNe@XI8}< zas}@Fbjn(lJt-mO9<qJqn2d`lWjol8O)_@0ka8j349qt3hWMO_NS1{xI`3?BS|Y4qvPrw;B26ZJHDOeFJS8tv}7 zG4l{(o?BFzbeMO%+KDQ+PP&1_J85yLEUCUWHnEqN?SUYsNp7gP&^GqBm7zF#%-BsT z%M+B)f^ilrMBCtLJHAHh(rF>uB|Q8!ST-{FTc9b_>rZZtK6P=;VZF(~Hu#d_ig$Y& zX>X$wNg~nFlMl@>zO7U$`CfW%`lK)I0J@LQFfp&{e$ioDE5#J-v&=LyhRf1EZYQjc zng0)bLFczGB3@voi;cv!d>gr0E|U_|fy%iKYCN_ix59kG+K^T_0xW zqd33RHXZ58s^;e3x@k@YTg_E9ME`?*3JPt5EhQbUjbFzK>b$riEFZz;{ABkL(ax-qV^J zV1ZFkRdWs{I1--?%*v`M%AuvcA1InOcuQpO4RKLm*2Q0}>J8=%!K}T|)qbs_pWmYi zJ$hE@AYNJbWZQk{lY$3Y5F;<1N-luAy?u;$2|*@1^hUDFohE>jt|OWqNn-N{a~EpN zkNw6(_dRLL$gp_^QQehAzDyEg3;ALZMl>4_axR<MPij+V-qABOj|{WL9@+*{6h^^q4G>jsjQ!CaSv>4cLr zc-7MrX`)2ktc+NCeCrt!d7VcmckPC!;AT5fNW;Ei%|JNo>2Hk5!>P$mehy9CtLkvv zy-|gu%)a#Yw-0Ow(#`2Mjo;gC4D2dg;-@*PI15WrfWJgKQGTV zD#Vz*l5=C(M8t#&Gm?-Az7AB_!37bg<`lMg-+~+yS>9J&6#suZAK7Sv{C^@=M_76ce-au%Fsi+ z>6Uz*Ze3N|V|9+%L`oiE5Jj7$%!P!jfuITWzky#4y6$1gMZ4h-F6zR!X;+-bzdHu7 z95 nZYu>Q;I}NYRs?c`ok4Jag)k?({CQ6KR^zl5+>bW?%Pa1kXu@GslBZl?$81 zNmBD3k`iWuhy_0@25dXc+u1H1F9D9Kv)vs${?HTxt}cCDg}vRQgZG?HF{MI?+afq& zFDa5Fs3HMFVsn(XnkHP`4q(j=Il6VT@a5iF({cjJ*uuRH-QLzoBr1w(v4uI`P^?5j zzGZlOeUh+)V%tBUsb*gY6h+<0_w?^tR-NO|7})#bmB${3!1hJQ$O$;~x|zK*j~kgT z`T2)mxpYa#&zkVwKW;w%uS>7o&!7yOr0qtC{jLj}EMb(F+Iq^)u3LiD{Y$s6sd8>~ zgMUxZWEBdGKVf;sQF{lRStQeF6&LlXi_hLXSB{$XcuawEa6@K+mY4Q+U(|)nN_B~v z)%A4aE&S(;0!l3WwzC8we7AQy*VrcK*(;Io`Z1f><(mfVxH-6s7pVU~WB%Kn^Y`7e-& zGSng*k@RA|r)kJg&*d~rjNwtt3p;WObFTYwmd;u z3UHD{5uC$l0_S1$;T_9Ii*Y&%Bs1Z|1KFQO*OTf&CCM9UVMd<2U)RpvL0_UC3ojkm zVbTr1(&~W(s*zw{l&OC~X@sUCM@?ZL&7gEr1f?}x6qI!FUDwVRN+y0oc2hupG+lTg zm1j4D!2UzVmA(t(dRTmKuCU0AgUkUjlOi}K?1NNV$@`>X17%l_Mxd(ERC%H$JaWc^ z>MaX$f|9u`Q0d}%H_jbY?aFOA{TxLTxVO@mhnKy$w}YtKALcnxzI2=B@e!H_-AlTG zt_UGBt)QJ=wiTUg1N#LuP4M*VGF#+b8bp&kFw`-uR#wcx88?5s4tB7YIN07cpI?i; z62$=IahvVeY5K`F`5;XST#LJlvBk;hb6R^f_J#d7h0|oR%}}jFvVdxo9pV}OyU=;J zOVdO`h&^;D5HG0+W`=WmbA{=+3j0aq(>cAA{8wQ+(#B=UVpFo)G1q?uV+mNI4q++1 zy>-7=vU8d=P@U7FHfbS?*axw(I^L}8#FRu9tZp>wiz&>A7V4crgy$kc#}GIfMqG)VN?A3`j4?n&6z zWV%1wb(EGge>)Lqji^e6V6JUE@EHfuqE2 z6#D3-CNMOF1fSr@5yCv|RjLzbkX`EoDQyIH<|*mM6{gG2qa$T!#1gND!c3NbK9c3y z6ea0PtExdn8Rj-wKKhhp&zN5@AL-)Wvta%;V5OE$nPiAEE=H_%$?-ywWUP z>WHA&0ngq@yOgG3o=mbw zUa;C+z{dUaCv^$>mmxEsNz*E{*bV%a?r7c6^`yIKr)%`JWhBOk+5|`TTbLUj5Y z9D8eD{8qt`cgtyqC^iP~c(!7P1{MawTM@at^*UQuCFlx#M1UDkCFMiDfZeCOX^^>b z!w$CE7oO6FLIviaqaPJS}_aXqY~8 zCQ@0Py2vjlMSJN%cySrJ+yYwWmSykXPLnjbWUAS?gnHOZ=&pH*$KeLL<|Ttwj@h%Q zy3uC=_bx9H-pZnQ?f%XTYsh(!qf?x))?U^FtLn9pW-DL-$_z16)VWk`x_9NWOE|P| zB3cE;9-7ttVSnqCdI4#TO3lPMb4}wh&+TF*1`J)kc!8U$HS4 zVm<}1BuwPAK_i@ZQtLJG!bWZ9u1ULpWxau&TbU%svm|}W*=L`{te>&m64oc5G6_{|+>^e{fP+$X)l!{eX%K`_vt1iLkd|R*2YR(Y%|}?0%wTu6NH13R3dfb1shIFknkISpXZ$MO9+@zkxTsa=;+3Bt zNW2Rs|NI;-J%VP76QHmj`vL@w{b3*9+%$D7g?5BB-v~d5r|x-1E0jLt{)xbs!VBog>xIxA?E2y? z@6I6zMNil}Z50EF+&^V+TsB@5$~m|k58;3uaDqN@8bmuU+WMfbD9h%1@6kVQg1=BE zz|$9oV{fd(#7=0*-wmE2QU{|*imNWV%kd{xJ|zJk8&$qOA*LX+p29oIWies7>9l*V z82ykG-{-LLtF_MkDHU21P|Drj98s%4j2sQI%Ew_slQoJ@h%@!KnTz_=#i=jGDhkI( z8$s&LmE0mVCnmn1=DGFMQf|#vT=qPV>P-jhXf{4;aqCrLdx6+QK329#jw}$-lB4c)oF7l^~pZ@YdGCMra=Ly-z zB9+H}DWiogrL-`6cl7jj$U=Ku!W=wl+}njTHi{<%eO!So{vC?YjGbb{V3+0y&tT+P z$iiFjO@O8f>)X%`0`qe4tf$Nxo`rVC!xWQf7J;h}SN|80k}S8!(S-BE?(n2^9B32y z=A_m*)d4}&j3l+onKq(GW4Eab)$95Yf2nc!xlV(`iTu|g{R{S|@iVGc$sQP1Q zOe^0CymTl=`jyuD0U^D|8xYLTjRQk%?r$7l_a)dJciT%65?6RYsMco~KQ9GS8QcvBpP=?xYG)W!arXiuPtQlIh-&;GBC zM5N?{*k2c~{$?lpyNvVsRfXOfPvz!^(X_H%Jm5M1v89UEKf~>hV!V6!3}c+YcWRi~ z{?p=H`N7)-DapGnHM{^|UX7hyi}~Yr(T4Q~smIBt6?VEh_zH#3O+ zvzc7p#zi4U7fP} z(u!WyQW6tT#V>~sk}&n<&LYX;idTX#BiH^&j!5WNb6~YSx?-&lO{16Mqa{q+_>qSXyXvG-zMQVh5%SaPB7b< zQGi8cb1kyd6D+POJLwpj=5-AVGzhGT81_Og3Ie*=JYWGeJ?`x{AUsO&C}vx4=xmAR zvv@$FP~iF&&9Aon7?4?eqocQh4>`4A221%3NZixk6BG)QtM-84O8&l{T%f@%W){?- z%{&CIpIq|D*;9Ifj9*u}C>fj_n@ARiD7@`&2%fE&EciAGC@hlWB$;emzGM~absC(M zm-CfTw^wo^%JBF|g>r$_vJu^Rf-(ohLzY7_V@7w+r5_?P&E`}s$bZV~dASEg@6s<0 zeafPZU}Q)bgj`*|WP&Kz@rrn`)~@kP@sWb>%8v@)pM*$^iVhvf#r{QH6cy>>OAcC) zbkF^s%bh7rw06+KjC_`tO8oBK(8DxTyqOlp6j7p|-)yPQB+}0pNc#B00So4qkVwpt zSHsjQB}F#=WqceL?ITy&esXe+aA3SU*#TS~f;)@#fWnL%fiS2tC)tdE+N6$VMNmsz zHaNCK{{&gg6AKjD4YVEJ2dIu+&MtIM76!yMsyh+J4ZcA{W7VR92aBCk`DD@#Hq zIIa5G1Foq`>NXl*;9n)$W1}(8d1y$xx$-H1;!&r=Oqe!hQZ{~oYlcywg=Gx$+8#S? zJA_Agw4>Cb{4tfq*cT(x|%)IvEY~ zTCPZV$alw1x>t(8oSW=%=hdK<+$&MD=arvk7|S08 z2E;8}LKs0zg{qZAOliWf?mkKXKE7pQtaBGt_kMV+1{RmoH1OGnEeJ)%*BT~^+o)E` z8kE{`UVx6S5(8N*CS+)!GiUX=5(@bq7+hu|dc%|F-6Hg&QhWV(@Kj&|qUKT{VV5g< zB;NlrIJ=jEl+mF}bMaF$m)KY?BPBOETPO5nTP<{w)&q84)&gv8&Jw;_0nqc`oOK;t zNQ((qA`5A5?#CTzE){n3Ke^%L6teJg}`(R~Harc#@1{Xhbbd_O5G!?zNxs37{ zEz`$Z#U`d;g#6uw(AOTc6OF0KCCXGXx3M-==b zjOs2?EGo=0yGWZlwp47y&1uipVyNWfjI2JVh8Eb-eCaz{*I0}vY}$I}hyMG6t?D*Nuo`I4y$?6|;{9{K%Kw;qW*sq@Md|tXW&uGT}N0#v$sgyjb zJew=zwj_^^>L`Ta(4lTaGG-c&%c@c0Qh@(DfKs)5x~XL*3vjY`RPO!53t#`{-b)YF zSS~$GAJ3x6oD%SlUa`PlNCG{bH~rE5d9QN=ain)OaPj9 zTfIZ(9EXxBH|};1%*BUZ&#h8z0^uL9YA?l~rbQps|AyOsK66{^fWSjO*lo$)^YQ%b z4V4h0@&pR3Dt;!=y^m(j_=&9z>gZAZH_^|&gO(k72MoDeVf~DjrKu#2OZ3^Z=}tj+ z%}ct-qGqSG&X2nM!KsIQM_slYOkL$#rlLwaro-pbPNZp`BXn$9kSdDI6xR*9@G08n zb){O+Y8d7JU=4=>aq#t|=BfGWX%ElmYtEhKU5Qrg(l1>;w~sBNG)?TWYZipPzRxb0 zdkdtT95h_4U^po7pd^VXYd?D|@qAeei-`-BFo}Jhv@M9?q7Vg{nNC*5wsV4}lIB)# z+a%$S-Ca`0sOr(I=E>E=h9Jo7_v16Fdm@_l#^AsT>@*!yu`h4bc7>`GISx)kgVQ_QACaEcBP2)#8{0&{ojLvXwRB*s014yBavTUK=ERk0;$_aB;eG*EE;sXs#>iU|8+}{tetgNOo#Ib^F+t@Q# z^je6*s3vI_Ie@qWqXy${-32CTr1Gc5_U;HA0j3+FftnzoMDf1{HJt)# zq;+VZ_+A1^3gZ}>@GGA7(qu&@O-A+|v+0WO$I_&PJsssLd5|3hrdfT64o!-D3@VZn zufI#UNuRoS@VRmd{nN;$x$97cqE+XoIX`}V=JQ{vd3O{o@81ygeh=-_v@ll_--}u# zEn56)QGta~Y#^%S%)*f(b#HuUEZ#u0IFGP&$q<2}&oC*B;@ri^dRUUCimE7~!0X+W z*UIZaye{;XhzpPfxk9h>=m;=Zo8EF5WHq~J%Iyi9F90!yxv>ayI@L#*)5YoYV$99U z@Y+c?Pp1j_-=j(Aq{p?cngw<98iOw1M7xp}W-B#JJo9Hc>YT4K3(^Ak%(_Ha@Sg*( z6+e|ts*;7?0J(*$+O~TL*u%6_X#&9i0hR`Aol_zJ>+gA7)Tb_fWJ4RUi}UD0DBI~l z1-(MmIrQM+JTW_*=hQtttLjCe>M%zS;y-`zK-^_%g5VaKa;I9_K^r{;pLZZL+D(-< zj{But)P;*_t?P3LcCoG0-;-$qwjS{!^;|8c(?$s*rAue@^A{i!L19xkWV4%Jiib0x z4lnG#-K958aTeWX^!4x3oA!p;->~1j6Kp+|ChWf$lg4!6V5@HS&I0c^@4dd7Jl$K? z>1s|4<3;deB%z0EjbYvhKe^X-{Mb?UE;$m?WwMGfKP1^*aMwo%hsjkDp;ZQ2#+vFh zd6On~DS=+)G*qTQKv79(f0Qbr;w{8`v;9(pBQf%#z_>4OVyBuf{AAwW9kG0{C@~I$%h%w3u?1EzVUH{jds_NH(4A7vaFP>}JBniojKgk=dfVEKW>( zIML#N0OXp)%Vsi=f5Mm~1Nrm5__1XHJTLy=ie2c! zV)nxoi)l0G?W0v_mD~^ntGKr+5dEWOlNS%!^xEqu%BXshqLx4<|AR;UC*p=u<6AI zce462n|@9~hY%qU2v0)sd7D0u5RB~GzX*ZKJES5tJ84wkv8hOlW{g;PK6Vy{MyP*K zPSt#yEp2HZ`bt7cg=Tsu%`Bn+g-nq3qrc~KlRkCv$QykPlxI)McVkq#eatI(;L$Wq z@liKqhR-RbhEM0?JlV(a-{&(7c>>?D9X}Y^{myutL(O+6*Uz{~LcvY6qr6w5#jh;7 z3l^FricprX^Zh{NnI+o316ch*jH1_|id?9F_}+;c9(uhkn{TeaNJz!>0^c|=H>CVH zLP~{;LW(Z_*GtQh;xdLSLao3mX#)|ttTrL?!!&P{&VOJ3Dkk#;T9|-G(K)89!To{3 z``v#O#VOW)K(kbF(Ng*BujKJNlQ2N ze{v!8sf!<=S?Rnd z(7<|SSf*%omERnu3PvGWM4~P{!nbv2##uU~FGW?4rD<9Vcl&vtuppneyerLH7r%c? zuXzW(wvs0lkk=H~^OT=v`A(vUMZ@zvDuM9x`?!8=G_^58HsAlB9fP1+bAnrx zrXieRN&f474g!Y#9agty)pl|%Nz-Qv^nd>BgZF~>t7xKbv6U({dAZ*&yOBYw1oxT2 zY?dNcTc{FlPe`-+P>VT|)l<8Z;hq2Fqw?KPOi&1ADNQ7M*2}$^_!M+3(V)K(F6vVk zUwdnZnD9Fdq={vYQ_Djw2r?XV1~YmS47 zg|fz|E$F)v$|AWjn}#OFz<9@A_b59QPOd8NQQD~{aL@$Y{#SVPEk+axW%|z3Ruk_(v5Kod@J)glWF8i(+|^ zVj`!+`^c*<+_r;E%R>i9Bw<@3RQr;Ik~=`EVf~*5lH{!i_uI+RJGrO}zyG-f$v3`8 z#yLnf>Be?vQoTKiCi2h&-hW;rf!rCu?b#K*ybAp4RVf<&&pw}(5xQ5U6w9xeh-&-C zctgoJj9jRRw(x@m{XDqjhe;}5W(A^7PO}&vrpTmX{KkPe&zT`Y^==9eT4A7Zm=z#6 z;40AARICC5@CQ*#39P9h2mCx9n!~44ofaos#|lr~5eew&8fC7Rhb*lc;kk+DsyIE zefsI|EmoblJ;_~4S!OHEOc^ud(+^sD= zoVsu`ZR#udGU>`t3$iMlRU4#C$B^n>4znPl4!nrjQ7&TU)iu4o3G$wzX?lz9$VARR z_h;Sn&BdKU#b-$9j;Km`)|32Usz~an#2_*aNwo#(6W4*Pgm30G$`YzkLP$HXHO1-q z0Va9xj@3JO9iNA@+9;I6p2Pw2g4IR6wNRH;D7Xia;pvkTc@Cgmlpv$faO~_sR>N*C zNJ~oI#db3rwID*lPGBtIy&kYLf5ut}f9p5>h=EWw%0%yJU?H?HQoMkLE zv+p@?x%#@@GyDGI755%rWUwK>@wqY|I!@A_oP}-N##wW_U#dl~1}S#${Mek*Sa4Qr zCP01*D46Cy{-7jTe%-?4^D~E=@vjRfeRVyLuF+i05DkG_^M=rIFX-x-54-`wjmzAKQu59rRaD1)bLIQ3#mUA^Y7A{jjK5tU2*0)zcNH;BDf6?N)^F>+QUO`&%D7Pb)>m8E0>i*WMBeJ zRwmp{*+e@8suEyk2|4%1cu)(rEi2wvv2>a?Q3UVNG$IcuiRs^uQu?6Nz%n#%z-v64 zCVHrSlX_=<;~3B80wK=7xPtFsulN5u;k!j*G)R#8T;WLFPN?EhzSbT8!AS`wh~`j| zw}c`yD}vM0enT3`!$y5)gEGHnn)p-n*z5^_>|YmEw{M-;Rc&zMgM?mlYJ1spfyzjq za#udbr2EQrLQD@`0#<7~F^T0#;AKpiWr~Gsd&P`)L_~pf;xT!IZJau$p~A{Que5;P zxYhAgG`Ss|^g61nt0&WJvzn(s(Ix~!6oQ&ZRS`zH%#gQg>SiAxcQEy3-wJtf`>>0dk+_o{a`JvnxuY(Z59j12i<&T};5G#ZvJ zjX4$7caq5$L5S?C?02`^v3Vnwr6$aw-7J$<{?Og{6IZXN$<);f2Ko*Nl0K@^9+_K} z_C`8MX#&F*I$ElKpV(S1>EQF4QoPD*T9tM-tq#>jFQYts4ox%qI8CaJ*V9esofY0T zWgTwm!A!w5Y?p?bu?nyx%QWe;(UN|w+lymmFS5$V%2rS$d}okFay6m`@1d@A@10`s zDFz;*X^~RVb~5N$t(oHBnJLq9!C)si_Rnfzu*+#Gtk-HEGvHR-e=zp_^RGYH!UmUd zQGp^|{O|$bQ=r|i;WX58n$~tby?H~TrS&aLUiB&#Bz56*!UGtGA#O%2oJ-TB4`;nA8neq?HbEuS#yJxIrDn#Wu^ly{2OQW%CK zUPmR+A*w7$o?AOQWKKA!Y;O<*D7#-qK!>>HAl|ua#tO%`gkAaxsYf(IO|nZJ^lDwMcNm$Y^nZ}7soeR_$UQ2yLHrq7f6ljPqZbxrF{2OVIQ!0EcyKbj34a*5hWXqMPa{^{uaDT6S^ zyy!cou1ZSDbR{bqYwBQ5{x{VAv)}Jd_{Hn4IPb(yx#?}Ou8`-`Kir11NR9gVo9`$J z@x-0PFCM+i8_}ps~!-yaAS0BqjcH4<@l-=7dIKKcp-IsukL_iBq zGeVe_uO_on!tfhm%01j5C6^ufDCMrovHXYV{4S({J*%iAI*%6HQK4IU@L#E@n~-R* z&a@mlh#)69{~pL?IZb4E-k}GC9fiB0j(qCH}L%fTv>U&U})L_R&ClyMc-2 zZozhwY2|B@n?;w!DioClT4`GewdCt+f69rs9*}coNsy|y}Q8D@KZCTm`4{f&9ckfWs)v-IL(InSCbJziPidMRRnS3#z1A#Z(1M#`wJ@;YAb)+9WFdOL$7-_#alN3{J@k@Ux1hMZ<9?wb+NLrK z5+%NqqzS}NrAa)Te)s{QI;9$*{^eye>i~KX4E{5Qd3su#sPfMF&;&2cz~STS>2}Bb zBB6*mXZ1u*4o5lot%kCN>|7d!a*(pSsKtZpFl4ZmvZ4<;Q62uK!YnR+nG0}9AGhCB5aZI5z|NzXJ9T(?sM?I^qCJ)2Gj9)h)D!EBl_- z(bungw*zs2x6|L+9B3!Ft<>2Y7TT#mtGUnIW=Hm9S92Zx9!q(UCBQ|(`4qSg3<{2U zs)hQP0``R8Hl-VZ6^)QYG z2!PfU|AVH%`v2_=PQe>E%<@(WDae%9#UBhTOia^eW9+93uTjsVX-VTNGMag{fYZgj zeV{`!+B$4Gng3eKhgKbsT*zgFQhwzvVq5(lfVl{*D)2%S)IEN8?Q zqvU@)FpCh6BC~Nw*Qf-W1F1x4Huqk;FAbHL4s}LLS5(KAPGjSfPGjkFeOY*Af}Kah zRdZh3t@)rL?WhP;WZ9_k#$)%62p2tKEn#KGXLFqoLE$i=?aEnG#0qncinD zXnMZ4cV+O#E0yTSUqzZWaY)B_DVL9o%PJYuDas&|{aWq-;Lt6!K2jgMXPn(*3~sV` zygG?1X>MbP3tN$eO@p7Me|>n-i9IPe9ppvLnsMpX>(CA2)Z1D|^zghKSLU8qTNyAC zGP-8o)@BC^89x5_zuX<-_)$BY)!?LZB@XtRB7~IR>$sQ&xbh>Uw!QAl_Sxm9_}VIW zj@CKmz)N)jn8kDqZZH~FC`kvc-<6(uI-Jy~4D;`5^Bl9yY)=+Up*jo_ZbE|k=f!Jw z7~WK45|v!qxrMm1NW8D($h%M3Cv#tOcxqJpsobIbd_geq2BlrfcrVdW4bn{7F~-g= zpTgM51lcLjNP&y(4%<%joD@0Yf@mC|sgaCVbgt>jR{y{Dz68Los!a3LUPVHn*<=ZD zK^iL%5)$^XWhp`uLMmhvFbXeKuR=jpD%27JBEBp@P+HjrgNQf|t+WD)imi?aD1tbO z4A9uqGC~NAEGqT{8bJr<`~Lr&bI-l+zE|}si6~PAH}Ac>oO_mk-wqut*qXwb|NXwk z((96w;`%K$|DbfhLnnI>w8bV}SJ1$BMV&x2H)%`;Te58W?;c z4q|ZQ9C&#-b6tgxIV_gyG6}FL#}Udv6jl)P3+<4ZmaOXuvj}x3nmzc5R5;8Nr->e` z&i;W;vWaJL4}b>q1%(@QFq(#BPeie516%->DU|`52>=P0_*7P3kzc+AbHKH-5ZQz6 z=2ozP1$|qDo?gTsbYf9a@i^Z;00J*y?%ytz%G(Fp+(L0?=_6gy3E2h_Q&?a=JYjjy zD(jC*JPI_%m3%J@DtX-1-Px6O7fyqy0JaISEIYj%2XXz*xpi7PXifpXl|lwZ)phXZ zIdEXgurcvd?E!4d7AFAGqRX(oVTuEwmq810rA-Y3Oe!11SM>wt`^6!oTa*Se8 zXWIp!tIhWFR6)ZP%k};?)@@&O>cVlDfTR)}X7;G7>k=5iSie?>E;E8cvMc-P*zEww z0*sIegm+1&Jtq>d)v>9vEReXF6pvSe{>jV2w85n=(mxDxB_S>|5#csEs^L z4+vnP6|WKq7qKAA9^o737TuclOlYKC_$3(Dh$Din=$V!;g(H7eXV**1NfH&n;e!vX z9M%?TS(H?2N76GU0h>I5@)h6QmxHgr*nXk|EZb$oL5PFdVO=Np%uMdf=qP6ECcU4p7*%NT2;GUH2^Xwxk5FofHmQA*l~ z#aIxMbr46Cp6D8(iDm@gsyx_^{mti#SnqlTaO&wsC)FsW?Xg&4dg=EcZe>rb;)*5t$CaRC?U1i#g5(v4M3Iuy7z-ghq)~3+P+2T!Kz! z?2)5#=U>H=5CQ;@$QI9=eI^Hd2pHMxfJegOZI{=%`f9J#WJ+9~C`=lTDlXDc+VwOX zQ$RF{T61gCGZp*B+~P|rC&Un!4+dBe@jte#CZ!nxf68fAmXT`Mfe43X^DZ+V5uC_4 z13y5M`jWVi2NoLeyJ0t}X>BF#~z-gdf~cb=7lE%suR&tDZaamOnfRYDEj>bGtlo#kUy6 z6fv|O0=L-Efw`O5YqgMRRFjXbERF#ROct!ck_lT*kN2&DDg>iCo*5z>WAI+wks_BA zO(&`Ar6@q8ti6O`>))gT%|(DV*&AwLZAq&_<+Gx)KXOo%F!UHAx?< z4G1WGgOfK1(2$;GTLHnAGLMiv+3Ep!YFRq@UwS(QYh{vsA#a@)Xao@TaZk!A%$w%h zO80sLpr^Q<%-RIvDNGb6kT(=RtuA6=Rc$p06Tv~6`1&VpVA;`ybLvY%`*wooV&EAB zs!^A3s8CIft5Q8AUVrB#A1*jk3ku~d@Jnv(;*r(5(F4>MnKA*_t`Cel3BcW*7H}+I zwxnkT2_k5zqv(?Ik<35r4Jzu=-sv2Icv3;e*G#d#c|A*`4J@X4;oEqDcc>;+4KWRL zi|pb=9s?4>yGaXK zJc&*9!MsQ&)N8qrY`LJ;I$ri%Cb^p*mW=TT>m2IlpwCodvI8hK>d(bt>PLWPT%3;AxTv6Q1vRK`2u_3x3 zHG#Tfum_oFUZ@HuYzUAlgNUq3KsQsCore_*22>jGMPHsoRlZV0#-xSYKnxd)sU8Yb zBA)(DCwHDwS*B+6UP#qs@jM|X*};!pIlK2K?JM-U+RQB?P! z*y)Bu0~>4&Jk=iA4PB9_iy33{4Z|2P+!KxO4DM`~GDR@{sI<4XWvZ0{4MK3MVjR zd&4Cr^@bq-WRSN=1d?qgcgbKc>Rcu9G!J39ufjpFzUe`4b=%c0xom>~Wk{@S^6B`S z!!hitxEjv0Zfmr0rUY!+*ai7m%%j*7i&IL@3#SYit3aS)LxdDNtgS$~hf;fc2`G&w z)AUv;AJOdUB`&u%7cIzj!fa}F6MR&z=}e{xt~Jg~2cY!^jfx`>K-=Df+#!eiL~&7N zODjhj7Hti@oHQrZz}U+@s#K%4VAdmhC!C8Fd<)1*q(XwljM#0EfoX) z17ZV-nL?V~ZZTyv2%KGBjI%*Mcus3#Adqc1R0 zNKkAC{Tb**p;h7y3dAz}!wv}i0{V2uR9X^%c@z&d%oFxOv`3A}*%eYva!Q5&gKua= z1B*n`T&3n~bf7B__qZi|zF@y4Ib;LWK5S(f!6oR7t}!OCf^0M^GZPoLXMLU}VmnV3 zbM>Rl4Tu>of|nE~>du#0UzynEXbJ2d`L6SN&?B4{dpfpow;>QD%3=|e*l^mlJaYz~ ziD88}4KV4?zs1QW({#A+#-!CU-56{LsjP)lOxX9pKB*5v%bE=AdKG3nQm=pbnGaHW zCT+H(Y!~w(|I2ZsZ6fhy0Z9Viis6KG$6<^|x)_Yo#=0Tl9SGs%tup9kNAq*aE9Q0V z3+;NtFod|3=eo~OYp?KsXPpqpkEd6#F>R>GdM?HtAZ{Nqgtk_I7mm=7Y|Y2cVjEKf zF~k7dm5*hVWlBXOIQzVX*}#u7o@7VeT8wfcj~D-k72@$gR(xETxUX&6$d%-KGsZ5$ z`V8>=zr#U(^w`h659s|?CrSzHiXiF(Vis2i0)fF7@ZLe!$3?@bXXtleK|=1};Khns zx)sNZ0&20FlgzZqKhoe3+z8p*I>UMObmIU|}i!dk#&bXh@Q+!-`Q5 zc2LqM2`2JU>=Leq7SV7w=pT2C1zR5rg7dGKLK2+Oh~#a-xoAn@?jqqgl!p=or~<>z zpz|!wP$#uGfN+7V-tGf%C~5J@02Qbcm70Hs)6po@XRWt2%Q!Sh+nQJ!O&*TL*H4Ut zYiAZ52E8M2Wc(4$2q)D4?*r_t#lds`qq^QDXVw)lET=HJPsPN^G%Hhg0tW_0(T?El z1eMfcfVmXx6!^iJWsLwe<}!X+OP^?I0q&WF)JS4H!ZEbk2vtwv#&H~Yh*xb6&^Vv0 z2H~=kp~^7d&ttwc7qK;w?&Z9^4L4B~u)8DxK^bR-WK7U%^b^Vgw?trUiVcv4q=<%X zXw7`0gXCv z8p?`9SwNIT*C}%?%b{33Z^eWy=RiQXoN)!b$ErE#we#J(pe36-%0_h&AiJa7yC~0~ zNoVN3R;l4i2jNNu>4lRW^NX+{ffz`8n!c*dQfMRZNj=`t(-|#8PW`C#x2$8T8 z$8k8=O{R3%H}nQ?IN_;L7lm(FB&m3gPKrq3phc`mm?4d!7NZmORlcYV2ZzF8Os}oi zYJL4k;s_*ii031TBN|o%vgHY4hBWLWFHHy7+fFzLsEeEGW&f(^(!&1WWEo-3 z&h|kpk2N%ZR@k3XfK(2t7i|^=S;>-#2nDk*l}(byTS~BCe?v$qfyOHlRz(IPZGjq` zgs@xFf(zs4?bt3dX0cFKHG;cR3uKt$GtE0$wBG2 z2JGyc4Q1A;kbtoi#M#JYKQSg94C>;s%TEHw>+isDDjS(iU8ZbD%|%v7mqp+w5!7sA z;DW(34W~XUm-ZHq4)G&6N5&slnaHeOJuOQq79dbA84v=zLnJ=kmWb*!n)feOu}=ja z&zj_E5k<3*g}&EHk!2zAep>|LnLh%y{uu`;*qvkQUCw(?k)WQ0sgPbttnV;PA6PIM zhYh!IQF#*n;4Y*LVw#Gy9Px0lLOH`f_?Oz|%7z5u0YZh#aDW`>%7LcZ!i~1M_ge5@ zWaD-{U=A(9!7WUN5<7U9g?o4ynsy2J2z40G9J93P63?p^{TaagsW?be=TE~yzO|z8 z>1?{XcHQ7%kP>n}Y(y@O5Cc~osvh8ll1M^&w;mUhQFS)X&}jvhc}W@~Ih%`EB>CV} zQhFbWUR1|Q-a2@O6TL`-Khu;ruP3+QAc)Q_Ezkssys7 z8v*jeD<#?_@=Fu9W?Q`}6xcLg6)tf?#7`Gw%v!H1gOa<)3^>?95K)LC)6&iYDV1JN zD=c`C!*LnfDrOWL-zCK3t2=HDWm0TlTuK%Y3R0wf2H=$#A>DcKRjBTZbd0F zr4X77NkaZ}X1z;dC~Y!SAeStHVUgWrm?x>)Fz78^P}_puwp}o=awPs$B3l2Z;$O{5 zcu0=LK?>b5tKL;Gy0FO6BwD`)gDK={1tS{#9El(uvQfuc(G5NflI`xi?qeGGxsOO=(lyiD*>IKVs?dS^F|38N?_#+G42GF32bB*HqALc;knbAAPLcm)np*KfAgyEx|^t=~TtI)TaDx;W?gKwxZI&%9RF zwIRX4jn%SW-%z@m}J%8tz?Vi5>U33eOz zl+)iDC(4BdBfw)-4!H~((|bO|Fey)fx^&)vL*-(~iZyz+33eT9DuS>N<%BE15tFrG z1R(>-#R5E)gO6g4SO$#H_x9!WuJqJLiXno+x@SVB}4F58QCV0@CywDtDv3}?#t!FCZqK*IxW?G>H@Q*!8}mAbVzX;886lyY#_14|EJMv%b~kf-2Y3P_V_?`evk{A5 zCz^a}rT}iJ!O`1~EEr$vN`hlzQ-OGkt%WAsZ7t4EjCWg%w5GW;#4z33c`hpP5n;{` zzGnlATjQ5Qp*l=`RaC7i=}PGHHf}6z$^C@xvz+#pP?(0n7TI^_5?vl5+sN)<>1d6dg-Oi4tXucV7G`(wubS{7xwl@xf_mw}ZH)jCc zqm_lD(xO;e2qPg7Raxk8!dCm2cQLhUvP;_c1ic8gJ0Wia{*l}$^0cIHD*2HlY!F4%mQSm&xyJvBQ-f(e%^F`i@@?nAteo{S8ttU4fBc;9=}djhtfZz^+=k2RRF0fx?cgvV zRz6wQZK-N+BYTt#lcDq42<+6D*WuIOi@ zk;8CsHTuvHzek4@&L(@ayQ1HE&UZczJh!`|yCrYw+$1hGg&(X=C>ff_2pOSt$nHHD zw=B}3ZTa+RFSW-lJJpOBqwN9Ctc{orGQH~Waj=_v{K9v2PSDkT?#XTP4aS*jrCM}* zvax$tqeaTYiOuiYx5wspbiFcJmt&xiZMRf!kH^8cUj5Vy{~}xNk<4P#8%_yHg*Vht z2Gso_Aw`JJP2iO#P>wcKFNC1K8lfIQW9Qa9BNHE(cUX4=B?b8hRebT{zf*>#7>e(fA%sDSX&Tr2(1P z%&iG+eztWHMv%+lT@Xw~c{lEm12ac}XF5qCN#OQdZZpGdN}$gm{;X$3-#{097e;s8 z>h0-9-2#vjH=-fzfJg*3qrq|SuHrZw%;#$w%!fF}^#zngE+hm?Yw$>wu`5{K>v*#J z%}>}ywwEphLDLJfAb3Fe7)4{LHkfLPHv7r6!qs+JueaGCNKp!1oG$XeEL3Mg57R(&Ts{6^F`S(Fv}*f%FZuI!kjhTArG~2 zjtktHW;Q9V_N_n^2HE@DI|r%=Sw4Z_r)tZPzqMA%;AOql>E}a7mX)W`m4)Bfye^K1o>9=mrt^ zQTO|2nbMu5Su{AvipeaVHrOqW6xD~6W953vAIOEJ;u>`Yc20f|_e&Y>CkaW%U$9V}TRA3DiJ>V3ZPZc2J)h;(2aGUaLA|I-KPb_8!^I zlrMLaXLW>_Woidj1Lr_8u|=yhx|ob-=>>i&iUI&oHyS`Ti}aofes;1AVZq5ib5!`l^wPuPIXAI!_A(mU1o;6F;M2>F4B#LfC|SyXyM|^ zQIdv+PmGPCdcb{1Iz)xi(lCxl;9d$pXqR(G-I2TVwsndH{ZoQUgxwmK@W;{cb!J^TP8hiNSg+i6VQEZ~nqR6DEbPXfx=MM`5lW_8Z{DI2awzF~9^tJn$wE zr$!V0-oSbdTaBi6O3NG&G{nfwHneao4i4%` z9Cis;X4?fSZy!zXS!K-Q_+%%4JF`LN5!*Zcqfn|^vk{YKiB#yI3%@I_FZ9XEUSzcW zLDijHvu!2LXdqOBfImJ-)C^K+|k^ZS(MpgQ8V)J`UCfWe@+1Ltt=Yy)n;K?;x<(i;ILo zUOZ$TVKBB)R|N7j=eOYCATF5YL2*MiD9)#VGVFKZHJ!kt{cy0~PtIv@d5b4HW!&dN zsnW0xCL8-L0j=B8jI&S;R&h+vyujcBK0s?03j20-!j=yf)8k+iq_&A=lHJAik*RBXUO^ zjAa;=5{IDJo|Jk&?C5UbO!nf|^hJHfBq7-j^pBQv!t}qK*5ImpT<`3pcNX?rKkE(! zs$^V_lWt~EN|AIFtz+#fcVO_C=%T>=(is;0x$b2w+QFSTisu{zQ;LFO#O@79lr8a& z95&cis{(|uxG)l?4-4%48i*Fgz#qVI1rB1_jdQ)Iy5o>URT>*Iz|aF23QnVG0Ap*3 z1?I9t#_~`io9m*B0|Hkugb3i+0!nf0ovfgfbGUlXU;xE(&a9!)>W`qShvDEXoOrqt zQ#f*CFZQg2OO=)iuJBOY8j%sN##pq@E?$Aw`KIWQ!m+{$syDp0cGl(<-9I?Ti##*2 zLqTAsSP1mUi?lNX5AK13U3?^NXnfGn#Sh|ZZlAbjcDpy%X8{OiL-e)8hY zg$5%JyE>8m&{kEIrBugBV<*3Z;}Cq04$?`hHX8~6QWS|%Dz9zW*o(LcJn_pa)n44o zKEPJS7ILDw7=zc_CR*Jf1hb~ajZl}cJJq=0eGTPLhwuX-+Z;#~&lJqQP%ojJBy&qb zfPMrz=71;&RK2J?kTZa#P>-fk%ZYtUX#(ND9Dl?05w7lKhPn1umMgVa)$eQ zI{Ghy?-Pb3J7hccSmh#u^^yqj92Hl9i^bLGT#lW6I6^T)=$7#4mIVS5reOMLK*LB} zcz+416~CxNrNo!Uq3GLlNZOVwEzcTSu%Gqu8?MM zWQVTtFt&vFR1U^6H!+Tym&~Q8xEaUyak$r6kh@r@Y7*r76hAp-rJIxja$pYWLQiF% zYMDL`Gf&k~qg}btIJjWaR216YlVF*^Nwpg}B0{Qu77jWsIcLi;qcY_m2ylD=7dhp; zc+`4Win-M^JKQ4XhEn70I}^|G1ze{4a9E^Ynzy|sfN)TQAANV#BDO5~@8>IWr z8$htaYKp9tv5Ht;TEeW4LFqhD&e`U`UelfHeMuxmF)_IQH9OMgJStcrzlE3E=Z@M| zNA42TBt*UjHt2HC;9fOgkT_|J*q#g1dNPhNIJlDifC2%NLj%mD_D(S2#d9xj5IK*H zED=A*Nw~Tj4g%0Oa9Chy&IAT0>*%9+>Mk5>aJaUG={6T?0yG5wXmIo&<{c4x)ni3- zDLp43a>m;mNXK+|G3A3S8k>{?`IQ@A7THAY!)Zql0iILCKaP_#B2%>|PVfi+E(*T$ z_v`rmTO6haVN;FfJhP}11RnObi=qWR*yEj-5`WWRb?-`?N&Z-Pard&GGB;H1hN*+d zOsP5ex{E(s8-J~ezt+TGt9JJHn&9g$NaNCWtAn#U$7kafz6uiaMI2_4X~4e|*VG!$ zQA=a3IRKw%$LxjA_tokKu3M_A%>w*>q^Uu~raRWviei8GntHP<&YyC5ooUBseQlLg zlen&_No2E!(E4&!v; z{gpLUf#6vBzM3P%i)j{A7)oF>%W9P5YsaX$L;{U#Dzw z@2WcUF)Sz(lFXb9HJI3HbJkV-tij^cn;l^y{0eqec>@5(b1%Sb*jTlLoa1+1=WpK2 zdzP(lk~X*iY>S^i9)9vZzMuDTJbZ@tvoG#9ugQHl&$fAu&${;AHQw*q<~2^fd-i#l zu=Zb%c4}&5tXaR^Io`+b;co)L7#!%F{&AJ7%tRpV!9?8S$KgWl%*jXE%kG2d`p!F8 zCjrMg0LMG;RGDeq0#Y1JR(eroii>N^AVI>_0wC1As)S_3@;+$E&U`-Jz{=}cu$}`` ziJ8IGKq++68QPqRn`St3le3WfhKke>kR<|o1y76@1rJ6&4MM>yiP;r5V3mVDJijRO z`K+ur+)RP6=w%D?v7;Hg8C#zN28#!l@&TuYd8dddC;47eZ_X`uef&_Z^MH`mWg9B$ zv+q;!ny3)!Z(yhWd^^p(%532KFiRyaUtQ+%_^@rv(KWa?1`VmA1F z4p)3%!Hd2S{&szDG7n~)9v>x82d{ZC^Dei%M2cz=dHf6Q3&sNk7`duA}#s5?@WczuJt&#o(p!asxkE3e1lu zxKd>f#}$u9;P}B$H`TSKrTFZ4nBy6A%i#h2GHyt84@j4BOKj2CW|n5$6L;G;s7QHk zaB~_M+rw*NN6$-MaK>?ceOGv~uTV|2IQj36VG;GrTbJH!=ew zGw>dsfr&729*jfPg~qv;q{mtV;r^X>>Z~w$3Uqd=3;Zh*|HKbTE+>FGWFo5Nj!%@+rGAf@s%rMF!BNf+?7G@3dE+)jj_e^5I& z6+O|cp1yv9sJ{w)#*;-$@;X`!)X&%^Vorp8NS+RS+y?fvg+0pkwOI%x89bcQ?y3kx&lhvH1fm?9VPDVf(=fn0{8d2P0`A6m@xK46;!H5T2n!Vt?DmRX-=EFAa^4zx7%_KyisqhVLO|Sei zJvNkv(o3}fQk^*sZmvPQAWtTi>)s(eR#M)Y0at0cceb#EDuPu5V!l7TX5}8CF*_jT z2v%Wt=ds9|aF2PS)uI=#InA1YgvgsquD;ZyADeXAZ3b%E+<`y&E4H81{ zmerkDpHph}c~bVqpiXz;tEV=lo<85PXzseh{7D8iZ|C^aOh4SR~N9=wWw_aG1e9rPy(Tz!yQ~ zxrn!!78L=Wf5@6eVjWr%2V0}k%*U>$^qX-E2>QWWLA4|{h3vVKw=qRb9&dAo8df0d zELocAcEl>l{eA?@2a3C|vOSZN5roLvKfxs{*IAK{$&rgfV^p#odvlvL#yShJX+!{# zcA!YEb&$@8AGyU6y-ajCtH$4C>0ah-G|w;vi_7m5QKm$m_Ga?`UBQJIKJ*|0uWbG! z2Uk)IO)crZh+~SK>=jmoGnZ}{V?wwMg5)8k?4;L#p-bkP-{5Bwr8&~f`13x~ju;5X zT6NUsO@>8u#vq*JStI;^g#TL^tZ#(>+iC+$=F;tm5;*GQ*Af07n6F0oe-`seF^duY zAA#3P9gn{n{{Lb_4OlI${|L*44WQak65zR!zmXXjnSqfR7@2{Q85o&?_v#ExM1K-?!M!0xte*o=gr#v+G_Yp*YCFXe_`t9H=EDAk$JkG-+0AFrjcIt z*8H28r+eL!n{Q>F?t-;9qdG#pVLch9VLm_mh&!3DyWpd%?qt61_5b)Oby-Ti7UQ!86we6{`Q~mVczZ?|E>PJ%-j9pr(XIlQ(j*hUG;tD@8;jW z^!v=;z30C--OK#lM=t*K{mkF3+x@fmGk*c5ZwFV)0tU1UO)K^-2H5MWAc%Vp>Pol9$^Yun@!iam|6bG7 z?qe{ov#WMn!F>6K#&2E7eE9=!XzXLYJgY{M<(^i%dtWtT*w*gTzKVJCCpwtmZdFF&VXslV|j!9D-;U&hJ&B+2fh}}RGgbS6}ink z&rgGYrWPn*nEUU)-|!56gdaHbjw#?=K`!B5w1I!|7*34*jm*Hv4E)v1z?dDFf?X+G#$E-zhrdn$bNfWFcSOch9 XE9Z<5tiKwV8R^K#47_VI&}{x6OxNL7 diff --git a/src/WINNT/doc/help/pt_BR/TAAFSSVRMGR.HLP b/src/WINNT/doc/help/pt_BR/TAAFSSVRMGR.HLP deleted file mode 100755 index bdee1f7a640029d6ad6156797f8ee4af5fc93b6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255293 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�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

Ka-c^&q~z`X-u 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 z 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,D;1nvIY(N@h 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 diff --git a/src/WINNT/doc/help/pt_BR/afs-cc.CNT b/src/WINNT/doc/help/pt_BR/afs-cc.CNT deleted file mode 100755 index 834e4ab62..000000000 --- a/src/WINNT/doc/help/pt_BR/afs-cc.CNT +++ /dev/null @@ -1,10 +0,0 @@ -:Base AFS-CC.HLP -:Title Centro de Controle do AFS IBM -1 Configuração do Centro de Controle do AFS -2 Célula Padrão -3 Definindo uma Célula Padrão do AFS para Administrar=Cell_Membership>main -2 Banco de Dados de Células -3 Visão Geral=Cell_Database_Overview>main -3 Incluindo Células no Banco de Dados de Células=Adding_Cells_to_Your_Cell_Database>main -3 Alterando as Informações da Célula=Changing_Cell_Information>main -3 Removendo Células do Banco de Dados de Células=Removing_Cells_From_Your_Cell_Database>main diff --git a/src/WINNT/doc/help/pt_BR/afs-light.CNT b/src/WINNT/doc/help/pt_BR/afs-light.CNT deleted file mode 100755 index 4abf3c6c9..000000000 --- a/src/WINNT/doc/help/pt_BR/afs-light.CNT +++ /dev/null @@ -1,63 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title AFS Básico IBM -1 Visão Geral -2 Sobre o AFS=Working_in_AFS>main -2 Conceitos sobre Armazenamento do AFS=AFSFileStorageConcepts>main -2 Conceitos sobre Segurança do AFS=AFS_security_concepts>main -2 Sobre o AFS Básico=AFS_Client>main -2 Sobre a Ajuda=Audience_and_Purpose>main -1 Guia Inicial -2 Visão Geral=Running_AFS>main -2 Identificando um Gateway do AFS Básico=Adding_your_Client_to_a_Cell>main -2 Montando o Espaço de Arquivos do AFS=Mapping_Drives_Overview>main -2 Autenticando-se no AFS=Authentication>main -2 Verificando a Autenticação=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 Cancelando a Autenticação do AFS=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 Gerenciando o AFS -2 Visão Geral=AccessingAFS@AFS-LIGHT.HLP>main -2 Menu do AFS=FileManagerAFSMenu>main -2 Utilitário de Configuração do AFS Básico=AFS_Client_Configuration_Utility>main -2 Grupo de Programas do AFS Básico=The_AFS_Client_Program_Group>main -2 Caixa de Propriedades do AFS Básico=AFS_Credentials_utility.>main -2 Comandos do Prompt de Comandos=CommandPromptCommands@AFS-LIGHT.HLP>main -1 Usando o AFS -2 Listas de Controle de Acesso -3 Visão Geral -4 Listas de Controle de Acesso=ProtectingFilesandDirectories>main -4 Controle de Acesso no Nível do Diretório=Directory.LevelAccessControl>main -4 Permissões de Acesso do AFS=AFSAccessPermissions>main -4 Permissões de Acesso Adicionais=OtherVariablePermissions>main -4 Entradas Normais e Negativas=NormalandNegativeEntries>main -3 Usando as Listas de Controle de Acesso -4 Definindo ACLs=AccessControlLists>main -4 Incluindo Entradas na ACL=AddACLEntry>main -4 Removendo Entradas da ACL=Removing_ACL_Entries>main -4 Copiando ACLs=CopyACL>main -2 Volumes e Partições -3 Visão Geral=Volumes_and_Partitions>main -3 Exibindo Informações sobre Volumes e Partições=Displaying_Volume_and_Partition_information>main -3 Atualizar o mapa de nome/ID=Refreshname.IDmap>main -2 Pontos de Montagem -3 Visão Geral=Mount_Point_first_page>main -3 Exibindo Pontos de Montagem=Displaying_Mount_Points>main -3 Removendo Pontos de Montagem=Removing_Mount_Points>main -3 Criando Pontos de Montagem=Making_Mount_Points>main -2 Arquivos em Cache -3 Visão Geral=Cached_Files>main -3 Esvaziando Arquivos e Diretórios=Flushing_files_or_directories>main -3 Esvaziando Volumes=Flushing_Volumes>main -2 Informações do Servidor -3 Visão Geral=ListingFileServerInformation>main -3 Mostrando Servidores de Arquivos=Showing_File_Servers>main -3 Mostrando o Status de Servidores de Arquivos=Showing_the_Status_of_File_Servers>main -2 Células -3 Listando Informações -4 Mostrando Células=Showing_Cell>main -3 Banco de Dados de Células -4 Visão Geral=Cells>main -4 Incluindo Células=Adding_Cells_to_your_Cell_Database>main -4 Alterando as Informações da Célula=Changing_Cell_Information>main -4 Removendo Células=Deleting_Cell_Information>main -1 Referência -2 Glossário=Glossary>main -2 Como...=How_To...>main diff --git a/src/WINNT/doc/help/pt_BR/afs-nt.CNT b/src/WINNT/doc/help/pt_BR/afs-nt.CNT deleted file mode 100755 index de2ffbbbe..000000000 --- a/src/WINNT/doc/help/pt_BR/afs-nt.CNT +++ /dev/null @@ -1,77 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS Client -1 Visão Geral -2 Sobre o AFS=Working_in_AFS>main -2 Conceitos sobre Armazenamento do AFS=AFSFileStorageConcepts>main -2 Conceitos sobre Segurança do AFS=AFS_security_concepts>main -2 Sobre o AFS Client=AFS_Client>main -2 Sobre a Ajuda=Audience_and_Purpose>main -1 Guia Inicial -2 Visão Geral=Running_AFS>main -2 Tornando o AFS Client Membro de uma Célula=Adding_your_Client_to_a_Cell>main -2 Assistente do AFS Client=IDH_AFSCREDS_WIZ_START>main -2 Iniciando e Parando o AFS Client=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 Alterando o Tipo de Inicialização do AFS Client=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 Montando o Espaço de Arquivos do AFS=Mapping_Drives_Overview>main -2 Autenticando-se no AFS=Authentication>main -2 Verificando a Autenticação=VerifyingAuthentication@afs-nt.hlp>main -2 Cancelando a Autenticação no AFS=UnauthenticatingfromAFS@afs-nt.hlp>main -1 Gerenciando o AFS -2 Visão Geral=AccessingAFS@afs-nt.hlp>main -2 Menu do AFS=FileManagerAFSMenu>main -2 Utilitário de Configuração do AFS Client=AFS_Client_Configuration_Utility>main -2 Grupo de Programas do AFS Client=The_AFS_Client_Program_Group>main -2 Caixa de Propriedades do AFS Client=AFS_Credentials_utility.>main -2 Comandos do Prompt de Comandos=CommandPromptCommands@afs-nt.hlp>main -1 Usando o AFS -2 Listas de Controle de Acesso -3 Visão Geral -4 Listas de Controle de Acesso=ProtectingFilesandDirectories>main -4 Controle de Acesso no Nível do Diretório=Directory.LevelAccessControl>main -4 Permissões de Acesso do AFS=AFSAccessPermissions>main -4 Permissões de Acesso Adicionais=OtherVariablePermissions>main -4 Entradas Normais e Negativas=NormalandNegativeEntries>main -3 Usando as Listas de Controle de Acesso -4 Definindo ACLs=AccessControlLists>main -4 Incluindo Entradas na ACL=AddACLEntry>main -4 Removendo Entradas da ACL=Removing_ACL_Entries>main -4 Copiando ACLs=CopyACL>main -2 Volumes e Partições -3 Visão Geral=Volumes_and_Partitions>main -3 Exibindo Informações sobre Volumes e Partições=Displaying_Volume_and_Partition_information>main -3 Atualizando Mapeamentos de Nome/ID de Volume=Refreshname.IDmap>main -2 Pontos de Montagem -3 Visão Geral=Mount_Point_first_page>main -3 Exibindo Informações sobre Pontos de Montagem=Displaying_Mount_Points>main -3 Removendo Pontos de Montagem=Removing_Mount_Points>main -3 Criando Pontos de Montagem=Making_Mount_Points>main -2 Arquivos em Cache -3 Visão Geral=Cached_Files>main -3 Esvaziando Arquivos e Diretórios=Flushing_files_or_directories>main -3 Esvaziando Volumes=Flushing_Volumes>main -2 Servidores -3 Listando Informações -4 Visão Geral=ListingFileServerInformation>main -4 Mostrando Servidores de Arquivos=Showing_File_Servers>main -4 Mostrando o Status de Servidores de Arquivos=Showing_the_Status_of_File_Servers>main -3 Preferências de Servidor -4 Visão Geral=Server_Prefs_Overview>main -4 Exibindo Preferências de Servidor=Viewing_Server_Preferences>main -4 Incluindo Preferências de Servidor=Adding_Server_Preferences>main -4 Modificando Preferências de Servidor=Modifying_Server_Preferences>main -2 Células -3 Listando Informações -4 Mostrando Células=Showing_Cell>main -3 Banco de Dados de Células -4 Visão Geral=Cells>main -4 Incluindo Células=Adding_Cells_to_your_Cell_Database>main -4 Alterando Informações da Célula=Changing_Cell_Information>main -4 Removendo Células=Deleting_Cell_Information>main -2 Submontagens -3 Visão Geral=Submounts_Overview>main -3 Criando Submontagens=Creating_Submounts>main -3 Modificando Submontagens=Change_or_Edit_Submounts>main -3 Removendo Submontagens=Delete_Submounts>main -1 Referência -2 Glossário=Glossary>main -2 Como...=How_To...>main diff --git a/src/WINNT/doc/help/pt_BR/taafscfg.cnt b/src/WINNT/doc/help/pt_BR/taafscfg.cnt deleted file mode 100755 index 7d2ff816f..000000000 --- a/src/WINNT/doc/help/pt_BR/taafscfg.cnt +++ /dev/null @@ -1,32 +0,0 @@ -:Base TAAFSCFG.HLP -:Title Configuração do IBM AFS Server -1 Ajuda da Configuração do AFS Server -2 Sobre o AFS, AFS Server e Centro de Controle do AFS=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 Configurando o AFS Server -3 Visão Geral=Configuring_the_AFS_Server -3 O Assistente de Configuração do AFS Server=The_AFS_Server_Configuration_Wizard -3 Para Configurar o AFS Server em uma Célula Existente=Configuring_the_AFS_Server_into_an_Existing_Cell -3 Para Configurar o AFS Server como o primeiro AFS Server em uma Célula=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 Acessando os Dados do AFS=Accessing_AFS_Data -2 A Caixa de Diálogo de Configuração do AFS Server -3 Visão Geral=The_AFS_Server_Configuration_Dialog_Box -3 Para Acessar a Caixa de Diálogo de Configuração do AFS Server=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 Guia Partições -4 Visão Geral=IDH_PARTITIONS_PAGE -4 Definindo as Partições do AFS -5 Visão Geral=Setting_Up_AFS_Partitions -5 Para Criar uma Partição no AFS=To_Create_an_AFS_Partion -4 Administrando as Partições do AFS -5 Visão Geral=Administering_AFS_Partitions -5 Salvando uma Partição do AFS -6 Visão Geral=Salvaging_an_AFS_Partition -6 Para Salvar uma Partição do AFS=To_Salvage_an_AFS_Partition -5 Removendo Partições do AFS -6 Visão Geral=Removing_AFS_Partitions -6 Para Remover uma Partição do AFS=To_Remove_an_AFS_Partition -3 Guia Serviços -4 Visão Geral=IDH_SERVICES_PAGE -4 Funções do AFS Server=AFS_Server_Roles -4 Serviços do AFS=AFS_Services -4 Para Configurar e Iniciar um Serviço do AFS=To_Configure_and_Start_an_AFS_Service -4 Para Parar e Desfazer a Configuração de um Serviço do AFS=To_Stop_and_Unconfigure_an_AFS_Service diff --git a/src/WINNT/doc/help/pt_BR/taafssvrmgr.cnt b/src/WINNT/doc/help/pt_BR/taafssvrmgr.cnt deleted file mode 100755 index 3a35e4ad1..000000000 --- a/src/WINNT/doc/help/pt_BR/taafssvrmgr.cnt +++ /dev/null @@ -1,89 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title Gerenciador de Servidor AFS IBM -1 Gerenciador de Servidor AFS -2 Visão Geral do AFS -3 AFS: Visão Geral=AFS__Overview -3 Células do AFS=DCE_Cells -2 Gerenciador de Servidor AFS -3 Gerenciador de Servidor AFS: Visão Geral=DFS_Server_Manager -2 Autenticando-se no AFS -3 Para Autenticar-se no AFS=To_Obtain_DCE_Credentials -3 Para Escolher uma Célula do AFS para Administrar=To_Choose_a_DCE_Cell_to_Administer -2 Servidores do AFS -3 Servidores: Visão Geral=Servers__An_Overview -3 Mantendo Servidores do AFS=Setting_Up_and_Maintaining_DFS_Servers -3 Monitorando Subconjuntos de Servidores=Monitoring_Server_Subsets -3 Propriedades do Servidor=Server_Properties -3 Avisos do Servidor=Server_Warnings -3 Administradores para um Servidor -4 Administradores para um Servidor: Visão Geral=Administrators_for_a_Server -4 Para Incluir ou Remover um Usuário da Lista de Administradores para um Servidor=To_Edit_an_Administrative_List -3 Chaves de Criptografia do Servidor -4 Chaves de Criptografia do Servidor: Visão Geral=Server_Encryption_Keys -4 Para Incluir uma Nova Chave de Criptografia do Servidor=To_Add_a_New_Server_Key -4 Para Remover uma Chave de Criptografia do Servidor=To_Remove_a_Server_Encryption_Key -3 Arquivos do Servidor -4 Para Instalar um Novo Arquivo no Servidor=To_Install_New_Files_on_a_Server -4 Para Instalar as Versões Anteriores de Arquivos Binários em um Servidor=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 Para Eliminar Arquivos Antigos de um Servidor=To_Prune_Files_from_a_Server -4 Para Obter Datas do Arquivo=To_Get_File_Dates -3 Sincronizando o VLDB em um Servidor -4 Sincronizando o VLDB=Synchronizing_the_FLDB -4 Para Sincronizar o VLDB em um Servidor=To_Synchronize_the_FLDB -2 Partições do AFS -3 Partições: Visão Geral=Partitions__An_Overview -3 Propriedades das Partições=Partition_Properties -3 Avisos das Partições=Partition_Warnings -2 Volumes do AFS -3 Volumes: Visão Geral=Filesets__An_Overview -3 Os Diferentes Tipos de Volumes =Read__Write_and_Read_Only_Filesets -3 O Banco de Dados de Localização de Volumes (VLDB)=FLDB__Fileset_Location_Database_ -3 Propriedades do Volume=Fileset_Properties -3 Para Criar um Volume=To_Create_a_Fileset -3 Para Renomear um Volume=To_Rename_a_Fileset -3 Para Excluir um Volume=To_Delete_a_Fileset -3 Movendo Volumes -4 Movendo Volumes: Visão Geral=Moving_Filesets -4 Para Mover um Volume=To_Move_a_Fileset -3 Criando Versões de Backup de Volumes -4 Para Criar uma Versão de Backup de um Volume=IDH_SVRMGR_CLONE_OVERVIEW -4 Para Criar Versões de Backup de Vários Volumes=To_Clone_Multiple_Filesets -3 Bloqueando e Desbloqueando Volumes -4 Bloqueando e Desbloqueando Entradas no VLDB=Locking_and_Unlocking_Filesets -4 Para Determinar se um Volume está Bloqueado=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 Para Bloquear um Volume=To_Lock_a_Fileset -4 Para Desbloquear um Volume=To_Unlock_a_Fileset -3 Descarregando e Restaurando Volumes -4 Descarregando Volumes=Dumping_and_Restoring_Filesets -4 Para Descarregar um Volume=To_Dump_a_Fileset -4 Restaurando Volumes=Restoring_Filesets -4 Restaurando Descargas Incrementais do Volume=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 Para Restaurar um Arquivo de Descarga=To_Restore_a_Dump_File_to_a_New_Fileset -3 Avisos do Volume=Fileset_Warnings -2 Replicação de Volumes do AFS -3 Replicando Volumes=Replicating_Filesets -3 Para Criar um Novo Local de Replicação do Volume=To_Create_a_New_Fileset_Replication_Site -3 Para Replicar um Volume =To_Replicate_a_Fileset -3 Atualizando as Réplicas do Volume=Updating_Replicas -2 Serviços do AFS -3 Serviços: Visão Geral=Services__An_Overview -3 Configurando e Mantendo Serviços do AFS=Setting_Up_and_Maintaining_DFS_Services -3 Propriedades do Serviço=Service_Properties -3 Para Criar um Serviço=To_Create_a_Service -3 Para Excluir um Serviço=To_Delete_a_Service -3 Para Iniciar um Serviço=To_Start_a_Service -3 Para Parar um Serviço=To_Stop_a_Service -3 Para Reiniciar um Serviço=To_Restart_a_Service -3 Para Definir Datas De Reinicialização do Serviço BOS=To_Set_BOS_Service_Restart_Dates_and_Times -3 Para Exibir Detalhes e Status do Serviço=To_View_Service_Status_and_Details -3 Arquivos de Log do Serviço -4 Arquivos de Log=Log_Files -4 Para Exibir um Arquivo de Log do Serviço=To_View_Service_Log -2 Recuperando Volumes -3 Recuperando Volumes: Visão Geral=Salvaging_Volumes -3 Para Recuperar todos os Volumes em um Servidor de Arquivos=To_Salvage_all_Volumes_on_a_File_Server -3 Para Recuperar todos os Volumes em uma Partição=To_Salvage_all_Volumes_on_a_Partition -3 Para Recuperar um Volume=To_Salvage_a_Volume -2 Referência de Comandos do AFS -3 Referência para os Usuários do AFS no UNIX=UNIX_Command_Reference -3 Comandos do Prompt de Comandos do AFS=AFS_Command_Prompt_Commands diff --git a/src/WINNT/doc/help/pt_BR/taafsusrmgr.cnt b/src/WINNT/doc/help/pt_BR/taafsusrmgr.cnt deleted file mode 100755 index dfd84e1b0..000000000 --- a/src/WINNT/doc/help/pt_BR/taafsusrmgr.cnt +++ /dev/null @@ -1,66 +0,0 @@ -:Base TAAFSUSRMGR.HLP -:Title Gerenciador de Contas do AFS IBM -1 Gerenciador de Contas do AFS -2 Contas de Usuários do AFS -3 Criando Contas do AFS -4 Criando Contas de Usuário do AFS=Creating_User_Entries -4 Para criar uma nova conta do usuário do AFS=To_create_a_single_user_account -3 Autenticação e Segurança de Senhas -4 Aumentando a Segurança da Senha/Autenticação=Improving_Password_Authentication_Security -4 Para limitar o número de tentativas de logon consecutivas com falha=To_limit_the_number_of_consecutive_failed_login_attempts -4 Para desbloquear uma conta de usuário bloqueada=To_unlock_a_locked_user_account -4 Para definir o tempo de duração de uma senha de usuário do AFS=To_set_password_lifetime -4 Para restringir a reutilização de senhas por um usuário=To_restrict_reuse_of_passwords -3 Alterando Senhas -4 Alterando Senhas=Changing_Passwords -4 Para alterar a senha do AFS de um usuário=To_change_a_password_in_the_Authentication_Database -3 Removendo Contas de Usuário -4 Removendo Contas de Usuário=Removing_User_Accounts -4 Para excluir uma conta de usuário do AFS=To_remove_a_user_account -2 Grupos do AFS -3 Sobre o Banco de Dados de Proteção=AFS_Protection_Database -3 Entradas do Banco de Dados de Proteção=Protection_Database_Entries -3 Usando Grupos -4 Usando Grupos Efetivamente=Using_Groups_Effectively -4 Usando Grupos Sem Prefixo do AFS=Using_Prefix_Less_Groups -4 Colocando Endereços IP em Grupos=Placing_Machines_in_Groups -4 Os Grupos Padrões do Sistema=The_Standard_System_Groups -4 Listando Informações sobre Grupos -5 Listando Informações sobre Grupos=Listing_Information_about_Groups -5 Para exibir uma lista dos membros de um grupo do AFS=To_list_the_members_of_a_group -5 Para exibir informações sobre um grupo do AFS=To_examine_a_Protection_Database_group_entry -5 Para exibir uma lista dos grupos que um grupo do AFS possui=To_list_the_groups_that_a_group_owns -4 Listando Informações Relacionadas aos Grupos sobre Usuários e Entradas de Máquina -5 Listando Informações Relacionadas aos Grupos sobre Usuários e Entradas de Máquina=Listing_Group_Related_Information_about_Users_and_Machine_Entries -5 Para exibir uma lista dos grupos aos quais o usuário do AFS pertence=To_examine_a_Protection_Database_entry_for_a_user_or_machine -5 Para exibir uma lista dos grupos que um usuário do AFS possui=To_view_a_list_of_the_groups_that_an_AFS_user_owns -5 Para exibir uma lista dos grupos que uma conta de endereço IP possui=To_view_a_list_of_the_groups_that_an_IP_address_account_owns -5 Para exibir uma lista dos grupos aos quais uma conta de endereço IP pertence=To_view_a_list_of_the_groups_to_which_an_IP_address_account_belongs -4 Criando Entradas de Usuário -5 Criando Contas de Usuário do AFS=Creating_User_Entries -5 Para criar uma nova conta de usuário do AFS=To_create_a_single_user_account -4 Criando Entradas de Máquina -5 Criando Entradas de Endereço IP=Creating_Machine_Entries -5 Para criar uma conta de endereço IP no Banco de Dados de Proteção do AFS=To_create_a_single_machine_entry_in_the_Protection_Database -4 Criando Grupos Regulares e Sem Prefixo -5 Criando Grupos Regulares e Sem Prefixo do AFS=Creating_Regular_and_Prefix_Less_Groups -5 Para criar um novo grupo regular do AFS=To_create_a_single_regular_group_entry -5 Para criar um novo grupo sem prefixo do AFS=To_create_a_single_prefix_less_group_entry -4 Incluindo Membros em Grupos e Removendo-os de Grupos -5 Incluindo Membros em Grupos e Removendo-os de Grupos=Adding_Members_to_Groups_and_Removing_Them_from_Groups -5 Para incluir um usuário ou conta de endereço IP em um grupo=To_add_users_and_machines_to_groups -5 Para remover um usuário, conta de endereço IP ou grupo de um grupo do AFS=To_remove_users_and_machines_from_groups -3 Excluindo Entradas do Banco de Dados de Proteção -4 Excluindo Entradas do Banco de Dados de Proteção=Deleting_Entries_from_the_Protection_Database -4 Para excluir um grupo do AFS=To_delete_user_and_group_entries -3 Alterando o Proprietário de uma Entrada -4 Alterando o Proprietário de um grupo do AFS=Changing_the_Owner_of_an_Entry -4 As Implicações de Mudança de Nome de uma Alteração de Propriedade=The_Name_Changing_Implications_of_Changing_Ownership -4 Para alterar o proprietário de um grupo do AFS=To_change_the_owner_of_a_group_entry -3 Alterando o Nome de uma Entrada -4 Alterando o Nome de um Grupo do AFS=Changing_the_Name_of_an_Entry -4 Para alterar o nome de um grupo do AFS=To_change_the_name_of_a_group_entry -3 Alterando a Cota de Criação de Grupos -4 Alterando a Cota de Criação de Grupos=Changing_Group_Creation_Quota -4 Para exibir a cota de criação de grupos de um usuário do AFS=To_examine_group_creation_quota -4 Para alterar a cota de criação de grupos de um usuário do AFS=To_change_group_creation_quota diff --git a/src/WINNT/doc/help/zh_CN/AFS-CC.HLP b/src/WINNT/doc/help/zh_CN/AFS-CC.HLP deleted file mode 100755 index e8f4ad0d511cb52f9717e09dafdd0126ee624560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29598 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 AcmMzZ diff --git a/src/WINNT/doc/help/zh_CN/AFS-LIGHT.HLP b/src/WINNT/doc/help/zh_CN/AFS-LIGHT.HLP deleted file mode 100755 index 93a2698ea4ae61b88230269e4c448028649c5433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188092 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 )FQo8cvRfh;_X*nMfkfYQ!8=w&T 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 diff --git a/src/WINNT/doc/help/zh_CN/AFS-NT.HLP b/src/WINNT/doc/help/zh_CN/AFS-NT.HLP deleted file mode 100755 index 2e932bc566ab4f32a63474c2e5a5f3aac7daf485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262679 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

B3JpWr-Y$uM2xFLYcK)mQ8D5KA&33^$;q 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%0DE~SKp!JJa)mmiPm>ov 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 O1C=%KzorHn82=Bx(8;m@ diff --git a/src/WINNT/doc/help/zh_CN/TAAFSCFG.HLP b/src/WINNT/doc/help/zh_CN/TAAFSCFG.HLP deleted file mode 100755 index 0959ab8d5b4410eab5d4528adf9e45ec8c9b4bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95881 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 aX#Xee(WxTB`qYe>Vnd1$__INvxA%YFAW0tp diff --git a/src/WINNT/doc/help/zh_CN/TAAFSSVRMGR.HLP b/src/WINNT/doc/help/zh_CN/TAAFSSVRMGR.HLP deleted file mode 100755 index bd9f3f8a8689126d8f8d644c372de8f74b19fed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213067 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≺=EpCAjTcc;2#SV8&`^FtIl- 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 diff --git a/src/WINNT/doc/help/zh_CN/TAAFSUSRMGR.HLP b/src/WINNT/doc/help/zh_CN/TAAFSUSRMGR.HLP deleted file mode 100755 index 7a1d1e65bf1d3c52933815ce40ba8a0d5075993f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133713 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ⅇ=B|r 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 zmain -2 µ¥ÔªÊý¾Ý¿â -3 ¸ÅÊö=Cell_Database_Overview>main -3 ½«µ¥ÔªÌí¼Óµ½µ¥ÔªÊý¾Ý¿â=Adding_Cells_to_Your_Cell_Database>main -3 ¸ü¸Äµ¥ÔªÐÅÏ¢=Changing_Cell_Information>main -3 ´Óµ¥ÔªÊý¾Ý¿âÖгýÈ¥µ¥Ôª=Removing_Cells_From_Your_Cell_Database>main diff --git a/src/WINNT/doc/help/zh_CN/afs-light.CNT b/src/WINNT/doc/help/zh_CN/afs-light.CNT deleted file mode 100755 index 0b3034445..000000000 --- a/src/WINNT/doc/help/zh_CN/afs-light.CNT +++ /dev/null @@ -1,63 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title IBM AFS Light -1 ¸ÅÊö -2 ¹ØÓÚ AFS=Working_in_AFS>main -2 AFS ´æ´¢¸ÅÄî=AFSFileStorageConcepts>main -2 AFS °²È«ÐÔ¸ÅÄî=AFS_security_concepts>main -2 ¹ØÓÚ AFS Light=AFS_Client>main -2 ¹ØÓÚ°ïÖú=Audience_and_Purpose>main -1 ÈëÃÅ -2 ¸ÅÊö=Running_AFS>main -2 ±êʶ AFS Light Íø¹Ø=Adding_your_Client_to_a_Cell>main -2 °²×° AFS Îļþ¿Õ¼ä=Mapping_Drives_Overview>main -2 ÈÏÖ¤µ½ AFS=Authentication>main -2 ÑéÖ¤ÈÏÖ¤=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 ´Ó AFS È¡ÏûÈÏÖ¤=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 ¹ÜÀí AFS -2 ¸ÅÊö=AccessingAFS@AFS-LIGHT.HLP>main -2 AFS ²Ëµ¥=FileManagerAFSMenu>main -2 AFS Light ÅäÖÃʵÓóÌÐò=AFS_Client_Configuration_Utility>main -2 AFS Light ³ÌÐò×é=The_AFS_Client_Program_Group>main -2 ¡°AFS Light ÌØÐÔ¡±¿ò=AFS_Credentials_utility.>main -2 ÃüÁîÌáʾÃüÁî=CommandPromptCommands@AFS-LIGHT.HLP>main -1 ʹÓà AFS -2 ´æÈ¡¿ØÖƱí -3 ¸ÅÊö -4 ´æÈ¡¿ØÖƱí=ProtectingFilesandDirectories>main -4 Ŀ¼¼¶´æÈ¡¿ØÖÆ=Directory.LevelAccessControl>main -4 AFS ´æÈ¡Ðí¿ÉȨ=AFSAccessPermissions>main -4 ÆäËü´æÈ¡Ðí¿ÉȨ=OtherVariablePermissions>main -4 Õý³£ºÍ·ñ¶¨ÌõÄ¿=NormalandNegativeEntries>main -3 ʹÓôæÈ¡¿ØÖƱí -4 ÉèÖà ACL=AccessControlLists>main -4 Ìí¼Ó ACL ÌõÄ¿=AddACLEntry>main -4 ³ýÈ¥ ACL ÌõÄ¿=Removing_ACL_Entries>main -4 ¸´ÖÆ ACL=CopyACL>main -2 ¾íºÍ·ÖÇø -3 ¸ÅÊö=Volumes_and_Partitions>main -3 ÏÔʾ¾íºÍ·ÖÇøÐÅÏ¢=Displaying_Volume_and_Partition_information>main -3 Ë¢ÐÂÃû³Æ/±êʶ·ûÓ³Éä=Refreshname.IDmap>main -2 °²×°µã -3 ¸ÅÊö=Mount_Point_first_page>main -3 ÏÔʾ°²×°µã=Displaying_Mount_Points>main -3 ³ýÈ¥°²×°µã=Removing_Mount_Points>main -3 ½¨Á¢°²×°µã=Making_Mount_Points>main -2 ÒѸßËÙ»º´æµÄÎļþ -3 ¸ÅÊö=Cached_Files>main -3 Çå²ÖÎļþºÍĿ¼=Flushing_files_or_directories>main -3 Çå²Ö¾í=Flushing_Volumes>main -2 ·þÎñÆ÷ÐÅÏ¢ -3 ¸ÅÊö=ListingFileServerInformation>main -3 ÏÔʾÎļþ·þÎñÆ÷=Showing_File_Servers>main -3 ÏÔʾÎļþ·þÎñÆ÷µÄ״̬=Showing_the_Status_of_File_Servers>main -2 µ¥Ôª -3 ÁгöÐÅÏ¢ -4 ÏÔʾµ¥Ôª=Showing_Cell>main -3 µ¥ÔªÊý¾Ý¿â -4 ¸ÅÊö=Cells>main -4 Ìí¼Óµ¥Ôª=Adding_Cells_to_your_Cell_Database>main -4 ¸ü¸Äµ¥ÔªÐÅÏ¢=Changing_Cell_Information>main -4 ³ýÈ¥µ¥Ôª=Deleting_Cell_Information>main -1 ²Î¿¼ -2 ´Ê»ã±í=Glossary>main -2 ÈçºÎ...=How_To...>main diff --git a/src/WINNT/doc/help/zh_CN/afs-nt.CNT b/src/WINNT/doc/help/zh_CN/afs-nt.CNT deleted file mode 100755 index 6526cf60d..000000000 --- a/src/WINNT/doc/help/zh_CN/afs-nt.CNT +++ /dev/null @@ -1,77 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS ¿Í»§»ú -1 ¸ÅÊö -2 ¹ØÓÚ AFS=Working_in_AFS>main -2 AFS ´æ´¢¸ÅÄî=AFSFileStorageConcepts>main -2 AFS °²È«ÐÔ¸ÅÄî=AFS_security_concepts>main -2 ¹ØÓÚ AFS ¿Í»§»ú=AFS_Client>main -2 ¹ØÓÚ°ïÖú=Audience_and_Purpose>main -1 ÈëÃÅ -2 ¸ÅÊö=Running_AFS>main -2 ʹÄúµÄ AFS ¿Í»§»ú³ÉΪµ¥Ôª³ÉÔ±=Adding_your_Client_to_a_Cell>main -2 AFS ¿Í»§»úÏòµ¼=IDH_AFSCREDS_WIZ_START>main -2 Æô¶¯ºÍÍ£Ö¹ AFS ¿Í»§»ú=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 ¸ü¸Ä AFS ¿Í»§»úµÄÆô¶¯·½Ê½=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 °²×° AFS Îļþ¿Õ¼ä=Mapping_Drives_Overview>main -2 ÈÏÖ¤µ½ AFS=Authentication>main -2 ÑéÖ¤ÈÏÖ¤=VerifyingAuthentication@afs-nt.hlp>main -2 ´Ó AFS È¡ÏûÈÏÖ¤=UnauthenticatingfromAFS@afs-nt.hlp>main -1 ¹ÜÀí AFS -2 ¸ÅÊö=AccessingAFS@afs-nt.hlp>main -2 AFS ²Ëµ¥=FileManagerAFSMenu>main -2 AFS ¿Í»§»úÅäÖÃʵÓóÌÐò=AFS_Client_Configuration_Utility>main -2 AFS ¿Í»§»ú³ÌÐò×é=The_AFS_Client_Program_Group>main -2 ¡°AFS ¿Í»§»úÌØÐÔ¡±¿ò=AFS_Credentials_utility.>main -2 ÃüÁîÌáʾÃüÁî=CommandPromptCommands@afs-nt.hlp>main -1 ʹÓà AFS -2 ´æÈ¡¿ØÖƱí -3 ¸ÅÊö -4 ´æÈ¡¿ØÖƱí=ProtectingFilesandDirectories>main -4 Ŀ¼¼¶´æÈ¡¿ØÖÆ=Directory.LevelAccessControl>main -4 AFS ´æÈ¡Ðí¿ÉȨ=AFSAccessPermissions>main -4 ÆäËü´æÈ¡Ðí¿ÉȨ=OtherVariablePermissions>main -4 Õý³£ºÍ·ñ¶¨ÌõÄ¿=NormalandNegativeEntries>main -3 ʹÓôæÈ¡¿ØÖƱí -4 ÉèÖà ACL=AccessControlLists>main -4 Ìí¼Ó ACL ÌõÄ¿=AddACLEntry>main -4 ³ýÈ¥ ACL ÌõÄ¿=Removing_ACL_Entries>main -4 ¸´ÖÆ ACL=CopyACL>main -2 ¾íºÍ·ÖÇø -3 ¸ÅÊö=Volumes_and_Partitions>main -3 ÏÔʾ¾íºÍ·ÖÇøÐÅÏ¢=Displaying_Volume_and_Partition_information>main -3 Ë¢ÐÂÃû³Æ£¯¾í±êʶ·ûÓ³Éä=Refreshname.IDmap>main -2 °²×°µã -3 ¸ÅÊö=Mount_Point_first_page>main -3 ÏÔʾ°²×°µãÐÅÏ¢=Displaying_Mount_Points>main -3 ³ýÈ¥°²×°µã=Removing_Mount_Points>main -3 ´´½¨°²×°µã=Making_Mount_Points>main -2 ÒѸßËÙ»º´æµÄÎļþ -3 ¸ÅÊö=Cached_Files>main -3 Çå²ÖÎļþºÍĿ¼=Flushing_files_or_directories>main -3 Çå²Ö¾í=Flushing_Volumes>main -2 ·þÎñÆ÷ -3 ÁгöÐÅÏ¢ -4 ¸ÅÊö=ListingFileServerInformation>main -4 ÏÔʾÎļþ·þÎñÆ÷=Showing_File_Servers>main -4 ÏÔʾÎļþ·þÎñÆ÷µÄ״̬=Showing_the_Status_of_File_Servers>main -3 ·þÎñÆ÷Ê×Ñ¡Ïî -4 ¸ÅÊö=Server_Prefs_Overview>main -4 ²é¿´·þÎñÆ÷Ê×Ñ¡Ïî=Viewing_Server_Preferences>main -4 Ìí¼Ó·þÎñÆ÷Ê×Ñ¡Ïî=Adding_Server_Preferences>main -4 Ð޸ķþÎñÆ÷Ê×Ñ¡Ïî=Modifying_Server_Preferences>main -2 µ¥Ôª -3 ÁгöÐÅÏ¢ -4 ÏÔʾµ¥Ôª=Showing_Cell>main -3 µ¥ÔªÊý¾Ý¿â -4 ¸ÅÊö=Cells>main -4 Ìí¼Óµ¥Ôª=Adding_Cells_to_your_Cell_Database>main -4 ¸ü¸Äµ¥ÔªÐÅÏ¢=Changing_Cell_Information>main -4 ³ýÈ¥µ¥Ôª=Deleting_Cell_Information>main -2 ×Ó°²×° -3 ¸ÅÊö=Submounts_Overview>main -3 ´´½¨×Ó°²×°=Creating_Submounts>main -3 ÐÞ¸Ä×Ó°²×°=Change_or_Edit_Submounts>main -3 ³ýÈ¥×Ó°²×°=Delete_Submounts>main -1 ²Î¿¼ -2 ´Ê»ã±í=Glossary>main -2 ÈçºÎ...=How_To...>main diff --git a/src/WINNT/doc/help/zh_CN/taafscfg.cnt b/src/WINNT/doc/help/zh_CN/taafscfg.cnt deleted file mode 100755 index 318b92b75..000000000 --- a/src/WINNT/doc/help/zh_CN/taafscfg.cnt +++ /dev/null @@ -1,32 +0,0 @@ -:Base TAAFSCFG.HLP -:Title IBM AFS ·þÎñÆ÷ÅäÖà -1 AFS ·þÎñÆ÷ÅäÖðïÖú -2 ¹ØÓÚ AFS¡¢AFS ·þÎñÆ÷ºÍ AFS ¿ØÖÆÖÐÐÄ=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 ÅäÖà AFS ·þÎñÆ÷ -3 ¸ÅÊö=Configuring_the_AFS_Server -3 AFS ·þÎñÆ÷ÅäÖÃÏòµ¼=The_AFS_Server_Configuration_Wizard -3 ½« AFS ·þÎñÆ÷ÅäÖõ½Ò»¸öÏÖÓе¥ÔªÖÐ=Configuring_the_AFS_Server_into_an_Existing_Cell -3 ½« AFS ·þÎñÆ÷ÅäÖóɵ¥ÔªÖеĵÚÒ»¸ö AFS ·þÎñÆ÷=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 ´æÈ¡ AFS Êý¾Ý=Accessing_AFS_Data -2 AFS ·þÎñÆ÷ÅäÖöԻ°¿ò -3 ¸ÅÊö=The_AFS_Server_Configuration_Dialog_Box -3 Òª´æÈ¡¡°AFS ·þÎñÆ÷ÅäÖá±¶Ô»°¿ò=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 ·ÖÇø±êÇ© -4 ¸ÅÊö=IDH_PARTITIONS_PAGE -4 ÉèÖà AFS ·ÖÇø -5 ¸ÅÊö=Setting_Up_AFS_Partitions -5 ´´½¨Ò»¸ö AFS ·ÖÇø=To_Create_an_AFS_Partion -4 ¹ÜÀí AFS ·ÖÇø -5 ¸ÅÊö=Administering_AFS_Partitions -5 Íì¾ÈÒ»¸ö AFS ·ÖÇø -6 ¸ÅÊö=Salvaging_an_AFS_Partition -6 ÒªÍì¾ÈÒ»¸ö AFS ·ÖÇø=To_Salvage_an_AFS_Partition -5 ³ýÈ¥ AFS ·ÖÇø -6 ¸ÅÊö=Removing_AFS_Partitions -6 Òª³ýÈ¥Ò»¸ö AFS ·ÖÇø=To_Remove_an_AFS_Partition -3 ·þÎñ±êÇ© -4 ¸ÅÊö=IDH_SERVICES_PAGE -4 AFS ·þÎñÆ÷½ÇÉ«=AFS_Server_Roles -4 AFS ·þÎñ=AFS_Services -4 ÒªÅäÖÃºÍÆô¶¯ AFS ·þÎñ=To_Configure_and_Start_an_AFS_Service -4 ҪֹͣºÍÈ¡ÏûÅäÖà AFS ·þÎñ=To_Stop_and_Unconfigure_an_AFS_Service diff --git a/src/WINNT/doc/help/zh_CN/taafssvrmgr.cnt b/src/WINNT/doc/help/zh_CN/taafssvrmgr.cnt deleted file mode 100755 index 9cee305bc..000000000 --- a/src/WINNT/doc/help/zh_CN/taafssvrmgr.cnt +++ /dev/null @@ -1,89 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title IBM AFS ·þÎñÆ÷¹ÜÀíÆ÷ -1 AFS ·þÎñÆ÷¹ÜÀíÆ÷ -2 AFS ¸ÅÊö -3 AFS£º¸ÅÊö=AFS__Overview -3 AFS µ¥Ôª=DCE_Cells -2 AFS ·þÎñÆ÷¹ÜÀíÆ÷ -3 AFS ·þÎñÆ÷¹ÜÀíÆ÷£º¸ÅÊö=DFS_Server_Manager -2 ÈÏÖ¤µ½ AFS -3 ÒªÈÏÖ¤µ½ AFS=To_Obtain_DCE_Credentials -3 Ñ¡ÔñÒª¹ÜÀíµÄ AFS µ¥Ôª=To_Choose_a_DCE_Cell_to_Administer -2 AFS ·þÎñÆ÷ -3 ·þÎñÆ÷£º¸ÅÊö=Servers__An_Overview -3 ά»¤ AFS ·þÎñÆ÷=Setting_Up_and_Maintaining_DFS_Servers -3 ¼àÊÓ·þÎñÆ÷×Ó¼¯=Monitoring_Server_Subsets -3 ·þÎñÆ÷ÌØÐÔ=Server_Properties -3 ·þÎñÆ÷¾¯¸æ=Server_Warnings -3 ·þÎñÆ÷¹ÜÀíÔ± -4 ·þÎñÆ÷¹ÜÀíÔ±£º¸ÅÊö=Administrators_for_a_Server -4 ÒªÌí¼Ó»ò³ýÈ¥·þÎñÆ÷¹ÜÀíÔ±ÁбíÖеÄÓû§=To_Edit_an_Administrative_List -3 ·þÎñÆ÷¼ÓÃÜÃÜÔ¿ -4 ·þÎñÆ÷¼ÓÃÜÃÜÔ¿£º¸ÅÊö=Server_Encryption_Keys -4 ÒªÌí¼ÓеķþÎñÆ÷¼ÓÃÜÃÜÔ¿=To_Add_a_New_Server_Key -4 Òª³ýÈ¥·þÎñÆ÷¼ÓÃÜÃÜÔ¿=To_Remove_a_Server_Encryption_Key -3 ·þÎñÆ÷Îļþ -4 ÔÚ·þÎñÆ÷Éϰ²×°ÐÂÎļþ=To_Install_New_Files_on_a_Server -4 ÒªÔÚ·þÎñÆ÷Éϰ²×°ÏÈǰ°æ±¾µÄ¶þ½øÖÆÎļþ=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 ´Ó·þÎñÆ÷ÉÏɾ³ýÎļþ=To_Prune_Files_from_a_Server -4 »ñµÃÎļþÈÕÆÚ=To_Get_File_Dates -3 ͬ²½·þÎñÆ÷É쵀 VLDB -4 ͬ²½ VLDB=Synchronizing_the_FLDB -4 ͬ²½·þÎñÆ÷É쵀 VLDB=To_Synchronize_the_FLDB -2 AFS ·ÖÇø -3 ·ÖÇø£º¸ÅÊö=Partitions__An_Overview -3 ·ÖÇøÌØÐÔ=Partition_Properties -3 ·ÖÇø¾¯¸æ=Partition_Warnings -2 AFS ¾í -3 ¾í£º¸ÅÊö=Filesets__An_Overview -3 ¾íµÄ²»Í¬ÀàÐÍ =Read__Write_and_Read_Only_Filesets -3 ¾íλÖÃÊý¾Ý¿â (VLDB)=FLDB__Fileset_Location_Database_ -3 ¾íÌØÐÔ=Fileset_Properties -3 Òª´´½¨¾í =To_Create_a_Fileset -3 ÒªÖØÃüÃû¾í=To_Rename_a_Fileset -3 Ҫɾ³ý¾í=To_Delete_a_Fileset -3 ÒÆ¶¯¾í -4 ÒÆ¶¯¾í£º¸ÅÊö=Moving_Filesets -4 ÒªÒÆ¶¯¾í=To_Move_a_Fileset -3 ´´½¨¾íµÄ±¸·Ý°æ±¾ -4 Òª´´½¨Ò»¸ö¾íµÄ±¸·Ý°æ±¾=IDH_SVRMGR_CLONE_OVERVIEW -4 Òª´´½¨¶à¸ö¾íµÄ±¸·Ý°æ±¾=To_Clone_Multiple_Filesets -3 Ëø¶¨ºÍ½âËø¾í -4 Ëø¶¨ºÍ½âËø VLDB ÌõÄ¿=Locking_and_Unlocking_Filesets -4 È·¶¨¾íÊÇ·ñËø¶¨=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 Ëø¶¨Ò»¸ö¾í=To_Lock_a_Fileset -4 ½âËøÒ»¸ö¾í=To_Unlock_a_Fileset -3 ת´¢ºÍ»Ö¸´¾í -4 ת´¢¾í=Dumping_and_Restoring_Filesets -4 Ҫת´¢¾í =To_Dump_a_Fileset -4 »Ö¸´¾í=Restoring_Filesets -4 »Ö¸´ÔöÁ¿¾íת´¢=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 Òª»Ö¸´×ª´¢Îļþ=To_Restore_a_Dump_File_to_a_New_Fileset -3 ¾í¾¯¸æ=Fileset_Warnings -2 AFS ¾í¸´ÖÆ -3 ¸´Öƾí=Replicating_Filesets -3 ´´½¨ÐÂ¾í¸´ÖÆ³¡Ëù=To_Create_a_New_Fileset_Replication_Site -3 Òª¸´Öƾí =To_Replicate_a_Fileset -3 ¸üÐÂ¾í¸±±¾=Updating_Replicas -2 AFS ·þÎñ -3 ·þÎñ£º¸ÅÊö=Services__An_Overview -3 ÉèÖúÍά»¤ AFS ·þÎñ=Setting_Up_and_Maintaining_DFS_Services -3 ·þÎñÌØÐÔ=Service_Properties -3 Òª´´½¨·þÎñ=To_Create_a_Service -3 Ҫɾ³ý·þÎñ=To_Delete_a_Service -3 ÒªÆô¶¯·þÎñ=To_Start_a_Service -3 Ҫֹͣ·þÎñ=To_Stop_a_Service -3 ÒªÖØÐÂÆô¶¯·þÎñ=To_Restart_a_Service -3 ÒªÉèÖà BOS ·þÎñÖØÐÂÆô¶¯ÈÕÆÚ=To_Set_BOS_Service_Restart_Dates_and_Times -3 ²é¿´·þÎñ״̬ºÍÏêϸÐÅÏ¢=To_View_Service_Status_and_Details -3 ·þÎñÈÕÖ¾Îļþ -4 ÈÕÖ¾Îļþ=Log_Files -4 Òª²é¿´·þÎñÈÕÖ¾Îļþ=To_View_Service_Log -2 Íì¾È¾í -3 Íì¾È¾í£º¸ÅÊö=Salvaging_Volumes -3 ÒªÍì¾ÈÎļþ·þÎñÆ÷ÉϵÄËùÓоí=To_Salvage_all_Volumes_on_a_File_Server -3 ÒªÍì¾È·ÖÇøÖеÄËùÓоí=To_Salvage_all_Volumes_on_a_Partition -3 Íì¾ÈÒ»¸ö¾í=To_Salvage_a_Volume -2 AFS ÃüÁî˵Ã÷ -3 AFS UNIX Óû§²Î¿¼=UNIX_Command_Reference -3 AFS ÃüÁîÌáʾÃüÁî=AFS_Command_Prompt_Commands diff --git a/src/WINNT/doc/help/zh_CN/taafsusrmgr.cnt b/src/WINNT/doc/help/zh_CN/taafsusrmgr.cnt deleted file mode 100755 index b80754828..000000000 --- a/src/WINNT/doc/help/zh_CN/taafsusrmgr.cnt +++ /dev/null @@ -1,66 +0,0 @@ -:Base TAAFSUSRMGR.HLP -:Title IBM AFS ÕÊ»§¹ÜÀíÆ÷ -1 AFS ÕÊ»§¹ÜÀíÆ÷ -2 AFS Óû§ÕÊ»§ -3 ´´½¨ AFS ÕÊ»§ -4 ´´½¨ AFS Óû§ÕÊ»§=Creating_User_Entries -4 ´´½¨Ð嵀 AFS Óû§ÕÊ»§=To_create_a_single_user_account -3 ¿ÚÁîÈÏÖ¤ºÍ°²È«ÐÔ -4 ¸Ä½ø¿ÚÁî/ÈÏÖ¤°²È«ÐÔ=Improving_Password_Authentication_Security -4 ÏÞÖÆÓû§Á¬Ðø³¢ÊԵǼʧ°ÜµÄ´ÎÊý=To_limit_the_number_of_consecutive_failed_login_attempts -4 ½âËøÒ»¸öËø¶¨µÄÓû§ÕÊ»§=To_unlock_a_locked_user_account -4 Ϊһ¸ö AFS Óû§ÕÊ»§ÉèÖÿÚÁîÉúÃüÆÚ=To_set_password_lifetime -4 ÏÞÖÆÓû§ÖØÓÿÚÁî=To_restrict_reuse_of_passwords -3 ¸ü¸Ä¿ÚÁî -4 ¸ü¸Ä¿ÚÁî=Changing_Passwords -4 ¸ü¸ÄÓû§µÄ AFS ¿ÚÁî=To_change_a_password_in_the_Authentication_Database -3 ³ýÈ¥Óû§ÕÊ»§ -4 ³ýÈ¥Óû§ÕÊ»§=Removing_User_Accounts -4 ɾ³ý AFS Óû§ÕÊ»§=To_remove_a_user_account -2 AFS ×é -3 ¹ØÓÚ±£»¤Êý¾Ý¿â=AFS_Protection_Database -3 ±£»¤Êý¾Ý¿âÌõÄ¿=Protection_Database_Entries -3 ʹÓÃ×é -4 ÓÐЧµØÊ¹ÓÃ×é=Using_Groups_Effectively -4 ʹÓÃÎÞǰ׺ AFS ×é=Using_Prefix_Less_Groups -4 ÔÚ×éÖзÅÖà IP µØÖ·=Placing_Machines_in_Groups -4 ±ê׼ϵͳ×é=The_Standard_System_Groups -4 ÁгöÓйØ×éµÄÐÅÏ¢ -5 ÁгöÓйØ×éµÄÐÅÏ¢=Listing_Information_about_Groups -5 ²é¿´ AFS ×é³ÉÔ±µÄÁбí=To_list_the_members_of_a_group -5 ²é¿´¹ØÓÚ AFS ×éµÄÐÅÏ¢=To_examine_a_Protection_Database_group_entry -5 ²é¿´ AFS ×éËùÓÐÕßµÄ×éÁбí=To_list_the_groups_that_a_group_owns -4 ÁгöÓйØÓû§ºÍ»úÆ÷ÌõÄ¿µÄ×éÏà¹ØÐÅÏ¢ -5 ÁгöÓйØÓû§ºÍ»úÆ÷ÌõÄ¿µÄ×éÏà¹ØÐÅÏ¢=Listing_Group_Related_Information_about_Users_and_Machine_Entries -5 ²é¿´Ò»¸ö AFS Óû§ËùÊôµÄ×éµÄÁбí=To_examine_a_Protection_Database_entry_for_a_user_or_machine -5 ²é¿´Ò»¸ö AFS Óû§ÓµÓеÄ×éµÄÁбí=To_view_a_list_of_the_groups_that_an_AFS_user_owns -5 ²é¿´ IP µØÖ·ÕÊ»§ÓµÓеÄ×éµÄÁбí=To_view_a_list_of_the_groups_that_an_IP_address_account_owns -5 ²é¿´ IP µØÖ·ÕÊ»§ËùÊôµÄ×éµÄÁбí=To_view_a_list_of_the_groups_to_which_an_IP_address_account_belongs -4 ´´½¨Óû§ÌõÄ¿ -5 ´´½¨ AFS Óû§ÕÊ»§=Creating_User_Entries -5 ´´½¨Ð嵀 AFS Óû§ÕÊ»§=To_create_a_single_user_account -4 ´´½¨»úÆ÷ÌõÄ¿ -5 ´´½¨ IP µØÖ·ÌõÄ¿=Creating_Machine_Entries -5 ÔÚ AFS ±£»¤Êý¾Ý¿âÖд´½¨Ò»¸ö IP µØÖ·ÕÊ»§=To_create_a_single_machine_entry_in_the_Protection_Database -4 ´´½¨³£¹æ×éºÍÎÞǰ׺×é -5 ´´½¨³£¹æºÍÎÞǰ׺ AFS ×é=Creating_Regular_and_Prefix_Less_Groups -5 ´´½¨Ðµij£¹æ AFS ×é=To_create_a_single_regular_group_entry -5 ´´½¨ÐµÄÎÞǰ׺ AFS ×é=To_create_a_single_prefix_less_group_entry -4 Ìí¼Ó³ÉÔ±ÖÁ×éÖкʹÓ×éÖÐɾ³ý³ÉÔ± -5 Ìí¼Ó³ÉÔ±ÖÁ×éÖкʹÓ×éÖÐɾ³ý³ÉÔ±=Adding_Members_to_Groups_and_Removing_Them_from_Groups -5 Ìí¼ÓÓû§»ò IP µØÖ·ÖÁ×éÖÐ=To_add_users_and_machines_to_groups -5 ´Ó AFS ×éÖÐɾ³ýÓû§¡¢IP µØÖ·ÕÊ»§»ò×é=To_remove_users_and_machines_from_groups -3 ´Ó±£»¤Êý¾Ý¿âÖÐɾ³ýÌõÄ¿ -4 ´Ó±£»¤Êý¾Ý¿âÖÐɾ³ýÌõÄ¿=Deleting_Entries_from_the_Protection_Database -4 ɾ³ý AFS ×é=To_delete_user_and_group_entries -3 ¸ü¸ÄÌõÄ¿µÄËùÓÐÕß -4 ¸ü¸Ä AFS ×éµÄËùÓÐÕß=Changing_the_Owner_of_an_Entry -4 ¸ü¸ÄËùÓÐȨµÄÃû³Æ¸ü¸ÄÔ̺¬Ê½=The_Name_Changing_Implications_of_Changing_Ownership -4 ¸ü¸Ä AFS ×éµÄËùÓÐÕß=To_change_the_owner_of_a_group_entry -3 ¸ü¸ÄÌõÄ¿µÄÃû³Æ -4 ¸ü¸Ä AFS ×éÃû=Changing_the_Name_of_an_Entry -4 ¸ü¸Ä AFS ×éµÄÃû³Æ=To_change_the_name_of_a_group_entry -3 ¸ü¸Ä×é´´½¨ÏÞ¶î -4 ¸ü¸Ä×é´´½¨ÏÞ¶î=Changing_Group_Creation_Quota -4 ²é¿´ AFS Óû§µÄ×é´´½¨ÏÞ¶î=To_examine_group_creation_quota -4 ¸ü¸Ä AFS Óû§µÄ×é´´½¨ÏÞ¶î=To_change_group_creation_quota diff --git a/src/WINNT/doc/help/zh_TW/AFS-CC.GID b/src/WINNT/doc/help/zh_TW/AFS-CC.GID deleted file mode 100755 index f12cf56bdb7ac7cda44be01332fe84c0186b6156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10826 zcmeHM-%C?b96xuPreZRCk8VMW!d#e$BxQ3tn#~$I7~$k{)jJ(*_s-qrYWNV9^e;r< zQ^Ox6;t#O-BZD9xqL-kD9xUl4M4}$*As@oN-*b1j>1J6V37s!o@ArJq=X}pSpKZtQ z=iGY1Na{_5Y=SkPBE$;51ujx|(m;sG6$dxRHa9uKkrIek7)$6-4t$%Vjh~tt{hUZ7 zR>#}ty9gv8bFrBY-Yx}$#0agKjArxa0p1K|rHF(A_-fp#>CQL$50 zCE;qn6zLC0F|8kK2U~Y{K<*I`rV3F-xTai>(3YSN(y&-c*n35}M@I`z*{?)GVl<%0 z8U(knRw<

kw6NM3m5uDFM!mF~Au3O9rek&Vpk#F%lQI=0VMZrbo-c!JjB-6V0qp zQCP65pySPsqpA3on^v75>QI@PZZ|3Qz~{;b%#Nz&%`JnjF?da041a%QTbfI*rvwOs z&fGDO#QcOrp9urUIRhw}$8R;UGWR99l31JlmhOIT#O_6JCRIx8q!EpSniSFyISKBA zhI*<#Tic;~0jAH$F?}gRgN9$pvTRtkXu^f%JOHdQpBlrp*WBi4S7vePRjm$kbazkj zP0K(W@{;2y*)#BYW+}r8stWbzLJ;lD`#^q^)?1N?jm46E=_xTKGsXa8fHA-rU<@z@ z7z2y}#sFi0F~Au3Um381>a?Kpq{jsYS9QLZpW1N&qHcno#^VQ+l6-O_w*9^0dFMHw zKOl=ip_3Wk00Ucuw_WxaPapMXT6)z^P8%zniKW0?ID1`6R= z`Uidy?&0AP*g?38sh9b){hVRrE@1Fo_wNi6<7fK;64c@(*#@yHXivj^eES61IOa13 s_K1O`nXlrjz>4uC4lh&LLT%>gb&sZHX&D2I0mcAhfHA-r*jEhv1a@D#&Hw-a diff --git a/src/WINNT/doc/help/zh_TW/AFS-CC.HLP b/src/WINNT/doc/help/zh_TW/AFS-CC.HLP deleted file mode 100755 index 5c0d3c63746a14eb5966f0a6429bd77bddc3fcf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33228 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 diff --git a/src/WINNT/doc/help/zh_TW/AFS-LIGHT.HLP b/src/WINNT/doc/help/zh_TW/AFS-LIGHT.HLP deleted file mode 100755 index 7f8f135fcbe680abf4a682b7e4e8a0eb2c87ec85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140234 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

GCCMzT35MU$LDwVzK>)6ktK6T|ez|!k zevhPBf^IJRMa~lNAV#E0$8I&4yfGzcqO_D}dmubZ#k!+ah8B_sO4kZ8(A zly?InS$^5Ft z&$o1{f&1FMcA}f<@(nRVzWS@3K5c_H?AN^(tcu%Tv&y1tCoyhHY}#1`%!5gpBMyw@Lpz8Bx6%6O? zxDSfZ3qTQii)pfxgHN{8-c(S6KD2mH!br;x8qhvE4d_&-k4G}rcY=j4?1b-Io@|KH zB@}+r>k=z6A#FT7%!piY&6^{ClAe~Gtw>7`eWSk=^`VV%f&G8}PSC78xNV_RMXG#x;) zC-U5`AG-mt6{<<2mNb~`L(I+vl2lPe=@4Nf0ftfC6sjss6{X{_QKGVdsU6D=R!CNZR3=m{lqsl_5CR7_5l%dZ8F$OFHGRK%M zY{Enc1MmknTMT+`AMVzfY(!@zT+gyzCY{qun3-vXX^J$aAcLruno1a;FX|LDmT{6n z8wCzK2;>NKh0lXA_^`wK#_4r9wL2;1N(SV)i$UebM@%)H`x;pl(i&=8Lqw8NDSB+u z<3_4YE>&|mPZEIc)Cxw5w@Ndqu5)liz=8v+QLfnhb?gt48HP>@TgzK(PZjwDPC24R8I zD~PXc)e~wStDE?B4KE}gHxpL-D}gWEOw3sTaJCNJvUV%)aUwU|i5mtlts&4FocJ=` zwz^5Yc{jD^cr&x|Gtvu#bMqHkaFYiZiDNLOJA_|(Fj-lA9$cbrP^vRK-dwHE7ouzI zFNan?s&dtAv}mf=81Ya4E<5(*z`oY>-C}GJ1-YDHp2!vmUPu@^tgRdnafdq!V?_|M zF!lxnZ#*?Oa$GmIujJ2i%*sA5&Tu^;PQY|HE?59@*TW`&V}WK;(r}a?@Af#2m%!z0 zu&jwimMAP=s;}^@UO)M?aJI#G$mfg&VEMT$WX3~;;hK$PI*tgzj!RNTelUnDY?Qf- zoo11WDG~5?*Mr_(rd7fHlE}$VyebyEO{`&2=^NO#odIpA^nKvq&_bn^N$ah6OR?ny z%*;T@g?vP!uUp%uBEC%2H8L+ZKO@UFGl#LW>=i9*RPoZ2%`EZQ_JKfaS_ZZVC|F~u zKb2?k`lWnVc-5iS-z>&*Z@Q_LJ#zy^ZpSLka~{vVt?=W(VlAW&zF?}Y$<>Yn?&Dta zKi(h9F!mLEL7(kOH7~fj^E>^_{9IX)lF7&^yzbh=o4~_vnDCQTvXyKk%y@R}erU>!o*F;v=y*q4GcYUs~Dk96$ zqTS;{P3%^`>MeD<>s=Cj084j~vZ_#I5w!#{pw!@CMaAk{=BwlbtRDFdN@&UTXsZP| z?cGy`NQ;@^(5e`@RxTZ=|FNg9^kGIU1=v&QO>mdvz^F<3vDjV-gg*@+HVtCEfzU|I z^}@_wNrgFuBqK8)F3On<6O)^no0FtZ-8%ke73WckIU^uok>nwK0d54`!$@{*Quo|n ziW7r^DDPecN`r1ySrNA2bOl^dNRC(_i802SFd@&!GQ`O`OyC~$v5{#4XolGELn8xU z*?Yz$8_@NOYw#h)Dj?P$Z}((_e;y{U%Fa!9Ov{#~zvs#THGsc$5U>Q|Z$uC39+D|= znE2M9J#&iO&SSx5Ww z?)pj_(p05W=vVGP-lSS>*p_*|6uU!! zBLz!H*DA6TVsRUpPBRFY_9otFUT#s2tdLRWX5~z=Xl34fxRcAH>g|zOVQPES4y0sS=Aq&~LCt+s+!vze{sL6o zC#boPiu}5NrAhmI*P%Qx6{m%w{>3qD-HI) zOK!aQb4?F8J)I5Ud1Lq`KdV&%^#l+yG#pef0FfFEar-USu<5$%FuP@`$bJhs&VQLf@^ zI^l~>wavSCJ_*BgqUN?x)G3S&GXF5uFN~!x-rYA-rsWq3vI?_)@j&Ya{QApoK6o`E z2uw>_$U+9VX^5Ti=s>$)tHs5RTCw?v`pf*?d55W;bPAkev8|XCJ5*?*@ha?H!4wpP z^JdnY3X#jO(}%K?03as|AsMk0(qiq&_r|ln|8<8m7$M*$eIAMWWciwv&vMO+Ob}Mz z5loS^XI3fBAA8wq4)Z35{PYaW?2R6hxWbI0xnd~YQV6jn5KCuuw5i+Z_e;$4iUhfZ zX~kw}gMgFc3zwNr>J3YICFE67s>tVtpM4f`slxktwNT+w_fF5h)P;A%>Z0BpH5wY= zz6f_Fj9+vZ!wE6~O9N*dR$%I+v9}nnP7@G&N z-Z&xVZ&Ty*Gt$URpWK}6h0G*jZg$bUbQiEbpkJG6{pk>7Ga)iZ%e%lrHoS|@>6=Y* z>eLgCiANIyrrSNvs5pE>v@jq;dC8XRA|c^3^^;3WRy{>IY zaeh`IuZh2SCu;qZAq*O)8^3ZDy}w-`*98#_B<31QQep1~vP~X$SIp)s5*2NK4yJ`-SFk+dW1(A8{c}yT8W{Oj ziHD$Isd?ZTV-{qrYC$q%x)Y@mA;3k;EQbuV-07y~LsHw#!rC&k3JNpwosCmtJwXoi zjyX}RTaBslobf@U!zPw^mvw>0wec3|E8Be6caviEZW@w9ArywTEk5@2IOje1j#K3n z{cZco_UpL$Pn~ZLqz(0eLdpr$`6(1ap|Ll{F=MXXN+=4>PRkEGA+T;*a|&z2Tgt=| zYIC*X0f7PT&gc5?dOA;dY!3y-?#aGgyALHuKuW@Eo~fdCf#EVk)XjTs#*k{T3Md1$ z*eMNp*-5)>feyRYCp-a+ZpLU7@9iTJ_M8jyi(%2aI+))ap_C$vVU*~f|6EU>Vy%f# zE8PR$UC-T<%6T7=S63^D-2$=Rc*Tx1we#?PR8XW~bzp67#6S~G%RbNT&L5`*OCrzU z3wJu_a7RC(W^7j~PT3r{YN|Rs`^O&@m^RjY|aYOzv&CR#sFDV)~BolM_L3oC_)Q~F>ufYof#nU%e)s2bLh7+gf zm)UBj9sOOqQ&tmu)9NSxom~5PPLBNu$R)RWgp1#{J>Lzx0TF$~EK|w~o zSZ^byLU0nxC;2wIqxyZ0Ve9AJ1+PQ~J~n&!hQPtp;B}YyWK9r zY2OVy-=UgG$3i~|02rHuBXI_7i*<#PIqA$?-d^XWPSuQ9zDKBOTrn8zJ_yn9!+j&L z`@oxIztNdmd{}boV2lk~e7Gw#W=JSDFiQ3T|JRv+&@}3>ZX|>t%!IHKISqg)+JQhr z76+@KY=UJ2{f#01!vI4BIcX|BKnI7SG*~iO07c{A08-2v5f(oBKu9jVB_J$N5rBR$ z(O0)K8BBx?IR$}U6^thbNpiq9`( zClxQf&ERa%TbVX0I~3P50Clxwc&)Zp2MCqpsJPOF-pghJ*tNn|nP**mM>g##}-z)N&weucWNi(O-=(BIEXC) zyPlts9U-E|Gb&J0!q~62HG_F9&r_ZPZ5yYA=VY;166{B!!pSGDA1^P!i=PAE}KX8NeeJa%^84^wg8}_@rYkS2!PTExrT{OmUyaxh{qVj>T4DDPPDT z15!aza{Dt)yPho3ABd>}@U6K|M7`uNu zAbdd}@0Z~K$FlGQ{Hn(}L!B$GwlCjcY8fpB(j5!-F;I}xP$<(`$e5SV!hSG~Q6&aD zul4cA-fJ39o_KANkJ6u+B7JVjHXu&{0YH;!Aw(^Zv2JunKuc*;DN_m#%~Yfr=#MQA zbAyOs5cm*iV_ram=z`+*aq%6C{C4=43cp{3!$7)@<&l@;;K%=P+ClzC7v)K0&>4oc zRlAY$EnBwFMAsNnA?Fq!XTS^s6vHEv#{#tD2@gYw<4|cis2R^ZU0ZwMyoeJ8O?e0r zRhSej8v#TYdeAZ5H;PtPY)b?n=AE$HF_BV zM?*D}kCJJpYpV_c-=CZEj}W=|Dmj?`F%Z`8Yn%@19qQu4T@4GM&9PbO`MCwTf?0*k zlvDy1*O+BUnE$i_me~iXZ=h$?cT^o}j61|Gtch&~x#4zqQVQ*i$HqdR$Ps930v-kP z^|qdHCw*If(e~(lm+*gI|3$*rNJJ5H{i7EAW6Dh)VU55s*t8EFL> zj5aQ}Fk>+1Ghs%e)P_{S6;s<MKO^Jc{(trj-eZixun5Y3LuQVIfiv}u)k$;r|(rG9i zl(x<@l1CR2;r?L+?@>r&#Y#P$d;`Xj6!>~Kfk!xzu7D=eoiBidFQG*=4%R3s+QJk5 zv~c zRrF#!53{@d{kHgn!xtIhSnoYlSzWj$tkgn?3f98PrK_8r%_Nn;`^_}4<$&syZG>>> z_$=o$qsVyvRKHFEQAK8+6}%6=Xm$GO-(qp9=3a4CU(HWqSwL!)oEIz%DEI%+NZP

eKn6{2G|nP@mxk8Qn-Bi0km!(+G`l=;2=X6Jh) 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 diff --git a/src/WINNT/doc/help/zh_TW/AFS-NT.HLP b/src/WINNT/doc/help/zh_TW/AFS-NT.HLP deleted file mode 100755 index a4e02da3f15fe4016dea6965d5f4d901e7d1455a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199211 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 diff --git a/src/WINNT/doc/help/zh_TW/TAAFSCFG.HLP b/src/WINNT/doc/help/zh_TW/TAAFSCFG.HLP deleted file mode 100755 index b3b4e284b5278bb27b1813e07ebff73bad73e127..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112709 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%0Do*{Ten0ZNT!Y`Pc$%f8P>l^DEgIntjOuQRl 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

hPYMHnzb_%KVOxTv-J2&XF9_@bKtehgu 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 diff --git a/src/WINNT/doc/help/zh_TW/TAAFSUSRMGR.HLP b/src/WINNT/doc/help/zh_TW/TAAFSUSRMGR.HLP deleted file mode 100755 index fca8496aa7dfc8d17a011e05b2cdd43a0205ac16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142264 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ÝX@@RD1Tza0p@kC& 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 z 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 Px+K*t@SkgeR^q<^CYurC diff --git a/src/WINNT/doc/help/zh_TW/afs-cc.CNT b/src/WINNT/doc/help/zh_TW/afs-cc.CNT deleted file mode 100755 index 0a578a5a2..000000000 --- a/src/WINNT/doc/help/zh_TW/afs-cc.CNT +++ /dev/null @@ -1,11 +0,0 @@ -:Base AFS-CC.HLP -:Title IBM AFS ±±¨î¤¤¤ß -1 AFS ±±¨î¤¤¤ß¬[ºc -2 ¹w³] Cell -3 ³]©w¹w³] AFS Cell ¶i¦æºÞ²z=Cell_Membership>main -2 Cell ¸ê®Æ®w -3 ·§Æ[=Cell_Database_Overview>main -3 ·s¼W Cell ¨ì Cell ¸ê®Æ®w=Adding_Cells_to_Your_Cell_Database>main -3 Åܧó Cell ¸ê°T=Changing_Cell_Information>main -3 ±q Cell¸ê®Æ®w¤¤²¾°£ Cell=Removing_Cells_From_Your_Cell_Database>main - \ No newline at end of file diff --git a/src/WINNT/doc/help/zh_TW/afs-light.CNT b/src/WINNT/doc/help/zh_TW/afs-light.CNT deleted file mode 100755 index a1a8bc92f..000000000 --- a/src/WINNT/doc/help/zh_TW/afs-light.CNT +++ /dev/null @@ -1,64 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title IBM AFS Light -1 ·§Æ[ -2 Ãö©ó AFS=Working_in_AFS>main -2 AFS Àx¦sÅé·§©À=AFSFileStorageConcepts>main -2 AFS ¦w¥þ©Ê·§©À=AFS_security_concepts>main -2 Ãö©ó AFS Light=AFS_Client>main -2 Ãö©ó»¡©ú=Audience_and_Purpose>main -1 ¤Jªù -2 ·§Æ[=Running_AFS>main -2 ÃѧO AFS Light ¹h¹D=Adding_your_Client_to_a_Cell>main -2 ¸Ë¸ü AFS ÀɮתŶ¡=Mapping_Drives_Overview>main -2 Ų§O AFS =Authentication>main -2 ÅçÃÒŲ§O=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 ±q AFS ¨ú®øÅ²§O=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 ºÞ²z AFS -2 ·§Æ[=AccessingAFS@AFS-LIGHT.HLP>main -2 AFS ¥\¯àªí=FileManagerAFSMenu>main -2 AFS Light ¬[ºc¤½¥Îµ{¦¡=AFS_Client_Configuration_Utility>main -2 AFS Light µ{¦¡¸s²Õ=The_AFS_Client_Program_Group>main -2 AFS Light ¤º®e¤è¶ô=AFS_Credentials_utility.>main -2 «ü¥O´£¥Ü«ü¥O=CommandPromptCommands@AFS-LIGHT.HLP>main -1 ¨Ï¥Î AFS -2 ¦s¨ú±±¨î¦C¥Ü -3 ·§Æ[ -4 ¦s¨ú±±¨î¦C¥Ü=ProtectingFilesandDirectories>main -4 ¥Ø¿ý¼h¦¸¦s¨ú±±¨î=Directory.LevelAccessControl>main -4 AFS ¦s¨ú³\¥iÅv=AFSAccessPermissions>main -4 ÃB¥~¦s¨ú³\¥iÅv=OtherVariablePermissions>main -4 ¤@¯ë»P¤Ï¦Vµn¿ý=NormalandNegativeEntries>main -3 ¨Ï¥Î¦s¨ú±±¨î¦C¥Ü -4 ³]©w ACL=AccessControlLists>main -4 ·s¼W ACL µn¿ý=AddACLEntry>main -4 ²¾°£ ACL µn¿ý=Removing_ACL_Entries>main -4 ½Æ»s ACL=CopyACL>main -2 ®eÅé»P¤À³Î°Ï -3 ·§Æ[=Volumes_and_Partitions>main -3 Åã¥Ü®eÅé»P¤À³Î°Ï¸ê°T=Displaying_Volume_and_Partition_information>main -3 ­«·s¾ã²z¦WºÙ/ID ¹ïÀ³=Refreshname.IDmap>main -2 ¸Ë¸üÂI -3 ·§Æ[=Mount_Point_first_page>main -3 Åã¥Ü¸Ë¸üÂI=Displaying_Mount_Points>main -3 ²¾°£¸Ë¸üÂI=Removing_Mount_Points>main -3 »s§@¸Ë¸üÂI=Making_Mount_Points>main -2 §Ö¨úÀÉ®× -3 ·§Æ[=Cached_Files>main -3 ¨R¼gÀɮשM¥Ø¿ý=Flushing_files_or_directories>main -3 ¨R¼g®eÅé=Flushing_Volumes>main -2 ¦øªA¾¹¸ê°T -3 ·§Æ[=ListingFileServerInformation>main -3 Åã¥ÜÀɮצøªA¾¹=Showing_File_Servers>main -3 Åã¥ÜÀɮצøªA¾¹ª¬ºA=Showing_the_Status_of_File_Servers>main -2 Cell -3 ¦C¥Ü¸ê°T -4 Åã¥Ü Cell=Showing_Cell>main -3 Cell ¸ê®Æ®w -4 ·§Æ[=Cells>main -4 ·s¼W Cell=Adding_Cells_to_your_Cell_Database>main -4 Åܧó Cell ¸ê°T=Changing_Cell_Information>main -4 ²¾°£ Cell=Deleting_Cell_Information>main -1 °Ñ·Ó -2 ¦Wµü¸ÑÄÀ=Glossary>main -2 ¦p¦ó...=How_To...>main - \ No newline at end of file diff --git a/src/WINNT/doc/help/zh_TW/afs-nt.CNT b/src/WINNT/doc/help/zh_TW/afs-nt.CNT deleted file mode 100755 index a4f3de091..000000000 --- a/src/WINNT/doc/help/zh_TW/afs-nt.CNT +++ /dev/null @@ -1,78 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS ¥Î¤áºÝ -1 ·§Æ[ -2 Ãö©ó AFS=Working_in_AFS>main -2 AFS Àx¦sÅé·§©À=AFSFileStorageConcepts>main -2 AFS ¦w¥þ©Ê·§©À=AFS_security_concepts>main -2 Ãö©ó AFS ¥Î¤áºÝ=AFS_Client>main -2 Ãö©ó»¡©ú=Audience_and_Purpose>main -1 ¤Jªù -2 ·§Æ[=Running_AFS>main -2 Åý±zªº AFS ¥Î¤áºÝ¦¨¬° Cell ªº¦¨­û=Adding_your_Client_to_a_Cell>main -2 AFS ¥Î¤áºÝºëÆF=IDH_AFSCREDS_WIZ_START>main -2 ±Ò°Ê»P°±¤î AFS ¥Î¤áºÝ=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 Åܧó AFS ¥Î¤áºÝªº±Ò°ÊÃþ«¬=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 ¸Ë¸ü AFS ÀɮתŶ¡=Mapping_Drives_Overview>main -2 Ų§O AFS=Authentication>main -2 ÅçÃÒŲ§O=VerifyingAuthentication@afs-nt.hlp>main -2 ±q AFS ¨ú®øÅ²§O=UnauthenticatingfromAFS@afs-nt.hlp>main -1 ºÞ²z AFS -2 ·§Æ[=AccessingAFS@afs-nt.hlp>main -2 AFS ¥\¯àªí=FileManagerAFSMenu>main -2 AFS ¥Î¤áºÝ¬[ºc¤½¥Îµ{¦¡=AFS_Client_Configuration_Utility>main -2 AFS ¥Î¤áºÝµ{¦¡¸s²Õ=The_AFS_Client_Program_Group>main -2 AFS ¥Î¤áºÝ¤º®e¤è¶ô=AFS_Credentials_utility.>main -2 «ü¥O´£¥Ü«ü¥O=CommandPromptCommands@afs-nt.hlp>main -1 ¨Ï¥Î AFS -2 ¦s¨ú±±¨î¦C¥Ü -3 ·§Æ[ -4 ¦s¨ú±±¨î¦C¥Ü=ProtectingFilesandDirectories>main -4 ¥Ø¿ý¼h¦¸¦s¨ú±±¨î=Directory.LevelAccessControl>main -4 AFS ¦s¨ú³\¥iÅv=AFSAccessPermissions>main -4 ÃB¥~¦s¨ú³\¥iÅv=OtherVariablePermissions>main -4 ¤@¯ë»P¤Ï¦Vµn¿ý=NormalandNegativeEntries>main -3 ¨Ï¥Î¦s¨ú±±¨î¦C¥Ü -4 ³]©w ACL=AccessControlLists>main -4 ·s¼W ACL µn¿ý=AddACLEntry>main -4 ²¾°£ ACL µn¿ý=Removing_ACL_Entries>main -4 ½Æ»s ACL=CopyACL>main -2 ®eÅé»P¤À³Î°Ï -3 ·§Æ[=Volumes_and_Partitions>main -3 Åã¥Ü®eÅé»P¤À³Î°Ï¸ê°T=Displaying_Volume_and_Partition_information>main -3 ­«·s¾ã²z¦WºÙ/®eÅé ID ¹ïÀ³=Refreshname.IDmap>main -2 ¸Ë¸üÂI -3 ·§Æ[=Mount_Point_first_page>main -3 Åã¥Ü¸Ë¸üÂI¸ê°T=Displaying_Mount_Points>main -3 ²¾°£¸Ë¸üÂI=Removing_Mount_Points>main -3 «Ø¥ß¸Ë¸üÂI=Making_Mount_Points>main -2 §Ö¨úÀÉ®× -3 ·§Æ[=Cached_Files>main -3 ¨R¼gÀɮשM¥Ø¿ý=Flushing_files_or_directories>main -3 ¨R¼g®eÅé=Flushing_Volumes>main -2 ¦øªA¾¹ -3 ¦C¥Ü¸ê°T -4 ·§Æ[=ListingFileServerInformation>main -4 Åã¥ÜÀɮצøªA¾¹=Showing_File_Servers>main -4 Åã¥ÜÀɮצøªA¾¹ª¬ºA=Showing_the_Status_of_File_Servers>main -3 ¦øªA¾¹³ß¦n³]©w -4 ·§Æ[=Server_Prefs_Overview>main -4 À˵ø¦øªA¾¹³ß¦n³]©w=Viewing_Server_Preferences>main -4 ·s¼W¦øªA¾¹³ß¦n³]©w=Adding_Server_Preferences>main -4 ­×§ï¦øªA¾¹³ß¦n³]©w=Modifying_Server_Preferences>main -2 Cell -3 ¦C¥Ü¸ê°T -4 Åã¥Ü Cell=Showing_Cell>main -3 Cell ¸ê®Æ®w -4 ·§Æ[=Cells>main -4 ·s¼W Cell=Adding_Cells_to_your_Cell_Database>main -4 Åܧó Cell ¸ê°T=Changing_Cell_Information>main -4 ²¾°£ Cell=Deleting_Cell_Information>main -2 ¤l¸Ë¸ü -3 ·§Æ[=Submounts_Overview>main -3 «Ø¥ß¤l¸Ë¸ü=Creating_Submounts>main -3 ­×§ï¤l¸Ë¸ü=Change_or_Edit_Submounts>main -3 ²¾°£¤l¸Ë¸ü=Delete_Submounts>main -1 °Ñ·Ó -2 ¦Wµü¸ÑÄÀ=Glossary>main -2 ¦p¦ó...=How_To...>main - \ No newline at end of file diff --git a/src/WINNT/doc/help/zh_TW/taafscfg.cnt b/src/WINNT/doc/help/zh_TW/taafscfg.cnt deleted file mode 100755 index 10835a9ce..000000000 --- a/src/WINNT/doc/help/zh_TW/taafscfg.cnt +++ /dev/null @@ -1,33 +0,0 @@ -:Base TAAFSCFG.HLP -:Title IBM AFS ¦øªA¾¹¬[ºc -1 AFS ¦øªA¾¹¬[ºc»¡©ú -2 Ãö©ó AFS ©M AFS ¦øªA¾¹¥H¤Î AFS ±±¨î¤¤¤ß=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 ¬[ºc AFS ¦øªA¾¹ -3 ·§Æ[=Configuring_the_AFS_Server -3 AFS ¦øªA¾¹¬[ºcºëÆF=The_AFS_Server_Configuration_Wizard -3 ±NAFS ¦øªA¾¹¬[ºc¨ì²{¦³ªº¸ê®Æ®æ¤¤=Configuring_the_AFS_Server_into_an_Existing_Cell -3 ±N AFS ¦øªA¾¹¬[ºc¬°¸ê®Æ®æ¤¤ªº²Ä¤@­Ó AFS ¦øªA¾¹=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 ¦s¨ú AFS ¸ê®Æ=Accessing_AFS_Data -2 AFS ¦øªA¾¹¬[ºc¹ï¸Ü¤è¶ô -3 ·§Æ[=The_AFS_Server_Configuration_Dialog_Box -3 ¦s¨ú AFS ¦øªA¾¹¬[ºc¹ï¸Ü¤è¶ô=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 ¤À³Î°Ï¼ÐÅÒ -4 ·§Æ[=IDH_PARTITIONS_PAGE -4 ³]¸m AFS ¤À³Î°Ï -5 ·§Æ[=Setting_Up_AFS_Partitions -5 «Ø¥ß AFS ¤À³Î°Ï=To_Create_an_AFS_Partion -4 ºÞ²z AFS ¤À³Î°Ï -5 ·§Æ[=Administering_AFS_Partitions -5 ´©±Ï AFS ¤À³Î°Ï -6 ·§Æ[=Salvaging_an_AFS_Partition -6 ´©±Ï AFS ¤À³Î°Ï=To_Salvage_an_AFS_Partition -5 ²¾°£ AFS ¤À³Î°Ï -6 ·§Æ[=Removing_AFS_Partitions -6 ²¾°£ AFS ¤À³Î°Ï=To_Remove_an_AFS_Partition -3 ªA°È¼ÐÅÒ -4 ·§Æ[=IDH_SERVICES_PAGE -4 AFS ¦øªA¾¹ªº¨¤¦â=AFS_Server_Roles -4 AFS ªA°È=AFS_Services -4 ¬[ºc¨Ã±Ò°Ê AFS ªA°È=To_Configure_and_Start_an_AFS_Service -4 °±¤î¨Ã¨ú®ø¬[ºc AFS ªA°È=To_Stop_and_Unconfigure_an_AFS_Service - \ No newline at end of file diff --git a/src/WINNT/doc/help/zh_TW/taafssvrmgr.cnt b/src/WINNT/doc/help/zh_TW/taafssvrmgr.cnt deleted file mode 100755 index 37ae88406..000000000 --- a/src/WINNT/doc/help/zh_TW/taafssvrmgr.cnt +++ /dev/null @@ -1,90 +0,0 @@ -:Base TAAFSSVRMGR.HLP -:Title IBM AFS ¦øªA¾¹ºÞ²zµ{¦¡ -1 AFS ¦øªA¾¹ºÞ²zµ{¦¡ -2 AFS ·§Æ[ -3 AFS¡G·§Æ[=AFS__Overview -3 AFS Cell=DCE_Cells -2 AFS ¦øªA¾¹ºÞ²zµ{¦¡ -3 AFS ¦øªA¾¹ºÞ²zµ{¦¡¡G·§Æ[=DFS_Server_Manager -2 Ų§O AFS -3 ¹ï AFS Ų§O=To_Obtain_DCE_Credentials -3 ¿ï¾Ü­nºÞ²zªº AFS Cell=To_Choose_a_DCE_Cell_to_Administer -2 AFS ¦øªA¾¹ -3 ¦øªA¾¹¡G·§Æ[=Servers__An_Overview -3 ºûÅ@ AFS ¦øªA¾¹=Setting_Up_and_Maintaining_DFS_Servers -3 ºÊµø¦øªA¾¹¤l¶°=Monitoring_Server_Subsets -3 ¦øªA¾¹¤º®e=Server_Properties -3 ¦øªA¾¹Äµ§i=Server_Warnings -3 ¦øªA¾¹ªººÞ²zªÌ -4 ¦øªA¾¹ªººÞ²zªÌ¡G·§Æ[=Administrators_for_a_Server -4 ¦b¦øªA¾¹ªººÞ²zªÌ²M³æ¤¤·s¼W©Î²¾°£¨Ï¥ÎªÌ=To_Edit_an_Administrative_List -3 ¦øªA¾¹¥[±Kª÷Æ_ -4 ¦øªA¾¹¥[±Kª÷Æ_¡G·§Æ[=Server_Encryption_Keys -4 ·s¼W¦øªA¾¹¥[±Kª÷Æ_=To_Add_a_New_Server_Key -4 ²¾°£¦øªA¾¹¥[±Kª÷Æ_=To_Remove_a_Server_Encryption_Key -3 ¦øªA¾¹ÀÉ®× -4 ¦b¦øªA¾¹¤W¦w¸Ë·sÀÉ®×=To_Install_New_Files_on_a_Server -4 ¦b¦øªA¾¹¤W¦w¸Ë«eª©µ{¦¡ÀÉ®×=To_Install_Former_Versions_of_Binary_Files_on_a_Server -4 ±q¦øªA¾¹¤¤§R§ïÀÉ®×=To_Prune_Files_from_a_Server -4 ¨ú±oÀɮפé´Á=To_Get_File_Dates -3 ¦P¨B¦øªA¾¹¤Wªº VLDB -4 ¦P¨B¤Æ VLDB=Synchronizing_the_FLDB -4 ¦P¨B¦øªA¾¹¤Wªº VLDB=To_Synchronize_the_FLDB -2 AFS ¤À³Î°Ï -3 ¤À³Î°Ï¡G·§Æ[=Partitions__An_Overview -3 ¤À³Î°Ï¤º®e=Partition_Properties -3 ¤À³Î°Ïĵ§i=Partition_Warnings -2 AFS ®eÅé -3 ®eÅé¡G·§Æ[=Filesets__An_Overview -3 ¤£¦Pªº®eÅéÃþ«¬ =Read__Write_and_Read_Only_Filesets -3 ®eÅé¦ì¸m¸ê®Æ®w (VLDB)=FLDB__Fileset_Location_Database_ -3 ®eÅ餺®e=Fileset_Properties -3 «Ø¥ß®eÅé =To_Create_a_Fileset -3 §ó¦W®eÅé =To_Rename_a_Fileset -3 §R°£®eÅé =To_Delete_a_Fileset -3 ²¾°Ê®eÅé -4 ²¾°Ê®eÅé¡G·§Æ[=Moving_Filesets -4 ²¾°Ê®eÅé =To_Move_a_Fileset -3 «Ø¥ß®eÅ骺³Æ¥÷ª©¥» -4 «Ø¥ß®eÅ骺³Æ¥÷ª©¥»=IDH_SVRMGR_CLONE_OVERVIEW -4 «Ø¥ß¦h­Ó®eÅ骺³Æ¥÷ª©¥»=To_Clone_Multiple_Filesets -3 Âê©w»P¸Ñ°£Âê©w®eÅé -4 Âê©w»P¸Ñ°£Âê©w VLDB ¶µ¥Ø=Locking_and_Unlocking_Filesets -4 ¨M©w®eÅé¬O§_¤wÂê©w=To_Determine_Whether_a_Fileset_Entry_is_Locked -4 Âê©w®eÅé=To_Lock_a_Fileset -4 ¸Ñ°£Âê©w®eÅé=To_Unlock_a_Fileset -3 ¶É¥X»P´_­ì®eÅé -4 ¶É¥X®eÅé=Dumping_and_Restoring_Filesets -4 ¶É¥X®eÅé =To_Dump_a_Fileset -4 ´_­ì®eÅé=Restoring_Filesets -4 ´_­ì»¼¼W©Ê®eÅé¶É¥X=Restoring_Multiple_Incremental_Dumps_of_a_Fileset -4 ´_­ì¶É¥XÀÉ=To_Restore_a_Dump_File_to_a_New_Fileset -3 ®eÅéĵ§i=Fileset_Warnings -2 AFS ®eÅ齯¥» -3 ½Æ»s®eÅé=Replicating_Filesets -3 «Ø¥ß·sªº®eÅ齯¥»¦ì¸m=To_Create_a_New_Fileset_Replication_Site -3 ½Æ»s®eÅé =To_Replicate_a_Fileset -3 §ó·s®eÅ齯¥»=Updating_Replicas -2 AFS ªA°È -3 ªA°È¡G·§Æ[=Services__An_Overview -3 ³]¸m¤ÎºûÅ@ AFS ªA°È=Setting_Up_and_Maintaining_DFS_Services -3 ªA°È¤º®e=Service_Properties -3 «Ø¥ßªA°È=To_Create_a_Service -3 §R°£ªA°È=To_Delete_a_Service -3 ±Ò°ÊªA°È=To_Start_a_Service -3 °±¤îªA°È=To_Stop_a_Service -3 ­«·s±Ò°ÊªA°È=To_Restart_a_Service -3 ³]©w BOS ªA°È­«·s±Ò°Ê¤é´Á=To_Set_BOS_Service_Restart_Dates_and_Times -3 À˵øªA°Èª¬ºA»P©ú²Ó=To_View_Service_Status_and_Details -3 ªA°È¤é»xÀÉ -4 ¤é»xÀÉ=Log_Files -4 À˵øªA°È¤é»xÀÉ=To_View_Service_Log -2 ´©±Ï®eÅé -3 ´©±Ï®eÅé¡G·§Æ[=Salvaging_Volumes -3 ´©±ÏÀɮצøªA¾¹¤Wªº©Ò¦³®eÅé=To_Salvage_all_Volumes_on_a_File_Server -3 ´©±Ï¤À³Î°Ï¤Wªº©Ò¦³®eÅé=To_Salvage_all_Volumes_on_a_Partition -3 ´©±Ï®eÅé=To_Salvage_a_Volume -2 AFS «ü¥O»¡©ú -3 AFS UNIX ¨Ï¥ÎªÌªº«ü¥O»¡©ú=UNIX_Command_Reference -3 AFS «ü¥O´£¥Ü«ü¥O=AFS_Command_Prompt_Commands - \ No newline at end of file diff --git a/src/WINNT/doc/help/zh_TW/taafsusrmgr.cnt b/src/WINNT/doc/help/zh_TW/taafsusrmgr.cnt deleted file mode 100755 index e9d925f9f..000000000 --- a/src/WINNT/doc/help/zh_TW/taafsusrmgr.cnt +++ /dev/null @@ -1,67 +0,0 @@ -:Base TAAFSUSRMGR.HLP -:Title IBM AFS ±b¤áºÞ²zµ{¦¡ -1 AFS ±b¤áºÞ²zµ{¦¡ -2 AFS ¨Ï¥ÎªÌ±b¤á -3 «Ø¥ß AFS ±b¤á -4 «Ø¥ß AFS ¨Ï¥ÎªÌ±b¤á=Creating_User_Entries -4 «Ø¥ß·sªº AFS ¨Ï¥ÎªÌ±b¤á=To_create_a_single_user_account -3 ±K½XŲ§O©M¦w¥þ©Ê -4 ¼W¶i±K½X¡þŲ§O¦w¥þ=Improving_Password_Authentication_Security -4 ­­¨î¨Ï¥ÎªÌ³sÄò¥¢±Ñªºµn¤J¹Á¸Õ¼Æ=To_limit_the_number_of_consecutive_failed_login_attempts -4 ¸Ñ°£Âê©w¤wÂê©wªº¨Ï¥ÎªÌ±b¤á=To_unlock_a_locked_user_account -4 ³]©w AFS ¨Ï¥ÎªÌ±b¤áªº±K½X¥Í©R¶g´Á=To_set_password_lifetime -4 ­­¨î¨Ï¥ÎªÌ­«ÂШϥαK½X=To_restrict_reuse_of_passwords -3 Åܧó±K½X -4 Åܧó±K½X=Changing_Passwords -4 Åܧó¨Ï¥ÎªÌªº AFS ±K½X=To_change_a_password_in_the_Authentication_Database -3 ²¾°£¨Ï¥ÎªÌ±b¤á -4 ²¾°£¨Ï¥ÎªÌ±b¤á=Removing_User_Accounts -4 §R°£ AFS ¨Ï¥ÎªÌ±b¤á=To_remove_a_user_account -2 AFS ¸s²Õ -3 Ãö©ó«OÅ@¸ê®Æ®w=AFS_Protection_Database -3 «OÅ@¸ê®Æ®w¶µ¥Ø=Protection_Database_Entries -3 ¨Ï¥Î¸s²Õ -4 ¦³®Ä¨Ï¥Î¸s²Õ=Using_Groups_Effectively -4 ¨Ï¥ÎµL¦r­º AFS ¸s²Õ=Using_Prefix_Less_Groups -4 ¦b¸s²Õ¤º©ñ¸m IP ¦ì§}=Placing_Machines_in_Groups -4 ¼Ð·Ç¨t²Î¸s²Õ=The_Standard_System_Groups -4 ¦C¥ÜÃö©ó¸s²Õªº¸ê°T -5 ¦C¥ÜÃö©ó¸s²Õªº¸ê°T=Listing_Information_about_Groups -5 À˵ø AFS ¸s²Õ¦¨­ûªº²M³æ=To_list_the_members_of_a_group -5 À˵øÃö©ó AFS ¸s²Õªº¸ê°T=To_examine_a_Protection_Database_group_entry -5 À˵ø AFS ¸s²Õ¾Ö¦³¤§¸s²Õªº²M³æ=To_list_the_groups_that_a_group_owns -4 ¦C¥ÜÃö©ó¨Ï¥ÎªÌ»P¾÷¾¹¶µ¥Øªº¸s²Õ¬ÛÃö¸ê°T -5 ¦C¥ÜÃö©ó¨Ï¥ÎªÌ»P¾÷¾¹¶µ¥Øªº¸s²Õ¬ÛÃö¸ê°T=Listing_Group_Related_Information_about_Users_and_Machine_Entries -5 À˵ø AFS ¨Ï¥ÎªÌ©ÒÄݪº¸s²Õ²M³æ=To_examine_a_Protection_Database_entry_for_a_user_or_machine -5 À˵ø AFS ¨Ï¥ÎªÌ¾Ö¦³ªº¸s²Õ²M³æ=To_view_a_list_of_the_groups_that_an_AFS_user_owns -5 À˵ø IP ¦ì§}±b¤á¾Ö¦³ªº¸s²Õ²M³æ=To_view_a_list_of_the_groups_that_an_IP_address_account_owns -5 À˵ø IP ¦ì§}±b¤á©ÒÄݪº¸s²Õ²M³æ=To_view_a_list_of_the_groups_to_which_an_IP_address_account_belongs -4 «Ø¥ß¨Ï¥ÎªÌ¶µ¥Ø -5 «Ø¥ß AFS ¨Ï¥ÎªÌ±b¤á=Creating_User_Entries -5 «Ø¥ß·sªº AFS ¨Ï¥ÎªÌ±b¤á=To_create_a_single_user_account -4 «Ø¥ß¾÷¾¹¶µ¥Ø -5 «Ø¥ß IP ¦ì§}¶µ¥Ø=Creating_Machine_Entries -5 ¦b AFS «OÅ@¸ê®Æ®w¤¤«Ø¥ß IP ¦ì§}±b¤á=To_create_a_single_machine_entry_in_the_Protection_Database -4 «Ø¥ß¼Ð·Ç»PµL¦r­º¸s²Õ -5 «Ø¥ß¼Ð·Ç»PµL¦r­º AFS ¸s²Õ=Creating_Regular_and_Prefix_Less_Groups -5 «Ø¥ß·sªº¼Ð·Ç AFS ¸s²Õ=To_create_a_single_regular_group_entry -5 «Ø¥ß·sªºµL¦r­º AFS ¸s²Õ=To_create_a_single_prefix_less_group_entry -4 ·s¼W¦¨­û¨ì¸s²Õ¥H¤Î±q¸s²Õ¤¤²¾°£¦¨­û -5 ·s¼W¦¨­û¨ì¸s²Õ¥H¤Î±q¸s²Õ¤¤²¾°£¦¨­û=Adding_Members_to_Groups_and_Removing_Them_from_Groups -5 ·s¼W¨Ï¥ÎªÌ©Î IP ¦ì§}±b¤á¨ì¸s²Õ=To_add_users_and_machines_to_groups -5 ²¾°£ AFS ¸s²Õ¤¤ªº¨Ï¥ÎªÌ¡BIP ¦ì§}±b¤á©Î¸s²Õ=To_remove_users_and_machines_from_groups -3 ±q«OÅ@¸ê®Æ®w¤¤§R°£¶µ¥Ø -4 ±q«OÅ@¸ê®Æ®w¤¤§R°£¶µ¥Ø=Deleting_Entries_from_the_Protection_Database -4 §R°£ AFS ¸s²Õ=To_delete_user_and_group_entries -3 Åܧ󶵥تº©Ò¦³¤H -4 Åܧó AFS ¸s²Õªº©Ò¦³¤H=Changing_the_Owner_of_an_Entry -4 Åܧó©Ò¦³Åvªº¦WºÙÅܧó§t·N=The_Name_Changing_Implications_of_Changing_Ownership -4 Åܧó AFS ¸s²Õªº©Ò¦³¤H=To_change_the_owner_of_a_group_entry -3 Åܧ󶵥ئWºÙ -4 Åܧó AFS ¸s²Õªº¦WºÙ=Changing_the_Name_of_an_Entry -4 Åܧó AFS ¸s²Õªº¦WºÙ=To_change_the_name_of_a_group_entry -3 Åܧó¸s²Õ«Ø¥ß°tÃB -4 Åܧó¸s²Õ«Ø¥ß°tÃB=Changing_Group_Creation_Quota -4 À˵ø AFS ¨Ï¥ÎªÌªº¸s²Õ«Ø¥ß°tÃB=To_examine_group_creation_quota -4 Åܧó AFS ¨Ï¥ÎªÌªº¸s²Õ«Ø¥ß°tÃB=To_change_group_creation_quota - \ No newline at end of file diff --git a/src/WINNT/doc/install/Documentation/de_DE/README.txt b/src/WINNT/doc/install/Documentation/de_DE/README.txt deleted file mode 100755 index dad01b9b1..000000000 --- a/src/WINNT/doc/install/Documentation/de_DE/README.txt +++ /dev/null @@ -1,62 +0,0 @@ -Copyright 2000, International Business Machines Corporation and others. -All Rights Reserved. - -This software has been released under the terms of the IBM Public -License. For details, see the LICENSE file in the top-level source -directory or online at http://www.openafs.org/dl/license10.html - -All Rights Reserved -*************************************************************** - -IBM AFS for Windows, version 3.6 - -*************************************************************** -The README.txt file includes AFS for Windows product notes, which -can possibly identify specific limitations and restrictions -associated with this release of AFS for Windows. - - - -AFS Partitions No Longer Need to Reside On Empty NTFS Volumes - -On Windows NT machines, any NTFS volume can be designated as an AFS -partition. Previously, an NTFS volume containing any data other than -the Windows Recycler could not be designated as an AFS partition. - - - -Encryption Not Supported in Simplified Chinese Version of Windows 98 - -The Simplified Chinese version of Microsoft Windows 98 does not support -encryption, which is needed to transmit AFS passwords from AFS Light to -the AFS Light Gateway. In order for AFS Light users to obtain AFS tokens -when using the Simplified Chinese version of Microsoft Windows 98, -encryption in AFS must be disabled. -To disable encryption in AFS, add the following line to your Windows -autoexec.bat file: -set AFS_RPC_ENCRYPT=OFF -Note that disabling encryption introduces a potential security risk -because AFS passwords are transmitted to the AFS Light Gateway in an -unencrypted form when tokens are obtained. - - - -Windows NT with Service Pack 6 Is Now Supported - -The Client, Server, and Control Center components of AFS for Windows can -be installed on Microsoft Windows NT 4.0 with Service Pack 4, Service Pack 5, -or Service Pack 6. - - - -AFS for Windows Supplemental Documentation - -The Supplemental Documentation component of AFS for Windows is only available -online if the AFS Supplemental Documentation option was chosen when AFS for Windows -was installed on your system. (AFS Supplemental Documentation is not an option when -installing AFS Light.) Note that documentation is also available directly -from the AFS for Windows CD-ROM, in the CD:\Documentation directory, where CD -is the letter of your CD-ROM drive. - - -Refer to the AFS for Windows Release Notes for additional product information. diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg000.htm b/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg000.htm deleted file mode 100755 index a23941ed2..000000000 --- a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg000.htm +++ /dev/null @@ -1,51 +0,0 @@ - - -Erste Schritte - - - - - - - - - - - - -

Erste Schritte

- -AFS für Windows
-Erste Schritte
-Version 3.6 -

SC12-2832-00 -

CT6Q8DE - -

-

-
-


-
-

Erste Ausgabe (April 2000) -

-Diese Online-Version ist eine Übersetzung des Handbuchs
-AFS for Windows, Quick Beginnings, -
-IBM Form SC09-4564-00, -

herausgegeben von International Business Machines Corporation, USA -

(C) Copyright International Business Machines Corporation 2000 -

(C) Copyright IBM Deutschland Informationssysteme GmbH 2000 -

Möglicherweise sind nicht alle in dieser Übersetzung aufgeführten Produkte -in Deutschland angekündigt und verfügbar; vor Entscheidungen empfiehlt -sich der Kontakt mit der zuständigen IBM Geschäftsstelle. -

Änderungen des Textes bleiben vorbehalten. - -
-


[ Seitenanfang | Nächste Seite | Index ] - - -
© IBM Corporation 2000.
- - - - \ No newline at end of file diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg002.htm b/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg002.htm deleted file mode 100755 index b0530497a..000000000 --- a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg002.htm +++ /dev/null @@ -1,63 +0,0 @@ - - -Erste Schritte - - - - - - - - - - - - -

Erste Schritte

-

Inhaltsverzeichnis

-

IBM AFS für Windows Erste Schritte
-

-
  • Einführung -
  • Übersicht über dieses Dokument - -
  • Zielgruppe -
  • -
  • -
  • Installieren von AFS für Windows - -
  • Die Komponenten von AFS für Windows -
  • Installationsoptionen -
  • Erweitern einer früheren Version -
  • Vorgehensweise zum Installieren von AFS für Windows -
  • Änderungen am System -
  • -
  • Die Dokumentation zu AFS für Windows - -
  • Das Verzeichnis für die Online-Dokumentation -
  • Das Dokumentationsverzeichnis auf der CD-ROM -
  • Online-Hilfe -
  • -
  • Konfigurieren von AFS für Windows - -
  • Vorgehensweise zum Konfigurieren von AFS Client -
  • Vorgehensweise zum Konfigurieren von AFS Client als AFS Light Gateway -
  • Vorgehensweise zum Konfigurieren von AFS Light -
  • Vorgehensweise zum Konfigurieren von AFS Server -
  • Vorgehensweise zum Konfigurieren von AFS Control Center -
  • -
  • Deinstallieren von AFS für Windows - -
  • Neuinstallieren und Erweitern -
  • Deinstallationsvoraussetzungen -
  • Vorgehensweise zum Deinstallieren von AFS für Windows -
  • Änderungen am System -
  • -

    Index
    -

    -


    [ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ] - - -
    © IBM Corporation 2000.
    - - - diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg003.htm b/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg003.htm deleted file mode 100755 index e7bb497bb..000000000 --- a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg003.htm +++ /dev/null @@ -1,1317 +0,0 @@ - - -Erste Schritte - - - - - - - - - - - - -

    Erste Schritte

    -

    IBM AFS für Windows Erste Schritte

    -

    Einführung

    - - -

    AFS ist ein Unternehmensdateisystem, das durch einen -gemeinsam benutzten Dateibereich konsistenten Zugriff auf Dateien -bietet. Indem es die lokalen Dateisysteme mehrerer Datei-Server -zusammenführt, stellt AFS einen einzigen, von Maschinengrenzen unabhängigen -Dateibereich bereit. Die Dateien werden auf unterschiedlichen Maschinen -im Netzwerk gespeichert, sind aber von allen Maschinen im Unternehmen aus -zugänglich. -

    IBM AFS für Windows, Version 3.6, erweitert -Microsoft Windows-Betriebssysteme um die leistungsstarken -Funktionen von AFS. -


    Übersicht über dieses Dokument

    -

    - -In diesem Dokument werden die Installationsvoraussetzungen beschrieben, -detaillierte Anweisungen zum Installieren, Konfigurieren und Deinstallieren -von AFS für Windows gegeben und die Änderungen erklärt, die während der -Installation und Deinstallation am System vorgenommen werden. Darüber -hinaus wird beschrieben, welche Dokumentation zu AFS für Windows verfügbar -ist. -

    Zielgruppe

    -

    - -Dieses Dokument richtet sich an Systemadministratoren und Benutzer, die für -die Installation und Konfiguration der in AFS für Windows enthaltenen Produkte -verantwortlich sind. In diesem Dokument wird davon ausgegangen, daß der -Systemadministrator mit der Systemverwaltung im allgemeinen vertraut ist und -der Benutzer die grundlegenden Begriffe und Funktionen der Microsoft -Windows-Betriebssysteme kennt. -

    -

    Dieses Dokument hat folgenden Aufbau: -

      -

    • Im Abschnitt Installieren von AFS für Windows werden die Installationsmöglichkeiten für die -AFS-Komponenten beschrieben, das Verfahren für die Installation der in AFS für -Windows enthaltenen Produkte erklärt und die Änderungen erläutert, die das -System durch den Installationsvorgang erfährt. -
    • Im Abschnitt Die Dokumentation zu AFS für Windows erfahren Sie, welche verschiedenen Dokumentationsarten für -AFS für Windows verfügbar sind und wie Sie auf diese Dokumentationen zugreifen -können. -
    • Im Abschnitt Konfigurieren von AFS für Windows werden die Verfahren für die Konfiguration der Produkte in -AFS für Windows erklärt. -
    • Im Abschnitt Deinstallieren von AFS für Windows werden die Voraussetzungen für die Deinstallation, das -Verfahren zur Deinstallation der Produkte von AFS für Windows und die -Änderungen beschrieben, die bei der Deinstallation vom System vorgenommen -werden. -
    -

    Installieren von AFS für Windows

    -

    In diesem Abschnitt werden die Installationsmöglichkeiten für die -AFS-Komponenten, das Verfahren für die Installation von AFS für Windows sowie -die Änderungen beschrieben, die beim Installationsvorgang am System -durchgeführt werden. -

    Die Komponenten von AFS für Windows

    -

    - -AFS für Windows, Version 3.6, umfaßt die folgenden Komponenten: -

      -

    • - - - -AFS Server -

      Der AFS Server führt AFS-Server-Prozesse aus und enthält den Assistenten -AFS Server Configuration, der die Installation vereinfacht. -

    • - - - -AFS Control Center -

      Das AFS Control Center enthält zwei leistungsstarke, auf einer GUI -(Graphical User Interface, grafische Benutzerschnittstelle) basierende Tools, -die den AFS-Systemadministrator bei der Verwaltung der AFS-Zellen -unterstützen: den AFS Server Manager und den AFS Account Manager. -

    • - - - -AFS Client -

      Der AFS Client bietet direkten Zugriff auf den AFS-Dateibereich und -ermöglicht Benutzern dadurch die Verwaltung von Dateien und Verzeichnissen in -AFS. Er enthält außerdem das AFS Light Gateway. -

    • - - - -AFS Light -

      AFS Light bietet über eine AFS Light Gateway-Maschine Zugriff auf den -AFS-Dateibereich und ermöglicht Benutzern so die Verwaltung von Dateien und -Verzeichnissen in AFS. -

    • - - AFS Supplemental Documentation -

      AFS Supplemental Documentation bietet zusätzliche Informationen zur -AFS-Systemadministration und umfaßt folgende Dokumente: IBM AFS -Administration Guide und IBM AFS Administration -Reference. -

    -

    Installationsoptionen

    -

    - - - -Sie können die Komponenten von AFS für Windows bei der Installation in -unterschiedlicher Weise kombinieren, je nachdem, welches -Windows-Betriebssystem Sie verwenden. Einzelheiten zu den speziellen -Softwarevoraussetzungen für jede Komponente von AFS für Windows finden Sie in -den IBM AFS for Windows Release Notes. Beachten Sie, daß Sie -bei Installation von AFS Server auch AFS Client installieren müssen, es sei -denn, AFS Client, Version 3.6, ist bereits auf der Maschine -installiert. Gehen Sie nach dem Installationsverfahren im Abschnitt Vorgehensweise zum Installieren von AFS für Windows vor, ungeachtet dessen, welche Komponenten Sie -installieren. -
    Anmerkung: - - - - - -Sie haben die Möglichkeit, das Konfigurationsprogramm von AFS für Windows so -zu ändern, daß nur die Client-Komponente installiert wird. Wird das -Konfigurationsprogramm auf diese Weise modifiziert, kann der Benutzer außer -dem AFS Client keine anderen Komponenten installieren. Wenn Sie nur den -Client installieren möchten, erstellen Sie die Datei -setup.co im gleichen Verzeichnis wie die anderen -Installationsdateien. Das Konfigurationsprogramm erlaubt dann nur die -Installation von AFS Client. Beachten Sie, daß der Inhalt der Datei -setup.co irrelevant ist. Gehen Sie nach dem -Installationsverfahren im Abschnitt Vorgehensweise zum Installieren von AFS für Windows vor, ungeachtet dessen, welche Installation Sie -durchführen. -
    -

    Erweitern einer früheren Version

    -

    - - - -Auf einer Windows NT-Maschine ist es nicht erforderlich, zum Zwecke -der Softwareerweiterung die Komponenten von AFS für Windows zu -deinstallieren. Sie können das neue Release von AFS für Windows auf dem -System installieren, ohne die bisherige Software entfernen oder -dekonfigurieren zu müssen. Gehen Sie nach dem Installationsverfahren im -Abschnitt Vorgehensweise zum Installieren von AFS für Windows vor, um AFS für Windows zu erweitern. Während des -Installationsvorgangs wird die ältere Version der AFS-Komponente erweitert, -die AFS-Konfigurationsdaten bleiben erhalten. -

    Auf einem Windows 95- oder Windows 98-Computer müssen Sie die bisher -installierte Komponente AFS Light deinstallieren, wie im Abschnitt Vorgehensweise zum Deinstallieren von AFS für Windows beschrieben, bevor Sie AFS Light erweitern. -

    Beachten Sie, daß das Installations-Tool von AFS für Windows -nicht die Installation von AFS-Komponenten mit unterschiedlichen -Versionsnummern erlaubt. Wenn auf einer Maschine mehrere Komponenten -von AFS für Windows installiert sind, können Sie eine einzelne Komponente nur -erweitern, wenn Sie gleichzeitig auch alle anderen Komponenten -erweitern. -

    Vorgehensweise zum Installieren von AFS für Windows

    - - - - - - - -

    Lesen Sie vor dem Installieren von AFS für Windows die ausführliche -Beschreibung der Installationsvoraussetzungen in den IBM AFS for Windows -Release Notes. Falls gegenwärtig andere Windows-Anwendungen aktiv -sind, empfiehlt es sich, diese zu beenden, bevor Sie AFS für Windows -installieren. -

      -

    1. Legen Sie die Installations-CD-ROM für AFS für Windows in das -CD-ROM-Laufwerk ein. -
    2. Führen Sie das Programm setup von AFS für Windows aus, indem -Sie eine der folgenden Methoden verwenden: -
        -

      • Wählen Sie im Menü Start den Befehl -Ausführen. Geben Sie -Laufwerk:\setup ein, wobei -Laufwerk der Laufwerkbuchstabe des CD-ROM-Laufwerks ist. -Klicken Sie auf OK. -
      • Wählen Sie im Windows-Explorer das CD-ROM-Laufwerk aus, und -doppelklicken Sie auf das Programm setup.exe. -
      -
    3. Das Dialogfenster Willkommen wird angezeigt. Klicken Sie auf die -Schaltfläche Weiter, um die Installation fortzusetzen. -
    4. Das Dialogfenster Komponenten auswählen wird angezeigt. -
        -

      • Wählen Sie im Feld Komponenten die Komponenten von AFS für -Windows aus, die installiert oder erweitert werden sollen. -Informationen zu den Komponentenkombinationen, die Sie auf einer -Windows-Maschine installieren können, finden Sie im Abschnitt Installationsoptionen. Beachten Sie, daß Sie bei Installation von AFS -Server auch AFS Client installieren (bzw. erweitern) müssen, es sei -denn, AFS Client, Version 3.6, ist bereits auf dem System -installiert. -
      • Im Feld Zielordner wird das Standardlaufwerk und -verzeichnis -angegeben, in dem die ausgewählten Komponenten installiert werden. Das -Standardlaufwerk ist das Laufwerk, in dem Windows installiert ist. Das -Standardverzeichnis auf diesem Laufwerk ist -\Programme\Ibm\Afs. Wenn Sie ein anderes Laufwerk und/oder -Verzeichnis auswählen möchten, klicken Sie auf die Schaltfläche -Durchsuchen. -
        Anmerkung:Wenn Sie eine frühere Version von AFS für Windows erweitern oder AFS für -Windows erneut installieren, muß das ausgewählte Installationsverzeichnis das -gleiche sein wie das Installationsverzeichnis, das Sie für die bisher -installierte Version verwendet haben. -
        -
      -

      Klicken Sie auf die Schaltfläche Weiter, um die Installation -fortzusetzen. -

    5. Die Anwendungsdateien für die ausgewählten Komponenten von AFS für Windows -werden auf dem System installiert. Nach Abschluß der Installation wird -das Dialogfenster Installation beendet angezeigt, in dem Sie darauf -hingewiesen werden, daß Sie das System neustarten müssen, damit Sie die -installierten AFS-Produkte nutzen können. Klicken Sie auf Computer -neu starten und dann auf die Schaltfläche -Fertigstellen. Das System wird heruntergefahren und dann -erneut gestartet. -

      Die Installation von AFS für Windows ist abgeschlossen. -

    -

    Änderungen am System

    -

    - -In diesem Abschnitt werden die Änderungen erklärt, die durch die Installation -der einzelnen Komponenten von AFS für Windows am System vorgenommen -werden. Die Informationen in diesem Abschnitt beruhen auf den -Standard-Installationseinstellungen. -

    Änderungen am System durch Installation des AFS Clients

    -

    Wenn Sie AFS Client für Windows NT installieren, werden folgende -Änderungen am System durchgeführt: -

      -

    • Im Menü Start wird die Programmgruppe IBM AFS mit -den folgenden Anwendungen erstellt: -
      -

      Der Programmeintrag Dokumentation bietet Zugriff auf die -AFS-Online-Dokumentation, die im Lieferumfang von AFS für Windows enthalten -ist. -

      Über die Programmuntergruppe Client haben Sie Zugriff auf das -Merkmalfenster und die Online-Hilfe von AFS Client. -

      -
    • Das Menü AFS wird dem Kontextmenü des Windows NT-Explorers -hinzugefügt. -
    • Ein Dokumentationsverzeichnis wird erstellt, und die Online-Dokumente -IBM AFS für Windows Erste Schritte und IBM AFS for Windows -Release Notes werden in dem Verzeichnis plaziert. Dieses befindet -sich unter \Programme\Ibm\Afs\Documentation. -
    • Der Eintrag AFS-Berechtigungen wird der Programmgruppe -Autostart hinzugefügt. Das Symbol AFS Client wird -beim Starten auf der Task-Leiste angezeigt. -
    • Die Installationsverzeichnisse, in denen das Konfigurationsprogramm die -AFS-Binärdateien, -Symbole und -Hilfedateien installiert, werden -erstellt. Die Standardverzeichnisse sind -\Programme\Ibm\Afs\Client\Program und -\Programme\Ibm\Afs\Common. -
    • Der AFS Client wird als Service registriert. -
    • Das Dienstprogramm AFS Client Configuration wird installiert, und das -Symbol AFS Client Configuration wird der Systemsteuerung -hinzugefügt, indem die Datei afs_cpa.cpl im Verzeichnis -\Windows-Standard\system32 plaziert wird -(Windows-Standard ist hierbei das Windows-Verzeichnis). -
    • Die Datei afsdcell.ini wird im Windows-Verzeichnis und -im Verzeichnis \Programme\Ibm\Afs\Common plaziert. Wenn Sie -eine frühere Version des AFS Clients erweitert haben, wird die AFS -Client-Zellendatenbank (afsdcell.ini) im Windows-Verzeichnis -nicht ersetzt. -
    • Die Windows NT-Registrierungsdatenbank wird modifiziert, indem Einträge -für den AFS Client hinzugefügt werden. -
    -

    Änderungen am System durch Installation von AFS Light

    -

    Wenn Sie AFS Light für Windows 95 bzw. Windows 98 installieren, -werden folgende Änderungen am System durchgeführt: -

      -

    • Eine Programmgruppe IBM AFS mit den folgenden Anwendungen wird -erstellt: -
      -

      Der Programmeintrag Dokumentation bietet Zugriff auf die -AFS-Online-Dokumentation, die im Lieferumfang von AFS für Windows enthalten -ist. -

      Über die Programmuntergruppe Light haben Sie Zugriff auf das -Merkmalfenster und die Online-Hilfe von AFS Light. -

      -
    • Das Menü AFS wird dem Kontextmenü des Windows-Explorers -hinzugefügt. -
    • Ein Dokumentationsverzeichnis wird erstellt, und die Online-Dokumente -IBM AFS für Windows Erste Schritte und IBM AFS for Windows -Release Notes werden in dem Verzeichnis plaziert. Dieses befindet -sich unter \Programme\Ibm\Afs\Documentation. -
    • Die Installationsverzeichnisse, in denen das Konfigurationsprogramm die -AFS-Binärdateien, -Symbole und -Hilfedateien installiert, werden -erstellt. Die Standardverzeichnisse sind -\Programme\Ibm\Afs\Client\Program und -\Programme\Ibm\Afs\Common. -
    • Das Dienstprogramm AFS Light Configuration wird installiert, und das -Symbol AFS Light Configuration wird der Systemsteuerung -hinzugefügt, indem die Datei afs_cpa.cpl im Verzeichnis -\Windows-Standard\system plaziert wird -(Windows-Standard ist hierbei das Windows-Verzeichnis). -
    • Die Datei afsdcell.ini wird im Windows-Verzeichnis und -im Verzeichnis \Programme\Ibm\Afs\Common plaziert. -
    • Die Windows-Registrierungsdatenbank wird modifiziert, indem Einträge für -AFS Light hinzugefügt werden. -
    -

    Änderungen am System durch Installation von AFS Server

    -

    Wenn Sie AFS Server für Windows NT installieren, werden folgende -Änderungen am System durchgeführt: -

      -

    • Im Menü Start wird die Programmgruppe IBM AFS mit -den folgenden Anwendungen erstellt: -
      -

      Der Programmeintrag Dokumentation bietet Zugriff auf die -AFS-Online-Dokumentation, die im Lieferumfang von AFS für Windows enthalten -ist. -

      Über die Programmuntergruppe Server haben Sie Zugriff auf den -Assistenten AFS Server Quick-Start. -

      -
    • Ein Dokumentationsverzeichnis wird erstellt, und die Online-Dokumente -IBM AFS für Windows Erste Schritte und IBM AFS for Windows -Release Notes werden in dem Verzeichnis plaziert. Dieses befindet -sich unter \Programme\Ibm\Afs\Documentation. -
    • Die Installationsverzeichnisse, in denen das Konfigurationsprogramm die -AFS-Binärdateien, -Symbole und -Hilfedateien installiert, werden -erstellt. Die Standardverzeichnisse sind -\Programme\Ibm\Afs\Server\usr\afs\bin und -\Programme\Ibm\Afs\Common. -
    • Der AFS Server wird als Service registriert. -
    • Die Anwendung AFS Server Configuration wird installiert, und das Symbol -AFS Server Configuration wird der Systemsteuerung hinzugefügt, -indem die Datei afsserver.cpl im Verzeichnis -\Windows-Standard\system32 plaziert wird -(Windows-Standard ist hierbei das Windows-Verzeichnis). -
    • Die Windows NT-Registrierungsdatenbank wird modifiziert, indem Einträge -für den AFS Server hinzugefügt werden. -
    -

    Änderungen am System durch Installation des AFS Control Center

    -

    Wenn Sie das AFS Control Center für Windows NT installieren, werden -folgende Änderungen am System durchgeführt: -

      -

    • Im Menü Start wird die Programmgruppe IBM AFS mit -den folgenden Anwendungen erstellt: -
      -

      Der Programmeintrag Dokumentation bietet Zugriff auf die -AFS-Online-Dokumentation, die im Lieferumfang von AFS für Windows enthalten -ist. -

      Über die Programmuntergruppe Control Center haben Sie Zugriff -auf den Account Manager und den Server Manager. -

      -
    • Ein Dokumentationsverzeichnis wird erstellt, und die Online-Dokumente -IBM AFS für Windows Erste Schritte und IBM AFS for Windows -Release Notes werden in dem Verzeichnis plaziert. Dieses befindet -sich unter \Programme\Ibm\Afs\Documentation. -
    • Die Installationsverzeichnisse, in denen das Konfigurationsprogramm die -AFS-Binärdateien, -Symbole und -Hilfedateien installiert, werden -erstellt. Die Standardverzeichnisse sind -\Programme\Ibm\Afs\Control Center und -\Programme\Ibm\Afs\Common. -
    • Das Dienstprogramm Merkmale für AFS Control Center wird installiert, und -das Symbol AFS Control Center wird der Systemsteuerung hinzugefügt, -indem die Datei afs_cpa.cpl im Verzeichnis -\Windows-Standard\system32 plaziert wird -(Windows-Standard ist hierbei das Windows-Verzeichnis). Das -Symbol wird der Systemsteuerung hinzugefügt, wenn ausschließlich das AFS -Control Center auf dem System installiert wird. -
    • Die Datei afsdcell.ini wird im Windows-Verzeichnis und -im Verzeichnis \Programme\Ibm\Afs\Common plaziert. -
    • Die Windows NT-Registrierungsdatenbank wird modifiziert, indem Einträge -für das AFS Control Center hinzugefügt werden. -
    -

    Änderungen am System durch Installation der Komponente AFS Supplemental Documentation

    -

    Wenn Sie AFS Supplemental Documentation installieren, werden folgende -Änderungen am System durchgeführt: -

      -

    • Im Menü Start wird die Programmgruppe IBM AFS mit -dem Eintrag Dokumentation erstellt. -
    • Die folgenden Dokumente zur Systemadministration werden auf dem Computer -installiert: IBM AFS Administration Guide und IBM AFS -Administration Reference. Diese Dokumente werden dem -Online-Dokumentationsverzeichnis hinzugefügt, das sich unter -\Programme\Ibm\Afs\Documentation befindet. Außerdem werden -die Online-Dokumente IBM AFS für Windows Erste Schritte und -IBM AFS for Windows Release Notes in diesem Verzeichnis -installiert. -
    • Die Windows NT-Registrierungsdatenbank wird modifiziert, indem Einträge -für AFS Supplemental Documentation hinzugefügt werden. -
    -

    Die Dokumentation zu AFS für Windows

    -

    In diesem Abschnitt erfahren Sie, welche Dokumentation für AFS für -Windows verfügbar ist und wie Sie auf diese Dokumentation zugreifen -können. -

    Das Verzeichnis für die Online-Dokumentation

    - - -

    Ungeachtet dessen, welche Komponenten Sie auf einem System installieren, -wird ein Verzeichnis für die Dokumentation angelegt. Dieses Verzeichnis -ist standardmäßig \Programme\Ibm\Afs\Documentation. Es -enthält die Dokumente IBM AFS für Windows Erste Schritte und -IBM AFS for Windows Release Notes. Diese Dokumente sind auch -über den Eintrag Dokumentation im Menü Start -verfügbar. -

    Wenn Sie AFS Supplemental Documentation installieren, enthält das -Dokumentationsverzeichnis außerdem die folgenden Dokumente: IBM AFS -Administration Guide und IBM AFS Administration -Reference. Auch diese Dokumente können Sie über den Eintrag -Dokumentation im Menü Start öffnen. -

    Vorgehensweise zum Zugriff auf das Verzeichnis für die Online-Dokumentation:

    -
      -

    1. Zeigen Sie im Menü Start auf Programme, und klicken -Sie auf IBM AFS und Dokumentation. -
    2. Wählen Sie das gewünschte Dokument aus. -
    -

    Das Dokumentationsverzeichnis auf der CD-ROM

    - - -

    Die CD-ROM für AFS für Windows enthält ein -Dokumentationsverzeichnis. Dieses enthält folgende Dokumente: -IBM AFS für Windows Erste Schritte, IBM AFS for Windows -Release Notes, IBM AFS Administration Guide und IBM AFS -Administration Reference. Alle Dokumente liegen im HTML- und im -PDF-Format vor. -

    Vorgehensweise zum Zugriff auf das Dokumentationsverzeichnis der CD-ROM:

    -
      -

    1. Legen Sie die CD-ROM für AFS für Windows in das CD-ROM-Laufwerk -ein. -
    2. Führen Sie einen der folgenden Schritte aus, wobei CD der -Laufwerkbuchstabe des CD-ROM-Laufwerks ist. -
        -

      • Für die HTML-Dokumentation öffnen Sie das Verzeichnis -CD:\Documentation\Html. -
      • Für die PDF-Dokumentation öffnen Sie das Verzeichnis -CD:\Documentation\Pdf. -
      -
    -

    Online-Hilfe

    - - -

    Zusammen mit jeder Komponente von AFS für Windows wird die Online-Hilfe -installiert. Die Online-Hilfe beschreibt die Funktionen der einzelnen -Komponenten. Verwenden Sie das Menü Hilfe und die -Schaltfläche Hilfe, die in den meisten Dialogfenstern angeboten -wird, um die Online-Hilfe zu öffnen. Wenn Sie Hilfe zu bestimmten -Themen benötigen, durchsuchen Sie die Registerkarte Inhalt. -Auf der Registerkarte Index können Sie anhand von Stichwörtern nach -Themen suchen, und die Registerkarte Suchen verwenden Sie zum -Durchsuchen der Online-Hilfe nach bestimmten Begriffen. -


    Konfigurieren von AFS für Windows

    -

    - - -In diesem Abschnitt wird das Verfahren für die Konfiguration der einzelnen -Komponenten von AFS für Windows erläutert. Um AFS verwenden zu können, -müssen die Komponenten auf dem System konfiguriert werden. -

    Vorgehensweise zum Konfigurieren von AFS Client

    - - -
    Anmerkung:Wenn Sie den AFS Server auf einem Windows NT-System konfigurieren möchten, -brauchen Sie den AFS Client nicht zu konfigurieren. Der AFS Client wird -bei der Konfiguration von AFS Server automatisch mit konfiguriert. -Außerdem bleiben die Konfigurationsdaten erhalten, wenn Sie eine frühere -Version von AFS Client auf diese Version von AFS für Windows erweitern. -Der AFS Client muß dann nicht neu konfiguriert werden. -
    -
      -

    1. Zeigen Sie im Menü Start auf Einstellungen, und -klicken Sie auf Systemsteuerung. -
    2. Doppelklicken Sie auf das Symbol AFS Client -Configuration. Das Dienstprogramm AFS Client Configuration wird -gestartet, und die Registerkarte Allgemein wird angezeigt. -
    3. Geben Sie im Feld Zellenname den Namen der AFS-Zelle ein, in -der der Computer ein Client sein soll. -
    4. Klicken Sie auf die Registerkarte AFS-Zellen. Falls die -Zelle, in der der Computer ein Client sein soll, nicht in der Liste der -AFS-Zellen enthalten ist, klicken Sie auf die Schaltfläche -Hinzufügen. Das Dialogfenster Neue Zelle wird -geöffnet. Geben Sie im Feld AFS-Zelle den Zellennamen ein -und im Feld Beschreibung eine kurze Beschreibung. -

      Klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Server hinzufügen wird geöffnet. Geben Sie im -Feld Server-Name den Namen eines Volume Location Servers in der -ausgewählten Zelle ein. Klicken Sie auf OK, um das -Dialogfenster Server hinzufügen zu schließen. Wiederholen -Sie diesen Vorgang, um die Informationen für alle Volume Location Server in -der Zelle hinzuzufügen. Falls Sie die Namen der Volume Location Server -in der AFS-Zelle nicht kennen, wenden Sie sich an Ihren -AFS-Systemadministrator. Nachdem Sie alle Server-Daten eingegeben -haben, klicken Sie auf OK, um das Dialogfenster Neue -Zelle zu schließen. -

    5. Klicken Sie auf der Registerkarte Allgemein auf die -Schaltfläche Service starten, um den AFS Client zu starten. -
    6. Klicken Sie auf die Registerkarte Laufwerkbuchstaben. Um -einen Laufwerkbuchstaben auf dem Windows NT-Computer dem AFS-Dateibereich -zuzuordnen, klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Laufwerkbuchstabe zuordnen wird geöffnet. -
    7. Wählen Sie im Listenfeld Laufwerkbuchstabe das Laufwerk aus, -das dem AFS-Dateibereich zugeordnet werden soll, oder übernehmen Sie den -Standardeintrag. Geben Sie im Feld AFS-Pfad das -AFS-Verzeichnis an, dem Sie das ausgewählte Laufwerk zuordnen möchten, -z.B. /afs. Falls gewünscht, geben Sie im Feld -Beschreibung eine Beschreibung der AFS-Zuordnung ein. -Klicken Sie auf OK, um das Laufwerk mit dem angegebenen Verzeichnis -im AFS-Dateibereich zu verbinden. -
    8. Klicken Sie auf OK, um das Dienstprogramm AFS Client -Configuration zu beenden. -

      Der AFS Client ist jetzt in der ausgewählten AFS-Zelle konfiguriert, und -Sie können über die ausgewählte Laufwerkzuordnung im Windows NT-Explorer auf -den AFS-Dateibereich zugreifen. -

    -

    Vorgehensweise zum Konfigurieren von AFS Client als AFS Light Gateway

    - - - -

    Sie können den AFS Client so auf einer Windows NT-Maschine konfigurieren, -daß er als AFS Light Gateway fungiert. Ist der AFS Client als AFS Light -Gateway konfiguriert, können Benutzer von AFS Light auf den AFS-Dateibereich -zugreifen. -

      -

    1. Konfigurieren Sie den AFS Client, wie im Abschnitt Vorgehensweise zum Konfigurieren von AFS Client beschrieben. -
    2. Zeigen Sie im Menü Start auf Einstellungen, und -klicken Sie auf Systemsteuerung. -
    3. Doppelklicken Sie auf das Symbol AFS Client -Configuration. Das Dienstprogramm AFS Client Configuration wird -gestartet, und die Registerkarte Allgemein wird angezeigt. -
    4. Wählen Sie die Option AFS Light Gateway bereitstellen. -
    5. Klicken Sie auf OK. -
        -

      • Wenn der AFS Client aktiv ist, wird eine Meldung mit dem Hinweis -angezeigt, daß Sie den Service erneut starten müssen. Klicken Sie auf -Ja, um den AFS Client erneut zu starten und das AFS Light Gateway -zu aktivieren. -
      • Falls der AFS Client gestoppt wurde, erhalten Sie eine Meldung mit dem -Hinweis, daß Sie diesen Service starten müssen. Klicken Sie auf -Ja, um den AFS Client zu starten und das AFS Light Gateway zu -aktivieren. -
      -
    6. - -Fügen Sie der Zellendatenbank des AFS Light Gateways Zelleneinträge -hinzu. Beachten Sie folgendes: Damit ein AFS Light-Benutzer auf -eine Zelle zugreifen kann, muß ein Eintrag für diese Zelle sowohl in der -Zellendatenbank von AFS Light als auch in der Zellendatenbank von AFS Light -Gateway existieren. Falsche oder fehlende Informationen über eine Zelle -in der Zellendatenbank der Gateway-Maschine haben zur Folge, daß Light-Clients -nicht auf Dateien zugreifen können. -

      Vorgehensweise zum Einfügen eines Eintrags zur -Zellendatenbank: -

      Öffnen Sie im Dienstprogramm AFS Light Configuration die Registerkarte -AFS-Zellen, und klicken Sie auf die Schaltfläche -Hinzufügen. Das Dialogfenster Neue Zelle wird -geöffnet. Geben Sie im Feld AFS-Zelle den Zellennamen ein -und im Feld Beschreibung eine kurze Beschreibung. -

      Klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Server hinzufügen wird geöffnet. Geben Sie im -Feld Server-Name den Namen eines Volume Location Servers in der -ausgewählten Zelle ein. Klicken Sie auf OK, um das -Dialogfenster Server hinzufügen zu schließen. Wiederholen -Sie diesen Vorgang, um die Informationen für alle Volume Location Server in -der Zelle hinzuzufügen. Falls Sie die Namen der Volume Location Server -in der AFS-Zelle nicht kennen, wenden Sie sich an Ihren -AFS-Systemadministrator. Nachdem Sie alle Server-Daten eingegeben -haben, klicken Sie auf OK, um das Dialogfenster Neue -Zelle zu schließen. -

    -

    - - - -Der Windows NT-Computer ist nun als AFS Light Gateway konfiguriert. -Sobald der AFS Client-Computer als AFS Light Gateway konfiguriert worden ist, -muß er in der Lage sein, Benutzer von AFS Light in einem Windows-Kontext zu -authentifizieren. Diese Authentifizierung erfolgt über ein -Domänen-Benutzerkonto oder über ein synchronisiertes -Maschinen-Benutzerkonto. Ein Domänen-Benutzerkonto ist ein -Benutzerkonto in einer Windows-Domäne. Ein Maschinen-Benutzerkonto ist -ein Benutzerkonto, das nur auf einem bestimmten Host-Computer gültig -ist. -

    Wenn das AFS Light Gateway in einer Windows-Domäne konfiguriert ist, muß -der AFS Light-Benutzer sich entweder bei einem Domänen-Benutzerkonto in der -Domäne anmelden, zu der das Gateway gehört, oder bei einem -Maschinen-Benutzerkonto, das den gleichen Benutzernamen und das gleiche -Kennwort hat wie ein Domänen-Benutzerkonto in der Gateway-Domäne. -

    Werden Maschinen-Benutzerkonten verwendet, müssen diese Konten zwischen dem -AFS Light Gateway- und dem AFS Light-Computer synchronisiert werden. -Der Benutzer muß sich auf einem AFS Light-Computer mit dem gleichen -Benutzernamen und Kennwort anmelden, das auch für ein Maschinen-Benutzerkonto -gilt, das auf dem AFS Light Gateway-Maschine definiert ist. -

    Vorgehensweise zum Konfigurieren von AFS Light

    - - -

    AFS Light greift über ein AFS Light Gateway auf den AFS-Dateibereich -zu. Damit Sie AFS Light konfigurieren können, benötigen Sie einen -Windows NT-Computer, auf dem der AFS Client ausgeführt wird, und der als AFS -Light Gateway konfiguriert ist. Weitere Informationen hierzu finden Sie -im Abschnitt Vorgehensweise zum Konfigurieren von AFS Client als AFS Light Gateway. -

      -

    1. Zeigen Sie im Menü Start auf Einstellungen, und -klicken Sie auf Systemsteuerung. -
    2. Doppelklicken Sie auf das Symbol AFS Light -Configuration. Das Dienstprogramm AFS Light Configuration wird -gestartet, und die Registerkarte Allgemein wird angezeigt. - - -
    3. Geben Sie im Feld Gateway den Namen einer Windows NT-Maschine -an, die als AFS Light Gateway konfiguriert ist, und klicken Sie auf Jetzt -verbinden. Der Name der Gateway-Maschine ist der -NetBIOS-Servicename des Gateways im Format -Maschine-afs, wobei Maschine der Name -des Host-Computers mit maximal 11 Zeichen Länge ist. AFS Light muß -diesen Servicenamen auflösen können, um mit der Gateway-Maschine zu -kommunizieren. Damit die Namensauflösung erfolgt, müssen Sie den -NetBIOS-Servicenamen des Gateways der LMHOSTS-Datei des Clients oder den -entsprechenden DNS- oder WINS-Servern hinzufügen. Befinden sich die AFS -Light-Maschine und die zugehörige AFS Light Gateway-Maschine im gleichen -Teilnetz, ist keine weitere Konfiguration erforderlich. -

      AFS Light wird automatisch Mitglied der gleichen Zelle wie das AFS Light -Gateway. Der Name der Zelle wird im Feld Zellenname -angezeigt. -
      Anmerkung:Wenn die AFS Light Gateway-Maschine sich in der gleichen Domäne befindet wie -die AFS Light-Maschine und der Host-Name der Gateway-Maschine in der Domäne -xyz-pc ist, können Sie für den Computernamen im Feld -Gateway entweder xyz-pc oder -xyz-pc.xcompany.com eingeben. -
      -

    4. Klicken Sie auf die Registerkarte AFS-Zellen. Falls die -Zelle, zu der die Maschine gehört, nicht in der Liste der AFS-Zellen enthalten -ist, klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Neue Zelle wird geöffnet. Geben Sie im Feld -AFS-Zelle den Zellennamen ein und im Feld Beschreibung -eine kurze Beschreibung. -

      Klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Server hinzufügen wird geöffnet. Geben Sie im -Feld Server-Name den Namen eines Volume Location Servers in der -ausgewählten Zelle ein. Klicken Sie auf OK, um das -Dialogfenster Server hinzufügen zu schließen. Wiederholen -Sie diesen Vorgang, um die Informationen für alle Volume Location Server in -der Zelle hinzuzufügen. Falls Sie die Namen der Volume Location Server -in der AFS-Zelle nicht kennen, wenden Sie sich an den -AFS-Systemadministrator. Nachdem Sie alle Server-Daten eingegeben -haben, klicken Sie auf OK, um das Dialogfenster Neue -Zelle zu schließen. -

      Beachten Sie, daß ein identischer Eintrag in der Zellendatenbank des AFS -Light Gateways (Datei afsdcell.ini) existieren muß, damit -der AFS Light-Benutzer sich bei der Zelle authentifizieren kann. -Weitere Informationen zur Synchronisierung der Zellendatenbank der -Gateway-Maschine mit der Zellendatenbank des Light-Clients finden Sie im -Abschnitt Vorgehensweise zum Konfigurieren von AFS Client als AFS Light Gateway. -

    5. Klicken Sie auf die Registerkarte Laufwerkbuchstaben. Um -einen Laufwerkbuchstaben auf der Windows-Maschine dem AFS-Dateibereich -zuzuordnen, klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Laufwerkbuchstabe zuordnen wird geöffnet. -
    6. Wählen Sie im Listenfeld Laufwerkbuchstabe das Laufwerk aus, -das dem AFS-Dateibereich zugeordnet werden soll, oder übernehmen Sie den -Standardeintrag. Geben Sie im Feld AFS-Pfad das -AFS-Verzeichnis an, dem Sie das ausgewählte Laufwerk zuordnen möchten, -z.B. /afs. Falls gewünscht, geben Sie im Feld -Beschreibung eine Beschreibung der AFS-Zuordnung ein. -Klicken Sie auf OK, um das Laufwerk mit dem angegebenen Verzeichnis -im AFS-Dateibereich zu verbinden. -
    7. Klicken Sie auf OK, um das Dienstprogramm AFS Light -Configuration zu beenden. -

      AFS Light ist jetzt in der angegebenen AFS-Zelle konfiguriert, und Sie -können über die ausgewählte Laufwerkzuordnung im Windows-Explorer auf den -AFS-Dateibereich zugreifen. -

    -

    Vorgehensweise zum Konfigurieren von AFS Server

    - - -

    Durch den Konfigurationsprozeß werden die zur Ausführung von AFS Server -benötigten Services gestartet und AFS-Partitionen auf der Windows NT-Maschine -eingerichtet. Mit dem Assistenten AFS Configuration können Sie den AFS -Server rasch entweder als ersten Server in einer neuen AFS-Zelle oder als -Server in einer vorhandenen AFS-Zelle konfigurieren. Wenn Sie eine -bisherige Version auf die neue Version von AFS Server erweitern, bleiben die -Konfigurationsdaten der früheren Version erhalten, d.h. Sie -brauchen den Server nicht neu zu konfigurieren. -

    - -Vorgehensweise zum Konfigurieren von AFS Server als ersten AFS Server in einer -Zelle: -

      -

    1. Zeigen Sie im Menü Start auf Programme, klicken Sie -auf IBM AFS, dann auf Server und anschließend auf -Konfigurationsassistent. Der Assistent AFS Server -Quick-Start wird gestartet. -
    2. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Zellen- und Server-Informationen wird -angezeigt. -
    3. Wählen Sie die Option Dies wird der erste Server in einer neuen -AFS-Zelle. -
    4. Geben Sie im Feld Zellenname einen Namen für die neue AFS-Zelle -ein. -

      Folgende Beschränkungen gelten für das Format eines Internet-Domänennamens, -der als Name einer AFS-Zelle dienen kann: -

        -

      • Der Zellenname muß eindeutig sein, damit diese AFS-Zelle von allen anderen -im globalen AFS-Namespace unterschieden werden kann. -
      • Der Zellenname darf maximal 64 Zeichen lang sein, kürzere Namen sind -jedoch vorzuziehen. -
      • Der Zellenname darf nur Kleinbuchstaben, Zahlen, Unterstriche, -Bindestriche und Punkte enthalten, um Übertragbarkeit zwischen verschiedenen -Betriebssystemen zu gewährleisten. -
      • Der Zellenname kann beliebige Zahlen oder Buchstaben enthalten, die -standardmäßig durch Punkte voneinander getrennt werden. -
      • Der Zellenname muß mit einem Suffix enden, das die Art der Organisation -angibt, zu der die Zelle gehört. Standardsuffixe sind -z.B. .com für Organisationen in Wirtschaft und -Handel, .edu für Bildungseinrichtungen wie Universitäten, -.gov für Regierungsbehörden und .mil für -militärische Organisationen. -
      -
    5. Geben Sie im Feld Kennwort die Zeichenfolge ein, die als -Kennwort für das Principal-Konto von AFS Server in der Zelle (afs) -dienen soll. Alle AFS Server rufen AFS-Token bei diesem Principal ab, -und der Ticket Granting Service (TGS) des Authentifizierungs-Servers verwendet -dieses Kennwort, um die Server-Zugriffsberechtigungen zu verschlüsseln, die -die AFS Clients den Servern bei der gegenseitigen Authentifizierung -vorlegen. -
    6. Geben Sie im Feld Prüfkennwort erneut das erste AFS-Kennwort -für das Principal-Konto von AFS Server für diese Zelle ein, um es zu -bestätigen. -
    7. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Verwaltungsinformationen wird angezeigt. -
    8. Geben Sie im Feld Name einen Benutzernamen ein, der als -generisches AFS-Verwaltungskonto für diese Zelle dienen soll (meist -admin). -

      - -Wenn Sie ein generisches Verwaltungskonto verwenden, brauchen Sie nicht jedem -Systemadministrator einzeln Berechtigungen zu erteilen. Vielmehr kennt -jeder Administrator den Namen und das Kennwort dieses generischen -Verwaltungskontos und verwendet diese Identität, um sich bei AFS zu -authentifizieren, wenn er Vorgänge ausführt, für die -Administratorberechtigungen benötigt werden. -

    9. Geben Sie im Feld Kennwort eine Zeichenfolge ein, die als -Kennwort für das AFS-Verwaltungskonto dienen soll. -
    10. Geben Sie im Feld Prüfkennwort erneut das Kennwort für das -AFS-Verwaltungskonto ein, um es zu bestätigen. -
    11. Geben Sie die AFS-Benutzer-ID (AFS-UID) ein, die dem AFS-Verwaltungskonto -zugeordnet werden soll: -
        -

      • (Empfohlen) Soll dem AFS-Verwaltungskonto automatisch die nächste -verfügbare UID zugeordnet werden, wählen Sie die Option Die nächste -verfügbare AFS UID verwenden. -
      • Wenn Sie dem AFS-Verwaltungskonto eine bestimmte UID zuweisen möchten, -wählen Sie die Option Diese AFS UID verwenden: und geben die -gewünschte UID in das Eingabefeld ein. -
        Anmerkung:Es ist im allgemeinen nicht empfehlenswert, einem neuen AFS-Konto eine -spezielle UID zuzuweisen, es sei denn, die AFS-UID muß mit einer vorhandenen -UNIX-UID übereinstimmen. -
        -
      -
    12. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster File Service wird angezeigt. -

      - -AFS File Server stellen von AFS Clients angeforderte Dateien und Daten vom -Server bereit. Sie speichern Dateien und Daten, verarbeiten -Anforderungen für das Kopieren, Verschieben, Erstellen und Löschen von Dateien -und Verzeichnissen und zeichnen Statusinformationen über die einzelnen Dateien -und Verzeichnisse auf dem Server auf. -

      Da Sie den ersten AFS Server in einer neuen Zelle konfigurieren, muß der -File Service auf dem Server konfiguriert werden. Dies geschieht -automatisch. -

    13. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Database Service wird angezeigt. -

      - -Jede AFS-Zelle muß mindestens einen Database Server enthalten. Jeder -Database Server führt die Datenbankprozesse aus, mit denen die AFS-Datenbanken -(Authentication-, Protection-, Volume Location- und ggf. -Backup-Datenbank) verwaltet werden. -

      Da Sie den ersten AFS Server in einer neuen Zelle konfigurieren, muß der -Database Service auf dem Server konfiguriert werden. Dies geschieht -automatisch. -

    14. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Backup-Server wird angezeigt. -

      - -Ein Backup-Server verwaltet die Backup-Datenbank, in der Informationen im -Zusammenhang mit dem Backup-System gespeichert werden. Mit Hilfe des -Backup-Servers kann der AFS-Systemadministrator Daten im AFS-Dateibereich von -den Volumes auf Band sichern. Diese Daten können vom Band -wiederhergestellt werden, falls sie im Dateisystem verlorengehen -(z.B. bei Datenverlust durch Systemausfall oder -Festplattenfehler). -

    15. Wählen Sie die Option Als Backup-Server konfigurieren, wenn Sie -diesen AFS Server als Backup-Server konfigurieren möchten. Andernfalls -wählen Sie die Option Nicht als Backup-Server konfigurieren. -

      -
      Anmerkung:Ist der Backup-Server auf irgendeinem Database Server in der Zelle -konfiguriert, muß er auf allen Database Servern in der Zelle -konfiguriert werden. -
      -

    16. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster AFS-Partition wird angezeigt. -

      - - Jeder AFS File Server muß mindestens eine Partition besitzen, die -ausschließlich für die Speicherung von AFS-Volumes reserviert ist. Alle -AFS-Volumes müssen sich auf Partitionen befinden, die als AFS-Partitionen -eingerichtet wurden. Auf einem Windows NT-Computer können nur -NTFS-Volumes als AFS-Partitionen eingerichtet werden. Außerdem können -AFS-Partitionen nur auf NTFS-Volumes erstellt werden, die leer sind (oder nur -den Windows NT-Papierkorb enthalten). -

      Da Sie den ersten AFS Server in einer neuen Zelle konfigurieren, müssen Sie -auf dem Server eine AFS-Partition festlegen. -

    17. Wählen Sie in der Liste der NTFS-Volumes das Volume aus, das Sie als -AFS-Partition einrichten möchten. Geben Sie im Feld -AFS-Partitionsname den letzten Teil des Partitionsnamens -ein. -
      Anmerkung:Auf einem AFS Server können bis zu 256 AFS-Partitionen existieren. -Standardmäßig hat eine Partition den Namen /vicepx, -wobei x für einen oder zwei Kleinbuchstaben steht. -AFS-Partitionen können /vicepa, /vicepb usw. bis -/vicepz heißen. Zusätzliche Partitionen können mit -/vicepaa bis vicepaz usw. bis /vicepiv -benannt werden. -
      -

      Es wird unbedingt empfohlen, den Laufwerkbuchstaben des NTFS-Volumes als -letzten Buchstaben des Partitionsnamens zu verwenden. -

    18. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster AFS-Root-Volumes wird angezeigt. -

      - - - -Die AFS-Root-Volumes sind zwei Volumes, die im Dateisystem jeder AFS-Zelle -enthalten sein müssen. Sie haben folgende Namen: -

        -

      • root.afs: das Volume, das der obersten Ebene -(/afs) des AFS-Dateibereichs entspricht. -
      • root.cell: das Volume, das direkt unter -/afs am Namen der Zelle angehängt ist (z.B. -/afs/meinefirma.com in der Zelle -meinefirma.com). -
      -

      Da Sie den ersten AFS Server in einer neuen Zelle konfigurieren, müssen -die Root-Volumes der Zelle auf dem Server erstellt werden. Dies -geschieht während der Konfiguration des Servers automatisch. -

    19. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Nachbildung wird angezeigt. -

      - -Wenn Sie die Nachbildungsfunktionen von AFS nutzen möchten, müssen die -AFS-Root-Volumes repliziert werden. Bei der Nachbidung werden eine oder -mehrere schreibgeschützte Kopien eines AFS-Volumes erstellt und an einen oder -mehrere andere Standorte verteilt (AFS-Partitionen und -Server). Die -Nachbildung führt zu einer Steigerung der Systemleistung und zu einer besseren -Datenverfügbarkeit, da sie den Inhalt eines AFS-Volumes auf einem oder -mehreren AFS File Server-Computern zur Verfügung stellt. -

      Da Sie den ersten AFS Server in einer neuen Zelle konfigurieren, müssen die -Root-Volumes der Zelle auf dem Server repliziert werden. Dies geschieht -automatisch während der Konfiguration des Servers. -

    20. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster System Control Service wird angezeigt. -

      - -In Zellen, in denen die landesspezifische Version von AFS für Windows -ausgeführt wird, verteilt der System Control Server neue Versionen der AFS -Server-Konfigurationsdaten an alle AFS-Server. Es empfiehlt sich -grundsätzlich, den ersten Server in einer AFS-Zelle als System Control Server -zu definieren. (Bei Zellen, in denen die internationale Version von AFS -für Windows ausgeführt wird, wird der System Control Server nicht zum -Verteilen der Systemkonfigurationsdaten verwendet.) -
      Anmerkung:Die Rolle des System Control Servers kann später bei Bedarf einem anderen -Server zugeordnet werden. Je nach Anzahl der AFS-Server in der Zelle -kann die Zuweisung der Rolle zu einem anderen Computer jedoch sehr -zeitaufwendig sein. -
      -

    21. Um diesen AFS Server als System Control Server für die AFS-Zelle zu -konfigurieren, wählen Sie die Option Als System Control Server -konfigurieren. Andernfalls wählen Sie die Option Nicht als -System Control Server konfigurieren. -
    22. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Das System konfigurieren wird angezeigt. -

      Eine Liste der Konfigurationsschritte für den AFS Server wird -angezeigt. Lesen Sie sich die Schritte durch, bevor Sie mit dem -Konfigurationsprozeß beginnen. -
      Anmerkung:Um zu einem vorherigen Schritt zurückzukehren oder Ihre Auswahl zu ändern, -klicken Sie auf die Schaltfläche Zurück. -
      -

    23. Um mit der Konfiguration von AFS Server auf dieser Maschine zu beginnen, -klicken Sie auf die Schaltfläche Konfigurieren. Der AFS -Server wird gemäß Ihren Angaben konfiguriert. Der Statusbalken am -unteren Rand des Dialogfensters zeigt an, welche Schritte gerade ausgeführt -werden. Anschließend wird eine Meldung mit dem Hinweis angezeigt, daß -die Konfiguration abgeschlossen ist. -
    -

    - -Vorgehensweise zum Konfigurieren von AFS Server in einer vorhandenen -AFS-Zelle: -

      -

    1. Zeigen Sie im Menü Start auf Programme, klicken Sie -auf IBM AFS, dann auf Server und anschließend auf -Konfigurationsassistent. Der Assistent AFS Server -Quick-Start wird gestartet. -
    2. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Zellen- und Server-Informationen wird -angezeigt. -
    3. Wählen Sie die Option Diesen Host zu einem Server in einer -vorhandenen AFS-Zelle machen. -
    4. Geben Sie im Feld Zellenname den Namen der AFS-Zelle ein, der -Sie den neuen AFS Server hinzufügen möchten. -
    5. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Verwaltungsinformationen wird angezeigt. -
    6. Geben Sie im Feld Name den Benutzernamen des -AFS-Verwaltungskontos ein, z.B. admin, oder den -Benutzernamen eines AFS-Benutzerkontos mit Administratorberechtigungen. -
    7. Geben Sie im Feld Kennwort den Benutzernamen des -AFS-Verwaltungskontos ein, z.B. admin, oder den -Benutzernamen eines AFS-Benutzerkontos mit Administratorberechtigungen. -
    8. Geben Sie im Feld AFS Server den Host-Namen eines aktiven AFS -Servers in dieser AFS-Zelle ein. Die AFS-Konfigurationsdaten werden vom -Server abgerufen und angewendet, wenn der neue AFS Server konfiguriert -wird. -
    9. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster File Service wird angezeigt. -

      - -AFS File Server stellen AFS Clients angeforderte Dateien und Daten vom Server -bereit. Sie speichern Dateien und Daten, verarbeiten Anforderungen für -das Kopieren, Verschieben, Erstellen und Löschen und Dateien und -Verzeichnissen und zeichnen Statusinformationen über die einzelnen Dateien und -Verzeichnisse auf dem Server auf. -

      Um diesen AFS Server als File Server zu konfigurieren, wählen Sie die -Option Als File Server konfigurieren. Andernfalls wählen Sie -die Option Nicht als File Server konfigurieren. -

    10. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Database Service wird angezeigt. -

      - -Jede AFS-Zelle muß mindestens einen Database Server enthalten. Jeder -Database Server führt die Datenbankprozesse aus, mit denen die AFS-Datenbanken -(Authentication-, Protection-, Volume Location- und ggf. -Backup-Datenbank) verwaltet werden. -

      Um diesen AFS Server als Database Server zu konfigurieren, wählen Sie die -Option Als Database Server konfigurieren. Falls in der -AFS-Zelle, der Sie den Server hinzufügen, ein System Control Server vorhanden -ist, geben Sie dessen Host-Namen im Feld System Control Server -ein. Die AFS-Konfigurationsdaten (z.B. die Liste der AFS -Database Server, die in der Datei CellServDB auf jeder AFS -Server-Maschine gespeichert wird) werden durch diesen Server -aktualisiert. Wenn Sie diesen AFS Server nicht als Database Server -konfigurieren möchten, wählen Sie die Option Nicht als Database Server -konfigurieren. -

    11. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Backup-Server wird angezeigt. -

      - -Ein Backup-Server verwaltet die Backup-Datenbank, in der Informationen im -Zusammenhang mit dem Backup-System gespeichert werden. Mit Hilfe des -Backup-Servers kann der AFS-Systemadministrator Daten im AFS-Dateibereich von -den Volumes auf Band sichern. Diese Daten können vom Band -wiederhergestellt werden, falls sie im Dateisystem verlorengehen -(z.B. bei Datenverlust durch Systemausfall oder -Festplattenfehler). -
      Anmerkung:Der Backup-Server kann nur auf einem Computer konfiguriert werden, der als -Database Server konfiguriert ist. Ist der Backup-Server außerdem auf -irgendeinem Database Server in der Zelle konfiguriert, muß er auf -allen Database Servern in der Zelle konfiguriert werden. -
      -

    12. Wählen Sie die Option Als Backup-Server konfigurieren, wenn Sie -diesen AFS Server als Backup-Server konfigurieren möchten. Andernfalls -wählen Sie die Option Nicht als Backup-Server konfigurieren. -
    13. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster AFS-Partition wird angezeigt. -

      Wenn Sie diesen AFS Server als File Server konfigurieren, müssen Sie ein -NTFS-Volume angeben, das als AFS-Partition eingerichtet werden soll. -Jeder AFS File Server muß mindestens eine Partition besitzen, die -ausschließlich für die Speicherung von AFS-Volumes reserviert ist. Alle -AFS-Volumes müssen sich auf Partitionen befinden, die als AFS-Partitionen -eingerichtet wurden. Auf einem Windows NT-Computer können nur -NTFS-Volumes als AFS-Partitionen eingerichtet werden. Außerdem können -AFS-Partitionen nur auf NTFS-Volumes erstellt werden, die leer sind (oder nur -den Windows NT-Papierkorb enthalten). -

      Um ein Volume als AFS-Partition einzurichten, wählen Sie die Option -Ja, eine Partition erstellen. Wählen Sie in der Liste der -NTFS-Volumes das Volume aus, das Sie als AFS-Partition einrichten -möchten. Geben Sie im Feld AFS-Partitionsname den letzten -Teil des Partitionsnamens ein. -
      Anmerkung:Auf einem AFS Server können bis zu 256 AFS-Partitionen existieren. -Standardmäßig hat eine Partition den Namen /vicepx, -wobei x für einen oder zwei Kleinbuchstaben steht. -AFS-Partitionen können /vicepa, /vicepb usw. bis -/vicepz heißen. Zusätzliche Partitionen können mit -/vicepaa bis vicepaz usw. bis /vicepiv -benannt werden. -
      -

      Es wird unbedingt empfohlen, den Laufwerkbuchstaben des NTFS-Volumes als -letzten Buchstaben des Partitionsnamens zu verwenden. -

      Wenn Sie kein Volume als AFS-Partition definieren möchten, wählen Sie die -Option Nein, keine Partition erstellen. -

    14. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster AFS-Root-Volumes wird angezeigt. -

      Die AFS-Root-Volumes sind zwei Volumes, die im Dateisystem jeder AFS-Zelle -enthalten sein müssen. Sie haben folgende Namen: -

        -

      • root.afs: das Volume, das der obersten Ebene -(/afs) des AFS-Dateibereichs entspricht. -
      • root.cell: das Volume, das direkt unter -/afs am Namen der Zelle angehängt ist (z.B. -/afs/ihrefirma.com in der Zelle -ihrefirma.com). -
      - -Da Sie diesen AFS Server einer vorhandenen AFS-Zelle hinzufügen, sind die -AFS-Volumes bereits in der Zelle vorhanden, und der Assistent AFS -Configuration weist Sie darauf hin, daß Sie keine Root-Volumes erstellen -müssen. -
      Anmerkung:Falls die AFS-Root-Volumes aus irgendeinem Grund nicht in dieser AFS-Zelle -existieren, wählen Sie die Option Root-Volumes erstellen, um die -Root-Volumes auf diesem AFS Server einzurichten. -
      -
    15. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Nachbildung wird angezeigt. -

      Wenn Sie die Nachbildungsfunktionen von AFS nutzen möchten, müssen Sie die -AFS-Root-Volumes replizieren. Bei der Nachbildung werden eine oder -mehrere schreibgeschützte Kopien eines AFS-Volumes erstellt und an einen oder -mehrere andere Standorte verteilt (AFS-Partitionen und -Server). Die -Nachbildung führt zu einer Steigerung der Systemleistung und zu einer besseren -Datenverfügbarkeit, da sie den Inhalt eines AFS-Volumes auf einem oder -mehreren AFS File Server-Computern zur Verfügung stellt. -

      Da Sie diesen AFS Server einer vorhandenen AFS-Zelle hinzufügen, sind die -AFS-Root-Volumes wahrscheinlich bereits repliziert, und der Assistent AFS -Server Configuration weist Sie darauf hin, daß Sie die AFS-Root-Volumes nicht -replizieren müssen. -
      Anmerkung:Falls die AFS-Root-Volumes aus irgendeinem Grund in dieser AFS-Zelle noch -nicht repliziert sind, wählen Sie die Option Root-Volumes -nachbilden, um die Root-Volumes der AFS-Zelle auf diesem AFS Server zu -replizieren. -
      -

    16. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster System Control Service wird angezeigt. -

      In Zellen, in denen die landesspezifische Version von AFS für Windows -ausgeführt wird, verteilt der System Control Server neue Versionen der AFS -Server-Konfigurationsdaten an alle AFS-Server, und die System Control -Client-Computer rufen allgemeine AFS-Konfigurationsdateien vom System -Control-Computer ab. (Bei Zellen, in denen die internationale Version -von AFS für Windows ausgeführt wird, wird der System Control Server nicht zum -Verteilen der Systemkonfigurationsdaten verwendet, und der System Control -Client ruft nicht diese Dateien ab.) -

    17. Um diesen AFS-Server als System Control Server für die AFS-Zelle zu -konfigurieren, wählen Sie die Option Als System Control Server -konfigurieren. Um diesen AFS Server als System Control Client zu -konfigurieren, wählen Sie die Option Als System Control Client -konfigurieren und geben den Host-Namen des System Control Servers in -dieser AFS-Zelle ein. Der AFS Server ruft neue Versionen der AFS -Server-Konfigurationsdaten vom angegebenen Server ab. Wenn Sie diesen -AFS Server nicht als System Control Server für die AFS-Zelle oder als System -Control Client konfigurieren möchten, wählen Sie die Option Nicht als -System Control Client oder Server konfigurieren. -
    18. Klicken Sie auf die Schaltfläche Weiter. Das -Dialogfenster Das System konfigurieren wird angezeigt. -

      Eine Liste der Konfigurationsschritte für diesen AFS Server wird -angezeigt. Lesen Sie sich die Schritte durch, bevor Sie mit dem -Konfigurationsprozeß beginnen. -
      Anmerkung:Um zu einem vorherigen Schritt zurückzukehren oder Ihre Auswahl zu ändern, -klicken Sie auf die Schaltfläche Zurück. -
      -

    19. Um mit der Konfiguration von AFS Server auf diesem Computer zu beginnen, -klicken Sie auf die Schaltfläche Konfigurieren. Wenn Sie den -AFS Server in einer AFS-Zelle konfigurieren, in der Database Server eine -ältere Version von AFS als Version 3.5 ausführen, wird ein -Dialogfenster angezeigt, in dem Sie zur Eingabe des Kennworts für den -AFS-Principal aufgefordert werden. -

      Der AFS Server wird gemäß Ihren Angaben konfiguriert. Der -Statusbalken am unteren Rand des Dialogfensters zeigt an, welche Schritte -gerade ausgeführt werden. Anschließend wird eine Meldung mit dem -Hinweis angezeigt, daß die Konfiguration abgeschlossen ist. -

    -

    Vorgehensweise zum Konfigurieren von AFS Control Center

    - - -
    Anmerkung:Wenn Sie das AFS Control Center in Verbindung mit dem AFS Server, dem AFS -Client oder beiden Komponenten installiert haben, brauchen Sie das AFS Control -Center nicht zu konfigurieren. Das AFS Control Center wird während der -Konfiguration von AFS Server oder AFS Client automatisch mit -konfiguriert. Wenn Sie dagegen nur das AFS Control Center installiert -haben, müssen Sie es vor der Verwendung auf dem System konfigurieren. -
    -
      -

    1. Zeigen Sie im Menü Start auf Einstellungen, und -klicken Sie auf Systemsteuerung. -
    2. Doppelklicken Sie auf das Symbol AFS Control Center. Das -Dialogfenster Merkmale für AFS Control Center wird -angezeigt. -
    3. Geben Sie im Feld Standardzelle den vollständigen Namen der -AFS-Zelle ein, die standardmäßig zu verwalten ist. -
    4. Falls die Zelle, die durch das AFS Control Center verwaltet werden soll, -nicht in der Liste der AFS-Zellen enthalten ist, klicken Sie auf die -Schaltfläche Hinzufügen. Das Dialogfenster Neue -Zelle wird geöffnet. Geben Sie im Feld AFS-Zelle den -Zellennamen ein und im Feld Beschreibung eine kurze -Beschreibung. -

      Klicken Sie auf die Schaltfläche Hinzufügen. Das -Dialogfenster Server hinzufügen wird geöffnet. Geben Sie im -Feld Server-Name den Namen eines Volume Location Servers in der -ausgewählten Zelle ein. Klicken Sie auf OK, um das -Dialogfenster Server hinzufügen zu schließen. Wiederholen -Sie diesen Vorgang, um die Informationen für alle Volume Location Server in -der Zelle hinzuzufügen. Nachdem Sie alle Server-Daten eingegeben haben, -klicken Sie auf OK, um das Dialogfenster Neue Zelle zu -schließen. -

    5. Klicken Sie auf OK, um das Dialogfenster Merkmale für AFS -Control Center zu schließen. -
    -

    Das AFS Control Center ist nun konfiguriert. - -


    Deinstallieren von AFS für Windows

    -

    In diesem Abschnitt werden die Voraussetzungen für die Deinstallation, -das Verfahren zur Deinstallation von AFS für Windows und die Änderungen -beschrieben, die bei der Deinstallation am System vorgenommen werden. - - -

    Neuinstallieren und Erweitern

    -

    Auf einem Windows NT-Computer ist es nicht erforderlich, zum -Zwecke der erneuten Installation oder der Erweiterung der Software die -Komponenten von AFS für Windows zu deinstallieren. Gehen Sie nach dem -Installationsverfahren im Abschnitt Vorgehensweise zum Installieren von AFS für Windows vor, um AFS für Windows erneut zu installieren oder zu -erweitern. Während des Installationsvorgangs werden die bisher -installierten AFS-Komponenten überschrieben. Die -AFS-Konfigurationsdaten bleiben erhalten. -

    Auf einem Windows 95- oder Windows 98-Computer müssen Sie die bisher -installierte AFS Light-Komponente deinstallieren, wie im Abschnitt Vorgehensweise zum Deinstallieren von AFS für Windows beschrieben, bevor Sie AFS Light erneut installieren oder -erweitern. - - - -

    Deinstallationsvoraussetzungen

    -

    Bei der Deinstallation von AFS werden alle AFS-Anwendungsdateien -gelöscht. Diese Dateien können nicht gelöscht werden, wenn sie von -anderen Anwendungen genutzt werden. Deshalb müssen Sie alle -AFS-Dialogfenster schließen, bevor Sie AFS für Windows deinstallieren. -

    Wenn Sie den AFS Server deinstallieren, um den Computer außer Dienst zu -stellen, müssen folgende Voraussetzungen erfüllt sein, damit es nicht zu einem -Datenverlust kommt. -

      -

    1. Fungiert der AFS Server als File Server, verschieben Sie alle Volumes mit -Schreib-/Lesezugriff auf einen anderen AFS File Server, und entfernen Sie alle -schreibgeschützten Volumes. -
    2. Dekonfigurieren Sie den AFS Server. Starten Sie das Dienstprogramm -AFS Server Configuration, und klicken Sie auf die Registerkarte -Server. Deaktivieren Sie alle Kontrollkästchen, und klicken -Sie auf OK. -
    - - - - - - - -

    Vorgehensweise zum Deinstallieren von AFS für Windows

    -
      -

    1. Zeigen Sie im Menü Start auf Einstellungen, und -klicken Sie auf Systemsteuerung. -
    2. Doppelklicken Sie auf das Symbol Software. Das -Dialogfenster Eigenschaften von Software wird mit der geöffneten -Registerkarte Installieren/Deinstallieren angezeigt. -
    3. Schließen Sie die Systemsteuerung. -
    4. Wählen Sie die AFS-Komponente aus, die deinstalliert werden soll, und -klicken Sie auf die Schaltfläche Hinzufügen/Entfernen. Das -Dialogfenster Löschen einer Datei bestätigen wird angezeigt, in dem -Sie bestätigen, daß Sie die ausgewählte Komponente von AFS für Windows -entfernen möchten. Klicken Sie auf Ja, um die Deinstallation -fortzusetzen. -
    5. Sie werden in einer AFS-Meldung gefragt, ob die Konfigurationsdaten -erhalten bleiben sollen. Wählen Sie Ja, wenn die -Konfigurationsdaten beibehalten werden sollen, bzw. Nein, -wenn alle Konfigurationsdaten gelöscht werden sollen. (Mit der -Komponente AFS Supplemental Documentation sind keine Konfigurationsdaten -verbunden. Wenn Sie diese Komponente vom System entfernen, wird diese -AFS-Meldung nicht angezeigt.) -
    6. Das Dialogfenster Programme vom Computer entfernen wird -geöffnet. Es zeigt an, welche Komponenten vom System gelöscht -werden. -
      Anmerkung:Möglicherweise wird eine Meldung angezeigt, in der Sie gefragt werden, ob -gemeinsam genutzte AFS-Dateien, die von anderen Komponenten nicht mehr -benötigt werden, entfernt werden sollen. Klicken Sie auf Alle -ja, um die ausgewählte AFS-Komponente vollständig zu löschen. -
      -
    -

    Die ausgewählte Komponente von AFS für Windows ist jetzt -deinstalliert. Wenn Sie eine Kombination aus AFS für -Windows-Komponenten installiert haben, müssen Sie die Schritte 4-6 für -jede einzelne Komponente ausführen. -

    Änderungen am System

    - -

    Änderungen am System durch Deinstallation des AFS Clients

    -

    Wenn Sie den AFS Client deinstallieren, werden folgende Änderungen am -System durchgeführt: -

      -

    • Alle AFS Client-Dateien werden aus dem Verzeichnis -\Programme\Ibm\Afs\Client\Program gelöscht, das Verzeichnis -Client wird entfernt, und falls keine anderen AFS-Komponenten -installiert bleiben, wird das Verzeichnis Ibm gelöscht. -
      Anmerkung:Die Verzeichnisse werden nicht entfernt, wenn sie andere Dateien -enthalten als die, die durch das Programm setup von AFS für Windows -installiert wurden. -
      -
    • Die Programmgruppe IBM AFS wird aus dem Menü Start -entfernt, wenn keine anderen AFS-Komponenten installiert bleiben. -
    • Das Symbol AFS Client Configuration wird aus der -Systemsteuerung gelöscht. -
    • Das Menü AFS wird aus dem Kontextmenü des Windows NT-Explorers -entfernt. -
    • Der Service IBM AFS Client wird gelöscht. -
    • Die Einträge in der Registrierungsdatenbank für den AFS Client werden aus -dem System gelöscht. Beachten Sie, daß bei der Deinstallation bestimmte -Informationen in der Registrierungsdatenbank verbleiben, wenn Sie festgelegt -haben, daß die Konfigurationsdaten erhalten bleiben sollen. -
    -

    Änderungen am System durch Deinstallation von AFS Light

    -

    Wenn Sie AFS Light deinstallieren, werden folgende Änderungen am System -durchgeführt: -

      -

    • Alle AFS-Dateien werden aus dem Verzeichnis -\Programme\Ibm\Afs\Client\Program gelöscht, und das Verzeichnis -Ibm wird entfernt. -
      Anmerkung:Die Verzeichnisse werden nicht entfernt, wenn sie andere Dateien -enthalten als die, die durch das Programm setup von AFS für Windows -installiert wurden. -
      -
    • Die Programmgruppe IBM AFS wird aus dem Menü Start -entfernt. -
    • Das Symbol AFS Light Configuration wird aus der Systemsteuerung -gelöscht. -
    • Das Menü AFS wird aus dem Kontextmenü des Windows-Explorers -entfernt. -
    • Die Einträge in der Registrierungsdatenbank für AFS Light werden aus dem -System gelöscht. Beachten Sie, daß bei der Deinstallation bestimmte -Informationen in der Registrierungsdatenbank verbleiben, wenn Sie festgelegt -haben, daß die Konfigurationsdaten erhalten bleiben sollen. -
    -

    Änderungen am System durch Deinstallation von AFS Server

    -

    Wenn Sie den AFS Server deinstallieren, werden folgende Änderungen am -System durchgeführt: -

      -

    • Alle AFS Server-Dateien werden aus dem Verzeichnis -\Programme\Ibm\Afs\Server gelöscht, das Verzeichnis -Server wird entfernt, und falls keine anderen AFS-Komponenten -installiert bleiben, wird das Verzeichnis Ibm gelöscht. -
      Anmerkung:Die Verzeichnisse werden nicht entfernt, wenn sie andere Dateien -enthalten als die, die durch das Programm setup von AFS für Windows -installiert wurden. Wenn Sie festgelegt haben, daß die -Konfigurationsdaten erhalten bleiben sollen, werden manche Dateien im -Verzeichnis \Programme\Ibm\Afs\Server nicht -entfernt. -
      -
    • Die Programmgruppe IBM AFS wird aus dem Menü Start -entfernt, wenn keine anderen AFS-Komponenten installiert bleiben. -
    • Das Symbol AFS Server Configuration wird aus der -Systemsteuerung gelöscht. -
    • Der Service IBM AFS Server wird gelöscht. -
    • Die Einträge in der Registrierungsdatenbank für AFS Server werden aus dem -System gelöscht. Beachten Sie, daß bei der Deinstallation bestimmte -Informationen in der Registrierungsdatenbank verbleiben, wenn Sie festgelegt -haben, daß die Konfigurationsdaten erhalten bleiben sollen. -
    -

    Änderungen am System durch Deinstallation des AFS Control Centers

    -

    Wenn Sie das AFS Control Center deinstallieren, werden folgende -Änderungen am System durchgeführt: -

      -

    • Alle AFS Control Center-Dateien werden aus dem Verzeichnis -\Programme\Ibm\Afs\Control Center gelöscht, das Verzeichnis -Control Center wird entfernt, und falls keine anderen -AFS-Komponenten installiert bleiben, wird das Verzeichnis Ibm -gelöscht. -
      Anmerkung:Die Verzeichnisse werden nicht entfernt, wenn sie andere Dateien -enthalten als die, die durch das Programm setup von AFS für Windows -installiert wurden. -
      -
    • Die Programmgruppe IBM AFS wird aus dem Menü Start -entfernt, wenn keine anderen AFS-Komponenten installiert bleiben. -
    • Das Symbol AFS Control Center wird aus der Systemsteuerung -gelöscht. Dieses Symbol wird nur dann in der Systemsteuerung angezeigt, -wenn keine anderen Komponenten von AFS für Windows auf dem System installiert -sind. -
    • Die Einträge in der Registrierungsdatenbank für AFS Control Center werden -aus dem System gelöscht. Beachten Sie, daß bei der Deinstallation -bestimmte Informationen in der Registrierungsdatenbank verbleiben, wenn Sie -festgelegt haben, daß die Konfigurationsdaten erhalten bleiben sollen. -
    -

    Änderungen am System durch Deinstallation der Komponente AFS Supplemental Documentation

    -

    Wenn Sie AFS Supplemental Documentation deinstallieren, werden folgende -Änderungen am System durchgeführt: -

      -

    • Die Verzeichnisse SysAdminGd und CmdRef werden aus -dem Verzeichnis \Programme\Ibm\Afs\Documentation\Html gelöscht, und -falls keine anderen AFS-Komponenten installiert bleiben, wird das Verzeichnis -Ibm entfernt. -
      Anmerkung:Die Verzeichnisse werden nicht entfernt, wenn sie andere Dateien -enthalten als die, die durch das Programm setup von AFS für Windows -installiert wurden. -
      -
    • Die Programmgruppe IBM AFS wird aus dem Menü Start -entfernt, wenn keine anderen AFS-Komponenten installiert bleiben. -
    • Die Einträge in der Registrierungsdatenbank für AFS Supplemental -Documentation werden aus dem System gelöscht. -
    -


    [ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ] - - -
    © IBM Corporation 2000.
    - - - - \ No newline at end of file diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg004.htm b/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg004.htm deleted file mode 100755 index 3c94b2311..000000000 --- a/src/WINNT/doc/install/Documentation/de_DE/html/InstallGd/awqbg004.htm +++ /dev/null @@ -1,350 +0,0 @@ - - -Erste Schritte - - - - - - - - - - - - -

    Erste Schritte

    -

    -


    Index

    -A -B -C -D -E -G -I -K -L -N -O -R -S -U -Z -
    -A - -
  • AFS - -
  • Übersicht -(178) -
  • Client - -
  • Übersicht -(191) -
  • -
  • Control Center - -
  • Übersicht -(188) -
  • -
  • Deinstallationsverfahren -(263) -
  • Deinstallationsvoraussetzungen -(259) -
  • Erweiterung -(205) -
  • Installationsoptionen -(197) -
  • Installationsverfahren -(208) -
  • Komponente Supplemental Documentation -(195) -
  • Komponenten -(182) -
  • Konfiguration - -
  • Übersicht -(221) -
  • AFS Client -(224) -
  • AFS Control Center -(255) -
  • AFS Light -(233) -
  • AFS Light Gateway -(227) -
  • AFS Server -(237) -
  • -
  • Light - -
  • Übersicht -(194) -
  • -
  • Neuinstallieren -(257) -
  • Server - -
  • Übersicht -(185) -
  • -
  • -
  • AFS Client -(201) - -
  • Übersicht -(189) -
  • setup.co-Datei -
  • Deinstallation -(265) -
  • Installation -(210) -
  • Konfiguration -(223) -
  • Konfigurieren, als AFS Light Gateway -(225) -
  • nur Client installieren -(200) -
  • -
  • AFS Control Center - -
  • Übersicht -(186) -
  • Deinstallation -(268) -
  • Installation -(213) -
  • Konfiguration -(254) -
  • -
  • AFS Light - -
  • Übersicht -(192) -
  • Deinstallation -(266) -
  • Gateway-Maschine -(234) -
  • Installation -(211) -
  • Konfiguration -(232) -
  • -
  • AFS Light Gateway - -
  • Authentifizieren von AFS Light-Benutzern -(229) -
  • Konfiguration -(226) -
  • Synchronisieren der Zellendatenbank -(228) -
  • -
  • AFS Server - -
  • Übersicht -(183) -
  • Deinstallation -(267) -
  • Installation -(212) -
  • Konfiguration - -
  • Übersicht -(236) -
  • als erster Server in einer Zelle -(238) -
  • als Server in einer vorhandenen Zelle -(249) -
  • -
  • -
  • AFS-Partitionen -(243) -
  • AFS-Root-Volumes - -
  • beim Konfigurieren in einer neuen Zelle -(244) -
  • Konfigurieren eines Servers in einer vorhandenen Zelle -(253) -
  • -
  • -B - -
  • Backup-Server - -
  • Konfigurieren in einer neuen Zelle -(242) -
  • Konfigurieren in einer vorhandenen Zelle -(252) -
  • -
  • -C - -
  • CD-ROM-Dokumentation -(218) -
  • Client - -
  • Übersicht -(190) -
  • -
  • Computer-Benutzerkonten -(231) -
  • Control Center - -
  • Übersicht -(187) -
  • -
  • -D - -
  • Database Server - -
  • Konfigurieren in einer neuen Zelle -(241) -
  • Konfigurieren in einer vorhandenen Zelle -(251) -
  • -
  • Datei-Server - -
  • Konfigurieren in einer neuen Zelle -(240) -
  • Konfigurieren in einer vorhandenen Zelle -(250) -
  • -
  • Deinstallation - -
  • Änderungen am System -(269) -
  • Übersicht -(256) -
  • Verfahren -(264) -
  • Vorbedingungen -(260) -
  • -
  • Deinstallationsverfahren -(262) -
  • Deinstallationsvoraussetzungen -(261) -
  • Dokumentation - -
  • CD-ROM -(217) -
  • Online -(215) -
  • Online-Hilfefunktion -(219) -
  • -
  • Domänen-Benutzerkonten -(230) -
  • -E - -
  • Erweiterung -(204) -
  • -G - -
  • Gateway-Maschine, Name -(235) -
  • Generisches Verwaltungskonto -(239) -
  • -I - -
  • Installation - -
  • Änderungen am System -(214) -
  • Erweitern einer früheren Version -(206) -
  • mögliche Komponentenkombinationen -(198) -
  • nur Client installieren -(199) -
  • Verfahren -(209) -
  • -
  • Installationsoptionen -(196) -
  • Installationsverfahren -(207) -
  • -K - -
  • Konfiguration -(222) -
  • -L - -
  • Light - -
  • Übersicht -(193) -
  • -
  • -N - -
  • Nachbildung - -
  • beim Konfigurieren in einer neuen Zelle -(247) -
  • -
  • Neuinstallieren -(258) -
  • Nur Client installieren -(203) -
  • -O - -
  • Online Dokumentation -(216) -
  • Online-Hilfefunktion -(220) -
  • -R - -
  • root.afs -(245) -
  • root.cell -(246) -
  • -S - -
  • Server - -
  • Übersicht -(184) -
  • -
  • setup.co-Datei -(202) -
  • System Control Server - -
  • in einer neuen AFS-Zelle -(248) -
  • -
  • -U - -
  • Übersicht - -
  • AFS -(179) -
  • Dokument -(180) -
  • -
  • - -Z - -
  • Zielgruppe -(181) -
  • -


    [ Seitenanfang | Vorherige Seite | Inhaltsverzeichnis | Index ] - - -
    © IBM Corporation 2000.
    - - - - \ No newline at end of file diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/banner.gif b/src/WINNT/doc/install/Documentation/de_DE/html/banner.gif deleted file mode 100755 index 8322005fe24641aa231689a8726a9ebdc5325563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8323 zcmYLOc{tRM^MCK{wpenNT}N)M+alJwS6J)FZCUqGiXuwuR#Yn+71b(BM3&t5edS7` zP@g47=|Tsk+F#$let*n7um9#XGtbO3&ueV$ZH#b%c3?YToeOZeTuDhuRaI4OZEYM5 zMFVd zCXzA8JSv$HM{Q)4CpRf$MdDiTBF!BBAoZ*4+cTrz`5jv|mVw5eQg>OY)^ zQKd>^;*gSY|5BNp-1x_%v-3@3;~bTm%wkP47(*=98}I*-h)YhcArk);poB=w(AM@Q z67z7le;@;ijN;*m0stfcr~&{10K5T!TEdu{9Qx8(vq8{~!f6w57_usoK=qE&{^yBQ zZHzWql}wN%kTC=TQkx*D?TsU9BQaDW82|u{e+K-o7kC7hb}=nIBQq;I=hEfey!5b( zVfojuhlhn1-MkqQ9&zXHy*rT+k!7rMR#atVWp&NtT6SIilZM8o=9bpB_Kwc3?w;Ph z{+iIJq0rHg(5GYLAt5d~a5I`8hvzuh)i0OwBh(MO4wQK+U>}q3T-Uz$9E*P^o&WN{;fVl((rb z8!b?At@0hM4^ayqrYku}umo-u2M@i=I9(8iylXcCt(#M{7d>bfHU2Q4I+Q0%mQCCO zFvABl++=54wy8GhEd9Po+BAzPmL3NASQl?^maSlg5h19#WNZanHx~ z?vmm+QO^~N4YXiy=*#)p&UbJ!!6g)nrNJCHxhy!s`>KVY*73(!=6%!L?;oNIH}-yg z(ZHwwLCyKi&THM@xj3fl^6lM83Nc;%#O-UIDBEil1mmodwr(!B>!!;f3Sxt$M7YLd zawR>2O9dr7>AieXJkp-G#i{6r%c$V<<$+<MOnA5e%FpxJpaJwOW?32)nYbVw zAR7)tRpSHi7;N^tUOg1f)QdzB+ z8YzCKrp4xf2yISE!m(v$86{b-vx%yS&f3g-T*4=P@o?{~wBs{W#A*S_RCPei#uQ{* z;E*9Qgp3t%u@bQq&;~#UC_ZYzpd`N|*; zo(jH#ICOq>`OG1o?9zTAGoIysVWsofzOLxq+%M4R-|P%8h;H!i>%ab$v*OzySG|&GR1AZ=*Zyqpe6P^wAUHv`HhfB;a+wMiuK?m2^nNwlt&;r@faumR>DG01F{0eSd#j+NDYk%Ex{ zC1aOMr05{jJ(WQ<^7dud@%!S9IfI%>b-9$)`;y&8L)h!vd7<(0+#lAUrWds-U!NDt zZoEX=*lU>4_)E$}pGXo*`(pF>%g_jWyQ1nWeO)gb-AJ&Y&7lYZ+_Nl$$O1ua8iumo z)A#ETI#Ws!!_5*3?}@*EJ-z%lQ(Zrn7RLs`50>j01smWQ#6T8rch3QO#Td9h3EG?G^0XfyjJ&!XPsVkkvxrt$`W23oC2q zgl-(lGMEiSq=#b`-Xbr#K(9%TzO&{jstexSxQ&KImY8aGs$xp!CIu>u7ZY#mfopa| zIPP#y7f3`hA)b?>0**Y+1mJsxU*Q=oJ_YsrhjtE_2(7#H>*Z-%1j+?_Y(97zU+E9S zHE76&yD5OhEB#O10$s9kV|l4od2g1g{Z;8#=~0Kw@X~qNFEAwU zq3&V*C;&PtrJHZ#cvY`85(DB5+3J;fgUp)mG7v~$f&_xm5J`bl#M%l-h)hcp!}b_^ z#*o}!Ghs=N%l^M2Eyb@Ix+il)kBYoj@{Lz@vG{rYXv~Ev>#q-=weEI9!#<^%CUUH!Nl;jSVJB}zuel^ip< z1{oN!7&XgsT&lF82?8cZx)NyvoD#_)87L0)3R(78G-q)ja$5k;fRY8zQf#e3I6EMw z058+UtVo{T9>#ac44_x$wy!6ct^dieoryB~(Y8BEx>`>R4GIh&|HeytxbVEJ35T&- z=Jm?$kM4{`m}g*w670Sn>_cXxT#Z4PPxlJT0w4{~K)n6SJD=ihP0m7pPSN~%{##Ob zqY$O1a5iLTsBHY5jfpXSn9UYpTD(_g^v)DL{U$b`ucd%WMch49^l;)F^hlxwFL5gk z#K30bm`VI`Bd;YyIqmAJpZWA#z`#Pw5hxxH5&#S!IoUMuo-~L*2Y}{r?|ck7(lakC z*|d+uegvt=fT1}(0EhVzEQ?>5Ix7d2*rLG&C;%U=r|AHe1}QNC3m7G|&3DoOo*qDu zZ3sF4>4Z@Z4Fr|M1G3DIX}OCW9`lwyvB|AWla6KN#g+jDr|nBV9V?REEknAK+gFl1 z-lDlJBbH7(`NbWpO6IL&+JC!t2Ty`yOYV(_Ii=ouUXs#2bZ#Q*@z;_s9UJDtNmFrM zQFr<8ydyZbP32#WD>r%l&N2Jf^9N4fD}DSnJ!_NZY9D`p9QWsgk8u0^pwN%H;?9rZ z%IynNT|XM0{P}d^TJqwC&~EkDrS-(-bIe_#H=V8S*rFVD8~HQi+BR%7NNM zKw)NVmb4lfGFDLRYbm2%f92@MWoVq8MFEnt>NZ+BDn;qFV8j!SM?HZZT(Xp-aI!6; z(fi&DcfYg*SPk%K9<$_syp^Z@+t%!M;*bn?@AH}8k)o=&u>@BGLyYqJu3naAY`-k- z<%Te01yvE9{q1!C@pzN4IBnvSMyN&Zr+rM8((2zoZNjzIuzSxGPpi>IQXB4Lml*@8jruY{>4@Ii^;*qQ)Yv&E?+cI5eUX})omf(C8?AidVo7cpneA4 z*>}P{bw1R-H{Y4I%{JM+okY!lFTMH z5l2L5U?W$Y3$0-r=0FS4*Y}~25a=zC7FO1V1=eDt3_11!9D741R2~b)Ov575d?W84 zj>f}?%kFPVCC((~UZv-DAQIEEgAY8n9i7!4Y|a@-4C6_I1yCHjkP7MV_%0cFjv!pe z5$E#v9E0(=lYqX%G-RV0hNXcuIpD!%E?AES(ZfRwW3LjYfzY(W5i>Av&f(}D-$=p{ zPh>LXhG5{Ja?8tW(Km8e^hJ(%Y9~YUHbYeV?ebE?;UpSt$_PEhBfSlSK|}*8x1?_9 zV?=)PMdFoZgVb7A()VD}yN&P;uovr;9;=jGO^0D3g!%gN2IM_$6+ERPyom+g&wxwz z1gO^!I9UvOv=Qn%4GDP&Il|FWp-DN`CWUusd!t ze2U!p^00Bnd1Cu~1Y>*Q6+9b^HcN%q{0AqcFQ1Hc2Xy1#(D^`pk@@vVLVu*Cn{P2Iv*9 z=TWxe%J~A*doDOR$FsW#PJv#-%e={5U3QRl)O25_qm1YAbY_Ja- zn#_h5vw7Ote8p@sO&0l-ExO1S^Ql86*GUxDNw(KXFV@NK*Bz3nM<>?_tJfbksaKXE zD&^M8?X$J`>yF4g5m7%1-mf)?VwcVW#!*j3-`0-5ePX`&#G>6)c-rhU#9VaRrbo=Q z+a|_FCTT6pl%E5T9U6z90D?W4!n8)=SinCQa7zZfl1+miHS)y*0%eVn?M=~-8j(Ff zsnv-XljeAz=CjGoiN(!H?ak*Gn^X3iX)-NoCM_90Em_GeXZagHrgK|p`wfG-ro9i2 z*c>;yKQ@os%Xh5Xu_(c~qu+F?-|Tlk zUUqq{Y!0Gn@Np_HII_UPXf2_)|-L_E7^5W^t@(TmS{ln$6 zNj1U0%f$=r^f7|d9BHeS^G&lUO8tUPFQGnY`!zc3-T@NG72-&T+;$Vf;qAX8Js8mP zKo}BsLjqDK5%DaA=geRtm3dKF1mbl}M!e=iOL#SQC}e5$1nzE(uh_JxX0-d*9aDKFAu%V{81qy zxDb49ZFD-iN>BIJc*PLi2x--(Q!on+nua(|b75;(AvYTAkc!0eE-LXiiinXg$HRn? z;9UT2z?Nt_o*TA2GT=L&|B)vlIC#vLzMGJkA~^xQP?Ozo9(+?k*V?tB1Bcg!zv4iR zQw0OIg!DPi=4@wTAb6GJOr93HqnNg+oaVfoYDiD{b`1HWWa^hj_~o6MKY7f7)xmMu zyrP}#65na#*B6<`6m3OOh;UuHU6~{BWpmuc7~mLFW~mFNp>66iTalOA@t{0ysn zvU<++H7tgM4xqzgXfShmcq1M0s9dQtWEP0nUDff2ItMTZ$ebB;i z7~F#f%UhsvFc<)q+yY4=Wxe~rT7dHi zCW*CbZ;yo>XF}fdK%Glv?-fA|wovyQl=C`X{@!~DvwU@3a3xcIMZqap`%W>`OKzfi zG}`_R>4(%4JmzI9mp`qMLgk=RFq_{2!OI%->NJbEXxQ1$Alx_`RX=Wy+yo1zA9+b9nvjJ%CX z*RK@T98FThZ4WU}t0Vw!;=YuRSa=^q`2tNsOugn?8%yfML^JKyvw;Xo2 zpG*o$Ry$hEQ|i$@Kq|TGmy+fe#TuN9EY!PG$YO>YzFrCIIu0sSH zM5YYbTxCC@V3fFaN6yMq**6DS{?%_blh3GOc%@^Q^7SbKhT0{3O=QSUNgwH)NY;H@ zOL*2RvFE6Ym~qGYP&^%ac>3x~7rhAUb()CXys_N&h{PEkQ&ogRorm8AXs8{;YX*EI_Uf7uU>OThMN?hRxqJ0o{-vtyPU6ac z`3oa~n1{KaQf)R%A~&a{r*BnX#9jHCstDJry8o0{+T!iH*FC=CFRI!)=wzwuZ18vF z9N&o(uo}Fynd@7xsh^i_p*>^e)ubO>VwEc5K7fTa&rCW#$_%mWRkYiJN6`^3hEd&~#XPhuXzo;aMN)5YC?itYaIKYzIZgl{%s-M?3t zN9?dw9Q;aucKD1{{LS+FgO?*`f|nk;Tp7L=3C}FE{(r@m^|T0!uLL+? zbqlNR(B+?5DTZE=RClQ|x=n82mGBB~3$D99IE%TPUhmt;h$D)VwL@6mjcNxT>x5?T zLf~tckSc^UNer2G4XFr&XGjHw@m!O)&O-KB-~l1D3MrT=DwHb`x3Tb$I`7m6eJWOE zS9(48X;1PoLM~h-siAA8^k-=(I7#1Z9?UOo`VfiX_Aeq;Z5W9n4{Y+}Owt7G&rgi7 zM+(#fCOcY3kHjz;8o|6{Dkb^x#`QWp9uxN*(zWWHM%&_dviaZh?w*>b{R%#Qa+^g5kt%tMDyEM=b=twnhbnsPmGPmLG@IqT`~Gcy zscz`Dgs+vX9aO{x6=)?z(>KZxHiLqoqDE-0v?o$2-Zf3;dd=6;kegRj?nC{~Kg%cw z)vT*V)m%`kiny5f%RA!d&CM0LBWm$Jmby-E53U#`DK5nx6{`I3xZ{U$?%87#GuGmc z3%e|NJ@;*YjKe6{En%3vJW_W(`oN_NIn~3V3Z|?eckwWrAR;>-?=qM_@|ry7)xJmA zC<$JYvO>D>)NS02o7m5iwH$edIB0ZomyI_>h%RsFnJ3DQNogV zhVV(Fbi~1POZm1-=T}8+g^%(qLxhbLW&2P?UP%!$@~6QzViY5nI`aqjr6b=y{PZC5 zVa27f`_b5iIc=+s)TQDYnJalwV`W7re!YKK;eWlYspJK}59y}Gk0XW^ni(R50Sm;z z#3hmJ&!<;=hqvN}QwM}h-T_dgF@v3oK=GIbN%&}VLl0b9q;LOIZ0}7CH7*;xt!@A( zJbKq!_4x0vkIi4q9BQ5{=9Zi`tCK)cQ7X{XUuN4wU%EcrSz1}oHj(W`7~7$D;E=C<-LM-j;;cl4wgmdD&PwP? zV)%k@775S%$RMy{PFmpK=$xl@piQ6g8rZFhsgGD|d6Lup#_z*x(L+v2Gw5oaw*;Ga z+B+8>D@4nB{qpr3_GsI=p&k8ter&5k<_!rC*6EWwbIYJX@U(y8lU|`b4nzif8gcYx zD)I&ip=9LBThzdjVB3x2qI)lM?~R8_3d@hV7(+ekbk?qrFLk|Tix$2+R$=V8u0OYy zcHrEYt5k~7l$=>APs+*~TG(ENuuVD19RLY3D6}x+I3XfuMZdy+0_wY+yO0--XuXBg z%lb-<61XFC>3QFoq;C(<;xj3E^vg11UwOY*Z;17=$;pRD5WIaLp&vTWv9ilN{x8!+ zu_KvbL8pX#+2!K3Oh7~QJD+`v8&n=hEhlh5!m%_r8T5-P@9$Nf6IC9~V=o>jeSbs| zeB?PyoU6b6y*k|Sk@x)ATvOZkn%Fby?v-QiZ5}TkhYWu3+l_SZB)q6}ID>$xkfh3W z8Y@YT(Qc)iz>x9TI(iH@I#^Eq)fo9leZfR^i2lB(D*nY2VW1}5++ktb3=h3){VBrr z>B5V)xrVAMH7Ki|R|{9?8d^GQPB^qLF75ni?h-t4GMnFbg|E3~#{NTECe%2tlJk!2kXY?}~chSv`Odk_Iyp2MGxQ5D7XBjOPf$!#BZyIh=AK zppQ?I=4yLvMYOo35}AUBIE}AJwC@dKuh!*-9eXRixHn`pS$8#I{OzIry2H0PqTojXbcH9tTeHDN(J7^Fq3JCIW=LUifKm_oBpr;yCw1>v?I}m_`$3o#u zn$7{*xWmLrh60-Qv(KVe*fZ{y2=m`pL~82z-IIVk{XbP*03;HQ2T20i>IzAd^s5bJ z%8u`eKEGyePBxSqPP}(Y{`H(G)cDZWag$v9Yxd!Ke29(SOGV{dU?C4Yct}8=SC2W0 z46g?VX{P!)dxDWF_z=-)fEUTs8Fo7RK#T(@i=n}y%qLJN5MwU4_)?gT2TR~%sFs`s zaJVhd@QLQ*`f?85(pV!#`f#>=|Mk|@=8g@=FG-90Z}ujeyLKnOr0nni2MD+HAe`Q9 zrEU0FJ&V$Z0X;1Z00$4q4&k(RuAlt9D&dS9 zbm=;M;E->>)iU%#_5Z<{HYj4v~} z@ZR}k(zKHQc5l8rbLXbE91mdff56Fq4gdfE diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/books.gif b/src/WINNT/doc/install/Documentation/de_DE/html/books.gif deleted file mode 100755 index d7016d109b327660b4d201a945d4150b0badaab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbh9u|RA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fItVN1Ekl1 z<==+}&((V?PL=PGCCWK Rvc61SxY#|DNsxiT8UUgqmBIi3 diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/bot.gif b/src/WINNT/doc/install/Documentation/de_DE/html/bot.gif deleted file mode 100755 index fd67baba68a4a83f563cc4694a3ae1229f5e29b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmZ?wbh9u|RA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fItVN1Ekl1 z<t<&l{6w756o z!s1C8tE1MRmMY6$YBlkJ=H?%a?dgx_TXtTPn(RLDMr>VF$=hXy9Vb`+YiMk0t~bnX zSIvy+w&}|6D5^{`XPG)}`c%c@s?r(rSY}Pi;-5cbVQ_syNo$G1#vQT#^X z&1<%zg@F8|HtWt8itPwSXn%$ zc+cVEN|jm}vijZUBk#8Co4Ml%^L_@;{K8f5X6~N9agWZ|tM9h;l^%Wn`+q}?E`LjF zTYE=mX>OpeqCrnpw~z>XQA*zAiSe^ED@;oIVq$vo7f+j?oIQJHpG9WwvNe;|O<1Y2 bFx+PP^wpc^1vMTz>@!93_z8JI1_o;YMPO~( diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/index.htm b/src/WINNT/doc/install/Documentation/de_DE/html/index.htm deleted file mode 100755 index 846fcd431..000000000 --- a/src/WINNT/doc/install/Documentation/de_DE/html/index.htm +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - IBM AFS für Windows-Dokumentation - - - - - - - - - -
    [IBM AFS für Windows-Dokumentation] -

    -IBM AFS für Windows

    - -

    -Version 3.6

    -  - -

    Willkommen zur Online-Dokumentation zu IBM AFS für Windows! - -

     Online-Dokumentation: - -

         IBM AFS für -Windows Erste Schritte -
      - -

      -
     PDF: - -

    Dokumentation im PDF-Format wird nicht gemeinsam mit der Online-Dokumentation installiert. -Sie können auf die Dokumentation im PDF-Format direkt auf -der AFS für Windows-CD-ROM zugreifen. Die PDF-Dateien befinden sich im Verzeichnis CD:\Documentation\de_DE\PDF -, wobei CD dem Laufwerksbuchstaben des CD-ROM-Laufwerks entspricht. -
      - -

    © IBM Corporation 2000. -Alle Rechte vorbehalten

    - - - diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/next.gif b/src/WINNT/doc/install/Documentation/de_DE/html/next.gif deleted file mode 100755 index 160798fa56e955d665f19e59675fd4f6cda0e1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmZ?wbh9u|RA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fItVN1Ekl1 z<;aHy&((V?PL*3#BxrQSbCj?*`OGn&bhEfjt2=FD=e7I2@hcLtt`_fg6S>rP1ov*XymDuo zXwj+eQ4EQhP?S?r8Xjk^z%pz0obs&cZgUo~%v(}eSH-`0uFR_PNh?>+HtJqpIb+o# zK8tM&{1)>a^9>wNggRH*TpgCGNg FH2^`$b&CK1 diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/prev.gif b/src/WINNT/doc/install/Documentation/de_DE/html/prev.gif deleted file mode 100755 index e1d38f3d87ee9d0f02c8bb4751f199e8d051bbc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmZ?wbh9u|RA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fItVN1Ekl1 z<=BS?&((V?PL*3#Jowz2qFKh?(i9ek^!=q4AbYviYI8p>sm|W)zpi9;w?oF)}sH-$1La zy`!@$wzikQDq*5aNl*?)%mihYn%c_zS#wwxEnZUB(y%~;Z^@cv;VZlh`T4f2UTd;G zP~K_V(j8OEMflfjpSR(#jKYz9$9A1sczV&g1EHrb&fY)4wLIkPr2EVJyB|N%7HWEt JCdj~G4FF0Fd+Y!J diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/toc.gif b/src/WINNT/doc/install/Documentation/de_DE/html/toc.gif deleted file mode 100755 index 41bb3b3691a948e8499f2f4b042dadf77ec65a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmZ?wbh9u|RA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fItVN1Ekl1 zW!Z-Y&((V?PL*3Z$8$6Vae73xD+piTTc8vC{?@6Ax_MgMJ9a+kzP_8Yf9a$5s#&w< z>A0L_cTvjqUM(7Z^-u@g^Z%B<5Or)MplwWxIN{0Vh)mMS?eESZ}!XU*F5 a^}7s3H*cA(+j{7*nTF)?6Y7Et4AuZ*_Gxwi diff --git a/src/WINNT/doc/install/Documentation/de_DE/html/top.gif b/src/WINNT/doc/install/Documentation/de_DE/html/top.gif deleted file mode 100755 index df8985b34e220e14fd0347940bda9b260c9c5f5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmZ?wbh9u|RA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fItVN1Ekl1 z<=}?~&((V?PL)@&`%A<zxO8yu7$z?%z#wS6x4}Hfgis>BpxO zTTN$|cs^7^C@5l=%?dNBi#wW@*jm0XltBhra#H_iQ1ydF>@GV-sY7T$p{1vm;%wE57 zx%sw*v$iem+qL`9{!IrD?b}cie(d - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Table of Contents] [Bottom of Topic] [Next Topic] [Index]


    -AFS
    -Administration Reference
    -

    Version 3.6 -

    Document Number GC09-4562-00 -

    First Edition (April 2000) -

    This edition applies to: -

    -
    AFS for AIX, Version 3.6 -
    AFS for Digital Unix, Version 3.6 -
    AFS for HP-UX, Version 3.6 -
    AFS for Linux, Version 3.6 -
    AFS for SGI IRIX, Version 3.6 -
    AFS for Solaris, Version 3.6 -
    -

    and to all subsequent releases and modifications until otherwise indicated -in new editions. -

    This softcopy version is based on the printed edition of this book. -Some formatting amendments have been made to make this information more -suitable for softcopy. -

    Order publications through your IBM representative or through the IBM -branch office serving your locality. -

    © Copyright International Business Machines Corporation 1989, 2000. All rights reserved. -

    -


    [Return to Library] [Table of Contents] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf002.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf002.htm deleted file mode 100755 index 737cbb489..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf002.htm +++ /dev/null @@ -1,314 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    Table of Contents

    -

    Tables
    -

    About This Manual
    -

    -
  • Audience and Purpose -
  • Organization -
  • How to Use This Document -
  • Related Documents -
  • Typographical Conventions -
  • -

    AFS System Files
    -

    -
  • afs_file_intro -
  • AuthLog -
  • AuthLog.dir, AuthLog.pag -
  • BackupLog -
  • BosLog -
  • BosConfig -
  • CacheItems -
  • CFG_device_name -
  • CellServDB (client version) -
  • CellServDB (server version) -
  • FileLog -
  • FORCESALVAGE -
  • KeyFile -
  • NetInfo (client version) -
  • NetInfo (server version) -
  • NetRestrict (client version) -
  • NetRestrict (server version) -
  • NoAuth -
  • SALVAGE.fs -
  • SalvageLog -
  • TE_device_name -
  • ThisCell (client version) -
  • ThisCell (server version) -
  • TL_device_name -
  • UserList -
  • Vn -
  • Vvol_ID.vol -
  • VLLog -
  • VolserLog -
  • VolumeItems -
  • afszcm.cat -
  • bdb.DB0 and bdb.DBSYS1 -
  • cacheinfo -
  • fms.log -
  • kaserver.DB0 and kaserver.DBSYS1 -
  • kaserverauxdb -
  • prdb.DB0 and prdb.DBSYS1 -
  • salvage.lock -
  • sysid -
  • tapeconfig -
  • vldb.DB0 and vldb.DBSYS1 -
  • afsmonitor Configuration File -
  • package Configuration File -
  • uss Bulk Input File -
  • uss Template File -
  • -

    AFS System Commands
    -

    -
  • afs_intro -
  • afsd -
  • afsmonitor -
  • backup -
  • backup adddump -
  • backup addhost -
  • backup addvolentry -
  • backup addvolset -
  • backup apropos -
  • backup dbverify -
  • backup deldump -
  • backup deletedump -
  • backup delhost -
  • backup delvolentry -
  • backup delvolset -
  • backup diskrestore -
  • backup dump -
  • backup dumpinfo -
  • backup help -
  • backup interactive -
  • backup jobs -
  • backup kill -
  • backup labeltape -
  • backup listdumps -
  • backup listhosts -
  • backup listvolsets -
  • backup quit -
  • backup readlabel -
  • backup restoredb -
  • backup savedb -
  • backup scantape -
  • backup setexp -
  • backup status -
  • backup volinfo -
  • backup volrestore -
  • backup volsetrestore -
  • bos -
  • bos addhost -
  • bos addkey -
  • bos adduser -
  • bos apropos -
  • bos create -
  • bos delete -
  • bos exec -
  • bos getdate -
  • bos getlog -
  • bos getrestart -
  • bos help -
  • bos install -
  • bos listhosts -
  • bos listkeys -
  • bos listusers -
  • bos prune -
  • bos removehost -
  • bos removekey -
  • bos removeuser -
  • bos restart -
  • bos salvage -
  • bos setauth -
  • bos setcellname -
  • bos setrestart -
  • bos shutdown -
  • bos start -
  • bos startup -
  • bos status -
  • bos stop -
  • bos uninstall -
  • bosserver -
  • buserver -
  • butc -
  • dlog -
  • dpass -
  • fileserver -
  • fms -
  • fs -
  • fs apropos -
  • fs checkservers -
  • fs checkvolumes -
  • fs cleanacl -
  • fs copyacl -
  • fs diskfree -
  • fs examine -
  • fs exportafs -
  • fs flush -
  • fs flushmount -
  • fs flushvolume -
  • fs getcacheparms -
  • fs getcellstatus -
  • fs getclientaddrs -
  • fs getserverprefs -
  • fs help -
  • fs listacl -
  • fs listcells -
  • fs listquota -
  • fs lsmount -
  • fs messages -
  • fs mkmount -
  • fs newcell -
  • fs quota -
  • fs rmmount -
  • fs setacl -
  • fs setcachesize -
  • fs setcell -
  • fs setclientaddrs -
  • fs setquota -
  • fs setserverprefs -
  • fs setvol -
  • fs storebehind -
  • fs sysname -
  • fs whereis -
  • fs whichcell -
  • fs wscell -
  • fstrace -
  • fstrace apropos -
  • fstrace clear -
  • fstrace dump -
  • fstrace help -
  • fstrace lslog -
  • fstrace lsset -
  • fstrace setlog -
  • fstrace setset -
  • ftpd (AFS version) -
  • inetd (AFS version) -
  • kadb_check -
  • kas -
  • kas apropos -
  • kas create -
  • kas delete -
  • kas examine -
  • kas forgetticket -
  • kas help -
  • kas interactive -
  • kas list -
  • kas listtickets -
  • kas noauthentication -
  • kas quit -
  • kas setfields -
  • kas setpassword -
  • kas statistics -
  • kas stringtokey -
  • kas unlock -
  • kaserver -
  • kdb -
  • klog -
  • knfs -
  • kpasswd -
  • kpwvalid -
  • package -
  • package apropos -
  • package help -
  • package_test -
  • pagsh -
  • prdb_check -
  • pts -
  • pts adduser -
  • pts apropos -
  • pts chown -
  • pts creategroup -
  • pts createuser -
  • pts delete -
  • pts examine -
  • pts help -
  • pts listentries -
  • pts listmax -
  • pts listowned -
  • pts membership -
  • pts removeuser -
  • pts rename -
  • pts setfields -
  • pts setmax -
  • ptserver -
  • rcp (AFS version) -
  • rsh (AFS version) -
  • runntp -
  • rxdebug -
  • salvager -
  • scout -
  • sys -
  • tokens -
  • translate_et -
  • udebug -
  • unlog -
  • up -
  • upclient -
  • upserver -
  • uss -
  • uss add -
  • uss apropos -
  • uss bulk -
  • uss delete -
  • uss help -
  • vldb_check -
  • vlserver -
  • volinfo -
  • volserver -
  • vos -
  • vos addsite -
  • vos apropos -
  • vos backup -
  • vos backupsys -
  • vos changeaddr -
  • vos create -
  • vos delentry -
  • vos dump -
  • vos examine -
  • vos help -
  • vos listaddrs -
  • vos listpart -
  • vos listvldb -
  • vos listvol -
  • vos lock -
  • vos move -
  • vos partinfo -
  • vos release -
  • vos remove -
  • vos remsite -
  • vos rename -
  • vos restore -
  • vos status -
  • vos syncserv -
  • vos syncvldb -
  • vos unlock -
  • vos unlockvldb -
  • vos zap -
  • xfs_size_check -
  • xstat_cm_test -
  • xstat_fs_test -
  • -

    Index
    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf003.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf003.htm deleted file mode 100755 index 99560df1d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf003.htm +++ /dev/null @@ -1,29 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -


    Tables

    -
      -
    1. File Server configuration parameters
    2. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf004.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf004.htm deleted file mode 100755 index 9338bd80e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf004.htm +++ /dev/null @@ -1,28 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -


    About This Manual

    -

    This chapter describes the purpose, organization, and conventions of this -document. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf005.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf005.htm deleted file mode 100755 index 9cf5eabe2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf005.htm +++ /dev/null @@ -1,32 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Audience and Purpose

    -

    This reference manual details the syntax of each -AFS(R) command and is intended for the experienced AFS -administrator, programmer, or user. -

    In general, this document does not explain when to use a command or its -place in the sequence of commands that make up a complete procedure. -For that type of information, refer to the AFS Administration -Guide. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf006.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf006.htm deleted file mode 100755 index d57af7f5a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf006.htm +++ /dev/null @@ -1,55 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Organization

    -

    This document presents AFS files and commands in separate -sections, with the files or commands in alphabetical order. -

    The following sections of each reference page provide the indicated type of -information: -

      -

    • Purpose briefly describes the command's function. -

    • Synopsis displays the complete syntax statement for a command, -which specifies the required order for all options, using the same notation as -the AFS online help. If abbreviating the command name and option names -is acceptable, as it is for most commands, a second statement specifies the -shortest acceptable abbreviation of each name. If the command has an -alias, it also appears in this section. -

    • Description describes the file or command's function in -detail. -

    • Cautions describes restrictions, requirements, and potential -complications in use of the command. It appears only when -necessary. -

    • Options describes the function and required form of each -argument and flag. -

    • Output describes any output the command writes to the standard -output stream. This section does not appear if the command does not -produce output or if the only output is a message confirming the -command's success. -

    • Examples provides one or more sample commands and resulting -output. -

    • Privilege Required lists each privilege required to perform the -command. -

    • Related Information lists related commands and files, if -any. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf007.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf007.htm deleted file mode 100755 index 234ae028a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf007.htm +++ /dev/null @@ -1,28 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    How to Use This Document

    -

    Refer to this document when you need detailed information -about a specific command. For a description of all the steps in a -procedure, refer to the AFS Administration Guide. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf008.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf008.htm deleted file mode 100755 index 30192beac..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf008.htm +++ /dev/null @@ -1,55 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Related Documents

    -

    The following documents are included in the AFS documentation -set. -

    AFS Administration Guide -

    This guide describes the concepts and procedures that a system -administrator must know to manage an AFS cell. It assumes familiarity -with UNIX, but requires no previous knowledge of AFS. -

    The first chapters of the AFS Administration Guide present basic -concepts and guidelines. Understanding them is crucial to successful -administration of an AFS cell. The remaining chapters in the guide -provide step-by-step instructions for specific administrative tasks, along -with discussions of the concepts important to that particular task. -

    AFS Quick Beginnings -

    This guide provides instructions for installing AFS server and client -machines. It is assumed that the installer is an experienced UNIX -(R) system administrator. -

    For predictable performance, machines must be installed and configured in -accordance with the instructions in this guide. -

    AFS Release Notes -

    This document provides information specific to each release of AFS, such as -a list of new features and commands, a list of requirements and limitations, -and instructions for upgrading server and client machines. -

    AFS User Guide -

    This guide presents the basic concepts and procedures necessary for using -AFS effectively. It assumes that the reader has some experience with -UNIX, but does not require familiarity with networking or AFS. -

    The guide explains how to perform basic functions, including -authenticating, changing a password, protecting AFS data, creating groups, and -troubleshooting. It provides illustrative examples for each function -and describes some of the differences between the UNIX file system and -AFS. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf009.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf009.htm deleted file mode 100755 index 3a9c21b9b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf009.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Typographical Conventions

    -

    This document uses the following typographical -conventions: -

      -

    • Command and option names appear in bold type in syntax -definitions, examples, and running text. Names of directories, files, -machines, partitions, volumes, and users also appear in bold -type. -

    • Variable information appears in italic type. This -includes user-supplied information on command lines and the parts of prompts -that differ depending on who issues the command. New terms also appear -in italic type. -

    • Examples of screen output and file contents appear in monospace -type. -
    -

    In addition, the following symbols appear in command syntax definitions, -both in the documentation and in AFS online help statements. When -issuing a command, do not type these symbols. -

      -

    • Square brackets [ ] surround optional items. -

    • Angle brackets < > surround user-supplied values in AFS -commands. -

    • A superscripted plus sign + follows an argument that accepts -more than one value. -

    • The percent sign % represents the regular command shell -prompt. Some operating systems possibly use a different character for -this prompt. -

    • The number sign # represents the command shell prompt for the -local superuser root. Some operating systems possibly use a -different character for this prompt. -

    • The pipe symbol | in a command syntax statement separates -mutually exclusive values for an argument. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf010.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf010.htm deleted file mode 100755 index 31f8ca8ed..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf010.htm +++ /dev/null @@ -1,26 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    AFS System Files

    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf011.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf011.htm deleted file mode 100755 index a50cec594..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf011.htm +++ /dev/null @@ -1,124 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    afs_file_intro

    -

    Purpose -

    Introduction to AFS files -

    Description -

    A number of files must reside on the local disk of AFS server and client -machines. They belong to the following general categories: -

      -

    • Configuration files define configuration parameters for -specific server and kernel processes such as the Backup System Tape -Coordinator or the Cache Manager -

    • Administrative files list information used in administration of -server machines, such as a list of privileged users or server encryption keys -

    • Cache-related files contain cached data or information about -cached data, on client machines -

    • Log files contain tracing messages about the operation of a -specific process -

    • Database files contain database records used to administer the -AFS cell -

    • Controller files control the behavior of a process -

    • Volume header files represent AFS volumes on server partitions -
    -

    For a description of the format and contents of each file, see its -reference page. -

    Note for Windows users: Some files described in this -document possibly do not exist on machines that run a Windows operating -system. Also, Windows uses a backslash -( \ ) rather than a forward slash -( / ) to separate the elements in a -pathname. -

    Related Information -

    Configuration files: - -

    -

    BosConfig -

    CFG_device_name -

    CellServDB (client version) -

    CellServDB (server version) -

    NetInfo (client version) -

    NetInfo (server version) -

    NetRestrict (client version) -

    NetRestrict (server version) -

    ThisCell (client version) -

    ThisCell (server version) -

    cacheinfo -

    sysid -

    tapeconfig -

    package Configuration File -

    uss Template File -

    uss Bulk Input File -

    -

    Administrative files: - -

    -

    KeyFile -

    UserList -

    -

    Cache-related files: - -

    -

    CacheItems -

    Vn -

    VolumeItems -

    -

    Log files: - -

    -

    AuthLog -

    BackupLog -

    BosLog -

    FileLog -

    SalvageLog -

    TE_device_name -

    TL_device_name -

    VLLog -

    VolserLog -

    fms.log -

    -

    Database files: - -

    -

    bdb.DB0 and bdb.DBSYS1 -

    kaserver.DB0 and kaserver.DBSYS1 -

    kaserverauxdb -

    prdb.DB0 and prdb.DBSYS1 -

    vldb.DB0 and vldb.DBSYS1 -

    - -

    Controller files: -

    -

    FORCESALVAGE -

    NoAuth -

    SALVAGE.fs -

    salvage.lock -

    -

    Volume header files: -

    -

    Vvol_ID.vol -

    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf012.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf012.htm deleted file mode 100755 index 2e83f025a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf012.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    AuthLog

    -

    Purpose - - - -

    Traces Authentication Server operations -

    Description -

    The AuthLog file records a trace of Authentication Server -(kaserver process) operations on the local machine and describes -any error conditions it encounters. -

    If the AuthLog file does not exist in the -/usr/afs/logs directory when the Authentication Server starts, the -server process creates it and writes initial start-up messages to it. -If there is an existing file, the Authentication Server renames it to -AuthLog.old, overwriting the existing -AuthLog.old file if it exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log onto the server -machine and use a text editor or a file display command such as the UNIX -cat command. By default, the mode bits on the -AuthLog file grant the required r (read) -permission to all users. -

    The Authentication Server records operations only as it completes them, and -cannot recover from failures by reviewing the file. The log contents -are useful for administrative evaluation of process failures and other -problems. -

    Related Information -

    UserList -

    bos getlog -

    kaserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf013.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf013.htm deleted file mode 100755 index 5972be6e9..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf013.htm +++ /dev/null @@ -1,49 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    AuthLog.dir, AuthLog.pag

    -

    Purpose - - - -

    Records privileged operations performed by the Authentication Server -

    Description -

    The AuthLog.dir and AuthLog.pag files -record a trace of privileged operations performed by the Authentication Server -(kaserver process) on the local machine. If the files do not -exist when the Authentication Server starts, it creates them in the -/usr/afs/logs directory as necessary. -

    The files are in binary format. To display their contents, use the -kdb command, which requires being logged in to the local machine as -the local superuser root. -

    Cautions -

    The Authentication Server is possibly unable to create these files on some -operating systems that AFS otherwise supports, making the kdb -command inoperative. See the AFS Release Notes for -details. -

    Related Information -

    kaserver -

    kdb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf014.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf014.htm deleted file mode 100755 index 929a845a0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf014.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    BackupLog

    -

    Purpose - - - -

    Traces Backup Server operations -

    Description -

    The BackupLog file records a trace of Backup Server -(buserver process) operations on the local machine and describes -any error conditions it encounters. -

    If the BackupLog file does not already exist in the -/usr/afs/logs directory when the Backup Server starts, the server -process creates it and writes initial start-up messages to it. If there -is an existing file, the Backup Server renames it to -BackupLog.old, overwriting the existing -BackupLog.old file if it exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log on to the machine -and use a text editor or a file display command such as the UNIX -cat command. By default, the mode bits on the -BackupLog file grant the required r (read) -permission to all users. -

    The Backup Server records operations only as it completes them, and so -cannot recover from failures by reviewing the file. The log contents -are useful for administrative evaluation of process failures and other -problems. -

    Related Information -

    UserList -

    bos getlog -

    buserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf015.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf015.htm deleted file mode 100755 index 06484dec5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf015.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    BosLog

    -

    Purpose - - - -

    Traces BOS Server operations -

    Description -

    The BosLog file records a trace of Basic OverSeer (BOS) Server -(bosserver process) operations on the local machine and describes -any error conditions it encounters. -

    If the BosLog file does not already exist in the -/usr/afs/logs directory when the BOS Server starts, the server -process creates it and writes initial start-up messages to it. If there -is an existing file, the BOS server renames it to -BosLog.old, overwriting the existing -BosLog.old file if it exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log onto the server -machine and use a text editor or a file display command such as the UNIX -cat command. By default, the mode bits on the -BosLog file grant the required r (read) -permission to all users. -

    The BOS Server records operations only as it completes them, and cannot -recover from failures by reviewing the file. The log contents are -useful for administrative evaluation of process failures and other -problems. -

    Related Information -

    UserList -

    bos getlog -

    bosserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf016.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf016.htm deleted file mode 100755 index 982f1a4d4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf016.htm +++ /dev/null @@ -1,179 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    BosConfig

    -

    Purpose - - - - -

    Defines server processes for the BOS Server to monitor -

    Description -

    The BosConfig file lists the processes that the Basic OverSeer -(BOS) Server monitors on its server machine, and thus defines which AFS server -processes run on the machine. It specifies how the BOS Server reacts -when a process fails, and also defines the times at which the BOS Server -automatically restarts processes as part of performance maintenance. -The file must reside in the /usr/afs/local directory on each AFS -server machine. -

    A server process entry in the BosConfig file records the -following information: -

      -

    • The entry type, which is one of the following: - - -
      -

      cron - -
      Designates a server process that runs periodically instead of -continuously. The BOS Server starts a cron process only at specified -times, not whenever it fails. All standard AFS process entries except -fs are simple (there are no standard cron processes). -

      fs - - - - -
      Designates a group of interdependent server processes. If one of -the processes fails, the BOS Server must coordinate its restart with the -restart of the other processes in the group, possibly by stopping them -first. -

      There is only one standard entry of this type, for which the conventional -name is fs. It combines three server processes: the -File Server (fileserver process), the Volume Server -(volserver process), and the Salvager (salvager -process). These processes all operate on the same data--the AFS -data stored on an AFS server machine's /vicep partitions and -mounted in the AFS filespace--but in different ways. Grouping the -processes prevents them from attempting to access the same data -simultaneously, which can cause corruption. -

      During normal operation, the Salvager process is not active. If the -File Server process fails, however, the BOS Server stops the Volume Server -process and runs the Salvager process to correct any corruption that resulted -from the failure. (The administrator can also issue the bos -salvage command to invoke the Salvager process.) If the Volume -Server fails, the BOS Server can restart it without stopping the File Server -or running the Salvager. -

      simple - -
      Designates a server process that runs independently of any other on the -server machine. If a simple process fails, the BOS Server does not have -to coordinate its restart with any other process. -
      -

    • The entry name. The conventional name for an entry in the -BosConfig file and the associated process matches the binary -filename. When issuing any bos command that takes the --instance argument, identify each process by the name used in the -BosConfig file. For a list of the names, see the bos -create reference page. -

    • The process's status flag, which determines whether the BOS -Server attempts to start the process in two cases: each time the BOS -Server itself restarts, and when the process fails. The -BosConfig file currently uses a binary notation to indicate whether -the BOS Server attempts to restart the process as necessary or does not -monitor it at all. For the sake of clarity, the AFS documentation -refers to the flags as Run and NotRun instead. -Only a system administrator, not the BOS Server, can change the flag. - - -

    • One or more command parameters which the BOS Server invokes to -start the process or processes associated with the entry: -
        -

      • A cron entry has two command parameters, the first the complete -pathname to the program, and the second the time at which the BOS Server -invokes the program. -

      • The fs entry has three command parameters, each the complete -pathname to the fileserver, volserver, and -salvager programs, in that order. -

      • A simple entry has only one command parameter, the complete -pathname to the program. -
      -
    -

    In addition to server process entries, the BosConfig file -specifies the times at which the BOS Server performs two types of automatic -process restarts: -

      -

    • The general restart time at which the BOS Server restarts itself -and then each process for which the entry in the BosConfig file has -status flag Run. The default setting is Sunday at 4:00 -a.m. -

    • The binary restart time at which the BOS Server restarts any -server process for which the time stamp on the binary file in the -/usr/afs/bin directory is later than the last restart time for the -process. The default is 5:00 a.m. -
    -

    Although the BosConfig file is in ASCII format, do not use a -text editor to alter it. Its format is subject to change and -incorrectly formatted entries can prevent server startup in ways that are -difficult to diagnose. Instead always use the appropriate commands from -the bos command suite: -

      -

    • The bos create command to create an entry in the file and start -the associated process -

    • The bos delete command to remove an entry from the file after -the bos stop command is used to stop the associated process -

    • The bos getrestart command to display the times at which the -BOS Server performs automatic restarts -

    • The bos setrestart command to set the times at which the BOS -Server performs automatic process restarts -

    • The bos start command to change an entry's status flag to -Run and start the associated process -

    • The bos status command to display all processes listed in the -file -

    • The bos stop command to change an entry's status flag to -NotRun and stop the associated process -
    -

    There are also bos commands that start and stop processes -without changing entries in the BosConfig file. The BOS -Server reads the BosConfig file only when it starts, transferring -the information into its memory. Thus a process's status as -represented in the BOS Server's memory can diverge from its status in the -BosConfig file. The following commands change a -process's status in the BOS Server's memory only: - - - -

      -

    • The bos restart command restarts a specified set of processes, -all processes, or all processes other than the BOS Server -

    • The bos shutdown command stops a process -

    • The bos startup command starts a process -
    -

    Related Information -

    bos create -

    bos delete -

    bos getrestart -

    bos restart -

    bos setrestart -

    bos shutdown -

    bos start -

    bos startup -

    bos status -

    bos stop -

    bos salvage -

    fileserver -

    salvager -

    volserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf017.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf017.htm deleted file mode 100755 index 3524633b1..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf017.htm +++ /dev/null @@ -1,59 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    CacheItems

    -

    Purpose - - - -

    Records information about each Vn file in a disk cache -

    Description -

    The CacheItems file records information about each file in the -disk cache on a client machine (each Vn file). The -information includes the file ID number and associated volume version number -of the AFS file currently stored in the Vn file, which -enables the Cache Manager to determine which Vn file -contains the AFS data it needs to present to an application. -

    As it initializes, the Cache Manager creates the binary-format -CacheItems file in the same local disk cache directory as the -Vn files that the CacheItems file describes, -and it must always remain there. The conventional directory name is -/usr/vice/cache, but it is acceptable to use a directory on a -partition with more available space. -

    Cautions -

    Editing or removing the CacheItems file can cause a kernel -panic. If the contents of Vn files seem out of -date, clear the files by using the fs flush or fs -flushvolume command. If the CacheItems file is -accidentally modified or deleted, rebooting the machine usually restores -normal performance. -

    Related Information -

    Vn -

    VolumeItems -

    cacheinfo -

    afsd -

    fs flush -

    fs flushvolume -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf018.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf018.htm deleted file mode 100755 index 833477e38..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf018.htm +++ /dev/null @@ -1,565 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    CFG_device_name

    -

    Purpose - - - - - -

    Defines Tape Coordinator configuration instructions for automated tape -devices -

    Description -

    The CFG_device_name file includes instructions that -configure a Tape Coordinator for use with automated backup devices such as -tape stackers and jukeboxes, enable the Tape Coordinator to dump and restore -data to a backup data file on a local disk device, and enable -greater automation of other aspects of the backup process. -

    There is a separate configuration file for each tape device or backup data -file. Creating the file is optional, and unnecessary if none of the -instructions it can include pertain to a given tape device. The -ASCII-format file must reside in the /usr/afs/backup directory on -the Tape Coordinator machine if it exists. -

    The CFG_device_name file does not replace the -/usr/afs/backup/tapeconfig file, a single copy of which still must -exist on every Tape Coordinator machine. -

    To enable the Tape Coordinator to locate the configuration file, construct -the variable part of the filename, device_name, as follows: -

      -

    • For a tape device, strip off the initial /dev/ string from the -device name, and replace any other slashes in the name with -underscores. For example, CFG_rmt_4m is the appropriate -filename for a device called /dev/rmt/4m. -

    • For a backup data file, strip off the initial slash (/) and replace any -other slashes in the name with underscores. For example, -CFG_var_tmp_FILE is the appropriate filename for a backup data file -called /var/tmp/FILE. -
    -

    The CFG_device_name file lists one or more of the -following instructions, each on its own line. All are optional, and -they can appear in any order. A more detailed description of each -instruction follows the list: -

    -

    ASK -
    Controls whether the Tape Coordinator prompts for guidance when it -encounters error conditions -

    AUTOQUERY -
    Controls whether the Tape Coordinator prompts for the first tape -

    BUFFERSIZE -
    Sets the size of the memory buffer the Tape Coordinator uses when -transferring data -

    FILE -
    Controls whether the dump is written to a tape device or a file -

    MOUNT -
    Identifies the file that contains routines for inserting tapes into the -device's drive -

    NAME_CHECK -
    Controls whether the Tape Coordinator verifies that a tape's AFS tape -name matches the dump being written -

    UNMOUNT -
    Identifies the file that contains routines for removing tapes from the -device's drive -
    - -

    The ASK Instruction -

    The ASK instruction takes a boolean value as its argument, in -the following format: -

       ASK {YES | NO}
    -   
    -
    -

    When the value is YES, the Tape Coordinator generates a prompt -in its window, requesting a response to the error cases described in the -following list. This is the default behavior if the ASK instruction -does not appear in the CFG_device_name file. -

    When the value is NO, the Tape Coordinator does not prompt in -error cases, but instead uses the automatic default responses described in the -following list. The Tape Coordinator also logs the error in the -TE_device_name file. Suppressing the prompts -enables the Tape Coordinator to run unattended, though it still prompts for -insertion of tapes unless the MOUNT instruction is used. -

    The error cases controlled by this instruction are the following: -

      -

    • The Backup System is unable to dump a volume while running the backup -dump command. With a YES value, the Tape Coordinator -prompts to offer three choices: try to dump the volume again -immediately, omit the volume from the dump but continue the operation, or -terminate the operation. With a NO value, the Tape -Coordinator omits the volume from the dump and continues the operation. -

    • The Backup System is unable to restore a volume while running the -backup diskrestore, backup volrestore, or backup -volsetrestore command. With a YES value, the Tape -Coordinator prompts to offer two choices: omit the volume and continue -restoring the other volumes, or terminate the operation. With a -NO value, it continues the operation without prompting, omitting -the problematic volume but restoring the remaining ones. -

    • The Backup System cannot determine if the dump set includes any more -tapes, while running the backup scantape command (the reference -page for that command discusses possible reasons for this problem). -With a YES value, the Tape Coordinator prompts to ask if there are -more tapes to scan. With a NO value, it proceeds as though -there are more tapes and invokes the routine named by the MOUNT -instruction in the configuration file, or prompts the operator to insert the -next tape. -

    • The Backup System determines that the tape contains an unexpired dump -while running the backup labeltape command. With a -YES value, the Tape Coordinator prompts to offer two choices: -continue or terminate the labeling operation. With a NO -value, it terminates the operation without relabeling the tape. -
    - -

    The AUTOQUERY Instruction -

    The AUTOQUERY instruction takes a boolean value as its argument, -in the following format: -

       AUTOQUERY {YES | NO}
    -   
    -
    -

    When the value is YES, the Tape Coordinator checks for the -MOUNT instruction in the configuration file when it needs to read -the first tape involved in an operation. As described for that -instruction, it then either prompts for the tape or invokes the specified -routine to mount the tape. This is the default behavior if the -AUTOQUERY instruction does not appear in the configuration -file. -

    When the value is NO, the Tape Coordinator assumes that the -first tape required for an operation is already in the drive. It does -not prompt the operator or invoke the MOUNT routine unless there is -an error in accessing the first tape. This setting is equivalent in -effect to including the -noautoquery flag to the butc -command. -

    Note that the setting of the AUTOQUERY instruction controls the -Tape Coordinator's behavior only with respect to the first tape required -for an operation. For subsequent tapes, the Tape Coordinator always -checks for the MOUNT instruction. It also refers to the -MOUNT instruction if it encounters an error while attempting to -access the first tape. - -

    The BUFFERSIZE Instruction -

    The BUFFERSIZE instruction takes an integer value, and -optionally units, in the following format: -

       BUFFERSIZE size[{k | K | m | M | g | G}]
    -   
    -
    -

    where size specifies the amount of memory the Tape Coordinator -allocates to use as a buffer during both dump and restore operations. -The default unit is bytes, but use k or K to specify -kilobytes, m or M for megabytes, and g or -G for gigabytes. There is no space between the -sizevalue and the units letter. -

    By default, the Tape Coordinator uses a 16 KB buffer during dump -operations. As it receives volume data from the Volume Server, the Tape -Coordinator gathers 16 KB of data in the buffer before transferring the entire -16 KB to the tape device or backup data file. Similarly, during a -restore operation the Tape Coordinator by default buffers 32 KB of data from -the tape device or backup data file before transferring the entire 32 KB to -the Volume Server for restoration into the file system. Buffering makes -the volume of data flowing to and from a tape device more even and so promotes -tape streaming, which is the most efficient way for a tape device to -operate. -

    In a normal network configuration, the default buffer sizes are usually -large enough to promote tape streaming. If the network between the Tape -Coordinator machine and file server machines is slow, it can help to increase -the buffer size. - -

    The FILE Instruction -

    The FILE instruction takes a boolean value as its argument, in -the following format: -

       FILE {NO | YES}
    -   
    -
    -

    When the value is NO, the Tape Coordinator writes to a tape -device during a dump operation and reads from one during a restore -operation. This is the default behavior if the FILE -instruction does not appear in the configuration file. -

    When the value is YES, the Tape Coordinator writes volume data -to a backup data file on the local disk during a dump operation and reads -volume data from a file during a restore operation. If the file does -not exist when the Tape Coordinator attempts to access it to write a dump, the -Tape Coordinator creates it. For a restore operation to succeed, the -file must exist and contain volume data previously written to it by a -backup dump operation. -

    When the value is YES, the backup data file's complete -pathname must appear (instead of a tape drive device name) in the third field -of the corresponding port offset entry in the local -/usr/afs/backup/tapeconfig file. If the field instead refers -to a tape device, dump operations appear to succeed but are -inoperative. It is not possible to restore data that was accidently -dumped to a tape device while the FILE instruction was set to -YES. (In the same way, if the FILE instruction is -set to NO, the tapeconfig entry must refer to an actual -tape device.) -

    Rather than put an actual file pathname in the third field of the -tapeconfig file, however, the recommended configuration is to -create a symbolic link in the /dev directory that points to the -actual file pathname, and record the symbolic link in this field. This -configuration has a couple of advantages: -

      -

    • It makes the device_name portion of the -CFG_device_name, TE_device_name, and -TL_device_name names as short as possible. Because -the symbolic link is in the /dev directory as though it were a tape -device, the device configuration file's name is constructed by stripping -off the entire /dev/ prefix, instead of just the initial -slash. If, for example, the symbolic link is called -/dev/FILE, the device configuration file name is -CFG_FILE, whereas if the actual pathname /var/tmp/FILE -appears in the tapeconfig file, the file's name must be -CFG_var_tmp_FILE. -

    • It provides for a more graceful, and potentially automated, recovery if -the Tape Coordinator cannot write a complete dump into the backup data file -(because the partition housing the backup data file becomes full, for -example). The Tape Coordinator's reaction to this problem is to -invoke the MOUNT script, or to prompt the operator if the -MOUNT instruction does not appear in the configuration file. -
        -

      • If there is a MOUNT routine, the operator can prepare for this -situation by adding a subroutine that changes the symbolic link to point to -another backup data file on a partition where there is space available. -

      • If there is no MOUNT instruction, the prompt enables the -operator manually to change the symbolic link to point to another backup data -file, then press <Return> to signal that the Tape Coordinator -can continue the operation. -
      -
    -

    If the third field in the tapeconfig file names the actual file, -there is no way to recover from exhausting the space on the partition that -houses the backup data file. It is not possible to change the -tapeconfig file in the middle of an operation. -

    When writing to a backup data file, the Tape Coordinator writes data at 16 -KB offsets. If a given block of data (such as the marker that signals -the beginning or end of a volume) does not fill the entire 16 KB, the Tape -Coordinator still skips to the next offset before writing the next -block. In the output of a backup dumpinfo command issued -with the -id option, the value in the Pos column is the -ordinal of the 16-KB offset at which the volume data begins, and so is not -generally only one higher than the position number on the previous line, as it -is for dumps to tape. - -

    The MOUNT Instruction -

    The MOUNT instruction takes a pathname as its argument, in the -following format: -

       
    -   MOUNT filename
    -   
    -
    -

    The referenced executable file must reside on the local disk and contain a -shell script or program that directs an automated tape device, such as a -jukebox or stacker, to mount a tape (insert it into the tape reader). -The operator must write the routine to invoke the mount command specified by -the device's manufacturer; AFS does not include any scripts, -although an example appears in the following Examples -section. The script or program inherits the Tape Coordinator's AFS -authentication status. -

    When the Tape Coordinator needs to mount a tape, it checks the -configuration file for a MOUNT instruction. If there is no -MOUNT instruction, the Tape Coordinator prompts the operator to -insert a tape before it attempts to open the tape device. If there is a -MOUNT instruction, the Tape Coordinator executes the routine in the -referenced file. The routine invoked by the MOUNT -instruction inherits the local identity (UNIX UID) and AFS tokens of the -butc command's issuer. -

    There is an exception to this sequence: if the AUTOQUERY -NO instruction appears in the configuration file, or the --noautoquery flag was included on the butc command, then -the Tape Coordinator assumes that the operator has already inserted the first -tape needed for a given operation. It attempts to read the tape -immediately, and only checks for the MOUNT instruction or prompts -the operator if the tape is missing or is not the required one. -

    When the Tape Coordinator invokes the routine indicated by the -MOUNT instruction, it passes the following parameters to the -routine in the indicated order: -

      -

    1. The tape device or backup data file's pathname, as recorded in the -/usr/afs/backup/tapeconfig file. -

    2. The tape operation, which (except for the exceptions noted in the -following list) matches the backup command operation code used to -initiate the operation: -
        -

      • appenddump (when a backup dump command includes the --append flag) -

      • dump (when a backup dump command does not include -the -append flag) -

      • labeltape -

      • readlabel -

      • restore (for a backup diskrestore, backup -volrestore, or backup volsetrestore command) -

      • restoredb -

      • savedb -

      • scantape -
      -

    3. The number of times the Tape Coordinator has attempted to open the tape -device or backup data file. If the open attempt returns an error, the -Tape Coordinator increments this value by one and again invokes the -MOUNT instruction. -

    4. The tape name. For some operations, the Tape Coordinator passes the -string none, because it does not know the tape name (when running -the backup scantape or backup readlabel, for example), -or because the tape does not necessarily have a name (when running the -backup labeltape command, for example). -

    5. The tape ID recorded in the Backup Database. As with the tape name, -the Backup System passes the string none for operations where it -does not know the tape ID or the tape does not necessarily have an ID. -
    -

    The routine invoked by the MOUNT instruction must return an exit -code to the Tape Coordinator: -

      -

    • Code 0 (zero) indicates that the routine successfully mounted -the tape. The Tape Coordinator continues the backup operation. -If the routine invoked by the MOUNT instruction does not return -this exit code, the Tape Coordinator never calls the UNMOUNT -instruction. -

    • Code 1 (one) indicates that the routine failed to mount the -tape. The Tape Coordinator terminates the operation. -

    • Any other code indicates that the routine was not able to access the -correct tape. The Tape Coordinator prompts the operator to insert the -correct tape. -
    -

    If the backup command was issued in interactive mode and the -operator issues the (backup) kill command while the -MOUNT routine is running, the Tape Coordinator passes the -termination signal to the routine; the entire operation -terminates. - -

    The NAME_CHECK Instruction -

    The NAME_CHECK instruction takes a boolean value as its -argument, in the following format: -

       NAME_CHECK {YES | NO}
    -   
    -
    -

    When the value is YES and the tape does not have a permanent -name, the Tape Coordinator checks the AFS tape name when dumping a volume in -response to the backup dump command. The AFS tape name must -be <NULL> or match the tape name that the backup dump -operation assigns based on the volume set and dump level names. This is -the default behavior if the NAME_CHECK instruction does not appear -in the configuration file. -

    When the value is NO, the Tape Coordinator does not check the -AFS tape name before writing to the tape. -

    The Tape Coordinator always checks that all dumps on the tape are expired, -and refuses to write to a tape that contains unexpired dumps. - -

    The UNMOUNT Instruction -

    The UNMOUNT instruction takes a pathname as its argument, in the -following format: -

       UNMOUNT filename
    -   
    -
    -

    The referenced executable file must reside on the local disk and contain a -shell script or program that directs an automated tape device, such as a -jukebox or stacker, to unmount a tape (remove it from the tape reader). -The operator must write the routine to invoke the unmount command specified by -the device's manufacturer; AFS does not include any scripts, -although an example appears in the following Examples -section. The script or program inherits the Tape Coordinator's AFS -authentication status. -

    After closing a tape device, the Tape Coordinator checks the configuration -file for an UNMOUNT instruction, whether or not the -close operation succeeds. If there is no UNMOUNT -instruction, the Tape Coordinator takes no action, in which case the operator -must take the action necessary to remove the current tape from the drive -before another can be inserted. If there is an UNMOUNT -instruction, the Tape Coordinator executes the referenced file. It -invokes the routine only once, passing in the following parameters: -

      -

    • The tape device pathname (as specified in the -/usr/afs/backup/tapeconfig file) -

    • The tape operation (always unmount) -
    -

    Privilege Required -

    The file is protected by UNIX mode bits. Creating the file requires -the w (write) and x (execute) -permissions on the /usr/afs/backup directory. Editing the -file requires the w (write) permission on the -file. -

    Examples -

    The following example configuration files demonstrate one way to structure -a configuration file for a stacker or backup dump file. The examples -are not necessarily appropriate for a specific cell; if using them as -models, be sure to adapt them to the cell's needs and equipment. -

    Example CFG_device_name File for -Stackers -

    In this example, the administrator creates the following entry for a tape -stacker called stacker0.1 in the -/usr/afs/backup/tapeconfig file. It has port offset -0. -

       2G   5K   /dev/stacker0.1   0
    -   
    -
    -

    The administrator includes the following five lines in the -/usr/afs/backup/CFG_stacker0.1 file. To review the -meaning of each instruction, see the preceding Description -section. -

       MOUNT /usr/afs/backup/stacker0.1
    -   UNMOUNT /usr/afs/backup/stacker0.1
    -   AUTOQUERY NO
    -   ASK NO
    -   NAME_CHECK NO
    -   
    -
    -

    Finally, the administrator writes the following executable routine in the -/usr/afs/backup/stacker0.1 file referenced by the -MOUNT and UNMOUNT instructions in the -CFG_stacker0.1 file. -

       #! /bin/csh -f
    -     
    -   set devicefile = $1
    -   set operation = $2
    -   set tries = $3
    -   set tapename = $4
    -   set tapeid = $5
    -     
    -   set exit_continue = 0
    -   set exit_abort = 1
    -   set exit_interactive = 2
    -    
    -   #--------------------------------------------
    -     
    -   if (${tries} > 1) then
    -      echo "Too many tries"
    -      exit ${exit_interactive}
    -   endif
    -     
    -   if (${operation} == "unmount") then
    -      echo "UnMount: Will leave tape in drive"
    -      exit ${exit_continue}
    -   endif
    -     
    -   if ((${operation} == "dump")     |\
    -       (${operation} == "appenddump")     |\
    -       (${operation} == "savedb"))  then
    -     
    -       stackerCmd_NextTape ${devicefile}
    -       if (${status} != 0)exit${exit_interactive}
    -       echo "Will continue"
    -       exit ${exit_continue}
    -   endif
    -     
    -   if ((${operation} == "labeltape")    |\
    -       (${operation} == "readlabel")) then
    -      echo "Will continue"
    -      exit ${exit_continue}
    -   endif
    -     
    -   echo "Prompt for tape"
    -   exit ${exit_interactive}
    -   
    -
    -

    This routine uses two of the parameters passed to it by the Backup -System: tries and operation. It follows the -recommended practice of prompting for a tape if the value of the -tries parameter exceeds one, because that implies that the stacker -is out of tapes. -

    For a backup dump or backup savedb operation, the -routine calls the example stackerCmd_NextTape function provided by -the stacker's manufacturer. Note that the final lines in the file -return the exit code that prompts the operator to insert a tape; these -lines are invoked when either the stacker cannot load a tape or a the -operation being performed is not one of those explicitly mentioned in the file -(such as a restore operation). -

    Example CFG_device_name File for Dumping to a -Backup Data File -

    In this example, the administrator creates the following entry for a backup -data file called HSM_device in the -/usr/afs/backup/tapeconfig file. It has port offset -20. -

       1G   0K   /dev/HSM_device   20
    -   
    -
    -

    The administrator includes the following lines in the -/usr/afs/backup/CFG_HSM_device file. To review the meaning -of each instruction, see the preceding Description section. -

       MOUNT /usr/afs/backup/file
    -   FILE YES
    -   ASK NO
    -   
    -
    -

    Finally, the administrator writes the following executable routine in the -/usr/afs/backup/file file referenced by the MOUNT -instruction in the CFG_HSM_device file, to control how the Tape -Coordinator handles the file. -

       #! /bin/csh -f
    -   set devicefile = $1
    -   set operation = $2
    -   set tries = $3
    -   set tapename = $4
    -   set tapeid = $5
    -     
    -   set exit_continue = 0
    -   set exit_abort = 1
    -   set exit_interactive = 2
    -     
    -   #--------------------------------------------
    -     
    -   if (${tries} > 1) then
    -      echo "Too many tries"
    -      exit ${exit_interactive}
    -   endif
    -     
    -   if (${operation} == "labeltape") then
    -      echo "Won't label a tape/file"
    -      exit ${exit_abort}
    -   endif
    -     
    -   if ((${operation} == "dump")   |\
    -       (${operation} == "appenddump")   |\
    -       (${operation} == "restore")   |\
    -       (${operation} == "savedb")    |\
    -       (${operation} == "restoredb")) then
    -     
    -      /bin/rm -f ${devicefile}
    -      /bin/ln -s /hsm/${tapename}_${tapeid} ${devicefile}
    -      if (${status} != 0) exit ${exit_abort}
    -   endif
    -     
    -   exit ${exit_continue}
    -   
    -
    -

    Like the example routine for a tape stacker, this routine uses the -tries and operation parameters passed to it by the -Backup System. The tries parameter tracks how many times the -Tape Coordinator has attempted to access the file. A value greater than -one indicates that the Tape Coordinator cannot access it, and the routine -returns exit code 2 (exit_interactive), which results in a prompt -for the operator to load a tape. The operator can use this opportunity -to change the name of the backup data file specified in the -tapeconfig file. -

    The primary function of this routine is to establish a link between the -device file and the file to be dumped or restored. When the Tape -Coordinator is executing a backup dump, backup restore, -backup savedb, or backup restoredb operation, the -routine invokes the UNIX ln -s command to create a symbolic link -from the backup data file named in the tapeconfig file to the -actual file to use (this is the recommended method). It uses the value -of the tapename and tapeid parameters to construct the -file name. -

    Related Information -

    tapeconfig -

    backup diskrestore -

    backup dump -

    backup restoredb -

    backup savedb -

    backup volrestore -

    backup volsetrestore -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf019.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf019.htm deleted file mode 100755 index 390814eb6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf019.htm +++ /dev/null @@ -1,120 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    CellServDB (client version)

    -

    Purpose - - - - - - - - -

    Lists the database server machines in all cells accessible from the machine -

    Description -

    The client version of the CellServDB file lists the database -server machines in the local cell and any foreign cell that is to be -accessible from the local client machine. Database server machines run -the Authentication Server, Backup Server, Protection Server, and Volume -Location (VL) Server (the kaserver, buserver, -ptserver, and vlserver) processes, which maintain the -cell's administrative AFS databases. -

    The Cache Manager and other processes running on a client machine use the -list of a cell's database server machines when performing several common -functions, including: -

      -

    • Fetching files. The Cache Manager contacts the VL Server to learn -the location of the volume containing a requested file or directory. -

    • Authenticating users. Client-side authentication programs (such as -an AFS-modified login utility or the klog command interpreter) -contact the Authentication Server to obtain a server ticket, which the AFS -server processes accept as proof that the user is authenticated. -

    • Creating protection groups. The pts command interpreter -contacts the Protection Server when users create protection groups or request -information from the Protection Database. -
    -

    The Cache Manager reads the CellServDB file into kernel memory -as it initializes, and not again until the machine next reboots. To -enable users on the local machine to continue accessing the cell correctly, -update the file whenever a database server machine is added to or removed from -a cell. To update the kernel-resident list of database server machines -without rebooting, use the fs newcell command. -

    The CellServDB file is in ASCII format and must reside in the -/usr/vice/etc directory on each AFS client machine. Use a -text editor to create and maintain it. Each cell's entry must have -the following format: -

      -

    • The first line begins at the left margin with the greater-than character -(>), followed immediately by the cell's name without an -intervening space. Optionally, a comment can follow any number of -spaces and a number sign (#), perhaps to identify the organization -associated with the cell. -

    • Each subsequent line in the entry identifies one of the cell's -database server machines, with the indicated information in order: -
        -

      • The database server machine's IP address in dotted-decimal -format. -

      • One or more spaces. -

      • A number sign (#), followed by the machine's fully -qualified hostname without an intervening space. This number sign does -not indicate that the hostname is a comment. It is a required -field. -
      -
    -

    No extra blank lines or newline characters are allowed in the file, even -after the last entry. Their presence can prevent the Cache Manager from -reading the file into kernel memory, resulting in an error message. -

    The AFS Product Support group maintains a list of the database server -machines in all cells that have registered themselves as receptive to access -from foreign cells. When a cell's administrators change its -database server machines, it is customary to register the change with the AFS -Product Support group for inclusion in this file. The file conforms to -the required CellServDB format, and so is a suitable basis for the -CellServDB file on a client machine. Contact the AFS Product -Support group for directions on accessing the file. -

    The client version of the CellServDB file is distinct from the -server version, which resides in the /usr/afs/etc directory on each -AFS server machine. The client version lists the database server -machines in every AFS cell that the cell administrator wants the -machine's users to be able to access, whereas the server version lists -only the local cell's database server machines. -

    Examples -

    The following example shows entries for two cells in a client -CellServDB file and illustrates the required format. -

       >abc.com        # ABC Corporation
    -   192.12.105.2	        #db1.abc.com
    -   192.12.105.3	        #db2.abc.com
    -   192.12.107.3	        #db3.abc.com
    -   >test.abc.com   # ABC Corporation Test Cell
    -   192.12.108.57        #testdb1.abc.com
    -   192.12.108.55        #testdb2.abc.com
    -   
    -
    -

    Related Information -

    CellServDB (server version) -

    fs newcell -

    klog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf020.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf020.htm deleted file mode 100755 index ee2a2b581..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf020.htm +++ /dev/null @@ -1,91 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    CellServDB (server version)

    -

    Purpose - - - - - - - - -

    Lists the local cell's database server machines -

    Description -

    The server version of the CellServDB file lists the local -cell's database server machines. These machines run the -Authentication Server, Backup Server, Protection Server, and Volume Location -(VL) Server (the kaserver, buserver, -ptserver, and vlserver) processes, which maintain the -cell's administrative AFS databases. The initial version of the -file is created with the bos setcellname command during the -installation of the cell's server machine, which is automatically -recorded as the cell's first database server machine. When adding -or removing database server machines, be sure to update this file -appropriately. It must reside in the /usr/afs/etc directory -on each AFS server machine. -

    The database server processes consult the CellServDB file to -learn about their peers, with which they must maintain constant connections in -order to coordinate replication of changes across the multiple copies of each -database. The other AFS server processes consult the file to learn -which machines to contact for information from the databases when they need -it. -

    Although the CellServDB file is in ASCII format, do not use a -text editor to alter it. Instead always use the appropriate commands -from the bos command suite: -

      -

    • The bos addhost command to add a machine to the file -

    • The bos listhosts command to display the list of machines from -the file -

    • The bos removehost command to remove a machine from the file -
    -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is customary to edit only the copy of the file stored on the system control -machine. In cells that run the international version of AFS, edit the -file on each server machine individually. For instructions on adding -and removing database server machine, see the AFS Quick Beginnings -chapter on installing additional server machines. -

    The server version of the CellServDB file is distinct from the -client version, which resides in the /usr/vice/etc directory on -each AFS client machine. The server version lists only the local -cell's database server machines, whereas the client version lists the -database server machines in every AFS cell that the cell administrator wants -the machine's users to be able to access. -

    Related Information -

    CellServDB (client version) -

    bos addhost -

    bos listhosts -

    bos removehost -

    bos setcellname -

    buserver -

    kaserver -

    ptserver -

    vlserver -

    upclient -

    upserver -

    AFS Quick Beginnings -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf021.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf021.htm deleted file mode 100755 index 109d72fbf..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf021.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    FileLog

    -

    Purpose - - - -

    Traces File Server operations -

    Description -

    The FileLog file records a trace of File Server -(fileserver process) operations on the local machine and describes -any error conditions it encounters. -

    If the FileLog file does not already exist in the -/usr/afs/logs directory when the File Server starts, the server -process creates it and writes initial start-up messages to it. If there -is an existing file, the File Server renames it to -FileLog.old, overwriting the existing -FileLog.old file if it exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log onto the file -server machine and use a text editor or a file display command such as the -UNIX cat command. By default, the mode bits on the -FileLog file grant the required r (read) -permission to all users. -

    The File Server records operations only as it completes them, and cannot -recover from failures by reviewing the file. The log contents are -useful for administrative evaluation of process failures and other -problems. -

    Related Information -

    UserList -

    bos getlog -

    fileserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf022.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf022.htm deleted file mode 100755 index b8dfa004d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf022.htm +++ /dev/null @@ -1,49 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    FORCESALVAGE

    -

    Purpose - - - -

    Forces salvage of entire partition -

    Description -

    The FORCESALVAGE file, if present on an AFS server partition -(that is, in a /vicep directory), signals that the Salvager must -salvage the entire partition. The AFS-modified version of the -fsck program creates the empty (zero-length) file when it discovers -corruption on the partition. The Salvager removes the file when it -completes the salvage operation. -

    When the File Server detects the presence of the file on a partition on -which it is attaching volumes, it stops, detaches any volumes that are already -attached, and exits after recording a message in the -/usr/afs/logs/FileLog file. The Bos Server then invokes the -Salvager to salvage the partition. -

    Related Information -

    FileLog -

    bosserver -

    fileserver -

    salvager -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf023.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf023.htm deleted file mode 100755 index 7d7b1cc75..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf023.htm +++ /dev/null @@ -1,73 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    KeyFile

    -

    Purpose - - - - - - - - -

    Defines AFS server encryption keys -

    Description -

    The KeyFile file defines the server encryption keys that the AFS -server processes running on the machine use to decrypt the tickets presented -by clients during the mutual authentication process. AFS server -processes perform privileged actions only for clients that possess a ticket -encrypted with one of the keys from the file. The file must reside in -the /usr/afs/etc directory on every server machine. For more -detailed information on mutual authentication and server encryption keys, see -the AFS Administration Guide. -

    Each key has a corresponding a key version number that distinguishes it -from the other keys. The tickets that clients present are also marked -with a key version number to tell the server process which key to use to -decrypt it. The KeyFile file must always include a key with -the same key version number and contents as the key currently listed for the -afs entry in the Authentication Database. -

    The KeyFile file is in binary format, so always use the -appropriate commands from the bos command suite to administer -it: -

      -

    • The bos addkey command to define a new key -

    • The bos listkeys command to display the keys -

    • The bos removekey command to remove a key from the file -
    -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is customary to edit only the copy of the file stored on the system control -machine. In cells that run the international version of AFS, edit the -file on each server machine individually. -

    Related Information -

    bos addkey -

    bos listkeys -

    bos removekey -

    kas setpassword -

    upclient -

    upserver -

    AFS Administration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf024.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf024.htm deleted file mode 100755 index 5a134c598..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf024.htm +++ /dev/null @@ -1,70 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    NetInfo (client version)

    -

    Purpose - - - - - - -

    Defines client machine interfaces to register with the File Server -

    Description -

    The NetInfo file lists the IP addresses of one or more of the -local machine's network interfaces. If it exists in the -/usr/vice/etc directory when the Cache Manager initializes, the -Cache Manager uses its contents as the basis for a list of local -interfaces. Otherwise, the Cache Manager uses the list of interfaces -configured with the operating system. It then removes from the list any -addresses that appear in the /usr/vice/etc/NetRestrict file, if it -exists. The Cache Manager records the resulting list in kernel -memory. The first time it establishes a connection to a File Server, it -registers the list with the File Server. -

    The File Server uses the addresses when it initiates a remote procedure -call (RPC) to the Cache Manager (as opposed to responding to an RPC sent by -the Cache Manager). There are two common circumstances in which the -File Server initiates RPCs: when it breaks callbacks and when it pings -the client machine to verify that the Cache Manager is still -accessible. -

    The NetInfo file is in ASCII format. One of the -machine's IP addresses appears on each line, in dotted decimal -format. The File Server initially uses the address that appears first -in the list. The order of the remaining addresses is not -significant: if an RPC to the first interface fails, the File Server -simultaneously sends RPCs to all of the other interfaces in the list. -Whichever interface replies first is the one to which the File Server then -sends pings and RPCs to break callbacks. -

    To prohibit the Cache Manager absolutely from using one or more addresses, -list them in the NetRestrict file. To display the addresses -the Cache Manager is currently registering with File Servers, use the fs -getclientaddrs command. To replace the current list of interfaces -with a new one between reboots of the client machine, use the fs -setclientaddrs command. -

    Related Information -

    NetRestrict (client version) -

    fs getclientaddrs -

    fs setclientaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf025.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf025.htm deleted file mode 100755 index 434c6cf26..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf025.htm +++ /dev/null @@ -1,67 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    NetInfo (server version)

    -

    Purpose - - - - - -

    Defines interfaces that File Server registers in VLDB and Ubik uses for -database server machines -

    Description -

    The NetInfo file, if present in the /usr/afs/local -directory, defines the following: -

      -

    • On a file server machine, the local interfaces that the File Server -(fileserver process) can register in the Volume Location Database -(VLDB) at initialization time -

    • On a database server machine, the local interfaces that the Ubik database -synchronization library uses when communicating with the database server -processes running on other database server machines -
    -

    If the NetInfo file exists when the File Server initializes, the -File Server uses its contents as the basis for a list of interfaces to -register in the VLDB. Otherwise, it uses the list of network interfaces -configured with the operating system. It then removes from the list any -addresses that appear in the /usr/vice/etc/NetRestrict file, if it -exists. The File Server records the resulting list in the -/usr/afs/local/sysid file and registers the interfaces in the -VLDB. The database server processes use a similar procedure when -initializing, to determine which interfaces to use for communication with the -peer processes on other database machines in the cell. -

    The NetInfo file is in ASCII format. One of the -machine's IP addresses appears on each line, in dotted decimal -format. The order of the addresses is not significant. -

    To display the File Server interface addresses registered in the VLDB, use -the vos listaddrs command. -

    Related Information -

    NetRestrict (server version) -

    sysid -

    vldb.DB0 and vldb.DBSYS1 -

    fileserver -

    vos listaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf026.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf026.htm deleted file mode 100755 index 64ab67fcd..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf026.htm +++ /dev/null @@ -1,60 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    NetRestrict (client version)

    -

    Purpose - - - - - - -

    Defines client interfaces not to register with the File Server -

    Description -

    The NetRestrict file, if present in a client machine's -/usr/vice/etc directory, defines the IP addresses of the interfaces -that the local Cache Manager does not register with a File Server when first -establishing a connection to it. For an explanation of how the File -Server uses the registered interfaces, see the reference page for the client -version of the NetInfo file. -

    As it initializes, the Cache Manager constructs a list of interfaces to -register, from the /usr/vice/etc/NetInfo file if it exists, or from -the list of interfaces configured with the operating system otherwise. -The Cache Manager then removes from the list any addresses that appear in the -NetRestrict file, if it exists. The Cache Manager records -the resulting list in kernel memory. -

    The NetRestrict file is in ASCII format. One IP address -appears on each line, in dotted decimal format. The order of the -addresses is not significant. The value 255 is a wildcard -that represents all possible addresses in that field. For example, the -value 192.12.105.255 indicates that the Cache -Manager does not register any of the addresses in the -192.12.105 subnet. -

    To display the addresses the Cache Manager is currently registering with -File Servers, use the fs getclientaddrs command. -

    Related Information -

    NetInfo (client version) -

    fs getclientaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf027.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf027.htm deleted file mode 100755 index 053bc52f3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf027.htm +++ /dev/null @@ -1,71 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    NetRestrict (server version)

    -

    Purpose - - - - - -

    Defines interfaces that File Server does not register in VLDB and Ubik does -not use for database server machines -

    Description -

    The NetRestrict file, if present in the -/usr/afs/local directory, defines the following: -

      -

    • On a file server machine, the local interfaces that the File Server -(fileserver process) does not register in the Volume Location -Database (VLDB) at initialization time -

    • On a database server machine, the local interfaces that the Ubik -synchronization library does not use when communicating with the database -server processes running on other database server machines -
    -

    As it initializes, the File Server constructs a list of interfaces to -register, from the /usr/afs/local/NetInfo file if it exists, or -from the list of interfaces configured with the operating system -otherwise. The File Server then removes from the list any addresses -that appear in the NetRestrict file, if it exists. The File -Server records the resulting list in the /usr/afs/local/sysid file -and registers the interfaces in the VLDB. The database server processes -use a similar procedure when initializing, to determine which interfaces to -use for communication with the peer processes on other database machines in -the cell. -

    The NetRestrict file is in ASCII format. One IP address -appears on each line, in dotted decimal format. The order of the -addresses is not significant. The value 255 is a wildcard -that represents all possible addresses in that field. For example, the -value 192.12.105.255 indicates that the Cache -Manager does not register any of the addresses in the -192.12.105 subnet. -

    To display the File Server interface addresses registered in the VLDB, use -the vos listaddrs command. -

    Related Information -

    NetInfo (server version) -

    sysid -

    vldb.DB0 and vldb.DBSYS1 -

    fileserver -

    vos listaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf028.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf028.htm deleted file mode 100755 index 0d46363ed..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf028.htm +++ /dev/null @@ -1,67 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    NoAuth

    -

    Purpose - - - -

    Disables authorization checking -

    Description -

    The NoAuth file, if present in a server machine's -/usr/afs/local directory, indicates to the AFS server processes -running on the machine that it is not necessary to perform authorization -checking. They perform any action for any user who logs into the -machine's local file system or issues a remote command that affects the -machine's AFS server functioning, such as commands from the AFS command -suites. Because failure to check authorization exposes the -machine's AFS server functionality to attack, there are normally only two -circumstances in which the file is present: -

      -

    • During installation of the machine, as instructed in the AFS Quick -Beginnings -

    • During correction of a server encryption key emergency, as discussed in -the AFS Administration Guide -
    -

    In all other circumstances, the absence of the file means that the AFS -server processes perform authorization checking, verifying that the issuer of -a command has the required privilege. -

    Create the file in one of the following ways: -

      -

    • By issuing the bosserver initialization command with the --noauth flag, if the Basic OverSeer (BOS) Server is not already -running -

    • By issuing the bos setauth command with off as the -value for the -authrequired argument, if the BOS Server is already -running -
    -

    To remove the file, issue the bos setauth command with -on as the value for the -authrequired argument. -

    The file's contents, if any, are ignored; an empty (zero-length) -file is effective. -

    Related Information -

    bos setauth -

    bosserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf029.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf029.htm deleted file mode 100755 index c6cffb5ed..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf029.htm +++ /dev/null @@ -1,58 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    SALVAGE.fs

    -

    Purpose - - - - - -

    Triggers salvaging of AFS server partitions -

    Description -

    The SALVAGE.fs file, if present in a file server -machine's /usr/afs/local directory, indicates to the Basic -OverSeer (BOS) Server (bosserver process) that it must invoke the -Salvager (salvager process) during recovery from a failure of the -File Server (fileserver process). -

    The BOS Server creates the zero-length file each time it starts or restarts -the fs process. When the File Server exits normally (for -example, in response to the bos shutdown or bos stop -command), the BOS Server removes the file. However, if the File Server -exits unexpectedly, the file remains in the /usr/afs/local -directory as a signal that the BOS Server must invoke the Salvager process to -repair any file system inconsistencies possibly introduced during the failure, -before restarting the File Server and Volume Server processes. -

    Do not create or remove this file. To invoke the Salvager process -directly, use the bos salvage command or log onto the file server -machine as the local superuser root and issue the -salvager command. -

    Related Information -

    bos salvage -

    bosserver -

    fileserver -

    salvager -

    volserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf030.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf030.htm deleted file mode 100755 index 5680d5ff6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf030.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    SalvageLog

    -

    Purpose - - - -

    Traces Salvager operations -

    Description -

    The SalvageLog file records a trace of Salvager -(salvager process) operations on the local machine and describes -any error conditions it encounters. -

    If the SalvageLog file does not already exist in the -/usr/afs/logs directory when the Salvager starts, the process -creates it and writes initial start-up messages to it. If there is an -existing file, the Salvager renames is to SalvageLog.old, -overwriting the existing SalvageLog.old file if it -exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log onto the file -server machine and use a text editor or a file display command such as the -UNIX cat command. By default, the mode bits on the -SalvageLog file grant the required r (read) -permission to all users. -

    The Salvager records operations only as it completes them, and cannot -recover from failures by reviewing the file. The log contents are -useful for administrative evaluation of process failures and other -problems. -

    Related Information -

    UserList -

    bos getlog -

    salvager -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf031.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf031.htm deleted file mode 100755 index c134f04e8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf031.htm +++ /dev/null @@ -1,59 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    TE_device_name

    -

    Purpose -

    Logs error messages from the Tape Coordinator process -

    Description -

    The TE_device_name file logs error messages generated -by the Backup System Tape Coordinator (butc process) that controls -the tape device or backup data file indicated by device_name. -

    As the Tape Coordinator initializes, it creates the file in ASCII format in -the /usr/afs/backup directory. If there is an existing file, -the Tape Coordinator renames it to -TE_device_name.old, overwriting the -existing TE_device_name.old file if it -exists. -

    For a tape device, the Tape Coordinator derives the variable -device_name portion of the filename from the device pathname listed -in the local /usr/afs/backup/tapeconfig file, by stripping off the -initial /dev/ string and replacing any other slashes in the name -with underscores. For example, the filename for a device called -/dev/rmt/4m is TE_rmt_4m. Similarly, for a backup -data file the Tape Coordinator strips off the initial slash (/) and replaces -any other slashes in the name with underscores. For example, the -filename for a backup data file called /var/tmp/FILE is -TE_var_tmp_FILE. -

    The messages in the file describe the error and warning conditions the Tape -Coordinator encounters as it operates. For instance, a message can list -the volumes that are inaccessible during a dump operation, or warn that the -Tape Coordinator is overwriting a tape or backup data file. The -messages also appear in the /usr/afs/backup/TL_device_name -file, which traces most of the Tape Coordinator's actions. -

    Related Information -

    TL_device_name -

    tapeconfig -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf032.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf032.htm deleted file mode 100755 index 81625fcf5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf032.htm +++ /dev/null @@ -1,78 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    ThisCell (client version)

    -

    Purpose - - - - - -

    Defines client machine's cell membership -

    Description -

    The client version of the ThisCell file defines the complete -Internet domain-style name (for example, abc.com) of the -cell to which the local client machine belongs. It must reside in the -/usr/vice/etc directory on every AFS client machine. To -change a client machine's cell membership, edit the file and reboot the -machine. -

    The file is in ASCII format and contains a character string on a single -line. The AFS Quick Beginnings instructs the administrator -to create it during the installation of each client machine. -

    The client machine's cell membership determines three defaults -important to its functioning: -

      -

    • The cell in which the machine's users authenticate by default. -The effect is two-fold: -
        -

      • The AFS-modified login utilities and the klog command -interpreter contact an Authentication Server in the cell named in the -ThisCell file (unless -cell argument to the -klog command specifies an alternate cell). -

      • The command interpreters combine the cell name with the password that the -user provides, generating an encryption key from the combination. For -authentication to succeed, both the cell name and password must match the ones -used to generate the user's encryption key stored in the Authentication -Database. -
      -

    • The cell the Cache Manager considers its local, or home, cell. By -default, the Cache Manager allows programs that reside in its home cell to run -with setuid permission, but not programs from foreign cells. For more -details, see the fs getcellstatus and fs setcell -reference pages. -

    • Which AFS server processes the local AFS command interpreters contact by -default as they execute commands issued on the machine. -
    -

    The client version of the ThisCell file is distinct from the -server version, which resides in the /usr/afs/etc directory on each -AFS server machine. If a server machine also runs as a client, it is -acceptable for the server and client versions of the file on the same machine -to name different cells. However, the behavior that results from this -configuration can be more confusing than useful. -

    Related Information -

    ThisCell (server version) -

    fs getcellstatus -

    fs setcell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf033.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf033.htm deleted file mode 100755 index 802cd262a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf033.htm +++ /dev/null @@ -1,61 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    ThisCell (server version)

    -

    Purpose - - - - - -

    Defines server machine's cell membership -

    Description -

    The server version of the ThisCell file defines the complete -Internet domain-style name (for example, abc.com) of the -cell to which the server machine belongs. It must reside in the -/usr/afs/etc directory on every AFS server machine. -

    The file is in ASCII format and contains a character string on a single -line. The initial version of the file is created with the bos -setcellname command during the installation of the cell's first -file server machine, and the AFS Quick Beginnings includes -instructions for copying it over to additional server machine during their -installation. -

    The only reason to edit the file is as part of changing the cell's -name, which is strongly discouraged because of the large number of -configuration changes involved. In particular, changing the cell name -requires rebuilding the entire Authentication Database, because the -Authentication Server combines the cell name it finds in this file with each -user and server password and converts the combination into an encryption key -before recording it in the Database. -

    The server version of the ThisCell file is distinct from the -client version, which resides in the /usr/vice/etc directory on -each AFS client machine. If a server machine also runs as a client, it -is acceptable for the server and client versions of the file on the same -machine to name different cells. However, the behavior that results -from this configuration can be more confusing than useful. -

    Related Information -

    ThisCell (client version) -

    bos setcellname -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf034.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf034.htm deleted file mode 100755 index 13fdbd65d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf034.htm +++ /dev/null @@ -1,55 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    TL_device_name

    -

    Purpose -

    Traces Tape Coordinator operations and logs errors -

    Description -

    The TL_device_name file logs the actions performed by -the Backup System Tape Coordinator (butc process) that controls the -tape device or backup data file indicated by device_name. It -also records the same error and warning messages written to the -TE_device_name file. -

    As the Tape Coordinator initializes, it creates the file in ASCII format in -the /usr/afs/backup directory. If there is an existing file, -the Tape Coordinator renames it to -TL_device_name.old, overwriting the -existing TL_device_name.old file if it -exists. -

    For a tape device, the Tape Coordinator derives the variable -device_name portion of the filename from the device pathname listed -in the local /usr/afs/backup/tapeconfig file, by stripping off the -initial /dev/ string and replacing any other slashes in the name -with underscores. For example, the filename for a device called -/dev/rmt/4m is TL_rmt_4m. Similarly, for a backup -data file the Tape Coordinator strips off the initial slash (/) and replaces -any other slashes in the name with underscores. For example, the -filename for a backup data file called /var/tmp/FILE is -TL_var_tmp_FILE. -

    Related Information -

    TE_device_name -

    tapeconfig -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf035.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf035.htm deleted file mode 100755 index e26fbc85c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf035.htm +++ /dev/null @@ -1,59 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    UserList

    -

    Purpose - - -

    Defines privileged administrators -

    Description -

    The UserList file lists the AFS usernames of the system -administrators authorized to issue privileged bos, vos, -and backup commands that affect the local server machine or the -volumes housed on it. It must reside in the /usr/afs/etc -directory on every server machine. -

    Although the UserList file is in ASCII format, do not use a text -editor to alter it. Instead always use the appropriate commands from -the bos command suite: -

      -

    • The bos adduser command to add a user to the file -

    • The bos listusers command to display the contents of the file -

    • The bos removeuser command to remove a user from the file -
    -

    Although it is theoretically possible to list different administrators in -the UserList files on different server machines, doing so can cause -unanticipated authorization failures and is not recommended. In cells -that run the United States edition of AFS and use the Update Server to -distribute the contents of the /usr/afs/etc directory, it is -customary to edit only the copy of the file stored on the system control -machine. In cells that run the international version of AFS, edit the -file on each server machine individually. -

    Related Information -

    bos adduser -

    bos listusers -

    bos removeuser -

    upclient -

    upserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf036.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf036.htm deleted file mode 100755 index e0c7e449f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf036.htm +++ /dev/null @@ -1,94 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    Vn

    -

    Purpose - - - -

    Houses a chunk of AFS data in the disk cache -

    Description -

    A Vn file can store a chunk of cached AFS data on a -client machine that is using a disk cache. As the Cache Manager -initializes, it verifies that the local disk cache directory houses a number -of Vn files equal to the largest of the following: -

      -

    • 100 -

    • One and a half times the result of dividing the cache size by the chunk -size (cachesize/chunksize * 1.5) -

    • The result of dividing the cache size by 10 MB (10,240) -
    -

    The Cache Manager determines the cache size from the -blocks -argument to the afsd command, or if the argument is not included, -from the third field of the /usr/vice/etc/cacheinfo file. -The default chunk size is 64 KB; use the -chunksize argument -to the afsd command to override it. To override the default -number of chunks resulting from the calculation, include the -files -argument to the afsd command. The afsd reference -page describes the restrictions on acceptable values for each of the -arguments. -

    If the disk cache directory houses fewer Vn files than -necessary, the Cache Manager creates new ones, assigning each a unique integer -n that distinguishes it from the other files; the integers start -with 1 and increment by one for each Vn file -created. The Cache Manager removes files if there are more than -necessary. The Cache Manager also adds and removes -Vn files in response to the fs setcachesize -command, which can be used to alter the cache size between reboots. -

    The standard disk cache directory name is /usr/vice/cache, but -it is acceptable to use a directory on a partition with more available -space. To designate a different directory, change the value in the -second field of the /usr/vice/etc/cacheinfo file before issuing the -afsd command, or include the -cachedir argument to the -afsd command. -

    Vn files expand and contract to accommodate the size of -the AFS directory listing or file they temporarily house. As mentioned, -by default each Vn file holds up to 64 KB (65,536 bytes) -of a cached AFS element. AFS elements larger than 64 KB are divided -among multiple Vn files. If an element is smaller -than 64 KB, the Vn file expands only to the required -size. A Vn file accommodates only a single element, -so if there many small cached elements, it is possible to exhaust the -available Vn files without reaching the maximum cache -size. -

    Cautions -

    Editing or removing a Vn file can cause a kernel -panic. To alter cache size (and thus the number of -Vn files) between reboots, use the fs -setcachesize command. Alternatively, alter the value of the --blocks, -files or -chunksize arguments to -the afsd command invoked in the machine's AFS initialization -file, and reboot. To refresh the contents of one or more -Vn files, use the fs flush or fs -flushvolume command. If a Vn file is -accidentally modified or deleted, rebooting the machine usually restores -normal performance. -

    Related Information -

    cacheinfo -

    afsd -

    fs flush -

    fs flushvolume -

    fs setcachesize -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf037.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf037.htm deleted file mode 100755 index 4339da058..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf037.htm +++ /dev/null @@ -1,46 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    Vvol_ID.vol

    -

    Purpose - - - - -

    Represents an AFS volume -

    Description -

    The Vvol_ID.vol file is the header -file for the AFS volume with volume ID vol_ID. There is one -such file for each volume stored on an AFS server (/vicep) -partition. The header file stores information that includes the -volume's name, ID number, type (read/write, read-only, or backup), size -and status (online, offline, or busy). To display information from the -header file, use the vos listvol or vos examine -command. -

    The header file points to, but does not contain, the actual data in the -volume. It is not possible to access the AFS data except by mounting -the volume in the AFS filespace and reading its contents through the Cache -Manager. -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf038.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf038.htm deleted file mode 100755 index 1fe09df39..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf038.htm +++ /dev/null @@ -1,75 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    VLLog

    -

    Purpose - - - -

    Traces Volume Location Server operations -

    Description -

    The VLLog file records a trace of Volume Location (VL) Server -(vlserver process) operations on the local machine and describes -any error conditions it encounters. -

    If the VLLog file does not already exist in the -/usr/afs/logs directory when the VL Server starts, the server -process creates it and writes initial start-up messages to it. If there -is an existing file, the VL Server renames it to VLLog.old, -overwriting the existing VLLog.old file if it exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log onto the server -machine and use a text editor or a file display command such as the UNIX -cat command. By default, the mode bits on the -VLLog file grant the required r (read) -permission to all users. -

    The VL Server records operations only as it completes them, and cannot -recover from failures by reviewing the file. The log contents are -useful for administrative evaluation of process failures and other -problems. -

    The VL Server can record messages at three levels of detail. By -default, it records only very rudimentary messages. To increase logging -to the first level of detail, issue the following command while logged onto -the database server machine as the local superuser root. -

       # kill -TSTP vlserver_pid
    -   
    -
    -

    where vlserver_pid is the process ID of the vlserver -process, as reported in the output from the standard UNIX ps -command. To increase to the second and third levels of detail, repeat -the command. -

    To disable logging, issue the following command. -

     
    -   # kill -HUP vlserver_pid
    -   
    -
    -

    To decrease the level of logging, first completely disable it and then -issue the kill -TSTP command as many times as necessary to reach -the desired level. -

    Related Information -

    UserList -

    bos getlog -

    vlserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf039.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf039.htm deleted file mode 100755 index f2347aedf..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf039.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    VolserLog

    -

    Purpose - - - -

    Traces Volume Server operations -

    Description -

    The VolserLog file records a trace of Volume Server -(volserver process) operations on the local machine and describes -any error conditions it encounters. -

    If the VolserLog file does not already exist in the -/usr/afs/logs directory when the Volume Server starts, the server -process creates it and writes initial start-up messages to it. If there -is an existing file, the Volume Server renames it to -VolserLog.old, overwriting the existing -VolserLog.old file if it exists. -

    The file is in ASCII format. Administrators listed in the -/usr/afs/etc/UserList file can use the bos getlog -command to display its contents. Alternatively, log onto the file -server machine and use a text editor or a file display command such as the -UNIX cat command. By default, the mode bits on the -VolserLog file grant the required r (read) -permission to all users. -

    The Volume Server records operations only as it completes them, and so -cannot recover from failures by reviewing the file. The log contents -are useful for administrative evaluation of process failures and other -problems. -

    Related Information -

    UserList -

    bos getlog -

    volserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf040.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf040.htm deleted file mode 100755 index e918e2119..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf040.htm +++ /dev/null @@ -1,56 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    VolumeItems

    -

    Purpose - - - - -

    Records location mappings for volumes accessed by a Cache Manager using a -disk cache -

    Description -

    The VolumeItems file records the mapping between volume name and -mount point for each volume that the Cache Manager has accessed since it -initialized on a client machine using a disk cache. The Cache Manager -uses the mappings to respond correctly to queries about the current working -directory, which can come from the operating system or commands such as the -UNIX pwd command. -

    As it initializes, the Cache Manager creates the binary-format -VolumeItems file in the local disk cache directory, and it must -always remain there. The conventional directory name is -/usr/vice/cache. -

    Cautions -

    Editing or removing the VolumeItems file can cause a kernel -panic. To refresh the contents of the file, instead use the fs -checkvolumes command. If the VolumeItems file is -accidentally modified or deleted, rebooting the machine usually restores -normal performance. -

    Related Information -

    CacheItems -

    cacheinfo -

    afsd -

    fs checkvolumes -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf041.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf041.htm deleted file mode 100755 index a9e00b273..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf041.htm +++ /dev/null @@ -1,43 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    afszcm.cat

    -

    Purpose - - -

    Error message catalog for debugging the Cache Manager -

    Description -

    The afszcm.cat file is a message catalog for the Cache -Manager. The fstrace dump command interpreter uses it in -conjunction with the standard UNIX catalog utilities to translate Cache -Manager operation codes into character strings as it writes traces in the -fstrace trace log, which makes the log more readable. -

    The conventional location for the file is the /usr/vice/etc/C/ -directory. It can be placed in another directory if the NLSPATH and -LANG environment variables are set appropriately. -

    Related Information -

    afsd -

    fstrace dump -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf042.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf042.htm deleted file mode 100755 index b0fcf03fd..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf042.htm +++ /dev/null @@ -1,59 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bdb.DB0 and bdb.DBSYS1

    -

    Purpose - - - - - -

    Contain the Backup Database and associated log -

    Description -

    The bdb.DB0 file contains the Backup Database, which -records configuration information used by the AFS Backup System along with -cross-indexed records of the tapes created and volumes dumped using the Backup -System commands. -

    The bdb.DBSYS1 file is a log file in which the Backup -Server (buserver process) logs each database operation before -performing it. When an operation is interrupted, the Backup Server -replays the log to complete the operation. -

    Both files are in binary format and reside in the /usr/afs/db -directory on each database server machine that runs the Backup Server. -When the Backup Server starts or restarts on a given machine, it establishes a -connection with its peers and verifies that its copy of the -bdb.DB0 file matches the copy on the other database server -machines. If not, the Backup Servers use AFS's distributed -database technology, Ubik, to distribute to all of the machines the copy of -the database with the highest version number. -

    Use the commands in the backup suite to administer the Backup -Database. It is advisable to create a backup copy of the -bdb.DB0 file on tape on a regular basis, using the UNIX -tar command or another local disk backup utility. -

    Related Information -

    backup -

    backup savedb -

    buserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf043.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf043.htm deleted file mode 100755 index cb8d04854..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf043.htm +++ /dev/null @@ -1,79 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    cacheinfo

    -

    Purpose -

    Defines configuration parameters for the Cache Manager -

    Description -

    The cacheinfo file defines configuration parameters for the -Cache Manager, which reads the file as it initializes. -

    The file contains a single line of ASCII text and must reside in the -/usr/vice/etc directory. Use a text editor to create it -during initial configuration of the client machine; the required format -is as follows: -

       mount_dir:cache_dir:cache_size
    -    
    -
    -

    where -

    -

    mount_dir -
    Names the local disk directory at which the Cache Manager mounts the AFS -namespace. It must exist before the afsd program -runs. The conventional value is /afs. Using any other -value prevents traversal of pathnames that begin with /afs (such as -pathnames to files in foreign cells that do use the conventional name). -The -mountdir argument to the afsd command overrides -this value. -

    cache_dir -
    Names the local disk directory to use as a cache. It must exist -before the afsd program runs. The standard value is -/usr/vice/cache, but it is acceptable to substitute a directory on -a partition with more available space. Although the Cache Manager -ignores this field when configuring a memory cache, a value must always appear -in it. The -cachedir argument to the afsd command -overrides this value. -

    cache_size -
    Specifies the cache size as a number of 1-kilobyte blocks. Larger -caches generally yield better performance, but a disk cache must not exceed -90% of the space available on the cache partition (85% for AIX systems), and a -memory cache must use no more than 25% of available machine memory. -

    The -blocks argument to the afsd command overrides -this value. To reset cache size without rebooting on a machine that -uses disk caching, use the fs setcachesize command. To -display the current size of a disk or memory cache between reboots, use the -fs getcacheparms command. -

    -

    Examples -

    The following example cacheinfo file mounts the AFS namespace at -/afs, establishes a disk cache in the /usr/vice/cache -directory, and defines cache size as 50,000 1-kilobyte blocks. -

       /afs:/usr/vice/cache:50000
    -   
    -
    -

    Related Information -

    afsd -

    fs getcacheparms -

    fs setcachesize -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf044.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf044.htm deleted file mode 100755 index 0f0d748bb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf044.htm +++ /dev/null @@ -1,82 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fms.log

    -

    Purpose -

    Records output from the fms command -

    Description -

    The fms.log file records the output generated by the -fms command. The output includes two numbers that can appear -in a tape device's entry in the /usr/afs/backup/tapeconfig -file on the Tape Coordinator machine to which the tape device is -attached: -

      -

    • The capacity in bytes of the tape in the device -

    • The size in bytes of the end-of-file (EOF) marks (often referred to simply -as filemarks) that the tape device writes -
    -

    When transferring the numbers recorded in this file to the -tapeconfig file, adjust them as specified on the reference page for -the tapeconfig file, to improve Tape Coordinator performance during -dump operations. -

    If the fms.log file does not already exist in the current -working directory, the fms command interpreter creates it. -In this case, the directory's mode bits must grant the rwx -(read, write, and execute) permissions to the -issuer of the command. If there is an existing file, the command -interpreter overwrites it, so the file's mode bits need to grant only the -w permission to the issuer of the fms command. -The fms command interpreter also writes similar information to the -standard output stream as it runs. -

    The file is in ASCII format. To display its contents, log onto the -client machine and use a text editor or a file display command such as the -UNIX cat command. By default, the mode bits on the -fms.log file grant the required r permission only -to the owner (which is the local superuser root by default). -

    Output -

    The first few lines of the file provide a simple trace of the -fms command interpreter's actions, specifying (for example) -how many blocks it wrote on the tape. The final two lines in the file -specify tape capacity and filemark size in bytes, using the following -format: -

       Tape capacity is tape_size bytes
    -   File marks are filemark_size bytes
    -   
    -
    -

    Examples -

    The following example of the fms.log file specifies that -the tape used during the execution of the fms command had a -capacity of 2,136,604,672 bytes, and that the tape device writes filemarks of -size 1,910,220 bytes. -

       fms test started
    -   wrote 130408 blocks
    -   Tape capacity is 2136604672 bytes
    -   File marks are 1910220 bytes
    -   
    -
    -

    Related Information -

    tapeconfig -

    fms -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf045.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf045.htm deleted file mode 100755 index 5d43d6b6d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf045.htm +++ /dev/null @@ -1,60 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kaserver.DB0 and kaserver.DBSYS1

    -

    Purpose - - - - - -

    Contain the Authentication Database and associated log -

    Description -

    The kaserver.DB0 file contains the Authentication -Database, which records server encryption keys and an encrypted form of all -user passwords. The Authentication Server (kaserver process) -uses the information in the database to enable secured communications between -AFS server and client processes. -

    The kaserver.DBSYS1 file is a log file in which the -Authentication Server logs each database operation before performing -it. When an operation is interrupted, the Authentication Server replays -the log to complete the operation. -

    Both files are in binary format and reside in the /usr/afs/db -directory on each of the cell's database server machines. When the -Authentication Server starts or restarts on a given machine, it establishes a -connection with its peers and verifies that its copy of the database matches -the copy on the other database server machines. If not, the -Authentication Servers call on AFS's distributed database technology, -Ubik, to distribute to all of the machines the copy of the database with the -highest version number. -

    Always use the commands in the kas suite to administer the -Authentication Database. It is advisable to create an archive copy of -the database on a regular basis, using a tool such as the UNIX tar -command. -

    Related Information -

    kadb_check -

    kas -

    kaserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf046.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf046.htm deleted file mode 100755 index 0aa7d9d01..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf046.htm +++ /dev/null @@ -1,55 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kaserverauxdb

    -

    Purpose - - -

    Records failed authentication attempts -

    Description -

    The file kaserverauxdb records failed authentication attempts -for the local Authentication Server. The server creates it -automatically in the /usr/afs/local directory by default; use -the -localfiles argument to the kaserver command to -specify an alternate directory. -

    The kaserverauxdb file is an internal database used by the -Authentication Server to prevent access by users who have exceeded the limit -on failed authentication attempts defined in their Authentication Database -entry. The Authentication Server refuses further attempts to -authenticate to an account listed in the database until either an AFS system -administrator issues the kas unlock command to unlock the account, -or the timeout period defined in the user's Authentication Database entry -passes. -

    The kaserverauxdb file is in binary format, so its contents are -not directly accessible. However, the output from the kas -examine command reports an account's maximum number of failed -attempts, the lockout time, and whether the account is currently -locked. -

    Related Information -

    kaserver.DB0 and kaserver.DBSYS1 -

    kas examine -

    kas unlock -

    kaserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf047.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf047.htm deleted file mode 100755 index ea1fc261f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf047.htm +++ /dev/null @@ -1,60 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    prdb.DB0 and prdb.DBSYS1

    -

    Purpose - - - - - -

    Contain the Protection Database and associated log -

    Description -

    The prdb.DB0 file contains the Protection Database, which -maps AFS user, machine, and group names to their respective IDs (AFS UIDs and -GIDs) and tracks group memberships. The Protection Server -(ptserver process) uses the information in the database to help the -File Server grant data access to authorized users. -

    The prdb.DBSYS1 file is a log file in which the -Protection Server logs each database operation before performing it. -When an operation is interrupted, the Protection Server replays the log to -complete the operation. -

    Both files are in binary format and reside in the /usr/afs/db -directory on each of the cell's database server machines. When the -Protection Server starts or restarts on a given machine, it establishes a -connection with its peers and verifies that its copy of the database matches -the copy on the other database server machines. If not, the Protection -Servers call on AFS's distributed database technology, Ubik, to -distribute to all of the machines the copy of the database with the highest -version number. -

    Always use the commands in the pts suite to administer the -Protection Database. It is advisable to create an archive copy of the -database on a regular basis, using a tool such as the UNIX tar -command. -

    Related Information -

    prdb_check -

    pts -

    ptserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf048.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf048.htm deleted file mode 100755 index 5c0270240..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf048.htm +++ /dev/null @@ -1,40 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    salvage.lock

    -

    Purpose -

    Prevents multiple simultaneous salvage operations on a partition -

    Description -

    The salvage.lock file guarantees that only one Salvager -(salvager process) runs at a time on a file server machine (the -single process can fork multiple subprocesses to salvage multiple partitions -in parallel). As the Salvager initializes, it creates the empty -(zero-length) file in the /usr/afs/local directory and invokes the -flock system call on it. It removes the file when it -completes the salvage operation. Because the Salvager must lock the -file to run, only one Salvager can run at a time. -

    Related Information -

    salvager -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf049.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf049.htm deleted file mode 100755 index 6dc35167c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf049.htm +++ /dev/null @@ -1,66 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    sysid

    -

    Purpose - - - - -

    Lists file server machine interface addresses registered in VLDB -

    Description -

    The sysid file records the network interface addresses that the -File Server (fileserver process) registers in the Volume Location -Database (VLDB) for the local file server machine. -

    Each time the File Server restarts, it builds a list of interfaces on the -local machine by reading the /usr/afs/local/NetInfo file, if it -exists. If the file does not exist, the File Server uses the list of -network interfaces configured with the operating system. It then -removes from the list any addresses that appear in the -/usr/afs/local/NetRestrict file, if it exists. The File -Server records the resulting list in the binary-format sysid file -and registers the interfaces in the VLDB. -

    When the Cache Manager requests volume location information, the Volume -Location (VL) Server provides all of the interfaces registered for each server -machine that houses the volume. This enables the Cache Manager to make -use of multiple addresses when accessing AFS data stored on a multihomed file -server machine. -

    Cautions -

    The sysid file is unique to each file server machine, and must -not be copied from one machine to another. If it is a common practice -in the cell to copy the contents of the /usr/afs/local directory -from an existing file server machine to a newly installed one, be sure to -remove the sysid file from the new machine before starting the -fs trio of processes, which includes the fileserver -process. -

    Some versions of AFS limit how many of a file server machine's -interface addresses that can be registered. Consult the AFS -Release Notes. -

    Related Information -

    NetInfo (server version) -

    NetRestrict (server version) -

    vldb.DB0 and vldb.DBSYS1 -

    fileserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf050.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf050.htm deleted file mode 100755 index a9ed802ec..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf050.htm +++ /dev/null @@ -1,165 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    tapeconfig

    -

    Purpose - - - -

    Defines configuration parameters for all tape devices and backup data files -on a Tape Coordinator machine -

    Description -

    The tapeconfig file defines basic configuration parameters for -all of the tape devices or backup data files available for backup operations -on a Tape Coordinator machine. The file is in ASCII format and must -reside in the local /usr/afs/backup directory. The -instruction for each tape device or backup data file appears on its own line -and each has the following format: -

       [capacity    filemark_size]    device_name    port_offset
    -   
    -
    -

    where -

    -

    capacity -
    Specifies the capacity of the tapes used with a tape device, or the amount -of data to write into a backup data file. The Tape Coordinator refers -to this value in two circumstances: -
      -

    • When the capacity field of a tape or backup data file's label is -empty (because the tape has never been labeled). The Tape Coordinator -records this value on the label and uses it when determining how much data it -can write to the tape or file during a backup dump or backup -savedb operation. If there is already a capacity value on the -label, the Tape Coordinator uses it instead. -

    • When the -size argument is omitted the first time the -backup labeltape command is used on a given tape or file. -The Tape Coordinator copies this value into the label's capacity -field. -
    -

    -

    The Tape Coordinator uses this capacity value or the one on the Backup -System tape label to track how much space remains as it writes data to a tape -or backup data file. The appropriate value to record for a tape depends -on the size of the tapes usually used in the device and whether it has a -compression mode; for suggested values, see the AFS Administration -Guide chapter on configuring the Backup System. If using a value -obtained from the fms command, reduce it by 10% to 15% before -recording it in the file. -

    For a backup data file, it is best to provide a value that helps the Tape -Coordinator avoid reaching the end-of-file (EOF) unexpectedly. Make it -at least somewhat smaller than the amount of space available on the partition -housing the file when the dump operation begins, and never larger than the -maximum file size allowed by the operating system. -

    Specify a (positive) integer or decimal value followed by a letter than -indicates units, with no intervening space. In a decimal number, the -number of digits after the decimal point must not translate to fractions of -bytes. The maximum acceptable value is 2048 GB (2 TB). The -acceptable units letters are as follows; if the letter is omitted, the -default is kilobytes. -

    -

      -

    • kor K for kilobytes (KB) -

    • m or M for megabytes (MB) -

    • g or G for gigabytes (GB) -

    • t or T for terabytes (TB) -
    -

    If this field is omitted, the Tape Coordinator uses the maximum acceptable -value (2048 GB or 2 TB). Either leave both this field and the -filemark_size field empty, or provide a value in both of them. -

    filemark_size -
    Specifies the size of a tape device's filemarks (also called -end-of-file or EOF marks), which is set by the device's -manufacturer. In a dump to tape, the Tape Coordinator inserts filemarks -at the boundary between the data from each volume, so the filemark size -affects how much space is available for actual data. -

    The appropriate value to record for a tape depends on the size of the tapes -usually used in the device and whether it has a compression mode; for -suggested values, see the AFS Administration Guide chapter on -configuring the Backup System. If using a value obtained from the -fms command, increase it by 10% to 15% before recording it in the -file. -

    For backup data files, record a value of 0 (zero). The -Tape Coordinator actually ignores this field for backup data files, because it -does not use filemarks when writing to a file. -

    Use the same notation as for the capacity field, but note that the -default units is bytes rather than kilobytes. The maximum acceptable -value is 2048 GB. -

    If this field is empty, the Tape Coordinator uses the value 0 -(zero). Either leave both this field and the capacity field -empty, or provide a value in both of them. -

    device_name -
    Specifies the complete pathname of the tape device or backup data -file. The format of tape device names depends on the operating system, -but on UNIX systems device names generally begin with the string -/dev/. For a backup data file, this field defines the -complete pathname; for a discussion of suggested naming conventions see -the description of the FILE instruction in CFG_device_name. -

    port_offset -
    Specifies the port offset number associated with this combination of Tape -Coordinator and tape device or backup data file. -

    Acceptable values are the integers 0 through 58510 -(the Backup System can track a maximum of 58,511 port offset numbers). -Each value must be unique among the cell's Tape Coordinators, but any -number of them can be associated with a single machine. Port offset -numbers need not be assigned sequentially, and can appear in any order in the -tapeconfig file. Assign port offset 0 to the Tape -Coordinator for the tape device or backup data file used most often for backup -operations; doing so will allow the operator to omit the --portoffset argument from the largest possible number of -backup commands. -

    -

    Privilege Required -

    Creating the file requires UNIX w (write) and -x (execute) permissions on the -/usr/afs/backup directory. Editing the file requires UNIX -w (write) permission on the file. -

    Examples -

    The following example tapeconfig file configures three tape -devices and a backup data file. The first device has device name -/dev/rmt/0h, and is assigned port offset 0 because it -will be the most frequently used device for all backup operations in the -cell. Its default tape capacity is 2 GB and filemark size is 1 -MB. The /dev/rmt/3h drive has half the capacity but a much -smaller filemark size; its port offset is 3. The third -device listed, /dev/rmt/4h, has the same capacity and filemark size -as the first device and is assigned port offset 2. Port -offset 4 is assigned to the backup data file /dev/FILE, -which is actually a symbolic link to the actual file located elsewhere on the -local disk. The Tape Coordinator writes up to 1.5 GB into the -file; as recommended, the filemark size is set to zero. -

       2G 1M /dev/rmt/0h 0
    -   1g 4k /dev/rmt/3h 3
    -   2G 1m /dev/rmt/4h 2
    -   1.5G 0 /dev/FILE 4
    -   
    -
    -

    Related Information -

    backup addhost -

    backup dump -

    backup labeltape -

    backup savedb -

    butc -

    fms -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf051.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf051.htm deleted file mode 100755 index bc4376185..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf051.htm +++ /dev/null @@ -1,58 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vldb.DB0 and vldb.DBSYS1

    -

    Purpose - - - - - - -

    Contain the Volume Location Database and associated log -

    Description -

    The file vldb.DB0 contains the Volume Location Database -(VLDB), which tracks the location of all AFS volumes stored on file server -machines in the cell. The Volume Location (VL) Server -(vlserver process) provides information from the database to Cache -Managers when they need to access AFS data. -

    The file vldb.DBSYS1 is a log file in which the VL Server -logs each database operation before performing it. When an operation is -interrupted, the VL Server replays the log to complete the operation. -

    Both files are in binary format and reside in the /usr/afs/db -directory on each of the cell's database server machines. When the -VL Server starts or restarts on a given machine, it establishes a connection -with its peers and verifies that its copy of the database matches the copy on -the other database server machines. If not, the VL Servers call on -AFS's distributed database technology, Ubik, to distribute to all of the -machines the copy of the database with the highest version number. -

    Always use the commands in the vos suite to administer the -VLDB. It is advisable to create an archive copy of the database on a -regular basis, using a tool such as the UNIX tar command. -

    Related Information -

    vldb_check -

    vlserver -

    vos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf052.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf052.htm deleted file mode 100755 index 2e7cc0803..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf052.htm +++ /dev/null @@ -1,116 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    afsmonitor Configuration File

    -

    Purpose - - -

    Provides instructions for the afsmonitor command -

    Description -

    The afsmonitor configuration file determines which machines the -afsmonitor command probes for File Server or Cache Manager -statistics and which statistics it gathers. Use the -config -argument to the afsmonitor command to identify the configuration -file to use. -

    The instructions that can appear in the configuration file are as -follows: -

    -

    cm host_name -
    Names a client machine for which to display Cache Manager -statistics. The order of cm lines in the file determines the -order in which client machines appear from top to bottom on the System -Overview and Cache Managers output screens. -

    fs host_name -
    Names a file server machine for which to display File Server -statistics. The order of fs lines in the file determines the -order in which file server machines appear from top to bottom on the -System Overview and File Servers output screens. -

    thresh fs | cm field_name thresh_val -[cmd_to_run] [arg1] . . . -[argn] -
    Assigns the threshold value thresh_val to the statistic -field_name, for either a File Server statistic (fs) or a -Cache Manager statistic (cm). The optional -cmd_to_execute field names a binary or script to execute each time -the value of the statistic changes from being below thresh_val to -being at or above thresh_val. A change between two values that -both exceed thresh_val does not retrigger the binary or -script. The optional arg1 through -argn fields are additional values that the -afsmonitor program passes as arguments to the -cmd_to_execute command. If any of them include one or more -spaces, enclose the entire field in double quotes. -

    The parameters fs, cm, field_name, -threshold_val, and arg1 through -argn correspond to the values with the same name on the -thresh line. The host_name parameter identifies the -file server or client machine where the statistic has crossed the threshold, -and the actual_val parameter is the actual value of -field_name that equals or exceeds the threshold value. -

    Use the thresh line to set either a global threshold, which -applies to all file server machines listed on fs lines or client -machines listed on cm lines in the configuration file, or a -machine-specific threshold, which applies to only one file server or client -machine. -

      -

    • To set a global threshold, place the thresh line before any of -the fs or cm lines in the file. -

    • To set a machine-specific threshold, place the thresh line -below the corresponding fs or cm line, and above any -other fs or cm lines. A machine-specific -threshold value always overrides the corresponding global threshold, if -set. Do not place a thresh fs line directly after a -cm line or a thresh cm line directly after a -fs line. -
    -

    show fs | cm field/group/section -
    Specifies which individual statistic, group of statistics, or section of -statistics to display on the File Servers screen (fs) or -Cache Managers screen (cm) and the order in which to -display them. The appendix of afsmonitor statistics in the -AFS Administration Guide specifies the group and section to which -each statistic belongs. Include as many show lines as -necessary to customize the screen display as desired, and place them anywhere -in the file. The top-to-bottom order of the show lines in -the configuration file determines the left-to-right order in which the -statistics appear on the corresponding screen. -

    If there are no show lines in the configuration file, then the -screens display all statistics for both Cache Managers and File -Servers. Similarly, if there are no show fs lines, the -File Servers screen displays all file server statistics, and if -there are no show cm lines, the Cache Managers screen -displays all client statistics. -

    # comments -
    Precedes a line of text that the afsmonitor program ignores -because of the initial number (#) sign, which must appear in the -very first column of the line. -
    -

    For a list of the values that can appear in the -field/group/section field of a show instruction, see the -afsmonitor statistics appendix to the AFS Administration -Guide. -

    Related Information -

    afsmonitor -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf053.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf053.htm deleted file mode 100755 index 2d64a757a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf053.htm +++ /dev/null @@ -1,655 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    package Configuration File

    -

    Purpose - - - -

    Provides instructions for the package command -

    Description -

    The package configuration file defines the file system elements -that the package command creates or alters on the local disk of an -AFS client machine it is configuring. Use the -config or --fullconfig argument to the package command to identify -the configuration file to use. -

    Summary of Configuration File Instructions -

    The configuration file can include one or more instances of each of the -following instructions, each on its own line. A more detailed -description of each instruction's syntax follows this list. -

    -

    B -
    Defines a block special device, such as a disk, which deals with input in -units of multi-byte command blocks -

    C -
    Defines a character special device, such as a terminal or tty, which deals -with input in single character units -

    D -
    Creates a directory -

    F -
    Creates or alters a file to match the contents of a specified source file -

    L -
    Creates a symbolic link -

    S -
    Defines a socket, which is a communications device for UDP and TCP/IP -connections -

    %define -
    Defines a variable or declares a string as defined -

    %ifdef -
    Specifies an action to perform if a certain string is declared or defined -

    %ifndef -
    Specifies an action to perform if a certain string is not declared or -defined -

    %include -
    Includes a library file -

    %undef -
    Declares a string not to be defined, or a variable no longer to have a -value -
    -

    The B and C Instructions for Defining Block and Character Special -Devices - - - - - - - - - - - - - - - -

    The B instruction in a package configuration file -defines a block special device, such as a disk, that deals with input in units -of multi-byte command blocks. The C instruction defines a -character special device, such as a terminal or tty, that deals with input in -single character units. They share a common syntax: -

       {B | C}   device_name  major_device  minor_device  owner  group  mode_bits
    -   
    -
    -

    where -

    -

    B -
    Indicates the definition of a block special device. It must be a -capital letter. -

    C -
    Indicates the definition of character special device. It must be a -capital letter. -

    device_name -
    Names the special device to define. To learn the name format -appropriate to the machine's system type, consult the hardware or -operating system documentation. -

    major_device -
    Specifies the device's major device number in decimal format. -To learn the correct value for the machine's system type, consult the -hardware or operating system documentation. -

    minor_device -
    Specifies the device's minor device number in one of hexadecimal, -octal, or decimal format. Precede a hexadecimal number with the string -0x (zero and the letter x) or an octal number with a -0 (zero). A number without either prefix is interpreted as a -decimal. To learn the correct value for the machine's system type, -consult the hardware or operating system documentation. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the device's owner in the output from the UNIX ls -l -command. -

    group -
    Specifies the group name or UNIX group ID (GID) of the group to be -designated the device's group in the output from the UNIX ls --lg command. -

    mode_bits -
    Defines the device's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. -
    -

    The D Instruction for Creating a Directory - - - - - - - -

    The D instruction in a package configuration file -creates a directory on the local disk. If a symbolic link, file, or -other element on the local disk has the same name, it is replaced with a -directory. If the directory already exists, its owner, group, and mode -bits are changed if necessary to conform with the instruction. The -instruction has the following syntax: -

       D[update_code]  directory  owner  group  mode_bits
    -   
    -
    -

    where -

    -

    D -
    Indicates the creation of a directory. It must be a capital -letter. -

    update_code -
    Modulates the directory creation instruction. It is optional and -follows the letter D directly, without an intervening space. -Choose one of the two acceptable values: -
    -

    X -
    Indicates that the directory is a lost+found directory (used by -the fsck program). -

    R -
    Removes any subdirectory (along its contents) or file that exists in the -existing directory on the local disk but for which an instruction does not -appear in the configuration file. -
    -

    directory -
    Specifies the full pathname of the directory to create. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the directory's owner in the output from the UNIX ls -ld -command. -

    group -
    Specifies the name or UNIX group ID (GID) of the group to be designated -the directory's group in the output from the UNIX ls -lgd -command. -

    mode_bits -
    Defines the directory's UNIX mode bits. Acceptable values are -the standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -drwxr-xr-x, and 644 to drw-r--r--. -
    -

    The F Instruction for Creating or Updating a File - - - - - - - -

    The F instruction in a package configuration file -creates or updates a file on the local disk by copying in the contents of the -indicated source file, which can reside in AFS or on the local disk. If -the package command interpreter cannot access the source file, it -exits without executing any instruction in the configuration file. -

    If a file with the same name already exists on disk, the package -command overwrites it with the contents of the source file, unless the -I update code is used to prevent that. To add a -.old extension to the current version of the file, include -the O update code. To have the machine reboot automatically -after the package program completes, include the Q -update code. -

    If a symbolic link, directory, or other element on the local disk has the -same name, it is replaced with the file (a directory's contents are first -removed as necessary). -

    The instruction has the following syntax: -

       F[update_code]  file  source_file  [owner  group  mode_bits]
    -   
    -
    -

    where -

    -

    F -
    Indicates the creation or update of a file. It must be a capital -letter. -

    update_code -
    Modulates the file creation instruction. It is optional and follows -the letter F directly, without an intervening space. Choose -one or more of the four acceptable values, and list them in any order: -
    -

    A -
    Indicates that the pathname in the source_file field is the -complete pathname of the source file, including the filename. If this -argument is omitted, the package command appends the pathname in -the file field to the pathname in the source_file field to -derive the source file's full name. This code allows the source -and target filenames to differ. -

    I -
    Preserves the existing file called file, rather than overwriting -it. -

    O -
    Saves the existing version of the file by appending a -.old extension to it. -

    Q -
    Causes the package command to exit with status code -4 if it overwrites the file. If the standard -package-related changes have been made to the machine's AFS -initialization file, then status code 4 causes the machine to -reboot automatically. Use this code when the machine must reboot if -updates to the file are to have any effect (for example, if the operating -system file--/vmunix or equivalent--has changed). -
    -

    file -
    Specifies the complete pathname on the local disk of the file to create or -update, including the filename as the final element. -

    source_file -
    Specifies the pathname (local or AFS) of the file to copy to the local -disk. -

    If the A update code is included, specify the source file's -complete pathname. Otherwise, the package command derives -the source file's full name by appending the file pathname to -this pathname. For example, if the A update code is not -included and the file /afs/abc.com/rs_aix42/bin/grep is the -source file for the /bin/grep binary, the proper value in this -field is /afs/abc.com/rs_aix42. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the file's owner in the output from the UNIX ls -l -command. -

    To copy the source file's owner to the target file, leave this field -empty. In this case, the group and mode_bits fields -must also be empty. -

    group -
    Specifies the name or UNIX group ID (GID) of the group to be designated -the file's group in the output from the UNIX ls -lg -command. -

    To copy the source file's group to the target file, leave this field -empty. In this case, the owner and mode_bits fields -must also be empty. -

    mode_bits -
    Defines the file's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. -

    To copy the source file's mode bits to the target file, leave this -field empty. In this case, the owner and group fields -must also be empty. -

    -

    The L Instruction for Creating a Symbolic Link - - - - - - - -

    The L instruction in a package configuration file -creates a symbolic link on the local disk to a directory or file that exists -either in AFS or elsewhere on the local disk. As with the standard UNIX -ln -s command, the link is created even if the actual file or -directory does not exist. -

    If a file or directory on the local disk already has the same name, the -package command replaces it with a symbolic link. -

    The instruction has the following syntax: -

       L[update_code]  link  actual_path  [owner  group  mode_bits]
    -    
    -
    -

    where -

    -

    L -
    Indicates the creation of a symbolic link. It must be a capital -letter. -

    update_code -
    Modulates the link creation instruction. It is optional and follows -the letter L directly, without an intervening space. Choose -one or both of the acceptable values, and list them in any order: -
    -

    A -
    Indicates that the pathname in the actual_path field is the -complete pathname of the actual directory or file (including the filename for -a file). If this argument is omitted, the package command -appends the value in the link field to the pathname in the -actual_path field to derive the actual directory or file's full -name. This code allows the name of the symbolic link and actual -directory or file to differ. -

    I -
    Preserves the existing symbolic link called link, rather than -overwriting it. -
    -

    link -
    Specifies the complete local disk pathname of the symbolic link to -create. -

    actual_path -
    Specifies the pathname (local or AFS) of the directory or file to which -the link refers. If the A update code is included, specify -the directory or file's complete pathname. Otherwise, the -package command derives the actual directory or file's full -name by appending the value in the link field to this -pathname. For example, if the A update code is not included -and /etc/ftpd is a symbolic link to the file -/afs/abc.com/sun4x_56/etc/ftpd, the proper value in this -field is /afs/abc.com/sun4x_56. -

    The package command interpreter correctly handles pathnames that -begin with the ./ (period, slash) or -../ (two periods, slash) notation, interpreting them -relative to the current working directory from which the package -command is invoked. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the symbolic link's owner in the output from the UNIX ls -l -command. -

    To designate the issuer of the package command (usually, the -local superuser root) as the symbolic link's owner, leave this -field empty. In this case, the group and mode_bits -fields must also be empty. -

    group -
    Specifies the name or UNIX group ID (GID) of the group to be designated -the link's group in the output from the UNIX ls -lg -command. -

    To have the symbolic link's group match the default group associated -with the package command's issuer, leave this field -empty. The issuer is usually the local superuser root and -the default group is designated in the issuer's entry in the local -/etc/passwd file or equivalent. If this field is left empty, -the owner and mode_bits fields must also be empty. -

    mode_bits -
    Defines the symbolic link's UNIX mode bits. Acceptable values -are the standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. -

    Leaving this field empty sets the symbolic link's mode bits to -777 (rwxrwxrwx). In this case, the owner -and group fields must also be empty. -

    -

    The S Instruction for Creating a Socket - - - - - - - -

    The S instruction in a package configuration file -creates a socket (a communications device for UDP or TCP/IP connections) on -the local disk. The instruction has the following syntax: -

       S  socket [owner  group  mode_bits]
    -   
    -
    -

    where -

    -

    S -
    Indicates the creation of a socket. It must be a capital -letter. -

    socket -
    Names the socket. The proper format depends on the local -machine's operating system. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the socket's owner in the output from the UNIX ls -l -command. -

    To designate the issuer of the package command (usually, the -local superuser root) as the socket's owner, leave this field -empty. In this case, the group and mode_bits fields -must also be empty. -

    group -
    Specifies the name or UNIX group ID (GID) of the group to be designated -the socket's group in the output from the UNIX ls -lg -command. -

    To have the symbolic link's group match the default group associated -with the package command's issuer, leave this field -empty. The issuer is usually the local superuser root and -the default group is designated in the issuer's entry in the local -/etc/passwd file or equivalent. If this field is left empty, -the owner and mode_bits fields must also be empty. -

    mode_bits -
    Defines the socket's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. -

    Leaving this field empty sets the symbolic link's mode bits to -777 (rwxrwxrwx), modulated by the cell's -umask. In this case, the owner and group fields must -also be empty. -

    -

    The %define or %undef Instructions Declaring or Undeclaring a -Definition - - - - - - -

    The %define instruction in a package configuration -file declares or defines a variable, depending on its number of -arguments: -

      -

    • If followed by a single argument, it declares that argument to be -defined. The argument is then available as a controller when mentioned -in %ifdef and %ifndef statements, which evaluate to -true and false respectively. -

    • If followed by two arguments, it defines the second argument as the value -of the first. When the first argument appears later in this prototype -or other prototype or library files as a variable--surrounded by curly -braces and preceded by a dollar sign, as in the example -${variable}--the package command interpreter -substitutes the second argument for it. -
    -

    The %undef statement negates the effect of a previous -%define statement, declaring its argument to be defined no longer, -or to have a value no longer if it is a variable. -

    The syntax for the two types of instruction are as follows: -

       %define  declaration
    -   %define  variable  value
    -   %undef  declaration
    -   %undef  variable
    -   
    -
    -

    where -

    -

    %define -
    Indicates a definition statement. -

    %undef -
    Indicates a statement that negates a definition. -

    declaration -
    Names the string being declared by a %define statement, or -negated by an %undef statement. -

    variable -
    Specifies the name of the variable that a %define statement is -defining, or an %undef statement is negating. -

    value -
    Specifies the value to substitute for the string in the variable -field when it appears in the appropriate format (surrounded by curly braces -and preceded by a dollar sign, as in the example ${variable}), in -this or other prototype and library files. It can include one or more -words. -
    -

    The %ifdef and %ifndef Instructions for Specifying a Conditional -Action to Perform - - - - - - -

    The %ifdef instruction in a package configuration -file specifies one or more actions to perform if the indicated string has been -declared by a single-argument %define statement, or is a variable -for which a value has been defined by a two-argument %define -statement. -

    Similarly, the %ifndef instruction specifies one or more actions -to perform if the indicated string has not been declared or is a variable -without a value, either because no %define statement has defined it -or an %undef statement has undefined it. -

    In both cases, the optional %else statement specifies one or -more alternate actions to perform if the first statement evaluates to -false. (For an %ifdef statement, the -%else statement is executed if the indicated string has never been -declared or is a variable without a value, or if an %undef -statement has undefined either one; for an %ifndef statement, -it is executed if the string has been declared or is a variable with a -value.) -

    It is possible to nest any number of %ifdef and -%ifndef statements. -

    The two types of statement share a common syntax: -

       %ifdef | ifndef   declaration 
    -                                  action+
    -   [%else [declaration] 
    -                  alternate_action+]
    -   %endif declaration
    -   
    -
    -

    where -

    -

    ifdef -
    Indicates that the statement evaluates as true if the string in -the declaration field is declared or is a variable with a defined -value. -

    ifndef -
    Indicates that the statement evaluates as true if the string in -the declaration field is not declared or is a variable without a -defined value. -

    declaration -
    Specifies the string that must be declared or the variable name that must -have a defined value for an %ifdef statement to evaluate as -true, which results in the specified action being performed. -For an %ifndef statement, the string must not be declared or the -variable must have no defined value for the statement to evaluate as -true. The first and third occurrences of -declaration (the latter following the string %endif) are -required. The second occurrence (following the string %else) -is optional, serving only to clarify to which %ifdef or -%ifndef statement the %else statement belongs. -

    action -
    Specifies each action to perform if the %ifdef or -%ifndef statement evaluates as true. Each action -must appear on a separate line. Acceptable types of actions are other -statements beginning with a percent sign and definition instructions. -

    alternate_action -
    Specifies each action to perform if the %ifdef or -%ifndef statement evaluates to false. Each action -must appear on a separate line. Acceptable types of actions are other -statements beginning with a percent sign and definition instructions. -
    -

    The %include Instruction for Including a Library File - - - -

    The %include instruction in a package configuration -file includes the contents of the indicated library file in a configuration -file that results from the compilation of the prototype file in which the -%include instruction appears. It has the following -syntax: -

       %include  pathname
    -   
    -
    -

    where -

    -

    %include -
    Indicates a library file include statement. -

    pathname -
    Specifies the complete pathname of the library file to include. It -can be in AFS or on the local disk, and can include one or more -variables. -
    -

    Cautions -

    The configuration file must be completely correct. If there are any -syntax errors or incorrect values, the package command interpreter -exits without executing any instruction. -

    Examples -

    The following example B and C instructions define a -disk /dev/hd0a with major and minor device numbers 1 and -0 and mode bits of -rw-r--r--, and a tty -/dev/ttyp5 with major and minor device numbers 6 and -5 and mode bits of -rw-rw-rw. In both cases, the -owner is root and the owning group wheel. -

       B /dev/hd0a 1 0 root wheel 644
    -   C /dev/ttyp5 6 5 root wheel 666
    -   
    -
    -

    The following example D instruction creates the local -/usr directory with owner root and group -wheel and mode bits of drwxr-xr-x. The -R update code removes any files and subdirectories that reside in -the /usr directory (if it already exists) but do not appear in the -configuration file. -

       DR /usr root wheel 755
    -   
    -
    -

    The following example F instruction, appropriate for a machine -running AIX 4.2 in the ABC Corporation cell, creates or updates the -local disk file /bin/grep, using -/afs/abc.com/rs_aix42/bin/grep as the source. -

       F /bin/grep /afs/abc.com/rs_aix42 root wheel 755
    -   
    -
    -

    The next example F instruction creates the -/usr/vice/etc/ThisCell file and specifies an absolute pathname for -the source file, as indicated by the A update code. The -Q code makes the package command return status code 4 as -it exits, prompting a reboot of the machine if the standard -package-related changes have been made to the machine's AFS -initialization file. No values are provided for the owner, group and -mode bits, so the file inherits them from the source file. -

       FAQ /usr/vice/etc/ThisCell /afs/abc.com/common/etc/ThisCell
    -   
    -
    -

    The following example L instruction, appropriate for a machine -running AIX 4.2 in the ABC Corporation cell, creates a symbolic link -from /etc/ftpd on the local disk to the file -/afs/abc.com/rs_aix42/etc/ftpd. -

       L /etc/ftpd /afs/abc.com/rs_aix42 root wheel 644
    -   
    -
    -

    The following example S instruction defines the socket -/dev/printer. -

     
    -   S /dev/printer root wheel 777
    -   
    -
    -

    The following example %define instruction defines the value for -the variable ${diskmode}. This variable is used elsewhere in -the template to fill the owner_name, group_name, and -mode_bits fields in a D, F, or L -instruction. -

       %define diskmode root wheel 644
    -    
    -
    -

    The following example %undef instruction declares the string -afsd not to be defined. -

       %undef afsd
    -   
    -
    -

    The following example %ifdef instruction specifies that if the -string rs_aix42 is currently declared, then when the prototype file -containing the instruction is compiled the three indicated library files are -included. There is no alternate action defined. There must be -%define statements earlier in the prototype file to declare -rs_aix42 and to assign a value to the ${wsadmin} -variable. -

       %ifdef rs_aix42
    -   %include ${wsadmin}/lib/rs_aix42.readonly
    -   %include ${wsadmin}/lib/rs_aix42.generic
    -   %include ${wsadmin}/lib/rs_aix42.generic.dev
    -   %endif rs_aix42
    -   
    -
    -

    The following example %ifndef instruction, appropriate for the -State University cell, defines stateu.edu as the value of -the ${cell} variable if it does not already have a value. -

       %ifndef cell
    -   %define cell stateu.edu
    -   %endif cell
    -   
    -
    -

    The following example %include instruction includes the library -file base.generic from the lib subdirectory of -the directory in which package-related files reside. The -${wsadmin} variable resolves to an actual pathname (such as -/afs/abc.com/wsadmin) during compilation. -

       %include ${wsadmin}/lib/base.generic
    -   
    -
    -

    Related Information -

    package -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf054.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf054.htm deleted file mode 100755 index 1a87db3c3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf054.htm +++ /dev/null @@ -1,343 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss Bulk Input File

    - - - -

    Purpose -

    Provides instructions for the uss bulk command -

    Description -

    The uss bulk input file lists instructions for the -uss command interpreter to execute when running the uss -bulk command. If the file includes add instructions -that reference a uss template file, then the template file must -also exist. -

    Summary of Bulk Input File Instructions -

    The bulk input file can include the following instructions, each on its own -line. A more detailed description of each instruction's syntax -follows this list. -

    -

    add -
    Creates a user account. Equivalent to the uss add -command. -

    delete -
    Deletes a user account. Equivalent to the uss delete -command. -

    delvolume -
    Removes the volume and VLDB entry for each account referenced by a -delete instruction that follows this instruction in the bulk input -file. -

    exec -
    Executes a command. -

    savevolume -
    Preserves the volume and VLDB entry for each account referenced by a -delete instruction that follows this instruction in the bulk input -file. -
    -

    The add Instruction for Creating an Account - - -

    The add instruction creates a user account. Each instance -in the bulk input file is equivalent in effect to a uss add command -issued on the command line. The order of the instruction's fields -matches the order of arguments to the uss add command, although -some arguments do not have a corresponding field. Like the uss -add command's arguments, many of the fields correspond to (provide -a value for) a variable in the uss template file, as indicated in -the following description of each field. -

    The instruction's syntax is as follows. It appears on multiple -lines here only for the sake of legibility--each add -instruction must appear on a single line in the bulk input file. -

       add username[:full_name][:initial_password][:password_expires]
    -       [:file_server][:partition][:mount_point][:uid][:var1][:var2]
    -       [:var3][:var4][:var5][:var6][:var7][:var8][:var9][:]
    -   
    -
    -

    To omit a value for a field (presumably because it is optional or the -template specifies a constant value for it), type nothing between the two -colons that surround it. After the last argument provided, end the line -with either a colon and carriage return, or a carriage return alone. -

    The meaning of, and acceptable values for, each field are as -follows. -

    -

    username -
    Names the user's Authentication Database and Protection Database -entries. It can include up to eight alphanumeric characters, but not -the : (colon), . (period), or @ -(at-sign) characters. Because it becomes the username (the name under -which a user logs in), it is best not to include shell metacharacters and to -obey the restrictions that many operating systems impose on usernames -(usually, to contain no more than eight lowercase letters). -

    Corresponding argument to the uss add command: --user. Corresponding variable in the template file: -$USER. -

    full_name -
    Specifies the user's full name. Do not surround it with double -quotes (""), even if it contains spaces. If not provided, it defaults -to the username in the username field. -

    Corresponding argument to the uss add command: --realname. Corresponding variable in the template -file: $NAME. Many operating systems include a field for the full -name in a user's entry in the local password file (/etc/passwd -or equivalent), and this variable can be used to pass a value to be used in -that field. -

    initial_password -
    Specifies the user's initial password. Although the AFS -commands that handle passwords accept strings of virtually unlimited length, -it is best to use a password of eight characters or less, which is the maximum -length that many applications and utilities accept. If not provided, -this argument defaults to the string changeme. -

    Corresponding argument to the uss add command: --pass. Corresponding variable in the template file: -none. -

    password_expires -
    Sets the number of days after a user's password is changed that it -remains valid. Provide an integer from the range 1 through -254 to specify the number of days until expiration, or the value -0 to indicate that the password never expires (the default). -

    When the password becomes invalid (expires), the user is unable to -authenticate, but has 30 more days in which to issue the kpasswd -command to change the password (after that, only an administrator can change -it). -

    Corresponding argument to the uss add command: --pwexpires. Corresponding variable in the template -file: $PWEXPIRES. -

    file_server -
    Names the file server machine on which to create the new user's -volume. It is best to provide a fully-qualified hostname (for example, -fs1.abc.com), but an abbreviated form is acceptable -provided that the cell's naming service is available to resolve it at the -time the volume is created. -

    Corresponding argument to the uss add command: --server. Corresponding variable in the template file: -$SERVER. -

    partition -
    Specifies the partition on which to create the user's volume; it -must reside on the file server machine named in the file_server -field. Identify the partition by its complete name (for example, -/vicepa, or use one of the following abbreviations: -
       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    Corresponding argument to the uss add command: --partition. Corresponding variable in template: -$PART. -

    mount_point -
    Specifies the complete pathname for the user's home directory. -

    Corresponding argument to the uss add command: --mount. -

    Corresponding variable in template: $MTPT, but in the template -file's V instruction only. Occurrences of the $MTPT -variable in template instructions that follow the V instruction -take their value from the V instruction's mount_point -field. Thus the value of this command line argument becomes the value -for the $MTPT variable in instructions that follow the V -instruction only if the string $MTPT appears alone in the V -instruction's mount_point field. -

    uid -
    Specifies a positive integer other than 0 (zero) to assign as -the user's AFS UID. If this argument is omitted, the Protection -Server assigns an AFS UID that is one greater than the current value of the -max user id counter (use the pts -listmax command to display the counter). If including this -argument, first use the pts examine command to verify that no -existing account already has the desired AFS UID; if one does, the -account-creation process terminates with an error. -

    Corresponding argument to the uss add command: --uid. Corresponding variable in template: $UID. -

    var1 through var9 -
    Specifies values for each of the number variables $1 through $9 that can -appear in the template file. The number variables allow the -administrator to provide values for variables other than the set defined by -the uss command suite. -

    Corresponding argument to the uss add command: --var. Corresponding variables in template: $1 through -$9. -

    If providing a value in any of the fields, then in every field that -precedes it either provide an actual value or indicate an empty field by -putting nothing between two colons. It is acceptable, but not -necessary, to indicate empty fields by putting colons after the last field -that contains an actual value. -

    -

    The delete Instruction for Deleting an Account - - -

    The delete instruction deletes a user account from the -system. Each instance in the bulk input file is equivalent in effect to -a uss delete command issued on the command line. The order -of the instruction's fields matches the order of arguments to the -uss delete command: -

       delete username:mount_point_path[:{ savevolume | delvolume }][:]
    -   
    -
    -

    where -

    -

    username -
    Names the entry to delete from the Protection and Authentication -Databases. -

    mount_point_path -
    Specifies the complete pathname to the user's home directory, which -is deleted from the filespace. By default, the volume mounted there is -also deleted from the file server machine where it resides, as is its record -from the Volume Location Database (VLDB). To prevent deletion, include -the savevolume string in the instruction's third field, or -precede this delete instruction with a savevolume -instruction. Partial pathnames are interpreted relative to the current -working directory. -

    savevolume -
    Retains the volume on its file server machine, and the corresponding entry -in the VLDB. Provide this value or delvolume in the third -field, or omit both values to treat the volume according to the prevailing -default, which is set by a preceding savevolume or -delvolume instruction in the bulk input file. -

    delvolume -
    Removes the volume from its file server machine, and the corresponding -entry from the VLDB. Provide this value or savevolume in the -third field, or omit both values to treat the volume according to the -prevailing default, which is set by a preceding savevolume or -delvolume instruction in the bulk input file. -
    -

    After the last argument provided, end the line with either a colon and -carriage return or a carriage return alone. -

    The exec Instruction for Executing a Command -

    The exec instruction executes the specified command, which can -be a UNIX shell script or command, a program, or an AFS command. The -uss command interpreter must have the necessary privileges in AFS -and the local file system; it assumes the AFS and local identities of the -issuer of the uss bulk command. -

    The instruction's syntax is as follows: -

       exec command
    -   
    -
    -

    The delvolume and savevolume Instructions for Setting the Default -Treatment of Volumes - - - - -

    The savevolume and delvolume instructions determine -the default treatment of volumes referenced by the delete -instructions that follow them in the bulk input file. Their syntax is -as follows: -

       savevolume
    -   delvolume
    -   
    -
    -

    The savevolume instruction prevents the removal of the volume -and VLDB entry for all delete instruction that follow it in the -bulk input file, and the delvolume instruction removes the volume -and VLDB entry for all subsequent delete instructions. -Either setting persists until its opposite appears in the file, or until the -end of the bulk file. -

    If neither line appears in the bulk input file, the default is to remove -the volume and the VLDB entry; delete instructions that appear -before the first savevolume instruction are also subject to this -default. If a delete instruction's third field -specifies either savevolume or delvolume, that setting -overrides the default. -

    Examples -

    The following example add instruction creates an -authentication-only account. The user's initial password is -changeme (the default). -

       add anderson
    -   
    -
    -

    The following example add instructions refer to the indicated -V instruction in a template file (which must appear on a single -line in the template file). -

       add smith:John Smith:::fs1:a:::::marketing 
    -   add jones:Pat Jones:::fs3:c:::::finance
    -   V user.$USER $SERVER.abc.com /vicep$PART 2000 \
    -       /afs/abc.com/usr/$3/$USER $UID $USER all
    -   
    -
    -

    The first add instruction creates an account called -smith in the Protection and Authentication Databases, with an -initial password changeme and a value for $UID provided by the -Protection Server. The volume user.smith resides on -partition /vicepa of file server machine -fs1.abc.com and is mounted at -/afs/abc.com/usr/marketing/smith. He owns his home -directory and has all access permissions on its root directory's access -control list (ACL). The account for jones is similar, except -that the volume resides on partition /vicepc of file server machine -fs3.abc.com and is mounted at -/afs/abc.com/usr/finance/jones. -

    Notice that the fields corresponding to the volume mount point, UID, $1 -variable, and $2 variable are empty (between a and -marketing on the first example line), because their corresponding -variables do not appear in the template file. The initial password -field is also empty. -

    The following add instructions are equivalent in effect to the -preceding example, but explicitly indicate empty fields for all of the number -variables that don't have a value: -

       add smith:John Smith:::fs1:a:::::marketing::::::
    -   add jones:Pat Jones:::fs3:c:::::finance::::::
    -   
    -
    -

    The following example shows a complete bulk file containing a set of -delete instructions combined with a savevolume -instruction. Because the delete instruction for users -smith, pat, and rogers appear before the -savevolume instruction and the third field is blank in each, the -corresponding home volumes are removed. The volume for user -terry is retained because the default established by the -savevolume instruction applies to it, but user -johnson's volume is removed because the third field of her -delete instruction overrides the current default. -

       delete smith:/afs/abc.com/usr/smith
    -   delete pat:/afs/abc.com/usr/pat
    -   delete rogers:/afs/abc.com/usr/rogers
    -   savevolume
    -   delete terry:/afs/abc.com/usr/terry
    -   delete johnson:/afs/abc.com/usr/johnson:delvolume
    -   
    -
    -

    The following example exec instruction appears between sets of -add and delete instructions in a bulk input file. -A message appears in the command shell where the uss bulk command -is issued, to indicate when the additions are finished and the deletions -beginning. -

       exec echo "Additions completed; beginning deletions..."
    -   
    -
    -

    Related Information -

    uss Template File -

    uss add -

    uss bulk -

    uss delete -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf055.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf055.htm deleted file mode 100755 index aa3022304..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf055.htm +++ /dev/null @@ -1,759 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss Template File

    -

    Purpose - - - -

    Provides instructions for the uss add command -

    Description -

    The uss template file defines the components of an AFS user -account that the uss add command (or add instruction in -a uss bulk input file) creates. Use the -template -argument to the uss add or uss bulk command to identify -the template file. -

    Summary of Template File Instructions -

    The template file can include the following instructions, each on its own -line. A more detailed description of each instruction's syntax -follows this list. -

    -

    A -
    Imposes restrictions on user passwords and authentication attempts -

    D -
    Creates a directory -

    E -
    Creates a single-line file -

    F -
    Creates a file by copying a prototype -

    G -
    Defines a directory that is one of a set of parent directories into which -the uss command interpreter evenly distributes newly created home -directories -

    L -
    Creates a hard link -

    S -
    Creates a symbolic link -

    V -
    Creates a volume, mounts it in the file space and sets the ACL on the -mount point -

    X -
    Executes a command -
    -

    If the template file is empty (zero-length), the uss add command -or add instruction in a bulk input file only creates an entry in -the Protection and Authentication Databases, naming them according to the name -specified with the uss add command's -user -argument, or in the bulk input file add instruction's -username field. -

    The A Instruction for Setting the Default Treatment of Volumes - - - - - - - -

    The A instruction in a uss template file enhances -cell security by imposing the following restrictions on users' password -choice and authentication attempts. For further information on these -limits, see the AFS Administration Guide and the kas -setfields reference page. -

      -

    • Limiting the user's password lifetime. When the lifetime -expires, the user can no longer authenticate using that password, and must -change it. -

    • Prohibiting the reuse of the user's 20 most recently used -passwords. -

    • Limiting the number of consecutive times that a user can provide an -incorrect password during authentication, and for how long the Authentication -Server refuses further authentication attempts after the limit is exceeded -(referred to as an account lockout). For regular user -accounts in most cells, the recommended limit is nine and lockout time is 25 -minutes. -
    -

    The instruction has the following syntax: -

       A  username  password_lifetime  password_reuse  failures  locktime
    -   
    -
    -

    where -

    -

    A -
    Indicates a security-enhancing instruction. It must be a capital -letter. -

    username -
    Names the Authentication Database entry on which to impose security -restrictions. Specify the value $USER to read in the -username from the uss add command's -user argument, -or from the username field of an add instruction in a bulk -input file. -

    password_lifetime -
    Sets the number of days after the user's password is changed that it -remains valid. When the password becomes invalid (expires), the user is -unable to authenticate, but has 30 more days in which to issue the -kpasswd command to change the password (after that, only an -administrator can change it). -

    Specify an integer from the range 1 through 254 to -specify the number of days until expiration, the value 0 to -indicate that the password never expires, or the value $PWEXPIRES -to read in the number of days from the uss add or uss -bulk command's -pwexpires argument. If the -A instruction does not appear in the template file, the default is -for the user's password never to expire. -

    password_reuse -
    Determines whether or not the user can change his or her password (using -the kpasswd or kas setpassword command) to one that is -similar to any of the last twenty passwords. The acceptable values are -reuse to allow reuse and noreuse to prohibit it. -If the A instruction does not appear in the template file, the -default is to allow password reuse. -

    failures -
    Sets the number of consecutive times the user can provide an incorrect -password during authentication (using the klog command or a login -utility that grants AFS tokens). When the user exceeds the limit, the -Authentication Server rejects further authentication attempts for the amount -of time specified in the locktime field. -

    Specify an integer from the range 1 through 254 to -specify the number of failures permitted, or the value 0 to -indicate that there is no limit to the number of unsuccessful attempts. -If the A instruction does not appear in the template file, the -default is to allow an unlimited number of failures. -

    locktime -
    Specifies how long the Authentication Server refuses authentication -attempts from a user who has exceeded the failure limit set in the -failures field. -

    Specify a number of hours and minutes (hh:mm) or minutes -only (mm), from the range 01 (one minute) through -36:00 (36 hours). The Authentication Server -automatically reduces any larger value to 36:00 and also -rounds up any non-zero value to the next higher multiple of 8.5 -minutes. A value of 0 (zero) sets an infinite lockout -time; an administrator must always issue the kas unlock -command to unlock the account. -

    -

    The D Instruction for Creating a Directory - - - - - - - - - - - -

    The D instruction in a uss template file creates a -directory. Its intended use is to create a subdirectory in the user -home directory created by the V instruction in the template -file. -

    Any number of D instructions can appear in the template -file. If any variables in the instruction take their values from the -V instruction (notably, the $MTPT variable), the instruction must -follow the V instruction in the file. -

    Although it is possible to use the D instruction to create a -directory on the local disk of the machine where the uss command is -issued, it is not recommended. The preferred method for automated -creation of directories on a local disk is the package -program. Two complications arise if the pathname field refers -to a local disk directory: -

      -

    • The uss command prints a warning message because it cannot -associate an access control list (ACL) with a local disk directory. It -creates the directory nonetheless, and some syntactically correct value must -appear in the instruction's ACL field. -

    • To designate any user other than the issuer as the new directory's -owner, the issuer must log onto the machine as the local superuser -root. For local disk directories, only the local superuser -root is allowed to issue the UNIX chown command that the -uss command interpreter invokes to change the owner from the -default value (the directory's creator, which in this case is the issuer -of the uss command). The issuer must then also use the --admin argument to the uss add or uss bulk -command to authenticate as a privileged AFS administrator, which is required -for creating the Authentication Database and Protection Database entries that -the uss command interpreter always creates for a new -account. -
    -

    The instruction has the following syntax: -

       D  pathname  mode_bits  owner  ACL
    -   
    -
    -

    where -

    -

    D -
    Indicates a directory creation instruction. It must be a capital -letter. -

    pathname -
    Specifies the directory's full pathname. It can include -variables. -

    Specify the read/write path to the directory, to avoid the failure that -results from attempting to create a new directory in a read-only -volume. By convention, the read/write path is indicated by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -reference page for the fs mkmount command. -

    mode_bits -
    Sets the directory's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. The -first (owner) x bit must be turned on to enable access to a -directory. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the directory's owner in the output from the UNIX ls -ld -command. If the directory resides in AFS, place the $UID variable in -this field. If the directory resides on the local disk, this field must -be the username or UID of the uss command's issuer, unless the -issuer is logged in as the local superuser root. -

    ACL -
    Sets the ACL on the new directory. It must appear even if the new -directory resides on the local disk rather than in AFS, but is ignored in that -case. Provide one or more paired values, each pair consisting of an AFS -username or group name and the desired permissions, in that order. -Separate the two parts of the pair, and each pair, with a space. The -fs setacl reference page describes the available -permissions. -

    For an AFS directory, grant all permissions to the directory's owner -at least. Usually that is the new user, in which case the appropriate -value is $USER all. -

    It is not possible to grant any permissions to the issuer of the -uss command. As the last step in account creation, the -uss command interpreter automatically deletes that person from any -ACLs set during the creation process. -

    -

    The E Instruction for Creating a Single-line File - - - - - - -

    The E instruction in a uss template file creates a -file by echoing a specified character string into it. Its intended use -is to create files in the user home directory created by the V -instruction in the template file, or in a subdirectory created by a -D instruction. -

    Any number of E instructions can appear in the template -file. If the file resides in a directory created by a D -instruction, the E instruction must follow the D -instruction in the file. -

    The E and F instructions have complementary -advantages. The character string echoed into the file by an -E instruction can be customized for each user, because it can -include the standard variables for which the uss command -interpreter substitutes the values specified by arguments to the uss -add command or fields in a bulk input file add -instruction. In contrast, a file created using the F -instruction cannot include variables and so has the same content for all -users. However, a file created by an E instruction can be a -single line only, because no carriage returns (newline characters) are allowed -in the character string. -

    Although it is possible to use the E instruction to create a -file on the local disk of the machine where the uss command is -issued, it is not recommended. The preferred method for automated -creation of files on a local disk is the package program. -The main complication is that designating any user other than the issuer as -the new file's owner requires logging onto the machine as the local -superuser root. For local disk files, only the local -superuser root is allowed to issue the UNIX chown -command that the uss command interpreter invokes to change the -owner from the default value (the file's creator, which in this case is -the issuer of the uss command). The issuer must then also -use the -admin argument to the uss add or uss -bulk command to authenticate as a privileged AFS administrator, which is -required for creating the Authentication Database and Protection Database -entries that the uss command interpreter always creates for a new -account. -

    The instruction has the following syntax: -

       E  pathname  mode_bits  owner  "contents"
    -   
    -
    -

    where -

    -

    E -
    Indicates a file creation instruction. It must be a capital -letter. -

    pathname -
    Specifies the file's full pathname. It can include -variables. -

    Specify the read/write path to the file, to avoid the failure that results -from attempting to create a new file in a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -reference page for the fs mkmount command. -

    mode_bits -
    Sets the file's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the file's owner in the output from the UNIX ls -l -command. If the file resides in AFS, place the $UID variable in this -field. If the file resides on the local disk, specify the username or -UID of the uss command's issuer; otherwise, the account -creation operation halts immediately. -

    contents -
    Specifies the one-line character string to write into the new file. -Surround it with double quotes if it contains one or more spaces. It -cannot contain the newline character, but can contain any of the standard -variables, which the command interpreter resolves as it creates the -file. -
    -

    The F Instruction for Creating a File -from a Prototype - - - - - - -

    The F instruction in a uss template file creates a -file by copying the contents of an existing file (the prototype) -into it. Its intended use is to create files in the user home directory -created by the V instruction in the template file, or in a -subdirectory created by a D instruction. -

    Any number of F instructions can appear in the template -file. If the file resides in a directory created by a D -instruction, the F instruction must follow the D -instruction in the file. -

    The E and F instructions have complementary -advantages. A file created using the F instruction has the -same content for all users, whereas a file created by an E -instruction can be customized for each user if it includes variables. -However, a file created by an E instruction can be a single line -only, whereas the prototype file copied by an F instruction can be -any length. -

    Although it is possible to use the F instruction to create a -file on the local disk of the machine where the uss command is -issued, it is not recommended. The preferred method for automated -creation of files on a local disk is the package program. -The main complication is that designating any user other than the issuer as -the new file's owner requires logging onto the machine as the local -superuser root. For local disk files, only the local -superuser root is allowed to issue the UNIX chown -command that the uss command interpreter invokes to change the -owner from the default value (the file's creator, which in this case is -the issuer of the uss command). The issuer must then also -use the -admin argument to the uss add or uss -bulk command to authenticate as a privileged AFS administrator, which is -required for creating the Authentication Database and Protection Database -entries that the uss command interpreter always creates for a new -account. -

    The instruction has the following syntax: -

       F  pathname  mode_bits  owner  prototype_file
    -   
    -
    -

    where -

    -

    F -
    Indicates a file creation instruction. It must be a capital -letter. -

    pathname -
    Specifies the full pathname of the file to create, including the -filename. It can include variables. -

    Specify the read/write path to the file, to avoid the failure that results -from attempting to create a new file in a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -reference page for the fs mkmount command. -

    mode_bits -
    Sets the file's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to combinations of -permissions. Examples: 755 corresponds to -rwxr-xr-x, and 644 to rw-r--r--. -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the file's owner in the output from the UNIX ls -l -command. If the file resides in AFS, place the $UID variable in this -field. If the file resides on the local disk, specify the username or -UID of the uss command's issuer; otherwise, the account -creation operation halts immediately. -

    prototype_file -
    Names the AFS or local disk directory that houses the prototype file to -copy. The prototype file's name must match the final element in -the pathname field. -
    -

    The G Instruction for Facilitating Even -Distribution of Home Directories - - - - - - -

    The G instruction in a uss template file creates a -directory as one of the set of directories from which the uss -command interpreter selects when choosing a new user home directory's -parent directory. More specifically, when the $AUTO variable appears in -the mount_point field of a V instruction, the command -interpreter substitutes for it the directory defined by a G -instruction that currently has the fewest entries. -

    The instruction's intended use is to distribute user accounts evenly -among several directories, rather than using directories that reflect -divisions such as departmental affiliation. Distributing home -directories in this fashion is useful mainly in very large cells where storing -all user home directories under a single parent directory potentially slows -directory lookup, or where a workplace-based division results in unevenly -sized directories such that some users consistently experience slower -directory lookup than others. See the chapter on uss in the -AFS Administration Guide for more information. -

    Any number of G instructions can appear in the template -file. If the V instruction includes the $AUTO variable, it -must appear after all of the G instructions in the file. -

    The instruction has the following syntax: -

       G  directory
    -   
    -
    -

    where -

    -

    G -
    Indicates an instruction that creates a directory to be considered as a -value for the $AUTO variable. It must be a capital letter. -

    directory -
    Specifies the directory's name as either a complete pathname or only -the directory name. The choice determines the appropriate format for -the mount_point field of a V instruction, as discussed in -the following example. -

    Specify the read/write path to the directory, to avoid the failure that -results from attempting to create a new mount point in a read-only volume when -the $AUTO variable is used in a V instruction's -mount_point field. By convention, the read/write path is -indicated by placing a period before the cell name at the pathname's -second level (for example, /afs/.abc.com). For -further discussion of the concept of read/write and read-only paths through -the filespace, see the reference page for the fs mkmount -command. -

    -

    The L and S Instructions for Creating a Link - - - - - - - - - - - - - -

    The L instruction in a uss template file creates a -hard link between two files, as achieved by the standard UNIX ln -command. The S instruction creates a symbolic link between -two files, as achieved by the standard UNIX ln -s command. A -full explanation of links is beyond the scope of this document, but the basic -effect is to create a second name for an existing file, enabling access via -either name. Creating a link does not create a second copy of the -file. -

    AFS allows hard links only if the linked files reside in the same -directory, because it becomes difficult to determine which access control list -(ACL) applies to the file if the two copies reside in directories with -different ACLs. AFS allows symbolic links between two files that reside -in different directories, or even different volumes. The File Server -uses the ACL associated with the actual file rather than the link. -

    Any number of L and S instructions can appear in the -template file. If the existing file or link is to reside in a directory -created by a D instruction, or if the existing file was created by -an E or F instruction, the L or S -instruction must follow the D, E, or F -instruction. -

    The instructions share the following syntax: -

       L  existing_file  link
    -   S  existing_file  link
    -   
    -
    -

    where -

    -

    L -
    Indicates a hard link creation instruction. It must be a capital -letter. -

    S -
    Indicates a symbolic link creation instruction. It must be a -capital letter. -

    existing_file -
    Specifies the complete pathname of the existing file. -

    link -
    Specifies the complete pathname of the second name for the file. -

    Specify the read/write path to the link, to avoid the failure that results -from attempting to create a new link in a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -reference page for the fs mkmount command. -

    -

    The V Instruction for Creating and -Mounting a Volume - - - - - - - - - - - - - - - - - - - -

    The V instruction in a uss template file creates a -volume on a specified file server machine and partition and creates an entry -for it in the Volume Location Database (VLDB). It mounts the volume at -a location in the AFS file space that becomes the user's home directory, -then designates the directory's owner and sets its access control list -(ACL). -

    Only one V instruction can appear in the template file, and one -must appear if the template file contains any instructions at all (is not -empty). All other instructions are optional, except that the template -must include G instructions if the $AUTO variable appears in -it. (The V instruction is not necessarily the first line in -the template. If the template includes the $AUTO variable, then the -G instructions which provide values for the variable must precede -it in the file.) -

    The instruction has the following syntax: -

       V  volume_name  server  partition  quota  mount_point owner  ACL
    -   
    -
    -

    where -

    -

    V -
    Indicates a volume creation instruction. It must be a capital -letter. -

    volume_name -
    Specifies the volume's name. To follow the convention for AFS -user volume names, specify the value user.$USER. -Provide a value for the $USER variable via the uss add -command's -user argument or the username field in the -bulk input file add instruction. -

    server -
    Names the file server machine on which to create the new user's -volume. It is best to provide the fully-qualified hostname (for -example, fs1.abc.com), but an abbreviated form is -acceptable provided that the cell's naming service is available to -resolve it at the time the volume is created. To read in the value from -the uss add command's -server argument, specify the -value $SERVER. -

    partition -
    Specifies the partition on which to create the user's volume; it -must be on the file server machine named in the server field. -Identify the partition by its complete name (for example, /vicepa) -or use or use one of the following abbreviations. -
       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    To read in the value from the uss add command's --partition argument, specify the value $PART. -

    quota -
    Sets the maximum number of kilobyte blocks the volume can occupy on the -file server machine's disk. Specify an integer constant if all -volumes have the same quota (1024 equals a megabyte), or use one of -the number variables ($1 through $9) to assign different values to different -volumes. -

    mount_point -
    Creates a mount point for the volume, which serves as the volume's -root directory. Include the $USER variable as part of the pathname to -follow the convention that user home directory names include the -username. -

    Specify the read/write path to the mount point, to avoid the failure that -results from attempting to create a new mount point in a read-only -volume. By convention, the read/write path is indicated by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). If the $AUTO variable appears -in this field, the directories named by each G instruction possibly -already indicate the read/write path. For further discussion of the -concept of read/write and read-only paths through the filespace, see the -reference page for the fs mkmount command.. -
    Note:If used, the $MTPT variable in this field takes its value from the uss -add command's -mount argument or from the -mount_point field of an add instruction in the bulk input -file. However, subsequent uses of the $MTPT variable (usually in -following D, E, or F instructions) take as -their value the complete contents of this field. -
    -

    owner -
    Specifies the username or UNIX user ID (UID) of the user to be designated -the mount point's owner in the output from the UNIX ls -ld -command. To follow the convention for home directory ownership, place -the value $UID in this field. -

    ACL -
    Sets the ACL on the new directory. Provide one or more paired -values, each pair consisting of an AFS username or group name and the desired -permissions, in that order. Separate the two parts of the pair, and -each pair, with a space. The fs setacl reference page -describes the available permissions. -

    Grant all permissions to the new user at least. The appropriate -value is $USER all. -

    AFS automatically grants the system:administrators group -all permissions as well. It is not possible to grant any permissions to -the issuer of the uss command. As the last step in account -creation, the uss command interpreter automatically deletes that -user from any ACLs set during the creation process. -

    -

    The X Instruction for Running a -Command - - - -

    The X instruction in a uss template file runs the -indicated command, which can be a standard UNIX or AFS command. It can -include any variables from the template file, which the uss command -interpreter resolves before passing the command on to the appropriate other -command interpreter. It must be a single line only, however (cannot -contain carriage returns or newline characters). -

    Any number of X instructions can appear in the template -file. If an instruction manipulates an element created by another -instruction, it must follow that instruction in the file. -

    The instruction has the following syntax: -

       X "command"
    -   
    -
    -

    where -

    -

    X -
    Indicates a command execution instruction. It must be a capital -letter. -

    command -
    Specifies the command to run. Surround it with double quotes as -shown if it contains one or more spaces. It can contain any variables -from the template file, but not newline characters. -
    -

    Examples -

    The following example A instruction sets a password lifetime of -254 days, prohibits password reuse, limits the number of consecutive failed -authentication attempts to nine and sets the corresponding locktime to -25:30 minutes (which is a multiple of 8.5 minutes). The -username is read in from the -user argument to the uss -add command or from the username field in each add -instruction in a bulk input file. -

       A $USER 254 noreuse 9 25:30
    -   
    -
    -

    The following example D instruction creates a directory called -public in a new user's home directory, designates the user as -the directory's owner, and grants him or her all ACL permissions. -

       D $MTPT/public 0755 $UID $USER all 
    -   
    -
    -

    The following example E instruction creates a file in the -current working directory called -username.etcp. The contents are an entry -suitable for incorporating into the cell's global -/etc/password file. -

       E  $USER.etcp  0644 root "$USER:X:$UID:10:$NAME:$MTPT:/bin/csh"
    -   
    -
    -

    The following example F instruction, appropriate for the ABC -Corporation cell, copies a prototype .login file into the -user's home directory. -

       F $MTPT/.login 0644 $UID /afs/abc.com/common/uss/skel/.login 
    -   
    -
    -

    In the following example, the State University cell's administrators -have decided to distribute user home directories evenly into three -directories. They define three G instructions: -

       G usr1
    -   G usr2
    -   G usr3
    -   
    -
    -

    and then put the following value in the mount_point field of the -V instruction: -

       /afs/stateu.edu/$AUTO/$USER
    -   
    -
    -

    Alternatively, if they include the entire directory pathname in the -G instruction: -

       G /afs/stateu.edu/usr1
    -   G /afs/stateu.edu/usr2
    -   G /afs/stateu.edu/usr3
    -   
    -
    -

    then the mount_point field of the V instruction -specifies only the following: -

       $AUTO/$USER
    -   
    -
    -

    The following example L instruction creates a hard link between -the files mail and mbox in the user's home -directory. -

       L $MTPT/mbox $MTPT/mail
    -   
    -
    -

    The following example S instruction, appropriate for the ABC -Corporation cell, links the file Mail/outgoing in the user's -home directory to the file -/afs/abc.com/common/mail/outgoing. -

       S /afs/abc.com/common/mail/outgoing $MTPT/Mail/outgoing
    -   
    -
    -

    The following example V instruction creates a volume called -user.username on the /vicepa partition -of the specified file server machine, assigning it a quota of 3000 kilobyte -blocks. The mount point is under /afs/abc.com/usr and -matches the username (the value of the $USER variable). The user owns -the home directory and has all access rights to it. The instruction -appears on two lines only for legibility; it must appear on a single line -in the template file. -

       V user.$USER $SERVER.abc.com /vicepa 3000   \
    -           /afs/abc.com/usr/$USER $UID $USER all 
    -   
    -
    -

    The following example X instruction mounts the backup version of -the user's volume at the OldFiles subdirectory. -

       X "fs mkm /afs/abc.com/usr/$USER/OldFiles   user.$USER.backup"
    -   
    -
    -

    Related Information -

    uss Bulk Input File -

    fs mkmount -

    uss add -

    uss bulk -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf056.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf056.htm deleted file mode 100755 index 6d4658a39..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf056.htm +++ /dev/null @@ -1,26 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    AFS System Commands

    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf057.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf057.htm deleted file mode 100755 index c34067ee1..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf057.htm +++ /dev/null @@ -1,452 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    afs_intro

    -

    Purpose -

    Introduction to AFS commands -

    Description -

    AFS provides many commands that enable users and system administrators to -use and customize its features. Many of the commands belong to the -following categories, called command suites. -

    -

    backup -
    Interface for configuring and operating the AFS Backup System -

    bos -
    Interface to the Basic Overseer (BOS) Server for administering server -processes and configuration files -

    fs -
    Interface for administering access control lists (ACLs), the Cache -Manager, and other miscellaneous file system functions -

    fstrace -
    Interface for tracing Cache Manager operations when debugging problems -

    kas -
    Interface to the Authentication Server for administering security and -authentication information -

    pts -
    Interface to the Protection Server for administering AFS ID and group -membership information -

    uss -
    Interface for automated administration of user accounts -

    vos -
    Interface to the Volume Server and Volume Location (VL) Server for -administering volumes -
    -

    In addition, there are several commands that do not belong to -suites. -

    AFS Command Syntax
    -

    AFS commands that belong to suites have the following -structure: -

       command_suite operation_code -switch <value>[+]  [-flag]
    -   
    -
    -

    Command Names
    -

    Together, the command_suite and operation_code -make up the command name. -

    The command_suite specifies the group of related commands to -which the command belongs, and indicates which command interpreter and server -process perform the command. AFS has several command suites, including -bos, fs, kas, package, -pts, scout, uss and vos. -Some of these suites have an interactive mode in which the issuer omits the -command_suite portion of the command name. -

    The operation_code tells the command interpreter and server -process which action to perform. Most command suites include several -operation codes. The AFS Administration Reference describes -each operation code in detail, and the AFS Administration Guide -describes how to use them in the context of performing administrative -tasks. -

    Several AFS commands do not belong to a suite and so their names do not -have a command_suite portion. Their structure is otherwise -similar to the commands in the suites. -

    Options
    -

    The term option refers to both arguments and flags, which -are described in the following sections. -

    Arguments
    -

    One or more arguments can follow the command name. Arguments -specify the entities on which to act while performing the command (for -example, which server machine, server process, or file). To minimize -the potential for error, provide a command's arguments in the order -prescribed in its syntax definition. -

    Each argument has two parts, which appear in the indicated order: -

      -

    • The switch specifies the argument's type and is preceded -by a hyphen ( - ). For instance, the switch --server usually indicates that the argument names a server -machine. Switches can often be omitted, subject to the rules outlined -in Conditions for Omitting Switches. -

    • The value names a particular entity of the type specified by -the preceding switch. For example, the proper value for a --server switch is a server machine name like -fs3.abc.com. Unlike switches (which have a -required form), values vary depending on what the issuer wants to -accomplish. Values appear surrounded by angle brackets (< ->) in command descriptions and the online help to show that they are -user-supplied variable information. -
    -

    Some arguments accept multiple values, as indicated by trailing plus sign ( -+ ) in the command descriptions and online help. How many of -a command's arguments take multiple values, and their ordering with -respect to other arguments, determine when it is acceptable to omit -switches. See Conditions for Omitting Switches. -

    Some commands have optional as well as required arguments; the command -descriptions and online help show optional arguments in square brackets ([ -]). -

    Flags
    -

    Some commands have one or more flags, which specify the manner in which -the command interpreter and server process perform the command, or what kind -of output it produces. Flags are preceded by hyphens like switches, but -they take no values. Although the command descriptions and online help -generally list a command's flags after its arguments, there is no -prescribed order for flags. They can appear anywhere on the command -line following the operation code, except in between the parts of an -argument. Flags are always optional. -

    An Example Command
    -

    The following example illustrates the different parts -of a command that belongs to an AFS command suite. -

       % bos getdate -server fs1.abc.com -file ptserver kaserver 
    -   
    -
    -

    where -

      -

    • bos is the command suite. The BOS Server executes most -of the commands in this suite. -

    • getdate is the operation code. It tells the BOS Server -on the specified server machine (in this case -fs1.abc.com) to report the modification dates of -binary files in the local /usr/afs/bin directory. -

    • -server fs1.abc.com is one argument, with --server as the switch and fs1.abc.com as -the value. This argument specifies the server machine on which BOS -Server is to collect and report binary dates. -

    • -file ptserver kaserver is an argument that takes multiple -values. The switch is -file and the values are -ptserver and kaserver. This argument tells the -BOS Server to report the modification dates on the files -/usr/afs/bin/kaserver and /usr/afs/bin/ptserver. -
    -

    Rules for Entering AFS Commands
    -

    Enter each AFS command on a single line (press -<Return> only at the end of the command). Some commands -in this document appear broken across multiple lines, but that is for -legibility only. -

    Use a space to separate each element on a command line from its -neighbors. Spaces rather than commas also separate multiple values of -an argument. -

    In many cases, the issuer of a command can reduce the amount of typing -necessary by using one or both of the following methods: -

      -

    • Omitting switches -

    • Using accepted abbreviations for operation codes, switches (if they are -included at all), and some types of values -
    -

    The following sections explain the conditions for omitting or shortening -parts of the command line. It is always acceptable to type a command in -full, with all of its switches and no abbreviations. -

    Conditions for Omitting Switches  -It is always acceptable to type the switch part of an -argument, but in many cases it is not necessary. Specifically, switches -can be omitted if the following conditions are met. -

      -

    • All of the command's required arguments appear in the order -prescribed by the syntax statement -

    • No switch is provided for any argument -

    • There is only one value for each argument (but note the important -exception discussed in the following paragraph) -
    -

    Omitting switches is possible only because there is a prescribed order for -each command's arguments. When the issuer does not include -switches, the command interpreter relies instead on the order of -arguments; it assumes that the first element after the operation code is -the command's first argument, the next element is the command's -second argument, and so on. The important exception is when a -command's final required argument accepts multiple values. In this -case, the command interpreter assumes that the issuer has correctly provided -one value for each argument up through the final one, so any additional values -at the end belong to the final argument. -

    The following list describes the rules for omitting switches from the -opposite perspective: an argument's switch must be provided when -any of the following conditions apply. -

      -

    • The command's arguments do not appear in the prescribed order -

    • An optional argument is omitted but a subsequent optional argument is -provided -

    • A switch is provided for a preceding argument -

    • More than one value is supplied for a preceding argument (which must take -multiple values, of course); without a switch on the current argument, -the command interpreter assumes that the current argument is another value for -the preceding argument -
    -

    An Example of Omitting Switches  -Consider again the example command from An Example Command. -

       %  bos getdate -server fs1.abc.com -file ptserver kaserver
    -   
    -
    -

    This command has two required arguments: the server machine name -(identified by the -server switch) and binary file name (identified -by the -file switch). The second argument accepts multiple -values. By complying with all three conditions, the issuer can omit the -switches: -

       % bos getdate fs1.abc.com ptserver kaserver
    -   
    -
    -

    Because there are no switches, the bos command interpreter -relies on the order of arguments. It assumes that the first element -following the operation code, fs1.abc.com, is the -server machine name, and that the next argument, ptserver, is a -binary file name. Then, because the command's second (and last) -argument accepts multiple values, the command interpreter correctly interprets -kaserver as an additional value for it. -

    On the other hand, the following is not acceptable because it violates the -first two conditions in Conditions for Omitting Switches: even though there is only one value per argument, the -arguments do not appear in the prescribed order, and a switch is provided for -one argument but not the other. -

       % bos getdate ptserver -server fs1.abc.com
    -   
    -
    -

    Rules for Using Abbreviations and Aliases
    -

    This section explains how to abbreviate operation codes, -option names, server machine names, partition names, and cell names. It -is not possible to abbreviate other types of values. -

    Abbreviating Operation Codes  -It is acceptable to abbreviate an operation code to the shortest form -that still distinguishes it from the other operation codes in its -suite. -

    For example, it is acceptable to shorten bos install to bos -i because there are no other operation codes in the bos -command suite that begin with the letter i. In contrast, -there are several bos operation codes that start with the letter -s, so the abbreviations must be longer to remain unambiguous: -

    -

    bos sa for bos salvage -

    bos seta for bos setauth -

    bos setc for bos setcellname -

    bos setr for bos setrestart -

    bos sh for bos shutdown -

    bos start for bos start -

    bos startu for bos startup -

    bos stat for bos status -

    bos sto for bos stop -

    -

    In addition to abbreviations, some operation codes have an -alias, a short form that is not derived by abbreviating the -operation code to its shortest unambiguous form. For example, the alias -for the fs setacl command is fs sa, whereas the shortest -unambiguous abbreviation is fs seta. -

    There are two usual reasons an operation code has an alias: -

      -

    • Because the command is frequently issued, it is convenient to have a form -shorter than the one derived by abbreviating. The fs setacl -command is an example. -

    • Because the command's name has changed, but users of previous -versions of AFS know the former name. For example, bos -listhosts has the alias bos getcell, its former name. -It is acceptable to abbreviate aliases to their shortest unambiguous form (for -example, bos getcell to bos getc). -
    -

    Even if an operation code has an alias, it is still acceptable to use the -shortest unambiguous form. Thus, the fs setacl command has -three acceptable forms: fs setacl (the full form), fs -seta (the shortest abbreviation), and fs sa (the -alias). -

    Abbreviating Switches and Flags  -It is acceptable to shorten a switch or flag to the shortest form that -distinguishes it from the other switches and flags for its operation -code. It is often possible to omit switches entirely, subject to the -conditions listed in Conditions for Omitting Switches. -

    Abbreviating Server Machine Names  -AFS server machines must have fully-qualified -Internet-style host names (for example, fs1.abc.com), -but it is not always necessary to type the full name on the command -line. AFS commands accept unambiguous shortened forms, but depend on -the cell's name service (such as the Domain Name Service) or a local host -table to resolve a shortened name to the fully-qualified equivalent when the -command is issued. -

    Most commands also accept the dotted decimal form of the machine's IP -address as an identifier. -

    Abbreviating Partition Names  -Partitions that house AFS volumes must have names of -the form /vicepx or /vicepxx, where -the variable final portion is one or two lowercase letters. By -convention, the first server partition created on a file server machine is -called /vicepa, the second /vicepb, and so on. -The AFS Quick Beginnings explains how to configure and name a file -server machine's partitions in preparation for storing AFS volumes on -them. -

    When issuing AFS commands, you can abbreviate a partition name using any of -the following forms: -

       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    Abbreviating Cell Names  -A cell's full name usually matches its Internet -domain name (such as stateu.edu for the State University or -abc.com for ABC Corporation). Some AFS commands -accept unambiguous shortened forms, usually with respect to the local -/usr/vice/etc/CellServDB file but sometimes depending on the -ability of the local name service to resolve the corresponding domain -name. -

    Displaying Online Help for AFS Commands
    -

    To display online help for AFS commands that belong to -suites, use the help and apropos operation codes. -A -help flag is also available on every almost every AFS -command. -

    The online help entry for a command consists of two or three lines: -

      -

    • The first line names the command and briefly describes what it does -

    • If the command has aliases, they appear on the next line -

    • The final line, which begins with the string Usage:, -lists the command's options in the prescribed order; online help -entries use the same typographical symbols (brackets and so on) as this -documentation. -
    -

    If no operation code is specified, the help operation code -displays the first line (short description) for every operation code in the -suite: -

       
    -   % command_suite  help
    -   
    -
    -

    If the issuer specifies one or more operation codes, the help -operation code displays each command's complete online entry (short -description, alias if any, and syntax): -

       
    -   % command_suite help operation_code+
    -   
    -
    -

    The -help flag displays a command's syntax but not the -short description or alias: -

       % command_name -help  
    -   
    -
    -

    The apropos operation code displays the short description of any -command in a suite whose operation code or short description includes the -specified keyword: -

       % command_suite apropos "<help
    -string>"
    -   
    -
    -

    The following example command displays the complete online help entry for -the fs setacl command: -

       
    -   % fs help setacl   
    -   fs setacl: set access control list
    -   aliases: sa
    -   Usage: fs setacl -dir <directory>+ -acl <access list entries>+ 
    -   [-clear] [-negative] [-id] [-if] [-help]
    -   
    -
    -

    To see only the syntax statement, use the -help flag: -

       % fs setacl -help
    -   Usage: fs setacl -dir <directory>+ -acl <access list entries>+ 
    -   [-clear] [-negative] [-id] [-if] [-help]
    -   
    -
    -

    In the following example, a user wants to display the quota for her home -volume. She knows that the relevant command belongs to the -fs suite, but cannot remember the operation code. She uses -quota as the keyword: -

       
    -   % fs apropos quota
    -   listquota: list volume quota
    -   quota: show volume quota usage
    -   setquota: set volume quota
    -   
    -
    -

    The following illustrates the error message that results if no command name -or short description contains the keyword: -

       
    -   % fs apropos "list quota"
    -   Sorry, no commands found
    -   
    -
    -

    Privilege Required -

    Many AFS commands require one or more types of administrative -privilege. See the reference page for each command. -

    Related Information -

    -

    afsd -

    afsmonitor -

    backup -

    bos -

    bosserver -

    buserver -

    butc -

    dlog -

    dpass -

    fileserver -

    fms -

    fs -

    fstrace -

    ftpd (AFS version) -

    inetd (AFS version) -

    kadb_check -

    kas -

    kaserver -

    kdb -

    klog -

    knfs -

    kpasswd -

    kpwvalid -

    package -

    package -

    package_test -

    pagsh -

    prdb_check -

    pts -

    ptserver -

    rcp (AFS version) -

    rsh (AFS version) -

    runntp -

    rxdebug -

    salvager -

    scout -

    sys -

    tokens -

    translate_et -

    unlog -

    up -

    upclient -

    upserver -

    uss -

    vldb_check -

    vlserver -

    volinfo -

    volserver -

    vos -

    xfs_size_check -

    xstat_cm_test -

    xstat_fs_test -

    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf058.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf058.htm deleted file mode 100755 index 9e06f0bc5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf058.htm +++ /dev/null @@ -1,433 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    afsd

    - - - - - - - - -

    Purpose -

    Initializes the Cache Manager and starts related daemons. -

    Synopsis -

    afsd [-blocks <1024 byte blocks in cache>]  
    -     [-files <files in cache>]
    -     [-rootvol <name of AFS root volume>]
    -     [-stat <number of stat entries>]
    -     [-memcache]  [-cachedir <cache directory>]  
    -     [-mountdir <mount location>]
    -     [-daemons <number of daemons to use>]  
    -     [-nosettime]  [-verbose]  [-rmtsys]  [-debug]  
    -     [-chunksize <log(2) of chunk size>]
    -     [-dcache <number of dcache entries>]
    -     [-volumes <number of volume entries>]  
    -     [-biods <number of bkg I/O daemons (aix vm)>]
    -     [-prealloc <number of 'small' preallocated blocks>]
    -     [-confdir <configuration directory>]
    -     [-logfile <Place to keep the CM log>]  
    -     [-waitclose]  [-shutdown]  [-enable_peer_stats]  
    -     [-enable_process_stats]  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The afsd command initializes the Cache Manager on an AFS client -machine by transferring AFS-related configuration information into kernel -memory and starting several daemons. More specifically, the -afsd command performs the following actions: -

      -

    • Sets a field in kernel memory that defines the machine's cell -membership. Some Cache Manager-internal operations and system calls -consult this field to learn which cell to execute in. (The AFS command -interpreters refer to the /usr/vice/etc/ThisCell file -instead.) This information is transferred into the kernel from the -/usr/vice/etc/ThisCell file and cannot be changed until the -afsd program runs again. -

    • Places in kernel memory the names and Internet addresses of the database -server machines in the local cell and (optionally) foreign cells. The -appearance of a cell's database server machines in this list enables the -Cache Manager to contact them and to access files in the cell. Omission -of a cell from this list, or incorrect information about its database server -machines, prevents the Cache Manager from accessing files in it. -

      The list of database server machines is transferred into the kernel from -the /usr/vice/etc/CellServDB file. After initialization, use -the fs newcell command to change the kernel-resident list without -having to reboot. -

    • Mounts the root of the AFS filespace on a directory on the machine's -local disk, according to either the first field in the -/usr/vice/etc/cacheinfo file (the default) or the afsd -command's -mountdir argument. The conventional value is -/afs. -

    • Determines which volume to mount at the root of the AFS file tree. -The default is the volume root.afs; use the --rootvol argument to override it. Although the base -(read/write) form of the volume name is the appropriate value, the Cache -Manager has a bias for accessing the read-only version of the volume (by -convention, root.afs.readonly) if it is -available. -

    • Configures the cache on disk (the default) or in machine memory if the --memcache argument is provided. In the latter case, the -afsd program allocates space in machine memory for caching, and the -Cache Manager uses no disk space for caching even if the machine has a -disk. -

    • Defines the name of the local disk directory devoted to caching, when the --memcache argument is not used. If necessary, the -afsd program creates the directory (its parent directory must -already exist). It does not remove the directory that formerly served -this function, if one exists. -

      The second field in the /usr/vice/etc/cacheinfo file is the -source for this name, and the standard value is the /usr/vice/cache -directory. Use the -cachedir argument to override the value -in the cacheinfo file. -

    • Sets the size of the cache. The default source for the value is the -third field in the /usr/vice/etc/cacheinfo file, which specifies a -number of kilobytes. -

      For a memory cache, the following arguments to the afsd command -override the value in the cacheinfo file: -

        -

      • The -blocks argument, to specify a different number of kilobyte -blocks. -

      • The -dcache and -chunksize arguments together, to -set both the number of dcache entries and the chunk size (see below for -definition of these parameters). In this case, the afsd -program derives cache size by multiplying the two values. Using this -combination is not recommended, as it requires the issuer to perform the -calculation beforehand to determine the resulting cache size. -

      • The -dcache argument by itself. In this case, the -afsd program derives cache size by multiplying the value specified -by the -dcache argument by the default memory cache chunk size of -eight kilobytes. Using this argument is not recommended, as it requires -the issuer to perform the calculation beforehand to determine the resulting -cache size. -
      -

      For satisfactory memory cache performance, the specified value must leave -enough memory free to accommodate all other processes and commands that can -run on the machine. If the value exceeds the amount of memory -available, the afsd program exits without initializing the Cache -Manager and produces the following message on the standard output -stream: -

         afsd: memCache allocation failure at number KB
      -   
      -
      -

      where number is how many kilobytes were allocated just before the -failure. -

      For a disk cache, use the -blocks argument to the -afsd command to override the value in the cacheinfo -file. The value specified in either way sets an absolute upper limit on -cache size; values provided for other arguments (such as --dcache and -chunksize) never result in a larger -cache. The afsd program rejects any setting larger than 95% -of the partition size, and exits after generating an error message on the -standard output stream, because the cache implementation itself requires a -small amount of disk space and overfilling the partition can cause the client -machine to panic. -

      To change the size of a disk cache after initialization without rebooting, -use the fs setcachesize command; the setting persists until -the afsd command runs again or the fs setcachesize -command is reissued. The fs setcachesize command does not -work for memory caches. -

    • Sets the size of each cache chunk, and by implication the amount -of data that the Cache Manager requests at a time from the File Server (how -much data per fetch RPC, since AFS uses partial file transfer). -

      For a disk cache, a chunk is a Vn file and this -parameter sets the maximum size to which each one can expand; the default -is 64 KB. For a memory cache, each chunk is a collection of contiguous -memory blocks; the default is size is 8 KB. -

      To override the default chunk size for either type of cache, use the --chunksize argument to provide an integer to be used as an exponent -of two; see the Options section for details. For a -memory cache, if total cache size divided by chunk size leaves a remainder, -the afsd program rounds down the number of dcache entries, -resulting in a slightly smaller cache. -

    • Sets the number of chunks in the cache. For a memory cache, the -number of chunks is equal to the cache size divided by the chunk size. -For a disk cache, the number of chunks (Vn files) is set -to the largest of the following unless the -files argument is used -to set the value explicitly: -
        -

      • 100 -

      • 1.5 times the result of dividing cache size by chunk size -(cachesize/chunksize * 1.5) -

      • The result of dividing cachesize by 10 KB (cachesize/10240) -
      -

    • Sets the number of dcache entries allocated in machine memory for -storing information about the chunks in the cache. -

      For a disk cache, the /usr/vice/cache/CacheItems file contains -one entry for each Vn file. By default, one half -the number of these entries (but not more that 2,000) are duplicated as dcache -entries in machine memory for quicker access. -

      For a memory cache, there is no CacheItems file so all -information about cache chunks must be in memory as dcache entries. -Thus, there is no default number of dcache entries for a memory cache; -instead, the afsd program derives it by dividing the cache size by -the chunk size. -

      To set the number of dcache entries, use the -dcache -argument; the specified value can exceed the default limit of -2,000. Using this argument is not recommended for either type of -cache. Increasing the number of dcache entries for a disk cache -sometimes improves performance (because more entries are retrieved from memory -rather than from disk), but only marginally. Using this argument for a -memory cache requires the issuer to calculate the cache size by multiplying -this value by the chunk size. -

    • Sets the number of stat entries available in machine memory for -caching status information about cached AFS files. The default is -300; use the -stat argument to override the default. -

    • Randomly selects a file server machine in the local cell as the source for -the correct time. Every five minutes thereafter, the local clock is -adjusted (if necessary) to match the file server machine's clock. -

      Use the -nosettime flag to prevent the afsd command -from selecting a time standard. This is recommended only on file server -machines that are also acting as clients. File server machines maintain -the correct time using the Network Time Protocol Daemon instead. -

    -

    In addition to setting cache configuration parameters, the afsd -program starts the following daemons. (On most system types, these -daemons appear as nameless entries in the output of the UNIX ps -command.) -

      -

    • One callback daemon, which handles callbacks. It also -responds to the File Server's periodic probes, which check that the -client machine is still alive. -

    • One maintenance daemon, which performs the following -tasks: -
        -

      • Garbage collects obsolete data (for example, expired tokens) from kernel -memory -

      • Synchronizes files -

      • Refreshes information from read-only volumes once per hour -

      • Does delayed writes for NFS clients if the machine is running the NFS/AFS -Translator -
      -

    • One cache-truncation daemon, which flushes the cache when free -space is required, by writing cached data and status information to the File -Server. -

    • One server connection daemon, which sends a probe to the File -Server every few minutes to check that it is still accessible. It also -synchronizes the machine's clock with the clock on a randomly-chosen file -server machine, unless the -nosettime flag is used. There is -always one server connection daemon. -

    • One or more background daemons that improve performance by -pre-fetching files and performing background (delayed) writes of saved data -into AFS. -

      The default number of background daemons is two, enough to service at least -five simultaneous users of the machine. To increase the number, use the --daemons argument. A value greater than six is not generally -necessary. -

    • On some system types, one Rx listener daemon, which listens for -incoming RPCs. -

    • On some system types, one Rx event daemon, which reviews the Rx -system's queue of tasks and performs them as appropriate. Most -items in the queue are retransmissions of failed packets. -

    • On machines that run AIX with virtual memory (VM) integration, one or more -VM daemons (sometimes called I/O daemons, which transfer -data between disk and machine memory. The number of them depends on the -setting of the -biods and -daemons arguments: -
        -

      • If the -biods argument is used, it sets the number of VM -daemons. -

      • If only the -daemons argument is used, the number of VM daemons -is twice the number of background daemons. -

      • If neither argument is used, there are five VM daemons. -
      -
    -

    Cautions -

    Do not use the -shutdown parameter. It does not shutdown -the Cache Manager effectively. Instead, halt Cache Manager activity by -using the standard UNIX umount command to unmount the AFS root -directory (by convention, /afs). The machine must then be -rebooted to reinitialize the Cache Manager. -

    Options -

    -

    -blocks -
    Specifies the number of kilobyte blocks to be made available for caching -in the machine's cache directory (for a disk cache) or memory (for a -memory cache), overriding the default defined in the third field of the -/usr/vice/etc/cacheinfo file. For a disk cache, the value -cannot exceed 95% of the space available in the cache partition. If -using a memory cache, do not combine this argument with the -dcache -argument, since doing so can possibly result in a chunk size that is not an -exponent of 2. -

    -files -
    Specifies the number of Vn files to create in the -cache directory for a disk cache, overriding the default that is calculated as -described in the Description section. Each -Vn file accommodates a chunk of data, and can grow to a -maximum size of 64 KB by default. Do not combine this argument with the --memcache argument. -

    -rootvol -
    Names the read/write volume corresponding to the root directory for the -AFS file tree (which is usually the /afs directory). This -value overrides the default of the root.afs volume. -

    -stat -
    Specifies the number of entries to allocate in the machine's memory -for recording status information about the AFS files in the cache. This -value overrides the default of 300. -

    -memcache -
    Initializes a memory cache rather than a disk cache. Do not combine -this flag with the -files argument. -

    -cachedir -
    Names the local disk directory to be used as the cache. This value -overrides the default defined in the second field of the -/usr/vice/etc/cacheinfo file. -

    -mountdir -
    Names the local disk directory on which to mount the root of the AFS -filespace. This value overrides the default defined in the first field -of the /usr/vice/etc/cacheinfo file. If a value other than -the /afs directory is used, the machine cannot access the filespace -of cells that do use that value. -

    -daemons -
    Specifies the number of background daemons to run on the machine. -These daemons improve efficiency by doing prefetching and background writing -of saved data. This value overrides the default of 2, which is adequate -for a machine serving up to five users. Values greater than -6 are not generally more effective than 6. -

    Note: On AIX machines with integrated virtual memory (VM), -the number of VM daemons is set to twice the value of this argument, if it is -provided and the -biods argument is not. If both arguments -are omitted, there are five VM daemons. -

    -nosettime -
    Prevents the Cache Manager from synchronizing its clock with the clock on -a server machine selected at random, by checking the time on the server -machine every five minutes. Use this flag only on a machine that is -already using another time synchronization protocol (for example, a server -machine that is running the runntp process). -

    -verbose -
    Generates a detailed trace of the afsd program's actions -on the standard output stream. -

    -rmtsys -
    Initializes an additional daemon to execute AFS-specific system calls on -behalf of NFS client machines. Use this flag only if the machine is an -NFS/AFS translator machine serving users of NFS client machines who execute -AFS commands. - -

    -debug -
    Generates a highly detailed trace of the afsd program's -actions on the standard output stream. The information is useful mostly -for debugging purposes. -

    -chunksize -
    Sets the size of each cache chunk. The integer provided, which must -be from the range 0 to 30, is used as an exponent on the -number 2. It overrides the default of 16 for a disk cache -(216 is 64 KB) and 13 for a memory cache (213 is 8 -KB). A value of 0 or less, or greater than 30, -sets chunk size to the appropriate default. Values less than -10 (which sets chunk size to a 1 KB) are not recommended. -Combining this argument with the -dcache argument is not -recommended because it requires that the issuer calculate the cache size that -results. -

    -dcache -
    Sets the number of dcache entries in memory, which are used to store -information about cache chunks. For a disk cache, this overrides the -default, which is 50% of the number of Vn files (cache -chunks). For a memory cache, this argument effectively sets the number -of cache chunks, but its use is not recommended, because it requires the -issuer to calculate the resulting total cache size (derived by multiplying -this value by the chunk size). Do not combine this argument with the --blocks argument, since doing so can possibly result in a chunk -size that is not an exponent of 2. -

    -volumes -
    Specifies the number of memory structures to allocate for storing volume -location information. The default value is 50. -

    -biods -
    Sets the number of VM daemons dedicated to performing I/O operations on a -machine running a version of AIX with virtual memory (VM) integration. -If both this argument and the -daemons argument are omitted, the -default is five. If this argument is omitted but the --daemons argument is provided, the number of VM daemons is set to -twice the value of the -daemons argument. -
    Note:Provide this argument only on a machine that runs AIX with VM -integration. -
    -

    -prealloc -
    Specifies the number of pieces of memory to preallocate for the Cache -Manager's internal use. The default initial value is 400, but the -Cache Manager dynamically allocates more memory as it needs it. -

    -confdir -
    Names a directory other than the /usr/vice/etc directory from -which to fetch the cacheinfo, ThisCell, and -CellServDB configuration files. -

    -logfile -
    Is obsolete and has no real effect. It specifies an alternate file -in which to record a type of trace that the Cache Manager no longer -generates; the default value is /usr/vice/etc/AFSLog. -

    -waitclose -
    Has no effect on the operation of the Cache Manager. The behavior -it affected in previous versions of the Cache Manager, to perform synchronous -writes to the File Server, is now the default behavior. To perform -asynchronous writes in certain cases, use the fs storebehind -command. -

    -shutdown -
    Shuts down the Cache Manager, but not in the most effective possible -way. Do not use this flag. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The afsd command is normally included in the machine's AFS -initialization file, rather than typed at the command shell prompt. For -most disk caches, the appropriate form is -

       /usr/vice/etc/afsd
    -   
    -
    -

    The following command is appropriate when enabling a machine to act as an -NFS/AFS Translator machine serving more than five users. -

       /usr/vice/etc/afsd -daemons 4 -rmtsys
    -   
    -
    -

    The following command initializes a memory cache and sets chunk size to 16 -KB (214). -

       /usr/vice/etc/afsd -memcache -chunksize 14
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    CacheItems -

    CellServDB (client version) -

    ThisCell (client version) -

    Vn -

    cacheinfo - - - - - -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf059.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf059.htm deleted file mode 100755 index 52dd0d27b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf059.htm +++ /dev/null @@ -1,329 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    afsmonitor

    -

    Purpose -

    Monitors File Servers and Cache Managers -

    Description -

    afsmonitor [initcmd]  [-config <configuration file>]
    -           [-frequency <poll frequency, in seconds>]
    -           [-output <storage file name>]  [-detailed] 
    -           [-debug <turn debugging output on to the named file>]
    -           [-fshosts <list of file servers to monitor>+]
    -           [-cmhosts <list of cache managers to monitor>+]
    -           [-buffers <number of buffer slots>]  [-help]
    -   
    -afsmonitor [i]  [-co <configuration file>]
    -           [-fr <poll frequency, in seconds>]
    -           [-o <storage file name>]  [-det]
    -           [-deb <turn debugging output on to the named file>]
    -           [-fs <list of file servers to monitor>+]
    -           [-cm <list of cache managers to monitor>+]
    -           [-b <number of buffer slots>]  [-h]
    -
    -

    Description -

    The afsmonitor command initializes a program that gathers and -displays statistics about specified File Server and Cache Manager -operations. It allows the issuer to monitor, from a single location, a -wide range of File Server and Cache Manager operations on any number of -machines in both local and foreign cells. -

    There are 271 available File Server statistics and 570 available Cache -Manager statistics, listed in the appendix about afsmonitor -statistics in the AFS Administration Guide. By default, the -command displays all of the relevant statistics for the file server machines -named by the -fshosts argument and the client machines named by the --cmhosts argument. To limit the display to only the -statistics of interest, list them in the configuration file specified by the --config argument. In addition, use the configuration file -for the following purposes: -

      -

    • To set threshold values for any monitored statistic. When the value -of a statistic exceeds the threshold, the afsmonitor command -displays it in reverse video. There are no default threshold -values. -

    • To invoke a program or script automatically when a statistic exceeds its -threshold. The AFS distribution does not include any such -scripts. -

    • To list the file server and client machines to monitor, instead of using -the -fshosts and -cmhosts arguments. -
    -

    For a description of the configuration file, see the afsmonitor -Configuration File reference page -

    Cautions -

    The following software must be accessible to a machine where the -afsmonitor program is running: -

      -

    • The AFS xstat libraries, which the afsmonitor -program uses to gather data -

    • The curses graphics package, which most UNIX distributions -provide as a standard utility -
    - - -

    The afsmonitor screens format successfully both on so-called -dumb terminals and in windowing systems that emulate terminals. For the -output to looks its best, the display environment needs to support reverse -video and cursor addressing. Set the TERM environment variable to the -correct terminal type, or to a value that has characteristics similar to the -actual terminal type. The display window or terminal must be at least -80 columns wide and 12 lines long. - - - -

    The afsmonitor program must run in the foreground, and in its -own separate, dedicated window or terminal. The window or terminal is -unavailable for any other activity as long as the afsmonitor -program is running. Any number of instances of the -afsmonitor program can run on a single machine, as long as each -instance runs in its own dedicated window or terminal. Note that it can -take up to three minutes to start an additional instance. -

    Options -

    -

    initcmd -
    Accommodates the command's use of the AFS command parser, and is -optional. -

    -config -
    Names the configuration file which lists the machines to monitor, -statistics to display, and threshold values, if any. A partial pathname -is interpreted relative to the current working directory. Provide this -argument if not providing the -fshosts argument, --cmhosts argument, or neither. For instructions on creating -this file, see the preceding Description section, and the section -on the afsmonitor program in the AFS Administration -Guide. -

    -frequency -
    Specifies in seconds how often the afsmonitor program probes -the File Servers and Cache Managers. Valid values range from -1 to 86400 (which is 24 hours); the default value -is 60. This frequency applies to both File Servers and Cache -Managers, but the afsmonitor program initiates the two types of -probes, and processes their results, separately. The actual interval -between probes to a host is the probe frequency plus the time required for all -hosts to respond. -

    -output -
    Names the file to which the afsmonitor program writes all of -the statistics that it collects. By default, no output file is -created. See the section on the afsmonitor command in the -AFS Administration Guide for information on this file. -

    -detailed -
    Formats the information in the output file named by -output -argument in a maximally readable format. Provide the -output -argument along with this one. -

    -fshosts -
    Names one or more machines from which to gather File Server -statistics. For each machine, provide either a fully qualified host -name, or an unambiguous abbreviation (the ability to resolve an abbreviation -depends on the state of the cell's name service at the time the command -is issued). This argument can be combined with the -cmhosts -argument, but not with the -config argument. -

    -cmhosts -
    Names one or more machines from which to gather Cache Manager -statistics. For each machine, provide either a fully qualified host -name, or an unambiguous abbreviation (the ability to resolve an abbreviation -depends on the state of the cell's name service at the time the command -is issued). This argument can be combined with the -fshosts -argument, but not with the -config argument. -

    -buffers -
    Is nonoperational and provided to accommodate potential future -enhancements to the program. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The afsmonitor program displays its data on three screens: -

      -

    • System Overview: This screen appears automatically when -the afsmonitor program initializes. It summarizes separately -for File Servers and Cache Managers the number of machines being monitored and -how many of them have alerts (statistics that have exceeded their -thresholds). It then lists the hostname and number of alerts for each -machine being monitored, indicating if appropriate that a process failed to -respond to the last probe. -

    • File Server: This screen displays File Server statistics -for each file server machine being monitored. It highlights statistics -that have exceeded their thresholds, and identifies machines that failed to -respond to the last probe. -

    • Cache Managers: This screen displays Cache Manager -statistics for each client machine being monitored. It highlights -statistics that have exceeded their thresholds, and identifies machines that -failed to respond to the last probe. -
    -

    Fields at the corners of every screen display the following -information: -

      -

    • In the top left corner, the program name and version number. -

    • In the top right corner, the screen name, current and total page numbers, -and current and total column numbers. The page number (for example, -p. 1 of 3) indicates the index of the current page and the -total number of (vertical) pages over which data is displayed. The -column number (for example, c. 1 of 235) indicates the index -of the current leftmost column and the total number of columns in which data -appears. (The symbol >>> indicates that there is additional -data to the right; the symbol <<< indicates that -there is additional data to the left.) -

    • In the bottom left corner, a list of the available commands. Enter -the first letter in the command name to run that command. Only the -currently possible options appear; for example, if there is only one page -of data, the next and prev commands, which scroll the -screen up and down respectively, do not appear. For descriptions of the -commands, see the following section about navigating the display -screens. -

    • In the bottom right corner, the probes field reports how many -times the program has probed File Servers (fs), Cache Managers -(cm), or both. The counts for File Servers and Cache -Managers can differ. The freq field reports how often the -program sends probes. -
    -

    Navigating the afsmonitor Display Screens -

    As noted, the lower left hand corner of every display screen displays the -names of the commands currently available for moving to alternate screens, -which can either be a different type or display more statistics or machines of -the current type. To execute a command, press the lowercase version of -the first letter in its name. Some commands also have an uppercase -version that has a somewhat different effect, as indicated in the following -list. -

    -

    cm -
    Switches to the Cache Managers screen. Available only on -the System Overview and File Servers screens. -

    fs -
    Switches to the File Servers screen. Available only on -the System Overview and the Cache Managers -screens. -

    left -
    Scrolls horizontally to the left, to access the data columns situated to -the left of the current set. Available when the <<< -symbol appears at the top left of the screen. Press uppercase -L to scroll horizontally all the way to the left (to display the -first set of data columns). -

    next -
    Scrolls down vertically to the next page of machine names. -Available when there are two or more pages of machines and the final page is -not currently displayed. Press uppercase N to scroll to the -final page. -

    oview -
    Switches to the System Overview screen. Available only -on the Cache Managers and File Servers screens. -

    prev -
    Scrolls up vertically to the previous page of machine names. -Available when there are two or more pages of machines and the first page is -not currently displayed. Press uppercase N to scroll to the -first page. -

    right -
    Scrolls horizontally to the right, to access the data columns situated to -the right of the current set. This command is available when the ->>> symbol appears at the upper right of the screen. Press -uppercase R to scroll horizontally all the way to the right (to -display the final set of data columns). -
    -

    The System Overview Screen -

    The System Overview screen appears automatically as the -afsmonitor program initializes. This screen displays the -status of as many File Server and Cache Manager processes as can fit in the -current window; scroll down to access additional information. -

    The information on this screen is split into File Server information on the -left and Cache Manager information on the right. The header for each -grouping reports two pieces of information: -

      -

    • The number of machines on which the program is monitoring the indicated -process -

    • The number of alerts and the number of machines affected by them (an -alertmeans that a statistic has exceeded its threshold or a process -failed to respond to the last probe) -
    -

    A list of the machines being monitored follows. If there are any -alerts on a machine, the number of them appears in square brackets to the left -of the hostname. If a process failed to respond to the last probe, the -letters PF (probe failure) appear in square brackets to the left of -the hostname. -

    The File Servers Screen -

    The File Servers screen displays the values collected at the -most recent probe for File Server statistics. -

    A summary line at the top of the screen (just below the standard program -version and screen title blocks) specifies the number of monitored File -Servers, the number of alerts, and the number of machines affected by the -alerts. -

    The first column always displays the hostnames of the machines running the -monitored File Servers. -

    To the right of the hostname column appear as many columns of statistics as -can fit within the current width of the display screen or window; each -column requires space for 10 characters. The name of the statistic -appears at the top of each column. If the File Server on a machine did -not respond to the most recent probe, a pair of dashes (--) appears -in each column. If a value exceeds its configured threshold, it is -highlighted in reverse video. If a value is too large to fit into the -allotted column width, it overflows into the next row in the same -column. -

    The Cache Managers Screen -

    The Cache Managers screen displays the values collected at the -most recent probe for Cache Manager statistics. -

    A summary line at the top of the screen (just below the standard program -version and screen title blocks) specifies the number of monitored Cache -Managers, the number of alerts, and the number of machines affected by the -alerts. -

    The first column always displays the hostnames of the machines running the -monitored Cache Managers. -

    To the right of the hostname column appear as many columns of statistics as -can fit within the current width of the display screen or window; each -column requires space for 10 characters. The name of the statistic -appears at the top of each column. If the Cache Manager on a machine -did not respond to the most recent probe, a pair of dashes (--) -appears in each column. If a value exceeds its configured threshold, it -is highlighted in reverse video. If a value is too large to fit into -the allotted column width, it overflows into the next row in the same -column. -

    Writing to an Output File -

    Include the -output argument to name the file into which the -afsmonitor program writes all of the statistics it collects. -The output file can be useful for tracking performance over long periods of -time, and enables the administrator to apply post-processing techniques that -reveal system trends. The AFS distribution does not include any -post-processing programs. -

    The output file is in ASCII format and records the same information as the -File Server and Cache Manager display screens. -Each line in the file uses the following format to record the time at which -the afsmonitor program gathered the indicated statistic from the -Cache Manager (CM) or File Server (FS) running on the -machine called host_name. If a probe failed, the error code --1 appears in the statistic field. -

       time  host_name  CM|FS   statistic
    -   
    -
    -

    If the administrator usually reviews the output file manually, rather than -using it as input to an automated analysis program or script, including the --detail flag formats the data in a more easily readable -form. -

    Examples -

    For examples of commands, display screens, and configuration files, see the -section about the afsmonitor program in the AFS Administration -Guide. -

    Privilege Required -

    None -

    Related Information -

    afsmonitor Configuration File -

    fstrace -

    scout -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf060.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf060.htm deleted file mode 100755 index 676874a85..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf060.htm +++ /dev/null @@ -1,267 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup

    - - - - - -

    Purpose -

    Introduction to the backup command suite -

    Description -

    The commands in the backup command suite are the administrative -interface to the AFS Backup System. There are several categories of -commands in the suite: -

      -

    • Commands to copy data from AFS volumes to tape or a backup data file, and -to restore it to the file system: backup diskrestore, -backup dump, backup volrestore, and backup -volsetrestore -

    • Commands to administer the records in the Backup Database: -backup adddump, backup addhost, backup -addvolentry, backup addvolset, backup deldump, -backup deletedump, backup delhost, backup -delvolentry, backup delvolset, backup dumpinfo, -backup listdumps, backup listhosts, backup -listvolsets, backup scantape, backup setexp, and -backup volinfo -

    • Commands to write and read tape labels: backup labeltape -and backup readlabel -

    • Commands to list and change the status of backup operations and the -machines performing them: (backup) jobs, (backup) -kill, and backup status -

    • Commands to enter and leave interactive mode: backup -(interactive) and (backup) quit -

    • Commands to check for and repair corruption in the Backup Database: -backup dbverify, backup restoredb, and backup -savedb -

    • Commands to obtain help: backup apropos and backup -help -
    -

    The backup command interpreter interacts with two other -processes: - - -

      -

    • The Backup Server (buserver) process. It maintains the -Backup Database, which stores most of the administrative information used by -the Backup System. In the standard configuration, the Backup Server -runs on each database server machine in the cell, and uses AFS's -distributed database technology, Ubik, to synchronize its copy of the database -with the copies on the other database server machines. -

    • The Backup Tape Coordinator (butc) process. A separate -instance of the process controls each tape device or backup data file used to -dump or restore data. The Tape Coordinator runs on a Tape Coordinator -machine, which is an AFS server or client machine that has one or more tape -devices attached, or has sufficient disk space to accommodate one or more -backup data files on its local disk. -

      Each Tape Coordinator must be registered in the Backup Database and in the -/usr/afs/backup/tapeconfig configuration file on the Tape -Coordinator machine's local disk, and information in the two places must -be consistent for proper Backup System performance. The optional -/usr/afs/backup/CFG_device_name for each Tape Coordinator -records information used to automate its operation. -

    -

    In addition to the standard command line interface, the backup -command suite provides an interactive interface, which has several -useful features described on the backup (interactive) reference -page. Three of the commands in the suite are available only in -interactive mode: (backup) jobs, (backup) kill, -and (backup) quit. -

    Options -

    The following options are available on many commands in the -backup suite. The reference page for each command also lists -them, but they are described here in greater detail. - - - -

    -

    -cell <cell name> -
    Names the cell in which to run the command. It is acceptable to -abbreviate the cell name to the shortest form that distinguishes it from the -other entries in the /usr/vice/etc/CellServDB file on the local -machine. If the -cell argument is omitted, the command -interpreter determines the name of the local cell by reading the following in -order: -
      -

    1. The value of the AFSCELL environment variable -

    2. The local /usr/vice/etc/ThisCell file -
    -

    -

    Do not combine the -cell and -localauth -options. A command on which the -localauth flag is included -always runs in the local cell (as defined in the server machine's local -/usr/afs/etc/ThisCell file), whereas a command on which the --cell argument is included runs in the specified foreign -cell. -

    The -cell argument is not available on commands issued in -interactive mode. The cell defined when the backup command -interpreter enters interactive mode applies to all commands issued during the -interactive session. - -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -

    - --localauth -
    Constructs a server ticket using the server encryption key with the -highest key version number in the local /usr/afs/etc/KeyFile -file. The backup command interpreter presents the ticket, -which never expires, to the Backup Server, Volume Server and Volume Location -(VL) Server during mutual authentication. -

    Use this flag only when issuing a command on a server machine; client -machines do not usually have a /usr/afs/etc/KeyFile file. -The issuer of a command that includes this flag must be logged on to the -server machine as the local superuser root. The flag is -useful for commands invoked by an unattended application program, such as a -process controlled by the UNIX cron utility or by a cron entry in -the machine's /usr/afs/local/BosConfig file. It is also -useful if an administrator is unable to authenticate to AFS but is logged in -as the local superuser root. -

    Do not combine the -cell and -localauth -options. A command on which the -localauth flag is included -always runs in the local cell (as defined in the server machine's local -/usr/afs/etc/ThisCell file), whereas a command on which the --cell argument is included runs in the specified foreign -cell. -

    The -localauth argument is not available on commands issued in -interactive mode. The local identity and AFS tokens with which the -backup command interpreter enters interactive mode apply to all -commands issued during the interactive session. -

    - --portoffset <TC port offset> -
    Specifies the port offset number of the Tape Coordinator that is to -execute the backup command. The port offset number uniquely -identifies a pairing of a Tape Coordinator (butc) process and tape -device or backup data file. -

    The backup command interpreter and Tape Coordinator process -communicate via a UDP socket, or port. Before issuing a -backup command that involves reading or writing a tape, the backup -operator must start a butc process that controls the appropriate -tape device and listens for requests sent to its port number. If a -Backup System machine has multiple tape devices attached, they can perform -backup operations simultaneously because each device has its own associated -butc process and port offset number. -

    The Backup System associates a tape capacity and file mark size with each -port offset (as defined in the tapeconfig file). For a -compressing tape device, the capacity and file mark values differ for -compression and non-compression modes, so the two modes have distinct port -offset numbers. -

    The Backup Database can store up to 58,511 port offsets, so the legal -values for this argument are the integers 0 through -58510. If the issuer omits the argument, it defaults to -0. (The limit of 58,511 port offsets results from the fact -that UDP socket numbers are identified by a 16-bit integer, and the lowest -socket number used by the Backup System is 7025. The largest number -that a 16-bit integer can represent is 65,535. Subtracting 7,025 yields -58,510. The addition of port offset 0 (zero) increases the maximum to -58,511.) -

    Although it is possible to define up to 58,511 port offset numbers for a -cell, it is not possible to run 58,511 tape devices simultaneously, due to the -following limits: -

      -

    • The maximum number of dump or restore operations that can run -simultaneously is 64. -

    • The maximum number of tape devices that can work together on a restore -operation is 128 (that is the maximum number of values that can be provided -for the -portoffset argument to the backup diskrestore, -backup volrestore, or backup volsetrestore -command). -
    -

    -

    The Backup System does not reserve UDP sockets. If another -application is already using the Tape Coordinator's socket when it tries -to start, the butc process fails and the following error message -appears at the shell prompt: -

       bind: Address already in use
    -   rxi_GetUDPSocket: bind failed
    -   
    -
    -
    -

    Privilege Required - - -

    To issue any backup command that accesses the Backup Database -only, the issuer must be listed in the /usr/afs/etc/UserList file -on every machine where the Backup Server is running. To issue any -backup command that accesses volume data, the issuer must appear in -the UserList file on every Backup Server machine, every Volume -Location (VL) Server machine, and every file server machine that houses -affected volumes. By convention, a common UserList file is -distributed to all database server and file server machines in the -cell. See the chapter on privileged users in the AFS -Administration Guide for more information on this type of -privilege. -

    If the -localauth flag is included, the user must instead be -logged on as the local superuser root on the server machine where -the backup command is issued. -

    Related Information -

    BosConfig -

    CFG_device_name -

    CellServDB (client version) -

    KeyFile -

    ThisCell (client version) -

    ThisCell (server version) -

    UserList -

    tapeconfig -

    backup adddump -

    backup addhost -

    backup addvolentry -

    backup addvolset -

    backup dbverify -

    backup deldump -

    backup deletedump -

    backup delhost -

    backup delvolentry -

    backup delvolset -

    backup diskrestore -

    backup dump -

    backup dumpinfo -

    backup help -

    backup interactive -

    backup jobs -

    backup kill -

    backup labeltape -

    backup listdumps -

    backup listhosts -

    backup listvolsets -

    backup quit -

    backup readlabel -

    backup restoredb -

    backup savedb -

    backup scantape -

    backup setexp -

    backup status -

    backup volinfo -

    backup volrestore -

    backup volsetrestore -

    buserver -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf061.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf061.htm deleted file mode 100755 index bdb0048bb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf061.htm +++ /dev/null @@ -1,186 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup adddump

    - - - - - - - - - - - -

    Purpose -

    Defines a dump level in the dump hierarchy -

    Synopsis -

    backup adddump -dump <dump level name>+ [-expires <expiration date>+]
    -               [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup addd -d  <dump level name>+ [-e <expiration date>+]  [-l]  
    -            [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup adddump command creates one or more dump levels in -the dump hierarchy stored in the Backup Database, and optionally assigns an -expiration date to each one. All of the dump levels in the Backup -Database collectively constitute the dump hierarchy. -

    Use the -expires argument to associate an expiration date with -each dump level. When the Backup System subsequently creates a dump at -the dump level, it uses the specified value to derive the dump's -expiration date, which it records on the label of the tape (or backup data -file). The Backup System refuses to overwrite a tape until after the -latest expiration date of any dump that the tape contains, unless the -backup labeltape command is used to relabel the tape. If a -dump level does not have an expiration date, the Backup System treats dumps -created at the level as expired as soon as it creates them. -

    (Note that the Backup System does not automatically remove a dump's -record from the Backup Database when the dump reaches its expiration date, but -only if the tape that contains the dump is recycled or relabeled. To -remove expired and other obsolete dump records, use the backup -deletedump command.) -

    Define either an absolute or relative expiration date: -

      -

    • An absolute expiration date defines the month/day/year (and, optionally, -hour and minutes) at which a dump expires. If the expiration date -predates the dump creation time, the Backup System immediately treats the dump -as expired. -

    • A relative date defines the number of years, months, or days (or a -combination of the three) after the dump's creation that it -expires. When the Backup System creates a dump at the dump level, it -calculates an actual expiration date by adding the relative date to the start -time of the dump operation. -
    -

    Options -

    -

    -dump -
    Names each dump level to add to the dump hierarchy. Precede full -dump level names with a slash (for example, /full). Indicate -an incremental dump level by preceding it with an ordered list of the dump -levels directly above it in the hierarchy (its parent dump levels); use -the slash as a separator. The parent dump levels must already -exist. For example, the dump levels /full and -/full/incremental1 must exist when the incremental dump level -/full/incremental1/incremental2 is created. -

    Dump level names can have any number of levels, but cannot exceed 256 -characters in length, including the slashes. The maximum length for any -single level (the text between slashes) is 28 characters, not including the -preceding slash. -

    All alphanumeric characters are allowed in dump level names. Do not -use the period (.), however, because it is the separator -between the volume set name and dump level name in the dump name assigned -automatically by the backup dump command. It is best not to -include other metacharacters either; if using them, enclose them in -double quotes (" ") when issuing the backup adddump -command outside interactive mode. -

    -expires -
    Defines the absolute or relative expiration date to associate with each -dump level named by the -dump argument. Absolute expiration -dates have the following format: -

    -

       [at] {NEVER | mm/dd/yyyy [hh:MM] }
    -   
    -
    -

    where the optional word at is followed either by the string -NEVER, which indicates that dumps created at the dump level never -expire, or by a date value with a required portion (mm for month, -dd for day, and yyyy for year) and an optional portion -(hh for hours and MM for minutes). -

    Omit the hh:MM portion to use the default of -midnight (00:00 hours), or provide a value in 24-hour format (for -example, 20:30 is 8:30 p.m.). -Valid values for the year range from 1970 to 2037; -higher values are not valid because the latest possible date in the standard -UNIX representation is in February 2038. The command interpreter -automatically reduces later dates to the maximum value. -

    Relative expiration dates have the following format: -

       [in] [yearsy] [monthsm] [daysd]
    -   
    -
    -

    -

    where the optional word in is followed by at least one of a -number of years (maximum 9999) followed by the letter y, -a number of months (maximum 12) followed by the letter -m, or a number of days (maximum 31) followed by the -letter d. If providing more than one of the three, list them -in the indicated order. If the date that results from adding the -relative expiration value to a dump's creation time is later than the -latest possible date in the UNIX time representation, the Backup System -automatically reduces it to that date. -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition to be -associated with each dump level specified by the -dump -argument. -
    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command defines a full dump called /1999 with a -relative expiration date of one year: -

       % backup adddump -dump /1999 -expires in 1y
    -   
    -
    -

    The following command defines an incremental dump called -/sunday1/monday1 with a relative expiration date of 13 days: -

       % backup adddump -dump /sunday1/monday1 -expires in 13d
    -   
    -
    -

    The following command defines two dump incremental dump levels, -/Monthly/Week1 and /Monthly/Week2. Their parent, -the full dump level /Monthly, must already exist. The -expiration date for both levels is 12:00 a.m. on 1 January -2000. -

       % backup adddump -dump /Monthly/Week1 /Monthly/Week2 -expires at 01/01/2000
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup deldump -

    backup deletedump -

    backup listdumps -

    backup setexp -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf062.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf062.htm deleted file mode 100755 index 12c0299a2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf062.htm +++ /dev/null @@ -1,116 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup addhost

    - - - - - - - - - - -

    Purpose -

    Adds a Tape Coordinator entry to the Backup Database -

    Synopsis -

    backup addhost -tapehost <tape machine name> [-portoffset <TC port offset>]
    -               [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup addh -t <tape machine name>  [-p <TC port offset>]
    -            [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup addhost command creates a Tape Coordinator entry in -the Backup Database. The entry records -

      -

    • The host name of the Tape Coordinator machine where the Tape Coordinator -(butc) process runs, as specified with the -tapehost -argument. -

    • The Tape Coordinator's port offset number, as specified with the --portoffset argument. An entry for the port offset must also -appear in the /usr/afs/backup/tapeconfig file on the Tape -Coordinator machine, where it is mapped to a UNIX device name (for a tape -device) or pathname (for a backup data file). -
    -

    Each Tape Coordinator must have its own port offset number, and the command -fails if a Backup Database entry already exists for the requested port offset -number. To display existing Tape Coordinator entries, use the -backup listhosts command. -

    Options -

    -

    -tapehost -
    Specifies the fully-qualified hostname of the machine for which to create -a Tape Coordinator entry in the Backup Database. The machine must have -an entry in either the cell's naming service (such as the Domain Name -Service) or the host file (/etc/hosts or equivalent) on the machine -where the command is issued. -

    -portoffset -
    Specifies the Tape Coordinator's port offset number. Provide -an integer from the range 0 through 58510, or omit this -argument to use the default value of 0 (zero). The value -must match the port offset number recorded for the same combination of Tape -Coordinator and tape device or file in the -/usr/afs/backup/tapeconfig file on the Tape Coordinator machine -named by the -tapehost argument. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command creates an entry in the Backup Database that assigns -port offset number 4 to a Tape Coordinator running on the machine -backup1.abc.com: -

       % backup addhost -tapehost backup1.abc.com -portoffset 4
    -   
    -
    -

    The following command creates a Backup Database entry that assigns port -offset number 0 to a Tape Coordinator on the machine -backup3.abc.com: -

       % backup addhost backup3.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup delhost -

    backup listhosts -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf063.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf063.htm deleted file mode 100755 index 4f23a1927..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf063.htm +++ /dev/null @@ -1,189 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup addvolentry

    - - - - - - - - - - - - - - -

    Purpose -

    Defines a volume entry in a volume set -

    Synopsis -

    backup addvolentry -name <volume set name>  -server <machine name>
    -                   -partition <partition name> 
    -                   -volumes <volume name (regular expression)>   
    -                   [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup addvole -n <volume set name>  -s <machine name> -p <partition name>
    -               -v <volume name (regular expression)>
    -               [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup addvolentry command adds a volume entry definition to -the existing volume set named by the -name argument. A -volume entry definition can match one or more volumes, depending on the -combination of the -server, -partition, and --volumes arguments. -

    For the -server and -partition arguments, provide -either -

      -

    • The name of one machine or partition -

    • The metacharacter expression .* (period and asterisk), -which matches every machine name or partition name in the Volume Location -Database (VLDB). -
    -

    For the -volumes argument, specify a combination of alphanumeric -characters and one or more metacharacters to wildcard part or all of the -volume name. The Options section lists the acceptable -metacharacters. -

    Cautions -

    It is best to issue this command in interactive mode. If issuing it -at the shell prompt, enclose any strings containing metacharacters in double -quotes, or escape the metacharacters with other delimiters, to prevent the -shell from interpreting them. Adding volume entries to a temporary -volume set is possible only within the interactive session in which the volume -set was created. -

    Options -

    -

    -name -
    Names the volume set to which to add this volume entry definition. -The volume set must already exist (use the backup addvolset command -to create it). -

    -server -
    Defines the set of one or more file server machines that house the volumes -in the volume entry. Provide either one fully-qualified hostname (such -as fs1.abc.com) or the metacharacter expression -.* (period and asterisk), which matches all machine names in -the VLDB. -

    -partition -
    Defines the set of one or more partitions that house the volumes in the -volume entry. Provide either one complete partition name (such as -/vicepa) or the metacharacter expression .* -(period and asterisk), which matches all partition names. -

    -volumes -
    Defines the set of one or more volumes included in the volume -entry. Specify the volumes by name, by using any combination of regular -alphanumeric characters and one or more of the following metacharacter -expressions: - - -
    -

    . -
    The period matches any single character. -

    * -
    The asterisk matches zero or more instances of the preceding -character. Combine it with any other alphanumeric character or -metacharacter. -

    [ ] -
    Square brackets around a list of characters match a single instance of any -of the characters, but no other characters; for example, [abc] -matches a single a or b or c, but not -d or A. This expression can be combined with the -asterisk. -

    ^ -
    The caret, when used as the first character in a square-bracketed set, -designates a match with any single character except the characters -that follow it; for example, [^a] matches any single character -except lowercase a. This expression can be combined with the -asterisk. -

    \ -
    A backslash preceding any of the metacharacters in this list makes it -match its literal value only. For example, the expression -\. (backslash and period) matches a single period, -\* a single asterisk, and \\ a single backslash. -Such expressions can be combined with the asterisk (for example, -\.* matches any number of periods). -
    -

    -

    Perhaps the most common metacharacter expression is the period followed by -an asterisk (.*). This expression matches any string -of any length, because the period matches any character and the asterisk means -any number of that character. As mentioned, it is the only acceptable -metacharacter expression for the -server and -partition -arguments. In a volume definition it can stand alone (in which case it -matches every volume listed in the VLDB), or can combine with regular -characters. The following example matches any volume name that begins -with the string user and ends with backup: -

       user.*backup
    -   
    -
    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command adds a volume entry to the volume set called -sys. The entry matches all volumes on any machine or -partition whose names begin with the string sun4x_56 followed by a -period: -

       backup> addvolentry sys .* .* sun4x_56\..*
    -   
    -
    -

    The following command adds a volume entry to the volume set called -fs2, to match all volumes on the /vicepb partition of -file server machine fs2.abc.com. Because it is -issued at the shell prompt, double quotes surround the metacharacters in the --volumes argument. (The command is shown here on two lines -only for legibility reasons.) -

       % backup addvolentry -name fs2 -server fs2.abc.com \
    -                        -partition /vicepb -volumes ".*"
    -   
    -
    -

    The chapter in the AFS Administration Guide about configuring -the AFS Backup System presents additional examples as well as advice on -grouping volumes. -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addvolset -

    backup delvolentry -

    backup delvolset -

    backup listvolsets -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf064.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf064.htm deleted file mode 100755 index ef09f63f7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf064.htm +++ /dev/null @@ -1,109 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup addvolset

    - - - - - - -

    Purpose -

    Creates a new (empty) volume set -

    Synopsis -

    backup addvolset -name <volume set name> [-temporary] 
    -                 [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup addvols -n <volume set name> [-t]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup addvolset command creates a new volume set, by -default adding it to the Backup Database. It is best that the volume -set's name indicate the volume set's contents; for example, -define the volume entries in the user volume set to match all user -volumes. The volume set name must be unique within the Backup Database -of the local cell. -

    After issuing this command, issue the backup addvolentry command -to define the volume entries in the volume set. -

    Sometimes it is convenient to create volume sets without recording them -permanently in the Backup Database, for example when using the backup -volsetrestore command to restore a group of volumes that were not -necessarily backed up together. To create a temporary volume -set, include the -temporary flag. A temporary volume set -exists only during the lifetime of the current interactive session, so the -flag is effective only when used during an interactive session (opened by -issuing the backup interactive command). If it is included -when the command is issued at the regular command shell prompt, the command -appears to succeed, but the volume set is not created. As noted, a -temporary volume set ceases to exist when the current interactive session -ends, or use the backup delvolset command to delete it before -that. -

    One advantage of temporary volume sets is that the backup -addvolset command, and any backup addvolentry commands -subsequently used to add volume entries to it, complete more quickly than for -regular volume sets, because no records are created in the Backup -Database. -

    Options -

    -

    -name -
    Names the new volume set. The name can include up to 31 of any -character other than the period. Avoid other metacharacters as -well. -

    -temporary -
    Creates a volume set that exists only within the context of the current -interactive session. It is not added to the Backup Database. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command creates a volume set called sys: -

       % backup addvolset sys
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addvolentry -

    backup delvolentry -

    backup delvolset -

    backup listvolsets -

    backup volsetrestore -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf065.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf065.htm deleted file mode 100755 index eb848d5db..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf065.htm +++ /dev/null @@ -1,73 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    backup apropos -topic <help string>  [-help] 
    -  
    -backup ap -t <help string>  [-h]
    -
    -

    Description -

    The backup apropos command displays the first line of the online -help entry for any backup command that has in its name or short -description the string specified by the -topic argument. -

    To display the syntax for a command, use the backup help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes -(" ") or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -backup command where the string specified with the --topic argument is part of the command name or first line. -

    Examples -

    The following example lists all backup commands that include the -word tape in their names or short descriptions: -

       % backup apropos tape
    -   labeltape: label a tape
    -   readlabel: read the label on tape
    -   scantape: dump information recovery from tape
    -   status: get tape coordinator status
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    backup -

    backup help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf066.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf066.htm deleted file mode 100755 index edf53975b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf066.htm +++ /dev/null @@ -1,124 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup dbverify

    - - - -

    Purpose -

    Checks the integrity of the Backup Database -

    Synopsis -

    backup dbverify [-detail]  [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup db [-d]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup dbverify command checks the integrity of the Backup -Database. The command's output indicates whether the Backup -Database is damaged (data is corrupted) or not. If the Backup Database -is undamaged, it is safe to continue using it. If it is corrupted, -discontinue any backup operations until it is repaired. -

    Cautions -

    While this command runs, no other backup operation can access the Backup -Database; the other commands do not run until this command -completes. Avoid issuing this command when other backup operations are -likely to run. The backup savedb command repairs some types -of corruption. -

    Options -

    -

    -detail -
    Reports the number of orphaned blocks found, any inconsistencies, and the -name of the server machine running the Backup Server that is checking its copy -of the database. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The command displays one of the following two messages: -

    -

    Database OK -
    The database is undamaged and can be used. -

    Database not OK -
    The database is damaged. You can use the backup savedb -command to repair many kinds of corruption as it creates a backup copy. -For more detailed instructions, see the AFS Administration Guide -chapter about performing backup operations. -
    -

    The -detail flag provides additional information: -

      -

    • The number of orphan blocks found. These are ranges of -memory that the Backup Server preallocated in the database but cannot -use. Orphan blocks do not interfere with database access, but do waste -disk space. To free the unusable space, dump the database to tape by -using the backup savedb command, and then restore it by using the -backup restoredb command. -

    • Any inconsistencies in the database, such as invalid hostnames for Tape -Coordinator machines. -

    • The name of the database server machine on which the Backup Database was -checked, designated as the Database checker. For a detailed -trace of the verification operation, see the -/usr/afs/logs/BackupLog file on the indicated machine. You -can use the bos getlog command to display it. -
    -

    Examples -

    The following command confirms that the Backup Database is undamaged: -

       % backup dbverify
    -   Database OK
    -   
    -
    -

    The following command confirms that the Backup Database is undamaged and -that it has no orphan blocks or invalid Tape Coordinator entries. The -Backup Server running on the machine db1.abc.com -checked its copy of the Database. -

       % backup dbverify -detail
    -   Database OK
    -   Orphan blocks 0
    -   Database checker was db1.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BackupLog -

    bos getlog -

    backup -

    backup restoredb -

    backup savedb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf067.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf067.htm deleted file mode 100755 index d3c39967a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf067.htm +++ /dev/null @@ -1,82 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup deldump

    - - - - - - - - -

    Purpose -

    Deletes a dump level from the Backup Database -

    Synopsis -

    backup deldump -dump <dump level name>  [-localauth]  
    -               [-cell <cell name>]  [-help]
    -   
    -backup deld -d <dump level name>  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup deldump command deletes the indicated dump level and -all of its child dump levels from the dump hierarchy in the Backup -Database. Use the backup listdumps command to display the -dump hierarchy. -

    Options -

    -

    -dump -
    Specifies the complete pathname of the dump level to delete. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command deletes the dump level /sunday1/monday1 -from the dump hierarchy, along with any of its child dump levels. -

       % backup deldump /sunday1/monday1
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup adddump -

    backup listdumps -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf068.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf068.htm deleted file mode 100755 index 29c39bc93..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf068.htm +++ /dev/null @@ -1,183 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup deletedump

    - - - - - -

    Purpose -

    Deletes one or more dump records from the Backup Database -

    Synopsis -

    backup deletedump [-dumpid <dump id>+]  [-from <date time>+]  [-to <date time>+]
    -                  [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup dele [-d <dump id>+]  [-f <date time>+]  [-t <date time>+]
    -            [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup deletedump command deletes one or more dump records -from the Backup Database. Either use the -dumpid argument to -specify the dump ID number of one or more dumps, or use the -from -and -to arguments to delete the records for all regular dumps -created during the time period bracketed by the specified values. -

    Use this command to remove dump records that are incorrect (possibly -because a dump operation was interrupted or failed), or that correspond to -dumps that are expired or otherwise no longer needed. -

    Cautions -

    The only way to remove the dump record for an appended dump is to remove -the record for its initial dump, and doing so removes the records for all of -the initial dump's associated appended dumps. -

    The only way to remove the record for a Backup Database dump (created with -the backup savedb command) is to specify its dump ID number with -the -dumpid argument. Using the -from and --to arguments never removes database dump records. -

    Removing records of a dump makes it impossible to restore data from the -corresponding tapes or from any dump that refers to the deleted dump as its -parent, directly or indirectly. That is, restore operations must begin -with the full dump and continue with each incremental dump in order. If -the records for a specific dump are removed, it is not possible to restore -data from later incremental dumps unless the deleted records are restored by -running the backup scantape command with the -dbadd -flag. -

    If a dump set contains any dumps that were created outside the time range -specified by the -from and -to arguments, the command -does not delete any of the records associated with the dump set, even if some -of them represent dumps created during the time range. -

    Options -

    -

    -dumpid -
    Specifies the dump ID of each dump record to delete. The -corresponding dumps must be initial dumps; it is not possible to delete -appended dump records directly, but only by deleting the record of their -associated initial dump. Using this argument is the only way to delete -records of Backup Database dumps (created with the backup savedb -command). -

    Provide either this argument or the -to (and optionally --from) argument. -

    -from -
    Specifies the beginning of a range of dates; the record for any dump -created during the indicated period of time is deleted. -

    Omit this argument to indicate the default of midnight (00:00 hours) -on 1 January 1970 (UNIX time zero), or provide a date value in the format -mm/dd/yyyy [hh:MM]. The month (mm), -day (dd), and year (yyyy) are required. The hour and -minutes (hh:MM) are optional, but if provided must be -in 24-hour format (for example, the value 14:36 represents -2:36 p.m.). If omitted, the time defaults to -midnight (00:00 hours). -

    The -to argument must be provided along with this one. -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
    -

    -to -
    Specifies the end of a range of dates; the record of any dump created -during the range is deleted from the Backup Database. -

    Provide either the value NOW to indicate the current date and -time, or a date value in the same format as for the -from -argument. Valid values for the year (yyyy) range from -1970 to 2037; higher values are not valid because -the latest possible date in the standard UNIX representation is in February -2038. The command interpreter automatically reduces any later date to -the maximum value. -

    If the time portion (hh:MM) is omitted, it defaults to 59 -seconds after midnight (00:00:59 hours). Similarly, the -backup command interpreter automatically adds 59 seconds to any -time value provided. In both cases, adding 59 seconds compensates for -how the Backup Database and backup dumpinfo command represent dump -creation times in hours and minutes only. For example, the Database -records a creation timestamp of 20:55 for any dump operation -that begins between 20:55:00 and 20:55:59. -Automatically adding 59 seconds to a time thus includes the records for all -dumps created during that minute. -

    Provide either this argument, or the -dumpid argument. -This argument is required if the -from argument is provided. -

    Caution: Specifying the value NOW for this -argument when the -from argument is omitted deletes all dump -records from the Backup Database (except for Backup Database dump records -created with the backup savedb command). -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    At the conclusion of processing, the output lists the dump IDs of all dump -records deleted in the following format: -

       The following dumps were deleted:
    -        dump ID 1
    -        dump ID 2
    -        etc.
    -   
    -
    -

    Examples -

    The following command deletes the dump record with dump ID 653777462, and -for any appended dumps associated with it: -

       % backup deletedump -dumpid 653777462
    -   The following dumps were deleted:
    -        653777462
    -   
    -
    -

    The following command deletes the Backup Database record of all dumps -created between midnight on 1 January 1997 and 23:59:59 hours on -31 December 1997: -

       % backup deletedump -from 01/01/1997 -to 12/31/1997
    -   The following dumps were deleted:
    -        598324045
    -        598346873
    -           ...
    -           ...
    -        653777523
    -        653779648
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup dumpinfo -

    backup scantape -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf069.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf069.htm deleted file mode 100755 index 91ccef413..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf069.htm +++ /dev/null @@ -1,93 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup delhost

    - - - - - -

    Purpose -

    Deletes a Tape Coordinator entry from the Backup Database -

    Synopsis -

    backup delhost -tapehost <tape machine name> [-portoffset <TC port offset>]
    -               [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup delh -t <tape machine name>  [-p <TC port offset>]
    -            [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup delhost command deletes the indicated Tape -Coordinator entry from the Backup Database. It is then impossible to -submit backup operations to that Tape Coordinator, even if it is still -running. To keep configuration information consistent, also remove the -corresponding entry from the /usr/afs/backup/tapeconfig file on the -Tape Coordinator machine. -

    To list the Tape Coordinator machines and port offsets defined in the -Backup Database, issue the backup listhosts command. -

    Options -

    -

    -tapehost -
    Specifies the hostname of the machine housing the Tape Coordinator to -delete. -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator to delete. -If omitted, it defaults to 0. If provided, it is an integer -between 0 (zero) and 58510, and must match the port -offset number assigned to the same combination of Tape Coordinator and tape -device or file in the /usr/afs/backup/tapeconfig file on the Tape -Coordinator machine indicated by the -tapehost argument. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command deletes the Backup Database entry for the Tape -Coordinator with port offset 2 on the Tape Coordinator machine -backup3.abc.com: -

       % backup delhost -tapehost backup3.abc.com -portoffset 2
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addhost -

    backup listhosts -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf070.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf070.htm deleted file mode 100755 index 895e1e9ac..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf070.htm +++ /dev/null @@ -1,94 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup delvolentry

    - - - - - - -

    Purpose -

    Deletes a volume entry from a volume set -

    Synopsis -

    backup delvolentry -name <volume set name>  -entry <volume set index> 
    -                   [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup delvole  -n <volume set name>  -e <volume set index>
    -                [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup delvolentry command deletes the indicated volume -entry from the volume set specified with the -name argument. -Use the -entry argument to identify the volume entry by its index -number. To display the index numbers, use the backup -listvolsets command. -

    If there are any remaining volume entries with index numbers higher than -the deleted entry, their indexes are automatically decremented to eliminate -any gaps in the indexing sequence. -

    Cautions -

    Deleting volume entries from a temporary volume set is possible only within -the interactive session in which the volume set was created. -

    Options -

    -

    -name -
    Names the volume set from which to delete a volume entry. -

    -entry -
    Specifies the index number of the volume entry to delete. Use the -backup listvolsets command to display the index numbers for a -volume set's volume entries. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command deletes the fourth volume entry from the volume set -called sys: -

       % backup delvolentry -name sys -entry 4
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addvolentry -

    backup addvolset -

    backup delvolset -

    backup listvolsets -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf071.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf071.htm deleted file mode 100755 index b2704f736..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf071.htm +++ /dev/null @@ -1,86 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup delvolset

    - - - - - -

    Purpose -

    Deletes one or more volume sets from the Backup Database -

    Synopsis -

    backup delvolset -name <volume set name>+
    -                 [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup delvols -n <volume set name>+  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup delvolset command deletes each volume set named by -the -name argument, and the volume entries each contains, from the -Backup Database. The backup listvolsets command lists the -volume sets (and their volume entries) currently defined in the Backup -Database. -

    Cautions -

    Deleting a temporary volume set is possible only within the interactive -session in which it was created. Exiting the interactive session also -destroys the temporary volume set automatically. -

    Options -

    -

    -name -
    Names each volume set to delete. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command deletes the volume set called user and all -volume entries in it: -

       % backup delvolset user
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addvolentry -

    backup addvolset -

    backup delvolentry -

    backup listvolsets -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf072.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf072.htm deleted file mode 100755 index 54787e474..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf072.htm +++ /dev/null @@ -1,256 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup diskrestore

    - - - - - - -

    Purpose -

    Restores the entire contents of a partition -

    Synopsis -

    backup diskrestore -server <machine to restore> 
    -                   -partition <partition to restore>
    -                   [-portoffset <TC port offset>+]  
    -                   [-newserver <destination machine>]
    -                   [-newpartition <destination partition>]
    -                   [-extension <new volume name extension>]
    -                   [-n]  [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup di -s <machine to restore> -pa <partition to restore>
    -          [-po <TC port offset>+]  [-news <destination machine>]
    -          [-newp <destination partition>]  [-e <new volume name extension>]
    -          [-n]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup diskrestore command restores all of the volumes for -which the Volume Location Database (VLDB) lists a read/write site on the -partition specified with the -server and -partition -arguments. It is useful if a disk or machine failure corrupts or -destroys the data on an entire partition. (To restore any read-only or -backup volumes that resided on the partition, use the vos release -and vos backup commands, respectively, after restoring the -read/write version.) -

    If restoring only selected volumes to a single site, it is usually more -efficient to use the backup volrestore command. To restore -multiple volumes to many different sites, use the backup -volsetrestore command. -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file on the Tape -Coordinator machine associated with the specified port offset, then the Backup -System restores data from the backup data file listed for that port offset in -the Tape Coordinator's /usr/afs/backup/tapeconfig file, -instead of from tape. For the sake of clarity, the following text -refers to tapes only, but the Backup System handles backup data files in much -the same way.) -

    The Backup System determines whether the read/write or backup version of -each volume was dumped more recently, and restores the dumps of that version, -starting with the most recent full dump. It resets the creation -timestamp of each restored volume to the date and time at which it begins -restoring the volume (the creation timestamp appears in the -Creation field of the output from the vos examine and -vos listvol commands). -

    If all of the full and incremental dumps of all relevant volumes were not -written on compatible tape devices, use the -portoffset argument to -list multiple port offset numbers in the order in which the tapes are needed -(first list the port offset for the full dump, second the port offset for the -level 1 incremental dump, and so on). This implies that the full dumps -of all relevant volumes must have been written to a type of tape that the -first Tape Coordinator can read, the level 1 incremental dumps to a type of -tape the second Tape Coordinator can read, and so on. If dumps are on -multiple incompatible tape types, use the backup volrestore command -to restore individual volumes, or the backup volsetrestore command -after defining groups of volumes that were dumped to compatible tape -types. For further discussion, see the AFS Administration -Guide. -

    By default, the Backup System restores the contents of the specified -partition to that same partition. To restore the contents to an -alternate site, combine the following options as indicated. The Backup -System removes each volume from the original site, if it still exists, and -records the change of site in the VLDB. -

      -

    • To restore to a different partition on the same file server machine, -provide the -newpartition argument. -

    • To restore to the partition with the same name on a different file server -machine, provide the -newserver argument. -

    • To restore to a completely different site, combine the --newserver and -newpartition arguments. -
    -

    By default, the Backup System overwrites the contents of existing volumes -with the restored data. To create a new volume to house the restored -data instead, use the -extension argument. The Backup System -creates the new volume at the site designated by the -newserver and --newpartition arguments if they are used or the -server -and -partition arguments otherwise. It derives the volume -name by adding the extension to the read/write base name listed in the VLDB, -and creates a new VLDB entry. The command does not affect the existing -volume in any way. However, if a volume with the specified extension -also already exists, the command overwrites it. -

    To print out a list of the tapes containing the needed dumps, without -actually performing the restore operation, include the -n flag -along with the other options to be used on the actual command. -

    The Tape Coordinator's default response to this command is to access -the first tape it needs by invoking the MOUNT instruction in the -local CFG_device_name file, or by prompting the backup -operator to insert the tape if there is no MOUNT -instruction. However, if the AUTOQUERY NO instruction -appears in the CFG_device_name file, or if the issuer of -the butc command included the -noautoquery flag, the -Tape Coordinator instead expects the tape to be in the device already. -If it is not, or is the wrong tape, the Tape Coordinator invokes the -MOUNT instruction or prompts the operator. It also invokes -the MOUNT instruction or prompts for any additional tapes needed to -complete the restore operation; the backup operator must arrange to -provide them. -

    Cautions -

    If issuing this command to recover data after a disk crash or other damage, -be sure not to issue the vos syncserv command first. Doing -so destroys the VLDB record of the volumes that resided on the -partition. -

    Options -

    -

    -server -
    Names the file server machine that the VLDB lists as the site of the -volumes that need to be restored. -

    -partition -
    Names the partition that the VLDB lists as the site of the volumes that -need to be restored. -

    -portoffset -
    Specifies one or more port offset numbers (up to a maximum of 128), each -corresponding to a Tape Coordinator to use in the operation. If there -is more than one value, the Backup System uses the first one when restoring -the full dump of each volume, the second one when restoring the level 1 -incremental dump of each volume, and so on. It uses the final value in -the list when restoring dumps at the corresponding depth in the dump hierarchy -and at all lower levels. -

    Provide this argument unless the default value of 0 (zero) is appropriate -for all dumps. If 0 is just one of the values in the list, -provide it explicitly in the appropriate order. -

    -newserver -
    Names an alternate file server machine to which to restore the -volumes. If this argument is omitted, the volumes are restored to the -file server machine named by the -server argument. -

    -newpartition -
    Names an alternate partition to which to restore the data. If this -argument is omitted, the volumes are restored to the partition named by the --partition argument. -

    -extension -
    Creates a new volume for each volume being restored, to house the restored -data. The Backup System derives the new volume's name by appending -the specified string to the read/write base name listed in the VLDB, and -creates a new VLDB volume entry. The Backup System preserves the -contents of the volumes on the partition, if any still exist. Any -string other than .readonly or .backup is -acceptable, but the combination of the base name and extension cannot exceed -22 characters in length. To use a period to separate the extension from -the name, specify it as the first character of the string (as in -.rst, for example). -

    -n -
    Displays a list of the tapes necessary to perform the requested restore, -without actually performing the operation. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If a tape error occurs during the restore operation, the Tape Coordinator -displays the following messages: -

       Restore operation on volume name failed due to tape error
    -   Do you want to continue (y/n)?
    -   
    -
    -

    where name is the name of the volume that was being restored when -the tape error occurred. Enter the value y to continue the -operation without restoring the indicated volume or the value n to -terminate the operation. In the latter case, the operator can then -attempt to determine the cause of the tape error. -

    If the issuer includes the -n flag with the command, the -following string appears at the head of the list of the tapes necessary to -perform the restore operation: -

       Tapes needed:
    -   
    -
    -

    Examples -

    The following command restores the volumes for which the VLDB lists a -read/write site on the /vicepd partition of the machine -fs5.abc.com. The Tape Coordinator associated -with port offset 3 performs the operation. -

       % backup diskrestore -server fs5.abc.com -partition /vicepd -portoffset 3
    -   
    -
    -

    The following command restores the volumes for which the VLDB lists a -read/write site on the /vicepb partition of the machine -fs1.abc.com to a new site: the -/vicepa partition on the machine -fs3.abc.com. The Tape Coordinator associated -with port offset 0 performs the operation. (The command appears here on -two lines only for legibility.) -

       % backup diskrestore  -server fs1.abc.com -partition /vicepb   \
    -                         -newserver fs3.abc.com -newpartition /vicepa
    -   
    -
    -

    The following command lists the tapes required to restore the volumes for -which the VLDB lists a read/write site on the /vicepm partition of -the machine fs4.abc.com: -

       % backup diskrestore -server fs4.abc.com -partition /vicepm -n
    -   Tapes needed:
    -   user.sunday1.1
    -   user.sunday1.2
    -   user.monday1.1
    -   user.tuesday1.1
    -   user.wednesday1.1
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server or Volume Location (VL) Server is -running, and on every file server machine that houses an affected -volume. If the -localauth flag is included, the issuer must -instead be logged on to a server machine as the local superuser -root. -

    Related Information -

    backup -

    backup dump -

    backup volrestore -

    backup volsetrestore -

    butc -

    vos backup -

    vos examine -

    vos listvol -

    vos release -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf073.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf073.htm deleted file mode 100755 index ec1fc3faf..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf073.htm +++ /dev/null @@ -1,480 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup dump

    - - - - - - - - - - - - - - -

    Purpose -

    Creates a dump (dumps a volume set at a particular dump level) -

    Synopsis -

    backup dump [-volumeset <volume set name>]  [-dump <dump level name>]
    -            [-portoffset <TC port offset>]  [-at <Date/time to start dump>+]
    -            [-append]  [-n]  [-file <load file>]
    -            [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup dump [-v <volume set name>]  [-d <dump level name>]
    -            [-p <TC port offset>]  [-at <Date/time to start dump>+]
    -            [-ap]  [-n]  [-f <load file>]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup dump command either dumps the volume set specified by -the -volumeset argument at the dump level specified by the --dump argument and creates a Backup Database dump record about it, -or executes the dump instructions listed in the file named by the --file argument. The Tape Coordinator indicated by the --portoffset argument (or on each command in the file) executes the -operation. -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file on the Tape -Coordinator machine associated with the specified port offset, then the Backup -System dumps data to the backup data file listed for that port offset in the -Tape Coordinator's /usr/afs/backup/tapeconfig file, rather -than to tape. For the sake of clarity, the following text refers to -tapes only, but the Backup System handles backup data files in much the same -way.) -

    The term dumping refers to copying a collection of data to tape -or a backup data file, and the resulting collection is termed a -dump. The set of tapes that contain one or more dumps is -called a dump set. The first dump in a dump set is its -initial dump, and any dumps subsequently added to the dump set (by -use of the -append argument) are appended dumps. -Creating appended dumps is optional, and appended dumps can be of different -volume sets, and at different dump levels, than the initial dump. -

    A full dump, created at a full dump level in the dump hierarchy, -contains all of the data that existed at the time of the dump in the volumes -belonging to the volume set. An incremental dump, created at -an incremental dump level, contains only data that has changed since the -volume set was dumped at the incremental level's parent dump -level (the dump level immediately above the incremental level in the -hierarchy), which can be a full or incremental level. More -specifically, an incremental dump includes only the files and directories that -have modification timestamps later than the clone date of the -volume included at the parent dump level. For backup and read-only -volumes, the clone date is the time at which the volume was cloned from its -read/write source before being included in the parent dump; for -read/write volumes, it represents the time at which the volume was locked for -inclusion in the parent dump. The clone date appears in the clone -date field of the output from the backup volinfo -command. As an example, an incremental dump at the -/full/week1/thursday level includes only files and directories that -have changed since the volume set was dumped at the /full/week1 -level. -

    Initiating different types of dump operations -

    To initiate a dump operation that is to start as soon as the relevant Tape -Coordinator is available, provide only the -volumeset, --dump, -portoffset, and optionally -append -options. To schedule a single backup dump command to execute -in the future, also include the -at argument to specify the start -time. -

    To append a dump to an existing dump set, include the -append -flag. The Backup System imposes the following conditions on appended -dumps: -

      -

    • If writing to tape, the Tape Coordinator checks that it is the final one -in a dump set for which there are complete and valid tape and dump records in -the Backup Database. If not, it rejects the tape and requests an -acceptable one. The operator can use the -dbadd argument to -the backup scantape command to insert the necessary records into -the database. -

    • The most recent dump on the tape or in the backup data file must have -completed successfully. -

    • The dump set must begin with an initial dump that is recorded in the -Backup Database. If there are no dumps on the tape, then the Backup -System treats the dump operation as an initial dump and imposes the relevant -requirements (for example, checks the AFS tape name if appropriate). -
    -

    To schedule multiple dump operations, list the operations in the file named -by the -file argument. Optionally include the -at -argument to specify when the backup command interpreter reads the -file; otherwise it reads it immediately. Do not combine the --file argument with the command's first three arguments or the --append or -n flags. The commands in the file can -include any of the backup dump command's arguments, including -the -at argument to schedule them to run even later in the -future. -

    To generate a list of the volumes included in a dump, without actually -dumping them, combine the -n flag with the options to be used on -the actual command. -

    How the Backup System executes a dump operation -

    Before beginning a dump operation, the Backup System verifies that there is -a Backup Database entry for the volume set, dump level, and port -offset. If the command is correctly formed and issued in interactive -mode, it is assigned a job number and added to the jobs list. List jobs -in interactive mode by using the (backup) jobs command; -terminate them with the (backup) kill command. -

    After obtaining the list of volumes to dump from the Volume Location (VL) -Server, the Backup System sorts the list by site (server and -partition). It groups volumes from the same site together in the dump -to minimize the number of times the operator must change tapes during restore -operations. -

    The dependence of an incremental dump on its parent means that a valid -parent dump must already exist for the Backup System to create its child -incremental dump. If the Backup System does not find a record of a dump -created at the immediate parent dump level, it looks in the Backup Database -for a dump created at one level higher in the hierarchy, and so on, up to the -full dump level if necessary. It creates an incremental dump at the -level one below the lowest valid parent dump set that it finds. If it -fails to find even a full dump, it dumps the volume set at the full dump -level. -

    If the Backup System is unable to access a volume during a dump operation, -it skips the volume and dumps the remaining volumes from the volume -set. Possible reasons a volume is inaccessible include server machine -or process outages, or that the volume was moved between the time the Volume -Location (VL) Server generated the list of sites for the volume in the volume -set and the time the Backup System actually attempts to dump the data in -it. After the first dumping pass, the Backup System attempts to dump -each volume it skipped. If it still cannot dump a volume and the -ASK NO instruction does not appear in the -CFG_device_name file, it queries the operator as to -whether it needs to attempt to dump the volume again, omit the volume from the -dump, or halt the dump operation altogether. When prompted, the -operator can attempt to solve whatever problem prevented the Backup System -from accessing the volumes. If the ASK NO instruction -appears in the CFG_device_name file, the Backup System -omits the volume from the dump. -

    Before scheduling a dump operation, the Backup System verifies that the -date specified by the -at argument is in the future, and checks the -validity of the volume set, dump level and port offset as for a regular dump -operation. It checks the validity of the parameters again just before -actually running the scheduled operation. -

    Before writing an initial dump to a tape that does not have a permanent -name on the label, the Backup System checks that the AFS tape name on the -label is acceptable. If desired, disable name checking by including the -NAME_CHECK NO instruction in the -CFG_device_name file. -

    If AFS tape name checking is enabled, the Backup System accepts the -following three types of values for the AFS tape name. If the name on -the label does not conform, the Backup System obtains a tape with an -acceptable label by invoking the MOUNT instruction in the -CFG_device_name file or prompting the operator. -

      -

    1. A name of the form -volume_set_name.dump_level_name.tape_index, where -volume_set_name matches the value of the -volumeset -argument, dump_level_name matches the last element in the pathname -value of the -dump argument, and tape_index reflects the -tape's place in a multitape dump set. As an example, the first -tape in a dump set for which the initial dump is of volume set user -at the dump level /sunday2/monday has AFS tape name -user.monday.1. If the label records this type -of AFS tape name, the Backup System retains the AFS tape name and writes the -dump to the tape. -

    2. The string <NULL>, which usually indicates that a backup -operator has used the backup labeltape command to write a label on -the tape, but did not include the -name argument to assign an AFS -tape name. Presumably, the operator did include the -pname -argument to assign a permanent name. If the label records a -<NULL> value, the Backup System constructs and records on the -label the appropriate AFS tape name, and writes the dump on the tape. -

    3. No value at all, because the tape has never been labeled or used in the -Backup System. As when the AFS tape name is <NULL>, the -Backup System constructs and records on the label the appropriate AFS tape -name, and writes the dump on the tape. -
    -

    To determine how much data it can write to a tape, the Tape Coordinator -reads the capacity recorded on the tape's label (placed there by -including the -size argument to the backup labeltape -command). If the label's capacity field is empty, the Tape -Coordinator uses the capacity recorded for the specified port offset in the -local tapeconfig file. If the capacity field in the -tapeconfig file is also empty, the Tape Coordinator uses the -maximum capacity of 2 TB. -

    During a dump operation, the Tape Coordinator tracks how much data it has -written and stops shortly before it reaches what it believes is the -tape's capacity. If it is in the middle of writing the data for a -volume when it reaches that point, it writes a special marker that indicates -an interrupted volume and continues writing the volume on the next -tape. It can split a volume this way during both an initial and an -appended dump, and the fact that the volume resides on multiple tapes is -automatically recorded in the Backup Database. -

    If the tape is actually larger than the expected capacity, then the Tape -Coordinator simply does not use the excess tape. If the tape is smaller -than the expected capacity, the Tape Coordinator can reach the end-of-tape -(EOT) unexpectedly while it is writing data. If the Tape Coordinator is -in the middle of the writing data from a volume, it obtains a new tape and -rewrites the entire contents of the interrupted volume to it. The data -from the volume that was written to the previous tape remains there, but is -never used. -

    The Backup System allows recycling of tapes (writing a new dump set over an -old dump set that is no longer needed), but imposes the following -conditions: -

      -

    • All dumps in the old dump set must be expired. The Backup System -always checks expiration dates, even when name checking is disabled. -

    • If the tape to be recycled does not have a permanent name and name -checking is enabled, then the AFS tape name derived from the new initial -dump's volume set name and dump level name must match the AFS tape name -already recorded on the label. -

    • The tape cannot already have data on it that belongs to the dump currently -being performed, because that implies that the operator or automated tape -device has not removed the previous tape from the drive, or has mistakenly -reinserted it. The Tape Coordinator generates the following message and -attempts to obtain another tape: -
         Can't overwrite tape containing the dump in progress
      -   
      -
      -

    • The tape cannot contain data from a parent dump of the current -(incremental) dump, because overwriting a parent dump makes it impossible to -restore data from the current dump. The Tape Coordinator generates the -following message and attempts to obtain another tape: -
         Can't overwrite the parent dump parent_name (parent_dump_ID)
      -   
      -
      -
    -

    To recycle a tape before all dumps on it have expired or if the AFS tape -name is wrong, use the backup labeltape command to overwrite the -tape's label and remove all associated tape and dump records from the -Backup Database. -

    The Tape Coordinator's default response to this command is to access -the first tape by invoking the MOUNT instruction in the -CFG_device_name file, or by prompting the backup operator -to insert the tape if there is no MOUNT instruction. -However, if the AUTOQUERY NO instruction appears in the -CFG_device_name file, or if the issuer of the -butc command included the -noautoquery flag, the Tape -Coordinator instead expects the tape to be in the device already. If it -is not, the Tape Coordinator invokes the MOUNT instruction or -prompts the operator. It also invokes the MOUNT instruction -or prompts for any additional tapes needed to complete the dump -operation; the issuer must arrange to provide them. -

    Cautions -

    If a dump operation is interrupted or fails for any reason, data from all -volumes written to tape before the interrupt are valid can be used in a -restore operation. The Backup Database includes an entry for the failed -dump and for each volume that was successfully dumped. See the AFS -Administration Guide for information on dealing with interrupted -dumps. -

    If dumping to tape rather than a backup data file, it is best to use only -compatible tape devices (ones that can read the same type of tape). -Using compatible devices greatly simplifies restore operations. The --portoffset argument to the backup diskrestore and -backup volsetrestore commands accepts multiple port offset numbers, -but the Backup System uses the first listed port offset when restoring all -full dumps, the second port offset when restoring all level 1 dumps, and so -on. At the very least, use compatible tape devices to perform dumps at -each level. If compatible tape devices are not used, the backup -volrestore command must be used to restore one volume at a time. -

    Valid (unexpired) administrative tokens must be available to the -backup command interpreter both when it reads the file named by the --file argument and when it runs each operation listed in the -file. Presumably, the issuer is scheduling dumps for times when no -human operator is present, and so must arrange for valid tokens to be -available on the local machine. One option is to issue all commands (or -run all scripts) on file server machines and use the -localauth -flag on the backup and vos commands. To protect -against improper access to the machine or the tokens, the machine must be -physically secure (perhaps even more protected than a Tape Coordinator machine -monitored by a human operator during operation). Also, if an unattended -dump requires multiple tapes, the operator must properly configure a tape -stacker or jukebox and the device configuration file. -

    When the command is issued in regular (non-interactive) mode, the command -shell prompt does not return until the dump operation completes. To -avoid having to open additional connections, issue the command in interactive -mode, especially when including the -at argument to schedule dump -operations. -

    Options -

    -

    -volumeset -
    Names the volume set to dump. The -dump argument must be -provided along with this one; do not combine them with the --file argument. If using a temporary volume set, the -vos dump command must be issued within the interactive session in -which the backup addvolset command was issued with the --temporary flag. -

    -dump -
    Specifies the complete pathname of the dump level at which to dump the -volume set. The -volumeset argument must be provided along -with this one; do not combine them with the -file -argument. -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator handling the -tapes for this operation. It must be provided unless the default value -of 0 (zero) is appropriate; do not combine it with the -file -argument. -

    -at -
    Specifies the date and time in the future at which to run the command, or -to read the file named by the -file argument. Provide a -value in the format mm/dd/yyyy [hh:MM], where the -month (mm), day (dd), and year (yyyy) are -required. Valid values for the year range from 1970 to -2037; higher values are not valid because the latest possible -date in the standard UNIX representation is in February 2038. The -Backup System automatically reduces any later date to the maximum -value. -

    The hour and minutes (hh:MM) are optional, but if provided -must be in 24-hour format (for example, the value 14:36 -represents 2:36 p.m.). If omitted, the time -defaults to midnight (00:00 hours). -

    As an example, the value 04/23/1999 20:20 schedules the -command for 8:20 p.m. on 23 April 1999. -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
    -

    -append -
    Appends the dump onto the end of a tape that already contains data from -another dump. However, if the tape is not in fact part of an existing -dump set, the Backup System creates a new dump set using the parameters of -this dump. If the tape is not the last tape in the dump set, the Tape -Coordinator prompts for insertion of the appropriate tape. Do not -combine this argument with the -file argument. -

    -n -
    Displays the names of volumes to be included in the indicated dump, -without actually performing the dump operation. Do not combine this -argument with the -file argument. -

    -file -
    Specifies the local disk or AFS pathname of a file containing -backup commands. The Backup System reads the file -immediately, or at the time specified by the -at argument if it is -provided. A partial pathname is interpreted relative to the current -working directory. -

    Place each backup dump command on its own line in the indicated -file, using the same syntax as for the command line, but without the word -backup at the start of the line. Each command must include a -value for the -volumeset and -dump arguments, and for -the -portoffset argument unless the default value of 0 is -appropriate. Commands in the file can also include any of the -backup dump command's optional options. In the -following example file, the first command runs as soon as the Backup System -reads the file, whereas the other commands are themselves scheduled; the -specified date and time must be later than the date and time at which the -Backup System reads the file. -

       dump user /sunday1/wednesday -port 1 
    -   dump sun4x_56 /sunday1/friday -port 2 -at 04/08/1999
    -   dump sun4x_55 /sunday1/friday -port 2 -at 04/08/1999 02:00 -append
    -   
    -
    -

    -

    Do not combine this argument with the -volumeset, --dump, -portoffset, -append, or -n -options. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The command interpreter first generates a list of the volumes to be -included in the dump by matching the entries in the volume set against the -volumes listed in the Volume Location Database (VLDB). It prints the -list following the header: -

       Preparing to dump the following volumes:
    -   
    -
    -

    The following message then indicates that the command interpreter has -passed the dump request to the appropriate Tape Coordinator for -processing: -

       Starting dump.
    -   
    -
    -

    If the issuer includes the -n flag, the output is of the -following form: -

       Starting dump of volume set 'volume set' (dump set 'dump level')
    -   Total number of volumes : number dumped
    -   Would have dumped the following volumes:
    -   list_of_volumes
    -   
    -
    -

    where list_of_volumes identifies each volume by name and volume ID -number. -

    If the Tape Coordinator is unable to access a volume, it prints an error -message in its window and records the error in its log and error files. -

    Examples -

    The following command dumps the volumes in the volume set called -user at the dump level /full/sunday2/monday. The -issuer places the necessary tapes in the device with port offset 5. -

       % backup dump -volumeset user -dump /full/sunday2/monday -portoffset 5
    -   Preparing to dump the following volumes:
    -   user.jones.backup   387623900
    -   user.pat.backup     486219245
    -   user.smith.backup   597315841
    -          .                .
    -          .                .
    -   Starting dump.
    -   
    -
    -

    The following command displays the list of volumes to be dumped when the -user dumps the sys_sun volume set at the /full dump -level. -

       % backup dump -volumeset sys_sun -dump /full -n
    -   Starting dump of volume set 'sys_sun' (dump set '/full')
    -   Total number of volumes: 24
    -   Would have dumped the following volumes:
    -   sun4x_56      124857238
    -   sun4x_56.bin  124857241
    -       .            .
    -       .            .
    -   sun4x_55      124857997
    -       .            .
    -       .            .
    -   
    -
    -

    The following command schedules a dump of the volumes in the volume set -user at the dump level /sunday2/monday1 for 11:00 -p.m. on 14 June 1999. The appropriate Tape Coordinator -has port offset 0 (zero), so that argument is omitted. -

       % backup dump -volumeset user -dump /sunday2/monday1 -at 06/14/1999 23:00
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server or Volume Location (VL) Server is -running, and on every file server machine that houses an affected -volume. If the -localauth flag is included, the issuer must -instead be logged on to a server machine as the local superuser -root. -

    Related Information -

    backup -

    backup adddump -

    backup addvolentry -

    backup addvolset -

    backup diskrestore -

    backup labeltape -

    backup volrestore -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf074.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf074.htm deleted file mode 100755 index 110cdc779..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf074.htm +++ /dev/null @@ -1,329 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup dumpinfo

    - - - - - - - - -

    Purpose -

    Displays a dump record from the Backup Database -

    Synopsis -

    backup dumpinfo [-ndumps <no. of dumps>]  [-id <dump id>]
    -                [-verbose]  [-localauth]  [-cell <cell name>]  [-help ]
    -   
    -backup dumpi [-n <no. of dumps>]  [-i <dump id>]
    -             [-v]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup dumpinfo command formats and displays the Backup -Database record for the specified dumps. To specify how many of the -most recent dumps to display, starting with the newest one and going back in -time, use the -ndumps argument. To display more detailed -information about a single dump, use the -id argument. To -display the records for the 10 most recent dumps, omit both the --ndumps and -id arguments. -

    The -verbose flag produces very detailed information that is -useful mostly for debugging purposes. It can be combined only with the --id argument. -

    Options -

    -

    -ndumps -
    Displays the Backup Database record for each of the specified number of -dumps that were most recently performed. If the database contains fewer -dumps than are requested, the output includes the records for all existing -dumps. Do not combine this argument with the -id or --verbose options; omit all options to display the records for -the last 10 dumps. -

    -id -
    Specifies the dump ID number of a single dump for which to display the -Backup Database record. Precede the dump id value with the --id switch; otherwise, the command interpreter interprets it -as the value of the -ndumps argument. Combine this argument -with the -verbose flag, but not with the -ndumps -argument; omit all options to display the records for the last 10 -dumps. -

    -verbose -
    Provides more detailed information about the dump specified with the --id argument, which must be provided along with it. Do not -combine this flag with the -ndumps argument. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the -ndumps argument is provided, the output presents the -following information in table form, with a separate line for each dump: -

    -

    dumpid -
    The dump ID number. -

    parentid -
    The dump ID number of the dump's parent dump. A value of -0 (zero) identifies a full dump. -

    lv -
    The depth in the dump hierarchy of the dump level used to create the -dump. A value of 0 (zero) identifies a full dump, in which -case the value in the parentid field is also 0. A -value of 1 or greater indicates an incremental dump made at the -corresponding level in the dump hierarchy. -

    created -
    The date and time at which the Backup System started the dump operation -that created the dump. -

    nt -
    The number of tapes that contain the data in the dump. A value of -0 (zero) indicates that the dump operation was terminated or -failed. Use the backup deletedump command to remove such -entries. -

    nvols -
    The number of volumes from which the dump includes data. If a -volume spans tapes, it is counted twice. A value of 0 (zero) -indicates that the dump operation was terminated or failed; the value in -the nt field is also 0 in this case. -

    dump name -
    The dump name in the form -
       volume_set_name.dump_level_name (initial_dump_ID)
    -   
    -
    -

    -

    where volume_set_name is the name of the volume set, and -dump_level_name is the last element in the dump level pathname at -which the volume set was dumped. -

    The initial_dump_ID, if displayed, is the dump ID of the initial -dump in the dump set to which this dump belongs. If there is no value -in parentheses, the dump is the initial dump in a dump set that has no -appended dumps. -

    -

    If the -id argument is provided alone, the first line of output -begins with the string Dump and reports information for the entire -dump in the following fields: -

    -

    id -
    The dump ID number. -

    level -
    The depth in the dump hierarchy of the dump level used to create the -dump. A value of 0 (zero) identifies a full dump. A -value of 1 (one) or greater indicates an incremental dump made at -the specified level in the dump hierarchy. -

    volumes -
    The number of volumes for which the dump includes data. -

    created -
    The date and time at which the dump operation began. -
    -

    Following a blank line, the output includes an entry for each tape that -houses volume data from the dump. Following the string Tape, -the first two lines of each entry report information about that tape in the -following fields: -

    -

    name -
    The tape's permanent name if it has one, or its AFS tape name -otherwise, and its tape ID number in parentheses. -

    nVolumes -
    The number of volumes for which this tape includes dump data. -

    created -
    The date and time at which the Tape Coordinator began writing data to this -tape. -
    -

    Following another blank line, the tape-specific information concludes with -a table that includes a line for each volume dump on the tape. The -information appears in columns with the following headings: -

    -

    Pos -
    The relative position of each volume in this tape or file. On a -tape, the counter begins at position 2 (the tape label occupies position 1), -and increments by one for each volume. For volumes in a backup data -file, the position numbers start with 1 and do not usually increment only by -one, because each is the ordinal of the 16 KB offset in the file at which the -volume's data begins. The difference between the position numbers -therefore indicates how many 16 KB blocks each volume's data -occupies. For example, if the second volume is at position 5 and the -third volume in the list is at position 9, that means that the dump of the -second volume occupies 64 KB (four 16-KB blocks) of space in the file. -

    Clone time -
    For a backup or read-only volume, the time at which it was cloned from its -read/write source. For a Read/Write volume, it is the same as the dump -creation date reported on the first line of the output. -

    Nbytes -
    The number of bytes of data in the dump of the volume. -

    Volume -
    The volume name, complete with .backup or -.readonly extension if appropriate. -
    -

    If both the -id argument and the -verbose flag are -specified, the output is divided into several sections: -

      -

    • The first section, headed by the underlined string Dump, -includes information about the entire dump. The fields labeled -id, level, created, and nVolumes -report the same values (though in a different order) as appear on the first -line of output when the -id argument is provided by itself. -Other fields of potential interest to the backup operator are: -
      -

      maxTapes -
      The number of tapes that contain the dump set to which this dump -belongs. -

      Start Tape Seq -
      The ordinal of the tape on which this dump begins in the set of tapes that -contain the dump set. -
      -

    • For each tape that contains data from this dump, there follows a section -headed by the underlined string Tape. The fields labeled -name, written, and nVolumes report the same -values (though in a different order) as appear on the second and third lines -of output when the -id argument is provided by itself. Other -fields of potential interest to the backup operator are: -
      -

      expires -
      The date and time when this tape can be recycled, because all dumps it -contains have expired. -

      nMBytes Data and nBytes Data -
      Summed together, these fields represent the total amount of dumped data -actually from volumes (as opposed to labels, filemarks, and other -markers). -

      KBytes Tape Used -
      The number of kilobytes of tape (or disk space, for a backup data file) -used to store the dump data. It is generally larger than the sum of the -values in the nMBytes Data and nBytes Data fields, -because it includes the space required for the label, file marks and other -markers, and because the Backup System writes data at 16 KB offsets, even if -the data in a given block doesn't fill the entire 16 KB. -
      -

    • For each volume on a given tape, there follows a section headed by the -underlined string Volume. The fields labeled -name, position, clone, and nBytes -report the same values (though in a different order) as appear in the table -that lists the volumes in each tape when the -id argument is -provided by itself. Other fields of potential interest to the backup -operator are: -
      -

      id -
      The volume ID. -

      tape -
      The name of the tape containing this volume data. -
      -
    -

    Examples -

    The following example displays information about the last five dumps: -

       % backup dumpinfo -ndumps 5
    -      dumpid   parentid lv created          nt nvols dump name
    -   924424000          0 0  04/18/1999 04:26  1    22 usr.sun (924424000)
    -   924685000  924424000 1  04/21/1999 04:56  1    62 usr.wed (924424000)
    -   924773000  924424000 1  04/22/1999 05:23  1    46 usr.thu (924424000)
    -   924860000  924424000 1  04/23/1999 05:33  1    58 usr.fri (924424000)
    -   925033000          0 0  04/25/1999 05:36  2    73 sys.week
    -   
    -
    -

    The following example displays a more detailed record for a single -dump. -

       % backup dumpinfo -id 922097346
    -   Dump: id 922097346, level 0, volumes 1, created Mon Mar 22 05:09:06 1999
    -   Tape: name monday.user.backup (922097346)
    -   nVolumes 1, created 03/22/1999 05:09
    -    Pos       Clone time   Nbytes Volume
    -      1 03/22/1999 04:43 27787914 user.pat.backup
    -   
    -
    -

    The following example displays even more detailed information about the -dump displayed in the previous example (dump ID 922097346). This -example includes only one exemplar of each type of section (Dump, -Tape, and Volume): -

       % backup dumpinfo -id 922097346 -verbose
    -   Dump
    -   ----
    -   id = 922097346
    -   Initial id = 0
    -   Appended id = 922099568
    -   parent = 0
    -   level = 0
    -   flags = 0x0
    -   volumeSet = user
    -   dump path = /monday1
    -   name = user.monday1
    -   created = Mon Mar 22 05:09:06 1999
    -   nVolumes = 1
    -   id  = 0
    -   tapeServer =
    -   format= user.monday1.%d
    -   maxTapes = 1
    -   Start Tape Seq = 1
    -   name = pat
    -   instance =
    -   cell =
    -   Tape
    -   ----
    -   tape name = monday.user.backup
    -   AFS tape name = user.monday1.1
    -   flags = 0x20
    -   written = Mon Mar 22 05:09:06 1999
    -   expires = NEVER
    -   kBytes Tape Used = 121
    -   nMBytes Data = 0
    -   nBytes  Data = 19092
    -   nFiles = 0
    -   nVolumes = 1
    -   seq = 1
    -   tapeid = 0
    -   useCount = 1
    -   dump = 922097346
    -   Volume
    -   ------
    -   name = user.pat.backup
    -   flags = 0x18
    -   id = 536871640
    -   server =
    -   partition = 0
    -   nFrags = 1
    -   position = 2
    -   clone = Mon Mar 22 04:43:06 1999
    -   startByte = 0
    -   nBytes = 19092
    -   seq = 0
    -   dump = 922097346
    -   tape = user.monday1.1
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup deletedump -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf075.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf075.htm deleted file mode 100755 index 42cda033a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf075.htm +++ /dev/null @@ -1,86 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup help

    - - - -

    Purpose -

    Displays the syntax of specified backup commands or lists -functional descriptions of all backup commands -

    Synopsis -

    backup help  [-topic <help string>+]  [-help]
    -  
    -backup h [-t <help string>+]  [-h]
    -
    -

    Description -

    The backup help command displays the complete online help entry -(short description and syntax statement) for each operation code specified by -the -topic argument. If the -topic argument is -omitted, the output includes the first line (name and short description) of -the online help entry for every backup command. -

    To list every backup command whose name or short description -includes a specified keyword, use the backup apropos -command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the backup part of the command name, providing -only the operation code (for example, specify dump, not backup -dump). If this argument is omitted, the output briefly describes -every backup command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each backup command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following example displays the online help entry for the backup -dump command: -

       % backup help dump
    -   backup dump: start dump
    -   Usage: backup dump -volumeset <volume set name> -dump <dump level name> 
    -   [-portoffset <TC port offset>]  [-at <Date/time to start dump>+] 
    -   [-append]  [-n]  [-file <load file>]  [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    backup -

    backup apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf076.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf076.htm deleted file mode 100755 index 99c2e4f3e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf076.htm +++ /dev/null @@ -1,109 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup interactive

    - - - - - -

    Purpose -

    Enters interactive mode -

    Synopsis -

    -

    backup [interactive]  [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup [i]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup interactive initiates an interactive session for -issuing backup commands. As indicated in the syntax -statement, the operation code (interactive) is optional. -

    Several features of interactive mode distinguish it from regular -mode: -

      -

    • In interactive mode, the backup> prompt replaces the system -(shell) prompt. The operator enters only a command's operation -code (omitting the command suite name, backup). -

    • If the -localauth flag or the -cell argument is -included on the backup (interactive) command, the settings apply to -all commands issued during that interactive session. The issuer does -not need to type them on every command. Another consequence is that the -flag and argument do not appear in the syntax statement generated by the -help subcommand or -help flag on an individual command -issued at the backup> prompt. -

    • The (backup) jobs and (backup) kill commands are -available only in interactive mode. It is not possible to track and -terminate backup operations as cleanly in non-interactive mode. -

    • It is not necessary to enclose strings that include metacharacters in -double quotes or other delimiters. -

    • The backup command interpreter establishes a connection to the -Backup Server, Volume Server and Volume Location (VL) Server processes as it -enters interactive mode, and uses the same connection for all commands during -the session. Execution time can therefore be faster than in -non-interactive mode, in which the command interpreter must establish a new -connection for each command. -
    -

    To exit an interactive session, issue the (backup) quit -command. -

    Options -

    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example shows how the -localauth flag and --cell argument do not appear when the help dump -subcommand is issued in interactive mode. -

       % backup
    -   backup> help dump
    -   dump: start dump 
    -   Usage: dump [-volumeset <volume set name>] [-dump <dump level name>] 
    -   [-portoffset <TC port offset>] [-at <Date/time to start dump>+]
    -   [-append ] [-n ] [-file <load file>] [-help ] 
    -   
    -
    -

    Privilege Required -

    None. However, backup commands that require privilege in -regular mode still require it in interactive mode. -

    Related Information -

    backup -

    backup jobs -

    backup kill -

    backup quit -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf077.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf077.htm deleted file mode 100755 index 7daa01401..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf077.htm +++ /dev/null @@ -1,176 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup jobs

    - - - - - - - -

    Purpose -

    Lists pending and running operations in interactive mode -

    Synopsis -

    jobs  [-help]
    -  
    -j [-h]
    -
    -

    Description -

    The (backup) jobs command lists the job ID number and status of -each backup operation running or pending in the current interactive -session. -

    This command can be issued in interactive mode only. If the issuer -of the backup (interactive) command included the --localauth flag, the -cell argument, or both, those -settings apply to this command also. -

    To terminate operations that appear in the output, issue the (backup) -kill command and identify the operation to cancel with the job ID number -from this command's output. -

    To check the status of a Tape Coordinator, rather than of a certain -operation, use the backup status command. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output always includes the expiration date and time of the tokens that -the backup command interpreter is using during the current -interactive session, in the following format: -

       date   time: TOKEN EXPIRATION
    -
    -

    If the execution date and time specified for a scheduled dump operation is -later than date time, then its individual line (as described in the -following paragraphs) appears below this line to indicate that the current -tokens will not be available to it. -

    If the issuer of the backup command included the --localauth flag when entering interactive mode, the line instead -reads as follows: -

       :  TOKEN NEVER EXPIRES
    -
    -

    The entry for a scheduled dump operation has the following format: -

       Job job_ID:  timestamp:  dump  volume_set  dump_level
    -
    -

    where -

    -

    job_ID -
    Is a job identification number assigned by the Backup System. -

    timestamp -
    Indicates the date and time the dump operation is to begin, in the format -month/date/year -hours:minutes (in 24-hour format) -

    volume_set -
    Indicates the volume set to dump. -

    dump_level -
    Indicates the dump level at which to perform the dump operation. -
    -

    The line for a pending or running operation of any other type has the -following format: -

       Job job_ID:  operation  status
    -
    -

    where -

    -

    job_ID -
    Is a job identification number assigned by the Backup System. -

    operation -
    Identifies the operation the Tape Coordinator is performing, which is -initiated by the indicated command: -
    -

    Dump (dump name) -
    Initiated by the backup dump command. The dump -name has the following format: -

    volume_set_name.dump_level_name -

    Restore -
    Initiated by the backup diskrestore, backup -volrestore, or backup volsetrestore command. -

    Labeltape (tape_label) -
    Initiated by the backup labeltape command. The -tape_label is the name specified by the backup labeltape -command's -name or -pname argument. -

    Scantape -
    Initiated by the backup scantape command. -

    SaveDb -
    Initiated by the backup savedb command. -

    RestoreDb -
    Initiated by the backup restoredb command. -
    -

    status -
    Indicates the job's current status in one of the following -messages. If no message appears, the job is either still pending or has -finished. -
    -

    number Kbytes, volume volume_name -
    For a running dump operation, indicates the number of kilobytes copied to -tape or a backup data file so far, and the volume currently being -dumped. -

    number Kbytes, restore.volume -
    For a running restore operation, indicates the number of kilobytes copied -into AFS from a tape or a backup data file so far. -

    [abort requested] -
    The (backup) kill command was issued, but the termination -signal has yet to reach the Tape Coordinator. -

    [abort sent] -
    The operation is canceled by the (backup) kill command. -Once the Backup System removes an operation from the queue or stops it from -running, it no longer appears at all in the output from the command. -

    [butc contact lost] -
    The backup command interpreter cannot reach the Tape -Coordinator. The message can mean either that the Tape Coordinator -handling the operation was terminated or failed while the operation was -running, or that the connection to the Tape Coordinator timed out. -

    [done] -
    The Tape Coordinator has finished the operation. -

    [drive wait] -
    The operation is waiting for the specified tape drive to become -free. -

    [operator wait] -
    The Tape Coordinator is waiting for the backup operator to insert a tape -in the drive. -
    -
    -

    Examples -

    The following example shows that two restore operations and one dump -operation are running (presumably on different Tape Coordinators) and that the -backup command interpreter's tokens expire on 22 April 1999 at -10:45 am: -

       backup> jobs
    -   Job 1: Restore, 1306 Kbytes, restore.volume
    -   Job 2: Dump (user.sunday1), 34 Kbytes, volume user.pat.backup
    -   Job 3: Restore, 2498 Kbytes, restore.volume
    -          04/22/1999 10:45: TOKEN EXPIRATION
    -   
    -
    -

    Privilege Required -

    None. However, queuing any operation requires privilege, and it is -possible to issue this command only within the interactive session in which -the jobs are queued. -

    Related Information -

    backup -

    backup interactive -

    backup kill -

    backup quit -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf078.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf078.htm deleted file mode 100755 index 83d3432a6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf078.htm +++ /dev/null @@ -1,139 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup kill

    - - - - - - -

    Purpose -

    Terminates a pending or running operation -

    Synopsis -

    kill -id <job ID or dump set name> [-help]
    -  
    -k -i <job ID or dump set name>  [-h]
    -
    -

    Description -

    The (backup) kill command dequeues a Backup System operation -that is pending, or terminates an operation that is running, in the current -interactive session. It is available only in interactive mode. -If the issuer of the backup (interactive) command included the --localauth flag, the -cell argument, or both, then those -settings apply to this command also. -

    To terminate a dump operation, specify either the dump name -(volume_set_name.dump_level_name) or its job ID -number, which appears in the output from the (backup) jobs -command. To terminate any other type of operation, provide the job ID -number. -

    The effect of terminating an operation depends on the type and current -state of the operation: -

      -

    • If an operation is still pending, the Tape Coordinator removes it from the -queue with no other lasting effects. -

    • If the Tape Coordinator is unable to process the termination signal before -an operation completes, it simply confirms the operation's -completion. The operator must take the action necessary to undo the -effects of the incorrect operation. -

    • If a tape labeling operation is running, the effect depends on when the -Tape Coordinator receives the termination signal. The labeling -operation is atomic, so it either completes or does not begin at all. -Use the backup readlabel command to determine if the labeling -operation completed, and reissue the backup labeltape command to -overwrite the incorrect label if necessary. -

    • If a tape scanning operation is running, it terminates with no other -effects unless the -dbadd flag was included on the -backup command. In that case, the Backup System possibly has -already written new Backup Database records to represent dumps on the scanned -tape. If planning to restart the scanning operation, first locate and -remove the records created during the terminated operation: a repeated -backup scantape operation exits automatically when it finds that a -record that it needs to create already exists. -

    • If a dump operation is running, all of the volumes written to the tape or -backup data file before the termination signal is received are complete and -usable. If the operation is restarted, the Backup System performs all -the dumps again from scratch, and assigns a new dump ID number. If -writing the new dumps to the same tape or file, the operator must relabel it -first if the interrupted dump is not expired. If writing the new dump -to a different tape or file, the operator can remove the dump record -associated with the interrupted dump to free up space in the database. -

    • If a restore operation is running, completely restored volumes are online -and usable. However, it is unlikely that many volumes are completely -restored, given that complete restoration usually requires data from multiple -tapes. If the termination signal comes before the Backup System has -accessed all of the necessary tapes, each volume is only partially written and -is never brought online. It is best to restart the restore operation -from scratch to avoid possible inconsistencies. See also the -Cautions section. -
    -

    Cautions -

    It is best not to issue the (backup) kill command against -restore operations. If the termination signal interrupts a restore -operation as the Backup System is overwriting an existing volume, it is -possible to lose the volume entirely (that is, to lose both the contents of -the volume as it was before the restore and any data that was restored before -the termination signal arrived). The data being restored still exists -on the tape, but some data can be lost permanently. -

    Options -

    -

    -id -
    Identifies the backup operation to terminate. Provide one of two -types of values: -
      -

    • The operation's job ID number, as displayed in the output of the -(backup) jobs command. -

    • For a dump operation, either the job ID number or a dump name of the form -volume_set_name.dump_level_name, where -volume_set_name is the name of the volume set being dumped and -dump_level_name is the last element in the dump level pathname at -which the volume set is being dumped. The dump name appears in the -output of the (backup) jobs command along with the job ID -number. -
    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command terminates the operation with job ID 5: -

       backup> kill 5
    -   
    -
    -

    The following command terminates the dump operation called -user.sunday1: -

       backup> kill user.sunday1
    -   
    -
    -

    Privilege Required -

    The issuer must have the privilege required to initiate the operation being -cancelled. Because this command can be issued only within the -interactive session during which the operation was initiated, the required -privilege is essentially guaranteed. -

    Related Information -

    backup -

    backup interactive -

    backup jobs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf079.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf079.htm deleted file mode 100755 index fb02594c4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf079.htm +++ /dev/null @@ -1,224 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup labeltape

    - - - - - - - - - - - - -

    Purpose -

    Creates the magnetic label on a tape -

    Synopsis -

    backup labeltape [-name <AFS tape name, defaults to NULL>]
    -                 [-size <tape size in Kbytes, defaults to size in tapeconfig>]
    -                 [-portoffset <TC port offset>] 
    -                 [-pname <permanent tape name>] 
    -                 [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup la [-n <AFS tape name, defaults to NULL>]
    -          [-s <tape size in Kbytes, defaults to size in tapeconfig>]
    -          [-po <TC port offset>]  [-pn <permanent tape name>]
    -          [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup labeltape command creates a magnetic label, readable -by the Backup System, at the beginning of a tape. The label records the -tape's name (either a permanent name, or an AFS tape -name that reflects the tape's contents in a prescribed format) and -its capacity. -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file on the Tape -Coordinator machine associated with the specified port offset, then the -backup command writes label information to the first 16 KB block in -the backup data file listed for that port offset in the Tape -Coordinator's /usr/afs/backup/tapeconfig file, rather than at -the beginning of a tape. For the sake of clarity, the following text -refers to tapes only, but the Backup System handles backup data files in much -the same way.) -

    Relabeling a tape that already contains AFS backup data effectively makes -the data unusable, because the command removes the Backup Database record of -the complete dump set of which the tape is a part. Use this command to -enable recycling of a tape that contains unexpired dumps that are not actually -still needed. -

    To write a permanent name on the label, include the -pname -argument to specify a string of up to 32 characters. The permanent name -persists until the -pname argument is again included on the -backup labeltape command, regardless of the tape's contents -and of how often the tape is otherwise relabeled or recycled. Include -this argument or the -name argument, but not both. If this -argument is included, the AFS tape name is set to <NULL>. -The permanent name is set to <NULL> if this argument is omitted -and no permanent name already exists. -

    The issuer must ensure that a permanent name is unique among the tapes used -for AFS backup in the cell, because the backup command interpreter -does not verify that another tape does not already have the same permanent -name. When a tape has a permanent name, the Backup System uses it -instead of the AFS tape name in most prompts and when referring to the tape in -output from backup commands. The permanent name appears in -the tape name field of the output from the backup -readlabel command. -

    To write an AFS tape name on the label, provide a value for the --name argument in the required format described in the -Options section. Include the -name argument or -the -pname argument, but not both. If this argument is -omitted, the AFS tape name is set to <NULL>, but the Backup -System automatically assigns the appropriate name when the tape is used in a -future backup dump or backup savedb operation. -The AFS tape name appears in the AFS tape -name field of the output from the backup readlabel and -backup scantape commands. -

    The backup command interpreter does not accept the --name argument if the tape already has a permanent name. To -erase a tape's permanent name, provide a null value to the --pname argument by issuing the following command: -

       % backup labeltape -pname ""
    -   
    -
    -

    To record the tape's capacity on the label, specify a number of -kilobytes as the -size argument. If the argument is omitted -the first time a tape is labeled, the Backup System records the default tape -capacity recorded for the specified port offset in the -/usr/afs/backup/tapeconfig file on the Tape Coordinator -machine. Subsequently, the value in the size field persists until the --size argument is again included on the backup labeltape -command. -

    To determine how much data can be written to a tape during a backup -dump or backup savedb operation, the Tape Coordinator reads -the capacity recorded on the tape's label (or uses the value associated -with its port offset in the /usr/afs/backup/tapeconfig file, if the -tape was never labeled). For further description, see the backup -dump reference page. -

    The Tape Coordinator's default response to this command is to access -the tape by invoking the MOUNT instruction in the local -/usr/afs/backup/CFG_device_name file, or by prompting the -backup operator to insert the tape if there is no MOUNT -instruction. However, if the AUTOQUERY NO instruction -appears in the CFG_device_name file, or if the issuer of -the butc command included the -noautoquery flag, the -Tape Coordinator instead expects the tape to be in the device already. -If it is not, the Tape Coordinator invokes the MOUNT instruction or -prompts the operator. -

    Options -

    -

    -name -
    Specifies the AFS tape name to record on the label. Include this -argument or the -pname argument, but not both. If this -argument is omitted, the AFS tape name is set to <NULL>. -If this argument is provided, it must have the following format: -
       volume_set_name.dump_level_name.tape_index
    -   
    -
    -

    for the tape to be acceptable for use in a future backup dump -operation. The volume_set_name must match the volume set name -of the initial dump to be written to the tape, dump_level_name must -match the last element of the dump level pathname at which the volume set will -be dumped, and tape_index indicates the order of the tape in the dump -set (indexing begins with 1). To disable this type of name -checking, include the NAME_CHECK NO instruction in the -CFG_device_name file. -

    For the tape to be acceptable for use in a future backup savedb -operation, the value specified for the -name argument must have the -following format: -

       Ubik_db_dump.tape_index
    -   
    -
    -

    where tape_index indicates the order of the tape in the set of -tapes that house the Backup Database dump; indexing begins with 1 -(one). -

    -size -
    Specifies the tape capacity to record on the label. Provide an -integer value followed by a letter that indicates units, with no intervening -space. A unit value of k or K indicates -kilobytes, m or M indicates megabytes, and g -or G indicates gigabytes. If the units letter is omitted, -the default is kilobytes. -

    If this argument is omitted the first time a tape is labeled, the Backup -System records the capacity that is associated with the specified port offset -in the /usr/afs/backup/tapeconfig file on the Tape Coordinator -machine. The value recorded the first time then persists until the --size argument is provided on a future issuance of the -command. -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator handling the tape -for this operation. -

    -pname -
    Specifies the permanent name to record on the label. It can be up -to 32 characters in length, and include any alphanumeric characters. -Avoid metacharacters that have a special meaning to the shell, to avoid having -to mark them as literal in commands issued at the shell prompt. -

    Include this argument or the -name argument, but not -both. If this argument is provided, the AFS tape name is set to -<NULL>. If this argument is omitted, any existing -permanent name is retained. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command records the AFS tape name -user.monthly.1 on the label of the tape in the device -with port offset 3: -

       % backup labeltape -name user.monthly.1 -portoffset 3
    -   
    -
    -

    The following three commands are equivalent in effect: they all -record a capacity of 2 GB on the label of the tape in the device with port -offset 4. They set the AFS tape name to <NULL> and leave -the permanent name unchanged. -

       % backup labeltape -size 2g -portoffset 4
    -   % backup labeltape -size 2048M -portoffset 4
    -   % backup labeltape -size 2097152 -portoffset 4
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    CFG_device_name -

    backup -

    backup readlabel -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf080.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf080.htm deleted file mode 100755 index aa9bfbe1f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf080.htm +++ /dev/null @@ -1,138 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup listdumps

    -

    Purpose - - - - - - - - -

    Displays the dump hierarchy from the Backup Database -

    Synopsis -

    backup listdumps  [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup listd  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup listdumps command displays the dump hierarchy from -the Backup Database. -

    Options -

    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output displays the complete dump hierarchy and indicates the -relationship between full and incremental dump levels. Full dump levels -appear at the left margin. The hierarchy can include more than one full -dump level; each one defines a subhierarchy of dump levels that can be -used for dumping different volume sets. -

    Incremental dump levels appear below and indented to the right of their -parent dump levels, which can be either full or incremental. Since -multiple incremental dump levels can share the same parent, an incremental -dump level is not always directly below its parent; the amount of -indentation indicates the parent/child relationship. -

    If a dump level has an associated expiration date, it appears along with -the level name. Absolute expiration dates appear in the format -

       dump_level expires at day month date time year    
    -   
    -
    -

    and relative expiration dates in the format -

       dump_level expires in {yearsy | monthsm | daysd}
    -   
    -
    -

    to indicate the number of years, months, days, or combination of the three -after creation a dump expires when created at this level. -

    Examples -

    The following example depicts six dump hierarchies. The expiration -date for all incremental dump levels is 13 days so that the corresponding -tapes can be recycled two weeks after their creation. The expiration -dates for all full dump levels is 27 days so that the corresponding tapes can -be recycled four weeks after their creation. -

       % backup listdumps
    -   /week1  expires in  27d
    -         /tuesday  expires in  13d
    -                 /thursday  expires in  13d
    -         /sunday  expires in  13d
    -                /tuesday expires in  13d
    -                        /thursday expires in  13d
    -   /week3  expires in  27d
    -         /tuesday  expires in  13d
    -                 /thursday  expires in  13d
    -         /sunday  expires in  13d
    -                /tuesday  expires in  13d
    -                        /thursday  expires in  13d
    -   /sunday1  expires in  27d
    -           /monday1  expires in  13d
    -           /tuesday1  expires in  13d 
    -           /wednesday1  expires in  13d
    -           /thursday1  expires in  13d
    -           /friday1  expires in  13d
    -   /sunday2  expires in  27d
    -           /monday2  expires in  13d
    -           /tuesday2  expires in  13d
    -           /wednesday2  expires in  13d
    -           /thursday2  expires in  13d
    -           /friday2  expires in  13d
    -   /sunday3  expires in  27d
    -           /monday1  expires in  13d
    -           /tuesday1  expires in  13d 
    -           /wednesday1  expires in  13d
    -           /thursday1  expires in  13d
    -           /friday1  expires in  13d
    -   /sunday4  expires in  27d
    -           /monday2  expires in  13d
    -           /tuesday2  expires in  13d
    -           /wednesday2  expires in  13d
    -           /thursday2  expires in  13d
    -           /friday2  expires in  13d
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup adddump -

    backup deldump -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf081.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf081.htm deleted file mode 100755 index d26927bdb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf081.htm +++ /dev/null @@ -1,101 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup listhosts

    -

    Purpose - - - - - - - - - -

    Lists Tape Coordinator machines registered in the Backup Database -

    Synopsis -

    backup listhosts [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup listh [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup listhosts command displays the Backup Database record -of the port offset numbers defined for Tape Coordinator machines. A -Tape Coordinator must have an entry in the list to be available for backup -operations. -

    The existence of an entry does not necessarily indicate that the Tape -Coordinator process (butc) is currently running at that port -offset. To check, issue the backup status command. -

    Options -

    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    After a Tape hosts: header, the output reports -two things about each Tape Coordinator currently defined in the Backup -Database: -

      -

    • The hostname of the machine housing the Tape Coordinator. The -format of this name depends on the hostname format used when the backup -addhost command was issued. -

    • The Tape Coordinator's port offset number. -
    -

    The Tape Coordinators appear in the order in which they were added to the -Backup Database. -

    Examples -

    The following example shows the result of the command in the ABC -Corporation cell: -

       % backup listhosts
    -   Tape hosts:
    -       Host backup1.abc.com, port offset 0
    -       Host backup1.abc.com, port offset 1
    -       Host backup3.abc.com, port offset 4
    -       Host backup2.abc.com, port offset 3
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addhost -

    backup delhost -

    backup status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf082.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf082.htm deleted file mode 100755 index 27c790f06..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf082.htm +++ /dev/null @@ -1,103 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup listvolsets

    - - - - - - -

    Purpose -

    Lists volume set entries from the Backup Database -

    Synopsis -

    backup listvolsets [-name <volume set name>]
    -                   [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup listv [-n <volume set name>]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup listvolsets command displays the Backup Database -records for either -

      -

    • All volume sets and their volume entries, if the -name argument -is omitted -

    • The volume set specified by the -name argument, along with its -volume entries -
    -

    Options -

    -

    -name -
    Names the volume set to display. If this argument is omitted, the -output lists all volume sets defined in the Backup Database. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The entry for each volume set begins with the Volume set header -and the volume set's name. A temporary volume set's name is -followed by the string (temporary). Each volume entry -follows on a separate line, indicating the entry's index number and the -server, partition, and volume names it matches. The output uses the -metacharacter notation described on the backup addvolentry -reference page. Use the index number to identify volume entries when -deleting them with the backup delvolentry command. -

    Examples -

    The following example shows the volume entries in the three volume sets -currently defined in the Backup Database: -

       % backup listvolsets
    -   Volume set user:
    -       Entry   1: server .*, partition .*, volumes: user.*\.backup
    -   Volume set sun
    -       Entry   1: server .*, partition .*, volumes: sun4x_55\..*
    -       Entry   2: server .*, partition .*, volumes: sun4x_56\..*
    -   Volume set rs
    -       Entry   1: server .*, partition .*, volumes: rs_aix42\..*
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup addvolentry -

    backup addvolset -

    backup delvolentry -

    backup delvolset -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf083.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf083.htm deleted file mode 100755 index aa5b421ce..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf083.htm +++ /dev/null @@ -1,83 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup quit

    - - - - - - -

    Purpose -

    Leaves interactive mode -

    Synopsis -

    quit  [-help]
    -  
    -q [-h]
    -   
    -
    -

    Description -

    The (backup) quit command exits interactive mode, returning the -issuer to the regular shell prompt at which the backup or -backup interactive command was issued to enter interactive -mode. The command has no effect when issued outside interactive -mode. Issuing the <Ctrl-d> command also exits interactive -mode. -

    Cautions -

    To exit interactive mode, all jobs must be completed. Use the -(backup) jobs command to list any jobs currently pending or -executing, and the (backup) kill command to terminate them as -necessary. -

    Options -

    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command exits interactive mode: -

       backup> quit
    -   %
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    backup -

    backup interactive -

    backup jobs -

    backup kill -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf084.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf084.htm deleted file mode 100755 index c2b7be7fc..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf084.htm +++ /dev/null @@ -1,216 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup readlabel

    - - - - - - - - -

    Purpose -

    Reads and displays a tape's label -

    Synopsis -

    backup readlabel [-portoffset <TC port offset>]
    -                 [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup rea [-p <TC port offset>]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup readlabel command displays information from the -magnetic tape label of a tape. The information includes the tape's -name (either a permanent name, or an AFS tape name that -reflects the tape's contents in a prescribed format) and its -capacity. -

    If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file associated with the -specified port offset, then the backup readlabel command reads the -label information from the first 16 KB block in the backup data file listed -for that port offset in the Tape Coordinator's -/usr/afs/backup/tapeconfig file, rather than from the beginning of -a tape. -

    The Tape Coordinator's default response to this command is to access -the tape by invoking the MOUNT instruction in the local -/usr/afs/backup/CFG_device_name file, or by prompting the -backup operator to insert the tape if there is no MOUNT -instruction. However, if the AUTOQUERY NO instruction -appears in the CFG_device_name file, or if the issuer of -the butc command included the -noautoquery flag, the -Tape Coordinator instead expects the tape to be in the device already. -If it is not, the Tape Coordinator invokes the MOUNT instruction or -prompts the operator. -

    Options -

    -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator handling the -tapes for this operation. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    Output from this command appears in both the shell window where the command -is issued, and in the Tape Coordinator window. -

    If the tape is unlabeled or if the specified tape device is empty, the -output reads -

       Failed to read tape label.
    -   
    -
    -

    Otherwise, the output in the shell window has the following format: -

       Tape read was labelled: tape name (dump id)
    -        size: size Kbytes
    -    
    -
    -

    where tape name is the permanent name if the tape has one, or the -AFS tape name otherwise. The dump ID is dump ID of the initial -dump on the tape, and size is the recorded capacity of the tape in -kilobytes. -

    The output in the Tape Coordinator windows is bounded by an underlined -Tape label header at the top, and the following string -at the bottom: -

       -- End of tape label --
    -   
    -
    -

    In between are lines reporting the following information: -

    -

    tape name -
    The permanent name assigned by using the -pname argument of the -backup labeltape command. This name remains on the tape -until that argument is used again, no matter how many times the tape is -recycled or otherwise relabeled. If the tape does not have a permanent -name, the value <NULL> appears in this field. -

    AFS tape name -
    A tape name in one of the following prescribed formats. The Backup -System automatically writes the appropriate AFS tape name to the label as part -of a backup dump or backup savedb operation, or the -operator can assign it with the -name argument to the backup -labeltape command. -
      -

    • volume_set_name.dump_level_name.tape_index, -if the tape contains volume data. The volume_set_name is the -name of the volume set that was dumped to create the initial dump in the dump -set of to which this tape belongs; dump_level_name is the last -pathname element of the dump level at which the initial dump was backed -up; and tape_index is the numerical position of the tape in the -dump set. -

    • Ubik.db.dump.tape_index if the -tape contains a dump of the Backup Database, created with the backup -savedb command. The tape_index is the ordinal of the -tape in the dump set. -

    • <NULL> if the tape has no AFS tape name. This is -normally the case if the -name argument was not included the last -time the backup labeltape command was used on this tape, and no -data has been written to it since. -
    -

    creationTime -
    The date and time at which the Backup System started performing the dump -operation that created the initial dump. -

    cell -
    The cell in which the dump set was created. This is the cell whose -Backup Database contains a record of the dump set. -

    size -
    The tape's capacity (in kilobytes) as recorded on the label, rather -than the amount of data on the tape. The value is assigned by the --size argument to the backup labeltape command or -derived from the /usr/afs/backup/tapeconfig file on the Tape -Coordinator machine, not from a measurement of the tape. -

    dump path -
    The dump level of the initial dump in the dump set -

    dump id -
    The dump ID number of the initial dump in the dump set, as recorded in the -Backup Database -

    useCount -
    The number of times a dump has been written to the tape, or it has been -relabeled -
    -

    The message ReadLabel: Finished indicates the completion -of the output. -

    Examples -

    The following example shows the output for the tape with permanent name -oct.guest.dump and capacity 2 MB, expressed in -kilobyte units (2097152 equals 2 times 10242). -

       % backup readlabel -portoffset 6
    -   Tape read was labelled: oct.guest.dump (907215000)
    -        size: 2097152 Kbytes
    -   
    -
    -

    The output in the Tape Coordinator window reads: -

       Tape label
    -   ----------
    -   tape name = oct.guest.dump
    -   AFS tape name = guests.monthly.3
    -   creationTime = Thu Oct 1 00:10:00 1998
    -   cell = abc.com
    -   size = 2097152 Kbytes
    -   dump path = /monthly
    -   dump id = 907215000
    -   useCount = 5
    -   ---- End of tape label ----
    -   
    -
    -

    The following example is for a tape that does not have a permanent -tape. -

       % backup readlabel -portoffset 6
    -   Tape read was labelled: guests.monthly.2 (909899900)
    -        size: 2097152 Kbytes
    -   
    -
    -

    The output in the Tape Coordinator window reads: -

       Tape label
    -   ----------
    -   tape name = <NULL>
    -   AFS tape name = guests.monthly.2
    -   creationTime = Sun Nov 1 00:58:20 1998
    -   cell = abc.com
    -   size = 2097152 Kbytes
    -   dump path = /monthly
    -   dump id = 909899900
    -   useCount = 1
    -   ---- End of tape label ----
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup labeltape -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf085.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf085.htm deleted file mode 100755 index e29e9d0cc..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf085.htm +++ /dev/null @@ -1,117 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup restoredb

    - - - -

    Purpose -

    Restores a saved copy of the Backup Database -

    Synopsis -

    backup restoredb [-portoffset <TC port offset>]
    -                 [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup res [-p <TC port offset>]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup restoredb command restores to the Backup Server -machine's local disk a version of the Backup Database previously written -to tape by using the backup savedb command. -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file associated with the -specified port offset, then the backup restoredb command restores -data from the backup data file listed for that port offset in the Tape -Coordinator's /usr/afs/backup/tapeconfig file, instead of from -tape. For the sake of clarity, the following text refers to tapes only, -but the Backup System handles backup data files in much the same way.) -

    The most common reason to run this command is to replace a corrupted or -otherwise damaged Backup Database; use the backup dbverify -command to determine the database's status. The command can also -be used to restore records that were removed from the database when the --archive argument was included on a previous backup -savedb command. -

    The command completely overwrites the existing Backup Database records for -volume sets, Tape Coordinators, and the dump hierarchy with the corresponding -information from the saved version. It does not overwrite existing dump -records, but instead interleaves the records from the copy being -restored. If both the existing database (on the Backup Server -machine's disk) and the copy being restored include a record about the -same dump, the Backup System retains the one in the existing database. -

    The Tape Coordinator's default response to this command is to access -the first tape it needs by invoking the MOUNT instruction in the -local /usr/afs/backup/CFG_device_name file, or by -prompting the backup operator to insert the tape if there is no -MOUNT instruction. However, if the AUTOQUERY NO -instruction appears in the CFG_device_name file, or if the -issuer of the butc command included the -noautoquery -flag, the Tape Coordinator instead expects the tape to be in the device -already. If it is not, or is the wrong tape, the Tape Coordinator -invokes the MOUNT instruction or prompts the operator. It -also invokes the MOUNT instruction or prompts for any additional -tapes needed to complete the restore operation; the backup operator must -arrange to provide them. -

    Cautions -

    If the database is corrupted, do not attempt to restore a saved database on -top of it. Instead, use the instructions for repairing a corrupted -database in the AFS Administration Guide chapter about performing -backup operations. -

    Options -

    -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator handling the -tapes for this operation. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example shows the Backup Database being restored from the -Tape Coordinator with port offset 0: -

       % backup restoredb
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup dbverify -

    backup savedb -

    butc -

    AFS Administration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf086.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf086.htm deleted file mode 100755 index 5be2d495d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf086.htm +++ /dev/null @@ -1,151 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup savedb

    - - - -

    Purpose -

    Creates a saved copy of the Backup Database -

    Synopsis -

    backup savedb [-portoffset <TC port offset>]  [-archive <date time>+]
    -              [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup sa  [-p <TC port offset>]  [-a <date time>+]
    -           [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup savedb command creates a backup copy of the entire -Backup Database and writes it to the tape in the device controlled by the Tape -Coordinator indicated with the -portoffset argument. If the -database is damaged (as reported by the backup dbverify command), -this command repairs as much of the corruption as possible as it creates the -saved copy. The Backup Server creates a dump record for the saved -database in the Backup Database (but in the disk version of the database only, -not in the version written to tape). -

    If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file associated with the -specified port offset, then the backup savedb command dumps the -database copy to the backup data file listed for that port offset in the Tape -Coordinator's /usr/afs/backup/tapeconfig file, instead of to -tape. For the sake of clarity, the following text refers to tapes only, -but the Backup System handles backup data files in much the same way. -

    If the -archive flag is provided, after writing the saved copy -of the database the Backup System truncates the copy of the database on disk -by deleting volume dump records with timestamps prior to the specified date -and time (it does not delete the dump records created by previous backup -savedb commands, however). -

    If the tape to which the database copy is written has an AFS tape name, it -must be Ubik_db_dump.1 or <NULL>. Any -permanent name is acceptable. -

    The Tape Coordinator's default response to this command is to access -the first tape by invoking the MOUNT instruction in the local -/usr/afs/backup/CFG_device_name file, or by prompting the -backup operator to insert the tape if there is no MOUNT -instruction. However, if the AUTOQUERY NO instruction -appears in the CFG_device_name file, or if the issuer of -the butc command included the -noautoquery flag, the -Tape Coordinator instead expects the tape to be in the device already. -If it is not, the Tape Coordinator invokes the MOUNT instruction or -prompts the operator. It also invokes the MOUNT instruction -or prompts for any additional tapes needed to complete the operation; the -backup operator must arrange to provide them. -

    Options -

    -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator handling the -tapes for this operation. -

    -archive -
    Specifies a date and time; volume dump records with earlier -timestamps are deleted from the disk copy of the Backup Database after the -Backup System dumps the database (a dump's timestamp appears in the -created field of the output from the backup dumpinfo -command). However, if a dump set contains any dump created after the -specified date, none of the dump records associated with the dump set are -deleted. Dump records for previous dumps of the database (created with -the backup savedb command) are never deleted; use the -backup deletedump command to remove them. -

    Provide one of two values: -

      -

    • The string NOW to indicate the current date and time, in which -case the Backup System deletes all dump records except those for dumps of the -Backup Database itself. -

    • A date value in the format mm/dd/yyyy -[hh:MM]. The month (mm), day (dd), and -year (yyyy) are required, and valid values for the year range from -1970 to 2037; higher values are not valid because -the latest possible date in the standard UNIX representation is in February -2038. The Backup System automatically reduces any later date to the -maximum value. -

      The hour and minutes (hh:MM) are optional, but if -provided must be in 24-hour format (for example, the value -14:36 represents 2:36 p.m.). If -omitted, the time defaults to 59 seconds after midnight (00:00:59 -hours). Similarly, the backup command interpreter -automatically adds 59 seconds to any time value provided. In both -cases, adding 59 seconds compensates for how the Backup Database and -backup dumpinfo command represent dump creation times in hours and -minutes only. That is, the Database records a creation timestamp of -20:55 for any dump created between 20:55:00 and -20:55:59. Automatically adding 59 seconds to a time thus -includes the records for all dumps created during that minute. -

    -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example writes a copy of the Backup Database to the tape -device controlled by the Tape Coordinator with port offset 1: -

       % backup savedb -portoffset 1
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup dbverify -

    backup restoredb -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf087.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf087.htm deleted file mode 100755 index 22aaff509..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf087.htm +++ /dev/null @@ -1,292 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup scantape

    - - - - - - -

    Purpose -

    Extracts dump information from a tape -

    Synopsis -

    backup scantape [-dbadd]  [-portoffset <TC port offset>]
    -                [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup sc [-d]  [-p <TC port offset>]  [-l]  [-c <cell name>]  [-help]
    -
    -

    Description -

    The backup scantape command extracts information from the dump -labels and volume headers on the tape in the device controlled by the Tape -Coordinator indicated by the -portoffset argument. The Tape -Coordinator displays the information for each volume in its window as soon as -it extracts it (rather than waiting until it has scanned the entire -tape). -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file associated with the -specified port offset, then the backup scantape command extracts -dump information from the backup data file named in that port offset's -entry in the /usr/afs/backup/tapeconfig file on the Tape -Coordinator machine, rather than from a tape. For the sake of clarity, -the following text refers to tapes only, but the Backup System handles backup -data files in much the same way.) -

    If the -dbadd flag is provided, the backup scantape -command creates new dump and volume records in the Backup Database for the -scanned information. However, if it finds that a record already exists -in the database for the same dump, it terminates the scanning -operation. -

    The scanning operation works only on tapes containing volume data. -The command fails with an error message if the tape contains a copy of the -Backup Database (was created with the backup savedb command, or has -the AFS tape name Ubik_db_dump.1). -

    The Tape Coordinator's default response to this command is to access -the tape by invoking the MOUNT instruction in the -CFG_device_name file, or by prompting the backup operator -to insert the tape if there is no MOUNT instruction. -However, if the AUTOQUERY NO instruction appears in the -CFG_device_name file, or if the issuer of the -butc command included the -noautoquery flag, the Tape -Coordinator instead expects the tape to be in the device already. If it -is not, the Tape Coordinator invokes the MOUNT instruction or -prompts the operator. -

    To terminate a tape scanning operation in interactive mode, issue the -(backup) kill command. In noninteractive mode, the only -choice is to use a termination signal such as <Ctrl-c> to halt -the Tape Coordinator completely. -

    Cautions -

    A scanning operation does not have to begin with the first tape in a dump -set, but the Backup System can process tapes only in sequential order after -the initial tape provided. The Tape Coordinator automatically requests -any subsequent tapes by invoking the MOUNT instruction in the local -/usr/afs/backup/CFG_device_name file, or by prompting the -operator if there is no MOUNT instruction. -

    The Tape Coordinator's success in scanning a tape that is corrupted or -damaged depends on the extent of the damage and what type of data is -corrupted. It can almost always scan the tape successfully up to the -point of damage. If the damage is minor, the Tape Coordinator can -usually skip over it and scan the rest of the tape, but more major damage can -prevent further scanning. Because a scanning operation can start on any -tape in a dump set, damage on one tape does not prevent scanning of the others -in the dump set. However, it is possible to scan either the tapes that -precede the damaged one or the ones that follow it, but not both. -

    If a tape is relabeled with the backup labeltape command, it is -not possible to recover data from it for the purposes of rebuilding the Backup -Database. -

    If the -dbadd flag is included on the command, it is best not to -terminate the tape scanning operation before it completes (for example, by -issuing the (backup) kill command in interactive mode). The -Backup System writes a new record in the Backup Database for each dump as soon -as it scans the relevant information on the tape, and so it possibly has -already written new records. If the operator wants to rerun the -scanning operation, he or she must locate and remove the records created -during the terminated operation: the second operation exits -automatically if it finds that a record that it needs to create already -exists. -

    If the -dbadd flag is included and the first tape provided is -not the first tape in the dump set, the following restrictions apply: -

      -

    • If the first data on the tape is a continuation of a volume that begins on -the previous (unscanned) tape in the dump set, the Backup System does not add -a record for that volume to the Backup Database. -

    • The Backup System must read the marker that indicates the start of an -appended dump to add database records for the volumes in it. If the -first volume on the tape belongs to an appended dump, but is not immediately -preceded by the appended-dump marker, the Backup System does not create a -Backup Database record for it or any subsequent volumes that belong to that -appended dump. -
    -

    Options -

    -

    -dbadd -
    Adds the information extracted from the tape to the Backup Database (but -only if the database does not already contain an entry with the same dump ID -number). -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator handling the -tapes for this operation. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    For every dump on a tape, the backup scantape command displays -in the Tape Coordinator window the dump label and the volume header of each -volume in the dump. If a dump spans more than one tape, the dump label -does not repeat at the beginning of subsequent tapes. -

    A dump label contains the following fields, which are the same as in the -output from the backup readlabel command: -

    -

    tape name -
    The permanent name assigned by using the -pname argument of the -backup labeltape command. This name remains on the tape -until that argument is used again, no matter how many times the tape is -recycled or otherwise relabeled. If the tape does not have a permanent -name, the value <NULL> appears in this field. -

    AFS tape name -
    A tape name in one of the following prescribed formats. The Backup -System automatically writes the appropriate AFS tape name to the label as part -of a backup dump operation, or the operator can assign it with the --name argument to the backup labeltape command. -
      -

    • volume_set_name.dump_level_name.tape -_index, if the tape contains volume data. The -volume_set_name is the name of the volume set that was dumped to -create the initial dump in the dump set of which this tape is a part; -dump_level_name is the last pathname element of the dump level at -which the initial dump was backed up; and tape_index is the -numerical position of the tape in the dump set. -

    • <NULL> if the tape has no AFS tape name. This is -normally the case if the -name argument was not included the last -time the backup labeltape command was used on this tape, and no -data has been written to it since. -
    -

    creationTime -
    The date and time at which the Backup System started performing the dump -operation that created the initial dump. -

    cell -
    The cell in which the dump set was created. This is the cell whose -Backup Database contains a record of the dump set. -

    size -
    The tape's capacity (in kilobytes) as recorded on the label, rather -than the amount of data on the tape. The value is assigned by the --size argument to the backup labeltape command or -derived from the /usr/afs/backup/tapeconfig file on the Tape -Coordinator machine, not from a measurement of the tape. -

    dump path -
    The dump level of the initial dump in the dump set. -

    dump id -
    The dump ID number of the initial dump in the dump set, as recorded in the -Backup Database. -

    useCount -
    The number of times a dump has been written to the tape, or it has been -relabeled. -
    -

    The volume header contains the following fields: -

    -

    volume name -
    The volume name, complete with a .backup or -.readonly extension, if appropriate. -

    volume ID -
    The volume's volume ID. -

    dumpSetName -
    The dump to which the volume belongs. The dump name is of the form -volume_set_name.dump_level_name and -matches the name displayed in the dump label. -

    dumpID -
    The dump ID of the dump named in the dumpSetName field. -

    level -
    The depth in the dump hierarchy of the dump level used in creating the -dump. A value of 0 indicates a full dump. A value of -1 or greater indicates an incremental dump made at the indicated -depth in the hierarchy. The value reported is for the entire dump, not -necessarily for the volume itself; for example, it is possible for a dump -performed at an incremental level to include a full dump of an individual -volume if the volume was omitted from previous dumps. -

    parentID -
    The dump ID number of dumpSetName's parent dump. It -is 0 if the value in the level field is -0. -

    endTime -
    Is always 0; it is reserved for internal use. -

    cloneDate -
    The date and time at which the volume was created. For a backup or -read-only volume, this represents the time at which it was cloned from its -read/write source. For a read/write volume, it indicates the time at -which the Backup System locked the volume for purposes of including it in the -dump named in the dumpSetName field. -
    -

    The message Scantape: Finished indicates the completion of -the output. -

    In normal circumstances, the Backup System writes a marker to indicate that -a volume is the last one on a tape, or that the volume continues on the next -tape. However, if a backup operation terminated abnormally (for -example, because the operator terminated the Tape Coordinator by issuing the -<Ctrl-c> command during the operation), then there is no such -marker. Some very early versions of the Backup System also did not -write these markers. If a tape does not conclude with one of the -expected markers, the Tape Coordinator cannot determine if there is a -subsequent tape in the dump set and so generates the following message in its -window: -

       Are there more tapes? (y/n)
    -   
    -
    -

    Examples -

    The following example shows the output for the first two volumes on a tape -in the device with port offset 0: -

       % backup scantape
    -   Dump label
    -   ----------
    -   tape name = monthly_guest
    -   AFS tape name = guests.monthly.3
    -   creationTime =  Mon Feb  1 04:06:40 1999
    -   cell = abc.com
    -   size = 2150000 Kbytes
    -   dump path = /monthly
    -   dump id = 917860000
    -   useCount = 44
    -   -- End of dump label --
    -   -- volume --
    -   volume name: user.guest10.backup
    -   volume ID 1937573829
    -   dumpSetName: guests.monthly
    -   dumpID 917860000
    -   level 0
    -   parentID 0
    -   endTime 0
    -   clonedate Mon Feb  1 03:03:23 1999
    -   -- volume --
    -   volume name: user.guest11.backup
    -   volume ID 1938519386
    -   dumpSetName: guests.monthly
    -   dumpID 917860000
    -   level 0
    -   parentID 0
    -   endTime 0
    -   clonedate Mon Feb  1 03:05:15 1999
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup dump -

    backup dumpinfo -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf088.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf088.htm deleted file mode 100755 index 73f0447ba..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf088.htm +++ /dev/null @@ -1,160 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup setexp

    - - - - - - -

    Purpose -

    Sets the expiration date for existing dump levels. -

    Synopsis -

    backup setexp -dump <dump level name>+  [-expires <expiration date>+]
    -              [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup se -d <dump level name>+  [-e <expiration date>+]
    -          [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup setexp command sets or changes the expiration date -associated with each specified dump level, which must already exist in the -dump hierarchy. -

    Use the -expires argument to associate an expiration date with -each dump level. When the Backup System subsequently creates a dump at -the dump level, it uses the specified value to derive the dump's -expiration date, which it records on the label of the tape (or backup data -file). The Backup System refuses to overwrite a tape until after the -latest expiration date of any dump that the tape contains, unless the -backup labeltape command is used to relabel the tape. If a -dump level does not have an expiration date, the Backup System treats dumps -created at the level as expired as soon as it creates them. -

    (Note that the Backup System does not automatically remove a dump's -record from the Backup Database when the dump reaches its expiration date, but -only if the tape that contains the dump is recycled or relabeled. To -remove expired and other obsolete dump records, use the backup -deletedump command.) -

    Define either an absolute or relative expiration date: -

      -

    • An absolute expiration date defines the month/day/year (and, optionally, -hour and minutes) at which a dump expires. If the expiration date -predates the dump creation time, the Backup System immediately treats the dump -as expired. -

    • A relative date defines the number of years, months, or days (or a -combination of the three) after the dump's creation that it -expires. When the Backup System creates a dump at the dump level, it -calculates an actual expiration date by adding the relative date to the start -time of the dump operation. -
    -

    If the command is used to change an existing expiration date associated -with a dump level, the new date applies only to dumps created after the -change. Existing dumps retain the expiration date assigned at the time -they were created. -

    Options -

    -

    -dump -
    Specifies the full pathname of each dump level to assign the expiration -date specified by the -expires argument. -

    -expires -
    Defines the absolute or relative expiration date to associate with each -dump level named by the -dump argument. Absolute expiration -dates have the following format: -

    -

       [at] {NEVER | mm/dd/yyyy [hh:MM] }
    -   
    -
    -

    where the optional word at is followed either by the string -NEVER, which indicates that dumps created at the dump level never -expire, or by a date value with a required portion (mm for month, -dd for day, and yyyy for year) and an optional portion -(hh for hours and MM for minutes). -

    Omit the hh:MM portion to use the default of -midnight (00:00 hours), or provide a value in 24-hour format (for -example, 20:30 is 8:30 p.m.). -Valid values for the year range from 1970 to 2037; -higher values are not valid because the latest possible date in the standard -UNIX representation is in February 2038. The command interpreter -automatically reduces later dates to the maximum value. -

    Relative expiration dates have the following format: -

       [in] [yearsy] [monthsm] [daysd]
    -   
    -
    -

    -

    where the optional word in is followed by at least one of a -number of years (maximum 9999) followed by the letter y, -a number of months (maximum 12) followed by the letter -m, or a number of days (maximum 31) followed by the -letter d. If providing more than one of the three, list them -in the indicated order. If the date that results from adding the -relative expiration value to a dump's creation time is later than the -latest possible date in the UNIX time representation, the Backup System -automatically reduces it to that date. -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition to be -associated with each dump level specified by the -dump -argument. -
    -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example associates an absolute expiration date of 10:00 -p.m. on 31 December 1999 with the dump level -/1998/december: -

       % backup setexp -dump /1998/december -expires at 12/31/1999 22:00
    -   
    -
    -

    The following example associates a relative expiration date of 7 days with -the two dump levels /monthly/week1 and -/monthly/week2: -

       % backup setexp -dump /monthly/week1 /monthly/week -expires 7d
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    backup adddump -

    backup deldump -

    backup listdumps -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf089.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf089.htm deleted file mode 100755 index 1df569236..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf089.htm +++ /dev/null @@ -1,138 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup status

    - - - - -

    Purpose -

    Reports a Tape Coordinator's status -

    Synopsis -

    backup status [-portoffset <TC port offset>]
    -              [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup st [-p <TC port offset>]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup status command displays which operation, if any, the -indicated Tape Coordinator is currently executing. -

    Options -

    -

    -portoffset -
    Specifies the port offset number of the Tape Coordinator for which to -report the status. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The following message indicates that the Tape Coordinator is not currently -performing an operation: -

       Tape coordinator is idle
    -
    -

    Otherwise, the output includes a message of the following format for each -running or pending operation: -

       Task task_ID:  operation:   status
    -
    -

    where -

    -

    task_ID -
    Is a task identification number assigned by the Tape Coordinator. -It begins with the Tape Coordinator's port offset number. -

    operation -
    Identifies the operation the Tape Coordinator is performing, which is -initiated by the indicated command: -
      -

    • Dump (the backup dump command) -

    • Restore (the backup diskrestore, backup -volrestore, or backup volsetrestore commands) -

    • Labeltape (the backup labeltape command) -

    • Scantape (the backup scantape command) -

    • SaveDb (the backup savedb command) -

    • RestoreDb (the backup restoredb command) -
    -

    status -
    Indicates the job's current status in one of the following -messages. -
    -

    number Kbytes transferred, volume volume_name -
    For a running dump operation, indicates the number of kilobytes copied to -tape or a backup data file so far, and the volume currently being -dumped. -

    number Kbytes, restore.volume -
    For a running restore operation, indicates the number of kilobytes copied -into AFS from a tape or a backup data file so far. -

    [abort requested] -
    The (backup) kill command was issued, but the termination -signal has yet to reach the Tape Coordinator. -

    [abort sent] -
    The operation is canceled by the (backup) kill command. -Once the Backup System removes an operation from the queue or stops it from -running, it no longer appears at all in the output from the command. -

    [butc contact lost] -
    The backup command interpreter cannot reach the Tape -Coordinator. The message can mean either that the Tape Coordinator -handling the operation was terminated or failed while the operation was -running, or that the connection to the Tape Coordinator timed out. -

    [done] -
    The Tape Coordinator has finished the operation. -

    [drive wait] -
    The operation is waiting for the specified tape drive to become -free. -

    [operator wait] -
    The Tape Coordinator is waiting for the backup operator to insert a tape -in the drive. -
    -
    -

    Examples -

    The following example shows that the Tape Coordinator with port offset 4 -has so far dumped about 1.5 MB of data for the current dump operation, -and is currently dumping the volume named -user.pat.backup: -

       % backup status -portoffset 4
    -   Task 4001:  Dump:   1520 Kbytes transferred,  volume user.pat.backup
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server is running, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    backup -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf090.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf090.htm deleted file mode 100755 index 33b1460e4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf090.htm +++ /dev/null @@ -1,121 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup volinfo

    - - - - - - -

    Purpose -

    Displays a volume's dump history from the Backup Database -

    Synopsis -

    backup volinfo -volume <volume name>
    -               [-localauth]  [-cell <cell name>]  [-help]
    -  
    -backup voli -v <volume name>  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup volinfo command displays a dump history of the -specified volume, reporting information such as the date on which the volume -was dumped and the tapes that contain it. Include the -.backup extension on the volume name if the backup version -of the volume was dumped. -

    Options -

    -

    -volume -
    Names the volume for which to display the dump history. Include -the .backup or .readonly extension if the -backup or read-only version of the volume was dumped. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes a line for each Backup Database dump record that -mentions the specified volume, order from most to least recent. The -output for each record appears in a table with six columns: -

    -

    dumpID -
    The dump ID of the dump that includes the volume. -

    lvl -
    The depth in the dump hierarchy of the dump level at which the volume was -dumped. A value of 0 indicates a full dump. A value -of 1 or greater indicates an incremental dump made at the specified -depth in the dump hierarchy. -

    parentid -
    The dump ID of the dump's parent dump. A value of 0 -indicates a full dump, which has no parent; in this case, the value in -the lvl column is also 0. -

    creation date -
    The date and time at which the Backup System started the dump operation -that created the dump. -

    clone date -
    For a backup or read-only volume, the time at which it was cloned from its -read/write source. For a read/write volume, the same as the value in -the creation date field. -

    tape name -
    The name of the tape containing the dump: either the permanent tape -name, or an AFS tape name in the format -volume_set_name.dump_level_name.tape_index -where volume_set_name is the name of the volume set associated with -the initial dump in the dump set of which this tape is a part; -dump_level_name is the name of the dump level at which the initial -dump was backed up; tape_index is the ordinal of the tape in -the dump set. Either type of name can be followed by a dump ID in -parentheses; if it appears, it is the dump ID of the initial dump in the -dump set to which this appended dump belongs. -
    -

    Examples -

    The following example shows part of the dump history of the Backup volume -user.smith.backup: -

       % backup volinfo -volume user.smith.backup
    -   DumpID    lvl parentID  creation date    clone date       tape name
    -   924600000 1   924427600 04/20/1999 05:20 04/20/1999 05:01 user_incr_2 (924514392)
    -   924514392 1   924427600 04/19/1999 05:33 04/19/1999 05:08 user_incr_2 
    -   924427600 0           0 04/18/1999 05:26 04/18/1999 04:58 user_full_6 
    -       .     .      .         .       .       .      .         .
    -       .     .      .         .       .       .      .         .
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    backup -

    backup dumpinfo -

    backup volrestore -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf091.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf091.htm deleted file mode 100755 index 0678db72e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf091.htm +++ /dev/null @@ -1,290 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup volrestore

    - - - - - - -

    Purpose -

    Restores one or more volumes -

    Synopsis -

    backup volrestore -server <destination machine>
    -                  -partition <destination partition>
    -                  -volume <volume(s) to restore>+  
    -                  [-extension <new volume name extension>]
    -                  [-date <date from which to restore>+]
    -                  [-portoffset <TC port offsets>+]  [-n]
    -                  [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup volr -s <destination machine>  -pa <destination partition>
    -            -v <volume(s) to restore>+  [-e <new volume name extension>]
    -            [-d <date from which to restore>+]  [-po <TC port offsets>+]
    -            [-n]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup volrestore command restores the contents of one or -more volumes to the site indicated by the -server and --partition arguments. Use the command either to overwrite -the contents of existing volumes with the restored data or to create new -volumes while retaining the existing ones. The specified site does not -have to be the current site for the volumes. -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file associated with the -specified port offset, then the backup volrestore command restores -data from the backup data file listed for that port offset in the Tape -Coordinator's /usr/afs/backup/tapeconfig file, rather than -from tape. For the sake of clarity, the following text refers to tapes -only, but the Backup System handles backup data files in much the same -way.) -

    The command's arguments can be combined as indicated: -

      -

    • To preserve a volume's current contents and also create a new volume -to house the restored version, use the -extension argument. -The Backup System creates the new volume on the server and partition named by -the -server and -partition arguments, assigns it the -same name as the current volume with the addition of the specified extension, -and creates a new Volume Location Database (VLDB) entry for it. -Creating a new volume enables the administrator to compare the two -versions. -

    • To overwrite a volume's existing contents with the restored version, -omit the -extension argument, and specify the site as -indicated: -
        -

      • To retain the current site, specify it with the -server and --partition arguments. -

      • To move the volume to a different site while overwriting it, specify the -new site with the -server argument, -partition argument, -or both. The Backup System creates a new volume at that site, removes -the existing volume, and updates the site information in the volume's -VLDB entry. The backup version of the volume is not removed -automatically from the original site, if it exists. Use the vos -remove command to remove it and the vos backup command to -create a backup version at the new site. -
      -

    • To restore a volume that no longer exists in the file system, specify its -name with the -volume argument and use the -server and --partition arguments to place it at the desired site. The -Backup System creates a new volume and new VLDB entry. -
    -

    In each case, the command sets each volume's creation date to the date -and time at which it restores it. The creation date appears in the -Creation field in the output from the vos examine and -vos listvol commands. -

    If restoring all of the volumes that resided on a single partition, it is -usually more efficient to use the backup diskrestore -command. If restoring multiple volumes to many different sites, it can -be more efficient to use the backup volsetrestore command. -

    By default, the backup volrestore command restores the most -recent full dump and all subsequent incremental dumps for each volume, -bringing the restored volumes to the most current possible state. To -restore the volumes to their state at some time in the past, use the --date argument. The Backup System restores the most recent -full dump and each subsequent incremental dump for which the clone -date of the volume included in the dump is before the indicated date and -time (the clone date timestamp appears in the clone date field of -the output from the backup volinfo command). For backup and -read-only volumes, the clone date represents the time at which the volume was -copied from its read/write source; for read/write volumes, it represents -the time at which the volume was locked for inclusion in the dump. The -resemblance of a restored volume to its actual state at the indicated time -depends on the amount of time that elapsed between the volume's clone -date in the last eligible dump and the specified time. -

    If the -volume argument specifies the base (read/write) form of -the volume name, the Backup System searches the Backup Database for the newest -dump set that includes a dump of either the read/write or the backup version -of the volume. It restores the dumps of that version of the volume, -starting with the most recent full dump. If, in contrast, the volume -name explicitly includes the .backup or -.readonly extension, the Backup System restores dumps of the -corresponding volume version only. -

    To generate a list of the tapes the Backup System needs to perform the -restore operation, without actually performing it, combine the -n -flag with the options to be used on the actual command. -

    If all of the full and incremental dumps of all relevant volumes were not -written to a type of tape that a single Tape Coordinator can read, use the --portoffset argument to list multiple port offset numbers in the -order in which the tapes are needed (first list the port offset for the full -dump, second the port offset for the level 1 incremental dump, and so -on). If restoring multiple volumes, the same ordered list of port -offsets must apply to all of them. If not, either issue this command -separately for each volume, or use the vos volsetrestore command -after defining groups of volumes that were dumped to compatible tape -types. For further discussion, see the AFS Administration -Guide. -

    The Tape Coordinator's default response to this command is to access -the first tape it needs by invoking the MOUNT instruction in the -local /usr/afs/backup/CFG_device_name file, or by -prompting the backup operator to insert the tape if there is no -MOUNT instruction. However, if the AUTOQUERY NO -instruction appears in the CFG_device_name file, or if the -issuer of the butc command included the -noautoquery -flag, the Tape Coordinator instead expects the tape to be in the device -already. If it is not, or is the wrong tape, the Tape Coordinator -invokes the MOUNT instruction or prompts the operator. It -also invokes the MOUNT instruction or prompts for any additional -tapes needed to complete the restore operation; the backup operator must -arrange to provide them. -

    Options -

    -

    -server -
    Names the file server machine on which to restore each volume. If -this argument and the -partition argument indicate a site other -than the current site for each volume, and the -extension argument -is not also provided, the Backup System removes the existing volumes from -their current sites, places the restored contents at the specified site, and -changes the site information in the volume's VLDB entry. -

    -partition -
    Names the partition to which to restore each volume. If this -argument and the -server argument indicate a site other than the -current site for each volume, and the -extension argument is not -also provided, the Backup System removes the existing volumes from their -current sites, places the restored contents at the specified site, and changes -the site information in the volume's VLDB entry. -

    -volume -
    Names one or more volumes to restore, using the volume name as listed in -the Backup Database. Provide the base (read/write) name of each volume -to have the Backup System search the Backup Database for the newest dump set -that includes a dump of either the read/write or the backup version of the -volume; it restores the dumps of that version of the volume, starting -with the most recent full dump. If, in contrast, a volume name -explicitly includes the .backup or -.readonly extension, the Backup System restores dumps of the -corresponding volume version only. -

    -extension -
    Creates a new volume to house the restored data, with a name derived by -appending the specified string to each volume named by the -volume -argument. The Backup System creates a new VLDB entry for the -volume. Any string other than .readonly or -.backup is acceptable, but the combination of the existing -volume name and extension cannot exceed 22 characters in length. To use -a period to separate the extension from the name, specify it as the first -character of the string (as in .rst, for example). -

    -date -
    Specifies a date and optionally time; the restored volume includes -data from dumps performed before the date only. Provide a value in the -format mm/dd/yyyy [hh:MM], -where the required mm/dd/yyyy portion indicates the month -(mm), day (dd), and year (yyyy), and the optional -hh:MM portion indicates the hour and minutes in 24-hour format -(for example, the value 14:36 represents 2:36 -p.m.). If omitted, the time defaults to 59 seconds after -midnight (00:00:59 hours). -

    Valid values for the year range from 1970 to -2037; higher values are not valid because the latest possible -date in the standard UNIX representation is in February 2038. The -command interpreter automatically reduces any later date to the maximum -value. -

    If this argument is omitted, the Backup System restores all possible dumps -including the most recently created. -
    Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
    -

    -portoffset -
    Specifies one or more port offset numbers (up to a maximum of 128), each -corresponding to a Tape Coordinator to use in the operation. If there -is more than one value, the Backup System uses the first one when restoring -the full dump of each volume, the second one when restoring the level 1 -incremental dump of each volume, and so on. It uses the final value in -the list when restoring dumps at the corresponding depth in the dump hierarchy -and all dumps at lower levels. -

    Provide this argument unless the default value of 0 (zero) is appropriate -for all dumps. If 0 is just one of the values in the list, -provide it explicitly in the appropriate order. -

    -n -
    Displays the list of tapes that contain the dumps required by the restore -operation, without actually performing the operation. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the issuer includes the -n flag with the command, the -following string appears at the head of the list of the tapes necessary to -complete the restore operation. -

       Tapes needed:
    -   
    -
    -

    Examples -

    The following command restores the volume user.pat to -partition /vicepa on machine -fs5.abc.com: -

       % backup volrestore -server fs5.abc.com -partition a -volume user.pat
    -   
    -
    -

    The following command restores the volumes user.smith and -user.terry to partition /vicepb on machine -fs4.abc.com, adding a .rst -extension to each volume name and preserving the existing -user.smith and user.terry volumes. -Only dumps created before 5:00 p.m. on 31 January 1998 are -restored. (The command is shown here on multiple lines only for -legibility reasons.) -

       % backup volrestore -server fs4.abc.com -partition b  \
    -                       -volume user.smith user.terry  \ 
    -                       -extension .rst -date 1/31/1998 17:00
    -   
    -
    -

    The following command restores the volume user.pat to -partition /vicepb on machine -fs4.abc.com. The Tape Coordinator with port -offset 1 handles the tape containing the full dump; the Tape Coordinator -with port offset 0 handles all tapes containing incremental dumps. (The -command is shown here on two lines only for legibility reasons.) -

       % backup volrestore -server fs5.abc.com -partition a  \
    -                       -volume user.pat -portoffset 1 0
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server or Volume Location (VL) Server is -running, and on every file server machine that houses an affected -volume. If the -localauth flag is included, the issuer must -instead be logged on to a server machine as the local superuser -root. -

    Related Information -

    backup -

    backup dump -

    backup diskrestore -

    backup volsetrestore -

    butc -

    vos backup -

    vos remove -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf092.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf092.htm deleted file mode 100755 index 5f5c1fa13..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf092.htm +++ /dev/null @@ -1,352 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    backup volsetrestore

    - - - - - - - -

    Purpose -

    Restores all volumes in a volume set -

    Synopsis -

    backup volsetrestore [-name <volume set name>]  [-file <file name>]
    -                     [-portoffset <TC port offset>+]  
    -                     [-extension <new volume name extension>]
    -                     [-n]  [-localauth]  [-cell <cell name>]  [-help]
    -   
    -backup vols [-na <volume set name>]  [-f <file name>]
    -            [-p <TC port offset>+]  [-e <new volume name extension>]
    -            [-n]  [-l]  [-c <cell name>]  [-h]
    -
    -

    Description -

    The backup volsetrestore command restores the complete contents -of a group of read/write volumes to the file system, by restoring data from -the last full dump and all subsequent incremental dumps of each volume. -It is most useful for recovering from loss of data on multiple partitions, -since it can restore each of a defined set of volumes to a different -site. -

    (If the FILE YES instruction appears in the -/usr/afs/backup/CFG_device_name file associated with the -specified port offset, then the backup volsetrestore command -restores data from the backup data file listed for that port offset in the -Tape Coordinator's /usr/afs/backup/tapeconfig file, instead of -from tape. For the sake of clarity, the following text refers to tapes -only, but the Backup System handles backup data files in much the same -way.) -

    If restoring one or more volumes to a single site only, it is usually more -efficient to use the backup volrestore command. If restoring -all volumes that resided on a single partition, it is usually more efficient -to use the backup diskrestore command. -

    Indicate the volumes to restore by providing either the -name -argument or the -file argument: -

      -

    • The -name argument names a volume set. The Backup System -restores all volumes listed in the Volume Location Database (VLDB) that match -the server, partition, and volume name criteria defined in the volume -set's volume entries, and for which dumps are available. It -restores the volumes to their current site (machine and partition), and by -default overwrites the existing volume contents. -

      It is not required that the volume set was previously used to back up -volumes (was used as the -volumeset option to the backup -dump command). It can be defined especially to match the volumes -that need to be restored with this command, and that is usually the better -choice. Indeed, a temporary volume set, created by including -the -temporary flag to the backup addvolset command, can -be especially useful in this context. A temporary volume set is not -added to the Backup Database and exists only during the current interactive -backup session, which is suitable if the volume set is needed only to complete -the single restore operation initialized by this command. -

      The reason that a specially defined volume set is probably better is that -volume sets previously defined for use in dump operations usually match the -backup version of volumes, whereas for a restore operation it is best to -define volume entries that match the base (read/write) name. In that -case, the Backup System searches the Backup Database for the newest dump set -that includes either the read/write or the backup version of the -volume. If, in contrast, a volume entry explicitly matches the -volume's backup or read-only version, the Backup System restores dumps of -that volume version only. -

    • The -file argument names a file that lists specific volumes and -the site to which to restore each. The volume name must match the name -used in Backup Database dump records rather than in the VLDB, if they differ, -because the Backup System does not look up volumes in the VLDB. The -specified site can be different than the volume's current one; in -that case, the Backup System removes the current version of the volume and -updates the volume's location information in the VLDB. -
    -

    If all of the full and incremental dumps of all relevant volumes were not -written to a type of tape that a single Tape Coordinator can read, use the --portoffset argument to list multiple port offset numbers in the -order in which the tapes are needed (first list the port offset for the full -dump, second the port offset for the level 1 incremental dump, and so -on). This implies that the full dumps of all relevant volumes must have -been written to a type of tape that the first Tape Coordinator can read, the -level 1 incremental dumps to a type of tape the second Tape Coordinator can -read, and so on. If dumps are on multiple incompatible tape types, use -the backup volrestore command to restore individual volumes, or use -this command after defining new volume sets that group together volumes that -were dumped to compatible tape types. For further discussion, see the -AFS Administration Guide. -

    By default, the Backup System overwrites the contents of an existing volume -with the restored data. To create a new volume to house the restored -version instead, use the -extension argument. The Backup -System derives the new volume's name by adding the specified extension to -the read/write base name, and creates a new VLDB entry. The command -does not affect the existing volume in any way. However, if a volume -with the specified extension also already exists, the command overwrites -it. -

    The -n flag produces a list of the volumes to be restored if the --n flag were not included, without actually restoring any -volumes. See the Output section of this reference page for a -detailed description of the output, and suggestions on how to combine it most -effectively with the -file and -name arguments. -

    The execution time for a backup volsetrestore command depends on -the number of volumes to be restored and the amount of data in them, but it -can take hours to restore a large number of volumes. One way to reduce -the time is to run multiple instances of the command simultaneously, either -using the -name argument to specify disjoint volume sets for each -command, or the -file argument to name files that list different -volumes. This is possible if there are multiple available Tape -Coordinators that can read the required tapes. Depending on how the -volumes to be restored were dumped to tape, specifying disjoint volume sets -can also reduce the number of tape changes required. -

    The Tape Coordinator's default response to this command is to access -the first tape it needs by invoking the MOUNT instruction in the -local /usr/afs/backup/CFG_device_name file, or by -prompting the backup operator to insert the tape if there is no -MOUNT instruction. However, if the AUTOQUERY NO -instruction appears in the CFG_device_name file, or if the -issuer of the butc command included the -noautoquery -flag, the Tape Coordinator instead expects the tape to be in the device -already. If it is not, or is the wrong tape, the Tape Coordinator -invokes the MOUNT instruction or prompts the operator. It -also invokes the MOUNT instruction or prompts for any additional -tapes needed to complete the restore operation; the backup operator must -arrange to provide them. -

    Options -

    -

    -name -
    Names a volume set to restore. The Backup System restores all of -the volumes listed in the VLDB that match the volume set's volume -entries. Provide this argument or the -file argument, but -not both. -

    -file -
    Specifies the full pathname of a file that lists one or more volumes and -the site (file server machine and partition) to which to restore each. -Use either this argument or the -name argument, but not -both. -

    Each volume's entry must appear on its own (unbroken) line in the -file, and have the following format: -

        machine  partition
    - volume [comments...]
    -   
    -
    -

    -

    where -

    -

    machine -
    Names the file server machine to which to restore the volume. -

    partition -
    Names the partition to which to restore the volume. -

    volume -
    Names the volume to restore. It is generally best to specify the -base (read/write) name of each volume. In this case, the Backup System -searches the Backup Database for the newest dump set that includes a dump of -either the read/write or the backup version of the volume. It restores -the dumps of that version of the volume, starting with the most recent full -dump. If, in contrast, the name explicitly includes the -.backup or .readonly extension, the Backup -System restores dumps of that volume version only. -

    comments... -
    Is any other text. The Backup System ignores any text on each line -that appears after the volume name, so this field can be used for notes -helpful to the backup operator or other administrator. -
    -

    -

    Do not use wildcards (for example, .*) in the -machine, partition, or volume fields. It is -acceptable for multiple lines in the file to name the same volume, but the -Backup System processes only the first of them. -

    -extension -
    Creates a new volume for each volume specified by the -name or --file argument, to house the restored data from that volume. -The Backup System derives the new volume's name by appending the -specified string to the read/write base name, and creates a new VLDB volume -entry. It preserves the contents of each existing volume. Any -string other than .readonly or .backup is -acceptable, but the combination of the base name and extension cannot exceed -22 characters in length. To use a period to separate the extension from -the name, specify it as the first character of the string (as in -.rst, for example). -

    -portoffset -
    Specifies one or more port offset numbers (up to a maximum of 128), each -corresponding to a Tape Coordinator to use in the operation. If there -is more than one value, the Backup System uses the first one when restoring -the full dump of each volume, the second one when restoring the level 1 -incremental dump of each volume, and so on. It uses the final value in -the list when restoring dumps at the corresponding depth in the dump hierarchy -and all dumps at lower levels. -

    Provide this argument unless the default value of 0 (zero) is appropriate -for all dumps. If 0 is just one of the values in the list, -provide it explicitly in the appropriate order. -

    -n -
    Displays a list of the volumes to be restored if the flag were not -included, without actually restoring them. The Output -section of this reference page details the format of the output. When -combined with the -name argument, its output is easily edited for -use as input to the -file argument on a subsequent backup -volsetrestore command. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The backup command -interpreter presents it to the Backup Server, Volume Server and VL Server -during mutual authentication. Do not combine this flag with the --cell argument. For more details, see the introductory -backup reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory backup reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the -n flag is not provided, the command displays a unique -task ID number for the operation, in two places: -

      -

    • In the shell window, directly following the command line -

    • In the Tape Coordinator window, if the butc process was started -at debug level 1 -
    -

    The task ID number is not the same as the job ID number displayed by the -(backup) jobs command when the (backup) volsetrestore -command is issued in interactive mode. The Backup System does not -assign either type of ID number until the restoration process actually -begins. -

    When the -n flag is included, no task ID or job ID numbers are -reported because none are assigned. Instead, the output begins with a -count of the number of volumes to be restored, followed by a line for each -dump of a volume. For each volume, the line representing the most -recent full dump appears first, and lines for any subsequent incremental dumps -follow, ordered by dump level. The lines for a given volume do not -necessarily appear all together, however. -

    The format of each line is as follows (the output is shown here on two -lines only for legibility reasons): -

       machine partition volume_dumped  # as volume_restored; tape_name (tape_ID);  \
    -              pos position_number; date
    -   
    -
    -

    where -

    -

    machine -
    Names the file server machine that currently houses the volume, as listed -in the VLDB. -

    partition -
    Names the partition that currently houses the volume, as listed in the -VLDB. -

    volume_dumped -
    Specifies the version (read/write or backup) of the volume that was -dumped, as listed in the Backup Database. -

    volume_restored -
    Specifies the name under which to restore the volume. The Backup -System only restores data to read/write volumes. If the --extension argument is included, then the specified extension -appears on the name in this field (for example, -user.pat.rst). -

    tape_name -
    Names the tape containing the dump of the volume, from the Backup -Database. If the tape has a permanent name, it appears here; -otherwise, it is the AFS tape name. -

    tape_ID -
    The tape ID of the tape containing the dump of the volume, from the Backup -Database. -

    position_number -
    Specifies the dump's position on the tape (for example, 31 -indicates that 30 volume dumps precede the current one on the tape). If -the dump was written to a backup data file, this number is the ordinal of the -16 KB-offset at which the volume's data begins. -

    date -
    The date and time when the volume was dumped. -
    -

    One way to generate a file for use as input to the -file -argument is to combine the -name and -n options, -directing the output to a file. The AFS Administration Guide -section on using the Backup System to restore data explains how to edit the -file as necessary before using it as input to the -file -argument. -

    The output of this command includes only volumes for which the Backup -Database includes at least one dump record. The command interpreter -generates a message on the standard error stream about volumes that do not -have dump records but either are listed in the file named by the --file argument, or appear in the VLDB as a match to a volume entry -in the volume set named by the -name argument. -

    Examples -

    The following command restores all volumes included in entries in the -volume set named data.restore, which was created expressly -to restore data to a pair of file server machines on which all data was -corrupted due to a software error. All volumes are restored to the -sites recorded in their entries in the VLDB. -

       % backup volsetrestore -name data.restore
    -   Starting restore
    -   backup: task ID of restore operation: 112
    -   backup: Finished doing restore
    -   
    -
    -

    The following command restores all volumes that have entries in the file -named /tmp/restore: -

       % backup volsetrestore -file /tmp/restore
    -   Starting restore
    -   backup: task ID of restore operation: 113
    -   backup: Finished doing restore
    -   
    -
    -

    The /tmp/restore file has the following contents: -

       fs1.abc.com b user.pat
    -   fs1.abc.com b user.terry
    -   fs1.abc.com b user.smith
    -   fs2.abc.com c user.jones
    -          .         .     .
    -          .         .     .
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server or Volume Location (VL) Server is -running, and on every file server machine that houses an affected -volume. If the -localauth flag is included, the issuer must -instead be logged on to a server machine as the local superuser -root. -

    Related Information -

    backup -

    backup addvolentry -

    backup addvolset -

    backup diskrestore -

    backup dump -

    backup volrestore -

    butc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf093.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf093.htm deleted file mode 100755 index f5211e613..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf093.htm +++ /dev/null @@ -1,254 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos

    - - - - - - - -

    Purpose -

    Introduction to the bos command suite -

    Description -

    The commands in the bos command suite are the administrative -interface to the Basic OverSeer (BOS) Server, which runs on every file server -machine to monitor the other server processes on it. If a process -fails, the BOS Server can restart it automatically, taking into account -interdependencies between it and other processes. The BOS Server frees -system administrators from constantly monitoring the status of server machines -and processes. -

    There are several categories of commands in the bos command -suite: -

      -

    • Commands to administer server process binary files: bos -getdate, bos install, bos prune, and bos -uninstall -

    • Commands to maintain system configuration files: bos -addhost, bos addkey, bos adduser, bos -listhosts, bos listkeys, bos listusers, bos -removehost, bos removekey, bos removeuser, and -bos setcellname -

    • Commands to start and stop processes: bos create, -bos delete, bos restart, bos shutdown, -bos start, bos startup, and bos stop -

    • Commands to set and verify server process and server machine status: -bos getlog, bos getrestart, bos setauth, -bos setrestart, and bos status -

    • A command to restore file system consistency: bos salvage -

    • Commands to obtain help: bos apropos and bos -help -
    -

    The BOS Server and the bos commands use and maintain the -following configuration and log files: -

      -

    • The /usr/afs/etc/CellServDB file lists the local cell's -database server machines. These machines run the Authentication, -Backup, Protection and Volume Location (VL) Server processes, which maintain -databases of administrative information. The database server processes -consult the file to learn about their peers, whereas the other server -processes consult it to learn where to access database information as -needed. To administer the CellServDB file, use the following -commands: bos addhost, bos listhosts, bos -removehost, and bos setcellname. -

    • The /usr/afs/etc/KeyFile file lists the server encryption keys -that the server processes use to decrypt tickets presented by client processes -and one another. To administer the KeyFile file, use the -following commands: bos addkey, bos listkeys, and -bos removekey. -

    • The /usr/afs/etc/ThisCell file defines the cell to which the -server machine belongs for the purposes of server-to-server -communication. Administer it with the bos setcellname -command. There is also a /usr/vice/etc/ThisCell file that -defines the machine's cell membership with respect to the AFS command -suites and Cache Manager access to AFS data. -

    • The /usr/afs/etc/UserList file lists the user name of each -administrator authorized to issue privileged bos and vos -commands. To administer the UserList file, use the following -commands: bos adduser, bos listusers, and bos -removeuser. -

    • The /usr/afs/local/BosConfig file defines which AFS server -processes run on the server machine, and whether the BOS Server restarts them -automatically if they fail. It also defines when all processes restart -automatically (by default once per week), and when the BOS Server restarts -processes that have new binary files (by default once per day). To -administer the BosConfig file, use the following commands: -bos create, bos delete, bos getrestart, -bos setrestart, bos start, and bos -stop. -

    • The /usr/afs/log/BosLog file records important operations the -BOS Server performs and error conditions it encounters. -
    -

    For more details, see the reference page for each file. -

    Options -

    The following arguments and flags are available on many commands in the -bos suite. The reference page for each command also lists -them, but they are described here in greater detail. - - - -

    -

    -cell <cell name> -
    Names the cell in which to run the command. It is acceptable to -abbreviate the cell name to the shortest form that distinguishes it from the -other entries in the /usr/vice/etc/CellServDB file on the local -machine. If the -cell argument is omitted, the command -interpreter determines the name of the local cell by reading the following in -order: -
      -

    1. The value of the AFSCELL environment variable -

    2. The local /usr/vice/etc/ThisCell file -
    -

    -

    Do not combine the -cell and -localauth -options. A command on which the -localauth flag is included -always runs in the local cell (as defined in the server machine's local -/usr/afs/etc/ThisCell file), whereas a command on which the --cell argument is included runs in the specified foreign -cell. - -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -

    - --localauth -
    Constructs a server ticket using the server encryption key with the -highest key version number in the local /usr/afs/etc/KeyFile -file. The bos command interpreter presents the ticket, which -never expires, to the BOS Server during mutual authentication. -

    Use this flag only when issuing a command on a server machine; client -machines do not usually have a /usr/afs/etc/KeyFile file. -The issuer of a command that includes this flag must be logged on to the -server machine as the local superuser root. The flag is -useful for commands invoked by an unattended application program, such as a -process controlled by the UNIX cron utility or by a cron entry in -the machine's /usr/afs/local/BosConfig file. It is also -useful if an administrator is unable to authenticate to AFS but is logged in -as the local superuser root. -

    Do not combine the -cell and -localauth -options. A command on which the -localauth flag is included -always runs in the local cell (as defined in the server machine's local -/usr/afs/etc/ThisCell file), whereas a command on which the --cell argument is included runs in the specified foreign -cell. Also, do not combine the -localauth and --noauth flags. -

    - --noauth -
    Establishes an unauthenticated connection to the BOS Server, in which the -BOS Server treats the issuer as the unprivileged user -anonymous. It is useful only when authorization checking is -disabled on the server machine (during the installation of a file server -machine or when the bos setauth command has been used during other -unusual circumstances). In normal circumstances, the BOS Server allows -only privileged users to issue commands that change the status of a server or -configuration file, and refuses to perform such an action even if the --noauth flag is provided. Do not combine the --noauth and -localauth flags. -

    -server <machine name> - -
    Indicates the AFS server machine on which to run the command. -Identify the machine by its IP address in dotted decimal format, its -fully-qualified host name (for example, fs1.abc.com), -or by an abbreviated form of its host name that distinguishes it from other -machines. Successful use of an abbreviated form depends on the -availability of a name service (such as the Domain Name Service or a local -host table) at the time the command is issued. -

    For the commands that alter the administrative files shared by all server -machines in the cell (the bos addhost, bos addkey, -bos adduser, bos removehost, bos removekey, -and bos removeuser commands), the appropriate machine depends on -whether the cell uses the United States or international version of AFS: -

      -

    • If the cell runs the United States edition of AFS and (as recommended) -uses the Update Server to distribute the contents of the -/usr/afs/etc directory, provide the name of the system control -machine. After issuing the command, allow up to five minutes for the -Update Server to distribute the changed file to the other AFS server machines -in the cell. If the specified machine is not the system control machine -but is running an upclientetc process that refers to the system -control machine, then the change will be overwritten when the process next -brings over the relevant file from the system control machine. -

    • If the cell runs the international edition of AFS, do not use the Update -Server to distribute the contents of the /usr/afs/etc -directory. Instead, repeatedly issue the command, naming each of the -cell's server machines in turn. To avoid possible inconsistency -problems, finish issuing the commands within a fairly short time. -
    -
    -

    Privilege Required - - -

    To issue any bos command that changes a configuration file or -alters process status, the issuer must be listed in the -/usr/afs/etc/UserList file on the server machine named by the --server argument. Alternatively, if the --localauth flag is included the issuer must be logged on as the -local superuser root. -

    To issue a bos command that only displays information (other -than the bos listkeys command), no privilege is required. -

    Related Information -

    BosConfig -

    CellServDB (client version) -

    CellServDB (server version) -

    KeyFile -

    ThisCell (client version) -

    ThisCell (server version) -

    UserList -

    bos addhost -

    bos addkey -

    bos adduser -

    bos apropos -

    bos create -

    bos delete -

    bos exec -

    bos getdate -

    bos getlog -

    bos getrestart -

    bos help -

    bos install -

    bos listhosts -

    bos listkeys -

    bos listusers -

    bos prune -

    bos removehost -

    bos removekey -

    bos removeuser -

    bos restart -

    bos salvage -

    bos setauth -

    bos setcellname -

    bos setrestart -

    bos shutdown -

    bos start -

    bos startup -

    bos status -

    bos stop -

    bos uninstall -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf094.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf094.htm deleted file mode 100755 index 2cbaaf6a4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf094.htm +++ /dev/null @@ -1,124 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos addhost

    - - - - - -

    Purpose -

    Adds a database server machine to the /usr/afs/etc/CellServDB -file -

    Synopsis -

    bos addhost -server <machine name>  -host <host name>+
    -            [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -    
    -bos addh -s <machine name>  -ho <host name>+
    -         [-c <cell name>]  [-n]  [-l]  [-he]
    -
    -

    Description -

    The bos addhost command adds an entry for each database server -machine specified with the -host argument to the -/usr/afs/etc/CellServDB file on the machine named by the --server argument. -

    Cautions -

    After executing this command (and waiting for the Update Server to -propagate the changes, if it is used), restart the database server processes -on all database server machines to force election of a quorum that includes -the new set of machines listed in the /usr/afs/etc/CellServDB -file. The AFS Quick Beginnings explains in more detail how -to add and remove database server machines. -

    It is best to maintain a one-to-one mapping between hostnames and IP -addresses on a multihomed database server machine (this is actually the -conventional configuration for any AFS machine). The BOS Server uses -the gethostbyname( ) routine to obtain the IP address -associated with the hostname specified by the -host -argument. If there is more than one address, the BOS Server records in -the CellServDB entry the one that appears first in the list of -addresses returned by the routine. The routine possibly returns -addresses in a different order on different machines, which can create -inconsistency. -

    Options -

    -

    -server -
    Identifies the server machine on which to change the -/usr/afs/etc/CellServDB file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is conventional to specify only the system control machine as a value for the --server argument. In cells that run the international -version of AFS, repeat the command for each file server machine. For -further discussion, see the introductory reference page for the bos -command suite. -

    -host -
    Specifies the fully-qualified host name (such as -db1.abc.com) of each database server machine to -register in the CellServDB file. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command adds the database server machines -db2.abc.com and db3.abc.com -to the /usr/afs/etc/CellServDB file on the machine -fs1.abc.com (the system control machine). -

       % bos addhost -server fs1.abc.com -host db2.abc.com db3.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    CellServDB (server version) -

    KeyFile -

    UserList -

    bos -

    bos listhosts -

    bos removehost -

    AFS Quick Beginnings -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf095.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf095.htm deleted file mode 100755 index 86fb52501..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf095.htm +++ /dev/null @@ -1,144 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos addkey

    - - - - - - - - - -

    Purpose -

    Adds a new server encryption key to the /usr/afs/etc/KeyFile -file -

    Synopsis -

    bos addkey -server <machine name>  [-key <key>]
    -           -kvno <key version number>  [-cell <cell name>]
    -           [-noauth]  [-localauth]  [-help]
    -    
    -bos addk -s <machine name>  [-ke <key>]  -kv <key version number>
    -         [-ce <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos addkey command constructs a server encryption key from -the text string provided, assigns it the key version number specified with the --kvno argument, and adds it to the /usr/afs/etc/KeyFile -file on the machine specified with the -server argument. Be -sure to use the kas setpassword or kas setkey command to -add the same key to the afs entry in the Authentication -Database. -

    Do not use the -key argument, which echoes the password string -visibly on the screen. If the argument is omitted, the BOS Server -prompts for the string and does not echo it visibly: -

       Input key:
    -   Retype input key:
    -   
    -
    -

    The BOS Server prohibits reuse of any key version number already listed in -the /usr/afs/etc/KeyFile file. This ensures that users who -still have tickets sealed with the current key are not prevented from -communicating with a server process because the current key is overwritten -with a new key. Use the bos listkeys command to display the -key version numbers in the /usr/afs/etc/KeyFile file. -

    Options -

    -

    -server -
    Indicates the server machine on which to change the -/usr/afs/etc/KeyFile file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is conventional to specify only the system control machine as a value for the --server argument. In cells that run the international -version of AFS, repeat the command for each file server machine. For -further discussion, see the introductory reference page for the bos -command suite. -

    -key -
    Specifies a character string just like a password; the BOS Server -calls a DES conversion function to encode it into a form appropriate for use -as an encryption key. Omit this argument to have the BOS Server prompt -for the string instead. -

    -kvno -
    Defines the new key's key version number. It must be an -integer in the range from 0 (zero) through 255. -For the sake of simplicity, use the number one higher than the current highest -key version number; use the bos listkeys command to display -key version numbers. - -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the strings typed at the Input key and Retype input -key prompts do not match, the following message appears, and the command -exits without adding a new key: -

       Input key mismatch
    -   
    -
    -

    Examples -

    The following command adds a new server encryption key with key version -number 14 to the KeyFile file kept on the machine -fs1.abc.com (the system control machine). The -issuer omits the -key argument, as recommended, and provides the -password at the prompts. -

       % bos addkey -server fs1.abc.com -kvno 14
    -   Input key:
    -   Retype input key:
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos listkeys -

    bos removekey -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf096.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf096.htm deleted file mode 100755 index a588c9f66..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf096.htm +++ /dev/null @@ -1,105 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos adduser

    - - - - - - - -

    Purpose -

    Adds a privileged user to the /usr/afs/etc/UserList file -

    Synopsis -

    bos adduser -server <machine name>  -user <user names>+
    -            [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -     
    -bos addu -s <machine name>  -u <user names>+
    -         [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos adduser command adds each user name specified with the --user argument to the /usr/afs/etc/UserList file on the -machine named by the -server argument. It is the -issuer's responsibility to verify that an entry for the user exists in -the Authentication and Protection Databases. -

    Options -

    -

    -server -
    Indicates the server machine on which to change the -/usr/afs/etc/UserList file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is conventional to specify only the system control machine as a value for the --server argument. In cells that run the international -version of AFS, repeat the command for each file server machine. For -further discussion, see the introductory reference page for the bos -command suite. -

    -user -
    Specifies each user name to insert into the -/usr/afs/etc/UserList file. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command adds the user names pat and -smith to the /usr/afs/etc/UserList file on the machine -fs1.abc.com (the system control machine). -

       % bos adduser -server fs1.abc.com -user pat smith
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos listusers -

    bos removeuser -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf097.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf097.htm deleted file mode 100755 index 56a156fe3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf097.htm +++ /dev/null @@ -1,73 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos apropos

    - - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    bos apropos -topic <help string>  [-help]
    -    
    -bos ap -t <help string>  [-h]
    -
    -

    Description -

    The bos apropos command displays the first line of the online -help entry for any bos command that has in its name or short -description the string specified by the -topic argument. -

    To display the syntax for a command, use the bos help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -bos command where the string specified with the -topic -argument is part of the command name or first line. -

    Examples -

    The following command lists all bos commands that include the -word restart in their names or short descriptions: -

       % bos apropos restart
    -   getrestart: get restart times
    -   restart: restart all processes
    -   setrestart: set restart times
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    bos -

    bos help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf098.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf098.htm deleted file mode 100755 index 663d39ac9..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf098.htm +++ /dev/null @@ -1,367 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos create

    - - - - - - - - - - -

    Purpose -

    Defines a new process in the /usr/afs/local/BosConfig file and -starts it running -

    Synopsis -

    bos create -server <machine name>  -instance <server process name>
    -           -type <server type>  -cmd <command lines>+
    -           [-notifier <Notifier program>]  [-cell <cell name>]
    -           [-noauth]  [-localauth]  [-help]
    -   
    -bos c -s <machine name>  -i <server process name>  -t <server type>
    -      -cm <command lines>+  [-not <Notifier program>]  [-ce <cell name>]
    -      [-noa]  [-l]  [-h]
    -
    -

    Description -

    The bos create command creates a server process entry in the -/usr/afs/local/BosConfig file on the server machine named by the --server argument, sets the process's status to Run -in the BosConfig file and in memory, and starts the process. -

    A server process's entry in the BosConfig file defines its -name, its type, the command that initializes it, and optionally, the name of a -notifier program that runs when the process terminates. -

    Options -

    -

    -server -
    Indicates the server machine on which to define and start the new -process. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    -instance -
    Names the process to define and start. Any name is acceptable, but -for the sake of simplicity it is best to use the last element of the -process's binary file pathname, and to use the same name on every server -machine. The conventional names, as used in all AFS documentation, -are: -
    -

    buserver -
    The Backup Server process - - -

    fs -
    The process that combines the File Server, Volume Server, and Salvager -processes (fileserver, volserver, and -salvager) - - -

    kaserver -
    The Authentication Server process - - -

    ptserver -
    The Protection Server process - - -

    runntp -
    The controller process for the Network Time Protocol Daemon - - -

    upclientbin -
    The client portion of the Update Server process that retrieves binary -files from the /usr/afs/bin directory of the binary distribution -machine for this machine's CPU/operating system type. (The name of -the binary is upclient, but the bin suffix distinguishes -this process from upclientetc.) - - -

    upclientetc -
    The client portion of the Update Server process that retrieves -configuration files from the /usr/afs/etc directory of the system -control machine. Do not run this process in cells that use the -international edition of AFS. (The name of the binary is -upclient, but the etc suffix distinguishes this process -from upclientbin.) -

    upserver -
    The server portion of the Update Server process - - -

    vlserver -
    The Volume Location (VL) Server process - - -
    -

    -type -
    Specifies the process's type. The acceptable values are: -

    -

    -

    cron -
    Use this value for cron-type processes that the BOS Server starts only at -a defined daily or weekly time, rather than whenever it detects that the -process has terminated. AFS does not define any such processes by -default, but makes this value available for administrator use. Define -the time for command execution as part of the -cmd argument to the -bos create command. -

    fs -
    Use this value only for the fs process, which combines the File -Server, Volume Server and Salvager processes. If one of the component -processes terminates, the BOS Server shuts down and restarts the processes in -the appropriate order. -

    simple -
    Use this value for all processes listed as acceptable values to the --instance argument, except for the fs process. -There are no interdependencies between simple processes, so the BOS Server can -stop and start them independently as necessary. -
    -

    -cmd -
    Specifies each command the BOS Server runs to start the process. -Specify no more than six commands (which can include the command's -options, in which case the entire string is surrounded by double quotes); -any additional commands are ignored. -

    For a simple process, provide the complete pathname of the process's -binary file on the local disk (for example, /usr/afs/bin/ptserver -for the Protection Server). If including any of the initialization -command's options, surround the entire command in double quotes (" -"). The upclient process has a required argument, and -the commands for all other processes take optional arguments. - -

    For the fs process, provide the complete pathname of the local -disk binary file for each of the component processes: -fileserver, volserver, and salvager, in that -order. The standard binary directory is /usr/afs/bin. -If including any of an initialization command's options, surround the -entire command in double quotes (" "). - -

    For a cron process, provide two parameters: - -

      -

    • The complete local disk pathname of either an executable file or a command -from one of the AFS suites (complete with all of the necessary -arguments). Surround this parameter with double quotes (" ") -if it contains spaces. -

    • A specification of when the BOS Server executes the file or command -indicated by the first parameter. There are three acceptable -values: -
        -

      • The string now, which directs the BOS Server to execute the -file or command immediately and only once. It is usually simpler to -issue the command directly or issue the bos exec command. -

      • A time of day. The BOS Server executes the file or command daily at -the indicated time. Separate the hours and minutes with a colon -(hh:MM), and use either 24-hour format, or a value -in the range from 1:00 through 12:59 with -the addition of am or pm. For example, both -14:30 and "2:30 pm" indicate 2:30 in -the afternoon. Surround this parameter with double quotes (" -") if it contains a space. -

      • A day of the week and time of day, separated by a space and surrounded -with double quotes (" "). The BOS Server executes the file -or command weekly at the indicated day and time. For the day, provide -either the whole name or the first three letters, all in lowercase letters -(sunday or sun, thursday or thu, -and so on). For the time, use the same format as when specifying the -time alone. -
      -
    -

    -notifier -
    Specifies the complete pathname on the local disk of a program that the -BOS Server invokes when the process terminates. The AFS distribution -does not include any notifier programs, but this argument is available for -administrator use. See the Related Information -section. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command defines and starts the simple process -kaserver on the machine fs3.abc.com: -

       % bos create -server fs3.abc.com -instance kaserver -type simple  \              
    -                -cmd /usr/afs/bin/kaserver
    -   
    -
    -

    The following command defines and starts the simple process -upclientbin on the machine -fs4.abc.com. It references -fs1.abc.com as the source for updates to binary -files, checking for changes to the /usr/afs/bin directory every 120 -seconds. -

       % bos create -server fs4.abc.com -instance upclientbin -type simple  \
    -                -cmd "/usr/afs/bin/upclient fs1.abc.com -clear -t 120  \
    -                /usr/afs/bin"
    -   
    -
    -

    The following command creates the fs process fs on the machine -fs4.abc.com. Type the command on a single -line. -

       % bos create -server fs4.abc.com -instance fs -type fs  \
    -                -cmd /usr/afs/bin/fileserver /usr/afs/bin/volserver  \
    -                /usr/afs/bin/salvager
    -   
    -
    -

    The following command creates a cron process called -userbackup on the machine fs5.abc.com, so -that the BOS Server issues the indicated vos backupsys command each -day at 3:00 a.m. (the command creates a backup version of -every volume in the file system whose name begins with -user). Note that the issuer provides the complete pathname -to the vos command, includes the -localauth flag on it, -and types the entire bos create command on one line. -

       % bos create -server fs5.abc.com -instance userbackup -type cron  \      
    -                -cmd "/usr/afs/bin/vos backupsys -prefix user -localauth" 03:00
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    If the -notifier argument is included when this command is used -to define and start a process, the BOS Server invokes the indicated -notifier program when the process exits. The intended use of -a notifier program is to inform administrators when a process exits -unexpectedly, but it can be used to perform any appropriate actions. -The following paragraphs describe the bnode and -bnode_proc structures in which the BOS Server records information -about the exiting process. The list of AFS commands related to this one -follows. -

    The BOS Server constructs and sends on the standard output stream one -bnode and one bnode_proc structure for each exiting -process associated with the notifier program. It brackets each -structure with appropriate BEGIN and END statements -(BEGIN bnode and END bnode, BEGIN bnode_proc -and END bnode_proc), which immediately follow the preceding newline -character with no intervening spaces or other characters. If the -notifier program does not need information from a structure, it can scan ahead -in the input stream for the END statement. -

    In general, each field in a structure is a string of ASCII text terminated -by the newline character. The format of the information within a -structure possibly varies slightly depending on the type of process associated -with the notifier program. -

    The C code for the bnode and bnode_proc structures -follows. Note that the structures sent by the BOS Server do not -necessarily include all of the fields described here, because some are used -only for internal record keeping. The notifier process must robustly -handle the absence of expected fields, as well as the presence of unexpected -fields, on the standard input stream. -

    For proper performance, the notifier program must continue processing the -input stream until it detects the end-of-file (EOF). The BOS Server -closes the standard input file descriptor to the notifier process when it has -completed delivery of the data, and it is the responsibility of the notifier -process to terminate properly. -

    struct bnode contents -

       struct bnode {
    -      struct bnode *next;      /* next pointer in top-level's list */
    -      char *name;              /* instance name */
    -      long nextTimeout;        /* next time this guy should be awakened */
    -      long period;             /* period between calls */
    -      long rsTime;             /* time we started counting restarts */
    -      long rsCount;            /* count of restarts since rsTime */
    -      struct bnode_type *type; /* type object */
    -      struct bnode_ops *ops;   /* functions implementing bnode class */
    -      long procStartTime;      /* last time a process was started */
    -      long procStarts;         /* number of process starts */
    -      long lastAnyExit;        /* last time a process exited for any reason */
    -      long lastErrorExit;      /* last time a process exited unexpectedly */
    -      long errorCode;          /* last exit return code */
    -      long errorSignal;        /* last proc terminating signal */
    -      char *lastErrorName;     /* name of proc that failed last */
    -      short refCount;          /* reference count */
    -      short flags;             /* random flags */
    -      char goal;               /* 1=running or 0=not running */
    -      char fileGoal;           /* same, but to be stored in file */
    -};
    -   
    -
    -

    format of struct bnode explosion -

       printf("name: %s\n",tp->name);
    -   printf("rsTime: %ld\n", tp->rsTime);
    -   printf("rsCount: %ld\n", tp->rsCount);
    -   printf("procStartTime: %ld\n", tp->procStartTime);
    -   printf("procStarts: %ld\n", tp->procStarts);
    -   printf("lastAnyExit: %ld\n", tp->lastAnyExit);
    -   printf("lastErrorExit: %ld\n", tp->lastErrorExit);
    -   printf("errorCode: %ld\n", tp->errorCode);
    -   printf("errorSignal: %ld\n", tp->errorSignal);
    -   printf("lastErrorName: %s\n", tp->lastErrorName);
    -   printf("goal: %d\n", tp->goal);
    -   
    -
    -

    struct bnode_proc contents -

       struct bnode_proc {
    -      struct bnode_proc *next; /* next guy in top-level's list */
    -      struct bnode *bnode;     /* bnode creating this process */
    -      char *comLine;           /* command line used to start this process */
    -      char *coreName;          /* optional core file component name */
    -      long pid;                /* pid if created */
    -      long lastExit;           /* last termination code */
    -      long lastSignal;         /* last signal that killed this guy */
    -      long flags;              /* flags giving process state */
    -};
    -   
    -
    -

    format of struct bnode_proc explosion -

       printf("comLine: %s\n", tp->comLine);
    -   printf("coreName: %s\n", tp->coreName);
    -   printf("pid: %ld\n", tp->pid);
    -   printf("lastExit: %ld\n", tp->lastExit);
    -   printf("lastSignal: %ld\n", tp->lastSignal);
    -   
    -
    -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    buserver -

    fileserver -

    kaserver -

    ptserver -

    runntp -

    salvager -

    upclient -

    upserver -

    vlserver -

    volserver -

    vos backupsys -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf099.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf099.htm deleted file mode 100755 index cd9d28549..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf099.htm +++ /dev/null @@ -1,103 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos delete

    - - - - - -

    Purpose -

    Deletes a server process from the /usr/afs/local/BosConfig file -

    Synopsis -

    bos delete -server <machine name>  -instance <server process name>+
    -           [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -    
    -bos d -s <machine name>  -i <server process name>+  [-c <cell name>]  
    -      [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos delete command removes the -/usr/afs/local/BosConfig entry for each process indicated by the --instance argument, on the server machine named by the --server argument. -

    Before issuing this command, issue the bos stop command to stop -the process and set its status flag in the BosConfig file to -NotRun. The bos delete command fails with an -error message if a process's status flag is Run. -

    Options -

    -

    -server -
    Indicates the server machine on which to delete the server process entry -from the /usr/afs/local/BosConfig file. Identify the machine -by IP address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    -instance -
    Names each process to delete. Use the name assigned with the --instance argument to the bos create command; -process names appear in the output of the bos status -command. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes the buserver, kaserver, -ptserver, and vlserver entries from the -BosConfig file on db3.abc.com, a database -server machine being decommissioned. -

       % bos delete -server db3.abc.com -instance buserver kaserver ptserver vlserver
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos create -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf100.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf100.htm deleted file mode 100755 index 9d3a5bb8d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf100.htm +++ /dev/null @@ -1,91 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos exec

    - - - - - -

    Purpose -

    Executes a command on a remote server machine -

    Synopsis -

    bos exec -server <machine name>  -cmd <command to execute>
    -         [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos e -s <machine name>  -cm <command to execute>  [-ce <cell name>]    
    -      [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos exec command executes the indicated command on the file -server machine named by the -server argument. Its intended -use is to reboot the machine, using the /etc/reboot command or -equivalent. -

    Options -

    -

    -server -
    Indicates the server machine on which to execute the command. -Identify the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -cmd -
    Specifies the complete local disk pathname of the command to execute (for -example, /etc/reboot). Surround this argument with double -quotes ("") if the command contains one or more spaces. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command reboots the machine -fs2.abc.com. The issuer has previously issued -the bos shutdown command to shutdown all processes cleanly. -

       % bos exec -server fs2.abc.com -cmd /sbin/shutdown -r now
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    bos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf101.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf101.htm deleted file mode 100755 index 2145872e0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf101.htm +++ /dev/null @@ -1,120 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos getdate

    - - - - - - - - - - - -

    Purpose -

    Displays the time stamps on an AFS binary file -

    Synopsis -

    bos getdate -server <machine name>  -file <files to check>+
    -            [-dir <destination dir>]  [-cell <cell name>]
    -            [-noauth]  [-localauth]  [-help]
    -    
    -bos getd -s <machine name>  -f <files to check>+  [-d <destination dir>]
    -         [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos getdate command displays the time stamps on the current -version, .BAK version (if any) and .OLD -version (if any) of each binary file named by the -file -argument. (The BOS Server automatically creates .BAK -and .OLD versions when new binaries are installed with the -bos install command.) The files must reside in the -/usr/afs/bin directory on the server machine named by the --server argument unless the -dir argument indicates an -alternate directory. -

    To revert to the .BAK version of a binary, use the -bos uninstall command. To remove obsolete binary files from -the /usr/afs/bin directory, use the bos prune -command. -

    Options -

    -

    -server -
    Indicates the server machine from which to list binary files. -Identify the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    All server machines of the same AFS system type show the same timestamps if -the binaries were installed properly on the binary distribution machine for -this machine's system type, and if all other machines of that type are -running the appropriate upclientbin process. -

    -file -
    Names each binary file to list. -

    -dir -
    Specifies the complete pathname of the local disk directory containing -each file named by the -file argument. It is necessary only -if the files are not in the /usr/afs/bin directory. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    For each file specified with the -file argument, the output -displays the time stamp on the current (unmarked), .BAK, and -.OLD version. The output explicitly reports that a -version does not exist, rather than simply omitting it. -

    Examples -

    The following command examines the time stamps on the files with basename -kaserver on the machine fs2.abc.com: -

       % bos getdate -server fs2.abc.com -file kaserver
    -   File /usr/afs/bin/kaserver dated Mon Jan 4 10:00:36 1999.
    -   .BAK file dated Wed Dec 9 18:55:04 1998, no .OLD file.
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    KeyFile -

    bos -

    bos install -

    bos prune -

    bos uninstall -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf102.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf102.htm deleted file mode 100755 index 6e86ed76c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf102.htm +++ /dev/null @@ -1,136 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos getlog

    - - - - - - - - - -

    Purpose -

    Prints a server process's log file -

    Synopsis -

    bos getlog -server <machine name>  -file <log file to examine>
    -           [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos getl -s <machine name>  -f <log file to examine>  [-c <cell name>]     
    -         [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos getlog command displays on the standard output stream -the specified log file from the machine named by the -server -argument. The BOS Server fetches the log file from the -/usr/afs/logs directory unless an alternate pathname is provided as -part of the -file argument. -

    Cautions -

    Log files can grow quite large, especially for the database server -processes. To keep them to a manageable size, periodically either use -the UNIX rm command to truncate each log file, or use the bos -restart command to restart each process. -

    It can take up to five minutes after the file is removed or process -restarted for the space occupied by a log file to become available. -

    Options -

    -

    -server -
    Indicates the server machine from which to retrieve the log file. -Identify the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -file -
    Names the log file to display. If a filename only is provided, the -BOS Server fetches the log file from the /usr/afs/logs -directory; the standard values are: -
    -

    AuthLog -
    The Authentication Server (kaserver) log file -

    BackupLog -
    The Backup Server (buserver) log file -

    BosLog -
    The BOS Server (bosserver) log file -

    FileLog -
    The File Server (fileserver) log file -

    SalvageLog -
    The Salvager (salvager) log file -

    VLLog -
    The Volume Location (VL) Server (vlserver) log file -

    VolserLog -
    The Volume Server (volserver) log file -
    -

    -

    If a pathname and filename are provided, the log file is retrieved from the -indicated directory. Partial pathnames are interpreted relative to the -/usr/afs/logs directory. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output is preceded by the line -

       Fetching log file 'filename'...
    -   
    -
    -

    The remainder of the output depends on the particular log file. -

    Examples -

    The following example displays the FileLog file from the machine -fs3.abc.com: -

       % bos getlog -server fs3.abc.com -file FileLog
    -   Fetching log file 'FileLog'...
    -   Sun Nov 8 04:00:34 1998 File server starting
    -   Sun Nov 8 04:00:39 1998 Partition /vicepa:  attached 21 volumes; 
    -                           0 volumes not attached
    -   Sun Nov 8 04:00:40 1998 File Server started Sun Nov 8 04:00:40 
    -                           1998
    -   Mon Nov 9 21:45:06 1998 CB: RCallBack (zero fid probe in host.c) 
    -                           failed for host 28cf37c0.22811
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    bos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf103.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf103.htm deleted file mode 100755 index f3c5302c2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf103.htm +++ /dev/null @@ -1,134 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos getrestart

    - - - - - - - - - -

    Purpose -

    Displays the automatic restart times for server processes -

    Synopsis -

    bos getrestart -server <machine name>  [-cell <cell name>]  
    -               [-noauth]  [-localauth]  [-help]
    -   
    -bos getr -s <machine name>  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos getrestart command displays two restart times from the -/usr/afs/local/BosConfig file on the server machine named by the --server argument: -

      -

    • The general restart time at which the BOS Server process -automatically restarts itself and all processes marked with status -Run in the BosConfig file. The default is Sunday -at 4:00 a.m. -

    • The binary restart time at which the BOS Server automatically -restarts any process for which the time stamp on the binary file in the -/usr/afs/bin directory is later than the last restart time for the -process. The default is 5:00 a.m. Use the bos -getdate command to list a binary file's timestamp, and the --long flag to the bos status command to display a -process's most recent restart time. -
    -

    Use the bos setrestart command to set the restart times. -

    Options -

    -

    -server -
    Indicates the server machine for which to display the restart -times. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output consists of two lines: -

       Server machine_name restarts at time
    -   Server machine_name restarts for new binaries at time
    -   
    -
    -

    Possible values for time include: -

      -

    • never, indicating that the BOS Server never performs that type -of restart -

    • now, indicating that the BOS Server performs that type of -restart only each time it restarts -

    • A specified day and time, indicating that the BOS Server performs that -type of restart once per week. Example: sun 4:00 -am. -

    • A specified time, indicating that the BOS Server performs that type of -restart once per day. Examples: 11:00 pm, -3:00 am. -
    -

    Examples -

    The following example displays the restart times for the machine -db2.abc.com: -

       % bos getrestart db2.abc.com
    -   Server db2.abc.com restarts at sun 4:00 am
    -   Server db2.abc.com restarts for new binaries at 2:15 am
    -   
    -
    -

    In the following example, the issuer abbreviates the machine name -fs1.abc.com to fs1, relying on the -cell's name server to resolve the name. The output echoes the -abbreviated form. -

       % bos getrestart fs1
    -   Server fs1 restarts at sat 5:00 am
    -   Server fs1 restarts for new binaries at 11:30 pm
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    BosConfig -

    KeyFile -

    bos -

    bos getdate -

    bos setrestart -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf104.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf104.htm deleted file mode 100755 index 53f5b88f0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf104.htm +++ /dev/null @@ -1,85 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos help

    - - - -

    Purpose -

    Displays the syntax of specified bos commands or lists -functional descriptions of all bos commands -

    Synopsis -

    bos help [-topic <help string>+]  [-help]
    -     
    -bos h [-t <help string>+]  [-h]
    -
    -

    Description -

    The bos help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every bos command. -

    To list every bos command whose name or short description -includes a specified keyword, use the bos apropos command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the bos part of the command name, providing only -the operation code (for example, specify status, not bos -status). If this argument is omitted, the output briefly -describes every bos command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each bos command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the bos -status command: -

       % bos help status
    -   bos status: show server instance status 
    -   Usage: bos status -server <machine name> [-instance <server
    -   process name>+] [-long] [-cell <cell name>] [-noauth] 
    -   [-localauth] [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    bos -

    bos apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf105.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf105.htm deleted file mode 100755 index a33b408a8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf105.htm +++ /dev/null @@ -1,137 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos install

    - - - - - - - - -

    Purpose -

    Installs a new version of a binary file -

    Synopsis -

    bos install -server <machine name>  -file <files to install>+
    -            [-dir <destination dir>]  [-cell <cell name>]  
    -            [-noauth]  [-localauth]  [-help]
    -    
    -bos i -s <machine name>  -f <files to install>+
    -      [-d <destination dir>]  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos install command copies each binary file specified with -the -file argument to the local disk of the server machine named by -the -server argument, which is normally the binary distribution -machine for its CPU/operating system type. The destination directory is -/usr/afs/bin unless the -dir argument indicates an -alternate directory. The source file's UNIX mode bits are -preserved in the transfer. -

    If there is already a file of the same name in the destination directory, -the BOS Server automatically saves it by adding a .BAK -extension. If there is a current .BAK version at -least seven days old, it replaces the current .OLD -version. If there is no current .OLD version, the -current .BAK version becomes the .OLD -version automatically. The bos getdate command displays the -timestamps on the current versions of the file. -

    To start using the new binary immediately, issue the bos restart -command. Otherwise, the BOS Server automatically restarts the process -at the time defined in the /usr/afs/local/BosConfig file; use -the bos getrestart command to display the time and the bos -setrestart time to set it. -

    Options -

    -

    -server -
    Indicates the binary distribution machine on which to install the new -binaries. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    If the machine is not a binary distribution machine and is running an -upclientbin process, then the files are overwritten the next time -the upclientbin process fetches the corresponding file from the -distribution machine (by default within five minutes). -

    -file -
    Specifies the complete pathname of each binary file to copy into the -destination directory. Each source directory can be on the local disk -or in AFS, in which case the issuer of the bos install command must -have the necessary AFS access rights and the local machine must run the Cache -Manager. For the BOS Server to create .BAK and -.OLD versions, the last element in the pathname (the -filename) must match the name of a file in the destination directory. -The reference page for the bos create command lists the standard -binary file names. -

    -dir -
    Provides the complete pathname of the local disk directory in which to -install binary files. It is necessary only if the destination directory -is not /usr/afs/bin. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command copies the file -/afs/abc.com/rs_aix42/usr/afs/bin/vlserver to the file -/usr/afs/bin/vlserver on the machine -fs3.abc.com, which is the binary distribution machine -for server machines running AIX 4.2 in the abc.com -cell. The current version of the /usr/afs/bin/vlserver file -is moved to /usr/afs/bin/vlserver.BAK. -

       % bos install -server fs3.abc.com    \     
    -                 -file /afs/abc.com/rs_aix42/usr/afs/bin/vlserver
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos getdate -

    bos getrestart -

    bos restart -

    bos setrestart -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf106.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf106.htm deleted file mode 100755 index 913142cf7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf106.htm +++ /dev/null @@ -1,112 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos listhosts

    - - - - - - - -

    Purpose -

    Displays the contents of the /usr/afs/etc/CellServDB file -

    Synopsis -

    bos listhosts -server <machine name>  [-cell <cell name>]  
    -              [-noauth]  [-localauth]  [-help]
    -    
    -bos listh -s <machine name>  [-c <cell name>]  [-n]  [-l]  [-h]
    -   
    -bos getcell -server <machine name>  [-cell <cell name>]  
    -            [-noauth]  [-localauth]  [-help]
    -    
    -bos getc -s <machine name>  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos listhosts command formats and displays the list of a -cell's database server machines from the -/usr/afs/etc/CellServDB file on the server machine named by the --server argument. -

    To alter the list of machines, use the bos addhost and bos -removehost commands. -

    Options -

    -

    -server -
    Indicates the server machine from which to display the -/usr/afs/etc/CellServDB file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    For consistent performance in the cell, the output must be the same on -every server machine. The bos addhost reference page -explains how to keep the machines synchronized. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of the output names the cell to which the server machine -belongs. Each of the following lines names a database server machine -for that cell. -

    The Host number assigned to each database server machine is for -server-internal use only and is not the same as, nor necessarily related to, -the machine's IP address. The BOS Server assigned it as part of -performing the bos addhost command. -

    Examples -

    The following command displays the database server machines listed in the -/usr/afs/etc/CellServDB file on the machine -fs7.abc.com. -

       % bos listhosts fs7.abc.com
    -   Cell name is abc.com
    -       Host 1 is db1.abc.com
    -       Host 2 is db2.abc.com
    -       Host 3 is db3.abc.com
    -    
    -
    -

    Privilege Required -

    None -

    Related Information -

    CellServDB (server version) -

    KeyFile -

    bos -

    bos addhost -

    bos removehost -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf107.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf107.htm deleted file mode 100755 index 3ce7b78c6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf107.htm +++ /dev/null @@ -1,136 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos listkeys

    - - - - - - - -

    Purpose -

    Displays the server encryption keys from the -/usr/afs/etc/KeyFile file -

    Synopsis -

    bos listkeys -server <machine name>  [-showkey]  [-cell <cell name>]  
    -             [-noauth]  [-localauth]  [-help]
    -   
    -bos listk -se <machine name>  [-sh]  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos listkeys command formats and displays the list of server -encryption keys from the /usr/afs/etc/KeyFile file on the server -machine named by the -server argument. -

    To edit the list of keys, use the bos addkey and bos -removekey commands. -

    Cautions -

    Displaying actual keys on the standard output stream (by including the --showkey flag) is a security exposure. Displaying a checksum -is sufficient for most purposes. -

    Options -

    -

    -server -
    Indicates the server machine from which to display the KeyFile -file. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    For consistent performance in the cell, the output must be the same on -every server machine. The bos addkey reference page explains -how to keep the machines synchronized. -

    -showkey -
    Displays the octal digits that constitute each key. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes one line for each server encryption key listed in the -KeyFile file, identified by its key version number. -

    If the -showkey flag is included, the output displays the actual -string of eight octal numbers that constitute the key. Each octal -number is a backslash and three decimal digits. -

    If the -showkey flag is not included, the output represents each -key as a checksum, which is a decimal number derived by encrypting a constant -with the key. -

    Following the list of keys or checksums, the string Keys last -changed indicates when a key was last added to the KeyFile -file. The words All done indicate the end of the -output. -

    For mutual authentication to work properly, the output from the command -kas examine afs must match the key or checksum with the same key -version number in the output from this command. -

    Examples -

    The following example shows the checksums for the keys stored in the -KeyFile file on the machine -fs3.abc.com. -

       % bos listkeys fs3.abc.com
    -   key 1 has cksum 972037177
    -   key 3 has cksum 2825175022
    -   key 4 has cksum 260617746
    -   key 6 has cksum 4178774593
    -   Keys last changed on Mon Apr 12 11:24:46 1999.
    -   All done.
    -    
    -
    -

    The following example shows the actual keys from the KeyFile -file on the machine fs6.abc.com. -

       % bos listkeys fs6.abc.com -showkey
    -   key 0 is '\040\205\211\241\345\002\023\211'
    -   key 1 is '\343\315\307\227\255\320\135\244'
    -   key 2 is '\310\310\255\253\326\236\261\211'
    -   Keys last changed on Wed Mar 31 11:24:46 1999.
    -   All done.
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos addkey -

    bos removekey -

    bos setauth -

    kas examine -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf108.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf108.htm deleted file mode 100755 index 66d7d5517..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf108.htm +++ /dev/null @@ -1,95 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos listusers

    - - - - - -

    Purpose -

    Lists the privileged users from the /usr/afs/etc/UserList file -

    Synopsis -

    bos listusers -server <machine name>  [-cell <cell name>]  
    -              [-noauth]   [-localauth]   [-help]
    -   
    -bos listu -s <machine name>  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos listusers command lists the user names from the -/usr/afs/etc/UserList file on the file server machine named by the --server argument. The users are authorized to issue -privileged bos and vos commands. -

    To edit the list of users, use the bos adduser and bos -removeuser commands. -

    Options -

    -

    -server -
    Indicates the server machine from which to display the UserList -file. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    For consistent performance in the cell, the output must be the same on -every server machine. The bos adduser reference page -explains how to keep the machines synchronized. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output lists the user name of each user entitled to issue privileged -bos and vos commands. -

    Examples -

    The following example lists the users from UserList file on the -machine fs4.abc.com. -

       % bos listusers fs4.abc.com
    -   SUsers are: pat smith jones terry
    -    
    -
    -

    Privilege Required -

    None -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos adduser -

    bos removeuser -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf109.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf109.htm deleted file mode 100755 index b6a4f6762..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf109.htm +++ /dev/null @@ -1,139 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos prune

    - - - - - - - - - - - - - -

    Purpose -

    Removes obsolete versions of files from the /usr/afs/bin and -/usr/afs/logs directories -

    Synopsis -

    bos prune -server <machine name>  [-bak]  [-old]  [-core]  [-all]
    -          [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos p -s <machine name>  [-b]  [-o]  [-co]  [-a]  
    -      [-ce <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos prune command removes files from the local disk of the -server machine named by the -server argument, as specified by one -or more of the following flags provided on the command line: -

      -

    • The -bak flag removes all files from the -/usr/afs/bin directory that have a .BAK -extension. -

    • The -old flag removes all files from the -/usr/afs/bin directory that have a .OLD -extension. -

    • The -core flag removes all files from the -/usr/afs/logs directory that have a core. -prefix. -

    • The -all flag removes all three types of files at once. -
    -

    (If none of these flags are included, the command appears to succeed, but -removes no files at all.) -

    To display the timestamp on the current, .BAK, and -.OLD versions of one or more files, use the bos -getdate command. -

    Options -

    -

    -server -
    Indicates the server machine from which to remove files. Identify -the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -bak -
    Removes all files from the /usr/afs/bin directory that have a -.BAK extension. Do not combine this flag and the --all flag. -

    -old -
    Removes all files from the /usr/afs/bin directory that have a -.OLD extension. Do not combine this flag and the --all flag. -

    -core -
    Removes all files from the /usr/afs/logs directory that have a -core. prefix. Do not combine this flag and the --all flag. -

    -all -
    Combines the effect of the -bak, -old, and --core flags. Do not combine this flag with any of those -three. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example removes all files from the /usr/afs/bin -directory on the machine fs3.abc.com that have a -.BAK or .OLD extension. -

       % bos prune -server fs3.abc.com -bak -old
    -    
    -
    -

    The following example removes all files from the /usr/afs/bin -directory on the machine db2.abc.com that have a -.BAK or .OLD extension, and all files from -the /usr/afs/logs directory that have a core. -prefix. -

       % bos prune -server db2.abc.com -all
    -    
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos getdate -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf110.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf110.htm deleted file mode 100755 index cb22bd959..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf110.htm +++ /dev/null @@ -1,112 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos removehost

    - - - - - -

    Purpose -

    Removes a database server machine from the -/usr/afs/etc/CellServDB file -

    Synopsis -

    bos removehost -server <machine name>  -host <host name>+ 
    -               [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -  
    -bos removeh -s <machine name>  -ho <host name>+  [-c <cell name>]  
    -            [-n]  [-l]  [-he]
    -
    -

    Description -

    The bos removehost command removes the entry for each database -server machine specified with the -host argument from the -/usr/afs/etc/CellServDB file on the server machine named by the --server argument. -

    Cautions -

    After executing this command (and waiting for the Update Server to -propagate the changes, if it is used), restart the database server processes -on all database server machines to force election of a quorum that includes -the new set of machines listed in the /usr/afs/etc/CellServDB -file. The AFS Quick Beginnings explains in more detail how -to add and remove database server machines. -

    Options -

    -

    -server -
    Indicates the server machine on which to change the -/usr/afs/etc/CellServDB file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is conventional to specify only the system control machine as a value for the --server argument. In cells that run the international -version of AFS, repeat the command for each file server machine. For -further discussion, see the introductory reference page for the bos -command suite. -

    -host -
    Specifies the fully-qualified host name (such as -fs2.abc.com) of each database server machine to -remove from the CellServDB file. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes the former database server machine -db2.abc.com from the CellServDB file on -the system control machine fs1.abc.com. -

       % bos removehost -server fs1.abc.com -host db2.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos addhost -

    bos listhosts -

    AFS Quick Beginnings -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf111.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf111.htm deleted file mode 100755 index 332a9a574..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf111.htm +++ /dev/null @@ -1,108 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos removekey

    - - - - - -

    Purpose -

    Removes a server encryption key from the /usr/afs/etc/KeyFile -file -

    Synopsis -

    bos removekey -server <machine name>  -kvno <key version number>+ 
    -              [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos removek -s <machine name>  -k <key version number>+  
    -            [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos removekey command removes each specified encryption key -from the /usr/afs/etc/KeyFile file on the machine named by the --server argument. Use the -kvno argument to -identify each key by its key version number; use the bos -listkeys command to display the key version numbers. -

    Cautions -

    Before removing a obsolete key, verify that the cell's maximum ticket -lifetime has passed since the current key was defined using the kas -setpassword and bos addkey commands. This ensures that -no clients still possess tickets encrypted with the obsolete key. -

    Options -

    -

    -server -
    Indicates the server machine on which to change the -/usr/afs/etc/KeyFile file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is conventional to specify only the system control machine as a value for the --server argument. In cells that run the international -version of AFS, repeat the command for each file server machine. For -further discussion, see the introductory reference page for the bos -command suite. -

    -kvno -
    Specifies the key version number of each key to remove. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes the keys with key version numbers 5 and 6 -from the KeyFile file on the system control machine -fs1.abc.com. -

       % bos removekey -server fs1.abc.com -kvno 5 6
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos addkey -

    bos listkeys -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf112.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf112.htm deleted file mode 100755 index dc6e324a0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf112.htm +++ /dev/null @@ -1,100 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos removeuser

    - - - - - -

    Purpose -

    Removes a privileged user from the /usr/afs/etc/UserList file -

    Synopsis -

    bos removeuser -server <machine name>  -user <user names>+ 
    -               [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -  
    -bos removeu -s <machine name>  -u <user names>+  [-c <cell name>]  
    -            [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos removeuser command removes each user name specified with -the -user argument from the /usr/afs/etc/UserList file -on the machine named by the -server argument. -

    Options -

    -

    -server -
    Indicates the server machine on which to change the -/usr/afs/etc/UserList file. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    In cells that run the United States edition of AFS and use the Update -Server to distribute the contents of the /usr/afs/etc directory, it -is conventional to specify only the system control machine as a value for the --server argument. In cells that run the international -version of AFS, repeat the command for each file server machine. For -further discussion, see the introductory reference page for the bos -command suite. -

    -user -
    Specifies each user name to remove. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example removes the users pat and jones -from the UserList file on the system control machine -fs1.abc.com. -

       % bos removeuser -server fs1.abc.com -user pat jones
    -    
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    UserList -

    bos -

    bos addkey -

    bos listkeys -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf113.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf113.htm deleted file mode 100755 index 9e90aa3a2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf113.htm +++ /dev/null @@ -1,140 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos restart

    - - - - - - -

    Purpose -

    Restarts a server process -

    Synopsis -

    bos restart -server <machine name>  [-instance <instances>+]  [-bosserver]  
    -            [-all]  [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos res -s <machine name>  [-i <instances>+]  [-b]  [-a]  
    -        [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos restart command stops and immediately restarts server -processes on the server machine named by the -server -argument. Indicate which process or processes to restart by providing -one of the following arguments: -

      -

    • The -instance argument names each AFS server process to stop -and restart immediately, regardless of its status flag in the -/usr/afs/local/BosConfig file. Do not include -bosserver in the list of processes; use the --bosserver flag instead. -

    • The -bosserver flag stops all AFS server processes running on -the machine, including the BOS Server. A new BOS Server starts -immediately, and it starts a new instance of each process that is marked with -the Run status flag in the BosConfig file. -

    • The -all flag stops all AFS server processes running on the -machine, except the BOS Server, and immediately restarts the processes that -are marked with the Run status flag in the BosConfig -file. -
    -

    This command does not change a process's status flag in the -BosConfig file. -

    Options -

    -

    -server -
    Indicates the server machine on which to restart each process. -Identify the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -instance -
    Names each process to stop and then restart immediately regardless of its -status flag setting. Use the process name assigned with the --instance argument to the bos create command. The -output from the bos status command lists the names. Provide -this flag or one of the -bosserver or -all options, but -do not combine them. -

    -bosserver -
    Stops all AFS server processes running on the machine, including the BOS -Server. A new BOS Server instance immediately starts, and starts all -processes marked with the Run status flag in the -BosConfig file. Provide this flag or one of the --instance or -all options, but do not combine -them. -

    -all -
    Stops all AFS server processes running on the machine other than the BOS -Server, and immediately restarts the processes marked with the Run -status flag in the BosConfig file. Provide this flag or one -of the -instance or -bosserver options, but do not -combine them. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command stops and restarts all processes running on the -machine fs3.abc.com, including the BOS Server. -

       % bos restart -server fs3.abc.com -bosserver
    -    
    -
    -

    The following command stops and restarts all processes running on the -machine fs5.abc.com, excluding the BOS Server. -

       % bos restart -server fs5.abc.com -all
    -    
    -
    -

    The following command stops and restarts the Protection Server and Volume -Location (VL) Server processes on the machine -db3.abc.com: -

       % bos restart -server db3.abc.com -instance ptserver vlserver
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos create -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf114.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf114.htm deleted file mode 100755 index 86eb839df..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf114.htm +++ /dev/null @@ -1,298 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos salvage

    - - - - - - - - -

    Purpose -

    Restores internal consistency to a file system or volume -

    Synopsis -

    bos salvage -server <machine name>  [-partition <salvage partition>]
    -            [-volume <salvage volume number or volume name>]
    -            [-file <salvage log output file>]  [-all]  [-showlog] 
    -            [-parallel <# of max parallel partition salvaging>]  
    -            [-tmpdir <directory to place tmp files>] 
    -            [-orphans <ignore | remove | attach>] 
    -            [-cell <cell name>]
    -            [-noauth]  [-localauth]  [-help]
    -   
    -bos sa -se <machine name>  [-part <salvage partition>]
    -       [-v <salvage volume number or volume name>]  
    -       [-f <salvage log output file>]  [-a]  [-sh] 
    -       [-para <# of max parallel partition salvaging>]  
    -       [-t <directory to place tmp files>]   
    -       [-o <ignore | remove | attach>] 
    -       [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos salvage command salvages (restores internal consistency -to) one or more volumes on the file server machine named by the --server argument. When processing one or more partitions, -the command restores consistency to corrupted read/write volumes where -possible. For read-only or backup volumes, it inspects only the volume -header: -

      -

    • If the volume header is corrupted, the Salvager removes the volume -completely and records the removal in its log file, -/usr/afs/logs/SalvageLog. Issue the vos release -or vos backup command to create the read-only or backup volume -again. -

    • If the volume header is intact, the Salvager skips the volume (does not -check for corruption in the contents). However, if the File Server -notices corruption as it initializes, it sometimes refuses to attach the -volume or bring it online. In this case, it is simplest to remove the -volume by issuing the vos remove or vos zap -command. Then issue the vos release or vos backup -command to create it again. -
    -

    Use the indicated arguments to salvage a specific number of volumes: -

      -

    • To process all volumes on a file server machine, provide the --server argument and the -all flag. No volumes on -the machine are accessible to Cache Managers during the salvage operation, -because the BOS Server stops the File Server and Volume Server processes while -the Salvager runs. The BOS Server automatically restarts them when the -operation completes. -

    • To process all volumes on one partition, provide the -server -and -partition arguments. As for a salvage of the entire -machine, no volumes on the machine are accessible to Cache Managers during the -salvage operation. The BOS Server automatically restarts the File -Server and Volume Server when the operation completes. -

    • To salvage only one read/write volume, combine the -server, --partition, and -volume arguments. Only that -volume is inaccessible to Cache Managers, because the BOS Server does not -shutdown the File Server and Volume Server processes during the salvage of a -single volume. Do not name a read-only or backup volume with the --volume argument. Instead, remove the volume, using the -vos remove or vos zap command. Then create a new -copy of the volume with the vos release or vos backup -command. -
    -

    During the salvage of an entire machine or partition, the bos -status command reports the fs process's auxiliary status -as Salvaging file system. -

    The Salvager always writes a trace to the -/usr/afs/logs/SalvageLog file on the file server machine where it -runs. To record the trace in another file as well (either in AFS or on -the local disk of the machine where the bos salvage command is -issued), name the file with the -file argument. To display -the trace on the standard output stream as it is written to the -/usr/afs/logs/SalvageLog file, include the -showlog -flag. -

    By default, multiple Salvager subprocesses run in parallel: one for -each partition up to four, and four subprocesses for four or more -partitions. To increase or decrease the number of subprocesses running -in parallel, provide a positive integer value for the -parallel -argument. -

    If there is more than one server partition on a physical disk, the Salvager -by default salvages them serially to avoid the inefficiency of constantly -moving the disk head from one partition to another. However, this -strategy is often not ideal if the partitions are configured as logical -volumes that span multiple disks. To force the Salvager to salvage -logical volumes in parallel, provide the string all as the value -for the -parallel argument. Provide a positive integer to -specify the number of subprocesses to run in parallel (for example, --parallel 5all for five subprocesses), or omit the integer to run -up to four subprocesses, depending on the number of logical volumes being -salvaged. -

    The Salvager creates temporary files as it runs, by default writing them to -the partition it is salvaging. The number of files can be quite large, -and if the partition is too full to accommodate them, the Salvager terminates -without completing the salvage operation (it always removes the temporary -files before exiting). Other Salvager subprocesses running at the same -time continue until they finish salvaging all other partitions where there is -enough disk space for temporary files. To complete the interrupted -salvage, reissue the command against the appropriate partitions, adding the --tmpdir argument to redirect the temporary files to a local disk -directory that has enough space. -

    The -orphans argument controls how the Salvager handles orphaned -files and directories that it finds on server partitions it is -salvaging. An orphaned element is completely inaccessible -because it is not referenced by the vnode of any directory that can act as its -parent (is higher in the filespace). Orphaned objects occupy space on -the server partition, but do not count against the volume's quota. -

    Cautions -

    Running this command can result in data loss if the Salvager process can -repair corruption only by removing the offending data. Consult the -AFS Administration Guide for more information. -

    Options -

    -

    -server -
    Indicates the file server machine on which to salvage volumes. -Identify the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -partition -
    Specifies a single partition on which to salvage all volumes. -Provide the complete partition name (for example /vicepa) or one of -the following abbreviated forms: -
       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    -volume -
    Specifies the name or volume ID number of a read/write volume to -salvage. The -partition argument must be provided along with -this one. -

    -file -
    Specifies the complete pathname of a file into which to write a trace of -the salvage operation, in addition to the /usr/afs/logs/SalvageLog -file on the server machine. If the file pathname is local, the trace is -written to the specified file on the local disk of the machine where the -bos salvage command is issued. If the -volume -argument is included, the file can be in AFS, though not in the volume being -salvaged. Do not combine this argument with the -showlog -flag. -

    -all -
    Salvages all volumes on all of the partitions on the machine named by the --server argument. -

    -showlog -
    Displays the trace of the salvage operation on the standard output stream, -as well as writing it to the /usr/afs/logs/SalvageLog file. -Do not combine this flag with the -file argument. -

    -parallel -
    Specifies the maximum number of Salvager subprocesses to run in -parallel. Provide one of three values: -
      -

    • An integer from the range 1 to 32. A value of -1 means that a single Salvager process salvages the partitions -sequentially. -

    • The string all to run up to four Salvager subprocesses in -parallel on partitions formatted as logical volumes that span multiple -physical disks. Use this value only with such logical volumes. -

    • The string all followed immediately (with no intervening space) -by an integer from the range 1 to 32, to run the -specified number of Salvager subprocesses in parallel on partitions formatted -as logical volumes. Use this value only with such logical -volumes. -
    -

    The BOS Server never starts more Salvager subprocesses than there are -partitions, and always starts only one process to salvage a single -volume. If this argument is omitted, up to four Salvager subprocesses -run in parallel. -

    -tmpdir -
    Specifies the full pathname of a local disk directory to which the -Salvager process writes temporary files as it runs. If this argument is -omitted, or specifies an ineligible or nonexistent directory, the Salvager -process writes the files to the partition it is currently salvaging. -

    -orphans -
    Controls how the Salvager handles orphaned files and directories. -Choose one of the following three values: -
    -

    ignore -
    Leaves the orphaned objects on the disk, but prints a message to the -/usr/afs/logs/SalvageLog file reporting how many orphans were found -and the approximate number of kilobytes they are consuming. This is the -default if the -orphans argument is omitted. -

    remove -
    Removes the orphaned objects, and prints a message to the -/usr/afs/logs/SalvageLog file reporting how many orphans were -removed and the approximate number of kilobytes they were consuming. -

    attach -
    Attaches the orphaned objects by creating a reference to them in the vnode -of the volume's root directory. Since each object's actual -name is now lost, the Salvager assigns each one a name of the following -form: -
    -

    _ _ORPHANFILE_ _.index for files -

    _ _ORPHANDIR_ _.index for directories -

    -

    -

    where index is a two-digit number that uniquely identifies each -object. The orphans are charged against the volume's quota and -appear in the output of the ls command issued against the -volume's root directory. -

    -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command salvages all volumes on the /vicepd -partition of the machine db3.abc.com: -

       % bos salvage -server db3.abc.com -partition /vicepd
    -   
    -
    -

    The following command salvages the volume with volume ID number 536870988 -on partition /vicepb of the machine -fs2.abc.com: -

       % bos salvage -server fs2.abc.com -partition /vicepb -volume 536870988
    -   
    -
    -

    The following command salvages all volumes on the machine -fs4.abc.com. Six Salvager processes run in -parallel rather than the default four. -

       % bos salvage -server fs4.abc.com -all -parallel 6
    -    
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    SalvageLog -

    UserList -

    bos -

    salvager -

    vos backup -

    vos release -

    vos remove -

    vos zap -

    AFS Administration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf115.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf115.htm deleted file mode 100755 index 43a43e017..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf115.htm +++ /dev/null @@ -1,112 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos setauth

    - - - - - -

    Purpose -

    Sets authorization checking requirements for all server processes -

    Synopsis -

    bos setauth -server <machine name>  
    -     -authrequired <on or off: authentication required for admin requests>
    -     [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos seta -s <machine name>
    -         -a <on or off: authentication required for admin requests>  
    -         [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos setauth command enables or disables authorization -checking on the server machine named by the -server -argument. When authorization checking is enabled (the normal case), the -AFS server processes running on the machine verify that the issuer of a -command meets its privilege requirements. When authorization checking -is disabled, server processes perform any action for anyone, including the -unprivileged user anonymous; this security exposure precludes -disabling of authorization checking except during installation or -emergencies. -

    To indicate to the server processes that authorization checking is -disabled, the BOS Server creates the zero-length file -/usr/afs/local/NoAuth on its local disk. All AFS server -processes constantly monitor for the NoAuth file's presence -and do not check for authorization when it is present. The BOS Server -removes the file when this command is used to reenable authorization -checking. -

    Cautions -

    Do not create the NoAuth file directly, except when directed by -instructions for dealing with emergencies (doing so requires being logged in -as the local superuser root). Use this command -instead. -

    Options -

    -

    -server -
    Indicates the server machine on which to enable or disable authorization -checking. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    -authrequired -
    Enables authorization checking if the value is on, or disables -it if the value is off. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example disables authorization checking on the machine -fs7.abc.com: -

       % bos setauth -server fs7.abc.com -authrequired off
    -    
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    KeyFile -

    NoAuth -

    UserList -

    bos -

    bos restart -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf116.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf116.htm deleted file mode 100755 index 71767420b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf116.htm +++ /dev/null @@ -1,128 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos setcellname

    - - - - - - - - -

    Purpose -

    Sets the cell's name in the /usr/afs/etc/ThisCell and -/usr/afs/etc/CellServDB files -

    Synopsis -

    bos setcellname -server <machine name>  -name <cell name> 
    -                [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -   
    -bos setc -s <machine name>  -n <cell name>  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos setcellname command establishes the cell's name and -makes the server machine named by the -server argument a member of -it, by recording the value of the -name argument in two files which -it creates on the local disk: -

      -

    • /usr/afs/etc/ThisCell -

    • /usr/afs/etc/CellServDB. The cell name appears on the -first line in the file, preceded by the required > symbol. -The machine name specified with the -server argument appears on the -second line along with its IP address as obtained from the cell's naming -service. The machine is thus designated as the cell's first -database server machine. -
    -

    Cautions -

    Issue this command only when the installing the cell's first AFS -server machine. The AFS Quick Beginnings explains how to -copy over the ThisCell and CellServDB files from this or -another appropriate machine during installation of additional server -machines. -

    Be sure to choose a satisfactory cell name when issuing this command, -because changing a cell's name is very complicated; for one thing, -it requires changing every password in the Authentication Database. -Consult the AFS Administration Guide for advice on choosing a cell -name. If changing the cell's name is absolutely necessary, contact -AFS Product Support for complete instructions. -

    Options -

    -

    -server -
    Indicates the server machine on which to set the cell name in the -ThisCell and CellServDB file. It is always the -first machine installed in a cell. Identify the machine by IP address -or its host name (either fully-qualified or abbreviated unambiguously). -For details, see the introductory reference page for the bos -command suite. -

    -name -
    Defines the cell name, using standard Internet domain name format (the -actual domain name is usually appropriate). Examples are -abc.com for the ABC Corporation and -stateu.edu for the State University. It must match -the value of the -cell argument, if that is provided. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command defines the cell name abc.com in -the ThisCell and CellServDB files on the machine -fs1.abc.com as it is installed as the cell's -first server machine. -

       % bos setcellname -server fs1.abc.com -name abc.com
    -   
    -
    -

    Privilege Required -

    Authorization checking is normally turned off during installation, which is -the only recommended time to use this command; in this case no privilege -is required. If authorization checking is turned on, the issuer must be -listed in the /usr/afs/etc/UserList file on the machine named by -the -server argument, or must be logged in as the local superuser -root if the -localauth flag is included. -

    Related Information -

    CellServDB (server version) -

    KeyFile -

    ThisCell (server version) -

    UserList -

    bos -

    AFS Quick Beginnings -

    AFS Administration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf117.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf117.htm deleted file mode 100755 index 6ab89e0fb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf117.htm +++ /dev/null @@ -1,158 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos setrestart

    - - - - - - -

    Purpose -

    Sets the date and time at which the BOS Server restarts processes -

    Synopsis -

    bos setrestart -server <machine name>  -time <time to restart server>  
    -               [-general]   [-newbinary]  [-cell <cell name>]  
    -               [-noauth]  [-localauth]  [-help]  
    -    
    -bos setr -s <machine name>  -t <time to restart server>  [-g]  [-ne] 
    -         [-c <cell name>]  [-no]  [-l]  [-h]
    -
    -

    Description -

    The bos setrestart command records in the -/usr/afs/local/BosConfig file the times at which the BOS Server -running on the server machine named by the -server argument -performs two types of restarts: -

      -

    • A general restart. By default, once per week the BOS -Server restarts itself and then any AFS process marked with the Run -status flag in the BosConfig file (equivalent in effect to issuing -the bos restart command with the -bosserver -flag). The default setting is 4:00 a.m. each Sunday -morning. -

    • A binary restart. By default, once per day the BOS -Server restarts any currently running process for which the timestamp on the -binary file in the /usr/afs/bin directory is later than the time -the process last started or restarted. The default is 5:00 -a.m. each day. -
    -

    Cautions -

    Restarting a process makes it unavailable for a period of time. The -fs process has potentially the longest outage, depending on how -many volumes the file server machine houses (the File Server and Volume Server -reattach each volume when they restart). The default settings are -designed to coincide with periods of low usage, so that the restarts disturb -the smallest possible number of users. -

    If the setting specified with the -time argument is within one -hour of the current time, the BOS Server does not restart any processes until -the next applicable opportunity (the next day for binary restarts, or the next -week for general restarts). -

    The command changes only one type of restart setting at a time; issue -the command twice to change both settings. -

    Options -

    -

    -server -
    Indicates the server machine on which to set a new restart time. -Identify the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -time -
    Specifies the restart time. By convention the general restart is -defined as weekly (specifies both a day and a time), and the binary restart is -defined as daily (specifies only a time). However, it is acceptable to -define a daily general restart or weekly binary restart. -

    There are four acceptable values for either type of restart setting: -

      -

    • The string never, which directs the BOS Server never to perform -the indicated type of restart. -

    • The string now, which directs the BOS Server to perform the -restart immediately and never again. -

    • A time of day (the conventional type of value for the binary restart -time). Separate the hours and minutes with a colon -(hh:MM), and use either 24-hour format, or a value -in the range from 1:00 through 12:59 with -the addition of am or pm. For example, both -14:30 and "2:30 pm" indicate 2:30 in -the afternoon. Surround this parameter with double quotes (" -") if it contains a space. -

    • A day of the week and time of day, separated by a space and surrounded -with double quotes (" "). This is the conventional type of -value for the general restart. For the day, provide either the whole -name or the first three letters, all in lowercase letters (sunday -or sun, thursday or thu, and so on). -For the time, use the same format as when specifying the time alone. -
    -

    If desired, precede a time or day and time definition with the string -every or at. These words do not change the -meaning, but possibly make the output of the bos getrestart command -easier to understand. -

    -general -
    Sets the general restart time. -

    -newbinary -
    Sets the binary restart time. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command sets the general restart time on the machine -fs4.abc.com to Saturday at 3:30 am. -

       % bos setrestart -server fs4.abc.com -time "sat 3:30" -general
    -   
    -
    -

    The following command sets the binary restart time on the machine -fs6.abc.com to 11:45 pm. -

       % bos setrestart -server fs6.abc.com -time 23:45 -newbinary
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos getrestart -

    bos restart -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf118.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf118.htm deleted file mode 100755 index d119e6bea..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf118.htm +++ /dev/null @@ -1,122 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos shutdown

    - - - - - - -

    Purpose -

    Stops a process without changing its status flag in the -/usr/afs/local/BosConfig file -

    Synopsis -

    bos shutdown -server <machine name>  [-instance <instances>+]  [-wait]  
    -             [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -    
    -bos sh -s <machine name>  [-i <instances>+]  [-w]  
    -       [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos shutdown command stops, on the server machine named by -the -server argument, either -

      -

    • All of the currently running AFS server processes, except the BOS Server -

    • Only the processes specified by the -instance argument -
    -

    This command does not change a process's status flag in the -/usr/afs/local/BosConfig file, but only in the BOS Server's -memory. To stop a process and change its BosConfig status -flag, use the bos stop command instead. -

    Once stopped with this command, a process does not run again until an -administrator starts it by using the bos start, bos -startup, or bos restart command, or until the BOS Server -restarts (assuming that the process's BosConfig status flag is -Run). -

    Options -

    -

    -server -
    Indicates the server machine on which to stop processes. Identify -the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -instance -
    Names each process to stop. Use the process name assigned with the --instance argument to the bos create command. The -output from the bos status command lists the names. Omit -this argument to stop all processes other than the BOS Server. -

    -wait -
    Delays the return of the command shell prompt until all processes actually -stop. If this argument is omitted, the prompt returns almost -immediately even if all processes are not stopped. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command stops all processes other than the BOS Server on the -machine fs3.abc.com. -

       % bos shutdown fs3.abc.com
    -   
    -
    -

    The following command stops the upserver process (server portion -of the Update Server) on the machine -fs5.abc.com. -

       % bos shutdown -server fs5.abc.com -instance upserver
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos create -

    bos restart -

    bos start -

    bos startup -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf119.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf119.htm deleted file mode 100755 index ca1e16240..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf119.htm +++ /dev/null @@ -1,108 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos start

    - - - - - - - - -

    Purpose -

    Starts a process after setting its status flag in the -/usr/afs/local/BosConfig file -

    Synopsis -

    bos start -server <machine name>  -instance <server process name>+ 
    -          [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -    
    -bos start -s <machine name>  -i <server process name>+  
    -          [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos start command sets the status flag for each process -specified by the -instance argument to Run in the -/usr/afs/local/BosConfig file and in the BOS Server's memory -on the server machine named by the -server argument, then starts -it. If the process is already running, the command's only effect -is to guarantee that the status flag is Run; it does not -restart the process. -

    To start a process without changing its status flag in the -BosConfig file, use the bos startup command -instead. -

    Options -

    -

    -server -
    Indicates the server machine on which to start processes. Identify -the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -instance -
    Names each process to start. Use the process name assigned with the --instance argument to the bos create command. The -output from the bos status command lists the names. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command changes the status flag for the -upclientbin and upclientetc processes to Run -in the BosConfig file on the machine -fs6.abc.com and starts them running. -

       % bos start -server fs6.abc.com -instance upclientbin upclientetc
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos create -

    bos startup -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf120.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf120.htm deleted file mode 100755 index e78b9ab79..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf120.htm +++ /dev/null @@ -1,112 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos startup

    - - - - - - -

    Purpose -

    Starts a process without changing its status flag in the -/usr/afs/local/BosConfig file -

    Synopsis -

    bos startup -server <machine name>  [-instance <instances>+] 
    -            [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -    
    -bos startu -s <machine name>  [-i <instances>+]  
    -           [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos startup command starts, on the server machine named by -the -server argument, either -

      -

    • All AFS server processes not currently running but marked with the -Run status flag in the /usr/afs/local/BosConfig file -

    • Each process specified by -instance argument, even if its -status flag in the BosConfig file is NotRun. -
    -

    To start a process and set its BosConfig status flag to -Run, use the bos start command instead. -

    Options -

    -

    -server -
    Indicates the server machine on which to start processes. Identify -the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -instance -
    Names each process to start. Use the process name assigned with the --instance argument to the bos create command. The -output from the bos status command lists the names. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command starts all processes marked with status flag -Run in the BosConfig file on the machine -fs3.abc.com that are not currently running. -

       % bos startup fs3.abc.com
    -   
    -
    -

    The following command starts the buserver, kaserver, -ptserver, and vlserver processes running on the machine -db2.abc.com, even if their status flags in the -BosConfig file are NotRun. -

       % bos startup -server db2.abc.com -instance buserver kaserver ptserver vlserver
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos create -

    bos start -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf121.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf121.htm deleted file mode 100755 index 5e5786847..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf121.htm +++ /dev/null @@ -1,235 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos status

    - - - - - - - -

    Purpose -

    Displays the status of server processes -

    Synopsis -

    bos status -server <machine name>  [-instance <server process name>+]  
    -           [-long]  [-cell <cell name>]  [-noauth]  [-localauth]  [-help] 
    -    
    -bos stat -s <machine name>  [-i <server process name>+] 
    -         [-lon]  [-c <cell name>]  [-n]  [-loc]  [-h] 
    -
    -

    Description -

    The bos status command reports the status of processes on the -server machine named by the -server argument, either -

      -

    • All of the AFS server processes listed in the -/usr/afs/local/BosConfig file -

    • Only these processes named by the -instance argument -
    -

    Options -

    -

    -server -
    Indicates the server machine for which to report server process -status. Identify the machine by IP address or its host name (either -fully-qualified or abbreviated unambiguously). For details, see the -introductory reference page for the bos command suite. -

    -instance -
    Names each process for which to report status. Use the process name -assigned with the -instance argument to the bos -command. The output from the bos status command lists the -names. -

    -long -
    Produces more detailed status information. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output for a process includes at least one line, which reports one of -the following as the process's current status: -

      -

    • currently running normally. The process's status -flag in the BosConfig file is Run. For -cron entries, this message indicates only that the command is -scheduled to run, not necessarily that it was executing when the bos -status command was issued. -

    • disabled. The process is not running, and its -BosConfig status flag is NotRun. -

    • temporarily disabled. The process is not running -although its status flag in the BosConfig file is -Run. Either an administrator used the bos -shutdown command to stop it, or the -

    • BOS Server stopped trying to restart it after numerous failed -attempts. In the second case, the auxiliary message is stopped for - too many errors. -

    • temporarily enabled. The process is running although its -status flag in the BosConfig file is NotRun. An -administrator has used the bos startup command to start it. -
    -

    If one of the following special circumstances applies to the process, the -indicated message appears in its entry: -

      -

    • has core file. The process failed and created a core -file in the /usr/afs/logs directory. If the BOS Server was -able to restart the process after the failure, the primary status is -currently running normally. -

    • stopped for too many errors. The reason for the primary -status temporarily disabled is that the BOS Server's attempts -to restart the process all failed. -
    -

    The entry for the fs process always includes a second line to -report the process's Auxiliary status, which is one of the -following: -

      -

    • file server running. The File Server and Volume Server -components of the File Server process are running normally. -

    • salvaging file system. The Salvager is running, so the -File Server and Volume Server are temporarily disabled. The BOS Server -restarts them as soon as the Salvager is finished. -
    -

    The entry for a cron process includes an Auxiliary -status that reports when the command will next execute. -

    If the -long flag is used, each entry includes the following -additional information: -

      -

    • The process's type (simple, fs, or -cron). -

    • The day and time the process last started or restarted. -

    • The number of proc starts, which is how many times the BOS -Server has started or restarted the process since it started itself. -

    • The Last exit time when the process (or one of the component -processes in the fs process) last terminated. This line does -not appear if the process has not terminated since the BOS Server -started. -

    • The Last error exit time when the process (or one of the -component processes in the fs process) last failed due to an -error. A further explanation such as due to shutdown request -sometimes appears. This line does not appear if the process has not -failed since the BOS Server started. -

    • Each command that the BOS Server invokes to start the process, as -specified by the -cmd argument to the bos create -command. -

    • The pathname of the notifier program that the BOS Server invokes when the -process terminates (if any), as specified by the -notifier argument -to the bos create command. -
    -

    If the -long flag is provided and the BOS Server discovers that -the mode bits on files and subdirectories in the local /usr/afs -directory differ from the expected values, it prints the following warning -message: -

       Bosserver reports inappropriate access on server directories
    -   
    -
    -

    The following chart summarizes the expected mode bit settings. A -question mark indicates that the BOS Server does not check that bit. -
    - - - - - - - - - - -
    /usr/afs -drwxr?xr-x -
    /usr/afs/backup -drwx???--- -
    /usr/afs/bin -drwxr?xr-x -
    /usr/afs/db -drwx???--- -
    /usr/afs/etc -drwxr?xr-x -
    /usr/afs/etc/KeyFile --rw????--- -
    /usr/afs/etc/UserList --rw?????-- -
    /usr/afs/local -drwx???--- -
    /usr/afs/logs -drwxr?xr-x -
    -

    Examples -

    The following example command displays the status of processes on the -machine fs3.abc.com: -

       % bos status fs3.abc.com
    -   Instance buserver, currently running normally.
    -   Instance kaserver, currently running normally.
    -   Instance ptserver, currently running normally.
    -   Instance vlserver, currently running normally.
    -   Instance fs, has core file, currently running normally.
    -       Auxiliary status is: file server running.
    -   Instance upserver, currently running normally.
    -   Instance runntp, currently running normally.
    -   
    -
    -

    The following example command displays a detailed status report for the -fs and ptserver processes on the machine -fs1.abc.com. -

       % bos status -server fs1.abc.com -instance fs ptserver -long
    -   Instance fs, (type is fs), currently running normally.
    -      Auxiliary status is: file server running.
    -      Process last started at Wed Jan 7 5:34:49 1998 (3 proc starts)
    -      Last exit at Wed Jan 7 5:34:49 1998 
    -      Last error exit at Wed Jan 7 5:34:49 1998, due to shutdown 
    -          request
    -      Command 1 is '/usr/afs/bin/fileserver'
    -      Command 2 is '/usr/afs/bin/volserver'
    -      Command 3 is '/usr/afs/bin/salvager'
    -   Instance ptserver, (type is simple) currently running normally.
    -      Process last started at Tue Jan 6 8:29:19 1998 (1 proc starts)
    -      Command 1 is '/usr/afs/bin/ptserver'
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    BosConfig -

    KeyFile -

    bos -

    bos create -

    bos shutdown -

    bos startup -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf122.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf122.htm deleted file mode 100755 index 263ad751c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf122.htm +++ /dev/null @@ -1,106 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos stop

    - - - - - - - - -

    Purpose -

    Stops a process after changing its status flag in the -/usr/afs/local/BosConfig file -

    Synopsis -

    bos stop -server <machine name>  -instance <server process name>+ 
    -         [-wait]  [-cell <cell name>]  [-noauth]  [-localauth]  [-help]
    -     
    -bos sto -s <machine name>  -i <server process name>+
    -        [-w]  [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos stop command sets the status flag for each process -specified with the -instance argument to NotRun in the -/usr/afs/local/BosConfig file on the server machine named by the --server argument, then stops it. -

    To stop a process without changing its BosConfig status flag, -use the bos shutdown command instead. -

    Options -

    -

    -server -
    Indicates the server machine on which to stop processes. Identify -the machine by IP address or its host name (either fully-qualified or -abbreviated unambiguously). For details, see the introductory reference -page for the bos command suite. -

    -instance -
    Names each process to stop. Use the process name assigned with the --instance argument to the bos create command. The -output from the bos status command lists the names. -

    -wait -
    Delays the return of the command shell prompt until all processes actually -stop. If this argument is omitted, the prompt returns almost -immediately even if all processes are not stopped. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example command stops the upserver and -runntp on the machine fs7.abc.com. -

       % bos stop -server fs7.abc.com -instance upserver runntp
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos create -

    bos shutdown -

    bos status -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf123.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf123.htm deleted file mode 100755 index fd192bf75..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf123.htm +++ /dev/null @@ -1,122 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bos uninstall

    - - - - - - - - - -

    Purpose -

    Reverts to the former version of a process's binary file -

    Synopsis -

    bos uninstall -server <machine name>  -file <files to uninstall>+ 
    -              [-dir <destination dir>]  [-cell <cell name>]  
    -              [-noauth]  [-localauth]  [-help]
    -   
    -bos u -s <machine name>  -f <files to uninstall>+  [-d <destination dir>] 
    -      [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The bos uninstall command replaces each binary file specified by -the -file argument with its .BAKversion on the -server machine named by the -server argument, which is normally the -binary distribution machine for its CPU/operating system type. It also -changes the extension on the current .OLD version (if any) -to .BAK. Each binary file must reside in the local -/usr/afs/bin directory unless the -dir argument names an -alternate directory. -

    To start using the reverted binary immediately, issue the bos -restart command. Otherwise, the BOS Server automatically restarts -the process at the time defined in the /usr/afs/local/BosConfig -file; use the bos getrestart command to display the time and -the bos setrestart time to set it. -

    Options -

    -

    -server -
    Indicates the binary distribution machine on which to revert to the -.BAK version of binaries. Identify the machine by IP -address or its host name (either fully-qualified or abbreviated -unambiguously). For details, see the introductory reference page for -the bos command suite. -

    If the machine is not a binary distribution machine and is running an -upclientbin process, then the files are overwritten the next time -the upclientbin process fetches the corresponding file from the -distribution machine (by default within five minutes). -

    -file -
    Names each binary file to replace with its .BAK -version. -

    -dir -
    Provides the complete pathname of the local disk directory containing each -file named by the -file argument. It is necessary only if -the binaries are not in the /usr/afs/bin directory. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory bos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory bos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents the ticket to the BOS Server during mutual -authentication. Do not combine this flag with the -cell or --noauth options. For more details, see the introductory -bos reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example command overwrites the -/usr/afs/bin/kaserver file on the machine -fs4.abc.com with its .BAKversion, -and the current .BAK version by the -.OLDversion. -

       % bos uninstall -server fs4.abc.com -file kaserver
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine named by the -server argument, or must be logged onto a -server machine as the local superuser root if the --localauth flag is included. -

    Related Information -

    BosConfig -

    KeyFile -

    UserList -

    bos -

    bos getrestart -

    bos restart -

    bos setrestart -

    upclient -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf124.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf124.htm deleted file mode 100755 index 3fd06ed9d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf124.htm +++ /dev/null @@ -1,164 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    bosserver

    - - - -

    Purpose -

    Initializes the BOS Server -

    Synopsis -

    bosserver [-noauth]  [-log]  [-enable_peer_stats]  [-enable_process_stats]  
    -          [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The bosserver command initializes the Basic OverSeer (BOS) -Server (bosserver process). In the conventional -configuration, the binary file is located in the /usr/afs/bin -directory on a file server machine. -

    The BOS Server must run on every file server machine and helps to automate -file server administration by performing the following tasks: -

      -

    • Monitors the other AFS server processes on the local machine, to make sure -they are running correctly. -

    • Automatically restarts failed processes, without contacting a human -operator. When restarting multiple server processes simultaneously, the -BOS Server takes interdependencies into account and initiates restarts in the -correct order. - - -

    • Processes commands from the bos suite that administrators issue -to verify the status of server processes, install and start new processes, -stop processes either temporarily or permanently, and restart halted -processes. -

    • Manages system configuration information: the files that list the -cell's server encryption keys, database server machines, and users -privileged to issue commands from the bos and vos -suites. -
    -

    The BOS Server logs a default set of important events in the file -/usr/afs/logs/BosLog. To record the name of any user who -performs a privileged bos command (one that requires being listed -in the /usr/afs/etc/UserList file), add the -log -flag. To display the contents of the BosLog file, use the -bos getlog command. -

    The first time that the BOS Server initializes on a server machine, it -creates several files and subdirectories in the local /usr/afs -directory, and sets their mode bits to protect them from unauthorized -access. Each time it restarts, it checks that the mode bits still -comply with the settings listed in the following chart. A question mark -indicates that the BOS Server initially turns off the bit (sets it to the -hyphen), but does not check it at restart. -
    - - - - - - - - - - -
    /usr/afs -drwxr?xr-x -
    /usr/afs/backup -drwx???--- -
    /usr/afs/bin -drwxr?xr-x -
    /usr/afs/db -drwx???--- -
    /usr/afs/etc -drwxr?xr-x -
    /usr/afs/etc/KeyFile --rw????--- -
    /usr/afs/etc/UserList --rw?????-- -
    /usr/afs/local -drwx???--- -
    /usr/afs/logs -drwxr?xr-x -
    -

    If the mode bits do not comply, the BOS Server writes the following warning -to the BosLog file: -

       Bosserver reports inappropriate access on server directories
    -   
    -
    -

    However, the BOS Server does not reset the mode bits, so the administrator -can set them to alternate values if desired (with the understanding that the -warning message then appears at startup). -

    Options -

    -

    -noauth -
    Assigns the unprivileged identity anonymous to the issuer, -which is useful only when authorization checking is disabled on the server -machine (for instance, during the installation of a file server -machine.) -

    -log -
    Records in the /usr/afs/logs/BosLog file the names of all users -who successfully issue a privileged bos command (one that requires -being listed in the /usr/afs/etc/UserList file). -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command initializes the BOS Server and logs the names of -users who issue privileged bos commands. -

       % bosserver -log &
    -   
    -
    -

    Privilege Required -

    The issuer most be logged onto a file server machine as the local superuser -root. -

    Related Information -

    BosConfig -

    BosLog -

    bos -

    bos create -

    bos exec -

    bos getlog -

    bos getrestart -

    bos restart -

    bos shutdown -

    bos start -

    bos startup -

    bos status -

    bos stop -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf125.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf125.htm deleted file mode 100755 index bf3fb9dda..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf125.htm +++ /dev/null @@ -1,147 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    buserver

    - - - - - - -

    Purpose -

    Initializes the Backup Server -

    Synopsis -

    buserver [-database <database directory>] 
    -         [-cellservdb <cell configuration directory>]
    -         [-resetdb]  [-noauth]  [-smallht] 
    -         [-servers <list of ubik database servers>+]  
    -         [-enable_peer_stats]  [-enable_process_stats] 
    -         [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The buserver command initializes the Backup Server, which runs -on database server machines and maintains the Backup Database. In the -conventional configuration, the binary file is located in the -/usr/afs/bin directory on a file server machine. -

    The buserver command is not normally issued at the command shell -prompt, but rather placed into a database server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a file server machine as the local superuser -root. -

    As it initializes, the Backup Server process creates the two files that -constitute the Backup Database, bdb.DB0 and -bdb.DBSYS1, in the /usr/afs/db directory if they -do not already exist. The Backup Database houses information about -volume sets and entries, the dump hierarchy, Tape Coordinators, and previously -performed dump sets. Use the commands in the backup suite to -administer the database. -

    The Backup Server records a trace of its activity in the -/usr/afs/logs/BackupLog file. Use the bos getlog -command to display the contents of the file. -

    Cautions -

    The buserver process reserves port 7021 for its -use. Unexpected behavior can occur if another process tries to reserve -this port while the buserver process is running. -

    Options -

    -

    -database -
    Specifies the pathname of an alternate directory for the Backup Database -files, ending in a final slash (/). If this argument is not -provided, the default is the /usr/afs/db directory. -

    -cellservdb -
    Specifies the pathname of the directory from which the Backup Server reads -in an alternate version of the CellServDB file. This -argument is mandatory for correct functioning when the Backup Server is -running on a subset of the cell's database server machines that is not a -majority of the machines listed in the standard -/usr/afs/etc/CellServDB file (which the Backup Server consults if -this argument is not provided). It is not appropriate in any other -circumstances. -

    -resetdb -
    Removes all of the information in the Backup Database files in the -/usr/afs/db directory, leaving zero-length versions of them. -The backup operator must recreate the configuration entries in the database -(for volume sets, the dump hierarchy and so on) before performing backup -operations. -

    -noauth -
    Establishes an unauthenticated connection between the issuer and the -Backup Server, in which the Backup Server treats the issuer as the -unprivileged user anonymous. It is useful only when -authorization checking is disabled on the database server machine. In -normal circumstances, the Backup Server allows only authorized (privileged) -users to issue commands that affect or contact the Backup Database, and -refuses to perform such an action even if the -noauth flag is -used. -

    -smallht -
    Directs the Backup Server to use smaller internal hash tables for the -Backup Database, which reduces memory requirements but can make data access -take longer. -

    -servers -
    Specifies the database server machines on which to start the Backup -Server. Use this argument if running the Backup Server on a subset of -the database server machines that is not a majority of the machines listed in -the /usr/afs/etc/CellServDB file. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example bos create command creates a -buserver process on the file server machine -fs3.abc.com. It appears here on two lines only -for legibility. -

       % bos create -server fs3.abc.com -instance buserver  \
    -                -type simple -cmd /usr/afs/bin/buserver
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BackupLog -

    BosConfig -

    CellServDB (server version) -

    bdb.DB0 and bdb.DBSYS1 -

    backup -

    bos create -

    bos getlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf126.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf126.htm deleted file mode 100755 index db9cb9554..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf126.htm +++ /dev/null @@ -1,194 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    butc

    - - - - - - -

    Purpose -

    Initializes the Tape Coordinator process -

    Synopsis -

    butc [-port <port offset>]  [-debuglevel < 0 | 1 | 2 >]  
    -     [-cell <cell name>]  [-noautoquery]  
    -     [-localauth]  [-help]
    -        
    -butc [-p <port offset>]  [-d < 0 | 1 | 2 >]  
    -     [-c <cell name>]  [-n]  [-l]  [-h]
    -
    -

    Description -

    The butc command initializes a Tape Coordinator process on a -Tape Coordinator machine, enabling an operator to direct Backup System -requests to the associated tape device or backup data file. (The Tape -Coordinator controls a backup data file if the FILE YES instruction -appears in the /usr/afs/backup/CFG_device_name file that -corresponds to the Tape Coordinator's entry in the -/usr/afs/backup/tapeconfig file. For the sake of simplicity, -the following discusses tape devices only.) -

    It is conventional to start and run the Tape Coordinator in the -foreground. In this case, it runs on its own connection, which is -unavailable for any other use and must remain open the entire time the Tape -Coordinator is to accept backup requests and while it is executing -them. (When using a window manager, the connection corresponds to a -separate command shell window.) The Tape Coordinator can run in the -background if the CFG_device_name file is configured to -eliminate any need for the Tape Coordinator to prompt the operator. In -both the foreground and background, the Tape Coordinator writes operation -traces and other output to the standard output stream on the connection over -which it was started. Use the -debuglevel argument to -control the amount of information that appears. The Tape Coordinator -also writes traces and error messages to two files in the local -/usr/afs/backup directory: -

      -

    • The TE_device_name file records problems that the Tape -Coordinator encounters as it executes backup operations. -

    • The TL_device_name file records a trace of operations -as well as the same errors written to the TE_device_name -file. -
    -

    The Tape Coordinator creates the files automatically as it -initializes. If there are existing files, the Tape Coordinator renames -them with a .old extension, overwriting the existing -.old files if they exist. It derives the -device_name part of the file names by stripping off the device -name's /dev/ prefix and replacing any other slashes with -underscores. For example, the files are called TE_rmt_4m and -TL_rmt_4m for a device called /dev/rmt/4m. -

    By default, at the beginning of each operation the Tape Coordinator prompts -for the operator to insert the first tape into the drive and press -<Return>. To suppress this prompt, include the --noautoquery flag on the command line or the instruction -AUTOQUERY NO in the -/usr/afs/backup/CFG_device_name file. When the -prompt is suppressed, the first required tape must be in the drive before a -backup command is issued. For subsequent tapes, the Tape -Coordinator uses its normal tape acquisition routine: if the -/usr/afs/backup/CFG_device_name file includes a -MOUNT instruction, the Tape Coordinator invokes the indicated -command; otherwise, it prompts the operator for the next tape. -

    To stop the Tape Coordinator process, enter an interrupt signal such as -<Ctrl-c> over the dedicated connection (in the command shell -window). -

    To cancel a backup operation that involves a tape before it -begins (assuming the initial tape prompt has not been suppressed), enter the -letter a (for abort) and press <Return> at -the Tape Coordinator's prompt for the first tape. -

    Tape Coordinator operation depends on the correct configuration of certain -files, as described in the following list: -

      -

    • The local /usr/afs/backup/tapeconfig file must include an entry -for the Tape Coordinator that specifies its device name and port offset -number, among other information; for details, see the -tapeconfig reference page. -

    • The port offset number recorded in the Tape Coordinator's entry in -the Backup Database must match the one in the tapeconfig -file. Create the Backup Database entry by using the backup -addhost command. -

    • The optional /usr/afs/backup/CFG_device_name file can -contain instructions for mounting and unmounting tapes automatically (when -using a tape stacker or jukebox, for instance) or automating other aspects of -the backup process. The device_name part of the name is -derived as described previously for the TE_device_name and -TL_device_name files. -
    -

    Cautions -

    If the Tape Coordinator machine is an AIX machine, use the SMIT -utility to set the device's block size to 0 (zero), indicating variable -block size. Otherwise, tape devices attached to machines running other -operating systems sometimes cannot read tapes written on AIX machines. -For instructions, see the AFS Administration Guide chapter about -configuring the Backup System. -

    Options -

    -

    -port -
    Specifies the port offset number of the Tape Coordinator to -initialize. -

    -debuglevel -
    Controls the amount and type of messages the Tape Coordinator displays on -the standard output stream. Provide one of three acceptable -values: -
      -

    • 0 to display the minimum level of detail required to describe -Tape Coordinator operations, including prompts for tapes, messages that -indicate the beginning and end of operations, and error messages. This -is the default value. -

    • 1 to display the names of the volumes being dumped or restored -as well as the information displayed at level 0. -

    • 2 to display all messages also being written to the -TL_device_name log file. -
    -

    -cell -
    Names the cell in which the Tape Coordinator operates (the cell to which -the file server machines that house affected volumes belong). If this -argument is omitted, the Tape Coordinator runs in the local cell as defined in -the local /usr/vice/etc/ThisCell file. Do not combine this -flag with the -localauth argument. -

    -noautoquery -
    Suppresses the Tape Coordinator's prompt for insertion of the first -tape needed for an operation. The operator must insert the tape into -the drive before issuing the backup command that initializes the -operation. -

    -localauth -
    Constructs a server ticket using the server encryption key with the -highest key version number in the local -/usr/afs/etc/KeyFile. The butc command -interpreter presents the ticket, which never expires, to the Volume Server and -Volume Location Server to use in mutual authentication. -

    Do not combine this argument with the -cell flag, and use it -only when logged on to a server machine as the local superuser -root; client machines do not have -/usr/afs/etc/KeyFile file. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command starts the Tape Coordinator with port offset -7 at debug level 1, meaning the Tape Coordinator reports -the names of volumes it is dumping or restoring. -

       % butc -port 7 -debuglevel 1
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -every machine where the Backup Server or Volume Location (VL) Server is -running, and on every file server machine that houses a volume to be backed -up. If the -localauth flag is included, the issuer must -instead be logged on to the Tape Coordinator machine as the local superuser -root. In addition, the issuer must be able to read and write -to the log and configuration files in the local /usr/afs/backup -directory. -

    Related Information -

    CFG_device_name -

    KeyFile -

    TE_device_name -

    ThisCell (client version) -

    TL_device_name -

    UserList -

    tapeconfig -

    backup addhost -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf127.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf127.htm deleted file mode 100755 index fe0a054b2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf127.htm +++ /dev/null @@ -1,186 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    dlog

    - - -

    Purpose -

    Authenticates to the DCE Security Service -

    Synopsis -

    dlog [-principal <user name>]  [-cell <cell name>]  
    -     [-password <user's password>]  [-servers <explicit list of servers>+]  
    -     [-lifetime <ticket lifetime in hh[:mm[:ss]]>]  
    -     [-setpag]  [-pipe]  [-help]
    -    
    -dlog [-pr <user name>]  [-c <cell name>]  [-pw <user's password>] 
    -     [-ser <explicit list of servers>+]  
    -     [-l <ticket lifetime in hh[:mm[:ss]]>]  [-set]  [-pi]  [-h]
    -
    -

    Description -

    The dlog command obtains DCE credentials for the issuer from the -DCE Security Service in the cell named by the -cell argument, and -stores them on the AFS client machine on which the user issues the -command. The AFS/DFS Migration Toolkit Protocol Translator processes -running on machines in the DCE cell accept the credentials, which enables the -user to access the DCE cell's filespace from the AFS client. The -user's identity in the local file system is unchanged. -

    If the issuer does not provide the -principal argument, the -dlog command interpreter uses the user name under which the issuer -is logged into the local file system. Provide the DCE password for the -appropriate user name. As with the klog command, the -password does not cross the network in clear text (unless the issuer is logged -into the AFS client from a remote machine). -

    The credentials are valid for a lifetime equivalent to the smallest of the -following, all but the last of which is defined by the DCE cell's -Security Server: -

      -

    • The maximum certificate lifetime for the issuer's DCE account -

    • The maximum certificate lifetime for the afs principal's -DCE account -

    • The registry-wide maximum certificate lifetime -

    • The registry-wide default certificate lifetime -

    • The lifetime requested using the -lifetime argument -
    -

    If the previous maximum certificate lifetime values are set to -default-policy, the maximum possible ticket lifetime is defined by -the default certificate lifetime. Refer to the DCE vendor's -administration guide for more information before setting any of these -values. -

    The AFS Cache Manager stores the ticket in a credential structure -associated with the name of the issuer (or the user named by the --principal argument. If the user already has a ticket for -the DCE cell, the ticket resulting from this command replaces it in the -credential structure. -

    The AFS tokens command displays the ticket obtained by the -dlog command for the server principal afs, regardless of -the principal to which it is actually granted. Note that the -tokens command does not distinguish tickets for a DFSTM -File Server from tickets for an AFS File Server. -

    Options -

    -

    -principal -
    Specifies the DCE user name for which to obtain DCE credentials. If -this option is omitted, the dlog command interpreter uses the name -under which the issuer is logged into the local file system. -

    -cell -
    Specifies the DCE cell in which to authenticate. During a single -login session on a given machine, a user can authenticate in multiple cells -simultaneously, but can have only one ticket at a time for each cell (that is, -it is possible to authenticate under only one identity per cell per -machine). It is legal to abbreviate the cell name to the shortest form -that distinguishes it from the other cells listed in the -/usr/vice/etc/CellServDB file on the local client machine. -

    If the issuer does not provide the -cell argument, the -dlog command attempts to authenticate with the DCE Security Server -for the cell defined by -

      -

    1. The value of the environment variable AFSCELL on the local AFS client -machine, if defined. The issuer can set the AFSCELL environment -variable to name the desired DCE cell. -

    2. The cell name in the /usr/vice/etc/ThisCell file on the local -AFS client machine. The machine's administrator can place the -desired DCE cell's name in the file. -
    -

    -password -
    Specifies the password for the issuer (or for the user named by the --principal argument). Using this argument is not -recommended, because it makes the password visible on the command line. -If this argument is omitted, the command prompts for the password and does not -echo it visibly. -

    -servers -
    Specifies a list of DFS database server machines running the Translator -Server through which the AFS client machine can attempt to -authenticate. Specify each server by hostname, shortened machine name, -or IP address. If this argument is omitted, the dlog command -interpreter randomly selects a machine from the list of DFS Fileset Location -(FL) Servers in the /usr/vice/etc/CellServDB file for the DCE cell -specified by the -cell argument. This argument is useful for -testing when authentication seems to be failing on certain server -machines. -

    -lifetime -
    Requests a ticket lifetime using the format -hh:mm[:ss] -(hours, minutes, and optionally a number seconds between 00 and 59). -For example, the value 168:30 requests a ticket lifetime of 7 -days and 30 minutes, and 96:00 requests a lifetime of 4 -days. Acceptable values range from 00:05 (5 minutes) -to 720:00 (30 days). If this argument is not provided -and no other determinants of ticket lifetime have been changed from their -defaults, ticket lifetime is 10 hours. -

    The requested lifetime must be smaller than any of the DCE cell's -determinants for ticket lifetime; see the discussion in the preceding -Description section. -

    -setpag -
    Creates a process authentication group (PAG) in which the newly created -ticket is placed. If this flag is omitted, the ticket is instead -associated with the issuers' local user ID (UID). -

    -pipe -
    Suppresses any prompts that the command interpreter otherwise produces, -including the prompt for the issuer's password. Instead, the -command interpreter accepts the password via the standard input stream. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the dlog command interpreter cannot contact a Translator -Server, it produces a message similar to the following: -

       dlog: server or network not responding -- failed to contact
    -   authentication service
    -   
    -
    -

    Examples -

    The following command authenticates the issuer as cell_admin in -the dce.abc.com cell. -

       % dlog -principal cell_admin -cell dce.abc.com
    -   Password: cell_admin's password
    -    
    -
    -

    In the following example, the issuer authenticates as cell_admin -to the dce.abc.com cell and request a ticket lifetime -of 100 hours. The tokens command confirms that the user -obtained DCE credentials as the user cell_admin: the AFS ID -is equivalent to the UNIX ID of 1 assigned to cell_admin -in dce.abc.com cell's DCE registry. -

       % dlog -principal cell_admin -cell dce.abc.com -lifetime 100
    -   Password: cell_admin's password
    -   
    -   % tokens
    -   Tokens held by the Cache Manager:
    -   
    -   User's (AFS ID 1) tokens for afs@dce.abc.com [Expires Jul 6 14:12] 
    -   User's (AFS ID 4758) tokens for afs@abc.com [Expires Jul 2 13:14] 
    - 
    -      --End of list--
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    dpass -

    klog -

    tokens -

    unlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf128.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf128.htm deleted file mode 100755 index 917a315b3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf128.htm +++ /dev/null @@ -1,114 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    dpass

    - - -

    Purpose -

    Returns the DCE password for a new DCE account -

    Synopsis -

    dpass [-cell <original AFS cell name>]  [-help] 
    -  
    -dpass [-c <original AFS cell name>]  [-h]
    -
    -

    Description -

    The dpass command returns the DCE password that an administrator -assigned to the issuer when using the dm pass command to migrate -AFS user accounts into a DCE cell. -

    The dpass command, issued on an AFS client, requests the -issuer's new DCE password from the AFS cell specified with the --cell argument. -

    The issuer must be authenticated as the AFS user whose AFS account was -moved into DCE, and be able to provide the user's AFS password when -prompted by the dpass command. -

    Options -

    -

    -cell -
    Specifies the name of the AFS cell from which the AFS account was moved -into DCE and from which to fetch the new DCE password. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    By default, the dpass command writes a message similar to the -following to the standard output stream. -

       Please read the following message before entering your password.  
    -    
    -   This program will display your new, temporary DCE password on your
    -   terminal, and you should change the assigned password as soon as 
    -   possible (from a DCE client).  The program assumes that the AFS cell 
    -   uses the AFS Authentication Server and that an administrator used the 
    -   utilities in the AFS/DFS Migration Toolkit to migrate the account from 
    -   AFS to DCE. The password you enter should be the AFS password that was 
    -   in effect when your DCE account was created; this is not necessarily 
    -   the same password you have at the moment.  The cell name (which you 
    -   may override with a command line option), must be the name of the AFS 
    -   cell from which the authentication information was taken.
    -    
    -
    -

    To suppress this message, set the DPASS_NO_MESSAGE environment -variable. It is then possible to substitute a customized message if -desired by using a script similar to the following example: -

       #! /bin/csh
    -   echo "Start of customized message"
    -   echo "Continuation of customized message"
    -     .
    -     .
    -     .
    -   echo "Conclusion of customized message"
    -   setenv DPASS_NO_MESSAGE
    -   dpass $*
    -   
    -
    -

    After the standard or customized message, if any, the dpass -command generates the following prompt for the original AFS password: -

       Original password for AFS cell cell:
    -   Re-enter password to verify:
    -   
    -
    -

    If the AFS passwords match and are correct, the command reports the -temporary DCE password in the following message. -

       The new DCE password is: Issuer's_temporary_DCE_password
    -    
    -
    -

    Examples -

    The following example returns the DCE password of the issuer, whose AFS -account is in the abc.com cell. The DPASS_NO_MESSAGE -variable has been set to suppress the standard message. -

       % dpass
    -   Original password for AFS cell abc.com: Issuer's_AFS_password
    -   Re-enter password to verify: Issuer's_AFS_password
    -   The new DCE password is: 8655--eg8e-dcdc-8157
    -   
    -
    -

    Privilege Required -

    The issuer must be authenticated as the AFS user for whom to display the -corresponding DCE password. -

    Related Information -

    dlog -

    dm pass reference page in AFS/DFS Migration Toolkit -Administration Guide and Reference -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf129.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf129.htm deleted file mode 100755 index 380b28530..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf129.htm +++ /dev/null @@ -1,391 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fileserver

    - - - -

    Purpose -

    Initializes the File Server component of the fs process -

    Synopsis -

    fileserver [-d <debug level>]  [-p <number of processes>]
    -           [-spare <number of spare blocks>]  
    -           [-pctspare <percentage spare>]  [-b <buffers>]
    -           [-l <large vnodes>]  [-s <small  nodes>]
    -           [-vc <volume cachesize>]  [-w <call back wait interval>]
    -           [-cb <number of call backs>]
    -           [-banner (print banner every 10 minutes)]
    -           [-novbc (whole volume cbs disabled)]
    -           [-implicit <admin mode bits: rlidwka>]
    -           [-hr <number of hours between refreshing the host cps>]
    -           [-busyat <redirect clients when queue > n>]
    -           [-rxpck <number of rx extra packets>]
    -           [-rxdbg (enable rx debugging)]
    -           [-rxdbge (enable rxevent debugging)]
    -           [-m <min percentage spare in partition>]
    -           [-lock (keep fileserver from swapping)]
    -           [-L (large server conf)]  [-S (small server conf)]
    -           [-k <stack size>]  [-realm <Kerberos realm name>]
    -           [-udpsize <size of socket buffer in bytes>]  
    -           [-enable_peer_stats]  [-enable_process_stats]  
    -           [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The fileserver command initializes the File Server component of -the fs process. In the conventional configuration, its -binary file is located in the /usr/afs/bin directory on a file -server machine. -

    The fileserver command is not normally issued at the command -shell prompt, but rather placed into a database server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a file server machine as the local superuser -root. -

    The File Server creates the /usr/afs/logs/FileLog log file as it -initializes, if the file does not already exist. It does not write a -detailed trace by default, but use the -d option to increase the -amount of detail. Use the bos getlog command to display the -contents of the log file. -

    The command's arguments enable the administrator to control many -aspects of the File Server's performance, as detailed in the -Options section. By default the fileserver -command sets values for many arguments that are suitable for a medium-sized -file server machine. To set values suitable for a small or large file -server machine, use the -S or -L flag -respectively. The following list describes the parameters and -corresponding argument for which the fileserver command sets -default values, and Table 1 summarizes the setting for each of the three machine -sizes. -

      -

    • The maximum number of lightweight processes (LWPs) the File Server uses to -handle requests for data; corresponds to the -p -argument. The File Server always uses a minimum of 32 KB for these -processes. -

    • The maximum number of directory blocks the File Server caches in -memory; corresponds to the -b argument. Each cached -directory block (buffer) consumes 2,092 bytes of memory. -

    • The maximum number of large vnodes the File Server caches in memory for -tracking directory elements; corresponds to the -l -argument. Each large vnode consumes 292 bytes of memory. -

    • The maximum number of small vnodes the File Server caches in memory for -tracking file elements; corresponds to the -s argument. -Each small vnode consumes 100 bytes of memory. -

    • The maximum volume cache size, which determines how many volumes the File -Server can cache in memory before having to retrieve data from disk; -corresponds to the -vc argument. -

    • The maximum number of callback structures the File Server caches in -memory; corresponds to the -cb argument. Each callback -structure consumes 16 bytes of memory. -

    • The maximum number of Rx packets the File Server uses; -corresponds to the -rxpck argument. Each packet consumes -1544 bytes of memory. -
    -
    -

    Table 1. File Server configuration parameters
    - - - - - - - - - -
    Parameter (Argument) -Small configuration (-S) -Medium configuration (default) -Large configuration (-L) -
    Number of LWPs (-p) -6 -9 -12 -
    Number of cached directory blocks (-b) -70 -90 -120 -
    Number of cached large vnodes (-l) -200 -400 -600 -
    Number of cached small vnodes (-s) -200 -400 -600 -
    Maximum volume cache size (-vc) -200 -400 -600 -
    Number of callbacks (-cb) -20,000 -60,000 -64,000 -
    Number of Rx packets (-rxpck) -100 -150 -200 -
    -

    To override any of the values, provide the indicated argument (which can be -combined with the -S or -L flag). -

    The amount of memory required for the File Server varies. The -approximate default memory usage is 751 KB when the -S flag is used -(small configuration), 1.1 MB when all defaults are used (medium -configuration), and 1.4 MB when the -L flag is used (large -configuration). If additional memory is available, increasing the value -of the -cb and -vc arguments can improve File Server -performance most directly. -

    By default, the File Server allows a volume to exceed its quota by 1 MB -when an application is writing data to an existing file in a volume that is -full. The File Server still does not allow users to create new files in -a full volume. To change the default, use one of the following -arguments: - -

      -

    • Set the -spare argument to the number of extra kilobytes that -the File Server allows as overage. A value of 0 allows no -overage. -

    • Set the -pctspare argument to the percentage of the -volume's quota the File Server allows as overage. -
    -

    By default, the File Server implicitly grants the a -(administer) and l (lookup) permissions to -the system:administrators on the access control list (ACL) of -every directory in the volumes stored on its file server machine. In -other words, the group's members can exercise those two permissions even -when an entry for the group does not appear on an ACL. To change the -set of default permissions, use the -implicit argument. -

    The File Server maintains a host current protection subgroup -(host CPS) for each client machine from which it has received a -data access request. Like the CPS for a user, a host CPS lists all of -the Protection Database groups to which the machine belongs, and the File -Server compares the host CPS to a directory's ACL to determine in what -manner users on the machine are authorized to access the directory's -contents. When the pts adduser or pts removeuser -command is used to change the groups to which a machine belongs, the File -Server must recompute the machine's host CPS in order to notice the -change. By default, the File Server contacts the Protection Server -every two hours to recompute host CPSs, implying that it can take that long -for changed group memberships to become effective. To change this -frequency, use the -hr argument. -
    Note:The AIX operating system does not automatically reserve a part of each -partition to avoid the negative consequences that can result when the space on -a partition is completely exhausted. Therefore, the AIX version of the -File Server creates an 8% disk reserve automatically. To change the -percentage, use the -m argument. -
    -

    The File Server generates the following message when a partition is nearly -full: -

       No space left on device
    -   
    -
    -

    Cautions -

    Do not use the -k and -w arguments, which are -intended for use by the AFS Development group only. Changing them from -their default values can result in unpredictable File Server behavior. -In any case, on many operating systems the File Server uses native threads -rather than the LWP threads, so using the -k argument to set the -number of LWP threads has no effect. -

    Do not specify both the -spare and -pctspare -arguments. Doing so causes the File Server to exit, leaving an error -message in the /usr/afs/logs/FileLog file. -

    Options that are available only on some system types, such as the --m and -lock options, appear in the output generated by -the -help option only on the relevant system type. -

    Options -

    -

    -d -
    Sets the detail level for the debugging trace written to the -/usr/afs/logs/FileLog file. Provide one of the following -values, each of which produces an increasingly detailed trace: -0, 1, 5, 25, and -125. The default value of 0 produces only a few -messages. -

    -p -
    Sets the number of threads to run. Provide a positive -integer. The File Server creates and uses five threads for special -purposes, in addition to the number specified (but if this argument specifies -the maximum possible number, the File Server automatically uses five of the -threads for its own purposes). -

    The maximum number of threads can differ in each release of AFS. -Consult the AFS Release Notes for the current release. -

    -spare -
    Specifies the number of additional kilobytes an application can store in a -volume after the quota is exceeded. Provide a positive integer; a -value of 0 prevents the volume from ever exceeding its -quota. Do not combine this argument with the -pctspare -argument. -

    -pctspare -
    Specifies the amount by which the File Server allows a volume to exceed -its quota, as a percentage of the quota. Provide an integer between -0 and 99. A value of 0 prevents the -volume from ever exceeding its quota. Do not combine this argument with -the -spare argument. -

    -b -
    Sets the number of directory buffers. Provide a positive -integer. -

    -l -
    Sets the number of large vnodes available in memory for caching directory -elements. Provide a positive integer. -

    -s -
    Sets the number of small vnodes available in memory for caching file -elements. Provide a positive integer. -

    -vc -
    Sets the number of volumes the File Server can cache in memory. -Provide a positive integer. -

    -w -
    Sets the interval at which the daemon spawned by the File Server performs -its maintenance tasks. Do not use this argument; changing the -default value can cause unpredictable behavior. -

    -cb -
    Sets the number of callbacks the File Server can track. Provide a -positive integer. -

    -banner -
    Prints the following banner to /dev/console about every 10 -minutes. -
       File Server is running at time.
    -   
    -
    -

    -novbc -
    Prevents the File Server from breaking the callbacks that Cache Managers -hold on a volume that the File Server is reattaching after the volume was -offline (as a result of the vos restore command, for -example). Use of this flag is strongly discouraged. -

    -implicit -
    Defines the set of permissions granted by default to the -system:administrators group on the ACL of every directory in -a volume stored on the file server machine. Provide one or more of the -standard permission letters (rlidwka) and auxiliary permission -letters (ABCDEFGH), or one of the shorthand notations for groups of -permissions (all, none, read, and -write). To review the meaning of the permissions, see the -fs setacl reference page. -
    Note:The File Server always implicitly grants the a permission to the -system:administrators group, even if you use the -none value. -
    -

    -hr -
    Specifies how often the File Server refreshes its knowledge of the -machines that belong to protection groups (refreshes the host CPSs for -machines). The File Server must update this information to enable users -from machines recently added to protection groups to access data for which -those machines now have the necessary ACL permissions. -

    -busyat -
    Defines the number of incoming RPCs that can be waiting for a response -from the File Server before the File Server returns the error code -VBUSY to the Cache Manager that sent the latest RPC. In -response, the Cache Manager retransmits the RPC after a delay. This -argument prevents the accumulation of so many waiting RPCs that the File -Server can never process them all. Provide a positive integer. -The default value is 600. -

    -rxpck -
    Controls the number of Rx packets the File Server uses to store data for -incoming RPCs that it is currently handling, that are waiting for a response, -and for replies that are not yet complete. Provide a positive -integer. -

    -rxdbg -
    Writes a trace of the File Server's operations on Rx packets to the -file /usr/afs/logs/rx_dbg. -

    -rxdbge -
    Writes a trace of the File Server's operations on Rx events (such as -retransmissions) to the file /usr/afs/logs/rx_dbg. -

    -m -
    Specifies the percentage of each AFS server partition that the AIX version -of the File Server creates as a reserve. Specify an integer value -between 0 and 30; the default is 8%. A value -of 0 means that the partition can become completely full, which can -have serious negative consequences. -
    Note:This argument is available only on machines running the AIX operating system, -and so does not appear in the syntax statement when the -help flag -is used on other system types. -
    -

    -lock -
    Prevents any portion of the fileserver binary from being paged -(swapped) out of memory on a file server machine running the IRIX operating -system. -
    Note:This argument is available only on machines running the IRIX operating -system, and so does not appear in the syntax statement when the --help flag is used on other system types. -
    -

    -L -
    Sets values for many arguments in a manner suitable for a large file -server machine. Combine this flag with any option except the --S flag; omit both flags to set values suitable for a -medium-sized file server machine. -

    -S -
    Sets values for many arguments in a manner suitable for a small file -server machine. Combine this flag with any option except the --L flag; omit both flags to set values suitable for a -medium-sized file server machine. -

    -k -
    Sets the LWP stack size in units of 1 kilobyte. Do not use this -argument, and in particular do not specify a value less than the default of -24. -

    -realm -
    Defines the Kerberos realm name for the File Server to use. If this -argument is not provided, it uses the realm name corresponding to the cell -listed in the local /usr/afs/etc/ThisCell file. -

    -udpsize -
    Sets the size of the UDP buffer, which is 64 KB by default. Provide -a positive integer, preferably larger than the default. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following bos create command creates an fs -process on the file server machine fs2.abc.com that -uses the large configuration size, and allows volumes to exceed their quota by -10%. Type the command on a single line: -

       % bos create -server fs2.abc.com -instance fs -type fs   \ 
    -                -cmd "/usr/afs/bin/fileserver -pctspare 10 \
    -                -L" /usr/afs/bin/volserver /usr/afs/bin/salvager
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BosConfig -

    FileLog -

    bos create -

    bos getlog -

    fs setacl -

    salvager -

    volserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf130.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf130.htm deleted file mode 100755 index 38ca15419..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf130.htm +++ /dev/null @@ -1,140 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fms

    - - - - - - - - - - -

    Purpose -

    Determine a tape's capacity and a tape device's filemark size -

    Synopsis -

    fms -tape <tape special file>  [-help]
    -    
    -fms  -t <tape special file>  [-h]
    -
    -

    Description -

    The fms command determines the capacity of the tape currently in -the tape device identified by the -tape argument, along with the -size of the filemark for the device. The filemark is also referred to -as the device's end-of-file (EOF) marker, and can differ for each -combination of tape and tape device. -

    As the Tape Coordinator writes a dump, it writes a filemark between the -data included from each volume and also tracks the amount of space left before -the end of the tape (EOT). For some tape devices, the filemark is large -enough (multiple megabytes) that failure to consider it leads the Tape -Coordinator significantly to overestimate the available space. -

    The intended use of this command is to determine tape capacity and filemark -size values that can be specified in a tape device's entry in the -/usr/afs/backup/tapeconfig file. For certain types of tape -drives, the Tape Coordinator operates more efficiently when the -tapeconfig file lists accurate values. For further -discussion, see the AFS Administration Guide chapter on configuring -the Backup System. -

    Insert a tape in the drive before issuing this command. -

    Cautions -

    Do not use this command on compressing tape devices in compression mode or -with tape devices that handle tapes of multigigabyte (or multiterabyte) -capacity. It does not produce accurate results in those cases. -For alternate suggestions on the values to record in the tapeconfig -file for compressing drives, see the AFS Administration Guide -chapter on configuring the Backup System. -

    Running the command completely overwrites the tape, so use a blank one or -one that can be recycled. -

    Because it writes filemarks to the complete length of the tape, the command -can take from several hours to more than a day to complete. -

    Options -

    -

    -tape -
    Specifies the UNIX device name of the tape device for which to determine -filemark size and the capacity of the tape it currently contains. The -format varies on different system types, but usually begins with -/dev; an example is /dev/sd0a. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The command generates output both on the standard output stream and in the -fms.log file that it creates in the current working -directory. The output reports the capacity of the tape in the device -and the device's filemark size. -

    The first few lines of output include status information about the -execution of the command, including such information as the number of blocks -and the number of file marks written to the tape by the command. The -last two lines of both screen and file output provide the following -information: -

      -

    • Tape capacity is number bytes: -specifies the size, in bytes, of the tape in the device. -

    • File marks are number bytes: -specifies the device's filemark size in bytes. -
    -

    The following message indicates that the fms command interpreter -cannot access the tape device. The command halts. -

       Can't open tape drive device
    -   
    -
    -

    The following message indicates that the command interpreter cannot create -the fms.log log file. Again, the command -halts. -

       Can't open log file
    -   
    -
    -

    Examples -

    The following command illustrates the output for the device called -/dev/rmt1h: -

       % fms /dev/rmt1h
    -   wrote block: 130408
    -   Finished data capacity test - rewinding
    -   wrote 1109 blocks, 1109 file marks
    -   Finished file mark test
    -   Tape capacity is 2136604672 bytes
    -   File marks are 1910205 bytes
    -   
    -
    -

    The following appears in the fms.log file: -

       fms test started
    -   wrote 9230 blocks
    -   Finished file mark test
    -   Tape capacity is 151224320 bytes
    -   File marks are 2375680 bytes
    -   
    -
    -

    Privilege Required -

    The issuer must be able to insert and write to files in the currently -working directory, if the fms.log file does not already -exist. If it already exists, the issuer need only be able to write to -it. -

    Related Information -

    fms.log -

    tapeconfig -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf131.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf131.htm deleted file mode 100755 index d4c0513fb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf131.htm +++ /dev/null @@ -1,169 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs

    - - - - - -

    Purpose -

    Introduction to the fs command suite -

    Description -

    The commands in the fs command suite constitute the main -administrative interface to the Cache Manager on an AFS client machine, which -is responsible for fetching AFS data from file server machines on behalf of -applications running on the client machine. -

    There are several categories of commands in the fs command -suite: -

      -

    • Commands to set and report how the Cache Manager interacts with server -machines: fs checkservers, fs getcellstatus, -fs getserverprefs, fs listcells, fs newcell, -fs setcell, -

      fs setserverprefs, fs sysname, and fs -wscell -

    • Commands to administer access control lists (ACLs): fs -cleanacl, fs copyacl, fs listacl, and fs -setacl -

    • Commands to administer server machines, volumes or partitions that house a -given file or directory: fs diskfree, fs examine, -fs listquota, fs quota, fs setquota, fs -setvol, -

      fs whereis, and fs whichcell -

    • Commands to administer the local client cache and related -information: fs checkvolumes, fs flush, fs -flushvolume, fs getcacheparms, and fs setcachesize -

    • Commands to administer volume mount points: fs lsmount, -fs mkmount, and fs rmmount -

    • Commands to control monitoring and tracing: fs debug, and -fs messages -

    • A command to administer the Cache Manager's interaction with other -file systems: fs exportafs -

    • Commands to obtain help: fs apropos and fs -help -
    -

    The Cache Manager and the fs commands use and maintain the -following configuration files: -

      -

    • The /usr/vice/etc/CellServDB file lists the database server -machines in the local cell and any foreign cell to which the administrator -wishes to enable AFS access for users working on the machine. The -database server machines run the Authentication, Backup, Protection and Volume -Location (VL) Server processes, which maintain databases of administrative -information. For users to access a cell, its -root.cell volume must also be mounted in the local -cell's AFS file tree. -

    • The /usr/vice/etc/ThisCell file defines the machine's cell -membership with respect to the AFS command suites and Cache Manager access to -AFS data. -

    • The /usr/vice/etc/cacheinfo file defines configuration -parameters for the cache, including its size and whether it is in memory or on -disk. -
    -

    In addition, the Cache Manager automatically creates files on the cache -partition (by default, /usr/vice/cache for caching and tracking -files fetched from file server machines. -

    For more details, see the reference page for each file. -

    Options -

    The following flag is available on every command in the fs -suite. The reference page for each command also lists it, but it is -described here in greater detail. - - - -

    -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -
    -

    Privilege Required - - -

    The privileges required for fs commands vary more than for other -command suites. Pay special attention to the Privilege -Required section of each command description. -

    The various types of necessary privilege include: -

      -

    • Having permissions on a directory's ACL. For example, creating -and removing mount points requires a (administer), -i (insert), and d (delete) -permissions on the ACL of the directory in which the mount point -resides. -

    • Being logged onto the machine as the local superuser -root. This is necessary when issuing commands that affect -Cache Manager configuration. -

    • Belonging to the system:administrators group in the -Protection Database. -

    • No privilege. Many fs commands simply list -information. -
    -

    Related Information -

    CacheItems -

    CellServDB (client version) -

    ThisCell (client version) -

    Vn -

    VolumeItems -

    cacheinfo -

    fs apropos -

    fs checkservers -

    fs checkvolumes -

    fs cleanacl -

    fs copyacl -

    fs diskfree -

    fs examine -

    fs exportafs -

    fs flush -

    fs flushmount -

    fs flushvolume -

    fs getcacheparms -

    fs getcellstatus -

    fs getclientaddrs -

    fs getserverprefs -

    fs help -

    fs listacl -

    fs listcells -

    fs listquota -

    fs lsmount -

    fs messages -

    fs mkmount -

    fs newcell -

    fs quota -

    fs rmmount -

    fs setacl -

    fs setcachesize -

    fs setcell -

    fs setclientaddrs -

    fs setquota -

    fs setserverprefs -

    fs setvol -

    fs storebehind -

    fs sysname -

    fs whereis -

    fs whichcell -

    fs wscell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf132.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf132.htm deleted file mode 100755 index 0dfa47c39..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf132.htm +++ /dev/null @@ -1,73 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    fs apropos -topic <help string>  [-help]
    -   
    -fs ap -t <help string>  [-h]
    -
    -

    Description -

    The fs apropos command displays the first line of the online -help entry for any fs command that has in its name or short -description the string specified by the -topic argument. -

    To display the syntax for a command, use the fs help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -fs command where the string specified with the -topic -argument is part of the command name or first line. -

    Examples -

    The following command lists all fs commands that include the -word cache in their names or short online descriptions: -

       % fs apropos cache
    -   setcachesize: set cache size
    -   flush: flush file from cache
    -   getcacheparms: get cache usage info
    -   monitor: set cache monitor host address
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs -

    fs help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf133.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf133.htm deleted file mode 100755 index 3efc364e9..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf133.htm +++ /dev/null @@ -1,197 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs checkservers

    - - - - - - - - -

    Purpose -

    Displays the status of server machines -

    Synopsis -

    fs checkservers [-cell <cell to check>]  [-all]  [-fast]  
    -                [-interval <seconds between probes>]  [-help]
    -   
    -fs checks [-c <cell to check>]  [-a]  [-f]  
    -          [-i <seconds between probes>]  [-h]
    -
    -

    Description -

    The fs checkservers command reports whether certain AFS server -machines are accessible from the local client machine. The machines -belong to one of two classes, and the Cache Manager maintains a list of them -in kernel memory: -

      -

    • The database server machines in every cell listed in the local -/usr/vice/etc/CellServDB file, plus any machines added to the -memory list by the fs newcell command since the last reboot. -

    • All file server machines the Cache Manager has recently contacted, and -which it probably needs to contact again soon. In most cases, the Cache -Manager holds a callback on a file or volume fetched from the machine. -
    -

    If the Cache Manager is unable to contact the vlserver process -on a database server machine or the fileserver process on a file -server machine, it marks the machine as inaccessible. (Actually, if a -file server machine is multihomed, the Cache Manager attempts to contact all -of the machine's interfaces, and only marks the machine as down if the -fileserver fails to reply via any of them.) The Cache -Manager then periodically (by default, every three minutes) sends a probe to -each marked machine, to see if it is still inaccessible. If a -previously inaccessible machine responds, the Cache Manager marks it as -accessible and no longer sends the periodic probes to it. -

    The fs checkservers command updates the list of inaccessible -machines by having the Cache Manager probe a specified set of them: -

      -

    • By default, only machines that are marked inaccessible and belong to the -local cell (the cell listed in the local /usr/vice/etc/ThisCell -file) -

    • If the -cell argument is included, only machines that are -marked inaccessible and belong to the specified cell -

    • If the -all flag is included, all machines marked inaccessible -
    -

    If the -fast flag is included, the Cache Manager does not probe -any machines, but instead reports the results of the most recent previous -probe. -

    To set the interval between probes rather than produce a list of -inaccessible machines, use the -interval argument. The -non-default setting persists until the machine reboots; to preserve it -across reboots, put the appropriate fs checkservers command in the -machine's AFS initialization files. -

    Cautions -

    The command can take quite a while to complete, if a number of machines do -not respond to the Cache Manager's probe. The Cache Manager probes -machines sequentially and waits a standard timeout period before marking the -machine as unresponsive, to allow for slow network communication. To -make the command shell prompt return quickly, put the command in the -background. It is harmless to interrupt the command by typing -Ctrl-c or another interrupt signal. -

    Note that the Cache Manager probes only server machines marked inaccessible -in its memory list. A server machine's absence from the output -does not necessarily mean that it is functioning, because it possibly is not -included in the memory list at all (if, for example, the Cache Manager has not -contacted it recently). For the same reason, the output is likely to -vary on different client machines. -

    Unlike most fs commands, the fs checkservers command -does not refer to the AFSCELL environment variable. -

    Options -

    -

    -cell -
    Names each cell in which to probe server machines marked as -inaccessible. Provide the fully qualified domain name, or a shortened -form that disambiguates it from the other cells listed in the local -/usr/vice/etc/CellServDB file. Combine this argument with -the -fast flag if desired, but not with the -all -flag. Omit both this argument and the -all flag to probe -machines in the local cell only. -

    -all -
    Probes all machines in the Cache Manager's memory list that are -marked inaccessible. Combine this argument with the -fast -flag if desired, but not with the -cell argument. Omit both -this flag and the -cell argument to probe machines in the local -cell only. -

    -fast -
    Displays the Cache Manager's current list of machines that are -inaccessible, rather than sending new probes. The output can as old as -the current setting of the probe interval (by default three minutes, and -maximum ten minutes). -

    -interval -
    Sets or reports the number of seconds between the Cache Manager's -probes to machines in the memory list that are marked inaccessible: -
      -

    • To set the interval, specify a value from the range between 1 -and 600 (10 minutes); the default is 180 (three -minutes). The issuer must be logged in as the local superuser -root. The altered setting persists until again changed with -this command, or until the machine reboots, at which time the setting returns -to the default. -

    • Provide a value of 0 (zero) to display the current interval -setting. No privilege is required. Do not combine this argument -with any other. -
    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If there are no machines marked as inaccessible, or if all of them now -respond to the Cache Manager's probe, the output is: -

       All servers are running.
    -   
    -
    -

    Note that this message does not mean that all server machines in each -relevant cell are running. The output indicates the status of only -those machines that the Cache Manager probes. -

    If a machine fails to respond to the probe within the timeout period, the -output begins with the string -

       These servers unavailable due to network or server problems:
    -   
    -
    -

    and lists the hostname of each machine on its own line. The Cache -Manager stores machine records by Internet address, so the format of each -hostname (uppercase or lowercase letters, or an Internet address in dotted -decimal format) depends on how the local cell's name service translates -it at the time the command is issued. If a server machine is -multihomed, the output lists only one of its interfaces (usually, the -currently most preferred one). -

    If the -interval argument is provided with a value between -1 and 600, there is no output. If the value is -0, the output reports the probe interval as follows: -

       The current down server probe interval is interval secs
    -   
    -
    -

    Examples -

    The following command displays the Cache Manager's current list of -unresponsive machines in the local cell, rather than probing them -again. The output indicates that if there were any machines marked -inaccessible, they all responded to the previous probe. -

       % fs checkservers -fast
    -   All servers are running.
    -   
    -
    -

    The following example probes machines in the Cache Manager's memory -list that belong to the stateu.edu cell: -

       % fs checkservers -cell stateu.edu
    -   All servers are running.
    -   
    -
    -

    The following example probes all server machines in the Cache -Manager's memory list. It reports that two machines did not -respond to the probe. -

       % fs checkservers -all
    -   These servers unavailable due to network or server problems:
    -   fs1.abc.com SV3.STATE.EDU.
    -   
    -
    -

    Privilege Required -

    To set the probe interval, the issuer must be logged in as the local -superuser root. Otherwise, no privilege is required. -

    Related Information -

    CellServDB (client version) -

    ThisCell (client version) -

    fs newcell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf134.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf134.htm deleted file mode 100755 index 1bbe0de93..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf134.htm +++ /dev/null @@ -1,69 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs checkvolumes

    - - - - - - - - - - -

    Purpose -

    Forces the Cache Manager to update volume-related information -

    Synopsis -

    fs checkvolumes [-help]
    -   
    -fs checkv [-h]
    -
    -

    Description -

    The fs checkvolumes command discards the table of mappings -between volume names and volume ID numbers that the Cache Manager stores in -memory and uses when fetching data from volumes. The next time an -application requests AFS data, the Cache Manager must contact the Volume -Location (VL) Server for volume location information, and then an appropriate -file server machine for the actual data. -

    The Cache Manager updates the table of mappings periodically (by default, -hourly), but this command is useful if the issuer knows that a volume's -name has changed, or that new read-only replicas of a volume have been -released, because issuing it forces the Cache Manager to reference the changed -volume. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The following message confirms that the command ran successfully. -

       All volumeID/name mappings checked.
    -   
    -
    -

    Privilege Required -

    None -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf135.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf135.htm deleted file mode 100755 index 609eb286b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf135.htm +++ /dev/null @@ -1,108 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs cleanacl

    - - - - - - - -

    Purpose -

    Remove obsolete entries from an ACL -

    Synopsis -

    fs cleanacl [-path <dir/file path>+]  [-help]
    -   
    -fs cl [-p <dir/file path>+]  [-h] 
    -
    -

    Description -

    The fs cleanacl command removes from the access control list -(ACL) of each specified directory or file any entry that refers to a user or -group that no longer has a Protection Database entry. Such an entry -appears on the ACL as an AFS user ID number (UID) rather than a name, because -without a Protection Database entry, the File Server cannot translate the UID -into a name. -

    Cleaning access control lists in this way not only keeps them from becoming -crowded with irrelevant information, but also prevents the new possessor of a -recycled AFS UID from obtaining access intended for the former possessor of -the AFS UID. (Note that recycling UIDs is not recommended in any -case.) -

    Options -

    -

    -path -
    Names each directory for which to clean the ACL (specifying a filename -cleans its directory's ACL). If this argument is omitted, the -current working directory's ACL is cleaned. -

    Specify the read/write path to each directory, to avoid the failure that -results from attempting to change a read-only volume. By convention, -the read/write path is indicated by placing a period before the cell name at -the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If there are no obsolete entries on the ACL, the following message -appears: -

       Access list for dir/file path is fine.
    -   
    -
    -

    Otherwise, the output reports the resulting state of the ACL, following the -header -

       Access list for dir/file path is now
    -   
    -
    -

    At the same time, the following error message appears for each file in the -cleaned directories: -

       fs: 'filename': Not a directory
    -   
    -
    -

    Examples -

    The following example illustrates the cleaning of the ACLs on the current -working directory and two of its subdirectories. Only the second -subdirectory had obsolete entries on it. -

       % fs cleanacl -path . ./reports ./sources
    -   Access list for . is fine.
    -   Access list for ./reports is fine.
    -   Access list for ./sources is now
    -   Normal rights:
    -      system:authuser rl
    -      pat rlidwka
    -   
    -
    -

    Privilege Required -

    The issuer must have the a (administer) permission on -each directory's ACL (or the ACL of each file's parent -directory); the directory's owner and the members of the -system:administrators group have the right implicitly, even -if it does not appear on the ACL. -

    Related Information -

    fs listacl -

    fs mkmount -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf136.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf136.htm deleted file mode 100755 index 0b4f4d003..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf136.htm +++ /dev/null @@ -1,156 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs copyacl

    - - - - -

    Purpose -

    Copies an ACL from one directory to one or more other directories -

    Synopsis -

    fs copyacl -fromdir <source directory (or DFS file)>  
    -           -todir <destination directory (or DFS file)>+  
    -           [-clear]  [-id]  [-if]  [-help]
    -   
    -fs co -f <source directory (or DFS file)>  
    -      -t <destination directory (or DFS file)>+  
    -      [-c]  [-id]  [-if]  [-h]
    -
    -

    Description -

    The fs copyacl command copies the access control list (ACL) from -a source directory to each specified destination directory. The source -directory's ACL is unchanged, and changes to the destination -directory's ACL obey the following rules: -

      -

    • If an entry on the source ACL does not already exist on the destination -ACL, it is added. -

    • If an entry exists on both the source and destination ACLs, the -permissions from the source ACL entry replace the current permissions on the -destination ACL entry. -

    • If an entry on the destination ACL has no corresponding entry on the -source ACL, it is removed if the -clear flag is included and is -unchanged otherwise. In other words, if the -clear flag is -provided, the source ACL completely replaces the destination ACL. -
    -

    When using this command to copy ACLs between objects in DFS filespace -accessed via the AFS/DFS Migration Toolkit Protocol Translator, it is possible -to specify files, as well as directories, with the -fromdir and --todir arguments. For more information on copying ACLs -between DFS directories and files, refer to the AFS/DFS Migration Toolkit -Administration Guide and Reference. -

    Cautions -

    Do not copy ACLs between AFS and DFS files or directories. The ACL -formats are incompatible. -

    Options -

    -

    -fromdir -
    Specifies the source directory from which to copy the ACL. -(Specifying an AFS file copies its directory's ACL, but specifying a DFS -file copies its own ACL). A partial pathname is interpreted relative to -the current working directory. -

    -todir -
    Specifies each directory for which to alter the ACL to match the source -ACL. (Specifying an AFS file halts the command with an error, but -specifying a DFS file alters the file's ACL). A partial pathname -is interpreted relative to the current working directory. -

    Specify the read/write path to each directory (or DFS file), to avoid the -failure that results from attempting to change a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -clear -
    Replaces the ACL of each destination directory with the source ACL. -

    -id -
    Modifies the Initial Container ACL of each DFS directory named by the --todir argument, rather than the regular Object ACL. This -argument is supported only when both the source and each destination directory -reside in DFS and are accessed via the AFS/DFS Migration Toolkit Protocol -Translator. -

    -if -
    Modifies the Initial Object ACL of each DFS directory named by the --todir argument, rather than the regular Object ACL. This -argument is supported only when both the source and each destination directory -reside in DFS and are accessed via the AFS/DFS Migration Toolkit Protocol -Translator. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example command copies the current working directory's -ACL to its subdirectory called reports. Note that the source -directory's ACL is unaffected. Entries on the reports -directory's that are not on the source ACL of the current directory -remain unaffected as well, because the -clear flag is not -used. -

       % fs listacl . reports
    -   Access list for . is
    -   Normal rights:
    -      pat rlidwka
    -      smith rlidwk
    -   Access list for reports is
    -   Normal rights:
    -      pat rl
    -      pat:friends rl
    -   Negative rights
    -      jones rlidwka
    -   
    -   % fs copyacl -fromdir . -todir reports
    -   
    -   % fs listacl . reports
    -   Access list for . is
    -   Normal rights:
    -      pat rlidwka
    -      smith rlidwk
    -   Access list for reports is
    -   Normal rights:
    -      pat rlidwka
    -      pat:friends rl
    -      smith rlidwk
    -   Negative rights
    -      jones rlidwka
    -   
    -
    -

    Privilege Required -

    To copy an ACL between AFS objects, the issuer must have the l -(lookup)) permission on the source directory's ACL and the -a (administer) permission on each destination -directory's ACL. If the -fromdir argument names a file -rather than a directory, the issuer must have both the l and -r (read) permissions on the ACL of the file's -directory. -

    To copy an ACL between DFS objects, the issuer must have the r -permission on the source directory or file's ACL and the c -(control) permission on each destination directory or file's -ACL. -

    Related Information -

    fs listacl -

    fs mkmount -

    fs setacl -

    AFS/DFS Migration Toolkit Administration Guide and Reference -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf137.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf137.htm deleted file mode 100755 index 66c16331a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf137.htm +++ /dev/null @@ -1,119 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs diskfree

    - - - - - - - - - - - - - - - -

    Purpose -

    Displays information about the partition housing a directory or file -

    Synopsis -

    fs diskfree [-path <dir/file path>+]  [-help]
    -   
    -fs df [-p <dir/file path>+]  [-h]
    -   
    -fs di [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs diskfree command formats and displays information about -the partition that houses the volume containing the specified directory or -file, including its size and how much space is currently used. -

    To display information about the volume itself, use the fs -examine command. The fs examine and fs -quota commands also display information about a volume. -

    Cautions -

    The partition-related statistics in this command's output do not -always agree with the corresponding values in the output of the standard UNIX -df command. The statistics reported by this command can be -up to five minutes old, because the Cache Manager polls the File Server for -partition information at that frequency. Also, on some operating -systems, the df command's report of partition size includes -reserved space not included in this command's calculation, and so is -likely to be about 10% larger. -

    Options -

    -

    -path -
    Names a file or directory that resides on the partition about which to -produce output. Partial pathnames are interpreted relative to the -current working directory, which is also the default value if this argument is -omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output reports the following information about the volume and partition -that houses each file or directory: -

    -

    Volume Name -
    The name of the volume -

    kbytes -
    The partition's total size in kilobytes -

    used -
    The number of kilobytes used on the partition -

    avail -
    The number of kilobytes available on the partition -

    %used -
    The percentage of the partition's total space that is used (the -used statistic divided by the kbytes statistic, times -100) -
    -

    If the %used statistic is greater than 90%, it is marked with -the string <<WARNING at the right margin. -

    If the volume is a read-only volume, the output includes information about -only one of the partitions that houses it, generally the one on the file -server machine with the lowest preference rank. To verify which machine -the output is referring to, use the vos listvldb command to list -the volume's locations, and the vos partinfo command to -display the size of each one. -

    Examples -

    The following example shows the output for the partitions housing the -volumes user.smith and sun4x_56.bin: -

       % fs diskfree -path /afs/abc.com/usr/smith /afs/abc.com/sun4x_56/bin
    -   Volume Name     kbytes  used     avail     %used     
    -   user.smith     4177920 3841258  336662       92% <<WARNING
    -   sun4x_56.bin   4423680 3174500 1249180       72%
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs examine -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf138.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf138.htm deleted file mode 100755 index c94c644a5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf138.htm +++ /dev/null @@ -1,136 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs examine

    - - - - - - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Displays information about the volume containing a directory or file -

    Synopsis -

    fs examine [-path <dir/file path>+]  [-help]
    -   
    -fs exa [-p <dir/file path>+]  [-h] 
    -         
    -fs listvol [-p <dir/file path>+]  [-h] 
    -     
    -fs listv [-p <dir/file path>+]  [-h] 
    -        
    -fs lv [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs examine command displays information about the volume -containing each specified directory or file, including its volume ID number, -quota and the percentage of its quota that is used. -

    This command provides the most information about a volume, but the fs -listquota command displays similar information in tabular format, and -the fs quota command reports only the percentage of quota -used. -

    To set volume quota, use the fs setquota or fs setvol -command. -

    Cautions -

    The partition-related statistics in this command's output do not -always agree with the corresponding values in the output of the standard UNIX -df command. The statistics reported by this command can be -up to five minutes old, because the Cache Manager polls the File Server for -partition information at that frequency. Also, on some operating -systems, the df command's report of partition size includes -reserved space not included in this command's calculation, and so is -likely to be about 10% larger. -

    Options -

    -

    -path -
    Names a file or directory that resides in the volume about which to -produce output. Partial pathnames are interpreted relative to the -current working directory, which is also the default value if this argument is -omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output displays information about the volume that houses each specified -directory or file, in the following format -

       Volume status for vid = volume ID named volume name
    -   Current offline message is message
    -   Current disk quota is quota in kilobytes
    -   Current blocks used are volume size in kilobytes
    -   The partition has available partition blocks available out of
    -      partition size
    -   
    -
    -

    where the first line specifies the volume's ID number and name. -The Current offline message line appears only -if an administrator has included the -offlinemsg argument to the -fs setvol command. The remaining lines report, respectively, -

      -

    • the volume's quota in kilobytes, or the string unlimited -to indicate an unlimited quota -

    • the volume's current size in kilobytes -

    • the number of blocks available and total size of the host partition, both -in kilobytes. -
    -

    Examples -

    The following example shows the output for the volume -user.smith and the partition housing it: -

       % fs examine -path /afs/abc.com/usr/smith
    -   Volume status for vid = 50489902 named user.smith
    -   Current maximum quota is 15000
    -   Current blocks used are 5073
    -   The partition has 336662 blocks available out of 4177920 
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs listquota -

    fs quota -

    fs setquota -

    fs setvol -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf139.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf139.htm deleted file mode 100755 index 303646695..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf139.htm +++ /dev/null @@ -1,199 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs exportafs

    - - - - - - - - - - -

    Purpose -

    Reports or sets whether the machine can export AFS to clients of other file -systems -

    Synopsis -

    fs exportafs -type <exporter name>  
    -        [-start <start/stop translator (on | off)>] 
    -        [-convert <convert from afs to unix mode (on | off)>] 
    -        [-uidcheck <run on strict 'uid check' mode (on | off)>] 
    -        [-submounts <allow nfs mounts to subdirs of /afs/.. (on | off)>]
    -        [-help]
    -   
    -fs exp -t <exporter name>  
    -       [-st <start/stop translator (on | off)>]
    -       [-c <convert from afs to unix mode (on | off)>]
    -       [-u <run on strict 'uid check' mode (on | off)>]
    -       [-su <allow nfs mounts to subdirs of /afs/.. (on | off)>]  
    -       [-help]
    -
    -

    Description -

    The fs exportafs command sets (if the -start argument -is provided) or reports (if it is omitted) whether the machine can reexport -the AFS filespace to clients of a non-AFS file system. To control -certain features of the translation protocol, use the following -arguments: -

      -

    • To control whether the UNIX group and other mode -bits on an AFS file or directory are set to match the owner mode -bits when it is exported to the non-AFS file system, use the --convert argument. -

    • To control whether tokens can be placed in a credential structure -identified by a UID that differs from the local UID of the entity that is -placing the tokens in the structure, use the -uidcheck -argument. The most common use is to control whether issuers of the -knfs command can specify a value for its -id argument -that does not match their local UID on the NFS/AFS translator machine. -

    • To control whether users can create mounts in the non-AFS filespace to an -AFS directory other than /afs, use the -submounts -argument. -
    -

    Options -

    -

    -type -
    Names the alternate file system to which to reexport the AFS -filespace. The only acceptable value is nfs, in lowercase -letters only. -

    -start -
    Enables the local machine to reexport the AFS filespace if the value is -on, or disables it if the value is off. Omit this -argument to report the current setting for all of the configurable -parameters. -

    -convert -
    Controls the setting of the UNIX group and other -mode bits on AFS files and directories exported to the non-AFS file -system. If the value is on, they are set to match the -owner mode bits. If the value is off, the bits -are not changed. If this argument is omitted, the default value is -on. -

    -uidcheck -
    Controls whether tokens can be placed in a credential structure identified -by a UID that differs from the local UID of the entity that is placing the -tokens in the structure. -
      -

    • If the value is on, the UID that identifies the credential -structure must match the local UID. -

      With respect to the knfs command, this value means that the -value of -id argument must match the issuer's local UID on the -translator machine. In practice, this setting makes it pointless to -include the -id argument to the knfs command, because -the only acceptable value (the issuer's local UID) is already used when -the -id argument is omitted. -

      Enabling UID checking also makes it impossible to issue the klog -and pagsh commands on a client machine of the non-AFS file system -even though it is a system type supported by AFS. For an explanation, -see the reference page for the klog command. -

    • If the value is off (the default), tokens can be assigned to a -local UID in the non-AFS file system that does not match the local UID of the -entity assigning the tokens. -

      With respect to the knfs command, it means that the issuer can -use the -id argument to assign tokens to a local UID on the NFS -client machine that does not match his or her local UID on the translator -machine. (An example is assigning tokens to the MFS client -machine's local superuser root.) This setting allows -more than one issuer of the knfs command to make tokens available -to the same user on the NFS client machine. Each time a different user -issues the knfs command with the same value for the -id -argument, that user's tokens overwrite the existing ones. This can -result in unpredictable access for the user on the NFS client machine. -

    -

    -submounts -
    Controls whether a user of the non-AFS filesystem can mount any directory -in the AFS filespace other than the top-level /afs -directory. If the value is on, such submounts are -allowed. If the value is off, only mounts of the /afs -directory are allowed. If this argument is omitted, the default value -is off. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the machine is not even configured as a server of the non-AFS file -system, the following message appears: -

       Sorry, the file_system-exporter type is currently not supported on
    -   this AFS client
    -   
    -
    -

    If the machine is configured as a server of the non-AFS file system but is -not currently enabled to reexport AFS to it (because the -start -argument to this command is not set to on), the message is as -follows: -

       'file_system' translator is disabled
    -   
    -
    -

    If the machine is enabled to reexport AFS, the following message precedes -messages that report the settings of the other parameters. -

       'file_system' translator is enabled with the following options:
    -   
    -
    -

    The following messages indicate that the -convert argument is -set to on or off respectively: -

       Running in convert owner mode bits to world/other mode
    -   Running in strict unix mode
    -   
    -
    -

    The following messages indicate that the -uidcheck argument is -set to on or off respectively: -

       Running in strict 'passwd sync' mode
    -   Running in no 'passwd sync' mode
    -    
    -
    -

    The following messages indicate that the -submounts argument is -set to on or off respectively: -

       Allow mounts of /afs/.. subdirs
    -   Only mounts to /afs allowed
    -   
    -
    -

    Examples -

    The following example shows that the local machine can export AFS to NFS -client machines. -

       % fs exportafs nfs
    -   'nfs' translator is enabled with the following options:
    -        Running in convert owner mode bits to world/other mode
    -        Running in no 'passwd sync' mode
    -        Only mounts to /afs allowed
    -   
    -
    -

    The following example enables the machine as an NFS server and converts the -UNIX group and other mode bits on exported AFS -directories and files to match the UNIX owner mode bits. -

       % fs exportafs -type nfs -start on -convert on
    -   
    -
    -

    The following example disables the machine from reexporting AFS to NFS -client machines: -

       % fs exportafs -type nfs -start off
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    klog -

    knfs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf140.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf140.htm deleted file mode 100755 index 6e7b34645..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf140.htm +++ /dev/null @@ -1,84 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs flush

    - - - - - - - -

    Purpose -

    Forces the Cache Manager to discard a cached file or directory -

    Synopsis -

    fs flush [-path <dir/file path>+]  [-help]
    -   
    -fs flush [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs flush command removes from the cache all data and status -information associated with each specified file or directory. The next -time an application requests data from the flushed directory or file, the -Cache Manager fetches the most current version from a File Server, along with -a new callback (if necessary) and associated status information. This -command has no effect on two types of data: -

      -

    1. Data in application program buffers -

    2. Data that has been changed locally and written to the cache but not yet -written to the copy on the file server machine -
    -

    To flush all data in the cache that was fetched from the same volume as a -specified file or directory, use the fs flushvolume command. -To flush a corrupted mount point, use the fs flushmount -command. -

    Options -

    -

    -path -
    Names each file or directory to flush from the cache. If it is a -directory, only the directory element itself is flushed, not data cached from -files or subdirectories that reside in it. Partial pathnames are -interpreted relative to the current working directory, which is also the -default value if this argument is omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command flushes from the cache the file -projectnotes in the current working directory and all data from the -subdirectory plans: -

       % fs flush -path projectnotes ./plans/*
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs flushmount -

    fs flushvolume -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf141.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf141.htm deleted file mode 100755 index 60ec8bca3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf141.htm +++ /dev/null @@ -1,80 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs flushmount

    - - - - - - -

    Purpose -

    Forces the Cache Manager to discard a mount point -

    Synopsis -

    fs flushmount [-path <dir/file path>+]  [-help]
    -   
    -fs flushm [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs flushmount command removes from the cache all information -associated with each mount point named by the -path -argument. The next time an application accesses the mount point, the -Cache Manager fetches the most current version of it from the File -Server. Data cached from the associated volume is not affected. -

    The command's intended use is to discard information about mount -points that has become corrupted in the cache. (The Cache Manager -periodically refreshes cached mount points, but the only other way to discard -them immediately is to reinitialize the Cache Manager by rebooting the -machine.) Symptoms of a corrupted mount point included garbled output -from the fs lsmount command, and failed attempts to change -directory to or list the contents of a mount point. -

    To flush cached data rather than a mount point, use the fs flush -or fs flushvolume command. -

    Options -

    -

    -path -
    Names each mount point to flush from the cache. Partial pathnames -are interpreted relative to the current working directory, which is also the -default value if this argument is omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command flushes from the cache the mount point for user -pat's home directory: -

       % fs flushm /afs/abc.com/usr/pat
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs flush -

    fs flushvolume -

    fs lsmount -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf142.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf142.htm deleted file mode 100755 index 6934ae299..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf142.htm +++ /dev/null @@ -1,81 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs flushvolume

    - - - - - - -

    Purpose -

    Forces the Cache Manager to discard all cached data from the volume -containing a file or directory -

    Synopsis -

    fs flushvolume [-path <dir/file path>+]  [-help]
    -   
    -fs flushv [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs flushvolume command removes from the cache all data that -was fetched from the same volume as each specified directory or file. -It does not discard cached status information. The next time an -application requests data from a flushed directory or file, the Cache Manager -fetches the most current version from a File Server, along with a new callback -(if necessary) and associated status information. This command has no -effect on two types of data: -

      -

    1. Data in application program buffers -

    2. Data that has been changed locally and written to the cache but not yet -written to the copy on the file server machine -
    -

    To discard the data and status information associated with individual files -and directories, use the fs flush command. To flush a -corrupted mount point, use the fs flushmount command. -

    Options -

    -

    -path -
    Names a file or directory from each volume for which to discard all cached -data. Partial pathnames are interpreted relative to the current working -directory, which is also the default value if this argument is omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command flushes from the cache all data fetched from the -volume that contains the current working directory: -

       % fs flushvolume 
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs flush -

    fs flushmount -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf143.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf143.htm deleted file mode 100755 index 2c5b2252d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf143.htm +++ /dev/null @@ -1,75 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs getcacheparms

    - - - - - - - - -

    Purpose -

    Displays the current size of the cache and the amount being used -

    Synopsis -

    fs getcacheparms [-help]
    -   
    -fs getca [-h]
    -
    -

    Description -

    The fs getcacheparms command displays the current size of the -cache (which can be in memory or on disk), and the amount currently in -use. -

    The reported statistics are from kernel memory, so the reported size can -differ from the setting specified in the /usr/vice/etc/cacheinfo -file on a machine using a disk cache, if the fs setcachesize -command has been used to alter cache size. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output reports -

       AFS using amount used of the cache's available size 1K byte blocks.
    -   
    -
    -

    where amount used is the number of kilobyte blocks currently used -to cache data and status information, and size is the total current -cache size. -

    Examples -

    The following example shows the output on a machine with a 25000 kilobyte -cache. -

       % fs getcacheparms
    -   AFS using 22876 of the cache's available 25000 1K byte blocks.
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs setcachesize -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf144.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf144.htm deleted file mode 100755 index 18ed0e710..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf144.htm +++ /dev/null @@ -1,76 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs getcellstatus

    - - - - - - -

    Purpose -

    Reports whether the machine can run setuid programs from a specified cell -

    Synopsis -

    fs getcellstatus -cell <cell name>+  [-help]
    -   
    -fs getce -c <cell name>+  [-h]
    -
    -

    Description -

    The fs getcellstatus command reports whether the Cache Manager -allows programs fetched from each specified cell to run with setuid -permission. To set a cell's setuid status, use the fs -setcell command; its reference page fully describes how AFS treats -setuid programs. -

    Options -

    -

    -cell -
    Names each cell for which to report setuid status. Provide the -fully qualified domain name, or a shortened form that disambiguates it from -the other cells listed in the local /usr/vice/etc/CellServDB -file. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output reports one of the following two values as appropriate: -

       Cell cell status: setuid allowed
    -   Cell cell status: no setuid allowed
    -   
    -
    -

    Examples -

    The following example indicates that programs from the cell -abc.com are not allowed to run with setuid -permission. -

       % fs getcellstatus abc.com
    -   Cell abc.com status: no setuid allowed
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    CellServDB (client version) -

    fs setcell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf145.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf145.htm deleted file mode 100755 index 8eb8a5138..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf145.htm +++ /dev/null @@ -1,106 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs getclientaddrs

    - - - - - -

    Purpose -

    Displays the client interfaces to register with the File Server -

    Synopsis -

    fs getclientaddrs [-help]
    -      
    -fs gc [-h]
    -     
    -fs getcl [-h]
    -
    -

    Description -

    The fs getclientaddrs command displays the IP addresses of the -interfaces that the local Cache Manager registers with a File Server when -first establishing a connection to it. -

    The File Server uses the addresses when it initiates a remote procedure -call (RPC) to the Cache Manager (as opposed to responding to an RPC sent by -the Cache Manager). There are two common circumstances in which the -File Server initiates RPCs: when it breaks callbacks and when it pings -the client machine to verify that the Cache Manager is still -accessible. -

    If an RPC to that interface fails, the File Server simultaneously sends -RPCs to all of the other interfaces in the list, to learn which of them are -still available. Whichever interface replies first is the one to which -the File Server then sends pings and RPCs to break callbacks. -

    The fs setclientaddrs reference page explains how the Cache -Manager constructs the list automatically in kernel memory as it initializes, -and how to use that command to alter the kernel list after -initialization. -

    Cautions -

    The File Server uses the list of interfaces displayed by this command only -when selecting an alternative interface after a failed attempt to break a -callback or ping the Cache Manager. When responding to the Cache -Manager's request for file system data, the File Server replies to the -interface which the Cache Manager used when sending the request. If the -File Server's reply to a data request fails, the file server -machine's network routing configuration determines which alternate -network routes to the client machine are available for resending the -reply. -

    The displayed list applies to all File Servers to which the Cache Manager -connects in the future. It is not practical to register different sets -of addresses with different File Servers, because it requires using the -fs setclientaddrs command to change the list and then rebooting -each relevant File Server immediately. -

    The displayed list is not necessarily governing the behavior of a given -File Server, if an administrator has issued the fs setclientaddrs -command since the Cache Manager first contacted that File Server. It -determines only which addresses the Cache Manager registers when connecting to -File Servers in the future. -

    The list of interfaces does not influence the Cache Manager's choice -of interface when establishing a connection to a File Server. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output displays the IP address of each interface that the Cache Manager -is currently registering with File Server processes that it contacts, with one -address per line. The File Server initially uses the first address for -breaking callbacks and pinging the Cache Manager, but the ordering of the -other interfaces is not meaningful. -

    Examples -

    The following example displays the two interfaces that the Cache Manager is -registering with File Servers. -

       % fs getclientaddrs
    -   192.12.105.68
    -   192.12.108.84
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fileserver -

    fs setclientaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf146.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf146.htm deleted file mode 100755 index dc4c1d0c0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf146.htm +++ /dev/null @@ -1,173 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs getserverprefs

    - - - - - - - -

    Purpose -

    Displays the Cache Manager's preference ranks for file server or VL -Server machines -

    Synopsis -

    fs getserverprefs [-file <output to named file>]  
    -                  [-numeric]  [-vlservers]  [-help]
    -     
    -fs gets [-f <output to named file>]  [-n]  [-v]  [-h]
    -    
    -fs gp [-f <output to named file>]  [-n]  [-v]  [-h]
    -
    -

    Description -

    The fs getserverprefs command displays preference ranks for file -server machine interfaces (file server machines run the fs process) -or, if the -vlserver flag is provided, for Volume Location (VL) -Server machines (which run the vlserver process). For file -server machines, the Cache Manager tracks up to 15 interfaces per machine and -assigns a separate rank to each interface. The ranks indicate the order -in which the local Cache Manager attempts to contact the interfaces of -machines that are housing a volume when it needs to fetch data from the -volume. For VL Server machines, the ranks indicate the order in which -the Cache Manager attempts to contact a cell's VL Servers when requesting -VLDB information. For both types of rank, lower integer values are more -preferred. -

    The Cache Manager stores ranks in kernel memory. Once set, a rank -persists until the machine reboots, or until the fs setserverprefs -command is used to change it. The reference page for the fs -setserverprefs command explains how the Cache Manager sets default -ranks, and how to use that command to change the default values. -

    Default VL Server ranks range from 10,000 to 10,126, and the Cache Manager -assigns them to every machine listed in its copy of the -/usr/vice/etc/CellServDB file. When the Cache Manager needs -to fetch VLDB information from a cell, it compares the ranks for the VL Server -machines belonging to that cell, and attempts to contact the VL Server with -the lowest integer rank. If the Cache Manager cannot reach the VL -Server (because of server process, machine or network outage), it tries to -contact the VL Server with the next lowest integer rank, and so on. If -all of a cell's VL Server machines are unavailable, the Cache Manager -cannot fetch data from the cell. -

    Default file server ranks range from 5,000 to 40,000, excluding the range -used for VL Servers (10,000 to 10,126); the maximum possible rank is -65,534. When the Cache Manager needs to fetch data from a volume, it -compares the ranks for the interfaces of machines that house the volume, and -attempts to contact the interface that has the lowest integer rank. If -it cannot reach the fileserver process via that interface (because -of server process, machine or network outage), it tries to contact the -interface with the next lowest integer rank, and so on. If it cannot -reach any of the interfaces for machines that house the volume, it cannot -fetch data from the volume. -

    For both file server machines and VL Server machines, it is possible for a -machine or interface in a foreign cell to have the same rank as a machine or -interface in the local cell. This does not present a problem, because -the Cache Manager only ever compares ranks for machines belonging to one cell -at a time. -

    Options -

    -

    -file -
    Specifies the full pathname of a file to which to write the preference -ranks. If the specified file already exists, the command overwrites its -contents. If the pathname is invalid, the command fails. If this -argument is not provided, the preference ranks appear on the standard output -stream. -

    -numeric -
    Displays the IP addresses of file server machine interfaces or VL Server -machines, rather than their hostnames. If this argument is not -provided, the fs command interpreter has the IP addresses -translated to hostnames such as fs1.abc.com. -

    -vlservers -
    Displays preference ranks for VL Server machines rather than file server -machine interfaces. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output consists of a separate line for each file server machine -interface or VL Server machine, pairing the machine's hostname or IP -address with its rank. The Cache Manager stores IP addresses in its -kernel list of ranks, but the command by default identifies interfaces by -hostname, by calling a translation routine that refers to either the -cell's name service (such as the Domain Name Server) or the local host -table. If an IP address appears in the output, it is because the -translation attempt failed. To bypass the translation step and display -IP addresses rather than hostnames, include the -numeric -flag. This can significantly speed the production of output. -

    By default, the command writes to the standard output stream. Use -the -file argument to write the output to a file instead. -

    Examples -

    The following example displays the local Cache Manager's preference -ranks for file server machines. The local machine belongs to the AFS -cell named abc.com, and in this example the ranks of file -server machines in its local cell are lower than the ranks of file server -machines from the foreign cell, def.com. It is not -possible to translate the IP addresses of two machines on the 138.255 -network. -

       % fs getserverprefs
    -   fs2.abc.com           20007
    -   fs3.abc.com           30002
    -   fs1.abc.com           20011
    -   fs4.abc.com           30010
    -   server1.def.com       40002
    -   138.255.33.34         40000
    -   server6.def.com       40012
    -   138.255.33.37         40005
    -   
    -
    -

    The following example shows hows the output displays IP addresses when the --numeric flag is included, and illustrates how network proximity -determines default ranks (as described on the fs setserverprefs -reference page). The local machine has IP address -192.12.107.210, and the two file server machines on its -subnetwork have ranks of 20,007 and 20,011. The two file server -machines on a different subnetwork of the local machine's network have -higher ranks, 30,002 and 30,010, whereas the ranks of the remaining machines -range from 40,000 to 40,012 because they are in a completely different -network. -

       % fs getserverprefs -numeric
    -   192.12.107.214          20007
    -   192.12.105.99           30002
    -   192.12.107.212          20011
    -   192.12.105.100          30010
    -   138.255.33.41           40002
    -   138.255.33.34           40000
    -   138.255.33.36           40012
    -   138.255.33.37           40005
    -    
    -
    -

    The example shows how the -vlservers flag displays preference -ranks for VL Server machines: -

       % fs getserverprefs -vlservers
    -   fs2.abc.com            10052
    -   fs3.abc.com            10113
    -   fs1.abc.com            10005
    -    
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs setserverprefs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf147.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf147.htm deleted file mode 100755 index 08e2fcf52..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf147.htm +++ /dev/null @@ -1,85 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs help

    - - - -

    Purpose -

    Displays the syntax of specified fs commands or lists functional -descriptions of all fs commands -

    Synopsis -

    fs help [-topic <help string>+]  [-help]
    -   
    -fs h [-t <help string>+]  [-h]
    -
    -

    Description -

    The fs help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every fs command. -

    To display every fs command whose name or short description -includes a specified keyword, use the fs apropos command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the fs part of the command name, providing only -the operation code (for example, specify setacl, not fs -setacl). If this argument is omitted, the output briefly -describes every fs command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each fs command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the fs -setacl command: -

       % fs help setacl
    -   fs setacl: set access control list
    -   aliases: sa 
    -   Usage: fs setacl -dir <directory>+ 
    -   -acl <access list entries>+ [-clear] [-negative] [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs -

    fs apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf148.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf148.htm deleted file mode 100755 index 02a93690b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf148.htm +++ /dev/null @@ -1,175 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs listacl

    - - - - - - -

    Purpose -

    Displays ACLs -

    Synopsis -

    fs listacl [-path <dir/file path>+]  [-id]  [-if]  [-help]
    -   
    -fs la [-p <dir/file path>+]  [-id]  [-if]  [-h] 
    -   
    -fs lista [-p <dir/file path>+]  [-id]  [-if]  [-h] 
    -
    -

    Description -

    The fs listacl command displays the access control list (ACL) -associated with each specified file, directory, or symbolic link. The -specified element can reside in the DFS filespace if the issuer is using the -AFS/DFS Migration Toolkit Protocol Translator to access DFS data (and DFS does -implement per-file ACLs). To display the ACL of the current working -directory, omit the -path argument. -

    To alter an ACL, use the fs setacl command. To copy an -ACL from one directory to another, use the fs copyacl -command. To remove obsolete entries from an ACL, use the fs -cleanacl command. -

    Cautions -

    Placing a user or group on the Negative rights section of the -ACL does not guarantee denial of permissions, if the Normal rights -section grants the permissions to members of the -system:anyuser group. In that case, the user needs -only to issue the unlog command to obtain the permissions granted -to the system:anyuser group. -

    Options -

    -

    -path -
    Names each directory or file for which to display the ACL. For AFS -files, the output displays the ACL from the file's parent directory; -DFS files do have their own ACL. Incomplete pathnames are interpreted -relative to the current working directory, which is also the default value if -this argument is omitted. -

    -id -
    Displays the Initial Container ACL of each DFS directory. This -argument is supported only on DFS directories accessed via the AFS/DFS -Migration Toolkit Protocol Translator. -

    -if -
    Displays the Initial Object ACL of each DFS directory. This -argument is supported only on DFS directories accessed via the AFS/DFS -Migration Toolkit Protocol Translator. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of the output for each file, directory, or symbolic link -reads as follows: -

       Access list for directory is
    -   
    -
    -

    If the issuer used shorthand notation in the pathname, such as the period -(.) to represent the current current directory, that -notation sometimes appears instead of the full pathname of the -directory. -

    Next, the Normal rights header precedes a list of users and -groups who are granted the indicated permissions, with one pairing of user or -group and permissions on each line. If negative permissions have been -assigned to any user or group, those entries follow a Negative -rights header. The format of negative entries is the same as -those on the Normal rights section of the ACL, but the user or -group is denied rather than granted the indicated permissions. -

    AFS does not implement per-file ACLs, so for a file the command displays -the ACL on its directory. The output for a symbolic link displays the -ACL that applies to its target file or directory, rather than the ACL on the -directory that houses the symbolic link. -

    The permissions for AFS enable the possessor to perform the indicated -action: -

    -

    a -
    (administer): change the entries on the ACL -

    d -
    (delete): remove files and subdirectories from the -directory or move them to other directories -

    i -
    (insert): add files or subdirectories to the directory by -copying, moving or creating -

    k -
    (lock): set read locks or write locks on the files in the -directory -

    l -
    (lookup): list the files and subdirectories in the -directory, stat the directory itself, and issue the fs listacl -command to examine the directory's ACL -

    r -
    (read): read the contents of files in the directory; -issue the ls -l command to stat the elements in the directory -

    w -
    (write): modify the contents of files in the directory, -and issue the UNIX chmod command to change their mode bits -

    A, B, C, D, E, -F, G, H: -
    Have no default meaning to the AFS server processes, but are made -available for applications to use in controlling access to the -directory's contents in additional ways. The letters must be -uppercase. -
    -

    For DFS files and directories, the permissions are similar, except that the -DFS x (execute) permission replaces the AFS l -(lookup) permission, DFS c (control) replaces -AFS a (administer), and there is no DFS equivalent to -the AFS k (lock) permission. The meanings of the -various permissions also differ slightly, and DFS does not implement negative -permissions. For a complete description of DFS permissions, see the DFS -documentation and the AFS/DFS Migration Toolkit Administration Guide and -Reference. -

    Examples -

    The following command displays the ACL on the home directory of the user -pat (the current working directory), and on its private -subdirectory. -

       % fs listacl -path . private
    -   Access list for . is
    -   Normal rights:
    -      system:authuser rl
    -      pat rlidwka
    -      pat:friends rlid
    -   Negative rights:
    -      smith rlidwka
    -   Access list for private is
    -   Normal rights:
    -      pat rlidwka
    -   
    -
    -

    Privilege Required -

    If the -path argument names an AFS directory, the issuer must -have the l (lookup) permission on its ACL and the ACL -for every directory that precedes it in the pathname. -

    If the -path argument names an AFS file, the issuer must have -the l (lookup) and r (read) -permissions on the ACL of the file's directory, and the l -permission on the ACL of each directory that precedes it in the -pathname. -

    If the -path argument names a DFS directory or file, the issuer -must have the x (execute) permission on its ACL and on -the ACL of each directory that precedes it in the pathname. -

    Related Information -

    fs cleanacl -

    fs copyacl -

    fs setacl -

    AFS/DFS Migration Toolkit Administration Guide and Reference -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf149.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf149.htm deleted file mode 100755 index 9b320cee4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf149.htm +++ /dev/null @@ -1,89 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs listcells

    - - - - - - - - - -

    Purpose -

    Displays the database server machines in each cell known to the Cache -Manager -

    Synopsis -

    fs listcells [-numeric]  [-help]
    -   
    -fs listc [-n]  [-h]
    -
    -

    Description -

    The fs listcells command formats and displays the list of the -database server machines that the Cache Manager stores in kernel memory for -its home cell and foreign cells. -

    At each reboot of the client machine, the Cache Manager copies the contents -of /usr/vice/etc/CellServDB into kernel memory. To modify -the list between reboots, use the fs newcell command. -

    Options -

    -

    -numeric -
    Displays each database server machine's IP address rather than -hostname. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes a line for each cell included in the Cache -Manager's kernel memory list, in the following format: -

       Cell cell on hosts database server machines
    -   
    -
    -

    The Cache Manager stores IP addresses, but by default has them translated -to hostnames before reporting them, by passing them to the cell's name -service (such as the Domain Name Service or a local host table). The -name service sometimes returns hostnames in uppercase letters, or an IP -address if it cannot resolve a name. -

    Using the -numeric flag bypasses the translation to hostnames, -which can result in significantly faster production of output. The -output includes IP addresses only. -

    Examples -

    The following example shows output for several cells as illustrations of -the different formats for machine names: -

       % fs listcells
    -   Cell abc.com on hosts fs1.abc.com fs2.abc.com fs3.abc.com
    -   Cell stateu.edu on hosts DB1.FS.STATEU.EDU 
    -      DB2.FS.STATEU.EDU DB3.FS.STATEU.EDU
    -   Cell def.gov on hosts 138.255.0.2 sv3.def.gov
    -    
    -
    -

    Privilege Required -

    None -

    Related Information -

    CellServDB (client version) -

    fs newcell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf150.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf150.htm deleted file mode 100755 index 821d4e1b7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf150.htm +++ /dev/null @@ -1,113 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs listquota

    - - - - - - - - - - - - - - - -

    Purpose -

    Displays quota information for the volume containing a file or -directory. -

    Synopsis -

    fs listquota [-path <dir/file path>+]  [-help]  
    -   
    -fs listq [-p <dir/file path>+]  [-h]
    -      
    -fs lq [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs listquota command displays information about the volume -containing each specified directory or file (its name, quota, and amount of -disk space used), along with an indicator of the percentage of space used on -the host partition. -

    To display more information about the host partition, use the fs -examine command. -

    To set volume quota, use the fs setquota or fs setvol -command. -

    Options -

    -

    -path -
    Names a file or directory that resides in the volume about which to -produce output. Partial pathnames are interpreted relative to the -current working directory, which is also the default value if this argument is -omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output displays information about the volume that houses each specified -directory or file, in a tabular format that uses the following headers: -

    -

    Volume Name -
    The name of the volume. -

    Quota -
    The volume's quota in kilobytes, or the string no limit to -indicate an unlimited quota. -

    Used -
    The number of kilobytes of quota used. -

    % Used -
    The percentage of the volume's quota that is used (the -Used statistic divided by the Quota statistic, times -100). -

    Partition -
    The percentage of space used on the partition that houses the -volume. Although not directly related to how much of the user's -quota is used, it is reported because a full partition can cause writing of -data back to the volume to fail even when the volume has not reached its -quota. -
    -

    Examples -

    The following example shows the output for the volume -user.smith: -

       % fs listquota -path /afs/abc.com/usr/smith
    -   Volume Name     Quota    Used    % Used   Partition 
    -   user.smith      15000    5071       34%         86%   
    -    
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs diskfree -

    fs examine -

    fs quota -

    fs setquota -

    fs setvol -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf151.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf151.htm deleted file mode 100755 index 701a64b4b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf151.htm +++ /dev/null @@ -1,120 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs lsmount

    - - - - - -

    Purpose -

    Reports the volume for which a directory is the mount point. -

    Synopsis -

    fs lsmount -dir <directory>+  [-help]
    -   
    -fs ls -d <directory>+  [-h] 
    -
    -

    Description -

    The fs lsmount command reports the volume for which each -specified directory is a mount point, or indicates with an error message that -a directory is not a mount point or is not in AFS. -

    To create a mount point, use the fs mkmount command. To -remove one, use the fs rmmount command. -

    Options -

    -

    -dir -
    Names the directory that serves as a mount point for a volume. The -last element in the pathname provided must be an actual name, not a shorthand -notation such as one or two periods (. or -..). -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the specified directory is a mount point, the output is of the following -form: -

       'directory' is a mount point for volume 'volume name'
    -   
    -
    -

    where -

      -

    • A number sign (#) precedes the volume name string for -a regular mount point. -

    • A percent sign (%) precedes the volume name string for -a read/write mount point. -

    • A cell name and colon (:) follow the number or percent -sign and precede the volume name string for a cellular mount -point. -
    -

    The fs mkmount reference page explains how the Cache Manager -interprets each of the three types of mount points. -

    If the directory is a symbolic link to a mount point, the output is of the -form: -

       'directory' is a symbolic link, leading to a mount point for volume 'volume name'
    -   
    -
    -

    If the directory is not a mount point or is not in AFS, the output -reads: -

       'directory' is not a mount point.
    -   
    -
    -

    If the output is garbled, it is possible that the mount point has become -corrupted in the local AFS client cache. Use the fs -flushmount command to discard it, which forces the Cache Manager to -refetch the mount point. -

    Examples -

    The following example shows the mount point for the home directory of user -smith: -

       % fs lsmount /afs/abc.com/usr/smith
    -   '/afs/abc.com/usr/smith' is a mount point for volume '#user.smith'
    -   
    -
    -

    The following example shows both the regular and read/write mount points -for the ABC Corporation cell's root.cell volume. -

       % fs lsmount /afs/abc.com
    -   '/afs/abc.com' is a mount point for volume '#root.cell'
    -   
    -   % fs lsmount /afs/.abc.com
    -   '/afs/.abc.com' is a mount point for volume '%root.cell'
    -   
    -
    -

    The following example shows a cellular mount point: the State -University cell's root.cell volume as mounted in the -ABC Corporation cell's tree. -

       % fs lsmount /afs/stateu.edu
    -   '/afs/stateu.edu' is a mount point for volume '#stateu.edu:root.cell'
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -dir argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs flushmount -

    fs mkmount -

    fs rmmount -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf152.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf152.htm deleted file mode 100755 index a743217c7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf152.htm +++ /dev/null @@ -1,82 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs messages

    - - - - -

    Purpose -

    Sets whether the Cache Manager writes log messages -

    Synopsis -

    fs messages [-show <[user|console|all|none]>]  [-help]
    -    
    -fs me [-s <[user|console|all|none]>]  [-h]
    -
    -

    Description -

    The fs messages command controls whether the Cache Manager -displays status and warning messages on user screens, the client machine -console, on both, or on neither. -

    There are two types of Cache Manager messages: -

      -

    • User messages provide user-level status and warning information, and the -Cache Manager directs them to user screens. -

    • Console messages provide system-level status and warning information, and -the Cache Manager directs them to the client machine's designated -console. -
    -

    Disabling messaging completely is not recommended, because the messages -provide useful status and warning information. -

    Options -

    -

    -show -
    Specifies the types of messages to display. Choose one of the -following values: -
    -

    user -
    Send user messages to user screens -

    console -
    Send console messages to the console -

    all -
    Send user messages to user screens and console messages to the console -(the default if the -show argument is omitted) -

    none -
    Do not send any messages to user screens or the console -
    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command instructs the Cache Manager to display both types of -messages: -

       % fs messages -show all
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    afsd -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf153.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf153.htm deleted file mode 100755 index 6f2407ecc..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf153.htm +++ /dev/null @@ -1,240 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs mkmount

    - - - - - -

    Purpose -

    Creates a mount point for a volume -

    Synopsis -

    fs mkmount -dir <directory>  -vol <volume name>  [-cell <cell name>]
    -           [-rw]  [-fast]  [-help]
    -   
    -fs mk -d <directory>  -v <volume name>  [-c <cell name>]  [-r]  [-f]  [-h]
    -
    -

    Description -

    The fs mkmount command creates a mount point for the volume -named by the -vol argument at the location in the AFS file space -specified by the -dir argument. The mount point looks like a -standard directory element, and serves as the volume's root directory, -but is actually a special file system object that refers to an AFS -volume. When the Cache Manager first encounters a given mount point -during pathname traversal, it contacts the VL Server to learn which file -server machines house the indicated volume, then fetches a copy of the -volume's root directory from the appropriate file server machine. -

    It is possible, although not recommended, to create more than one mount -point to a volume. The Cache Manager can become confused if a volume is -mounted in two places along the same path through the filespace. -

    The Cache Manager observes three basic rules as it traverses the AFS -filespace and encounters mount points: -

      -

    • Rule 1: Access Backup and Read-only Volumes When -Specified -

      When the Cache Manager encounters a mount point that specifies a volume -with either a .readonly or a .backup -extension, it accesses that type of volume only. If a mount point does -not have either a .backup or .readonly -extension, the Cache Manager uses Rules 2 and 3. -

      For example, the Cache Manager never accesses the read/write version of a -volume if the mount point names the backup version. If the specified -version is inaccessible, the Cache Manager reports an error. -

    • Rule 2: Follow the Read-only Path When Possible -

      If a mount point resides in a read-only volume and the volume that it -references is replicated, the Cache Manager attempts to access a read-only -copy of the volume; if the referenced volume is not replicated, the Cache -Manager accesses the read/write copy. The Cache Manager is thus said to -prefer a read-only path through the filespace, accessing read-only -volumes when they are available. -

      The Cache Manager starts on the read-only path in the first place because -it always accesses a read-only copy of the root.afs volume -if it exists; the volume is mounted at the root of a cell's AFS -filespace (named /afs by convention). That is, if the -root.afs volume is replicated, the Cache Manager attempts to -access a read-only copy of it rather than the read/write copy. This -rule then keeps the Cache Manager on a read-only path as long as each -successive volume is replicated. The implication is that both the -root.afs and root.cell volumes must be -replicated for the Cache Manager to access replicated volumes mounted below -them in the AFS filespace. The volumes are conventionally mounted at -the /afs and /afs/cellname directories, -respectively. -

    • Rule 3: Once on a Read/write Path, Stay There -

      If a mount point resides in a read/write volume and the volume name does -not have a .readonly or a .backup -extension, the Cache Manager attempts to access only the a read/write version -of the volume. The access attempt fails with an error if the read/write -version is inaccessible, even if a read-only version is accessible. In -this situation the Cache Manager is said to be on a read/write path -and cannot switch back to the read-only path unless mount point explicitly -names a volume with a .readonly extension. (Cellular -mount points are an important exception to this rule, as explained in the -following discussion. -

    -

    There are three types of mount points, each appropriate for a different -purpose because of the manner in which the Cache Manager interprets -them. -

      -

    • When the Cache Manager crosses a regular mount point, it obeys -all three of the mount point traversal rules previously described. To -create a regular mount point, include only the required -dir and --vol arguments to the fs mkmount command. - - -
      Note:A regular mount point does not force the Cache Manager always to access -read-only volumes (it is explicitly not a "read-only mount point"). If -a volume is not replicated, the third traversal rule means that the Cache -Manager still accesses the read/write volume when that is the only type -available. However, if the Cache Manager is to access the read-only -version of a replicated volume named by a regular mount point, all volumes -that are mounted above it in the pathname must also be replicated. -
      -

    • When the Cache Manager crosses a read/write mount point, it -attempts to access only the volume version named in the mount point. If -the volume name is the base (read/write) form, without a -.readonly or .backup extension, the Cache -Manager accesses the read/write version of the volume, even if it is -replicated. In other words, the Cache Manager disregards the second -mount point traversal rule when crossing a read/write mount point: it -switches to the read/write path through the filespace. - - -

      To create a read/write mount point, include the -rw flag on the -fs mkmount command. It is conventional to create only one -read/write mount point in a cell's filespace, using it to mount the -cell's root.cell volume just below the AFS filespace -root (by convention, /afs/.cellname). See -the AFS Quick Beginnings for instructions and the chapter about -volume management in the AFS Administration Guide for further -discussion. -

      Creating a read/write mount point for a read-only or backup volume is -acceptable, but unnecessary. The first rule of mount point traversal -already specifies that the Cache Manager accesses them if the volume name in a -regular mount point has a .readonly or -.backup extension. -

    • When the Cache Manager crosses a cellular mount point, it -accesses the indicated volume in the specified cell, which is normally a -foreign cell. (If the mount point does not name a cell along with the -volume, the Cache Manager accesses the volume in the cell where the mount -point resides.) The Cache Manager disregards the third mount point -traversal rule when crossing a regular cellular mount point: it accesses -a read-only version of the volume if it is replicated, even if the volume that -houses the mount point is read/write. Switching to the read-only path -in this way is designed to avoid imposing undue load on the file server -machines in foreign cells. - - - -

      To create a regular cellular mount point, include the -cell -argument on the fs mkmount command. It is conventional to -create cellular mount points only at the second level in a cell's -filespace, using them to mount foreign cells' root.cell -volumes just below the AFS filespace root (by convention, at -/afs/foreign_cellname). The mount point enables -local users to access the foreign cell's filespace, assuming they have -the necessary permissions on the ACL of the volume's root directory and -that there is an entry for the foreign cell in each local client -machine's /usr/vice/etc/CellServDB file. In the output -of the fs lsmount command, the cell name and a colon -(:) appear between the initial number sign and the volume -name in a regular cellular mount point name. -

    -

    Options -

    -

    -dir -
    Names the directory to create as a mount point. The directory must -not already exist. Relative pathnames are interpreted with respect to -the current working directory. -

    Specify the read/write path to the directory, to avoid the failure that -results from attempting to create a new mount point in a read-only -volume. By convention, the read/write path is indicated by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -Description section of this reference page. -

    -vol -
    Specifies the name or volume ID number of the volume to mount. If -appropriate, add the .readonly or .backup -extension to the name, or specify the appropriate volume ID number. -

    -cell -
    Names the cell in which the volume resides (creates a cellular mount -point). Provide the fully qualified domain name, or a shortened form -that disambiguates it from the other cells listed in the local -/usr/vice/etc/CellServDB file. -

    If this argument is omitted, no cell indicator appears in the mount -point. When the Cache Manager interprets it, it assumes that the volume -named in the mount point resides in the same cell as the volume that houses -the mount point. -

    -rw -
    Creates a read/write mount point. Omit this flag to create a -regular mount point. -

    -fast -
    Prevents the Volume Location (VL) Server from checking that the volume has -a VLDB entry and printing a warning message if it does not. Whether or -not this flag is included, the File Server creates the mount point even when -the volume has no VLDB entry. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command creates a regular mount point, mounting the volume -user.smith at -/afs/abc.com/usr/smith: -

       % cd /afs/abc.com/usr
    -      
    -   % fs mkmount -dir smith -vol user.smith
    -   
    -
    -

    The following commands create a read/write mount point and a regular mount -point for the ABC Corporation cell's root.cell volume -in that cell's file tree. The second command follows the -convention of putting a period at the beginning of the read/write mount -point's name. -

       % fs mkmount -dir /afs/abc.com -vol root.cell
    -   
    -   % fs mkmount -dir /afs/.abc.com -vol root.cell -rw
    -   
    -
    -

    The following command mounts the State University cell's -root.cell volume in the ABC Corporation cell's file -tree, creating a regular cellular mount point called -/afs/stateu.edu. When a ABC Corporation Cache Manager -encounters this mount point, it crosses into the State University cell on a -read-only path. -

       % fs mkmount -dir /afs/stateu.edu -vol root.cell -c stateu.edu
    -   
    -
    -

    Privilege Required -

    The issuer must have the i (insert) and a -(administer) permissions on the ACL of the directory that is to -house the mount point. -

    Related Information -

    CellServDB (client version) -

    fs lsmount -

    fs rmmount -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf154.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf154.htm deleted file mode 100755 index 4240c772e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf154.htm +++ /dev/null @@ -1,116 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs newcell

    - - - - - - - - -

    Purpose -

    Changes the kernel-resident list of a cell's database server machines -

    Synopsis -

    fs newcell -name <cell name> -servers <primary servers>+
    -           [-linkedcell <linked cell name>]  [-help]
    -   
    -fs n -n <cell name>  -s <primary servers>+  [-l <linked cell name>]  [-h]
    -
    -

    Description -

    The fs newcell command removes the Cache Manager's -kernel-resident list of database server machines for the cell specified by the --name argument and replaces it with the database server machines -named by the -servers argument. -

    Each time the machine reboots, the Cache Manager constructs the kernel list -of cells and database server machines by reading the local -/usr/vice/etc/CellServDB file. This command does not change -the CellServDB file, so any changes made with it persist only until -the next reboot, unless the issuer also edits the file. The output of -the fs listcells command reflects changes made with this command, -because that command consults the kernel-resident list rather than the -CellServDB file. -

    This command can introduce a completely new cell into the kernel-resident -list, but cannot make a cell inaccessible (it is not possible to remove a -cell's entry from the kernel-resident list by providing no values for the --server argument). To make a cell inaccessible, remove its -entry from the CellServDB file and reboot the machine. -

    If the -name argument names a DCE cell, then the --servers argument names DFS Fileset Location (FL) Server -machines. The -linkedcell argument specifies the name of the -AFS cell to link to a DCE cell for the purpose of DFS fileset location. -Refer to the AFS/DFS Migration Toolkit Administration Guide and -Reference for more information on linking AFS clients to DCE cells using -this command or by editing the /usr/vice/etc/CellServDB -file. -

    Cautions -

    Some commands, such as the klog command, work correctly only -when the information is accurate for a cell in both the CellServDB -file and the kernel-resident list. -

    Options -

    -

    -name -
    Specifies the fully-qualified cell name of the AFS or DCE cell. -

    -servers -
    Specifies the fully-qualified hostnames of all AFS database server -machines or DFS Fileset Location (FL) Server machines for the cell named by -the -name argument. If FL Server machines are specified, the -local machine must be running the AFS/DFS Migration Toolkit Protocol -Translator. -

    -linkedcell -
    Specifies the name of the AFS cell to link to a DCE cell for the purpose -of DFS fileset location. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example changes the machine's kernel-resident list of -database server machines for the ABC Corporation cell to include the machines -db1.abc.com and -db2.abc.com: -

       % fs newcell -name abc.com -servers db1.abc.com db2.abc.com
    -   
    -
    -

    The following example links the DCE cell -dce.abc.com to the AFS cell -abc.com. The AFS client contacts the Fileset Location -(FL) servers db1.dce.abc.com and -db2.dce.abc.com for fileset location -information as it interprets a DFS pathname. -

       % fs newcell -name dce.abc.com -servers db1.dce.abc.com db2.dce.abc.com   \
    -                -linkedcell abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    CellServDB (client version) -

    fs listcells -

    AFS/DFS Migration Toolkit Administration Guide and Reference -

    AFS/DFS Migration Toolkit Administration Installation and -Configuration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf155.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf155.htm deleted file mode 100755 index b8299beb3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf155.htm +++ /dev/null @@ -1,90 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs quota

    - - - - - -

    Purpose -

    Displays the percentage of quota used in the volume containing a directory -or file -

    Synopsis -

    fs quota [-path <dir/file path>+]  [-help]
    -    
    -fs q [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs quota command displays the percent of quota consumed in -the volume that contains each specified directory or file. -

    To display more detailed information about the volume and the partition it -resides on, use the fs examine and fs listquota -commands. -

    To set volume quota, use the fs setquota or fs setvol -command. -

    Options -

    -

    -path -
    Names each file or directory for which to display the quota consumed in -its parent volume. Partial pathnames are interpreted relative to the -current working directory, which is also the default value if this argument is -omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output reports the percent of volume quota used, in the following -format: -

       percent% of quota used.
    -   
    -
    -

    Examples -

    The following command lists the percent quota used of the volume housing -the current working directory: -

       % fs quota
    -   17% of quota used.
    -   
    -
    -

    The following command lists the percent quota used of both the volume -housing the current working directory's parent directory and the volume -housing the directory /afs/abc.com/usr/smith: -

       % fs quota -path  ..  /afs/abc.com/usr/smith
    -   43% of quota used.
    -   92% of quota used.
    -   
    -
    -

    Privilege Required -

    The issuer must have the l (lookup) permission on the -ACL of the root directory of the volume that houses the file or directory -named by the -path argument, and on the ACL of each directory that -precedes it in the pathname. -

    Related Information -

    fs examine -

    fs listquota -

    fs setquota -

    fs setvol -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf156.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf156.htm deleted file mode 100755 index 18b262a86..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf156.htm +++ /dev/null @@ -1,75 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs rmmount

    - - - - - - -

    Purpose -

    Removes a mount point -

    Synopsis -

    fs rmmount -dir <directory>+  [-help]
    -      
    -fs rm -d <directory>+  [-h]
    -
    -

    Description -

    The fs rmmount command removes the mount point named by the --dir argument from the file system. The corresponding volume -remains on its host partition or partitions, but is inaccessible if there are -no other mount points for it. -

    Options -

    -

    -dir -
    Names the mount point to delete from the file system. The last -element in the pathname must be an actual name, not a shorthand notation such -as "dot" (.) or "dot dot" (. .). -

    Specify the read/write path to the directory, to avoid the failure that -results from attempting to delete a mount point from a read-only -volume. By convention, the read/write path is indicated by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes the mount points jones and -terry from the current working directory (the -/afs/abc.com/usr directory). -

       % fs rmmount jones terry
    -    
    -
    -

    Privilege Required -

    The issuer must have the d (delete) permission on the -ACL of the directory that houses each mount point. -

    Related Information -

    fs lsmount -

    fs mkmount -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf157.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf157.htm deleted file mode 100755 index 2e5b36784..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf157.htm +++ /dev/null @@ -1,260 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setacl

    - - - - - - - - - - - - - -

    Purpose -

    Sets the ACL for a directory -

    Synopsis -

    fs setacl -dir <directory>+  -acl <access list entries>+  
    -          [-clear]  [-negative]  [-id]  [-if]  [-help]
    -    
    -fs sa -d <directory>+  -a <access list entries>+  
    -      [-c]  [-n]  [-id]  [-if]  [-h] 
    -      
    -fs seta -d <directory>+  -a <access list entries>+  
    -        [-c]  [-n]  [-id]  [-if]  [-h]
    -
    -

    Description -

    The fs setacl command adds the access control list (ACL) entries -specified with the -acl argument to the ACL of each directory named -by the -dir argument. -

    If the -dir argument designates a pathname in DFS filespace -(accessed via the AFS/DFS Migration Toolkit Protocol Translator), it can be a -file as well as a directory. The ACL must already include an entry for -mask_obj, however. For more details, refer to the -AFS/DFS Migration Toolkit Administration Guide and -Reference. -

    Only user and group entries are acceptable values for the -acl -argument. Do not place machine entries (IP addresses) directly on an -ACL; instead, make the machine entry a group member and place the group -on the ACL. -

    To completely erase the existing ACL before adding the new entries, provide -the -clear flag. To add the specified entries to the -Negative rights section of the ACL (deny rights to -specified users or groups), provide the -negative flag. -

    To display an ACL, use the fs listacl command. To copy an -ACL from one directory to another, use the fs copyacl -command. -

    Cautions -

    If the ACL already grants certain permissions to a user or group, the -permissions specified with the fs setacl command replace the -existing permissions, rather than being added to them. -

    Setting negative permissions is generally unnecessary and not -recommended. Simply omitting a user or group from the Normal -rights section of the ACL is normally adequate to prevent -access. In particular, note that it is futile to deny permissions that -are granted to members of the system:anyuser group on the -same ACL; the user needs only to issue the unlog command to -receive the denied permissions. -

    When including the -clear option, be sure to reinstate an entry -for each directory's owner that includes at least the l -(lookup) permission. Without that permission, it is -impossible to resolve the "dot" ( . ) and "dot dot" ( . . -) shorthand from within the directory. (The directory's owner does -implicitly have the a [administer] permission even on a -cleared ACL, but must know to use it to add other permissions.) -

    Options -

    -

    -dir -
    Names each AFS directory, or DFS directory or file, for which the set the -ACL. Partial pathnames are interpreted relative to the current working -directory. -

    Specify the read/write path to each directory (or DFS file), to avoid the -failure that results from attempting to change a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -acl -
    Defines a list of one or more ACL entries, each a pair that names -
      -

    • A user name or group name as listed in the Protection Database -

    • One or more ACL permissions, indicated either by combining the individual -letters or by one of the four acceptable shorthand words -
    -

    -

    in that order, separated by a space (thus every instance of this argument -has two parts). The accepted AFS abbreviations and shorthand words, and -the meaning of each, are as follows: -

    -

    a -
    (administer): change the entries on the ACL -

    d -
    (delete): remove files and subdirectories from the -directory or move them to other directories -

    i -
    (insert): add files or subdirectories to the directory by -copying, moving or creating -

    k -
    (lock): set read locks or write locks on the files in the -directory -

    l -
    (lookup): list the files and subdirectories in the -directory, stat the directory itself, and issue the fs listacl -command to examine the directory's ACL -

    r -
    (read): read the contents of files in the directory; -issue the ls -l command to stat the elements in the directory -

    w -
    (write): modify the contents of files in the directory, -and issue the UNIX chmod command to change their mode bits -

    A, B, C, D, E, F, G, H -
    Have no default meaning to the AFS server processes, but are made -available for applications to use in controlling access to the -directory's contents in additional ways. The letters must be -uppercase. -

    all -
    Equals all seven permissions (rlidwka). - - - - -

    none -
    No permissions. Removes the user/group from the ACL, but does not -guarantee they have no permissions if they belong to groups that remain on the -ACL. - - -

    read -
    Equals the r (read) and l -(lookup) permissions. - - -

    write -
    Equals all permissions except a (administer), that -is, rlidwk. - - -
    -

    -

    It is acceptable to mix entries that combine the individual letters with -entries that use the shorthand words, but not use both types of notation -within an individual pairing of user or group and permissions. -

    To learn the proper format and acceptable values for DFS ACL entries, see -the AFS/DFS Migration Toolkit Administration Guide and -Reference. -

    -clear -
    Removes all existing entries on each ACL before adding the entries -specified with the -acl argument. -

    -negative -
    Places the specified ACL entries in the Negative -rights section of each ACL, explicitly denying the rights to the -user or group, even if entries on the accompanying Normal -rights section of the ACL grant them permissions. -

    This argument is not supported for DFS files or directories, because DFS -does not implement negative ACL permissions. -

    -id -
    Places the ACL entries on the Initial Container ACL of each DFS directory, -which are the only file system objects for which this flag is -supported. -

    -if -
    Places the ACL entries on the Initial Object ACL of each DFS directory, -which are the only file system objects for which this flag is -supported. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example adds two entries to the Normal rights -section of the current working directory's ACL: the first entry -grants r (read) and l (lookup) -permissions to the group pat:friends, while the other (using -the write shorthand) gives all permissions except a -(administer) to the user smith. -

       % fs setacl -dir . -acl pat:friends rl smith write
    -   
    -   % fs listacl -path .
    -   Access list for . is
    -   Normal rights:
    -      pat:friends rl
    -      smith rlidwk
    -   
    -
    -

    The following example includes the -clear flag, which removes -the existing permissions (as displayed with the fs listacl command) -from the current working directory's reports subdirectory and -replaces them with a new set. -

       % fs listacl -dir reports
    -   Access list for reports is
    -   Normal rights:
    -      system:authuser rl
    -      pat:friends rlid
    -      smith rlidwk
    -      pat rlidwka
    -   Negative rights:
    -      terry rl
    -   
    -   % fs setacl -clear -dir reports -acl pat all smith write system:anyuser rl
    -   
    -   % fs listacl -dir reports
    -   Access list for reports is
    -   Normal rights:
    -      system:anyuser rl
    -      smith rlidwk
    -      pat rlidwka
    -   
    -
    -

    The following example use the -dir and -acl switches -because it sets the ACL for more than one directory (both the current working -directory and its public subdirectory). -

       % fs setacl -dir . public -acl pat:friends rli
    -      
    -   % fs listacl -path . public
    -   Access list for . is
    -   Normal rights:
    -      pat rlidwka
    -      pat:friends rli
    -   Access list for public is
    -   Normal rights:
    -      pat rlidwka
    -      pat:friends rli
    -   
    -
    -

    Privilege Required -

    The issuer must have the a (administer) permission on -the directory's ACL; the directory's owner and the members of -the system:administrators group have the right implicitly, -even if it does not appear on the ACL. -

    Related Information -

    fs copyacl -

    fs listacl -

    fs mkmount -

    AFS/DFS Migration Toolkit Administration Guide and Reference -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf158.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf158.htm deleted file mode 100755 index 678559ce5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf158.htm +++ /dev/null @@ -1,108 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setcachesize

    - - - - - - - - -

    Purpose -

    Sets the size of the disk cache -

    Synopsis -

    fs setcachesize [-blocks <size in 1K byte blocks (0 => reset)>]  
    -                [-reset]  [-help]
    -    
    -fs setca  [-b <size in 1K byte blocks (0 => reset)>]  [-r]  [-h]
    -      
    -fs cachesize [-b <size in 1K byte blocks (0 => reset)>]  [-r]  [-h]
    -  
    -fs ca [-b <size in 1K byte blocks (0 => reset)>]  [-r]  [-h]  
    -
    -

    Description -

    The fs setcachesize command changes the number of kilobyte -blocks of local disk space available to the Cache Manager for its data cache, -on machines that use a disk cache. The command is not operative on -machines that use a memory cache. -

    To return the cache size to the default value specified in the third field -of the local /usr/vice/etc/cacheinfo file, provide a value of -0 to the -blocks argument. -

    To return the cache size to the value set when the machine was last -rebooted, use the -reset flag instead of the -blocks -argument. This is normally the amount specified in the -cacheinfo file, unless the -blocks argument was included -on the afsd command to override the cacheinfo -value. -

    To display the current cache size and amount of cache in use, for both disk -and memory caches, use the fs getcacheparms command. -

    Cautions -

    This command is not operative on machines using a memory cache, and results -in an error message. To change memory cache size, edit the -cacheinfo file and reboot, or reboot and provide the --blocks argument to the afsd command. -

    On machines using a disk cache, do not set the cache size to exceed 85% to -90% of the actual disk space available for the cache directory. The -cache implementation itself requires a small amount of space on the -partition. -

    Options -

    -

    -blocks -
    Specifies the number of one-kilobyte blocks of disk space available for -the Cache Manager to devote to the cache. Provide a value of -0 to set cache size to the default specified in the -cacheinfo file. -

    -reset -
    Returns the cache size to the value set when the machine was last -booted. This agrees with the value in the cacheinfo file -unless the -blocks argument was used on the afsd -command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command sets the disk cache size to 25000 kilobyte -blocks. -

       % fs setcachesize -blocks 25000
    -   
    -
    -

    Both of the following commands reset the disk cache size to the value in -the cacheinfo file, assuming that the -blocks argument -to the afsd command was not used. -

       % fs setcachesize -blocks 0
    -   
    -   % fs setcachesize -reset
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    cacheinfo -

    afsd -

    fs getcacheparms -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf159.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf159.htm deleted file mode 100755 index cd136c6ea..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf159.htm +++ /dev/null @@ -1,103 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setcell

    - - - - - - -

    Purpose -

    Allows or disallows running of setuid programs from specified cells -

    Synopsis -

    fs setcell -cell <cell name>+  [-suid]  [-nosuid]  [-help]
    -   
    -fs setce -c <cell name>+  [-s]  [-n]  [-h]
    -
    -

    Description -

    The fs setcell command sets whether the Cache Manager allows -programs (and other executable files) from each cell named by the --cell argument to run with setuid permission. By default, -the Cache Manager allows programs from its home cell to run with setuid -permission, but not programs from any foreign cells. A program belongs -to the same cell as the file server machine that houses the volume in which -the program's binary file resides, as specified in the file server -machine's /usr/afs/etc/ThisCell file. The Cache Manager -determines its own home cell by reading the /usr/vice/etc/ThisCell -file at initialization. -

    To enable programs from each specified cell to run with setuid permission, -include the -suid flag. To prohibit programs from running -with setuid permission, include the -nosuid flag, or omit both -flags. -

    The fs setcell command directly alters a cell's setuid -status as recorded in kernel memory, so rebooting the machine is -unnecessary. However, non-default settings do not persist across -reboots of the machine unless the appropriate fs setcell command -appears in the machine's AFS initialization file. -

    To display a cell's setuid status, issue the fs -getcellstatus command. -

    Cautions -

    AFS does not recognize effective UID: if a setuid program accesses -AFS files and directories, it does so using the current AFS identity of the -AFS user who initialized the program, not of the program's owner. -Only the local file system recognizes effective UID. -

    Only members of the system:administrators group can turn -on the setuid mode bit on an AFS file or directory. -

    When the setuid mode bit is turned on, the UNIX ls -l command -displays the third user mode bit as an s instead of an -x. However, the s does not appear on an AFS file -or directory unless setuid permission is enabled for the cell in which the -file resides. -

    Options -

    -

    -cell -
    Names each cell for which to set setuid status. Provide the fully -qualified domain name, or a shortened form that disambiguates it from the -other cells listed in the local /usr/vice/etc/CellServDB -file. -

    -suid -
    Allows programs from each specified cell to run with setuid -privilege. Provide it or the -nosuid flag, or omit both -flags to disallow programs from running with setuid privilege. -

    -nosuid -
    Prevents programs from each specified cell from running with setuid -privilege. Provide it or the -suid flag, or omit both flags -to disallow programs form running with setuid privilege. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command enables executable files from the State University -cell to run with setuid privilege on the local machine: -

       % fs setcell -cell stateu.edu -suid
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fs getcellstatus -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf160.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf160.htm deleted file mode 100755 index 213f59c8d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf160.htm +++ /dev/null @@ -1,117 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setclientaddrs

    - - - - - -

    Purpose -

    Sets the client interfaces to register with the File Server -

    Synopsis -

    fs setclientaddrs [-address <client network interfaces>+]  [-help]
    -   
    -fs setcl [-a <client network interfaces>+]  [-h]
    -   
    -fs sc [-a <client network interfaces>+]  [-h]
    -
    -

    Description -

    The fs setclientaddrs command defines the IP addresses of the -interfaces that the local Cache Manager registers with a File Server when -first establishing a connection to it. -

    The File Server uses the addresses when it initiates a remote procedure -call (RPC) to the Cache Manager (as opposed to responding to an RPC sent by -the Cache Manager). There are two common circumstances in which the -File Server initiates RPCs: when it breaks callbacks and when it pings -the client machine to verify that the Cache Manager is still -accessible. -

    The list of interfaces specified with this command replaces the list that -the Cache Manager constructs and records in kernel memory as it -initializes. At that time, if the file /usr/vice/etc/NetInfo -exists on the client machine's local disk, the Cache Manager uses its -contents as the basis for the list of interfaces addresses. If the file -does not exist, the Cache Manager instead uses the network interfaces -configured with the operating system. It then removes from the list any -address included in the local /usr/vice/etc/NetRestrict -file. It records the final list in kernel memory. (An -administrator must create the NetInfo and NetRestrict -files; there are no default versions of them.) -

    If an RPC to that interface fails, the File Server simultaneously sends -RPCs to all of the other interfaces in the list, to learn which of them are -still available. Whichever interface replies first is the one to which -the File Server then sends pings and RPCs to break callbacks. -

    To list the interfaces that the Cache Manager is currently registering with -File Servers, use the fs getclientaddrs command. -

    Cautions -

    The list specified with this command persists in kernel memory only until -the client machine reboots. To preserve it across reboots, either list -the interfaces in the local /usr/vice/etc/NetInfo file, or place -the appropriate fs setclientaddrs command in the machine's AFS -initialization script. -

    Changes made with this command do not propagate automatically to File -Servers to which the Cache Manager has already established a -connection. To force such File Servers to use the revised list, either -reboot each file server machine, or change the NetInfo file and -reboot the client machine. -

    The fs command interpreter verifies that each of the addresses -specified as a value for the -address argument is actually -configured with the operating system on the client machine. If it is -not, the command fails with an error message that marks the address as a -Nonexistent interface. -

    Options -

    -

    -address -
    Specifies each IP address to place in the list of interfaces, in dotted -decimal format. Hostnames are not acceptable. Separate each -address with one or more spaces. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The message -

       Adding interface
    -   
    -
    -

    confirms that each new interface was added to the Cache Manager's -list. The address appears in hexadecimal format to match the notation -used in the File Server log, /usr/afs/logs/FileLog. -

    Examples -

    The following example sets the two interfaces that the Cache Manager -registers with File Servers. -

       % fs setclientaddrs 191.255.105.68 191.255.108.84
    -   Adding 0xbfff6944
    -   Adding 0xbfff6c54
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    NetInfo (client version) -

    NetRestrict (client version) -

    fileserver -

    fs getclientaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf161.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf161.htm deleted file mode 100755 index 76560df34..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf161.htm +++ /dev/null @@ -1,92 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setquota

    - - - - - -

    Purpose -

    Sets the maximum quota for the volume containing a file or directory -

    Synopsis -

    fs setquota [-path <dir/file path>]  -max <max quota in kbytes>  [-help]
    -   
    -fs setq [-p <dir/file path>]  -m <max quota in kbytes>  [-h] 
    -   
    -fs sq [-p <dir/file path>]  -m <max quota in kbytes>  [-h] 
    -
    -

    Description -

    The fs setquota command sets the quota (maximum possible size) -of the read/write volume that contains the directory or file named by the --path argument. -

    To set the quota on multiple volumes at the same time, use the fs -setvol command. -

    To display a volume's quota, use the fs examine, fs -listquota or fs quota command. -

    Options -

    -

    -path -
    Names the directory or file for which to set the host volume's -quota. Partial pathnames are interpreted relative to the current -working directory, which is also the default value if this argument is -omitted. -

    Specify the read/write path to the file or directory, to avoid the failure -that results from attempting to change a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -max -
    Sets the maximum amount of file server disk space the volume can -occupy. Specify the number of one-kilobyte blocks as a positive integer -(1024 is one megabyte). A value of 0 sets an -unlimited quota, but the size of the disk partition that houses the volume -places an absolute limit on the volume's size. -

    If the -path argument is omitted (to set the quota of the volume -housing the current working directory), the -max switch must be -included with this argument. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command imposes a maximum quota of 3000 kilobytes on the -volume that houses the /afs/abc.com/usr/smith -directory: -

       % fs setquota -path /afs/abc.com/usr/smith -max 3000
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators -group. -

    Related Information -

    fs examine -

    fs listquota -

    fs quota -

    fs mkmount -

    fs setvol -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf162.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf162.htm deleted file mode 100755 index 405e91268..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf162.htm +++ /dev/null @@ -1,270 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setserverprefs

    - - - - - - - -

    Purpose -

    Sets the Cache Manager's preference ranks for file server or VL Server -machines -

    Synopsis -

    fs setserverprefs [-servers <fileserver names and ranks>+]
    -                  [-vlservers <VL server names and ranks>+]
    -                  [-file <input from named file>]  [-stdin]  [-help]
    -   
    -fs sets [-se <fileserver names and ranks>+]  [-vl <VL server names and ranks>+]
    -        [-f <input from named file>]  [-st]  [-h]
    -   
    -fs sp [-se <fileserver names and ranks>+]  [-vl <VL server names and ranks>+]  
    -      [-f <input from named file>]  [-st]  [-h]
    -
    -

    Description -

    The fs setserverprefs command sets the local Cache -Manager's preference ranks for one or more file server machine interfaces -or, if the -vlserver argument is provided, for Volume Location (VL) -Server machines. For file server machines, the numerical ranks -determine the order in which the Cache Manager attempts to contact the -interfaces of machines that are housing a volume. For VL Server -machines, the ranks determine the order in which the Cache Manager attempts to -contact a cell's VL Servers when requesting VLDB information. -

    The fs getserverprefs reference page explains how the Cache -Manager uses preference ranks when contacting file server machines or VL -Server machines. The following paragraphs explain how the Cache Manager -calculates default ranks, and how to use this command to change the -defaults. -

    Calculation of Default Preference Ranks -

    The Cache Manager stores a preference rank in kernel memory as a paired IP -address and numerical rank. If a file server machine is multihomed, the -Cache Manager assigns a distinct rank to each of the machine's addresses -(up to the number of addresses that the VLDB can store per machine, which is -specified in the AFS Release Notes). Once calculated, a rank -persists until the machine reboots, or until this command is used to change -it. -

    The Cache Manager sets default VL Server preference ranks as it -initializes, randomly assigning a rank from the range 10,000 to 10,126 to each -of the machines listed in the local /usr/vice/etc/CellServDB -file. Machines from different cells can have the same rank, but this -does not present a problem because the Cache Manager consults only one -cell's ranks at a time. -

    The Cache Manager sets default preference ranks for file server machine as -it fetches volume location information from the VLDB. Each time it -learns about file server machine interfaces for which it has not already set -ranks, it assigns a rank to each interface. If the local client machine -has only one IP address, the Cache Manager compares it to the server -interface's IP address and sets a rank according to the following -algorithm. If the client machine is multihomed, the Cache Manager -applies the algorithm to each of the client machine's addresses and -assigns to the file server machine interface the lowest rank that -results. -

      -

    • If the local machine is a file server machine, the base rank for each of -its interfaces is 5,000. -

    • If the file server machine interface is on the same subnetwork as the -client interface, its base rank is 20,000. -

    • If the file server machine interface is on the same network as the client -interface, or is at the distant end of a point-to-point link with the client -interface, its base rank is 30,000. -

    • If the file server machine interface is on a different network than the -client interface, or the Cache Manager cannot obtain network information about -it, its base rank is 40,000. -
    -

    After assigning a base rank to a file server machine interface, the Cache -Manager adds to it a number randomly chosen from the range 0 (zero) to -14. As an example, a file server machine interface in the same -subnetwork as the local machine receives a base rank of 20,000, but the Cache -Manager records the actual rank as an integer between 20,000 and -20,014. This process reduces the number of interfaces that have exactly -the same rank. As with VL Server machine ranks, it is possible for file -server machine interfaces from foreign cells to have the same rank as -interfaces in the local cell, but this does not present a problem. Only -the relative ranks of the interfaces that house a given volume are relevant, -and AFS only supports storage of a volume in one cell at a time. -

    Setting Non-default Preference Ranks -

    Use the fs setserverprefs command to reset an existing -preference rank, or to set the initial rank of a file server machine interface -or VL Server machine for which the Cache Manager has no rank. To make a -rank persist across a reboot of the local machine, place the appropriate -fs setserverprefs command in the machine's AFS initialization -file. -

    Specify each preference rank as a pair of values separated by one or more -spaces: -

      -

    • The first member of the pair is the fully-qualified hostname (for example, -fs1.abc.com), or the IP address in dotted decimal -format, of a file server machine interface or VL Server machine -

    • The second member of the pair is an integer. The possible ranks -range from 1 through 65535. -
    -

    As with default ranks, the Cache Manager adds a randomly chosen integer to -a rank specified by this command. For file server machine interfaces, -the integer is from the range 0 (zero) to 14; for VL Server machines, it -is from the range 0 (zero) to 126. For example, if the administrator -assigns a rank of 15,000 to a file server machine interface, the Cache Manager -stores an integer between 15,000 to 15,014. -

    There are several ways to provide ranks for file server machine interfaces -(but not for VL Server machines): -

      -

    • On the command line, following the -servers argument. -

    • In a file named by the -file argument. Place each pair -on its own line in the file. Directing the output from the fs -getserverprefs command to a file automatically generates a file with the -proper format. -

    • Via the standard input stream, by providing the -stdin -flag. This method enables the issuer to feed in values directly from a -program or script that generates preference ranks by using an algorithm -appropriate to the local cell. The AFS distribution does not include -such programs or scripts. -
    -

    When setting file server machine preference ranks, it is legal to combine -the -servers, -file, and -stdin options on a -single command line. If different options specify a different rank for -the same interface, the Cache Manager stores and uses the rank assigned with -the -servers argument. -

    The -vlservers argument is the only way to assign VL Server -machine ranks. It can be combined with one or more of the --servers, -file, and -stdin options, but the -Cache Manager applies the values provided for those options to file server -machine ranks only. -

    The fs command interpreter does not verify hostnames or IP -addresses, and so assigns preference ranks to invalid machine names or -addresses. The Cache Manager never uses such ranks unless the same -incorrect information is in the VLDB. -

    Options -

    -

    -servers -
    Specifies one or more file server machine preference ranks. Each -rank pairs the fully-qualified hostname or IP address (in dotted decimal -format) of a file server machine's interface with an integer rank, -separated by one or more spaces; also separate each pair with one or more -spaces. Acceptable values for the rank range from 1 through -65521; a lower value indicates a greater preference. -Providing ranks outside this range can have unpredictable results. -Providing a value no larger than 65521 guarantees that the rank -does not exceed the maximum possible value of 65,535 even if the largest -random factor (14) is added. -

    This argument can be combined with the -file argument, --stdin flag, or both. If more than one of the arguments sets -a rank for the same interface, the rank set by this argument takes -precedence. It can also be combined with the -vlservers -argument, but does not interact with it. -

    -vlservers -
    Specifies one or more VL Server preference ranks. Each rank pairs -the fully-qualified hostname or IP address (in dotted decimal format) of a VL -Server machine with an integer rank, separated by one or more spaces; -also separate each pair with one or more spaces. Acceptable values for -the rank range from 1 through 65521; a lower value -indicates a greater preference. Providing ranks outside this range can -have unpredictable results. Providing a value no larger than -65521 guarantees that the rank does not exceed the maximum possible -value of 65,535 even if the largest random factor (14) is added. -

    This argument can be combined with the -servers argument, --file argument, -stdin flag, or any combination of the -three, but does not interact with any of them. They apply only to file -server machine ranks. -

    -file -
    Specifies the full pathname of a file from which to read pairs of file -server machine interfaces and their ranks, using the same notation and range -of values as for the -servers argument. In the file, place -each pair on its own line and separate the two parts of each pair with one or -more spaces. -

    This argument can be combined with the -servers argument, --stdin flag, or both. If more than one of the arguments sets -a rank for the same interface, the rank set by the -server argument -takes precedence. It can also be combined with the --vlservers argument, but does not interact with it. -

    -stdin -
    Reads pairs of file server machine interface and integer rank from the -standard input stream. The intended use is to accept input piped in -from a user-defined program or script that generates ranks in the appropriate -format, but it also accepts input typed to the shell. Format the -interface and rank pairs as for the -file argument. If -typing at the shell, type <Ctrl-d> after the final newline to -complete the input. -

    This argument can be combined with the -servers argument, the --file argument, or both. If more than one of the arguments -sets a rank for the same interface, the rank set by the -server -argument takes precedence. It can also be combined with the --vlservers argument, but does not interact with it. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command sets the Cache Manager's preference ranks for -the file server machines named fs3.abc.com and -fs4.abc.com, the latter of which is specified by its -IP address, 192.12.105.100. The machines reside in -another subnetwork of the local machine's network, so their default base -rank is 30,000. To increase the Cache Manager's preference for -these machines, the issuer assigns a rank of 25000, to which the -Cache Manager adds an integer in the range from 0 to 15. -

       # fs setserverprefs -servers fs3.abc.com 25000 192.12.105.100 25000
    -   
    -
    -

    The following command uses the -servers argument to set the -Cache Manager's preference ranks for the same two file server machines, -but it also uses the -file argument to read a collection of -preference ranks from a file that resides in the local file -/etc/fs.prefs: -

       # fs setserverprefs -servers fs3.abc.com 25000 192.12.105.100 25000  \ 
    -                       -file /etc/fs.prefs
    -   
    -
    -

    The /etc/fs.prefs file has the following contents and -format: -

       192.12.108.214        7500
    -   192.12.108.212        7500
    -   138.255.33.41         39000
    -   138.255.33.34         39000
    -   128.0.45.36           41000
    -   128.0.45.37           41000
    -   
    -
    -

    The following command uses the -stdin flag to read preference -ranks from the standard input stream. The ranks are piped to the -command from a program, calc_prefs, which was written by the issuer -to calculate preferences based on values significant to the local cell. -

       # calc_prefs | fs setserverprefs -stdin
    -   
    -
    -

    The following command uses the -vlservers argument to set the -Cache Manager's preferences for the VL server machines named -fs1.abc.com, fs3.abc.com, -and fs4.abc.com to base ranks of 1, 11000, and 65521, -respectively: -

       # fs setserverprefs -vlservers fs1.abc.com 1 fs3.abc.com 11000  \
    -                       fs4.abc.com 65521
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fs getserverprefs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf163.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf163.htm deleted file mode 100755 index 60f3cb4e7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf163.htm +++ /dev/null @@ -1,108 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs setvol

    - - - - - - - -

    Purpose -

    Set maximum quota and messages for the volume containing a file or -directory -

    Synopsis -

    fs setvol [-path <dir/file path>+]  [-max <disk space quota in 1K units>]
    -          [-offlinemsg <offline message>]  [-help]
    -   
    -fs setv [-p <dir/file path>+]  [-ma <disk space quota in 1K  units>] 
    -        [-o <offline message>]  [-h]
    -    
    -fs sv [-p <dir/file path>+]  [-ma <disk space quota in 1K units>] 
    -      [-o <offline message>]  [-h]
    -
    -

    Description -

    The fs setvol command sets the quota (maximum possible size) of -the read/write volume that contains each directory or file named by the --path argument. To associate a message with the volume which -then appears in the output of the fs examine command, include the --offlinemsg argument. -

    To display all of the settings made with this command, use the fs -examine command. The fs listquota command reports a -fileset's quota, and the fs quota command the percent of quota -used. -

    To set quota on one volume at a time, use the fs setquota -command. -

    Options -

    -

    -path -
    Names each file or directory for which to set the host volume's quota -and offline message. Partial pathnames are interpreted relative to the -current working directory, which is also the default value if this argument is -omitted. -

    Specify the read/write path to the file or directory, to avoid the failure -that results from attempting to change a read-only volume. By -convention, the read/write path is indicated by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -max -
    Sets the maximum amount of file server disk space the volume can -occupy. Provide a positive integer to indicate the number of -one-kilobyte blocks (1024 is one megabyte). A value of -0 sets an unlimited quota, but the size of the disk partition that -houses the volume places an absolute limit on the volume's size. -

    If the -path argument is omitted (so that the command sets the -quota of the volume housing the current working directory), the --max switch must be provided. -

    -offlinemsg -
    Associates a message with the volume which then appears in the output of -the fs examine command. Its intended use is to explain why -the volume is currently offline. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command imposes a 6500 kilobyte quota on the volumes mounted -at the home directories /afs/abc.com/usr/smith and -/afs/abc.com/usr/pat: -

       % cd /afs/abc.com/usr
    -    
    -   % fs setvol -path smith pat -max 6500
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators -group. -

    Related Information -

    fs examine -

    fs listquota -

    fs mkmount -

    fs quota -

    fs setquota -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf164.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf164.htm deleted file mode 100755 index 92f59bedb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf164.htm +++ /dev/null @@ -1,205 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs storebehind

    - - -

    Purpose -

    Enables asynchronous writes to the file server -

    Synopsis -

    fs storebehind [-kbytes <asynchrony for specified names>]  
    -               [-files <specific pathnames>+]  
    -               [-allfiles <new default (KB)>]  [-verbose]  [-help]
    -    
    -fs st [-k <asynchrony for specified names>]  [-f <specific pathnames>+]  
    -      [-a <new default (KB)>]  [-v]  [-h]
    -
    -

    Description -

    The fs storebehind command enables the Cache Manager to perform -a delayed asynchronous write to the File Server when an application closes a -file. By default, the Cache Manager writes all data to the File Server -immediately and synchronously when an application program closes a -file--that is, the close system call does not return until the -Cache Manager has actually transferred the final chunk of the file to the File -Server. This command specifies the number of kilobytes of a file that -can still remain to be written to the File Server when the Cache Manager -returns control to the application. It is useful if users working on -the machine commonly work with very large files, but also introduces the -complications discussed in the Cautions section. -

    Set either or both of the following in a single command: -

      -

    • To set a value that applies to all AFS files manipulated by applications -running on the machine, use the -allfiles argument. This -value is termed the default store asynchrony for the machine, and -persists until the machine reboots. If it is not set, the default value -is zero, indicating that the Cache Manager performs synchronous writes. -

      -

      As an example, the following setting means that when an application closes -a file, the Cache Manager can return control to the application as soon as no -more than 10 kilobytes of the file remain to be written to the File -Server. -

         -allfiles 10
      -   
      -
      -

    • To set a value that applies to one or more individual files, and overrides -the value of the -allfiles argument for them, combine the --kbytes and -files arguments. The setting -persists as long as there is an entry for the file in the kernel table that -the Cache Manager uses to track certain information about files. In -general, such an entry persists at least until an application closes the file -or exits, but the Cache Manager is free to recycle the entry if the file is -inactive and it needs to free up slots in the table. To increase the -certainty that there is an entry for the file in the table, issue the fs -storebehind command shortly before closing the file. -

      As an example, the following setting means that when an application closes -either of the files bigfile and biggerfile, the Cache -Manager can return control to the application as soon as no more than a -megabyte of the file remains to be written to the File Server. -

         -kbytes 1024 -files bigfile biggerfile
      -   
      -
      -

      Note that once an explicit value has been set for a file, the only way to -make it subject to the default store asynchrony once again is to set --kbytes to that value. In other words, there is no -combination of arguments that automatically makes a file subject to the -default store asynchrony once another value has been set for the file. -

    -

    To display the settings that currently apply to individual files or to all -files, provide the command's arguments in certain combinations as -specified in the Output section of this reference page. -

    Cautions -

    For the following reasons, use of this command is not recommended in most -cases. -

    In normal circumstances, an asynchronous setting results in the Cache -Manager returning control to applications earlier than it otherwise does, but -this is not guaranteed. -

    If a delayed write fails, there is no way to notify the application, since -the close system call has already returned with a code indicating -success. -

    Writing asynchronously increases the possibility that the user will not -notice if a write operation makes the volume that houses the file exceed its -quota. As always, the portion of the file that exceeds the -volume's quota is lost, which prompts a message such as the -following: -

       No space left on device
    -   
    -
    -

    To avoid losing data, it is advisable to verify that the volume housing the -file has space available for the amount of data anticipated to be -written. -

    Options -

    -

    -kbytes -
    Specifies the number of kilobytes of data from each file named by the --files argument that can remain to be written to the file server -when the Cache Manager returns control to an application program that closed -the file. The -files argument is required along with this -argument. Provide an integer from the range 0 (which -reinstates the Cache Manager's default behavior or writing synchronously) -to the maximum AFS file size. -

    -files -
    Names each file to which the value set with the -kbytes -argument applies. The setting persists as long as there is an entry for -the file in the kernel table that the Cache Manager uses to track certain -information about files. Because closing a file generally erases the -entry, when reopening a file the only way to guarantee that the setting still -applies is to reissue the command. If this argument is provided without -the -kbytes argument, the command reports the current setting for -the specified files, and the default store asynchrony. -

    -allfiles -
    Sets the default store asynchrony for the local machine, which is the -number of kilobytes of data that can remain to be written to the file server -when the Cache Manager returns control to the application program that closed -a file. The value applies to all AFS files manipulated by applications -running on the machine, except those for which settings have been made with -the -kbytes and -files arguments. Provide an -integer from the range 0 (which indicates the default of -synchronous writes) to the maximum AFS file size. -

    -verbose -
    Produces output confirming the settings made with the accompanying --kbytes and -files arguments, the -allfiles -argument, or all three. If provided by itself, reports the current -default store asynchrony. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If none of the command's options are included, or if only the --verbose flag is included, the following message reports the -default store asynchrony (the setting that applies to all files manipulated by -applications running on the local machine and for which not more specific -asynchrony is set). -

       Default store asynchrony is x kbytes.
    -   
    -
    -

    A value of 0 (zero) indicates synchronous writes and is the -default if no one has included the -allfiles argument on this -command since the machine last rebooted. -

    If the -files argument is provided without the --kbytes argument, the output reports the value that applies to each -specified file along with the default store asynchrony. If a particular -value has previously been set for a file, the following message reports -it: -

       Will store up to y kbytes of file asynchronously.
    -   Default store asynchrony is x kbytes.
    -   
    -
    -

    If the default store asynchrony applies to a file because no explicit --kbytes value has been set for it, the message is instead as -follows: -

       Will store file according to default.
    -   Default store asynchrony is x kbytes.
    -   
    -
    -

    If the -verbose flag is combined with arguments that set values -(-files and -kbytes, or -allfiles, or all -three), there is a message that confirms immediately that the setting has -taken effect. When included without other arguments or flags, the --verbose flag reports the default store asynchrony only. -

    Examples -

    The following command enables the Cache Manager to return control to the -application program that closed the file test.data when 100 -kilobytes still remain to be written to the File Server. The --verbose flag produces output that confirms the new setting, and -that the default store asynchrony is zero. -

       % fs storebehind -kbytes 100 -files test.data -verbose
    -   Will store up to 100 kbytes of test.data asynchronously.
    -   Default store asynchrony is 0 kbytes.
    -   
    -
    -

    Privilege Required -

    To include the -allfiles argument, the issuer must be logged in -as the local superuser root. -

    To include the -kbytes and -files arguments, the -issuer must either be logged in as the local superuser root or have -the w (write) permission on the ACL of each file's -directory. -

    To view the current settings (by including no arguments, the --file argument alone, or the -verbose argument alone), -no privilege is required. -

    Related Information -

    afsd -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf165.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf165.htm deleted file mode 100755 index b730397b6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf165.htm +++ /dev/null @@ -1,105 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs sysname

    - - - - - - - - - - - - - - -

    Purpose -

    Reports or sets the CPU/operating system type -

    Synopsis -

    fs sysname [-newsys <new sysname>]  [-help]
    -    
    -fs sy [-n <new sysname>]  [-h]
    -
    -

    Description -

    The fs sysname command sets or displays the local machine's -CPU/operating system type as recorded in kernel memory. The Cache -Manager substitutes the string for the @sys variable which can occur -in AFS pathnames; the AFS Quick Beginnings and AFS -Administration Guide explain how using @sys can simplify cell -configuration. It is best to use it sparingly, however, because it can -make the effect of changing directories unpredictable. -

    The command always applies to the local machine only. If issued on -an NFS client machine accessing AFS via the NFS/AFS Translator, the string is -set or reported for the NFS client machine. The Cache Manager on the -AFS client machine serving as the NFS client's NFS/AFS translator machine -stores the value in its kernel memory, and so can provide the NFS client with -the proper version of program binaries when the user issues commands for which -the pathname to the binaries includes @sys. There is a -separate record for each user logged into the NFS client, which implies that -if a user adopts a new identity (UNIX UID) during a login session on the NFS -client--perhaps by using the UNIX su command--he or she -must verify that the correct string is set for the new identity also. -

    Options -

    -

    -newsys -
    Sets the CPU/operating system indicator string for the local -machine. If this argument is omitted, the output displays the current -setting instead. AFS uses a standardized set of strings; consult -the AFS Quick Beginnings or AFS Release Notes. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    When the -newsys argument is omitted, the output reports the -machine's system type in the following format: -

       Current sysname is 'system_type'
    -   
    -
    -

    Examples -

    The following example shows the output produced on a Sun SPARCStation -running Solaris 5.7: -

       % fs sysname
    -   Current sysname is 'sun4x_57'
    -   
    -
    -

    The following command defines a machine to be a IBM RS/6000 running AIX -4.2: -

       % fs sysname -newsys rs_aix42
    -   
    -
    -

    Privilege Required -

    To display the current setting, no privilege is required. To include -the -newsys argument on an AFS client machine, the issuer must be -logged in as the local superuser root. -

    Related Information -

    fs exportafs -

    sys -

    AFS Quick Beginnings -

    AFS Administration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf166.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf166.htm deleted file mode 100755 index 7da23d38a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf166.htm +++ /dev/null @@ -1,80 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs whereis

    - - - - - - - -

    Purpose -

    Reports the name of each file server machine housing a file or directory -

    Synopsis -

    fs whereis [-path <dir/file path>+]  [-help]
    -   
    -fs whe [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs whereis command returns the name of each file server -machine that houses the volume containing each directory or file named by the --path argument. -

    Options -

    -

    -path -
    Names each AFS file or directory for which to return the host file server -machine. Partial pathnames are interpreted relative to the current -working directory, which is also the default value if this argument is -omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes a line for each specified directory or file. It -names the file server machine on which the volume that houses the specified -directory or file resides. A list of multiple machines indicates that -the directory or file is in a replicated volume. -

    Machine names usually have a suffix indicating their cell -membership. If the cell is not clear, use the fs whichcell -command to display the cell in which the directory or file resides. To -display the cell membership of the local machine, use the fs wscell -command. -

    Examples -

    The following example indicates that volume housing the directory -/afs/abc.com resides is replicated on both -fs1.abc.com and -fs3.abc.com: -

       % fs whereis -path /afs/abc.com
    -   File /afs/abc.com is on hosts fs1.abc.com fs3.abc.com
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs whichcell -

    fs wscell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf167.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf167.htm deleted file mode 100755 index 5ae5e1994..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf167.htm +++ /dev/null @@ -1,74 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs whichcell

    - - - - - - - -

    Purpose -

    Returns the name of the cell to which a file or directory belongs -

    Synopsis -

    fs whichcell [-path <dir/file path>+]  [-help]
    -   
    -fs whi  [-p <dir/file path>+]  [-h]
    -
    -

    Description -

    The fs whichcell command returns the name of the cell in which -the volume that houses each indicated directory or file resides. -

    To display the file server machine on which the volume housing a directory -or file resides, use the fs whichcell command. To display -the cell membership of the local machine, use the fs wscell -command. -

    Options -

    -

    -path -
    Names each AFS file or directory for which to return the cell -membership. Partial pathnames are interpreted relative to the current -working directory, which is also the default value if this argument is -omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes a line for each directory or file, naming the cell to -which the volume that houses the directory or file resides. -

    Examples -

    The following example shows that the current working directory resides in a -volume in the ABC Corporation cell: -

       % fs whichcell
    -   File . lives in cell 'abc.com'
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs wscell -

    fs whereis -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf168.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf168.htm deleted file mode 100755 index 4bcaf0ba7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf168.htm +++ /dev/null @@ -1,67 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fs wscell

    - - - - - - -

    Purpose -

    Returns the name of the cell to which a machine belongs -

    Synopsis -

    fs wscell [-help]
    -   
    -fs ws [-h]
    -
    -

    Description -

    The fs wscell command returns the name of the local -machine's home cell. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output displays the contents of the local -/usr/vice/etc/ThisCell file, in the format -

       This workstation belongs to cell 'cellname'
    -   
    -
    -

    Examples -

    The following example results when the fs wscell is issued on a -machine in the State University cell: -

       % fs wscell
    -   This workstation belongs to cell 'stateu.edu'
    -    
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs whereis -

    fs whichcell -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf169.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf169.htm deleted file mode 100755 index 88308463d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf169.htm +++ /dev/null @@ -1,89 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace

    -

    Purpose - - - - - - -

    Introduction to the fstrace command suite -

    Description -

    The commands in the fstrace command suite are the interface that -system administrators employ to trace Cache Manager operations for debugging -purposes. Examples of Cache Manager operations are fetching file data -or the status information used to produce output for the UNIX ls -command. -

    The fstrace command interpreter defines an extensive set of -Cache Manager operations as the cm event set. -When the event set is activated, the Cache Manager writes a message to the -cmfx trace log in kernel memory each time it performs -one of the defined operations. The log expands only to a defined size -(by default, 60 KB), after which it is overwritten in a circular fashion (new -trace messages overwrite the oldest ones). If an operation of -particular interest occurs, the administrator can afterward display the log on -the standard output stream or write it to a file for later study. For -more specific procedural instructions, see the AFS Administration -Guide. -

    There are several categories of commands in the fstrace command -suite: -

      -

    • Commands to administer or display information about the trace log: -

      fstrace clear, fstrace lslog, fstrace -setlog -

    • Commands to set or display the status of the event set: -

      fstrace lsset and fstrace setset -

    • A command to display the contents of the trace log: fstrace -dump -

    • Commands to obtain help: fstrace apropos and fstrace -help -
    -

    Options -

    All fstrace commands accept the following optional flag. -It is listed in the command descriptions and described in detail here: - -

    -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -
    -

    Privilege Required -

    To issue most fstrace commands, the issuer must be logged on as -the local superuser root on the machine that is generating the -trace log. -

    Related Information -

    fstrace apropos -

    fstrace clear -

    fstrace dump -

    fstrace help -

    fstrace lslog -

    fstrace lsset -

    fstrace setlog -

    fstrace setset -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf170.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf170.htm deleted file mode 100755 index c577984b3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf170.htm +++ /dev/null @@ -1,74 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace apropos

    -

    Purpose - - - -

    Displays each help entry containing a keyword string -

    Synopsis -

    fstrace apropos -topic <help string>  [-help]
    -   
    -fstrace ap -t <help string>  [-h]
    -
    -

    Description -

    The fstrace apropos command displays the first line of the -online help entry for any fstrace command that contains in its name -or short description the string specified with the -topic -argument. -

    To display a command's complete syntax, use the fstrace -help command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -fstrace command where the string specified with the --topic argument is part of the command name or first line. -

    Examples -

    The following command lists all fstrace commands that include -the word set in their names or short descriptions: -

       % fstrace apropos set
    -   clear: clear logs by logname or by event set
    -   lsset: list available event sets
    -   setlog: set the size of a log
    -   setset: set state of event sets
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fstrace -

    fstrace help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf171.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf171.htm deleted file mode 100755 index 4ff2e03ef..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf171.htm +++ /dev/null @@ -1,65 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace clear

    -

    Purpose -

    Clears the trace log -

    Synopsis -

    fstrace clear [-set <set_name>+]  [-log <log_name>+]  [-help] 
    -           
    -fstrace c [-s <set_name>+]  [-l <log_name>+]  [-h]
    -
    -

    Description -

    The fstrace clear command erases the contents of the trace log -from kernel memory, but leaves kernel memory allocated for the log. -

    Options -

    -

    -set -
    Names the event set for which to clear the associated trace log. -The only acceptable value is cm (for which the associated trace log -is cmfx). Provide either this argument or the --log argument, or omit both to clear the cmfx log by -default. -

    -log -
    Names the trace log to clear. The only acceptable value is -cmfx. Provide either this argument or the -set -argument, or omit both to clear the cmfx log by default. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command clears the cmfx trace log on the local -machine: -

       # fstrace clear
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fstrace -

    fstrace lslog -

    fstrace lsset -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf172.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf172.htm deleted file mode 100755 index c84e7bdcd..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf172.htm +++ /dev/null @@ -1,208 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace dump

    -

    Purpose - - -

    Dumps a trace log -

    Synopsis -

    fstrace dump [-set <set_name>+]  [-follow <log_name>]  
    -             [-file <output_filename>]  
    -             [-sleep <seconds_between_reads>]  [-help]
    -   
    -fstrace d [-se <set_name>+]  [-fo <log_name>]  [-fi <output_filename>] 
    -          [-sl <seconds_between_reads>]  [-h]
    -
    -

    Description -

    The fstrace dump command displays the current contents of the -cmfx trace log on the standard output stream or writes it to the -file named by the -file argument. -

    To write the log continuously to the standard output stream or to a file, -use the -follow argument. By default, the log's -contents are written out every ten seconds and then automatically -cleared. To change the interval between writes, use the --sleep argument. -

    Cautions -

    This command produces output only if the cm event set is -active. To display or set the event set's state, use the -fstrace lsset or fstrace setset command -respectively. -

    To make the output from this command maximally readable, the message -catalog file called afszcm.cat must reside in the local -/usr/vice/etc/C directory. If necessary, copy the file to -that directory from the AFS Binary Distribution before activating -tracing. -

    When the cm event set is active, a defined amount of kernel -memory (by default, 60 KB) is allocated for the cmfx trace -log. As described on the introductory fstrace reference -page, when the buffer is full, messages are overwritten in a circular fashion -(new messages overwrite the oldest ones). To allocate more kernel -memory for the log, use the fstrace setlog command; to display -the log buffer's current size, use the fstrace lslog command -with the -long argument. -

    Options -

    -

    -set -
    Names the event set for which to write out the associated trace -log. The only acceptable value is cm (for which the -associated trace log is cmfx). Provide either this argument -or the -log argument, or omit both to write out the cmfx -log by default. -

    -follow -
    Names the trace log to write out continuously at a specified interval (by -default, every ten seconds; use the -sleep argument to change -the interval). The log is cleared after each write operation. -

    The only acceptable value is cmfx. Provide either this -argument or the -set argument, or omit both to write out the -cmfx log by default. -

    -file -
    Specifies the pathname of the file to which to write the trace log's -contents. It can be in AFS or on the local disk. Partial -pathnames are interpreted relative to the current working directory. If -this argument is omitted, the trace log appears on the standard output -stream. -

    -sleep -
    Sets the number of seconds between writes of the trace log's contents -when it is dumped continuously. Provide the -follow argument -along with this one. If this argument is omitted, the default interval -is ten seconds. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output begins with a header specifying the date and time at which the -write operation began. If the -follow argument is not -included, the header also reports the number of logs being dumped; it is -always 1, since there is only the cmfx trace log. -The format of the header is as follows: -

       AFS Trace Dump -
    -     Date: starting_timestamp
    -   Found 1 logs.
    -   Contents of log cmfx:
    -   
    -
    -

    Each subsequent message describes a Cache Manager operation in the -following format: -

       time timestamp, pid pid:event_message
    -   
    -
    -

    where -

    -

    timestamp -
    Specifies the time at which the Cache Manager performed the operation, as -the number of seconds since the dump began -

    pid -
    Specifies the process ID of the process or thread associated with the -message -

    event_message -
    Is the message itself. They are generally meaningful only to -someone familiar with the AFS source code. -
    -

    In addition, every 1024 seconds the fstrace command interpreter -writes a message that records the current clock time, in the following -format: -

       time timestamp, pid pid: Current time: unix_time
    -   
    -
    -

    where -

    -

    timestamp -
    Is the number of seconds from the start of trace logging -

    pid -
    Is the process ID number -

    unix_time -
    Is the machine's clock time, represent in the standard UNIX time -format as the number of seconds since midnight on January 1, 1970. -
    -

    Use this message to determine the actual clock time associated with each -log message. Determine the actual time as follows: -

      -

    1. Locate the message of interest. -

    2. Search backward through the trace file for the closest current time -message. -

    3. If the current time message's timestamp is smaller than the -log message's timestamp, subtract former from the latter. -If the current time message's timestamp is larger than the log -message's timestamp, add 1024 to the latter and subtract the -former from the result. -

    4. Add the resulting number to the current time message's -unix_time to determine the log message's actual time. -
    -

    If any of the data in the kernel trace buffer has been overwritten since -tracing was activated, the following message appears at the appropriate place -in the output: -

       Log wrapped; data missing.
    -   
    -
    -

    To reduce the likelihood of overwriting, use the fstrace setlog -command to increase the kernel buffer's size. To display the -current defined buffer size, use the fstrace lslog command with the --long argument. -

    The following message at the end of the log dump indicates that it is -completed: -

       AFS Trace Dump - Completed
    -   
    -
    -

    Examples -

    The following command dumps the log associated with the cm event -set to the standard output stream. -

       # fstrace dump -set cm
    -   AFS Trace Dump -
    -      Date: Tue Apr  7 10:54:57 1998
    -   Found 1 logs.
    -   time 32.965783, pid 0: Tue Apr  7 10:45:52 1998
    -   time 32.965783, pid 33657: Close 0x5c39ed8 flags 0x20 
    -   time 32.965897, pid 33657: Gn_close vp 0x5c39ed8 flags 0x20 (returns 0x0) 
    -   time 35.159854, pid 10891: Breaking callback for 5bd95e4 states 1024 (volume 0)
    -   time 35.407081, pid 10891: Breaking callback for 5c0fadc states 1024 (volume 0)
    -                                    .
    -                                    .
    -                                    .
    -   time 71.440456, pid 33658: Lookup adp 0x5bbdcf0 name g3oCKs \
    -        fid (756 4fb7e:588d240.2ff978a8.6) 
    -   time 71.440569, pid 33658: Returning code 2 from 19 
    -   time 71.440619, pid 33658: Gn_lookup vp 0x5bbdcf0 name g3oCKs (returns 0x2) 
    -   time 71.464989, pid 38267: Gn_open vp 0x5bbd000 flags 0x0 (returns 0x0) 
    -   AFS Trace Dump - Completed
    -   
    -
    -

    The following command dumps the trace log associated with the cm -event set on the local machine to the file -cmfx.dump.file.1, using the default interval -of 10 seconds between successive dumps: -

       # fstrace dump -follow cmfx -file cmfx.dump.file.1
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    afszcm.cat -

    fstrace -

    fstrace lslog -

    fstrace setlog -

    fstrace lsset -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf173.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf173.htm deleted file mode 100755 index 7282a6ded..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf173.htm +++ /dev/null @@ -1,86 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace help

    -

    Purpose - - - -

    Displays the syntax of specified fstrace commands or lists -functional descriptions of all fstrace commands -

    Synopsis -

    fstrace help [-topic <help string>+]  [-help] 
    -    
    -fstrace h [-t <help string>+]  [-h] 
    -
    -

    Description -

    The fstrace help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every fstrace -command. -

    To list every fstrace command whose name or short description -includes a specified keyword, use the fstrace apropos -command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the fstrace part of the command name, providing -only the operation code (for example, specify clear, not -fstrace clear). If this argument is omitted, the output -briefly describes every fstrace command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each fstrace command consists of two -or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the fstrace -setset command: -

       % fstrace help -topic setset
    -   fstrace setset: set state of event sets 
    -   Usage: fstrace setset [-set <set_name>+] [-active] [-inactive]  
    -   [-dormant] [-help] 
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fstrace -

    fstrace apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf174.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf174.htm deleted file mode 100755 index 93530a72c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf174.htm +++ /dev/null @@ -1,107 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace lslog

    -

    Purpose - - -

    Displays information about a log -

    Synopsis -

    fstrace lslog [-set <set_name>+]  [-log <log_name>]  [-long]  [-help]
    -   
    -fstrace lsl [-s <set_name>+]  [-log <log_name>]  [-lon]  [-h] 
    -
    -

    Description -

    The fstrace lslog command reports whether the cmfx -log is available for use. If the -long argument is included, -the output reports the log's defined size, and whether that amount of -space is currently allocated in kernel memory or not. -

    To change the cmfx trace log's size, use the fstrace -setlog command. To display or set whether space is allocated for -it in kernel memory, use the fstrace lsset or fstrace -setset command to display or set the state of the corresponding -cm event set, respectively. -

    Options -

    -

    -set -
    Names the event set for which to display information about the -corresponding trace log. The only acceptable value is cm -(for which the associated trace log is cmfx). Provide either -this argument or the -log argument, or omit both to display -information about the cmfx log by default. -

    -log -
    Names the trace log about which to report. The only acceptable -value is cmfx. Provide either this argument or the --set argument, or omit both to report on the cmfx log by -default. -

    -long -
    Reports the defined size of the log in kilobyte units and whether that -amount of space is currently allocated in kernel memory. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    By default, the fstrace lslog command displays only the name of -the available log, cmfx, in the following format: -

       Available logs:
    -   cmfx
    -    
    -
    -

    When the -long flag is included, the output also reports the -defined size of the log in kilobytes, and whether or not that amount of space -is currently allocated in kernel memory, in the following format: -

       Available logs:
    -   cmfx : log_size kbytes (allocated  |  unallocated)
    -   
    -
    -

    The allocated state indicates that the indicated number of -kilobytes is reserved for the cmfx trace log in kernel -memory. The cm event set's state is either -active or inactive, as reported by the fstrace -lsset command, and set by the fstrace setset command's --active or -inactive flags respectively. -

    The unallocated state indicates that no kernel memory is -currently reserved for the cmfx trace log. The cm -event set's state is dormant, as reported by the fstrace -lsset command and set by the fstrace setset command's --dormant flag. If the event set's state is later -changed to active or inactive, the number of kilobytes indicated as -log_size are again allocated in kernel memory. -

    Examples -

    The following example uses the -long flag to display information -about the cmfx log: -

       # fstrace lslog -log cmfx -long
    -   Available logs:
    -   cmfx : 60 kbytes (allocated)
    -    
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fstrace -

    fstrace lsset -

    fstrace setlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf175.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf175.htm deleted file mode 100755 index 311365343..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf175.htm +++ /dev/null @@ -1,83 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace lsset

    -

    Purpose - - -

    Reports the status of an event set -

    Synopsis -

    fstrace lsset [-set <set_name>+]  [-help] 
    -   
    -fstrace lss [-s <set_name>+]  [-h]
    -
    -

    Description -

    The fstrace lsset command displays a list of the available event -sets and reports their current status (active, inactive, or dormant). -

    To change an event set's status, use the fstrace setset -command. -

    Options -

    -

    -set -
    Names the event set for which to display the status. The only -acceptable value is cm, which is also the default if this argument -is omitted. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output lists the available event sets and the status of each, in the -following format: -

       Available sets:
    -   cm {active | inactive | dormant}
    -   
    -
    -

    where -

    -

    active -
    Indicates that tracing is enabled for the event set, and kernel memory -allocated for the corresponding trace log. -

    inactive -
    Indicates that tracing is temporarily disabled for the event set, but -kernel memory still allocated for the corresponding trace log. -

    dormant -
    Indicates that tracing is disabled for the event set, and no kernel memory -allocated for the corresponding trace log. -
    -

    Examples -

    The following example displays the available event set and its -status: -

       # fstrace lsset
    -   Available sets:
    -   cm active
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fstrace -

    fstrace setset -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf176.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf176.htm deleted file mode 100755 index 83edb69ad..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf176.htm +++ /dev/null @@ -1,75 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace setlog

    -

    Purpose - - -

    Sets the size of a trace log -

    Synopsis -

    fstrace setlog [-log <log_name>+]  -buffersize <1-kilobyte_units>  [-help]
    -      
    -fstrace setl [-l <log_name>+]  -b <1-kilobyte_units>  [-h]
    -      
    -fstrace sl [-l <log_name>+]  -b <1-kilobyte_units>  [-h]
    -
    -

    Description -

    The fstrace setlog command defines the number of kilobytes of -kernel memory allocated for the cmfx trace log. If kernel -memory is currently allocated, the command clears the current log and creates -a new log buffer of the specified size. -

    To display the current defined size of the log buffer, issue the -fstrace lslog command with the -long argument. To -control whether the indicated amount of space is actually allocated, use the -fstrace setset command to set the status of the cm event -set; to display the event set's status, use the fstrace -lsset command. -

    Options -

    -

    -log -
    Names trace log for which to set the size. The only acceptable -value is cmfx, which is also the default if this argument is -omitted. -

    -buffersize -
    Specifies the number of 1-kilobyte blocks of kernel memory to allocate for -the trace log. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command allocated 80 KB of kernel memory for the -cmfx trace log: -

       # fstrace setlog -log cmfx -buffersize 80
    -    
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fstrace -

    fstrace lslog -

    fstrace lsset -

    fstrace setset -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf177.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf177.htm deleted file mode 100755 index 9653405a3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf177.htm +++ /dev/null @@ -1,75 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    fstrace setset

    -

    Purpose - - -

    Sets the status of an event set -

    Synopsis -

    fstrace setset [-set <set_name>+]  [-active]  [-inactive]  [-dormant]  [-help] 
    -   
    -fs set [-s <set_name>+]  [-a]  [-i]  [-d]  [-h]
    -
    -

    Description -

    The fstrace setset command sets the status of the cm -kernel event set on the local machine, which determines whether trace messages -are recorded in the log buffer in kernel memory. -

    Options -

    -

    -set -
    Names the event set for which to set the status. The only -acceptable value cm, which is also the default if this argument is -omitted. -

    -active -
    Enables tracing for the event set and allocates kernel memory for the -associated trace log buffer. Provide one of this flag, the --inactive flag, or the -dormant flag. -

    -inactive -
    Temporarily disables tracing for the event set, but does not change the -allocation of kernel memory for the associated trace log buffer. -Provide one of this flag, the -active flag, or the --dormant flag. -

    -dormant -
    Disables tracing for the event set and frees the kernel memory previously -allocated for the associated trace log buffer. Provide one of this -flag, the -active flag, or the -inactive flag. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example sets the cm event set's status to -inactive: -

       # fstrace setset -set cm -inactive
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    fstrace -

    fstrace lsset -

    fstrace setlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf178.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf178.htm deleted file mode 100755 index ac4fce8db..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf178.htm +++ /dev/null @@ -1,118 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    ftpd (AFS version)

    - - - - - -

    Purpose -

    Initializes the Internet File Transfer Protocol server -

    Synopsis -

    ftpd  [-d]  [-l]  [-t <timeout>]  [-v]  [-T <MaxTimeOut>]  [-u]  [-s]
    -
    -

    Description -

    The AFS-modified ftpd program functions like the standard UNIX -ftpd program, but also authenticates the issuer of the -ftp command (who is presumably working on a remote machine) with -the Authentication Server in the local cell (the home cell of the machine -where the ftpd process is running, as defined in the local -/usr/vice/etc/ThisCell file). The authentication is based on -the user name and password provided at the ftp> prompts on the -remote machine. The Cache Manager on the machine running the -ftpd process stores the newly created token, identifying it by -process authentication group (PAG) rather than by the user's UNIX -UID. -

    The issuer of the ftp command can be working in a foreign cell, -as long as the user name and password provided are valid in the cell where the -ftpd process is running. If the user name under which the -ftp command is issued does not exist in the Authentication Database -for the cell where the ftpd process is running, or the issuer -provides the wrong password, then the ftpd process logs the user -into the local file system of the machine where the ftpd process is -running. The success of this local login depends on the user name -appearing in the local password file and on the user providing the correct -local password. In the case of a local login, AFS server processes -consider the issuer of the ftp command to be the user -anonymous. -

    In the recommended configuration, the AFS version of the ftpd -process is substituted for the standard version (only one of the versions can -run at a time). The administrator then has two choices: -

      -

    • Name the binary for the AFS version something like -ftpd.afs, leaving the standard version as the -ftpd process. Change the inetd.conf -configuration file to refer to the ftpd.afs file rather than -to the standard version. -

    • Rename the binary for the AFS version to the standard name (such as -ftpd) and rename the binary for the standard version to something -like ftpd.orig. No change to the -inetd.conf file is necessary, but it is not as obvious that -the standard version of the ftpd process is no longer in -use. -
    -

    Cautions -

    The AFS distribution does not include an AFS-modified version of this -command for every system type. On system types that use an integrated -authentication system, it is appropriate instead to control the -ftpd daemon's handling of AFS authentication through the -integrated system. For example, on system types that use the Pluggable -Authentication Module (PAM), add an ftpd entry that references the -AFS PAM module to the PAM configuration file. For instructions on -incorporating AFS into a machine's integrated authentication system, see -the AFS Quick Beginnings. -

    Some system types impose the following requirement. If the issuer of -the ftp command on the remote machine is using a shell other than -/bin/csh, then the /etc/shells file on the local disk of -the machine being accessed (the machine running the ftpd process) -must include an entry for the alternate shell. -

    Options -

    -

    -d -
    Directs debugging information to the system log daemon. -

    -l -
    Directs each FTP session to be logged to the system log daemon. -

    -t -
    Specifies a timeout period. By default, the FTP server will timeout -an inactive session after 15 minutes. -

    -v -
    Same as -d. -

    -T -
    Specifies a timeout period in seconds. By default, the FTP server -will timeout after 2 hours (7200 seconds). -

    -s -
    Turns on socket level debugging. Do not use this flag. It is -valid only on an operating system level that AFS does not support. -

    -u -
    Specifies the default UNIX mode bit file mask to use. -
    -

    Privilege Required -

    See the UNIX manual page for the ftpd process. -

    Related Information -

    UNIX manual page for ftp -

    UNIX manual page for ftpd -

    AFS Quick Beginnings -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf179.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf179.htm deleted file mode 100755 index 019b36fae..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf179.htm +++ /dev/null @@ -1,150 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    inetd (AFS version)

    - - - - - -

    Purpose -

    Initializes the Internet service daemon -

    Synopsis -

    inetd [-d]  [<configfile>]
    -
    -

    Description -

    The AFS-modified inetd program functions like the standard UNIX -inetd program, but also enables users of the remote services it -supports to access them as authenticated AFS users, provided that the -supported services are also AFS-modified versions that pass AFS tokens -(authentication information). Examples of supported services are the -rcp and rsh programs. -

    The AFS inetd program can service the standard UNIX versions of -the remote services, but it is instead recommended that the standard UNIX -version of the inetd program be run in parallel with the AFS -version. Name the AFS version something like -inetd.afs and use it to service requests from AFS-modified -programs; use the standard inetd program to service requests -from standard UNIX programs. This separation requires using two -different inetd.conf files, as described in the following -section. -

    Cautions -

    Several configuration changes are necessary for token passing to work -correctly with the AFS version of the inetd program. There -are possibly other UNIX-based requirements or restrictions not mentioned -here; consult the UNIX manual page. (One important restriction is -that there can be no blank lines in the configuration file other than at the -end.) -

    The requirements and restrictions include the following. They assume -that the inetd.afs process is running in parallel with the -standard inetd process. -

      -

    • For token passing to work, the request must come from the AFS version of -the remote service (such as the AFS rcp or AFS rsh -command). If the remote service is the standard UNIX version, it cannot -pass a token. The issuer of the remote command is authenticated only in -the local file system, not with AFS. -

    • The machine's initialization files (/etc/rc file or -equivalent) must invoke both the standard inetd and -inetd.afs programs. -

    • An AFS-specific inetd.conf file, perhaps called -inetd.conf.afs, must exist alongside the standard -one. When initializing the inetd.afs program, specify -this configuration file rather than the standard one. Each line in the -inetd.conf.afs file must include an additional field, -fifth from the left, to specify the identity under which the program is to -run. The normal choice is the local superuser root. -The following sample shows the only lines that need to appear in this -file: -
         ta-rauth stream tcp nowait root internal          ta-rauth
      -   shell    stream tcp nowait root /usr/etc/rshd     rshd
      -   login    stream tcp nowait root /usr/etc/rlogind  rlogind
      -
      -

      Substitute appropriate values for the binary locations and names in the -instructions, particularly for the shell and login -processes. Include the login instruction only if the -AFS-modified versions of login utilities are also in use in the cell; -otherwise, refer to login in the standard -inetd.conf instead. -

      Note also that some system types use different process names. For -example, on Sun system types change rshd to -in.rshd and rlogind.afs to -in.rlogind.afs in the shell and -login instructions, respectively. -

    • Edit the standard inetd.conf file (referenced by the -standard inetd process): comment out the shell -instruction and, if AFS-modified versions of login utilities are in use in the -cell, the login instruction. The -inetd.conf.afs file references these processes -instead. Retain the login instruction if AFS-modified -versions of login utilities are not being used. Alter the -ftp instruction to refer to the AFS version of the ftpd -process, if it is substituted for the standard version. Do not insert -the extra fifth column into instructions in the standard -inetd.conf file if it does not already appear there. -See the following Examples section for an illustration. -
    -

    Options -

    See the UNIX manual page for the inetd program. -

    Examples -

    The following are sample inetd.conf.afs and -inetd.conf files, appropriate for use when the -inetd.afs program is running in parallel with the standard -inetd and AFS-modified login utilities are being used in the -cell. Changes to the standard inetd.conf file include -referencing the AFS version of the ftpd binary and commenting out -the shell and login lines. The example -inetd.conf file does not include the extra fifth -column. Do not use these examples without modifying them appropriately -for the local machine type or cell. -

       # AFS version of Internet server configuration database 
    -   #(EXAMPLE ONLY)
    -   #
    -   ta-rauth stream tcp nowait root internal           ta-rauth
    -   shell    stream tcp nowait root /usr/etc/rshd      rshd
    -   login    stream tcp nowait root /usr/etc/rlogind   rlogind
    -   
    -   # Standard version of Internet server configuration database 
    -   #(EXAMPLE ONLY)
    -   #
    -   ftp	  stream tcp nowait /etc/ftpd.afs   ftpd.afs
    -   telnet stream tcp nowait /etc/telnetd    telnetd
    -   #shell stream tcp nowait /etc/rshd       rshd
    -   #login stream tcp nowait /etc/rlogind    rlogind
    -   finger stream tcp nowait /usr/etc/fingd  fingd
    -   uucp	  stream tcp nowait /etc/uucpd	    uucpd
    -   exec	  stream tcp nowait /etc/rexecd	    rexecd
    -   comsat dgram	 udp wait   /etc/comsat	    comsat
    -   talk	  dgram	 udp wait   /etc/talkd	    talkd
    -   ntalk  dgram	 udp wait   /usr/etc/ntalkd talkd
    -   time	  dgram	 udp wait   /etc/miscd	    timed
    -
    -

    Privilege Required -

    See the UNIX manual page for the inetd program. -

    Related Information -

    rcp (AFS version) -

    rsh (AFS version) -

    UNIX manual page for inetd -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf180.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf180.htm deleted file mode 100755 index 6300246c3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf180.htm +++ /dev/null @@ -1,93 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kadb_check

    - - - -

    Purpose -

    Checks the integrity of the Authentication Database -

    Synopsis -

    kadb_check -database <kadb_file>  [-uheader]  [-kheader]  [-entries]  
    -           [-verbose]  [-rebuild <out_file>]  [-help]
    -   
    -kadb_check -d <kadb_file>  [-u]  [-k]  [-e]  [-v]  [-r <out_file>]  [-h]
    -
    -

    Description -

    The kadb_check command checks the integrity of the Protection -Database, reporting any errors or corruption it finds. If there are -problems, do not issue any kas commands until the database is -repaired. -

    Cautions -

    The results can be unpredictable if the Authentication Server makes changes -to the Authentication Database while this command is running. Use the -bos shutdown command to shutdown the local kaserver -process before running this command, or before creating a second copy of the -kaserver.DB0 file (with a different name) on which to run -the command. -

    Options -

    -

    -database -
    Names the Authentication Database (copy of the -kaserver.DB0 file) to check. If the current working -directory is not the location of the file, provide a pathname, either full or -relative to the current working directory. -

    -uheader -
    Displays information which Ubik maintains in the database's -header. -

    -kheader -
    Displays information which the Authentication Server maintains in the -database's header. -

    -entries -
    Outputs every entry in the database, providing information similar to that -returned by the kas examine command. -

    -verbose -
    Reports additional information about the database, including the number of -free (allocated but unused) entries in the database. -

    -rebuild -
    Names the file in which to record a list of kas commands which, -if issued in the command shell, recreate the current state of the database -being verified. Partial pathnames are interpreted relative to the -current working directory. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If there are errors in the database, the output always reports them on the -standard error stream. If any options other than -database -or -help are provided, the output written to the standard output -stream includes additional information as described for each option in the -preceding Options section of this reference page. The output -is intended for debugging purposes and is meaningful to someone familiar with -the internal structure of the Authentication Database. -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    kaserver.DB0 and kaserver.DBSYS1 -

    bos shutdown -

    kas examine -

    kaserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf181.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf181.htm deleted file mode 100755 index b6ffc0f68..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf181.htm +++ /dev/null @@ -1,189 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas

    - - - - - -

    Purpose -

    Introduction to the kas command suite -

    Description -

    The commands in the kas command suite are the administrative -interface to the Authentication Server, which runs on each database server -machine in a cell, maintains the Authentication Database, and provides the -authentication tickets that client applications must present to AFS servers in -order to obtain access to AFS data and other services. -

    There are several categories of commands in the kas command -suite: -

      -

    • Commands to create, modify, examine and delete entries in the -Authentication Database, including passwords: kas create, -kas delete, kas examine, kas list, kas -setfields, kas setkey, kas setpassword, and -kas unlock -

    • Commands to create, delete, and examine tokens and server tickets: -kas forgetticket, kas listtickets, kas -noauthentication, and kas stringtokey -

    • A command to enter interactive mode: kas interactive -

    • A command to trace Authentication Server operations: kas -statistics -

    • Commands to obtain help: kas apropos and kas -help -
    -

    Because of the sensitivity of information in the Authentication Database, -the Authentication Server authenticates issuers of kas commands -directly, rather than accepting the standard token generated by the Ticket -Granting Service. Any kas command that requires -administrative privilege prompts the issuer for a password. The -resulting ticket is valid for six hours unless the maximum ticket lifetime for -the issuer or the Authentication Server's Ticket Granting Service is -shorter. - - -

    To avoid having to provide a password repeatedly when issuing a sequence of -kas commands, enter interactive mode by issuing the -kas interactive command, typing kas without any -operation code, or typing kas followed by a user and cell name, -separated by an at-sign (@; an example is kas -smith.admin@abc.com). After prompting once for a -password, the Authentication Server accepts the resulting token for every -command issued during the interactive session. See the reference page -for the kas interactive command for a discussion of when to use -each method for entering interactive mode and of the effects of entering a -session. -

    The Authentication Server maintains two databases on the local disk of the -machine where it runs: -

      -

    • The Authentication Database (/usr/afs/db/kaserver.DB0) -stores the information used to provide AFS authentication services to users -and servers, including the password scrambled as an encryption key. The -reference page for the kas examine command describes the -information in a database entry. -

    • An auxiliary file (/usr/afs/local/kaauxdb by default) that -tracks how often the user has provided an incorrect password to the local -Authentication Server. The reference page for the kas -setfields command describes how the Authentication Server uses this file -to enforce the limit on consecutive authentication failures. To -designate an alternate directory for the file, use the kaserver -command's -localfiles argument. -
    -

    Options -

    The following arguments and flags are available on many commands in the -kas suite. (Some of them are unavailable on commands entered -in interactive mode, because the information they specify is established when -entering interactive mode and cannot be changed except by leaving interactive -mode.) The reference page for each command also lists them, but they -are described here in greater detail. -

    -

    - --admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. If this argument is -omitted, the kas command interpreter requests authentication for -the identity under which the issuer is logged onto the local machine. -Do not combine this argument with the -noauth flag. - -

    -cell <cell name> -
    Names the cell in which to run the command. It is acceptable to -abbreviate the cell name to the shortest form that distinguishes it from the -other entries in the /usr/vice/etc/CellServDB file on the local -machine. If the -cell argument is omitted, the command -interpreter determines the name of the local cell by reading the following in -order: -
      -

    1. The value of the AFSCELL environment variable -

    2. The local /usr/vice/etc/ThisCell file -
    -

    -

    The -cell argument is not available on commands issued in -interactive mode. The cell defined when the kas command -interpreter enters interactive mode applies to all commands issued during the -interactive session. - -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -

    - --noauth -
    Establishes an unauthenticated connection to the Authentication Server, in -which the Authentication Server treats the issuer as the unprivileged user -anonymous. It is useful only when authorization checking is -disabled on the server machine (during the installation of a server machine or -when the bos setauth command has been used during other unusual -circumstances). In normal circumstances, the Authentication Server -allows only privileged users to issue most kas commands, and -refuses to perform such an action even if the -noauth flag is -provided. Do not combine this flag with the -admin_username -and -password_for_admin arguments. -

    - --password_for_admin -
    Specifies the password of the command's issuer. It is best to -omit this argument, which echoes the password visibly in the command shell, -instead enter the password at the prompt. Do not combine this argument -with the -noauth flag. -

    - --servers -
    Establishes a connection with the Authentication Server running on each -specified database server machine, instead of on each machine listed in the -local /usr/vice/etc/CellServDB file. In either case, the -kas command interpreter then chooses one of the machines at random -to contact for execution of each subsequent command. The issuer can -abbreviate the machine name to the shortest form that allows the local name -service to identify it uniquely. -
    -

    Privilege Required -

    To issue most kas commands, the issuer must have the -ADMIN flag set in his or her Authentication Database entry (use the -kas setfields command to turn the flag on). -

    Related Information -

    CellServDB (client version) -

    kaserver.DB0 and kaserver.DBSYS1 -

    kaserverauxdb -

    kas apropos -

    kas create -

    kas delete -

    kas examine -

    kas forgetticket -

    kas help -

    kas interactive -

    kas list -

    kas listtickets -

    kas noauthentication -

    kas quit -

    kas setfields -

    kas setpassword -

    kas statistics -

    kas stringtokey -

    kas unlock -

    kaserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf182.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf182.htm deleted file mode 100755 index f68374953..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf182.htm +++ /dev/null @@ -1,71 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    kas apropos -topic <help string>  [-help]
    -    
    -kas a  -t <help string>  [-h]
    -
    -

    Description -

    The kas apropos command displays the first line of the online -help entry for any kas command that has the string specified by the --topic argument in its name or short description. -

    To display the syntax for a command, use the kas help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -kas command where the string specified with the -topic -argument is part of the command name or first line. -

    Examples -

    The following command lists all kas commands that include the -word key in their names or short descriptions: -

       % kas apropos key
    -   setkey: set a user's key
    -   stringtokey: convert a string to a key
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    kas -

    kas help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf183.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf183.htm deleted file mode 100755 index 3e1aa4fab..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf183.htm +++ /dev/null @@ -1,117 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas create

    - - - - - -

    Purpose -

    Creates an entry in the Authentication Database -

    Synopsis -

    kas create -name <name of user>  [-initial_password <initial password>] 
    -           [-admin_username <admin principal to use for authentication>] 
    -           [-password_for_admin <admin password>]  [-cell <cell name>] 
    -           [-servers <explicit list of authentication servers>+]  
    -           [-noauth]  [-help]
    -   
    -kas c -na <name of user>  [-i <initial password>] 
    -      [-a <admin principal to use for authentication>]  
    -      [-p <admin password>]  [-c <cell name>]  
    -      [-s <explicit list of authentication servers>+]  [-no]  [-h] 
    -
    -

    Description -

    The kas create command creates an entry in the Authentication -Database for the user named by the -name argument. -

    To avoid having the account's initial password echo visibly at the -shell prompt, omit the -initial_password argument; the command -interpreter prompts for the password and does not echo it visibly. -Whether or not -initial_password is omitted, the Authentication -Server converts the password into a form suitable for use as an encryption -key, and records it in the entry's key field. -

    To alter settings in an Authentication Database entry, use the kas -setfields command. To examine an entry, use the kas -examine command. To list every entry in the database, use the -kas list command. -

    Options -

    -

    -name -
    Names the new Authentication Database entry. Because it is the name -under which the user logs in, it must obey the restrictions that many -operating systems impose on user names (usually, to contain no more than eight -lowercase letters). -

    -initial_password -
    Sets the user's password; provide a character string that can -include uppercase and lowercase letters, numerals and punctuation. The -Authentication Server scrambles the string into an octal string suitable for -use as an encryption key before placing it in the entry's key -field. If this argument is omitted, the command interpreter prompts for -the string and does not echo it visibly. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example shows the prompts that appear when an administrator -logged in as admin creates an Authentication Database entry for the -user smith, and does not include either the --initial_password or -password_for_admin -arguments. -

       % kas create smith
    -   Password for admin: 
    -   initial_password:
    -   Verifying, please re-enter initial_password:
    -   
    -
    -

    Privilege Required -

    The issuer must have the ADMIN flag set on his or her -Authentication Database entry. -

    Related Information -

    kas -

    kas examine -

    kas list -

    kas setfields -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf184.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf184.htm deleted file mode 100755 index 8d0789469..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf184.htm +++ /dev/null @@ -1,98 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas delete

    - - - - -

    Purpose -

    Deletes an entry from the Authentication Database -

    Synopsis -

    kas delete -name <name of user>  
    -           [-admin_username <admin principal to use for authentication>]  
    -           [-password_for_admin <admin password>]  [-cell <cell name>]  
    -           [-servers <explicit list of authentication servers>+]  
    -           [-noauth]  [-help] 
    -   
    -kas d -na <name of user>  [-a <admin principal to use for authentication>] 
    -      [-p <admin password>]  [-c <cell name>]  
    -      [-s <explicit list of authentication servers>+]  [-no]  [-h] 
    -     
    -kas rm -na <name of user>  [-a <admin principal to use for authentication>]  
    -       [-p <admin password>]  [-c <cell name>]  
    -       [-s <explicit list of authentication servers>+]  [-no]  [-h]  
    -
    -

    Description -

    The kas delete command removes from the Authentication Database -the user entry named by the -name argument. The indicated -user becomes unable to log in, or the indicated server becomes unreachable -(because the Authentication Server's Ticket Granting Service module no -longer has a key with which to seal tickets for the server). -

    Options -

    -

    -name -
    Names the Authentication Database entry to delete. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example shows the administrative user admin -entering interactive mode to delete three accounts. -

       % kas
    -   Password for admin:
    -   ka> delete smith
    -   ka> delete pat
    -   ka> delete terry
    -   
    -
    -

    Privilege Required -

    The issuer must have the ADMIN flag set on his or her -Authentication Database entry. -

    Related Information -

    kas -

    kas create -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf185.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf185.htm deleted file mode 100755 index 5c7e27ed0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf185.htm +++ /dev/null @@ -1,261 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas examine

    - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Displays information from an Authentication Database entry -

    Synopsis -

    kas examine -name <name of user> [-showkey] 
    -            [-admin_username <admin principal to use for authentication>]  
    -            [-password_for_admin <admin password>]  [-cell <cell name>] 
    -            [-servers <explicit list of authentication servers>+]  
    -            [-noauth]  [-help] 
    -    
    -kas e -na <name of user>  [-sh] 
    -      [-a <admin principal to use for authentication>] 
    -      [-p <admin password>]  [-c <cell name>] 
    -      [-se <explicit list of authentication servers>+]  [-no]  [-h]  
    -
    -

    Description -

    The kas examine command formats and displays information from -the Authentication Database entry of the user named by the -name -argument. -

    To alter the settings displayed with this command, issue the kas -setfields command. -

    Cautions -

    Displaying actual keys on the standard output stream by including the --showkey flag constitutes a security exposure. For most -purposes, it is sufficient to display a checksum. -

    Options -

    -

    -name -
    Names the Authentication Database entry from which to display -information. -

    -showkey -
    Displays the octal digits that constitute the key. The issuer must -have the ADMIN flag on his or her Authentication Database -entry. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes: -

      -

    • The entry name, following the string User data for. -

    • One or more status flags in parentheses; they appear only if an -administrator has used the kas setfields command to change them -from their default values. A plus sign (+) separates the -flags if there is more than one. The nondefault values that can appear, -and their meanings, are as follows: -
      -

      ADMIN -
      Enables the user to issue privileged kas commands (default is -NOADMIN) -

      NOTGS -
      Prevents the user from obtaining tickets from the Authentication -Server's Ticket Granting Service (default is TGS) -

      NOSEAL -
      Prevents the Ticket Granting Service from using the entry's key field -as an encryption key (default is SEAL) -

      NOCPW -
      Prevents the user from changing his or her password (default is -CPW) -
      - - - -

    • The key version number, in parentheses, following the word key, -then one of the following. -
        -

      • A checksum equivalent of the key, following the string cksum -is, if the -showkey flag is not included. The checksum -is a decimal number derived by encrypting a constant with the key. In -the case of the afs entry, this number must match the -checksum with the corresponding key version number in the output of the -bos listkeys command; if not, follow the instructions in the -AFS Administration Guide for creating a new server encryption -key. -

      • The actual key, following a colon, if the -showkey flag is -included. The key consists of eight octal numbers, each represented as -a backslash followed by three decimal digits. -
      -

    • The date the user last changed his or her own password, following the -string last cpw (which stands for "last change of -password"). -

    • The string password will never expire indicates that the -associated password never expires; the string password will -expire is followed by the password's expiration date. After -the indicated date, the user cannot authenticate, but has 30 days after it in -which to use the kpasswd or kas setpassword command to -set a new password. After 30 days, only an administrator (one whose -account is marked with the ADMIN flag) can change the password by -using the kas setpassword command. To set the password -expiration date, use the kas setfields command's --pwexpires argument. -

    • The number of times the user can fail to provide the correct password -before the account locks, followed by the string consecutive unsuccessful -authentications are permitted, or the string An unlimited number of -unsuccessful authentications is permitted to indicate that there is no -limit. To set the limit, use the kas setfields -command's -attempts argument. To unlock a locked -account, use the kas unlock command. The kas -setfields reference page discusses how the implementation of the lockout -feature interacts with this setting. -

    • The number of minutes for which the Authentication Server refuses the -user's login attempts after the limit on consecutive unsuccessful -authentication attempts is exceeded, following the string The lock time -for this user is. Use the kas command's --locktime argument to set the lockout time. This line -appears only if a limit on the number of unsuccessful authentication attempts -has been set with the the kas setfields command's --attempts argument. -

    • An indication of whether the Authentication Server is currently refusing -the user's login attempts. The string User is not -locked indicates that authentication can succeed, whereas the string -User is locked until time indicates that the user cannot -authenticate until the indicated time. Use the kas unlock -command to enable a user to attempt authentication. This line appears -only if a limit on the number of unsuccessful authentication attempts has been -set with the kas setfields command's -attempts -argument. -

    • The date on which the Authentication Server entry expires, or the string -entry never expires to indicate that the entry does not -expire. A user becomes unable to authenticate when his or her entry -expires. Use the kas setfields command's --expiration argument to set the expiration date. -

    • The maximum possible lifetime of the tokens that the Authentication Server -grants the user. This value interacts with several others to determine -the actual lifetime of the token, as described on the klog -reference page. Use the kas setfields command's --lifetime argument to set this value. -

    • The date on which the entry was last modified, following the string -last mod on and the user name of the administrator who modified -it. The date on which a user changed his or her own password is -recorded on the second line of output as last cpw instead. -

    • An indication of whether the user can reuse one of his or her last twenty -passwords when issuing the kpasswd, kas setpassword, or -kas setkey commands. Use the kas setfields -command's -reuse argument to set this restriction. -
    -

    Examples -

    The following example command shows the user smith displaying -her own Authentication Database entry. Note the ADMIN flag, -which shows that smith is privileged. -

       % kas examine smith
    -   Password for smith:
    -   User data for smith (ADMIN)
    -    key (0) cksum is 3414844392,  last cpw: Thu Mar 25 16:05:44 1999
    -    password will expire:  Fri Apr 30 20:44:36 1999
    -    5 consecutive unsuccessful authentications are permitted.
    -    The lock time for this user is 25.5 minutes.
    -    User is not locked.
    -    entry never expires. Max ticket lifetime 100.00 hours.
    -    last mod on Tue Jan 5 08:22:29 1999 by admin
    -    permit password reuse
    -   
    -
    -

    In the following example, the user pat examines his -Authentication Database entry to determine when the account lockout currently -in effect will end. -

       % kas examine pat
    -   Password for pat:
    -   User data for pat
    -    key (0) cksum is 73829292912,  last cpw: Wed Apr 7 11:23:01 1999
    -    password will expire:  Fri  Jun 11 11:23:01 1999
    -    5 consecutive unsuccessful authentications are permitted.
    -    The lock time for this user is 25.5 minutes.
    -    User is locked until Tue Sep 21 12:25:07 1999
    -    entry expires on never. Max ticket lifetime 100.00 hours.
    -    last mod on Thu Feb 4 08:22:29 1999 by admin
    -    permit password reuse
    -   
    -
    -

    In the following example, an administrator logged in as admin -uses the -showkey flag to display the octal digits that constitute -the key in the afs entry. -

       % kas examine -name afs -showkey
    -   Password for admin: admin_password
    -   User data for afs
    -    key (12): \357\253\304\352\234\236\253\352, last cpw: no date 
    -    entry never expires. Max ticket lifetime 100.00 hours.
    -    last mod on Thu Mar 25 14:53:29 1999 by admin
    -    permit password reuse
    -   
    -
    -

    Privilege Required -

    A user can examine his or her own entry. To examine others' -entries or to include the -showkey flag, the issuer must have the -ADMIN flag set in his or her Authentication Database entry. -

    Related Information -

    bos addkey -

    bos listkeys -

    bos setauth -

    kas -

    kas setfields -

    kas setpassword -

    kas unlock -

    klog -

    kpasswd -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf186.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf186.htm deleted file mode 100755 index 4ee505550..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf186.htm +++ /dev/null @@ -1,64 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas forgetticket

    - - - - - -

    Purpose -

    Discards all tickets for the issuer -

    Synopsis -

    kas forgetticket [-all]  [-help]
    -    
    -kas f [-a]  [-h]
    -
    -

    Description -

    The kas forgetticket command discards all of the issuer's -tickets stored in the local machine's kernel memory. This includes -the AFS server ticket from each cell in which the user has authenticated, and -any tickets that the user have acquired during the current kas -session (either when entering the session or by using the kas -getticket command). -

    Options -

    -

    -all -
    Discards all tickets. This argument explicitly invokes the -command's default behavior. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command discards all of the issuer's tickets. -

       % kas forgetticket
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    kas -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf187.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf187.htm deleted file mode 100755 index 7abd21b1c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf187.htm +++ /dev/null @@ -1,88 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas help

    - - - -

    Purpose -

    Displays the syntax of each specified kas command or lists -functional descriptions of all kas commands -

    Synopsis -

    kas help [-topic <help string>+]  [-help]
    -   
    -kas h [-t <help string>+]  [-h]
    -
    -

    Description -

    The kas help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every kas command. -

    To list every kas command whose name or short description -includes a specified keyword, use the kas apropos command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the kas part of the command name, providing only -the operation code (for example, specify setpassword, not kas -setpassword). If this argument is omitted, the output briefly -describes every kas command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each kas command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the kas -setpassword command: -

       % kas help setpassword
    -   kas setpassword: set a user's password 
    -   aliases: sp 
    -   Usage: kas setpassword -name <name of user> 
    -   [-new_password <new password>] [-kvno <key version number>] 
    -   [-admin_username <admin principal to use for authentication>] 
    -   [-password_for_admin <password>] [-cell <cell name>] 
    -   [-servers <explicit list of authentication servers>+] [-help]  
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    kas -

    kas apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf188.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf188.htm deleted file mode 100755 index 403cfd6b8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf188.htm +++ /dev/null @@ -1,133 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas interactive

    -

    Purpose -

    Enters interactive mode -

    Synopsis -

    kas interactive [-admin_username <admin principal to use for authentication>] 
    -                [-password_for_admin <admin password>]  [-cell <cell name>] 
    -                [-servers <explicit list of authentication servers>+]  
    -                [-noauth]  [-help]
    -      
    -kas i [-a <admin principal to use for authentication>]  
    -      [-p <admin password>]  [-c <cell name>]  
    -      [-s <explicit list of authentication servers>+]  [-n]  [-h]
    -
    -

    Description -

    The kas interactive command establishes an interactive session -for the issuer of the command. By default, the command interpreter -establishes an authenticated connection for the user logged into the local -file system with all of the Authentication Servers listed in the local -/usr/vice/etc/CellServDB file for the cell named in the local -/usr/vice/etc/ThisCell file. To specify an alternate -identity, cell name, or list of Authentication Servers, include the --admin_username, -cell, or -servers arguments -respectively. Interactive mode lasts for six hours unless the maximum -ticket lifetime for the issuer or the Authentication Server's Ticket -Granting Service is shorter. -

    There are two other ways to enter interactive mode, in addition to the -kas interactive command: -

      -

    1. Type the kas command at the shell prompt without any operation -code. If appropriate, include one or more of the --admin_username, -password_for_admin, -cell, -and -servers arguments. -

    2. Type the kas command followed by a user name and cell name, -separated by an @ sign (for example: kas -admin@abc.com), to establish a connection under the specified -identity with the Authentication Servers listed in the local -/usr/vice/etc/CellServDB file for the indicated cell. If -appropriate, provide the -servers argument to specify an alternate -list of Authentication Server machines that belong to the indicated -cell. -
    -

    There are several consequences of entering interactive mode: -

      -

    • The ka> prompt replaces the system (shell) prompt. When -typing commands at this prompt, provide only the operation code (omit the -command suite name, kas). -

    • The command interpreter does not prompt for the issuer's -password. -

      The issuer's identity and password, the relevant cell, and the set of -Authentication Server machines specified when entering interactive mode apply -to all commands issued during the session. They cannot be changed -without leaving the session, except by using the (kas) -noauthentication command to replace the current authenticated -connections with unauthenticated ones. The -admin_username, --password_for_admin, -cell, and -servers -arguments are ignored if provided on a command issued during interactive -mode. -

    -

    To establish an unauthenticated connection to the Authentication Server, -include the -noauth flag or provide an incorrect password. -Unless authorization checking is disabled on each Authentication Server -machine involved, however, it is not possible to perform any privileged -operations within such a session. -

    To end the current authenticated connection and establish an -unauthenticated one, issue the (kas) noauthentication -command. To leave interactive mode and return to the regular shell -prompt, issue the (kas) quit command. -

    Options -

    -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example shows a user entering interactive mode as the -privileged user admin. -

       % kas interactive admin
    -   Password for admin: admin_password
    -   ka>
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    kas -

    kas noauthentication -

    kas quit -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf189.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf189.htm deleted file mode 100755 index 1b26764c7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf189.htm +++ /dev/null @@ -1,118 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas list

    - - - - -

    Purpose -

    Displays all entries in the Authentication Database -

    Synopsis -

    kas list [-long]  [-showadmin]  [-showkey]
    -         [-admin_username <admin principal to use for authentication>] 
    -         [-password_for_admin <admin password>]  [-cell <cell name>] 
    -         [-servers <explicit list of authentication servers>+]
    -         [-noauth]  [-help]
    -   
    -kas ls [-l]  [-showa]   [-showk]
    -       [-a <admin principal to use for authentication>] 
    -       [-p <admin password>]  [-c <cell name>] 
    -       [-se <explicit list of authentication servers>+]  [-n]  [-h] 
    -
    -

    Description -

    The kas list command either displays all entries from the -Authentication Database by name, or displays the full database entry for a -defined set of entries, as determined by the flag provided: -

      -

    • To display every entry in the Authentication Database in full, include the --long flag. -

    • To display only those entries in full that have the ADMIN flag -set, include the -showadmin flag. -

    • To list only the name of each Authentication Database entry, omit both the --long and -showadmin flags. -
    -

    By default, full entries include a checksum for the encryption key, rather -than the actual octal digits that constitute the key. To display the -octal digits, include the -showkey flag with the -long -or -showadmin flag. -

    Options -

    -

    -long -
    Displays every Authentication Database entry in full. Provide this -flag or the -showadmin flag, or omit both to display just the name -of every database entry. -

    -showadmin -
    Displays in full only the Authentication Database entries that have the -ADMIN flag set. Provide this flag or the -long -flag, or omit both to display just the name of every database entry. -

    -showkey -
    Displays the octal digits that constitute the key in each full -entry. Provide either the -long or -showadmin -flag along with this one. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If neither the -long or -showadmin flag is provided, -the output lists the name of each entry in the Authentication Database on its -own line. -

    If the -long flag is included, the output includes every -Authentication Database entry in full. If the -showadmin -flag is included, the output includes in full only the Authentication Database -entries that have the ADMIN flag set. If the --showkey is provided along with either one, the output includes the -octal digits that constitute the encryption key in each entry. -

    A full Authentication Database entry includes the same information -displayed by the kas examine command; for details, see that -command's reference page. -

    Privilege Required -

    The issuer must have the ADMIN flag set on his or her -Authentication Database entry. -

    Related Information -

    kas -

    kas examine -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf190.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf190.htm deleted file mode 100755 index 56831a734..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf190.htm +++ /dev/null @@ -1,102 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas listtickets

    - - - - -

    Purpose -

    Displays all of the issuer's tickets (tokens) -

    Synopsis -

    kas listtickets [-name <name of server>]  [-long]  [-help]
    -   
    -kas listt [-n <name of server>]  [-l]  [-h]
    -
    -

    Description -

    The kas listtickets command displays the associated user ID (AFS -UID), cell name, and expiration date of some or all of the issuer's -tickets (tokens), depending on which options are provided: -

      -

    • To display all tokens, provide neither the -name argument nor --long flag. The output is similar to that of the -tokens command. -

    • To display a single token, provide the -name argument to -specify name of the Authentication Database entry for the entity that accepts -the token. All AFS server processes accept tokens sealed with the key -from the afs entry. -

    • To display in addition the octal numbers that constitute the token and -session key, provide the -long flag. -
    -

    Options -

    -

    -name -
    Names the Authentication Database entry of the entity (usually a server -process) that accepts the token to display. -

    -long -
    Displays the octal numbers that constitute the session key and -ticket. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output reports the AFS UID of the user who owns the token, the service -(usually, afs) and cell for which it is valid, and its expiration -date, using the following format. If the message does not specify a -cell, the ticket is for the local cell. -

       User's (AFS ID AFS UID) tokens for service[@cellname] [Expires date]
    -   
    -
    -

    If the -long flag is provided, the output also includes the -octal numbers making up the session key and token, along with the key version -number and the number of bytes in the token (if the number of bytes is not 56, -there is an error). -

    If the marker [>> POSTDATED <] appears instead of an -expiration date, the ticket does not become valid until the indicated -time. (Only internal calls can create a postdated ticket; there is -no standard interface that allows users to do this.) -

    Examples -

    The following two examples are for a user with AFS UID 1020 in the -abc.com cell and AFS UID 35 in the -test.abc.com cell. He is working on a machine -in the first cell and is authenticated in both cells. -

       % kas listtickets
    -   User's (AFS ID 1020) tokens for afs [Expires Wed Mar 31 9:30:54 1999]
    -   User's (AFS ID 35@test.abc.com) tokens for afs@test.abc.com  \
    -             [Expires Wed Mar 31 13:54:26 1999]
    -   
    -   % kas listtickets -name afs -long
    -   User's (AFS ID 1020) tokens for afs [Expires Wed Mar 31 9:30:54 1999]
    -   SessionKey: \375\205\351\227\032\310\263\013
    -   Ticket: (kvno = 0, len = 56): \033\005\221\156\203\278\312\058\016\133 (etc.)
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    kas -

    tokens -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf191.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf191.htm deleted file mode 100755 index f3f24efaf..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf191.htm +++ /dev/null @@ -1,71 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas noauthentication

    - - - - - -

    Purpose -

    Discards an authenticated identity in interactive mode -

    Synopsis -

    noauthentication  [-help]
    -   
    -n  [-h]
    -
    -

    Description -

    The kas noauthentication command closes the (presumably -authenticated) connection that the issuer established with one or more -Authentication Server processes when entering interactive mode. It -opens a new unauthenticated connection to each server, assigning the issuer -the unprivileged identity anonymous. It does not actually -discard the user's tokens from the Cache Manager's memory (as the -unlog or kas forgetticket command does). Unless -authorization checking is disabled on each Authentication Server machine, it -becomes impossible to perform any privileged operations within the session -established by this command. -

    This command is operative only during interactive mode, so omit the -kas command suite name from the command line. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example command discards the authentication information with -which the user entered interactive mode. -

       ka> noauthentication
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    kas -

    kas forgetticket -

    kas interactive -

    unlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf192.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf192.htm deleted file mode 100755 index 0dc498e80..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf192.htm +++ /dev/null @@ -1,63 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas quit

    - - - - - -

    Purpose -

    Leaves interactive mode -

    Synopsis -

    quit  [-help]
    -   
    -q  [-h]
    -
    -

    Description -

    The kas quit command ends interactive mode, severing the -authenticated connection to one or more Authentication Server processes and -returning the issuer to the normal shell prompt. -

    This command is operative only during interactive mode, so omit the -kas command suite name from the command line. -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example demonstrates how the normal command shell prompt -returns when the issuer leaves interactive mode. -

       ka> quit
    -   %
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    kas -

    kas interactive -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf193.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf193.htm deleted file mode 100755 index 278960542..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf193.htm +++ /dev/null @@ -1,351 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas setfields

    - - - - - - - - - - - - - -

    Purpose -

    Sets optional characteristics in an Authentication Database entry -

    Synopsis -

    kas setfields -name <name of user>
    -              [-flags <hex flag value or flag name expression>] 
    -              [-expiration <date of account expiration>] 
    -              [-lifetime <maximum ticket lifetime>] 
    -              [-pwexpires <number days password is valid ([0..254])>]
    -              [-reuse <permit password reuse (yes/no)>]
    -              [-attempts <maximum successive failed login tries ([0..254])>]
    -              [-locktime <failure penalty [hh:mm or minutes]>]
    -              [-admin_username <admin principal to use for authentication>] 
    -              [-password_for_admin <admin password>]  [-cell <cell name>] 
    -              [-servers <explicit list of authentication servers>+]
    -              [-noauth]  [-help]
    -   
    -kas setf -na <name of user>  [-f <hex flag value or flag name expression>]
    -         [-e <date of account expiration>]  [-li <maximum ticket lifetime>]
    -         [-pw <number days password is valid ([0..254])>]
    -         [-r <permit password reuse (yes/no)>]
    -         [-at <maximum successive failed login tries ([0..254])>]
    -         [-lo <failure penalty [hh:mm or minutes]>]
    -         [-ad <admin principal to use for authentication>] 
    -         [-pa <admin password>]  [-c <cell name>]
    -         [-s <explicit list of authentication servers>+]  [-no]  [-h] 
    -   
    -kas sf -na <name of user>  [-f <hex flag value or flag name expression>]
    -       [-e <date of account expiration>]  [-li <maximum ticket lifetime>]
    -       [-pw <number days password is valid ([0..254])>]
    -       [-r <permit password reuse (yes/no)>]
    -       [-at <maximum successive failed login tries ([0..254])>]
    -       [-lo <failure penalty [hh:mm or minutes]>]
    -       [-ad <admin principal to use for authentication>] 
    -       [-pa <admin password>]  [-c <cell name>]
    -       [-s <explicit list of authentication servers>+]  [-no]  [-h]
    -
    -

    Description -

    The kas setfields command changes the Authentication Database -entry for the user named by the -name argument in the manner -specified by the various optional arguments, which can occur singly or in -combination: -

      -

    • To set the flags that determine whether the user has administrative -privileges to the Authentication Server, can obtain a ticket, can change his -or her password, and so on, include the -flags argument. -

    • To set when the Authentication Database entry expires, include the --expiration argument. -

    • To set the maximum ticket lifetime associated with the entry, include the --lifetime argument. The reference page for the -klog command explains how this value interacts with others to -determine the actual lifetime of a token. -

    • To set when the user's password expires, include the --pwexpires argument. -

    • To set whether the user can reuse any of the previous twenty passwords -when creating a new one, include the -reuse argument. -

    • To set the maximum number of times the user can provide an incorrect -password before the Authentication Server refuses to accept any more attempts -(locks the issuer out), include the -attempts argument. -After the sixth failed authentication attempt, the Authentication Server logs -a message in the UNIX system log file (the syslog file or -equivalent, for which the standard location varies depending on the operating -system). -

    • To set how long the Authentication Server refuses to process -authentication attempts for a locked-out user, set the -locktime -argument. -
    -

    The kas examine command displays the settings made with this -command. -

    Cautions -

    The password lifetime set with the -pwexpires argument begins at -the time the user's password was last changed, rather than when this -command is issued. It can therefore be retroactive. If, for -example, a user changed her password 100 days ago and the password lifetime is -set to 100 days or less, the password effectively expires immediately. -To avoid retroactive expiration, instruct the user to change the password just -before setting a password lifetime. -

    Administrators whose authentication accounts have the ADMIN flag -enjoy complete access to the sensitive information in the Authentication -Database. To prevent access by unauthorized users, use the --attempts argument to impose a fairly strict limit on the number of -times that a user obtaining administrative tokens can provide an incorrect -password. Note, however, that there must be more than one account in -the cell with the ADMIN flag. The kas unlock -command requires the ADMIN privilege, so it is important that the -locked-out administrator (or a colleague) can access another -ADMIN-privileged account to unlock the current account. -

    In certain circumstances, the mechanism used to enforce the number of -failed authentication attempts can cause a lockout even though the number of -failed attempts is less than the limit set by the -attempts -argument. Client-side authentication programs such as klog -and an AFS-modified login utility normally choose an Authentication Server at -random for each authentication attempt, and in case of a failure are likely to -choose a different Authentication Server for the next attempt. The -Authentication Servers running on the various database server machines do not -communicate with each other about how many times a user has failed to provide -the correct password to them. Instead, each Authentication Server -maintains its own separate copy of the auxiliary database file -kaserverauxdb (located in the /usr/afs/local directory -by default), which records the number of consecutive authentication failures -for each user account and the time of the most recent failure. This -implementation means that on average each Authentication Server knows about -only a fraction of the total number of failed attempts. The only way to -avoid allowing more than the number of attempts set by the --attempts argument is to have each Authentication Server allow only -some fraction of the total. More specifically, if the limit on failed -attempts is f, and the number of Authentication Servers is -S, then each Authentication Server can only permit a number of -attempts equal to f divided by S (the Ubik -synchronization site for the Authentication Server tracks any remainder, -fmodS). -

    Normally, this implementation does not reduce the number of allowed -attempts to less than the configured limit (f). If one -Authentication Server refuses an attempt, the client contacts another instance -of the server, continuing until either it successfully authenticates or has -contacted all of the servers. However, if one or more of the -Authentication Server processes is unavailable, the limit is effectively -reduced by a percentage equal to the quantity U divided by -S, where U is the number of unavailable servers and -S is the number normally available. -

    To avoid the undesirable consequences of setting a limit on failed -authentication attempts, note the following recommendations: -

      -

    • Do not set the -attempts argument (the limit on failed -authentication attempts) too low. A limit of nine failed attempts is -recommended for regular user accounts, to allow three failed attempts per -Authentication Server in a cell with three database server machines. -

    • Set fairly short lockout times when including the -locktime -argument. Although guessing passwords is a common method of attack, it -is not a very sophisticated one. Setting a lockout time can help -discourage attackers, but excessively long times are likely to be more of a -burden to authorized users than to potential attackers. A lockout time -of 25 minutes is recommended for regular user accounts. -

    • Do not assign an infinite lockout time on an account (by setting the --locktime argument to 0 [zero]) unless there is a highly -compelling reason. Such accounts almost inevitably become locked at -some point, because each Authentication Server never resets the account's -failure counter in its copy of the kaauxdb file (in contrast, when -the lockout time is not infinite, the counter resets after the specified -amount of time has passed since the last failed attempt to that Authentication -Server). Furthermore, the only way to unlock an account with an -infinite lockout time is for an administrator to issue the kas -unlock command. It is especially dangerous to set an infinite -lockout time on an administrative account; if all administrative accounts -become locked, the only way to unlock them is to shut down all instances of -the Authentication Server and remove the kaauxdb file on -each. -
    -

    Options -

    -

    -name -
    Names the Authentication Database account for which to change -settings. -

    -flags -
    Sets one or more of four toggling flags, adding them to any flags -currently set. Either specify one or more of the following strings, or -specify a hexidecimal number that combines the indicated values. To -return all four flags to their defaults, provide a value of 0 -(zero). To set more than one flag at once using the strings, connect -them with plus signs (example: NOTGS+ADMIN+CPW). To -remove all the current flag settings before setting new ones, precede the list -with an equal sign (example: =NOTGS+ADMIN+CPW). -
    -

    ADMIN -
    The user is allowed to issue privileged kas commands -(hexadecimal equivalent is 0x004, default is -NOADMIN). - -

    NOTGS -
    The Authentication Server's Ticket Granting Service (TGS) refuses to -issue tickets to the user (hexadecimal equivalent is 0x008, default -is TGS). - -

    NOSEAL -
    The Ticket Granting Service cannot use the contents of this entry's -key field as an encryption key (hexadecimal equivalent is 0x020, -default is SEAL). - -

    NOCPW -
    The user cannot change his or her own password or key (hexadecimal -equivalent is 0x040, default is CPW). - -
    -

    -expiration -
    Determines when the entry itself expires. When a user entry -expires, the user becomes unable to log in; when a server entry such as -afs expires, all server processes that use the associated key -become inaccessible. Provide one of the three acceptable values: -
    -

    never -
    The account never expires (the default). -

    mm/dd/yyyy -
    Sets the expiration date to 12:00 a.m. on the -indicated date (month/day/year). Examples: 01/23/1999, -10/07/2000. -

    "mm/dd/yyyy hh:MM" -
    Sets the expiration date to the indicated time (hours:minutes) on -the indicated date (month/day/year). Specify the time in 24-hour format -(for example, 20:30 is 8:30 p.m.) Date -format is the same as for a date alone. Surround the entire instance -with quotes because it contains a space. Examples: -"01/23/1999 22:30", "10/07/2000 -3:45". -
    -

    -

    Acceptable values for the year range from 1970 (1 January 1970 -is time 0 in the standard UNIX date representation) through 2037 -(2037 is the maximum because the UNIX representation cannot accommodate dates -later than a value in February 2038). -

    -lifetime -
    Specifies the maximum lifetime that the Authentication Server's -Ticket Granting Service (TGS) can assign to a ticket. If the account -belongs to a user, this value is the maximum lifetime of a token issued to the -user. If the account corresponds to a server such as afs, -this value is the maximum lifetime of a ticket that the TGS issues to clients -for presentation to the server during mutual authentication. -

    Specify an integer that represents a number of seconds (3600 -equals one hour), or include a colon in the number to indicate a number of -hours and minutes (10:00 equals 10 hours). If this -argument is omitted, the default setting is 100:00 hours (360000 -seconds). -

    -pwexpires -
    Sets the number of days after the user's password was last changed -that it remains valid. Provide an integer from the range 1 -through 254 to specify the number of days until expiration, or the -value 0 to indicate that the password never expires (the -default). -

    When the password expires, the user is unable to authenticate, but has 30 -days after the expiration date in which to use the kpasswd command -to change the password (after that, only an administrator can change it by -using the kas setpassword command). Note that the clock -starts at the time the password was last changed, not when the kas -setfields command is issued. To avoid retroactive expiration, -have the user change the password just before issuing a command that includes -this argument. -

    -reuse -
    Specifies whether or not the user can reuse any of his or her last 20 -passwords. The acceptable values are yes to allow reuse of -old passwords (the default) and no to prohibit reuse of a password -that is similar to one of the previous 20 passwords. -

    -attempts -
    Sets the number of consecutive times the user can provide an incorrect -password during authentication (using the klog command or a login -utility that grants AFS tokens). When the user exceeds the limit, the -Authentication Server rejects further attempts (locks the user out) for the -amount of time specified by the -locktime argument. Provide -an integer from the range 1 through 254 to specify the -number of failures allowed, or 0 to indicate that there is no limit -on authentication attempts (the default value). -

    -locktime -
    Specifies how long the Authentication Server refuses authentication -attempts from a user who has exceeded the failure limit set by the --attempts argument. -

    Specify a number of hours and minutes (hh:mm) or -minutes only (mm), from the range 01 (one minute) through -36:00 (36 hours). The kas command -interpreter automatically reduces any larger value to 36:00 -and also rounds up any non-zero value to the next higher multiple of -8.5 minutes. A value of 0 (zero) sets an infinite -lockout time; an administrator must issue the kas unlock -command to unlock the account. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    In the following example, an administrator using the admin -account grants administrative privilege to the user smith, and sets -the Authentication Database entry to expire at midnight on 31 December -2000. -

       % kas setfields -name smith -flags ADMIN -expiration 12/31/2000
    -   Password for admin:
    -   
    -
    -

    In the following example, an administrator using the admin -account sets the user pat's password to expire in 60 days from -when it last changed, and prohibits reuse of passwords. -

       % kas setfields -name pat -pwexpires 60 -reuse no
    -   Password for admin:
    -   
    -
    -

    Privilege Required -

    The issuer must have the ADMIN flag set on his or her -Authentication Database entry. -

    Related Information -

    kaserverauxdb -

    kas -

    kas examine -

    kas setpassword -

    kas unlock -

    klog -

    kpasswd -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf194.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf194.htm deleted file mode 100755 index f722edf70..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf194.htm +++ /dev/null @@ -1,158 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas setpassword

    - - - - - - - - -

    Purpose -

    Changes the key field in an Authentication Database entry -

    Synopsis -

    kas setpassword -name <name of user>  [-new_password <new password>] 
    -                [-kvno <key version number>] 
    -                [-admin_username <admin principal to use for authentication>] 
    -                [-password_for_admin <admin password>]  [-cell <cell name>] 
    -                [-servers <explicit list of authentication servers>+]
    -                [-noauth]  [-help]
    -   
    -kas setpasswd -na <name of user>  [-ne <new password>]  
    -              [-k <key version number>]
    -              [-a <admin principal to use for authentication>]  
    -              [-p <admin password>]  [-c <cell name>]  
    -              [-s <explicit list of authentication servers>+]  [-no]  [-h]
    -   
    -kas setp -na <name of user>  [-ne <new password>]  [-k <key version number>]
    -         [-a <admin principal to use for authentication>]  
    -         [-p <admin password>]  [-c <cell name>]  
    -         [-s <explicit list of authentication servers>+]  [-no]  [-h]
    -   
    -kas sp -na <name of user>  [-ne <new password>]  [-k <key version number>]
    -       [-a <admin principal to use for authentication >]  
    -       [-p <admin password>]  [-c <cell name>]  
    -       [-s <explicit list of authentication servers>+]  [-no]  [-h]
    -
    -

    Description -

    The kas setpassword command accepts a character string of -unlimited length, scrambles it into a form suitable for use as an encryption -key, places it in the key field of the Authentication Database entry named by -the -name argument, and assigns it the key version number specified -by the -kvno argument. -

    To avoid making the password string visible at the shell prompt, omit the --new_password argument. Prompts then appear at the shell -which do not echo the password visibly. -

    When changing the afs server key, also issue bos -addkey command to add the key (with the same key version number) to the -/usr/afs/etc/KeyFile file. See the AFS Administration -Guide for instructions. -

    The command interpreter checks the password string subject to the following -conditions: -

      -

    • If there is a program called kpwvalid in the same directory as -the kas binary, the command interpreter invokes it to process the -password. For details, see the kpwvalid reference -page. -

    • If the -reuse argument to the kas setfields command -has been used to prohibit reuse of previous passwords, the command interpreter -verifies that the password is not too similar too any of the user's -previous 20 passwords. It generates the following error message at the -shell: -
         Password was not changed because it seems like a reused password
      -   
      -
      -

      To prevent a user from subverting this restriction by changing the password -twenty times in quick succession (manually or by running a script), use the --minhours argument on the kaserver initialization -command. The following error message appears if a user attempts to -change a password before the minimum time has passed: -

         Password was not changed because you changed it too 
      -   recently; see your systems administrator
      -   
      -
      -
    -

    Options -

    -

    -name -
    Names the entry in which to record the new key. -

    -new_password -
    Specifies the character string the user types when authenticating to -AFS. Omit this argument and type the string at the resulting prompts so -that the password does not echo visibly. Note that some non-AFS -programs cannot handle passwords longer than eight characters. -

    -kvno -
    Specifies the key version number associated with the new key. -Provide an integer in the range from 0 through -255. If omitted, the default is 0 (zero), which is probably -not desirable for server keys. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    In the following example, an administrator using the admin -account changes the password for pat (presumably because -pat forgot the former password or got locked out of his account in -some other way). -

       % kas setpassword pat
    -   Password for admin:
    -   new_password:
    -   Verifying, please re-enter new_password:
    -   
    -
    -

    Privilege Required -

    Individual users can change their own passwords. To change another -user's password or the password (server encryption key) for server -entries such as afs, the issuer must have the ADMIN flag -set in his or her Authentication Database entry. -

    Related Information -

    bos addkey -

    kas -

    kaserver -

    kpwvalid -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf195.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf195.htm deleted file mode 100755 index c65fd2a4b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf195.htm +++ /dev/null @@ -1,123 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas statistics

    - - - - - - -

    Purpose -

    Displays statistics from an Authentication Server process -

    Synopsis -

    kas statistics [-admin_username <admin principal to use for authentication>]
    -               [-password_for_admin <admin password>]  [-cell <cell name>] 
    -               [-servers <explicit list of authentication servers>+]
    -               [-noauth]  [-help]
    -   
    -kas sta [-a <admin principal to use for authentication>]  
    -        [-p <admin password>]  [-c <cell name>]  
    -        [-s <explicit list of authentication servers>+]  [-n]  [-h]  
    -
    -

    Description -

    The kas statistics command displays statistics from the -Authentication Server running on one of the cell's database server -machines. Use the -servers argument to name a specific -machine, or the command interpreter chooses one at random from all the -database server machines with which it has established connections. -

    Cautions -

    The -servers argument is not available in interactive mode, -making it impossible to specify a certain machine. -

    Options -

    -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The information in the output includes: -

      -

    • The number of allocation and freeing operations the Authentication Server -has performed, and how many password change requests it has processed. -

    • An indication of its hash table use. -

    • The server machine's IP address in hexadecimal and the date when the -current instance of the Authentication Server started. -

    • The number of requests and aborted requests for various services: -authentication, ticket granting, password setting, entry listing, and so -on. -

    • The amount of CPU time that the Authentication Server has used to process -requests since it started. The amount is not accurate on all system -types, however. -

    • The number of entries in the Authentication Database that are marked with -the ADMIN flag. -
    -

    Examples -

    In the following example, an administrator using the admin -account gathers statistics from the Authentication Server running on the -machine fs1.abc.com. -

       % kas statistics -servers fs1.abc.com
    -   56 allocs, 46 frees, 0 password changes
    -   Hash table utilization = 0.100000%
    -   From host bfff21a7 started at Tue Mar 23 12:42:02 1999:
    -     of 88 requests for Authenticate, 18 were aborted.
    -     of 14 requests for GetTicket, 0 were aborted.
    -     of 4 requests for CreateUser, 1 were aborted.
    -     of 12 requests for SetFields, 4 were aborted.
    -     of 3 requests for DeleteUser, 0 were aborted.
    -     of 23 requests for GetEntry, 4 were aborted.
    -     of 18 requests for ListEntry, 0 were aborted.
    -     of 2 requests for GetStats, 1 were aborted.
    -     of 2 requests for GetRandomKey, 0 were aborted.
    -   Used 6.015 seconds of CPU time.
    -   3 admin accounts
    -   
    -
    -

    Privilege Required -

    The issuer must have the ADMIN flag set on his or her -Authentication Database entry. -

    Related Information -

    kas -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf196.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf196.htm deleted file mode 100755 index bb3fac80b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf196.htm +++ /dev/null @@ -1,89 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas stringtokey

    - - - - - - -

    Purpose -

    Converts a character string into an octal key -

    Synopsis -

    kas stringtokey -string <password string>  [-cell <cell name>]  [-help]
    -      
    -kas str -s <password string>  [-c <cell name>]  [-h]
    -
    -

    Description -

    The kas stringtokey command converts the character string -specified with the -string argument into an octal string suitable -for use as an encryption key. -

    The kas command interpreter generates the octal key by using an -encryption algorithm on the combination of the specified string and the name -of the local cell (as recorded in the local /usr/vice/etc/ThisCell -file). Use the -cell argument to convert a string into a key -appropriate for a cell other than the local one. -

    Cautions -

    This command writes the key to the standard output stream, on which it can -possibly be intercepted by third parties. It is not very secure to use -the key in an actual Authentication Database entry. -

    Options -

    -

    -string -
    Specifies the character string to convert into an octal key. -

    -cell -
    Specifies the complete Internet domain name of the cell to combine with -the password string while generating the key. If this argument is -omitted, the kas command interpreter determines the name of the -local cell by consulting: -
      -

    • First, the value of the environment variable AFSCELL. -

    • Second, the cellname in the /usr/vice/etc/ThisCell file on the -local machine. -
    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output is of the following form: -

       Converting password string in realm 'cell_name' yields key='key'.
    -   
    -
    -

    Examples -

    The following example shows the octal key equivalent of the string -new_pswd in the ABC Corporation cell. -

       % kas stringtokey new_pswd
    -   Converting new_pswd in realm 'ABC.COM' yields
    -       key='\346\307\364\320\263\233\342\354'.
    -   
    -
    -

    Privilege Required -

    None, and no password is required. -

    Related Information -

    ThisCell (client version) -

    kas -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf197.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf197.htm deleted file mode 100755 index b9b5e2cc6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf197.htm +++ /dev/null @@ -1,99 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kas unlock

    - - - -

    Purpose -

    Unlocks a locked user account -

    Synopsis -

    kas unlock -name <authentication ID>  
    -           [-admin_username <admin principal to use for authentication>] 
    -           [-password_for_admin <admin password>]  [-cell <cell name>] 
    -           [-servers <explicit list of authentication servers>+]
    -           [-noauth]  [-help]
    -         
    -kas u -na <authentication ID>  
    -      [-a <admin principal to use for authentication>] 
    -      [-p <admin password>]  [-c <cell name>] 
    -      [-s <explicit list of authentication servers>+]  [-no]  [-h]
    -
    -

    Description -

    The kas unlock command unlocks the Authentication Database entry -named by the -name argument. An entry becomes locked when -the user exceeds the limit on failed authentication attempts, generally by -providing the wrong password to either an AFS-modified login utility or the -klog command. Use the kas setfields command to -set the limit and the lockout time, and the kas examine command to -examine the settings. -

    To unlock all locked user accounts at once, shutdown the -kaserver process on every database server machine, and remove the -/usr/afs/local/kaauxdb file from each one. The -kaserver process recreates the file as it restarts. -

    Options -

    -

    -name -
    Names the Authentication Database entry to unlock. -

    -admin_username -
    Specifies the user identity under which to authenticate with the -Authentication Server for execution of the command. For more details, -see the introductory kas reference page. -

    -password_for_admin -
    Specifies the password of the command's issuer. If it is -omitted (as recommended), the kas command interpreter prompts for -it and does not echo it visibly. For more details, see the introductory -kas reference page. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory kas reference page. -

    -servers -
    Names each machine running an Authentication Server with which to -establish a connection. For more details, see the introductory -kas reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory kas reference -page. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    In the following example, an administrator using the admin -account unlocks the entry for jones: -

       % kas unlock -name jones -admin_username admin
    -   Administrator's (admin) Password:
    -   
    -
    -

    Privilege Required -

    The issuer must have the ADMIN flag set on his or her -Authentication Database entry. -

    Related Information -

    kas -

    kas examine -

    kas setfields -

    klog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf198.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf198.htm deleted file mode 100755 index 7d7c85422..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf198.htm +++ /dev/null @@ -1,150 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kaserver

    - - - -

    Purpose -

    Initializes the Authentication Server -

    Description -

    kaserver [-noAuth]  [-fastKeys]  [-database <dbpath>] 
    -         [-localfiles <lclpath>]  [-minhours <n>] 
    -         [-servers <serverlist>]  [-enable_peer_stats]  
    -         [-enable_process_stats]  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The kaserver command initializes the Authentication Server, -which runs on every database server machine. In the conventional -configuration, its binary file is located in the /usr/afs/bin -directory on a file server machine. -

    The kaserver command is not normally issued at the command shell -prompt but rather placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a database server machine as the local superuser -root. -

    As it initializes, the Authentication Server process creates the two files -that constitute the Authentication Database, kaserver.DB0 -and kaserver.DBSYS1, in the /usr/afs/db directory -if they do not already exist. Use the commands in the kas -suite to administer the database. -

    The Authentication Server is responsible for several aspects of AFS -security, including: -

      -

    • Maintenance of all AFS server encryption keys and user passwords in the -Authentication Database. -

    • Creation of the tickets and tokens that users and servers use to establish -secure connections. Its Ticket Granting Service (TGS) component -performs this function. -
    -

    The Authentication Server records a trace of its activity in the -/usr/afs/logs/AuthLog file. Use the bos getlog -command to display the contents of the file. Use the kdb -command to read the protected files associated with the AuthLog -file, AuthLog.dir and AuthLog.pag. -

    Options -

    -

    -noAuth -
    Assigns the unprivileged identity anonymous to the -issuer. Thus, it establishes an unauthenticated connection between the -issuer and the Authentication Server. It is useful only when -authorization checking is disabled on the database server machine. In -normal circumstances, the Authentication Server allows only authorized -(privileged) users to issue commands that affect or contact the Authentication -Database and will refuse to perform such an action even if the --noAuth flag is used. -

    -fastKeys -
    Is a test flag for use by the AFS Development staff; it serves no -functional purpose. -

    -database -
    Specifies the pathname of an alternate directory in which the -Authentication Database files reside. Provide the complete pathname, -ending in the base filename to which the .DB0 and -.DBSYS1 extensions are appended. For example, the -appropriate value for the default database files is -/usr/afs/db/kaserver. -

    Provide the -localfiles argument along with this one; -otherwise, the -localfiles argument is also set to the value of -this argument, which is probably inappropriate. -

    -localfiles -
    Specifies the pathname of an alternate directory in which the auxiliary -Authentication Database file resides. Provide the complete pathname, -ending in the base filename to which the auxdb suffix is -appended. For example, the appropriate value for the default auxiliary -database file is /usr/afs/local/kaserver. -

    -minhours -
    Specifies the minimum number of hours that must pass between password -changes made by any regular user. System administrators (with the -ADMIN flag in their Authentication Database entry) can change -passwords as often as desired. Setting a minimum time between password -changes is not recommended. -

    -servers -
    Names each database server machine running an Authentication Server with -which the local Authentication Server is to synchronize its copy of the -Authentication Database , rather than with the machines listed in the local -/usr/afs/etc/CellServDB file. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following bos create command creates a kaserver -process on fs3.abc.com (the command appears on two -lines here only for legibility): -

       % bos create -server fs3.abc.com -instance kaserver \
    -                -type simple -cmd /usr/afs/bin/kaserver
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    AuthLog -

    BosConfig -

    CellServDB (server version) -

    kaserver.DB0 and kaserver.DBSYS1 -

    kaserverauxdb -

    bos -

    bos create -

    bos getlog -

    kas -

    kdb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf199.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf199.htm deleted file mode 100755 index c05089bba..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf199.htm +++ /dev/null @@ -1,115 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kdb

    - - - -

    Purpose -

    Displays log or privileged actions performed by the Authentication Server -

    Synopsis -

    kdb [-dbmfile <dbmfile to use (default /usr/afs/logs/AuthLog)>]  
    -    [-key <extract entries that match specified key>]  [-help]
    -  
    -
    -

    Description -

    The kdb command displays the contents of the -AuthLog.dir and AuthLog.pag files -associated with the AuthLog file that resides on the local disk, by -default in the /usr/afs/logs directory. The files must exist -in that directory, which normally implies that the Authentication Server is -running on the machine. The files contain information on privileged -actions performed by the Authentication Server. -

    Cautions -

    It is possible that on some operating systems that AFS otherwise supports, -the Authentication Server cannot create the -/usr/afs/logs/AuthLog.dir and -/usr/afs/logs/AuthLog.pag files, making this command -inoperative. See the AFS Release Notes for details. -

    Options -

    -

    -dbmfile -
    Specifies the pathname of the file to display. Provide either a -complete pathname, a pathname relative to the /usr/afs/logs -directory, or a filename only, in which case the file must reside in the -/usr/afs/logs directory. Omit this argument to display -information from the AuthLog.dir and -AuthLog.pag files in the /usr/afs/logs -directory. -

    -key -
    Specifies each entry to be displayed from the indicated file. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of output indicates the location of the files from which the -subsequent information is derived: -

       Printing all entries found in file_location
    -
    -

    Each entry then includes the following two fields, separated by a -colon: -

    -

    user/server -
    Identifies the user requesting the corresponding service and the server -that performed that service. In cases where no user is directly -involved, only the server appears; in cases where no server is directly -involved, only the user appears. -

    service -
    Identifies one of the following actions or services performed by the user -or server process. -
      -

    • auth: Obtained a ticket-granting ticket -

    • chp: Changed a user password -

    • cruser: Created a user entry in the Authentication -Database -

    • delu: Deleted a user entry from the Authentication -Database -

    • gtck: Obtained a ticket other than a ticket-granting -ticket -

    • setf: Set fields in an Authentication Database entry -

    • unlok: Unlocked an Authentication Database entry -
    -
    -

    The final line of output sums the number of entries. -

    Examples -

    The following example shows the output of the kdb command in the -ABC Corporation cell (abc.com): -

       % kdb
    -   Printing all entries found in /usr/afs/logs/AuthLog
    -   admin,krbtgt.ABC.COM:auth
    -   admin,afs:gtck
    -   admin:cruser
    -   admin:delu
    -   4 entries were found
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    AuthLog.dir, AuthLog.pag -

    bos getlog -

    kaserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf200.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf200.htm deleted file mode 100755 index 798336441..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf200.htm +++ /dev/null @@ -1,307 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    klog

    - - - - - - - -

    Purpose -

    Authenticates with the Authentication Server -

    Synopsis -

    klog  [-x]  [-principal <user name>]  [-password <user's password>]  
    -      [-cell <cell name>]  [-servers <explicit list of servers>+]  
    -      [-pipe]  [-silent]  [-lifetime <ticket lifetime in hh[:mm[:ss]]>]  
    -      [-setpag]  [-tmp]  [-help]
    -    
    -klog  [-x]  [-pr <user name>]  [-pa <user's password>]  [-c <cell name>]  
    -      [-s <explicit list of servers>+]  [-pi]  [-si]  
    -      [-l <ticket lifetime in hh[:mm[:ss]]>]  [-se]  [-t]  [-h]
    -
    -

    Description -

    The klog command obtains an AFS token from the Authentication -Server. The Cache Manager on the local machine stores the token in a -credential structure in kernel memory and uses it when obtaining authenticated -access to the AFS filespace. This command does not affect the -issuer's identity (UNIX UID) in the local file system. -

    By default, the command interpreter obtains a token for the AFS user name -that matches the issuer's identity in the local file system. To -specify an alternate user, include the -principal argument. -The user named by the -principal argument does not have to appear -in the local password file (the /etc/passwd file or -equivalent). -

    By default, the command interpreter obtains a token for the local cell, as -defined by the AFSCELL environment variable set in the command shell or by the -/usr/vice/etc/ThisCell file on the local machine. To specify -an alternate cell, include the -cell argument. The command -interpreter contacts an Authentication Server chosen at random from the -cell's entry in the local /usr/afs/etc/CellServDB file, unless -the -servers argument is used to name one or more database server -machines. -

    A user can have tokens in multiple cells simultaneously, but only one token -per cell per connection to the client machine. If the user's -credential structure already contains a token for the requested cell, the -token resulting from this command replaces it. -

    Sites that employ standard Kerberos authentication instead of the AFS -Authentication Server must use the Kerberos version of this command, -klog.krb, on all client machines. It automatically -places the issuer's Kerberos tickets in the file named by the KRBTKFILE -environment variable, which the pagsh.krb command defines -automatically as /tmp/tktpX where X is the -number of the user's PAG. -

    The lifetime of the token resulting from this command is the smallest of -the following. -

      -

    • The lifetime specified by the issuer with the -lifetime -argument. If the issuer does not include this argument, the value -defaults to 720 hours (30 days). -

    • The maximum ticket lifetime recorded for the afs entry in the -Authentication Database. The default is 100 hours. -

    • The maximum ticket lifetime recorded in the specified user's -Authentication Database entry. The default is 25 hours for user entries -created by an Authentication Server running AFS 3.1 or later. -

    • The maximum ticket lifetime recorded in the -krbtgt.CELLNAME entry in the Authentication -Database; this entry corresponds to the ticket-granting ticket used -internally in generating the token. The default is 720 hours (30 -days). -
    -

    The output from the kas examine command displays an -Authentication Database entry's maximum ticket lifetime as Max -ticket lifetime. Administrators can display any entry, and users -can display their own entries. -

    If none of the defaults have been changed, the token lifetime is 25 hours -for user accounts created by an Authentication Server running AFS 3.1 -or higher. The maximum lifetime for any token is 720 hours (30 days), -and the minimum is 5 minutes. -

    Between the minimum and maximum values, the Authentication Server uses a -defined set of values, according to the following rules. Requested -lifetimes between 5 minutes and 10 hours 40 minutes are granted at 5 minute -intervals, rounding up. For example, if the issuer requests a lifetime -of 12 minutes, the token's actual lifetime is 15 minutes. -

    For token lifetimes greater than 10 hours 40 minutes, consult the following -table, which presents all the possible times in units of -hours:minutes:seconds. -The number in parentheses is an approximation of the corresponding time in -days and hours (as indicated by the d and h -letters). For example, 282:22:17 means 282 -hours, 22 minutes, and 17 seconds, which translates to approximately 11 days -and 18 hours (11d 18h). The Authentication Server rounds up -a requested lifetime to the next highest possible lifetime. -

       11:24:15 (0d 11h)    46:26:01 (1d 22h)  189:03:38 (7d 21h)            
    -   12:11:34 (0d 12h)    49:38:40 (2d 01h)  202:08:00 (8d 10h)            
    -   13:02:09 (0d 13h)    53:04:37 (2d 05h)  216:06:35 (9d 00h)          
    -   13:56:14 (0d 13h)    56:44:49 (2d 08h)  231:03:09 (9d 15h)         
    -   14:54:03 (0d 14h)    60:40:15 (2d 12h)  247:01:43 (10d 07h)         
    -   15:55:52 (0d 15h)    64:51:57 (2d 16h)  264:06:34 (11d 00h)           
    -   17:01:58 (0d 17h)    69:21:04 (2d 21h)  282:22:17 (11d 18h)          
    -   18:12:38 (0d 18h)    74:08:46 (3d 02h)  301:53:45 (12d 13h)           
    -   19:28:11 (0d 19h)    79:16:23 (3d 07h)  322:46:13 (13d 10h)          
    -   20:48:57 (0d 20h)    84:45:16 (3d 12h)  345:05:18 (14d 09h)           
    -   22:15:19 (0d 22h)    90:36:53 (3d 18h)  368:56:58 (15d 08h)          
    -   23:47:38 (0d 23h)    96:52:49 (4d 00h)  394:27:37 (16d 10h)         
    -   25:26:21 (1d 01h)   103:34:45 (4d 07h)  421:44:07 (17d 13h)           
    -   27:11:54 (1d 03h)   110:44:28 (4d 14h)  450:53:46 (18d 18h)           
    -   29:04:44 (1d 05h)   118:23:54 (4d 22h)  482:04:24 (20d 02h)          
    -   31:05:22 (1d 07h)   126:35:05 (5d 06h)  515:24:22 (21d 11h)          
    -   33:14:21 (1d 09h)   135:20:15 (5d 15h)  551:02:38 (22d 23h) 
    -   35:32:15 (1d 11h)   144:41:44 (6d 00h)  589:08:45 (24d 13h) 
    -   37:59:41 (1d 13h)   154:42:01 (6d 10h)  629:52:56 (26d 05h) 
    -   40:37:19 (1d 16h)   165:23:50 (6d 21h)  673:26:07 (28d 01h)
    -   43:25:50 (1d 19h)   176:50:01 (7d 08h)
    -   
    -
    -

    Cautions -

    By default, this command does not create a new process authentication group -(PAG); see the description of the pagsh command to learn about -PAGs. If a cell does not use an AFS-modified login utility, users must -include -setpag option to this command, or issue the -pagsh command before this one, to have their tokens stored in a -credential structure that is identified by PAG rather than by local -UID. -

    When a credential structure is identified by local UID, the potential -security exposure is that the local superuser root can use the UNIX -su command to assume any other identity and automatically inherit -the tokens associated with that UID. Identifying the credential -structure by PAG eliminates this exposure. -

    If the -password argument is used, the specified password cannot -begin with a hyphen, because it is interpreted as another option name. -Use of the -password argument is not recommended in any -case. -

    By default, it is possible to issue this command on a properly configured -NFS client machine that is accessing AFS via the NFS/AFS Translator, assuming -that the NFS client machine is a supported system type. However, if the -translator machine's administrator has enabled UID checking by including -the -uidcheck on argument to the fs exportafs command, -the command fails with an error message similar to the following: -

       
    -   Warning: Remote pioctl to translator_machine  has failed (err=8). . . 
    -   Unable to authenticate to AFS because a pioctl failed.
    -
    -

    Enabling UID checking means that the credential structure in which tokens -are stored on the translator machine must be identified by a UID that matches -the local UID of the process that is placing the tokens in the credential -structure. After the klog command interpreter obtains the -token on the NFS client, it passes it to the remote executor daemon on the -translator machine, which makes the system call that stores the token in a -credential structure on the translator machine. The remote executor -generally runs as the local superuser root, so in most cases its -local UID (normally zero) does not match the local UID of the user who issued -the klog command on the NFS client machine. -

    Issuing the klog command on an NFS client machine creates a -security exposure: the command interpreter passes the token across the -network to the remote executor daemon in clear text mode. -

    Options -

    -

    -x -
    Appears only for backwards compatibility. Its former function is -now the default behavior of this command. -

    -principal -
    Specifies the user name to authenticate. If this argument is -omitted, the Authentication Server attempts to authenticate the user logged -into the local file system. -

    -password -
    Specifies the issuer's password (or that of the alternate user -identified by the -principal argument). Omit this argument -to have the command interpreter prompt for the password, in which case it does -not echo visibly in the command shell. -

    -cell -
    Specifies the cell for which to obtain a token. The command is -directed to that cell's Authentication Servers. During a single -login session on a given machine, a user can be authenticated in multiple -cells simultaneously, but can have only one token at a time for each of them -(that is, can only authenticate under one identity per cell per session on a -machine). It is acceptable to abbreviate the cell name to the shortest -form that distinguishes it from the other cells listed in the -/usr/vice/etc/CellServDB file on the client machine on which the -command is issued. -

    If this argument is omitted, the command is executed in the local cell, as -defined -

      -

    • First, by the value of the environment variable AFSCELL -

    • Second, in the /usr/vice/etc/ThisCell file on the client -machine on which the command is issued -
    -

    -servers -
    Establishes a connection with the Authentication Server running on each -specified database server machine. The command interpreter then chooses -one of these at random to execute the command. It is best to provide -fully-qualified hostnames, but abbreviated forms are possibly acceptable -depending on the state of the cell's name server at the time the command -is issued. This option is useful for testing specific servers if -problems are encountered. -

    If this argument is omitted, the command interpreter establishes a -connection with each machine listed for the indicated cell in the local copy -of the /usr/vice/etc/CellServDB file, and then chooses one of them -at random for command execution. -

    -pipe -
    Suppresses all output to the standard output stream, including prompts and -error messages. The klog command interpreter expects to -receive the password from the standard input stream. Do not use this -argument; it is designed for use by application programs rather than -human users. -

    -silent -
    Suppresses some of the trace messages that the klog command -produces on the standard output stream by default. It still reports on -major problems encountered. -

    -lifetime -
    Requests a specific lifetime for the token. Provide a number of -hours and optionally minutes and seconds in the format -hh[:mm[:ss]]. -The value is used in calculating the token lifetime as described in the -Description section. -

    -setpag -
    Creates a process authentication group (PAG) prior to requesting -authentication. The token is associated with the newly created -PAG. -

    -tmp -
    Creates a Kerberos-style ticket file in the /tmp directory of -the local machine. The file is called -tkt.AFS_UID where AFS_UID is the AFS UID -of the issuer. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Cautions -

    Output -

    The following message indicates that the limit on consecutive -authentication failures has been exceeded. An administrator can use the -kas unlock command to unlock the account, or the issuer can wait -until the lockout time for the account has passed. (The time is set -with the -locktime argument to the kas setfields command -and displayed in the output from the kas examine command). -

       
    -   Unable to authenticate to AFS because ID is locked - see your system admin
    -   
    -
    -

    If the -tmp flag is included, the following message confirms -that a Kerberos-style ticket file was created: -

       
    -   Wrote ticket file to /tmp
    -   
    -
    -

    Examples -

    Most often, this command is issued without arguments. The -appropriate password is for the person currently logged into the local file -system. The ticket's lifetime is calculated as described in the -Description section (if no defaults have been changed, it is 25 -hours for a user whose Authentication Database entry was created in AFS -3.1 or later). -

       
    -   % klog
    -   Password: 
    -   
    -
    -

    The following example authenticates the user as admin in the ABC -Corporation's test cell: -

       
    -   % klog -principal admin -cell test.abc.com
    -   Password: 
    -   
    -
    -

    In the following, the issuer requests a ticket lifetime of 104 hours 30 -minutes (4 days 8 hours 30 minutes). Presuming that this lifetime is -allowed by the maximum ticket lifetimes and other factors described in the -Description section, the token's lifetime is -110:44:28, which is the next largest possible value. -

          % klog -lifetime 104:30
    -   Password: 
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs exportafs -

    kas examine -

    kas setfields -

    kas unlock -

    kaserver -

    pagsh -

    tokens -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf201.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf201.htm deleted file mode 100755 index 9695f92b0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf201.htm +++ /dev/null @@ -1,178 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    knfs

    - - - - -

    Purpose -

    Establishes basis for authenticated access to AFS from a non-supported NFS -client using the NFS/AFS Translator -

    Synopsis -

    knfs -host <host name>  [-id <user ID (decimal)>]
    -     [-sysname <host's '@sys' value>]  [-unlog]  [-tokens]  [-help]
    -    
    -knfs -ho <host name>  [-i <user ID (decimal)>]  
    -     [-s <host's '@sys' value>]  [-u]  [-t]  [-he]
    -
    -

    Description -

    The knfs command creates an AFS credential structure on the -local machine, identifying it by a process authentication group (PAG) number -associated with the NFS client machine named by the -hostname -argument and by default with a local UID on the NFS client machine that -matches the issuer's local UID on the local machine. It places in -the credential structure the AFS tokens that the issuer has previously -obtained (by logging onto the local machine if an AFS-modified login utility -is installed, by issuing the klog command, or both). To -associate the credential structure with an NFS UID that does not match the -issuer's local UID, use the -id argument. -

    Issue this command only on the NFS(R)/AFS translator machine that is -serving the NFS client machine, after obtaining AFS tokens on the translator -machine for every cell to which authenticated access is required. The -Cache Manager on the translator machine uses the tokens to obtain -authenticated AFS access for the designated user working on the NFS client -machine. This command is not effective if issued on an NFS client -machine. -

    To enable the user on the NFS client machine to issue AFS commands, use the --sysname argument to specify the NFS client machine's system -type, which can differ from the translator machine's. The NFS -client machine must be a system type for which AFS is supported. -

    The -unlog flag discards the tokens in the credential structure, -but does not destroy the credential structure itself. The Cache Manager -on the translator machine retains the credential structure until the next -reboot, and uses it each time the issuer accesses AFS through the translator -machine. The credential structure only has tokens in it if the user -reissues the knfs command on the translator machine each time the -user logs into the NFS client machine. -

    To display the tokens associated with the designated user on the NFS client -machine, include the -tokens flag. -

    Users working on NFS client machines of system types for which AFS binaries -are available (and for which the cell has purchased a license) can use the -klog command rather than the knfs command. -

    Cautions -

    If the translator machine's administrator has enabled UID checking by -issuing the fs exportafs command with the -uidcheck on -argument, it is not possible to use the -id argument to assign the -tokens to an NFS UID that differs from the issuer's local UID. In -this case, there is no point in including the -id argument, because -the only acceptable value (the issuer's local UID) is the value used when -the -id argument is omitted. Requiring matching UIDs is -effective only when users have the same local UID on the translator machine as -on NFS client machines. In that case, it guarantees that users assign -their tokens only to their own NFS sessions. -

    This command does not make it possible for users working on non-supported -system types to issue AFS commands. This is possible only on NFS -clients of a system type for which AFS is available. -

    Options -

    -

    -host -
    Names the NFS client machine on which the issuer is to work. -Providing a fully-qualified hostname is best, but abbreviated forms are -possibly acceptable depending on the state of the cell's name server at -the time the command is issued. -

    -id -
    Specifies the local UID on the NFS client to which to assign the -tokens. The NFS client identifies file requests by the NFS UID, so -creating the association enables the Cache Manager on the translator machine -to use the appropriate tokens when filling the requests. If this -argument is omitted, the command interpreter uses an NFS UID that matches the -issuer's local UID on the translator machine (as returned by the -getuid function). -

    -sysname -
    Specifies the value that the local (translator) machine's remote -executor daemon substitutes for the @sys variable in pathnames when -executing AFS commands issued on the NFS client machine (which must be a -supported system type). If the NFS user's PATH environment -variable uses the @sys variable in the pathnames for directories -that house AFS binaries (as recommended), then setting this argument enables -NFS users to issue AFS commands by leading the remote executor daemon to -access the AFS binaries appropriate to the NFS client machine even if its -system type differs from the translator machine's. -

    -unlog -
    Discards the tokens stored in the credential structure identified by the -PAG associated with the -host argument and, optionally, the --id argument. -

    -tokens -
    Displays the AFS tokens assigned to the designated user on the indicated -NFS client machine. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The following error message indicates that UID checking is enabled on the -translator machine and that the value provided for the -id argument -differs from the issuer's local UID. -

       
    -   knfs: Translator in 'passwd sync' mode; remote uid must be the same as local uid
    -
    -

    Examples -

    The following example illustrates a typical use of this command. The -issuer smith is working on the machine -nfscli1.abc.com and has user ID 1020 on -that machine. The translator machine -tx4.abc.com uses an AFS-modified login utility, so -smith obtains tokens for the ABC Corporation cell automatically -upon login via the telnet program. She then issues the -klog command to obtain tokens as admin in the ABC -Corporation's test cell, test.abc.com, and the -knfs command to associate both tokens with the credential structure -identified by machine name nfs-cli1 and user ID -1020. She breaks the connection to tx4 and works -on nfscli1. -

       % telnet tx4.abc.com
    -   . . .
    -   login: smith
    -   Password:
    -   AFS(R) login
    -   
    -   % klog admin -cell test.abc.com
    -   Password:
    -   
    -   % knfs nfscli1.abc.com 1020
    -   
    -   % exit
    -   
    -
    -

    The following example shows user smith again connecting to the -machine tx4 via the telnet program and discarding the -tokens. -

       % telnet translator4.abc.com
    -   . . .
    -   login: smith
    -   Password:
    -   AFS(R) login
    -   
    -   % knfs nfscli1.abc.com 1020 -unlog
    - 
    -   % exit
    -
    -

    Privilege Required -

    None -

    Related Information -

    klog -

    pagsh -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf202.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf202.htm deleted file mode 100755 index 72cc4dd85..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf202.htm +++ /dev/null @@ -1,164 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kpasswd

    - - - - - - - -

    Purpose -

    Changes the issuer's password in the Authentication Database -

    Synopsis -

    kpasswd [-x]  [-principal <user name>]  [-password <user's password>]
    -        [-newpassword <user's new password>]  [-cell <cell name>]
    -        [-servers <explicit list of servers>+]  [-pipe]  [-help]
    -   
    -kpasswd [-x]  [-pr <user name>]  [-pa <user's password>]  
    -        [-n <user's new password>]  [-c <cell name>]  
    -        [-s <explicit list of servers>+]  [-pi]  [-h] 
    -
    -

    Description -

    The kpasswd command changes the password recorded in an -Authentication Database entry. By default, the command interpreter -changes the password for the AFS user name that matches the issuer's -local identity (UNIX UID). To specify an alternate user, include the --principal argument. The user named by the --principal argument does not have to appear in the local password -file (the /etc/passwd file or equivalent). -

    By default, the command interpreter sends the password change request to -the Authentication Server running on one of the database server machines -listed for the local cell in the /usr/afs/etc/CellServDB file on -the local disk; it chooses the machine at random. It consults the -/usr/vice/etc/ThisCell file on the local disk to learn the local -cell name. To specify an alternate cell, include the -cell -argument. -

    Unlike the UNIX passwd command, the kpasswd command -does not restrict passwords to eight characters or less; it accepts -passwords of virtually any length. All AFS commands that require -passwords (including the klog, kpasswd, and AFS-modified -login utilities, and the commands in the kas suite) accept -passwords longer than eight characters, but some other applications and -operating system utilities do not. Selecting an AFS password of eight -characters or less enables the user to maintain matching AFS and UNIX -passwords. -

    The command interpreter makes the following checks: -

      -

    • If the program kpwvalid exists in the same directory as the -kpasswd command, the command interpreter pass the new password to -it for verification. For details, see the kpwvalid reference -page. -

    • If the -reuse argument to the kas setfields command -has been used to prohibit reuse of previous passwords, the command interpreter -verifies that the password is not too similar too any of the user's -previous 20 passwords. It generates the following error message at the -shell: -
         Password was not changed because it seems like a reused password
      -   
      -
      -

      To prevent a user from subverting this restriction by changing the password -twenty times in quick succession (manually or by running a script), use the --minhours argument on the kaserver initialization -command. The following error message appears if a user attempts to -change a password before the minimum time has passed: -

         Password was not changed because you changed it too 
      -   recently; see your systems administrator
      -
      -
    -

    Options -

    -

    -x -
    Appears only for backwards compatibility. -

    -principal -
    Names the Authentication Database entry for which to change the -password. If this argument is omitted, the database entry with the same -name as the issuer's local identity (UNIX UID) is changed. -

    -password -
    Specifies the current password. Omit this argument to have the -command interpreter prompt for the password, which does not echo -visibly: -
       Old password: current_password
    -   
    -
    -

    -newpassword -
    Specifies the new password, which the kpasswd command -interpreter converts into an encryption key (string of octal numbers) before -sending it to the Authentication Server for storage in the user's -Authentication Database entry. -

    Omit this argument to have the command interpreter prompt for the password, -which does not echo visibly: -

       New password (RETURN to abort): new_password 
    -   Retype new password: new_password
    -   
    -
    -

    -cell -
    Specifies the cell in which to change the password, by directing the -command to that cell's Authentication Servers. The issuer can -abbreviate the cell name to the shortest form that distinguishes it from the -other cells listed in the local /usr/vice/etc/CellServDB -file. -

    By default, the command is executed in the local cell, as defined -

      -

    • First, by the value of the environment variable AFSCELL -

    • Second, in the /usr/vice/etc/ThisCell file on the client -machine on which the command is issued -
    -

    -servers -
    Establishes a connection with the Authentication Server running on each -specified machine, rather than with all of the database server machines listed -for the relevant cell in the local copy of the -/usr/vice/etc/CellServDB file. The kpasswd -command interpreter then sends the password-changing request to one machine -chosen at random from the set. -

    -pipe -
    Suppresses all output to the standard output stream or standard error -stream. The kpasswd command interpreter expects to receive -all necessary arguments, each on a separate line, from the standard input -stream. Do not use this argument, which is provided for use by -application programs rather than human users. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example shows user pat changing her password in -the ABC Corporation cell. -

       % kpasswd
    -   Changing password for 'pat' in cell 'abc.com'.
    -   Old password:
    -   New password (RETURN to abort):
    -   Verifying, please re-enter new_password:
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    kas setfields -

    kas setpassword -

    klog -

    kpwvalid -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf203.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf203.htm deleted file mode 100755 index 169ecb5d0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf203.htm +++ /dev/null @@ -1,88 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    kpwvalid

    - - - -

    Purpose -

    Checks quality of new password -

    Description -

    The kpwvalid command checks the quality of a new password passed -to it from the kpasswd or kas setpassword -command. It is optional. If it exists, it must reside in the -same AFS directory as the binaries for the kpasswd and -kas command suites (create a symbolic link from the client -machine's local disk to this directory). The directory's ACL -must extend the a (administer) and w -(write) permissions to the system:administrators -group only. These requirements prevent unauthorized users from -substituting a spurious kpwvalid binary. -

    The AFS distribution includes an example kpwvalid program that -checks that the password is at least eight characters long; the code for -it appears in the following Examples section. -

    The script or program must accept a sequence of password strings, one per -line, on the standard input stream. The first is the current password -and is ignored. Each subsequent string is a candidate password to be -checked. The program must write the following to the standard output -stream for each one: -

      -

    • 0 (zero) and a newline character to indicate that the password -is acceptable -

    • A non-zero decimal number and a newline character to indicate that the -password is not acceptable -
    -

    Further, it must write any error messages only to the standard error -stream, not to the standard output stream. -

    Examples -

    The following example program, included in the AFS distribution, verifies -that the requested password includes eight or more characters. -

       #include <stdio.h>
    -   /* prints 0 if the password is long enough, otherwise non-zero */
    -   main()
    -   {
    -   char oldpassword[512];
    -   char password[512];
    -   
    -   if (fgets(oldpassword, 512, stdin))
    -      while (fgets(password, 512, stdin)) {
    -         if (strlen(password) > 8) { /* password includes a newline */
    -            fputs("0\n",stdout);
    -            fflush(stdout);
    -         }
    -         else {
    -            fputs("Passwords must contain at least 8 characters.\n",
    -                  stderr);
    -            fputs("1\n",stdout);
    -            fflush(stdout);
    -         }
    -   return 0;
    -   }
    -   
    -
    -

    Related Information -

    kas setpassword -

    kpasswd -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf204.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf204.htm deleted file mode 100755 index 3738f861e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf204.htm +++ /dev/null @@ -1,155 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    package

    - - - - - - - -

    Purpose -

    Configures files and directories on the local disk -

    Synopsis -

    package [initcmd]  [-config <base name of configuration file>]
    -   [-fullconfig <full name of configuration file, or stdin for standard input>]
    -   [-overwrite]  [-noaction]  [-verbose]  [-silent]  [-rebootfiles]  
    -   [-debug]  [-help]
    -    
    -package [i]  [-c <base name of configuration file>]
    -        [-f <full name of configuration file, or stdin for standard input>]
    -        [-o]  [-n]  [-v]  [-s]  [-r]  [-d]  [-h]
    -
    -

    Description -

    The package command configures the machine's local disk to -comply with the instructions in the configuration file named by the --config or -fullconfig argument. -

    By default, the package command alters any existing local disk -element whose contents or configuration does not match the element defined in -the configuration file. For example, if a configuration file -D instruction defines a directory that has the same name as a -symbolic link on the local disk, the package command replaces the -symbolic link with the directory. The F and L -instructions include an optional update_code field that alters this -behavior. -

    Also by default, the package command takes no action on elements -on the local disk that are not mentioned in the configuration file. Use -the D instruction's R update code to remove files -from the disk directory that are not mentioned in the configuration -file. -

    Before running the package command, the administrator must -create the template file and other files on the local disk. For -instructions, see the AFS Administration Guide. -

    It is not possible to configure a remote client machine's disk using -this command. -

    Cautions -

    The package command interpreter exits without executing any -instruction if there are any syntax errors or incorrect values in the -configuration file. -

    Options -

    -

    initcmd -
    Accommodates the command's use of the AFS command parser, and is -optional. -

    -config -
    Specifies the pathname of the configuration file to use, ending in the -file's base name, which omits the suffix that indicates the machine -type. The package command determines the machine's -system type name and automatically appends it to the base name. An -example of the proper value for this argument is staff rather than -staff.rs_aix42. Partial pathnames are interpreted -relative to the current working directory. -

    Provide this argument or the -fullconfig argument. -

    -fullconfig -
    Specifies the configuration file to use. Two types of values are -acceptable: -
      -

    • The full pathname of the configuration file to use, complete with an -extension indicating the machine type (examples: -staff.rs_aix42, admin.sun4x_56). -

    • The string stdin to indicate that the issuer is providing -configuration information via the standard input stream, either by piping in -the contents of a file, or by typing configuration lines at the shell. -In the latter case, type <Ctrl-d> to conclude the input. -
    -

    Provide this argument or the -config argument. -

    -overwrite -
    Overwrites elements on the local disk with the source version indicated in -the configuration file, even if the owner write (w) mode -bit is turned on the disk element. Files protected by the I -update code on an F line in the configuration file are not -overwritten. -

    -noaction -
    Checks the sequence of operations to be performed when the command -actually runs and reports any problems that the package command -interpreter expects to encounter. No elements on the local disk or in -AFS are changed. If the -verbose flag is also provided, the -trace includes all actions to be performed as well as anticipated -errors. -

    -silent -
    Suppresses some of the trace messages sent to the standard output stream -by default. The output still reports major problems. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -rebootfiles -
    Prevents overwriting of any file marked with the Q update code -on an F line in the configuration file. This effectively -prevents the machine from rebooting automatically again when the -package command is invoked in the machine's AFS initialization -file. -

    -debug -
    Enables debugging output, which is directed to the standard output stream -by default. By default, no debugging output is produced. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    This command is usually invoked in a client machine's AFS -initialization file (/etc/rc or equivalent), rather than issued at -the command shell prompt. -

    The following command invokes the version of the staff -configuration file appropriate for this machine's system type, and -produces verbose output. -

       # /etc/package -c staff -v
    -   
    -
    -

    The following example uses the configuration file whose basename is defined -in the /.package file on the local machine. This -method enables the administrator to use the same package command in -every machine's AFS initialization file but still customize configuration -by putting the appropriate basename in the /.package -file. -

       # /etc/package -c `cat /.package` -v
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    package Configuration File -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf205.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf205.htm deleted file mode 100755 index dc4143e63..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf205.htm +++ /dev/null @@ -1,72 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    package apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    package apropos [-topic <help string>]  [-help]
    -   
    -package a [-t <help string>]  [-h]
    -
    -

    Description -

    The package apropos command displays the first line of the -online help entry for any package command that has in its name or -short description the string specified by the -topic -argument. -

    To display the syntax for a command, use the package help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -package command where the string specified with the --topic argument is part of the command name or first line. -

    Examples -

    The following command lists all package commands that include -the word help in their names or short descriptions: -

       % package apropos help
    -   apropos: search by help text
    -   help: get help on commands
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    package -

    package help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf206.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf206.htm deleted file mode 100755 index 68816524c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf206.htm +++ /dev/null @@ -1,88 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    package help

    - - - -

    Purpose -

    Displays the syntax of specified package commands or lists -functional descriptions of all package commands -

    Synopsis -

    package help [-topic <help string>+]  [-help]
    -   
    -package h [-t <help string>+]  [-h]
    -
    -

    Description -

    The package help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every package -command. -

    To list every package command whose name or short description -includes a specified keyword, use the package apropos -command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the package part of the command name, providing -only the operation code (for example, specify initcmd, not -package initcmd). If this argument is omitted, the output -briefly describes every package command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each package command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the package -initcmd command: -

       % package help initcmd
    -   package initcmd: initialize the program
    -   Usage: package [initcmd] [-config <base name of configuration file>]  
    -   [-fullconfig <full name of configuration file, or stdin for standard input>] 
    -   [-overwrite] [-noaction] [-verbose] [-silent] [-rebootfiles] 
    -   [-debug] [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    package -

    package apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf207.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf207.htm deleted file mode 100755 index c6af2e00a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf207.htm +++ /dev/null @@ -1,58 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    package_test

    - - - -

    Purpose -

    Tests the validity of a package configuration file -

    Synopsis -

    package_test <config file>
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name in full. -

    Description -

    The package_test command tests the validity of a -package configuration file created when a prototype file is -compiled. The command interpreter prints error messages on the standard -output stream. -

    Options -

    -

    config file -
    Specifies the package configuration file to validate. -
    -

    Examples -

    The following example tests the validity of the package -configuration file staff.sun4x_56. -

       % package_test staff.sun4x_56
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    package Configuration File -

    package -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf208.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf208.htm deleted file mode 100755 index 91fa6fb8c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf208.htm +++ /dev/null @@ -1,121 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pagsh

    - - - - -

    Purpose -

    Creates a new PAG -

    Synopsis -

    pagsh
    -
    -

    Description -

    The pagsh command creates a new command shell (owned by the -issuer of the command) and associates a new process authentication -group (PAG) with the shell and the user. A PAG is a number -guaranteed to identify the issuer of commands in the new shell uniquely to the -local Cache Manager. The PAG is used, instead of the issuer's UNIX -UID, to identify the issuer in the credential structure that the Cache Manager -creates to track each user. -

    Any tokens acquired subsequently (presumably for other cells) become -associated with the PAG, rather than with the user's UNIX UID. -This method for distinguishing users has two advantages. -

      -

    • It means that processes spawned by the user inherit the PAG and so share -the token; thus they gain access to AFS as the authenticated user. -In many environments, for example, printer and other daemons run under -identities (such as the local superuser root) that the AFS server -processes recognize only as anonymous. Unless PAGs are used, -such daemons cannot access files in directories whose access control lists -(ACLs) do not extend permissions to the system:anyuser -group. -

    • It closes a potential security loophole: UNIX allows anyone already -logged in as the local superuser root on a machine to assume any -other identity by issuing the UNIX su command. If the -credential structure is identified by a UNIX UID rather than a PAG, then the -local superuser root can assume a UNIX UID and use any tokens -associated with that UID. Use of a PAG as an identifier eliminates that -possibility. -
    -
    Note:The pagsh.krb version of this command is intended for use -by sites that employ standard Kerberos authentication for their -clients. The pagsh.krb command provides all the -functionality of the pagsh command. In addition, it defines -the environment variable KRBTKFILE (which specifies the storage location of -Kerberos tickets) to be the /tmp/tktpX file (where -X is the number of the user's PAG). The functionality of -this command supports the placement of Kerberos tickets by the -klog.krb command and Kerberized AFS-modified login utilities -in the file specified by the environment variable KRBTKFILE. -
    -

    Cautions -

    Each PAG created uses two of the memory slots that the kernel uses to -record the UNIX groups associated with a user. If none of these slots -are available, the pagsh command fails. This is not a -problem with most operating systems, which make at least 16 slots available -per user. -

    In cells that do not use an AFS-modified login utility, use this command to -obtain a PAG before issuing the klog command (or include the --setpag argument to the klog command). If a PAG -is not acquired, the Cache Manager stores the token in a credential structure -identified by local UID rather than PAG. This creates the potential -security exposure described in the Description section. -

    If users of NFS client machines for which AFS is supported are to issue -this command as part of authenticating with AFS, do not use the fs -exportafs command's -uidcheck on argument to enable UID -checking on NFS/AFS Translator machines. Enabling UID checking prevents -this command from succeeding. See the reference page for the -klog command. -

    If UID checking is not enabled on Translator machines, then by default it -is possible to issue this command on a properly configured NFS client machine -that is accessing AFS via the NFS/AFS Translator, assuming that the NFS client -machine is a supported system type. The pagsh binary -accessed by the NFS client must be owned by, and grant setuid privilege to, -the local superuser root. The complete set of mode bits must -be -rwsr-xr-x. This is not a requirement when the command is -issued on AFS client machines. -

    However, if the translator machine's administrator has enabled UID -checking by including the -uidcheck on argument to the fs -exportafs command, the command fails with an error message similar to -the following: -

       
    -   Warning: Remote setpag to translator_machine  has failed (err=8). . . 
    -   setpag: Exec format error
    -
    -

    Examples -

    In the following example, the issuer invokes the C shell instead of the -default Bourne shell: -

       # pagsh -c /bin/csh
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs exportafs -

    klog -

    tokens -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf209.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf209.htm deleted file mode 100755 index f3e8da1a6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf209.htm +++ /dev/null @@ -1,89 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    prdb_check

    - - - -

    Purpose -

    Checks the integrity of the Protection Database -

    Synopsis -

    prdb_check -database <ptdb_file>  [-uheader]  [-pheader]  [-entries]  
    -           [-verbose]  [-help]
    -   
    -prdb_check -d <ptdb_file>  [-u]  [-p]  [-e]  [-v]  [-h]
    -
    -

    Description -

    The prdb_check command checks the integrity of the Protection -Database, reporting any errors or corruption it finds. If there are -problems, do not issue any pts commands until the database is -repaired. -

    Cautions -

    The results can be unpredictable if the Protection Server makes changes to -the Protection Database while this command is running. Use the bos -shutdown command to shutdown the local ptserver process -before running this command, or before creating a second copy of the -prdb.DB0 file (with a different name) on which to run the -command. -

    Options -

    -

    -database -
    Names the Protection Database (copy of the prdb.DB0 -file) to check. If the current working directory is not the location of -the file, provide a pathname, either full or relative to the current working -directory. -

    -uheader -
    Displays information which Ubik maintains in the database's -header. -

    -pheader -
    Displays information which the Protection Server maintains in the -database's header. -

    -entries -
    Outputs every entry in the database. Some of the information is -similar to that returned by the pts examine command. -

    -verbose -
    Reports additional information about the database, including the number of -entries in the database and a trace of the internal database structures the -command is verifying. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If there are errors in the database, the output always reports them on the -standard error stream. If any options other than -database -or -help are provided, the output written to the standard output -stream includes additional information as described for each option in the -preceding Options section of this reference page. The output -is intended for debugging purposes and is meaningful to someone familiar with -the internal structure of the Protection Database. -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    prdb.DB0 and prdb.DBSYS1 -

    bos shutdown -

    pts examine -

    ptserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf210.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf210.htm deleted file mode 100755 index 07ac72f96..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf210.htm +++ /dev/null @@ -1,149 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts

    - - - - - - - - - - - -

    Purpose -

    Introduction to the pts command suite -

    Description -

    The commands in the pts command suite are the administrative -interface to the Protection Server, which runs on each database server machine -in a cell and maintains the Protection Database. The database stores -the information that AFS uses to augment and refine the standard UNIX scheme -for controlling access to files and directories. -

    Instead of relying only on the mode bits that define access rights for -individual files, AFS associates an access control list (ACL) with each -directory. The ACL lists users and groups and specifies which of seven -possible access permissions they have for the directory and the files it -contains. (It is still possible to set a directory or file's mode -bits, but AFS interprets them in its own way; see the chapter on -protection in the AFS Administration Guide for details.) -

    AFS enables users to define groups in the Protection Database and place -them on ACLs to extend a set of rights to multiple users -simultaneously. Groups simplify administration by making it possible to -add someone to many ACLs by adding them to a group that already exists on -those ACLs. Machines can also be members of a group, so that users -logged into the machine automatically inherit the permissions granted to the -group. -

    There are several categories of commands in the pts command -suite: -

      -

    • Commands to create and remove Protection Database entries: pts -creategroup, pts createuser, and pts delete -

    • Commands to administer and display group membership: pts -adduser, -

      pts listowned, pts membership, and pts -removeuser -

    • Commands to administer and display properties of user and group entries -other than membership: pts chown, pts examine, -pts listentries, pts rename, and pts -setfields -

    • Commands to set and examine the counters used when assigning IDs to users -and groups: pts listmax and pts setmax -

    • Commands to obtain help: pts apropos and pts -help -
    -

    Options -

    The following arguments and flags are available on many commands in the -pts suite. The reference page for each command also lists -them, but they are described here in greater detail. -

    - -

    -cell <cell name> -
    Names the cell in which to run the command. It is acceptable to -abbreviate the cell name to the shortest form that distinguishes it from the -other entries in the /usr/vice/etc/CellServDB file on the local -machine. If the -cell argument is omitted, the command -interpreter determines the name of the local cell by reading the following in -order: -
      -

    1. The value of the AFSCELL environment variable -

    2. The local /usr/vice/etc/ThisCell file -
    -

    -force -
    - -Enables the command to continue executing as far as possible when errors or -other problems occur, rather than halting execution immediately. -Without it, the command halts as soon as the first error is -encountered. In either case, the pts command interpreter -reports errors at the command shell. This flag is especially useful if -the issuer provides many values for a command line argument; if one of -them is invalid, the command interpreter continues on to process the remaining -arguments. - -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -

    -noauth -
    - -Establishes an unauthenticated connection to the Protection Server, in which -the server treats the issuer as the unprivileged user -anonymous. It is useful only when authorization checking is -disabled on the server machine (during the installation of a file server -machine or when the bos setauth command has been used during other -unusual circumstances). In normal circumstances, the Protection Server -allows only privileged users to issue commands that change the Protection -Database, and refuses to perform such an action even if the -noauth -flag is provided. -
    -

    Privilege Required -

    Members of the system:administrators group can issue all -pts commands on any entry in the Protection Database. -

    Users who do not belong to the system:administrators group -can list information about their own entry and any group entries they -own. The privacy flags set with the pts setfields command -control access to entries owned by other users. -

    Related Information -

    pts adduser -

    pts apropos -

    pts chown -

    pts creategroup -

    pts createuser -

    pts delete -

    pts examine -

    pts help -

    pts listentries -

    pts listmax -

    pts listowned -

    pts membership -

    pts removeuser -

    pts rename -

    pts setfields -

    pts setmax -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf211.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf211.htm deleted file mode 100755 index dcdfab9ff..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf211.htm +++ /dev/null @@ -1,121 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts adduser

    - - - - - - - - - -

    Purpose -

    Adds a user or machine to a Protection Database group -

    Synopsis -

    pts adduser -user <user name>+  -group <group name>+ 
    -            [-cell <cell name>]  [-noauth]  [-force]  [-help]
    -   
    -pts ad -u <user name>+  -g <group name>+  [-c <cell name>]  [-n]  [-f]  [-h]
    -
    -

    Description -

    The pts adduser command adds each user or machine entry named by -the -user argument as a member of each group named by the --group argument. -

    To remove members of a group, use the pts removeuser -command. To list the groups to which a user or machine belongs, or the -members of a specified group, use the pts membership -command. -

    Cautions -

    After being added as a group member, a currently authenticated user must -reauthenticate (for example, by issuing the klog command) to obtain -permissions granted to the group on an access control list (ACL). -

    Options -

    -

    -user -
    Specifies the name of each user or machine entry to add to each group -named by the -group argument. The name of a machine entry -resembles an IP address and can use the wildcard notation described on the -pts createuser reference page. The user or machine entry -must already exist in the Protection Database. -

    -group -
    Specifies the complete name (including the owner prefix if applicable) of -each group to which to add members. The group entry must already exist -in the Protection Database. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example adds user smith to the group -system:administrators. -

       % pts adduser -user smith -group system:administrators
    -   
    -
    -

    The following example adds users jones, terry, and -pat to the smith:colleagues group. -

       % pts adduser -user jones terry pat -group smith:colleagues
    -   
    -
    -

    The following example adds the machine entries in the ABC Corporation -subnet to the group bin-prot. Because of the IP address -range of the ABC Corporation subnet, the system administrator was able to -group the machines into three machine entries (using the wildcard notation -discussed on the pts createuser reference page). -

       % pts adduser -user 138.255.0.0 192.12.105.0 192.12.106.0 -group bin-prot
    -   
    -
    -

    Privilege Required -

    The required privilege depends on the setting of the fourth privacy flag in -the Protection Database entry for each group named by the -group -argument (use the pts examine command to display the flags): -

      -

    • If it is the hyphen, only the group's owner and members of the -system:administrators group can add members. -

    • If it is lowercase a, current members of the group can add new -members. -

    • If it is uppercase A, anyone who can access the cell's -database server machines can add new members. -
    -

    Related Information -

    pts -

    pts createuser -

    pts examine -

    pts membership -

    pts removeuser -

    pts setfields -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf212.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf212.htm deleted file mode 100755 index 89e97e371..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf212.htm +++ /dev/null @@ -1,71 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    pts apropos -topic <help string>  [-help] 
    -   
    -pts ap -t <help string>  [-h]
    -
    -

    Description -

    The pts apropos command displays the first line of the online -help entry for any pts command that has in its name or short -description the string specified by the -topic argument. -

    To display the syntax for a command, use the pts help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -pts command in which the string specified by the -topic -argument is part of the command name or first line. -

    Examples -

    The following command lists all pts commands that include the -word create in their names or short descriptions: -

       % pts apropos create
    -   creategroup: create a new group
    -   createuser: create a new user
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    pts -

    pts help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf213.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf213.htm deleted file mode 100755 index e6b65d0b9..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf213.htm +++ /dev/null @@ -1,103 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts chown

    - - - - - -

    Purpose -

    Changes the owner of a Protection Database entry -

    Synopsis -

    pts chown -name <group name>  -owner <new owner> 
    -          [-cell <cell name>]  [-noauth]  [-force]  [-help]
    -   
    -pts cho -na <group name>  -o <new owner>  [-c <cell name>]  [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts chown command designates the user or group named by the --owner argument as the owner of the group named by the --name argument, and records the new owner in the owner field of the -group's Protection Database entry. -

    In the case of regular groups, this command automatically changes the group -name's owner prefix (the part of the group name before the colon) to -match the new owner. If the new owner is itself a group, then only its -owner prefix, not its complete name, becomes the owner prefix in the new -name. The change to the owner prefix does not propagate to any groups -owned by the group, however. To make the owner prefix of such -group-owned groups reflect the new owning group, use the pts rename -command. -

    It is not possible to change a user or machine entry's owner from the -default set at creation time, the system:administrators -group. -

    Cautions -

    While designating a machine as a group's owner does not cause an -error, it is not recommended. The Protection Server does not extend the -usual privileges of group ownership to users logged onto the machine. -

    Options -

    -

    -name -
    Specifies the current name of the group to which to assign a new -owner. -

    -owner -
    Names the user or group to become the group's owner. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example changes the owner of the group -terry:friends from the user terry to the user -pat. A side effect is that the group name changes to -pat:friends. -

       % pts chown -name terry:friends -owner pat
    -   
    -
    -

    The following example changes the owner of the group -terry:friends from the user terry to the group -pat:buddies. A side effect is that the group name -changes to pat:friends. -

       % pts chown -name terry:friends -owner pat:buddies
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators group -or currently own the group. -

    Related Information -

    pts -

    pts rename -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf214.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf214.htm deleted file mode 100755 index d60b9df05..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf214.htm +++ /dev/null @@ -1,204 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts creategroup

    - - - - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Creates an (empty) Protection Database group entry -

    Synopsis -

    pts creategroup -name <group name>+  [-owner <owner of the group>] 
    -                [-id <id (negated) for the group>+]  [-cell <cell name>]  
    -                [-noauth]  [-force]  [-help]
    -   
    -pts createg -na <group name>+  [-o <owner of the group>] 
    -            [-i <id (negated) for the group>+]  [-c <cell name>]  
    -            [-no]  [-f]  [-h]
    -      
    -pts cg -na <group name>+  [-o <owner of the group>]  
    -       [-i <id (negated) for the group>+]  
    -       [-c <cell name>]  [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts creategroup command creates an entry in the Protection -Database for each group specified by the -name argument. The -entry records the issuer of the command as the group's creator, and as -the group's owner unless the -owner argument names an -alternate user or group as the owner. -

    There are two types of groups: -

      -

    • regular, the names of which have two parts separated by a -colon. The part before the colon names the group's owner. -Any user can create such groups. -

    • prefix-less, which do not have an owner prefix. Only -members of the system:administrators group can create -prefix-less groups. -
    -

    Creating a group lowers the issuer's group-creation quota by -one. This is true even if the -owner argument is used to -assign ownership to an alternate user or group. To display a -user's group-creation quota, use the pts examine command; -to set it, use the pts setfields command. -

    AFS group ID (AFS GID) numbers are negative integers and by default the -Protection Server assigns a GID that is one less (more negative) than the -current value of the max group id counter in the Protection -Database, decrementing the counter by one for each group. Members of -the system:administrators group can use the -id -argument to assign specific AFS GID numbers. If any of the specified -GIDs is lower (more negative) than the current value of the max group -id counter, the counter is reset to that value. It is acceptable -to specify a GID greater (less negative) than the current value of the -counter, but the creation operation fails if an existing group already has -it. To display or set the value of the max group id counter, -use the pts listmax or pts setmax command, -respectively. -

    Output -

    The command generates the following string to confirm creation of each -group: -

       group name has id AFS GID
    -   
    -
    -

    Cautions -

    Although using the -owner argument to designate a machine entry -as a group's owner does not generate an error, it is not -recommended. The Protection Server does not extend the usual privileges -of group ownership to users logged onto the machine. -

    Options -

    -

    -name -
    Specifies the name of each group to create. Provide a string of up -to 63 characters, which can include lowercase (but not uppercase) letters, -numbers, and punctuation marks. A regular name includes a single colon -(:) to separate the two parts of the name; the colon -cannot appear in a prefix-less group name. -

    A regular group's name must have the following format: -

       owner_name:group_name
    -   
    -
    -

    and the owner_name field must reflect the actual owner of the -group, as follows: -

      -

    • If the optional -owner argument is not included, the field must -match the AFS username under which the issuer is currently -authenticated. -

    • If the -owner argument names an alternate AFS user, the field -must match that AFS username. -

    • If the -owner argument names another regular group, the field -must match the owning group's owner field (the part of its name before -the colon). If the -owner argument names a prefix-less -group, the field must match the owning group's complete name. -
    -

    -owner -
    Specifies a user or group as the owner for each group, rather than the -issuer of the command. Provide either an AFS username or the name of a -regular or prefix-less group. An owning group must already have at -least one member. This requirement prevents assignment of -self-ownership to a group during its creation; use the pts -chown command after issuing this command, if desired. -

    -id -
    Specifies a negative integer AFS GID number for each group, rather than -allowing the Protection Server to assign it. Precede the integer with a -hyphen (-) to indicate that it is negative. -

    If this argument is used and the -name argument names multiple -new groups, it is best to provide an equivalent number of AFS GIDs. The -first GID is assigned to the first group, the second to the second group, and -so on. If there are fewer GIDs than groups, the Protection Server -assigns GIDs to the unmatched groups based on the max group id -counter. If there are more GIDs than groups, the excess GIDs are -ignored. If any of the GIDs is lower (more negative) than the current -value of the max group id counter, the counter is reset to that -value. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    In the following example, the user pat creates groups called -pat:friends and pat:colleagues. -

       % pts creategroup -name pat:friends pat:colleagues
    -   
    -
    -

    The following example shows a member of the -system:administrators group creating the prefix-less group -staff and assigning its ownership to the -system:administrators group rather than to herself. -

       % pts creategroup -name staff -owner system:administrators
    -   
    -
    -

    In the following example, the user pat creates a group called -smith:team-members, which is allowed because the --owner argument specifies the required value -(smith). -

       % pts creategroup -name smith:team-members -owner smith
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators group -to create prefix-less groups or include the -id argument. -

    To create a regular group, the issuer must -

      -

    • Be authenticated. The command fails if the -noauth flag -is provided. -

    • Have a group-creation quota greater than zero. The pts -examine command displays this quota. -
    -

    Related Information -

    pts -

    pts examine -

    pts listmax -

    pts setfields -

    pts setmax -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf215.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf215.htm deleted file mode 100755 index 80c486720..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf215.htm +++ /dev/null @@ -1,183 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts createuser

    - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Creates a user or machine entry in the Protection Database -

    Synopsis -

    pts createuser -name <user name>+  [-id <user id>+]  [-cell <cell name>]  
    -               [-noauth]  [-force]  [-help]
    -   
    -pts createu -na <user name>+  [-i <user id>+]  [-c <cell name>]  
    -            [-no] [-f]  [-h]
    -   
    -pts cu -na <user name>+  [-i <user id>+]  [-c <cell name>]  [-no] [-f]  [-h]
    -
    -

    Description -

    The pts createuser command creates an entry in the Protection -Database for each user or machine specified by the -name -argument. A user entry name becomes the user's AFS username (the -one to provide when authenticating with the AFS Authentication Server). -A machine entry's name is the machine's IP address or a wildcard -notation that represents a range of consecutive IP addresses (a group of -machines on the same network). It is not possible to authenticate as a -machine, but a group to which a machine entry belongs can appear on a -directory's access control list (ACL), thereby granting the indicated -permissions to any user logged on to the machine. -

    AFS user IDs (AFS UIDs) are positive integers and by default the Protection -Server assigns an AFS UID that is one greater than the current value of the -max user id counter in the Protection Database, incrementing the -counter by one for each user. To assign a specific AFS UID, use the --id argument. If any of the specified AFS UIDs is greater -than the current value of the max user id counter, the counter is -reset to that value. It is acceptable to specify an AFS UID smaller -than the current value of the counter, but the creation operation fails if an -existing user or machine entry already has it. To display or set the -value of the max user id counter, use the pts listmax or -pts setmax command, respectively. -

    The issuer of the pts createuser command is recorded as the -entry's creator and the group system:administrators as -its owner. -

    Cautions -

    The Protection Server reserves AFS UID 0 (zero) and returns an error if the --id argument has that value. -

    Options -

    -

    -name -
    Specifies either a username for a user entry, or an IP address (complete -or wildcarded) for a machine entry: -
      -

    • A username can include up to 63 numbers and lowercase letters, but it is -best to make it shorter than eight characters, because many application -programs cannot handle longer names. Also, it is best not to include -shell metacharacters or other punctuation marks. In particular, the -colon (:) and at-sign (@) characters are not -acceptable. The period is generally used only in special administrative -names, to separate the username and an instance, as in the example -pat.admin. -

    • A machine identifier is its IP address in dotted decimal notation (for -example, 192.12.108.240), or a wildcard notation that -represents a set of IP addresses (a group of machines on the same -network). The following are acceptable wildcard formats. The -letters W, X, Y and Z each -represent an actual number from the range 1 through 255. -
        -

      • W.X.Y.Z represents a single machine, for -example 192.12.108.240. -

      • W.X.Y.0 matches all machines whose IP -addresses start with the first three numbers. For example, -192.12.108.0 matches both -192.12.108.119 and -192.12.108.120, but does not match -192.12.105.144. -

      • W.X.0.0 matches all machines whose IP -addresses start with the first two numbers. For example, the address -192.12.0.0 matches both -192.12.106.23 and -192.12.108.120, but does not match -192.5.30.95. -

      • W.0.0.0 matches all machines whose IP -addresses start with the first number in the specified address. For -example, the address 192.0.0.0 matches both -192.5.30.95 and -192.12.108.120, but does not match -138.255.63.52. -
      -

      Do not define a machine entry with the name -0.0.0.0 to match every machine. The -system:anyuser group is equivalent. -

    -

    -id -
    Specifies an AFS UID for each user or machine entry, rather than allowing -the Protection Server to assign it. Provide a positive integer. -

    If this argument is used and the -name argument names multiple -new entries, it is best to provide an equivalent number of AFS UIDs. -The first UID is assigned to the first entry, the second to the second entry, -and so on. If there are fewer UIDs than entries, the Protection Server -assigns UIDs to the unmatched entries based on the max user id -counter. If there are more UIDs than entries, the excess UIDs are -ignored. If any of the UIDs is greater than the current value of the -max user id counter, the counter is reset to that value. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The command generates the following string to confirm creation of each -user: -

       User name has id id
    -   
    -
    -

    Examples -

    The following example creates a Protection Database entry for the user -johnson. -

       % pts createuser -name johnson
    -   
    -
    -

    The following example creates three wildcarded machine entries in the ABC -Corporation cell. The three entries encompass all of the machines on -the company's networks without including machines on other -networks: -

       % pts createuser -name 138.255.0.0 192.12.105.0 192.12.106.0
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators -group. -

    Related Information -

    pts -

    pts listmax -

    pts setmax -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf216.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf216.htm deleted file mode 100755 index 4c488e4c8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf216.htm +++ /dev/null @@ -1,107 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts delete

    - - - - - - - - - - -

    Purpose -

    Deletes a Protection Database entry -

    Synopsis -

    pts delete -nameorid <user or group name or id>+  [-cell <cell name>]  
    -           [-noauth]  [-force]  [-help]
    -   
    -pts d -na <user or group name or id>+  [-c <cell name>]  [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts delete command removes each entry specified by the --nameorid argument from the Protection Database. Deleting -entries affects other parts of the system in various ways: -

      -

    • Deleted users and groups still appear on access control lists (ACLs), but -are listed by AFS UID or GID rather than by name, because there is no longer -an associated name to which to translate the ID. To remove these -obsolete entries from ACLs, use the fs cleanacl command. -

    • Deleting a user or machine's entry removes it from the membership -list of any group to which it belonged. -

    • Deleting a group entry removes it from the membership list of any user or -machine entry that belonged to the group, and also increments the -group-creation quota of the group's creator by one, even if the creator -no longer owns the group. -
    -

    To remove a user or machine from a group without actually deleting the -entry, use the pts removeuser command. -

    Options -

    -

    -nameorid -
    Specifies the name or AFS UID of each user, the name or AFS GID of each -group, or the IP address (complete or wildcard-style) or AFS UID of each -machine entry to delete. It is acceptable to mix users, machines, and -groups on the same command line, as well as names (IP addresses for machines) -and IDs. Precede the GID of each group with a hyphen to indicate that -it is negative. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example deletes the user entries pat and -terry: -

       % pts delete pat terry
    -   
    -
    -

    The following example deletes the Protection Database entry of the group -with AFS GID -215. -

       % pts delete -215
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators group -to delete user and machine entries. To delete group entries, the issuer -must either own the group or belong to the -system:administrators group. -

    Related Information -

    fs cleanacl -

    pts -

    pts removeuser -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf217.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf217.htm deleted file mode 100755 index 4ffc73de4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf217.htm +++ /dev/null @@ -1,256 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts examine

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Displays a Protection Database entry -

    Synopsis -

    pts examine -nameorid <user or group name or id>+  [-cell <cell name>]   
    -            [-noauth]  [-force]  [-help]
    -    
    -pts e -na <user or group name or id>+  [-c <cell name>]  [-no]  [-f]  [-h]
    -   
    -pts check -na <user or group name or id>+  [-c <cell name>]  
    -          [-no]  [-f]  [-h]
    -   
    -pts che -na <user or group name or id>+  [-c <cell name>]  
    -        [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts examine command displays information from the Protection -Database entry of each user, machine or group specified by the --nameorid argument. -

    Options -

    -

    -nameorid -
    Specifies the name or AFS UID of each user, the name or AFS GID of each -group, or the IP address (complete or wildcard-style) or AFS UID of each -machine for which to display the Protection Database entry. It is -acceptable to mix users, machines, and groups on the same command line, as -well as names (IP addresses for machines) and IDs. Precede the GID of -each group with a hyphen to indicate that it is negative. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output for each entry consists of two lines that include the following -fields: -

    -

    Name -
    The contents of this field depend on the type of entry: -
      -

    • For a user entry, it is the username that the user types when -authenticating with AFS. -

    • For a machine entry, it is either the IP address of a single machine in -dotted decimal format, or a wildcard notation that represents a group of -machines on the same network. See the pts createuser -reference page for an explanation of the wildcard notation. -

    • For a group entry, it is one of two types of group name. If the -name has a colon between the two parts, it represents a regular group and the -part before the prefix reflects the group's owner. A prefix-less -group does not have the owner field or the colon. For more details on -group names, see the pts creategroup reference page. -
    - - - -

    id -
    A unique number that the AFS server processes use to identify AFS users, -machines and groups. AFS UIDs for user and machine entries are positive -integers, and AFS GIDs for group entries are negative integers. AFS -UIDs and GIDs are similar in function to the UIDs and GIDs used in local file -systems such as UFS, but apply only to AFS operations. - - -

    owner -
    The user or group that owns the entry and thus can administer it (change -the values in most of the fields displayed in the output of this command), or -delete it entirely. The Protection Server automatically records the -system:administrators group in this field for user and -machine entries at creation time. - -

    creator -
    The user who issued the pts createuser or pts -creategroup command to create the entry. This field serves as an -audit trail, and cannot be changed. - -

    membership -
    An integer that for users and machines represents the number of groups to -which the user or machine belongs. For groups, it represents the number -of group members. -

    flags -
    A string of five characters, referred to as privacy flags, -which indicate who can display or administer certain aspects of the -entry. -
    -

    s -
    Controls who can issue the pts examine command to display the -entry. -

    o -
    Controls who can issue the pts listowned command to display the -groups that a user or group owns. -

    m -
    Controls who can issue the pts membership command to display -the groups a user or machine belongs to, or which users or machines belong to -a group. -

    a -
    Controls who can issue the pts adduser command to add a user or -machine to a group. It is meaningful only for groups, but a value must -always be set for it even on user and machine entries. -

    r -
    Controls who can issue the pts removeuser command to remove a -user or machine from a group. It is meaningful only for groups, but a -value must always be set for it even on user and machine entries. -
    -

    -

    Each flag can take three possible types of values to enable a different set -of users to issue the corresponding command: -

      -

    • A hyphen (-) designates the members of the -system:administrators group and the entry's -owner. For user entries, it designates the user in addition. -

    • The lowercase version of the letter applies meaningfully to groups only, -and designates members of the group in addition to the individuals designated -by the hyphen. -

    • The uppercase version of the letter designates everyone. -
    -

    -

    For example, the flags SOmar on a group entry indicate that -anyone can examine the group's entry and display the groups that it owns, -and that only the group's members can display, add, or remove its -members. -

    The default privacy flags for user and machine entries are -S----, meaning that anyone can display the entry. The -ability to perform any other functions is restricted to members of the -system:administrators group and the entry's owner (as -well as the user for a user entry). -

    The default privacy flags for group entries are S-M--, meaning -that all users can display the entry and the members of the group, but only -the entry owner and members of the system:administrators -group can perform other functions. -

    group quota -
    The number of additional groups the user is allowed to create. The -pts createuser command sets it to 20 for both users and machines, -but it has no meaningful interpretation for a machine, because it is not -possible to authenticate as a machine. Similarly, it has no meaning in -group entries and the pts creategroup command sets it to 0 -(zero); do not change this value. - - -
    -

    Examples -

    The following example displays the user entry for terry and the -machine entry 158.12.105.44. -

       % pts examine terry 158.12.105.44
    -   Name: terry, id: 1045, owner: system:administrators, creator: admin, 
    -     membership: 9, flags: S----, group quota: 15.
    -   Name: 158.12.105.44, id: 5151, owner: system:administrators, 
    -     creator: byu, membership: 1, flags: S----, group quota: 20.
    -   
    -
    -

    The following example displays the entries for the AFS groups with GIDs --673 and -674. -

       % pts examine -673 -674
    -   Name: terry:friends, id: -673, owner: terry, creator: terry, 
    -     membership: 5, flags: S-M--, group quota: 0.
    -   Name: smith:colleagues, id: -674, owner: smith, creator: smith, 
    -     membership: 14, flags: SOM--, group quota: 0.
    -   
    -
    -

    Privilege Required -

    The required privilege depends on the setting of the first privacy flag in -the Protection Database entry of each entry specified by the --nameorid argument: -

      -

    • If it is lowercase s, members of the -system:administrators group and the user associated with a -user entry can examine it, and only members of the -system:administrators group can examine a machine or group -entry. -

    • If it is uppercase S, anyone who can access the cell's -database server machines can examine the entry. -
    -

    Related Information -

    pts -

    pts adduser -

    pts chown -

    pts creategroup -

    pts createuser -

    pts listowned -

    pts membership -

    pts removeuser -

    pts rename -

    pts setfields -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf218.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf218.htm deleted file mode 100755 index e6aedcea2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf218.htm +++ /dev/null @@ -1,85 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts help

    - - - -

    Purpose -

    Displays the syntax of specified pts commands or lists -functional descriptions for all pts commands -

    Synopsis -

    pts help [-topic <help string>+]  [-help]
    -    
    -pts h [-t <help string>+]  [-h]
    -
    -

    Description -

    The pts help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every pts command. -

    To list every pts command whose name or short description -includes a specified keyword, use the pts apropos command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the pts part of the command name, providing only -the operation code (for example, specify membership, not pts -membership). If this argument is omitted, the output briefly -describes every pts command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each pts command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the pts -membership command: -

       % pts help membership
    -   pts membership:  list membership of a user or group
    -   aliases: groups
    -   Usage: pts membership -nameorid <user or group name or id>+ 
    -   [-cell <cell name>] [-noauth] [-force] [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    pts -

    pts apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf219.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf219.htm deleted file mode 100755 index 4468f4332..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf219.htm +++ /dev/null @@ -1,112 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts listentries

    - - - - - - -

    Purpose -

    Displays all user or group entries in the Protection Database -

    Synopsis -

    pts listentries [-users]  [-groups]  [-cell <cell name>]
    -                [-noauth]  [-force]  [-help]
    -   
    -pts liste [-u]  [-g]  [-c <cell name>]  [-n]  [-f]  [-h]
    -
    -

    Description -

    The pts listentries command displays the name and AFS ID of all -Protection Database entries of the indicated type. It also displays the -AFS ID of each entry's owner and creator. -

    To display all user and machine entries, either include the --users flag or omit both it and the -groups flag. -To display all group entries, include the -groups flag. To -display all entries, provide both flags. -

    Options -

    -

    -users -
    Displays user and machine entries. -

    -groups -
    Displays group entries. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output includes a line for each entry, with information in four columns -that have the following headers: -

    -

    Name -
    The entry's name -

    ID -
    The entry's AFS ID (AFS UID for a user or machine, negative AFS GID -for a group) -

    Owner -
    The AFS ID of the user or group that owns the entry -

    Creator -
    The AFS ID of the user who created the entry (the -system:administrators group is listed as the creator of the -entry for anonymous and the system groups, but it is not otherwise -possible for a group to create groups) -
    -

    In general, the entries appear in the order in which they were -created. -

    Examples -

    The following example displays both user and group entries. -

       % pts listentries -users -groups
    -   Name                          ID  Owner Creator
    -   system:administrators       -204   -204    -204 
    -   system:anyuser              -101   -204    -204 
    -   system:authuser             -102   -204    -204 
    -   anonymous                  32766   -204    -204 
    -   admin                          1   -204   32766 
    -   pat                          100   -204       1 
    -   smith                        101   -204       1 
    -   pat:friends                 -206    100     100 
    -   staff                       -207   -204       1
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators -group. -

    Related Information -

    pts -

    pts creategroup -

    pts createuser -

    pts examine -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf220.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf220.htm deleted file mode 100755 index 40693d561..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf220.htm +++ /dev/null @@ -1,90 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts listmax

    - - - - - - - - -

    Purpose -

    Displays the max user id and max group id counters -

    Synopsis -

    pts listmax [-cell <cell name>]  [-noauth]  [-force]  [-help]
    -    
    -pts listm  [-c <cell name>]  [-n]  [-f]  [-h]
    -
    -

    Description -

    The pts listmax command displays the values of the max user -id and max group id counters, which the Protection Server -uses to track the AFS user IDs (AFS UIDs) it allocates to new users or -machines, and the AFS group IDs (AFS GIDs) it allocates to new groups, -respectively. When an administrator next issues the pts -createuser command and does not include the -id argument, the -new user or machine receives an AFS UID one greater than the max user -id counter, and when a user issues the pts creategroup -command and does not include the -id argument, the new group -receives an AFS UID one less (more negative) than the max group id -counter. -

    To reset one or both counters, members of the -system:administrators group can issue the pts -setmax command. -

    Options -

    -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The command displays the counters in the following format: -

       Max user id is user_counter and max group id is group_counter.
    -   
    -
    -

    Examples -

    The following example displays the output of this command: -

       % pts listmax
    -   Max user name is 1271 and max group id is -382.
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    pts -

    pts setmax -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf221.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf221.htm deleted file mode 100755 index edc16e840..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf221.htm +++ /dev/null @@ -1,127 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts listowned

    - - - - - - - -

    Purpose -

    Displays the Protection Database groups owned by a user or group -

    Synopsis -

    pts listowned -nameorid <user or group name or id>+  [-cell <cell name>]  
    -              [-noauth]  [-force]  [-help]
    -   
    -pts listo -na <user or group name or id>+  [-c <cell name>]  
    -          [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts listowned command lists the groups owned by each user or -group specified by the -nameorid argument. -

    To list any orphaned groups, whose owners have themselves been -deleted from the Protection Database, provide a value of 0 (zero) -for the -nameorid argument. To change the owner to a user or -group that still exists, use the pts chown command. -

    Options -

    -

    -nameorid -
    Specifies the name or AFS UID of each user, or the name or AFS GID of each -group, for which to display the list of owned groups. It is acceptable -to mix users and groups on the same command line, as well as names and -IDs. Precede the GID of each group with a hyphen to indicate that it is -negative. -

    A value of 0 (zero) lists group entries for groups whose owners -no longer have entries in the Protection Database. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of the output indicates the name and AFS UID or AFS GID of -each user or group for which ownership information is requested, in the -following format: -

       Groups owned by name (id: ID) are:
    -   
    -
    -

    A list of groups follows. The list does not include groups owned by -groups that the user or group owns, or to which the user or group -belongs. If the user or group does not own any groups, only the header -line appears. -

    The following error message appears if the issuer is not privileged to view -ownership information. By default, for both user and group entries the -second privacy flag is the hyphen, which denies permission to anyone other -than the user (for a user entry) and the members of the -system:administrators group. -

       pts: Permission denied so failed to get owner list for name (id: ID)
    -   
    -
    -

    Examples -

    The following example lists the groups owned by user terry and -shows that the group terry:friends does not own any -groups: -

       % pts listowned terry terry:friends
    -   Groups owned by terry (id: 1045) are:
    -     terry:friends
    -     terry:project1
    -     terry:project2
    -   Groups owned by terry:friends (id: -673) are:
    -   
    -
    -

    Privilege Required -

    The required privilege depends on the setting of the second privacy flag in -the Protection Database entry of each user or group indicated by the --nameorid argument (use the pts examine command to -display the flags): -

      -

    • If it is the hyphen and the -nameorid argument specifies a -group, only the members of the system:administrators group -and the owner of a group can list the groups it owns. -

    • If it is the hyphen and the -nameorid argument specifies a -user, only the members of the system:administrators group and -the associated user can list the groups he or she owns. -

    • If it is uppercase letter O, anyone who can access the -cell's database server machines can list the groups owned by this user or -group. -
    -

    Related Information -

    pts -

    pts chown -

    pts examine -

    pts setfields -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf222.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf222.htm deleted file mode 100755 index c92710ce8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf222.htm +++ /dev/null @@ -1,146 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts membership

    - - - - - - - - -

    Purpose -

    Displays the membership list for a user or group -

    Synopsis -

    pts membership -nameorid <user or group name or id>+  [-cell <cell name>]  
    -               [-noauth]  [-force]  [-help]
    -   
    -pts m -na <user or group name or id>+  [-c <cell name>]  [-no]  [-f]  [-h]
    -   
    -pts groups -na <user or group name or id>+  [-c <cell name>]
    -           [-no] [-f]  [-h]
    -   
    -pts g -na <user or group name or id>+  [-c <cell name>]  [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts membership command lists the groups to which each user -or machine specified by the -nameorid argument belongs, or lists -the users and machines that belong to each group specified by the --nameorid argument. -

    It is not possible to list the members of the -system:anyuser or system:authuser groups, -and they do not appear in the list of groups to which a user belongs. -

    To add users or machine to groups, use the pts adduser -command; to remove them, use the pts removeuser -command. -

    Options -

    -

    -nameorid -
    Specifies the name or AFS UID of each user entry, the IP address (complete -or wildcard-style) or AFS UID of each machine entry, or the name or AFS GID of -each group, for which to list group membership. It is acceptable to mix -users, machines, and groups on the same command line, as well as names and -IDs. Precede the GID of each group with a hyphen to indicate that it is -negative. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    For each user and machine, the output begins with the following header -line, followed by a list of the groups to which the user or machine -belongs: -

       Groups name (id: AFS UID) is a member of:
    -   
    -
    -

    For each group, the output begins with the following header line, followed -by a list of the users and machines who belong to the group: -

       Members of group_name (id: AFS GID) are:
    -   
    -
    -

    Examples -

    The following example lists the groups to which the user pat -belongs and the members of the group smith:friends. -Note that third privacy flag for the pat entry was changed from the -default hyphen to enable a non-administrative user to obtain this -listing. -

       % pts membership pat smith:friends
    -   Groups pat (id: 1144) is a member of:
    -     smith:friends
    -     staff
    -     johnson:project-team
    -   Members of smith:friends (id: -562) are:
    -     pat
    -     terry
    -     jones
    -     richard
    -     thompson
    -   
    -
    -

    Privilege Required -

    The required privilege depends on the setting of the third privacy flag in -the Protection Database entry of each user or group indicated by the --nameorid argument (use the pts examine command to -display the flags): -

      -

    • If it is the hyphen and the -nameorid argument specifies a -user, only the associated user and members of the -system:administrators group can list the groups to which the -user belongs. -

    • If it is the hyphen and the -nameorid argument specifies a -machine, only the members of the system:administrators group -can list the groups to which the machine belongs. -

    • If it is the hyphen and the -nameorid argument specifies a -group, only the owner of the group and members of the -system:administrators group can list the members of the -group. -

    • If it is lowercase m and the -nameorid argument -specifies a user or machine entry, the meaning is equivalent to the -hyphen. -

    • If it is lowercase m and the -nameorid argument -specifies a group, members of the group can also list the other -members. -

    • If it is uppercase M, anyone who can access the cell's -database server machines can list group memberships. -
    -

    Related Information -

    pts -

    pts adduser -

    pts examine -

    pts removeuser -

    pts setfields -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf223.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf223.htm deleted file mode 100755 index d2c5c7324..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf223.htm +++ /dev/null @@ -1,111 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts removeuser

    - - - - - - - - -

    Purpose -

    Removes a user from a Protection Database group -

    Synopsis -

    pts removeuser -user <user name>+  -group <group name>+
    -               [-cell <cell name>]  [-noauth]  [-force]  [-help]
    -   
    -pts rem -u <user name>+  -g <group name>+  [-c <cell name>]  
    -        [-n]  [-f]  [-h]
    -
    -

    Description -

    The pts removeuser command removes each user or machine named by -the -user argument from each group named by the -group -argument. -

    To add users to a group, use the pts adduser command. To -list group membership, use the pts membership command. To -remove users from a group and delete the group's entry completely in a -single step, use the pts delete command. -

    Cautions -

    AFS compiles each user's group membership as he or she -authenticates. Any users who have valid tokens when they are removed -from a group retain the privileges extended to that group's members until -they discard their tokens or reauthenticate. -

    Options -

    -

    -name -
    Specifies the name of each user entry or the IP address (complete or -wildcard-style) of each machine entry to remove. -

    -group -
    Names each group from which to remove members. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example removes user smith from the groups -staff and staff:finance. Note that no -switch names are necessary because only a single instance is provided for the -first argument (the username). -

       % pts removeuser smith staff staff:finance
    -   
    -
    -

    The following example removes three machine entries, which represent all -machines in the ABC Corporation network, from the group -bin-prot: -

       % pts removeuser -user 138.255.0.0 192.12.105.0 192.12.106.0 -group bin-prot
    -   
    -
    -

    Privilege Required -

    The required privilege depends on the setting of the fifth privacy flag in -the Protection Database for the group named by the -group argument -(use the pts examine command to display the flags): -

      -

    • If it is the hyphen, only the group's owner and members of the -system:administrators group can remove members. -

    • If it is lowercase r, members of the group can also remove -other members. -
    -

    (It is not possible to set the fifth flag to uppercase -R.) -

    Related Information -

    pts -

    pts adduser -

    pts examine -

    pts membership -

    pts setfields -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf224.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf224.htm deleted file mode 100755 index 250419e84..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf224.htm +++ /dev/null @@ -1,110 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts rename

    - - - - - - -

    Purpose -

    Changes the name of a Protection Database entry -

    Synopsis -

    pts rename -oldname <old name>  -newname <new name>
    -           [-cell <cell name>]  [-noauth]  [-force]  [-help]
    -    
    -pts ren -o <old name>  -ne <new name>  [-c <cell name>]  [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts rename command changes the name of the user, machine, or -group entry specified by the -oldname argument to the name -specified by the -newname argument. It is not possible to -change a user or machine entry's name to look like a regular group -entry's name (have a colon in it). -

    Members of the system:administrators group can change a -regular group name into a prefix-less name and vice versa. When -changing a prefix-less group name into a regular group name or a regular group -name to another regular group name, the owner field of the new name (the part -before the colon) must correctly reflect the group's owner. -

    Changing a regular group's owner with the pts chown command -automatically changes the owner field (the part before the colon) of the -group's name, but does not change the owner field of any groups owned by -the group. Use this command to rename those groups to a form that -accurately reflects their ownership. -

    Cautions -

    By convention, many aspects of an AFS user account have the same name as -the user's Protection Database entry, including the Authentication -Database entry, volume, and mount point. When using this command to -change a user name, also change the names of all related entities to maintain -consistency. For instructions, see the chapter on user accounts in the -AFS Administration Guide. -

    Options -

    -

    -oldname -
    Specifies the current full name of the entry. -

    -newname -
    Specifies the new full name for the entry. For regular groups, the -owner field (the part before the colon) of the new name must reflect the -actual ownership of the group. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example changes the name of the group staff, owned -by the privileged user admin, to -admin:staff: -

       % pts rename -oldname staff -newname admin:staff
    -   
    -
    -

    The following example changes the name of the group -admin:finance to the group finance. The -issuer must belong to the system:administrators group. -

       % pts rename -oldname admin:finance -newname finance
    -   
    -
    -

    Privilege Required -

    To change a regular group name to a prefix-less name or vice versa, or to -change a user or machine entry's name, the issuer must belong to the -system:administrators group. -

    To change a group name to a new name of the same type (regular or -prefix-less), the issuer must own the group or belong to the -system:administrators group. -

    Related Information -

    pts -

    pts chown -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf225.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf225.htm deleted file mode 100755 index 2fb012166..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf225.htm +++ /dev/null @@ -1,199 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts setfields

    - - - - - - - - - - - - - -

    Purpose -

    Sets privacy flags or the group-creation quota for a Protection Database -entry. -

    Synopsis -

    pts setfields -nameorid <user or group name or id>+
    -              [-access <set privacy flags>]
    -              [-groupquota <set limit on group creation>]
    -              [-cell <cell name>]  [-noauth]  [-force]  [-help]
    -   
    -pts setf -na <user or group name or id>+  [-a <set privacy flags>] 
    -         [-g <set limit on group creation>]  [-c <cell name>] 
    -         [-no]  [-f]  [-h]
    -
    -

    Description -

    The pts setfields command sets the group-creation quota, the -privacy flags, or both, associated with each user, machine, or group entry -specified by the -nameorid argument. -

    To examine the current quota and privacy flags, use the pts -examine command. -

    Cautions -

    Changing a machine or group's group-creation quota is allowed, but not -recommended. The concept is meaningless for machines and groups, -because it is impossible to authenticate as a group or machine. -

    Similarly, some privacy flag settings do not have a sensible -interpretation. The Arguments section specifies the -appropriate settings. -

    Options -

    -

    -nameorid -
    Specifies the name or AFS UID of each user, the IP address (complete or -wildcard-style) of each machine, or the name or AFS GID of each machine for -which to set privacy flags or group-creation quota. It is acceptable to -mix users, machines, and groups on the same command line, as well as names (IP -addresses for machines) and IDs. Precede the GID of each group with a -hyphen to indicate that it is negative. -

    -access -
    Specifies the privacy flags to apply to each entry. Provide a -string of five characters, one for each of the permissions. If this -option is omitted, the current setting remains unchanged. -

    Set each flag to achieve the desired combination of permissions. If -the following list does not mention a certain setting, it is not -acceptable. For further discussion of the privacy flags, see the -pts examine reference page. -

      -

    • The first flag determines who can use the pts examine command -to display information from a user, machine or group's Protection -Database entry. -
        -

      • Set it to lowercase s to permit the members of the -system:administrators group to display a user, machine, or -group entry, and the associated user to display a user entry. -

      • Set it to uppercase S to permit anyone who can access the -cell's database server machines to display a user, machine, or group -entry. -
      -

    • The second flag determines who can use the pts listowned -command to list the groups that a user or group owns. -
        -

      • Set it to the hyphen (-) to permit the members of the -system:administrators group and a user to list the groups he -or she owns, or to permit the members of the -system:administrators group and a group's owner to list -the groups that a group owns. -

      • Set it to uppercase letter O to permit anyone who can access -the cell's database server machines to list the groups owned by a machine -or group entry. -
      -

    • The third flag determines who can use the pts membership -command to list the groups to which a user or machine belongs, or the users -and machines that belong to a group. -
        -

      • Set it to the hyphen (-) to permit the members of the -system:administrators group and a user to list the groups he -or she belongs to, to permit the members of the -system:administrators group to list the groups a machine -belongs to, or to permit the members of the -system:administrators group and a group's owner to list -the users and machines that belong to it. -

      • Set it to lowercase m to permit members of a group to list the -other members. (For user and machine entries, this setting is -equivalent to the hyphen.) -

      • Set it to uppercase M to permit anyone who can access the -cell's database server machines to list membership information for a -user, machine or group. -
      -

    • The fourth flag determines who can use the pts adduser command -to add users and machines as members of a group. This flag has no -sensible interpretation for user and machine entries, but must be set -nonetheless, preferably to the hyphen. -
        -

      • Set it to the hyphen (-) to permit the members of the -system:administrators group and the owner of the group to add -members. -

      • Set it to lowercase a to permit members of a group to add other -members. -

      • Set it to uppercase A to permit anyone who can access the -cell's database server machines to add members to a group. -
      -

    • The fifth flag determines who can use the pts removeuser -command to remove users and machines from membership in a group. This -flag has no sensible interpretation for user and machine entries, but must be -set nonetheless, preferably to the hyphen. -
        -

      • Set it to the hyphen (-) to permit the members of the -system:administrators group and the owner of the group to -remove members. -

      • Set it to lowercase r to permit members of a group to remove -other members. -
      -
    -

    -groupquota -
    Specifies the number of additional groups a user can create (it does not -matter how many he or she has created already). Do not include this -argument for a group or machine entry. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example changes the privacy flags on the group -operators, retaining the default values of the first, second and -third flags, but setting the fourth and fifth flags to enable the group's -members to add and remove other members. -

       % pts setfields -nameorid operators -access S-Mar
    -   
    -
    -

    The following example changes the privacy flags and sets group quota on the -user entry admin. It retains the default values of the -first, fourth, and fifth flags, but sets the second and third flags, to enable -anyone to list the groups that admin owns and belongs to. -Users authenticated as admin can create an additional 50 -groups. -

       % pts setfields -nameorid admin -access SOM-- -groupquota 50
    -   
    -
    -

    Privilege Required -

    To edit group entries or set the privacy flags on any type of entry, the -issuer must own the entry or belong to the -system:administrators group. To set group-creation -quota on a user entry, the issuer must belong to the -system:administrators group. -

    Related Information -

    pts -

    pts adduser -

    pts examine -

    pts listowned -

    pts membership -

    pts removeuser -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf226.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf226.htm deleted file mode 100755 index 12242077f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf226.htm +++ /dev/null @@ -1,95 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    pts setmax

    - - - - - - - - -

    Purpose -

    Sets the value of the max group id or max user id -counter -

    Synopsis -

    pts setmax [-group <group max>]  [-user <user max>]  [-cell <cell name>]   
    -           [-noauth]  [-force]  [-help] 
    -    
    -pts setm [-g group max>]  [-u <user max>]  [-c <cell name>]  [-n]  [-f]  [-h]
    -
    -

    Description -

    The pts setmax command sets the value of one or both counters -that track the IDs the Protection Server allocates to new users, machines, or -groups: the max user id counter for the AFS user IDs (AFS -UIDs) assigned to users and machines, and the max group id counter -for the AFS group IDs (AFS GIDs) assigned to groups. -

    Use the pts listmax command to display the current value of both -counters. -

    Options -

    -

    -group -
    Sets the max group id counter. Precede the value with a -hyphen to indicate that it is negative. When an administrator next uses -the pts creategroup command to create a group entry and does not -include that command's -id argument, the Protection Server -assigns the group an AFS GID one less (more negative) than this value. -

    -user -
    Sets the max user id counter. When an administrator next -uses the pts createuser command to create a user or machine entry -and does not include that command's -id argument, the -Protection Server assigns the group an AFS UID one greater than this -value. -

    -cell -
    Names the cell in which to run the command. For more details, see -the introductory pts reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. For more details, see the introductory pts reference -page. -

    -force -
    Enables the command to continue executing as far as possible when errors -or other problems occur, rather than halting execution at the first -error. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command sets the max group id counter to -500 and -the max user id counter to 1000. -

       % pts setmax -group -500 -user 1000
    -   
    -
    -

    Privilege Required -

    The issuer must belong to the system:administrators -group. -

    Related Information -

    pts -

    pts creategroup -

    pts createuser -

    pts listmax -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf227.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf227.htm deleted file mode 100755 index 66ebdf3f0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf227.htm +++ /dev/null @@ -1,114 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    ptserver

    - - - - - -

    Purpose -

    Initializes the Protection Server -

    Synopsis -

    ptserver [-database <db path>]  [-p <number of processes>] [-rebuildDB] 
    -         [-enable_peer_stats]  [-enable_process_stats]  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The ptserver command initializes the Protection Server, which -must run on every database server machine. In the conventional -configuration, its binary file is located in the /usr/afs/bin -directory on a file server machine. -

    The ptserver command is not normally issued at the command shell -prompt, but rather placed into a database server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a file server machine as the local superuser -root. -

    The Protection Server performs the following tasks: -

      -

    • Maintains the Protection Database, which contains entries for every user -and group in the cell. Use the pts commands to administer -the database. -

    • Allocates AFS IDs for new user, machine and group entries and maps each ID -to the corresponding name. -

    • Generates a current protection subgroup (CPS) at the File Server's -request. The CPS lists all groups to which a user or machine -belongs. -
    -

    Options -

    -

    -database -
    Specifies the pathname of an alternate directory in which the Protection -Database files reside. Provide the complete pathname, ending in the -base filename to which the .DB0 and -.DBSYS1 extensions are appended. For example, the -appropriate value for the default database files is -/usr/afs/db/prdb. -

    -p -
    Sets the number of server lightweight processes (LWPs) to run. -Provide a positive integer from the range 3 to -16. The default value is 3. -

    -rebuildDB -
    Rebuilds the Protection Database at the beginning of Protection Server -initialization. Use this argument only in consultation with AFS -Development or Product Support. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following bos create command creates a ptserver -process on the machine fs3.abc.com. The -command appears here on multiple lines only for legibility. -

       % bos create -server fs3.abc.com -instance ptserver  \
    -                -type simple -cmd /usr/afs/bin/ptserver
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BosConfig -

    prdb.DB0 and prdb.DBSYS1 -

    bos create -

    bos getlog -

    pts -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf228.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf228.htm deleted file mode 100755 index 8d82724c8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf228.htm +++ /dev/null @@ -1,120 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    rcp (AFS version)

    - - - - - - -

    Purpose -

    Copies a file on a remote machine -

    Synopsis -

    rcp [-p]  <file1>  <file2>
    -   
    -rcp [-r]  [-p]  <file>+  <directory>
    -
    -

    Description -

    The AFS-modified rcp program functions like the standard UNIX -rcp program, but also passes the issuer's AFS token to the -remote machine's Cache Manager, to enable authenticated access to the AFS -filespace via that machine. -

    Token passing is most effective if both the remote machine and local -machine belong to the same cell, because the rcp command can pass -only one token even if the user has several tokens--it passes the token -listed first in the output from the tokens command. If the -remote and local machine do not belong to the same cell, the possibilities are -as follows: -

      -

    • The passed token is for the remote machine's cell. The issuer -accesses the remote cell's AFS file tree as an authenticated AFS user, -but is considered anonymous in the local cell and so can exercise -only the access rights granted to the system:anyuser group -there. For example, to copy a file into a local AFS directory from the -remote cell, the directory's ACL must grant the l -(lookup) and i (insert) permissions to the -system:anyuser group. -

    • The passed token is for the local machine's cell. The issuer -accesses the remote cell's AFS file tree as anonymous, and so -can only exercise the access rights granted to the -system:anyuser group. -
    -

    In addition to running the AFS version of the rcp binary on the -machine where the rcp command is issued, other configuration -changes are necessary for token passing to work properly. See the -Cautions section for a list. -

    The AFS version of the rcp command is compatible with the -standard inetd command, but token passing works only if both -programs are modified to handle AFS tokens. If only one of them is -modified, the issuer accesses the AFS filespace through the remote machine as -the anonymous user. -

    Cautions -

    The AFS distribution does not include an AFS-modified version of this -command for every system type, in some cases because the operating system -vendor has already modified the standard version in the required way. -For details, see the AFS Release Notes. -

    The AFS rcp command does not allow third party copies, in which -neither the source file nor the target file is stored on the machine where the -command is issued. The standard UNIX rcp command claims to -provide this functionality. -

    For security's sake, use the AFS version of the rcp command -only in conjunction with PAGs, either by using an AFS-modified login utility, -issuing the pagsh command before obtaining tokens, or including the --setpag flag to the klog command. -

    Several configuration requirements and restrictions are necessary for token -passing to work correctly with an AFS-modified version of the rcp -command. Some of these are also necessary with the standard UNIX -version, but are included here because the issuer accustomed to AFS -protections is possibly unlikely to consider them. There are possibly -other UNIX-based requirements and restrictions not mentioned here; -consult the UNIX manual page. (One important one is that no -stty commands can appear in the issuer's shell initialization -file, such as the .cshrc file.) -

    The requirements and restrictions for token passing include the -following. -

      -

    • The local machine must be running the AFS version of the rcp -command, with the rcp binary file locally installed to grant setuid -privilege to the owner, the local superuser root. -

    • The remote machine must be running the AFS version of the inetd -program. -

    • If the rcp command is to consult a .rhosts -file on the remote machine, the file must have UNIX protections no more -liberal than -rw-r--r--. If the .rhosts -file resides in a user home directory in AFS, the home directory must also -grant the lookup (l) and read (r) -permissions to the system:anyuser group. -
    -

    Options -

    Consult the UNIX manual page for the rcp command. -

    Privilege Required -

    None -

    Related Information -

    inetd (AFS version) -

    tokens -

    UNIX manual page for rcp -

    AFS Release Notes -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf229.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf229.htm deleted file mode 100755 index 4306b33cc..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf229.htm +++ /dev/null @@ -1,105 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    rsh (AFS version)

    - - - - - -

    Purpose -

    Opens a shell on a remote machine -

    Synopsis -

    rsh host  [-n]  [-l <username>]  <command>
    -   
    -host  [-n]  [-l <username>]    <command>
    -
    -

    Description -

    The AFS-modified rsh program functions like the standard UNIX -rsh program, but also passes the issuer's AFS token to the -remote machine's Cache Manager, to enable authenticated access to the AFS -filespace via that machine. -

    Token passing is most effective if both the remote machine and local -machine belong to the same cell, because the rsh program can pass -only one token even if the user has several tokens--it passes the token -listed first in the output from the tokens command. If the -remote and local machine do not belong to the same cell, the first token must -be valid for the remote machine's cell, in order for the remote -cell's server processes to recognize the issuer as authenticated. -

    In addition to running the AFS version of the rsh binary on the -machine where the rsh command is issued, other configuration -changes are necessary for token passing to work properly. See the -Cautions section for a list. -

    The AFS version of the rsh command is compatible with the -standard UNIX inetd command, but token passing works only if both -programs are modified to handle AFS tokens. If only one of them is -modified, the issuer accesses the AFS filespace through the remote machine as -the user anonymous. -

    Cautions -

    Some operating systems assign an alternate name to this program, such as -remsh. The version included in the AFS distribution uses the -same name as the operating system. -

    The AFS distribution does not include an AFS-modified version of this -command for every system type, in some cases because the operating system -vendor has already modified the standard version in the required way. -For details, see the AFS Release Notes. -

    For security's sake, use the AFS version of the rsh command -only in conjunction with PAGs, either by using an AFS-modified login utility, -issuing the pagsh command before obtaining tokens, or including the --setpag flag to the klog command. -

    Several configuration requirements and restrictions are necessary for token -passing to work correctly with the AFS version of the rsh -command. Some of these are also necessary with the standard UNIX -version, but are included here because the issuer used to AFS protections is -possibly unlikely to think of them. There are possibly other UNIX-based -requirements or restrictions not mentioned here; consult the UNIX manual -page for the rsh command. (One important one is that no -stty commands can appear in the issuer's shell initialization -file, such as the .cshrc file.) -

    The requirements and restrictions for token passing include the -following. -

      -

    • The local machine must be running the AFS version of the rsh -command, with the binary file locally installed to grant setuid privilege to -the owner, the local superuser root. -

    • The remote machine must be running the AFS version of the inetd -program. -

    • If the rsh command is to consult an .rhosts -file on the remote machine, the file must have UNIX mode bits no more liberal -than -rw-r--r--. If the .rhosts file -resides in a user home directory in AFS, the home directory must also grant -the l (lookup) and r (read) -permissions to the system:anyuser group. -
    -

    Options -

    Consult the UNIX manual page for the rsh command. -

    Privilege Required -

    None -

    Related Information -

    inetd (AFS version) -

    tokens -

    UNIX manual page for rsh or remsh -

    AFS Release Notes -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf230.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf230.htm deleted file mode 100755 index 0e96b3d61..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf230.htm +++ /dev/null @@ -1,123 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    runntp

    - - - - - - - -

    Purpose -

    Initializes the Network Time Protocol Daemon -

    Synopsis -

    runntp [-localclock] [-precision <small negative integer>]  
    -       [-logfile <filename for ntpd's stdout/stderr>]  
    -       [-ntpdpath <pathname of ntpd executable (/usr/afs/bin/ntpd)>]  
    -       [<host>+] [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The runntp command initializes the Network Time Protocol Daemon -(NTPD) and related programs on the local machine and constructs an -ntp.conf configuration file. The intended use is on -AFS file server machines as a convenient interface to the standard -ntpd program. -

    In the conventional configuration, the binary file for the command is -located in the /usr/afs/bin directory on a file server -machine. The command is not normally issued at the command shell -prompt, but rather placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a server machine as the local superuser -root. -

    Cautions -

    Do not run the runntp program if NTPD or another time protocol -is already in use in the cell. Running two time-synchronization -protocols can cause errors. -

    Options -

    -

    -localclock -
    Designates the local machine's internal clock as a possible time -source if a network partition separates the machine from the other source -machines listed on the command line. In cells that are not connected to -an exterior network or are behind a firewall, include this flag on every -machine that runs the runntp process. In cells that -frequently lose access to exterior networks (voluntarily or not), include it -only on the runntp process running on the system control -machine. Do not include the flag if the cell is reliably connected to -exterior networks. -

    -precision -
    Specifies the precision of the local clock. This argument is not -normally provided. As the ntpd process initializes, it -determines the precision of the local clock on its own. If provided, it -is a small integer preceded by a hyphen to show that it is negative. -The value is used as an exponent on the number 2, and the result interpreted -as the frequency, in fractions of a second, at which the local clock ticks -(advances). -

    For example, a value of -6, which translates to -2-6 or 1/64, means that the local clock ticks once every -1/64th of a second, or has a precision of about 60 ticks per second. A -value of -7 translates to about 100 ticks per second. A -value of -10 translates to about 1000 ticks per second (a -millisecond clock). -

    -logfile -
    Specifies the local disk pathname for the NTP daemon's log file, such -as /usr/afs/logs/ntp.log. The log records which -machines are serving as time sources and peers, what adjustments have been -made to reduce drift, and so on. Use the ntpd process's -debugging mechanism to control the amount of information produced. If -this argument is omitted, the information is discarded. -

    -ntpdpath -
    Specifies the local disk pathname of the binary for the ntpd -program. If this argument is omitted, the default is -/usr/afs/bin/ntpd. -

    host -
    Is the fully qualified hostname of each machine to consult as a time -source. By convention, the machines are outside the cell if exterior -networks are accessible. -

    In general, this argument is necessary only on the system control -machine. If the issuer omits it, then the local machine consults the -local database server machines listed in its copy of the -/usr/afs/etc/CellServDB file. -

    For advice on selecting appropriate time sources, see the AFS Quick -Beginnings or ask AFS Product Support. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    bos create -

    UNIX manual page for ntp -

    UNIX manual page for ntpd -

    UNIX manual page for ntpdc -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf231.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf231.htm deleted file mode 100755 index 0f1b5b52b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf231.htm +++ /dev/null @@ -1,168 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    rxdebug

    - - - -

    Purpose -

    Provides debugging trace of Rx activity -

    Synopsis -

    rxdebug -servers <server machine>  [-port <IP port>]  [-nodally]  
    -        [-allconnections]  [-rxstats] [-onlyserver]  [-onlyclient]  
    -        [-onlyport <show only <port>>]  [-onlyhost <show only <host>>]  
    -        [-onlyauth <show only <auth level>>]  [-version]  [-noconns]  
    -        [-peers]  [-help] 
    -   
    -rxdebug -s <server machine>  [-po <IP port>]  [-nod]  [-a]  [-r]  
    -        [-onlys]  [-onlyc]   [-onlyp <show only <port>>]  
    -        [-onlyh <show only <host>>]  [-onlya <show only <auth level>>]  
    -        [-v]  [-noc]  [-pe]  [-h] 
    -
    -

    Description -

    The rxdebug command provides a trace of Rx activity for the -server or client machine named by the -servers argument. Rx -is AFS's proprietary remote procedure call (RPC) protocol, so this -command enables the issuer to check the status of communication between the -Cache Manager or an AFS server process (as specified with the -port -argument) on the machine and one or more processes on other machines. -

    Options -

    -

    -servers -
    Specifies the machine that is running the Cache Manager or server process -for which to trace Rx activity. Provide the machine's IP address -in dotted decimal format, its fully qualified host name (for example, -fs1.abc.com), or the shortest abbreviated form of its -host name that distinguishes it from other machines. Successful use of -an abbreviated form depends on the availability of a name resolution service -(such as the Domain Name Service or a local host table) at the time the -command is issued. -

    -port -
    Specifies the process for which to trace Rx activity. Omit this -argument to specify the File Server (fileserver process), or -provide one of the following values: -
    -

    7000 for the File Server (fileserver process) -

    7001 for the Cache Manager (specifically, its callback -interface) -

    7002 for the Protection Server (ptserver process) -

    7003 for the Volume Location (VL) Server (vlserver -process) -

    7004 for the Authentication Server (kaserver -process) -

    7005 for the Volume Server (volserver process) -

    7007 for the BOS Server (bosserver process) -

    7008 for the Update Server (upserver process) -

    7009 for the NFS/AFS Translator's rmtsysd -daemon) -

    7021 for the Backup Server (buserver process) -

    7025 through 65535 for the Backup Tape Coordinator -(butc process) that has the port offset number derived by -subtracting 7025 from this value -

    -

    -nodally -
    Produces output only for connections that are not in dally mode. -

    -allconnections -
    Produces output for all connections, even inactive ones. By -default, the output includes information only for connections that are active -or in dally mode when the rxdebug command is issued. -

    -rxstats -
    Produces detailed statistics about Rx history and performance (for -example, counts of the number of packets of various types the process has read -and sent, calculations of average and minimum roundtrip time, and so -on). -

    -onlyserver -
    Produces output only for connections in which the process designated by -the -port argument is acting as the server. -

    -onlyclient -
    Produces output only for connections in which the process designated by -the -port argument is acting as the client. -

    -onlyport -
    Produces output only for connections between the process designated by the --port argument and the specified port on any another -machine. Use the same port identifiers as for the -port -argument. -

    -onlyhost -
    Produces output only for connections between the process designated by the --port argument and any process on the specified machine. To -identify the machine, use the same notation as for the -servers -argument. -

    -onlyauth -
    Produces output only for connections that are using the specified -authentication level. Provide one of the following values: -
      -

    • auth for connections at authentication level -rxkad_auth -

    • clear for connections at authentication level -rxkad_clear -

    • crypt for connections at authentication level -rxkad_crypt -

    • none for unauthenticated connections (equivalents are -null, noauth, and unauth) -
    -

    -version -
    Reports the AFS build level of the binary file for the process designated -by the -port argument (or of the kernel extensions file for port -7001, the Cache Manager's callback interface). Any other options -combined with this one are ignored. -

    -noconns -
    Produces only the standard statistics that begin the output produced by -every option (other than -version), without reporting on any -connections. Any other options combined with this one are -ignored. -

    -peers -
    Outputs information from the peer structure maintained for each -port on another machine to which the process designated by the --port argument has a connection. There is information about -roundtrip time and numbers of packets sent and received, for example. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If any options other than -version or -help are -provided, the output written to the standard output stream begins with basic -statistics about packet usage and availability, how many calls are waiting for -a thread, how many threads are free, and so on (this is the only information -provided by the -noconns flag). Adding other options -produces additional information as described in the preceding -Options section of this reference page. The output is -intended for debugging purposes and is meaningful to someone familiar with the -implementation of Rx. -

    Privilege Required -

    None. -

    Related Information -

    afsd -

    bosserver -

    buserver -

    butc -

    fileserver -

    kaserver -

    ptserver -

    upclient -

    upserver -

    vlserver -

    volserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf232.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf232.htm deleted file mode 100755 index 2b98a7c05..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf232.htm +++ /dev/null @@ -1,265 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    salvager

    - - - - -

    Purpose -

    Initializes the Salvager component of the fs process -

    Synopsis -

    salvager [initcmd]  [-partition <Name of partition to salvage>] 
    -         [-volumeid <Volume Id to salvage>]  [-debug]  
    -         [-nowrite]  [-inodes]  [-force]  [-oktozap]  
    -         [-rootinodes]  [-salvagedirs]  [-blockreads]  
    -         [-parallel <# of max parallel partition salvaging>]
    -         [-tmpdir <Name of dir to place tmp files>]  
    -         [-showlog]  [-showsuid]  [-showmounts] 
    -         [-orphans <ignore | remove | attach>] [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The salvager command initializes the Salvager component of the -fs process. In the conventional configuration, its binary -file is located in the /usr/afs/bin directory on a file server -machine. -

    The Salvager restores internal consistency to corrupted read/write volumes -on the local file server machine where possible. For read-only or -backup volumes, it inspects only the volume header: -

      -

    • If the volume header is corrupted, the Salvager removes the volume -completely and records the removal in its log file, -/usr/afs/logs/SalvageLog. Issue the vos release -or vos backup command to create the read-only or backup volume -again. -

    • If the volume header is intact, the Salvager skips the volume (does not -check for corruption in the contents). However, if the File Server -notices corruption as it initializes, it sometimes refuses to attach the -volume or bring it online. In this case, it is simplest to remove the -volume by issuing the vos remove or vos zap -command. Then issue the vos release or vos backup -command to create it again. -
    -

    Unlike other server process initialization commands, the -salvager command is designed to be issued at the command shell -prompt, as well as being placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. It is also possible to invoke the Salvager remotely by issuing -the bos salvage command. -

    Combine the command's options as indicated to salvage different -numbers of read/write volumes: -

      -

    • To salvage all volumes on the file server machine, provide no -arguments. No volumes on the machine are accessible to Cache Managers -during the salvage, because the BOS Server stops the File Server and Volume -Server processes while the Salvager runs. -

    • To salvage all of the volumes on one partition, provide the --partition argument. As for a salvage of all volumes on the -machine, no volumes on the machine are accessible to Cache Managers during the -salvage operation. -

    • To salvage only one volume, combine the -partition and --volumeid arguments. Only that volume is inaccessible to -Cache Managers, because the BOS Server does not shutdown the File Server and -Volume Server processes. -
    -

    The Salvager normally salvages only those read/write volumes that are -marked as having been active when a crash occurred. To have it salvage -all relevant read/write volumes, add the -force flag. -

    The Salvager normally creates new inodes as it repairs damage. If -the partition is so full that there is no room for new inodes, use the --nowrite argument to bringing undamaged volumes online without -attempting to salvage damaged volumes. Then use the vos move -command to move one or more of the undamaged volumes to other partitions, -freeing up the space that the Salvager needs to create new inodes. -

    By default, multiple Salvager subprocesses run in parallel: one for -each partition up to four, and four subprocesses for four or more -partitions. To increase or decrease the number of subprocesses running -in parallel, provide a positive integer value for the -parallel -argument. -

    If there is more than one server partition on a physical disk, the Salvager -by default salvages them serially to avoid the inefficiency of constantly -moving the disk head from one partition to another. However, this -strategy is often not ideal if the partitions are configured as logical -volumes that span multiple disks. To force the Salvager to salvage -logical volumes in parallel, provide the string all as the value -for the -parallel argument. Provide a positive integer to -specify the number of subprocesses to run in parallel (for example, --parallel 5all for five subprocesses), or omit the integer to run -up to four subprocesses, depending on the number of logical volumes being -salvaged. -

    The Salvager creates temporary files as it runs, by default writing them to -the partition it is salvaging. The number of files can be quite large, -and if the partition is too full to accommodate them, the Salvager terminates -without completing the salvage operation (it always removes the temporary -files before exiting). Other Salvager subprocesses running at the same -time continue until they finish salvaging all other partitions where there is -enough disk space for temporary files. To complete the interrupted -salvage, reissue the command against the appropriate partitions, adding the --tmpdir argument to redirect the temporary files to a local disk -directory that has enough space. -

    The -orphans argument controls how the Salvager handles orphaned -files and directories that it finds on server partitions it is -salvaging. An orphaned element is completely inaccessible -because it is not referenced by the vnode of any directory that can act as its -parent (is higher in the filespace). Orphaned objects occupy space on -the server partition, but do not count against the volume's quota. -

    To generate a list of all mount points that reside in one or more volumes, -rather than actually salvaging them, include the -showmounts -flag. -

    Options -

    -

    initcmd -
    Accommodates the command's use of the AFS command parser, and is -optional. -

    -partition -
    Specifies the name of the partition to salvage. Specify the full -partition name using the form /vicepx or -/vicepxx. Omit this argument to salvage every -partition on the file server machine. -

    -volumeid -
    Specifies the volume ID of a specific read/write volume to salvage. -The -partition argument must be provided along with this one and -specify the volume's actual site. -

    -debug -
    Allows only one Salvager subprocess to run at a time, regardless of the -setting of the -parallel option. Include it when running the -Salvager in a debugger to make the trace easier to interpret. -

    -nowrite -
    Brings all undamaged volumes online without attempting to salvage any -damaged volumes. -

    -inodes -
    Records in the /usr/afs/logs/SalvageLog file a list of all AFS -inodes that the Salvager modified. -

    -force -
    Inspects all volumes for corruption, not just those that are marked as -having been active when a crash occurred. -

    -oktozap -
    Removes a volume that is so damaged that even issuing the vos -zap command with the -force flag is ineffective. Use -this argument only in consultation with AFS Development or Product -Support. Combine it with the -partition and --volumeid arguments to identify the volume to remove. -

    -rootinodes -
    Records in the /usr/afs/logs/SalvageLog file a list of all AFS -inodes owned by the local superuser root. -

    -salvagedirs -
    Salvages entire directory structures, even if they do not appear to be -damaged. By default, the Salvager salvages a directory only if it is -flagged as corrupted. -

    -blockreads -
    Forces the Salvager to read a partition one disk block (512 bytes) at a -time and to skip any blocks that are too badly damaged to be salvaged. -This allows it to salvage as many volumes as possible. By default, the -Salvager reads large disk blocks, which can cause it to exit prematurely if it -encounters disk errors. Use this flag if the partition to be salvaged -has disk errors. -

    -parallel -
    Specifies the maximum number of Salvager subprocesses to run in -parallel. Provide one of three values: -
      -

    • An integer from the range 1 to 32. A value of -1 means that a single Salvager process salvages the partitions -sequentially. -

    • The string all to run up to four Salvager subprocesses in -parallel on partitions formatted as logical volumes that span multiple -physical disks. Use this value only with such logical volumes. -

    • The string all followed immediately (with no intervening space) -by an integer from the range 1 to 32, to run the -specified number of Salvager subprocesses in parallel on partitions formatted -as logical volumes. Use this value only with such logical -volumes. -
    -

    The BOS Server never starts more Salvager subprocesses than there are -partitions, and always starts only one process to salvage a single -volume. If this argument is omitted, up to four Salvager subprocesses -run in parallel. -

    -tmpdir -
    Names a local disk directory in which the Salvager places the temporary -files it creates during a salvage operation, instead of writing them to the -partition being salvaged (the default). If the Salvager cannot write to -the specified directory, it attempts to write to the partition being -salvaged. -

    -showlog -
    Displays on the standard output stream all log data that is being written -to the /usr/afs/logs/SalvageLog file. -

    -showsuid -
    Displays a list of the pathnames for all files that have the setuid or -setgid mode bit set. -

    -showmounts -
    Records in the /usr/afs/logs/SalvageLog file all mount points -found in each volume. The Salvager does not repair corruption in the -volumes, if any exists. -

    -orphans -
    Controls how the Salvager handles orphaned files and directories. -Choose one of the following three values: -
    -

    ignore -
    Leaves the orphaned objects on the disk, but prints a message to the -/usr/afs/logs/SalvageLog file reporting how many orphans were found -and the approximate number of kilobytes they are consuming. This is the -default if the -orphans argument is omitted. -

    remove -
    Removes the orphaned objects, and prints a message to the -/usr/afs/logs/SalvageLog file reporting how many orphans were -removed and the approximate number of kilobytes they were consuming. -

    attach -
    Attaches the orphaned objects by creating a reference to them in the vnode -of the volume's root directory. Since each object's actual -name is now lost, the Salvager assigns each one a name of the following -form: -
    -

    _ _ORPHANFILE_ _.index for files -

    _ _ORPHANDIR_ _.index for directories -

    -

    -

    where index is a two-digit number that uniquely identifies each -object. The orphans are charged against the volume's quota and -appear in the output of the ls command issued against the -volume's root directory. -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command instructs the Salvager to attempt to salvage the -volume with volume ID 258347486 on /vicepg on the local -machine. -

       % /usr/afs/bin/salvager -partition /vicepg -volumeid 258347486
    -   
    -
    -

    Privilege Required -

    To issue the command at the shell prompt, the issuer must be logged in as -the local superuser root. -

    Related Information -

    BosConfig -

    SalvageLog -

    bos create -

    bos getlog -

    bos salvage -

    vos move -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf233.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf233.htm deleted file mode 100755 index caa149f6e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf233.htm +++ /dev/null @@ -1,283 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    scout

    - - - - - - - - - - -

    Purpose -

    Monitors the File Server process -

    Synopsis -

    scout [initcmd]  -server <FileServer name(s) to monitor>+
    -      [-basename <base server name>]  
    -      [-frequency <poll frequency, in seconds>]  [-host]  
    -      [-attention <specify attention (highlighting) level>+]
    -      [-debug <turn debugging output on to the named file>]  [-help]
    -    
    -scout [i]  -s <FileServer name(s) to monitor>+  
    -      [-b <base server name>] [-f <poll frequency, in seconds>] 
    -      [-ho]  [-a <specify attention (highlighting) level>+]
    -      [-d <turn debugging output on to the named file>]  [-he]
    -
    -

    Description -

    The scout command displays statistics gathered from the File -Server process running on each machine specified with the -server -argument. The Output section explains the meaning of the -statistics and describes how they appear in the command shell, which is -preferably a window managed by a window manager program. -

    Cautions -

    The scout program must be able to access the curses -graphics package, which it uses to display statistics. Most UNIX -distributions include curses as a standard utility. -

    Both dumb terminals and windowing systems that emulate terminals can -display the scout program's statistics. The display -makes use of reverse video and cursor addressing, so the display environment -must support those features for it to look its best (most windowing systems -do, most dumb terminals do not). Also, set the TERM environment -variable to the correct terminal type, or one with characteristics similar to -the actual ones. For machines running the AIX operating system, the -recommended setting for TERM is vt100, as long as the terminal is -similar to that. For other operating systems, the wider range of -acceptable values includes xterm, xterms, -vt100, vt200, and wyse85. -

    Options -

    -

    initcmd -
    Accommodates the command's use of the AFS command parser, and is -optional. -

    -server -
    Specifies each file server machine running a File Server process to -monitor. Provide each machine's fully qualified hostname unless -the -basename argument is used. In that case, specify only -the unique initial part of each machine name, omitting the domain name suffix -(the basename) common to all the names. It is also acceptable to use -the shortest abbreviated form of a host name that distinguishes it from other -machines, but successful resolution depends on the availability of a name -resolution service (such as the Domain Name Service or a local host table) at -the time the command is issued. -

    -basename -
    Specifies the basename (domain name) suffix common to all of the file -server machine names specified with the -server argument, and is -automatically appended to them. This argument is normally the name of -the cell to which the machines belong. Do not include the period that -separates this suffix from the distinguishing part of each file server machine -name, but do include any periods that occur within the suffix itself. -For example, in the ABC Corporation cell, the proper value is -abc.com rather than -.abc.com. -

    -frequency -
    Indicates how often to probe the File Server processes. Specify a -number of seconds greater than 0 (zero). The default is 60 -seconds. -

    -host -
    Displays the name of the machine that is running the scout -program, in the banner line of the display screen. -

    -attention -
    Defines a list of entries, each of which pairs a statistic and a threshold -value. When the value of the statistic exceeds the indicated threshold -value, it is highlighted (in reverse video) in the display. List the -pairs in any order. The acceptable values are the following: -
      -

    • conn connections. Indicates the number of open -connections to client processes at which to highlight the statistic. -The statistic returns to regular display when the value goes back below the -threshold. There is no default threshold. -

      An example of an acceptable value is conn 300. -

    • disk, which takes one of two types of values: -
        -

      • disk blocks_free. Indicates the number of -remaining free kilobyte blocks at which to highlight the statistic. The -statistic returns to regular display when the value again exceeds the -threshold. There is no default threshold. -

        An example of an acceptable value is disk 5000. -

      • disk percent_full%. Indicates the -percentage of disk usage at which to highlight the statistic. The -statistic returns to regular display when the value goes back below the -threshold. The default threshold is 95%. Acceptable values are -the integers in the range from 0 to 99, followed by the -percent sign (%) to distinguish this type of value from the one -described just previously. -

        An example is disk 90%. -

      -

    • fetch fetch_RPCs. Indicates the cumulative -number of fetch RPCs from client processes at which to highlight the -statistic. The statistic does not return to regular display until the -File Server process restarts, at which time the value returns to zero. -There is no default threshold. -

      Example of a legal value: fetch 6000000 -

    • store store_RPCs. Indicates the cumulative -number of store RPCs from client processes at which to highlight the -statistic. The statistic does not return to regular display until the -File Server process restarts, at which time the value returns to zero. -There is no default threshold. -

      Example of an acceptable value: store 200000 -

    • ws active_client_machines. Indicates the number -of client machines with active open connections at which to highlight the -statistic. An active connection is defined as one over which the File -Server and client have communicated in the last 15 minutes. The -statistic returns to regular display when the value goes back below the -threshold. There is no default threshold. -

      Example of an acceptable value: ws 65 -

    -

    -debug -
    Specifies the pathname of the file into which to write a debugging -trace. Partial pathnames are interpreted relative to the current -working directory. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The scout program can display statistics either in a dedicated -window or on a plain screen if a windowing environment is not -available. For best results, the window or screen needs the ability to -print in reverse video. -

    The scout screen has three main parts: the banner line, -the statistics display region and the message/probe line. -

    The Banner Line -

    By default, the string Scout appears in the banner line at the -top of the window or screen. Two optional arguments place additional -information in the banner line: -

      -

    • The -host flag displays the name of the machine where the -scout program is running. As mentioned previously, this is -useful when running the scout program on several machines but -displaying the results on a single machine. -

      For example, when the -host flag is included and the -scout program is running on the machine -client1.abc.com, the banner line reads as -follows: -

         [client1.abc.com] Scout
      -   
      -
      -

    • The -basename argument displays the indicated basename on the -banner line. For example, including the argument -basename -abc.com argument results in the following banner line: -
         Scout for abc.com
      -   
      -
      -
    -

    The Statistics Display Region -

    In this region, which occupies the majority of the window, the -scout process displays the statistics gathered for each File Server -process. Each process appears on its own line. -

    The region is divided into six columns, labeled as indicated and displaying -the following information: - - -

      -

    • Conn: The first column displays the number of RPC -connections open between the File Server process and client machines. -This number equals or exceeds the number in the Ws column (see the -fourth entry below), because each user on the machine can have several -separate connections open at once, and one client machine can handle several -users. - -

    • Fetch: The second column displays the number of -fetch-type RPCs (fetch data, fetch access list, and fetch status) that client -machines have made to the File Server process since the latter started. -This number is reset to zero each time the File Server process -restarts. - -

    • Store: The third column displays the number of store-type -RPCs (store data, store access list, and store status) that client machines -have made to the File Server process since the latter started. This -number is reset to zero each time the File Server process restarts. - -

    • Ws: The fourth column displays the number of client -machines (Ws stands for workstations) that have communicated with -the File Server process within the last 15 minutes. Such machines are -termed active). This number is likely to be smaller than the -number in the first (Conn) column because a single client machine -can have several connections open to one File Server. - - - -

    • The fifth, unlabeled, column displays the name of the file server machine -on which the File Server process is running. Names of 12 characters or -less are displayed in full; longer names are truncated and an asterisk -(*) appears as the last character in the name. Using the --basename argument is a good way to avoid truncation, but only if -all machine names end in a common string. -

    • Disk attn: The sixth column displays the number of -available kilobyte blocks on each AFS disk partition on the file server -machine. - - - - The display for each partition has the following form: -
         x:free_blocks
      -   
      -
      -

      where x indicates the partition name. For example, -a:8949 specifies that the /vicepa -partition has 8,949 1-KB blocks free. Available space can be displayed -for up to 26 partitions. If the window is not wide enough for all -partition entries to appear on a single line, the scout process -automatically creates multiple lines, stacking the partition entries into -sub-columns within the sixth column. -

      The label on the Disk attn column indicates the -threshold value at which entries in the column become highlighted. By -default, the label is -

         Disk attn: > 95% used
      -   
      -
      -

      because by default the scout program highlights the entry for -any partition that is over 95% full. -

    -

    For all columns except the fifth (file server machine name), the optional --attention argument sets the value at which entries in the column -are highlighted to indicate that a certain value has been exceeded. -Only values in the fifth and Disk attn columns ever become -highlighted by default. -

    If the scout program is unable to access or otherwise obtain -information about a partition, it generates a message similar to the following -example: -

       Could not get information on server fs1.abc.com partition /vicepa
    -   
    -
    -

    The Message/Probe Line -

    The bottom line of the scout screen indicates how many times the -scout program has probed the File Server processes for -statistics. The statistics gathered in the latest probe appear in the -statistics display region. The -frequency argument overrides -the default probe frequency of 60 seconds. -

    Examples -

    See the chapter on monitoring tools in the AFS Administration -Guide, which illustrates the displays that result from different -combinations of options. -

    Privilege Required -

    None -

    Related Information -

    afsmonitor -

    fstrace -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf234.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf234.htm deleted file mode 100755 index 1c25d33ce..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf234.htm +++ /dev/null @@ -1,67 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    sys

    -

    Purpose - - - - - - - -

    Reports the CPU/operating system type -

    Synopsis -

    sys 
    -
    -

    Description -

    The sys command displays the string stored in kernel memory that -indicates the local machine's CPU/operating system (OS) type. The -Cache Manager substitutes the string for the @sys variable which can -occur in AFS pathnames; the AFS Quick Beginnings and AFS -Administration Guide explain how using @sys can simplify cell -configuration. -

    The command always reports the value for the local machine only. To -set a new value in kernel memory, use the fs sysname command, which -like this command can also be used to display the current value. -

    Output -

    The machine's system type appears as a text string: -

       system_type
    -   
    -
    -

    Examples -

    The following example shows the output produced on a Sun SPARCStation -running Solaris 5.7: -

       % sys
    -   sun4x_57
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    fs sysname -

    AFS Quick Beginnings -

    AFS Administration Guide -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf235.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf235.htm deleted file mode 100755 index 4c92ab9bc..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf235.htm +++ /dev/null @@ -1,124 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    tokens

    - - - - - - -

    Purpose -

    Displays the issuer's tokens -

    Synopsis -

    tokens [-help]
    -   
    -tokens [-h]
    -
    -

    Description -

    The tokens command displays all tokens (tickets) cached on the -local machine for the issuer. AFS server processes require that their -clients present a token as evidence that they have authenticated in the -server's local cell. -
    Note:The tokens.krb version of this command is intended for use -by sites that employ standard Kerberos authentication for their -clients. The tokens.krb command provides all of the -functionality of the tokens command. In addition, it -provides information on the Kerberos tickets stored in the file specified by -the KRBTKFILE environment variable (the /tmp/tktX file, -where X is the number of the user's PAG). -
    -

    Options -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output lists one token for each cell in which the user is -authenticated. The output indicates the -

      -

    • User's AFS UID, if it is available for display. -

    • Server for which the token is valid (normally, afs). -This includes a cell specification. -

    • Day and time the token expires. -
    -

    The output of the Kerberos version of this command, -tokens.krb, also reports the following about the Kerberos -ticket-granting ticket: the ticket owner, which Kerberos ticket-granting -service that issued the ticket (for example, -krbtgt.ABC.COM), and ticket's expiration -date. -

    The string --End of list-- appears at the end of the -output. If the user is not authenticated in any cell, this line is all -that appears. -

    Examples -

    The following example shows the output when the issuer is not authenticated -in any cell. -

       % tokens
    -   Tokens held by the Cache Manager:
    -   
    -      --End of list--
    -   
    -
    -

    The following example shows the output when the issuer is authenticated in -ABC Corporation cell, where he or she has AFS UID 1000. -

       % tokens
    -   Tokens held by the Cache Manager:
    -   
    -   User's (AFS ID 1000) tokens for afs@abc.com [Expires Jan 2 10:00]
    -      --End of list--
    -   
    -
    -

    The following example shows the output when the issuer is authenticated in -the ABC Corporation cell, the State University cell, and the XYZ Company -cell. The user has different AFS UIDs in the three cells. Tokens -for last cell are expired: -

       % tokens
    -   Tokens held by the Cache Manager:
    -      
    -   User's (AFS ID 1000) tokens for afs@abc.com [Expires Jan 3 10:00]
    -   User's (AFS ID 4286) tokens for afs@stateu.edu [Expires Jan 3 1:34]
    -   User's (AFS ID 22) tokens for afs@xyz.com [>>Expired<]
    -      --End of list--
    -   
    -
    -

    The following example shows the output when the issuer uses the -tokens.krb version of the command after authenticating in -the ABC Corporation cell using the klog.krb command. -

       % tokens.krb
    -   Tokens held by the Cache Manager:
    -      
    -   User's (AFS ID 1000) tokens for afs@abc.com [Expires Jan 31 00:09]
    -   User smiths tokens for krbtgt.ABC.COM@abc.com [Expires Jan 31 00:09]
    -      --End of list--
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    klog -

    unlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf236.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf236.htm deleted file mode 100755 index 3b8c8f799..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf236.htm +++ /dev/null @@ -1,54 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    translate_et

    - - - -

    Purpose -

    Translates numbered error codes into text messages -

    Synopsis -

    translate_et  <error number>+
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name in full. -

    Description -

    The translate_et command translates each specified error number -into a text message. -

    Options -

    -

    error number -
    Specifies each error number to translate. -
    -

    Examples -

    The following command translates the error numbers 1 and 4: -

       % translate_et 1 4
    -   1 ().1 = Not owner
    -   4 ().4 = Interrupted system call
    -   
    -
    -

    Privilege Required -

    None -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf237.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf237.htm deleted file mode 100755 index 17c4d2e1f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf237.htm +++ /dev/null @@ -1,325 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    udebug

    - - - -

    Purpose -

    Reports status of Ubik process associated with a database server process -

    Synopsis -

    udebug -servers  <server machine>  [-port <IP port>]  [-long]  [-help]
    -        
    -udebug -s  <server machine>  [-p <IP port>]  [-l]  [-h]
    -        
    -
    -

    Description -

    The udebug command displays the status of the lightweight Ubik -process for the database server process identified by the -port -argument that is running on the database server machine named by the --servers argument. The output identifies the machines where -peer database server processes are running, which of them is the -synchronization site (Ubik coordinator), and the status of the connections -between them. -

    Options -

    -

    -servers -
    Names the database server machine that is running the process for which to -display status information. Provide the machine's IP address in -dotted decimal format, its fully qualified host name (for example, -fs1.abc.com), or the shortest abbreviated form of its -host name that distinguishes it from other machines. Successful use of -an abbreviated form depends on the availability of a name resolution service -(such as the Domain Name Service or a local host table) at the time the -command is issued. -

    -port -
    Identifies the database server process for which to display status -information, either by its process name or port number. Provide one of -the following values. -
    -

    buserver or 7021 for the Backup Server -

    kaserver or 7004 for the Authentication Server -

    ptserver or 7002 for the Protection Server -

    vlserver or 7003 for the Volume Location Server -

    -

    -long -
    Reports additional information about each peer of the machine named by the --servers argument. The information appears by default if -that machine is the synchronization site. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    Several of the messages in the output provide basic status information -about the Ubik process on the machine specified by the -servers -argument, and the remaining messages are useful mostly for debugging -purposes. -

    To check basic Ubik status, issue the command for each database server -machine in turn. In the output for each, one of the following messages -appears in the top third of the output. -

       I am sync site . . . (#_sites servers)
    -   
    -   I am not sync site 
    -
    -

    For the synchronization site, the following message indicates that all -sites have the same version of the database, which implies that Ubik is -functioning correctly. See the following for a description of values -other than 1f. -

       Recovery state 1f
    -
    -

    For correct Ubik operation, the database server machine clocks must agree -on the time. The following messages, which are the second and third -lines in the output, report the current date and time according to the -database server machine's clock and the clock on the machine where the -udebug command is issued. -

       Host's IP_addr time is dbserver_date/time
    -   Local time is local_date/time (time differential skew secs)
    -
    -

    The skew is the difference between the database server machine -clock and the local clock. Its absolute value is not vital for Ubik -functioning, but a difference of more than a few seconds between the -skew values for the database server machines indicates that their -clocks are not synchronized and Ubik performance is possibly hampered. -

    Following is a description of all messages in the output. As noted, -it is useful mostly for debugging and most meaningful to someone who -understands Ubik's implementation. -

    The output begins with the following messages. The first message -reports the IP addresses that are configured with the operating system on the -machine specified by the -servers argument. As previously -noted, the second and third messages report the current date and time -according to the clocks on the database server machine and the machine where -the udebug command is issued, respectively. All subsequent -timestamps in the output are expressed in terms of the local clock rather than -the database server machine clock. -

       Host's addresses are: list_of_IP_addrs
    -   Host's IP_addr time is dbserver_date/time
    -   Local time is local_date/time (time differential skew secs)
    -
    -

    If the skew is more than about 10 seconds, the following message -appears. As noted, it does not necessarily indicate Ubik -malfunction: it denotes clock skew between the database server machine -and the local machine, rather than among the database server machines. -

       ****clock may be bad
    -
    -

    If the udebug command is issued during the coordinator election -process and voting has not yet begun, the following message appears -next. -

       Last yes vote not cast yet
    -
    -

    Otherwise, the output continues with the following messages. -

       Last yes vote for sync_IP_addr was last_vote secs ago (sync site); 
    -   Last vote started vote_start secs ago (at date/time)
    -   Local db version is db_version
    -
    -

    The first indicates which peer this Ubik process last voted for as -coordinator (it can vote for itself) and how long ago it sent the vote. -The second message indicates how long ago the Ubik coordinator requested -confirming votes from the secondary sites. Usually, the -last_vote and vote_start values are the same; a -difference between them can indicate clock skew or a slow network connection -between the two database server machines. A small difference is not -harmful. The third message reports the current version number -db_version of the database maintained by this Ubik process. It -has two fields separated by a period. The field before the period is -based on a timestamp that reflects when the database first changed after the -most recent coordinator election, and the field after the period indicates the -number of changes since the election. -

    The output continues with messages that differ depending on whether the -Ubik process is the coordinator or not. -

      -

    • If there is only one database server machine, it is always the coordinator -(synchronization site), as indicated by the following message. -
         I am sync site forever (1 server)
      -
      -

    • If there are multiple database sites, and the -servers argument -names the coordinator (synchronization site), the output continues with the -following two messages. -
         I am sync site until expiration secs from now (at date/time) (#_sites servers)
      -   Recovery state flags
      -
      -

      The first message reports how much longer the site remains coordinator even -if the next attempt to maintain quorum fails, and how many sites are -participating in the quorum. The flags field in the second -message is a hexadecimal number that indicates the current state of the -quorum. A value of 1f indicates complete database -synchronization, whereas a value of f means that the coordinator -has the correct database but cannot contact all secondary sites to determine -if they also have it. Lesser values are acceptable if the -udebug command is issued during coordinator election, but they -denote a problem if they persist. The individual flags have the -following meanings: -

      -

      0x1 -
      This machine is the coordinator -

      0x2 -
      The coordinator has determined which site has the database with the -highest version number -

      0x4 -
      The coordinator has a copy of the database with the highest version number -

      0x8 -
      The database's version number has been updated correctly -

      0x10 -
      All sites have the database with the highest version number -
      -

      If the udebug command is issued while the coordinator is writing -a change into the database, the following additional message appears. -

         I am currently managing write transaction identifier
      -
      -

    • If the -servers argument names a secondary site, the output -continues with the following messages. -
         I am not sync site
      -   Lowest host lowest_IP_addr was set low_time secs ago
      -   Sync host sync_IP_addr  was set sync_time secs ago
      -
      -

      The lowest_IP_addr is the lowest IP address of any peer from which -the Ubik process has received a message recently, whereas the -sync_IP_addr is the IP address of the current coordinator. If -they differ, the machine with the lowest IP address is not currently the -coordinator. The Ubik process continues voting for the current -coordinator as long as they remain in contact, which provides for maximum -stability. However, in the event of another coordinator election, this -Ubik process votes for the lowest_IP_addr site instead (assuming they -are in contact), because it has a bias to vote in elections for the site with -the lowest IP address. -

    -

    For both the synchronization and secondary sites, the output continues with -the following messages. The first message reports the version number of -the database at the synchronization site, which needs to match the -db_version reported by the preceding Local db version -message. The second message indicates how many VLDB records are -currently locked for any operation or for writing in particular. The -values are nonzero if the udebug command is issued while an -operation is in progress. -

         Sync site's db version is db_version
    -   locked locked pages, writes of them for write
    -
    -

    The following messages appear next only if there are any read or write -locks on database records: -

       There are read locks held
    -   There are write locks held
    -
    -

    Similarly, one or more of the following messages appear next only if there -are any read or write transactions in progress when the udebug -command is issued: -

       There is an active write transaction
    -   There is at least one active read transaction
    -   Transaction tid is tid
    -
    -

    If the machine named by the -servers argument is the -coordinator, the next message reports when the current coordinator last -updated the database. -

        Last time a new db version was labelled was:
    -            last_restart secs ago (at date/time)
    -
    -

    If the machine named by the -servers argument is the -coordinator, the output concludes with an entry for each secondary site that -is participating in the quorum, in the following format. -

       Server( IP_address ): (db db_version)
    -   last vote rcvd last_vote secs ago (at date/time),
    -   last beacon sent last_beacon secs ago (at date/time), last vote was { yes | no }
    -   dbcurrent={ 0 | 1 }, up={ 0 | 1 } beaconSince={ 0 | 1 }
    -
    -

    The first line reports the site's IP address and the version number of -the database it is maintaining. The last_vote field reports -how long ago the coordinator received a vote message from the Ubik process at -the site, and the last_beacon field how long ago the coordinator last -requested a vote message. If the udebug command is issued -during the coordinator election process and voting has not yet begun, the -following messages appear instead. -

       Last vote never rcvd
    -   Last beacon never sent
    -
    -

    On the final line of each entry, the fields have the following -meaning: -

      -

    • dbcurrent is 1 if the site has the database with the -highest version number, 0 if it does not -

    • up is 1 if the Ubik process at the site is -functioning correctly, 0 if it is not -

    • beaconSince is 1 if the site has responded to the -coordinator's last request for votes, 0 if it has not -
    -

    Including the -long flag produces peer entries even when the --servers argument names a secondary site, but in that case only the -IP_address field is guaranteed to be accurate. For example, -the value in the db_version field is usually 0.0, -because secondary sites do not poll their peers for this information. -The values in the last_vote and last_beacon fields indicate -when this site last received or requested a vote as coordinator; they -generally indicate the time of the last coordinator election. -

    Examples -

    This example checks the status of the Ubik process for the Volume Location -Server on the machine afs1, which is the synchronization -site. -

       % udebug afs1 vlserver
    -   Host's addresses are: 192.12.107.33 
    -   Host's 192.12.107.33 time is Wed Oct 27 09:49:50 1999
    -   Local time is Wed Oct 27 09:49:52 1999 (time differential 2 secs)
    -   Last yes vote for 192.12.107.33 was 1 secs ago (sync site); 
    -   Last vote started 1 secs ago (at Wed Oct 27 09:49:51 1999)
    -   Local db version is 940902602.674
    -   I am sync site until 58 secs from now (at Wed Oct 27 09:50:50 1999) (3 servers)
    -   Recovery state 1f
    -   Sync site's db version is 940902602.674
    -   0 locked pages, 0 of them for write
    -   Last time a new db version was labelled was:
    -            129588 secs ago (at Mon Oct 25 21:50:04 1999)
    -   
    -   Server( 192.12.107.35 ): (db 940902602.674)
    -       last vote rcvd 2 secs ago (at Wed Oct 27 09:49:50 1999),
    -       last beacon sent 1 secs ago (at Wed Oct 27 09:49:51 1999), last vote was yes
    -       dbcurrent=1, up=1 beaconSince=1
    -   
    -   Server( 192.12.107.34 ): (db 940902602.674)
    -       last vote rcvd 2 secs ago (at Wed Oct 27 09:49:50 1999),
    -       last beacon sent 1 secs ago (at Wed Oct 27 09:49:51 1999), last vote was yes
    -       dbcurrent=1, up=1 beaconSince=1
    -
    -

    This example checks the status of the Authentication Server on the machine -with IP address 192.12.107.34, which is a secondary -site. The local clock is about 4 minutes behind the database server -machine's clock. -

       % udebug 192.12.107.34 7004
    -   Host's addresses are: 192.12.107.34
    -   Host's 192.12.107.34 time is Wed Oct 27 09:54:15 1999
    -   Local time is Wed Oct 27 09:50:08 1999 (time differential -247 secs)
    -   ****clock may be bad
    -   Last yes vote for 192.12.107.33 was 6 secs ago (sync site); 
    -   Last vote started 6 secs ago (at Wed Oct 27 09:50:02 1999)
    -   Local db version is 940906574.25
    -   I am not sync site
    -   Lowest host 192.12.107.33 was set 6 secs ago
    -   Sync host 192.12.107.33 was set 6 secs ago
    -   Sync site's db version is 940906574.25
    -   0 locked pages, 0 of them for write
    -
    -

    Privilege Required -

    Related Information -

    buserver -

    kaserver -

    ptserver -

    vlserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf238.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf238.htm deleted file mode 100755 index 7ceb4694a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf238.htm +++ /dev/null @@ -1,80 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    unlog

    - - - - - - -

    Purpose -

    Discards all of the issuer's tokens -

    Synopsis -

    unlog [-cell <cell name>+]  [-help]
    -   
    -unlog [-c <cell name>+]  [-h]
    -
    -

    Description -

    The unlog command by default discards all tokens that the issuer -currently holds. To discard tokens for certain cells only, name them -with the -cell argument. -

    Since a token pertains to one client machine only, destroying tokens on one -machine has no effect on tokens on another machine. -

    Cautions -

    Specifying one or more cell names can cause a brief authentication outage -during which the issuer has no valid tokens in any cell. This is -because the command actually discards all tokens and then restores the ones -for cells not named by the -cell argument. The outage can -sometimes interrupt the operation of jobs that require authentication. -

    Options -

    -

    -cell -
    Specifies each cell for to discard the token. If this argument is -omitted, the Cache Manager discards all tokens. Provide the fully -qualified domain name, or a shortened form, in which case successful -resolution depends on the availability of a name resolution service (such as -the Domain Name Service or a local host table) at the time the command is -issued. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command discards all tokens. -

       % unlog
    -   
    -
    -

    The following command discards only the tokens for the -abc.com and stateu.edu cells. -

       % unlog -cell abc.com stateu
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    klog -

    tokens -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf239.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf239.htm deleted file mode 100755 index 04680e028..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf239.htm +++ /dev/null @@ -1,113 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    up

    - - - -

    Purpose -

    Recursively copies the contents of a source directory to a destination -directory. -

    Synopsis -

    up [-v]  [-1]  [-f]  [-r]  [-x]  <source directory>  <destination directory>
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The up command recursively copies the files and subdirectories -in a specified source directory to a specified destination directory. -The command interpreter changes the destination directory and the files and -subdirectories in it in the following ways: -

      -

    • It copies the source directory's access control list (ACL) to the -destination directory and its subdirectories, overwriting any existing -ACLs. -

    • If the issuer is logged on as the local superuser root and has -AFS tokens as a member of the group system:administrators, -then the source directory's owner (as reported by the ls -ld -command) becomes the owner of the destination directory and all files and -subdirectories in it. Otherwise, the issuer's user name is -recorded as the owner. -

    • If a file or directory exists in both the source and destination -directories, the source version overwrites the destination version. The -overwrite operation fails if the first (user) w (write) -mode bit is turned off on the version in the destination directory, unless the --f flag is provided. -

    • The modification timestamp on a file (as displayed by the ls -l -command) in the source directory overwrites the timestamp on a file of the -same name in the destination directory, but the timestamp on an existing -subdirectory in the destination directory remains unchanged. If the -command creates a new subdirectory in the destination directory, the new -subdirectory's timestamp is set to the time of the copy operation, rather -than to the timestamp that the subdirectory has in the source -directory. -
    -

    The up command is idempotent, meaning that if its execution is -interrupted by a network, server machine, or process outage, then a subsequent -reissue of the same command continues from the interruption point, rather than -starting over at the beginning. This saves time and reduces network -traffic in comparison to the UNIX commands that provide similar -functionality. -

    The up command returns a status code of 0 (zero) only -if it succeeds. Otherwise, it returns a status code of 1 -(one). -

    Options -

    -

    -v -
    Prints a detailed trace to the standard output stream as the command -runs. -

    -1 -
    Copies only the files in the top level source directory to the destination -directory, rather than copying recursively through subdirectories. The -source directory's ACL still overwrites the destination -directory's. (This is the number one, not the letter -l.) -

    -f -
    Overwrites existing directories, subdirectories, and files even if the -first (user) w (write) mode bit is turned off on the -version in the destination directory. -

    -r -
    Creates a backup copy of all files overwritten in the destination -directory and its subdirectories, by adding a .old extension -to each filename. -

    -x -
    Sets the modification timestamp on each file to the time of the copying -operation. -

    source directory -
    Names the directory to copy recursively. -

    destination directory -
    Names the directory to which to copy. It does not have to exist -already. -
    -

    Examples -

    The following command copies the contents of the directory dir1 to -directory dir2: -

       % up dir1 dir2
    -   
    -
    -

    Privilege Required -

    The issuer must have the a (administer) permission on -the ACL of both the source and destination directories. -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf240.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf240.htm deleted file mode 100755 index b80d972f7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf240.htm +++ /dev/null @@ -1,161 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    upclient

    - - - - - - -

    Purpose -

    Initializes the client portion of the Update Server -

    Synopsis -

    upclient <hostname>  [-crypt]  [-clear]  [-t <retry time>]
    -         [-verbose]*  <dir>+  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The upclient command initializes the client portion of the -Update Server. In the conventional configuration, its binary file is -located in the /usr/afs/bin directory on a file server -machine. -

    The upclient command is not normally issued at the command shell -prompt but rather placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a database server machine as the local superuser -root. -

    The upclient process periodically checks that all files in each -local directory named by the dir argument match the files in the -corresponding directory on the source machine named by the -hostnameargument. If a file does not match, the -upclient process requests the source copy from the -upserver process running on the source machine. -

    By default, the upclient process in the United States edition of -AFS requests that the upserver process encrypt the data before -transferring it, whereas in the international edition it requests unencrypted -transfer. If using the United States edition, use the -clear -flag to request unencrypted transfer if appropriate. (The --crypt flag explicitly sets the default in the United States -edition, and is not available in the international edition.) -

    In the conventional configuration, separate instances of the -upclient process request data from the /usr/afs/bin and -/usr/afs/etc directories, except on machines for which the system -control machine is also the binary distribution machine for the machine's -system type. The conventional names for the separate instances are -upclientbin and upclientetc respectively. -

    The upclient and upserver processes always mutually -authenticate, whether or not the data they pass is encrypted; they use -the key with the highest key version number in the -/usr/afs/etc/KeyFile file to construct a server ticket for mutual -authentication. -

    Cautions -

    Do not use the Update Server to distribute the contents of the -/usr/afs/etc directory if using the international edition of -AFS. The contents of this directory are sensitive and the international -edition of AFS does not include the encryption routines necessary for -encrypting files before transfer across the network. -

    Options -

    -

    hostname -
    Names either the cell's system control machine (if the requested -directory is /usr/afs/etc), or the binary distribution machine for -the local machine's CPU and operating system type (if the requested -directory is /usr/afs/bin). -

    -crypt -
    Requests the transfer of data from the upserver process in -encrypted form. With the United States edition of AFS, use this flag to -set the default explicitly. Provide this flag or the -crypt -flag, but not both. -
    Note:This flag is not available in the international edition of AFS. -
    -

    -clear -
    Requests transfer of data from the upserver process in -unencrypted form. Use this flag to change from the default for the -United States edition of AFS. Provide this flag or the --crypt flag, but not both. -

    -t -
    Specifies how often to check for changes in each specified directory, as a -number of seconds. If this argument is omitted, the default is 300 (5 -minutes). This argument determines the maximum amount of time it takes -for a change made on the source machine to propagate to this machine. -

    -verbose -
    Writes a trace of the upclient process's operations on the -standard output stream, which usually corresponds to the machine -console. Provide one, two, or three instances of the flag; each -additional instance generates increasingly numerous and detailed -messages. -

    dir -
    Names each directory to check for modified files. The conventional -choices are the following: -
      -

    • /usr/afs/bin, in which case the recommended name for the -process (assigned with the -instance argument to the bos -create command) is upclientbin. The hostname -is the binary distribution machine for the local machine's system -type. Use the -clear flag be used for the -/usr/afs/bin directory, since binaries are not particularly -sensitive and encrypting them can take a long time. -

    • /usr/afs/etc, in which case the recommended name for the -process (assigned with the -instance argument to the bos -create command) is upclientetc. The hostname -is the cell's system control machine. Use the -crypt -flag for the /usr/afs/etc directory, since it contains the -KeyFile file and other data vital to cell security. -

      As a reminder, do not use the Update Server to transfer the contents of the -/usr/afs/etc directory if using the international edition of -AFS. -

    -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following bos create command creates an -upclientbin process on the machine -fs4.abc.com that refers to the machine -fs1.abc.com as the source for the -/usr/afs/bin directory (thus fs1.abc.com -is the binary distribution machine for machines of -fs4.abc.com's type). The files in the -/usr/afs/bin directory are distributed every 120 seconds. -The command requests transfer in unencrypted form. -

       % bos create  -server fs4.abc.com -instance upclientbin -type simple   \
    -                 -cmd "/usr/afs/bin/upclient fs1.abc.com -clear  \
    -                 -t 120 /usr/afs/bin"
    -   
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BosConfig -

    bos create -

    upserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf241.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf241.htm deleted file mode 100755 index 7157acfb8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf241.htm +++ /dev/null @@ -1,129 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    upserver

    - - - - - - -

    Purpose -

    Initializes the server portion of the Update Server -

    Synopsis -

    upserver [<directory>+]  [-crypt <directory>+]  [-clear <directory>+]
    -         [-auth <directory>+]  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The upserver command initializes the server portion of the -Update Server (the upserver process). In the conventional -configuration, its binary file is located in the /usr/afs/bin -directory on a file server machine. -

    The upserver command is not normally issued at the command shell -prompt but rather placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a database server machine as the local superuser -root. -

    The upserver command specifies which of the directories on the -local disk are eligible for distribution in response to requests from the -client portion of the Update Server (the upclient process) running -on other machines. If no directories are specified, the -upserver process distributes the contents of any directory on its -local disk. -

    The upserver process can distribute a directory's contents -in encrypted or unencrypted form. By default, it does not use -encryption unless an upclient process requests it (this default is -equivalent to setting the -clear flag). When the --crypt flag is provided, the upserver process only -fulfills requests for encrypted transfer. -

    For the United States edition of AFS, using the -crypt flag -guarantees that the upserver process transfers a directory's -contents only in encrypted form. For the international edition, using -the -crypt flag completely blocks data transfer, because the -international edition of the upclient process cannot request -encrypted transfer (the upclient initialization command does not -include the -crypt flag). -

    The upclient and upserver processes always mutually -authenticate, whether or not the data they pass is encrypted; they use -the key with the highest key version number in the -/usr/afs/etc/KeyFile file to construct a server ticket for mutual -authentication. -

    Cautions -

    Do not use the Update Server to distribute the contents of the -/usr/afs/etc directory if using the international edition of -AFS. The contents of this directory are sensitive and the international -edition of AFS does not include the encryption routines necessary for -encrypting files before transfer across the network. -

    Options -

    -

    directory -
    Names each directory to distribute in unencrypted form (because they -appear before the first -crypt or -clear flag on the -command line). If this argument is omitted, all directories on the -machine's local disk are eligible for distribution. -

    -crypt -
    Precedes a list of one or more directories that the upserver -process distributes only in encrypted form. -

    -clear -
    Precedes a list of one or more directories that the upserver -process distributes in unencrypted form unless the upclient process -requests them in encrypted form. Use this argument only if a list of -directories headed by the -crypt flag precedes it on the command -line. -

    -auth -
    Precedes a list of one or more directories which the upserver -process distributes using a form of encryption that is intermediate in -complexity and security between the unencrypted and encrypted levels set by -the -clear and -crypt arguments. Do not use this -argument, because the upclient process does not have a -corresponding argument that it can use to request data transfer at this -level. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example bos create command defines and starts an -upserver process on the host machine -fs1.abc.com. The last parameter (enclosed in -quotes) instructs the upserver process to distribute the contents -of the /usr/afs/bin directory in unencrypted form and the contents -of the /usr/afs/etc directory in encrypted form. -

       % bos create  -server fs1.abc.com -instance upserver -type simple   \
    -                 -cmd "/usr/afs/bin/upserver /usr/afs/bin -crypt /usr/afs/etc"
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BosConfig -

    bos create -

    upclient -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf242.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf242.htm deleted file mode 100755 index 6ceb09c84..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf242.htm +++ /dev/null @@ -1,110 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss

    - - - - - - - - - -

    Purpose -

    Introduction to the uss command suite -

    Description -

    The commands in the uss command suite help administrators to -create AFS user accounts more easily and efficiently. If uss -commands are not used, creating an account requires issuing at least six -separate commands to five different AFS servers. -

    There are three main commands in the suite: -

      -

    • The uss add command creates a single complete user account, -based on command line arguments and instructions in a template file. -

    • The uss bulk command creates multiple complete accounts at -once, based on command line arguments, instructions in a template file and a -bulk input file. -

    • the uss delete command removes most parts of a user -account. -
    -

    To obtain help, issue the uss apropos and uss help -commands. -

    Options -

    The following arguments and flags are available on many commands in the -uss suite. The reference page for each command also lists -them, but they are described here in greater detail. -

    -

    -admin <administrator to authenticate> -
    Specifies the AFS user name under which to establish a connection to the -AFS server processes that administer the various parts of a user -account. If it is omitted, the connection is established under the -issuer's effective user ID (his or her identity in the local file -system). Even when this argument is included, UNIX commands that run -during the uss operation (for instance, the UNIX -/etc/chown command) run under the effective user ID. -

    -cell <cell name> -
    Names the cell in which to run the command. It is acceptable to -abbreviate the cell name to the shortest form that distinguishes it from the -other entries in the /usr/vice/etc/CellServDB file on the local -machine. If the -cell argument is omitted, the command -interpreter determines the name of the local cell by reading the following in -order: -
      -

    1. The value of the AFSCELL environment variable -

    2. The local /usr/vice/etc/ThisCell file -
    -

    -dryrun -
    Reports actions that the command interpreter needs to perform when -executing the uss operation, without actually performing -them. Include this flag to verify that the command produces the desired -account configuration. Combine it with the -verbose flag to -yield even more detailed information. Note that the output does not -necessarily reveal all possible problems that can prevent successful execution -of the command, especially those that result from transient server or network -outages. -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -

    -skipauth -
    Bypasses mutual authentication with the AFS Authentication Server, -allowing a site that uses Kerberos instead of the AFS Authentication Server to -substitute that form of authentication. -
    -

    Privilege Required -

    The issuer of a uss command must have all the rights required -for performing the equivalent actions individually. See each -uss command's reference page. -

    Related Information -

    uss Bulk Input File -

    uss Template File -

    uss add -

    uss apropos -

    uss bulk -

    uss delete -

    uss help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf243.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf243.htm deleted file mode 100755 index 772fbe0e2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf243.htm +++ /dev/null @@ -1,291 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss add

    - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Creates a user account -

    Synopsis -

    uss add -user <login name>  [-realname <full name in quotes>]
    -        [-pass <initial password>]  
    -        [-pwexpires <password expires in [0..254] days (0 => never)>]
    -        [-server <FileServer for home volume>] 
    -        [-partition <FileServer's disk partition for home volume>] 
    -        [-mount <home directory mount point>]  
    -        [-uid <uid to assign the user>]
    -        [-template <pathname of template file>] 
    -        [-verbose]  [-var <auxiliary argument pairs (Num val)>+] 
    -        [-cell <cell name>]  [-admin <administrator to authenticate>]
    -        [-dryrun]  [-skipauth]  [-overwrite]  [-help]
    -   
    -uss ad -us <login name>  [-r <full name in quotes>]   
    -       [-pas <initial password>] 
    -       [-pw <password expires in [0..254] days (0 => never)>]  
    -       [-se <FileServer for home volume>] 
    -       [-par <FileServer's disk partition for home volume>] 
    -       [-m <home directory mount point>]  [-ui <uid to assign the user>]
    -       [-t <pathname of template file>]  [-ve]  
    -       [-va <auxiliary argument pairs (Num val)>+]  [-c <cell name>]
    -       [-a <administrator to authenticate>]  [-d]  [-sk]  [-o]  [-h]
    -
    -

    Description -

    The uss add command creates entries in the Protection Database -and Authentication Database for the user name specified by the --user argument. By default, the Protection Server -automatically allocates an AFS user ID (UID) for the new user; to specify -an alternate AFS UID, include the -uid argument. If a -password is provided with the -pass argument, it is stored as the -user's password in the Authentication Database after conversion into a -form suitable for use as an encryption key. Otherwise, the string -changeme is assigned as the user's initial password. -

    The other results of the command depend on which instructions and which of -a defined set of variables appear in the template file specified with the --template argument. Many of the command's arguments -supply a value for one of the defined variables, and failure to provide an -argument when the corresponding variable appears in the template file halts -the account creation process at the point where the command interpreter first -encounters the variable in the template file. -

    To create multiple accounts with a single command, use the uss -bulk command. To delete accounts with a single command, use the -uss delete command. -

    Options -

    -

    -user -
    Names the user's Authentication Database and Protection Database -entries. It can include up to eight alphanumeric characters, but not -any of the following characters: : (colon), -@ (at-sign), . (period), space, or -newline. Because it becomes the username (the name under which a user -logs in), it is best not to include shell metacharacters and to obey the -restrictions that many operating systems impose on usernames (usually, to -contain no more than eight lowercase letters). -

    Corresponding variable in the template file: $USER. -

    -realname -
    Specifies the user's full name. If it contains spaces or -punctuation, surround it with double quotes. If not provided, it -defaults to the user name provided with the -user argument. -

    Corresponding variable in the template file: $NAME. Many -operating systems include a field for the full name in a user's entry in -the local password file (/etc/passwd or equivalent), and this -variable can be used to pass a value to be used in that field. -

    -pass -
    Specifies the user's initial password. Although the AFS -commands that handle passwords accept strings of virtually unlimited length, -it is best to use a password of eight characters or less, which is the maximum -length that many applications and utilities accept. If not provided, -this argument defaults to the string changeme. -

    Corresponding variable in the template file: none. -

    -pwexpires -
    Sets the number of days after a user's password is changed that it -remains valid. Provide an integer from the range 1 through -254 to specify the number of days until expiration, or the value -0 to indicate that the password never expires (the default). -

    When the password becomes invalid (expires), the user is unable to -authenticate, but has 30 more days in which to issue the kpasswd -command to change the password (after that, only an administrator can change -it). -

    Corresponding variable in the template file: $PWEXPIRES. -

    -server -
    Names the file server machine on which to create the new user's -volume. It is best to provide a fully qualified hostname (for example, -fs1.abc.com), but an abbreviated form is acceptable -provided that the cell's naming service is available to resolve it at the -time the volume is created. -

    Corresponding variable in the template file: $SERVER. -

    -partition -
    Specifies the partition on which to create the user's volume; it -must be on the file server machine named by the -server -argument. Provide the complete partition name (for example -/vicepa) or one of the following abbreviated forms: -
       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    -

    Corresponding variable in the template file: $PART. -

    -mount -
    Specifies the pathname for the user's home directory. Partial -pathnames are interpreted relative to the current working directory. -

    Specify the read/write path to the directory, to avoid the failure that -results from attempting to create a new mount point in a read-only -volume. By convention, the read/write path is indicated by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    Corresponding variable in template: $MTPT, but in the template -file's V instruction only. Occurrences of the $MTPT -variable in template instructions that follow the V instruction -take their value from the V instruction's -mount_point field. Thus the value of this command line -argument becomes the value for the $MTPT variable in instructions that follow -the V instruction only if the string $MTPT appears alone in the -V instruction's mount_point field. -

    -uid -
    Specifies a positive integer other than 0 (zero) to assign as the -user's AFS UID. If this argument is omitted, the Protection Server -assigns an AFS UID that is one greater than the current value of the -max user id counter (use the pts -listmax command to display the counter). If including this -argument, it is best first to use the pts examine command to verify -that no existing account already has the desired AFS UID; it one does, -the account creation process terminates with an error. -

    Corresponding variable in the template file: $UID. -

    -template -
    Specifies the pathname of the template file. If this argument is -omitted, the command interpreter searches the following directories in the -indicated order for a file called uss.template: -
      -

    1. The current working directory -

    2. /afs/cellname/common/uss, where -cellname names the local cell -

    3. /etc -
    -

    -

    If the issuer provides a filename other than uss.template -but without a pathname, the command interpreter searches for it in the -indicated directories. If the issuer provides a full or partial -pathname, the command interpreter consults the specified file only; it -interprets partial pathnames relative to the current working directory. -

    -

    If the specified template file is empty (zero-length), the command creates -Protection and Authentication Database entries only. -

    The uss Template File reference page details the file's -format. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -var -
    Specifies values for each of the number variables $1 through $9 that can -appear in the template file. Use the number variables to assign values -to variables in the uss template file that are not part of the -standard set. -

    Corresponding variables in the template file: $1 through $9. -

    For each instance of this argument, provide two parts in the indicated -order, separated by a space: -

      -

    • The integer from the range 1 through 9 that matches -the variable in the template file. Do not precede it with a dollar -sign. -

    • A string of alphanumeric characters to assign as the value of the -variable. -
    -

    See the chapter on uss in the AFS Administration -Guide for further explanation. -

    -cell -
    Specifies the cell in which to run the command. For more details, -see the introductory uss reference page. -

    -admin -
    Specifies the AFS user name under which to establish authenticated -connections to the AFS server processes that maintain the various components -of a user account. For more details, see the introductory -uss reference page. -

    -dryrun -
    Reports actions that the command interpreter needs to perform while -executing the command, without actually performing them. For more -details, see the introductory uss reference page. -

    -skipauth -
    Prevents authentication with the AFS Authentication Server, allowing a -site using Kerberos to substitute that form of authentication. -

    -overwrite -
    Overwrites any directories, files and links that exist in the file system -and for which there are definitions in D, E, -F, L, or S instructions in the template file -named by the -template argument. If this flag is omitted, -the command interpreter prompts once for confirmation that it is to overwrite -all such elements. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The combination of the following example uss add command and -V instruction in a template file called uss.tpl -creates Protection and Authentication Database entries named smith, -and a volume called user.smith with a quota of 2500 kilobyte -blocks, mounted at the pathname -/afs/abc.com/usr/smith. The access control list (ACL) -on the mount point grants smith all rights. -

    The issuer of the uss add command provides only the template -file's name, not its complete pathname, because it resides in the current -working directory. The command and V instruction appear here -on two lines only for legibility; there are no line breaks in the actual -instruction or command. -

       V user.$USER $SERVER.abc.com /vice$PART $1   \
    -       /afs/abc.com/usr/$USER $UID $USER all
    -   
    -   % uss add  -user smith -realname "John Smith" -pass js_pswd -server fs2   \
    -              -partition b -template uss.tpl -var 1 2500
    -   
    -
    -

    Privilege Required -

    The issuer (or the user named by the -admin argument) must -belong to the system:administrators group in the Protection -Database and must have the ADMIN flag turned on in his or her -Authentication Database entry. -

    If the template contains a V instruction, the issuer must be -listed in the /usr/afs/etc/UserList file and must have at least -a (administer) and i (insert) -permissions on the ACL of the directory that houses the new mount -point. If the template file includes instructions for creating other -types of objects (directories, files or links), the issuer must have each -privilege necessary to create them. -

    Related Information -

    UserList -

    uss Template File -

    fs mkmount -

    uss -

    uss bulk -

    uss delete -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf244.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf244.htm deleted file mode 100755 index b0a70318c..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf244.htm +++ /dev/null @@ -1,70 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string. -

    Synopsis -

    uss apropos -topic <help string>  [-help]
    -   
    -uss ap -t <help string>  [-h]
    -
    -

    Description -

    The uss apropos command displays the first line of the online -help entry for any uss command that has in its name or short -description the string specified by the -topic argument. -

    To display the syntax for a command, use the uss help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match, in lowercase letters only. -If the string is more than a single word, surround it with double quotes ("") -or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -uss command where the string specified by the -topic -argument is part of the command name or first line. -

    Examples -

    The following command lists all uss commands that include the -word create in their names or short descriptions: -

       % uss apropos create
    -   add: create a new user
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    uss -

    uss help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf245.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf245.htm deleted file mode 100755 index 40f863228..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf245.htm +++ /dev/null @@ -1,135 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss bulk

    - - - - - -

    Purpose -

    Executes multiple uss commands listed in a file -

    Synopsis -

    uss bulk -file <bulk input file>  [-template <pathname of template file>]
    -         [-verbose]  [-cell <cell name>]  
    -         [-admin <administrator to authenticate>] [-dryrun]  
    -         [-skipauth]  [-overwrite]
    -         [-pwexpires <password expires in [0..254] days (0 => never)>]  
    -         [-pipe]  [-help]
    -     
    -uss b -f <bulk input file>  [-t <pathname of template file>]  [-v]  
    -      [-c <cell name>]  [-a <administrator to authenticate>]  [-d]  [-s]  
    -      [-o]  [-pw <password expires in [0..254] days (0 => never)>]  
    -      [-pi]  [-h]
    -
    -

    Description -

    The uss bulk command executes the uss commands listed -in the bulk input file specified with the -file -argument. If the bulk input file includes add instructions -that reference a template file, then the -template argument is -required. -

    To create a single account, use the uss add command. To -delete one or more accounts, use the uss delete command. -

    Options -

    -

    -file -
    Specifies the pathname of the bulk input file. Partial pathnames -are interpreted relative to the current working directory. For details -on the file's format, see uss Bulk Input File. -

    -template -
    Specifies the pathname of the template file for any uss add -commands that appear in the bulk input file. Partial pathnames are -interpreted relative to the current working directory. For details on -the file's format, see uss Template File. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -cell -
    Specifies the cell in which to run the command. For more details, -see the introductory uss reference page. -

    -admin -
    Specifies the AFS user name under which to establish authenticated -connections to the AFS server processes that maintain the various components -of a user account. For more details, see the introductory -uss reference page. -

    -dryrun -
    Reports actions that the command interpreter needs to perform while -executing the command, without actually performing them. For more -details, see the introductory uss reference page. -

    -skipauth -
    Prevents authentication with the AFS Authentication Server, allowing a -site using Kerberos to substitute that form of authentication. -

    -overwrite -
    Overwrites any directories, files and links that exist in the file system -and for which there are also D, E, F, -L, or S instructions in a template file referenced by an -add instruction in the bulk input file. If this flag is -omitted, the command interpreter prompts, once for each add -instruction in the bulk input file, for confirmation that it should overwrite -such elements. Do not include this flag if the bulk input file does not -contain add instructions. -

    -pwexpires -
    Sets the number of days after a user's password is changed that it -remains valid, for each user named by an add instruction in the -bulk input file. Provide an integer from the range 1 through -254 to specify the number of days until expiration, or the value -0 to indicate that the password never expires (the default). -

    When the password becomes invalid (expires), the user is unable to -authenticate, but has 30 more days in which to issue the kpasswd -command to change the password (after that, only an administrator can change -it). -

    -pipe -
    Suppresses the Authentication Server's prompt for the password of the -issuer or the user named by the -admin argument (the Authentication -Server always separately authenticates the creator of an entry in the -Authentication Database). Instead, the command interpreter accepts the -password via the standard input stream, as piped in from another -program. This enables the uss bulk command to run as part of -unattended batch jobs. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example command executes the instructions in the bulk input -file called new_students, which includes add -instructions that refer to the template file -student.template. Both files reside in the current -working directory. -

       % uss bulk new_students student.template
    -   
    -
    -

    Privilege Required -

    The issuer (or the user named by the -admin argument) must have -the privileges necessary to run the commands that correspond to instructions -in the bulk input file. -

    Related Information -

    uss Bulk Input File -

    uss Template File -

    uss -

    uss add -

    uss delete -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf246.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf246.htm deleted file mode 100755 index 17c80069a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf246.htm +++ /dev/null @@ -1,132 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss delete

    - - - - - - - - - - -

    Purpose -

    Deletes a user account -

    Synopsis -

    uss delete -user <login name>  [-mountpoint <mountpoint for user's volume>] 
    -           [-savevolume]  [-verbose]  [-cell <cell name>]  
    -           [-admin <administrator to authenticate>]  [-dryrun]  
    -           [-skipauth]  [-help]
    -    
    -uss d -u <login name>  [-m <mountpoint for user's volume>]  [-sa]  [-v]
    -      [-c <cell name>]  -a <administrator to authenticate>]  
    -      [-d]  [-sk]  [-h]
    -
    -

    Description -

    The uss delete command removes the Authentication Database and -Protection Database entries for the user named by -user -argument. In addition, it can remove the user's home volume and -associated VLDB entry, a mount point for the volume or both, depending on -whether the -mountpoint and -savevolume options are -provided. -

      -

    • To remove both the volume and mount point, use the -mountpoint -argument to name the user's home directory. It is best to create a -tape backup of a volume before deleting it. Note that other mount -points for the volume are not removed, if they exist. -

    • To remove the mount point only, provide both the -mountpoint -and -savevolume options. -

    • To preserve both the volume and mount point, omit the --mountpoint argument (or both it and the -savevolume -flag). -
    -

    Options -

    -

    -user -
    Names the entry to delete from the Protection and Authentication -Databases. -

    -mountpoint -
    Specifies the pathname to the user's home directory, which is deleted -from the filespace. By default, the volume referenced by the mount -point is also removed from the file server machine that houses it, along with -its Volume Location Database (VLDB) entry. To retain the volume and -VLDB entry, include the -savevolume flag. Partial pathnames -are interpreted relative to the current working directory. -

    Specify the read/write path to the mount point, to avoid the failure that -results from attempting to remove a mount point from a read-only -volume. By convention, the read/write path is indicated by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see the -fs mkmount reference page. -

    -savevolume -
    Preserves the user's volume and VLDB entry. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -cell -
    Specifies the cell in which to run the command. For more details, -see the introductory uss reference page. -

    -admin -
    Specifies the AFS user name under which to establish authenticated -connections to the AFS server processes that maintain the various components -of a user account. For more details, see the introductory -uss reference page. -

    -dryrun -
    Reports actions that the command interpreter needs to perform while -executing the command, without actually performing them. For more -details, see the introductory uss reference page. -

    -skipauth -
    Prevents authentication with the AFS Authentication Server, allowing a -site using Kerberos to substitute that form of authentication. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes smith's user account from the -abc.com cell. The -savevolume argument -retains the user.smith volume on its file server -machine. -

       % uss delete smith -mountpoint /afs/abc.com/usr/smith -savevolume
    -   
    -
    -

    Privilege Required -

    The issuer (or the user named by -admin argument) must belong to -the system:administrators group in the Protection Database, -must have the ADMIN flag turned on in his or her Authentication -Database entry, and must have at least a (administer) -and d (delete) permissions on the access control list -(ACL) of the mount point's parent directory. If the --savevolume flag is not included, the issuer must also be listed in -the /usr/afs/etc/UserList file. -

    Related Information -

    UserList -

    fs mkmount -

    uss -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf247.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf247.htm deleted file mode 100755 index 4c30d1446..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf247.htm +++ /dev/null @@ -1,87 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    uss help

    - - - -

    Purpose -

    Displays the syntax of specified uss commands or lists -functional descriptions of all uss commands -

    Synopsis -

    uss help [-topic <help string>+]  [-help]
    -    
    -uss h [-t <help string>+]  [-h]
    -
    -

    Description -

    The uss help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every uss command. -

    To list every uss command whose name or short description -includes a specified keyword, use the uss apropos command. -

    Options -

    -

    -topic -
    Indicates each command for which to display the complete online help -entry. Omit the uss part of the command name, providing only -the operation code (for example, specify bulk, not uss -bulk). If this argument is omitted, the output briefly describes -every uss command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each uss command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the uss -bulk command: -

       % uss help bulk
    -   uss bulk: bulk input mode
    -   Usage: uss bulk -file <bulk input file> [-template <pathname 
    -   of template file>] [-verbose] [-cell <cell name>] [-admin 
    -   <administrator to authenticate>] [-dryrun] [-skipauth] [-overwrite] 
    -   [-pwexpires <password expires in [0..254] days (0 => never)>] [-pipe] 
    -   [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    uss -

    uss apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf248.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf248.htm deleted file mode 100755 index fea94759a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf248.htm +++ /dev/null @@ -1,91 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vldb_check

    - - - -

    Purpose -

    Checks the integrity of the VLDB -

    Synopsis -

    vldb_check -database <vldb_file>  [-uheader]  [-vheader]  [-servers]  
    -           [-entries]  [-verbose]  [-help]
    -   
    -vldb_check -d <vldb_file>  [-u]  [-vh]  [-s]  [-e]  [-ve]  [-h]
    -
    -

    Description -

    The vldb_check command checks the integrity of the Volume -Location Database (VLDB), reporting any errors or corruption it finds. -If there are problems, do not issue any vos commands until the -database is repaired. -

    Cautions -

    The results can be unpredictable if the Volume Location (VL) Server makes -changes to the VLDB while this command is running. Use the bos -shutdown command to shutdown the local vlserver process -before running this command, or before creating a second copy of the -vldb.DB0 file (with a different name) on which to run the -command. -

    Options -

    -

    -database -
    Names the VLDB (copy of the vldb.DB0 file) to -check. If the current working directory is not the location of the -file, provide a pathname, either full or relative to the current working -directory. -

    -uheader -
    Displays information which Ubik maintains in the database's -header. -

    -pheader -
    Displays information which the VL Server maintains in the database's -header. -

    -servers -
    Outputs the server entries from the VLDB, which list the IP addresses -registered for each file server machine in the cell. -

    -entries -
    Outputs every volume entry in the database. The information -includes the volume's name and the volume ID number for each of its -versions. -

    -verbose -
    Reports additional information about the database, including the number of -entries for each type of volume. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If there are errors in the database, the output always reports them on the -standard error stream. If any options other than -database -or -help are provided, the output written to the standard output -stream includes additional information as described for each option in the -preceding Options section of this reference page. The output -is intended for debugging purposes and is meaningful to someone familiar with -the internal structure of the VLDB. -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    vldb.DB0 and vldb.DBSYS1 -

    bos shutdown -

    vlserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf249.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf249.htm deleted file mode 100755 index e1cf86f52..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf249.htm +++ /dev/null @@ -1,114 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vlserver

    - - - - -

    Purpose -

    Initializes the Volume Location Server -

    Synopsis -

    vlserver [-p <lwp processes>]  [-nojumbo]  
    -         [-enable_peer_stats]  [-enable_process_stats]  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The vlserver command initializes the Volume Location (VL) -Server, which runs on every database server machine. In the -conventional configuration, its binary file is located in the -/usr/afs/bin directory on a file server machine. -

    The vlserver command is not normally issued at the command shell -prompt but rather placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a database server machine as the local superuser -root. -

    As it initializes, the VL Server process creates the two files that -constitute the Volume Location Database (VLDB), vldb.DB0 and -vldb.DBSYS1, in the /usr/afs/db directory if they -do not already exist. Use the commands in the vos suite to -administer the database. -

    The VL Server maintains the record of volume locations in the Volume -Location Database (VLDB). When the Cache Manager fills a file request -from an application program, it first contacts the VL Server to learn which -file server machine currently houses the volume that contains the file. -The Cache Manager then requests the file from the File Server process running -on that file server machine. -

    The VL Server records a trace of its activity in the -/usr/afs/logs/VLLog file. Use the bos getlog -command to display the contents of the file. By default, it records on -a minimal number of messages. For instructions on increasing the amount -of logging, see the VLLog reference page. -

    By default, the VL Server runs nine lightweight processes (LWPs). To -change the number, use the -p argument. -

    Options -

    -

    -p -
    Sets the number of server lightweight processes (LWPs) to run. -Provide an integer between 4 and 16. The default -is 9. -

    -nojumbo -
    Prohibits the server from sending or receiving jumbograms. A -jumbogram is a large-size packet composed of 2 to 4 normal Rx data packets -that share the same header. The VL Server uses jumbograms by default, -but some routers are not capable of properly breaking the jumbogram into -smaller packets and reassembling them. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following bos create command creates a vlserver -process on the machine fs2.abc.com that uses six -lightweight processes. Type the command on a single line: -

       % bos create -server fs2.abc.com -instance vlserver -type simple  \
    -                -cmd "/usr/afs/bin/vlserver -p 6"
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BosConfig -

    VLLog -

    vldb.DB0 and vldb.DBSYS1 -

    bos create -

    bos getlog -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf250.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf250.htm deleted file mode 100755 index cafacc5e6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf250.htm +++ /dev/null @@ -1,115 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    volinfo

    - - -

    Purpose -

    Produces detailed statistics about one or more volume headers and the -partition that houses them -

    Synopsis -

    volinfo [-online]  [-vnode]  [-date]  [-inode] [-itime]  
    -        [-part  <AFS partition name (default current partition)>+]   
    -        [-volumeid <Volume id>+]  [-header]  [-sizeOnly]  [-fixheader]  
    -        [-saveinodes]  [-orphaned]  [-help]
    -
    -

    Description -

    The volinfo command displays detailed statistics about one or -more volume headers and the partition that houses them. The command -must be issued on a file server machine and by default produces output for -every volume on every AFS server partition on the machine. To display -output for the volumes on one partition only, include the -part -argument. To display output for one volume only, include the --volumeid argument. -

    Options -

    -

    -online -
    Is nonoperational. -

    -vnode -
    Displays a table for each volume which lists the large (directory) and -small (file) vnodes in it, in addition to the default output. -

    -date -
    When combined with the -vnode flag, adds the -ServerModTime field to each vnode entry in the large vnode and -small vnode tables, reporting its most recent modification time. -

    -inode -
    When combined with the -vnode flag, adds the inode -field to each vnode entry in the large vnode and small vnode tables, reporting -the associated inode number. -

    -itime -
    When combined with the -vnode flag, displays a change, -modification, and access timestamp for each of the large vnode and small vnode -tables. -

    -part -
    Specifies the partition that houses each volume for which to produce -output. Use the format /vicepxx, where xx -is one or two lowercase letters. This argument can be omitted if the -current working directory is the mount location for an AFS server -partition; it is not the mount location for an AFS server partition, the -command produces output for every volume on all local AFS server -partitions. -

    -volumeid -
    Specifies the ID number of one volume for which to produce output. -The -part argument must be provided along with this one unless the -current working directory is the mount location for the AFS server partition -that houses the volume. -

    -header -
    Displays statistics about the volume header of each volume, in addition to -the default output. -

    -sizeOnly -
    Displays a single line of output for each volume, reporting the size of -various structures associated with it. The default output is suppressed -and any flags that modify it (such as -vnode) are ignored. -

    -fixheader -
    Repairs damaged inodes in each volume if possible. If there are -any, it reports the action it is taking to repair them. Otherwise, it -produces no output in addition to the default output. -

    -saveinodes -
    Creates a file in the current working directory for each inode in each -volume. Each file is called -TmpInode.vnode_number and contains the inode's -contents. The default output is suppressed and any flags that modify it -(such as -vnode) are ignored. -

    -orphaned -
    Displays a large vnode and small vnode table for each volume, which lists -only orphaned vnodes (vnodes that have no parent). If there are none, -the tables are empty (only the headers appear). -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    By default, the command produces several line of statistics for each -volume. Adding other options produces or substitutes additional -information as described in the preceding Options section of this -reference page. The output is intended for debugging purposes and is -meaningful to someone familiar with the internal structure of volume -headers. -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    Related Information -

    vldb.DB0 and vldb.DBSYS1 -

    volserver -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf251.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf251.htm deleted file mode 100755 index 44d243dae..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf251.htm +++ /dev/null @@ -1,105 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    volserver

    - - - -

    Purpose -

    Initializes the Volume Server component of the fs process -

    Synopsis -

    volserver [-log]  [-p <number of processes>]  
    -          [-udpsize <size of socket buffer in bytes>]  
    -          [-enable_peer_stats]  [-enable_process_stats]  [-help]
    -
    -

    This command does not use the syntax conventions of the AFS command -suites. Provide the command name and all option names in full. -

    Description -

    The volserver command initializes the Volume Server component of -the fs process. In the conventional configuration, its -binary file is located in the /usr/afs/bin directory on a file -server machine. -

    The volserver command is not normally issued at the command -shell prompt but rather placed into a file server machine's -/usr/afs/local/BosConfig file with the bos create -command. If it is ever issued at the command shell prompt, the issuer -must be logged onto a database server machine as the local superuser -root. -

    The Volume Server records a trace of its activity in the -/usr/afs/logs/VolserLog file. Use the bos getlog -command to display the contents of the file. -

    The Volume Server processes the vos commands that administrators -use to create, delete, move, and replicate volumes, as well as prepare them -for archiving to tape or other media. -

    By default, the VL Server runs nine lightweight processes (LWPs). To -change the number, use the -p argument. -

    Options -

    -

    -log -
    Records in the /usr/afs/logs/VolserLog file the names of all -users who successfully initiate a vos command. The Volume -Server also records any file removals that result from issuing the vos -release command with the -f flag. -

    -p -
    Sets the number of server lightweight processes (LWPs) to run. -Provide an integer between 4 and 16. The default -is 9. -

    -udpsize -
    Sets the size of the UDP buffer, which is 64 KB by default. Provide -a positive integer, preferably larger than the default. -

    -enable_peer_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. For each connection with a specific UDP port on another -machine, a separate record is kept for each type of RPC (FetchFile, GetStatus, -and so on) sent or received. To display or otherwise access the -records, use the Rx Monitoring API. -

    -enable_process_stats -
    Activates the collection of Rx statistics and allocates memory for their -storage. A separate record is kept for each type of RPC (FetchFile, -GetStatus, and so on) sent or received, aggregated over all connections to -other machines. To display or otherwise access the records, use the Rx -Monitoring API. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following bos create command creates a volserver -process on the machine fs2.abc.com: -

       % bos create -server fs2.abc.com -instance volserver -type simple   \
    -                 -cmd /usr/afs/bin/volserver 
    -
    -

    Privilege Required -

    The issuer must be logged in as the superuser root on a file -server machine to issue the command at a command shell prompt. It is -conventional instead to create and start the process by issuing the bos -create command. -

    Related Information -

    BosConfig -

    VolserLog -

    bos create -

    bos getlog -

    vos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf252.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf252.htm deleted file mode 100755 index a20de27b5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf252.htm +++ /dev/null @@ -1,243 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos

    - - - - - - - - - - - - - - - - - - -

    Purpose -

    Introduction to the vos command suite -

    Description -

    The commands in the vos command suite are the administrative -interface to the Volume Server and Volume Location (VL) Server. System -administrators use vos commands to create, move, delete, replicate, -back up and examine volumes, among other operations. The VL Server -automatically records in the Volume Location Database (VLDB) changes in volume -status and location that result from vos commands. -

    The operations invoked by most vos commands are idempotent, -meaning that if an operation is interrupted by a network, server machine, or -process outage, then a subsequent attempt at the same operation continues from -the interruption point, rather than starting over at the beginning of the -operation. Before executing a command, the Volume and VL Servers check -the current state of the volumes and VLDB records to be altered by the -command. If they are already in the desired end state (or a consistent -intermediate state), there is no need to repeat the internal steps that -brought them there. Idempotency does not apply if the command issuer -explicitly interrupts the operation with the <Ctrl-c> command or -another interrupt signal. In that case, the volume is left locked and -the administrator must use the vos unlock command to unlock it -before proceeding. -

    It is important that the VLDB accurately indicate the status of the volumes -on file server machines at all times. The reference pages for the files -vldb.DB0 and -Vvol_ID.vol describe the information -recorded in the VLDB and volume headers, respectively. If a -vos command changes volume status, it automatically records the -change in the corresponding VLDB entry. The most common cause of -discrepancies between the VLDB and volume status on file server machines is -interrupted operations; to restore consistency, use the vos -syncserv and vos syncvldb commands. -

    There are several categories of commands in the vos command -suite: -

      -

    • Commands to create, move, and rename volumes: vos backup, -vos backupsys, vos create, vos move, and -vos rename -

    • Commands to remove VLDB volume records or volumes or both: vos -delentry, vos remove, and vos zap -

    • Commands to edit or display VLDB server entries: vos -changeaddr and vos listaddrs -

    • Commands to create and restore dump files: vos dump and -vos restore -

    • Commands to administer replicated volumes: vos addsite, -vos release, and vos remsite -

    • Commands to display VLDB records, volume headers, or both: vos -examine, vos listvldb, and vos listvol -

    • Commands to display information about partitions that house volumes: -vos listpart and vos partinfo -

    • Commands to restore consistency between the VLDB and volume headers: -vos syncserv and vos syncvldb -

    • Commands to lock and unlock VLDB entries: vos lock, -vos unlock, and vos unlockvldb -

    • A command to report Volume Server status: vos status -

    • Commands to obtain help: vos apropos and vos -help -
    -

    Options -

    The following arguments and flags are available on many commands in the -bos suite. The reference page for each command also lists -them, but they are described here in greater detail. -

    -

    -cell <cell name> -
    Names the cell in which to run the command. It is acceptable to -abbreviate the cell name to the shortest form that distinguishes it from the -other entries in the /usr/vice/etc/CellServDB file on the local -machine. If the -cell argument is omitted, the command -interpreter determines the name of the local cell by reading the following in -order: -
      -

    1. The value of the AFSCELL environment variable -

    2. The local /usr/vice/etc/ThisCell file -
    -

    -

    Do not combine the -cell and -localauth -options. A command on which the -localauth flag is included -always runs in the local cell (as defined in the server machine's local -/usr/afs/etc/ThisCell file), whereas a command on which the --cell argument is included runs in the specified foreign -cell. -

    -help -
    Prints a command's online help message on the standard output -stream. Do not combine this flag with any of the command's other -options; when it is provided, the command interpreter ignores all other -options, and only prints the help message. -

    -localauth -
    Constructs a server ticket using the server encryption key with the -highest key version number in the local /usr/afs/etc/KeyFile -file. The vos command interpreter presents the ticket, which -never expires, to the Volume Server and VL Server during mutual -authentication. -

    Use this flag only when issuing a command on a server machine; client -machines do not usually have a /usr/afs/etc/KeyFile file. -The issuer of a command that includes this flag must be logged on to the -server machine as the local superuser root. The flag is -useful for commands invoked by an unattended application program, such as a -process controlled by the UNIX cron utility or by a cron entry in -the machine's /usr/afs/local/BosConfig file. It is also -useful if an administrator is unable to authenticate to AFS but is logged in -as the local superuser root. -

    Do not combine the -cell and -localauth -options. A command on which the -localauth flag is included -always runs in the local cell (as defined in the server machine's local -/usr/afs/etc/ThisCell file), whereas a command on which the --cell argument is included runs in the specified foreign -cell. Also, do not combine the -localauth and --noauth flags. -

    -noauth -
    Establishes an unauthenticated connection to the Volume Server and VL -Server, in which the servers treat the issuer as the unprivileged user -anonymous. It is useful only when authorization checking is -disabled on the server machine (during the installation of a file server -machine or when the bos setauth command has been used during other -unusual circumstances). In normal circumstances, the servers allow only -privileged users to issue commands that change the status of a volume or VLDB -record, and refuses to perform such an action even if the -noauth -flag is provided. Do not combine the -noauth and --localauth flags. -

    -partition <partition name> -
    Identifies the AFS server partition on a file server machine that houses, -or is to house, the volumes of interest, or about which to list -information. The vos command interpreter accepts any of the -following four name formats: -
       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    The -frompartition and -topartition arguments to the -vos move command also accept this notation. -

    -server <machine name> -
    Identifies the file server machine that houses, or is to house, the -volumes or AFS server partitions of interest. Provide the -machine's IP address in dotted decimal format, its fully qualified host -name (for example, fs1.abc.com), or the shortest -abbreviated form of its host name that distinguishes it from other -machines. Successful use of an abbreviated form depends on the -availability of a name resolution service (such as the Domain Name Service or -a local host table) at the time the command is issued. -

    The -fromserver and -toserver arguments to the -vos move command also accept these name formats. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -
    -

    Privilege Required -

    To issue most vos commands, the issuer must be listed in the -/usr/afs/etc/UserList file on each server machine that houses or is -to house an affected volume, and on each database server machine. The -most predictable performance results if all database server and file server -machines in the cell share a common UserList file. -Alternatively, if the -localauth flag is included, the issuer must -be logged on to a server machine as the local superuser -root. -

    To issue a vos command that only displays information, no -privilege is required. -

    Related Information -

    CellServDB (server version) -

    UserList -

    vos addsite -

    vos apropos -

    vos backup -

    vos backupsys -

    vos changeaddr -

    vos create -

    vos delentry -

    vos dump -

    vos examine -

    vos help -

    vos listaddrs -

    vos listpart -

    vos listvldb -

    vos listvol -

    vos lock -

    vos move -

    vos partinfo -

    vos release -

    vos remove -

    vos remsite -

    vos rename -

    vos restore -

    vos status -

    vos syncserv -

    vos syncvldb -

    vos unlock -

    vos unlockvldb -

    vos zap -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf253.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf253.htm deleted file mode 100755 index 3d54676da..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf253.htm +++ /dev/null @@ -1,120 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos addsite

    - - - - - - -

    Purpose -

    Adds a read-only site definition to a volume's VLDB entry -

    Synopsis -

    vos addsite -server <machine name for new site>
    -            -partition <partition name for new site>
    -            -id <volume name or ID>  [-cell <cell name>]  
    -            [-noauth]  [-localauth]  [-verbose]  [-help]
    -   
    -vos ad -s <machine name for new site>  -p <partition name for new site>
    -       -i <volume name or ID>  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos addsite command defines a new read-only site (partition -on a file server machine, specified by the -server and --partition arguments) in the Volume Location Database (VLDB) entry -of the read/write volume named by the -id argument. When the -vos release command is next issued against the read/write volume, a -read-only copy of it is distributed to all of the read-only sites, including -the newly defined one. -

    Cautions -

    A volume's VLDB entry accommodates a maximum number of site -definitions, as defined in the AFS Release Notes. The site -housing the read/write and backup versions of the volume counts as one site, -and each read-only site counts as an additional site (even the read-only site -defined on the same file server machine and partition as the read/write site -counts as a separate site). The limit in the VLDB entry effectively -determines the maximum number of copies of the volume that are available to -AFS clients. -

    Attempts to create additional sites by using this command fail with an -error. -

    Options -

    -

    -server -
    Identifies the file server machine where the read-only volume is to -reside. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -partition -
    Identifies the partition where the read-only volume is to reside, on the -file server machine named by the -server argument. Provide -the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -id -
    Specifies either the complete name or volume ID number of the read/write -source volume. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example, appropriate in the State University cell, defines a -read-only site for the cell's root.afs volume. -

       % vos addsite -server sv7.stateu.edu -partition /vicepb -id root.afs
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos examine -

    vos release -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf254.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf254.htm deleted file mode 100755 index 26cf84aa5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf254.htm +++ /dev/null @@ -1,72 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos apropos

    - - - -

    Purpose -

    Displays each help entry containing a keyword string -

    Synopsis -

    vos apropos -topic <help string>  [-help]
    -    
    -vos ap -t <help string>  [-h]
    -
    -

    Description -

    The vos apropos command displays the first line of the online -help entry for any vos command that has in its name or short -description the string specified by the -topic argument. -

    To display the syntax for a command, use the vos help -command. -

    Options -

    -

    -topic -
    Specifies the keyword string to match. Use lowercase letters only, -except for the acronym VLDB. If the string is more than a -single word, surround it with double quotes ("") or other delimiters. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first line of a command's online help entry names it and briefly -describes its function. This command displays the first line for any -vos command where the string specified with the -topic -argument is part of the command name or first line. -

    Examples -

    The following command displays all vos commands that include the -word lock in their names or short descriptions: -

       % vos apropos lock
    -   lock: lock VLDB entry for a volume
    -   unlock: release lock on VLDB entry for a volume
    -   unlockvldb: unlock all the locked entries in the VLDB
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    vos -

    vos help -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf255.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf255.htm deleted file mode 100755 index cc9b486b8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf255.htm +++ /dev/null @@ -1,106 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos backup

    - - - - - - - - - -

    Purpose -

    Creates a backup volume for a single read/write volume -

    Synopsis -

     
    -vos backup -id <volume name or ID>  [-cell <cell name>]  [-noauth]  
    -           [-localauth]  [-verbose]  [-help]
    -   
    -vos backup -i <volume name or ID>  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos backup command clones the indicated read/write volume to -create a backup version, placing it at the same site as the read/write -version. The backup volume's name is the same as the read/write -source's with the addition of the .backup -extension. Its volume ID number is the one allocated for it in the -Volume Location Database (VLDB) when the read/write source was created with -the vos create command. If a backup version already exists, -the new clone replaces it. -

    To create a backup version of multiple volumes, use the vos -backupsys command. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of the read/write -source volume. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The following message confirms that the command succeeded: -

       Created backup volume for volume name
    -   
    -
    -

    Examples -

    The following example creates a backup version of the volume -user.smith. -

       % vos backup user.smith
    -   Created backup volume for user.smith
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos backupsys -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf256.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf256.htm deleted file mode 100755 index 9568c5eff..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf256.htm +++ /dev/null @@ -1,270 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos backupsys

    - - - - - - - -

    Purpose -

    Creates a backup volume for several read/write volumes -

    Synopsis -

    vos backupsys [-prefix <common prefix on volume(s)>+]  
    -              [-server <machine name>]  [-partition <partition name>]  
    -              [-exclude]  [-xprefix <negative prefix on volume(s)>+] 
    -              [-dryrun]  [-cell <cell name>]  [-noauth]  [-localauth]
    -              [-verbose]  [-help] 
    -    
    -vos backups [-pr <common prefix on volume(s)>+]  [-s <machine name>] 
    -            [-pa <partition name>]  [-e]  [-x <negative prefix on volume(s)>+]  
    -            [-d]  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos backupsys command clones each indicated read/write -volume to create a backup version, placing each clone at the same site as its -read/write source version. It assigns each clone the same name as the -read/write source, adding a .backup extension. It -assigns the volume ID number already allocated for the backup version in the -Volume Location Database (VLDB). If a backup version already exists for -a given volume, the new clone replaces it. -

    To clone every read/write volume listed in the VLDB, omit all of the -command's options. Otherwise, combine the command's options -to clone various groups of volumes. The options use one of two basic -criteria to select volumes: location (the -server and --partition arguments) or presence in the volume name of one of a -set of specified character strings (the -prefix, --exclude, and -xprefix options). -

    To clone only volumes that reside on one file server machine, include the --server argument. To clone only volumes that reside on one -partition, combine the -server and -partition -arguments. The -partition argument can also be used alone to -clone volumes that reside on the indicated partition on every file server -machine. These arguments can be combined with those that select volumes -based on their names. -

    Combine the -prefix, -exclude, and --xprefix options (with or without the -server and --partition arguments) in the indicated ways to select volumes based -on character strings contained in their names: -

      -

    • To clone every read/write volume at the specified location whose name -includes one of a set of specified character strings (for example, begins with -user. or includes the string afs), use the --prefix argument or combine the -xprefix and --exclude options. -

    • To clone every read/write volume at the specified location except those -whose name includes one of a set of specified character strings, use the --xprefix argument or combine the -prefix and --exclude options. -

    • To clone every read/write volume at the specified location whose name -includes one of one of a set of specified character strings, except those -whose names include one of a different set of specified character strings, -combine the -prefix and -xprefix arguments. The -command creates a list of all volumes that match the -prefix -argument and then removes from the list the volumes that match the --xprefix argument. For effective results, the strings -specified by the -xprefix argument must designate a subset of the -volumes specified by the -prefix argument. -

      If the -exclude flag is combined with the -prefix and --xprefix arguments, the command creates a list of all volumes that -do not match the -prefix argument and then adds to the list any -volumes that match the -xprefix argument. As when the --exclude flag is not used, the result is effective only if the -strings specified by the -xprefix argument designate a subset of -the volumes specified by the -prefix argument. -

    -

    The -prefix and -xprefix arguments both accept -multiple values, which can be used to define disjoint groups of -volumes. Each value can be one of two types: -

      -

    1. A simple character string, which matches volumes whose name begin with the -string. All characters are interpreted literally (that is, characters -that potentially have special meaning to the command shell, such as the -period, have only their literal meaning). -

    2. A regular expression, which matches volumes whose names contain the -expressions. Place a caret ( ^ ) at the -beginning of the expression, and enclose the entire string in single quotes -(' '). Explaining regular -expressions is outside the scope of this reference page; see the UNIX -manual page for regexp(5) or (for a brief introduction) the -backup addvolentry reference page in this document. As an -example, the following expression matches volumes that have the string -aix anywhere in their names: -
         -prefix  '^.*aix'
      -
      -
    -

    To display a list of the volumes to be cloned, without actually cloning -them, include the -dryrun flag. To display a statement that -summarizes the criteria being used to select volume, include the --verbose flag. -

    This command can be used to clone a single read/write volume; specify -its complete name as the -prefix argument. However, it is -more efficient to use the vos backup command, which employs a more -streamlined technique for finding a single volume. -

    Options -

    -

    -prefix -
    Specifies one or more simple character strings or regular expressions of -any length; a volume whose name includes the string is placed on the set -of volumes to be cloned. Include field separators (such as periods) if -appropriate. This argument can be combined with any combination of the --server, -partition, -exclude, and --xprefix options. -

    -server -
    Identifies the file server machine where each read/write source volume -resides. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    This argument can be combined with any combination of the --prefix, -partition, -exclude, and --xprefix options. -

    -partition -
    Identifies the partition where each read/write source volume -resides. Provide the partition's complete name with preceding -slash (for example, /vicepa) or use one of the three acceptable -abbreviated forms. For details, see the introductory reference page for -the vos command suite. -

    This argument can be combined with any combination of the --prefix, -server, -exclude, and --xprefix options. -

    -exclude -
    Reverses the meaning of the -prefix or -xprefix -argument. This flag can be combined with any combination of the --prefix, -server, -partition, and --xprefix options. -

    -xprefix -
    Specifies a simple character string or regular expression of any -length; a volume whose name includes the string is removed from the set -of volumes to be cloned. Include field separators (such as periods) if -appropriate. This argument can be combined with any combination of the --prefix, -server, -partition, and --exclude options. -

    -dryrun -
    Displays on the standard output stream a list of the volumes to be cloned, -without actually cloning them. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The command generates the following messages on the standard output stream -to confirm that the operation was successful: -

       done
    -   Total volumes backed up: number_cloned; failed to backup: failures
    -
    -

    If the -dryrun flag is included, a list of the volumes to be -backed up precedes the standard confirmation messages. -

    If the -verbose flag is included but not the -dryrun -flag, the following messages appear for each volume. The output -concludes with the standard confirmation messages. -

       Creating backup volume for volume_name on date/time
    -   {Recloning backup volume | Creating a new backup clone} backup_volumeID . . .done
    -
    -

    If both the -dryrun and -verbose flags are included, -the output begins with a statement summarizing the criteria being used to -select the volumes, followed by a list of the volumes and the standard -confirmation messages. The format of the criteria summary statement -depends on which other options are provided: -

      -

    • If only the -prefix argument is provided, or the --xprefix and -exclude options are combined: -
         Would have backed up volumes which are prefixed with string [orstring] . .
      -
      -

    • If only the -xprefix argument is provided, or the --prefix and -exclude options are combined: -
         Would have backed up volumes which are not prefixed with string [norstring] . .
      -
      -

    • If the -prefix and -xprefix arguments are -combined: -
         Would have backed up volumes which are prefixed with string [orstring]  \
      -      removing those which are prefixed with  x_string [orx_string] . .
      -
      -

    • If the -prefix, -xprefix, and -exclude -options are provided: -
         Would have backed up volumes which are not prefixed with string [norstring]  \
      -      adding those which are prefixed with  x_string [orx_string] . .
      -
      -
    -

    Examples -

    The following example creates a backup version of every read/write volume -listed in the cell's VLDB whose name begins with the string -user. -

       % vos backupsys -prefix user
    -   
    -
    -

    The following example, appropriate in the ABC Corporation cell, creates a -backup version of every read/write volume on the file server machine -fs3.abc.com. -

       % vos backupsys -server fs3.abc.com
    -   
    -
    -

    The following example, appropriate in the State University cell, creates a -backup version of every read/write volume on the file server machine -db1.stateu.edu except those whose name includes the -string temp. -

       % vos backupsys  -server db1.stateu.edu -prefix '^.*temp'
    -   
    -
    -

    The following example creates a backup version of every volume listed in -the cell's VLDB, excluding those whose names contain the string -source, but including those whose names contain the string -source.current. -

       % vos backupsys  -prefix '^.*source' -exclude -xprefix '^.*source\.current'
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    backup addvolentry -

    vos -

    vos backup -

    UNIX manual page for regexp(5) -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf257.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf257.htm deleted file mode 100755 index 5685939a6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf257.htm +++ /dev/null @@ -1,129 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos changeaddr

    - - -

    Purpose -

    Changes or removes a file server machine's entry in the VLDB -

    Synopsis -

    vos changeaddr -oldaddr <original IP address>  [-newaddr <new IP address>] 
    -               [-remove]  [-cell <cell name>]  [-noauth]  [-localauth]  
    -               [-verbose]  [-help]
    -    
    -vos ch -o <original IP address>  [-ne <new IP address>]  [-r]  
    -       [-c <cell name>]  [-no]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos changeaddr command removes a server entry from the -Volume Location Database (VLDB) when the -remove flag is combined -with the -oldaddr argument. There must be no VLDB entries -that list the machine as a site for any version of a volume (if necessary, use -the vos move or vos remove command to more or remove -volumes). It is appropriate to remove a VLDB server entry when removing -the corresponding file server machine from service; this is the only -recommended use of the command. -

    To display all VLDB server entries, use the vos listaddrs -command. -

    Cautions -

    Combining the command's -oldaddr and -newaddr -arguments is no longer the appropriate way to change the IP address registered -for a file server machine. Furthermore, if a machine is multihomed and -its server entry includes several addresses, then the address specified with -the -newaddr argument replaces all of the addresses currently -listed in the server entry that includes the address specified by the --oldaddr argument. This effectively makes the machine -single-homed with respect to AFS operations, which is probably not the desired -result. -

    The recommended method for changing the IP addresses in a server entry is -instead to restart the fs process group (which includes the File -Server) after using the utilities provided by the operating system to -reconfigure the machine's network interfaces. For a description of -how the File Server constructs and registers a list of its network interfaces -in the VLDB, see the reference page for the sysid file. -

    If, counter to recommended usage, the command is used to change the IP -address in a server entry, it does not also change the names of machine -entries in the Protection Database. Operations fail when they refer to -a protection group that has an obsolete IP address in it. Use the -pts rename command to change the names of machine entries that -correspond to the addresses changed with this command. Changing the -address of a database server machine also requires updating the client and -server versions of the CellServDB file on every machine. -

    Options -

    -

    -oldaddr -
    Specifies the IP address currently registered for the file server machine -in the VLDB server entry. If there are multiple addresses registered -for a multihomed machine, use any of them to identify the server entry. -

    -newaddr -
    Specifies the new IP address that replaces all currently registered -addresses. -

    -remove -
    Removes from the VLDB the server entry that includes the address specified -by the -oldaddr argument. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes the VLDB server entry that includes the IP -address 192.12.107.214. -

       % vos changeaddr -oldaddr 192.12.107.214 -remove
    -   
    -
    -

    Privilege Required -

    Issuer must be listed in the /usr/afs/etc/UserList file on the -machine specified with the -oldaddr argument and on each database -server machine. -

    Related Information -

    CellServDB (client version) -

    CellServDB (server version) -

    UserList -

    sysid -

    fileserver -

    pts rename -

    vos -

    vos listaddrs -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf258.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf258.htm deleted file mode 100755 index 1dce91dfa..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf258.htm +++ /dev/null @@ -1,165 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos create

    - - - - - - - - - - - - - - - - - - -

    Purpose -

    Creates a read/write volume and associated VLDB entry -

    Synopsis -

    vos create -server <machine name>  -partition <partition name>
    -           -name <volume name>  [-maxquota <initial quota (KB)>]  
    -           [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos cr -s <machine name>  -p <partition name>  -na <volume name>
    -       [-m <initial quota (KB)>]  [-c <cell name>]  [-no]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos create command creates a read/write volume with the name -specified by the -name argument at the site specified by the --server and -partition arguments. In addition, -the command allocates or sets the following: -

      -

    • Volume ID numbers for the read/write volume and its associated read-only -and backup volumes (this command does not actually create the latter two types -of volume). A volume ID number is an identification number guaranteed -to be unique within a cell. - - - - - - -

    • An access control list (ACL) associated with the volume's root -directory, which takes the same name as volume's mount point when the -volume is mounted with the fs mkmount command. An entry that -grants all seven permissions to the members of the -system:administrators group is automatically placed on the -ACL. (In addition, the File Server by default always implicitly grants -the l (lookup) and a (administer) -permissions on every ACL to members of the -system:administrators group, even when the group does not -appear on an ACL; use the -implicit argument to the -fileserver initialization command to alter the set of rights on a -server-by-server basis if desired.) -

    • The volume's space quota, set to 5000 kilobyte blocks by -default. Use the -maxquota argument to specify a different -quota, or use the fs setquota command to change the volume's -quota after mounting the volume with the fs mkmount command. -
    -

    The volume is empty when created. To access it via the Cache -Manager, mount it in the file space by using the fs mkmount -command. -

    Options -

    -

    -server -
    Identifies the file server machine on which to create the read/write -volume. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -partition -
    Identifies the partition on which to create the read/write volume, on the -file server machine specified by the -server argument. -Provide the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -name -
    Specifies a name for the read/write volume. The maximum length is -22 characters, which can include any alphanumeric or punctuation -character. By convention, periods separate the fields in a name. -Do not apply the .backup or .readonly -extension to a read/write volume name; they are reserved for the Volume -Server to add to the read/write name when creating those backup and read-only -volumes respectively. -

    -maxquota -
    Specifies the maximum amount of disk space the volume can use, as a number -of kilobyte blocks (a value of 1024 is one megabyte). The -value 0 (zero) grants an unlimited quota, but the size of the disk -partition that houses the volume places an absolute limit on its size. -If this argument is omitted, the default value is 5000. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The Volume Server produces the following message to confirm that it created -the volume: -

       Volume volume_ID created on partition partition_name of machine_name
    -   
    -
    -

    Examples -

    The following command creates the read/write volume -user.pat on the /vicepf partition of the file -server machine fs4.abc.com. -

       % vos create -server fs4.abc.com -partition /vicepf -name user.pat
    -   Volume user.pat created on partition /vicepf of fs4.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf259.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf259.htm deleted file mode 100755 index 58f2f7b6b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf259.htm +++ /dev/null @@ -1,171 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos delentry

    - - - - -

    Purpose -

    Removes a volume entry from the VLDB. -

    Synopsis -

    vos delentry [-id <volume name or ID>+]
    -             [-prefix <prefix of volume whose VLDB entry is to be deleted>] 
    -             [-server <machine name>]  [-partition <partition name>]  
    -             [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  [-help]
    -     
    -vos de [-i <volume name or ID>+]
    -       [-pr <prefix of volume whose VLDB entry is to be deleted>]  
    -       [-s <machine name>]  [-pa <partition name>]  [-c <cell name>] 
    -       [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos delentry command removes the Volume Location Database -(VLDB) entry for each specified volume. A specified volume can be any -of the three types (read/write, read-only, or backup), but the entire entry is -removed no matter which type is provided. The command has no effect on -the actual volumes on file server machines, if they exist. -

    This command is useful if a volume removal operation did not update the -VLDB (perhaps because the vos zap command was used), but the system -administrator does not feel it is necessary to use the vos syncserv -and vos syncvldb commands to synchronize an entire file server -machine. -

    To remove the VLDB entry for a single volume, use the -id -argument. To remove groups of volumes, combine the -prefix, --server, and -partition arguments. The following -list describes how to remove the VLDB entry for the indicated group of -volumes: -

      -

    • For every volume whose name begins with a certain character string (for -example, sys. or user.): use the --prefix argument. -

    • Every volume for which the VLDB lists a site on a certain file server -machine: specify the file server name with the -server -argument. -

    • Every volume for which the VLDB lists a site on a partition of the same -name (for instance, on the /vicepa partition on any file server -machine): specify the partition name with the -partition -argument. -

    • Every volume for which the VLDB lists a site one a specific partition of a -file server machine: specify both the -server and --partition arguments. -

    • Every volume whose name begins with a certain prefix and for which the -VLDB lists a site on a file server machine: combine the --prefix and -server arguments. Combine the --prefix argument with the -partition argument, or both -the -server and -partition arguments, to remove a more -specific group of volumes. -
    -

    Cautions -

    Do not use this command to remove a volume in normal circumstances; it -does not remove a volume from the file server machine, and so is likely to -make the VLDB inconsistent with state of the volumes on server -machines. Use the vos remove command to remove both the -volume and its VLDB entry. -

    Options -

    -

    -id -
    Specifies the complete name or the volume ID number of each volume for -which to remove the VLDB entry. The entire entry is removed, regardless -of whether the read/write, read-only, or backup version is indicated. -Provide this argument or some combination of the -prefix, --server, and -partition arguments. -

    -prefix -
    Specifies a character string of any length; the VLDB entry for a -volume whose name begins with the string is removed. Include field -separators (such as periods) if appropriate. Combine this argument with -the -server argument, -partition argument, or -both. -

    -server -
    Identifies a file server machine; if a volume's VLDB entry lists -a site on the machine, the entry is removed. Provide the machine's -IP address or its host name (either fully qualified or using an unambiguous -abbreviation). For details, see the introductory reference page for the -vos command suite. -

    Combine this argument with the -prefix argument, the --partition argument, or both. -

    -partition -
    Identifies a partition; if a volume's VLDB entry lists a site on -the partition, the entry is removed. Provide the partition's -complete name with preceding slash (for example, /vicepa) or use -one of the three acceptable abbreviated forms. For details, see the -introductory reference page for the vos command suite. -

    Combine this argument with the -prefix argument, the --server argument, or both. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The following message confirms the success of the command by indicating how -many VLDB entries were removed. -

       Deleted number VLDB entries
    -   
    -
    -

    Examples -

    The following command removes the VLDB entry for the volume -user.temp. -

       % vos delentry user.temp
    -   
    -
    -

    The following command removes the VLDB entry for every volume whose name -begins with the string test and for which the VLDB lists a site on -the file server machine fs3.abc.com. -

       % vos delentry -prefix test -server fs3.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos remove -

    vos syncserv -

    vos syncvldb -

    vos zap -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf260.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf260.htm deleted file mode 100755 index 3f6180368..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf260.htm +++ /dev/null @@ -1,193 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos dump

    - - - - - - - - - - - -

    Purpose -

    Converts a volume into ASCII format and writes it to a file -

    Synopsis -

    vos dump -id <volume name or ID>  [-time <dump from time>]  [-file <dump file>]  
    -         [-server <server>]  [-partition <partition>]  [-cell <cell name>]  
    -         [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos du -i <volume name or ID>  [-t <dump from time>]  [-f <dump file>]  
    -       [-s <server>]  [-p <partition>]  [-c <cell name>]  
    -       [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos dump command converts the contents of the indicated -volume, which can be read/write, read-only or backup, into ASCII -format. The Volume Server writes the converted contents to the file -named by the -file argument, or to the standard output -stream. In the latter case, the output can be directed to a named pipe, -which enables interoperation with third-party backup utilities. -

    To dump the complete contents of a volume (create a full dump), -omit the -time argument or specify the value 0 (zero) -for it. To create an incremental dump, which includes only -the files and directories in the volume that have modification timestamps -later than a certain time, specify a date and time as the value for the --time argument. -

    By default, the vos command interpreter consults the Volume -Location Database (VLDB) to learn the volume's location, so the --server and -partition arguments are not -required. If the -id argument identifies a read-only volume -that resides at multiple sites, the command dumps the version from just one of -them (normally, the one listed first in the volume's VLDB entry as -reported by the vos examine or vos listvldb -command). To dump the read-only volume from a particular site, use the --server and -partition arguments to specify the -site. To bypass the VLDB lookup entirely, provide a volume ID number -(rather than a volume name) as the value for the -id argument, -together with the -server and -partition -arguments. This makes it possible to dump a volume for which there is -no VLDB entry. -

    During the dump operation, the volume is inaccessible both to Cache -Managers and to other volume operations. Dumping a volume does not -otherwise affect its status on the partition or its VLDB entry. -

    To restore a dumped volume back into AFS, use the vos restore -command. -

    Cautions -

    Support for incremental dumps is provided to facilitate interoperation with -third-party backup utilities. The vos dump command does not -provide any of the administrative facilities of an actual backup system, so -the administrator must keep manual records of dump times and the relationship -between full and incremental dumps of a volume. For a volume's -contents to be consistent after restoration of incremental dumps, there must -be no gap between the time at which a prior dump of the volume was created and -the value of the -time argument to the vos dump command -that creates the incremental dump. More specifically, for a read/write -volume, the -time argument must specify the time that the prior -dump was performed, and for a read-only or backup volume it must specify the -time that the volume was last released (using the vos release -command) or cloned (using the vos backup or vos -backupsys command) prior to dumping it. The parent dump can be -either a full dump or another incremental dump. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of the read/write, -read-only, or backup volume to dump. -

    -time -
    Specifies whether the dump is full or incremental. Omit this -argument to create a full dump, or provide one of three acceptable -values: -
      -

    • The value 0 (zero) to create a full dump. -

    • A date in the format -mm/dd/yyyy (month, day and -year) to create an incremental dump that includes only files and directories -with modification timestamps later than midnight (12:00 -a.m.) on the indicated date. Valid values for the year -range from 1970 to 2037; higher values are not -valid because the latest possible date in the standard UNIX representation is -in 2038. The command interpreter automatically reduces later dates to -the maximum value. An example is 01/13/1999. -

    • A date and time in the format -"mm/dd/yyyy -hh:MM" to create an incremental -dump that includes only files and directories with modification timestamps -later than the specified date and time. The date format is the same as -for a date alone. Express the time as hours and minutes -(hh:MM) in 24-hour format (for example, -20:30 is 8:30 p.m.). Surround the -entire expression with double quotes (" ") because it contains a space. -An example is "01/13/1999 22:30". -
    -

    -file -
    Specifies the pathname of the file to which to write the dump. The -file can be in AFS, but not in the volume being dumped. A partial -pathname is interpreted relative to the current working directory. If -this argument is omitted, the dump is directed to the standard output -stream. -

    -server -
    Specifies the file server machine on which the volume resides. -Provide the -partition argument along with this one. -

    -partition -
    Specifies the partition on which the volume resides. Provide the --server argument along with this one. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command writes a full dump of the volume -user.terry to the file -/afs/abc.com/common/dumps/terry.dump. -

       % vos dump -id user.terry -time 0 -file /afs/abc.com/common/dumps/terry.dump
    -   
    -
    -

    The following command writes an incremental dump of the volume -user.smith to the file -smith.990131.dump in the current working -directory. Only those files in the volume with modification time stamps -later than 6:00 p.m. on 31 January 1999 are included in -the dump. -

       % vos dump -id user.smith -time "01/31/1999 18:00" -file smith.990131.dump
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    If the -file argument is included, the issuer must also have -permission to insert and write in the directory that houses the file. -

    Related Information -

    vos -

    vos examine -

    vos listvldb -

    vos restore -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf261.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf261.htm deleted file mode 100755 index 2d191474e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf261.htm +++ /dev/null @@ -1,317 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos examine

    - - - - - - - - - - - -

    Purpose -

    Displays information from the volume header and VLDB entry for a -volume. -

    Synopsis -

    vos examine -id <volume name or ID>  [-extended]  [-cell <cell name>]  
    -            [-noauth]  [-localauth]  [-verbose]  [-help]
    -   
    -vos e -i <volume name or ID>  [-e]  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -    
    -vos volinfo -i <volume name or ID>  [-e]  [-c <cell name>]  
    -            [-n]  [-l]  [-v]  [-h]
    -   
    -vos v -i <volume name or ID>  [-e]  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -   
    -
    -

    Description -

    The vos examine command formats and displays information from -the Volume Location Database (VLDB) entry and the volume header of the volume -specified by the -id argument. -

    To display the volume header only, use the vos listvol -command. To display information from the VLDB only, use the vos -listvldb command. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of the volume, -which can be read/write, read-only, or backup. -

    -extended -
    Display statistics about read and write operations on files and -directories in the volume. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The first seven lines of the output show information from the volume header -and the remaining lines come from the VLDB. Each item in the following -list corresponds to a line of output derived from the volume header. -

      -

    • Basic information about the specified volume (displayed on a single -line): -
        -

      • Name -

      • Volume ID number - -

      • Type (the flag is RW for read/write, RO for -read-only, BK for backup) -

      • Size in kilobytes (1024 equals a megabyte) -

      • Number of files in the volume, if the -extended flag is -provided - -

      • Status on the file server machine, which is one of the following: -
        - -

        On-line -
        The volume is completely accessible to Cache Managers. - -

        Off-line -
        The volume is not accessible to Cache Managers, but does not seem to be -corrupted. This status appears while a volume is being dumped, for -example. - -

        Off-line**needs salvage** -
        The volume is not accessible to Cache Managers, because it seems to be -corrupted. Use the bos salvage or salvager -command to repair the corruption. -
        -
      -

    • The file server machine and partition that house the volume, as determined -by the command interpreter as the command runs, rather than derived from the -VLDB or the volume header. - - - - - - - - -

    • The volume ID numbers associated with the various versions of the -volume: read/write (RWrite), read-only (ROnly), -backup (Backup), and ReleaseClone (RClone). One -of them matches the volume ID number that appears on the first line of the -volume's output. If the value in the RWrite, -ROnly, or Backup field is 0 (zero), there is -no volume of that type. If there is currently no ReleaseClone, the -RClone field does not appear at all. - - -

    • The maximum space quota allotted to the read/write copy of the volume, -expressed in kilobyte blocks in the MaxQuota field. - - -

    • The date and time the volume was created, in the Creation -field. If the volume has been restored with the backup -diskrestore, backup volrestore, or vos restore -command, this is the restore time. - - -

    • The date and time when the contents of the volume last changed, in the -Last Update field. For read-only and backup volumes, it -matches the timestamp in the Creation field. - - -

    • The number of times the volume has been accessed for a fetch or store -operation since the later of the two following times: -
        -

      • 12:00 a.m. on the day the command is issued -

      • The last time the volume changed location -
      -
    -

    When the -extended flag is included, two tables appear -next: -

      -

    • The table labeled Raw Read/Write Stats contains information on -the number of reads (fetches) and writes (stores) made on the specified -volume. -

    • The table labeled Writes Affecting Authorship contains -information on writes made to files and directories in the specified -volume. -
    -

    If the following message appears instead of the previously listed -information, it indicates that a volume is not accessible to Cache Managers or -the vos command interpreter, for example because a clone is being -created. -

       **** Volume volume_ID is busy ****
    -
    -

    If the following message appears instead of the previously listed -information, it indicates that the File Server is unable to attach the volume, -perhaps because it is seriously corrupted. The FileLog and -VolserLog log files in the /usr/afs/logs directory on -the file server machine possibly provide additional information; use the -bos getlog command to display them. -

       **** Could not attach volume volume_ID ****
    -
    -

    Following a blank line, information from the VLDB entry appears. -Each item in this list corresponds to a separate line in the output: -

      -

    • The base (read/write) volume name. The read-only and backup -versions have the same name with a .readonly and -.backup extension, respectively. -

    • The volume ID numbers allocated to the versions of the volume that -actually exist, in fields labeled RWrite for the read/write, -ROnly for the read-only, Backup for the backup, and -RClone for the ReleaseClone. (If a field does not appear, -the corresponding version of the volume does not exist.) The appearance -of the RClone field normally indicates that a release operation did -not complete successfully; the Old release and New -release flags often also appear on one or more of the site definition -lines described just following. - - -

    • The number of sites that house a read/write or read-only copy of the -volume, following the string number of sites ->. - - - - - -

    • A line for each site that houses a read/write or read-only copy of the -volume, specifying the file server machine, partition, and type of volume -(RW for read/write or RO for read-only). If a -backup version exists, it is understood to share the read/write site. -Several flags can appear with a site definition: -
      - -

      Not released -
      Indicates that the vos release command has not been issued -since the vos addsite command was used to define the read-only -site. - -

      Old release -
      Indicates that a vos release command did not complete -successfully, leaving the previous, obsolete version of the volume at this -site. - -

      New release -
      Indicates that a vos release command did not complete -successfully, but that this site did receive the correct new version of the -volume. -
      -

    • If the VLDB entry is locked, the string Volume is currently -LOCKED. -
    -

    For further discussion of the New release and Old -release flags, see the reference page for the vos release -command. -

    Examples -

    The following example shows output for the ABC Corporation volume called -usr with two read-only replication sites (this volume is mounted at -the /afs/abc.com/usr directory). For the sake of -illustration, the output shows the volume as locked. -

       % vos examine usr
    -   usr                           536870981 RW   3459 K On-line
    -        fs2.abc.com /vicepb
    -        RWrite 5360870981   ROnly 536870982   Backup 536870983
    -        MaxQuota      40000 K
    -        Creation    Mon Jun 12 15:22:06 1989
    -        Last Update Fri Jun 16 09:34:35 1989
    -        5719 accesses in the past day (i.e., vnode references)
    -        RWrite: 5360870981   ROnly: 536870982   Backup: 536870983
    -        number of sites -> 3
    -           server fs1.abc.com partition /vicepa RO Site 
    -           server fs3.abc.com partition /vicepa RO Site 
    -           server fs2.abc.com partition /vicepb RW Site 
    -        Volume is currently LOCKED  
    -   
    -
    -

    The following example shows the output for the volume -user.terry using the -extended flag. The -volume has no read-only replication sites. -

       % vos examine -id user.terry -extended
    -   user.terry         354287190 RW    2302 K used 119 files On-line
    -       fs4.abc.com /vicepc
    -       RWrite 354287190 ROnly          0 Backup 354287192
    -       MaxQuota       5000 K
    -       Creation    Wed Nov 25 17:38:57 1992
    -       Last Update Tue Dec 15 10:46:20 1992
    -       598 accesses in the past day (i.e., vnode references)
    -                         Raw Read/Write Stats
    -             |-------------------------------------------|
    -             |    Same Network     |    Diff Network     |
    -             |----------|----------|----------|----------|
    -             |  Total   |   Auth   |   Total  |   Auth   |
    -             |----------|----------|----------|----------|
    -   Reads     |       55 |       55 |       38 |       38 |
    -   Writes    |       95 |       95 |        0 |        0 |
    -             |-------------------------------------------|
    -                      Writes Affecting Authorship
    -             |-------------------------------------------|
    -             |   File Authorship   | Directory Authorship|
    -             |----------|----------|----------|----------|
    -             |   Same   |   Diff   |    Same  |   Diff   |
    -             |----------|----------|----------|----------|
    -   0-60 sec  |       38 |        0 |       21 |        1 |
    -   1-10 min  |        2 |        0 |        7 |        0 |
    -   10min-1hr |        0 |        0 |        1 |        0 |
    -   1hr-1day  |        1 |        0 |        5 |        1 |
    -   1day-1wk  |        0 |        0 |        0 |        0 |
    -   > 1wk     |        0 |        0 |        0 |        0 |
    -             |-------------------------------------------|
    -       RWrite: 354287190    Backup: 354287192
    -       number of sites -> 1
    -          server fs4.abc.com partition /vicepc RW Site
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    backup diskrestore -

    backup volrestore -

    bos getlog -

    bos salvage -

    salvager -

    vos -

    vos listvol -

    vos listvldb -

    vos release -

    vos restore -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf262.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf262.htm deleted file mode 100755 index d7d1b61b4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf262.htm +++ /dev/null @@ -1,85 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos help

    - - - -

    Purpose -

    Displays the syntax of specified vos commands or functional -descriptions for all vos commands -

    Synopsis -

    vos help [-topic <help string>+]  [-help]
    -    
    -vos h [-t <help string>+]  [-h]
    -
    -

    Description -

    The vos help command displays the complete online help entry -(short description and syntax statement) for each command operation code -specified by the -topic argument. If the -topic -argument is omitted, the output includes the first line (name and short -description) of the online help entry for every vos command. -

    To list every vos command whose name or short description -includes a specified keyword, use the vos apropos command. -

    Options -

    -

    -topic -
    Identifies each command for which to display the complete online help -entry. Omit the vos part of the command name, providing only -the operation code (for example, specify create, not vos -create). If this argument is omitted, the output briefly -describes every vos command. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The online help entry for each vos command consists of the -following two or three lines: -

      -

    • The first line names the command and briefly describes its -function. -

    • The second line lists aliases for the command, if any. -

    • The final line, which begins with the string Usage, lists the -command's options in the prescribed order. Online help entries use -the same symbols (for example, brackets) as the reference pages in this -document. -
    -

    Examples -

    The following command displays the online help entry for the vos -create command: -

       % vos help create
    -   vos create: create a new volume 
    -   Usage: vos create -server <machine name> -partition <partition name> 
    -   -name <volume name> [-cell <cell name>] [-noauth] [-localauth] 
    -   [-verbose] [-help]
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    vos -

    vos apropos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf263.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf263.htm deleted file mode 100755 index 3f4a43f18..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf263.htm +++ /dev/null @@ -1,103 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos listaddrs

    - - - - - -

    Purpose -

    Displays all VLDB server entries -

    Synopsis -

    vos listaddrs [-cell <cell name>]  [-noauth]
    -              [-localauth]  [-verbose]  [-help]
    -    
    -vos lista [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos listaddrs command displays all of the server entries -from the Volume Location Database (VLDB). An entry is created as the -File Server initializes and registers the contents of its -/usr/afs/local/sysid file in the VLDB. -

    Options -

    -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output displays all server entries from the VLDB, each on its own -line. If a file server machine is multihomed, all of its registered -addresses appear on the line. The first one is the one reported as a -volume's site in the output from the vos examine and vos -listvldb commands. -

    The VLDB records IP addresses, and the command interpreter has the local -name service (either a process like the Domain Name Service or a local host -table) translate them to hostnames before displaying them. If an IP -address appears in the output, it is not possible to translate it. -

    The existence of an entry does not necessarily indicate that the machine -that is still an active file server machine. To remove obsolete server -entries, use the vos changeaddr command with the -remove -argument. -

    Examples -

    The following command displays the VLDB server entries in the ABC -Corporation cell: -

       % vos listaddrs 
    -   sv5.abc.com
    -   sv1.abc.com
    -   sv2.abc.com  afs2.abc.com
    -   sv6.abc.com
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    sysid -

    vos -

    vos changeaddr -

    vos examine -

    vos listvldb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf264.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf264.htm deleted file mode 100755 index 6098c5bb2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf264.htm +++ /dev/null @@ -1,98 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos listpart

    - - - - - -

    Purpose -

    Displays all AFS partitions on a file server machine -

    Synopsis -

    vos listpart -server <machine name>  [-cell <cell name>]  [-noauth]
    -             [-localauth]  [-verbose]  [-help]
    -    
    -vos listp -s <machine name>  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos listpart command displays all of the valid AFS -partitions on the indicated file server machine, without consulting the Volume -Location Database (VLDB). The vos partinfo command reports -the size of a partition and the available space on that partition. -

    Options -

    -

    -server -
    Identifies the file server machine for which to list the -partitions. Provide the machine's IP address or its host name -(either fully qualified or using an unambiguous abbreviation). For -details, see the introductory reference page for the vos command -suite. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output consists of a list of partition names of the form -/vicepxx, following the header: -

       The partitions on the server are:
    -   
    -
    -

    The last line of the output reports the total number of partitions. -

    Examples -

    The following command displays the partitions on -fs1.abc.com: -

       % vos listpart fs1.abc.com
    -   The partitions on the server are:
    -       /vicepa     /vicepb     /vicepc     /vicepd
    -   Total:  4
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    vos -

    vos partinfo -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf265.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf265.htm deleted file mode 100755 index f9f59c632..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf265.htm +++ /dev/null @@ -1,231 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos listvldb

    - - - - - - - - - - - -

    Purpose -

    Displays a volume's VLDB entry -

    Synopsis -

    vos listvldb [-name <volume name or ID>]  [-server <machine name>]  
    -             [-partition <partition name>]  [-locked]  [-quiet]  [-nosort]  
    -             [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos listvl [-na <volume name or ID>]  [-s <machine name>]
    -           [-p <partition name>]  [-lock]  [-q]  [-nos]  [-c <cell name>]  
    -           [-noa]  [-loca]  [-v]  [-h]
    -
    -

    Description -

    The vos listvldb command formats and displays information from -the Volume Location Database (VLDB) entry for each volume specified. -The output depends on the combination of options supplied on the command -line. Combine options as indicated to display the desired type of VLDB -entries: -

      -

    • Every entry in the VLDB: provide no options -

    • Every VLDB entry that mentions a certain file server machine as the site -for a volume: specify the machine's name as the -server -argument -

    • Every VLDB entry that mentions a certain partition on any file server -machine as the site for a volume: specify the partition name as the --partition argument -

    • Every VLDB entry that mentions a certain partition on a certain file -server machine as the site for a volume: combine the -server -and -partition arguments -

    • A single VLDB entry: specify a volume name or ID number with the --name argument -

    • The VLDB entry only for the volumes with locked VLDB entries found at a -certain site: combine the -locked flag with any of arguments -that define sites -
    -

    Options -

    -

    -name -
    Specifies either the complete name or volume ID number of a volume of any -of the three types. -

    -server -
    Identifies the file server machine listed as a site in each VLDB entry to -display. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    This argument can be combined with the -partition argument, the --locked flag, or both. -

    -partition -
    Identifies the partition (on the file server machine specified by the --server argument) listed as a site in each VLDB entry to -display. Provide the partition's complete name with preceding -slash (for example, /vicepa) or use one of the three acceptable -abbreviated forms. For details, see the introductory reference page for -the vos command suite. -

    This argument can be combined with the -server argument, the --locked flag, or both. -

    -locked -
    Displays only locked VLDB entries. This flag can be combined with -the -server argument, the -partition argument, or -both. -

    -quiet -
    Suppresses the lines that summarize the number of volumes listed and their -status, which otherwise appear at the beginning and end of the output when the -output includes more than one volume. -

    -nosort -
    Suppresses the default sorting of volume entries alphabetically by volume -name. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    If the output includes more than one VLDB entry, by default the first line -reports which file server machine, partition, or both, houses the -volumes. The final line of output reports the total number of entries -displayed. Including the -quiet flag suppresses these -lines. -

    By default, volumes are sorted alphabetically by volume name. -Including the -nosort flag skips the sorting step, which can speed -up the production of output if there are a large number of entries. -

    The VLDB entry for each volume includes the following information: -

      -

    • The base (read/write) volume name. The read-only and backup -versions have the same name with a .readonly and -.backup extension, respectively. -

    • The volume ID numbers allocated to the versions of the volume that -actually exist, in fields labeled RWrite for the read/write, -ROnly for the read-only, Backup for the backup, and -RClone for the ReleaseClone. (If a field does not appear, -the corresponding version of the volume does not exist.) The appearance -of the RClone field normally indicates that a release operation did -not complete successfully; the Old release and New -release flags often also appear on one or more of the site definition -lines described just following. - - -

    • The number of sites that house a read/write or read-only copy of the -volume, following the string number of sites ->. - - - - - -

    • A line for each site that houses a read/write or read-only copy of the -volume, specifying the file server machine, partition, and type of volume -(RW for read/write or RO for read-only). If a -backup version exists, it is understood to share the read/write site. -Several flags can appear with a site definition: -
      - -

      Not released -
      Indicates that the vos release command has not been issued -since the vos addsite command was used to define the read-only -site. - -

      Old release -
      Indicates that a vos release command did not complete -successfully, leaving the previous, obsolete version of the volume at this -site. - -

      New release -
      Indicates that a vos release command did not complete -successfully, but that this site did receive the correct new version of the -volume. -
      -

    • If the VLDB entry is locked, the string Volume is currently -LOCKED. -
    -

    For further discussion of the New release and Old -release flags, see the reference page for the vos release -command. -

    Examples -

    The following command displays VLDB information for the ABC Corporation -volume called usr, which has two read-only replication sites: -

       % vos listvldb -name usr
    -   usr 
    -    RWrite: 5360870981   ROnly: 536870982   Backup: 536870983
    -    number of sites -> 3
    -       server fs1.abc.com partition /vicepa RO Site 
    -       server fs3.abc.com partition /vicepa RO Site 
    -       server fs2.abc.com partition /vicepb RW Site 
    -   
    -
    -

    The following example shows entries for two of the volumes that reside on -the file server machine fs4.abc.com. The first -VLDB entry is currently locked. There are 508 entries that mention the -machine as a volume site. -

       % vos listvldb -server fs4.abc.com
    -   VLDB entries for server fs4.abc.com
    -       .       .           .        .
    -       .       .           .        .
    -   user.smith 
    -    RWrite: 278541326   ROnly: 278541327   Backup: 278542328
    -    number of sites -> 1
    -      server fs4.abc.com partition /vicepg RW Site 
    -    Volume is currently LOCKED
    -      user.terry
    -    RWrite 354287190   ROnly 354287191   Backup 354287192
    -    number of sites -> 1
    -      server fs4.abc.com partition /vicepc RW Site 
    -      .       .           .        .
    -      .       .           .        .
    -   Total entries: 508
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    vos -

    vos examine -

    vos listvol -

    vos lock -

    vos unlock -

    vos unlockvldb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf266.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf266.htm deleted file mode 100755 index 0335a14ec..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf266.htm +++ /dev/null @@ -1,308 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos listvol

    - - - - - - - - - - - -

    Purpose -

    Displays information from a volume header -

    Synopsis -

    vos listvol -server <machine name>  [-partition <partition name>]
    -            [-fast]  [-long]  [-quiet]  [-extended]  [-cell <cell name>]  
    -            [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos listvo -s <machine name>  [-p <partition name>]  [-f]  [-lon]  
    -           [-q]  [-e]  [-c <cell name>]  [-n]  [-loc]  [-v]  [-h]
    -
    -

    Description -

    The vos listvol command formats and displays the following -information from the volume header of each specified volume: volume -name, volume ID, volume type, size, and status at the server. The -actual information displayed depends on the combination of arguments supplied -when the command is issued. To display volume header information for -various numbers of volumes, combine the command's arguments as -indicated: -

      -

    • For every volume on a file server machine, specify the machine's name -with the -server argument. -

    • For every volume at a particular site, combine the -server -argument with the -partition argument. -
    -

    To display the Volume Location Database (VLDB) entry for one or more -volumes, use the vos listvldb command. To display both the -VLDB entry and the volume header for a single volume, use the vos -examine command. -

    Options -

    -

    -server -
    Identifies the file server machine that houses volumes for which to -display the header. Provide the machine's IP address or its host -name (either fully qualified or using an unambiguous abbreviation). For -details, see the introductory reference page for the vos command -suite. -

    This argument can be combined with the -partition argument, as -well as the -fast, -long, or -extended -flag. -

    -partition -
    Identifies the partition (on the file server machine specified by the --server argument) that houses volumes for which to display the -header. Provide the partition's complete name with preceding slash -(for example, /vicepa) or use one of the three acceptable -abbreviated forms. For details, see the introductory reference page for -the vos command suite. -

    -fast -
    Displays only the volume ID numbers of volumes stored at the site -specified by the -server, and optionally -partition, -argument. Do not combine this flag with the -extended -flag. -

    -long -
    Displays more detailed information about each volume stored at the site -specified by the -server, and optionally -partition, -argument. The information includes the volume IDs of all three volume -types associated with the volume, and the read/write volume's quota, -creation date and update date. -

    -quiet -
    Suppresses the lines that summarize the number of volumes listed and their -status, which otherwise appear at the beginning and end of the output when the -output includes more than one volume. -

    -extended -
    Displays extensive statistics about access patterns for each volume stored -at the site specified by the -server, and optionally --partition, argument. The statistics include the number of -reads and writes to files in the volume, and how recently files and -directories have been updated by their owners or other users. Do not -combine this flag with the -fast flag. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The output is ordered alphabetically by volume name and by default provides -the following information on a single line for each volume: -

      -

    • Name -

    • Volume ID number - -

    • Type (the flag is RW for read/write, RO for -read-only, BK for backup) -

    • Size in kilobytes (1024 equals a megabyte) -

    • Number of files in the volume, if the -extended flag is -provided - -

    • Status on the file server machine, which is one of the following: -
      - -

      On-line -
      The volume is completely accessible to Cache Managers. - -

      Off-line -
      The volume is not accessible to Cache Managers, but does not seem to be -corrupted. This status appears while a volume is being dumped, for -example. - -

      Off-line**needs salvage** -
      The volume is not accessible to Cache Managers, because it seems to be -corrupted. Use the bos salvage or salvager -command to repair the corruption. -
      -
    -

    If the following message appears instead of the previously listed -information, it indicates that a volume is not accessible to Cache Managers or -the vos command interpreter, for example because a clone is being -created. -

       **** Volume volume_ID is busy ****
    -
    -

    If the following message appears instead of the previously listed -information, it indicates that the File Server is unable to attach the volume, -perhaps because it is seriously corrupted. The FileLog and -VolserLog log files in the /usr/afs/logs directory on -the file server machine possibly provide additional information; use the -bos getlog command to display them. -

       **** Could not attach volume volume_ID ****
    -
    -

    The information about individual volumes is bracketed by summary -lines. The first line of output specifies the number of volumes in the -listing. The last line of output summarizes the number of volumes that -are online, offline, and busy. These lines do not appear if the --quiet flag is used. -

    If the -fast flag is added, the output displays only the volume -ID number of each volume, arranged in increasing numerical order. The -final line (which summarizes the number of online, offline, and busy volumes) -is omitted. -

    If the -long flag is included, the output for each volume -includes all of the information in the default listing plus the -following. Each item in this list corresponds to a separate line of -output: -

      -

    • The file server machine and partition that house the volume, as determined -by the command interpreter as the command runs, rather than derived from the -VLDB or the volume header. - - - - - - - - -

    • The volume ID numbers associated with the various versions of the -volume: read/write (RWrite), read-only (ROnly), -backup (Backup), and ReleaseClone (RClone). One -of them matches the volume ID number that appears on the first line of the -volume's output. If the value in the RWrite, -ROnly, or Backup field is 0 (zero), there is -no volume of that type. If there is currently no ReleaseClone, the -RClone field does not appear at all. - - -

    • The maximum space quota allotted to the read/write copy of the volume, -expressed in kilobyte blocks in the MaxQuota field. - - -

    • The date and time the volume was created, in the Creation -field. If the volume has been restored with the backup -diskrestore, backup volrestore, or vos restore -command, this is the restore time. - - -

    • The date and time when the contents of the volume last changed, in the -Last Update field. For read-only and backup volumes, it -matches the timestamp in the Creation field. - - -

    • The number of times the volume has been accessed for a fetch or store -operation since the later of the two following times: -
        -

      • 12:00 a.m. on the day the command is issued -

      • The last time the volume changed location -
      -
    -

    If the -extended flag is included, the output for each volume -includes all of the information reported with the -long flag, plus -two tables of statistics: -

      -

    • The table labeled Raw Read/Write Stats table summarizes the -number of times the volume has been accessed for reading or writing. -

    • The table labeled Writes Affecting Authorship table contains -information on writes made to files and directories in the specified -volume. -
    -

    Examples -

    The following example shows the output for the /vicepb partition -on the file server machine fs2.abc.com when no flags -are provided: -

       % vos listvol -server fs2.abc.com -partition b
    -   Total number of volumes on server fs2.abc.com   \
    -                                       partition /vicepb : 66
    -   sys                  1969534847 RW       1582 K On-line
    -   sys.backup           1969535105 BK       1582 K On-line
    -         .                   .     .         .   .    .
    -         .                   .     .         .   .    .
    -   user.pat             1969534536 RW      17518 K On-line
    -   user.pat.backup      1969534538 BK      17537 K On-line
    -   Total volumes onLine 66 ; Total volumes offLine 0 ;  Total busy 0
    -   
    -
    -

    The following example shows the output when the -fast flag is -added: -

       % vos listvol -server fs2.abc.com -partition b -fast
    -   Total number of volumes on server fs2.abc.com   \
    -                                       partition /vicepb : 66
    -    1969516782
    -    1969516784
    -        .
    -        .
    -    1969535796
    -    
    -
    -

    The following example shows two volumes from the output that appears when -the -long flag is added: -

       % vos listvol -server fs2.abc.com -partition b -long
    -   Total number of volumes on server fs2.abc.com \
    -                                       partition /vicepb: 66
    -         .                   .      .         .   .    .
    -         .                   .      .         .   .    .
    -   user.pat             1969534536 RW      17518 K On-line
    -        fs2.abc.com /vicepb
    -        RWrite 1969534536 ROnly 0        Backup 1969534538 
    -        MaxQuota      20000 K
    -        Creation    Mon Jun 12 09:02:25 1989
    -        Last Update Thu May 20 17:39:34 1999
    -        1573 accesses in the past day (i.e., vnode references)
    -   user.pat.backup      1969534538 BK      17537 K On-line
    -        fs2.abc.com /vicepb
    -        RWrite 1969534536 ROnly 0        Backup 1969534538 
    -        MaxQuota      20000 K
    -        Creation    Tue Jun 13 04:37:59 1989
    -        Last Update Wed May 19 06:37:59 1999
    -        0 accesses in the past day (i.e., vnode references)
    -          .                   .      .         .   .    .
    -          .                   .      .         .   .    .
    -   Total volumes onLine 66 ; Total volumes offLine 0 ; \
    -                                                Total busy 0
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    backup diskrestore -

    backup volrestore -

    bos getlog -

    bos salvage -

    salvager -

    vos -

    vos examine -

    vos listvldb -

    vos restore -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf267.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf267.htm deleted file mode 100755 index cbdcdb55e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf267.htm +++ /dev/null @@ -1,99 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos lock

    - - - - - -

    Purpose -

    Locks a VLDB volume entry -

    Synopsis -

    vos lock -id <volume name or ID>  [-cell <cell name>]  [-noauth] 
    -         [-localauth]  [-verbose]  [-help]
    -   
    -vos lo -i <volume name or ID>  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos lock command locks the Volume Location Database (VLDB) -entry for the indicated volume, blocking any operation that requires a write -to that entry. The lock applies to all of the volume versions -associated with the entry, not just the one specified with the -id -argument. -

    To unlock a single VLDB entry, use the vos unlock -command. To unlock several entries, or all locked entries in the VLDB, -use the vos unlockvldb command. -

    Cautions -

    Do not use this command in normal circumstances. It is useful for -guaranteeing that the volume stays unchanged when there is reason to believe -that volume operations cannot properly lock VLDB volume entries as they -normally do to synchronize with one another. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of a volume of the -any of the three types. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command locks the VLDB entry for -user.terry. -

       % vos lock user.terry
    -    
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos unlock -

    vos unlockvldb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf268.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf268.htm deleted file mode 100755 index 696122c8a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf268.htm +++ /dev/null @@ -1,166 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos move

    - - - - - - - - - -

    Purpose -

    Moves a read/write volume to another site -

    Synopsis -

    vos move -id <volume name or ID>  -fromserver <machine name on source> 
    -         -frompartition <partition name on source> 
    -         -toserver <machine name on destination>  
    -         -topartition <partition name on destination> 
    -         [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  [-help] 
    -    
    -vos m -i <volume name or ID>  -froms <machine name on source> 
    -      -fromp <partition name on source>  -tos <machine name on destination> 
    -      -top <partition name on destination>  [-c <cell name>]  
    -      [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos move command moves the indicated read/write volume from -its current site (specified with the -fromserver and --frompartition arguments) to the destination site (specified with -the -toserver and -topartition arguments). This -command automatically removes the backup copy from the current site, if it -exists. To create a new backup volume at the destination site, use the -vos backup command. -

    This command works on read/write volumes only. To move a read-only -volume, use the vos addsite and vos release commands to -define a new read-only site and release the volume contents to it, and then -use the vos remove command to remove the previous read-only -volume's definition from the Volume Location Database (VLDB) and data -from the partition. To move a backup volume, use this command to move -its read/write source and then issue the vos backup command. -

    Before executing this command, the vos command interpreter -initiates a check that the destination partition contains enough space to -house the volume being moved. If there is not enough space, the move -operation is not attempted and the following message appears: -

       vos: no space on target partition dest_part to move volume volume
    -   
    -
    -

    Cautions -

    Unless there is a compelling reason, do not interrupt a vos move -command in progress. Interrupting a move can result in one or more of -the following inconsistent states: -

      -

    • There are two versions of the volume, one at the source site and one at -the destination site. (If this happens, retain the version identified -by the VLDB and use the vos zap command to remove the other -version.) -

    • The backup version of the volume is stranded at the old site. (If -this happens, use the vos zap command to remove it.) -

    • The volume is off-line. (If this happens, run the bos -salvage command to bring it back on line.) -
    -

    If the <Ctrl-c> interrupt signal is pressed while a vos -move operation is executing, the following message warns of the -consequences and requests confirmation of the kill signal: -

       SIGINT handler: vos move operation in progress
    -   WARNING: may leave AFS storage and metadata in indeterminate state
    -   enter second control-c to exit
    -   
    -
    -

    To confirm termination of the operation, press <Ctrl-c> a -second time; press any other key to continue the operation. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of a read/write -volume. -

    -fromserver -
    Identifies the file server machine where the volume currently -resides. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -frompartition -
    Names the partition where the volume currently resides. Provide the -full partition name (for, example, /vicepa) or one of the -abbreviated forms described on the introductory vos reference -page. -

    -toserver -
    Identifies the file server machine to which to move the volume. -Provide the machine's IP address or its host name (either fully qualified -or using an unambiguous abbreviation). For details, see the -introductory reference page for the vos command suite. -

    -topartition -
    Names the partition to which to move the volume. Provide the full -partition name (for, example, /vicepa) or one of the abbreviated -forms described on the introductory vos reference page. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example moves the volume user.smith from -the /vicepb partition on the file server machine -fs3.abc.com to the /vicepg partition on -the file server machine fs7.abc.com. -

       % vos move -id user.smith -fromserver fs3.abc.com -frompartition b  \
    -              -toserver fs7.abc.com -topartition g
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machines specified with the -toserver and --fromserver arguments and on each database server machine. -If the -localauth flag is included, the issuer must instead be -logged on to a server machine as the local superuser root. -

    Related Information -

    vos -

    vos addsite -

    vos backup -

    vos release -

    vos listvol -

    vos remove -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf269.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf269.htm deleted file mode 100755 index 5cdc644a7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf269.htm +++ /dev/null @@ -1,115 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos partinfo

    - - - - - - - -

    Purpose -

    Reports the available and total space on a partition -

    Synopsis -

    vos partinfo -server <machine name>  [-partition <partition name>] 
    -             [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  [-help]
    -   
    -vos p -s <machine name>  [-p <partition name>]  [-c <cell name>]  
    -      [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos partinfo command reports the amount of space available -and total size on either all of the partitions on the indicated -file server machine (if the -partition argument is omitted) -or the specified partition on that file server machine. The -Volume Location Database (VLDB) is not consulted. -

    Options -

    -

    -server -
    Identifies the file server machine for which to display partition -information. Provide the machine's IP address or its host name -(either fully qualified or using an unambiguous abbreviation). For -details, see the introductory reference page for the vos command -suite. -

    -partition -
    Identifies which partition on the file server machine specified by the --server argument for which to display information. Provide -the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Cautions -

    The partition-related statistics in this command's output do not -always agree with the corresponding values in the output of the standard UNIX -df command. The statistics reported by this command can be -up to five minutes old, because the Cache Manager polls the File Server for -partition information at that frequency. Also, on some operating -systems, the df command's report of partition size includes -reserved space not included in this command's calculation, and so is -likely to be about 10% larger. -

    Output -

    The output reports the amount of space available and total space for each -specified partition. -

    Examples -

    The following command displays all partitions on the file server machine -fs2.abc.com. -

       % vos partinfo fs2.abc.com
    -   Free space on partition /vicepa: 27301 K blocks out of total 549197
    -   Free space on partition /vicepb: 13646 K blocks out of total 69194
    -   Free space on partition /vicepc: 31798 K blocks out of total 320315
    -   Free space on partition /vicepd: 33302 K blocks out of total 494954
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    vos -

    vos listpart -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf270.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf270.htm deleted file mode 100755 index 0eea5d8a2..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf270.htm +++ /dev/null @@ -1,187 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos release

    - - - - - - - - - - - - - - - - - - - - - - - -

    Purpose -

    Updates the contents of read-only volumes to match their read/write source -volume -

    Synopsis -

    vos release -id <volume name or ID>  [-f]  [-cell <cell name>] 
    -            [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos rel -i <volume name or ID>  [-f]  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos release command copies the contents of the indicated -read/write source volume to each read-only site defined in the source -volume's Volume Location Database (VLDB) entry. (Use the vos -addsite command to define sites as necessary before issuing this -command). Each read-only copy has the same name as read/write source -with the addition of a .readonly extension. -

    For users to have a consistent view of the file system, the release of the -new volume version must be atomic: either all read-only sites receive -the new version, or all sites keep the version they currently have. The -vos release command is designed to ensure that all copies of the -volume's read-only version match both the read/write source and each -other. In cases where problems such as machine or server process -outages prevent successful completion of the release operation, AFS uses two -mechanisms to alert the administrator. -

    First, the command interpreter generates an error message on the standard -error stream naming each read-only site that did not receive the new volume -version. Second, during the release operation the Volume Location (VL) -Server marks site definitions in the VLDB entry with flags (New -release and Old release) that indicate whether or not the -site has the new volume version. If any flags remain after the -operation completes, it was not successful. The Cache Manager refuses -to access a read-only site marked with the Old release flag, which -potentially imposes a greater load on the sites marked with the New -release flag. It is important to investigate and eliminate the -cause of the failure and then to issue the vos release command as -many times as necessary to complete the release without errors. -

    The pattern of site flags remaining in the volume's VLDB entry after a -failed release operation can help determine the point at which the operation -failed. Use the vos examine or vos listvldb -command to display the VLDB entry. The VL Server sets the flags in -concert with the Volume Server's operations, as follows: -

      -

    1. Before the operation begins, the VL Server sets the New release -flag on the read/write site definition in the VLDB entry and the Old -release flag on read-only site definitions (unless the read-only site -has been defined since the last release operation and has no actual volume, in -which case its site flag remains Not released). -

    2. If necessary, the Volume Server creates a temporary copy (a -clone) of the read/write source called the ReleaseClone (see the -following discussion of when the Volume Server does or does not create a new -ReleaseClone.) It assigns the ReleaseClone its own volume ID number, -which the VL Server records in the RClone field of the source -volume's VLDB entry. -

    3. The Volume Server distributes a copy of the ReleaseClone to each read-only -site defined in the VLDB entry. As the site successfully receives the -new clone, the VL Server sets the site's flag in the VLDB entry to -New release. -

    4. When all the read-only copies are successfully released, the VL Server -clears all the New release site flags. The ReleaseClone is -no longer needed, so the Volume Server deletes it and the VL Server erases its -ID from the VLDB entry. -
    -

    By default, the Volume Server determines automatically whether or not it -needs to create a new ReleaseClone: -

      -

    • If there are no flags (New release, Old release, or -Not released) on site definitions in the VLDB entry, the previous -vos release command completed successfully and all read-only sites -currently have the same volume. The Volume Server infers that the -current vos release command was issued because the read/write -volume has changed. The Volume Server creates a new ReleaseClone and -distributes it to all of the read-only sites. -

    • If any site definition in the VLDB entry is marked with a flag, either the -previous release operation did not complete successfully or a new read-only -site was defined since the last release. The Volume Server does not -create a new ReleaseClone, instead distributing the existing ReleaseClone to -sites marked with the Old release or Not released -flag. As previously noted, the VL Server marks each VLDB site -definition with the New release flag as the site receives the -ReleaseClone, and clears all flags after all sites successfully receive -it. -
    -

    To override the default behavior, forcing the Volume Server to create and -release a new ReleaseClone to the read-only sites, include the -f -flag. This is appropriate if, for example, the data at the read/write -site has changed since the existing ReleaseClone was created during the -previous release operation. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of a read/write -volume. -

    -f -
    Creates a new ReleaseClone and distributes it all read-only sites -regardless of whether or not any site definitions in the VLDB entry are marked -with a flag. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command clones the read/write volume usr and -releases it to the read-only sites defined in its VLDB entry. -

       % vos release usr
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos addsite -

    vos examine -

    vos listvldb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf271.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf271.htm deleted file mode 100755 index 06e3c10de..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf271.htm +++ /dev/null @@ -1,169 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos remove

    - - - - - - - - -

    Purpose -

    Removes a volume from a site -

    Synopsis -

    vos remove [-server <machine name>]  [-partition <partition name>]
    -           -id <volume name or ID>  [-cell <cell name>]
    -           [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos remo [-s <machine name>]  [-p <partition name>]  -i <volume name or ID> 
    -         [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos remove command removes the indicated volume from the -partition on which it resides. The Volume Location Database (VLDB) -record is altered appropriately, as described in the following -paragraphs. Use this command to remove any of the three types of -volumes; the effect depends on the type. -

      -

    • If the -id argument names the read/write volume (that is, -specifies the volume's base name), both it and the associated backup -volume are removed from the partition that houses them. The --server and -partition arguments are optional, because -there can be only one read/write site. When the volume is removed, the -site information is also removed from the VLDB entry. The read/write -and backup volume ID numbers no longer appear in the output from the vos -listvldb or vos examine commands, but they are preserved -internally. Read-only sites, if any, are not affected, but cannot be -changed unless a read/write site is again defined. The site count -reported by the vos examine and vos listvldb commands as -number of sites decrements by one. The entire VLDB entry is -removed if there are no read-only sites. -

    • If the -id argument names a read-only volume, it is removed -from the partition that houses it, and the corresponding site information is -removed from the VLDB entry. The site count reported by the vos -examine and vos listvldb commands as number of -sites decrements by one for each volume you remove. If there is -more than one read-only site, the -server argument (and optionally --partition argument) must be used to specify the site from which to -remove the volume. If there is only one read-only site, the --id argument is sufficient; if there is also no read/write -volume in this case, the entire VLDB entry is removed. -

    • If the -id argument names a backup volume, it is removed from -the partition that houses it. The -server and --partition arguments are optional, because there can be only one -backup site. The backup volume ID number no longer appears in the -output from the vos listvldb command or in the corresponding -portion of the output from the vos examine command, but is -preserved internally. -
    -

    This command is the most appropriate one for removing volumes in almost all -cases. Other commands that remove only volumes or only VLDB entries -(such as the vos delentry, vos remsite and vos -zap commands) by definition can put the volumes and VLDB out of -sync. Use them only in the special circumstances mentioned on their -reference pages. Like the vos delentry command, this command -can remove a VLDB entry when no corresponding volumes exist on the file server -machine. Like the vos zap command, this command can remove a -volume that does not have a VLDB entry, as long as the volume is online, --server and -partition arguments are provided, and the --id argument specifies the volume's ID number. -

    Options -

    -

    -server -
    Identifies the file server machine that houses the volume to -remove. It is necessary only when the -id argument names a -read-only volume that exists at multiple sites. Provide the -machine's IP address or its host name (either fully qualified or using an -unambiguous abbreviation). For details, see the introductory reference -page for the vos command suite. -

    -partition -
    Identifies the partition (on the file server machine specified by the --server argument) that houses the volume to remove. Provide -the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    Including this argument is necessary only when the -id argument -names a read-only volume that exists at multiple sites. Provide the --server argument along with this one. -

    -id -
    Identifies the volume to remove, either by its complete name or volume ID -number. If identifying a read-only or backup volume by name, include -the appropriate extension (.readonly or -.backup). -
    Note:If the -server and -partition arguments are omitted, -the -id switch must be provided. -
    -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example removes the read/write volume -user.terry and its backup version, if any. -

       % vos remove  -id user.terry
    -   
    -
    -

    The following example removes the read-only volume -root.afs.readonly from one of its sites, the -/vicepa partition on the file server machine -fs1.abc.com. -

       % vos remove fs1.abc.com  a  root.afs.readonly
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos delentry -

    vos remsite -

    vos zap -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf272.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf272.htm deleted file mode 100755 index ec8074de5..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf272.htm +++ /dev/null @@ -1,120 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos remsite

    - - - - - - -

    Purpose -

    Removes a read-only site definition from a VLDB entry -

    Synopsis -

    vos remsite -server <machine name>  -partition <partition name> 
    -            -id <volume name or ID>  [-cell <cell name>]  [-noauth] 
    -            [-localauth]  [-verbose]  [-help]
    -    
    -vos rems -s <machine name>  -p <partition name>  -i <volume name or ID>  
    -         [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos remsite command removes the read-only replication site -specified by the -machine and -partition arguments from -the Volume Location Database (VLDB) entry for the indicated volume, which is -read/write. -

    This command is useful for removing read-only sites that were mistakenly -created with the vos addsite command, before the vos -release command actually releases them. If a read-only copy -already exists at the site, it is not affected. However, if this -read-only site was the last site housing any version of the volume, then the -entire VLDB entry is removed, even if a copy of the read-only version still -actually exists at the site. The VL Server does not correct the -discrepancy until the vos syncserv and vos syncvldb -commands are run. -

    Cautions -

    Do not use this command as the standard way to remove a read-only volume, -because it can create a discrepancy between the VLDB and the volumes on file -server machines. Use the vos remove command instead. -

    Options -

    -

    -server -
    Specifies the file server machine portion of the site definition to -remove. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -partition -
    Specifies the partition name portion of the site definition to -remove. Provide the partition's complete name with preceding slash -(for example, /vicepa) or use one of the three acceptable -abbreviated forms. For details, see the introductory reference page for -the vos command suite. -

    -id -
    Specifies either the complete name or volume ID number of the read/write -volume to remove. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command removes the mistakenly defined read-only site -/viceph on the file server machine -fs5.abc.com from the VLDB entry for the volume -root.cell. -

       % vos remsite -server fs5.abc.com -partition h -id root.cell
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos delentry -

    vos remove -

    vos zap -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf273.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf273.htm deleted file mode 100755 index 2a0aac4a7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf273.htm +++ /dev/null @@ -1,109 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos rename

    - - - - - - - - - - -

    Purpose -

    Renames a volume -

    Synopsis -

    vos rename -oldname <old volume name>  -newname <new volume name> 
    -           [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos ren -o <old volume name>  -ne <new volume name>  [-c <cell name>]
    -        [-no]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos rename command changes the name of the read/write volume -specified with the -oldname argument to the name specified with the --newname argument. The names of the read/write's -read-only copies and backup copy, if any, change automatically to -match. -

    After issuing this command, remember to correct any mount points that refer -to the old volume name, by removing the old mount point with the fs -rmmount command and creating a new one with the fs mkmount -command. -

    Options -

    -

    -oldname -
    Is the current name of the read/write volume. -

    -newname -
    Is the desired new name for the volume. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    The vos rename command produces no output if the command -succeeds. -

    If the volume named by the -oldname argument does not exist, the -following message appears: -

       vos: Could not find entry for volume old volume name.
    -   
    -
    -

    Examples -

    The following example changes the mistaken volume name -sun4x_56.afsws to the correct alternative -sun4x_56.usr.afsws. -

       % vos rename -oldname sun4x_56.afsws -newname sun4x_56.usr.afsws
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf274.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf274.htm deleted file mode 100755 index 6780643f7..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf274.htm +++ /dev/null @@ -1,194 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos restore

    - - - - -

    Purpose -

    Converts an ASCII file into proper volume format and writes it to the file -system -

    Synopsis -

    vos restore -server <machine name>  -partition <partition name>  
    -            -name <name of volume to be restored>  [-file <dump file>]  
    -            [-id <volume ID>]  [-overwrite <abort | full | incremental>]  
    -            [-cell <cell name>]  [-noauth]  [-localauth]  [-verbose]  
    -            [-help]
    -   
    -vos res -s <machine name>  -p <partition name>  
    -        -na <name of volume to be restored>  [-f <dump file>]  
    -        [-i <volume ID>]  [-o <a | f | inc>]  [-c <cell name>]  
    -        [-no]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos restore command converts a volume dump file previously -created with the vos dump command from ASCII into the volume format -appropriate for the machine type indicated by the -server argument, -and restores it as a read/write volume to the partition named by the --partition argument on that machine. The Volume Server -assigns the volume name indicated with the -name argument, and -resets the volume's creation timestamp to the time at which the restore -operation begins (the creation timestamp is stored in the volume header and -reported in the Creation field in the output from the vos -examine and vos listvol commands.) -

    Use the -file argument to name the dump file, or omit the -argument to provide the file via the standard input stream, presumably through -a pipe. The pipe can be named, which enables interoperation with -third-party backup utilities. -

    As described in the following list, the command can create a completely new -volume or overwrite an existing volume. In all cases, the full dump of -the volume must be restored before any incremental dumps. If there are -multiple incremental dump files, they must be restored in the order they were -created. -

      -

    • To create a new read/write volume, use the -name argument to -specify a volume name that does not already exist in the Volume Location -Database (VLDB), and the -server and -partition -arguments to specify the new volume's site. It is best to omit the --id argument so that the Volume Location (VL) Server allocates a -volume ID automatically. Do not include the -overwrite -argument, because there is no existing volume to overwrite. -

    • To overwrite an existing volume at its current site, specify its name and -site with the -name, -server, and -partition -arguments. The volume retains its current volume ID number unless the --id argument is provided. Specify the value f or -i for the -overwrite argument to indicate whether the -dump file is full or incremental, respectively. -

    • To overwrite an existing volume and move it to a new site, specify its -name and the new site with the -name, -server, and --partition arguments. The volume retains its current volume -ID number unless the -id argument is provided. The volume is -removed from its original site. Specify the value f for the --overwrite argument to indicate that the dump file is a full dump -(it is not possible to restore an incremental dump and move the volume at the -same time). -
    -

    If the volume named by the -name argument already exists and the --overwrite argument is omitted, the command interpreter produces -the following prompt: -

    -

       Do you want to do a full/incremental restore or abort? [fia](a):
    -   
    -
    -

    Respond by entering one of the following values: -

      -

    • f if restoring a full dump file -

    • i if restoring an incremental dump file -

    • a or <Return> to cancel the restore operation -
    -

    Cautions -

    If the -file argument is omitted, the issuer must provide all -other necessary arguments, because the standard input stream is unavailable -for responding to the command interpreter's prompts for missing -information. In particular, the issuer must provide the --overwrite argument if overwriting an existing volume. -

    Options -

    -

    -server -
    Identifies the file server machine onto which to restore the -volume. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -partition -
    Identifies the partition (on the file server machine specified by the --server argument) onto which to restore the volume. Provide -the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -name -
    Specifies the name under which to restore the volume. It can be up -to 22 characters long, but cannot end with a .readonly or -.backup extension. If the volume already exists, it -is overwritten subject to the value of the -overwrite -argument. -

    -file -
    Names the dump file to restore. Incomplete pathnames are -interpreted relative to the current working directory. Omit this -argument to provide the dump file via the standard input stream. -

    -id -
    Specifies the volume ID number to assign to the restored volume. -

    -overwrite -
    Specifies which type of dump file is being restored when overwriting an -existing volume. Provide one of the following values: -
      -

    • a to terminate the restore operation. -

    • f if restoring a full dump file. -

    • i if restoring an incremental dump file. This value is -not acceptable if the -server and -partition arguments -do not indicate the volume's current site. -
    -

    -

    This argument is mandatory if the -file argument is not -provided. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command restores the contents of the dump file -/afs/abc.com/common/dumps/terry.dump to the -/vicepc partition on the file server machine -fs3.abc.com. The restored volume is named -user.terry. -

       % cd /afs/abc.com/common/dumps
    -   
    -   % vos restore -file terry.dump -server fs3.abc.com -partition c  \
    -                 -name user.terry
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos dump -

    vos examine -

    vos listvol -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf275.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf275.htm deleted file mode 100755 index 7f1376e8f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf275.htm +++ /dev/null @@ -1,143 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos status

    - - - - - -

    Purpose -

    Reports a Volume Server's status -

    Synopsis -

    vos status -server <machine name>  [-cell <cell name>]  [-noauth]
    -           [-localauth]  [-verbose]  [-help]
    -    
    -vos st -s <machine name>  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos status command reports on what the Volume Server on a -certain file server machine is doing at the moment the command is -issued. If there is no activity, the following message appears: -

       No active transactions on machine_name
    -   
    -
    -

    This command is useful mainly if there is concern that the Volume Server is -not performing requested actions. -

    Options -

    -

    -server -
    Identifies the file server machine running the Volume Server for which to -display status information. Provide the machine's IP address or -its host name (either fully qualified or using an unambiguous -abbreviation). For details, see the introductory reference page for the -vos command suite. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Output -

    There are two possible types of output. -

    The following message indicates that the Volume Server is not currently -performing any actions. -

       No active transactions on machine name
    -   
    -
    -

    The other possible output is a set of information which is probably more -useful to programmers than to system administrators. A full -understanding of all the fields requires familiarity with the code for the -Volume Server, as many of the fields report ID numbers and flag values that -the Volume Server sets for internal use. -

    Among the fields of possible interest to an administrator are: -

      -

    • created on the first line, which indicates the time at which -this transaction started -

    • attachFlags on the second line, where a value of -offline indicates that the volume is not available for other read -or write operations during this transaction -

    • volume on the third line, which specifies the affected -volume's ID number -

    • partition on the third line, which indicates where the affected -volume resides (at the beginning of the transaction if this is a move) -

    • procedure on the third line, which indicates the internal -subprocedure being executed -
    -

    A fourth line can appear during certain transactions, and includes the -following fields: -

      -

    • packetRead tracks whether information is being read into the -volume. Its absolute value is not informative, but the way it changes -shows whether the vos restore command is executing properly. -As the vos status command is issued repeatedly during a restore, -readNext increases monotonically to indicate that information is -being read into the volume. -

    • packetSend tracks whether information is being sent out of the -volume. Its absolute value is not informative, but the way it changes -shows whether the vos dump command is executing properly. As -the vos status command is issued repeatedly during a dump, -transmitNext increases monotonically to indicate that information -is being transferred from the volume into the dump file. -
    -

    The lastReceiveTime and lastSendTime are for internal -use. -

    Examples -

    The following example illustrates the kind of output that sometimes appears -when the Volume Server on fs1.abc.com is executing a -dump at the time this command is issued. -

       % vos status fs1.abc.com
    -   --------------------------------------------
    -   transaction: 575  created: Tue Jan 2 8:34:56 1990
    -   attachFlags: offline
    -   volume: 536871080 partition: /vicepb procedure: Dump
    -   packetRead: 2 lastReceiveTime: 113313 packetSend: 24588
    -       lastSendTime: 113317
    -   --------------------------------------------
    -   
    -
    -

    Privilege Required -

    None -

    Related Information -

    vos -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf276.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf276.htm deleted file mode 100755 index a441271c3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf276.htm +++ /dev/null @@ -1,114 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos syncserv

    - - - - - - - - -

    Purpose -

    Verifies VLDB entries that mention a specified site -

    Synopsis -

    vos syncserv -server <machine name>  [-partition <partition name>] 
    -             [-cell <cell name>]  [-noauth]  [-localauth]  
    -             [-verbose]  [-help]
    -   
    -vos syncs -s <machine name>  [-p <partition name>]  
    -          [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos syncserv command verifies that each volume mentioned in -a VLDB entry actually exists at the site indicated in the entry. It -checks all VLDB entries that mention a read/write, read-only, or backup site -either on any partition on the file server machine specified by the --server argument, or on the one partition specified by the --server and -partition arguments. Note that the -command can end up inspecting sites other than those specified by the --server and -partition arguments, if there are versions -of the volume at sites other than the one specified. -

    The command alters any incorrect information in the VLDB, unless there is -an irreconcilable conflict with other VLDB entries. In that case, it -writes a message to the standard error stream instead. The command -never removes volumes from file server machines. -

    To achieve complete VLDB consistency, first run the vos syncvldb -command on all file server machines in the cell, then run this command on all -file server machines in the cell. -

    Options -

    -

    -server -
    Identifies the file server machine mentioned in each VLDB entry to -check. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -partition -
    Identifies the partition mentioned in each VLDB entry to check. -Provide the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example verifies the VLDB entries in which a site definition -mentions the file server machine fs3.abc.com. -

       % vos syncserv -server fs3.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos syncvldb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf277.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf277.htm deleted file mode 100755 index 74c57cbdd..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf277.htm +++ /dev/null @@ -1,136 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos syncvldb

    - - - - - - - - - -

    Purpose -

    Verifies VLDB entries for volumes residing at specified site -

    Synopsis -

    vos syncvldb [-server <machine name>]  [-partition <partition name>] 
    -             [-volume <volume name or ID>]  [-cell <cell name>]  [-noauth]  
    -             [-localauth]  [-verbose]  [-help]
    -    
    -vos syncv [-s <machine name>]  [-p <partition name>]  [-vo <volume name or ID>] 
    -          [-c <cell name>]  [-n]  [-l]  [-ve]  [-h]
    -
    -

    Description -

    The vos syncvldb command verifies that the status of the volumes -housed either on all partitions on the file server machine specified by the --server argument, or on the single partition specified by the --server and -partition arguments, is recorded correctly -in the VLDB. If the -volume argument is included to indicate -a single volume, the command compares only its status on the file server -machine with its VLDB entry. -

    If the -volume argument is not included, the command interpreter -obtains from the Volume Server a list of the volumes that reside on each -partition, then changes information in the VLDB as necessary to reflect their -state on the partition. For example, it creates or updates a VLDB entry -when it finds a volume for which the VLDB entry is missing or -incomplete. However, if there is already a VLDB entry that defines a -different location for the volume, or there are irreconcilable conflicts with -other VLDB entries, it instead writes a message about the conflict to the -standard error stream. The command never removes volumes from the file -server machine. -

    To achieve complete VLDB consistency, run this command on all file server -machines in the cell, and then run the vos syncserv command on all -file server machines in the cell. -

    Using the -volume argument basically combines the effects of -this command with those of the vos syncserv command, for a single -volume. The command not only verifies that the VLDB entry is correct -for the specified volume type (read/write, backup, or read-only), but also -checks that any related volume types mentioned in the VLDB entry actually -exist at the site listed in the entry. It is not necessary to provide -the -server argument (and optionally, -partition -argument); if one or both is provided, the results are reliable only if -they specify the actual location of the volume indicated by the --volume argument. -

    Options -

    -

    -server -
    Identifies the file server machine housing the volumes for which to verify -VLDB entries. Provide the machine's IP address or its host name -(either fully qualified or using an unambiguous abbreviation). For -details, see the introductory reference page for the vos command -suite. -

    -partition -
    Identifies the partition housing the volumes for which to verify VLDB -entries. Provide the -server argument along with this -one. Provide the partition's complete name with preceding slash -(for example, /vicepa) or use one of the three acceptable -abbreviated forms. For details, see the introductory reference page for -the vos command suite. -

    -volume -
    Specifies the name or volume ID number of a single volume for which to -verify the VLDB entry. This argument can be combined with the --server (and optionally, the -partition) -argument. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example command verifies the VLDB entry for each volume -stored on the file server machine fs4.abc.com. -

       % vos syncvldb fs4.abc.com
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos syncserv -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf278.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf278.htm deleted file mode 100755 index 7dc647257..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf278.htm +++ /dev/null @@ -1,97 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos unlock

    - - - - -

    Purpose -

    Unlocks a single VLDB entry -

    Synopsis -

    vos unlock -id <volume name or ID>  [-cell <cell name>]  [-noauth] 
    -           [-localauth]  [-verbose]  [-help]
    -    
    -vos unlock -i <volume name or ID>  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos unlock command releases the lock on the Volume Location -Database (VLDB) entry for the indicated volume. -

    Cautions -

    Do not user this command under normal circumstances. -

    It is useful if the VLDB entry is locked but there is no reason to suspect -inconsistency within the volume or between it and the VLDB. Note that -it is possible to list information from locked VLDB entries, even though they -cannot be manipulated in other ways. -

    The vos unlockvldb command unlocks several VLDB entries at once, -or even the entire VLDB. The vos lock command locks a VLDB -entry so that no one else can perform an action that requires writing the -VLDB. -

    Options -

    -

    -id -
    Specifies either the complete name or volume ID number of a volume of any -of the three types. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example unlocks the VLDB entry for the volume -user.terry. -

       % vos unlock user.terry
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos lock -

    vos unlockvldb -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf279.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf279.htm deleted file mode 100755 index d38eafb12..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf279.htm +++ /dev/null @@ -1,129 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos unlockvldb

    - - - - -

    Purpose -

    Unlocks several locked VLDB entries -

    Synopsis -

    vos unlockvldb [-server <machine name>]  [-partition <partition name>] 
    -               [-cell <cell name>]  [-noauth]  [-localauth]
    -               [-verbose]  [-help]
    -    
    -vos unlockv [-s <machine name>]  [-p <partition name>]  
    -            [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos unlockvldb command releases the lock on the Volume -Location Database (VLDB) entries indicated by the combination of arguments -provided: -

      -

    • To unlock all entries in the VLDB, provide no arguments -

    • To unlock all entries that mention a file server machine in a site -definition, provide its name with the -server argument -

    • To unlock all entries that mention a partition on any file server machine -in a site definition, provide the partition name with the --partition argument -

    • To unlock all entries that mention a specific site, provide both the --server and -partition arguments. -
    -

    To unlock a single volume, use the vos unlock command -instead. -

    Cautions -

    Do not use this command under normal circumstances. -

    It is useful if VLDB entries for volumes at a certain site are locked but -there is no reason to suspect inconsistency within the volume or between it -and the VLDB. Note that it is possible to list information from locked -VLDB entries, even though they cannot be manipulated in other ways. -

    The vos lock command locks a VLDB entry so that no one else can -perform an action that requires writing the VLDB. -

    Options -

    -

    -server -
    Identifies the file server machine for which to unlock VLDB -entries. Provide the machine's IP address or its host name (either -fully qualified or using an unambiguous abbreviation). For details, see -the introductory reference page for the vos command suite. -

    -partition -
    Identifies the partition (on the file server machine specified by the --server argument) for which to unlock VLDB entries. Provide -the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following command unlocks all locked entries in the VLDB. -

       % vos unlockvldb
    -   
    -
    -

    The following command unlocks all locked VLDB entries that mention the -/vicepa partition in a site definition. -

       % vos unlockvldb -partition a
    -   
    -
    -

    The following command unlocks all locked VLDB entries that refer to volumes -on the /vicepc partition of the file server machine -fs3.abc.com. -

       % vos unlockvldb -server fs3.abc.com -partition c
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos lock -

    vos unlock -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf280.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf280.htm deleted file mode 100755 index d27a2f8dc..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf280.htm +++ /dev/null @@ -1,148 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    vos zap

    - - - - -

    Purpose -

    Removes a volume from its site without writing to the VLDB -

    Synopsis -

    vos zap -server <machine name>  -partition <partition name> 
    -        -id <volume ID>  [-force]  [-backup]  [-cell <cell name>]
    -        [-noauth]  [-localauth]  [-verbose]  [-help]
    -    
    -vos z -s <machine name>  -p <partition name>  -i <volume ID>
    -      [-f]  [-b]  [-c <cell name>]  [-n]  [-l]  [-v]  [-h]
    -
    -

    Description -

    The vos zap command removes the volume with the specified -volume ID from the site defined by the -server and --partition arguments, without attempting to change the -corresponding Volume Location Database (VLDB) entry. If removing the -volume can possibly result in incorrect data in the VLDB, a warning message is -displayed. -

    The -force flag removes a volume even if it cannot be "attached" -(brought online), which can happen either because the volume is extremely -damaged or because the Salvager functioned abnormally. Without this -flag, this command cannot remove volumes that are not attachable. See -also the Cautions section. -

    To remove the specified read/write volume's backup version at the same -time, include the -backup flag. -

    Cautions -

    Do not use this command as the standard way to remove a volume, as it is -likely to put the VLDB out of sync with the volumes on servers. Use the -vos remove command instead. -

    This command is useful in situations where it is important to delete the -volume, but for some reason the VLDB is unreachable--for example, because -s the Volume Location Server is unavailable. The issuer can remove the -VLDB entry later with the vos remove or vos delentry -command, or it is removed automatically when the vos syncserv and -vos syncvldb commands run. -

    To remove a read-only site defined in the VLDB by mistake, before a copy -actually exists at the site, use the vos remsite command. To -remove an entire VLDB entry without affecting volumes at their sites, use the -vos delentry command. -

    Do not use the -force flag if the volume is online, but only -when attempts to remove the volume with the vos remove or the -vos zap command have failed, or the volume definitely cannot be -attached. After using the -force flag, make sure that the -volume's VLDB entry is also removed (issue the vos delentry -command if necessary). -

    Adding the -force flag makes the command take considerably -longer--about as long as a salvage of the relevant partition--since -the Volume Server examines all inodes on the partition for traces of the -volume. -

    Options -

    -

    -server -
    Identifies the file server machine from which to remove the volume. -Provide the machine's IP address or its host name (either fully qualified -or using an unambiguous abbreviation). For details, see the -introductory reference page for the vos command suite. -

    -partition -
    Identifies the partition (on the file server machine specified by the --server argument) from which to remove the volume. Provide -the partition's complete name with preceding slash (for example, -/vicepa) or use one of the three acceptable abbreviated -forms. For details, see the introductory reference page for the -vos command suite. -

    -id -
    Specifies the volume ID number of the volume to remove, which can be of -any of the three types. The volume name is not acceptable. -

    -force -
    Removes the volume even though it cannot be attached (brought -online). Use only after the failure of previous attempts to remove the -volume by using the vos remove command or the vos -command without this flag. -

    -backup -
    Removes the backup version of the read/write volume specified by the --id argument. Do not use this flag if the -id -argument identifies a read-only or backup volume. -

    -cell -
    Names the cell in which to run the command. Do not combine this -argument with the -localauth flag. For more details, see the -introductory vos reference page. -

    -noauth -
    Assigns the unprivileged identity anonymous to the -issuer. Do not combine this flag with the -localauth -flag. For more details, see the introductory vos reference -page. -

    -localauth -
    Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The vos command -interpreter presents it to the Volume Server and Volume Location Server during -mutual authentication. Do not combine this flag with the --cell argument or -noauth flag. For more details, -see the introductory vos reference page. -

    -verbose -
    Produces on the standard output stream a detailed trace of the -command's execution. If this argument is omitted, only warnings -and error messages appear. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Examples -

    The following example removes the volume with volume ID 536870988 from the -/vicepf partition of the file server machine -fs6.abc.com, without noting the change in the -VLDB. -

       % vos zap -server fs6.abc.com -partition f -id 536870988
    -   
    -
    -

    Privilege Required -

    The issuer must be listed in the /usr/afs/etc/UserList file on -the machine specified with the -server argument and on each -database server machine. If the -localauth flag is included, -the issuer must instead be logged on to a server machine as the local -superuser root. -

    Related Information -

    vos -

    vos delentry -

    vos remove -

    vos remsite -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf281.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf281.htm deleted file mode 100755 index fea7fbf43..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf281.htm +++ /dev/null @@ -1,60 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    xfs_size_check

    - - -

    Purpose -

    Verifies proper inode configuration -

    Synopsis -

    xfs_size_check
    -
    -

    Description -

    The xfs_size_check command, when run on a file server machine -that runs IRIX version 6.2 or higher and uses XFS-formatted partitions -as server partitions (conventionally mounted at /vicep -directories), verifies that each partition uses 512-byte inodes. AFS -stores information in the inodes on server partitions, and the 256-byte inode -size that XFS uses by default is not large enough. -

    Cautions -

    This command is available on in the AFS distribution for IRIX system types -that can use XFS-formatted partitions as server partitions. -

    Output -

    If all server partitions are properly configured, the command produces no -output. Otherwise, it prints the following header: -

       Need to remake the following partitions:
    -   
    -
    -

    and then the following message for each partition on which to run the IRIX -mkfs command with the indicated options: -

       device: mkfs -t xfs -i size=512 -l size=4000b device
    -   
    -
    -

    where device is in a format like /dev/dsk/dks0d0s0 for -a single disk partition or /dev/xlv/xlv0 for a logical -volume. -

    Privilege Required -

    The issuer must be logged in as the local superuser root. -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf282.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf282.htm deleted file mode 100755 index 3cceb694e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf282.htm +++ /dev/null @@ -1,97 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    xstat_cm_test

    - - -

    Purpose -

    Displays data collections from the Cache Manager -

    Synopsis -

    xstat_cm_test [initcmd] -cmname <Cache Manager name(s) to monitor>+
    -              -collID <Collection(s) to fetch>+  [-onceonly]  
    -              [-frequency <poll frequency, in seconds>]  
    -              [-period <data collection time, in minutes>]  [-debug]  [-help]
    -   
    -xstat_cm_test [i] -cm <Cache Manager name(s) to monitor>+
    -              -co <Collection(s) to fetch>+  [-o]  
    -              [-f <poll frequency, in seconds>]  
    -              [-p <data collection time, in minutes>]  [-d]  [-h]
    -
    -

    Description -

    The xstat_cm_test command tests the routines in the -libxstat_cm.a library and displays the data collections -associated with the Cache Manager. The command executes in the -foreground. -

    The command produces a large volume of output; to save it for later -analysis, direct it to a file. -

    Options -

    -

    initcmd -
    Accommodates the command's use of the AFS command parser, and is -optional. -

    -cmname -
    Specifies the fully qualified hostname of each client machine for which to -monitor the Cache Manager. -

    -collID -
    Specifies each data collection to return, which defines the type and -amount of data the command interpreter gathers about the Cache Manager. -Data is returned in a predefined data structure. -

    There are three acceptable values: -

    -

    0 -
    Provides profiling information about the numbers of times different -internal Cache Manager routines were called since the Cache Manager -started. -

    1 -
    Reports various internal performance statistics related to the Cache -Manager (for example, statistics about how effectively the cache is being used -and the quantity of intracell and intercell data access). -

    2 -
    Reports all of the internal performance statistics provided by the -1 setting, plus some additional, detailed performance figures (for -example, statistics about the number of RPCs sent by the Cache Manager and how -long they take to complete, and statistics regarding authentication, access, -and PAG information associated with data access). -
    -

    -onceonly -
    Gathers statistics just one time. Omit this flag to have the -command continue to probe the Cache Manager for statistics at the frequency -specified by the -frequency argument; in this case press -<Ctrl-c> to stop the probes. -

    -frequency -
    Sets the frequency in seconds at which the program initiates probes to the -Cache Manager. The default is 30 seconds. -

    -period -
    Sets the number of minutes the program runs; at the end of this -period of time, the program exits. The default is 10 minutes. -

    -debug -
    Displays a trace on the standard output stream as the command runs. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Related Information -

    xstat_fs_test -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf283.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf283.htm deleted file mode 100755 index 5b319dc2e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf283.htm +++ /dev/null @@ -1,96 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -

    xstat_fs_test

    - - -

    Purpose -

    Displays data collections from the File Server process -

    Synopsis -

    xstat_fs_test [initcmd] -fsname <File Server name(s) to monitor>+
    -              -collID <Collection(s) to fetch>+  [-onceonly]
    -              [-frequency <poll frequency, in seconds>]
    -              [-period <data collection time, in minutes>]  [-debug] [-help]
    -   
    -xstat_fs_test [initcmd] -fs <File Server name(s) to monitor>+
    -              -c <Collection(s) to fetch>+  [-o]
    -              [-fr <poll frequency, in seconds>]
    -              [-p <data collection time, in minutes>]  [-d] [-h]
    -
    -

    Description -

    The xstat_fs_test command tests the routines in the -libxstat_fs.a library and displays the data collections -associated with the File Server (the fs process). The -command executes in the foreground. -

    The command produces a large volume of output; to save it for later -analysis, direct it to a file. -

    Options -

    -

    initcmd -
    Accommodates the command's use of the AFS command parser, and is -optional. -

    -fsname -
    Specifies the fully qualified hostname of each file server machine for -which to monitor the File Server process. -

    -collID -
    Specifies each data collection to return, which defines the type and -amount of data the command interpreter gathers about the File Server. -Data is returned in a predefined data structure. -

    There are three acceptable values: -

    -

    0 -
    Provides profiling information about the numbers of times different -internal File Server routines were called since the File Server -started. This value is not currently implemented; it returns no -data. -

    1 -
    Reports various internal performance statistics related to the File Server -(for example, vnode cache entries and Rx protocol activity). -

    2 -
    Reports all of the internal performance statistics provided by the -1 setting, plus some additional, detailed performance figures about -the File Server (for example, minimum, maximum, and cumulative statistics -regarding File Server RPCs, how long they take to complete, and how many -succeed). -
    -

    -onceonly -
    Gathers statistics just one time. Omit this flag to have the -command continue to probe the Cache Manager for statistics at the frequency -specified by the -frequency argument; in this case press -<Ctrl-c> to stop the probes. -

    -frequency -
    Sets the frequency in seconds at which the program initiates probes to the -Cache Manager. The default is 30 seconds. -

    -period -
    Sets the number of minutes the program runs; at the end of this -period of time, the program exits. The default is 10 minutes. -

    -debug -
    Displays a trace on the standard output stream as the command runs. -

    -help -
    Prints the online help for this command. All other valid options -are ignored. -
    -

    Related Information -

    xstat_cm_test -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf284.htm b/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf284.htm deleted file mode 100755 index 973a81a10..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/CmdRef/auarf284.htm +++ /dev/null @@ -1,4966 +0,0 @@ - - -Administration Reference - - - - - - - - - - - -

    Administration Reference

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic]

    -

    -


    Index

    -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -
    -A - -
  • A instruction - -
  • uss template file -(1) -
  • -
  • access - -
  • count, in volume header -(1), (2) -
  • -
  • access control list - -
  • see entry: ACL -(1) -
  • -
  • ACL - -
  • adding entries -(1) -
  • all shorthand notation -(1) -
  • cleaning -(1) -
  • clearing -(1) -
  • copying -(1) -
  • default set by vos create command -(1) -
  • defined -(1) -
  • displaying -(1) -
  • none shorthand notation -(1) -
  • read shorthand notation -(1) -
  • removing entries -(1) -
  • removing obsolete AFS UIDs -(1) -
  • setting -(1) -
  • setting with uss -(1), (2) -
  • shorthand notation for permissions -(1) -
  • write shorthand notation -(1) -
  • -
  • active clients statistic in scout -(1) -
  • add instruction in uss bulk input file -(1) -
  • adding - -
  • ACL permissions entry -(1) -
  • database server machine to CellServDB file (server) -(1) -
  • dump level to Backup System dump hierarchy -(1) -
  • privileged user to UserList file -(1) -
  • read-only site definition in VLDB -(1) -
  • server encryption key to KeyFile file -(1) -
  • Tape Coordinator entry to Backup Database -(1) -
  • user or machine to group -(1) -
  • volume entry to volume set in Backup Database -(1), (2) -
  • volume set definition to Backup Database -(1) -
  • -
  • admin argument - -
  • on uss commands -(1) -
  • -
  • ADMIN flag in Authentication Database entry -(1), (2) -
  • administrative file - -
  • see entry: files -(1) -
  • -
  • admin_username argument - -
  • on all kas commands -(1) -
  • -
  • AFS Backup System - -
  • see entry: Backup System -(1) -
  • -
  • AFS GID (group ID) - -
  • assigning to group -(1) -
  • learning given group name -(1) -
  • -
  • AFS server process - -
  • see entry: server process -(1) -
  • -
  • AFS tape name - -
  • see entry: tape (Backup System) -(1) -
  • -
  • AFS UID - -
  • assigning in uss -(1) -
  • assigning to user or machine with pts createuser command -(1) -
  • displaying -(1) -
  • learning given user/machine name -(1) -
  • removing obsolete from ACL -(1) -
  • -
  • afsd command -(1) -
  • afsmonitor - -
  • configuration file -(1) -
  • -
  • afsmonitor program - -
  • initialization command -(1) -
  • setting terminal type -(1) -
  • -
  • afszcm.cat file -(1) -
  • all shorthand notation for ACL permissions -(1) -
  • all-or-nothing release of read-only volumes -(1) -
  • appended dump - -
  • displaying record for -(1) -
  • see entry: dump -(1) -
  • -
  • ASK instruction in CFG_device_name file -(1) -
  • assigning - -
  • AFS GID to group -(1) -
  • AFS UID to user -(1) -
  • -
  • at-sys (@sys) variable in pathnames -(1), (2) -
  • authenticated identity - -
  • acquiring on NFS client of non-supported type -(1) -
  • acquiring with klog -(1) -
  • discarding while in kas interactive mode -(1) -
  • -
  • authentication - -
  • imposing restrictions with kas -(1) -
  • imposing restrictions with uss template A instruction -(1) -
  • -
  • Authentication Database - -
  • changing/setting password in -(1) -
  • creating entry -(1) -
  • deleting entry -(1) -
  • displaying all entries -(1) -
  • displaying entry -(1) -
  • displaying key -(1) -
  • entry, creating with uss -(1) -
  • entry, deleting with uss -(1) -
  • files constituting -(1) -
  • information in -(1) -
  • setting flags and expiration dates -(1) -
  • setting key field using password -(1) -
  • setting password in -(1) -
  • status, verifying -(1) -
  • -
  • Authentication Server - -
  • displaying statistics -(1) -
  • displaying traces of privileged actions -(1) -
  • listed in client CellServDB file -(1) -
  • listed in server CellServDB file -(1) -
  • log file -(1) -
  • log files for privileged actions -(1) -
  • starting -(1) -
  • unlocking locked user account -(1) -
  • -
  • AuthLog file -(1) -
  • AuthLog.dir and AuthLog.pag files -(1) -
  • authorization checking - -
  • NoAuth file -(1) -
  • setting requirements on server machine -(1) -
  • -
  • automatic restart times for BOS Server - -
  • see entry: restart times for BOS Server -(1) -
  • -
  • AUTOQUERY instruction in CFG_device_name file -(1) -
  • availability of data - -
  • interrupted by dumping -(1) -
  • -
  • -B - -
  • B instruction - -
  • package configuration file -(1) -
  • -
  • backup - -
  • see entry: backup commands -(1) -
  • see entry: Backup System -(1) -
  • -
  • backup commands - -
  • adddump -(1) -
  • addhost -(1) -
  • addvolentry -(1), (2) -
  • addvolset -(1) -
  • apropos -(1) -
  • common options -(1) -
  • dbverify -(1) -
  • deldump -(1) -
  • deletedump -(1) -
  • delhost -(1) -
  • delvolentry -(1) -
  • delvolset -(1) -
  • diskrestore -(1) -
  • dump -(1) -
  • dumpinfo -(1) -
  • help -(1) -
  • interactive -(1) -
  • introduction -(1) -
  • jobs -(1) -
  • kill -(1) -
  • labeltape -(1) -
  • listdumps -(1) -
  • listhosts -(1) -
  • listvolsets -(1) -
  • privilege requirements -(1) -
  • quit -(1) -
  • readlabel -(1) -
  • restoredb -(1) -
  • savedb -(1) -
  • scantape -(1) -
  • setexp -(1) -
  • status -(1) -
  • volinfo -(1) -
  • volrestore -(1) -
  • volsetrestore -(1) -
  • -
  • Backup Database - -
  • dump hierarchy, displaying -(1) -
  • dump level, creating -(1) -
  • dump level, removing -(1) -
  • dump record, deleting -(1) -
  • dump record, displaying -(1) -
  • expiration date, setting on existing dump level -(1) -
  • expiration date, setting on new dump level -(1) -
  • files constituting -(1) -
  • information recorded -(1) -
  • port offset number, assigning to Tape Coordinator -(1) -
  • port offset number, displaying -(1) -
  • restoring from tape -(1) -
  • saving to tape -(1) -
  • status, verifying -(1) -
  • Tape Coordinator entry, creating -(1) -
  • Tape Coordinator entry, deleting -(1) -
  • Tape Coordinator entry, displaying -(1) -
  • volume dump history, displaying -(1) -
  • volume entry in volume set, displaying -(1) -
  • volume entry, adding to volume set -(1), (2) -
  • volume entry, removing from volume set -(1) -
  • volume set, creating -(1) -
  • volume set, deleting -(1) -
  • volume set, restoring -(1) -
  • -
  • backup extension on volume name -(1) - -
  • added by vos backup command -(1) -
  • added by vos backupsys command -(1) -
  • -
  • Backup field in volume header -(1), (2) -
  • Backup Server - -
  • initialization command -(1) -
  • listed in client CellServDB file -(1) -
  • listed in server CellServDB file -(1) -
  • log file -(1), (2) -
  • -
  • Backup System - -
  • Backup Server process, starting -(1) -
  • database (see entry: Backup Database) -(1) -
  • interactive mode, entering -(1) -
  • interactive mode, exiting -(1) -
  • job ID number, displaying -(1) -
  • job ID number, using to halt operation -(1) -
  • operations, displaying pending and running -(1) -
  • operations, halting in interactive mode -(1) -
  • regular expressions -(1) -
  • tape capacity, displaying from label -(1) -
  • tape capacity, recording on label -(1) -
  • Tape Coordinator, initializing -(1) -
  • tape, creating label -(1) -
  • tape, displaying label -(1) -
  • -
  • backup volume - -
  • creating -(1) -
  • creating many at once -(1) -
  • dumping -(1) -
  • ID number -(1) -
  • ID number in volume header -(1), (2) -
  • moving -(1) -
  • name, changing -(1) -
  • removed by read/write move -(1) -
  • removed by read/write removal -(1) -
  • removing -(1) -
  • -
  • BackupLog file -(1) -
  • BAK version of binary file - -
  • creation by bos install command -(1) -
  • listing time stamp on -(1) -
  • removing from /usr/afs/bin directory -(1) -
  • use by bos uninstall command -(1) -
  • -
  • Basic OverSeer Server - -
  • see entry: BOS Server -(1) -
  • -
  • bdb.DB0 file -(1) -
  • bdb.DBSYS1 file -(1) -
  • binary distribution machine -(1), (2) -
  • binary file - -
  • installing -(1) -
  • listing time stamp on -(1) -
  • uninstalling -(1) -
  • -
  • block special device - -
  • defining with package -(1) -
  • -
  • bos commands - -
  • addhost -(1) -
  • addkey -(1) -
  • adduser -(1) -
  • apropos -(1) -
  • common options -(1) -
  • create -(1) -
  • delete -(1) -
  • exec -(1) -
  • getcell (see entry: listhosts) -(1) -
  • getdate -(1) -
  • getlog -(1) -
  • getrestart -(1) -
  • help -(1) -
  • install -(1) -
  • listhosts -(1) -
  • listkeys -(1) -
  • listusers -(1) -
  • privilege requirements -(1) -
  • prune -(1) -
  • removehost -(1) -
  • removekey -(1) -
  • removeuser -(1) -
  • restart -(1) -
  • salvage -(1) -
  • setauth -(1) -
  • setcellname -(1) -
  • setrestart -(1) -
  • shutdown -(1) -
  • start -(1) -
  • startup -(1) -
  • status -(1) -
  • stop -(1) -
  • uninstall -(1) -
  • -
  • BOS Server -(1) - -
  • memory state -(1) -
  • restart times, displaying -(1) -
  • restart times, setting -(1) -
  • restarting -(1) -
  • SALVAGE.fs file, response to -(1) -
  • starting -(1) -
  • -
  • BosConfig file -(1) - -
  • creating entry with bos create command -(1) -
  • displaying entry with bos status command -(1) -
  • removing entry with bos delete command -(1) -
  • -
  • BosLog file -(1) -
  • bosserver command -(1) -
  • BUFFERSIZE instruction in CFG_device_name file -(1) -
  • bulk input file - -
  • see entry: uss bulk input file -(1) -
  • -
  • bulk mode in uss -(1) -
  • buserver command -(1) -
  • buserver process - -
  • creating with bos create command -(1) -
  • -
  • butc command -(1) -
  • -C - -
  • C instruction - -
  • package configuration file -(1) -
  • -
  • Cache Manager - -
  • changing database server machines known to -(1) -
  • configuring with afsd -(1) -
  • configuring with fs commands -(1) -
  • disabling messages -(1) -
  • displaying amount of cache used -(1) -
  • displaying cache size -(1) -
  • displaying database server machines known to -(1) -
  • displaying inaccessible server machines -(1) -
  • displaying server machine preference ranks -(1) -
  • flushing directory/file from data cache -(1) -
  • flushing entire volume from data cache -(1) -
  • flushing mount point from data cache -(1) -
  • initializing with afsd -(1) -
  • interfaces not registered with File Server, setting -(1) -
  • interfaces registered with File Server, displaying -(1) -
  • interfaces registered with File Server, setting -(1), (2) -
  • logging messages -(1) -
  • monitoring status with afsmonitor -(1) -
  • NetInfo file -(1) -
  • NetRestrict file -(1) -
  • setting cache size -(1) -
  • setting server machine preference ranks -(1) -
  • setting the interval between server probes -(1) -
  • volume name to ID mapping, forcing update of -(1) -
  • VolumeItems file -(1) -
  • -
  • cache-related file - -
  • see entry: files -(1) -
  • -
  • CacheItems file -(1) -
  • cell - -
  • client -(1), (2) -
  • database server machines listed in client CellServDB file -(1) -
  • database server machines listed in server CellServDB file -(1) -
  • membership of client machine -(1) -
  • membership of server machine -(1) -
  • name, setting -(1) -
  • setuid status, displaying -(1) -
  • setuid status, setting -(1) -
  • -
  • cell argument - -
  • on backup commands -(1) -
  • on bos commands -(1) -
  • on kas commands -(1) -
  • on pts commands -(1) -
  • on uss commands -(1) -
  • on vos commands -(1) -
  • -
  • CellServDB file (client version) -(1) - -
  • displaying contents as copied into kernel memory -(1) -
  • -
  • CellServDB file (server version) -(1) - -
  • adding entry with bos addhost command -(1) -
  • creating with bos setcellname command -(1) -
  • displaying contents with bos listhosts command -(1) -
  • removing entry with bos removehost command -(1) -
  • -
  • cellular mount point -(1) -
  • CFG_device_name file -(1) -
  • changing - -
  • data cache size -(1) -
  • database server machines listed in client kernel -(1) -
  • name of Protection Database entry -(1) -
  • owner of Protection Database entry -(1) -
  • password in Authentication Database -(1) -
  • volume name -(1) -
  • volume quota -(1) -
  • -
  • character special device - -
  • defining with package -(1) -
  • -
  • character string - -
  • converting to octal key form -(1) -
  • -
  • checking - -
  • AFS client as exporter non-AFS file system -(1) -
  • server machine status -(1) -
  • -
  • cleaning - -
  • ACL -(1) -
  • -
  • clearing - -
  • ACL -(1) -
  • -
  • client machine - -
  • as exporter of non-AFS file system -(1) -
  • cell membership -(1) -
  • changing database server machines known to -(1) -
  • changing size of data cache -(1) -
  • configuring local disk with package -(1) -
  • displaying database server machines known to -(1) -
  • displaying home cell of -(1) -
  • displaying system type -(1), (2) -
  • setting system type -(1) -
  • -
  • client machines statistic in scout -(1) -
  • client portion of Update Server - -
  • see entry: upclient process -(1) -
  • -
  • clone -(1) - -
  • forcing creation of new -(1) -
  • -
  • cloning - -
  • for backup -(1), (2) -
  • volume for replication -(1) -
  • -
  • commands - -
  • afsd -(1) -
  • afsmonitor -(1) -
  • backup (introduction) -(1) -
  • backup adddump -(1) -
  • backup addhost -(1) -
  • backup addvolentry -(1), (2) -
  • backup addvolset -(1) -
  • backup apropos -(1) -
  • backup dbverify -(1) -
  • backup deldump -(1) -
  • backup deletedump -(1) -
  • backup delhost -(1) -
  • backup delvolentry -(1) -
  • backup delvolset -(1) -
  • backup diskrestore -(1) -
  • backup dump -(1) -
  • backup dumpinfo -(1) -
  • backup help -(1) -
  • backup interactive -(1) -
  • backup jobs -(1) -
  • backup kill -(1) -
  • backup labeltape -(1) -
  • backup listdumps -(1) -
  • backup listhosts -(1) -
  • backup listvolsets -(1) -
  • backup quit -(1) -
  • backup readlabel -(1) -
  • backup restoredb -(1) -
  • backup savedb -(1) -
  • backup scantape -(1) -
  • backup setexp -(1) -
  • backup status -(1) -
  • backup volinfo -(1) -
  • backup volrestore -(1) -
  • backup volsetrestore -(1) -
  • bos (introduction) -(1) -
  • bos addhost -(1) -
  • bos addkey -(1) -
  • bos adduser -(1) -
  • bos apropos -(1) -
  • bos create -(1) -
  • bos delete -(1) -
  • bos exec -(1) -
  • bos getdate -(1) -
  • bos getlog -(1) -
  • bos getrestart -(1) -
  • bos help -(1) -
  • bos install -(1) -
  • bos listhosts -(1) -
  • bos listkeys -(1) -
  • bos listusers -(1) -
  • bos prune -(1) -
  • bos removehost -(1) -
  • bos removekey -(1) -
  • bos removeuser -(1) -
  • bos restart -(1) -
  • bos salvage -(1) -
  • bos setauth -(1) -
  • bos setcellname -(1) -
  • bos setrestart -(1) -
  • bos shutdown -(1) -
  • bos start -(1) -
  • bos startup -(1) -
  • bos status -(1) -
  • bos stop -(1) -
  • bos uninstall -(1) -
  • bosserver -(1) -
  • buserver -(1) -
  • butc -(1) -
  • dlog -(1) -
  • dpass -(1) -
  • executing remotely -(1) -
  • fileserver -(1) -
  • fms -(1) -
  • fs apropos -(1) -
  • fs checkservers -(1) -
  • fs checkvolumes -(1) -
  • fs cleanacl -(1) -
  • fs copyacl -(1) -
  • fs diskfree -(1) -
  • fs examine -(1) -
  • fs exportafs -(1) -
  • fs flush -(1) -
  • fs flushmount -(1) -
  • fs flushvolume -(1) -
  • fs getcacheparms -(1) -
  • fs getcellstatus -(1) -
  • fs getclientaddrs -(1) -
  • fs getserverprefs -(1) -
  • fs help -(1) -
  • fs listacl -(1) -
  • fs listcells -(1) -
  • fs listquota -(1) -
  • fs lsmount -(1) -
  • fs messages -(1) -
  • fs mkmount -(1) -
  • fs newcell -(1) -
  • fs quota -(1) -
  • fs rmmount -(1) -
  • fs setacl -(1) -
  • fs setcachesize -(1) -
  • fs setcell -(1) -
  • fs setclientaddrs -(1) -
  • fs setquota -(1) -
  • fs setserverprefs -(1) -
  • fs setvol -(1) -
  • fs storebehind -(1) -
  • fs sysname -(1) -
  • fs whereis -(1) -
  • fs whichcell -(1) -
  • fs wscell -(1) -
  • fstrace (introduction) -(1) -
  • fstrace apropos -(1) -
  • fstrace dump -(1) -
  • fstrace help -(1) -
  • fstrace lslog -(1) -
  • fstrace lsset -(1) -
  • fstrace setlog -(1) -
  • fstrace setset -(1) -
  • ftpd (AFS version) -(1) -
  • inetd (AFS version) -(1) -
  • kadb_check -(1) -
  • kas apropos -(1) -
  • kas create -(1) -
  • kas delete -(1) -
  • kas examine -(1) -
  • kas forgetticket -(1) -
  • kas help -(1) -
  • kas list -(1) -
  • kas listtickets -(1) -
  • kas noauthentication -(1) -
  • kas quit -(1) -
  • kas setfields -(1) -
  • kas setpassword -(1) -
  • kas statistics -(1) -
  • kas stringtokey -(1) -
  • kas unlock -(1) -
  • kaserver -(1) -
  • kdb -(1) -
  • klog -(1) -
  • knfs -(1) -
  • kpasswd -(1) -
  • kpwvalid -(1) -
  • package -(1) -
  • package apropos -(1) -
  • package help -(1) -
  • package_test -(1) -
  • pagsh -(1) -
  • prdb_check -(1) -
  • pts adduser -(1) -
  • pts apropos -(1) -
  • pts chown -(1) -
  • pts creategroup -(1) -
  • pts createuser -(1) -
  • pts delete -(1) -
  • pts examine -(1) -
  • pts help -(1) -
  • pts listentries -(1) -
  • pts listmax -(1) -
  • pts listowned -(1) -
  • pts membership -(1) -
  • pts removeuser -(1) -
  • pts rename -(1) -
  • pts setfields -(1) -
  • pts setmax -(1) -
  • ptserver -(1) -
  • rcp (AFS version) -(1) -
  • rsh (AFS version) -(1) -
  • runntp -(1) -
  • rxdebug -(1) -
  • salvager -(1) -
  • scout -(1) -
  • sys -(1) -
  • tokens -(1) -
  • translate_et -(1) -
  • udebug -(1) -
  • unlog -(1) -
  • up -(1) -
  • upclient -(1) -
  • upserver -(1) -
  • uss add -(1) -
  • uss apropos -(1) -
  • uss bulk -(1) -
  • uss delete -(1) -
  • uss help -(1) -
  • vldb_check -(1) -
  • vlserver -(1) -
  • volinfo -(1) -
  • volserver -(1) -
  • vos (introduction) -(1) -
  • vos addsite -(1) -
  • vos apropos -(1) -
  • vos backup -(1) -
  • vos backupsys -(1) -
  • vos changeaddr -(1) -
  • vos create -(1) -
  • vos delentry -(1) -
  • vos dump -(1) -
  • vos examine -(1) -
  • vos help -(1) -
  • vos listaddrs -(1) -
  • vos listpart -(1) -
  • vos listvldb -(1) -
  • vos listvol -(1) -
  • vos lock -(1) -
  • vos move -(1) -
  • vos partinfo -(1) -
  • vos release -(1) -
  • vos remove -(1) -
  • vos remsite -(1) -
  • vos rename -(1) -
  • vos restore -(1) -
  • vos status -(1) -
  • vos syncserv -(1) -
  • vos syncvldb -(1) -
  • vos unlock -(1) -
  • vos unlockvldb -(1) -
  • vos zap -(1) -
  • xfs_size_check -(1) -
  • xstat_cm_test -(1) -
  • xstat_fs_test -(1) -
  • -
  • common options - -
  • on backup commands -(1) -
  • on bos commands -(1) -
  • on fs commands -(1) -
  • on fstrace commands -(1) -
  • on kas commands -(1) -
  • on pts commands -(1) -
  • on uss commands -(1) -
  • on vos commands -(1) -
  • -
  • configuration file - -
  • see entry: afsmonitor configuration file -(1) -
  • see entry: CFG_<device_name> configuration file -(1) -
  • see entry: files -(1) -
  • see entry: package configuration file -(1) -
  • -
  • configuring - -
  • Cache Manager with afsd -(1) -
  • Cache Manager with fs commands -(1) -
  • local disk of client with package -(1) -
  • -
  • connections statistic in scout -(1) -
  • contacting - -
  • file server with fs commands -(1) -
  • -
  • controller file - -
  • see entry: files -(1) -
  • -
  • controlling - -
  • Cache Manager with fs commands -(1) -
  • server process status with entry in BosConfig file -(1) -
  • -
  • converting - -
  • character string to octal key form -(1) -
  • -
  • copying - -
  • access control list -(1) -
  • file remotely with rcp command (AFS version) -(1) -
  • files and directories -(1) -
  • -
  • core files - -
  • removing from /usr/afs/logs directory -(1) -
  • -
  • creating - -
  • Authentication Database entry -(1) -
  • Authentication Database entry with uss -(1) -
  • backup volume -(1) -
  • backup volumes, many at once -(1) -
  • buserver process -(1) -
  • directory with uss -(1), (2) -
  • dump level in Backup System dump hierarchy -(1) -
  • file with uss -(1), (2) -
  • fs process -(1) -
  • group in Protection Database -(1) -
  • hard link with uss -(1) -
  • kaserver process -(1) -
  • machine entry in Protection Database -(1) -
  • mount point -(1) -
  • mount point with uss -(1) -
  • PAG with pagsh command -(1) -
  • privileged user in UserList file -(1) -
  • Protection Database entry with uss -(1) -
  • ptserver process -(1) -
  • read-only volume -(1) -
  • read/write volume -(1) -
  • runntp process -(1) -
  • server encryption key -(1) -
  • server process in BosConfig file -(1) -
  • symbolic link with uss -(1) -
  • Tape Coordinator entry in Backup Database -(1) -
  • ticket (tokens) for server process -(1) -
  • upclient process -(1) -
  • upserver process -(1) -
  • user account with uss -(1) -
  • user accounts in bulk -(1) -
  • user entry in Protection Database -(1) -
  • vlserver process -(1) -
  • volume (see type--read/write, etc.) -(1) -
  • volume set in Backup Database -(1) -
  • volume with uss -(1), (2) -
  • -
  • creation date - -
  • recorded in volume header -(1), (2) -
  • -
  • creator - -
  • Protection Database entry, displaying -(1) -
  • -
  • cron process - -
  • creating with bos create command -(1) -
  • recorded in BosConfig file -(1) -
  • -
  • curses graphics utility - -
  • afsmonitor program -(1) -
  • -
  • -D - -
  • D instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • daily restart time for new binaries - -
  • see entry: restart times for BOS Server -(1) -
  • -
  • data - -
  • availability interrupted by dumping -(1) -
  • -
  • data cache - -
  • changing size of -(1) -
  • displaying amount used -(1) -
  • displaying size -(1) -
  • flushing directory/file -(1) -
  • flushing entire volume -(1) -
  • flushing mount point -(1) -
  • resetting to default size -(1) -
  • setting location with afsd -(1) -
  • setting size with afsd -(1) -
  • -
  • database file - -
  • see entry: files -(1) -
  • -
  • database server machine - -
  • adding to CellServDB file (server) -(1) -
  • changing client kernel list of -(1) -
  • displaying from client kernel -(1) -
  • displaying list in CellServDB file (server) -(1) -
  • listed in client CellServDB file -(1) -
  • listed in server CellServDB file -(1) -
  • removing from CellServDB file (server) -(1) -
  • -
  • date on file - -
  • see entry: time stamp -(1) -
  • -
  • date-specific restore - -
  • see entry: restoring -(1) -
  • -
  • default - -
  • ACL for new volume -(1) -
  • volume quota -(1) -
  • -
  • define statement - -
  • package configuration file -(1) -
  • -
  • defining - -
  • block special device with package -(1) -
  • capacity of Backup System tape -(1) -
  • character special device with package -(1) -
  • directory with package -(1) -
  • file with package -(1) -
  • privileged user in UserList file -(1) -
  • read-only site in VLDB -(1) -
  • server encryption key -(1) -
  • socket with package -(1) -
  • symbolic link with package -(1) -
  • system type of client machine -(1) -
  • -
  • delete instruction in uss bulk input file -(1) -
  • deleting - -
  • Authentication Database entry -(1) -
  • Authentication Database entry with uss -(1) -
  • dump level from Backup Database -(1) -
  • dump record from Backup Database -(1) -
  • Protection Database entry -(1) -
  • Protection Database entry with uss -(1) -
  • see also entry: removing -(1) -
  • server process from BosConfig file -(1) -
  • Tape Coordinator entry from Backup Database -(1) -
  • user account with uss -(1) -
  • VLDB entry (but not volume header) -(1) -
  • volume set from Backup Database -(1) -
  • volume with uss -(1) -
  • -
  • delvolume instruction in uss bulk input file -(1) -
  • desynchronization of VLDB/volume headers - -
  • fixing -(1), (2) -
  • -
  • determining - -
  • cell membership of client machine -(1) -
  • cell membership of server machine -(1) -
  • filemark size for tape device -(1) -
  • success of replication -(1) -
  • tape capacity (Backup System) -(1) -
  • -
  • device - -
  • see entry: block special device -(1) -
  • see entry: character special device -(1) -
  • -
  • directories - -
  • /usr/afs/bin -(1), (2) -
  • /usr/afs/logs -(1), (2) -
  • -
  • directory - -
  • creating with uss -(1), (2) -
  • defining with package -(1) -
  • displaying ACL -(1) -
  • displaying home cell -(1) -
  • flushing from cache -(1) -
  • name, translating to volume name -(1) -
  • name, translating to volume name or ID -(1) -
  • overwriting with uss -(1) -
  • setting ACL -(1) -
  • -
  • directory/file name - -
  • translating to volume name -(1) -
  • -
  • disabling - -
  • export of non-AFS file system -(1) -
  • -
  • discarding - -
  • authenticated identity in kas interactive mode -(1) -
  • ticket/tokens -(1) -
  • tickets -(1) -
  • -
  • disk cache - -
  • CacheItems file -(1) -
  • Vn files -(1) -
  • VolumeItems file -(1) -
  • -
  • disk partition - -
  • see entry: partition -(1) -
  • -
  • displaying - -
  • ACL -(1) -
  • all entries in Authentication Database -(1) -
  • Authentication Database entry -(1) -
  • Backup System operations, pending and running -(1) -
  • BOS Server restart times -(1) -
  • Cache Manager preference ranks for server machines -(1) -
  • CellServDB file (server version) contents -(1) -
  • client interfaces registered with File Server -(1) -
  • client machine -(1) -
  • creator of Protection Database entry -(1) -
  • data cache amount used -(1) -
  • data cache size -(1) -
  • database server machines from client kernel -(1) -
  • database server machines in CellServDB file (server version) -(1) -
  • directory/file location -(1) -
  • dump hierarchy from Backup Database -(1) -
  • dump level expiration date from Backup System -(1) -
  • dump record from Backup Database -(1) -
  • dump record from tape (Backup System) -(1) -
  • expiration date for tape from Backup Database -(1) -
  • file server machine entries from VLDB -(1) -
  • group memberships, number -(1) -
  • group-creation quota -(1) -
  • groups owned by user/group -(1) -
  • groups user or machine belongs to -(1) -
  • home cell of directory/file -(1) -
  • job ID number (Backup System) -(1) -
  • key version number from Authentication Database -(1) -
  • key version number from KeyFile file -(1) -
  • log files from server machine -(1) -
  • max group id counter in Protection Database -(1) -
  • max user id counter in Protection Database -(1) -
  • members of group -(1) -
  • mount point -(1) -
  • owner of Protection Database entry -(1) -
  • partition blocks available -(1), (2) -
  • partition blocks used -(1) -
  • partition percent used -(1), (2) -
  • partition size -(1), (2) -
  • partition size, space available -(1) -
  • partitions on file server machine -(1) -
  • port offset number for Tape Coordinator, from Backup Database -(1) -
  • privacy flags on Protection Database entry -(1) -
  • privileged users from UserList file -(1) -
  • Protection Database entries, all -(1) -
  • Protection Database entry -(1) -
  • server encryption key in Authentication Database -(1) -
  • server encryption keys in KeyFile file -(1) -
  • server machine status -(1) -
  • server process run status and BosConfig entry -(1) -
  • setuid status -(1) -
  • statistics from Authentication Server -(1) -
  • system type of client machine -(1), (2) -
  • Tape Coordinator entry from Backup Database -(1) -
  • Tape Coordinator status -(1) -
  • tape label (Backup System) -(1) -
  • tickets held by issuer -(1) -
  • time stamp on binary file -(1) -
  • VLDB entry for volume -(1) -
  • volume dump history from Backup Database -(1) -
  • volume entry from VLDB -(1) -
  • volume header -(1) -
  • volume header and VLDB entry -(1) -
  • volume percent used -(1) -
  • volume quota percent used -(1) -
  • volume quota, with volume & partition info. -(1) -
  • volume quota, with volume size -(1) -
  • Volume Server status -(1) -
  • volume set (Backup System) -(1) -
  • volume size -(1), (2) -
  • -
  • dlog command -(1) -
  • dpass command -(1) -
  • dryrun flag - -
  • on uss commands -(1) -
  • -
  • dumb terminal - -
  • use with afsmonitor -(1) -
  • -
  • dump - -
  • appended, creating -(1) -
  • creating -(1) -
  • full, creating -(1) -
  • incremental, creating -(1) -
  • initial, creating -(1) -
  • -
  • dump hierarchy (Backup System) - -
  • adding dump level -(1) -
  • displaying -(1) -
  • removing dump level -(1) -
  • -
  • dump level (Backup System) - -
  • creating in dump hierarchy -(1) -
  • displaying -(1) -
  • removing from dump hierarchy -(1) -
  • setting expiration date at creation time -(1) -
  • setting expiration date on existing -(1) -
  • -
  • dump record (Backup System) - -
  • created in Backup Database during dump -(1) -
  • deleting from Backup Database -(1) -
  • displaying for single volume -(1) -
  • displaying from Backup Database -(1) -
  • reading from tape -(1) -
  • -
  • dumping - -
  • volume with backup dump command -(1) -
  • volume with vos dump command -(1) -
  • -
  • -E - -
  • E instruction - -
  • uss template file -(1) -
  • -
  • enabling - -
  • export of non-AFS file system -(1) -
  • -
  • encryption key - -
  • in Authentication Database -(1) -
  • see entry: server encryption key -(1) -
  • -
  • End-of-File mark - -
  • see: filemark -(1) -
  • -
  • entering - -
  • interactive mode (Backup System) -(1) -
  • -
  • entry - -
  • Authentication Database (see entry: Authentication Database) -(1) -
  • VLDB (see entry: volume, VLDB entry) -(1) -
  • -
  • EOF mark - -
  • see: filemark -(1) -
  • -
  • error codes - -
  • translating numbers to messages -(1) -
  • -
  • examining - -
  • see entry: displaying -(1) -
  • -
  • executing - -
  • commands remotely -(1) -
  • -
  • exiting - -
  • interactive mode (Backup System) -(1) -
  • -
  • expiration date - -
  • of Authentication Database entry, displaying -(1) -
  • of Authentication Database entry, setting -(1) -
  • -
  • expiration date (Backup System) - -
  • displaying for dump level -(1) -
  • displaying for tape -(1) -
  • setting for dump level at creation -(1) -
  • setting for existing dump level -(1) -
  • -
  • export of non-AFS file system - -
  • by AFS client -(1) -
  • -
  • -F - -
  • F instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • failed authentication attempts - -
  • displaying limit from Authentication Database entry -(1) -
  • -
  • fast flag on vos listvol command -(1) -
  • fetching statistic in scout -(1) -
  • file - -
  • copying remotely with rcp command (AFS version) -(1) -
  • creating with uss -(1), (2) -
  • defining with package -(1) -
  • displaying ACL on parent directory -(1) -
  • displaying home cell -(1) -
  • flushing from cache -(1) -
  • name, translating to volume name -(1) -
  • name, translating to volume name or ID -(1) -
  • overwriting with uss -(1) -
  • setting ACL on parent directory -(1) -
  • -
  • FILE instruction in CFG_device_name file -(1) -
  • File Server - -
  • client interfaces not registered, setting -(1) -
  • client interfaces registered, displaying -(1) -
  • client interfaces registered, setting -(1), (2) -
  • contacting with fs commands -(1) -
  • interfaces not registered in VLDB - -
  • setting in NetRestrict file -(1) -
  • -
  • interfaces registered in VLDB - -
  • listed in sysid file -(1) -
  • setting in NetInfo file -(1) -
  • -
  • log file -(1) -
  • monitoring status with afsmonitor -(1) -
  • monitoring status with scout -(1) -
  • starting -(1) -
  • -
  • file server machine - -
  • as site for volume -(1) -
  • displaying AFS partitions on -(1) -
  • displaying interfaces from VLDB server entry -(1) -
  • displaying log files -(1) -
  • installing AFS server binary files -(1) -
  • monitoring outages of -(1) -
  • partition size and space available, displaying -(1) -
  • restoring all volumes on partition (Backup System) -(1) -
  • salvaging volumes on -(1) -
  • see also entry: server machine -(1) -
  • -
  • file system - -
  • export of non-AFS by AFS client -(1) -
  • restoring internal consistency (salvaging) -(1) -
  • -
  • FileLog file -(1) -
  • filemark - -
  • size, determining for tape device -(1) -
  • -
  • files - -
  • afszcm.cat -(1) -
  • AuthLog -(1) -
  • AuthLog.dir and AuthLog.pag -(1) -
  • BackupLog -(1) -
  • bdb.DB0 -(1) -
  • bdb.DBSYS1 -(1) -
  • BosConfig -(1) -
  • BosLog -(1) -
  • CacheItems -(1) -
  • CellServDB (client version) -(1) -
  • CellServDB (server version) -(1) -
  • CFG_device_name -(1) -
  • FileLog -(1) -
  • FORCESALVAGE -(1) -
  • kaserver.DB0 -(1) -
  • kaserver.DBSYS1 -(1) -
  • kaserverauxdb -(1) -
  • KeyFile -(1) -
  • NetInfo (client version) -(1) -
  • NetInfo (server version) -(1) -
  • NetRestrict (client version) -(1) -
  • NetRestrict (server version) -(1) -
  • NoAuth -(1) -
  • prdb.DB0 -(1) -
  • prdb.DBSYS1 -(1) -
  • SALVAGE.fs -(1) -
  • SalvageLog -(1) -
  • sysid -(1) -
  • tapeconfig -(1) -
  • ThisCell (client version) -(1) -
  • ThisCell (server version) -(1) -
  • UserList -(1) -
  • Vn -(1) -
  • Vvol_ID.vol -(1) -
  • vldb.DB0 -(1) -
  • vldb.DBSYS1 -(1) -
  • VLLog -(1) -
  • VolserLog -(1) -
  • VolumeItems -(1) -
  • -
  • fileserver command -(1) -
  • fileserver process - -
  • part of fs entry in BosConfig file -(1) -
  • -
  • flag - -
  • see entry: privacy flags -(1) -
  • see entry: status flag, in BosConfig file -(1) -
  • -
  • flushing - -
  • directory/file from data cache -(1) -
  • entire volume from data cache -(1) -
  • mount point from data cache -(1) -
  • -
  • fms command -(1) -
  • force flag - -
  • on pts commands -(1) -
  • -
  • FORCESALVAGE file -(1) -
  • fs commands - -
  • apropos -(1) -
  • checkservers -(1) -
  • checkvolumes -(1) -
  • cleanacl -(1) -
  • common options -(1) -
  • copyacl -(1) -
  • diskfree -(1) -
  • examine -(1) -
  • exportafs -(1) -
  • flush -(1) -
  • flushmount -(1) -
  • flushvolume -(1) -
  • getcacheparms -(1) -
  • getcellstatus -(1) -
  • getclientaddrs -(1) -
  • getserverprefs -(1) -
  • help -(1) -
  • listacl -(1) -
  • listcells -(1) -
  • listquota -(1) -
  • lsmount -(1) -
  • messages -(1) -
  • mkmount -(1) -
  • newcell -(1) -
  • privilege requirements -(1) -
  • quota -(1) -
  • rmmount -(1) -
  • setacl -(1) -
  • setcachesize -(1) -
  • setcell -(1) -
  • setclientaddrs -(1) -
  • setquota -(1) -
  • setserverprefs -(1) -
  • setvol -(1) -
  • storebehind -(1) -
  • sysname -(1) -
  • whereis -(1) -
  • whichcell -(1) -
  • wscell -(1) -
  • -
  • fs process - -
  • creating -(1) -
  • creating with bos create command -(1) -
  • recorded in BosConfig file -(1) -
  • -
  • fstrace commands - -
  • apropos -(1) -
  • common options -(1) -
  • dump -(1) -
  • help -(1) -
  • lslog -(1) -
  • lsset -(1) -
  • privilege requirements -(1) -
  • setlog -(1) -
  • setset -(1) -
  • -
  • ftpd command (AFS version) -(1) -
  • full dump -(1) - -
  • see entry: dump -(1) -
  • -
  • full restore -(1) - -
  • see entry: restoring -(1) -
  • -
  • -G - -
  • G instruction - -
  • uss template file -(1) -
  • -
  • gathering - -
  • statistics from Authentication Server -(1) -
  • -
  • group - -
  • AFS GID, displaying -(1) -
  • AFS GID, mapping to name -(1) -
  • AFS GID, setting -(1) -
  • defined -(1) -
  • groups owned, displaying -(1) -
  • members, adding -(1) -
  • members, displaying -(1) -
  • members, displaying number -(1) -
  • members, removing -(1) -
  • name, changing in Protection Database -(1) -
  • name, mapping to AFS GID -(1) -
  • name, rules for format -(1) -
  • orphaned, displaying -(1) -
  • prefix-less -(1) -
  • privacy flags on Protection Database entry, displaying -(1) -
  • privacy flags on Protection Database entry, setting -(1) -
  • Protection Database entries, display all -(1) -
  • Protection Database entry, creating -(1) -
  • Protection Database entry, deleting -(1) -
  • regular -(1) -
  • -
  • group ID - -
  • see entry: AFS GID -(1) -
  • -
  • group-creation quota - -
  • defined -(1) -
  • displaying -(1) -
  • lowered by pts creategroup command -(1) -
  • restored by pts delete -(1) -
  • setting on Protection Database entry -(1) -
  • -
  • -H - -
  • hard link - -
  • creating with uss -(1) -
  • overwriting with uss -(1) -
  • -
  • help - -
  • for backup commands -(1) -
  • for bos commands -(1) -
  • for fs commands -(1) -
  • for fstrace commands -(1) -
  • for kas commands -(1) -
  • for package commands -(1) -
  • for pts commands -(1) -
  • for uss commands -(1) -
  • for vos commands -(1) -
  • -
  • help flag - -
  • on backup commands -(1) -
  • on bos commands -(1) -
  • on fs commands -(1) -
  • on fstrace commands -(1), (2) -
  • on kas commands -(1) -
  • on pts commands -(1) -
  • on uss commands -(1) -
  • on vos commands -(1) -
  • -
  • help string - -
  • see entry: keyword -(1) -
  • -
  • home cell - -
  • displaying for client machine -(1) -
  • displaying for directory/file -(1) -
  • -
  • -I - -
  • idempotency - -
  • of vos commands -(1) -
  • -
  • ifdef statement - -
  • package configuration file -(1) -
  • -
  • ifndef statement - -
  • package configuration file -(1) -
  • -
  • include statement - -
  • package configuration file -(1) -
  • -
  • incremental dump -(1) - -
  • see entry: dump -(1) -
  • -
  • inetd command (AFS version) -(1) -
  • initial dump - -
  • see entry: dump -(1) -
  • -
  • initializing - -
  • Backup Server -(1) -
  • Cache Manager with afsd -(1) -
  • FTP Daemon -(1) -
  • Internet daemon -(1) -
  • NTPD, with runntp -(1) -
  • Protection Server -(1) -
  • server process -(1) -
  • Tape Coordinator -(1) -
  • -
  • installing - -
  • binary file -(1) -
  • -
  • interactive mode - -
  • kas commands -(1) -
  • kas, quitting from -(1) -
  • -
  • interactive mode (Backup System) - -
  • entering -(1) -
  • exiting -(1) -
  • halting operation -(1) -
  • -
  • Internet file transfer protocol daemon (AFS version) -(1) -
  • Internet services daemon (AFS version) -(1) -
  • -J - -
  • job ID number (Backup System) - -
  • displaying -(1) -
  • using to halt operation -(1) -
  • -
  • -K - -
  • kadb_check command -(1) -
  • kas commands - -
  • apropos -(1) -
  • common options -(1) -
  • create -(1) -
  • delete -(1) -
  • examine -(1) -
  • forgetticket -(1) -
  • help -(1) -
  • interactive mode -(1) -
  • list -(1) -
  • listtickets -(1) -
  • noauthentication -(1) -
  • privilege requirements -(1) -
  • quit -(1) -
  • setfields -(1) -
  • setpassword -(1) -
  • statistics -(1) -
  • stringtokey -(1) -
  • unlock -(1) -
  • -
  • kaserver command -(1) -
  • kaserver process - -
  • creating with bos create command -(1) -
  • -
  • kaserver.DB0 file -(1) -
  • kaserver.DBSYS1 file -(1) -
  • kaserverauxdb file -(1) -
  • kdb command -(1) -
  • kernel - -
  • list of database server machines, changing -(1) -
  • list of database server machines, examining -(1) -
  • -
  • key - -
  • deriving from character string -(1) -
  • see entry: server encryption key -(1) -
  • -
  • key field in Authentication Database - -
  • setting using password -(1) -
  • -
  • key version number -(1) - -
  • displaying from Authentication Database -(1) -
  • listing from KeyFile file -(1) -
  • rules for -(1) -
  • setting in KeyFile file -(1) -
  • -
  • KeyFile file -(1) - -
  • adding key with bos addkey command -(1) -
  • displaying keys with bos listkeys command -(1) -
  • removing key with bos removekey command -(1) -
  • -
  • keyword - -
  • using to get help on backup commands -(1) -
  • using to get help on bos commands -(1) -
  • using to get help on fs commands -(1) -
  • using to get help on fstrace commands -(1) -
  • using to get help on kas commands -(1) -
  • using to get help on package commands -(1) -
  • using to get help on pts commands -(1) -
  • using to get help on uss commands -(1) -
  • using to get help on vos commands -(1) -
  • -
  • klog command -(1) -
  • knfs command -(1) -
  • kpasswd command -(1) -
  • kpwvalid command -(1) -
  • -L - -
  • L instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • labeling - -
  • tape for Backup System -(1) -
  • -
  • learning - -
  • home cell of directory/file -(1) -
  • volume ID number given directory/file name -(1) -
  • volume location given directory/file name -(1) -
  • volume name given directory/file name -(1), (2), (3) -
  • volume quota given directory/file name -(1) -
  • -
  • leaving - -
  • kas interactive mode -(1) -
  • -
  • lifetime - -
  • see entry: ticket lifetime -(1) -
  • -
  • link - -
  • see entry: hard link, symbolic link -(1) -
  • -
  • listing - -
  • see entry: displaying -(1) -
  • tokens held by issuer -(1) -
  • -
  • local disk - -
  • configuring on client, using package -(1) -
  • -
  • localauth flag - -
  • on backup commands -(1) -
  • on bos commands -(1) -
  • on vos commands -(1) -
  • -
  • lock status - -
  • displaying limit from Authentication Database entry -(1) -
  • -
  • locking - -
  • VLDB entry -(1) -
  • -
  • locktime - -
  • displaying limit from Authentication Database entry -(1) -
  • setting in Authentication Database entry -(1) -
  • -
  • log file - -
  • displaying from server machine -(1) -
  • see entry: files -(1) -
  • -
  • long flag on vos listvol command -(1) -
  • -M - -
  • machine entry in Protection Database - -
  • adding to group -(1) -
  • AFS UID, setting -(1) -
  • creating -(1) -
  • deleting -(1) -
  • group memberships, displaying -(1) -
  • group-creation quota, setting -(1) -
  • privacy flags, setting -(1) -
  • wildcard name format -(1) -
  • -
  • maintaining - -
  • synchrony of VLDB with volume headers -(1) -
  • -
  • max group id counter in Protection Database - -
  • affected by setting AFS GID -(1) -
  • displaying -(1) -
  • setting -(1) -
  • -
  • max user id counter in Protection Database - -
  • affected by setting AFS UID -(1) -
  • displaying -(1) -
  • setting -(1) -
  • -
  • MaxQuota field in volume header -(1), (2) -
  • member - -
  • Protection Database group, adding -(1) -
  • Protection Database group, removing -(1) -
  • -
  • memory state of BOS Server -(1) -
  • messages - -
  • associated with volume, creating -(1) -
  • associated with volume, examining -(1) -
  • -
  • monitoring - -
  • disk usage with scout -(1), (2) -
  • File Server status with scout -(1) -
  • outages with scout -(1) -
  • -
  • MOUNT instruction in CFG_device_name file -(1) -
  • mount point - -
  • cellular -(1) -
  • creating -(1) -
  • creating with uss -(1) -
  • displaying -(1) -
  • flushing from cache -(1) -
  • read/write -(1) -
  • regular -(1) -
  • removing -(1) -
  • -
  • mounting - -
  • foreign volume in local cell -(1) -
  • -
  • moving - -
  • volume -(1) -
  • -
  • mutual authentication -(1) -
  • -N - -
  • name - -
  • cell (see entry: cell, name) -(1) -
  • see entry: group name -(1) -
  • see entry: username -(1) -
  • see entry: volume name -(1) -
  • -
  • NAME_CHECK instruction in CFG_device_name file -(1) -
  • needs salvage status flag in volume header -(1), (2) -
  • negative ACL permissions - -
  • setting -(1) -
  • -
  • NetInfo file (client version) -(1) -
  • NetInfo file (server version) -(1) -
  • NetRestrict file (client version) -(1) -
  • NetRestrict file (server version) -(1) -
  • Network File System - -
  • see entry: NFS -(1) -
  • -
  • Network Time Protocol Daemon - -
  • see entry: NTPD -(1) -
  • -
  • New release - -
  • status flag on site definition in VLDB entry -(1), (2) -
  • -
  • New Release flag in VLDB - -
  • as indicator of failed vos release operation -(1) -
  • -
  • NFS - -
  • export of by AFS client -(1) -
  • obtaining authenticated AFS access from non-supported client -(1) -
  • -
  • NFS/AFS Translator - -
  • enabling Cache Manager -(1) -
  • -
  • NoAuth file -(1) -
  • noauth flag - -
  • on bos commands -(1), (2) -
  • on kas commands -(1) -
  • on pts commands -(1) -
  • -
  • NOCPW flag in Authentication Database entry -(1) -
  • none shorthand notation for ACL permissions -(1) -
  • NOSEAL flag in Authentication Database entry -(1) -
  • Not released - -
  • status flag on site definition in VLDB entry -(1), (2) -
  • -
  • NOTGS flag in Authentication Database entry -(1) -
  • NTPD - -
  • initializing with runntp -(1) -
  • -
  • -O - -
  • Off-line status flag in volume header -(1), (2) -
  • offline message - -
  • creating -(1) -
  • examining -(1) -
  • -
  • Old release - -
  • status flag on site definition in VLDB entry -(1), (2) -
  • -
  • Old Release flag in VLDB - -
  • as indicator of failed vos release operation -(1) -
  • -
  • OLD version of binary file - -
  • creation by bos install command -(1) -
  • listing time stamp on -(1) -
  • removing from /usr/afs/bin directory -(1) -
  • use by bos uninstall command -(1) -
  • -
  • On-line status flag in volume header -(1), (2) -
  • operating system - -
  • AFS system names -(1) -
  • -
  • outages - -
  • BOS Server -(1) -
  • monitoring with afsmonitor -(1) -
  • monitoring with scout -(1) -
  • -
  • overwriting - -
  • directories/files/links with uss -(1) -
  • -
  • owner - -
  • Protection Database entry, changing -(1) -
  • Protection Database entry, defined -(1) -
  • Protection Database entry, displaying -(1) -
  • Protection Database entry, setting -(1) -
  • -
  • -P - -
  • package - -
  • C instruction in configuration file -(1) -
  • command, syntax defined -(1) -
  • configuration file (see entry: package configuration file) -(1) -
  • D instruction in configuration file -(1) -
  • define instruction in configuration file -(1) -
  • defining block special device with B instruction -(1) -
  • defining character special device -(1) -
  • defining directory -(1) -
  • defining file -(1) -
  • defining socket -(1) -
  • defining symbolic link -(1) -
  • F instruction in configuration file -(1) -
  • ifdef instruction in configuration file -(1) -
  • ifndef instruction in configuration file -(1) -
  • include instruction in configuration file -(1) -
  • L instruction in configuration file -(1) -
  • privilege requirements -(1) -
  • S instruction in configuration file -(1) -
  • undef instruction in configuration file -(1) -
  • -
  • package commands - -
  • apropos -(1) -
  • help -(1) -
  • -
  • package configuration file -(1) - -
  • B instruction -(1) -
  • C instruction -(1) -
  • D instruction -(1) -
  • define instruction -(1) -
  • defining block special device -(1) -
  • defining character special device -(1) -
  • defining directory -(1) -
  • defining file -(1) -
  • defining socket -(1) -
  • defining symbolic link -(1) -
  • F instruction -(1) -
  • ifdef instruction -(1) -
  • ifndef instruction -(1) -
  • include instruction -(1) -
  • L instruction -(1) -
  • S instruction -(1) -
  • undef instruction -(1) -
  • -
  • package_test command -(1) -
  • PAG - -
  • creating with pagsh command -(1) -
  • -
  • pagsh command -(1) -
  • partition - -
  • blocks available, displaying -(1), (2) -
  • blocks used, displaying -(1) -
  • displaying blocks available -(1) -
  • displaying for file server machine -(1) -
  • displaying size -(1) -
  • monitoring usage of -(1) -
  • monitoring usage with scout -(1) -
  • moving volumes -(1) -
  • percent used, displaying -(1) -
  • restoring all volumes (Backup System) -(1) -
  • salvage triggered by SALVAGE.fs file -(1) -
  • salvaging volumes on -(1) -
  • size, displaying -(1), (2) -
  • -
  • partition argument - -
  • on vos commands -(1) -
  • -
  • password - -
  • changing/setting in Authentication Database -(1) -
  • checking quality of -(1), (2) -
  • checking quality using kpwvalid program -(1) -
  • defining initial in Authentication Database -(1) -
  • generating octal form of -(1) -
  • imposing restrictions with kas setfields command -(1) -
  • imposing restrictions with uss template A instruction -(1) -
  • in Authentication Database -(1) -
  • setting in Authentication Database -(1) -
  • -
  • password lifetime - -
  • displaying from Authentication Database entry -(1) -
  • setting in Authentication Database entry -(1) -
  • -
  • password reuse - -
  • setting restrictions on in Authentication Database entry -(1) -
  • -
  • password_for_admin argument - -
  • on kas commands -(1) -
  • -
  • permanent name - -
  • see entry: tape (Backup System) -(1) -
  • -
  • port offset number (Tape Coordinator) - -
  • assigning in Backup Database -(1) -
  • displaying from Backup Database -(1) -
  • -
  • portoffset argument - -
  • on backup commands -(1) -
  • -
  • prdb.DB0 file -(1) -
  • prdb.DBSYS1 file -(1) -
  • prdb_check command -(1) -
  • preference ranks - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • prefix-less group - -
  • see entry: group -(1) -
  • -
  • privacy flags - -
  • Protection Database entry, displaying -(1) -
  • Protection Database entry, setting -(1) -
  • -
  • privilege requirements - -
  • for backup commands -(1) -
  • for bos commands -(1) -
  • for fs commands -(1) -
  • for fstrace commands -(1) -
  • for kas commands -(1) -
  • for package command -(1) -
  • for pts commands -(1) -
  • for uss commands -(1) -
  • for vos commands -(1) -
  • -
  • privileged users - -
  • adding to UserList file -(1) -
  • listing from UserList file -(1) -
  • removing from UserList file -(1) -
  • setting ADMIN flag in Authentication Database -(1) -
  • system:administrators group, adding -(1) -
  • system:administrators group, removing -(1) -
  • -
  • process - -
  • see entry: server process -(1) -
  • -
  • program - -
  • controlling setuid status -(1) -
  • displaying setuid status -(1) -
  • -
  • protection - -
  • AFS vs. UNIX -(1) -
  • -
  • Protection Database -(1) - -
  • all entries, displaying -(1) -
  • creator of entry defined -(1) -
  • creator of entry, displaying -(1) -
  • files constituting -(1) -
  • group entry, creating -(1) -
  • group entry, deleting -(1) -
  • group entry, displaying -(1) -
  • group members, adding -(1) -
  • group members, removing -(1) -
  • group membership, displaying -(1) -
  • group memberships, displaying number -(1) -
  • group-creation quota defined -(1) -
  • group-creation quota, displaying -(1) -
  • group-creation quota, setting -(1) -
  • groups owned, displaying -(1) -
  • machine entry, creating -(1) -
  • machine entry, deleting -(1) -
  • machine entry, displaying -(1) -
  • max group id counter, displaying -(1) -
  • max group id counter, setting -(1) -
  • max user id counter, displaying -(1) -
  • max user id counter, setting -(1) -
  • membership count defined -(1) -
  • membership count, displaying -(1) -
  • name of entry, changing -(1) -
  • owner of entry defined -(1) -
  • owner of entry, changing -(1) -
  • owner of entry, displaying -(1) -
  • owner of entry, setting initial -(1) -
  • privacy flags, displaying -(1) -
  • privacy flags, setting -(1) -
  • status, verifying -(1) -
  • user entry, creating -(1) -
  • user entry, creating with uss -(1) -
  • user entry, deleting -(1) -
  • user entry, deleting with uss -(1) -
  • user entry, displaying -(1) -
  • -
  • protection group - -
  • see entry: group -(1) -
  • -
  • Protection Server -(1) - -
  • listed in client CellServDB file -(1) -
  • listed in server CellServDB file -(1) -
  • starting -(1) -
  • -
  • pts commands - -
  • adduser -(1) -
  • apropos -(1) -
  • chown -(1) -
  • common options -(1) -
  • creategroup -(1) -
  • createuser -(1) -
  • delete -(1) -
  • examine -(1) -
  • help -(1) -
  • listentries -(1) -
  • listmax -(1) -
  • listowned -(1) -
  • membership -(1) -
  • privilege requirements -(1) -
  • removeuser -(1) -
  • rename -(1) -
  • setfields -(1) -
  • setmax -(1) -
  • -
  • ptserver command -(1) -
  • ptserver process - -
  • creating with bos create command -(1) -
  • -
  • -Q - -
  • quitting - -
  • backup interactive mode -(1) -
  • kas interactive mode -(1) -
  • -
  • quota - -
  • (see entry: volume quota) -(1) -
  • see entry: group-creation quota -(1) -
  • -
  • -R - -
  • RClone field in volume header -(1), (2) -
  • rcp command (AFS version) -(1) -
  • read shorthand notation for ACL permissions -(1) -
  • read-only extension on volume name - -
  • added by vos release command -(1) -
  • -
  • read-only volume - -
  • creating -(1) -
  • defining site in VLDB -(1) -
  • dumping -(1) -
  • forcing Cache Manager to see new release -(1) -
  • ID number -(1) -
  • ID number in volume header -(1), (2) -
  • moving -(1) -
  • name, changing -(1) -
  • need for all-or-nothing release -(1) -
  • removing -(1) -
  • site, removing mistakenly defined -(1) -
  • -
  • read/write mount point -(1) -
  • read/write volume - -
  • cloning for backup version -(1) -
  • cloning for replication -(1) -
  • cloning multiple for backup version -(1) -
  • creating -(1) -
  • dumping -(1) -
  • ID number -(1) -
  • ID number in volume header -(1), (2) -
  • moving -(1) -
  • name, changing -(1) -
  • removing -(1) -
  • -
  • regular expression - -
  • Backup System -(1) -
  • -
  • regular group - -
  • see entry: group -(1) -
  • -
  • regular mount point -(1) -
  • release - -
  • status flags on site definitions in VLDB entry -(1), (2) -
  • -
  • ReleaseClone -(1) -
  • ReleaseClone volume - -
  • ID number in volume header -(1), (2) -
  • -
  • releasing read-only volume - -
  • forcing Cache Manager to see -(1) -
  • with vos release command -(1) -
  • -
  • remote - -
  • command execution with bos exec -(1) -
  • file copy with rcp command (AFS version) -(1) -
  • shell with rsh command (AFS version) -(1) -
  • -
  • removing - -
  • .BAK version of binary file -(1) -
  • .OLD version of binary file -(1) -
  • ACL entry -(1) -
  • core file from /usr/afs/logs directory -(1) -
  • database server machine from CellServDB file (server) -(1) -
  • mount point -(1) -
  • obsolete AFS UIDs from ACL -(1) -
  • privileged users from UserList file -(1) -
  • see also entry: deleting -(1) -
  • server encryption key from KeyFile file -(1) -
  • user from group -(1) -
  • volume -(1) -
  • volume entry from volume set in Backup Database -(1) -
  • volume from site, without changing VLDB -(1) -
  • volume site mistakenly defined -(1) -
  • -
  • renaming - -
  • volume -(1) -
  • -
  • replacing binary file - -
  • see entry: uninstalling -(1) -
  • -
  • replication -(1) - -
  • determining success of -(1) -
  • forcing creation of new clone -(1) -
  • need for all-or-nothing release -(1) -
  • role of ReleaseClone in -(1) -
  • -
  • restart times for BOS Server - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • restarting - -
  • server process -(1) -
  • -
  • restoring - -
  • internal consistency in file system (salvaging) -(1) -
  • synchrony of VLDB and volume headers -(1), (2) -
  • volume, all in volume set (Backup System) -(1) -
  • volume, all on partition (Backup System) -(1) -
  • volume, single (Backup System) -(1) -
  • volumes with vos command -(1) -
  • -
  • ROnly field in volume header -(1), (2) -
  • rsh command (AFS version) -(1) -
  • runntp command -(1) -
  • runntp process - -
  • creating with bos create command -(1) -
  • -
  • RWrite field in volume header -(1), (2) -
  • Rx - -
  • tracing activity -(1) -
  • -
  • rxdebug command -(1) -
  • -S - -
  • S instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • SALVAGE.fs file -(1) -
  • SalvageLog file -(1) -
  • salvager process - -
  • command for invoking manually -(1) -
  • log file -(1) -
  • part of fs entry in BosConfig file -(1) -
  • SALVAGE.fs file as trigger -(1) -
  • -
  • salvaging volume - -
  • with bos salvage command -(1) -
  • with salvager command -(1) -
  • -
  • savevolume instruction in uss bulk input file -(1) -
  • scanning - -
  • Backup System tape -(1) -
  • -
  • scout - -
  • command syntax for -(1) -
  • disk usage -(1) -
  • outages, monitoring -(1) -
  • statistics available -(1) -
  • -
  • server - -
  • see entry: server process -(1) -
  • -
  • server argument - -
  • on bos commands -(1) -
  • on vos commands -(1) -
  • -
  • server encryption key -(1) - -
  • adding to KeyFile file -(1) -
  • displaying from Authentication Database -(1) -
  • in Authentication Database -(1) -
  • listing from KeyFile file -(1) -
  • removing from KeyFile file -(1) -
  • -
  • server machine - -
  • cell membership -(1) -
  • checking status with fs checkservers command -(1) -
  • displaying Cache Manager preference ranks -(1) -
  • maintaining clock with NTPD -(1) -
  • restart times, displaying -(1) -
  • restart times, setting -(1) -
  • setting authorization checking requirements -(1) -
  • setting Cache Manager preference ranks -(1) -
  • -
  • server partition - -
  • FORCESALVAGE file -(1) -
  • Vvol_ID.vol files -(1) -
  • -
  • server portion of Update Server - -
  • see entry: upserver process -(1) -
  • -
  • server process -(1) - -
  • BosConfig file entry -(1) -
  • creating in BosConfig file -(1) -
  • creating ticket (tokens) for -(1) -
  • deleting from BosConfig file -(1) -
  • displaying BosConfig entry -(1) -
  • displaying log file -(1) -
  • listing run status -(1) -
  • listing time stamp on binary file -(1) -
  • restarting -(1) -
  • starting -(1) -
  • starting (changing status flag in BosConfig) -(1) -
  • starting on server -(1) -
  • stopping (changing BosConfig status flag) -(1) -
  • stopping (no change to BosConfig status flag) -(1) -
  • stopping and immediately restarting -(1) -
  • types -(1) -
  • uninstalling binary file -(1) -
  • -
  • server tickets - -
  • discarding -(1) -
  • -
  • servers argument - -
  • on kas commands -(1) -
  • -
  • setting - -
  • ACL -(1) -
  • ACL with uss -(1), (2) -
  • AFS GID for group -(1) -
  • AFS UID for user -(1) -
  • Authentication Database entry flags and expiration dates -(1) -
  • authorization checking requirements on server machine -(1) -
  • BOS Server -(1) -
  • Cache Manager preference ranks -(1) -
  • cell name in CellServDB file -(1) -
  • cell name in ThisCell file -(1) -
  • client interfaces not registered with File Server, in NetInfo file -(1) -
  • client interfaces registered with File Server -(1) -
  • client interfaces registered with File Server, in NetInfo file -(1) -
  • data cache size -(1) -
  • expiration date on existing Backup System dump level -(1) -
  • expiration date on new dump level (Backup System) -(1) -
  • File Server interfaces not registered in VLDB, in NetRestrict file -(1) -
  • File Server interfaces registered in VLDB, in NetInfo file -(1) -
  • group-creation quota -(1) -
  • initial owner for group -(1) -
  • key field in Authentication Database, using password -(1) -
  • key version number in KeyFile file -(1) -
  • max group id counter in Protection Database -(1) -
  • max user id counter in Protection Database -(1) -
  • password in Authentication Database -(1) -
  • privacy flags on Protection Database entry -(1) -
  • setuid status -(1) -
  • status flag in BOS Server memory to NotRun -(1) -
  • status flag in BOS Server memory to Run -(1), (2) -
  • status flag in BosConfig file -(1) -
  • status flag in BosConfig file to NotRun -(1) -
  • status flag in BosConfig file to Run -(1) -
  • system type of client machine -(1) -
  • volume ACL, default at creation -(1) -
  • volume quota -(1), (2) -
  • volume quota with uss -(1) -
  • volume quota, default at creation -(1) -
  • -
  • setuid privilege - -
  • controlling -(1) -
  • displaying -(1) -
  • -
  • shell - -
  • opening remotely with rsh command (AFS version) -(1) -
  • -
  • shorthand notation for ACL permissions -(1) -
  • shutting down - -
  • server process -(1) -
  • -
  • simple process - -
  • creating with bos create command -(1) -
  • recorded in BosConfig file -(1) -
  • -
  • site - -
  • count in VLDB -(1), (2) -
  • -
  • size - -
  • displaying from Backup System tape label -(1) -
  • partition, displaying with space available -(1) -
  • recording on Backup System tape label -(1) -
  • tape device filemark, determining -(1) -
  • -
  • skipauth flag - -
  • on uss commands -(1) -
  • -
  • socket - -
  • defining with package -(1) -
  • -
  • starting - -
  • Backup Server -(1) -
  • client portion of Update Server -(1) -
  • NTPD, with runntp -(1) -
  • process on server (changing status flag in BosConfig) -(1) -
  • process on server (no change to status flag in BosConfig) -(1) -
  • Protection Server -(1) -
  • Salvager by hand -(1) -
  • server portion of Update Server -(1) -
  • server process -(1) -
  • Tape Coordinator -(1) -
  • -
  • statistics - -
  • Authentication Server -(1) -
  • available in scout -(1) -
  • -
  • status - -
  • displaying for server machine -(1) -
  • listing for server process -(1) -
  • Volume Server, displaying -(1) -
  • -
  • status flag - -
  • for process in BOS Server memory, about -(1) -
  • for process in BosConfig file, about -(1) -
  • in Authentication Database, displaying -(1) -
  • in Authentication Database, setting -(1) -
  • release, on site definitions in VLDB entry -(1), (2) -
  • setting to NotRun for process, in BosConfig file -(1) -
  • setting to NotRun for process, in BOS Server memory -(1), (2) -
  • setting to Run for process, in BOS Server memory -(1), (2) -
  • setting to Run for process, in BosConfig file -(1), (2) -
  • -
  • status flags in volume header -(1), (2) -
  • stopping - -
  • server process (changing status flag in BosConfig) -(1) -
  • server process (no change to BosConfig status flag) -(1) -
  • -
  • storing statistic in scout -(1) -
  • symbolic link - -
  • creating with uss -(1) -
  • defining with package -(1) -
  • overwriting with uss -(1) -
  • -
  • synchrony of VLDB and volume headers - -
  • maintained by VL and Volume Servers -(1) -
  • restoring -(1), (2), (3) -
  • -
  • sys (@sys) variable in pathnames -(1), (2) -
  • sys command -(1) -
  • sysid file -(1) -
  • sysname -(1) -
  • system outages, reducing -(1) -
  • system type - -
  • AFS system names -(1) -
  • client machine -(1) -
  • -
  • -T - -
  • tape (Backup System) - -
  • capacity on label, setting -(1) -
  • capacity, determining -(1) -
  • capacity, displaying from label -(1) -
  • label, displaying -(1) -
  • labeling -(1) -
  • reading dump records -(1) -
  • -
  • Tape Coordinator - -
  • Backup Database entry, creating -(1) -
  • Backup Database entry, deleting -(1) -
  • Backup Database entry, displaying -(1) -
  • CFG_device_name file -(1) -
  • configuration file for all devices -(1) -
  • configuration file for specific device (CFG) -(1) -
  • filemark size, determining -(1) -
  • initializing -(1) -
  • port offset number, assigning in Backup Database -(1) -
  • port offset number, displaying from Backup Database -(1) -
  • status, displaying -(1) -
  • -
  • tape device (Backup System) - -
  • see entry: Tape Coordinator -(1) -
  • -
  • tape name - -
  • see entry: tape (Backup System) -(1) -
  • -
  • tapeconfig file -(1) -
  • template file in uss - -
  • see entry: uss template file -(1) -
  • -
  • terminal type - -
  • setting for afsmonitor -(1) -
  • -
  • testing - -
  • package files -(1) -
  • -
  • ThisCell file (client version) -(1) -
  • ThisCell file (client) - -
  • displaying contents with fs wscell command -(1) -
  • -
  • ThisCell file (server version) -(1) -
  • ThisCell file (server) - -
  • creating with bos setcellname command -(1) -
  • -
  • ticket lifetime - -
  • displaying from Authentication Database -(1) -
  • setting in Authentication Database -(1) -
  • -
  • tickets -(1) - -
  • creating for server process -(1) -
  • discarding -(1) -
  • displaying for issuer of command -(1) -
  • listing for user -(1) -
  • see entry: server tickets -(1) -
  • -
  • time stamp - -
  • listing for binary file -(1) -
  • -
  • tokens - -
  • command -(1) -
  • creating for server process -(1) -
  • discarding -(1) -
  • listing for user -(1) -
  • -
  • tokens command -(1) -
  • translate_et command -(1) -
  • translating - -
  • AFS ID to user/group name -(1) -
  • directory/file name to volume ID number -(1) -
  • directory/file name to volume location -(1) -
  • directory/file name to volume name -(1), (2), (3) -
  • directory/file name to volume quota -(1), (2) -
  • directory/file name to volume quota percent used -(1) -
  • user/group name to AFS ID -(1) -
  • volume ID number from location -(1) -
  • volume location from volume name/ID number -(1) -
  • volume location to ID number -(1) -
  • volume name to volume ID number -(1) -
  • volume name/ID number to volume location -(1) -
  • -
  • type flag for volume - -
  • VLDB entry -(1), (2) -
  • volume header -(1), (2) -
  • -
  • types of AFS server processes -(1) -
  • -U - -
  • Ubik - -
  • tracing -(1) -
  • -
  • udebug command -(1) -
  • UID - -
  • see entry: AFS GID -(1) -
  • see entry: AFS UID -(1) -
  • see entry: UNIX UID -(1) -
  • -
  • unauthenticating - -
  • while in kas interactive mode -(1) -
  • with unlog command -(1) -
  • -
  • undef statement - -
  • package configuration file -(1) -
  • -
  • uninstalling - -
  • binary file -(1) -
  • -
  • UNIX commands - -
  • ftpd (AFS version) -(1) -
  • inetd (AFS version) -(1) -
  • rcp (AFS version) -(1) -
  • rsh (AFS version) -(1) -
  • -
  • UNIX UID - -
  • functional difference from AFS UID -(1) -
  • -
  • unlocking - -
  • volume entries (multiple) in VLDB -(1) -
  • volume entry in VLDB -(1) -
  • -
  • unlog command -(1) -
  • UNMOUNT instruction in CFG_device_name file -(1) -
  • unmounting volume -(1) -
  • up command -(1) -
  • upclient command -(1) -
  • upclient process -(1) - -
  • creating with bos create command -(1) -
  • -
  • update date - -
  • recorded in volume header -(1), (2) -
  • -
  • Update Server - -
  • starting client portion -(1) -
  • starting server portion -(1) -
  • -
  • updating - -
  • Cache Manager mapping of volume names to IDs -(1) -
  • -
  • upserver command -(1) -
  • upserver process -(1) - -
  • creating with bos create command -(1) -
  • -
  • user - -
  • account (see entry: user account) -(1) -
  • adding to group -(1) -
  • AFS UID, setting -(1), (2) -
  • group memberships, displaying number -(1) -
  • group-creation quota, setting in Protection Database -(1) -
  • groups belonged to, displaying -(1) -
  • groups owned, displaying -(1) -
  • mapping name to AFS UID -(1) -
  • name, assigning -(1) -
  • name, assigning in uss -(1) -
  • name, changing in Protection Database -(1) -
  • name, rules for format -(1) -
  • privacy flags on Protection Database entry, displaying -(1) -
  • privacy flags on Protection Database entry, setting -(1) -
  • Protection Database entries, display all -(1) -
  • Protection Database entry, creating -(1) -
  • Protection Database entry, deleting -(1) -
  • removing from group -(1) -
  • -
  • user account - -
  • creating multiple -(1) -
  • creating with uss -(1) -
  • deleting with uss -(1) -
  • -
  • UserList file -(1) - -
  • adding user with bos adduser command -(1) -
  • displaying users with bos listusers command -(1) -
  • removing user with bos removeuser command -(1) -
  • -
  • usr/afs/bin directory - -
  • checking time stamps on files -(1) -
  • removing .BAK files -(1) -
  • removing .OLD files -(1) -
  • -
  • usr/afs/logs directory - -
  • displaying log files -(1) -
  • removing core files -(1) -
  • -
  • uss - -
  • bulk input file (see entry: uss bulk input file) -(1) -
  • creating directory -(1) -
  • creating directory for even distribution -(1) -
  • creating file by echoing -(1) -
  • creating file from prototype -(1) -
  • creating hard link -(1) -
  • creating symbolic link -(1) -
  • creating volume -(1) -
  • improving password/login security -(1) -
  • mounting volume -(1) -
  • overwriting behavior -(1) -
  • running command -(1) -
  • setting ACL -(1), (2) -
  • setting volume quota -(1) -
  • template file (see entry: uss template file) -(1) -
  • -
  • uss bulk input file -(1) - -
  • add instruction -(1) -
  • delete instruction -(1) -
  • delvolume instruction -(1) -
  • savevolume instruction -(1) -
  • -
  • uss commands - -
  • add -(1) -
  • apropos -(1) -
  • bulk -(1) -
  • common options -(1) -
  • delete -(1) -
  • help -(1) -
  • privilege requirements -(1) -
  • -
  • uss template file -(1) - -
  • A instruction -(1), (2) -
  • creating directory -(1) -
  • creating directory for even distribution -(1) -
  • creating file -(1), (2) -
  • creating hard link -(1) -
  • creating mount point -(1) -
  • creating symbolic link -(1) -
  • creating volume -(1) -
  • D instruction -(1) -
  • D line -(1) -
  • E instruction -(1) -
  • F instruction -(1) -
  • G line -(1) -
  • improving password/login security -(1) -
  • L instruction -(1) -
  • S instruction -(1) -
  • setting ACL -(1), (2) -
  • setting volume quota -(1) -
  • V instruction -(1) -
  • X instruction -(1) -
  • zero length -(1) -
  • -
  • -V - -
  • V instruction - -
  • uss template file -(1) -
  • -
  • Vn file -(1) -
  • Vvol_ID.vol file -(1) -
  • variables - -
  • @sys in pathnames -(1), (2) -
  • -
  • verbose flag - -
  • on vos commands -(1) -
  • -
  • VL Database - -
  • status, verifying -(1) -
  • -
  • VL Server -(1) - -
  • displaying Cache Manager preference ranks -(1) -
  • listed in client CellServDB file -(1) -
  • listed in server CellServDB file -(1) -
  • setting Cache Manager preference ranks -(1) -
  • starting -(1) -
  • -
  • VLDB - -
  • deleting entry (but not volume header) -(1) -
  • displaying file server machine interfaces -(1) -
  • displaying volume entry and volume header -(1) -
  • examining volume entry -(1) -
  • files constituting -(1) -
  • read-only site for volume, defining -(1) -
  • read-only site for volume, removing mistakenly defined -(1) -
  • release status flags in volume entry -(1), (2) -
  • server machine interfaces not registered - -
  • setting in NetRestrict file -(1) -
  • -
  • server machine interfaces registered - -
  • listed in sysid file -(1) -
  • setting in NetInfo file -(1) -
  • -
  • site count for volume -(1), (2) -
  • synchronizing with volume headers -(1), (2) -
  • volume entry, creating -(1) -
  • volume entry, locking -(1) -
  • volume entry, unlocking -(1) -
  • volume entry, unlocking multiple -(1) -
  • volume type flags -(1), (2) -
  • -
  • vldb.DB0 file -(1) -
  • vldb.DBSYS1 file -(1) -
  • vldb_check command -(1) -
  • VLLog file -(1) -
  • vlserver command -(1) -
  • vlserver process - -
  • creating with bos create command -(1) -
  • -
  • volinfo command -(1) -
  • VolserLog file -(1) -
  • volserver command -(1) -
  • volserver process - -
  • part of fs entry in BosConfig file -(1) -
  • -
  • volume - -
  • backup (see entry: backup volume) -(1) -
  • Cache Manager -(1) -
  • counter in header for number of accesses -(1), (2) -
  • creating -(1) -
  • creating mount point -(1) -
  • creating with uss -(1), (2) -
  • Creation date in volume header -(1), (2) -
  • deleting with uss -(1) -
  • displaying mount point -(1) -
  • dump history, displaying -(1) -
  • dumping using Backup System -(1) -
  • dumping with vos dump command -(1) -
  • flushing from data cache -(1) -
  • header, displaying -(1), (2) -
  • header, displaying with VLDB entry -(1) -
  • header, synchronizing with VLDB entry -(1), (2) -
  • host partition size, listing -(1) -
  • ID number (see entry: volume ber) -(1) -
  • ID number from name, translating -(1) -
  • ID number, allocating -(1) -
  • ID number, learning from volume location -(1) -
  • ID number, translating to location -(1) -
  • Last Update date in volume header -(1), (2) -
  • location, translating from name/ID number -(1) -
  • location, translating to volume ID number -(1) -
  • message associated with, creating -(1) -
  • messages associated with, examining -(1) -
  • moving -(1) -
  • name to ID number, translating -(1) -
  • name, assigning -(1) -
  • name, changing -(1) -
  • name, learning given directory/file name -(1) -
  • name, translating to location -(1) -
  • partition percent use, listing -(1) -
  • percent use, listing -(1) -
  • quota (see entry: volume quota) -(1) -
  • read-only (see entry: read-only volume) -(1) -
  • read-only site, removing mistakenly defined -(1) -
  • read/write (see entry: read/write volume) -(1) -
  • removing -(1) -
  • removing mount point for -(1) -
  • removing without changing VLDB -(1) -
  • renaming -(1) -
  • replicating -(1) -
  • restoring all in volume set with Backup System -(1) -
  • restoring single with Backup System -(1) -
  • restoring with vos command -(1) -
  • salvaging -(1) -
  • size, listing -(1), (2) -
  • VLDB entry, displaying -(1) -
  • VLDB entry, displaying with header -(1) -
  • VLDB entry, locking -(1) -
  • VLDB entry, synchronizing with header -(1), (2) -
  • volume ID number (see entry: volume ber) -(1) -
  • -
  • volume entry (Backup System) - -
  • adding to volume set -(1), (2) -
  • displaying from volume set -(1) -
  • removing from volume set -(1) -
  • -
  • volume header - -
  • see entry: Vvol_ID.vol file -(1) -
  • -
  • volume ID number - -
  • Cache Manager -(1) -
  • defined -(1) -
  • learning given directory/file name -(1) -
  • -
  • volume location - -
  • learning given directory/file name -(1) -
  • -
  • Volume Location Database - -
  • see entry: VLDB -(1) -
  • -
  • Volume Location Server - -
  • log file -(1) -
  • see entry: VL Server -(1) -
  • -
  • volume name - -
  • Cache Manager -(1) -
  • Cache Manager forced to see change to -(1) -
  • learning given directory/file name -(1), (2) -
  • -
  • volume quota - -
  • allowing users to exceed -(1) -
  • displaying percent used -(1) -
  • displaying with volume & partition info. -(1) -
  • displaying with volume size -(1) -
  • recorded in volume header -(1), (2) -
  • setting -(1), (2) -
  • setting default for new volume -(1) -
  • setting with uss -(1) -
  • -
  • Volume Server -(1) - -
  • log file -(1) -
  • starting -(1) -
  • status, displaying -(1) -
  • -
  • volume set (Backup System) - -
  • creating -(1) -
  • deleting -(1) -
  • displaying -(1) -
  • restoring -(1) -
  • volume entry, adding -(1), (2) -
  • volume entry, removing -(1) -
  • -
  • VolumeItems file -(1) -
  • vos commands - -
  • addsite -(1) -
  • apropos -(1) -
  • backup -(1) -
  • backupsys -(1) -
  • changeaddr -(1) -
  • common options -(1) -
  • create -(1) -
  • delentry -(1) -
  • dump -(1) -
  • examine -(1) -
  • help -(1) -
  • idempotency -(1) -
  • listaddrs -(1) -
  • listpart -(1) -
  • listvldb -(1) -
  • listvol -(1) -
  • lock -(1) -
  • move -(1) -
  • partinfo -(1) -
  • privilege requirements -(1) -
  • release -(1) -
  • remove -(1) -
  • remsite -(1) -
  • rename -(1) -
  • restore -(1) -
  • status -(1) -
  • syncserv -(1) -
  • syncvldb -(1) -
  • unlock -(1) -
  • unlockvldb -(1) -
  • volinfo (see entry: vos examine) -(1) -
  • zap -(1) -
  • -
  • -W - -
  • weekly restart time for BOS Server - -
  • see entry: restart times for BOS Server -(1) -
  • -
  • wildcard - -
  • volume entry definition (Backup System) -(1), (2) -
  • -
  • workstations statistic in scout -(1) -
  • write shorthand notation for ACL permissions -(1) -
  • -X - -
  • X instruction - -
  • uss template file -(1) -
  • -
  • xfs_size_check command -(1) -
  • xstat as requirement for running afsmonitor -(1) -
  • xstat_cm_test command -(1) -
  • xstat_fs_test command -(1) -
  • -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg000.htm b/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg000.htm deleted file mode 100755 index ae88d5af4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg000.htm +++ /dev/null @@ -1,43 +0,0 @@ - - -Quick Beginnings - - - - - - - - - - - -

    Quick Beginnings

    -

    [Return to Library] [Table of Contents] [Bottom of Topic] [Next Topic] [Index]


    -AFS for Windows
    -Quick Beginnings
    -

    Version 3.6 -

    Document Number SC09-4564-00 -

    CT6Q8NA -

    First Edition (April 2000) -

    This edition applies to: -

    -
    IBM AFS for Windows, Version 3.6 -
    -

    and to all subsequent releases and modifications until otherwise indicated -in new editions. -

    This softcopy version is based on the printed edition of this book. -Some formatting amendments have been made to make this information more -suitable for softcopy. -

    Order publications through your IBM representative or through the IBM -branch office serving your locality. -

    © Copyright International Business Machines Corporation 1999. All rights reserved. -

    -


    [Return to Library] [Table of Contents] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg002.htm b/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg002.htm deleted file mode 100755 index 1333341c3..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg002.htm +++ /dev/null @@ -1,64 +0,0 @@ - - -Quick Beginnings - - - - - - - - - - - -

    Quick Beginnings

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    Table of Contents

    -

    IBM AFS for Windows Quick Beginnings
    -

    -
  • Introduction -
  • Document Overview - -
  • Audience -
  • Organization -
  • -
  • Installing AFS for Windows - -
  • AFS for Windows Components -
  • Installation Options -
  • Upgrading From an Earlier Version -
  • To Install AFS for Windows -
  • Changes Made to Your System -
  • -
  • AFS for Windows Documentation - -
  • The Online Documentation Directory -
  • The CD-ROM Documentation Directory -
  • Online Help -
  • -
  • Configuring AFS for Windows - -
  • To Configure the AFS Client -
  • To Configure the AFS Client as an AFS Light Gateway -
  • To Configure AFS Light -
  • To Configure the AFS Server -
  • To Configure the AFS Control Center -
  • -
  • Uninstalling AFS for Windows - -
  • Reinstalling and Upgrading -
  • Uninstallation Prerequisites -
  • To Uninstall AFS for Windows -
  • Changes Made to Your System -
  • -

    Index
    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg003.htm b/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg003.htm deleted file mode 100755 index 7914c7ff8..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg003.htm +++ /dev/null @@ -1,1203 +0,0 @@ - - -Quick Beginnings - - - - - - - - - - - -

    Quick Beginnings

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    IBM AFS for Windows Quick Beginnings

    -

    Introduction

    - - -

    AFS(R) is an enterprise file system that provides consistent -file access by way of a shared filespace. By joining the local file -systems of several File Server machines, AFS presents a single filespace -independent of machine boundaries. Files are stored on different -machines in the computer network but are accessible from all machines across -the enterprise. -

    IBM AFS for Windows(R), version 3.6 extends the full -capabilities of AFS to Microsoft(R) Windows operating -systems. -


    Document Overview

    -

    - -This document summarizes installation prerequisites, provides detailed -instructions on how to install, configure, and uninstall AFS for Windows, and -outlines the changes made to your system during the installation and -uninstallation processes. This document also describes the -documentation provided with AFS for Windows. -

    Audience

    -

    - -This document provides information for system administrators and users -responsible for the installation and configuration of the products included in -AFS for Windows. This document assumes that system administrators are -familiar with system administration in general and that users are familiar -with the basic terms and concepts of the Microsoft Windows operating -systems. -

    Organization

    -

    This document has the following organization: -

      -

    • Installing AFS for Windows outlines installable combinations of AFS components, -describes the procedure for installing the products that are included in AFS -for Windows, and lists the changes that the installation process makes to your -system. -

    • AFS for Windows Documentation presents the various types of documentation that are -provided with AFS for Windows and discusses procedures for accessing this -documentation. -

    • Configuring AFS for Windows describes the procedures for configuring the products that -are included in AFS for Windows. -

    • Uninstalling AFS for Windows outlines uninstallation prerequisites, describes the -procedure for uninstalling the products that are included in AFS for Windows, -and lists the changes that the uninstallation process makes to your -system. -
    -

    Installing AFS for Windows

    -

    This section outlines installable combinations of AFS components, -describes the procedure for installing AFS for Windows, and lists the changes -that the installation process makes to your system. -

    AFS for Windows Components

    -

    - -AFS for Windows, version 3.6 includes the following components: -

      -

    • - - - -AFS Server -

      The AFS Server runs AFS server processes and includes the AFS Server -Configuration Wizard to facilitate setup. -

    • - - - -AFS Control Center -

      The AFS Control Center includes two powerful graphical user interface (GUI) -tools to assist AFS system administrators in AFS cell administration: -the AFS Server Manager and the AFS Account Manager. -

    • - - - -AFS Client -

      The AFS Client provides direct access to the AFS filespace, enabling users -to manage files and directories in AFS. The AFS Client includes the AFS -Light Gateway. -

    • - - - -AFS Light -

      AFS Light provides access to the AFS filespace via an AFS Light Gateway -machine, enabling users to manage files and directories in AFS. -

    • - -AFS Supplemental Documentation -

      AFS Supplemental Documentation provides additional AFS system -administration information and includes the following documents: -IBM AFS Administration Guide and IBM AFS Administration -Reference. -

    -

    Installation Options

    -

    - - - -You can install the components of AFS for Windows in various combinations, -based on your Windows operating system. Refer to the IBM AFS for -Windows Release Notes for details on the specific software requirements -for each AFS for Windows component. Note that if you are installing the -AFS Server, you must also install the AFS Client, unless the AFS Client, -version 3.6 is already installed on the machine. Follow the -installation procedure described in To Install AFS for Windows regardless of the components you are installing. -
    Note: - - - - - -You have the option of altering the AFS for Windows setup program to disable -all but the client component. Such a client-only setup program renders -users unable to install any components other than the AFS Client. To -perform a client-only installation, create the file setup.co -in the same directory as the other installation files; the setup program -then only allows the AFS Client to be installed. Note that the contents -of the setup.co file are irrelevent. Follow the -installation procedure described in To Install AFS for Windows regardless of the type of installation you are -performing. -
    -

    Upgrading From an Earlier Version

    -

    - - - -On a Windows NT machine, it is not necessary to uninstall the -components of AFS for Windows for the purpose of upgrading the software; -you can install this release of AFS for Windows on your system -without removing or unconfiguring your existing software. To -upgrade AFS for Windows, follow the installation procedure described in To Install AFS for Windows. During the installation process, the -previous-version AFS component is upgraded and the AFS configuration -information is preserved. -

    On a Windows 95 or Windows 98 machine, you must uninstall the -previously-installed AFS Light component, as described in To Uninstall AFS for Windows, before upgrading AFS Light. -

    Note that the AFS for Windows installation tool does not allow a -user to install AFS components that have different version numbers. If -you have more than one AFS for Windows component installed on your machine, -you cannot update one component without updating all of the other components -as well. -

    To Install AFS for Windows

    - - - - - - - -

    Before installing AFS for Windows, refer to your IBM AFS for Windows -Release Notes for a detailed description of the installation -prerequisites. If you are running any other Windows applications, it is -recommended that you exit from them before installing AFS for Windows. -

      -

    1. Insert the AFS for Windows installation disk into your CD-ROM -drive. -

    2. Run the AFS for Windows setup program by using one of the -following methods: -
        -

      • From the Start menu, select Run. Type -drive:\setup where drive is -the drive letter of your CD-ROM drive. Click OK. -

      • In the Windows Explorer, select your CD-ROM drive, and -double-click the setup.exe program. -
      -

    3. The Welcome dialog box appears. Select the Next button -to continue with the installation process. -

    4. The Select Components dialog box appears. -
        -

      • In the Components box, select the AFS for Windows components -that you want to install or upgrade. See Installation Options for information on the various combinations of components -that can be installed on a Windows machine. Note that if you are -installing the AFS Server, you must also select to install (or upgrade) the -AFS Client, unless the AFS Client, version 3.6 is already installed on -your system. -

      • The Destination Folder box indicates the default drive and -directory in which the selected components will be installed. The -default drive is the drive where Windows is installed. The default -directory on that drive is \Program Files\Ibm\Afs. To select -another drive, directory, or both, select the Browse button. -
        Note:If you are upgrading from a previous-version of AFS for Windows or -reinstalling AFS for Windows, the installation directory that you choose must -be the same as the installation directory that was used by the -previously-installed version. -
        -
      -

      Select the Next button to continue with the installation -process. -

    5. The application files for the selected AFS for Windows components are -installed on your system. When the installation process finishes, the -Setup Complete dialog box appears, indicating that you must restart your -system before you can use the installed AFS products. Select Yes, -I want to restart my computer now, and then select the Finish -button. Your system is shut down and then restarted. -

      Installation of AFS for Windows is complete. -

    -

    Changes Made to Your System

    -

    - -This section describes the changes that are made to your system by installing -each AFS for Windows component. The information in this section is -based upon the default installation settings. -

    Changes made to your system by installing the AFS Client

    -

    Installing the AFS Client for Windows NT makes the following changes to -your system: -

      -

    • Creates a Start menu program group named IBM AFS -with the following program applications: -
      -

      The Documentation program entry allows access to the AFS online -documentation set that is provided with AFS for Windows. -

      The Client program subgroup enables users to access the AFS -Client property box and the AFS Client Online Help. -

      -

    • Adds the AFS Menu to the Windows NT Explorer's context menu. -

    • Creates a documentation directory and places the IBM AFS for Windows -Quick Beginnings and the IBM AFS for Windows Release Notes -online documents in the directory, which is located at \Program -Files\Ibm\Afs\Documentation. -

    • Adds AFS Credentials to the Startup program -group. The AFS Client icon is displayed in the taskbar at -startup. -

    • Creates the installation directories in which the setup program installs -AFS binaries, icons, and help files. The default directories are -\Program Files\Ibm\Afs\Client\Program and \Program -Files\Ibm\Afs\Common. -

    • Registers the AFS Client as a service. -

    • Installs the AFS Client Configuration utility and adds the AFS Client -Configuration icon to the Control Panel by placing the -afs_cpa.cpl file in the -\WindowsDefault\system32 directory, where -WindowsDefault is your Windows directory. -

    • Places the afsdcell.ini file in your Windows directory -and in the \Program Files\Ibm\Afs\Common directory. If you -have upgraded from a previous-version AFS Client, the AFS Client cell database -(afsdcell.ini) in the Windows directory is not -replaced. -

    • Modifies the Windows NT Registry by adding entries relevant to the AFS -Client. -
    -

    Changes made to your system by installing AFS Light

    -

    Installing AFS Light for Windows 95 and Windows 98 makes the following -changes to your system: -

      -

    • Creates a program group named IBM AFS with the following -program applications: -
      -

      The Documentation program entry allows access to the AFS online -documentation set that is provided with AFS for Windows. -

      The Light program subgroup enables users to access the AFS -Light property box and the AFS Light Online Help. -

      -

    • Adds the AFS Menu to the Windows Explorer's context menu. -

    • Creates a documentation directory and places the IBM AFS for Windows -Quick Beginnings and the IBM AFS for Windows Release Notes -online documents in the directory, which is located at \Program -Files\Ibm\Afs\Documentation. -

    • Creates the installation directories in which the setup program installs -AFS binaries, icons, and help files. The default directories are -\Program Files\Ibm\Afs\Client\Program and \Program -Files\Ibm\Afs\Common. -

    • Installs the AFS Light Configuration utility and adds the AFS Light -Configuration icon to the Control Panel by placing the -afs_cpa.cpl file in the -\WindowsDefault\system directory, where -WindowsDefault is your Windows directory. -

    • Places the afsdcell.ini file in your Windows directory -and in the \Program Files\Ibm\Afs\Common directory. -

    • Modifies the Windows Registry by adding entries relevant to AFS -Light. -
    -

    Changes made to your system by installing the AFS Server

    -

    Installing the AFS Server for Windows NT makes the following changes to -your system: -

      -

    • Creates a Start menu program group named IBM AFS -with the following program applications: -
      -

      The Documentation program entry allows access to the AFS online -documentation set that is provided with AFS for Windows. -

      The Server program subgroup enables users to access the AFS -Server Quick-Start Wizard. -

      -

    • Creates a documentation directory and places the IBM AFS for Windows -Quick Beginnings and the IBM AFS for Windows Release Notes -online documents in the directory, which is located at \Program -Files\Ibm\Afs\Documentation. -

    • Creates the installation directories in which the setup program installs -AFS binaries, icons, and help files. The default directories are -\Program Files\Ibm\Afs\Server\usr\afs\bin and \Program -Files\Ibm\Afs\Common. -

    • Registers the AFS Server as a service. -

    • Installs the AFS Server Configuration application and adds the AFS -Server Configuration icon to the Control Panel by placing the -afsserver.cpl file in the -\WindowsDefault\system32 directory, where -WindowsDefault is your Windows directory. -

    • Modifies the Windows NT Registry by adding entries relevant to the AFS -Server. -
    -

    Changes made to your system by installing the AFS Control Center

    -

    Installing the AFS Control Center for Windows NT makes the following -changes to your system: -

      -

    • Creates a Start menu program group named IBM AFS -with the following program applications: -
      -

      The Documentation program entry allows access to the AFS online -documentation set that is provided with AFS for Windows. -

      The Control Center program subgroup enables users to access the -Account Manager and the Server Manager. -

      -

    • Creates a documentation directory and places the IBM AFS for Windows -Quick Beginnings and the IBM AFS for Windows Release Notes -online documents in the directory, which is located at \Program -Files\Ibm\Afs\Documentation. -

    • Creates the installation directories in which the setup program installs -AFS binaries, icons, and help files. The default directories are -\Program Files\Ibm\Afs\Control Center and \Program -Files\Ibm\Afs\Common. -

    • Installs the AFS Control Center Properties utility and adds the AFS -Control Center icon to the Control Panel by placing the -afs_cpa.cpl file in the -\WindowsDefault\system32 directory, where -WindowsDefault is your Windows directory. This icon is added -to the Control Panel if only the AFS Control Center is installed on your -system. -

    • Places the afsdcell.ini file in your Windows directory -and in the \Program Files\Ibm\Afs\Common directory. -

    • Modifies the Windows NT Registry by adding entries relevant to the AFS -Control Center. -
    -

    Changes made to your system by installing the AFS Supplemental Documentation

    -

    Installing the AFS Supplemental Documentation makes the following -changes to your system: -

      -

    • Creates a Start menu program group named IBM AFS -with a program entry named Documentation. -

    • The following system administration documents are installed on the -machine: IBM AFS Administration Guide and IBM AFS -Administration Reference. These documents are added to the online -documentation directory, which is located at \Program -Files\Ibm\Afs\Documentation. The IBM AFS for Windows Quick -Beginnings and the IBM AFS for Windows Release Notes online -documents are also installed in the documentation directory. -

    • Modifies the Windows NT Registry by adding entries relevant to the AFS -Supplemental Documentation. -
    -

    AFS for Windows Documentation

    -

    This section describes the documentation that is provided with AFS for -Windows and details the procedures for accessing this documentation. -

    The Online Documentation Directory

    - - -

    Regardless of the components you install on your system, a documentation -directory is created. The default location is \Program -Files\Ibm\Afs\Documentation. This directory includes the IBM -AFS for Windows Quick Beginnings and IBM AFS for Windows Release -Notes. These same documents are available from the Documentation -index accessed from the Documentation entry in the Start -menu. -

    If you install the AFS Supplemental Documentation, then the documentation -directory also includes the following documents: IBM AFS -Administration Guide and IBM AFS Administration -Reference. These same documents are available from the -Documentation index accessed from the Documentation entry in the -Start menu. -

    To access the online documentation directory:

    -
      -

    1. From the Start menu, choose Programs, then choose -IBM AFS, then choose Documentation. -

    2. Select the document that you want to view. -
    -

    The CD-ROM Documentation Directory

    - - -

    The AFS for Windows CD-ROM contains a documentation directory. This -directory includes the following documentation: IBM AFS for Windows -Quick Beginnings, IBM AFS for Windows Release Notes, IBM -AFS Administration Guide, and IBM AFS Administration -Reference. The documentation is provided in HTML and PDF -formats. -

    To access the CD-ROM documentation directory:

    -
      -

    1. Insert the AFS for Windows CD-ROM into your machine's CD-ROM -drive. -

    2. Follow one of the paths listed below. Note that CD is -the drive letter of your CD-ROM drive. -
        -

      • For HTML documentation, follow the path -CD:\Documentation\Html. -

      • For PDF documentation, follow the path -CD:\Documentation\Pdf. -
      -
    -

    Online Help

    - - -

    Online help is installed along with each AFS for Windows component. -The online help documentation describes the features available from each -component. Use the Help menus and Help buttons -located on most dialog boxes to access the online help. You can get -help on topics by browsing the contents page, using the index to locate -topics, and using Find, the online help search engine. -


    Configuring AFS for Windows

    -

    - - -This section details the configuration procedure for each of the components of -AFS for Windows. You must configure the components on your system -before you can use AFS. -

    To Configure the AFS Client

    - - -
    Note:If you intend to configure the AFS Server on your Windows NT system, you do -not need to configure the AFS Client. The AFS Client is configured -automatically when the AFS Server is configured. In addition, if you -upgraded to this version of AFS for Windows from a previous-version AFS -Client, configuration information is preserved. You do not need to -reconfigure the AFS Client. -
    -
      -

    1. From the Start menu, choose Settings, then choose -Control Panel. -

    2. Double-click the AFS Client Configuration icon. The AFS -Client Configuration utility opens, displaying the General -tab. -

    3. In the Cell Name box, enter the name of the AFS cell in which -the machine is to be a client. -

    4. Select the AFS Cells tab. If the cell in which the -machine is to be a client is not listed in the list of AFS cells, choose the -Add button. The New Cell dialog box opens. Enter the -cell name in the AFS Cell box and a short description in the -Description box. -

      Choose the Add button. The Add Server dialog box -opens. In the Server Name box, enter the name of a Volume -Location Server in the selected cell. Choose OK to close the -Add Server dialog box. Repeat this process, adding information for all -Volume Location Servers in the cell. (If you do not know the names of -the Volume Location Servers in the AFS cell, consult your AFS system -administrator.) After all server information has been entered, choose -OK to close the New Cell dialog box. -

    5. Select the General tab and choose the Start Service -button to start the AFS Client service. -

    6. Select the Drive Letters tab. To map a drive letter on -the Windows NT machine to the AFS filespace, choose the Add -button. The Map Drive Letter dialog box opens. -

    7. In the Drive Letter box, select the drive to be mapped to the -AFS filespace or accept the default. In the AFS -Path box, indicate the AFS location to which you want to map the -selected drive, for example, /afs. If desired, enter a -description of the AFS drive mapping in the Description box. -Choose OK to connect the drive to the specified place in the AFS -filespace. -

    8. Choose OK to close the AFS Client Configuration utility. -

      The AFS Client is now configured in the selected AFS cell and the AFS -filespace can be accessed via the selected drive mapping in the Windows NT -Explorer. -

    -

    To Configure the AFS Client as an AFS Light Gateway

    - - - -

    You can configure the AFS Client on your Windows NT machine to serve as an -AFS Light Gateway. Your AFS Client, configured as an AFS Light Gateway, -makes it possible for AFS Light users to access the AFS filespace. -

      -

    1. Configure the AFS Client as detailed in To Configure the AFS Client. -

    2. From the Start menu, choose Settings, then choose -Control Panel. -

    3. Double-click the AFS Client Configuration icon. The AFS -Client Configuration utility opens, displaying the General -tab. -

    4. Select the Provide an AFS Light Gateway option. -

    5. Choose OK. -
        -

      • If the AFS Client service is running, a message box appears, informing you -that the service must be restarted. Choose Yes to restart -the AFS Client service and enable the AFS Light Gateway. -

      • If the AFS Client service is stopped, a message box appears, informing you -that you must start the AFS Client service. Choose Yes to -start the AFS Client service and enable the AFS Light Gateway. -
      -

    6. - -Add cell entries to your AFS Light Gateway's cell database. Note -that in order for an AFS Light user to access a cell, an entry for the cell -must exist in both the AFS Light cell database and the AFS Light Gateway cell -database. Incorrect or missing information about a cell in the gateway -machine's cell database renders light client machines unable to access -files. -

      To add an entry to the cell database: -

      Access the AFS Cells tab from the AFS Light Configuration -utility and choose the Add button. The New Cell dialog box -opens. Enter the cell name in the AFS Cell box and a short -description in the Description box. -

      Choose the Add button. The Add Server dialog box -opens. In the Server Name box, enter the name of a Volume -Location Server in the selected cell. Choose OK to close the -Add Server dialog box. Repeat this process, adding information for all -Volume Location Servers in the cell. (If you do not know the names of -the Volume Location Servers in the AFS cell, consult your AFS system -administrator.) After all server information has been entered, choose -OK to close the New Cell dialog box. -

    -

    - - - -The Windows NT machine is now configured as an AFS Light Gateway. Once -configured as an AFS Light Gateway, your AFS Client machine must be able to -authenticate AFS Light users in a Windows context. This authentication -can be achieved via a domain user account or via synchronized -machine user accounts. A domain user account is a user -account in a Windows domain. A machine user account is a user account -that is valid only on a particular host machine. -

    When the AFS Light Gateway is configured into a Windows domain, the AFS -Light user must log onto either a domain user account in the domain to which -the gateway belongs or a machine user account with the same username and -password as that of a domain user account in the gateway domain. -

    If machine user accounts are employed, then these accounts must be -synchronized on the AFS Light Gateway and AFS Light machines. A user -must log onto an AFS Light machine with the same username and password as that -of a machine user account that is defined on the AFS Light Gateway -machine. -

    To Configure AFS Light

    - - -

    AFS Light accesses the AFS filespace via an AFS Light Gateway. -Before configuring AFS Light, you must have a Windows NT machine running the -AFS Client and configured as an AFS Light Gateway. See To Configure the AFS Client as an AFS Light Gateway for more information. -

      -

    1. From the Start menu, choose Settings, then choose -Control Panel. -

    2. Double-click the AFS Light Configuration icon. The AFS -Light Configuration utility opens, displaying the General -tab. - - -

    3. In the Gateway box, enter the name of a Windows NT machine that -is configured as an AFS Light Gateway and click Connect Now. -The name of the gateway machine is the gateway's NetBIOS service name, in -the form mach-afs, where mach is the -host computer name up to a maximum of 11 characters. AFS Light must be -able to resolve this service name in order to communicate with the gateway -machine. Name resolution can be achieved by adding the gateway's -NetBIOS service name to the client's LMHOSTS file or to the appropriate -DNS or WINS servers. If the AFS Light machine and its AFS Light Gateway -machine reside on the same subnet, then no additional configuration is -required. -

      AFS Light automatically becomes a member of the same cell as its AFS Light -Gateway. The name of the cell is displayed in the Cell Name -box. -
      Note:If the AFS Light Gateway machine is in the same domain as the AFS Light -machine and the hostname of the gateway machine in this domain is -xyz-pc, you can specify the computer name in the Gateway -box as either xyz-pc or -xyz-pc.xcompany.com. -
      -

    4. Select the AFS Cells tab. If the cell to which the -machine belongs is not listed in the list of AFS cells, choose the -Add button. The New Cell dialog box opens. Enter the -cell name in the AFS Cell box and a short description in the -Description box. -

      Choose the Add button. The Add Server dialog box -opens. In the Server Name box, enter the name of a Volume -Location Server in the selected cell. Choose OK to close the -Add Server dialog box. Repeat this process, adding information for all -Volume Location Servers in the cell. (If you do not know the names of -the Volume Location Servers in the AFS cell, consult your AFS system -administrator.) After all server information has been entered, choose -OK to close the New Cell dialog box. -

      Note that an identical entry must exist in the AFS Light Gateway's -cell database (afsdcell.ini file) in order for the AFS Light -user to authenticate to the cell. See To Configure the AFS Client as an AFS Light Gateway for more information on synchronizing the gateway -machine's cell database with your light client's cell -database. -

    5. Select the Drive Letters tab. To map a drive letter on -the Windows machine to the AFS filespace, choose the Add -button. The Map Drive Letter dialog box opens. -

    6. In the Drive Letter box, select the drive to be mapped to the -AFS filespace or accept the default. In the AFS -Path box, indicate the AFS location to which you want to map the -selected drive, for example, /afs. If desired, enter a -description of the AFS drive mapping in the Description box. -Choose OK to connect the drive to the specified place in the AFS -filespace. -

    7. Choose OK to close the AFS Light Configuration utility. -

      AFS Light is now configured in the specified AFS cell and the AFS filespace -can be accessed via the drive mapping in the Windows Explorer. -

    -

    To Configure the AFS Server

    - - -

    The configuration process starts the services needed to run the AFS Server -and sets up AFS partitions on your Windows NT machine. Using the AFS -Configuration Wizard, you can quickly configure the AFS Server as either the -first server in a new AFS cell or as a server in an existing AFS cell. -Note that if you have upgraded to this version of the AFS Server, -previous-version configuration information is preserved; you do not need -to reconfigure the server. -

    - -To configure the AFS Server as the first AFS Server in a cell: -

      -

    1. From the Start menu, choose Programs, then choose -IBM AFS, then choose Server, and then choose -Configuration Wizard. The AFS Server Quick-Start -Wizard opens. -

    2. Choose the Next button. The Cell and Server Information -dialog box appears. -

    3. Choose the This will be the first server in a new AFS cell -option. -

    4. In the Cell Name box, enter a name for the new AFS cell. -

      The following constraints apply to the form of an internet domain name that -can be used as the name of an AFS cell: -

        -

      • The cell name must be unique in order to distinguish your AFS cell from -all others in the AFS global namespace. -

      • The cell name can contain as many as 64 characters; however, shorter -names are recommended. -

      • The cell name must include only lowercase characters, numbers, -underscores, dashes, and periods to ensure portability between different -operating system types. -

      • The cell name can include any numbers or letters, which are conventionally -separated by periods. -

      • The cell name must end in a suffix that indicates the type of institution -to which it belongs. Some of the standard suffixes are -.com, for business and other commercial organizations, -.edu, for educational institutions such as universities, -.gov, for government institutions, and -.mil, for military institutions. -
      -

    5. In the Password box, enter the character string to serve as the -password for the AFS Server principal account in the cell -(afs). All AFS Servers obtain AFS tokens as this principal, -and the Authentication Server's Ticket Granting Service (TGS) module uses -this password to encrypt the server tickets that AFS Clients present to -servers during mutual authentication. -

    6. In the Verify password box, retype the initial AFS password for -the AFS Server principal account for this cell to confirm the password -selection. -

    7. Choose the Next button. The Administrative Information -dialog box appears. -

    8. In the Name box, enter a username to serve as a generic AFS -administrative account for this cell (generally, admin.) -

      - -Use of a generic administrative account means that you do not need to grant -privileges to each system administrator. Instead, each administrator -knows the name and password of this generic administrative account and uses -this identity to authenticate to AFS when performing tasks that require -administrative privileges. -

    9. In the Password box, enter a character string to serve as the -password for the AFS administrative account. -

    10. In the Verify password box, retype the password for the AFS -administrative account to confirm the password selection. -

    11. Specify the AFS User ID (UID) to assign to the AFS administrative -account: -
        -

      • (Recommended) To automatically assign the next available UID to the AFS -administrative account, choose the Use the next available AFS UID -option. -

      • To assign a specific UID to the AFS administrative account, choose the -Use this AFS ID option and enter the desired UID in the entry -box. -
        Note:It is not generally recommended that you assign a specific UID to a new AFS -account, unless you need to make the AFS UID match an existing UNIX -UID. -
        -
      -

    12. Choose the Next button. The File Service dialog box -appears. -

      - -AFS File Servers deliver requested files and data from the server to AFS -Clients. File Servers store files and data, handle requests for -copying, moving, creating, and deleting files and directories, and keep track -of status information about each file and directory on the server. -

      Because you are configuring the first AFS Server in a new cell, the File -Service must be configured on the server, and will be configured -automatically. -

    13. Choose the Next button. The Database Service dialog box -appears. -

      - -Every AFS cell must contain at least one Database Server. Each Database -Server runs the Database processes that maintain the AFS databases: the -Authentication Database, the Protection Database, the Volume Location -Database, and optionally the Backup Database. -

      Because you are configuring the first AFS Server in a new cell, the -Database Service must be configured on the server, and will be configured -automatically. -

    14. Choose the Next button. The Backup Server dialog box -appears. -

      - -A Backup Server maintains the Backup Database where information related to the -Backup system is stored. The Backup Server enables the AFS system -administrator to back up data in the AFS filespace from volumes to -tape. The data can then be restored from tape in the event that it is -lost from the file system (for example, if a system or disk failure causes -data to be lost). -

    15. Choose the Yes, configure as a Backup Server option if you want -to configure this AFS Server as a Backup Server. If you do not want to -configure this AFS Server as a Backup Server, choose the No, do not -configure as a Backup Server option. -
      Note:If the Backup Server is configured on any Database Server in the cell, it -must be configured on all Database Servers in the cell. -
      -

    16. Choose the Next button. The AFS Partition dialog box -appears. -

      - -Every AFS File Server must have at least one partition designated exclusively -to storing AFS volumes, and all AFS volumes must reside on partitions that -have been designated as AFS partitions. On a Windows NT machine, only -NTFS volumes can be designated as AFS partitions. In addition, AFS -partitions can be created only on NTFS volumes that are empty (or contain only -the Windows NT Recycle Bin). -

      Because you are configuring the first AFS Server in a new cell, you must -designate an AFS partition on the server. -

    17. In the list of NTFS volumes, choose the volume you want to designate as an -AFS partition. In the AFS Partition Name box, enter the last -part of the partition name. -
      Note:There can exist up to 256 AFS partitions on an AFS Server. By -convention, each partition is named /vicepx, where -x is one or two lowercase letters of the English alphabet. -AFS partitions can be named /vicepa, /vicepb, and so on -up to /vicepz. Additional partitions can be named -/vicepaa through vicepaz and so on up to -/vicepiv. -
      -

      It is strongly recommended that you use the NTFS volume drive letter as the -last letter of the partition name. -

    18. Choose the Next button. The Root AFS Volumes dialog box -appears. -

      - - - -The root AFS volumes are two volumes that every AFS cell must include in its -file system. They are named: -

        -

      • root.afs, for the volume corresponding to the top -(/afs) level of the AFS filespace -

      • root.cell, for the volume mounted just below -/afs at the cell's name (for example, -/afs/yourcompany.com in the -yourcompany.com cell) -
      -

      Because you are configuring the first AFS Server in a new cell, the -cell's root volumes must be created on the server, and will be created -automatically during the configuration of the server. -

    19. Choose the Next button. The Replication dialog box -appears. -

      - -If you want to be able to take advantage of the replication capabilities of -AFS, the AFS root volumes must be replicated. The replication process -creates one or more read-only copies of an AFS volume, and distributes these -copies to one or more other sites (AFS partitions and servers). -Replication increases system efficiency and improves data availability by -making the contents of an AFS volume accessible on one or more AFS File Server -machines. -

      Because you are configuring the first AFS Server in a new cell, the -cell's root volumes must be replicated on the server, and will be -replicated automatically during the configuration of the server. -

    20. Choose the Next button. The System Control Service -dialog box appears. -

      - -In cells running the domestic version of AFS for Windows, the System Control -Server distributes new versions of AFS Server configuration information to all -AFS servers. It is generally recommended that you designate the first -server in an AFS cell as the System Control Server. (Cells running the -international version of AFS for Windows do not use the System Control Server -to distribute system configuration files.) -
      Note:The role of System Control Server can later be assigned to a different server -machine if desired. However, depending on the number of AFS servers in -the cell, the process of assigning the role to another machine can be very -time-consuming. -
      -

    21. To configure this AFS Server as the System Control Server for the AFS -cell, choose the Configure as the System Control Server -option. If you do not want to configure this AFS Server as the System -Control Server for the AFS cell, choose the Do not configure as the -System Control Server option. -

    22. Choose the Next button. The Configure the System dialog -box appears. -

      A list of the steps that will be taken to configure this AFS Server is -displayed, enabling you to review the steps before starting the actual -configuration process. -
      Note:To return to a previous step to review or modify your selections, choose the -Back button. -
      -

    23. To begin configuration of the AFS Server on this machine, choose the -Configure button. The AFS Server is configured according to -your specifications. The progress bar at the bottom of the dialog box -indicates the steps in progress. A message box appears indicating that -configuration is complete. -
    -

    - -To configure the AFS Server into an existing AFS cell: -

      -

    1. From the Start menu, choose Programs, then choose -IBM AFS, then choose Server, and then choose -Configuration Wizard. The AFS Server Quick-Start -Wizard opens. -

    2. Choose the Next button. The Cell and Server Information -dialog box appears. -

    3. Choose the Make this host a server in an existing AFS cell -option. -

    4. In the Cell Name box, enter the name of the AFS cell to which -you want to add the new AFS Server. -

    5. Choose the Next button. The Administrative Information -dialog box appears. -

    6. In the Name box, enter the username of the AFS administrative -account, for example admin, or the username of an AFS user account -with administrative privileges. -

    7. In the Password box, enter the password for the AFS -administrative account or the AFS user account with administrative privileges -entered in the Name box. -

    8. In the AFS Server box, enter the hostname of a running AFS -Server in this AFS cell. AFS configuration information will be -retrieved from the server for use in configuring this new AFS Server. -

    9. Choose the Next button. The File Service dialog box -appears. -

      - -AFS File Servers deliver requested files and data from the server to AFS -Clients. File Servers store files and data, handle requests for -copying, moving, creating, and deleting files and directories, and keep track -of status information about each file and directory on the server. -

      To configure this AFS Server as a File Server, choose the Yes, -configure as a File Server option. If you do not want to -configure this AFS Server as a File Server, choose the No, do not -configure as a File Server option. -

    10. Choose the Next button. The Database Service dialog box -appears. -

      - -Every AFS cell must contain at least one Database Server. Each Database -Server runs the Database processes that maintain the AFS databases: the -Authentication Database, the Protection Database, the Volume Location -Database, and optionally the Backup Database. -

      To configure this AFS Server as a Database Server, choose the Yes, -configure as a Database Server option. If there is a System -Control Server in the AFS cell to which you are adding the server, enter its -hostname in the System Control Server box. AFS configuration -information (for example, the list of AFS Database Servers maintained in the -CellServDB file on each AFS Server machine) will be updated by this -server. If you do not want to configure this AFS Server as a Database -Server, choose the No, do not configure as a Database Server -option. -

    11. Choose the Next button. The Backup Server dialog box -appears. -

      - -A Backup Server maintains the Backup Database where information related to the -Backup system is stored. The Backup Server enables the AFS system -administrator to back up data in the AFS filespace from volumes to -tape. The data can then be restored from tape in the event that it is -lost from the file system (for example, if a system or disk failure causes -data to be lost). -
      Note:The Backup Server can only be configured on a machine that is configured as a -Database Server. Also, if the Backup Server is configured on any -Database Server in the cell, it must be configured on all Database -Servers in the cell. -
      -

    12. Choose the Yes, configure as a Backup Server option if you want -to configure this AFS Server as a Backup Server. If you do not want to -configure this AFS Server as a Backup Server, choose the No, do not -configure as a Backup Server option. -

    13. Choose the Next button. The AFS Partition dialog box -appears. -

      If you are configuring this AFS Server as a File Server, you must specify -an NTFS volume to designate as an AFS partition. Every AFS File Server -must have at least one partition designated exclusively to storing AFS -volumes, and all AFS volumes must reside on partitions that have been -designated as AFS partitions. On a Windows NT machine, only NTFS -volumes can be designated as AFS partitions. In addition, AFS -partitions can be created only on NTFS volumes that are empty (or contain only -the Windows NT Recycle Bin). -

      To designate a volume as an AFS partition, choose the Yes, create a -partition option. In the list of NTFS volumes, choose the volume -that you want to designate as an AFS partition. In the AFS -Partition Name box, enter the last part of the partition name. -
      Note:There can exist up to 256 AFS partitions on an AFS Server. By -convention, each partition is named /vicepx, where -x is one or two lowercase letters of the English alphabet. -AFS partitions can be named /vicepa, /vicepb, and so on -up to /vicepz. Additional partitions can be named -/vicepaa through vicepaz and so on up to -/vicepiv. -
      -

      It is strongly recommended that you use the NTFS volume drive letter as the -last letter of the partition name. -

      If you do not want to designate a volume as an AFS partition, choose the -No, do not create a partition option. -

    14. Choose the Next button. The Root AFS Volumes dialog box -appears. -

      The root AFS volumes are two volumes that every AFS cell must include in -its file system. They are named: -

        -

      • root.afs, for the volume corresponding to the top -(/afs) level of the AFS filespace -

      • root.cell, for the volume mounted just below -/afs at the cell's name (for example, -/afs/yourcompany.com in the -yourcompany.com cell) -
      - -Because you are adding this AFS Server to an existing AFS cell, the root AFS -volumes already exist in the cell, and the AFS Configuration Wizard indicates -that you do not need to create the root volumes. -
      Note:If for some reason the root AFS volumes do not yet exist in this AFS cell, -you can choose the Yes, create the root volumes option to create -the root volumes on this AFS Server. -
      -

    15. Choose the Next button. The Replication dialog box -appears. -

      If you want to be able to take advantage of the replication capabilities of -AFS, the AFS root volumes must be replicated. The replication process -creates one or more read-only copies of an AFS volume, and distributes these -copies to one or more other sites (AFS partitions and servers). -Replication increases system efficiency and improves data availability by -making the contents of an AFS volume accessible on one or more AFS File Server -machines. -

      Because you are adding this AFS Server to an existing AFS cell, the root -AFS volumes are probably already replicated, and the AFS Server Configuration -Wizard indicates that you do not need to replicate the root AFS -volumes. -
      Note:If for some reason the root AFS volumes are not yet replicated in this AFS -cell, you can choose the Yes, replicate the root volumes option to -replicate the AFS cell's root volumes on this AFS Server. -
      -

    16. Choose the Next button. The System Control Service -dialog box appears. -

      In cells running the domestic version of AFS for Windows, the System -Control Server distributes new versions of AFS Server configuration -information to all AFS servers and the System Control Client machines obtain -common AFS configuration files from the System Control machine. (Cells -running the international version of AFS for Windows do not use the System -Control Server to distribute system configuration files or the System Control -Client to obtain these files.) -

    17. To configure this AFS Server as the System Control Server for the AFS -cell, choose the Configure as the System Control Server -option. To configure this AFS Server as a System Control Client, choose -the Configure as a System Control Client option and enter the -hostname of the System Control Server in this AFS cell. The AFS Server -will obtain new versions of AFS Server configuration information from the -server specified. If you do not want to configure this AFS Server as -the System Control Server for the AFS cell or as a System Control Client, -choose the Do not configure as the System Control Client or Server -option. -

    18. Choose the Next button. The Configure the System dialog -box appears. -

      A list of the steps that will be taken to configure this AFS Server is -displayed, enabling you to review the steps before starting the actual -configuration process. -
      Note:To return to a previous step to review or modify your selections, choose the -Back button. -
      -

    19. To begin configuration of the AFS Server on this machine, choose the -Configure button. If you are configuring the AFS Server into -an AFS cell in which there are Database Servers running a version of AFS older -than version 3.5, a dialog box appears prompting you to enter the AFS -principal password. -

      The AFS Server is configured according to your specifications. The -progress bar at the bottom of the dialog box indicates the steps in -progress. A message box appears indicating that configuration is -complete. -

    -

    To Configure the AFS Control Center

    - - -
    Note:If you have installed the AFS Control Center in combination with the AFS -Server, or the AFS Client, or both, then you do not need to configure the AFS -Control Center. The AFS Control Center is automatically configured when -the AFS Server or AFS Client is configured. If you have installed the -AFS Control Center only, then the Control Center must be configured on your -system before it can be used. -
    -
      -

    1. From the Start menu, choose Settings, then choose -Control Panel. -

    2. Double-click the AFS Control Center icon. The AFS -Control Center Properties dialog box appears. -

    3. In the Default Cell box, enter the full name of the AFS cell to -be administered by default. -

    4. If the cell to be administered by the AFS Control Center is not listed in -the list of AFS cells, choose the Add button. The New Cell -dialog box opens. Enter the cell name in the AFS Cell box -and a short description in the Description box. -

      Choose the Add button. The Add Server dialog box -opens. In the Server Name box, enter the name of a Volume -Location Server in the selected cell. Choose OK to close the -Add Server dialog box. Repeat this process, adding information for all -Volume Location Servers in the cell. After all server information has -been entered, choose OK to close the New Cell dialog box. -

    5. Choose OK to close the AFS Control Center Properties dialog -box. -
    -

    The AFS Control Center is now configured. - -


    Uninstalling AFS for Windows

    -

    This section outlines uninstallation prerequisites, provides -instructions for uninstalling AFS for Windows, and lists the changes that the -uninstallation process makes to your system. - - -

    Reinstalling and Upgrading

    -

    On a Windows NT machine, it is not necessary to uninstall -the components of AFS for Windows for the purpose of reinstalling or upgrading -the software. To reinstall or upgrade AFS for Windows, follow the -installation procedure described in To Install AFS for Windows. During the installation process, the -previously-installed AFS components are replaced. AFS configuration -information is preserved. -

    On a Windows 95 or Windows 98 machine, you must uninstall the -previously-installed AFS Light component, as described in To Uninstall AFS for Windows, before reinstalling or upgrading AFS Light. - - - -

    Uninstallation Prerequisites

    -

    Uninstalling AFS results in the deletion of all AFS application -files. These files cannot be deleted if other applications are using -them. For this reason, you must close all AFS dialog boxes before -uninstalling AFS for Windows. -

    If you are uninstalling the AFS Server for the purpose of decommissioning -the machine, the following prerequisites are necessary to avoid loss of -data: -

      -

    1. If the AFS Server is functioning as a File Server, move all read/write -volumes to another AFS File Server, and remove all read-only volumes. -

    2. Unconfigure the AFS Server. Open the AFS Server Configuration -utility and choose the Server tab. Clear all check boxes and -choose OK. -
    - - - - - - - -

    To Uninstall AFS for Windows

    -
      -

    1. From the Start menu, choose Settings, then choose -Control Panel. -

    2. Double-click the Add/Remove Programs icon. The -Add/Remove Programs Properties dialog box appears, displaying the -Install/Uninstall tab. -

    3. Close the Control Panel. -

    4. Select the AFS component to be uninstalled, and select the -Add/Remove button. The Confirm File Deletion dialog box -appears, verifying that you want to remove the selected AFS for Windows -component. Click Yes to continue with the uninstallation -procedure. -

    5. An AFS message box appears asking if you want to preserve configuration -information. Select Yes to preserve configuration -information or No to delete all configuration information. -(No configuration information is associated with the AFS Supplemental -Documentation component. If you are removing this component from your -system, the AFS message box does not appear.) -

    6. The Remove Programs from your Computer dialog box opens, displaying the -components being removed from your system. -
      Note:A message box can possibly appear asking if you want to remove shared AFS -files that are no longer needed by other components. Click Yes To -All to completely remove the selected AFS component. -
      -
    -

    The selected AFS for Windows component is now uninstalled. If you -installed a combination of AFS for Windows components, you must repeat Steps -4-6 to remove each component separately. -

    Changes Made to Your System

    - -

    Changes made to your system by uninstalling the AFS Client

    -

    Uninstalling the AFS Client makes the following changes to your -system: -

      -

    • Removes all AFS Client files from the \Program -Files\Ibm\Afs\Client\Program directory, removes the Client -directory, and, if no other AFS components remain installed, removes the -Ibm directory. -
      Note:The directories are not removed if they contain any files other -than those installed by the AFS for Windows setup program. -
      -

    • Removes the IBM AFS program group from the Start -menu if no other AFS components remain installed. -

    • Removes the AFS Client Configuration icon from the Control -Panel. -

    • Removes the AFS Menu from the Windows NT Explorer's context -menu. -

    • Deletes the IBM AFS Client service. -

    • Removes AFS Client related registry entries from your system. Note -that if you chose to preserve configuration information, some information -remains in the registry after the uninstallation process. -
    -

    Changes made to your system by uninstalling AFS Light

    -

    Uninstalling AFS Light makes the following changes to your -system: -

      -

    • Removes all AFS files from the \Program -Files\Ibm\Afs\Client\Program directory and removes the Ibm -directory. -
      Note:The directories are not removed if they contain any files other -than those installed by the AFS for Windows setup program. -
      -

    • Removes the IBM AFS program group from the Start -menu. -

    • Removes the AFS Light Configuration icon from the Control -Panel. -

    • Removes the AFS Menu from the Windows Explorer's context menu. -

    • Removes AFS Light related registry entries from your system. Note -that if you chose to preserve configuration information, some information -remains in the registry after the uninstallation process. -
    -

    Changes made to your system by uninstalling the AFS Server

    -

    Uninstalling the AFS Server makes the following changes to your -system: -

      -

    • Removes all AFS Server files from the \Program -Files\Ibm\Afs\Server directory, removes the Server directory, -and, if no other AFS components remain installed, removes the Ibm -directory. -
      Note:These directories are not removed if they contain any files other -than those installed by the AFS for Windows setup program. -Also, if you chose to preserve configuration information, some files in the -\Program Files\Ibm\Afs\Server directory are not -removed. -
      -

    • Removes the IBM AFS program group from the Start -menu if no other AFS components remain installed. -

    • Removes the AFS Server Configuration icon from the Control -Panel. -

    • Deletes the IBM AFS Server service. -

    • Removes AFS Server related registry entries from your system. Note -that if you chose to preserve configuration information, some information -remains in the registry after the uninstallation process. -
    -

    Changes made to your system by uninstalling the AFS Control Center

    -

    Uninstalling the AFS Control Center makes the following changes to your -system: -

      -

    • Removes all AFS Control Center files from the \Program -Files\Ibm\Afs\Control Center directory, removes the Control -Center directory, and, if no other AFS components remain installed, -removes the Ibm directory. -
      Note:These directories are not removed if they contain any files other -than those installed by the AFS for Windows setup program. -
      -

    • Removes the IBM AFS program group from the Start -menu if no other AFS components remain installed. -

    • Removes the AFS Control Center icon from the Control -Panel. Note that this icon appears in the Control Panel only if no -other AFS for Windows components are installed on your system. -

    • Removes AFS Control Center related registry entries from your -system. Note that if you chose to preserve configuration information, -some information remains in the registry after the uninstallation -process. -
    -

    Changes made to your system by uninstalling the AFS supplemental documentation

    -

    Uninstalling the AFS supplemental documentation makes the following -changes to your system: -

      -

    • Removes the SysAdminGd directory and the CmdRef -directory from the \Program Files\Ibm\Afs\Documentation\Html -directory, and, if no other AFS components remain installed, removes the -Ibm directory. -
      Note:These directories are not removed if they contain any files other -than those installed by the AFS for Windows setup program. -
      -

    • Removes the IBM AFS program group from the Start -menu if no other AFS components remain installed. -

    • Removes AFS supplemental documentation related registry entries from your -system. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg004.htm b/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg004.htm deleted file mode 100755 index 507c334a0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/InstallGd/awqbg004.htm +++ /dev/null @@ -1,341 +0,0 @@ - - -Quick Beginnings - - - - - - - - - - - -

    Quick Beginnings

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic]

    -

    -


    Index

    -A -B -C -D -F -G -I -L -M -O -R -S -U -
    -A - -
  • AFS - -
  • client - -
  • overview -(1) -
  • -
  • components -(1) -
  • configuration - -
  • AFS Client -(1) -
  • AFS Control Center -(1) -
  • AFS Light -(1) -
  • AFS Light Gateway -(1) -
  • AFS Server -(1) -
  • overview -(1) -
  • -
  • control center - -
  • overview -(1) -
  • -
  • installation options -(1) -
  • installation procedure -(1) -
  • light - -
  • overview -(1) -
  • -
  • overview -(1) -
  • reinstalling -(1) -
  • server - -
  • overview -(1) -
  • -
  • supplemental documentation component -(1) -
  • uninstallation prerequisites -(1) -
  • uninstallation procedure -(1) -
  • upgrading -(1) -
  • -
  • AFS Client -(1) - -
  • setup.co file -
  • client-only installation -(1) -
  • configuration -(1) -
  • configure as AFS Light Gateway -(1) -
  • installation -(1) -
  • overview -(1) -
  • uninstallation -(1) -
  • -
  • AFS Control Center - -
  • configuration -(1) -
  • installation -(1) -
  • overview -(1) -
  • uninstallation -(1) -
  • -
  • AFS Light - -
  • configuration -(1) -
  • gateway machine -(1) -
  • installation -(1) -
  • overview -(1) -
  • uninstallation -(1) -
  • -
  • AFS Light Gateway - -
  • authenticating AFS Light users -(1) -
  • configuration -(1) -
  • synchronizing the cell database -(1) -
  • -
  • AFS partitions -(1) -
  • AFS Server - -
  • configuration - -
  • as first server in a cell -(1) -
  • as server in an existing cell -(1) -
  • overview -(1) -
  • -
  • installation -(1) -
  • overview -(1) -
  • uninstallation -(1) -
  • -
  • audience -(1) -
  • -B - -
  • Backup Server - -
  • configuring in a new cell -(1) -
  • configuring in an existing cell -(1) -
  • -
  • -C - -
  • CD-ROM documentation -(1) -
  • client - -
  • overview -(1) -
  • -
  • client-only installation -(1) -
  • configuration -(1) -
  • control center - -
  • overview -(1) -
  • -
  • -D - -
  • Database Server - -
  • configuring in a new cell -(1) -
  • configuring in an existing cell -(1) -
  • -
  • documentation - -
  • CD-ROM -(1) -
  • online -(1) -
  • online help -(1) -
  • -
  • domain user accounts -(1) -
  • -F - -
  • File Server - -
  • configuring in a new cell -(1) -
  • configuring in an existing cell -(1) -
  • -
  • -G - -
  • gateway machine name -(1) -
  • generic administrative account -(1) -
  • -I - -
  • installation - -
  • changes made to your system -(1) -
  • client-only installation -(1) -
  • possible component combinations -(1) -
  • procedure -(1) -
  • upgrading from an earlier version -(1) -
  • -
  • installation options -(1) -
  • installation procedure -(1) -
  • -L - -
  • light - -
  • overview -(1) -
  • -
  • -M - -
  • machine user accounts -(1) -
  • -O - -
  • online documentation -(1) -
  • online help -(1) -
  • overview - -
  • AFS -(1) -
  • document -(1) -
  • -
  • -R - -
  • reinstalling -(1) -
  • replication - -
  • when configuring a new cell -(1) -
  • -
  • root AFS volumes - -
  • when configuring a new cell -(1) -
  • when configuring a server in an existing cell -(1) -
  • -
  • root.afs -(1) -
  • root.cell -(1) -
  • -S - -
  • server - -
  • overview -(1) -
  • -
  • setup.co file -(1) -
  • System Control Server - -
  • in a new AFS cell -(1) -
  • -
  • -U - -
  • uninstallation - -
  • changes made to your system -(1) -
  • overview -(1) -
  • prerequisites -(1) -
  • procedure -(1) -
  • -
  • uninstallation prerequisites -(1) -
  • uninstallation procedure -(1) -
  • upgrading -(1) -
  • -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns000.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns000.htm deleted file mode 100755 index 11d0e209a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns000.htm +++ /dev/null @@ -1,43 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Table of Contents] [Bottom of Topic] [Next Topic] [Index]


    -AFS for Windows
    -Release Notes
    -

    Version 3.6 -

    Document Number GC09-4559-00 -

    0000000 -

    First Edition (April 2000) -

    This edition applies to: -

    -
    IBM AFS for Windows, Version 3.6 -
    -

    and to all subsequent releases and modifications until otherwise indicated -in new editions. -

    This softcopy version is based on the printed edition of this book. -Some formatting amendments have been made to make this information more -suitable for softcopy. -

    Order publications through your IBM representative or through the IBM -branch office serving your locality. -

    © Copyright International Business Machines Corporation 2000. All rights reserved. -

    -


    [Return to Library] [Table of Contents] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns002.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns002.htm deleted file mode 100755 index 89f33369b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns002.htm +++ /dev/null @@ -1,135 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    Table of Contents

    -

    Introduction
    -

    -
  • Overview -
  • About the Release Notes - -
  • Audience -
  • Document Organization -
  • -

    AFS Client Release Notes
    -

    -
  • Introduction -
  • AFS Client Installation Requirements - -
  • Hardware -
  • Software -
  • Administrative Privilege Requirement -
  • -
  • Product Notes - -
  • Additional Configuration Options Available Via the Client Interface -
  • AFS Client Cache Location Is Now Configurable -
  • Mapping Global Drives to the AFS Filespace -
  • AFS Client Computer Name Must Correspond to the Name Service Host Name -
  • AFS Command-Line Binaries -
  • The AFS Client Must Be Installed in a Directory Whose Path Contains Only ANSI Characters -
  • Disabling All but the Client Component of the AFS for Windows Setup Program -
  • Temporary Files -
  • National Language Support for the AFS Client -
  • The kpwvalid Password Strength Checker Is Not Used on Windows Systems -
  • Configurable LAN Adapter Number -
  • WinLogon Graphical Identification and Authentication (GINA) Modules and AFS Authentication -
  • Cell Database Is Maintained During Upgrade -
  • -
  • Limitations and Restrictions - -
  • Symbolic Links to AFS Files and Directories -
  • AFS Client Can Fail to Load When Network Drives Are in the Application Path -
  • -

    AFS Light Release Notes
    -

    -
  • Introduction -
  • AFS Light Installation Requirements - -
  • Hardware -
  • Software -
  • Administrative Privilege Requirement -
  • -
  • Product Notes - -
  • Accessing AFS via the AFS Light Gateway -
  • AFS Light for Windows 95 Requires the Windows Sockets 2 Update -
  • AFS Command-Line Binaries -
  • AFS Light Must Be Installed in a Directory Whose Path Contains Only ANSI Characters -
  • Temporary Files -
  • National Language Support for AFS Light -
  • The kpwvalid Password Strength Checker Is Not Used on Windows Systems -
  • -
  • Limitations and Restrictions - -
  • Encryption Not Supported in Simplified Chinese Version -
  • Symbolic Links to AFS Files and Directories -
  • -

    AFS Server Release Notes
    -

    -
  • Introduction -
  • AFS Server Installation Requirements - -
  • Hardware -
  • Software -
  • Administrative Privilege Requirement -
  • -
  • Product Notes - -
  • Support for Volumes That Are Greater Than 2 GB -
  • Encryption Routines Used by the System Control Server Are Included with All Versions of AFS for Windows -
  • AFS Server Computer Name Must Correspond to the Name Service Host Name -
  • Time Clock Synchronization -
  • Securing AFS Server Machines -
  • Shutting Down AFS File Server Machines -
  • Obtaining Crash Dump Files in the Event of Server Problems -
  • The AFS Server Must Be Installed in a Directory Whose Path Contains Only ANSI Characters -
  • Temporary Files -
  • National Language Support for the AFS Server -
  • The kpwvalid Password Strength Checker Is Not Used on Windows Systems -
  • Configuring a Server into a Cell with pre-3.5 Database Servers Requires the Principal Password -
  • -
  • Limitations and Restrictions - -
  • AFS bosserver Process Does Not Execute the Notifier Program When a Process Terminates -
  • -

    AFS Control Center Release Notes
    -

    -
  • Introduction -
  • AFS Control Center Installation Requirements - -
  • Hardware -
  • Software -
  • Administrative Privilege Requirement -
  • -
  • Product Notes - -
  • The AFS Control Center Must Be Installed in a Directory Whose Path Contains Only ANSI Characters -
  • Temporary Files -
  • National Language Support for the AFS Control Center -
  • The kpwvalid Password Strength Checker Is Not Used on Windows Systems -
  • Tokens Obtained for Control Center Applications Expire after 25 Hours -
  • Server Manager Displays All Server Entries Referenced in the Volume Location Database (VLDB) -
  • -
  • Limitations and Restrictions -
  • -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns003.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns003.htm deleted file mode 100755 index acc35b39f..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns003.htm +++ /dev/null @@ -1,98 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Introduction

    -

    Overview

    -

    AFS(R) is a distributed file system that provides -secure, reliable access to information across an enterprise. By -seamlessly uniting the directories and files on individual file server -machines into one file system accessible from any desktop, AFS presents users -with a single filespace independent of machine boundaries. -

    AFS offers several advantages. It improves the availability of files -by employing client-side caching and replication of frequently accessed data -across multiple file servers. AFS provides powerful security to protect -the information stored in the filespace. In addition, AFS is highly -scalable. Virtually unlimited additional server and client machines can -be added as needed to an AFS configuration with little impact on existing -server and client machines. This enables the file system to grow with -the enterprise. -

    AFS for Windows includes the following products: -

      -

    • AFS Server -

      The AFS Server runs AFS server processes on a Windows NT(R) -machine. An AFS Server on a Windows NT machine can be configured as one -or more of the following: an AFS File Server, an AFS Database Server, an -AFS Backup Server, and an AFS System Control Server. The AFS Server -includes the AFS Server Configuration Wizard to facilitate setup. -

    • AFS Control Center -

      The AFS Control Center includes two powerful graphical user interface (GUI) -tools to assist AFS system administrators in AFS cell administration: -the AFS Server Manager, a tool that facilitates the administration of volumes -and services on one or more AFS servers (on Windows NT and UNIX systems), and -the AFS Account Manager, a tool that enables simple creation and maintenance -of AFS user and group accounts. -

    • AFS Client -

      The AFS Client provides direct access to the AFS filespace from a PC -running Windows NT, enabling users to manage files and directories in -AFS. -

    • AFS Light -

      AFS Light provides access to the AFS filespace from a PC running Windows 98 -or Windows 95 by forwarding AFS requests to another PC on which the AFS Client -is installed. -

    -

    About the Release Notes

    -

    This document contains important information about AFS for Windows, -version 3.6. This document summarizes the installation -prerequisites, product notes, and specific limitations and restrictions of -this release. -

    -
    Note:AFS for Windows users can view the README.txt file to check -for any additional AFS for Windows information that became available since the -writing of this document. The README.txt file is -installed in the AFS for Windows -Installation\documentation directory when AFS for Windows is -installed. -
    -

    Audience

    -

    This document is written for system administrators responsible for the -installation, configuration, and use of the products included in AFS for -Windows. This document assumes that readers are familiar with system -administration in general and with the use of AFS. -

    Document Organization

    -

    The document has the following organization: -

    -

    Each section describes installation requirements, product notes, and -limitations and restrictions for the specified AFS for Windows -component. Also, where applicable, descriptions of new features and -enhancements that are made available in this release of AFS for Windows are -included. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns004.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns004.htm deleted file mode 100755 index d640a7552..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns004.htm +++ /dev/null @@ -1,238 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    AFS Client Release Notes

    -

    Introduction

    -

    This section contains important information about the AFS Client -component of AFS for Windows, version 3.6. The AFS Client -provides direct access to the AFS filespace from a PC running Windows NT, -enabling users to manage files and directories in AFS. The AFS Client -includes the AFS Light Gateway, which enables AFS Light users to access the -AFS filespace. -


    AFS Client Installation Requirements

    -

    Your system must meet the following hardware, software, and -administrative privilege requirements to install the AFS Client. -

    Hardware

    -

    The hardware requirements for installing the AFS Client are: -

      -

    • A PC using an 80486/66 MHz (or faster) microprocessor or a Pentium-based -microprocessor -

    • At least 16 MB of RAM -

    • A hard disk with at least 4 MB of available disk space, plus enough -additional disk space on the drive where the cache is located to accommodate -the desired cache size. (By default, the cache is located on the drive -where Windows is installed and the cache size is 20 MB.) -
    -

    Software

    -

    The software requirements for installing the AFS Client are: -

      -

    • Microsoft Windows NT 4.0 with Service Pack 4 or Service Pack 5 -
    -

    Administrative Privilege Requirement

    -

    You must be a member of the local Administrators group on -your Windows system in order to install, configure, and start the AFS -Client. -


    Product Notes

    -

    This section highlights important general information about the AFS -Client component of AFS for Windows, version 3.6. It includes -descriptions of new features and enhancements made available in this release -of the AFS Client. -

    Additional Configuration Options Available Via the Client Interface

    -

    The AFS Client Configuration utility's Advanced tab now -includes options for configuring logon parameters, diagnostic parameters, and -other miscellaneous configuration parameters. From the -Advanced tab, you can also configure global drive mappings. -Many of these configuration options were formerly available to AFS Client -users as registry settings. -

    The Advanced tab is accessed from the Windows Control -Panel. To display the Advanced tab: -

      -

    1. From the Start menu, choose Settings, then choose -Control Panel. -

    2. Double-click the AFS Client Configuration icon to display the -AFS Client Configuration utility. -

    3. Choose the Advanced tab. -
    -

    AFS Client Cache Location Is Now Configurable

    -

    The AFS Client Cache is stored in a file named AFSCache, -rather than in the system paging file. By default, the cache is stored -on the drive where Windows is installed. The size of the AFS Client -Cache is limited by available free disk space. The cache size must be -at least 1 MB. The default cache size is 20480 KB (20MB). -

    The location of the AFS Client Cache can now be changed. Changing -the cache location is useful when there is not sufficient available free disk -space on the drive where Windows is installed. To change the cache -location, enter a valid, fully qualified filename in the Cache Path -field on the AFS Client Configuration's Advanced tab. -

    Mapping Global Drives to the AFS Filespace

    -

    The AFS Client's graphical user interface can now be used to map -global drives to places in the AFS filespace. Global drives are mapped -to the AFS filespace when the IBM AFS Client service starts; users are -not required to be logged on. To map global drives to AFS: -

      -

    1. From the Start menu, choose Settings, then choose -Control Panel. -

    2. Double-click the AFS Client Configuration icon to display the -AFS Client Configuration utility. Select the Advanced -tab. -

    3. Click Add. The Map Global Drive dialog box -appears. In the Drive Letter box, choose a network drive or -accept the default. In the AFS Path box, type a path to the -AFS filespace. If desired, enter a short name to be associated with the -specified drive letter and AFS path in the Description box. -Note that a drive letter description can have no more than 12 characters and -cannot contain spaces or tabs. -

    4. Click OK to establish the connection. The drive letter -and AFS path appear on the Global Drives dialog box. The drive letter -now appears in your Windows NT Explorer. -
    -

    AFS Client Computer Name Must Correspond to the Name Service Host Name

    -

    The computer name of an AFS Client machine (as displayed in the -Computer Name field on the Identification tab of the -Network dialog box) must correspond to the host name assigned to the computer -by the name service (normally the Domain Name Service, or DNS) used to map -names to Internet Protocol (IP) addresses. For example, if the machine -on which the AFS Client is installed has the computer name -afsclient1 and is in the yourcompany.com domain, -the corresponding DNS entry for the machine must be -afsclient1.yourcompany.com. -

    AFS Command-Line Binaries

    -

    The AFS Client includes administration-oriented command suites such as -bos, kas, vos, and pts. -Execute the commands within these suites from the Windows Command -Prompt. -

    The AFS Client Must Be Installed in a Directory Whose Path Contains Only ANSI Characters

    -

    The AFS for Windows software must be installed in a directory whose -path contains only ANSI characters, for example the default directory -C:\Program Files. -

    Disabling All but the Client Component of the AFS for Windows Setup Program

    -

    You have the option of altering the AFS for Windows setup program to -disable all but the client component. Such a client-only setup program -renders users unable to install any components other than the AFS -Client. To perform a client-only installation, create the file -setup.co in the same directory as the other installation -files; the setup program then allows only the AFS Client to be -installed. Note that the contents of the setup.co -file are irrelevant. Follow the installation procedure described in -IBM AFS for Windows Quick Beginnings regardless of the type of -installation you are performing. -

    Temporary Files

    -

    The AFS Client for Windows occasionally creates temporary files. -To control where such files are created, set your environment variable (TMP or -TEMP) to the fully qualified path of the preferred temporary directory. -If you do not specify a temporary directory, then any temporary files are -created in the current working directory of the process that creates the -files. -

    National Language Support for the AFS Client

    -

    AFS provides national language support for the AFS Client graphical -user interface (GUI) tools and documentation, including support for -bidirectional scripts (Hebrew, Arabic, etc.). The language -strings installed are determined by your machine's system default locale, -as specified in the Control Panel's Regional Settings Properties dialog -box. If no language strings exist for the current locale, then English -language strings are installed by default. -
    Note:The system default locale for a machine can be different than the -user locale (specified by a user) on the machine. However, -the language strings installed with AFS for Windows are always determined by -the system default locale. -
    -

    The kpwvalid Password Strength Checker Is Not Used on Windows Systems

    -

    When an AFS user password is changed from a Windows system, the -kpwvalid program is not used to check the quality of the -new password. (On UNIX systems, if a kpwvalid program exists -in the same directory as the kpasswd program, the -kpwvalid program checks the quality of every new user -password.) -

    Configurable LAN Adapter Number

    -

    The LAN Adapter (LANA) number used by the AFS Client service must match -the LANA number setting on your Windows system. By default, the AFS -Client service is configured to use LANA number 0 (zero). -

    You can now use the AFS Client's graphical user interface tools to -modify the value of the LANA number used by the AFS Client service. To -change the LANA number, enter a new value in the Lan Adapter Number -field on the AFS Client Configuration's Advanced tab. -You must restart the AFS Client service after modifying this parameter. -

    Alternatively, if you do not want to change the default LANA number used by -the AFS Client service to match the NetBIOS Configuration of your Windows NT -machine, you can instead modify your system's LANA number setting to -match the AFS default setting (0). Access the -Services tab on the Control Panel's Network -application. Choose NetBIOS Interface, and select the -Properties button. Enter 0 (zero) in the -Lana Number field. You must restart your machine after -making changes to this Windows setting. -

    WinLogon Graphical Identification and Authentication (GINA) Modules and AFS Authentication

    -

    The AFS Client includes the header files and libraries required to -build a WinLogon Graphical Identification and Authentication (GINA) module -that obtains AFS tokens. These header files and libraries are installed -in the <AFS for Windows Installation -Directory>\afs\client\program directory. In addition, -a sample program with compiling and linking instructions is provided in -<AFS for Windows Installation -Directory>\afs\client\program\sample\token.c. -

    Cell Database Is Maintained During Upgrade

    -

    When the AFS Client software is upgraded, the AFS Client cell database -file (afsdcell.ini) located in the Windows -directory is not replaced, in order to preserve local cell configuration -information. However, a copy of the cell database as distributed by the -vendor is installed in the AFS Client program directory. -

    -


    Limitations and Restrictions

    -

    This section briefly describes the known limitations and restrictions -in the AFS Client component of AFS for Windows, version 3.6. -

    Symbolic Links to AFS Files and Directories

    -

    Symbolic links to directories are treated as directories, and symbolic -links to files appear as files in Windows NT systems. Neither appear as -links. -

    Currently, you cannot use the Windows interface (the Windows NT Explorer, -for example) to delete symbolic links or create symbolic links in the AFS -filespace. If you attempt to delete a directory that is a symbolic link -using the Windows interface, the directory's contents are deleted. -The directory itself is not deleted. If you attempt to delete a file -that is a symbolic link using the Windows interface, the link is removed, -rather than the target file. -

    To create and delete symbolic links to AFS files and directories, use the -symlink.exe program that is provided with AFS for Windows, -version 3.6. Execute symlink commands from your -Windows NT Command Prompt. -

    AFS Client Can Fail to Load When Network Drives Are in the Application Path

    -

    When loading an application (such as the AFS Client), Windows NT -searches for the application's dynamic-link libraries (DLLs). One -of the places that Windows searches for an application's DLLs is in each -directory specified in the Path environment variable. In the Path -environment variable, if a network path is defined before the path that -contains a DLL, the application can possible fail to load. -

    Most services (such as the AFS Client) do not have security access to -network drives specified in the Path environment variable. When a -network drive is encountered in the path and the application does not have the -permission to access the network, Windows fails to distinguish between an -Access Denied error caused by a process which cannot access a file and a -process which cannot access the network drive that contains the file. -Because this distinction cannot be made, the operating system assumes that the -file exists but cannot be accessed by the process. This error causes -the system to discontinue the search for the DLLs and assume that a DLL cannot -be accessed. Since Windows believes that a DLL is inaccessible, it -fails to load the application. -

    In order to avoid this problem, ensure that the directory to an -application's DLLs comes before any network drives in the path. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns005.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns005.htm deleted file mode 100755 index 6da536f0b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns005.htm +++ /dev/null @@ -1,179 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    AFS Light Release Notes

    -

    Introduction

    -

    This section contains important information about the AFS Light -component of AFS for Windows, version 3.6. AFS Light provides -access to the AFS filespace from a PC running Windows 95 or Windows 98, -enabling users to manage files and directories in AFS. AFS Light -accesses the AFS filespace via an AFS Client machine that is configured as an -AFS Light Gateway. -


    AFS Light Installation Requirements

    -

    Your system must meet the following hardware, software, and -administrative privilege requirements to install AFS Light. -

    Hardware

    -

    The hardware requirements for installing AFS Light are: -

      -

    • A PC using an 80486/66 MHz (or faster) microprocessor or a Pentium-based -microprocessor -

    • At least 16 MB of RAM -

    • A hard disk with at least 4 MB of available disk space -
    -

    Software

    -

    The software requirements for installing AFS Light are: -

      -

    • Microsoft Windows 95 with the Windows Sockets 2 update or Microsoft -Windows 98 -

    • AFS Light Gateway -
      Note:The AFS Light Gateway must be enabled on a Windows NT machine running the AFS -Client, version 3.5 or version 3.6. AFS Light accesses -AFS through the AFS Light Gateway. See Accessing AFS via the AFS Light Gateway for more information. -
      -
    -

    Administrative Privilege Requirement

    -

    No administrative privileges are required to install and configure AFS -Light. -


    Product Notes

    -

    This section highlights important general information about the AFS -Light component of AFS for Windows, version 3.6. -

    Accessing AFS via the AFS Light Gateway

    -

    AFS Light accesses the AFS filespace through an AFS Light -Gateway. In order to use AFS Light, you must have at least one machine -in the same domain as the AFS Light machine running the AFS Client for -Windows, version 3.5 or the AFS Client for Windows, version -3.6. -

      -

    • The AFS Light cell database and the AFS Light Gateway cell database -must be synchronized -

      In order for an AFS Light user to access a cell, an entry for the cell must -exist in both the AFS Light cell database (afsdcell.ini -file) and the AFS Light Gateway cell database (afsdcell.ini -file). -

    • AFS Light must be able to resolve the AFS Light Gateway's -service name -

      AFS Light must be able to resolve the name of the gateway machine in order -to communicate with the gateway machine. The name of the gateway -machine is the gateway's NetBIOS service name, in the form -mach-afs, where mach is the host -computer name up to a maximum of 11 characters. Name resolution can be -achieved by adding the gateway's NetBIOS service name to the -client's LMHOSTS file or to the appropriate DNS or WINS servers. -If the AFS Light machine and its AFS Light Gateway machine reside on the same -subnet, then name resolution succeeds automatically via a NetBIOS -broadcast. -

    • The AFS Light Gateway must be able to authenticate an AFS Light user -in a Windows context -

      Once configured as an AFS Light Gateway, your AFS Client machine must be -able to authenticate AFS Light users in a Windows context. This -authentication can be achieved via a domain user account or via -synchronized machine user accounts. A domain user account is -a user account in a Windows domain. A machine user account is a user -account that is valid only on a particular host machine. -

      When the AFS Light Gateway is configured into a Windows domain, an AFS -Light user must log onto either a domain user account in the domain to which -the gateway belongs or a machine user account with the same username and -password as that of a domain user account in the gateway domain. -

      If machine user accounts are employed, then these accounts must be -synchronized on the AFS Light Gateway and AFS Light machines. A user -must log onto an AFS Light machine with the same username and password as that -of a machine user account that is defined on the AFS Light Gateway -machine. -

      The use of domain user accounts is recommended to simplify -administration. -

    -

    AFS Light for Windows 95 Requires the Windows Sockets 2 Update

    -

    To run AFS Light on a Windows 95 machine, you must install the Windows -Sockets 2 update if it is not yet installed. This update is available -for download from the Microsoft Web site. -

    AFS Command-Line Binaries

    -

    When installed on a Windows 98 system, AFS Light includes -administration-oriented command suites such as bos, kas, -vos, and pts. Execute the commands within these -suites from the Windows Command Prompt. The command suites are -not available when AFS Light is installed on a Windows 95 -system. -

    -

    AFS Light Must Be Installed in a Directory Whose Path Contains Only ANSI Characters

    -

    The AFS for Windows software must be installed in a directory whose -path contains only ANSI characters, for example the default directory -C:\Program Files. -

    Temporary Files

    -

    AFS Light for Windows occasionally creates temporary files. To -control where such files are created, set your environment variable (TMP or -TEMP) to the fully qualified path of the preferred temporary directory. -If you do not specify a temporary directory, then any temporary files are -created in the current working directory of the process that creates the -files. -

    National Language Support for AFS Light

    -

    AFS provides national language support for the AFS Light graphical user -interface (GUI) tools and documentation, including support for bidirectional -scripts (Hebrew, Arabic, etc.). The language strings installed -are determined by your machine's system default locale, as specified in -the Control Panel's Regional Settings Properties dialog box. If no -language strings exist for the current locale, then English language strings -are installed by default. -
    Note:The system default locale for a machine can be different than the -user locale (specified by a user) on the machine. However, -the language strings installed with AFS for Windows are always determined by -the system default locale. -
    -

    The kpwvalid Password Strength Checker Is Not Used on Windows Systems

    -

    When an AFS user password is changed from a Windows system, the -kpwvalid program is not used to check the quality of the -new password. (On UNIX systems, if a kpwvalid program exists -in the same directory as the kpasswd program, the -kpwvalid program checks the quality of every new user -password.) -


    Limitations and Restrictions

    -

    This section briefly describes the known limitations and restrictions -in the AFS Light component of AFS for Windows, version 3.6. -

    Encryption Not Supported in Simplified Chinese Version

    -

    The Simplified Chinese version of Microsoft Windows 98 does not support -encryption, which is needed to transmit AFS passwords from AFS Light to the -AFS Light Gateway. In order for AFS Light users to obtain AFS tokens -when using the Simplified Chinese version of Microsoft Windows 98, encryption -in AFS must be disabled. -

    To disable encryption in AFS, add the following line to your Windows -Autoexec.bat file: -

    set AFS_RPC_ENCRYPT=OFF
    -
    -

    Note that disabling encryption introduces a potential security risk because -AFS passwords are transmitted to the AFS Client Gateway in an unencrypted form -when tokens are obtained. -

    Symbolic Links to AFS Files and Directories

    -

    Symbolic links to directories are treated as directories, and symbolic -links to files appear as files in Windows 98 and Windows 95 systems. -Neither appear as symbolic links. -

    Currently, you cannot use the Windows interface (the Windows Explorer, for -example) to delete symbolic links or create symbolic links in the AFS -filespace. If you attempt to delete a directory that is a symbolic link -using the Windows interface, the directory's contents are deleted. -The directory itself is not deleted. If you attempt to delete a file -that is a symbolic link using the Windows interface, the link is removed, -rather than the target file. -

    To create and delete symbolic links to AFS files and directories, use the -symlink.exe program that is provided with AFS for Windows, -version 3.6. Execute symlink commands from your -Windows NT Command Prompt. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns006.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns006.htm deleted file mode 100755 index 450ab152e..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns006.htm +++ /dev/null @@ -1,209 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    AFS Server Release Notes

    -

    Introduction

    -

    This section contains important information about the AFS Server -component of AFS for Windows, version 3.6. The AFS Server runs -AFS server processes on a Windows NT machine. An AFS Server on a -Windows NT machine can be configured as one or more of the following: an -AFS File Server, an AFS Database Server, an AFS Backup Server, and an AFS -System Control Server. -


    AFS Server Installation Requirements

    -

    Your system must meet the following hardware, software, and -administrative privilege requirements to install the AFS Server component of -AFS for Windows. -

    Hardware

    -

    The hardware requirements for installing the AFS Server are: -

      -

    • A PC using an 80486/66 MHz (or faster) microprocessor or Pentium-based -microprocessor -

      Recommended: A PC using a Pentium or higher microprocessor -

    • At least 16 MB of RAM -

      Recommended: 32 MB of RAM or more -

    • A hard disk with at least 20 MB of available disk space -

    • At least one NTFS disk volume to hold the AFS file system data. The -NTFS volume must not contain any data or files other than that of a Windows NT -Recycle Bin to be eligible for configuration as an AFS partition. -
    -

    Software

    -

    The software requirements for installing the AFS Server are: -

      -

    • Microsoft Windows NT 4.0 with Service Pack 4 or Service Pack 5 -
    -

    Administrative Privilege Requirement

    -

    You must be a member of the local Administrators group on -your Windows system in order to install, configure, and start the AFS -Server. -


    Product Notes

    -

    This section highlights important general information about the AFS -Server component of AFS for Windows, version 3.6. Included in -this section are descriptions of new features and enhancements made available -in this release of the AFS Server. -

    Support for Volumes That Are Greater Than 2 GB

    -

    An AFS volume is a collection of related files that are organized into -a single, easily managed unit and that can be easily moved between File Server -machines to facilitate load balancing across the network. Each AFS -volume has a specific quota associated with it. A volume's quota -specifies the maximum amount of disk space the information in the volume can -occupy. Quota is set on a per volume basis, so it can be increased for -volumes that contain more data and decreased for volumes that do not need the -additional space. AFS for Windows, version 3.6 now supports -volumes with quotas greater than 2 GB. -

    Encryption Routines Used by the System Control Server Are Included with All Versions of AFS for Windows

    -

    Encryption routines used by the Update Service on the System Control -Server machine are now being included with all versions of AFS for -Windows due to the relaxation of United States government export -regulations. Previously, government regulations prohibited the export -of these encryption routines. Thus, sites that were not running the -United States distribution of AFS were not able to use a System Control Server -to distribute configuration files, because doing so permitted sensitive system -information to be transmitted unencrypted. Now, all sites can use a -System Control Server machine to distribute new versions of AFS Server -configuration information to all AFS File Server machines. -

    AFS Server Computer Name Must Correspond to the Name Service Host Name

    -

    The computer name of an AFS Server machine (as displayed in the -Computer Name field on the Identification tab of the -Network dialog box) must correspond to the host name assigned to the computer -by the name service (normally the Domain Name Service, or DNS) used to map -names to Internet Protocol (IP) addresses. For example, if the machine -on which the AFS Server is installed has the computer name -afsserver1 and is in the yourcompany.com domain, -the corresponding DNS entry for the machine must be -afsserver1.yourcompany.com. -

    Time Clock Synchronization

    -

    To support security and database replication protocols, the time clocks -on all machines running AFS servers must be synchronized. Time -synchronization software can be obtained from numerous sources; for -example, Microsoft distributes the timeserv time synchronization -service with the Windows NT Server Resource Kit. -

    Securing AFS Server Machines

    -

    If the machine on which the AFS Server software is installed is not -secure (that is, if nonadministrative personnel are able to log into the -machine), then it is strongly recommended that the AFS Server software -directories and all AFS partitions on the machine be secured as appropriate -for the environment and file system type. However, when securing AFS -Server machines, ensure that the Windows NT local SYSTEM principal -has full access to the AFS software and all AFS partitions; otherwise AFS -processes will not be able to run. -

    Shutting Down AFS File Server Machines

    -

    Before shutting down a Windows NT machine that is running as an AFS -File Server, always stop the AFS File Server on the machine. -

    When the AFS File Server is started on a machine, the process creates a -salvage file. When the File Server is stopped manually, this salvage -file is removed. However, if a Windows NT machine is shut down while -the AFS File Server is still running, this salvage file is not removed. -When the machine is subsequently restarted, the File Server starts -automatically and, upon noticing the presence of the salvage file, executes -the Salvager. Because running the Salvager can be very time consuming, -it is always preferable to stop the AFS File Server on a machine before -shutting the machine down to avoid unnecessarily executing the Salvager -process. -

    Use one of the following procedures to shut down the AFS File Server on a -Windows NT machine. -

    -

      -

    • From the Windows NT Control Panel: -
        -

      1. Double-click the Services icon. The Services dialog box -opens. -

      2. In the Service list, select the IBM AFS Server -service. -

      3. Choose the Stop button. A message box appears, prompting -you to confirm that you want to stop the service. Choose the -Yes button. -

        The AFS File Server on the machine is stopped. -

      -

    • From the Windows NT Command Prompt: -
        -

      1. Enter the following command: -
        bos shutdown -server machine_name -wait
        -
        -

        where machine_name is the name of the Windows NT machine on -which the AFS File Server is running. -

      2. Press <Enter> to execute the command. -
      -
    -
    Note:In general, machines that are running as AFS File Servers are shut down only -to perform preventative maintenance. -
    -

    Obtaining Crash Dump Files in the Event of Server Problems

    -

    It is recommended that you configure all AFS Server machines to create -a crash dump file in the event of a server failure. This information is -important for technical support personnel to use in order to diagnose a server -problem. Consult your Microsoft Windows NT documentation for -information on how to configure the Dr. Watson utility to generate a -binary crash dump file automatically when an application error occurs. -

    The AFS Server Must Be Installed in a Directory Whose Path Contains Only ANSI Characters

    -

    The AFS for Windows software can only be installed in a directory whose -path contains only ANSI characters, for example the default directory -C:\Program Files. -

    Temporary Files

    -

    The AFS Server for Windows occasionally creates temporary files. -To control where such files are created, set your environment variable (TMP or -TEMP) to the fully qualified path of the preferred temporary directory. -If you do not specify a temporary directory, then any temporary files are -created in the current working directory of the process that creates the -files. -

    National Language Support for the AFS Server

    -

    AFS provides national language support for the AFS Server graphical -user interface (GUI) tools and documentation, including support for -bidirectional scripts (Hebrew, Arabic, etc.). The language -strings installed are determined by your machine's system default locale, -as specified in the Control Panel's Regional Settings Properties dialog -box. If no language strings exist for the current locale, then English -language strings are installed by default. -
    Note:The system default locale for a machine can be different than the -user locale (specified by a user) on the machine. However, -the language strings installed with AFS for Windows are always determined by -the system default locale. -
    -

    The kpwvalid Password Strength Checker Is Not Used on Windows Systems

    -

    When an AFS user password is changed from a Windows system, the -kpwvalid program is not used to check the quality of the -new password. (On UNIX systems, if a kpwvalid program exists -in the same directory as the kpasswd program, the -kpwvalid program checks the quality of every new user -password.) -

    Configuring a Server into a Cell with pre-3.5 Database Servers Requires the Principal Password

    -

    If you configure the AFS Server for Windows, version 3.6, into -an AFS cell in which the Database Servers are running a version of AFS older -than version 3.5, during the configuration process a dialog box prompts -you to provide the AFS principal password. -

    -
    Note:If for some reason the AFS principal password is unknown, you can instead -enter the 24-character string of octal digits representing the AFS -principal's key. To obtain the octal key, issue either the -kas examine command or boslistkeys command on an AFS -Database Server machine. Note, the server must be running in -noauth mode in order to display the AFS principal's octal -key. -
    -


    Limitations and Restrictions

    -

    This section briefly describes the known limitations and restrictions -in the AFS Server component of AFS for Windows, version 3.6. -

    AFS bosserver Process Does Not Execute the Notifier Program When a Process Terminates

    -

    The AFS bosserver process does not currently execute the -registered notifier command (if one is specified) when a process under its -control terminates. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns007.htm b/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns007.htm deleted file mode 100755 index 2557a94fa..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/awrns007.htm +++ /dev/null @@ -1,151 +0,0 @@ - - -Release Notes - - - - - - - - - - - -

    Release Notes

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic]

    -


    AFS Control Center Release Notes

    -

    Introduction

    -

    This section contains important information about the AFS Control -Center component of AFS for Windows, version 3.6. The AFS -Control Center provides two powerful graphical user interface (GUI) tools to -assist AFS system administrators in AFS cell administration: the AFS -Server Manager and the AFS Account Manager. -


    AFS Control Center Installation Requirements

    -

    Your system must meet the following hardware, software, and -administrative privilege requirements to install the AFS Control Center -component of AFS for Windows. -

    Hardware

    -

    The hardware requirements for installing the AFS Control Center -are: -

      -

    • A PC using an 80486/66 MHz (or faster) microprocessor or Pentium-based -microprocessor -

    • At least 16 MB of RAM -

    • A hard disk with at least 4 MB of available disk space -
    -

    Software

    -

    The software requirements for installing the AFS Control Center -are: -

      -

    • Microsoft Windows NT 4.0 with Service Pack 4 or Service Pack 5 -
    -

    Administrative Privilege Requirement

    -

    You must be a member of the local Administrators group on -your Windows system in order to install the AFS Control Center. -


    Product Notes

    -

    This section highlights important general information about the AFS -Control Center component of AFS for Windows, version 3.6. -

    The AFS Control Center Must Be Installed in a Directory Whose Path Contains Only ANSI Characters

    -

    The AFS for Windows software can only be installed in a directory whose -path contains only ANSI characters, for example the default directory -C:\Program Files. -

    Temporary Files

    -

    The AFS Control Center for Windows occasionally creates temporary -files. To control where such files are created, set your environment -variable (TMP or TEMP) to the fully qualified path of the preferred temporary -directory. If you do not specify a temporary directory, then any -temporary files are created in the current working directory of the process -that creates the files. -

    National Language Support for the AFS Control Center

    -

    AFS provides national language support for the AFS Control Center -graphical user interface (GUI) tools and documentation, including support for -bidirectional scripts (Hebrew, Arabic, etc.). The language -strings installed are determined by your machine's system default locale, -as specified in the Control Panel's Regional Settings Properties dialog -box. -
    Note:The system default locale for a machine can be different than the -user locale (specified by a user) on the machine. However, -the language strings installed with AFS for Windows are always determined by -the system default locale. -
    -

    If no language strings exist for the current locale, then English language -strings are installed by default. -

    The kpwvalid Password Strength Checker Is Not Used on Windows Systems

    -

    When an AFS user password is changed from a Windows system, the -kpwvalid program is not used to check the quality of the -new password. (On UNIX systems, if a kpwvalid program exists -in the same directory as the kpasswd program, the -kpwvalid program checks the quality of every new user -password.) -

    Tokens Obtained for Control Center Applications Expire after 25 Hours

    -

    In order to use either the AFS Server Manager or the AFS Account -Manager, users must obtain AFS tokens. The lifetime of tokens obtained -in either application is always 25 hours and 25 minutes, regardless of the -Maximum Ticket Lifetime designated for the user. -

    Server Manager Displays All Server Entries Referenced in the Volume Location Database (VLDB)

    -

    The AFS Server Manager displays a server icon for every server entry in -the Volume Location Database (VLDB). If an AFS server has been -decommissioned, but its VLDB entry has not been removed, then the Server -Manager continues to display an icon for the server. -

    To remove an obsolete AFS File Server entry from the VLDB on a Database -Server running AFS version 3.5 or later, issue the following -command: -

    -

    vos changeaddr <ip_address> -remove
    -
    -

    where ip_address is the Internet Protocol (IP) address of the -server machine that has been decommissioned. -

    On AFS Database Servers running a version of AFS older than version -3.5, there is currently no command for removal of obsolete server -entries in the VLDB. However, to prevent the AFS Server Manager from -displaying decommissioned servers, you can modify the Windows NT Registry so -that the AFS Server Manager disregards all machines with IP addresses of a -specified pattern. -

    To prevent the AFS Server Manager from displaying server machines with IP -addresses of a specified pattern, use the following steps to modify the -Windows NT Registry: -

      -

    1. From the Start menu, choose Run. In the Open box, type -regedit, and then choose OK. The Windows NT -Registry Editor opens. -

    2. Right-click the \\HKEY_LOCAL_MACHINE\Software\TransarcCorporation\AFS -Control Center key. From the context menu that opens, choose -New, and then choose DWORD Value. A New Value -entry is added to the key. -

    3. Specify the name of the new value entry by typing -IgnoreBadAddrs as the new value. -

    4. Double-click the new IgnoreBadAddrs entry. The Edit -DWORD Value dialog box opens. -

    5. In the Value data box, specify in hexadecimal notation the IP -address or range of IP addresses to ignore. For example, to instruct -the AFS Server Manager to disregard any machines listed in the VLDB with IP -addresses match the pattern 10.0.0.*, enter -0A0000FF in the Value data box. (The -hexadecimal value FF represents a wildcard.) -

    6. Choose OK to close the Edit DWORD value box and save the new -registry entry. -

    7. Close the Registry Editor. -
    -

    -
    Note:To take advantage of this feature, it is advisable to change the IP addresses -of any decommissioned servers in the VLDB to easily recognizable unused IP -addresses in a specific range, for example -10.0.0.1, -10.0.0.2, -10.0.0.3 etc. Then add the -IgnoreBadAddrs registry entry as described in the previous steps to -instruct the AFS Server Manager to ignore all IP addresses within the -specified range. -
    -


    Limitations and Restrictions

    -

    There are currently no known limitations and restrictions for the AFS -Control Center component of AFS for Windows, version 3.6. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd000.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd000.htm deleted file mode 100755 index 2807bae31..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd000.htm +++ /dev/null @@ -1,47 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Table of Contents] [Bottom of Topic] [Next Topic] [Index]


    -AFS
    -Administration Guide
    -

    Version 3.6 -

    Document Number GC09-4563-00 -

    First Edition (April 2000) -

    This edition applies to: -

    -
    AFS for AIX, Version 3.6 -
    AFS for Digital Unix, Version 3.6 -
    AFS for HP-UX, Version 3.6 -
    AFS for Linux, Version 3.6 -
    AFS for SGI IRIX, Version 3.6 -
    AFS for Solaris, Version 3.6 -
    -

    and to all subsequent releases and modifications until otherwise indicated -in new editions. -

    This softcopy version is based on the printed edition of this book. -Some formatting amendments have been made to make this information more -suitable for softcopy. -

    Order publications through your IBM representative or through the IBM -branch office serving your locality. -

    © Copyright International Business Machines Corporation 1989, 2000. All rights reserved. -

    -


    [Return to Library] [Table of Contents] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd002.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd002.htm deleted file mode 100755 index d0ae43146..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd002.htm +++ /dev/null @@ -1,1008 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    Table of Contents

    -

    Figures
    -

    Tables
    -

    About This Guide
    -

    -
  • Audience and Purpose -
  • Document Organization -
  • How to Use This Document -
  • Related Documents -
  • Typographical Conventions -
  • -

    An Overview of AFS Administration
    -

    -
  • A Broad Overview of AFS -
  • More Detailed Discussions of Some Basic Concepts - -
  • Networks -
  • Distributed File Systems -
  • Servers and Clients -
  • Cells -
  • The Uniform Namespace and Transparent Access -
  • Volumes -
  • Mount Points -
  • Replication -
  • Caching and Callbacks -
  • -
  • AFS Server Processes and the Cache Manager - -
  • The File Server -
  • The Basic OverSeer Server -
  • The Authentication Server -
  • The Protection Server -
  • The Volume Server -
  • The Volume Location (VL) Server -
  • The Update Server -
  • The Backup Server -
  • The Salvager -
  • The Network Time Protocol Daemon -
  • The Cache Manager -
  • -

    Issues in Cell Configuration and Administration
    -

    -
  • Differences between AFS and UNIX: A Summary - -
  • Differences in File and Directory Protection -
  • Differences in Authentication -
  • Differences in the Semantics of Standard UNIX Commands -
  • The AFS version of the fsck Command -
  • Creating Hard Links -
  • AFS Implements Save on Close -
  • Setuid Programs -
  • -
  • Choosing a Cell Name - -
  • How to Set the Cell Name -
  • Why Choosing the Appropriate Cell Name is Important -
  • -
  • Participating in the AFS Global Namespace - -
  • What the Global Namespace Looks Like -
  • Making Your Cell Visible to Others -
  • Making Other Cells Visible in Your Cell -
  • Granting and Denying Foreign Users Access to Your Cell -
  • -
  • Configuring Your AFS Filespace - -
  • The Top /afs Level -
  • The Second (Cellname) Level -
  • The Third Level -
  • -
  • Creating Volumes to Simplify Administration - -
  • Assigning Volume Names -
  • Grouping Related Volumes on a Partition -
  • When to Replicate Volumes -
  • The Default Quota and ACL on a New Volume -
  • -
  • Configuring Server Machines - -
  • Replicating the AFS Administrative Databases -
  • AFS Files on the Local Disk -
  • Configuring Partitions to Store AFS Data -
  • Monitoring, Rebooting and Automatic Process Restarts -
  • -
  • Configuring Client Machines - -
  • Configuring the Local Disk -
  • Enabling Access to Foreign Cells -
  • Using the @sys Variable in Pathnames -
  • Setting Server Preferences -
  • -
  • Configuring AFS User Accounts - -
  • Choosing Usernames and Naming Other Account Components -
  • Grouping Home Directories -
  • Making a Backup Version of User Volumes Available -
  • Creating Standard Files in New AFS Accounts -
  • -
  • Using AFS Protection Groups - -
  • The Three System Groups -
  • The Two Types of User-Defined Groups -
  • -
  • Login and Authentication in AFS - -
  • Identifying AFS Tokens by PAG -
  • Using an AFS-modified login Utility -
  • Using Two-Step Login and Authentication -
  • Obtaining, Displaying, and Discarding Tokens -
  • Setting Default Token Lifetimes for Users -
  • Changing Passwords -
  • Imposing Restrictions on Passwords and Authentication Attempts -
  • Support for Kerberos Authentication -
  • -
  • Security and Authorization in AFS - -
  • Some Important Security Features -
  • Three Types of Privilege -
  • Authorization Checking versus Authentication -
  • Improving Security in Your Cell -
  • A More Detailed Look at Mutual Authentication -
  • -
  • Backing Up AFS Data - -
  • Backup Volumes -
  • The AFS Backup System -
  • -
  • Using UNIX Remote Services in the AFS Environment -
  • Accessing AFS through NFS -
  • -

    Administering Server Machines
    -

    -
  • Summary of Instructions -
  • Local Disk Files on a Server Machine - -
  • Binaries in the /usr/afs/bin Directory -
  • Common Configuration Files in the /usr/afs/etc Directory -
  • Local Configuration Files in the /usr/afs/local Directory -
  • Replicated Database Files in the /usr/afs/db Directory -
  • Log Files in the /usr/afs/logs Directory -
  • Volume Headers on Server Partitions -
  • -
  • The Four Roles for File Server Machines - -
  • Simple File Server Machines -
  • Database Server Machines -
  • Binary Distribution Machines -
  • The System Control Machine -
  • To locate database server machines -
  • To locate the system control machine -
  • To locate the binary distribution machine for a system type -
  • Interpreting the Output from the bos status Command -
  • -
  • Administering Database Server Machines - -
  • Replicating the AFS Administrative Databases -
  • Backing Up and Restoring the Administrative Databases -
  • To back up the administrative databases -
  • To restore an administrative database -
  • -
  • Installing Server Process Software - -
  • Installing New Binaries -
  • To install new server binaries -
  • Reverting to the Previous Version of Binaries -
  • To revert to the previous version of binaries -
  • Displaying Binary Version Dates -
  • To display binary version dates -
  • Removing Obsolete Binary Files -
  • To remove obsolete binaries -
  • Displaying A Binary File's Build Level -
  • To display an AFS binary's build level -
  • -
  • Maintaining the Server CellServDB File - -
  • Distributing the Server CellServDB File -
  • To display a cell's database server machines -
  • To add a database server machine to the CellServDB file -
  • To remove a database server machine from the CellServDB file -
  • -
  • Managing Authentication and Authorization Requirements - -
  • Authentication versus Authorization -
  • Controlling Authorization Checking on a Server Machine -
  • To disable authorization checking on a server machine -
  • To enable authorization checking on a server machine -
  • Bypassing Mutual Authentication for an Individual Command -
  • To bypass mutual authentication for bos, kas, pts, and vos commands -
  • To bypass mutual authentication for fs commands -
  • -
  • Adding or Removing Disks and Partitions - -
  • To add and mount a new disk to house AFS volumes -
  • To unmount and remove a disk housing AFS volumes -
  • -
  • Managing Server IP Addresses and VLDB Server Entries - -
  • To create or edit the server NetInfo file -
  • To create or edit the server NetRestrict file -
  • To display all server entries from the VLDB -
  • To remove obsolete server entries from the VLDB -
  • To change a server machine's IP addresses -
  • -
  • Rebooting a Server Machine - -
  • To reboot a file server machine from its console -
  • To reboot a file server machine remotely -
  • -

    Monitoring and Controlling Server Processes
    -

    -
  • Summary of Instructions -
  • Brief Descriptions of the AFS Server Processes - -
  • The bosserver Process: the Basic OverSeer Server -
  • The buserver Process: the Backup Server -
  • The fs Collection of Processes: the File Server, Volume Server and Salvager -
  • The kaserver Process: the Authentication Server -
  • The ptserver Process: the Protection Server -
  • The runntp Process -
  • The upserver and upclient Processes: the Update Server -
  • The vlserver Process: the Volume Location Server -
  • -
  • Controlling and Checking Process Status - -
  • The Information in the BosConfig File -
  • How the BOS Server Uses the Information in the BosConfig File -
  • About Starting and Stopping the Database Server Processes -
  • About Starting and Stopping the Update Server -
  • -
  • Displaying Process Status and Information from the BosConfig File - -
  • To display the status of server processes and their BosConfig entries -
  • -
  • Creating and Removing Processes - -
  • To create and start a new process -
  • To stop a process and remove it from the BosConfig file -
  • -
  • Stopping and Starting Processes Permanently - -
  • To stop a process by changing its status to NotRun -
  • To start processes by changing their status flags to Run -
  • -
  • Stopping and Starting Processes Temporarily - -
  • To stop processes temporarily -
  • To start all stopped processes that have status flag Run in the BosConfig file -
  • To start specific processes -
  • -
  • Stopping and Immediately Restarting Processes - -
  • To stop and restart all processes including the BOS Server -
  • To stop and immediately restart all processes except the BOS Server -
  • To stop and immediately restart specific processes -
  • -
  • Setting the BOS Server's Restart Times - -
  • To display the BOS Server restart times -
  • To set the general or binary restart time -
  • -
  • Displaying Server Process Log Files - -
  • To examine a server process log file -
  • -

    Managing Volumes
    -

    -
  • Summary of Instructions -
  • About Volumes - -
  • The Three Types of Volumes -
  • How Volumes Improve AFS Efficiency -
  • Volume Information in the VLDB -
  • The Information in Volume Headers -
  • Keeping the VLDB and Volume Headers Synchronized -
  • About Mounting Volumes -
  • About Volume Names -
  • -
  • Creating Read/write Volumes - -
  • To create (and mount) a read/write volume -
  • -
  • About Clones and Cloning -
  • Replicating Volumes (Creating Read-only Volumes) - -
  • Using Read-only Volumes Effectively -
  • Replication Scenarios -
  • To replicate a read/write volume (create a read-only volume) -
  • -
  • Creating Backup Volumes - -
  • Backing Up Multiple Volumes at Once -
  • Automating Creation of Backup Volumes -
  • Making the Contents of Backup Volumes Available to Users -
  • To create and mount a backup volume -
  • To create multiple backup volumes at once -
  • -
  • Mounting Volumes - -
  • The Rules of Mount Point Traversal -
  • The Three Types of Mount Points -
  • Creating a mount point in a foreign cell -
  • To display a mount point -
  • To create a regular or read/write mount point -
  • To create a cellular mount point -
  • To remove a mount point -
  • -
  • Displaying Information About Volumes - -
  • Displaying VLDB Entries -
  • To display VLDB entries -
  • Displaying Volume Headers -
  • To display volume headers -
  • Displaying One Volume's VLDB Entry and Volume Header -
  • To display one volume's VLDB entry and volume header -
  • Displaying the Name or Location of the Volume that Contains a File -
  • -
  • Moving Volumes - -
  • To move a read/write volume -
  • -
  • Synchronizing the VLDB and Volume Headers - -
  • To synchronize the VLDB with volume headers -
  • -
  • Salvaging Volumes - -
  • To salvage volumes -
  • -
  • Setting and Displaying Volume Quota and Current Size - -
  • To set quota for a single volume -
  • To set maximum quota on one or more volumes -
  • To display percent quota used -
  • To display quota, current size, and other information -
  • To display quota, current size, and more partition information -
  • -
  • Removing Volumes and their Mount Points - -
  • Other Removal Commands -
  • To remove a volume and unmount it -
  • -
  • Dumping and Restoring Volumes - -
  • About Dumping Volumes -
  • To dump a volume -
  • About Restoring Volumes -
  • To restore a dump into a new volume and mount it -
  • To restore a dump file, overwriting an existing volume -
  • -
  • Renaming Volumes - -
  • To rename a volume -
  • -
  • Unlocking and Locking VLDB Entries - -
  • To lock a VLDB entry -
  • To unlock a single VLDB entry -
  • To unlock multiple VLDB entries -
  • -

    Configuring the AFS Backup System
    -

    -
  • Summary of Instructions -
  • Introduction to Backup System Features - -
  • Volume Sets and Volume Entries -
  • Dumps and Dump Sets -
  • Dump Hierarchies, Dump Levels and Expiration Dates -
  • Dump Names and Tape Names -
  • Tape Labels, Dump Labels, and EOF Markers -
  • Tape Coordinator Machines, Port Offsets, and Backup Data Files -
  • The Backup Database and Backup Server Process -
  • Interfaces to the Backup System -
  • -
  • Overview of Backup System Configuration -
  • Configuring the tapeconfig File - -
  • To run the fms command on a noncompressing tape device -
  • -
  • Granting Administrative Privilege to Backup Operators -
  • Configuring Tape Coordinator Machines and Tape Devices - -
  • To configure a Tape Coordinator machine -
  • To configure an additional Tape Coordinator on an existing Tape Coordinator machine -
  • To unconfigure a Tape Coordinator -
  • To display the list of configured Tape Coordinators -
  • -
  • Defining and Displaying Volume Sets and Volume Entries - -
  • To create a volume set -
  • To add a volume entry to a volume set -
  • To display volume sets and volume entries -
  • To delete a volume set -
  • To delete a volume entry from a volume set -
  • -
  • Defining and Displaying the Dump Hierarchy - -
  • Creating a Tape Recycling Schedule -
  • Archiving Tapes -
  • Defining Expiration Dates -
  • To add a dump level to the dump hierarchy -
  • To change a dump level's expiration date -
  • To delete a dump level from the dump hierarchy -
  • To display the dump hierarchy -
  • -
  • Writing and Reading Tape Labels - -
  • Recording a Name on the Label -
  • Recording a Capacity on the Label -
  • To label a tape -
  • To read the label on a tape -
  • -
  • Automating and Increasing the Efficiency of the Backup Process - -
  • Creating a Device Configuration File -
  • Invoking a Device's Tape Mounting and Unmounting Routines -
  • Eliminating the Search or Prompt for the Initial Tape -
  • Enabling Default Responses to Error Conditions -
  • Eliminating the AFS Tape Name Check -
  • Setting the Memory Buffer Size to Promote Tape Streaming -
  • Dumping Data to a Backup Data File -
  • To configure a backup data file -
  • -

    Backing Up and Restoring AFS Data
    -

    -
  • Summary of Instructions -
  • Using the Backup System's Interfaces - -
  • Performing Backup Operations as the Local Superuser Root or in a Foreign Cell -
  • Using Interactive and Regular Command Mode -
  • To enter interactive mode -
  • To exit interactive mode -
  • To display pending or running jobs in interactive mode -
  • To cancel operations in interactive mode -
  • Starting and Stopping the Tape Coordinator Process -
  • To start a Tape Coordinator process -
  • To stop a Tape Coordinator process -
  • To check the status of a Tape Coordinator process -
  • -
  • Backing Up Data - -
  • Making Backup Operations More Efficient -
  • How Your Configuration Choices Influence the Dump Process -
  • Appending Dumps to an Existing Dump Set -
  • Scheduling Dumps -
  • To create a dump -
  • -
  • Displaying Backup Dump Records - -
  • To display dump records -
  • To display a volume's dump history -
  • To scan the contents of a tape -
  • -
  • Restoring and Recovering Data - -
  • Making Restore Operations More Efficient -
  • Using the backup volrestore Command -
  • To restore volumes with the backup volrestore command -
  • Using the backup diskrestore Command -
  • To restore a partition with the backup diskrestore command -
  • Using the backup volsetrestore Command -
  • To restore a group of volumes with the backup volsetrestore command -
  • -
  • Maintaining the Backup Database - -
  • Backing Up and Restoring the Backup Database -
  • Checking for and Repairing Corruption in the Backup Database -
  • To verify the integrity of the Backup Database -
  • To repair corruption in the Backup Database -
  • Removing Obsolete Records from the Backup Database -
  • To delete dump records from the Backup Database -
  • -

    Monitoring and Auditing AFS Performance
    -

    -
  • Summary of Instructions -
  • Using the scout Program - -
  • System Requirements -
  • Using the -basename argument to Specify a Domain Name -
  • The Layout of the scout Display -
  • Highlighting Significant Statistics -
  • Resizing the scout Display -
  • To start the scout program -
  • To stop the scout program -
  • Example Commands and Displays -
  • -
  • Using the fstrace Command Suite - -
  • About the fstrace Command Suite -
  • Requirements for Using the fstrace Command Suite -
  • Using fstrace Commands Effectively -
  • Activating the Trace Log -
  • To configure the trace log -
  • To set the event set -
  • Displaying the State of a Trace Log or Event Set -
  • To display the state of an event set -
  • To display the log size -
  • Dumping and Clearing the Trace Log -
  • To dump the contents of a trace log -
  • To clear the contents of a trace log -
  • Examples of fstrace Commands -
  • -
  • Using the afsmonitor Program - -
  • Requirements for running the afsmonitor program -
  • The afsmonitor Output Screens -
  • The System Overview Screen -
  • The File Servers Screen -
  • The Cache Managers Screen -
  • -
  • Configuring the afsmonitor Program -
  • Writing afsmonitor Statistics to a File -
  • To start the afsmonitor Program -
  • To stop the afsmonitor program -
  • The xstat Data Collection Facility - -
  • The libxstat Libraries -
  • Example xstat Commands -
  • -
  • Auditing AFS Events on AIX File Servers - -
  • Configuring AFS Auditing on AIX File Servers -
  • To enable AFS auditing -
  • To disable AFS auditing -
  • -

    Managing Server Encryption Keys
    -

    -
  • Summary of Instructions -
  • About Server Encryption Keys - -
  • Keys and Mutual Authentication: A Review -
  • Maintaining AFS Server Encryption Keys -
  • -
  • Displaying Server Encryption Keys - -
  • To display the KeyFile file -
  • To display the afs key from the Authentication Database -
  • -
  • Adding Server Encryption Keys - -
  • To add a new server encryption key -
  • -
  • Removing Server Encryption Keys - -
  • To remove a key from the KeyFile file -
  • -
  • Handling Server Encryption Key Emergencies - -
  • Prevent Mutual Authentication -
  • Disable Authorization Checking by Hand -
  • Work Quickly on Each Machine -
  • Work at the Console -
  • Change Individual KeyFile Files -
  • Two Component Procedures -
  • To create a new server encryption key in emergencies -
  • -

    Administering Client Machines and the Cache Manager
    -

    -
  • Summary of Instructions -
  • Overview of Cache Manager Customization -
  • Configuration and Cache-Related Files on the Local Disk - -
  • Configuration Files in the /usr/vice/etc Directory -
  • Cache-Related Files -
  • -
  • Determining the Cache Type, Size, and Location - -
  • Choosing the Cache Size -
  • Displaying and Setting the Cache Size and Location -
  • To display the cache size set at reboot -
  • To display the current cache size -
  • To edit the cacheinfo file -
  • To change the disk cache size without rebooting -
  • To reset the disk cache size to the default without rebooting -
  • How the Cache Manager Chooses Data to Discard -
  • -
  • Setting Other Cache Parameters with the afsd program - -
  • Setting Cache Configuration Parameters -
  • Configuring a Disk Cache -
  • Controlling Memory Cache Configuration -
  • -
  • Maintaining Knowledge of Database Server Machines - -
  • How Clients Use the List of Database Server Machines -
  • The Format of the CellServDB file -
  • Maintaining the Client CellServDB File -
  • To display the /usr/vice/etc/CellServDB file -
  • To display the list of database server machines in kernel memory -
  • To change the list of a cell's database server machines in kernel memory -
  • -
  • Determining if a Client Can Run Setuid Programs - -
  • To determine a cell's setuid status -
  • To change a cell's setuid status -
  • -
  • Setting the File Server Probe Interval - -
  • To set a client's file server probe interval -
  • -
  • Setting a Client Machine's Cell Membership - -
  • To display a client machine's cell membership -
  • To set a client machine's cell membership -
  • -
  • Forcing the Update of Cached Data - -
  • To flush certain files or directories -
  • To flush all data from a volume -
  • To force the Cache Manager to notice other volume changes -
  • To flush one or more mount points -
  • -
  • Maintaining Server Preference Ranks - -
  • How the Cache Manager Sets Default Ranks -
  • How the Cache Manager Uses Preference Ranks -
  • Displaying and Setting Preference Ranks -
  • To display server preference ranks -
  • To set server preference ranks -
  • -
  • Managing Multihomed Client Machines - -
  • To create or edit the client NetInfo file -
  • To create or edit the client NetRestrict file -
  • To display the list of addresses from kernel memory -
  • To set the list of addresses in kernel memory -
  • -
  • Controlling the Display of Warning and Informational Messages - -
  • To control the display of warning and status messages -
  • -
  • Displaying and Setting the System Type Name - -
  • To display the system type name -
  • To change the system type name -
  • -
  • Enabling Asynchronous Writes - -
  • To set the default store asynchrony -
  • To set the store asynchrony for one or more files -
  • To display the default store asynchrony -
  • To display the store asynchrony for one or more files -
  • -

    Configuring Client Machines with the package Program
    -

    -
  • Summary of Instructions -
  • Using the package Program - -
  • Using Package on File Server Machines -
  • -
  • Package Overview - -
  • Preparing Prototype Files -
  • Compiling Prototype Files -
  • Preparing Clients -
  • -
  • The package Directory Structure - -
  • The src directory -
  • The lib directory -
  • The etc directory -
  • -
  • Example Prototype and Library Files - -
  • An Example Prototype File -
  • Example Library File -
  • -
  • Package Configuration File Instruction Syntax - -
  • Local Files versus Symbolic Links -
  • Defining a Directory -
  • Defining a File -
  • Defining a Symbolic Link -
  • Defining a Block Special Device -
  • Defining a Character Special Device -
  • Defining a Socket -
  • -
  • Constructing Prototype and Library Files - -
  • To construct a prototype file and its component library files -
  • -
  • The Package Makefile File - -
  • Overview -
  • The CONFIG Section -
  • The BASE_LIBS Section -
  • The MACHINE_LIBS Section -
  • The LIBS Section -
  • The .SUFFIXES Section -
  • The Makefile Instructions Section -
  • -
  • Modifying the Makefile - -
  • Adding a New Prototype File -
  • Adding a New System Type -
  • Adding New Library Files -
  • -
  • Compiling Prototype Files - -
  • To compile prototype files -
  • -
  • Modifying Client Machines - -
  • To prepare a client machine to run the package program -
  • -
  • Running the package program - -
  • To invoke the package program by rebooting -
  • To invoke the package program directly (without rebooting) -
  • -

    Creating and Deleting User Accounts with the uss Command Suite
    -

    -
  • Summary of Instructions -
  • Overview of the uss Command Suite - -
  • The Components of an AFS User Account -
  • Privilege Requirements for the uss Commands -
  • Avoiding and Recovering from Errors and Interrupted Operations -
  • -
  • Creating Local Password File Entries with uss - -
  • Assigning AFS and UNIX UIDs that Match -
  • Specifying Passwords in the Local Password File -
  • Creating a Common Source Password File -
  • -
  • Converting Existing UNIX Accounts with uss - -
  • Making UNIX and AFS UIDs Match -
  • Setting the Password Field Appropriately -
  • Moving Local Files into AFS -
  • -
  • Constructing a uss Template File - -
  • Creating the Three Types of User Accounts -
  • Using Constants and Variables in the Template File -
  • Where to Place Template Files -
  • Some General Rules for Constructing a Template -
  • About Creating Local Disk Directories and Files -
  • Example uss Templates -
  • Evenly Distributing User Home Directories with the G Instruction -
  • Creating a Volume with the V Instruction -
  • Creating a Directory with the D Instruction -
  • Creating a File from a Prototype with the F Instruction -
  • Creating One-Line Files with the E Instruction -
  • Creating Links with the L and S Instructions -
  • Increasing Account Security with the A Instruction -
  • Executing Commands with the X Instruction -
  • -
  • Creating Individual Accounts with the uss add Command - -
  • To create an AFS account with the uss add command -
  • -
  • Deleting Individual Accounts with the uss delete Command - -
  • To delete an AFS account -
  • -
  • Creating and Deleting Multiple Accounts with the uss bulk Command - -
  • Constructing a Bulk Input File -
  • Example Bulk Input File Instructions -
  • To create and delete multiple AFS user accounts -
  • -

    Administering User Accounts
    -

    -
  • Summary of Instructions -
  • The Components of an AFS User Account -
  • Creating Local Password File Entries - -
  • Assigning AFS and UNIX UIDs that Match -
  • Specifying Passwords in the Local Password File -
  • -
  • Converting Existing UNIX Accounts - -
  • Making UNIX and AFS UIDs Match -
  • Setting the Password Field Appropriately -
  • Moving Local Files into AFS -
  • -
  • Creating AFS User Accounts - -
  • To create one user account with individual commands -
  • -
  • Improving Password and Authentication Security - -
  • To limit the number of consecutive failed authentication attempts -
  • To unlock a locked user account -
  • To set password lifetime -
  • To prohibit reuse of passwords -
  • -
  • Changing AFS Passwords - -
  • To change an AFS password -
  • -
  • Displaying and Setting the Quota on User Volumes -
  • Changing Usernames - -
  • To change a username -
  • -
  • Removing a User Account - -
  • To remove a user account -
  • -

    Administering the Protection Database
    -

    -
  • Summary of Instructions -
  • About the Protection Database - -
  • The System Groups -
  • -
  • Displaying Information from the Protection Database - -
  • To display a Protection Database entry -
  • To display group membership -
  • To list the groups that a user or group owns -
  • To display all Protection Database entries -
  • -
  • Creating User and Machine Entries - -
  • To create machine entries in the Protection Database -
  • -
  • Creating Groups - -
  • Using Groups Effectively -
  • To create groups -
  • To create a self-owned group -
  • Using Prefix-Less Groups -
  • -
  • Adding and Removing Group Members - -
  • To add users and machines to groups -
  • To remove users and machines from groups -
  • -
  • Deleting Protection Database Entries - -
  • To delete Protection Database entries -
  • -
  • Changing a Group's Owner - -
  • To change a group's owner -
  • -
  • Changing a Protection Database Entry's Name - -
  • To change the name of a machine or group entry -
  • -
  • Setting Group-Creation Quota - -
  • To set group-creation quota -
  • -
  • Setting the Privacy Flags on Database Entries - -
  • To set a Protection Database entry's privacy flags -
  • -
  • Displaying and Setting the AFS UID and GID Counters - -
  • To display the AFS ID counters -
  • To set the AFS ID counters -
  • -

    Managing Access Control Lists
    -

    -
  • Summary of Instructions -
  • Protecting Data in AFS - -
  • Differences Between UFS and AFS Data Protection -
  • The AFS ACL Permissions -
  • Using Normal and Negative Permissions -
  • Using Groups on ACLs -
  • -
  • Displaying ACLs - -
  • To display an ACL -
  • -
  • Setting ACL Entries - -
  • To add, remove, or edit normal ACL permissions -
  • To add, remove, or edit negative ACL permissions -
  • -
  • Completely Replacing an ACL - -
  • To replace an ACL completely -
  • -
  • Copying ACLs Between Directories - -
  • To copy an ACL between directories -
  • -
  • Removing Obsolete AFS IDs from ACLs - -
  • To clean obsolete AFS IDs from an ACL -
  • -
  • How AFS Interprets the UNIX Mode Bits -
  • -

    Managing Administrative Privilege
    -

    -
  • Summary of Instructions -
  • An Overview of Administrative Privilege - -
  • The Reason for Separate Privileges -
  • -
  • Administering the system:administrators Group - -
  • To display the members of the system:administrators group -
  • To add users to the system:administrators group -
  • To remove users from the system:administrators group -
  • -
  • Granting Privilege for kas Commands: the ADMIN Flag - -
  • To check if the ADMIN flag is set -
  • To set or remove the ADMIN flag -
  • -
  • Administering the UserList File - -
  • To display the users in the UserList file -
  • To add users to the UserList file -
  • To remove users from the UserList file -
  • -

    Appendix A. Managing the NFS/AFS Translator
    -

    -
  • Summary of Instructions -
  • Overview - -
  • Enabling Unauthenticated or Authenticated AFS Access -
  • Setting the AFSSERVER and AFSCONF Environment Variables -
  • Delayed Writes for Files Saved on NFS Client Machines -
  • -
  • Configuring NFS/AFS Translator Machines - -
  • Loading NFS and AFS Kernel Extensions -
  • Configuring the Translator Machine to Accept AFS Commands -
  • Controlling Optional Translator Features -
  • To configure an NFS/AFS translator machine -
  • To disable or enable Translator functionality, or set optional features -
  • -
  • Configuring NFS Client Machines - -
  • To configure an NFS client machine to access AFS -
  • -
  • Configuring User Accounts - -
  • To configure a user account for issuing AFS commands -
  • -
  • Authenticating on Unsupported NFS Client Machines - -
  • To authenticate using the knfs command -
  • To display tokens using the knfs command -
  • To discard tokens using the knfs command -
  • -

    Appendix B. Using AFS Commands
    -

    -
  • AFS Command Syntax - -
  • Command Names -
  • Options -
  • Arguments -
  • Flags -
  • An Example Command -
  • Rules for Entering AFS Commands -
  • Rules for Using Abbreviations and Aliases -
  • Displaying Online Help for AFS Commands -
  • -

    Appendix C. The afsmonitor Program Statistics
    -

    -
  • The Cache Manager Statistics - -
  • Performance Statistics Section (PerfStats_section) -
  • Server Up/Down Statistics Section (Server_UpDown_section) -
  • RPC Operation Measurements Section (RPCop_section) -
  • Authentication and Replicated File Access Section (Auth_Access_section) -
  • -
  • The File Server Statistics - -
  • Performance Statistics Section (PerfStats_section) -
  • RPC Operations Section (RPCop_section) -
  • -

    Appendix D. AIX Audit Events
    -

    -
  • Introduction -
  • Audit-Specific Events -
  • Volume Server Events -
  • Backup Server Events -
  • Protection Server Events -
  • Authentication Events -
  • File Server and Cache Manager Interface Events -
  • BOS Server Events -
  • Volume Location Server Events -
  • -

    Index
    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd003.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd003.htm deleted file mode 100755 index 5d876c48b..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd003.htm +++ /dev/null @@ -1,37 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -


    Figures

    -
      -
    1. File Sharing Between the Read/write Source and a Clone Volume
    2. -
    3. First example scout display
    4. -
    5. Second example scout display
    6. -
    7. Third example scout display
    8. -
    9. Fourth example scout display
    10. -
    11. The afsmonitor System Overview Screen
    12. -
    13. The afsmonitor File Servers Screen
    14. -
    15. The afsmonitor File Servers Screen Shifted One Page to the Right
    16. -
    17. The afsmonitor Cache Managers Screen
    18. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd004.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd004.htm deleted file mode 100755 index 3276dc20a..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd004.htm +++ /dev/null @@ -1,32 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -


    Tables

    -
      -
    1. Suggested volume prefixes
    2. -
    3. Example volume-prefixing scheme
    4. -
    5. Source for values of uss template variables
    6. -
    7. Command-line argument sources for uss template variables
    8. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd005.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd005.htm deleted file mode 100755 index b7fc89f16..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd005.htm +++ /dev/null @@ -1,145 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -


    About This Guide

    -

    This section describes the purpose, organization, and conventions of this -document. -


    Audience and Purpose

    -

    This guide describes the concepts and procedures that an -AFS(R) system administrator needs to know. It assumes -familiarity with UNIX(R) administration, but no previous -knowledge of AFS. -

    This document describes AFS commands in the context of specific -tasks. Thus, it does not describe all commands in detail. Refer -to the AFS Administration Reference for detailed command -descriptions. -


    Document Organization

    -

    This document groups AFS administrative tasks into the -following conceptual sections: -

      -

    • Concepts and Configuration Issues -

    • Managing File Server Machines -

    • Managing Client Machines -

    • Managing Users and Groups -
    -

    The individual chapters in each section contain the following: -

      -

    • A chapter overview -

    • A quick reference list of the tasks and commands described in the chapter -

    • An introduction to concepts that pertain to all of the tasks described in -the chapter -

    • A set of sections devoted to specific tasks. Each section begins -with a discussion of concepts specific to that task, followed by step-by-step -instructions for performing the task. The instructions are as specific -as has been judged practical. If two related procedures differ from one -another in important details, separate sets of instructions are usually -provided. -
    -

    How to Use This Document

    -

    When you need to perform a specific administrative task, -follow these steps: -

      -

    1. Determine if the task concerns file server machines, client machines, or -users and groups. Turn to the appropriate section in this document and -then to the appropriate chapter. -

    2. Read or review the general introductory material at the beginning of the -chapter. -

    3. Read or review the introductory material concerning the specific task you -wish to perform. -

    4. Follow the step-by-step instructions for the task. -

    5. If necessary, refer to the AFS Administration Reference for -more detailed information about the commands. -
    -

    Related Documents

    -

    The following documents are also included in the AFS -documentation set. -

    AFS Administration Reference -

    This reference manual details the syntax and effect of each AFS -command. It is intended for the experienced AFS administrator, -programmer, or user. -

    The AFS Administration Reference lists AFS files and commands in -alphabetical order. The reference page for each command specifies its -syntax, including the acceptable aliases and abbreviations. It then -describes the command's function, arguments, and output if any. -Examples and a list of related commands are provided, as are warnings where -appropriate. -

    This manual complements the AFS Administration Guide: it -does not include procedural information, but describes commands in more detail -than the AFS Administration Guide. -

    AFS Quick Beginnings -

    This guide provides instructions for installing AFS server and client -machines. It is assumed that the installer is an experienced UNIX -(R) system administrator. -

    For predictable performance, machines must be installed and configured in -accordance with the instructions in this guide. -

    AFS Release Notes -

    This document provides information specific to each release of AFS, such as -a list of new features and commands, a list of requirements and limitations, -and instructions for upgrading server and client machines. -

    AFS User Guide -

    This guide presents the basic concepts and procedures necessary for using -AFS effectively. It assumes that the reader has some experience with -UNIX, but does not require familiarity with networking or AFS. -

    The guide explains how to perform basic functions, including -authenticating, changing a password, protecting AFS data, creating groups, and -troubleshooting. It provides illustrative examples for each function -and describes some of the differences between the UNIX file system and -AFS. -


    Typographical Conventions

    -

    This document uses the following typographical -conventions: -

      -

    • Command and option names appear in bold type in syntax -definitions, examples, and running text. Names of directories, files, -machines, partitions, volumes, and users also appear in bold -type. -

    • Variable information appears in italic type. This -includes user-supplied information on command lines and the parts of prompts -that differ depending on who issues the command. New terms also appear -in italic type. -

    • Examples of screen output and file contents appear in monospace -type. -
    -

    In addition, the following symbols appear in command syntax definitions, -both in the documentation and in AFS online help statements. When -issuing a command, do not type these symbols. -

      -

    • Square brackets [ ] surround optional items. -

    • Angle brackets < > surround user-supplied values in AFS -commands. -

    • A superscripted plus sign + follows an argument that accepts -more than one value. -

    • The percent sign % represents the regular command shell -prompt. Some operating systems possibly use a different character for -this prompt. -

    • The number sign # represents the command shell prompt for the -local superuser root. Some operating systems possibly use a -different character for this prompt. -

    • The pipe symbol | in a command syntax statement separates -mutually exclusive values for an argument. -
    -

    For additional information on AFS commands, including a description of -command string components, acceptable abbreviations and aliases, and how to -get online help for commands, see Appendix B, Using AFS Commands. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd006.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd006.htm deleted file mode 100755 index c01660f6d..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd006.htm +++ /dev/null @@ -1,780 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    An Overview of AFS Administration

    -

    This chapter provides a broad overview of the concepts and -organization of AFS. It is strongly recommended that anyone involved in -administering an AFS cell read this chapter before beginning to issue -commands. -


    A Broad Overview of AFS

    -

    This section introduces most of the key terms and concepts -necessary for a basic understanding of AFS. For a more detailed -discussion, see More Detailed Discussions of Some Basic Concepts. -

    AFS: A Distributed File System -

    AFS is a distributed file system that enables users to share and -access all of the files stored in a network of computers as easily as they -access the files stored on their local machines. The file system is -called distributed for this exact reason: files can reside on many -different machines (be distributed across them), but are available to users on -every machine. -

    Servers and Clients -

    In fact, AFS stores files on a subset of the machines in a network, called -file server machines. File server machines provide file -storage and delivery service, along with other specialized services, to the -other subset of machines in the network, the client -machines. These machines are called clients because they make use -of the servers' services while doing their own work. In a standard -AFS configuration, clients provide computational power, access to the files in -AFS and other "general purpose" tools to the users seated at their -consoles. There are generally many more client workstations than file -server machines. -

    AFS file server machines run a number of server processes, so -called because each provides a distinct specialized service: one handles -file requests, another tracks file location, a third manages security, and so -on. To avoid confusion, AFS documentation always refers to server -machines and server processes, not simply to -servers. For a more detailed description of the server -processes, see AFS Server Processes and the Cache Manager. -

    Cells -

    A cell is an administratively independent site running -AFS. As a cell's system administrator, you make many decisions -about configuring and maintaining your cell in the way that best serves its -users, without having to consult the administrators in other cells. For -example, you determine how many clients and servers to have, where to put -files, and how to allocate client machines to users. -

    Transparent Access and the Uniform Namespace -

    Although your AFS cell is administratively independent, you probably want -to organize the local collection of files (your filespace or -tree) so that users from other cells can also access the -information in it. AFS enables cells to combine their local filespaces -into a global filespace, and does so in such a way that file access -is transparent--users do not need to know anything about a -file's location in order to access it. All they need to know is -the pathname of the file, which looks the same in every cell. Thus -every user at every machine sees the collection of files in the same way, -meaning that AFS provides a uniform namespace to its users. -

    Volumes -

    AFS groups files into volumes, making it possible to distribute -files across many machines and yet maintain a uniform namespace. A -volume is a unit of disk space that functions like a container for a set of -related files, keeping them all together on one partition. Volumes can -vary in size, but are (by definition) smaller than a partition. -

    Volumes are important to system administrators and users for several -reasons. Their small size makes them easy to move from one partition to -another, or even between machines. The system administrator can -maintain maximum efficiency by moving volumes to keep the load balanced -evenly. In addition, volumes correspond to directories in the -filespace--most cells store the contents of each user home directory in a -separate volume. Thus the complete contents of the directory move -together when the volume moves, making it easy for AFS to keep track of where -a file is at a certain time. Volume moves are recorded automatically, -so users do not have to keep track of file locations. -

    Efficiency Boosters: Replication and Caching -

    AFS incorporates special features on server machines and client machines -that help make it efficient and reliable. -

    On server machines, AFS enables administrators to replicate -commonly-used volumes, such as those containing binaries for popular -programs. Replication means putting an identical read-only copy -(sometimes called a clone) of a volume on more than one file server -machine. The failure of one file server machine housing the volume does -not interrupt users' work, because the volume's contents are still -available from other machines. Replication also means that one machine -does not become overburdened with requests for files from a popular -volume. -

    On client machines, AFS uses caching to improve -efficiency. When a user on a client workstation requests a file, the -Cache Manager on the client sends a request for the data to the -File Server process running on the proper file server machine. The user -does not need to know which machine this is; the Cache Manager determines -file location automatically. The Cache Manager receives the file from -the File Server process and puts it into the cache, an area of the -client machine's local disk or memory dedicated to temporary file -storage. Caching improves efficiency because the client does not need -to send a request across the network every time the user wants the same -file. Network traffic is minimized, and subsequent access to the file -is especially fast because the file is stored locally. AFS has a way of -ensuring that the cached file stays up-to-date, called a -callback. -

    Security: Mutual Authentication and Access Control Lists -

    Even in a cell where file sharing is especially frequent and widespread, it -is not desirable that every user have equal access to every file. One -way AFS provides adequate security is by requiring that servers and clients -prove their identities to one another before they exchange information. -This procedure, called mutual authentication, requires that both -server and client demonstrate knowledge of a "shared secret" (like a password) -known only to the two of them. Mutual authentication guarantees that -servers provide information only to authorized clients and that clients -receive information only from legitimate servers. -

    Users themselves control another aspect of AFS security, by determining who -has access to the directories they own. For any directory a user owns, -he or she can build an access control list (ACL) that grants or -denies access to the contents of the directory. An access control list -pairs specific users with specific types of access privileges. There -are seven separate permissions and up to twenty different people or groups of -people can appear on an access control list. -

    For a more detailed description of AFS's mutual authentication -procedure, see A More Detailed Look at Mutual Authentication. For further discussion of ACLs, see Managing Access Control Lists. -


    More Detailed Discussions of Some Basic Concepts

    -

    The previous section offered a brief overview of the many -concepts that an AFS system administrator needs to understand. The -following sections examine some important concepts in more detail. -Although not all concepts are new to an experienced administrator, reading -this section helps ensure a common understanding of term and concepts. -

    Networks

    - -

    A network is a collection of interconnected computers able to -communicate with each other and transfer information back and forth. -

    A networked computing environment contrasts with two types of computing -environments: mainframe and personal. - - -

      -

    • A mainframe computing environment is the most -traditional. It uses a single powerful computer (the mainframe) to do -the majority of the work in the system, both file storage and -computation. It serves many users, who access their files and issue -commands to the mainframe via terminals, which generally have only -enough computing power to accept input from a keyboard and to display data on -the screen. - -

    • A personal computing environment is a single small computer -that serves one (or, at the most, a few) users. Like a mainframe -computer, the single computer stores all the files and performs all -computation. Like a terminal, the personal computer provides access to -the computer through a keyboard and screen. - -
    -

    A network can connect computers of any kind, but the typical network -running AFS connects high-function personal workstations. Each -workstation has some computing power and local disk space, usually more than a -personal computer or terminal, but less than a mainframe. For more -about the classes of machines used in an AFS environment, see Servers and Clients. -

    Distributed File Systems

    - - -

    A file system is a collection of files and the facilities -(programs and commands) that enable users to access the information in the -files. All computing environments have file systems. In a -mainframe environment, the file system consists of all the files on the -mainframe's storage disks, whereas in a personal computing environment it -consists of the files on the computer's local disk. -

    Networked computing environments often use distributed file -systems like AFS. A distributed file system takes advantage of -the interconnected nature of the network by storing files on more than one -computer in the network and making them accessible to all of them. In -other words, the responsibility for file storage and delivery is "distributed" -among multiple machines instead of relying on only one. Despite the -distribution of responsibility, a distributed file system like AFS creates the -illusion that there is a single filespace. -

    Servers and Clients

    - - - -

    AFS uses a server/client model. In general, a server is a -machine, or a process running on a machine, that provides specialized services -to other machines. A client is a machine or process that -makes use of a server's specialized service during the course of its own -work, which is often of a more general nature than the server's. -The functional distinction between clients and server is not always strict, -however--a server can be considered the client of another server whose -service it is using. -

    AFS divides the machines on a network into two basic classes, file -server machines and client machines, and assigns different -tasks and responsibilities to each. -

    File Server Machines - - -

    File server machines store the files in the distributed file -system, and a server process running on the file server machine -delivers and receives files. AFS file server machines run a number of -server processes. Each process has a special function, such -as maintaining databases important to AFS administration, managing security or -handling volumes. This modular design enables each server process to -specialize in one area, and thus perform more efficiently. For a -description of the function of each AFS server process, see AFS Server Processes and the Cache Manager. -

    Not all AFS server machines must run all of the server processes. -Some processes run on only a few machines because the demand for their -services is low. Other processes run on only one machine in order to -act as a synchronization site. See The Four Roles for File Server Machines. -

    Client Machines - -

    The other class of machines are the client machines, which -generally work directly for users, providing computational power and other -general purpose tools. Clients also provide users with access to the -files stored on the file server machines. Clients do not run any -special processes per se, but do use a modified kernel that enables them to -communicate with the AFS server processes running on the file server machines -and to cache files. This collection of kernel modifications is referred -to as the Cache Manager; see The Cache Manager. There are usually many more client machines in a -cell than file server machines. -

    Client and Server Configuration -

    In the most typical AFS configuration, both file server machines and client -machines are high-function workstations with disk drives. While this -configuration is not required, it does have some advantages. - -

    There are several advantages to using personal workstations as file server -machines. One is that it is easy to expand the network by adding -another file server machine. It is also easy to increase storage space -by adding disks to existing machines. Using workstations rather than -more powerful mainframes makes it more economical to use multiple file server -machines rather than one. Multiple file server machines provide an -increase in system availability and reliability if popular files are available -on more than one machine. -

    The advantage of using workstations as clients is that caching -on the local disk speeds the delivery of files to application programs. -(For an explanation of caching, see Caching and Callbacks.) Diskless machines can access AFS if they are -running NFS(R) and the NFS/AFS Translator, an optional component of the -AFS distribution. -

    Cells

    - -

    A cell is an independently administered site running AFS. -In terms of hardware, it consists of a collection of file server machines and -client machines defined as belonging to the cell; a machine can only -belong to one cell at a time. Users also belong to a cell in the sense -of having an account in it, but unlike machines can belong to (have an account -in) multiple cells. To say that a cell is administratively independent -means that its administrators determine many details of its configuration -without having to consult administrators in other cells or a central -authority. For example, a cell administrator determines how many -machines of different types to run, where to put files in the local tree, how -to associate volumes and directories, and how much space to allocate to each -user. -

    The terms local cell and home cell are equivalent, -and refer to the cell in which a user has initially authenticated during a -session, by logging onto a machine that belongs to that cell. All other -cells are referred to as foreign from the user's -perspective. In other words, throughout a login session, a user is -accessing the filespace through a single Cache Manager--the one on the -machine to which he or she initially logged in--whose cell membership -defines the local cell. All other cells are considered foreign during -that login session, even if the user authenticates in additional cells or uses -the cd command to change directories into their file trees. - - - - -

    It is possible to maintain more than one cell at a single geographical -location. For instance, separate departments on a university campus or -in a corporation can choose to administer their own cells. It is also -possible to have machines at geographically distant sites belong to the same -cell; only limits on the speed of network communication determine how -practical this is. -

    Despite their independence, AFS cells generally agree to make their local -filespace visible to other AFS cells, so that users in different cells can -share files if they choose. If your cell is to participate in the -"global" AFS namespace, it must comply with a few basic conventions governing -how the local filespace is configured and how the addresses of certain file -server machines are advertised to the outside world. -

    The Uniform Namespace and Transparent Access

    - - -

    One of the features that makes AFS easy to use is that it provides -transparent access to the files in a cell's filespace. -Users do not have to know which file server machine stores a file in order to -access it; they simply provide the file's pathname, which AFS -automatically translates into a machine location. -

    In addition to transparent access, AFS also creates a uniform -namespace--a file's pathname is identical regardless of which -client machine the user is working on. The cell's file tree looks -the same when viewed from any client because the cell's file server -machines store all the files centrally and present them in an identical manner -to all clients. -

    To enable the transparent access and the uniform namespace features, the -system administrator must follow a few simple conventions in configuring -client machines and file trees. For details, see Making Other Cells Visible in Your Cell. -

    Volumes

    - -

    A volume is a conceptual container for a set of related files -that keeps them all together on one file server machine partition. -Volumes can vary in size, but are (by definition) smaller than a -partition. Volumes are the main administrative unit in AFS, and have -several characteristics that make administrative tasks easier and help improve -overall system performance. -

      -

    • The relatively small size of volumes makes them easy to move from one -partition to another, or even between machines. -

    • You can maintain maximum system efficiency by moving volumes to keep the -load balanced evenly among the different machines. If a partition -becomes full, the small size of individual volumes makes it easy to find -enough room on other machines for them. - -

    • Each volume corresponds logically to a directory in the file tree and -keeps together, on a single partition, all the data that makes up the files in -the directory. By maintaining (for example) a separate volume for each -user's home directory, you keep all of the user's files together, -but separate from those of other users. This is an administrative -convenience that is impossible if the partition is the smallest unit of -storage. - -

      - -

      - -

    • The directory/volume correspondence also makes transparent file access -possible, because it simplifies the process of file location. All files -in a directory reside together in one volume and in order to find a file, a -file server process need only know the name of the file's parent -directory, information which is included in the file's pathname. -AFS knows how to translate the directory name into a volume name, and -automatically tracks every volume's location, even when a volume is moved -from machine to machine. For more about the directory/volume -correspondence, see Mount Points. -

    • Volumes increase file availability through replication and backup. - -

      - -

    • Replication (placing copies of a volume on more than one file server -machine) makes the contents more reliably available; for details, see Replication. Entire sets of volumes can be backed up to tape and -restored to the file system; see Configuring the AFS Backup System and Backing Up and Restoring AFS Data. In AFS, backup also refers to -recording the state of a volume at a certain time and then storing it (either -on tape or elsewhere in the file system) for recovery in the event files in it -are accidentally deleted or changed. See Creating Backup Volumes. -

    • Volumes are the unit of resource management. A space quota -associated with each volume sets a limit on the maximum volume size. -See Setting and Displaying Volume Quota and Current Size. - -
    -

    Mount Points

    - -

    The previous section discussed how each volume corresponds logically to a -directory in the file system: the volume keeps together on one partition -all the data in the files residing in the directory. The directory that -corresponds to a volume is called its root directory, and the -mechanism that associates the directory and volume is called a mount -point. A mount point is similar to a symbolic link in the file -tree that specifies which volume contains the files kept in a -directory. A mount point is not an actual symbolic link; its -internal structure is different. -
    Note:You must not create a symbolic link to a file whose name begins with the -number sign (#) or the percent sign (%), because the Cache Manager interprets -such a link as a mount point to a regular or read/write volume, -respectively. -
    -

    - - - - -

    The use of mount points means that many of the elements in an AFS file tree -that look and function just like standard UNIX file system directories are -actually mount points. In form, a mount point is a one-line file that -names the volume containing the data for files in the directory. When -the Cache Manager (see The Cache Manager) encounters a mount point--for example, in the course -of interpreting a pathname--it looks in the volume named in the mount -point. In the volume the Cache Manager finds an actual UNIX-style -directory element--the volume's root directory--that lists the -files contained in the directory/volume. The next element in the -pathname appears in that list. -

    A volume is said to be mounted at the point in the file tree -where there is a mount point pointing to the volume. A volume's -contents are not visible or accessible unless it is mounted. -

    Replication

    - - -

    Replication refers to making a copy, or clone, of a -source read/write volume and then placing the copy on one or more additional -file server machines in a cell. One benefit of replicating a volume is -that it increases the availability of the contents. If one file server -machine housing the volume fails, users can still access the volume on a -different machine. No one machine need become overburdened with -requests for a popular file, either, because the file is available from -several machines. -

    Replication is not necessarily appropriate for cells with limited disk -space, nor are all types of volumes equally suitable for replication -(replication is most appropriate for volumes that contain popular files that -do not change very often). For more details, see When to Replicate Volumes. -

    Caching and Callbacks

    - -

    Just as replication increases system availability, caching -increases the speed and efficiency of file access in AFS. Each AFS -client machine dedicates a portion of its local disk or memory to a -cache where it stores data temporarily. Whenever an -application program (such as a text editor) running on a client machine -requests data from an AFS file, the request passes through the Cache -Manager. The Cache Manager is a portion of the client machine's -kernel that translates file requests from local application programs into -cross-network requests to the File Server process running on the -file server machine storing the file. When the Cache Manager receives -the requested data from the File Server, it stores it in the cache and then -passes it on to the application program. -

    Caching improves the speed of data delivery to application programs in the -following ways: -

      -

    • When the application program repeatedly asks for data from the same file, -it is already on the local disk. The application does not have to wait -for the Cache Manager to request and receive the data from the File -Server. -

    • Caching data eliminates the need for repeated request and transfer of the -same data, so network traffic is reduced. Thus, initial requests and -other traffic can get through more quickly. - - -

      - -

    -

    - -

    - - While caching provides many advantages, it also creates the problem of -maintaining consistency among the many cached copies of a file and the source -version of a file. This problem is solved using a mechanism referred to -as a callback. -

    A callback is a promise by a File Server to a Cache Manager to inform the -latter when a change is made to any of the data delivered by the File -Server. Callbacks are used differently based on the type of file -delivered by the File Server: -

      -

    • When a File Server delivers a writable copy of a file (from a read/write -volume) to the Cache Manager, the File Server sends along a callback with that -file. If the source version of the file is changed by another user, the -File Server breaks the callback associated with the cached version of that -file--indicating to the Cache Manager that it needs to update the cached -copy. -

    • When a File Server delivers a file from a read-only volume to the Cache -Manager, the File Server sends along a callback associated with the entire -volume (so it does not need to send any more callbacks when it delivers -additional files from the volume). Only a single callback is required -per accessed read-only volume because files in a read-only volume can change -only when a new version of the complete volume is released. All -callbacks associated with the old version of the volume are broken at release -time. -
    -

    The callback mechanism ensures that the Cache Manager always requests the -most up-to-date version of a file. However, it does not ensure that the -user necessarily notices the most current version as soon as the Cache Manager -has it. That depends on how often the application program requests -additional data from the File System or how often it checks with the Cache -Manager. -


    AFS Server Processes and the Cache Manager

    - - -

    As mentioned in Servers and Clients, AFS file server machines run a number of processes, each -with a specialized function. One of the main responsibilities of a -system administrator is to make sure that processes are running correctly as -much of the time as possible, using the administrative services that the -server processes provide. -

    The following list briefly describes the function of each server process -and the Cache Manager; the following sections then discuss the important -features in more detail. -

    The File Server, the most fundamental of the servers, delivers -data files from the file server machine to local workstations as requested, -and stores the files again when the user saves any changes to the -files. -

    The Basic OverSeer Server (BOS Server) ensures that the other -server processes on its server machine are running correctly as much of the -time as possible, since a server is useful only if it is available. The -BOS Server relieves system administrators of much of the responsibility for -overseeing system operations. -

    The Authentication Server helps ensure that communications on -the network are secure. It verifies user identities at login and -provides the facilities through which participants in transactions prove their -identities to one another (mutually authenticate). It maintains the -Authentication Database. -

    The Protection Server helps users control who has access to -their files and directories. Users can grant access to several other -users at once by putting them all in a group entry in the Protection Database -maintained by the Protection Server. -

    The Volume Server performs all types of volume -manipulation. It helps the administrator move volumes from one server -machine to another to balance the workload among the various machines. -

    The Volume Location Server (VL Server) maintains the Volume -Location Database (VLDB), in which it records the location of volumes as they -move from file server machine to file server machine. This service is -the key to transparent file access for users. -

    The Update Server distributes new versions of AFS server process -software and configuration information to all file server machines. It -is crucial to stable system performance that all server machines run the same -software. -

    The Backup Server maintains the Backup Database, in which it -stores information related to the Backup System. It enables the -administrator to back up data from volumes to tape. The data can then -be restored from tape in the event that it is lost from the file -system. -

    The Salvager is not a server in the sense that others -are. It runs only after the File Server or Volume Server fails; it -repairs any inconsistencies caused by the failure. The system -administrator can invoke it directly if necessary. -

    The Network Time Protocol Daemon (NTPD) is not an AFS server -process per se, but plays a vital role nonetheless. It synchronizes the -internal clock on a file server machine with those on other machines. -Synchronized clocks are particularly important for correct functioning of the -AFS distributed database technology (known as Ubik); see Configuring the Cell for Proper Ubik Operation. The NTPD is controlled by the runntp -process. -

    The Cache Manager is the one component in this list that resides -on AFS client rather than file server machines. It not a process per -se, but rather a part of the kernel on AFS client machines that communicates -with AFS server processes. Its main responsibilities are to retrieve -files for application programs running on the client and to maintain the files -in the cache. -

    The File Server

    - -

    The File Server is the most fundamental of the AFS server -processes and runs on each file server machine. It provides the same -services across the network that the UNIX file system provides on the local -disk: -

      -

    • Delivering programs and data files to client workstations as requested and -storing them again when the client workstation finishes with them. -

    • Maintaining the hierarchical directory structure that users create to -organize their files. -

    • Handling requests for copying, moving, creating, and deleting files and -directories. -

    • Keeping track of status information about each file and directory -(including its size and latest modification time). -

    • Making sure that users are authorized to perform the actions they request -on particular files or directories. -

    • Creating symbolic and hard links between files. -

    • Granting advisory locks (corresponding to UNIX locks) on request. -
    -

    The Basic OverSeer Server

    - -

    The Basic OverSeer Server (BOS Server) reduces the demands on -system administrators by constantly monitoring the processes running on its -file server machine. It can restart failed processes automatically and -provides a convenient interface for administrative tasks. -

    The BOS Server runs on every file server machine. Its primary -function is to minimize system outages. It also -

      -

    • Constantly monitors the other server processes (on the local machine) to -make sure they are running correctly. -

    • Automatically restarts failed processes, without contacting a human -operator. When restarting multiple server processes simultaneously, the -BOS server takes interdependencies into account and initiates restarts in the -correct order. - -

      - -

    • Accepts requests from the system administrator. Common reasons to -contact BOS are to verify the status of server processes on file server -machines, install and start new processes, stop processes either temporarily -or permanently, and restart dead processes manually. -

    • Helps system administrators to manage system configuration -information. The BOS server automates the process of adding and -changing server encryption keys, which are important in mutual -authentication. The BOS Server also provides a simple interface for -modifying two files that contain information about privileged users and -certain special file server machines. For more details about these -configuration files, see Common Configuration Files in the /usr/afs/etc Directory. -
    -

    The Authentication Server

    - -

    The Authentication Server performs two main functions related to -network security: -

      -

    • Verifying the identity of users as they log into the system by requiring -that they provide a password. The Authentication Server grants the user -a token as proof to AFS server processes that the user has -authenticated. For more on tokens, see Complex Mutual Authentication. -

    • Providing the means through which server and client processes prove their -identities to each other (mutually authenticate). This helps to create -a secure environment in which to send cross-network messages. -
    -

    In fulfilling these duties, the Authentication Server utilizes algorithms -and other procedures known as Kerberos (which is why many commands -used to contact the Authentication Server begin with the letter -k). This technology was originally developed by the -Massachusetts Institute of Technology's Project Athena. -

    The Authentication Server also maintains the Authentication -Database, in which it stores user passwords converted into encryption -key form as well as the AFS server encryption key. To learn more about -the procedures AFS uses to verify user identity and during mutual -authentication, see A More Detailed Look at Mutual Authentication. - - - - -

    The Protection Server

    - - - -

    The Protection Server is the key to AFS's refinement of the -normal UNIX methods for protecting files and directories from unauthorized -use. The refinements include the following: -

      -

    • Defining seven access permissions rather than the standard UNIX file -system's three. In conjunction with the UNIX mode bits associated -with each file and directory element, AFS associates an access control -list (ACL) with each directory. The ACL specifies which users -have which of the seven specific permissions for the directory and all the -files it contains. For a definition of AFS's seven access -permissions and how users can set them on access control lists, see Managing Access Control Lists. - -

    • Enabling users to grant permissions to numerous individual users--a -different combination to each individual if desired. UNIX protection -distinguishes only between three user or groups: the owner of the file, -members of a single specified group, and everyone who can access the local -file system. -

    • Enabling users to define their own groups of users, recorded in the -Protection Database maintained by the Protection Server. The -groups then appear on directories' access control lists as though they -were individuals, which enables the granting of permissions to many users -simultaneously. -

    • Enabling system administrators to create groups containing client machine -IP addresses to permit access when it originates from the specified client -machines. These types of groups are useful when it is necessary to -adhere to machine-based licensing restrictions. -
    - - -

    The Protection Server's main duty is to help the File Server determine -if a user is authorized to access a file in the requested manner. The -Protection Server creates a list of all the groups to which the user -belongs. The File Server then compares this list to the ACL associated -with the file's parent directory. A user thus acquires access both -as an individual and as a member of any groups. -

    The Protection Server also maps usernames (the name typed at the -login prompt) to AFS user ID numbers (AFS UIDs). -These UIDs are functionally equivalent to UNIX UIDs, but operate in the domain -of AFS rather than in the UNIX file system on a machine's local -disk. This conversion service is essential because the tokens that the -Authentication Server grants to authenticated users are stamped with usernames -(to comply with Kerberos standards). The AFS server processes identify -users by AFS UID, not by username. Before they can understand whom the -token represents, they need the Protection Server to translate the username -into an AFS UID. For further discussion of tokens, see A More Detailed Look at Mutual Authentication. -

    The Volume Server

    - -

    The Volume Server provides the interface through which you -create, delete, move, and replicate volumes, as well as prepare them for -archiving to tape or other media (backing up). Volumes explained the advantages gained by storing files in -volumes. Creating and deleting volumes are necessary when adding and -removing users from the system; volume moves are done for load -balancing; and replication enables volume placement on multiple file -server machines (for more on replication, see Replication). -

    The Volume Location (VL) Server

    - - -

    The VL Server maintains a complete list of volume locations in -the Volume Location Database (VLDB). When the Cache Manager -(see The Cache Manager) begins to fill a file request from an application program, -it first contacts the VL Server in order to learn which file server machine -currently houses the volume containing the file. The Cache Manager then -requests the file from the File Server process running on that file server -machine. -

    The VLDB and VL Server make it possible for AFS to take advantage of the -increased system availability gained by using multiple file server machines, -because the Cache Manager knows where to find a particular file. -Indeed, in a certain sense the VL Server is the keystone of the entire file -system--when the information in the VLDB is inaccessible, the Cache -Manager cannot retrieve files, even if the File Server processes are working -properly. A list of the information stored in the VLDB about each -volume is provided in Volume Information in the VLDB. - -

    The Update Server

    - -

    The Update Server helps guarantee that all file server machines -are running the same version of a server process. System performance -can be inconsistent if some machines are running one version of the BOS Server -(for example) and other machines were running another version. -

    To ensure that all machines run the same version of a process, install new -software on a single file server machine of each system type, called the -binary distribution machine for that type. The binary -distribution machine runs the server portion of the Update Server, -whereas all the other machines of that type run the client portion -of the Update Server. The client portions check frequently with the -server portion to see if they are running the right version of every -process; if not, the client portion retrieves the right version from the -binary distribution machine and installs it locally. The system -administrator does not need to remember to install new software individually -on all the file server machines: the Update Server does it -automatically. For more on binary distribution machines, see Binary Distribution Machines. - -

    - -

    In cells that run the United States edition of AFS, the Update Server also -distributes configuration files that all file server machines need to store on -their local disks (for a description of the contents and purpose of these -files, see Common Configuration Files in the /usr/afs/etc Directory). As with server process software, the need for -consistent system performance demands that all the machines have the same -version of these files. With the United States edition, the system -administrator needs to make changes to these files on one machine only, the -cell's system control machine, which runs a server portion of -the Update Server. All other machines in the cell run a client portion -that accesses the correct versions of these configuration files from the -system control machine. Cells running the international edition of AFS -do not use a system control machine to distribute configuration files. -For more information, see The System Control Machine. -

    The Backup Server

    - - -

    The Backup Server maintains the information in the Backup -Database. The Backup Server and the Backup Database enable -administrators to back up data from AFS volumes to tape and restore it from -tape to the file system if necessary. The server and database together -are referred to as the Backup System. -

    Administrators initially configure the Backup System by defining sets of -volumes to be dumped together and the schedule by which the sets are to be -dumped. They also install the system's tape drives and define the -drives' Tape Coordinators, which are the processes that -control the tape drives. -

    Once the Backup System is configured, user and system data can be dumped -from volumes to tape. In the event that data is ever lost from the -system (for example, if a system or disk failure causes data to be lost), -administrators can restore the data from tape. If tapes are -periodically archived, or saved, data can also be restored to its state at a -specific time. Additionally, because Backup System data is difficult to -reproduce, the Backup Database itself can be backed up to tape and restored if -it ever becomes corrupted. For more information on configuring and -using the Backup System, see Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -

    The Salvager

    - -

    The Salvager differs from other AFS Servers in that it runs only -at selected times. The BOS Server invokes the Salvager when the File -Server, Volume Server, or both fail. The Salvager attempts to repair -disk corruption that can result from a failure. -

    As a system administrator, you can also invoke the Salvager as necessary, -even if the File Server or Volume Server has not failed. See Salvaging Volumes. -

    The Network Time Protocol Daemon

    - -

    The Network Time Protocol Daemon (NTPD) is not an AFS server -process per se, but plays an important role. It helps guarantee that -all of the file server machines agree on the time. The NTPD on one file -server machine acts as a synchronization site, generally learning the correct -time from a source outside the cell. The NTPDs on the other file server -machines refer to the synchronization site to set the internal clocks on their -machines. -

    Keeping clocks synchronized is particularly important to the correct -operation of AFS's distributed database technology, which coordinates the -copies of the Authentication, Backup, Protection, and Volume Location -Databases; see Replicating the AFS Administrative Databases. Client machines also refer to these clocks for the -correct time; therefore, it is less confusing if all file server machines -have the same time. For more technical detail about the NTPD, see The runntp Process. -

    The Cache Manager

    - -

    As already mentioned in Caching and Callbacks, the Cache Manager is the one component in this -section that resides on client machines rather than on file server -machines. It is not technically a stand-alone process, but rather a set -of extensions or modifications in the client machine's kernel that enable -communication with the server processes running on server machines. Its -main duty is to translate file requests (made by application programs on -client machines) into remote procedure calls (RPCs) to the File Server. -(The Cache Manager first contacts the VL Server to find out which File Server -currently houses the volume that contains a requested file, as mentioned in The Volume Location (VL) Server). When the Cache Manager receives the requested file, -it caches it before passing data on to the application program. -

    The Cache Manager also tracks the state of files in its cache compared to -the version at the File Server by storing the callbacks sent by the File -Server. When the File Server breaks a callback, indicating that a file -or volume changed, the Cache Manager requests a copy of the new version before -providing more data to application programs. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd007.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd007.htm deleted file mode 100755 index 80a8a1244..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd007.htm +++ /dev/null @@ -1,2374 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Issues in Cell Configuration and Administration

    -

    This chapter discusses many of the issues to consider when -configuring and administering a cell, and directs you to detailed related -information available elsewhere in this guide. It is assumed you are -already familiar with the material in An Overview of AFS Administration. -

    It is best to read this chapter before installing your cell's first -file server machine or performing any other administrative task. - - - -


    Differences between AFS and UNIX: A Summary

    -

    AFS behaves like a standard UNIX file system in most -respects, while also making file sharing easy within and between cells. -This section describes some differences between AFS and the UNIX file system, -referring you to more detailed information as appropriate. - -

    Differences in File and Directory Protection

    -

    AFS augments the standard UNIX file protection mechanism in two -ways: it associates an access control list (ACL) -with each directory, and it enables users to define a large number of their -own groups, which can be placed on ACLs. -

    AFS uses ACLs to protect files and directories, rather than relying -exclusively on the mode bits. This has several implications, which are -discussed further in the indicated sections: -

      -

    • AFS ACLs use seven access permissions rather than the three UNIX mode -bits. See The AFS ACL Permissions. -

    • For directories, AFS ignores the UNIX mode bits. For files, AFS -uses only the first set of mode bits (the owner bits) , and their -meaning interacts with permissions on the directory's ACL. See How AFS Interprets the UNIX Mode Bits. -

    • A directory's ACL protects all of the files in a directory in the -same manner. To apply a more restrictive set of AFS permissions to -certain file, place it in directory with a different ACL. -

    • Moving a file to a different directory changes its protection. See Differences Between UFS and AFS Data Protection. -

    • An ACL can include about 20 entries granting different combinations of -permissions to different users or groups, rather than only the three UNIX -entities represented by the three sets of mode bits. See Differences Between UFS and AFS Data Protection. -

    • You can designate an AFS file as write-only as in the UNIX file system, by -setting only the w (write) mode bit. You cannot -designate an AFS directory as write-only, because AFS ignores the mode bits on -a directory. See How AFS Interprets the UNIX Mode Bits. -
    -

    AFS enables users to define the groups of other users. Placing these -groups on ACLs extends the same permissions to a number of exactly specified -users at the same time, which is much more convenient than placing the -individuals on the ACLs directly. See Administering the Protection Database. -

    There are also system-defined groups, system:anyuser and -system:authuser, whose presence on an ACL extends access to a -wide range of users at once. See The System Groups and Using Groups on ACLs. - - -

    Differences in Authentication

    -

    Just as the AFS filespace is distinct from each -machine's local file system, AFS authentication is separate from local -login. This has two practical implications, which are discussed further -in Using an AFS-modified login Utility. -

      -

    • To access AFS files, users must both log into the local machine's -UNIX file system and authenticate with the AFS authentication service. -(Logging into the local UNIX file system is necessary because the AFS -filespace is accessed through the Cache Manager, which resides in the local -machine's kernel.) -

      AFS provides a modified login utility for each system type that -accomplishes both local login and AFS authentication in one step, based on a -single password. If you choose not to use the AFS-modified login -utility, your users must login and authenticate in separate steps, as detailed -in the AFS User Guide. -

    • Passwords are stored in two separate places: the Authentication -Database for AFS and each machine's local password file -(/etc/passwd or equivalent) for the UNIX file system. A -user's passwords in the two places can differ if desired, though the -resulting behavior depends on whether and how the cell is using an -AFS-modified login utility. -
    -

    Differences in the Semantics of Standard UNIX Commands

    -

    This section summarizes how AFS modifies the functionality of some UNIX -commands. -

    - - - -

    The chmod command -
    Only members of the system:administrators group can use -this command to turn on the setuid, setgid or sticky mode bits on AFS -files. For more information, see Determining if a Client Can Run Setuid Programs. - - -

    The chown command -
    Only members of the system:administrators group can issue -this command on AFS files. - - -

    The chgrp command -
    Only members of the system:administrators can issue this -command on AFS files and directories. - - -

    The ftpd daemon -
    The AFS-modified version of this daemon attempts to authenticate remote -issuers of the ftp command with the local AFS authentication -service. See Using UNIX Remote Services in the AFS Environment. - - -

    The groups command -
    If the user's AFS tokens are associated with a process authentication -group (PAG), the output of this command sometimes includes two large -numbers. To learn about PAGs, see Identifying AFS Tokens by PAG. - - -

    The inetd daemon -
    The AFS-modified version of this daemon authenticates remote issuers of -the AFS-modified rcp and rsh commands with the local AFS -authentication service. See Using UNIX Remote Services in the AFS Environment. -

    The login utility -
    AFS-modified login utilities both log the issuer into the local file -system and authenticate the user with the AFS authentication service. -See Using an AFS-modified login Utility. - - -

    The ln command -
    This command cannot create hard links between files in different AFS -directories. See Creating Hard Links. - - -

    The rcp command -
    The AFS-modified version of this command enables the issuer to access -files on the remote machine as an authenticated AFS user. See Using UNIX Remote Services in the AFS Environment. - - -

    The rlogind daemon -
    The AFS-modified version of this daemon authenticates remote issuers of -the rlogin command with the local AFS authentication -service. See Using UNIX Remote Services in the AFS Environment. -

    The AFS distribution for some system types possibly does not include a -modified rlogind program. See the AFS Release -Notes. - - -

    The remsh or rsh command -
    The AFS-modified version of this command enables the issuer to execute -commands on the remote machine as an authenticated AFS user. See Using UNIX Remote Services in the AFS Environment. -
    - - - - - - -

    The AFS version of the fsck Command

    -

    Never run the standard UNIX fsck command on an AFS file -server machine. It does not understand how the File Server organizes -volume data on disk, and so moves all AFS data into the lost+found -directory on the partition. -

    Instead, use the version of the fsck program that is included in -the AFS distribution. The AFS Quick Beginnings explains how -to replace the vendor-supplied fsck program with the AFS version as -you install each server machine. -

    The AFS version functions like the standard fsck program on data -stored on both UFS and AFS partitions. The appearance of a banner like -the following as the fsck program initializes confirms that you are -running the correct one: -

       --- AFS (R) version fsck---
    -
    -

    where version is the AFS version. For correct results, it -must match the AFS version of the server binaries in use on the -machine. -

    If you ever accidentally run the standard version of the program, contact -AFS Product Support immediately. It is sometimes possible to recover -volume data from the lost+found directory. - - -

    Creating Hard Links

    -

    AFS does not allow hard links (created with the UNIX -ln command) between files that reside in different directories, -because in that case it is unclear which of the directory's ACLs to -associate with the link. -

    AFS also does not allow hard links to directories, in order to keep the -file system organized as a tree. -

    It is possible to create symbolic links (with the UNIX ln -s -command) between elements in two different AFS directories, or even between an -element in AFS and one in a machine's local UNIX file system. Do -not create a symbolic link to a file whose name begins with either a number -sign (#) or a percent sign (%), however. The -Cache Manager interprets such links as a mount point to a regular or -read/write volume, respectively. - - - -

    AFS Implements Save on Close

    -

    When an application issues the UNIX close system -call on a file, the Cache Manager performs a synchronous write of the data to -the File Server that maintains the central copy of the file. It does -not return control to the application until the File Server has acknowledged -receipt of the data. For the fsync system call, control does -not return to the application until the File Server indicates that it has -written the data to non-volatile storage on the file server machine. -

    When an application issues the UNIX write system call, the Cache -Manager writes modifications to the local AFS client cache only. If the -local machine crashes or an application program exits without issuing the -close system call, it is possible that the modifications are not -recorded in the central copy of the file maintained by the File Server. -The Cache Manager does sometimes write this type of modified data from the -cache to the File Server without receiving the close or -fsync system call, for example if it needs to free cache chunks for -new data. However, it is not generally possible to predict when the -Cache Manager transfers modified data to the File Server in this way. -

    The implication is that if an application's Save option -invokes the write system call rather than close or -fsync, the changes are not necessarily stored permanently on the -File Server machine. Most application programs issue the -close system call for save operations, as well as when they finish -handling a file and when they exit. -

    Setuid Programs

    - -

    Set the UNIX setuid bit only for the local superuser root; -this does not present an automatic security risk: the local superuser -has no special privilege in AFS, but only in the local machine's UNIX -file system and kernel. -

    Any file can be marked with the setuid bit, but only members of the -system:administrators group can issue the chown -system call or the /etc/chown command. -

    The fs setcell command determines whether setuid programs that -originate in a foreign cell can run on a given client machine. See Determining if a Client Can Run Setuid Programs. - - - - -


    Choosing a Cell Name

    -

    This section explains how to choose a cell name and explains -why choosing an appropriate cell name is important. -

    Your cell name must distinguish your cell from all others in the AFS global -namespace. By conventions, the cell name is the second element in any -AFS pathname; therefore, a unique cell name guarantees that every AFS -pathname uniquely identifies a file, even if cells use the same directory -names at lower levels in their local AFS filespace. For example, both -the ABC Corporation cell and the State University cell can have a home -directory for the user pat, because the pathnames are -distinct: /afs/abc.com/usr/pat and -/afs/stateu.edu/usr/pat. -

    By convention, cell names follow the ARPA Internet Domain System -conventions for site names. If you are already an Internet site, then -it is simplest to choose your Internet domain name as the cellname. -

    If you are not an Internet site, it is best to choose a unique -Internet-style name, particularly if you plan to connect to the Internet in -the future. AFS Product Support is available for help in selecting an -appropriate name. There are a few constraints on AFS cell names: -

      -

    • It can contain as many as 64 characters, but shorter names are better -because the cell name frequently is part of machine and file names. If -your cell name is long, you can reduce pathname length by creating a symbolic -link to the complete cell name, at the second level in your file tree. -See The Second (Cellname) Level. -

    • To guarantee it is suitable for different operating system types, the cell -name can contain only lowercase characters, numbers, underscores, dashes, and -periods. Do not include command shell metacharacters. -

    • It can include any number of fields, which are conventionally separated by -periods (see the examples below). -

    • It must end in a suffix that indicates the type of institution it is, or -the country in which it is situated. The following are some of the -standard suffixes: -
      -

      .com -
      For businesses and other commercial organizations. Example: -abc.com for the ABC Corporation cell. -

      .edu -
      For educational institutions such as universities. Example: -stateu.edu for the State University cell. -

      .gov -
      For United States government institutions. -

      .mil -
      For United States military installations. -
      -
    -

    Other suffixes are available if none of these are appropriate. - - -You can learn about suffixes by calling the Defense Data Network [Internet] -Network Information Center in the United States at (800) 235-3155. The -NIC can also provide you with the forms necessary for registering your cell -name as an Internet domain name. Registering your name prevents another -Internet site from adopting the name later. - - - - -

    How to Set the Cell Name

    -

    The cell name is recorded in two files on the local disk of each file -server and client machine. Among other functions, these files define -the machine's cell membership and so affect how programs and processes -run on the machine; see Why Choosing the Appropriate Cell Name is Important. The procedure for setting the cell name is different -for the two types of machines. -

    For file server machines, the two files that record the cell name are the -/usr/afs/etc/ThisCell and /usr/afs/etc/CellServDB -files. As described more explicitly in the AFS Quick -Beginnings, you set the cell name in both by issuing the bos -setcellname command on the first file server machine you install in your -cell. It is not usually necessary to issue the command again. If -you run the United States edition of AFS and use the Update Server, it -distributes its copy of the ThisCell and CellServDB -files to additional server machines that you install. If you use the -international edition of AFS, the AFS Quick Beginnings explains how -to copy the files manually. -

    For client machines, the two files that record the cell name are the -/usr/vice/etc/ThisCell and /usr/vice/etc/CellServDB -files. You create these files on a per-client basis, either with a text -editor or by copying them onto the machine from a central source in -AFS. See Maintaining Knowledge of Database Server Machines for details. -

    Change the cell name in these files only when you want to transfer the -machine to a different cell (it can only belong to one cell at a time). -If the machine is a file server, follow the complete set of instructions in -the AFS Quick Beginnings for configuring a new cell. If the -machine is a client, all you need to do is change the files appropriately and -reboot the machine. The next section explains further the negative -consequences of changing the name of an existing cell. -

    To set the default cell name used by most AFS commands without changing the -local /usr/vice/etc/ThisCell file, set the AFSCELL environment -variable in the command shell. It is worth setting this variable if you -need to complete significant administrative work in a foreign cell. -
    Note:The fs checkservers and fs mkmount commands do not use -the AFSCELL variable. The fs checkservers command always -defaults to the cell named in the ThisCell file, unless the --cell argument is used. The fs mkmount command -defaults to the cell in which the parent directory of the new mount point -resides. -
    - -

    Why Choosing the Appropriate Cell Name is Important

    -

    Take care to select a cell name that is suitable for -long-term use. Changing a cell name later is complicated. An -appropriate cell name is important because it is the second element in the -pathname of all files in a cell's file tree. Because each cell -name is unique, its presence in an AFS pathname makes the pathname unique in -the AFS global namespace, even if multiple cells use similar filespace -organization at lower levels. For instance, it means that every cell -can have a home directory called /afs/cellname/usr/pat -without causing a conflict. The presence of the cell name in pathnames -also means that users in every cell use the same pathname to access a file, -whether the file resides in their local cell or in a foreign cell. -

    Another reason to choose the correct cell name early in the process of -installing your cell is that the cell membership defined in each -machine's ThisCell file affects the performance of many -programs and processes running on the machine. For instance, AFS -commands (fs, kas, pts and vos -commands) by default execute in the cell of the machine on which they are -issued. The command interpreters check the ThisCell file on -the local disk and then contact the database server machines listed in the -CellServDB file for the indicated cell (the bos commands -work differently because the issuer always has to name of the machine on which -to run the command). -

    The ThisCell file also determines the cell for which a user -receives an AFS token when he or she logs in to a machine. The cell -name also plays a role in security. As it converts a user password into -an encryption key for storage in the Authentication Database, the -Authentication Server combines the password with the cell name found in the -ThisCell file. AFS-modified login utilities use the same -algorithm to convert the user's password into an encryption key before -contacting the Authentication Server to obtain a token for the user. -(For a description of how AFS's security system uses encryption keys, see -A More Detailed Look at Mutual Authentication.) -

    This method of converting passwords into encryption keys means that the -same password results in different keys in different cells. Even if a -user uses the same password in multiple cells, obtaining a user's token -from one cell does not enable unauthorized access to the user's account -in another cell. -

    If you change the cell name, you must change the ThisCell and -CellServDB files on every server and client machine. Failure -to change them all can prevent login, because the encryption keys produced by -the login utility do not match the keys stored in the Authentication -Database. In addition, many commands from the AFS suites do not work as -expected. - - - -


    Participating in the AFS Global Namespace

    -

    Participating in the AFS global namespace makes your -cell's local file tree visible to AFS users in foreign cells and makes -other cells' file trees visible to your local users. It makes file -sharing across cells just as easy as sharing within a cell. This -section outlines the procedures necessary for participating in the global -namespace. -

      -

    • Participation in the global namespace is not mandatory. Some cells -use AFS primarily to facilitate file sharing within the cell, and are not -interested in providing their users with access to foreign cells. -

    • Making your file tree visible does not mean making it vulnerable. -You control how foreign users access your cell using the same protection -mechanisms that control local users' access. See Granting and Denying Foreign Users Access to Your Cell. -

    • The two aspects of participation are independent. A cell can make -its file tree visible without allowing its users to see foreign cells' -file trees, or can enable its users to see other file trees without -advertising its own. -

    • You make your cell visible to others by advertising your database server -machines. See Making Your Cell Visible to Others. -

    • You control access to foreign cells on a per-client machine basis. -In other words, it is possible to make a foreign cell accessible from one -client machine in your cell but not another. See Making Other Cells Visible in Your Cell. -
    - - - - - - -

    What the Global Namespace Looks Like

    -

    The AFS global namespace appears the same to all AFS cells -that participate in it, because they all agree to follow a small set of -conventions in constructing pathnames. -

    The first convention is that all AFS pathnames begin with the string -/afs to indicate that they belong to the AFS global -namespace. -

    The second convention is that the cell name is the second element in an AFS -pathname; it indicates where the file resides (that is, the cell in which -a file server machine houses the file). As noted, the presence of a -cell name in pathnames makes the global namespace possible, because it -guarantees that all AFS pathnames are unique even if cells use the same -directory names at lower levels in their AFS filespace. -

    What appears at the third and lower levels in an AFS pathname depends on -how a cell has chosen to arrange its filespace. There are some -suggested conventional directories at the third level; see The Third Level. - - - -

    Making Your Cell Visible to Others

    -

    You make your cell visible to others by advertising your cell -name and database server machines. Just like client machines in the -local cell, the Cache Manager on machines in foreign cells use the information -to reach your cell's Volume Location (VL) Servers when they need volume -and file location information. Similarly, client-side authentication -programs running in foreign cells use the information to contact your -cell's authentication service. -

    There are two places you can make this information available: -

      - - -

    • In the global CellServDB file maintained by the AFS Product -Support group. This file lists the name and database server machines of -every cell that has agreed to make this information available to other -cells. -

      To add or change your cell's listing in this file, have the official -support contact at your site call or write to AFS Product Support. -Changes to the file are frequent enough that AFS Product Support does not -announce each one. It is a good policy to check the file for changes on -a regular schedule. - - -

    • A file called CellServDB.local in the -/afs/cellname/service/etc directory of your -cell's filespace. List only your cell's database server -machines. -
    -

    Update the files whenever you change the identity of your cell's -database server machines. Also update the copies of the -CellServDB files on all of your server machines (in the -/usr/afs/etc directory) and client machines (in the -/usr/vice/etc directory). For instructions, see Maintaining the Server CellServDB File and Maintaining Knowledge of Database Server Machines. -

    Once you have advertised your database server machines, it can be difficult -to make your cell invisible again. You can remove the -CellServDB.local file and ask AFS Product Support to remove -your entry from the global CellServDB file, but other cells -probably have an entry for your cell in their local CellServDB -files already. To make those entries invalid, you must change the names -or IP addresses of your database server machines. -

    Your cell does not have to be invisible to be inaccessible, however. -To make your cell completely inaccessible to foreign users, remove the -system:anyuser group from all ACLs at the top three levels of -your filespace; see Granting and Denying Foreign Users Access to Your Cell. - - - - -

    Making Other Cells Visible in Your Cell

    -

    To make a foreign cell's filespace visible on a client -machine in your cell, perform the following three steps: -

      -

    1. Mount the cell's root.cell volume at the second -level in your cell's filespace just below the /afs -directory. Use the fs mkmount command with the --cell argument as instructed in To create a cellular mount point. -

    2. Mount AFS at the /afs directory on the client machine. -The afsd program, which initializes the Cache Manager, performs the -mount automatically at the directory named in the first field of the local -/usr/vice/etc/cacheinfo file or by the command's --mountdir argument. Mounting AFS at an alternate location -makes it impossible to reach the filespace of any cell that mounts its -root.afs and root.cell volumes at the -conventional locations. See Displaying and Setting the Cache Size and Location. -

    3. Create an entry for the cell in the list of database server machines which -the Cache Manager maintains in kernel memory. -

      The /usr/vice/etc/CellServDB file on every client machine's -local disk lists the database server machines for the local and foreign -cells. The afsd program reads the contents of the -CellServDB file into kernel memory as it initializes the Cache -Manager. You can also use the fs newcell command to add or -alter entries in kernel memory directly between reboots of the machine. -See Maintaining Knowledge of Database Server Machines. -

    -

    Note that making a foreign cell visible to client machines does not -guarantee that your users can access its filespace. The ACLs in the -foreign cell must also grant them the necessary permissions. - - -

    Granting and Denying Foreign Users Access to Your Cell

    -

    Making your cell visible in the AFS global namespace does not -take away your control over the way in which users from foreign cells access -your file tree. -

    By default, foreign users access your cell as the user -anonymous, which means they have only the permissions granted to -the system:anyuser group on each directory's ACL. -Normally these permissions are limited to the l (lookup) -and r (read) permissions. -

    There are two ways to grant wider access to foreign users: -

      -

    • Grant additional permissions to the system:anyuser group -on certain ACLs. Keep in mind, however, that all users can then access -that directory in the indicated way (not just specific foreign users you have -in mind). -

    • Create a local authentication account for specific foreign users, by -creating entries in the Protection and Authentication Databases and local -password file. It is not possible to place foreign usernames on ACLs, -nor to authenticate in a foreign cell without having an account in it. -
    - - - -

    Configuring Your AFS Filespace

    -

    This section summarizes the issues to consider when -configuring your AFS filespace. For a discussion of creating volumes -that correspond most efficiently to the filespace's directory structure, -see Creating Volumes to Simplify Administration. -

    Note for Windows users: Windows uses a backslash -( \ ) rather than a forward slash -( / ) to separate the elements in a -pathname. The hierarchical organization of the filespace is however the -same as on a UNIX machine. -

    AFS pathnames must follow a few conventions so the AFS global namespace -looks the same from any AFS client machine. There are corresponding -conventions to follow in building your file tree, not just because pathnames -reflect the structure of a file tree, but also because the AFS Cache Manager -expects a certain configuration. - - -

    The Top /afs Level

    -

    The first convention is that the top level in your file tree be called -the /afs directory. If you name it something else, then you -must use the -mountdir argument with the afsd program to -get Cache Managers to mount AFS properly. You cannot participate in the -AFS global namespace in that case. - - - -

    The Second (Cellname) Level

    -

    The second convention is that just below the /afs -directory you place directories corresponding to each cell whose file tree is -visible and accessible from the local cell. Minimally, there must be a -directory for the local cell. Each such directory is a mount point to -the indicated cell's root.cell volume. For -example, in the ABC Corporation cell, /afs/abc.com is a -mount point for the cell's own root.cell volume and -stateu.edu is a mount point for the State University -cell's root.cell volume. The fs -lsmount command displays the mount points. -

       % fs lsmount /afs/abc.com 
    -   '/afs/abc.com' is a mount point for volume '#root.cell'
    -   % fs lsmount /afs/stateu.edu
    -   '/afs/stateu.edu' is a mount point for volume '#stateu.edu:root.cell'
    -
    -

    To reduce the amount of typing necessary in pathnames, you can create a -symbolic link with an abbreviated name to the mount point of each cell your -users frequently access (particularly the home cell). In the ABC -Corporation cell, for instance, /afs/abc is a symbolic link to the -/afs/abc.com mount point, as the fs lsmount -command reveals. -

       % fs lsmount /afs/abc
    -   '/afs/abc' is a symbolic link, leading to a mount point for volume '#root.cell'
    -
    - - -

    The Third Level

    -

    You can organize the third level of your cell's file -tree any way you wish. The following list describes directories that -appear at this level in the conventional configuration: -

    -

    common -
    This directory contains programs and files needed by users working on -machines of all system types, such as text editors, online documentation -files, and so on. Its /etc subdirectory is a logical place -to keep the central update sources for files used on all of your cell's -client machines, such as the ThisCell and CellServDB -files. -

    public -
    A directory accessible to anyone who can access your filespace, because -its ACL grants the l (lookup) and r -(read) permissions to the system:anyuser -group. It is useful if you want to enable your users to make selected -information available to everyone, but do not want to grant foreign users -access to the contents of the usr directory which houses user home -directories ( and is also at this level). It is conventional to create -a subdirectory for each of your cell's users. -

    service -
    This directory contains files and subdirectories that help cells -coordinate resource sharing. For a list of the proposed standard files -and subdirectories to create, call or write to AFS Product Support. -

    As an example, files that other cells expect to find in this -directory's etc subdirectory can include the following: -

      -

    • CellServDB.export, a list of database server machines -for many cells -

    • CellServDB.local, a list of the cell's own database -server machines -

    • passwd, a copy of the local password file -(/etc/passwd or equivalent) kept on the local disk of the -cell's client machines -

    • group, a copy of the local groups file (/etc/group -or equivalent) kept on the local disk of the cell's client machines -
    -

    sys_type -
    A separate directory for storing the server and client binaries for each -system type you use in the cell. Configuration is simplest if you use -the system type names assigned in the AFS distribution, particularly if you -wish to use the @sys variable in pathnames (see Using the @sys Variable in Pathnames). The AFS Release Notes lists the -conventional name for each supported system type. -

    Within each such directory, create directories named bin, -etc, usr, and so on, to store the programs normally kept -in the /bin, /etc and /usr directories on a -local disk. Then create symbolic links from the local directories on -client machines into AFS; see Configuring the Local Disk. Even if you do not choose to use symbolic links in -this way, it can be convenient to have central copies of system binaries in -AFS. If binaries are accidentally removed from a machine, you can -recopy them onto the local disk from AFS rather than having to recover them -from tape -

    usr -
    This directory contains home directories for your local users. As -discussed in the previous entry for the public directory, it is -often practical to protect this directory so that only locally authenticated -users can access it. This keeps the contents of your user's home -directories as secure as possible. -

    If your cell is quite large, directory lookup can be slowed if you put all -home directories in a single usr directory. For suggestions -on distributing user home directories among multiple grouping directories, see -Grouping Home Directories. -

    wsadmin -
    This directory contains prototype, configuration and library files for use -with the package program. See Configuring Client Machines with the package Program. -
    - - - - -

    Creating Volumes to Simplify Administration

    -

    This section discusses how to create volumes in ways that -make administering your system easier. -

    At the top levels of your file tree (at least through the third level), -each directory generally corresponds to a separate volume. Some cells -also configure the subdirectories of some third level directories as separate -volumes. Common examples are the -/afs/cellname/common and -/afs/cellname/usr directories. -

    You do not have to create a separate volume for every directory level in a -tree, but the advantage is that each volume tends to be smaller and easier to -move for load balancing. The overhead for a mount point is no greater -than for a standard directory, nor does the volume structure itself require -much disk space. Most cells find that below the fourth level in the -tree, using a separate volume for each directory is no longer -efficient. For instance, while each user's home directory (at the -fourth level in the tree) corresponds to a separate volume, all of the -subdirectories in the home directory normally reside in the same -volume. -

    Keep in mind that only one volume can be mounted at a given directory -location in the tree. In contrast, a volume can be mounted at several -locations, though this is not recommended because it distorts the hierarchical -nature of the file tree, potentially causing confusion. - - - - - -

    Assigning Volume Names

    -

    You can name your volumes anything you choose, subject to a few -restrictions: -

      -

    • Read/write volume names can be up to 22 characters in length. The -maximum length for volume names is 31 characters, and there must be room to -add the .readonly extension on read-only volumes. -

    • Do not add the .readonly and .backup -extensions to volume names yourself, even if they are appropriate. The -Volume Server adds them automatically as it creates a read-only or backup -version of a volume. -

    • There must be volumes named root.afs and -root.cell, mounted respectively at the top (/afs) -level in the filespace and just below that level, at the cell's name (for -example, at /afs/abc.com in the ABC Corporation -cell). -

      Deviating from these names only creates confusion and extra work. -Changing the name of the root.afs volume, for instance, -means that you must use the -rootvol argument to the -afsd program on every client machine, to name the alternate -volume. -

      Similarly, changing the root.cell volume name prevents -users in foreign cells from accessing your filespace, if the mount point for -your cell in their filespace refers to the conventional -root.cell name. Of course, this is one way to make -your cell invisible to other cells. -

    -

    It is best to assign volume names that indicate the type of data they -contain, and to use similar names for volumes with similar contents. It -is also helpful if the volume name is similar to (or at least has elements in -common with) the name of the directory at which it is mounted. -Understanding the pattern then enables you accurately to guess what a volume -contains and where it is mounted. -

    Many cells find that the most effective volume naming scheme puts a common -prefix on the names of all related volumes. Table 1 describes the recommended prefixing scheme. -
    -

    Table 1. Suggested volume prefixes
    - - - - - - - - -
    Prefix -Contents -Example Name -Example Mount Point -
    common. -popular programs and files -common.etc -/afs/cellname/common/etc -
    src. -source code -src.afs -/afs/cellname/src/afs -
    proj. -project data -proj.portafs -/afs/cellname/proj/portafs -
    test. -testing or other temporary data -test.smith -/afs/cellname/usr/smith/test -
    user. -user home directory data -user.terry -/afs/cellname/usr/terry -
    sys_type. -programs compiled for an operating system type -rs_aix42.bin -/afs/cellname/rs_aix42/bin -
    -

    Table 2 is a more specific example for a cell's -rs_aix42 system volumes and directories: -
    -

    Table 2. Example volume-prefixing scheme
    - - - - - - - - - - - - - -
    Example Name -Example Mount Point -
    rs_aix42.bin -/afs/cellname/rs_aix42/bin/afs/cell/rs_aix42/bin -
    rs_aix42.etc -/afs/cellname/rs_aix42/etc -
    rs_aix42.usr -/afs/cellname/rs_aix42/usr -
    rs_aix42.usr.afsws -/afs/cellname/rs_aix42/usr/afsws -
    rs_aix42.usr.lib -/afs/cellname/rs_aix42/usr/lib -
    rs_aix42.usr.bin -/afs/cellname/rs_aix42/usr/bin -
    rs_aix42.usr.etc -/afs/cellname/rs_aix42/usr/etc -
    rs_aix42.usr.inc -/afs/cellname/rs_aix42/usr/inc -
    rs_aix42.usr.man -/afs/cellname/rs_aix42/usr/man -
    rs_aix42.usr.sys -/afs/cellname/rs_aix42/usr/sys -
    rs_aix42.usr.local -/afs/cellname/rs_aix42/usr/local -
    -

    There are several advantages to this scheme: -

      -

    • The volume name is similar to the mount point name in the -filespace. In all of the entries in Table 2, for example, the only difference between the -volume and mount point name is that the former uses periods as separators and -the latter uses slashes. Another advantage is that the volume name -indicates the contents, or at least suggests the directory on which to issue -the ls command to learn the contents. -

    • It makes it easy to manipulate groups of related volumes at one -time. In particular, the vos backupsys command's --prefix argument enables you to create a backup version of every -volume whose name starts with the same string of characters. Making a -backup version of each volume is one of the first steps in backing up a volume -with the AFS Backup System, and doing it for many volumes with one command -saves you a good deal of typing. For instructions for creating backup -volumes, see Creating Backup Volumes, For information on the AFS Backup System, see Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -

    • It makes it easy to group related volumes together on a partition. -Grouping related volumes together has several advantages of its own, discussed -in Grouping Related Volumes on a Partition. -
    - - -

    Grouping Related Volumes on a Partition

    -

    If your cell is large enough to make it practical, consider -grouping related volumes together on a partition. In general, you need -at least three file server machines for volume grouping to be -effective. Grouping has several advantages, which are most obvious when -the file server machine becomes inaccessible: -

      -

    • If you keep a hardcopy record of the volumes on a partition, you know -which volumes are unavailable. You can keep such a record without -grouping related volumes, but a list composed of unrelated volumes is much -harder to maintain. Note that the record must be on paper, because the -outage can prevent you from accessing an online copy or from issuing the -vos listvol command, which gives you the same information. -

    • The effect of an outage is more localized. For example, if all of -the binaries for a given system type are on one partition, then only users of -that system type are affected. If a partition houses binary volumes -from several system types, then an outage can affect more people, particularly -if the binaries that remain available are interdependent with those that are -not available. -
    -

    The advantages of grouping related volumes on a partition do not -necessarily extend to the grouping of all related volumes on one file server -machine. For instance, it is probably unwise in a cell with two file -server machines to put all system volumes on one machine and all user volumes -on the other. An outage of either machine probably affects -everyone. -

    Admittedly, the need to move volumes for load balancing purposes can limit -the practicality of grouping related volumes. You need to weigh the -complementary advantages case by case. - - - - -

    When to Replicate Volumes

    -

    As discussed in Replication, replication refers to making a copy, or -clone, of a read/write source volume and then placing the copy on one or more -additional file server machines. Replicating a volume can increase the -availability of the contents. If one file server machine housing the -volume becomes inaccessible, users can still access the copy of the volume -stored on a different machine. No one machine is likely to become -overburdened with requests for a popular file, either, because the file is -available from several machines. -

    However, replication is not appropriate for all cells. If a cell -does not have much disk space, replication can be unduly expensive, because -each clone not on the same partition as the read/write source takes up as much -disk space as its source volume did at the time the clone was made. -Also, if you have only one file server machine, replication uses up disk space -without increasing availability. -

    Replication is also not appropriate for volumes that change -frequently. You must issue the vos release command every -time you need to update a read-only volume to reflect changes in its -read/write source. -

    For both of these reasons, replication is appropriate only for popular -volumes whose contents do not change very often, such as system binaries and -other volumes mounted at the upper levels of your filespace. User -volumes usually exist only in a read/write version since they change so -often. -

    If you are replicating any volumes, you must replicate the -root.afs and root.cell volumes, preferably -at two or three sites each (even if your cell only has two or three file -server machines). The Cache Manager needs to pass through the -directories corresponding to the root.afs and -root.cell volumes as it interprets any pathname. The -unavailability of these volumes makes all other volumes unavailable too, even -if the file server machines storing the other volumes are still -functioning. -

    Another reason to replicate the root.afs volume is that -it can lessen the load on the File Server machine. The Cache Manager -has a bias to access a read-only version of the root.afs -volume if it is replicate, which puts the Cache Manager onto the -read-only path through the AFS filespace. While on the -read-only path, the Cache Manager attempts to access a read-only copy of -replicated volumes. The File Server needs to track only one callback -per Cache Manager for all of the data in a read-only volume, rather than the -one callback per file it must track for read/write volumes. Fewer -callbacks translate into a smaller load on the File Server. -

    If the root.afs volume is not replicated, the Cache -Manager follows a read/write path through the filespace, accessing the -read/write version of each volume. The File Server distributes and -tracks a separate callback for each file in a read/write volume, imposing a -greater load on it. -

    For more on read/write and read-only paths, see The Rules of Mount Point Traversal. -

    It also makes sense to replicate system binary volumes in many cases, as -well as the volume corresponding to the -/afs/cellname/usr directory and the volumes -corresponding to the /afs/cellname/common -directory and its subdirectories. -

    It is a good idea to place a replica on the same partition as the -read/write source. In this case, the read-only volume is a clone (like -a backup volume): it is a copy of the source volume's vnode -index, rather than a full copy of the volume contents. Only if the -read/write volume moves to another partition or changes substantially does the -read-only volume consume significant disk space. Read-only volumes kept -on other partitions always consume the full amount of disk space that the -read/write source consumed when the read-only volume was created. -

    The Default Quota and ACL on a New Volume

    -

    Every AFS volume has associated with it a quota that limits the amount -of disk space the volume is allowed to use. To set and change quota, -use the commands described in Setting and Displaying Volume Quota and Current Size. -

    By default, every new volume is assigned a space quota of 5000 KB blocks -unless you include the -maxquota argument to the vos -create command. Also by default, the ACL on the root directory of -every new volume grants all permissions to the members of the -system:administrators group. To learn how to change -these values when creating an account with individual commands, see To create one user account with individual commands. When using uss commands to create -accounts, you can specify alternate ACL and quota values in the template -file's V instruction; see Creating a Volume with the V Instruction. - - - - - -


    Configuring Server Machines

    -

    This section discusses some issues to consider when -configuring server machines, which store AFS data, transfer it to client -machines on request, and house the AFS administrative databases. To -learn about client machines, see Configuring Client Machines. -

    If your cell has more than one AFS server machine, you can configure them -to perform specialized functions. A machine can assume one or more of -the roles described in the following list. For more details, see The Four Roles for File Server Machines. -

      -

    • A simple file server machine runs only the processes that store -and deliver AFS files to client machines. You can run as many simple -file server machines as you need to satisfy your cell's performance and -disk space requirements. -

    • A database server machine runs the four database server -processes that maintain AFS's replicated administrative databases: -the Authentication, Backup, Protection, and Volume Location (VL) Server -processes. -

    • A binary distribution machine distributes the AFS server -binaries for its system type to all other server machines of that system -type. -

    • The single system control machine distributes common server -configuration files to all other server machines in the cell, in a cell that -runs the United States edition of AFS (cells that use the international -edition of AFS must not use the system control machine for this -purpose). The machine conventionally also serves as the time -synchronization source for the cell, adjusting its clock according to a time -source outside the cell. -
    -

    The AFS Quick Beginnings explains how to configure your -cell's first file server machine to assume all four roles. The -AFS Quick Beginnings chapter on installing additional server -machines also explains how to configure them to perform one or more -roles. - - - - -

    Replicating the AFS Administrative Databases

    -

    The AFS administrative databases are housed on database -server machines and store information that is crucial for correct cell -functioning. Both server processes and Cache Managers access the -information frequently: -

      -

    • Every time a Cache Manager fetches a file from a directory that it has not -previously accessed, it must look up the file's location in the Volume -Location Database (VLDB). -

    • Every time a user obtains an AFS token from the Authentication Server, the -server looks up the user's password in the Authentication -Database. -

    • The first time that a user accesses a volume housed on a specific file -server machine, the File Server contacts the Protection Server for a list of -the user's group memberships as recorded in the Protection -Database. -

    • Every time you back up a volume using the AFS Backup System, the Backup -Server creates records for it in the Backup Database. -
    -

    Maintaining your cell is simplest if the first machine has the lowest IP -address of any machine you plan to use as a database server machine. If -you later decide to use a machine with a lower IP address as a database server -machine, you must update the CellServDB file on all clients before -introducing the new machine. -

    If your cell has more than one server machine, it is best to run more than -one as a database server machine (but more than three are rarely -necessary). Replicating the administrative databases in this way yields -the same benefits as replicating volumes: increased availability and -reliability. If one database server machine or process stops -functioning, the information in the database is still available from -others. The load of requests for database information is spread across -multiple machines, preventing any one from becoming overloaded. -

    Unlike replicated volumes, however, replicated databases do change -frequently. Consistent system performance demands that all copies of -the database always be identical, so it is not acceptable to record changes in -only some of them. To synchronize the copies of a database, the -database server processes use AFS's distributed database technology, -Ubik. See Replicating the AFS Administrative Databases. -

    If your cell has only one file server machine, it must also serve as a -database server machine. If you cell has two file server machines, it -is not always advantageous to run both as database server machines. If -a server, process, or network failure interrupts communications between the -database server processes on the two machines, it can become impossible to -update the information in the database because neither of them can alone elect -itself as the synchronization site. - - -

    AFS Files on the Local Disk

    -

    It is generally simplest to store the binaries for all AFS -server processes in the /usr/afs/bin directory on every file server -machine, even if some processes do not actively run on the machine. -This makes it easier to reconfigure a machine to fill a new role. -

    For security reasons, the /usr/afs directory on a file server -machine and all of its subdirectories and files must be owned by the local -superuser root and have only the first w -(write) mode bit turned on. Some files even have only the -first r (read) mode bit turned on (for example, the -/usr/afs/etc/KeyFile file, which lists the AFS server encryption -keys). Each time the BOS Server starts, it checks that the mode bits on -certain files and directories match the expected values. For a list, -see the AFS Quick Beginnings section about protecting sensitive AFS -directories, or the discussion of the output from the bos status -command in To display the status of server processes and their BosConfig entries. -

    For a description of the contents of all AFS directories on a file server -machine's local disk, see Administering Server Machines. -

    Configuring Partitions to Store AFS Data

    -

    The partitions that house AFS volumes on a file server machine must be -mounted at directories named -

    /vicepindex -

    where index is one or two lowercase letters. By convention, -the first AFS partition created is mounted at the /vicepa -directory, the second at the /vicepb directory, and so on through -the /vicepz directory. The names then continue with -/vicepaa through /vicepaz, /vicepba through -/vicepbz, and so on, up to the maximum supported number of server -partitions, which is specified in the AFS Release Notes. -

    Each /vicepx directory must correspond to an entire -partition or logical volume, and must be a subdirectory of the root directory -( / ). It is not acceptable to configure part of (for example) the -/usr partition as an AFS server partition and mount it on a -directory called /usr/vicepa. -

    Also, do not store non-AFS files on AFS server partitions. The File -Server and Volume Server expect to have available all of the space on the -partition. Sharing space also creates competition between AFS and the -local UNIX file system for access to the partition, particularly if the UNIX -files are frequently used. - - - - - -

    Monitoring, Rebooting and Automatic Process Restarts

    -

    AFS provides several tools for monitoring the File Server, including -the scout and afsmonitor programs. You can -configure them to alert you when certain threshold values are exceeded, for -example when a server partition is more than 95% full. See Monitoring and Auditing AFS Performance. -

    Rebooting a file server machine requires shutting down the AFS processes -and so inevitably causes a service outage. Reboot file server machines -as infrequently as possible. For instructions, see Rebooting a Server Machine. -

    By default, the BOS Server on each file server machine stops and -immediately restarts all AFS server processes on the machine (including -itself) once a week, at 4:00 a.m. on Sunday. This -reduces the potential for the core leaks that can develop as any process runs -for an extended time. -

    The BOS Server also checks each morning at 5:00 a.m. -for any newly installed binary files in the /usr/afs/bin -directory. It compares the timestamp on each binary file to the time at -which the corresponding process last restarted. If the timestamp on the -binary is later, the BOS Server restarts the corresponding process to start -using it. -

    The default times are in the early morning hours when the outage that -results from restarting a process is likely to disturb the fewest number of -people. You can display the restart times for each machine with the -bos getrestart command, and set them with the bos -setrestart command. The latter command enables you to disable -automatic restarts entirely, by setting the time to never. -See Setting the BOS Server's Restart Times. - - -


    Configuring Client Machines

    -

    This section summarizes issues to consider as you install and -configure client machines in your cell. - - - -

    Configuring the Local Disk

    -

    You can often free up significant amounts of local disk space -on AFS client machines by storing standard UNIX files in AFS and creating -symbolic links to them from the local disk. The @sys -pathname variable can be useful in links to system-specific files; see Using the @sys Variable in Pathnames. -

    There are two types of files that must actually reside on the local -disk: boot sequence files needed before the afsd program is -invoked, and files that can be helpful during file server machine -outages. -

    During a reboot, AFS is inaccessible until the afsd program -executes and initializes the Cache Manager. (In the conventional -configuration, the AFS initialization file is included in the machine's -initialization sequence and invokes the afsd program.) Files -needed during reboot prior to that point must reside on the local disk. -They include the following, but this list is not necessarily -exhaustive. -

      -

    • Standard UNIX utilities including the following or their -equivalents: -
        -

      • Machine initialization files (stored in the /etc or -/sbin directory on many system types) -

      • The fstab file -

      • The mount command binary -

      • The umount command binary -
      -

    • All subdirectories and files in the /usr/vice directory, -including the following: -
        -

      • The /usr/vice/cache directory -

      • The /usr/vice/etc/afsd command binary -

      • The /usr/vice/etc/cacheinfo file -

      • The /usr/vice/etc/CellServDB file -

      • The /usr/vice/etc/ThisCell file -
      -

      For more information on these files, see Configuration and Cache-Related Files on the Local Disk. -

    -

    The other type of files and programs to retain on the local disk are those -you need when diagnosing and fixing problems caused by a file server outage, -because the outage can make inaccessible the copies stored in AFS. -Examples include the binaries for a text editor (such as ed or -vi) and for the fs and bos commands. -Store copies of AFS command binaries in the /usr/vice/etc directory -as well as including them in the /usr/afsws directory, which is -normally a link into AFS. Then place the /usr/afsws -directory before the /usr/vice/etc directory in users' -PATH environment variable definition. When AFS is -functioning normally, users access the copy in the /usr/afsws -directory, which is more likely to be current than a local copy. -

    You can automate the configuration of client machine local disks by using -the package program, which updates the contents of the local disk -to match a configuration file. See Configuring Client Machines with the package Program. - -

    Enabling Access to Foreign Cells

    -

    As detailed in Making Other Cells Visible in Your Cell, you enable the Cache Manager to access a cell's -AFS filespace by storing a list of the cell's database server machines in -the local /usr/vice/etc/CellServDB file. The Cache Manager -reads the list into kernel memory at reboot for faster retrieval. You -can change the list in kernel memory between reboots by using the fs -newcell command. It is often practical to store a central version -of the CellServDB file in AFS and use the package -program periodically to update each client's version with the source -copy. See Maintaining Knowledge of Database Server Machines. -

    Because each client machine maintains its own copy of the -CellServDB file, you can in theory enable access to different -foreign cells on different client machines. This is not usually -practical, however, especially if users do not always work on the same -machine. - - - -

    Using the @sys Variable in Pathnames

    -

    When creating symbolic links into AFS on the local disk, it -is often practical to use the @sys variable in pathnames. The -Cache Manager automatically substitutes the local machine's AFS system -name (CPU/operating system type) for the @sys variable. This -means you can place the same links on machines of various system types and -still have each machine access the binaries for its system type. For -example, the Cache Manager on a machine running AIX 4.2 converts -/afs/abc.com/@sys to -/afs/abc.com/rs_aix42, whereas a machine running Solaris 7 -converts it to /afs/abc.com/sun4x_57. -

    If you want to use the @sys variable, it is simplest to use the -conventional AFS system type names as specified in the AFS Release -Notes. The Cache Manager records the local machine's system -type name in kernel memory during initialization. If you do not use the -conventional names, you must use the fs sysname command to change -the value in kernel memory from its default just after Cache Manager -initialization, on every client machine of the relevant system type. -The fs sysname command also displays the current value; see Displaying and Setting the System Type Name. -

    In pathnames in the AFS filespace itself, use the @sys variable -carefully and sparingly, because it can lead to unexpected results. It -is generally best to restrict its use to only one level in the -filespace. The third level is a common choice, because that is where -many cells store the binaries for different machine types. -

    Multiple instances of the @sys variable in a pathname are -especially dangerous to people who must explicitly change directories (with -the cd command, for example) into directories that store binaries -for system types other than the machine on which they are working, such as -administrators or developers who maintain those directories. After -changing directories, it is recommended that such people verify they are in -the desired directory. -

    Setting Server Preferences

    -

    The Cache Manager stores a table of preferences for file server -machines in kernel memory. A preference rank pairs a file server -machine interface's IP address with an integer in the range from 1 to -65,534. When it needs to access a file, the Cache Manager compares the -ranks for the interfaces of all machines that house the file, and first -attempts to access the file via the interface with the best rank. As it -initializes, the Cache Manager sets default ranks that bias it to access files -via interfaces that are close to it in terms of network topology. You -can adjust the preference ranks to improve performance if you wish. -

    The Cache Manager also uses similar preferences for Volume Location (VL) -Server machines. Use the fs getserverprefs command to -display preference ranks and the fs setserverprefs command to set -them. See Maintaining Server Preference Ranks. - -


    Configuring AFS User Accounts

    -

    This section discusses some of the issues to consider when -configuring AFS user accounts. Because AFS is separate from the UNIX -file system, a user's AFS account is separate from her UNIX -account. -

    The preferred method for creating a user account is with the uss -suite of commands. With a single command, you can create all the -components of one or many accounts, after you have prepared a template file -that guides the account creation. See Creating and Deleting User Accounts with the uss Command Suite. -

    Alternatively, you can issue the individual commands that create each -component of an account. For instructions, along with instructions for -removing user accounts and changing user passwords, user volume quotas and -usernames, see Administering User Accounts. -

    When users leave your system, it is often good policy to remove their -accounts. Instructions appear in Deleting Individual Accounts with the uss delete Command and Removing a User Account. -

    An AFS user account consists of the following components, which are -described in greater detail in The Components of an AFS User Account. -

      -

    • A Protection Database entry -

    • An Authentication Database entry -

    • A volume -

    • A home directory at which the volume is mounted -

    • Ownership of the home directory and full permissions on its ACL -

    • An entry in the local password file (/etc/passwd or equivalent) -of each machine the user needs to log into -

    • Optionally, standard files and subdirectories that make the account more -useful -
    -

    By creating some components but not others, you can create accounts at -different levels of functionality, using either uss commands as -described in Creating and Deleting User Accounts with the uss Command Suite or individual commands as described in Administering User Accounts. The levels of functionality include -the following -

      -

    • An authentication-only account enables the user to obtain AFS -tokens and so to access protected AFS data and to issue privileged -commands. It consists only of entries in the Authentication and -Protection Database. This type of account is suitable for -administrative accounts and for users from foreign cells who need to access -protected data. Local users generally also need a volume and home -directory. -

    • A basic user account includes a volume for the user, in -addition to Authentication and Protection Database entries. The volume -is mounted in the AFS filespace as the user's home directory, and -provides a repository for the user's personal files. -

    • A full account adds configuration files for basic functions -such as logging in, printing, and mail delivery to a basic account, making it -more convenient and useful. For a discussion of some useful types of -configuration files, see Creating Standard Files in New AFS Accounts. -
    -

    If your users have UNIX user accounts that predate the introduction of AFS -in the cell, you possibly want to convert them into AFS accounts. There -are three main issues to consider: -

      -

    • Making UNIX and AFS UIDs match -

    • Setting the password field in the local password file appropriately -

    • Moving files from the UNIX file system into AFS -
    -

    For further discussion, see Converting Existing UNIX Accounts with uss or Converting Existing UNIX Accounts. - - - - - -

    Choosing Usernames and Naming Other Account Components

    -

    This section suggests schemes for choosing usernames, AFS -UIDs, user volume names and mount point names, and also outlines some -restrictions on your choices. -

    Usernames -

    AFS imposes very few restrictions on the form of usernames. It is -best to keep usernames short, both because many utilities and applications can -handle usernames of no more than eight characters and because by convention -many components of and AFS account incorporate the name. These include -the entries in the Protection and Authentication Databases, the volume, and -the mount point. Depending on your electronic mail delivery system, the -username can become part of the user's mailing address. The -username is also the string that the user types when logging in to a client -machine. -

    Some common choices for usernames are last names, first names, initials, or -a combination, with numbers sometimes added. It is also best to avoid -using the following characters, many of which have special meanings to the -command shell. -

      -

    • The comma ( , ) -

    • The colon ( : ), because AFS reserves it as a field -separator in protection group names; see The Two Types of User-Defined Groups -

    • The semicolon ( ; ) -

    • The "at-sign" ( @ ); this character is reserved for -Internet mailing addresses -

    • Spaces -

    • The newline character -

    • The period ( . ); it is conventional to use this -character only in the special username that an administrator adopts while -performing privileged tasks, such as pat.admin -
    -

    AFS UIDs and UNIX UIDs -

    AFS associates a unique identification number, the AFS UID, with -every username, recording the mapping in the user's Protection Database -entry. The AFS UID functions within AFS much as the UNIX UID does in -the local file system: the AFS server processes and the Cache Manager -use it internally to identify a user, rather than the username. -

    Every AFS user also must have a UNIX UID recorded in the local password -file (/etc/passwd or equivalent) of each client machine they log -onto. Both administration and a user's AFS access are simplest if -the AFS UID and UNIX UID match. One important consequence of matching -UIDs is that the owner reported by the ls -l command matches the -AFS username. -

    It is usually best to allow the Protection Server to allocate the AFS UID -as it creates the Protection Database entry. However, both the pts -createuser command and the uss commands that create user -accounts enable you to assign AFS UIDs explicitly. This is appropriate -in two cases: -

      -

    • You wish to group together the AFS UIDs of related users -

    • You are converting an existing UNIX account into an AFS account and want -to make the AFS UID match the existing UNIX UID -
    -

    After the Protection Server initializes for the first time on a cell's -first file server machine, it starts assigning AFS UIDs at a default -value. To change the default before creating any user accounts, or at -any time, use the pts setmax command to reset the max user -id counter. To display the counter, use the pts -listmax command. See Displaying and Setting the AFS UID and GID Counters. -

    AFS reserves one AFS UID, 32766, for the user anonymous. -The AFS server processes assign this identity and AFS UID to any user who does -not possess a token for the local cell. Do not assign this AFS UID to -any other user or hardcode its current value into any programs or a -file's owner field, because it is subject to change in future -releases. - - -

    User Volume Names -

    Like any volume name, a user volume's base (read/write) name cannot -exceed 22 characters in length or include the .readonly or -.backup extension. See Creating Volumes to Simplify Administration. By convention, user volume names have the format -user.username. Using the -user. prefix not only makes it easy to identify the -volume's contents, but also to create a backup version of all user -volumes by issuing a single vos backupsys command. - - -

    Mount Point Names -

    By convention, the mount point for a user's volume is named after the -username. Many cells follow the convention of mounting user volumes in -the /afs/cellname/usr directory, as discussed -in The Third Level. Very large cells sometimes find that mounting all -user volumes in the same directory slows directory lookup, however; for -suggested alternatives, see the following section. - - -

    Grouping Home Directories

    -

    Mounting user volumes in the -/afs/cellname/usr directory is an -AFS-appropriate variation on the standard UNIX practice of putting user home -directories under the /usr subdirectory. However, cells with -more than a few hundred users sometimes find that mounting all user volumes in -a single directory results in slow directory lookup. The solution is to -distribute user volume mount points into several directories; there are a -number of alternative methods to accomplish this. -

      -

    • Distribute user home directories into multiple directories that reflect -organizational divisions, such as academic or corporate departments. -For example, a company can create group directories called -usr/marketing, usr/research, -usr/finance. A good feature of this scheme is that knowing a -user's department is enough to find the user's home -directory. Also, it makes it easy to set the ACL to limit access to -members of the department only. A potential drawback arises if -departments are of sufficiently unequal size that users in large departments -experience slower lookup than users in small departments. This scheme -is also not appropriate in cells where users frequently change between -divisions. -

    • Distribute home directories into alphabetic subdirectories of the -usr directory (the usr/a subdirectory, the -usr/b subdirectory, and so on), based on the first letter of the -username. If the cell is very large, create subdirectories under each -letter that correspond to the second letter in the user name. This -scheme has the same advantages and disadvantages of a department-based -scheme. Anyone who knows the user's username can find the -user's home directory, but users with names that begin with popular -letters sometimes experience slower lookup. -

    • Distribute home directories randomly but evenly into more than one -grouping directory. One cell that uses this scheme has over twenty such -directories called the usr1 directory, the usr2 -directory, and so on. This scheme is especially appropriate in cells -where the other two schemes do not seem feasible. It eliminates the -potential problem of differences in lookup speed, because all directories are -about the same size. Its disadvantage is that there is no way to guess -which directory a given user's volume is mounted in, but a solution is to -create a symbolic link in the regular usr directory that references -the actual mount point. For example, if user smith's -volume is mounted at the /afs/bigcell.com/usr17/smith -directory, then the /afs/bigcell.com/usr/smith directory is -a symbolic link to the ../usr17/smith -directory. This way, if someone does not know which directory the user -smith is in, he or she can access it through the link called -usr/smith; people who do know the appropriate directory save -lookup time by specifying it. -
    -

    For instructions on how to implement the various schemes when using the -uss program to create user accounts, see Evenly Distributing User Home Directories with the G Instruction and Creating a Volume with the V Instruction. -

    Making a Backup Version of User Volumes Available

    -

    Mounting the backup version of a user's volume is a simple way to -enable users themselves to restore data they have accidentally removed or -deleted. It is conventional to mount the backup version at a -subdirectory of the user's home directory (called perhaps the -OldFiles subdirectory), but other schemes are possible. Once -per day you create a new backup version to capture the changes made that day, -overwriting the previous day's backup version with the new one. -Users can always retrieve the previous day's copy of a file without your -assistance, freeing you to deal with more pressing tasks. -

    Users sometimes want to delete the mount point to their backup volume, -because they erroneously believe that the backup volume's contents count -against their quota. Remind them that the backup volume is separate, so -the only space it uses in the user volume is the amount needed for the mount -point. -

    For further discussion of backup volumes, see Backing Up AFS Data and Creating Backup Volumes. - - - -

    Creating Standard Files in New AFS Accounts

    -

    From your experience as a UNIX administrator, you are -probably familiar with the use of login and shell initialization files (such -as the .login and .cshrc files) to make an -account easier to use. -

    It is often practical to add some AFS-specific directories to the -definition of the user's PATH environment variable, including -the following: -

      -

    • The path to a bin subdirectory in the user's home -directory for binaries the user has created (that is, -/afs/cellname/usr/ -username/bin) -

    • The /usr/afsws/bin path, which conventionally includes programs -like fs, klog, kpasswd, pts, -tokens, and unlog -

    • The /usr/afsws/etc path, if the user is an administrator; -it usually houses the AFS command suites that require privilege (the -backup, butc, kas, uss, -vos commands), the package program, and others -
    -

    If you are not using an AFS-modified login utility, it can be helpful to -users to invoke the klog command in their .login -file so that they obtain AFS tokens as part of logging in. In the -following example command sequence, the first line echoes the string -klog to the standard output stream, so that the user understands -the purpose of the Password: prompt that appears when the -second line is executed. The -setpag flag associates the new -tokens with a process authentication group (PAG), which is discussed further -in Identifying AFS Tokens by PAG. -

       echo -n "klog "
    -   klog -setpag
    -
    -

    The following sequence of commands has a similar effect, except that the -pagsh command forks a new shell with which the PAG and tokens are -associated. -

       pagsh
    -   echo -n "klog "
    -   klog
    -
    -

    If you use an AFS-modified login utility, this sequence is not necessary, -because such utilities both log a user in locally and obtain AFS -tokens. - - - - -


    Using AFS Protection Groups

    -

    AFS enables users to define their own groups of -other users or machines. The groups are placed on ACLs to grant the -same permissions to many users without listing each user individually. -For group creation instructions, see Administering the Protection Database. -

    Groups have AFS ID numbers, just as users do, but an AFS group ID (GID) is -a negative integer whereas a user's AFS UID is a positive integer. -By default, the Protection Server allocates a new group's AFS GID -automatically, but members of the system:administrators group -can assign a GID when issuing the pts creategroup command. -Before explicitly assigning a GID, it is best to verify that it is not already -in use. -

    A group cannot belong to another group, but it can own another group or -even itself as long as it (the owning group) has at least one member. -The current owner of a group can transfer ownership of the group to another -user or group, even without the new owner's permission. At that -point the former owner loses administrative control over the group. -

    By default, each user can create 20 groups. A system administrator -can increase or decrease this group creation quota with the pts -setfields command. -

    Each Protection Database entry (group or user) is protected by a set of -five privacy flagswhich limit who can administer the entry and what -they can do. The default privacy flags are fairly restrictive, -especially for user entries. See Setting the Privacy Flags on Database Entries. - - - - -

    The Three System Groups

    -

    As the Protection Server initializes for the first time on a -cell's first database server machine, it automatically creates three -group entries: the system:anyuser, -system:authuser, and system:administrators -groups. - -

    The first two system groups are unlike any other groups in the Protection -Database in that they do not have a stable membership: -

      -

    • The system:anyuser group includes everyone who can access -a cell's AFS filespace: users who have tokens for the local cell, -users who have logged in on a local AFS client machine but not obtained tokens -(such as the local superuser root), and users who have connected to -a local machine from outside the cell. Placing the -system:anyuser group on an ACL grants access to the widest -possible range of users. It is the only way to extend access to users -from foreign AFS cells that do not have local accounts. -

    • The system:authuser group includes everyone who has a -valid token obtained from the cell's AFS authentication service. -
    -

    Because the groups do not have a stable membership, the pts -membership command produces no output for them. Similarly, they -do not appear in the list of groups to which a user belongs. -

    The system:administrators group does have a stable -membership, consisting of the cell's privileged administrators. -Members of this group can issue any pts command, and are the only -ones who can issue several other restricted commands (such as the -chown command on AFS files). By default, they also -implicitly have the a (administer) and l -(lookup) permissions on every ACL in the filespace. For -information about changing this default, see Administering the system:administrators Group. -

    For a discussion of how to use system groups effectively on ACLs, see Using Groups on ACLs. -

    The Two Types of User-Defined Groups

    -

    All users can create regular groups. A -regular group name has two fields separated by a colon, the first of which -must indicate the group's ownership. The Protection Server refuses -to create or change the name of a group if the result does not accurately -indicate the ownership. -

    Members of the system:administrators group can create -prefix-less groups whose names do not have the first field that -indicates ownership. For suggestions on using the two types of groups -effectively, see Using Groups Effectively. - - -


    Login and Authentication in AFS

    -

    As explained in Differences in Authentication, AFS authentication is separate from UNIX -authentication because the two file systems are separate. The -separation has two practical implications: -

      -

    • To access AFS files, users must both log into the local file system and -authenticate with the AFS authentication service. (Logging into the -local file system is necessary because the only way to access the AFS -filespace is through a Cache Manager, which resides in the local -machine's kernel.) -

    • Passwords are stored in two separate places: in the Authentication -Database for AFS and in the each machine's local password file (the -/etc/passwd file or equivalent) for the local file system. -
    -

    When a user successfully authenticates, the AFS authentication service -passes a token to the user's Cache Manager. The token -is a small collection of data that certifies that the user has correctly -provided the password associated with a particular AFS identity. The -Cache Manager presents the token to AFS server processes along with service -requests, as proof that the user is genuine. To learn about the mutual -authentication procedure they use to establish identity, see A More Detailed Look at Mutual Authentication. -

    The Cache Manager stores tokens in the user's credential structure in -kernel memory. To distinguish one user's credential structure from -another's, the Cache Manager identifies each one either by the -user's UNIX UID or by a process authentication group -(PAG), which is an identification number guaranteed to be unique in -the cell. For further discussion, see Identifying AFS Tokens by PAG. - -

    A user can have only one token per cell in each separately identified -credential structure. To obtain a second token for the same cell, the -user must either log into a different machine or obtain another credential -structure with a different identifier than any existing credential structure, -which is most easily accomplished by issuing the pagsh command (see -Identifying AFS Tokens by PAG). In a single credential structure, a user can have -one token for each of many cells at the same time. As this implies, -authentication status on one machine or PAG is independent of authentication -status on another machine or PAG, which can be very useful to a user or system -administrator. -

    The AFS distribution includes library files that enable each system -type's login utility to authenticate users with AFS and log them into the -local file system in one step. If you do not configure an AFS-modified -login utility on a client machine, its users must issue the klog -command to authenticate with AFS after logging in. -
    Note:The AFS-modified libraries do not necessarily support all features available -in an operating system's proprietary login utility. In some cases, -it is not possible to support a utility at all. For more information -about the supported utilities in each AFS version, see the AFS Release -Notes. -
    - - - - - - - -

    Identifying AFS Tokens by PAG

    -

    As noted, the Cache Manager identifies user credential -structures either by UNIX UID or by PAG. Using a PAG is preferable -because it guaranteed to be unique: the Cache Manager allocates it based -on a counter that increments with each use. In contrast, multiple users -on a machine can share or assume the same UNIX UID, which creates potential -security problems. The following are two common such situations: -

      -

    • The local superuser root can always assume any other -user's UNIX UID simply by issuing the su command, without -providing the user's password. If the credential structure is -associated with the user's UNIX UID, then assuming the UID means -inheriting the AFS tokens. -

    • Two users working on different NFS client machines can have the same UNIX -UID in their respective local file systems. If they both access the -same NFS/AFS Translator machine, and the Cache Manager there identifies them -by their UNIX UID, they become indistinguishable. To eliminate this -problem, the Cache Manager on a translator machine automatically generates a -PAG for each user and uses it, rather than the UNIX UID, to tell users -apart. -
    -

    Yet another advantage of PAGs over UIDs is that processes spawned by the -user inherit the PAG and so share the token; thus they gain access to AFS -as the authenticated user. In many environments, for example, printer -and other daemons run under identities (such as the local superuser -root) that the AFS server processes recognize only as the -anonymous user. Unless PAGs are used, such daemons cannot -access files for which the system:anyuser group does not have -the necessary ACL permissions. -

    Once a user has a PAG, any new tokens the user obtains are associated with -the PAG. The PAG expires two hours after any associated tokens expire -or are discarded. If the user issues the klog command before -the PAG expires, the new token is associated with the existing PAG (the PAG is -said to be recycled in this case). -

    AFS-modified login utilities automatically generate a PAG, as described in -the following section. If you use a standard login utility, your users -must issue the pagsh command before the klog command, or -include the latter command's -setpag flag. For -instructions, see Using Two-Step Login and Authentication. -

    Users can also use either command at any time to create a new PAG. -The difference between the two commands is that the klog command -replaces the PAG associated with the current command shell and tokens. -The pagsh command initializes a new command shell before creating a -new PAG. If the user already had a PAG, any running processes or jobs -continue to use the tokens associated with the old PAG whereas any new jobs or -processes use the new PAG and its associated tokens. When you exit the -new shell (by pressing <Ctrl-d>, for example), you return to the -original PAG and shell. By default, the pagsh command -initializes a Bourne shell, but you can include the -c argument to -initialize a C shell (the /bin/csh program on many system types) or -Korn shell (the /bin/ksh program) instead. - -

    Using an AFS-modified login Utility

    -

    As previously mentioned, an AFS-modified login utility -simultaneously obtains an AFS token and logs the user into the local file -system. This section outlines the login and authentication process and -its interaction with the value in the password field of the local password -file. -

    An AFS-modified login utility performs a sequence of steps similar to the -following; details can vary for different operating systems: -

      -

    1. It checks the user's entry in the local password file (the -/etc/passwd file or equivalent). -

    2. If no entry exists, or if an asterisk ( * ) appears in the -entry's password field, the login attempt fails. If the entry -exists, the attempt proceeds to the next step. -

    3. The utility obtains a PAG. -

    4. The utility converts the password provided by the user into an -encryption key and encrypts a packet of data with the key. It sends the -packet to the AFS authentication service (the AFS Authentication Server in the -conventional configuration). -

    5. The authentication service decrypts the packet and, depending on the -success of the decryption, judges the password to be correct or -incorrect. (For more details, see A More Detailed Look at Mutual Authentication.) -
        -

      • If the authentication service judges the password incorrect, the user does -not receive an AFS token. The PAG is retained, ready to be associated -with any tokens obtained later. The attempt proceeds to Step 6. -

      • If the authentication service judges the password correct, it issues a -token to the user as proof of AFS authentication. The login utility -logs the user into the local UNIX file system. Some login utilities -echo the following banner to the screen to alert the user to authentication -with AFS. Step 6 is skipped. -
           AFS(R) version Login 
        -
        -
      -

    6. If no AFS token was granted in Step 4, the login utility attempts to log the user into the local -file system, by comparing the password provided to the local password -file. -
        -

      • If the password is incorrect or any value other than an encrypted -13-character string appears in the password field, the login attempt -fails. -

      • If the password is correct, the user is logged into the local file system -only. -
      -
    - - - -

    As indicated, when you use an AFS-modified login utility, the password -field in the local password file is no longer the primary gate for access to -your system. If the user provides the correct AFS password, then the -program never consults the local password file. However, you can still -use the password field to control access, in the following way: -

      -

    • To prevent both local login and AFS authentication, place an asterisk ( -* ) in the field. This is useful mainly in emergencies, when -you want to prevent a certain user from logging into the machine. -

    • To prevent login to the local file system if the user does not provide the -correct AFS password, place a character string of any length other than the -standard thirteen characters in the field. This is appropriate if you -want to permit only people with local AFS accounts to login on your -machines. A single X or other character is the most easily -recognizable way to do this. -

    • To enable a user to log into the local file system even after providing an -incorrect AFS password, record a standard UNIX encrypted password in the field -by issuing the standard UNIX password-setting command (passwd or -equivalent). -
    -

    Systems that use a Pluggable Authentication Module (PAM) for login and AFS -authentication do not necessarily consult the local password file at all, in -which case they do not use the password field to control authentication and -login attempts. Instead, instructions in the PAM configuration file (on -many system types, /etc/pam.conf) fill the same -function. See the instructions in the AFS Quick Beginnings -for installing AFS-modified login utilities. - -

    Using Two-Step Login and Authentication

    -

    In cells that do not use an AFS-modified login utility, users -must issue separate commands to login and authenticate, as detailed in the -AFS User Guide: -

      -

    1. They use the standard login program to login to the local file -system, providing the password listed in the local password file (the -/etc/passwd file or equivalent). -

    2. They must issue the klog command to authenticate with the AFS -authentication service, including its -setpag flag to associate the -new tokens with a process authentication group (PAG). -
    -

    As mentioned in Creating Standard Files in New AFS Accounts, you can invoke the klog -setpag command in a -user's .login file (or equivalent) so that the user -does not have to remember to issue the command after logging in. The -user still must type a password twice, once at the prompt generated by the -login utility and once at the klog command's prompt. -This implies that the two passwords can differ, but it is less confusing if -they do not. -

    Another effect of not using an AFS-modified login utility is that the AFS -servers recognize the standard login program as the -anonymous user. If the login program needs to -access any AFS files (such as the .login file in a -user's home directory), then the ACL that protects the file must include -an entry granting the l (lookup) and r -(read) permissions to the system:anyuser -group. -

    When you do not use an AFS-modified login utility, an actual (scrambled) -password must appear in the local password file for each user. Use the -/bin/passwd file to insert or change these passwords. It is -simpler if the password in the local password file matches the AFS password, -but it is not required. - - - - - - - - - - - - - - -

    Obtaining, Displaying, and Discarding Tokens

    -

    Once logged in, a user can obtain a token at any time with the -klog command. If a valid token already exists, the new one -overwrites it. If a PAG already exists, the new token is associated -with it. -

    By default, the klog command authenticates the issuer using the -identity currently logged in to the local file system. To authenticate -as a different identity, use the -principal argument. To -obtain a token for a foreign cell, use the -cell argument (it can -be combined with the -principal argument). See the AFS -User Guide and the entry for the klog command in the AFS -Administration Reference. -

    To discard either all tokens or the token for a particular cell, issue the -unlog command. The command affects only the tokens -associated with the current command shell. See the AFS User -Guideand the entry for the unlog command in the AFS -Administration Reference. -

    To display the tokens associated with the current command shell, issue the -tokens command. The following examples illustrate its output -in various situations. -

    If the issuer is not authenticated in any cell: -

       % tokens
    -   Tokens held by the Cache Manager:
    -          --End of list--
    -
    -

    The following shows the output for a user with AFS UID 1000 in the ABC -Corporation cell: -

       % tokens
    -   Tokens held by the Cache Manager: 
    -   
    -   User's (AFS ID 1000) tokens for afs@abc.com  [Expires Jun  2 10:00]
    -       --End of list--
    -
    -

    The following shows the output for a user who is authenticated in ABC -Corporation cell, the State University cell and the DEF Company cell. -The user has different AFS UIDs in the three cells. Tokens for the last -cell are expired: -

       % tokens
    -   Tokens held by the Cache Manager:
    -    
    -   User's (AFS ID 1000) tokens for afs@abc.com  [Expires Jun  2 10:00]
    -   User's (AFS ID 4286) tokens for afs@stateu.edu  [Expires Jun  3 1:34]
    -   User's (AFS ID 22) tokens for afs@def.com  [>>Expired<<]
    -       --End of list--
    -
    -

    The Kerberos version of the tokens command (the -tokens.krb command), also reports information on the -ticket-granting ticket, including the ticket's owner, the ticket-granting -service, and the expiration date, as in the following example. Also see -Support for Kerberos Authentication. -

       % tokens.krb
    -   Tokens held by the Cache Manager:
    -   User's (AFS ID 1000) tokens for afs@abc.com [Expires Jun  2 10:00]
    -   User smith's tokens for krbtgt.ABC.COM@abc.com [Expires Jun  2 10:00]
    -     --End of list--
    -
    -

    Setting Default Token Lifetimes for Users

    - -

    The maximum lifetime of a user token is the smallest of the ticket -lifetimes recorded in the following three Authentication Database -entries. The kas examine command reports the lifetime as -Max ticket lifetime. Administrators who have the -ADMIN flag on their Authentication Database entry can use the --lifetime argument to the kas setfields command to set -an entry's ticket lifetime. -

      -

    • The afs entry, which corresponds to the AFS server -processes. The default is 100 hours. -

    • The krbtgt.cellname entry, which corresponds to -the ticket-granting ticket used internally in generating the token. The -default is 720 hours (30 days). -

    • The entry for the user of the AFS-modified login utility or issuer of the -klog command. The default is 25 hours for user entries -created using the AFS 3.1 or later version of the Authentication -Server, and 100 hours for user entries created using the AFS 3.0 -version of the Authentication Server. A user can use the kas -examine command to display his or her own Authentication Database -entry. -
    -
    Note:An AFS-modified login utility always grants a token with a lifetime -calculated from the previously described three values. When issuing the -klog command, a user can request a lifetime shorter than the -default by using the -lifetime argument. For further -information, see the AFS User Guide and the klog -reference page in the AFS Administration Reference. -
    -

    Changing Passwords

    - - - - - -

    Regular AFS users can change their own passwords by using either the -kpasswd or kas setpassword command. The commands -prompt for the current password and then twice for the new password, to screen -out typing errors. -

    Administrators who have the ADMIN flag on their Authentication -Database entries can change any user's password, either by using the -kpasswd command (which requires knowing the current password) or -the kas setpassword command. -

    If your cell does not use an AFS-modified login utility, remember also to -change the local password, using the operating system's password-changing -command. For more instructions on changing passwords, see Changing AFS Passwords. -

    Imposing Restrictions on Passwords and Authentication Attempts

    -

    You can help to make your cell more secure by imposing restrictions on -user passwords and authentication attempts. To impose the restrictions -as you create an account, use the A instruction in the -uss template file as described in Increasing Account Security with the A Instruction. To set or change the values on an existing -account, use the kas setfields command as described in Improving Password and Authentication Security. - - - - - - -

    By default, AFS passwords never expire. Limiting password lifetime -can help improve security by decreasing the time the password is subject to -cracking attempts. You can choose an lifetime from 1 to 254 days after -the password was last changed. It automatically applies to each new -password as it is set. When the user changes passwords, you can also -insist that the new password is not similar to any of the 20 passwords -previously used. - - - - -

    Unscrupulous users can try to gain access to your AFS cell by guessing an -authorized user's password. To protect against this type of -attack, you can limit the number of times that a user can consecutively fail -to provide the correct password. When the limit is exceeded, the -authentication service refuses further authentication attempts for a specified -period of time (the lockout time). To reenable -authentication attempts before the lockout time expires, an administrator must -issue the kas unlock command. - - - - - - -

    In addition to settings on user's authentication accounts, you can -improve security by automatically checking the quality of new user -passwords. The kpasswd and kas setpassword -commands pass the proposed password to a program or script called -kpwvalid, if it exists. The kpwvalid performs -quality checks and returns a code to indicate whether the password is -acceptable. You can create your own program or modified the sample -program included in the AFS distribution. See the kpwvalid -reference page in the AFS Administration Reference. -

    There are several types of quality checks that can improve password -quality. -

      -

    • The password is a minimum length -

    • The password is not a word -

    • The password contains both numbers and letters -
    -

    Support for Kerberos Authentication

    - - - - - - - -

    If your site is using standard Kerberos authentication rather than the AFS -Authentication Server, use the modified versions of the klog, -pagsh, and tokens commands that support Kerberos -authentication. The binaries for the modified version of these commands -have the same name as the standard binaries with the addition of a -.krb extension. -

    Use either the Kerberos version or the standard command throughout the -cell; do not mix the two versions. AFS Product Support can provide -instructions on installing the Kerberos version of these four commands. -For information on the differences between the two versions of these commands, -see the AFS Administration Reference. -


    Security and Authorization in AFS

    -

    AFS incorporates several features to ensure that only -authorized users gain access to data. This section summarizes the most -important of them and suggests methods for improving security in your -cell. -

    Some Important Security Features

    - - -

    ACLs on Directories -

    Files in AFS are protected by the access control list (ACL) associated with -their parent directory. The ACL defines which users or groups can -access the data in the directory, and in what way. See Managing Access Control Lists. -

    Mutual Authentication Between Client and Server -

    When an AFS client and server process communicate, each requires the other -to prove its identity during mutual authentication, which involves the -exchange of encrypted information that only valid parties can decrypt and -respond to. For a detailed description of the mutual authentication -process, see A More Detailed Look at Mutual Authentication. -

    AFS server processes mutually authenticate both with one another and with -processes that represent human users. After mutual authentication is -complete, the server and client have established an authenticated connection, -across which they can communicate repeatedly without having to authenticate -again until the connection expires or one of the parties closes it. -Authenticated connections have varying lifetimes. -

    Tokens -

    In order to access AFS files, users must prove their identities to the AFS -authentication service by providing the correct AFS password. If the -password is correct, the authentication service sends the user a -token as evidence of authenticated status. See Login and Authentication in AFS. -

    Servers assign the user identity anonymous to users and -processes that do not have a valid token. The anonymous -identity has only the access granted to the system:anyuser -group on ACLs. -

    Authorization Checking -

    Mutual authentication establishes that two parties communicating with one -another are actually who they claim to be. For many functions, AFS -server processes also check that the client whose identity they have verified -is also authorized to make the request. Different requests require -different kinds of privilege. See Three Types of Privilege. -

    Encrypted Network Communications - - - -

    The AFS server processes encrypt particularly sensitive information before -sending it back to clients. Even if an unauthorized party is able to -eavesdrop on an authenticated connection, they cannot decipher encrypted data -without the proper key. -

    The following AFS commands encrypt data because they involve server -encryption keys and passwords: -

      -

    • The bos addkey command, which adds a server encryption key to -the /usr/afs/etc/KeyFile file -

    • The bos listkeys command, which lists the server encryption -keys from the /usr/afs/etc/KeyFile file -

    • The kpasswd command, which changes a password in the -Authentication Database -

    • Most commands in the kas command suite -
    -

    In addition, the United States edition of the Update Server encrypts -sensitive information (such as the contents of KeyFile) when -distributing it. Other commands in the bos suite and the -commands in the fs, pts and vos suites do not -encrypt data before transmitting it. -

    Three Types of Privilege

    -

    AFS uses three separate types of privilege for the reasons -discussed in The Reason for Separate Privileges. -

      -

    • Membership in the system:administrators group. -Members are entitled to issue any pts command and those -fs commands that set volume quota. By default, they also -implicitly have the a (administer) and l -(lookup) permissions on every ACL in the file tree even if the ACL -does not include an entry for them. -

    • The ADMIN flag on the Authentication Database entry. An -administrator with this flag can issue any kas command. -

    • Inclusion in the /usr/afs/etc/UserList file. An -administrator whose username appears in this file can issue any -bos, vos, or backup command (although some -backup commands require additional privilege as described in Granting Administrative Privilege to Backup Operators). -
    -

    Authorization Checking versus Authentication

    -

    AFS distinguishes between authentication and authorization -checking. Authentication refers to the process of proving -identity. Authorization checking refers to the process of -verifying that an authenticated identity is allowed to perform a certain -action. -

    AFS implements authentication at the level of connections. Each time -two parties establish a new connection, they mutually authenticate. In -general, each issue of an AFS command establishes a new connection between AFS -server process and client. -

    AFS implements authorization checking at the level of server -machines. If authorization checking is enabled on a server machine, -then all of the server processes running on it provide services only to -authorized users. If authorization checking is disabled on a server -machine, then all of the server processes perform any action for -anyone. Obviously, disabling authorization checking is an extreme -security exposure. For more information, see Managing Authentication and Authorization Requirements. -

    Improving Security in Your Cell

    - -

    You can improve the level of security in your cell by configuring user -accounts, server machines, and system administrator accounts in the indicated -way. -

    User Accounts -

      -

    • Use an AFS-modified login utility, or include the -setpag flag -to the klog command, to associate the credential structure that -houses tokens with a PAG rather than a UNIX UID. This prevents users -from inheriting someone else's tokens by assuming their UNIX -identity. For further discussion, see Identifying AFS Tokens by PAG. -

    • Encourage users to issue the unlog command to destroy their -tokens before logging out. This forestalls attempts to access tokens -left behind kernel memory. Consider including the unlog -command in every user's .logout file or -equivalent. -
    -

    Server Machines -

      -

    • Disable authorization checking only in emergencies or for very brief -periods of time. It is best to work at the console of the affected -machine during this time, to prevent anyone else from accessing the machine -through the keyboard. -

    • Change the AFS server encryption key on a frequent and regular -schedule. Make it difficult to guess (a long string including -nonalphabetic characters, for instance). Unlike user passwords, the -password from which the AFS key is derived can be longer than eight -characters, because it is never used during login. The kas -setpassword command accepts a password hundreds of characters -long. For instructions, see Managing Server Encryption Keys. -

    • As much as possible, limit the number of people who can login at a server -machine's console or remotely. Imposing this limit is an extra -security precaution rather than a necessity. The machine cannot serve -as an AFS client in this case. -

    • Particularly limit access to the local superuser root account -on a server machine. The local superuser root has free -access to important administrative subdirectories of the /usr/afs -directory, as described in AFS Files on the Local Disk. - -

    • As in any computing environment, server machines must be located in a -secured area. Any other security measures are effectively worthless if -unauthorized people can access the computer hardware. -
    -

    System Administrators -

      -

    • Limit the number of system administrators in your cell. Limit the -use of system administrator accounts on publicly accessible -workstations. Such machines are not secure, so unscrupulous users can -install programs that try to steal tokens or passwords. If -administrators must use publicly accessible workstations at times, they must -issue the unlog command before leaving the machine. -

    • Create an administrative account for each administrator separate from the -personal account, and assign AFS privileges only to the administrative -account. The administrators must authenticate to the administrative -accounts to perform duties that require privilege, which provides a useful -audit trail as well. -

    • Administrators must not leave a machine unattended while they have valid -tokens. Issue the unlog command before leaving. -

    • Use the -lifetime argument to the kas setfields -command to set the token lifetime for administrative accounts to a fairly -short amount of time. The default lifetime for AFS tokens is 25 hours, -but 30 or 60 minutes is possibly a more reasonable lifetime for administrative -tokens. The tokens for administrators who initiate AFS Backup System -operations must last somewhat longer, because it can take several hours to -complete some dump operations, depending on the speed of the tape device and -the network connecting it to the file server machines that house the volumes -is it accessing. -

    • Limit administrators' use of the telnet program. It -sends unencrypted passwords across the network. Similarly, limit use of -other remote programs such as rsh and rcp, which send -unencrypted tokens across the network. -
    - - - - -

    A More Detailed Look at Mutual Authentication

    -

    As in any file system, security is a prime concern in -AFS. A file system that makes file sharing easy is not useful if it -makes file sharing mandatory, so AFS incorporates several features that -prevent unauthorized users from accessing data. Security in a networked -environment is difficult because almost all procedures require transmission of -information across wires that almost anyone can tap into. Also, many -machines on networks are powerful enough that unscrupulous users can monitor -transactions or even intercept transmissions and fake the identity of one of -the participants. -

    The most effective precaution against eavesdropping and information theft -or fakery is for servers and clients to accept the claimed identity of the -other party only with sufficient proof. In other words, the nature of -the network forces all parties on the network to assume that the other party -in a transaction is not genuine until proven so. Mutual -authentication is the means through which parties prove their -genuineness. -

    Because the measures needed to prevent fakery must be quite sophisticated, -the implementation of mutual authentication procedures is complex. The -underlying concept is simple, however: parties prove their identities by -demonstrating knowledge of a shared secret. A shared secret -is a piece of information known only to the parties who are mutually -authenticating (they can sometimes learn it in the first place from a trusted -third party or some other source). The party who originates the -transaction presents the shared secret and refuses to accept the other party -as valid until it shows that it knows the secret too. -

    The most common form of shared secret in AFS transactions is the -encryption key, also referred to simply as a key. -The two parties use their shared key to encrypt the packets of information -they send and to decrypt the ones they receive. Encryption using keys -actually serves two related purposes. First, it protects messages as -they cross the network, preventing anyone who does not know the key from -eavesdropping. Second, ability to encrypt and decrypt messages -successfully indicates that the parties are using the key (it is their shared -secret). If they are using different keys, messages remain scrambled -and unintelligible after decryption. -

    The following sections describe AFS's mutual authentication procedures -in more detail. Feel free to skip these sections if you are not -interested in the mutual authentication process. -

    Simple Mutual Authentication

    -

    Simple mutual authentication involves only one encryption key and two -parties, generally a client and server. The client contacts the server -by sending a challenge message encrypted with a key known only to -the two of them. The server decrypts the message using its key, which -is the same as the client's if they really do share the same -secret. The server responds to the challenge and uses its key to -encrypt its response. The client uses its key to decrypt the -server's response, and if it is correct, then the client can be sure that -the server is genuine: only someone who knows the same key as the client -can decrypt the challenge and answer it correctly. On its side, the -server concludes that the client is genuine because the challenge message made -sense when the server decrypted it. -

    AFS uses simple mutual authentication to verify user identities during the -first part of the login procedure. In that case, the key is based on -the user's password. -

    Complex Mutual Authentication

    -

    Complex mutual authentication involves three encryption keys -and three parties. All secure AFS transactions (except the first part -of the login process) employ complex mutual authentication. - - - -

    When a client wishes to communicate with a server, it first contacts a -third party called a ticket-granter. The ticket-granter and -the client mutually authenticate using the simple procedure. When they -finish, the ticket-granter gives the client a server ticket (or -simply ticket) as proof that it (the ticket-granter) has -preverified the identity of the client. The ticket-granter encrypts the -ticket with the first of the three keys, called the server encryption -key because it is known only to the ticket-granter and the server the -client wants to contact. The client does not know this key. -

    The ticket-granter sends several other pieces of information along with the -ticket. They enable the client to use the ticket effectively despite -being unable to decrypt the ticket itself. Along with the ticket, the -items constitute a token: -

      - -

    • A session key, which is the second encryption key involved in -mutual authentication. The ticket-granter invents the session key at -random as the shared secret between client and server. For reasons -explained further below, the ticket-granter also puts a copy of the session -key inside the ticket. The client and server use the session key to -encrypt messages they send to one another during their transactions. -The ticket-granter invents a different session key for each connection between -a client and a server (there can be several transactions during a single -connection). -

    • The name of the server for which the ticket is valid (and so which server -encryption key encrypts the ticket itself). -

    • A ticket lifetime indicator. The default lifetime of AFS server -tickets is 100 hours. If the client wants to contact the server again -after the ticket expires, it must contact the ticket-granter to get a new -ticket. -
    -

    The ticket-granter seals the entire token with the third key involved in -complex mutual authentication--the key known only to it (the -ticket-granter) and the client. In some cases, this third key is -derived from the password of the human user whom the client represents. -

    Now that the client has a valid server ticket, it is ready to contact the -server. It sends the server two things: -

      -

    • The server ticket. This is encrypted with the server encryption -key. -

    • Its request message, encrypted with the session key. Encrypting the -message protects it as it crosses the network, since only the server/client -pair for whom the ticket-granter invented the session key know it. -
    -

    At this point, the server does not know the session key, because the -ticket-granter just created it. However, the ticket-granter put a copy -of the session key inside the ticket. The server uses the server -encryption key to decrypts the ticket and learns the session key. It -then uses the session key to decrypt the client's request message. -It generates a response and sends it to the client. It encrypts the -response with the session key to protect it as it crosses the network. -

    This step is the heart of mutual authentication between client and server, -because it proves to both parties that they know the same secret: -

      -

    • The server concludes that the client is authorized to make a request -because the request message makes sense when the server decrypts it using the -session key. If the client uses a different session key than the one -the server finds inside the ticket, then the request message remains -unintelligible even after decryption. The two copies of the session key -(the one inside the ticket and the one the client used) can only be the same -if they both came from the ticket-granter. The client cannot fake -knowledge of the session key because it cannot look inside the ticket, sealed -as it is with the server encryption key known only to the server and the -ticket-granter. The server trusts the ticket-granter to give tokens -only to clients with whom it (the ticket-granter) has authenticated, so the -server decides the client is legitimate. -

      (Note that there is no direct communication between the ticket-granter and -the server, even though their relationship is central to ticket-based mutual -authentication. They interact only indirectly, via the client's -possession of a ticket sealed with their shared secret.) -

    • The client concludes that the server is genuine and trusts the response it -gets back from the server, because the response makes sense after the client -decrypts it using the session key. This indicates that the server -encrypted the response with the same session key as the client knows. -The only way for the server to learn that matching session key is to decrypt -the ticket first. The server can only decrypt the ticket because it -shares the secret of the server encryption key with the ticket-granter. -The client trusts the ticket-granter to give out tickets only for legitimate -servers, so the client accepts a server that can decrypt the ticket as -genuine, and accepts its response. -
    -

    Backing Up AFS Data

    -

    AFS provides two related facilities that help the -administrator back up AFS data: backup volumes and the AFS Backup -System. -

    Backup Volumes

    -

    The first facility is the backup volume, which you create by cloning a -read/write volume. The backup volume is read-only and so preserves the -state of the read/write volume at the time the clone is made. -

    Backup volumes can ease administration if you mount them in the file system -and make their contents available to users. For example, it often makes -sense to mount the backup version of each user volume as a subdirectory of the -user's home directory. A conventional name for this mount point is -OldFiles. Create a new version of the backup volume (that -is, reclone the read/write) once a day to capture any changes that were made -since the previous backup. If a user accidentally removes or changes -data, the user can restore it from the backup volume, rather than having to -ask you to restore it. -

    The AFS User Guide does not mention backup volumes, so regular -users do not know about them if you decide not to use them. This -implies that if you do make backup versions of user volumes, you -need to tell your users about how the backup works and where you have mounted -it. -

    Users are often concerned that the data in a backup volume counts against -their volume quota and some of them even want to remove the -OldFiles mount point. It does not, because the backup volume -is a separate volume. The only amount of space it uses in the -user's volume is the amount needed for the mount point, which is about -the same as the amount needed for a standard directory element. -

    Backup volumes are discussed in detail in Creating Backup Volumes. -

    The AFS Backup System

    -

    Backup volumes can reduce restoration requests, but they reside on disk -and so do not protect data from loss due to hardware failure. Like any -file system, AFS is vulnerable to this sort of data loss. -

    To protect your cell's users from permanent loss of data, you are -strongly urged to back up your file system to tape on a regular and frequent -schedule. The AFS Backup System is available to ease the administration -and performance of backups. For detailed information about the AFS -Backup System, see Configuring the AFS Backup System and Backing Up and Restoring AFS Data. - - - - - - - - - - - - -


    Using UNIX Remote Services in the AFS Environment

    -

    The AFS distribution includes modified versions of several -standard UNIX commands, daemons and programs that provide remote services, -including the following: -

      -

    • The ftpd program -

    • The inetd daemon -

    • The rcp program -

    • The rlogind daemon -

    • The rsh command -
    -

    These modifications enable the commands to handle AFS authentication -information (tokens). This enables issuers to be recognized on the -remote machine as an authenticated AFS user. -

    Replacing the standard versions of these programs in your file tree with -the AFS-modified versions is optional. It is likely that AFS's -transparent access reduces the need for some of the programs anyway, -especially those involved in transferring files from machine to machine, like -the ftpd and rcp programs. -

    If you decide to use the AFS versions of these commands, be aware that -several of them are interdependent. For example, the passing of AFS -authentication information works correctly with the rcp command -only if you are using the AFS version of both the rcp and -inetd commands. -

    The conventional installation location for the modified remote commands are -the /usr/afsws/bin and /usr/afsws/etc -directories. To learn more about commands' functionality, see -their reference pages in the AFS Administration Reference. -


    Accessing AFS through NFS

    -

    Users of NFS client machines can access the AFS filespace by -mounting the /afs directory of an AFS client machine that is -running the NFS/AFS Translator. This is a particular -advantage in cells already running NFS who want to access AFS using client -machines for which AFS is not available. See Appendix A, Managing the NFS/AFS Translator. -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd008.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd008.htm deleted file mode 100755 index 5b05360ea..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd008.htm +++ /dev/null @@ -1,2712 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    - - -


    Administering Server Machines

    -

    This chapter describes how to administer an AFS server -machine. It describes the following configuration information and -administrative tasks: -

    -

    To learn how to install and configure a new server machine, see the -AFS Quick Beginnings. -

    To learn how to administer the server processes themselves, see Monitoring and Controlling Server Processes. -

    To learn how to administer volumes, see Managing Volumes. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - - - - - - -
    Install new binaries -bos install -
    Examine binary check-and-restart time -bos getrestart -
    Set binary check-and-restart time -bos setrestart -
    Examine compilation dates on binary files -bos getdate -
    Restart a process to use new binaries -bos restart -
    Revert to old version of binaries -bos uninstall -
    Remove obsolete .BAK and .OLD -versions -bos prune -
    List partitions on a file server machine -vos listpart -
    Shutdown AFS server processes -bos shutdown -
    List volumes on a partition -vos listvldb -
    Move read/write volumes -vos move -
    List a cell's database server machines -bos listhosts -
    Add a database server machine to server CellServDB file -bos addhost -
    Remove a database server machine from server CellServDB file -bos removehost -
    Set authorization checking requirements -bos setauth -
    Prevent authentication for bos, pts, and -vos commands -Include -noauth flag -
    Prevent authentication for kas commands -Include -noauth flag on some commands or issue -noauthentication while in interactive mode -
    Display all VLDB server entries -vos listaddrs -
    Remove a VLDB server entry -vos changeaddr -
    Reboot a server machine remotely -bos exec reboot_command -
    -


    Local Disk Files on a Server Machine

    -

    Several types of files must reside in the subdirectories of -the /usr/afs directory on an AFS server machine's local -disk. They include binaries, configuration files, the administrative -database files (on database server machines), log files, and volume header -files. -

    Note for Windows users: Some files described in this -document possibly do not exist on machines that run a Windows operating -system. Also, Windows uses a backslash -( \ ) rather than a forward slash -( / ) to separate the elements in a -pathname. - - - -

    Binaries in the /usr/afs/bin Directory

    -

    The /usr/afs/bin directory stores the AFS server -process and command suite binaries appropriate for the machine's system -(CPU and operating system) type. If a process has both a server portion -and a client portion (as with the Update Server) or if it has separate -components (as with the fs process), each component resides in a -separate file. -

    To ensure predictable system performance, all file server machines must run -the same AFS build version of a given process. To maintain consistency -easily, use the Update Server process to distribute binaries from a -binary distribution machine of each system type, as described -further in Binary Distribution Machines. -

    It is best to keep the binaries for all processes in the -/usr/afs/bin directory, even if you do not run the process actively -on the machine. It simplifies the process of reconfiguring machines -(for example, adding database server functionality to an existing file server -machine). Similarly, it is best to keep the command suite binaries in -the directory, even if you do not often issue commands while working on the -server machine. It enables you to issue commands during recovery from -server and machine outages. -

    The following lists the binary files in the /usr/afs/bin -directory that are directly related to the AFS server processes or command -suites. Other binaries (for example, for the klog command) -sometimes appear in this directory on a particular file server machine's -disk or in an AFS distribution. -

    - - -

    backup -
    The command suite for the AFS Backup System (the binary for the Backup -Server is buserver). - - -

    bos -
    The command suite for communicating with the Basic OverSeer (BOS) Server -(the binary for the BOS Server is bosserver). - - - - - - -

    bosserver -
    The binary for the Basic OverSeer (BOS) Server process. - - - - - - -

    buserver -
    The binary for the Backup Server process. - - - - - - -

    fileserver -
    The binary for the File Server component of the fs -process. - - -

    kas -
    The command suite for communicating with the Authentication Server (the -binary for the Authentication Server is kaserver). - - - - - - -

    kaserver -
    The binary for the Authentication Server process. - - - - - - -

    ntpd -
    The binary for the Network Time Protocol Daemon (NTPD). AFS -redistributes this binary and uses the runntp program to configure -and initialize the NTPD process. - - - -

    ntpdc -
    A debugging utility furnished with the ntpd program. - - -

    pts -
    The command suite for communicating with the Protection Server process -(the binary for the Protection Server is ptserver). - - - - - - -

    ptserver -
    The binary for the Protection Server process. - - - - -

    runntp -
    The binary for the program used to configure NTPD most appropriately for -use with AFS. - - - - - - -

    salvager -
    The binary for the Salvager component of the fs process. - - - - -

    udebug -
    The binary for a program that reports the status of AFS's distributed -database technology, Ubik. - - - - - - -

    upclient -
    The binary for the client portion of the Update Server process. - - - - -

    upserver -
    The binary for the server portion of the Update Server process. - - - - - - - -

    vlserver -
    The binary for the Volume Location (VL) Server process. - - - - - - -

    volserver -
    The binary for the Volume Server component of the fs -process. - - -

    vos -
    The command suite for communicating with the Volume and VL Server -processes (the binaries for the servers are volserver and -vlserver, respectively). -
    - - - - - -

    Common Configuration Files in the /usr/afs/etc Directory

    -

    The directory /usr/afs/etc on every file server -machine's local disk contains configuration files in ASCII and -machine-independent binary format. For predictable AFS performance -throughout a cell, all server machines must have the same version of each -configuration file: -

      - -

    • Cells that run the United States edition of AFS conventionally use the -Update Server to distribute a common version of each file from the cell's -system control machine to other server machines (for more on the system -control machine, see The System Control Machine). Run the Update Server's server portion on the -system control machine, and the client portion on all other server -machines. Update the files on the system control machine only, except -as directed by instructions for dealing with emergencies. -

    • Cells that run the international edition of AFS must not use the Update -Server to distribute the contents of the /usr/afs/etc -directory. Due to United States government regulations, the data -encryption routines that AFS uses to protect the files in this directory as -they cross the network are not available to the Update Server in the -international edition of AFS. You must instead update the files on each -server machine individually, taking extra care to issue exactly the same -bos command for each machine. The necessary data encryption -routines are available to the bos commands, so information is safe -as it crosses the network from the machine where the bos command is -issued to the server machines. -
    -

    Never directly edit any of the files in the /usr/afs/etc -directory, except as directed by instructions for dealing with -emergencies. In normal circumstances, use the appropriate -bos commands to change the files. The following list -includes pointers to instructions. -

    The files in this directory include: -

    - - -

    CellServDB -
    An ASCII file that names the cell's database server machines, which -run the Authentication, Backup, Protection, and VL Server processes. -You create the initial version of this file by issuing the bos -setcellname command while installing your cell's first server -machine. It is very important to update this file when you change the -identity of your cell's database server machines. -

    The server CellServDB file is not the same as the -CellServDB file stored in the /usr/vice/etc directory on -client machines. The client version lists the database server machines -for every AFS cell that you choose to make accessible from the client -machine. The server CellServDB file lists only the local -cell's database server machines, because server processes never contact -processes in other cells. -

    For instructions on maintaining this file, see Maintaining the Server CellServDB File. - - - -

    KeyFile -
    A machine-independent, binary-format file that lists the server encryption -keys the AFS server processes use to encrypt and decrypt tickets. The -information in this file is the basis for secure communication in the cell, -and so is extremely sensitive. The file is specially protected so that -only privileged users can read or change it. -

    For instructions on maintaining this file, see Managing Server Encryption Keys. - - -

    ThisCell -
    An ASCII file that consists of a single line defining the complete -Internet domain-style name of the cell (such as -abc.com). You create this file with the bos -setcellname command during the installation of your cell's first -file server machine, as instructed in the AFS Quick -Beginnings. -

    Note that changing this file is only one step in changing your cell's -name. For discussion, see Choosing a Cell Name. - - -

    UserList -
    An ASCII file that lists the usernames of the system administrators -authorized to issue privileged bos, vos, and -backup commands. For instructions on maintaining the file, -see Administering the UserList File. -
    - - - - -

    Local Configuration Files in the /usr/afs/local Directory

    -

    The directory /usr/afs/local contains -configuration files that are different for each file server machine in a -cell. Thus, they are not updated automatically from a central source -like the files in /usr/afs/bin and /usr/afs/etc -directories. The most important file is the BosConfig -file; it defines which server processes are to run on that -machine. -

    As with the common configuration files in /usr/afs/etc, you must -not edit these files directly. Use commands from the bos -command suite where appropriate; some files never need to be -altered. -

    The files in this directory include the following: -

    - - -

    BosConfig -
    This file lists the server processes to run on the server machine, by -defining which processes the BOS Server monitors and what it does if the -process fails. It also defines the times at which the BOS Server -automatically restarts processes for maintenance purposes. -

    As you create server processes during a file server machine's -installation, their entries are defined in this file automatically. The -AFS Quick Beginnings outlines the bos commands to -use. For a more complete description of the file, and instructions for -controlling process status by editing the file with commands from the -bos suite, see Monitoring and Controlling Server Processes. - - -

    NetInfo -
    This optional ASCII file lists one or more of the network interface -addresses on the server machine. If it exists when the File Server -initializes, the File Server uses it as the basis for the list of interfaces -that it registers in its Volume Location Database (VLDB) server entry. -See Managing Server IP Addresses and VLDB Server Entries. - - -

    NetRestrict -
    This optional ASCII file lists one or more network interface -addresses. If it exists when the File Server initializes, the File -Server removes the specified addresses from the list of interfaces that it -registers in its VLDB server entry. See Managing Server IP Addresses and VLDB Server Entries. - - -

    NoAuth -
    This zero-length file instructs all AFS server processes running on the -machine not to perform authorization checking. Thus, they perform any -action for any user, even anonymous. This very insecure -state is useful only in rare instances, mainly during the installation of the -machine. -

    The file is created automatically when you start the initial -bosserver process with the -noauth flag, or issue the -bos setauth command to turn off authentication requirements. -When you use the bos setauth command to turn on authentication, the -BOS Server removes this file. For more information, see Managing Authentication and Authorization Requirements. - - -

    SALVAGE.fs -
    This zero-length file controls how the BOS Server handles a crash of the -File Server component of the fs process. The BOS Server -creates this file each time it starts or restarts the fs -process. If the file is present when the File Server crashes, then the -BOS Server runs the Salvager before restarting the File Server and Volume -Server again. When the File Server exits normally, the BOS Server -removes the file so that the Salvager does not run. -

    Do not create or remove this file yourself; the BOS Server does so -automatically. If necessary, you can salvage a volume or partition by -using the bos salvage command; see Salvaging Volumes. - - -

    salvage.lock -
    This file guarantees that only one Salvager process runs on a file server -machine at a time (the single process can fork multiple subprocesses to -salvage multiple partitions in parallel). As the Salvager initiates -(when invoked by the BOS Server or by issue of the bos salvage -command), it creates this zero-length file and issues the flock -system call on it. It removes the file when it completes the salvage -operation. Because the Salvager must lock the file in order to run, -only one Salvager can run at a time. - - - - -

    sysid -
    This file records the network interface addresses that the File Server -(fileserver process) registers in its VLDB server entry. -When the Cache Manager requests volume location information, the Volume -Location (VL) Server provides all of the interfaces registered for each server -machine that houses the volume. This enables the Cache Manager to make -use of multiple addresses when accessing AFS data stored on a multihomed file -server machine. For further information, see Managing Server IP Addresses and VLDB Server Entries. -
    - - - - - - -

    Replicated Database Files in the /usr/afs/db Directory

    -

    The directory /usr/afs/db contains two types of -files pertaining to the four replicated databases in the cell--the -Authentication Database, Backup Database, Protection Database, and Volume -Location Database (VLDB): -

      -

    • A file that contains each database, with a .DB0 -extension. -

    • A log file for each database, with a .DBSYS1 -extension. The database server process logs each database operation in -this file before performing it. If the operation is interrupted, the -process consults this file to learn how to finish it. -
    -

    Each database server process (Authentication, Backup, Protection, or VL -Server) maintains its own database and log files. The database files -are in binary format, so you must always access or alter them using commands -from the kas suite (for the Authentication Database), -backup suite (for the Backup Database), pts suite (for -the Protection Database), or vos suite (for the VLDB). -

    If a cell runs more than one database server machine, each database server -process keeps its own copy of its database on its machine's hard -disk. However, it is important that all the copies of a given database -are the same. To synchronize them, the database server processes call -on AFS's distributed database technology, Ubik, as described in Replicating the AFS Administrative Databases. -

    The files listed here appear in this directory only on database server -machines. On non-database server machines, this directory is -empty. -

    - - -

    bdb.DB0 -
    The Backup Database file. - - -

    bdb.DBSYS1 -
    The Backup Database log file. - - -

    kaserver.DB0 -
    The Authentication Database file. - - -

    kaserver.DBSYS1 -
    The Authentication Database log file. - - -

    prdb.DB0 -
    The Protection Database file. - - -

    prdb.DBSYS1 -
    The Protection Database log file. - - -

    vldb.DB0 -
    The Volume Location Database file. - - -

    vldb.DBSYS1 -
    The Volume Location Database log file. -
    - - - - - - -

    Log Files in the /usr/afs/logs Directory

    -

    The /usr/afs/logs directory contains log files -from various server processes. The files detail interesting events that -occur during normal operations. For instance, the Volume Server can -record volume moves in the VolserLog file. Events are -recorded at completion, so the server processes do not use these files to -reconstruct failed operations unlike the ones in the /usr/afs/db -directory. -

    The information in log files can be very useful as you evaluate process -failures and other problems. For instance, if you receive a timeout -message when you try to access a volume, checking the FileLog file -possibly provides an explanation, showing that the File Server was unable to -attach the volume. To examine a log file remotely, use the bos -getlog command as described in Displaying Server Process Log Files. -

    This directory also contains the core image files generated if a process -being monitored by the BOS Server crashes. The BOS Server attempts to -add an extension to the standard core name to indicate which -process generated the core file (for example, naming a core file generated by -the Protection Server core.ptserver). The BOS Server -cannot always assign the correct extension if two processes fail at about the -same time, so it is not guaranteed to be correct. -

    The directory contains the following files: -

    - - -

    AuthLog -
    The Authentication Server's log file. - - -

    BackupLog -
    The Backup Server's log file. - - -

    BosLog -
    The BOS Server's log file. - - -

    FileLog -
    The File Server's log file. - - -

    SalvageLog -
    The Salvager's log file. - - -

    VLLog -
    The Volume Location (VL) Server's log file. - - -

    VolserLog -
    The Volume Server's log file. -

    core.process -
    If present, a core image file produced as an AFS server process on the -machine crashed (probably the process named by process). -
    -
    Note:To prevent log files from growing unmanageably large, restart the server -processes periodically, particularly the database server processes. To -avoid restarting the processes, use the UNIX rm command to remove -the file as the process runs; it re-creates it automatically. -
    - - - - - -

    Volume Headers on Server Partitions

    -

    A partition that houses AFS volumes must be mounted at a -subdirectory of the machine's root ( / ) directory (not, for instance -under the /usr directory). The file server machine's -file system registry file (/etc/fstab or equivalent) must correctly -map the directory name and the partition's device name. The -directory name is of the form /vicepindex, where each -index is one or two lowercase letters. By convention, the -first AFS partition on a machine is mounted at /vicepa, the second -at /vicepb, and so on. If there are more than 26 partitions, -continue with /vicepaa, /vicepab and so on. The -AFS Release Notes specifies the number of supported partitions per -server machine. -

    Do not store non-AFS files on AFS partitions. The File Server and -Volume Server expect to have available all of the space on the -partition. -

    The /vicep directories contain two types of files: -

    - - -

    Vvol_ID.vol -
    Each such file is a volume header. The vol_ID corresponds -to the volume ID number displayed in the output from the vos -examine, vos listvldb, and vos listvol -commands. - - -

    FORCESALVAGE -
    This zero-length file triggers the Salvager to salvage the entire -partition. The AFS-modified version of the fsck program -creates this file if it discovers corruption. -
    -
    Note:For most system types, it is important never to run the standard -fsck program provided with the operating system on an AFS file -server machine. It removes all AFS volume data from server partitions -because it does not recognize their format. -
    - - -

    The Four Roles for File Server Machines

    -

    In cells that have more than one server machine, not all -server machines have to perform exactly the same functions. The are -four possible roles a machine can assume, determined by which -server processes it is running. A machine can assume more than one role -by running all of the relevant processes. The following list summarizes -the four roles, which are described more completely in subsequent -sections. -

      -

    • A simple file server machine runs only the processes that store -and deliver AFS files to client machines. You can run as many simple -file server machines as you need to satisfy your cell's performance and -disk space requirements. -

    • A database server machine runs the four database server -processes that maintain AFS's replicated administrative databases: -the Authentication, Backup, Protection, and Volume Location (VL) Server -processes. -

    • A binary distribution machine distributes the AFS server -binaries for its system type to all other server machines of that system -type. -

    • The single system control machine distributes common server -configuration files to all other server machines in the cell, in a cell that -runs the United States edition of AFS (cells that use the international -edition of AFS must not use the system control machine for this -purpose). The machine conventionally also serves as the time -synchronization source for the cell, adjusting its clock according to a time -source outside the cell. -
    -

    If a cell has a single server machine, it assumes the simple file server -and database server roles. The instructions in the AFS Quick -Beginnings also have you configure it as the system control machine and -binary distribution machine for its system type, but it does not actually -perform those functions until you install another server machine. -

    It is best to keep the binaries for all of the AFS server processes in the -/usr/afs/bin directory, even if not all processes are -running. You can then change which roles a machine assumes simply by -starting or stopping the processes that define the role. - - -

    Simple File Server Machines

    -

    A simple file server machine runs only the server -processes that store and deliver AFS files to client machines, monitor process -status, and pick up binaries and configuration files from the cell's -binary distribution and system control machines. -

    In general, only cells with more than three server machines need to run -simple file server machines. In cells with three or fewer machines, all -of them are usually database server machines (to benefit from replicating the -administrative databases); see Database Server Machines. -

    The following processes run on a simple file server machine: -

      -

    • The BOS Server (bosserver process) -

    • The fs process, which combines the File Server, Volume Server, -and Salvager processes so that they can coordinate their operations on the -data in volumes and avoid the inconsistencies that can result from multiple -simultaneous operations on the same data -

    • The NTP coordinator (runntp process), which helps keep the -machine's clock synchronized with the clocks on the other server machines -in the cell -

    • A client portion of the Update Server that picks up binary files from the -binary distribution machine of its AFS system type (the upclientbin -process) -

    • A client portion of the Update Server that picks up common configuration -files from the system control machine, in cells running the United States -edition of AFS (the upclientetc process) -
    - - - - - - -

    Database Server Machines

    -

    A database server machine runs the four processes -that maintain the AFS replicated administrative databases: the -Authentication Server, Backup Server, Protection Server, and Volume Location -(VL) Server, which maintain the Authentication Database, Backup Database, -Protection Database, and Volume Location Database (VLDB), respectively. -To review the functions of these server processes and their databases, see AFS Server Processes and the Cache Manager. -

    If a cell has more than one server machine, it is best to run more than one -database server machine, but more than three are rarely necessary. -Replicating the databases in this way yields the same benefits as replicating -volumes: increased availability and reliability of information. -If one database server machine or process goes down, the information in the -database is still available from others. The load of requests for -database information is spread across multiple machines, preventing any one -from becoming overloaded. -

    Unlike replicated volumes, however, replicated databases do change -frequently. Consistent system performance demands that all copies of -the database always be identical, so it is not possible to record changes in -only some of them. To synchronize the copies of a database, the -database server processes use AFS's distributed database technology, -Ubik. See Replicating the AFS Administrative Databases. -

    It is critical that the AFS server processes on every server machine in a -cell know which machines are the database server machines. The database -server processes in particular must maintain constant contact with their peers -in order to coordinate the copies of the database. The other server -processes often need information from the databases. Every file server -machine keeps a list of its cell's database server machines in its local -/usr/afs/etc/CellServDB file. Cells that use the States -edition of AFS can use the system control machine to distribute this file (see -The System Control Machine). -

    The following processes define a database server machine: -

      -

    • The Authentication Server (kaserver process) -

    • The Backup Server (buserver process) -

    • The Protection Server (ptserver process) -

    • The VL Server (vlserver process) -
    -

    Database server machines can also run the processes that define a simple -file server machine, as listed in Simple File Server Machines. One database server machine can act as the -cell's system control machine, and any database server machine can serve -as the binary distribution machine for its system type; see The System Control Machine and Binary Distribution Machines. - - - - -

    Binary Distribution Machines

    -

    A binary distribution machine stores and -distributes the binary files for the AFS processes and command suites to all -other server machines of its system type. Each file server machine -keeps its own copy of AFS server process binaries on its local disk, by -convention in the /usr/afs/bin directory. For consistent -system performance, however, all server machines must run the same version -(build level) of a process. For instructions for checking a -binary's build level, see Displaying A Binary File's Build Level. The easiest way to keep the binaries -consistent is to have a binary distribution machine of each system type -distribute them to its system-type peers. -

    The process that defines a binary distribution machine is the server -portion of the Update Server (upserver process). The client -portion of the Update Server (upclientbin process) runs on the -other server machines of that system type and references the binary -distribution machine. -

    Binary distribution machines usually also run the processes that define a -simple file server machine, as listed in Simple File Server Machines. One binary distribution machine can act as the -cell's system control machine, and any binary distribution machine can -serve as a database server machine; see The System Control Machine and Database Server Machines. - - - -

    The System Control Machine

    -

    In cells that run the United States edition of AFS, the -system control machine stores and distributes system configuration -files shared by all of the server machines in the cell. Each file -server machine keeps its own copy of the configuration files on its local -disk, by convention in the /usr/afs/etc directory. For -consistent system performance, however, all server machines must use the same -files. The easiest way to keep the files consistent is to have the -system control machine distribute them. You make changes only to the -copy stored on the system control machine, as directed by the instructions in -this document. The United States edition of AFS is available to cells -in the United States and Canada and to selected institutions in other -countries, as determined by United States government regulations. -

    Cells that run the international version of AFS do not use the system -control machine to distribute system configuration files. Some of the -files contain information that is too sensitive to cross the network -unencrypted, and United States government regulations forbid the export of the -necessary encryption routines in the form that the Update Server uses. -You must instead update the configuration files on each file server machine -individually. The bos commands that you use to update the -files encrypt the information using an exportable form of the encryption -routines. -

    For a list of the configuration files stored in the /usr/afs/etc -directory, see Common Configuration Files in the /usr/afs/etc Directory. -

    The AFS Quick Beginnings configures a cell's first server -machine as the system control machine. If you wish, you can reassign -the role to a different machine that you install later, but you must then -change the client portion of the Update Server (upclientetc) -process running on all other server machines to refer to the new system -control machine. -

    The following processes define the system control machine: -

      - - -

    • The server portion of the Update Server (upserver) process, in -cells using the United States edition of AFS. The client portion of the -Update Server (upclientetc process) runs on the other server -machines and references the system control machine. -

    • The NTP coordinator (runntp process) which points to a time -source outside the cell, if the cell uses NTPD to synchronize its -clocks. The runntp process on other machines reference the -system control machine as their main time source. -
    -

    The system control machine can also run the processes that define a simple -file server machine, as listed in Simple File Server Machines. It can also server as a database server machine, and -by convention acts as the binary distribution machine for its system -type. A single upserver process can distribute both -configuration files and binaries. See Database Server Machines and Binary Distribution Machines. - - - - - - - -

    To locate database server machines

    -
      -

    1. Issue the bos listhosts command. -
         % bos listhosts <machine name>
      -
      -

      The machines listed in the output are the cell's database server -machines. For complete instructions and example output, see To display a cell's database server machines. -

    2. (Optional) Issue the bos status command to verify -that a machine listed in the output of the bos listhosts command is -actually running the processes that define it as a database server -machine. For complete instructions, see Displaying Process Status and Information from the BosConfig File. -
         % bos status <machine name> buserver kaserver ptserver vlserver
      -
      -

      If the specified machine is a database server machine, the output from the - bos status command includes the following lines: -

         Instance buserver, currently running normally.
      -   Instance kaserver, currently running normally.
      -   Instance ptserver, currently running normally.
      -   Instance vlserver, currently running normally.
      -
      -
    - - - -

    To locate the system control machine

    -
      -

    1. Issue the bos status command for any server machine. -Complete instructions appear in Displaying Process Status and Information from the BosConfig File. -
         % bos status <machine name> upserver upclientbin upclientetc -long
      -
      -

      The output you see depends on the machine you have contacted: a -simple file server machine, the system control machine, or a binary -distribution machine. See Interpreting the Output from the bos status Command. -

    - - - -

    To locate the binary distribution machine for a system type

    -
      -

    1. Issue the bos status command for a file server machine of the -system type you are checking (to determine a machine's system type, issue -the fs sysname or sys command as described in Displaying and Setting the System Type Name. Complete instructions for the bos status -command appear in Displaying Process Status and Information from the BosConfig File. -
         % bos status <machine name> upserver upclientbin upclientetc -long
      -
      -

      The output you see depends on the machine you have contacted: a -simple file server machine, the system control machine, or a binary -distribution machine. See Interpreting the Output from the bos status Command. -

    - - - -

    Interpreting the Output from the bos status Command

    -

    Interpreting the output of the bos status command -is most straightforward for a simple file server machine. There is no -upserver process, so the output includes the following -message: -

       bos: failed to get instance info for 'upserver' (no such entity)
    -
    -

    A simple file server machine runs the upclientbin process, so -the output includes a message like the following. It indicates that -fs7.abc.com is the binary distribution machine for -this system type. -

       Instance upclientbin, (type is simple) currently running normally.
    -   Process last started at Wed Mar 10  23:37:09 1999 (1 proc start)
    -   Command 1 is '/usr/afs/bin/upclient fs7.abc.com -t 60 /usr/afs/bin'
    -
    -

    If you run the United States edition of AFS, a simple file server machine -also runs the upclientetc process, so the output includes a message -like the following. It indicates that -fs1.abc.com is the system control machine. -

       Instance upclientetc, (type is simple) currently running normally.
    -   Process last started at Mon Mar 22  05:23:49 1999 (1 proc start)
    -   Command 1 is '/usr/afs/bin/upclient fs1.abc.com -t 60 /usr/afs/etc'
    -
    -

    The Output on the System Control Machine

    -

    If you run the United States edition of AFS and have issued -the bos status command for the system control machine, the output -includes an entry for the upserver process similar to the -following: -

       Instance upserver, (type is simple) currently running normally.
    -   Process last started at Mon Mar 22 05:23:54 1999 (1 proc start)
    -   Command 1 is '/usr/afs/bin/upserver'
    -
    -

    If you are using the default configuration recommended in the AFS -Quick Beginnings, the system control machine is also the binary -distribution machine for its system type, and a single upserver -process distributes both kinds of updates. In that case, the output -includes the following messages: -

       bos: failed to get instance info for 'upclientbin' (no such entity)
    -   bos: failed to get instance info for 'upclientetc' (no such entity)
    -
    -

    If the system control machine is not a binary distribution machine, the -output includes an error message for the upclientetc process, but a -complete a listing for the upclientbin process (in this case it -refers to the machine fs5.abc.com as the binary -distribution machine): -

       Instance upclientbin, (type is simple) currently running normally.
    -   Process last started at Mon Mar 22  05:23:49 1999 (1 proc start)
    -   Command 1 is '/usr/afs/bin/upclient fs5.abc.com -t 60 /usr/afs/bin'
    -   bos: failed to get instance info for 'upclientetc' (no such entity)
    -
    -

    The Output on a Binary Distribution Machine

    -

    If you have issued the bos status command for a -binary distribution machine, the output includes an entry for the -upserver process similar to the following and error message for the -upclientbin process: -

       Instance upserver, (type is simple) currently running normally.
    -   Process last started at Mon Apr 5 05:23:54 1999 (1 proc start)
    -   Command 1 is '/usr/afs/bin/upserver'
    -   bos: failed to get instance info for 'upclientbin' (no such entity)
    -
    -

    Unless this machine also happens to be the system control machine, a -message like the following references the system control machine (in this -case, fs3.abc.com): -

       Instance upclientetc, (type is simple) currently running normally.
    -   Process last started at Mon Apr 5 05:23:49 1999 (1 proc start)
    -   Command 1 is '/usr/afs/bin/upclient fs3.abc.com -t 60 /usr/afs/etc'
    -
    -

    Administering Database Server Machines

    -

    This section explains how to administer database server -machines. For installation instructions, see the AFS Quick -Beginnings. - - - - - - - - - - - -

    Replicating the AFS Administrative Databases

    -

    There are several benefits to replicating the AFS -administrative databases (the Authentication, Backup, Protection, and Volume -Location Databases), as discussed in Replicating the AFS Administrative Databases. For correct cell functioning, the copies of each -database must be identical at all times. To keep the databases -synchronized, AFS uses library of utilities called Ubik. -Each database server process runs an associated lightweight Ubik process, and -client-side programs call Ubik's client-side subroutines when they submit -requests to read and change the databases. -

    Ubik is designed to work with minimal administrator intervention, but there -are several configuration requirements, as detailed in Configuring the Cell for Proper Ubik Operation. The following brief overview of Ubik's -operation is helpful for understanding the requirements. For more -details, see How Ubik Operates Automatically. -

    Ubik is designed to distribute changes made in an AFS administrative -database to all copies as quickly as possible. Only one copy of the -database, the synchronization site, accepts change requests from -clients; the lightweight Ubik process running there is the Ubik -coordinator. To maintain maximum availability, there is a -separate Ubik coordinator for each database, and the synchronization site for -each of the four databases can be on a different machine. The -synchronization site for a database can also move from machine to machine in -response to process, machine, or network outages. -

    The other copies of a database, and the Ubik processes that maintain them, -are termed secondary. The secondary sites do not accept -database changes directly from client-side programs, but only from the -synchronization site. -

    After the Ubik coordinator records a change in its copy of a database, it -immediately sends the change to the secondary sites. During the brief -distribution period, clients cannot access any of the copies of the database, -even for reading. If the coordinator cannot reach a majority of the -secondary sites, it halts the distribution and informs the client that the -attempted change failed. -

    To avoid distribution failures, the Ubik processes maintain constant -contact by exchanging time-stamped messages. As long as a majority of -the secondary sites respond to the coordinator's messages, there is a -quorum of sites that are synchronized with the coordinator. -If a process, machine, or network outage breaks the quorum, the Ubik processes -attempt to elect a new coordinator in order to establish a new quorum among -the highest possible number of sites. See A Flexible Coordinator Boosts Availability. - - - -

    Configuring the Cell for Proper Ubik Operation

    -

    This section describes how to configure your cell to -maintain proper Ubik operation. -

      -

    • Run all four database server processes--Authentication Server, Backup -Server, Protection Server, and VL Server--on all database server -machines. -

      Both the client and server portions of Ubik expect that all the database -server machines listed in the CellServDB file are running all of -the database server processes. There is no mechanism for indicating -that only some database server processes are running on a machine. -

    • Maintain correct information in the /usr/afs/etc/CellServDB -file at all times. -

      Ubik consults the /usr/afs/etc/CellServDB file to determine the -sites with which to establish and maintain a quorum. Incorrect -information can result in unsynchronized databases or election of a -coordinator in each of several subgroups of machines, because the Ubik -processes on various machines do not agree on which machines need to -participate in the quorum. -

      If you run the United States version of AFS and use the Update Server, it -is simplest to maintain the /usr/afs/etc/CellServDB file on the -system control machine, which distributes its copy to all other server -machines. The AFS Quick Beginnings explains how to configure -the Update Server. If you run the international version of AFS, you -must update the file on each machine individually. -

      The only reason to alter the file is when configuring or decommissioning a -database server machine. Use the appropriate bos commands -rather than editing the file by hand. For instructions, see Maintaining the Server CellServDB File. The instructions in Monitoring and Controlling Server Processes for stopping and starting processes remind -you to alter the CellServDB file when appropriate, as do the -instructions in the AFS Quick Beginnings for installing or -decommissioning a database server machine. -

      (Client processes and the server processes that do not maintain databases -also rely on correct information in the CellServDB file for proper -operation, but their use of the information does not affect Ubik's -operation. See Maintaining the Server CellServDB File and Maintaining Knowledge of Database Server Machines.) - -

    • Keep the clocks synchronized on all machines in the cell, especially the -database server machines. -

      In the conventional configuration specified in the AFS Quick -Beginnings, you run the runntp process to supervise the local -Network Time Protocol Daemon (NTPD) on every AFS server machine. The -NTPD on the system control machine synchronizes its clock with a reliable -source outside the cell and broadcasts the time to the NTPDs on the other -server machines. You can choose to run a different time synchronization -protocol if you wish. -

      Keeping clocks synchronized is important because the Ubik processes at a -database's sites timestamp the messages which they exchange to maintain -constant contact. Timestamping the messages is necessary because in a -networked environment it is not safe to assume that a message reaches its -destination instantly. Ubik compares the timestamp on an incoming -message with the current time. If the difference is too great, it is -possible that an outage is preventing reliable communication between the Ubik -sites, which can possibly result in unsynchronized databases. Ubik -considers the message invalid, which can prompt it to attempt election of a -different coordinator. -

      Electing a new coordinator is appropriate if a timestamped message is -expired due to actual interruption of communication, but not if a message -appears expired only because the sender and recipient do not share the same -time. For detailed examples of how unsynchronized clocks can -destabilize Ubik operation, see How Ubik Uses Timestamped Messages. -

    - - - -

    How Ubik Operates Automatically

    -

    The following Ubik features help keep its maintenance -requirements to a minimum: -

      -

    • Ubik's server and client portions operate automatically. -

      Each database server process runs a lightweight process to call on the -server portion of the Ubik library. It is common to refer to this -lightweight process itself as Ubik. Because it is lightweight, the Ubik -process does not appear in process listings such as those generated by the -UNIX ps command. Client-side programs that need to read and -change the databases directly call the subroutines in the Ubik library's -client portion, rather than running a separate lightweight process. -Examples of such programs are the klog command and the commands in -the pts suite. -

    • Ubik tracks database version numbers. -

      As the coordinator records a change to a database, it increments the -database's version number. The version number makes it easy for -the coordinator to determine if a site has the most recent version or -not. The version number speeds the return to normal functioning after -election of a new coordinator or when communication is restored after an -outage, because it makes it easy to determine which site has the most current -database and which need to be updated. -

    • Ubik's use of timestamped messages guarantees that database copies -are always synchronized during normal operation. -

      Replicating a database to increase data availability is pointless if all -copies of the database are not the same. Inconsistent performance can -result if clients receive different information depending on which copy of the -database they access. As previously noted, Ubik sites constantly track -the status of their peers by exchanging timestamped messages. For a -detailed description, see How Ubik Uses Timestamped Messages. -

    • The ability to move the coordinator maximizes database -availability. -

      Suppose, for example, that in a cell with three database server machines a -network partition separates the two secondary sites from the -coordinator. The coordinator retires because it is no longer in contact -with a majority of the sites listed in the CellServDB file. -The two sites on the other side of the partition can elect a new coordinator -among themselves, and it can then accept database changes from clients. -If the coordinator cannot move in this way, the database has to be read-only -until the network partition is repaired. For a detailed description of -Ubik's election procedure, see A Flexible Coordinator Boosts Availability. -

    - - -

    How Ubik Uses Timestamped Messages
    -

    Ubik synchronizes the copies of a database by maintaining -constant contact between the synchronization site and the secondary -sites. The Ubik coordinator frequently sends a time-stamped -guarantee message to each of the secondary sites. When the -secondary site receives the message, it concludes that it is in contact with -the coordinator. It considers its copy of the database to be valid -until time T, which is usually 60 seconds from the time the -coordinator sent the message. In response, the secondary site returns a -vote message that acknowledges the coordinator as valid until a -certain time X, which is usually 120 seconds in the future. -

    The coordinator sends guarantee messages more frequently than every -T seconds, so that the expiration periods overlap. There is -no danger of expiration unless a network partition or other outage actually -interrupts communication. If the guarantee expires, the secondary -site's copy of the database it not necessarily current. -Nonetheless, the database server continues to service client requests. -It is considered better for overall cell functioning that a secondary site -remains accessible even if the information it is distributing is possibly out -of date. Most of the AFS administrative databases do not change that -frequently, in any case, and making a database inaccessible causes a timeout -for clients that happen to access that copy. -

    As previously mentioned, Ubik's use of timestamped messages makes it -vital to synchronize the clocks on database server machines. There are -two ways that skewed clocks can interrupt normal Ubik functioning, depending -on which clock is ahead of the others. -

    Suppose, for example, that the Ubik coordinator's clock is ahead of -the secondary sites: the coordinator's clock says -9:35:30, but the secondary clocks say 9:31:30. -The secondary sites send votes messages that acknowledge the coordinator as -valid until 9:33:30. This is two minutes in the future -according to the secondary clocks, but is already in the past from the -coordinator's perspective. The coordinator concludes that it no -longer has enough support to remain coordinator and forces election of a new -coordinator. Election takes about three minutes, during which time no -copy of the database accepts changes. -

    The opposite possibility is that a secondary site's clock -(14:50:00) is ahead of the coordinator's -(14:46:30). When the coordinator sends a guarantee message -good until 14:47:30), it has already expired according to the -secondary clock. Believing that it is out of contact with the -coordinator, the secondary site stops sending votes for the coordinator and -tries get itself elected as coordinator. This is appropriate if the -coordinator has actually failed, but is inappropriate when there is no actual -outage. -

    The attempt of a single secondary site to get elected as the new -coordinator usually does not affect the performance of the other sites. -As long as their clocks agree with the coordinator's, they ignore the -other secondary site's request for votes and continue voting for the -current coordinator. However, if enough of the secondary sites's -clocks get ahead of the coordinator's, they can force election of a new -coordinator even though the current one is actually working fine. - - - - - - - - - -

    A Flexible Coordinator Boosts Availability
    -

    Ubik uses timestamped messages to determine when coordinator -election is necessary, just as it does to keep the database copies -synchronized. As long as the coordinator receives vote messages from a -majority of the sites (it implicitly votes for itself), it is appropriate for -it to continue as coordinator because it is successfully distributing database -changes. A majority is defined as more than 50% of all database sites -when there are an odd number of sites; with an even number of sites, the -site with the lowest Internet address has an extra vote for breaking ties as -necessary.If the coordinator is not receiving sufficient votes, it -retires and the Ubik sites elect a new coordinator. This does not -happen spontaneously, but only when the coordinator really fails or stops -receiving a majority of the votes. The secondary sites have a built-in -bias to continue voting for an existing coordinator, which prevents undue -elections. -

    The election of the new coordinator is by majority vote. The Ubik -subprocesses have a bias to vote for the site with the lowest Internet -address, which helps it gather the necessary majority quicker than if all the -sites were competing to receive votes themselves. During the election -(which normally lasts less than three minutes), clients can read information -from the database, but cannot make any changes. -

    Ubik's election procedure makes it possible for each database server -process's coordinator to be on a different machine. For example, -if the Ubik coordinators for all four processes start out on machine A and the -Protection Server on machine A fails for some reason, then a different site -(say machine B) must be elected as the new Protection Database Ubik -coordinator. Machine B remains the coordinator for the Protection -Database even after the Protection Server on machine A is working -again. The failure of the Protection Server has no effect on the -Authentication, Backup, or VL Servers, so their coordinators remain on machine -A. -

    Backing Up and Restoring the Administrative Databases

    -

    The AFS administrative databases store information that is -critical for AFS operation in your cell. If a database becomes -corrupted due to a hardware failure or other problem on a database server -machine, it likely to be difficult and time-consuming to recreate all of the -information from scratch. To protect yourself against loss of data, -back up the administrative databases to a permanent media, such as tape, on a -regular basis. The recommended method is to use a standard local disk -backup utility such as the UNIX tar command. -

    When deciding how often to back up a database, consider the amount of data -that you are willing to recreate by hand if it becomes necessary to restore -the database from a backup copy. In most cells, the databases differ -quite a bit in how often and how much they change. Changes to the -Authentication Database are probably the least frequent, and consist mostly of -changed user passwords. Protection Database and VLDB changes are -probably more frequent, as users add or delete groups and change group -memberships, and as you and other administrators create or move -volumes. The number and frequency of changes is probably greatest in -the Backup Database, particularly if you perform backups every day. -

    The ease with which you can recapture lost changes also differs for the -different databases: -

      -

    • If regular users make a large proportion of the changes to the -Authentication Database and Protection Database in your cell, then recovering -them possibly requires a large amount of detective work and interviewing of -users, assuming that they can even remember what changes they made at what -time. -

    • Recovering lost changes to the VLDB is more straightforward, because you -can use the vos syncserv and vos syncvldb commands to -correct any discrepancies between the VLDB and the actual state of volumes on -server machines. Running these commands can be time-consuming, -however. -

    • The configuration information in the Backup Database (Tape Coordinator -port offsets, volume sets and entries, the dump hierarchy, and so on) probably -does not change that often, in which case it is not that hard to recover a few -recent changes. In contrast, there are likely to be a large number of -new dump records resulting from dump operations. You can recover these -records by using the -dbadd argument to the backup -scantape command, reading in information from the backup tapes -themselves. This can take a long time and require numerous tape -changes, however, depending on how much data you back up in your cell and how -you append dumps. Furthermore, the backup scantape command -is subject to several restrictions. The most basic is that it halts if -it finds that an existing dump record in the database has the same dump ID -number as a dump on the tape it is scanning. If you want to continue -with the scanning operation, you must locate and remove the existing record -from the database. For further discussion, see the backup -scantape command's reference page in the AFS Administration -Reference. -
    -

    These differences between the databases possibly suggest backing up the -database at different frequencies, ranging from every few days or weekly for -the Backup Database to every few weeks for the Authentication Database. -On the other hand, it is probably simpler from a logistical standpoint to back -them all up at the same time (and frequently), particularly if tape -consumption is not a major concern. Also, it is not generally necessary -to keep backup copies of the databases for a long time, so you can recycle the -tapes fairly frequently. - - -

    To back up the administrative databases

    -
      -

    1. Log in as the local superuser root on a database server machine -that is not the synchronization site. The machine with the highest IP -address is normally the best choice, since it is least likely to become the -synchronization site in an election. -

    2. Issue the bos shutdown command to shut down -the relevant server process on the local machine. For a complete -description of the command, see To stop processes temporarily. -

      For the -instance argument, specify one or more database server -process names (buserver for the Backup Server, kaserver -for the Authentication Server, ptserver for the Protection Server, -or vlserver for the Volume Location Server. Include the --localauth flag because you are logged in as the local superuser -root but do not necessarily have administrative tokens. -

         # bos shutdown <machine name> -instance <instances>+ -localauth [-wait]
      -
      -

    3. Use a local disk backup utility, such as the UNIX tar command, -to transfer one or more database files to tape. If the local database -server machine does not have a tape device attached, use a remote copy command -to transfer the file to a machine with a tape device, then use the -tar command there. -

      The following command sequence backs up the complete contents of the -/usr/afs/db directory -

         # cd /usr/afs/db
      -   # tar cvf  tape_device  .
      -
      -

      To back up individual database files, substitute their names for the period -in the preceding tar command: -

        -

      • bdb.DB0 for the Backup Database -

      • kaserver.DB0 for the Authentication Database -

      • prdb.DB0 for the Protection Database -

      • vldb.DB0 for the VLDB -
      -

    4. Issue the bos start command to restart the server processes on -the local machine. For a complete description of the command, see To start processes by changing their status flags to Run. Provide the same values for the -instance -argument as in Step 2, and the -localauth flag for the same -reason. -
         # bos start <machine name> -instance <server process name>+ -localauth
      -
      -
    - - -

    To restore an administrative database

    -
      -

    1. Log in as the local superuser root on each database server -machine in the cell. -

    2. Working on one of the machines, issue the bos -shutdown command once for each database server machine, to shut down the -relevant server process on all of them. For a complete description of -the command, see To stop processes temporarily. -

      For the -instance argument, specify one or more database server -process names (buserver for the Backup Server, kaserver -for the Authentication Server, ptserver for the Protection Server, -or vlserver for the Volume Location Server. Include the --localauth flag because you are logged in as the local superuser -root but do not necessarily have administrative tokens. -

         # bos shutdown <machine name> -instance <instances>+ -localauth [-wait]
      -
      -

    3. Remove the database from each database server machine, by issuing the -following commands on each one. -
         # cd /usr/afs/db
      -
      -

      For the Backup Database: -

         # rm bdb.DB0
      -   # rm bdb.DBSYS1
      -
      -

      For the Authentication Database: -

         # rm kaserver.DB0
      -   # rm kaserver.DBSYS1
      -
      -

      For the Protection Database: -

         # rm prdb.DB0
      -   # rm prdb.DBSYS1
      -
      -

      For the VLDB: -

         # rm vldb.DB0
      -   # rm vldb.DBSYS1
      -
      -

    4. Using the local disk backup utility that you used to back up the database, -copy the most recently backed-up version of it to the appropriate file on the -database server machine with the lowest IP address. The following is an -appropriate tar command if the synchronization site has a tape -device attached: -
         # cd /usr/afs/db
      -   # tar xvf tape_device  database_file
      -
      -

      where database_file is one of the following: -

        -

      • bdb.DB0 for the Backup Database -

      • kaserver.DB0 for the Authentication Database -

      • prdb.DB0 for the Protection Database -

      • vldb.DB0 for the VLDB -
      -

    5. Working on one of the machines, issue the bos start command to -restart the server process on each of the database server machines in -turn. Start with the machine with the lowest IP address, which becomes -the synchronization site for the Backup Database. Wait for it to -establish itself as the synchronization site before repeating the command to -restart the process on the other database server machines. For a -complete description of the command, see To start processes by changing their status flags to Run. Provide the same values for the -instance -argument as in Step 2, and the -localauth flag for the same -reason. -
         # bos start <machine name> -instance  <server process name>+  -localauth
      -
      -

    6. If the database has changed since you last backed it up, issue the -appropriate commands from the instructions in the indicated sections to -recreate the information in the restored database. If issuing -pts commands, you must first obtain administrative tokens. -The backup and vos commands accept the --localauth flag if you are logged in as the local superuser -root, so you do not need administrative tokens. The -Authentication Server always performs a separate authentication anyway, so you -only need to include the -admin argument if issuing kas -commands. - -
    - - - - - - -

    Installing Server Process Software

    -

    This section explains how to install new server process -binaries on file server machines, how to revert to a previous version if the -current version is not working properly, and how to install new disks to house -AFS volumes on a file server machine. -

    The most frequent reason to replace a server process's binaries is to -upgrade AFS to a new version. In general, installation instructions -accompany the updated software, but this chapter provides an additional -reference. -

    Each AFS server machine must store the server process binaries in a local -disk directory, called /usr/afs/bin by convention. For -predictable system performance, it is best that all server machines run the -same build level, or at least the same version, of the server software. -For instructions on checking AFS build level, see Displaying A Binary File's Build Level. -

    The Update Server makes it easy to distribute a consistent version of -software to all server machines. You designate one server machine of -each system type as the binary distribution machine by running the -server portion of the Update Server (upserver process) on -it. All other server machines of that system type run the client -portion of the Update Server (upclientbin process) to retrieve -updated software from the binary distribution machine. The AFS -Quick Beginnings explains how to install the appropriate -processes. For more on binary distribution machines, see Binary Distribution Machines. -

    When you use the Update Server, you install new binaries on binary -distribution machines only. If you install binaries directly on a -machine that is running the upclientbin process, they are -overwritten the next time the process compares the contents of the local -/usr/afs/bin directory to the contents on the system control -machine, by default within five minutes. -

    The following instructions explain how to use the appropriate commands from -the bos suite to install and uninstall server binaries. - - - - - -

    Installing New Binaries

    -

    An AFS server process does not automatically switch to a new -process binary file as soon as it is installed in the /usr/afs/bin -directory. The process continues to use the previous version of the -binary file until it (the process) next restarts. By default, the BOS -Server restarts processes for which there are new binary files every day at -5:00 a.m., as specified in the -/usr/afs/local/BosConfig file. To display or change this -binary restart time, use the bos getrestart and bos -setrestart commands, as described in Setting the BOS Server's Restart Times. -

    You can force the server machine to start using new server process binaries -immediately by issuing the bos restart command as described in the -following instructions. -

    You do not need to restart processes when you install new command suite -binaries. The new binary is invoked automatically the next time a -command from the suite is issued. - - - - - -

    When you use the bos install command, the BOS Server -automatically saves the current version of a binary file by adding a -.BAK extension to its name. It renames the current -.BAK version, if any, to the .OLD version, -if there is no .OLD version already. If there is a -current .OLD version, the current .BAK -version must be at least seven days old to replace it. -

    It is best to store AFS binaries in the /usr/afs/bin directory, -because that is the only directory the BOS Server automatically checks for new -binaries. You can, however, use the bos install -command's -dir argument to install non-AFS binaries into other -directories on a server machine's local disk. See the -command's reference page in the AFS Administration Reference -for further information. - - -

    To install new server binaries

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that the binaries are available in the source directory from which -you are installing them. If the machine is also an AFS client, you can -retrieve the binaries from a central directory in AFS. Otherwise, you -can obtain them directly from the AFS distribution media, from a local disk -directory where you previously installed them, or from a remote machine using -a transfer utility such as the ftp command. -

    3. Issue the bos install command for the binary -distribution machine. (If you have forgotten which machine is -performing that role, see To locate the binary distribution machine for a system type.) -
         % bos install <machine name> <files to install>+
      -
      -

      where -

      -

      i -
      Is the shortest acceptable abbreviation of install. -

      machine name -
      Names the binary distribution machine. -

      files to install -
      Names each binary file to install into the local /usr/afs/bin -directory. Partial pathnames are interpreted relative to the current -working directory. The last element in each pathname (the filename -itself) matches the name of the file it is replacing, such as -bosserver or volserver for server processes, -bos or vos for commands. -

      Each AFS server process other than the fs process uses a single -binary file. The fs process uses three binary files: -fileserver, volserver, and salvager. -Installing a new version of one component does not necessarily mean that you -need to replace all three. -

      -

    4. Repeat Step 3 for each binary distribution machine. -

    5. (Optional) If you want to restart processes to use the new -binaries immediately, wait until the upclientbin process retrieves -them from the binary distribution machine. You can verify the -timestamps on binary files by using the bos getdate command as -described in Displaying Binary Version Dates. When the binary files are available on each server -machine, issue the bos restart command, for which complete -instructions appear in Stopping and Immediately Restarting Processes. -

      If you are working on an AFS client machine, it is a wise precaution to -have a copy of the bos command suite binaries on the local disk -before restarting server processes. In the conventional configuration, -the /usr/afsws/bin directory that houses the bos command -binary on client machines is a symbolic link into AFS, which conserves local -disk space. However, restarting certain processes (particularly the -database server processes) can make the AFS filespace inaccessible, -particularly if a problem arises during the restart. Having a local -copy of the bos binary enables you to uninstall or reinstall -process binaries or restart processes even in this case. Use the -cp command to copy the bos command binary from the -/usr/afsws/bin directory to a local directory such as -/tmp. -

      Restarting a process causes a service outage. It is best to perform -the restart at times of low system usage if possible. -

         % bos restart <machine name> <instances>+
      -
      -
    - - - - - - - - -

    Reverting to the Previous Version of Binaries

    -

    In rare cases, installing a new binary can cause problems -serious enough to require reverting to the previous version. Just as -with installing binaries, consistent system performance requires reverting -every server machine back to the same version. Issue the bos -uninstall command described here on each binary distribution -machine. -

    When you use the bos uninstall command, the BOS Server discards -the current version of a binary file and promotes the .BAK -version of the file by removing the extension. It renames the current -.OLD version, if any, to .BAK. -

    If there is no current .BAK version, the bos -uninstall command operation fails and generates an error message. -If a .OLD version still exists, issue the mv -command to rename it to .BAK before reissuing the bos -uninstall command. -

    Just as when you install new binaries, the server processes do not start -using a reverted version immediately. Presumably you are reverting -because the current binaries do not work, so the following instructions have -you restart the relevant processes. - - -

    To revert to the previous version of binaries

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that the .BAK version of each relevant binary is -available in the /usr/afs/bin directory on each binary distribution -machine. If necessary, you can use the bos getdate command -as described in Displaying Binary Version Dates. If necessary, rename the .OLD -version to .BAK -

    3. Issue the bos uninstall command for a binary -distribution machine. (If you have forgotten which machine is -performing that role, see To locate the binary distribution machine for a system type.) -
         % bos uninstall <machine name> <files to uninstall>+
      -
      -

      where -

      -

      u -
      Is the shortest acceptable abbreviation of uninstall. -

      machine name -
      Names the binary distribution machine. -

      files to uninstall -
      Names each binary file in the /usr/afs/bin directory to replace -with its .BAK version. The file name alone is -sufficient, because the /usr/afs/bin directory is assumed. -
      -

    4. Repeat Step 3 for each binary distribution machine. -

    5. Wait until the upclientbin process on each server machine -retrieves the reverted from the binary distribution machine. You can -verify the timestamps on binary files by using the bos getdate -command as described in Displaying Binary Version Dates. When the binary files are available on each server -machine, issue the bos restart command, for which complete -instructions appear in Stopping and Immediately Restarting Processes. -

      If you are working on an AFS client machine, it is a wise precaution to -have a copy of the bos command suite binaries on the local disk -before restarting server processes. In the conventional configuration, -the /usr/afsws/bin directory that houses the bos command -binary on client machines is a symbolic link into AFS, which conserves local -disk space. However, restarting certain processes (particularly the -database server processes) can make the AFS filespace inaccessible, -particularly if a problem arises during the restart. Having a local -copy of the bos binary enables you to uninstall or reinstall -process binaries or restart processes even in this case. Use the -cp command to copy the bos command binary from the -/usr/afsws/bin directory to a local directory such as -/tmp. -

         % bos restart <machine name> <instances>+
      -
      -
    - - - - - - -

    Displaying Binary Version Dates

    -

    You can check the compilation dates for all three versions -of a binary file in the /usr/afs/bin directory--the current, -.BAK and .OLD versions. This is -useful for verifying that new binaries have been copied to a file server -machine from its binary distribution machine before restarting a server -process to use the new binaries. -

    To check dates on binaries in a directory other than -/usr/afs/bin, add the -dir argument. See the AFS -Administration Reference. - - -

    To display binary version dates

    -
      -

    1. Issue the bos getdate command. -
         % bos getdate <machine name> <files to check>+
      -
      -

      where -

      -

      getd -
      Is the shortest acceptable abbreviation of getdate. -

      machine name -
      Name the file server machine for which to display binary dates. -

      files to check -
      Names each binary file to display. -
      -
    - - - - - - - - -

    Removing Obsolete Binary Files

    -

    When processes with new binaries have been running without -problems for a number of days, it is generally safe to remove the -.BAK and .OLD versions from the -/usr/afs/bin directory, both to reduce clutter and to free space on -the file server machine's local disk. -

    You can use the bos prune command's flags to remove the -following types of files: -

      -

    • To remove files in the /usr/afs/bin directory with a -.BAK extension, use the -bak flag. -

    • To remove files in the /usr/afs/bin directory with a -.OLD extension, use the -old flag. -

    • To remove files in the /usr/afs/logs directory called -core, with any extension, use the -core flag. -

    • To remove all three types of files, use the -all flag. -
    - - -

    To remove obsolete binaries

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos prune command with one or more of its -flags. -
         % bos prune <machine name> [-bak] [-old] [-core] [-all]
      -
      -

      where -

      -

      p -
      Is the shortest acceptable abbreviation of prune. -

      machine name -
      Names the file server machine on which to remove obsolete files. -

      -bak -
      Removes all the files with a .BAK extension from the -/usr/afs/bin directory. Do not combine this flag with the --all flag. -

      -old -
      Removes all the files a .OLD extension from the -/usr/afs/bin directory. Do not combine this flag with the --all flag. -

      -core -
      Removes all core files from the /usr/afs/logs directory. -Do not combine this flag with the -all flag -

      -all -
      Combines the effect of the other three flags. Do not combine it -with the other three flags. -
      -
    -

    Displaying A Binary File's Build Level

    -

    For the most consistent performance on a server machine, and -cell-wide, it is best for all server processes to come from the same AFS -distribution. Every AFS binary includes an ASCII string that specifies -its version, or build level. To display it, use the -strings and grep commands, which are included in most -UNIX distributions. - - - - -

    To display an AFS binary's build level

    -
      -

    1. Change to the directory that houses the binary file . If you are -not sure where the binary resides, issue the which command. -
         % which binary_file
      -   /bin_dir_path/binary_file
      -   % cd bin_dir_path
      -
      -

    2. Issue the strings command to extract all ASCII strings from the -binary file. Pipe the output to the grep command to locate -the relevant line. -
         % strings ./binary_file | grep Base
      -
      -

      The output reports the AFS build level in a format like the -following: -

         @(#)Base configuration afsversion  build_level
      -
      -

      For example, the following string indicates the binary is from AFS -3.6 build 3.0: -

         @(#)Base configuration afs3.6 3.0
      -
      -
    - - - - - -

    Maintaining the Server CellServDB File

    -

    Every file server machine maintains a list of its home -cell's database server machines in the local disk file -/usr/afs/etc/CellServDB on its local disk. Both database -server processes and non-database server processes consult the file: -

      -

    • The database server processes (the Authentication, Backup, Protection, and -Volume Location Servers) maintain constant contact with their peers in order -to keep their copies of the replicated administrative databases -synchronized. -

      As detailed in Replicating the AFS Administrative Databases, the database server processes use the Ubik utility to -synchronize the information in the databases they maintain. The Ubik -coordinator at the synchronization site for each database maintains the single -read/write copy of the database and distributes changes to the secondary sites -as necessary. It must maintain contact with a majority of the secondary -sites to remain the coordinator, and consults the CellServDB file -to learn how many peers it has and on which machines they are running. -

      If the coordinator loses contact with the majority of its peers, they all -cooperate to elect a new coordinator by majority vote. During the -election, all of the Ubik processes consult the CellServDB file to -learn where to send their votes, and what number constitutes a -majority. -

    • The non-database server processes must know which machines are running the -database server processes in order to retrieve information from the -databases. For example, the first time that a user accesses an AFS -file, the File Server that houses it contacts the Protection Server to obtain -a list of the user's group memberships (the list is called a current -protection subgroup, or CPS). The File Server uses the CPS as it -determines if the access control list (ACL) protecting the file grants the -required permissions to the user (for more details, see About the Protection Database). -
    - -

    The consequences of missing or incorrect information in the -CellServDB file are as follows: -

      -

    • If the file does not list a machine, then it is effectively not a database -server machine even if the database server processes are running. The -Ubik coordinator does not send it database updates or include it in the count -that establishes a majority. It does not participate in Ubik elections, -and so refuses to distribute database information to any client machines that -happen to contact it (which they can do if their -/usr/vice/etc/CellServDB file lists it). Users of the client -machine must wait for a timeout before they can contact a correctly -functioning database server machine. -

    • If the file lists a machine that is not running the database server -processes, the consequences can be serious. The Ubik coordinator cannot -send it database updates, but includes it in the count that establishes a -majority. If valid secondary sites go down and stop sending their votes -to the coordinator, it can wrongly appear that the coordinator no longer has -the majority it needs. The resulting election of a new coordinator -causes a service outage during which information from the database becomes -unavailable. Furthermore, the lack of a vote from the incorrectly -listed site can disturb the election, if it makes the other sites believe that -a majority of sites are not voting for the new coordinator. -

      A more minor consequence is that non-database server processes attempt to -contact the database server processes on the machine. They experience a -timeout delay because the processes are not running. -

    -

    Note that the /usr/afs/etc/CellServDB file on a server machine -is not the same as the /usr/vice/etc/CellServDB file on client -machine. The client version includes entries for foreign cells as well -as the local cell. However, it is important to update both versions of -the file whenever you change your cell's database server machines. -A server machine that is also a client needs to have both files, and you need -to update them both. For more information on maintaining the client -version of the CellServDB file, see Maintaining Knowledge of Database Server Machines. - - - -

    Distributing the Server CellServDB File

    -

    To avoid the negative consequences of incorrect information -in the /usr/afs/etc/CellServDB file, you must update it on all of -your cell's server machines every time you add or remove a database -server machine. The AFS Quick Beginnings provides complete -instructions for installing or removing a database server machine and for -updating the CellServDB file in that context. This section -explains how to distribute the file to your server machines and how to make -other cells aware of the changes if you participate in the AFS global name -space. -

    If you use the United States edition of AFS, use the Update Server to -distribute the central copy of the server CellServDB file stored on -the cell's system control machine. If you use the international -edition of AFS, instead change the file on each server machine -individually. For further discussion of the system control machine and -why international cells must not use it for files in the -/usr/afs/etc directory, see The System Control Machine. For instructions on configuring -the Update Server when using the United States version of AFS, see the -AFS Quick Beginnings. -

    To avoid formatting errors that can cause errors, always use the bos -addhost and bos removehost commands, rather than editing the -file directly. You must also restart the database server processes -running on the machine, to initiate a coordinator election among the new set -of database server machines. This step is included in the instructions -that appear in To add a database server machine to the CellServDB file and To remove a database server machine from the CellServDB file. For instructions on displaying the -contents of the file, see To display a cell's database server machines. -

    If you make your cell accessible to foreign users as part of the AFS global -name space, you also need to inform other cells when you change your -cell's database server machines. The AFS Support group maintains a -CellServDB file that lists all cells that participate in the AFS -global name space, and can change your cell's entry at your -request. For further details, see Making Your Cell Visible to Others. -

    Another way to advertise your cell's database server machines is to -maintain a copy of the file at the conventional location in your AFS -filespace, -/afs/cell_name/service/etc/CellServDB.local. -For further discussion, see The Third Level. - - - - - - -

    To display a cell's database server machines

    -
      -

    1. Issue the bos listhosts command. If you have maintained -the file properly, the output is the same on every server machine, but the -machine name argument enables you to check various machines if you -wish. -
         % bos listhosts <machine name> [<cell name>]
      -
      -

      where -

      -

      listh -
      Is the shortest acceptable abbreviation of listhosts. -

      machine name -
      Specifies the server machine from which to display the -/usr/afs/etc/CellServDB file. -

      cell name -
      Specifies the complete Internet domain name of a foreign cell. You -must already know the name of at least one server machine in the cell, to -provide as the machine name argument. -
      -
    -

    The output lists the machines in the order they appear in the -CellServDB file on the specified server machine. It assigns -each one a Host index number, as in the following example. -There is no implied relationship between the index and a machine's IP -address, name, or role as Ubik coordinator or secondary site. -

       % bos listhosts fs1.abc.com
    -   Cell name is abc.com
    -       Host 1 is fs1.abc.com
    -       Host 2 is fs7.abc.com
    -       Host 3 is fs4.abc.com
    -
    -

    The output lists machines by name rather than IP address as long as the -naming service (such as the Domain Name Service or local host table) is -functioning properly. To display IP addresses, login to a server -machine as the local superuser root and use a text editor or -display command, such as the cat command, to view the -/usr/afs/etc/CellServDB file. - - - - - - - - - - - - -

    To add a database server machine to the CellServDB file

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos addhost command to add each new database server -machine to the CellServDB file. If you use the United States -edition of AFS, specify the system control machine as machine -name. (If you have forgotten which machine is the system control -machine, see The Output on the System Control Machine.) If you use the international edition of AFS, repeat -the command on each or your cell's server machines in turn by -substituting its name for machine name. -
         % bos addhost  <machine name>  <host name>+
      -
      -

      where -

      -

      addh -
      Is the shortest acceptable abbreviation of addhost. -

      machine name -
      Names the system control machine, if you are using the United States -edition of AFS. If you are using the international edition of AFS, it -names each of your server machines in turn. -

      host name -
      Specifies the fully qualified hostname of each database server machine to -add to the CellServDB file (for example: -fs4.abc.com). The BOS Server uses the -gethostbyname( ) routine to obtain each machine's IP -address and records both the name and address automatically. -
      -

    3. Restart the Authentication Server, Backup Server, Protection Server, and -VL Server on every database server machine, so that the new set of machines -participate in the election of a new Ubik coordinator. The instruction -uses the conventional names for the processes; make the appropriate -substitution if you use different process names. For complete syntax, -see Stopping and Immediately Restarting Processes. -

      Important: Repeat the following command in quick -succession on all of the database server machines. -

         % bos restart <machine name> buserver kaserver ptserver vlserver
      -
      -

    4. Edit the /usr/vice/etc/CellServDB file on each of your -cell's client machines. For instructions, see Maintaining Knowledge of Database Server Machines. -

    5. If you participate in the AFS global name space, please have one of your -cell's designated site contacts register the changes you have made with -the AFS Product Support group. -

      If you maintain a central copy of your cell's server -CellServDB file in the conventional location -(/afs/cell_name/service/etc/CellServDB.local), -edit the file to reflect the change. -

    - - - - - - - - - - - -

    To remove a database server machine from the CellServDB file

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos removehost command to remove each database server -machine from the CellServDB file. If you use the United -States edition of AFS, specify the system control machine as machine -name. (If you have forgotten which machine is the system control -machine, see The Output on the System Control Machine.) If you use the international edition of AFS, repeat -the command on each or your cell's server machines in turn by -substituting its name for machine name. -
         % bos removehost <machine name>  <host name>+
      -
      -

      where -

      -

      removeh -
      Is the shortest acceptable abbreviation of removehost. -

      machine name -
      Names the system control machine, if you are using the United States -edition of AFS. If you are using the international edition of AFS, it -names each of your server machines in turn. -

      host name -
      Specifies the fully qualified hostname of each database server machine to -remove from the CellServDB file (for example: -fs4.abc.com). -
      -

    3. Restart the Authentication Server, Backup Server, Protection Server, and -VL Server on every database server machine, so that the new set of machines -participate in the election of a new Ubik coordinator. The instruction -uses the conventional names for the processes; make the appropriate -substitution if you use different process names. For complete syntax, -see Stopping and Immediately Restarting Processes. -

      Important: Repeat the following command in quick -succession on all of the database server machines. -

         % bos restart <machine name> buserver kaserver ptserver vlserver
      -
      -

    4. Edit the /usr/vice/etc/CellServDB file on each of your -cell's client machines. For instructions, see Maintaining Knowledge of Database Server Machines. -

    5. If you participate in the AFS global name space, please have one of your -cell's designated site contacts register the changes you have made with -the AFS Product Support group. -

      If you maintain a central copy of your cell's server -CellServDB file in the conventional location -(/afs/cell_name/service/etc/CellServDB.local), -edit the file to reflect the change. -

    -

    Managing Authentication and Authorization Requirements

    -

    This section describes how the AFS server processes -guarantee that only properly authorized users perform privileged commands, by -checking authorization checking and mutually authenticating with their -clients. It explains how you can control authorization checking -requirements on a per-machine or per-cell basis, and how to bypass mutual -authentication when issuing commands. - - - - - - -

    Authentication versus Authorization

    -

    Many AFS commands are privileged in that the AFS -server process invoked by the command performs it only for a properly -authorized user. The server process performs the following two tests to -determine if someone is properly authorized: -

      -

    • In the authentication test, the server process mutually -authenticates with the command interpreter, Cache Manager, or other client -process that is acting on behalf of a user or application. The goal of -this test is to determine who is issuing the command. The server -process verifies that the issuer really is who he or she claims to be, by -examining the server ticket and other components of the issuer's -token. (Secondarily, it allows the client process to verify that the -server process is genuine.) If the issuer has no token or otherwise -fails the test, the server process assigns him or her the identity -anonymous, a completely unprivileged user. For a more -complete description of mutual authentication, see A More Detailed Look at Mutual Authentication. -

      Many individual commands enable you to bypass the authentication test by -assuming the anonymous identity without even attempting to mutually -authenticate. Note, however, that this is futile if the command is -privileged and the server process is still performing the authorization test, -because in that case the process refuses to execute privileged commands for -the anonymous user. -

    • In the authorization test, the server process determines if the -issuer is authorized to use the command by consulting a list of privileged -users. The goal of this test is to determine what the issuer is allowed -to do. Different server processes consult different lists of users, as -described in Managing Administrative Privilege. The server process refuses to execute any privileged -command for an unauthorized issuer. If a command has no privilege -requirements, the server process skips this step and executes and -immediately. -
      Note:Never place the anonymous user or the -system:anyuser group on a privilege list; it makes -authorization checking meaningless. -

      You can use the bos setauth command to control whether the -server processes on a server machine check for authorization. Other -server machines are not affected. Keep in mind that turning off -authorization checking is a grave security risk, because the server processes -on that machine perform any action for any user. -

      -
    - - - - -

    Controlling Authorization Checking on a Server Machine

    -

    Disabling authorization checking is a serious breach of -security because it means that the AFS server processes on a file server -machine performs any action for any user, even the anonymous -user. -

    The only time it is common to disable authorization checking is when -installing a new file server machine (see the AFS Quick -Beginnings). It is necessary then because it is not possible to -configure all of the necessary security mechanisms before performing other -actions that normally make use of them. For greatest security, work at -the console of the machine you are installing and enable authorization -checking as soon as possible. -

    During normal operation, the only reason to disable authorization checking -is if an error occurs with the server encryption keys, leaving the servers -unable to authenticate users properly. For instructions on handling -key-related emergencies, see Handling Server Encryption Key Emergencies. -

    You control authorization checking on each file server machine -separately; turning it on or off on one machine does not affect the -others. Because client machines generally choose a server process at -random, it is hard to predict what authorization checking conditions prevail -for a given command unless you make the requirement the same on all -machines. To turn authorization checking on or off for the entire cell, -you must repeat the appropriate command on every file server machine. -

    The server processes constantly monitor the directory -/usr/afs/local on their local disks to determine if they need to -check for authorization. If the file called NoAuth appears -in that directory, then the servers do not check for authorization. -When it is not present (the usual case), they perform authorization -checking. -

    Control the presence of the NoAuth file through the BOS -Server. When you disable authorization checking with the bos -setauth command (or, during installation, by putting the --noauth flag on the command that starts up the BOS Server), the BOS -Server creates the zero-length NoAuth file. When you -reenable authorization checking, the BOS Server removes the file. - - - - - -

    To disable authorization checking on a server machine

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos setauth command to disable authorization -checking. -
         % bos setauth <machine name> off
      -
      -

      where -

      -

      seta -
      Is the shortest acceptable abbreviation of setauth. -

      machine name -
      Specifies the file server machine on which server processes do not check -for authorization. -
      -
    - - - -

    To enable authorization checking on a server machine

    -
      -

    1. Reenable authorization checking. (No privilege is required because -the machine is not currently checking for authorization.) For detailed -syntax information, see the preceding section. -
         % bos setauth <machine name> on
      -
      -
    - - -

    Bypassing Mutual Authentication for an Individual Command

    -

    Several of the server processes allow any user (not just -system administrators) to disable mutual authentication when issuing a -command. The server process treats the issuer as the unauthenticated -user anonymous. -

    The facilities for preventing mutual authentication are provided for use in -emergencies (such as the key emergency discussed in Handling Server Encryption Key Emergencies). During normal circumstances, authorization checking -is turned on, making it useless to prevent authentication: the server -processes refuse to perform privileged commands for the user -anonymous. -

    It can be useful to prevent authentication when authorization checking is -turned off. The very act of trying to authenticate can cause problems -if the server cannot understand a particular encryption key, as is likely to -happen in a key emergency. - - - - - - - - -

    To bypass mutual authentication for bos, kas, pts, and vos commands

    -

    Provide the -noauth flag which is available on -many of the commands in the suites. To verify that a command accepts -the flag, issue the help command in its suite, or consult the -command's reference page in the AFS Administration Reference -(the reference page also specifies the shortest acceptable abbreviation for -the flag on each command). The suites' apropos and -help commands do not themselves accept the flag. -

    You can bypass mutual authentication for all kas commands issued -during an interactive session by including the -noauth flag on the -kas interactive command. If you have already entered -interactive mode with an authenticated identity, issue the (kas) -noauthentication command to assume the anonymous -identity. - -

    To bypass mutual authentication for fs commands

    -

    This is not possible, except by issuing the unlog command to -discard your tokens before issuing the fs command. -


    Adding or Removing Disks and Partitions

    -

    AFS makes it very easy to add storage space to your cell, -just by adding disks to existing file server machines. This section -explains how to install or remove a disk used to store AFS volumes. -(Another way to add storage space is to install additional server machines, as -instructed in the AFS Quick Beginnings.) -

    Both adding and removing a disk cause at least a brief file system outage, -because you must restart the fs process to have it recognize the -new set of server partitions. Some operating systems require that you -shut the machine off before adding or removing a disk, in which case you must -shut down all of the AFS server processes first. Otherwise, the -AFS-related aspects of adding or removing a disk are not complicated, so the -duration of the outage depends mostly on how long it takes to install or -remove the disk itself. -

    The following instructions for installing a new disk completely prepare it -to house AFS volumes. You can then use the vos create -command to create new volumes, or the vos move command to move -existing ones from other partitions. For instructions, see Creating Read/write Volumes and Moving Volumes. The instructions for removing a -disk are basically the reverse of the installation instructions, but include -extra steps that protect against data loss. -

    A server machines can house 256 AFS server partitions, each one mounted at -a directory with a name of the form /vicepindex, where -index is one or two lowercase letters. By convention, the -first partition on a machine is mounted at /vicepa, the second at -/vicepb, and so on to the twenty-sixth at -/vicepz. Additional partitions are mounted at -/vicepaa through /vicepaz and so on up to -/vicepiv. Using the letters consecutively is not required, -but is simpler. -

    Mount each /vicep directory directly under the local file -system's root directory ( / ), not as a subdirectory of any -other directory; for example, /usr/vicepa is not an acceptable -location. You must also map the directory to the partition's -device name in the file server machine's file systems registry file -(/etc/fstab or equivalent). -

    These instructions assume that the machine's AFS initialization file -includes the following command to restart the BOS Server after each -reboot. The BOS Server starts the other AFS server processes listed in -the local /usr/afs/local/BosConfig file. For information on -the bosserver command's optional arguments, see its reference -page in the AFS Administration Reference. -

       /usr/afs/bin/bosserver &
    -
    - - - - - - - -

    To add and mount a new disk to house AFS volumes

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Decide how many AFS partitions to divide the new disk into and the names -of the directories at which to mount them (the introduction to this section -describes the naming conventions). To display the names of the existing -server partitions on the machine, issue the vos listpart -command. Include the -localauth flag because you are logged -in as the local superuser root but do not necessarily have -administrative tokens. -
         # vos listpart <machine name> -localauth
      -
      -

      where -

      -

      listp -
      Is the shortest acceptable abbreviation of listpart. -

      machine name -
      Names the local file server machine. -

      -localauth -
      Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The bos command -interpreter presents it to the BOS Server during mutual authentication. -
      -

    3. Create each directory at which to mount a partition. -
         # mkdir /vicepx[x]
      -
      - - - - -

    4. Using a text editor, create an entry in the machine's file -systems registry file (/etc/fstab or equivalent) for each new disk -partition, mapping its device name to the directory you created in the -previous step. Refer to existing entries in the file to learn the -proper format, which varies for different operating systems. -

    5. If the operating system requires that you shut off the machine -to install a new disk, issue the bos shutdown command to shut down -all AFS server processes other than the BOS Server (it terminates safely when -you shut off the machine). Include the -localauth flag -because you are logged in as the local superuser root but do not -necessarily have administrative tokens. For a complete description of -the command, see To stop processes temporarily. -
         # bos shutdown <machine name> -localauth [-wait]
      -
      -

    6. If necessary, shut off the machine. Install and format -the new disk according to the instructions provided by the disk and operating -system vendors. If necessary, edit the disk's partition table to -reflect the changes you made to the files system registry file in step 4; consult the operating system documentation for -instructions. -

    7. If you shut off the machine down in step 6, turn it on. Otherwise, issue the bos -restart command to restart the fs process, forcing it to -recognize the new set of server partitions. Include the --localauth flag because you are logged in as the local superuser -root but do not necessarily have administrative tokens. For -complete instructions for the bos restart command, see Stopping and Immediately Restarting Processes. -
         # bos restart <machine name>  fs -localauth 
      -
      -

    8. Issue the bos status command to verify that all server -processes are running correctly. For more detailed instructions, see Displaying Process Status and Information from the BosConfig File. -
         # bos status <machine name>
      -
      -
    - - - - - -

    To unmount and remove a disk housing AFS volumes

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos listvol command to list the volumes housed on -each partition of each disk you are about to remove, in preparation for -removing them or moving them to other partitions. For detailed -instructions, see Displaying Volume Headers. -
         % vos listvol <machine name> [<partition name>] 
      -
      -

    3. Move any volume you wish to retain in the file system to another -partition. You can move only read/write volumes. For more -detailed instructions, and for instructions on moving read-only and backup -volumes, see Moving Volumes. -
         % vos move  <volume name or ID>  \
      -        <machine name on source> <partition name on source>  \
      -        <machine name on destination> <partition name on destination>
      -
      -

    4. (Optional) If there are any volumes you do not wish to retain, -back them up using the vos dump command or the AFS Backup -System. See Dumping and Restoring Volumes or Backing Up Data, respectively. -

    5. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      - - -

    6. Issue the umount command, repeating it for each partition on -the disk to be removed. -
         # cd /
      -   # umount /dev/<partition_block_device_name>
      -
      - -

    7. Using a text editor, remove or comment out each -partition's entry from the machine's file systems registry file -(/etc/fstab or equivalent). -

    8. Remove the /vicep directory associated with each -partition. -
         # rmdir /vicepxx
      -
      -

    9. If the operating system requires that you shut off the machine to remove a -disk, issue the bos shutdown command to shut down all AFS server -processes other than the BOS Server (it terminates safely when you shut off -the machine). Include the -localauth flag because you are -logged in as the local superuser root but do not necessarily have -administrative tokens. For a complete description of the command, see To stop processes temporarily. -
         # bos shutdown <machine name> -localauth [-wait]
      -
      -

    10. If necessary, shut off the machine. Remove the disk -according to the instructions provided by the disk and operating system -vendors. If necessary, edit the disk's partition table to reflect -the changes you made to the files system registry file in step 7; consult the operating system documentation for -instructions. -

    11. If you shut off the machine down in step 10, turn it on. Otherwise, issue the bos -restart command to restart the fs process, forcing it to -recognize the new set of server partitions. Include the --localauth flag because you are logged in as the local superuser -root but do not necessarily have administrative tokens. For -complete instructions for the bos restart command, see Stopping and Immediately Restarting Processes. -
         # bos restart <machine name>  fs -localauth 
      -
      -

    12. Issue the bos status command to verify that all server -processes are running correctly. For more detailed instructions, see Displaying Process Status and Information from the BosConfig File. -
         # bos status <machine name>
      -
      -
    - - - - - - - - - - - -

    Managing Server IP Addresses and VLDB Server Entries

    -

    The AFS support for multihomed file server machines is -largely automatic. The File Server process records the IP addresses of -its file server machine's network interfaces in the local -/usr/afs/local/sysid file and also registers them in a server -entry in the Volume Location Database (VLDB). The -sysid file and server entry are identified by the same unique -number, which creates an association between them. -

    When the Cache Manager requests volume location information, the Volume -Location (VL) Server provides all of the interfaces registered for each server -machine that houses the volume. This enables the Cache Manager to make -use of multiple addresses when accessing AFS data stored on a multihomed file -server machine. -

    If you wish, you can control which interfaces the File Server registers in -its VLDB server entry by creating two files in the local -/usr/afs/local directory: NetInfo and -NetRestrict. Each time the File Server restarts, it builds a -list of the local machine's interfaces by reading the NetInfo -file, if it exists. If you do not create the file, the File Server uses -the list of network interfaces configured with the operating system. It -then removes from the list any addresses that appear in the -NetRestrict file, if it exists. The File Server records the -resulting list in the sysid file and registers the interfaces in -the VLDB server entry that has the same unique identifier. -

    On database server machines, the NetInfo and -NetRestrict files also determine which interfaces the Ubik database -synchronization library uses when communicating with the database server -processes running on other database server machines. -

    There is a maximum number of IP addresses in each server entry, as -documented in the AFS Release Notes. If a multihomed file -server machine has more interfaces than the maximum, AFS simply ignores the -excess ones. It is probably appropriate for such machines to use the -NetInfo and NetRestrict files to control which -interfaces are registered. -

    If for some reason the sysid file no longer exists, the File -Server creates a new one with a new unique identifier. When the File -Server registers the contents of the new file, the Volume Location (VL) Server -normally recognizes automatically that the new file corresponds to an existing -server entry, and overwrites the existing server entry with the new file -contents and identifier. However, it is best not to remove the -sysid file if that can be avoided. -

    Similarly, it is important not to copy the sysid file from one -file server machine to another. If you commonly copy the contents of -the /usr/afs directory from an existing machine as part of -installing a new file server machine, be sure to remove the sysid -file from the /usr/afs/local directory on the new machine before -starting the File Server. -

    There are certain cases where the VL Server cannot determine whether it is -appropriate to overwrite an existing server entry with a new sysid -file's contents and identifier. It then refuses to allow the File -Server to register the interfaces, which prevents the File Server from -starting. This can happen if, for example, a new sysid file -includes two interfaces that currently are registered by themselves in -separate server entries. In such cases, error messages in the -/usr/afs/log/VLLog file on the VL Server machine and in the -/usr/afs/log/FileLog file on the file server machine indicate that -you need to use the vos changeaddr command to resolve the -problem. Contact the AFS Product Support group for instructions and -assistance. -

    Except in this type of rare error case, the only appropriate use of the -vos changeaddr command is to remove a VLDB server entry completely -when you remove a file server machine from service. The VLDB can -accommodate a maximum number of server entries, as specified in the AFS -Release Notes. Removing obsolete entries makes it possible to -allocate server entries for new file server machines as required. See -the instructions that follow. -

    Do not use the vos changeaddr command to change the list of -interfaces registered in a VLDB server entry. To change a file server -machine's IP addresses and server entry, see the instructions that -follow. - - - -

    To create or edit the server NetInfo file

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Using a text editor, open the /usr/afs/local/NetInfo -file. Place one IP address in dotted decimal format (for example, -192.12.107.33) on each line. The order -of entries is not significant. -

    3. If you want the File Server to start using the revised list immediately, -use the bos restart command to restart the fs -process. For instructions, see Stopping and Immediately Restarting Processes. -
    - - - -

    To create or edit the server NetRestrict file

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Using a text editor, open the /usr/afs/local/NetRestrict -file. Place one IP address in dotted decimal format on each -line. The order of the addresses is not significant. Use the -value 255 as a wildcard that represents all possible addresses in -that field. For example, the entry -192.12.105.255 indicates that the Cache -Manager does not register any of the addresses in the 192.12.105 -subnet. -

    3. If you want the File Server to start using the revised list immediately, -use the bos restart command to restart the fs -process. For instructions, see Stopping and Immediately Restarting Processes. -
    - - -

    To display all server entries from the VLDB

    -
      -

    1. Issue the vos listaddrs command to display all server entries -from the VLDB. -
         % vos listaddrs
      -
      -

      where lista is the shortest acceptable abbreviation of -listaddrs. -

      The output displays all server entries from the VLDB, each on its own -line. If a file server machine is multihomed, all of its registered -addresses appear on the line. The first one is the one reported as a -volume's site in the output from the vos examine and vos -listvldb commands. -

      VLDB server entries record IP addresses, and the command interpreter has -the local name service (either a process like the Domain Name Service or a -local host table) translate them to hostnames before displaying them. -If an IP address appears in the output, it is not possible to translate -it. -

      The existence of an entry does not necessarily indicate that the machine -that is still an active file server machine. To remove obsolete server -entries, see the following instructions. -

    - - -

    To remove obsolete server entries from the VLDB

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos changeaddr command to remove a server entry from -the VLDB. -
         % vos changeaddr <original IP address> -remove
      -
      -

      where -

      -

      ch -
      Is the shortest acceptable abbreviation of changeaddr. -

      original IP address -
      Specifies one of the IP addresses currently registered for the file server -machine in the VLDB. Any of a multihomed file server machine's -addresses are acceptable to identify it. -

      -remove -
      Removes the server entry. -
      -
    -

    To change a server machine's IP addresses

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the machine is the system control machine or a binary distribution -machine, and you are also changing its hostname, redefine all relevant -upclient processes on other server machines to refer to the new -hostname. Use the bos delete and bos create -commands as instructed in Creating and Removing Processes. -

    3. If the machine is a database server machine, edit its entry in the -/usr/afs/etc/CellServDB file on every server machine in the cell to -list one of the new IP addresses. If you use the United States edition -of AFS, you can edit the file on the system control machine and wait the -required time (by default, five minutes) for the Update Server to distribute -the changed file to all server machines. -

    4. If the machine is a database server machine, issue the bos -shutdown command to stop all server processes. If the machine is -also a file server, the volumes on it are inaccessible during this -time. For a complete description of the command, see To stop processes temporarily. -
         % bos shutdown <machine name>
      -
      -

    5. Use the utilities provided with the operating system to change one or more -of the machine's IP addresses. -

    6. If appropriate, edit the /usr/afs/local/NetInfo file, the -/usr/afs/local/NetRestrict file, or both, to reflect the changed -addresses. Instructions appear earlier in this section. -

    7. If the machine is a database server machine, issue the bos -restart command to restart all server processes on the machine. -For complete instructions for the bos restart command, see Stopping and Immediately Restarting Processes. -
         % bos restart <machine name> -all
      -
      -

      At the same time, issue the bos restart command on all other -database server machines in the cell to restart the database server processes -only (the Authentication, Backup, Protection, and Volume Location -Servers). Issue the commands in quick succession so that all of the -database server processes vote in the quorum election. -

         % bos restart <machine name> kaserver buserver ptserver vlserver
      -
      -

      If you are changing IP addresses on every database server machine in the -cell, you must also issue the bos restart command on every file -server machine in the cell to restart the fs process. -

    8. If the machine is not a database server machine, issue the bos -restart command to restart the fs process (if the machine is -a database server, you already restarted the process in the previous -step). The File Server automatically compiles a new list of interfaces, -records them in the /usr/afs/local/sysid file, and registers them -in its VLDB server entry. -
         % bos restart <machine name> fs
      -
      -

    9. If the machine is a database server machine, edit its entry in the -/usr/vice/etc/CellServDB file on every client machine in the cell -to list one of the new IP addresses. Instructions appear in Maintaining Knowledge of Database Server Machines. -

    10. If there are machine entries in the Protection Database for the -machine's previous IP addresses, use the pts rename command to -change them to the new addresses. For instructions, see Changing a Protection Database Entry's Name. -
    - - - -

    Rebooting a Server Machine

    -

    You can reboot a server machine either by typing the -appropriate commands at its console or by issuing the bos exec -command on a remote machine. Remote rebooting can be more convenient, -because you do not need to leave your present location, but you cannot track -the progress of the reboot as you can at the console. Remote rebooting -is possible because the server machine's operating system recognizes the -BOS Server, which executes the bos exec command, as the local -superuser root. -

    Rebooting server machines is part of routine maintenance in some cells, and -some instructions in the AFS documentation include it as a step. It is -certainly not intended to be the standard method for recovering from -AFS-related problems, however, but only a last resort when the machine is -unresponsive and you have tried all other reasonable options. -

    Rebooting causes a service outage. If the machine stores volumes, -they are all inaccessible until the reboot completes and the File Server -reattaches them. If the machine is a database server machine, -information from the databases can become unavailable during the reelection of -the synchronization site for each database server process; the VL Server -outage generally has the greatest impact, because the Cache Manager must be -able to access the VLDB to fetch AFS data. -

    By convention, a server machine's AFS initialization file includes the -following command to restart the BOS Server after each reboot. It -starts the other AFS server processes listed in the local -/usr/afs/local/BosConfig file. These instructions assume -that the initialization file includes the command. -

       /usr/afs/bin/bosserver &
    -
    -

    To reboot a file server machine from its console

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the bos shutdown command to shut down all AFS server -processes other than the BOS Server, which terminates safely when you reboot -the machine. Include the -localauth flag because you are -logged in as the local superuser root but do not necessarily have -administrative tokens. For a complete description of the command, see To stop processes temporarily. -
         # bos shutdown <machine name> -localauth [-wait]
      -
      -

    3. Reboot the machine. On many system types, the appropriate command -is shutdown, but the appropriate options vary; consult your -UNIX administrator's guide. -
          # shutdown
      -
      -
    - - -

    To reboot a file server machine remotely

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList file on -the machine you are rebooting. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos shutdown to halt AFS server processes other than -the BOS Server, which terminates safely when you turn off the machine. -For a complete description of the command, see To stop processes temporarily. -
         % bos shutdown <machine name>  [-wait]
      -
      -

    3. Issue the bos exec command to reboot the machine -remotely. -
         % bos exec <machine name> reboot_command
      -
      -

      where -

      -

      machine name -
      Names the file server machine to reboot. -

      reboot_command -
      Is the rebooting command for the machine's operating system. -The shutdown command is appropriate on many system types, but -consult your operating system documentation. -
      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd009.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd009.htm deleted file mode 100755 index c69036604..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd009.htm +++ /dev/null @@ -1,1420 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Monitoring and Controlling Server Processes

    - - -

    One of your most important responsibilities as a system administrator is -ensuring that the processes on file server machines are running -correctly. The BOS Server, which runs on every file server machine, -relieves you of much of the responsibility by constantly monitoring the other -AFS server processes on its machine. It can automatically restart -processes that have failed, ordering the restarts to take interdependencies -into account. -

    Because different file server machines run different combinations of -processes, you must define which processes the BOS Server on each file server -machine is to monitor (to learn how, see Controlling and Checking Process Status). -

    It is sometimes necessary to take direct control of server process status -before performing routine maintenance or correcting problems that the BOS -Server cannot correct (such as problems with database replication or mutual -authentication). At those times, you control process status through the -BOS Server by issuing bos commands. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - -
    Examine process status -bos status -
    Examine information from the BosConfig file file -bos status with -long flag -
    Create a process instance -bos create -
    Stop a process -bos stop -
    Start a stopped process -bos start -
    Stop a process temporarily -bos shutdown -
    Start a temporarily stopped process -bos startup -
    Stop and immediately restart a process -bos restart -
    Stop and immediately restart all processes -bos restart with -bosserver flag -
    Examine BOS Server's restart times -bos getrestart -
    Set BOS Server's restart times -bos setrestart -
    Examine a log file -bos getlog -
    Execute a command remotely -bos exec -
    -


    Brief Descriptions of the AFS Server Processes

    -

    This section briefly describes the different server -processes that can run on an AFS server machine. In cells with multiple -server machines, not all processes necessarily run on all machines. -

    An AFS server process is referred to in one of three ways, depending on the -context: - -

      -

    • The output from the bos status command refers to a process by -the name assigned when the bos create command creates its entry in -the /usr/afs/local/BosConfig file. The name can differ from -machine to machine, but it is easiest to maintain the cell if you assign the -same name on all machines. The AFS Quick Beginnings and the -reference page for the bos create command list the conventional -names. Examples are bosserver, kaserver, and -vlserver. -

    • The process listing produced by the standard ps command -generally matches the process's binary file. Examples of process -binary files are /usr/afs/bin/bosserver, -/usr/afs/bin/kaserver, and /usr/afs/bin/vlserver. -

    • In most contexts, including most references in the documentation, a -process is referred to as (for example) the Basic OverSeer (BOS) -Server, the Authentication Server, or the Volume -Location Server. -
    -

    The following sections specify each name for the process as well as some of -the administrative tasks in which you use the process. For a more -general description of the servers, see AFS Server Processes and the Cache Manager. -

    The bosserver Process: the Basic OverSeer Server

    - - -

    The bosserver process, which runs on every AFS server machine, -is the Basic OverSeer (BOS) Server responsible for monitoring the other AFS -server processes running on its machine. If a process fails, the BOS -Server can restart it automatically, without human intervention. It -takes interdependencies into account when restarting a process that has -multiple component processes (such as the fs process described in The fs Collection of Processes: the File Server, Volume Server and Salvager). - -

    Because the BOS Server does not monitor or restart itself, it does not -appear in the output from the bos status command. It appears -in the ps command's output as -/usr/afs/bin/bosserver. - - -

    As a system administrator, you contact the BOS Server when you issue -bos commands to perform the following kinds of tasks. - -

    -

    The buserver Process: the Backup Server

    - - -

    The buserver process, which runs on database server machines, is -the Backup Server. It maintains information about Backup System -configuration and operations in the Backup Database. -

    The process appears as buserver in the bos status -command's output, if the conventional name is assigned. It appears -in the ps command's output as -/usr/afs/bin/buserver. - - -

    As a system administrator, you contact the Backup Server when you issue any -backup command that manipulates information in the Backup Database, -including those that change Backup System configuration information, that dump -data from volumes to permanent storage, or that restore data to AFS. -See Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -

    The fs Collection of Processes: the File Server, Volume Server and Salvager

    - - -

    The fs process, which runs on every file server machine, -combines three component processes: File Server, Volume Server and -Salvager. The three components perform independent functions, but are -controlled as a single process for the following reasons. -

      -

    • They all operate on the same data, namely files and directories stored in -AFS volumes. Combining them as a single process enables them to -coordinate their actions, never attempting simultaneous operations on the same -data that can possibly corrupt it. -

    • It enables the BOS Server to stop and restart the processes in the -required order. When the File Server fails, the BOS Server stops the -Volume Server and runs the Salvager to correct any corruption that resulted -from the failure. (The Salvager runs only in this special circumstance -or when you invoke it yourself by issuing the bos salvage command -as instructed in Salvaging Volumes.) If only the Volume Server fails, the BOS Server can -restart it without affecting the File Server or Salvager. -
    -

    The File Server component handles AFS data at the level of files and -directories, manipulating file system elements as requested by application -programs and the standard operating system commands. Its main duty is -to deliver requested files to client machines and store them again on the -server machine when the client is finished. It also maintains status -and protection information about each file and directory. It runs -continuously during normal operation. - -

    The Volume Server component handles AFS data at the level of complete -volumes rather than files and directories. In response to -vos commands, it creates, removes, moves, dumps and restores entire -volumes, among other actions. It runs continuously during normal -operation. - -

    The Salvager component runs only after the failure of one of the other two -processes. It checks the file system for internal consistency and -repairs any errors it finds. - - -

    The process appears as fs in the bos status -command's output, if the conventional name is assigned. An -auxiliary message reports the status of the File Server or Salvager -component. See Displaying Process Status and Information from the BosConfig File. -

    The component processes of the fs process appear individually in -the ps command's output, as follows. There is no entry -for the fs process itself. -

      -

    • /usr/afs/bin/fileserver -

    • /usr/afs/bin/volserver -

    • /usr/afs/bin/salvager -
    -

    The Cache Manager contacts the File Server component on your behalf -whenever you access data or status information in an AFS file or directory or -issue file manipulation commands such as the UNIX cp and -ls commands. You can contact the File Server directly by -issuing fs commands that perform the following functions - - -

    - - -

    You contact the Volume Server component when you issue vos -commands that manipulate volumes in any way--creating, removing, -replicating, moving, renaming, converting to different formats, and -salvaging. For instructions, see Managing Volumes. -

    The Salvager normally runs automatically in case of a failure. You -can also start it with the bos salvage command as described in Salvaging Volumes. - - -

    The kaserver Process: the Authentication Server

    - - -

    The kaserver process, which runs on database server machines, is -the Authentication Server responsible for several aspects of AFS -security. It verifies AFS user identity by requiring a password. -It maintains all AFS server encryption keys and user passwords in the -Authentication Database. The Authentication Server's Ticket -Granting Service (TGS) module creates the shared secrets that AFS client and -server processes use when establishing secure connections. -

    The process appears as kaserver in the bos status -command's output, if the conventional name is assigned. The -ka string stands for Kerberos Authentication, reflecting -the fact that AFS's authentication protocols are based on Kerberos, which -was originally developed at the Massachusetts Institute of Technology's -Project Athena. -

    It appears in the ps command's output as -/usr/afs/bin/kaserver. - - -

    As a system administrator, you contact the Authentication Server when you -issue kas commands to perform the following kinds of tasks. -

    -

    The ptserver Process: the Protection Server

    - - -

    The ptserver process, which runs on database server machines, is -the Protection Server. Its main responsibility is maintaining the -Protection Database which contains user, machine, and group entries. -The Protection Server allocates AFS IDs and maintains the mapping between them -and names. The File Server consults the Protection Server when -verifying that a user is authorized to perform a requested action. -

    The process appears as ptserver in the bos status -command's output, if the conventional name is assigned. It appears -in the ps command's output as -/usr/afs/bin/ptserver. - - -

    As a system administrator, you contact the Protection Server when you issue -pts commands to perform the following kinds of tasks. -

    -

    The runntp Process

    - - - -

    The runntp process, which runs on every server machine, is a -controller program for the Network Time Protocol Daemon (NTPD), which -synchronizes the hardware clocks on server machines. You need to run -the runntp process if you are not already running NTP or another -time synchronization protocol on your server machines. -

    The clocks on database server machines need to be synchronized because -AFS's distributed database technology (Ubik) works properly only when the -clocks agree within a narrow range of variation (see Configuring the Cell for Proper Ubik Operation). The clocks on file server machines need to be -correct not only because the File Server sets modification time stamps on -files, but because in the conventional configuration they serve as the time -source for AFS client machines. -

    The process appears as runntp in the bos status -command's output, if the conventional name is assigned. It appears -in the output from the ps command as -/usr/afs/bin/runntp. The ps command's output -also includes an entry called ntpd; its exact form depends on -the arguments you provide to the runntp command. - - -

    As a system administrator, you do not contact the NTPD directly once you -have installed it according to the instructions in the AFS Quick -Beginnings. -

    The upserver and upclient Processes: the Update Server

    - - - -

    The Update Server has two separate parts, each of which runs on a different -type of server machine. The upserver process is the server -portion of the Update Server. Its function depends on which edition of -AFS you use: -

      -

    • With both the United States and international editions, it runs on the -binary distribution machine of each system type you use as a server machine, -distributing the contents of each one's /usr/afs/bin directory -to the other server machines of that type. This guarantees that all -machines have the same version of AFS binaries. (For a list of the -binaries, see Binaries in the /usr/afs/bin Directory.) -

    • In you use the United States edition of AFS, it also runs on the -cell's system control machine, distributing the contents of its -/usr/afs/etc directory to all the other server machines in order to -synchronize the configuration files stored in that directory. (For a -list of the configuration files, see Common Configuration Files in the /usr/afs/etc Directory.) -
    -

    The upclient process is the client portion of the Update Server, -and like the server portion its function depends on the AFS edition in -use. -

      -

    • It runs on every server machine that is not a binary distribution machine, -referencing the binary distribution machine of its system type as the source -for updates to the binaries in the /usr/afs/bin directory. -The conventional process name to assign is upclientbin. -

    • If you use the United States edition of AFS, another instance of the -process runs on every server machine except the system control machine. -It references the system control machine as the source for updates to the -common configuration files in the /usr/afs/etc directory. -The conventional process name to assign is upclientetc. -
    -

    In output from the bos status command, the server portion -appears as upserver and the client portions as -upclientbin and upclientetc, if the conventional names -are assigned. In the output from the ps command, the server -portion appears as /usr/afs/bin/upserver and the client portions as -/usr/afs/bin/upclient. - - -

    You do not contact the Update Server directly once you have installed -it. It operates automatically whenever you use bos commands -to change the files that it distributes. -

    The vlserver Process: the Volume Location Server

    - - -

    The vlserver process, which runs on database server machines, is -the Volume Location (VL) Server that automatically tracks which file server -machines house each volume, making its location transparent to client -applications. -

    The process appears as vlserver in the bos status -command's output, if the conventional name is assigned. It appears -in the ps command's output as -/usr/afs/bin/vlserver. - - - -

    As a system administrator, you contact the VL Server when you issue any -vos command that changes the status of a volume (it records the -status changes in the VLDB). -


    Controlling and Checking Process Status

    -

    To define the AFS server processes that run on a server -machine, use the bos create command to create entries for them in -the local /usr/afs/local/BosConfig file. The BOS Server -monitors the processes listed in the BosConfig file that are marked -with the Run status flag, and automatically attempts to restart -them if they fail. After creating process entries, you use other -commands from the bos suite to stop and start processes or change -the status flag as desired. -

    Never edit the BosConfig file directly rather than using -bos commands. Similarly, it is not a good practice to run -server processes without listing them in the BosConfig file, or to -stop them using process termination commands such as the UNIX kill -command. -

    The Information in the BosConfig File

    - - -

    A process's entry in the BosConfig file includes the -following information: -

      -

    • The process's name. The recommended conventional names are -defined in both the AFS Quick Beginnings and Creating and Removing Processes. The name of a simple process usually matches the -name of its binary file (for example, ptserver for the Protection -Server). -

    • Its type, which is one of the following: -
      - - -

      simple -
      A process that runs independently of any other on the server -machine. If several simple processes fail at the same time, the BOS -Server can restart them in any order. All standard AFS processes except -the fs process are simple. -

      fs - - - - - -
      A process type reserved for the server process for which the conventional -name is also fs. This process combines three -components: the File Server, the Volume Server, and the Salvager. - - -

      cron -
      A process that runs at a defined time rather than continuously. -There are no standard processes of this type. -
      - - - - -

    • Its status flag, which tells the BOS Server whether it performs the -following two actions with respect to the process: -
        -

      • Start the process during BOS Server initialization -

      • Restart the process if it (the process) fails -
      The two possible values are Run (which directs the BOS Server -to perform these actions) and NotRun (which directs the BOS Server -to ignore the process). The BOS Server itself never changes the setting -of this flag, even if the process fails repeatedly. Also, this flag is -for internal use only; it does not appear in the bos status -command's output. -

    • Its command parameters, which are the commands that the BOS Server runs to -start the process. - -
        -

      • A simple processes has one: the complete pathname to its binary file -

      • The fs process has three: the complete pathnames to each -of the three component processes (/usr/afs/bin/fileserver, -/usr/afs/bin/volserver, and /usr/afs/bin/salvager) -

      • A cron process has two: the first the complete pathname to its -binary file, the second the time at which the BOS Server runs it -
      -
    -

    In addition to process definitions, the BosConfig file also -records automatic restart times for processes that have new binaries, and for -all server processes including the BOS Server. See Setting the BOS Server's Restart Times. -

    How the BOS Server Uses the Information in the BosConfig File

    - - - -

    Whenever the BOS Server starts or restarts, it reads the -BosConfig file to learn which processes it is to start and -monitor. It transfers the information into kernel memory and does not -read the BosConfig file again until it next restarts. This -implies that the BOS Server's memory state can change independently of -the BosConfig file. You can, for example, stop a process but -leave its status flag in the BosConfig file as Run, or -start a process even though its status flag in the BosConfig file -is NotRun. -

    About Starting and Stopping the Database Server Processes

    - - - - - - - -

    When you start or stop a database server process (Authentication Server, -Backup Server, Protection Server, or Volume Location Server) for more than a -short time, you must follow the instructions in the AFS Quick -Beginnings for installing or removing a database server machine. -Here is a summary of the tasks you must perform to preserve correct AFS -functioning. -

      -

    • Start or stop all four database server processes on that machine. -All AFS server processes and the Cache Manager processes expect all four -database server processes to be running on each machine listed in the -CellServDB file. There is no way to indicate in the file -that a machine is running only some of the database server processes. -

    • Add or remove the machine in the /usr/afs/etc/CellServDB file -on all server machines and the /usr/vice/etc/CellServDB file on all -client machines. -

    • Restart the database server processes on the other database server -machines to force an election of a new Ubik coordinator for each one. -
    -

    About Starting and Stopping the Update Server

    - -

    In the conventional cell configuration, one server machine of each system -type acts as a binary distribution machine, running the server portion of the -Update Server (upserver process) to distribute the contents of its -/usr/afs/bin directory. The other server machines of its -system type run an instance of the Update Server client portion (by convention -called upclientbin) that references the binary distribution -machine. -

    If you run the United States edition of AFS, it is conventional for the -first server machine you install to act as the system control machine, running -the server portion of the Update Server (upserver process) to -distribute the contents of its /usr/afs/etc directory. All -other server machines run an instance of the Update Server client portion (by -convention called upclientetc) that references the system control -machine. -

    -
    Note:If you are using the international edition of AFS, do not use the Update -Server to distribute the contents of the /usr/afs/etc directory -(you do not run a system control machine). Ignore all references to the -process in this chapter. -
    -

    It is simplest not to move binary distribution or system control -responsibilities to a different machine unless you completely decommission a -machine that is currently serving in one of those roles. Running the -Update Server usually imposes very little processing load. If you must -move the functionality, perform the following related tasks. -

      -

    • If you replace the system control machine, you must stop the -upclientetc process on every other server machine and define a new -one that references the new system control machine. -

    • If you replace a binary distribution machine, you must stop the -upclientbin process on every other server machine of its system -type and define a new one that references the new binary distribution machine -(unless you are no longer running any server machines of that system -type). -
    -

    Displaying Process Status and Information from the BosConfig File

    -

    To display the status of the AFS server processes on a -server machine, issue the bos status command. Adding the --long flag displays most of the information from each -process's entry in the BosConfig file, including its type and -command parameters. It also displays a warning message if the mode bits -on files and subdirectories in the /usr/afs directory do not match -the expected values. -

    To display the status of server processes and their BosConfig entries

    - - - - - - - - -
      -

    1. Issue the bos status command. -
         % bos status <machine name>  [<server process name>+]  [-long]
      -
      -

      where -

      -

      stat -
      Is the shortest acceptable abbreviation of status. -

      machine name -
      Specifies the file server machine for which to display process -status. -

      server process name -
      Names each process for which to display status, using the name assigned -when its entry was defined with the bos create command. Omit -this argument to display the status of all server processes. -

      -long -
      Displays, in addition to status, information from the process's entry -in the BosConfig file: its type, its status flag, its command -parameters, the associated notifier program, and so on. -
      -
    -

    The output includes an entry for each process and uses one of the following -strings to indicate the process's status: -

      -

    • currently running normally indicates that the process is -running and its status flag in the BosConfig file is -Run. For cron entries, this message indicates that the -command is still scheduled to run, not necessarily that it is actually running -when the bos status command was issued. -

    • temporarily enabled indicates that the process is running but -that its status flag in the BosConfig file is -NotRun. The most common reason is that a system -administrator has used the bos startup command to start the -process. -

    • temporarily disabled indicates that the process is not running -even though its status flag in the BosConfig file is -Run. The most common reasons are either that a system -administrator has used the bos shutdown command to stop the process -or that the BOS Server ceased trying to restart the process after numerous -failed attempts. In the latter case, a supplementary message -appears: stopped for too many errors. -

    • disabled indicates that the process is not running and that its -status flag in the BosConfig file is NotRun. The -BOS Server is not monitoring the process. Only a system administrator -can set the flag this way; the BOS Server never does. -
    -

    The output for the fs process always includes a message marked -Auxiliary status, which can be one of the following: -

      -

    • file server running indicates that the File Server and Volume -Server components of the File Server process are running normally. -

    • salvaging file system indicates that the Salvager is running, -which usually implies that the File Server and Volume Server are temporarily -disabled. The BOS Server restarts them as soon as the Salvager is -finished. -
    -

    The output for a cron process also includes an Auxiliary status -message to report when the command is scheduled to run next; see the -example that follows. -

    The output for any process can include the supplementary message has -core file to indicate that at some point the process failed and -generated a core file in the /usr/afs/logs directory. In -most cases, the BOS Server is able to restart the process and it is -running. -

    The following example includes a user-defined cron entry called -backupusers: -

       % bos status fs3.abc.com
    -   Instance kaserver, currently running normally.
    -   Instance ptserver, currently running normally.
    -   Instance vlserver, has core file, currently running normally.
    -   Instance buserver, currently running normally.
    -   Instance fs, currently running normally.
    -       Auxiliary status is: file server running.
    -   Instance upserver, currently running normally.
    -   Instance runntp, currently running normally.
    -   Instance backupusers, currently running normally.
    -       Auxiliary status is: run next at Mon Jun 7 02:00:00 1999.
    -
    -

    If you include the -long flag to the bos status -command, a process's entry in the output includes the following -additional information from the BosConfig file: -

      -

    • The process's type (simple, fs, or -cron). -

    • The day and time the process last started or restarted. -

    • The number of proc starts, which is how many times the BOS -Server has started or restarted the process since it started itself. -

    • The Last exit time when the process (or one of the component -processes in the fs process) last terminated. This line does -not appear if the process has not terminated since the BOS Server -started. -

    • The Last error exit time when the process (or one of the -component processes in the fs process) last failed due to an -error. A further explanation such as due to shutdown request -sometimes appears. This line does not appear if the process has not -failed since the BOS Server started. -

    • Each command that the BOS Server invokes to start the process, as -specified by the -cmd argument to the bos create -command. -

    • The pathname of the notifier program that the BOS Server invokes when the -process terminates (if any), as specified by the -notifier argument -to the bos create command. -
    -

    In addition, if the BOS Server has found that the mode bits on certain -files and directories under /usr/afs deviate from what it expects, -it prints the following warning message: -

       Bosserver process reports inappropriate access on server directories
    -
    -

    The expected protections for the directories and files in the -/usr/afs directory are as follows. A question mark indicates -that the BOS Server does not check the mode bit. See the AFS Quick -Beginnings for more information about setting the protections on these -files and directories. -
    - - - - - - - - - - -
    /usr/afs -drwxr?xr-x -
    /usr/afs/backup -drwx???--- -
    /usr/afs/bin -drwxr?xr-x -
    /usr/afs/db -drwx???--- -
    /usr/afs/etc -drwxr?xr-x -
    /usr/afs/etc/KeyFile --rw????--- -
    /usr/afs/etc/UserList --rw?????-- -
    /usr/afs/local -drwx???--- -
    /usr/afs/logs -drwxr?xr-x -
    -

    The following illustrates the extended output for the fs process -running on the machine fs3.abc.com: -

       % bos status fs3.abc.com fs -long
    -   Instance fs, (type is fs), currently running normally.
    -       Auxiliary status is file server running
    -   Process last started at Mon May 3 8:29:19 1999 (3 proc starts)
    -   Last exit at Mon May 3 8:29:19 1999
    -   Last error exit at Mon May 3 8:29:19 1999, due to shutdown request
    -   Command 1 is '/usr/afs/bin/fileserver'
    -   Command 2 is '/usr/afs/bin/volserver'
    -   Command 3 is '/usr/afs/bin/salvager'
    -
    -

    Creating and Removing Processes

    - - - - - - - - -

    To start a new AFS server process on a server machine, issue the bos -create command, which creates an entry in the -/usr/afs/local/BosConfig file, sets the process's status flag -to Run both in the file and in the BOS Server's memory, and -starts it running immediately. The binary file for the new process must -already be installed, by convention in the /usr/afs/bin directory -(see Installing New Binaries). -

    To stop a process permanently, first issue the bos stop command, -which changes the process's status flag to NotRun in both the -BosConfig file and the BOS Server's memory; it is marked -as disabled in the output from the bos status -command. If desired, issue the bos delete command to remove -the process's entry from the BosConfig file; the process -no longer appears in the bos status command's output. -

    -
    Note:If you are starting or stopping a database server process in the manner -described in this section, follow the complete instructions in the AFS -Quick Beginnings for creating or removing a database server -machine. If you run one database server process on a given machine, you -must run them all; for more information, see About Starting and Stopping the Database Server Processes. Similarly, if you are stopping the -upserver process on the system control machine or a binary -distribution machine, you must complete the additional tasks described in About Starting and Stopping the Update Server. -
    -

    To create and start a new process

    - - - - - - - - -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. (Optional) Verify that the process's binaries are -installed in the /usr/afs/bin directory on this machine. If -necessary, login at the console or telnet to the machine and list the contents -of the /usr/afs/bin directory. -

      If the binaries are not present, install them on the binary distribution -machine of the appropriate system type, and wait for the Update Server to copy -them to this machine. For instructions, see Installing New Binaries. -

         % ls /usr/afs/bin
      -
      -

    3. Issue the bos create command to create an entry in -the BosConfig file and start the process. -
         % bos create <machine name> <server process name>   \
      -             <server type> <command lines>+ [ -notifier <Notifier program>]
      -
      -

      where -

      -

      cr -
      Is the shortest acceptable abbreviation of create. -

      machine name -
      Specifies the file server machine on which to create the process. -

      server process name -
      Names the process to create and start. For simple processes, the -conventional value is the name of the process's binary file. It is -best to use the same name on every server machine that runs the -process. The following is a list of the conventional names for simple -and fs-type processes (there are no standard cron processes). -
        -

      • buserver for the Backup Server -

      • fs for the process that combines the File Server, Volume -Server, and Salvager -

      • kaserver for the Authentication Server -

      • ptserver for the Protection Server -

      • runntp for the controller process for the Network Time Protocol -Daemon -

      • upclientbin for the client portion of the Update Server that -references the binary distribution machine of this machine's system type -

      • upclientetc for the client portion of the Update Server that -references the system control machine -

      • vlserver for the Volume Location (VL) Server -
      -

      server type -
      Defines the process's type. Choose one of the following -values: -
        -

      • cron for a cron process -

      • fs for the process named fs -

      • simple for all other processes listed as acceptable values for -the server process name argument -
      -

      command lines -
      Specifies each command the BOS Server runs to start the process. -Specify no more than six commands (which can include the command's -options, in which case the entire string is surrounded by double quotes); -any additional commands are ignored. -

      For a simple process, provide the complete pathname of the process's -binary file on the local disk (for example, /usr/afs/bin/ptserver -for the Protection Server). If including any of the initialization -command's options, surround the entire command in double quotes (" -"). The upclient process has a required argument, and -the commands for all other processes take optional arguments. - -

      For the fs process, provide the complete pathname of the local -disk binary file for each of the component processes: -fileserver, volserver, and salvager, in that -order. The standard binary directory is /usr/afs/bin. -If including any of an initialization command's options, surround the -entire command in double quotes (" "). - -

      For a cron process, provide two parameters: - -

        -

      • The complete local disk pathname of either an executable file or a command -from one of the AFS suites (complete with all of the necessary -arguments). Surround this parameter with double quotes (" ") -if it contains spaces. -

      • A specification of when the BOS Server executes the file or command -indicated by the first parameter. There are three acceptable -values: -
          -

        • The string now, which directs the BOS Server to execute the -file or command immediately and only once. It is usually simpler to -issue the command directly or issue the bos exec command. -

        • A time of day. The BOS Server executes the file or command daily at -the indicated time. Separate the hours and minutes with a colon -(hh:MM), and use either 24-hour format, or a value -in the range from 1:00 through 12:59 with -the addition of am or pm. For example, both -14:30 and "2:30 pm" indicate 2:30 in -the afternoon. Surround this parameter with double quotes (" -") if it contains a space. -

        • A day of the week and time of day, separated by a space and surrounded -with double quotes (" "). The BOS Server executes the file -or command weekly at the indicated day and time. For the day, provide -either the whole name or the first three letters, all in lowercase letters -(sunday or sun, thursday or thu, -and so on). For the time, use the same format as when specifying the -time alone. -
        -
      -

      -notifier -
      Specifies the pathname of a program that the BOS Server runs when the -process terminates. For more information on notifier programs, see the -bos create command reference page in the AFS Administration -Reference. -
      -
    -

    The following example defines and starts the Protection Server on the -machine db2.abc.com: -

       
    -   % bos create db2.abc.com ptserver simple /usr/afs/bin/ptserver 
    -   
    -
    -

    The following example defines and starts the fs process on the -machine fs6.abc.com. -

       
    -   % bos create fs6.abc.com fs fs /usr/afs/bin/fileserver   \
    -        /usr/afs/bin/volserver /usr/afs/bin/salvager
    -    
    -
    -

    The following example defines and starts a cron process called -backupuser process on the machine -fs3.abc.com, scheduling it to run each day at -3:00 a.m. -

       % bos create fs3.abc.com backupuser cron  "/usr/afs/bin/vos backupsys -prefix user -local" 3:00 
    -
    -

    To stop a process and remove it from the BosConfig file

    - - - - - - - -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos stop command to change each -process's status flag in the BosConfig file to -NotRun and to stop it. You must issue this command even for -cron processes that you wish to remove from the BosConfig file, -even though they do not run continuously. For a detailed description of -this command, see To stop a process by changing its status to NotRun. -
         
      -   % bos stop <machine name> <server process name>+ [-wait]
      -   
      -
      -

    3. Issue the bos delete command to remove each -process from the BosConfig file. -
         % bos delete <machine name> <server process name>+
      -
      -

      where -

      -

      d -
      Is the shortest acceptable abbreviation of delete. -

      machine name -
      Specifies the server machine on which to remove processes from the -BosConfig file. -

      server process name -
      Names each process entry to remove from the BosConfig -file. Provide the same names as in Step 2. -
      -
    -

    Stopping and Starting Processes Permanently

    - - - - -

    To stop a process so that the BOS Server no longer attempts to monitor it, -issue the bos stop command. The process's status flag -is set to NotRun in both the BOS Server's memory and in the -BosConfig file. The process does not run again until you -issue the bos start command, which sets its status flag back to -Run in both the BOS Server's memory and in the -BosConfig file. (You can also use the bos startup -command to start the process again without changing its status flag in the -BosConfig file; see Stopping and Starting Processes Temporarily.) -

    There is no entry for the BOS Server in the BosConfig file, so -the bos stop and bos start commands do not control -it. To stop and immediately restart the BOS Server along with all other -processes, use the -bosserver flag to the bos restart -command as described in Stopping and Immediately Restarting Processes. -

    -
    Note:If you are starting or stopping a database server process in the manner -described in this section, follow the complete instructions in the AFS -Quick Beginnings for creating or removing a database server -machine. If you run one database server process on a given machine, you -must run them all; for more information, see About Starting and Stopping the Database Server Processes. Similarly, if you are stopping the -upserver process on the system control machine or a binary -distribution machine, you must complete the additional tasks described in About Starting and Stopping the Update Server. -
    -

    To stop a process by changing its status to NotRun

    - - - - - - -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos stop command to stop each process and set its -status flag to NotRun in the BosConfig file and the BOS -Server's memory. -
         % bos stop <machine name> <server process name>+ [-wait]
      -
      -

      where -

      -

      sto -
      Is the shortest acceptable abbreviation of stop. -

      machine name -
      Specifies the server machine on which to stop the process. -

      server process name -
      Names each process to stop, using the name assigned when its entry was -defined with the bos create command. -

      -wait -
      Delays the return of the command shell prompt until all specified -processes have stopped. If you omit the flag, the prompt returns almost -immediately, even if all processes are not yet stopped. -
      -
    -

    To start processes by changing their status flags to Run

    - - - - - -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos start command to change each -process's status flag to Run in both the BosConfig -file and the BOS Server's memory and to start it. -
         %  bos start <machine name> <server process name>+
      -
      -

      where -

      -

      start -
      Must be typed in full. -

      machine name -
      Specifies the server machine on which to start running each -process. -

      server process name -
      Specifies each process to start on machine name. Use the -name assigned to the process at creation. -
      -
    -

    Stopping and Starting Processes Temporarily

    -

    It is sometimes necessary to halt a process temporarily (for -example, to make slight configuration changes or to perform -maintenance). The commands described in this section change a -process's status in the BOS Server's memory only; the effect is -immediate and lasts until you change the memory state again (or until the BOS -Server restarts, at which time it starts the process according to its entry in -the BosConfig file). -

    To stop a process temporarily by changing its status flag in BOS Server -memory to NotRun, use the bos shutdown command. -To restart a stopped process by changing its status flag in the BOS -Server's memory to Run, use the bos startup -command. The process starts regardless of its status flag in the -BosConfig file. You can also use the bos startup -command to start all processes marked with status flag Run in the -BosConfig file, as described in the following instructions. -

    Because the bos startup command starts a process without -changing it status flag in the BosConfig file, it is useful for -testing a server process without enabling it permanently. To stop and -start processes by changing their status flags in the BosConfig -file, see Stopping and Starting Processes Permanently; to stop and immediately restart a process, see Stopping and Immediately Restarting Processes. -
    Note:Do not temporarily stop a database server process on all machines at -once. Doing so makes the database completely unavailable. -
    - - -

    To stop processes temporarily

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos shutdown command to stop each process -by changing its status flag in the BOS Server's memory to -NotRun. -
         % bos shutdown <machine name> [<instances>+] [-wait]
      -
      -

      where -

      -

      sh -
      Is the shortest acceptable abbreviation of shutdown. -

      machine name -
      Specifies the server machine on which to stop processes -temporarily. -

      instances -
      Specifies each process to stop temporarily. Use the name assigned -to the process at creation. -

      -wait -
      Delays the return of the command shell prompt until all specified -processes have actually stopped. If you omit the flag, the prompt -returns almost immediately, even if all processes are not yet stopped. -
      -
    - - -

    To start all stopped processes that have status flag Run in the BosConfig file

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos startup command to start each process on a -machine that has status flag Run in the BosConfig file -by changing its status flag in the BOS Server's memory from -NotRun to Run. -
         % bos startup <machine name>
      -
      -

      where -

      -

      startup -
      Must be typed in full. -

      machine name -
      Specifies the server machine on which you wish to start all processes that -have status flag Run in the BosConfig file. -
      -
    -

    To start specific processes

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos startup command to start specific processes by -changing their status flags in the BOS Server's memory to Run -without changing their status flags in the BosConfig file. -
         % bos startup <machine name> <instances>+
      -
      -

      where -

      -

      startup -
      Must be typed in full. -

      machine name -
      Names the server machine on which to start processes. -

      instances -
      Specifies each process to start. Use the name assigned to the -process at creation. -
      -
    -

    Stopping and Immediately Restarting Processes

    - - -

    Although by default the BOS Server checks each day for new installed binary -files and restarts the associated processes, it is sometimes desirable to stop -and restart processes immediately. The bos restart command -provides this functionality, starting a completely new instance of each -affected process: -

      -

    • To stop and restart the BOS Server, which then restarts all processes -marked with the Run status flag in the BosConfig file, -include the -bosserver flag. -

    • To stop and restart all processes marked with the Run status -flag in the BosConfig file, include the -all -flag. The BOS Server does not restart -

    • To stop and restart specific processes regardless of the setting of their -status flags in the BosConfig file, specify the name of each -process to restart. -
    -

    Restarting processes causes a service outage. It is usually best to -schedule restarts for periods of low usage. The BOS Server -automatically restarts all processes once a week, to reduce the potential for -the core leaks that can develop as any process runs for an extended time; -see Setting the BOS Server's Restart Times. - - -

    - - - - - -

    To stop and restart all processes including the BOS Server

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos restart command with the -bosserver -flag to stop and restart the BOS Server, which restarts every process marked -with status flag Run in the BosConfig file. -
         % bos restart <machine name>  -bosserver
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restart. -

      machine name -
      Specifies the server machine on which to restart all processes. -

      -bosserver -
      Stops the BOS Server and all processes running on the machine. A -new BOS Server instance starts; it then starts new instances of all -processes marked with status flag Run in the BosConfig -file. -
      -
    - - - - -

    To stop and immediately restart all processes except the BOS Server

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos restart command with the -all flag to -stop and immediately restart every process marked with status flag -Run in the BosConfig file. The BOS Server does -not restart. -
         % bos restart <machine name> -all
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restart. -

      machine name -
      Specifies the server machine on which to stop and restart -processes. -

      -all -
      Stops and immediately restarts all processes marked with status flag -Run in the BosConfig file. -
      -
    - - - - -

    To stop and immediately restart specific processes

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos restart command to stop and immediately restart -one or more specified processes, regardless of their status flag setting in -the BosConfig file. -
         % bos restart <machine name> <instances>+
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restart. -

      machine name -
      Names the server machine on which to restart the specified -processes. -

      instances -
      Specifies each process to stop and immediately restart. Use the -name assigned to the process at creation. -
      -
    -

    Setting the BOS Server's Restart Times

    - - - - - - - - - -

    The BOS Server by default restarts once a week, and the new instance -restarts all processes marked with status flag Run in the local -/usr/afs/local/BosConfig file (this is equivalent to issuing the -bos restart command with the -bosserver flag). -The default restart time is Sunday at 4:00 a.m. The weekly -restart is designed to minimize core leaks, which can develop as a -process continues to allocate virtual memory but does not free it -again. When the memory is completely exhausted, the machine can no -longer function correctly. -

    The BOS Server also by default checks once a day for any newly installed -binary files. If it finds that the modification time stamp on a -process's binary file in the /usr/afs/bin directory is more -recent than the time at which the process last started, it restarts the -process so that a new instance starts using the new binary file. The -default binary-checking time is 5:00 a.m. -

    Because restarts can cause outages during which the file system is -inaccessible, the default times for restarts are in the early morning when -usage is likely to be lowest. Restarting a database server process on -any database server machine usually makes the entire system unavailable to -everyone for a brief time, whereas restarting other types of processes -inconveniences only users interacting with that process on that -machine. The longest outages typically result from restarting the -fs process, because the File Server must reattach all -volumes. - - - -

    The BosConfig file on each file server machine records the two -restart times. To display the current setting, issue the bos -getrestart command. To reset a time, use the bos -setrestart command. - - - -

    To display the BOS Server restart times

    -
      -

    1. Issue the bos getrestart command to display the automatic -restart times. -
         % bos getrestart <machine name>
      -
      -

      where -

      -

      getr -
      Is the shortest acceptable abbreviation of getrestart. -

      machine name -
      Specifies the server machine for which to display the restart -times. -
      -
    - - - -

    To set the general or binary restart time

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos setrestart command with the -general -flag to set the general restart time or the -newbinary flag to set -the binary restart time. The command accepts only one of the flags at a -time. -
         % bos setrestart <machine name> "<time to restart server>" [-general]  [-newbinary]
      -
      -

      where -

      -

      setr -
      Is the shortest acceptable abbreviation of setrestart. -

      machine name -
      Specifies the server machine. -

      time to restart server -
      Sets when the BOS Server restarts itself (if combined with the --general flag) or any process with a new binary file (if combined -with the -newbinary flag). Provide one of the following -types of values: -
        -

      • The string never, which directs the BOS Server never to perform -the indicated type of restart. -

      • A time of day (the conventional type of value for the binary restart -time). Separate the hours and minutes with a colon -(hh:MM), and use either 24-hour format, or a value -in the range from 1:00 through 12:59 with -the addition of am or pm. For example, both -14:30 and "2:30 pm" indicate 2:30 in -the afternoon. Surround this parameter with double quotes (" -") if it contains a space. -

      • A day of the week and time of day, separated by a space and surrounded -with double quotes (" "). This is the conventional type of -value for the general restart. For the day, provide either the whole -name or the first three letters, all in lowercase letters (sunday -or sun, thursday or thu, and so on). -For the time, use the same format as when specifying the time alone. -
      -

      If desired, precede a time or day and time definition with the string -every or at. These words do not change the -meaning, but possibly make the output of the bos getrestart command -easier to understand. -
      Note:If the specified time is within one hour of the current time, the BOS Server -does not perform the restart until the next eligible time (the next day for a -time or next week for a day and time). -
      -

      -general -
      Sets the general restart time when the BOS Server restarts itself. -

      -newbinary -
      Sets the restart time for processes with new binary files. -
      -
    -

    Displaying Server Process Log Files

    - - - - - - - - - - - - - - - - - - -

    The /usr/afs/logs directory on each file server machine contains -log files that detail interesting events that occur during normal operation of -some AFS server processes. The self-explanatory information in the log -files can help you evaluate process failures and other problems. To -display a log file remotely, issue the bos getlog command. -You can also establish a connection to the server machine and use a text -editor or other file display program (such as the cat -command). -
    Note:Log files can grow unmanageably large if you do not periodically shutdown and -restart the database server processes (for example, if you disable the general -restart time). In this case it is a good policy periodically to issue -the UNIX rm command to delete the current log file. The -server process automatically creates a new one as needed. -
    - - -

    To examine a server process log file

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos getlog command to display a log file. -
         % bos getlog  <machine name>  <log file to examine>
      -
      -

      where -

      -

      getl -
      Is the shortest acceptable abbreviation of getlog. -

      machine name -
      Specifies the server machine from which to display the log file. -

      log file to examine -
      Names the log file to be displayed. Provide one of the following -file names to display the indicated log file from the /usr/afs/logs -directory. -
        -

      • AuthLog for the Authentication Server log file -

      • BackupLog for the Backup Server log file -

      • BosLog for the BOS Server log file -

      • FileLog for the File Server log file -

      • SalvageLog for the Salvager log file -

      • VLLog for the Volume Location (VL) Server log file -

      • VolserLog for the Volume Server log file -
      -

      You can provide a full or relative pathname to display a file from another -directory. Relative pathnames are interpreted relative to the -/usr/afs/logs directory. -

      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd010.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd010.htm deleted file mode 100755 index dc599c0e4..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd010.htm +++ /dev/null @@ -1,3623 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Managing Volumes

    -

    This chapter explains how to manage the volumes stored on -file server machines. The volume is the designated unit of -administration in AFS, so managing them is a large part of the -administrator's duties. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Create read/write volume -vos create -
    Create read-only volume -vos addsite and vos release -
    Create backup volume -vos backup -
    Create many backup volumes at once -vos backupsys -
    Examine VLDB entry -vos listvldb -
    Examine volume header -vos listvol -
    Examine both VLDB entry and volume header -vos examine -
    Display volume's name -fs listquota or fs examine -
    Display volume's ID number -fs examine or vos examine or -vos listvol -
    Display partition's size and space available -vos partinfo -
    Display volume's location -fs whereis or vos examine -
    Create mount point -fs mkmount -
    Remove mount point -fs rmmount -
    Display mount point -fs lsmount -
    Move read/write volume -vos move -
    Synchronize VLDB with volume headers -vos syncvldb and vos syncserv -
    Set volume quota -fs setvol or fs setquota -
    Display volume quota -fs quota or fs listquota or -fs examine -
    Display volume's current size -fs listquota or fs examine -
    Display list of volumes on a machine/partition -vos listvol -
    Remove read/write volume -vos remove and fs rmmount -
    Remove read-only volume -vos remove -
    Remove backup volume -vos remove and fs rmmount -
    Remove volume; no VLDB change -vos zap -
    Remove read-only site definition -vos remsite -
    Remove VLDB entry; no volume change -vos delentry -
    Dump volume -vos dump -
    Restore dumped volume -vos restore -
    Rename volume -vos rename, fs rmmount and fs -mkmount -
    Unlock volume -vos unlock -
    Unlock multiple volumes -vos unlockvldb -
    Lock volume -vos lock -
    -


    About Volumes

    - -

    An AFS volume is a logical unit of disk space that functions -like a container for the files in an AFS directory, keeping them all together -on one partition of a file server machine. To make a volume's -contents visible in the cell's file tree and accessible to users, you -mount the volume at a directory location in the AFS filespace. The -association between the volume and its location in the filespace is called a -mount point, and because of AFS's internal workings it looks -and acts just like a standard directory element. Users can access and -manipulate a volume's contents in the same way they access and manipulate -the contents of a standard UNIX directory. For more on the relationship -between volumes and directories, see About Mounting Volumes. -

    Many of an administrator's daily activities involve manipulating -volumes, since they are the basic storage and administrative unit of -AFS. For a discussion of some of the ways volumes can make your job -easier, see How Volumes Improve AFS Efficiency. -

    The Three Types of Volumes

    -

    There are three types of volumes in AFS, as described in the -following list: -

      -

    • The single read/write version of a volume houses the modifiable -versions of the files and directories in that volume. - -It is often referred to as the read/write source because volumes of -the other two types are derived from it by a copying procedure called -cloning. For instructions on creating read/write volumes, -see Creating Read/write Volumes. -

    • A read-only volume is a copy of the read/write source volume -and can exist at multiple sites (a site is a particular partition -on a particular file server machine). - - - -Placing the same data at more than one site is called -replication; see How Volumes Improve AFS Efficiency. As the name suggests, a -read-only volume's contents do not change automatically as the read/write -source changes, but only when an administrator issues the vos -release command. For users to have a consistent view of the AFS -filespace, all copies of the read-only volume must match each other and their -read/write source. All read-only volumes share the same name, which is -derived by adding the .readonly extension to the read/write -source's name. For instructions on creating of read-only volumes, -see Replicating Volumes (Creating Read-only Volumes). -

    • A backup volume is a clone of the read/write source volume and -is stored at the same site as the source. - -A backup version is useful because it records the state of the read/write -source at a certain time, allowing recovery of data that is later mistakenly -changed or deleted (for further discussion see How Volumes Improve AFS Efficiency). A backup volume's name is derived by adding -the .backup extension to the read/write source's -name. For instructions on creating of backup volumes, see Creating Backup Volumes. -
      Note:A backup volume is not the same as the backup of a volume transferred to tape -using the AFS Backup System, although making a backup version of a volume is -usually a stage in the process of backing up the volume to tape. For -information on backing up a volume using the AFS Backup System, see Backing Up Data. -
      -
    -

    As noted, the three types of volumes are related to one another: -read-only and backup volumes are both derived from a read/write volume through -a process called cloning. Read-only and backup volumes are exact copies -of the read/write source at the time they are created. -

    How Volumes Improve AFS Efficiency

    - -

    Volumes make your cell easier to manage and more efficient in the following -three ways: -

      -

    • Volumes are easy to move between partitions, on the same or different -machines, because they are by definition smaller than a partition. - -Perhaps the most common reasons to move volumes are to balance the load among -file server machines or to take advantage of greater disk capacity on certain -machines. You can move volumes as often as necessary without disrupting -user access to their contents, because the move procedure makes the contents -unavailable for only a few seconds. The automatic tracking of volume -locations in the Volume Location Database (VLDB) assures that access remains -transparent. For instructions on moving volumes, see Moving Volumes. -

    • Volumes are the unit of replication in AFS. - - -Replication refers to creating a read-only clone from the -read/write source and distributing of the clone to one or more sites. -Replication improves system efficiency because more than one machine can fill -requests for popular files. It also boosts system reliability by -helping to keep data available in the face of machine or server process -outage. In general, volumes containing popular application programs and -other files that do not change often are the best candidates for replication, -but you can replicate any read/write volume. See Replicating Volumes (Creating Read-only Volumes). -

    • Volumes are the unit of backup in AFS, in two senses. - -You can create a backup volume version to preserves the state of a read/write -source volume at a specified time. You can mount the backup version in -the AFS filespace, enabling users to restore data they have accidentally -changed or deleted without administrator assistance, which frees you for more -important jobs. If you make a new backup version of user volumes once a -day (presumably overwriting the former backup), then users are always be able -to retrieve the previous day's version of a file. For -instructions, see Creating Backup Volumes. -

      Backup also refers to using the AFS Backup System to store permanent copies -of volume contents on tape or in a special backup data. See Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -

    -

    Volume Information in the VLDB

    -

    The Volume Location Database (VLDB) includes entries for -every volume in a cell. Perhaps the most important information in the -entry is the volume's location, which is key to transparent access to AFS -data. When a user opens a file, the Cache Manager consults the Volume -Location (VL) Server, which maintains the VLDB, for a list of the file server -machines that house the volume containing the file. The Cache Manager -then requests the file from the File Server running on one of the relevant -file server machines. The file location procedure is invisible to the -user, who only needs to know the file's pathname. - - - -

    The VLDB volume entry for a read/write volume also contains the pertinent -information about the read-only and backup versions, which do not have their -own VLDB entries. (The rare exception is a read-only volume that has -its own VLDB entry because its read/write source has been removed.) A -volume's VLDB entry records the volume's name, the unique volume ID -number for each version (read/write, read-only, backup, and releaseClone), a -count of the number of sites that house a read/write or read-only version, and -a list of the sites. -

    To display the VLDB entry for one or more volumes, use the vos -listvldb command as described in To display VLDB entries. To display the VLDB entry for a single volume along -with its volume header, use the vos examine command as described in -To display one volume's VLDB entry and volume header. (See the following section for a description of the -volume header.) -

    The Information in Volume Headers

    - - -

    Whereas all versions of a volume share one VLDB entry, each volume on an -AFS server partition has its own volume header, a data structure -that maps the files and directories in the volume to physical memory addresses -on the partition that stores them. The volume header binds the -volume's contents into a logical unit without requiring that they be -stored in contiguous memory blocks. The volume header also records the -following information about the volume, some of it redundant with the VLDB -entry: name, volume ID number, type, size, status (online, offline, or -busy), space quota, timestamps for creation date and date of last -modification, and number of accesses during the current day. -

    To display the volume headers on one or more partitions, use the vos -listvol command as described in To display volume headers. To display the VLDB entry for a single volume along -with its volume header, use the vos examine command as described in -To display one volume's VLDB entry and volume header. -

    Keeping the VLDB and Volume Headers Synchronized

    - - - - - - -

    It is vital that the information in the VLDB correspond to the status of -the actual volumes on the servers (as recorded in volume headers) as much of -the time as possible. If a volume's location information in the -VLDB is incorrect, the Cache Manager cannot find access its contents. -Whenever you issue a vos command that changes a volume's -status, the Volume Server and VL Server cooperate to keep the volume header -and VLDB synchronized. In rare cases, the header and VLDB can diverge, -for instance because a vos operation halts prematurely. For -instructions on resynchronizing them, see Synchronizing the VLDB and Volume Headers. -

    About Mounting Volumes

    - - - -

    To make a volume's contents visible in the cell's file tree and -accessible to users, you mount the volume at a directory location in the AFS -filespace. The association between the volume and its location in the -filespace is called a mount point. An AFS mount point looks -and functions like a regular UNIX file system directory, but structurally it -is more like a symbolic link that tells the Cache Manager the name of the -volume associated with the directory. A mount point looks and acts like -a directory only because the Cache Manager knows how to interpret it. -

    Consider the common case where the Cache Manager needs to retrieve a file -requested by an application program. The Cache Manager traverses the -file's complete pathname, starting at the AFS root (by convention mounted -at the /afs directory) and continuing to the file. When the -Cache Manager encounters (or crosses) a mount point during the -traversal, it reads it to learn the name of the volume mounted at that -directory location. After obtaining location information about the -volume from the Volume Location (VL) Server, the Cache Manager fetches the -indicated volume and opens its root directory. The root -directory of a volume lists all the files, subdirectories, and mount -points that reside in it. The Cache Manager scans the root directory -listing for the next element in the pathname. It continues down the -path, using this method to interpret any other mount points it encounters, -until it reaches the volume that houses the requested file. - - -

    Mount points act as the glue that connects the AFS file space, creating the -illusion of a single, seamless file tree even when volumes reside on many -different file server machines. A volume's contents are visible -and accessible when the volume is mounted at a directory location, and are not -accessible at all if the volume is not mounted. -

    You can mount a volume at more than one location in the file tree, but this -is not recommended for two reasons. First, it distorts the hierarchical -nature of the filespace. Second, the Cache Manager can become confused -about which pathname it followed to reach the file (causing unpredictable -output from the pwd command, for example). However, if you -mount a volume at more than one directory, the access control list (ACL) -associated with the volume's root directory applies to all of the mount -points. - - -

    There are several types of mount points, each of which the Cache Manager -handles in a different way and each of which is appropriate for a different -purpose. See Mounting Volumes. -

    About Volume Names

    - - -

    A read/write volume's name can be up to 22 characters in -length. The Volume Server automatically adds the -.readonly and .backup extensions to -read-only and backup volumes respectively. Do not explicitly add the -extensions to volume names, even if they are appropriate. -

    It is conventional for a volume's name to indicate the type of data it -houses. For example, it is conventional to name all user volumes -user.username where username is the -user's login name. Similarly, many cells elect to put system -binaries in volumes with names that begin with the system type code. -For a list of other naming conventions, see Creating Volumes to Simplify Administration. - - -


    Creating Read/write Volumes

    - - - -

    A read/write volume is the most basic type of volume, and must exist before -you can create read-only or backup versions of it. When you issue the -vos create command to create a read/write volume, the VL Server -creates a VLDB entry for it which records the name you specify, assigns a -read/write volume ID number, and reserves the next two consecutive volume ID -numbers for read-only and backup versions that possibly are to be created -later. At the same time, the Volume Server creates a volume header at -the site you designate, allocating space on disk to record the name of the -volume's root directory. The name is filled in when you issue the -fs mkmount command to mount the volume, and matches the mount point -name. The following is also recorded in the volume header: -

      -

    • An initial ACL associated with the volume's root directory. By -default it grants all seven AFS access permissions to the -system:administrators group. After you mount the -volume, you can use the fs setacl command to add other entries and -to remove or change the entry for the system:administrators -group. See Setting ACL Entries. - - -

    • A space quota, which limits the amount of disk space the read/write -version of the volume can use on the file server partition. The default -is of 5000 kilobyte blocks, but you can use the -maxquota argument -to the vos create command to set a different quota. -

      To change the quota after creation, use the fs setquota command -as described in Setting and Displaying Volume Quota and Current Size. - - -

    -

    To create (and mount) a read/write volume

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that you have the a (administer), -i (insert), and l (lookup) -permissions on the ACL of the directory where you plan to mount the -volume. If necessary, issue the fs listacl command, which is -fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. - - -

    3. Select a site (disk partition on a file server machine) for the -new volume. To verify that the site has enough free space to house the -volume (now, or if it grows to use its entire quota), issue the vos -partinfo command. -
      Note:The partition-related statistics in this command's output do not always -agree with the corresponding values in the output of the standard UNIX -df command. The statistics reported by this command can be -up to five minutes old, because the Cache Manager polls the File Server for -partition information at that frequency. Also, on some operating -systems, the df command's report of partition size includes -reserved space not included in this command's calculation, and so is -likely to be about 10% larger. -
      -
         % vos partinfo <machine name> [<partition name>]
      -   
      -
      -

      where -

      -

      p -
      Is the shortest acceptable abbreviation of partinfo. -

      machine name -
      Specifies the file server machine for which to display partition size and -usage. -

      partition name -
      Names one partition for which to display partition size and usage. -If you omit it, the output displays the size and space available for all -partitions on the machine. -
      -

    4. Select a volume name, taking note of the information in About Volume Names. - - -

    5. Issue the vos create command to create the -volume. -
         
      -   % vos create <machine name> <partition name> <volume name>  \
      -                [-maxquota <initial quota (KB)>]
      -   
      -
      -

      where -

      -

      cr -
      Is the shortest acceptable abbreviation of create. -

      machine name -
      Specifies the file server machine on which to place the volume. -

      partition name -
      Specifies the disk partition on which to place the volume. -

      volume name -
      Names the volume. It can be up to 22 alphanumeric and punctuation -characters in length. Your cell possibly has naming conventions for -volumes, such as beginning user volume names with the string user -and using the period to separate parts of the name. -

      -maxquota -
      Sets the volume's quota, as a number of kilobyte blocks. If -you omit this argument, the quota is set to 5000 kilobyte blocks. -
      - - - - -

    6. (Optional) Issue the fs mkmount command -to mount the volume in the filespace. For complete syntax, see To create a regular or read/write mount point. -
         
      -   % fs mkmount <directory> <volume name> 
      -   
      -
      -

    7. (Optional) Issue the fs lsmount command to verify -that the mount point refers to the correct volume. Complete -instructions appear in To display a mount point. -
         
      -   % fs lsmount <directory>
      -   
      -
      -

    8. (Optional) Issue the fs setvol command with the --offlinemsg argument to record auxiliary information about the -volume in its volume header. For example, you can record who owns the -volume or where you have mounted it in the filespace. To display the -information, use the fs examine command. -
         % fs setvol <dir/file path> -offlinemsg <offline message>
      -
      -

      where -

      -

      sv -
      Is an acceptable alias for setvol (and setv the -shortest acceptable abbreviation). -

      dir/file path -
      Names the mount point of the volume with which to associate the -message. Partial pathnames are interpreted relative to the current -working directory. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to change a read-only volume. By convention, -you indicate the read/write path by placing a period before the cell name at -the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      -offlinemsg -
      Specifies up to 128 characters of auxiliary information to record in the -volume header. -
      -
    -

    About Clones and Cloning

    - - - - -

    To create a backup or read-only volume, the Volume Server begins by -cloning the read/write source volume to create a -clone. The Volume Server creates the clone automatically -when you issue the vos backup or vos backupsys command -(for a backup volume) or the vos release command (for a read-only -volume). No special action is required on your part. -

    A clone is not a copy of the data in the read/write source volume, but -rather a copy of the read/write volume's vnode index. -The vnode index is a table of pointers between the files and directories in -the volume and the physical disk blocks on the partition where the data -resides. From the clone, backup and read-only volumes are created in -the following manner: -

      -

    • A read-only volume that occupies the same partition as its read/write -source (also known as a read-only clone), and a backup volume, are -created by attaching a volume header to the clone. These volumes -initially consume very little disk space, because the clone portion (the vnode -index) points to exactly the same files as the read/write volume, as -illustrated in Figure 1. The file sharing is possible only because the clone -is on the same partition as the read/write source volume. When a file -in the read/write volume is deleted, it is not actually removed from the -partition, because the backup or read-only clone still points to it. -Similarly, when a file in the read/write is changed, the entire original file -is preserved on disk because the clone still points to it, and the read/write -volume's vnode index changes to point to newly space for the changed -file. When this happens, the backup or read-only volume is said to grow -or start occupying actual disk space. -

    • A read-only volume that does not occupy the same site as the read/write -source is a copy of the clone and of all of the data in the read/write source -volume. It occupies the same amount of disk space as the read/write -volume did at the time the read-only volume was created. -
    -

    Figure 1. File Sharing Between the Read/write Source and a Clone Volume
    -

    -
    File Sharing Between the Read/write Source and a Clone Volume

    -
    - - - - - - - -


    Replicating Volumes (Creating Read-only Volumes)

    -

    Replication refers to creating a read-only copy -of a read/write volume and distributing the copy to one or more additional -file server machines. Replication makes a volume's contents -accessible on more than one file server machine, which increases data -availability. It can also increase system efficiency by reducing load -on the network and File Server. Network load is reduced if a client -machine's server preference ranks lead the Cache Manager to access the -copy of a volume stored on the closest file server machine. Load on the -File Server is reduced because it issues only one callback for all data -fetched from a read-only volume, as opposed to a callback for each file -fetched from a read/write volume. The single callback is sufficient for -an entire read-only volume because the volume does not change except in -response to administrator action, whereas each read/write file can change at -any time. - - - - - -

    Replicating a volume requires issuing two commands. First, use the -vos addsite command to add one or more read-only site definitions -to the volume's VLDB entry (a site is a particular partition -on a file server machine). Then use the vos release command -to clone the read/write source volume and distribute the clone to the defined -read-only sites. You issue the vos addsite only once for -each read-only site, but must reissue the vos release command every -time the read/write volume's contents change and you want to update the -read-only volumes. -

    For users to have a consistent view of the file system, the release of -updated volume contents to read-only sites must be atomic: either all -read-only sites receive the new version of the volume, or all sites keep the -version they currently have. The vos release command is -designed to ensure that all copies of the volume's read-only version -match both the read/write source and each other. In cases where -problems such as machine or server process outages prevent successful -completion of the release operation, AFS uses two mechanisms to alert -you. - - - - - - - - - - - - - - -

    First, the command interpreter generates an error message on the standard -error stream naming each read-only site that did not receive the new volume -version. Second, during the release operation the Volume Location (VL) -Server marks site definitions in the VLDB entry with flags (New -release and Old release) that indicate whether or not the -site has the new volume version. If any flags remain after the -operation completes, it was not successful. The Cache Manager refuses -to access a read-only site marked with the Old release flag, which -potentially imposes a greater load on the sites marked with the New -release flag. It is important to investigate and eliminate the -cause of the failure and then to issue the vos release command as -many times as necessary to complete the release without errors. -

    The pattern of site flags remaining in the volume's VLDB entry after a -failed release operation can help determine the point at which the operation -failed. Use the vos examine or vos listvldb -command to display the VLDB entry. The VL Server sets the flags in -concert with the Volume Server's operations, as follows: -

      -

    1. Before the operation begins, the VL Server sets the New release -flag on the read/write site definition in the VLDB entry and the Old -release flag on read-only site definitions (unless the read-only site -has been defined since the last release operation and has no actual volume, in -which case its site flag remains Not released). -

    2. If necessary, the Volume Server creates a temporary copy (a -clone) of the read/write source called the ReleaseClone (see the -following discussion of when the Volume Server does or does not create a new -ReleaseClone.) It assigns the ReleaseClone its own volume ID number, -which the VL Server records in the RClone field of the source -volume's VLDB entry. -

    3. The Volume Server distributes a copy of the ReleaseClone to each read-only -site defined in the VLDB entry. As the site successfully receives the -new clone, the VL Server sets the site's flag in the VLDB entry to -New release. -

    4. When all the read-only copies are successfully released, the VL Server -clears all the New release site flags. The ReleaseClone is -no longer needed, so the Volume Server deletes it and the VL Server erases its -ID from the VLDB entry. -
    -

    By default, the Volume Server determines automatically whether or not it -needs to create a new ReleaseClone: -

      -

    • If there are no flags (New release, Old release, or -Not released) on site definitions in the VLDB entry, the previous -vos release command completed successfully and all read-only sites -currently have the same volume. The Volume Server infers that the -current vos release command was issued because the read/write -volume has changed. The Volume Server creates a new ReleaseClone and -distributes it to all of the read-only sites. -

    • If any site definition in the VLDB entry is marked with a flag, either the -previous release operation did not complete successfully or a new read-only -site was defined since the last release. The Volume Server does not -create a new ReleaseClone, instead distributing the existing ReleaseClone to -sites marked with the Old release or Not released -flag. As previously noted, the VL Server marks each VLDB site -definition with the New release flag as the site receives the -ReleaseClone, and clears all flags after all sites successfully receive -it. -
    -

    To override the default behavior, forcing the Volume Server to create and -release a new ReleaseClone to the read-only sites, include the -f -flag. This is appropriate if, for example, the data at the read/write -site has changed since the existing ReleaseClone was created during the -previous release operation. -

    Using Read-only Volumes Effectively

    - - - - -

    For maximum effectiveness, replicate only volumes that satisfy two -criteria: -

      -

    • The volume's contents are heavily used. Examples include a -volume housing binary files for text editors or other popular application -programs, and volumes mounted along heavily traversed directory paths such as -the paths leading to user home directories. It is an inefficient use of -disk space to replicate volumes for which the demand is low enough that a -single File Server can easily service all requests. -

    • The volume's contents change infrequently. As noted, file -system consistency demands that the contents of read-only volumes must match -each other and their read/write source at all times. Each time the -read/write volume changes, you must issue the vos release command -to update the read-only volumes. This can become tedious (and easy to -forget) if the read/write volume changes frequently. -
    - - -

    Explicitly mounting a read-only volume (creating a mount point that names a -volume with a .readonly extension) is not generally -necessary or appropriate. The Cache Manager has a built-in bias to -access the read-only version of a replicated volume whenever possible. -As described in more detail in The Rules of Mount Point Traversal, when the Cache Manager encounters a mount point it reads -the volume name inside it and contacts the VL Server for a list of the sites -that house the volume. In the normal case, if the mount point resides -in a read-only volume and names a read/write volume (one that does not have a -.readonly or .backup extension), the Cache -Manager always attempts to access a read-only copy of the volume. Thus -there is normally no reason to force the Cache Manager to access a read-only -volume by mounting it explicitly. -

    It is a good practice to place a read-only volume at the read/write site, -for a couple of reasons. First, the read-only volume at the read/write -site requires only a small amount of disk space, because it is a clone rather -a copy of all of the data (see About Clones and Cloning). Only if a large number of files are removed or -changed in the read/write volume does the read-only copy occupy much disk -space. That normally does not happen because the appropriate response -to changes in a replicated read/write volume is to reclone it. The -other reason to place a read-only volume at the read/write site is that the -Cache Manager does not attempt to access the read/write version of a -replicated volume if all read-only copies become inaccessible. If the -file server machine housing the read/write volume is the only accessible -machine, the Cache Manager can access the data only if there is a read-only -copy at the read/write site. -

    The number of read-only sites to define depends on several factors. -Perhaps the main trade-off is between the level of demand for the -volume's contents and how much disk space you are willing to use for -multiple copies of the volume. Of course, each prospective read-only -site must have enough available space to accommodate the volume. The -limit on the number of read-only copies of a volume is determined by the -maximum number of site definitions in a volume's VLDB entry, which is -defined in the AFS Release Notes. The site housing the -read/write and backup versions of the volume counts as one site, and each -read-only site counts as an additional site (even the read-only site defined -on the same file server machine and partition as the read/write site counts as -a separate site). Note also that the Volume Server permits only one -read-only copy of a volume per file server machine. -

    Replication Scenarios

    - - - -

    The instructions in the following section explain how to replicate a volume -for which no read-only sites are currently defined. However, you can -also use the instructions in other common situations: -

      -

    • If you are releasing a new clone to sites that already exist, you can skip -Step 2. It can still be useful to issue the vos -examine command, however, to verify that the desired read-only sites are -defined. -

    • If you are adding new read-only sites to existing ones, perform all of the -steps. In Step 3, issue the vos addsite command for the new sites -only. -

    • If you are defining sites but do not want to release a clone to them yet, -stop after Step 3 and continue when you are ready. -

    • If you are removing one or more sites before releasing a new clone to the -remaining sites, follow the instructions for site removal in Removing Volumes and their Mount Points and then start with Step 4. -
    -

    To replicate a read/write volume (create a read-only volume)

    - - -
      -

    1. Verify that you are listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Select one or more sites at which to replicate the -volume. There are several factors to consider: -
        -

      • How many sites are already defined. As previously noted, it is -usually appropriate to define a read-only site at the read/write site. -Also, the Volume Server permits only one read-only copy of a volume per file -server machine. To display the volume's current sites, issue the -vos examine command, which is described fully in Displaying One Volume's VLDB Entry and Volume Header. -
           
        -   % vos examine <volume name or  ID>
        -    
        -
        -

        The final lines of output display the volume's site definitions from -the VLDB. -

      • Whether your cell dedicates any file server machines to housing read-only -volumes only. In general, only very large cells use read-only server -machines. -

      • Whether a site has enough free space to accommodate the volume. A -read-only volume requires the same amount of space as the read/write version -(unless it is at the read/write site itself). The first line of output -from the vos examine command displays the read/write volume's -current size in kilobyte blocks, as shown in Displaying One Volume's VLDB Entry and Volume Header. -

        To display the amount of space available on a file server machine's -partitions, use the vos partinfo command, which is described fully -in Creating Read/write Volumes. -

           
        -   % vos partinfo <machine name> [<partition name>]
        -   
        -
        -
      - - - - - - -

    3. Issue the vos addsite command to define each new -read-only site in the VLDB. -
         
      -   % vos addsite <machine name> <partition name> <volume name or ID>
      -   
      -
      -

      where -

      -

      ad -
      Is the shortest acceptable abbreviation of addsite. -

      machine name -
      Defines the file server machine for the new site. -

      partition name -
      Names a disk partition on the machine machine name. -

      volume name or ID -
      Identifies the read/write volume to be replicated, either by its complete -name or its volume ID number. -
      -

    4. (Optional) Verify that the fs process -(which incorporates the Volume Server) is functioning normally on each file -server machine where you have defined a read-only site, and that the -vlserver process (the Volume Location Server) is functioning -correctly on each database server machine. Knowing that they are -functioning eliminates two possible sources of failure for the release. -Issue the bos status command on each file server machine housing a -read-only site for this volume and on each database server machine. The -command is described fully in Displaying Process Status and Information from the BosConfig File. -
         
      -   % bos status <machine name> fs vlserver
      -   
      -
      - - - - -

    5. Issue the vos release command to clone the -read/write source volume and distribute the clone to each read-only -site. -
         
      -   % vos release <volume name or ID> [-f]
      -   
      -
      -

      where -

      -

      rel -
      Is the shortest acceptable abbreviation of release. -

      volume name or ID -
      Identifies the read/write volume to clone, either by its complete name or -volume ID number. The read-only version is given the same name with a -.readonly extension. All read-only copies share the -same read-only volume ID number. -

      -f -
      Creates and releases a brand new clone. -
      -

    6. (Optional) Issue the vos examine command -to verify that no site definition in the VLDB entry is marked with an Old -release or New release flag. The command is described -fully in Displaying One Volume's VLDB Entry and Volume Header. -
         
      -   % vos examine <volume name or ID>
      -   
      -
      -
    -

    If any flags appear in the output from Step 6, repeat Steps 4 and 5 until the Volume Server -does not produce any error messages during the release operation and the flags -no longer appear. Do not issue the vos release command when -you know that the read/write site or any read-only site is inaccessible due to -network, machine or server process outage. -


    Creating Backup Volumes

    - - - - - -

    A backup volume is a clone that resides at the same site as its -read/write source (to review the concept of cloning, see About Clones and Cloning). Creating a backup version of a volume has two -purposes: -

      -

    • It is by convention the first step when dumping a volume's contents -to tape with the AFS Backup System. A volume is inaccessible while it -is being dumped, so instead of dumping the read/write volume, you create and -dump a backup version. Users do not normally access the backup version, -so it is unlikely that the dump will disturb them. For more details, -see Backing Up Data. -

    • It enables users to restore mistakenly deleted or changed data themselves, -freeing you for more crucial tasks. The backup version captures the -state of its read/write source at the time the backup is made, and its -contents cannot change. Mount the backup version in the filespace so -that users can restore a file to its state at the time you made the -backup. See Making the Contents of Backup Volumes Available to Users. -
    - - - -

    Backing Up Multiple Volumes at Once

    -

    The vos backupsys command creates a backup -version of many read/write volumes at once. This command is useful when -preparing for large-scale backups to tape using the AFS Backup System. -

    To clone every read/write volume listed in the VLDB, omit all of the -command's options. Otherwise, combine the command's options -to clone various groups of volumes. The options use one of two basic -criteria to select volumes: location (the -server and --partition arguments) or presence in the volume name of one of a -set of specified character strings (the -prefix, --exclude, and -xprefix options). -

    To clone only volumes that reside on one file server machine, include the --server argument. To clone only volumes that reside on one -partition, combine the -server and -partition -arguments. The -partition argument can also be used alone to -clone volumes that reside on the indicated partition on every file server -machine. These arguments can be combined with those that select volumes -based on their names. -

    Combine the -prefix, -exclude, and --xprefix options (with or without the -server and --partition arguments) in the indicated ways to select volumes based -on character strings contained in their names: -

      -

    • To clone every read/write volume at the specified location whose name -includes one of a set of specified character strings (for example, begins with -user. or includes the string afs), use the --prefix argument or combine the -xprefix and --exclude options. -

    • To clone every read/write volume at the specified location except those -whose name includes one of a set of specified character strings, use the --xprefix argument or combine the -prefix and --exclude options. -

    • To clone every read/write volume at the specified location whose name -includes one of one of a set of specified character strings, except those -whose names include one of a different set of specified character strings, -combine the -prefix and -xprefix arguments. The -command creates a list of all volumes that match the -prefix -argument and then removes from the list the volumes that match the --xprefix argument. For effective results, the strings -specified by the -xprefix argument must designate a subset of the -volumes specified by the -prefix argument. -

      If the -exclude flag is combined with the -prefix and --xprefix arguments, the command creates a list of all volumes that -do not match the -prefix argument and then adds to the list any -volumes that match the -xprefix argument. As when the --exclude flag is not used, the result is effective only if the -strings specified by the -xprefix argument designate a subset of -the volumes specified by the -prefix argument. -

    -

    The -prefix and -xprefix arguments both accept -multiple values, which can be used to define disjoint groups of -volumes. Each value can be one of two types: -

      -

    1. A simple character string, which matches volumes whose name begin with the -string. All characters are interpreted literally (that is, characters -that potentially have special meaning to the command shell, such as the -period, have only their literal meaning). -

    2. A regular expression, which matches volumes whose names contain the -expressions. Place a caret ( ^ ) at the -beginning of the expression, and enclose the entire string in single quotes -(' '). Explaining regular -expressions is outside the scope of this reference page; see the UNIX -manual page for regexp(5) or (for a brief introduction) Defining and Displaying Volume Sets and Volume Entries. As an example, the following expression matches -volumes that have the string aix anywhere in their names: -
         -prefix  '^.*aix'
      -
      -
    -

    To display a list of the volumes to be cloned, without actually cloning -them, include the -dryrun flag. To display a statement that -summarizes the criteria being used to select volume, include the --verbose flag. -

    To back up a single volume, use the vos backup command, which -employs a more streamlined technique for finding a single volume. - - - - - - -

    Automating Creation of Backup Volumes

    -

    Most cells find that it is best to make a new backup version -of relevant volumes each day. It is best to create the backup versions -at a time when usage is low, because the backup operation causes the -read/write volume to be unavailable momentarily. -

    You can either issue the necessary the vos backupsys or vos -backup commands at the console or create a cron entry in the -BosConfig file on a file server machine, which eliminates the need -for an administrator to initiate the backup operation. -

    The following example command creates a cron process called -backupusers in the /usr/afs/local/BosConfig file on the -machine fs3.abc.com. The process runs every -day at 1:00 a.m. to create a backup version of every -volume in the cell whose name starts with the string user. -The -localauth flag enables the process to invoke the privileged -vos backupsys command while unauthenticated. Note that the --cmd argument specifies a complete pathname for the vos -binary, because the PATH environment variable for the BOS Server (running as -the local superuser root) generally does not include the path to -AFS binaries. -

       
    -   % bos create fs3.abc.com backupusers cron  \
    -     -cmd "/usr/afs/bin/vos backupsys  -prefix user -localauth" "1:00"
    -    
    -
    - - - -

    Making the Contents of Backup Volumes Available to Users

    -

    As noted, a backup volume preserves the state of the -read/write source at the time the backup is created. Many cells choose -to mount backup volumes so that users can access and restore data they have -accidentally deleted or changed since the last backup was made, without having -to request help from administrators. The most sensible place to mount -the backup version of a user volume is at a subdirectory of the user's -home directory. Suitable names for this directory include -OldFiles and Backup. The subdirectory looks just -like the user's own home directory as it was at the time the backup was -created, with all files and subdirectories in the same relative -positions. -

    If you do create and mount backup volumes for your users, inform users of -their existence. The AFS User Guide does not mention backup -volumes because making them available to users is optional. Explain to -users how often you make a new backup, so they know what they can -recover. Remind them also that the data in their backup volume cannot -change; however, they can use the standard UNIX cp command to -copy it into their home volume and modify it there. Reassure users that -the data in their backup volumes does not count against their read/write -volume quota. -

    To create and mount a backup volume

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that you have the insert (i) and -administer (a) permissions on the ACL of the directory -in which you wish to mount the volume. If necessary, issue the fs -listacl command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. - - -

    3. Issue the vos backup command to create a backup -version of a read/write source volume. The message shown confirms the -success of the backup operation. -
         
      -   % vos backup <volume name or ID>
      -   Created backup volume for volume name or ID
      -   
      -
      -

      where -

      -

      backup -
      Must be typed in full. -

      volume name or ID -
      Identifies the read/write volume to back up, either by its complete name -or volume ID number. The backup volume has the same name with the -addition of the .backup extension. It has its own -volume ID number. -
      - - -

    4. (Optional) Issue the fs mkmount to mount -the backup volume. While this step is optional, Cache Managers cannot -access the volume's contents if it is not mounted. -
         
      -   % fs mkmount <directory> <volume name>.backup
      -   
      -
      -

      where -

      -

      mk -
      Is the shortest acceptable abbreviation of mkmount. -

      directory -
      Names the mount point to create. Do not create a file or directory -of the same name beforehand. Partial pathnames are interpreted relative -to the current working directory. For the backup version of a user -volume, the conventional location is the user's home directory. -

      volume name.backup -
      Is the full name of the backup volume. -
      -

    5. (Optional) Issue the fs lsmount command to verify -that the mount point refers to the correct volume. Complete -instructions appear in To display a mount point. -
         
      -   % fs lsmount <directory>
      -   
      -
      -
    - - -

    To create multiple backup volumes at once

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos backupsys command to create a backup version of -every read/write volume that shares the same prefix or site. The -effects of combining the three arguments are described in Backing Up Multiple Volumes at Once. -
         % vos backupsys [-prefix <common prefix on volume(s)>+]   \
      -        [-server <machine name>] [-partition <partition name>]  \
      -        [-exclude]   [-xprefix <negative prefix on volume(s)>+] 
      -        [-dryrun]  [-verbose]
      -   
      -
      -

      where -

      -

      backups -
      Is the shortest acceptable abbreviation of backupsys. -

      -prefix -
      Specifies one or more simple character strings or regular expressions of -any length; a volume whose name includes the string is placed on the list -of volumes to be cloned. Include field separators (such as periods) if -appropriate. This argument can be combined with any combination of the --server, -partition, -exclude, and --xprefix options. -

      -server -
      Specifies the file server machine housing the volumes to backup. -Can be combined with any combination of the -prefix, --partition, -exclude, and -xprefix -options. -

      -partition -
      Specifies the partition housing the volumes you wish to backup. Can -be combined with any combination of the -prefix, --server, -exclude, and -xprefix -options. -

      -exclude -
      Indicates that all volumes except those indicated with the --prefix argument are to be backed up. The -prefix -argument must be provided along with this one. Can also be combined -with any combination of the -prefix, -server, and --partition arguments; or with both the -prefix and --xprefix arguments, but not with the -xprefix argument -alone. -

      -xprefix -
      Specifies one or more simple character strings or regular expressions of -any length; a volume whose name does not include the string is placed on -the list of volumes to be cloned. Can be combined with any combination -of the -prefix, -server, and -partition -arguments; in addition, it can be combined with both the --prefix and -exclude options, but not with the --exclude flag alone. -

      -dryrun -
      Displays on the standard output stream a list of the volumes to be cloned, -without actually cloning them. -

      -verbose -
      Displays on the standard output stream a statement that summarizes the -criteria being used to select volumes, if combined with the -dryrun -flag; otherwise, traces the cloning operation for each volume. -
      -
    -

    Mounting Volumes

    - -

    Mount points make the contents of AFS volumes visible and accessible in the -AFS filespace, as described in About Mounting Volumes. This section discusses in more detail how the Cache -Manager handles mount points as it traverses the filespace. It -describes the three types of mount points, their purposes, and how to -distinguish between them, and provides instructions for creating, removing, -and examining mount points. -

    The Rules of Mount Point Traversal

    -

    The Cache Manager observes three basic rules as it traverses -the AFS filespace and encounters mount points: -

      -

    • Rule 1: Access Backup and Read-only Volumes When -Specified -

      When the Cache Manager encounters a mount point that specifies a volume -with either a .readonly or a .backup -extension, it accesses that type of volume only. If a mount point does -not have either a .backup or .readonly -extension, the Cache Manager uses Rules 2 and 3. -

      For example, the Cache Manager never accesses the read/write version of a -volume if the mount point names the backup version. If the specified -version is inaccessible, the Cache Manager reports an error. -

    • Rule 2: Follow the Read-only Path When Possible -

      If a mount point resides in a read-only volume and the volume that it -references is replicated, the Cache Manager attempts to access a read-only -copy of the volume; if the referenced volume is not replicated, the Cache -Manager accesses the read/write copy. The Cache Manager is thus said to -prefer a read-only path through the filespace, accessing read-only -volumes when they are available. -

      The Cache Manager starts on the read-only path in the first place because -it always accesses a read-only copy of the root.afs volume -if it exists; the volume is mounted at the root of a cell's AFS -filespace (named /afs by convention). That is, if the -root.afs volume is replicated, the Cache Manager attempts to -access a read-only copy of it rather than the read/write copy. This -rule then keeps the Cache Manager on a read-only path as long as each -successive volume is replicated. The implication is that both the -root.afs and root.cell volumes must be -replicated for the Cache Manager to access replicated volumes mounted below -them in the AFS filespace. The volumes are conventionally mounted at -the /afs and /afs/cellname directories, -respectively. -

    • Rule 3: Once on a Read/write Path, Stay There -

      If a mount point resides in a read/write volume and the volume name does -not have a .readonly or a .backup -extension, the Cache Manager attempts to access only the a read/write version -of the volume. The access attempt fails with an error if the read/write -version is inaccessible, even if a read-only version is accessible. In -this situation the Cache Manager is said to be on a read/write path -and cannot switch back to the read-only path unless mount point explicitly -names a volume with a .readonly extension. (Cellular -mount points are an important exception to this rule, as explained in the -following discussion. -

    -

    The Three Types of Mount Points

    -

    AFS uses three types of mount points, each appropriate for a -different purpose because of how the Cache Manager handles them. -

      -

    • When the Cache Manager crosses a regular mount point, it obeys -all three of the mount point traversal rules previously described. - - -

      AFS performs best when the vast majority of mount points in the filespace -are regular, because the mount point traversal rules promote the most -efficient use of both replicated and nonreplicated volumes. Because -there are likely to be multiple read-only copies of a replicated volume, it -makes sense for the Cache Manager to access one of them rather than the single -read/write version, and the second rule leads it to do so. If a volume -is not replicated, the third rule means that the Cache Manager still accesses -the read/write volume when that is the only type available. In other -words, a regular mount point does not force the Cache Manager always to access -read-only volumes (it is explicitly not a "read-only mount point"). -

      To create a regular mount point, use the fs mkmount command as -described in To create a regular or read/write mount point. -
      Note:To enable the Cache Manager to access the read-only version of a replicated -volume named by a regular mount point, all volumes that are mounted above it -in the pathname must also be replicated. That is the only way the Cache -Manager can stay on a read-only path to the target volume. -
      -

    • When the Cache Manager crosses a read/write mount point, it -attempts to access only the volume version named in the mount point. If -the volume name is the base (read/write) form, without a -.readonly or .backup extension, the Cache -Manager accesses the read/write version of the volume, even if it is -replicated. In other words, the Cache Manager disregards the second -mount point traversal rule when crossing a read/write mount point: it -switches to the read/write path through the filespace. - - -

      It is conventional to create only one read/write mount point in a -cell's filespace, using it to mount the cell's -root.cell volume just below the AFS filespace root (by -convention, /afs/.cellname). As indicated, -it is conventional to place a period at the start of the read/write mount -point's name (for example, -/afs/.abc.com). The period distinguishes the -read/write mount point from the regular mount point for the -root.cell volume at the same level. This is the only -case in which it is conventional to create two mount points for the same -volume. A desirable side effect of this naming convention for this -read/write mount point is that it does not appear in the output of the UNIX -ls command unless the -a flag is included, essentially -hiding it from regular users who have no use for it. -

      The existence of a single read/write mount point at this point in the -filespace provides access to the read/write version of every volume when -necessary, because it puts the Cache Manager on a read/write path right at the -top of the filespace. At the same time, the regular mount point for the -root.cell volume puts the Cache Manager on a read-only path -most of the time. -

      Using a read/write mount point for a read-only or backup volume is -acceptable, but unnecessary. The first rule of mount point traversal -already specifies that the Cache Manager accesses them if the volume name in a -regular mount point has a .readonly or -.backup extension. -

      To create a read/write mount point, use the -rw flag on the -fs mkmount command as described in To create a regular or read/write mount point. -

    • When the Cache Manager crosses a cellular mount point, it -accesses the indicated volume in the specified cell, which is normally a -foreign cell. (If the mount point does not name a cell along with the -volume, the Cache Manager accesses the volume in the cell where the mount -point resides.) When crossing a regular cellular mount point, the Cache -Manager disregards the third mount point traversal rule. Instead, it -accesses a read-only version of the volume if it is replicated, even if the -volume that houses the mount point is read/write. -

      It is inappropriate to circumvent this behavior by creating a read/write -cellular mount point, because traversing the read/write path imposes an unfair -load on the foreign cell's file server machines. The File Server -must issue a callback for each file fetched from the read/write volume, rather -than single callback required for a read-only volume. In any case, only -a cell's own administrators generally need to access the read/write -versions of replicated volumes. - - - -

      It is conventional to create cellular mount points only at the second level -in a cell's filespace, using them to mount foreign cells' -root.cell volumes just below the AFS filespace root (by -convention, at /afs/foreign_cellname). The mount -point enables local users to access the foreign cell's filespace, -assuming they have the necessary permissions on the ACL of the volume's -root directory and that there is an entry for the foreign cell in each local -client machine's /usr/vice/etc/CellServDB file, as described -in Maintaining Knowledge of Database Server Machines. -

      Creating cellular mount points at other levels in the filespace and -mounting foreign volumes other than the root.cell volume is -not generally appropriate. It can be confusing to users if the Cache -Manager switches between cells at various points in a pathname. -

      To create a regular cellular mount point, use the -cell argument -to specify the cell name, as described in To create a cellular mount point. -

    -

    To examine a mount point, use the fs lsmount command as -described in To display a mount point. The command's output uses distinct notation to -identify regular, read/write, and cellular mount points. To remove a -mount point, use the fs rmmount command as described in To remove a mount point. -

    Creating a mount point in a foreign cell

    -

    Creating a mount point in a foreign cell's filespace (as opposed -to mounting a foreign volume in the local cell) is basically the same as -creating a mount point in the local filespace. The differences are that -the fs mkmount command's directory argument specifies -a pathname in the foreign cell rather than the local cell, and you must have -the required permissions on the ACL of the foreign directory where you are -creating the mount point. The fs mkmount command's --cell argument always specifies the cell in which the volume -resides, not the cell in which to create the mount point. -

    To display a mount point

    - - - - - - -
      -

    1. Issue the fs lsmount command. -
         
      -   % fs lsmount <directory>
      -   
      -
      -

      where -

      -

      ls -
      Is the shortest acceptable abbreviation of lsmount. -

      directory -
      Names the mount point to display. -
      -
    -

    If the specified directory is a mount point, the output is of the following -form: -

       'directory' is a mount point for volume 'volume name'
    -   
    -
    -

    For a regular mount point, a number sign (#) precedes the -volume name string, as in the following example command issued on a -client machine in the abc.com cell. -

       
    -   % fs lsmount /afs/abc.com/usr/terry
    -   '/afs/abc.com/usr/terry' is a mount point for volume '#user.terry'
    -      
    -
    -

    For a read/write mount point, a percent sign (%) precedes the -volume name string, as in the following example command issued on a -client machine in the abc.com cell. The cell's -administrators have followed the convention of preceding the read/write mount -point's name with a period. -

       
    -   % fs lsmount /afs/.abc.com 
    -   '/afs/.abc.com' is a mount point for volume '%root.cell'
    -   
    -
    -

    For a cellular mount point, a cell name and colon (:) -follow the number or percent sign and precede the volume name string, -as in the following example command issued on a client machine in the -abc.com cell. -

       
    -    % fs lsmount /afs/ghi.gov 
    -   '/afs/ghi.gov' is a mount point for volume '#ghi.gov:root.cell'
    -   
    -
    -

    For a symbolic link to a mount point, the output is of the form shown in -the following example command issued on a client machine in the -abc.com cell. -

       
    -   % fs lsmount /afs/abc
    -   '/afs/abc' is a symbolic link, leading to a mount point for volume '#root.cell'
    -   
    -
    -

    If the directory is not a mount point or is not in AFS, the output reads as -follows. -

       'directory' is not a mount point.
    -   
    -
    -

    If the output is garbled, it is possible that the mount point has become -corrupted in the local cache. Use the fs flushmount command -as described in To flush one or more mount points. This forces the Cache Manager to refetch the mount -point. -

    To create a regular or read/write mount point

    - - - - - - -
      -

    1. Verify that you have the i (insert) and a -(administer) permissions on the ACL of the directory where you are -placing the mount point. If necessary, issue the fs listacl -command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. Issue the fs mkmount command to create the mount point. -Include the -rw flag if creating a read/write mount point. -
         
      -   % fs mkmount <directory> <volume name>  [-rw]
      -   
      -
      -

      where -

      -

      mk -
      Is the shortest acceptable abbreviation for mkmount. -

      directory -
      Names the mount point to create. A file or directory with the same -name cannot already exist. A partial pathname is interpreted relative -to the current working directory. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to create a new mount point in a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      volume name -
      Specifies the volume's full name, including the -.backup or .readonly extension for a -backup or read-only volume, if appropriate. -

      -rw -
      Creates a read/write mount point. -
      -
    -

    To create a cellular mount point

    - - - -
      -

    1. Verify that you have the i (insert) and a -(administer) permissions on the ACL of the directory where you are -placing the mount point. If necessary, issue the fs listacl -command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. If you are mounting one or more foreign cells' -root.cell volume at the second level in your filespace and -your cell's root.afs volume is replicated, you must -create a temporary mount point for the root.afs -volume's read/write version in a directory on which the ACL grants you -the i and a permissions. The following command -creates a mount point called new_cells in your cell's -/afs/.cellname directory (the entry point to the -read/write path in your cell). -

      Substitute your cell's name for cellname. -

         
      -   % cd /afs/.cellname
      -   
      -   % fs  mkmount  new_cells  root.afs
      - 
      -   % cd  new_cells
      -   
      -
      -

    3. Issue the fs mkmount command with the -cell argument -to create a cellular mount point. Repeat the command for each cellular -mount point as required. -
         
      -   % fs mkmount <directory> <volume name> -cell <cell name>
      -   
      -
      -

      where -

      -

      mk -
      Is the shortest acceptable abbreviation for mkmount. -

      directory -
      Names the mount point to create. A file or directory with the same -name cannot already exist. A partial pathname is interpreted relative -to the current working directory. If you are mounting a foreign -cell's root.cell volume, the standard value for this -argument is the cell's complete Internet domain name. -

      volume name -
      Specifies the volume's full name, usually root.cell -for a cellular mount point. -

      -cell -
      Specifies the complete Internet domain name of the cell in which the -volume resides. -
      -

    4. If you performed the instructions in Step 2, issue the vos release command to release the new -version of the root.afs volume to its read-only -sites. (This command requires that you be listed in your cell's -/usr/afs/etc/UserList file. If necessary, verify by issuing -the bos listusers command, which is fully described in To display the users in the UserList file.) -

      Also issue the fs checkvolumes command to force the local Cache -Manager to access the new replica of the root.afs -volume. If desired, you can also remove the temporary -new_cells mount point from the -/afs/.cellname directory. -

           
      -   % vos release root.afs
      -   
      -   %  fs checkvolumes
      -   
      -   % cd /afs/.cellname
      -    
      -   % fs rmmount new_cells
      -   
      -   
      -
      -

      For your users to access a newly mounted foreign cell, you must also create -an entry for it in each client machine's local -/usr/vice/etc/CellServDB file and either reboot the machine or use -the fs newcell command to insert the entry directly into its kernel -memory. See the instructions in Maintaining Knowledge of Database Server Machines. -

    -

    To remove a mount point

    - - - - - -
      -

    1. Verify that you have the d (delete) permission on -the ACL of the directory from which you are removing the mount point. -If necessary, issue the fs listacl command, which is fully -described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

    2. Issue the fs rmmount command to remove the mount point. -The volume still exists, but its contents are inaccessible if this is the only -mount point for it. -
         
      -   % fs rmmount <directory>
      -   
      -
      -

      where -

      -

      rm -
      Is the shortest acceptable abbreviation of rmmount. -

      directory -
      Names the mount point to remove. A partial pathname is interpreted -relative to the current working directory. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to delete a mount point from a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      -
    -

    Displaying Information About Volumes

    - - -

    This section explains how to display information about volumes. If -you know a volume's name or volume ID number, there are commands for -displaying its VLDB entry, its volume header, or both. Other commands -display the name or location of the volume that contains a specified file or -directory. -

    For instructions on displaying a volume's quota, see Setting and Displaying Volume Quota and Current Size. -

    Displaying VLDB Entries

    - - - - -

    The vos listvldb command displays the VLDB entry for the volumes -indicated by the combination of arguments you provide. The -possibilities are listed here from most to least inclusive: -

      -

    • To display every entry in the VLDB, provide no arguments. It can -take a long time to generate the output, depending on the number of -entries. -

    • To display every VLDB entry that mentions a specific file server machine -as the site of a volume, specify the machine's name with the --server argument. -

    • To display every VLDB entry that mentions a certain partition on any file -server machine as the site of a volume, specify the partition name with the --partition argument. -

    • To display every VLDB entry that mentions a certain partition on a certain -file server machine as the site of a volume, combine the -server -and -partition arguments. -

    • To display a single VLDB entry, specify a volume name or ID number with -the -name argument. -

    • To display the VLDB entry only for volumes with locked VLDB entries, use -the -locked flag with any of the site definitions mentioned -previously. -
    - - -

    To display VLDB entries

    -
      -

    1. Issue the vos listvldb command. -
         
      -   % vos listvldb  [-name <volume name or ID>] [-server <machine name>] \
      -                  [-partition <partition name>] [-locked]
      -   
      -
      -

      where -

      -

      listvl -
      Is the shortest acceptable abbreviation of listvldb. -

      -name -
      Identifies one volume either by its complete name or volume ID -number. Do not combine this argument with the -server or --partition arguments. -

      -server -
      Specifies a file server machine. Combine this argument with the --partition argument if desired, but not with the -name -argument. -

      -partition -
      Specifies a partition. Combine this argument with the --server argument if desired, but not with the -name -argument. -

      -locked -
      Displays only locked VLDB entries. Combine this flag with any of -the other options. -
      -
    -

    The VLDB entry for each volume includes the following information: -

      -

    • The base (read/write) volume name. The read-only and backup -versions have the same name with a .readonly and -.backup extension, respectively. -

    • The volume ID numbers allocated to the versions of the volume that -actually exist, in fields labeled RWrite for the read/write, -ROnly for the read-only, Backup for the backup, and -RClone for the ReleaseClone. (If a field does not appear, -the corresponding version of the volume does not exist.) The appearance -of the RClone field normally indicates that a release operation did -not complete successfully; the Old release and New -release flags often also appear on one or more of the site definition -lines described just following. - - -

    • The number of sites that house a read/write or read-only copy of the -volume, following the string number of sites ->. - - - - - -

    • A line for each site that houses a read/write or read-only copy of the -volume, specifying the file server machine, partition, and type of volume -(RW for read/write or RO for read-only). If a -backup version exists, it is understood to share the read/write site. -Several flags can appear with a site definition: -
      - -

      Not released -
      Indicates that the vos release command has not been issued -since the vos addsite command was used to define the read-only -site. - -

      Old release -
      Indicates that a vos release command did not complete -successfully, leaving the previous, obsolete version of the volume at this -site. - -

      New release -
      Indicates that a vos release command did not complete -successfully, but that this site did receive the correct new version of the -volume. -
      -

    • If the VLDB entry is locked, the string Volume is currently -LOCKED. -
    -

    For further discussion of the New release and Old -release flags, see Replicating Volumes (Creating Read-only Volumes). -

    An example of this command and its output for a single volume: -

       
    -   % vos listvldb user.terry
    -   user.terry
    -       RWrite: 50489902    Backup: 50489904
    -       number of sites -> 1
    -          server fs3.abc.com partition /vicepc RW Site
    -  
    -
    -

    Displaying Volume Headers

    - - -

    The vos listvol command displays the volume header for every -volume on one or all partitions on a file server machine. The -vos command interpreter obtains the information from the Volume -Server on the specified machine. You can control the amount of -information displayed by including one of the -fast, the --long, or the -extended flags described following the -instructions in To display volume headers. -

    To display a single volume's volume header of one volume only, use the -vos examine command as described in Displaying One Volume's VLDB Entry and Volume Header. - - -

    To display volume headers

    -
      -

    1. Issue the vos listvol command. -
         
      -   % vos listvol <machine name> [<partition name>] [-fast] [-long] [-extended]
      -   
      -
      -

      where -

      -

      listvo -
      Is the shortest acceptable abbreviation of listvol. -

      machine name -
      Names the file server machine for which to display volume headers. -Provide this argument alone or with the partition name -argument. -

      partition name -
      Names one partition on the file server machine named by the machine -name argument, which must be provided along with this one. -

      -fast -
      Displays only the volume ID numbers of relevant volumes. Do not -combine this flag with the -long or -extended -flag. -

      -long -
      Displays more detailed information about each volume. Do not -combine this flag with the -fast or -extended -flag. -

      -extended -
      Displays all of the information displayed by the -long flag, -plus tables of statistics about reads and writes to the files in the -volume. Do not combine this flag with the -fast or --long flag. -
      -
    -

    The output is ordered alphabetically by volume name and by default provides -the following information on a single line for each volume: -

      -

    • Name -

    • Volume ID number - -

    • Type (the flag is RW for read/write, RO for -read-only, BK for backup) -

    • Size in kilobytes (1024 equals a megabyte) -

    • Number of files in the volume, if the -extended flag is -provided - -

    • Status on the file server machine, which is one of the following: -
      - -

      On-line -
      The volume is completely accessible to Cache Managers. - -

      Off-line -
      The volume is not accessible to Cache Managers, but does not seem to be -corrupted. This status appears while a volume is being dumped, for -example. - -

      Off-line**needs salvage** -
      The volume is not accessible to Cache Managers, because it seems to be -corrupted. Use the bos salvage or salvager -command to repair the corruption. -
      -
    -

    If the following message appears instead of the previously listed -information, it indicates that a volume is not accessible to Cache Managers or -the vos command interpreter, for example because a clone is being -created. -

       **** Volume volume_ID is busy ****
    -
    -

    If the following message appears instead of the previously listed -information, it indicates that the File Server is unable to attach the volume, -perhaps because it is seriously corrupted. The FileLog and -VolserLog log files in the /usr/afs/logs directory on -the file server machine possibly provide additional information; use the -bos getlog command to display them. -

       **** Could not attach volume volume_ID ****
    -
    -

    (For instructions on salvaging a corrupted or unattached volume, see Salvaging Volumes.) -

    The information about individual volumes is bracketed by summary -lines. The first line of output specifies the number of volumes in the -listing. The last line of output summarizes the number of volumes that -are online, offline, and busy, as in the following example: -

       
    -   % vos listvol  fs2.abc.com /vicepb
    -   Total number of volumes on server fs2.abc.com \
    -                                       partition /vicepb : 66
    -   sys                  1969534847 RW       1582 K On-line
    -   sys.backup           1969535105 BK       1582 K On-line
    -         .                   .     .         .   .    .
    -         .                   .     .         .   .    .
    -   user.pat             1969534536 RW      17518 K On-line
    -   user.pat.backup      1969534538 BK      17537 K On-line
    -   Total volumes onLine 66 ; Total volumes offLine 0 ;  Total busy 0
    -   
    -
    -

    Output with the -fast Flag -

    - -If you include the -fast flag displays only the volume ID number of -each volume, arranged in increasing numerical order, as in the following -example. The final line (which summarizes the number of on-line, -off-line, and busy volumes) is omitted. -

       
    -   % vos listvol fs3.abc.com /vicepa -f
    -   Total number of volumes on server fs3.abc.com  \
    -                                       partition /vicepa: 37
    -   50489902
    -   50489904
    -      .
    -      .
    -   35970325
    -   49732810
    -   
    -
    -

    Output with the -long Flag - -

    When you include the -long flag, , the output for each volume -includes all of the information in the default listing plus the -following. Each item in this list corresponds to a separate line of -output: -

      -

    • The file server machine and partition that house the volume, as determined -by the command interpreter as the command runs, rather than derived from the -VLDB or the volume header. - - - - - - - - -

    • The volume ID numbers associated with the various versions of the -volume: read/write (RWrite), read-only (ROnly), -backup (Backup), and ReleaseClone (RClone). One -of them matches the volume ID number that appears on the first line of the -volume's output. If the value in the RWrite, -ROnly, or Backup field is 0 (zero), there is -no volume of that type. If there is currently no ReleaseClone, the -RClone field does not appear at all. - - -

    • The maximum space quota allotted to the read/write copy of the volume, -expressed in kilobyte blocks in the MaxQuota field. - - -

    • The date and time the volume was created, in the Creation -field. If the volume has been restored with the backup -diskrestore, backup volrestore, or vos restore -command, this is the restore time. - - -

    • The date and time when the contents of the volume last changed, in the -Last Update field. For read-only and backup volumes, it -matches the timestamp in the Creation field. - - -

    • The number of times the volume has been accessed for a fetch or store -operation since the later of the two following times: -
        -

      • 12:00 a.m. on the day the command is issued -

      • The last time the volume changed location -
      -
    -

    An example of the output when the -long flag is included: -

       
    -   % vos listvol fs2.abc.com b -long
    -   Total number of volumes on server fs2.abc.com 
    -                                       partition /vicepb: 66
    -         .                   .      .         .   .    .
    -         .                   .      .         .   .    .
    -   user.pat             1969534536 RW      17518 K On-line
    -        fs2.abc.com /vicepb
    -        RWrite 1969534536 ROnly 0        Backup 1969534538 
    -        MaxQuota      20000 K
    -        Creation    Mon Jun 12 09:02:25 1989
    -        Last Update Thu Jan  4 17:39:34 1990
    -        1573 accesses in the past day (i.e., vnode references)
    -   user.pat.backup      1969534538 BK      17537 K On-line
    -        fs2.abc.com /vicepb
    -        RWrite 1969534536 ROnly 0        Backup 1969534538 
    -        MaxQuota      20000 K
    -        Creation    Fri Jan  5 06:37:59 1990
    -        Last Update Fri Jan  5 06:37:59 1990
    -        0 accesses in the past day (i.e., vnode references)
    -	    .               .         .     .       .
    -	    .               .         .     .       .
    -   Total volumes onLine 66 ; Total volumes offLine 0 ; Total busy 0
    -   
    -
    -

    Output with the -extended Flag - -

    When you include the -extended flag, the output for each volume -includes all of the information reported with the -long flag, plus -two tables of statistics: -

      -

    • The table labeled Raw Read/Write Stats table summarizes the -number of times the volume has been accessed for reading or writing. -

    • The table labeled Writes Affecting Authorship table contains -information on writes made to files and directories in the specified -volume. -
    -

    An example of the output when the -extended flag is -included: -

       % vos listvol fs3.abc.com a -extended
    -   common.bboards   1969535592 RW    23149 K used 9401 files On-line
    -       fs3.abc.com /vicepa
    -       RWrite 1969535592 ROnly          0 Backup 1969535594
    -       MaxQuota      30000 K
    -       Creation    Mon Mar  8 14:26:05 1999
    -       Last Update Mon Apr 26 09:20:43 1999
    -       11533 accesses in the past day (i.e., vnode references)
    -   
    -                         Raw Read/Write Stats
    -             |-------------------------------------------|
    -             |    Same Network     |    Diff Network     |
    -             |----------|----------|----------|----------|
    -             |  Total   |   Auth   |   Total  |   Auth   |
    -             |----------|----------|----------|----------|
    -   Reads     |      151 |      151 |     1092 |     1068 |
    -   Writes    |        3 |        3 |      324 |      324 |
    -             |-------------------------------------------|
    -    
    -                      Writes Affecting Authorship
    -             |-------------------------------------------|
    -             |   File Authorship   | Directory Authorship|
    -             |----------|----------|----------|----------|
    -             |   Same   |   Diff   |    Same  |   Diff   |
    -             |----------|----------|----------|----------|
    -   0-60 sec  |       92 |        0 |      100 |        4 |
    -   1-10 min  |        1 |        0 |       14 |        6 |
    -   10min-1hr |        0 |        0 |       19 |        4 |
    -   1hr-1day  |        1 |        0 |       13 |        0 |
    -   1day-1wk  |        1 |        0 |        1 |        0 |
    -   > 1wk     |        0 |        0 |        0 |        0 |
    -             |-------------------------------------------|
    -   
    -
    -

    Displaying One Volume's VLDB Entry and Volume Header

    - - - - - - - -

    The vos examine command displays information from both the VLDB -and the volume header for a single volume. There is some redundancy in -the information from the two sources, which allows you to compare the VLDB and -volume header. -

    Because the volume header for each version of a volume (read/write, -read-only, and backup) is different, you can specify which one to -display. Include the .readonly or -.backup extension on the volume name or ID argument -as appropriate. The information from the VLDB is the same for all three -versions. - - -

    To display one volume's VLDB entry and volume header

    -
      -

    1. Issue the vos examine command. -
         
      -   % vos examine <volume name or ID>
      -   
      -
      -

      where -

      -

      e -
      Is the shortest acceptable abbreviation of examine. -

      volume name or ID -
      Identifies one volume either by its complete name or volume ID -number. It can be a read/write, read-only, or backup type. Use -the .backup or .readonly extension if -appropriate. -
      -
    -

    The top part of the output displays the same information from a volume -header as the vos listvol command with the -long flag, -as described following the instructions in To display volume headers. If you specify the read-only version of the volume -and it exists at more than one site, the output includes all of them. -The bottom part of the output lists the same information from the VLDB as the -vos listvldb command, as described following the instructions in To display VLDB entries. -

    Below is an example for a volume whose VLDB entry is currently -locked. -

       
    -   % vos examine user.terry
    -   user.terry                    536870981 RW   3459 K On-line
    -       fs3.abc.com /vicepa
    -       Write 5360870981   ROnly          0  Backup 536870983
    -       MaxQuota      40000 K
    -       Creation    Mon Jun 12 15:22:06 1989
    -       Last Update Fri Jun 16 09:34:35 1989
    -       5719 accesses in the past day (i.e., vnode references)
    -       RWrite: 5360870981   Backup: 536870983
    -       number of sites -> 1
    -          server fs3.abc.com partition /vicepa RW Site 
    -       Volume is currently LOCKED
    -   
    -
    -

    Displaying the Name or Location of the Volume that Contains a File

    -

    This section explains how to learn the name, volume ID -number, or location of the volume that contains a file or directory. -

    You can also use one piece of information about a volume (for example, its -name) to obtain other information about it (for example, its location). -The following list points you to the relevant instructions: -

      - - - - - - - - - - -

    • To use a volume's name to learn the volume ID numbers of all its -existing versions, use the vos examine command as described in To display one volume's VLDB entry and volume header. -

      You can also use the command to learn a volume's name by providing its -ID number. -

    • To use a volume's name or ID number to learn its location, use the -vos listvldb command as described in To display VLDB entries. - - - - - - -
    - - - - - - -

    To display the name of the volume that contains a file

    -
      -

    1. Issue the fs listquota command. -
         
      -   % fs listquota [<dir/file path>]
      -   
      -
      -

      where -

      -

      lq -
      Is an acceptable alias for listquota (and listq the -shortest acceptable abbreviation). -

      dir/file path -
      Names a directory or file housed in the volume for which to display the -name. Partial pathnames are interpreted relative to the current working -directory, which is the default if this argument is omitted. -
      -
    -

    The following is an example of the output: -

       
    -   % fs listquota /afs/abc.com/usr/terry
    -   Volume Name     Quota    Used    % Used   Partition 
    -   user.terry      15000    5071       34%         86%   
    -   
    -
    - - - - - - -

    To display the ID number of the volume that contains a file

    -
      -

    1. Issue the fs examine command. -
         
      -   % fs examine [<dir/file path>]
      -   
      -
      -

      where -

      -

      exa -
      Is the shortest acceptable abbreviation of examine. -

      dir/file path -
      Names a directory or file housed in the volume for which to display the -volume ID. Partial pathnames are interpreted relative to the current -working directory, which is the default if this argument is omitted. -
      -
    -

    The following example illustrates how the output reports the volume ID -number in the vid field. -

       
    -   % fs examine /afs/abc.com/usr/terry
    -   Volume status for vid = 50489902 named user.terry
    -   Current maximum quota is 15000
    -   Current blocks used are 5073
    -   The partition has 46383 blocks available out of 333305  
    -   
    -
    -
    Note:The partition-related statistics in this command's output do not always -agree with the corresponding values in the output of the standard UNIX -df command. The statistics reported by this command can be -up to five minutes old, because the Cache Manager polls the File Server for -partition information at that frequency. Also, on some operating -systems, the df command's report of partition size includes -reserved space not included in this command's calculation, and so is -likely to be about 10% larger. -
    - - - - - - - -

    To display the location of the volume that contains a file

    -
      -

    1. Issue the fs whereis command to display the name of the file -server machine that houses the volume containing a file or directory. -
         
      -   % fs whereis [<dir/file path>]
      -   
      -
      -

      where -

      -

      whe -
      Is the shortest acceptable abbreviation of whereis. -

      dir/file path -
      Names a directory or file for which to report the location. Partial -pathnames are interpreted relative to the current working directory, which is -the default if this argument is omitted. -
      -

      The output displays the file server machine that houses the volume -containing the file, as in the following example: -

         
      -   % fs whereis /afs/abc.com/user/terry
      -   File /afs/abc.com/usr/terry is on host fs2.abc.com
      -   
      -
      -

    2. If you also want to know which partition houses the volume, first issue -the fs listquota command to display the volume's name. -For complete syntax, see To display the name of the volume that contains a file. -
         
      -   % fs listquota [<dir/file path>]
      -   
      -
      -

      Then issue the vos listvldb command, providing the volume name -as the volume name or ID argument. For complete syntax and a -description of the output, see To display VLDB entries. -

         
      -   % vos listvldb <volume name or ID>
      -   
      -
      -
    -

    Moving Volumes

    - - -

    There are three main reasons to move volumes: -

      -

    • To place volumes on other partitions or machines temporarily while -repairing or replacing a disk or file server machine. -

    • To free space on a partition that is becoming overcrowded. - - - - - -One symptom of overcrowding is that users cannot to save files even though the -relevant volume is below its quota. The following error message -confirms the problem: -
         
      -   afs: failed to store file (partition full)
      -   
      -
      -

      You can track available space on AFS server partitions by using the -scout or afsmonitor programs described in Monitoring and Auditing AFS Performance. -

    • A file server machine is becoming overloaded because it houses many more -volumes than other machines of the same size, or has volumes with more popular -files in them. -
    -

    - - -To move a read/write volume, use the vos move command as described -in the following instructions. Before attempting to move the volume, -the vos command interpreter verifies that there is enough free -space for it on the destination partition. If not, it does not attempt -the move operation and prints the following message. -

       
    -   vos: no space on target partition destination_part to move volume volume
    -   
    -
    -

    To move a read-only volume, you actually remove the volume from the current -site by issuing the vos remove command as described in To remove a volume and unmount it. Then define a new site and release the volume to it -by issuing the vos addsite and vos release commands as -described in To replicate a read/write volume (create a read-only volume). - - -

    A backup volume always resides at the same site as its read/write source -volume, so you cannot move a backup volume except as part of moving the -read/write source. The vos move command automatically -deletes the backup version when you move a read/write volume. To create -a new backup volume at the new site as soon as the move operation completes, -issue the vos backup command as described in To create and mount a backup volume. - - -

    To move a read/write volume

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos move command to move the volume. Type it -on a single line; it appears on multiple lines here only for -legibility. -
         
      -   % vos move <volume name or ID>  \
      -       <machine name on source>  <partition name on source >  \
      -       <machine name on destination>  <partition name on destination>
      -   
      -
      -

      where -

      -

      m -
      Is the shortest acceptable abbreviation of move. -

      volume name or ID -
      Specifies the name or volume ID number of the read/write volume to -move. -

      machine name on source -
      Names the file server machine currently housing the volume. -

      partition name on source -
      Names the partition currently housing the volume. -

      machine name on destination -
      Names the file server machine to which to move the volume. -

      partition name on destination -
      Names the partition to which to move the volume. -
      -
      Note:It is best not to halt a vos move operation before it completes, -because parts of the volume can be left on both the source and destination -machines. For more information, see the command's reference page -in the AFS Administration Reference. -
      -

    3. (Optional) Issue the vos listvldb command to confirm -the success of the move. Complete instructions appear in To display VLDB entries. -
         
      -   % vos listvldb <volume name or ID>
      -   
      -
      -

    4. If a backup version existed at the read/write volume's previous site, -create a new backup at the new site by issuing the vos backup -command, which is fully described in To create and mount a backup volume. -
         
      -   % vos backup <volume name or ID>
      -   
      -
      -
    -

    Synchronizing the VLDB and Volume Headers

    - - - -

    AFS can provide transparent file access because the Volume Location -Database (VLDB) constantly tracks volume locations. When the Cache -Manager needs a file, it contacts the Volume Location (VL) Server, which reads -the VLDB for the current location of the volume containing the file. -Therefore, the VLDB must accurately reflect the state of volumes on the file -server machines at all times. The Volume Server and VL Server -automatically update a volume's VLDB entry when its status changes during -a vos operation, by performing the following series of -steps. -

      -

    1. The VL Server locks the VLDB entry. The lock advises -other operations not to manipulate any of the volume versions (read/write, -read-only, or backup), which prevents the inconsistency that can result from -multiple simultaneous operations. -

    2. The VL Server sets an intention flag in the VLDB -entry that indicates the kind of operation to be performed. - - -This flag never appears in VLDB listings because it is for internal use -only. In case the operation terminates prematurely, this flag tells the -Salvager which operation was interrupted. (The Salvager then determines -the steps necessary either to complete the operation or return the volume to a -previous consistent state. For more information on salvaging, see Salvaging Volumes.) -

    3. The Volume Server manipulates the volume. It usually -sets the Off-line flag in the volume header, which makes the volume -inaccessible to the File Server and other Volume Server operations during the -manipulation. When the operation completes, the volume is again marked -On-line. -

    4. The VL Server records any changes resulting from the operation -in the VLDB entry. Once the operation is complete, it removes the -intention flag set in Step 2 and releases the lock set in Step 1. -
    -

    If a vos operation fails while the Volume Server is manipulating -the volume (corresponding to Step 3), the volume can be left in an intermediate state, which is -termed corruption. In this case, the Off-line or -Off-line**needs salvage** marker usually appears at the end of the -first line of output from the vos examine command. To repair -the corruption, run the Salvager before attempting to resynchronize the VLDB -and volume headers. For salvaging instructions, see Salvaging Volumes. -

    More commonly, an interruption while flags are being set or removed -(corresponding to Step 1, Step 2, or Step 4) causes a discrepancy -between the VLDB and volume headers. To resynchronize the VLDB and -volumes, use the vos syncvldb and vos syncserv -commands. To achieve complete VLDB consistency, it is best to run the -vos syncvldb command on all file server machines in the cell, and -then run the vos syncserv command on all file server machines in -the cell. - - - -

    There are several symptoms that indicate a volume operation failed: -

      -

    • Error messages on the standard error stream or in server process log files -indicate that an operation terminated abnormally. Perhaps you had to -halt the operation before it completed (for instance, by using a signal such -as Ctrl-c), or a file server machine or server process was not -functioning when the operation ran. To determine if a machine or -process is still not functioning, issue the bos status command as -described in Displaying Process Status and Information from the BosConfig File. -

    • A subsequent vos operation fails because a previous failure -left a VLDB entry locked. Sometimes an error message reports that a -volume is locked. To display a list of locked volumes, use the --locked flag on the vos listvldb command as described in -Displaying VLDB Entries. -

      If the only problem with a volume is that its VLDB entry is locked, you -probably do not need to synchronize the entire VLDB. Instead use the -vos unlock or vos unlockvldb command to unlock the -entry, as described in Unlocking and Locking VLDB Entries. -

    • A subsequent vos operation fails because a previous failure -left a volume marked as offline. To check a volume's current -status, check the first line of output from the vos examine command -as described in Displaying One Volume's VLDB Entry and Volume Header. -
    - - - - - -

    The vos syncvldb command corrects the information in the Volume -Location Database (VLDB) either about all volumes housed on a file server -machine, about the volumes on just one partition, or about a single -volume. If checking about one or more partitions, the command contacts -the Volume Server to obtain a list of the volumes that actually reside on each -partition. It then obtains the VLDB entry for each volume from the VL -Server. It changes the VLDB entry as necessary to reflect the state of -the volume on the partition. For example, it creates or updates a VLDB -entry when it finds a volume for which the VLDB entry is missing or -incomplete. However, if there is already a VLDB entry that defines a -different location for the volume, or there are irreconcilable conflicts with -other VLDB entries, it instead writes a message about the conflict to the -standard error stream. The command never removes volumes from the file -server machine. -

    When checking a single volume's VLDB entry, the command also -automatically performs the operations invoked by the vos syncserv -command: it not only verifies that the VLDB entry is correct for the -specified volume type (read/write, backup, or read-only), but also checks that -any related volume types mentioned in the VLDB entry actually exist at the -site listed in the entry. - -

    The vos syncserv command verifies that each volume type -(read/write, read-only, and backup) mentioned in a VLDB entry actually exists -at the site indicated in the entry. It checks all VLDB entries that -mention a site either on any of a file server machine's partitions or on -one partition. Note that command can end up inspecting sites other than -on the specified machine or partition, if there are read-only versions of the -volume at sites other than the read/write site. -

    The command alters any incorrect information in the VLDB, unless there is -an irreconcilable conflict with other VLDB entries. In that case, it -writes a message to the standard error stream instead. The command -never removes volumes from their sites. - - - - -

    To synchronize the VLDB with volume headers

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos syncvldb command to make the VLDB -reflect the true state of all volumes on a machine or partition, or the state -of one volume. -
      Note:To synchronize the VLDB completely, issue the command repeatedly, -substituting each file server machine in your cell for the -server -argument in turn and omitting the -partition and -volume -arguments, before proceeding to Step 3. -
      -
         % vos syncvldb -server <machine name> [-partition <partition name>]  [-volume <volume name or ID>]  [-verbose >> file]
      -   
      -
      -

      where -

      -

      syncv -
      Is the shortest acceptable abbreviation of syncvldb. -

      -server -
      Names the file server machine housing the volumes for which to verify VLDB -entries. If you are also providing the -volume argument, -this argument must name the machine where the volume actually resides. -

      -partition -
      Identifies the partition (on the file server machine specified by the --server argument) housing the volumes for which to verify VLDB -entries. In general, it is best to omit this argument so that either -the VLDB entries for all volumes on a server machine are corrected (if you do -not provide the -volume argument), or so that you do not need to -guarantee that the partition actually houses the volume named by the --volume argument. -

      -volume -
      Specifies the name or volume ID number of a single volume for which to -verify the VLDB entry. -

      -verbose >> file -
      Directs a detailed trace to the file called file, which can be -either in AFS or on the local disk of the machine on which you are issuing the -command. The command often writes a large amount of output to the -standard output stream; writing it to a file enables you to examine the -output more carefully. -
      -

    3. Issue the vos syncserv command to inspect each -volume for which the VLDB lists a version at the specified site. -

      -
      Note:To synchronize the VLDB completely, issue the command repeatedly, -substituting each file server machine in your cell for the machine -name argument in turn and omitting the partition name -argument. -
      -

         % vos syncserv <machine name> [<partition name>] [-v >> file]
      -   
      -
      -

      where -

      -

      syncs -
      Is the shortest acceptable abbreviation of syncserv. -

      machine name -
      Names the file server machine mentioned in each VLDB entry to -check. -

      partition name -
      Identifies the partition mentioned in each VLDB entry to check. If -synchronizing the entire VLDB, omit this argument. -

      -v >> file -
      Directs a detailed trace to the file called file, which can be -either in AFS or on the local disk of the machine on which you are issuing the -command. The command often writes a large amount of output to the -standard output stream; writing it to a file enables you to examine the -output more carefully. -
      -
    -

    Salvaging Volumes

    - - - - - - - - -

    An unexpected interruption while the Volume Server or File Server is -manipulating the data in a volume can leave the volume in an intermediate -state (corrupted), rather than just creating a discrepancy between -the information in the VLDB and volume headers. For example, the -failure of the operation that saves changes to a file (by overwriting old data -with new) can leave the old and new data mixed together on the disk. -

    If an operation halts because the Volume Server or File Server exits -unexpectedly, the BOS Server automatically shuts down all components of the -fs process and invokes the Salvager. The Salvager checks for -and repairs any inconsistencies it can. Sometimes, however, there are -symptoms of the following sort, which indicate corruption serious enough to -create problems but not serious enough to cause the File Server component to -fail. In these cases you can invoke the Salvager yourself by issuing -the bos salvage command. -

      -

    • Symptom: A file appears in the output of the -ls command, but attempts to access the file fail with messages -indicating that it does not exist. -

      Possible cause: The Volume Server or File Server exited in -the middle of a file-creation operation, after changing the directory -structure, but before actually storing data. (Other possible causes are -that the ACL on the directory does not grant the permissions you need to -access the file, or there is a process, machine, or network outage. -Check for these causes before assuming the file is corrupted.) -

      Salvager's solution: Remove the file's entry -from the directory structure. -

    • Symptom: A volume is marked Off-line in the -output from the vos examine and vos listvol commands, or -attempts to access the volume fail. -

      Possible cause: Two files or versions of a file are -sharing the same disk blocks because of an interrupted operation. The -File Server and Volume Server normally refuse to attach volumes that exhibit -this type of corruption, because it can be very dangerous. If the -Volume Server or File Server do attach the volume but are unsure of the status -of the affected disk blocks, they sometimes try to write yet more data -there. When they cannot perform the write, the data is lost. -This effect can cascade, causing loss of all data on a partition. -

      Salvager's solution: Delete the data from the -corrupted disk blocks in preference to losing an entire partition. -

    • Symptom: There is less space available on the partition -than you expect based on the size statistic reported for each volume by the -vos listvol command. -

      Possible cause: There are orphaned files and -directories. An orphaned element is completely inaccessible because it -is not referenced by any directory that can act as its parent (is higher in -the file tree). An orphaned element is not counted in the calculation -of a volume's size (or against its quota), even though it occupies space -on the server partition. -

      Salvager's solution: By default, print a message to -the /usr/afs/logs/SalvageLog file reporting how many orphans were -found and the approximate number of kilobytes they are consuming. You -can use the -orphans argument to remove or attach orphaned elements -instead. See To salvage volumes. -

    -

    When you notice symptoms such as these, use the bos salvage -command to invoke the Salvager before corruption spreads. (Even though -it operates on volumes, the command belongs to the bos suite -because the BOS Server must coordinate the shutdown and restart of the Volume -Server and File Server with the Salvager. It shuts them down before the -Salvager starts, and automatically restarts them when the salvage operation -finishes.) -

    All of the AFS data stored on a file server machine is inaccessible during -the salvage of one or more partitions. If you salvage just one volume, -it alone is inaccessible. -

    When processing one or more partitions, the command restores consistency to -corrupted read/write volumes where possible. For read-only or backup -volumes, it inspects only the volume header: -

      -

    • If the volume header is corrupted, the Salvager removes the volume -completely and records the removal in its log file, -/usr/afs/logs/SalvageLog. Issue the vos release -or vos backup command to create the read-only or backup volume -again. -

    • If the volume header is intact, the Salvager skips the volume (does not -check for corruption in the contents). However, if the File Server -notices corruption as it initializes, it sometimes refuses to attach the -volume or bring it online. In this case, it is simplest to remove the -volume by issuing the vos remove or vos zap -command. Then issue the vos release or vos backup -command to create it again. -
    -

    Combine the bos salvage command's arguments as indicated to -salvage different numbers of volumes: -

      -

    • To salvage all volumes on a file server machine, combine the --server argument and the -all flag. -

    • To salvage all volumes on one partition, combine the -server -and -partition arguments. -

    • To salvage only one read/write volume, combine the -server, --partition, and -volume arguments. Only that -volume is inaccessible to Cache Managers, because the BOS Server does not -shutdown the File Server and Volume Server processes during the salvage of a -single volume. Do not name a read-only or backup volume with the --volume argument. Instead, remove the volume, using the -vos remove or vos zap command. Then create a new -copy of the volume with the vos release or vos backup -command. -
    -

    The Salvager always writes a trace to the -/usr/afs/logs/SalvageLog file on the file server machine where it -runs. To record the trace in another file as well (either in AFS or on -the local disk of the machine where you issue the bos salvage -command), name the file with the -file argument. Or, to -display the trace on the standard output stream as it is written to the -/usr/afs/logs/SalvageLog file, include the -showlog -flag. -

    By default, multiple Salvager subprocesses run in parallel: one for -each partition up to four, and four subprocesses for four or more -partitions. To increase or decrease the number of subprocesses running -in parallel, provide a positive integer value for the -parallel -argument. -

    If there is more than one server partition on a physical disk, the Salvager -by default salvages them serially to avoid the inefficiency of constantly -moving the disk head from one partition to another. However, this -strategy is often not ideal if the partitions are configured as logical -volumes that span multiple disks. To force the Salvager to salvage -logical volumes in parallel, provide the string all as the value -for the -parallel argument. Provide a positive integer to -specify the number of subprocesses to run in parallel (for example, --parallel 5all for five subprocesses), or omit the integer to run -up to four subprocesses, depending on the number of logical volumes being -salvaged. -

    The Salvager creates temporary files as it runs, by default writing them to -the partition it is salvaging. The number of files can be quite large, -and if the partition is too full to accommodate them, the Salvager terminates -without completing the salvage operation (it always removes the temporary -files before exiting). Other Salvager subprocesses running at the same -time continue until they finish salvaging all other partitions where there is -enough disk space for temporary files. To complete the interrupted -salvage, reissue the command against the appropriate partitions, adding the --tmpdir argument to redirect the temporary files to a local disk -directory that has enough space. -

    The -orphans argument controls how the Salvager handles orphaned -files and directories that it finds on server partitions it is -salvaging. An orphaned element is completely inaccessible -because it is not referenced by the vnode of any directory that can act as its -parent (is higher in the filespace). Orphaned objects occupy space on -the server partition, but do not count against the volume's quota. -

    During the salvage, the output of the bos status command reports -the following auxiliary status for the fs process: -

       
    -   Salvaging file system
    -   
    -
    - - -

    To salvage volumes

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos salvage command to salvage one or more -volumes. -
         
      -   % bos salvage  -server <machine name>  [-partition <salvage partition>]  \
      -                  [-volume <salvage volume number or volume name>]  \
      -                  [-file salvage log output file]  [-all]  [-showlog]  \
      -                  [-parallel <# of max parallel partition salvaging>]  \ 
      -                  [-tmpdir <directory to place tmp files>]  \ 
      -                  [-orphans <ignore | remove | attach>] 
      -   
      -
      -

      where -

      -

      -server -
      Names the file server machine on which to salvage volumes. This -argument can be combined either with the -all flag, the --partition argument, or both the -partition and --volume arguments. -

      -partition -
      Names a single partition on which to salvage all volumes. The --server argument must be provided along with this one. -

      -volume -
      Specifies the name or volume ID number of one read/write volume to -salvage. Combine this argument with the -server and --partition arguments. -

      -file -
      Specifies the complete pathname of a file into which to write a trace of -the salvage operation, in addition to the /usr/afs/logs/SalvageLog -file on the server machine. If the file pathname is local, the trace is -written to the specified file on the local disk of the machine where the -bos salvage command is issued. If the -volume -argument is included, the file can be in AFS, though not in the volume being -salvaged. Do not combine this argument with the -showlog -flag. -

      -all -
      Salvages all volumes on all of the partitions on the machine named by the --server argument. -

      -showlog -
      Displays the trace of the salvage operation on the standard output stream, -as well as writing it to the /usr/afs/logs/SalvageLog file. -

      -parallel -
      Specifies the maximum number of Salvager subprocesses to run in -parallel. Provide one of three values: -
        -

      • An integer from the range 1 to 32. A value of -1 means that a single Salvager process salvages the partitions -sequentially. -

      • The string all to run up to four Salvager subprocesses in -parallel on partitions formatted as logical volumes that span multiple -physical disks. Use this value only with such logical volumes. -

      • The string all followed immediately (with no intervening space) -by an integer from the range 1 to 32, to run the -specified number of Salvager subprocesses in parallel on partitions formatted -as logical volumes. Use this value only with such logical -volumes. -
      -

      The BOS Server never starts more Salvager subprocesses than there are -partitions, and always starts only one process to salvage a single -volume. If this argument is omitted, up to four Salvager subprocesses -run in parallel. -

      -tmpdir -
      Specifies the full pathname of a local disk directory to which the -Salvager process writes temporary files as it runs. By default, it -writes them to the partition it is currently salvaging. -

      -orphans -
      Controls how the Salvager handles orphaned files and directories. -Choose one of the following three values: -
      -

      ignore -
      Leaves the orphaned objects on the disk, but prints a message to the -/usr/afs/logs/SalvageLog file reporting how many orphans were found -and the approximate number of kilobytes they are consuming. This is the -default if you omit the -orphans argument. -

      remove -
      Removes the orphaned objects, and prints a message to the -/usr/afs/logs/SalvageLog file reporting how many orphans were -removed and the approximate number of kilobytes they were consuming. -

      attach -
      Attaches the orphaned objects by creating a reference to them in the vnode -of the volume's root directory. Since each object's actual -name is now lost, the Salvager assigns each one a name of the following -form: -
      -

      _ _ORPHANFILE_ _.index for files -

      _ _ORPHANDIR_ _.index for directories -

      -

      -

      where index is a two-digit number that uniquely identifies each -object. The orphans are charged against the volume's quota and -appear in the output of the ls command issued against the -volume's root directory. -

      -
      -
    -

    Setting and Displaying Volume Quota and Current Size

    - - -

    Every AFS volume has an associated quota which limits the -volume's size. The default quota for a newly created volume is -5,000 kilobyte blocks (slightly less that 5 MB). When a volume reaches -its quota, the File Server rejects attempts to create new files or directories -in it. If an application is writing data into an existing file in a -full volume, the File Server allows a defined overage (by default, 1 -MB). (You can use the fileserver command's --spare or -pctspare argument to change the default -overage; see the command's reference page in the AFS -Administration Reference.) -

    To set a quota other than 5000 KB as you create a volume, include the --maxquota argument to the vos create command, as -described in Creating Read/write Volumes. To modify an existing volume's quota, issue -either the fs setquota or the fs setvol command as -described in the following instructions. Do not set an existing -volume's quota lower than its current size. -

    In general, smaller volumes are easier to administer than larger -ones. If you need to move volumes, say for load-balancing purposes, it -is easier to find enough free space on other partitions for small -volumes. Move operations complete more quickly for small volumes, -reducing the potential for outages or other errors to interrupt the -move. AFS supports a maximum volume size, which can vary for different -AFS releases; see the AFS Release Notes for the version you -are using. Also, the size of a partition or logical places an absolute -limit on volume size, because a volume cannot span multiple partitions or -logical volumes. -

    It is generally safe to overpack partitions by putting more volumes on them -than can actually fit if all the volumes reach their maximum quota. -However, only experience determines to what degree overpacking works in your -cell. It depends on what kind of quota you assign to volumes -(particularly user volumes, which are more likely than system volumes to grow -unpredictably) and how much information people generate and store in -comparison to their quota. -

    There are several commands that display a volume's quota, as described -in the following instructions. They differ in how much related -information they produce. -

    To set quota for a single volume

    - - - - - -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the fs setquota command to set the volume's maximum -quota. -
         
      -   % fs setquota [<dir/file path>] -max <max quota in kbytes>
      -   
      -
      -

      where -

      -

      sq -
      Is an acceptable alias for setquota. -

      dir/file path -
      Names a file or directory in the volume for which to set the indicated -quota. Partial pathnames are interpreted relative to the current -working directory, which is the default if you omit this argument. -

      Specify the read/write path to the file or directory, to avoid the failure -that results when you attempt to change a read-only volume. By -convention, you indicate the read/write path by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      max quota in kbytes -
      Sets the volume's quota, expressed in kilobyte blocks -(1024 equals a megabyte). A value of 0 grants an -unlimited quota, but the size of the partition imposes an absolute -limit. You must include the -max switch if omitting the -dir/file path argument (to set the quota on the volume that houses -the current working directory). -
      -
    -

    To set maximum quota on one or more volumes

    - - - - -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the fs setvol command to set the quota on one or more -volumes. -
         
      -   % fs setvol [<dir/file path>+] -max <disk space quota in 1K units>
      -   
      -
      -

      where -

      -

      sv -
      Is an acceptable alias for setvol. -

      dir/file path -
      Names one file or directory that resides in each volume for which to set -the indicated quota. Partial pathnames are interpreted relative to the -current working directory, which is the default if you omit this -argument. -

      disk space quota in 1K units -
      Sets the maximum quota on each volume, expressed in kilobytes blocks -(1024 equals a megabyte). A value of 0 grants an -unlimited quota, but the size of the partition does impose an absolute -limit. -
      -
    - - - - -

    To display percent quota used

    -
      -

    1. Issue the fs quota command. -
         
      -   % fs quota [<dir/file path>+]
      -   
      -
      -

      where -

      -

      q -
      Is the shortest acceptable abbreviation of quota. -

      dir/file path -
      Names a directory or file in each volume for which to display percent -quota used. Partial pathnames are interpreted relative to the current -working directory, which is the default if you omit this argument. -
      -
    -

    The following example illustrates the output produced by this -command: -

       
    -   % fs quota /afs/abc.com/usr/terry
    -   34% of quota used.
    -   
    -
    - - - - - - -

    To display quota, current size, and other information

    -
      -

    1. Issue the fs listquota command. -
         
      -   % fs listquota [<dir/file path>+]
      -   
      -
      -

      where -

      -

      lq -
      Is an alias for listquota. -

      dir/file path -
      Names a directory or file in each volume for which to display quota along -with volume name and current space usage. Partial pathnames are -interpreted relative to the current working directory, which is the default if -you omit this argument. -
      -
    -

    As illustrated in the following example, the output reports the -volume's name, its quota and current size (both in kilobyte units), the -percent quota used, and the percentage of space on the volume's host -partition that is used. -

       
    -   % fs listquota /afs/abc.com/usr/terry
    -   Volume Name     Quota    Used    % Used   Partition 
    -   user.terry      15000    5071       34%         86%   
    -   
    -
    - - - - - - - -

    To display quota, current size, and more partition information

    -
      -

    1. Issue the fs examine command. -
         
      -   % fs examine [<dir/file path>+]
      -   
      -
      -

      where -

      -

      exa -
      Is the shortest acceptable abbreviation of examine. -

      dir/file path -
      Names a directory or file in each volume for which to display quota -information and information about the host partition. Partial pathnames -are interpreted relative to the current working directory, which is the -default if you omit this argument. -
      -
    -

    As illustrated in the following example, the output displays the -volume's volume ID number and name, its quota and current size (both in -kilobyte units), and the free and total number of kilobyte blocks on the -volume's host partition. -

       
    -   % fs examine /afs/abc.com/usr/terry
    -   Volume status for vid = 50489902 named user.terry
    -   Current maximum quota is 15000
    -   Current blocks used are 5073
    -   The partition has 46383 blocks available out of 333305   
    -   
    -
    -
    Note:The partition-related statistics in this command's output do not always -agree with the corresponding values in the output of the standard UNIX -df command. The statistics reported by this command can be -up to five minutes old, because the Cache Manager polls the File Server for -partition information at that frequency. Also, on some operating -systems, the df command's report of partition size includes -reserved space not included in this command's calculation, and so is -likely to be about 10% larger. -
    -

    Removing Volumes and their Mount Points

    - - - - - -

    To remove a volume from its site and its record from the VLDB, use the -vos remove command. Use it to remove any of the three types -of volumes; the effect depends on the type. -

      -

    • If you indicate the read/write volume by specifying the volume's base -name without a .readonly or .backup -extension, the command removes both the read/write and associated backup -volume from the partition that houses them. - - -You do not need to provide the -server and -partition -arguments, because there can be only one read/write site. The site -information is also removed from the VLDB entry, and the site count (reported -by the vos examine and vos listvldb commands as -number of sites) decrements by one. The read/write and -backup volume ID numbers no longer appear in the output from the vos -examine and vos listvldb commands, but they are preserved -internally. Read-only sites, if any, are not affected, but cannot be -changed unless a read/write site is again defined. The entire VLDB -entry is removed if there are no read-only sites. -

      If there are no read-only copies left, it is best to remove the -volume's mount point to prevent attempts to access the volume's -contents. Do not remove the mount point if copies of the read-only -volume remain. -

    • If you indicate a read-only volume by including the -.readonly extension on its name, it is removed from the -partition that houses it, and the corresponding site information is removed -from the VLDB entry. The site count reported by the vos -examine and vos listvldb commands as number of -sites decrements by one for each volume you remove. - -

      If there is more than one read-only site, you must include the --server argument (and optionally -partition argument) to -specify the site from which to remove the volume. If there is only one -read-only site, the volume name is sufficient; if no read/write volume -exists in this case, the entire VLDB entry is removed. -

      It is not generally appropriate to remove the volume's mount point -when removing a read-only volume, especially if the read/write version of the -volume still exists. If the read/write version no longer exists, remove -the mount point as described in Step 5 of To remove a volume and unmount it. -

    • If you indicate a backup volume by including the .backup -extension on its name, it is removed from the partition that houses it and its -site information is removed from the VLDB entry. You do not need to -provide the -server and -partition arguments, because -there can be only one backup site. The backup volume ID number no -longer appears in the output from the vos examine or vos -listvldb command, but is preserved internally. -

      In the standard configuration, there is a separate mount point for the -backup version of a user volume. Remember to remove the mount point to -prevent attempt to access the nonexistent volume's contents. -

    -

    Other Removal Commands

    - -

    The vos remove command is almost always the appropriate way to -remove a volume, because it automatically removes a volume's VLDB entry -and both the volume header and all data from the partition. If either -the VLDB entry or volume header does not exist, it is sometimes necessary to -use other commands that remove only the remaining element. Do not use -these commands in the normal case when both the VLDB entry and the volume -header exist, because by definition they create discrepancies between -them. For details on the commands' syntax, see their reference -pages in the AFS Administration Reference. -

    The vos zap command removes a volume from its site by removing -the volume header and volume data for which a VLDB entry no longer -exists. - - -You can tell a VLDB entry is missing if the vos listvol command -displays the volume header but the vos examine or vos -listvldb command cannot locate the VLDB entry. You must run this -command to correct the discrepancy, because the vos syncvldb and -vos syncserv commands never remove volume headers. -

    The vos remsite command removes a read-only site definition from -the VLDB without affecting the volume on the file server machine. - - -Use this command when you have mistakenly issued the vos addsite -command to define a read-only site, but have not yet issued the vos -release command to release the volume to the site. If you have -actually released a volume to the site, use the vos remove command -instead. -

    The vos delentry command removes the entire VLDB entry that -mentions the volume you specify. - - -If versions of the volume actually exist on file server machines, they are not -affected. This command is useful if you know for certain that a volume -removal was not recorded in the VLDB (perhaps you used the vos zap -command during an emergency), and do not want to take the time to -resynchronize the entire VLDB with the vos syncvldb and vos -syncserv commands. -

    To remove a volume and unmount it

    - -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If removing the volume's mount point, verify that you have the -d (delete) permission on its parent directory's -ACL. If necessary, issue the fs listacl command, which is -fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

    3. (Optional) Dump the volume to a file or to tape, in -case you want to restore it later. To copy the volume's contents -to a file, use the vos dump command as instructed in Dumping and Restoring Volumes. You can then copy the file to tape using a -third-party backup utility or an archiving utility such as the UNIX -tar command. -

      Alternatively, use the AFS Backup System to create a tape copy. In -this case, it can be convenient to create a temporary volume set that includes -only the volume of interest. Temporary volume sets are not recorded in -the Backup Database, and so do not clutter database with records for volume -sets that you use only once. For instructions, see To create a dump. - - -

    4. Issue the vos remove command to remove the -volume. If removing a read-only volume from multiple sites, repeat the -command for each one. -
         
      -   % vos remove [-server machine name>]  [-partition <partition name>]  \
      -                -id <volume name or ID>
      -   
      -
      -

      where -

      -

      remo -
      Is the shortest acceptable abbreviation of remove. -

      -server -
      Specifies the file server machine on which the volume resides. It -is necessary only when the -id argument names a read-only volume -that exists at multiple sites. -

      -partition -
      Specifies the partition on machine name where the volume -resides. It is necessary only when the -id argument names a -read-only volume that exists at multiple sites. Provide the --server argument along with this one. -

      -id -
      Identifies the volume to remove, either by its complete name or volume ID -number. If identifying a read-only or backup volume by name, include -the appropriate extension (.readonly or -.backup). -
      - - -

    5. If you are removing the last existing version of the volume, -issue the fs rmmount command remove the corresponding mount -point. Complete instructions appear in To remove a volume and unmount it. -

      If you are removing a backup volume that is mounted in the conventional way -(at a subdirectory of its read/write volume's root directory), then -removing the source volume's mount point in this step is sufficient to -remove the backup volume's mount point. If you mounted the backup -at a completely separate directory, you need to repeat this step for the -backup volume's mount point. -

         
      -   % fs rmmount <directory>
      -   
      -
      -

    6. (Optional) If you created a dump file in Step 3, transfer it to tape. The preferred method is to use -the AFS Backup System, which is described in Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -
    -

    Dumping and Restoring Volumes

    - - -

    Dumping a volume with the vos dump command converts -its contents into ASCII format and writes them to the file you specify. -The vos restore command places a dump file's contents into a -volume after converting them into the volume format appropriate for the -indicated file server machine. -

    About Dumping Volumes

    - - - - - - -

    Dumping a volume can be useful in several situations, including the -following: -

      -

    • You want to back it up to tape, perhaps by using a third-party backup -utility. To facilitate this type of backup operation, the vos -dump command can write to a named pipe. To learn about using the -AFS Backup System instead, see Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -

    • You are removing the volume from your cell (perhaps because its owner is -leaving your cell). The vos dump command enables you to -create a copy for safekeeping without incurring the overhead of the Backup -System. For complete instructions on removing a volume, see Removing Volumes and their Mount Points. -

    • You want to create a copy of the volume for safekeeping on a non-AFS -server partition, perhaps while you move the actual volume to another machine -or perform maintenance tasks on the partition that houses the volume. -

    • You need to replace a corrupted read/write volume. If an -uncorrupted read-only or backup version of the volume exists, dump it and -restore the data into the read/write volume, overwriting the corrupted -contents. -

    • You want to copy or transfer the contents of the volume to another -cell. You cannot use the vos move command, because AFS -supports volume moves only between file server machines that belong to the -same cell. -

    • You want to have another read/write copy of the volume's -contents. The second volume must have a different name than the -original one. If you want the contents of the two volumes to remain -identical, you must update them both manually. AFS provides no facility -for keeping read/write volumes synchronized in this way. -

    • You want a copy of only the files and directories in the volume with -modification time stamps after a certain date. The vos dump -command can create an incremental dump file as described in Step 3 of the following instructions. -
    - - - -

    You can use the vos dump command to create a full -dump, which contains the complete contents of the volume at the time you -issue the command, or an incremental dump, which contains only -those files and directories with modification timestamps (as displayed by the -ls -l command) that are later than a date and time you -specify. See Step 3 of the following instructions. -

    Dumping a volume does not change its VLDB entry or permanently affect its -status on the file server machine, but the volume's contents are -inaccessible during the dump operation. To avoid interrupting access to -the volume, it is generally best to dump the volume's backup version, -just after using the vos backup or vos backupsys command -to create a new backup version. -

    If you do not provide a filename into which to write the dump, the vos -dump command directs the output to the standard output stream. -You can pipe it directly to the vos restore command if you -wish. -

    Because a volume dump file is in ASCII format, you can read its contents -using a text editor or a command such as the cat command. -However, dump files sometimes contain special characters that do not have -alphanumeric correlates, which can cause problems for some display -programs. -

    By default, the vos command interpreter consults the Volume -Location Database (VLDB) to learn the volume's location, so the --server and -partition arguments are not -required. If the -id argument identifies a read-only volume -that resides at multiple sites, then the command dumps the version from just -one of them (normally, the one listed first in the volume's VLDB entry as -reported by the vos examine or vos listvldb -command). To dump the read-only volume from a particular site, use the --server and -partition arguments to specify the -site. To bypass the VLDB lookup entirely, provide a volume ID number -(rather than a volume name) as the value for the -id argument, -along with the -server and -partition arguments. -This makes it possible to dump a volume for which there is no VLDB -entry. - - -

    To dump a volume

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that you have the permissions necessary to create the dump -file. If placing it in AFS, you must have the i -(insert) permission on the ACL of the file's directory. -If necessary, issue the fs listacl command, which is fully -described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

    3. Issue the vos dump command to dump the -volume. -
         
      -   % vos dump -id <volume name or ID> [-time <dump from time>]  [-file <arg>]  [-server <server>]  [-partition <partition>]
      -   
      -
      -

      where -

      -

      -id -
      Identifies the volume to be dumped by its complete name or volume ID -number. If you want to dump the read-only or backup version, specify -its volume ID number or add the appropriate extension -(.readonly or .backup) to the name. -

      To bypass the normal VLDB lookup of the volume's location, provide the -volume ID number and combine this argument with the -server and --partition arguments. -

      -time -
      Specifies whether the dump is full or incremental. Omit this -argument to create a full dump, or provide one of three acceptable -values: -
        -

      • The value 0 (zero) to create a full dump. -

      • A date in the format -mm/dd/yyyy (month, day -and year) to create an incremental dump that includes only files and -directories with modification timestamps later than midnight (12:00 -a.m.) on the indicated date. Valid values for the year -range from 1970 to 2037; higher values are not -valid because the latest possible date in the standard UNIX representation is -in 2038. The command interpreter automatically reduces later dates to -the maximum value. An example is 01/13/1999. -

      • A date and time in the format -"mm/dd/yyyy -hh:MM" to create an -incremental dump that includes only files and directories with modification -timestamps later than the specified date and time. The date format is -the same as for a date alone. Express the time as hours and minutes -(hh:MM) in 24-hour format (for example, -20:30 is 8:30 p.m.). Surround the -entire expression with double quotes (" ") because it contains a space. -An example is "01/13/1999 22:30". -
      -

      -file -
      Specifies the pathname of the file to which to write the dump. The -file can be in AFS, but not in the volume being dumped. A partial -pathname is interpreted relative to the current working directory. Omit -this argument to direct the dump to the standard output stream. -

      -server -
      Specifies the file server machine on which the volume resides. -Provide the -partition argument along with this one. -

      -partition -
      Specifies the partition on which the volume resides. Provide the --server argument along with this one. -
      -
    -

    About Restoring Volumes

    - - -

    Although you can dump any of the three types of volumes (read/write, -read-only, or backup), you can restore a dump file to the file system only as -a read/write volume, using the vos restore command. The -command automatically translates the dump file's contents from ASCII back -into the volume format appropriate for the file server machine that stores the -restored version. As with the vos dump command, you can -restore a dump file via a named pipe, which facilitates interoperation with -third-party backup utilities. -

    You can restore the contents of a dump file in one of two basic -ways. In either case, you must restore a full dump of the volume before -restoring any incremental dumps. Any incremental dumps that you then -restore must have been created after the full dump. If there is more -than one incremental dump, you must restore them in the order they were -created. -

      -

    • You can restore volume data into a brand new volume with a new name and at -a location that you specify. See To restore a dump into a new volume and mount it. -

      You can assign a volume ID number as you restore the volume, though it is -best to have the Volume Server allocate a volume number automatically. -The most common reason for specifying the volume ID is that a volume's -VLDB entry has disappeared for some reason, but you know the former read/write -volume ID number and want to reuse it. -

    • You can restore volume data into an existing volume (usually the one that -was previously dumped), overwriting its current contents. This is -convenient if the current contents are corrupted or otherwise incorrect, -because it allows you to replace them with a coherent version from the past or -from one of the volume's clones. See To restore a dump file, overwriting an existing volume. -

      Provide the -overwrite argument to preconfirm that you wish to -overwrite the volume's contents, and to specify whether you are restoring -a full or incremental dump. If you omit the -overwrite -argument, the Volume Server generates the following prompt to confirm that you -want to overwrite the existing volume with either a full (f) or -incremental (i) dump: -

         
      -   Do you want to do a full/incremental restore or abort? [fia](a):
      -   
      -
      -

      If you pipe in the dump file via the standard input stream instead of using -the -file argument to name it, you must include the --overwrite argument because there is nowhere for the Volume Server -to display the prompt in this case. -

      You can move the volume to a new site as you overwrite it with a full dump, -by using the -server and -partition arguments to specify -the new site. You cannot move the volume when restoring an incremental -dump. -

    -

    The vos restore command sets the restored volume's creation -date in the volume header to the time of the restore operation, as reported in -the Creation field in the output from the vos examine -and vos listvol commands. - - -

    To restore a dump into a new volume and mount it

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that you have permissions needed to read the dump file and to mount -the new volume. If the dump file resides in AFS, you need the -r (read) permission on the ACL of its directory. -You need the i (insert) and a -(administer) permissions on the ACL of the directory where you are -mounting the new volume. If necessary, issue the fs listacl -command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

    3. Select a site (disk partition on a file server machine) for the new -volume. If your cell groups different types of volumes onto different -file server machines, that can guide your decision. It often makes -sense to put the volume on the emptiest partition that meets your other -criteria. To display how much space is available on a file server -machine's partitions, use the vos partinfo command, which is -described fully in Creating Read/write Volumes. -
         
      -   % vos partinfo <machine name> [<partition name>]
      -   
      -
      -

    4. Issue the vos restore command to create a new volume -and restore the dump file into it. Type it on a single line; it -appears on multiple lines here only for legibility. -
         
      -   % vos restore <machine name> <partition name>  \
      -                 <name of volume to be restored>   \
      -                 [-file <dump file>] [-id <volume ID>]
      -   
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restore. -

      machine name -
      Names the file server machine on which to create the new volume. -

      partition name -
      Names the partition on which to create the new volume. -

      name of volume to be restored -
      Names the new read/write volume, which must not already have a VLDB -entry. It can be up to 22 characters in length. -

      -file -
      Is the dump file to restore. Partial pathnames are interpreted with -respect to the current working directory. Omit this argument if using a -pipe to read in the dump file from the standard input stream. -

      -volume -
      Specifies the new volume's ID number. It is appropriate only -if you are restoring a volume that no longer exists and want to use the volume -ID number it had previously. -
      - - -

    5. Issue the fs mkmount command to mount the new volume, making -its contents accessible. Complete instructions appear in To create a regular or read/write mount point. -
         
      -   % fs mkmount <directory> <volume name>
      -   
      -
      -

    6. (Optional) Issue the fs lsmount command to verify -that the mount point refers to the correct volume. Complete -instructions appear in To display a mount point. -
         
      -   % fs lsmount <directory>
      -   
      -
      -
    - - -

    To restore a dump file, overwriting an existing volume

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that you have permissions needed to read the dump file. If -it resides in AFS, you need the r (read) permission on -the ACL of its directory. If necessary, issue the fs listacl -command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

    3. Restore the contents of the dump file into a read/write volume, -overwriting the current contents. The volume retains its current volume -ID number. Type it on a single line; it appears on multiple lines -here only for legibility. -
         
      -   % vos restore <machine name> <partition name>  \
      -                 <name of volume to be restored>   \
      -                 [-file <dump  file>]  \
      -                 -overwrite <full | incremental>
      -   
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restore. -

      machine name -
      Names the file server machine where the volume already exists, or the -machine to which to move it. In the latter case, the value for the --overwrite argument must be full. -

      partition name -
      Names the partition where the volume already exists, or the partition to -which to move it. In the latter case, the value for the --overwrite argument must be full. -

      name of volume to be restored -
      Names the read/write volume to overwrite with the contents of the dump -file. -

      -file -
      Is the dump file to restore. Partial pathnames are interpreted with -respect to the current working directory. Omit this argument if using a -pipe to read in the dump file from the standard input stream; in this -case, you must provide the -overwrite argument. -

      -overwrite -
      Preconfirms that you want to overwrite the existing volume and specifies -which type of dump file you are restoring. Provide one of the following -values: -
        -

      • f or full if restoring a full dump file -

      • i or incremental if restoring an incremental dump -file. This value is not acceptable if you are moving the volume while -restoring it. -

      • a to terminate the restore operation -
      -
      -

    4. If the volume is replicated, issue the vos release command to -release the newly restored contents to read-only sites. Complete -instructions appear in Replicating Volumes (Creating Read-only Volumes). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -

    5. Issue the vos backup command to create a new backup version of -the volume. Complete instructions appear in Creating Backup Volumes. -
         
      -   % vos backup <volume name or ID>
      -   
      -
      -
    -

    Renaming Volumes

    - - - - -

    You can use the vos rename command to rename a volume. -For example, it is appropriate to rename a user's home volume if you use -the user.username convention for user volume names -and you change the username. (For complete instructions for changing -usernames, see Changing Usernames.) -

    - - - -The vos rename command accepts only read/write volume names, but -automatically changes the names of the associated read-only and backup -volumes. As directed in the following instructions, you need to replace -the volume's current mount point with a new one that reflects the name -change. - - -

    To rename a volume

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Verify that you have the a (administer), -d (delete), and i (insert) access -permissions for the directory in which you are replacing the volume's -mount point. If necessary, issue the fs listacl command, -which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

      Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

    3. Issue the vos rename command to rename the -volume. -
         
      -   % vos rename <old volume name> <new volume name>
      -   
      -
      -

      where -

      -

      ren -
      Is the shortest acceptable abbreviation of rename. -

      old volume name -
      Is the current name of a read/write volume. -

      new volume name -
      Is the new name for the volume. It cannot be more than 22 -characters in length. -
      -

      If there is no Volume Location Database (VLDB) entry for the specified -current volume name, the command fails with the following error message: -

      -

         
      -   vos: Could not find entry for volume old_volume_name. 
      -   
      -
      - - -

    4. Issue the fs rmmount command to remove the mount point that -refers to the volume's old name. Complete instructions appear in To remove a mount point. -
         
      -   % fs rmmount <directory>
      -   
      -
      - - -

    5. Issue the fs mkmount to create a mount point that indicates the -volume's new name. Complete instructions appear in To create a regular or read/write mount point. -
         
      -   % fs mkmount <directory> <volume name> [-rw]
      -    
      -
      -
    -

    Unlocking and Locking VLDB Entries

    -

    As detailed in Synchronizing the VLDB and Volume Headers, The Volume Location (VL) Server locks the -Volume Location Database (VLDB) entry for a volume before the Volume Server -executes any operation on it. No other operation can affect a volume -with a locked VLDB entry, so the lock prevents the inconsistency or corruption -that can result from multiple simultaneous operations on a volume. - - - - - - -

    To verify that a VLDB entry is locked, issue the vos listvldb -command as described in To display VLDB entries. The command has a -locked flag that -displays locked entries only. If the VLDB entry is locked, the string -Volume is currently LOCKED appears on the last line of the -volume's output. -

    To lock a VLDB entry yourself, use the vos lock command. -This is useful when you suspect something is wrong with a volume and you want -to prevent any changes to it while you are investigating the problem. -

    To unlock a locked VLDB entry, issue the vos unlock command, -which unlocks a single VLDB entry, or the vos unlockvldb command, -which unlocks potentially many entries. This is useful when a volume -operation fails prematurely and leaves a VLDB entry locked, preventing you -from acting to correct the problems resulting from the failure. - - -

    To lock a VLDB entry

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos lock to lock the entry. -
         
      -   % vos lock <volume name or ID>
      -   
      -
      -

      where -

      -

      lo -
      Is the shortest acceptable abbreviation of lock. -

      volume name or ID -
      Identifies the volume to be locked, either by its complete name or volume -ID number. It can be any of the three versions of the volume. -
      -
    - - -

    To unlock a single VLDB entry

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos unlock command to unlock the entry. -
         % vos unlock <volume name or ID>
      -   
      -
      -

      where -

      -

      unlock -
      Must be typed in full. -

      volume name or ID -
      Identifies the volume to be unlocked, either by its complete name or -volume ID number. It can be any of the three versions of the -volume. -
      -
    - - -

    To unlock multiple VLDB entries

    -
      -

    1. Verify that you are listed in the /usr/afs/etc/UserList -file. If necessary, issue the bos listusers command, which -is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the vos unlockvldb command to unlock the desired -entries. -
         
      -   % vos unlockvldb [<machine name>] [<partition name>]
      -   
      -
      -

      where -

      -

      unlockv -
      Is the shortest acceptable abbreviation of unlockvldb. -

      machine name -
      Specifies a file server machine. Provide this argument alone to -unlock all VLDB entries that mention the machine in a site definition. -Omit both this argument and the partition name argument to unlock all -VLDB entries. -

      partition name -
      Specifies a partition. Provide this argument alone to unlock all -VLDB entries that mention the partition (on any machine) in a site -definition. Omit both this argument and the machine name -argument to unlock all VLDB entries. -
      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd011.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd011.htm deleted file mode 100755 index 7bd5e9fdb..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd011.htm +++ /dev/null @@ -1,2557 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Configuring the AFS Backup System

    -

    The AFS Backup System helps you to create backup copies of -data from AFS volumes and to restore data to the file system if it is lost or -corrupted. This chapter explains how to configure the Backup -System. For instructions on backing up and restoring data and -displaying dump records, see Backing Up and Restoring AFS Data. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - -
    Determine tape capacity and filemark size -fms -
    Define Tape Coordinator entry in Backup Database -backup addhost -
    Remove Tape Coordinator entry from Backup Database -backup delhost -
    Display Tape Coordinator entries from Backup Database -backup listhosts -
    Create volume set -backup addvolset -
    Add volume entry to volume set -backup addvolentry -
    List volume sets and entries -backup listvolsets -
    Delete volume set from Backup Database -backup delvolset -
    Delete volume entry from volume set -backup delvolentry -
    Define dump level -backup adddump -
    Change expiration date on existing dump level -backup setexp -
    Delete dump level from dump hierarchy -backup deldump -
    Display dump hierarchy -backup listdumps -
    Label tape -backup labeltape -
    Read label on tape -backup readlabel -
    -


    Introduction to Backup System Features

    - -

    The AFS Backup System is highly flexible, enabling you to control most -aspects of the backup process, including how often backups are performed, -which volumes are backed up, and whether to dump all of the data in a volume -or just the data that has changed since the last dump operation. You -can also take advantage of several features that automate much of the backup -process. -

    To administer and use the Backup System most efficiently, it helps to be -familiar with its basic features, which are described in the following -sections. For pointers to instructions for implementing the features as -you configure the Backup System in your cell, see Overview of Backup System Configuration. -

    Volume Sets and Volume Entries

    - - - - - -

    When you back up AFS data, you specify which data to include in terms of -complete volumes rather than individual files. More precisely, you -define groups of volumes called volume sets, each of which includes -one or more volumes that you want to back up in a single operation. You -must include a volume in a volume set to back it up, because the command that -backs up data (the backup dump command) does not accept individual -volume names. -

    A volume set consists of one or more volume entries, each of -which specifies which volumes to back up based on their location (file server -machine and partition) and volume name. You can use a wildcard notation -to include all volumes that share a location, a common character string in -their names, or both. -

    For instructions on creating and removing volume sets and volume entries, -see Defining and Displaying Volume Sets and Volume Entries. -

    Dumps and Dump Sets

    - - - - - - - - - - -

    A dump is the collection of data that results from backing up a -volume set. A full dump includes all of the data in every -volume in the volume set, as it exists at the time of the dump -operation. An incremental dump includes only some of the -data from the volumes in the volume set, namely those files and directory -structures that have changed since a specified previous dump operation was -performed. The previous dump is referred to as the incremental -dump's parent dump, and it can be either a full dump or an -incremental dump itself. -

    A dump set is a collection of one or more dumps stored together -on one or more tapes. The first dump in the dump set is the -initial dump, and any subsequent dump added onto the end of an -existing dump set is an appended dump. Appending dumps is -always optional, but maximizes use of a tape's capacity. In -contrast, creating only initial dumps can result in many partially filled -tapes, because an initial dump must always start on a new tape, but does not -necessarily extend to the end of the tape. Appended dumps do not have -to be related to one another or to the initial dump (they do not have to be -dumps of the same or related volume sets), but well-planned appending can -reduce the number of times you have to change tapes during a restore -operation. For example, it can make sense to append incremental dumps -of a volume set together in a single dump set. -

    All the records for a dump set are indexed together in the Backup Database -based on the initial dump (for more on the Backup Database, see The Backup Database and Backup Server Process). To delete the database record of an appended dump, -you must delete the initial dump record, and doing so deletes the records for -all dumps in the dump set. Similarly, you cannot recycle just one tape -in a dump set without deleting the database records of all tapes in the dump -set. -

    For instructions on creating an initial dump, see Backing Up Data, and to learn how to append dumps, see Appending Dumps to an Existing Dump Set. -

    Dump Hierarchies, Dump Levels and Expiration Dates

    - - - - - - -

    A dump hierarchy is a logical structure that defines the -relationship between full and incremental dumps; that is, it defines -which dump serves as the parent for an incremental dump. Each -individual component of a hierarchy is a dump level. When -you create a dump by issuing the backup dump command, you specify a -volume set name and a dump level name. The Backup System uses the dump -level to determine whether the dump is full or incremental, and if -incremental, which dump level to use as the parent. -

    You can associate an expiration date with a dump level, to -define when a dump created at that level expires. The Backup System -refuses to overwrite a tape until all dumps in the dump set to which the tape -belongs have expired, so assigning expiration dates automatically determines -how you recycle tapes. You can define an expiration date either in -absolute terms (for example, 13 January 2000) or relative terms (for example, -30 days from when the dump is created). You can also change the -expiration date associated with a dump level (but not with an actual dump that -has already been created at that level). -

    For instructions on creating dump hierarchies, assigning expiration dates, -and establishing a tape recycling schedule, see Defining and Displaying the Dump Hierarchy. - - - - - - -

    Dump Names and Tape Names

    -

    When you create a dump, the Backup System creates a Backup -Database record for it, assigning a name comprising the volume set name and -the last element in the dump level pathname: -

       volume_set_name.dump_level_name
    -
    -

    For example, a dump of the volume set user at the dump level -/sunday/friday is called user.friday. The -Backup System also assigns a unique dump ID number to the dump to -distinguish it from other dumps with the same name that possibly exist. -

    The Backup System assigns a similar AFS tape name to each tape -that contains a dump set, reflecting the volume set and dump level of the dump -set's initial dump, plus a numerical index of the tape's position in -the dump set, and a unique dump ID number: -

       volume_set_name.dump_level_name.tape_index (dump ID)
    -
    -

    For example, the second tape in a dump set whose initial dump is of the -volume set uservol at the dump level /sunday/friday has -AFS tape name like uservol.friday.2 -(914382400). -

    In addition to its AFS tape name, a tape can have an optional -permanent name that you assign. Unlike the AFS tape name, -the permanent name does not have to indicate the volume set and dump level of -the initial (or any other) dump, and so does not change depending on the -contents of the tape. The Backup System does not require a certain -format for permanent names, so you need to make sure that each tape's -name is unique. If a tape has a permanent name, the Backup System uses -it rather than the AFS tape name when referring to the tape in prompts and the -output from most backup commands, but still tracks the AFS tape -name internally. -

    Tape Labels, Dump Labels, and EOF Markers

    - - - - -

    Every tape used in the Backup System has a magnetic label at the beginning -that records the tape's name, capacity, and other information. You -can use the backup labeltape command to write a label, or the -backup dump command creates one automatically if you use an -unlabeled tape. The label records the following information: -

      -

    • The tape's permanent name, which you can assign by using the --pname argument to the backup labeltape command. -It can be any string of up to 32 characters. If you do not assign a -permanent name, the Backup System records the value <NULL> when -you use the backup labeltape command to assign an AFS tape name, or -when you use the backup dump command to write a dump to the -tape. -

    • The tape's AFS tape name, which can be one of three types -of values: -
        -

      • A name that reflects the volume set and dump level of the dump set's -initial dump and the tape's place in the sequence of tapes for the dump -set, as described in Dump Names and Tape Names. If the tape does not have a permanent name, you can -assign the AFS tape name by using the -name argument to the -backup labeltape command. -

      • The value <NULL>, which results when you assign a permanent -name, or provide no value for the backup labeltape command's --name argument. -

      • No AFS tape name at all, indicating that you have never labeled the tape -or written a dump to it. -
      -

      If a tape does not already have an actual AFS tape name when you write a -dump to it, the Backup System constructs and records the appropriate AFS tape -name. If the tape does have an AFS tape name and you are writing an -initial dump, then the name must correctly reflect the dump's volume set -and dump level. -

    • The capacity, or size, of the tape, followed by a letter that -indicates the unit of measure (k or K for kilobytes, -m or M for megabytes, g or G for -gigabytes, or t or T for terabytes). The -tape's manufacturer determines the tape's capacity. For -further discussion of how the Backup System uses the value in the capacity -field, see Configuring the tapeconfig File. -
    -

    For information about labeling tapes, see Writing and Reading Tape Labels. -

    In addition to the tape label, the Backup System writes a dump -label on the tape for every appended dump (the tape label and dump label -are the same for the initial dump). A dump label records the following -information: -

      -

    • The name of the tape containing the dump -

    • The date and time that the dump operation began -

    • The cell to which the volumes in the dump belong -

    • The dump's size in kilobytes -

    • The dump's dump level -

    • The dump's dump ID -
    -

    The Backup System writes a filemark (also called an End-of-File -or EOF marker) between the data from each volume in a dump. The tape -device's manufacturer determines the filemark size, which is typically -between 2 KB and 2 MB; in general, the larger the usual capacity of the -tapes that the device uses, the larger the filemark size. If a dump -contains a small amount of data from each of a large number of volumes, as -incremental dumps often do, then the filemark size can significantly affect -how much volume data fits on the tape. To enable the Backup System to -factor in filemark size as it writes a dump, you can record the filemark size -in a configuration file; see Configuring the tapeconfig File. -

    Tape Coordinator Machines, Port Offsets, and Backup Data Files

    - - - - -

    A Tape Coordinator machine is a machine that drives one or more -attached tape devices used for backup operations. It must run the AFS -client software (the Cache Manager) but reside in a physically secure location -to prevent unauthorized access to its console. Before backup operations -can run on a Tape Coordinator machine, each tape device on the machine must be -registered in the Backup Database, and certain files and directories must -exist on the machine's local disk; for instructions, see To configure a Tape Coordinator machine. -

    Each tape device on a Tape Coordinator machine listens for backup requests -on a different UNIX port. You pick the port indirectly by assigning a -port offset number to the tape device. The Backup System -sets the device's actual port by adding the port offset to a base port -number that it determines internally. For instructions on assigning -port offset numbers, see Configuring the tapeconfig File. -

    For a tape device to perform backup operations, a Backup Tape Coordinator -(butc) process dedicated to the device must be running actively on -the Tape Coordinator machine. You then direct backup requests to the -device's Tape Coordinator by specifying its port offset number with the --portoffset argument to the backup command. -

    In addition to writing backup data to tape, you can direct it to a -backup data file on the local disk of a Tape Coordinator -machine. You can then to transfer the data to a data-archiving system, -such as a hierarchical storage management (HSM) system, that you use in -conjunction with AFS and the Backup System. A backup data file has a -port offset like a tape device. For instructions on configuring backup -data files, see Dumping Data to a Backup Data File. -

    The Backup Database and Backup Server Process

    - - -

    The Backup Database is a replicated administrative database -maintained by the Backup Server process on the cell's database -server machines. Like the other AFS database server processes, the -Backup Server uses the Ubik utility to keep the various copies of the database -synchronized (for a discussion of Ubik, see Replicating the AFS Administrative Databases). -

    The Backup Database records the following information: -

      -

    • The Tape Coordinator machine's hostname and the port offset number -for each tape device used for backup operations -

    • The dump hierarchy, which consists of its component dump levels and their -associated expiration dates -

    • The volume sets and their component volume entries -

    • A record for each dump, which includes the name of each tape it appears -on, a list of the volumes from which data is included, the dump level, the -expiration date, and the dump ID of the initial dump with which the dump is -associated -

    • A record for each tape that houses dumped data -
    -

    Interfaces to the Backup System

    -

    The backup suite of commands is the administrative interface -to the Backup System. You can issue the commands in a command shell (or -invoke them in a shell script) on any AFS client or server machine from which -you can access the backup binary. In the conventional -configuration, the binary resides on the local disk. -

    The backup command suite provides an interactive -mode, in which you can issue multiple commands over a persistent -connection to the Backup Server and the Volume Location (VL) Server. -Interactive mode has several convenient features, including the -following: -

      -

    • You need to type only the operation code, omitting the initial -backup string. -

    • If you assume another AFS identity or specify a foreign cell as you enter -interactive mode, it applies to all subsequent commands. -

    • You do not need to enclose shell metacharacters in double quotes. -

    • You can track current and pending operations with the (backup) -jobs command, which is available only in this mode. -

    • You can cancel current and pending operations with the (backup) -kill command, which is available only in this mode. -
    -

    Before issuing a command that requires reading or writing a tape (or backup -data file), you must also open a connection to the Tape Coordinator machine -that is attached to the relevant tape device (or that has the backup data file -on its local disk), and issue the butc command to initialize the -Tape Coordinator process. The process must continue to run and the -connection remain open as long as you need to use the tape device or file for -backup operations. -

    For further discussion and instructions, see Using the Backup System's Interfaces. -


    Overview of Backup System Configuration

    - -

    Before you can use the Backup System to back up and restore data, you must -configure several of its basic components. The indicated sections of -this chapter explain how to perform the following configuration tasks: -

    -

    If you have already configured all of the components required for -performing a backup dump or restore operation, you can proceed to the -instructions in Backing Up Data and Restoring and Recovering Data. -


    Configuring the tapeconfig File

    - - - - - -

    Several factors interact to determine how much data the Tape Coordinator -can fit on a tape: -

      -

    • The tape's capacity (size), as set by the tape manufacturer. -

    • The tape device's filemark size, as set by the tape device's -manufacturer. Recall from Tape Labels, Dump Labels, and EOF Markers that the Tape Coordinator writes a filemark between the data -from each volume in a dump. If a dump contains a small amount of data -from each of a large number of volumes, as incremental dumps often do, then -the filemark size can significantly affect how much volume data fits on the -tape. -

    • Whether or not you use the tape device's compression mode. -
    -

    (The amount of data that can fit in a backup data file is determined by -amount of space available on the partition, and the operating system's -maximum file size. The Tape Coordinator does not write filemarks when -writing to a backup data file. For further information about -configuring a Tape Coordinator to write to a backup data file, see Dumping Data to a Backup Data File.) -

    As the Tape Coordinator (butc) process initializes, it reads the -/usr/afs/backup/tapeconfig file on its local disk to learn the tape -capacity and filemark size (for a tape device) or the file size (for a backup -data file) to use for dump operations. When you begin a dump operation, -the Tape Coordinator also reads the tape or backup data file's label to -see if you have recorded a different tape capacity or file size. If you -have, the value on the label overrides the default value from the -tapeconfig file. -

    As the Tape Coordinator writes data to a tape during a dump operation, it -uses the capacity and filemark information to track how much tape it has used -and how much remains before the physical end-of-tape (EOT). Shortly -before reaching EOT, the Tape Coordinator stops writing and requests a new -tape. Similarly, it uses a backup data file's size to know when it -is about to exhaust the space in the file. If the Tape Coordinator -reaches the EOT unexpectedly, it recovers by obtaining a new tape and writing -to it the entire contents of the volume it was writing when it reached -EOT. The interrupted volume remains on the first tape, but is never -used. -

    Many tape devices use tapes that can accommodate multiple gigabytes, or -even multiple terabytes, of backup data, especially if you use the -device's compression mode. When writing to such devices and tapes, -allowing the Tape Coordinator to hit the EOT unexpectedly is generally -recommended. The devices write data so quickly that it usually does not -take much extra time to rewrite the interrupted volume on the new tape. -Similarly, they compress data so well that the data abandoned on the first -tape from the interrupted volume does not constitute a waste of much -tape. -

    When writing to tapes that accommodate a smaller amount of data (say, less -than two GB), it is better to avoid having the Tape Coordinator hit EOT -unexpectedly. AFS supports volumes up to 2 GB in size, so an -interrupted volume can in fact take up most of the tape. For such -tapes, recording accurate values for tape capacity and filemark size, if -possible, helps to maximize both use of tape and the efficiency of dump -operations. The following discussion of the fields in the -tapeconfig file explains how to determine the appropriate -values. -

    Use a text editor to create an entry in a Tape Coordinator's -tapeconfig file for each tape device or backup data file that it -uses. Each device or file's entry is on its own line and has the -following format: -

       [capacity   filemark_size]    device_name    port_offset
    -
    -

    where -

    -

    capacity -
    Specifies the capacity of the tapes used with a tape device, or the amount -of data to write into a backup data file. Specify an integer value -followed by a letter that indicates units, with no intervening space. -The letter k or K indicates kilobytes, m or -M indicates megabytes, g or G indicates -gigabytes, and t or T indicates terabytes. If the -units letter is omitted, the default is kilobytes. -

    To determine the capacity of a tape under two GB in size that you are going -to use in regular (noncompression) mode, you can either use the value that the -tape's manufacturer specifies on the tape's packaging or use the -fms command to calculate the capacity, as described later in this -section. To avoid having the Tape Coordinator reach the EOT -unexpectedly, it is best to record in the tapeconfig file or on the -label a capacity that is about 10% smaller than the actual capacity of the -tape. To calculate the appropriate value for a small tape used in -compression mode, one method is to multiply the tape capacity (as recorded by -the manufacturer) by the device's compression ratio. -

    For tapes that hold multiple gigabytes or terabytes of data, or if using a -tape drive's compression mode, the recommended configuration is to record -a value quite a bit (for instance, two times) larger than the maximum amount -you believe can fit on the tape. It is not generally worthwhile to run -the fms command on large tapes, even in noncompression mode. -The command definitely does not yield accurate results in compression -mode. The Tape Coordinator is likely to reach the EOT unexpectedly, but -compression mode fits so much data on the tape that the data abandoned from an -interrupted volume does not represent much of the tape's capacity. -

    For a backup data file, record a value slightly smaller than the amount of -space available on the partition, and definitely smaller than the operating -system's maximum file size. It is also best to limit the ability -of other processes to write to the partition, to prevent them from using up -the space in the partition. -

    If this field is empty, the Tape Coordinator uses the maximum acceptable -value (2048 GB or 2 TB). Either leave both this field and the -filemark_size field empty, or provide a value in both of them. -

    filemark_size -
    Specifies the tape device's filemark size, which usually falls -between 2 KB and 2 MB. Use the same notation as for the -capacity field, but note that if you omit the units letter, the -default unit is bytes rather than kilobytes. -

    For a tape device in regular (noncompression) mode, you can use the -fms command to determine filemark size, or use the value reported -by the device's manufacturer. To help the Tape Coordinator avoid -reaching EOT unexpectedly, increase the value by about 10% when recording it -in the tapeconfig file. -

    The recommended value for a tape device in compression mode is 0 -(zero). The fms command does not yield accurate results in -compression mode, so you cannot use it to determine the filemark size. -

    The recommended value for a backup data file is also 0 -(zero). The Tape Coordinator does not use filemarks when writing to a -file, but a value must appear in this field nevertheless if there is also a -value in the capacity field. -

    If this field is empty, the Tape Coordinator uses the value 0 -(zero). Either leave both this field and the capacity field -empty, or provide a value in both of them. -

    device_name -
    Specifies the complete pathname of the tape device or backup data -file. The format of tape device names depends on the operating system, -but on UNIX systems, device names generally begin with the string -/dev/. For a backup data file, this field defines the -complete pathname, but for suggestions on how to name a backup data file, see Dumping Data to a Backup Data File. -

    port_offset -
    Specifies the port offset number for a specific tape device or backup data -file. Each tape device listens for backup requests on a different UNIX -port. You pick the port indirectly by recording a value in this -field. The Backup System sets the device's actual port by adding -the port offset to a base port number that it determines internally. -

    Legal values are the integers 0 through 58510 (the -Backup System can track a maximum of 58,511 port offset numbers). Each -value must be unique among the cell's Tape Coordinators, but you do not -have to assign port offset numbers sequentially, and you can associate any -number of them with a single machine or even tape device. For example, -if you plan to use a device in both compression and noncompression mode, -assign it two different port offsets with appropriate tape capacity and -filemark values for the different modes. -

    Assign port offset 0 (zero) to the Tape Coordinator for the tape -device or backup data file that you use most often for backup operations; -doing so enables you to omit the -portoffset argument from the -largest possible number of backup commands. -

    -

    The following example tapeconfig file includes entries for two -tape devices, /dev/rmt0h and /dev/rmt1h. Each one -uses tapes with a capacity of 2 GB and has a filemark size of 1 MB. -Their port offset numbers are 0 and 1. -

       2g 1m /dev/rmt0h 0
    -   2G 1M /dev/rmt1h 1
    -
    -

    The fms command reports the capacity of the tape you have -inserted and the tape device's filemark size, both on the standard output -stream (stdout) and in its fms.log file, which it writes in -the current working directory. The command interpreter must write data -to the entire tape, so running the command can take from several hours to more -than a day, depending on the size of the tape. -

    To run the fms command on a noncompressing tape device

    - - - - - -
      -

    1. If an fms.log file does not already exist in the current -directory, verify that you can insert and write to files in the current -directory. If the log file already exists, you must be able to write to -the file. -

    2. Insert a tape into the drive. Running the command completely -overwrites the tape, so use a blank tape or one that you want to -recycle. -

    3. Issue the fms command. -
         % fms <tape special file>
      -
      -

      where -

      -

      fms -
      Must be typed in full. -

      tape special file -
      Specifies the tape device's UNIX device name, such as -/dev/rmt0h. -
      -
    -

    The following example output reports that the tape in the device with -device name /dev/rmt0h has a capacity of 2136604672 bytes (about 2 -GB), and that the device's filemark size is 1910205 bytes (close to 2 -MB). -

       % fms /dev/rmt0h
    -   wrote block: 130408
    -   Finished data capacity test - rewinding
    -   wrote 1109 blocks, 1109 file marks
    -   Finished file mark test
    -   Tape capacity is 2136604672 bytes
    -   File marks are 1910205 bytes
    -
    -

    Granting Administrative Privilege to Backup Operators

    -

    Each person who issues the backup and -butc commands in your cell must be listed in the -/usr/afs/etc/UserList file on every database server machine that -stores the Backup Database and Volume Location Database (VLDB), and every -machine that houses a volume included in a volume set. By convention, -the UserList file is the same on every server machine in the -cell; the instructions in this document assume that your cell is -configured in this way. To edit the UserList file, use the -bos adduser and bos removeuser commands as described in Administering the UserList File. -

    In addition to being listed in the UserList file, backup -operators who issue the butc command must be able to write to the -files stored in each Tape Coordinator machine's local -/usr/afs/backup directory, which are protected by UNIX mode -bits. Before configuring your cell's first Tape Coordinator -machine, decide which local user and group to designate as the owner of the -directory and the files in it. Among the possible ownership options are -the following: -

      -

    • The local superuser root. With this option, the issuer -of the butc command must log onto the local file system as the -local superuser root. If the Tape Coordinator is also a -server machine, the -localauth flag is used on the butc -command to construct a server ticket from the local -/usr/afs/etc/KeyFile file. On non-server machine, the issuer -must issue the klog command to authenticate as an AFS administrator -while logged in as root. -

    • A single AFS administrator. Logging in and authenticating are a -single step if an AFS-modified login utility is used. The administrator -is the only user who can start the Tape Coordinator. -

    • An administrative account for which several operators know the -password. This allows them all to start the Tape Coordinator. -
    -

    Another option is to define a group in the local group file -(/etc/group or equivalent) to which all backup operators -belong. Then turn on the w mode bit (write -permission) in the group mode bits rather than the user mode bits of the -/usr/afs/backup directory and files in it. An advantage over -the methods listed previously is that each operator can retain an individual -administrative account for finer granularity in auditing. -

    For instructions on implementing your choice of protection methods, see Configuring Tape Coordinator Machines and Tape Devices. -


    Configuring Tape Coordinator Machines and Tape Devices

    - - - - -

    This section explains how to configure a machine as a Tape Coordinator -machine, and how to configure or remove the Tape Coordinator associated with a -single tape device or backup data file. -
    Note:When configuring a tape device attached to an AIX system, you must set the -device's tape block size to 0 (zero) to indicate variable -block size. If you do not, it is possible that devices attached to -machines of other system types cannot read the tapes made on the AIX -system. Use the AIX smit program to verify or change the -value of the tape block size for a tape device, as instructed in Sep 3. -
    -

    To configure a Tape Coordinator machine

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    3. Install one or more tape devices on the Tape Coordinator -machine according to the manufacturer's instructions. The Backup -System can track a maximum of 58,511 tape devices or backup data files per -cell. -

      If the Tape Coordinator machine is an AIX system, issue the following -command to change the tape device's tape block size to 0 -(zero), which indicates variable block size. Repeat for each tape -device. -

         # chdev -l 'device_name' -a block_size='0'
      -
      -

      where device_name is the tape device's device name (for -example, /dev/rmt0h). -

    4. Verify that the binary files for the backup, butc, -and fms commands are available on the local disk. If the -machine is an AFS client, the conventional location is the -/usr/afsws/etc directory. -
         # ls /usr/afsws/etc
      -
      -

    5. Create the /usr/afs directory. (If the Tape Coordinator -machine is also configured as a file server machine, this directory already -exists.) Then create the /usr/afs/backup directory. -
         # mkdir /usr/afs
      -   # mkdir /usr/afs/backup
      -
      -

    6. Use a text editor to create the /usr/afs/backup/tapeconfig -file. Include a single line for each tape device or backup data file, -specifying the following information in the indicated order. For syntax -details and suggestions on the values to use in each field, see Configuring the tapeconfig File. -
        -

      • The capacity of tapes to be used in the device, or the size of the backup -data file -

      • The device's filemark size -

      • The device's device name, starting with the string /dev/ -

      • The device's port offset number -
      - - - - -

    7. Decide which user and group are to own the /usr/afs/backup -directory and /usr/afs/backup/tapeconfig file, based on the -suggestions in Granting Administrative Privilege to Backup Operators. Correct the UNIX mode bits on the directory and -file, if necessary. -
         # chown admin_owner /usr/afs/backup
      -   # chown admin_owner /usr/afs/backup/tapeconfig
      -   # chgrp admin_group /usr/afs/backup
      -   # chgrp admin_group /usr/afs/backup/tapeconfig
      -   # chmod 774 /usr/afs/backup
      -   # chmod 664 /usr/afs/backup/tapeconfig
      -
      - - - - -

    8. Issue the backup addhost command to create -a Tape Coordinator entry in the Backup Database. Repeat the command for -each Tape Coordinator. -
         # backup addhost <tape machine name> [<TC port offset>]
      -
      -

      where -

      -

      addh -
      Is the shortest acceptable abbreviation of addhost. -

      tape machine name -
      Specifies the Tape Coordinator machine's fully qualified -hostname. -

      TC port offset -
      Specifies the tape device's port offset number. Provide the -same value as you specified for the device in the tapeconfig -file. You must provide this argument unless the default value of 0 -(zero) is appropriate. -
      -
    -

    To configure an additional Tape Coordinator on an existing Tape Coordinator machine

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    3. Install the tape device on the Tape Coordinator machine according to the -manufacturer's instructions. -

      If the Tape Coordinator machine is an AIX system, issue the following -command to change the tape device's tape block size to 0 -(zero), which indicates variable block size. -

         # chdev -l 'device_name' -a block_size='0'
      -
      -

    4. Choose the port offset number to assign to the tape device. If -necessary, use the backup listhosts command to display the port -offset numbers that are already used; for a discussion of the output, see -To display the list of configured Tape Coordinators. -
         # backup listhosts
      -
      -

      where listh is the shortest acceptable abbreviation of -listhosts. -

    5. Use a text editor to add one or more entries for the device to the -/usr/afs/backup/tapeconfig file. Specify the following -information in the indicated order. For syntax details and suggestions -on the values to use in each field, see Configuring the tapeconfig File. -
        -

      • The capacity of tapes to be used in the device, or the size of the backup -data file -

      • The device's filemark size -

      • The device's device name, starting with the string /dev/ -

      • The device's port offset number -
      -

    6. Issue the backup addhost command to create an entry in the -Backup Database for the Tape Coordinator. For complete syntax, see Step -8 in To configure a Tape Coordinator machine. -
         # backup addhost <tape machine name> [<TC port offset>]
      -
      -
    - - - - -

    To unconfigure a Tape Coordinator

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Using a text editor, remove each of the Tape Coordinator's entries -from the /usr/afs/backup/tapeconfig file. -

    3. Issue the backup delhost command to delete the Tape -Coordinator's Backup Database entry. -
         % backup delhost <tape machine name> [<TC port offset>]
      -
      -

      where -

      -

      delh -
      Is the shortest acceptable abbreviation of delhost. -

      tape machine name -
      Is the complete Internet host name of the Tape Coordinator machine. -

      TC port offset -
      Is the same port offset number removed from the tapeconfig -file. You must provide this argument unless the default value of -0 (zero) is appropriate. -
      -
    - - - - -

    To display the list of configured Tape Coordinators

    -
      -

    1. Issue the backup listhosts command to list the Tape -Coordinators and port offset numbers currently configured in the Backup -Database. -
         % backup listhosts
      -
      -

      where -

      -

      listh -
      Is the shortest acceptable abbreviation of listhosts. -
      -
    -

    The output lists each Tape Coordinator machine and the port offset numbers -currently allocated to it in the Backup Database. The appearance of a -port offset number does not imply that the associated Tape Coordinator is -actually running. Machine names appear in the format in which they were -specified with the backup addhost command. -

    The following example output lists the Tape Coordinators currently defined -in the Backup Database of the ABC Corporation cell: -

       % backup listhosts
    -   Tape hosts:
    -       Host backup1.abc.com, port offset 0
    -       Host backup1.abc.com, port offset 2
    -       Host backup2.abc.com, port offset 1
    -       Host backup2.abc.com, port offset 3
    -
    -

    Defining and Displaying Volume Sets and Volume Entries

    -

    The Backup System handles data at the level of volumes -rather than individual files. You must define groups of volumes called -volume sets before performing backup operations, by using the -backup addvolset command. A volume set name can be up to 31 -characters long and can include any character other than the period -(.), but avoid using metacharacters that have special -meanings to the shell. -

    After creating a volume set, use the backup addvolentry command -to place one or more volume entries in it. They define the -volumes that belong to it in terms of their location (file server machine and -partition) and name. Use the command's required -server -argument to designate the file server machine that houses the volumes of -interest and its required -partition argument to designate the -partition. Two types of values are acceptable: -

      -

    • The fully qualified hostname of one machine or full name of one partition -(such as /vicepm) -

    • The regular expression .* (period and asterisk), which -matches every machine name or partition name in the VLDB -
    -

    For the volume name (the required -volume argument), specify a -combination of alphanumeric characters and one or more metacharacters to -specify part or all of the volume name with a wildcard. You can use any -of the following metacharacters in the volume name field: - - -

    -

    . -
    The period matches any single character. -

    * -
    The asterisk matches zero or more instances of the preceding -character. Combine it with any other alphanumeric character or -metacharacter. -

    [ ] -
    Square brackets around a list of characters match a single instance of any -of the characters, but no other characters; for example, [abc] -matches a single a or b or c, but not -d or A. You can combine this expression with the -asterisk. -

    ^ -
    The caret, when used as the first character in a square-bracketed set, -designates a match with any single character other than the characters that -follow it; for example, [^a] matches any single character -except lowercase a. You can combine this expression with the -asterisk. -

    \ -
    A backslash preceding any of the metacharacters in this list makes it -match its literal value only. For example, the expression -\. (backslash and period) matches a single period, -\* matches a single asterisk, and \\ matches a single -backslash. You can combine such expressions with the asterisk (for -example, \.* matches any number of periods). -
    -

    Perhaps the most common regular expression is the period followed by an -asterisk (.*). This expression matches any string of -any length, because the period matches any character and the asterisk means -any number of that character. As mentioned, it is the only acceptable -regular expression in the file server and partition fields of a volume -entry. In the volume name field, it can stand alone (in which case it -matches every volume listed in the VLDB), or can combine with alphanumeric -characters. For example, the string -user.*\.backup matches any volume name that begins -with the string user and ends with -.backup. -

    Issuing the backup addvolentry command in interactive mode is -simplest. If you issue it at the shell prompt, you must surround any -string that includes a regular expression with double quotes (" ") -so that the shell passes them uninterpreted to the backup command -interpreter rather than resolving them. -

    To define various combinations of volumes, provide the following types of -values for the backup addvolentry command's three -arguments. The list uses the notation appropriate for interactive -mode; if you issue the command at the shell prompt instead, place double -quotes around any string that includes a regular expression. To create -a volume entry that includes: -

      -

    • All volumes listed in the VLDB, use the regular expression -.* for all three arguments (-server .* --partition .* -volume .*) -

    • Every volume on a specific file server machine, specify its fully -qualified hostname as the -server argument and use the regular -expression .* for the -partition and --volume arguments (for example: -server -fs1.abc.com -partition .* -volume .*) -

    • All volumes that reside on a partition with the same name on various file -server machines, specify the complete partition name as the --partition argument and use the regular expression -.* for the -server and -volume -arguments (for example: -server .* -partition /vicepd --volume .*) -

    • Every volume with a common string in its name, use the regular expression -.* for the -server and -partition -arguments, and provide a combination of alphanumeric characters and -metacharacters as the -volume argument (for example: --server .* -partition .* -volume -.*\.backup includes all volumes whose names end in the -string .backup). -

    • All volumes on one partition, specify the machine's fully qualified -hostname as the -server argument and the full partition name as the --partition argument, and use the regular expression -.* for the -volume argument (for example: --server fs2.abc.com -partition /vicepb -volume -.*). -

    • A single volume, specify its complete name as the -volume -argument. To bypass the potentially time-consuming search through the -VLDB for matching entries, you can specify an actual machine and partition -name for the -server and -partition arguments -respectively. However, if it is possible that you need to move the -volume in future, it is best to use the regular expression -.* for the machine and partition name. -
    -

    As you create volume sets, define groups of volumes you want to dump to the -same tape at the same time (for example, weekly or daily) and in the same -manner (fully or incrementally). In general, a volume set that includes -volumes with similar contents (as indicated by similar names) is more useful -than one that includes volumes that share a common location, especially if you -often move volumes for load-balancing or space reasons. Most often, -then, it is appropriate to use the regular expression .* -(period followed by a backslash) for the -server and --partition arguments to the backup addvolentry -command. -

    It is generally more efficient to include a limited number of volumes in a -volume entry. Dumps of a volume set that includes a large number of -volume can take a long time to complete, increasing the possibility that the -operation fails due to a service interruption or outage. -

    To remove a volume entry from a volume set, use the backup -delvolentry command. To remove a volume set and all of its -component volume entries from the Backup Database, use the backup -delvolset command. To display the volume entries in a volume set, -use the backup listvolsets command. -

    By default, a Backup Database record is created for the new volume -set. Sometimes it is convenient to create volume sets without recording -them permanently in the Backup Database, for example when using the -backup volsetrestore command to restore a group of volumes that -were not necessarily backed up together (for further discussion, see Using the backup volsetrestore Command). To create a temporary volume set, -include the -temporary flag to the backup addvolset -command. A temporary volume set exists only during the lifetime of the -current interactive session, so the flag is effective only when used during an -interactive session (opened by issuing the backup (interactive) -command). You can use the backup delvolset command to delete -a temporary volume set before the interactive session ends, if you wish, but -as noted it is automatically deleted when you end the session. One -advantage of temporary volume sets is that the backup addvolset -command, and any backup addvolentry commands subsequently used to -add volume entries to it, complete more quickly than for regular volume sets, -because you are not creating any Backup Database records. - - - - -

    To create a volume set

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. (Optional) Issue the backup command to enter -interactive mode. If you are going to define volume entries right away -with the backup addvolentry command, this eliminates the need to -surround metacharacter expressions with double quotes. You must enter -interactive mode if creating a temporary volume set. -
         % backup
      -
      -

    3. Issue the (backup) addvolset command to create the volume -set. You must then issue the (backup) addvolentry command to -define volume entries in it. -
         backup>  addvolset <volume set name> [-temporary]
      -
      -

      where -

      -

      addvols -
      Is the shortest acceptable abbreviation of addvolset. -

      volume set name -
      Names the volume set. The name can include no more than 31 -characters, cannot include periods, and must be unique within the Backup -Database. (A temporary volume set can have the same name as an existing -permanent volume set, but this is not recommended because of the confusion it -can cause.) -

      -temporary -
      Creates a temporary volume set, which exists only during the current -interactive session. -
      -
    - - - - -

    To add a volume entry to a volume set

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. (Optional) Issue the backup command to enter -interactive mode if you have not already. This makes it simpler to use -metacharacter expressions, because you do not need to surround them with -double quotes. If you are adding entries to a temporary volume set, you -must already have entered interactive mode before creating the volume -set. -
         % backup
      -
      -

    3. Issue the (backup) addvolentry command to define volume entries -in an existing volume set. The Backup System assigns each volume entry -an index within the volume set, starting with 1 (one). -
         backup> addvolentry  -name <volume set name>  \
      -                        -server <machine name>  \
      -                        -partition <partition name>  \
      -                        -volumes <volume name (regular expression)>
      -
      -

      where -

      -

      addvole -
      Is the shortest acceptable abbreviation of addvolentry. -

      -name -
      Names the volume set to which to add the volume entry. It must -already exist (use the backup addvolset command to create -it). -

      -server -
      Defines the set of one or more file server machines that house the volumes -in the volume entry. Provide either one fully-qualified hostname (such -as fs1.abc.com) or the metacharacter expression -.* (period and asterisk), which matches all machine names in -the VLDB. -

      -partition -
      Defines the set of one or more partitions that house the volumes in the -volume entry. Provide either one complete partition name (such as -/vicepa) or the metacharacter expression .* -(period and asterisk), which matches all partition names. -

      -volumes -
      Defines the set of one or more volumes included in the volume entry, -identifying them by name. This argument can include a combination of -alphanumeric characters and one or more of the metacharacter expressions -discussed in the introductory material in this section. -
      -
    - - - - - - -

    To display volume sets and volume entries

    -
      -

    1. Issue the backup listvolsets command to display the volume -entries in a specific volume set or all of them. If you are displaying -a temporary volume set, you must still be in the interactive session in which -you created it. -
         % backup listvolsets [<volume set name>]
      -
      -

      where -

      -

      listv -
      Is the shortest acceptable abbreviation of listvolsets. -

      volume set name -
      Names the volume set to display. Omit this argument to display all -defined volume sets. -
      -

      The output from the command uses the wildcard notation used when the volume -entries were created. The string (temporary) marks a -temporary volume set. The following example displays all three of the -volume sets defined in a cell's Backup Database, plus a temporary volume -set pat+jones created during the current interactive session: -

      -

         backup> listv
      -   Volume set pat+jones (temporary):
      -     Entry 1: server fs1.abc.com, partition /vicepe, volumes: user.pat.backup
      -     Entry 2: server fs5.abc.com, partition /viceph, volumes: user.jones.backup
      -   Volume set user:
      -     Entry 1: server .*, partition .*, volumes: user.*\.backup
      -   Volume set sun:
      -     Entry 1: server .*, partition .*, volumes: sun4x_55\..*
      -     Entry 2: server .*, partition .*, volumes: sun4x_56\..*
      -   Volume set rs:
      -     Entry 1: server .*, partition .*, volumes: rs_aix42\..*
      -
      -
    - - - - -

    To delete a volume set

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup delvolset command to delete one or more volume -sets and all of the component volume entries in them. If you are -deleting a temporary volume set, you must still be in the interactive session -in which you created it. -
         % backup delvolset <volume set name>+
      -
      -

      where -

      -

      delvols -
      Is the shortest acceptable abbreviation of delvolset. -

      volume set name -
      Names each volume set to delete. -
      -
    - - - - - -

    To delete a volume entry from a volume set

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup command to enter interactive mode. -
         % backup
      -
      -

    3. If the volume set includes more than one volume entry, issue the -(backup) listvolsets command to display the index number associated -with each one (if there is only one volume entry, its index is 1). For -a more detailed description of the command's output, see To display volume sets and volume entries. -
         backup> listvolsets <volume set name>
      -
      -

      where -

      -

      listv -
      Is the shortest acceptable abbreviation of listvolsets. -

      volume set name -
      Names the volume set for which to display volume entries. -
      -

    4. Issue the (backup) delvolentry command to delete the volume -entry. -
         backup> delvolentry <volume set name>  <volume entry index>
      -
      -

      where -

      -

      delvole -
      Is the shortest acceptable abbreviation of delvolentry. -

      volume set name -
      Names the volume set from which to delete a volume entry. -

      volume entry index -
      Specifies the index number of the volume entry to delete. -
      -
    -

    Defining and Displaying the Dump Hierarchy

    - - -

    A dump hierarchy is a logical structure in the Backup Database that defines -the relationship between full and incremental dumps; that is, it defines -which dump serves as the parent for an incremental dump. Each -individual component of a hierarchy is a dump level. -

    As you define dump levels with the backup adddump command, keep -the following rules and suggestions in mind: -

      -

    • Each full dump level is the top level of a hierarchy. You can -create as many hierarchies as you need to dump different volume sets on -different schedules. -

    • The name of a full dump level consists of an initial slash (/), -followed by a string of up to 28 alphanumeric characters. -

    • The name of an incremental dump level resembles a pathname, starting with -the name of a full dump level, then the first incremental level, and so on, -down to the final incremental level. Precede each level name with a -slash to separate it from the preceding level. Like the full level, -each component level in the name can have up to 28 alphanumeric characters, -not including the slash. -

    • A hierarchy can have any have any number of levels, but the maximum length -of a complete dump level name is 256 characters, including the slashes. -

    • Before defining a given incremental level, you must define all of the -levels above it in the hierarchy. -

    • Do not use the period (.) in dump level names. -The Backup System uses the period as the separator between a dump's -volume set name and dump level name when it creates the dump name and AFS tape -name. Any other alphanumeric and punctuation characters are allowed, -but it is best to avoid metacharacters. If you include a metacharacter, -you must precede it with a backslash (\) or surround the entire -dump level name with double quotes (" "). -

    • Naming dump levels for days or other actual time points reminds you when -to perform dumps, and makes it easier to track the relationship between dumps -performed at different levels. However, the names have no meaning to -the Backup System: it does not automatically create dumps according to -the names, and does not prevent you from, for example, using the -/sunday level when creating a dump on a Tuesday. -

    • It is best not to use the same name for more than one component level in a -hierarchy, because it means the resulting dump name no longer indicates which -level was used. For example, if you name a dump level -/full/incr/incr, then the dump name and AFS tape name that result -from dumping a volume set at the first incremental level -(/full/incr) look the same as the names that result from dumping at -the second incremental level (/full/incr/incr). -

    • Individual levels in different hierarchies can have the same name, but the -complete pathnames must be unique. For example, -/sunday1/monday and /sunday2/monday share the same name -at the final level, but are unique because they have different names at the -full level (belong to different hierarchies). However, using the same -name in multiple hierarchies means that dump and AFS tape names do not -unambiguously indicate which hierarchy was used. -
    -

    The following example shows three hierarchies. Each begins with a -full dump at the top: sunday1 for the first hierarchy, -sunday2 for the second hierarchy, and sunday_bin for the -third hierarchy. In all three hierarchies, each of the other dump -levels is an incremental level. -

       /sunday1
    -           /monday
    -           /tuesday
    -           /wednesday
    -           /thursday
    -           /friday
    -   /sunday2
    -           /monday
    -                  /tuesday
    -                          /wednesday
    -                                    /thursday
    -                                             /friday
    -    /sunday_bin
    -               /monday
    -                      /wednesday
    -                                /friday
    -
    -

    In the first hierarchy, each incremental dump level refers to the full -level /sunday1 as its parent. When (for example) you dump a -volume set at the /sunday1/wednesday level, it includes data that -has changed since the volume set was dumped at the /sunday1 -level. -

    In contrast, each incremental dump level in the second hierarchy refers to -the immediately preceding dump level as its parent. When you dump a -volume set at the corresponding level in the second hierarchy -(/sunday2/monday/tuesday/wednesday), the dump includes only data -that has changed since the volume set was dumped at the -/sunday2/monday/tuesday level (presumably the day before). -Assuming you create dumps on the indicated days, an incremental dump made -using this hierarchy contains less data than an incremental dump made at the -corresponding level in the first hierarchy. -

    The third hierarchy is more appropriate for dumping volumes for which a -daily backup is excessive because the data does not change often (for example, -system binaries). -

    Creating a Tape Recycling Schedule

    - - - - - - - - -

    If your cell is like most cells, you have a limited amount of room for -storing backup tapes and a limited budget for new tapes. The easiest -solution is to recycle tapes by overwriting them when you no longer need the -backup data on them. The Backup System helps you implement a recycling -schedule by enabling you to associate an expiration date with each dump -level. The expiration date defines when a dump created at that level -expires. Until that time the Backup System refuses to overwrite a tape -that contains the dump. Thus, assigning expiration dates automatically -determines how you recycle tapes. -

    When designing a tape-recycling schedule, you must decide how far in the -past and to what level of precision you want to guarantee access to backed up -data. For instance, if you decide to guarantee that you can restore a -user's home volume to its state on any given day in the last two weeks, -you cannot recycle the tape that contains a given daily dump for at least two -weeks after you create it. Similarly, if you decide to guarantee that -you can restore home volumes to their state at the beginning of any given week -in the last month, you cannot recycle the tapes in a dump set containing a -weekly dump for at least four weeks. The following example dump -hierarchy implements this recycling schedule by setting the expiration date -for each daily incremental dump to 13 days and the expiration date of the -weekly full dumps to 27 days. -

    The tapes used to store dumps created at the daily incremental levels in -the /sunday1 hierarchy expire just in time to be recycled for daily -dumps in the /sunday3 hierarchy (and vice versa), and there is a -similar relationship between the /sunday2 and /sunday4 -hierarchies. Similarly, the tape that houses a full dump at the -/sunday1 level expires just in time to be used for a full dump on -the first Sunday of the following month. -

       
    -   /sunday1   expires in 27d
    -           /monday1  expires in 13d
    -           /tuesday1  expires in 13d
    -           /wednesday1  expires in 13d
    -           /thursday1  expires in 13d
    -           /friday1  expires in 13d
    -   /sunday2   expires in 27d
    -           /monday2  expires in 13d
    -           /tuesday2  expires in 13d
    -           /wednesday2  expires in 13d
    -           /thursday2  expires in 13d
    -           /friday2  expires in 13d
    -   /sunday3   expires in 27d
    -           /monday1  expires in 13d
    -           /tuesday1  expires in 13d
    -           /wednesday1  expires in 13d
    -           /thursday1  expires in 13d
    -           /friday1  expires in 13d
    -   /sunday4   expires in 27d
    -           /monday2  expires in 13d
    -           /tuesday2  expires in 13d
    -           /wednesday2  expires in 13d
    -           /thursday2  expires in 13d
    -           /friday2  expires in 13d
    -
    -

    If you use appended dumps in your cell, keep in mind that all dumps in a -dump set are subject to the latest (furthest into the future) expiration date -associated with any of the constituent dumps. You cannot recycle any of -the tapes that contain a dump set until all of the dumps have reached their -expiration date. See also Appending Dumps to an Existing Dump Set. -

    Most tape manufacturers recommend that you write to a tape a limited number -of times, and it is best not to exceed this limit when recycling tapes. -To help you track tape usage, the Backup System records a useCount -counter on the tape's label. It increments the counter each time -the tape's label is rewritten (each time you use the backup -labeltape or backup dump command). To display the -useCount counter, use the backup readlabel or -backup scantape command or include the -id and --verbose options when you issue the backup dumpinfo -command. For instructions see Writing and Reading Tape Labels or Displaying Backup Dump Records. - - - - -

    Archiving Tapes

    - - -

    Even if you make extensive use of tape recycling, there is probably some -backup data that you need to archive for a long (or even an indefinite) period -of time. You can use the Backup System to archive data on a regular -schedule, and you can also choose to archive data on tapes that you previously -expected to recycle. -

    If you want to archive data on a regular basis, you can create -date-specific dump levels in the dump hierarchy. For example, if you -decide to archive a full dump of all data in your cell at the beginning of -each quarter in the year 2000, you can define the following levels in the dump -hierarchy: -

       /1Q2000
    -   /2Q2000
    -   /3Q2000
    -   /4Q2000
    -
    -

    If you decide to archive data that is on tapes you previously planned to -recycle, you must gather all of the tapes that contain the relevant dumps, -both full and incremental. To avoid accidental erasure, it is best to -set the switch on the tapes that makes them read-only, before placing them in -your archive storage area. If the tapes also contain a large amount of -extraneous data that you do not want to archive, you can restore just the -relevant data into a new temporary volume, and back up that volume to the -smallest number of tapes possible. One reason to keep a dump set small -is to minimize the amount of irrelevant data in a dump set you end up needing -to archive. -

    If you do not expect to restore archived data to the file system, you can -consider using the backup deletedump command to remove the -associated dump records from the Backup Database, which helps keep it to an -efficient size. If you ever need to restore the data, you can use the --dbadd flag to the backup scantape command to reinsert -the dump records into the database. For instructions, see To scan the contents of a tape. -

    Defining Expiration Dates

    -

    To associate an expiration date with a dump level as you -create it, use the -expires argument to the backup -adddump command. To change an existing dump level's -expiration date, use the -expires argument to the backup -setexp command. (Note that it is not possible to change the -expiration date of an actual dump that has already been created at that -level). With both commands, you can define an expiration date either in -absolute terms (for example, 13 January 2000) or relative terms (for example, -30 days from when the dump is created). -

      -

    • To define an absolute expiration date, provide a value for the --expires argument with the following format: -
         [at] mm/dd/yyyy [hh:MM]
      -
      -

      where mm indicates the month, dd the day, and -yyyy the year when the dump expires. Valid values for the year -fall in the range 1970 through 2037 (the latest possible -date that the UNIX time representation can express is in early 2038). -If you provide a time, it must be in 24-hour format with hh the hours -and MM the minutes (for example, 21:50 is 9:50 -p.m.). If you omit the time, the default is 00:00 -hours (12:00 midnight) on the indicated date. -

    • To define a relative expiration date, provide a value for the --expires argument with the following format: -
         [in] [yearsy] [monthsm] [daysd]
      -
      -

      where each of years, months, and days is an -integer. Provide at least one of them together with the corresponding -units letter (y, m, or d respectively), with -no intervening space. If you provide more than one of the three, list -them in the indicated order. -

      The Backup System calculates a dump's actual expiration date by adding -the indicated relative value to the start time of the dump operation. -For example, it assigns an expiration date 1 year, 6 months, and 2 days in the -future to a dump created at a dump level with associated expiration date -in 1y 6m 2d. -

    • To indicate that a dump backed up at the corresponding dump level never -expires, provide the value NEVER instead of a date and time. -To recycle tapes that contain dumps created at such a level, you must use the -backup readlabel command to overwrite the tape's label. -
    -

    If you omit the -expires argument to the backup -adddump command, then the expiration date is set to UNIX time zero -(00:00 hours on 1 January 1970). The Backup System considers -dumps created at such a dump level to expire at their creation time. If -no dumps in a dump set have an expiration date, then the Backup System does -not impose any restriction on recycling the tapes that contain the dump -set. If you need to prevent premature recycling of the tapes that -contain the dump set, you must use a manual tracking system. - - - - - - - - - -

    To add a dump level to the dump hierarchy

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Optional. Issue the backup command to enter -interactive mode. -
         % backup
      -
      -

    3. Issue the backup adddump command to define one or more dump -levels. If you are defining an incremental level, then all of the -parent levels that precede it in its pathname must either already exist or -precede it on the command line. -
         backup> adddump -dump <dump level name>+ [-expires <expiration date>+]
      -
      -

      where -

      -

      addd -
      Is the shortest acceptable abbreviation of adddump. -

      -dump -
      Names each dump level to added. If you specify more than one dump -level name, you must include the -dump switch. -

      Provide the entire pathname of the dump level, preceding each level in the -pathname with a slash (/). Each component level can be up to -28 characters in length, and the pathname can include up to 256 characters -including the slashes. -

      -expires -
      Sets the expiration date associated with each dump level. Specify -either a relative or absolute expiration date, as described in Defining Expiration Dates, or omit this argument to assign no expiration date to the -dump levels. -
      Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition to be -associated with each dump level specified by the -dump -argument. -
      -
      -
    - - - - - - -

    To change a dump level's expiration date

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Optional. Issue the backup command to enter -interactive mode. -
         % backup
      -
      -

    3. Issue the (backup) setexp command to change the expiration date -associated with one or more dump levels. -
         backup> setexp -dump <dump level name>+ [-expires <expiration date>+]
      -
      -

      where -

      -

      se -
      Is the shortest acceptable abbreviation of setexp. -

      -dump -
      Names each existing dump level for which to change the expiration -date. -

      -expires -
      Sets the expiration date associated with each dump level. Specify -either a relative or absolute expiration date, as described in Defining Expiration Dates; omit this argument to remove the expiration date -currently associated with each dump level. -
      Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition to be -associated with each dump level specified by the -dump -argument. -
      -
      -
    - - - - - -

    To delete a dump level from the dump hierarchy

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Optional. Issue the backup command to enter -interactive mode. -
         % backup
      -
      -

    3. Issue the (backup) deldump command to delete the dump -level. Note that the command automatically removes all incremental dump -levels for which the specified level serves as parent, either directly or -indirectly. -
         backup> deldump <dump level name>
      -
      -

      where -

      -

      deld -
      Is the shortest acceptable abbreviation of deldump. -

      dump level name -
      Specifies the complete pathname of the dump level to delete. -
      -
    - - - - - - -

    To display the dump hierarchy

    -
      -

    1. Issue the backup listdumps command to display the dump -hierarchy. -
         % backup listdumps
      -
      -

      where listd is the shortest acceptable abbreviation of -listdumps. -

      The output from this command displays the dump hierarchy, reporting the -expiration date associated with each dump level, as in the following -example. -

          % backup listdumps
      -   /week1  expires in  27d
      -         /tuesday  expires in  13d
      -                 /thursday  expires in  13d
      -         /sunday  expires in  13d
      -                /tuesday expires in  13d
      -                        /thursday expires in  13d
      -   /week3  expires in  27d
      -         /tuesday  expires in  13d
      -                 /thursday  expires in  13d
      -         /sunday  expires in  13d
      -                /tuesday  expires in  13d
      -                        /thursday  expires in  13d
      -   sunday1   expires in  27d
      -          /monday1  expires in  13d
      -          /tuesday1  expires in  13d 
      -          /wednesday1  expires in  13d
      -          /thursday1  expires in  13d
      -          /friday1  expires in  13d
      -   sunday2   expires in  27d
      -          /monday2  expires in  13d
      -          /tuesday2  expires in  13d
      -          /wednesday2  expires in  13d
      -          /thursday2  expires in  13d
      -          /friday2  expires in  13d
      -   sunday3   expires in  27d
      -          /monday1  expires in  13d
      -          /tuesday1  expires in  13d 
      -          /wednesday1  expires in  13d
      -          /thursday1  expires in  13d
      -          /friday1  expires in  13d
      -   sunday4   expires in  27d
      -          /monday2  expires in  13d
      -          /tuesday2  expires in  13d
      -          /wednesday2  expires in  13d
      -          /thursday2  expires in  13d
      -          /friday2  expires in  13d
      -
      -
    -

    Writing and Reading Tape Labels

    - - - - - - -

    As described in Dump Names and Tape Names and Tape Labels, Dump Labels, and EOF Markers, you can assign either a permanent name or -an AFS tape name to a tape that you use in the Backup System. The names -are recorded on the tape's magnetic label, along with an indication of -the tape's capacity (size). -

    You can assign either a permanent name or an AFS tape name, but not -both. In general, assigning permanent names rather than AFS tape names -simplifies the backup process, because the Backup System does not dictate the -format of permanent names. If a tape does not have a permanent name, -then by default the Backup System accepts only three strictly defined values -in the AFS tape name field, and refuses to write a dump to a tape with an -inappropriate AFS tape name. The acceptable values are a name that -matches the volume set and dump level of the initial dump, the value -<NULL>, and no value in the field at all. -

    If a tape has a permanent name, the Backup System does not check the AFS -tape name, and as part of the dump operation constructs the appropriate AFS -tape name itself and records it on the label. This means that if you -assign a permanent name, the Backup System assigns an AFS tape name itself and -the tape has both types of name. In contrast, if a tape has an AFS tape -name but not a permanent name, you cannot assign a permanent name without -first erasing the AFS tape name. -

    (You can also suppress the Backup System's check of a tape's AFS -tape name, even it does not have a permanent name, by assigning the value -NO to the NAME_CHECK instruction in the device -configuration file. See Eliminating the AFS Tape Name Check.) -

    Because the Backup System accepts unlabeled tapes, you do not have to label -a tape before using it for the first time. After the first use, there -are a couple of cases in which you must relabel a tape in order to write a -dump to it: -

      -

    • The tape does not have a permanent name, and the AFS tape name on it does -not match the new initial dump set you want to create (the volume set and dump -level names are different, or the index is incorrect). -

    • You want to recycle a tape before all of the dumps on it have -expired. The Backup System does not overwrite a tape with any unexpired -dumps. Keep in mind, though, that if you relabel the tape to making -recycling possible, you erase all the dump records for the tape from the -Backup Database, which makes it impossible to restore any data from the -tape. -
    -
    Note:Labeling a tape that contains dump data makes it impossible to use that data -in a restore operation, because the labeling operation removes the dump's -records from the Backup Database. If you want to record a permanent -name on a tape label, you must do it before dumping any data to the -tape. -
    -

    Recording a Name on the Label

    -

    To write a permanent name on a tape's label, include the --pname argument to specify a string of up to 32 characters. -Check that no other tape used with the Backup System in your cell already has -the permanent name you are assigning, because the Backup System does not -prevent you from assigning the same name to multiple tapes. The Backup -System overwrites the existing AFS tape name, if any, with the value -<NULL>. When a tape has a permanent name, the Backup -System uses it instead of the AFS tape name in most prompts and when referring -to the tape in output from backup commands. The permanent -name persists until you again include the -pname argument to the -backup labeltape command, regardless of the tape's contents -and of how often you recycle the tape or use the backup labeltape -command without the -pname argument. -

    To write an AFS tape name on the label, provide a value for the --name argument that matches the volume set name and the final -element in the dump level pathname of the initial dump that you plan to write -to the tape, and an index that indicates the tape's place in the sequence -of tapes for the dump set. The format is as follows: -

       volume_set_name.dump_level_name.tape_index
    -
    -

    If you omit the -name argument, the Backup System sets the AFS -tape name to <NULL>. The Backup System automatically -constructs and records the appropriate name when you later write an initial -dump to the tape by using the backup dump or backup -savedb command. -

    You cannot use the -name argument if the tape already has a -permanent name. To erase a tape's permanent name, provide a null -value to the -pname argument by issuing the following -command: -

       % backup labeltape -pname ""
    -
    -

    Recording a Capacity on the Label

    -

    To record the tape's capacity on the label, specify a number of -kilobytes as the -size argument. If you omit this argument -the first time you label a tape, the Backup System records the default tape -capacity associated with the specified port offset in the -/usr/afs/backup/tapeconfig file on the Tape Coordinator -machine. If the tape's capacity is different (in particular, -larger) than the capacity recorded in the tapeconfig file, it is -best to record a capacity on the label before using the tape. Once set, -the value in the label's capacity field persists until you again use the --size argument to the backup labeltape command. -For a discussion of the appropriate capacity to record for tapes, see Configuring the tapeconfig File. -

    To read a tape's label, use the backup readlabel -command. -

    Most tapes also come with an adhesive label you can apply to the exterior -casing. To help you easily identify a tape, record at least the -tape's permanent and AFS tape names on the adhesive label. -Depending on the recycling scheme you use, it can be useful to record other -information, such as the dump ID, dump creation date, and expiration date of -each dump you write to the tape. - - -

    To label a tape

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

    3. Place the tape in the device. -

    4. Optional. Issue the backup command to enter -interactive mode, if you want to label multiple tapes or issue additional -commands after labeling the tape. The interactive prompt appears in the -following step. -
         % backup
      -
      -

    5. Issue the (backup) labeltape command to label the tape. -
         backup> labeltape [-name <tape name, defaults to NULL>]  \
      -      [-size <tape size in Kbytes, defaults to size in tapeconfig>]  \
      -      [-portoffset <TC port offset>] [-pname <permanent tape name>]
      -
      -

      where -

      -

      la -
      Is the shortest acceptable abbreviation of labeltape. -

      -name -
      Specifies the AFS tape name to record on the label. Include this -argument or the -pname argument, but not both. If you omit -this argument, the AFS tape name is set to <NULL>. If you -provide it, it must have the following format. -
      volume_set_name.dump_level_name.tape_index
      -
      -

      -

      for the tape to be acceptable for use in a future backup dump -operation. The volume_set_name must match the volume set name -of the initial dump to be written to the tape, dump_level_name must -match the last element of the dump level pathname at which the volume set is -to be dumped, and tape_index must correctly indicate the tape's -place in the sequence of tapes that house the dump set; indexing begins -with the number 1 (one). -

      -size -
      Specifies the tape capacity to record on the label. If you are -labeling the tape for the first time, you need to include this argument only -if the tape's capacity differs from the capacity associated with the -specified port offset in the /usr/afs/backup/tapeconfig file on the -Tape Coordinator machine. -

      If you provide a value, it is an integer value followed by a letter that -indicates units, with no intervening space. A unit value of -k or K indicates kilobytes, m or M -indicates megabytes, and g or G indicates -gigabytes. If you omit the units letter, the default is -kilobytes. -

      -portoffset -
      Specifies the port offset number of the Tape Coordinator handling the tape -or backup data file for this operation. You must provide this argument -unless the default value of 0 (zero) is appropriate. -

      -pname -
      Specifies the permanent name to record on the label. It can be up -to 32 characters in length, and include any alphanumeric characters. -Avoid metacharacters that have a special meaning to the shell, to avoid having -to mark them as literal in commands issued at the shell prompt. -

      Include this argument or the -name argument, but not -both. When you provide this argument, the AFS tape name is set to -<NULL>. If you omit this argument, any existing permanent -name is retained. -

      -

    6. If you did not include the -noautoquery flag when you issued -the butc command, or if the device's device configuration file -includes the instruction AUTOQUERY YES, then the Tape Coordinator -prompts you to place the tape in the device's drive. You have -already done so, but you must now press <Return> to indicate -that the tape is ready for labeling. -
    - - -

    To read the label on a tape

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

    3. Place the tape in the device. -

    4. Optional. Issue the backup command to enter -interactive mode, if you want to label multiple tapes or issue additional -commands after labeling the tape. The interactive prompt appears in the -following step. -
         % backup
      -
      -

    5. Issue the (backup) readlabel command to read the label on the -tape. -
         backup> readlabel [<TC port offset>]
      -
      -

      where -

      -

      rea -
      Is the shortest acceptable abbreviation of readlabel. -

      TC port offset -
      Specifies the port offset number of Tape Coordinator handling the tape or -backup data file for this operation. You must provide this argument -unless the default value of 0 (zero) is appropriate. -
      -

    6. If you did not include the -noautoquery flag when you issued -the butc command, or the device's device configuration file -includes the instruction AUTOQUERY YES instruction, then the Tape -Coordinator prompts you to place the tape in the device's drive. -You have already done so, but you must now press <Return> to -indicate that the tape is ready for reading. -
    -

    Information from the tape label appears both in the backup -command window and in the Tape Coordinator window. The output in the -command window has the following format: -

       Tape read was labelled: tape_name (initial_dump_ID)
    -        size: size KBytes
    -
    -

    where tape_name is the tape's permanent name (if it has one) -or AFS tape name, initial_dump_ID is the dump ID of the initial dump -on the tape, and size is the capacity recorded on the label, in -kilobytes. -

    The information in the Tape Coordinator window is more extensive. -The tape's permanent name appears in the tape name field and -its AFS tape name in the AFS tape name field. If either name -is undefined, a value of <NULL> appears in the field -instead. The capacity recorded on the label appears in the -size field. Other fields in the output report the creation -time, dump level name, and dump ID of the initial dump on the tape -(creationTime, dump path, and dump id -respectively). The cell field reports the cell in which the -dump operation was performed, and the useCount field reports the -number of times the tape has been relabeled, either with the backup -labeltape command or during a dump operation. For further -details, see the command's reference page in the AFS Administration -Reference. -

    If the tape has no label, or if the drive is empty, the following message -appears at the command shell: -

       Failed to read tape label.
    -
    -

    The following example illustrates the output in the command shell for a -tape in the device with port offset 1: -

       % backup readlabel 1
    -   Tape read was labelled: monthly_guest (917860000)
    -        size: 2150000 KBytes
    -
    -

    The following output appears in the Tape Coordinator window at the same -time: -

       Tape label
    -   ----------
    -   tape name = monthly_guest
    -   AFS tape name = guests.monthly.3
    -   creationTime =  Mon Feb  1 04:06:40 1999
    -   cell = abc.com
    -   size = 2150000 Kbytes
    -   dump path = /monthly
    -   dump id = 917860000
    -   useCount = 44
    -   -- End of tape label --
    -
    -

    Automating and Increasing the Efficiency of the Backup Process

    - - -

    The Backup System includes several optional features to help you automate -the backup process in your cell and make it more efficient. By -combining several of the features, you can dump volume data to tape with -minimal human intervention in most cases. To take advantage of many of -the features, you create a device configuration file in the -/usr/afs/backup directory for each tape device that participates in -automated operations. For general instructions on creating the device -configuration file, see Creating a Device Configuration File. The following list refers you to sections that -describe each feature in greater detail. -

      -

    • You can use tape stackers and jukeboxes to perform backup -operations. These are tape drives with an attached unit that stores -several tapes and can physically insert and remove them from the tape reader -(tape drive) without human intervention, meaning that no operator has to be -present even for backup operations that require several tapes. To use a -stacker or jukebox with the Backup System, include the MOUNT and -UNMOUNT instructions in its device configuration file. See Invoking a Device's Tape Mounting and Unmounting Routines. -

    • You can suppress the Tape Coordinator's default prompt for the -initial tape that it needs for a backup operation, again eliminating the need -for a human operator to be present when a backup operation begins. (You -must still insert the correct tape in the drive at some point before the -operation begins.) To suppress the initial prompt, include the --noautoquery flag on the butc command, or assign the -value NO to the AUTOQUERY instruction in the device -configuration file. See Eliminating the Search or Prompt for the Initial Tape. -

    • You can suppress the prompts that the Tape Coordinator otherwise generates -when it encounters several types of errors. When you use this feature, -the Tape Coordinator instead responds to the errors in a default manner, which -generally allows the operation to continue without human intervention. -To suppress prompts about error conditions, assign the value NO to -the ASK instruction in the device configuration file. See Enabling Default Responses to Error Conditions. -

    • You can suppress the Backup System's default verification that the -AFS tape name on a tape that has no permanent name matches the name derived -from the volume set and dump level names of the initial dump the Backup System -is writing to the tape. This enables you to recycle a tape without -first relabeling it, as long as all dumps on it are expired. To -suppress name checking, assign the value NO to the -NAME_CHECK instruction in the device configuration file. See -Eliminating the AFS Tape Name Check. -

    • You can promote tape streaming (the most efficient way for a tape device -to operate) by setting the size of the memory buffer the Tape Coordinator uses -when transferring volume data between the file system and the device. -To set the buffer size, include the BUFFERSIZE instruction in the -device configuration file. See Setting the Memory Buffer Size to Promote Tape Streaming. -

    • You can write dumps to a backup data file on the local disk of -the Tape Coordinator machine, rather than to tape. You can then -transfer the backup data file to a data-archiving system, such as a -hierarchical storage management (HSM) system, that you use in conjunction with -AFS and the Backup System. Writing a dump to a file is usually more -efficient that issuing the equivalent vos dump commands -individually. To write dumps to a file, include the FILE -instruction in the device configuration file. See Dumping Data to a Backup Data File. -
    -

    There are two additional ways to increase backup automation and efficiency -that do not involve the device configuration file: -

      -

    • You can schedule one or more backup dump commands to run at -specified times. This enables you to create backups at times of low -system usage, without requiring a human operator to be present. You can -schedule a single dump operation for a future time, or multiple operations to -run at various future times. See Scheduling Dumps. -

    • You can append dumps to a tape that already has other dumps on it. -This enables you to use as much of a tape's capacity as possible. -The appended dumps do not have be related in any way to one another or to the -initial dump on the tape, but grouping dumps appropriately can reduce the -number of necessary tape changes during a restore operation. To append -a dump, include the -append argument to the backup dump -command. See Appending Dumps to an Existing Dump Set. -
    -

    Creating a Device Configuration File

    - - - - -

    To use many of the features that automate backup operations, create a -configuration file for each tape device in the /usr/afs/backup -directory on the local disk of the Tape Coordinator machine that drives the -device. The filename has the following form: -

    CFG_device_name -

    where device_name represents the name of the tape device or backup -data file (see Dumping Data to a Backup Data File to learn about writing dumps to a file rather than to -tape). -

    For a tape device, construct the device_name portion of the name -by stripping off the initial /dev/ string with which all UNIX -device names conventionally begin, and replacing any other slashes in the name -with underscores. For example, CFG_rmt_4m is the appropriate -filename for a device called /dev/rmt/4m. -

    For a backup data file, construct the device_name portion by -stripping off the initial slash (/) and replacing any other slashes -(/) in the name with underscores. For example, -CFG_var_tmp_FILE is the appropriate filename for a backup data file -called /var/tmp/FILE. -

    Creating a device configuration file is optional. If you do not want -to take advantage of any of the features that the file provides, you do not -have to create it. -

    You can include one of each of the following instructions in any order in a -device configuration file. All are optional. Place each -instruction on its own line, but do not include any newline -(<Return>) characters within an instruction. -

    -

    MOUNT and UNMOUNT -
    Identify a script of routines for mounting and unmounting tapes in a tape -stacker or jukebox's drive as needed. See Invoking a Device's Tape Mounting and Unmounting Routines. -

    AUTOQUERY -
    Controls whether the Tape Coordinator prompts for the first tape it needs -for a backup operation. See Eliminating the Search or Prompt for the Initial Tape. -

    ASK -
    Controls whether the Tape Coordinator asks you how to respond to certain -error conditions. See Enabling Default Responses to Error Conditions. -

    NAME_CHECK -
    Controls whether the Tape Coordinator verifies that an AFS tape name -matches the initial dump you are writing to the tape. See Eliminating the AFS Tape Name Check. -

    BUFFERSIZE -
    Sets the size of the memory buffer the Tape Coordinator uses when -transferring data between a tape device and a volume. See Setting the Memory Buffer Size to Promote Tape Streaming. -

    FILE -
    Controls whether the Tape Coordinator writes dumps to, and restores data -from, a tape device or a backup data file. See Dumping Data to a Backup Data File. -
    - - - - - - -

    Invoking a Device's Tape Mounting and Unmounting Routines

    -

    A tape stacker or jukebox helps you automate backup -operations because it can switch between multiple tapes during an operation -without human intervention. To take advantage of this feature, include -the MOUNT and optionally UNMOUNT instructions in the -device configuration file that you write for the stacker or jukebox. -The instructions share the same syntax: -

       MOUNT filename
    -   UNMOUNT filename
    -
    -

    where filename is the pathname on the local disk of a script or -program you have written that invokes the routines defined by the -device's manufacturer for mounting or unmounting a tape in the -device's tape drive. (For convenience, the following discussion -uses the term script to refers to both scripts and -programs.) The script usually also contains additional logic that -handles error conditions or modifies the script's behavior depending on -which backup operation is being performed. -

    You can refer to different scripts with the MOUNT or -UNMOUNT instructions, or to a single script that invokes both -mounting and unmounting routines. The scripts inherit the local -identity and AFS tokens associated with to the issuer of the butc -command. -

    You need to include a MOUNT instruction in the device -configuration file for all tape devices, but the need for an -UNMOUNT instruction depends on the tape-handling routines that the -device's manufacturer provides. Some devices, usually stackers, -have only a single routine for mounting tapes, which also automatically -unmounts a tape whose presence prevents insertion of the required new -tape. In this case, an UNMOUNT instruction is not -necessary. For devices that have separate mounting and unmounting -routines, you must include an UNMOUNT instruction to remove a tape -when the Tape Coordinator is finished with it; otherwise, subsequent -attempts to run the MOUNT instruction fail with an error. -

    When the device configuration file includes a MOUNT instruction, -you must stock the stacker or jukebox with the necessary tapes before running -a backup operation. Many jukeboxes are able to search for the required -tape by reading external labels (such as barcodes) on the tapes, but many -stackers can only switch between tapes in sequence and sometimes only in one -direction. In the latter case, you must also stock the tapes in the -correct order. -

    To obtain a list of the tapes required for a restore operation so that you -can prestock them in the tape device, include the -n flag on the -appropriate backup command (backup diskrestore, -backup volrestore, or backup volsetrestore). For -a dump operation, it is generally sufficient to stock the device with more -tapes than the operation is likely to require. You can prelabel the -tapes with permanent names or AFS tape names, or not prelabel them at -all. If you prelabel the tapes for a dump operation with AFS tape -names, then it is simplest to load them into the stacker in sequential order -by tape index. But it is probably simpler still to prelabel tapes with -permanent tape names or use unlabeled tapes, in which case the Backup System -generates and applies the appropriately indexed AFS tape name itself during -the dump operation. -

    How the Tape Coordinator Uses the MOUNT and UNMOUNT Instructions

    -

    When you issue the butc command to initialize the Tape -Coordinator for a given tape device, the Tape Coordinator looks for the device -configuration file called /usr/afs/backup/CFG_device_name -on its local disk, where device_name has the format described in Creating a Device Configuration File. If the file exists and contains a MOUNT -instruction, then whenever the Tape Coordinator needs a tape, it executes the -script named by the instruction's filename argument. -

    If the device configuration file does not exist, or does not include a -MOUNT instruction, then whenever the Tape Coordinator needs a tape, -it generates a prompt in its window instructing the operator to insert the -necessary tape. The operator must insert the tape and press -<Return> before the Tape Coordinator continues the backup -operation. -

    Note, however, that you can modify the Tape Coordinator's behavior -with respect to the first tape needed for an operation, by setting the -AUTOQUERY instruction in the device configuration file to -NO, or including the -noautoquery flag to the -butc command. In this case, the Tape Coordinator does not -execute the MOUNT instruction or prompt for a tape at the start of -an operation, because it expects to find the required first tape in the -drive. See Eliminating the Search or Prompt for the Initial Tape. -

    If there is an UNMOUNT instruction in the device configuration -file, then whenever the Tape Coordinator closes the tape device, it executes -the script named by the instruction's filename argument. -It executes the script only once, and regardless of whether the -close operation on the device succeeded or not. If the -device configuration file does not include an UNMOUNT instruction, -then the Tape Coordinator takes no action. -

    The Available Parameters and Required Exit Codes

    -

    When the Tape Coordinator executes the MOUNT script, it -passes in five parameters, ordered as follows. You can use the -parameters in your script to refine its response to varying circumstances that -can arise during a backup operation. -

      -

    1. The tape device or backup data file's pathname, as recorded in the -/usr/afs/backup/tapeconfig file. -

    2. The tape operation, which (except for the exceptions noted in the -following list) matches the backup command operation code used to -initiate the operation: -
        -

      • appenddump (when a backup dump command includes the --append flag) -

      • dump (when a backup dump command does not include -the -append flag) -

      • labeltape -

      • readlabel -

      • restore (for a backup diskrestore, backup -volrestore, or backup volsetrestore command) -

      • restoredb -

      • savedb -

      • scantape -
      -

    3. The number of times the Tape Coordinator has attempted to open the tape -device or backup data file. If the open attempt returns an error, the -Tape Coordinator increments this value by one and again invokes the -MOUNT instruction. -

    4. The tape name. For some operations, the Tape Coordinator passes the -string none, because it does not know the tape name (when running -the backup scantape or backup readlabel, for example), -or because the tape does not necessarily have a name (when running the -backup labeltape command, for example). -

    5. The tape ID recorded in the Backup Database. As with the tape name, -the Backup System passes the string none for operations where it -does not know the tape ID or the tape does not necessarily have an ID. -
    -

    Your MOUNT script must return one of the following exit codes to -tell the Tape Coordinator whether or not it mounted the tape -successfully: -

      -

    • Code 0 (zero) indicates a successful mount, and the Tape -Coordinator continues the backup operation. If the script or program -called by the MOUNT instruction does not return this exit code, the -Tape Coordinator never calls the UNMOUNT instruction. -

    • Code 1 indicates that mount attempt failed. The Tape -Coordinator terminates the backup operation. -

    • Any other code indicates that the script was unable to access the correct -tape. The Tape Coordinator prompts the operator to insert it. -
    -

    When the Tape Coordinator executes the UNMOUNT script, it passes -in two parameters in the following order. -

      -

    1. The tape device's pathname (as specified in the -/usr/afs/backup/tapeconfig file) -

    2. The tape operation, which is always unmount. -
    -

    The following example script uses two of the parameters passed to it by the -Backup System: tries and operation. It -follows the recommended practice of exiting if the value of the -tries parameter exceeds one, because that implies that the stacker -is out of tapes. -

    For a backup dump or backup savedb operation, the -routine calls the example stackerCmd_NextTape function provided by -the stacker's manufacturer. Note that the final lines in the file -return the exit code that prompts the operator to insert a tape; these -lines are invoked when either the stacker cannot load a tape or a the -operation being performed is not one of those explicitly mentioned in the file -(is a restore operation, for example). -

       #! /bin/csh -f
    -     
    -   set devicefile = $1
    -   set operation = $2
    -   set tries = $3
    -   set tapename = $4
    -   set tapeid = $5
    -   set exit_continue = 0
    -   set exit_abort = 1
    -   set exit_interactive = 2
    -   #--------------------------------------------
    -   if (${tries} > 1) then
    -      echo "Too many tries"
    -      exit ${exit_interactive}
    -   endif
    -   if (${operation} == "unmount") then
    -      echo "UnMount: Will leave tape in drive"
    -      exit ${exit_continue}
    -   endif
    -   if ((${operation} == "dump")     |\
    -       (${operation} == "appenddump")     |\
    -       (${operation} == "savedb"))  then
    - 
    -       stackerCmd_NextTape ${devicefile}
    -       if (${status} != 0)exit${exit_interactive}
    -       echo "Will continue"
    -       exit ${exit_continue}
    -   endif
    - 
    -   if ((${operation} == "labeltape")    |\
    -       (${operation} == "readlabel")) then
    -      echo "Will continue"
    -      exit ${exit_continue}
    -   endif
    - 
    -   echo "Prompt for tape"
    -   exit ${exit_interactive}
    -
    - - - - -

    Eliminating the Search or Prompt for the Initial Tape

    -

    By default, the Tape Coordinator obtains the first tape it -needs for a backup operation by reading the device configuration file for the -appropriate tape device. If there is a MOUNT instruction in -the file, the Tape Coordinator executes the referenced script. If the -device configuration file does not exist or does not have a MOUNT -instruction in it, the Tape Coordinator prompts you to insert the correct tape -and press <Return>. -

    If you know in advance that an operation requires a tape, you can increase -efficiency by placing the required tape in the drive before issuing the -backup command and telling the Tape Coordinator's to skip its -initial tape-acquisition steps. This both enables the operation to -begin more quickly and eliminates that need for you to be present to insert a -tape. -

    There are two ways to bypass the Tape Coordinator's initial -tape-acquisition steps: -

      -

    1. Include the instruction AUTOQUERY NO in the device -configuration file -

    2. Include the -noautoquery flag to the butc command -
    -

    To avoid any error conditions that require operator attention, be sure that -the tape you are placing in the drive does not contain any unexpired dumps and -is not write protected. If there is no permanent name on the -tape's label and you are creating an initial dump, make sure that the AFS -tape name either matches the volume set and dump set names or is -<NULL>. Alternatively, suppress the Tape -Coordinator's name verification step by assigning the value NO -to the NAME_CHECK instruction in the device configuration file, as -described in Eliminating the AFS Tape Name Check. - - - -

    Enabling Default Responses to Error Conditions

    -

    By default, the Tape Coordinator asks you how to respond -when it encounters certain error conditions. To suppress the prompts -and cause the Tape Coordinator to handle the errors in a predetermined manner, -include the instruction ASK NO in the device configuration -file. If you assign the value YES, or omit the -ASK instruction completely, the Tape Coordinator prompts you for -direction when it encounters one of the errors. -

    The following list describes the error conditions and the Tape -Coordinator's response to them. -

      -

    • The Backup System is unable to dump a volume while running the backup -dump command. When you assign the value NO, the Tape -Coordinator omits the volume from the dump and continues the operation. -When you assign the value YES, it prompts to ask if you want to try -to dump the volume again immediately, to omit the volume from the dump but -continue the operation, or to terminate the operation. -

    • The Backup System is unable to restore a volume while running the -backup diskrestore, backup volrestore, or backup -volsetrestore command. When you assign the value NO, -the Tape Coordinator continues the operation, omitting the problematic volume -but restoring the remaining ones. When you assign the value -YES, it prompts to ask if you want to omit the volume and continue -the operation, or to terminate the operation. -

    • The Backup System cannot determine if the dump set includes any more tapes -while running the backup scantape command (the command's -reference page in the AFS Administration Reference discusses -possible reasons for this problem). When you assign the value -NO, the Tape Coordinator proceeds as though there are more tapes -and invokes the MOUNT script named in the device configuration -file, or prompts the operator to insert the next tape. When you assign -the value YES, it prompts to ask if there are more tapes to -scan. -

    • The Backup System determines that the tape contains an unexpired dump -while running the backup labeltape command. When you assign -the value NO, it terminates the operation without relabeling the -tape. With a YES value, the Tape Coordinator prompts to ask -if you want to relabel the tape anyway. -
    - - - - -

    Eliminating the AFS Tape Name Check

    -

    If a tape does not have a permanent name and you are writing -an initial dump to it, then by default the Backup System verifies that the -tape's AFS tape name is acceptable. It accepts three types of -values: -

      -

    • A name that reflects the volume set and dump level of the initial dump and -the tape's place in the sequence of tapes for the dump set, as described -in Dump Names and Tape Names. If the tape does not already have a permanent name, -you can assign the AFS tape name by using the -name argument to the -backup labeltape command. -

    • A <NULL> value, which results when you assign a permanent -name, or provide no value for the backup labeltape command's --name argument. -

    • No AFS tape name at all, indicating that you have never labeled the tape -or written a dump to it. -
    -

    To bypass the name check, include the NAME_CHECK NO instruction -in the device configuration file. This enables you to recycle a tape -without first relabeling it, as long as all dumps on it are expired. -(If a tape has unexpired dumps on it but you want to recycle it anyway, you -must use the backup labeltape command to relabel it first. -For this to work, the ASK NO instruction cannot appear in the -device configuration file.) -

    Setting the Memory Buffer Size to Promote Tape Streaming

    -

    By default, the Tape Coordinator uses a 16-KB memory buffer -during dump operations. As it receives volume data from the Volume -Server, the Tape Coordinator gathers 16 KB of data in the buffer before -transferring the entire 16 KB to the tape device. Similarly, during a -restore operation the Tape Coordinator by default buffers 32 KB of data from -the tape device before transferring the entire 32 KB to the Volume Server for -restoration into the file system. Buffering makes the volume of data -flowing to and from a tape device more even and so promotes tape streaming, -which is the most efficient way for a tape device to operate. -

    In a normal network configuration, the default buffer sizes are usually -large enough to promote tape streaming. If the network between the Tape -Coordinator machine and file server machines is slow, it can help to increase -the buffer size. -

    To determine if altering the buffer size is helpful for your configuration, -observe the tape device in operation to see if it is streaming, or consult the -manufacturer. To set the buffer size, include the BUFFERSIZE -instruction in the device configuration file. It takes an integer -value, and optionally units, in the following format: -

       BUFFERSIZE size[{k | K | m | M | g | G}]
    -
    -

    where size specifies the amount of memory the Tape Coordinator -allocates to use as a buffer during both dump and restore operations. -The default unit is bytes, but use k or K to specify -kilobytes, m or M for megabytes, and g or -G for gigabytes. There is no space between the size -value and the units letter. -

    Dumping Data to a Backup Data File

    -

    You can write dumps to a backup data file rather -than to tape. This is useful if, for example, you want to transfer the -data to a data-archiving system, such as a hierarchical storage management -(HSM) system, that you use in conjunction with AFS and the Backup -System. You can restore data from a backup data file into the file -system as well. Using a backup data file is usually more efficient than -issuing the equivalent vos dump and vos restore commands -individually for multiple volumes. -

    Writing to a backup data file is simplest if it is on the local disk of the -Tape Coordinator machine, but you can also write the file to an NFS-mounted -partition that resides on a remote machine. It is even acceptable to -write to a file in AFS, provided that the access control list (ACL) on its -parent directory grants the necessary permissions, but it is somewhat circular -to back up AFS data into AFS itself. -

    If the backup data file does not already exist when the Tape Coordinator -attempts to write a dump to it, the Tape Coordinator creates it. For a -restore operation to succeed, the file must exist and contain volume data -previously written to it during a backup dump operation. -

    When writing to a backup data file, the Tape Coordinator writes data at 16 -KB offsets. If a given block of data (such as the marker that signals -the beginning or end of a volume) does not fill the entire 16 KB, the Tape -Coordinator still skips to the next offset before writing the next -block. In the output of a backup dumpinfo command issued -with the -id option, the value in the Pos column is the -ordinal of the 16-KB offset at which the volume data begins, and so is not -generally only one higher than the position number on the previous line, as it -is for dumps to tape. -

    Before writing to a backup data file, you need to configure the file as -though it were a tape device. -
    Note:A file pathname, rather than a tape device name, must appear in the third -field of the /usr/afs/backup/tapeconfig file when the FILE -YES instruction appears in the device configuration file, and vice -versa. If the tapeconfig file instead refers to a tape -device, dump operations appear to succeed but are inoperative. You -cannot restore data that you accidently dumped to a tape device while the -FILE instruction was set to YES. In the same way, -if the FILE instruction is set to NO, the -tapeconfig entry must refer to an actual tape device. -
    -

    To configure a backup data file

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    3. Optional. Issue the backup command to enter -interactive mode. -
         # backup
      -
      -

    4. Choose the port offset number to assign to the file. If necessary, -display previously assigned port offsets by issuing the (backup) -listhosts command, which is fully described in To display the list of configured Tape Coordinators. -
         backup> listhosts
      -
      -

      As for a tape device, acceptable values are the integers 0 -(zero) through 58510 (the Backup System can track a maximum of -58,511 port offset numbers). Each port offset must be unique in the -cell, but you can associate any number them with a single Tape Coordinator -machine. You do not have to assign port offset numbers -sequentially. -

    5. Issue the (backup) addhost command to register the backup data -file's port offset in the Backup Database. -
         backup> addhost <tape machine name> [<TC port offset>]
      -
      -

      where -

      -

      addh -
      Is the shortest acceptable abbreviation of addhost. -

      tape machine name -
      Specifies the fully qualified hostname of the Tape Coordinator machine you -invoke to write to the backup data file. -

      TC port offset -
      Specifies the file's port offset number. You must provide this -argument unless the default value of 0 (zero) is -appropriate. -
      -

    6. Using a text editor, create an entry for the backup -data file in the local /usr/afs/backup/tapeconfig file, using the -standard syntax: -
         [capacity  filemark_size]  device_name   port_offset
      -
      -

      where -

      -

      capacity -
      Specifies the amount of space on the partition that houses the backup data -file that you want to make available for the file. To avoid the -complications that arise from filling up the partition, it is best to provide -a value somewhat smaller than the actual amount of space you expect to be -available when the dump operation runs, and never larger than the maximum file -size allowed by the operating system. -

      Specify a numerical value followed by a letter that indicates units, with -no intervening space. The letter k or K indicates -kilobytes, m or M indicates megabytes, and g -or G indicates gigabytes. If you omit the units letter, the -default is kilobytes. If you leave this field empty, the Tape -Coordinator uses the maximum acceptable value (2048 GB or 2 TB). Also -leave the filemark_size field empty in that case. -

      filemark_size -
      Specify the value 0 (zero) or leave both this field and the -capacity field empty. In the latter case, the Tape Coordinator -also uses the value zero. -

      device_name -
      Specifies the complete pathname of the backup data file. Rather -than specifying an actual file pathname, however, the recommended -configuration is to create a symbolic link in the /dev directory -that points to the actual file pathname, and record the symbolic link in this -field. This configuration provides these advantages: -
        -

      • It makes the device_name portion of the -CFG_device_name, of the -TE_device_name, and of the -TL_device_name filenames as short as possible. -Because the symbolic link is in the /dev directory as though it is -a tape device, you strip off the entire /dev/ prefix when forming -the filename, instead of just the initial slash (/). If, for -example, the symbolic link is called /dev/FILE, the device -configuration file's name is CFG_FILE, whereas if the actual -pathname /var/tmp/FILE appears in the tapeconfig file, -the configuration file's name must be CFG_var_tmp_FILE. -

      • It provides for a more graceful, and potentially automated, recovery if -the Tape Coordinator cannot write a complete dump into the backup data file -(for example, because the partition housing the backup data file becomes -full). The Tape Coordinator's reaction to this problem is to -invoke the MOUNT script, or to prompt you if the MOUNT -instruction does not appear in the configuration file. -
          -

        • If there is a MOUNT script, you can prepare for this situation -by adding a subroutine to the script that changes the symbolic link to point -to another backup data file on a partition where there is space -available. -

        • If there is no MOUNT instruction, the prompt enables you -manually to change the symbolic link to point to another backup data file and -then press <Return> to signal that the Tape Coordinator can -continue the operation. -
        -

        If this field names the actual file, there is no way to recover from -exhausting the space on the partition. You cannot change the -tapeconfig file in the middle of an operation. -

      -

      port_offset -
      Specifies the port offset number that you chose for the backup data -file. -
      -

    7. Create the device configuration file CFG_device_name -in the Tape Coordinator machine's /usr/afs/backup -directory. Include the FILE YES instruction in the -file. -

      Construct the device_name portion of the name based on the device -name you recorded in the tapeconfig file in Step 6. If, as recommended, you recorded a symbolic link -name, strip off the /dev/ string and replace any other slashes -(/) in the name with underscores (_). For -example, CFG_FILE is the appropriate name if the symbolic link is -/dev/FILE. If you recorded the name of an actual file, then -strip off the initial slash only and replace any other slashes in the name -with underscores. For a backup data file called -/var/tmp/FILE, the appropriate device configuration filename is -CFG_var_tmp_FILE. -

    8. If you chose in Step 6 to record a symbolic link name in the device_name -field of the tapeconfig entry, then you must do one of the -following: -
        -

      • Use the ln -s command to create the appropriate symbolic link -in the /dev directory -

      • Write a script that initializes the backup data file in this way, and -include a MOUNT instruction in the device configuration file to -invoke the script. An example script appears following these -instructions. -
      -
    -

    You do not need to create the backup data file itself, because the Tape -Coordinator does so if the file does not exist when the dump operation -begins. -

    The following example script illustrates how you can automatically create a -symbolic link to the backup data file during the preparation phase for writing -to the file. When the Tape Coordinator is executing a backup -dump, backup restore, backup savedb, or -backup restoredb operation, the routine invokes the UNIX ln --s command to create a symbolic link from the backup data file named in -the tapeconfig file to the actual file to use (this is the -recommended method). It uses the values of the tapename and -tapeid parameters passed to it by the Backup System when -constructing the filename. -

    The routine makes use of two other parameters as well: -tries and operation. The tries -parameter tracks how many times the Tape Coordinator has attempted to access -the file. A value greater than one indicates that the Tape Coordinator -cannot access it, and the routine returns exit code 2 -(exit_interactive), which results in a prompt for the operator to -load a tape. The operator can use this opportunity to change the name -of the backup data file specified in the tapeconfig file. -

       #! /bin/csh -f
    -   set devicefile = $1
    -   set operation = $2
    -   set tries = $3
    -   set tapename = $4
    -   set tapeid = $5
    -   set exit_continue = 0
    -   set exit_abort = 1
    -   set exit_interactive = 2
    -   #--------------------------------------------
    -   if (${tries} > 1) then
    -      echo "Too many tries"
    -      exit ${exit_interactive}
    -   endif
    -   if (${operation} == "labeltape") then
    -      echo "Won't label a tape/file"
    -      exit ${exit_abort}
    -   endif
    -   if ((${operation} == "dump")   |\
    -       (${operation} == "appenddump")   |\
    -       (${operation} == "restore")   |\
    -       (${operation} == "savedb")    |\
    -       (${operation} == "restoredb")) then
    - 
    -      /bin/rm -f ${devicefile}
    -      /bin/ln -s /hsm/${tapename}_${tapeid} ${devicefile}
    -      if (${status} != 0) exit ${exit_abort}
    -   endif
    - 
    -   exit ${exit_continue}
    -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd012.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd012.htm deleted file mode 100755 index bffeca907..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd012.htm +++ /dev/null @@ -1,2747 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Backing Up and Restoring AFS Data

    -

    The instructions in this chapter explain how to back up and -restore AFS data and to administer the Backup Database. They assume -that you have already configured all of the Backup System components by -following the instructions in Configuring the AFS Backup System. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - - - -
    Enter interactive mode -backup (interactive) -
    Leave interactive mode -(backup) quit -
    List operations in interactive mode -(backup) jobs -
    Cancel operation in interactive mode -(backup) kill -
    Start Tape Coordinator -butc -
    Stop Tape Coordinator -<Ctrl-c> -
    Check status of Tape Coordinator -backup status -
    Back up data -backup dump -
    Display dump records -backup dumpinfo -
    Display volume's dump history -backup volinfo -
    Scan contents of tape -backup scantape -
    Restore volume -backup volrestore -
    Restore partition -backup diskrestore -
    Restore group of volumes -backup volsetrestore -
    Verify integrity of Backup Database -backup dbverify -
    Repair corruption in Backup Database -backup savedb and backup restoredb -
    Delete dump set from Backup Database -backup deletedump -
    -


    Using the Backup System's Interfaces

    - -

    When performing backup operations, you interact with three Backup System -components: -

      -

    • You initiate backup operations by issuing commands from the -backup suite. You can issue the commands in a command shell -(or invoke them in a shell script) on any AFS client or server machine from -which you can access the backup binary. In the conventional -configuration, the binary resides in the /usr/afs/bin directory on -a server machine and the /usr/afsws/etc directory on a client -machine. -

      The suite provides an interactive mode, in which you can issue multiple -commands over a persistent connection to the Backup Server and the Volume -Location (VL) Server. Interactive mode has several convenient -features. For a discussion and instructions, see Using Interactive and Regular Command Mode. -

      Note that some operating systems include a backup command of -their own. You must configure machines that run such an operating -system to ensure that you are accessing the desired backup -binary. -

    • Before you perform a backup operation that involves reading or writing to -a tape device or backup data file, you must open a dedicated connection to the -appropriate Tape Coordinator machine and start the Tape Coordinator -(butc) process that handles the device or file. The -butc process must continue to run over the dedicated connection as -long as it is executing an operation or is to be available to execute -one. For further discussion and instructions, see Starting and Stopping the Tape Coordinator Process. -

    • The Backup Server (buserver) process must be running on -database server machines, because most backup operations require accessing or -changing information in the Backup Database. The AFS Quick -Beginnings explains how to configure the Backup Server. -
    -

    For consistent Backup System performance, the AFS build level of all three -binaries (backup, butc, and buserver) must -match. For instructions on displaying the build level, see Displaying A Binary File's Build Level. -

    Performing Backup Operations as the Local Superuser Root or in a Foreign Cell

    - - - -

    By default, the volumes and Backup Database involved in a backup operation -must reside on server machines that belong to the cell named in the -/usr/vice/etc/ThisCell files on both the Tape Coordinator machine -and the machine where you issue the backup command. Also, to -issue most backup commands you must have AFS tokens for an identity -listed in the local cell's /usr/afs/etc/UserList file (which -by convention is the same on every server machine in a cell). You can, -however, perform backup operations on volumes or the Backup Database from a -foreign cell, or perform backup operations while logged in as the local -superuser root rather than as a privileged AFS identity. -

    To perform backup operations on volumes that reside in a foreign cell using -machines from the local cell, you must designate the foreign cell as the cell -of execution for both the Tape Coordinator and the backup command -interpreter. Use one of the two following methods. For either -method, you must also have tokens as an administrator listed in the foreign -cell's /usr/afs/etc/UserList file. -

      -

    • Before issuing backup commands and the butc command, -set the AFSCELL environment variable to the foreign cell name in both command -shells. -

    • Include the -cell argument to the butc and all -backup commands. If you include the argument on the -backup (interactive) command, it applies to all commands issued -during the interactive session. -
    -

    To perform backup operations without having administrative AFS tokens, you -must log on as the local superuser root on both the Tape -Coordinator machine and the machine where you issue backup -commands. Both machines must be server machines, or at least have a -/usr/afs/etc/KeyFile file that matches the file on other server -machines. Then include the -localauth argument on both the -butc command and all backup commands (or the backup -(interactive) command). The Tape Coordinator and -backup command interpreter construct a server ticket using the -server encryption key with the highest key version number in the local -/usr/afs/etc/KeyFile file, and present it to the Backup Server, -Volume Server, and VL Server that belong to the cell named in the local -/usr/afs/etc/ThisCell file. The ticket never expires. -

    You cannot combine the -cell and -localauth options -on the same command. Also, each one overrides the local cell setting -defined by the AFSCELL environment variable or the -/usr/vice/etc/ThisCell file. -

    Using Interactive and Regular Command Mode

    - - -

    The backup command suite provides an interactive -mode, in which you can issue multiple commands over a persistent -connection to the Backup Server and the VL Server. Interactive mode -provides the following features: -

      -

    • The backup> prompt replaces the usual command shell -prompt. -

    • You omit the initial backup string from command names. -Type only the operation code and option names. -

    • You cannot issue commands that do not belong to the backup -suite. -

    • If you assume an administrative AFS identity or specify a foreign cell as -you enter interactive mode, it applies to all commands issued during the -interactive session. See Performing Backup Operations as the Local Superuser Root or in a Foreign Cell. -

    • You do not need to enclose shell metacharacters in double quotes. -
    - - -

    When you initiate a backup operation in interactive mode, the Backup System -assigns it a job ID number. You can display the list of -current and pending operations with the (backup) jobs command, for -which instructions appear in To display pending or running jobs in interactive mode. (In both regular and interactive modes, the Tape -Coordinator also assigns a task ID number to each operation you -initiate with a backup command. You can track task ID -numbers with the backup status command. See Starting and Stopping the Tape Coordinator Process.) -

    You can cancel an operation in interactive mode with the (backup) -kill command, for which instructions appear in To cancel operations in interactive mode. However, it is best not to interrupt a dump -operation because the resulting dump is incomplete, and interrupting a restore -operation can leave volumes in an inconsistent state, or even completely -remove them from the server machine. For further discussion, see Backing Up Data and Restoring and Recovering Data. -

    The (backup) jobs and (backup) kill commands are -available only in interactive mode and there is no equivalent functionality in -regular command mode. - - - - -

    To enter interactive mode

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. Entering interactive mode does -not itself require privilege, but most other backup commands do, -and the AFS identity you assume when entering the mode applies to all commands -you issue within it. If necessary, issue the bos listusers -command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup (interactive) command at the system -prompt. The backup> prompt appears. You can include -either, but not both, of the -localauth and -cell -options, as discussed in Performing Backup Operations as the Local Superuser Root or in a Foreign Cell. -
         % backup
      -   backup>
      -
      -
    - - - - -

    To exit interactive mode

    -

    -

      -

    1. Issue the quit command at the backup> prompt. -The command shell prompt reappears when the command succeeds, which it does -only if there are no jobs pending or currently running. To display and -cancel pending or running jobs, follow the instructions in To display pending or running jobs in interactive mode and To cancel operations in interactive mode. -
         backup> quit
      -   %
      -
      -
    - - - - - - -

    To display pending or running jobs in interactive mode

    -
      -

    1. Issue the jobs command at the backup> prompt. -

      -

         backup> jobs
      -
      -

      where -

      -

      j -
      Is the shortest acceptable abbreviation of jobs. -
      -
    -

    The output always includes the expiration date and time of the tokens that -the backup command interpreter is using during the current -interactive session, in the following format: -

       date   time: TOKEN EXPIRATION
    -
    -

    If the execution date and time specified for a scheduled dump operation is -later than date time, then its individual line (as described in the -following paragraphs) appears below this line to indicate that the current -tokens will not be available to it. -

    If the issuer of the backup command included the --localauth flag when entering interactive mode, the line instead -reads as follows: -

       :  TOKEN NEVER EXPIRES
    -
    -

    The entry for a scheduled dump operation has the following format: -

       Job job_ID:  timestamp:  dump  volume_set  dump_level
    -
    -

    where -

    -

    job_ID -
    Is a job identification number assigned by the Backup System. -

    timestamp -
    Indicates the date and time the dump operation is to begin, in the format -month/date/year -hours:minutes (in 24-hour format) -

    volume_set -
    Indicates the volume set to dump. -

    dump_level -
    Indicates the dump level at which to perform the dump operation. -
    -

    The line for a pending or running operation of any other type has the -following format: -

       Job job_ID:  operation  status
    -
    -

    where -

    -

    job_ID -
    Is a job identification number assigned by the Backup System. -

    operation -
    Identifies the operation the Tape Coordinator is performing, which is -initiated by the indicated command: -
    -

    Dump (dump name) -
    Initiated by the backup dump command. The dump -name has the following format: -

    volume_set_name.dump_level_name -

    Restore -
    Initiated by the backup diskrestore, backup -volrestore, or backup volsetrestore command. -

    Labeltape (tape_label) -
    Initiated by the backup labeltape command. The -tape_label is the name specified by the backup labeltape -command's -name or -pname argument. -

    Scantape -
    Initiated by the backup scantape command. -

    SaveDb -
    Initiated by the backup savedb command. -

    RestoreDb -
    Initiated by the backup restoredb command. -
    -

    status -
    Indicates the job's current status in one of the following -messages. If no message appears, the job is either still pending or has -finished. -
    -

    number Kbytes, volume volume_name -
    For a running dump operation, indicates the number of kilobytes copied to -tape or a backup data file so far, and the volume currently being -dumped. -

    number Kbytes, restore.volume -
    For a running restore operation, indicates the number of kilobytes copied -into AFS from a tape or a backup data file so far. -

    [abort requested] -
    The (backup) kill command was issued, but the termination -signal has yet to reach the Tape Coordinator. -

    [abort sent] -
    The operation is canceled by the (backup) kill command. -Once the Backup System removes an operation from the queue or stops it from -running, it no longer appears at all in the output from the command. -

    [butc contact lost] -
    The backup command interpreter cannot reach the Tape -Coordinator. The message can mean either that the Tape Coordinator -handling the operation was terminated or failed while the operation was -running, or that the connection to the Tape Coordinator timed out. -

    [done] -
    The Tape Coordinator has finished the operation. -

    [drive wait] -
    The operation is waiting for the specified tape drive to become -free. -

    [operator wait] -
    The Tape Coordinator is waiting for the backup operator to insert a tape -in the drive. -
    -
    - - - - - -

    To cancel operations in interactive mode

    -
      -

    1. Issue the jobs command at the backup> prompt, to -learn the job ID number of the operation you want to cancel. For -details, see To display pending or running jobs in interactive mode. -
         backup> jobs
      -
      -

    2. Issue the (backup) kill command to cancel the operation. -

      -

         backup> kill <job ID or dump set name>
      -
      -

      where -

      -

      k -
      Is the shortest acceptable abbreviation of kill. -

      job ID or dump set name -
      Specifies either the job ID number of the operation to cancel, as reported -by the jobs command, or for a dump operation only, the dump name in -the format volume_set_name.dump_level_name. -
      -
    -

    Starting and Stopping the Tape Coordinator Process

    - -

    Before performing a backup operation that reads from or writes to a tape -device or backup data file, you must start the Tape Coordinator -(butc) process that handles the drive or file. This section -explains how to start, stop, and check the status of a Tape Coordinator -process. To use these instructions, you must have already configured -the Tape Coordinator machine and created a Tape Coordinator entry in the -Backup Database, as instructed in Configuring Tape Coordinator Machines and Tape Devices. -

    - - -The Tape Coordinator assigns a task ID number to each operation it -performs. The number is distinct from the job ID number assigned by the -backup command interpreter in interactive mode (which is discussed -in Using Interactive and Regular Command Mode). The Tape Coordinator reports the task ID number in -its onscreen trace and in the messages that it writes to its log and error -files. To view the task ID numbers of a Tape Coordinator's running -or pending operations, issue the backup status command. - - - -

    To start a Tape Coordinator process

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file of the cell in which the Tape -Coordinator is to access volume data and the Backup Database. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

      Alternately, you can log into a file server machine as the local superuser -root in Step 3. -

    2. Verify that you can write to the Tape Coordinator's log and error -files in the local /usr/afs/backup directory (the -TE_device_name and TL_device_name -files). If the log and error files do not already exist, you must be -able to insert and write to files in the /usr/afs/backup -directory. -

    3. Open a connection (using a command such as telnet or -rlogin) to the Tape Coordinator machine that drives the tape -device, or whose local disk houses the backup data file. The Tape -Coordinator uses a devoted connection or window that must remain open for the -Tape Coordinator to accept requests and while it is executing them. -

      If you plan to include the -localauth flag to the -butc command in the next step, log in as the local superuser -root. -

    4. Issue the butc command to start the Tape -Coordinator. You can include either, but not both, of the --localauth and -cell options, as discussed in Performing Backup Operations as the Local Superuser Root or in a Foreign Cell. -
         % butc [<port offset>]  [-debuglevel <trace level>]  \
      -          [-cell <cellname>] [-noautoquery] [-localauth]
      -
      -

      where -

      -

      butc -
      Must be typed in full. -

      port offset -
      Specifies the Tape Coordinator's port offset number. You must -provide this argument unless the default value of 0 (zero) is -appropriate. -

      -debuglevel -
      Specifies the type of trace messages that the Tape Coordinator writes to -the standard output stream (stdout). Provide one of the following three -values, or omit this argument to display the default type of messages -(equivalent to setting a value of 0 [zero]): -
        -

      • 0: The Tape Coordinator generates only the minimum number -of messages necessary to communicate with the backup operator, including -prompts for insertion of additional tapes and messages that indicate errors or -the beginning or completion of operations. -

      • 1: In addition to the messages displayed at level -0, the Tape Coordinator displays the name of each volume being -dumped or restored. -

      • 2: In addition to the messages displayed at levels -0 and 1, the Tape Coordinator displays all of the -messages it is also writing to its log file -(/usr/afs/backup/TL_device_name). -
      -

      cellname -
      Names the cell in which to perform the backup operations (the cell where -the relevant volumes reside and the Backup Server process is running). -If you omit this argument, the Tape Coordinator uses its home cell, as defined -in the local /usr/vice/etc/ThisCell file. Do not combine -this argument with the -localauth flag. -

      -noautoquery -
      Disables the Tape Coordinator's prompt for the first tape it needs -for each operation. For a description of the advantages and -consequences of including this flag, see Eliminating the Search or Prompt for the Initial Tape. -

      -localauth -
      Constructs a server ticket using a key from the local -/usr/afs/etc/KeyFile file. The butc process -presents it to the Backup Server, Volume Server, and VL Server during mutual -authentication. You must be logged into a file server machine as the -local superuser root to include this flag, and cannot combine it -with the -cell argument. -
      -
    - -

    To stop a Tape Coordinator process

    -
      -

    1. Enter an interrupt signal such as <Ctrl-c> over the -dedicated connection to the Tape Coordinator. -
    - - - -

    To check the status of a Tape Coordinator process

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup status command. -
         % backup status [<TC port offset>]
      -
      -

      where -

      -

      st -
      Is the shortest acceptable abbreviation of status. -

      TC port offset -
      Specifies the Tape Coordinator's port offset number. You must -provide this argument unless the default value of 0 (zero) is -appropriate. -
      -
    -

    The following message indicates that the Tape Coordinator is not currently -performing an operation: -

       Tape coordinator is idle
    -
    -

    Otherwise, the output includes a message of the following format for each -running or pending operation: -

       Task task_ID:  operation:   status
    -
    -

    where -

    -

    task_ID -
    Is a task identification number assigned by the Tape Coordinator. -It begins with the Tape Coordinator's port offset number. -

    operation -
    Identifies the operation the Tape Coordinator is performing, which is -initiated by the indicated command: -
      -

    • Dump (the backup dump command) -

    • Restore (the backup diskrestore, backup -volrestore, or backup volsetrestore commands) -

    • Labeltape (the backup labeltape command) -

    • Scantape (the backup scantape command) -

    • SaveDb (the backup savedb command) -

    • RestoreDb (the backup restoredb command) -
    -

    status -
    Indicates the job's current status in one of the following -messages. -
    -

    number Kbytes transferred, volume volume_name -
    For a running dump operation, indicates the number of kilobytes copied to -tape or a backup data file so far, and the volume currently being -dumped. -

    number Kbytes, restore.volume -
    For a running restore operation, indicates the number of kilobytes copied -into AFS from a tape or a backup data file so far. -

    [abort requested] -
    The (backup) kill command was issued, but the termination -signal has yet to reach the Tape Coordinator. -

    [abort sent] -
    The operation is canceled by the (backup) kill command. -Once the Backup System removes an operation from the queue or stops it from -running, it no longer appears at all in the output from the command. -

    [butc contact lost] -
    The backup command interpreter cannot reach the Tape -Coordinator. The message can mean either that the Tape Coordinator -handling the operation was terminated or failed while the operation was -running, or that the connection to the Tape Coordinator timed out. -

    [done] -
    The Tape Coordinator has finished the operation. -

    [drive wait] -
    The operation is waiting for the specified tape drive to become -free. -

    [operator wait] -
    The Tape Coordinator is waiting for the backup operator to insert a tape -in the drive. -
    -
    -

    Backing Up Data

    - - - - - - - - - - - - -

    This section explains how to use the backup dump command to back -up AFS data to tape or to a backup data file. The instructions assume -that you understand Backup System concepts and have already configured the -Backup System according to the instructions in Configuring the AFS Backup System. Specifically, you must already have: -

    -

    The most basic way to perform a dump operation is to create an initial dump -of a single volume set as soon as the appropriate Tape Coordinator is -available, by providing only the required arguments to the backup -dump command. Instructions appear in To create a dump. The command has several optional arguments that -you can use to increase the efficiency and flexibility of your backup -procedures: -

      -

    • To append a dump to the end of a set of tapes that already contains other -dumps, include the -append argument. Otherwise, the Backup -System creates an initial dump. Appending dumps enables you to use a -tape's full capacity and has other potentially useful features. -For a discussion, see Appending Dumps to an Existing Dump Set. -

    • To schedule one or more dump operations to run at a future time, include -the -at argument. For a discussion and instructions, see Scheduling Dumps. -

    • To initiate a number of dump operations with a single backup -dump command, include the -file argument to name a file in -which you have listed the commands. For a discussion and instructions, -see Appending Dumps to an Existing Dump Set and Scheduling Dumps. -

    • To generate a list of the volumes to be included in a dump, without -actually dumping them, combine the -n flag with the other arguments -to be used on the actual command. -
    -

    Making Backup Operations More Efficient

    - -

    There are several ways to make dump operations more efficient, less prone -to error, and less disruptive to your users. Several of them also -simplify the process of restoring data if that becomes necessary. -

      -

    • It is best not to dump the read/write or read-only version of a volume, -because no other users or processes can access a volume while it is being -dumped. Instead, shortly before the dump operation begins, create a -backup version of each volume to be dumped, and dump the backup -version. Creating a Backup version usually makes the source volume -unavailable for just a few moments (during which access attempts by other -processes are blocked but do not fail). To automate the creation of -backup volumes, you can create a cron process in the -/usr/afs/local/BosConfig file on one or more server machines, -setting its start time at a sufficient interval before the dump operation is -to begin. Include the -localauth argument to the vos -backup or vos backupsys command to enable it to run without -administrative tokens. For instructions, see To create and start a new process. -

    • The volume set, dump level, and Tape Coordinator port offset you specify -on the backup dump command line must be properly defined in the -Backup Database. The Backup System checks the database before beginning -a dump operation and halts the command immediately if any of the required -entities are missing. If necessary, use the indicated commands: - -

    • Ensure that a valid token corresponding to a privileged administrative -identity is available to the Backup System processes both when the backup -dump command is issued and when the dump operation actually runs (for a -complete description or the necessary privileges, see Granting Administrative Privilege to Backup Operators). This is a special concern for scheduled -dumps. One alternative is to run backup commands (or the -script that invokes them) and the butc command on server machines, -and to include the -localauth argument on the command. In -this case, the processes use the key with the highest key version number in -the local /usr/afs/etc/KeyFile file to construct a token that never -expires. Otherwise, you must use a method to renew tokens before they -expire, or grant tokens with long lifetimes. In either case, you must -protect against improper access to the tokens by securing the machines both -physically and against unauthorized network access. The protection -possibly needs to be even stronger than when a human operator is present -during the operations. -

    • Record tape capacity and filemark size values that are as accurate as -possible in the Tape Coordinator's /usr/afs/backup/tapeconfig -file and on the tape's label. For suggested values and a -description of what can happen when they are inaccurate, see Configuring the tapeconfig File. -

    • If an unattended dump requires multiple tapes, arrange to provide them by -properly configuring a tape stacker or jukebox and writing a tape-mounting -script to be invoked in the device's CFG_device_name -file. For instructions, see Invoking a Device's Tape Mounting and Unmounting Routines. -

    • You can configure any tape device or backup data file's -CFG_device_name file to take advantage of the Backup -System's automation features. See Automating and Increasing the Efficiency of the Backup Process. -

    • When you issue a backup command in regular (noninteractive) -mode, the command shell prompt does not return until the operation -completes. To avoid having to open additional connections, issue the -backup dump command in interactive mode, especially when including -the -at argument to schedule dump operations. -

    • An incremental dump proceeds most smoothly if there is a dump created at -the dump level immediately above the level you are using. If the Backup -System does not find a Backup Database record for a dump created at the -immediate parent level, it looks for a dump created at one level higher in the -hierarchy, continuing up to the full dump level if necessary. It -creates an incremental dump at the level one below the lowest valid parent -dump that it finds, or even creates a full dump if that is necessary. -This algorithm guarantees that the dump captures all data that has changed -since the last dump, but has a couple of disadvantages. First, the -Backup System's search through the database for a valid parent dump takes -extra time. Second, the subsequent pattern of dumps can be confusing to -a human operator who needs to restore data from them, because they were not -performed at the expected dump levels. -

      The easiest way to guarantee that a dump exists at the immediate parent -level is always to perform dump operations on the predetermined -schedule. To check that the parent dump exists, you can issue the -backup dumpinfo command (as described in To display dump records) and search for it in the output. Alternatively, -issue the backup volinfo command (as described in To display a volume's dump history) for a volume that you believe is in the parent dump. -

    • Always use dump levels from the same hierarchy (levels that are -descendants of the same full level) when dumping a given volume set. -The result of alternating between levels from different hierarchies can be -confusing when you need to restore data or read dump records. It also -increases the chance that changed data is not captured in any dump, or is -backed up redundantly into more than one dump. -

    • Use permanent tape names rather than AFS tape names. You can make -permanent names more descriptive than is allowed by an AFS tape name's -strict format, and also bypass the name-checking step that the Backup System -performs by default when a tape has an AFS tape name only. You can also -configure the Tape Coordinator always to skip the check, however; for -instructions and a description of the acceptable format for AFS tape names, -see Eliminating the AFS Tape Name Check. -

    • If you write dumps to tape, restore operations are simplest if all of your -tape devices are compatible (can read the same type of tape, at the same -compression ratios, and so on). If you must use incompatible devices, -then at least use compatible devices for all dumps performed at dump levels -that are at the same depth in their respective hierarchies (compatible devices -for all dumps performed at a full dump level, compatible devices for all dumps -performed at a level 1 incremental dump level, and so on). The --portoffset argument to the backup diskrestore and -backup volsetrestore commands accepts multiple port offset numbers, -but uses the first listed port offset when restoring all full dumps, the -second port offset when restoring all level 1 dumps, and so on. If you -did not use compatible tape devices when creating dumps at the same depth in a -hierarchy, you must restore one volume at a time with the backup -volrestore command. -

    • In some cases, it makes sense to use a temporary volume set, -which exists only within the context of the interactive session in which it is -created and for which no record is created in the Backup Database. One -suitable situation is when dumping a volume to tape in preparation for -removing it permanently (perhaps because its owner is leaving the -cell). In this case, you can define a volume entry that includes only -the volume of interest without cluttering up the Backup Database with a volume -set record that you are using only once. -

    • Do not perform a dump operation when you know that there are network, -machine, or server process problems that can prevent the Backup System from -accessing volumes or the Volume Location Database (VLDB). Although the -Backup System automatically makes a number of repeated attempts to get to an -inaccessible volume, the dump operation takes extra time and in some cases -stops completely to prompt you for instructions on how to continue. -Furthermore, if the Backup System's last access attempt fails and the -volume is omitted from the dump, you must take extra steps to have it backed -up (namely, the steps described just following for a halted dump -operation). For a more complete description of how the Backup System -makes repeated access attempts, see How Your Configuration Choices Influence the Dump Process. -

    • Review the logs created by the Backup System as soon as possible after a -dump operation completes, particularly if it ran unattended. They name -any volumes that were not successfully backed up, among other problems. -The Backup Server writes to the /usr/afs/logs/BackupLog file on the -local disk of the database server machine, and you can use the bos -getlog command to read it remotely if you wish; for instructions, -see Displaying Server Process Log Files. The Tape Coordinator writes to two files in the -local /usr/afs/backup directory on the machine where it is -running: the TE_device_name file records errors, and -the TL_device_name file records both trace and error -messages. -

    • Avoid halting a dump operation (for instance, by issuing the (backup) -kill command in interactive mode), both because it introduces the -potential for confusion and because recovering from the interruption requires -extra effort. When a dump operation is interrupted, the volumes that -were backed up before the halt signal is received are complete on the tape or -in the backup data file, and are usable in restore operations. The -records in the Backup Database about the volumes' dump history accurately -show when and at which dump level they were backed up; to display the -records, use the backup volinfo command as described in To display a volume's dump history. -

      However, there is no indication in the dump's Backup Database record -that volumes were omitted; to display the record, use the backup -dumpinfo command as described in To display dump records. You must choose one of the following methods for -dealing with the volumes that were not backed up before the dump operation -halted. (Actually, you must make the same decision if the dump -operation halts for reasons outside your control.) -

        -

      • You can take no action, waiting until the next regularly scheduled dump -operation to back them up. At that time, the Backup System -automatically dumps them at the appropriate level to guarantee that the dump -captures all of the data that changed since the volume was last dumped. -However, you are gambling that restoring the volume is not necessary before -the next dump operation. If restoration is necessary, you can restore -the volume only to its state at the time it was last included in a -dump--you have lost all changes made to the volume since that -time. -

      • You can discard the entire dump and run the dump operation again. -To discard the dump, use the backup labeltape command to relabel -the tapes or backup data file, which automatically removes all associated -records from the Backup Database. For instructions, see Writing and Reading Tape Labels. If a long time has passed since the backup version -of the volumes was created, some of the source volumes have possibly -changed. If that seems likely, reissue the vos backup or -vos backupsys command on them before redoing the dump -operation. -

      • You can create a new volume set that includes the missed volumes and dump -it at a full dump level (even if you specify an incremental dump level, the -Backup System uses the full dump level at the top of your specified -level's hierarchy, because it has never before backed up these volumes as -part of the new volume set). The next time you dump the original volume -set, the Backup System automatically dumps the missed volumes at the level one -below the level it used the last time it dumped the volumes as part of the -original volume set. -
      -
    -

    How Your Configuration Choices Influence the Dump Process

    - -

    This section provides an overview of the backup process, describing what -happens at each stage both by default and as a result of your configuration -choices, including the configuration instructions you include in the -device-specific CFG_device_name file. For the sake -of clarity, it tracks the progress of a single backup dump command -that creates an initial dump. For a discussion of the slight -differences in the procedure when you append or schedule dumps, see Appending Dumps to an Existing Dump Set or Scheduling Dumps. -

    As a concrete example, the following description traces a dump of the -volume set user at the /weekly/mon/tues/wed dump -level. The user volume set has one volume entry that matches -the backup version of all user volumes: -

       .*    .*    user.*\.backup
    -
    -

    The dump level belongs to the following dump hierarchy. -

       /weekly
    -          /mon
    -              /tues
    -                   /wed
    -                       /thurs
    -                             /fri
    -
    -
      -

    1. You issue the butc command to start a Tape -Coordinator to handle the dump operation. The Tape Coordinator does not -have to be running when you issue the backup dump command, but must -be active in time to accept the list of volumes to be included in the dump, -when Step 3 is completed. To avoid coordination problems, it is -best to start the Tape Coordinator before issuing the backup dump -command. -

      As the Tape Coordinator initializes, it reads the entry in its local -/usr/afs/backup/tapeconfig file for the port offset you specify on -the butc command line. The entry specifies the name of the -device to use, and the Tape Coordinator verifies that it can access it. -It also reads the device's configuration file, -/usr/afs/backup/CFG_device_name, if it exists. See -Step 6 for a description of how the instructions in the file -influence the dump operation. -

    2. You issue the backup dump command, specifying a volume set, -dump level, and the same port offset number you specified on the -butc command in Step 1. The Backup System verifies that they have -correct Backup Database records and halts the operation with an error message -if they do not. -

      If you issue the command in interactive mode, the Backup System assigns the -operation a job ID number, which you can use to check the operation's -status or halt it by using the (backup) jobs or (backup) -kill command, respectively. For instructions, see To display pending or running jobs in interactive mode and To cancel operations in interactive mode. -

    3. The Backup System works with the VL Server to -generate a list of the volumes in the VLDB that match the name and location -criteria defined in the volume set's volume entries. If a volume -matches more than one volume entry, the Backup System ignores the duplicates -so that the dump includes only one copy of data from the volume. -

      To reduce the number of times you need to switch tapes during a restore -operation, the Backup System sorts the volumes by server machine and -partition, and during the dump operation writes the data from all volumes -stored on a specific partition before moving to the next partition. -

      As previously mentioned, it is best to back up backup volumes rather than -read/write volumes, to avoid blocking users' access to data during the -dump. To achieve this, you must explicitly include the -.backup suffix on the volume names in volume entry -definitions. For instructions, and to learn how to define volume -entries that match multiple volumes, see Defining and Displaying Volume Sets and Volume Entries. -

      In the example, suppose that 50 volumes match the user volume -set criteria, including three called user.pat.backup, -user.terry.backup, and -user.smith.backup. -

    4. The Backup System next scans the dump hierarchy for -the dump level you have specified on the backup dump command -line. If it is a full level, then in the current operation the Backup -System backs up all of the data in all of the volumes in the list obtained in -Step 3. -

      If the dump level is incremental, the Backup System reads each -volume's dump history in the Backup Database to learn which of the parent -levels in its pathname was used when the volume was most recently backed up as -part of this volume set. In the usual case, it is the current dump -level's immediate parent level. -

      An incremental dump of a volume includes only the data that changed since -the volume was included in the parent dump. To determine which data are -eligible, the Backup System uses the concept of a volume's clone -date. A read/write volume's clone date is when the Backup -System locks the volume before copying its contents into a dump. A -backup volume's clone date is the completion time of the operation that -created it by cloning its read/write source volume (the operation initiated by -a vos backup or vos backupsys command). A -read-only volume's clone date is the time of the release operation -(initiated by the vos release command) that completed most recently -before the dump operation. -

      More precisely then, an incremental dump includes only data that have a -modification timestamp between the clone date of the volume included in the -parent dump (the parent clone date) and the clone date of the -volume to be included in the current dump (the current clone -date). -

      There are some common exceptions to the general rule that a volume's -parent dump is the dump created at the immediate parent level: -

        -

      • The volume did not exist at all at the time of the last dump. In -this case, the Backup System automatically does a full dump of it. -

      • The volume did not match the volume set's name and location criteria -at the time of the last dump. In this case, the Backup System -automatically does a full dump of it, even if it was backed up recently (fully -or incrementally) as part of another volume set. This redundancy is an -argument for defining volume entries in terms of names rather than locations, -particularly if you move volumes frequently. -

      • The volume was not included in the dump at the immediate parent level for -some reason (perhaps a process, machine, or network access prevented the -Backup System from accessing it). In this case, the Backup System sets -the clone date to the time of the last dump operation that included the -volume. If the volume was not included in a dump performed at any of -the levels in the current level's pathname, the Backup System does a full -dump of it. -
      -

      In the example, the current dump level is -/weekly/mon/tues/wed. The -user.pat.backup and -user.terry.backup volumes were included in the dump -performed yesterday, Tuesday, at the /weekly/mon/tues level. -The Backup System uses as their parent clone date 3:00 -a.m. on Tuesday, which is when backup versions of them were -created just before Tuesday's dump operation. However, -Tuesday's dump did not include the -user.smith.backup volume for some reason. The -last time it was included in a dump was Monday, at the /weekly/mon -level. The Backup System uses a parent clone date of Monday at -2:47 a.m., which is when a backup version of the volume -was created just before the dump operation on Monday. -

    5. If performing an incremental dump, the Backup System works with the Volume -Server to prepare a list of all of the files in each volume that have changed -(have modification timestamps) between the parent clone date and the current -clone date. The dump includes the complete contents of every such -file. If a file has not changed, the dump includes only a placeholder -stub for it. The dump also includes a copy of the complete directory -structure in the volume, whether or not it has changed since the previous -dump. -

      If none of the data in the volume has changed since the last dump, the -Backup System omits the volume completely. It generates the following -message in the Tape Coordinator window and log files: -

         Volume volume_name (volume_ID) not dumped - has not been modified 
      -      since last dump.
      -
      -

    6. The Tape Coordinator prepares to back up the -data. If there is a CFG_device_name file, the Tape -Coordinator already read it in Step 1. The following list describes how the instructions in -the file guide the Tape Coordinator's behavior at this point: -
      -

      FILE -
      If this instruction is set to YES, the Tape Coordinator writes -data to a backup data file. The device_name field in the -tapeconfig file must also specify a filename for the dump to work -properly. For further discussion and instructions on configuring a -backup data file, see Dumping Data to a Backup Data File. -

      If it is set to NO or does not appear in the file, the Tape -Coordinator writes to a tape device. -

      MOUNT and UNMOUNT -
      If there is a MOUNT instruction in the file, each time the Tape -Coordinator needs a new tape, it invokes the indicated script or program to -mount a tape in the device's tape drive. There must be a -MOUNT instruction if you want to utilize a tape stacker or -jukebox's ability to switch between tapes automatically. If there -is no MOUNT instruction, the Tape Coordinator prompts the human -operator whenever it needs a tape. -

      The AUTOQUERY instruction, which is described just following, -modifies the Tape Coordinator's tape acquisition procedure for the first -tape it needs in a dump operation. -

      If there is an UNMOUNT instruction, then the Tape Coordinator -invokes the indicated script or program whenever it closes the tape -device. Not all tape devices have a separate tape unmounting routine, -in which case the UNMOUNT instruction is not necessary. For -more details on both instructions, see Invoking a Device's Tape Mounting and Unmounting Routines. -

      AUTOQUERY -
      If this instruction is set to NO, the Tape Coordinator assumes -that the first tape needed for the dump operation is already in the tape -drive. It does not use its usual tape acquisition procedure as -described in the preceding discussion of the MOUNT -instruction. You can achieve the same effect by including the --noautoquery flag to the butc command. -

      If this instruction is absent or set to YES, the Tape -Coordinator uses its usual tape acquisition procedure even for the first -tape. For more details, see Eliminating the Search or Prompt for the Initial Tape. -

      BUFFERSIZE -
      If this instruction appears in the file, the Tape Coordinator sets its -buffer size to the specified value rather than using the default buffer size -of 16 KB. For further discussion, see Setting the Memory Buffer Size to Promote Tape Streaming. -
      -

      If there is no CFG_device_name file, the Tape -Coordinator writes data to a tape device and prompts the human operator each -time it needs a tape (the only exception being the first tape if you include -the -noautoquery flag to the butc command). -

    7. The Tape Coordinator opens either a tape drive or -backup data file at this point, as directed by the instructions in the -CFG_device_name file (described in Step 6). The instructions also determine whether it -invokes a mount script or prompts the operator. In Step 1 the Tape Coordinator read in the device's capacity and -filemark size from the tapeconfig file. It now reads the -same values from the tape or backup data file's magnetic label, and -overwrites the tapeconfig values if there is a difference. -

      If creating an initial dump (as in the current example) and there is no -permanent name on the label, the Tape Coordinator next checks that the AFS -tape name has one of the three acceptable formats. If not, it rejects -the tape and you must use the backup labeltape command to write an -acceptable name. You can bypass this name-checking step by including -the NAME_CHECK NO instruction in the -CFG_device_name file. For discussion and a list of -the acceptable AFS tape name values, see Eliminating the AFS Tape Name Check. -

    8. For an initial dump, the Tape Coordinator starts writing -at the beginning of the tape or backup dump file, overwriting any existing -data. To prevent inappropriate overwriting, the Backup System first -checks the Backup Database for any dump records associated with the name -(permanent or AFS tape name) on the tape or backup dump file's -label. It refuses to write to a backup data file that has unexpired -dumps in it, or to a tape that belongs to a dump set with any unexpired -dumps. To recycle a file or tape before all dumps have expired, you -must use the backup labeltape command to relabel it. Doing -so removes the Backup Database records of all dumps in the file or on all -tapes in the dump set, which makes it impossible to restore data from any of -the tapes. For more information on expiration dates, see Defining Expiration Dates. -

      The Tape Coordinator also checks for two other types of inappropriate tape -reuse. The tape cannot already have data on it that belongs to the dump -currently being performed, because that implies that the previous tape is -still in the drive, or you have mistakenly reinserted it. The Tape -Coordinator generates the following message and attempts to obtain another -tape: -

         Can't overwrite tape containing the dump in progress
      -
      -

      The tape cannot contain data from a parent dump of the current -(incremental) dump, because overwriting a parent dump makes it impossible to -restore data from the current dump. The Tape Coordinator generates the -following message and attempts to obtain another tape: -

         Can't overwrite the parent dump parent_name (parent_dump_ID)
      -
      -

    9. The Tape Coordinator now writes data to the tape or backup -data file. It uses the capacity and filemark size it obtained in Step 7 as it tracks how much more space is available, automatically -using its tape acquisition procedure if the dump is not finished when it -reaches the end of the tape. For a more detailed description, and a -discussion of what happens if the Tape Coordinator reaches the physical -end-of-tape unexpectedly, see Configuring the tapeconfig File. Similarly, for instructions on configuring a backup -data file to optimize recovery from unexpectedly running out of space, see -Step 6 in the instructions in Dumping Data to a Backup Data File. -

      If the Tape Coordinator cannot access a volume during the dump (perhaps -because of a server process, machine, or network outage), it skips the volume -and continues dumping all volumes that it can access. It generates an -error message in the Tape Coordinator window and log file about the omitted -volume. It generates a similar message if it discovers that a backup -volume has not been recloned since the previous dump operation (that is, that -the volume's current clone date is the same as its parent clone -date): -

         Volume volume_name (volume_ID) not dumped - has not been re-cloned 
      -       since last dump.
      -
      -

      After completing a first pass through all of the volumes, it attempts to -dump each omitted volume again. It first checks to see if the reason -that the volume was inaccessible during the first pass is that it has been -moved since the VL Server generated the list of volumes to dump in Step 3. If so, it dumps the volume from its new site. -If the second attempt to access a volume also fails, the Tape Coordinator it -generates the following message, prompting you for instruction on how to -proceed: -

         Dump of volume volume_name (volume_ID) failed
      -   Please select action to be taken for this volume.
      -      r - retry, try dumping this volume again
      -      o - omit, this volume from this dump
      -      a - abort, the entire dump
      -
      -

      To increase the automation of the dump process, you can include the -ASK NO instruction in the CFG_device_name file -to suppress this prompt and have the Tape Coordinator automatically omit the -volume from the dump. -

      If you are tracking the dump as it happens, the prompt enables you to take -corrective action. If the volume has not been recloned, you can issue -the vos backup command. If the volume is inaccessible, you -can investigate and attempt to resolve the cause. - - - - - -

    10. If the tape or backup data file does not already have an AFS tape name, -the Backup System constructs the appropriate one and records it on the label -and in the Backup Database. It also assigns a dump name and ID number -to the dump and records them in dump record that it creates in the Backup -Database. For details on tape and dump names, see Dump Names and Tape Names. For instructions on displaying dump records or a -volume's dump history, or scanning the contents of a tape, see Displaying Backup Dump Records. -
    -

    Appending Dumps to an Existing Dump Set

    - -

    The AFS Backup System enables you to append dumps to the end of the final -tape in a dump set by including the -append flag to the backup -dump command. Appending dumps improves Backup System automation -and efficiency in several ways: -

      -

    • It maximizes use of a tape's capacity. An initial dump must -always start on a new tape, but does not necessarily extend to the end of the -final tape in the dump set. You can fill up the unused tape by -appending one or more dumps. -

    • It can reduce the number of tapes and tape changes needed to complete a -dump operation. Rather than performing a series of initial dumps first, -instead begin with an initial dump and follow it immediately with several -appended dumps. In this way you can write all dumps in the series to -the same tape (assuming the tape is large enough to accommodate them -all). If, in contrast, you perform all of the initial dumps first, each -must begin on a new tape and you must switch tapes again if you then want to -append dumps. -

      You can either issue the appropriate series of backup dump -commands at the interactive backup> prompt, or record them in a -file that you then name with the -file argument to the backup -dump command. Appending dumps in this way enables you to run -multiple unattended backup operations even without a tape stacker or jukebox, -if all of the dumps fit on one tape. -

    • It can reduce the number of tape changes during a restore -operation. For example, if you append all of the incremental dumps of a -volume set to tapes in one dump set, then restoring a volume from the volume -set requires a minimum number of tape changes. It is best not to append -incremental dumps to a tape that contains the parent full dump, however: -if the tape is lost or damaged, you lose all of the data from the -volume. -

      Although it can be efficient to group together appended dumps that are -related, the Backup System does not require any relationship between the -appended dumps on a tape or in a dump set. -

    -

    When writing an appended dump, the Backup System performs most of the steps -described in How Your Configuration Choices Influence the Dump Process. Appended dumps do not have to be related to one -another or the initial dump, so it skips Step 7: there is no need to check that the AFS tape name -reflects the volume set and dump level names in this case. It also -skips Step 8. Because it is not overwriting any existing data on -the tape, it does not need to check the expiration dates of existing dumps on -the tape or in the file. Then in Step 9 the Tape Coordinator scans to the end of the last dump on -the tape or in the backup data file before it begins writing data. -

    The Backup System imposes the following conditions on appended dumps: -

      -

    • If writing to tape, the Tape Coordinator checks that it is the final one -in a dump set for which there are complete and valid tape and dump records in -the Backup Database. If not, it rejects the tape and requests an -acceptable one. If you believe the tape has valid data on it, you can -reconstruct the Backup Database dump records for it by using the --dbadd argument to the backup scantape command as -instructed in To scan the contents of a tape. -

    • The most recent dump on the tape or in the backup data file must have -completed successfully. -

    • The dump set to which the tape or file belongs must begin with an initial -dump that is recorded in the Backup Database. If there are no dumps on -the current tape, then the Backup System treats the dump operation as an -initial dump and imposes the relevant requirements (for example, checks the -AFS tape name if appropriate). -
    -

    As you append dumps, keep in mind that all of a dump set's dump and -tape records in the Backup Database are indexed to the initial dump. If -you want to delete an appended dump's record, you must delete the initial -dump record, and doing so erases the records of all dumps in the dump -set. Without those records, you cannot restore any of the data in the -dump set. -

    Similarly, all of the dumps in a dump set must expire before you can -recycle (write a new initial dump to) any of the tapes in a dump set. -Do not append a dump if its expiration date is later than the date on which -you want to recycle any of the tapes in its dump set. To recycle a tape -before the last expiration date, you must delete the initial dump's -record from the Backup Database. Either use the backup -labeltape command to relabel the tape as instructed in To label a tape, or use the backup deletedump command -to delete the record directly as instructed in To delete dump records from the Backup Database. -

    Although in theory you can append as many dumps as you wish, it generally -makes sense to limit the number of tapes in a dump set (for example, to five), -for these reasons: -

      -

    • If an unreadable spot develops on one of the tapes in a dump set, it can -prevent the Tape Coordinator from scanning the tape as part of a backup -scantape operation you use to reconstruct Backup Database -records. The Tape Coordinator can almost always scan the tape -successfully up to the point of damage and can usually skip past minor -damage. A scanning operation can start on any tape in a dump set, so -damage on one tape does not prevent scanning of the others in the dump -set. However, you can scan only the tapes that precede the damaged one -in the dump set or the ones that follow the damaged one, but not both. -(For more information on using tapes to reconstruct the information in the -Backup Database, see To scan the contents of a tape.) -

      An unreadable bad spot can also prevent you from restoring a volume -completely, because restore operations must begin with the full dump and -continue with each incremental dump in order. If you cannot restore a -specific dump, you cannot restore any data from later incremental -dumps. -

    • If you decide in the future to archive one or more dumps, then you must -archive the entire set of tapes that constitute the dump set, rather than just -the ones that contain the data of interest. This wastes both tape and -archive storage space. For more information on archiving, see Archiving Tapes. -
    -

    Scheduling Dumps

    -

    By default, the Backup System starts executing a dump -operation as soon as you enter the backup dump command, and the -Tape Coordinator begins writing data as soon as it is not busy and the list of -files to write is available. You can, however, schedule a dump -operation to begin at a specific later time: -

      -

    • To schedule a single dump operation, include the -at argument -to specify its start time. -

    • To schedule multiple dump operations, list the operations in a file named -by the -file argument and use the -at argument to -specify when the backup command interpreter reads the file. -If you omit the -at argument, the command interpreter reads the -file immediately, which does not count as scheduling, but does allow you to -initiate multiple dump operations in a single command. Do not combine -the -file argument with the -volumeset, --dump, -portoffset, -append, or -n -options. -

      For file-formatting instructions, see the description of the --file argument in Step 7 of To create a dump. -

    -

    The Backup System performs initial and appended dumps in the same manner -whether they are scheduled or begin running as soon as you issue the -backup dump command. The only difference is that the -requirements for successful execution hold both at the time you issue the -command and when the Backup System actually begins running it. All -required Backup Database entries for volume sets, dump levels, and port -offsets, and all dump and tape records must exist at both times. -Perhaps more importantly, the required administrative tokens must be available -at both times. See Making Backup Operations More Efficient. -

    To create a dump

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

    3. If using a tape device, insert the tape. -

    4. Issue the backup command to enter interactive mode. -
         % backup
      -
      -

    5. Decide which volume set and dump level to use. If necessary, issue -the backup listvolsets and backup listdumps commands to -display the existing volume sets and dump levels. For complete -instructions and a description of the output, see To display volume sets and volume entries and To display the dump hierarchy. -
         backup> listvolsets  [<volume set name>]
      -   backup> listdumps
      -
      -

      If you want to use a temporary volume set, you must create it during the -current interactive session. This can be useful if you are dumping a -volume to tape in preparation for removing it permanently (perhaps because its -owner is leaving the cell). In this case, you can define a volume entry -that includes only the volume of interest without cluttering up the Backup -Database with a volume set record that you are using only once. -Complete instructions appear in Defining and Displaying Volume Sets and Volume Entries. -

         backup>  addvolset <volume set name> -temporary
      -   backup> addvolentry  -name <volume set name>  \
      -                        -server <machine name>  \
      -                        -partition <partition name>  \
      -                        -volumes <volume name (regular expression)>
      -
      -

    6. If you are creating an initial dump and writing to a tape or backup data -file that does not have a permanent name, its AFS tape name must satisfy the -Backup System's format requirements as described in Eliminating the AFS Tape Name Check. If necessary, use the backup readlabel -command to display the label and the backup labeltape command to -change the names, as instructed in Writing and Reading Tape Labels. You must also relabel a tape if you want to -overwrite it and it is part of a dump set that includes any unexpired dumps, -though this is not recommended. For a discussion of the appropriate way -to recycle tapes, see Creating a Tape Recycling Schedule. - - -

    7. Issue the backup dump command to dump the -volume set. -
        -

      • To create one initial dump, provide only the volume set name, dump level -name, and port offset (if not zero). -

      • To create one appended dump, add the -append flag. -

      • To schedule a single initial or appended dump, add the -at -argument. -

      • To initiate multiple dump operations, record the appropriate commands in a -file and name it with the -file argument. Do not combine -this argument with options other than the -at argument. -
      -
         backup> dump <volume set name> <dump level name> [<TC port offset>]   \
      -                [-at <Date/time to start dump>+]  \
      -                [-append]  [-n] [-file <load file>]
      -
      -

      where -

      -

      dump -
      Must be typed in full. -

      volume set name -
      Names the volume set to dump. -

      dump level name -
      Specifies the complete pathname of the dump level at which to dump the -volume set. -

      TC port offset -
      Specifies the port offset number of the Tape Coordinator process that is -handling the operation. You must provide this argument unless the -default value of 0 (zero) is appropriate. -

      -at -
      Specifies the date and time in the future at which to run the command, or -to read the file named by the -file argument. Provide a -value in the format mm/dd/yyyy -[hh:MM], where the month (mm), day -(dd), and year (yyyy) are required. Valid values for -the year range from 1970 to 2037; higher values are -not valid because the latest possible date in the standard UNIX representation -is in February 2038. The Backup System automatically reduces any later -date to the maximum value in 2038. -

      The hour and minutes (hh:MM) are optional, but if -provided must be in 24-hour format (for example, the value -14:36 represents 2:36 p.m.). If -you omit them, the time defaults to midnight (00:00 hours). -

      As an example, the value 04/23/1999 20:20 schedules the -command for 8:20 p.m. on 23 April 1999. -
      Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
      -

      -append -
      Creates an appended dump by scanning to the end of the data from one or -more previous dump operations that it finds on the tape or in the backup data -file. -

      -n -
      Displays the names of all volumes to be included in the indicated dump, -without actually writing data to tape or the backup data file. Combine -this flag with the arguments you plan to use on the actual command, but not -with the -file argument. -

      -file -
      Specifies the local disk or AFS pathname of a file containing -backup commands. The Backup System reads the file -immediately, or at the time specified by the -at argument if it is -provided. A partial pathname is interpreted relative to the current -working directory. -

      Place each backup dump command on its own line in the indicated -file, using the same syntax as for the command line, but without the word -backup at the start of the line. Each command must include -the volume set name and dump level name arguments plus the -TC port offset argument if the default value of zero is not -appropriate. Commands in the file can also include any of the -backup dump command's optional arguments, including the --at argument (which must specify a date and time later than the -date and time at which the Backup System reads the file). -

      -

    8. If you did not include the -noautoquery flag when you issued -the butc command, or if the device's -CFG_device_name configuration file includes the -instruction AUTOQUERY YES, then the Tape Coordinator prompts you to -place the tape in the device's drive. You have already done so, -but you must now press <Return> to indicate that the tape is -ready for labeling. -

      If more than one tape is required, you must either include the -MOUNT instruction in the CFG_device_name file -and stock the corresponding stacker or jukebox with tapes, or remain at the -console to respond to the Tape Coordinator's prompts for subsequent -tapes. -

    9. After the dump operation completes, review the Backup System's log -files to check for errors. Use the bos getlog command as -instructed in Displaying Server Process Log Files to read the /usr/afs/logs/BackupLog file, and a -text editor on the Tape Coordinator machine to read the -TE_device_name and TL_device_name -files in the local /usr/afs/backup directory. -

      It is also a good idea to record the tape name and dump ID number on the -exterior label of each tape. -

    -

    Displaying Backup Dump Records

    -

    The backup command suite includes three commands -for displaying information about data you have backed up: -

      -

    • To display information about one or more dump operations, such as the date -it was performed and the number of volumes included, use the backup -dumpinfo command as described in To display dump records. You can display a detailed record of a single dump -or more condensed records for a certain number of dumps, starting with the -most recent and going back in time. You can specify the number of dumps -or accept the default of 10. -

    • To display a volume's dump history, use the backup volinfo -command as described in To display a volume's dump history. -

    • To display information extracted from a tape or backup data file about the -volumes it includes, use the backup scantape command. To -create new dump and tape records in the Backup Database derived from the tape -and dump labels, add the -dbadd flag. For instructions, see To scan the contents of a tape. -
    - - - - - - - -

    To display dump records

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup dumpinfo command to list information about -dumps recorded in the Backup Database. -
         % backup dumpinfo [-ndumps <no. of dumps>]  [-id <dump id>]  [-verbose]
      -
      -

      where -

      -

      dump -
      Is the shortest acceptable abbreviation of dumpinfo. -

      -ndumps -
      Displays the Backup Database record for each of the specified number of -dumps, starting with the most recent and going back in time. If the -database contains fewer dumps than are requested, the output includes the -records for all existing dumps. Do not combine this argument with the --id argument or -verbose flag; omit all three -options to display the records for the last 10 dumps. -

      -id -
      Specifies the dump ID number of a single dump for which to display the -Backup Database record. You must include the -id -switch. Do not combine this option with the -ndumps or --verbose arguments; omit all three arguments to display the -records for the last 10 dumps. -

      -verbose -
      Provides more detailed information about the dump specified with the --id argument, which must be provided along with it. Do not -combine this flag with the -ndumps option. -
      -
    -

    If the -ndumps argument is provided, the output presents the -following information in table form, with a separate line for each dump: -

    -

    dumpid -
    The dump ID number. -

    parentid -
    The dump ID number of the dump's parent dump. A value of -0 (zero) identifies a full dump. -

    lv -
    The depth in the dump hierarchy of the dump level used to create the -dump. A value of 0 (zero) identifies a full dump, in which -case the value in the parentid field is also 0. A -value of 1 or greater indicates an incremental dump made at the -corresponding level in the dump hierarchy. -

    created -
    The date and time at which the Backup System started the dump operation -that created the dump. -

    nt -
    The number of tapes that contain the data in the dump. A value of -0 (zero) indicates that the dump operation was terminated or -failed. Use the backup deletedump command to remove such -entries. -

    nvols -
    The number of volumes from which the dump includes data. If a -volume spans tapes, it is counted twice. A value of 0 (zero) -indicates that the dump operation was terminated or failed; the value in -the nt field is also 0 in this case. -

    dump name -
    The dump name in the form -
       volume_set_name.dump_level_name (initial_dump_ID)
    -   
    -
    -

    -

    where volume_set_name is the name of the volume set, and -dump_level_name is the last element in the dump level pathname at -which the volume set was dumped. -

    The initial_dump_ID, if displayed, is the dump ID of the initial -dump in the dump set to which this dump belongs. If there is no value -in parentheses, the dump is the initial dump in a dump set that has no -appended dumps. -

    -

    If the -id argument is provided alone, the first line of output -begins with the string Dump and reports information for the entire -dump in the following fields: -

    -

    id -
    The dump ID number. -

    level -
    The depth in the dump hierarchy of the dump level used to create the -dump. A value of 0 (zero) identifies a full dump. A -value of 1 (one) or greater indicates an incremental dump made at -the specified level in the dump hierarchy. -

    volumes -
    The number of volumes for which the dump includes data. -

    created -
    The date and time at which the dump operation began. -
    -

    Following a blank line, the output includes an entry for each tape that -houses volume data from the dump. Following the string Tape, -the first two lines of each entry report information about that tape in the -following fields: -

    -

    name -
    The tape's permanent name if it has one, or its AFS tape name -otherwise, and its tape ID number in parentheses. -

    nVolumes -
    The number of volumes for which this tape includes dump data. -

    created -
    The date and time at which the Tape Coordinator began writing data to this -tape. -
    -

    Following another blank line, the tape-specific information concludes with -a table that includes a line for each volume dump on the tape. The -information appears in columns with the following headings: -

    -

    Pos -
    The relative position of each volume in this tape or file. On a -tape, the counter begins at position 2 (the tape label occupies position 1), -and increments by one for each volume. For volumes in a backup data -file, the position numbers start with 1 and do not usually increment only by -one, because each is the ordinal of the 16 KB offset in the file at which the -volume's data begins. The difference between the position numbers -therefore indicates how many 16 KB blocks each volume's data -occupies. For example, if the second volume is at position 5 and the -third volume in the list is at position 9, that means that the dump of the -second volume occupies 64 KB (four 16-KB blocks) of space in the file. -

    Clone time -
    For a backup or read-only volume, the time at which it was cloned from its -read/write source. For a Read/Write volume, it is the same as the dump -creation date reported on the first line of the output. -

    Nbytes -
    The number of bytes of data in the dump of the volume. -

    Volume -
    The volume name, complete with .backup or -.readonly extension if appropriate. -
    -

    If both the -id argument and the -verbose flag are -specified, the output is divided into several sections: -

      -

    • The first section, headed by the underlined string Dump, -includes information about the entire dump. The fields labeled -id, level, created, and nVolumes -report the same values (though in a different order) as appear on the first -line of output when the -id argument is provided by itself. -Other fields of potential interest to the backup operator are: -
      -

      maxTapes -
      The number of tapes that contain the dump set to which this dump -belongs. -

      Start Tape Seq -
      The ordinal of the tape on which this dump begins in the set of tapes that -contain the dump set. -
      -

    • For each tape that contains data from this dump, there follows a section -headed by the underlined string Tape. The fields labeled -name, written, and nVolumes report the same -values (though in a different order) as appear on the second and third lines -of output when the -id argument is provided by itself. Other -fields of potential interest to the backup operator are: -
      -

      expires -
      The date and time when this tape can be recycled, because all dumps it -contains have expired. -

      nMBytes Data and nBytes Data -
      Summed together, these fields represent the total amount of dumped data -actually from volumes (as opposed to labels, filemarks, and other -markers). -

      KBytes Tape Used -
      The number of kilobytes of tape (or disk space, for a backup data file) -used to store the dump data. It is generally larger than the sum of the -values in the nMBytes Data and nBytes Data fields, -because it includes the space required for the label, file marks and other -markers, and because the Backup System writes data at 16 KB offsets, even if -the data in a given block doesn't fill the entire 16 KB. -
      -

    • For each volume on a given tape, there follows a section headed by the -underlined string Volume. The fields labeled -name, position, clone, and nBytes -report the same values (though in a different order) as appear in the table -that lists the volumes in each tape when the -id argument is -provided by itself. Other fields of potential interest to the backup -operator are: -
      -

      id -
      The volume ID. -

      tape -
      The name of the tape containing this volume data. -
      -
    -

    The following example command displays the Backup Database records for the -five most recent dump operations. -

       % backup dump 5
    -      dumpid   parentid lv created          nt nvols dump name
    -   924424000          0 0  04/18/1999 04:26  1    22 usr.sun (924424000)
    -   924685000  924424000 1  04/21/1999 04:56  1    62 usr.wed (924424000)
    -   924773000  924424000 1  04/22/1999 05:23  1    46 usr.thu (924424000)
    -   924860000  924424000 1  04/23/1999 05:33  1    58 usr.fri (924424000)
    -   925033000          0 0  04/25/1999 05:36  2    73 sys.week
    -
    - - - - -

    To display a volume's dump history

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup volinfo command to display a volume's -dump history. -
         % backup volinfo <volume name>
      -
      -

      where -

      -

      voli -
      Is the shortest acceptable abbreviation of volinfo. -

      volume name -
      Names the volume for which to display the dump history. If you -dumped the backup or read-only version of the volume, include the -.backup or .readonly extension. -
      -
    -

    The output includes a line for each Backup Database dump record that -mentions the specified volume, order from most to least recent. The -output for each record appears in a table with six columns: -

    -

    dumpID -
    The dump ID of the dump that includes the volume. -

    lvl -
    The depth in the dump hierarchy of the dump level at which the volume was -dumped. A value of 0 indicates a full dump. A value -of 1 or greater indicates an incremental dump made at the specified -depth in the dump hierarchy. -

    parentid -
    The dump ID of the dump's parent dump. A value of 0 -indicates a full dump, which has no parent; in this case, the value in -the lvl column is also 0. -

    creation date -
    The date and time at which the Backup System started the dump operation -that created the dump. -

    clone date -
    For a backup or read-only volume, the time at which it was cloned from its -read/write source. For a read/write volume, the same as the value in -the creation date field. -

    tape name -
    The name of the tape containing the dump: either the permanent tape -name, or an AFS tape name in the format -volume_set_name.dump_level_name.tape_index -where volume_set_name is the name of the volume set associated with -the initial dump in the dump set of which this tape is a part; -dump_level_name is the name of the dump level at which the initial -dump was backed up; tape_index is the ordinal of the tape in -the dump set. Either type of name can be followed by a dump ID in -parentheses; if it appears, it is the dump ID of the initial dump in the -dump set to which this appended dump belongs. -
    -

    The following example shows part of the dump history of the backup volume -user.smith.backup: -

       % backup volinfo user.smith.backup
    -   DumpID    lvl parentID  creation   date  clone date       tape name
    -   924600000 1   924427600 04/20/1999 05:20 04/20/1999 05:01 user_incr_2 (924514392)
    -   924514392 1   924427600 04/19/1999 05:33 04/19/1999 05:08 user_incr_2 
    -   924427600 0           0 04/18/1999 05:26 04/18/1999 04:58 user_full_6 
    -       .     .      .         .       .       .      .         .
    -       .     .      .         .       .       .      .         .
    -
    - - - - - -

    To scan the contents of a tape

    -
    Note:The ability to scan a tape that is corrupted or damaged -depends on the extent of the damage and what type of data is corrupted. -The Backup System can almost always scan the tape successfully up to the point -of damage. If the damage is minor, the Backup System can usually skip -over it and scan the rest of the tape, but more major damage can prevent -further scanning. A scanning operation does not have to begin with the -first tape in a dump set, but the Backup System can process tapes only in -sequential order after the initial tape provided. Therefore, damage on -one tape does not prevent scanning of the others in the dump set, but it is -possible to scan either the tapes that precede the damaged one or the ones -that follow it, not both. -

    If you use the -dbadd flag to scan information into the Backup -Database and the first tape you provide is not the first tape in the dump set, -the following restrictions apply: -

      -

    • If the first data on the tape is a continuation of a volume that begins on -the previous (unscanned) tape in the dump set, the Backup System does not add -a record for that volume to the Backup Database. -

    • The Backup System must read the marker that indicates the start of an -appended dump to add database records for the volumes in it. If the -first volume on the tape belongs to an appended dump, but is not immediately -preceded by the appended-dump marker, the Backup System does not create a -Backup Database record for it or any subsequent volumes that belong to that -appended dump. -
    -
    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

    3. If scanning a tape, place it in the drive. -

    4. (Optional) Issue the backup command to enter -interactive mode. -
         % backup
      -
      - - -

    5. Issue the backup scantape command to read the contents of the -tape. -
         backup> scantape [-dbadd] [-portoffset <TC port offset>]
      -
      -

      where -

      -

      sc -
      Is the shortest acceptable abbreviation of scantape. -

      -dbadd -
      Constructs dump and tape records from the tape and dump labels in the dump -and writes them into the Backup Database. -

      TC port offset -
      Specifies the port offset number of the Tape Coordinator process that is -handling the operation. You must provide this argument unless the -default value of 0 (zero) is appropriate. -
      -

    6. If you did not include the -noautoquery flag when you issued -the butc command, or the device's -CFG_device_name configuration file includes the -instruction AUTOQUERY YES instruction, then the Tape Coordinator -prompts you to place the tape in the device's drive. You have -already done so, but you must now press <Return> to indicate -that the tape is ready for reading. -
    -

    To terminate a tape scanning operation, use a termination signal such as -<Ctrl-c>, or issue the (backup) kill command in -interactive mode. It is best not to interrupt the scan if you included -the -dbadd argument. If the Backup System has already -written new records into the Backup Database, then you must remove them before -rerunning the scanning operation. If during the repeated scan operation -the Backup System finds that a record it needs to create already exists, it -halts the operation. -

    For each dump on the tape, the output in the Tape Coordinator window -displays the dump label followed by an entry for each volume. There is -no output in the command window. The dump label has the same fields as -the tape label displayed by the backup readlabel command, as -described in Writing and Reading Tape Labels. Or see the AFS Administration Reference -for a detailed description of the fields in the output. -

    The following example shows the dump label and first volume entry on the -tape in the device that has port offset 2: -

       % backup scantape 2
    -   -- Dump label --
    -   tape name = monthly_guest
    -   AFS tape name = guests.monthly.3
    -   creationTime =  Mon Feb  1 04:06:40 1999
    -   cell = abc.com
    -   size = 2150000 Kbytes
    -   dump path = /monthly
    -   dump id = 917860000
    -   useCount = 44
    -   -- End of dump label --
    -   -- volume --
    -   volume name: user.guest10.backup
    -   volume ID 1937573829
    -   dumpSetName: guests.monthly
    -   dumpID 917860000
    -   level 0
    -   parentID 0
    -   endTime 0
    -   clonedate Mon Feb  1 03:03:23 1999
    -
    -

    Restoring and Recovering Data

    - - - - - - - - - - - - -

    The purpose of making backups is to enable you to recover when data becomes -corrupted or is removed accidentally, returning the data to a coherent past -state. The AFS Backup System provides three commands that restore -varying numbers of volumes: -

      -

    • To restore one or more volumes to a single site (partition on an AFS file -server machine), use the backup volrestore command. -

    • To restore one or more volumes that are defined as a volume set, each to a -specified site, use the backup volsetrestore command. -

    • To restore an entire partition (that is, all of the volumes that the VLDB -lists as resident on it), use the backup diskrestore -command. -
    -

    The commands are suited to different purposes because they vary in the -combinations of features they offer and in the requirements they -impose. To decide which is appropriate for a specific restore -operation, see the subsequent sections of this introduction: Using the backup volrestore Command, Using the backup diskrestore Command, and Using the backup volsetrestore Command. -

    Making Restore Operations More Efficient

    -

    The following comments apply to all types of restore -operation: -

      -

    • The Backup System begins by restoring the most recent full dump of a -volume. As it restores subsequent incremental dumps, it alters the data -in the full dump appropriately, essentially repeating the volume's change -history. The backup diskrestore and backup -volsetrestore commands always restore all incremental dumps, bringing a -volume to its state at the time of the most recent incremental dump. -You can use the backup volrestore command to return a volume to its -state at a specified time in the past, by not restoring the data from -incremental dumps performed after that time. -

    • The Backup System sets a restored volume's creation date to the date -and time of the restore operation. The creation date appears in the -Creation field of the output from the vos examine and -vos listvol commands. -

    • When identifying the volumes to restore, it is best to specify the base -(read/write) name. In this case, the Backup System searches the Backup -Database for the most recent dump set that includes data from either the -read/write or backup version of the volume, and restores dumps of that volume -starting with the most recent full dump. If you include the -.backup or .readonly extension on the -volume name, the Backup System restores dumps of that version only. If -it cannot find data dumped from that version, it does not perform the -restoration even if another version was dumped. -

    • All three restoration commands accept the -n option, which -generates a list of the volumes to be restored and the tapes or backup data -files that contain the necessary dumps, without actually restoring data to AFS -server partitions. This enables you to gather together the tapes before -beginning the restore operation, even preloading them into a stacker or -jukebox if you are using one. -

    • If you back up AFS data to tape, restoration is simplest if all of your -tape devices are compatible, meaning that they can read the same type of tape, -at the same compression ratios, and so on. (This suggestion also -appears in Making Backup Operations More Efficient, because by the time you need to restore data it is too late -to implement it.) You can still restore multiple volumes with a single -command even if data was backed up using incompatible devices, because the --portoffset argument to all three restoration commands accepts -multiple values. However, the Backup System uses the first port offset -listed when restoring the full dump of each volume, the next port offset when -restoring the level 1 incremental dump of each volume, and so on. If -you did not use a compatible tape device when creating the full dump of every -volume (and at each incremental level too), you cannot restore multiple -volumes with a single command. You must use the backup -volrestore command to restore one volume at a time, or use the -backup volsetrestore command after defining volume sets that group -volumes according to the tape device used to dump them. -

    • During a restore operation, the Backup System uses instructions in the -relevant CFG_device_name configuration file in much the -same way as during a dump operation, as described in How Your Configuration Choices Influence the Dump Process. It uses the MOUNT, UNMOUNT, -AUTOQUERY, BUFFERSIZE, and FILE instructions -just as for a dump operation. A difference for the -BUFFERSIZE instruction is that the default buffer size overridden -by the instruction is 32 KB for restore operations rather than the 16 KB used -for dump operations. The Backup System does not use the -NAME_CHECK instruction at all during restore operations. The -ASK instruction controls whether the Backup System prompts you if -it cannot restore a volume for any reason. If the setting is -NO, it skips the problematic volume and restores as many of the -other volumes as possible. -

    • Do not perform a restore operation when you know that there are network, -machine, or server process problems that can prevent the Backup System from -accessing volumes or the VLDB. Although the Backup System automatically -makes a number of repeated attempts to restore a volume, the restore operation -takes extra time and in some cases stops completely to prompt you for -instructions on how to continue. -

    • Avoid halting a restore operation (for instance by issuing the -(backup) kill command in interactive mode). If a restore -operation is interrupted for any reason, including causes outside your -control, reissue the same restoration command as soon as is practical; if -an outage or other problem caused the operation to halt, do not continue until -the system returns to normal. -

      Any volume that is completely restored when the operation halts is online -and usable, but very few volumes are likely to be in this state. When -restoring multiple volumes at once, the Backup System restores the full dump -of every volume before beginning the level 1 incremental restore for any of -them, and so on, completing the restore of every volume at a specific -incremental level before beginning to restore data from the next incremental -level. Unless a volume was dumped at fewer incremental levels than -others being restored as part of the same operation, it is unlikely to be -complete. -

      It is even more dangerous to interrupt a restore operation if you are -overwriting the current contents of the volume. Depending on how far -the restore operation has progressed, it is possible that the volume is in -such an inconsistent state that the Backup System removes it entirely. -The data being restored is still available on tape or in the backup data file, -but you must take extra steps to re-create the volume. -

    -

    Using the backup volrestore Command

    - - - - - - -

    The backup volrestore command is most appropriate when you need -to restore a few volumes to a single site (partition on a file server -machine). By default, it restores the volumes to their state at the -time of the most recent dump operation (this is termed a full -restore). You can also use the command to perform a -date-specific restore, which restores only the dumps (full and -incremental) performed before a specified date and time, leaving the volume in -the state it was in at the time of the final relevant incremental dump. -The backup diskrestore and backup volsetrestore commands -can only perform full restores. -

    You can restore data into a new copy of each volume rather than overwriting -the current version, by including the -extension argument. -After mounting the new volume in the filespace, you can compare the contents -of the two and decide which to keep permanently. -

    The following list summarizes how to combine the backup -volrestore command's arguments to restore a volume in different -ways: -

      -

    • To perform a date-specific restore as described just previously, use the --date argument to specify the date and optionally time. The -Backup System restores the most recent full dump and each subsequent -incremental dump for which the clone date of the volume included in the dump -is before the indicated date and time (for a definition of the clone date, see -Step 4 in How Your Configuration Choices Influence the Dump Process). You can combine this argument with -the -extension argument to place the date-specific restore in a new -volume. -

    • To move a volume to a new site as you overwrite its contents with the -restored data, use the -server and -partition arguments, -singly or in combination, to specify the new site rather than the current -site. The Backup System creates a new volume at that site, removes the -existing volume, and updates the site information in the volume's VLDB -entry. The volume's backup version is not removed automatically -from the original site, if it exists. Use the vos remove -command to remove it and the vos backup command to create a backup -version at the new site. -

    • To create a new volume to house the restored data, rather than overwriting -an existing volume, use the -extension argument. The Backup -System creates the new volume on the server and partition named by the --server and -partition arguments, derives its name by -adding the extension to the name specified with the -volume -argument, and creates a new VLDB entry for it. The command does not -affect the existing volume in any way. However, if a volume with the -specified extension also already exists, the command overwrites it. To -make the contents of the new volume accessible, use the fs mkmount -command to mount it. You can then compare its contents to those of the -existing volume, to see which to retain permanently. -

    • To restore a volume that no longer exists on an AFS server partition, but -for which you have backed up data, specify the name of the new volume with the --volume argument and use the -server and --partition arguments to place it at the desired site. The -Backup System creates a new volume and new VLDB entry. -
    - - -

    To restore volumes with the backup volrestore command

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

      Repeat the command for each Tape Coordinator if you are using more than one -tape device. -

    3. If using a tape device, insert the tape. -

    4. Issue the backup command to enter interactive mode. -
         % backup
      -
      -

    5. Issue the backup volrestore command with the desired -arguments. -
         backup> volrestore <destination machine> <destination partition>  \ 
      -                      -volume <volume(s) to restore>+  \
      -                      [-extension <new volume name extension>]  \
      -                      [-date <date from which to restore>]  \
      -                      [-portoffset <TC port offsets>+] [-n]
      -
      -

      where -

      -

      volr -
      Is the shortest acceptable abbreviation of volrestore. -

      destination machine -
      Names the file server machine on which to restore each volume. It -does not have to be a volume's current site. -

      destination partition -
      Names the partition on which to restore each volume. It does not -have to be a volume's current site. -

      -volume -
      Names each volume to restore. It is best to provide the base -(read/write) name, for the reasons discussed in Making Restore Operations More Efficient. -

      -extension -
      Creates a new volume to house the restored data, with a name derived by -appending the specified string to each volume named by the -volume -extension. The Backup System preserves the contents of the existing -volume if it still exists. Do not use either of the -.readonly or .backup extensions, which are -reserved. The combination of base volume name and extension cannot -exceed 22 characters in length. If you want a period to separate the -extension from the name, specify it as the first character of the string (as -in .rst, for example). -

      -date -
      Specifies a date and optionally time; the restored volume includes -data from dumps performed before the date only. Provide a value in the -format mm/dd/yyyy -[hh:MM], where the required mm/dd/yyyy -portion indicates the month (mm), day (dd), and year -(yyyy), and the optional hh:MM portion indicates -the hour and minutes in 24-hour format (for example, the value -14:36 represents 2:36 p.m.). If -omitted, the time defaults to 59 seconds after midnight (00:00:59 -hours). -

      Valid values for the year range from 1970 to -2037; higher values are not valid because the latest possible -date in the standard UNIX representation is in February 2038. The -command interpreter automatically reduces any later date to the maximum -value. -
      Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
      -

      -portoffset -
      Specifies one or more port offset numbers, each corresponding to a Tape -Coordinator to use in the operation. If there is more than one value, -the Backup System uses the first one when restoring the full dump of each -volume, the second one when restoring the level 1 incremental dump of each -volume, and so on. It uses the final value in the list when restoring -dumps at the corresponding depth in the dump hierarchy and all dumps at lower -levels. -

      Provide this argument unless the default value of 0 (zero) is appropriate -for all dumps. If 0 is just one of the values in the list, provide it -explicitly in the appropriate order. -

      -n -
      Displays the list of tapes that contain the dumps required by the restore -operation, without actually performing the operation. -
      -

    6. If you did not include the -noautoquery flag when you issued -the butc command, or the device's -CFG_device_name configuration file includes the -instruction AUTOQUERY YES, then the Tape Coordinator prompts you to -place the tape in the device's drive. You have already done so, -but you must now press <Return> to indicate that the tape is -ready for labeling. -

      If more than one tape is required, you must either include the -MOUNT instruction in the CFG_device_name file -and stock the corresponding stacker or jukebox with tapes, or remain at the -console to respond to the Tape Coordinator's prompts for subsequent -tapes. -

    7. After the restore operation completes, review the Backup System's log -files to check for errors. Use the bos getlog command as -instructed in Displaying Server Process Log Files to read the /usr/afs/logs/BackupLog file, and a -text editor on the Tape Coordinator machine to read the -TE_device_name and TL_device_name -files in the local /usr/afs/backup directory. -
    -

    Using the backup diskrestore Command

    - - -

    The backup diskrestore command is most appropriate when you need -to restore all of the volumes on an AFS server partition, perhaps because a -hardware failure has corrupted or destroyed all of the data. The -command performs a full restore of all of the read/write volumes for which the -VLDB lists the specified partition as the current site, using the dumps of -either the read/write or backup version of each volume depending on which type -was dumped more recently. (You can restore any backup or read-only -volumes that resided on the partition by using the vos backup and -vos release commands after the backup diskrestore -operation is complete.) -

    By default, the Backup System restores the volumes to the site they -previously occupied. To move the partition contents to a different -site, use the -newserver and -newpartition arguments, -singly or in combination. -

    By default, the Backup System overwrites the contents of existing volumes -with the restored data. To create a new volume to house the restored -data instead, use the -extension argument. The Backup System -creates the new volume at the site designated by the -newserver and --newpartition arguments if they are used or the -server -and -partition arguments otherwise. It derives the volume -name by adding the extension to the read/write base name listed in the VLDB, -and creates a new VLDB entry. The command does not affect the existing -volume in any way. However, if a volume with the specified extension -also already exists, the command overwrites it. -

    If a partition seems damaged, be sure not to run the vos -syncserv command before the backup diskrestore -command. As noted, the Backup System restores volumes according to VLDB -site definitions. The vos syncserv command sometimes removes -a volume's VLDB entry when the corruption on the partition is so severe -that the Volume Server cannot confirm the volume's presence. - - -

    To restore a partition with the backup diskrestore command

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

      Repeat the command for each Tape Coordinator if you are using more than one -tape device. -

    3. If using a tape device, insert the tape. -

    4. Issue the backup command to enter interactive mode. -
         % backup
      -
      -

    5. Issue the backup diskrestore command with the desired -arguments. -
         backup> diskrestore <machine to restore> <partition to restore>  \
      -                       [-portoffset <TC port offset>+]  \
      -                       [-newserver <destination machine>]  \
      -                       [-newpartition <destination partition>]  \
      -                       [-extension <new volume name extension>] [-n]
      -
      -

      where -

      -

      di -
      Is the shortest acceptable abbreviation of diskrestore. -

      machine to restore -
      Names the file server machine that the VLDB lists as the site of the -volumes that need to be restored. -

      partition to restore -
      Names the partition that the VLDB lists as the site of the volumes that -need to be restored. -

      -portoffset -
      Specifies one or more port offset numbers, each corresponding to a Tape -Coordinator to use in the operation. If there is more than one value, -the Backup System uses the first one when restoring the full dump of each -volume, the second one when restoring the level 1 incremental dump of each -volume, and so on. It uses the final value in the list when restoring -dumps at the corresponding depth in the dump hierarchy and all dumps at lower -levels. -

      Provide this argument unless the default value of 0 (zero) is appropriate -for all dumps. If 0 is just one of the values in the list, provide it -explicitly in the appropriate order. -

      -newserver -
      Names an alternate file server machine to which to restore the -volumes. If you omit this argument, the volumes are restored to the -file server machine named by the -server argument. -

      -newpartition -
      Names an alternate partition to which to restore the data. If you -omit this argument, the volumes are restored to the partition named by the --partition argument. -

      -extension -
      Creates a new volume for each volume being restored, to house the restored -data, appending the specified string to the volume's read/write base name -as listed in the VLDB. Any string other than -.readonly or .backup is acceptable, but -the combination of the base name and extension cannot exceed 22 characters in -length. To use a period to separate the extension from the name, -specify it as the first character of the string (as in .rst, -for example). -

      -n -
      Displays a list of the tapes necessary to perform the requested restore, -without actually performing the operation. -
      -

    6. If you did not include the -noautoquery flag when you issued -the butc command, or the device's -CFG_device_name configuration file includes the -instruction AUTOQUERY YES, then the Tape Coordinator prompts you to -place the tape in the device's drive. You have already done so, -but you must now press <Return> to indicate that the tape is -ready for labeling. -

      If more than one tape is required, you must either include the -MOUNT instruction in the CFG_device_name file -and stock the corresponding stacker or jukebox with tapes, or remain at the -console to respond to the Tape Coordinator's prompts for subsequent -tapes. -

    7. After the restore operation completes, review the Backup System's log -files to check for errors. Use the bos getlog command as -instructed in Displaying Server Process Log Files to read the /usr/afs/logs/BackupLog file, and a -text editor on the Tape Coordinator machine to read the -TE_device_name and TL_device_name -files in the local /usr/afs/backup directory. -
    -

    Using the backup volsetrestore Command

    -

    The backup volsetrestore command is most -appropriate when you need to perform a full restore of several read/write -volumes, placing each at a specified site. You specify the volumes to -restore either by naming a volume set with the -name argument or by -listing each volume's name and restoration site in a file named by the --file argument, as described in the following sections. -

    Because the backup volsetrestore command enables you to restore -a large number of volumes with a single command, the restore operation can -potentially take hours to complete. One way to reduce the time is to -run multiple instances of the command simultaneously. Either use the --name argument to specify disjoint volume sets for each command, or -the -file argument to name files that list different -volumes. You must have several Tape Coordinators available to read the -required tapes. Depending on how the volumes to be restored were dumped -to tape, specifying disjoint volume sets can also reduce the number of tape -changes required. -

    Restoring a Volume Set with the -name Argument

    -

    Use the -name argument to restore a group of -volumes defined in a volume set. The Backup System creates a list of -the volumes in the VLDB that match the server, partition, and volume name -criteria defined in the volume set's volume entries, and for which dumps -are available. The volumes do not have to exist on the server partition -as long as the VLDB still lists them (this can happen when, for instance, a -hardware problem destroys the contents of an entire disk). -

    By default, the Backup System restores, as a read/write volume, each volume -that matches the volume set criteria to the site listed in the VLDB. If -a volume of the matching name exists at that site, its current contents are -overwritten. You can instead create a new volume to house the restored -data by including the -extension argument. The Backup System -creates the new volume at the existing volume's site, derives its name by -adding the extension to the existing volume's read/write base name, and -creates a new VLDB entry for it. The command does not affect the -existing volume in any way. However, if a volume with the specified -extension also already exists, the command overwrites it. To make the -contents of the new volume accessible, use the fs mkmount command -to mount it. You can then compare its contents to those of the existing -volume, to see which to retain permanently. -

    It is not required that the volume set was previously used to back up -volumes (was used as the -volumeset option to the backup -dump command). It can be defined especially to match the volumes -that need to be restored with this command, and that is usually the better -choice. Indeed, a temporary volume set, created by including -the -temporary flag to the backup addvolset command, can -be especially useful in this context (instructions appear in Defining and Displaying Volume Sets and Volume Entries). A temporary volume set is not added to the Backup -Database and exists only during the current interactive backup session, which -is suitable if the volume set is needed only to complete the single restore -operation initialized by this command. -

    The reason that a specially defined volume set is probably better is that -volume sets previously defined for use in dump operations usually match the -backup version of volumes, whereas for a restore operation it is best to -define volume entries that match the base (read/write) name. In this -case, the Backup System searches the Backup Database for the newest dump set -that includes a dump of either the read/write or the backup version of the -volume. If, in contrast, a volume entry explicitly matches the -volume's backup or read-only version, the Backup System uses dumps of -that volume version only, restoring them to a read/write volume by stripping -off the .backup or .readonly -extension. -

    If there are VLDB entries that match the volume set criteria, but for which -there are no dumps recorded in the Backup Database, the Backup System cannot -restore them. It generates an error message on the standard error -stream for each one. -

    Restoring Volumes Listed in a File with the -file Argument

    -

    Use the -file argument to specify the name and -site of each read/write volume to restore. Each volume's entry -must appear on its own (unbroken) line in the file, and comply with the -following format: -

       machine    partition   volume    [comments...]
    -
    -

    where -

    -

    machine -
    Names the file server machine to which to restore the volume. You -can move the volume as you restore it by naming a machine other than the -current site. -

    partition -
    Names the partition to which to restore the volume. You can move -the volume as you restore it by naming a partition other than the current -site. -

    volume -
    Names the volume to restore. Specify the base (read/write) name to -have the Backup System search the Backup Database for the newest dump set that -includes a dump of either the read/write or the backup version of the -volume. It restores the dumps of that version of the volume, starting -with the most recent full dump. If, in contrast, you include the -.backup or .readonly extension, the Backup -System restores dumps of that volume version only, but into a read/write -volume without the extension. The base name must match the name used in -Backup Database dump records rather than in the VLDB, if they differ, because -the Backup System does not consult the VLDB when you use the -file -argument. -

    comments... -
    Is any other text. The Backup System ignores any text on each line -that appears after the volume name, so you can use this field for helpful -notes. -
    -

    Do not use wildcards (for example, .*) in the -machine, partition, or volume fields. It is -acceptable for multiple lines in the file to name the same volume, but the -Backup System processes only the first of them. -

    By default, the Backup System replaces the existing version of each volume -with the restored data, placing the volume at the site specified in the -machine and partition fields. You can instead create -a new volume to house the restored contents by including the --extension argument. The Backup System creates a new volume -at the site named in the machine and partition fields, -derives its name by adding the specified extension to the read/write version -of the name in the volume field, and creates a new VLDB entry for -it. The command does not affect the existing volume in any way. -However, if a volume with the specified extension also already exists, the -command overwrites it. To make the contents of the new volume -accessible, use the fs mkmount command to mount it. You can -then compare its contents to those of the existing volume, to see which to -retain permanently. -

    If the file includes entries for volumes that have no dumps recorded in the -Backup Database, the Backup System cannot restore them. It generates an -error message on the standard error stream for each one. -

    One way to generate a file to use as input to the -file argument -is to issue the command with the -name and -n options -and direct the output to a file. The output includes a line like the -following for each volume (shown here on two lines only for legibility -reasons); the value comes from the source indicated in the following -list: -

       machine   partition   volume_dumped  # as   volume_restored;    \
    -         tape_name   (tape_ID);   pos   position_number;   date
    -
    -

    where -

    -

    machine -
    Names the file server machine that currently houses the volume, as listed -in the VLDB. -

    partition -
    Names the partition that currently houses the volume, as listed in the -VLDB. -

    volume_dumped -
    Specifies the version (read/write or backup) of the volume that was -dumped, as listed in the Backup Database. -

    volume_restored -
    Specifies the name under which the Backup System restores the volume when -the -n flag is not included. If you include the --extension argument with the -name and -n -options, then the extension appears on the name in this field (as in -user.pat.rst, for example). -

    tape_name -
    Names the tape containing the dump of the volume, from the Backup -Database. If the tape has a permanent name, it appears here; -otherwise, it is the AFS tape name. -

    tape_ID -
    The tape ID of the tape containing the dump of the volume, from the Backup -Database. -

    position_number -
    Specifies the dump's position on the tape (for example, 31 -indicates that 30 volume dumps precede the current one on the tape). If -the dump was written to a backup data file, this number is the ordinal of the -16 KB-offset at which the volume's data begins. -

    date -
    The date and time when the volume was dumped. -
    -

    To make the entries suitable for use with the -file argument, -edit them as indicated: -

      -

    • The Backup System uses only the first three fields on each line of the -input file, and so ignores all the fields after the number sign -(#). You can remove them if it makes it easier for you to -read the file, but that is not necessary. -

    • The volume_dumped (third) field of each line in the output file -becomes the volume field in the input file. The Backup System -restores data to read/write volumes only, so remove the -.backup or .readonly extension if it -appears on the name in the volume_dumped field. -

    • The output file includes a line for every dump operation in which a -specific volume was included (the full dump and any incremental dumps), but -the Backup System only processes the first line in the input file that -mentions a specific volume. You can remove the repeated lines if it -makes the file easier for you to read. -

    • The machine and partition fields on an output line -designate the volume's current site. To move the volume to another -location as you restore it, change the values. -
    - - -

    To restore a group of volumes with the backup volsetrestore command

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. If the Tape Coordinator for the tape device that is to perform the -operation is not already running, open a connection to the appropriate Tape -Coordinator machine and issue the butc command, for which complete -instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

      Repeat the command for each Tape Coordinator if you are using more than one -tape device. -

    3. If using a tape device, insert the tape. -

    4. Issue the backup command to enter interactive mode. -
         % backup
      -
      -

    5. (Optional) If appropriate, issue the (backup) -addvolset command to create a new volume set expressly for this restore -operation. Include the -temporary flag if you do not need to -add the volume set to the Backup Database. Then issue one or more -(backup) addvolentry commands to create volume entries that include -only the volumes to be restored. Complete instructions appear in Defining and Displaying Volume Sets and Volume Entries. -
         backup> addvolset <volume set name>  [-temporary]
      -   
      -   backup> addvolentry  -name <volume set name>  \
      -                        -server <machine name>  \
      -                        -partition <partition name>  \
      -                        -volumes <volume name (regular expression)>
      -
      -

    6. Issue the backup volsetrestore command with the desired -arguments. -
         backup> volsetrestore [-name <volume set name>]  \
      -                 [-file <file name>]  \
      -                 [-portoffset <TC port offset>+]  \
      -                 [-extension <new volume name extension>] [-n] 
      -
      -

      where -

      -

      -name -
      Names a volume set to restore. The Backup System restores all of -the volumes listed in the VLDB that match the volume set's volume -entries, as described in Restoring a Volume Set with the -name Argument. Provide this argument or the -file -argument, but not both. -

      -file -
      Specifies the full pathname of a file that lists one or more volumes and -the site (file server machine and partition) to which to restore each. -The input file has the format described in Restoring Volumes Listed in a File with the -file Argument. Use either this argument or the -name -argument, but not both. -

      -portoffset -
      Specifies one or more port offset numbers, each corresponding to a Tape -Coordinator to use in the operation. If there is more than one value, -the Backup System uses the first one when restoring the full dump of each -volume, the second one when restoring the level 1 incremental dump of each -volume, and so on. It uses the final value in the list when restoring -dumps at the corresponding depth in the dump hierarchy and all dumps at lower -levels. -

      Provide this argument unless the default value of 0 (zero) is appropriate -for all dumps. If 0 is just one of the values in the list, provide it -explicitly in the appropriate order. -

      -extension -
      Creates a new volume for each volume being restored, to house the restored -data, appending the specified string to the volume's read/write base name -as listed in the VLDB. Any string other than -.readonly or .backup is acceptable, but -the combination of the base name and extension cannot exceed 22 characters in -length. To use a period to separate the extension from the name, -specify it as the first character of the string (as in .rst, -for example). -

      -n -
      Displays a list of the volumes to be restored when the flag is not -included, without actually restoring them. The Output -section of this reference page details the format of the output. When -combined with the -name argument, its output is easily edited for -use as input to the -file argument on a subsequent backup -volsetrestore command. -
      -

    7. If you did not include the -noautoquery flag when you issued -the butc command, or the device's -CFG_device_name configuration file includes the -instruction AUTOQUERY YES, then the Tape Coordinator prompts you to -place the tape in the device's drive. You have already done so, -but you must now press <Return> to indicate that the tape is -ready for labeling. -

      If more than one tape is required, you must either include the -MOUNT instruction in the CFG_device_name file -and stock the corresponding stacker or jukebox with tapes, or remain at the -console to respond to the Tape Coordinator's prompts for subsequent -tapes. -

    8. After the restore operation completes, review the Backup System's log -files to check for errors. Use the bos getlog command as -instructed in Displaying Server Process Log Files to read the /usr/afs/logs/BackupLog file, and a -text editor on the Tape Coordinator machine to read the -TE_device_name and TL_device_name -files in the local /usr/afs/backup directory. -
    - -

    Maintaining the Backup Database

    -

    The Backup Database stores all of the configuration and -tracking information that the Backup System uses when dumping and restoring -data. If a hardware failure or other problem on a database server -machine corrupts or damages the database, it is relatively easy to recreate -the configuration information (the dump hierarchy and lists of volume sets and -Tape Coordinator port offset numbers). However, restoring the dump -tracking information (dump records) is more complicated and -time-consuming. To protect yourself against loss of data, back up the -Backup Database itself to tape on a regular schedule. -

    Another potential concern is that the Backup Database can grow large rather -quickly, because the Backup System keeps very detailed and cross-referenced -records of dump operations. Backup operations become less efficient if -the Backup Server has to navigate through a large number of obsolete records -to find the data it needs. To keep the database to a manageable size, -use the backup deletedump command to delete obsolete records, as -described in Removing Obsolete Records from the Backup Database. If you later find that you have removed records that -you still need, you can use the backup scantape command to read the -information from the dump and tape labels on the corresponding tapes back into -the database, as instructed in To scan the contents of a tape. - - - - - -

    Backing Up and Restoring the Backup Database

    -

    Because of the importance of the information in the Backup -Database, it is best to back it up to tape or other permanent media on a -regular basis. As for the other AFS, administrative databases, the -recommended method is to use a utility designed to back up a machine's -local disk, such as the UNIX tar command. For instructions, -see Backing Up and Restoring the Administrative Databases. -

    In the rare event that the Backup Database seems damaged or corrupted, you -can use the backup dbverify command to check its status. If -it is corrupted, use the backup savedb command to repair some types -of damage. Then use the backup restoredb to return the -corrected database to the local disks of the database server machines. -For instructions, see Checking for and Repairing Corruption in the Backup Database. -

    Checking for and Repairing Corruption in the Backup Database

    -

    In rare cases, the Backup Database can become damaged or -corrupted, perhaps because of disk or other hardware errors. Use the -backup dbverify command to check the integrity of the -database. If it is corrupted, the most efficient way to repair it is to -use the backup savedb command to copy the database to tape. -The command automatically repairs several types of corruption, and you can -then use the backup restoredb command to transfer the repaired copy -of the database back to the local disks of the database server -machines. -

    The backup savedb command also removes orphan blocks, -which are ranges of memory that the Backup Server preallocated in the database -but cannot use. Orphan blocks do not interfere with database access, -but do waste disk space. The backup dbverify command reports -the existence of orphan blocks if you include the -detail -flag. - - - -

    To verify the integrity of the Backup Database

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the backup dbverify command to check the integrity of the -Backup Database. -
         % backup dbverify [-detail]
      -
      -

      where -

      -

      db -
      Is the shortest acceptable abbreviation of dbverify. -

      -detail -
      Reports the existence of orphan blocks and other information about the -database, as described on the backup dbverify reference page in the -AFS Administration Reference. -
      -

      The output reports one of the following messages: -

        -

      • Database OK indicates that the Backup Database is -undamaged. -

      • Database not OK indicates that the Backup Database is -damaged. To recover from the problem, use the instructions in To repair corruption in the Backup Database. -
      -
    - - -

    To repair corruption in the Backup Database

    -
      -

    1. Log in as the local superuser root on each database server -machine in the cell. -

    2. If the Tape Coordinator for the tape device that is to -perform the operation is not already running, open a connection to the -appropriate Tape Coordinator machine and issue the butc command, -for which complete instructions appear in To start a Tape Coordinator process. -
         % butc [<port offset>] [-noautoquery]
      -
      -

    3. If writing to tape, place a tape in the appropriate device. -

    4. Working on one of the machines, issue the backup command to -enter interactive mode. -
         #  backup -localauth
      -
      -

      where -localauth constructs a server ticket from the local -/usr/afs/etc/KeyFile file. This flag enables you to issue a -privileged command while logged in as the local superuser root but -without AFS administrative tokens. -

    5. Verify that no backup operations are actively running. If -necessary, issue the (backup) status command as described in To check the status of a Tape Coordinator process. Repeat for each Tape Coordinator port offset in -turn. -
         backup> status -portoffset <TC port offset>
      -
      -

    6. Issue the (backup) savedb command to repair -corruption in the database as it is written to tape or a file. -
         backup> savedb [-portoffset <TC port offset>]
      -
      -

      where -

      -

      sa -
      Is the shortest acceptable abbreviation of savedb. -

      -portoffset -
      Specifies the port offset number of the Tape Coordinator handling the tape -or backup data file for this operation. You must provide this argument -unless the default value of 0 (zero) is appropriate. -
      -

    7. Exit interactive mode. -
         backup>  quit  
      -
      -

    8. On each machine in turn, issue the bos shutdown command to shut -down the Backup Server process. Include the -localauth flag -because you are logged in as the local superuser root, but do not necessarily -have administrative tokens. For complete command syntax, see To stop processes temporarily. -
         # /usr/afs/bin/bos shutdown <machine name> buserver  -localauth  -wait
      -
      -

    9. On each machine in turn, issue the following commands to remove the Backup -Database. -
         # cd /usr/afs/db
      -   # rm bdb.DB0
      -   # rm bdb.DBSYS1
      -
      -

    10. On each machine in turn, starting with the machine with the lowest IP -address, issue the bos start command to restart the Backup Server -process, which creates a zero-length copy of the Backup Database as it -starts. For complete command syntax, see To start processes by changing their status flags to Run. -
         # /usr/afs/bin/bos start <machine name> buserver  -localauth
      -
      -

    11. Working on one of the machines, issue the backup command to -enter interactive mode. -
         #  backup -localauth
      -
      -

      where -localauth constructs a server ticket from the local -/usr/afs/etc/KeyFile file. -

    12. Issue the (backup) addhost command to create an entry in the -new, empty database for the Tape Coordinator process handling the tape or file -from which you are reading the repaired copy of the database (presumably the -process you started in Step 2 and which performed the backup savedb operation -in Step 6). For complete syntax, see Step 8 in To configure a Tape Coordinator machine. -
         backup>  addhost <tape machine name> [<TC port offset>]
      -
      - - -

    13. Issue the (backup) restoredb command to copy the repaired -database to the database server machines. -
         backup> restoredb  [-portoffset <TC port offset>]
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restoredb. -

      -portoffset -
      Specifies the port offset number of the Tape Coordinator handling the tape -or backup data file for this operation. You must provide this argument -unless the default value of 0 (zero) is appropriate. -
      -

    14. (Optional) Exit interactive mode if you do not plan to issue -any additional backup commands. -
         backup> quit
      -
      -

    15. (Optional) If desired, enter Ctrl-d or another -interrupt signal to exit the root shell on each database server -machine. You can also issue the Ctrl-c signal on the Tape -Coordinator machine to stop the process. -
    - - -

    Removing Obsolete Records from the Backup Database

    -

    Whenever you recycle or relabel a tape using the backup -dump or backup labeltape command, the Backup System -automatically removes all of the dump records for the dumps contained on the -tape and all other tapes in the dump set. However, obsolete records can -still accumulate in the Backup Database over time. For example, when -you discard a backup tape after using it the maximum number of times -recommended by the manufacturer, the records for dumps on it remain in the -database. Similarly, the Backup System does not automatically remove a -dump's record when the dump reaches its expiration date, but only if you -then recycle or relabel the tape that contains the dump. Finally, if a -backup operation halts in the middle, the records for any volumes successfully -written to tape before the halt remain in the database. -

    A very large Backup Database can make backup operations less efficient -because the Backup Server has to navigate through a large number of records to -find the ones it needs. To remove obsolete records, use the backup -deletedump command. Either identify individual dumps by dump ID -number, or specify the removal of all dumps created during a certain time -period. Keep in mind that you cannot remove the record of an appended -dump except by removing the record of its initial dump, which removes the -records of all associated appended dumps. Removing records of a dump -makes it impossible to restore data from the corresponding tapes or from any -dump that refers to the deleted dump as its parent, directly or -indirectly. That is, restore operations must begin with the full dump -and continue with each incremental dump in order. If you have removed -the records for a specific dump, you cannot restore any data from later -incremental dumps. -

    Another way to truncate the Backup Database is to include the --archive argument to the backup savedb command. -After a copy of the database is written to tape or to a backup data file, the -Backup Server deletes the dump records for all dump operations with timestamps -prior to the date and time you specify. However, issuing the -backup deletedump command with only the -to argument is -equivalent in effect and is simpler because it does not require starting a -Tape Coordinator process as the backup savedb command does. -For further information on the -archive argument to the backup -savedb command, see the command's reference page in the AFS -Administration Reference. -

    If you later need to access deleted dump records, and the corresponding -tapes still exist, you can use the -dbadd argument to the -backup scantape command to scan their contents into the database, -as instructed in To scan the contents of a tape. - - -

    To delete dump records from the Backup Database

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. (Optional) Issue the backup command to enter -interactive mode, if you want to delete multiple records or issue additional -commands. The interactive prompt appears in the following step. -
         % backup
      -
      -

    3. (Optional) Issue the backup dumpinfo command to list -information from the Backup Database that can help you decide which records to -delete. For detailed instructions, see To display dump records. -
         backup> dumpinfo [<no. of dumps>]  [-id <dump id>]  [-verbose]
      -
      -

    4. Issue the backup deletedump command to delete one or more dump -sets. -
         backup> deletedump [-dumpid <dumpid>+] [-from <date time>]  \
      -                      [-to <date time>] 
      -
      -

      where -

      -

      dele -
      Is the shortest acceptable abbreviation of deletedump. -

      -dumpid -
      Specifies the dump ID of each initial dump to delete from the Backup -Database. The records for all associated appended dumps are also -deleted. Provide either this argument or the -to (and -optionally, -from) argument. -

      -from -
      Specifies the beginning of a range of dates; the record for any dump -created during the indicated period of time is deleted. -

      To omit all records before the time indicated with the -to -argument, omit this argument. Otherwise provide a value in the -following format -

      mm/dd/yyyy [hh:MM] -

      where the month (mm), day (dd), and year (yyyy) -are required. You can omit the hour and minutes -(hh:MM) to indicate the default of midnight -(00:00 hours). If you provide them, use 24-hour format (for -example, the value 14:36 represents 2:36 -p.m.). -

      You must provide the -to argument along with this one. -
      Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
      -

      -to -
      Specifies the end of a range of dates; the record of any dump created -during the range is deleted from the Backup Database. -

      To delete all records created after the date you specify with the --from argument, specify the value NOW. To delete -every dump record in the Backup Database, provide the value NOW and -omit the -from argument. Otherwise, provide a date value in -the same format as described for the -from argument. Valid -values for the year (yyyy) range from 1970 to -2037; higher values are not valid because the latest possible -date in the standard UNIX representation is in early 2038. The command -interpreter automatically reduces any later date to the maximum value in -2038. -

      If you omit the time portion (hh:MM), it defaults -to 59 seconds after midnight (00:00:59 hours). Similarly, -the backup command interpreter automatically adds 59 seconds to any -time value you provide. In both cases, adding 59 seconds compensates -for how the Backup Database and backup dumpinfo command represent -dump creation times in hours and minutes only. For example, the -Database records a creation timestamp of 20:55 for any dump -operation that begins between 20:55:00 and -20:55:59. Automatically adding 59 seconds to a time thus -includes the records for all dumps created during that minute. -

      Provide either this argument, or the -dumpid argument. -This argument is required if the -from argument is provided. -
      Note:A plus sign follows this argument in the command's syntax statement -because it accepts a multiword value which does not need to be enclosed in -double quotes or other delimiters, not because it accepts multiple -dates. Provide only one date (and optionally, time) definition. -
      -

      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd013.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd013.htm deleted file mode 100755 index 6eac2a693..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd013.htm +++ /dev/null @@ -1,1873 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Monitoring and Auditing AFS Performance

    - - - - - - - - -

    AFS comes with three main monitoring tools: -

      -

    • The scout program, which monitors and gathers statistics on -File Server performance. -

    • The fstrace command suite, which traces Cache Manager -operations in detail. -

    • The afsmonitor program, which monitors and gathers statistics -on both the File Server and the Cache Manager. -
    -

    AFS also provides a tool for auditing AFS events on file server machines -running AIX. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - -
    Initialize the scout program -scout -
    Display information about a trace log -fstrace lslog -
    Display information about an event set -fstrace lsset -
    Change the size of a trace log -fstrace setlog -
    Set the state of an event set -fstrace setset -
    Dump contents of a trace log -fstrace dump -
    Clear a trace log -fstrace clear -
    Initialize the afsmonitor program -afsmonitor -
    -


    Using the scout Program

    - -

    The scout program monitors the status of the File Server process -running on file server machines. It periodically collects statistics -from a specified set of File Server processes, displays them in a graphical -format, and alerts you if any of the statistics exceed a configurable -threshold. -

    More specifically, the scout program includes the following -features. -

      -

    • You can monitor, from a single location, the File Server process on any -number of server machines from the local and foreign cells. The number -is limited only by the size of the display window, which must be large enough -to display the statistics. -

    • You can set a threshold for many of the statistics. When the value -of a statistic exceeds the threshold, the scout program highlights -it (displays it in reverse video) to draw your attention to it. If the -value goes back under the threshold, the highlighting is deactivated. -You control the thresholds, so highlighting reflects what you consider to be a -noteworthy situation. See Highlighting Significant Statistics. -

    • The scout program alerts you to File Server process, machine, -and network outages by highlighting the name of each machine that does not -respond to its probe, enabling you to respond more quickly. -

    • You can set how often the scout program collects statistics -from the File Server processes. -
    -

    System Requirements

    - - - - - - - -

    The scout program runs on any AFS client machine that has access -to the curses graphics package, which most UNIX distributions -include as a standard utility. It can run on both dumb terminals and -under windowing systems that emulate terminals, but the output looks best on -machines that support reverse video and cursor addressing. For best -results, set the TERM environment variable to the correct terminal type, or -one with characteristics similar to the actual ones. For machines -running AIX, the recommended TERM setting is vt100, assuming the -terminal is similar to that. For other operating systems, the wider -range of acceptable values includes xterm, xterms, -vt100, vt200, and wyse85. - -

    No privilege is required to run the scout program, so any user -who can access the directory where its binary resides (the -/usr/afsws/bin directory in the conventional configuration) can use -it. The program's probes for collecting statistics do not impose a -significant burden on the File Server process, but you can restrict its use by -placing the binary file in a directory with a more restrictive access control -list (ACL). -

    Multiple instances of the scout program can run on a single -client machine, each over its own dedicated connection (in its own -window). It must run in the foreground, so the window in which it runs -does not accept further input except for an interrupt signal. -

    You can also run the scout program on several machines and view -its output on a single machine, by opening telnet connections to the other -machines from the central one and initializing the program in each remote -window. In this case, you can include the -host flag to the -scout command to make the name of each remote machine appear in the -banner line at the top of the window displaying its output. -See The Banner Line. -

    Using the -basename argument to Specify a Domain Name

    - - -

    As previously mentioned, the scout program can monitor the File -Server process on any number of file server machines. If all of the -machines belong to the same cell, then their hostnames probably all have the -same domain name suffix, such as abc.com in the ABC -Corporation cell. In this case, you can use the -basename -argument to the scout command, which has several advantages: -

      -

    • You can omit the domain name suffix as you enter each file server -machine's name on the command line. The scout program -automatically appends the domain name to each machine's name, resulting -in a fully-qualified hostname. You can omit the domain name suffix even -when you don't include the -basename argument, but in that -case correct resolution of the name depends on the state of your cell's -naming service at the time of connection. -

    • The machine names are more likely to fit in the appropriate column of the -display without having to be truncated (for more on truncating names in the -display column, see The Statistics Display Region). -

    • The domain name appears in the banner line at the top of the display -window to indicate the name of the cell you are monitoring. -
    -

    The Layout of the scout Display

    - - -

    The scout program can display statistics either in a dedicated -window or on a plain screen if a windowing environment is not -available. For best results, use a window or screen that can print in -reverse video and do cursor addressing. -

    The scout program screen has three main regions: the -banner line, the statistics display region and the -probe/message line. This section describes their contents, -and graphic examples appear in Example Commands and Displays. -

    The Banner Line

    - - -

    By default, the string scout appears in the banner line at the -top of the window or screen, to indicate that the scout program is -running. You can display two additional types of information by include -the appropriate option on the command line: -

      -

    • Include the -host flag to display the local machine's name -in the banner line. This is particularly useful when you are running -the scout program on several machines but displaying the results on -a single machine. -

      For example, the following banner line appears when you run the -scout program on the machine -client1.abc.com and use the-host -flag: -

         [client1.abc.com] scout
      -
      -

    • Include the -basename argument to display the specified cell -domain name in the banner line. For further discussion, see Using the -basename argument to Specify a Domain Name. -

      For example, if you specify a value of abc.com for the --basename argument, the banner line reads: -

         scout for abc.com
      -
      -
    -

    The Statistics Display Region

    - - -

    The statistics display region occupies most of the window and is divided -into six columns. The following list describes them as they appear from -left to right in the window. -

    -

    Conn - -
    Displays the number of RPC connections open between the File Server -process and client machines. This number normally equals or exceeds the -number in the fourth Ws column. It can exceed the number in -that column because each user on the machine can have more than one connection -open at once, and one client machine can handle several users. -

    Fetch - -
    Displays the number of fetch-type RPCs (fetch data, fetch access list, and -fetch status) that the File Server process has received from client machines -since it started. It resets to zero when the File Server process -restarts. -

    Store - -
    Displays the number of store-type RPCs (store data, store access list, and -store status) that the File Server process has received from client machines -since it started. It resets to zero when the File Server process -restarts. -

    Ws - - - -
    Displays the number of client machines (workstations) that have -communicated with the File Server process within the last 15 minutes (such -machines are termed active). This number is likely to be -smaller than the number in the Conn) column because a single client -machine can have several connections open to one File Server process. -

    [Unlabeled column] -
    Displays the name of the file server machine on which the File Server -process is running. It is 12 characters wide. Longer names are -truncated and an asterisk (*) appears as the last character in the -name. If all machines have the same domain name suffix, you can use the --basename argument to decrease the need for truncation; see Using the -basename argument to Specify a Domain Name. -

    Disk attn - - - - -
    Displays the number of kilobyte blocks available on up to 26 of the file -server machine's AFS server (/vicep) partitions. The -display for each partition has the following format: -
       partition_letter:free_blocks
    -
    -

    -

    For example, a:8949 indicates that partition -/vicepa has 8,949 KB free. If the window is not wide enough -for all partition entries to appear on a single line, the scout -program automatically stacks the partition entries into subcolumns within the -sixth column. -

    The label on the Disk attn column indicates the threshold value -at which entries in the column become highlighted. By default, the -scout program highlights a partition that is over 95% full, in -which case the label is as follows: -

       Disk attn: > 95% used
    -
    -

    -

    For more on this threshold and its effect on highlighting, see Highlighting Significant Statistics. -

    -

    For all columns except the fifth (file server machine name), you can use -the -attention argument to set a threshold value above which the -scout program highlights the statistic. By default, only -values in the fifth and sixth columns ever become highlighted. For -instructions on using the -attention argument, see Highlighting Significant Statistics. -

    The Probe Reporting Line

    - - -

    The bottom line of the display indicates how many times the -scout program has probed the File Server processes for -statistics. The statistics gathered in the latest probe appear in the -statistics display region. By default, the scout program -probes the File Servers every 60 seconds, but you can use the --frequency argument to specify a different probe frequency. -

    Highlighting Significant Statistics

    - - - - -

    To draw your attention to a statistic that currently exceed a threshold -value, the scout program displays it in reverse video (highlights -it). You can set the threshold value for most statistics, and so -determine which values are worthy of special attention and which are -normal. -

    Highlighting Server Outages

    - - - - - -

    The only column in which you cannot control highlighting is the fifth, -which identifies the file server machine for which statistics are displayed in -the other columns. The scout program uses highlighting in -this column to indicate that the File Server process on a machine fails to -respond to its probe, and automatically blanks out the other columns. -Failure to respond to the probe can indicate a File Server process, file -server machine, or network outage, so the highlighting draws your attention to -a situation that is probably interrupting service to users. -

    When the File Server process once again responds to the probes, its name -appears normally and statistics reappear in the other columns. If all -machine names become highlighted at once, a possible network outage has -disrupted the connection between the file server machines and the client -machine running the scout program. -

    Highlighting for Extreme Statistic Values

    -

    To set the threshold value for one or more of the five -statistics-displaying columns, use the -attention argument. -The threshold value applies to all File Server processes you are monitoring -(you cannot set different thresholds for different machines). For -details, see the syntax description in To start the scout program. -

    It is not possible to change the threshold values for a running -scout program. Stop the current program and start a new -one. Also, the scout program does not retain threshold -values across restarts, so you must specify all thresholds every time you -start the program. -

    Resizing the scout Display

    - - - -

    Do not resize the display window while the scout program is -running. Increasing the size does no harm, but the scout -program does not necessarily adjust to the new dimensions. Decreasing -the display's width can disturb column alignment, making the display -harder to read. With any type of resizing, the scout program -does not adjust the display in any way until it displays the results of the -next probe. -

    To resize the display effectively, stop the scout program, -resize the window and then restart the program. Even in this case, the -scout program's response depends on the accuracy of the -information it receives from the display environment. Testing during -development has shown that the display environment does not reliably provide -information about window resizing. If you use the X windowing system, -issuing the following sequence of commands before starting the -scout program (or placing them in the shell initialization file) -sometimes makes it adjust properly to resizing. -

       % set noglob
    -   % eval '/usr/bin/X11/resize' 
    -   % unset noglob
    -
    - - - - - -

    To start the scout program

    -
      -

    1. Open a dedicated command shell. If necessary, adjust it to the -appropriate size. -

    2. Issue the scout command to start the program. -
         % scout  [initcmd]  -server <FileServer name(s) to monitor>+  \
      -            [-basename <base server name>]  \
      -            [-frequency <poll frequency, in seconds>] [-host]  \
      -            [-attention <specify attention (highlighting) level>+]  \
      -            [-debug <turn debugging output on to the named file>]
      -
      -

      where -

      -

      initcmd -
      Is an optional string that accommodates the command's use of the AFS -command parser. It can be omitted and ignored. -

      -server -
      Identifies each File Server process to monitor, by naming the file server -machine it is running on. Provide fully-qualified hostnames unless the --basename argument is used. In that case, specify only the -initial part of each machine name, omitting the domain name suffix common to -all the machine names. -

      -basename -
      Specifies the domain name suffix common to all of the file server machines -named by the -server argument. For discussion of this -argument's effects, see Using the -basename argument to Specify a Domain Name. -

      Do not include the period that separates the domain suffix from the initial -part of the machine name, but do include any periods that occur within the -suffix itself. (For example, in the ABC Corporation cell, the proper -value is abc.com, not -.abc.com.) -

      -frequency -
      Sets the frequency, in seconds, of the scout program's -probes to File Server processes. Specify an integer greater than 0 -(zero). The default is 60 seconds. -

      -host -
      Displays the name of the machine that is running the scout -program in the display window's banner line. By default, no -machine name is displayed. -

      -attention -
      Defines the threshold value at which to highlight one or more -statistics. You can provide the pairs of statistic and threshold in any -order, separating each pair and the parts of each pair with one or more -spaces. The following list defines the syntax for each -statistic. - - - -
      -

      conn connections -
      Highlights the value in the Conn (first) column when the number -of connections that the File Server has open to client machines exceeds the -connections value. The highlighting deactivates when the value -goes back below the threshold. There is no default threshold. -

      fetch fetch_RPCs -
      Highlights the value in the Fetch (second) column when the -number of fetch RPCs that clients have made to the File Server process exceeds -the fetch_RPCs value. The highlighting deactivates only when -the File Server process restarts, at which time the value returns to -zero. There is no default threshold. -

      store store_RPCs -
      Highlights the value in the Store (third) column when the -number of store RPCs that clients have made to the File Server process exceeds -the store_RPCs value. The highlighting deactivates only when -the File Server process restarts, at which time the value returns to -zero. There is no default threshold. -

      ws active_clients -
      Highlights the value in the Ws (fourth) column when the number -of active client machines (those that have contacted the File Server in the -last 15 minutes) exceeds the active_clients value. The -highlighting deactivates when the value goes back below the threshold. -There is no default threshold. -

      disk percent_full % or disk min_blocks -
      Highlights the value for a partition in the Disk attn (sixth) -column when either the amount of disk space used exceeds the percentage -indicated by thepercent_full value, or the number of free KB blocks -is less than the min_blocks value. The highlighting -deactivates when the value goes back below the percent_full threshold -or above the min_blocks threshold. -

      The value you specify appears in the header of the sixth column following -the string Disk attn. The default threshold is 95% -full. -

      Acceptable values for percent_full are the integers from the range -0 (zero) to 99, and you must include the percent sign to -distinguish this statistic from a min_blocks value.. -

      -

      The following example sets the threshold for the Conn column to -100, for the Ws column to 50, and for the Disk attn -column to 75%. There is no threshold for the Fetch and -Store columns. -

      -attention conn 100 ws 50 disk 75% -

      The following example has the same affect as the previous one except that -it sets the threshold for the Disk attn column to 5000 free KB -blocks: -

      -attention disk 5000 ws 50 conn 100 -

      -debug -
      Enables debugging output and directs it into the specified file. -Partial pathnames are interpreted relative to the current working -directory. By default, no debugging output is produced. -
      -
    -

    To stop the scout program

    - -
      -

    1. Enter Ctrl-c in the display window. This is the proper -interrupt signal even if the general interrupt signal in your environment is -different. -
    -

    Example Commands and Displays

    - - -

    This section presents examples of the scout program, combining -different arguments and illustrating the screen displays that result. -

    In the first example, an administrator in the ABC Corporation issues the -scout command without providing any optional arguments or -flags. She includes the -server argument because she is -providing multiple machine names. She chooses to specify on the initial -part of each machine's name even though she has not used the --basename argument, relying on the cell's name service to -obtain the fully-qualified name that the scout program requires for -establishing a connection. -

       % scout -server fs1 fs2 
    -
    -

    Figure 2 depicts the resulting display. Notice first that the -machine names in the fifth (unlabeled) column appear in the format the -administrator used on the command line. Now consider the second line in -the display region, where the machine name fs2 appears in the fifth -column. The Conn and Ws columns together show -that machine fs2 has 144 RPC connections open to 44 client -machines, demonstrating that multiple connections per client machine are -possible. The Fetch column shows that client machines have -made 2,734,278 fetch RPCs to machine fs2 since the File Server -process last started and the Store column shows that they have made -34,066 store RPCs. -

    Six partition entries appear in the Disk attn column, marked -a through f (for /vicepa through -/vicepf). They appear on three lines in two subcolumns -because of the width of the window; if the window is wider, there are -more subcolumns. Four of the partition entries (a, -c, d, and e) appear in reverse video to -indicate that they are more than 95% full (the threshold value that appears in -the Disk attn header). -

    Figure 2. First example scout display
    -

    -
    First example scout display

    -
    -

    In the second example, the administrator uses more of the scout -program's optional arguments. -

      -

    • She provides the machine names in the same form as in Example 1, but this -time she also uses the -basename argument to specify their domain -name suffix, abc.com. This implies that the -scout program does not need the name service to expand the names to -fully-qualified hostnames, but the name service still converts the hostnames -to IP addresses. -

    • She uses the -host flag to display in the banner line the name -of the client machine where the scout program is running. -

    • She uses the -frequency argument to changes the probing -frequency from its default of once per minute to once every five -seconds. -

    • She uses the -attention argument to changes the highlighting -threshold for partitions to a 5000 KB minimum rather than the default of 95% -full. -
    -
       % scout -server fs1 fs2 -basename abc.com -host -frequency 5 -attention disk 5000 
    -
    -

    The use of optional arguments results in several differences between Figure 3 and Figure 2. First, because the -host -flag is included, the banner line displays the name of the machine running the -scout process as [client52] along with the basename -abc.com specified with the -basename -argument. -

    Another difference is that two rather than four of machine -fs2's partitions appear in reverse video, even though their -values are almost the same as in Figure 2. This is because the administrator changed the -highlight threshold to a 5000 block minimum, as also reflected in the -Disk attn column's header. And while machine -fs2's partitions /vicepa and /vicepd are -still 95% full, they have more than 5000 free blocks left; partitions -/vicepc and /vicepe are highlighted because they have -fewer than 5000 blocks free. -

    Note also the result of changing the probe frequency, reflected in the -probe reporting line at the bottom left corner of the display. Both -this example and the previous one represent a time lapse of one minute after -the administrator issues the scout command. In this example, -however, the scout program has probed the File Server processes 12 -times as opposed to once -

    Figure 3. Second example scout display
    -

    -
    Second example scout display

    -
    -

    In Figure 4, an administrator in the State University cell monitors -three of that cell's file server machines. He uses the --basename argument to specify the stateu.edu -domain name. -

       % scout -server server2 server3 server4 -basename stateu.edu 
    -
    -

    Figure 4. Third example scout display
    -

    -
    Third example scout display

    -
    -

    Figure 5 illustrates three of the scout program's -features. First, you can monitor file server machines from different -cells in a single display: fs1.abc.com, -server3.stateu.edu, and -sv7.def.com. Because the machines belong to -different cells, it is not possible to provide the -basename -argument. -

    Second, it illustrates how the display must truncate machine names that do -not fit in the fifth column, using an asterisk at the end of the name to show -that it is shortened. -

    Third, it illustrates what happens when the scout process cannot -reach a File Server process, in this case the one on the machine -sv7.def.com: it highlights the machine name and -blanks out the values in the other columns. -

    Figure 5. Fourth example scout display
    -

    -
    Fourth example scout display

    -
    -


    Using the fstrace Command Suite

    -

    This section describes the fstrace commands that -system administrators employ to trace Cache Manager activity for debugging -purposes. It assumes the reader is familiar with the Cache Manager -concepts described in Administering Client Machines and the Cache Manager. -

    The fstrace command suite monitors the internal activity of the -Cache Manager and enables you to record, or trace, its operations in -detail. The operations, which are termed events, comprise -the cm event set. Examples of cm -events are fetching files and looking up information for a listing of files -and subdirectories using the UNIX ls command. -

    Following are the fstrace commands and their respective -functions: -

      -

    • The fstrace apropos command provides a short description of -commands. -

    • The fstrace clear command clears the trace log. -

    • The fstrace dump command dumps the contents of the trace -log. -

    • The fstrace help command provides a description and syntax for -commands. -

    • The fstrace lslog command lists information about the trace -log. -

    • The fstrace lsset command lists information about the event -set. -

    • The fstrace setlog command changes the size of the trace -log. -

    • The fstrace setset command sets the state of the event -set. -
    -

    About the fstrace Command Suite

    -

    The fstrace command suite replaces and greatly -expands the functionality formerly provided by the fs debug -command. Its intended use is to aid in diagnosis of specific Cache -Manager problems, such as client machine hangs, cache consistency problems, -clock synchronization errors, and failures to access a volume or AFS -file. Therefore, it is best not to keep fstrace logging -enabled at all times, unlike the logging for AFS server processes. -

    Most of the messages in the trace log correspond to low-level Cache Manager -operations. It is likely that only personnel familiar with the AFS -source code can interpret them. If you have an AFS source license, you -can attempt to interpret the trace yourself, or work with the AFS Product -Support group to resolve the underlying problems. If you do not have an -AFS source license, it is probably more efficient to contact the AFS Product -Support group immediately in case of problems. They can instruct you to -activate fstrace tracing if appropriate. -

    The log can grow in size very quickly; this can use valuable disk -space if you are writing to a file in the local file space. -Additionally, if the size of the log becomes too large, it can become -difficult to parse the results for pertinent information. - - -

    When AFS tracing is enabled, each time a cm event occurs, a -message is written to the trace log, cmfx. To diagnose a -problem, read the output of the trace log and analyze the operations executed -by the Cache Manager. The default size of the trace log is 60 KB, but -you can increase or decrease it. - - -

    To use the fstrace command suite, you must first enable tracing -and reserve, or allocate, space for the trace log with the fstrace -setset command. With this command, you can set the cm -event set to one of three states to enable or disable tracing for the event -set and to allocate or deallocate space for the trace log in the kernel: - - - -

    -

    active -
    Enables tracing for the event set and allocates space for the trace -log. -

    inactive -
    Temporarily disables tracing for the event set; however, the event -set continues to allocate space occupied by the log to which it sends -data. -

    dormant -
    Disables tracing for the event set; furthermore, the event set -releases the space occupied by the log to which it sends data. When the -cm event set that sends data to the cmfx trace log is in -this state, the space allocated for that log is freed or deallocated. -
    - - - -

    Both event sets and trace logs can be designated as persistent, -which prevents accidental resetting of an event set's state or clearing -of a trace log. The designation is made as the kernel is compiled and -cannot be changed. -

    If an event set such as cm is persistent, you can change its -state only by including the -set argument to the fstrace -setset command. (That is, you cannot change its state along with -the state of all other event sets by issuing the fstrace setset -command with no arguments.) Similarly, if a trace log such as -cmfx is persistent, you can clear it only by including either the --set or -log argument to the fstrace clear -command (you cannot clear it along with all other trace logs by issuing the -fstrace clear command with no arguments.) -

    When a problem occurs, set the cm event set to active using the -fstrace setset command. When tracing is enabled on a busy -AFS client, the volume of events being recorded is significant; -therefore, when you are diagnosing problems, restrict AFS activity as much as -possible to minimize the amount of extraneous tracing in the log. -Because tracing can have a negative impact on system performance, leave -cm tracing in the dormant state when you are not diagnosing -problems. -

    If a problem is reproducible, clear the cmfx trace log with the -fstrace clear command and reproduce the problem. If the -problem is not easily reproduced, keep the state of the event set active until -the problem recurs. -

    To view the contents of the trace log and analyze the cm events, -use the fstrace dump command to copy the content lines of the trace -log to standard output (stdout) or to a file. -
    Note:If a particular command or process is causing problems, determine its process -id (PID). Search the output of the fstrace dump command for -the PID to find only those lines associated with the problem. -
    -

    Requirements for Using the fstrace Command Suite

    - - -

    Except for the fstrace help and fstrace apropos -commands, which require no privilege, issuing the fstrace commands -requires that the issuer be logged in as the local superuser root -on the local client machine. Before issuing an fstrace -command, verify that you have the necessary privilege. -

    The Cache Manager catalog must be in place so that logging can -occur. The fstrace command suite uses the standard UNIX -catalog utilities. The default location is -/usr/vice/etc/C/afszcm.cat. It can be placed in -another directory by placing the file elsewhere and using the proper NLSPATH -and LANG environment variables. -

    Using fstrace Commands Effectively

    -

    To use fstrace commands most effectively, configure them as -indicated: -

      -

    • Store the fstrace binary in a local disk directory. -

    • When you dump the fstrace log to a file, direct it to one on -the local disk. -

    • The trace can grow large in just a few minutes. Before attempting -to dump the log to a local file, verify that you have enough room. Be -particularly careful if you are using disk quotas on partitions in the local -file system. -

    • Attempt to limit Cache Manager activity on the AFS client machine other -than the problem operation. This reduces the amount of extraneous data -in the trace. -

    • Activate the fstrace log for the shortest possibly period of -time. If possible activate the trace immediately before performing the -problem operation, deactivate it as soon as the operation completes, and dump -the trace log to a file immediately. -

    • If possible, obtain UNIX process ID (PID) of the command or program that -initiates the problematic operation. This enables the person analyzing -the trace log to search it for messages associated with the PID. -
    -

    Activating the Trace Log

    -

    To start Cache Manager tracing on an AFS client machine, you -must first configure -

      -

    • The cmfx kernel trace log using the fstrace setlog -command -

    • The cm event set using the fstrace setset command -
    -

    The fstrace setlog command sets the size of the cmfx -kernel trace log in kilobytes. The trace log occupies 60 kilobytes of -kernel by default. If the trace log already exists, it is cleared when -this command is issued and a new log of the given size is created. -Otherwise, a new log of the desired size is created. -

    The fstrace setset command sets the state of the cm -kernel event set. The state of the cm event set determines -whether information on the events in that event set is logged. -

    After establishing kernel tracing on the AFS client machine, you can check -the state of the event set and the size of the kernel buffer allocated for the -trace log. To display information about the state of the cm -event set, issue the fstrace lsset command. To display -information about the cmfx trace log, use the fstrace -lslog command. See the instructions in Displaying the State of a Trace Log or Event Set. - - - - -

    To configure the trace log

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fstrace setlog command to set the size of the -cmfx kernel trace log. -
         # fstrace setlog  [-log <log_name>+]  -buffersize <1-kilobyte_units>
      -
      -
    -

    The following example sets the size of the cmfx trace log to 80 -KB. -

       # fstrace setlog cmfx 80 
    -
    - - - - -

    To set the event set

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fstrace setset command to set the state of event -sets. -
         % fstrace setset [-set <set_name>+] [-active] [-inactive]  \
      -                    [-dormant] 
      -
      -
    -

    The following example activates the cm event set. -

       # fstrace setset cm -active
    -
    -

    Displaying the State of a Trace Log or Event Set

    -

    An event set must be in the active state to be -included in the trace log. To display an event set's state, use -the fstrace lsset command. To set its state, issue the -fstrace setset command as described in To set the event set. -

    To display size and allocation information for the trace log, issue the -fstrace lslogcommand with the -long argument. - - - - -

    To display the state of an event set

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fstrace lsset command to display the available event -set and its state. -
         # fstrace lsset  [-set <set_name>+]
      -
      -
    -

    The following example displays the event set and its state on the local -machine. -

       # fstrace lsset cm
    -   Available sets:
    -   cm active
    -
    -

    The output from this command lists the event set and its states. The -three event states for the cm event set are: -

    -

    active -
    Tracing is enabled. -

    inactive -
    Tracing is disabled, but space is still allocated for the corresponding -trace log (cmfx). -

    dormant -
    Tracing is disabled, and space is no longer allocated for the -corresponding trace log (cmfx).Disables tracing for the -event set. -
    - - - - -

    To display the log size

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fstrace lslog command to display information about -the kernel trace log. -
         # fstrace lslog  [-set <set_name>+]  [-log <log_name>]  [-long] 
      -
      -
    -

    The following example uses the -long flag to display additional -information about the cmfx trace log. -

       # fstrace lslog cmfx -long
    -   Available logs:
    -   cmfx : 60 kbytes (allocated)
    -
    -

    The output from this command lists information on the trace log. -When issued without the -long flag, the fstrace lslog -command lists only the name of the log. When issued with the --long flag, the fstrace lslog command lists the log, the -size of the log in kilobytes, and the allocation state of the log. -

    There are two allocation states for the kernel trace log: -

    -

    allocated -
    Space is reserved for the log in the kernel. This indicates that -the event set that writes to this log is either active (tracing is -enabled for the event set) or inactive (tracing is temporarily -disabled for the event set); however, the event set continues to reserve -space occupied by the log to which it sends data. -

    unallocated -
    Space is not reserved for the log in the kernel. This indicates -that the event set that writes to this log is dormant (tracing is -disabled for the event set); furthermore, the event set releases the -space occupied by the log to which it sends data. -
    -

    Dumping and Clearing the Trace Log

    -

    After the Cache Manager operation you want to trace is -complete, use the fstrace dump command to dump the trace log to the -standard output stream or to the file named by the -file -argument. Or, to dump the trace log continuously, use the --follow argument (combine it with the -file argument if -desired). To halt continuous dumping, press an interrupt signal such as -<Ctrl-c>. -

    To clear a trace log when you no longer need the data in it, issue the -fstrace clear command. (The fstrace setlog -command also clears an existing trace log automatically when you use it to -change the log's size.) - - - - - -

    To dump the contents of a trace log

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fstrace dump command to dump trace logs. -
         # fstrace dump [-set <set_name>+]  [-follow <log_name>]  \
      -                  [-file <output_filename>]  \
      -                  [-sleep <seconds_between_reads>]
      -
      -
    -

    At the beginning of the output of each dump is a header specifying the date -and time at which the dump began. The number of logs being dumped is -also displayed if the -follow argument is not specified. The -header appears as follows: -

       AFS Trace Dump --
    -   Date: date time
    -   Found n logs.
    -
    -

    where date is the starting date of the trace log dump, -time is the starting time of the trace log dump, and n -specifies the number of logs found by the fstrace dump -command. -

    The following is an example of trace log dump header: -

       AFS Trace Dump --
    -   Date: Fri Apr 16 10:44:38 1999
    -   Found 1 logs.
    -
    -

    The contents of the log follow the header and are comprised of messages -written to the log from an active event set. The messages written to -the log contain the following three components: -

      -

    • The timestamp associated with the message (number of seconds from an -arbitrary start point) -

    • The process ID or thread ID associated with the message -

    • The message itself -
    -

    A trace log message is formatted as follows: -

       time timestamp, pid pid:event message
    -
    -

    where timestamp is the number of seconds from an arbitrary start -point, pid is the process ID number of the Cache Manager event, and -event message is the Cache Manager event which corresponds with a -function in the AFS source code. -

    The following is an example of a dumped trace log message: -

       time 749.641274, pid 3002:Returning code 2 from 19
    -
    -

    For the messages in the trace log to be most readable, the Cache Manager -catalog file needs to be installed on the local disk of the client -machine; the conventional location is -/usr/vice/etc/C/afszcm.cat. Log messages that begin -with the string raw op, like the following, indicate that the -catalog is not installed. -

       raw op 232c, time 511.916288, pid 0
    -   p0:Fri Apr 16 10:36:31 1999
    -
    -

    Every 1024 seconds, a current time message is written to each log. -This message has the following format: -

       time timestamp, pid pid: Current time: unix_time
    -
    -

    where timestamp is the number of seconds from an arbitrary start -point, pid is the process ID number, and unix_time is the -standard time format since January 1, 1970. -

    The current time message can be used to determine the actual time -associated with each log message. Determine the actual time as -follows: -

      -

    1. Locate the log message whose actual time you want to determine. -

    2. Search backward through the dump record until you come to a current time -message. -

    3. If the current time message's timestamp is smaller than -the log message's timestamp, subtract the former from the -latter. If the current time message's timestamp is -larger than the log message's timestamp, add 1024 to the -latter and subtract the former from the result. -

    4. Add the resulting number to the current time message's -unix_time to determine the log message's actual time. -
    -

    Because log data is stored in a finite, circular buffer, some of the data -can be overwritten before being read. If this happens, the following -message appears at the appropriate place in the dump: -

       Log wrapped; data missing.
    -
    -
    Note:If this message appears in the middle of a dump, which can happen under a -heavy work load, it indicates that not all of the log data is being written to -the log or some data is being overwritten. Increasing the size of the -log with the fstrace setlog command can alleviate this -problem. -
    - - - - - -

    To clear the contents of a trace log

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fstrace clear command to clear logs by log name or by -event set. -
         # fstrace clear  [-set <set_name>+]  [-log <log_name>+]
      -
      -
    -

    The following example clears the cmfx log used by the -cm event set on the local machine. -

       # fstrace clear cm
    -
    -

    The following example also clears the cmfx log on the local -machine. -

       # fstrace clear cmfx
    -
    - -

    Examples of fstrace Commands

    -

    This section contains an extensive example of the use of the -fstrace command suite, which is useful for gathering a detailed -trace of Cache Manager activity when you are working with AFS Product Support -to diagnose a problem. The Product Support representative can guide you -in choosing appropriate parameter settings for the trace. -

    Before starting the kernel trace log, try to isolate the Cache Manager on -the AFS client machine that is experiencing the problem accessing the -file. If necessary, instruct users to move to another machine so as to -minimize the Cache Manager activity on this machine. To minimize the -amount of unrelated AFS activity recorded in the trace log, place both the -fstrace binary and the dump file must reside on the local disk, not -in AFS. You must be logged in as the local superuser root to -issue fstrace commands. -

    Before starting a kernel trace, issue the fstrace lsset command -to check the state of the cm event set. -

       # fstrace lsset cm
    -
    -

    If tracing has not been enabled previously or if tracing has been turned -off on the client machine, the following output is displayed: -

       Available sets:
    -   cm inactive
    -
    -

    If tracing has been turned off and kernel memory is not allocated for the -trace log on the client machine, the following output is displayed: -

       Available sets:
    -   cm inactive (dormant)
    -
    -

    If the current state of the cm event set is inactive -or inactive (dormant), turn on kernel tracing by issuing the -fstrace setset command with the -active flag. -

       # fstrace setset cm -active
    -
    -

    If tracing is enabled currently on the client machine, the following output -is displayed: -

       Available sets:
    -   cm active
    -
    -

    If tracing is enabled currently, you do not need to use the fstrace -setset command. Do issue the fstrace clear command to -clear the contents of any existing trace log, removing prior traces that are -not related to the current problem. -

       # fstrace clear cm
    -
    -

    After checking on the state of the event set, issue the fstrace -lslog command with the -long flag to check the current state -and size of the kernel trace log . -

       # fstrace lslog cmfx -long
    -
    -

    If tracing has not been enabled previously or the cm event set -was set to active or inactive previously, output similar -to the following is displayed: -

       Available logs:
    -   cmfx : 60 kbytes (allocated)
    -
    -

    The fstrace tracing utility allocates 60 kilobytes of memory to -the trace log by default. You can increase or decrease the amount of -memory allocated to the kernel trace log by setting it with the fstrace -setlog command. The number specified with the --buffersize argument represents the number of kilobytes allocated -to the kernel trace log. If you increase the size of the kernel trace -log to 100 kilobytes, issue the following command. -

       # fstrace setlog cmfx 100
    -
    -

    After ensuring that the kernel trace log is configured for your needs, you -can set up a file into which you can dump the kernel trace log. For -example, create a dump file with the name -cmfx.dump.file.1 using the following -fstrace dump command. Issue the command as a continuous -process by adding the -follow and -sleep -arguments. Setting the -sleep argument to 10 -dumps output from the kernel trace log to the file every 10 seconds. -

       # fstrace dump -follow cmfx -file cmfx.dump.file.1 -sleep 10
    -   AFS Trace Dump -
    -      Date: Fri Apr 16 10:54:57 1999
    -   Found 1 logs.
    -   time 32.965783, pid 0: Fri Apr 16 10:45:52 1999
    -   time 32.965783, pid 33657: Close 0x5c39ed8 flags 0x20 
    -   time 32.965897, pid 33657: Gn_close vp 0x5c39ed8 flags 0x20 (returns
    -   0x0) 
    -   time 35.159854, pid 10891: Breaking callback for 5bd95e4 states 1024
    -   (volume 0)
    -   time 35.407081, pid 10891: Breaking callback for 5c0fadc states 1024
    -   (volume 0)
    -       .                         .
    -       .                         .
    -       .                         .
    -   time 71.440456, pid 33658: Lookup adp 0x5bbdcf0 name g3oCKs fid (756
    -   4fb7e:588d240.2ff978a8.6) 
    -   time 71.440569, pid 33658: Returning code 2 from 19 
    -   time 71.440619, pid 33658: Gn_lookup vp 0x5bbdcf0 name g3oCKs (returns
    -   0x2) 
    -   time 71.464989, pid 38267: Gn_open vp 0x5bbd000 flags 0x0 (returns 0x
    -   0) 
    -   AFS Trace Dump - Completed
    -
    -

    Using the afsmonitor Program

    - -

    The afsmonitor program enables you to monitor the status and -performance of specified File Server and Cache Manager processes by gathering -statistical information. Among its other uses, the -afsmonitor program can be used to fine-tune Cache Manager -configuration and load balance File Servers. -

    The afsmonitor program enables you to perform the following -tasks. -

      -

    • Monitor any number of File Server and Cache Manager processes on any -number of machines (in both local and foreign cells) from a single -location. -

    • Set threshold values for any monitored statistic. When the value of -a statistic exceeds the threshold, the afsmonitor program -highlights it to draw your attention. You can set threshold levels that -apply to every machine or only some. -

    • Invoke programs or scripts automatically when a statistic exceeds its -threshold. -
    -

    Requirements for running the afsmonitor program

    - -

    The following software must be accessible to a machine where the -afsmonitor program is running: -

      -

    • The AFS xstat libraries, which the afsmonitor -program uses to gather data -

    • The curses graphics package, which most UNIX distributions -provide as a standard utility -
    - - -

    The afsmonitor screens format successfully both on so-called -dumb terminals and in windowing systems that emulate terminals. For the -output to looks its best, the display environment needs to support reverse -video and cursor addressing. Set the TERM environment variable to the -correct terminal type, or to a value that has characteristics similar to the -actual terminal type. The display window or terminal must be at least -80 columns wide and 12 lines long. - - - -

    The afsmonitor program must run in the foreground, and in its -own separate, dedicated window or terminal. The window or terminal is -unavailable for any other activity as long as the afsmonitor -program is running. Any number of instances of the -afsmonitor program can run on a single machine, as long as each -instance runs in its own dedicated window or terminal. Note that it can -take up to three minutes to start an additional instance. -

    - -No privilege is required to run the afsmonitor program. By -convention, it is installed in the /usr/afsws/bin directory, and -anyone who can access the directory can monitor File Servers and Cache -Managers. The probes through which the afsmonitor program -collects statistics do not constitute a significant burden on the File Server -or Cache Manager unless hundreds of people are running the program. If -you wish to restrict its use, place the binary file in a directory available -only to authorized users. -

    The afsmonitor Output Screens

    - -

    The afsmonitor program displays its data on three screens: -

      -

    • System Overview: This screen appears automatically when -the afsmonitor program initializes. It summarizes separately -for File Servers and Cache Managers the number of machines being monitored and -how many of them have alerts (statistics that have exceeded their -thresholds). It then lists the hostname and number of alerts for each -machine being monitored, indicating if appropriate that a process failed to -respond to the last probe. -

    • File Server: This screen displays File Server statistics -for each file server machine being monitored. It highlights statistics -that have exceeded their thresholds, and identifies machines that failed to -respond to the last probe. -

    • Cache Managers: This screen displays Cache Manager -statistics for each client machine being monitored. It highlights -statistics that have exceeded their thresholds, and identifies machines that -failed to respond to the last probe. -
    -

    Fields at the corners of every screen display the following -information: -

      -

    • In the top left corner, the program name and version number. -

    • In the top right corner, the screen name, current and total page numbers, -and current and total column numbers. The page number (for example, -p. 1 of 3) indicates the index of the current page and the -total number of (vertical) pages over which data is displayed. The -column number (for example, c. 1 of 235) indicates the index -of the current leftmost column and the total number of columns in which data -appears. (The symbol >>> indicates that there is additional -data to the right; the symbol <<< indicates that -there is additional data to the left.) -

    • In the bottom left corner, a list of the available commands. Enter -the first letter in the command name to run that command. Only the -currently possible options appear; for example, if there is only one page -of data, the next and prev commands, which scroll the -screen up and down respectively, do not appear. For descriptions of the -commands, see the following section about navigating the display -screens. -

    • In the bottom right corner, the probes field reports how many -times the program has probed File Servers (fs), Cache Managers -(cm), or both. The counts for File Servers and Cache -Managers can differ. The freq field reports how often the -program sends probes. -
    -

    Navigating the afsmonitor Display Screens -

    As noted, the lower left hand corner of every display screen displays the -names of the commands currently available for moving to alternate screens, -which can either be a different type or display more statistics or machines of -the current type. To execute a command, press the lowercase version of -the first letter in its name. Some commands also have an uppercase -version that has a somewhat different effect, as indicated in the following -list. -

    -

    cm -
    Switches to the Cache Managers screen. Available only on -the System Overview and File Servers screens. -

    fs -
    Switches to the File Servers screen. Available only on -the System Overview and the Cache Managers -screens. -

    left -
    Scrolls horizontally to the left, to access the data columns situated to -the left of the current set. Available when the <<< -symbol appears at the top left of the screen. Press uppercase -L to scroll horizontally all the way to the left (to display the -first set of data columns). -

    next -
    Scrolls down vertically to the next page of machine names. -Available when there are two or more pages of machines and the final page is -not currently displayed. Press uppercase N to scroll to the -final page. -

    oview -
    Switches to the System Overview screen. Available only -on the Cache Managers and File Servers screens. -

    prev -
    Scrolls up vertically to the previous page of machine names. -Available when there are two or more pages of machines and the first page is -not currently displayed. Press uppercase N to scroll to the -first page. -

    right -
    Scrolls horizontally to the right, to access the data columns situated to -the right of the current set. This command is available when the ->>> symbol appears at the upper right of the screen. Press -uppercase R to scroll horizontally all the way to the right (to -display the final set of data columns). -
    -

    The System Overview Screen

    -

    The System Overview screen appears automatically as the -afsmonitor program initializes. This screen displays the -status of as many File Server and Cache Manager processes as can fit in the -current window; scroll down to access additional information. -

    The information on this screen is split into File Server information on the -left and Cache Manager information on the right. The header for each -grouping reports two pieces of information: -

      -

    • The number of machines on which the program is monitoring the indicated -process -

    • The number of alerts and the number of machines affected by them (an -alertmeans that a statistic has exceeded its threshold or a process -failed to respond to the last probe) -
    -

    A list of the machines being monitored follows. If there are any -alerts on a machine, the number of them appears in square brackets to the left -of the hostname. If a process failed to respond to the last probe, the -letters PF (probe failure) appear in square brackets to the left of -the hostname. -

    The following graphic is an example System Overview -screen. The afsmonitor program is monitoring six File -Servers and seven Cache Managers. The File Server process on host -fs1.abc.com and the Cache Manager on host -cli33.abc.com are each marked [ 1] to -indicate that one threshold value is exceeded. The [PF] -marker on host fs6.abc.com indicates that its File -Server process did not respond to the last probe. -

    Figure 6. The afsmonitor System Overview Screen
    -

    -
    System Overview Screen

    -
    -

    The File Servers Screen

    -

    The File Servers screen displays the values collected at the -most recent probe for File Server statistics. -

    A summary line at the top of the screen (just below the standard program -version and screen title blocks) specifies the number of monitored File -Servers, the number of alerts, and the number of machines affected by the -alerts. -

    The first column always displays the hostnames of the machines running the -monitored File Servers. -

    To the right of the hostname column appear as many columns of statistics as -can fit within the current width of the display screen or window; each -column requires space for 10 characters. The name of the statistic -appears at the top of each column. If the File Server on a machine did -not respond to the most recent probe, a pair of dashes (--) appears -in each column. If a value exceeds its configured threshold, it is -highlighted in reverse video. If a value is too large to fit into the -allotted column width, it overflows into the next row in the same -column. -

    For a list of the available File Server statistics, see Appendix C, The afsmonitor Program Statistics. -

    The following graphic depicts the File Servers screen that -follows the System Overview Screen example previously discussed; however, -one additional server probe has been completed. In this example, the -File Server process on fs1 has exceeded the configured threshold -for the number of performance calls received (the numPerfCalls -statistic), and that field appears in reverse video. Host -fs6 did not respond to Probe 10, so dashes appear in all -fields. -

    Figure 7. The afsmonitor File Servers Screen
    -

    -
    File Servers Screen

    -
    -

    Both the File Servers and Cache Managers screen (discussed in the following -section) can display hundreds of columns of data and are therefore designed to -scroll left and right. In the preceding graphic, the screen displays -the leftmost screen and the screen title block shows that column 1 of 235 is -displayed. The appearance of the >>> symbol in the upper -right hand corner of the screen and the right command in the -command block indicate that additional data is available by scrolling -right. (For information on the available statistics, see Appendix C, The afsmonitor Program Statistics.) -

    If the right command is executed, the screen looks something -like the following example. Note that the horizontal scroll symbols now -point both to the left (<<<) and to the right -(>>>) and both the left and right commands -appear, indicating that additional data is available by scrolling both left -and right. -

    Figure 8. The afsmonitor File Servers Screen Shifted One Page to the Right
    -

    -
    File Servers Screen Shifted One Page to the Right

    -
    -

    The Cache Managers Screen

    -

    The Cache Managers screen displays the values collected at -the most recent probe for Cache Manager statistics. -

    A summary line at the top of the screen (just below the standard program -version and screen title blocks) specifies the number of monitored Cache -Managers, the number of alerts, and the number of machines affected by the -alerts. -

    The first column always displays the hostnames of the machines running the -monitored Cache Managers. -

    To the right of the hostname column appear as many columns of statistics as -can fit within the current width of the display screen or window; each -column requires space for 10 characters. The name of the statistic -appears at the top of each column. If the Cache Manager on a machine -did not respond to the most recent probe, a pair of dashes (--) -appears in each column. If a value exceeds its configured threshold, it -is highlighted in reverse video. If a value is too large to fit into -the allotted column width, it overflows into the next row in the same -column. -

    For a list of the available Cache Manager statistics, see Appendix C, The afsmonitor Program Statistics. -

    The following graphic depicts a Cache Managers screen that follows the -System Overview Screen previously discussed. In the example, the Cache -Manager process on host cli33 has exceeded the configured threshold -for the number of cells it can contact (the numCellsContacted -statistic), so that field appears in reverse video. -

    Figure 9. The afsmonitor Cache Managers Screen
    -
    -
    Cache Managers Screen
    -
    -


    Configuring the afsmonitor Program

    - - -

    To customize the afsmonitor program, create an ASCII-format -configuration file and use the -config argument to name it. -You can specify the following in the configuration file: -

      -

    • The File Servers, Cache Managers, or both to monitor. -

    • The statistics to display. By default, the display includes 271 -statistics for File Servers and 570 statistics for Cache Managers. For -information on the available statistics, see Appendix C, The afsmonitor Program Statistics. -

    • The threshold values to set for statistics and a script or program to -execute if a threshold is exceeded. By default, no threshold values are -defined and no scripts or programs are executed. -
    -

    The following list describes the instructions that can appear in the -configuration file: -

    -

    cm host_name -
    Names a client machine for which to display Cache Manager -statistics. The order of cm lines in the file determines the -order in which client machines appear from top to bottom on the System -Overview and Cache Managers output screens. -

    fs host_name -
    Names a file server machine for which to display File Server -statistics. The order of fs lines in the file determines the -order in which file server machines appear from top to bottom on the -System Overview and File Servers output screens. -

    thresh fs | cm field_name thresh_val -[cmd_to_run] [arg1] . . . -[argn] -
    Assigns the threshold value thresh_val to the statistic -field_name, for either a File Server statistic (fs) or a -Cache Manager statistic (cm). The optional -cmd_to_execute field names a binary or script to execute each time -the value of the statistic changes from being below thresh_val to -being at or above thresh_val. A change between two values that -both exceed thresh_val does not retrigger the binary or -script. The optional arg1 through -argn fields are additional values that the -afsmonitor program passes as arguments to the -cmd_to_execute command. If any of them include one or more -spaces, enclose the entire field in double quotes. -

    The parameters fs, cm, field_name, -threshold_val, and arg1 through -argn correspond to the values with the same name on the -thresh line. The host_name parameter identifies the -file server or client machine where the statistic has crossed the threshold, -and the actual_val parameter is the actual value of -field_name that equals or exceeds the threshold value. -

    Use the thresh line to set either a global threshold, which -applies to all file server machines listed on fs lines or client -machines listed on cm lines in the configuration file, or a -machine-specific threshold, which applies to only one file server or client -machine. -

      -

    • To set a global threshold, place the thresh line before any of -the fs or cm lines in the file. -

    • To set a machine-specific threshold, place the thresh line -below the corresponding fs or cm line, and above any -other fs or cm lines. A machine-specific -threshold value always overrides the corresponding global threshold, if -set. Do not place a thresh fs line directly after a -cm line or a thresh cm line directly after a -fs line. -
    -

    show fs | cm field/group/section -
    Specifies which individual statistic, group of statistics, or section of -statistics to display on the File Servers screen (fs) or -Cache Managers screen (cm) and the order in which to -display them. The appendix of afsmonitor statistics in the -AFS Administration Guide specifies the group and section to which -each statistic belongs. Include as many show lines as -necessary to customize the screen display as desired, and place them anywhere -in the file. The top-to-bottom order of the show lines in -the configuration file determines the left-to-right order in which the -statistics appear on the corresponding screen. -

    If there are no show lines in the configuration file, then the -screens display all statistics for both Cache Managers and File -Servers. Similarly, if there are no show fs lines, the -File Servers screen displays all file server statistics, and if -there are no show cm lines, the Cache Managers screen -displays all client statistics. -

    # comments -
    Precedes a line of text that the afsmonitor program ignores -because of the initial number (#) sign, which must appear in the -very first column of the line. -
    -

    For a list of the values that can appear in the -field/group/section field of a show instruction, see Appendix C, The afsmonitor Program Statistics.) -

    The following example illustrates a possible configuration file: -

       thresh cm dlocalAccesses  1000000
    -   thresh cm dremoteAccesses  500000 handleDRemote
    -   thresh fs rx_maxRtt_Usec     1000
    -   cm client5
    -   cm client33
    -   cm client14
    -   thresh cm dlocalAccesses  2000000
    -   thresh cm vcacheMisses      10000
    -   cm client2
    -   fs fs3
    -   fs fs9
    -   fs fs5
    -   fs fs10
    -   show cm numCellsContacted
    -   show cm dlocalAccesses
    -   show cm dremoteAccesses
    -   show cm vcacheMisses
    -   show cm Auth_Stats_group
    -
    -

    Since the first three thresh instructions appear before any -fs or cm instructions, they set global threshold -values: -

      -

    • All Cache Manager process in this file use 1000000 as the -threshold for the dlocalAccesses statistic (except for the machine -client2 which uses an overriding value of -2000000.) -

    • All Cache Manager processes in this file use 500000 as the -threshold value for the dremoteAccesses statistic; if that -value is exceeded, the script handleDRemote is invoked. -

    • All File Server processes in this file use 1000 as the -threshold value for the rx_maxRtt_Usec statistic. -
    -

    The four cm instructions monitor the Cache Manager on the -machines client5, client33, client14, and -client2. The first three use all of the global threshold -values. -

    The Cache Manager on client2 uses the global threshold value for -the dremoteAccesses statistic, but a different one for the -dlocalAccesses statistic. Furthermore, client22 -is the only Cache Manager that uses the threshold set for the -vcacheMisses statistic. -

    The fs instructions monitor the File Server on the machines -fs3, fs9, fs5, and fs10. -They all use the global threshold for therx_maxRtt_Usec -statistic. -

    Because there are no show fs instructions, the File Servers -screen displays all File Server statistics. The Cache Managers screen -displays only the statistics named in show cm instructions, -ordering them from left to right. The Auth_Stats_group -includes several statistics, all of which are displayed (curr_PAGs, -curr_Records, curr_AuthRecords, -curr_UnauthRecords, curr_MaxRecordsInPAG, -curr_LongestChain, PAGCreations, -TicketUpdates, HWM_PAGS, HWM_Records, -HWM_MaxRecordsInPAG, and HWM_LongestChain). -


    Writing afsmonitor Statistics to a File

    - -

    All of the statistical information collected and displayed by the -afsmonitor program can be preserved by writing it to an output -file. You can create an output file by using the -output -argument when you startup the afsmonitor process. You can -use the output file to track process performance over long periods of time and -to apply post-processing techniques to further analyze system trends. -

    The afsmonitor program output file is a simple ASCII file that -records the information reported by the File Server and Cache Manager -screens. The output file has the following format: -

       time   host_name CM|FS   list_of_measured_values
    -
    -

    and specifies the time at which the -list_of_measured_values were gathered from the Cache Manager -(CM) or File Server (FS) process housed on -host_name. On those occasion where probes fail, the value --1 is reported instead of the -list_of_measured_values. -

    This file format provides several advantages: -

      -

    • It can be viewed using a standard editor. If you intend to view -this file frequently, use the -detailed flag with the --output argument. It formats the output file in a way that -is easier to read. -

    • It can be passed through filters to extract desired information using the -standard set of UNIX tools. -

    • It is suitable for long term storage of the afsmonitor program -output. -
    - - -

    To start the afsmonitor Program

    -
      -

    1. Open a separate command shell window or use a dedicated terminal for each -instance of the afsmonitor program. This window or terminal -must be devoted to the exclusive use of the afsmonitor process -because the command cannot be run in the background. -

    2. Initialize the afsmonitor program. The message -afsmonitor Collecting Statistics..., followed by -the appearance of the System Overview screen, confirms a successful -start. -
         % afsmonitor [initcmd]  [-config <configuration file>]  \
      -                [-frequency <poll frequency, in seconds>]  \
      -                [-output <storage file name>] [-detailed]  \
      -                [-debug <turn debugging output on to the named file>] \
      -                [-fshosts <list of file servers to monitor>+]  \
      -                [-cmhosts <list of cache managers to monitor>+]
      -   afsmonitor Collecting Statistics...
      -
      -

      where -

      -

      initcmd -
      Is an optional string that accommodates the command's use of the AFS -command parser. It can be omitted and ignored. -

      -config -
      Specifies the pathname of an afsmonitor configuration file, -which lists the machines and statistics to monitor. Partial pathnames -are interpreted relative to the current working directory. Provide -either this argument or one or both of the -fshosts and --cmhosts arguments. You must use a configuration file to set -thresholds or customize the screen display. For instructions on -creating the configuration file, see Configuring the afsmonitor Program. -

      -frequency -
      Specifies how often to probe the File Server and Cache Manager processes, -as a number of seconds. Acceptable values range from 1 and -86400; the default value is 60. This -frequency applies to both File Server and Cache Manager probes; however, -File Server and Cache Manager probes are initiated and processed independent -of each other. The actual interval between probes to a host is the -probe frequency plus the time needed by all hosts to respond to the -probe. -

      -output -
      Specifies the name of an output file to which to write all of the -statistical data. By default, no output file is created. For -information on this file, see Writing afsmonitor Statistics to a File. -

      -detailed -
      Formats the output file named by the -output argument to be -more easily readable. The -output argument must be provided -along with this flag. -

      -fshosts -
      Identifies each File Server process to monitor by specifying the host it -is running on. You can identify a host using either its complete -Internet-style host name or an abbreviation acceptable to the cell's -naming service. Combine this argument with the -cmhosts if -you wish, but not the -config argument. -

      -cmhosts -
      Identifies each Cache Manager process to monitor by specifying the host it -is running on. You can identify a host using either its complete -Internet-style host name or an abbreviation acceptable to the cell's -naming service. Combine this argument with the -fshosts if -you wish, but not the -config argument. -
      -
    -

    To stop the afsmonitor program

    - -

    To exit an afsmonitor program session, Enter the -<Ctrl-c> interrupt signal or an uppercase Q. -


    The xstat Data Collection Facility

    - - - - - - - - - - - -

    The afsmonitor program uses the xstat data collection -facility to gather and calculate the data that it (the afsmonitor -program) then uses to perform its function. You can also use the -xstat facility to create your own data display programs. If -you do, keep the following in mind. The File Server considers any -program calling its RPC routines to be a Cache Manager; therefore, any -program calling the File Server interface directly must export the Cache -Manager's callback interface. The calling program must be capable -of emulating the necessary callback state, and it must respond to periodic -keep-alive messages from the File Server. In addition, a calling -program must be able to gather the collected data. -

    The xstat facility consists of two C language libraries -available to user-level applications: -

      -

    • /usr/afsws/lib/afs/libxstat_fs.a exports calls that -gather information from one or more running File Server processes. -

    • /usr/afsws/lib/afs/libxstat_cm.a exports calls that -collect information from one or more running Cache Managers. -
    -

    The libraries allow the caller to register -

      -

    • A set of File Servers or Cache Managers to be examined. -

    • The frequency with which the File Servers or Cache Managers are to be -probed for data. -

    • A user-specified routine to be called each time data is collected. -
    -

    The libraries handle all of the lightweight processes, callback -interactions, and timing issues associated with the data collection. -The user needs only to process the data as it arrives. -

    The libxstat Libraries

    - - -

    The libxstat_fs.a and libxstat_cm.a -libraries handle the callback requirements and other complications associated -with the collection of data from File Servers and Cache Managers. The -user provides only the means of accumulating the desired data. Each -xstat library implements three routines: -

      -

    • Initialization (xstat_fs_Init and xstat_cm_Init) -arranges the periodic collection and handling of data. -

    • Immediate probe (xstat_fs_ForceProbeNow and -xstat_cm_ForceProbeNow) forces the immediate collection of data, -after which collection returns to its normal probe schedule. -

    • Cleanup (xstat_fs_Cleanup and xstat_cm_Cleanup) -terminates all connections and removes all traces of the data collection from -memory. -
    -

    - - - - - -The File Server and Cache Manager each define data collections that clients -can fetch. A data collection is simply a related set of numbers that -can be collected as a unit. For example, the File Server and Cache -Manager each define profiling and performance data collections. The -profiling collections maintain counts of the number of times internal -functions are called within servers, allowing bottleneck analysis to be -performed. The performance collections record, among other things, -internal disk I/O statistics for a File Server and cache effectiveness figures -for a Cache Manager, allowing for performance analysis. -

    - - - -For a copy of the detailed specification which provides much additional usage -information about the xstat facility, its libraries, and the -routines in the libraries, contact AFS Product Support. -

    Example xstat Commands

    - - - - - -

    AFS comes with two low-level, example commands: -xstat_fs_test and xstat_cm_test. The commands -allow you to experiment with the xstat facility. They gather -information and display the available data collections for a File Server or -Cache Manager. They are intended merely to provide examples of the -types of data that can be collected via xstat; they are not -intended for use in the actual collection of data. - - - - -

    To use the example xstat_fs_test command

    -
      -

    1. Issue the example xstat_fs_test command to test the routines in -the libxstat_fs.a library and display the data collections -associated with the File Server process. The command executes in the -foreground. -
         % xstat_fs_test [initcmd]  \
      -                   -fsname <File Server name(s) to monitor>+  \
      -                   -collID <Collection(s) to fetch>+  [-onceonly]  \
      -                   [-frequency <poll frequency, in seconds>]  \
      -                   [-period <data collection time, in minutes>] [-debug] 
      -
      -

      where -

      -

      xstat_fs_test -
      Must be typed in full. -

      initcmd -
      Is an optional string that accommodates the command's use of the AFS -command parser. It can be omitted and ignored. -

      -fsname -
      Is the Internet host name of each file server machine on which to monitor -the File Server process. -

      -collID -
      Specifies each data collection to return. The indicated data -collection defines the type and amount of data the command is to gather about -the File Server. Data is returned in the form of a predefined data -structure (refer to the specification documents referenced previously for more -information about the data structures). -

      There are two acceptable values: -

        -

      • 1 reports various internal performance statistics related to -the File Server (for example, vnode cache entries and Rx protocol -activity). -

      • 2 reports all of the internal performance statistics provided -by the 1 setting, plus some additional, detailed performance -figures about the File Server (for example, minimum, maximum, and cumulative -statistics regarding File Server RPCs, how long they take to complete, and how -many succeed). -
      -

      -onceonly -
      Directs the command to gather statistics just one time. Omit this -option to have the command continue to probe the File Server for statistics -every 30 seconds. If you omit this option, you can use the -<Ctrl-c> interrupt signal to halt the command at any -time. -

      -frequency -
      Sets the frequency in seconds at which the program initiates probes to the -File Server. If you omit this argument, the default is 30 -seconds. -

      -period -
      Sets how long the utility runs before exiting, as a number of -minutes. If you omit this argument, the default is 10 minutes. -

      -debug -
      Displays additional information as the command runs. -
      -
    - - - - -

    To use the example xstat_cm_test command

    -
      -

    1. Issue the example xstat_cm_test command to test the routines in -the libxstat_cm.a library and display the data collections -associated with the Cache Manager. The command executes in the -foreground. -
         % xstat_cm_test [initcmd]  \
      -                   -cmname <Cache Manager name(s) to monitor>+  \
      -                   -collID <Collection(s) to fetch>+ \
      -                   [-onceonly] [-frequency <poll frequency, in seconds>]  \
      -                   [-period <data collection time, in minutes>] [-debug] 
      -
      -

      where -

      -

      xstat_cm_test -
      Must be typed in full. -

      initcmd -
      Is an optional string that accommodates the command's use of the AFS -command parser. It can be omitted and ignored. -

      -cmname -
      Is the host name of each client machine on which to monitor the Cache -Manager. -

      -collID -
      Specifies each data collection to return. The indicated data -collection defines the type and amount of data the command is to gather about -the Cache Manager. Data is returned in the form of a predefined data -structure (refer to the specification documents referenced previously for more -information about the data structures). -

      There are two acceptable values: -

        -

      • 0 provides profiling information about the numbers of times -different internal Cache Manager routines were called since the Cache manager -was started. -

      • 1 reports various internal performance statistics related to -the Cache manager (for example, statistics about how effectively the cache is -being used and the quantity of intracell and intercell data access). -

      • 2 reports all of the internal performance statistics provided -by the 1 setting, plus some additional, detailed performance -figures about the Cache Manager (for example, statistics about the number of -RPCs sent by the Cache Manager and how long they take to complete; and -statistics regarding things such as authentication, access, and PAG -information associated with data access). -
      -

      -onceonly -
      Directs the command to gather statistics just one time. Omit this -option to have the command continue to probe the Cache Manager for statistics -every 30 seconds. If you omit this option, you can use the -<Ctrl-c> interrupt signal to halt the command at any -time. -

      -frequency -
      Sets the frequency in seconds at which the program initiates probes to the -Cache Manager. If you omit this argument, the default is 30 -seconds. -

      -period -
      Sets how long the utility runs before exiting, as a number of -minutes. If you omit this argument, the default is 10 minutes. -

      -debug -
      Displays additional information as the command runs. -
      -
    -

    Auditing AFS Events on AIX File Servers

    - - - - -

    You can audit AFS events on AIX File Servers using an AFS mechanism that -transfers audit information from AFS to the AIX auditing system. The -following general classes of AFS events can be audited. For a complete -list of specific AFS audit events, see Appendix D, AIX Audit Events. -

      -

    • Authentication and Identification Events -

    • Security Events -

    • Privilege Required Events -

    • Object Creation and Deletion Events -

    • Attribute Modification Events -

    • Process Control Events -
    -
    Note:This section assumes familiarity with the AIX auditing system. For -more information, see the AIX System Management Guide for the -version of AIX you are using. -
    -

    Configuring AFS Auditing on AIX File Servers

    -

    The directory /usr/afs/local/audit contains three files that -contain the information needed to configure AIX File Servers to audit AFS -events: -

      -

    • The events.sample file contains information on auditable -AFS events. The contents of this file are integrated into the -corresponding AIX events file (/etc/security/audit/events). -

    • The config.sample file defines the six classes of AFS -audit events and the events that make up each class. It also defines -the classes of AFS audit events to audit for the File Server, which runs as -the local superuser root. The contents of this file must be -integrated into the corresponding AIX config file -(/etc/security/audit/config). -

    • The objects.sample file contains a list of information -about audited files. You must only audit files in the local file -space. The contents of this file must be integrated into the -corresponding AIX objects file -(/etc/security/audit/objects). -
    -

    Once you have properly configured these files to include the AFS-relevant -information, use the AIX auditing system to start up and shut down the -auditing. -

    To enable AFS auditing

    -
      -

    1. Create the following string in the file /usr/afs/local/Audit on -each File Server on which you plan to audit AFS events: -
         AFS_AUDIT_AllEvents
      -
      -

    2. Issue the bos restart command (with the -all flag) -to stop and restart all server processes on each File Server. For -instructions on using this command, see Stopping and Immediately Restarting Processes. -
    -

    To disable AFS auditing

    -
      -

    1. Remove the contents of the file /usr/afs/local/Audit on each -File Server for which you are no longer interested in auditing AFS -events. -

    2. Issue the bos restart command (with the -all flag) -to stop and restart all server processes on each File Server. For -instructions on using this command, see Stopping and Immediately Restarting Processes. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd014.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd014.htm deleted file mode 100755 index 40a4ebd52..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd014.htm +++ /dev/null @@ -1,831 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Managing Server Encryption Keys

    -

    This chapter explains how to maintain your cell's -server encryption keys, which are vital for secure communications in -AFS. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - -
    Add a new server encryption key -bos addkey and kas setpassword -
    Inspect key checksums in the Authentication Database -kas examine -
    Inspect key checksums in the KeyFile -bos listkeys -
    Remove an old server encryption key -bos removekey -
    -


    About Server Encryption Keys

    - - -

    An encryption key is a string of octal numbers used to encrypt -and decrypt packets of information. In AFS, a server encryption -key is the key used to protect information being transferred between AFS -server processes and between them and their clients. A server -encryption key is essentially a password for a server process and like a user -password is stored in the Authentication Database. -

    Maintaining your cell's server encryption keys properly is the most -basic way to protect the information in your AFS filespace from access by -unauthorized users. -

    Keys and Mutual Authentication: A Review

    - - - - - - -

    Server encryption keys play a central role in the mutual authentication -between client and server processes in AFS. For a more detailed -description of mutual authentication, see A More Detailed Look at Mutual Authentication. -

    When a client wants to contact an AFS server, it first contacts the -Ticket Granting Service (TGS) module of the Authentication -Server. After verifying the client's identity (based indirectly on -the password of the human user whom the client represents), the TGS gives the -client a server ticket. This ticket is encrypted with the -server's encryption key. (The TGS also invents a second encryption -key, called the session key, to be used only for a single episode -of communication between server and client. The server ticket and -session key, together with other pieces of information, are collectively -referred to as a token.) -

    The client cannot read the server ticket or token because it does not know -the server encryption key. However, the client sends it to the AFS -server along with service requests, because the ticket proves to the AFS -server processes that it has already authenticated with the TGS. AFS -servers trust the TGS to grant tickets only to valid clients. The fact -that the client possesses a ticket encrypted with the server's encryption -key proves to the server that the client is valid. On the other hand, -the client assumes that only a genuine AFS server knows the server encryption -key needed to decrypt the ticket. The server's ability to decrypt -the ticket and understand its contents proves to the client that the server is -legitimate. -

    Maintaining AFS Server Encryption Keys

    -

    As you maintain your cell's server encryption keys, keep the -following in mind. -

      -

    • Change the key frequently to enhance your cell's security. -Changing the key at least once a month is strongly recommended. - -

    • The AFS server encryption key currently in use is stored in two -places. When you add a new key, you must make changes in both places -and make them in the correct order, as instructed in Adding Server Encryption Keys. Failure to follow the instructions can seriously -impair cell functioning, as clients and servers become unable to -communicate. The two storage sites for the current server encryption -key are the following: -
        -

      1. The file /usr/afs/etc/KeyFile on the local disk of every file -server machine. The file can list more than one key, each with an -associated numerical identifier, the key version number or -kvno. A client token records the key version number of the -key used to seal it, and the server process retrieves the appropriate key from -this file when the client presents the token. - - - - - -

      2. The afs entry in the Authentication Database. The -current server encryption key is in the entry's password field, just like -an individual user's scrambled password. The Authentication -Server's Ticket Granting Service (TGS) uses this key to encrypt the -tokens it gives to clients. There is only a single key in the entry, -because the TGS never needs to read existing tokens, but only to generate new -ones by using the current key. - - - -
      -

      For instructions on creating the initial afs entry and -KeyFile files as you install your cell's first server machine, -see the AFS Quick Beginnings. -

    • At any specific time, the tokens that the Authentication Server's -Ticket Granting Service gives to clients are sealed with only one of the -server encryption keys, namely the one stored in the afs entry in -the Authentication Database. -

    • When you add a new server encryption key, you cannot immediately remove -the former key from the /usr/afs/etc/KeyFile file on the local disk -of every AFS server machine. Any time that you add a new key, it is -likely that some clients still have valid, unexpired tokens sealed with the -previous key. The more frequently you change the server encryption key, -the more such tickets there are likely to be. To be able to grant -service appropriately to clients with such tokens, an AFS server process must -still be able to access the server encryption key used to seal it. -

      You can safely delete an old server encryption key only when it is certain -that no clients have tokens sealed with that key. In general, wait a -period of time at least as long as the maximum token lifetime in your -cell. By default, the maximum token lifetime for users is 25 hours -(except for users whose Authentication Database entries were created by using -the 3.0 version of AFS, for whom the default is 100 hours). You -can use the -lifetime argument to the kas setfields -command to change this default. -

      Instructions for removing obsolete keys appear in Removing Server Encryption Keys. -

    • You create a new AFS server encryption key in much the same way regular -users change their passwords, by providing a character string that is -converted into an encryption key automatically. See Adding Server Encryption Keys. - -

    • In addition to using server encryption keys when communicating with -clients, the server processes use them to protect communications with other -server processes. Therefore, all server machines in your cell must have -the same version of the KeyFile file. The easiest way to -maintain consistency (if you run the United States edition of AFS) is to use -the Update Server to distribute the contents of the system control -machine's /usr/afs/etc directory to all of the other server -machines. There are two implications: -
        -

      • You must run the upserver process on the system control machine -and an upclientetc process on all other server machines that -references the system control machine. The AFS Quick -Beginnings explains how to install both processes. For -instructions on verifying that the Update Server processes are running, see Displaying Process Status and Information from the BosConfig File. - -

      • Change the KeyFile file only on the system control machine -(except in the types of emergencies discussed in Handling Server Encryption Key Emergencies). Any changes you make on other server machines are -overwritten the next time the upclientetc process retrieves the -contents of the system control machine's /usr/afs/etc -directory. By default, this happens every five minutes. - -
      -

      If you run the international edition of AFS, do not use the Update Server -to distribute the contents of the /usr/afs/etc directory, -particularly the KeyFile file. The data in the file is too -sensitive for transfer in unencrypted form, and because of United States -government exports regulations the international edition of AFS does not -include the necessary encryption routines in a form that the Update Server can -use. You must instead modify the file on each server machine -individually, taking care to enter the same key on every server -machine. -

    • Never edit the KeyFile directly with a text editor. -Instead, always use the appropriate bos commands as instructed in Adding Server Encryption Keys and Removing Server Encryption Keys. -
    -

    Displaying Server Encryption Keys

    -

    To display the server encryption keys in the -/usr/afs/etc/KeyFile file on any file server machine, use the -bos listkeys command. Use the kas examine command -to display the key in the Authentication Database's afs -entry. -

    By default the commands do not display the actual string of octal digits -that constitute a key, but rather a checksum, a decimal number -derived by encrypting a constant with the key. This prevents -unauthorized users from easily accessing the actual key, which they can then -use to falsify or eavesdrop on protected communications. - - -The bos listkeys and kas examine commands generate the -same checksum for a given key, so displaying checksums rather than actual keys -is generally sufficient. If you suspect that the keys differ in a way -that the checksums are not revealing, then you are probably experiencing -authentication problems throughout your cell. The easiest solution is -to create a new server encryption key following the instructions in Adding Server Encryption Keys or Handling Server Encryption Key Emergencies. Another common reason to issue the -bos listkeys command is to display the key version numbers -currently in use, in preparation for choosing the next one; here, the -checksum is sufficient because the key itself is irrelevant. -

    If it is important to display the actual octal digits, include the --showkey argument to both the bos listkeys and kas -examine commands. - - - - - - -

    To display the KeyFile file

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos listkeys command to display the contents of one -machine's /usr/afs/etc/KeyFile file. -
         % bos listkeys <machine name> [-showkey]
      -
      -

      where -

      -

      listk -
      Is the shortest acceptable abbreviation of listkeys. -

      machine name -
      Names a file server machine. In the normal case, it is acceptable -to name any machine, because correct cell functioning requires that the -KeyFile file be the same on all of them. -

      -showkey -
      Displays the octal digits that constitute each key. -
      -
    -

    In the following example, the output displays a checksum for each server -encryption key rather than the actual octal digits. The penultimate -line indicates when an administrator last changed the file, and the final line -confirms that the output is complete. -

       % bos listkeys fs1.abc.com
    -   key 0 has cksum 972037177
    -   key 1 has cksum 2825165022
    -   Keys last changed on Wed Jan 13 11:20:29 1999. 
    -   All done.
    -
    - - - - - - -

    To display the afs key from the Authentication Database

    -
      -

    1. Issue the kas examine command to display the afs -entry in the Authentication Database. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas examine afs [-showkey]  \
      -                 -admin  <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password 
      -
      -

      where -

      -

      e -
      Is the shortest acceptable abbreviation of examine. -

      afs -
      Designates the afs entry. -

      -showkey -
      Displays the octal digits that constitute the key. -

      -admin -
      Names an administrative account with the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -
      -
    -

    In the following example, the admin user displays the -afs entry without using the -showkey flag. The -second line shows the key version number in parentheses and the key's -checksum. The line that begins with the string last mod -reports the date on which the indicated administrator changed the key. -There is no necessary relationship between this date and the date reported by -the bos listkeys command, because the latter date changes for any -type of change to the KeyFile file, not just a key addition. -For a description of the other lines in the output from the kas -examine command, see its reference page in the AFS Administration -Reference. -

       % kas examine afs  -admin admin
    -   Administrator's (admin) password: admin_password 
    -   User data for afs
    -    key (1) cksum is 2825165022, last cpw: no date
    -    password will never expire.
    -    An unlimited number of unsuccessful authentications is permitted.
    -    entry expires on never. Max ticket lifetime 100.00 hours.
    -    last mod on Wed Jan 13 11:21:36 1999 by admin
    -    permit password reuse
    -
    -

    Adding Server Encryption Keys

    - - - - - - - - - -

    As noted, AFS records server encryption keys in two separate places: -

      -

    1. In the file /usr/afs/etc/KeyFile on the local disk of each -server machine, for use by the AFS server processes running on the machine -

    2. In the afs entry in the Authentication Database, for use by the -Ticket Granting Service (TGS) when creating tokens -
    -

    To ensure that server processes and the TGS share the same AFS server -encryption key, execute all the steps in this section without -interruption. -

    The following instructions include a step in which you restart the database -server processes (the Authentication, Backup, Protection, and Volume Location -Server processes) on all database server machines. As a database server -process starts, it reads in the server encryption key that has the highest key -version number in the KeyFile file and uses it to protect the -messages that it sends for synchronizing the database and maintaining -quorum. It uses the same key throughout its lifetime, which can be for -an extended period, even if you remove the key from the KeyFile -file. However, if one of the peer database server processes restarts -and the others do not, quorum and database synchronization break down because -the processes are no longer using the same key: the restarted process is -using the key that currently has the highest key version number, and the other -processes are still using the key they read in when they originally -started. To avoid this problem, it is safest to restart all of the -database server processes when adding a new key. -

    After adding a new key, you can remove obsolete keys from the -KeyFile file to prevent it from becoming cluttered. However, -you must take care not to remove keys that client or server processes are -still using. For discussion and instructions, see Removing Server Encryption Keys. -

    To add a new server encryption key

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos listkeys command to display the key -version numbers that are already in use, as a first step in choosing the key -version number for the new key. -
         % bos listkeys <machine name>
      -
      -

      where -

      -

      listk -
      Is the shortest acceptable abbreviation of listkeys. -

      machine name -
      Names any file server machine. -
      -

    3. Choose a key version number for the new key, based on the -output from Step 2 and the following requirements: -
        -

      • A key version number must be an integer between 0 (zero) and 255 to comply -with Kerberos standards. It is simplest if you keep your key version -numbers in sequence by choosing a key version number one greater than the -largest existing one. -

      • Do not reuse a key version number currently found in the -KeyFile file, particularly if it is also the one in the -Authentication Database afs entry. Client processes possibly -still have tickets sealed with the key that originally had that key version -number, but the server processes start using the new key marked with that key -version number. Because the keys do not match, the server processes -refuse requests from clients who hold legitimate tokens. -
      - - -

    4. Issue the bos addkey command to create a new AFS -server encryption key in the KeyFile file. -

      If you run the United States edition of AFS and use the Update Server to -distribute the contents of the system control machine's -/usr/afs/etc directory, substitute the system control machine for -the machine name argument. (If you have forgotten which -machine is the system control machine, see To locate the system control machine.) -

      If you run the international edition of AFS or do not use the Update -Server, repeat the bos addkey command, substituting each server -machine in your cell for the machine name argument in turn. -

      To avoid visible echoing of the string that corresponds to the new key, -omit the -key argument from the command line; instead enter -the string at the prompts that appear when you omit it, as shown in the -following syntax specification. -

         % bos addkey  -server <machine name> -kvno <key version number>
      -   input key: afs_password
      -   Retype input key: afs_password
      -
      -

      where -

      -

      addk -
      Is the shortest acceptable abbreviation of addkey. -

      -server -
      Names the cell's system control machine if you are using the Update -Server, or each server machine in turn if you are not. -

      -kvno -
      Specifies the new key's key version number as an integer from the -range 0 (zero) through 255. -

      Remember the number. You need to use it again in Step 6. If you are using the international edition of AFS, -be sure to type the same number each time you issue this command. -

      afs_password -
      Is a character string similar to a user password, of any length from one -to about 1,000 characters. To improve security, include nonalphabetic -characters and make the string as long as is practical (you need to type it -only in this step and in Step 6). If you are using the international edition of AFS, -be sure to type the same string each time you issue this command. -

      Do not enter an octal string directly. The BOS Server scrambles the -character string into an octal string appropriate for use as an encryption key -before recording it in the KeyFile file. -

      -

    5. If you are using the Update Server, wait for a few minutes while the -Update Server distributes the new KeyFile file to all server -machines. The maximum necessary waiting period is the largest value -provided for the -t argument to the upclientetc -process's initialization command used on any of the server machines; -the default time is five minutes. -

      To be certain that all machines have the same KeyFile file, -issue the bos listkeys command for every file server machine and -verify that the checksum for the new key is the same on all machines. -

         % bos listkeys <machine name>
      -
      -

      If you are not using the Update Server, try to complete Step 4 within five minutes. - - -

    6. Issue the kas setpassword command to enter the same -key in the afs entry in the Authentication Database. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas setpassword -name afs -kvno <kvno>  \
      -                     -admin  <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password 
      -   new_password: afs_password
      -   Verifying, please re-enter new_password: afs_password
      -
      -

      where -

      -

      sp -
      Is an acceptable alias for setpassword (setp is the -shortest acceptable abbreviation). -

      -name afs -
      Creates the new key in the afs entry. -

      -kvno -
      Specifies the same key version number as in Step 4. -

      -admin -
      Names an administrative account with the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -

      afs_password -
      Is the same character string you entered in Step 4. -
      -

    7. (Optional.) If you want to verify that the keys you just -created in the KeyFile file and the Authentication Database -afs entry are identical and have the same key version number, -follow the instructions in Displaying Server Encryption Keys. -

    8. Issue the bos restart command to restart the database server -processes on all database server machines. This forces them to start -using the key in the KeyFile file that currently has the highest -key version number. -

      Repeat this command in quick succession for each database server machine, -starting with the machine that has the lowest IP address. -

         % bos restart  <machine name> buserver kaserver ptserver vlserver
      -
      -

      where -

      -

      res -
      Is the shortest acceptable abbreviation of restart. -

      machine name -
      Names each database server machine in turn. -

      buserver kaserver ptserver vlserver -
      Designates the Backup Server, Authentication Server, Protection Server, -and Volume Location (VL) Server, respectively. -
      -
    -

    Removing Server Encryption Keys

    - - - -

    You can periodically remove old keys from the -/usr/afs/etc/KeyFile file to keep it to a reasonable size. -To avoid disturbing cell functioning, do not remove an old key until all -tokens sealed with the key and held by users or client processes have -expired. After adding a new key, wait to remove old keys at least as -long as the longest token lifetime you use in your cell. For -Authentication Database user entries created under AFS version 3.1 or -higher, the default token lifetime is 25 hours; for entries created under -AFS version 3.0, it is 100 hours. -

    There is no command for removing the key from the afs entry in -the Authentication Database, because the key field in that entry must never be -empty. Use the kas setpassword command to replace the -afs key, but only as part of the complete procedure detailed in To add a new server encryption key. -

    Never remove from the KeyFile file the key that is currently in -the afs entry in the Authentication Database. AFS server -processes become unable to decrypt the tickets that clients present to -them. -

    To remove a key from the KeyFile file

    -
      -

    1. Verify that you are authenticated as a user listed in the -/usr/afs/etc/UserList file. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos listkeys command to display the key version -number of each key you want to remove. The output also reveals whether -it has been at least 25 hours since a new key was placed in the -KeyFile file. For complete instructions for the bos -listkeys command, see To display the KeyFile file. -
         % bos listkeys <machine name>
      -
      -

    3. Issue the kas examine command to verify that the key currently -in the Authentication Database's afs entry does not have the -same key version number as any of the keys you are removing from the -KeyFile file. For detailed instructions for the kas -examine command, see To display the afs key from the Authentication Database. -
         % kas examine afs  -admin <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password 
      -
      - - -

    4. Issue the bos removekey command to remove one or more server -encryption keys from the KeyFile file. -

      If you run the United States edition of AFS and use the Update Server to -distribute the contents of the system control machine's -/usr/afs/etc directory, substitute the system control machine for -the machine name argument. (If you have forgotten which -machine is the system control machine, see To locate the system control machine.) -

      If you run the international edition of AFS or do not use the Update -Server, repeat the bos removekey command, substituting each server -machine in your cell for the machine name argument in turn. -

         % bos removekey <machine name> <key version number>
      -
      -

      where -

      -

      removek -
      Is the shortest acceptable abbreviation of removekey. -

      machine name -
      Names the cell's system control machine if you are using the Update -Server, or each server machine in turn if you are not. -

      key version number -
      Specifies the key version number of each key to remove. -
      -
    -

    Handling Server Encryption Key Emergencies

    - - - - - -

    In rare circumstances, the AFS server processes can become unable to -decrypt the server tickets that clients or peer server processes are -presenting. Activity in your cell can come to a halt, because the -server processes believe that the tickets are forged or expired, and refuse to -execute any actions. This can happen on one machine or several; -the effect is more serious when more machines are involved. -

    One common cause of server encryption key problems is that the -client's ticket is encrypted with a key that the server process does not -know. Usually this means that the /usr/afs/etc/KeyFile on -the server machine does not include the key in the afs -Authentication Database entry, which the Authentication Server's Ticket -Granting Service (TGS) module is using to encrypt server tickets. -

    Another possibility is that the KeyFile files on different -machines do not contain the same keys. In this case, communications -among server processes themselves become impossible. For instance, -AFS's replicated database mechanism (Ubik) breaks down if the instances -of a database server process on the different database server machines are not -using the same key. -

    The appearance of the following error message when you direct a -bos command to a file server machine in the local cell is one -possible symptom of server encryption key mismatch. (Note, however, -that you can also get this message if you forget to include the --cell argument when directing the bos command to a file -server machine in a foreign cell.) -

       bos: failed to contact host's bosserver (security object was passed a bad ticket).
    -
    -

    The solution to server encryption key emergencies is to put a new AFS -server encryption key in both the Authentication Database and the -KeyFile file on every server machine, so that the TGS and all -server processes again share the same key. -

    Handling key emergencies requires some unusual actions. The reasons -for these actions are explained in the following sections; the actual -procedures appear in the subsequent instructions. -

    Prevent Mutual Authentication

    -

    It is necessary to prevent the server processes from trying -to mutually authenticate with you as you deal with a key emergency, because -they possibly cannot decrypt your token. When you do not mutually -authenticate, the server processes assign you the identity -anonymous. To prevent mutual authentication, use the -unlog command to discard your tokens and include the --noauth flag on every command where it is available. -

    Disable Authorization Checking by Hand

    -

    Because the server processes recognize you as the user -anonymous when you do not mutually authenticate, you must turn off -authorization checking. Only with authorization checking disabled do -the server processes allow the anonymous user to perform privileged -actions such as key creation. -

    In an emergency, disable authorization checking by creating the file -/usr/afs/local/NoAuth by hand. In normal circumstances, use -the bos setauth command instead. -

    Work Quickly on Each Machine

    -

    Disabling authorization checking is a serious security exposure, -because server processes on the affected machine perform any action for -anyone. Disable authorization checking only for as long as necessary, -completing all steps in an uninterrupted session and as quickly as -possible. -

    Work at the Console

    -

    Working at the console of each server machine on which you disable -authorization checking ensures that no one else logs onto the console while -you are working there. It does not prevent others from connecting to -the machine remotely (using the telnet program, for example), which -is why it is important to work quickly. The only way to ensure complete -security is to disable network traffic, which is not a viable option in many -environments. You can improve security in general by limiting the -number of people who can connect remotely to your server machines at any time, -as recommended in Improving Security in Your Cell. -

    Change Individual KeyFile Files

    -

    If you use the Update Server to distribute the contents of -the /usr/afs/etc directory, an emergency is the only time when it -is appropriate to change the KeyFile file on individual machines -instead. Updating each machine's file is necessary because -mismatched keys can prevent the system control machine's -upserver process from mutually authenticating with -upclientetc processes on other server machines, in which case the -upserver process refuses to distribute its KeyFile file -to them. -

    Even if it appears that the Update Server is working correctly, the only -way to verify that is to change the key on the system control machine and wait -the standard delay period to see if the upclientetc processes -retrieve the key. During an emergency, it does not usually make sense -to wait the standard delay period. It is more efficient simply to -update the file on each server machine separately. Also, even if the -Update Server can distribute the file correctly, other processes can have -trouble because of mismatched keys. The following instructions add the -new key file on the system control machine first. If the Update Server -is working, then it is distributing the same change as you are making on each -server machine individually. -

    If your cell does not use the Update Server, or uses the international -edition of AFS, you always change keys on server machines individually. -The following instructions are also appropriate for you. -

    Two Component Procedures

    -

    There are two subprocedures used frequently in the following -instructions: disabling authorization checking and reenabling it. -For the sake of clarity, the procedures are detailed here; the -instructions refer to them as necessary. -

    Disabling Authorization Checking in an Emergency

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      - -

    2. Create the file /usr/afs/local/NoAuth to disable -authorization checking. -
         # touch /usr/afs/local/NoAuth
      -
      - -

    3. Discard your tokens, in case they were sealed with an incompatible key, -which can prevent some commands from executing. -
         # unlog
      -
      -
    -

    Reenabling Authorization Checking in an Emergency

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Remove the /usr/afs/local/NoAuth file. -
         # rm /usr/afs/local/NoAuth
      -
      - -

    3. Authenticate as an administrative identity that belongs to the -system:administrators group and is listed in the -/usr/afs/etc/UserList file. -
         # klog <admin_user>
      -   Password: <admin_password>
      -
      -

    4. If appropriate, log out from the console (or close the remote connection -you are using), after issuing the unlog command to destroy your -tokens. -
    -

    To create a new server encryption key in emergencies

    -
      -

    1. On the system control machine, disable authorization -checking as instructed in Disabling Authorization Checking in an Emergency. -

    2. Issue the bos listkeys command to display the key -version numbers already in use in the KeyFile file, as a first step -in choosing the new key's key version number. -
         # bos listkeys <machine name> -noauth
      -
      -

      where -

      -

      listk -
      Is the shortest acceptable abbreviation of listkeys. -

      machine name -
      Specifies a file server machine. -

      -noauth -
      Bypasses mutual authentication with the BOS Server. Include it in -case the key emergency is preventing successful mutual authentication. -
      -

    3. Choose a key version number for the new key, based on what you -learned in Step 2 plus the following requirements: -
        -

      • It is best to keep your key version numbers in sequence by choosing a key -version number one greater than the largest existing one. -

      • Key version numbers must be integers between 0 and 255 to comply with -Kerberos standards. -

      • Do not reuse a key version number currently listed in the -KeyFile file. -
      - -

    4. On the system control machine, issue the bos -addkey command to create a new AFS server encryption key in the -KeyFile file. -
         # bos addkey <machine name> -kvno <key version number> -noauth
      -   input key: afs_password
      -   Retype input key: afs_password
      -
      -

      where -

      -

      addk -
      Is the shortest acceptable abbreviation of addkey. -

      machine name -
      Names the file server machine on which to define the new key in the -KeyFile file. -

      -kvno -
      Specifies the key version number you chose in Step 3, an integer in the range 0 (zero) through 255. You -must specify the same number in Steps 7, 8, and 13. -

      -noauth -
      Bypasses mutual authentication with the BOS Server. Include it in -case the key emergency is preventing successful mutual authentication. -

      afs_password -
      Is a character string similar to a user password, of any length from one -to about 1,000 characters. To improve security, make the string as long -as is practical, and include nonalphabetic characters. -

      Do not type an octal string directly. The BOS Server scrambles the -character string into an octal string appropriate for use as an encryption key -before recording it in the KeyFile file. -

      Remember the string. You need to use it again in Steps 7, 8, and 13. -

      -

    5. On every database server machine in your cell (other -than the system control machine), disable authorization checking as instructed -in Disabling Authorization Checking in an Emergency. Do not repeat the procedure on the system control -machine, if it is a database server machine, because you already disabled -authorization checking in Step 1. (If you need to learn which machines are database -server machines, use the bos listhosts command as described in To locate database server machines.) -

    6. Wait at least 90 seconds after finishing Step 5, to allow each of the database server processes (the -Authentication, Backup, Protection and Volume Location Servers) to finish -electing a new sync site. Then issue the udebug command to -verify that the election worked properly. Issue the following commands, -substituting each database server machine's name for server -machine in turn. Include the system control machine if it is a -database server machine. -
         # udebug <server machine> buserver
      -   # udebug <server machine> kaserver
      -   # udebug <server machine> ptserver
      -   # udebug <server machine> vlserver
      -
      -

      For each process, the output from all of the database server machines must -agree on which one is the sync site for the process. It is not, -however, necessary that the same machine serves as the sync site for each of -the four processes. For each process, the output from only one machine -must include the following string: -

         I am sync site ...
      -
      -

      The output on the other machines instead includes the following line -

         I am not sync site
      -
      -

      and a subsequent line that begins with the string Sync host and -specifies the IP address of the machine claiming to be the sync site. -

      If the output does not meet these requirements or seems abnormal in another -way, contact AFS Product Support for assistance. -

    7. On every database server machine in your cell (other -than the system control machine), issue the bos addkey command -described in Step 4. Be sure to use the same values for -afs_password and kvno as you used in that step. - -

    8. Issue the kas setpassword command to define the new -key in the Authentication Database's afs entry. It must -match the key you created in Step 4 and Step 7. -
         # kas setpassword  -name afs  -kvno <key version number> -noauth
      -   new_password: afs_password
      -   Verifying, please re-enter new_password: afs_password
      -
      -

      where -

      -

      sp -
      Is an acceptable alias for setpassword (setp is the -shortest acceptable abbreviation). -

      -kvno -
      Is the same key version number you specified in Step 4. -

      afs_password -
      Is the same character string you specified as afs_password in -Step 4. It does not echo visibly. -
      -

    9. On every database server machine in your cell -(including the system control machine if it is a database server machine), -reenable authorization checking as instructed in Reenabling Authorization Checking in an Emergency. If the system control machine is not a database -server machine, do not perform this procedure until Step 11. -

    10. Repeat Step 6 to verify that each database server process has properly -elected a sync site after being restarted in Step 9. -

    11. On the system control machine (if it is not a -database server machine), reenable authorization checking as instructed in Reenabling Authorization Checking in an Emergency. If it is a database server machine, you already -performed the procedure in Step 9. -

    12. On all remaining (simple) file server machines, disable -authorization checking as instructed in Disabling Authorization Checking in an Emergency. -

    13. On all remaining (simple) file server machines, -issue the bos addkey command described in Step 4. Be sure to use the same values for -afs_password and kvno as you used in that step. -

    14. On all remaining (simple) file server machines, reenable -authorization checking as instructed in Reenabling Authorization Checking in an Emergency. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd015.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd015.htm deleted file mode 100755 index 5648dc959..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd015.htm +++ /dev/null @@ -1,2170 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    - - -


    Administering Client Machines and the Cache Manager

    -

    This chapter describes how to administer an AFS client -machine, which is any machine from which users can access the AFS filespace -and communicate with AFS server processes. (A client machine can -simultaneously function as an AFS server machine if appropriately -configured.) An AFS client machine has the following -characteristics: -

    -

    To learn how to install the client functionality on a machine, see the -AFS Quick Beginnings. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - - - - - - - - -
    Display cache size set at reboot -cat /usr/vice/etc/cacheinfo -
    Display current cache size and usage -fs getcacheparms -
    Change disk cache size without rebooting -fs setcachesize -
    Initialize Cache Manager -afsd -
    Display contents of CellServDB file -cat /usr/vice/etc/CellServDB -
    Display list of database server machines from kernel memory -fs listcells -
    Change list of database server machines in kernel memory -fs newcell -
    Check cell's status regarding setuid -fs getcellstatus -
    Set cell's status regarding setuid -fs setcell -
    Set server probe interval -fs checkservers -interval -
    Display machine's cell membership -cat /usr/vice/etc/ThisCell -
    Change machine's cell membership -Edit /usr/vice/etc/ThisCell -
    Flush cached file/directory -fs flush -
    Flush everything cached from a volume -fs flushvolume -
    Update volume-to-mount-point mappings -fs checkvolumes -
    Display Cache Manager's server preference ranks -fs getserverprefs -
    Set Cache Manager's server preference ranks -fs setserverprefs -
    Display client machine addresses to register -fs getclientaddrs -
    Set client machine addresses to register -fs setclientaddrs -
    Control the display of warning and status messages -fs messages -
    Display and change machine's system type -fs sysname -
    Enable asynchronous writes -fs storebehind -
    -


    Overview of Cache Manager Customization

    - - - -

    An AFS client machine's kernel includes a set of modifications, -commonly referred to as the Cache Manager, that enable access to -AFS files and directories and communications with AFS server processes. -It is common to speak of the Cache Manager as a process or program, and in -regular usage it appears to function like one. When configuring it, -though, it is helpful to keep in mind that this usage is not strictly -accurate. -

    The Cache Manager mainly fetches files on behalf of application programs -running on the machine. When an application requests an AFS file, the -Cache Manager contacts the Volume Location (VL) Server to obtain a list of the -file server machines that house the volume containing the file. The -Cache Manager then translates the application program's system call -requests into remote procedure calls (RPCs) to the File Server running on the -appropriate machine. When the File Server delivers the file, the Cache -Manager stores it in a local cache before delivering it to the -application program. -

    The File Server delivers a data structure called a callback -along with the file. (To be precise, it delivers a callback for each -file fetched from a read/write volume, and a single callback for all data -fetched from a read-only volume.) A valid callback indicates that the -Cache Manager's cached copy of a file matches the central copy maintained -by the File Server. If an application on another AFS client machine -changes the central copy, the File Server breaks the callback, and the Cache -Manager must retrieve the new version when an application program on its -machine next requests data from the file. As long as the callback is -unbroken, however, the Cache Manager can continue to provide the cached -version of the file to applications on its machine, which eliminates -unnecessary network traffic. -

    The indicated sections of this chapter explain how to configure and -customize the following Cache Manager features. All but the first -(choosing disk or memory cache) are optional, because AFS sets suitable -defaults for them. -

      -

    • disk or memory cache. The AFS Cache Manager can use -machine memory for caching instead of space on the local disk. Deciding -which to use is the most basic configuration decision you must make. -See Determining the Cache Type, Size, and Location. -

    • cache size. Cache size probably has the most direct -influence on client machine performance. It determines how often the -Cache Manager must contact the File Server across the network or discard -cached data to make room for newly requested files, both of which affect how -quickly the Cache Manager delivers files to users. See Determining the Cache Type, Size, and Location. -

    • cache location. For a disk cache, you can alter the -conventional cache directory location (/usr/vice/cache) to take -advantage of greater space availability on other disks on the machine. -A larger cache can result in faster file delivery. See Determining the Cache Type, Size, and Location. -

    • chunk size and number. The afsd program, -which initializes the Cache Manager, allows you to control the size and number -of chunks into which a cache is divided, plus related parameters. -Setting these parameters is optional, because there are reasonable defaults, -but it provides precise control. The AFS distribution includes -configuration scripts that set Cache Manager parameters to values that are -reasonable for different configurations and usage patterns. See Setting Other Cache Parameters with the afsd program. -

    • knowledge of database server machines. Enable access to -a cell's AFS filespace and other services by listing the cell's -database server machines in the /usr/vice/etc/CellServDB file on -the local disk. See Maintaining Knowledge of Database Server Machines. -

    • setuid privilege. You can control whether the Cache -Manager allows programs from a cell to execute with setuid permission. -See Determining if a Client Can Run Setuid Programs. -

    • cell membership. Each client belongs to a one cell -defined by the local /usr/vice/etc/ThisCell file. Cell -membership determines the default cell in which the machine's users are -authenticated and in which AFS commands run. See Setting a Client Machine's Cell Membership. -

    • cached file version. AFS's system of callbacks -normally guarantees that the Cache Manager has the most current versions of -files and directories possible. Nevertheless, you can force the Cache -Manager to fetch the most current version of a file from the File Server if -you suspect that the cache contains an outdated version. See Forcing the Update of Cached Data. -

    • File Server and Volume Location Server preferences. The -Cache Manager sets numerical preference ranks for the interfaces on file -server machines and Volume Server (VL) machines. The ranks determine -which interface the Cache Manager first attempts to use when fetching data -from a volume or from the Volume Location Database (VLDB). The Cache -Manager sets default ranks as it initializes, basing them on its network -proximity to each interface, but you can modify the preference ranks if you -wish. See Maintaining Server Preference Ranks. -

    • interfaces registered with the File Server. If the Cache -Manager is multihomed (has multiple interface addresses), you can control -which of them it registers for File Servers to use when they initiate RPCs to -the client machine. See Managing Multihomed Client Machines. -

    • display of information messages. By default, the Cache -Manager sends basic error and informational messages to the client -machine's console and to command shells. You can disable the -messaging. See Controlling the Display of Warning and Informational Messages. -

    • system type. The Cache Manager records the local -machine's AFS system type in kernel memory, and substitutes the value for -the @sys variable in pathnames. See Displaying and Setting the System Type Name. -

    • delayed writes. By default, the Cache Manager writes all -data to the File Server immediately and synchronously when an application -program closes a file. You can enable asynchronous writes, either for -an individual file, or all files that the Cache Manager handles, and set how -much data remains to be written when the Cache Manager returns control to the -closing application. See Enabling Asynchronous Writes. -
    -

    You must make all configuration changes on the client machine itself (at -the console or over a direct connection such as a telnet -connection). You cannot configure the Cache Manager remotely. -You must be logged in as the local superuser root to issue some -commands, whereas others require no privilege. All files mentioned in -this chapter must actually reside on the local disk of each AFS client machine -(they cannot, for example, be symbolic links to files in AFS). -

    AFS's package program can simplify other aspects of client -machine configuration, including those normally set in the machine's AFS -initialization file. See Configuring Client Machines with the package Program. -


    Configuration and Cache-Related Files on the Local Disk

    - - - - - -

    This section briefly describes the client configuration files that must -reside in the local /usr/vice/etc directory on every client -machine. If the machine uses a disk cache, there must be a partition -devoted to cache files; by convention, it is mounted at the -/usr/vice/cache directory. -

    Note for Windows users: Some files described in this -document possibly do not exist on machines that run a Windows operating -system. Also, Windows uses a backslash -( \ ) rather than a forward slash -( / ) to separate the elements in a -pathname. -

    Configuration Files in the /usr/vice/etc Directory

    -

    The /usr/vice/etc directory on a client -machine's local disk must contain certain configuration files for the -Cache Manager to function properly. They control the most basic aspects -of Cache Manager configuration. -

    If it is important that the client machines in your cell perform uniformly, -it is most efficient to update these files from a central source. The -following descriptions include pointers to sections that discuss how best to -maintain the files. -

    - - - - - -

    afsd -
    The binary file for the program that initializes the Cache Manager. -It must run each time the machine reboots in order for the machine to remain -an AFS client machine. The program also initializes several daemons -that improve Cache Manager functioning, such as the process that handles -callbacks. - - -

    cacheinfo -
    A one-line file that sets the cache's most basic configuration -parameters: the local directory at which the Cache Manager mounts the -AFS filespace, the local disk directory to use as the cache, and how many -kilobytes to allocate to the cache. -

    The AFS Quick Beginnings explains how to create this file as you -install a client machine. To change the cache size on a machine that -uses a memory cache, edit the file and reboot the machine. On a machine -that uses a disk cache, you can change the cache size without rebooting by -issuing the fs setcachesize command. For instructions, see Determining the Cache Type, Size, and Location. - - -

    CellServDB -
    This ASCII file names the database server machines in the local cell and -in any foreign cell to which you want to enable access from this -machine. (Database server machines are the machines in a cell that run -the Authentication, Backup, Protection, and VL Server processes; see Database Server Machines.) -

    The Cache Manager must be able to reach a cell's database server -machines to fetch files from its filespace. Incorrect or missing -information in the CellServDB file can slow or completely block -access. It is important to update the file whenever a cell's -database server machines change. -

    As the afsd program initializes the Cache Manager, it loads the -contents of the file into kernel memory. The Cache Manager does not -read the file between reboots, so to incorporate changes to the file into -kernel memory, you must reboot the machine. Alternatively, you can -issue the fs newcell command to insert the changes directly into -kernel memory without changing the file. It can also be convenient to -upgrade the file from a central source. For instructions, see Maintaining Knowledge of Database Server Machines. -

    (The CellServDB file on client machines is not the same as the -one kept in the /usr/afs/etc directory on server machines, which -lists only the local cell's database server machines. For -instructions on maintaining the server CellServDB file, see Maintaining the Server CellServDB File). - - -

    NetInfo -
    This optional ASCII file lists one or more of the network interface -addresses on the client machine. If it exists when the Cache Manager -initializes, the Cache Manager uses it as the basis for the list of interfaces -that it registers with File Servers. See Managing Multihomed Client Machines. - - -

    NetRestrict -
    This optional ASCII file lists one or more network interface -addresses. If it exists when the Cache Manager initializes, the Cache -Manager removes the specified addresses from the list of interfaces that it -registers with File Servers. See Managing Multihomed Client Machines. - - -

    ThisCell -
    This ASCII file contains a single line that specifies the complete -domain-style name of the cell to which the machine belongs. Examples -are abc.com and stateu.edu. This -value defines the default cell in which the machine's users become -authenticated, and in which the command interpreters (for example, the -bos command) contact server processes. -

    The AFS Quick Beginnings explains how to create this file as you -install the AFS client functionality. To learn about changing a client -machine's cell membership, see Setting a Client Machine's Cell Membership. -

    -

    In addition to these files, the /usr/vice/etc directory also -sometimes contains the following types of files and subdirectories: -

      - - - - -

    • The AFS initialization script, called afs.rc on many -system types. In the conventional configuration specified by the -AFS Quick Beginnings, it is a symbolic link to the actual script -kept in the same directory as other initialization files used by the operating -system. - - -

    • A subdirectory that houses AFS kernel library files used by a dynamic -kernel loading program. - - -

    • A subdirectory called C, which houses the Cache Manager catalog -file called afszcm.cat. The fstrace program uses the -catalog file to translate operation codes into character strings, which makes -the message in the trace log more readable. See About the fstrace Command Suite. -
    -

    Cache-Related Files

    - - - - - -

    A client machine that uses a disk cache must have a local disk directory -devoted to the cache. The conventional mount point is -/usr/vice/cache, but you can use another partition that has more -available space. -

    Do not delete or directly modify any of the files in the cache -directory. Doing so can cause a kernel panic, from which the only way -to recover is to reboot the machine. By default, only the local -superuser root can read the files directly, by virtue of owning -them. -

    A client machine that uses a memory cache keeps all of the information -stored in these files in machine memory instead. -

    - - -

    CacheItems -
    A binary-format file in which the Cache Manager tracks the contents of -cache chunks (the V files in the directory, described just -following), including the file ID number (fID) and the data version -number. - - -

    VolumeItems -
    A binary-format file in which the Cache Manager records the mapping -between mount points and the volumes from which it has fetched data. -The Cache Manager uses the information when responding to the pwd -command, among others. - - - -

    Vn -
    A cache chunk file, which expands to a maximum size (by default, 64 KB) to -house data fetched from AFS files. The number of Vn -files in the cache depends on the cache size among other factors. The -n is the index assigned to each file; they are numbered -sequentially, but the Cache Manager does not necessarily use them in order or -contiguously. If an AFS file is larger than the maximum size for -Vn files, the Cache Manager divides it across multiple -Vn files. -
    -

    Determining the Cache Type, Size, and Location

    -

    This section explains how to configure a memory or disk -cache, how to display and set the size of either type of cache, and how to set -the location of the cache directory for a disk cache. - - -

    The Cache Manager uses a disk cache by default, and it is the preferred -type of caching. To configure a memory cache, include the --memcache flag on the afsd command, which is normally -invoked in the machine's AFS initialization file. If configured to -use a memory cache, the Cache Manager does no disk caching, even if the -machine has a disk. -

    Choosing the Cache Size

    - -

    Cache size influences the performance of a client machine more directly -than perhaps any other cache parameter. The larger the cache, the -faster the Cache Manager is likely to deliver files to users. A small -cache can impair performance because it increases the frequency at which the -Cache Manager must discard cached data to make room for newly requested -data. When an application asks for data that has been discarded, the -Cache Manager must request it from the File Server, and fetching data across -the network is almost always slower than fetching it from the local -disk. The Cache Manager never discards data from a file that has been -modified locally but not yet stored back to the File Server. If the -cache is very small, the Cache Manager possible cannot find any data to -discard. For more information about the algorithm it uses when -discarding cached data, see How the Cache Manager Chooses Data to Discard). -

    The amount of disk or memory you devote to caching depends on several -factors. The amount of space available in memory or on the partition -housing the disk cache directory imposes an absolute limit. In -addition, you cannot allocate more than 95% of the space available on the -cache directory's partition to a disk cache. The afsd -program exits without starting the Cache Manager and prints an appropriate -message to the standard output stream if you violate this restriction. -For a memory cache, you must leave enough memory for other processes and -applications to run. If you try to allocate more memory than is -actually available, the afsd program exits without initializing the -Cache Manager and produces the following message on the standard output -stream: -

       afsd: memCache allocation failure at number KB
    -
    -

    where number is how many kilobytes were allocated just before the -failure. -

    Within these hard limits, the factors that determine appropriate cache size -include the number of users working on the machine, the size of the files with -which they usually work, and (for a memory cache) the number of processes that -usually run on the machine. The higher the demand from these factors, -the larger the cache needs to be to maintain good performance. -

    Disk caches smaller than 10 MB do not generally perform well. -Machines serving multiple users usually perform better with a cache of at -least 60 to 70 MB. The point at which enlarging the cache further does -not really improve performance depends on the factors mentioned previously, -and is difficult to predict. -

    Memory caches smaller than 1 MB are nonfunctional, and the performance of -caches smaller than 5 MB is usually unsatisfactory. Suitable upper -limits are similar to those for disk caches but are probably determined more -by the demands on memory from other sources on the machine (number of users -and processes). Machines running only a few processes possibly can use -a smaller memory cache. -

    AFS imposes an absolute limit on cache size in some versions. See -the AFS Release Notes for the version you are using. -

    -

    Displaying and Setting the Cache Size and Location

    - - - - - - - - - - - - - - - - - - - - - -

    The Cache Manager determines how big to make the cache by reading the -/usr/vice/etc/cacheinfo file as it initializes. As directed -in the AFS Quick Beginnings, you must create the file before -running the afsd program. The file also defines the -directory on which to mount AFS (by convention, /afs), and the -local disk directory to use for a cache directory. -

    To change any of the values in the file, log in as the local superuser -root. You must reboot the machine to have the new value take -effect. For instructions, see To edit the cacheinfo file. -

    To change the cache size at reboot without editing the cacheinfo -file, include the -blocks argument to the afsd -command; see the command's reference page in the AFS -Administration Reference. -

    For a disk cache, you can also use the fs setcachesize command -to reset the cache size without rebooting. The value you set persists -until the next reboot, at which time the cache size returns to the value -specified in the cacheinfo file or by the -blocks -argument to the afsd command. For instructions, see To change the disk cache size without rebooting. -

    To display the current cache size and the amount of space the Cache Manager -is using at the moment, use the fs getcacheparms command as -detailed in To display the current cache size. -

    To display the cache size set at reboot

    -
      -

    1. Use a text editor or the cat command to display the contents of -the /usr/vice/etc/cacheinfo file. -
         % cat /usr/vice/etc/cacheinfo
      -
      -
    - - - - - - -

    To display the current cache size

    -
      -

    1. Issue the fs getcacheparms command on the client -machine. -
         % fs getcacheparms
      -
      -

      where getca is the shortest acceptable abbreviation of -getcacheparms. -

      The output shows the number of kilobyte blocks the Cache Manager is using -as a cache at the moment the command is issued, and the current size of the -cache. For example: -

         AFS using 13709 of the cache's available 15000 1K byte blocks.
      -
      -
    - - - - - -

    To edit the cacheinfo file

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Use a text editor to edit the /usr/vice/etc/cacheinfo file, -which has three fields, separated by colons: -
        -

      • The first field names the local directory on which to mount the AFS -filespace. The conventional location is /afs. -

      • The second field defines the local disk directory to use for the disk -cache. The conventional location is the /usr/vice/cache -directory, but you can specify an alternate directory if another partition has -more space available. There must always be a value in this field, but -the Cache Manager ignores it if the machine uses a memory cache. -

      • The third field defines cache size as a number of kilobyte (1024-byte) -blocks. -
      -

      The following example mounts the AFS filespace at the /afs -directory, names /usr/vice/cache as the cache directory, and sets -cache size to 50,000 KB: -

         /afs:/usr/vice/cache:50000
      -
      -
    - - - - - - -

    To change the disk cache size without rebooting

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs setcachesize command to set a new disk -cache size. -
      Note:This command does not work for a memory cache. -
      -
         # fs setcachesize <size in 1K byte blocks (0 => reset)>
      -
      -

      where -

      -

      setca -
      Is the shortest acceptable abbreviation of setcachesize. -

      size in 1K byte blocks (0 => reset) -
      Sets the number of kilobyte blocks to be used for the cache. -Specify a positive integer (1024 equals 1 MB), or 0 -(zero) to reset the cache size to the value specified in the -cacheinfo file. -
      -
    - - - - - - -

    To reset the disk cache size to the default without rebooting

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs setcachesize command to reset the size of the -local disk cache (the command does not work for a memory cache). Choose -one of the two following options: -
        -

      • To reset the cache size to the value specified in the local -cacheinfo file, specify the value 0 (zero) -
           # fs setcachesize 0
        -
        -

      • To reset the cache size to the value set at the last reboot of the -machine, include the -reset flag. Unless the --blocks argument was used on the afsd command, this is -also the value in the cacheinfo file. -
           # fs setcachesize -reset
        -
        -
      -

      where -

      -

      setca -
      Is the shortest acceptable abbreviation of setcachesize. -

      0 -
      Resets the disk cache size to the value in the third field of the -/usr/vice/etc/cacheinfo file. -

      -reset -
      Resets the cache size to the value set at the last reboot. -
      -
    -

    How the Cache Manager Chooses Data to Discard

    -

    When the cache is full and application programs request more -data from AFS, the Cache Manager must flush out cache chunks to make room for -the data. The Cache Manager considers two factors: -

      -

    1. How recently an application last accessed the data. -

    2. Whether the chunk is dirty. A dirty chunk contains -changes to a file that have not yet been saved back to the permanent copy -stored on a file server machine. -
    -

    The Cache Manager first checks the least-recently used chunk. If it -is not dirty, the Cache Manager discards the data in that chunk. If the -chunk is dirty, the Cache Manager moves on to check the next least recently -used chunk. It continues in this manner until it has created a -sufficient number of empty chunks. -

    Chunks that contain data fetched from a read-only volume are by definition -never dirty, so the Cache Manager can always discard them. Normally, -the Cache Manager can also find chunks of data fetched from read/write volumes -that are not dirty, but a small cache makes it difficult to find enough -eligible data. If the Cache Manager cannot find any data to discard, it -must return I/O errors to application programs that request more data from -AFS. Application programs usually have a means for notifying the user -of such errors, but not for revealing their cause. -


    Setting Other Cache Parameters with the afsd program

    -

    There are only three cache configuration parameters you must -set: the mount directory for AFS, the location of the disk cache -directory, and the cache size. They correspond to the three fields in -the /usr/vice/etc/cacheinfo file, as discussed in Determining the Cache Type, Size, and Location. However, if you want to experiment with fine-tuning -cache performance, you can use the arguments on the afsd command to -control several other parameters. This section discusses a few of these -parameters that have the most direct effect on cache performance. To -learn more about the afsd command's arguments, see its -reference page in the AFS Administration Reference. -

    In addition, the AFS initialization script included in the AFS distribution -for each system type includes several variables that set several -afsd arguments in a way that is suitable for client machines of -different sizes and usage patterns. For instructions on using the -script most effectively, see the section on configuring the Cache Manager in -the AFS Quick Beginnings. -

    Setting Cache Configuration Parameters

    -

    The cache configuration parameters with the most direct -effect on cache performance include the following: -

      -

    • total cache size. This is the amount of disk space or -machine memory available for caching, as discussed in detail in Determining the Cache Type, Size, and Location. -

    • number of cache chunks. For a disk cache, each chunk is -a Vn file in the local cache directory (see Cache-Related Files). For a memory cache, each chunk is a set of -contiguous blocks allocated in machine memory. -

      This parameter does not have as much of an effect on cache performance as -total size. However, adjusting it can influence how often the Cache -Manager must discard cached data to make room for new data. Suppose, -for example, that you set the disk cache size to 50 MB and the number of -chunks (Vn files) to 1,000. If each of the ten -users on the machine caches 100 AFS files that average 20 KB in size, then all -1,000 chunks are full (a chunk can contain data from only one AFS file) but -the cache holds only about 20 MB of data. When a user requests more -data from the File Server, the Cache Manager must discard cached data to -reclaim some chunks, even though the cache is filled to less than 50% of its -capacity. In such a situation, increasing the number of chunks enables -the Cache Manager to discard data less often. -

    • chunk size. This parameter determines the maximum amount -of data that can fit in a chunk. If a cached element is smaller than -the chunk size, the remaining space in the chunk is not used (a chunk can hold -no more than one element). If an element cannot fit in a single chunk, -it is split across as many chunks as needed. This parameter also -determines how much data the Cache Manager requests at a time from the File -Server (how much data per fetch RPC, because AFS uses partial file -transfer). -

      The main reason to change chunk size is because of its relation to the -amount of data fetched per RPC. If your network links are very fast, it -can improve performance to increase chunk size; if the network is -especially slow, it can make sense to decrease chunk size. -

    • number of dcache entries in memory. The Cache Manager -maintains one dcache entry for each cache chunk, recording a small amount of -information, such as the file ID (fID) and version number of the AFS file -corresponding to the chunk. -

      For a disk cache, dcache entries reside in the -/usr/vice/cache/CacheItems file; a small number are duplicated -in machine memory to speed access. -

      For a memory cache, the number of dcache entries equals the number of cache -chunks. For a discussion of the implications of this correspondence, -see Controlling Memory Cache Configuration. -

    -

    For a description of how the Cache Manager determines defaults for number -of chunks, chunk size, and number of dcache entries in a disk cache, see Configuring a Disk Cache; for a memory cache, see Controlling Memory Cache Configuration. The instructions also explain -how to use the afsd command's arguments to override the -defaults. -

    Configuring a Disk Cache

    -

    The default number of cache chunks (Vn -files) in a disk cache is calculated by the afsd command to be the -greatest of the following: -

      -

    • 100 -

    • 1.5 times the result of dividing cache size by chunk size -(cachesize/chunksize * 1.5) -

    • The result of dividing cachesize by 10 MB (cachesize/10240) -
    -

    You can override this value by specifying a positive integer with the --files argument. Consider increasing this value if more than -75% of the Vn files are already used soon after the Cache -Manager finishes initializing. Consider decreasing it if only a small -percentage of the chunks are used at that point. In any case, never -specify a value less than 100, because a smaller value can cause performance -problems. -

    The following example sets the number of Vn files to -2,000: -

       /usr/vice/etc/afsd -files 2000
    -
    -
    Note:It is conventional to place the afsd command in a machine's -AFS initialization file, rather than entering it in a command shell. -Furthermore, the values specified in this section are examples only, and are -not necessarily suitable for a specific machine. -
    -

    The default chunk size for a disk cache is 64 KB. In general, the -only reason to change it is to adjust to exceptionally slow or fast -networks; see Setting Cache Configuration Parameters. You can use the -chunksize -argument to override the default. Chunk size must be a power of 2, so -provide an integer between 0 (zero) and 30 to be used as an exponent of -2. For example, a value of 10 sets chunk size to 1 KB (210 = -1024); a value of 16 equals the default for disk caches (216 = -64 KB). Specifying a value of 0 (zero) or greater than 30 returns chunk -size to the default. Values less than 10 (1 KB) are not -recommended. The following example sets chunk size to 16 KB -(214): -

       /usr/vice/etc/afsd -chunksize 14
    -
    -

    For a disk cache, the default number of dcache entries duplicated in memory -is one-half the number of chunks specified with the -files -argument, to a maximum of 2,000 entries. You can use the --dcache argument to change the default, even exceeding 2,000 if you -wish. Duplicating more than half the dcache entries in memory is not -usually necessary, but sometimes improves performance slightly, because access -to memory is faster than access to disk. The following example sets the -number to 750: -

       /usr/vice/etc/afsd -dcache 750
    -
    -

    When configuring a disk cache, you can combine the afsd -command's arguments in any way. The main reason for this -flexibility is that the setting you specify for disk cache size (in the -cacheinfo file or with the -blocks argument) is an -absolute maximum limit. You cannot override it by specifying higher -values for the -files or -chunksize arguments, alone or -in combination. A related reason is that the Cache Manager does not -have to reserve a set amount of memory on disk. Vn -files (the chunks in a disk cache) are initially zero-length, but can expand -up to the specified chunk size and shrink again, as needed. If you set -the number of Vn files to such a large value that -expanding all of them to the full allowable size exceeds the total cache size, -they simply never grow to full size. -

    Controlling Memory Cache Configuration

    -

    Configuring a memory cache differs from configuring a disk -cache in that not all combinations of the afsd command's -arguments are allowed. This limitation results from the greater -interaction between the configuration parameters in a memory cache than a disk -cache. If all combinations are allowed, it is possible to set the -parameters in an inconsistent way. A list of the acceptable and -unacceptable combinations follows a discussion of default values. -

    The default chunk size for a memory cache is 8 KB. In general, the -only reason to change it is to adjust to exceptionally slow or fast -networks; see Setting Cache Configuration Parameters. -

    There is no predefined default for number of chunks in a memory -cache. The Cache Manager instead calculates the correct number by -dividing the total cache size by the chunk size. Recall that for a -memory cache, all dcache entries must be in memory. This implies that -the number of chunks equals the number of dcache entries in memory, and that -there is no default for number of dcache entries (like the number of chunks, -it is calculated by dividing the total size by the chunk size). -

    The following are acceptable combinations of the afsd -command's arguments when configuring a memory cache: -

      -

    • -blocks alone, which overrides the cache size specified in the -/usr/vice/etc/cacheinfo file. The Cache Manager divides the -value of this argument by the default chunk size of eight KB to calculate the -number of chunks and dcache entries. The following example sets cache -size to five MB (5,120 KB) and the number of chunks to 640 (5,120 divided by -8): -
         /usr/vice/etc/afsd -memcache -blocks 5120
      -
      -

    • -chunksize alone, to override the default of eight KB. -The chunk size must be a power of two, so provide an integer between 0 (zero) -and 30 to be used as an exponent of two. For example, a value of ten -sets chunk size to 1 KB (210 = 1024); a value of 13 equals the -default for memory caches (213 = 8 KB). Specifying a value -of 0 (zero) or greater than 30 returns the chunk size to the default. -Values less than ten (equivalent to 1 KB) are not recommended. The -following example sets the chunk size to four KB (212). -Assuming a total cache size of four MB (4,096 KB), the resulting number of -chunks is 1024. -
         /usr/vice/etc/afsd -memcache -chunksize 12
      -
      -

    • -blocks and -chunksize together override the -defaults for cache size and chunk size. The Cache Manager divides the -first by the second to calculate the number of chunks and dcache -entries. For example, the following example sets the cache size to six -MB (6,144 KB) and chunksize to four KB (212), resulting in 1,536 -chunks: -
         /usr/vice/etc/afsd -memcache -blocks 6144 -chunksize 12
      -
      -
    -

    The following arguments or combinations explicitly set the number of chunks -and dcache entries. It is best not to use them, because they set the -cache size indirectly, forcing you to perform a hand calculation to determine -the size of the cache. Instead, set the -blocks and --chunksize arguments alone or in combination; in those cases, -the Cache Manager determines the number of chunks and dcache entries -itself. Because the following combinations are not recommended, no -examples are included. -

      -

    • The -dcache argument alone explicitly sets the number of chunks -and dcache entries. The Cache Manager multiples this value times the -default chunk size of 8 KB to derive the total cache size (overriding the -value in the cacheinfo file). -

    • The combination of -dcache and -chunksize sets the -chunk number and size. The Cache Manager sets the specified values and -multiplies them together to obtain total cache size (overriding the value in -the cacheinfo file). -
    -

    Do not use the following arguments for a memory cache: -

      -

    • -files alone. This argument controls the number of -Vn files for a disk cache, but is ignored for a memory -cache. -

    • -blocks and -dcache. An error message -results, because it is possible to provide values such that dividing the first -(total size) by the second (number of chunks) results in a chunk size that is -not a power of two. -
    -

    Maintaining Knowledge of Database Server Machines

    - - - - - - - - - -

    For the users of an AFS client machine to access a cell's AFS -filespace and other services, the Cache Manager and other client-side agents -must have an accurate list of the cell's database server machines. -The affected functions include the following: -

      -

    • Accessing files. The Cache Manager contacts the Volume Location -(VL) Server to learn which file server machine houses the volume containing a -requested file or directory. If the Cache Manager cannot contact a -cell's VL Servers, it cannot fetch files. -

    • Authenticating. The klog program and AFS-modified login -utilities contact the Authentication Server to obtain tokens, which the AFS -server processes accept as proof that the user is authenticated. -

    • Creating protection groups. The pts command interpreter -contacts the Protection Server when users create protection groups or request -information from the Protection Database. -

    • Editing access control lists (ACLs). The fs command -interpreter contacts the File Server that maintains the read/write volume -containing a file or directory; the location information comes from the -VL Server. -
    -

    To enable a machine's users to access a cell, you must list the names -and IP addresses of its database server machines in the -/usr/vice/etc/CellServDB file on the machine's local -disk. In addition to the machine's home cell, you can list any -foreign cells that you want to enable users to access. (To enable -access to a cell's filespace, you must also mount its -root.cell volume in the local AFS filespace; the -conventional location is just under the AFS root directory, -/afs. For instructions, see the AFS Quick -Beginnings.) -

    How Clients Use the List of Database Server Machines

    -

    As the afsd program runs and initializes the Cache Manager, -it reads the contents of the CellServDB file into kernel -memory. The Cache Manager does not consult the file again until the -machine next reboots. In contrast, the command interpreters for the AFS -command suites (such as fs and pts) read the -CellServDB file each time they need to contact a database server -process. -

    When a cell's list of database server machines changes, you must -change both the CellServDB file and the list in kernel memory to -preserve consistent client performance; some commands probably fail if -the two lists of machines disagree. One possible method for updating -both the CellServDB file and kernel memory is to edit the file and -reboot the machine. To avoid needing to reboot, you can instead perform -both of the following steps: -

      -

    1. Issue the fs newcell command to alter the list in kernel memory -directly, making the changes available to the Cache Manager. -

    2. Edit the CellServDB file to make the changes available to -command interpreters. For a description of the file's format, see The Format of the CellServDB file. -
    -

    The consequences of missing or incorrect information in the -CellServDB file or kernel memory are as follows: -

      -

    • If there is no entry for a cell, the machine's users cannot access -the cell. -

    • If a cell's entry does not include a database server machine, then -the Cache Manager and command interpreters never attempt to contact the -machine. The omission does not prevent access to the cell--as long -as the information about the other database server machines is correct and the -server processes, machines, and network are functioning correctly--but it -can put an undue burden on the machines that are listed. If all of the -listed machines become inaccessible to clients, then the cell becomes -inaccessible even if the omitted database server machine is functioning -correctly. -

    • If a machine's name or address is incorrect, or the machine is not -actually running the database server processes, then requests from clients -time out. Users can experience lengthy delays because they have to wait -the full timeout period before the Cache Manager or command interpreter -contacts another database server machine. -
    -

    The Format of the CellServDB file

    - - -

    When editing the /usr/vice/etc/CellServDB file, you must use the -correct format for cell and machine entries. Each cell has a separate -entry. The first line has the following format: -

       >cell_name      #organization
    -
    -

    where cell_name is the cell's complete Internet domain name -(for example, abc.com) and organization is an -optional field that follows any number of spaces and the number sign -(#) and can name the organization to which the cell corresponds -(for example, the ABC Corporation). After the first line comes a -separate line for each database server machine. Each line has the -following format: -

       IP_address   #machine_name
    -
    -

    where IP_address is the machine's IP address in dotted -decimal format (for example, 192.12.105.3). -Following any number of spaces and the number sign (#) is -machine_name, the machine's fully-qualified hostname (for -example, db1.abc.com). In this case, the -number sign does not indicate a comment: machine_name is a -required field. -

    The order in which the cells appear is not important, but it is convenient -to put the client machine's home cell first. Do not include any -blank lines in the file, not even after the last entry. -

    The following example shows entries for two cells, each of which has three -database server machines: -

       >abc.com       #ABC Corporation (home cell)
    -   192.12.105.3      #db1.abc.com
    -   192.12.105.4      #db2.abc.com
    -   192.12.105.55     #db3.abc.com
    -   >stateu.edu    #State University cell
    -   138.255.68.93     #serverA.stateu.edu
    -   138.255.68.72     #serverB.stateu.edu
    -   138.255.33.154    #serverC.stateu.edu
    -
    -

    Maintaining the Client CellServDB File

    - - -

    Because a correct entry in the CellServDB file is vital for -consistent client performance, you must also update the file on each client -machine whenever a cell's list of database server machines changes (for -instance, when you follow the instructions in the AFS Quick -Beginnings to add or remove a database server machine). To -facilitate the client updates, you can use the package program, -which copies files from a central source in AFS to the local disk of client -machines. It is conventional to invoke the package program -in a client machine's AFS initialization file so that it runs as the -machine reboots, but you can also issue the package command at any -time. For instructions, see Running the package program. -

    If you use the package program, the conventional location for -your cell's central source CellServDB file is -/afs/cell_name/common/etc/CellServDB, where -cell_name is your cell name. - -

    Creating a symbolic or hard link from /usr/vice/etc/CellServDB -to a central source file in AFS is not a viable option. The -afsd program reads the file into kernel memory before the Cache -Manager is completely initialized and able to access AFS. -

    Because every client machine has its own copy of the CellServDB -file, you can in theory make the set of accessible cells differ on various -machines. In most cases, however, it is best to maintain consistency -between the files on all client machines in the cell: differences -between machines are particularly confusing if users commonly use a variety of -machines rather than just one. -

    The AFS Product Support group maintains a central CellServDB -file that includes all cells that have agreed to make their database server -machines access to other AFS cells. It is advisable to check this file -periodically for updated information. See Making Your Cell Visible to Others. - -

    An entry in the local CellServDB is one of the two requirements -for accessing a cell. The other is that the cell's -root.cell volume is mounted in the local filespace, by -convention as a subdirectory of the /afs directory. For -instructions, see To create a cellular mount point. -
    Note:The /usr/vice/etc/CellServDB file on a client machine is not the -same as the /usr/afs/etc/CellServDB file on the local disk of a -file server machine. The server version lists only the database server -machines in the server machine's home cell, because server processes -never need to contact foreign cells. It is important to update both -types of CellServDB file on all machines in the cell whenever there -is a change to your cell's database server machines. For more -information about maintaining the server version of the CellServDB -file, see Maintaining the Server CellServDB File. -
    - - - - - -

    To display the /usr/vice/etc/CellServDB file

    -
      -

    1. Use a text editor or the cat command to display the contents of -the /usr/vice/etc/CellServDB file. By default, the mode bits -on the file permit anyone to read it. -
         % cat /usr/vice/etc/CellServDB
      -
      -
    - - -

    To display the list of database server machines in kernel memory

    -
      -

    1. Issue the fs listcells command. -
         % fs listcells [&] 
      -
      -

      where listc is the shortest acceptable abbreviation of -listcells. -

      To have your shell prompt return immediately, include the ampersand -(&), which makes the command run in the background. It -can take a while to generate the complete output because the kernel stores -database server machines' IP addresses only, and the fs -command interpreter has the cell's name resolution service (such as the -Domain Name Service or a local host table) translate them into -hostnames. You can halt the command at any time by issuing an interrupt -signal such as Ctrl-c. -

      The output includes a single line for each cell, in the following -format: -

         Cell cell_name on hosts list_of_hostnames.
      -
      -

      The name service sometimes returns hostnames in uppercase letters, and if -it cannot resolve a name at all, it returns its IP address. The -following example illustrates all three possibilities: -

         % fs listcells
      -      .
      -      .
      -   Cell abc.com on hosts db1.abc.com db2.abc.com db3.abc.com
      -   Cell stateu.edu on hosts SERVERA.STATEU.EDU SERVERB.STATEU.EDU 
      -			    SERVERC.STATEU.EDU
      -   Cell ghi.org on hosts 191.255.64.111 191.255.64.112
      -      .
      -      .
      -
      -
    - - - - - - - - - - - -

    To change the list of a cell's database server machines in kernel memory

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. If you a use a central copy of the CellServDB file as a source -for client machines, verify that its directory's ACL grants you the -l (lookup), r (read), and -w (write) permissions. The conventional directory -is /afs/cell_name/common/etc. If -necessary, issue the fs listacl command, which is fully described -in Displaying ACLs. -
         # fs listacl [<dir/file path>]
      -
      - - -

    3. Issue the fs newcell command to add or change a -cell's entry in kernel memory. Repeat the command for each -cell. -
      Note:You cannot use this command to remove a cell's entry completely from -kernel memory. In the rare cases when you urgently need to prevent -access to a specific cell, you must edit the CellServDB file and -reboot the machine. -
      -
         # fs newcell <cell name> <primary servers>+ \
      -                [-linkedcell <linked cell name>]
      -
      -

      where -

      -

      n -
      Is the shortest acceptable abbreviation of newcell. -

      cell name -
      Specifies the complete Internet domain name of the cell for which to -record a new list of database server machines. -

      primary servers -
      Specifies the fully-qualified hostname or IP address in dotted-decimal -format for each database server machine in the cell. The list you -provide completely replaces the existing list. -

      -linkedcell -
      Specifies the complete Internet domain name of the AFS cell to link to a -DCE cell for the purposes of DFS fileset location. You can use this -argument if the machine's AFS users access DFS via the AFS/DFS Migration -Toolkit Protocol Translator. For instructions, see the AFS/DFS -Migration Toolkit Administration Guide and Reference. -
      -

    4. Add or edit the cell's entry in the local -/usr/vice/etc/CellServDB file, using one of the following three -methods. In each case, be sure to obey the formatting requirements -described in The Format of the CellServDB file. -
        -

      • If you maintain a central source version of the CellServDB file -and use the package program, first use a text editor to alter the -central copy of the file. Then issue the package command to -transfer the contents of the file to the local machine. For complete -instructions, see Running the package program. -
           # /etc/package -v -c <name of package file>
        -
        -

      • If you maintain a central source CellServDB file but do not use -the package program, first use a text editor to alter the central -copy of the file. Then use a copying command such as the cp -command to copy it to the local /usr/vice/etc/CellServDB -file. -

      • If you do not use a central source CellServDB file, edit the -local machine's /usr/vice/etc/CellServDB file directly. -
      -
    -

    Determining if a Client Can Run Setuid Programs

    - - - -

    A setuid program is one whose binary file has the UNIX setuid -mode bit turned on. While a setuid program runs, the user who -initialized it assumes the local identity (UNIX UID) of the binary file's -owner, and so is granted the permissions in the local file system that pertain -to the owner. Most commonly, the issuer's assumed identity (often -referred to as effective UID) is the local superuser -root. -

    AFS does not recognize effective UID: if a setuid program accesses -AFS files and directories, it uses the current AFS identity of the user who -initialized the program, not of the program's owner. Nevertheless, -it can be useful to store setuid programs in AFS for use on more than one -client machine. AFS enables a client machine's administrator to -determine whether the local Cache Manager allows setuid programs to run or -not. -

    By default, the Cache Manager allows programs from its home cell to run -with setuid permission, but denies setuid permission to programs from foreign -cells. A program belongs to the same cell as the file server machine -that houses the volume in which the file resides, as specified in the file -server machine's /usr/afs/etc/ThisCell file. The Cache -Manager determines its own home cell by reading the -/usr/vice/etc/ThisCell file at initialization. -

    To change a cell's setuid status with respect to the local machine, -become the local superuser root and issue the fs setcell -command. To determine a cell's current setuid status, use the -fs getcellstatus command. -

    When you issue the fs setcell command, you directly alter a -cell's setuid status as recorded in kernel memory, so rebooting the -machine is not necessary. However, nondefault settings do not persist -across reboots of the machine unless you add the appropriate fs -setcell command to the machine's AFS initialization file. -

    Only members of the system:administrators group can turn -on the setuid mode bit on an AFS file or directory. When the setuid -mode bit is turned on, the UNIX ls -l command displays the third -user mode bit as an s instead of an x, but for an AFS -file or directory, the s appears only if setuid permission is -enabled for the cell in which the file resides. - - -

    To determine a cell's setuid status

    -
      -

    1. Issue the fs getcellstatus command to check the setuid status -of each desired cell. -
         % fs getcellstatus <cell name>
      -
      -

      where -

      -

      getce -
      Is the shortest acceptable abbreviation of -getcellstatus. -

      cell name -
      Names each cell for which to report setuid status. Provide the -complete Internet domain name or a shortened form that distinguishes it from -the other cells listed in the local /usr/vice/etc/CellServDB -file. -
      -
    -

    The output reports the setuid status of each cell: -

      -

    • the string no setuid allowed indicates that the Cache Manager -does not allow programs from the cell to run with setuid permission -

    • setuid allowed indicates that the Cache Manager allows programs -from the cell to run with setuid permission -
    - - -

    To change a cell's setuid status

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs setcell command to change the setuid status of the -cell. -
         # fs setcell <cell name>+ [-suid] [-nosuid]
      -
      -

      where -

      -

      setce -
      Is the shortest acceptable abbreviation of setcell. -

      cell name -
      Names each cell for which to change setuid status as specified by the --suid or -nosuid flag. Provide each cell's -complete Internet domain name or a shortened form that distinguishes it from -the other cells listed in the local /usr/vice/etc/CellServDB -file. -

      -suid -
      Enables programs from each specified cell to execute with setuid -permission. Provide this flag or the -nosuid flag, or omit -both to disable setuid permission for each cell. -

      -nosuid -
      Prevents programs from each specified cell from executing with setuid -permission. Provide this flag or the -suid flag, or omit -both to disable setuid permission for each cell. -
      -
    -

    Setting the File Server Probe Interval

    - - - -

    The Cache Manager periodically sends a probe to server machines to verify -that they are still accessible. Specifically, it probes the database -server machines in its cell and those file servers that house data it has -cached. -

    If a server process does not respond to a probe, the client machine assumes -that it is inaccessible. By default, the interval between probes is -three minutes, so it can take up to three minutes for a client to recognize -that a server process is once again accessible after it was -inaccessible. -

    To adjust the probe interval, include the -interval argument to -the fs checkservers command while logged in as the local superuser -root. The new interval setting persists until you again -issue the command or reboot the machine, at which time the setting returns to -the default. To preserve a nondefault setting across reboots, include -the appropriate fs checkservers command in the machine's AFS -initialization file. -

    To set a client's file server probe interval

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs checkservers command with the -interval -argument. - - -

      -

         # fs checkservers -interval <seconds between probes>
      -
      -

      where -

      -

      checks -
      Is the shortest acceptable abbreviation of checkservers. -

      -interval -
      Specifies the number of seconds between probes. Provide an integer -value greater than zero. -
      -
    -

    Setting a Client Machine's Cell Membership

    - - - - - - -

    Each client machine belongs to a particular cell, as named in the -/usr/vice/etc/ThisCell on its local disk. The machine's -cell membership determines three defaults important to users of the -machine: -

      -

    • The cell for which users of the machine obtain tokens (authenticate) when -they use the login program or issue the klog -command. There are two effects: -
        -

      • The klog program and AFS-modified login utilities contact an -Authentication Server in the cell named in the ThisCell -file. -

      • The klog program and AFS-modified login utilities combine the -contents of the ThisCell file with the password that the user -provides, generating an encryption key from the combination. The -user's entry in the Authentication Database includes an encryption key -also generated from the combination of password and cell name. If the -cell name in the ThisCell file is incorrect, users cannot -authenticate even if they provide the correct password. -
      -

    • The cell the Cache Manager considers its local, or home, cell. The -Cache Manager allows programs from its local cell to run with setuid -permission, but not programs from foreign cells, as discussed further in Determining if a Client Can Run Setuid Programs. -

    • The default database server machines that are contacted by the AFS command -interpreters running on this machine. -
    -

    To display a client machine's cell membership

    -
      -

    1. Use a text editor or the cat command to display the contents of -the /usr/vice/etc/ThisCell file. -
         % cat /usr/vice/etc/ThisCell
      -
      -
    -

    To set a client machine's cell membership

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Using a text editor, replace the cell name in the -/usr/vice/etc/ThisCell file. -

    3. (Optional.) Reboot the machine to enable the Cache -Manager to use the new cell name immediately; the appropriate command -depends on the machine's system type. The klog program, -AFS-modified login utilities, and the AFS command interpreters use the new -cell name the next time they are invoked; no reboot is necessary. -
         # sync
      -   
      -   # shutdown
      -
      -
    -

    Forcing the Update of Cached Data

    - - - - - - - - -

    AFS's callback mechanism normally guarantees that the Cache Manager -provides the most current version of a file or directory to the application -programs running on its machine. However, you can force the Cache -Manager to discard (flush) cached data so that the next time an application -program requests it, the Cache Manager fetches the latest version available at -the File Server. -

    You can control how many file system elements to flush at a time: -

      -

    • To flush only specific files or directories, use the fs flush -command. This command forces the Cache Manager to discard the data and -status information it has cached from the specified files or -directories. It does not discard information from an application -program's buffer or information that has been altered locally (changes -made in the cache but not yet saved permanently to the File Server). -However, the next time an application requests the element's data or -status information, the Cache Manager has to contact the File Server to get -it. -

    • To flush everything cached from a certain volume, use the fs -flushvolume command. This command works like the fs -flush command, but differs in two ways: -
        -

      • The Cache Manager discards data for all elements in the cache that come -from the same volume as the specified files or directories. -

      • The Cache Manager discards only data, not status information. This -difference has little practical effect, but can lead to different output from -the ls command when the two different commands are used to flush -the same element. -
      -
    -

    In addition to callbacks, the Cache Manager has a mechanism for tracking -other kinds of possible changes, such as changes in a volume's -location. If a volume moves and the Cache Manager has not accessed any -data in it for a long time, the Cache Manager's volume location record -can be wrong. To resynchronize it, use the fs checkvolumes -command. When you issue the command, the Cache Manager creates a new -table of mappings between volume names, ID numbers, and locations. This -forces the Cache Manager to reference newly relocated and renamed volumes -before it can provide data from them. -

    It is also possible for information about mount points to become corrupted -in the cache. Symptoms of a corrupted mount point included garbled -output from the fs lsmount command, and failed attempts to change -directory to or list the contents of a mount point. Use the fs -flushmount command to discard a corrupted mount point. The Cache -Manager must refetch the mount point the next time it crosses it in a -pathname. (The Cache Manager periodically refreshes cached mount -points, but the only other way to discard them immediately is to reinitialize -the Cache Manager by rebooting the machine. - - -

    To flush certain files or directories

    -
      -

    1. Issue the fs flush command. -
         % fs flush [<dir/file path>+]
      -
      -

      where -

      -

      flush -
      Must be typed in full. -

      dir/file path -
      Names each file or directory structure to flush from the cache. -Omit this argument to flush the current working directory. Flushing a -directory structure does not flush any files or subdirectories cached from -it. -
      -
    - - -

    To flush all data from a volume

    -
      -

    1. Issue the fs flushvolume command. -
        % fs flushvolume [<dir/file path>+]
      -
      -

      where -

      -

      flushv -
      Is the shortest acceptable abbreviation of flushvolume. -

      dir/file path -
      Names a file or directory from each volume to flush from the cache. -The Cache Manager flushes everything in the cache that it has fetched from the -same volume. Omit this argument to flush all cached data fetched from -the volume that contains the current working directory. -
      -
    - - -

    To force the Cache Manager to notice other volume changes

    -
      -

    1. Issue the fs checkvolumes command. -
         % fs checkvolumes
      -
      -

      where checkv is the shortest acceptable abbreviation of -checkvolumes. -

    -

    The following command confirms that the command completed -successfully: -

       All volumeID/name mappings checked.
    -
    - - -

    To flush one or more mount points

    -
      -

    1. Issue the fs flushmount command. -
         % fs flush [<dir/file path>+]
      -
      -

      where -

      -

      flushm -
      Is the shortest acceptable abbreviation of flushmount. -

      dir/file path -
      Names each mount point to flush from the cache. Omit this argument -to flush the current working directory. Files or subdirectories cached -from the associated volume are unaffected. -
      -
    -

    Maintaining Server Preference Ranks

    - - - - - - -

    As mentioned in the introduction to this chapter, AFS uses client-side data -caching and callbacks to reduce the amount of network traffic in your -cell. The Cache Manager also tries to make its use of the network as -efficient as possible by assigning preference ranks to server -machines based on their network proximity to the local machine. The -ranks bias the Cache Manager to fetch information from the server machines -that are on its own subnetwork or network rather than on other networks, if -possible. Reducing the network distance that data travels between -client and server machine tends to reduce network traffic and speed the Cache -Manager's delivery of data to applications. -

    The Cache Manager stores two separate sets of preference ranks in kernel -memory. The first set of ranks applies to machines that run the Volume -Location (VL) Server process, hereafter referred to as VL Server -machines. The second set of ranks applies to machines that run -the File Server process, hereafter referred to as file server -machines. This section explains how the Cache Manager sets -default ranks, how to use the fs setserverprefs command to change -the defaults or set new ranks, and how to use the fs getserverprefs -command to display the current set of ranks. -

    How the Cache Manager Sets Default Ranks

    -

    As the afsd program initializes the Cache Manager, it -assigns a preference rank of 10,000 to each of the VL Server machines listed -in the local /usr/vice/etc/CellServDB file. It then -randomizes the ranks by adding an integer randomly chosen from the range 0 -(zero) to 126. It avoids assigning the same rank to machines in one -cell, but it is possible for machines from different cells to have the same -rank. This does not present a problem in use, because the Cache Manager -compares the ranks of only one cell's database server machines at a -time. Although AFS supports the use of multihomed database server -machines, the Cache Manager only uses the single address listed for each -database server machine in the local /usr/vice/etc/CellServDB -file. Only Ubik can take advantage of a multihomed database server -machine's multiple interfaces. -

    The Cache Manager assigns preference ranks to a file server machine when it -obtains the server's VLDB record from the VL Server, the first time that -it accesses a volume that resides on the machine. If the machine is -multihomed, the Cache Manager assigns a distinct rank to each of its -interfaces (up to the number of interfaces that the VLDB can store for each -machine, which is specified in the AFS Release Notes). The -Cache Manager compares the interface's IP address to the local -machine's address and applies the following algorithm: -

      -

    • If the local machine is a file server machine, the base rank for each of -its interfaces is 5,000. -

    • If the file server machine interface is on the same subnetwork as the -local machine, its base rank is 20,000. -

    • If the file server machine interface is on the same network as the local -machine, or is at the distant end of a point-to-point link with the local -machine, its base rank is 30,000. -

    • If the file server machine interface is on a different network than the -local machine, or the Cache Manager cannot obtain network information about -it, its base rank is 40,000. -
    -

    If the client machine has only one interface, the Cache Manager compares it -to the server interface's IP address and sets a rank according to the -algorithm. If the client machine is multihomed, the Cache Manager -compares each of the local interface addresses to the server interface, and -assigns to the server interface the lowest rank that results from comparing it -to all of the client interfaces. -

    After assigning a base rank to a file server machine interface, the Cache -Manager adds to it a number randomly chosen from the range 0 (zero) to -15. As an example, a file server machine interface in the same -subnetwork as the local machine receives a base rank of 20,000, but the Cache -Manager records the actual rank as an integer between 20,000 and -20,015. This process reduces the number of interfaces that have exactly -the same rank. As with VL Server machine ranks, it is possible for file -server machine interfaces from foreign cells to have the same rank as -interfaces in the local cell, but this does not present a problem. Only -the relative ranks of the interfaces that house a specific volume are -relevant, and AFS supports storage of a volume in only one cell at a -time. -

    How the Cache Manager Uses Preference Ranks

    -

    Each preference rank pairs an interface's IP address with an -integer that can range from 1 to 65,534. A lower rank (lower number) -indicates a stronger preference. Once set, a rank persists until the -machine reboots, or until you use the fs setserverprefs command to -change it. -

    The Cache Manager uses VL Server machine ranks when it needs to fetch -volume location information from a cell. It compares the ranks for the -cell's VL Server machines and attempts to contact the VL Server process -on the machine with the best (lowest integer) rank. If it cannot reach -that VL Server, it tries to contact the VL Server with the next best rank, and -so on. If all of a cell's VL Server machines are inaccessible, the -Cache Manager cannot fetch data from the cell. -

    Similarly, when the Cache Manager needs to fetch data from a volume, it -compares the ranks for the interfaces of machines that house the volume, and -attempts to contact the interface that has the best rank. If it cannot -reach the fileserver process via that interface, it tries to -contact the interface with the next best integer rank, and so on. If it -cannot reach any of the interfaces for machines that house the volume, it -cannot fetch data from the volume. -

    Displaying and Setting Preference Ranks

    -

    To display the file server machine ranks that the Cache Manager is -using, use the fs getserverprefs command. Include the --vlservers flag to display VL Server machine ranks instead. -By default, the output appears on the standard output stream (stdout), but you -can write it to a file instead by including the -file -argument. -

    The Cache Manager stores IP addresses rather than hostnames in its kernel -list of ranks, but by default the output identifies interfaces by hostname -after calling a translation routine that refers to either the cell's name -service (such as the Domain Name Server) or the local host table. If an -IP address appears in this case, it is because the translation attempt -failed. To bypass the translation step and display IP addresses rather -than hostnames, include the -numeric flag. This can -significantly speed up the output. -

    You can use the fs setserverprefs command to reset an existing -preference rank, or to set the initial rank of a file server machine interface -or VL Server machine for which the Cache Manager has no rank. The ranks -you set persist until the machine reboots or until you issue the fs -setserverprefs command again. To make a rank persist across a -reboot, place the appropriate fs setserverprefs command in the -machine's AFS initialization file. -

    As with default ranks, the Cache Manager adds a randomly chosen integer to -each rank range that you assign. For file server machine interfaces, -the randomizing number is from the range 0 (zero) to 15; for VL Server -machines, it is from the range 0 (zero) to 126. For example, if you -assign a rank of 15,000 to a file server machine interface, the Cache Manager -stores an integer between 15,000 to 15,015. -

    To assign VL Server machine ranks, list them after the -vlserver -argument to the fs setserverprefs command. -

    To assign file server machine ranks, use or more of the three possible -methods: -

      -

    1. List them after the -servers argument on the command -line. -

    2. Record them in a file and name it with the -file -argument. You can easily generate a file with the proper format by -including the -file argument to the fs getserverprefs -command. -

    3. Provide them via the standard input stream, by including the --stdin flag. This enables you to feed in values directly -from a command or script that generates preferences using an algorithm -appropriate for your cell. It must generate them in the proper format, -with one or more spaces between each pair and between the two parts of the -pair. The AFS distribution does not include such a script, so you must -write one if you want to use this method. -
    -

    You can combine any of the -servers, -file, and --stdin options on the same command line if you wish. If more -than one of them specifies a rank for the same interface, the one assigned -with the -servers argument takes precedence. You can also -provide the -vlservers argument on the same command line to set VL -Server machine ranks at the same time as file server machine ranks. -

    The fs command interpreter does not verify hostnames or IP -addresses, and so willingly stores ranks for hostnames and addresses that -don't actually exist. The Cache Manager never uses such ranks -unless the same VLDB record for a server machine records the same incorrect -information. - - -

    To display server preference ranks

    -
      -

    1. Issue the fs getserverprefs command to display the Cache -Manager's preference ranks for file server machines or VL Server -machines. -
         % fs getserverprefs [-file <output to named file>] [-numeric] [-vlservers]
      -
      -

      where -

      -

      gp -
      Is an acceptable alias for getserverprefs (gets is -the shortest acceptable abbreviation). -

      -file -
      Specifies the pathname of the file to which to write the list of -ranks. Omit this argument to display the list on the standard output -stream (stdout). -

      -numeric -
      Displays the IP address, rather than the hostname, of each ranked machine -interface. Omit this flag to have the addresses translated into -hostnames, which takes longer. -

      -vlservers -
      Displays ranks for VL Server machines rather than file server -machines. -
      -

      The following example displays file server machine ranks. The --numeric flag is not used, so the appearance of an IP address -indicates that is not currently possible to translate it to a hostname. -

      -

         % fs gp
      -   fs5.abc.com         20000
      -   fs1.abc.com         30014
      -   server1.stateu.edu  40011
      -   fs3.abc.com         20001
      -   fs4.abc.com         30001
      -   192.12.106.120      40002
      -   192.12.106.119      40001
      -      .   .   .   .   .     . .
      -
      -
    - - - -

    To set server preference ranks

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs setserverprefs command to set the Cache -Manager's preference ranks for one or more file server machines or VL -Server machines. -
         # fs setserverprefs [-servers <fileserver names and ranks>+]  \
      -                       [-vlservers <VL server names and ranks>+]  \
      -                       [-file <input from named file>] [-stdin]
      -
      -

      where -

      -

      sp -
      Is an acceptable alias for setserverprefs (sets is -the shortest acceptable abbreviation). -

      -servers -
      Specifies one or more pairs of file server machine interface and -rank. Identify each interface by its fully-qualified hostname or IP -address in dotted decimal format. Acceptable ranks are the integers -from 1 to 65534. Separate the parts of a pair, -and the pairs from one another, with one or more spaces. -

      -vlservers -
      Specifies one or more pairs of VL Server machine and rank. Identify -each machine by its fully-qualified hostname or IP address in dotted decimal -format. Acceptable ranks are the integers from 1 to -65534. -

      -file -
      Specifies the pathname of a file that contains one more pairs of file -server machine interface and rank. Place each pair on its own line in -the file. Use the same format for interfaces and ranks as with the --servers argument. -

      -stdin -
      Indicates that pairs of file server machine interface and rank are being -provided via the standard input stream (stdin). The program or script -that generates the pairs must format them in the same manner as for the --servers argument. -
      -
    -

    Managing Multihomed Client Machines

    - - - - - - -

    The File Server can choose the interface to which to send a message when it -initiates communication with the Cache Manager on a multihomed client machine -(one with more than one network interface and IP address). If that -interface is inaccessible, it automatically switches to an alternate. -This improves AFS performance, because it means that the outage of an -interface does not interrupt communication between File Server and Cache -Manager. -

    The File Server can choose the client interface when it sends two types of -messages: -

      -

    • A message to break the callback that the Cache Manager holds on a cached -file -

    • A ping message to check that the Cache Manager is still -accessible and responding; the File Server sends such a message every few -minutes -
    -

    (The File Server does not choose which client interface to respond to when -filling a Cache Manager's request for AFS data. In that case, it -always responds to the client interface via which the Cache Manager sent the -request.) -

    The Cache Manager compiles the list of eligible interfaces on its client -machine automatically as it initializes, and records them in kernel -memory. When the Cache Manager first establishes a connection with the -File Server, it sends along the list of interface addresses. The File -Server records the addresses, and uses the one at the top of the list when it -needs to break a callback or send a ping to the Cache Manager. If that -interface is inaccessible, the File Server simultaneously sends a message to -all of the other interfaces in the list. Whichever interface replies -first is the one to which the File Server sends future messages. -

    You can control which addresses the Cache Manager registers with File -Servers by listing them in two files in the /usr/vice/etc directory -on the client machine's local disk: NetInfo and -NetRestrict. If the NetInfo file exists when the -Cache Manager initializes, the Cache Manager uses its contents as the basis -for the list of interfaces. Otherwise, the Cache Manager uses the list -of interfaces configured with the operating system. It then removes -from the list any addresses that appear in the -/usr/vice/etc/NetRestrict file, if it exists. The Cache -Manager records the resulting list in kernel memory. -

    You can also use the fs setclientaddrs command to change the -list of addresses stored in the Cache Manager's kernel memory, without -rebooting the client machine. The list of addresses you provide on the -command line completely replaces the current list in kernel memory. The -changes you make persist only until the client machine reboots, -however. To preserve the revised list across reboots, list the -interfaces in the NetInfo file (and if appropriate, the -NetRestrict file) in the local /usr/vice/etc -directory. (You can also place the appropriate fs -setclientaddrs command in the machine's AFS initialization script, -but that is less efficient: by the time the Cache Manager reads the -command in the script, it has already compiled a list of interfaces.) -

    To display the list of addresses that the Cache Manager is currently -registering with File Servers, use the fs getclientaddrs -command. -

    Keep the following in mind when you change the NetInfo or -NetRestrict file, or issue the fs getclientaddrs or -fs setclientaddrs commands: -

      -

    • When you issue the fs setclientaddrs command, the revised list -of addresses does not propagate automatically to File Servers with which the -Cache Manager has already established a connection. They continue to -use the list that the Cache Manager registered with them when it first -established a connection. To force previously contacted File Servers to -use the revised list, you must either reboot each file server machine, or -reboot the client machine after changing its NetInfo file, -NetRestrict file, or both. -

    • The fs command interpreter verifies that each of the addresses -you specify on the fs setclientaddrs command line is actually -configured with the client machine's operating system. If it is -not, the command fails with an error message that marks the address as a -Nonexistent interface. -

    • As previously noted, the File Server does not use the registered list of -addresses when it responds to the Cache Manager's request for data (as -opposed to initiating communication itself). It always attempts to send -its reply to the interface from which the Cache Manager sent the -request. If the reply attempt fails, the File Server selects an -alternate route for resending the reply according to its server machine's -network routing configuration, not the list of addresses registered by the -Cache Manager. -

    • The Cache Manager does not use the list of interfaces when choosing the -interface via which to establish a connection to a File Server. -

    • The list of addresses that the fs getclientaddrs command -displays is not necessarily the one that a specific File Server is using, if -an administrator has issued the fs setclientaddrs command since the -Cache Manager first contacted that File Server. It determines only -which addresses the Cache Manager registers when connecting to File Servers in -future. -
    - - - - -

    To create or edit the client NetInfo file

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Using a text editor, open the /usr/vice/etc/NetInfo -file. Place one IP address in dotted decimal format (for example, -192.12.107.33) on each line. On the -first line, put the address that you want each File Server to use -initially. The order of the remaining machines does not matter, because -if an RPC to the first interface fails, the File Server simultaneously sends -RPCs to all of the other interfaces in the list. Whichever interface -replies first is the one to which the File Server then sends pings and RPCs to -break callbacks. -

    3. If you want the Cache Manager to start using the revised list immediately, -either reboot the machine, or use the fs setclientaddrs command to -create the same list of addresses in kernel memory directly. -
    - - - - -

    To create or edit the client NetRestrict file

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Using a text editor, open the /usr/vice/etc/NetRestrict -file. Place one IP address in dotted decimal format on each -line. The order of the addresses is not significant. Use the -value 255 as a wildcard that represents all possible addresses in -that field. For example, the entry -192.12.105.255 indicates that the Cache -Manager does not register any of the addresses in the 192.12.105 -subnet. -

    3. If you want the Cache Manager to start using the revised list immediately, -either reboot the machine, or use the fs setclientaddrs command to -set a list of addresses that does not included the prohibited ones. -
    - - -

    To display the list of addresses from kernel memory

    -
      -

    1. Issue the fs getclientaddrs command. -
         % fs getclientaddrs 
      -
      -

      where gc is an acceptable alias for getclientaddrs -(getcl is the shortest acceptable abbreviation). -

    -

    The output lists each IP address on its own line, in dotted decimal -format. - - -

    To set the list of addresses in kernel memory

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs setclientaddrs command to replace the list of -addresses currently in kernel memory with a new list. -
         # fs setclientaddrs [-address <client network interfaces>+]
      -
      -

      where -

      -

      sc -
      Is an acceptable alias for setclientaddrs (setcl is -the shortest acceptable abbreviation). -

      -address -
      Specifies one or more IP addresses in dotted decimal format (hostnames are -not acceptable). Separate each address with one or more spaces. -
      -
    -

    Controlling the Display of Warning and Informational Messages

    - - -

    By default, the Cache Manager generates two types of warning and -informational messages: -

      -

    • It sends user messages, which provide user-level status and -warning information, to user screens. -

    • It sends console messages, which provide system-level status -and warning information, to the client machine's designated -console. -
    -

    You can use the fs messages command to control whether the Cache -Manager displays either type of message, both types, or neither. It is -best not to disable messages completely, because they provide useful -information. -

    If you want to monitor Cache Manager status and performance more actively, -you can use the afsmonitor program to collect an extensive set of -statistics (it also gathers File Server statistics). If you experience -performance problems, you can use fstrace suite of commands to -gather a low-level trace of Cache Manager operations, which the AFS Support -and Development groups can analyze to help solve your problem. To learn -about both utilities, see Monitoring and Auditing AFS Performance. - - -

    To control the display of warning and status messages

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs messages command, using the -show -argument to specify the type of messages to be displayed. -
         # fs messages -show <user|console|all|none>
      -
      -

      where -

      -

      me -
      Is the shortest acceptable abbreviation of messages. -

      -show -
      Specifies the types of messages to display. Choose one of the -following values: -
      -

      user -
      Sends user messages to user screens. -

      console -
      Sends console messages to the console. -

      all -
      Sends user messages to user screens and console messages to the console -(the default if the -show argument is omitted). -

      none -
      Disables messages completely. -
      -
      -
    -

    Displaying and Setting the System Type Name

    - - -

    The Cache Manager stores the system type name of the local client machine -in kernel memory. It reads in the default value from a hardcoded -definition in the AFS client software. -

    The Cache Manager uses the system name as a substitute for the -@sys variable in AFS pathnames. The variable is useful when -creating a symbolic link from the local disk to an AFS directory that houses -binaries for the client machine's system type. Because the -@sys variable automatically steers the Cache Manager to the -appropriate directory, you can create the same symbolic link on client -machines of different system types. (You can even automate the creation -operation by using the package utility described in Configuring Client Machines with the package Program.) The link also remains valid when you upgrade the -machine to a new system type. -

    Configuration is simplest if you use the system type names that AFS -assigns. For a list, see the AFS Release Notes. -

    To display the system name stored in kernel memory, use the sys -or fs sysname command. To change the name, add the latter -command's -newsys argument. - - - - -

    To display the system type name

    -
      -

    1. Issue the fs sysname or sys command. -
         % fs sysname 
      -   
      -   % sys
      -
      -
    -

    The output of the fs sysname command has the following -format: -

       Current sysname is 'system_name'
    -
    -

    The sys command displays the system_name string with no -other text. -

    To change the system type name

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs sysname command, using the -newsys -argument to specify the new name. -
         # fs sysname <new sysname>
      -
      -

      where -

      -

      sys -
      Is the shortest acceptable abbreviation of sysname. -

      new sysname -
      Specifies the new system type name. -
      -
    -

    Enabling Asynchronous Writes

    - - - -

    By default, the Cache Manager writes all data to the File Server -immediately and synchronously when an application program closes a -file. That is, the close system call does not return until -the Cache Manager has actually written all of the cached data from the file -back to the File Server. You can enable the Cache Manager to write -files asynchronously by specifying the number of kilobytes of a file that can -remain to be written to the File Server when the Cache Manager returns control -to the application. -

    Enabling asynchronous writes can be helpful to users who commonly work with -very large files, because it usually means that the application appears to -perform faster. However, it introduces some complications. It is -best not to enable asynchronous writes unless the machine's users are -sophisticated enough to understand the potential problems and how to avoid -them. The complications include the following: -

      -

    • In most cases, the Cache Manager returns control to applications earlier -than it does by default, but it is not guaranteed to do so. Users -cannot always expect faster performance. -

    • If an asynchronous write fails, there is no way to notify the application, -because the close system call has already returned with a code -indicating success. -

    • Asynchronous writing increases the possibility that the user fails to -notice when a write operation makes a volume exceed its quota. As -always, the portion of the file that exceeds the quota is lost, as indicated -by a message like the following: -
         No space left on device
      -
      -

      To avoid losing data because of insufficient quota, before closing a file -users must verify that the volume housing the file has enough free space to -accommodate it. -

    -

    When you enable asynchronous writes by issuing the fs -storebehind command, you set the number of kilobytes of a file that can -still remain to be written to the File Server when the Cache Manager returns -control to the application program. You can apply the setting either to -all files manipulated by applications running on the machine, or only to -certain files: -

      -

    • The setting that applies to all files is called the default store -asynchrony for the machine, and persists until the machine -reboots. If, for example, you set the default store asynchrony to 10 -KB, it means that when an application closes a file, the Cache Manager can -return control to the application as soon as no more than 10 KB of a file that -the application has closed remain to be written to the File Server. -

    • The setting for an individual file overrides the default store asynchrony -and persists as long as there is an entry for the file in the internal table -that the Cache Manager uses to track information about files. In -general, such an entry persists at least until an application closes the file -or exits completely, but the Cache Manager is free to recycle the entry if the -file is inactive and it needs to free up slots in the table. To be sure -the entry exists in the table, issue the fs storebehind command -shortly before closing the file. -
    - - -

    To set the default store asynchrony

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs storebehind command with the -allfiles -argument. -
         # fs storebehind -allfiles  <new default (KB)> [-verbose]
      -
      -

      where -

      -

      st -
      Is the shortest acceptable abbreviation of storebehind. -

      -allfiles -
      Sets the number of kilobytes of data that can remain to be written to the -File Server when the Cache Manager returns control to the application that -closed a file. -

      -verbose -
      Produces a message that confirms the new setting. -
      -
    - - -

    To set the store asynchrony for one or more files

    -
      -

    1. Verify that you have the w (write) permission on the -access control list (ACL) of each file for which you are setting the store -asynchrony, by issuing the fs listacl command, which is described -fully in Displaying ACLs. -
         % fs listacl dir/file path
      -
      -

      Alternatively, become the local superuser root on the client -machine, if you are not already, by issuing the su command. -

         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs storebehind command with the -kbytes -and -files arguments. -
         # fs storebehind -kbytes <asynchrony for specified names> \
      -                    -files <specific pathnames>+  \
      -                    [-verbose]
      -
      -

      where -

      -

      st -
      Is the shortest acceptable abbreviation of storebehind. -

      -kbytes -
      Sets the number of kilobytes of data that can remain to be written to the -File Server when the Cache Manager returns control to the application that -closed a file named by the -files argument. -

      -files -
      Specifies each file for which to set a store asynchrony that overrides the -default. Partial pathnames are interpreted relative to the current -working directory. -

      -verbose -
      Produces a message that confirms that new setting. -
      -
    - - -

    To display the default store asynchrony

    -
      -

    1. Issue the fs storebehind command with no arguments, or with the --verbose flag only. -
         % fs storebehind  [-verbose]
      -
      -

      where -

      -

      st -
      Is the shortest acceptable abbreviation of storebehind. -

      -verbose -
      Produces output that reports the default store asynchrony. -
      -
    - - -

    To display the store asynchrony for one or more files

    -
      -

    1. Issue the fs storebehind command with the -files -argument only. -
         % fs storebehind -files <specific pathnames>+ 
      -
      -

      where -

      -

      st -
      Is the shortest acceptable abbreviation of storebehind. -

      -files -
      Specifies each file for which to display the store asynchrony. -Partial pathnames are interpreted relative to the current working -directory. -
      -
    -

    The output lists each file separately. If a value has previously -been set for the specified files, the output reports the following: -

       Will store up to y kbytes of file asynchronously.
    -   Default store asynchrony is x kbytes.
    -
    -

    If the default store asynchrony applies to a file (because you have not set -a -kbytes value for it), the output reports the following: -

       Will store file according to default.
    -   Default store asynchrony is x kbytes.
    -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd016.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd016.htm deleted file mode 100755 index eda360e35..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd016.htm +++ /dev/null @@ -1,1148 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Configuring Client Machines with the package Program

    -

    The package program automates many aspects of the -client configuration process. With the package program, you -can easily configure the local disk of numerous clients by defining global -configuration files. - - - - -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands or instructions in a prototype file: -
    - - - - - - - - -
    Configure a client machine's local disk -package -
    Define directory -D [update_code] directory owner -group mode_bits -
    Define file -F [update_code] file source_file -[owner group mode_bits] -
    Define symbolic link -L [update_code] link actual_file -[owner group mode_bits] -
    Define block special device -B device_name major_device_number -minor_device_number owner group mode_bits -
    Define character special device -C device_name major_device_number -minor_device_number owner group mode_bits -
    Define socket -S socket_name [owner group -mode_bits] -
    -


    Using the package Program

    - - -

    The package program uses system-independent prototype -files to define a standard disk configuration; a prototype file -indicates which files reside on the local client disk, which files are links -into AFS, etc. The prototype files are then compiled into -configuration files for each different system type. -

    Not all client machines have the same configuration. If desired, you -can create different prototype files for different client functions (print -server, regular client, etc.). -

    The package program compares the contents of a local client disk -with the configuration file. If there are any differences, the -package program makes the necessary updates to the local disk by -copying the files from AFS onto the disk. The package -program can also be configured to delete files that are not part of the system -configuration or automatically reboot the client when certain files (such as -the dkload file) have been updated. -

    The package program does require that you take some time to -prepare the prototype files, but it provides the following benefits: -

      -

    • You no longer need to configure each machine individually; the -prototype configuration file applies to all machines. -

    • You can change the configuration of machines simply by changing the -prototype file and rebooting the clients. -

    • Disk organization is uniform across a set of machines. -

    • The configuration files serve as a record of files on the disk and -symbolic links into AFS. -
    -

    Using Package on File Server Machines

    -

    While the package program was designed for use on client -machines, it can also be used to configure a file server machine's -disk. However, if any of the files referred to in a configuration file -reside in volumes on the file server, the package program cannot -access the volumes during reboot (and until the File Server process and Volume -Server process start up again). -

    Since the package program aborts when it cannot access a file, -you need to eliminate references to files in AFS that reside in volumes on the -file server machine. Because of these constraints, the remainder of -this chapter assumes the package program is being used for client -configurations. -


    Package Overview

    -

    There are three main steps to follow before running the -package program: -

      -

    1. Preparing function-specific prototype files (and any included -library files). -

    2. Modifying the package Makefile and compiling -prototype files into system-specific configuration files. -

    3. Modifying client machines to run the appropriate package -configuration file automatically. -
    -

    The following sections summarize these steps. -

    Preparing Prototype Files

    - - -

    Begin by listing the different functions or roles client machines perform -and the local disk configurations that support those functions. Example -roles include a standard client that provides AFS access, a print server that -drives a printer, and a backup machine on which you issue commands from the -backup suite. Create a different prototype file -for each role. -

    A prototype file defines the disk configuration that supports a specific -role. Usually, prototype files are function-specific, but system -independent; system-specific values can be defined using variables and -library files. Then, when you modify a variable or library file, the -change gets propagated to all appropriate clients when the package -program is invoked. -

    Methods for building flexible prototype files that are easy to maintain are -presented in Example Prototype and Library Files. -

    Compiling Prototype Files

    - - - -

    Prototype files are usually system-independent, but can include -ifdef statements to satisfy the needs of different system -types. The prototype files are compiled to generate operating-system -specific versions. During compilation, the package program -selects the definitions suitable for each system type and replaces any -variables with actual values. These compiled, machine-specific files -are called configuration files. -

    Prototype files are compiled using a standard-type Makefile -file, as described in The Package Makefile File. -

    Preparing Clients

    -

    Once system-specific configuration files exist, the package -program is ready to run on the clients. You must first make the -package binary available and specify the correct configuration -file. -

    Modify the clients as described below: -

      -

    1. Create a .package file in the root ( / ) -directory of each client's local disk that defines the default -configuration file. -

    2. Make the package binary (/etc/package) available on -the local disk. -

    3. Modify the machine's initialization file (/etc/rc or -equivalent) to include a call to the package program. -
    -

    These steps are discussed more completely in Modifying Client Machines. -


    The package Directory Structure

    - -

    This section assumes that the package-related files have been -installed in three subdirectories of the -/afs/cellname/wsadmin directory: -src, lib and etc, as recommended in the -AFS Quick Beginnings. -

    These directories contain several sample prototype, library, and -configuration files, which can help to clarify how the package -program works. However, they are not necessarily suitable for use in -your cell; you must modify them for your needs. -

    The src directory

    -

    The src directory contains some sample prototype -files (used to build the configuration files), the Makefile file -used to build them, and the resulting compiled configuration files. -

    Prototype files have names of the form -function.proto. For example, a -minimal.proto file defines the minimum set of library files -need to run AFS and astaff.dkload.proto file defines -a client configuration that uses the a dynamic kernel loading program. -Prototype files can also contain definitions for system administrative files, -such as a hosts.equiv file. -

    The Makefile file is used to compile the system-independent -prototype files into system-specific configuration files. To learn how -to modify this file for use in your cell, see The Package Makefile File. -

    Configuration files are the compiled version of the prototype files and are -named function.sysname. -Configuration files also appear in the etc subdirectory, which the -package program accesses when configuring disks. -

    The lib directory

    -

    The lib directory contains many of the example library files -referred to in prototype files. For example, the -base.generic file is a system-independent file which -includes a definition of the cell name, system options, and variables; -these are used to set the owner, group, and -mode_bits fields in the file and the symbolic link -definitions. -

    The etc directory

    -

    The etc directory contains the system-specific configuration -files built from the prototype files in the src -subdirectory. The package program uses the configuration -files in the etc directory to configure disks. -

    Some of the example files include minimal and staff -prototype files compiled for different system types. -


    Example Prototype and Library Files

    - - -

    A prototype file is a template that defines the configuration of a -client's local disk. Prototype files are usually function-specific -(for example, a backup machine, print server, etc.) but -system-independent. Prototype files support the use of ifdef -statements and variables, so you can include system-specific -definitions. The actual system-specific configuration file is generated -when the prototype file is compiled. -

    The components defined in a prototype file can include the directories, -files, symbolic links, block special devices, character special devices and -sockets that need to reside on a client's local disk in order for it to -perform a specific role, such as a print server or backup machine. -Thus, we recommend that you construct a unique prototype file for each -different client function. -

    To make the package program more effective and easy to maintain, -create prototype files that are modular and generic, instead of specific, by -using library files and variables: - - -

      -

    • By creating general-purpose library files, you can include the same -library file in many prototype files. Thus, you can make global -configuration changes by modifying a single library file; you do not need -to modify each prototype file. -

    • Variables enable you to change definitions simply by changing the -variable's value. -
    -

    An Example Prototype File

    - -

    The following is part of an example prototype file that contains the -minimum definitions necessary to run AFS. A similar file called -minimal.proto can reside in your src -subdirectory. As recommended, this prototype file references library -files and does not include actual definitions. -

                .
    -            .
    -   # Package prototype for a minimal configuration.
    -   # Base components
    -   %include ${wsadmin}/lib/base.generic
    -   # Machine-specific components
    -   %ifdef rs_aix42
    -   %include ${wsadmin}/lib/rs_aix42.readonly
    -   %include ${wsadmin}/lib/rs_aix42.AFS
    -   %endif rs_aix42
    -   %ifdef alpha_dux40
    -   %include ${wsadmin}/lib/alpha_dux40.readonly
    -   %include ${wsadmin}/lib/alpha_dux40.AFS
    -   %endif alpha_dux40
    -   %ifdef sun4x_56
    -   %include ${wsadmin}/lib/sun4x_56.readonly
    -   %include ${wsadmin}/lib/sun4x_56.AFS
    -   %endif sun4x_56
    -            .
    -            .
    -
    -

    In the previous example, the first uncommented line includes the -/lib/base.generic library file. This library file can -contain definitions appropriate for many prototype files; the -base.generic library file can also be included in other -prototype files, like a staff.proto or -backup.proto file. An example library file appears in -the following section. -

    Note that system-specific definitions are permitted through the use of -ifdef statements and variables (for example, ${wsadmin} -is used to specify pathnames). Thus, the same prototype file can be -used to configure a machine running AIX 4.2 or Solaris 2.6, even -though they require different files, directories, symbolic links and -devices. -

    In the next uncommented lines of this example, the administrator has -constructed different library files for different system types. Each of -these is compiled into unique configuration files. For instance, the -following lines in this prototype file tell the package program to -use the library files lib/rs_aix42.readonly and -lib/rs_aix42.AFS for the configuration file when the value -rs_aix42 has been declared. (The system-type definition is -declared in the Makefile; see The Package Makefile File.) -

       %ifdef rs_aix42
    -   %include ${wsadmin}/lib/rs_aix42.readonly
    -   %include ${wsadmin}/lib/rs_aix42.AFS
    -   %endif rs_aix42
    -
    -

    Similarly, the following lines tell the package program to use -the library files lib/sun4x_56.readonly and -lib/sun4x_56.AFS when the value sun4x_56 has been -declared. -

       %ifdef sun4x_56
    -   %include ${wsadmin}/lib/sun4x_56.readonly
    -   %include ${wsadmin}/lib/sun4x_56.AFS
    -   %endif sun4x_56
    -
    -

    Example Library File

    - - - - -

    The following is part of an example library file for basic configuration -definitions. A similar file, called base.generic, can -reside in your lib subdirectory. Note that configurations -are defined using standard ifdef statements. -

                .
    -            .
    -   #
    -   # Base package definitions.
    -   #
    -   %ifndef	cell
    -   %define	cell	abc.com
    -   %endif	cell
    -   %ifndef	sys
    -   %include /etc/package.sys
    -   %endif	sys
    -   %define	${name}		${name}
    -   %define	${cpu}		${cpu}
    -   %define	${sys}		${sys}
    -   %define	${dept}		${dept}
    -   %define	${hostname}	${hostname}
    -   %ifdef	rs_aix42
    -   %	define 	AIX
    -   %	define	rootlinks
    -   %ifndef	noafsd 
    -   %	define	afsd
    -   %endif	noafsd
    -   %endif	rs_aix42
    -            .
    -            .
    -   #
    -   # Some definitions to handle common combinations of owner, group,
    -   # and protection fields.
    -   #
    -   %define	rzmode		root wheel 600
    -   %define	usermode	root wheel 666
    -   %define      systemmode	root wheel 644
    -   %define	diskmode	root wheel 644
    -   %define	ptymode		root wheel 666
    -   %define	ttymode		root wheel 666
    -            .
    -            .
    -   %define aix_rootbin	   root bin
    -   %define aix_rootprintq  root printq
    -   %define aix_rootstaff   root staff
    -   %define aix_rootsys	   root system
    -   %define aix_binbin      bin bin
    -   %define aix_binmail	   bin mail
    -   %define aix_binsys	   bin system
    -   %define aix_addsys	   adduser system
    -   %define aix_romode	   444
    -   %define aix_loginmode   544
    -   %define aix_usermode	   666
    -   %define aix_systemmode  644
    -   %define aix_textmode	   644
    -   %define aix_rwmode1	   660
    -   %define aix_allrugw	   664
    -
    -

    The following example library file uses package-specific syntax -to define files, directories, sockets, etc. Each line, called a -configuration file instruction, defines a specific component of -disk configuration. The proper syntax for these instructions is briefly -described in Package Configuration File Instruction Syntax; see the reference page for the package -configuration file in the AFS Administration Reference for detailed -descriptions. -

    In this example, the library file contains instructions specific to the -configuration of an rs_aix42 machine. You can have similar -library files in your lib subdirectory. -

                .
    -            .
    -   #
    -   # Generic configuration for an AFS rs_aix42 machine.
    -   #
    -   D	/                                       ${treemode}
    -   D	/afs
    -   FAQ	/unix	       ${machine}/unix.std 	${binmode}
    -   LA	/unix.std	/unix
    -   D	/bin					${treemode}
    -   F	/bin/as		${machine}		${binmode}
    -   F	/bin/ld		${machine}		${binmode}
    -   F	/bin/nm		${machine}		${binmode}
    -   FO	/bin/login	${afstest}		${suidmode}
    -            .
    -            .
    -   FAQ  /usr/vice/etc/ThisCell  ${common}/etc/ThisCell ${textmode}
    -   FQ	/usr/vice/etc/afsd      ${afstest}/root.client ${binmode}
    -   FA	/usr/vice/etc/bos       ${afstest}/bin/bos     ${binmode}
    -   FA	/usr/vice/etc/fs        ${afstest}/bin/fs      ${binmode}
    -
    -

    Package Configuration File Instruction Syntax

    - - -

    Within a library file, configuration file instructions are used to define -the specific disk configuration. Each instruction can be used to define -a file, directory, socket, or device on the client machine. The syntax -for each valid instruction type is described briefly here; detailed -descriptions of the fields appear in the AFS Command Reference -Manual. -

      -

    • D defines a directory -

    • F defines a file -

    • L defines a link -

    • B defines a block special device -

    • C defines a character special device -

    • S defines a socket -
    -
    Note:Each configuration instruction must appear on a single, unbroken line. -Instructions sometimes appear here on multiple lines only for -legibility. -

    The configuration file must be completely correct. If there are any -syntax errors or incorrect values, the package command interpreter -exits without executing any instruction. -

    -

    Local Files versus Symbolic Links

    -

    You can take advantage of the AFS by keeping the number of -files on the local client disk to a minimum; instead, create symbolic -links that point into AFS. This can improve machine performance by -allowing more space for caching and swapping. -

    Some files, however, must reside on the local disk, as described -below. Create these files in the prototype or library files using the -F (file) instruction, not the L (symbolic link) -instruction. -

    The following types of files must reside on the local disk of all AFS -clients: -

      -

    • Boot sequence files executed before the afsd program -runs. -

      Until afsd runs and initializes the Cache Manager, AFS is -inaccessible from the client. Any files that are executed before the -afsd program runs must reside on the local client disk. -

      For example, on a machine that uses a disk cache, the -/usr/vice/cache directory must exist when you bring up the Cache -Manager, so that there is a location to create cache files. The binary -files /etc/mount and /etc/umount must be available on -the local disk as the machine boots in order to mount the -/usr/vice/cache directory. -

      In addition, certain UNIX files, such as initialization files -(/etc/rc or equivalent) and file system mapping files -(/etc/fstab or equivalent), must reside on the local disk. -

    • Diagnostic and recovery files -

      Certain commands can be used to diagnose and recover from problems caused -by a file server outage. It is best to keep copies of the binaries for -these commands on the local disk. For example, store the bos -and fs binaries in the /usr/vice/etc directory on the -local disk, as well as in the /usr/afsws directory (which in the -conventional configuration is a symbolic link into AFS). Then, set PATH -variables so that the /usr/afsws directory appears before the -/usr/vice/etc directory. Thus, even if users cannot access -AFS (for example, due to a file server outage) they can still access copies of -the bos and fs binaries in the /usr/vice/etc -directory on the local disk. -

    • Files in the /usr/vice directory -

      The contents of the /usr/vice directory, including the cache -files in the cache subdirectory and the configuration files in the -etc subdirectory, must reside on the local disk. For a -description of the files in the directory, see Configuration and Cache-Related Files on the Local Disk. -

    - - - - -

    Defining a Directory

    -

    The D instruction defines a directory to be -created on the local disk. If a symbolic link, file, or other element -on the local disk has the same name, it is replaced with a directory. -If the directory already exists, its owner, group, and mode bits are changed -if necessary to conform with the instruction. -

    Use the following instruction to define a directory: -

       D[update_code]   directory   owner   group   mode_bits
    -
    -

    The following example defines the /usr directory: -

       D /usr root wheel 755
    -
    - - - - -

    Defining a File

    -

    The F instruction defines a file to be created on -the local disk. The source file can reside in either AFS or the local -disk. -

    If a file of this name already exists, then it is updated with (overwritten -by) the source file, unless the I update code is specified. -If a symbolic link or directory of this name exists, the package -program replaces it with the source file. -
    Note:Some files must reside on the local disk; they cannot be symbolic -links. See Local Files versus Symbolic Links. -
    -

    Use the following instruction to define a file: -

       F[update_code]   file   source_file  [owner   group   mode_bits]
    -
    -

    An example which creates/updates the file /bin/grep on the local -disk, using /afs/abc.com/rs_aix42/bin/grep as the -source: -

       F /bin/grep /afs/abc.com/rs_aix42 root wheel 755
    -
    -

    In the following example, two update codes are used, and the -owner, group and mode_bits slots are left -empty, so that the disk file adopts the source file's values for those -slots. -

       FAQ /usr/vice/etc/ThisCell /afs/abc.com/common/etc/ThisCell
    -
    - - - - -

    Defining a Symbolic Link

    -

    The L instruction defines a symbolic link to be -created on the local disk. The symbolic link can point to the AFS file -system or the local disk. If the identical symbolic link already -exists, the package program does nothing. However, if an -element of the same name exists on the disk as a file or directory, the -package program replaces the element with a symbolic link. -
    Note:Some files must reside on the local disk; they cannot be symbolic -links. See Local Files versus Symbolic Links. -
    -

    Use the following instruction to define a symbolic link: -

       L[update_code]  link actual_file  [owner   group   mode_bits]
    -
    -
    Note:Do not create a symbolic link to a file whose name begins with the number -sign (#) or percent sign (%). The Cache Manager -interprets such a link as a mount point to a regular or Read/Write volume, -respectively. -
    -

    The following example creates a symbolic link from the /etc/ftpd -directory on the local disk to the -/afs/abc.com/hp_ux110/etc/ftpd file in AFS. Since the -owner, group and mode_bits fields are empty, -the symbolic link adopts values for those fields from the actual file: -

       L /etc/ftpd /afs/abc.com/hp_ux110 
    -
    -

    This example uses the A update code: -

       LA /etc/printcap /afs/abc.com/common/etc/printcap.remote 
    -               root wheel 644
    -
    - - - - -

    Defining a Block Special Device

    -

    The B instruction defines a block special device, -which is a device that handles data in units of multibyte blocks, such as a -disk. If a device of the same name already exists, the -package program replaces it with the specified block device. -

    Use the following instruction to define a block special device (it appears -on two lines here only for legibility): -

       B device_name   major_device_number   minor_device_number  \
    -      owner   group   mode_bits
    -
    -

    The following example defines a disk called /dev/hd0a to have -major and minor device numbers 1 and 0: -

       B /dev/hd0a 1 0 root wheel 644
    -
    - - - - -

    Defining a Character Special Device

    -

    The C instruction defines a character special -device, which is device that handles data in units of a single character at a -time, such as a terminal or tty. If a device of the same name already -exists, the package program replaces it with the specified -character device. -

    Use the following instruction to define a character special device (it -appears here on two lines only for legibility): -

       C device_name   major_device_number   minor_device_number  \
    -      owner   group   mode_bits
    -
    -

    The following example defines the tty called /dev/ttyp5 with -major and minor device numbers 6 and 5: -

       C /dev/ttyp5 6 5 root wheel 666
    -
    - - - - -

    Defining a Socket

    -

    The S instruction defines a socket, which is -communications device for UDP and TCP/IP connections. If a socket of -the same name already exists, the package program replaces -it. -

    Use the following instruction to define a socket: -

       S   socket_name   [owner   group   mode_bits]
    -
    -

    The following example defines a socket called -/dev/printer: -

       S /dev/printer root wheel 777
    -
    -

    Constructing Prototype and Library Files

    - - - -

    This section describes the general steps required to create -package prototype and library files. Refer to the previous -sections for guidelines, and the files in your wsadmin directory -for examples. The construction of prototype and library files is -different for each cell. -

    To construct a prototype file and its component library files

    -
      -

    1. Determine where the three package-related subdirectories -(src, lib and etc) reside in your cell's -file tree; the following instructions assume they were loaded into the -/afs/cellname/wsadmin directory, as described -in the AFS Quick Beginnings. -

    2. Decide how many different functions you want client machines in your cell -to perform. We recommend that you construct a separate prototype file -for each function. Common functions include: -
        -

      • Standard workstation: provides users with access to files in AFS -

      • Printer server: drives a printer; can be combined with "staff" -functionality -

      • Backup machine: performs backups of AFS volumes to tape by running -the AFS Backup System software -
      -

    3. Determine the minimum functionality needed for all clients (such as AFS -setup) and place these generic definitions in one or more library -files. -

    4. For each type of client (printer server, backup machine, and so on), place -all system-independent definitions in one file, and all operating-system -dependent definitions in another file. -
    -

    The Package Makefile File

    - - - -

    Once you have created the appropriate prototype and library files, you must -compile the prototype for each system type. The result is a -system-specific configuration file. -

    The Makefile file defines the prototype and library files used -and the order of compilation. We recommend that you create your -Makefile file by modifying the example provided with the AFS -distribution, as described in this section. In the conventional -configuration, it is located at -/afs/cellname/wsadmin/src/Makefile. -

    Overview

    -

    The following list summarizes the sections in the package -Makefile file, identifying each by the header name that begins the -section. More detailed descriptions follow. -

    -

    CONFIG= -
    Lists all of the configuration files to be created and defines which -prototype files are compiled for which system types. See The CONFIG Section. -

    BASE_LIBS= -
    Lists the pathnames of all operating-system- and function independent -library files included in any prototype files. See The BASE_LIBS Section. -

    MACHINE_LIBS= -
    Lists the pathnames of all operating-system-specific library files -included in any prototype files. See The MACHINE_LIBS Section. -

    LIBS= -
    A one-line instruction that defines LIBS as the combination of -BASE_LIBS and MACHINE_LIBS. See The LIBS Section. -

    .SUFFIXES -
    Defines all of the suffixes that can appear on a prototype or -configuration file. See The .SUFFIXES Section. -
    -

    Finally, the Makefile file contains a set of instructions that -the package program follows to generate configuration files. -It is not generally necessary to alter this section. See The Makefile Instructions Section. -

    The CONFIG Section

    -

    As mentioned, a configuration file is a prototype file that -has been compiled for a specific operating system type. The -CONFIG section of the Makefile file defines the -prototype files to compile for each system type. The resulting compiled -file is a system-specific configuration file. -

    Study the following example taken from the sample Makefile -file. Configuration files are defined by specifying the -prototype-system combination as -prototype_file.sysname. Note that -it is not necessary to generate a configuration file for each prototype-system -type combination. -

       #Makefile...
    -   #	(C) Copyright IBM Corporation 1999
    -   #	Licensed Materials - Property of IBM
    -   #	All Rights Reserved.
    -   #
    -   CONFIG = \
    -            staff.rs_aix42 \
    -            staff.alpha_dux40 \
    -            staff.xdm.alpha_dux40 \
    -            staff.sun4x_56 \
    -            staff.hp_ux110 \
    -            minimal.rs_aix42 \
    -            minimal.alpha_dux40 \
    -            minimal.hp_ux110 \
    -            minimal.sun4x_56
    -
    -

    An entry in the CONFIG section has the following format: -

      -

    • The first part of the entry defines the prototype file and is the same as -the prototype file name (without the .proto -extension). The second part of the entry indicates the system type for -which the prototype file is to be compiled. A complete list of these -suffixes is in the .SUFFIXES section of the -Makefile file, as described in The .SUFFIXES Section. This -prototype_file.sysname definition becomes -the name of the compiled configuration file. -

      For example, staff.rs_aix42 indicates that the -staff.proto file is compiled for machines running AIX -4.2. The resulting compiled configuration file is called -staff.rs_aix42. -

    • Each configuration file must appear on a separate line. -

    • A backslash must follow the CONFIG= header and every name but -the last one. A backslash must also appear on blank lines. -
    -

    The BASE_LIBS Section

    -

    This section defines the complete pathname of all system- -and function-independent library files included in any prototype file. -(System-specific library files are defined in the MACHINE_LIBS -section). The pathnames can include the ${wsadmin} variable, -whose value is supplied on the make command line. -

    You must include all of the library files referred to in your prototype -files; files included but not used are ignored. -

    Study the following example. Note that the all entries (except the -last one) must be followed by a backslash. -

       BASE_LIBS = \
    -	   ${wsadmin}/src/admin \
    -	   ${wsadmin}/lib/devel \
    -	   ${wsadmin}/lib/base.generic
    -
    -

    The MACHINE_LIBS Section

    -

    This section lists the complete pathname of all -operating-system-specific library files included in prototype files. -(System- and function-independent library files are defined in the -BASE_LIBS section.) -

    Study the following example. Note that in this example, library -files were grouped by operating-system type. Again, all lines (except -the last one) must be followed by a backslash, the ${wsadmin} -variable is allowed, and files included but not used are ignored. -

       MACHINE_LIBS = \
    -           ${wsadmin}/lib/rs_aix42.generic \
    -           ${wsadmin}/lib/rs_aix42.generic.dev \
    -           ${wsadmin}/lib/rs_aix42.readonly \
    -           ${wsadmin}/lib/rs_aix42.readwrite \
    -           ${wsadmin}/lib/rt_aix42.generic.printer \
    -    \
    -    .
    -    .
    -           ${wsadmin}/lib/alpha_dux40.AFS \
    -           ${wsadmin}/lib/hp_ux110.AFS \
    -           ${wsadmin}/lib/sun4x_56.AFS \
    -           ${wsadmin}/lib/rs_aix42.AFS
    -
    -

    The LIBS Section

    -

    This section contains only one instruction, which indicates -that LIBS is defined as the combination of MACHINE_LIBS -and BASE_LIBS. Insert a blank line after the line to -separate this section from the next. -

       LIBS = ${MACHINE_LIBS} ${BASE_LIBS}
    -
    -

    The .SUFFIXES Section

    -

    This section lists the valid machine-type suffixes. -This list includes system types currently supported for AFS. Unused -suffixes are ignored. -

       .SUFFIXES: .rs_aix42 \
    -              .alpha_dux40 \
    -              .proto \
    -              .sun4x_56 \
    -              .i386_linux22 \
    -              .hp_ux110
    -
    -

    The Makefile Instructions Section

    -

    The remainder of the Makefile file controls how -the package program generates configuration files. -

    Study the following instructions; it is assumed that you are familiar -with programming and Makefile concepts. -

       #The following appear on a single line each in the actual file
    -   .proto.rs_aix42: ;  mpp -Dwsadmin=${wsadmin} -Dsys=rs_aix42  
    -                           -Dname=$* $*.proto > $@
    -   .proto.alpha_dux40: ; mpp -Dwsadmin=${wsadmin} -Dsys=alpha_dux40 
    -                           -Dname=$* $*.proto > $@
    -   .proto.sun4x_56:  ; mpp -Dwsadmin=${wsadmin} -Dsys=sun4x_56 
    -                           -Dname=$* $*.proto > $@
    -   .proto.hp_ux110:  ; mpp -Dwsadmin=${wsadmin} -Dsys=hp_ux110  
    -                           -Dname=$* $*.proto > $@
    -   all: ${CONFIG}
    -   ${CONFIG}: ${LIBS}
    -   system: install
    -   install: ${CONFIG}
    -	   cp ${CONFIG} ${wsadmin}/etc
    -   clean:
    -	   rm -f ${CONFIG} *.BAK *.CKP
    -
    -

    Modifying the Makefile

    - - - -

    Modify the package Makefile files when you -

      -

    • Add a new prototype file -(function.proto). -

    • Add a new system type. -

    • Add new library files. -
    -

    The following sections provide brief examples of how to modify the -Makefile file for these reasons. -

    Adding a New Prototype File

    -

    When you create a new prototype file, add the file name and each system -type for which it is to be built into the CONFIG section of the -Makefile file. -

    For example, to add a function.proto file for -alpha_dux40 and hp_ux110, add the following entries to -the CONFIG section: -

       CONFIG = \
    -   ...
    -           function.alpha_dux40 \
    -           function.hp_ux110 \
    -   ...
    -
    -

    If you have added new library files for this prototype function, add those -to the MACHINE_LIBS section. -

    Adding a New System Type

    -

    For each prototype file that you want to build for the new system type, -add an entry to the CONFIG section. Also add any new -libraries to the MACHINE_LIBS section, and the new system type to -the .SUFFIXES section. -

    The following example shows the modifications appropriate when building the -staff and minimal prototype files for this new system -type. -

       CONFIG = \
    -   ...
    -           staff.sysname \
    -           minimal.sysname \
    -   ...
    -
    -

    If you have created corresponding library files for this new machine type, -add them to the MACHINE_LIBS section. -

       MACHINE_LIBS = \
    -   ...
    -           ${wsadmin}/lib/sysname.generic \
    -           ${wsadmin}/lib/sysname.generic.dev \
    -           ${wsadmin}/lib/sysname.readonly \
    -           ${wsadmin}/lib/sysname.readwrite \
    -   ...
    -
    -

    Add the new system type to the SUFFIXES section. -

       .SUFFIXES: ...\
    -            .sysname \
    -   ...
    -
    -

    Add a line to build the configuration files for this system in the section -with the rest of the commands to build configuration files: -

       .proto.sysname: ; mpp -Dwsadmin=${wsadmin} \
    -   -Dsys=sysname  -Dname=$* $*.proto > $
    -
    -

    Adding New Library Files

    -

    If you added a new library file for each system type, -sysname.library_file, add these files to -the MACHINE_LIBS section of the Makefile. -

       MACHINE_LIBS = \
    -   ...
    -           ${wsadmin}/lib/rs_aix42.library_file \
    -   ...
    -           ${wsadmin}/lib/alpha_dux40.library_file \
    -   ...
    -           ${wsadmin}/lib/sun4x_56.library_file \
    -   ...
    -
    -

    If you added a new library file that is common to all system types, -library_file, add this only to the BASE_LIBS -section: -

       BASE_LIBS = \
    -   ...
    -           ${wsadmin}/lib/library_file \
    -   ...
    -
    -

    Compiling Prototype Files

    - - -

    The package program generates configuration files and installs -them in the etc and src subdirectories of the directory -designated as wsadmin= on the make command line. -Recompile whenever you modify a prototype or library file. -

    To compile prototype files

    -
    Note:These instructions assume that you store your package-related -files in the /afs/cellname/wsadmin -directory. If you use a different directory, substitute its name for -/afs/cellname/wsadmin. -
    -
      -

    1. Verify that you have all privileges in the -/afs/cellname/wsadmin directory and in its -src, lib and etc subdirectories. If -necessary, issue the fs listacl command. -
         % fs listacl [dir/file path]
      -
      -

    2. Change to the /afs/cellname/wsadmin/src -subdirectory. -
         % cd /afs/cellname/wsadmin/src
      -
      -

    3. Create a backup copy of the Makefile file included in the AFS -distribution. -
         % cp  Makefile Makefile.example 
      -
      -

    4. Modify the CONFIG, BASE_LIBS and -MACHINE_LIBS sections of the Makefile file, as described -in The CONFIG Section, The BASE_LIBS Section, and The MACHINE_LIBS Section. -

    5. Compile the prototype files using the make command. -

      Use the wsadmin= argument to specify the package -directory. This becomes the value of the ${wsadmin} variable -in the prototype and the library files. -

      The package program generates configuration files and installs -them in the etc and src subdirectories of the directory -designated as wsadmin=. -

         % make system wsadmin=/afs/cellname/wsadmin
      -
      -
    -

    Modifying Client Machines

    - - - - -

    To prepare a client to run the package program automatically, -perform the following steps. The instructions are generic because they -do not refer to system-specific configuration files. If desired, you -can invoke the package program with specific arguments, as -described in the AFS Administration Reference. -

      -

    1. Specify the configuration file to use. -

      The .package file in the client machine's root ( -/) directory is redirected as an argument to the package -command; the .package file specifies which -configuration file the package program uses. -

    2. Make the package binary available to the client, either by -copying it to the local disk, or by creating a symbolic link to AFS. -
        -

      • A symbolic link saves local disk space. However, when the file -server machine that houses it is down, the package binary is -inaccessible. -

      • Keeping the package binary on the local disk enables you to run -the package program even if file server is down. However, a -file server machine outage usually makes it difficult to run the -package program because most configuration file instructions refer -to files in AFS. A local copy of the package binary can be -useful if the files referred to in instructions are in replicated -volumes. -
      -

    3. Modify the client machine's initialization file to invoke the -package program at reboot. The client machine reboots a -second time if the package program updates any files marked with -the Q update code. -
    -

    To prepare a client machine to run the package program

    -

    Repeat these instructions on every client that runs the -package program. -

    These instructions assume that the package configuration files -(created when the prototype files were compiled) reside in the -/afs/cellname/wsadmin/etc directory . -

      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Create the .package file in the root ( /) -directory and specify the name of the prototype file to use. Do not -include the system-type suffix (such as .rs_aix42); the -package program automatically determines the correct machine -type. -
         # echo "/afs/cellname/wsadmin/etc/config_file" >> /.package
      -
      -

      For example, to configure a machine for a member of staff machine (assuming -the proper prototype file had been defined and compiled for the system type), -the appropriate command is: -

         # echo "/afs/cellname/wsadmin/etc/staff" >> /.package
      -
      -

    3. Make the package binary available on the local disk as -/etc/package. Issue one of the following commands, depending -on whether you want to create a file or create a symbolic link. -

      To store the package binary locally, enter the following -command: -

         # cp /afs/cellname/sysname/usr/afsws/etc/package   /etc/package
      -
      -

      To create a symbolic link, enter the following command: -

         # ln -s /afs/cellname/sysname/usr/afsws/etc/package   /etc/package
      -
      -

    4. Add the following lines to the appropriate initialization file, after the -afsd command is invoked. If this is a file server machine, -the bosserver command must follow the package -command. -

      Using the -v and -c options is recommended. -The -v flag produces a detailed trace, and the -c option -appends the system type to the base name of the configuration file. See -the AFS Administration Reference for a description of other -options. -
      Note:Replace the shutdown command with a similar command if it is not -appropriate for rebooting your machine. -
      -

         if [ -f /etc/package ]; then
      -           if [ -f /.package ]: then
      -                   /etc/package -v -c `cat /.package` >/dev/console
      -           else
      -                   /etc/package -v >/dev/console
      -   fi
      -   case $? in
      -   0)
      -           echo "Package completed successfully" >/dev/console 2>&1
      -           date >/dev/console 2>&1
      -           ;;
      -   4)
      -           echo "Rebooting to restart system" >/dev/console 2>&1
      -           echo >/fastboot
      -           shutdown
      -           ;;
      -   *)
      -           echo "Update failed, continuing anyway" >/dev/console 2>&1
      -           ;;
      -   esac
      -   fi
      -
      -
    -

    Running the package program

    -

    After you have created and compiled prototype files and -modified client machines, you are ready to run the package -program. It is probably most convenient to run the package -program automatically at reboot by invoking it in the machine's AFS -initialization file, but you can also issue the command at the command shell -prompt. -

    The configuration file must be completely correct. If there are any -syntax errors or incorrect values, the program exits without executing any -instruction. To check the configuration file, issue the -package command with the -noaction and -debug -flags at the command shell prompt. They display a list of potential -problems without actually executing instructions. -

    The package program follows these general rules. Complete -explanations are in Package Configuration File Instruction Syntax. -

      -

    • The package program does not delete any files from the disk -unless the R update code was specified in the prototype -file. If the R update code is associated with the parent -directory, the package program removes anything from the local disk -directory that is not specified in the configuration file. -

    • Local files are updated only if they are out of date. For each -F instruction in the configuration file, the package -program compares the time of the local file with the indicated source -file. If the source file is newer than the local, the file is -updated. -

    • When the initialization file is modified as recommended in Modifying Client Machines, the package program reboots the workstation -automatically if any files marked with the Q update code are -updated, and if the package program has been invoked from the -initialization file. When a file marked with the Q update -code is changed, the package program exits with status code 4, -causing a reboot (as directed in the initialization file). Files that -require a reboot before changes are recognized (such as the operating system -kernel and /usr/vice/etc/CellServDB files) must be marked with a -Q update code in the configuration file. -

    • The package program copies the configuration file it has just -used to /etc/package.sysname, where -sysname reflects this machine's system type. The -package command interpreter consults this file if you do not -provide a configuration file name. To be sure that it configures the -local disk as you wish, review its contents. -
    -

    To invoke the package program by rebooting

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. (Recommended) Verify the following: -
        -

      • The /.package file identifies the desired configuration -file -

      • The package binary is available as /etc/package -

      • The initialization file is properly modified to invoke the -package program automatically -
      -

    3. Reboot the machine, using the appropriate command. -
         # shutdown
      -
      -
    - - -

    To invoke the package program directly (without rebooting)

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Verify the following: -
        -

      • The /.package file identifies the desired configuration -file -

      • The package binary is available as /etc/package -

      • The initialization file is properly modified to invoke the -package program automatically -
      -

    3. Issue the package command. -
         # package  [initcmd]  [-config <base name of configuration file>]  \
      -    [-fullconfig <full name of configuration file, or stdin for standard input>]  \
      -    [-overwrite]  [-noaction]  [-verbose]  [-silent] [-rebootfiles] 
      -
      -

      where -

      -

      -config -
      Specifies the full pathname of the configuration file to use, ending in -the file's base name, which omits the suffix that indicates the machine -type. The package program knows how to determine a -machine's type, and automatically selects the appropriate version of the -base file name. An example of the proper value for this argument is -staff rather than staff.rs_aix42. You can -also have the package program refer to /.package -to learn the configuration file name by providing the following value: -

      `cat /.package` -

      Use either this argument or the -fullconfig argument. -

      -fullconfig -
      Specifies the full name of the configuration file to use, complete with -the machine-type extension. Examples are -staff.rs_aix42 and minimal.hp_ux110 -files. -

      Another possibility is the string stdin, which indicates that -the issuer is providing configuration information via the standard input -stream, either as a piped file or by typing the configuration file at the -keyboard. Press <Ctrl-d> to conclude the input. -

      Use either this argument or the -config argument. -

      -overwrite -
      Overwrite elements on the local disk with the source version indicated in -the configuration file, even if the first (owner) w -(write) mode bit is turned off on the local disk copy of the -file. Files protected by the I update code are not -overwritten; see the definition for the F instruction. -

      -noaction -
      Displays on the standard output stream a trace of potential problems in -running the command, rather than actually running it. If the --verbose flag is added, the trace also notes the actions the -package program attempts. -

      -silent -
      Explicitly invokes the default level of tracing, which includes only a -list of problems encountered while executing the command. -

      -verbose -
      Produces a detailed trace of the program's actions on the standard -output stream. The trace records on the transfer and ownership/mode bit -setting of each element in the configuration file. -

      -rebootfiles -
      Prevents the overwrite of any element marked with the Q -update-mode code in the configuration file. This effectively prevents -the machine from rebooting automatically again when the package -program is invoked from an initialization file. -
      -

    4. If you think files marked with the Q update code were updated, -reboot the machine. This reboot does not occur automatically. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd017.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd017.htm deleted file mode 100755 index 217ae0fb6..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd017.htm +++ /dev/null @@ -1,2501 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    - -


    Creating and Deleting User Accounts with the uss Command Suite

    -

    The uss command suite helps you create and delete -AFS user accounts quickly and easily. You can create a single account -with the uss add command, delete a single account with the uss -delete command, or create and delete multiple accounts with the uss -bulk command. -

    A single uss add or uss bulk command can create a -complete AFS user account because the uss command interpreter -refers to a template file in which you predefine the configuration of many -account components. The uss delete command deletes most of -the components of a user account, but does not use a template file. -

    The uss suite also easily incorporates shell scripts or other -programs that you write to perform parts of account creation and deletion -unique to your site. To invoke a script or program automatically as a -uss command runs, use the appropriate instructions in the template -file or bulk input file. Various sections of this chapter discuss -possible uses for scripts. -

    Using the uss commands to create and delete accounts is the -recommended method because it automates and correctly orders most of the -necessary steps. The alternative is to issue a series of separate -commands to the various AFS servers, which requires more careful record -keeping. For instructions, see Administering User Accounts. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - -
    Add a single user account -uss add -
    Delete a single user account -uss delete -
    Add and delete multiple accounts -uss bulk -
    -


    Overview of the uss Command Suite

    -

    The commands in the uss suite help you to -automate the creation and deletion of AFS user accounts: -

      -

    • The uss add command creates all of the components of an -account, one account at a time. It consults a template file that -defines account configuration. -

    • The uss delete command deletes the major components of an -account, one account at a time. It does not use a template file, so you -possibly need to perform additional tasks manually. -

    • The uss bulk command can create and delete multiple -accounts. It refers to a bulk input file that can contain any number of -account-creation and deletion instructions, along with other instructions for -further automating the process. -
    - - -

    The Components of an AFS User Account

    -

    An AFS user account can have many components. The only two -required components are entries in the Protection Database and Authentication -Database, but the other components add functionality and usability. The -following information also appears in a corresponding section of Administering User Accounts, but is repeated here for your convenience. -

      -

    • A Protection Database entry defines the username (the name -provided when authenticating with AFS), and maps it to an AFS user ID (AFS -UID), a number that the AFS servers use internally when referencing -users. The Protection Database also tracks the groups to which the user -belongs. For details, see Administering the Protection Database. -

    • An Authentication Database entry records the user's AFS -password in a scrambled form suitable for use as an encryption key. -

    • A home volume stores all the files in the user's home -directory together on a single partition of a file server machine. The -volume has an associated quota that limits its size. For a -complete discussion of volumes, see Managing Volumes. -

    • A mount point makes the contents of the user's volume -visible and accessible in the AFS filespace, and acts as the user's home -directory. For more details about mount points, see About Mounting Volumes. -

    • Full access permissions on the home directory's access control -list (ACL) and ownership of the directory (as displayed by the UNIX -ls -ld command) enable the user to manage his or her files. -For details on AFS file protection, see Managing Access Control Lists. -

    • A local password file entry (in the /etc/passwd file -or equivalent) of each AFS client machine enables the user to log in and -access AFS files through the Cache Manager. A subsequent section in -this chapter further discusses local password file entries. -

    • Other optional configuration files make the account more -convenient to use. Such files help the user log in and log out more -easily, receive electronic mail, print, and so on. -
    - - -

    Privilege Requirements for the uss Commands

    -

    To issue uss commands successfully, you usually -need all of the standard AFS administrative privileges: membership in -the system:administrators group, inclusion in the -/usr/afs/etc/UserList file on every relevant server machine, and -the ADMIN flag on your Authentication Database entry. For -details on administrative privilege, see Managing Administrative Privilege. - - - - - - - -

    Avoiding and Recovering from Errors and Interrupted Operations

    -

    As for any complex operation, there are a number of possible -reasons that an account-creation or deletion operation can halt before it -completes. You can easily avoid several of the common reasons by making -the following checks before issuing a uss command: -

      -

    • Verify that you have all of the administrative privileges you need to -complete an operation, as described in Privilege Requirements for the uss Commands. The instructions for using the uss add, -uss delete, and uss bulk commands include this check as -a step. -

    • Proofread the template and bulk input files for correct syntax and -acceptable values. For discussion, see Constructing a uss Template File and Constructing a Bulk Input File. -

    • Do not issue uss commands when you are aware of network, server -machine, or server process outages. Because uss operations -affect so many components of AFS, it is unlikely that the command can succeed -when there are outages. -
    -

    Another way to avoid errors that halt an operation is to preview the -uss command by combining the -dryrun flag with the other -arguments to be used on the actual command. The uss command -interpreter generates a screen trace of the actions to be performed by the -actual command, without performing them. -

    Using the -dryrun flag reveals many basic errors that can halt -an operation, particularly the ones due to incorrect syntax in the command -line, template file, or bulk input file. It does not catch all possible -errors, however, because the command interpreter is not actually attempting to -perform the actions it is tracing. For example, a Volume Server outage -does not necessarily halt the volume creation step when the -dryrun -flag is included, because the command interpreter is not actually contacting -the server; such an outage halts the actual creation operation. - - - -

    When the uss command interpreter encounters error conditions -minor enough that they do not require halting the operation, it usually -generates a message that begins with the string uss: -Warning: and describes the action it is taking to avoid -halting. For example, if a user's Protection Database entry -already exists, the following message appears on the standard output -stream: -

       uss: Warning: User 'user' already in the protection database
    -   The uid for user 'user' is AFS UID
    -
    -

    If an error is more serious, the word Warning does not appear in -the message, which instead describes why the command interpreter cannot -perform the requested action. Not all of these errors cause the -uss operation to halt, but they still require you to take -corrective action. For example, attempting to create a mount point -fails if you lack the necessary permissions on the parent directory's -ACL, or if the mount point pathname in the V instruction's -mount_point field is malformed. However, this error does not -cause the creation operation to halt until later instructions in the template -attempt to install subdirectories or files under the nonexistent mount -point. -

    If the command shell prompts returns directly after an error message, then -the error generally was serious enough to halt the operation. When an -error halts account creation or deletion, the best way to recover is to find -and fix the cause, and then reissue the same uss command. - - - - - - -

    The following list describes what happens when components of a user's -account already exist when you reissue an account-creation command (the -uss add command, or the uss bulk command when the bulk -input file contains add instructions): -

      -

    • If the Protection Database entry already exists, a message confirms its -existence and specifies the associated AFS UID. -

    • If the Authentication Database entry already exists, a message confirms -its existence. -

    • If the volume and associated Volume Location Database (VLDB) entry already -exist, a message confirms their existence. However, the uss -command interpreter does alter the volume's quota, mount point, or ACL if -any of the relevant fields in the template V instruction have -changed since the command last ran. If the value in the -mount_point field has changed, the command interpreter creates the -new mount point but does not remove any existing mount points. -

    • If any of the fields in the template A instruction have -changed, the uss command interpreter makes the changes without -comment. -

    • If a directory, file, or link defined by a template file D, -E, F, L, or S instruction already -exists, the uss command interpreter replaces the existing element -with one that conforms to the template definition. To control whether -the uss command interpreter prompts for confirmation that you wish -to overwrite a given element, use the -overwrite flag to the -uss add or uss bulk command: -
        -

      • If you include the -overwrite flag, the command interpreter -automatically overwrites all elements without asking for confirmation. -

      • If you omit the flag, the command interpreter prompts once for each -account to ask if you want to overwrite all elements associated with -it. -
      -

    • The command interpreter always reexecutes X instructions in the -template file. If a command's result already holds, reissuing it -has the same effect as reissuing it outside the context of the uss -commands. -
    -

    The following describes what happens when a uss delete command -references account components that have already been deleted. -

      -

    • If the volume and VLDB entry no longer exist, a message confirms their -absence. -

    • If the Authentication Database entry no longer exists, a message confirms -its absence. -
    - -

    Creating Local Password File Entries with uss

    -

    To obtain authenticated access to a cell's AFS -filespace, a user must not only have a valid AFS token, but also an entry in -the local password file (/etc/passwd or equivalent) of the AFS -client machine. This section discusses why it is important for the -user's AFS UID to match to the UNIX UID listed in the local password -file, the appropriate value to put in the file's password field, and -outlines a method for creating a single source password file. -

    For instructions on using the template file's E instruction -to generate local password file entries automatically as part of account -creation, see Creating a Common Source Password File. -

    The following information also appears in a corresponding section of Administering User Accounts, but is repeated here for your convenience. - - - - - -

    Assigning AFS and UNIX UIDs that Match

    -

    A user account is easiest to administer and use if the AFS -user ID number (AFS UID) and UNIX UID match. All instructions in the -AFS documentation assume that they do. -

    The most basic reason to make AFS and UNIX UIDs the same is so that the -owner name reported by the UNIX ls -l and ls -ld -commands makes sense for AFS files and directories. Following standard -UNIX practice, the File Server records a number rather than a username in an -AFS file or directory's owner field: the owner's AFS -UID. When you issue the ls -l command, it translates the UID -to a username according to the mapping in the local password file, not the AFS -Protection Database. If the AFS and UNIX UIDs do not match, the ls --l command reports an unexpected (and incorrect) owner. The -output can even vary on different client machines if their local password -files map the same UNIX UID to different names. -

    Follow the recommendations in the indicated sections to make AFS and UNIX -UIDs match when you are creating accounts for various types of users: -

      -

    • If creating an AFS account for a user who already has a UNIX UID, see Converting Existing UNIX Accounts with uss. -

    • If some users in your cell have existing UNIX accounts but the user for -whom you are creating an AFS account does not, then it is best to allow the -Protection Server to allocate an AFS UID automatically. To avoid -overlap of AFS UIDs with existing UNIX UIDs, set the Protection -Database's max user id counter higher than the largest UNIX -UID, using the instructions in Displaying and Setting the AFS UID and GID Counters. -

    • If none of your users have existing UNIX accounts, allow the Protection -Server to allocate AFS UIDs automatically, starting either at its default or -at the value you have set for the max user id counter. -
    - - -

    Specifying Passwords in the Local Password File

    -

    Authenticating with AFS is easiest for your users if you -install and configure an AFS-modified login utility, which logs a user into -the local file system and obtains an AFS token in one step. In this -case, the local password file no longer controls a user's ability to -login in most circumstances, because the AFS-modified login utility does not -consult the local password file if the user provides the correct AFS -password. You can nonetheless use a password file entry's password -field (usually, the second field) in the following ways to control login and -authentication: -

      -

    • To prevent both local login and AFS authentication, place an asterisk ( * -) in the field. This is useful mainly in emergencies, when you want to -prevent a certain user from logging into the machine. -

    • To prevent login to the local file system if the user does not provide the -correct AFS password, place a character string of any length other than the -standard thirteen characters in the field. This is appropriate if you -want to allow only people with local AFS accounts to log into to your -machines. A single X or other character is the most easily -recognizable way to do this. -

    • To enable a user to log into the local file system even after providing an -incorrect AFS password, record a standard UNIX encrypted password in the field -by issuing the standard UNIX password-setting command (passwd or -equivalent). -
    -

    If you do not use an AFS-modified login utility, you must place a standard -UNIX password in the local password file of every client machine the user will -use. The user logs into the local file system only, and then must issue -the klog command to authenticate with AFS. It is simplest if -the passwords in the local password file and the Authentication Database are -the same, but this is not required. - - - - - -

    Creating a Common Source Password File

    -

    This section explains how to create a common source version -of the local password file when using uss commands to create user -accounts. The sequence of steps is as follows: -

      -

    1. Include an E instruction in the template file to create a -one-line file that has the format of a local password file entry. -

    2. Incorporate the one-line file into the common source version of the local -password file. It makes sense to store this file in AFS. See the -following two example scripts for automating this step. -

    3. Distribute the common password file to each client machine, perhaps by -using the AFS package utility as described in Configuring Client Machines with the package Program. -
    -

    As an example, the template file used by the ABC Corporation includes the -following E instruction to create a file called -passwd_username in the directory -/afs/.abc.com/common/etc/newaccts (the entire -contents of the template file appear in Example uss Templates and a full description of the E instruction -appears in Creating One-Line Files with the E Instruction): -

       E /afs/.abc.com/common/etc/newaccts/passwd_$USER 0644 root \
    -        "$USER:X:$UID:11:$NAME:$MTPT:/bin/csh"
    -
    -

    For the user Joe L. Smith with username smith, this -instruction creates a file called passwd_smith which contains the -following line: -

       smith:X:1205:11:Joe L. Smith:/afs/abc.com/usr/usr1/smith:/bin/csh
    -
    -

    A shell script is probably the easiest way to incorporate a set of files -created in this manner into a common source password file, and two sample -shell scripts appear here. To automate the process even further, you -can create a cron process in a file server machine's -/usr/afs/local/BosConfig directory to execute the shell script, -perhaps each day at a given time; for details, see To create and start a new process. -
    Note:The following example scripts are suggestions only. If you choose to -use them, or to model similar scripts on them, you must test that your script -has the desired result, preferably in a test environment. -
    -

    Example C Shell Script -

    The first example is a simple C shell script suitable for the ABC -Corporation cell. It incorporates the individual files found in the -/afs/.abc.com/common/uss/newaccts directory into a -new version of the global password file found in the -/afs/.abc.com/common/etc directory, sorting the files -into alphabetical order. It takes care to save the current version with -a .old extension, then removes the individual files when -done. -

       set  dir = /afs/.abc.com/common
    -   cat  $dir/uss/newaccts/passwd_* $dir/etc/passwd  >!  $dir/etc/passwd.new
    -   mv  $dir/etc/passwd  $dir/etc/passwd.old
    -   sort  $dir/etc/passwd.new  >  $dir/etc/passwd
    -   rm  $dir/etc/passwd.new  $dir/uss/newaccts/passwd_*
    -
    -

    Example Bourne Shell Script -

    The second, more elaborate, example is a Bourne shell script that first -verifies that there are new passwd_username files to be -incorporated into the global password file. While running, it checks -that each new entry does not already exist. Like the shorter C shell -example, it incorporates the individual files found in the -/afs/.abc.com/common/uss/newaccts directory into a -new version of the global passwd file found in the -/afs/.abc.com/common/etc directory. -

       #!/bin/sh
    -   DESTDIR=/afs/.abc.com/common/uss/newaccts
    -   cd  $DESTDIR
    -   DEST=/afs/.abc.com/common/etc
    -   cp /afs/.abc.com/common/etc/passwd   /afs/.abc.com/common/uss/newaccts/passwd
    -   echo "copied in passwd file."
    -   PASSWD=/afs/.abc.com/common/uss/newaccts/passwd
    -   ENTRIES=`ls passwd_*`
    -   case $ENTRIES in 
    -   "")
    -        echo No new entry found to be added to passwd file
    -        ;;
    -   *)
    -        echo  "Adding new users to passwd file."
    -        for  i  in  $ENTRIES
    -        do
    -           cat  $i  |  awk  -F:  '{print $1  >  "foo"}'
    -           USER=`cat foo`
    -           case  `egrep  -e  \^$USER\: $PASSWD` in 
    -           "")
    -                   echo  adding  $USER
    -                   cat  $i  >>  $PASSWD
    -                   ;;
    -           *)
    -                   echo  $USER already in passwd file
    -                   ;;
    -           esac
    -           mv  $i  ../old.passdir/done_${i}
    -        done
    -        cd  /afs/.abc.com/common/uss/newaccts
    -        echo  "sorting password file"
    -        sort  ${PASSWD}  >  ${PASSWD}.sorted
    -        echo  "installing files"     
    -        install  ${PASSWD}.sorted ${DEST}/passwd
    -        echo  "Password file is built, sorted and installed."
    -        ;;
    -   esac
    -
    - - - -

    Converting Existing UNIX Accounts with uss

    -

    This section discusses the three main issues you need to -consider if there are existing UNIX accounts to be converted to AFS -accounts. -

    Making UNIX and AFS UIDs Match

    -

    As previously mentioned, AFS users must have an entry in the -local password file on every client machine from which they access the AFS -filespace as an authenticated user. Both administration and use are -much simpler if the UNIX UID and AFS UID match. When converting -existing UNIX accounts, you have two alternatives: -

      -

    • Make the AFS UIDs match the existing UNIX UIDs. In this case, you -need to assign the AFS UID yourself as you create an AFS account: -
        -

      • If using the uss add command, include the -uid -argument. -

      • If using the uss bulk command, specify the desired UID in the -uid field of the add instruction in the bulk input -file. -
      -

      Because you are retaining the user's UNIX UID, you do not need to -alter the UID in the local password file entry. However, if you are -using an AFS-modified login utility, you possibly need to change the password -field in the entry. For a discussion of how the value in the password -field affects login with an AFS-modified login utility, see Creating Local Password File Entries with uss. -

      If now or in the future you need to create AFS accounts for users who do -not have an existing UNIX UID, then you must guarantee that new AFS UIDs do -not conflict with any existing UNIX UIDs. The simplest way is to set -the max user id counter in the Protection Database to a value -higher than the largest existing UNIX UID. See Displaying and Setting the AFS UID and GID Counters. -

    • Change the existing UNIX UIDs to match the new AFS UIDs that the -Protection Server assigns automatically. -

      Allow the Protection Server to allocate the AFS UIDs automatically as you -create AFS accounts. For instructions on creating a new entry for the -local password file during account creation, see Creating Local Password File Entries with uss. -

      There is one drawback to changing the UNIX UID: any files and -directories that the user owned in the local file system before becoming an -AFS user still have the former UID in their owner field. If you want -the ls -l and ls -ld commands to display the correct -owner, you must use the chown command to change the value to the -user's new UID, whether you are leaving the file in the local file system -or moving it to AFS. See Moving Local Files into AFS. -

    -

    Setting the Password Field Appropriately

    -

    Existing UNIX accounts already have an entry in the local -password file, probably with a (scrambled) password in the password -field. You possibly need to change the value in the field, depending on -the type of login utility you use: -

      -

    • If the login utility is not modified for use with AFS, the actual password -must appear (in scrambled form) in the password field of the local password -file entry. -

    • If the login utility is modified for use with AFS, choose one of the -acceptable values, each of which affects the login utility's behavior -differently. See Creating Local Password File Entries with uss. -
    -

    If you choose to place an actual password in a local password file entry, -then you can define a dummy password when you use a template file E -instruction to create the entry, as described in Creating One-Line Files with the E Instruction. Have the user issue the UNIX password-setting -command (passwd or equivalent) to replace the dummy with an actual -secret password. -

    Moving Local Files into AFS

    -

    New AFS users with existing UNIX accounts probably already -own files and directories stored in a machine's local file system, and it -usually makes sense to transfer them into the new home volume. The -easiest method is to move them onto the local disk of an AFS client machine, -and then use the UNIX mv command to transfer them into the -user's new AFS home directory. -

    As you move files and directories into AFS, keep in mind that the meaning -of their mode bits changes. AFS ignores the second and third sets of -mode bits (group and other), and does not use the first set (the owner bits) -directly, but only in conjunction with entries on the ACL (for details, see How AFS Interprets the UNIX Mode Bits). Be sure that the ACL protects the file or directory -at least as securely as the mode bits. -

    If you have chosen to change a user's UNIX UID to match a new AFS UID, -you must change the ownership of UNIX files and directories as well. -Only members of the system:administrators group can issue the -chown command on files and directories once they reside in -AFS. - - - -


    Constructing a uss Template File

    -

    Creating user accounts with uss commands is -generally more convenient than using individual commands. You control -the account creation process just as closely, but the uss template -file enables you to predefine many aspects of account configuration. -Because you construct the template before issuing uss commands, you -have time to consider configuration details carefully and correct syntax -errors. The following list summarizes some further advantages of using -a template: -

      -

    • You do not have to remember the correct order in which to create or delete -account components, or the order of each command's arguments, which -reduces the likelihood of errors. -

    • You do not have to type the same information multiple times. -Instead, you can place constants and variables in the template file that -enable you to type as little on the command line as possible. See Using Constants and Variables in the Template File. -

    • You can create different templates for different types of users. -Instead of having to remember which components differ for a given user, -specify the appropriate template when issuing the uss add or -uss bulk command. -

    • You can create any of the three types of AFS account (authentication-only, -basic, or full) by including or omitting certain information in the template, -as described in Creating the Three Types of User Accounts. -
    -

    The following list briefly describes the instructions that can appear in a -template file and points you to a later section for more details. It -lists them in the order that is usually optimal for correct handling of -dependencies between the different types of instruction. -

    -

    G -
    Defines a directory that is one of a set of parent directories into which -the uss command interpreter evenly distributes newly created home -directories. Place the corresponding template file variable, $AUTO, in -the mount_point field of the V instruction. See Evenly Distributing User Home Directories with the G Instruction and Creating a Volume with the V Instruction. -

    V -
    Creates a volume, mounts it as the user's home directory at a -specified location in the AFS filespace, sets the volume's quota, and -defines the owner and ACL for the directory. This instruction must -appear in any template that is not empty (zero-length). See Creating a Volume with the V Instruction. -

    D -
    Creates a directory, generally a subdirectory of the new home directory, -and sets its mode bits, owner, and ACL. See Creating a Directory with the D Instruction. -

    F -
    Creates a file by copying a prototype and sets its mode bits and -owner. See Creating a File from a Prototype with the F Instruction. -

    E -
    Creates a single-line file by copying in the contents of the instruction -itself, then sets the file's mode bits and owner. See Creating One-Line Files with the E Instruction. -

    L -
    Creates a hard link. See Creating Links with the L and S Instructions. -

    S -
    Creates a symbolic link. See Creating Links with the L and S Instructions. -

    A -
    Improves account security by imposing restrictions on passwords and -authentication attempts. See Increasing Account Security with the A Instruction. -

    X -
    Executes a command. See Executing Commands with the X Instruction. -
    - - - -

    Creating the Three Types of User Accounts

    -

    Using the uss add and uss bulk -commands, you can create three types of accounts that differ in their levels -of functionality. For a description of the types, see Configuring AFS User Accounts. The following list explains how to construct a -template for each type: -

      -

    • To create an authentication-only account, create an empty (zero-length) -template file. Such an account has only two components: entries -in the Authentication Database and Protection Database. -

    • To create a basic account, include a V instruction, and -G instructions if you want to distribute home directories evenly as -described in Evenly Distributing User Home Directories with the G Instruction. In addition to Authentication Database and -Protection Database entries, this type of account includes a volume mounted at -the home directory with owner and ACL set appropriately. -

    • To create a full account, include D, E, -F, L, and S instructions as appropriate, in -addition to the V and G instructions. This type -of account includes configuration files for basic functions such as logging -in, printing, and mail delivery. For a discussion of some useful types -of configuration files, see Creating Standard Files in New AFS Accounts. -
    - - - - -

    Using Constants and Variables in the Template File

    -

    Each instruction in the uss template file has -several fields that define the characteristics of the element that it -creates. The D instruction's fields, for instance, -define a directory's pathname, owner, mode bits, and ACL. -

    You can place three types of values in a field: a variable, a -constant, or a combination of the two. The appropriate value depends on -the desired configuration, and determines which arguments you provide to the -uss add command or which fields you include in a bulk input file -add instruction. -

    If an aspect of account configuration is the same for every user, define a -constant value in the appropriate field by inserting a character -string. For example, to assign a space quota of 10,000 KB to every user -volume, place the string 10000 in the V -instruction's quota field. -

    If, on the other hand, an aspect of account configuration varies for each -user, put a variable in the appropriate field. When creating each -account, provide a value for the variable by providing either the -corresponding argument to the uss add command or a value in the -corresponding field of the add instruction in the bulk input -file. -

    The uss command suite defines a set of template variables, each -of which has a corresponding source for its value, as summarized in Table 3. For a discussion of their intended uses, see the -following sections about each template instruction (Creating a Volume with the V Instruction through Executing Commands with the X Instruction). -
    -

    Table 3. Source for values of uss template variables
    - - - - - - - - - - - -
    Variable -Source for value -
    $AUTO -Previous G instructions in template -
    $MTPT --mount argument to uss add command or -mount_point field of bulk input file add instruction, when -in V instruction; V instruction's -mount_point field when in subsequent instructions -
    $NAME --realname argument to uss add command or -mount_point field of bulk input file add instruction, if -provided; otherwise, -user argument to uss add -command or username field of in bulk input file add -instruction -
    $PART --partition argument to uss add command or -partition field of bulk input file add instruction -
    $PWEXPIRES --pwexpires argument to uss add command or -password_expires field of bulk input file add instruction -
    $SERVER --server argument to uss add command or -file_server field of bulk input file add instruction -
    $UID --uid argument to uss add command or uid -field of bulk input file add instruction, if provided; -otherwise, allocated automatically by Protection Server -
    $USER --user argument to uss add command or -username field of bulk input file add instruction -
    $1 through $9 --var argument to uss add command or var1 -through var9 fields of bulk input file add instruction -
    -

    A common use of variables is to define the file server machine and -partition that house the user's volume, which often vary from user to -user. Place the $SERVER variable in the V instruction's -server field, and the $PART variable in its partition -field. If using the uss add command, provide the desired -value with the -server and -partition arguments. -If using the uss bulk command, provide the desired values in the -file_server and partition fields of each user's -add instruction in the bulk input file. - - -

    The variables $1 through $9 can be used to customize other aspects of the -account. Provide a value for these variables with the -var -argument to the uss add command or in the appropriate field of the -bulk input file add instruction. The -var -argument is unusual in that each instance for it has two parts: the -number index and the value, separated by a space. For examples of the -use of a number variable, see the discussions of the mount_point and -quota fields in Creating a Volume with the V Instruction. -

    If some aspect of account configuration is partly constant and partly -variable, you can combine variables and constants in an instruction -field. For example, suppose that the ABC Corporation mounts user -volumes in the /afs/abc.com/usr directory. That part -of the pathname is constant, but the name of the mount point and home -directory is the user's username, which corresponds to the $USER -variable. To configure accounts in this way, combine a constant string -and a variable in the V instruction's mount_point -field as follows: -

       /afs/abc.com/usr/$USER
    -
    -

    Then provide the value for the $USER variable with the -user -argument to the uss add command, or in the username field -of each user's add instruction in the bulk input file. - - -

    Where to Place Template Files

    -

    A template must be available to the uss command -interpreter as it executes a uss add or uss bulk -command, even if it is the zero-length file appropriate for creating an -authentication-only account. -

    If you do not provide the -template argument to the uss -add or uss bulk command, then the command interpreter -searches for a template file called uss.template in each of -the following directories in turn: -

      -

    1. The current working directory -

    2. /afs/cellname/common/uss, where cellname is -the local cell -

    3. /etc -
    -

    To use a template file with a different name or stored in a different -directory, include the -template argument to the uss add -or uss bulk command. If you provide a filename only, the -command interpreter looks for it in the directories listed just -previously. If you provide a pathname and filename, it looks only in -the specified directory, interpreting a partial pathname relative to the -current working directory. - - -

    Some General Rules for Constructing a Template

    -

    This section summarizes some general rules to follow when -constructing a template file. For each instruction's syntax -definition, see the following sections (Evenly Distributing User Home Directories with the G Instruction through Executing Commands with the X Instruction). -

      -

    • If a variable takes its value from an element elsewhere within the -template, the definition must precede the reference. Putting the -instruction lines in the following order usually results in correct resolution -of variables: -

      G V D F E L S A X -

    • The fields in each instruction must appear in the order specified by the -instruction's syntax definition, which appear in the following sections -about each instruction. You cannot omit a field. Separate each -field from its neighbors with one or more spaces. -

    • When specifying a pathname, provide a full one. Partial pathnames -are interpreted relative to the current working directory (the one in which -the uss command is issued), with possibly unintended -results. -

    • Each instruction must appear on a single line in the template file, with a -newline character (<Return>) only at the end of the -instruction. Some example instructions appear in this document on more -than one line, but that is only for legibility. -

    • Provide a value for every variable that appears in the template by -including the corresponding argument to the uss add command or -placing a value in the corresponding field of the bulk input file -add instruction. A missing value halts the entire creation -operation. If a variable does not appear in the template file, the -command interpreter ignores the corresponding command-line argument or field -in the bulk input file, even if you provide it. -

    • You can use blank lines in the template file to increase its -legibility. If you place comments in the file, begin each comment line -with the number sign (#). -
    -

    About Creating Local Disk Directories and Files

    -

    It is possible to use the D, E, and -F instructions to create directories or files in the local file -system of the machine on which you are issuing the uss command, but -that usage is not recommended. It introduces two potential -complications: -

      -

    • The local file system automatically assigns ownership of a new local disk -directory or file to its creator. Because you are the issuer of the -uss command that is creating the object, it records your current -UNIX UID. If that is not appropriate and you want to designate another -owner as the object is created, then you must be logged in as the local -superuser root (the local file system allows only the -root user to issue the UNIX chown command, which the -uss command interpreter invokes to change the owner from the -default value). You must also use the -admin argument to the -uss add or uss bulk command to authenticate as a -privileged AFS administrator. Only an administrator can create -Authentication Database and Protection Database entries, which the -uss command interpreter always creates as part of a new -account. -

      The alternative is to become the local superuser root after the -uss operation completes, and issue the necessary chown -command then. However, that makes the account creation process that -much less automated. -

    • Creating a local disk directory always generates an error message because -the uss command interpreter cannot successfully set a local -directory's ACL. The directory is created nevertheless, and a -value still must appear in the D instruction's ACL -field. -
    -

    The recommended method for configuring a machine's local disk is to -use the AFS package utility instead; see Configuring Client Machines with the package Program. - - -

    Example uss Templates

    -

    This section describes example templates for the basic and -full account types (the template for an authentication-only account is -empty). -

    The first example creates a basic account. It contains two -G instructions and a V instruction that defines the -volume name, file server machine, partition, quota in kilobytes, mount point, -home directory owner, and home directory access control list. In the -ABC Corporation cell, a suitable template is: -

       G /afs/.abc.com/usr1
    -   G /afs/.abc.com/usr2
    -   V  user.$USER  $SERVER.abc.com  /vicep$PART  5000  $AUTO/$USER   $UID  \
    -        $USER all staff rl
    -
    -

    When issuing the uss add command with this type of template, -provide the following arguments: -

      -

    • -user to specify the username for the $USER variable -

    • -server to specify the unique part of the file server machine -name for the $SERVER variable -

    • -partition to specify the unique part of the partition name for -the $PART variable -
    -

    The Protection Server automatically assigns an AFS UID for the $UID -variable, and the G instructions provide a value for the $AUTO -variable. -

    The following example template file creates a full account in the ABC -Corporation cell. The following sections about each type of instruction -describe the effect of the examples. Note that the V and -E instructions appear on two lines each only for the sake of -legibility. -

       #
    -   # Specify the available grouping directories
    -   #
    -   G /afs/.abc.com/usr1
    -   G /afs/.abc.com/usr2
    -   #
    -   # Create the user's home volume
    -   #
    -   V user.$USER $SERVER.abc.com /vicep$PART 5000 /afs/.abc.com/$AUTO/$USER \
    -        $UID $USER all abc:staff rl
    -   #
    -   # Create directories and files for mail
    -   #
    -   D $MTPT/.MESSAGES 0700 $UID $USER all abc:staff none 
    -   D $MTPT/.Outgoing 0700 $UID $USER rlidwk postman rlidwk 
    -   D $MTPT/Mailbox 0700 $UID $USER all abc:staff none system:anyuser lik
    -   #
    -   # Here are some useful scripts for login etc.
    -   #
    -   F $MTPT/.Xbiff 0755 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/.Xresources 0644 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/.Xsession 0755 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/.cshrc 0755 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/.login 0755 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/.logout 0755 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/.twmrc 0644 $UID /afs/abc.com/admin/user/proto
    -   F $MTPT/preferences 0644 $UID /afs/abc.com/admin/user/proto
    -   #
    -   # Make a passwd entry
    -   #
    -   E /afs/.abc.com/common/etc/newaccts/passwd_$USER 0644 root \
    -        "$USER:X:$UID:11:$NAME:$MTPT:/bin/csh"
    -   #
    -   # Put in the standard password/authentication checks
    -   #
    -   A $USER 250 noreuse 9 25
    -   #
    -   # Create and mount a public volume for the user
    -   #
    -   X "create_public_vol $USER $1 $2"
    -   #
    -   # Here we set up the symbolic link to public directory
    -   #
    -   S /afs/abc.com/public/$USER $MTPT/public
    -
    - - - - - -

    Evenly Distributing User Home Directories with the G Instruction

    -

    In cells with thousands of user accounts, it often makes -sense to distribute the mount points for user volumes into multiple parent -directories, because placing them all in one directory noticeably slows down -directory lookup when a user home directory is accessed. A possible -solution is to create parent directories that group user home directories -alphabetically, or that reflect divisions like academic or corporate -departments. However, in a really large cell, some such groups can -still be large enough to slow directory lookup, and users who belong to those -groups are unfairly penalized every time they access their home -directory. Another drawback to groupings that reflect workplace -divisions is that you must move mount points when users change departmental -affiliation. -

    An alternative is an even distribution of user home directories into -multiple parent directories that do not represent workplace divisions. -The uss command suite enables you to define a list of directories -by placing a G instruction for each one at the top of the template -file, and then using the $AUTO variable in the V instruction's -mount_point field. When the uss command interpreter -encounters the $AUTO variable, it substitutes the directory named by a -G instruction that currently has the fewest entries. -(Actually, the $AUTO variable can appear in any field that includes a -pathname, in any type of instruction. In all cases, the command -interpreter substitutes the directory that currently has the fewest -entries.) -

    The G instruction's syntax is as follows: -

       G  directory
    -
    -

    where directory specifies either a complete directory pathname or -only the final element (the directory itself). The choice determines -the appropriate value to place in the V instruction's -mount_point field. -

    Specify the read/write path to each directory, to avoid the failure that -results when you attempt to create a new mount point in a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see Mounting Volumes. -

    For example, the ABC Corporation example template for a full account in Example uss Templates defines two directories: -

       G /afs/.abc.com/usr1
    -   G /afs/.abc.com/usr2
    -
    -

    and puts the value $AUTO/$USER in the V -instruction's mount_point field. An alternative with the -same result is to define the directories as follows: -

       G usr1
    -   G usr2
    -
    -

    and specify a more complete pathname in the V instruction's -mount_point field: -/afs/.abc.com/$AUTO/$USER. - - - - - - -

    Creating a Volume with the V Instruction

    -

    Unless the template file is empty (zero-length), one and -only one V instruction must appear in it. (To create other -volumes for a user as part of a uss account-creation operation, use -the X instruction to invoke the vos create command or a -script that invokes that command along with others, such as the fs -mkmount command. For an example, see Executing Commands with the X Instruction.) -

    The V instruction defines the following AFS entities: -

      -

    • A volume and associated VLDB entry -

    • The volume's site (file server machine and partition) -

    • The volume's mount point in the AFS filespace, which becomes the -user's home directory -

    • The volume's space quota -

    • The home directory's owner, usually the new user -

    • The home directory's ACL, which normally at least grants all -permissions to the user -
    -

    The following discussion of the fields in a V instruction refers -to the example in the full account template from Example uss Templates (the instruction appears here on two lines only for -legibility): -

       V  user.$USER  $SERVER.abc.com  /vicep$PART  5000  \
    -       /afs/.abc.com/$AUTO/$USER  $UID  $USER all abc:staff rl
    -
    -

    The V instruction's syntax is as follows: -

       V  volume_name  server  partition  quota  mount_point owner  ACL
    -
    -

    where -

    -

    V -
    Indicates a volume creation instruction. -

    volume_name -
    Specifies the volume's name as recorded in the VLDB. -

    To follow the convention of including the user's name as part of the -volume name, include the $USER variable in this field. The variable -takes its value from the -user argument to the uss add -command or from the bulk input file add instruction's -username field. -

    The ABC Corporation example uses the value user.$USER to -assign the conventional volume name, -user.username. When creating an account for -user smith, for example, you then include -user smith as -an argument to the uss add command, or place the value -smith in the bulk input file add instruction's -username field. -

    server -
    Names the file server machine on which to create the new volume. It -is best to provide a fully qualified host name (for example, -fs1.abc.com), but an abbreviated form is acceptable -if the cell's naming service is available to resolve it at the time the -volume is created. -

    To place different users' volumes on different file server machines, -use the $SERVER variable in this field, and provide a value for it either with -the -server argument to the uss add command or in the -server field of the bulk input file add -instruction. One easy way to specify a fully qualified hostname without -having to type it completely on the command line is to combine a constant and -the $SERVER variable. Specifically, the constant specifies the -domain-name suffix common to all the file server machines. -

    In the ABC Corporation example, all of the file server machines in the cell -share the abc.com domain name suffix, so the server -field combines a variable and constant: -$SERVER.abc.com. To place the new volume on -the machine fs1.abc.com, you then include --server fs1 as an argument to the uss add command, or -place the value fs1 in the bulk input file add -instruction's server field. -

    partition -
    Specifies the partition on which to create the user's volume; it -must be on the file server machine named in the server field. -Identify the partition by its complete name (for example, /vicepa) -or use one of the abbreviations listed in Rules for Using Abbreviations and Aliases. -

    To place different users' volumes on different partitions, use the -$PART variable in this field, and provide a value for it either with the --partition argument to the uss add command or in the -partition field of the bulk input file add -instruction. Because all full partition names start with the -/vicep string, it is convenient to combine that string as a -constant with the $PART variable. -

    The ABC Corporation example template combines the constant string -/vicep and the $PART variable in this way, as -/vicep$PART. - - - - -

    quota -
    Sets the maximum number of kilobyte blocks the volume can occupy on the -file server machine's disk. It must be an integer. If you -assign the same quota to all user volumes, specify a constant value. To -assign different quotas to different volumes, place one of the number -variables ($1 through $9) in this field, and provide a value for it either -with the -var argument to the uss add command or in the -appropriate field of the bulk input file add instruction. -

    The ABC Corporation example grants a 5000 KB initial quota to every new -user. - - - - -

    mount_point -
    Creates a mount point for the volume, which serves as the volume's -root directory and the user's home directory. By convention, user -home directory names include the username, which you can read in by including -the $USER variable in this field. -

    Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to create the new mount point in a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). If you use the $AUTO variable -in this field, the directories named by each G instruction possibly -already indicate the read/write path. For further discussion of the -concept of read/write and read-only paths through the filespace, see Mounting Volumes. -

    If other parts of the mount point name also vary from user to user, you can -use the $MTPT variable in this field, and provide a value with the uss -add command's -mount argument or in the -mount_point field of a bulk input file add -instruction. Note, however, that when the $MTPT variable appears in -subsequent instructions in the template (usually, in D, -E, or F instructions), it instead takes as its value the -complete contents of this field. -

    Combine constants and variables based on how you have decided to group home -directories together in one or more parent directories. Note that the -parent directories must already exist before you run a uss add or -uss bulk command that references the template. Possibilities -for grouping home directories include the following: - -

    -

      -

    • Placing all user home directories in a single parent directory; the -name /afs/cellname/usr is an AFS-appropriate -variation on the UNIX /usr convention. This choice is most -appropriate for a cell with a small number of user accounts. The -simplest way to implement this choice is to combine a constant string and the -$USER variable, as in /afs/.abc.com/usr/$USER. -

    • Distributing home directories evenly into a set of parent directories that -do not correspond to workplace divisions. This choice is appropriate in -cells with tens of thousands of accounts, where the number of home directories -is large enough to slow directory lookup significantly if they all reside -together in one parent directory, but distribution according to workplace -divisions is not feasible. -

      The $AUTO variable is designed to distribute home directories evenly in -this manner. As explained in Evenly Distributing User Home Directories with the G Instruction, the uss command interpreter substitutes the -directory that is defined by a preceding G template instruction and -that currently has the fewest entries. The example ABC Corporation -template illustrates this choice by using the value -/afs/.abc.com/$AUTO/$USER. -

    • Distributing home directories into multiple directories that reflect -divisions like academic or corporate departments. Perhaps the simplest -way to implement this scheme is to use the $MTPT variable to represent the -department, as in -/afs/.ghi.com/usr/$MTPT/$USER. You then -provide -user smith and -mount acctg arguments to the -uss add command to create the mount point -/afs/.ghi.com/usr/acctg/smith. -

    • Distributing home directories into alphabetic subdirectories of -usr (usr/a, usr/b and so on), based on the -first letter or letters in the username. The advantage is that knowing -the username enables you easily to locate a home directory. A potential -drawback is that the distribution is not likely to be even, and if there are a -large number of accounts, then slowed directory lookup unfairly affects users -whose names begins with popular letters. -

      Perhaps the simplest way to implement this scheme is to use the $MTPT -variable to represent the letter or letters, as in -/afs/.jkl.com/usr/$MTPT/$USER. Then provide -the -user smith and -mount s/m arguments to the uss -add command to create the mount point -/afs/.jkl.com/usr/s/m/smith. -

    -

    owner -
    Specifies the username or UID of the user to be designated the mount -point's owner in the output from the UNIX ls -ld -command. To follow the standard convention for home directory -ownership, use the $UID variable in this field, as in the ABC Corporation -example template. The Protection Server then automatically assigns an -AFS UID unless you provide the -uid argument to the uss -add command or fill in the uid field in the bulk input file -add instruction. (If you are converting existing UNIX -accounts, see the discussion of additional considerations in Converting Existing UNIX Accounts with uss.) - - - - -

    ACL -
    Sets the ACL on the new home directory. Provide one or more paired -values, each pair consisting of an AFS username or group name and the desired -permissions, in that order (a group name must already exist in the Protection -Database to be used). Separate the two parts of the pair, and each -pair, with a space. For a discussion of the available permissions, see The AFS ACL Permissions. -

    At minimum, grant all permissions to the new user by including the value -$USER all in this field. The File Server automatically -grants all permissions to the system:administrators group as -well. You cannot grant permissions to the issuer of the uss -command, because as the last step in account creation the uss -command interpreter automatically deletes that user from any ACLs set during -the creation process. -

    The ABC Corporation example uses the following value to grant all -permissions to the new user and r (read) and -l (lookup) permissions to the members of the -abc:staff group: -

    $USER all abc:staff rl -

    - - - - - - -

    Creating a Directory with the D Instruction

    -

    Each D instruction in the template file creates a -directory; there is no limit on the number of them in the -template. If a D instruction creates a subdirectory in a new -user's home directory (its intended use), then it must follow the -V instruction. Creating a directory on the local disk of the -machine where the uss command runs is not recommended for the -reasons outlined in About Creating Local Disk Directories and Files. -

    The following discussion of the fields in a D instruction refers -to one of the examples in the full account template in Example uss Templates: -

       D $MTPT/Mailbox 0700 $UID $USER all abc:staff none  system:anyuser lik
    -
    -

    The D instruction's syntax is as follows: -

       D  pathname  mode_bits  owner  ACL
    -
    -

    where -

    -

    D -
    Indicates a directory creation instruction. -

    pathname -
    Specifies the directory's full pathname. If it is a -subdirectory of the user's home directory, it is simplest to use the -$MTPT variable to specify the home directory pathname. When the $MTPT -variable appears in a D instruction, it takes its value from the -preceding V instruction's mount_point field (this -dependency is why a D instruction must follow the V -instruction). -

    Specify the read/write pathname to the directory, to avoid the failure that -results when you attempt to create a new directory in a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). If you use the $MTPT variable -in this field, the value in the V instruction's -mount_point field possibly already indicates the read/write -path. For further discussion of the concept of read/write and read-only -paths through the filespace, see Mounting Volumes. -

    The ABC Corporation example uses the value $MTPT/Mailbox to -place the Mailbox subdirectory in the user's home -directory. -

    mode_bits -
    Defines the directory's UNIX mode bits. Acceptable values are -the standard three- or four-digit numbers corresponding to a combination of -permissions. Examples: 0755 corresponds to -rwxr-xr-x, and 0644 to rw-r--r--. The -first (owner) x bit must be turned on to enable access to a -directory. -

    The ABC Corporation example uses the value 0700 to set the mode -bits on the Mailbox subdirectory to rwxr-----. -

    owner -
    Specifies the username or UID of the user to be designated the -directory's owner in the output from the UNIX ls -ld -command. -

    If the directory resides in AFS, place the $UID variable in this field, as -in the ABC Corporation example template. The Protection Server then -automatically assigns an AFS UID unless you provide the -uid -argument to the uss add command or fill in the uid field -in the bulk input file add instruction. (If you are -converting existing UNIX accounts, see the discussion of additional -considerations in Converting Existing UNIX Accounts with uss.) -

    If the directory resides on the local disk, it is simplest to specify the -username or UNIX UID under which you are issuing the uss -command. For a discussion of the complications that arise from -designating another user, see About Creating Local Disk Directories and Files. - - - - -

    ACL -
    Sets the ACL on the new directory. Provide one or more paired -values, each pair consisting of an AFS username or group name and the desired -permissions, in that order (a group name must already exist in the Protection -Database to be used). Separate the two parts of the pair, and each -pair, with a space. For a description of the available permissions, see -The AFS ACL Permissions. -

    At minimum, grant all permissions to the new user by including the value -$USER all. You cannot grant permissions to the issuer of the -uss command, because as the last step in account creation the -uss command interpreter automatically deletes that user from any -ACLs set during the creation process. An error message always appears -if the directory is on the local disk, as detailed in About Creating Local Disk Directories and Files. -

    The ABC Corporation example uses the following value to grant all -permissions to the new user, no permissions to the members of the -abc:staff group, and the l (lookup), -i (insert), and k (lock) -permissions to the members of the system:anyuser group: -

    $USER all abc:staff none system:anyuser lik -

    It grants such extensive permissions to the system:anyuser -group to enable any system user (including a mail-delivery daemon) to insert -mail into the Mailbox directory. The absence of the -r (read) permission prevents members of the -system:anyuser group from reading the mail files. -

    - - - - - - -

    Creating a File from a Prototype with the F Instruction

    -

    Each F instruction in the template file creates a -file by copying the contents of an existing prototype file; there is no -limit on the number of them in the template, and each can refer to a different -prototype. If an F instruction creates a file in a new -user's home directory or a subdirectory of it (the intended use), then it -must follow the V or D instruction that creates the -parent directory. Creating a file on the local disk of the machine -where the uss command runs is not recommended for the reasons -detailed in About Creating Local Disk Directories and Files. -

    The E instruction also creates a file, but the two types of -instruction have complementary advantages. Files created with an -E instruction can be customized for each user, because variables -can appear in the field that specifies the contents of the file. In -contrast, the contents of a file created using the F instruction -are the same for every user. An E file can be only a single -line, however, whereas an F file can be any length. -

    The following discussion of the fields in a F instruction refers -to one of the examples in the full account template in Example uss Templates: -

       F $MTPT/.login 0755 $UID /afs/abc.com/admin/user/proto
    -
    -

    The F instruction's syntax is as follows: -

       F  pathname  mode_bits  owner  prototype_file
    -
    -

    where -

    -

    F -
    Indicates a file creation instruction. -

    pathname -
    Specifies the full pathname of the file to create, including the -filename. If it resides in the user's home directory or a -subdirectory of it, it is simplest to use the $MTPT variable to specify the -home directory pathname. When the $MTPT variable appears in an -F instruction, it takes its value from the preceding V -instruction's mount_point field (this dependency is why an -F instruction must follow the V instruction). -

    Specify the read/write path to the file, to avoid the failure that results -when you attempt to create a new file in a read-only volume. By -convention, you indicate the read/write path by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). If you use the $MTPT variable -in this field, the value in the V instruction's -mount_point field possibly already indicates the read/write -path. For further discussion of the concept of read/write and read-only -paths through the filespace, see Mounting Volumes. -

    The ABC Corporation example uses the value $MTPT/.login -to place a file called .login in the user's home -directory. -

    mode_bits -
    Defines the file's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to a combination of -permissions. Examples: 0755 corresponds to -rwxr-xr-x, and 0644 to rw-r--r--. -

    The ABC Corporation example uses the value 0755 to set the mode -bits on the .login file to rwxr-xr-x. -

    owner -
    Specifies the username or UID of the user to be designated the file's -owner in the output from the UNIX ls -l command. -

    If the file resides in AFS, place the $UID variable in this field, as in -the ABC Corporation example template. The Protection Server then -automatically assigns an AFS UID unless you provide the -uid -argument to the uss add command or fill in the uid field -in the bulk input file add instruction. (If you are -converting existing UNIX accounts, see the discussion of additional -considerations in Converting Existing UNIX Accounts with uss.) -

    If the file resides on the local disk, it is simplest to specify the -username or UNIX UID under which you are issuing the uss -command. For a discussion of the complications that arise from -designating another user, see About Creating Local Disk Directories and Files. -

    prototype_file -
    Names the AFS or local directory that houses the prototype file to -copy. The prototype file's name must match the final element in -the pathname field. -

    The ABC Corporation example references a prototype file called -.login in the directory -/afs/abc.com/admin/user/proto. -

    - - - - - - -

    Creating One-Line Files with the E Instruction

    -

    Each E instruction in the template file creates a -file by echoing a specified single line into it; there is no limit on the -number of them in the template. If an E instruction creates -a file in a new user's home directory or a subdirectory of it (the -intended use), then it must follow the V or D -instruction that creates the parent directory. Creating a file on the -local disk of the machine where the uss command runs is not -recommended for the reasons detailed in About Creating Local Disk Directories and Files. -

    The F instruction also creates a file, but the two types of -instruction have complementary advantages. Files created with an -E instruction can be customized for each user, because variables -can appear in the field that specifies the contents of the file. The -command interpreter replaces the variables with appropriate values before -creating the file. In contrast, the contents of a file created using -the F instruction are the same for every user. An -E file can be only a single line, however, whereas an F -file can be any length. -

    The E instruction is particularly suited to creating an entry -for the new user in the cell's common source password file, which is then -copied to client machines to serve as the local password file -(/etc/passwd or equivalent). The following discussion of the -fields refers to an example of this type of use, from the ABC -Corporation's full account template shown in Example uss Templates. For further discussion of how to -incorporate the files created in this way into a common source password file, -see Creating a Common Source Password File. -

       E /afs/.abc.com/common/etc/newaccts/passwd_$USER 0644 root  \
    -      "$USER:X:$UID:11:$NAME:$MTPT:/bin/csh"
    -
    -

    The E instruction's syntax is as follows: -

       E  pathname  mode_bits  owner  "contents"
    -
    -

    where -

    -

    E -
    Indicates a file creation instruction. -

    pathname -
    Specifies the full pathname of the file to create, including the -filename. It can include variables. If it resides in the -user's home directory or a subdirectory of it, it is simplest to use the -$MTPT variable to specify the home directory pathname. When the $MTPT -variable appears in an E instruction, it takes its value from the -preceding V instruction's mount_point field (this -dependency is why an E instruction must follow the V -instruction.) -

    Specify the read/write path to the file, to avoid the failure that results -when you attempt to create a new file in a read-only volume. By -convention, you indicate the read/write path by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). If you use the $MTPT variable -in this field, the value in the V instruction's -mount_point field possibly already indicates the read/write -path. For further discussion of the concept of read/write and read-only -paths through the filespace, see Mounting Volumes. -

    The ABC Corporation example writes the file created by the E -instruction to /afs/.abc.com/common/etc/newaccts -directory, naming it after the new user: -

       /afs/.abc.com/common/etc/newaccts/passwd_$USER
    -
    -

    mode_bits -
    Defines the file's UNIX mode bits. Acceptable values are the -standard three- or four-digit numbers corresponding to a combination of -permissions. Examples: 0755 corresponds to -rwxr-xr-x, and 0644 to rw-r--r--. -

    The ABC Corporation example uses the value 0644 to set the mode -bits on the passwd_user file to -r-xr--r--. -

    owner -
    Specifies the username or UID of the user to be designated the file's -owner in the output from the UNIX ls -l command. -

    If the file resides in AFS and is to be owned by the user, place the $UID -variable in this field. The Protection Server then automatically -assigns an AFS UID unless you provide the -uid argument to the -uss add command or fill in the uid field in the bulk input -file add instruction. (If you are converting existing UNIX -accounts, see the discussion of additional considerations in Converting Existing UNIX Accounts with uss.) -

    If the file resides on the local disk, specify the username or UNIX UID -under which you are issuing the uss command. For a -discussion of the complications that arise from designating another user, see About Creating Local Disk Directories and Files. -

    The ABC Corporation example is creating an AFS file intended for -incorporation into the common password file, rather than for direct use by the -new user. It therefore designates the local superuser root -as the owner of the new file. Designating an alternate owner on an AFS -file does not introduce complications: issuing the chown -command on AFS files requires membership in the -system:administrators group, but the issuer of the -uss command is necessarily authenticated as a member of that -group. -

    contents -
    Specifies the one-line character string to write into the new file. -Surround it with double quotes if it contains one or more spaces. It -cannot contain the newline character, but can contain any of the standard -variables, which the command interpreter resolves as it creates the -file. -

    The ABC Corporation example has the following value in the -contents field, to create a password file entry: -

       $USER:X:$UID:10:$NAME:$MTPT:/bin/csh
    -
    -
    - - - - - - - - - - - -

    Creating Links with the L and S Instructions

    -

    Each L instruction in the template file creates a -hard link between two files, as achieved by the standard UNIX ln -command. The S instruction creates a symbolic link between -two files, as achieved by the standard UNIX ln -s command. -An explanation of links is beyond the scope of this document, but the basic -effect in both cases is to create a second name for an existing file, so that -it can be accessed via either name. Creating a link does not create a -second copy of the file. -

    There is no limit on the number of L or S -instructions in a template file. If the link is in a new user's -home directory or a subdirectory of it (the intended use), then it must follow -the V or D instruction that creates the parent -directory, and the F, E, or X instruction -that creates the file being linked to. Creating a file on the local -disk of the machine where the uss command runs is not recommended, -for the reasons detailed in About Creating Local Disk Directories and Files. -

    Note that AFS allows hard links only between files that reside in the same -directory. This restriction is necessary to eliminate the confusion -that results from associating two potentially different ACLs (those of the two -directories) with the same file. Symbolic links are legal between two -files that reside in different directories and even in different -volumes. The ACL on the actual file applies to the link as well. -

    You do not set the owner or mode bits on a link created with an -L or S instruction, as you do for directories or -files. The uss command interpreter automatically records the -UNIX UID of the uss command's issuer as the owner, and sets -the mode bits to lrwxrwxrwx (777). -

    The following discussion of the fields in an L or S -instruction refers to an example in the full account template from Example uss Templates, namely -

       S /afs/abc.com/public/$USER $MTPT/public
    -
    -

    The L and S instructions' syntax is as -follows: -

       L  existing_file  link
    -   S  existing_file  link
    -
    -

    where -

    -

    L -
    Indicates a hard link creation instruction. -

    S -
    Indicates a symbolic link creation instruction. -

    existing_file -
    Specifies the complete pathname of the existing file. If it resides -in the user's home directory or a subdirectory of it, it is simplest to -use the $MTPT variable to specify the home directory pathname. When the -$MTPT variable appears in an L or S instruction, it -takes its value from the preceding V instruction's -mount_point field (this dependency is why the instruction must follow -the V instruction). -

    Do not create a symbolic link to a file whose name begins with the number -sign (#) or percent sign (%). When the Cache -Manager reads a symbolic link whose contents begin with one of those -characters, it interprets it as a regular or read/write mount point, -respectively. -

    The ABC Corporation example creates a link to the publicly readable volume -created and mounted by a preceding X instruction, by specifying the -path to its mount point: -

       /afs/abc.com/public/$USER
    -
    -

    link -
    Specifies the complete pathname of the second name for the file. If -it resides in the user's home directory or a subdirectory of it, it is -simplest to use the $MTPT variable to specify the home directory -pathname. -

    Specify the read/write path to the link, to avoid the failure that results -when you attempt to create a new link in a read-only volume. By -convention, you indicate the read/write path by placing a period before the -cell name at the pathname's second level (for example, -/afs/.abc.com). If you use the $MTPT variable -in this field, the value in the V instruction's -mount_point field possibly already indicates the read/write -path. For further discussion of the concept of read/write and read-only -paths through the filespace, see Mounting Volumes. -

    The ABC Corporation example creates a link called public in the -user's home directory: -

       $MTPT/public
    -
    -
    - - - - -

    Increasing Account Security with the A Instruction

    -

    The A instruction in the template file enhances -cell security by imposing the following restrictions on users' password -choice and authentication attempts. -

      -

    • Limiting the user's password lifetime. When the lifetime -expires, the user can no longer use the password to authenticate and must -change it. -

    • Prohibiting the reuse of the user's 20 most-recently used -passwords. -

    • Limiting the number of consecutive times that a user can provide an -incorrect password during authentication, and for how long the Authentication -Server refuses further authentication attempts after the limit is exceeded -(referred to as an account lockout). For regular user -accounts in most cells, the recommended limit is nine and lockout time is 25 -minutes. -
    -

    The following discussion of the fields in an A instruction -refers to the example in the full account template from Example uss Templates, which sets a password lifetime of 250 days, prohibits reuse -of passwords, limits the number of failed authentication attempts to nine, and -creates a lockout time of 25 minutes if the authentication limit is -exceeded: -

       A $USER 250 noreuse 9 25
    -
    -

    The A instruction's syntax is as follows: -

       A  username  password_lifetime  password_reuse  failures  locktime
    -
    -

    where -

    -

    A -
    Indicates a security enhancing instruction. -

    username -
    Names the Authentication Database entry on which to impose security -restrictions. Use the $USER variable to read in the username from the -uss add command's -user argument, or from the -username field of an add instruction in the bulk input -file. The ABC Corporation example uses this value. -

    password_lifetime -
    Sets the number of days after the user's password is changed that it -remains valid. When the password becomes invalid (expires), the user is -unable to authenticate, but has 30 more days in which to issue the -kpasswd command to change the password (after that, only an -administrator can change it). -

    Specify an integer from the range 1 through 254 to -specify the number of days until expiration, the value 0 to -indicate that the password never expires, or the value $PWEXPIRES to read in -the number of days from the uss add or uss bulk -command's -pwexpires argument. If the A -instruction does not appear in the template file, by default the user's -password never expires. -

    The ABC Corporation example sets a password lifetime of 250 days. -

    password_reuse -
    Determines whether or not the user can change his or her password (using -the kpasswd or kas setpassword command) to one that is -similar to any of his or her last 20 passwords. The acceptable values -are reuse to allow reuse and noreuse to prohibit -it. If the A instruction does not appear in the template -file, the default is to allow password reuse. -

    The ABC Corporation example prohibits password reuse. -

    failures -
    Sets the number of consecutive times the user can provide an incorrect -password during authentication (using the klog command or a login -utility that grants AFS tokens). When the user exceeds the limit, the -Authentication Server rejects further authentication attempts for the amount -of time specified in the locktime field. -

    Specify an integer from the range 1 through 254 to -specify the number of failures permitted, or the value 0 to -indicate that there is no limit to the number of unsuccessful attempts. -If the A instruction does not appear in the template file, the -default is to allow an unlimited number of failures. -

    The ABC Corporation example sets the limit to nine failed attempts. -

    locktime -
    Specifies how long the Authentication Server refuses authentication -attempts from a user who has exceeded the failure limit set in the -failures field. -

    Specify a number of hours and minutes (hh:mm) or -minutes only (mm), from the range 01 (one minute) through -36:00 (36 hours). The Authentication Server -automatically reduces any larger value to 36:00 and also -rounds up any nonzero value to the next highest multiple of 8.5 -minutes. A value of 0 (zero) sets an infinite lockout time, -in which case an administrator must always issue the kas unlock -command to unlock the account. -

    The ABC Corporation example sets the lockout time to 25 minutes, which is -rounded up to 25 minutes 30 seconds (the next highest multiple of 8.5 -minutes). -

    - - - - - - -

    Executing Commands with the X Instruction

    -

    The X instruction in the template file executes a -command, which can be a standard UNIX command, a shell script or program, or -an AFS command. The command string can include standard template -variables, and any number of X instructions can appear in a -template file. If an instruction manipulates an element created by -another instruction, it must appear after that instruction. -

    The following discussion of the field in an X instruction refers -to the example in the full account template from Example uss Templates: -

       X "create_public_vol $USER $1 $2"
    -
    -

    The X instruction's syntax is as follows: -

       X "command"
    -
    -

    where command specifies the command to execute. Surround it -with double quotes if it contains spaces. The command string can -contain any of the standard variables, which the uss command -interpreter resolves before passing the command on to the appropriate other -command interpreter, but it cannot contain newline characters. -

    The ABC Corporation example invokes a script called -create_public_vol, which creates another volume associated with the -new user and mounts it in a publicly readable part of the ABC -Corporation's filespace: -

       "create_public_vol $USER $1 $2"
    -
    -

    It uses the $USER variable to read in the username and make it part of both -the volume name and mount point name. The uss command issuer -supplies a file server machine name for the $1 variable and a partition name -for the $2 variable, to specify the site for the new volume. - - - - - - - - - - - -


    Creating Individual Accounts with the uss add Command

    -

    After you have created a template file, you can create an -individual account by issuing the uss add command (for template -creation instructions see Constructing a uss Template File). When you issue the command, the uss -command interpreter contacts various AFS servers to perform the following -actions: -

      -

    • Create a Protection Database entry. By default, the Protection -Server assigns an AFS UID which becomes the value of the $UID variable used in -the template. -

    • Create an Authentication Database entry, recording an encrypted version of -the initial password. -

    • Create the account components defined in the indicated template file, -contacting the File Server, Volume Server, and Volume Location (VL) Server as -necessary. -
    -

    To review which types of instructions to include in a template to create -different file system objects, see Constructing a uss Template File. If the template is empty, the uss add -command creates an authentication-only account consisting of Protection -Database and Authentication Database entries. -

    When you issue the uss add command, provide a value for each -variable in the template file by including the corresponding command-line -argument. If you fail to supply a value for a variable, the -uss command interpreter substitutes a null string, which usually -causes the account creation to fail. If you include a command line -argument for which the corresponding variable does not appear in the template, -it is ignored. -

    Table 4 summarizes the mappings between variables and the arguments -to the uss add command. It is adapted from Table 3, but includes only those variables that take their value -from command line arguments. -
    -

    Table 4. Command-line argument sources for uss template variables
    - - - - - - - - - - -
    Variable -Command-line Argument -
    $MTPT --mount (for occurrence in V instruction) -
    $NAME --realname if provided; otherwise -user -
    $PART --partition -
    $PWEXPIRES --pwexpires -
    $SERVER --server -
    $UID --uid if provided; otherwise allocated by Protection -Server -
    $USER --user -
    $1 through $9 --var -
    -

    To create an AFS account with the uss add command

    -
      -

    1. Authenticate as an AFS identity with all of the following -privileges. In the conventional configuration, the admin -user account has them, or you possibly have a personal administrative -account. (To increase cell security, it is best to create special -privileged accounts for use only while performing administrative -procedures; for further discussion, see An Overview of Administrative Privilege.) If necessary, issue the klog -command to authenticate. -
         % klog admin_user
      -   Password: admin_password
      -
      -

      The following list specifies the necessary privileges and indicates how to -check that you have them. -

        -

      • Membership in the system:administrators group. If -necessary, issue the pts membership command, which is fully -described in To display the members of the system:administrators group. -
           % pts membership system:administrators
        -   
        -
        -

      • Inclusion in the /usr/afs/etc/UserList file. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
           % bos listusers <machine name>
        -
        -

      • The ADMIN flag on the Authentication Database entry. -However, the Authentication Server always prompts you for a password in order -to perform its own authentication. The following instructions direct -you to specify the administrative identity on the uss command line -itself. -

      • The i (insert) and l (lookup) -permissions on the ACL of the directory in which you are mounting the -user's volume. If necessary, issue the fs listacl -command, which is fully described in Displaying ACLs. -
           % fs listacl [<dir/file path>]
        -
        -

        Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

      -

    2. (Optional) Log in as the local superuser -root. This is necessary only if you are creating new files -or directories in the local file system and want to designate an alternate -owner as the object is created. For a discussion of the issues -involved, see About Creating Local Disk Directories and Files. -

    3. Verify the location and functionality of the template file you are -using. For a description of where the uss command -interpreter expects to find the template, see Where to Place Template Files. You can always provide an alternate pathname if you -wish. Also note the variables used in the template, to be sure that you -provide the corresponding arguments on the uss command line. -

    4. (Optional) Change to the directory where the -template resides. This affects the type of pathname you must type in -Step 6. -
         % cd template_directory
      -
      -

    5. (Optional) Run the uss add command with the --dryrun flag to preview the creation of the account. Note -any error messages and correct the cause before reissuing the command without -the -dryrun flag. The next step describes the uss -add command's syntax. For more information on the --dryrun flag, see Avoiding and Recovering from Errors and Interrupted Operations. - - -

    6. Issue the uss add command to create the -account. Enter the command on a single line; it appears here on -multiple lines only for legibility. -

      The uss add operation creates an Authentication Database -entry. The Authentication Server performs its own authentication rather -than accepting your existing AFS token. By default, it authenticates -your local (UNIX) identity, which possibly does not correspond to an -AFS-privileged administrator. Include the -admin argument to -name an identity that has the ADMIN flag on its Authentication -Database entry. To verify that an entry has the flag, issue the -kas examine command as described in To check if the ADMIN flag is set. -

         % uss add -user <login name>  -admin <administrator to authenticate>   \
      -             [-realname <full name in quotes>] [-pass <initial passwd>]   \
      -             [-pwexpires <password expires in [0..254] days (0 => never)>]  \
      -             [-server <FileServer for home volume>]  \
      -             [-partition <FileServer's disk partition for home volume>]  \
      -             [-mount <home directory mount point>]  \
      -             [-uid <uid to assign the user>]  \
      -             [-template <pathname of template file>]  \
      -             [-var <auxiliary argument pairs (Numval)>+] [-dryrun] \
      -             [-overwrite] 
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      ad -
      Is the shortest acceptable abbreviation of add. -

      -user -
      Names the user's Authentication Database and Protection Database -entries. Because it becomes the username (the name under which a user -logs in), it must obey the restrictions that many operating systems impose on -usernames (usually, to contain no more than eight lowercase letters). -Also avoid the following characters: colon (:), -semicolon (;), comma (,), at sign (@), -space, newline, and the period (.), which is conventionally -used only in special administrative names. -

      This argument provides the value for the $USER variable in the template -file. For suggestions on standardizing usernames, see Choosing Usernames and Naming Other Account Components. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -

      -realname -
      Specifies the user's actual full name. If it contains spaces -or punctuation, surround it with double quotes. If you do not provide -it, it defaults to the username provided with the -user -argument. -

      This argument provides the value for the $NAME variable in the template -file. For information about using this argument and variable as part of -an automated process for creating entries in a local password file such as -/etc/passwd, see Creating a Common Source Password File. -

      -pass -
      Specifies the user's initial password. Although the AFS -commands that handle passwords accept strings of virtually unlimited length, -it is best to use a password of eight characters or less, which is the maximum -length that many applications and utilities accept. -

      Possible choices for initial passwords include the username, a string of -digits such as those from a Social Security number, or a standard string such -as changeme, which is the default if you do not provide this -argument. There is no corresponding variable in the template -file. -

      Instruct users to change their passwords to a truly secret string as soon -as they authenticate with AFS for the first time. The AFS User -Guide explains how to use the kpasswd command to change an -AFS password. -

      -pwexpires -
      Sets the number of days after a user's password is changed that it -remains valid. Provide an integer from the range 1 through -254 to specify the number of days until expiration, or the value -0 to indicate that the password never expires (the default if you -do not provide this argument). When the password becomes invalid -(expires), the user is unable to authenticate, but has 30 more days in which -to issue the kpasswd command to change the password; after -that, only an administrator can change it. -

      This argument provides the value for the $PWEXPIRES variable in the -template file. -

      -server -
      Names the file server machine on which to create the new user's home -volume. It is best to provide a fully qualified hostname (for example, -fs1.abc.com), but an abbreviated form is acceptable -provided that the cell's naming service is available to resolve it when -you issue the uss add command. -

      This argument provides the value for the $SERVER variable in the template -file. To avoid having to type a fully qualified hostname on the command -line, combine the $SERVER variable with a constant (for example, the -cell's domain name) in the server field of the V -instruction in the template file. For an example, see Creating a Volume with the V Instruction. -

      -partition -
      Specifies the partition on which to create the user's home -volume; it must be on the file server machine named by the --server argument. Identify the partition by its complete -name (for example, /vicepa), or use one of the abbreviations listed -in Rules for Using Abbreviations and Aliases. -

      This argument provides the value for the $PART variable in the template -file. -

      -mount -
      Specifies the pathname for the user's home directory in the -cell's read/write filespace. Partial pathnames are interpreted -relative to the current working directory. -

      This argument provides the value for the $MTPT variable in the template -file, but only when it appears in the V instruction's -mount_point field. When the $MTPT variable appears in any -subsequent instructions, it takes its value from the V -instruction's mount_point field, rather than directly from this -argument. For more details, and for suggestions about how to use this -argument and the $MTPT variable, see Creating a Volume with the V Instruction. -

      -uid -
      Specifies a positive integer other than 0 (zero) to assign as -the user's AFS UID. It is best to omit this argument and allow the -Protection Server to assign an AFS UID that is one greater than the current -value of the max user id counter. (To display the counter, -use the pts listmax command as described in To display the AFS ID counters.) -

      If you have a reason to use this argument (perhaps because the user already -has a UNIX UID), first use the pts examine command to verify that -there is no existing account with the desired AFS UID; if there is, the -account creation process terminates with an error. -

      This argument provides the value for the $UID variable in the template -file. -

      -template -
      Specifies the pathname of the template file. If you omit this -argument, the command interpreter searches for a template file called -uss.template in each of the following directories in -turn: -
        -

      1. The current working directory -

      2. /afs/cellname/common/uss, where -cellname names the local cell -

      3. /etc -
      -

      If you specify a filename other than uss.template but -without a pathname, the command interpreter searches for it in the indicated -directories. If you provide a full or partial pathname, the command -interpreter consults the specified file only; it interprets partial -pathnames relative to the current working directory. -

      If the specified template file is empty (zero-length), the command creates -Protection and Authentication Database entries only. -

      To learn how to construct a template file, see Constructing a uss Template File. -

      -var -
      Specifies values for each of the number variables $1 through $9 that can -appear in the template file. You can use the number variables to assign -values to variables in the uss template file that are not part of -the standard set. -

      For each instance of this argument, provide two parts in the indicated -order, separated by a space: -

        -

      • The integer from the range 1 through 9 that matches -the variable in the template file. Do not precede it with a dollar -sign. -

      • A string of alphanumeric characters to assign as the value of the -variable. -
      -

      To learn about suggested uses for the number variables, see the description -of the V instruction's quota field in Creating a Volume with the V Instruction. -

      -dryrun -
      Reports actions that the command interpreter needs to perform to run the -command, without actually performing them. -

      -overwrite -
      Overwrites any directories, files, and links that exist in the file system -and for which there are definitions in D, E, -F, L, or S instructions in the template file -named by the -template argument. If you omit this flag, the -command interpreter prompts you once for confirmation that you want to -overwrite all such elements. -
      -

    7. If the new user home directory resides in a replicated volume, use the -vos release command to release the volume, as described in To replicate a read/write volume (create a read-only volume). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -
      Note:This step can be necessary even if the home directory's parent directory -is not itself a mount point for a replicated volume (and is easier to overlook -in that case). For example, the ABC Corporation template puts the mount -points for user volumes in the /afs/abc.com/usr -directory. Because that is a regular directory rather than a mount -point, it resides in the root.cell volume mounted at the -/afs/abc.com directory. That volume is replicated, so -after changing it by creating a new mount point the administrator must issue -the vos release command. -
      -

    8. Create an entry for the new user in the local password file -(/etc/passwd or equivalent) on each AFS client machine that he or -she can log into. For suggestions on automating this step, see Creating a Common Source Password File. -

      Even if you do not use the automated method, set the user's UNIX UID -to match the AFS UID assigned automatically by the Protection Server or -assigned with the -uid argument. The new user's AFS UID -appears in the trace produced by the uss add output, or you can use -the pts examine command to display it, as described in To display a Protection Database entry. -

    - - - - - - - -

    Deleting Individual Accounts with the uss delete Command

    -

    The uss delete command deletes an AFS user -account according to the arguments you provide on the command line; -unlike the uss add command, it does not use a template file. -When you issue the command, the uss command interpreter contacts -various AFS servers to perform the following actions: -

      -

    • Remove the mount point for the user's home volume -

    • Remove the user's home volume and delete the associated VLDB entry, -unless you include the -savevolume flag -

    • Delete the user's Authentication Database entry -

    • Delete the user's Protection Database entry -
    -

    Before issuing the uss delete command, you can also perform the -following optional tasks: -

      -

    • Copy the user's home volume to tape or another permanent medium and -record the username and UID on a reserved list. This information -enables you to restore the user's account easily if he or she returns to -your cell. For information about using the AFS Backup System to back up -volumes, see Configuring the AFS Backup System and Backing Up and Restoring AFS Data. -

    • If the user has exclusive use of any other volumes (such as a volume for -storing project-related data), make a backup copy of each one and then remove -it and its mount point as instructed in Removing Volumes and their Mount Points. -

    • Use the pts listowned command to display any groups that the -user owns; instructions appear in To list the groups that a user or group owns. Decide whether to use the pts delete -command to remove the groups or the pts chown command to transfer -ownership to another user or group. Instructions appear in To delete Protection Database entries and To change a group's owner. Alternatively, you can have the -user remove or transfer ownership of the groups before leaving. A group -that remains in the Protection Database after its owner is removed is -considered orphaned, and only members of the -system:administrators group can administer it. -
    -

    You can automate some of these tasks by including exec -instructions in the bulk input file and using the uss bulk command -to delete the account. See Creating and Deleting Multiple Accounts with the uss bulk Command. -

    To delete an AFS account

    -
      -

    1. Authenticate as an AFS identity with all of the following -privileges. In the conventional configuration, the admin -user account has them, or you possibly have a personal administrative -account. (To increase cell security, it is best to create special -privileged accounts for use only while performing administrative -procedures; for further discussion, see An Overview of Administrative Privilege.) If necessary, issue the klog -command to authenticate. -
         % klog admin_user
      -   Password: admin_password
      -
      -

      The following list specifies the necessary privileges and indicates how to -check that you have them. -

        -

      • Membership in the system:administrators group. If -necessary, issue the pts membership command, which is fully -described in To display the members of the system:administrators group. -
           % pts membership system:administrators
        -   
        -
        -

      • Inclusion in the /usr/afs/etc/UserList file. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
           % bos listusers <machine name>
        -
        -

      • The ADMIN flag on the Authentication Database entry. -However, the Authentication Server always prompts you for a password in order -to perform its own authentication. The following instructions direct -you to specify the administrative identity on the uss command line -itself. -

      • The d (delete) permission on the ACL of the -directory that houses the user's home directory. If necessary, -issue the fs listacl command, which is fully described in Displaying ACLs. -
           % fs listacl [<dir/file path>]
        -
        -

        Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

      -

    2. Consider and resolve the issues discussed in the introduction to this -section concerning the continued maintenance of a deleted user's account -information, owned groups, and volumes. -

    3. (Optional) Run the uss delete command with the --dryrun flag to preview the deletion of the account. Note -any error messages and correct the cause before reissuing the command without -the -dryrun flag. The next step describes the uss -delete command's syntax. - - -

    4. Issue the uss delete command to delete the account. -Enter the command on a single line; it appears here on multiple lines -only for legibility. -

      The delete operation always removes the user's entry from the -Authentication Database. The Authentication Server performs its own -authentication rather than accepting your existing AFS token. By -default, it authenticates your local (UNIX) identity, which possibly does not -correspond to an AFS-privileged administrator. Include the --admin argument to name an identity that has the ADMIN -flag on its Authentication Database entry. To verify that an entry has -the flag, issue the kas examine command as described in To check if the ADMIN flag is set. -

         % uss delete -user <login name>  \ 
      -                -mountpoint <mountpoint for user's volume>  \
      -                [-savevolume]  -admin  <administrator to authenticate>  \
      -                [-dryrun] 
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      d -
      Is the shortest acceptable abbreviation of delete. -

      -user -
      Names the entry to delete from the Protection and Authentication -Databases. -

      -mountpoint -
      Specifies the pathname of the mount point to delete (the user's home -directory). Unless the -savevolume argument is included, the -volume mounted there is also deleted from the file server machine where it -resides, as is its record from the VLDB. Partial pathnames are -interpreted relative to the current working directory. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to delete a mount point from a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see Mounting Volumes. -

      -savevolume -
      Retains the user's volume and VLDB entry. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -

      -dryrun -
      Reports actions that the command interpreter needs to perform to run the -command, without actually performing them. -
      -

    5. If the deleted user home directory resided in a replicated volume, use the -vos release command to release the volume, as described in To replicate a read/write volume (create a read-only volume). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -
      Note:This step can be necessary even if the home directory's parent directory -is not itself a mount point for a replicated volume (and is easier to overlook -in that case). For example, the ABC Corporation template puts the mount -points for user volumes in the /afs/abc.com/usr -directory. Because that is a regular directory rather than a mount -point, it resides in the root.cell volume mounted at the -/afs/abc.com directory. That volume is replicated, so -after changing it by deleting a mount point the administrator must issue the -vos release command. -
      -

    6. Delete the user's entry from the local password file -(/etc/passwd or equivalent) of each client machine. If you -use the AFS package utility, it is sufficient to remove the entry -from the common source version of the file. If you intend to reactivate -the user's account in the future, it is simpler to comment out the entry -or place an asterisk (*) in the password field. -
    - - - - - -

    Creating and Deleting Multiple Accounts with the uss bulk Command

    -

    The uss bulk command allows you to create and -delete many accounts at once. Before executing the command, you must -

      -

    • Construct a template if you plan to create any accounts, just as you must -do before running the uss add command. The same template -applies to all accounts created by a single uss bulk -command. -

    • Construct a bulk input file of instructions that create and delete -accounts and execute any related commands, as described in Constructing a Bulk Input File. -
    - - -

    Constructing a Bulk Input File

    -

    You can include five types of instructions in a bulk input -file: add, delete, exec, -savevolume, and delvolume. The following sections -discuss their uses. -

    Creating a User Account with the add Instruction -

    Each add instruction creates a single user account, and so is -basically the equivalent of issuing one uss add command. -There is no limit to the number of add instructions in the bulk -input file. -

    As indicated by the following syntax statement, the order of the -instruction's fields matches the order of arguments to the uss -add command (though some of the command's arguments do not have a -corresponding field). Like the uss add command's -arguments, many of the fields provide a value for a variable in the -uss template file. Each instruction must be a single line in -the file (have a newline character only at its end); it appears on -multiple lines here only for legibility. -

       add username[:full_name][:initial_password][:password_expires]
    -   [:file_server][:partition][:mount_point][:uid]
    -   [:var1][:var2][:var3][:var4][:var5][:var6][:var7][:var8][:var9][:]
    -
    -

    For a complete description of the acceptable values in each field, see the -uss Bulk Input File reference page in the AFS Administration -Reference, or the description of the corresponding arguments to the -uss add command, in To create an AFS account with the uss add command. Following are some basic notes: -

      -

    • Begin the line with the string add only, not uss -add. -

    • Only the first argument, username, is required. It -corresponds to the -user argument to the uss add -command. -

    • Do not surround the full_name value with double quotes, even -though you must use them around the value for the -realname -argument to the uss add command. -

    • If you want to omit a value for an argument, indicate an empty field by -using two colons with nothing between them. Leaving a field empty is -acceptable if the corresponding command line argument is optional or if the -corresponding variable does not appear in the template file. For every -field that precedes the last one to which you assign an actual value, you must -either provide a value or indicate an empty field. It is acceptable, -but not necessary, to indicate empty fields after the last one in which you -assign a value. -

    • After the last field, end the line with either a colon and newline -character (<Return>), or a newline alone. -

    • The final nine fields are for assigning values to the number variables ($1 -through $9), with the fields listed in increasing numerical order. -Specify the value only, not the variable number. -
    -

    Deleting a User Account with the delete Instruction -

    Each delete instruction deletes a single user account, and so is -basically the equivalent of issuing one uss delete command. -There is no limit to the number of delete instructions in the bulk -input file. -

    Like all instructions in the bulk input file, each delete -instruction must be a single line in the file (have a newline character only -at its end), even though it can cover multiple lines on a display -screen. The curly braces ({ }) indicate two mutually -exclusive choices. -

       delete username:mount_point_path[:{ savevolume | delvolume }][:]
    -
    -

    For a complete description of the acceptable values in each field, see the -uss Bulk Input File reference page in the AFS Administration -Reference or the description of the corresponding arguments to the -uss delete command, in To delete an AFS account. Following are some basic notes: -

      -

    • Begin the line with the string delete only, not uss -delete. -

    • The first two arguments, username and mount_point_path, -are required. They correspond to the -user and --mountpoint arguments to the uss delete command. -

    • The third field, which is optional, controls whether the user's home -volume is removed from the file server where it resides, along with the -corresponding VLDB entry. There are three possible values: -
        -

      • No value treats the volume and VLDB entry according to the prevailing -default, which is established by a preceding savevolume or -delvolume instruction in the template file. See the -following discussion of those instructions to learn how the default is -set. -

      • The string savevolume preserves the volume and VLDB entry, -overriding the default. -

      • The string delvolume removes the volume and VLDB entry, -overriding the default. -
      -

    • After the last field, end the line with either a colon and newline -character (<Return>), or a newline alone. -
    -

    Running a Command or Script with the exec Instruction -

    The exec instruction runs the indicated AFS command, compiled -program, or UNIX shell script or command. The command processor assumes -the AFS and local identities of the issuer of the uss bulk command, -who must have the privileges required to run the command. -

    The instruction's syntax is as follows: -

       exec command
    -
    -

    It is not necessary to surround the command string with double -quotes (" ") or other delimiters. -

    Setting the Default Treatment of Volumes with the delvolume and -savevolume Instructions -

    The savevolume and delvolume instructions set the -default treatment of volumes referenced by the delete instructions -that follow them in the bulk input file. Their syntax is as -follows: -

       savevolume
    -   delvolume
    -
    -

    Both instructions are optional and take no arguments. If neither -appears in the bulk input file, then by default all volumes and VLDB entries -referenced by delete instructions are removed. If the -savevolume instruction appears in the file, it prevents the removal -of the volume and VLDB entry referenced by all subsequent delete -instructions in the file. The delvolume instruction -explicitly establishes the default (which is deletion) for subsequent -delete instructions. -

    The effect of either instruction lasts until the end of the bulk input -file, or until its opposite appears. To override the prevailing default -for a particular delete instruction, put the savevolume -or delvolume string in the instruction's third field. -(You can also use multiple instances of the savevolume and -delvolume instructions to toggle back and forth between default -preservation and deletion of volumes.) -

    Example Bulk Input File Instructions

    -

    To create an authentication-only account, use an add -instruction like the following example, which includes only the first -(username) argument. The user's real name is set to match -the username (anderson) and her initial password is set to the -string changeme. -

       add anderson 
    -
    -

    The following example also creates an authentication-only account, but sets -nondefault values for the real name and initial password. -

       add smith:John Smith:js_pswd
    -
    -

    The next two example add instructions require that the -administrator of the ABC Corporation cell (abc.com) has -written a uss template file with the following V -instruction in it: -

       V user.$USER $SERVER.abc.com /vicep$PART 10000 /afs/.abc.com/usr/$3/$USER \
    -       $UID $USER all
    -
    -

    To create accounts for users named John Smith from the Marketing Department -and Pat Jones from the Finance Department, the appropriate add -instructions in the bulk input file are as follows: -

       add smith:John Smith:::fs1:a:::::marketing
    -   add jones:Pat Jones:::fs3:c:::::finance
    -
    -

    The new account for Smith consists of Protection and Authentication -Database entries called smith. His initial password is the -default string changeme, and the Protection Server generates his -AFS UID. His home volume, called user.smith, has a -10,000 KB quota, resides on partition /vicepa of file server -machine fs1.abc.com, and is mounted at -/afs/.abc.com/usr/marketing/smith. The final -$UID $USER all part of the V instruction gives him -ownership of his home directory and all permissions on its ACL. The -account for jones is similar, except that it resides on partition -/vicepc of file server machine fs3.abc.com -and is mounted at -/afs/.abc.com/usr/finance/jones. -

    Notice that the fields corresponding to mount_point, uid, -var1, and var2 are empty (between the values a -and marketing on the first example line) because the corresponding -variables do not appear in the V instruction in the template -file. The initial_passwd and password_expires fields -are also empty. -

    If you wish, you can specify values or empty fields for all nine number -variables in an add instruction. In that case, the bulk -input file instructions are as follows: -

       add smith:John Smith:::fs1:a:::::marketing::::::
    -   add jones:Pat Jones:::fs3:c:::::finance::::::
    -
    -

    The following example is a section of a bulk input file with a number of -delete instructions and a savevolume instruction. -Because the first three instructions appear before the savevolume -instruction and their third field is blank, the corresponding volumes and VLDB -entries are removed. The delete instruction for user -terry follows the savevolume instruction, so her volume -is not removed, but the volume for user johnson is, because the -delvolume string in the third field of the delete -instruction overrides the current default. -

       delete smith:/afs/abc.com/usr/smith
    -   delete pat:/afs/abc.com/usr/pat
    -   delete rogers:/afs/abc.com/usr/rogers
    -   savevolume
    -   delete terry:/afs/abc.com/usr/terry
    -   delete johnson:/afs/abc.com/usr/johnson:delvolume
    -
    -

    The following example exec instruction is useful as a separator -between a set of add instructions and a set of delete -instructions. It generates a message on the standard output stream that -informs you of the uss bulk command's progress. -

       exec echo "Additions completed; beginning deletions..."
    -
    -

    To create and delete multiple AFS user accounts

    -
      -

    1. Authenticate as an AFS identity with all of the following -privileges. In the conventional configuration, the admin -user account has them, or you possibly have a personal administrative -account. (To increase cell security, it is best to create special -privileged accounts for use only while performing administrative -procedures; for further discussion, see An Overview of Administrative Privilege.) If necessary, issue the klog -command to authenticate. -
         % klog admin_user
      -   Password: admin_password
      -
      -

      The following list specifies the necessary privileges and indicates how to -check that you have them. -

        -

      • Membership in the system:administrators group. If -necessary, issue the pts membership command, which is fully -described in To display the members of the system:administrators group. -
           % pts membership system:administrators
        -   
        -
        -

      • Inclusion in the /usr/afs/etc/UserList file. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
           % bos listusers <machine name>
        -
        -

      • The ADMIN flag on the Authentication Database entry. -However, the Authentication Server always prompts you for a password in order -to perform its own authentication. The following instructions direct -you to specify the administrative identity on the uss command line -itself. -

      • The d (delete), i (insert) and -l (lookup) permissions on the ACL of the parent -directory for each volume mount point. If necessary, issue the fs -listacl command, which is fully described in Displaying ACLs. -
           % fs listacl [<dir/file path>]
        -
        -

        Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

      -

    2. (Optional.) Log in as the local superuser -root. This is necessary only if you are creating new files -or directories in the local file system and want to designate an alternate -owner as the object is created. For a discussion of the issues -involved, see About Creating Local Disk Directories and Files. -

    3. If the bulk input file includes add instructions, verify the -location and functionality of the template you are using. For a -description of where the uss command interpreter expects to find -the template, see Where to Place Template Files. You can always provide an alternate pathname if you -wish. Also note which variables appear in the template, to be sure that -you provide the corresponding arguments in the add instruction or -on the uss bulk command line. -

    4. Create a bulk input file that complies with the rules listed in Constructing a Bulk Input File. It is simplest to put the file in the same directory -as the template file you are using. -

    5. (Optional.) Change to the directory where the bulk input -file and template file reside. -
         % cd template_directory
      -
      - - -

    6. Issue the uss bulk command to create or delete -accounts, or both. Enter the command on a single line; it appears -here on multiple lines only for legibility. -

      The bulk operation always manipulates user entries in the Authentication -Database. The Authentication Server performs its own authentication -rather than accepting your existing AFS token. By default, it -authenticates your local (UNIX) identity, which possibly does not correspond -to an AFS-privileged administrator. Include the -admin -argument to name an identity that has the ADMIN flag on its -Authentication Database entry. To verify that an entry has the flag, -issue the kas examine command as described in To check if the ADMIN flag is set. -

         % uss bulk <bulk input file>  \
      -              [-template <pathname of template file>]  \
      -              -admin <administrator to authenticate>  \
      -              [-dryrun] [-overwrite]  \
      -              [-pwexpires <password expires in [0..254] days (0 => never)>]  \
      -              [-pipe]
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      b -
      Is the shortest acceptable abbreviation of bulk. -

      bulk input file -
      Specifies the pathname of the bulk input file. Partial pathnames -are interpreted relative to the current working directory. For a -discussion of the required file format, see Constructing a Bulk Input File. -

      -template -
      Specifies the pathname of the template file for any uss add -commands that appear in the bulk input file. Partial pathnames are -interpreted relative to the current working directory. For a discussion -of the required file format, see Constructing a uss Template File. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as the admin account. -The password prompt echoes it as admin_user. Enter the -appropriate password as admin_password. -

      -dryrun -
      Reports actions that the command interpreter needs to perform to run the -command, without actually performing them. -

      -overwrite -
      Overwrites any directories, files and links that exist in the file system -and for which there are also D, E, F, -L, or S instructions in the template file named by the --template argument. If this flag is omitted, the command -interpreter prompts, once for each add instruction in the bulk -input file, for confirmation that it is to overwrite such elements. Do -not include this flag if there are no add instructions in the bulk -input file. -

      -pwexpires -
      Sets the number of days after a user's password is changed that it -remains valid, for each user named by an add instruction in the -bulk input file. Provide an integer from the range 1 through -254 to specify the number of days until expiration, or the value -0 to indicate that the password never expires (the default). -

      When the password becomes invalid (expires), the user is unable to -authenticate, but has 30 more days in which to issue the kpasswd -command to change the password (after that, only an administrator can change -it). -

      -pipe -
      Suppresses the Authentication Server's prompt for the password of the -issuer or the user named by the -admin argument (the Authentication -Server always separately authenticates the user who is creating or deleting an -entry in the Authentication Database). Instead, the command interpreter -accepts the password as piped input from another program, enabling you to run -the uss bulk command in unattended batch jobs. -
      -

    7. If a newly created or deleted user home directory resides in a replicated -volume, use the vos release command to release the volume, as -described in To replicate a read/write volume (create a read-only volume). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -
      Note:This step can be necessary even if the home directory's parent directory -is not itself a mount point for a replicated volume (and is easier to overlook -in that case). For example, the ABC Corporation template puts the mount -points for user volumes in the /afs/abc.com/usr -directory. Because that is a regular directory rather than a mount -point, it resides in the root.cell volume mounted at the -/afs/abc.com directory. That volume is replicated, so -after changing it by creating or deleting a mount point, the administrator -must issue the vos release command. -
      -

    8. If you are creating accounts, create an entry for the new user in the -local password file (/etc/passwd or equivalent) on each AFS client -machine that he or she can log into. For suggestions on automating this -step, see Creating a Common Source Password File. -

      Even if you do not use the automated method, set the user's UNIX UID -to match the AFS UID assigned automatically by the Protection Server or -assigned with the -uid argument. The new user's AFS UID -appears in the trace produced by the uss add output or you can use -the pts examine command to display it, as described in To display a Protection Database entry. -

    9. If you are deleting accounts, delete the user's entry from the local -password file (/etc/passwd or equivalent) of each client -machine. If you use the AFS package utility, it is -sufficient to remove the entry from the common source version of the -file. If you intend to reactivate the user's account in the -future, it is simpler to comment out the entry or place an asterisk (*) in the -password field. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd018.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd018.htm deleted file mode 100755 index c14edf656..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd018.htm +++ /dev/null @@ -1,1391 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    - -


    Administering User Accounts

    -

    This chapter explains how to create and maintain user -accounts in your cell. -

    The preferred method for creating user accounts is the uss -program, which enables you to create multiple accounts with a single -command. See Creating and Deleting User Accounts with the uss Command Suite. If you prefer to create each account -component individually, follow the instructions in Creating AFS User Accounts. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - - - - - - -
    Create Protection Database entry -pts createuser -
    Create Authentication Database entry -kas create -
    Create volume -vos create -
    Mount volume -fs mkmount -
    Create entry on ACL -fs setacl -
    Examine Protection Database entry -pts examine -
    Change directory ownership -/etc/chown -
    Limit failed authentication attempts -kas setfields with -attempts and --locktime -
    Unlock Authentication Database entry -kas unlock -
    Set password lifetime -kas setfields with -pwexpires -
    Prohibit password reuse -kas setfields with -reuse -
    Change AFS password -kas setpassword -
    List groups owned by user -pts listowned -
    Rename Protection Database entry -pts rename -
    Delete Authentication Database entry -kas delete -
    Rename volume -vos rename -
    Remove mount point -fs rmmount -
    Delete Protection Database entry -pts delete -
    List volume location -vos listvldb -
    Remove volume -vos remove -
    -

    - -


    The Components of an AFS User Account

    -

    The differences between AFS and the UNIX file system imply -that a complete AFS user account is not the same as a UNIX user -account. The following list describes the components of an AFS -account. The same information appears in a corresponding section of Creating and Deleting User Accounts with the uss Command Suite, but is repeated here for your convenience. -

      -

    • A Protection Database entry defines the username (the name -provided when authenticating with AFS), and maps it to an AFS user ID (AFS -UID), a number that the AFS servers use internally when referencing -users. The Protection Database also tracks the groups to which the user -belongs. For details, see Administering the Protection Database. -

    • An Authentication Database entry records the user's AFS -password in a scrambled form suitable for use as an encryption key. -

    • A home volume stores all the files in the user's home -directory together on a single partition of a file server machine. The -volume has an associated quota that limits its size. For a -complete discussion of volumes, see Managing Volumes. -

    • A mount point makes the contents of the user's volume -visible and accessible in the AFS filespace, and acts as the user's home -directory. For more details about mount points, see About Mounting Volumes. -

    • Full access permissions on the home directory's access control -list (ACL) and ownership of the directory (as displayed by the UNIX -ls -ld command) enable the user to manage his or her files. -For details on AFS file protection, see Managing Access Control Lists. -

    • A local password file entry (in the /etc/passwd file -or equivalent) of each AFS client machine enables the user to log in and -access AFS files through the Cache Manager. A subsequent section in -this chapter further discusses local password file entries. -

    • Other optional configuration files make the account more -convenient to use. Such files help the user log in and log out more -easily, receive electronic mail, print, and so on. -
    - - -

    Creating Local Password File Entries

    -

    To obtain authenticated access to a cell's AFS -filespace, a user must not only have a valid AFS token, but also an entry in -the local password file (/etc/passwd or equivalent) of the machine -whose Cache Manager is representing the user. This section discusses -why it is important for the user's AFS UID to match to the UNIX UID -listed in the local password file, and describes the appropriate value to put -in the file's password field. -

    One reason to use uss commands is that they enable you to -generate local password file entries automatically as part of account -creation. See Creating a Common Source Password File. -

    Information similar to the information in this section appears in a -corresponding section of Creating and Deleting User Accounts with the uss Command Suite, but is repeated here for your convenience -

    Assigning AFS and UNIX UIDs that Match

    -

    A user account is easiest to administer and use if the AFS -user ID number (AFS UID) and UNIX UID match. All instructions in the -AFS documentation assume that they do. -

    The most basic reason to make AFS and UNIX UIDs the same is so that the -owner name reported by the UNIX ls -l and ls -ld -commands makes sense for AFS files and directories. Following standard -UNIX practice, the File Server records a number rather than a username in an -AFS file or directory's owner field: the owner's AFS -UID. When you issue the ls -l command, it translates the UID -to a username according to the mapping in the local password file, not the AFS -Protection Database. If the AFS and UNIX UIDs do not match, the ls --l command reports an unexpected (and incorrect) owner. The -output can even vary on different client machines if their local password -files map the same UNIX UID to different names. -

    Follow the recommendations in the indicated sections to make AFS and UNIX -UIDs match when creating accounts for various types of users: -

      -

    • If creating an AFS account for a user who already has a UNIX UID, see Making UNIX and AFS UIDs Match. -

    • If some users in your cell have existing UNIX accounts but the user for -whom you are creating an AFS account does not, then it is best to allow the -Protection Server to allocate an AFS UID automatically. To avoid -overlap of AFS UIDs with existing UNIX UIDs, set the Protection -Database's max user id counter higher than the largest UNIX -UID, using the instructions in Displaying and Setting the AFS UID and GID Counters. -

    • If none of your users have existing UNIX accounts, allow the Protection -Server to allocate AFS UIDs automatically, starting either at its default or -at the value you have set for the max user id counter. -
    - - -

    Specifying Passwords in the Local Password File

    -

    Authenticating with AFS is easiest for your users if you -install and configure an AFS-modified login utility, which logs a user into -the local file system and obtains an AFS token in one step. In this -case, the local password file no longer controls a user's ability to -login in most circumstances, because the AFS-modified login utility does not -consult the local password file if the user provides the correct AFS -password. You can nonetheless use a password file entry's password -field (usually, the second field) in the following ways to control login and -authentication: -

      -

    • To prevent both local login and AFS authentication, place an asterisk ( * -) in the field. This is useful mainly in emergencies, when you want to -prevent a certain user from logging into the machine. -

    • To prevent login to the local file system if the user does not provide the -correct AFS password, place a character string of any length other than the -standard thirteen characters in the field. This is appropriate if you -want to allow only people with local AFS accounts to log into to your -machines. A single X or other character is the most easily -recognizable way to do this. -

    • To enable a user to log into the local file system even after providing an -incorrect AFS password, record a standard UNIX encrypted password in the field -by issuing the standard UNIX password-setting command (passwd or -equivalent). -
    -

    If you do not use an AFS-modified login utility, you must place a standard -UNIX password in the local password file of every client machine the user will -use. The user logs into the local file system only, and then must issue -the klog command to authenticate with AFS. It is simplest if -the passwords in the local password file and the Authentication Database are -the same, but this is not required. - - -


    Converting Existing UNIX Accounts

    -

    This section discusses the three main issues you need to -consider if your cell has existing UNIX accounts that you wish to convert to -AFS accounts. -

    Making UNIX and AFS UIDs Match

    -

    As previously mentioned, AFS users must have an entry in the -local password file on every client machine from which they access the AFS -filespace as an authenticated user. Both administration and use are -much simpler if the UNIX UID and AFS UID match. When converting -existing UNIX accounts, you have two alternatives: -

      -

    • Make the AFS UIDs match the existing UNIX UIDs. In this case, you -need to assign the AFS UID yourself by including the -id argument -to the pts createuser command as you create the AFS account. -

      -

      Because you are retaining the user's UNIX UID, you do not need to -alter the UID in the local password file entry. However, if you are -using an AFS-modified login utility, you possibly need to change the password -field in the entry. For a discussion of how the value in the password -field affects login with an AFS-modified login utility, see Specifying Passwords in the Local Password File. -

      If now or in the future you need to create AFS accounts for users who do -not have an existing UNIX UID, then you must guarantee that new AFS UIDs do -not conflict with any existing UNIX UIDs. The simplest way is to set -the max user id counter in the Protection Database to a value -higher than the largest existing UNIX UID. See Displaying and Setting the AFS UID and GID Counters. -

    • Change the existing UNIX UIDs to match the new AFS UIDs that the -Protection Server assigns automatically. -

      Allow the Protection Server to allocate the AFS UIDs automatically as you -create AFS accounts. You must then alter the user's entry in the -local password file on every client machine to include the new UID. -

      There is one drawback to changing the UNIX UID: any files and -directories that the user owned in the local file system before becoming an -AFS user still have the former UID in their owner field. If you want -the ls -l and ls -ld commands to display the correct -owner, you must use the chown command to change the value to the -user's new UID, whether you are leaving the file in the local file system -or moving it to AFS. See Moving Local Files into AFS. -

    -

    Setting the Password Field Appropriately

    -

    Existing UNIX accounts already have an entry in the local -password file, probably with a (scrambled) password in the password -field. You possibly need to change the value in the field, depending on -the type of login utility you use: -

      -

    • If the login utility is not modified for use with AFS, the actual password -must appear (in scrambled form) in the local password file entry. -

    • If the login utility is modified for use with AFS, choose one of the -values discussed in Specifying Passwords in the Local Password File. -
    -

    Moving Local Files into AFS

    -

    New AFS users with existing UNIX accounts probably already -own files and directories stored in a machine's local file system, and it -usually makes sense to transfer them into the new home volume. The -easiest method is to move them onto the local disk of an AFS client machine, -and then use the UNIX mv command to transfer them into the -user's new AFS home directory. -

    As you move files and directories into AFS, keep in mind that the meaning -of their mode bits changes. AFS ignores the second and third sets of -mode bits (group and other), and does not use the first set (the owner bits) -directly, but only in conjunction with entries on the ACL (for details, see How AFS Interprets the UNIX Mode Bits). Be sure that the ACL protects the file or directory -at least as securely as the mode bits. -

    If you have chosen to change a user's UNIX UID to match a new AFS UID, -you must change the ownership of UNIX files and directories as well. -Only members of the system:administrators group can issue the -chown command on files and directories once they reside in -AFS. -


    Creating AFS User Accounts

    -

    There are two methods for creating user accounts. The -preferred method--using the uss commands--enables you to -create multiple accounts with a single command. It uses a template to -define standard values for the account components that are the same for each -user (such as quota), but provide differing values for more variable -components (such as username). See Creating and Deleting User Accounts with the uss Command Suite. -

    The second method involves issuing a separate command to create each -component of the account. It is best suited to creation of one account -at a time, since some of the commands can create only one instance of the -relevant component. To review the function of each component, see The Components of an AFS User Account. -

    Use the following instructions to create any of the three types of user -account, which differ in their levels of functionality. For a -description of the types, see Configuring AFS User Accounts. -

      -

    • To create an authentication-only account, perform Step 1 through Step 4 and also Step 14. This type of -account consists only of entries in the Authentication Database and Protection -Database. -

    • To create a basic account, perform Step 1 through Step 8 and Step 11 through Step 14. -In addition to Authentication Database and Protection Database entries, this -type of account includes a volume mounted at the home directory with owner and -ACL set appropriately. -

    • To create a full account, perform all steps in the following -instructions. This type of account includes configuration files for -basic functions such as logging in, printing, and mail delivery, making it -more convenient and useful. For a discussion of some useful types of -configuration files, see Creating Standard Files in New AFS Accounts. -
    - - - - - - - - - - -

    To create one user account with individual commands

    -
      -

    1. Decide on the value to assign to each of the following account -components. If you are creating an authentication-only account, you -need to pick only a username, AFS UID, and initial password. -
        -

      • The username. By convention, the names of many components of the -user account incorporate this name. For a discussion of restrictions -and suggested naming schemes, see Choosing Usernames and Naming Other Account Components. -

      • The AFS UID, if you want to assign a specific one. It is generally -best to have the Protection Server allocate one instead, except when you are -creating an AFS account for a user who already has an existing UNIX -account. In that case, migrating the user's files into AFS is -simplest if you set the AFS UID to match the existing UNIX UID. See Converting Existing UNIX Accounts. -

      • The initial password. Advise the user to change this at the first -login, using the password changing instructions in the AFS User -Guide. -

      • The name of the user's home volume. The conventional name is -user.username (for example, -user.smith). -

      • The volume's site (disk partition on a file server machine). -Some cells designate certain machines or partitions for user volumes only, or -it possibly makes sense to place the volume on the emptiest partition that -meets your other criteria. To display the size and available space on a -partition, use the vos partinfo command, which is fully described -in Creating Read/write Volumes. -

      • The name of the user's home directory (the mount point for the home -volume). The conventional location is a directory (or one of a set of -directories) directly under the cell directory, such as -/afs/cellname/usr. For suggestions on -how to avoid the slowed directory lookup that can result from having large -numbers of user home directories in a single usr directory, see Evenly Distributing User Home Directories with the G Instruction. -

      • The volume's space quota. Include the -maxquota -argument to the vos create command, or accept the default quota of -5000 KB. -

      • The ACL on the home directory. By default, the ACL on every new -volume grants all seven permissions to the -system:administrators group. After volume creation, -use the fs setacl command to remove the entry if desired, and to -grant all seven permissions to the user. -
      -

    2. Authenticate as an AFS identity with all of the following -privileges. In the conventional configuration, the admin -user account has them, or you possibly have a personal administrative -account. (To increase cell security, it is best to create special -privileged accounts for use only while performing administrative -procedures; for further discussion, see An Overview of Administrative Privilege.) If necessary, issue the klog -command to authenticate. -
         % klog admin_user
      -   Password: admin_password
      -
      -

      The following list specifies the necessary privileges and indicates how to -check that you have them. -

        -

      • Membership in the system:administrators group. If -necessary, issue the pts membership command, which is fully -described in To display the members of the system:administrators group. -
           % pts membership system:administrators
        -   
        -
        -

      • Inclusion in the /usr/afs/etc/UserList file. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
           % bos listusers <machine name>
        -
        -

      • The ADMIN flag on your Authentication Database entry. -However, the Authentication Server performs its own authentication, so in Step -4 you specify an administrative identity on the kas -command line itself. -

      • The i (insert) and a -(administer) permissions on the ACL of the directory where you are -mounting the user's volume. If necessary, issue the fs -listacl command, which is fully described in Displaying ACLs. -
           % fs listacl [<dir/file path>]
        -
        -

        Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

      • Knowledge of the password for the local superuser root. -
      - - -

    3. Issue the pts createuser command to create an entry -in the Protection Database. For a discussion of setting AFS UIDs, see Assigning AFS and UNIX UIDs that Match. If you are converting an existing UNIX account into -an AFS account, also see Converting Existing UNIX Accounts. -
         % pts createuser <user name> [<user id>]
      -
      -

      where -

      -

      cu -
      Is an acceptable alias for createuser (and createu -is the shortest acceptable abbreviation). -

      user name -
      Specifies the user's username (the character string typed at -login). It is best to limit the name to eight or fewer lowercase -letters, because many application programs impose that limit. The AFS -servers themselves accept names of up to 63 lowercase letters. Also -avoid the following characters: colon (:), semicolon -(;), comma (,), at sign (@), space, -newline, and the period (.), which is conventionally used -only in special administrative names. -

      user id -
      Is optional and appropriate only if the user already has a UNIX UID that -the AFS UID must match. If you do not provide this argument, the -Protection Server assigns one automatically based on the counter described in Displaying and Setting the AFS UID and GID Counters. If the ID you specify is less than 1 -(one) or is already in use, an error results. -
      - - -

    4. Issue the kas create command to create an entry in -the Authentication Database. To avoid having the user's temporary -initial password echo visibly on the screen, omit the --initial_password argument; instead enter the password at the -prompts that appear when you omit the argument, as shown in the following -syntax specification. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas create <name of user> \
      -                -admin  <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password
      -   initial_password: initial_password
      -   Verifying, please re-enter initial_password: initial_password
      -
      -

      where -

      -

      cr -
      Is the shortest acceptable abbreviation for create. -

      name of user -
      Specifies the same username as in Step 3. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -

      initial_password -
      Specifies the initial password as a string of eight characters or less, to -comply with the length restriction that some applications impose. -Possible choices for an initial password include the username, a string of -digits from a personal identification number such as the Social Security -number, or a standard string such as changeme. Instruct the -user to change the string to a truly secret password as soon as possible by -using the kpasswd command as described in the AFS User -Guide. -
      - - -

    5. Issue the vos create command to create the -user's volume. -
         % vos create <machine name> <partition name> <volume name>  \
      -                [-maxquota <initial quota (KB)>]
      -
      -

      where -

      -

      cr -
      Is the shortest acceptable abbreviation of create. -

      machine name -
      Names the file server machine on which to place the new volume. -

      partition name -
      Names the partition on which to place the new volume. -

      volume name -
      Names the new volume. The name can include up to 22 -characters. By convention, user volume names have the form -user.username, where username is the name -assigned in Step 3. -

      -maxquota -
      Sets the volume's quota, as a number of kilobyte blocks. If -you omit this argument, the default is 5000 KB. -
      - - -

    6. Issue the fs mkmount command to mount the volume in -the filespace and create the user's home directory. -
         % fs mkmount <directory> <volume name>
      -
      -

      where -

      -

      mk -
      Is the shortest acceptable abbreviation for mkmount. -

      directory -
      Names the mount point to create. A directory of the same name must -not already exist. Partial pathnames are interpreted relative to the -current working directory. By convention, user home directories are -mounted in a directory called something like -/afs/.cellname/usr, and the home -directory name matches the username assigned in Step 3. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to create the new mount point in a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      volume name -
      Is the name of the volume created in Step 5. -
      -

    7. (Optional) Issue the fs setvol command with the --offlinemsg argument to record auxiliary information about the -volume in its volume header. For example, you can record who owns the -volume or where you have mounted it in the filespace. To display the -information, use the fs examine command. -
         % fs setvol <dir/file path> -offlinemsg <offline message>
      -
      -

      where -

      -

      sv -
      Is an acceptable alias for setvol (and setv the -shortest acceptable abbreviation). -

      dir/file path -
      Names the mount point of the volume with which to associate the -message. Partial pathnames are interpreted relative to the current -working directory. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to change a read-only volume. By convention, -you indicate the read/write path by placing a period before the cell name at -the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      -offlinemsg -
      Specifies up to 128 characters of auxiliary information to record in the -volume header. -
      -

    8. Issue the fs setacl command to set the ACL on the -new home directory. At the least, create an entry that grants all -permissions to the user, as shown. -

      You can also use the command to edit or remove the entry that the vos -create command automatically places on the ACL for a new volume's -root directory, which grants all permissions to the -system:administrators group. Keep in mind that even if -you remove the entry, the members of the group by default have implicit -a (administer) and by default l -(lookup) permissions on every ACL, and can grant themselves other -permissions as required. -

      For detailed instructions for the fs setacl command, see Setting ACL Entries. -

         % fs setacl <directory> -acl <user name> all \
      -               [system:administrators desired_permissions]
      -
      -

    9. (Optional) Create configuration files and -subdirectories in the new home directory. Possibilities include -.login and .logout files, a -shell-initialization file such as .cshrc, files to help with -printing and mail delivery, and so on. -

      If you are converting an existing UNIX account into an AFS account, you -possibly wish to move some files and directories into the user's new AFS -home directory. See Converting Existing UNIX Accounts. -

    10. (Optional) In the new .login or shell -initialization file, define the user's $PATH environment variable to -include the directories where AFS binaries are kept (for example, the -/usr/afsws/bin and /usr/afsws/etc directories). -

    11. In Step 12 and Step 14, you must know the user's AFS -UID. If you had the Protection Server assign it in Step 3, you probably do not know it. If necessary, issue -the pts examine command to display it. -
         % pts examine <user or group name or id>
      -
      -

      where -

      -

      e -
      Is the shortest acceptable abbreviation of examine. -

      user or group name or id -
      Is the username that you assigned in Step 3. -
      -

      The first line of the output displays the username and AFS UID. For -further discussion and an example of the output, see Displaying Information from the Protection Database. -

    12. Designate the user as the owner of the home directory and any -files and subdirectories created or moved in Step 9. Specify the owner by the AFS UID you learned in Step -11 rather than by username. This is necessary for new -accounts because the user does not yet have an entry in your local -machine's password file (/etc/passwd or equivalent). If -you are converting an existing UNIX account, an entry possibly already exists, -but the UID is possibly incorrect. In that case, specifying a username -means that the corresponding (possibly incorrect) UID is recorded as the -owner. -

      Some operating systems allow only the local superuser root to -issue the chown command. If necessary, issuing the -su command before the chown command. -

         % chown new_owner_ID  directory
      -
      -

      where -

      -

      new_owner_ID -
      Is the user's AFS UID, which you learned in Step 11. -

      directory -
      Names the home directory you created in Step 6, plus each subdirectory or file you created in Step 9. -
      -

    13. If the new user home directory resides in a replicated volume, use the -vos release command to release the volume, as described in To replicate a read/write volume (create a read-only volume). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -
      Note:This step can be necessary even if the home directory's parent directory -is not itself a mount point for a replicated volume (and is easier to overlook -in that case). Suppose, for example, that the ABC Corporation puts the -mount points for user volumes in the /afs/abc.com/usr -directory. Because that is a regular directory rather than a mount -point, it resides in the root.cell volume mounted at the -/afs/abc.com directory. That volume is replicated, so -after changing it by creating a new mount point the administrator must issue -the vos release command. -
      -

    14. Create or modify an entry for the new user in the local -password file (/etc/passwd or equivalent) of each machine the user -can log onto. Remember to make the UNIX UID the same as the AFS UID you -learned in Step 11, and to fill the password field appropriately (for -instructions, see Specifying Passwords in the Local Password File). -

      If you use the package utility to distribute a common version of -the password file to all client machines, then you need to make the change -only in the common version. See Configuring Client Machines with the package Program. -

    - - - - -

    Improving Password and Authentication Security

    -

    AFS provides several optional features than can help to -protect your cell's filespace against unauthorized access. The -following list summarizes them, and instructions follow. -

      -

    • Limit the number of consecutive failed login attempts. -

      One of the most common ways for an unauthorized user to access your -filespace is to guess an authorized user's password. This method -of attack is most dangerous if the attacker can use many login processes in -parallel or use the RPC interfaces directly. -

      To protect against this type of attack, use the -attempts -argument to the kas setfields command to limit the number of times -that a user can consecutively fail to enter the correct password when using -either an AFS-modified login utility or the klog command. -When the limit is exceeded, the Authentication Server locks the user's -Authentication Database entry (disallows authentication attempts) for a period -of time that you define with the -locktime argument to the kas -setfields command. If desired, system administrators can use the -kas unlock command to unlock the entry before the complete lockout -time passes. -

      In certain circumstances, the mechanism used to enforce the number of -failed authentication attempts can cause a lockout even though the number of -failed attempts is less than the limit set by the -attempts -argument. Client-side authentication programs such as klog -and an AFS-modified login utility normally choose an Authentication Server at -random for each authentication attempt, and in case of a failure are likely to -choose a different Authentication Server for the next attempt. The -Authentication Servers running on the various database server machines do not -communicate with each other about how many times a user has failed to provide -the correct password to them. Instead, each Authentication Server -maintains its own separate copy of the auxiliary database file -kaserverauxdb (located in the /usr/afs/local directory -by default), which records the number of consecutive authentication failures -for each user account and the time of the most recent failure. This -implementation means that on average each Authentication Server knows about -only a fraction of the total number of failed attempts. The only way to -avoid allowing more than the number of attempts set by the --attempts argument is to have each Authentication Server allow only -some fraction of the total. More specifically, if the limit on failed -attempts is f, and the number of Authentication Servers is -S, then each Authentication Server can only permit a number of -attempts equal to f divided by S (the Ubik -synchronization site for the Authentication Server tracks any remainder, -fmodS). -

      Normally, this implementation does not reduce the number of allowed -attempts to less than the configured limit (f). If one -Authentication Server refuses an attempt, the client contacts another instance -of the server, continuing until either it successfully authenticates or has -contacted all of the servers. However, if one or more of the -Authentication Server processes is unavailable, the limit is effectively -reduced by a percentage equal to the quantity U divided by -S, where U is the number of unavailable servers and -S is the number normally available. -

      To avoid the undesirable consequences of setting a limit on failed -authentication attempts, note the following recommendations: -

        -

      • Do not set the -attempts argument (the limit on failed -authentication attempts) too low. A limit of nine failed attempts is -recommended for regular user accounts, to allow three failed attempts per -Authentication Server in a cell with three database server machines. -

      • Set fairly short lockout times when including the -locktime -argument. Although guessing passwords is a common method of attack, it -is not a very sophisticated one. Setting a lockout time can help -discourage attackers, but excessively long times are likely to be more of a -burden to authorized users than to potential attackers. A lockout time -of 25 minutes is recommended for regular user accounts. -

      • Do not assign an infinite lockout time on an account (by setting the --locktime argument to 0 [zero]) unless there is a highly -compelling reason. Such accounts almost inevitably become locked at -some point, because each Authentication Server never resets the account's -failure counter in its copy of the kaauxdb file (in contrast, when -the lockout time is not infinite, the counter resets after the specified -amount of time has passed since the last failed attempt to that Authentication -Server). Furthermore, the only way to unlock an account with an -infinite lockout time is for an administrator to issue the kas -unlock command. It is especially dangerous to set an infinite -lockout time on an administrative account; if all administrative accounts -become locked, the only way to unlock them is to shut down all instances of -the Authentication Server and remove the kaauxdb file on -each. -
      -

      In summary, the recommended limit on authentication attempts is nine and -lockout time 25 minutes. -

    • Limit password lifetime. -

      The longer a password is in use, the more time an attacker has to try to -learn it. To protect against this type of attack, use the --pwexpires argument to the kas setfields command to -limit how many days a user's password is valid. The user becomes -unable to authenticate with AFS after the password expires, but has up to 30 -days to use the kpasswd command to set a new password. After -the 30 days pass, only an administrator who has the ADMIN flag on -the Authentication Database entry can change the password. -

      If you set a password lifetime, many AFS-modified login utilities (but not -the klog command) set the PASSWORD_EXPIRES environment variable to -the number of days remaining until the password expires. A setting of -zero means that the password expires today. If desired, you can -customize your users' login scripts to display the number of days -remaining before expiration and even prompt for a password change when a small -number of days remain before expiration. -

    • Prohibit reuse of passwords. -

      Forcing users to select new passwords periodically is not effective if they -simply set the new password to the current value. To prevent a user -from setting a new password to a string similar to any of the last 20 -passwords, use the -reuse argument to the kas setfields -command. -

      If you prohibit password reuse and the user specifies an excessively -similar password, the Authentication Server generates the following message to -reject it: -

         Password was not changed because it seems like a reused password
      -
      -

      A persistent user can try to bypass this restriction by changing the -password 20 times in quick succession (or running a script to do so). -If you believe this is likely to be a problem, you can include the --minhours argument to the kaserver initialization -command (for details, see the command's reference page in the AFS -Administration Reference. If the user attempts to change -passwords too frequently, the following message appears. -

         Password was not changed because you changed it too recently; see 
      -   your systems administrator
      -
      -

    • Check the quality of new passwords. -

      You can impose a minimum quality standard on passwords by writing a script -or program called kpwvalid. If the kpwvalid file -exists, the kpasswd and kas setpassword command -interpreters invoke it to check a new password. If the password does -not comply with the quality standard, the kpwvalid program returns -an appropriate code and the command interpreter rejects the password. -

      The kpwvalid file must be executable, must reside in the same -AFS directory as the kpasswd and kas binaries, and its -directory's ACL must grant the w (write) permission -only to the system:administrators group. -

      If you choose to write a kpwvalid program, consider imposing -standards such as the following. -

        -

      • A minimum length -

      • Words found in the dictionary are prohibited -

      • Numbers, punctuation, or both must appear along with letters -
      -

      The AFS distribution includes an example kpwvalid -program. See the kpwvalid reference page in the AFS -Administration Reference. -

    - - -

    To limit the number of consecutive failed authentication attempts

    -
      -

    1. Issue the kas setfields command with the -attempts -and -locktime arguments. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas setfields <name of user>  \
      -                   -admin <admin principal to use for authentication>  \
      -                   -attempts <maximum successive failed login tries ([0..254])>  \
      -                   -locktime <failure penalty [hh:mm or minutes]>
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      name of user -
      Names the Authentication Database entry to edit. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as the admin account. -The password prompt echoes it as admin_user. Enter the -appropriate password as admin_password. -

      -attempts -
      Specifies the maximum consecutive number of times that a user can fail to -provide the correct password during authentication (via the klog -command or an AFS-modified login utility) before the Authentication Server -refuses further attempts for the amount of time specified by the --locktime argument. The range of valid values is -0 (zero) through 254. If you omit this argument -or specify 0, the Authentication Server allows an unlimited number -of failures. -

      -locktime -
      Specifies how long the Authentication Server refuses authentication -attempts after the user exceeds the failure limit specified by the --attempts argument. -

      Specify a time in either hours and minutes (hh:mm) -or minutes only (mm), from the range 01 (one minute) -through 36:00 (36 hours). The kas command -interpreter automatically reduces any larger value to 36:00 and also -rounds up each nonzero value to the next-higher multiple of 8.5 -minutes. -

      It is best not to provide a value of 0 (zero), especially on -administrative accounts, because it sets an infinite lockout time. An -administrator must always issue the kas unlock command to unlock -such an account. -

      -
    -

    To unlock a locked user account

    -
      -

    1. Issue the kas command to enter interactive mode. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas -admin <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password
      -   ka>
      -
      -

      where -admin names an administrative account that has the -ADMIN flag on its Authentication Database entry, such as -admin. The password prompt echoes it as -admin_user. Enter the appropriate password as -admin_password. -

    2. Issue the (kas) examine command to verify that the user's -account is in fact locked, as indicated by the message shown: -
         ka> examine <name of user>
      -   User is locked until time
      -
      - - -

    3. Issue the (kas) unlock command to unlock the account. -
         ka> unlock <authentication ID> 
      -
      -

      where -

      -

      u -
      Is the shortest acceptable abbreviation of unlock. -

      authentication ID -
      Names the Authentication Database entry to unlock. -
      -
    - - - -

    To set password lifetime

    -
      -

    1. Issue the kas setfields command with the -pwexpires -argument. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas setfields <name of user>  \
      -                   -pwexpires <number days password is valid  [0..254])>  \
      -                   -admin <admin principal to use for authentication> 
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      name of user -
      Specifies the Authentication Database entry on which to impose a password -expiration. -

      -pwexpires -
      Sets the number of days after the user's password was last changed -that it remains valid. Provide an integer from the range 1 -through 254 to specify the number of days until expiration. -

      When the password becomes invalid (expires), the user is unable to -authenticate, but has 30 more days in which to issue the kpasswd or -kas setpassword command to change the password (after that, only an -administrator can change it). Note that the clock starts at the time -the password was last changed, not when the kas setfields command -is issued. To avoid retroactive expiration, have the user change the -password just before issuing the command. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -
      -
    - - -

    To prohibit reuse of passwords

    -
      -

    1. Issue the kas setfields command with the -reuse -argument. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas setfields <name of user> -reuse < permit password reuse (yes/no)>  \
      -                   -admin <admin principal to use for authentication> 
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      name of user -
      Names the Authentication Database entry for which to set the password -reuse policy. -

      -reuse -
      Specifies whether the Authentication Server allows reuse of passwords -similar to any of the user's last 20 passwords. Specify the value -no to prohibit reuse, or the value yes to reinstate the -default of allowing password reuse. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -
      -
    - - - -

    Changing AFS Passwords

    -

    After setting an initial password during account creation, -you normally do not need to change user passwords, since they can use the -kpasswd command themselves by following the instructions in the -AFS User Guide. In the rare event that a user forgets the -password or otherwise cannot log in, you can use the kas -setpassword command to set a new password. -

    If entries in the local password file (/etc/passwd or -equivalent) have actual scrambled passwords in their password field, remember -to change the password there also. For further discussion, see Specifying Passwords in the Local Password File. - - -

    To change an AFS password

    -
      -

    1. Issue the kas setpassword command to change the -password. To avoid having the new password echo visibly on the screen, -omit the -new_password argument; instead enter the password at -the prompts that appear when you omit the argument, as shown. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas setpassword <name of user>  \
      -                     -admin <admin principal to use for authentication> 
      -   Administrator's (admin_user) password: admin_password
      -   new_password: new_password
      -   Verifying, please re-enter new_password: new_password
      -
      -

      where -

      -

      sp -
      Is an acceptable alias for setpassword (setp is the -shortest acceptable abbreviation). -

      name of user -
      Names the Authentication Database entry for which to set the -password. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -

      new_password -
      Specifies the user's new password. It is subject to the -restrictions imposed by the kpwvalid program, if you use it. -
      -
    -

    Displaying and Setting the Quota on User Volumes

    -

    User volumes are like all other volumes with respect to -quota. Each new AFS volume has a default quota of 5000 KB, unless you -use the -maxquota argument to the vos create command to -set a different quota. You can also use either of the following -commands to change quota at any time: -

      -

    • fs setquota -

    • fs setvol -
    -

    You can use any of the three following commands to display a volume's -quota: -

      -

    • fs quota -

    • fs listquota -

    • fs examine -
    -

    For instructions, see Setting and Displaying Volume Quota and Current Size. - - - - - -


    Changing Usernames

    -

    By convention, many components of a user account incorporate -the username, including the Protection and Authentication Database entries, -the volume name and the home directory name. When changing a username, -it is best to maintain consistency by changing the names of all components, so -the procedure for changing a username has almost as many steps as the -procedure for creating a new user account. -

    To change a username

    -
      - - -

    1. Authenticate as an AFS identity with all of the following -privileges. In the conventional configuration, the admin -user account has them, or you possibly have a personal administrative -account. (To increase cell security, it is best to create special -privileged accounts for use only while performing administrative -procedures; for further discussion, see An Overview of Administrative Privilege.) If necessary, issue the klog -command to authenticate. -
         % klog admin_user
      -   Password: admin_password
      -
      -

      The following list specifies the necessary privileges and indicates how to -check that you have them. -

        -

      • Membership in the system:administrators group. If -necessary, issue the pts membership command, which is fully -described in To display the members of the system:administrators group. -
           % pts membership system:administrators
        -   
        -
        -

      • Inclusion in the /usr/afs/etc/UserList file. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
           % bos listusers <machine name>
        -
        -

      • The ADMIN flag on the Authentication Database entry. -However, the Authentication Server performs its own authentication, so the -following instructions direct you to specify an administrative identity on the -kas command line itself. -

      • The a (administer), d -(delete), and i (insert) permissions on the -ACL of the directory where you are removing the current mount point and -creating a new one. If necessary, issue the fs listacl -command, which is fully described in Displaying ACLs. -
           % fs listacl [<dir/file path>]
        -
        -

        Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

      -

    2. Issue the pts listowned command to display the names -of the groups the user owns. After you change the username in the -Protection Database in Step 3, you must issue the pts rename command to change -each group's owner prefix to match the new name, because the Protection -Server does not automatically make this change. For a complete -description of the pts listowned command, see Displaying Information from the Protection Database. -
         % pts listowned <user or group name or id>
      -
      -

    3. Issue the pts rename command to change the -user's name in the Protection Database. -
         % pts rename <old name> <new name>
      -
      -

    4. Issue the pts rename command to change the group names you -noted in Step 2, so that their owner prefix (the part of the group name -before the colon) accurately reflects the owner's new name. -

      Repeat the command for each group. Step 3 details its syntax. -

         % pts rename <old name> <new name>
      -
      -

    5. Issue the kas command to enter interactive mode. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas -admin <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password
      -   ka>
      -
      -

      where -admin names an administrative account that has the -ADMIN flag on its Authentication Database entry, such as -admin. The password prompt echoes it as -admin_user. Enter the appropriate password as -admin_password. - - -

    6. Issue the (kas) delete command to delete the user's -existing Authentication Database entry. -

      -

         ka> delete <name of user>
      -
      -

      where -

      -

      del -
      Is the shortest acceptable abbreviation for delete, or you can -use the alias rm. -

      name of user -
      Names the Authentication Database entry to delete. -
      - - -

    7. Issue the (kas) create command to create an Authentication -Database entry for the new username. To avoid having the user's -password echo visibly on the screen, do not include the --initial_password argument; instead enter the password at the -prompts that appear in that case, as shown in the following syntax -specification. -
         ka> create  <name of user>
      -   initial_password: password
      -   Verifying, please re-enter initial_password: password
      -
      -

      where -

      -

      cr -
      Is the shortest acceptable abbreviation for create. -

      name of user -
      Specifies the new username. -

      password -
      Specifies the password for the new user account. If the user is -willing to tell you his or her current password, you can retain it. -Otherwise, provide a string of eight characters or less to comply with the -length restriction that some applications impose. Possible choices for -an initial password include the username, a string of digits from a personal -identification number such as the Social Security number, or a standard string -such as changeme. Instruct the user to change the string to -a truly secret password as soon as possible by using the kpasswd -command as instructed in the AFS User Guide. -
      -

    8. Issue the quit command to leave interactive mode. -
         ka> quit
      -
      - - - - - -

    9. Issue the vos rename command to change the name of -the user's volume. For complete syntax, see To rename a volume. -
         % vos rename  <old volume name>  <new volume name>
      -
      - - - - - -

    10. Issue the fs rmmount command to remove the existing -mount point. For the directory argument, specify the -read/write path to the mount point, to avoid the failure that results when you -attempt to delete a mount point from a read-only volume. -
         % fs rmmount <directory>
      -
      - - - -

    11. Issue the fs mkmount command to create a mount point -for the volume's new name. Specify the read/write path to the -mount point for the directory argument, as in the previous -step. For complete syntax, see Step 6 in To create one user account with individual commands. -
         % fs mkmount <directory> <volume name>
      -
      -

    12. If the changes you made in Step 10 and Step 11 are to a mount point that resides in a -replicated volume, use the vos release command to release the -volume, as described in To replicate a read/write volume (create a read-only volume). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -
      Note:This step can be necessary even if the home directory's parent directory -is not itself a mount point for a replicated volume (and is easier to overlook -in that case). For example, the ABC Corporation template puts the mount -points for user volumes in the /afs/abc.com/usr -directory. Because that is a regular directory rather than a mount -point, it resides in the root.cell volume mounted at the -/afs/abc.com directory. That volume is replicated, so -after changing it the administrator must issue the vos release -command. -
      -
    -

    Removing a User Account

    - - -

    Before removing an account, it is best to make a backup copy of the -user's home volume on a permanent storage medium such as tape. If -you need to remove several accounts, it is probably more efficient to use the -uss delete command instead; see Deleting Individual Accounts with the uss delete Command. -

    To remove a user account

    -
      -

    1. Authenticate as an AFS identity with all of the following -privileges. In the conventional configuration, the admin -user account has them, or you possibly have a personal administrative -account. (To increase cell security, it is best to create special -privileged accounts for use only while performing administrative -procedures; for further discussion, see An Overview of Administrative Privilege.) If necessary, issue the klog -command to authenticate. -
         % klog admin_user
      -   Password: admin_password
      -
      -

      The following list specifies the necessary privileges and indicates how to -check that you have them. -

        -

      • Membership in the system:administrators group. If -necessary, issue the pts membership command, which is fully -described in To display the members of the system:administrators group. -
           % pts membership system:administrators
        -   
        -
        -

      • Inclusion in the /usr/afs/etc/UserList file. If -necessary, issue the bos listusers command, which is fully -described in To display the users in the UserList file. -
           % bos listusers <machine name>
        -
        -

      • The ADMIN flag on the Authentication Database entry. -However, the Authentication Server performs its own authentication, so the -following instructions direct you to specify an administrative identity on the -kas command line itself. -

      • The d (delete) permission on the ACL of the -directory where you are removing the user volume's mount point. If -necessary, issue the fs listacl command, which is fully described -in Displaying ACLs. -
           % fs listacl [<dir/file path>]
        -
        -

        Members of the system:administrators group always -implicitly have the a (administer) and by default also -the l (lookup) permission on every ACL and can use the -fs setacl command to grant other rights as necessary. -

      -

    2. (Optional) If it is possible you need to restore the -user's account someday, note the username and AFS UID, possibly in a file -designated for that purpose. You can later restore the account with its -original AFS UID. -

    3. (Optional) Copy the contents of the user's volume to -tape. You can use the vos dump command as described in Dumping and Restoring Volumes or the AFS Backup System as described in Backing Up Data. -

    4. (Optional) If you intend to remove groups that the -user owns from the Protection Database after removing the user's entry, -issue the pts listowned command to display them. For -complete instructions, see Displaying Information from the Protection Database. -
         % pts listowned <user or group name or id>
      -
      -

    5. (Optional) Issue the pts delete command -to remove the groups the user owns. However, if it is likely that other -users have placed the groups on the ACLs of directories they own, it is best -not to remove them. -
         % pts delete <user or group name or id>+
      -
      -

      where -

      -

      del -
      Is the shortest acceptable abbreviation for delete. -

      user or group name or id -
      Specifies the name or AFS UID of each group displayed in the output from -Step 4. -
      - - - -

    6. Issue the kas delete command to remove the user's -Authentication Database entry. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

         % kas delete <name of user>  \
      -                -admin  <admin principal to use for authentication>  
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      d -
      Is the shortest acceptable abbreviation for delete. -

      name of user -
      Names the Authentication Database entry to delete. -

      -admin -
      Names an administrative account that has the ADMIN flag on its -Authentication Database entry, such as admin. The password -prompt echoes it as admin_user. Enter the appropriate password -as admin_password. -
      -

    7. Issue the vos listvldb command to display the site -of the user's home volume in preparation for removing it. By -convention, user volumes are named -user.username. -
         % vos listvldb <volume name or ID>
      -
      -

      where -

      -

      listvl -
      Is the shortest acceptable abbreviation of listvldb. -

      volume name or ID -
      Specifies the volume's name or volume ID number. -
      - - - - -

    8. Issue the vos remove command to remove the -user's volume. It automatically removes the backup version of the -volume, if it exists. It is not conventional to replicate user volumes, -so the command usually also completely removes the volume's entry from -the Volume Location Database (VLDB). If there are ReadOnly replicas of -the volume, you must repeat the vos remove command to remove each -one individually. -
         % vos remove <machine name> <partition name> <volume name or ID>
      -
      -

      where -

      -

      remo -
      Is the shortest acceptable abbreviation of remove. -

      machine name -
      Names the file server machine that houses the volume, as specified in the -output from Step 7. -

      partition name -
      Names the partition that houses the volume, as specified in the output -from Step 7. -

      volume name or ID -
      Specifies the volume's name or ID number. -
      - - - - -

    9. Issue the fs rmmount command to remove the -volume's mount point. -

      If you mounted the user's backup volume as a subdirectory of the home -directory, then this command is sufficient to unmount the backup version as -well. If you mounted the backup version at an unrelated location in the -filespace, repeat the fs rmmount command for it. -

         % fs rmmount <directory>
      -
      -

      where -

      -

      rmm -
      Is the shortest acceptable abbreviation of rmmount. -

      directory -
      Names the mount point for the volume's previous name (the former home -directory). Partial pathnames are interpreted relative to the current -working directory. -

      Specify the read/write path to the mount point, to avoid the failure that -results when you attempt to delete a mount point from a read-only -volume. By convention, you indicate the read/write path by placing a -period before the cell name at the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see Mounting Volumes. -

      - - - - -

    10. Issue the pts delete command to remove the -user's Protection Database entry. A complete description of this -command appears in Step 5. -
         % pts delete <user or group name or id>
      -
      -

    11. If the deleted user home directory resided in a replicated volume, use the -vos release command to release the volume, as described in To replicate a read/write volume (create a read-only volume). -
         
      -   % vos release <volume name or ID>
      -   
      -
      -
      Note:This step can be necessary even if the home directory's parent directory -is not itself a mount point for a replicated volume (and is easier to overlook -in that case). For example, the ABC Corporation template puts the mount -points for user volumes in the /afs/abc.com/usr -directory. Because that is a regular directory rather than a mount -point, it resides in the root.cell volume mounted at the -/afs/abc.com directory. That volume is replicated, so -after changing it by deleting a mount point the administrator must issue the -vos release command. -
      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd019.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd019.htm deleted file mode 100755 index 0f6072453..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd019.htm +++ /dev/null @@ -1,1437 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Administering the Protection Database

    -

    This chapter explains how to create and maintain user, -machine, and group entries in the Protection Database. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - - - - - - - - - - - - - - -
    Display Protection Database entry -pts examine -
    Map user, machine or group name to AFS ID -pts examine -
    Display entry's owner or creator -pts examine -
    Display number of users or machines belonging to group -pts examine -
    Display number of groups user or machine belongs to -pts examine -
    Display group-creation quota -pts examine -
    Display entry's privacy flags -pts examine -
    Display members of group, or groups that user or machine belongs to -pts membership -
    Display groups that user or group owns -pts listowned -
    Display all entries in Protection Database -pts listentries -
    Create machine entry -pts createuser -
    Create group entry -pts creategroup -
    Add users and machines to groups -pts adduser -
    Remove users and machines from groups -pts removeuser -
    Delete machine or group entry -pts delete -
    Change a group's owner -pts chown -
    Change an entry's name -pts rename -
    Set group creation quota -pts setfields -
    Set entry's privacy flags -pts setfields -
    Display AFS ID counters -pts listmax -
    Set AFS ID counters -pts setmax -
    -

    - - - - - - - - - - -


    About the Protection Database

    -

    The Protection Database stores information about AFS users, -client machines, and groups which the File Server process uses to determine -whether clients are authorized to access AFS data. -

    To obtain authenticated access to an AFS cell, a user must have an entry in -the cell's Protection Database. The first time that a user -requests access to the data stored on a file server machine, the File Server -on that machine contacts the Protection Server to request the user's -current protection subgroup (CPS), which lists all the -groups to which the user belongs. The File Server scans the access -control list (ACL) of the directory that houses the data, looking for groups -on the CPS. It grants access in accordance with the permissions that -the ACL extends to those groups or to the user individually. (The File -Server stores the CPS and uses it as long as the user has the same -tokens. When a user's group membership changes, he or she must -reauthenticate for the File Server to recognize the change.) -

    Only administrators who belong to the cell's -system:administrators group can create user entries (the -group is itself defined in the Protection Database, as discussed in The System Groups). Members of the -system:administrators group can also create machine entries, -which can then be used to control access based on the machine from which the -access request originates. After creating a machine entry, add it to a -Protection Database group and place the group on ACLs (a machine cannot appear -on ACLs directly). A machine entry can represent a single machine or -multiple machines with consecutive IP addresses as specified by a wildcard -notation. For instructions, see Creating User and Machine Entries. Because all replicas of a volume share the same ACL -(the one on the volume's root directory mount point), machine entries -enable you to replicate the volume that houses a program's binary file -while still complying with a machine-based license agreement as required by -the program's manufacturer. See Creating User and Machine Entries. -

    A group entry is a list of user entries, machine entries, or both (groups -cannot belong to other groups). Putting a group on an ACL is a -convenient way to extend or deny access to a set of users without listing them -on the ACL individually. Similarly, adding users to a group -automatically grants them access to all files and directories for which the -associated ACL lists that group. Both administrators and regular users -can create groups. - - - - - - -

    The System Groups

    -

    In addition to the groups that users and administrators can -create, AFS defines the following three system groups. The Protection -Server creates them automatically when it builds the first version of a -cell's Protection Database, and always assigns them the same AFS -GIDs. -

    -

    system:anyuser -
    Represents all users able to access the cell's filespace from the -local and foreign cells, authenticated or not. Its AFS GID is --101. The group has no stable membership listed in the -Protection Database. Accordingly, the pts examine command -displays 0 in its membership field, and the pts -membership command does not list any members for it. -

    Placing this group on an ACL is a convenient way to extend access to all -users. The File Server automatically places this group on the CPS of -any user who requests access to data stored on a file server machine. -(Every unauthenticated user is assigned the identity anonymous and -this group is the only entry on the CPS for anonymous.) -

    system:authuser -
    Represents all users who are able to access the cell's filespace from -the local and foreign cells and who have successfully obtained an AFS token in -the local cell (are authenticated). Its AFS GID is --102. Like the system:anyuser group, it has -no stable membership listed in the Protection Database. Accordingly, -the pts examine command displays 0 in its -membership field, and the pts membership command does -not list any members for it. -

    Placing this group on an ACL is therefore a convenient way to extend access -to all authenticated users. The File Server automatically places this -group on the CPS of any authenticated user who requests access to data stored -on a file server machine. -

    system:administrators -
    Represents the small number of cell administrators authorized to issue -privileged pts commands and the fs commands that set -quota. The ACL on the root directory of every newly created volume -grants all permissions to the group. Even if you remove that entry, the -group implicitly retains the a (administer), and by -default also the l (lookup), permission on every -ACL. Its AFS GID is -204. For instructions on -administering this group, see Administering the system:administrators Group. -
    -

    Displaying Information from the Protection Database

    -

    This section describes the commands you can use to display -Protection Database entries and associated information. In addition to -name and AFS ID, the Protection Database stores the following information -about each user, machine, or group entry. -

      -

    • The entry's owner, which is the user or group of users who can -administer the entry -

    • The entry's creator, which serves mostly as an audit trail -

    • A membership count, which indicates how many groups a user or machine -belongs to, or how many members belong to a group -

    • A set of privacy flags, which control which users can administer or -display information about the entry -

    • A group-creation quota, which defines how many groups a user can create -

    • A list of the groups to which a user or machine belongs, or of the users -and machines that belong to a group -

    • A list of the groups that a user or group owns -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    To display a Protection Database entry

    -
      -

    1. Verify that you belong to the system:administrators -group, which enables you to display an entry regardless of the setting of its -first (s) privacy flag. By default, any user can display a -Protection Database entry. If necessary, issue the pts -membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts examine command to display one or more Protection -Database entries. -
         % pts examine <user or group name or id>+
      -
      -

      where -

      -

      e -
      Is the shortest acceptable abbreviation of examine (and -check is an alias). -

      user or group name or id -
      Specifies the name or AFS ID of each entry to display. Precede any -AFS GID with a hyphen (-) because it is a negative integer. -
      -
    -

    The output includes the following fields. Examples follow. -

    -

    Name -
    Specifies the entry's name. -
      -

    • For a user, this is the name used when authenticating with AFS and the -name that appears on ACL entries. -

    • For a machine, this is the IP address of a single machine, or a wildcard -notation that represents a group of machines with consecutive IP addresses, as -described in Creating User and Machine Entries. -

    • For a group, this is the name that appears on ACL entries and in the list -of groups output by the pts membership command. The names of -regular groups have two parts, separated by a colon -(:). The part before the colon indicates the -group's owner, and the part after is the unique name. A -prefix-less group's name does not have the owner prefix; -only members of the system:administrators group can create -prefix-less groups. For further discussion of group names, see Creating Groups. -
    - - - -

    id -
    Specifies the entry's unique AFS identification number. For -user and machine entries, the AFS user ID (AFS UID) is a positive -integer; for groups, the AFS group ID (AFS GID) is a negative -integer. AFS UIDs and GIDs have the same function as their counterparts -in the UNIX file system, but are used by the AFS servers and the Cache Manager -only. -

    Normally, the Protection Server assigns an AFS UID or GID automatically -when you create Protection Database entries. Members of the -system:administrators group can specify an ID if -desired. For further discussion, see Creating User and Machine Entries and Creating Groups. -

    owner -
    Names the user or group who owns the entry and therefore can administer it -(for more information about a group owning another group, see Using Groups Effectively). Other users possibly have administrative -privileges, too, depending on the setting of the entry's privacy -flags. For instructions on changing the owner, see Changing a Group's Owner. -

    creator -
    Names the user who created the entry, and serves as an audit trail. -If the entry is deleted from the Protection Database, the creator's group -creation quota increases by one, even if the creator no longer owns the -entry; see Setting Group-Creation Quota. -

    The value anonymous in this field generally indicates that the -entry was created when the Protection Server was running in no-authentication -mode, probably during initial configuration of the cell's first file -server machine. For a description of no-authentication mode, see Managing Authentication and Authorization Requirements. -

    membership -
    Specifies the number of groups to which the user or machine belongs, or -the number of users or machines that belong to the group. -

    flags -
    Specifies who can display or change information in a Protection Database -entry. The five flags, each representing a different capability, always -appear in the same order. -
      -

    • For user entries, the default value is S----, which indicates -that anyone can issue the pts examine command on the entry, but -only the user and members of the system:administrators group -can perform any other action. -

    • For machine entries, the default value is S----, which -indicates that anyone can issue the pts examine command on the -entry, but only members of the system:administrators group -can perform any other action. -

    • For group entries, the default value is S-M--, which indicates -that anyone can issue the pts examine and pts membership -commands on the entry, but only the group's owner and members of the -system:administrators group can perform any other -action. -
    -

    For a complete description of possible values for the flags, see Setting the Privacy Flags on Database Entries. -

    group quota -
    Specifies how many more groups a user can create in the Protection -Database. The value for a newly created user entry is 20, but members -of the system:administrators group can issue the pts -setfields command at any time to change the value; see Setting Group-Creation Quota. -

    Group creation quota has no meaning for a machine or group entry: the -Protection Server recognizes the issuer of the pts creategroup -command only as an authenticated user or as the anonymous user, -never as a machine or group. The default value for group entries is 0 -(zero), and there is no reason to change it. -

    -

    The following examples show the output for a user called pat, a -machine with IP address 192.12.108.133 and a -group called terry:friends: -

       % pts examine pat
    -   Name: pat, id: 1020, owner: system:administrators, creator: admin,
    -     membership: 12, flags: S----, group quota: 15.
    -   % pts ex 192.12.108.133
    -   Name: 192.12.108.133, id: 5151, owner: system:administrators, creator: admin,
    -     membership: 1, flags: S----, group quota: 20.
    -   % pts examine terry:friends
    -   Name: terry:friends, id: -567, owner: terry, creator: terry,
    -     membership: 12, flags: SOm--, group quota: 0.
    -
    - - - - - - - - - -

    To display group membership

    -
      -

    1. Verify that you belong to the system:administrators -group, which enables you to display an entry's group membership -information regardless of the setting of its third (m) privacy -flag. By default the owner and the user can display group membership -for a user entry, the owner for a machine entry, and anyone for a group -entry. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts membership command to display the list -of groups to which a user or machine belongs, or the list of users and -machines that belong to a group. -
         % pts membership <user or group name or id>+
      -
      -

      where -

      -

      m -
      Is the shortest acceptable abbreviation of membership. -

      user or group name or id -
      Specifies the name or AFS UID of each user or machine for which to list -the groups it belongs to, or the name or AFS GID of each group for which to -list the members. -
      -
    -

    For user and machine entries, the output begins with the following string, -and then each group appears on its own line: -

       Groups user_or_machine (id: AFS_UID) is a member of:
    -
    -

    For group entries, the output begins with the following string, and then -each member appears on its own line: -

       Members of group (id: AFS_GID) are:
    -
    -

    For the system groups system:anyuser and -system:authuser, the output includes the initial header -string only, because these groups do not have a stable membership listed in -their Protection Database entry. See The System Groups. -

    The following examples show the output for a user called terry -and a group called terry:friends: -

       % pts mem terry
    -   Groups terry (id: 5347) is a member of:
    -     pat:friends
    -     sales
    -     acctg:general
    -   % pts mem terry:friends
    -   Members of terry:friends (id: -567) are:
    -     pat
    -     smith
    -     johnson
    -
    - - - - - - - - -

    To list the groups that a user or group owns

    -
      -

    1. Verify that you belong to the system:administrators -group, which enables you to display an entry's group ownership -information regardless of the setting of its second (o) privacy -flag. By default the owner can list the groups owned by group, and a -user the groups he or she owns. If necessary, issue the pts -membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts listowned command to list the groups owned by -each user or group. -
         % pts listowned <user or group name or id>+
      -
      -

      where -

      -

      listo -
      Is the shortest acceptable abbreviation of listowned. -

      user or group name or id -
      Specifies the name or AFS UID of each user, or the name or AFS GID or each -group, for which to list the groups owned. -
      -
    -

    The output begins with the following string, and then each group appears on -its own line: -

       Groups owned by user_or_group (id: AFS_ID) are:
    -
    -

    The following examples show the output for a user called terry -and a group called terry:friends: -

       % pts listo terry 
    -   Groups owned by terry (id: 5347) are:  
    -     terry:friends   
    -     terry:co-workers
    -   % pts listo terry:friends
    -   Groups owned by terry:friends (id: -567) are:
    -     terry:pals
    -     terry:buddies
    -
    - - - - - - - - - - - - - - - - - - -

    To display all Protection Database entries

    -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts listentries command to display all Protection -Database entries. -
         % pts listentries [-users] [-groups]
      -
      -

      where -

      -

      liste -
      Is the shortest acceptable abbreviation of listentries. -

      -users -
      Displays user and machine entries. The same output results if you -omit both this flag and the -groups flag. -

      -groups -
      Displays group entries. -
      -
    -

    The output is a table that includes the following columns. Examples -follow. -

    -

    Name -
    Specifies the entry's name. -

    ID -
    Specifies the entry's AFS identification number. For user and -machine entries, the AFS user ID (AFS UID) is a positive integer; for -groups, the AFS group ID (AFS GID) is a negative integer. -

    Owner -
    Specifies the AFS ID of the user or group who owns the entry and therefore -can administer it. -

    Creator -
    Specifies the AFS UID of the user who created the entry. -
    -

    The following example is from the ABC Corporation cell. The issuer -provides no options, so the output includes user and machine entries. -

       % pts listentries
    -   Name                          ID  Owner Creator
    -   anonymous                  32766   -204    -204 
    -   admin                          1   -204   32766 
    -   pat                         1000   -204       1 
    -   terry                       1001   -204       1 
    -   smith                       1003   -204       1 
    -   jones                       1004   -204       1 
    -   192.12.105.33               2000   -204       1 
    -   192.12.105.46               2001   -204       1 
    -
    - - - - - -

    Creating User and Machine Entries

    -

    An entry in the Protection Database is one of the two -required components of every AFS user account, along with an entry in the -Authentication Database. It is best to create a Protection Database -user entry only in the context of creating a complete user account, by using -the uss add or uss bulk command as described in Creating and Deleting User Accounts with the uss Command Suite, or the pts createuser command as described in Creating AFS User Accounts. -

    You can also use the pts createuser command to create Protection -Database machine entries, which can then be used to control access based on -the machine from which the access request originates. After creating a -machine entry, add it to a Protection Database group and place the group on -ACLs ( a machine cannot appear on ACLs directly). Because all replicas -of a volume share the same ACL (the one on the volume's root directory -mount point), you can replicate the volume that houses a program's binary -file while still complying with a machine-based license agreement as required -by the program's manufacturer. If you do not place any other -entries on the ACL, then only users working on the designated machines can -access the file. -

    Keep in mind that creating an ACL entry for a group with machine entries in -it extends access to both authenticated and unauthenticated users working on -the machine. However, you can deny access to unauthenticated users by -omitting an entry for the system:anyuser group from the ACLs -of the parent directories in the file's pathname. Conversely, if -you want to enable unauthenticated users on the machine to access a file, then -the ACL on every directory leading to it must include an entry for either the -system:anyuser group or a group to which the machine entry -belongs. For more information on the system:anyuser -group, see The System Groups. -

    Because a machine entry can include unauthenticated users, it is best not -to add both machine entries and user entries to the same group. In -general, it is easier to use and administer nonmixed groups. A machine -entry can represent a single machine, or multiple machines with consecutive IP -addresses (that is, all machines on a network or subnet) specified by a -wildcard notation. See the instructions in To create machine entries in the Protection Database. -

    By default, the Protection Server assigns the next available AFS UID to a -new user or machine entry. It is best to allow this, especially for -machine entries. For user entries, it makes sense to assign an AFS UID -only if the user already has a UNIX UID that the AFS UID needs to match (see Assigning AFS and UNIX UIDs that Match). When automatically allocating an AFS UID, the -Protection Server increments the max user id counter by one and -assigns the result to the new entry. Use the pts listmax -command to display the counter, as described in Displaying and Setting the AFS UID and GID Counters. - -

    Do not reuse the AFS UIDs of users who have left your cell permanently or -machine entries you have removed, even though doing so seems to avoid the -apparent waste of IDs. When you remove a user or machine entry from the -Protection Database, the fs listacl command displays the AFS UID -associated with the former entry, rather than the name. If you then -assign the AFS UID to a new user or machine, the new user or machine -automatically inherits permissions that were granted to the previous possessor -of the ID. To remove obsolete AFS UIDs from ACLs, use the fs -cleanacl command described in Removing Obsolete AFS IDs from ACLs. -

    In addition to the name and AFS UID, the Protection Server records the -following values in the indicated fields of a new user or machine's -entry. For more information and instructions on displaying an entry, -see To display a Protection Database entry. -

      -

    • It sets the owner field to the -system:administrators group, indicating that the group's -members administer the entry. -

    • It sets the creator field to the username of the user who -issued the pts createuser command (or the uss add or -uss bulk command). -

    • It sets the membership field to 0 (zero), because -the new entry does not yet belong to any groups. -

    • It sets the flags field to S----; for -explanation, see Setting the Privacy Flags on Database Entries. -

    • It sets the group quota field to 20, meaning that -the new user can create 20 groups. This field has no meaning for -machine entries. For further discussion, see Setting Group-Creation Quota. -
    - - -

    To create machine entries in the Protection Database

    -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts createuser command to create one or more machine -entries. -
         % pts createuser -name <user name>+ 
      -
      -

      where -

      -

      cu -
      Is an alias for createuser (and createu is the -shortest acceptable abbreviation). -

      -name -
      Specifies an IP address in dotted-decimal notation for each machine -entry. An entry can represent a single machine or a set of several -machines with consecutive IP addresses, using the wildcard notation described -in the following list. The letters W, X, -Y, and Z each represent an actual number value in the -field: -
        -

      • W.X.Y.Z represents a single machine, for -example 192.12.108.240. -

      • W.X.Y.0 matches all machines whose IP -addresses start with the first three numbers. For example, -192.12.108.0 matches both -192.12.108.119 and -192.12.108.120, but does not match -192.12.105.144. -

      • W.X.0.0 matches all machines whose IP -addresses start with the first two numbers. For example, the address -192.12.0.0 matches both -192.12.106.23 and -192.12.108.120, but does not match -192.5.30.95. -

      • W.0.0.0 matches all machines whose IP -addresses start with the first number in the specified address. For -example, the address 192.0.0.0 matches both -192.5.30.95 and -192.12.108.120, but does not match -138.255.63.52. -
      -

      Do not define a machine entry with the name -0.0.0.0 to match every machine. The -system:anyuser group is equivalent. -

      -
    -

    The following example creates a machine entry that includes all of the -machines in the 192.12 network. -

       % pts cu 192.12.0.0
    -
    - - - - - - - - - -

    Creating Groups

    -

    Before you can add members to a group, you must create the -group entry itself. The instructions in this section explain how to -create both regular and prefix-less groups: -

      -

    • A regular group's name is preceded by a prefix that -indicates who owns the group, in the following format: -

      owner_name:group_name -

      Any user can create a regular group. Group names must always be -typed in full, so a short group_name that indicates the group's -purpose or its members' common interest is practical. Groups with -names like terry:1 and terry:2 are less -useful because their purpose is unclear. For more details on the -required format for regular group names, see the instructions in To create groups. -

    • A prefix-less group, as its name suggests, has only one field -in its name, equivalent to a regular group's group_name -field. -

      Only members of the system:administrators group can create -prefix-less groups. For a discussion of their purpose, see Using Prefix-Less Groups. -

    -

    By default, the Protection Server assigns the next available AFS GID to a -new group entry, and it is best to allow this. When automatically -allocating an AFS GID (which is a negative integer), the Protection Server -decrements the max group id counter by one and assigns the result -to the new group. Use the pts listmax command to display the -counter, as described in Displaying and Setting the AFS UID and GID Counters. -

    In addition to the name and AFS GID, the Protection Server records the -following values in the indicated fields of a new group's entry. -See To display a Protection Database entry. -

      -

    • It sets the owner field to the issuer of the pts -creategroup command, or to the user or group specified by the --owner argument. -

    • It sets the creator field to the username of the user who -issued the pts creategroup command. -

    • It sets the membership field to 0 (zero), because -the group currently has no members. -

    • It sets the flags field to S-M--; for -explanation, see Setting the Privacy Flags on Database Entries. -

    • It sets the group quota field to 0, because this -field has no meaning for group entries. -
    - - - - - - - - -

    Using Groups Effectively

    -

    The main reason to create groups is to place them on ACLs, -which enables you to control access for multiple users without having to list -them individually on the ACL. There are three basic ways to use groups, -each suited to a different purpose: -

      -

    • Private use: you create a group and place it on the ACL -of directories you own, without necessarily informing the group's members -that they belong to it. Members notice only that they can or cannot -access the directory in a certain way. You retain sole administrative -control over the group, since you are the owner. -

      The existence of the group and the identity of its members is not -necessarily secret. Other users can use the fs listacl -command and see the group's name on a directory's ACL, or use the -pts membership command to list the groups they themselves belong -to. You can set the group's third privacy flag to limit who can -use the pts membership command to list the group's membership, -but a member of the system:administrators group always -can; see Setting the Privacy Flags on Database Entries. -

    • Shared use: you inform the group's members that they -belong to the group, but you still remain the sole administrator. For -example, the manager of a work group can create a group of all the members in -the work group, and encourage them to use it on the ACLs of directories that -house information they want to share with other members of the group. -
      Note:If you place a group owned by someone else on your ACLs, the group's -owner can change the group's membership without informing you. -Someone new can gain or lose access in a way you did not intend and without -your knowledge. -
      -

    • Group use: you create a group and then use the pts -chown command to assign ownership to a group, either another group or -the group itself (the latter type is a self-owned group). -You inform the members of the owning group that they all can administer the -owned group. -

      The main advantage of designating a group as an owner is that it spreads -responsibility for administering a group among several people. A single -person does not have to perform all administrative tasks, and if the original -creator leaves the group, ownership does not have to be transferred. -

      However, everyone in the owner group can make changes that affect others -negatively, such as adding or removing people from the group inappropriately -or changing the group's ownership to themselves exclusively. These -problems can be particularly sensitive in a self-owned group. Using an -owner group works best if all the members know and trust each other; it -is probably wise to keep the number of people in an owner group small. -

    - - -

    To create groups

    -
      -

    1. If creating a prefix-less group, verify that you belong to the -system:administrators group. If necessary, issue the -pts membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts creategroup command to create each group. -All of the groups have the same owner. -
         % pts creategroup  -name <group name>+ [-owner <owner of the group>]
      -
      -

      where -

      -

      cg -
      Is an alias for creategroup (and createg is the -shortest acceptable abbreviation). - - - -

      -name -
      Names each group to create. The name can include up to 63 lowercase -letters or numbers, but it is best not to include punctuation characters, -especially those that have a special meaning to the shell. -

      A prefix-less group name cannot include the colon (:), -because it is used to separate the two parts of a regular group name: -

      owner_name:group_name -

      The Protection Server requires that the owner_name prefix of a -regular group name accurately indicate the group's owner. By -default, you are recorded as the owner, and the owner_name must be -your AFS username. You can include the -owner argument to -designate another AFS user, a regular group, or a prefix-less group as the -owner, providing the required value in the owner_name field: -

        -

      • If the owner is a user, it must be the AFS username. -

      • If the owner is another regular group, it must match the owning -group's owner_name field. For example, if the owner is -the group terry:associates, the owner field must be -terry. -

      • If the owner is a prefix-less group, it must be the owning group's -name. -
      -

      (For a discussion of why it is useful for a group to own another group, see -Using Groups Effectively.) -

      -owner -
      Is optional and designates an owner other than the issuer of the -command. Specify either an AFS username or the name of a regular or -prefix-less group that already has at least one member. Do not include -this argument if you want to make the group self-owned as described in Using Groups Effectively. For instructions, see To create a self-owned group. -

      Do not designate a machine as a group's owner. Because a -machine cannot authenticate, there is no way for a machine to administer the -group. -

      -
    - - - -

    To create a self-owned group

    -
      -

    1. Issue the pts creategroup command to create a group. Do -not include the -owner argument, because you must own a group to -reassign ownership. For complete instructions, see To create groups. -
         % pts creategroup  <group name>
      -
      -

    2. Issue the pts adduser command to add one or more members to the -group (a group must already have at least one member before owning another -group). For complete instructions, see Adding and Removing Group Members. -
         % pts adduser -user <user name>+ -group <group name>+
      -
      -

    3. Issue the pts chown command to assign group ownership to the -group itself. For complete instructions, see To change a group's owner. -
         % pts chown <group name> <new owner>
      -
      -
    -

    Using Prefix-Less Groups

    -

    Members of the system:administrators group -can create prefix-less groups, which are particularly suitable for group -use, which is described in Using Groups Effectively. -

    Suppose, for example, that the manager of the ABC Corporation's -Accounting Department, user smith, creates a group that includes -all of the corporation's accountants and places the group on the ACLs of -directories that house departmental records. Using a prefix-less group -rather than a regular group is appropriate for the following reasons: -

      -

    • The fact that smith created and owns the group is irrelevant, -and a regular group must be called smith:acctg. A -prefix-less name like acctg is more appropriate. -

    • If another user (say jones) ever replaces smith as -manager of the Accounting Department, jones needs to become the new -owner of the group. If the group is a regular one, its -owner_name prefix automatically changes to jones, but the -change in the owner_name prefix does not propagate to any regular -groups owned by the group. Someone must use the pts rename -command to change each one's owner_name prefix from -smith to jones. -
    -

    A possible solution is to create an authentication account for a fictional -user called acctg and make it the owner of regular groups which -have acctg as their owner_name prefix. However, if -the acctg account is also used for other purposes, then the number -of people who need to know user acctg's password is possibly -larger than the number of people who need to administer the groups it -owns. -

    A prefix-less group called acctg solves the problem of -inappropriate owner names. The groups that it owns have -acctg as their owner_name prefix, which more accurately -reflects their purpose than having the manager's name there. -Prefix-less groups are also more accountable than dummy authentication -accounts. Belonging to the group enables individuals to exercise the -permissions granted to the group on ACLs, but users continue to perform tasks -under their own names rather than under the dummy username. Even if the -group owns itself, only a finite number of people can administer the group -entry. -


    Adding and Removing Group Members

    -

    Users and machines can be members of groups; groups -cannot belong to other groups. Newly created groups have no members at -all. To add them, use the pts adduser command; to -remove them, use the pts removeuser command. - - - - - - - -

    To add users and machines to groups

    -
      -

    1. Verify that you belong to the system:administrators -group, which enables you to add members to a group regardless of the setting -of its fourth (a) privacy flag. By default the group's -owner also has the necessary privilege. If necessary, issue the -pts membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts adduser command to add one or more members to one -or more groups. -
         % pts adduser -user <user name>+ -group <group name>+
      -
      -

      where -

      -

      ad -
      Is the shortest acceptable abbreviation of adduser. -

      -user -
      Specifies each username or machine IP address to add as a member of each -group named by the -group argument. A group cannot belong to -another group. -

      group name -
      Names each group to which to add the new members. -
      -
    - - - - - - - -

    To remove users and machines from groups

    -
      -

    1. Verify that you belong to the system:administrators -group, which enables you to remove members from a group regardless of the -setting of its fifth (r) privacy flag. By default the -group's owner also has the necessary privilege. If necessary, -issue the pts membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts removeuser command to remove one or more members -from one or more groups. -
         % pts removeuser -user  <user name>+  -group <group name>+
      -
      -

      where -

      -

      rem -
      Is the shortest acceptable abbreviation of removeuser. -

      -user -
      Specifies each user or machine IP address to remove from each group named -by the -group argument. -

      -group -
      Names each group from which to remove members. -
      -
    -

    Deleting Protection Database Entries

    -

    It is best to delete a Protection Database user entry only -if you are removing the complete user account. Use either the uss -delete command as described in Deleting Individual Accounts with the uss delete Command, or the pts delete command as described in Removing a User Account. -

    To remove machine and group entries, use the pts delete command -as described in this section. The operation has the following -results: -

      -

    • When you delete a machine entry, its name (IP address wildcard) is removed -from groups. -

    • When you delete a group entry, its AFS GID appears on ACLs instead of the -name. The group-creation quota of the user who created the group -increases by one, even if the user no longer owns the group. -

      To remove obsolete AFS IDs from ACLs, use the fs cleanacl -command as described in Removing Obsolete AFS IDs from ACLs. -

    - - - - - - - -

    To delete Protection Database entries

    -
      -

    1. Verify that you belong to the system:administrators group -or own the group you are deleting. If necessary, issue the pts -membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts delete command to delete one or more entries from -the Protection Database. -
         % pts delete <user or group name or id>+
      -
      -

      where -

      -

      del -
      Is the shortest acceptable abbreviation of delete. -

      user or group name or id -
      Specifies the IP address or AFS UID of each machine or the name or AFS GID -or each group to remove. -
      -
    - - -

    Changing a Group's Owner

    -

    For user and machine entries, the Protection Server -automatically assigns ownership to the system:administrators -group at creation time, and this cannot be changed. For group entries, -you can change ownership. This transfers administrative responsibility -for it to another user or group (for information on group ownership of other -groups, see Using Groups Effectively). -

    When you create a regular group, its owner_name prefix must -accurately reflect its owner, as described in To create groups: -

      -

    • If the owner is a user, owner_name is the username. -

    • If the owner is a regular group, owner_name is the owning -group's owner_name prefix. -

    • If the owner is a prefix-less group, owner_name is the owner -group's name. -
    -

    When you change a regular group's owner, the Protection Server -automatically changes its owner_name prefix appropriately. For -example, if the user pat becomes the new owner of the group -terry:friends, its name automatically changes to -pat:friends, both in the Protection Database and on -ACLs. -

    However, the Protection Server does not automatically change the -owner_name prefix of any regular groups that the group owns. -To continue with the previous example, suppose that the group -terry:friends owns the group -terry:pals. When pat becomes the new owner -of terry:friends, the name terry:pals does -not change. To change the owner_name prefix of a regular group -that is owned by another group (in the example, to change the group's -name to pat:pals), use the pts rename command as -described in Changing a Protection Database Entry's Name. - - - -

    To change a group's owner

    -
      -

    1. Verify that you belong to the system:administrators group -or own the group for which you are changing the owner. If necessary, -issue the pts membership command, which is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. (Optional) If you are changing the group's owner to -another group (or to itself) and want to retain administrative privilege on -the owned group, verify that you belong to the new owner group. If -necessary, issue the pts membership command, which is fully -described in To display group membership. -
         % pts membership <user or group name or id>
      -
      -

      Use the pts adduser command to add yourself if necessary, as -fully described in To add users and machines to groups. -

         % pts adduser <user name> <group name>
      -
      -

    3. Issue the pts chown command to change the group's -owner. -
         % pts chown <group name> <new owner>
      -
      -

      where -

      -

      cho -
      Is the shortest acceptable abbreviation of chown. -

      group name -
      Specifies the current name of the group. -

      new owner -
      Names the user or group to become the group's owner. -
      -

    4. (Optional) Issue the pts listowned command to -display any groups that the group owns. As discussed in the -introduction to this section, the pts chown command does not -automatically change the owner_name prefix of any regular groups that -a group owns. -
         % pts listowned <user or group name or id>
      -
      -

      If you want to change their names to match the new owning group, use the -pts rename command on each one, as described in To change the name of a machine or group entry. -

         % pts rename <old name> <new name>
      -
      -
    - - - - - -

    Changing a Protection Database Entry's Name

    -

    To change the name of a Protection Database entry, use the -pts rename command. It is best to change a user entry's -name only when renaming the entire user account, since so many components of -the account (Authentication Database entry, volume name, home directory mount -point, and so on) share the name. For instructions, see Changing Usernames. A machine entry's name maps to the actual IP -address of one or more machine, so changing the entry's name is -appropriate only if the IP addresses have changed. -

    It is likely, then, that most often you need to change group names. -The following types of name changes are possible: -

      -

    • Changing a regular group's name to another regular group name. -The most common reason for this type of change is that you have used the -pts chown command to change the owner of the group. That -operation does not change the owner_name prefix of a regular group -owned by the group whose name has been changed. Therefore, you must use -the pts rename command to change it appropriately. For -example, when user pat becomes the owner of the -terry:friends group, its name changes automatically to -pat:friends, but the name of a group it owns, -terry:pals, does not change. Use the pts -rename command to rename terry:pals to -pat:pals. The Protection Server does not accept -changes to the owner_name prefix that do not reflect the true -ownership (changing terry:pals to smith:pals -is not possible). -

      You can also use the pts rename command to change the -group_name portion of a regular group name, with or without changing -the owner_name prefix. -

      Both the group's owner and the members of the -system:administrators group can change its name to another -regular group name. -

    • Changing a regular group's name to a prefix-less name. If you -change a group's name in this way, you must also use the pts -rename command to change the name of any regular group that the group -owns. Only members of the system:administrators group -can make this type of name change. -

    • Changing a prefix-less name to another prefix-less name. As with -other name changes, the owner_name prefix of any regular groups that -the prefix-less group owns does not change automatically. You must -issue the pts rename command on them to maintain -consistency. -

      Both the group's owner and the members of the -system:administrators group can change its name to another -prefix-less name. -

    • Changing a prefix-less name to a regular name. The -owner_name prefix on the new name must accurately reflect the -group's ownership. As with other name changes, the -owner_name prefix of any regular groups that the prefix-less group -owns does not change automatically. You must issue the pts -rename command on them to maintain consistency. -

      Only members of the system:administrators group can make -this type of name change. -

    - - -

    To change the name of a machine or group entry

    -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts rename command to change the entry's -name. -
         % pts rename <old name> <new name>
      -
      -

      where -

      -

      ren -
      Is the shortest acceptable abbreviation of rename. -

      old name -
      Specifies the entry's current name. -

      new name -
      Specifies the new name. If the new name is for a regular group, the -owner_name prefix must correctly indicate the owner. -
      -
    - - - - - - -

    Setting Group-Creation Quota

    -

    To prevent abuse of system resources, the Protection Server -imposes a group-creation quota that limits how many more groups a -user can create. When a new user entry is created, the quota is set to -20, but members of the system:administrators group can use -the pts setfields command to increase or decrease it at any -time. -

    It is pointless to change group-creation quota for machine or group -entries. It is not possible to authenticate as a group or machine and -then create groups. -

    To display the group-creation quota, use the pts examine command -to display a user entry's group quota field, as described in To display a Protection Database entry. - - -

    To set group-creation quota

    -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts setfields command to specify how many more groups -each of one or more users can create. -
        % pts setfields -nameorid <user or group name or id>+  \
      -                  -groupquota <set limit on group creation>
      -
      -

      where -

      -

      setf -
      Is the shortest acceptable abbreviation of setfields. -

      -nameorid -
      Specifies the name or AFS UID of each user for which to set group-creation -quota. -

      -groupquota -
      Defines how many groups each user can create in addition to existing -groups (in other words, groups that already exist do not count against the -quota). The value you specify overwrites the current value, rather than -incrementing it. -
      -
    - - - - - - -

    Setting the Privacy Flags on Database Entries

    -

    Members of the system:administrators group -can always display and administer Protection Database entries in any way, and -regular users can display and administer their own entries and any group -entries they own. The privacy flags on a Protection Database -entry determine who else can display certain information from the entry, and -who can add and remove members in a group. -

    To display the flags, use the pts examine command as described -in To display a Protection Database entry. The flags appear in the output's -flags field. To set the flags, include the --access argument to the pts setfields command. -

    The five flags always appear, and always must be set, in the following -order: -

    -

    s -
    Controls who can issue the pts examine command to display the -entry. -

    o -
    Controls who can issue the pts listowned command to display the -groups that a user or group owns. -

    m -
    Controls who can issue the pts membership command to display -the groups a user or machine belongs to, or which users or machines belong to -a group. -

    a -
    Controls who can issue the pts adduser command to add a user or -machine to a group. It is meaningful only for groups, but a value must -always be set for it even on user and machine entries. -

    r -
    Controls who can issue the pts removeuser command to remove a -user or machine from a group. It is meaningful only for groups, but a -value must always be set for it even on user and machine entries. -
    -

    Each flag can take three possible types of values to enable a different set -of users to issue the corresponding command: -

      -

    • A hyphen (-) designates the members of the -system:administrators group and the entry's -owner. For user entries, it designates the user in addition. -

    • The lowercase version of the letter applies meaningfully to groups only, -and designates members of the group in addition to the individuals designated -by the hyphen. -

    • The uppercase version of the letter designates everyone. -
    -

    For example, the flags SOmar on a group entry indicate that -anyone can examine the group's entry and display the groups that it owns, -and that only the group's members can display, add, or remove its -members. -

    The default privacy flags for user and machine entries are -S----, meaning that anyone can display the entry. The -ability to perform any other functions is restricted to members of the -system:administrators group and the entry's owner (as -well as the user for a user entry). -

    The default privacy flags for group entries are S-M--, meaning -that all users can display the entry and the members of the group, but only -the entry owner and members of the system:administrators -group can perform other functions. - - -

    To set a Protection Database entry's privacy flags

    -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts setfields command to set the privacy -flags. -
         % pts setfields <user or group name or id>+ -access <set privacy flags>
      -
      -

      where -

      -

      setf -
      Is the shortest acceptable abbreviation of setfields. -

      user or group name or id -
      Specifies the name or AFS UID of each user, the IP address or AFS UID of -each machine, or the name or AFS GID of each group for which to set the -privacy flags. -

      -access -
      Specifies the set of privacy flags to associate with each entry. -Provide a value for each of the five flags, observing the following -constraints: -
        -

      • Provide a value for all five flags, even though the fourth and fifth flags -are not meaningful for user and machine entries. -

      • For self-owned groups, the hyphen is equivalent to a lowercase letter, -because all the members of a self-owned group own it. -

      • Set the first flag to lowercase s or uppercase S -only. For user and machine entries, the Protection Server interprets -the lowercase s as equivalent to the hyphen. -

      • Set the second flag to the hyphen (-) or uppercase O -only. For groups, the Protection Server interprets the hyphen as -equivalent to lowercase o (that is, members of a group can always -list the groups that it owns). -

      • Set the third flag to the hyphen (-), lowercase m, -or uppercase M. For user and machine entries, the lowercase -m does not have a meaningful interpretation, because they have no -members. -

      • Set the fourth flag to the hyphen (-), lowercase a, -or uppercase A. Although this flag does not have a -meaningful interpretation for user and machine entries (because they have no -members), it must be set, preferably to the hyphen. -

      • Set the fifth flag to the hyphen (-) or lowercase r -only. Although this flag does not have a meaningful interpretation for -user and machine entries (because they have no members), it must be set, -preferably to the hyphen. -
      -
      -
    - - - - -

    Displaying and Setting the AFS UID and GID Counters

    -

    When you use the pts createuser command to create -a user or machine entry in the Protection Database, the Protection Server by -default automatically allocates an AFS user ID (AFS UID) for it; -similarly, it allocates an AFS group ID (AFS GID) for each group entry you -create with the pts creategroup command. It tracks the next -available AFS UID (which is a positive integer) and AFS GID (which is a -negative integer) with the max user id and max group id -counters, respectively. -

    Members of the system:administrators group can include the --id argument to either pts creation command to assign a -specific ID to a new user, machine, or group. It often makes sense to -assign AFS UIDs explicitly when creating AFS accounts for users with existing -UNIX accounts, as discussed in Assigning AFS and UNIX UIDs that Match. It is also useful if you want to establish ranges of -IDs that correspond to departmental affiliations (for example, assigning AFS -UIDs from 300 to 399 to members of one department, AFS UIDs from 400 to 499 to -another department, and so on). -

    To display the current value of the counters, use the pts -listmax command. When you next create a user or machine entry and -do not specify its AFS UID, the Protection Server increments the max user -id counter by one and assigns that number to the new entry. When -you create a new group and do not specify its AFS GID, the Protection Server -decrements the max group id counter by one (makes it more -negative), and assigns that number to the new group. -

    You can change the value of either counter, or both, in one of two -ways: -

      -

    • Directly, using the pts setmax command. -

    • Indirectly, by using the -id argument to the pts -createuser command to assign an AFS UID that is larger than the max -user id counter, or by using the -id to the pts -creategroup command to assign an AFS GID that is less (more negative) -than the max group id counter. In either case, the -Protection Server changes the counter to the value of the -id -argument. The Protection Server does not use the IDs between the -previous value of the counter and the new one when allocating IDs -automatically, unless you use the pts setmax command to move the -counter back to its old value. -

      If the value you specify with the -id argument is less than the -max user id counter or greater (less negative) than the max -group id counter, then the counter does not change. -

    - - - - - - -

    To display the AFS ID counters

    -
      -

    1. Issue the pts listmax command to display the counters. -
         % pts listmax
      -
      -

      where listm is an acceptable abbreviation of -listmax. -

    -

    The following example illustrates the output's format. In this -case, the next automatically assigned AFS UID is 5439 and AFS GID is --469. -

       % pts listmax
    -   Max user id is 5438 and max group id is -468.
    -
    - - - - - - - - - - - -

    To set the AFS ID counters

    -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts setmax command to set the max user id -counter, the max group id counter, or both. -
         % pts setmax [-group <group max>] [-user <user max>]
      -
      -

      where -

      -

      setm -
      Is the shortest acceptable abbreviation of setmax. -

      -group -
      Specifies an integer one greater (less negative) than the AFS GID that the -Protection Server is to assign to the next group entry. Because the -value is a negative integer, precede it with a hyphen (-). -

      -user -
      Specifies an integer one less than the AFS UID that the Protection Server -is to assign to the next user or machine entry. -
      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd020.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd020.htm deleted file mode 100755 index 1d009ad31..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd020.htm +++ /dev/null @@ -1,939 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Managing Access Control Lists

    -

    To control access to a directory and all of the files in it, -AFS associates an access control list (ACL) with it, -rather than the mode bits that the UNIX file system (UFS) associates with -individual files or directories. AFS ACLs provide more refined access -control because there are seven access permissions rather than UFS's -three, and there is room for approximately 20 user or group entries on an ACL, -rather than just the three UFS entries (owner, group, -and other). -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - -
    Examine access control list -fs listacl -
    Edit ACL's normal permissions section -fs setacl -
    Edit ACL's negative permissions section -fs setacl with -negative flag -
    Replace an ACL -fs setacl with -clear flag -
    Copy an ACL -fs copyacl -
    Remove obsolete AFS UIDs -fs cleanacl -
    -


    Protecting Data in AFS

    - - -

    This section describes the main differences between the AFS and UFS file -protection systems, discusses the implications of directory-level protections, -and describes the seven access permissions. -

    Differences Between UFS and AFS Data Protection

    - - - -

    The UFS mode bits data protection system and the AFS ACL system differ in -the following ways: -

      -

    • Protection at the file level (UFS) versus the directory level (AFS) -

      UFS associates a set of nine mode bits with each file element, three -(rwx) for each of the element's owner, owning group, and all -other users. A similar set of mode bits on the file's directory -applies to the file only in an oblique way. -

      An AFS ACL instead protects all files in a directory in the same -way. If a certain file is more sensitive than others, store it in a -directory with a more restrictive ACL. -

      Defining access at the directory level has important consequences: - -

        -

      • The permissions on a directory's ACL apply to all of the files in the -directory. When you move a file to a different directory, you -effectively change the access permissions that apply to it to those on its new -directory's ACL. Changing a directory's ACL changes the -protection on all the files in it. -

      • When you create a subdirectory, its initial ACL is created as a copy of -its parent directory's ACL. You can then change the -subdirectory's ACL independently. However, the parent -directory's ACL continues to control access to the subdirectory in the -following way: the parent directory's ACL must grant the -l (lookup) permission to a user (or a group the user -belongs to) in order for the user to access the subdirectory at all. -

        In general, then, it is best to assign fairly liberal access permissions to -high-level directories (including user home directories). In -particular, it often makes sense to grant at least the l permission -to the system:anyuser or system:authuser -group on high-level directories. For further discussion, see Using Groups on ACLs. -

      -

    • How the mode bits are interpreted -

      Mode bits are the only file-protection system in UFS. AFS allows you -to set the UNIX mode bits on a file in addition to the ACL on its directory, -but it interprets them differently. See How AFS Interprets the UNIX Mode Bits. -

    • Three access permissions (UFS) versus seven (AFS) -

      UFS defines three access permissions in the form of mode bits: -r (read), w (write), and -x (execute). AFS defines seven permissions, which -makes access control more precise. For detailed descriptions, see The AFS ACL Permissions. -

      -

      a (administer) -

      d (delete) -

      i (insert) -

      k (lock) -

      l (lookup) -

      r (read) -

      w (write) -

      -

    • Three defined users and groups (UFS) versus many (AFS) -

      UFS controls access for one user and two groups by providing a set of mode -bits for each: the user who owns the file or directory, a single defined -group, and everyone who has an account on the system. -

      AFS, in contrast, allows you to place many entries (individual users or -groups) on an ACL, granting a different set of access permissions to each -one. The number of possible entries is about 20, and depends on how -much space each entry occupies in the memory allocated for the ACL -itself. -

      AFS defines two system groups, system:anyuser and -system:authuser, which represent all users and all -authenticated users, respectively; for further discussion, see Using Groups on ACLs. In addition, users can define their own groups in -the Protection Database, consisting of individual users or machine IP -addresses. Users who have the a permission on an ACL can -create entries for the system groups as well as groups defined by themselves -or other users. For information on defining groups, see Administering the Protection Database. -

      When a user requests access to a file or directory, the File Server sums -together all of the permissions that the relevant ACL extends to the user and -to groups to which the user belongs. Placing group entries on ACLs -therefore can control access for many more users than the ACL can accommodate -as individual entries. -

    -

    The AFS ACL Permissions

    - - - -

    Functionally, the seven standard ACL permissions fall into two -groups: one that applies to the directory itself and one that applies to -the files it contains. -

    The Four Directory Permissions

    -

    The four permissions in this group are meaningful with -respect to the directory itself. For example, the i -(insert) permission does not control addition of data to a file, -but rather creation of a new file or subdirectory. -

    -

    The l (lookup) permission -
    This permission functions as something of a gate keeper for access to the -directory and its files, because a user must have it in order to exercise any -other permissions. In particular, a user must have this permission to -access anything in the directory's subdirectories, even if the ACL on a -subdirectory grants extensive permissions. - - -

    This permission enables a user to issue the following commands: -

      -

    • The ls command to list the names of the files and -subdirectories in the directory -

    • The ls -ld command to obtain complete status information for -the directory element itself -

    • The fs listacl command to examine the directory's ACL -
    -

    This permission does not enable a user to read the contents of a file in -the directory, to issue the ls -l command on a file in the -directory, or to issue the fs listacl command with the filename as -the -path argument. Those operations require the -r (read) permission which is described in The Three File Permissions. -

    Similarly, this permission does not enable a user to issue the -ls, ls -l, ls -ld, or fs listacl -commands against a subdirectory of the directory. Those operations -require the l permission on the ACL of the subdirectory -itself. -

    The i (insert) permission -
    This permission enables a user to add new files to the directory, either -by creating or copying, and to create new subdirectories. It does not -extend into any subdirectories, which are protected by their own ACLs. - - -

    The d (delete) permission -
    This permission enables a user to remove files and subdirectories from the -directory or move them into other directories (assuming that the user has the -i permission on the ACL of the other directories). - - -

    The a (administer) permission -
    This permission enables a user to change the directory's ACL. -Members of the system:administrators group implicitly have -this permission on every directory (that is, even if that group does not -appear on the ACL). Similarly, the owner of a directory implicitly has -this permission on its ACL and those of all directories below it that he or -she owns. - - -
    -

    The Three File Permissions

    -

    The three permissions in this group are meaningful with -respect to files in a directory, rather than the directory itself or its -subdirectories. -

    -

    The r (read) permission -
    This permission enables a user to read the contents of files in the -directory and to issue the ls -l command to stat the file -elements. - - -

    The w (write) permission -
    This permission enables a user to modify the contents of files in the -directory and to issue the chmod command to change their UNIX mode -bits. - - -

    The k (lock) permission -
    This permission enables the user to run programs that issue system calls -to lock files in the directory. - - -
    -

    The Eight Auxiliary Permissions

    - - - -

    AFS provides eight additional permissions that do not have a defined -meaning, denoted by the uppercase letters A, B, -C, D, E, F, G, and -H. -

    You can write application programs that assign a meaning to one or more of -the permissions, and then place them on ACLs to control file access by those -programs. For example, you can modify a print program to recognize and -interpret the permissions, and then place them on directories that house files -that the program accesses. Use the fs listacl and fs -setacl commands to display and set the auxiliary permissions on ACLs -just like the standard seven. -

    Shorthand Notation for Sets of Permissions

    - - -

    You can combine the seven permissions in any way in an ACL entry, but -certain combinations are more useful than others. Four of the more -common combinations have corresponding shorthand forms. When using the -fs setacl command to define ACL entries, you can provide either one -or more of the individual letters that represent the permissions, or one of -the following shorthand forms: -

    - -

    all -
    Represents all seven standard permissions (rlidwka). - -

    none -
    Removes the entry from the ACL, leaving the user or group with no -permissions. - -

    read -
    Represents the r (read) and l -(lookup) permissions. - -

    write -
    Represents all permissions except a -(administer): rlidwk. -
    -

    Using Normal and Negative Permissions

    - - - -

    ACLs enable you both to grant and to deny access to a directory and the -files in it. To grant access, use the fs setacl command to -create an ACL entry that associates a set of permissions with a user or group, -as described in Setting ACL Entries. When you use the fs listacl command to -display an ACL (as described in Displaying ACLs), such entries appear underneath the following header, which -uses the term rights to refer to permissions: -

       Normal rights
    -
    -

    There are two ways to deny access: -

      -

    1. The recommended method is simply to omit an entry for the user or group -from the ACL, or to omit the appropriate permissions from the entry. -Use the fs setacl command to remove or edit an existing entry, -using the instructions in To add, remove, or edit normal ACL permissions. In most circumstances, this method is enough to -prevent access of certain kinds or by certain users. You must take -care, however, not to grant the undesired permissions to any groups to which -such users belong. -

    2. The more explicit method for denying access is to use the --negative flag to the fs setacl command to create an -entry that associates negative permissions with the user or -group; for instructions, see To add, remove, or edit negative ACL permissions. The output from the fs listacl -command lists negative entries underneath the following header: -
         Negative rights
      -
      -

      When determining what type of access to grant to a user, the File Server -first compiles a set of permissions by examining all of the entries in the -Normal rights section of the ACL. It then subtracts any -permissions associated with the user (or with groups to which the user -belongs) on the Negative rights section of the ACL. -Therefore, negative permissions always cancel out normal permissions. -

      Using negative permissions reverses the usual semantics of the fs -setacl command, introducing the potential for confusion. In -particular, combining the none shorthand and the --negative flag constitutes a double negative: by removing an -entry from the Negative rights section of the ACL, you enable a -user once again to obtain permissions via entries in the Normal -rights section. Combining the all shorthand with the --negative flag explicitly denies all permissions. -

      Note also that it is pointless to create an entry in the Negative -rights section if an entry in the Normal rights section -grants the denied permissions to the system:anyuser -group. In this case, users can obtain the permissions simply by using -the unlog command to discard their tokens. When they do so, -the File Server recognizes them as the anonymous user, who belongs -to the system:anyuser group but does not match the entries on -the Negative rights section of the ACL. -

    -

    Using Groups on ACLs

    - - -

    As previously mentioned, placing a group entry on an ACL enables you to -control access for many users at once. You can grant a new user access -to many files and directories simply by adding the user to a group that -appears on the relevant ACLs. You can also create groups of machines, -in which case any user logged on to the machine obtains the access that is -granted to the group. On directories where they have the a -permission on the ACL, users can define their own groups and can create ACL -entries for any groups, not just groups that they create or own -themselves. For instructions on creating groups of users or machines, -and a discussion of the most effective ways to use different types of groups, -see Administering the Protection Database. - - - - - -

    AFS also defines the following two system groups, which can be very useful -on ACLs because they potentially represent a large group of people. For -more information about these groups, see The System Groups. -

    -

    system:anyuser -
    Includes anyone who can access the cell's file tree, including users -who have logged in as the local superuser root, have connected to a -local machine from somewhere outside the cell, and AFS users who belong to a -foreign cell. This group includes users who do not have tokens that are -valid for the local AFS servers; the servers recognize them as the user -anonymous. -

    Note that creating an ACL entry for this group is the only way to extend -access to AFS users from foreign cells, unless you create local authentication -accounts for them. - -

    system:authuser -
    Includes all users who have a valid AFS token obtained from the local -cell's authentication service. -
    -

    It is particularly useful to grant the l (lookup) -permission to the system:anyuser group on the ACL of most -directories in the file system, especially at the upper levels. This -permission enables users only to learn the names of files and subdirectories -in a directory, but without it they cannot traverse their way through the -directories in the path to a target file. -

    A slightly more restrictive alternative is to grant the l -permission to the system:authuser group. If that is -still not restrictive enough, you can grant the l to specific users -or groups, which cannot exceed about 20 in number on a given ACL. -

    Another reason to grant certain permissions to the -system:anyuser group is to enable the correct operation of -processes that provide services such as printing and mail delivery. For -example, in addition to the l permission, a print process possibly -needs the r (read) permission in order to access the -contents of files, and a mail delivery process possibly requires the -i (insert) permission to deliver new pieces of -mail. -

    The ACL on the root directory of every newly created volume grants all -permissions to the system:administrators group. You -can remove this entry if you wish, but members of the -system:administrators group always implicitly have the -a (administer), and by default also the l, -permission on every directory's ACL. The a permission -enables them to grant themselves other permissions explicitly when -necessary. To learn about changing this default set of permissions, see -Administering the system:administrators Group. -


    Displaying ACLs

    - - -

    To display the ACL associated with a file, directory or symbolic link, -issue the fs listacl command. The output for a symbolic link -displays the ACL that applies to its target file or directory, rather than the -ACL on the directory that houses the symbolic link. -

    Note for AFS/DFS Migration Toolkit users: If the machine -on which you issue the fs listacl command is configured to access a -DCE cell's DFS filespace via the AFS/DFS Migration Toolkit, you can use -the command to display the ACL on DFS files and directories. To display -a DFS directory's Initial Container and Initial Object ACL instead of the -regular one, include the fs listacl command's -id -or -if flag. For instructions, see the AFS/DFS -Migration Toolkit Administration Guide and Reference. The -fs command interpreter ignores the -id and --if flags if you include them when displaying an AFS ACL. - - -

    To display an ACL

    -
      -

    1. Issue the fs listacl command. -
         % fs listacl [<dir/file path>+]
      -
      -

      where -

      -

      la -
      Is an acceptable alias for listacl (and lista is the -shortest acceptable abbreviation). -

      dir/file path -
      Names one or more files or directories for which to display the -ACL. For files, the output displays the ACL for its directory. -If you omit this argument, the output is for the current working -directory. Partial pathnames are interpreted relative to the current -working directory. You can also use the following notation on its own -or as part of a pathname: -
      -

      . -
      (A single period). Specifies the current working directory. -

      .. -
      (Two periods). Specifies the current working directory's -parent directory. -

      * -
      (The asterisk). Specifies each file and subdirectory in the current -working directory. The ACL displayed for a file is always the same as -for its directory, but the ACL for each subdirectory can differ. -
      -
      -
    -

    The following error message indicates that you do not have the permissions -needed to display an ACL. To specify a directory name as the -dir/file path argument, you must have the l -(lookup) permission on the ACL. To specify a filename, you -must also have the r (read) permission on its -directory's ACL. -

       fs: You don't have the required access permissions on 'dir/file path'
    -
    -

    Members of the system:administrators group and the -directory's owner (as reported by the ls -ld command) -implicitly have the a (administer) permission on every -directory's ACL, and can use the fs setacl command to grant -themselves the required permissions; for instructions, see Setting ACL Entries. -

    The output for each file or directory specified as dir/file path -begins with the following header to identify it: -

       Access list for  dir/file path is
    -
    -

    The Normal rights header appears on the next line, followed by -lines that each pair a user or group name and a set of permissions. The -permissions appear as the single letters defined in The AFS ACL Permissions, and always in the order rlidwka. If there -are any negative permissions, the Negative rights header appears -next, followed by pairs of negative permissions. -

    The following example displays the ACL on user terry's home -directory in the ABC Corporation cell: -

       % fs la /afs/abc.com/usr/terry
    -   Access list for /afs/abc.com/usr/terry is
    -   Normal permissions:
    -      system:authuser rl
    -      pat rlw
    -      terry rlidwka
    -   Negative permissions:
    -      terry:other-dept rl
    -      jones rl
    -
    -

    where pat, terry, and jones are individual -users, system:authuser is a system group, and -terry:other-dept is a group that terry -owns. The list of normal permissions grants all permissions to -terry, the r (read), l -(lookup), and w (write) permissions to -pat, and the r and l permissions to the -members of the system:authuser group. -

    The list of negative permissions denies the r and l -permissions to jones and the members of the -terry:other-dept group. These entries effectively -prevent them from accessing terry's home directory in any way, -because they cancel out the r and l permissions extended -to the system:authuser group, which is the only entry on the -Normal rights section of the ACL that possibly applies to -them. -


    Setting ACL Entries

    - - - - - - - - - - -

    To add, remove, or edit ACL entries, use the fs setacl -command. By default, the command manipulates entries on the normal -permissions section of the ACL. To manipulate entries on the negative -permissions section, include the -negative flag. -

    You must have the a (administer) permission on an ACL -to edit it. The owner of a directory (as reported by the ls --ld) command and members of the system:administrators -group always implicitly have it on every ACL. By default, members of -the system:administrators group also implicitly have the -l (lookup) permission. -

    Note for AFS/DFS Migration Toolkit users: If the machine -on which you issue the fs setacl command is configured to access a -DCE cell's DFS filespace via the AFS/DFS Migration Toolkit, you can use -the command to set the ACL on DFS files and directories. To set a DFS -directory's Initial Container and Initial Object ACL instead of the -regular one, include the fs setacl command's -id or --if flag. For instructions, see the AFS/DFS Migration -Toolkit Administration Guide and Reference. The fs -command interpreter ignores the -id and -if flags if you -include them when setting an AFS ACL. - - -

    To add, remove, or edit normal ACL permissions

    -
      -

    1. Verify that you have the a (administer) permission -on each directory for which you are editing the ACL. If necessary, -issue the fs listacl command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. Issue the fs setacl command to edit entries in the normal -permissions section of the ACL. To remove an entry, specify the -none shorthand as the permissions. If an ACL entry already -exists, the permissions you specify completely replace those in the existing -entry. -
         % fs setacl  -dir <directory>+ -acl <access list entries>+
      -
      -

      where -

      -

      sa -
      Is an acceptable alias for setacl (and seta is the -shortest acceptable abbreviation). -

      -dir -
      Names one or more directories to which to apply the ACL entries defined by -the -acl argument. Partial pathnames are interpreted -relative to the current working directory. -

      Specify the read/write path to each directory, to avoid the failure that -results when you attempt to change a read-only volume. By convention, -you indicate the read/write path by placing a period before the cell name at -the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      You can also use the following notation on its own or as part of a -pathname: -

      -

      . -
      (A single period). If used by itself, sets the ACL on the current -working directory. -

      .. -
      (Two periods). If used by itself, sets the ACL on the current -working directory's parent directory. -

      * -
      (The asterisk). Sets the ACL on each of the subdirectories in the -current working directory. You must precede it with the -dir -switch, since it potentially designates multiple directories. The -fs command interpreter generates the following error message for -each file in the directory: -
         fs: 'filename': Not a directory
      -
      -
      -

      If you specify only one directory or file name, you can omit the --dir and -acl switches. -

      -acl -
      Specifies one or more ACL entries, each of which pairs a user or group -name and a set of permissions. Separate the pairs, and the two parts of -each pair, with one or more spaces. -

      To define the permissions, provide either: -

        -

      • One or more of the letters that represent the standard or auxiliary -permissions (rlidwka and ABCDEFGH), in any order -

      • One of the four shorthand notations: -
          -

        • all (equals rlidwka) -

        • none (removes the entry) -

        • read (equals rl) -

        • write (equals rlidwk) -
        -
      -

      For a more detailed description of the permissions and shorthand notations, -see The AFS ACL Permissions. -

      On a single command line, you can combine user and group entries. -You can also use individual letters in some pairs and the shorthand notations -in other pairs, but cannot combine letters and shorthand notation within a -single pair. -

      -
    -

    Either of the following examples grants user pat the -r (read) and l (lookup) -permissions on the ACL of the notes subdirectory in the -issuer's home directory. They illustrate how it is possible to -omit the -dir and -acl switches when you name only one -directory. -

       % fs sa ~/notes pat rl
    -   
    -   % fs sa ~/notes pat read
    -
    -

    The following example edits the ACL for the current working -directory. It removes the entry for the system:anyuser -group, and adds two entries: one grants all permissions except -a (administer) to the members of the -terry:colleagues group and the other grants the r -(read) and l (lookup) permissions to the -system:authuser group. The command appears on two -lines here only for legibility. -

       % fs  sa  -dir . -acl  system:anyuser  none  terry:colleagues  write  \
    -           system:authuser  rl
    -
    - - - - - -

    To add, remove, or edit negative ACL permissions

    -
      -

    1. Verify that you have the a (administer) permission -on each directory for which you are editing the ACL. If necessary, -issue the fs listacl command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. Issue the fs setacl command with the -negative flag -to edit entries in the negative permissions section of the ACL. To -remove an entry, specify the none shorthand as the -permissions. If an ACL entry already exists for a user or group, the -permissions you specify completely replace those in the existing entry. -
         % fs setacl -dir <directory>+ -acl <access list entries>+  -negative 
      -
      -

      where -

      -

      sa -
      Is an acceptable alias for setacl (and seta is the -shortest acceptable abbreviation). -

      -dir -
      Names one or more directories to which to apply the negative ACL entries -defined by the -acl argument. Specify the read/write path to -each directory, to avoid the failure that results when you attempt to change a -read-only volume. For a detailed description of acceptable values, see To add, remove, or edit normal ACL permissions. -

      -acl -
      Specifies one or more ACL entries, each of which pairs a user or group -name and a set of permissions. Separate the pairs, and the two parts of -each pair, with one or more spaces. For a detailed description of -acceptable values, see To add, remove, or edit normal ACL permissions. Keep in mind that the usual meaning of each -permission is reversed. -

      -negative -
      Places the entries defined by the -acl argument on the negative -permissions section of the ACL for each directory named by the -dir -argument. -
      -
    -

    The following example denies user pat the w -(write) and d (delete) permissions for the -project subdirectory of the current working directory. -

       % fs sa project pat wd -neg
    -
    -

    Completely Replacing an ACL

    - - - - - - -

    It is sometimes simplest to clear an ACL completely before defining new -permissions on it, for instance if the mix of normal and negative permissions -makes it difficult to understand how their interaction affects a user's -access to the directory. To clear an ACL completely while you define -new entries, include the -clear flag on the fs setacl -command. When you include this flag, you can create entries on either -the normal permissions or the negative permissions section of the ACL, but not -on both at once. -

    Remember to create an entry that grants appropriate permissions to the -directory's owner. The owner implicitly has the a -(administer) permission required to replace a deleted entry, but -the effects of a missing ACL entry (particularly the lack of the -lookup permission) can be so confusing that it becomes difficult -for the owner to realize that the missing entry is causing the -problems. - - -

    To replace an ACL completely

    -
      -

    1. Verify that you have the a (administer) permission -on each directory for which you are editing the ACL. If necessary, -issue the fs listacl command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. Issue the fs setacl command with the -clear flag to -clear the ACL completely before setting either normal or negative -permissions. Because you need to grant the owner of the directory all -permissions, it is better in most cases to set normal permissions at this -point. -
         % fs setacl -dir <directory>+ -acl <access list entries>+ -clear  \
      -               [-negative] 
      -
      -

      where -

      -

      sa -
      Is an acceptable alias for setacl (and seta is the -shortest acceptable abbreviation). -

      -dir -
      Names one or more directories to which to apply the negative ACL entries -defined by the -acl argument. Specify the read/write path to -each directory, to avoid the failure that results when you attempt to change a -read-only volume. For a detailed description of acceptable values, see To add, remove, or edit normal ACL permissions. -

      -acl -
      Specifies one or more ACL entries, each of which pairs a user or group -name and a set of permissions. Separate the pairs, and the two parts of -each pair, with one or more spaces. Remember to grant all permissions -to the owner of the directory. For a detailed description of acceptable -values, see To add, remove, or edit normal ACL permissions. -

      -clear -
      Removes all entries from each ACL before creating the entries indicated by -the -acl argument. -

      -negative -
      Places the entries defined by the -acl argument on the negative -permissions section of each ACL. -
      -
    -

    Copying ACLs Between Directories

    - - - -

    The fs copyacl command copies a source directory's ACL to -one or more destination directories. It does not affect the source ACL -at all, but changes each destination ACL as follows: -

      -

    • If an entry on the source ACL does not exist on the destination ACL, the -command copies it to the destination ACL. -

    • If an entry on the destination ACL does not also exist on the source ACL, -the command does not remove it unless you include the -clear flag -to overwrite the destination ACL completely. -

    • If an entry is on both ACLs, the command changes the permissions on the -destination ACL entry to match the source ACL entry. -
    -

    Note for AFS/DFS Migration Toolkit users: If the machine -is configured to enable AFS users to access a DCE cell's DFS filespace -via the AFS/DFS Migration Toolkit, then you can use the fs copyacl -command to copy ACLs between DFS files and directories also. The -command includes -id and -if flags for altering a DFS -directory's Initial Container and Initial Object ACLs as well as its -regular ACL; see the AFS/DFS Migration Toolkit Administration Guide -and Reference. You cannot copy ACLs between AFS and DFS -directories, because they use different ACL formats. The fs -command interpreter ignores the -id and -if flags if you -include them when copying AFS ACLs. - - -

    To copy an ACL between directories

    -
      -

    1. Verify that you have the l (lookup) permission on -the source ACL and the a (administer) permission on each -destination ACL. To identify the source directory by naming a file in -it, you must also have the r (read) permission on the -source ACL. If necessary, issue the fs listacl command, -which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. Issue the fs copyacl command to copy a source ACL to -the ACL on one or more destination directories. (The command appears -here on two lines only for legibility.) -
         % fs copyacl -fromdir <source directory> -todir <destination directory>+  \
      -                [-clear]
      -
      -

      where -

      -

      co -
      Is the shortest acceptable abbreviation for copyacl. -

      -fromdir -
      Names the source directory from which to copy the ACL. Partial -pathnames are interpreted relative to the current working directory. If -this argument names a file, the ACL is copied from its directory. -

      -todir -
      Names each destination directory to which to copy the source ACL. -Partial pathnames are interpreted relative to the current working -directory. Filenames are not acceptable. -

      Specify the read/write path to each directory, to avoid the failure that -results when you attempt to change a read-only volume. By convention, -you indicate the read/write path by placing a period before the cell name at -the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      -clear -
      Completely overwrites each destination directory's ACL with the -source ACL. -
      -
    -

    The following example copies the ACL from the current working -directory's notes subdirectory to the plans -subdirectory. The issuer does not include the -clear flag, -so the entry for user pat remains on the plans -directory's ACL although there is no corresponding entry on the -notes directory's ACL. -

       % fs la notes plans
    -   Access list for notes is
    -   Normal permissions:
    -      terry rlidwka
    -      smith rl
    -      jones rl
    -   Access list for plans is
    -   Normal permissions:
    -      terry rlidwk
    -      pat rlidwk
    -   % fs copyacl notes plans
    -   % fs la notes plans
    -   Access list for notes is
    -   Normal permissions:
    -      terry rlidwka
    -      smith rl
    -      jones rl
    -   Access list for plans is
    -   Normal permissions:
    -      terry rlidwka
    -      pat rlidwk
    -      smith rl
    -      jones rl
    -
    - - - - - -

    Removing Obsolete AFS IDs from ACLs

    -

    When you remove a user or group entry from the Protection -Database, the fs listacl command displays the user's AFS UID -(or group's AFS GID) in ACL entries, rather than the name. In the -following example, user terry has an ACL entry for the group -terry:friends (AFS GID -567) on her home directory in the ABC -Corporation cell, and then removes the group from the Protection -Database. -

       % fs listacl /afs/abc.com/usr/terry
    -   Access list for /afs/abc.com/usr/terry is
    -   Normal permissions:
    -     terry:friends rlik
    -     system:anyuser l
    -     terry rlidwka
    -   % pts delete terry:friends
    -   % fs listacl /afs/abc.com/usr/terry
    -   Access list for /afs/abc.com/usr/terry is
    -   Normal permissions:
    -     -567 rlik
    -     system:anyuser l
    -     terry rlidwka
    -
    -

    Leaving AFS IDs on ACLs serves no function, because the ID no longer -corresponds to an active user or group. Furthermore, if the ID is ever -assigned to a new user or group, then the new possessor of the ID gains access -that the owner of the directory actually intended for the previous -possessor. (Reusing AFS IDs is not recommended precisely for this -reason.) -

    To remove obsolete AFS UIDs from ACLs, use the fs cleanacl -command. - - -

    To clean obsolete AFS IDs from an ACL

    -
      -

    1. Verify that you have the a (administer) permission -on each directory for which you are cleaning the ACL. If necessary, -issue the fs listacl command, which is fully described in Displaying ACLs. -
         % fs listacl [<dir/file path>]
      -
      -

    2. Issue the fs cleanacl command to remove entries for obsolete -AFS IDs. -
         % fs cleanacl [<dir/file path>+]
      -
      -

      where -

      -

      cl -
      Is the shortest acceptable abbreviation of cleanacl. -

      dir/file path -
      Names each directory for which to clean the ACL. If this argument -names a file, its directory's ACL is cleaned. Omit this argument -to clean the current working directory's ACL. -

      Specify the read/write path to each directory, to avoid the failure that -results when you attempt to change a read-only volume. By convention, -you indicate the read/write path by placing a period before the cell name at -the pathname's second level (for example, -/afs/.abc.com). For further discussion of the -concept of read/write and read-only paths through the filespace, see The Rules of Mount Point Traversal. -

      You can also use the following notation on its own or as part of a -pathname: -

      -

      . -
      (A single period). If used by itself, cleans the current working -directory's ACL. -

      .. -
      (Two periods). If used by itself, cleans the ACL on the current -working directory's parent directory. -

      * -
      (The asterisk). Cleans the ACL of each of the subdirectories in the -current working directory. However, if you use the asterisk and there -are obsolete AFS IDs on any directory's ACL, the following error message -appears for every file in the directory: -
         fs: 'filename': Not a directory
      -
      -
      -
      -
    -

    If there are obsolete AFS IDs on a directory, the command interpreter -displays its cleaned ACL under the following header. -

       Access list for directory is now
    -
    -

    If a directory's ACL has no obsolete AFS IDs on it, the following -message appears for each. -

       Access list for directory is fine.
    -
    -

    How AFS Interprets the UNIX Mode Bits

    - - - -

    Although AFS uses ACLs to protect file data rather than the mode bits that -UFS uses, it does not ignore the mode bits entirely. When you issue the -chmod command on an AFS file or directory, AFS changes the bits -appropriately. To change a file's mode bits, you must have the AFS -w (write) permission on the ACL of the file's -directory. To change a directory's mode bits, you must have the -d (delete), i (insert), and -l (lookup) permissions on its ACL. -

    AFS also uses the UNIX mode bits as follows: -

      -

    • It uses the initial bit to determine the element's type. This -is the bit that appears first in the output from the ls -l command -and shows the hyphen (-) for a file or the letter d for -a directory. -

    • It does not use any of the mode bits on a directory. -

    • For a file, the first (owner) set of bits interacts with the ACL entries -that apply to the file in the following way: -
        -

      • If the first r mode bit is not set, no one (including the -owner) can read the file, no matter what permissions they have on the -ACL. If the bit is set, users also need the r -(read) and l permissions on the ACL of the file's -directory to read the file. -

      • If the first w mode bit is not set, no one (including the -owner) can modify the file. If the w bit is set, users also -need the w and l permissions on the ACL of the -file's directory to modify the file. -

      • There is no ACL permission directly corresponding to the x mode -bit, but to execute a file stored in AFS, the user must also have the -r and l permissions on the ACL of the file's -directory. -
      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd021.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd021.htm deleted file mode 100755 index a68808708..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd021.htm +++ /dev/null @@ -1,416 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Managing Administrative Privilege

    -

    This chapter explains how to enable system administrators -and operators to perform privileged AFS operations. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - - - - - -
    Display members of system:administrators group -pts membership -
    Add user to system:administrators group -pts adduser -
    Remove user from system:administrators group -pts removeuser -
    Display ADMIN flag in Authentication Database entry -kas examine -
    Set or remove ADMIN flag on Authentication Database entry -kas setfields -
    Display users in UserList file -bos listusers -
    Add user to UserList file -bos adduser -
    Remove user from UserList file -bos removeuser -
    -


    An Overview of Administrative Privilege

    - - -

    A fully privileged AFS system administrator has the following -characteristics: -

    -

    This section describes the three privileges and explains why more than one -privilege is necessary. -
    Note:Never grant any administrative privilege to the user anonymous, -even when a server outage makes it impossible to mutually authenticate. -If you grant such privilege, then any user who can access a machine in your -cell can issue privileged commands. The alternative solution is to put -the affected server machine into no-authentication mode and use the --noauth flag available on many commands to prevent mutual -authentication attempts. For further discussion, see Managing Authentication and Authorization Requirements. -
    -

    The Reason for Separate Privileges

    -

    Often, a cell's administrators require full -administrative privileges to perform their jobs effectively. However, -separating the three types of privilege makes it possible to grant only the -minimum set of privileges that a given administrator needs to complete his or -her work. -

    The system:administrators group privilege is perhaps the -most basic, and most frequently used during normal operation (when all the -servers are running normally). When the Protection Database is -unavailable due to machine or server outage, it is not possible to issue -commands that require this type of privilege. -

    The ADMIN flag privilege is separate because of the extreme -sensitivity of the information in the Authentication Database, especially the -server encryption key in the afs entry. When the -Authentication Database is unavailable due to machine or server outage, it is -not possible to issue commands that require this type of privilege. -

    The ability to issue privileged bos and vos command -is recorded in the /usr/afs/etc/UserList file on the local disk of -each AFS server machine rather than in a database, so that in case of serious -server or network problems administrators can still log onto server machines -and use those commands while solving the problem. -


    Administering the system:administrators Group

    - - - - - - - -

    The first type of AFS administrative privilege is membership . -Members of the system:administrators group in the Protection -Database have the following privileges: -

      -

    • Permission to issue all pts commands, which are used to -administer the Protection Database. See Administering the Protection Database. -

    • Permission to issue the fs setvol and fs setquota -commands, which set the space quota on volumes as described in Setting and Displaying Volume Quota and Current Size. -

    • Implicit a (administer) and by default l -(lookup) permissions on the access control list (ACL) on every -directory in the cell's AFS filespace. Members of the group can -use the fs setacl command to grant themselves any other permissions -they require, as described in Setting ACL Entries. -

      You can change the ACL permissions that the File Server on a given file -server machine implicitly grants to the members of the -system:administrators group for the data in volumes that it -houses. When you issue the bos create command to create and -start the fs process on the machine, include the --implicit argument to the fileserver initialization -command. For syntax details, see the fileserver reference -page in the AFS Administration Reference. You can grant -additional permissions, or remove the l permission. However, -the File Server always implicitly grants the a permission to -members of the group, even if you set the value of the -implicit -argument to none. -

    - - - - -

    To display the members of the system:administrators group

    -
      -

    1. Issue the pts membership command to display the -system:administrators group's list of members. -Any user can issue this command as long as the first privacy flag on the -system:administrators group's Protection Database entry -is not changed from the default value of uppercase S. -
         % pts membership system:administrators
      -
      -

      where m is the shortest acceptable abbreviation of -membership. -

    -

    To add users to the system:administrators group

    - - - - -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts adduser group to add one or more users. -
         % pts adduser -user <user name>+ -group system:administrators
      -
      -

      where -

      -

      ad -
      Is the shortest acceptable abbreviation of adduser. -

      -user -
      Names each user to add to the system:administrators -group. -
      -
    -

    To remove users from the system:administrators group

    - - - - -
      -

    1. Verify that you belong to the system:administrators -group. If necessary, issue the pts membership command, which -is fully described in To display the members of the system:administrators group. -
         % pts membership system:administrators
      -   
      -
      -

    2. Issue the pts removeuser command to remove one or more -users. -
         % pts removeuser -user <user name>+ -group system:administrators
      -
      -

      where -

      -

      rem -
      Is the shortest acceptable abbreviation of removeuser. -

      -user -
      Names each user to remove from the system:administrators -group. -
      -
    -

    Granting Privilege for kas Commands: the ADMIN Flag

    - -

    Administrators who have the ADMIN flag on their Authentication -Database entry can issue all kas commands, which enable them to -administer the Authentication Database. - - - -

    To check if the ADMIN flag is set

    - - - - -
      -

    1. Issue the kas examine command to display an entry -from the Authentication Database. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UFS) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin_username argument (here -abbreviated to -admin) to name a user identity that has the -ADMIN flag on its Authentication Database entry. -

         % kas examine <name of user>   \
      -                 -admin  <admin principal to use for authentication>
      -   Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      e -
      Is the shortest acceptable abbreviation of examine. -

      name of user -
      Names the entry to display. -

      -admin -
      Names an administrative account with the ADMIN flag on its -Authentication Database entry, such as the admin account. -The password prompt echoes it as admin_user. Enter the -appropriate password as admin_password. -
      -
    -

    If the ADMIN flag is turned on, it appears on the first line, as -in this example: -

       % kas e terry -admin admin
    -   Administrator's (admin) password: admin_password
    -   User data for terry (ADMIN)
    -     key version is 0, etc...
    -
    - - - - - - -

    To set or remove the ADMIN flag

    -
      -

    1. Issue the kas setfields command to turn on the ADMIN -flag in an Authentication Database entry. -

      The Authentication Server performs its own authentication rather than -accepting your existing AFS token. By default, it authenticates your -local (UNIX) identity, which possibly does not correspond to an AFS-privileged -administrator. Include the -admin argument to name an -identity that has the ADMIN flag on its Authentication Database -entry. To verify that an entry has the flag, issue the kas -examine command as described in To check if the ADMIN flag is set. -

      The following command appears on two lines only for legibility. -

          % kas setfields <name of user>  {ADMIN |  NOADMIN} \  
      -                   -admin <admin principal to use for authentication>  
      -    Administrator's (admin_user) password: admin_password
      -
      -

      where -

      -

      sf -
      Is an alias for setfields (and setf is the shortest -acceptable abbreviation). -

      name of user -
      Names the entry for which to set or remove the ADMIN -flag. -

      ADMIN | NOADMIN -
      Sets or removes the ADMIN flag, respectively. -

      -admin -
      Names an administrative account with the ADMIN flag on its -Authentication Database entry, such as the admin account. -The password prompt echoes it as admin_user. Enter the -appropriate password as admin_password. -
      -
    -

    Administering the UserList File

    - -

    Inclusion in the file /usr/afs/etc/UserList on the local disk of -each AFS server machine enables an administrator to issue commands from the -indicated suites. -

    - - - - - - - - - - -

    Although each AFS server machine maintains a separate copy of the file on -its local disk, it is conventional to keep all copies the same. It can -be confusing for an administrator to have the privilege on some machines but -not others. - -

    If your cell runs the United States edition of AFS and uses the Update -Server to distribute the contents of the system control machine's -/usr/afs/etc directory, then edit only the copy of the -UserList file stored on the system control machine. If you -have forgotten which machine is the system control machine, see The Four Roles for File Server Machines. -

    If your cell runs the international edition of AFS, or does not use a -system control machine, then you must edit the UserList file on -each server machine individually. -

    To avoid making formatting errors that can result in performance problems, -never edit the UserList file directly. Instead, use the -bos adduser or bos removeuser commands as described in -this section. - - - - -

    To display the users in the UserList file

    -
      -

    1. Issue the bos listusers command to display the contents of the -/usr/afs/etc/UserList file. -
         % bos listusers <machine name>
      -
      -

      where -

      -

      listu -
      Is the shortest acceptable abbreviation of listusers. -

      machine name -
      Names an AFS server machine. In the normal case, any machine is -acceptable because the file is the same on all of them. -
      -
    -

    To add users to the UserList file

    - - - - -
      -

    1. Verify you are listed in the /usr/afs/etc/UserList file. -If not, you must have a qualified administrator add you before you can add -entries to it yourself. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos adduser command to add one or more users to the -UserList file. -
         % bos adduser <machine name> <user names>+
      -
      -

      where -

      -

      addu -
      Is the shortest acceptable abbreviation of adduser. -

      machine name -
      Names the system control machine if you use the Update Server to -distribute the contents of the /usr/afs/etc directory (possible -only in cells running the United States edition of AFS). By default, it -can take up to five minutes for the Update Server to distribute the changes, -so newly added users must wait that long before attempting to issue privileged -commands. -

      If you are running the international edition of AFS, or do not use the -Update Server, repeat the command, substituting the name of each AFS server -machine for machine name in turn. -

      user names -
      Specifies the username of each administrator to add to the -UserList file. -
      -
    -

    To remove users from the UserList file

    - - - - -
      -

    1. Verify you are listed in the /usr/afs/etc/UserList file. -If not, you must have a qualified administrator add you before you can remove -entries from it yourself. If necessary, issue the bos -listusers command, which is fully described in To display the users in the UserList file. -
         % bos listusers <machine name>
      -
      -

    2. Issue the bos removeuser command to remove one or more users -from the UserList file. -
         % bos removeuser <machine name> <user names>+
      -
      -

      where -

      -

      removeu -
      Is the shortest acceptable abbreviation of removeuser. -

      machine name -
      Names the system control machine if you use the Update Server to -distribute the contents of the /usr/afs/etc directory (possible -only in cells running the United States edition of AFS). By default, it -can take up to five minutes for the Update Server to distribute the change, so -newly removed users can continue to issue privileged commands during that -time. -

      If you are running the international edition of AFS, or do not use the -Update Server, repeat the command, substituting the name of each AFS server -machine for machine name in turn. -

      user names -
      Specifies the username of each administrator to add to the -UserList file. -
      -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd022.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd022.htm deleted file mode 100755 index 00a2d24c0..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd022.htm +++ /dev/null @@ -1,858 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -

    -


    Appendix A. Managing the NFS/AFS Translator

    - - -

    The NFS(R)/AFS(R) Translator enables users -working on NFS client machines to access, create and remove files stored in -AFS. This chapter assumes familiarity with both NFS and AFS. -


    Summary of Instructions

    -

    This chapter explains how to perform the following tasks by -using the indicated commands: -
    - - - - - -
    Mount directory on translator machine -mount -
    Examine value of @sys variable -fs sysname -
    Enable/disable reexport of AFS, set other parameters -fs exportafs -
    Assign AFS tokens to user on NFS client machine -knfs -
    -


    Overview

    -

    The NFS/AFS Translator enables users on NFS client machines -to access the AFS filespace as if they are working on an AFS client machine, -which facilitates collaboration with other AFS users. -

    An NFS/AFS translator machine (or simply translator -machine) is a machine configured as both an AFS client and an NFS -server: -

      -

    • Its AFS client functionality enables it to access the AFS -filespace. The Cache Manager requests and caches files from AFS file -server machines, and can even maintain tokens for NFS users, if you have made -the configuration changes that enable NFS users to authenticate with -AFS. -

    • Its NFS server functionality makes it possible for the translator machine -to export the AFS filespace to NFS client machines. When a user on an -NFS client machine mounts the translator machine's /afs -directory (or one of its subdirectories, if that feature is enabled), access -to AFS is immediate and transparent. The NFS client machine does not -need to run any AFS software. -
    -

    Enabling Unauthenticated or Authenticated AFS Access

    -

    By configuring the translation environment appropriately, -you can provide either unauthenticated or authenticated access to AFS from NFS -client machines. The sections of this chapter on configuring translator -machines, NFS client machines, and AFS user accounts explain how to configure -the translation environment appropriately. -

      -

    • If you configure the environment for unauthenticated access, the AFS File -Server considers the NFS users to be the user anonymous. -They can access only those AFS files and directories for which the access -control list (ACL) extends the required permissions to the -system:anyuser group. They can issue only those AFS -commands that do not require privilege, and then only if their NFS client -machine is a system type for which AFS binaries are available and accessible -by the system:anyuser group. Such users presumably do -not have AFS accounts. -

    • If you configure the environment for authenticated access, you must create -entries in the AFS Authentication and Protection Databases for the NFS -users. The authentication procedure they use depends on whether the NFS -client machine is a supported system type (one for which AFS binaries are -available): -
        -

      • If AFS binaries are available for the NFS client machine, NFS users can -issue the klog command on the NFS client machine. They can -access the filespace and issue AFS commands to the same extent as -authenticated users working on AFS client machines. -

      • If AFS binaries are not available for the NFS client machine, NFS users -must establish a connection with the translator machine (using the -telnet utility, for example) and then issue the klog and -knfs commands on the translator machine to make its Cache Manager -use the tokens correctly while users work on the NFS client. They can -access the AFS filespace as authenticated users, but cannot issue AFS -commands. For instructions, see Authenticating on Unsupported NFS Client Machines. -
      -
    -

    Setting the AFSSERVER and AFSCONF Environment Variables

    -

    If you wish to enable your NFS users to issue AFS commands, -you must define the AFSSERVER and AFSCONF environment variables in their -command shell. This section explains the variables' function and -outlines the various methods for setting them. -

    Issuing AFS commands also requires that the NFS client machine is a -supported system type (one for which AFS binaries are available and -accessible). Users working on NFS client machines of unsupported system -types can access AFS as authenticated users, but they cannot issue AFS -commands. It is not necessary to define the AFSSERVER and AFSCONF -variables for such users. For instructions on using the knfs -command to obtain authenticated access on unsupported system types, see Authenticating on Unsupported NFS Client Machines. - -

    The AFSSERVER Variable

    -

    The AFSSERVER variable designates the AFS client machine -that performs two functions for NFS clients: -

      -

    • It acts as the NFS client's remote executor by executing -AFS-specific system calls on its behalf, such as those invoked by the -klog and tokens commands and by many commands in the AFS -suites. -

    • Its stores the tokens that NFS users obtain when they authenticate with -AFS. This implies that the remote executor machine and the translator -machine must be the same if the user needs authenticated access to AFS. -
    -

    The choice of remote executor most directly affects commands that display -or change Cache Manager configuration, such as the fs -getcacheparms, fs getcellstatus, and fs setcell -commands. When issued on an NFS client, these commands affect the Cache -Manager on the designated remote executor machine. (Note, however, that -several such commands require the issuer to be logged into the remote -executor's local file system as the local superuser -root. The ability of NFS client users to log in as -root is controlled by NFS, not by the NFS/AFS Translator, so -setting the remote executor properly does not necessarily enable users on the -NFS client to issue such commands.) -

    The choice of remote executor is also relevant for AFS commands that do not -concern Cache Manager configuration but rather have the same result on every -machine, such as the fs commands that display or set ACLs and -volume quota. These commands take an AFS path as one of their -arguments. If the Cache Manager on the remote executor machine mounts -the AFS filespace at the /afs directory, as is conventional for AFS -clients, then the pathname specified on the NFS client must begin with the -string /afs for the Cache Manager to understand it. This -implies that the remote executor must be the NFS client's primary -translator machine (the one whose /afs directory is mounted at -/afs on the NFS client). - - -

    The AFSCONF Variable

    -

    The AFSCONF environment variable names the directory that houses the -ThisCell and CellServDB files to use when running AFS -commands issued on the NFS client machine. As on an AFS client, these -files determine the default cell for command execution. -

    For predictable performance, it is best that the files in the directory -named by the AFSCONF variable match those in the /usr/vice/etc -directory on the translator machine. If your cell has an AFS directory -that serves as the central update source for files in the -/usr/vice/etc directory, it is simplest to set the AFSCONF variable -to refer to it. In the conventional configuration, this directory is -called /afs/cellname/common/etc. -

    Setting Values for the Variables

    -

    To learn the values of the AFSSERVER and AFSCONF variables, AFS command -interpreters consult the following three sources in sequence: -

      -

    1. The current command shell's environment variable definitions -

    2. The .AFSSERVER or .AFSCONF file in the -issuer's home directory -

    3. The /.AFSSERVER or /.AFSCONF file in -the NFS client machine's root (/) directory. If the -client machine is diskless, its root directory can reside on an NFS server -machine. -
    -

    (Actually, before consulting these sources, the NFS client looks for the -CellServDB and ThisCell files in its own -/usr/vice/etc directory. If the directory exists, the NFS -client does not use the value of the AFSCONF variable. However, the -/usr/vice/etc directory usually exists only on AFS clients, not NFS -clients.) -

    As previously detailed, correct performance generally requires that the -remote executor machine be the NFS client's primary translator machine -(the one whose /afs directory is mounted at the /afs -directory on the NFS client). The requirement holds for all users -accessing AFS from the NFS client, so it is usually simplest to create the -.AFSSERVER file in the NFS client's root -directory. The main reason to create the file in a user's home -directory or to set the AFSSERVER environment variable in the current command -shell is that the user needs to switch to a different translator machine, -perhaps because the original one has become inaccessible. -

    Similarly, it generally makes sense to create the -.AFSCONF file in the NFS client's root -directory. Creating it in the user's home directory or setting the -AFSCONF environment variable in the current command shell is useful mostly -when there is a reason to specify a different set of database server machines -for the cell, perhaps in a testing situation. -

    Delayed Writes for Files Saved on NFS Client Machines

    - - - - - - - -

    When an application running on an AFS client machine issues the -close or fsync system call on a file, the Cache Manager -by default performs a synchronous write of the data to the File Server. -(For further discussion, see AFS Implements Save on Close and Enabling Asynchronous Writes.) -

    To avoid degrading performance for the AFS users working on a translator -machine, AFS does not perform synchronous writes for applications running on -the translator machine's NFS clients. Instead, one of the Cache -Manager daemons (the maintenance daemon) checks every 60 seconds -for chunks in the cache that contain data saved on NFS clients, and writes -their contents to the File Server. This does not guarantee that data -saved on NFS clients is written to the File Server within 60 seconds, but only -that the maintenance daemon checks for and begins the write of data at that -interval. -

    Furthermore, AFS always ignores the fsync system call as issued -on an NFS client. The call requires an immediate and possibly -time-consuming response from the File Server, which potentially causes delays -for other AFS clients of the File Server. NFS version 3 automatically -issues the fsync system call directly after the close -call, but the Cache Manager ignores it and handles the operation just like a -regular close. -

    The delayed write mechanism means that there is usually a delay between the -time when an NFS application issues the close or fsync -system call on a file and the time when the changes are recorded at the File -Server, which is when they become visible to users working on other AFS client -machines (either directly or on its NFS clients). The delay is likely -to be longer than for files saved by users working directly on an AFS client -machine. -

    The exact amount of delay is difficult to predict. The NFS protocol -itself allows a standard delay before saved data must be transferred from the -NFS client to the NFS server (the translator machine). The modified -data remains in the translator machine's AFS client cache until the -maintenance daemon's next scheduled check for such data, and it takes -additional time to transfer the data to the File Server. The -maintenance daemon uses a single thread, so there can be additional delay if -it takes more than 60 seconds to write out all of the modified NFS -data. That is, if the maintenance daemon is still writing data at the -time of the next scheduled check, it cannot notice any additional modified -data until the scheduled time after it completes the long write -operation. -

    The Cache Manager's response to the write system call is -the same whether it is issued on an AFS client machine or on an NFS client of -a translator machine: it records the modifications in the local AFS -client cache only. -


    Configuring NFS/AFS Translator Machines

    -

    To act as an NFS/AFS translator machine, a machine must -configured as follows: -

      -

    • It must be an AFS client. Many system types supported as AFS -clients can be translator machines. To learn about possible -restrictions in a specific release of AFS, see the AFS Release -Notes. -

    • It must be an NFS server. The appropriate number of NFS server -daemons (nfsd and others) depends on the anticipated NFS client -load. -

    • It must export the local directory on which the AFS filespace is mounted, -/afs by convention. -
    -

    If users on a translator machine's NFS clients are to issue AFS -commands, the translator machine must also meet the requirements discussed in Configuring the Translator Machine to Accept AFS Commands. -

    Loading NFS and AFS Kernel Extensions

    -

    The AFS distribution for system types that can act as NFS/AFS -Translator machines usually includes two versions of the AFS kernel extensions -file, one for machines where the kernel supports NFS server functionality, and -one for machines not using NFS (the latter AFS kernel extensions file -generally has the string nonfs in its name). A translator -machine must use the NFS-enabled version of the AFS extensions file. On -some system types, you select the appropriate file by moving it to a certain -location, whereas on other system types you set a variable that results in -automatic selection of the correct file. See the instructions in the -AFS Quick Beginnings for incorporating AFS into the kernel on each -system type. -

    On many system types, NFS is included in the kernel by default, so it is -not necessary to load NFS kernel extensions explicitly. On system types -where you must load NFS extensions, then in general you must load them before -loading the AFS kernel extensions. The AFS Quick Beginnings -describes how to incorporate the AFS initialization script into a -machine's startup sequence so that it is ordered correctly with respect -to the script that handles NFS. -

    In addition, the AFS extensions must be loaded into the kernel before the -afsd command runs. The AFS initialization script included in -the AFS distribution correctly orders the loading and afsd -commands. -

    Configuring the Translator Machine to Accept AFS Commands

    -

    For users working on a translator machine's NFS -clients to issue AFS commands, the -rmtsys flag must be included on -the afsd command which initializes the translator machine's -Cache Manager. The flag starts an additional daemon (the remote -executor daemon), which executes AFS-specific system calls on behalf of -NFS clients. For a discussion of the implications of NFS users issuing -AFS commands, see Setting the AFSSERVER and AFSCONF Environment Variables. -

    The instructions in the AFS Quick Beginnings for configuring the -Cache Manager explain how to add options such as the -rmtsys flag -to the afsd command in the AFS initialization script. On -many system types, it is simplest to list the flag on the line in the script -that defines the OPTIONS variable. The remote executor daemon does not -consume many resources, so it is simplest to add it to the afsd -command on every translator machine, even if not all users on the -machine's NFS clients issue AFS commands. -

    Controlling Optional Translator Features

    -

    After an AFS client machine is configured as a translator -machine, it by default exports the AFS filespace to NFS clients. You -can disable and reenable translator functionality by using the fs -exportafs command's -start argument. The -command's other arguments control other aspects of translator -behavior. -

      -

    • The -convert argument controls whether the second and third -(group and other) sets of UNIX mode bits on an AFS file -or directory being exported to NFS are set to match the first -(owner) mode bits. By default, the mode bits are set to -match. -

      Unlike AFS, NFS uses all three sets of mode bits when determining whether a -user can read or write a file, even one stored in AFS. Some AFS files -possibly do not have any group and other mode bits -turned on, because AFS uses only the owner bits in combination with -the ACL on the file's directory. If only the owner mode -bits are set, NFS allows only the file's owner of the file to read or -write it. Setting the -convert argument to the value -on enables other users to access the file in the same manner as the -owner. Setting the value off preserves the mode bits set on -the file as stored in AFS. -

    • The -uidcheck argument controls whether tokens can be assigned -to an NFS user whose local UID on the NFS client machine differs from the -local UID associated with the tokens on the translator machine. By -default, this is possible. -

      If you turn on UID checking by setting the value on, then tokens -can be assigned only to an NFS user whose local UID matches the local UID of -the process on the translator machine that is assigning the tokens. One -consequence is that there is no point in including the -id argument -to the knfs command: the only acceptable value is the local -UID of the command's issuer, which is the value used when the --id argument is omitted. Requiring matching UIDs in this way -is effective only when users have the same local UID on the translator machine -as on NFS client machines. In that case, it guarantees that users -assign their tokens only to their own NFS sessions. For instructions, -see Authenticating on Unsupported NFS Client Machines. -
      Note:Turning on UID checking also prevents users on supported NFS clients from -using the klog command to authenticate on the NFS client -directly. They must authenticated and use the knfs command -on the translator machine instead. This is because after the -klog command interpreter obtains the token on the NFS client, it -passes it to the Cache Manager's remote executor daemon, which makes the -system call that stores the token in a credential structure on the translator -machine. The remote executor generally runs as the local superuser -root, so in most cases its local UID (normally zero) does not match -the local UID of the user who issued the klog command on the NFS -client machine. -

      On the other hand, although using the knfs command instead of -the klog command is possibly less convenient for users, it -eliminates a security exposure: the klog command interpreter -passes the token across the network to the remote executor daemon in clear -text mode. -

      -

      If you disable UID checking by assigning the value off , the -issuer of the knfs command can assign tokens to a user who has a -different local UID on the NFS client machine, such as the local superuser -root. Indeed, more than one issuer of the knfs -command can assign tokens to the same user on the NFS client machine. -Each time a different user issues the knfs command with the same -value for the -id argument, that user's tokens overwrite the -existing ones. This can result in unpredictable access for the NFS -user. -

    • The -submounts argument controls whether users on the NFS -client can mount AFS directories other than the top-level /afs -directory. By default, the translator does not permit these -submounts. -

      Submounts can be useful in a couple of circumstances. If, for -example, NFS users need to access their own AFS home directories only, then -creating a submount to it eliminates the need for them to know or enter the -complete path. Similarly, you can use a submount to prevent users from -accessing parts of the filespace higher in the AFS hierarchy than the -submount. -

    -

    To configure an NFS/AFS translator machine

    -

    The following instructions configure the translator to enable users to -issue AFS commands. Omit Step 6 if you do not want to enable this functionality. -

      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Configure the NFS/AFS translator machine as an NFS server, if it is not -already. Follow the instructions provided by your NFS supplier. -The appropriate number of NFS server daemons (such as nfsd) depends -on the number of potential NFS clients. -

    3. Configure the NFS/AFS translator machine as an AFS client, if it is not -already. For the most predictable performance, the translator -machine's local copies of the /usr/vice/etc/CellServDB and -/usr/vice/etc/ThisCell files must be the same as on other client -machines in the cell. -

    4. Modify the file that controls mounting of directories -on the machine by remote NFS clients. -
        - - -

      • On systems that use the /etc/exports file, edit it to enable -export of the /afs directory to NFS clients. You can list -the names of specific NFS client machines if you want to provide access only -to certain users. For a description of the file's format, see the -NFS manual page for exports(5). -

        The following example enables any NFS client machine to mount the -machine's /afs, /usr, and /usr2 -directories: -

           /afs
        -   /usr
        -   /usr2
        -
        - - -

      • On system types that use the share command, edit the -/etc/dfs/dfstab file or equivalent to include share -instructions that enable remote mounts of the /afs -directory. Most distributions include the binary as -/usr/sbin/share. The following example commands enable -remote mounts of the root ( / ) and /afs -directories. To verify the correct syntax, consult the manual page for -the share command. -
           share -F nfs -o rw -d "root" /
        -   share -F nfs -o rw -d "afs gateway" /afs
        -
        -
      -

    5. Edit the machine's AFS initialization file to invoke the standard -UNIX exportfs command after the afsd program -runs. On some system types, the modifications you made in Step 4 are not enough to enable exporting the AFS filespace -via the /afs directory, because the resulting configuration changes -are made before the afsd program runs during machine -initialization. Only after the afsd program runs does the -/afs directory become the mount point for the entire AFS -filespace; before, it is a local directory like any other. -

    6. Modify the afsd command in the AFS initialization -file to include the -rmtsys flag. -

      For system types other than IRIX, the instructions in the AFS Quick -Beginnings for configuring the Cache Manager explain how to add the --rmtsys flag, for example by adding it to the line in the script -that defines the value for the OPTIONS variable. -

      On IRIX systems, the AFS initialization script automatically adds the --rmtsys flag if you have activated the afsxnfs -configuration variable as instructed in the AFS Quick Beginnings -instructions for incorporating AFS extensions into the kernel. If the -variable is not already activated, issue the following command. -

         
      -   # /etc/chkconfig  -f  afsxnfs  on
      -
      -

    7. (Optional) Depending on the number of NFS clients you expect -this machine to serve, it can be beneficial to add other arguments to the -afsd command in the machine's initialization file, such as the --daemons argument to set the number of background daemons. -See Administering Client Machines and the Cache Manager and the afsd reference page in the AFS -Administration Reference. -

    8. Reboot the machine. On many system types, the appropriate command -is shutdown; consult your operating system -administrator's guide. -
         # shutdown appropriate_options
      -
      -
    - - -

    To disable or enable Translator functionality, or set optional features

    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Issue the fs exportafs command. -
         # fs exportafs nfs [-start {on | off}} ]  [-convert {on | off}]   
      -                      [-uidcheck {on | off}]   [-submounts {on | off}] 
      -
      -
      -

      -start -
      Disables translator functionality if the value is off or -reenables it if the value is on. Omit this argument to -display the current setting of all parameters set by this command. -

      -convert -
      Controls the setting of the second and third (group and -other) sets of UNIX mode bits on AFS files and directories as -exported to NFS clients If the value is on, they are set to match -the owner mode bits. If the value is off, the -bits are not changed. If this argument is omitted, the default value is -on. -

      -uidcheck -
      Controls whether issuers of the knfs command can specify a -value for its -id argument that does not match their AFS UID: -
        -

      • If the value is on, the value of the -id argument -must match the issuer's local UID. -

      • If the value is off, the issuer of the knfs command -can use the -id argument to assign tokens to a user who has a -different local UID on the NFS client machine, such as the local superuser -root. -
      -

      If this argument is omitted, the default value is off. -

      -submounts -
      Controls whether the translator services an NFS mount of any directory in -the AFS filespace other than the top-level /afs directory. -If the value is on, such submounts are allowed. If the value -is off, only mounts of the /afs directory are allowed. If -this argument is omitted, the default value is off. -
      -
    -

    Configuring NFS Client Machines

    -

    Any NFS client machine that meets the following requirements -can access files in AFS via the NFS/AFS Translator. It does not need to -be configured as an AFS client machine. -

      -

    • It must NFS-mount a translator machine's /afs directory on -a local directory, which by convention is also called /afs. -The following instructions explain how to add the mount command to -the NFS client machine's /etc/fstab file or equivalent. -

      -

      The directory on which an NFS client mounts the translator's -machine's /afs directory can be called something other than -/afs. For instance, to make it easy to switch to another -translator machine if the original one becomes inaccessible, you can mount -more than one translator machine's /afs directory. Name -the mount /afs for the translator machine that you normally use, -and use a different name the mount to each alternate translator -machine. -

      Mounting the AFS filespace on a directory other than /afs -introduces another requirement, however: when issuing a command that -takes an AFS pathname argument, you must specify the full pathname, starting -with /afs, rather than a relative pathname. Suppose, for -example, that a translator machine's AFS filespace is mounted at -/afs2 on an NFS client machine and you issue the following command -to display the ACL on the current working directory, which is in AFS: -

         % fs listacl .
      -
      -

      The fs command interpreter on the NFS client must construct a -full pathname before passing the request to the Cache Manager on the -translator machine. The AFS filespace is mounted at /afs2, -so the full pathname starts with that string. However, the Cache -Manager on the translator cannot find a directory called /afs2, -because its mount of the AFS filespace is called /afs. The -command fails. To prevent the failure, provide the file's complete -pathname, starting with the string /afs. -

    • It must run an appropriate number of NFS client biod daemons, -which improve performance by handling pre-reading and delayed writing. -Most NFS vendors recommend running four such daemons, and most NFS -initialization scripts start them automatically. Consult your NFS -documentation. -
    -

    To enable users to issue AFS commands, the NFS client machine must also be -a supported system type (one for which AFS binaries are available) and able to -access the AFS command binaries. The AFS Release Notes list -the supported system types in each release. -

    In addition, the AFSSERVER and AFSCONF environment variables must be set -appropriately, as discussed in Setting the AFSSERVER and AFSCONF Environment Variables. -

    To configure an NFS client machine to access AFS

    -
    Note:The following instructions enable NFS users to issue AFS commands. -Omit Step 5 and Step 6 if you do not want to enable this -functionality. -
    -
      -

    1. Become the local superuser root on the machine, if you are not -already, by issuing the su command. -
         % su root
      -   Password: root_password
      -
      -

    2. Configure the machine as an NFS client machine, if it is not -already. Follow the instructions provided by your NFS vendor. -The number of NFS client (biod) daemons needs to be appropriate for -the expected load on this machine. The usual recommended number is -four. -

    3. Create a directory called /afs on the machine, if one does not -already exist, to act as the mount point for the translator machine's -/afs directory. It is acceptable to use other names, but -doing so introduces the limitation discussed in the introduction to this -section. -
         # mkdir /afs
      -
      - - -

    4. Modify the machine's file systems registry file -(/etc/fstab or equivalent) to include a command that mounts a -translator machine's /afs directory. To verify the -correct syntax of the mount command, see the operating -system's mount(5) manual page. The following example -includes options that are appropriate on many system types. -
         mount -o hard,intr,timeo=300  translator_machine:/afs /afs
      -
      -

      where -

      -

      hard -
      Indicates that the NFS client retries NFS requests until the NFS server -(translator machine) responds. When using the translator, file -operations possibly take longer than with NFS alone, because they must also -pass through the AFS Cache Manager. With a soft mount, a delayed -response from the translator machine can cause the request to abort. -Many NFS versions use hard mounts by default; if your version does not, -it is best to add this option. -

      intr -
      Enables the user to use a keyboard interrupt signal (such as -<Ctrl-c>) to break the mount when the translator machine is -inaccessible. Include this option only if the hard option is -used, in which case the connection does not automatically break off when a -translator machine goes down. -

      timeo -
      Sets the maximum time (in tenths of seconds) the translator can take to -respond to the NFS client's request before the client considers the -request timed out. With a hard mount, setting this option to a high -number like 300 reduces the number of error messages like the following, which -are generated when the translator does not respond immediately. -
         NFS server translator is not responding, still trying
      -
      -

      -

      With a soft mount, it reduces the number of actual errors returned on -timed-out requests. -

      translator_machine -
      Specifies the fully-qualified hostname of the translator machine whose -/afs directory is to be mounted on the client machine's -/afs directory. -
      -
      Note:To mount the translator machine's /afs directory onto a -directory on the NFS client other than /afs, substitute the -alternate directory name for the second instance of /afs in the -mount command. -
      -

    5. (Optional) If appropriate, create the -/.AFSSERVER file to set the AFSSERVER environment variable -for all of the machine's users. For a discussion, see Setting the AFSSERVER and AFSCONF Environment Variables. Place a single line in the file, specifying the -fully-qualified hostname of the translator machine that is to serve as the -remote executor. To enable users to issue commands that handle tokens, -it must be the machine named as translator_machine in Step 4. -

    6. (Optional) If appropriate, create the -/.AFSCONF file to set the AFSCONF environment variable for -all of the machine's users. For a discussion, see Setting the AFSSERVER and AFSCONF Environment Variables. Place a single line in the file, specifying the name -of the directory where the CellServDB and ThisCell files -reside. If you use a central update source for these files (by -convention, /afs/cellname/common/etc), name it -here. -
    -

    Configuring User Accounts

    -

    There are no requirements for NFS users to access AFS as -unauthenticated users. To take advantage of more AFS functionality, -however, they must meet the indicated requirements. -

      -

    • To access AFS as authenticated users, they must of course authenticate -with AFS, which requires an entry in the Protection and Authentication -Databases. -

    • To create and store files, they need the required ACL permissions. -If you are providing a home directory for storage of personal files, it is -conventional to create a dedicated volume and mount it at the user's home -directory location in the AFS filespace. -

    • To issue AFS commands, they must meet several additional -requirements: -
        -

      • They must be working on an NFS client machine of a supported system type -and from which the AFS command binaries are accessible. -

      • Their command shell must define values for the AFSSERVER and AFSCONF -environment variables, as described in Setting the AFSSERVER and AFSCONF Environment Variables. It is often simplest to define the variables by -creating /.AFSSERVER and /.AFSCONF file in -the NFS client machine's root directory, but you can also either set the -variables in each user's shell initialization file -(.cshrc or equivalent), or create files called -.AFSSERVER and .AFSCONF in each -user's home directory. -

      • They must have an entry in the AFS Protection and Authentication -Databases, so that they can authenticate if the command requires AFS -privilege. Other commands instead require assuming the local -root identity on the translator machine; for further -discussion, see The AFSSERVER Variable. -

      • Their PATH environment variable must include the pathname to the -appropriate AFS binaries. If a user works on NFS client machines of -different system types, include the @sys variable in the pathname -rather than an actual system type name. -
      -
    -

    To configure a user account for issuing AFS commands

    -
      -

    1. Create entries for the user in the Protection and Authentication -Databases, or create a complete AFS account. See the instructions for -account creation in Creating and Deleting User Accounts with the uss Command Suite or Administering User Accounts. -

    2. Modify the user's PATH environment variable to include the -pathname of AFS binaries, such as -/afs/cellname/sysname/usr/afsws/bin. -If the user works on NFS client machines of different system types, -considering replacing the specific sysname value with the -@sys variable. The PATH variable is commonly defined in a -login or shell initialization file (such as the .login or -.cshrc file). -

    3. (Optional) Set the AFSSERVER and AFSCONF environment variables -if appropriate. This is required if the NFS client machines on which -the user works do not have the /.AFSSERVER and -/.AFSCONF files in their root directories, or if you want -user-specific values to override those settings. -

      Either define the variables in the user's login or shell -initialization file, or create the files .AFSSERVER and -.AFSCONF files in the user's home directory. -

      For the AFSSERVER variable, specify the fully-qualified hostname of the -translator machine that is to serve as the remote executor. For the -AFSCONF variable, specify the name of the directory where the -CellServDB and ThisCell files reside. If you use -a central update source for these files (by convention, -/afs/cellname/common/etc), name it here. -

    4. If the pathname you defined in Step 2 includes the @sys variable, instruct users to -check that their system name is defined correctly before they issue AFS -commands. They issue the following command: -
         % fs sysname
      -
      -
    -

    Authenticating on Unsupported NFS Client Machines

    -

    The knfs command enables users to authenticate -with AFS when they are working on NFS clients of unsupported system types -(those for which AFS binaries are not available). This enables such -users to access the AFS file tree to the same extent as any other AFS -user. They cannot, however, issue AFS commands, which is possible only -on NFS client machines of supported system types. -

    To authenticate on an unsupported system type, establish a connection to -the translator machine (using a facility such as telnet), and issue -the klog command to obtain tokens for all the cells you wish to -contact during the upcoming NFS session. Then issue the knfs -command, which stores the tokens in a credential structure associated with -your NFS session. The Cache Manager uses the tokens when performing AFS -access requests that originate from your NFS session. -

    More specifically, the credential structure is identified by a process -authentication group (PAG) number associated with a particular local UID on a -specific NFS client machine. By default, the NFS UID recorded in the -credential structure is the same as your local UID on the translator -machine. You can include the -id argument to specify an -alternate NFS UID, unless the translator machine's administrator has used -the fs exportafs command's -uidcheck argument to -enable UID checking. In that case, the value of the -id -argument must match your local UID on the translator machine (so there is not -point to including the -id argument). Enforcing matching -UIDs prevents someone else from placing their tokens in your credential -structure, either accidentally or on purpose. However, it means that -your cell's administrators must set your local UID on the NFS client to -match your local UID on the translator machine. It also makes it -impossible to authenticate by issuing the klog command on supported -NFS clients, meaning that all NFS users must use the knfs -command. See Controlling Optional Translator Features. -

    After issuing the knfs command, you can begin working on the NFS -client with authenticated access to AFS. When you are finished working, -it is a good policy to destroy your tokens by issuing the knfs -command on the translator machine again, this time with the -unlog -flag. This is simpler if you have left the connection to the translator -machine open, but you can always establish a new connection if you closed the -original one. -

    If your NFS client machine is a supported system type and you wish to issue -AFS commands on it, include the -sysname argument to the -knfs command. The remote executor daemon on the translator -machine substitutes its value for the @sys variable in pathnames -when executing AFS commands that you issue on the NFS client machine. -If your PATH environment variable uses the @sys variable in the -pathnames for directories that house AFS binaries (as recommended), then -setting this argument enables the remote executor daemon to access the AFS -binaries appropriate for your NFS client machine even if its system type -differs from the translator machine's. -

    If you do not issue the knfs command (or the klog -command on the NFS client machine itself, if it is a supported system type), -then you are not authenticated with AFS. For a description of -unauthenticated access, see Enabling Unauthenticated or Authenticated AFS Access. - - -

    To authenticate using the knfs command

    -
      -

    1. Log on to the relevant translator machine, either on the console or -remotely by using a program such as telnet. -

    2. Obtain tokens for every cell you wish to access while working on the NFS -client. AFS-modified login utilities acquire a token for the translator -machine's local cell by default; use klog command to -obtain tokens for other cells if desired. -

    3. Issue the knfs command to create a credential structure in the -translator machine's kernel memory for storing the tokens obtained in the -previous step. Include the -id argument to associate the -structure with a UID on the NFS client that differs from your local UID on the -translator machine. This is possible unless the translator -machine's administrator has enabled UID checking on the translator -machine; see Controlling Optional Translator Features. If the NFS client machine is a supported system type -and you wish to issue AFS commands on it, include the -sysname -argument to specify its system type. -
         % knfs -host <host name>  [-id <user ID (decimal)>]  [-sysname  <host's '@sys' value>]
      -
      -

      where -

      -

      -host -
      Specifies the fully-qualified hostname of the NFS client machine on which -you are working. -

      -id -
      Specifies a local UID number on the NFS client machine with which to -associate the tokens, if different from your local UID on the translator -machine. If this argument is omitted, the tokens are associated with an -NFS UID that matches your local UID on the translator machine. In both -cases, the NFS client software marks your AFS access requests with the NFS UID -when it forwards them to the Cache Manager on the translator machine. -

      -sysname -
      Specifies the value that the local machine's remote executor daemon -substitutes for the @sys variable in pathnames when executing AFS -commands issued on the NFS client machine (which must be a supported system -type). -
      -

      The following error message indicates that the translator machine's -administrator has enabled UID checking and you have provided a value that -differs from your local UID on the translator machine. -

         
      -   knfs: Translator in 'passwd sync' mode; remote uid must be the same as local uid
      -
      -

    4. Close the connection to the translator machine (if desired) and work on -the NFS client machine. -
    - -

    To display tokens using the knfs command

    -
      -

    1. Log on to the relevant translator machine, either on the console or -remotely by using a program such as telnet. -

    2. Issue the knfs command with the -tokens flag to -display the tokens associated with either the NFS UID that matches your local -UID on the translator machine or the NFS UID specified by the -id -argument. -
         % knfs -host <host name>  [-id <user ID (decimal)>] -tokens
      -
      -

      where -

      -

      -host -
      Specifies the fully-qualified hostname of the NFS client machine on which -you are working. -

      -id -
      Specifies the local UID on the NFS client machine for which to display -tokens, if different from your local UID on the translator machine. If -this argument is omitted, the tokens are for the NFS UID that matches your -local UID on the translator machine. -

      -tokens -
      Displays the tokens. -
      -

    3. Close the connection to the translator machine if desired. -
    - -

    To discard tokens using the knfs command

    -
      -

    1. If you closed your connection to the translator machine after issuing the -knfs command, reopen it. -

    2. Issue the knfs command with the -unlog flag. -
         % knfs -host  <host name>  [-id <user ID (decimal)>]  -unlog
      -
      -

      where -

      -

      -host -
      Specifies the fully-qualified hostname of the NFS client machine you are -working on. -

      -id -
      Specifies the local UID number on the NFS client machine for which to -discard the associated tokens, if different from your local UID on the -translator machine. If this argument is omitted, the tokens associated -with an NFS UID that matches your local UID on the translator machine are -discarded. -

      -unlog -
      Discards the tokens. -
      -

    3. If desired, close the connection to the translator machine. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd023.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd023.htm deleted file mode 100755 index 658944035..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd023.htm +++ /dev/null @@ -1,370 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Appendix B. Using AFS Commands

    -

    This section describes the components of AFS commands and -how to make entering commands more efficient by using shortened forms. -It has the following sections: -

    -

    AFS Command Syntax -

    Rules for Entering AFS Commands -

    Rules for Using Abbreviations and Aliases -

    Displaying Online Help for AFS Commands -

    -

    AFS Command Syntax

    -

    AFS commands that belong to suites have the following -structure: -

       command_suite operation_code -switch <value>[+]  [-flag]
    -   
    -
    -

    Command Names

    -

    Together, the command_suite and operation_code -make up the command name. -

    The command_suite specifies the group of related commands to -which the command belongs, and indicates which command interpreter and server -process perform the command. AFS has several command suites, including -bos, fs, kas, package, -pts, scout, uss and vos. -Some of these suites have an interactive mode in which the issuer omits the -command_suite portion of the command name. -

    The operation_code tells the command interpreter and server -process which action to perform. Most command suites include several -operation codes. The AFS Administration Reference describes -each operation code in detail, and the AFS Administration Guide -describes how to use them in the context of performing administrative -tasks. -

    Several AFS commands do not belong to a suite and so their names do not -have a command_suite portion. Their structure is otherwise -similar to the commands in the suites. -

    Options

    -

    The term option refers to both arguments and flags, which -are described in the following sections. -

    Arguments

    -

    One or more arguments can follow the command name. Arguments -specify the entities on which to act while performing the command (for -example, which server machine, server process, or file). To minimize -the potential for error, provide a command's arguments in the order -prescribed in its syntax definition. -

    Each argument has two parts, which appear in the indicated order: -

      -

    • The switch specifies the argument's type and is preceded -by a hyphen ( - ). For instance, the switch --server usually indicates that the argument names a server -machine. Switches can often be omitted, subject to the rules outlined -in Conditions for Omitting Switches. -

    • The value names a particular entity of the type specified by -the preceding switch. For example, the proper value for a --server switch is a server machine name like -fs3.abc.com. Unlike switches (which have a -required form), values vary depending on what the issuer wants to -accomplish. Values appear surrounded by angle brackets (< ->) in command descriptions and the online help to show that they are -user-supplied variable information. -
    -

    Some arguments accept multiple values, as indicated by trailing plus sign ( -+ ) in the command descriptions and online help. How many of -a command's arguments take multiple values, and their ordering with -respect to other arguments, determine when it is acceptable to omit -switches. See Conditions for Omitting Switches. -

    Some commands have optional as well as required arguments; the command -descriptions and online help show optional arguments in square brackets ([ -]). -

    Flags

    -

    Some commands have one or more flags, which specify the manner in which -the command interpreter and server process perform the command, or what kind -of output it produces. Flags are preceded by hyphens like switches, but -they take no values. Although the command descriptions and online help -generally list a command's flags after its arguments, there is no -prescribed order for flags. They can appear anywhere on the command -line following the operation code, except in between the parts of an -argument. Flags are always optional. -

    An Example Command

    -

    The following example illustrates the different parts -of a command that belongs to an AFS command suite. -

       % bos getdate -server fs1.abc.com -file ptserver kaserver 
    -   
    -
    -

    where -

      -

    • bos is the command suite. The BOS Server executes most -of the commands in this suite. -

    • getdate is the operation code. It tells the BOS Server -on the specified server machine (in this case -fs1.abc.com) to report the modification dates of -binary files in the local /usr/afs/bin directory. -

    • -server fs1.abc.com is one argument, with --server as the switch and fs1.abc.com as -the value. This argument specifies the server machine on which BOS -Server is to collect and report binary dates. -

    • -file ptserver kaserver is an argument that takes multiple -values. The switch is -file and the values are -ptserver and kaserver. This argument tells the -BOS Server to report the modification dates on the files -/usr/afs/bin/kaserver and /usr/afs/bin/ptserver. -
    -

    Rules for Entering AFS Commands

    -

    Enter each AFS command on a single line (press -<Return> only at the end of the command). Some commands -in this document appear broken across multiple lines, but that is for -legibility only. -

    Use a space to separate each element on a command line from its -neighbors. Spaces rather than commas also separate multiple values of -an argument. -

    In many cases, the issuer of a command can reduce the amount of typing -necessary by using one or both of the following methods: -

      -

    • Omitting switches -

    • Using accepted abbreviations for operation codes, switches (if they are -included at all), and some types of values -
    -

    The following sections explain the conditions for omitting or shortening -parts of the command line. It is always acceptable to type a command in -full, with all of its switches and no abbreviations. -

    Conditions for Omitting Switches

    -

    It is always acceptable to type the switch part of an -argument, but in many cases it is not necessary. Specifically, switches -can be omitted if the following conditions are met. -

      -

    • All of the command's required arguments appear in the order -prescribed by the syntax statement -

    • No switch is provided for any argument -

    • There is only one value for each argument (but note the important -exception discussed in the following paragraph) -
    -

    Omitting switches is possible only because there is a prescribed order for -each command's arguments. When the issuer does not include -switches, the command interpreter relies instead on the order of -arguments; it assumes that the first element after the operation code is -the command's first argument, the next element is the command's -second argument, and so on. The important exception is when a -command's final required argument accepts multiple values. In this -case, the command interpreter assumes that the issuer has correctly provided -one value for each argument up through the final one, so any additional values -at the end belong to the final argument. -

    The following list describes the rules for omitting switches from the -opposite perspective: an argument's switch must be provided when -any of the following conditions apply. -

      -

    • The command's arguments do not appear in the prescribed order -

    • An optional argument is omitted but a subsequent optional argument is -provided -

    • A switch is provided for a preceding argument -

    • More than one value is supplied for a preceding argument (which must take -multiple values, of course); without a switch on the current argument, -the command interpreter assumes that the current argument is another value for -the preceding argument -
    -

    An Example of Omitting Switches

    -

    Consider again the example command from An Example Command. -

       %  bos getdate -server fs1.abc.com -file ptserver kaserver
    -   
    -
    -

    This command has two required arguments: the server machine name -(identified by the -server switch) and binary file name (identified -by the -file switch). The second argument accepts multiple -values. By complying with all three conditions, the issuer can omit the -switches: -

       % bos getdate fs1.abc.com ptserver kaserver
    -   
    -
    -

    Because there are no switches, the bos command interpreter -relies on the order of arguments. It assumes that the first element -following the operation code, fs1.abc.com, is the -server machine name, and that the next argument, ptserver, is a -binary file name. Then, because the command's second (and last) -argument accepts multiple values, the command interpreter correctly interprets -kaserver as an additional value for it. -

    On the other hand, the following is not acceptable because it violates the -first two conditions in Conditions for Omitting Switches: even though there is only one value per argument, the -arguments do not appear in the prescribed order, and a switch is provided for -one argument but not the other. -

       % bos getdate ptserver -server fs1.abc.com
    -   
    -
    -

    Rules for Using Abbreviations and Aliases

    -

    This section explains how to abbreviate operation codes, -option names, server machine names, partition names, and cell names. It -is not possible to abbreviate other types of values. -

    Abbreviating Operation Codes

    -

    It is acceptable to abbreviate an operation code to the shortest form -that still distinguishes it from the other operation codes in its -suite. -

    For example, it is acceptable to shorten bos install to bos -i because there are no other operation codes in the bos -command suite that begin with the letter i. In contrast, -there are several bos operation codes that start with the letter -s, so the abbreviations must be longer to remain unambiguous: -

    -

    bos sa for bos salvage -

    bos seta for bos setauth -

    bos setc for bos setcellname -

    bos setr for bos setrestart -

    bos sh for bos shutdown -

    bos start for bos start -

    bos startu for bos startup -

    bos stat for bos status -

    bos sto for bos stop -

    -

    In addition to abbreviations, some operation codes have an -alias, a short form that is not derived by abbreviating the -operation code to its shortest unambiguous form. For example, the alias -for the fs setacl command is fs sa, whereas the shortest -unambiguous abbreviation is fs seta. -

    There are two usual reasons an operation code has an alias: -

      -

    • Because the command is frequently issued, it is convenient to have a form -shorter than the one derived by abbreviating. The fs setacl -command is an example. -

    • Because the command's name has changed, but users of previous -versions of AFS know the former name. For example, bos -listhosts has the alias bos getcell, its former name. -It is acceptable to abbreviate aliases to their shortest unambiguous form (for -example, bos getcell to bos getc). -
    -

    Even if an operation code has an alias, it is still acceptable to use the -shortest unambiguous form. Thus, the fs setacl command has -three acceptable forms: fs setacl (the full form), fs -seta (the shortest abbreviation), and fs sa (the -alias). -

    Abbreviating Switches and Flags

    -

    It is acceptable to shorten a switch or flag to the shortest form that -distinguishes it from the other switches and flags for its operation -code. It is often possible to omit switches entirely, subject to the -conditions listed in Conditions for Omitting Switches. -

    Abbreviating Server Machine Names

    -

    AFS server machines must have fully-qualified -Internet-style host names (for example, fs1.abc.com), -but it is not always necessary to type the full name on the command -line. AFS commands accept unambiguous shortened forms, but depend on -the cell's name service (such as the Domain Name Service) or a local host -table to resolve a shortened name to the fully-qualified equivalent when the -command is issued. -

    Most commands also accept the dotted decimal form of the machine's IP -address as an identifier. -

    Abbreviating Partition Names

    -

    Partitions that house AFS volumes must have names of -the form /vicepx or /vicepxx, where -the variable final portion is one or two lowercase letters. By -convention, the first server partition created on a file server machine is -called /vicepa, the second /vicepb, and so on. -The AFS Quick Beginnings explains how to configure and name a file -server machine's partitions in preparation for storing AFS volumes on -them. -

    When issuing AFS commands, you can abbreviate a partition name using any of -the following forms: -

       /vicepa     =     vicepa      =      a      =      0
    -   /vicepb     =     vicepb      =      b      =      1
    -   
    -
    -

    After /vicepz (for which the index is 25) comes -

       /vicepaa    =     vicepaa     =      aa     =      26
    -   /vicepab    =     vicepab     =      ab     =      27
    -   
    -
    -

    and so on through -

       /vicepiv    =     vicepiv     =      iv     =      255
    -    
    -
    -

    Abbreviating Cell Names

    -

    A cell's full name usually matches its Internet -domain name (such as stateu.edu for the State University or -abc.com for ABC Corporation). Some AFS commands -accept unambiguous shortened forms, usually with respect to the local -/usr/vice/etc/CellServDB file but sometimes depending on the -ability of the local name service to resolve the corresponding domain -name. -

    Displaying Online Help for AFS Commands

    -

    To display online help for AFS commands that belong to -suites, use the help and apropos operation codes. -A -help flag is also available on every almost every AFS -command. -

    The online help entry for a command consists of two or three lines: -

      -

    • The first line names the command and briefly describes what it does -

    • If the command has aliases, they appear on the next line -

    • The final line, which begins with the string Usage:, -lists the command's options in the prescribed order; online help -entries use the same typographical symbols (brackets and so on) as this -documentation. -
    -

    If no operation code is specified, the help operation code -displays the first line (short description) for every operation code in the -suite: -

       
    -   % command_suite  help
    -   
    -
    -

    If the issuer specifies one or more operation codes, the help -operation code displays each command's complete online entry (short -description, alias if any, and syntax): -

       
    -   % command_suite help operation_code+
    -   
    -
    -

    The -help flag displays a command's syntax but not the -short description or alias: -

       % command_name -help  
    -   
    -
    -

    The apropos operation code displays the short description of any -command in a suite whose operation code or short description includes the -specified keyword: -

       % command_suite apropos "<help
    -string>"
    -   
    -
    -

    The following example command displays the complete online help entry for -the fs setacl command: -

       
    -   % fs help setacl   
    -   fs setacl: set access control list
    -   aliases: sa
    -   Usage: fs setacl -dir <directory>+ -acl <access list entries>+ 
    -   [-clear] [-negative] [-id] [-if] [-help]
    -   
    -
    -

    To see only the syntax statement, use the -help flag: -

       % fs setacl -help
    -   Usage: fs setacl -dir <directory>+ -acl <access list entries>+ 
    -   [-clear] [-negative] [-id] [-if] [-help]
    -   
    -
    -

    In the following example, a user wants to display the quota for her home -volume. She knows that the relevant command belongs to the -fs suite, but cannot remember the operation code. She uses -quota as the keyword: -

       
    -   % fs apropos quota
    -   listquota: list volume quota
    -   quota: show volume quota usage
    -   setquota: set volume quota
    -   
    -
    -

    The following illustrates the error message that results if no command name -or short description contains the keyword: -

       
    -   % fs apropos "list quota"
    -   Sorry, no commands found
    -   
    -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd024.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd024.htm deleted file mode 100755 index fb9799b92..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd024.htm +++ /dev/null @@ -1,1552 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Appendix C. The afsmonitor Program Statistics

    -

    This Appendix lists the statistics you can gather with the -afsmonitor program, grouping them by category and section, and -briefly describing each field, group, and section. For instructions on -using the afsmonitor program, see Monitoring and Auditing AFS Performance - -


    The Cache Manager Statistics

    - -

    Cache Manager statistics fields are classified into the following sections -and groups: -

      -

    • PerfStats_section - Performance Statistics Section. -
        -

      • PerfStats_group - Performance Statistics Group. -

      • misc_group - Miscellaneous Group. -
      -

    • Server_UpDown_section - Server Up/Down Statistics Section. -
        -

      • FS_upDown_SC_group - File Server Up/Down Statistics in Same Cell -Group. -

      • FS_upDown_OC_group - File Server Up/Down Statistics in Other Cells -Group. -

      • VL_upDown_SC_group - VL Server Up/Down Statistics in Same Cell -Group. -

      • VL_upDown_OC_group - VL Server Up/Down Statistics in Other Cells -Group. -
      -

    • RPCop_section - RPC Operation Measurements Section. -
        -

      • FS_RPCopTimes_group - File Server RPC Operation Timings -Group. -

      • FS_RPCopErrors_group - File Server RPC Operation Errors -Group. -

      • FS_RPCopBytes_group - File Server RPC Transfer Timings Group. -

      • CM_RPCopTimes_group - Cache Manager RPC Operation Timings -Group. -
      -

    • Auth_Access_section - Authentication and Replicated File Access -Section. -
        -

      • Auth_Stats_group - Authentication Information for Cache Manager -Group. -

      • Access_Stats_group - Unreplicated File Access Group. -
      -
    -

    All Cache Manager variables categorized under these sections and groups -names are listed below. -

    Performance Statistics Section (PerfStats_section)

    -

    Performance Statistics Group (PerfStats_group) -

      -

    • dlocalAccesses: Number of data accesses to files within local -cell. -

    • vlocalAccesses: Number of stat accesses to files within local -cell. -

    • dremoteAccesses: Number of data accesses to files outside of local -cell. -

    • vremoteAccesses: Number of stat accesses to files outside of local -cell. -

    • cacheNumEntries: Number of cache entries. -

    • cacheBlocksTotal: Number of (1K) blocks configured for cache. -

    • cacheBlocksInUse: Number of cache blocks actively in use. -

    • cacheBlocksOrig: Number of cache blocks at bootup. -

    • cacheMaxDirtyChunks: Maximum number of dirty cache chunks -tolerated. -

    • cacheCurrDirtyChunks: Current number of dirty cache chunks. -

    • dcacheHits: Number of data files found in local cache. -

    • vcacheHits: Number of stat entries found in local cache. -

    • dcacheMisses: Number of data files not found in local -cache. -

    • vcacheMisses: Number of stat entries not found in local -cache. -

    • cacheFlushes: Number of files flushed from cache. -

    • cacheFilesReused: Number of cache files reused. -

    • ProtServerAddr: Address of Protection Server used. -

    • vcacheXAllocs: Additionally allocated vcaches. -

    • bufAlloced: Number of buffers allocated by AFS. -

    • bufHits: Number of pages found on buffer cache. -

    • bufMisses: Number of pages not found on buffer -cache. -

    • bufFlushDirty: Number of cached dirty buffers flushed because all -were busy. -

    • LargeBlocksActive: Number of currently used large free pool -entries. -

    • LargeBlocksAlloced: Number of allocated large free pool -entries. -

    • SmallBlocksActive: Number of currently used small free pool -entries. -

    • SmallBlocksAlloced: Number of allocated used small free pool -entries. -

    • OutStandingMemUsage: Amount of allocated memory. -

    • OutStandingAllocs: Outstanding osi_allocs (no osi_frees yet). -

    • CallBackAlloced: Number of callback structures allocated. -

    • CallBackFlushes: Number of callback flush operations -performed. -

    • srvRecords: Number of servers currently on record. -

    • srvRecordsHWM: Server record high water mark. -

    • srvNumBuckets: Number of server hash chain buckets. -

    • srvMaxChainLength: Maximum server hash chain length. -

    • srvMaxChainLengthHWM: Server hash chain high water mark. -

    • sysName_ID: Sysname ID for host hardware. -
    -

    Miscellaneous Group (misc_group) -

      -

    • numPerfCalls: Number of performance calls received. -

    • epoch: Cache Manager epoch time. -

    • numCellsVisible: Number of cells we know about. -

    • numCellsContacted: Number of cells contacted. -
    -

    Server Up/Down Statistics Section (Server_UpDown_section)

    -

    File Server Up/Down Statistics in Same Cell Group (FS_upDown_SC_group) -

    Note: The records referred to in this section -are the internal records kept by the afsmonitor program to track -the processes from which data is being gathered. -

      -

    • fs_sc_numTtlRecords: Number of fileserver records, active or -inactive. -

    • fs_sc_numUpRecords: Number of (active) fileserver records currently -marked up. -

    • fs_sc_numDownRecords: Number of (active) fileserver records -currently marked down. -

    • fs_sc_sumOfRecordAges: Sum of fileserver record lifetimes. -

    • fs_sc_ageOfYoungestRecord: Age of youngest fileserver record. -

    • fs_sc_ageOfOldestRecord: Age of oldest fileserver record. -

    • fs_sc_numDowntimeIncidents: Number of (completed) downtime -incidents. -

    • fs_sc_numRecordsNeverDown: Number of fileserver records never marked -down. -

    • fs_sc_maxDowntimesInARecord: Maximum downtimes seen by any -fileserver record. -

    • fs_sc_sumOfDowntimes: Sum of all (completed) downtimes, in -seconds. -

    • fs_sc_shortestDowntime: Shortest downtime, in seconds. -

    • fs_sc_longestDowntime: Longest downtime, in seconds. -

    • fs_sc_down_0_10_min: Down time incidents: 0-10 minutes. -

    • fs_sc_down_10_30_min: Down time incidents: 10-30 -minutes. -

    • fs_sc_down_half_1_hr: Down time incidents: 30-60 -minutes. -

    • fs_sc_down_1_2_hr: Down time incidents: 1-2 hours. -

    • fs_sc_down_2_4_hr: Down time incidents: 2-4 hours. -

    • fs_sc_down_4_8_hr: Down time incidents: 4-8 hours. -

    • fs_sc_down_more_8_hr: Down time incidents: more than 8 -hours. -

    • fs_sc_downDst_0: Down time incidents: 0 times. -

    • fs_sc_downDst_1: Down time incidents: 1 time. -

    • fs_sc_downDst_2_5: Down time incidents: 2-5 times. -

    • fs_sc_downDst_6_10: Down time incidents: 6-10 times. -

    • fs_sc_downDst_10_50: Down time incidents: 10-50 times. -

    • fs_sc_downDst_more_50: Down time incidents: more than 50 -times. -
    -

    File Server Up/Down Statistics in Other Cells Group (FS_upDown_OC_group) -

      -

    • fs_oc_numTtlRecords: Number of fileserver records, active or -inactive. -

    • fs_oc_numUpRecords: Number of (active) fileserver records currently -marked up. -

    • fs_oc_numDownRecords: Number of (active) fileserver records -currently marked down. -

    • fs_oc_sumOfRecordAges: Sum of server record lifetimes. -

    • fs_oc_ageOfYoungestRecord: Age of youngest fileserver record. -

    • fs_oc_ageOfOldestRecord: Age of oldest fileserver record. -

    • fs_oc_numDowntimeIncidents: Number of (completed) downtime -incidents. -

    • fs_oc_numRecordsNeverDown: Number of fileserver records never marked -down. -

    • fs_oc_maxDowntimesInARecord: Maximum downtimes seen by any -fileserver. -

    • fs_oc_sumOfDowntimes: Sum of all (completed) downtimes, in -seconds. -

    • fs_oc_shortestDowntime: Shortest downtime, in seconds. -

    • fs_oc_longestDowntime: Longest downtime, in seconds. -

    • fs_oc_down_0_10_min: Down time incidents: 0-10 minutes. -

    • fs_oc_down_10_30_min: Down time incidents: 10-30 -minutes. -

    • fs_oc_down_half_1_hr: Down time incidents: 30-60 -minutes. -

    • fs_oc_down_1_2_hr: Down time incidents: 1-2 hours. -

    • fs_oc_down_2_4_hr: Down time incidents: 2-4 hours. -

    • fs_oc_down_4_8_hr: Down time incidents: 4-8 hours. -

    • fs_oc_down_more_8_hr: Down time incidents: more than 8 -hours. -

    • fs_oc_downDst_0: Down time incidents: 0 times. -

    • fs_oc_downDst_1: Down time incidents: 1 time. -

    • fs_oc_downDst_2_5: Down time incidents: 2-5 times. -

    • fs_oc_downDst_6_10: Down time incidents: 6-10 times. -

    • fs_oc_downDst_10_50: Down time incidents: 10-50 times. -

    • fs_oc_downDst_more_50: Down time incidents: more than 50 -times. -
    -

    VL Server Up/Down Statistics in Same Cell Group (VL_upDown_SC_group) -

      -

    • vl_sc_numTtlRecords: Number of vlserver records, active or -inactive. -

    • vl_sc_numUpRecords: Number of (active) vlserver records currently -marked up. -

    • vl_sc_numDownRecords: Number of (active) vlserver records currently -marked down. -

    • vl_sc_sumOfRecordAges: Sum of vlserver record lifetimes. -

    • vl_sc_ageOfYoungestRecord: Age of youngest vlserver record. -

    • vl_sc_ageOfOldestRecord: Age of oldest vlserver record. -

    • vl_sc_numDowntimeIncidents: Number of (completed) downtime -incidents. -

    • vl_sc_numRecordsNeverDown: Number of vlserver records never marked -down. -

    • vl_sc_maxDowntimesInARecord: Maximum downtimes seen by any vlserver -record. -

    • vl_sc_sumOfDowntimes: Sum of all (completed) downtimes, in -seconds. -

    • vl_sc_shortestDowntime: Shortest downtime, in seconds. -

    • vl_sc_longestDowntime: Longest downtime, in seconds. -

    • vl_sc_down_0_10_min: Down time incidents: 0-10 minutes. -

    • vl_sc_down_10_30_min: Down time incidents: 10-30 -minutes. -

    • vl_sc_down_half_1_hr: Down time incidents: 30-60 -minutes. -

    • vl_sc_down_1_2_hr: Down time incidents: 1-2 hours. -

    • vl_sc_down_2_4_hr: Down time incidents: 2-4 hours. -

    • vl_sc_down_4_8_hr: Down time incidents: 4-8 hours. -

    • vl_sc_down_more_8_hr: Down time incidents: more than 8 -hours. -

    • vl_sc_downDst_0: Down time incidents: 0 times. -

    • vl_sc_downDst_1: Down time incidents: 1 time. -

    • vl_sc_downDst_2_5: Down time incidents: 2-5 times. -

    • vl_sc_downDst_6_10: Down time incidents: 6-10 times. -

    • vl_sc_downDst_10_50: Down time incidents: 10-50 times. -

    • vl_sc_downDst_more_50: Down time incidents: more than 50 -times. -
    -

    VL Server Up/Down Statistics in Other Cells Group (VL_upDown_DC_group) -

      -

    • vl_oc_numTtlRecords: Number of vlserver records, active or -inactive. -

    • vl_oc_numUpRecords: Number of (active) vlserver records currently -marked up. -

    • vl_oc_numDownRecords: Number of (active) vlserver records currently -marked down. -

    • vl_oc_sumOfRecordAges: Sum of vlserver record lifetimes. -

    • vl_oc_ageOfYoungestRecord: Age of youngest vlserver record. -

    • vl_oc_ageOfOldestRecord: Age of oldest vlserver record. -

    • vl_oc_numDowntimeIncidents: Number of (completed) downtime -incidents. -

    • vl_oc_numRecordsNeverDown: Number of vlserver records never marked -down. -

    • vl_oc_maxDowntimesInARecord: Maximum downtimes seen by any vlserver -record. -

    • vl_oc_sumOfDowntimes: Sum of all (completed) downtimes, in -seconds. -

    • vl_oc_shortestDowntime: Shortest downtime, in seconds. -

    • vl_oc_longestDowntime: Longest downtime, in seconds. -

    • vl_oc_down_0_10_min: Down time incidents: 0-10 minutes. -

    • vl_oc_down_10_30_min: Down time incidents: 10-30 -minutes. -

    • vl_oc_down_half_1_hr: Down time incidents: 30-60 -minutes. -

    • vl_oc_down_1_2_hr: Down time incidents: 1-2 hours. -

    • vl_oc_down_2_4_hr: Down time incidents: 2-4 hours. -

    • vl_oc_down_4_8_hr: Down time incidents: 4-8 hours. -

    • vl_oc_down_more_8_hr: Down time incidents: more than 8 -hours. -

    • vl_oc_downDst_0: Down time incidents: 0 times. -

    • vl_oc_downDst_1: Down time incidents: 1 time. -

    • vl_oc_downDst_2_5: Down time incidents: 2-5 times. -

    • vl_oc_downDst_6_10: Down time incidents: 6-10 times. -

    • vl_oc_downDst_10_50: Down time incidents: 10-50 times. -

    • vl_oc_downDst_more_50: Down time incidents: more than 50 -times. -
    -

    RPC Operation Measurements Section (RPCop_section)

    -

    File Server RPC Operation Timings Group (FS_RPCopTimes_group) -

      -

    • FetchData_ops: Number of FetchData operations executed. -

    • FetchData_ops_ok: Number of successful FetchData operations. -

    • FetchData_sum: Sum of timings for FetchData operations. -

    • FetchData_sqr: Sum of squares of sample timings for FetchData -operations. -

    • FetchData_min: Minimum execution time observed for FetchData -operations. -

    • FetchData_max: Maximum execution time observed for FetchData -operations. -

    • FetchACL_ops: Number of FetchACL operations executed. -

    • FetchACL_ops_ok: Number of successful FetchACL operations. -

    • FetchACL_sum: Sum of timings for FetchACL operations. -

    • FetchACL_sqr: Sum of squares of sample timings for FetchACL -operations. -

    • FetchACL_min: Minimum execution time observed for FetchACL -operations. -

    • FetchACL_max: Maximum execution time observed for FetchACL -operations. -

    • FetchStatus_ops: Number of FetchStatus operations executed. -

    • FetchStatus_ops_ok: Number of successful FetchStatus -operations. -

    • FetchStatus_sum: Sum of timings for FetchStatus operations. -

    • FetchStatus_sqr: Sum of squares of sample timings for FetchStatus -operations. -

    • FetchStatus_min: Minimum execution time observed for FetchStatus -operations. -

    • FetchStatus_max: Maximum execution time observed for FetchStatus -operations. -

    • StoreData_ops: Number of StoreData operations executed. -

    • StoreData_ops_ok: Number of successful StoreData operations. -

    • StoreData_sum: Sum of timings for StoreData operations. -

    • StoreData_sqr: Sum of squares of sample timings for StoreData -operations. -

    • StoreData_min: Minimum execution time observed for StoreData -operations. -

    • StoreData_max: Maximum execution time observed for StoreData -operations. -

    • StoreACL_ops: Number of StoreACL operations executed. -

    • StoreACL_ops_ok: Number of successful StoreACL operation. -

    • StoreACL_sum: Sum of timings for StoreACL operations. -

    • StoreACL_sqr: Sum of squares of sample timings for StoreACL -operations. -

    • StoreACL_min: Minimum execution time observed for StoreACL -operations. -

    • StoreACL_max: Maximum execution time observed for StoreACL -operations. -

    • StoreStatus_ops: Number of StoreStatus operations executed. -

    • StoreStatus_ops_ok: Number of successful StoreStatus -operations. -

    • StoreStatus_sum: Sum of timings for StoreStatus operations. -

    • StoreStatus_sqr: Sum of squares of sample timings for StoreStatus -operations. -

    • StoreStatus_min: Minimum execution time observed for StoreStatus -operations. -

    • StoreStatus_max: Maximum execution time observed for StoreStatus -operations. -

    • RemoveFile_ops: Number of RemoveFile operations executed. -

    • RemoveFile_ops_ok: Number of successful RemoveFile -operations. -

    • RemoveFile_sum: Sum of timings for RemoveFile operations. -

    • RemoveFile_sqr: Sum of squares of sample timings for RemoveFile -operations. -

    • RemoveFile_min: Minimum execution time observed for RemoveFile -operations. -

    • RemoveFile_max: Maximum execution time observed for RemoveFile -operations. -

    • CreateFile_ops: Number of CreateFile operations executed. -

    • CreateFile_ops_ok: Number of successful CreateFile -operations. -

    • CreateFile_sum: Sum of timings for CreateFile operations. -

    • CreateFile_sqr: Sum of squares of sample timings for CreateFile -operations. -

    • CreateFile_min: Minimum execution time observed for CreateFile -operations. -

    • CreateFile_max: Maximum execution time observed for CreateFile -operations. -

    • Rename_ops: Number of Rename operations executed. -

    • Rename_ops_ok: Number of successful Rename operations. -

    • Rename_sum: Sum of timings for Rename operations. -

    • Rename_sqr: Sum of squares of sample timings for Rename -operations. -

    • Rename_min: Minimum execution time observed for Rename -operations. -

    • Rename_max: Maximum execution time observed for Rename -operations. -

    • Symlink_ops: Number of Symlink operations executed. -

    • Symlink_ops_ok: Number of successful Symlink operations. -

    • Symlink_sum: Sum of timings for Symlink operations. -

    • Symlink_sqr: Sum of squares of sample timings for Symlink -operations. -

    • Symlink_min: Minimum execution time observed for Symlink -operations. -

    • Symlink_max: Maximum execution time observed for Symlink -operations. -

    • Link_ops: Number of Link operations executed. -

    • Link_ops_ok: Number of successful Link operations. -

    • Link_sum: Sum of timings for Link operations. -

    • Link_sqr: Sum of squares of sample timings for Link -operations. -

    • Link_min: Minimum execution time observed for Link -operations. -

    • Link_max: Maximum execution time observed for Link -operations. -

    • MakeDir_ops: Number of MakeDir operations executed. -

    • MakeDir_ops_ok: Number of successful MakeDir operations. -

    • MakeDir_sum: Sum of timings for MakeDir operations. -

    • MakeDir_sqr: Sum of squares of sample timings for MakeDir -operations. -

    • MakeDir_min: Minimum execution time observed for MakeDir -operations. -

    • MakeDir_max: Maximum execution time observed for MakeDir -operations. -

    • RemoveDir_ops: Number of RemoveDir operations executed. -

    • RemoveDir_ops_ok: Number of successful RemoveDir operations. -

    • RemoveDir_sum: Sum of timings for RemoveDir operations. -

    • RemoveDir_sqr: Sum of squares of sample timings for RemoveDir -operations. -

    • RemoveDir_min: Minimum execution time observed for RemoveDir -operations. -

    • RemoveDir_max: Maximum execution time observed for RemoveDir -operations. -

    • SetLock_ops: Number of SetLock operations executed. -

    • SetLock_ops_ok: Number of successful SetLock operations. -

    • SetLock_sum: Sum of timings for SetLock operations. -

    • SetLock_sqr: Sum of squares of sample timings for SetLock -operations. -

    • SetLock_min: Minimum execution time observed for SetLock -operations. -

    • SetLock_max: Maximum execution time observed for SetLock -operations. -

    • ExtendLock_ops: Number of ExtendLock operations executed. -

    • ExtendLock_ops_ok: Number of successful ExtendLock -operations. -

    • ExtendLock_sum: Sum of timings for ExtendLock operations. -

    • ExtendLock_sqr: Sum of squares of sample timings for ExtendLock -operations. -

    • ExtendLock_min: Minimum execution time observed for ExtendLock -operations. -

    • ExtendLock_max: Maximum execution time observed for ExtendLock -operations. -

    • ReleaseLock_ops: Number of ReleaseLock operations executed. -

    • ReleaseLock_ops_ok: Number of successful ReleaseLock -operations. -

    • ReleaseLock_sum: Sum of timings for ReleaseLock operations. -

    • ReleaseLock_sqr: Sum of squares of sample timings for StoreStatus -operations. -

    • ReleaseLock_min: Minimum execution time observed for ReleaseLock -operations. -

    • ReleaseLock_max: Maximum execution time observed for ReleaseLock -operations. -

    • GetStatistics_ops: Number of GetStatistics operations -executed. -

    • GetStatistics_ops_ok: Number of successful GetStatistics -operations. -

    • GetStatistics_sum: Sum of timings for GetStatistics -operations. -

    • GetStatistics_sqr: Sum of squares of sample timings for -GetStatistics operations. -

    • GetStatistics_min: Minimum execution time observed for GetStatistics -operations. -

    • GetStatistics_max: Maximum execution time observed for GetStatistics -operations. -

    • GiveUpCallbacks_ops: Number of GiveUpCallbacks operations -executed. -

    • GiveUpCallbacks_ops_ok: Number of successful GiveUpCallbacks -operations. -

    • GiveUpCallbacks_sum: Sum of timings for GiveUpCallbacks -operations. -

    • GiveUpCallbacks_sqr: Sum of squares of sample timings for -GiveUpCallbacks operations. -

    • GiveUpCallbacks_min: Minimum execution time observed for -GiveUpCallbacks operations. -

    • GiveUpCallbacks_max: Maximum execution time observed for -GiveUpCallbacks operations. -

    • GetVolumeInfo_ops: Number of GetVolumeInfo operations -executed. -

    • GetVolumeInfo_ops_ok: Number of successful GetVolumeInfo -operations. -

    • GetVolumeInfo_sum: Sum of timings for GetVolumeInfo -operations. -

    • GetVolumeInfo_sqr: Sum of squares of sample timings for -GetVolumeInfo operations. -

    • GetVolumeInfo_min: Minimum execution time observed for GetVolumeInfo -operations. -

    • GetVolumeInfo_max: Maximum execution time observed for GetVolumeInfo -operations. -

    • GetVolumeStatus_ops: Number of GetVolumeStatus operations -executed. -

    • GetVolumeStatus_ops_ok: Number of successful GetVolumeStatus -operations. -

    • GetVolumeStatus_sum: Sum of timings for GetVolumeStatus -operations. -

    • GetVolumeStatus_sqr: Sum of squares of sample timings for -GetVolumeStatus operations. -

    • GetVolumeStatus_min: Minimum execution time observed for -GetVolumeStatus operations. -

    • GetVolumeStatus_max: Maximum execution time observed for -GetVolumeStatus operations. -

    • SetVolumeStatus_ops: Number of SetVolumeStatus operations -executed. -

    • SetVolumeStatus_ops_ok: Number of successful SetVolumeStatus -operations. -

    • SetVolumeStatus_sum: Sum of timings for SetVolumeStatus -operations. -

    • SetVolumeStatus_sqr: Sum of squares of sample timings for -SetVolumeStatus operations. -

    • SetVolumeStatus_min: Minimum execution time observed for -SetVolumeStatus operations. -

    • SetVolumeStatus_max: Maximum execution time observed for -SetVolumeStatus operations. -

    • GetRootVolume_ops: Number of GetRootVolume operations -executed. -

    • GetRootVolume_ops_ok: Number of successful GetRootVolume -operations. -

    • GetRootVolume_sum: Sum of timings for GetRootVolume -operations. -

    • GetRootVolume_sqr: Sum of squares of sample timings for -GetRootVolume operations. -

    • GetRootVolume_min: Minimum execution time observed for GetRootVolume -operations. -

    • GetRootVolume_max: Maximum execution time observed for GetRootVolume -operations. -

    • CheckToken_ops: Number of CheckToken operations executed. -

    • CheckToken_ops_ok: Number of successful CheckToken -operations. -

    • CheckToken_sum: Sum of timings for CheckToken operations. -

    • CheckToken_sqr: Sum of squares of sample timings for CheckToken -operations. -

    • CheckToken_min: Minimum execution time observed for CheckToken -operations. -

    • CheckToken_max: Maximum execution time observed for CheckToken -operations. -

    • GetTime_ops: Number of GetTime operations executed. -

    • GetTime_ops_ok: Number of successful GetTime operations. -

    • GetTime_sum: Sum of timings for GetTime operations. -

    • GetTime_sqr: Sum of squares of sample timings for GetTime -operations. -

    • GetTime_min: Minimum execution time observed for GetTime -operations. -

    • GetTime_max: Maximum execution time observed for GetTime -operations. -

    • NGetVolumeInfo_ops: Number of NGetVolumeInfo operations -executed. -

    • NGetVolumeInfo_ops_ok: Number of successful NGetVolumeInfo -operations. -

    • NGetVolumeInfo_sum: Sum of timings for NGetVolumeInfo -operations. -

    • NGetVolumeInfo_sqr: Sum of squares of sample timings for -NGetVolumeInfo operations. -

    • NGetVolumeInfo_min: Minimum execution time observed for -NGetVolumeInfo operations. -

    • NGetVolumeInfo_max: Maximum execution time observed for -NGetVolumeInfo operations. -

    • BulkStatus_ops: Number of BulkStatus operations executed. -

    • BulkStatus_ops_ok: Number of successful BulkStatus -operations. -

    • BulkStatus_sum: Sum of timings for BulkStatus operations. -

    • BulkStatus_sqr: Sum of squares of sample timings for BulkStatus -operations. -

    • BulkStatus_min: Minimum execution time observed for BulkStatus -operations. -

    • BulkStatus_max: Maximum execution time observed for BulkStatus -operations. -

    • XStatsVersion_ops: Number of XStatsVersion operations -executed. -

    • XStatsVersion_ops_ok: Number of successful XStatsVersion -operations. -

    • XStatsVersion_sum: Sum of timings for XStatsVersion -operations. -

    • XStatsVersion_sqr: Sum of squares of sample timings for -XStatsVersion operations. -

    • XStatsVersion_min: Minimum execution time observed for XStatsVersion -operations. -

    • XStatsVersion_max: Maximum execution time observed for XStatsVersion -operations. -

    • GetXStats_ops: Number of GetXStats operations executed. -

    • GetXStats_ops_ok: Number of successful GetXStats operations. -

    • GetXStats_sum: Sum of timings for GetXStats operations. -

    • GetXstats_sqr: Sum of squares of sample timings for GetXStats -operations. -

    • GetXStats_min: Minimum execution time observed for GetXStats -operations. -

    • GetXStats_max: Maximum execution time observed for GetXStats -operations. -
    -

    File Server RPC Operation Errors Group (FS_RPCopErrors_group) -

      -

    • FetchData_srv_err: Number of server-down errors during FetchData -operations. -

    • FetchData_net_err: Number of network errors during FetchData -operations. -

    • FetchData_prot_err_err: Number of protection violations during -FetchData operations. -

    • FetchData_vol_err: Number of volume related errors during FetchData -operations. -

    • FetchData_busy_err: Number of volume busy conditions during -FetchData operations. -

    • FetchData_other_err: Number of miscellaneous other errors during -FetchData operations. -

    • FetchACL_srv_err: Number of server-down errors during FetchACL -operations. -

    • FetchACL_net_err: Number of network errors during FetchACL -operations. -

    • FetchACL_prot_err: Number of protection violations during FetchACL -operations. -

    • FetchACL_vol_err: Number of volume related errors during FetchACL -operations. -

    • FetchACL_busy_err: Number of volume busy conditions encountered -during FetchACL operations. -

    • FetchACL_other_err: Number of miscellaneous other errors during -FetchACL operations. -

    • FetchStatus_srv_err: Number of server-down errors during FetchStatus -operations. -

    • FetchStatus_net_err: Number of network errors during FetchStatus -operations. -

    • FetchStatus_prot_err: Number of protection violations during -FetchStatus operations. -

    • FetchStatus_vol_err: Number of volume related errors during -FetchStatus operations. -

    • FetchStatus_busy_err: Number of volume busy conditions encountered -during FetchStatus operations. -

    • FetchStatus_other_err: Number of miscellaneous other errors during -FetchStatus operations. -

    • StoreData_srv_err: Number of server-down errors during StoreData -operations. -

    • StoreData_net_err: Number of network errors during StoreData -operations. -

    • StoreData_prot_err: Number of protection violations during StoreData -operations. -

    • StoreData_vol_err: Number of volume related errors during StoreData -operations. -

    • StoreData_busy_err: Number of volume busy conditions encountered -during StoreData operations. -

    • StoreData_other_err: Number of miscellaneous other errors during -StoreData operations. -

    • StoreACL_srv_err: Number of server-down errors during StoreACL -operations. -

    • StoreACL_net_err: Number of network errors during StoreACL -operations. -

    • StoreACL_prot_err: Number of protection violations during StoreACL -operations. -

    • StoreACL_vol_err: Number of volume related errors during StoreACL -operations. -

    • StoreACL_busy_err: Number of volume busy conditions encountered -during StoreACL operations. -

    • StoreACL_other_err: Number of miscellaneous other errors during -StoreACL operations. -

    • StoreStatus_srv_err: Number of server-down errors during StoreStatus -operations. -

    • StoreStatus_net_err: Number of network errors during StoreStatus -operations. -

    • StoreStatus_prot_err: Number of protection violations during -StoreStatus operations. -

    • StoreStatus_vol_err: Number of volume related errors during -StoreStatus operations. -

    • StoreStatus_busy_err: Number of volume busy conditions encountered -during StoreStatus operations. -

    • StoreStatus_other_err: Number of miscellaneous other errors during -StoreStatus operations. -

    • RemoveFile_srv_err: Number of server-down errors during RemoveFile -operations. -

    • RemoveFile_net_err: Number of network errors during RemoveFile -operations. -

    • RemoveFile_prot_err: Number of protection violations during -RemoveFile operations. -

    • RemoveFile_vol_err: Number of volume related errors during -RemoveFile operations. -

    • RemoveFile_busy_err: Number of volume busy conditions encountered -during RemoveFile operations. -

    • RemoveFile_other_err: Number of miscellaneous other errors during -RemoveFile operations. -

    • CreateFile_srv_err: Number of server-down errors during CreateFile -operations. -

    • CreateFile_net_err: Number of network errors during CreateFile -operations. -

    • CreateFile_prot_err: Number of protection violations during -CreateFile operations. -

    • CreateFile_vol_err: Number of volume related errors during -CreateFile operations. -

    • CreateFile_busy_err: Number of volume busy conditions encountered -during CreateFile operations. -

    • CreateFile_other_err: Number of miscellaneous other errors during -CreateFile operations. -

    • Rename_srv_err: Number of server-down errors during Rename -operations. -

    • Rename_net_err: Number of network errors during Rename -operations. -

    • Rename_prot_err: Number of protection violations during Rename -operations. -

    • Rename_vol_err: Number of volume related errors during Rename -operations. -

    • Rename_busy_err: Number of volume busy conditions encountered during -Rename operations. -

    • Rename_other_err: Number of miscellaneous other errors during Rename -operations. -

    • Symlink_srv_err: Number of server-down errors during Symlink -operations. -

    • Symlink_net_err: Number of network errors during Symlink -operations. -

    • Symlink_prot_err: Number of protection violations during Symlink -operations. -

    • Symlink_vol_err: Number of volume related errors during Symlink -operations. -

    • Symlink_busy_err: Number of volume busy conditions encountered -during Symlink operations. -

    • Symlink_other_err: Number of miscellaneous other errors during -Symlink operations. -

    • Link_srv_err: Number of server-down errors during Link -operations. -

    • Link_net_err: Number of network errors during Link -operations. -

    • Link_prot_err: Number of protection violations during Link -operations. -

    • Link_vol_err: Number of volume related errors during Link -operations. -

    • Link_busy_err: Number of volume busy conditions encountered during -Link operations. -

    • Link_other_err: Number of miscellaneous other errors during Link -operations. -

    • MakeDir_srv_err: Number of server-down errors during MakeDir -operations. -

    • MakeDir_net_err: Number of network errors during MakeDir -operations. -

    • MakeDir_prot_err: Number of protection violations during MakeDir -operations. -

    • MakeDir_vol_err: Number of volume related errors during MakeDir -operations. -

    • MakeDir_busy_err: Number of volume busy conditions encountered -during MakeDir operations. -

    • MakeDir_other_err: Number of miscellaneous other errors during -MakeDir operations. -

    • RemoveDir_srv_err: Number of server-down errors during RemoveDir -operations. -

    • RemoveDir_net_err: Number of network errors during RemoveDir -operations. -

    • RemoveDir_prot_err: Number of protection violations during RemoveDir -operations. -

    • RemoveDir_vol_err: Number of volume related errors during RemoveDir -operations. -

    • RemoveDir_busy_err: Number of volume busy conditions encountered -during RemoveDir operations. -

    • RemoveDir_other_err: Number of miscellaneous other errors during -RemoveDir operations. -

    • SetLock_srv_err: Number of server-down errors during SetLock -operations. -

    • SetLock_net_err: Number of network errors during SetLock -operations. -

    • SetLock_prot_err: Number of protection violations during SetLock -operations. -

    • SetLock_vol_err: Number of volume related errors during SetLock -operations. -

    • SetLock_busy_err: Number of volume busy conditions encountered -during SetLock operations. -

    • SetLock_other_err: Number of miscellaneous other errors during -SetLock operations. -

    • ExtendLock_srv_err: Number of server-down errors during ExtendLock -operations. -

    • ExtendLock_net_err: Number of network errors during ExtendLock -operations. -

    • ExtendLock_prot_err: Number of protection violations during -ExtendLock operations. -

    • ExtendLock_vol_err: Number of volume related errors during -ExtendLock operations. -

    • ExtendLock_busy_err: Number of volume busy conditions encountered -during ExtendLock operations. -

    • ExtendLock_other_err: Number of miscellaneous other errors during -ExtendLock operations. -

    • ReleaseLock_srv_err: Number of server-down errors during ReleaseLock -operations. -

    • ReleaseLock_net_err: Number of network errors during ReleaseLock -operations. -

    • ReleaseLock_prot_err: Number of protection violations during -ReleaseLock operations. -

    • ReleaseLock_vol_err: Number of volume related errors during -ReleaseLock operations. -

    • ReleaseLock_busy_err: Number of volume busy conditions encountered -during ReleaseLock operations. -

    • ReleaseLock_other_err: Number of miscellaneous other errors during -ReleaseLock operations. -

    • GetStatistics_srv_err: Number of server-down errors during -GetStatistics operations. -

    • GetStatistics_net_err: Number of network errors during GetStatistics -operations. -

    • GetStatistics_prot_err: Number of protection violations during -GetStatistics operations. -

    • GetStatistics_vol_err: Number of volume related errors during -GetStatistics operations. -

    • GetStatistics_busy_err: Number of volume busy conditions encountered -during GetStatistics operations. -

    • GetStatistics_other_err: Number of miscellaneous other errors during -GetStatistics operations. -

    • GiveUpCallbacks_srv_err: Number of server-down errors during -GiveUpCallbacks operations. -

    • GiveUpCallbacks_net_err: Number of network errors during -GiveUpCallbacks operations. -

    • GiveUpCallbacks_prot_err: Number of protection violations during -GiveUpCallbacks operations. -

    • GiveUpCallbacks_vol_err: Number of volume related errors during -GiveUpCallbacks operations. -

    • GiveUpCallbacks_busy_err: Number of volume busy conditions -encountered during GiveUpCallbacks operations. -

    • GiveUpCallbacks_other_err: Number of miscellaneous other errors -during GiveUpCallbacks operations. -

    • GetVolumeInfo_srv_err: Number of server-down errors during -GetVolumeInfo operations. -

    • GetVolumeInfo_net_err: Number of network errors during GetVolumeInfo -operations. -

    • GetVolumeInfo_prot_err: Number of protection violations during -GetVolumeInfo operations. -

    • GetVolumeInfo_vol_err: Number of volume related errors during -GetVolumeInfo operations. -

    • GetVolumeInfo_busy_err: Number of volume busy conditions encountered -during GetVolumeInfo operations. -

    • GetVolumeInfo_other_err: Number of miscellaneous other errors during -GetVolumeInfo operations. -

    • GetVolumeStatus_srv_err: Number of server-down errors during -GetVolumeStatus operations. -

    • GetVolumeStatus_net_err: Number of network errors during -GetVolumeStatus operations. -

    • GetVolumeStatus_prot_err: Number of protection violations during -GetVolumeStatus operations. -

    • GetVolumeStatus_vol_err: Number of volume related errors during -GetVolumeStatus operations. -

    • GetVolumeStatus_busy_err: Number of volume busy conditions -encountered during GetVolumeStatus operations. -

    • GetVolumeStatus_other_err: Number of miscellaneous other errors -during GetVolumeStatus operations. -

    • SetVolumeStatus_srv_err : Number of server-down errors during -SetVolumeStatus operations. -

    • SetVolumeStatus_net_err: Number of network errors during -SetVolumeStatus operations. -

    • SetVolumeStatus_prot_err: Number of protection violations during -SetVolumeStatus operations. -

    • SetVolumeStatus_vol_err: Number of volume related errors during -SetVolumeStatus operations. -

    • SetVolumeStatus_busy_err: Number of volume busy conditions -encountered during SetVolumeStatus operations. -

    • SetVolumeStatus_other_err: Number of miscellaneous other errors -during SetVolumeStatus operations. -

    • GetRootVolume_srv_err: Number of server-down errors during -GetRootVolume operations. -

    • GetRootVolume_net_err: Number of network errors during GetRootVolume -operations. -

    • GetRootVolume_prot_err: Number of protection violations during -GetRootVolume operations. -

    • GetRootVolume_vol_err: Number of volume related errors during -GetRootVolume operations. -

    • GetRootVolume_busy_err: Number of volume busy conditions encountered -during GetRootVolume operations. -

    • GetRootVolume_other_err: Number of miscellaneous other errors during -GetRootVolume operations. -

    • CheckToken_srv_err: Number of server-down errors during CheckToken -operations. -

    • CheckToken_net_err: Number of network errors during CheckToken -operations. -

    • CheckToken_prot_err: Number of protection violations during -CheckToken operations. -

    • CheckToken_vol_err: Number of volume related errors during -CheckToken operations. -

    • CheckToken_busy_err: Number of volume busy conditions encountered -during CheckToken operations. -

    • CheckToken_other_err: Number of miscellaneous other errors during -CheckToken operations. -

    • GetTime_srv_err: Number of server-down errors during GetTime -operations. -

    • GetTime_net_err: Number of network errors during GetTime -operations. -

    • GetTime_prot_err: Number of protection violations during GetTime -operations. -

    • GetTime_vol_err: Number of volume related errors during GetTime -operations. -

    • GetTime_busy_err: Number of volume busy conditions encountered -during GetTime operations. -

    • GetTime_other_err: Number of miscellaneous other errors during -GetTime operations. -

    • NGetVolumeInfo_srv_err: Number of server-down errors during -NGetVolumeInfo operations. -

    • NGetVolumeInfo_net_err: Number of network errors during -NGetVolumeInfo operations. -

    • NGetVolumeInfo_prot_err: Number of protection violations during -NGetVolumeInfo operations. -

    • NGetVolumeInfo_vol_err: Number of volume related errors during -NGetVolumeInfo operations. -

    • NGetVolumeInfo_busy_err: Number of volume busy conditions -encountered during NGetVolumeInfo operations. -

    • NGetVolumeInfo_other_err: Number of miscellaneous other errors -during NGetVolumeInfo operations. -

    • BulkStatus_srv_err: Number of server-down errors during BulkStatus -operations. -

    • BulkStatus_net_err: Number of network errors during BulkStatus -operations. -

    • BulkStatus_prot_err: Number of protection violations during -BulkStatus operations. -

    • BulkStatus_vol_err: Number of volume related errors during -BulkStatus operations. -

    • BulkStatus_busy_err: Number of volume busy conditions encountered -during BulkStatus operations. -

    • BulkStatus_other_err: Number of miscellaneous other errors during -BulkStatus operations. -

    • XStatsVersion_srv_err: Number of server-down errors during -XStatsVersion operations. -

    • XStatsVersion_net_err: Number of network errors during XStatsVersion -operations. -

    • XStatsVersion_prot_err: Number of protection violations during -XStatsVersion operations. -

    • XStatsVersion_vol_err: Number of volume related errors during -XStatsVersion operations. -

    • XStatsVersion_busy_err: Number of volume busy conditions encountered -during XStatsVersion operations. -

    • XStatsVersion_other_err: Number of miscellaneous other errors during -XStatsVersion operations. -

    • GetXStats_srv_err: Number of server-down errors during GetXStats -operations. -

    • GetXStats_net_err: Number of network errors during GetXStats -operations. -

    • GetXStats_prot_err: Number of protection violations during GetXStats -operations. -

    • GetXStats_vol_err: Number of volume related errors during GetXStats -operations. -

    • GetXStats_busy_err: Number of volume busy conditions encountered -during GetXStats operations. -

    • GetXStats_other_err: Number of miscellaneous other errors during -GetXStats operations. -
    -

    File Server RPC Transfer Timings Group (FS_RPCopBytes_group) -

      -

    • FetchData_xfers: Number of FetchData operations. -

    • FetchData_xfers_ok: Number of successful FetchData -operations. -

    • FetchData_xfers_sum: Sum of timing values for FetchData -operations. -

    • FetchData_xfers_sqr: Sum of squares of sample timings for FetchData -operations. -

    • FetchData_xfers_min: Minimum transfer time observed for FetchData -operations. -

    • FetchData_xfers_max: Maximum transfer time observed for FetchData -operations. -

    • FetchData_xfers_bytes_sum: Sum of bytes transferred for FetchData -operations. -

    • FetchData_xfers_bytes_min: Minimum byte transfer observed for -FetchData operations. -

    • FetchData_xfers_bytes_max: Maximum byte transfer observed for -FetchData operations. -

    • FetchData_xfers_bucket0: Tally in bucket0 for FetchData -operations. -

    • FetchData_xfers_bucket1: Tally in bucket1 for FetchData -operations. -

    • FetchData_xfers_bucket2: Tally in bucket2 for FetchData -operations. -

    • FetchData_xfers_bucket3: Tally in bucket3 for FetchData -operations. -

    • FetchData_xfers_bucket4: Tally in bucket4 for FetchData -operations. -

    • FetchData_xfers_bucket5: Tally in bucket5 for FetchData -operations. -

    • FetchData_xfers_bucket6: Tally in bucket6 for FetchData -operations. -

    • FetchData_xfers_bucket7: Tally in bucket7 for FetchData -operations. -

    • FetchData_xfers_bucket8: Tally in bucket8 for FetchData -operations. -

    • StoreData_xfers: Number of StoreData operations. -

    • StoreData_xfers_ok: Number of successful StoreData -operations. -

    • StoreData_xfers_sum: Sum of timing values for StoreData -operations. -

    • StoreData_xfers_sqr: Sum of squares of sample timings for StoreData -operations. -

    • StoreData_xfers_min: Minimum transfer time observed for StoreData -operations. -

    • StoreData_xfers_max: Maximum transfer time observed for StoreData -operations. -

    • StoreData_xfers_bytes_sum: Sum of bytes transferred for StoreData -operations. -

    • StoreData_xfers_bytes_min: Minimum byte transfer observed for -StoreData operations. -

    • StoreData_xfers_bytes_max: Maximum byte transfer observed for -StoreData operations. -

    • StoreData_xfers_bucket0: Tally in bucket0 for StoreData -operations. -

    • StoreData_xfers_bucket1: Tally in bucket1 for StoreData -operations. -

    • StoreData_xfers_bucket2: Tally in bucket2 for StoreData -operations. -

    • StoreData_xfers_bucket3: Tally in bucket3 for StoreData -operations. -

    • StoreData_xfers_bucket4: Tally in bucket4 for StoreData -operations. -

    • StoreData_xfers_bucket5: Tally in bucket5 for StoreData -operations. -

    • StoreData_xfers_bucket6: Tally in bucket6 for StoreData -operations. -

    • StoreData_xfers_bucket7: Tally in bucket7 for StoreData -operations. -

    • StoreData_xfers_bucket8: Tally in bucket8 for StoreData -operations. -
    -

    Cache Manager RPC Operation Timings Group (CM_RPCopTimes_group) -

      -

    • CallBack_ops: Number of CallBack operations executed. -

    • CallBack_ops_ok: Number of successful CallBack operations. -

    • CallBack_ops_sum: Sum of timings for CallBack operations. -

    • CallBack_ops_min: Minimum execution time observed for CallBack -operations. -

    • CallBack_ops_max: Maximum execution time observed for CallBack -operations. -

    • InitCallBackState_ops: Number of InitCallBackState operations -executed. -

    • InitCallBackState_ops_ok: Number of successful InitCallBackState -operations. -

    • InitCallBackState_ops_sum: Sum of timings for InitCallBackState -operations. -

    • InitCallBackState_ops_min: Minimum execution time observed for -InitCallBackState operations. -

    • InitCallBackState_ops_max: Maximum execution time observed for -InitCallBackState operations. -

    • Probe_ops: Number of Probe operations executed. -

    • Probe_ops_ok: Number of successful Probe operations. -

    • Probe_ops_sum: Sum of timings for Probe operations. -

    • Probe_ops_min: Minimum execution time observed for Probe -operations. -

    • Probe_ops_max: Maximum execution time observed for Probe -operations. -

    • GetLock_ops: Number of GetLock operations executed. -

    • GetLock_ops_ok: Number of successful GetLock operations. -

    • GetLock_ops_sum: Sum of timings for GetLock operations. -

    • GetLock_ops_min: Minimum execution time observed for GetLock -operations. -

    • GetLock_ops_max: Maximum execution time observed for GetLock -operations. -

    • GetCE_ops: Number of GetCE operations executed. -

    • GetCE_ops_ok: Number of successful GetCE operations. -

    • GetCE_ops_sum: Sum of timings for GetCE operations. -

    • GetCE_ops_min: Minimum execution time observed for GetCE -operations. -

    • GetCE_ops_max: Maximum execution time observed for GetCE -operations. -

    • XStatsVersion_CM_ops: Number of XStatsVersion operations -executed. -

    • XStatsVersion_CM_ops_ok: Number of successful XStatsVersion -operations. -

    • XStatsVersion_CM_ops_sum: Sum of timings for XStatsVersion -operations. -

    • XStatsVersion_CM_ops_min: Minimum execution time observed for -XStatsVersion operations. -

    • XStatsVersion_CM_ops_max: Maximum execution time observed for -XStatsVersion operations. -

    • GetXStats_CM_ops: Number of GetXStats operations executed. -

    • GetXStats_CM_ops_ok: Number of successful GetXStats -operations. -

    • GetXStats_CM_ops_sum: Sum of timings for GetXStats -operations. -

    • GetXStats_CM_ops_min: Minimum execution time observed for GetXStats -operations. -

    • GetXStats_CM_ops_max: Maximum execution time observed for GetXStats -operations. -
    -

    Authentication and Replicated File Access Section (Auth_Access_section)

    -

    Authentication Information for Cache Manager Group (Auth_Stats_group) -

      -

    • curr_PAGs: Current number of PAGs. -

    • curr_Records: Current number of records in table. -

    • curr_AuthRecords: Current number of of authenticated records (with -valid ticket). -

    • curr_UnauthRecords: Current number of of unauthenticated records -(without any ticket at all). -

    • curr_MaxRecordsInPAG: Maximum records for a single PAG. -

    • curr_LongestChain: Length of longest current hash chain. -

    • PAGCreations: Number of PAG creations. -

    • TicketUpdates: Number of ticket additions/refreshes. -

    • HWM_PAGS: High water mark - number of PAGs. -

    • HWM_Records: High water mark - number of records. -

    • HWM_MaxRecordsInPAG: High water mark - maximum records for a -single PAG. -

    • HWM_LongestChain: High water mark - longest hash chain. -
    -

    Unreplicated File Access Group (Access_Stats_group) -

      -

    • unreplicatedRefs: Number of references to unreplicated data. -

    • replicatedRefs: Number of references to replicated data. -

    • numReplicasAccessed: Number of replicas accessed. -

    • maxReplicasPerRef: Maximum number of replicas accessed per -reference. -

    • refFirstReplicaOK: Number of references satisfied by 1st -replica. -
    -

    The File Server Statistics

    - -

    File Server statistics are classified into the following sections and -groups: -

      -

    • PerfStats_section: Performance Statistics Section. -
        -

      • VnodeCache_group: Vnode Cache Group. -

      • Directory_group: Directory Package Group. -

      • Rx_group: Rx Group. -

      • HostModule_group: Host Module Fields Group. -

      • misc_group: Miscellaneous Variables Group. -
      -

    • RPCop_section: RPC Operations Section. -
        -

      • RPCopTimes_group: Individual RPC Operation Timings. -

      • RPCopBytes_group: Byte Information for Certain RPC -Operations. -
      -
    -

    All File Server variables categorized under the above sections and groups -names are listed below. -

    Performance Statistics Section (PerfStats_section)

    -

    Vnode Cache Group (VnodeCache_group) -

      -

    • vcache_L_Entries: Number of entries in LARGE vnode cache. -

    • vcache_L_Allocs: Number of allocs (large). -

    • vcache_L_Gets: Number of gets (large). -

    • vcache_L_Reads: Number of reads (large). -

    • vcache_L_Writes: Number of writes (large). -

    • vcache_S_Entries: Number of entries in SMALL vnode cache. -

    • vcache_S_Allocs: Number of allocs (small). -

    • vcache_S_Gets: Number of gets (small). -

    • vcache_S_Reads: Number of reads (small). -

    • vcache_S_Writes: Number of writes (small). -

    • vcache_H_Entries: Number of entries in HEADER vnode cache. -

    • vcache_H_Gets: Number of gets (header) -

    • vcache_H_Replacements: Number of replacements (header) -
    -

    Directory Package Group (Directory_group) -

      -

    • dir_Buffers: Number of buffers in use. -

    • dir_Calls: Number of read calls made. -

    • dir_IOs: I/O operations performed. -
    -

    Rx Group (Rx_group) -

      -

    • rx_packetRequests: Packet allocation requests. -

    • rx_noPackets_RcvClass: Failed packet requests (receive -class). -

    • rx_noPackets_SendClass: Failed packet requests (send class). -

    • rx_noPackets_SpecialClass: Failed packet requests (special -class). -

    • rx_socketGreedy: Did SO_GREEDY succeed? -

    • rx_bogusPacketOnRead: Short packets received. -

    • rx_bogusHost: Host address from bogus packets. -

    • rx_noPacketOnRead: Read packets with no packet there. -

    • rx_noPacketBuffersOnRead: Packets dropped due to buffer -shortage. -

    • rx_selects: Selects waiting on packet or timeout. -

    • rx_sendSelects: Selects forced upon sends. -

    • rx_packetsRead_RcvClass: Packets read (receive class). -

    • rx_packetsRead_SendClass: Packets read (send class). -

    • rx_packetsRead_SpecialClass: Packets read (special class). -

    • rx_dataPacketsRead: Unique data packets read off wire. -

    • rx_ackPacketsRead: ACK packets read. -

    • rx_dupPacketsRead: Duplicate data packets read. -

    • rx_spuriousPacketsRead: Inappropriate packets read. -

    • rx_packetsSent_RcvClass: Packets sent (receive class). -

    • rx_packetsSent_SendClass: Packets sent (send class). -

    • rx_packetsSent_SpecialClass: Packets sent (special class). -

    • rx_ackPacketsSent: ACK packets sent. -

    • rx_pingPacketsSent: Ping packets sent. -

    • rx_abortPacketsSent: Abort packets sent. -

    • rx_busyPacketsSent: Busy packets sent. -

    • rx_dataPacketsSent: Unique data packets sent. -

    • rx_dataPacketsReSent: Retransmissions sent. -

    • rx_dataPacketsPushed: Retransmissions pushed by NACK. -

    • rx_ignoreAckedPacket: Packets with ACKed flag on rxi_Start. -

    • rx_totalRtt_Sec and rx_totalRtt_Usec: Total round trip time (in -seconds and milliseconds). -

    • rx_minRtt_Sec and rx_minRtt_Usec: Minimum round trip time (in -seconds and milliseconds). -

    • rx_maxRtt_Sec and rx_maxRtt_Usec: Maximum round trip time (in -seconds and milliseconds). -

    • rx_nRttSamples: Round trip samples. -

    • rx_nServerConns: Total server connections. -

    • rx_nClientConns: Total client connections. -

    • rx_nPeerStructs: Total peer structures. -

    • rx_nCallStructs: Total call structures. -

    • rx_nFreeCallStructs: Total free call structures. -
    -

    Host Module Fields Group (HostModule_group) -

      -

    • host_NumHostEntries: Number of host entries. -

    • host_HostBlocks: Blocks in use for hosts. -

    • host_NonDeletedHosts: Non-deleted hosts. -

    • host_HostsInSameNetOrSubnet: Hosts in same subnet as server. -

    • host_HostsInDiffSubnet: Hosts in different subnet than -server. -

    • host_HostsInDiffNetwork: Hosts in different network than -server. -

    • host_NumClients: Number of client entries. -

    • host_ClientBlocks: Blocks in use for clients. -
    -

    Miscellaneous Variables Group (misc_group) -

      -

    • numPerfCalls: Number of performance calls received. -
    -

    RPC Operations Section (RPCop_section)

    -

    Individual RPC Operation Timings Group (RPCopTimes_group) -

      -

    • epoch: Time when data collection began. -

    • FetchData_ops: Number of FetchData operations executed. -

    • FetchData_ops_ok: Number of successful FetchData operations. -

    • FetchData_sum: Sum of timings for FetchData operations. -

    • FetchData_sqr: Sum of squares of sample timings for FetchData -operations. -

    • FetchData_min: Minimum execution time observed for FetchData -operations. -

    • FetchData_max: Maximum execution time observed for FetchData -operations. -

    • FetchACL_ops: Number of FetchACL operations executed. -

    • FetchACL_ops_ok: Number of successful FetchACL operations. -

    • FetchACL_sum: Sum of timings for FetchACL operations. -

    • FetchACL_sqr: Sum of squares of sample timings for FetchACL -operations. -

    • FetchACL_min: Minimum execution time observed for FetchACL -operations. -

    • FetchACL_max: Maximum execution time observed for FetchACL -operations. -

    • FetchStatus_ops: Number of FetchStatus operations executed. -

    • FetchStatus_ops_ok: Number of successful FetchStatus -operations. -

    • FetchStatus_sum: Sum of timings for FetchStatus operations. -

    • FetchStatus_sqr: Sum of squares of sample timings for FetchStatus -operations. -

    • FetchStatus_min: Minimum execution time observed for FetchStatus -operations. -

    • FetchStatus_max: Maximum execution time observed for FetchStatus -operations. -

    • StoreData_ops: Number of StoreData operations executed. -

    • StoreData_ops_ok: Number of successful StoreData operations. -

    • StoreData_sum: Sum of timings for StoreData operations. -

    • StoreData_sqr: Sum of squares of sample timings for StoreData -operations. -

    • StoreData_min: Minimum execution time observed for StoreData -operations. -

    • StoreData_max: Maximum execution time observed for StoreData -operations. -

    • StoreACL_ops: Number of StoreACL operations executed. -

    • StoreACL_ops_ok: Number of successful StoreACL operations. -

    • StoreACL_sum: Sum of timings for StoreACL operations. -

    • StoreACL_sqr: Sum of squares of sample timings for StoreACL -operations. -

    • StoreACL_min: Minimum execution time observed for StoreACL -operations. -

    • StoreACL_max: Maximum execution time observed for StoreACL -operations. -

    • StoreStatus_ops: Number of StoreStatus operations executed. -

    • StoreStatus_ops_ok: Number of successful StoreStatus -operations. -

    • StoreStatus_sum: Sum of timings for StoreStatus operations. -

    • StoreStatus_sqr: Sum of squares of sample timings for StoreStatus -operations. -

    • StoreStatus_min: Minimum execution time observed for StoreStatus -operations. -

    • StoreStatus_max: Maximum execution time observed for StoreStatus -operations. -

    • RemoveFile_ops: Number of RemoveFile operations executed. -

    • RemoveFile_ops_ok: Number of successful RemoveFile -operations. -

    • RemoveFile_sum: Sum of timings for RemoveFile operations. -

    • RemoveFile_sqr: Sum of squares of sample timings for RemoveFile -operations. -

    • RemoveFile_min: Minimum execution time observed for RemoveFile -operations. -

    • RemoveFile_max: Maximum execution time observed for RemoveFile -operations. -

    • CreateFile_ops: Number of CreateFile operations executed. -

    • CreateFile_ops_ok: Number of successful CreateFile -operations. -

    • CreateFile_sum: Sum of timings for CreateFile operations. -

    • CreateFile_sqr: Sum of squares of sample timings for CreateFile -operations. -

    • CreateFile_min: Minimum execution time observed for CreateFile -operations. -

    • CreateFile_max: Maximum execution time observed for CreateFile -operations. -

    • Rename_ops: Number of Rename operations executed. -

    • Rename_ops_ok: Number of successful Rename operations. -

    • Rename_sum: Sum of timings for Rename operations. -

    • Rename_sqr: Sum of squares of sample timings for Rename -operations. -

    • Rename_min: Minimum execution time observed for Rename -operations. -

    • Rename_max: Maximum execution time observed for Rename -operations. -

    • Symlink_ops: Number of Symlink operations executed. -

    • Symlink_ops_ok: Number of successful Symlink operations. -

    • Symlink_sum: Sum of timings for Symlink operations. -

    • Symlink_sqr: Sum of squares of sample timings for Symlink -operations. -

    • Symlink_min: Minimum execution time observed for Symlink -operations. -

    • Symlink_max: Maximum execution time observed for Symlink -operations. -

    • Link_ops: Number of Link operations executed. -

    • Link_ops_ok: Number of successful Link operations. -

    • Link_sum: Sum of timings for Link operations. -

    • Link_sqr: Sum of squares of sample timings for Link -operations. -

    • Link_min: Minimum execution time observed for Link -operations. -

    • Link_max: Maximum execution time observed for Link -operations. -

    • MakeDir_ops: Number of MakeDir operations executed. -

    • MakeDir_ops_ok: Number of successful MakeDir operations. -

    • MakeDir_sum: Sum of timings for MakeDir operations. -

    • MakeDir_sqr: Sum of squares of sample timings for MakeDir -operations. -

    • MakeDir_min: Minimum execution time observed for MakeDir -operations. -

    • MakeDir_max: Maximum execution time observed for MakeDir -operations. -

    • RemoveDir_ops: Number of RemoveDir operations executed. -

    • RemoveDir_ops_ok: Number of successful RemoveDir operations. -

    • RemoveDir_sum: Sum of timings for RemoveDir operations. -

    • RemoveDir_sqr: Sum of squares of sample timings for RemoveDir -operations. -

    • RemoveDir_min: Minimum execution time observed for RemoveDir -operations. -

    • RemoveDir_max: Maximum execution time observed for RemoveDir -operations. -

    • SetLock_ops: Number of SetLock operations executed. -

    • SetLock_ops_ok: Number of successful SetLock operations. -

    • SetLock_sum: Sum of timings for SetLock operations. -

    • SetLock_sqr: Sum of squares of sample timings for SetLock -operations. -

    • SetLock_min: Minimum execution time observed for SetLock -operations. -

    • SetLock_max: Maximum execution time observed for SetLock -operations. -

    • ExtendLock_ops: Number of ExtendLock operations executed. -

    • ExtendLock_ops_ok: Number of successful ExtendLock -operations. -

    • ExtendLock_sum: Sum of timings for ExtendLock operations. -

    • ExtendLock_sqr: Sum of squares of sample timings for ExtendLock -operations. -

    • ExtendLock_min: Minimum execution time observed for ExtendLock -operations. -

    • ExtendLock_max: Maximum execution time observed for ExtendLock -operations. -

    • ReleaseLock_ops: Number of ReleaseLock operations executed. -

    • ReleaseLock_ops_ok: Number of successful ReleaseLock -operations. -

    • ReleaseLock_sum: Sum of timings for ReleaseLock operations. -

    • ReleaseLock_sqr: Sum of squares of sample timings for ReleaseLock -operations. -

    • ReleaseLock_min: Minimum execution time observed for ReleaseLock -operations. -

    • ReleaseLock_max: Maximum execution time observed for ReleaseLock -operations. -

    • GetStatistics_ops: Number of GetStatistics operations -executed. -

    • GetStatistics_ops_ok: Number of successful GetStatistics -operations. -

    • GetStatistics_sum: Sum of timings for GetStatistics -operations. -

    • GetStatistics_sqr: Sum of squares of sample timings for -GetStatistics operations. -

    • GetStatistics_min: Minimum execution time observed for GetStatistics -operations. -

    • GetStatistics_max: Maximum execution time observed for GetStatistics -operations. -

    • GiveUpCallbacks_ops: Number of GiveUpCallbacks operations -executed. -

    • GiveUpCallbacks_ops_ok: Number of successful GiveUpCallbacks -operations. -

    • GiveUpCallbacks_sum: Sum of timings for GiveUpCallbacks -operations. -

    • GiveUpCallbacks_sqr: Sum of squares of sample timings for -GiveUpCallbacks operations. -

    • GiveUpCallbacks_min: Minimum execution time observed for -GiveUpCallbacks operations. -

    • GiveUpCallbacks_max: Maximum execution time observed for -GiveUpCallbacks operations. -

    • GetVolumeInfo_ops: Number of GetVolumeInfo operations -executed. -

    • GetVolumeInfo_ops_ok: Number of successful GetVolumeInfo -operations. -

    • GetVolumeInfo_sum: Sum of timings for GetVolumeInfo -operations. -

    • GetVolumeInfo_sqr: Sum of squares of sample timings for -GetVolumeInfo operations. -

    • GetVolumeInfo_min: Minimum execution time observed for GetVolumeInfo -operations. -

    • GetVolumeInfo_max: Maximum execution time observed for GetVolumeInfo -operations. -

    • GetVolumeStatus_ops: Number of GetVolumeStatus operations -executed. -

    • GetVolumeStatus_ops_ok: Number of successful GetVolumeStatus -operations. -

    • GetVolumeStatus_sum: Sum of timings for GetVolumeStatus -operations. -

    • GetVolumeStatus_sqr: Sum of squares of sample timings for -GetVolumeStatus operations. -

    • GetVolumeStatus_min: Minimum execution time observed for -GetVolumeStatus operations. -

    • GetVolumeStatus_max: Maximum execution time observed for -GetVolumeStatus operations. -

    • SetVolumeStatus_ops: Number of SetVolumeStatus operations -executed. -

    • SetVolumeStatus_ops_ok: Number of successful SetVolumeStatus -operations. -

    • SetVolumeStatus_sum: Sum of timings for SetVolumeStatus -operations. -

    • SetVolumeStatus_sqr: Sum of squares of sample timings for -SetVolumeStatus operations. -

    • SetVolumeStatus_min: Minimum execution time observed for -SetVolumeStatus operations. -

    • SetVolumeStatus_max: Maximum execution time observed for -SetVolumeStatus operations. -

    • GetRootVolume_ops: Number of GetRootVolume operations -executed. -

    • GetRootVolume_ops_ok: Number of successful GetRootVolume -operations. -

    • GetRootVolume_sum: Sum of timings for GetRootVolume -operations. -

    • GetRootVolume_sqr: Sum of squares of sample timings for -GetRootVolume operations. -

    • GetRootVolume_min: Minimum execution time observed for GetRootVolume -operations. -

    • GetRootVolume_max: Maximum execution time observed for GetRootVolume -operations. -

    • CheckToken_ops: Number of CheckToken operations executed. -

    • CheckToken_ops_ok: Number of successful CheckToken -operations. -

    • CheckToken_sum: Sum of timings for CheckToken operations. -

    • CheckToken_sqr: Sum of squares of sample timings for CheckToken -operations. -

    • CheckToken_min: Minimum execution time observed for CheckToken -operations. -

    • CheckToken_max: Maximum execution time observed for CheckToken -operations. -

    • GetTime_ops: Number of GetTime operations executed. -

    • GetTime_ops_ok: Number of successful GetTime operations. -

    • GetTime_sum: Sum of timings for GetTime operations. -

    • GetTime_sqr: Sum of squares of sample timings for GetTime -operations. -

    • GetTime_min: Minimum execution time observed for GetTime -operations. -

    • GetTime_max: Maximum execution time observed for GetTime -operations. -

    • NGetVolumeInfo_ops: Number of NGetVolumeInfo operations -executed. -

    • NGetVolumeInfo_ops_ok: Number of successful NGetVolumeInfo -operations. -

    • NGetVolumeInfo_sum: Sum of timings for NGetVolumeInfo -operations. -

    • NGetVolumeInfo_sqr: Sum of squares of sample timings for -NGetVolumeInfo operations. -

    • NGetVolumeInfo_min: Minimum execution time observed for -NGetVolumeInfo operations. -

    • NGetVolumeInfo_max: Maximum execution time observed for -NGetVolumeInfo operations. -

    • BulkStatus_ops: Number of BulkStatus operations executed. -

    • BulkStatus_ops_ok: Number of successful BulkStatus -operations. -

    • BulkStatus_sum: Sum of timings for BulkStatus operations. -

    • BulkStatus_sqr: Sum of squares of sample timings for BulkStatus -operations. -

    • BulkStatus_min: Minimum execution time observed for BulkStatus -operations. -

    • BulkStatus_max: Maximum execution time observed for BulkStatus -operations. -

    • XStatsVersion_ops: Number of XStatsVersion operations -executed. -

    • XStatsVersion_ops_ok: Number of successful XStatsVersion -operations. -

    • XStatsVersion_sum: Sum of timings for XStatsVersion -operations. -

    • XStatsVersion_sqr: Sum of squares of sample timings for -XStatsVersion operations. -

    • XStatsVersion_min: Minimum execution time observed for XStatsVersion -operations. -

    • XStatsVersion_max: Maximum execution time observed for XStatsVersion -operations. -

    • GetXStats_ops: Number of GetXStats operations executed. -

    • GetXStats_ops_ok: Number of successful GetXStats operations. -

    • GetXStats_sum: Sum of timings for GetXStats operations. -

    • GetXStats_sqr: Sum of squares of sample timings for GetXStats -operations. -

    • GetXStats_min: Minimum execution time observed for GetXStats -operations. -

    • GetXStats_max: Maximum execution time observed for GetXStats -operations. -
    -

    Byte Information for Certain RPC Operations Group (RPCopBytes_group) -

      -

    • FetchData_xfers: Number of FetchData operations. -

    • FetchData_xfers_ok: Number of successful FetchData -operations. -

    • FetchData_xfers_sum: Sum of timing values for FetchData -operations. -

    • FetchData_xfers_sqr: Sum of squares of sample timings for FetchData -operations. -

    • FetchData_xfers_min: Minimum transfer time observed for FetchData -operations. -

    • FetchData_xfers_max: Maximum transfer time observed for FetchData -operations. -

    • FetchData_xfers_bytes_sum: Sum of bytes transferred for FetchData -operations. -

    • FetchData_xfers_bytes_min: Minimum byte transfer observed for -FetchData operations. -

    • FetchData_xfers_bytes_max: Maximum byte transfer observed for -FetchData operations. -

    • FetchData_xfers_bucket0: Tally in bucket0 for FetchData -operations. -

    • FetchData_xfers_bucket1: Tally in bucket1 for FetchData -operations. -

    • FetchData_xfers_bucket2: Tally in bucket2 for FetchData -operations. -

    • FetchData_xfers_bucket3: Tally in bucket3 for FetchData -operations. -

    • FetchData_xfers_bucket4: Tally in bucket4 for FetchData -operations. -

    • FetchData_xfers_bucket5: Tally in bucket5 for FetchData -operations. -

    • FetchData_xfers_bucket6: Tally in bucket6 for FetchData -operations. -

    • FetchData_xfers_bucket7: Tally in bucket7 for FetchData -operations. -

    • FetchData_xfers_bucket8: Tally in bucket8 for FetchData -operations. -

    • StoreData_xfers: Number of StoreData operations. -

    • StoreData_xfers_ok: Number of successful StoreData -operations. -

    • StoreData_xfers_sum: Sum of timing values for StoreData -operations. -

    • StoreData_xfers_sqr: Sum of squares of sample timings for StoreData -operations. -

    • StoreData_xfers_min: Minimum transfer time observed for StoreData -operations. -

    • StoreData_xfers_max: Maximum transfer time observed for StoreData -operations. -

    • StoreData_xfers_bytes_sum: Sum of bytes transferred for StoreData -operations. -

    • StoreData_xfers_bytes_min: Minimum byte transfer observed for -StoreData operations. -

    • StoreData_xfers_bytes_max: Maximum byte transfer observed for -StoreData operations. -

    • StoreData_xfers_bucket0: Tally in bucket0 for StoreData -operations. -

    • StoreData_xfers_bucket1: Tally in bucket1 for StoreData -operations. -

    • StoreData_xfers_bucket2: Tally in bucket2 for StoreData -operations. -

    • StoreData_xfers_bucket3: Tally in bucket3 for StoreData -operations. -

    • StoreData_xfers_bucket4: Tally in bucket4 for StoreData -operations. -

    • StoreData_xfers_bucket5: Tally in bucket5 for StoreData -operations. -

    • StoreData_xfers_bucket6: Tally in bucket6 for StoreData -operations. -

    • StoreData_xfers_bucket7: Tally in bucket7 for StoreData -operations. -

    • StoreData_xfers_bucket8: Tally in bucket8 for StoreData -operations. -
    -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd025.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd025.htm deleted file mode 100755 index 793a3c569..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd025.htm +++ /dev/null @@ -1,1079 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic] [Next Topic] [Index]

    -


    Appendix D. AIX Audit Events

    -

    This Appendix provides a complete listing of the AFS events -that can be audited on AIX file server machines. See Chapter Monitoring and Auditing AFS Performance for instructions on auditing AFS events on AIX file server -machines. - -


    Introduction

    -

    Below is a list of the AFS events contained in the file -/afs/usr/local/audit/events.sample. Each entry -contains information on the event class, the name of the event, the parameters -associated with the event, and a description of the event. -

    Most events have an associated error code that shows the outcome of the -event (since each event is recorded after it occurs), an AFSName (the -authentication identify of the requesting process), and a host ID (from which -the request originated). Many events follow the RPC server entry calls -defined in the AFS Programmer's Reference Manual. -

    Events are classed by functionality (this is AIX specific). Some -events possibly fall into one of more of the following classes which are -defined by the file /usr/afs/local/config.sample: -

      -

    • A (afsauthent): Authentication and Identification Events -

    • S (afssecurity): Security Events -

    • P (afsprivilege): Privilege Required Events -

    • O (afsobjects): Object Creation and Deletion Events -

    • M (afsattributes): Attribute modification -

    • C (afsprocess): Process Control Events -
    -

    Audit-Specific Events

    -
    - - - - - - -
    Event -Class -Parameters -Description -
    AFS_Audit_WR -None -<string> -The file "/usr/afs/Audit" has been written to (AIX specific -event). -
    AFS_Aud_On -S -ECode -Auditing is on for this server process (recorded on startup of a -server). -
    AFS_Aud_Off -S -ECode -Auditing is off for this server process (recorded on startup of a -server). -
    AFS_Aud_Unauth -S -ECode Event -Event triggered by an unauthorized user. -
    -
    Note:The following audit-specific events indicate an error has occurred while -recording the event. Most events have an AFSName associated with them -and a host ID. If this information cannot be gathered out of the Rx -structure, one of these events is raised. -
    -
    - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_Aud_NoCall -S -ECode Event -No rx call structure with this event. Cannot get security, AFS ID, -or origin of call. -
    AFS_Aud_NoConn -S -ECode Event -No connection info associated with rx call. Cannot get security, -AFS ID, or origin of call. -
    AFS_Aud_UnknSec -S -ECode Event -Security of call is unknown (must be authorized or unauthorized -caller). -
    AFS_Aud_NoAFSId -S -ECode Event -No AFS ID/name associated with a secure event. -
    AFS_Aud_NoHost -S -ECode Event -No information about origin (machine) of caller. -
    AFS_Aud_EINVAL -None -Event -Error in audit event parameter (can't record the event -parameter). -
    -

    Volume Server Events

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_VS_Start -P C -ECode -The volume server has started. -
    AFS_VS_Finish -C -ECode -The volume server has finished. Finish events are rare since the -server process is normally aborted. -
    AFS_VS_Exit -C -ECode -The volume server has exited. Exit events are rare since the -server process is normally aborted. -
    AFS_VS_TransCr -None -ECode AFSName HostID Trans VolID -AFSVolTransCreate - Create transaction for a [volume, partition] -
    AFS_VS_EndTrn -None -ECode AFSName HostID Trans -AFSVolEndTrans - End a transaction. -
    AFS_VS_CrVol -P O -ECode AFSName HostID Trans VolID VolName Type ParentID -AFSVolCreateVolume - Create a volume (volumeId volumeName) -
    AFS_VS_DelVol -P O -ECode AFSName HostID Trans -AFSVolDeleteVolume - Delete a volume. -
    AFS_VS_NukVol -P O -ECode AFSName HostID VolID -AFSVolNukeVolume - Obliterate a volume completely (volume ID). -
    AFS_VS_Dump -None -ECode AFSName HostID Trans -AFSVolDump - Dump the contents of a volume. -
    AFS_VS_SigRst -P M -ECode AFSName HostID VolName -AFSVolSignalRestore - Show intention to call AFSVolRestore. -
    AFS_VS_Restore -P O -ECode AFSName HostID Trans -AFSVolRestore - Recreate a volume from a dump. -
    AFS_VS_Forward -P O -ECode AFSName HostID FromTrans Host DestTrans -AFSVolForward - Dump a volume, then restore to a given server and -volume. -
    AFS_VS_Clone -P O -ECode AFSName HostID Trans Purge NewName NewType NewVolID -AFSVolClone - Clone (and optionally purge) a volume. -
    AFS_VS_ReClone -P O -ECode AFSName HostID Trans CloneVolID -AFSVolReClone - Reclone a volume. -
    AFS_VS_SetForw -P M -ECode AFSName HostID Trans NewHost -AFSVolSetForwarding - Set forwarding information for a moved -volume. -
    AFS_VS_GetFlgs -None -ECode AFSName HostID Trans -AFSVolGetFlags - Get volume flags for a transaction. -
    AFS_VS_SetFlgs -P M -ECode AFSName HostID Trans Flags -AFSVolSetFlags - Set volume flags for a transaction. -
    AFS_VS_GetName -None -ECode AFSName HostID Trans -AFSVolGetName - Get the volume name associated with a transaction. -
    AFS_VS_GetStat -None -ECode AFSName HostID Trans -AFSVolGetStatus - Get status of a transaction/volume. -
    AFS_VS_SetIdTy -P M -ECode AFSName HostID Trans VolName Type ParentId CloneID BackupID -AFSVolSetIdsTypes - Set header information for a volume. -
    AFS_VS_SetDate -P M -ECode AFSName HostID Trans Date -AFSVolSetDate - Set creation date in a volume. -
    AFS_VS_ListPar -None -ECode AFSName HostID -AFSVolListPartitions - Return a list of AFS partitions on a -server. -
    AFS_VS_ParInf -None -ECode AFSName HostID PartName -AFSVolPartitionInfo - Get partition information. -
    AFS_VS_ListVol -None -ECode AFSName HostID -AFSVolListVolumes - Return a list of volumes on a server. -
    AFS_VS_XLstVol -None -ECode AFSName HostID -AFSVolXListVolumes - Return a (detailed) list of volumes on a -server. -
    AFS_VS_Lst1Vol -None -ECode AFSName HostID VolID -AFSVolListOneVolume - Return header information for a single -volume. -
    AFS_VS_XLst1Vl -None -ECode AFSName HostID VolID -AFSVolXListOneVolume - Return (detailed) header information for a single -volume. -
    AFS_VS_GetNVol -None -ECode AFSName HostID VolID -AFSVolGetNthVolume - Get volume header given its index. -
    AFS_VS_Monitor -None -ECode AFSName HostID -AFSVolMonitor - Collect server transaction state. -
    AFS_VS_SetInfo -P O M -ECode AFSName HostID Trans -AFSVolSetInfo - Set volume status. -
    -

    Backup Server Events

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_BUDB_Start -P -ECode -The backup server has started. -
    AFS_BUDB_Finish -None -ECode -The backup server has finished. Finish events are rare since the -server process is normally aborted. -
    AFS_BUDB_Exit -None -ECode -The backup server has exited. Exit events are rare since the -server process is normally aborted. -
    AFS_BUDB_CrDmp -P O -ECode AFSName HostID dumpId -BUDB_CreateDump - Create a new dump. -
    AFS_BUDB_AppDmp -P -ECode AFSName HostID dumpId -BUDB_makeDumpAppended - Make the dump an appended dump. -
    AFS_BUDB_DelDmp -P O -ECode AFSName HostID dumpId -BUDB_DeleteDump - Delete a dump. -
    AFS_BUDB_FinDmp -P -ECode AFSName HostID dumpId -BUDB_FinishDump- Notify buserver that dump is finished. -
    AFS_BUDB_UseTpe -P M -ECode AFSName HostID dumpId -BUDB_UseTape - Create/add a tape entry to a dump. -
    AFS_BUDB_DelTpe -P M -ECode AFSName HostID dumpId -BUDB_DeleteTape - Remove a tape from the database. -
    AFS_BUDB_FinTpe -P -ECode AFSName HostID dumpId -BUDB_FinishTape - Writing to a tape is completed. -
    AFS_BUDB_AddVol -P M -ECode AFSName HostID volId -BUDB_AddVolume - Add a volume to a particular dump and tape. -
    AFS_BUDB_GetTxV -None -ECode AFSName HostID Type -BUDB_GetTextVersion - Get the version number for -hosts/volume-sets/dump-hierarchy. -
    AFS_BUDB_GetTxt -P -ECode AFSName HostID Type -BUDB_GetText - Get the information about -hosts/volume-sets/dump-hierarchy. -
    AFS_BUDB_SavTxt -M -ECode AFSName HostID Type -BUDB_SaveText - Overwrite the information about -hosts/volume-sets/dump-hierarchy. -
    AFS_BUDB_GetLck -None -ECode AFSName HostID -BUDB_GetLock - Take a lock for reading/writing text information. -
    AFS_BUDB_FrALck -None -ECode AFSName HostID -BUDB_FreeLock - Free a lock. -
    AFS_BUDB_FreLck -None -ECode AFSName HostID -BUDB_FreeAllLocks - Free all locks. -
    AFS_BUDB_GetIId -None -ECode AFSName HostID -BUDB_GetInstanceId - Get lock instance id. -
    AFS_BUDB_DmpDB -None -ECode AFSName HostID -BUDB_DumpDB - Start dumping the database. -
    AFS_BUDB_RstDBH -None -ECode AFSName HostID -BUDB_RestoreDbHeader - Restore the database header. -
    AFS_BUDB_DBVfy -None -ECode AFSName HostID -BUDB_DbVerify - Verify the database. -
    AFS_BUDB_FndDmp -P -ECode AFSName HostID volName -BUDB_FindDump - Find the dump a volume belongs to. -
    AFS_BUDB_GetDmp -P -ECode AFSName HostID -BUDB_GetDumps - Get a list of dumps in the database. -
    AFS_BUDB_FnLTpe -P -ECode AFSName HostID dumpId -BUDB_FindLastTape - Find last tape, and last volume on tape of a -dump. -
    AFS_BUDB_GetTpe -P -ECode AFSName HostID -BUDB_GetTapes - Find a list of tapes based on name or dump ID. -
    AFS_BUDB_GetVol -P -ECode AFSName HostID -BUDB_GetVolumes - Find a list of volumes based on dump or tape -name. -
    AFS_BUDB_DelVDP -P M -ECode AFSName HostID dumpSetName -BUDB_DeleteVDP - Delete dumps with given name and dump path. -
    AFS_BUDB_FndCln -P M -ECode AFSName HostID volName -BUDB_FindClone - Find clone time of volume. -
    AFS_BUDB_FndLaD -P -ECode AFSName HostID volName -BUDB_FindLatestDump - Find the latest dump a volume belongs to. -
    AFS_BUDB_TGetVr -None -ECode AFSName HostID -BUDB_T_GetVersion - Test Get version. -
    AFS_BUDB_TDmpHa -P -ECode AFSName HostID file -BUDB_T_DumpHashTable - Test dump of hash table. -
    AFS_BUDB_TDmpDB -P -ECode AFSName HostID file -BUDB_T_DumpDatabase - Test dump of database. -
    -

    Protection Server Events

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_PTS_Start -P -ECode -The protection server has started. -
    AFS_PTS_Finish -C -ECode -The protection server has finished. Finish events are rare since -the server process is normally aborted. -
    AFS_PTS_Exit -C -ECode -The protection server has exited. Exit events are rare since the -server process is normally aborted. -
    AFS_PTS_NmToId -None -ECode AFSName HostID -PR_NameToID - Perform one or more name-to-ID translations. -
    AFS_PTS_IdToNm -None -ECode AFSName HostID GroupId -PR_IDToName - Perform one or more ID-to-name translations. -
    AFS_PTS_NewEnt -None -ECode AFSName HostID GroupId Name OwnerId -PR_NewEntry - Create a PDB (Protection DataBase) entry for the given -name. -
    AFS_PTS_INewEnt -None -ECode AFSName HostID GroupId Name OwnerId -PR_INewEntry - Create a PDB entry for the given name and ID. -
    AFS_PTS_LstEnt -None -ECode AFSName HostID GroupId -PR_ListEntry - Get the contents of a PDB entry based on its ID. -
    AFS_PTS_DmpEnt -None -ECode AFSName HostID Position -PR_DumpEntry - Get the contents of a PDB entry based on its -offset. -
    AFS_PTS_ChgEnt -None -ECode AFSName HostID GroupId NewName NewOwnerId NewId -PR_ChangeEntry - Change an existing PDB entry's ID, name, owner, or -a combination. -
    AFS_PTS_SetFEnt -None -ECode AFSName HostID GroupId -PR_SetFieldsEntry - Change miscellaneous fields in an existing PDB -entry. -
    AFS_PTS_Del -None -ECode AFSName HostID GroupId -PR_Delete - Delete an existing PDB entry. -
    FS_PTS_WheIsIt -None -ECode AFSName HostID GroupId Position -PR_WhereIsIt - Get the PDB byte offset of the entry for a given -ID. -
    AFS_PTS_AdToGrp -None -ECode AFSName HostID GroupId UserId -PR_AddToGroup - Add a user to a group. -
    AFS_PTS_RmFmGrp -None -ECode AFSName HostID GroupId UserId -PR_RemoveFromGroup - Remove a user from a chosen group. -
    AFS_PTS_LstMax -None -ECode AFSName HostID -PR_ListMax - Get the largest allocated user and group ID. -
    AFS_PTS_SetMax -None -ECode AFSName HostID GroupId flag -PR_SetMax - Set the largest allocated user and group ID. -
    AFS_PTS_LstEle -None -ECode AFSName HostID GroupId -PR_ListElements - List all IDs associated with a user or group. -
    AFS_PTS_GetCPS -None -ECode AFSName HostID GroupId -PR_GetCPS - Get the CPS (Current Protection Subdomain) for the given -ID. -
    AFS_PTS_GetCPS2 -None -ECode AFSName HostID GroupId Host -PR_GetCPS2 - Get the CPS for the given id and host. -
    AFS_PTS_GetHCPS -None -ECode AFSName HostID Host -PR_GetHostCPS - Get the CPS for the given host. -
    AFS_PTS_LstOwn -None -ECode AFSName HostID GroupId -PR_ListOwned - Get all IDs owned by the given ID. -
    AFS_PTS_IsMemOf -None -ECode AFSName HostID UserId GroupId -PR_IsAMemberOf - Is a given user ID a member of a specified group? -
    -

    Authentication Events

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_KAA_ChPswd -S -ECode AFSName HostID name instance -KAA_ChangePassword - Change password. -
    AFS_KAA_Auth -A S -ECode AFSName HostID name instance -KAA_Authenticate - Authenticate to the cell. -
    AFS_KAA_AuthO -S -ECode AFSName HostID name instance -KAA_Authenticate_old - Old style authentication. -
    AFS_KAT_GetTkt -A S -ECode AFSName HostID name instance -KAT_GetTicket - An attempt was made to get an AFS ticket for some -principal listed in the Authentication Database. -
    AFS_KAT_GetTktO -S -ECode AFSName HostID name instance -KAT_GetTicket_old - An attempt was made to get an AFS ticket for some -principal listed in the Authentication Database. -
    AFS_KAM_CrUser -S P -ECode AFSName HostID name instance -KAM_CreateUser - Create a user. -
    AFS_KAM_DelUser -S P -ECode AFSName HostID name instance -KAM_DeleteUser - Delete a user. -
    AFS_KAM_SetPswd -S -ECode AFSName HostID name instance -KAM_SetPassword - Set the password for a user. -
    AFS_KAM_GetPswd -S -ECode AFSName HostID name -KAM_GetPassword - Get the password of a user. -
    AFS_KAM_GetEnt -S -ECode AFSName HostID name instance -KAM_GetEntry - The RPC made by the kas examine command to get -one entry from the Authentication Database (by index entry). -
    AFS_KAM_LstEnt -S -ECode AFSName HostID index -KAM_ListEntry - The RPC made to list one or more entries in the -Authentication Database. -
    AFS_KAM_Dbg -S -ECode AFSName HostID -KAM_Debug - The RPC that produces a debugging trace for the -Authentication Server. -
    AFS_KAM_SetFld -S P -ECode AFSName HostID name instance flags date lifetime maxAssoc -KAM_SetFields - The RPC used by the kas setfields command to -manipulate the Authentication Database. -
    AFS_KAM_GetStat -S -ECode AFSName HostID -KAM_GetStatus - An RPC used to get statistics on the Authentication -Server. -
    AFS_KAM_GRnKey -S -ECode AFSName HostID -KAM_GetRandomKey - An RPC used to generate a random encryption -key. -
    AFS_UnlockUser -S -ECode AFSName HostID name instance -KAM_Unlock - The RPC used to initiate the kas unlock -command. -
    AFS_LockStatus -None -ECode AFSName HostID name instance -KAM_LockStatus - The RPC used to determine whether a user's -Authentication Database entry is locked. -
    AFS_UseOfPriv -P -ECode AFSName HostID name instance cell -An authorized command was issued and allowed because the user had -privilege. -
    AFS_UnAth -S -ECode AFSName HostID name instance cell -An authorized command was issued and allowed because the system was -running in noauth mode. -
    AFS_UDPAuth -A S -ECode name instance -An authentication attempt was made with a Kerberos client. -
    AFS_UDPGetTckt -A S -ECode name instance cell name instance -An attempt was made to get a Kerberos ticket. -
    AFS_RunNoAuth -S -ECode -Check was made and some random server is running noauth. -
    AFS_NoAuthDsbl -S P -ECode -Server is set to run in authenticated mode. -
    AFS_NoAuthEnbl -S P -ECode -Server is set to run in unauthenticated mode. -
    -

    File Server and Cache Manager Interface Events

    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_SRX_FchACL -None -ECode AFSName HostID (FID) -RXAFS_FetchACL - Fetch the ACL associated with the given AFS file -identifier. -
    AFS_SRX_FchStat -None -ECode AFSName HostID (FID) -RXAFS_FetchStatus - Fetch the status information for a file system -object. -
    AFS_SRX_StACL -M -ECode AFSName HostID (FID) -RXAFS_StoreACL - Associate an ACL with the names directory. -
    AFS_SRX_StStat -M -ECode AFSName HostID (FID) -RXAFS_StoreStatus - Store status information for the specified -file. -
    AFS_SRX_RmFile -O -ECode AFSName HostID (FID) name -RXAFS_RemoveFile - Delete the given file. -
    AFS_SRX_CrFile -O -ECode AFSName HostID (FID) name -RXAFS_CreateFile - Create the given file. -
    AFS_SRX_RNmFile -O M -ECode AFSName HostID (oldFID) oldName (newFID) newName -RXAFS_Rename - Rename the specified file in the given directory. -
    AFS_SRX_SymLink -O -ECode AFSName HostID (FID) name -RXAFS_Symlink - Create a symbolic link. -
    AFS_SRX_Link -O -ECode AFSName HostID (FID) name (FID) -RXAFS_Link - Create a hard link. -
    AFS_SRX_MakeDir -O -ECode AFSName HostID (FID) name -RXAFS_MakeDir - Create a directory. -
    AFS_SRX_RmDir -O -ECode AFSName HostID (FID) name -RXAFS_RemoveDir - Remove a directory. -
    AFS_SRX_SetLock -None -ECode AFSName HostID (FID) type -RXAFS_SetLock - Set an advisory lock on the given file identifier. -
    AFS_SRX_ExtLock -None -ECode AFSName HostID (FID) -RXAFS_ExtendLock - Extend an advisory lock on a file. -
    AFS_SRX_RelLock -None -ECode AFSName HostID (FID) -RXAFS_ReleaseLock - Release the advisory lock on a file. -
    AFS_SRX_FchData -None -ECode AFSName HostID (FID) -StartRXAFS_FetchData - Begin a request to fetch file data. -
    AFS_SRX_StData -O -ECode AFSName HostID (FID) -StartRXAFS_StoreData - Begin a request to store file data. -
    AFS_SRX_BFchSta -None -ECode AFSName HostID (FID) -RXAFS_BulkStatus - Fetch status information regarding a set of file -system objects. -
    AFS_SRX_SetVolS -M -ECode AFSName HostID volId volName -RXAFS_SetVolumeStatus - Set the basic status information for the named -volume. -
    AFS_Priv -P -ECode viceId callRoutine -Checking Permission Rights of user - user has permissions. -
    AFS_PrivSet -P -ECode viceId callRoutine -Set the privileges of a user. -
    -

    BOS Server Events

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_BOS_CreBnod -P C -ECode AFSName HostID -BOZO_CreateBnode - Create a process instance. -
    AFS_BOS_DelBnod -P C -ECode AFSName HostID instance -BOZO_DeleteBnode - Delete a process instance. -
    AFS_BOS_SetReSt -P M C -ECode AFSName HostID -BOZO_Restart - Restart a given process instance. -
    AFS_BOS_GetLog -P -ECode AFSName HostID -StartBOZO_GetLog - Pass the IN params when fetching a BOS Server log -file. -
    AFS_BOS_SetStat -P M C -ECode AFSName HostID instance -BOZO_SetStatus - Set process instance status and goal. -
    AFS_BOS_SetTSta -P M C -ECode AFSName HostID instance -BOZO_SetTStatus - Temporarily set process instance status and -goal. -
    AFS_BOS_StartAl -P C -ECode AFSName HostID -BOZO_StartupAll - Start all existing process instances. -
    AFS_BOS_ShtdAll -P C -ECode AFSName HostID -BOZO_ShutdownAll - Shut down all process instances. -
    AFS_BOS_ReStAll -P C -ECode AFSName HostID -BOZO_RestartAll - Shut down, then restart all process instances. -
    AFS_BOS_ReBos -P C -ECode AFSName HostID -BOZO_ReBozo - Shut down, then restart all process instances and the BOS -Server itself. -
    AFS_BOS_ReBosIn -P C -ECode -BOZO_ReBozo - Same as AFS_BOS_ReBos but done internally (server -restarts). -
    AFS_BOS_ReStart -P C -ECode AFSName HostID instance -BOZO_Restart - Restart a given process instance. -
    AFS_BOS_WaitAll -P C -ECode AFSName HostID -BOZO_WaitAll - Wait until all process instances have reached their -goals. -
    AFS_BOS_AddSUsr -S P -ECode AFSName HostID -BOZO_AddSUser - Add a user to the UserList. -
    AFS_BOS_DelSUsr -S P -ECode AFSName HostID -BOZO_DeleteSUser - Delete a user from the UserList. -
    AFS_BOS_LstSUsr -None -ECode AFSName HostID -BOZO_ListSUsers - Get the name of the user in the given position in the -UserList file. -
    AFS_BOS_LstKey -P -ECode AFSName HostID -BOZO_ListKeys - List information about the key at a given index in the -key file. -
    AFS_BOS_LstKeyU -P -ECode AFSName HostID -BOZO_ListKeys - Same as AFS_BOS_LstKey, but unauthorized. -
    AFS_BOS_AddKey -S P -ECode AFSName HostID -BOZO_AddKey - Add a key to the key file. -
    AFS_BOS_DelKey -S P -ECode AFSName HostID -BOZO_DeleteKey - Delete the entry for an AFS key. -
    AFS_BOS_SetNoAu -S P -ECode AFSName HostID flag -BOZO_SetNoAuthFlag - Enable or disable authenticated call -requirements. -
    AFS_BOS_SetCell -S P -ECode AFSName HostID name -BOZO_SetCellName - Set the name of the cell to which the BOS Server -belongs. -
    AFS_BOS_AddHst -S P -ECode AFSName HostID name -BOZO_AddCellHost - Add an entry to the list of database server -hosts. -
    AFS_BOS_DelHst -S P -ECode AFSName HostID name -BOZO_DeleteCellHost - Delete an entry from the list of database server -hosts. -
    AFS_BOS_Inst -P O M -ECode AFSName HostID name - -

    StartBOZO_Install - Pass the IN parameters when installing a server -binary. -

    EndBOZO_Install - Get the OUT parameters when installing a server -binary. -

    AFS_BOS_UnInst -P O M -ECode AFSName HostID name -BOZO_UnInstall - Roll back from a server binary installation. -
    AFS_BOS_PrnLog -P O -ECode AFSName HostID -BOZO_Prune - Throw away old versions of server binaries and core -file. -
    AFS_BOS_Exec -P C -ECode AFSName HostID cmd -BOZO_Exec - Execute a shell command at the server. -
    AFS_BOS_DoExec -P C -ECode exec -The bosserver process was restarted. -
    AFS_BOS_StpProc -P C -ECode cmd -An RPC to stop any process controlled by the BOS Server. -
    -

    Volume Location Server Events

    -
    - - - - - - - - - -
    Event -Class -Parameters -Description -
    AFS_VL_CreEnt -P M -ECode AFSName HostID name -VL_CreateEntry - Create a VLDB entry. -
    AFS_VL_DelEnt -P M -ECode AFSName HostID volID -VL_DeleteEntry - Delete a VLDB entry. -
    AFS_VL_GetNVlID -None -ECode AFSName HostID -VL_GetNewVolumeId - Generate a new volume ID. -
    AFS_VL_RepEnt -P M -ECode AFSName HostID volID -VL_ReplaceEntry - Replace entire contents of VLDB entry. -
    AFS_VL_UpdEnt -P M -ECode AFSName HostID volID -VL_UpdateEntry - Update contents of VLDB entry. -
    AFS_VL_SetLck -P -ECode AFSName HostID volID -VL_SetLock - Lock VLDB entry. -
    AFS_VL_RelLck -P -ECode AFSName HostID volID -VL_ReleaseLock - Unlock VLDB entry. -
    -

    -


    [Return to Library] [Contents] [Previous Topic] [Top of Topic] [Next Topic] [Index]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd026.htm b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd026.htm deleted file mode 100755 index c4bafbb62..000000000 --- a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/auagd026.htm +++ /dev/null @@ -1,7140 +0,0 @@ - - -Administration Guide - - - - - - - - - - - -

    Administration Guide

    -

    [Return to Library] [Contents] [Previous Topic] [Bottom of Topic]

    -


    Index

    -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -
    -A - -
  • a ACL permission -(1) -
  • A instruction - -
  • uss template file -(1) -
  • -
  • access - -
  • permissions on ACL (see entries: permissions on ACL, ACL) -(1) -
  • control list, see entry: ACL -(1) -
  • count, in volume header -(1) -
  • transparent (AFS feature) -(1) -
  • -
  • ACL - -
  • adding entries -(1) -
  • auxiliary permissions -(1) -
  • cleaning -(1) -
  • clearing -(1) -
  • compared to UNIX protection -(1) -
  • copying between directories -(1) -
  • default on new volume -(1) -
  • displaying -(1) -
  • editing entries -(1) -
  • foreign users on -(1) -
  • group entries, usefulness -(1) -
  • normal vs. negative permissions -(1) -
  • permissions defined -(1) -
  • removing entries -(1) -
  • removing obsolete AFS IDs -(1) -
  • replacing all entries -(1) -
  • setting entries -(1) -
  • setting for directory with uss -(1) -
  • setting on user home directory with uss -(1) -
  • shorthand notation for grouping permissions -(1) -
  • system groups on -(1) -
  • -
  • active - -
  • clients statistic from scout program -(1) -
  • state of fstrace event set -(1) -
  • -
  • adding - -
  • ACL entry - -
  • negative permissions -(1) -
  • normal permissions -(1) -
  • -
  • ADMIN flag to Authentication Database entry -(1) -
  • CellServDB file (server) entry for database server machine -(1) -
  • database server machine - -
  • to client CellServDB file and kernel memory -(1) -
  • to server CellServDB file -(1) -
  • -
  • disk to file server machine -(1) -
  • members to groups -(1) -
  • read-only site definition in VLDB -(1) -
  • server encryption key to KeyFile file -(1) -
  • system:administrators group members -(1) -
  • UserList file users -(1) -
  • -
  • ADMIN flag in Authentication Database entry - -
  • displaying -(1) -
  • privileges resulting -(1) -
  • setting or removing -(1) -
  • -
  • administer ACL permission - -
  • see entry: a ACL permission -(1) -
  • -
  • administering - -
  • client machine -(1) -
  • server machine -(1) -
  • user accounts -(1) -
  • -
  • administrative database - -
  • about replicating -(1) -
  • backing up -(1) -
  • restoring -(1) -
  • -
  • administrative privilege - -
  • three types -(1) -
  • -
  • AFS - -
  • root directory (/afs) - -
  • on client machine -(1) -
  • -
  • auditing events on AIX server machines -(1) -
  • authentication separate from UNIX -(1) -
  • differences from UNIX summarized -(1) -
  • global namespace -(1) -
  • initialization script -(1) -
  • reducing traffic in -(1) -
  • root directory (/afs) - -
  • in cell filespace -(1) -
  • -
  • security features -(1) -
  • server encryption key (see entry: server encryption key) -(1) -
  • server processes used in -(1) -
  • UID see entry: AFS UID -(1) -
  • -
  • afs entry in Authentication Database - -
  • displaying -(1) -
  • setting server encryption key -(1) -
  • -
  • AFS GID - -
  • counter for automatic allocation, displaying and setting -(1) -
  • definition -(1) -
  • displaying - -
  • for all groups in Protection Database -(1) -
  • for one group -(1) -
  • -
  • removing obsolete from ACL -(1) -
  • -
  • AFS UID - -
  • assigning - -
  • with pts createuser command -(1) -
  • with uss -(1) -
  • -
  • counter for automatic allocation, displaying and setting -(1) -
  • definition -(1) -
  • displaying - -
  • for all users and machines in Protection Database -(1) -
  • for one user or machine -(1) -
  • -
  • matching with UNIX UID -(1), (2) -
  • removing obsolete from ACL -(1) -
  • reserved - -
  • anonymous user -(1) -
  • system-defined groups -(1) -
  • -
  • reusing, about -(1) -
  • setting counters for automatic allocation -(1) -
  • -
  • AFSCELL environment variable -(1) -
  • AFSCONF environment variable (NFS/AFS Translator) -(1) -
  • afsd program -(1) -
  • afsmonitor program - -
  • available statistics -(1) -
  • Cache Manager statistics -(1) -
  • command syntax -(1) -
  • creating an output file -(1) -
  • creating configuration files for -(1) -
  • features summarized -(1) -
  • file server statistics -(1) -
  • requirements for running -(1) -
  • screen layout -(1) -
  • setting terminal type -(1) -
  • stopping -(1) -
  • -
  • AFSSERVER environment variable (NFS/AFS Translator) -(1) -
  • afszcm.cat file -(1) -
  • AIX - -
  • auditing AFS events - -
  • about -(1) -
  • list of available events -(1) -
  • -
  • configuring tape device -(1) -
  • -
  • all shorthand for ACL permissions -(1) -
  • all-or-nothing release of read-only volumes -(1) -
  • anonymous user - -
  • AFS UID reserved -(1) -
  • identity assigned to unauthenticated user -(1) -
  • -
  • archiving - -
  • tapes in Backup System -(1) -
  • -
  • ASK instruction in CFG_device_name file -(1) -
  • assigning - -
  • AFS GID to group -(1) -
  • AFS UID to machine -(1) -
  • AFS UID to user -(1) -
  • AFS UID with uss -(1) -
  • -
  • asynchrony - -
  • enabling for Cache Manager write operations -(1) -
  • when AFS files saved on NFS clients -(1) -
  • -
  • at-sys (@sys) variable in pathnames -(1) -
  • auditing AFS events on AIX server machines -(1) -
  • authenticated identity - -
  • acquiring with klog command -(1) -
  • -
  • authentication - -
  • AFS compared to UNIX -(1) -
  • AFS separate from UNIX -(1) -
  • compared to authorization checking -(1) -
  • consequences of multiple failures -(1) -
  • improving security -(1) -
  • -
  • Authentication Database - -
  • afs entry -(1) -
  • changing username -(1) -
  • entry - -
  • creating with kas create command -(1) -
  • creating with uss -(1) -
  • deleting with uss -(1) -
  • removing -(1) -
  • -
  • password - -
  • setting -(1) -
  • -
  • password lifetime, setting -(1), (2) -
  • server encryption key - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • site for AFS server encryption key -(1) -
  • -
  • Authentication Server - -
  • about starting and stopping -(1) -
  • as kaserver process -(1) -
  • binary in /usr/afs/bin -(1) -
  • description -(1) -
  • displaying log file -(1) -
  • restarting after adding entry to server CellServDB file -(1) -
  • restarting after removing entry from server CellServDB file -(1) -
  • runs on database server machine -(1) -
  • when to contact -(1) -
  • -
  • AuthLog file -(1) - -
  • displaying -(1) -
  • -
  • authorization checking - -
  • and restarting processes -(1) -
  • compared to authentication -(1) -
  • controlling cell-wide -(1) -
  • defined -(1) -
  • disabling -(1) -
  • enabling -(1) -
  • -
  • automatic - -
  • process restarts by BOS Server -(1) -
  • update to admin. databases by Ubik -(1) -
  • -
  • automating - -
  • tape mounting and unmounting by Backup System -(1) -
  • creation of backup volumes -(1) -
  • -
  • AUTOQUERY instruction in CFG_device_name file -(1) -
  • auxiliary ACL permissions -(1) -
  • availability of data - -
  • interrupted by dumping -(1) -
  • -
  • -B - -
  • B instruction - -
  • package configuration file -(1) -
  • -
  • backing up - -
  • administrative databases -(1) -
  • Backup Database to tape -(1) -
  • data from AFS volumes -(1) -
  • -
  • backup commands - -
  • adddump -(1) -
  • addhost -(1) -
  • addvolentry -(1) -
  • addvolset -(1) -
  • binary in /usr/afs/bin -(1) -
  • dbverify -(1) -
  • deldump -(1) -
  • deletedump -(1) -
  • delhost -(1) -
  • delvolentry -(1) -
  • delvolset -(1) -
  • diskrestore -(1) -
  • dump -(1) -
  • dumpinfo -(1) -
  • granting privilege for -(1) -
  • interactive mode - -
  • entering -(1) -
  • exiting -(1) -
  • -
  • jobs -(1) -
  • kill -(1) -
  • labeltape -(1) -
  • listdumps -(1) -
  • listhosts -(1) -
  • listvolsets -(1) -
  • quit -(1) -
  • readlabel -(1) -
  • restoredb -(1) -
  • savedb -(1) -
  • scantape -(1) -
  • setexp -(1) -
  • status -(1) -
  • volinfo -(1) -
  • volrestore -(1) -
  • volsetrestore -(1) -
  • -
  • Backup Database - -
  • administering -(1) -
  • backing up -(1) -
  • described -(1) -
  • dump hierarchy - -
  • displaying -(1) -
  • -
  • dump ID numbers, displaying -(1) -
  • dump levels - -
  • adding -(1) -
  • deleting -(1) -
  • displaying -(1) -
  • -
  • dump records - -
  • creating as part of dump operation -(1) -
  • displaying -(1) -
  • -
  • expiration dates -(1) - -
  • changing -(1) -
  • setting -(1) -
  • -
  • port offset numbers - -
  • displaying -(1) -
  • -
  • restoring -(1) -
  • Tape Coordinator - -
  • adding entry -(1) -
  • removing entry -(1) -
  • -
  • verifying integrity -(1) -
  • volume dump history - -
  • displaying -(1) -
  • recovering from tapes -(1) -
  • -
  • volume entry - -
  • creating -(1) -
  • deleting from volume set -(1) -
  • displaying -(1) -
  • -
  • volume set - -
  • creating -(1) -
  • deleting -(1) -
  • displaying -(1) -
  • -
  • -
  • Backup field in volume header -(1) -
  • Backup Server - -
  • about starting and stopping -(1) -
  • as buserver process -(1) -
  • binary in /usr/afs/bin -(1) -
  • description -(1) -
  • displaying log file -(1) -
  • restarting after adding entry to server CellServDB file -(1) -
  • restarting after removing entry from server CellServDB file -(1) -
  • runs on database server machine -(1) -
  • when to contact -(1) -
  • -
  • Backup System - -
  • automating operations -(1) -
  • automating tape mounting and unmounting -(1) -
  • Backup Database (see entry: Backup Database) -(1) -
  • Backup Server described -(1) -
  • configuration overview -(1) -
  • data - -
  • backing up/dumping -(1) -
  • recovering -(1) -
  • restoring -(1) -
  • -
  • dump (see entry: dump) -(1) -
  • dump hierarchy (see entry: dump hierarchy) -(1) -
  • dump history - -
  • recovering from tapes -(1) -
  • -
  • dump ID number - -
  • assigning as part of dump operation -(1) -
  • -
  • dump ID number (see entry: dump) -(1) -
  • dump level (see entry: dump hierarchy) -(1) -
  • dump name (see entry: dump) -(1) -
  • dump operation, overview -(1) -
  • dump records - -
  • deleting -(1) -
  • -
  • dump set (see entry: dump set) -(1) -
  • dumps, full and incremental defined -(1) -
  • eliminating check for proper tape name -(1) -
  • eliminating search/prompt for initial tape -(1) -
  • filemarks (see entry: Tape Coordinator) -(1) -
  • interactive mode -(1) - -
  • canceling operations -(1) -
  • displaying pending/running operations -(1) -
  • -
  • interfaces -(1) -
  • introduction -(1) -
  • job ID numbers - -
  • about -(1) -
  • displaying -(1) -
  • -
  • port offsets (see entry: Tape Coordinator) -(1) -
  • recycling schedule for tapes -(1) -
  • reducing operator intervention -(1) -
  • regular expressions -(1) -
  • restores - -
  • date-specific -(1) -
  • full -(1) -
  • -
  • restoring - -
  • backed up data -(1) -
  • backup data -(1) -
  • data -(1) -
  • -
  • running in foreign cell -(1) -
  • scanning tapes -(1) -
  • suggestions for improving efficiency -(1) -
  • Tape Coordinator (see entry: Tape Coordinator) -(1) -
  • tape name (see entry: tapes) -(1) -
  • useCount counter on tape label -(1) -
  • using default responses to errors -(1) -
  • volume dump history - -
  • recovering from tapes -(1) -
  • -
  • volume entry (see entry: volume entry) -(1) -
  • volume set (see entry: volume set) -(1) -
  • -
  • backup volume - -
  • automating creation of -(1) -
  • changing name of -(1) -
  • creating -(1) -
  • creating multiple at once -(1) -
  • defined -(1) -
  • dumping -(1) -
  • ID number in volume header -(1) -
  • mounting -(1) -
  • moving -(1) -
  • removed by read/write move -(1) -
  • removed by read/write removal -(1) -
  • space-saving nature of -(1) -
  • suggested schedule for creation of -(1) -
  • -
  • BackupLog file -(1) - -
  • displaying -(1) -
  • -
  • BAK version of binary file - -
  • created by bos install command -(1) -
  • removing obsolete -(1) -
  • used by bos uninstall command -(1) -
  • -
  • banner line on the scout program screen -(1) -
  • basenames in scout program -(1) -
  • bdb.DB0 file -(1) -
  • bdb.DBSYS1 file -(1) -
  • binary distribution machine - -
  • defined -(1) -
  • identifying with bos status -(1) -
  • -
  • block special device - -
  • creating with package -(1) -
  • -
  • bos commands - -
  • install -(1) -
  • addhost -(1) -
  • addkey - -
  • basic instructions -(1) -
  • when handling key emergency -(1) -
  • -
  • adduser -(1) -
  • binary in /usr/afs/bin -(1) -
  • create -(1) -
  • delete -(1) -
  • exec -(1) -
  • getdate -(1) -
  • getlog -(1) -
  • getrestart -(1) -
  • granting privilege for -(1) -
  • listhosts -(1) -
  • listkeys -(1) -
  • listusers -(1) -
  • mutual authentication, bypassing -(1) -
  • prune -(1) -
  • removehost -(1) -
  • removekey -(1) -
  • removeuser -(1) -
  • restart - -
  • excluding BOS Server -(1) -
  • including BOS Server -(1) -
  • selected processes -(1) -
  • with -bosserver flag -(1) -
  • -
  • salvage -(1) -
  • setauth -(1) -
  • setrestart -(1) -
  • shutdown -(1) -
  • start -(1) -
  • startup -(1) -
  • status -(1) -
  • stop -(1) -
  • summary of functions -(1) -
  • uninstall -(1) -
  • -
  • BOS Server - -
  • as bosserver process -(1) -
  • binary in /usr/afs/bin -(1) -
  • description -(1) -
  • displaying log file -(1) -
  • maintainer of server process binaries -(1) -
  • memory state -(1) -
  • monitoring server processes -(1) -
  • restart times, displaying and setting -(1) -
  • role in reboot of server machine -(1) -
  • use of BosConfig file -(1) -
  • when to contact -(1) -
  • -
  • BosConfig file -(1) - -
  • changing status flag from NotRun to Run -(1) -
  • changing status flag from Run to NotRun -(1) -
  • creating server process entry -(1) -
  • displaying entries -(1) -
  • information -(1) -
  • removing server process entry -(1) -
  • restart times defined -(1) -
  • -
  • BosLog file -(1) - -
  • displaying -(1) -
  • -
  • bosserver - -
  • (see entry: BOS Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • bulk mode in uss -(1) -
  • buserver - -
  • (see entry: Backup Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • butc command -(1) -
  • -C - -
  • C instruction - -
  • package configuration file -(1) -
  • -
  • cache files (client) -(1) -
  • Cache Manager - -
  • afsd initialization program -(1) -
  • as interpreter of mount points -(1) -
  • CellServDB file (client), using -(1) -
  • collecting data with xstat data collection facility -(1) -
  • configuring and customizing -(1) -
  • data cache - -
  • displaying size set at reboot -(1) -
  • -
  • data cache size - -
  • displaying current -(1) -
  • resetting to default value (for disk cache only) -(1) -
  • setting in cacheinfo file -(1) -
  • setting until next reboot -(1) -
  • -
  • database server processes, contacting -(1) -
  • described -(1) -
  • displaying - -
  • cache size from cacheinfo file -(1) -
  • -
  • enabling asynchrony for write operations -(1) -
  • flushing cache -(1) -
  • functions of -(1) -
  • interfaces registered with File Server -(1) -
  • messages displayed, controlling -(1) -
  • monitoring performance -(1) -
  • preference ranks for File Server and VL Server -(1) -
  • setting - -
  • cache size in cacheinfo file -(1) -
  • disk cache location -(1) -
  • home cell -(1) -
  • probe interval for File Server -(1) -
  • -
  • setuid programs -(1) -
  • system type name stored in kernel memory -(1) -
  • use of NetInfo file -(1) -
  • use of NetRestrict file -(1) -
  • xstat data collection facility libraries -(1) -
  • xstat data collections -(1) -
  • xstat example commands -(1) -
  • xstat_cm_test example command -(1) -
  • -
  • cacheinfo file -(1) - -
  • displaying contents -(1) -
  • format -(1) -
  • resetting disk cache to size specified -(1) -
  • setting - -
  • cache size -(1) -
  • disk cache location -(1) -
  • -
  • -
  • CacheItems file -(1) -
  • caching -(1) -
  • callback -(1) -
  • cell -(1) - -
  • changing list in client kernel memory -(1) -
  • filespace configuration issues -(1) -
  • foreign -(1) -
  • granting local access to foreign users -(1) -
  • local -(1) -
  • making foreign visible to local -(1) -
  • making local visible to foreign -(1) -
  • name - -
  • at second level in file tree -(1), (2), (3) -
  • choosing -(1) -
  • setting -(1) -
  • -
  • setting home cell for client machine -(1) -
  • -
  • CellServDB file (client) - -
  • about -(1), (2) -
  • central update source for clients -(1) -
  • changing -(1) -
  • copied into kernel memory -(1) -
  • correct format -(1) -
  • displaying -(1) -
  • global source from AFS Support -(1) -
  • maintaining -(1) -
  • updating with or without package -(1) -
  • -
  • CellServDB file (server) - -
  • about -(1) -
  • adding database server machine -(1) -
  • displaying -(1) -
  • effect of wrong information in -(1) -
  • importance to Ubik operation -(1) -
  • maintaining -(1) -
  • removing database server machine -(1) -
  • -
  • CellServDB file maintained by AFS Product Support - -
  • as global update source -(1) -
  • -
  • CellServDB.local file -(1) -
  • cellular mount point - -
  • see entry: mount point -(1) -
  • -
  • CFG_device_name file -(1) -
  • changing - -
  • ACL entries -(1) -
  • data cache size specified in cacheinfo file -(1) -
  • data cache size temporarily -(1) -
  • disk cache location, in cacheinfo file -(1) -
  • disk cache size to default value -(1) -
  • group ownership to self-owned -(1) -
  • group-creation quota -(1) -
  • mount point when renaming user -(1) -
  • Protection Database entry - -
  • name -(1) -
  • owner -(1) -
  • -
  • username -(1) -
  • volume name -(1) -
  • volume name when renaming user -(1) -
  • -
  • character special device - -
  • creating with package -(1) -
  • -
  • checksum -(1) -
  • chgrp command - -
  • AFS compared to UNIX -(1) -
  • -
  • chmod command - -
  • AFS compared to UNIX -(1) -
  • -
  • choosing - -
  • name - -
  • cell -(1) -
  • user -(1) -
  • user volume -(1) -
  • user volume mount point -(1) -
  • -
  • -
  • chown command - -
  • AFS compared to UNIX -(1) -
  • -
  • clearing - -
  • all ACL entries -(1) -
  • contents of trace log (fstrace) -(1) -
  • -
  • client - -
  • configuring local disk with package -(1) -
  • definition -(1) -
  • machine - -
  • definition -(1) -
  • -
  • modifying to run package -(1) -
  • -
  • client machine - -
  • /usr/vice/etc directory -(1) -
  • administering -(1) -
  • cache files -(1) -
  • CellServDB file, displaying -(1) -
  • changing CellServDB file -(1) -
  • changing list of cells in kernel memory -(1) -
  • configuration files -(1) -
  • configuration issues -(1) -
  • controlling running of setuid programs -(1) -
  • data cache size - -
  • displaying current -(1) -
  • setting in cacheinfo file -(1) -
  • setting until next reboot -(1) -
  • -
  • data cache size set at reboot - -
  • displaying -(1) -
  • -
  • database server machines, displaying knowledge of -(1) -
  • database server processes, contacting -(1) -
  • disk cache size - -
  • resetting to default value -(1) -
  • -
  • disk versus memory cache -(1) -
  • displaying - -
  • data cache size from cacheinfo file -(1) -
  • -
  • enabling access to foreign cell -(1) -
  • files required on local disk -(1) -
  • flushing data cache -(1) -
  • making foreign cell visible -(1) -
  • messages displayed, controlling -(1) -
  • monitoring performance -(1) -
  • setting - -
  • data cache size in cacheinfo file -(1) -
  • disk cache location -(1) -
  • home cell -(1) -
  • -
  • setting home cell -(1) -
  • system type name stored in Cache Manager memory -(1) -
  • -
  • client machines statistic from scout program -(1) -
  • clocks - -
  • need to synchronize for Ubik -(1) -
  • -
  • clone -(1), (2) - -
  • forcing creation of new -(1) -
  • -
  • cloning - -
  • defined -(1) -
  • for backup -(1) -
  • for replication -(1) -
  • -
  • close system call - -
  • for files saved on AFS client -(1) -
  • for files saved on NFS client -(1) -
  • -
  • cm event set (fstrace) -(1) -
  • cmfx trace log (fstrace) -(1) -
  • collecting - -
  • data with xstat data collection facility -(1) -
  • -
  • command interpreters - -
  • CellServDB file (client), using -(1) -
  • -
  • command parameters - -
  • in BosConfig file -(1) -
  • -
  • command suite - -
  • binaries - -
  • displaying time stamp -(1) -
  • installing -(1) -
  • removing obsolete -(1) -
  • uninstalling -(1) -
  • -
  • -
  • commands - -
  • afsd -(1) -
  • afsmonitor -(1) -
  • backup - -
  • to enter interactive mode -(1) -
  • -
  • backup adddump -(1) -
  • backup addhost -(1) -
  • backup addvolentry -(1) -
  • backup addvolset -(1) -
  • backup dbverify -(1) -
  • backup deldump -(1) -
  • backup deletedump -(1) -
  • backup delhost -(1) -
  • backup delvolentry -(1) -
  • backup delvolset -(1) -
  • backup diskrestore -(1) -
  • backup dump -(1) -
  • backup dumpinfo -(1) -
  • backup interactive -(1) -
  • backup jobs -(1) -
  • backup kill -(1) -
  • backup labeltape -(1) -
  • backup listdumps -(1) -
  • backup listhosts -(1) -
  • backup listvolsets -(1) -
  • backup quit -(1) -
  • backup readlabel -(1) -
  • backup restoredb -(1) -
  • backup savedb -(1) -
  • backup scantape -(1) -
  • backup setexp -(1) -
  • backup status -(1) -
  • backup volinfo -(1) -
  • backup volrestore -(1) -
  • backup volsetrestore -(1) -
  • bos addhost -(1) -
  • bos addkey -(1) -
  • bos adduser -(1) -
  • bos create -(1) -
  • bos delete -(1) -
  • bos exec -(1) -
  • bos getdate -(1) -
  • bos getlog -(1) -
  • bos getrestart -(1) -
  • bos install -(1), (2) -
  • bos listhosts -(1) -
  • bos listkeys -(1) -
  • bos listusers -(1) -
  • bos prune -(1) -
  • bos removehost -(1) -
  • bos removekey -(1) -
  • bos removeuser -(1) -
  • bos restart - -
  • excluding BOS Server -(1) -
  • including BOS Server -(1) -
  • selected processes -(1) -
  • -
  • bos salvage -(1) -
  • bos setauth -(1) -
  • bos setrestart -(1) -
  • bos shutdown -(1) -
  • bos start -(1) -
  • bos startup -(1) -
  • bos status -(1) -
  • bos stop -(1) -
  • butc -(1) -
  • chgrp (AFS compared to UNIX) -(1) -
  • chmod (AFS compared to UNIX) -(1) -
  • chown (AFS compared to UNIX) -(1) -
  • executing from uss template file -(1) -
  • fms -(1) -
  • fs checkservers -(1) -
  • fs checkvolumes -(1) -
  • fs cleanacl -(1) -
  • fs copyacl -(1) -
  • fs examine -(1), (2) -
  • fs exportafs -(1) -
  • fs flush -(1) -
  • fs flushmount -(1) -
  • fs flushvolume -(1) -
  • fs getcacheparms -(1) -
  • fs getcellstatus -(1) -
  • fs getclientaddrs -(1) -
  • fs getserverprefs -(1) -
  • fs listacl -(1) -
  • fs listcells -(1) -
  • fs listquota -(1), (2) -
  • fs lsmount -(1) -
  • fs messages -(1) -
  • fs mkmount -(1) - -
  • general instructions -(1) -
  • when changing username -(1) -
  • when creating user account -(1) -
  • when mounting backup volume -(1) -
  • when renaming volume -(1) -
  • when restoring volume -(1) -
  • -
  • fs newcell -(1) -
  • fs quota -(1) -
  • fs rmmount -(1), (2), (3), (4), (5) -
  • fs setacl -(1) - -
  • with -clear flag -(1) -
  • with -negative flag -(1) -
  • -
  • fs setcachesize -(1) -
  • fs setcell -(1) -
  • fs setclientaddrs -(1) -
  • fs setquota -(1) -
  • fs setserverprefs -(1) -
  • fs setvol -(1) -
  • fs storebehind - -
  • displaying asynchrony for specific files -(1) -
  • displaying default asynchrony -(1) -
  • setting asynchrony for specific files -(1) -
  • setting default asynchrony -(1) -
  • -
  • fs sysname -(1) -
  • fs whereis -(1) -
  • fsck (AFS compared to UNIX) -(1) -
  • fsck (AFS version) -(1) -
  • fstrace clear -(1) -
  • fstrace dump -(1) -
  • fstrace lslog -(1) -
  • fstrace lsset -(1) -
  • fstrace setlog -(1) -
  • fstrace setset -(1) -
  • ftp (AFS compared to UNIX) -(1) -
  • ftpd (AFS compared to UNIX) -(1), (2) -
  • groups (AFS compared to UNIX) -(1) -
  • inetd (AFS compared to UNIX) -(1), (2) -
  • kas create -(1) - -
  • when changing username -(1) -
  • -
  • kas delete -(1) - -
  • when changing username -(1) -
  • -
  • kas examine -(1) - -
  • to display ADMIN flag -(1) -
  • -
  • kas interactive -(1) -
  • kas setfields -(1), (2) - -
  • limiting failed authentication attempts -(1) -
  • prohibiting password reuse -(1) -
  • setting ADMIN flag -(1) -
  • setting password lifetime -(1) -
  • -
  • kas setpassword -(1), (2), (3) -
  • kas unlock -(1) -
  • klog -(1) -
  • klog with -setpag flag -(1) -
  • klog.krb -(1) -
  • knfs -(1) -
  • kpasswd -(1), (2), (3) -
  • ln (AFS compared to UNIX) -(1) -
  • mount -(1) -
  • package -(1) -
  • pagsh -(1) -
  • pagsh.krb -(1) -
  • privileged, defined -(1) -
  • pts adduser -(1) - -
  • for system:administrators group -(1) -
  • -
  • pts chown -(1) -
  • pts creategroup -(1) -
  • pts createuser - -
  • machine entry -(1) -
  • user account -(1) -
  • -
  • pts delete -(1), (2) -
  • pts examine -(1) -
  • pts listentries -(1) -
  • pts listmax -(1) -
  • pts listowned -(1) -
  • pts membership -(1) - -
  • displaying system:administrators group -(1) -
  • -
  • pts removeuser -(1) - -
  • for system:administrators group -(1) -
  • -
  • pts rename - -
  • machine or group name -(1) -
  • username -(1) -
  • -
  • pts setfields - -
  • setting group creation quota -(1) -
  • setting privacy flags -(1) -
  • -
  • pts setmax -(1) -
  • rcp (AFS compared to UNIX) -(1), (2) -
  • rlogind (AFS compared to UNIX) -(1), (2) -
  • rsh (AFS compared to UNIX) -(1), (2) -
  • scout -(1) -
  • share -(1) -
  • strings -(1) -
  • sys -(1) -
  • tokens -(1) -
  • tokens.krb -(1) -
  • udebug -(1) -
  • umount -(1) -
  • unlog -(1) -
  • uss add -(1) -
  • uss bulk -(1) -
  • uss delete -(1) -
  • vos addsite -(1) -
  • vos backup -(1) -
  • vos backupsys -(1) -
  • vos changeaddr -(1) -
  • vos create - -
  • basic instructions -(1) -
  • when creating user account -(1) -
  • -
  • vos delentry -(1) -
  • vos dump -(1) -
  • vos examine - -
  • basic instructions -(1) -
  • -
  • vos listaddrs -(1) -
  • vos listpart -(1) -
  • vos listvldb - -
  • syntax -(1) -
  • -
  • vos listvol - -
  • syntax -(1) -
  • -
  • vos lock -(1) -
  • vos move - -
  • basic instructions -(1) -
  • -
  • vos partinfo -(1) -
  • vos release - -
  • basic instructions -(1) -
  • -
  • vos remove -(1) - -
  • basic instructions -(1) -
  • -
  • vos remsite -(1) -
  • vos rename - -
  • basic instructions -(1) -
  • when changing username -(1) -
  • -
  • vos restore -(1), (2) -
  • vos syncserv -(1) -
  • vos syncvldb -(1) -
  • vos unlock -(1) -
  • vos unlockvldb -(1) -
  • vos zap -(1) -
  • which -(1) -
  • xstat_cm_test -(1) -
  • xstat_fs_test -(1) -
  • -
  • common configuration files (server) -(1) -
  • compilation - -
  • date of, listing on binary file -(1) -
  • -
  • compiling - -
  • package prototype file -(1) -
  • -
  • configuration file - -
  • instructions for package program -(1) -
  • see entry: CFG_<device_name> configuration file -(1) -
  • -
  • configuration files - -
  • client machine -(1) -
  • package program -(1) -
  • server machine, common -(1) -
  • -
  • configuring - -
  • afsmonitor program -(1) -
  • Cache Manager -(1) -
  • client machine, issues -(1) -
  • file server machine, issues -(1) -
  • filespace, issues -(1) -
  • local disk of client with package -(1) -
  • trace log (fstrace) -(1) -
  • -
  • Conn statistic from scout program -(1) -
  • consistency guarantees - -
  • administrative databases -(1) -
  • cached data -(1) -
  • -
  • constants - -
  • uss template file -(1) -
  • -
  • contacting processes - -
  • Authentication Server -(1) -
  • Backup Server -(1) -
  • BOS Server -(1) -
  • File Server -(1) -
  • NTPD -(1) -
  • Protection Server -(1) -
  • Salvager -(1) -
  • Update Server -(1) -
  • VL Server -(1) -
  • Volume Server -(1) -
  • -
  • controlling - -
  • authorization checking for entire cell -(1) -
  • server machine interfaces registered in VLDB -(1) -
  • -
  • conventions - -
  • AFS pathnames -(1) -
  • cell name -(1) -
  • volume names -(1), (2) -
  • -
  • converting - -
  • existing UNIX accounts to AFS accounts - -
  • with manual account creation -(1) -
  • with uss -(1) -
  • -
  • -
  • coordinator (Ubik) - -
  • defined -(1) -
  • -
  • coordinator (Ubik) - -
  • election procedure described -(1) -
  • -
  • copying - -
  • ACL between directories -(1) -
  • -
  • core files - -
  • for server processes -(1) -
  • removing from /usr/afs/logs directory -(1) -
  • -
  • core leak - -
  • preventing with scheduled restarts -(1) -
  • -
  • correspondence - -
  • of volumes and directories -(1) -
  • -
  • corruption - -
  • symptoms and types -(1) -
  • -
  • counter - -
  • Protection Database (max user id, max group id) -(1) -
  • -
  • CPS -(1) -
  • creating - -
  • ACL as copy of another -(1) -
  • ACL entry -(1) -
  • ACL entry in negative permissions section -(1) -
  • Authentication Database entry - -
  • with kas create command -(1) -
  • with uss -(1) -
  • -
  • backup volume -(1) -
  • cellular mount point -(1) -
  • common local password file with uss -(1) -
  • directory with uss -(1) -
  • file with uss -(1), (2) -
  • group, self-owned -(1) -
  • link (hard or symbolic) with uss -(1) -
  • mount point when changing username -(1) -
  • mount point with uss -(1) -
  • multiple backup volumes at once -(1) -
  • NetInfo file (client version) -(1) -
  • NetInfo file (server version) -(1) -
  • NetRestrict file (client version) -(1) -
  • NetRestrict file (server version) -(1) -
  • PAG with klog or pagsh command -(1) -
  • Protection Database group entry -(1) -
  • Protection Database machine entry -(1) -
  • Protection Database user entry - -
  • with pts createuser command -(1) -
  • with uss -(1) -
  • -
  • read-only volume -(1) -
  • read/write or regular mount point -(1) -
  • read/write volume -(1) -
  • server encryption key -(1) -
  • server process -(1) -
  • standard files in new user account -(1) -
  • tape label (Backup System) -(1) -
  • user account - -
  • with uss -(1) -
  • with individual commands -(1) -
  • -
  • user account types with uss -(1) -
  • user accounts in bulk with uss -(1) -
  • volume with uss -(1) -
  • -
  • creation date - -
  • recorded in volume header -(1) -
  • -
  • creator - -
  • Protection Database entry - -
  • displaying -(1) -
  • displaying all -(1) -
  • -
  • -
  • criteria for replicating volumes -(1) -
  • cron process - -
  • creating with bos create command -(1) -
  • -
  • cron server process - -
  • defining in BosConfig file -(1) -
  • -
  • cron-type server process - -
  • defined -(1) -
  • used to automate volume backup -(1) -
  • -
  • current protection subgroup -(1) -
  • curses graphics utility - -
  • afsmonitor program -(1) -
  • scout program requirements -(1) -
  • -
  • -D - -
  • d ACL permission -(1) -
  • D instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • daily restart for new binaries - -
  • displaying and setting time -(1) -
  • -
  • data - -
  • availability interrupted by dumping -(1) -
  • -
  • data cache - -
  • changing location of disk cache -(1) -
  • disk cache size - -
  • resetting to default value -(1) -
  • -
  • disk versus memory -(1) -
  • displaying size specified in cacheinfo file -(1) -
  • flushing (forcing update) -(1) -
  • size - -
  • current, displaying -(1) -
  • recommendations -(1) -
  • set at reboot, displaying -(1) -
  • setting in cacheinfo file -(1), (2) -
  • setting until next reboot -(1) -
  • -
  • Vn file in -(1) -
  • -
  • data collection - -
  • with xstat data collection facility -(1) -
  • -
  • database files -(1) -
  • database server machine - -
  • adding - -
  • to client CellServDB file and kernel memory -(1) -
  • to server CellServDB file -(1) -
  • -
  • CellServDB file (client), displaying -(1) -
  • CellServDB file (server) entry - -
  • adding -(1) -
  • removing -(1) -
  • -
  • client knowledge of -(1) -
  • defined -(1) -
  • displaying list in server CellServDB file -(1) -
  • identifying with bos status -(1) -
  • maintaining -(1) -
  • reason to run three -(1) -
  • removing - -
  • from client CellServDB file and kernel memory -(1) -
  • from server CellServDB file -(1) -
  • -
  • use of NetInfo and NetRestrict files -(1) -
  • -
  • database server process - -
  • about starting and stopping -(1) -
  • need to run all on every database server machine -(1) -
  • restarting after adding entry to server CellServDB file -(1) -
  • restarting after removing entry from server CellServDB file -(1) -
  • use of CellServDB file -(1) -
  • -
  • database, distributed - -
  • see entry: administrative database -(1) -
  • -
  • databases, distributed -(1) -
  • date - -
  • on binary file, listing -(1) -
  • -
  • date-specific restores -(1) -
  • default - -
  • ACL -(1) -
  • volume quota -(1), (2) -
  • -
  • defining - -
  • directory for even distribution of accounts with uss -(1) -
  • read-only site in VLDB -(1) -
  • server encryption key -(1) -
  • server encryption key in Authentication Database -(1) -
  • server process in BosConfig file -(1) -
  • -
  • delayed write operations - -
  • when AFS files saved on NFS clients -(1) -
  • -
  • delete ACL permission - -
  • see entry: d ACL permission -(1) -
  • -
  • deleting - -
  • Authentication Database entry with uss -(1) -
  • Protection Database user entry with uss -(1) -
  • user accounts in bulk with uss -(1) -
  • user accounts with uss -(1) -
  • -
  • denying - -
  • file access with negative ACL entry -(1) -
  • -
  • desynchronization of VLDB/volume headers - -
  • fixing -(1) -
  • symptoms of -(1) -
  • -
  • determining - -
  • identity of database server machines -(1) -
  • identity of binary distribution machine -(1) -
  • identity of system control machine -(1) -
  • identity of: - -
  • simple file server machines -(1) -
  • -
  • roles taken by server machine -(1) -
  • success of replication -(1) -
  • -
  • differences - -
  • between AFS and UNIX, summarized -(1) -
  • -
  • directories - -
  • /afs -(1), (2) -
  • /afs/cellname -(1), (2) -
  • /usr/afs/backup -(1) -
  • conventional under /afs/cell_name -(1) -
  • for grouping user home directories -(1) -
  • lost+found -(1) -
  • -
  • directories (server) - -
  • /usr/afs/bin -(1) -
  • -
  • directory - -
  • /usr/afs/bin on server machines -(1) -
  • /usr/afs/db on server machines -(1) -
  • /usr/afs/etc -(1) -
  • /usr/afs/local on server machines -(1) -
  • /usr/afs/logs on server machines -(1) -
  • /usr/vice/cache -(1) -
  • /usr/vice/etc -(1) -
  • /vicep on server machines -(1) -
  • correspondence with volume -(1) -
  • creating with package -(1) -
  • creating with uss -(1) -
  • defining for even distribution of accounts with uss -(1) -
  • disk cache -(1) -
  • flushing from data cache on client machine -(1) -
  • overwritten by uss if exists -(1) -
  • root -(1) -
  • -
  • directory-level data protection - -
  • implications -(1) -
  • -
  • directory/file name - -
  • translating to volume ID number -(1) -
  • translating to volume location -(1) -
  • translating to volume name -(1) -
  • -
  • disabling - -
  • authorization checking -(1) -
  • -
  • discarding - -
  • tokens -(1) -
  • -
  • disk - -
  • file server machine - -
  • adding/installing -(1) -
  • removing -(1) -
  • -
  • local (see entry: local disk) -(1) -
  • -
  • Disk attn statistic from scout program -(1) -
  • disk partition - -
  • displaying size of single -(1) -
  • grouping related volumes on -(1) -
  • monitoring usage of -(1) -
  • moving volumes to reduce overcrowding -(1) -
  • -
  • display layout in scout program window -(1) -
  • displaying - -
  • ACL entries -(1) -
  • ADMIN flag in Authentication Database entry -(1) -
  • AFS user id and max group id counters -(1) -
  • BOS Server's automatic restart times -(1) -
  • Cache Manager preference ranks for file server machines -(1) -
  • CellServDB file (client) -(1) -
  • CellServDB file (server) -(1) -
  • client interfaces registered with File Server -(1) -
  • contents of trace log (fstrace) -(1) -
  • counters for AFS UID and AFS GID -(1) -
  • creator of Protection Database entry -(1), (2) -
  • data cache size - -
  • set at reboot -(1) -
  • specified in cacheinfo file -(1) -
  • -
  • data cache size, current -(1) -
  • database server machines in server CellServDB file -(1) -
  • disk partition size -(1) -
  • entries from BosConfig file -(1) -
  • group-creation quota in Protection Database entry -(1) -
  • groups owned by a user or group -(1) -
  • groups to which user or machine belongs -(1) -
  • KeyFile file -(1) -
  • log files for server processes -(1) -
  • members of group -(1) -
  • membership count in Protection Database entry -(1) -
  • mount point -(1), (2) -
  • owner of Protection Database entry -(1), (2) -
  • privacy flags on Protection Database entry -(1) -
  • Protection Database entries (all) -(1) -
  • Protection Database entry -(1) -
  • server encryption key from Authentication Database -(1) -
  • server encryption keys in KeyFile file -(1) -
  • server entries from VLDB -(1) -
  • server process status -(1) -
  • state of event set (fstrace) -(1) -
  • state of trace log (fstrace) -(1) -
  • system:administrators group members -(1) -
  • tape label (Backup System) -(1) -
  • time stamp on binary file -(1) -
  • UserList file -(1) -
  • VLDB entry - -
  • with volume header -(1) -
  • -
  • VLDB entry with volume header -(1) -
  • VLDB server entries -(1) -
  • volume header -(1) - -
  • with VLDB entry -(1) -
  • -
  • volume header with VLDB entry -(1) -
  • volume information -(1) -
  • volume quota - -
  • percent used -(1) -
  • with volume & partition info -(1) -
  • with volume size -(1) -
  • -
  • volume size -(1), (2) -
  • volume's VLDB entry -(1) -
  • -
  • distributed database - -
  • see entry: administrative database -(1) -
  • -
  • distributed databases -(1) -
  • distributed file system -(1) - -
  • security issues -(1) -
  • -
  • distribution - -
  • of CellServDB file (server) -(1) -
  • of databases -(1), (2) -
  • -
  • dormant (state of fstrace event set) -(1) -
  • dumb terminal - -
  • use in scout program -(1) -
  • use with afsmonitor -(1) -
  • -
  • dump (Backup System) - -
  • appended - -
  • creating -(1) -
  • -
  • appended, defined -(1) -
  • creating Backup Database record -(1) -
  • defined -(1) -
  • displaying Backup Database record -(1) -
  • full, defined -(1) -
  • ID number, described -(1) -
  • ID number, displaying -(1) -
  • incremental, defined -(1) -
  • initial, defined -(1) -
  • label, described -(1) -
  • name, described -(1) -
  • parent, defined -(1) -
  • set (see entry: dump set) -(1) -
  • -
  • dump hierarchy (Backup System) - -
  • creating -(1) -
  • described -(1) -
  • displaying -(1) -
  • dump level - -
  • defined -(1) -
  • -
  • dump levels - -
  • adding -(1) -
  • deleting -(1) -
  • -
  • expiration date on dump level - -
  • described -(1) -
  • -
  • expiration dates -(1) - -
  • assigning to dump levels -(1) -
  • changing -(1) -
  • setting -(1) -
  • -
  • -
  • dump ID number (Backup System) - -
  • displaying -(1) -
  • -
  • dump ID numbers (Backup System) -(1) -
  • dump levels - -
  • defined -(1) -
  • expiration dates -(1) - -
  • changing -(1) -
  • setting -(1) -
  • -
  • in Backup Database - -
  • adding -(1) -
  • deleting -(1) -
  • displaying -(1) -
  • -
  • -
  • dump set (Backup System) - -
  • creating -(1) -
  • defined -(1) -
  • deleting from Backup Database -(1) -
  • full dumps -(1) -
  • incremental dumps -(1) -
  • -
  • dumping - -
  • Backup Database to tape -(1) -
  • data -(1) -
  • dump ID numbers -(1) -
  • full dumps -(1) -
  • incremental dumps -(1) -
  • trace log contents (fstrace) -(1) -
  • volumes - -
  • reasons -(1) -
  • using vos command -(1) -
  • without using AFS Backup System -(1) -
  • -
  • -
  • dynamic kernel loader programs - -
  • directory for AFS library files -(1) -
  • -
  • -E - -
  • E instruction - -
  • uss template file -(1) -
  • -
  • editing - -
  • NetInfo file (client version) -(1) -
  • NetInfo file (server version) -(1) -
  • NetRestrict file (client version) -(1) -
  • NetRestrict file (server version) -(1) -
  • -
  • election of Ubik coordinator -(1) -
  • emergency - -
  • server encryption keys mismatched -(1) -
  • -
  • enabling authorization checking -(1) -
  • encrypted network communication -(1) -
  • entering - -
  • kas interactive mode -(1) -
  • -
  • entry in VLDB - -
  • displaying, with volume header -(1) -
  • for volume -(1) -
  • locking/unlocking -(1) -
  • -
  • environment - -
  • types compared -(1) -
  • -
  • erasing - -
  • all ACL entries -(1) -
  • -
  • etc/exports file -(1) -
  • etc/fstab file - -
  • (see entry: file systems registry file) -(1) -
  • -
  • event set (fstrace) - -
  • cm -(1) -
  • displaying state -(1) -
  • persistence -(1) -
  • setting -(1) -
  • -
  • events - -
  • auditing AFS on AIX server machines -(1) -
  • -
  • examples - -
  • library files for package -(1) -
  • prototype files for package -(1) -
  • scout program display -(1) -
  • uss template file -(1) -
  • -
  • executing - -
  • command using uss template line -(1) -
  • -
  • expiration dates -(1) - -
  • absolute -(1) -
  • changing -(1) -
  • relative -(1) -
  • setting -(1) -
  • -
  • -F - -
  • F instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • failure - -
  • of file storage due to full partition -(1) -
  • of uss account creation - -
  • recovering from -(1) -
  • -
  • -
  • Fetch statistic from scout program -(1) -
  • file - -
  • creating standard ones in new user account -(1) -
  • creating with package -(1) -
  • creating with uss -(1), (2) -
  • flushing from data cache on client machine -(1) -
  • overwritten by uss if exists -(1) -
  • required on client machine local disk -(1) -
  • -
  • file extension - -
  • .BAK -(1) -
  • .OLD -(1) -
  • -
  • File Server - -
  • as part of fs process -(1), (2) -
  • binary in /usr/afs/bin -(1) -
  • client interfaces registered -(1) -
  • collecting data with xstat data collection facility -(1) -
  • CPS requested from Protection Server -(1) -
  • description -(1) -
  • displaying log file -(1) -
  • interfaces registered in VLDB - -
  • listed in sysid file -(1) -
  • -
  • interfaces registered in VLDB server entry -(1) -
  • monitoring with scout program -(1) -
  • use of NetInfo file -(1) -
  • use of NetRestrict file -(1) -
  • use of sysid file -(1) -
  • when to contact -(1) -
  • xstat data collection facility libraries -(1) -
  • xstat data collections -(1) -
  • xstat example commands -(1) -
  • xstat_fs_test example command -(1) -
  • -
  • file server machine -(1) - -
  • partitions, naming -(1) -
  • Cache Manager preference ranks for -(1) -
  • configuration files in /usr/afs/local -(1) -
  • core files in /usr/afs/logs -(1) -
  • database files in /usr/afs/db -(1) -
  • disk - -
  • adding/installing -(1) -
  • removing -(1) -
  • -
  • displaying log files -(1) -
  • installing command and process binaries -(1) -
  • log files in /usr/afs/logs -(1) -
  • monitoring outages of -(1) -
  • rebooting, about -(1) -
  • restoring partitions using Backup System -(1) -
  • salvaging volumes -(1) -
  • -
  • file server probe interval - -
  • setting for a client machine -(1) -
  • -
  • file storage - -
  • failed due to partition crowding -(1) -
  • -
  • file system - -
  • defined -(1) -
  • monitoring activity -(1) -
  • salvager (see entry: Salvager) -(1) -
  • -
  • file systems registry file - -
  • adding new disk to file server machine -(1) -
  • removing disk from file server machine -(1) -
  • -
  • file tree - -
  • conventions - -
  • for configuring -(1) -
  • third level -(1) -
  • -
  • creating volumes to match top level directories -(1) -
  • -
  • FileLog file -(1) - -
  • displaying -(1) -
  • -
  • files - -
  • /usr/afs/etc/KeyFile -(1) -
  • AFS initialization script -(1) -
  • AFS libraries used by dynamic kernel loader programs -(1) -
  • afsd -(1) -
  • afszcm.cat -(1) -
  • AuthLog -(1) -
  • backup command binary -(1) -
  • BackupLog -(1) -
  • bdb.DB0 -(1) -
  • bdb.DBSYS1 -(1) -
  • bos command binary -(1) -
  • BosConfig -(1), (2) -
  • BosLog -(1) -
  • bosserver binary -(1) -
  • buserver -(1) -
  • cacheinfo -(1) -
  • CacheItems -(1) -
  • CellServDB (client) -(1) -
  • CellServDB (server) -(1), (2) -
  • CellServDB file (client) -(1) -
  • CellServDB.local -(1) -
  • CFG_<device_name> -(1) -
  • displaying log files -(1) -
  • exports -(1) -
  • file systems registry (fstab) -(1) -
  • FileLog -(1) -
  • fileserver -(1) -
  • fms.log -(1) -
  • FORCESALVAGE -(1) -
  • global CellServDB -(1) -
  • kas command binary -(1) -
  • kaserver binary file -(1) -
  • kaserver.DB0 -(1) -
  • kaserver.DBSYS1 -(1) -
  • KeyFile -(1) -
  • NetInfo (client version) -(1), (2) -
  • NetInfo (server version) -(1) -
  • NetRestrict (client version) -(1), (2) -
  • NetRestrict (server version) -(1) -
  • NoAuth -(1) -
  • ntpd -(1) -
  • ntpdc -(1) -
  • package Makefile -(1) -
  • prdb.DB0 -(1) -
  • prdb.DBSYS1 -(1) -
  • pts command binary -(1) -
  • ptserver binary -(1) -
  • runntp -(1) -
  • SALVAGE.fs -(1) -
  • salvage.lock -(1) -
  • SalvageLog -(1) -
  • salvager -(1) -
  • server configuration, in /usr/afs/etc directory -(1) -
  • sysid -(1) -
  • tapeconfig -(1) -
  • ThisCell (client) -(1) -
  • ThisCell (server) -(1) -
  • udebug -(1) -
  • upclient -(1) -
  • upserver -(1) -
  • UserList -(1) -
  • V.vol_ID.vol -(1) -
  • vldb.DB0 -(1) -
  • vldb.DBSYS1 -(1) -
  • VLLog -(1) -
  • vlserver -(1) -
  • Vn -(1) -
  • VolserLog -(1) -
  • volserver -(1) -
  • VolumeItems -(1) -
  • vos command binary -(1) -
  • -
  • fileserver - -
  • (see entry: File Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • flexible synchronization site (Ubik) -(1) -
  • flushing - -
  • data cache on client machine -(1) -
  • -
  • fms command -(1) -
  • fms.log file -(1) -
  • FORCESALVAGE file -(1) -
  • foreign cell -(1) - -
  • making local cell visible -(1) -
  • making visible in local cell -(1) -
  • -
  • format of CellServDB file (client) -(1) -
  • fs commands - -
  • examine -(1) -
  • lsmount -(1) -
  • setquota -(1) -
  • setvol -(1) -
  • whereis -(1) -
  • checkservers -(1) -
  • checkvolumes -(1) -
  • cleanacl -(1) -
  • copyacl -(1) -
  • examine -(1) -
  • exportafs -(1) -
  • flush -(1) -
  • flushmount -(1) -
  • flushvolume -(1) -
  • getcacheparms -(1) -
  • getcellstatus -(1) -
  • getclientaddrs -(1) -
  • getserverprefs -(1) -
  • granting privilege for -(1) -
  • listacl -(1) -
  • listcells -(1) -
  • listquota -(1), (2) -
  • messages -(1) -
  • mkmount - -
  • for read/write volume -(1) -
  • general instructions -(1) -
  • when changing username -(1) -
  • when creating user account -(1) -
  • when mounting backup volume -(1) -
  • when renaming volume -(1) -
  • when restoring volume -(1) -
  • -
  • mutual authentication, bypassing -(1) -
  • newcell -(1) -
  • quota -(1) -
  • rmmount -(1) - -
  • when changing username -(1) -
  • when removing user account -(1) -
  • when removing volume -(1) -
  • when renaming volume -(1) -
  • -
  • setacl -(1) - -
  • with -clear flag -(1) -
  • with -negative flag -(1) -
  • -
  • setcachesize -(1) -
  • setcell -(1) -
  • setclientaddrs -(1) -
  • setserverprefs -(1) -
  • storebehind - -
  • displaying asynchrony for specific files -(1) -
  • displaying default asynchrony -(1) -
  • setting asynchrony for specific files -(1) -
  • setting default asynchrony -(1) -
  • -
  • sysname -(1) -
  • -
  • fs process -(1) - -
  • creating -(1) -
  • -
  • fs server process - -
  • defining in BosConfig file -(1) -
  • -
  • fs-type server process - -
  • defined -(1) -
  • -
  • fsck command - -
  • AFS compared to UNIX -(1) -
  • AFS version -(1) -
  • -
  • fstab file - -
  • (see entry: file systems registry file) -(1) -
  • -
  • fstrace commands - -
  • clear -(1) -
  • dump -(1) -
  • example of use -(1) -
  • lslog -(1) -
  • lsset -(1) -
  • privilege requirements -(1) -
  • setlog -(1) -
  • setset -(1) -
  • -
  • fsync system call - -
  • for files saved on AFS client -(1) -
  • for files saved on NFS client -(1) -
  • -
  • ftpd command - -
  • AFS compared to UNIX -(1), (2) -
  • -
  • full dump -(1) - -
  • creating using vos command -(1) -
  • -
  • full restores -(1) -
  • -G - -
  • global namespace -(1) -
  • granting - -
  • file access by setting ACL -(1) -
  • privilege for backup commands -(1) -
  • privilege for bos commands -(1) -
  • privilege for fs commands -(1) -
  • privilege for kas commands -(1), (2) -
  • privilege for pts commands -(1) -
  • privilege for vos commands -(1) -
  • -
  • group - -
  • Protection Database entry - -
  • name, changing -(1) -
  • -
  • ACL entry, usefulness of -(1) -
  • AFS GID -(1) -
  • AFS GID, assigning -(1) -
  • creation quota (see entry: quota) -(1) -
  • definition -(1) -
  • group use -(1) -
  • groups owned, displaying -(1) -
  • members, adding -(1) -
  • members, displaying -(1) -
  • members, removing -(1) -
  • membership of machine or user, displaying -(1) -
  • name, assigning -(1) -
  • orphaned, displaying -(1) -
  • owned by user or group, displaying -(1) -
  • owner - -
  • displaying -(1) -
  • displaying for all -(1) -
  • -
  • privacy flags -(1) -
  • privacy flags on Protection Database entry - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • private use -(1) -
  • Protection Database entry - -
  • deleting -(1) -
  • displaying -(1) -
  • displaying all -(1) -
  • -
  • Protection Database entry, creating -(1) -
  • Protection Database entry, described -(1) -
  • regular and prefix-less, defined -(1) -
  • restrictions -(1) -
  • rules for naming -(1) -
  • self-owned, creating -(1) -
  • shared use -(1) -
  • system -(1) -
  • system-defined -(1) -
  • system-defined on ACLs -(1) -
  • using effectively -(1) -
  • -
  • group use of group -(1) -
  • groups command - -
  • AFS compared to UNIX -(1) -
  • -
  • -H - -
  • handling - -
  • server encryption key emergency -(1) -
  • -
  • hard link - -
  • AFS restrictions on -(1) -
  • creating with uss -(1) -
  • overwritten by uss if exists -(1) -
  • -
  • highlighting statistics in scout display - -
  • setting thresholds -(1) -
  • use of reverse video -(1) -
  • -
  • -I - -
  • i ACL permission -(1) -
  • identifying - -
  • binary distribution machine -(1) -
  • database server machine -(1) -
  • roles taken by server machine -(1) -
  • simple file server machine -(1) -
  • system control machine -(1) -
  • -
  • inactive (state of fstrace event set) -(1) -
  • incremental dump - -
  • creating using vos command -(1) -
  • creating with Backup System -(1) -
  • -
  • inetd command - -
  • AFS compared to UNIX -(1), (2) -
  • -
  • initialization script for AFS -(1) -
  • initializing - -
  • scout program -(1) -
  • server process -(1) -
  • -
  • insert ACL permission - -
  • see entry: i ACL permission -(1) -
  • -
  • installing - -
  • disk on file server machine -(1) -
  • server binaries -(1) -
  • server process binaries, about -(1) -
  • -
  • intention flag in VLDB entry -(1) -
  • interactive mode (Backup System) - -
  • entering -(1) -
  • exiting -(1) -
  • features -(1) -
  • operations - -
  • canceling pending/running -(1) -
  • displaying pending/running -(1) -
  • -
  • -
  • interactive mode (kas commands) -(1) -
  • Internet - -
  • conventions for cell name -(1) -
  • Network Information Center -(1) -
  • -
  • -J - -
  • job ID numbers (Backup System) -(1) - -
  • displaying -(1) -
  • operations - -
  • canceling -(1) -
  • -
  • -
  • -K - -
  • k ACL permission -(1) -
  • kas commands - -
  • binary in /usr/afs/bin -(1) -
  • create -(1) - -
  • when changing username -(1) -
  • -
  • delete - -
  • when changing username -(1) -
  • when removing user account -(1) -
  • -
  • examine - -
  • to display ADMIN flag -(1) -
  • -
  • examine, to inspect afs key -(1) -
  • granting privilege for -(1) -
  • interactive -(1) -
  • mutual authentication, bypassing -(1) -
  • setfields -(1), (2) - -
  • limiting failed authentication attempts -(1) -
  • prohibiting password reuse -(1) -
  • setting ADMIN flag -(1) -
  • setting password lifetime -(1) -
  • -
  • setpassword -(1), (2), (3), (4) -
  • setpassword , when handling key emergency -(1) -
  • unlock -(1) -
  • -
  • kaserver process - -
  • (see entry: Authentication Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • kaserver.DB0 file -(1) -
  • kaserver.DBSYS1 file -(1) -
  • Kerberos - -
  • support for in AFS -(1) -
  • use of usernames -(1) -
  • -
  • kernel memory (client) - -
  • CellServDB file, reading into -(1) -
  • -
  • key version number - -
  • defined -(1) -
  • -
  • KeyFile file - -
  • adding server encryption key -(1) -
  • displaying -(1) -
  • function of -(1) -
  • removing server encryption key -(1) -
  • storage site for server encryption keys -(1) -
  • -
  • klog command -(1) - -
  • limiting failed attempts -(1) -
  • when handling key emergency -(1) -
  • with -setpag flag -(1) -
  • -
  • klog.krb command -(1) -
  • knfs command -(1) -
  • kpasswd command -(1), (2) -
  • kpwvalid program -(1) -
  • kvno - -
  • see entry: key version number -(1) -
  • -
  • -L - -
  • l ACL permission -(1) -
  • L instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • learning - -
  • volume ID - -
  • given directory/file name -(1) -
  • given volume name -(1) -
  • -
  • volume location - -
  • given directory/file name -(1) -
  • given volume name/ID number -(1) -
  • -
  • volume name - -
  • given directory/file name -(1) -
  • given volume ID number -(1) -
  • -
  • -
  • length restriction on volume names -(1) -
  • library files in package -(1) - -
  • constructing -(1) -
  • examples -(1) -
  • -
  • libxstat_cm.a library -(1) - -
  • data collections -(1) -
  • example command using -(1) -
  • obtaining more information -(1) -
  • routines -(1) -
  • xstat_cm_test example command -(1) -
  • -
  • libxstat_fs.a library -(1) - -
  • data collections -(1) -
  • example command using -(1) -
  • obtaining more information -(1) -
  • routines -(1) -
  • xstat_fs_test example command -(1) -
  • -
  • listing - -
  • tokens held by issuer -(1) -
  • -
  • ln command - -
  • AFS compared to UNIX -(1) -
  • -
  • local cell -(1) - -
  • granting foreign users access to -(1) -
  • making foreign cells visible in -(1) -
  • making visible to foreign cells -(1) -
  • -
  • local configuration files (server) -(1) -
  • local disk - -
  • configuring on client, using package -(1) -
  • files required on client machine -(1) -
  • protecting on file server machine -(1) -
  • -
  • local password file - -
  • creating common source version with uss -(1), (2) -
  • creating entry for AFS user - -
  • with manual account creation -(1) -
  • with uss -(1) -
  • -
  • setting password in - -
  • with manual account creation -(1) -
  • with uss -(1) -
  • -
  • when not using AFS-modified login utility -(1) -
  • when using AFS--modified login utility -(1) -
  • -
  • location - -
  • setting for client -(1) -
  • standard for uss template file -(1) -
  • -
  • lock ACL permission - -
  • see entry: k ACL permission -(1) -
  • -
  • locked VLDB entry - -
  • displaying -(1) -
  • unlocking -(1) -
  • -
  • locking - -
  • VLDB entry -(1), (2) -
  • -
  • log files - -
  • displaying -(1) -
  • fms.log -(1) -
  • for replicated databases -(1) -
  • for server processes -(1) -
  • -
  • login - -
  • limiting failed attempts -(1) -
  • -
  • login utility - -
  • AFS version -(1) -
  • AFS version's interaction with local password file -(1) -
  • -
  • lookup ACL permission - -
  • see entry: l ACL permission -(1) -
  • -
  • lost+found directory -(1) -
  • -M - -
  • machine - -
  • adding to group -(1) -
  • AFS UID, assigning -(1) -
  • group memberships - -
  • displaying number -(1) -
  • -
  • group memberships, displaying -(1) -
  • privacy flags on Protection Database entry - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • Protection Database entry - -
  • deleting -(1) -
  • displaying -(1) -
  • displaying all -(1) -
  • name, changing -(1) -
  • -
  • Protection Database entry, creating -(1) -
  • Protection Database entry, described -(1) -
  • removing from group -(1) -
  • -
  • mainframe - -
  • computing environment -(1) -
  • -
  • maintaining - -
  • CellServDB file (client) -(1) -
  • synchrony of VLDB with volume headers -(1) -
  • -
  • majority - -
  • defined for Ubik -(1) -
  • -
  • Makefile for package -(1) - -
  • modifying -(1) -
  • -
  • mapping - -
  • AFS ID to group, machine, or username -(1) -
  • group name to AFS GID -(1) -
  • machine name to AFS UID -(1) -
  • username to AFS UID -(1) -
  • -
  • max group id counter (Protection Database) - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • max user id counter (Protection Database) - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • maximum volume quota -(1) -
  • MaxQuota field in volume header -(1) -
  • members - -
  • group, adding -(1) -
  • group, displaying -(1), (2) -
  • group, removing -(1) -
  • -
  • membership - -
  • system groups -(1) -
  • -
  • memory state of BOS Server -(1) -
  • message line in scout program display -(1) -
  • mode bits (UNIX) - -
  • interpretation in AFS -(1) -
  • -
  • modifying - -
  • clients to run package -(1) -
  • package Makefile -(1) -
  • -
  • monitoring - -
  • Cache Manager performance -(1) -
  • Cache Manager processes with afsmonitor -(1) -
  • disk usage with scout program -(1) -
  • file server processes with afsmonitor -(1) -
  • file server processes with scout -(1) -
  • outages with scout program -(1) -
  • server processes -(1) -
  • -
  • mount command -(1) -
  • MOUNT instruction in CFG_device_name file -(1) -
  • mount point - -
  • cellular - -
  • creating -(1) -
  • described -(1) -
  • -
  • changing when renaming user -(1) -
  • choosing name for user volume -(1) -
  • creating cellular -(1) -
  • creating multiple per volume -(1) -
  • creating read/write or regular -(1) -
  • creating with uss -(1) -
  • defined -(1) -
  • definition -(1) -
  • displaying -(1) -
  • distinguishing different types -(1) -
  • flushing from data cache on client machine -(1) -
  • read/write - -
  • creating -(1) -
  • described -(1) -
  • -
  • regular - -
  • creating -(1) -
  • described -(1) -
  • -
  • removing -(1), (2) -
  • removing when removing user account -(1) -
  • -
  • mounting - -
  • backup volume -(1) -
  • disk on file server machine -(1) -
  • foreign volume in local cell -(1) -
  • read-only volume -(1) -
  • read/write volume -(1) -
  • volume - -
  • about -(1) -
  • general instructions -(1) -
  • -
  • -
  • moving - -
  • volume -(1) -
  • -
  • mutual authentication -(1) - -
  • failure due to mismatched keys -(1) -
  • preventing -(1) -
  • server encryption key's role -(1) -
  • -
  • -N - -
  • name - -
  • Protection Database entry - -
  • changing -(1) -
  • -
  • -
  • NAME_CHECK instruction in CFG_device_name file -(1) -
  • needs salvage status flag in volume header -(1) -
  • negative ACL permissions - -
  • defined -(1) -
  • -
  • NetInfo file (client version) -(1), (2) -
  • NetInfo file (server version) -(1) - -
  • creating/editing -(1) -
  • -
  • NetRestrict file (client version) -(1), (2) -
  • NetRestrict file (server version) -(1) - -
  • creating/editing -(1) -
  • -
  • network - -
  • as computing environment -(1) -
  • defined -(1) -
  • encrypted communication in AFS -(1) -
  • reducing traffic through caching -(1) -
  • -
  • Network Information Center (for Internet) -(1) -
  • Network Time Protocol Daemon - -
  • (see entry: NTPD) -(1) -
  • -
  • New release - -
  • status flag on site definition in VLDB entry -(1) -
  • -
  • New release site flag in VLDB - -
  • as indicator of failed replication -(1) -
  • -
  • NFS/AFS Translator -(1) - -
  • AFSCONF environment variable -(1) -
  • -
  • NoAuth file -(1) - -
  • creating in emergencies -(1) -
  • -
  • none shorthand for ACL permissions -(1) -
  • normal ACL permissions - -
  • defined -(1) -
  • -
  • Not released - -
  • status flag on site definition in VLDB entry -(1) -
  • -
  • NotRun status flag in BosConfig file - -
  • changing to Run -(1) -
  • defined -(1) -
  • -
  • NTPD -(1) -
  • ntpd - -
  • binary in /usr/afs/bin -(1) -
  • description -(1) -
  • invoked by runntp process -(1) -
  • when to contact -(1) -
  • -
  • ntpdc - -
  • binary in /usr/afs/bin -(1) -
  • -
  • number variables - -
  • uss template file -(1) -
  • -
  • -O - -
  • Off-line status flag in volume header -(1) -
  • Old release - -
  • status flag on site definition in VLDB entry -(1) -
  • -
  • Old release site flag in VLDB - -
  • as indicator of failed replication -(1) -
  • -
  • OLD version of binary file - -
  • created by bos install command -(1) -
  • removing obsolete -(1) -
  • used by bos uninstall command -(1) -
  • -
  • OldFiles directory - -
  • as mount point for backup volume -(1) -
  • -
  • On-line status flag in volume header -(1) -
  • orphaned group -(1) -
  • outages - -
  • BOS Server role in, -(1) -
  • due to automatic server restart -(1) -
  • due to server process restart -(1) -
  • due to Ubik election -(1) -
  • monitoring with scout program -(1) -
  • -
  • overcrowding of disk partition - -
  • effect on users -(1) -
  • moving volumes to reduce -(1) -
  • -
  • overwriting - -
  • existing directories/files/links with uss -(1) -
  • -
  • owner - -
  • Protection Database entry - -
  • changing -(1) -
  • displaying -(1) -
  • displaying all -(1) -
  • rules for assigning -(1) -
  • -
  • -
  • -P - -
  • package - -
  • B instruction in configuration file -(1) -
  • C instruction in configuration file -(1) -
  • compiling prototype files -(1), (2) -
  • configuration file instructions -(1) -
  • configuration files -(1) -
  • constructing prototype and library files -(1) -
  • D instruction in configuration file -(1) -
  • defining block special device in configuration file -(1) -
  • defining character special device in configuration file -(1) -
  • defining directory in configuration file -(1) -
  • defining file in configuration file -(1) -
  • defining socket in configuration file -(1) -
  • defining symbolic link in configuration file -(1) -
  • directory structure -(1) -
  • example library files -(1) -
  • example prototype files -(1) -
  • F instruction in configuration file -(1) -
  • L instruction in configuration file -(1) -
  • library files -(1) -
  • Makefile -(1) -
  • modifying clients to run -(1) -
  • modifying the Makefile -(1) -
  • preparing prototype files -(1), (2) -
  • prototype file -(1) -
  • S instruction in configuration file -(1) -
  • to update client -(1) -
  • -
  • package command -(1) -
  • package directory -(1) -
  • PAG - -
  • creating with klog or pagsh command -(1) -
  • -
  • pagsh command -(1) -
  • pagsh.krb command -(1) -
  • participation - -
  • in AFS global namespace -(1) -
  • -
  • partition - -
  • housing AFS volumes -(1) -
  • restoring contents using Backup System -(1) -
  • restoring using Backup System - -
  • to a new location -(1) -
  • to the same location -(1) -
  • -
  • salvaging all volumes -(1) -
  • -
  • passwd file - -
  • see entry: local password file -(1) -
  • -
  • password - -
  • AFS compared to UNIX -(1) -
  • changing in AFS -(1) -
  • checking quality of -(1) -
  • consequences of multiple failed authentication attempts -(1) -
  • expiration -(1) -
  • improving security -(1) -
  • lifetime -(1) -
  • local password file -(1) -
  • restricting reuse -(1) -
  • setting in Authentication Database -(1) -
  • setting in local password file - -
  • with manual account creation -(1) -
  • with uss -(1) -
  • -
  • -
  • permissions on ACL - -
  • defined -(1) -
  • -
  • persistent fstrace event set or trace log -(1) -
  • personal - -
  • computing environment -(1) -
  • workstation - -
  • as typical AFS machine -(1) -
  • -
  • -
  • possible variations - -
  • on replication -(1) -
  • -
  • prdb.DB0 file -(1) -
  • prdb.DBSYS1 file -(1) -
  • preferences - -
  • setting -(1) -
  • -
  • prefix-less group - -
  • see entry: group -(1) -
  • -
  • preventing - -
  • core leaks, with scheduled BOS Server restarts -(1) -
  • mutual authentication -(1) -
  • -
  • previewing - -
  • user account creation/deletion with uss -(1) -
  • -
  • privacy flags on Protection Database entry -(1) - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • private use of group -(1) -
  • privilege - -
  • granting for backup commands -(1) -
  • granting for bos commands -(1) -
  • granting for fs commands -(1) -
  • granting for kas commands -(1) -
  • granting for pts commands -(1) -
  • granting for vos commands -(1) -
  • required for afsmonitor program -(1) -
  • required for fstrace commands -(1) -
  • required for scout program -(1) -
  • required for uss commands -(1) -
  • see entry: administrative privilege -(1) -
  • -
  • privileged commands -(1) -
  • process - -
  • lightweight Ubik -(1) -
  • status flag in BosConfig file -(1) -
  • -
  • process authentication group - -
  • see entry: PAG -(1) -
  • -
  • processes - -
  • Authentication Server, binary in /usr/afs/bin -(1) -
  • Backup Server, binary in /usr/afs/bin -(1) -
  • BOS Server, binary in /usr/afs/bin -(1) -
  • File Server, binary in /usr/afs/bin -(1) -
  • NTPD, binary in /usr/afs/bin -(1) -
  • Protection Server, binary in /usr/afs/bin -(1) -
  • Salvager, binary in /usr/afs/bin -(1) -
  • Update Server, binaries in /usr/afs/bin -(1) -
  • VL Server, binary in /usr/afs/bin -(1) -
  • Volume Server, binary in /usr/afs/bin -(1) -
  • -
  • programs - -
  • afsd -(1) -
  • bosserver -(1) -
  • buserver -(1) -
  • fileserver -(1) -
  • kaserver -(1) -
  • ntpd -(1) -
  • ntpdc -(1) -
  • ptserver -(1) -
  • runntp -(1) -
  • salvager -(1) -
  • udebug -(1) -
  • upclient -(1) -
  • upserver -(1) -
  • vlserver -(1) -
  • volserver -(1) -
  • -
  • protection - -
  • AFS compared to UNIX -(1) -
  • in AFS -(1) -
  • in UNIX -(1) -
  • -
  • Protection Database -(1) - -
  • user entry - -
  • deleting -(1) -
  • -
  • changing username -(1) -
  • creator of entry - -
  • displaying -(1) -
  • -
  • creator of entry - -
  • displaying for all -(1) -
  • -
  • entry name - -
  • changing -(1) -
  • -
  • entry, deleting -(1) -
  • group creation quota - -
  • displaying -(1) -
  • setting -(1), (2) -
  • -
  • group entry -(1) - -
  • displaying -(1) -
  • displaying all -(1) -
  • -
  • group entry, creating -(1) -
  • ID counters, setting -(1) -
  • machine entry - -
  • displaying -(1) -
  • displaying all -(1) -
  • -
  • machine entry, creating -(1) -
  • machine entry, described -(1) -
  • max user id and max group id counters, displaying and setting -(1) -
  • membership count - -
  • displaying -(1) -
  • -
  • owner of entry - -
  • changing -(1) -
  • displaying -(1) -
  • displaying for all -(1) -
  • -
  • privacy flags - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • setting - -
  • counters for AFS UIDs -(1) -
  • -
  • user entry - -
  • creating with uss -(1) -
  • creating with pts createuser command -(1) -
  • deleting with uss -(1) -
  • displaying -(1) -
  • displaying all -(1) -
  • -
  • user entry, described -(1) -
  • -
  • protection of file data - -
  • AFS compared to UFSACL -(1), (2) -
  • see also: ACL -(1) -
  • -
  • Protection Server - -
  • about starting and stopping -(1) -
  • as ptserver process -(1) -
  • binary in /usr/afs/bin -(1) -
  • building CPS -(1) -
  • description -(1) -
  • restarting after adding entry to server CellServDB file -(1) -
  • restarting after removing entry from server CellServDB file -(1) -
  • runs on database server machine -(1) -
  • when to contact -(1) -
  • -
  • prototype files in package - -
  • about -(1) -
  • constructing -(1) -
  • examples -(1) -
  • preparing -(1) -
  • -
  • pts commands - -
  • adduser -(1) - -
  • for system:administrators group -(1) -
  • -
  • binary in /usr/afs/bin -(1) -
  • chown -(1) -
  • creategroup -(1) -
  • createuser - -
  • machine entry -(1) -
  • user account -(1) -
  • -
  • delete -(1) - -
  • when removing user account -(1) -
  • -
  • examine -(1) -
  • granting privilege for -(1) -
  • listentries -(1) -
  • listmax -(1) -
  • listowned -(1) -
  • membership -(1) - -
  • displaying system:administrators group -(1) -
  • -
  • mutual authentication, bypassing -(1) -
  • removeuser -(1) - -
  • for system:administrators group -(1) -
  • -
  • rename - -
  • machine or group name -(1) -
  • username -(1) -
  • -
  • setfields - -
  • setting group creation quota -(1) -
  • setting privacy flags -(1) -
  • -
  • setmax -(1) -
  • -
  • ptserver process - -
  • (see entry: Protection Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • -Q - -
  • quota - -
  • group-creation - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • -
  • -R - -
  • r ACL permission -(1) -
  • RClone field in volume header -(1) -
  • rcp command - -
  • AFS compared to UNIX -(1), (2) -
  • -
  • read - -
  • ACL permission (see entry: r ACL permission) -(1) -
  • shorthand for ACL permissions -(1) -
  • -
  • read-only volume - -
  • changing name of -(1) -
  • creating -(1) - -
  • instructions -(1) -
  • -
  • defined -(1) -
  • defining site for in VLDB -(1) -
  • dumping -(1) -
  • ID number in volume header -(1) -
  • mounting -(1) -
  • moving -(1) -
  • need for atomic release -(1) -
  • releasing -(1) -
  • removing - -
  • effect of -(1) -
  • -
  • selecting site -(1) -
  • -
  • read/write mount point - -
  • see entry: mount point -(1) -
  • -
  • read/write volume - -
  • changing name of -(1) -
  • cloning - -
  • for backup version -(1) -
  • for replication -(1) -
  • -
  • creating -(1) -
  • defined -(1) -
  • dumping -(1) -
  • ID number in volume header -(1) -
  • mounting -(1) -
  • moving -(1) -
  • removing - -
  • effect of -(1) -
  • instructions -(1) -
  • -
  • replication instructions -(1) -
  • types suitable for replication -(1) -
  • -
  • rebooting - -
  • file server machine, limiting -(1) -
  • server machine, instructions -(1) -
  • -
  • recycling - -
  • useCounts of tapes (Backup System) -(1) -
  • -
  • regular expression - -
  • Backup System -(1) -
  • -
  • regular group - -
  • see entry: group -(1) -
  • -
  • regular mount point - -
  • see entry: mount point -(1) -
  • -
  • release - -
  • status flags on site definitions in VLDB entry -(1) -
  • -
  • release stage in replication -(1) -
  • ReleaseClone -(1) -
  • ReleaseClone volume - -
  • ID number in volume header -(1) -
  • -
  • releasing - -
  • read-only volume -(1) -
  • read-only volume, forcing new cloning -(1) -
  • read-only volume, need for atomicity -(1) -
  • -
  • remote services - -
  • modifications for AFS -(1) -
  • -
  • removing - -
  • ACL entry -(1) -
  • ADMIN flag from Authentication Database entry -(1) -
  • all ACL entries -(1) -
  • core files from /usr/afs/logs -(1) -
  • database server machine - -
  • from client CellServDB file and kernel memory -(1) -
  • from server CellServDB file -(1) -
  • -
  • disk from file server machine -(1) -
  • group members -(1) -
  • mount point -(1), (2) - -
  • when changing username -(1) -
  • -
  • mount point when removing user account -(1) -
  • obsolete .BAK and .OLD version of binaries -(1) -
  • obsolete AFS IDs from ACL -(1) -
  • Protection Database entry -(1), (2) -
  • server encryption key from KeyFile file -(1) -
  • server process from BosConfig file -(1) -
  • system:administrators group members -(1) -
  • trace log contents (fstrace) -(1) -
  • user account components -(1) -
  • UserList file users -(1) -
  • volume -(1) -
  • volume when removing user account -(1) -
  • -
  • renaming - -
  • user account components -(1) -
  • volume -(1) -
  • volume when changing username -(1) -
  • -
  • replacing - -
  • all entries on ACL -(1) -
  • -
  • replicated database files -(1) -
  • replication - -
  • appropriate volumes -(1) -
  • defined -(1) -
  • definition -(1) -
  • detailed discussion -(1) -
  • determining success of -(1) -
  • forcing creation of new clone -(1) -
  • need for all-or-nothing release -(1) -
  • release stage -(1) -
  • role of ReleaseClone -(1) -
  • site definition stage -(1) -
  • suitable types of volumes -(1) -
  • variations possible in -(1) -
  • -
  • requirements - -
  • scout program -(1) -
  • -
  • resetting - -
  • disk cache size to default value -(1) -
  • -
  • resizing - -
  • scout display -(1) -
  • -
  • restart time for BOS Server (automatic) - -
  • displaying and setting time -(1) -
  • -
  • restart times for BOS Server - -
  • about -(1) -
  • displaying and setting -(1) -
  • setting -(1) -
  • -
  • restarting - -
  • server process - -
  • except BOS Server -(1) -
  • including BOS Server -(1) -
  • when changing authorization checking -(1) -
  • -
  • server processes -(1) -
  • -
  • restoring - -
  • administrative databases -(1) -
  • Backup Database from tape -(1) -
  • data - -
  • that no longer exists -(1) -
  • -
  • data using Backup System -(1) -
  • existing data - -
  • overwriting -(1) -
  • preserving -(1) -
  • -
  • synchrony of VLDB and volume headers -(1) -
  • volumes without using AFS Backup System -(1) -
  • -
  • restrictions - -
  • on hard links in AFS -(1) -
  • on volume names -(1) -
  • -
  • reverse video - -
  • use in scout program display -(1) -
  • -
  • reverting - -
  • to old version of server process and command binaries -(1) -
  • -
  • rlogind command - -
  • AFS compared to UNIX -(1), (2) -
  • -
  • roles for server machine -(1) - -
  • determining -(1) -
  • summary -(1) -
  • -
  • ROnly field in volume header -(1) -
  • root directory -(1), (2) -
  • root superuser - -
  • limiting logins -(1) -
  • -
  • root volumes (root.afs and root.cell) -(1) -
  • rsh command - -
  • AFS compared to UNIX -(1), (2) -
  • -
  • rules - -
  • for uss bulk input file -(1) -
  • group names, assigning -(1) -
  • uss template file -(1) -
  • -
  • Run status flag in BosConfig file - -
  • changing to NotRun -(1) -
  • defined -(1) -
  • -
  • runntp - -
  • (see entry: NTPD) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • runntp process -(1) -
  • RWrite field in volume header -(1) -
  • -S - -
  • S instruction - -
  • package configuration file -(1) -
  • uss template file -(1) -
  • -
  • SALVAGE.fs file -(1) -
  • salvage.lock file -(1) -
  • SalvageLog file -(1) - -
  • displaying -(1) -
  • -
  • Salvager - -
  • instructions for invoking -(1) -
  • (see entry: Salvager) -(1) -
  • as part of fs process -(1), (2) -
  • binary in /usr/afs/bin -(1), (2) -
  • description -(1) -
  • displaying log file -(1) -
  • running before VLDB/volume header resynchronization -(1) -
  • when to contact -(1) -
  • -
  • salvaging - -
  • volumes -(1) -
  • -
  • saving - -
  • previous version of server binaries -(1) -
  • -
  • scheduling - -
  • creation of backup volumes -(1) -
  • -
  • scout program -(1) - -
  • attention levels, setting -(1) -
  • banner line -(1) -
  • basename -(1) -
  • command syntax -(1) -
  • display layout -(1) -
  • display, resizing -(1) -
  • examples (command and display) -(1) -
  • features summarized -(1) -
  • highlighting in -(1) -
  • monitoring disk usage -(1) -
  • outages, monitoring -(1) -
  • probe reporting line -(1) -
  • requirements -(1) -
  • reverse video -(1) -
  • setting terminal type -(1) -
  • starting -(1) -
  • statistics displayed -(1) -
  • stopping -(1) -
  • -
  • script for AFS initialization -(1) -
  • secondary site (Ubik) -(1) -
  • security - -
  • AFS features -(1) -
  • encrypted network communication -(1) -
  • suggestions for improving -(1) -
  • -
  • self-owned group -(1) -
  • server - -
  • definition -(1) -
  • process - -
  • definition -(1) -
  • list of AFS -(1) -
  • -
  • -
  • server encryption key -(1), (2) - -
  • adding to KeyFile file -(1) -
  • Authentication Database -(1) -
  • changing frequently -(1) -
  • checksum displayed -(1) -
  • defined -(1), (2) -
  • displaying from Authentication Database -(1) -
  • displaying from KeyFile file -(1) -
  • emergency need to replace -(1) -
  • KeyFile file -(1) -
  • password-like nature -(1) -
  • removing from KeyFile file -(1) -
  • role in mutual authentication -(1) -
  • setting in Authentication Database -(1) -
  • -
  • server entry in VLDB -(1) -
  • server machine - -
  • administering -(1) -
  • binary distribution role -(1) -
  • configuration files in /usr/afs/etc -(1) -
  • configuration issues -(1) -
  • database server role -(1) -
  • determining roles -(1) -
  • first installed -(1) -
  • monitoring -(1) -
  • need for consistent version of software -(1) -
  • protecting directories on local disk -(1) -
  • rebooting -(1) -
  • roles for - -
  • summary -(1) -
  • -
  • roles summarized -(1) -
  • setting home cell -(1) -
  • simple file server role -(1) -
  • system control role -(1) -
  • uninstalling command & process binaries -(1) -
  • -
  • server preference ranks -(1) -
  • server process - -
  • binaries (see entry: server process binaries) -(1) -
  • bosserver -(1) -
  • buserver -(1) -
  • creating -(1) -
  • creating and starting -(1) -
  • creating ticket (tokens) for -(1) -
  • cron type, defined -(1) -
  • defining in BosConfig file -(1) -
  • different names for -(1) -
  • displaying entry in BosConfig -(1) -
  • displaying log files -(1) -
  • displaying status -(1) -
  • fs -(1) -
  • fs type, defined -(1) -
  • kaserver -(1) -
  • ptserver -(1) -
  • removing from BosConfig file -(1), (2) -
  • restarting - -
  • except BOS Server -(1) -
  • -
  • restarting by restarting BOS Server -(1) -
  • restarting for changed binaries -(1) -
  • restarting immediately after stopping -(1) -
  • restarting specific processes -(1) -
  • runntp -(1) -
  • simple type, defined -(1) -
  • starting -(1) -
  • starting up -(1) -
  • stopping permanently -(1), (2), (3), (4) -
  • upclient -(1) -
  • upserver -(1) -
  • use of CellServDB file -(1) -
  • vlserver -(1) -
  • -
  • server process binaries - -
  • displaying time stamp -(1) -
  • in /usr/afs/bin -(1) -
  • installing -(1), (2) -
  • removing obsolete -(1) -
  • reverting to old version -(1) -
  • uninstalling -(1) -
  • -
  • server ticket -(1) -
  • server/client model -(1) -
  • session key -(1), (2) -
  • setting - -
  • event set (fstrace) -(1) -
  • ACL entries -(1) -
  • ACL for directory with uss -(1) -
  • ACL on home directory with uss -(1) -
  • ADMIN flag in Authentication Database entry -(1) -
  • AFS UID and AFS GID counters -(1) -
  • AFS UID counters -(1) -
  • AFS user id and max group id counters -(1) -
  • BOS Server's automatic restart times -(1) -
  • Cache Manager preferences for file server machines -(1) -
  • cell name -(1) -
  • client interfaces registered with File Server -(1) -
  • client-to-file-server probe interval -(1) -
  • counters for AFS UID and AFS GID -(1) -
  • data cache size in cacheinfo file -(1) -
  • disk cache location in cacheinfo file -(1) -
  • group-creation quota in Protection Database entry -(1) -
  • home cell for client machine -(1) -
  • password - -
  • in Authentication Database -(1) -
  • -
  • privacy flags on Protection Database entry -(1) -
  • server machine interfaces registered in VLDB -(1) -
  • terminal type for scout -(1) -
  • ThisCell file (client), value in -(1) -
  • volume quota - -
  • on multiple volumes -(1) -
  • on single volume -(1) -
  • -
  • volume quota with uss -(1) -
  • -
  • setuid programs -(1) - -
  • restrictions on -(1) -
  • setting mode bits -(1) -
  • -
  • share command -(1) -
  • shared secret -(1) -
  • shared use of group -(1) -
  • shorthand notation - -
  • ACL permissions -(1) -
  • -
  • simple file server machine -(1) - -
  • identifying with bos status -(1) -
  • -
  • simple process - -
  • creating with bos create command -(1) -
  • -
  • simple server process - -
  • defining in BosConfig file -(1) -
  • -
  • simple-type server process - -
  • defined -(1) -
  • -
  • site - -
  • count in VLDB -(1) -
  • volume, defined -(1) -
  • -
  • site definition stage in replication -(1) -
  • slowed performance - -
  • preventing in AFS -(1) -
  • -
  • socket - -
  • creating with package -(1) -
  • -
  • stages in volume replication -(1) -
  • starting - -
  • database server process, about -(1) -
  • scout program -(1) -
  • server process -(1), (2) -
  • -
  • statistics display by scout program -(1) -
  • status - -
  • displaying for server process -(1) -
  • -
  • status flag - -
  • release, on site definitions in VLDB entry -(1) -
  • -
  • status flag for process in BosConfig file - -
  • Run and Not Run, meaning of -(1) -
  • -
  • status flag in BosConfig file - -
  • changing NotRun to Run -(1) -
  • changing Run to NotRun -(1) -
  • -
  • status flags in volume header -(1) -
  • stopping - -
  • database server process, about -(1) -
  • server process - -
  • permanently -(1), (2) -
  • -
  • server process and immediately restarting -(1) -
  • -
  • Store statistic from scout program -(1) -
  • strings command -(1) -
  • suitability of volumes for replication -(1) -
  • symbolic link - -
  • at second level of AFS pathname -(1) -
  • creating with package -(1) -
  • creating with uss -(1) -
  • overwritten by uss if exists -(1) -
  • -
  • symptoms - -
  • of VLDB/volume header desynchronization -(1) -
  • volume corruption -(1) -
  • -
  • synchronization site (Ubik) - -
  • defined -(1) -
  • flexibility -(1) -
  • -
  • synchrony - -
  • controlling for Cache Manager write operations -(1) -
  • when AFS files saved on NFS clients -(1) -
  • -
  • synchrony of VLDB and volume headers - -
  • maintained by VL and Volume Servers -(1) -
  • restoring -(1) -
  • symptoms of lack of -(1) -
  • -
  • sys (@sys) variable in pathnames -(1) -
  • sys command -(1) -
  • sysid file -(1) -
  • system control machine -(1) - -
  • as distributor of UserList file -(1) -
  • CellServDB file, distributing to server machines -(1) -
  • identifying with bos status -(1) -
  • source for common KeyFile file -(1) -
  • -
  • system groups - -
  • defined -(1) -
  • using on ACLs -(1) -
  • -
  • system outages - -
  • due to automatic server restart -(1) -
  • due to server process restart -(1) -
  • due to Ubik election -(1) -
  • reducing -(1) -
  • -
  • system:administrators group -(1) - -
  • privileges resulting -(1) -
  • about -(1) -
  • members - -
  • adding -(1) -
  • displaying -(1) -
  • removing -(1) -
  • -
  • -
  • system:anyuser group -(1) - -
  • about -(1) -
  • using on ACLs -(1) -
  • -
  • system:authuser group -(1) - -
  • about -(1) -
  • using on ACLs -(1) -
  • -
  • -T - -
  • tape (Backup System) - -
  • automating mounting and unmounting -(1) -
  • eliminating check for proper name -(1) -
  • scanning -(1) -
  • -
  • Tape Coordinator (Backup System) - -
  • adding to Backup Database -(1) -
  • assigning file ownership -(1) -
  • automating tape mounting and unmounting -(1) -
  • configuring - -
  • AIX system -(1) -
  • machine -(1) -
  • tape device -(1) -
  • -
  • described -(1) -
  • device configuration file (CFG) -(1) -
  • eliminating check for proper tape name -(1) -
  • eliminating search/prompt for initial tape -(1) -
  • filemark - -
  • described -(1) -
  • determining size -(1) -
  • -
  • port offset number - -
  • assigning -(1) -
  • defined -(1) -
  • displaying -(1) -
  • -
  • process - -
  • starting -(1) -
  • -
  • removing from Backup Database -(1) -
  • starting -(1) -
  • status - -
  • displaying -(1) -
  • -
  • stopping -(1) -
  • task ID numbers -(1) -
  • using default responses to errors -(1) -
  • -
  • tape labels - -
  • useCounts of tapes -(1) -
  • -
  • tape recycling schedules -(1) -
  • tapeconfig file -(1) - -
  • ownership, assigning -(1) -
  • -
  • tapes (Backup System) - -
  • archiving -(1) -
  • capacity - -
  • determining -(1) -
  • recording on label -(1) -
  • -
  • eliminating search/prompt for initial -(1) -
  • label - -
  • creating -(1) -
  • described -(1) -
  • displaying -(1) -
  • -
  • names - -
  • assigning -(1) -
  • described -(1) -
  • -
  • -
  • task ID numbers (Backup System) -(1) -
  • terminal type - -
  • setting for afsmonitor -(1) -
  • setting for scout program -(1) -
  • -
  • TGS -(1) -
  • ThisCell file (client) -(1) - -
  • how used by programs -(1) -
  • setting value in -(1) -
  • -
  • ThisCell file (server) -(1) -
  • thresholds for statistics in scout display - -
  • setting -(1) -
  • -
  • Ticket Granting Service -(1) -
  • ticket-granter -(1) -
  • tickets - -
  • see entry: tokens -(1) -
  • -
  • time stamp - -
  • on binary file, listing -(1) -
  • -
  • tokens - -
  • command -(1) -
  • creating for server process -(1) -
  • data in -(1) -
  • discarding with knfs command -(1) -
  • discarding with unlog command -(1) -
  • displaying for user -(1) -
  • displaying with knfs command -(1) -
  • one-per-cell rule -(1) -
  • setting default lifetimes for users -(1) -
  • -
  • tokens.krb command -(1) -
  • trace log (fstrace) - -
  • clearing contents -(1) -
  • configuring -(1) -
  • displaying state -(1) -
  • dumping -(1) -
  • persistence -(1) -
  • -
  • trace log from (fstrace) - -
  • cmfx -(1) -
  • -
  • translating - -
  • directory/file name to volume ID number -(1) -
  • directory/file name to volume location -(1) -
  • directory/file name to volume name -(1) -
  • volume ID number to name -(1) -
  • volume name to ID number -(1) -
  • volume name/ID number to volume location -(1) -
  • -
  • translator - -
  • NFS/AFS -(1) -
  • -
  • transparent access as AFS feature -(1) -
  • turning off authorization checking -(1) -
  • turning on authorization checking -(1) -
  • type flag for volume - -
  • VLDB entry -(1) -
  • volume header -(1) -
  • -
  • -U - -
  • Ubik - -
  • automatic updates -(1) -
  • consistency guarantees -(1) -
  • election of coordinator -(1) -
  • failure due to mismatched server encryption keys -(1) -
  • features summarized -(1) -
  • majority defined -(1) -
  • operation described -(1) -
  • requirements summarized -(1) -
  • server and client portions -(1) -
  • use of CellServDB file -(1) -
  • use of NetInfo and NetRestrict files -(1) -
  • -
  • udebug - -
  • binary in /usr/afs/bin -(1) -
  • -
  • UFS - -
  • file protection compared to AFS -(1) -
  • mode bits, interpretation in AFS -(1) -
  • -
  • umount command -(1) -
  • undefined ACL permissions -(1) -
  • uninstalling - -
  • server process and command suite binaries -(1) -
  • -
  • UNIX - -
  • differences from AFS summarized -(1) -
  • mode bits, interpretation in AFS -(1) -
  • UID - -
  • functional difference from AFS UID -(1) -
  • -
  • -
  • UNIX UID - -
  • difference from AFS UID -(1) -
  • matching with AFS UID -(1), (2) -
  • -
  • unlocking - -
  • VLDB entry -(1) -
  • -
  • unlog command -(1) - -
  • when handling key emergency -(1) -
  • -
  • UNMOUNT instruction in CFG_device_name file -(1) -
  • unmounting - -
  • file server machine disk -(1) -
  • volume -(1), (2) -
  • -
  • upclient - -
  • (see entry: Update Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • update date - -
  • recorded in volume header -(1) -
  • -
  • Update Server - -
  • about starting and stopping -(1) -
  • as upserver and upclient processes -(1) -
  • binaries in /usr/afs/bin -(1) -
  • CellServDB file (server), distributing -(1) -
  • client portion -(1) - -
  • for binaries -(1) -
  • for configuration files -(1) -
  • -
  • description -(1) -
  • distributing server configuration files -(1) -
  • distributor of KeyFile file -(1) -
  • server portion -(1) - -
  • on binary distribution machine -(1) -
  • on system control machine -(1) -
  • -
  • when to contact -(1) -
  • -
  • updating - -
  • CellServDB file (client) with or without package -(1) -
  • -
  • upserver - -
  • (see entry: Update Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • useCount counter on tape label (Backup System) -(1) -
  • user - -
  • account (see entry: user account) -(1), (2) -
  • adding to group -(1) -
  • AFS UID, assigning -(1), (2) -
  • group memberships - -
  • displaying number -(1) -
  • -
  • group memberships, displaying -(1) -
  • group-creation quota - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • groups owned, displaying -(1) -
  • name (see entry: username) -(1) -
  • privacy flags on Protection Database entry - -
  • displaying -(1) -
  • setting -(1) -
  • -
  • Protection Database entry - -
  • deleting -(1) -
  • displaying -(1) -
  • displaying all -(1) -
  • -
  • Protection Database entry, described -(1) -
  • removing from group -(1) -
  • -
  • user account - -
  • components -(1) -
  • configuration issues -(1) -
  • converting existing UNIX to AFS - -
  • with manual account creation -(1) -
  • with uss -(1) -
  • -
  • creating - -
  • with uss -(1) -
  • standard files in -(1) -
  • with individual commands -(1) -
  • -
  • creating different types with uss -(1) -
  • creating/deleting many at once -(1) -
  • creation using uss - -
  • previewing -(1) -
  • -
  • deleting with uss -(1) -
  • deletion using uss - -
  • previewing -(1) -
  • -
  • matching AFS and UNIX UIDs -(1) -
  • methods for grouping -(1) -
  • removing from system -(1) -
  • suggestions for grouping home directories -(1) -
  • two methods for creating and deleting -(1) -
  • uss commands to create/delete - -
  • previewing -(1) -
  • -
  • -
  • UserList file -(1) - -
  • adding users -(1) -
  • displaying -(1) -
  • privileges resulting -(1) -
  • removing users -(1) -
  • -
  • username - -
  • assigning - -
  • with uss -(1) -
  • with pts createuser command -(1) -
  • -
  • changing -(1) -
  • choosing -(1) -
  • part of volume name -(1) -
  • use by Kerberos -(1) -
  • -
  • usr/afs/backup directory - -
  • ownership, assigning -(1) -
  • -
  • usr/afs/bin directory - -
  • removing obsolete .BAK and .OLD files -(1) -
  • -
  • usr/afs/bin directory on server machines - -
  • contents listed -(1) -
  • -
  • usr/afs/bin/bosserver -(1) -
  • usr/afs/db directory on server machines - -
  • contents listed -(1) -
  • -
  • usr/afs/etc directory on server machines - -
  • contents listed -(1) -
  • -
  • usr/afs/local directory on server machines - -
  • contents listed -(1) -
  • -
  • usr/afs/logs directory on server machines - -
  • contents listed -(1) -
  • -
  • usr/vice/cache directory -(1) -
  • usr/vice/etc directory -(1) -
  • uss - -
  • account - -
  • recovering from account creation failure -(1) -
  • -
  • AFS UID, assigning -(1) -
  • command - -
  • reissuing, effect of -(1) -
  • -
  • hard link, creating -(1) -
  • previewing effect of command -(1) -
  • symbolic link, creating -(1) -
  • -
  • uss bulk input file - -
  • rules for constructing -(1) -
  • -
  • uss commands - -
  • ACL, setting for directory -(1) -
  • ACL, setting on home directory -(1) -
  • add -(1) - -
  • avoiding interruption -(1) -
  • -
  • advantages over individual account-creation commands -(1) -
  • bulk -(1) -
  • command, executing with X instruction -(1) -
  • converting existing UNIX accounts -(1) -
  • creating individual user account -(1) -
  • creating/deleting user accounts in bulk -(1) -
  • delete -(1) - -
  • avoiding interruption -(1) -
  • -
  • deleting individual user account -(1) -
  • directory - -
  • creating -(1) -
  • distributing evenly with G instruction -(1) -
  • -
  • file, creating by echoing one line -(1) -
  • file, creating from prototype -(1) -
  • local password file - -
  • creating common source version -(1) -
  • -
  • overwriting existing account components -(1) -
  • password/authentication security, setting with A instruction -(1) -
  • privilege required -(1) -
  • volume - -
  • creating with V instruction -(1) -
  • mounting -(1) -
  • setting quota -(1) -
  • -
  • -
  • uss template file - -
  • A instruction -(1) -
  • ACL, setting - -
  • directory created by D instruction -(1) -
  • user home directory with V instruction -(1) -
  • -
  • advantages -(1) -
  • command, executing with X instruction -(1) -
  • constants -(1) -
  • D instruction -(1) -
  • directory - -
  • creating with D instruction -(1) -
  • G instruction for even distribution -(1) -
  • -
  • E instruction -(1) -
  • examples -(1) -
  • F instruction -(1) -
  • file - -
  • creating by echoing one line -(1) -
  • creating from prototype -(1) -
  • -
  • G instruction -(1) -
  • hard link, creating -(1) -
  • instructions for different account types -(1) -
  • instructions summarized -(1) -
  • L instruction -(1) -
  • mount point, creating with V instruction -(1) -
  • number variables -(1) -
  • password/authentication security, setting with A instruction -(1) -
  • quota on volume, setting with V instruction -(1) -
  • rules for constructing -(1) -
  • S instruction -(1) -
  • standard locations -(1) -
  • symbolic link, creating -(1) -
  • V instruction -(1) -
  • variables -(1) -
  • volume - -
  • creating with V instruction -(1) -
  • -
  • X instruction -(1) -
  • zero-length -(1) -
  • -
  • -V - -
  • V.vol_ID.vol file -(1) -
  • variable - -
  • AFSCELL -(1) -
  • -
  • variables - -
  • @sys in pathnames -(1) -
  • in uss template file -(1) -
  • -
  • variations possible - -
  • in replication -(1) -
  • -
  • vicep directory on server machines - -
  • contents listed -(1) -
  • -
  • VL Server - -
  • about starting and stopping -(1) -
  • as vlserver process -(1) -
  • binary in /usr/afs/bin -(1) -
  • Cache Manager preference ranks for -(1) -
  • description -(1) -
  • importance to transparent access -(1) -
  • restarting after adding entry to server CellServDB file -(1) -
  • restarting after removing entry from server CellServDB file -(1) -
  • role in VLDB/volume header synchronization -(1) -
  • runs on database server machine -(1) -
  • when to contact -(1) -
  • -
  • VLDB -(1) - -
  • defining read-only site in -(1) -
  • displaying entry - -
  • with volume header -(1) -
  • -
  • displaying volume entry -(1) -
  • intention flag set by VL Server -(1) -
  • locking/unlocking entry -(1) -
  • release status flags in volume entry -(1) -
  • server machine interfaces registered - -
  • listed in sysid file -(1) -
  • -
  • site count for volume -(1) -
  • synchronizing with volume headers -(1), (2) -
  • volume entry -(1) -
  • volume type flags -(1) -
  • -
  • vldb.DB0 file -(1) -
  • vldb.DBSYS1 file -(1) -
  • VLLog file -(1) - -
  • displaying -(1) -
  • -
  • vlserver - -
  • (see entry: VL Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • Vn file (data cache) -(1) -
  • vnode index -(1) -
  • VolserLog file -(1) - -
  • displaying -(1) -
  • -
  • volserver - -
  • (see entry: Volume Server) -(1) -
  • binary in /usr/afs/bin -(1) -
  • -
  • volume - -
  • as unit of - -
  • backup -(1) -
  • replication -(1) -
  • resource management -(1) -
  • -
  • as unit of backup -(1) -
  • as unit of replication -(1) -
  • automating creation of backup version -(1) -
  • backing up using Backup System -(1) -
  • backup (see entry: backup volume) -(1) -
  • Backup System dump history, displaying -(1) -
  • benefits for efficiency -(1) -
  • correspondence with directory -(1) -
  • counter in header for number of accesses -(1) -
  • creating backup version of many at once -(1) -
  • creating with uss -(1) -
  • Creation date in volume header -(1) -
  • defined -(1) -
  • definition -(1) -
  • displaying information about -(1) -
  • dumping without AFS Backup System -(1) -
  • entry in VLDB -(1) -
  • flushing from data cache on client machine -(1) -
  • grouping related on same partition -(1) -
  • header (see entry: volume header) -(1) -
  • in load balancing -(1), (2) -
  • Last Update date in volume header -(1) -
  • location (see entry: volume location) -(1) -
  • mounting -(1) - -
  • about -(1) -
  • more than once -(1) -
  • -
  • moving -(1) -
  • name (see entry: volume name) -(1) -
  • overwriting contents during Backup System restore -(1) -
  • preserving contents during Backup System restore -(1) -
  • quota (see entry: volume quota) -(1) -
  • read-only (see entry: read-only volume) -(1) -
  • read/write (see entry: read/write volume) -(1) -
  • removing - -
  • alternate commands -(1) -
  • basic instructions -(1) -
  • when removing user account -(1) -
  • -
  • renaming -(1) -
  • replicating -(1) -
  • restoring - -
  • using Backup System -(1) -
  • with vos restore command -(1) -
  • -
  • root (root.afs and root.cell) -(1) -
  • root directory of -(1) -
  • salvaging -(1) -
  • separate for each top level directory -(1) -
  • site, defined -(1) -
  • size, displaying -(1) -
  • symptoms of corruption -(1) -
  • synchronizing VLDB and volume header -(1) -
  • type to replicate -(1) -
  • where to place replicated -(1) -
  • -
  • volume entry (Backup System) - -
  • creating -(1) -
  • defined -(1) -
  • deleting -(1) -
  • displaying -(1) -
  • -
  • volume entry (VLDB) - -
  • displaying -(1) -
  • -
  • volume header - -
  • about -(1) -
  • displaying - -
  • only -(1) -
  • with VLDB entry -(1) -
  • -
  • in /vicep directories -(1) -
  • synchronizing with VLDB -(1), (2) -
  • -
  • volume ID number - -
  • learning - -
  • from volume name -(1) -
  • -
  • learning from directory/file name -(1) -
  • translating - -
  • to volume location -(1) -
  • to volume name -(1) -
  • -
  • -
  • volume location - -
  • learning from directory/file name -(1) -
  • learning from volume name/ID number -(1) -
  • -
  • Volume Location Server - -
  • (see entry: VL Server) -(1) -
  • -
  • volume name - -
  • changing - -
  • basic instructions -(1) -
  • when renaming user -(1) -
  • -
  • conventions -(1) -
  • conventions for -(1) -
  • learning - -
  • from directory/file name -(1) -
  • from volume ID number -(1) -
  • -
  • restrictions -(1) -
  • translating - -
  • to volume ID number -(1) -
  • to volume location -(1) -
  • -
  • two required -(1) -
  • -
  • volume quota - -
  • default for new volume -(1) -
  • displaying - -
  • percent used -(1) -
  • with volume &partition info -(1) -
  • with volume size -(1) -
  • -
  • recorded in volume header -(1) -
  • setting - -
  • on multiple volumes -(1) -
  • on single volume -(1) -
  • with uss -(1) -
  • -
  • -
  • Volume Server - -
  • as part of fs process -(1), (2) -
  • binary in /usr/afs/bin -(1) -
  • description -(1) -
  • displaying log file -(1) -
  • role in VLDB/volume header synchronization -(1) -
  • when to contact -(1) -
  • -
  • volume set (Backup System) - -
  • creating -(1) -
  • defined -(1) -
  • deleting -(1) -
  • deleting volume entry -(1) -
  • displaying -(1) -
  • volume entry (see entry: volume entry) -(1) -
  • -
  • VolumeItems file -(1) -
  • vos commands - -
  • addsite -(1) -
  • backup -(1) -
  • backupsys -(1) -
  • binary in /usr/afs/bin -(1) -
  • changeaddr -(1) -
  • create - -
  • basic instructions -(1) -
  • when creating user account -(1) -
  • -
  • delentry -(1) -
  • dump -(1) -
  • examine - -
  • basic instructions -(1) -
  • to learn volume ID -(1) -
  • to learn volume name -(1) -
  • -
  • granting privilege for -(1) -
  • listaddrs -(1) -
  • listpart -(1) -
  • listvldb - -
  • syntax -(1) -
  • to learn volume location -(1) -
  • -
  • listvol - -
  • output with -extended flag -(1) -
  • output with -fast flag -(1) -
  • output with -long flag -(1) -
  • syntax -(1) -
  • -
  • lock -(1) -
  • move - -
  • basic instructions -(1) -
  • when removing file server machine disk -(1) -
  • -
  • mutual authentication, bypassing -(1) -
  • partinfo -(1) -
  • release - -
  • basic instructions -(1) -
  • forcing new cloning with -f flag -(1) -
  • -
  • remove - -
  • basic instructions -(1) -
  • when removing user account -(1) -
  • -
  • remsite -(1) -
  • rename - -
  • basic instructions -(1) -
  • when changing username -(1) -
  • -
  • restore - -
  • to create new volume -(1) -
  • to overwrite volume -(1) -
  • -
  • summary of functions -(1) -
  • syncserv - -
  • effect -(1) -
  • syntax -(1) -
  • -
  • syncvldb - -
  • effect -(1) -
  • syntax -(1) -
  • -
  • unlock -(1) -
  • unlockvldb -(1) -
  • zap -(1) -
  • -
  • -W - -
  • w ACL permission -(1) -
  • weekly restart of BOS Server (automatic) - -
  • about -(1) -
  • displaying and setting time -(1) -
  • -
  • which command -(1) -
  • window - -
  • resizing scout display -(1) -
  • -
  • write - -
  • operations delayed from NFS clients -(1) -
  • ACL permission (see entry: write ACL permission) -(1) -
  • shorthand for ACL permissions -(1) -
  • system call for files saved on AFS client -(1) -
  • system call for files saved on NFS client -(1) -
  • -
  • Ws statistic from scout program -(1) -
  • -X - -
  • X instruction - -
  • uss template file -(1) -
  • -
  • xstat as requirement for running afsmonitor -(1) -
  • xstat data collection facility -(1) - -
  • data collections -(1) -
  • example commands -(1) -
  • libxstat_cm.a library -(1) -
  • libxstat_fs.a library -(1) -
  • obtaining more information -(1) -
  • xstat_cm_test example command -(1) -
  • xstat_fs_test example command -(1) -
  • -
  • -

    [Return to Library] [Contents] [Previous Topic] [Top of Topic]

    - -


    -
    © IBM Corporation 2000. All Rights Reserved -
    - - - diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/cachmgr.gif b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/cachmgr.gif deleted file mode 100755 index 48dda88c4f4bf6799ccd299259b55760965933f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17319 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 G0RTH4xVMJ@ diff --git a/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/fserver1.gif b/src/WINNT/doc/install/Documentation/en_US/html/SysAdminGd/fserver1.gif deleted file mode 100755 index 5d62af5883c27e9ca63749efc86299e81b48c0c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16683 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

    !i z(t%3`x_h{CXCVx7I2Cjn;>>2WqOwUP_8{A5n|@Nyi&?2tvjNH&SE(}7!BnjhPPZ1u z?@p$g`tco-_(|!Yx=_D5{JHk<-VY{bx$f{MFBd*11iN4eiF|265og7Zg|LVtA=G_H z0_}-PAv#Cjxvz4XZOfB@fK|}|>t%ESsLC3=Y%YXXX;xK`yTE@&pY2lHUlF%{RN`@A z7D(-5lHJ1{Uw>!*kBoM`)gFs~8yW4!{A7@%d?f$9rak6FDtE;`CdETTjUxt9?Fo+- z>a-o)Bz&Na+NbEpw@B()&$5CulkBMUdw!B0*10aOsJL#sndah*Ww#P1rCSLHg1fjv zc8Qt-E})nj{j7pX%GX`#x7&0%asEP}`aDVa{wt74R736HY_-{WJyYrb7?CFp9@Cno z%#K^Fpzk$dd9=NaI2k9`zenSg+4{^#;Vn+lj^s-OPXm9scL6Wu-6h-$`Lvj>5Y)+Z z)?z_`GRJhK(oq0R2Z@a_lf>r7jkJ!utL4k>i*)@k!lZT9FNM-UnuPCq6S8p0U#iKF~A^qX}LR9<>gPFU+<|w3{v}+|2W!=}F)y*% zy~|qM#}@d`UL#7T`d!+QAJ}!~;%;3egAjL?tU60Ff(&XHv01Ic!uPkqo@cXD8nIby z9RbV;q?0PAk%aK=&P}$ePpMkHLe)=i3)0$*#kLh+rYGnkt61#b46MM~?YxA=c5f7m zwfPKC6=sy@}1)TPIcm9z>8r)*iRL8EFVNd z+HhstIovF&DcelR7WlXZrwkzVe7r%(Z=K-M34{ELRI){H-^vN1n~b4H!pGB%x$c1Z zLA-Y4Zc!RTPM;OK_N|;*(@MQwDl2JPOOkYDb0JvvxWKOr5LU9M`WczZIE8e_#ld*+ zY((X^g!yqKL7;4pfMW$ky`(#i1^QUxVp7pAt5QCuw+EXJyK++d16@BEtd3J}_T7V8 zc|%I4`s-O6@Ua>Gy6(gfxxpuVnY7`$gM$W@rgpq1dvMUKMA~TGK}V>LyPjhI=f>e6x4_v`TI-kJ2w_$7?{ROmp2v>Oz9 zg6QD<*AI z5z`onlSrh+%Jv40Q(}*q7?+vzgxzB1AgObhkUgfqF7!}Z(gG|%{zkIx`op}CvO<4P z`)6e?yQGSVc?T%hTl=A$nvG&s47OMVCCWVH*Vdi;(kzxJ5#nA`s=DL7H znA{oKTHHlJbmh__!SnRE=q?RaS0<43{Rc>OU3rE~bxE1iFKyHndDZPpsWy^2`wq!> zWluLJYE_fYmun{FPa%btJyU)x?MuZm;;_b@;NsJ1 zx*U^%Fp%vV0!7~w{2~c`cP8%)ejV31=+~|LxqnvX1C8J>+@LxmNNRH#$-}>SWB3a< zBry;}n;w2!)T;ER$smY?aY`8FxDI=dNR6JBJr z2}!-1Oeqh3sR{Vv5$5Qs{j^&C9LZ0KXVVd=niA-LEnGqYwMcOnbS7;afbJEs5!1Dp zbS>kd!RGlxw5&y6&1v(^}JxRtgIE=V?}2(zfDdnai--T5}icvissL3AL)b z0{P&(J;om7MZnlE{IfEDNUFnFac7P8NRj~SrHDt@7LCybuI5l!Vq|F34*hBbzELs zQ60&syN6KH_h(w;{)Dxmy_YH#Quu(h4>;}QoP>_AbBl!rnZNRLZMh5F1?qm3Aco-# zNvpGnaX=)Vlaj~D%Uq!DCT$1JYvcssTO^yO_wXWg_&@x!GS9rHuETr9#b?6E2_L&r zWIZGIO#6|vDJ+LJcjB3ot3-lL4z3`u9pQ}&&{^aUjdVQ8u!-qI=fxM;^}i|AyXLC+ zwZ8o|lJ(*12)Hvxw?z9FMn}(+sf^!{dhR#Z7rXORGWhl+^-Fmk@IfObSjF~5)SByC z{m{Jy^B!cB?$XeC8JuBsdYRM=lTDP|X7N|?SFWN_$?d_od>tn0tuAf%c1m2hN45cl zADOVOeZm-$U_6(vd9B8d`Why8tNF*%zys}1uLAAwwi96006Z%2<{mAOMZJu^a zQaJt0;?qe~FXo9%z~tg}A`Bjq5lCF1OlW6JHi;$^jIL~3AyaGH>^}g7Ig!GJ`r=At zn^GE`?MMRrNC5J{A5;%Kch441V7T24(d}1K=>?K{@gm8qIDeSwiT0=;-rc|#Q z(gsLw$532MS6vYCdCAR~?nX*(8L3U&Wiyh1_&mvI{!)~Znzy=wTbNVE)1>_#h2PW7 z!dmgmtw;hyIiBLp3#fkA>FTt9n+kXP=B{|4V7=ikpK~(?H{rrIn;=8mS|5N?QBPD+kJFNeiKDLG z1?1He=eDYeGm8a&7)(Pw+~grYr4OnUO?U0*v{M*m{x8K40siubL1-_TYatdT-qiHq0Mj`uV=Sa*RJ zD^c8U4r^S#tuuL9|DMFB3a7=nKT-I2@BI0~9zDJNoV>(&$X^GO#d-1APTb_=FNw|d z!X=$ngy+K1oc4X5PZqzXh7MNYFUc0$FOCnz^0veulap1u=Xu9?_k}N<*}YJQu8tLp z2cIm(aqc&Ea#(zibsSv08s`pxd+0=Q`wO6%n@Ga^C&8#@0d#Xj9o-m1f`h>@JzLVm zuHs4@y^0tZYSZld@M31{S1YeS%cYg0f^#O+@X}po#OL2|>T@ zBYwK)Trn_~a$<^|9Qu|A2M*;2e zlO=rW%((E|#Qsb+9iqlJO|yTlMiy4+Mn$joad)owDe_)1d*%9`TAeo0(gRuiV=txO zUUcvZN$9^DOnR~A$91$&$I|`CSC0&2umLV5d(^TW@&e{-7>#}5IO z|Dw&)$4!#Q+!o1Wl$ITmKIYQ0Et$7zV=dVNxt8#?O_Rsmw#g@QJ0*`}(#E1qb3;P4 zO_Il!^zmW(rBx1loz40GEh}20SBG$oav>MBv97*;@o2No7%?nwc1wq>Y&AZz*?F5p zo0I=xdOv+=6rII&rH{viD_XW`bW(w^Wrfyg3-Ujmi*3Q)WW<>0UHsnUiXmno_w?}1 zq8<3&j8UVbA5-t0m77L8@_PY$N9mS_Uoc*C6-rSl3c(H`gKqXS0` zv)}qxW%VwU4dqo|<#!#@68&T)$7>hlqrHa}q8%?|9UL+=>RCP%;D<)fvQ_Upe@OJ% zRjroaqQgz{%XsqYUm@t7Aw#U=YU7~c!z@ql!*4wcF-jT$Az27eC)IHwNdqCI39%Xs zAxfRsKnS@)w2-5`@LToOp313B)mM8er}ovR+Ee@bw%SyC)&{?`ZEs9lYDWXN>57~q z2%be4EvxdDW^j7kQW+I(c46L`@xmgwb+hT1!|{p=;|l*re!{?+gA49B#D6lkE7 zFB%O9Hq}*GjknqsO(=;Tltzq+qmx#|HkN8{41(t;Ru7Ag;a21wu=Y_~s;~6=io7K~ ztB&f1`lCjwT+aFc7mn7B*d%!lzXku_FK|iE z8n4sf*cv;Ho5oUOs_~q~Mpa`R##z6^Scf{QpPg@NI~uxabPi6z58`{MF%sOGmzsO` zW8wRoXqb&j>DRET!`+3C;b)<1B{og&PPguSMQWJJ|1RC&q|@5=uG|iJaa)w&l&@xN#M}G z;W>=2##Zzb##g^ZhoYfR4xzu`LCMy2_+um{sXuL}a^{KF5`B*6A(8ZxL!)+#S#}{s z2kwR#IDE?9(v@WYhSJ2kbwC%r$?G;6TDLA25j?m*g8B2O$8jYeNf^t}QfF6b;(P*@ z^zy--LV?KyD(UO(=}L1;i+W2le!H}*r_|Y7QncuSKXI7`btJr6qjo0*TLRu`pJVSj zx=tow;ma@TrNGX-bR`A9y*z{uqWhBEU{RpU{Zx@uR+FoPn{MUlu+#FUE}GwCdy!IT zgWL%rcb472!N;<>9U=Fa?*12hONVy#A&}&v!}NN}Y@VjOr_!Vs`iV%zi`(zufMz$0&t3ZJ^9v&{3c;kk6=qMq(WUA#I$uX=Dym$zhTsylmn*-&3DO@6h9 zU^A3Dsd=g1l0qI~b=pU{&Z=@ploxk#28qe34dl^_x;x7ZDF4ms>eR;6aCLp*TT}|^85v=w^;9GXW4yrxv#`$%Bnb{cVSoi)DH3ol)t32`!!5n z%cZW;6rApR?BisfX_*6ng`X9jW|JuLai~3q%t;tH_Nu`S3}=8m;9=bQ@l?13u$tAqvDPO^o1E- zT2%JXjvB0VW>Rg^xSX95hnZ^Uu#S^$zTV=!C3g@E#4`Pr{PK)U)S%?JYC50Lut-yAI~o>m z`0>LU6>T_!rZ*~CKZ9mctjS-i9Z0p*p?zHQ2{xzEN1INtV+Sjp!MMygYR7(D%~F_| zU?;7&cxHliHY(hFf-PuRymo^13|1<1tZsrWZd9v!f(<=(PikY2Z>@c!O;eO)Tq zOz2K~`A&n1v#~~Jqwq3PLHHV7WvsctkRXA)T(8JK)RjNE+ghSVXlQuDjC78V8Z3X@ z)K1Cs1n4y=mMknCS{~>+qkNVJG&F<2Gk7!FSavRPQ*zruiykd^rUBjA=th2#>k?J# zzFBe&4RpP2L$_1rr*;=%cebm4zkyrZaaNq04uyB^H5u)_^bQ5KUNz*x`%=J7RTY^I zGhkC|lv}%{rnUX8umT~t!Am4(+?@J|b5X`9)@$PN=CnR(jDHJFd=nN`~D;?-a9mF(sD)XWCC+RJO-JtxgG zR2|y4WU*%8u{H0H?q4EmAm;?-IKF3N6Lzq@OH$p0M(d>Na*qEfLtgvo2CPOBNjBvR ztW?+hC2n-WMC!5EelM1->n6Yd3cF&*=-BG>MMd%rD+p8aQBG0Ws9Tfi+!@FgYDivZ zW=kaGat?1L(>0~a3I+Ux1(ucRuNn|q?0m7|)UH|_FKgBUr2?(-p(|Cat51%xVO@rY zn~s4a?53IH!lG8EvMAM#@b%3b$q-07@Hb}43tMhXmb5WF1n|2UAI2l zvet0IJkYS35x*u7bx!FkFBJEvp^`@$Ry?9>(Gp)2%s<|+%to-(CmS|Utv`8MWjN@! zi*@eWqOss*XX2 z@y{F7T5oA1koZ<;GMTCGRKF?hIvcH<%iRqO!mJH7{pfLrhG!>L*CA`m>imGRZL43` zBd)aT29ULYDXqVy4aJ3;+o`&_1SPxj-m}AUX;Qh*sYK=wk?&-LXtc>`e$7PKi<}LX zOZHXaL{}WJ$!a#3Fus3PCBMA&ry8b%s`8zRBqJ(IqiS0Y^n*e3i{Oy86RSU-kQxl>R3L4F1#)O2P}sM1^}I#xx{M=qktfi75}iF7CMHbsG24LY+S(MiqnQhhQQ?`c{p zm98naxM?v~HZ9st4yWWm(~`-d1EtOkrG%ug9~N&a`?aSfI%hpa#?9*LU(%yHRYXQB z*H^llM{@)oWtWCRbW!!2aqHPg-nPEtZgB;&+nbbJj}UxklWKMQ((kUPV4%4=z08{R zRU9Y}EU|SqG(m6fX;P`tCij6RWgTj=8{S7$vbQtYNTuxI@tT|_6AH+ltSO01-*9SZ zmiTj^r>zQV^i<|yxwe;5E$eLx$@5k3nadtMUCFGj!|<=Fsst?76?=tZGw?z)T(jBe zD));SzHYCV@;U|L4cv2Yw z%@`k>LaWm|zpK;5%@KQ>)x>%IC2QvJq{4VNwlh-L@{&84TgmUqpCcoN2$^884ef3>2zf zRIQ;yB8*R>u##k^c!Tx-r$e@(v32XJVGrlMRg`~a(=Uz-OFV#H)4Y`9){eb6hC%sj z>&lzzl|yCI;&l0AGO6>f-@u|(P~W_vl~TcPa2f5^ss=ft2xqialH6_8r2>LBPzJia zx^_yXu1x6(W#2q(Df7Pg_WH0*9_1`eYKqivHxUhIu&+GC(*Z+U6 z|5ZHm|Je2aq!@axKX`9``kyLqvj+t&(Z(wfh9KYsfhH@zWELyI_Rqh6V&I<`_$LPb ziGhD&;GY=yM`NJIU10jzwI4{`1zsd;Bms)$E}%ad@$SfDs@$?w+;mytyzXCyH$2BH z?NK7?G}Z*(Y%tmm*MkP+_`{ z>R+;uO>nu?2tHo(nPyfe@r8Bu8|>=r__28-LoTjs#5R@dsiq55H+XY=7T!h8`*A>{ zu19C!sj}WWp}WahOn-C@o=xkm=eEs?5wYIG;schizYug(wN2J-H5+ik8U1b529=}v z$-1LM^v~v8dvD!^vjJc5sBM6zGWwhBq0BBgGiJ1`VS?R^-xAoYBJ@OW7z(Y#>1ogt z7KI%NXFP)zycw6oq+8xAAWY(*LJdcs_hCb_fn^f}&gm8w%b}@gr&Sx@hFnmhbN>q! zQ$`l;b^ajV4cnIJzza5@RMNLY7Ik9h@-qEP&pxBqHmV7At*ZJdxcsFW$lAl_w{fmZ zbG_nF)>+NZvwuD+TP5_AQ<{u+6Q@2rdm1|LEaogRD34QTAzh8z{F9?`SFNLyYBP*P zlm5{mL)YsmHJu}x)JrHm_Ode-uS(NQHNEAj_yVVet4?t;qjW9`^n zoLbuU>D>!au!hOkUy^$l$77klyoD}miQXuzzi}}{-+_*<=qosDuMeC|4ODF9=xx>M z&01GJxGe8YC;jO_wK-w**X1?&2q|GTe+_ru)VbU2-*5XLl`H zP>$BtzIG>hb6RRk!zHl`3Ht8n6Zp|qK~kp(AC0$eRSDnO)KowETx}6|$TDnLP0hff zgC**}*B0=$5FfyaxayPHQD|}mb^rkgQj^rc&*4YS2m4=%lTc5aOP0F zDoRt5pXHU!ty-_bKRv0^*rs*PCBvNTUoQnETrKPq?!I*WWy4VcHop3O*8B#k{MJ8~CzeSu0%^$f9NHBG8 zUm~Iah&J~QMf}ursjQtZ%V%$C$%Y}n>5|6j>&or4yWVCsbC+4T8GIv=_)(7N8!g4T zqH%~Mt@c#)iKI=CZ2*a8DuCywtG|!XcYEtMLAT=VcVXsCRYSkK@>q-qnp8M?^7(nH zPNJUZL4S6x_mf=E>JgKW!tw0KSkwoxY7?9}9y^7uwexVQXTI|1Dmi@+Z<8HAMl@m4 z!{X(Rd8$UT%+Hp^M4QuYMUU#Lg2)-`p@J?o`qrpc+R*10B{Ph3e~*-GDW%=o6D^rj z$`s=AoTN9h59B6~@UTV4ac-rrY@a<1>qy&Cp0@UoF>SS_9H;I*hKvB(d5?0mRkL*i zNo(_n-8x>9O-QC;~lK*dsf8Nct|9a}{HGYbm9w=lu3}Dq}Nc6>1nU z&f|eT{|87WH?|8*DdU0R^|Zy3o2e9E*8U|_U-({{IWeF59V&7o?@Mke{jM6_p-a-3 zaF{lSLu=ZT*VBu+h{7B28@liG~s-8bWk`cPRIOpjQPCRnKGhcFEn&zANvMJYMi=<+8Ih#|R zi!(~BV;`*5VVg^K%@Pi4Z=#+T`CL@C#rd>W=B9Zqj?P)wAkr#J8rg@Q=pk+V(#zb& zezE2ugN7%O&C<85C$}HS^;?hPXwKi-^s()OllGgtuNaBWyV(v_F8o*XDxJLhiIV%% z(NxC0k~X|0NP~D^O4M6ZLC9^mJXV-oeiRb9wqawNyjl)DK-u< z?MG}~$d(MpF0W$|Ysj9_tCv@4tJ=SiX$dVYdsElftzOkKpI=g9YAI!Ig-N7^mZzO$ z>@!x!>P;#0S&fE6%F?jtY+U526|!Nqsb#(v?ALg0Fb!4zHf%%3hS>&^9oP7q1Su$c z8Tw`Z+?ujyWu&94I;<^uD=OxHeZnv6{C}wmA^EKSyXk8H7M%%jmtAKygcYbj#T}@) z0~L3m;to{Yfr>lud%Oe99}{%}`QK0%@aREu{vr^?1KA)T+85d-{%+}D-!8zfjg6fH zT1(j$0BnZhfVN1LC^G<5TfkKbzz3cZNDnGWEIdFl0ic?|AyG}BL{)(jl?~8dV#5Jy z3ZOvZxd93r{Di6nKq&^G0s&Bo0H|63lvt>LNJ5%HfJ7IAG*zO~!sj6p%?oa*5=9Px z$^}3z0$3!17N9-@P)z|Sxp15m33COg)BqG~0IDJYH4A{61VHtLcB>^w6kK8Bx8Mgc z)WAjwqy#ADfFlw{3GPa`BtYo|9Ff>ZfT|AoUX?FPv?4$S26T`pM1TqoKp_L53IkB& z0PYgv2T=6@K@!0SE~|2&gzf>9E&wVr0QC%DmEbv$rAm}H07^Un1sH((2SCjQpo#(p zN@y9_Ct+h?h=haz6nD5^-6f(6cuHgyK+Oc8asp6$0jR%#ff5G=>PsjS$Wi5a2~q+m znE=#B0E#bwcp`vm4M33uh#rkzR+X3@a6^?VC0GaSmZ%&sLBegoVu_vs772|3|C8_+ zFirwpz?Txg0xS}*0+J*a1?-gQ5)dRoBjAbzg@ETI!~@)u7!F{O5DidQ0y02|1Ym&K z5@rEHB$NVJBv=9@N^AsZFR>5cyo5S{FC}_GhxC8mf{ORxkNqB0mS7ct8V*2-2%yLV zP|yJ=RnafUOVkGVOqCx<7zX%8LMi~NKLAxFfHD^CHcL*73jzRR+n58bHAepx#A2)QtcNM*y`a zfVvSt9gKQsWYr1umc=7rmE{+Zs>&Qyz9DNOz@m%#YT9vC?w6$u5H9NtV4o^K6FLCg z(&trrzoZ+LF~OMS^p7h3skj3bci?w^2XeG1>G=f(rae$G4;bV0A8j7kDyzRBURHDg zDwoVZD0c#s0|Dxm{5@BeO+gD;%>*b80+cWLypAkG0*kEs0Tc&yh`Jy^tq-8s2T)6- z9qNjdS+d>+hRebl@RLK+DEs}M(Ok^l08C#)jL?-X;LDRwKn4l@J`~7r1qBKBhfU!Tw0HYp zDkff+waL>kMKYrAOvj{oEv8>8uK2)DcBW!#Jv;wqDyCAawc}@CB5hCJH3QdnM(;*x zJX()C`DwUp`(N{#iK%(8>8+W#G`mt4&W2)G;+-`Y7isSgx#^f-Q9gIlam`MLzO(>W zdPDvz3vlUstUk05DxqFto40WNRwmAU8`t@b#`oUFgc=o?vji8i#+#AeRaN+zmY+nx55OKC(IWE%^vnH>=1ipRw$Vy&?m51-G#B_=synPj~s8{BtRk)Ui z@;k1^rTozA=vpX(m^EkD;!?jbz5hqJc)=}v*W=>;dF%)4ad~4FA0j!azCMK{AYV@f_4 z+HxzV@8F!^ZMg7hv)68;E3Iie=2J{g&u?#iO4m%9du9g|!S}Cr*@?xPOiGEdJ;JpdK6 zba~zZsF>`RM;?Uw=@;Ml5GLn?H9NncYu?#5|1d7QSLW`+bm^z+pE&}>GpXUoW0=Nu z6Lz1#HI2^mJcY@+>~hC!Oz=Igp3jD|nK(D*43xs-3&)?KtD@r$l@Q^zHwS9Ke@@(4 zsHzo5ubyWp+Y#;mH7@wdJqcgqs*j2q`3=;-$ghumiwiyFcGd+#$l1K* z|1SBsR0}69{{iZtd-LcYp*Y&z&HNFHspW!`KjP|K+O+Ntl$LwPu0J!hbDBh-o=&L^!n%baMczhe)NDLkwH0Du7g3XwU<>_rJgXws;f|+mC{fCJ}1>G zqNAENPs%z{4xeGw>Pk66$|s~8DP=uX)|Ya${Qjhri_)xG11WpWv}#XD*c(~)B>cu=HV$Z%$n9*-mf54HdW=HR9Q#- zl)9c)t!Mv0-K9J=;C(lS_9>z3-5A2VB;R$1va8gvi3ikRM4u23T+NhfV?3bjERXl8 z0u{NnW@r_rs&hk^S#bda?w#|*WjvJE$_q+v;icy_Z7Q(tXcn;Mv0 z(fcxLFvY&|7f)YYv#;J+=*v`lyZU-xD4+ChTWUhxoj%#U7A{|M*lj;3wg1c>RvXGK za{7wexSn~3H`IX&JU3xSU8uvXp?Obe^8BCqD7FFAm~TdnM!2F+k8a%v>g~Irw*I)t z-A;}6XA1qTWm*#`M85&;nnL|u@Aqa?oWdb-$D2a+ozr?Y!zH~C|6VgFzpnF|2SauG z&B+c%FgQ9Ozd4j?TYt|MP`=M3t#1KEwdU!mEumtAPvy6U%IX>1sST9tV?m4CLRGov zZD`9>eD0b1&qIxMIOQIKDRK0ce+MW6>mZ+wP{5mBzuvL)9Ehf>b+scMvXr>!)tN3I#stUANbuB;U%<7z*_oapkQDsPA^2szzF; zxodR~eHRJUk(>}X0vCMpw{Fo;Cj(A+M?(?c&zd|MmwoqF?PH-d4*zp%EEGoAn&3F7 z^vx%G#z8sX@!k_>k$Ekx`|&uag^;WNje`OWNT?T&DfVK`rSX_De)pEeL+!0vw<{iM z`km;pW1!M&zCI=aswC#1TO!nNM97*%C;-3X{^Ozao1{!04+WX|VekYf;3>9=6QIUd zM9iB6m2&muvPn=W2i(_Af--EB`rsc>nT-S6O@@-VAKULuOuZJ;|LBui=T1RkokcZd z_^@tKfz84KUK$=59iAvZbsiKH7Bwn7CVpgK)4-;}=gMS2gP1;&>{QCiI^S-w)RM6R qYP^U1&nRF*j0-KS;B#Tp-ECFEv??_pbGKDpE;fk#N&md5;&_j!`03%GoKpZD|o<8|iJCwcC2&bjBF zbM86k-b}4dW5!&@j^e+k%Z=>Yu8e(-!q~9F2_8?KH{yrdg_|Id+I#C<(^Wb(u>7?!KP5D z-xp$%%$CNyrJ-Ph)7KaamnrEi5=*;*WwU5FOW zdT*Jx!58$IKmN{}&YD9$eB}#!qu+#mrjWTNiyicb8bc*zCTD%f>ph}`4Mz4ozF`tMy6arD@BX{h_dzg=cuf-e8?i`jCYi z!?EU2Ba8VwzF?g{w$B%yWpX!!s-zMwwU|YxdqcVy6@fWPiYJRKkIwlBdzzB`}xQMBZlMz(M|;^o9gj zgPvf>5IliZgrc6{VI>p_)pA29<~Do69<#yY_J&^!_#%;MQnMwV%`&4^(qcz1Lvtt+ zQIE8E{mtVHpi0Oc_BMFKpV=fwB#WijxWl1FbJ!E;qJ)~mz6svjBySfbz2+M!>{aT$ z3%qYizEJSoy^aOmK&Zugx#5I}*MFwe#c6eUDv4D3G&2gmU#Eh(Ekt20CvH`4M@Ze#C3kOeNgQpHJEG#T?vJoQ+M>t0~ z3ni|M967RZq;n*5jy}OTa?GevtZ3BD!m&>0xN)rTgu?NKi9%?*4pKw`^&2 zKu)t&FAZSz_haRa zOxqF)7iVnjw$&Ty(R@$0c+}UDJvwV^sH%Cu#;N^5 z%lbO6-|uORUCxS)if3u|uCmM0JTA|YSiOh7F#79ObP0R>UeAlsP}p~InST-M!QN~9 zuOtm9P`ERaHO9#vGr3jy#V%&&V&e!k__P}K7~}|ATi7Lzpm9a)3WFz99P<3TKyLOl z)=TrVPnJ!t_a8{}4ailRlKH9Lz)$cf&M}1|))LtjTEacy+K>`G94av?wXuc)kIE&o^I#-buB&_P_Hp$)c>Qg>-mO?! zhS&E1-@_xN9{;cYEy_+4ui38TvDXH@Gvlp@!QA{KH>$x0(}H=Go6{^xxGrc~Ioa%4 zS$DqKyMT=}q$wK*`Dd71#RVhMqTZGJ%;CM!-pt4%bxn&*cW{Y2Lv>AIU!?Bv%)C2! zz*Dy<+oznK{czZGg0~C1KM#vA)AblvR+zux%eh-=85Bq}Z;b^#r6Ds5$n3!fRFm7L zMsi%k%>k?V=kN1|FmJ#(nhjNoloKug8)ItPs$^^&rF3`u2isq~@>E5+yF4CVtoXfS zoR7w?8(?Yvd)~{Yhgj@k<%O3`&q&<0(-{kXV7@^5wZ1Ob;#$BQ%3S_ByG44!w^R*! z>!RFbQjZ!9X4jT(dCEAe#Wh*sHDB44OlyCqNnPH}VRFAW{^(rQ>b_X%>iV`Do3Kf- z#NX|5K|?pwOh6kL<~pt0vOaF>#RpB&T)ix>S&2EFpYAX`6pVf*D}}kQj%c=Y zJ;&tSo|VbEy8mjBm3Mjb`>*jcb3fr#*4Hfc#x!fqIhH=QjXCLqm_5s+9vE7>+`X`F zAx~5K8_(_e3&&2A>tbD&c+!-JnT6_N7e1T4+Tt;)k@~VH zdtBg=SqN{+JSOXR`+0a%dRZUqf%Nw#raQm7YcO~Ikglkq|4n>8!!+r$aDg-2rTp;2 zR&(<}fA#&QGp%N2bWdN;vI&#CKQ*tNRQ3(OKkpi5aWCn4^nkI<+>`MdyE4bt-Mx$* zHM@o>WtHjila#vBv97tLM{}DexJKJPwnh|Y9iGnF3oj^VDQ2}Y-Mi$Z9zFfy@8*qit8Z z8IzeG|9PY`#2FY}bB;7EEsbTdZucuKUbAwm!{=%IHuw!x%#}9l#s!&AXFNTtm$~^_ zo3GJV;V>ybKWCDave%@yY$GNew&k;k@V`tMtQZT;HRt4J9<~`(tMX#T z(IM6v|3&#MlCPY$I8x@j!1`!pa_^-XZoVvIXij~uxko5#MrK`)6B@EYfg_88;mnPh zv1>A8YGyruDf1oWz?Axf^`DhJ|JfD%q#hN;=MQX z)O-(jXWAXEaClm#5f+J^?>W!9^gprxT0_&gD?TJsDJ!~b&b-^ZFUy3msmb@Ap8t6> zd)6LXY(4B_&t(`{Jmhcjdc)x(wl5;nR#eCHy(U+E{sq+^Z?s=$-<0q1cVSn}yYZaI zvYYR?>y`YypF^NHTxaHe8aKF(9Wl|H|q@RHsK4|i`VQodqo&R>^|S6)cFmQ`nL$~M`o z>7_%Iu~MYPvvP8eY44kzz58UT85!IaJ<(!Rw?w=#r*U4Mclj0FCih^=zZ_&zzsbyG z{@7VQ(6tG?)L${xL_&Al%+7nI;mVOQu4uaV$K~F-a|+BgjVwz&BkP==&ZVqBn~^?@ z-EZ#7e2Z&6)1U+uFaG~OiyG*rT&kMXdswDYq&{**UN1F#f^xl*t{j}rjy5=Cr9@el zQL3Ch$y_r-`T14jkF0rqrpz2exO0*5O{LJg{FUJ*7QVsOuW))phW&`$6K-hgF+KN+ z46AZhx9L55)rT6+?`KO_`>>Ba4c<$vUxpvewz4~nk!Sj?%WCK=*Ys^D%Lq4wd<_d= zfWi<_0_n{Au2BhODlc?5IYa%}-8sKbH#uiySX|>39+$bfCNpv(TgQw_xFPJFwDgzr zdOhc~DbtG@B4;(kD(qwAcZO%UpI2grpgp%C7LA2Nk35+9cJCP`=YEUg3gkJ>zHs9; zwq>3bGrlpoCfNOrWEPxie7jfvRhb!X+18Wgs^LceJv%ad5wx!zUFLvA5 z8Q<7OF3ezc(*T@)^}50ks3|& zo}hl^Pvfpp%J&mJ{ggH1TkJ<~HE+wgRM}(saa>pB6-8E$1{9mpq8?eB5xxM52Uo-s!)nNt$+ zKcbX-T*30U`uRh98q2Y_3L4eZ*@j@F z(|&@{|4rlK+%#?Y9T+t__Fg%4#~yV0PCmtD(z%GK5qX3+5`WUH_Zi2I#J3r*(0K2G$h0?UuRL zufu<)8y1&SFSv4%1X{v(x+FYhh%3Y@RQje^>s;) zRCt1Cd#)^he)u;3vNVhP!41Jj)|%3kdfD}IhQjJ|)gOlQ%S=1W6?{*B)x5EV%^R8i za`x+K*rx|oTWoirLRP;{Gr9IzDz<%ByQ-<>_3(UteNXqf zdG-C+X&LXPE8!fuz|upG8r31zpG|7668$#c$$0!k)!h8cp};lrGUcUoqcVg2XuB!m zmYv@EP)4)tKDws6N%@NswWTS2S+1jpLq0JrINVX^t@Va~Jy@MTu3Mu$WS6?Xkr%VS zk(F}?Q}ZM4bob!=Jm>pwXWnklR6I_L8s2Vy%6j4mNK8dJ63A>mCnI#g<8S`Sex1b) z39H#uhrrpYASO)gwIY4)tU=v!gpQ?==3ytQfPQ^8aog)aNUb$>%v< zF~j0}ufSv!4mR7Mc4-cWYTteqC?C>qFP4D;G|fi?yE5ytSM1E!-JCI9^#A z3q>C zTY+yDsD*s+gMGfYH~idU{hz(D&h~D;rFkyvqJAA(;B7p_H(SS@Y;pg5tM#6fJSVgC z=4Y9u~tT^r!8`K8}`(i&4H zJNitoh~dn>s{K4ip?#!!rs=WM^WU+L>uPB(kRUaz>Q_B-xcek?R?UK^^A~5GV?QhA zf1}8x7>3(bmBs#^A$yy6+-@+fwI95)`o#-E+QTXWpKG7k31IQ{UC_JSO%R47OO)3dU{+iW(dFwV>uPp z%8q#N=@PlqX6V)UpJ4H@Te=*t0b~%0x&Yf`f@P1tB;bUd# zfi5xA-I2TH%3U&7*2uLdREBE*D;b^3?19MtR;Abdl*e6nSS`&x-2-ZlE=%h>VkLKQ zBYVSI&Jv-&`B?gs3mURJ^f8@!DrjC~e~ zein#+)7)paDY9@@nSn(X?g=amcw)f;1J99`dlp8n#+J?K%2Mjjxg@<$uU_nEhRS5y zU>2?(0#D_{QTL|XS*)tZ!WYR|_u{~qMfoA?6|<|ay~Q&t-G7a-SN{I+qSf}9FdOgB zG%H{Fze)c-eRugHiz{mD;yyc^?F?u1WRIrx%aGNTn+(hwY1!6$k?-}i4;F>$K5I!+ zr{u`&s`0&A4lY+^CDdXWCgD${<#1@(iK@4@vbo7>TD;u6V&%%WtefwA=AW0=sTm)9 zFgnBQxp}1F)5e|w&rd;L9TWeCeu^@$FY*&WEiy7T5XCrgu))ZTD@T+2yZwJhk4j8p zc6>c6%`V*KXO&JL!7^qV*;%FYDypU}u43<^r?X0{7SEeo>}Ja@O=D+G#~YTj2~TrQ zEU8*BZ5nf5BR-TBR~55oFB8vHy9a&kZVJx|zye_kh7q5F_1@)dR1bWrJgKs3+FX{G zkLRj+?pdYm1(hDF%C&yac^e%pnl-PynBCa}VAKYjY%&2?8yLa1;Nk!M_x~vH|0wYP z0R{e*#^C=)M-s}7GGkBTL(ZT?+>EihU2HaEJ7;$};oe6!AGo()-`mG7Ti8%MxV!bf z_}%wC@X>WIZmFz&YV*cB7B@GxI7VRyvf#jrf4l$1?kA-WHinCCyXRizzWZ_)HW-=1 zp)#dUmQpM^6seEma7fI3@3!rq_1w#|Ec zE(jNWdE1(*UiTQi-eo_0aPGqFM{d8RYSg%q3#XTk8C@oiC>@Zs(B6AXX~Ej<-DijA z_1V?6a!K!1rlJvjhMYNb_~o@t+Xwp!cFsQc&B}u9x79>!!!CMe<4I+U7yfnisO+m8 z^87ar4S0wzYdCRwRoQe;;j^dDzHr3NRSQOxjxN2gs>{NEZr)@oT{Ba5 zJtlPDVcxj;(rvZFPG7vRbn&V)hYY{%`~%m%Q@8Wn*H%ZqR?f2AuxoQkLG2D%UbAQ4 zhO5l;ZJSPrsq>kg$91QwRR~_nSW4v14Xo@!ZS1b(@?wr1tAe zXU`mb)8ebUJEb!!XiH=jAZ z%3D)E;Tld zx9|L7@ZY%ohBY7cKJe~UlOI|VnYTaw(T}$`k-oodB>V{4bSe_VU+eUR$N}}cnRy{M+z*b{KtMd zdNlvnlrR2&_jvtL4!9r0;=Yp>xIe8A7W%^3yHB76pT~+R%BI$b)LA8SRRqITM5evL zDC{32yTN8-2GqGtyeticn?qqw6fx3a>WJ~<$1^j_W@s{eRN>g+#icWcJ4cNe<8-2- z!b-xSWf5;lEE)|3BL#!;-BeauQqXrvEYMut=trE^6JF7GSl@v&==osS7wS8#X7;Rt zn&O7Y@L;sC$=^I^SdDmzih~9Z8q7@WWOfe8Dg8eLm4o8(SSTbacJjADTEMJ^$>{Cq z(SxFh-qTyF*84n&qT}Or z6t%G8FotHCp!_g4y*Z6dMiB;DhTg?U{3SXNt4+b*5hw-&CO5%*_?iSLynd|^hR z9s(!@D5@G)Se${ZYc9Z_xWrZ+wJSaD#H$-nx}zO+PVEQcui8C6#z6HAY)jn0R-rPt zt>6mJ>BT?djQ08mh% z27GQYS(%sRfU_B+7r=_$1vT4gFtBrz@CPYujA4;+%}cV)tC#%>>ii{HU`CkLgd(oqLZ?( zAf;j71*>La?8Ly9Cort-)1oiX;IBHsyTHUwd{ztN6G3xg;w@-|u#JFO2N`_wA8vbs zTLyC5hFsgJT)s`GQ*I^lQ$oRL7)dq}F4qBpk9Y;6nsS`THAsA80*A`WR8MN_taJhur{MyuqbGvg}kmyX40_MOweBd%5LNZW-DJGJ*;r zr{hB=mlI@;qM3k%h(l04h@ul_Gof<~!Z->r@M6JMxnM&s2B)oeCJGJwdF$XkJ0(kw zg0cN#Y#N`&MaooS?2X46`{I;2u?2H0l4H}9(7280=lE0d7^K4eMW>>E5QWD5N9)+{ z9A|6`2!Dh`#X(+L>klEJ&4<+p0X~!4Y7;!du^fmNT~G*?A6nrl=#&=3pi*g32=zCj z5G)Ol@4C3?)0RV0*G_^@FK%7#2GTYE;g0w8btIK?`^nrP_~$X2vJhr1$t&G49D#QY zhSNzlnn3Jo*uC*vh$lIr9X{mG_8>(>TCy(+!S^PLPz|HwWm=;x>(Gc)gLC7N^GFo0 zUv)H}+cxq$x#K50&!2;qqfltL{?Jq;Rn-achIXyj+;`qy(K=4cA)n`%xW&WeN^W@{ zv=&-o>U17DAeC|s9%6*wRgN!V-#Vs=#?!OLhDTd$`Wb!=_oD~ z$7T+Zos-KS=JKalO+w+7@hK9t&Z&4m1q!@2jHEfCYqpWn9wpRfC<4~5z-Yt<1Sw&o zQ~oT1c7b8bz6szPgD?hmR}?Ubc2t0c;QQ# zO&avJhq!z%Qm7oOv8bkShueS!3zV{W3kFTUi6L z<7cpg^Z>Uz25~!#-BL=U^*8zILkuqzK9XDV!BMsxZo7laSuoJBG`oNZ8dc{-Sz*dVacs$g?s+9x83T7Nas7eLx^z!wGv zwog)qDdV<0Zkfd=)`PdgWQyDF0YM$g zsWZ{#WE6s8oLyf4r(ix4A`l8%Jk!fX#n^~UBGeN~WG5es&afz4s5TabKwE~Y`l9e_ zivkV>s^&5%g=Z?z_yM3+UhyOy5LwQFjT2B#hf5o`pCv^{`J zVCl#cvq$Qmrh=;aP*tBjF%<^GcBr5vw9;T=jxvA@+xb;4KM0^LCkc@MiXNUqp}|bW z029y1+7j*mI!jCGtKIRk=L+FiuuPcR)YMl$&s zb)i7B-y4805JzGnj7wi|%L91lxR}8@f*?E#VypsRY!uUS5=JEyh)Vjj+}nOyhJE|$ zq)w-$0LFtpC*shE~(L+iAd@scC~y(|Y26RV%RP+zuAjSJOi^%6`m zRMn?Otlr~Kjp!)3`e~S5D1UJElWd%aLPMv6)riwz+Cvl`WA&3LDdIG?<3n!w86=VR ziWQDM3e?VJcp;mM66>5GnvZV(+&aGnz}$~Qfc=2tCE&KiW50)MQW&W7$AqMT5Hpf! z`6umEfKvh?eBYnjB(cQlkDP{2!0ro_eMMXv3+*+G+usv*X)PclJZYkJ&U%u?6Z>#& z!7n-d<%~`_%d($_{;~~wp&wzP6WW{bL9kbk6!wDEEZB=)HqK~eFYLII%bv8;FcgC7 zc@&+u787L0<}H#z7Ef~B(*W6+&$jEH{HsE8LhlPf-TAsVN{sbHq0w^zCE4%lb@5VR z>vkroJD;o0zoi+}p(x@j$zZugGZ=-c;qob%p()U?o=dzCvZb0Fd(yjnRLQ}J52vT7wbo)YI{OtL?HI+*ujbNS zV3QBTJ2!A%h(bi9nbP@VM|=L*p6BMB^M{8gv;j#Ta0H`01JUz#6u}yOQ&@wna*{ms za{a7U*4W+38Ke-%k|KCMM$tK=;kP+scT(a|_X8mY2ce%oU~iDJ_Mp(P%h6nyIAXbU z#u0+ciui8O^8iYB_|G2IpI6~;jx{N42$)Av{+zHm6EJN+A(+O4YUOxV8+1osXMi1p zDK!Bp%n1RfkR$N)4KL!BwcPds1WZmQchDZ>6YjW;=cEbUbUKD3;Az5i4%ywFLpDG8 z^P3$wgtYYTwz`SdeE|xgu@^;f$j>r3!IsCqSR)~tqrH%3Bi<6n_um2<u7_Z^>+1$RElMhw{muG`qTyjuF`EG0) zrT4jfd+xOm2X>vLs4I}7c_DTugiZ%og9)s@+D4?E$F@rwoM=9XH%S>1KA)k$USR5i z_!&A*?LsL6G1|$L-@NbAr2jy7+FMo-nCrlaDTIU2YRr0HBeu-wYhdjTDigF&~9MkD`f=`?ds+ zZ=@;ETG;MxolX#+tbd$O_97fx?}_k!bvWM};+BY*>08ldCJI5(1KXHwcvicd+f#$& z?kxh6wes>f+XGWX>NCuZ_${Kg2nknfQRHem+e}BBMbx-@hBt_F*8b`$Pi=K`s5#b* zsP6vJ?9VjQw(Ui^7SGfN02T!U3GeYw=c>d!q=1McM*8 z;WvRjcH;!d!nT}x2cXPBA;O+r!59%+?S1Z$c2LKEH`Ll$XGFxjk?LqFflv5Nn2*&I zJE)@E-PoMp4B&E6h`jw^(q2Qrn$9h32W<3r11nerhkhfid@%Ai!R**b04O%d0CGEk za-a}3N$}o8K<1s>w;hlxe?O4*I1Yf5u5DRh%x}ZlS-ZsS7tqG$kN-zhC!|P)k^Cm9 zK;O;AcR~f70~ItdU1HZ?Ah8U*q!(*ZUOf*U5KX)YzeYh~ze>GPg`o^&8W^t;Wa{82 zY}2%e6loZRI{y%55T0S4d`N9Ir&?SSGjOCoL~+=~{9Id3lUCUPg=+XRo=Nty`(KvbFM}_ERpdWT>w6t@Kt`R~M&D7YU?(i3vVlt@W$c%BQ#QHrW%czv^nO zy+2eZq#t!XDADzA)fC)v4A`4u!83jv_T$td*iUW`dnNM9V-X$Zjzk%dfc*IN5?t=M z3-dd~&Wm!Tr|79VSA1jJL0=8Q>^Ux-dOgEV3DZSW9bT<#Ej4b#wu81%sq@{V*#BvO zxX6axBsnOg-Ef2UB4_$N^rc|2HHh+Symk@oS1wC3-ozFUQfiPRAOeB?{J!8Bkz7h+ z;IflK7=5spk-z4)^J#=kE=?7jwF{upR-3qLAQsUz#95}*8`^NzsYxE~W!2^LX3VP~4j9OOU&Xd_bo@4Dvx;X>-vfT5Z@nIMUGqEP zE?!tg$=}p_!Ef~5TJ?{>K6h4S>Fb8dZaIs#sAq6TqcHC*+lU#j)>E}Ce7J~wKeuU`k> zCHhfU#*56&hzlEE{3{Z| zF5(iYWB3Mb9vGHk{T3ZA&!OEt5;Jls<7+gxRKatQV?(yrOm3%uMbC6r$Q=lv%^@$k z!-a6$1^C*s&yMc$_(a_M(dY|$C`4r0Cs`~wf&ydNaW6>$>3fQ)twY7V{3AQ3I8hu0 z(e;xl)Ju^`#}`=R&D_45_8CHOl;RjzBkqEMA0iogg3)fKv1f7t61UH378l4M))%p3 z8tFAjA8l`p9^piXcWDa-NY?bACd3MzY7$45@&7Zj*;BLhtrAhxC^JQln!i$jvZ4tX4Gg@h1cm#>XLSU2LO`opCGSvJ9$Xz!7AVw!E#6N zP=IHc0LbJ9W3;gW;3LwU3G)4X7o%PVb4x8IjrL!Tcd$zK5r7jhOBr}O9YZ*#iiNQm zeP&}B6KkHkUfVLOL*j$PGB&Wg$q*1+s4rZ=OLL3tnSAI68dQrFZcq876U+864^uQk zK*nI5koSNu&ZXE~C=6G3r(Ohv_>TY{+V&F8!3!CCjMPE-YHizVV!EZVBq>+*O-*G} zXj%1ipWjx8Pyb))0>qb7F-0?I$q zlmJ-V9sohXY7HrvKPi|Jiv1HP9=95GT-Cng;`;hycH1}6?QtrJZNg^Z<`RrS+M@NN z;0*f8vX=ghVk>bzCR#xu=KBtl4HJN=uf|nkyX0JVFriADJi$iqF(FNwP{*&AP;t`Y zsTi646@~aMzClkb85y70xm!ZByc4;DUxD`>e#k`2Klns%1Zi2}`Via?%_MooCJh5398c`iH0TBN$?}~Qq`_`-zTdViso^mUOq=gjs^fP zq8`XuNQ3V}5xcCpM#h$=Vd*nTxJKy3we4)MK?`A!sK zZv7Sl{}YW1D8JM$g3ESC9+^9~e^8jX4}+GN!fmhPgCm!8mavA}_F|zxZyr>lG{<1M zmee=WG&l1_xxeW7RWO%KaQyFt;zIuODcsU78Ea^>ClbM}1+dVODYHwk->V>FSCE3p z_{t?(P+e_`kI)S}EyK!~5`@->k>W;9p$@#pDWP?tHAF^jn`pXLCrLs}IqeU2YRaRt zP&UKMi-mRI0%A5d8Ih%l{Nw->-A;}SQ5Ww~@AZ2HPPM>^gbYn>@g6w*@T_i#tHh!v z1Kevf@vv4NEu=m8W3CTu-^(qf2CpFR!&oAtP6FCebi9;?pBA=*T}9mh$2pTNg4 zXlgNv`HxKu1n^f^0L2E*4r^#e&Gy6j^#$SlVzxEZCab=ju%*5k=+? zjs8k&XYO{LiKMxd&a!fmB9}X9Dm*!2e1e1IhYpLDIwPc`fJG#!r8Gy97}iuu&frv% zRJ0Qy7*0n=nxvAE{)cb`Nh>>E(u?a*9)7y5q!Qjp7b=i9g}|UnIxY1;`SB!`XkLWv z7Q^6TkUsxN8f>dmjY39}s*Q9KZSDMCZcC#OF|-dwh;2V{ClFMG8H${md&sK8o4wpJ zLko)2CJcsSh&x7W$(c^rXF&{qCJKRn2|yqs;DE;WG#MR|?c1nIA>EKaCH8iSt=?{u zZniEEh)8?*31HpSn%RcYrlI#KD1_{*D7usWEN$(!bWQFO8<|F6cgPR8mMcbHG#~v?2!w!HioS;7SuKdK)X?AZW_-e`1FiIj{JRde zz!!{32ZN~-boNLqa6*9|2RO&2=vU^LOl)Jm5RQ~L(90}I z1MAYK7;{mt6>%I{iHkgl1Z=DHt>tR62_Czmr#-nb$3Y0n2LOY>oRPQ`Cq0CDLBJW& zAy4bfaEhRyw)_avEmLaZLx;Mwnc=#%G& zh^s^!p#-Rxwes}#VwtR6Ez|&sNpT7inmrQ2xwE%IM3Zs5QXi6lehNbp2fZE>rX|#|@nU@=OMGCGsT+gZP0>*M3E)WL1uzNYRl@=gtkg84EYIWI93hX)UIjY-Mrc;4zQB5xVkRvtw)|6j(tX|mo<5V)i`+yZ&zbANE)g> z(T6wR zVK`wn*2?wA8WNY}Evt?;c?AVZH41oqeu3wZ_QM^ga>69Eoea%0iFWX|Gr42G#!wL3 ze*-sO%YP9Y{0hY8Ej2o?Rl^6MaT<0p(WlJX<|dIa2|^Vnt~EZXy!NarH8 z4v*GlqTi8V;d{AslK4ij+r{YYb`)Z@S^JYt>67$b{IT{ff{~FSH-qxMaR$(G9l9h) zw^P?oBG(FQ=T-XJaSHhWgIxNSTc+U)=)^`!rF|Ms)Jp-B^tPRvJSw2603@`82(>E# zjT6tRQ(HpN>ziOGP`beCIDEm{Qo?Da72HuT#)cYooW?EK`)O{0RcK9x@apzYEo)OP zkMlOTnN#;=ZDh?<9X)9t9gk>(BeqWhP0PJ0=pby=9v_-2l8=N-9U##05%Tf)_>jcG z;SKm_uM+z)^6u?KAw0fs#pRSgf{Qjo0v$|+EfYeA4jXN!-5|XaR*5``TW%9rUCnK8 zQ^G#xsMEu7CWBnGoxOQVrWR#6DCXHbMj-<*bT7~(c*24QQ^i)?(J zi~W}+1RCuTvoVs^9*GnJlim--GaPAR)7bHt4pyGlIME$7(>f|TA1z_+3lOeGPleRe zkoft6Uv*Esrrfo4jJ|?^1BW#=&Zm&UCddh-U+sar#`cRoqxAi4B5Kj5y6rWNQzbGE z#?|34rRYLTbuosett%n(Hi|AU#WuFHY_il&g+zJ)jd!6C4x1!U4A1cG_}Z+yP7})F zN%Vxo(lvi-S{bK!kL@#HrVndJcn-&GC22d3-<`#C9H=okcQJC$O#D=Cm)^$B1lZr{ zIcK&NxvAiaC`*4W->e)^k~u;szYC~!^Ir=OC(c{PJEuH3lQz&P5$R(=feq*<2ZgZr z;Ub6g@T|TSZ_Ndo87EbGdVBUQjzNFIZm9F%P7Zk7^^jI|V>qPcR<-6E{6Is%D9blQz9+prLadmHX6E349gCXfBYWsa+AxZPOEuM7Y5YASt6MZd= zre%A~4<5Q`NA`}{PBZ^qS zluk{Vz4TueUeaHBIUg@l7qB>?x{aDpErQ^26dm;bLgLVk8iITAFNHL9@ z1y^(-WQU%oI03H)qY!E6wT}D(4f*zal9Yx;`_U=~gr*TMlO=J=1NOpDAfJpLibYNH zH+0F^zLMY=EN`8Z*h!Nk;E7flCP4??lgtmN^`0>0#0I_znCIka)hWh|rQNoRp*YQn zXc?U{oKx?M;3q_U_#qcGpaXXb3`W~TZu<^n!jiO&=O56wNx?_6NECP#xafi}tWlwT z8m)<^(1D9(-;Bnjxrh*D$b`{D9PdyEtuB_;_>_XbkZzXVz^Y?PJn;kE@31Pa1H95s zIJ3HO`3gX68w#N|9)!ORg@FAFOteOf4K0aVaI^tiZ9i?qlz$VcyT|<721pa}pq|(( zB=9jad$&`~V`uj6)OLf(d}gXGJwpG!tSt%b@a)3rBbRI6+B>u9wKU?zdJWrOw9n9o zNfP3o6U!Rfkz%@Gy+4-ZAu-c5NdXj^q|ZS(;(xU){?;)k3iFk?_(V%y9t}PFYpyuJ z(8`@ffV~Uw&={J`GcnpU^galMrpRedYL*JYSB8C>?W8XUTLne*O9P<@-GYJ)UZh6} z-Z~2%kO4;E?nEa`@eEgsZh$3&3$xpc@r4m@nD({R(a;&*pvWX8ah`OwbpBqb4{X4& zXdq@i7|V`Az}t|HLq?{$F5X*1AUXEP_G2%C8w-kz#&aYLvDWVrsv}35Is+Y&5k`nr zVE|qC3TG!=Z*3_wrH#O_3Lt5r4kv>2b4nHJ&P|$&C`Ef^k;f$&1j?UgvQ?o??R45%`#93(T7lU&6g*T?V$E^ zq@o3=Oa^VD+x~b~^Ws-i1G3R^69Ehaq2Y53Lg9=gA#UKMzF-8u4TMDvSwte7PEe80 zx&%Ftrl8@=0jR*_Tp6kaon3D-3rmt-T!3;zaT`pGT!k-OoQ1$fqpk98J>1nnb;EXX zlv0M!YT-B3e1r*6im6FZ2x_hh0FlTc)Xo8bx?UFhT9H-?xb&?8R3U(EF49@(Ye^@rFcn*p=(fx zvTuVDI(7GGE1-i5wmo&BTs^R?U`rwPf2*MFK!e6mL{}U5^##yb^{>_#D(Q}$l9V5b z%&On-DuCzn&u{(F*xi2YdChRrisJ}${aDCf?e+w{ev(tkz`!x9kRNtY`wlhlM$#K9 zu3)V8#G)bUlM>R2)I=Owvm(*>cr9p%Rqcl;_QRJOsc!2@)ds?G%OHHs!W$d)M9!$L z^@M5Q@d+*b$J-_(FS%!gPnJ9<^dOF!L#EL4N?5UQENUz!yqL&R`IdIsjvn+L*^j5_ zhAv5=#B!fH3jEg{g^1z;QD`sn8~0RrP=y2o(U63qkXq&O?Zmdpdn!aWFc$B6aXZW> zy#Ain41m@&UfM`z5#&$6$hK_Nz!#SK&&Mc2EEhs7(_U(f*&zH=^kQfUW^hJF zu`Kjy8G4}IDS=28bDa6vr3av#V7>HE|g)^RY80eQ5{_+0@U%OH|IKRwkZM)+k2uOK#$Na^g1wu zNL~;~l53h+lc4*x6~aFeLjMbTxebMYJF^VDgJ-z^9d0dH zF8|a%SWep^`4%n@haMngwsEbFsWqN1&{&JXE>LsHVLU>=pn_l3#4nGAf@Iqu*e+xA-yd!#^k)DH-RA$3;da8~VHDcc{a*^V z6VRilOaB+c?JIzsf_c%?2ov&()1M)V95wlnylLfQq<@bS}QIT|gXZ`3mFNJ_H>FI+(Cq z62a-@tkQ+YZ4%6c*!>EFua}S{gTW8ZhKCTJ)kXTnY@KDaCFZiTQ|V9$`m|}WNr}rR zVN4M|9;k(WwCJ&;2VKRMU{!1n26BhKE1_%0{ssrxnv@MGg-UR`CfPe(y9%9i8bZWi z&9}(w)sEiWQUG~xPuX#4=~T4b$)+P(cb$`5fGIMglLT{e0#V$L=u?SCv@cdiYjMAn z1oKwAj#9k00YQX-@+o;MhdMyRi(4Cus7p#?;fe=s;q-vCS;@&UL*~ms6dLoT)~4me zi78E!vPv}7GRZVgJkOtn<|K4zWRgR=xbwH`LKvYmx>y#S8J?%16Y>cV9Lvy=ka+bl zJTBSu=AD)|(c;wa40{h$eM4ZznJH`u+I0e7v4Pk_z@5YhIgjgg9sr~O0 ziBjTmcg4m1fRMNp^$#GFER zjZ<{Xt|jt_^MEt>L{BrWAFK0HR@rrQj=(O5vq9UoRfo~tnh*0+BC*;?)EA8%8SY0u z=RVSi)cq8mlR=V7>Pj{*q?N6-LkIF@Vg$O14nY&!e_QztEguHq`(QF?F3T`)`j#qj z)lyp%_|Pr08|~{4(;al$sKZ>^`Y|uSV-dy`a^!ZZbZD%IIU+#1clN)ER)2v>PJiIEmVQFps`A&av~(~CCcY; zzKgy|wIrwqsQ6rDdKb+ESc6aq#X*o!x-=A75ep2v^jwqiT+3TcrL0SPTa=$(pw zI$EBc911AGzyk;XG`J2$*CMlNMQPGpB;t!C7_1ec2plh`WWMB+?dn9KAxXsQ;McV4 zL99dSL68(#?I{=hz~4c=j7A|ChOE*hIc)c&B=3foB-QEV;MG#XcGdmUHr(cD!6s`l*A@!7qO}yn#k^mGx30;nU4<(7 zak#t`*HsG70lz8DQ*$6+ns6GI2T` zRj2(~8?Glq`T`&Y)g-%g8Ar>T=#joQNy#Q!0w%*&Eozxye%&t6(*_eb3#$OTAGRHZ zP^mmW8OEQV2;(Q*Rjbi2giY$dotXu#-?gbp62C(xRVQ(LQdy|l?uss9_?M+#(nY86 zJ2wQ-TIl8WA$?8Zz(h^SjYJoT_zc}VNGX*g$&8Sn7E^;?@WA%Nb`|3<;vHSujk^os zVHVnowv&mOqeVhI`Xma?#Rs6H5ZWi`896CVHJy$L-&)!jT@U6STMvpm!@;WhRtVX$ zVBaQOSEBFZ+wh6t(K-M^TLPNUQY=VagKVbhTVU9EECtwadfOF1Ci6tf`w`9rXxo%! zKwXmXBV3nb2z@1|?65k~jm2ot4~1a*8;Y(QrxRQ$y0QIE=S#5^XqQE*s4EJMNRmcJ zY*@Pvl3O&PRT8_jsdLeiTsky#8O&iJ$Wkxp?TMEp&FSUE7qk&%P=>hetRH^(8uuJH z4)f1uqb}{-2#kwSUnjs?0;Ln7j^^!^%txAcSNMJCSQCxf52Fsov#Q4L(j>eV))j~d z^{7v}w#`QZI>KLHw3TjH0=2j?oXcOrYs+}0H_{9bX@d`^wqXoH$Kk9N2}y?Sw^M6P zUZGETKl)7qFPEc`FJ}OVzn~CmL<(KS{-m)`!tJAJ9UZtop<)HMx-bmwZwUA2^`Q(F z6ZX^au)SgK#(Lo;y)a%VvBP`XP754%38g|{QkCDQRA}xd=pD~ME8QfC5`t}X3S>sY zg8^xgdfe(o$jy7u1r3^e5e!>=R$pFKCnhc#Ydouc?5r$Q9SlXQ@yqQvA+e&mzRjT@ z9MNd@M4KWMK|@TC0%v0rfwMo@kOFt{_Jhx*QKQvl-3?+;?aV}N{fmTy_*f<<1n9ntMRu9Dc6H8z^cj3=k`PB9h5?NA@u~p+rTHL$eOh0W$ zkPl2i{u>n&7|F4zS7Klrn2DHb+{HP(v?W9UBY)G+CNq$zM2-+mTQscL1^x3rq!0Dm@r(iW7Gj-N# zV>&)3MS89ls0V%|dkMcCmmo719jndpqJ-g*I59w-;^!3-_J_8MOlZ-RZ<8j*%h*yL zd*V~>0JTvvmtErmZikEUMPYW4WZer(Oa7HiL&wK(B1ulbZQCq}pxYN(V~ughr-2nCe^On9bzas2HSzLG_=mA6Lynm`rW?W_Tndhbb! z;g^Zz?W1Kn?GvW{UrsA}nNWto$stOElf2gfNO6dYEp*aM zh?7r21aIhcElq(Ue)E9>n_|$%bzT1nz99Wh|Mk|NhvMaPCJGg z^6S!ep5SOeH5~!5o$o}=i^F19a|hf+;s?n#p=n|S+S99r@qR)*=;>PIP}9=0^{rcq zL*MZVHfz%L6ziPA<_B0nv~8_lEfXFkhs66HffzD?T4Ayrhh$|r6J_^hnCSv%EUm)iVUPpZWF~M5rYY|eKsu_Y z?!++vLLpYEeoD`pE@=}SJ# zfRfBmQHVTO1J(litj1j$iBhxLcEHv15p_>0maI|wq0|5hp}1?WBzAFXP5f=4`P(|_ zg{S?{eYXu?v3}KR`d>VuDM=hAHry{`W0^9cBArj)UtbFF>Eebd5Sd8ufRoyw0h3gC zbOeC%r{E}`LO+S5DNnJ#mM;kKkqn{ly|}dCP;e)8sCCKWW5lAki2s0 z%=la(j@yzp#oz#0+mI8+MH~N|P7~p=5bkX0799}>c_R+~;qd);ainLAK?n1k68fwx$U0u9pMy46!K=gZH zDqhlyvrsGu7fG;!R)bNxVy4A?6)seuO*D;5m2`lcHRf)gRMw$+5y9F8g$B6?MPD2R z9T!IlmRY|_U(_2Z0s<^(U}C@#&n81A?+S;MZV-!mBM;p@@Ac2tuhN!9Jb9I*9Vbe` z$hayPd^(MO-E|SpPms3>KVFL%O)q|mr#^th3GL(qaJ77cXi+TsEq-pxqlMvJVyVdI zk|^knYZ|5ZC}T^u0!rIaVdP3H;HlCs3&b4D*JEAb-jc70(;-waw03@Xmq^-(U@Tu) zd^O68pYrlX;MSp^Ks}}2izpRtHiqLR1gi{56F-RqhyUSq%{bJ6R3|N*idg0?`~ker zks&`UQ3mr>;DRgTEAX`dak01+6F0H#6}L4iKmtDxCYG~^51m7z2hKE*KyUU5#$1QH zr5wGujJQ&SM8+XZ*mBGPO<4AG$qmWBJ8nqi=RswKuGnn!1QGQmQTZLd(nKVpXfD{q ze+Qf}bpOsBXVaBD^pmSH*}YmNAiN3VWBJ4ZHGas+(oOV<+~PdGPfUhm0?k=sYcbRZ zT17&rTnV!+;;TjQ6F+-~t;Sa%LwD}Dk7iu1OmvFr0%rJmXl)R&4oS3-6N0#_Jb|Ga z*Mh8V4(i)(Wc(+Z^rzAJr9~BB%L|QIk7#uDKPBx~xys_Xh>RxpYJv}SZq)whLIpo1 zD*qMTfb`!AZn_B(F-Mq7uR;~sZlZW`uBMM}BtqeLdPRk6wF)^_5m0s<;@{^=g_wQE zR)Ozg?&g*|1);vz=!Bomu0*0xi#JF=$L=M@T#1`P$I}g|Gx;bmAMTT+xw4JJXZV!p z$7kI-;T0l& zgJ8!reAZx~kkNc@!*5=974;|9g<~r{IM0-*fty3|Odo0~|lJSSMv0_NSoZF^CDBN{m{X&W@!amV?jROxro zR?&5*6mxlz%PYB@qtgZI^LvbY1KNo}1sjrVPDddY+z)QjrDNBQ(sAhgSP1FWMF`5U zjo?Azy?HMr)mk69mH!Uyzo0sIy`G<-iAn!0Z{CW~BjBYUPDjjK|NUA^F&NNNOA)f6 zOJWc}*aZdg^WEJ3y`H=o^%4)1BuSVbqCnP?df; z5_5?hB20uGzw&)8iJT$;{5{2n`XM6ZgIoqnQGDQgatdVE!Yq`;wc`XAqH9J>!A=yK zuxj{cNIj}k;wK4LhOV82ZAQC2^NDts9<#M`gq&^nV|3uO2)(z?12S11#O{`rpz=gd zy?1F02{gcDuJ-GW;3mW=p5eBGBsVog;Dn&x$wXg}@i!##Ag2$KLV9zD%*4rb+gjoi z0+e((rtC+_V#8_eYhfzp(%K`%AiqYF+n*L->*OIlP@4;oS6%~vx6?qNNpc-0dZD?7Lq0dh2gN3K4xHrPphMT0D)=E=ks(OQw#)P_*0#N*9JEFSp^f zG#rM(kE|}qG_pSU;{UMsCU902N8kUPfy40%*WrqIRSaB(APRa>j2b~%MHEB>?xHZj zAfqsY!+=ZFTmcu{HO3eC;P9S65Y6S63_Jc+wZb#s-HV2@B~k>aB9T4&-&1Y8?m$?utdl zP6}P_t9*-sHog0oI7?efgoRT#%Y`6Si>#m{ThUSVA}jdXlb8xOR)kcDS0n1^kVfBT zc{NgDwNr>@SDUHKzoe_Lk<`_XD7qidg|^Z!>#NLwzySH5K*1m7Rf!jP6}x~sUY(Iv z_6cx>&l5Sqe1h^#4pe7B^1FeuTCxQfeiH)CO3~KLz0S!BTU^+xBv=T4Zt86scqIl0 z8D+}JQRw0)(fZ!MR%?W=P6jdt7P)}*|jn*&BsY!i~2eWzSBbp%&U_c?me zF-g(vLok#JX;x78BdN*lx+mREo%~eU)~!}wo|Mh>h=LP?On4E+wc1dx)$IIo@v2^b zaOe4trHg+^NiDHtJX51rmrFY1nMG1j!=r!QZMUT4Mac}+B)x1@UnzK9dT-c>FuCn0g8@;{83L0e&h~VW42lUKnfva5rwRsT5jVJ5? zPmtB{SmNbwNv1N+Bc0D#9Cv#ZP+NXg)i`_=!_y7XB#Q z9NG0qg!(6u>C|h4IlA{-jnT+yElb)I4$O%BBrBd-!>^HucorHQ0KbI4;)wdgn1L9O z+bS!{T%=h1BNlKIF$*;dV2@aqQh_Rg7J(2spK4@OpA-dur#tIO(G9+gq(VDF;vsME zM$)otg3g}VOUeT4hk4C&s2}3z$Ob&XmAi79;5#&kXTP zWsx-JEUb_C5~p7M42_R=>{ijMR}-JdFV$P!{BYi zJNL~=7vjceTkdrbD=PuLatf@c>Gt0Gj_E36y-Z`n-`9_= z60RmORq=H7SovNUJDy&1*dpDB;tYx{BB|=R6!m887X)y{HXAo)iz*qBV1!MmU8DCH zqiZ6z(6}QoJBlI693kavAArl9$Oif!srL<%x-^z9AHs8?RC=~bc9#8w)*P~W+dEgT z`E11LUvyU9bhOqrLuA*m5gQ#1o!-(mUsppM95oHXX_0QcMhDOsSy;_?6gk4~VM9}; z-y_6`_!pTl3gs=|3-)m*{e3T*4hN7%zofZ!aWt8gU}py=ZuEO}yPr{7jD+a8o~~IB z><4f%;%r6|(v||8$NAd5KO_ylKoT}?C26gLfBmjTUgZ$QiPcJbI>8n4)Pq>Y@v%g& zS`!7R2e@6C=uMftR@{0jvbXFMSr)&eMJJjSYI->A)`;wfp08(mtluz*Ol7o^{=5OY zsA9D4N?Ko{NL*hHE7yZNK|QYxvsErv{D4ANz^GL1%wAp;5i&EysGL1u&F_!DYtz_X z&F<-Yex{e*6vG)&D0bWny88>-d{em@ct{Y847$rNWdjkZ3%nkj%jda$@{?Kdw&R4) zy(5gJUtc%s3Xdkj_D`TlQ~0WE3oD=>8N#o_+yr0A-Y%;Cver^4`%|GdV?abB54Ud2 zV>sJ@`lqt+VuLZbEDHK?3xM$-ZFEUj5vtAuYQKnex=MvDMMr|(El%NE?JWyKe<1m3 zn1nSz`Z-nwd^1!+j4x;vt+V)fHwq<8!k;B=OIcC7J-PkKx9yabnzq}DiXX(Bv~~*& zx~)|TrCU=Y6pIqyI=HdcnHES^R{y=3@@>&PB!gn2nb#rr&fMyR1GXlF#3h#bF8F11 z?2ywd4#yTM{$}1QrdaML$!9}bxZG?>GsCe0(eN4(3I26aOq{wXEkJwzI0{||Q8(Lo zy8&f7Lp;&q*c)h$85rde6c4%D*}#w(ABh$Mr^iUy(nrOrS-_d>xDcFQMiLG+c@EI? zaiyJ&-6dzDH-2j1ab@ArIqRK`z3}+%%VVDLkMkcqFPF#>IkT@H%L|)}@Plk8Z^BC@ zLXL>Chl?;L>yHrAMKWhc%U4WOS^x}e^7H*B=KHA)aMqxoX{O4UP1N?H^3=hC}2~qJOH|^!5b9J&(eh^ng+8u49;OHfcBU0sq$P%p-#hF7)|1x z-rV3WM2qKCmq{^Vx1{V0-o2Cfx+QxuGN`jG~XBsk9-+Zdm) zz@`Rv%MRj(>E+%aYkzn?6T48Hlp+YzT33M8{nU3Rs+l8$?U}iL{T)2Zb83ysz6l7~ zM5|ohSK=nmA*C@`&TP8H(o{q8AlF@oF`H8YxlRv{KSPsb$Jo zMY?qY3nB(=|EMzxpT;7*!5DJY3-v%>c(AP(wNe$=?#kjtsi*sr)I!tvL~MMgJjMKQ zQdBz6w4`NO_^^lV<-=QX-ISp~ohZ=FKU_$f!JqQn(p?^5-}v;<8bJATT{{aQK} zwzBKMp*J}nBwN}Fn_ipmrnxroC)HFqVS*LdgGqS&%>9pFWHC!OkDUR=*2|Vl!Kj*w ze9KdPNa-XHY1}2B;l{O?zljSK?*~EQ)3*PAXc7`bSe*_+yaCUtclG)IEO7P};f>EV z)Z)IJ6UJtzHHTk2?6d8-oy+XsbhVhaxGU!f5rz1;TTruKQ)VXSyDK|}y3??Sr!_r0 zO8fkC5u%=z`HzX!wB}E>crbV3Tg@GHbSJ*|lxK6N)~UxAD(+1QX@Y8@MB0`|;wIP* zv~%aF(Bi@aVHQm@oPwn#UUsH*>b>AkgCRI}(yZ-k=<96NbYbZmrgX$x(afnW*DC>G z0|)AQm;oU5bJ@2q7{^`^wseAp=6~aHG z6mD%A)&}nU+{sas3E23i>1k2SyNz#I8#>6BZexOLBfB?C{XN&Mfyq&mi<(rfUz?61 zC#i3c*-fS?-0=kGF*!O z;WW1%>~KtOp38QMqFl5yOPcIrCAW}^oS9TCU6w2LXR}EjwpV!(!=^c`XJ!7BR2R0J zq`LPe3HrVH%7a#@586#dt)4F+#kERvWKCD&<5pI2q`}yx_UQyBLurLJ!CEr zVvU&~#?CXv!zrWjQ>7~@=f{p!rpE3f#G|{)(o^5{w!3XMxu5Flvsak&XE0#D2cQyZ zq`MezF{^hN!7r&;dl2f-q4f4Ho(q#s!NB4r51MLiz$mft>FxqR|10M7Nx-NsKcQmD zj4{O?>Kp)C2gxxWm^CW}zedbR zXs42$WJ)B*ZNJ*bS)B~coai_^TB-)+968G3@k!vQ#r$MX6>E4AQ-uaw&&s@olnk$* z)2{boF#SmC#T35sB;xGkRq^=pO|DFF9tGsD9ak-TH!=B&rfa&%?Oi)F`$7%wUe3^+ z?$W-mh~i_2WHNiIE|873RuySI`x*~?KbS4XczUZ_ACZji|3FhQgj%cUS()cdsfEyu zlpxgV*l@sC9zwr5uH{@pad9REjwHoZ`vH2=%>YFm^fSPTC&z`uHJ*nxm4R%^ino6XJ3?ixj_tF_}u9)N)KxNopwLU{SQt<*xTuV~- zzcRJ4VGo`Q2bcCW5X$Qt`x6+Jmm1c7?{TM z!})4da%VS&@(sFIi4HxwFPe)w^!pO$cW646)k#NOcl=MtMO{p}FIs28zP+zp{+5AB z=Z9N-v3p?N3>DjpI4qR+7xT8i7&TeU0W2hJr8c?PEOj>+^Os}U>djBwA{EO$Tq(*u zzh2uATYV|4D+}wWbzyeG|IP}pBVts@S8^ea? z@dk#G0p%hn%Us#@w3XAbNvCys#S#rTys26z3eg1#vaiaUZJT=3T1v=sdPQIz^gpKE;R? zQKH{;+og<;n>;4Gp)Xc*(0#%)AgSOeY`55TvqxaXfm2{vv_JRZPt>8QhJZTCkQ(Ur zW&Ny*p%7bH;zhQ>wFI~{C55JzWvqF4#(17J2GJOYA9C|9nSB6~tOhdYYe9fhuDjUv zX4V#mL&!MrWKrH3aksv%SRF{#XpcaMyp%>gdtUn=@03RM~I5)qGo0_HkC7Sio6zPNt+Jn_88WQTM^o zysFaG8w~Zu&y^9qn`0#W!ITg6D@8(U4# z;CZ=)Vg&A9bMfxOCB-t}sB=mUURVd(|)@Y5P?d#`X) zIV^qUu`&;~0UuA|ir@UEa`M9+PP2m>3of7X}5A^61e_V6R4Ik8^&7<9M%fO_E zt((+f&C)4eIel!Gsr(9=qNDhoS{G){1(?+WrdmoqG0!}CgnIqmIB*CC4^Zp4)GqYE_VTL_L^|PCCfb z6aU>!_%n_?KU$Xd^AP69PC=Tzn0XC_Xi1JXN4hg|#4!z-OnkehnTY^iyC z)U<$>w_&J*PMCM@1~Kve(cR{rLymLlkur>tHSzJWSzrq7R7HMZYcqU2%HUw_zRAsI z6Na7MmlY)`ha1FGq5&w)wZ%@zagN$v7VCIIPR}<)ceqFz{sz_XyYlXF-;c1s5*;rR zkmooRkf-#;^lde>$edc@DmY8YmeAL#CvK%$6qpur;Ec2dlduZW3M)I;AY2Y*xN71I2Ob6DNOm_Tvt;+6A@z}H7|PbpU>9vQH}P0Dt;79vB^i< zGG02Ep{cwZB^^lRuDlarCWL|~bd4Z>znOC&DrlU9rKj;9@hEVXsx=0 zW5fNV9*qKT-zN#z&!5v6-!8Lf7YoWt{;0oXGoY%+J$=F5L{?=}5#gS-(<~B=T=6L~;lTy}*2UCeBT-tDdPALaX7G(4)y_ z4%)H1=+<9P`VaF)kk>`IcbUey1$jK?FGm33sK=qDB{=KYjDy!}e*6d;yN@J#JLlZS zhKW2E4lQv|0I*Zin!hRqOH6WlE6Os#>_v-X{3cmAdlAbN5~D_lP;T zg;3QBB}HXc>GgC^MtBYL&gV5YjN`d5t#qgFZX9aFrpEF$qgEX9-b!f}Zbta7CZR{L zxMrV1f59n>na&Cd&;8u(xXio@bxUu^oTkkNng+v3Als+?>895{ldMYSyGhiP zA261Z45>BO3!&mm&!{SW?7KHiPD*D7LL^43ENduR`%nE)Z4ybM4%xKzPGZYTNDHHz z>faf`o)5c~f{0^)pXD5uw*}B>Nk_G%TF)YxbUc?OPi&tYPNp&*CJkC;(((6f?T^!f zPs=VftvruYTXxlzj%Bm216c=rv-t9PxMscZ1YS?NTIxD;mRl5 zp%)n-crfJQqxn02yVxNq4Y4sAy3Z0$mM!KC39|46QCV3##S*wXCjD3FL>rt-z>K>e z`@)1eJ9bkh018cVMW>`z`rzpH3e<=u1 ztTArZiuyLmrg)9hz*9EC=s_v3#+~Ar8d~+m;xzqbC-TL~<*6^(<1=>xXrXCr%n!gfJQfEQ+iq6vQu&m_;8ZQ+nwyX^YW zt?#Efvlc(viW^PQ!6Y>=j_Zqexp30JmDf(AWm=W}Q!Ov1xN-EEP)W?u^+M0eT>dZ| zoy(xKowgka&K;!l6!JQVZ%dSzktkG8?j(6Eo@flCYHuy#-o3hawGi2D?#s~Zh6m42p~4hg^<1MPTs#CMhTeIw!Wg}x z7(FZV^+(I-4IYVdKcd}jG@cuigolqw9;3tRW7L%?o(%F%rWMtC9JLxz>{9wPSyh6` zo_2Al$D@eCt`x(Re>2SncQMIsiLz`;T9y3Gt_MDFOBwdyR(`w^W$uN;#p}G_9I0W! zU52o@3Qp0lin5>a^+f9IZBDZz-PM_Mn_-aDn)!<+?{gK!up`nK?QEnraC+_&W!J~= zIXj2y*f4zni_Jz&H0|5*qA~kN#n$AlU0dx}tu$f6EW!`ZofiEq!FBf5tzkNi;Y>Mf z6Un6c1A6hO;^__SXg=Ykb}eFKNVMhiYpDveqs$AGbLU~}*HJu%;Zo9YX-qZfY+0<) zkd?RXjCA9$6JE1rnH{%?jIi#yd@vXa44-O%qN#u|X;#N=QTSCmNktFg z9ob#&_>d}rX8EEIkE^I8Jc0)sv+NB3FaZFhW(yg&1AxtUEqjE0{gVrXek*g|$5SJ5 zdlcVtB}5P`((LZq+{Z?k%6Dimp!HpZVUZ@Y`c_F}8 zkvwE|Juh%)voggo6p-qwT6<8dr!iX_mEjV{=g8>EQFc4P>8&9p8Zk@k;(W>qrD{;U z(lf`l&H1K=q?|l)G#k4Ib5F`?^nT!?j^^W98cg}fUSvE6y)hH)<(K}NgaSx?{4vSU zvuldgYe0k^WnTAG1$r|7MFY8W^o8)FZoW!dJAQnj;onz#dRGADsBds%Z;auts57DfTTg-B}_>es3SVSZ{sJC2Rf_@PG zF3Rm@S0A$veUTGKA8AL+BvDhaNz$un^x`Wdp<2Tz-dfnHbfxh;Hd)X2Q|z0^UiNc# z+#I&i4e-jQ8*ZSJiDht(p#~`lg0WXaH%B=Qsfi_$73C=N0aC1k1-C0y@sZ@#{ioik zNZiZ5e5L2nyz`{hg)c0%&MmIs^BWduUF+5I)E0w^@K8SYD7Z)iSIbw^C8efHQy_W^7hP?`7ZvTT<5s(#ZHc| zHs(2spw{;jIg56slYA!{Y@Ng9>SD^8$BW*7+bw-SZtb;$35IRY4}^S?B!tWZf5x>| zrw}ZYj}WZPPr8*6jDl*xF^s8;vV{H1NNcAoSEhId1#Ts&)`8UOZ8}G$Xsb#y&3ol@ zGwF+WNew(Z;%scJf1*}$8;zpd$Oe)7x^c2|qwue&tf|?I*|(|R_QQt{M_l|8;UM1m zN0K@&=sb)0**dcrm|1p1@yhW8ZQ^ir>)dwFGWzWBrJdA@2@KSV5d?f{X`8E?y1b5u zp=s<dtt37~fC?#J~*UT7@!PcF9lt<3jHDV~z$mXNtpRQiyF zm1D^F!#cSBY_TH6<$QlVDX!CV3^waau?KWrj$vxMS)8gkhN80DB5R!)#u%EHg;HJK zG4ya>n4)Jn9tdt_p4Oubw+npuRn25kvruvrpRApleWBv!G$12aTF zfh|g;4{4nKLGpvqg}#`(mtFA1PW~=1DKDGO-L$Ag}V$|BI5&tcRuRmKSPTM=Rix1zut)9j#?8U0%%A zTebE(uz7*brS^j>vVpU6xp~yFD_uyWc&$Bo@scFYRQ*La6q>5Sd|_UJOoP9{e*5-f za5ur_1_zJ68wOuIdVDhhpC-r=o7+&14~85@2zGlnv2{Ut6+lHgNn- z22MsU4V*G3^ePWr_E@aCnFmGm1(F8fCnP^|W4hp;#|rPe)62|*#cqt<)vl3BtQ?Nb+67=0DHs0{fPov!C z;uikK%4iBupUVpaAoGw3ud@Ju3M(gJPRKn_*gT>1Ex%t7?-f=k{*IQr`spwguju{~ z1vBXBl_D8yS)OaPxM-kj1Qg?*HC>wXqV5OtXwkve>_KE3uXTEttqAV`7H<^r0P&?5 z_=&W)N+=xYZfHpGYfW=WksbU7TV;#|yHFKdm}rIUWlBAi(ZQ*QjZydTy)1iwqpwiv< z=iWEgZdY2=0IdSlMh=1Mm;ZJ=Op?`YMTnojB;9%#rKX7%S%(aU;KQsbidWk{Q~{cj zbWj(zZ|c_YDs)!3e0km^LvjT4z*5Z-(5207b6V!k>};MrbLLDiIJ0fZ!r3i$-?=VY zA2MsJVY9~0?fNTQ9hGz(^oZ)p_v>h%-7<48!Zo72E};6Pp8cC=>!j&caRdMAOC9+6 zSA8GXJm=^mJKC4DSzP9>`d;yss-0Hd>!gzoCDZAA>ztOE>hBhDf4lxhRUTYj<@Dpx zgcr`#8K*i}7!=pK*3aT2OGfIRq0Y=Fi|%6H>j*jk%Og{Bt~(2>$FGilAKH-4DmvSK zOt*#?c`jUd$~?!lZ@$Dva8`B4_W_-qGZS%Ar}IPN&i~6#>td$4lCnD5xmILp`+_A4 z?c{KRnVQc;;sQgnE?p$Xk~6Rg0Usi?a_f!033xNi2^IVk1*Mr4CYJhCnO|*Z(6(VK zmj3RPiI3m8MHFB!zgly618<)+!ruhSwDz+`C~8Ot$}394h|bqp&$hKw^tEVc=X?TG$(ojHL9LZNYGab%I3Fkt4G%|L z_ug~khWj#`HH;-w8Bdeu?cJ@x#rGM*TN%fN80B~rm=8*=6NoE=`k?y@`pLIOj_%x3 zWHrAwzMHjD*w5c?Y!%?`{zChu!&dqrODEY-FOvM__gSOm3kPR~VWHWA*WMbEqP5ay1u+z|*I1>XqovDJ~?xh*}Jpfx?& zNwBE%G8s7+O)NiuRs#fHI%Y}hVw_88b)L{Uo5mDo!bhWjPxm3ZIP~uk5Y)w?Urd`W z5IvfNou8deQM=3AWc2UB&0*k0IK6*@r|BI^w<9V!_EhZn_6|L|+xHunC|046FuMI%hl0&i*8g z_WM94O{7pLF*Rkft2{SnLr`467xPHM!>m160jb2q_`dI0b6hJ2GsP%2Vn)H?fNOQf z{0J~z?^=9Y>e)lI<$1~D>RpusURg`AV+5K0PPOA+XkA}BDY{=|AkU<~fb;MN3R;mJ zWjc$v%f=)D^Z3MW4JQhqRsMtrtz1yr6+V{^B1Y@{-Q`avLYJS*jYeDOJ_=1S${rG( z9W|XGCzH$@j8PkX#Z=HFPA%1*qd~G@_RaNd*ct*tum6_+BKU)8qG+kXl_Si)hxbu@ znY!Ce$L8s_(xtwds=J0V`Ko<%hwCFj!8b_4^N2|-%7lgoOGDS@yy9Gidj0C7gUYT# zEU?(0 zzt(wr+F6a1#}1ricQDA2gpV{UxS3%~=0`9bY;bOdg}1E=m^l{7-C@GtHKYp`%9k(n zHagNZ$Oq!=n){oz?0i@C;YHlU;J(Ps)Ua^kix*8q14dKM4ks&jo3WBhLF>IFQQ8xr zS({pg{Y$5qys4#WqcjoC<&)b%a>=91yp+5@sI1Lfn)OP^gIaXCTDBE4EnM{%iduXP zTeV?H_YcTjDl?GYEQ;3XJWKxwmy9)@0O*M(wg!L4y`0QpQ{7Lt^2C-uuR*e(WxOb5RW&VPZ3d%V zOXI3)GVuZMZj=e@=os~ADKK?#cXLpCz0s%TMWM8$(!G@zN|g^Rf=RmCs5nGh1^-Aa2BLd}c!S zNzZdnMV1D0;^PvU9|YeD_ZE%(oHK4Ye0(r^EnyUGPnq{jsEf^OCB!@6&mfhrxj5xO zzBW@mCmCKw$CZWQ8C_B`vZZZlt6B2p{t#tvqz<{nY$974MDh%OJJ&viRJAHl(S8$6 z$DBV$w?rtYAHmSHrJZix3^_jf7EF1HiPXKK;8l~xBYo)>inv-$q6qbyl7#ljpwSCe zi`$J*JriX536z8fE}qNxACQFhXGunFJCxo^^iVe`_AbtUKbaKaCkls^nTAwYKo7PN znvPZvCpt?=pbN)!^l%nT{@$y;x;R*odUwueVPE zfgK;Mf#Ad9kNH%=pVaX?`P_GYV3mHf-SrFmS9U&Muk-m;GUL$s>+-J4TyKEs?Jj9L z6QjxP9j!;UwlzzO#x}EA{saB`NLgH#p{({LAjAc=PJsNl5C}L#<;N1(Xg9W!g5JA)2ydAgEe)N~#3eecZ$k zZV<6)kB|4r{X5tV(N)=$EjvfcKhRdOG*x~p7GVcs{dw2}qp1jDGwxw6wR!3$f#W$6 z($2vv&>iZ*G^CPqldzt!#L#t3c)G2}j9>@siYT1bh{tE<>&%r55`DSES(MW?EUw;+ zL>yleB`_alPF0jV4TMmtK{?K@H6B*FZRpQ z6|7getX&V?E3~BG3Vs@8pQaNgY0cJ~(S0SdwGt+SSeaNNZ=zjyiul01EAct6vA)jo zRj@0230)DlQRlyMN+N_kw`siD6kZA8T?S^hPt*?Jz9Z_$YaG(8Xs{YE%L;6v6@$YN zT;G|p))m$^?|@;H6L$!g+aVHXDE0f!D0dSpqzXYT6rD!D)=5zB1t5}<0^})@;daN; z0-Kp-L2ai3K(7lYUvttMTviv5AAivJGScnaX&a^xo;+5T`Qdny0ncge(B+fU-RTyRZPH z3Kp-U)TXcsRouC}TYS)cM2d%(QcPh@`alS-z{BXnG@X!TZwXe6E3h+{2M3$_9glu` z@Eh|8cOnQL7f&|b+IfrF_vKN4c?D0<<*D*`v0E-qqOXGP9r`(jXKWN7Ymmy`W;U-h zm+WwU%-Wpx+!Xn33Y}xgqxk3Y*z1Q$Q%{GQlEanb6}fTbZxTnw-zQ8k{V^|Xq+4mWH%UN$n{LceH!dy}ssJC=CE$b>6VOR8$^_Le!%*A_h8OvU z1Zx&9p@s`r)-*J(%ZA3!Z*Du%Ea1ugmq}Ymo;4R7Onb-p_5{?)v?oJR;ktjLy=g5A z+wB7D$7|b5^5XH#Z8bVx)d{#;N$Vsmw3{X#uO5nb`n6b>Jia8Jk(`7dy$eO9hN-=6 z&hWgs8@yTSTkF{wJL;i~S)?7#>DJ(n&`Unaw5%qT<@>s~je1SgJYT4IH6=bJslsq& z!jo}6C}}-rLGzsICT>huCEl#ZK8E$VCD87 z)C(39ofPa5WxfVqb~=rgQI03xC>_KIS_Z(aNdjvOo%E|6JD6E*LiGGkb3u}7ALPxC zNP_L0Gd&ZyzBF@fHYXql%Gioj{ae73UGE5+b}-i^#E4iupZ*V=SNj#n+nq${hyI}O zX=$muMBd0$5oyDnRI`w0FFSciN%@4QM@=Qk_jL+opxhV`cq6L@^ZJ+v+SfEc8Hz{0dZYw)$ zzo99dsu~7t-&P#{itLEco*+USL!z*^K#W(+Y-6a_;^r-E=`-7I#H4iGMG|h0I@?#X zLy6^8DXn=Jc~+_L70U`n7AqO+ihSj|LMtP!L6X&l*QafgiGRpWul`>_Ct|M*pfcR&& z0lIl3%CyG1tvaCWwd=O2g2f+F>DEjQReZp?o<;R9O;78#Zrp8&!wHAn%P`7h6G(eT z*)eoO>o689Y@}e|eN!4^=3{BRnB}#ImC-)-8*a>B4-todi?D1)17|nuRvs8E?DQ89 z?VA{1aUHtQT~Qw$oHyU9uoDG$H##f(i$J_E?rfptT{$YZWGIylqDlETqs)98@dGF* z6bi~$Ny0Bi+_V2RjT%6!bWDq|#<^FqtjW}x?N5(pfVw+K>dn6Qb|dgVm98!wQ=hYx zYzCx%ilb=1w>o-+-rw-2A*Jf~uB>toIN*V~$?~(3dy83e+Bj0&WIJzMK5m>3%Lj!O zo`X$*olM!@!M^odAwyzL>{z{7)8CFVN1CpmJ{+u_221BO_tkDn=(CNBQkYYV@UY9W$!xcx=nZ?@j7>yv%W_LBdnL zP!Gh9y}n%Ci&uv1GO(Ea{wSEl==U36?bd(cyGq14X^&H1-2^OFXz z8C{R)u6zrQOG^OTiN7t%b~Ew{zlGrn%R9p0O~6a!gwzx6Y=b4c&4q>Sb6at%watae z3zyhY1DQKxAs}LDh`w6BN`_11lwXz$(fH;CIIh{wh7@wR^DQFSJDg`F$1sQzx}G+) zX%w-d8g1grmL(}7bUh2$UMpXV6p2eq%pORZLK4D?4<%y6hm5b9oNoI2Y50bEz_Ov9 z966jCHO}hK+0^Q3>0D7`tcckfW;riPn4ewEvEClLYn}*Iz0K^io&1yIZG16H1xHbL ze@l|y!|BY~zVbS|_^Q3A4fw2obX~Qd zu~O~!#gBUF?LF%YFY)4fvde8}uYKi_+Va-=0>hf&W1!}TT`Vdj2mvqB_b;pONPb&WEvjslM4hEImV3g$s#n=iT5iFktiF{h|s3=Agix z@ti}8y%UUArVsX~&`<%Q@qjVRW%(!xyxSg0mN|XuDn~B=`3#SS<^!si1R@I67Hg5~qMEfxbkCPiNVVS+ z3v@5e|Bnjus8X5>dqWXb>m<#klhYWMQ~f^;!u4EjYk&Zc%Z z8y1mJ#8I~*sbOV#xTmV|dQw=&AD$_`M+rrsQ-vEp?)}9kl=e)?UuUDI7P_q2=YL^q z@SBa?AM7LO_HgQ!P7XQyIdXuL!{!c9v+-EA;Kw_T;lC4Qx2VV~YUvUI!qh5}J|<~n zFuRj?x@8-Xx$g|ZlcF)Gwqt=0KHWnOg{E1nf z=9|tk=4^6tsKBc*BUyQi{G{@EY-_Bp-2Buvz}J(6`-h+G)-a2)AXel7)#wx7+3nRo zw3U6=V)S_;GzssK=dtWqVnr9jTZswfxPHnqRuLulN0127{uCmkOh*`jCg!u_%eFG- z!RD^R01K=?e7QJQZcDIabfXA1*2~KJjzd9B%qIncciY}Hi;>T2ju$=}h6Aa&mQ~h?`4n%%sw)?j zyOT1}Tg;~}wqeC+pZCH`n$X4^pIG40<4{=qjM)$)`GFLE6C`4l@t=_6eedLj48_4ze zYgO^$ZIm4f-K&vtL3hV@`j-x>wQ^zWnGqYS(84Ou#S>Eq>Z&{ekBO`L{5uDvg$jSrM;;l^1;pW&bNy`M>;pJjfC(qp0*-A~4l3CKtTrwnX23G`aXkDM zLtvxoaMKUGaDk}d<^FEnEp$@h=2Clo+&Fxsu@Ykk>72q<^;=&qjlz_3vn_WjEOlPX zHHr5AN{GDx8uDmk1kndzdu&K*;`gevSGOWS7eJOtF$)!8u z;ro(oO_>kux`l9_lNH(!o&suw+5dgd#_nX*iAp$z7g+yfSd^t(eY=QCeg97I zl~&n0J&p&ce`cs1Im+i<(i3g3s3+^go4wHR+bi<* zHIehkU&maX)~mD6N7)}RTD?b0F_&(v7RB6s1*RLPq>dfuf`noh--^I2c73~gp&pz~ zG7)lFBT`{K0uS}f8BAH1e**g+( z56>`aerdWWyXF_mo(%qwQSSQ=YXhP_OL0z4Uhwzq%D>|;xy$J2=EXRU`;z>{K z>UZ>l_9I!%JYI|jE@{*A2)er&Nf>yO?r+UAzA)}&U;T?oMd7kB30l#fswnJKa;D_i z|8=vKCw(tHLBa>2OtCXZqekJIQ&4TTQHfFbJV;MR`t(n1OTU%*&GoxCWPVyn;aifg z)_*|q6h6TXUG)LKbjjk^DE40@RXc=g4c^x&Yp~~j;~`0+xwCEfHY5FT9^;%Gg2-)no zN#w$Uh0szHk)*K z3{`6lGpr2&)Ny>&mjmyoi!8be z`bBQ5xVJGE9V5Gsr0xyoRu>7mLaDT}YUNqBy{2MRryfhN1?TQx>a_@AAu~167u{ae zBr~rEMZf_)W3(ACI0^%6zxL-Y+te@kNBZ5Bt}qs*$PDcONB{|ix@xQ9^N0amA$h%cuIfTBK6BY59{gBcuOZU*xZf7hwAha{o}_*>Zjk6Q zr&abPcHeLd0l)8HHsG#y9n_b})c4=ob-0g?sZ&u?_juPKxon`y(q1wWaX(|L#sA4& zhkSb1K}=hsK?s;e-#rp+uL<@RD~M&Xw*i8i>2ii-ePx{T8&soB2ce+Xm}D8Zl`(4S zszO709jE8DZ#Y1v&d?G%tcOASN#&cmv>G>`w%XSxJ z3KIr$_{uj&nFnA_&O3zn#`}1iutb~T+KiGLvRYk5@`C#(Y9+DWJ3)q)cBZ!BP`twc zR+Vfz;-npK#9N(Ws$)s&b)T`x{51AAt??1Bir0*uaU^Qi%xBFKw%GuVp(0Iib#6M9 z`3ZVd7ZY?*^#nbbvSJqM$PFaFE;zFqjSXUvexg@QQ%9Kauln1A>eKtA|9GN4Nar3P zsdIOX!`Q%cVOi<)!1u6a`)~(ovvDIm_jW=TqnflB#`_B}X#o$NbIX(+G95Z4C{Or-c*NUfurf6-OH?E3?dURpYv>YFtPAv5PBx z_>-EFymCdex~ypYf|llvnd6sq5Y@1A<{oXG9jz^P_#z3tlhoVQr_Ov(%tJZh{xkLK z`kDFc>x2*b9k+)D=O>q*iz1dW3SPLaZB;5=PBUABCff9?(t|Z{$))GXEvKINx#+Zf zo$%-hz6!ONndIqT1fX@O{!Qfr{Z{7iz0&k=x1Qh5-Gy37v6)s2nn~6JkEEihjZ+{j>gOt_ybDCEqsw@VpqPEa2_lH+IZ%; z#1Pam$0x*A+_kMlo5i>3?kF=94|fGF(Y6;a#ZAPAjQQZ1G4z-v&2u~2S!ohyc5?IL z#jG?JG|%PAgZ|Ob=FTO}gbbosMFUqxxmH5b%p<@h!C_?k-ILC3OA>h3f)2yiXS@)O z^iRtf{Z{4?ldJI+JR&X~?!O~ni8_VRKakc&oi>W${>9~d|1(lt^I)C}o0X1D<4K4L zbwB-ZM4OCcQ&V_oiU#h1&+}q71$7nNSG3*?Zic+v$!u++nB~L{Z?ip`r|eKpvCV65 zje-$^ej-g4N$T=d0B6wO!3#mGe_!#>%G`KLedwjq(&+nIX3ykx)J zPpt;srQ#*WNL}zWYy#3EW-wVd@D3a>xa{rx4O@myIrfJ_!9jL=8;nohO1B_p!cBa< zJ|o`StqvE!zy3%PkjL!X-Q1-M_m+OvO_0Xcy+rFz_fb77krOZA)#t&-^lNu6bINgF zyOqLi2VRv;oY%b8ns(fvn^?tlhs-C@QBnB3nFj%5O4KAn4eu&e4)SyjeiDV>1d{BI zdBLq{Ll$>7JTaOYa6ES+{Lk*F4|gy(1@G(DRF=oo-`TXxh#fc zOOpy03R5Oo^JjNR1WCBRyw!*MiN$!B>it54c6d231}Pj4f+YTlo^z@fepN2=F<#@} zo)Xe$sx;r_u%Gu=I}>#|naj?<&wM(xP?xF9OA(ztLOdL(;Z`>^XH5X4!~_Ipf@0f5 zPULlaO0TlNNBTZTs8Ul(8u`>{p1~R~2h_-gG~yY;+Lr@beu?9$SI?3B@_C+UF|`~> zZeQ2g#yVH8FYg`)l*B={WZK}frNv*vTe(3)WDa1q5OkV&SsmQkor1v1 zI$B%SaxMyK!WqlOkrN}7F+diNuX%faWmuI1nVR1t34nPky2l5F#>cEMwggsiYS%g8 zSABGURoh0YbC&*M`@_?2TjHE!_WbeRc!y51ZU==bxMBIk5aXIYF(fa8jhK~*k9e99 zR=Z#O$YHJ+D%&+Xorq4QQW2^F4ilcyD^;(p>)SX`>x_`r` zB#rOSPVF8CYyRh2u?o*yPc#7LVw6_=B{UgpBYN3YoFSFLks#C<9D{cd#E&>eOc&&{ z;TSQ&MC4dZtR296#|ehuRQI7jSL9iHcp=+1Y(Q|AF>v*p-@dQ~2aGq-lY+OXu4luH zV6R}v$T>t1Xd@bJFeLY0Fl69jZg-fk&xY6GkvFC;70f&2G|D~HSLt-H;q?4D6!ds^ zWVH8vBVGyTwUCH;UD^IT>zV;Fq)NvVnKr>c#5)Q*IUO%$vyLg%$=eE7J3vc1^?U`# z)*wxw&NTn2IiwlKOWlQrrT3{5Cz3p$9jsw<9NWT%yu4}+@uNJSeIEX7>pse%C|IONl=v}}l_XN*Tdee*U&D*I^9TB8Wj;W% z;V$D_Gi(cz;5v+K55Tzk09ZL^+p|l>zOB-}V!uuwnFwaLPN#@PiIs^$y=VXZC1h-H zEl=?<69)=ap1F#%NLv)H;8PCk;Y_08(e&Gdq~86LWW#eCFJcG}^3TdV_Dm09@Ev`Z zBMInXy!Mc7Ss$|CJH^R-Je3sJ$)nqdh)WLRE_vVV=ji3*$RBR701dyU&>R-ZQ| zsofuutk2K!BJT6S{#lvR&x-qerM?rZ5g0F!e4hu`>vNu{qQ%90d>tvS#~T5@k{$$` zWqs(fg7Ioz5cyZTPK(eH=zZUwa+<*5bWjvN8wF?bSr3KAB!;71gF*~P;Cfd@!jbT0 zu{BYQ`gbl}H`sLhOAMR#)b*^)_Om@~3uxaW9!mWa#P^dtc&0Gd@)s*&=AhlFJ+94@ z*-0t(A^@|G)4*#oc z|E$b?&WXqUetowAN$6Tl@`%~I-nhfz?k_Ik<9kSPJ*JHIFMTaF?j{pJ%-eKXe(9SV z1%$r_?r@M(6db@{s)wRC65cU*+RQ(=IR-$DCLQ>*=9$01Yoq~-I@QA!bl#wQmluLe z{|@ud%G~W-58WtPQG1aD?`JLxx7wej-+z${Q*`I?0of@%oD1Ez` zwlJ1XXhNyeCj*YbyDUZNGsqO&%Dm^icr^q#PuT6V`!+S^f=%#SFLx=~UU%8_L!YgavCl@bs<~d#{n$m{LQ@Opz-Rb__&4IB z(GE5OF|QE{dfn?sU==M2>-u-Ne^%z%B$IAN?PTyzy;5G>J8>U9kKx_gxsO$1qWUPx z#Ptv28AIc5G=gPAqq);woHt*z-~{u5%stC5SV-T^M0C%KIY`t>D5&jKBqOK4^TL7h z`R7OYXJwvpUp#%H%*!Ll*pMU$KO*^_52{Z`qoT}9cDvjkC=%D@8N}@=0`hZcly13! zr|I|r(}C!!*}EWv2TWKH%Wz9~nSEvlqJ5@9F>1_^9*U$z5hh)Tvol7Qhj^bmih1PX z1xmS+$E>>jb6_%{H%rZ-nPdt9%Dn7;4|Mh+DzIzyq?id8?~y#%+tml#%A8;P0R?(d ze_WsJ(}iKBO`W{3W3{ET@6ymFNQ#4?p3f^KI$< zZA~*NG{Fb5B%p5MVDVgp4>hMcx1u-&1|(ZKcSo*dxQkVWGWS8Oc5Y7R1ljKZ+%WSR zFJf|-<)4+g`~i;{=ftOpwlPTv>q(Z!%&>Zx$v2smpm-eL|CSV2=LP8vK_xARk>eq6 zM!B&7{EBXT%ncNnwjFc4i(lSx~{29sM6n~51 zZ1&H}-1IIa3*4A@mM~- zi4@o4rQ6}@Vem6ExEHhrk4Jq6pt&4mTA0Qm_o175a-ZgS0Wri+lssdp&CLsnsG8YV zbMT1h#=HgXuYgZ|9832NzWeD%4Bs68tju2|@O6*j6UZH;e*s^&qO`vwNpU@cc!py> zSxIFXX%)G8&YF&CgJ9&_&TZLtK@0Bd9nE4%n~((Methde>f#!b5xxTYl6j;kZuK>i z+V~O4)7WQa==|7ys9TazLc&dLF|(NlF2h~0Bd7~5&8!Q~Lk8|mcBp|luPM~5zK?UhzX{}KP&UI7~PqNgG{FF zOJs>X34|L+9>aCn6AODQQ=Co#5n)`PNA0Q_)b=HK$5tMV2b&oy+>~EuZ{?U%xOJ4> z&uvC%^FhK#eHi6v*!F4$7v_opRqxqNeEvyKA&L3#ZbymX90kA|9iH ziEoLR)wfL_^&rX|6N9L^sApw+xF0A5+L#V{!T8l}osZ4QBAEvq)jn*P4$e$c z)+hK=xtj~)VExYOpF2aB<`AhL)jeLv+^ySkw4gr~oFb5yMd1&@Po@|Ji$P)bZd%IS z&Yj-~?SFzIeO+Y2+{SY+U0Z|xLW@`cC}-ii`2vLw=G!;Q97}BM-GEN2icql}EEz9& z)uT?RZ1vB|-1c#gMt3vp-(qGU^xi>Q8#BQ3hU+_`cWr%p8I{HrdS!((lBKlbojsIL z^hCduT?78SSCr|aAbl{!EuW!}M zxj<3F^0X2VxXS!%4CaUN`c{BnMDhT3vA+GVs5Q$8q_`H(=-w}b=I4>oh+}FwP8hN{ z(ltngJ<7I6+3x`*3XI*3622iYjN(UAv4~F{8UBQa;X_`i-}-m7e^%z}q-4cZqQZ~G zPBgIv-F$LAEc?}G3tA&tvEnI|`6Vf?buiC3qYzf2l#G{|X>>z`8Dqo*{?5RaSG`t~ z*JN~lcOY_`&AGCwpcwwXq_JRq=!4-9q*hTk-@%zOl8a@t=||n z)CTsBS-r5LuRQGAIoPZHJ5;{-Z7Th>ulN&+_+>hwAxZ+fD*S7_sb{{DnGK`Y6xzBf z^lK{cE6BA=HnhPN>Lj-o$q>QTpwP*J2DAqz>KO!^3V)R#ia7H|3L@$+!xw0W_ken}EQu?%;U|OrUM7)b%{afT*N_GxCaaV2u{%^&! z5ZnSnW6H7Pz<^=GL&rQeGTO`S z*QgG&~`cHalD&LMJvpUye z+Y8uq%ph0cDE0`G9Z;)S<0gxOz@HU_#?1;ll`P8{?YWW)I}w-MFu#-m8b!%*loDf9ds8TB z%>5l+IJWrt=Th7Btjv!{J2B%zj+aJJ?njz&cL-Lgf@*gesggfbx{yLrR_IP!@10Dk zxY})aE(|Jtq8_Jr$BaAPk=)pdn7-Lsl~_kWXSBo~IgKEt9WAZxW{-$JKxCV=ZtC}? z;lqccPv6^^AFv0_>`qcgcPIR{fxAD`ItI6mOg$@eAAH|Z;1;5cq)YDTFY}E!xzKSe z-+73qsPA=@#H3vD844*zPF%TKFAOhzEu{`Q3yk~eVGmC;QoAM!UWl?A(*uiCfidZF z2Y!Z~3gQgpj@1;({!FUOrcpS(^4se)pR!0sC4W1SBh-{DmIcCK`1 z#ayQXOrD383(iH2 zgg->`2;HeZLVcm4RxFAT5m)P1g*(?^)0?$obj}cl6!o?@jdP1L3&eY(k&D|Gu-5Br zfwg6Bb@2&ai$-#~dv5EiFXsOmc? z>K8R-XXEbiq6T7-NVqK;y0BT8(c%Q^`#}``9(I|1u>pb`+I-ZKxok~yOV&BOOi+bt zJ&gWN^Zmt=mb#c(p;oRYmm(Ue9n5R!PKH~0qQE%@a4+WX!Y9jq>Ok_x9Tt_Ujyp_f zZ9cNCom2XAIPlOmuk}c*9i6T1ZQRE@ZpplPEgdr#x1L~U4Ti@@AlA8vuI26gHyY&T zphYujdcWqj);T&TvBNqvSzSntp7C!qI;~|BuO7J)KKNJC`i7QxK!pq4}}}8altFV{Y@pq+`JfNnIU4vQ@JVU%&yUvmj|(%tUHME+B(0 zjHY6my(h{nNeXI*>`>!-n?wWWH*@Emu62OFE@)Sn*~WY@TajVqOUm{##d|~}xrDc~ z#WCOb3OH6rW3`l3b!cAw6r0x6I<4X9NjOIFoTjE*Mq*Q;^|*L6gQ69W24zl9M;0i5 zt2M0H5i6VyOHQfuc0^lg;J+x_3#YLzqMtfHiv1be4RI5~^H8X)sqDqpp(|+SF_N&~ ztrtR%=fbX~ZyF7hHQ4e9SbG>JW=FYS8Xja3wWD5V=yqTVcQ-11^89=W_(RFkoTf2o&9B$JpwDB^-uQH-;jic+v%T|o zYM-CXBz`4XZ`tMh%_oZQRg7rZTQ3Z8$b;m>*>yW}q(AigOE+8djcXCgaq2 zt$S}=s(2wqo+7Eroi_;0ANW|qCP(wp7i5j<(iehIPUd?pWG)&+9QhZowZ)r zf=CqgB$`ETPd82WfQ*`cLMP8BTa(TSWVg{6WrpYw%)@XTx}in zHg}rp_|LBOSb;lgYzNxw94fFtjg#U{$}_br9$5CF4Y|I!w*}_%xRNIUWZiU8`j|jG z01t@_aLvPFahI63u*v{9#EX|bnGDI37%wt=xGWgW{3x>}!;FMSc^HPXWr`4LKoq7PLHL6S%Ui%f7>VcFJwZ1Qv*yR2(lY7_h{Tk+;+1KtjP{x_0 z_4m-^Udo_;C?)qwp--q)>&o{q+p+X|6TDoq_&tjKgQTj5jtgT`**mF8?lB+Pv~WTR z*&KeG=G`_l%EDC$*QP9&$}_i3B@e$Z`Pe_=9XWm1k8?hVg6*KE+!fN%oe?#2lWi~D zuQz-MKv(%K3jDu{;(9VI2(Gzw(9d}@E!3FH+?@Zw<~yM;8nE~oRA-H+FqLp$*uE9> z9Wculu++p~+mwHJx1~2H!MUp^y{2R^44ULDQNG?;qP0zWcf!vmzD0QD#_9BoC;GR| z_z#0j_DYLj1XdrcGv5_J_`}-i{sFR>YXjpuUfq1rhN1{hxP2Hjc|(Y8&({V_G_Hzi z?R$perztlU6brrIoRDaF%WVamn!9DoqXfpB72nGz_;dEgBxK|?s9JqT%D<`GBQoEN zf?W*Z-eB!@qAbKs9YEA+~7g3IGU1>naM*=+eOXXB>KWz0LA0I@OyhC_+9C+4= zcSuzi!w~{BG5z%S3@70o@4WnrD~)%UtQbH%WC;EHN$5H?wo-Wjc3ntN-?>TPGWPicf?| zluu3@ewMzI$MC$iGd7uKP-ycfK1g^G^dnrR!A>8p@rUc2-F*h2&msw#-61{+nZkCZ zdqo?u%;&L`Hpe6bl_ye1hV|N;h>7eiQE*Qg%~G62*vFEDViC5qRMgA2Rd?B^!YYq- zvWgW^On{;Z1qBJFzcvem921nV){$qSZaKaR2+QT9#e z)yW-PI;5u91-(TioY5`EH<78fe6hJOr|Bf1{{~_Vb1(BE#@tf>tjvq|uEE?8VQvGG zusV=@kGak3V{VAK(0`xr7sK97b!CNf}yu zhNLcIg1A@>mZx1kS0=bOM|oKtjETbUf;X;uLw4mZ4lZcUN4taKE(;hM&rhyZDk-Xmw}r zB_#_a0eBa^FuZ=4GVC8urZWCcdbkuD_QPAFXQYr1CaLqv^$7L5Pxa0EDp!1sLjT3k zsoFnI4dVbTN1HKC>e1GT~b~xJ;7!>zq5A~(8zva)o?SHHAF?A-n)L2!Y zLDiltQ|tcodFv-pY?hN-j^?-eA}aT~yZP0m&XC%zt|&RKNq4ES+MGmDE!@>!(g+VKP&UUNN$r$vq2l!3NvG!SF>6|s0$PLEZz6o4P95Jcnk%uCdGAsk!L)5 z@dYf!qC-25$PK*T@h!W<-MO|}(g14@CgUG-=qz(Fe`~eMyU83ZYipU)!ewen8My_` ziv~+P3R+Em_3%@Y@r=88;b8szb5Wt5m3hpvI?y`05wshVgpeKh%tJfOh_|6yhjL{s zw9Jkait8T4Gtkbj1MGL8hcuMxyGBWtTeWu+$@;!ycg}8{)~8_x^Y%nCmGLI&ozudG z;LlN}M--eGWWtNYqSc;YQoiqS7t1X4(sbeCd|2Lza8}j6|BBF}^Arv(ePj!)3bt1= zo*)Ui-a$=c9JN7po@VKevzIvU;oO&{?CQb-&WLgPEyE8Enjb42&p9VHNuFL5u~U+n z5e39ydPX-UVAk%TB4JE5f3-~MBmb+ zA`fwQ=d_rCs^X(%?VpG!JdVo86UV4?$znGDv>S7DbH~Ew6I$A^rZ47ypt(-|EU)0R zvrm-$z=g_XsUVjMUBa-^s?vVS0^V#BruL>x#Bx!fJ1!y9rN@Vp;*)(D+^ zYGSVbp5eJHSRLP8v-s@a-4)9gzr_L$dPjC+Qnn{jA#;Sy4A*w{*Kymy1!c=s_?^bQ z`EEW#2RDzx)zZIRf!Bm%LvNJbip{9iGKYcT-~k~K^S2EGLG=9jK1{9^XZ!vxxLvim zfXCp03N&RH+S9?rM229KGK#Xd+NV(tH}`z7Gn&2*5Pn@BC76or$cZ!@QR4?-%62xl zD|rpa6g5Lynf7YQ!_>~#B?NInS|3PrSMo!w1mrP(51=R_Co?!kvPM~HQY&V28l9oc zu{4{j@k)wW^cXrS4Nx6DnnK<@oOUhJjM=+5|9vyBm}64NXkZS%3=t(wXH$|Iyrx_} zW!kkc0oz@_kf3w1V^bJ?Owqk4CWfbG#S^@A=n&6INr$x>b~Q!p;;=jwsr{`^_uOYM zxXsHA3|-XH(b?KT@f62til!3~tz}L-9v(<0*_@ir z=GRCIde-r3GeqYmU77!I)BuNE)+mpNiG=s@IY)+9$&qPfdq?Y$c+4&29ov&Kit@?- z5;M}M^*rFl6WjP%el?S?3eQH*j9%o&w`jTSBr{F}dV$N2jcb?Oo4`snv7btarA|SgQ@VLVE4`PQrfBT@G`zKcmA5Xc)bstUS8m z6F6@+@+1cn@66q|r%tt)1`<34?=a63WOkx~{M(vZ6$xB%uJ?f0rnGZv4bQkrqPT@^wc-#p{hNvdD-|Lp zy)DZVD%td;m&WRYAQN#`1lW(m3Ki&l^nY8EG%zK2wGk$YeHJjaMl2Lc`-^C6HWDHy zJZ$eE0yi^B!p#fkh0a;TJ7Ux$B&B~kNo=R_$y%PyV;{kxvv%hoSleD>MWn78 z7lU*>QDRtq!_AApViktZvDw&UF%Zk^pm?W|L3J}PoDc4usMUP9E}ELJ+(;Adwt$UP zb6BB9@5N2HBC1rgFpt-o`mmJ`J(EnSUUsikqIyZ|3oy&bt6^j2tsPB6g&Wo2v_CZ_ ze&#u5irHE{iS}oBHjeqRSrj&;yxRXg$(ZHaFw5h!J#C#U>xVM3_k|6QJ!H)CW7#}6 zA*nIF_mKNjtko(TeDdSsFQJz;ut-(){QZet?4cBktWegf8Ku+BQj8KU48PTs62|1t z$Gp<4XPoh=;gXdK-TyzCq>F{(*z#IeObR4dZ^iUK$0ms`RF_S%5`BsB$Is5j|Gozj zCRzN~O!7l?+y5&Vq;_NakwmZm07TCqodL3;GDvME!mY!&V_%SRDoIG`#e_MW8VYBW zdRDk(RPnx&V8;Vnq&M0S;Dl7}+Ju~D!@rk<5K=waKSVN=>!Ke6p`3P^2k zL{j_X_{t+-h!eJT?17XiuA#sLnu)8G6IS8i(#q7vs`|=~Q)z>8lsm0(Ut6|#oVVnf zbrd_n0ZirHQR#Z4Maa2Tw;S}voUhngBz%z-FL4szxI;ZnVTZN|_%D1Cfx}C7#rBA% zFJ3a+?&5oEZo7`BxN8)4kNWl^A5XgfkG(Geld8Dd?jE>PbAh&L6qEe3m&A1rN3F9?l342p6F>~-0E+Jj5IuZAYewarZsA>2j7XFM;2-h5G3}1nX zu+ZTr;`u+L5;votR0`-_q}+SN4I4o6UjXz-!kT&u1Oy4OKn6$`dJYI(FG9D^q7ZrW zFj-`}Ok3~r&^Ffu=6h`qFqfKGlx{P&7BS!?zgPslh|Vo&fxU49GepL3B`h?84@94| zWpn5x7};tc?p;Vipf`s-pS|c0@##G3Nzx&}{ZzSk`;^IM=&;Fy6Aq)r^M)`F4zc_K zyd+`r<#rS}QD~Mogz1jJoVgP-5OMa1yGg?P!o`Lgqtd?aB5 zYP`HCV(A=1RL(|igP>W3`L~dNPxc{v{yvKBjME2iugxJec|!I2PeEDt8OL<+<)n`_ z+`ZNQLt2ltj#Id{kK2IHsN)fx5Z5qh@R#`L-Q!KkyVfTNw*)J}FYzTnaH6+L?M)gm zhzvWn>5U7O40=;=&=Y_nk$|6uBp{iJIONNHUc>@)zKWmBQzEMEMCx)BgRV}6(G@>g zB|Hh5Nx{H|zC;mqrk%Bj3mI`W0Y~86-C09RCrlGRQ0^$@KE@*zEy$fY9Fn9xrCjI9 za^hnl7v!@9=ZJSLkG=?3j~9#-Xy?h%S5a&&v9G(i3$8cuQKB?$LH*yL5Uwxr%_;bu zneW+)5;}ByPRf$-WU@spgC?a(BU?%LBfu-^qA^TFw8uYYVX_jRVgxR7)uv#t=!)Pt z!SkdJ2WL`h;SQ)^(<(qgSo`;gu#+JLR|57mC>;Cpt;X53gJ)u}Km-lqf^AXIee(3m znK+LxCbpfQrc-~wot&z=$+dO3`%$dA&wht?T;+6uB>os+b$Sa19Q%qi#XzT4rN}*j5I?9}x%@>B)%~@*hc2hpdR--;Wnb=s1Sg|K!WM7@i*e`7W|qZ^CAnW_k+&viFA>~tit2tau|!`T^5O;O8gZ9p zn3r`*cP4y{r9i^KbgbtIxk~H>lprueVKq+ml#4;QspQa@h}%>~%`;ya#JRWgIVv?p zQ=ddU_oyM^g728>X_auHcU`m+Z%*QBt>WE4)7|B|e-*yZP=Kl<=^cn0y`U-t=cufE zhpoAvsqVNNg^2lRK_E4ik%J-d>+1{@zJx-|-&X`9FlHiC=iO@2=trI>`XmeYQho7d zN0(k5v7+K?4Bt%e{HLtHSZFJidxsvkbREgp9d>PHXq@QarGDa2eC+%I0~bq^;GVE(FJlfYPhE==OLg)E5}_F?wFb!-SH7ot}d>%s#J%i&?0RoodSc{^{l37_fxCba`|S>Ij{J z5)KLvE=HLiUdRr%{M||Kub2e3kkAgP1!yGr^dMAc_aC5$V7fcB3NOY>zQ{B!j;$(2 z+kk&GvgEnbr~py5V~>1m&}LM-T#iuZTM(5sFKZoi4VKt->|>F<8L>R>p{?E z{In7{QhyKACG#tT#-+qWDH>!fYwltskkTjOiuZTg@#P9WRyD5E;vY;c#Q3Lc;2CB_ zZ`k7-q)F`Bn<)2dYKZ8}oeD0+CS@}g5)kl065ujetJm>W9kG{F+OvqWWjh&C-`qA{#xt|^K$NwPphe&R9RCovvT(A>RHopYrJyG z6#8tnvwl(yRNyu3(YtL7i|njvQ6I3p_WU|*a%|&G&H;dRRWobnNt+!C!x*V#Jh{^K zytEz1z7AKn5Am;TbN){Su7m~}zp_nDnKVY!k`j#r>Nw#Rn`(XOqG=^zeiM&pcbaHx zEu~i%O|ZuoP=wl7g8pw#Bw|f3OT;e2OTM_)EsmuwFOIoqKMP)9uk4XeZ^6GaEiaW` z?JbNX=(P#vwu{AGzaB#dcbRxdkBOC-$;D1L`@Fw>-oL-R@INTCFUq3N%kA^>=<}28 z^OK^_2iWHWqR$7~=L4h92ifO?qR$80=YylqhuG&sqR)rg=R>2vpI-@U9sJxDK%S4OoPyN$5@WJX7C?k_)A69}mRV=_{nw;Bw{cB`dhzqHv{ePkeB@MM&-mpvmOoqmyixR-+~XX_fHj zbGX<}Li6b~p34EcMW<*c2N)0FtNFQDnVG?X2uh+5oKkdTrU-6nQMQWToE?X1)YJ*j z^(f|E)*U$r!iR>#oZaTeXwpB+_qi ziP-h2yya02)$ip)nPbYpO|EmNU=-g(G$Ew4|@0UKZwZGvt3;s)uwze~m^CB1z=UP&k%r0HhhuzPaN$QL>h9 zMNJMRQ|c4>PjZR;TV!^?bcQoKfd0ikAbA}K47;Jql$+y$vVyZl8y@QoM?C|$*zm%# z0@nT`vowfNV6nm5P|OsE1(unKK0;{-mC|!cB_fv8zB zLTEojF&ivxh_igF?QjNZ10|dWJ(4|?zheaoI2Cxqs?%^ZWUE{dtTz4q8Om2Knv{!j zL8C9BItg{nFysndc7=jtFF}DYbDhK>|b}(uVLg8TFLOB?}q4+G%VPXuF*{7jv z$Ux)MHL4xzT+SopM6RP$UD;*oB){7{)pY{Ik#jO-QkKVZ^i^WNBk_spdwzc3V$tE% z58RNLhHtURwWqiw>$9^9gAVgpe?mGjI7?A^HVV7h5_I)yeph;!iE`y0fw9@FU?wG4 z+JVVqjp>}SnjL=?bY6f<5)~3;c`7Qi<8cEFQFZaQ=*~e?nxH(WTbeyI3}Dh(ldGmw z1z@B#7|@?J7}+KRB?>8huL#9*G;XF_e6PavJ!Tq=GYqOf1?N;yFCNX_hp+m9)(KMS zKwli{Xb4ep`0X=VrBDC&X0(D>y*a>}3uLEh1vnDn0$DUL!h=tE>Sov5~nRQ-n;e zP~-xS($wWVjd>kCv`yc`>y0q9aJU8e=R>GcP-!Z z1bPT*ah$p_&E$EwDvi?yP z7zL;2Xl%af=J1jPQ~DvG<#B=E1icYjGDx}jT*wKHr6YoHKT2VQ4%hLG4gv`5{#_IU zZ~t6)mtop;UK@&-Yf#wih#@{pbqwRtK>d+yU`3dlhy-~F2(YBBOSe!Rr@k|}x&}0H z05`!Hj*P;p7X<8lbY<{UK)o0tDn1cUknTij2=R$?vP3ypNSfRgG<$76+H-eT;xS$Z znKfN(z})6x4HtcaeY4+ALmTd!7Z^X!&OptjDD3(w)aG1eGUiOuvZ7|c?;LOcbAij^ zk1(x6X&8T_{4Ek8dLPB$FK>&KxHa1w0JAAJ*?yQ$TynYAz)vBcllF%TDA#QYa&|Br zUz$$x1i1vO%sLRPrfkiS8c|VF!T3BX%@84qoIB7oYM2MT)W=<8N_Bty; z`7N5_{QP-|(Uka5{&Lsqzf$_I8u=^!O9pF8#>>P-@iAukg1m%KgbpDQ9O8$PM843rT>ESI2 zbEMX=4PP+s-EuBVTe*&?q)zdpTLVK93>rKL!s7uLc?J&+Mo$EtoLf^_mtBWXjt0>Y zg!vrsrDyCqCL zdNi;q0=~+z(i&NH*!AZ@bNQ=I;%_1~U3ATE+g##D5op#-ZQcT~4Q(Efg?vNkaU5^r;8&t;@WC~5jXrf9FSh9YG&mf&9fbh9qsx{kgmN~zHAu?jLYlfkrs*_P zC3G7tgc%)~C#p&~s{lpn2*x;u*AD_Iqr0Kgt6|TtgWHr&Lxwj8L?B@Ae{KYVH&ynR z=pCUcr1v$8d|9H?R7F9E|BuO2MRCckEywm-0Btawx3x{(*)%>;4hk+sZ4U3mOZ_1> zFCZ@6TI7AAT8QKaAckd}+@4~R6xo@0TBRO^?FZILECcS-Wjkjt5h{WD~^QYd;-^ith`*d&wP02~MSjupNv3419S?i@=w-JNp{yE&~w} zw!JR%G2BX=m7+wH_!p>jfJ$vsiF*|mN`?fXKc*y(7LTdad9Ye;*YG9oW`w#_mKWN0 zk?>P;3P(je{w7yh248bu;wnUS$T=_G8M_bXMJ~<&4soLK&E2TuTp&Iu=ml#y+yHTe zaR3{6RJo|J4}S7~fpZpqm_b1>laVQJiGt%WEQ5x8dAm9L8&o?R7~tp=OMDExRzUS| z_7e>3K9!li8K&3V6c8}gCNfLY@c8(DJdGJoDI63I{aB32kaKt;g)t*@iuR`33pF|N zsVD|fc}Iw;w}Ic5*&(P(12G%DFKGCV5IJ*Q5JGk@;Xx%5UKXb{vx#%hY_@~#It2lD zZtV1}pyRyly59O;gqp9Su+KA=`jhmt0)pV*n$|U5ipmhCC8}xO*)Z*2%y$M9$>fS zXy^$1F8VnfiT;fFp^N(xJm8DDD1W&Urm2%zCBezTsSF-7w(GR}2T_EWM-X zXv=0EMll~8qdy3ur^hn==1$RBM>AEK0dTRdVF>&xeEJ;9Cn$vCk}G`5{+*$0bPDxU zt2)kK=_n5$c?d$r=&z@%cClH>=o_yu#vDIp?(Dx-9Xh8<){pMY1|8o)Ze{={Bf` zAkCeGrbs!&Nh{2bL9I{@X$h?gT4I^<+R1a7nxGP{6PeLCf}D(uDDaiQ$K)@rz=Y?T zppm!r{HzY)7Rfj}j;O7NbKy7zlV43$CGbZL;YfA7iQzR9n&X)2nasPwyg1yE;f`7p zRaQM~a?RXN>6nN!1ddDwFbVx~f(bmy>nQxr^zxo(-+})-Mxk(#z@KCBe{U~7woA~T z+`i_t!cx(W%iJ2}U_w5Y9(tigk}F5n{VGG@s)eTRvx-}Yt&1NbQiL{b#CXIi2pbr zM4g*^y5q@HRgY{0_Vd zZV4KJ25BRyVe2?-@-yr^E)THL7^I%mvSFm6hxK|RC_skX48jI|2`CUvlHLc;&R)JzwX8~X4PQ@w$xW}q08o@u0_OHwnwksoSkKioW`B(I(` zQX$99nOJcWL;LmtloUW5Wv6HSk&e4`B zq%owS;fMA=HW<|pKdpQ)81WG^dnJ4Va&pqkDEA6Lj-$6X>_m-JTkr(Ozy1>r*f|Pb z6Tu^)8`^3(zHd+r-H5G5h+tbl1b-)5ZqIV1t3%ao0ektIl(KkW87kwLW5A$huc>u0X z@sYg>)fb=;)IQJpSB-G);K>r9r!gKQ$U%w_{;Sv5Eyfym*rX79#mmWA|Y=Tw1!3RwkI~TOqwfX&E zR3}U)pn4C&)kS*;V|mKq4)^zx8{*aMJXD*3!XAEsVumB;K78g&f@dc*!^wc<_HPb< zFlq4rx_S$<;!!Szu%9?WA4hXE_>Bu9*K+$VHfdZ*pwOaoWjexCdJ-9z)Cp01=T znSv{V--(X;ci+R%C6p`yc_lzF)FS6~x!l=b4n#VlHi3N+#mvY6P3ZR(nh^$LI02tf z1h9h^n~LQwW2TQMA|N~?tuKG|P#LDdJ<#00uiQn($Lwz?J|+=m4)aQNp9ZnOn6Gu> zp3cvJUS|~k=$}0g)v3L*-}NZ8NCU^~4R87=KB@jIY=|s1FpaIjEA!HtpXXmu^IATN zAs3nB7Al8LS_{tXFPP8IYp>fbSq@b;7hE&uEOOdoy$*r?6`mtWGdwY@H;cXGYgon9Ire1)sG@TK6%=s zzwjS$H9Z@X)qSk&-k_6xT%@`mM$(i^aSDGEs=nyp2>dQOH;Ej{*b;E#y9^KbVjjwJ zSHna2G6T0xD_?ykuZGrH>zcWWIJWtrM zHLhP><9WP*HPOqtfHl3oqH;1bELTjf;SI|Q9PI~bJaNxrOBZ|1X}48*gKAd89n?>+ zsz6-JiZb01QV=pE=6My9YUi_`Y<@qDe<5@vqng@qr;T*jJ-@?-YX_YT%I$2>*ouA{ zh5USY)vUQ3PFvf0!PgRPJbnyBv7hEeZiw;8EYOqOOo!fIkwzt*I?kk)$?_r@t7+XB zZ17ji^|P3JlFPKM#j)Et_xmoqJa_K%0Oy1vYI?u2VHHe#UtJ|3%6-5KzUCbF&&7bL zIjid2ipfT$*ZM7Ga$3r-63oqs1)7~!RgdP*u9_vI zONUyEya^g91e?AkSb?C=Oz&Dzf8K1l0vLv^a2075k>%?ZQbfWbma|;164kgGfB?hP zu;sRaevB&typ>atp4@M4J*EUl&ULgOVLMlmPV@pHAV0MjL;A*x;QNkAC$rb%%93Gt zgrEXPgcyEG0gQn2=2cIrs+d+;Uv+Nfc@?m$2xHb%Pn%xP$?FzE((WpAHU|{w1abrc z*Xt{$)K$;Zgw-b0YTnxb{e22HHv2rtshSEx*E-Tp@FHlU5Il2d;ZD?ajnsOXyf8d@ zZ#k@C1t6JHJtq(L;I=A=ogBysp#U#b*$~7bP7ClbI9#H#Oq5w=bd_w{X~H|Wxc5|% zc8*cqYv76liyf(^ znU@irrIsys3{i(|Ij>gGcw;cntF3`S({H&D%+V@lZqx1|nA@*4r_vVrb4=gc6?~l7 zfS=3dClg^LZZ$v0sa<^?u=K;2MN&`SrYiO*XK}#7bM|Bwr`F7!GreMJbxqYAOcm~_ z@%o=;yYMVFTrI#zc>#3m@AP0rj2;lea_&pA&WHkyP~3_Dt(pRylHfRB?L#dUtPwy~ zXaQr+c;w5iud1l2ouS2_bSjZd>gr>u&sSVND3ay=UBSCk40n@%%m3A zxWoZ36;5xWsgb{O`py-a@#QLT!QW?d=M3=%*H?f0euTNa7jsMIc1l$2KF;l73(w4* z+d{aUGrd+TS9w}YHJ1!Gr>QGc@_e}-HxYjhL6P{@i5sA8^j131j|pYw z_!&2`B7F^6mNWr*@DUr^7s&krzk{c8##s)SX}%%`+B7$4#6@u*jaT3$(a4vbTKH%T zZ)SOvd<+V)JQ39lCTkkQWcYg@nGd27+YgVrGoDwy2gnp83b8j8gSI}ClBeMITx`+< zJ;Atf282-fIR5lw#!bYwYyw=~-$3>-K@|_KlK$xwW2sWjm$XA}Cq=Iix-0O^lSr5b zTnSCy4)u=+bp@4F6$b`W#n@~qHyzbu1CE@cX)y@8!4_`3%sXb zRMXIR=0@*$7%xMI4FwqivHdg)H1xNA&B?_?7Kgcl^9Zg0Q|OrQhADKUuC=Tgu*4oE zp?!qkyn@z2c7shY&@YXPn2p=I7_4l%A?Ex z?=6G4r~uJn%S>WplC|WQK8oy)$oDu)wmTADBu#?h1IplQC6_K}_dWoH^VAfVIfO*R z*(tBWOOhyGb}#k$o!M(z((Zi_3PI&f5JQ}Dc-oN2)aERq%Qx|95$MD=Jr@7Y%=556 z@^&LHgWTpKD}!8P1-U!k19OFB=E@{97y6)+2Ofn2xgCXCh;yi;eq#R8iNEWN02nG` zIM53co^(Joqpit!fe(&d#b-h{OtzH9Qn#WVllwz(G+{C&sA8%uIO%#! zIQ?Mbr>n#o{0(Pk=Rtv%=L<)n5aAW3^`e8C2D7~!FFD(M*?WM@b{)>6PXyxzhQfiU z)CYy|twu4kja z>Ls=FKVEm^2%VTyw;=m9D3o)Ep|GA3nfv}S%bI6xHt>4RZ+j7MNrqk;trAtLk7jH= z`H2$|#ycrNAV{3f&p}}~(JC_)^*}akAl{aL>YC16xvz!@-aD03kBN3Y%rI)7s8@C1 zQ(+P3w487fl>QjV2ToanxzKvLeHntuF0~lqx!3jw?%tJ;HC@BBx<+=@^uAJT;$(T+$9L7S$VUBhB5B} zDPyZ|(+SqeWE+XbBnTiN7k-F)oQH}TXDy(OwZDceG

    q+^ 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 diff --git a/src/WINNT/doc/help/en_US/afs-cc.CNT b/src/WINNT/doc/help/en_US/afs-cc.CNT deleted file mode 100755 index 7d6b1b69c..000000000 --- a/src/WINNT/doc/help/en_US/afs-cc.CNT +++ /dev/null @@ -1,10 +0,0 @@ -:Base AFS-CC.HLP -:Title IBM AFS Control Center -1 AFS Control Center Configuration -2 Default Cell -3 Setting a Default AFS Cell to Administer=Cell_Membership>main -2 Cell Database -3 Overview=Cell_Database_Overview>main -3 Adding Cells to Your Cell Database=Adding_Cells_to_Your_Cell_Database>main -3 Changing Cell Information=Changing_Cell_Information>main -3 Removing Cells From Your Cell Database=Removing_Cells_From_Your_Cell_Database>main diff --git a/src/WINNT/doc/help/en_US/afs-light.CNT b/src/WINNT/doc/help/en_US/afs-light.CNT deleted file mode 100755 index 1c2d27eeb..000000000 --- a/src/WINNT/doc/help/en_US/afs-light.CNT +++ /dev/null @@ -1,63 +0,0 @@ -:Base AFS-LIGHT.HLP -:Title IBM AFS Light -1 Overview -2 About AFS=Working_in_AFS>main -2 AFS Storage Concepts=AFSFileStorageConcepts>main -2 AFS Security Concepts=AFS_security_concepts>main -2 About AFS Light=AFS_Client>main -2 About Help=Audience_and_Purpose>main -1 Getting Started -2 Overview=Running_AFS>main -2 Identifying an AFS Light Gateway=Adding_your_Client_to_a_Cell>main -2 Mounting the AFS Filespace=Mapping_Drives_Overview>main -2 Authenticating to AFS=Authentication>main -2 Verifying Authentication=VerifyingAuthentication@AFS-LIGHT.HLP>main -2 Unauthenticating from AFS=UnauthenticatingfromAFS@AFS-LIGHT.HLP>main -1 Managing AFS -2 Overview=AccessingAFS@AFS-LIGHT.HLP>main -2 AFS Menu=FileManagerAFSMenu>main -2 AFS Light Configuration Utility=AFS_Client_Configuration_Utility>main -2 AFS Light Program Group=The_AFS_Client_Program_Group>main -2 AFS Light Property Box=AFS_Credentials_utility.>main -2 Command Prompt Commands=CommandPromptCommands@AFS-LIGHT.HLP>main -1 Using AFS -2 Access Control Lists -3 Overview -4 Access Control Lists=ProtectingFilesandDirectories>main -4 Directory-Level Access Control=Directory.LevelAccessControl>main -4 AFS Access Permissions=AFSAccessPermissions>main -4 Additional Access Permissions=OtherVariablePermissions>main -4 Normal and Negative Entries=NormalandNegativeEntries>main -3 Using Access Control Lists -4 Setting ACLs=AccessControlLists>main -4 Adding ACL Entries=AddACLEntry>main -4 Removing ACL Entries=Removing_ACL_Entries>main -4 Copying ACLs=CopyACL>main -2 Volumes and Partitions -3 Overview=Volumes_and_Partitions>main -3 Displaying Volume and Partition Information=Displaying_Volume_and_Partition_information>main -3 Refresh name/ID map=Refreshname.IDmap>main -2 Mount Points -3 Overview=Mount_Point_first_page>main -3 Displaying Mount Points=Displaying_Mount_Points>main -3 Removing Mount Points=Removing_Mount_Points>main -3 Making Mount Points=Making_Mount_Points>main -2 Cached Files -3 Overview=Cached_Files>main -3 Flushing Files and Directories=Flushing_files_or_directories>main -3 Flushing Volumes=Flushing_Volumes>main -2 Server Information -3 Overview=ListingFileServerInformation>main -3 Showing File Servers=Showing_File_Servers>main -3 Showing the Status of File Servers=Showing_the_Status_of_File_Servers>main -2 Cells -3 Listing Information -4 Showing Cells=Showing_Cell>main -3 Cell Database -4 Overview=Cells>main -4 Adding Cells=Adding_Cells_to_your_Cell_Database>main -4 Changing Cell Information=Changing_Cell_Information>main -4 Removing Cells=Deleting_Cell_Information>main -1 Reference -2 Glossary=Glossary>main -2 How To...=How_To...>main diff --git a/src/WINNT/doc/help/en_US/afs-nt.CNT b/src/WINNT/doc/help/en_US/afs-nt.CNT deleted file mode 100755 index 27fd9ffc0..000000000 --- a/src/WINNT/doc/help/en_US/afs-nt.CNT +++ /dev/null @@ -1,77 +0,0 @@ -:Base AFS-NT.HLP -:Title IBM AFS Client -1 Overview -2 About AFS=Working_in_AFS>main -2 AFS Storage Concepts=AFSFileStorageConcepts>main -2 AFS Security Concepts=AFS_security_concepts>main -2 About the AFS Client=AFS_Client>main -2 About Help=Audience_and_Purpose>main -1 Getting Started -2 Overview=Running_AFS>main -2 Making your AFS Client a Member of a Cell=Adding_your_Client_to_a_Cell>main -2 AFS Client Wizard=IDH_AFSCREDS_WIZ_START>main -2 Starting and Stopping the AFS Client=StartingandStoppingtheAFSClient@afs-nt.hlp>main -2 Changing the Startup Type of Your AFS Client=ChangingtheStartupTypeofYourAFSClient@afs-nt.hlp>main -2 Mounting the AFS Filespace=Mapping_Drives_Overview>main -2 Authenticating to AFS=Authentication>main -2 Verifying Authentication=VerifyingAuthentication@afs-nt.hlp>main -2 Unauthenticating from AFS=UnauthenticatingfromAFS@afs-nt.hlp>main -1 Managing AFS -2 Overview=AccessingAFS@afs-nt.hlp>main -2 AFS Menu=FileManagerAFSMenu>main -2 AFS Client Configuration Utility=AFS_Client_Configuration_Utility>main -2 AFS Client Program Group=The_AFS_Client_Program_Group>main -2 AFS Client Property Box=AFS_Credentials_utility.>main -2 Command Prompt Commands=CommandPromptCommands@afs-nt.hlp>main -1 Using AFS -2 Access Control Lists -3 Overview -4 Access Control Lists=ProtectingFilesandDirectories>main -4 Directory-Level Access Control=Directory.LevelAccessControl>main -4 AFS Access Permissions=AFSAccessPermissions>main -4 Additional Access Permissions=OtherVariablePermissions>main -4 Normal and Negative Entries=NormalandNegativeEntries>main -3 Using Access Control Lists -4 Setting ACLs=AccessControlLists>main -4 Adding ACL Entries=AddACLEntry>main -4 Removing ACL Entries=Removing_ACL_Entries>main -4 Copying ACLs=CopyACL>main -2 Volumes and Partitions -3 Overview=Volumes_and_Partitions>main -3 Displaying Volume and Partition Information=Displaying_Volume_and_Partition_information>main -3 Refreshing Name/Volume ID Mappings=Refreshname.IDmap>main -2 Mount Points -3 Overview=Mount_Point_first_page>main -3 Displaying Mount Point Information=Displaying_Mount_Points>main -3 Removing Mount Points=Removing_Mount_Points>main -3 Creating Mount Points=Making_Mount_Points>main -2 Cached Files -3 Overview=Cached_Files>main -3 Flushing Files and Directories=Flushing_files_or_directories>main -3 Flushing Volumes=Flushing_Volumes>main -2 Servers -3 Listing Information -4 Overview=ListingFileServerInformation>main -4 Showing File Servers=Showing_File_Servers>main -4 Showing the Status of File Servers=Showing_the_Status_of_File_Servers>main -3 Server Preferences -4 Overview=Server_Prefs_Overview>main -4 Viewing Server Preferences=Viewing_Server_Preferences>main -4 Adding Server Preferences=Adding_Server_Preferences>main -4 Modifying Server Preferences=Modifying_Server_Preferences>main -2 Cells -3 Listing Information -4 Showing Cells=Showing_Cell>main -3 Cell Database -4 Overview=Cells>main -4 Adding Cells=Adding_Cells_to_your_Cell_Database>main -4 Changing Cell Information=Changing_Cell_Information>main -4 Removing Cells=Deleting_Cell_Information>main -2 Submounts -3 Overview=Submounts_Overview>main -3 Creating Submounts=Creating_Submounts>main -3 Modifying Submounts=Change_or_Edit_Submounts>main -3 Removing Submounts=Delete_Submounts>main -1 Reference -2 Glossary=Glossary>main -2 How To...=How_To...>main diff --git a/src/WINNT/doc/help/en_US/taafscfg.cnt b/src/WINNT/doc/help/en_US/taafscfg.cnt deleted file mode 100755 index 587cea00d..000000000 --- a/src/WINNT/doc/help/en_US/taafscfg.cnt +++ /dev/null @@ -1,32 +0,0 @@ -:Base TAAFSCFG.HLP -:Title IBM AFS Server Configuration -1 AFS Server Configuration Help -2 About AFS and the AFS Server and AFS Control Center=About_AFS_and_the_AFS_Server_and_AFS_Control_Center -2 Configuring the AFS Server -3 Overview=Configuring_the_AFS_Server -3 The AFS Server Configuration Wizard=The_AFS_Server_Configuration_Wizard -3 To Configure the AFS Server into an Existing Cell=Configuring_the_AFS_Server_into_an_Existing_Cell -3 To Configure the AFS Server as the First AFS Server in a Cell=Configuring_the_AFS_Server_as_the_First_AFS_Server_in_a_Cell -3 Accessing AFS Data=Accessing_AFS_Data -2 The AFS Server Configuration Dialog Box -3 Overview=The_AFS_Server_Configuration_Dialog_Box -3 To Access the AFS Server Configuration Dialog Box=To_Access_the_AFS_Server_Configuration_Dialog_Box -3 Partitions Tab -4 Overview=IDH_PARTITIONS_PAGE -4 Setting Up AFS Partitions -5 Overview=Setting_Up_AFS_Partitions -5 To Create an AFS Partition=To_Create_an_AFS_Partion -4 Administering AFS Partitions -5 Overview=Administering_AFS_Partitions -5 Salvaging an AFS Partition -6 Overview=Salvaging_an_AFS_Partition -6 To Salvage an AFS Partition=To_Salvage_an_AFS_Partition -5 Removing AFS Partitions -6 Overview=Removing_AFS_Partitions -6 To Remove an AFS Partition=To_Remove_an_AFS_Partition -3 Services Tab -4 Overview=IDH_SERVICES_PAGE -4 AFS Server Roles=AFS_Server_Roles -4 AFS Services=AFS_Services -4 To Configure and Start an AFS Service=To_Configure_and_Start_an_AFS_Service -4 To Stop and Unconfigure an AFS Service=To_Stop_and_Unconfigure_an_AFS_Service diff --git a/src/WINNT/doc/help/en_US/taafscfg.hlp b/src/WINNT/doc/help/en_US/taafscfg.hlp deleted file mode 100755 index b8d8b5453abb01cf9c566fc8fab255c5b028182d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131873 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